From 46d59c8fda1f15eb29448323f47b7364767953b2 Mon Sep 17 00:00:00 2001 From: Iliyan Velichkov Date: Tue, 23 Jun 2026 11:36:35 +0300 Subject: [PATCH 01/14] =?UTF-8?q?feat(ide):=20IntelliJ-style=20Java=20auth?= =?UTF-8?q?oring=20=E2=80=94=20New=20=E2=86=92=20Java=20scaffolding=20+=20?= =?UTF-8?q?full=20Monaco=20Java=20IntelliSense?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Make writing client Java in the browser IDE feel like IntelliJ. New → Java submenu (Projects view): - Package (creates the nested folder chain from a dotted name) - Class, Interface, Enum, Annotation, Record, Exception - Controller, Job, Listener, WebSocket, Repository — strong-interface skeletons A fully-qualified name (com.test.MyClass) creates the package folders and the matching package declaration; a simple name lands in the selected folder. Logic lives in a new pure helper js/java-new.js; projects.js orchestrates dialog → nested folder → file → open via the existing WorkspaceService. Java IntelliSense (editor-monaco LSP client): - Auto-import on completion (completionItem/resolve → additionalTextEdits) - Dirigible SDK suggestions ranked first (sortText bucketing) - Code actions: quick-fixes, organize imports, and generate constructor/getters/setters/toString/equals&hashCode with a member-picker dialog - Rename symbol, find references, document formatting - Server→client workspace/applyEdit + configuration handling - Format-on-save for Java reuses the existing TypeScript auto-format mechanism via the new formatting provider (same global toggle) Tests: - CreateJavaArtifactsIT drives New → Java end to end and asserts folders, files, package declarations and skeleton signals over the workspace REST API - Browser.hoverOnElementByAttributePatternAndText + Workbench.createJavaArtifact Co-Authored-By: Claude Opus 4.8 (1M context) --- .../dirigible/editor-monaco/editor.html | 1 + .../dirigible/editor-monaco/js/editor.js | 42 ++ .../editor-monaco/js/java-lsp-client.js | 359 +++++++++++++++- .../editor-monaco/js/lsp/java-lsp-client.ts | 404 +++++++++++++++++- .../dirigible/view-projects/js/java-new.js | 237 ++++++++++ .../dirigible/view-projects/js/projects.js | 128 +++++- .../dirigible/view-projects/projects.html | 1 + .../tests/framework/browser/Browser.java | 2 + .../framework/browser/impl/BrowserImpl.java | 9 + .../tests/framework/ide/Workbench.java | 18 + .../tests/ui/tests/CreateJavaArtifactsIT.java | 111 +++++ 11 files changed, 1294 insertions(+), 18 deletions(-) create mode 100644 components/ui/view-projects/src/main/resources/META-INF/dirigible/view-projects/js/java-new.js create mode 100644 tests/tests-integrations/src/main/java/org/eclipse/dirigible/integration/tests/ui/tests/CreateJavaArtifactsIT.java diff --git a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/editor.html b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/editor.html index 2a73d7fba1b..5a9f538788a 100644 --- a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/editor.html +++ b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/editor.html @@ -19,6 +19,7 @@ + diff --git a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/editor.js b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/editor.js index fe095209904..c55da0ccf00 100644 --- a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/editor.js +++ b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/editor.js @@ -17,6 +17,26 @@ const themingHub = new ThemingHub(); const statusBarHub = new StatusBarHub(); const layoutHub = new LayoutHub(); const workspaceHub = new WorkspaceHub(); +const dialogHub = new DialogHub(); + +// Member picker used by the Java LSP client for "Generate getters/setters/constructor/toString". +// Returns the labels the user kept, or null when the dialog is cancelled. +window.javaLspMemberPicker = (title, labels) => { + if (!Array.isArray(labels) || labels.length === 0) return Promise.resolve([]); + const form = {}; + labels.forEach((label, i) => { + form[`m${i}`] = { label: label, controlType: 'checkbox', value: true }; + }); + return dialogHub.showFormDialog({ + title: title, + form: form, + submitLabel: 'Generate', + cancelLabel: 'Cancel', + }).then((result) => { + if (!result) return null; + return labels.filter((_label, i) => result[`m${i}`]); + }); +}; const brandingInfo = getBrandingInfo(); @@ -832,6 +852,28 @@ class DirigibleEditor { EditorActionsProvider._toggleAutoFormattingActionRegistration = editor.addAction(EditorActionsProvider.createToggleAutoFormattingAction()); } + if (this.fileType === 'java' && !this.readOnly) { + // Surface the JDT.LS source actions explicitly; rename (F2), references (Shift+F12), + // format, and quick-fix (Ctrl+.) are already in Monaco's context menu via the registered + // language providers. + editor.addAction({ + id: 'java.organizeImports', + label: 'Java: Organize Imports', + keybindings: [monaco.KeyMod.Shift | monaco.KeyMod.Alt | monaco.KeyCode.KeyO], + contextMenuGroupId: '1_modification', + contextMenuOrder: 2.5, + run: (ed) => ed.trigger('java-lsp', 'editor.action.codeAction', { kind: 'source.organizeImports', apply: 'first' }), + }); + editor.addAction({ + id: 'java.sourceAction', + label: 'Java: Generate / Source Action...', + keybindings: [monaco.KeyMod.CtrlCmd | monaco.KeyMod.Alt | monaco.KeyCode.KeyS], + contextMenuGroupId: '1_modification', + contextMenuOrder: 2.6, + run: (ed) => ed.trigger('java-lsp', 'editor.action.codeAction', { kind: 'source', apply: 'never' }), + }); + } + DirigibleEditor.computeDiff.onmessage = function (event) { lineDecorations = editor.deltaDecorations(lineDecorations, event.data); }; diff --git a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/java-lsp-client.js b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/java-lsp-client.js index 80f3a7a6c93..38d95dee53a 100644 --- a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/java-lsp-client.js +++ b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/java-lsp-client.js @@ -4506,6 +4506,21 @@ ${JSON.stringify(message, null, 4)}`); endColumn: d.range.end.character + 1 }))); }); + _conn.onRequest("workspace/applyEdit", (params) => { + applyWorkspaceEdit(params.edit); + return { applied: true }; + }); + _conn.onRequest("workspace/configuration", (params) => (params.items ?? []).map(() => jdtlsSettings().java)); + _conn.onRequest("client/registerCapability", () => null); + _conn.onRequest("client/unregisterCapability", () => null); + _conn.onRequest("window/showMessageRequest", () => null); + _conn.onRequest("window/workDoneProgress/create", () => null); + _conn.onNotification("window/logMessage", (p) => console.debug("[java-lsp]", p?.message)); + _conn.onNotification("window/showMessage", (p) => console.info("[java-lsp]", p?.message)); + _conn.onNotification("language/status", () => { + }); + _conn.onNotification("language/progressReport", () => { + }); _conn.listen(); const rootUri = _workspaceRoot; await _conn.sendRequest("initialize", { @@ -4517,7 +4532,13 @@ ${JSON.stringify(message, null, 4)}`); progressReportProvider: false, classFileContentsSupport: true, resolveAdditionalTextEditsSupport: true, - inferSelectionSupport: [] + advancedGenerateAccessorsSupport: true, + generateToStringPromptSupport: true, + generateConstructorsPromptSupport: true, + generateDelegateMethodsPromptSupport: true, + hashCodeEqualsPromptSupport: true, + advancedOrganizeImportsSupport: true, + inferSelectionSupport: ["extractMethod", "extractVariable", "extractField"] } }, workspaceFolders: [{ uri: rootUri, name: workspace }], @@ -4526,15 +4547,51 @@ ${JSON.stringify(message, null, 4)}`); synchronization: { dynamicRegistration: true, willSave: false, didSave: true, willSaveWaitUntil: false }, completion: { dynamicRegistration: true, - completionItem: { snippetSupport: true, documentationFormat: ["markdown", "plaintext"], deprecatedSupport: true, commitCharactersSupport: true }, + completionItem: { + snippetSupport: true, + documentationFormat: ["markdown", "plaintext"], + deprecatedSupport: true, + commitCharactersSupport: true, + resolveSupport: { properties: ["documentation", "detail", "additionalTextEdits"] } + }, contextSupport: true }, hover: { dynamicRegistration: true, contentFormat: ["markdown", "plaintext"] }, signatureHelp: { dynamicRegistration: true, signatureInformation: { documentationFormat: ["markdown", "plaintext"], parameterInformation: { labelOffsetSupport: true } } }, definition: { dynamicRegistration: true }, + references: { dynamicRegistration: true }, + documentSymbol: { dynamicRegistration: true }, + formatting: { dynamicRegistration: true }, + rangeFormatting: { dynamicRegistration: true }, + rename: { dynamicRegistration: true, prepareSupport: true }, + codeAction: { + dynamicRegistration: true, + codeActionLiteralSupport: { + codeActionKind: { + valueSet: [ + "quickfix", + "refactor", + "refactor.extract", + "refactor.inline", + "refactor.rewrite", + "source", + "source.organizeImports" + ] + } + }, + isPreferredSupport: true, + dataSupport: true, + resolveSupport: { properties: ["edit"] } + }, publishDiagnostics: { relatedInformation: true } }, - workspace: { configuration: true, didChangeConfiguration: { dynamicRegistration: true } } + workspace: { + applyEdit: true, + configuration: true, + executeCommand: { dynamicRegistration: true }, + didChangeConfiguration: { dynamicRegistration: true }, + workspaceEdit: { documentChanges: true, resourceOperations: ["create", "rename", "delete"] } + } } }); _conn.sendNotification("initialized", {}); @@ -4574,6 +4631,9 @@ ${JSON.stringify(message, null, 4)}`); return _workspaceRoot !== "" && uri.startsWith(_workspaceRoot); } function registerProviders() { + editor.registerCommand(APPLY_ACTION_COMMAND, (_accessor, action) => { + applyCodeAction(action); + }); languages.registerCompletionItemProvider("java", { triggerCharacters: [".", "@", "<"], provideCompletionItems: async (model, position) => { @@ -4588,6 +4648,25 @@ ${JSON.stringify(message, null, 4)}`); return { suggestions: items.map((item) => lspCompletionToMonaco(item, model, position)) }; + }, + // Resolve documentation and, crucially, the auto-import additionalTextEdits which JDT.LS only + // attaches on resolve — selecting a type then inserts its import statement. + resolveCompletionItem: async (item) => { + const lsp = item._lsp; + if (!_conn || !lsp) return item; + try { + const resolved = await _conn.sendRequest("completionItem/resolve", lsp); + if (resolved.documentation) { + item.documentation = { value: markupToString(resolved.documentation), isTrusted: false }; + } + if (resolved.detail) item.detail = resolved.detail; + if (resolved.additionalTextEdits?.length) { + item.additionalTextEdits = resolved.additionalTextEdits.map(textEditToMonaco); + } + } catch (e) { + console.debug("[java-lsp] completion resolve failed:", e?.message); + } + return item; } }); languages.registerHoverProvider("java", { @@ -4653,6 +4732,87 @@ ${JSON.stringify(message, null, 4)}`); })); } }); + languages.registerReferenceProvider("java", { + provideReferences: async (model, position, context) => { + if (!_conn || !isWorkspaceFile(model.uri.toString())) return null; + const result = await _conn.sendRequest("textDocument/references", { + textDocument: { uri: model.uri.toString() }, + position: { line: position.lineNumber - 1, character: position.column - 1 }, + context: { includeDeclaration: context.includeDeclaration } + }); + if (!result) return null; + return result.map((loc) => ({ uri: Uri.parse(loc.uri), range: lspRangeToMonaco(loc.range) })); + } + }); + languages.registerRenameProvider("java", { + provideRenameEdits: async (model, position, newName) => { + if (!_conn || !isWorkspaceFile(model.uri.toString())) return { edits: [] }; + const edit = await _conn.sendRequest("textDocument/rename", { + textDocument: { uri: model.uri.toString() }, + position: { line: position.lineNumber - 1, character: position.column - 1 }, + newName + }); + return workspaceEditToMonaco(edit); + }, + resolveRenameLocation: async (model, position) => { + if (!_conn || !isWorkspaceFile(model.uri.toString())) return null; + try { + const result = await _conn.sendRequest("textDocument/prepareRename", { + textDocument: { uri: model.uri.toString() }, + position: { line: position.lineNumber - 1, character: position.column - 1 } + }); + if (!result) return null; + const range = "range" in result ? result.range : result; + const placeholder = "placeholder" in result && result.placeholder ? result.placeholder : model.getWordAtPosition(position)?.word ?? ""; + return { range: lspRangeToMonaco(range), text: placeholder }; + } catch { + const word = model.getWordAtPosition(position); + return word ? { + range: { startLineNumber: position.lineNumber, startColumn: word.startColumn, endLineNumber: position.lineNumber, endColumn: word.endColumn }, + text: word.word + } : null; + } + } + }); + languages.registerDocumentFormattingEditProvider("java", { + provideDocumentFormattingEdits: async (model) => { + if (!_conn || !isWorkspaceFile(model.uri.toString())) return null; + const edits = await _conn.sendRequest("textDocument/formatting", { + textDocument: { uri: model.uri.toString() }, + options: { tabSize: model.getOptions().tabSize, insertSpaces: model.getOptions().insertSpaces } + }); + return edits ? edits.map(textEditToMonaco) : null; + } + }); + languages.registerCodeActionProvider("java", { + provideCodeActions: async (model, range, context) => { + const empty = { actions: [], dispose() { + } }; + if (!_conn || !isWorkspaceFile(model.uri.toString())) return empty; + const diagnostics = (context.markers ?? []).map(markerToLspDiagnostic); + const result = await _conn.sendRequest("textDocument/codeAction", { + textDocument: { uri: model.uri.toString() }, + range: monacoRangeToLsp(range), + context: { diagnostics, only: context.only ? [context.only] : void 0 } + }); + if (!result?.length) return empty; + return { + actions: result.map(lspCodeActionToMonaco), + dispose() { + } + }; + } + }, { + providedCodeActionKinds: [ + "quickfix", + "refactor", + "refactor.extract", + "refactor.inline", + "refactor.rewrite", + "source", + "source.organizeImports" + ] + }); } function lspSeverity(severity) { switch (severity) { @@ -4718,21 +4878,204 @@ ${JSON.stringify(message, null, 4)}`); } function lspCompletionToMonaco(item, model, position) { const word = model.getWordUntilPosition(position); - const range = { + let range = { startLineNumber: position.lineNumber, startColumn: word.startColumn, endLineNumber: position.lineNumber, endColumn: word.endColumn }; - return { + let insertText = item.insertText ?? item.label; + const textEdit = item.textEdit; + if (textEdit) { + const r = textEdit.range ?? textEdit.replace ?? textEdit.insert; + if (r) range = lspRangeToMonaco(r); + if (typeof textEdit.newText === "string") insertText = textEdit.newText; + } + const result = { label: item.label, kind: lspCompletionKind(item.kind), detail: item.detail, documentation: item.documentation ? { value: markupToString(item.documentation), isTrusted: false } : void 0, - insertText: item.insertText ?? item.label, + insertText, insertTextRules: item.insertTextFormat === InsertTextFormat.Snippet ? languages.CompletionItemInsertTextRule.InsertAsSnippet : void 0, - range + range, + sortText: sdkPrioritisedSortText(item), + additionalTextEdits: item.additionalTextEdits?.map(textEditToMonaco) + }; + result._lsp = item; + return result; + } + function sdkPrioritisedSortText(item) { + const base = item.sortText ?? (typeof item.label === "string" ? item.label : ""); + const description = item.labelDetails && typeof item.labelDetails.description === "string" ? item.labelDetails.description : ""; + const haystack = `${item.detail ?? ""} ${description}`; + return haystack.includes("org.eclipse.dirigible.sdk") ? `0_${base}` : `1_${base}`; + } + var APPLY_ACTION_COMMAND = "dirigible.java.applyCodeAction"; + function textEditToMonaco(edit) { + return { range: lspRangeToMonaco(edit.range), text: edit.newText }; + } + function monacoRangeToLsp(r) { + return { + start: { line: r.startLineNumber - 1, character: r.startColumn - 1 }, + end: { line: r.endLineNumber - 1, character: r.endColumn - 1 } + }; + } + function monacoSeverityToLsp(severity) { + switch (severity) { + case MarkerSeverity.Error: + return DiagnosticSeverity.Error; + case MarkerSeverity.Warning: + return DiagnosticSeverity.Warning; + case MarkerSeverity.Info: + return DiagnosticSeverity.Information; + default: + return DiagnosticSeverity.Hint; + } + } + function markerToLspDiagnostic(m2) { + return { + range: { + start: { line: m2.startLineNumber - 1, character: m2.startColumn - 1 }, + end: { line: m2.endLineNumber - 1, character: m2.endColumn - 1 } + }, + message: m2.message, + severity: monacoSeverityToLsp(m2.severity), + source: m2.source + }; + } + function lspCodeActionToMonaco(action) { + const isCommand = typeof action.command === "string"; + const title = action.title ?? (isCommand ? action.command : action.command?.title) ?? "Action"; + const kind = isCommand ? "quickfix" : action.kind ?? "quickfix"; + return { + title, + kind, + diagnostics: [], + isPreferred: action.isPreferred, + // Apply lazily through our command so we can resolve, run server commands and apply edits uniformly. + command: { id: APPLY_ACTION_COMMAND, title, arguments: [action] } + }; + } + async function applyCodeAction(action) { + if (!_conn) return; + try { + if (typeof action.command === "string") { + await runServerCommand(action); + return; + } + let resolved = action; + if (!resolved.edit && resolved.data !== void 0) { + resolved = await _conn.sendRequest("codeAction/resolve", resolved); + } + if (resolved.edit) applyWorkspaceEdit(resolved.edit); + if (resolved.command) await runServerCommand(resolved.command); + } catch (e) { + console.warn("[java-lsp] code action failed:", e?.message ?? e); + } + } + function isWorkspaceEdit(value) { + return !!value && (!!value.changes || !!value.documentChanges); + } + async function runServerCommand(cmd) { + if (!_conn || !cmd?.command) return; + if (GENERATE[cmd.command]) { + await runGenerate(cmd.command, cmd.arguments ?? []); + return; + } + const result = await _conn.sendRequest("workspace/executeCommand", { command: cmd.command, arguments: cmd.arguments ?? [] }); + if (isWorkspaceEdit(result)) applyWorkspaceEdit(result); + } + function fieldLabel(f) { + const name = f?.name ?? f?.fieldName ?? ""; + const type = f?.type ?? f?.typeName; + return type ? `${name}: ${type}` : `${name}`; + } + var GENERATE = { + "java.action.generateConstructorsPrompt": { + label: "Select fields and constructors", + status: "java.action.checkConstructorsStatus", + generate: "java.action.generateConstructors", + members: (s) => (s?.fields ?? []).map((f) => ({ label: fieldLabel(f), ref: f })), + buildArgs: (args, s, sel) => [args[0], { constructors: s?.constructors ?? [], fields: sel.map((m2) => m2.ref) }] + }, + "java.action.generateToStringPrompt": { + label: "Select fields to include in toString()", + status: "java.action.checkToStringStatus", + generate: "java.action.generateToString", + members: (s) => (s?.fields ?? []).map((f) => ({ label: fieldLabel(f), ref: f })), + buildArgs: (args, _s, sel) => [args[0], sel.map((m2) => m2.ref)] + }, + "java.action.hashCodeEqualsPrompt": { + label: "Select fields for hashCode() and equals()", + status: "java.action.checkHashCodeEqualsStatus", + generate: "java.action.generateHashCodeEquals", + members: (s) => (s?.fields ?? []).map((f) => ({ label: fieldLabel(f), ref: f })), + buildArgs: (args, _s, sel) => [args[0], sel.map((m2) => m2.ref), false] + }, + "java.action.generateAccessorsPrompt": { + label: "Select fields to generate getters and setters", + status: "java.action.checkAccessorsStatus", + generate: "java.action.generateAccessors", + members: (s) => (s?.accessors ?? s ?? []).map((a) => ({ label: fieldLabel(a), ref: a })), + buildArgs: (args, _s, sel) => [args[0], sel.map((m2) => m2.ref)] + } + }; + async function runGenerate(promptId, args) { + if (!_conn) return; + const spec = GENERATE[promptId]; + const status = await _conn.sendRequest("workspace/executeCommand", { command: spec.status, arguments: args }); + if (!status) return; + const members = spec.members(status); + let selected = members; + const picker = globalThis.javaLspMemberPicker; + if (members.length && typeof picker === "function") { + const chosen = await picker(spec.label, members.map((m2) => m2.label)); + if (chosen === null) return; + selected = members.filter((m2) => chosen.includes(m2.label)); + } + const edit = await _conn.sendRequest("workspace/executeCommand", { + command: spec.generate, + arguments: spec.buildArgs(args, status, selected) + }); + if (isWorkspaceEdit(edit)) applyWorkspaceEdit(edit); + } + function applyWorkspaceEdit(edit) { + if (!edit) return; + const byUri = {}; + if (edit.changes) { + for (const uri in edit.changes) byUri[uri] = (byUri[uri] ?? []).concat(edit.changes[uri]); + } + if (edit.documentChanges) { + for (const dc of edit.documentChanges) { + if (dc?.textDocument?.uri && Array.isArray(dc.edits)) { + byUri[dc.textDocument.uri] = (byUri[dc.textDocument.uri] ?? []).concat(dc.edits); + } + } + } + for (const uri in byUri) { + const model = editor.getModels().find((m2) => m2.uri.toString() === uri); + if (!model) continue; + const ops = byUri[uri].map((e) => ({ range: lspRangeToMonaco(e.range), text: e.newText, forceMoveMarkers: true })); + model.pushEditOperations([], ops, () => null); + } + } + function workspaceEditToMonaco(edit) { + const edits = []; + const push = (uri, list) => { + for (const e of list) { + edits.push({ resource: Uri.parse(uri), textEdit: { range: lspRangeToMonaco(e.range), text: e.newText }, versionId: void 0 }); + } }; + if (edit?.changes) { + for (const uri in edit.changes) push(uri, edit.changes[uri]); + } + if (edit?.documentChanges) { + for (const dc of edit.documentChanges) { + if (dc?.textDocument?.uri && Array.isArray(dc.edits)) push(dc.textDocument.uri, dc.edits); + } + } + return { edits }; } function jdtlsSettings() { return { @@ -4764,4 +5107,4 @@ ${JSON.stringify(message, null, 4)}`); } return __toCommonJS(java_lsp_client_exports); })(); -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvY29tbW9uL2lzLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlcy5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vbGlua2VkTWFwLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9kaXNwb3NhYmxlLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9yYWwuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvY29tbW9uL2V2ZW50cy5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vY2FuY2VsbGF0aW9uLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9zaGFyZWRBcnJheUNhbmNlbGxhdGlvbi5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vc2VtYXBob3JlLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlUmVhZGVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlV3JpdGVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlQnVmZmVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9jb25uZWN0aW9uLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9hcGkuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvYnJvd3Nlci9yaWwuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvYnJvd3Nlci9tYWluLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvYnJvd3Nlci5qcyIsICJsc3AvamF2YS1sc3AtY2xpZW50LnRzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLXdzLWpzb25ycGMvc3JjL2Rpc3Bvc2FibGUudHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvc29ja2V0L3NvY2tldC50cyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS13cy1qc29ucnBjL3NyYy9zb2NrZXQvcmVhZGVyLnRzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLXdzLWpzb25ycGMvc3JjL3NvY2tldC93cml0ZXIudHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvc29ja2V0L2Nvbm5lY3Rpb24udHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvY29ubmVjdGlvbi50cyIsICJsc3AvbW9uYWNvLXNoaW0udHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtbGFuZ3VhZ2VzZXJ2ZXItdHlwZXMvbGliL2VzbS9tYWluLmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuc3RyaW5nQXJyYXkgPSBleHBvcnRzLmFycmF5ID0gZXhwb3J0cy5mdW5jID0gZXhwb3J0cy5lcnJvciA9IGV4cG9ydHMubnVtYmVyID0gZXhwb3J0cy5zdHJpbmcgPSBleHBvcnRzLmJvb2xlYW4gPSB2b2lkIDA7XG5mdW5jdGlvbiBib29sZWFuKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZTtcbn1cbmV4cG9ydHMuYm9vbGVhbiA9IGJvb2xlYW47XG5mdW5jdGlvbiBzdHJpbmcodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZztcbn1cbmV4cG9ydHMuc3RyaW5nID0gc3RyaW5nO1xuZnVuY3Rpb24gbnVtYmVyKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdmFsdWUgaW5zdGFuY2VvZiBOdW1iZXI7XG59XG5leHBvcnRzLm51bWJlciA9IG51bWJlcjtcbmZ1bmN0aW9uIGVycm9yKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgRXJyb3I7XG59XG5leHBvcnRzLmVycm9yID0gZXJyb3I7XG5mdW5jdGlvbiBmdW5jKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cbmV4cG9ydHMuZnVuYyA9IGZ1bmM7XG5mdW5jdGlvbiBhcnJheSh2YWx1ZSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cbmV4cG9ydHMuYXJyYXkgPSBhcnJheTtcbmZ1bmN0aW9uIHN0cmluZ0FycmF5KHZhbHVlKSB7XG4gICAgcmV0dXJuIGFycmF5KHZhbHVlKSAmJiB2YWx1ZS5ldmVyeShlbGVtID0+IHN0cmluZyhlbGVtKSk7XG59XG5leHBvcnRzLnN0cmluZ0FycmF5ID0gc3RyaW5nQXJyYXk7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLk1lc3NhZ2UgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU5ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlOCA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTcgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU2ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNSA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTQgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUzID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMiA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTEgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUwID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTkgPSBleHBvcnRzLlJlcXVlc3RUeXBlOCA9IGV4cG9ydHMuUmVxdWVzdFR5cGU3ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTYgPSBleHBvcnRzLlJlcXVlc3RUeXBlNSA9IGV4cG9ydHMuUmVxdWVzdFR5cGU0ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTMgPSBleHBvcnRzLlJlcXVlc3RUeXBlMiA9IGV4cG9ydHMuUmVxdWVzdFR5cGUxID0gZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IGV4cG9ydHMuUmVxdWVzdFR5cGUwID0gZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUgPSBleHBvcnRzLlBhcmFtZXRlclN0cnVjdHVyZXMgPSBleHBvcnRzLlJlc3BvbnNlRXJyb3IgPSBleHBvcnRzLkVycm9yQ29kZXMgPSB2b2lkIDA7XG5jb25zdCBpcyA9IHJlcXVpcmUoXCIuL2lzXCIpO1xuLyoqXG4gKiBQcmVkZWZpbmVkIGVycm9yIGNvZGVzLlxuICovXG52YXIgRXJyb3JDb2RlcztcbihmdW5jdGlvbiAoRXJyb3JDb2Rlcykge1xuICAgIC8vIERlZmluZWQgYnkgSlNPTiBSUENcbiAgICBFcnJvckNvZGVzLlBhcnNlRXJyb3IgPSAtMzI3MDA7XG4gICAgRXJyb3JDb2Rlcy5JbnZhbGlkUmVxdWVzdCA9IC0zMjYwMDtcbiAgICBFcnJvckNvZGVzLk1ldGhvZE5vdEZvdW5kID0gLTMyNjAxO1xuICAgIEVycm9yQ29kZXMuSW52YWxpZFBhcmFtcyA9IC0zMjYwMjtcbiAgICBFcnJvckNvZGVzLkludGVybmFsRXJyb3IgPSAtMzI2MDM7XG4gICAgLyoqXG4gICAgICogVGhpcyBpcyB0aGUgc3RhcnQgcmFuZ2Ugb2YgSlNPTiBSUEMgcmVzZXJ2ZWQgZXJyb3IgY29kZXMuXG4gICAgICogSXQgZG9lc24ndCBkZW5vdGUgYSByZWFsIGVycm9yIGNvZGUuIE5vIGFwcGxpY2F0aW9uIGVycm9yIGNvZGVzIHNob3VsZFxuICAgICAqIGJlIGRlZmluZWQgYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCByYW5nZS4gRm9yIGJhY2t3YXJkc1xuICAgICAqIGNvbXBhdGliaWxpdHkgdGhlIGBTZXJ2ZXJOb3RJbml0aWFsaXplZGAgYW5kIHRoZSBgVW5rbm93bkVycm9yQ29kZWBcbiAgICAgKiBhcmUgbGVmdCBpbiB0aGUgcmFuZ2UuXG4gICAgICpcbiAgICAgKiBAc2luY2UgMy4xNi4wXG4gICAgKi9cbiAgICBFcnJvckNvZGVzLmpzb25ycGNSZXNlcnZlZEVycm9yUmFuZ2VTdGFydCA9IC0zMjA5OTtcbiAgICAvKiogQGRlcHJlY2F0ZWQgdXNlICBqc29ucnBjUmVzZXJ2ZWRFcnJvclJhbmdlU3RhcnQgKi9cbiAgICBFcnJvckNvZGVzLnNlcnZlckVycm9yU3RhcnQgPSAtMzIwOTk7XG4gICAgLyoqXG4gICAgICogQW4gZXJyb3Igb2NjdXJyZWQgd2hlbiB3cml0ZSBhIG1lc3NhZ2UgdG8gdGhlIHRyYW5zcG9ydCBsYXllci5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLk1lc3NhZ2VXcml0ZUVycm9yID0gLTMyMDk5O1xuICAgIC8qKlxuICAgICAqIEFuIGVycm9yIG9jY3VycmVkIHdoZW4gcmVhZGluZyBhIG1lc3NhZ2UgZnJvbSB0aGUgdHJhbnNwb3J0IGxheWVyLlxuICAgICAqL1xuICAgIEVycm9yQ29kZXMuTWVzc2FnZVJlYWRFcnJvciA9IC0zMjA5ODtcbiAgICAvKipcbiAgICAgKiBUaGUgY29ubmVjdGlvbiBnb3QgZGlzcG9zZWQgb3IgbG9zdCBhbmQgYWxsIHBlbmRpbmcgcmVzcG9uc2VzIGdvdFxuICAgICAqIHJlamVjdGVkLlxuICAgICAqL1xuICAgIEVycm9yQ29kZXMuUGVuZGluZ1Jlc3BvbnNlUmVqZWN0ZWQgPSAtMzIwOTc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gaXMgaW5hY3RpdmUgYW5kIGEgdXNlIG9mIGl0IGZhaWxlZC5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLkNvbm5lY3Rpb25JbmFjdGl2ZSA9IC0zMjA5NjtcbiAgICAvKipcbiAgICAgKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBhIHNlcnZlciByZWNlaXZlZCBhIG5vdGlmaWNhdGlvbiBvclxuICAgICAqIHJlcXVlc3QgYmVmb3JlIHRoZSBzZXJ2ZXIgaGFzIHJlY2VpdmVkIHRoZSBgaW5pdGlhbGl6ZWAgcmVxdWVzdC5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLlNlcnZlck5vdEluaXRpYWxpemVkID0gLTMyMDAyO1xuICAgIEVycm9yQ29kZXMuVW5rbm93bkVycm9yQ29kZSA9IC0zMjAwMTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIHRoZSBlbmQgcmFuZ2Ugb2YgSlNPTiBSUEMgcmVzZXJ2ZWQgZXJyb3IgY29kZXMuXG4gICAgICogSXQgZG9lc24ndCBkZW5vdGUgYSByZWFsIGVycm9yIGNvZGUuXG4gICAgICpcbiAgICAgKiBAc2luY2UgMy4xNi4wXG4gICAgKi9cbiAgICBFcnJvckNvZGVzLmpzb25ycGNSZXNlcnZlZEVycm9yUmFuZ2VFbmQgPSAtMzIwMDA7XG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSAganNvbnJwY1Jlc2VydmVkRXJyb3JSYW5nZUVuZCAqL1xuICAgIEVycm9yQ29kZXMuc2VydmVyRXJyb3JFbmQgPSAtMzIwMDA7XG59KShFcnJvckNvZGVzIHx8IChleHBvcnRzLkVycm9yQ29kZXMgPSBFcnJvckNvZGVzID0ge30pKTtcbi8qKlxuICogQW4gZXJyb3Igb2JqZWN0IHJldHVybiBpbiBhIHJlc3BvbnNlIGluIGNhc2UgYSByZXF1ZXN0XG4gKiBoYXMgZmFpbGVkLlxuICovXG5jbGFzcyBSZXNwb25zZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNvZGUsIG1lc3NhZ2UsIGRhdGEpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuY29kZSA9IGlzLm51bWJlcihjb2RlKSA/IGNvZGUgOiBFcnJvckNvZGVzLlVua25vd25FcnJvckNvZGU7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBSZXNwb25zZUVycm9yLnByb3RvdHlwZSk7XG4gICAgfVxuICAgIHRvSnNvbigpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgY29kZTogdGhpcy5jb2RlLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLmRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmRhdGEgPSB0aGlzLmRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5leHBvcnRzLlJlc3BvbnNlRXJyb3IgPSBSZXNwb25zZUVycm9yO1xuY2xhc3MgUGFyYW1ldGVyU3RydWN0dXJlcyB7XG4gICAgY29uc3RydWN0b3Ioa2luZCkge1xuICAgICAgICB0aGlzLmtpbmQgPSBraW5kO1xuICAgIH1cbiAgICBzdGF0aWMgaXModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8gfHwgdmFsdWUgPT09IFBhcmFtZXRlclN0cnVjdHVyZXMuYnlOYW1lIHx8IHZhbHVlID09PSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5UG9zaXRpb247XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5raW5kO1xuICAgIH1cbn1cbmV4cG9ydHMuUGFyYW1ldGVyU3RydWN0dXJlcyA9IFBhcmFtZXRlclN0cnVjdHVyZXM7XG4vKipcbiAqIFRoZSBwYXJhbWV0ZXIgc3RydWN0dXJlIGlzIGF1dG9tYXRpY2FsbHkgaW5mZXJyZWQgb24gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzXG4gKiBhbmQgdGhlIHBhcmFtZXRlciB0eXBlIGluIGNhc2Ugb2YgYSBzaW5nbGUgcGFyYW0uXG4gKi9cblBhcmFtZXRlclN0cnVjdHVyZXMuYXV0byA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdhdXRvJyk7XG4vKipcbiAqIEZvcmNlcyBgYnlQb3NpdGlvbmAgcGFyYW1ldGVyIHN0cnVjdHVyZS4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGhhdmUgYSBzaW5nbGVcbiAqIHBhcmFtZXRlciB3aGljaCBoYXMgYSBsaXRlcmFsIHR5cGUuXG4gKi9cblBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbiA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdieVBvc2l0aW9uJyk7XG4vKipcbiAqIEZvcmNlcyBgYnlOYW1lYCBwYXJhbWV0ZXIgc3RydWN0dXJlLiBUaGlzIGlzIG9ubHkgdXNlZnVsIHdoZW4gaGF2aW5nIGEgc2luZ2xlXG4gKiBwYXJhbWV0ZXIuIFRoZSBsaWJyYXJ5IHdpbGwgcmVwb3J0IGVycm9ycyBpZiB1c2VkIHdpdGggYSBkaWZmZXJlbnQgbnVtYmVyIG9mXG4gKiBwYXJhbWV0ZXJzLlxuICovXG5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdieU5hbWUnKTtcbi8qKlxuICogQW4gYWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgYSBNZXNzYWdlVHlwZS5cbiAqL1xuY2xhc3MgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIG51bWJlck9mUGFyYW1zKSB7XG4gICAgICAgIHRoaXMubWV0aG9kID0gbWV0aG9kO1xuICAgICAgICB0aGlzLm51bWJlck9mUGFyYW1zID0gbnVtYmVyT2ZQYXJhbXM7XG4gICAgfVxuICAgIGdldCBwYXJhbWV0ZXJTdHJ1Y3R1cmVzKCkge1xuICAgICAgICByZXR1cm4gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvO1xuICAgIH1cbn1cbmV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlID0gQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlO1xuLyoqXG4gKiBDbGFzc2VzIHRvIHR5cGUgcmVxdWVzdCByZXNwb25zZSBwYWlyc1xuICovXG5jbGFzcyBSZXF1ZXN0VHlwZTAgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDApO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGUwID0gUmVxdWVzdFR5cGUwO1xuY2xhc3MgUmVxdWVzdFR5cGUgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCwgX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8pIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAxKTtcbiAgICAgICAgdGhpcy5fcGFyYW1ldGVyU3RydWN0dXJlcyA9IF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbiAgICBnZXQgcGFyYW1ldGVyU3RydWN0dXJlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXM7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IFJlcXVlc3RUeXBlO1xuY2xhc3MgUmVxdWVzdFR5cGUxIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMSk7XG4gICAgICAgIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBfcGFyYW1ldGVyU3RydWN0dXJlcztcbiAgICB9XG4gICAgZ2V0IHBhcmFtZXRlclN0cnVjdHVyZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGUxID0gUmVxdWVzdFR5cGUxO1xuY2xhc3MgUmVxdWVzdFR5cGUyIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAyKTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlMiA9IFJlcXVlc3RUeXBlMjtcbmNsYXNzIFJlcXVlc3RUeXBlMyBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMyk7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTMgPSBSZXF1ZXN0VHlwZTM7XG5jbGFzcyBSZXF1ZXN0VHlwZTQgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDQpO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGU0ID0gUmVxdWVzdFR5cGU0O1xuY2xhc3MgUmVxdWVzdFR5cGU1IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA1KTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlNSA9IFJlcXVlc3RUeXBlNTtcbmNsYXNzIFJlcXVlc3RUeXBlNiBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNik7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTYgPSBSZXF1ZXN0VHlwZTY7XG5jbGFzcyBSZXF1ZXN0VHlwZTcgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDcpO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGU3ID0gUmVxdWVzdFR5cGU3O1xuY2xhc3MgUmVxdWVzdFR5cGU4IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA4KTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlOCA9IFJlcXVlc3RUeXBlODtcbmNsYXNzIFJlcXVlc3RUeXBlOSBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgOSk7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTkgPSBSZXF1ZXN0VHlwZTk7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMSk7XG4gICAgICAgIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBfcGFyYW1ldGVyU3RydWN0dXJlcztcbiAgICB9XG4gICAgZ2V0IHBhcmFtZXRlclN0cnVjdHVyZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZSA9IE5vdGlmaWNhdGlvblR5cGU7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlMCBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMCk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMCA9IE5vdGlmaWNhdGlvblR5cGUwO1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTEgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCwgX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8pIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAxKTtcbiAgICAgICAgdGhpcy5fcGFyYW1ldGVyU3RydWN0dXJlcyA9IF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbiAgICBnZXQgcGFyYW1ldGVyU3RydWN0dXJlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXM7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMSA9IE5vdGlmaWNhdGlvblR5cGUxO1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDIpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTIgPSBOb3RpZmljYXRpb25UeXBlMjtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGUzIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAzKTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGUzID0gTm90aWZpY2F0aW9uVHlwZTM7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlNCBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNCk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNCA9IE5vdGlmaWNhdGlvblR5cGU0O1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTUgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDUpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTUgPSBOb3RpZmljYXRpb25UeXBlNTtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGU2IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA2KTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGU2ID0gTm90aWZpY2F0aW9uVHlwZTY7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlNyBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNyk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNyA9IE5vdGlmaWNhdGlvblR5cGU3O1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTggZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDgpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTggPSBOb3RpZmljYXRpb25UeXBlODtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGU5IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA5KTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGU5ID0gTm90aWZpY2F0aW9uVHlwZTk7XG52YXIgTWVzc2FnZTtcbihmdW5jdGlvbiAoTWVzc2FnZSkge1xuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoZSBnaXZlbiBtZXNzYWdlIGlzIGEgcmVxdWVzdCBtZXNzYWdlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gbWVzc2FnZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBpcy5zdHJpbmcoY2FuZGlkYXRlLm1ldGhvZCkgJiYgKGlzLnN0cmluZyhjYW5kaWRhdGUuaWQpIHx8IGlzLm51bWJlcihjYW5kaWRhdGUuaWQpKTtcbiAgICB9XG4gICAgTWVzc2FnZS5pc1JlcXVlc3QgPSBpc1JlcXVlc3Q7XG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhlIGdpdmVuIG1lc3NhZ2UgaXMgYSBub3RpZmljYXRpb24gbWVzc2FnZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTm90aWZpY2F0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gbWVzc2FnZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBpcy5zdHJpbmcoY2FuZGlkYXRlLm1ldGhvZCkgJiYgbWVzc2FnZS5pZCA9PT0gdm9pZCAwO1xuICAgIH1cbiAgICBNZXNzYWdlLmlzTm90aWZpY2F0aW9uID0gaXNOb3RpZmljYXRpb247XG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhlIGdpdmVuIG1lc3NhZ2UgaXMgYSByZXNwb25zZSBtZXNzYWdlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNSZXNwb25zZShtZXNzYWdlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IG1lc3NhZ2U7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgKGNhbmRpZGF0ZS5yZXN1bHQgIT09IHZvaWQgMCB8fCAhIWNhbmRpZGF0ZS5lcnJvcikgJiYgKGlzLnN0cmluZyhjYW5kaWRhdGUuaWQpIHx8IGlzLm51bWJlcihjYW5kaWRhdGUuaWQpIHx8IGNhbmRpZGF0ZS5pZCA9PT0gbnVsbCk7XG4gICAgfVxuICAgIE1lc3NhZ2UuaXNSZXNwb25zZSA9IGlzUmVzcG9uc2U7XG59KShNZXNzYWdlIHx8IChleHBvcnRzLk1lc3NhZ2UgPSBNZXNzYWdlID0ge30pKTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xudmFyIF9hO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5MUlVDYWNoZSA9IGV4cG9ydHMuTGlua2VkTWFwID0gZXhwb3J0cy5Ub3VjaCA9IHZvaWQgMDtcbnZhciBUb3VjaDtcbihmdW5jdGlvbiAoVG91Y2gpIHtcbiAgICBUb3VjaC5Ob25lID0gMDtcbiAgICBUb3VjaC5GaXJzdCA9IDE7XG4gICAgVG91Y2guQXNPbGQgPSBUb3VjaC5GaXJzdDtcbiAgICBUb3VjaC5MYXN0ID0gMjtcbiAgICBUb3VjaC5Bc05ldyA9IFRvdWNoLkxhc3Q7XG59KShUb3VjaCB8fCAoZXhwb3J0cy5Ub3VjaCA9IFRvdWNoID0ge30pKTtcbmNsYXNzIExpbmtlZE1hcCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXNbX2FdID0gJ0xpbmtlZE1hcCc7XG4gICAgICAgIHRoaXMuX21hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5faGVhZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fdGFpbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IDA7XG4gICAgICAgIHRoaXMuX3N0YXRlID0gMDtcbiAgICB9XG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuX21hcC5jbGVhcigpO1xuICAgICAgICB0aGlzLl9oZWFkID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl90YWlsID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9zaXplID0gMDtcbiAgICAgICAgdGhpcy5fc3RhdGUrKztcbiAgICB9XG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLl9oZWFkICYmICF0aGlzLl90YWlsO1xuICAgIH1cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpemU7XG4gICAgfVxuICAgIGdldCBmaXJzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlYWQ/LnZhbHVlO1xuICAgIH1cbiAgICBnZXQgbGFzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhaWw/LnZhbHVlO1xuICAgIH1cbiAgICBoYXMoa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXAuaGFzKGtleSk7XG4gICAgfVxuICAgIGdldChrZXksIHRvdWNoID0gVG91Y2guTm9uZSkge1xuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5fbWFwLmdldChrZXkpO1xuICAgICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRvdWNoICE9PSBUb3VjaC5Ob25lKSB7XG4gICAgICAgICAgICB0aGlzLnRvdWNoKGl0ZW0sIHRvdWNoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICB9XG4gICAgc2V0KGtleSwgdmFsdWUsIHRvdWNoID0gVG91Y2guTm9uZSkge1xuICAgICAgICBsZXQgaXRlbSA9IHRoaXMuX21hcC5nZXQoa2V5KTtcbiAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgIGl0ZW0udmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIGlmICh0b3VjaCAhPT0gVG91Y2guTm9uZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudG91Y2goaXRlbSwgdG91Y2gpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaXRlbSA9IHsga2V5LCB2YWx1ZSwgbmV4dDogdW5kZWZpbmVkLCBwcmV2aW91czogdW5kZWZpbmVkIH07XG4gICAgICAgICAgICBzd2l0Y2ggKHRvdWNoKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBUb3VjaC5Ob25lOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFRvdWNoLkZpcnN0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1GaXJzdChpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBUb3VjaC5MYXN0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX21hcC5zZXQoa2V5LCBpdGVtKTtcbiAgICAgICAgICAgIHRoaXMuX3NpemUrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGVsZXRlKGtleSkge1xuICAgICAgICByZXR1cm4gISF0aGlzLnJlbW92ZShrZXkpO1xuICAgIH1cbiAgICByZW1vdmUoa2V5KSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl9tYXAuZ2V0KGtleSk7XG4gICAgICAgIGlmICghaXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tYXAuZGVsZXRlKGtleSk7XG4gICAgICAgIHRoaXMucmVtb3ZlSXRlbShpdGVtKTtcbiAgICAgICAgdGhpcy5fc2l6ZS0tO1xuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICB9XG4gICAgc2hpZnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5faGVhZCAmJiAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2hlYWQgfHwgIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIHRoaXMuX21hcC5kZWxldGUoaXRlbS5rZXkpO1xuICAgICAgICB0aGlzLnJlbW92ZUl0ZW0oaXRlbSk7XG4gICAgICAgIHRoaXMuX3NpemUtLTtcbiAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7XG4gICAgfVxuICAgIGZvckVhY2goY2FsbGJhY2tmbiwgdGhpc0FyZykge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3N0YXRlO1xuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICAgICAgICBpZiAodGhpc0FyZykge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrZm4uYmluZCh0aGlzQXJnKShjdXJyZW50LnZhbHVlLCBjdXJyZW50LmtleSwgdGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFja2ZuKGN1cnJlbnQudmFsdWUsIGN1cnJlbnQua2V5LCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gc3RhdGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExpbmtlZE1hcCBnb3QgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAga2V5cygpIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9zdGF0ZTtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLl9oZWFkO1xuICAgICAgICBjb25zdCBpdGVyYXRvciA9IHtcbiAgICAgICAgICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fc3RhdGUgIT09IHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTGlua2VkTWFwIGdvdCBtb2RpZmllZCBkdXJpbmcgaXRlcmF0aW9uLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7IHZhbHVlOiBjdXJyZW50LmtleSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICB9XG4gICAgdmFsdWVzKCkge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3N0YXRlO1xuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIGNvbnN0IGl0ZXJhdG9yID0ge1xuICAgICAgICAgICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlcmF0b3I7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBMaW5rZWRNYXAgZ290IG1vZGlmaWVkIGR1cmluZyBpdGVyYXRpb24uYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHsgdmFsdWU6IGN1cnJlbnQudmFsdWUsIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gaXRlcmF0b3I7XG4gICAgfVxuICAgIGVudHJpZXMoKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5fc3RhdGU7XG4gICAgICAgIGxldCBjdXJyZW50ID0gdGhpcy5faGVhZDtcbiAgICAgICAgY29uc3QgaXRlcmF0b3IgPSB7XG4gICAgICAgICAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3N0YXRlICE9PSBzdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExpbmtlZE1hcCBnb3QgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geyB2YWx1ZTogW2N1cnJlbnQua2V5LCBjdXJyZW50LnZhbHVlXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICB9XG4gICAgWyhfYSA9IFN5bWJvbC50b1N0cmluZ1RhZywgU3ltYm9sLml0ZXJhdG9yKV0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMoKTtcbiAgICB9XG4gICAgdHJpbU9sZChuZXdTaXplKSB7XG4gICAgICAgIGlmIChuZXdTaXplID49IHRoaXMuc2l6ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuZXdTaXplID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLl9oZWFkO1xuICAgICAgICBsZXQgY3VycmVudFNpemUgPSB0aGlzLnNpemU7XG4gICAgICAgIHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnRTaXplID4gbmV3U2l6ZSkge1xuICAgICAgICAgICAgdGhpcy5fbWFwLmRlbGV0ZShjdXJyZW50LmtleSk7XG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0O1xuICAgICAgICAgICAgY3VycmVudFNpemUtLTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9oZWFkID0gY3VycmVudDtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IGN1cnJlbnRTaXplO1xuICAgICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICAgICAgY3VycmVudC5wcmV2aW91cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgIH1cbiAgICBhZGRJdGVtRmlyc3QoaXRlbSkge1xuICAgICAgICAvLyBGaXJzdCB0aW1lIEluc2VydFxuICAgICAgICBpZiAoIXRoaXMuX2hlYWQgJiYgIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRoaXMuX3RhaWwgPSBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCF0aGlzLl9oZWFkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbGlzdCcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdGhpcy5faGVhZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQucHJldmlvdXMgPSBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2hlYWQgPSBpdGVtO1xuICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgIH1cbiAgICBhZGRJdGVtTGFzdChpdGVtKSB7XG4gICAgICAgIC8vIEZpcnN0IHRpbWUgSW5zZXJ0XG4gICAgICAgIGlmICghdGhpcy5faGVhZCAmJiAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgdGhpcy5faGVhZCA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpdGVtLnByZXZpb3VzID0gdGhpcy5fdGFpbDtcbiAgICAgICAgICAgIHRoaXMuX3RhaWwubmV4dCA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW07XG4gICAgICAgIHRoaXMuX3N0YXRlKys7XG4gICAgfVxuICAgIHJlbW92ZUl0ZW0oaXRlbSkge1xuICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCAmJiBpdGVtID09PSB0aGlzLl90YWlsKSB7XG4gICAgICAgICAgICB0aGlzLl9oZWFkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpdGVtID09PSB0aGlzLl9oZWFkKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGNhbiBvbmx5IGhhcHBlbmVkIGlmIHNpemUgPT09IDEgd2hpY2ggaXMgaGFuZGxlXG4gICAgICAgICAgICAvLyBieSB0aGUgY2FzZSBhYm92ZS5cbiAgICAgICAgICAgIGlmICghaXRlbS5uZXh0KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxpc3QnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGl0ZW0ubmV4dC5wcmV2aW91cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQgPSBpdGVtLm5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXRlbSA9PT0gdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgLy8gVGhpcyBjYW4gb25seSBoYXBwZW5lZCBpZiBzaXplID09PSAxIHdoaWNoIGlzIGhhbmRsZVxuICAgICAgICAgICAgLy8gYnkgdGhlIGNhc2UgYWJvdmUuXG4gICAgICAgICAgICBpZiAoIWl0ZW0ucHJldmlvdXMpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbGlzdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbS5wcmV2aW91cy5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gaXRlbS5uZXh0O1xuICAgICAgICAgICAgY29uc3QgcHJldmlvdXMgPSBpdGVtLnByZXZpb3VzO1xuICAgICAgICAgICAgaWYgKCFuZXh0IHx8ICFwcmV2aW91cykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXh0LnByZXZpb3VzID0gcHJldmlvdXM7XG4gICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gbmV4dDtcbiAgICAgICAgfVxuICAgICAgICBpdGVtLm5leHQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGl0ZW0ucHJldmlvdXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX3N0YXRlKys7XG4gICAgfVxuICAgIHRvdWNoKGl0ZW0sIHRvdWNoKSB7XG4gICAgICAgIGlmICghdGhpcy5faGVhZCB8fCAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxpc3QnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHRvdWNoICE9PSBUb3VjaC5GaXJzdCAmJiB0b3VjaCAhPT0gVG91Y2guTGFzdCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG91Y2ggPT09IFRvdWNoLkZpcnN0KSB7XG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBpdGVtLm5leHQ7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgICAgICAvLyBVbmxpbmsgdGhlIGl0ZW1cbiAgICAgICAgICAgIGlmIChpdGVtID09PSB0aGlzLl90YWlsKSB7XG4gICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgbXVzdCBiZSBkZWZpbmVkIHNpbmNlIGl0ZW0gd2FzIG5vdCBoZWFkIGJ1dCBpcyB0YWlsXG4gICAgICAgICAgICAgICAgLy8gU28gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbiBpdGVtIGluIHRoZSBtYXBcbiAgICAgICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuX3RhaWwgPSBwcmV2aW91cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEJvdGggbmV4dCBhbmQgcHJldmlvdXMgYXJlIG5vdCB1bmRlZmluZWQgc2luY2UgaXRlbSB3YXMgbmVpdGhlciBoZWFkIG5vciB0YWlsLlxuICAgICAgICAgICAgICAgIG5leHQucHJldmlvdXMgPSBwcmV2aW91cztcbiAgICAgICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEluc2VydCB0aGUgbm9kZSBhdCBoZWFkXG4gICAgICAgICAgICBpdGVtLnByZXZpb3VzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdGhpcy5faGVhZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQucHJldmlvdXMgPSBpdGVtO1xuICAgICAgICAgICAgdGhpcy5faGVhZCA9IGl0ZW07XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRvdWNoID09PSBUb3VjaC5MYXN0KSB7XG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBpdGVtLm5leHQ7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgICAgICAvLyBVbmxpbmsgdGhlIGl0ZW0uXG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCkge1xuICAgICAgICAgICAgICAgIC8vIG5leHQgbXVzdCBiZSBkZWZpbmVkIHNpbmNlIGl0ZW0gd2FzIG5vdCB0YWlsIGJ1dCBpcyBoZWFkXG4gICAgICAgICAgICAgICAgLy8gU28gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbiBpdGVtIGluIHRoZSBtYXBcbiAgICAgICAgICAgICAgICBuZXh0LnByZXZpb3VzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuX2hlYWQgPSBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQm90aCBuZXh0IGFuZCBwcmV2aW91cyBhcmUgbm90IHVuZGVmaW5lZCBzaW5jZSBpdGVtIHdhcyBuZWl0aGVyIGhlYWQgbm9yIHRhaWwuXG4gICAgICAgICAgICAgICAgbmV4dC5wcmV2aW91cyA9IHByZXZpb3VzO1xuICAgICAgICAgICAgICAgIHByZXZpb3VzLm5leHQgPSBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaXRlbS5wcmV2aW91cyA9IHRoaXMuX3RhaWw7XG4gICAgICAgICAgICB0aGlzLl90YWlsLm5leHQgPSBpdGVtO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW07XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IFtdO1xuICAgICAgICB0aGlzLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGRhdGEucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGZyb21KU09OKGRhdGEpIHtcbiAgICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBkYXRhKSB7XG4gICAgICAgICAgICB0aGlzLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuTGlua2VkTWFwID0gTGlua2VkTWFwO1xuY2xhc3MgTFJVQ2FjaGUgZXh0ZW5kcyBMaW5rZWRNYXAge1xuICAgIGNvbnN0cnVjdG9yKGxpbWl0LCByYXRpbyA9IDEpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fbGltaXQgPSBsaW1pdDtcbiAgICAgICAgdGhpcy5fcmF0aW8gPSBNYXRoLm1pbihNYXRoLm1heCgwLCByYXRpbyksIDEpO1xuICAgIH1cbiAgICBnZXQgbGltaXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9saW1pdDtcbiAgICB9XG4gICAgc2V0IGxpbWl0KGxpbWl0KSB7XG4gICAgICAgIHRoaXMuX2xpbWl0ID0gbGltaXQ7XG4gICAgICAgIHRoaXMuY2hlY2tUcmltKCk7XG4gICAgfVxuICAgIGdldCByYXRpbygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JhdGlvO1xuICAgIH1cbiAgICBzZXQgcmF0aW8ocmF0aW8pIHtcbiAgICAgICAgdGhpcy5fcmF0aW8gPSBNYXRoLm1pbihNYXRoLm1heCgwLCByYXRpbyksIDEpO1xuICAgICAgICB0aGlzLmNoZWNrVHJpbSgpO1xuICAgIH1cbiAgICBnZXQoa2V5LCB0b3VjaCA9IFRvdWNoLkFzTmV3KSB7XG4gICAgICAgIHJldHVybiBzdXBlci5nZXQoa2V5LCB0b3VjaCk7XG4gICAgfVxuICAgIHBlZWsoa2V5KSB7XG4gICAgICAgIHJldHVybiBzdXBlci5nZXQoa2V5LCBUb3VjaC5Ob25lKTtcbiAgICB9XG4gICAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgc3VwZXIuc2V0KGtleSwgdmFsdWUsIFRvdWNoLkxhc3QpO1xuICAgICAgICB0aGlzLmNoZWNrVHJpbSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgY2hlY2tUcmltKCkge1xuICAgICAgICBpZiAodGhpcy5zaXplID4gdGhpcy5fbGltaXQpIHtcbiAgICAgICAgICAgIHRoaXMudHJpbU9sZChNYXRoLnJvdW5kKHRoaXMuX2xpbWl0ICogdGhpcy5fcmF0aW8pKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuTFJVQ2FjaGUgPSBMUlVDYWNoZTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5EaXNwb3NhYmxlID0gdm9pZCAwO1xudmFyIERpc3Bvc2FibGU7XG4oZnVuY3Rpb24gKERpc3Bvc2FibGUpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUoZnVuYykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGlzcG9zZTogZnVuY1xuICAgICAgICB9O1xuICAgIH1cbiAgICBEaXNwb3NhYmxlLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKERpc3Bvc2FibGUgfHwgKGV4cG9ydHMuRGlzcG9zYWJsZSA9IERpc3Bvc2FibGUgPSB7fSkpO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xubGV0IF9yYWw7XG5mdW5jdGlvbiBSQUwoKSB7XG4gICAgaWYgKF9yYWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHJ1bnRpbWUgYWJzdHJhY3Rpb24gbGF5ZXIgaW5zdGFsbGVkYCk7XG4gICAgfVxuICAgIHJldHVybiBfcmFsO1xufVxuKGZ1bmN0aW9uIChSQUwpIHtcbiAgICBmdW5jdGlvbiBpbnN0YWxsKHJhbCkge1xuICAgICAgICBpZiAocmFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gcnVudGltZSBhYnN0cmFjdGlvbiBsYXllciBwcm92aWRlZGApO1xuICAgICAgICB9XG4gICAgICAgIF9yYWwgPSByYWw7XG4gICAgfVxuICAgIFJBTC5pbnN0YWxsID0gaW5zdGFsbDtcbn0pKFJBTCB8fCAoUkFMID0ge30pKTtcbmV4cG9ydHMuZGVmYXVsdCA9IFJBTDtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuRW1pdHRlciA9IGV4cG9ydHMuRXZlbnQgPSB2b2lkIDA7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbnZhciBFdmVudDtcbihmdW5jdGlvbiAoRXZlbnQpIHtcbiAgICBjb25zdCBfZGlzcG9zYWJsZSA9IHsgZGlzcG9zZSgpIHsgfSB9O1xuICAgIEV2ZW50Lk5vbmUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBfZGlzcG9zYWJsZTsgfTtcbn0pKEV2ZW50IHx8IChleHBvcnRzLkV2ZW50ID0gRXZlbnQgPSB7fSkpO1xuY2xhc3MgQ2FsbGJhY2tMaXN0IHtcbiAgICBhZGQoY2FsbGJhY2ssIGNvbnRleHQgPSBudWxsLCBidWNrZXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fY29udGV4dHMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgICAgIHRoaXMuX2NvbnRleHRzLnB1c2goY29udGV4dCk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGJ1Y2tldCkpIHtcbiAgICAgICAgICAgIGJ1Y2tldC5wdXNoKHsgZGlzcG9zZTogKCkgPT4gdGhpcy5yZW1vdmUoY2FsbGJhY2ssIGNvbnRleHQpIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlbW92ZShjYWxsYmFjaywgY29udGV4dCA9IG51bGwpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZm91bmRDYWxsYmFja1dpdGhEaWZmZXJlbnRDb250ZXh0ID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLl9jYWxsYmFja3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jYWxsYmFja3NbaV0gPT09IGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NvbnRleHRzW2ldID09PSBjb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrICYgY29udGV4dCBtYXRjaCA9PiByZW1vdmUgaXRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29udGV4dHMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZENhbGxiYWNrV2l0aERpZmZlcmVudENvbnRleHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZm91bmRDYWxsYmFja1dpdGhEaWZmZXJlbnRDb250ZXh0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1doZW4gYWRkaW5nIGEgbGlzdGVuZXIgd2l0aCBhIGNvbnRleHQsIHlvdSBzaG91bGQgcmVtb3ZlIGl0IHdpdGggdGhlIHNhbWUgY29udGV4dCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGludm9rZSguLi5hcmdzKSB7XG4gICAgICAgIGlmICghdGhpcy5fY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmV0ID0gW10sIGNhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcy5zbGljZSgwKSwgY29udGV4dHMgPSB0aGlzLl9jb250ZXh0cy5zbGljZSgwKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXQucHVzaChjYWxsYmFja3NbaV0uYXBwbHkoY29udGV4dHNbaV0sIGFyZ3MpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS5jb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICAgIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5fY2FsbGJhY2tzIHx8IHRoaXMuX2NhbGxiYWNrcy5sZW5ndGggPT09IDA7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fY29udGV4dHMgPSB1bmRlZmluZWQ7XG4gICAgfVxufVxuY2xhc3MgRW1pdHRlciB7XG4gICAgY29uc3RydWN0b3IoX29wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IF9vcHRpb25zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGb3IgdGhlIHB1YmxpYyB0byBhbGxvdyB0byBzdWJzY3JpYmVcbiAgICAgKiB0byBldmVudHMgZnJvbSB0aGlzIEVtaXR0ZXJcbiAgICAgKi9cbiAgICBnZXQgZXZlbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fZXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50ID0gKGxpc3RlbmVyLCB0aGlzQXJncywgZGlzcG9zYWJsZXMpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2NhbGxiYWNrcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWxsYmFja3MgPSBuZXcgQ2FsbGJhY2tMaXN0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMub25GaXJzdExpc3RlbmVyQWRkICYmIHRoaXMuX2NhbGxiYWNrcy5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy5vbkZpcnN0TGlzdGVuZXJBZGQodGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5hZGQobGlzdGVuZXIsIHRoaXNBcmdzKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlzcG9zYWJsZSBpcyBkaXNwb3NlZCBhZnRlciBlbWl0dGVyIGlzIGRpc3Bvc2VkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5yZW1vdmUobGlzdGVuZXIsIHRoaXNBcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5kaXNwb3NlID0gRW1pdHRlci5fbm9vcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMub25MYXN0TGlzdGVuZXJSZW1vdmUgJiYgdGhpcy5fY2FsbGJhY2tzLmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29wdGlvbnMub25MYXN0TGlzdGVuZXJSZW1vdmUodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRpc3Bvc2FibGVzKSkge1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlcy5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9ldmVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVG8gYmUga2VwdCBwcml2YXRlIHRvIGZpcmUgYW4gZXZlbnQgdG9cbiAgICAgKiBzdWJzY3JpYmVyc1xuICAgICAqL1xuICAgIGZpcmUoZXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NhbGxiYWNrcykge1xuICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzLmludm9rZS5jYWxsKHRoaXMuX2NhbGxiYWNrcywgZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5kaXNwb3NlKCk7XG4gICAgICAgICAgICB0aGlzLl9jYWxsYmFja3MgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLkVtaXR0ZXIgPSBFbWl0dGVyO1xuRW1pdHRlci5fbm9vcCA9IGZ1bmN0aW9uICgpIHsgfTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uVG9rZW4gPSB2b2lkIDA7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbmNvbnN0IElzID0gcmVxdWlyZShcIi4vaXNcIik7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCIuL2V2ZW50c1wiKTtcbnZhciBDYW5jZWxsYXRpb25Ub2tlbjtcbihmdW5jdGlvbiAoQ2FuY2VsbGF0aW9uVG9rZW4pIHtcbiAgICBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGlzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkOiBmYWxzZSxcbiAgICAgICAgb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6IGV2ZW50c18xLkV2ZW50Lk5vbmVcbiAgICB9KTtcbiAgICBDYW5jZWxsYXRpb25Ub2tlbi5DYW5jZWxsZWQgPSBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6IHRydWUsXG4gICAgICAgIG9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkOiBldmVudHNfMS5FdmVudC5Ob25lXG4gICAgfSk7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgKGNhbmRpZGF0ZSA9PT0gQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZVxuICAgICAgICAgICAgfHwgY2FuZGlkYXRlID09PSBDYW5jZWxsYXRpb25Ub2tlbi5DYW5jZWxsZWRcbiAgICAgICAgICAgIHx8IChJcy5ib29sZWFuKGNhbmRpZGF0ZS5pc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkgJiYgISFjYW5kaWRhdGUub25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQpKTtcbiAgICB9XG4gICAgQ2FuY2VsbGF0aW9uVG9rZW4uaXMgPSBpcztcbn0pKENhbmNlbGxhdGlvblRva2VuIHx8IChleHBvcnRzLkNhbmNlbGxhdGlvblRva2VuID0gQ2FuY2VsbGF0aW9uVG9rZW4gPSB7fSkpO1xuY29uc3Qgc2hvcnRjdXRFdmVudCA9IE9iamVjdC5mcmVlemUoZnVuY3Rpb24gKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgY29uc3QgaGFuZGxlID0gKDAsIHJhbF8xLmRlZmF1bHQpKCkudGltZXIuc2V0VGltZW91dChjYWxsYmFjay5iaW5kKGNvbnRleHQpLCAwKTtcbiAgICByZXR1cm4geyBkaXNwb3NlKCkgeyBoYW5kbGUuZGlzcG9zZSgpOyB9IH07XG59KTtcbmNsYXNzIE11dGFibGVUb2tlbiB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX2lzQ2FuY2VsbGVkID0gZmFsc2U7XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9pc0NhbmNlbGxlZCkge1xuICAgICAgICAgICAgdGhpcy5faXNDYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2VtaXR0ZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmZpcmUodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0NhbmNlbGxlZDtcbiAgICB9XG4gICAgZ2V0IG9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKCkge1xuICAgICAgICBpZiAodGhpcy5faXNDYW5jZWxsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBzaG9ydGN1dEV2ZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5fZW1pdHRlcikge1xuICAgICAgICAgICAgdGhpcy5fZW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2VtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLl9lbWl0dGVyKSB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5jbGFzcyBDYW5jZWxsYXRpb25Ub2tlblNvdXJjZSB7XG4gICAgZ2V0IHRva2VuKCkge1xuICAgICAgICBpZiAoIXRoaXMuX3Rva2VuKSB7XG4gICAgICAgICAgICAvLyBiZSBsYXp5IGFuZCBjcmVhdGUgdGhlIHRva2VuIG9ubHkgd2hlblxuICAgICAgICAgICAgLy8gYWN0dWFsbHkgbmVlZGVkXG4gICAgICAgICAgICB0aGlzLl90b2tlbiA9IG5ldyBNdXRhYmxlVG9rZW4oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fdG9rZW47XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl90b2tlbikge1xuICAgICAgICAgICAgLy8gc2F2ZSBhbiBvYmplY3QgYnkgcmV0dXJuaW5nIHRoZSBkZWZhdWx0XG4gICAgICAgICAgICAvLyBjYW5jZWxsZWQgdG9rZW4gd2hlbiBjYW5jZWxsYXRpb24gaGFwcGVuc1xuICAgICAgICAgICAgLy8gYmVmb3JlIHNvbWVvbmUgYXNrcyBmb3IgdGhlIHRva2VuXG4gICAgICAgICAgICB0aGlzLl90b2tlbiA9IENhbmNlbGxhdGlvblRva2VuLkNhbmNlbGxlZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3Rva2VuLmNhbmNlbCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICghdGhpcy5fdG9rZW4pIHtcbiAgICAgICAgICAgIC8vIGVuc3VyZSB0byBpbml0aWFsaXplIHdpdGggYW4gZW1wdHkgdG9rZW4gaWYgd2UgaGFkIG5vbmVcbiAgICAgICAgICAgIHRoaXMuX3Rva2VuID0gQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLl90b2tlbiBpbnN0YW5jZW9mIE11dGFibGVUb2tlbikge1xuICAgICAgICAgICAgLy8gYWN0dWFsbHkgZGlzcG9zZVxuICAgICAgICAgICAgdGhpcy5fdG9rZW4uZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IENhbmNlbGxhdGlvblRva2VuU291cmNlO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3kgPSB2b2lkIDA7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbnZhciBDYW5jZWxsYXRpb25TdGF0ZTtcbihmdW5jdGlvbiAoQ2FuY2VsbGF0aW9uU3RhdGUpIHtcbiAgICBDYW5jZWxsYXRpb25TdGF0ZS5Db250aW51ZSA9IDA7XG4gICAgQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkID0gMTtcbn0pKENhbmNlbGxhdGlvblN0YXRlIHx8IChDYW5jZWxsYXRpb25TdGF0ZSA9IHt9KSk7XG5jbGFzcyBTaGFyZWRBcnJheVNlbmRlclN0cmF0ZWd5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5idWZmZXJzID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICBlbmFibGVDYW5jZWxsYXRpb24ocmVxdWVzdCkge1xuICAgICAgICBpZiAocmVxdWVzdC5pZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBTaGFyZWRBcnJheUJ1ZmZlcig0KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBJbnQzMkFycmF5KGJ1ZmZlciwgMCwgMSk7XG4gICAgICAgIGRhdGFbMF0gPSBDYW5jZWxsYXRpb25TdGF0ZS5Db250aW51ZTtcbiAgICAgICAgdGhpcy5idWZmZXJzLnNldChyZXF1ZXN0LmlkLCBidWZmZXIpO1xuICAgICAgICByZXF1ZXN0LiRjYW5jZWxsYXRpb25EYXRhID0gYnVmZmVyO1xuICAgIH1cbiAgICBhc3luYyBzZW5kQ2FuY2VsbGF0aW9uKF9jb25uLCBpZCkge1xuICAgICAgICBjb25zdCBidWZmZXIgPSB0aGlzLmJ1ZmZlcnMuZ2V0KGlkKTtcbiAgICAgICAgaWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBJbnQzMkFycmF5KGJ1ZmZlciwgMCwgMSk7XG4gICAgICAgIEF0b21pY3Muc3RvcmUoZGF0YSwgMCwgQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkKTtcbiAgICB9XG4gICAgY2xlYW51cChpZCkge1xuICAgICAgICB0aGlzLmJ1ZmZlcnMuZGVsZXRlKGlkKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy5idWZmZXJzLmNsZWFyKCk7XG4gICAgfVxufVxuZXhwb3J0cy5TaGFyZWRBcnJheVNlbmRlclN0cmF0ZWd5ID0gU2hhcmVkQXJyYXlTZW5kZXJTdHJhdGVneTtcbmNsYXNzIFNoYXJlZEFycmF5QnVmZmVyQ2FuY2VsbGF0aW9uVG9rZW4ge1xuICAgIGNvbnN0cnVjdG9yKGJ1ZmZlcikge1xuICAgICAgICB0aGlzLmRhdGEgPSBuZXcgSW50MzJBcnJheShidWZmZXIsIDAsIDEpO1xuICAgIH1cbiAgICBnZXQgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHJldHVybiBBdG9taWNzLmxvYWQodGhpcy5kYXRhLCAwKSA9PT0gQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkO1xuICAgIH1cbiAgICBnZXQgb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuY2VsbGF0aW9uIG92ZXIgU2hhcmVkQXJyYXlCdWZmZXIgZG9lc24ndCBzdXBwb3J0IGNhbmNlbGxhdGlvbiBldmVudHNgKTtcbiAgICB9XG59XG5jbGFzcyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuU291cmNlIHtcbiAgICBjb25zdHJ1Y3RvcihidWZmZXIpIHtcbiAgICAgICAgdGhpcy50b2tlbiA9IG5ldyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuKGJ1ZmZlcik7XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICB9XG59XG5jbGFzcyBTaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmtpbmQgPSAncmVxdWVzdCc7XG4gICAgfVxuICAgIGNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKHJlcXVlc3QpIHtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gcmVxdWVzdC4kY2FuY2VsbGF0aW9uRGF0YTtcbiAgICAgICAgaWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuU291cmNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuU291cmNlKGJ1ZmZlcik7XG4gICAgfVxufVxuZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBTaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3k7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNlbWFwaG9yZSA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY2xhc3MgU2VtYXBob3JlIHtcbiAgICBjb25zdHJ1Y3RvcihjYXBhY2l0eSA9IDEpIHtcbiAgICAgICAgaWYgKGNhcGFjaXR5IDw9IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FwYWNpdHkgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NhcGFjaXR5ID0gY2FwYWNpdHk7XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IDA7XG4gICAgICAgIHRoaXMuX3dhaXRpbmcgPSBbXTtcbiAgICB9XG4gICAgbG9jayh0aHVuaykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fd2FpdGluZy5wdXNoKHsgdGh1bmssIHJlc29sdmUsIHJlamVjdCB9KTtcbiAgICAgICAgICAgIHRoaXMucnVuTmV4dCgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0IGFjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTtcbiAgICB9XG4gICAgcnVuTmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dhaXRpbmcubGVuZ3RoID09PSAwIHx8IHRoaXMuX2FjdGl2ZSA9PT0gdGhpcy5fY2FwYWNpdHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS50aW1lci5zZXRJbW1lZGlhdGUoKCkgPT4gdGhpcy5kb1J1bk5leHQoKSk7XG4gICAgfVxuICAgIGRvUnVuTmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dhaXRpbmcubGVuZ3RoID09PSAwIHx8IHRoaXMuX2FjdGl2ZSA9PT0gdGhpcy5fY2FwYWNpdHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5fd2FpdGluZy5zaGlmdCgpO1xuICAgICAgICB0aGlzLl9hY3RpdmUrKztcbiAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZSA+IHRoaXMuX2NhcGFjaXR5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRvIG1hbnkgdGh1bmtzIGFjdGl2ZWApO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXh0LnRodW5rKCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC50aGVuKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5yZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5OZXh0KCk7XG4gICAgICAgICAgICAgICAgfSwgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5yZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5OZXh0KCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICBuZXh0LnJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1bk5leHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgIG5leHQucmVqZWN0KGVycik7XG4gICAgICAgICAgICB0aGlzLnJ1bk5leHQoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuU2VtYXBob3JlID0gU2VtYXBob3JlO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXIgPSBleHBvcnRzLkFic3RyYWN0TWVzc2FnZVJlYWRlciA9IGV4cG9ydHMuTWVzc2FnZVJlYWRlciA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IGV2ZW50c18xID0gcmVxdWlyZShcIi4vZXZlbnRzXCIpO1xuY29uc3Qgc2VtYXBob3JlXzEgPSByZXF1aXJlKFwiLi9zZW1hcGhvcmVcIik7XG52YXIgTWVzc2FnZVJlYWRlcjtcbihmdW5jdGlvbiAoTWVzc2FnZVJlYWRlcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5saXN0ZW4pICYmIElzLmZ1bmMoY2FuZGlkYXRlLmRpc3Bvc2UpICYmXG4gICAgICAgICAgICBJcy5mdW5jKGNhbmRpZGF0ZS5vbkVycm9yKSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5vbkNsb3NlKSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5vblBhcnRpYWxNZXNzYWdlKTtcbiAgICB9XG4gICAgTWVzc2FnZVJlYWRlci5pcyA9IGlzO1xufSkoTWVzc2FnZVJlYWRlciB8fCAoZXhwb3J0cy5NZXNzYWdlUmVhZGVyID0gTWVzc2FnZVJlYWRlciA9IHt9KSk7XG5jbGFzcyBBYnN0cmFjdE1lc3NhZ2VSZWFkZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZUVtaXR0ZXIgPSBuZXcgZXZlbnRzXzEuRW1pdHRlcigpO1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlci5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgZ2V0IG9uRXJyb3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVycm9yRW1pdHRlci5ldmVudDtcbiAgICB9XG4gICAgZmlyZUVycm9yKGVycm9yKSB7XG4gICAgICAgIHRoaXMuZXJyb3JFbWl0dGVyLmZpcmUodGhpcy5hc0Vycm9yKGVycm9yKSk7XG4gICAgfVxuICAgIGdldCBvbkNsb3NlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9zZUVtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGZpcmVDbG9zZSgpIHtcbiAgICAgICAgdGhpcy5jbG9zZUVtaXR0ZXIuZmlyZSh1bmRlZmluZWQpO1xuICAgIH1cbiAgICBnZXQgb25QYXJ0aWFsTWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFydGlhbE1lc3NhZ2VFbWl0dGVyLmV2ZW50O1xuICAgIH1cbiAgICBmaXJlUGFydGlhbE1lc3NhZ2UoaW5mbykge1xuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlRW1pdHRlci5maXJlKGluZm8pO1xuICAgIH1cbiAgICBhc0Vycm9yKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKGBSZWFkZXIgcmVjZWl2ZWQgZXJyb3IuIFJlYXNvbjogJHtJcy5zdHJpbmcoZXJyb3IubWVzc2FnZSkgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24nfWApO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VSZWFkZXIgPSBBYnN0cmFjdE1lc3NhZ2VSZWFkZXI7XG52YXIgUmVzb2x2ZWRNZXNzYWdlUmVhZGVyT3B0aW9ucztcbihmdW5jdGlvbiAoUmVzb2x2ZWRNZXNzYWdlUmVhZGVyT3B0aW9ucykge1xuICAgIGZ1bmN0aW9uIGZyb21PcHRpb25zKG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IGNoYXJzZXQ7XG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIGxldCBjb250ZW50RGVjb2RlcjtcbiAgICAgICAgY29uc3QgY29udGVudERlY29kZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICBsZXQgY29udGVudFR5cGVEZWNvZGVyO1xuICAgICAgICBjb25zdCBjb250ZW50VHlwZURlY29kZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY2hhcnNldCA9IG9wdGlvbnMgPz8gJ3V0Zi04JztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNoYXJzZXQgPSBvcHRpb25zLmNoYXJzZXQgPz8gJ3V0Zi04JztcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnREZWNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50RGVjb2RlciA9IG9wdGlvbnMuY29udGVudERlY29kZXI7XG4gICAgICAgICAgICAgICAgY29udGVudERlY29kZXJzLnNldChjb250ZW50RGVjb2Rlci5uYW1lLCBjb250ZW50RGVjb2Rlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5jb250ZW50RGVjb2RlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGVjb2RlciBvZiBvcHRpb25zLmNvbnRlbnREZWNvZGVycykge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50RGVjb2RlcnMuc2V0KGRlY29kZXIubmFtZSwgZGVjb2Rlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuY29udGVudFR5cGVEZWNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXIgPSBvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcjtcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXJzLnNldChjb250ZW50VHlwZURlY29kZXIubmFtZSwgY29udGVudFR5cGVEZWNvZGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGVjb2RlciBvZiBvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGVEZWNvZGVycy5zZXQoZGVjb2Rlci5uYW1lLCBkZWNvZGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnRlbnRUeXBlRGVjb2RlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXIgPSAoMCwgcmFsXzEuZGVmYXVsdCkoKS5hcHBsaWNhdGlvbkpzb24uZGVjb2RlcjtcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlRGVjb2RlcnMuc2V0KGNvbnRlbnRUeXBlRGVjb2Rlci5uYW1lLCBjb250ZW50VHlwZURlY29kZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGNoYXJzZXQsIGNvbnRlbnREZWNvZGVyLCBjb250ZW50RGVjb2RlcnMsIGNvbnRlbnRUeXBlRGVjb2RlciwgY29udGVudFR5cGVEZWNvZGVycyB9O1xuICAgIH1cbiAgICBSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zLmZyb21PcHRpb25zID0gZnJvbU9wdGlvbnM7XG59KShSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zIHx8IChSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zID0ge30pKTtcbmNsYXNzIFJlYWRhYmxlU3RyZWFtTWVzc2FnZVJlYWRlciBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVJlYWRlciB7XG4gICAgY29uc3RydWN0b3IocmVhZGFibGUsIG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZSA9IHJlYWRhYmxlO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zLmZyb21PcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmJ1ZmZlciA9ICgwLCByYWxfMS5kZWZhdWx0KSgpLm1lc3NhZ2VCdWZmZXIuY3JlYXRlKHRoaXMub3B0aW9ucy5jaGFyc2V0KTtcbiAgICAgICAgdGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0ID0gMTAwMDA7XG4gICAgICAgIHRoaXMubmV4dE1lc3NhZ2VMZW5ndGggPSAtMTtcbiAgICAgICAgdGhpcy5tZXNzYWdlVG9rZW4gPSAwO1xuICAgICAgICB0aGlzLnJlYWRTZW1hcGhvcmUgPSBuZXcgc2VtYXBob3JlXzEuU2VtYXBob3JlKDEpO1xuICAgIH1cbiAgICBzZXQgcGFydGlhbE1lc3NhZ2VUaW1lb3V0KHRpbWVvdXQpIHtcbiAgICAgICAgdGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0ID0gdGltZW91dDtcbiAgICB9XG4gICAgZ2V0IHBhcnRpYWxNZXNzYWdlVGltZW91dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dDtcbiAgICB9XG4gICAgbGlzdGVuKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMubmV4dE1lc3NhZ2VMZW5ndGggPSAtMTtcbiAgICAgICAgdGhpcy5tZXNzYWdlVG9rZW4gPSAwO1xuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlVGltZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5yZWFkYWJsZS5vbkRhdGEoKGRhdGEpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25EYXRhKGRhdGEpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZS5vbkVycm9yKChlcnJvcikgPT4gdGhpcy5maXJlRXJyb3IoZXJyb3IpKTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZS5vbkNsb3NlKCgpID0+IHRoaXMuZmlyZUNsb3NlKCkpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBvbkRhdGEoZGF0YSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5idWZmZXIuYXBwZW5kKGRhdGEpO1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IHRoaXMuYnVmZmVyLnRyeVJlYWRIZWFkZXJzKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50TGVuZ3RoID0gaGVhZGVycy5nZXQoJ2NvbnRlbnQtbGVuZ3RoJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY29udGVudExlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IobmV3IEVycm9yKGBIZWFkZXIgbXVzdCBwcm92aWRlIGEgQ29udGVudC1MZW5ndGggcHJvcGVydHkuXFxuJHtKU09OLnN0cmluZ2lmeShPYmplY3QuZnJvbUVudHJpZXMoaGVhZGVycykpfWApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsZW5ndGggPSBwYXJzZUludChjb250ZW50TGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKGxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKG5ldyBFcnJvcihgQ29udGVudC1MZW5ndGggdmFsdWUgbXVzdCBiZSBhIG51bWJlci4gR290ICR7Y29udGVudExlbmd0aH1gKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IHRoaXMuYnVmZmVyLnRyeVJlYWRCb2R5KHRoaXMubmV4dE1lc3NhZ2VMZW5ndGgpO1xuICAgICAgICAgICAgICAgIGlmIChib2R5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLyoqIFdlIGhhdmVuJ3QgcmVjZWl2ZWQgdGhlIGZ1bGwgbWVzc2FnZSB5ZXQuICovXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0UGFydGlhbE1lc3NhZ2VUaW1lcigpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJQYXJ0aWFsTWVzc2FnZVRpbWVyKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9IC0xO1xuICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHdlIGNvbnZlcnQgb25lIHJlY2VpdmVkIG1lc3NhZ2UgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAgICAgLy8gb3RoZXIuIE90aGVyd2lzZSBpdCBjb3VsZCBoYXBwZW4gdGhhdCBhIGRlY29kaW5nIG9mIGEgc2Vjb25kXG4gICAgICAgICAgICAgICAgLy8gc21hbGxlciBtZXNzYWdlIGZpbmlzaGVkIGJlZm9yZSB0aGUgZGVjb2Rpbmcgb2YgYSBmaXJzdCBsYXJnZXJcbiAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIGFuZCB0aGVuIHdlIHdvdWxkIGRlbGl2ZXIgdGhlIHNlY29uZCBtZXNzYWdlIGZpcnN0LlxuICAgICAgICAgICAgICAgIHRoaXMucmVhZFNlbWFwaG9yZS5sb2NrKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnl0ZXMgPSB0aGlzLm9wdGlvbnMuY29udGVudERlY29kZXIgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBhd2FpdCB0aGlzLm9wdGlvbnMuY29udGVudERlY29kZXIuZGVjb2RlKGJvZHkpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGJvZHk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBhd2FpdCB0aGlzLm9wdGlvbnMuY29udGVudFR5cGVEZWNvZGVyLmRlY29kZShieXRlcywgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjayhtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNsZWFyUGFydGlhbE1lc3NhZ2VUaW1lcigpIHtcbiAgICAgICAgaWYgKHRoaXMucGFydGlhbE1lc3NhZ2VUaW1lcikge1xuICAgICAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZVRpbWVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRoaXMucGFydGlhbE1lc3NhZ2VUaW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRQYXJ0aWFsTWVzc2FnZVRpbWVyKCkge1xuICAgICAgICB0aGlzLmNsZWFyUGFydGlhbE1lc3NhZ2VUaW1lcigpO1xuICAgICAgICBpZiAodGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0IDw9IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlVGltZXIgPSAoMCwgcmFsXzEuZGVmYXVsdCkoKS50aW1lci5zZXRUaW1lb3V0KCh0b2tlbiwgdGltZW91dCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZVRpbWVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRva2VuID09PSB0aGlzLm1lc3NhZ2VUb2tlbikge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZVBhcnRpYWxNZXNzYWdlKHsgbWVzc2FnZVRva2VuOiB0b2tlbiwgd2FpdGluZ1RpbWU6IHRpbWVvdXQgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRQYXJ0aWFsTWVzc2FnZVRpbWVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dCwgdGhpcy5tZXNzYWdlVG9rZW4sIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dCk7XG4gICAgfVxufVxuZXhwb3J0cy5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXIgPSBSZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLldyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLkFic3RyYWN0TWVzc2FnZVdyaXRlciA9IGV4cG9ydHMuTWVzc2FnZVdyaXRlciA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IHNlbWFwaG9yZV8xID0gcmVxdWlyZShcIi4vc2VtYXBob3JlXCIpO1xuY29uc3QgZXZlbnRzXzEgPSByZXF1aXJlKFwiLi9ldmVudHNcIik7XG5jb25zdCBDb250ZW50TGVuZ3RoID0gJ0NvbnRlbnQtTGVuZ3RoOiAnO1xuY29uc3QgQ1JMRiA9ICdcXHJcXG4nO1xudmFyIE1lc3NhZ2VXcml0ZXI7XG4oZnVuY3Rpb24gKE1lc3NhZ2VXcml0ZXIpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgSXMuZnVuYyhjYW5kaWRhdGUuZGlzcG9zZSkgJiYgSXMuZnVuYyhjYW5kaWRhdGUub25DbG9zZSkgJiZcbiAgICAgICAgICAgIElzLmZ1bmMoY2FuZGlkYXRlLm9uRXJyb3IpICYmIElzLmZ1bmMoY2FuZGlkYXRlLndyaXRlKTtcbiAgICB9XG4gICAgTWVzc2FnZVdyaXRlci5pcyA9IGlzO1xufSkoTWVzc2FnZVdyaXRlciB8fCAoZXhwb3J0cy5NZXNzYWdlV3JpdGVyID0gTWVzc2FnZVdyaXRlciA9IHt9KSk7XG5jbGFzcyBBYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy5lcnJvckVtaXR0ZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLmNsb3NlRW1pdHRlci5kaXNwb3NlKCk7XG4gICAgfVxuICAgIGdldCBvbkVycm9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lcnJvckVtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGZpcmVFcnJvcihlcnJvciwgbWVzc2FnZSwgY291bnQpIHtcbiAgICAgICAgdGhpcy5lcnJvckVtaXR0ZXIuZmlyZShbdGhpcy5hc0Vycm9yKGVycm9yKSwgbWVzc2FnZSwgY291bnRdKTtcbiAgICB9XG4gICAgZ2V0IG9uQ2xvc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb3NlRW1pdHRlci5ldmVudDtcbiAgICB9XG4gICAgZmlyZUNsb3NlKCkge1xuICAgICAgICB0aGlzLmNsb3NlRW1pdHRlci5maXJlKHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIGFzRXJyb3IoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoYFdyaXRlciByZWNlaXZlZCBlcnJvci4gUmVhc29uOiAke0lzLnN0cmluZyhlcnJvci5tZXNzYWdlKSA/IGVycm9yLm1lc3NhZ2UgOiAndW5rbm93bid9YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLkFic3RyYWN0TWVzc2FnZVdyaXRlciA9IEFic3RyYWN0TWVzc2FnZVdyaXRlcjtcbnZhciBSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zO1xuKGZ1bmN0aW9uIChSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zKSB7XG4gICAgZnVuY3Rpb24gZnJvbU9wdGlvbnMob3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHsgY2hhcnNldDogb3B0aW9ucyA/PyAndXRmLTgnLCBjb250ZW50VHlwZUVuY29kZXI6ICgwLCByYWxfMS5kZWZhdWx0KSgpLmFwcGxpY2F0aW9uSnNvbi5lbmNvZGVyIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4geyBjaGFyc2V0OiBvcHRpb25zLmNoYXJzZXQgPz8gJ3V0Zi04JywgY29udGVudEVuY29kZXI6IG9wdGlvbnMuY29udGVudEVuY29kZXIsIGNvbnRlbnRUeXBlRW5jb2Rlcjogb3B0aW9ucy5jb250ZW50VHlwZUVuY29kZXIgPz8gKDAsIHJhbF8xLmRlZmF1bHQpKCkuYXBwbGljYXRpb25Kc29uLmVuY29kZXIgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zLmZyb21PcHRpb25zID0gZnJvbU9wdGlvbnM7XG59KShSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zIHx8IChSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zID0ge30pKTtcbmNsYXNzIFdyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKHdyaXRhYmxlLCBvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMud3JpdGFibGUgPSB3cml0YWJsZTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gUmVzb2x2ZWRNZXNzYWdlV3JpdGVyT3B0aW9ucy5mcm9tT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50ID0gMDtcbiAgICAgICAgdGhpcy53cml0ZVNlbWFwaG9yZSA9IG5ldyBzZW1hcGhvcmVfMS5TZW1hcGhvcmUoMSk7XG4gICAgICAgIHRoaXMud3JpdGFibGUub25FcnJvcigoZXJyb3IpID0+IHRoaXMuZmlyZUVycm9yKGVycm9yKSk7XG4gICAgICAgIHRoaXMud3JpdGFibGUub25DbG9zZSgoKSA9PiB0aGlzLmZpcmVDbG9zZSgpKTtcbiAgICB9XG4gICAgYXN5bmMgd3JpdGUobXNnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndyaXRlU2VtYXBob3JlLmxvY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHRoaXMub3B0aW9ucy5jb250ZW50VHlwZUVuY29kZXIuZW5jb2RlKG1zZywgdGhpcy5vcHRpb25zKS50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNvbnRlbnRFbmNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jb250ZW50RW5jb2Rlci5lbmNvZGUoYnVmZmVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZC50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJzID0gW107XG4gICAgICAgICAgICAgICAgaGVhZGVycy5wdXNoKENvbnRlbnRMZW5ndGgsIGJ1ZmZlci5ieXRlTGVuZ3RoLnRvU3RyaW5nKCksIENSTEYpO1xuICAgICAgICAgICAgICAgIGhlYWRlcnMucHVzaChDUkxGKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kb1dyaXRlKG1zZywgaGVhZGVycywgYnVmZmVyKTtcbiAgICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgZG9Xcml0ZShtc2csIGhlYWRlcnMsIGRhdGEpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMud3JpdGFibGUud3JpdGUoaGVhZGVycy5qb2luKCcnKSwgJ2FzY2lpJyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy53cml0YWJsZS53cml0ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IsIG1zZyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZUVycm9yKGVycm9yLCBtc2cpIHtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50Kys7XG4gICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yLCBtc2csIHRoaXMuZXJyb3JDb3VudCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICAgICAgdGhpcy53cml0YWJsZS5lbmQoKTtcbiAgICB9XG59XG5leHBvcnRzLldyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgPSBXcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkFic3RyYWN0TWVzc2FnZUJ1ZmZlciA9IHZvaWQgMDtcbmNvbnN0IENSID0gMTM7XG5jb25zdCBMRiA9IDEwO1xuY29uc3QgQ1JMRiA9ICdcXHJcXG4nO1xuY2xhc3MgQWJzdHJhY3RNZXNzYWdlQnVmZmVyIHtcbiAgICBjb25zdHJ1Y3RvcihlbmNvZGluZyA9ICd1dGYtOCcpIHtcbiAgICAgICAgdGhpcy5fZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgICAgICAgdGhpcy5fY2h1bmtzID0gW107XG4gICAgICAgIHRoaXMuX3RvdGFsTGVuZ3RoID0gMDtcbiAgICB9XG4gICAgZ2V0IGVuY29kaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW5jb2Rpbmc7XG4gICAgfVxuICAgIGFwcGVuZChjaHVuaykge1xuICAgICAgICBjb25zdCB0b0FwcGVuZCA9IHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZycgPyB0aGlzLmZyb21TdHJpbmcoY2h1bmssIHRoaXMuX2VuY29kaW5nKSA6IGNodW5rO1xuICAgICAgICB0aGlzLl9jaHVua3MucHVzaCh0b0FwcGVuZCk7XG4gICAgICAgIHRoaXMuX3RvdGFsTGVuZ3RoICs9IHRvQXBwZW5kLmJ5dGVMZW5ndGg7XG4gICAgfVxuICAgIHRyeVJlYWRIZWFkZXJzKGxvd2VyQ2FzZUtleXMgPSBmYWxzZSkge1xuICAgICAgICBpZiAodGhpcy5fY2h1bmtzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3RhdGUgPSAwO1xuICAgICAgICBsZXQgY2h1bmtJbmRleCA9IDA7XG4gICAgICAgIGxldCBvZmZzZXQgPSAwO1xuICAgICAgICBsZXQgY2h1bmtCeXRlc1JlYWQgPSAwO1xuICAgICAgICByb3c6IHdoaWxlIChjaHVua0luZGV4IDwgdGhpcy5fY2h1bmtzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgY2h1bmsgPSB0aGlzLl9jaHVua3NbY2h1bmtJbmRleF07XG4gICAgICAgICAgICBvZmZzZXQgPSAwO1xuICAgICAgICAgICAgY29sdW1uOiB3aGlsZSAob2Zmc2V0IDwgY2h1bmsubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjaHVua1tvZmZzZXRdO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDUjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIExGOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gNDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHJvdztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjaHVua0J5dGVzUmVhZCArPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgY2h1bmtJbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZSAhPT0gNCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgYnVmZmVyIGNvbnRhaW5zIHRoZSB0d28gQ1JMRiBhdCB0aGUgZW5kLiBTbyB3ZSB3aWxsXG4gICAgICAgIC8vIGhhdmUgdHdvIGVtcHR5IGxpbmVzIGFmdGVyIHRoZSBzcGxpdCBhdCB0aGUgZW5kIGFzIHdlbGwuXG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuX3JlYWQoY2h1bmtCeXRlc1JlYWQgKyBvZmZzZXQpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwKCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLnRvU3RyaW5nKGJ1ZmZlciwgJ2FzY2lpJykuc3BsaXQoQ1JMRik7XG4gICAgICAgIGlmIChoZWFkZXJzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXJzLmxlbmd0aCAtIDI7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaGVhZGVyID0gaGVhZGVyc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gaGVhZGVyLmluZGV4T2YoJzonKTtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1lc3NhZ2UgaGVhZGVyIG11c3Qgc2VwYXJhdGUga2V5IGFuZCB2YWx1ZSB1c2luZyAnOidcXG4ke2hlYWRlcn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGhlYWRlci5zdWJzdHIoMCwgaW5kZXgpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBoZWFkZXIuc3Vic3RyKGluZGV4ICsgMSkudHJpbSgpO1xuICAgICAgICAgICAgcmVzdWx0LnNldChsb3dlckNhc2VLZXlzID8ga2V5LnRvTG93ZXJDYXNlKCkgOiBrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICB0cnlSZWFkQm9keShsZW5ndGgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3RvdGFsTGVuZ3RoIDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkKGxlbmd0aCk7XG4gICAgfVxuICAgIGdldCBudW1iZXJPZkJ5dGVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdG90YWxMZW5ndGg7XG4gICAgfVxuICAgIF9yZWFkKGJ5dGVDb3VudCkge1xuICAgICAgICBpZiAoYnl0ZUNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbXB0eUJ1ZmZlcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChieXRlQ291bnQgPiB0aGlzLl90b3RhbExlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVhZCBzbyBtYW55IGJ5dGVzIWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jaHVua3NbMF0uYnl0ZUxlbmd0aCA9PT0gYnl0ZUNvdW50KSB7XG4gICAgICAgICAgICAvLyBzdXBlciBmYXN0IHBhdGgsIHByZWNpc2VseSBmaXJzdCBjaHVuayBtdXN0IGJlIHJldHVybmVkXG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1swXTtcbiAgICAgICAgICAgIHRoaXMuX2NodW5rcy5zaGlmdCgpO1xuICAgICAgICAgICAgdGhpcy5fdG90YWxMZW5ndGggLT0gYnl0ZUNvdW50O1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXNOYXRpdmUoY2h1bmspO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jaHVua3NbMF0uYnl0ZUxlbmd0aCA+IGJ5dGVDb3VudCkge1xuICAgICAgICAgICAgLy8gZmFzdCBwYXRoLCB0aGUgcmVhZGluZyBpcyBlbnRpcmVseSB3aXRoaW4gdGhlIGZpcnN0IGNodW5rXG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1swXTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuYXNOYXRpdmUoY2h1bmssIGJ5dGVDb3VudCk7XG4gICAgICAgICAgICB0aGlzLl9jaHVua3NbMF0gPSBjaHVuay5zbGljZShieXRlQ291bnQpO1xuICAgICAgICAgICAgdGhpcy5fdG90YWxMZW5ndGggLT0gYnl0ZUNvdW50O1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmFsbG9jTmF0aXZlKGJ5dGVDb3VudCk7XG4gICAgICAgIGxldCByZXN1bHRPZmZzZXQgPSAwO1xuICAgICAgICBsZXQgY2h1bmtJbmRleCA9IDA7XG4gICAgICAgIHdoaWxlIChieXRlQ291bnQgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1tjaHVua0luZGV4XTtcbiAgICAgICAgICAgIGlmIChjaHVuay5ieXRlTGVuZ3RoID4gYnl0ZUNvdW50KSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBjaHVuayB3aWxsIHN1cnZpdmVcbiAgICAgICAgICAgICAgICBjb25zdCBjaHVua1BhcnQgPSBjaHVuay5zbGljZSgwLCBieXRlQ291bnQpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5zZXQoY2h1bmtQYXJ0LCByZXN1bHRPZmZzZXQpO1xuICAgICAgICAgICAgICAgIHJlc3VsdE9mZnNldCArPSBieXRlQ291bnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2h1bmtzW2NodW5rSW5kZXhdID0gY2h1bmsuc2xpY2UoYnl0ZUNvdW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLl90b3RhbExlbmd0aCAtPSBieXRlQ291bnQ7XG4gICAgICAgICAgICAgICAgYnl0ZUNvdW50IC09IGJ5dGVDb3VudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHRoaXMgY2h1bmsgd2lsbCBiZSBlbnRpcmVseSByZWFkXG4gICAgICAgICAgICAgICAgcmVzdWx0LnNldChjaHVuaywgcmVzdWx0T2Zmc2V0KTtcbiAgICAgICAgICAgICAgICByZXN1bHRPZmZzZXQgKz0gY2h1bmsuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgICAgICB0aGlzLl9jaHVua3Muc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl90b3RhbExlbmd0aCAtPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgICAgIGJ5dGVDb3VudCAtPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VCdWZmZXIgPSBBYnN0cmFjdE1lc3NhZ2VCdWZmZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uID0gZXhwb3J0cy5Db25uZWN0aW9uT3B0aW9ucyA9IGV4cG9ydHMuTWVzc2FnZVN0cmF0ZWd5ID0gZXhwb3J0cy5DYW5jZWxsYXRpb25TdHJhdGVneSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gZXhwb3J0cy5JZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IGV4cG9ydHMuQ29ubmVjdGlvbkVycm9yID0gZXhwb3J0cy5Db25uZWN0aW9uRXJyb3JzID0gZXhwb3J0cy5Mb2dUcmFjZU5vdGlmaWNhdGlvbiA9IGV4cG9ydHMuU2V0VHJhY2VOb3RpZmljYXRpb24gPSBleHBvcnRzLlRyYWNlRm9ybWF0ID0gZXhwb3J0cy5UcmFjZVZhbHVlcyA9IGV4cG9ydHMuVHJhY2UgPSBleHBvcnRzLk51bGxMb2dnZXIgPSBleHBvcnRzLlByb2dyZXNzVHlwZSA9IGV4cG9ydHMuUHJvZ3Jlc3NUb2tlbiA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IG1lc3NhZ2VzXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlc1wiKTtcbmNvbnN0IGxpbmtlZE1hcF8xID0gcmVxdWlyZShcIi4vbGlua2VkTWFwXCIpO1xuY29uc3QgZXZlbnRzXzEgPSByZXF1aXJlKFwiLi9ldmVudHNcIik7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbnZhciBDYW5jZWxOb3RpZmljYXRpb247XG4oZnVuY3Rpb24gKENhbmNlbE5vdGlmaWNhdGlvbikge1xuICAgIENhbmNlbE5vdGlmaWNhdGlvbi50eXBlID0gbmV3IG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZSgnJC9jYW5jZWxSZXF1ZXN0Jyk7XG59KShDYW5jZWxOb3RpZmljYXRpb24gfHwgKENhbmNlbE5vdGlmaWNhdGlvbiA9IHt9KSk7XG52YXIgUHJvZ3Jlc3NUb2tlbjtcbihmdW5jdGlvbiAoUHJvZ3Jlc3NUb2tlbikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG4gICAgfVxuICAgIFByb2dyZXNzVG9rZW4uaXMgPSBpcztcbn0pKFByb2dyZXNzVG9rZW4gfHwgKGV4cG9ydHMuUHJvZ3Jlc3NUb2tlbiA9IFByb2dyZXNzVG9rZW4gPSB7fSkpO1xudmFyIFByb2dyZXNzTm90aWZpY2F0aW9uO1xuKGZ1bmN0aW9uIChQcm9ncmVzc05vdGlmaWNhdGlvbikge1xuICAgIFByb2dyZXNzTm90aWZpY2F0aW9uLnR5cGUgPSBuZXcgbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlKCckL3Byb2dyZXNzJyk7XG59KShQcm9ncmVzc05vdGlmaWNhdGlvbiB8fCAoUHJvZ3Jlc3NOb3RpZmljYXRpb24gPSB7fSkpO1xuY2xhc3MgUHJvZ3Jlc3NUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICB9XG59XG5leHBvcnRzLlByb2dyZXNzVHlwZSA9IFByb2dyZXNzVHlwZTtcbnZhciBTdGFyUmVxdWVzdEhhbmRsZXI7XG4oZnVuY3Rpb24gKFN0YXJSZXF1ZXN0SGFuZGxlcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBJcy5mdW5jKHZhbHVlKTtcbiAgICB9XG4gICAgU3RhclJlcXVlc3RIYW5kbGVyLmlzID0gaXM7XG59KShTdGFyUmVxdWVzdEhhbmRsZXIgfHwgKFN0YXJSZXF1ZXN0SGFuZGxlciA9IHt9KSk7XG5leHBvcnRzLk51bGxMb2dnZXIgPSBPYmplY3QuZnJlZXplKHtcbiAgICBlcnJvcjogKCkgPT4geyB9LFxuICAgIHdhcm46ICgpID0+IHsgfSxcbiAgICBpbmZvOiAoKSA9PiB7IH0sXG4gICAgbG9nOiAoKSA9PiB7IH1cbn0pO1xudmFyIFRyYWNlO1xuKGZ1bmN0aW9uIChUcmFjZSkge1xuICAgIFRyYWNlW1RyYWNlW1wiT2ZmXCJdID0gMF0gPSBcIk9mZlwiO1xuICAgIFRyYWNlW1RyYWNlW1wiTWVzc2FnZXNcIl0gPSAxXSA9IFwiTWVzc2FnZXNcIjtcbiAgICBUcmFjZVtUcmFjZVtcIkNvbXBhY3RcIl0gPSAyXSA9IFwiQ29tcGFjdFwiO1xuICAgIFRyYWNlW1RyYWNlW1wiVmVyYm9zZVwiXSA9IDNdID0gXCJWZXJib3NlXCI7XG59KShUcmFjZSB8fCAoZXhwb3J0cy5UcmFjZSA9IFRyYWNlID0ge30pKTtcbnZhciBUcmFjZVZhbHVlcztcbihmdW5jdGlvbiAoVHJhY2VWYWx1ZXMpIHtcbiAgICAvKipcbiAgICAgKiBUdXJuIHRyYWNpbmcgb2ZmLlxuICAgICAqL1xuICAgIFRyYWNlVmFsdWVzLk9mZiA9ICdvZmYnO1xuICAgIC8qKlxuICAgICAqIFRyYWNlIG1lc3NhZ2VzIG9ubHkuXG4gICAgICovXG4gICAgVHJhY2VWYWx1ZXMuTWVzc2FnZXMgPSAnbWVzc2FnZXMnO1xuICAgIC8qKlxuICAgICAqIENvbXBhY3QgbWVzc2FnZSB0cmFjaW5nLlxuICAgICAqL1xuICAgIFRyYWNlVmFsdWVzLkNvbXBhY3QgPSAnY29tcGFjdCc7XG4gICAgLyoqXG4gICAgICogVmVyYm9zZSBtZXNzYWdlIHRyYWNpbmcuXG4gICAgICovXG4gICAgVHJhY2VWYWx1ZXMuVmVyYm9zZSA9ICd2ZXJib3NlJztcbn0pKFRyYWNlVmFsdWVzIHx8IChleHBvcnRzLlRyYWNlVmFsdWVzID0gVHJhY2VWYWx1ZXMgPSB7fSkpO1xuKGZ1bmN0aW9uIChUcmFjZSkge1xuICAgIGZ1bmN0aW9uIGZyb21TdHJpbmcodmFsdWUpIHtcbiAgICAgICAgaWYgKCFJcy5zdHJpbmcodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gVHJhY2UuT2ZmO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSAnb2ZmJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gVHJhY2UuT2ZmO1xuICAgICAgICAgICAgY2FzZSAnbWVzc2FnZXMnOlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5NZXNzYWdlcztcbiAgICAgICAgICAgIGNhc2UgJ2NvbXBhY3QnOlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5Db21wYWN0O1xuICAgICAgICAgICAgY2FzZSAndmVyYm9zZSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFRyYWNlLlZlcmJvc2U7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5PZmY7XG4gICAgICAgIH1cbiAgICB9XG4gICAgVHJhY2UuZnJvbVN0cmluZyA9IGZyb21TdHJpbmc7XG4gICAgZnVuY3Rpb24gdG9TdHJpbmcodmFsdWUpIHtcbiAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5PZmY6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdvZmYnO1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5NZXNzYWdlczpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ21lc3NhZ2VzJztcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuQ29tcGFjdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2NvbXBhY3QnO1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5WZXJib3NlOlxuICAgICAgICAgICAgICAgIHJldHVybiAndmVyYm9zZSc7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAnb2ZmJztcbiAgICAgICAgfVxuICAgIH1cbiAgICBUcmFjZS50b1N0cmluZyA9IHRvU3RyaW5nO1xufSkoVHJhY2UgfHwgKGV4cG9ydHMuVHJhY2UgPSBUcmFjZSA9IHt9KSk7XG52YXIgVHJhY2VGb3JtYXQ7XG4oZnVuY3Rpb24gKFRyYWNlRm9ybWF0KSB7XG4gICAgVHJhY2VGb3JtYXRbXCJUZXh0XCJdID0gXCJ0ZXh0XCI7XG4gICAgVHJhY2VGb3JtYXRbXCJKU09OXCJdID0gXCJqc29uXCI7XG59KShUcmFjZUZvcm1hdCB8fCAoZXhwb3J0cy5UcmFjZUZvcm1hdCA9IFRyYWNlRm9ybWF0ID0ge30pKTtcbihmdW5jdGlvbiAoVHJhY2VGb3JtYXQpIHtcbiAgICBmdW5jdGlvbiBmcm9tU3RyaW5nKHZhbHVlKSB7XG4gICAgICAgIGlmICghSXMuc3RyaW5nKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIFRyYWNlRm9ybWF0LlRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAodmFsdWUgPT09ICdqc29uJykge1xuICAgICAgICAgICAgcmV0dXJuIFRyYWNlRm9ybWF0LkpTT047XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gVHJhY2VGb3JtYXQuVGV4dDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBUcmFjZUZvcm1hdC5mcm9tU3RyaW5nID0gZnJvbVN0cmluZztcbn0pKFRyYWNlRm9ybWF0IHx8IChleHBvcnRzLlRyYWNlRm9ybWF0ID0gVHJhY2VGb3JtYXQgPSB7fSkpO1xudmFyIFNldFRyYWNlTm90aWZpY2F0aW9uO1xuKGZ1bmN0aW9uIChTZXRUcmFjZU5vdGlmaWNhdGlvbikge1xuICAgIFNldFRyYWNlTm90aWZpY2F0aW9uLnR5cGUgPSBuZXcgbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlKCckL3NldFRyYWNlJyk7XG59KShTZXRUcmFjZU5vdGlmaWNhdGlvbiB8fCAoZXhwb3J0cy5TZXRUcmFjZU5vdGlmaWNhdGlvbiA9IFNldFRyYWNlTm90aWZpY2F0aW9uID0ge30pKTtcbnZhciBMb2dUcmFjZU5vdGlmaWNhdGlvbjtcbihmdW5jdGlvbiAoTG9nVHJhY2VOb3RpZmljYXRpb24pIHtcbiAgICBMb2dUcmFjZU5vdGlmaWNhdGlvbi50eXBlID0gbmV3IG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZSgnJC9sb2dUcmFjZScpO1xufSkoTG9nVHJhY2VOb3RpZmljYXRpb24gfHwgKGV4cG9ydHMuTG9nVHJhY2VOb3RpZmljYXRpb24gPSBMb2dUcmFjZU5vdGlmaWNhdGlvbiA9IHt9KSk7XG52YXIgQ29ubmVjdGlvbkVycm9ycztcbihmdW5jdGlvbiAoQ29ubmVjdGlvbkVycm9ycykge1xuICAgIC8qKlxuICAgICAqIFRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZC5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uRXJyb3JzW0Nvbm5lY3Rpb25FcnJvcnNbXCJDbG9zZWRcIl0gPSAxXSA9IFwiQ2xvc2VkXCI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gZ290IGRpc3Bvc2VkLlxuICAgICAqL1xuICAgIENvbm5lY3Rpb25FcnJvcnNbQ29ubmVjdGlvbkVycm9yc1tcIkRpc3Bvc2VkXCJdID0gMl0gPSBcIkRpc3Bvc2VkXCI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBpbiBsaXN0ZW5pbmcgbW9kZS5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uRXJyb3JzW0Nvbm5lY3Rpb25FcnJvcnNbXCJBbHJlYWR5TGlzdGVuaW5nXCJdID0gM10gPSBcIkFscmVhZHlMaXN0ZW5pbmdcIjtcbn0pKENvbm5lY3Rpb25FcnJvcnMgfHwgKGV4cG9ydHMuQ29ubmVjdGlvbkVycm9ycyA9IENvbm5lY3Rpb25FcnJvcnMgPSB7fSkpO1xuY2xhc3MgQ29ubmVjdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNvZGUsIG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBDb25uZWN0aW9uRXJyb3IucHJvdG90eXBlKTtcbiAgICB9XG59XG5leHBvcnRzLkNvbm5lY3Rpb25FcnJvciA9IENvbm5lY3Rpb25FcnJvcjtcbnZhciBDb25uZWN0aW9uU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENvbm5lY3Rpb25TdHJhdGVneSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNhbmNlbFVuZGlzcGF0Y2hlZCk7XG4gICAgfVxuICAgIENvbm5lY3Rpb25TdHJhdGVneS5pcyA9IGlzO1xufSkoQ29ubmVjdGlvblN0cmF0ZWd5IHx8IChleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IENvbm5lY3Rpb25TdHJhdGVneSA9IHt9KSk7XG52YXIgSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5O1xuKGZ1bmN0aW9uIChJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiAoY2FuZGlkYXRlLmtpbmQgPT09IHVuZGVmaW5lZCB8fCBjYW5kaWRhdGUua2luZCA9PT0gJ2lkJykgJiYgSXMuZnVuYyhjYW5kaWRhdGUuY3JlYXRlQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UpICYmIChjYW5kaWRhdGUuZGlzcG9zZSA9PT0gdW5kZWZpbmVkIHx8IElzLmZ1bmMoY2FuZGlkYXRlLmRpc3Bvc2UpKTtcbiAgICB9XG4gICAgSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzID0gaXM7XG59KShJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgfHwgKGV4cG9ydHMuSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0ge30pKTtcbnZhciBSZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneTtcbihmdW5jdGlvbiAoUmVxdWVzdENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBjYW5kaWRhdGUua2luZCA9PT0gJ3JlcXVlc3QnICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKSAmJiAoY2FuZGlkYXRlLmRpc3Bvc2UgPT09IHVuZGVmaW5lZCB8fCBJcy5mdW5jKGNhbmRpZGF0ZS5kaXNwb3NlKSk7XG4gICAgfVxuICAgIFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzID0gaXM7XG59KShSZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSB8fCAoZXhwb3J0cy5SZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0ge30pKTtcbnZhciBDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5O1xuKGZ1bmN0aW9uIChDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5NZXNzYWdlID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKF8pIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgY2FuY2VsbGF0aW9uXzEuQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UoKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kuaXModmFsdWUpIHx8IFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKHZhbHVlKTtcbiAgICB9XG4gICAgQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5pcyA9IGlzO1xufSkoQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSB8fCAoZXhwb3J0cy5DYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IHt9KSk7XG52YXIgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENhbmNlbGxhdGlvblNlbmRlclN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kuTWVzc2FnZSA9IE9iamVjdC5mcmVlemUoe1xuICAgICAgICBzZW5kQ2FuY2VsbGF0aW9uKGNvbm4sIGlkKSB7XG4gICAgICAgICAgICByZXR1cm4gY29ubi5zZW5kTm90aWZpY2F0aW9uKENhbmNlbE5vdGlmaWNhdGlvbi50eXBlLCB7IGlkIH0pO1xuICAgICAgICB9LFxuICAgICAgICBjbGVhbnVwKF8pIHsgfVxuICAgIH0pO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLnNlbmRDYW5jZWxsYXRpb24pICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNsZWFudXApO1xuICAgIH1cbiAgICBDYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneS5pcyA9IGlzO1xufSkoQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgfHwgKGV4cG9ydHMuQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgPSBDYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneSA9IHt9KSk7XG52YXIgQ2FuY2VsbGF0aW9uU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENhbmNlbGxhdGlvblN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uU3RyYXRlZ3kuTWVzc2FnZSA9IE9iamVjdC5mcmVlemUoe1xuICAgICAgICByZWNlaXZlcjogQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5NZXNzYWdlLFxuICAgICAgICBzZW5kZXI6IENhbmNlbGxhdGlvblNlbmRlclN0cmF0ZWd5Lk1lc3NhZ2VcbiAgICB9KTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKGNhbmRpZGF0ZS5yZWNlaXZlcikgJiYgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kuaXMoY2FuZGlkYXRlLnNlbmRlcik7XG4gICAgfVxuICAgIENhbmNlbGxhdGlvblN0cmF0ZWd5LmlzID0gaXM7XG59KShDYW5jZWxsYXRpb25TdHJhdGVneSB8fCAoZXhwb3J0cy5DYW5jZWxsYXRpb25TdHJhdGVneSA9IENhbmNlbGxhdGlvblN0cmF0ZWd5ID0ge30pKTtcbnZhciBNZXNzYWdlU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKE1lc3NhZ2VTdHJhdGVneSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLmhhbmRsZU1lc3NhZ2UpO1xuICAgIH1cbiAgICBNZXNzYWdlU3RyYXRlZ3kuaXMgPSBpcztcbn0pKE1lc3NhZ2VTdHJhdGVneSB8fCAoZXhwb3J0cy5NZXNzYWdlU3RyYXRlZ3kgPSBNZXNzYWdlU3RyYXRlZ3kgPSB7fSkpO1xudmFyIENvbm5lY3Rpb25PcHRpb25zO1xuKGZ1bmN0aW9uIChDb25uZWN0aW9uT3B0aW9ucykge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIChDYW5jZWxsYXRpb25TdHJhdGVneS5pcyhjYW5kaWRhdGUuY2FuY2VsbGF0aW9uU3RyYXRlZ3kpIHx8IENvbm5lY3Rpb25TdHJhdGVneS5pcyhjYW5kaWRhdGUuY29ubmVjdGlvblN0cmF0ZWd5KSB8fCBNZXNzYWdlU3RyYXRlZ3kuaXMoY2FuZGlkYXRlLm1lc3NhZ2VTdHJhdGVneSkpO1xuICAgIH1cbiAgICBDb25uZWN0aW9uT3B0aW9ucy5pcyA9IGlzO1xufSkoQ29ubmVjdGlvbk9wdGlvbnMgfHwgKGV4cG9ydHMuQ29ubmVjdGlvbk9wdGlvbnMgPSBDb25uZWN0aW9uT3B0aW9ucyA9IHt9KSk7XG52YXIgQ29ubmVjdGlvblN0YXRlO1xuKGZ1bmN0aW9uIChDb25uZWN0aW9uU3RhdGUpIHtcbiAgICBDb25uZWN0aW9uU3RhdGVbQ29ubmVjdGlvblN0YXRlW1wiTmV3XCJdID0gMV0gPSBcIk5ld1wiO1xuICAgIENvbm5lY3Rpb25TdGF0ZVtDb25uZWN0aW9uU3RhdGVbXCJMaXN0ZW5pbmdcIl0gPSAyXSA9IFwiTGlzdGVuaW5nXCI7XG4gICAgQ29ubmVjdGlvblN0YXRlW0Nvbm5lY3Rpb25TdGF0ZVtcIkNsb3NlZFwiXSA9IDNdID0gXCJDbG9zZWRcIjtcbiAgICBDb25uZWN0aW9uU3RhdGVbQ29ubmVjdGlvblN0YXRlW1wiRGlzcG9zZWRcIl0gPSA0XSA9IFwiRGlzcG9zZWRcIjtcbn0pKENvbm5lY3Rpb25TdGF0ZSB8fCAoQ29ubmVjdGlvblN0YXRlID0ge30pKTtcbmZ1bmN0aW9uIGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uKG1lc3NhZ2VSZWFkZXIsIG1lc3NhZ2VXcml0ZXIsIF9sb2dnZXIsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBsb2dnZXIgPSBfbG9nZ2VyICE9PSB1bmRlZmluZWQgPyBfbG9nZ2VyIDogZXhwb3J0cy5OdWxsTG9nZ2VyO1xuICAgIGxldCBzZXF1ZW5jZU51bWJlciA9IDA7XG4gICAgbGV0IG5vdGlmaWNhdGlvblNlcXVlbmNlTnVtYmVyID0gMDtcbiAgICBsZXQgdW5rbm93blJlc3BvbnNlU2VxdWVuY2VOdW1iZXIgPSAwO1xuICAgIGNvbnN0IHZlcnNpb24gPSAnMi4wJztcbiAgICBsZXQgc3RhclJlcXVlc3RIYW5kbGVyID0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlcXVlc3RIYW5kbGVycyA9IG5ldyBNYXAoKTtcbiAgICBsZXQgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgY29uc3Qgbm90aWZpY2F0aW9uSGFuZGxlcnMgPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgcHJvZ3Jlc3NIYW5kbGVycyA9IG5ldyBNYXAoKTtcbiAgICBsZXQgdGltZXI7XG4gICAgbGV0IG1lc3NhZ2VRdWV1ZSA9IG5ldyBsaW5rZWRNYXBfMS5MaW5rZWRNYXAoKTtcbiAgICBsZXQgcmVzcG9uc2VQcm9taXNlcyA9IG5ldyBNYXAoKTtcbiAgICBsZXQga25vd25DYW5jZWxlZFJlcXVlc3RzID0gbmV3IFNldCgpO1xuICAgIGxldCByZXF1ZXN0VG9rZW5zID0gbmV3IE1hcCgpO1xuICAgIGxldCB0cmFjZSA9IFRyYWNlLk9mZjtcbiAgICBsZXQgdHJhY2VGb3JtYXQgPSBUcmFjZUZvcm1hdC5UZXh0O1xuICAgIGxldCB0cmFjZXI7XG4gICAgbGV0IHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLk5ldztcbiAgICBjb25zdCBlcnJvckVtaXR0ZXIgPSBuZXcgZXZlbnRzXzEuRW1pdHRlcigpO1xuICAgIGNvbnN0IGNsb3NlRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgdW5oYW5kbGVkTm90aWZpY2F0aW9uRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgdW5oYW5kbGVkUHJvZ3Jlc3NFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICBjb25zdCBkaXNwb3NlRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgY2FuY2VsbGF0aW9uU3RyYXRlZ3kgPSAob3B0aW9ucyAmJiBvcHRpb25zLmNhbmNlbGxhdGlvblN0cmF0ZWd5KSA/IG9wdGlvbnMuY2FuY2VsbGF0aW9uU3RyYXRlZ3kgOiBDYW5jZWxsYXRpb25TdHJhdGVneS5NZXNzYWdlO1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlcXVlc3RRdWV1ZUtleShpZCkge1xuICAgICAgICBpZiAoaWQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuJ3Qgc2VuZCByZXF1ZXN0cyB3aXRoIGlkIG51bGwgc2luY2UgdGhlIHJlc3BvbnNlIGNhbid0IGJlIGNvcnJlbGF0ZWQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdyZXEtJyArIGlkLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlc3BvbnNlUXVldWVLZXkoaWQpIHtcbiAgICAgICAgaWYgKGlkID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3Jlcy11bmtub3duLScgKyAoKyt1bmtub3duUmVzcG9uc2VTZXF1ZW5jZU51bWJlcikudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAncmVzLScgKyBpZC50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZU5vdGlmaWNhdGlvblF1ZXVlS2V5KCkge1xuICAgICAgICByZXR1cm4gJ25vdC0nICsgKCsrbm90aWZpY2F0aW9uU2VxdWVuY2VOdW1iZXIpLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFkZE1lc3NhZ2VUb1F1ZXVlKHF1ZXVlLCBtZXNzYWdlKSB7XG4gICAgICAgIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXF1ZXN0KG1lc3NhZ2UpKSB7XG4gICAgICAgICAgICBxdWV1ZS5zZXQoY3JlYXRlUmVxdWVzdFF1ZXVlS2V5KG1lc3NhZ2UuaWQpLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXNwb25zZShtZXNzYWdlKSkge1xuICAgICAgICAgICAgcXVldWUuc2V0KGNyZWF0ZVJlc3BvbnNlUXVldWVLZXkobWVzc2FnZS5pZCksIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcXVldWUuc2V0KGNyZWF0ZU5vdGlmaWNhdGlvblF1ZXVlS2V5KCksIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNhbmNlbFVuZGlzcGF0Y2hlZChfbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0xpc3RlbmluZygpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlID09PSBDb25uZWN0aW9uU3RhdGUuTGlzdGVuaW5nO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0Nsb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlID09PSBDb25uZWN0aW9uU3RhdGUuQ2xvc2VkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0Rpc3Bvc2VkKCkge1xuICAgICAgICByZXR1cm4gc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5EaXNwb3NlZDtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2xvc2VIYW5kbGVyKCkge1xuICAgICAgICBpZiAoc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5OZXcgfHwgc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5MaXN0ZW5pbmcpIHtcbiAgICAgICAgICAgIHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLkNsb3NlZDtcbiAgICAgICAgICAgIGNsb3NlRW1pdHRlci5maXJlKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlIGNvbm5lY3Rpb24gaXMgZGlzcG9zZWQgZG9uJ3Qgc2VudCBjbG9zZSBldmVudHMuXG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlYWRFcnJvckhhbmRsZXIoZXJyb3IpIHtcbiAgICAgICAgZXJyb3JFbWl0dGVyLmZpcmUoW2Vycm9yLCB1bmRlZmluZWQsIHVuZGVmaW5lZF0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiB3cml0ZUVycm9ySGFuZGxlcihkYXRhKSB7XG4gICAgICAgIGVycm9yRW1pdHRlci5maXJlKGRhdGEpO1xuICAgIH1cbiAgICBtZXNzYWdlUmVhZGVyLm9uQ2xvc2UoY2xvc2VIYW5kbGVyKTtcbiAgICBtZXNzYWdlUmVhZGVyLm9uRXJyb3IocmVhZEVycm9ySGFuZGxlcik7XG4gICAgbWVzc2FnZVdyaXRlci5vbkNsb3NlKGNsb3NlSGFuZGxlcik7XG4gICAgbWVzc2FnZVdyaXRlci5vbkVycm9yKHdyaXRlRXJyb3JIYW5kbGVyKTtcbiAgICBmdW5jdGlvbiB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCkge1xuICAgICAgICBpZiAodGltZXIgfHwgbWVzc2FnZVF1ZXVlLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aW1lciA9ICgwLCByYWxfMS5kZWZhdWx0KSgpLnRpbWVyLnNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICAgICAgICB0aW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHByb2Nlc3NNZXNzYWdlUXVldWUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGhhbmRsZU1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICBpZiAobWVzc2FnZXNfMS5NZXNzYWdlLmlzUmVxdWVzdChtZXNzYWdlKSkge1xuICAgICAgICAgICAgaGFuZGxlUmVxdWVzdChtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNOb3RpZmljYXRpb24obWVzc2FnZSkpIHtcbiAgICAgICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvbihtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXNwb25zZShtZXNzYWdlKSkge1xuICAgICAgICAgICAgaGFuZGxlUmVzcG9uc2UobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBoYW5kbGVJbnZhbGlkTWVzc2FnZShtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBwcm9jZXNzTWVzc2FnZVF1ZXVlKCkge1xuICAgICAgICBpZiAobWVzc2FnZVF1ZXVlLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXNzYWdlID0gbWVzc2FnZVF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlU3RyYXRlZ3kgPSBvcHRpb25zPy5tZXNzYWdlU3RyYXRlZ3k7XG4gICAgICAgICAgICBpZiAoTWVzc2FnZVN0cmF0ZWd5LmlzKG1lc3NhZ2VTdHJhdGVneSkpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlU3RyYXRlZ3kuaGFuZGxlTWVzc2FnZShtZXNzYWdlLCBoYW5kbGVNZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGhhbmRsZU1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgY2FsbGJhY2sgPSAobWVzc2FnZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2UgaGF2ZSByZWNlaXZlZCBhIGNhbmNlbGxhdGlvbiBtZXNzYWdlLiBDaGVjayBpZiB0aGUgbWVzc2FnZSBpcyBzdGlsbCBpbiB0aGUgcXVldWVcbiAgICAgICAgICAgIC8vIGFuZCBjYW5jZWwgaXQgaWYgYWxsb3dlZCB0byBkbyBzby5cbiAgICAgICAgICAgIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNOb3RpZmljYXRpb24obWVzc2FnZSkgJiYgbWVzc2FnZS5tZXRob2QgPT09IENhbmNlbE5vdGlmaWNhdGlvbi50eXBlLm1ldGhvZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbmNlbElkID0gbWVzc2FnZS5wYXJhbXMuaWQ7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gY3JlYXRlUmVxdWVzdFF1ZXVlS2V5KGNhbmNlbElkKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0b0NhbmNlbCA9IG1lc3NhZ2VRdWV1ZS5nZXQoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZXNfMS5NZXNzYWdlLmlzUmVxdWVzdCh0b0NhbmNlbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyYXRlZ3kgPSBvcHRpb25zPy5jb25uZWN0aW9uU3RyYXRlZ3k7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gKHN0cmF0ZWd5ICYmIHN0cmF0ZWd5LmNhbmNlbFVuZGlzcGF0Y2hlZCkgPyBzdHJhdGVneS5jYW5jZWxVbmRpc3BhdGNoZWQodG9DYW5jZWwsIGNhbmNlbFVuZGlzcGF0Y2hlZCkgOiBjYW5jZWxVbmRpc3BhdGNoZWQodG9DYW5jZWwpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgJiYgKHJlc3BvbnNlLmVycm9yICE9PSB1bmRlZmluZWQgfHwgcmVzcG9uc2UucmVzdWx0ICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUXVldWUuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLmRlbGV0ZShjYW5jZWxJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5pZCA9IHRvQ2FuY2VsLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VTZW5kaW5nUmVzcG9uc2UocmVzcG9uc2UsIG1lc3NhZ2UubWV0aG9kLCBEYXRlLm5vdygpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUocmVzcG9uc2UpLmNhdGNoKCgpID0+IGxvZ2dlci5lcnJvcihgU2VuZGluZyByZXNwb25zZSBmb3IgY2FuY2VsZWQgbWVzc2FnZSBmYWlsZWQuYCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGNhbmNlbGxhdGlvblRva2VuID0gcmVxdWVzdFRva2Vucy5nZXQoY2FuY2VsSWQpO1xuICAgICAgICAgICAgICAgIC8vIFRoZSByZXF1ZXN0IGlzIGFscmVhZHkgcnVubmluZy4gQ2FuY2VsIHRoZSB0b2tlblxuICAgICAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbmNlbGxhdGlvblRva2VuLmNhbmNlbCgpO1xuICAgICAgICAgICAgICAgICAgICB0cmFjZVJlY2VpdmVkTm90aWZpY2F0aW9uKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZW1lbWJlciB0aGUgY2FuY2VsIGJ1dCBzdGlsbCBxdWV1ZSB0aGUgbWVzc2FnZSB0b1xuICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbiB1cCBzdGF0ZSBpbiBwcm9jZXNzIG1lc3NhZ2UuXG4gICAgICAgICAgICAgICAgICAgIGtub3duQ2FuY2VsZWRSZXF1ZXN0cy5hZGQoY2FuY2VsSWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFkZE1lc3NhZ2VUb1F1ZXVlKG1lc3NhZ2VRdWV1ZSwgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGZ1bmN0aW9uIGhhbmRsZVJlcXVlc3QocmVxdWVzdE1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgLy8gd2UgcmV0dXJuIGhlcmUgc2lsZW50bHkgc2luY2Ugd2UgZmlyZWQgYW4gZXZlbnQgd2hlbiB0aGVcbiAgICAgICAgICAgIC8vIGNvbm5lY3Rpb24gZ290IGRpc3Bvc2VkLlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHJlcGx5KHJlc3VsdE9yRXJyb3IsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgaWQ6IHJlcXVlc3RNZXNzYWdlLmlkXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKHJlc3VsdE9yRXJyb3IgaW5zdGFuY2VvZiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlLmVycm9yID0gcmVzdWx0T3JFcnJvci50b0pzb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVzdWx0ID0gcmVzdWx0T3JFcnJvciA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHJlc3VsdE9yRXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cmFjZVNlbmRpbmdSZXNwb25zZShtZXNzYWdlLCBtZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICBtZXNzYWdlV3JpdGVyLndyaXRlKG1lc3NhZ2UpLmNhdGNoKCgpID0+IGxvZ2dlci5lcnJvcihgU2VuZGluZyByZXNwb25zZSBmYWlsZWQuYCkpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHJlcGx5RXJyb3IoZXJyb3IsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgaWQ6IHJlcXVlc3RNZXNzYWdlLmlkLFxuICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvci50b0pzb24oKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUobWVzc2FnZSkuY2F0Y2goKCkgPT4gbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlc3BvbnNlIGZhaWxlZC5gKSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gcmVwbHlTdWNjZXNzKHJlc3VsdCwgbWV0aG9kLCBzdGFydFRpbWUpIHtcbiAgICAgICAgICAgIC8vIFRoZSBKU09OIFJQQyBkZWZpbmVzIHRoYXQgYSByZXNwb25zZSBtdXN0IGVpdGhlciBoYXZlIGEgcmVzdWx0IG9yIGFuIGVycm9yXG4gICAgICAgICAgICAvLyBTbyB3ZSBjYW4ndCB0cmVhdCB1bmRlZmluZWQgYXMgYSB2YWxpZCByZXNwb25zZSByZXN1bHQuXG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgICAgICAgICAgICBqc29ucnBjOiB2ZXJzaW9uLFxuICAgICAgICAgICAgICAgIGlkOiByZXF1ZXN0TWVzc2FnZS5pZCxcbiAgICAgICAgICAgICAgICByZXN1bHQ6IHJlc3VsdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUobWVzc2FnZSkuY2F0Y2goKCkgPT4gbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlc3BvbnNlIGZhaWxlZC5gKSk7XG4gICAgICAgIH1cbiAgICAgICAgdHJhY2VSZWNlaXZlZFJlcXVlc3QocmVxdWVzdE1lc3NhZ2UpO1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gcmVxdWVzdEhhbmRsZXJzLmdldChyZXF1ZXN0TWVzc2FnZS5tZXRob2QpO1xuICAgICAgICBsZXQgdHlwZTtcbiAgICAgICAgbGV0IHJlcXVlc3RIYW5kbGVyO1xuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgdHlwZSA9IGVsZW1lbnQudHlwZTtcbiAgICAgICAgICAgIHJlcXVlc3RIYW5kbGVyID0gZWxlbWVudC5oYW5kbGVyO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIGlmIChyZXF1ZXN0SGFuZGxlciB8fCBzdGFyUmVxdWVzdEhhbmRsZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHRva2VuS2V5ID0gcmVxdWVzdE1lc3NhZ2UuaWQgPz8gU3RyaW5nKERhdGUubm93KCkpOyAvL1xuICAgICAgICAgICAgY29uc3QgY2FuY2VsbGF0aW9uU291cmNlID0gSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKGNhbmNlbGxhdGlvblN0cmF0ZWd5LnJlY2VpdmVyKVxuICAgICAgICAgICAgICAgID8gY2FuY2VsbGF0aW9uU3RyYXRlZ3kucmVjZWl2ZXIuY3JlYXRlQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UodG9rZW5LZXkpXG4gICAgICAgICAgICAgICAgOiBjYW5jZWxsYXRpb25TdHJhdGVneS5yZWNlaXZlci5jcmVhdGVDYW5jZWxsYXRpb25Ub2tlblNvdXJjZShyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICBpZiAocmVxdWVzdE1lc3NhZ2UuaWQgIT09IG51bGwgJiYga25vd25DYW5jZWxlZFJlcXVlc3RzLmhhcyhyZXF1ZXN0TWVzc2FnZS5pZCkpIHtcbiAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25Tb3VyY2UuY2FuY2VsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVxdWVzdE1lc3NhZ2UuaWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLnNldCh0b2tlbktleSwgY2FuY2VsbGF0aW9uU291cmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IGhhbmRsZXJSZXN1bHQ7XG4gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0TWVzc2FnZS5wYXJhbXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlLm51bWJlck9mUGFyYW1zICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1zLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyAke3R5cGUubnVtYmVyT2ZQYXJhbXN9IHBhcmFtcyBidXQgcmVjZWl2ZWQgbm9uZS5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJSZXN1bHQgPSByZXF1ZXN0SGFuZGxlcihjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVxdWVzdE1lc3NhZ2UucGFyYW1zKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlLnBhcmFtZXRlclN0cnVjdHVyZXMgPT09IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseUVycm9yKG5ldyBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IobWVzc2FnZXNfMS5FcnJvckNvZGVzLkludmFsaWRQYXJhbXMsIGBSZXF1ZXN0ICR7cmVxdWVzdE1lc3NhZ2UubWV0aG9kfSBkZWZpbmVzIHBhcmFtZXRlcnMgYnkgbmFtZSBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBwb3NpdGlvbmApLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlclJlc3VsdCA9IHJlcXVlc3RIYW5kbGVyKC4uLnJlcXVlc3RNZXNzYWdlLnBhcmFtcywgY2FuY2VsbGF0aW9uU291cmNlLnRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS5wYXJhbWV0ZXJTdHJ1Y3R1cmVzID09PSBtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW52YWxpZFBhcmFtcywgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGRlZmluZXMgcGFyYW1ldGVycyBieSBwb3NpdGlvbiBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBuYW1lYCksIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gcmVxdWVzdEhhbmRsZXIocmVxdWVzdE1lc3NhZ2UucGFyYW1zLCBjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0YXJSZXF1ZXN0SGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gc3RhclJlcXVlc3RIYW5kbGVyKHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgcmVxdWVzdE1lc3NhZ2UucGFyYW1zLCBjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBwcm9taXNlID0gaGFuZGxlclJlc3VsdDtcbiAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZXJSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFRva2Vucy5kZWxldGUodG9rZW5LZXkpO1xuICAgICAgICAgICAgICAgICAgICByZXBseVN1Y2Nlc3MoaGFuZGxlclJlc3VsdCwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwcm9taXNlLnRoZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS50aGVuKChyZXN1bHRPckVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLmRlbGV0ZSh0b2tlbktleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXBseShyZXN1bHRPckVycm9yLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IoZXJyb3IsIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVycm9yICYmIElzLnN0cmluZyhlcnJvci5tZXNzYWdlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGZhaWxlZCB3aXRoIG1lc3NhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZmFpbGVkIHVuZXhwZWN0ZWRseSB3aXRob3V0IHByb3ZpZGluZyBhbnkgZGV0YWlscy5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHkoaGFuZGxlclJlc3VsdCwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHkoZXJyb3IsIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZXJyb3IgJiYgSXMuc3RyaW5nKGVycm9yLm1lc3NhZ2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGZhaWxlZCB3aXRoIG1lc3NhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZmFpbGVkIHVuZXhwZWN0ZWRseSB3aXRob3V0IHByb3ZpZGluZyBhbnkgZGV0YWlscy5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuTWV0aG9kTm90Rm91bmQsIGBVbmhhbmRsZWQgbWV0aG9kICR7cmVxdWVzdE1lc3NhZ2UubWV0aG9kfWApLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlUmVzcG9uc2UocmVzcG9uc2VNZXNzYWdlKSB7XG4gICAgICAgIGlmIChpc0Rpc3Bvc2VkKCkpIHtcbiAgICAgICAgICAgIC8vIFNlZSBoYW5kbGUgcmVxdWVzdC5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzcG9uc2VNZXNzYWdlLmlkID09PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VNZXNzYWdlLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBSZWNlaXZlZCByZXNwb25zZSBtZXNzYWdlIHdpdGhvdXQgaWQ6IEVycm9yIGlzOiBcXG4ke0pTT04uc3RyaW5naWZ5KHJlc3BvbnNlTWVzc2FnZS5lcnJvciwgdW5kZWZpbmVkLCA0KX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgUmVjZWl2ZWQgcmVzcG9uc2UgbWVzc2FnZSB3aXRob3V0IGlkLiBObyBmdXJ0aGVyIGVycm9yIGluZm9ybWF0aW9uIHByb3ZpZGVkLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gcmVzcG9uc2VNZXNzYWdlLmlkO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VQcm9taXNlID0gcmVzcG9uc2VQcm9taXNlcy5nZXQoa2V5KTtcbiAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWRSZXNwb25zZShyZXNwb25zZU1lc3NhZ2UsIHJlc3BvbnNlUHJvbWlzZSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VQcm9taXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2VzLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZU1lc3NhZ2UuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gcmVzcG9uc2VNZXNzYWdlLmVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlLnJlamVjdChuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKGVycm9yLmNvZGUsIGVycm9yLm1lc3NhZ2UsIGVycm9yLmRhdGEpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXNwb25zZU1lc3NhZ2UucmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlTWVzc2FnZS5yZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgbmV2ZXIgaGFwcGVuLicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IubWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBSZXNwb25zZSBoYW5kbGVyICcke3Jlc3BvbnNlUHJvbWlzZS5tZXRob2R9JyBmYWlsZWQgd2l0aCBtZXNzYWdlOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYFJlc3BvbnNlIGhhbmRsZXIgJyR7cmVzcG9uc2VQcm9taXNlLm1ldGhvZH0nIGZhaWxlZCB1bmV4cGVjdGVkbHkuYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlTm90aWZpY2F0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgLy8gU2VlIGhhbmRsZSByZXF1ZXN0LlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0eXBlID0gdW5kZWZpbmVkO1xuICAgICAgICBsZXQgbm90aWZpY2F0aW9uSGFuZGxlcjtcbiAgICAgICAgaWYgKG1lc3NhZ2UubWV0aG9kID09PSBDYW5jZWxOb3RpZmljYXRpb24udHlwZS5tZXRob2QpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhbmNlbElkID0gbWVzc2FnZS5wYXJhbXMuaWQ7XG4gICAgICAgICAgICBrbm93bkNhbmNlbGVkUmVxdWVzdHMuZGVsZXRlKGNhbmNlbElkKTtcbiAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWROb3RpZmljYXRpb24obWVzc2FnZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gbm90aWZpY2F0aW9uSGFuZGxlcnMuZ2V0KG1lc3NhZ2UubWV0aG9kKTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uSGFuZGxlciA9IGVsZW1lbnQuaGFuZGxlcjtcbiAgICAgICAgICAgICAgICB0eXBlID0gZWxlbWVudC50eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChub3RpZmljYXRpb25IYW5kbGVyIHx8IHN0YXJOb3RpZmljYXRpb25IYW5kbGVyKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWROb3RpZmljYXRpb24obWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgaWYgKG5vdGlmaWNhdGlvbkhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UucGFyYW1zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5udW1iZXJPZlBhcmFtcyAhPT0gMCAmJiB0eXBlLnBhcmFtZXRlclN0cnVjdHVyZXMgIT09IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBOb3RpZmljYXRpb24gJHttZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyAke3R5cGUubnVtYmVyT2ZQYXJhbXN9IHBhcmFtcyBidXQgcmVjZWl2ZWQgbm9uZS5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShtZXNzYWdlLnBhcmFtcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGFyZSBKU09OLVJQQyBsaWJyYXJpZXMgdGhhdCBzZW5kIHByb2dyZXNzIG1lc3NhZ2UgYXMgcG9zaXRpb25hbCBwYXJhbXMgYWx0aG91Z2hcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpZmllZCBhcyBuYW1lZC4gU28gY29udmVydCB0aGVtIGlmIHRoaXMgaXMgdGhlIGNhc2UuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBtZXNzYWdlLnBhcmFtcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLm1ldGhvZCA9PT0gUHJvZ3Jlc3NOb3RpZmljYXRpb24udHlwZS5tZXRob2QgJiYgcGFyYW1zLmxlbmd0aCA9PT0gMiAmJiBQcm9ncmVzc1Rva2VuLmlzKHBhcmFtc1swXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKHsgdG9rZW46IHBhcmFtc1swXSwgdmFsdWU6IHBhcmFtc1sxXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUucGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBOb3RpZmljYXRpb24gJHttZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyBwYXJhbWV0ZXJzIGJ5IG5hbWUgYnV0IHJlY2VpdmVkIHBhcmFtZXRlcnMgYnkgcG9zaXRpb25gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5udW1iZXJPZlBhcmFtcyAhPT0gbWVzc2FnZS5wYXJhbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYE5vdGlmaWNhdGlvbiAke21lc3NhZ2UubWV0aG9kfSBkZWZpbmVzICR7dHlwZS5udW1iZXJPZlBhcmFtc30gcGFyYW1zIGJ1dCByZWNlaXZlZCAke3BhcmFtcy5sZW5ndGh9IGFyZ3VtZW50c2ApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXIoLi4ucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS5wYXJhbWV0ZXJTdHJ1Y3R1cmVzID09PSBtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgTm90aWZpY2F0aW9uICR7bWVzc2FnZS5tZXRob2R9IGRlZmluZXMgcGFyYW1ldGVycyBieSBwb3NpdGlvbiBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBuYW1lYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKG1lc3NhZ2UucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGFyTm90aWZpY2F0aW9uSGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICBzdGFyTm90aWZpY2F0aW9uSGFuZGxlcihtZXNzYWdlLm1ldGhvZCwgbWVzc2FnZS5wYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvci5tZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgTm90aWZpY2F0aW9uIGhhbmRsZXIgJyR7bWVzc2FnZS5tZXRob2R9JyBmYWlsZWQgd2l0aCBtZXNzYWdlOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYE5vdGlmaWNhdGlvbiBoYW5kbGVyICcke21lc3NhZ2UubWV0aG9kfScgZmFpbGVkIHVuZXhwZWN0ZWRseS5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1bmhhbmRsZWROb3RpZmljYXRpb25FbWl0dGVyLmZpcmUobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlSW52YWxpZE1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignUmVjZWl2ZWQgZW1wdHkgbWVzc2FnZS4nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsb2dnZXIuZXJyb3IoYFJlY2VpdmVkIG1lc3NhZ2Ugd2hpY2ggaXMgbmVpdGhlciBhIHJlc3BvbnNlIG5vciBhIG5vdGlmaWNhdGlvbiBtZXNzYWdlOlxcbiR7SlNPTi5zdHJpbmdpZnkobWVzc2FnZSwgbnVsbCwgNCl9YCk7XG4gICAgICAgIC8vIFRlc3Qgd2hldGhlciB3ZSBmaW5kIGFuIGlkIHRvIHJlamVjdCB0aGUgcHJvbWlzZVxuICAgICAgICBjb25zdCByZXNwb25zZU1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICBpZiAoSXMuc3RyaW5nKHJlc3BvbnNlTWVzc2FnZS5pZCkgfHwgSXMubnVtYmVyKHJlc3BvbnNlTWVzc2FnZS5pZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHJlc3BvbnNlTWVzc2FnZS5pZDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxlciA9IHJlc3BvbnNlUHJvbWlzZXMuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VIYW5kbGVyLnJlamVjdChuZXcgRXJyb3IoJ1RoZSByZWNlaXZlZCByZXNwb25zZSBoYXMgbmVpdGhlciBhIHJlc3VsdCBub3IgYW4gZXJyb3IgcHJvcGVydHkuJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0cmluZ2lmeVRyYWNlKHBhcmFtcykge1xuICAgICAgICBpZiAocGFyYW1zID09PSB1bmRlZmluZWQgfHwgcGFyYW1zID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAodHJhY2UpIHtcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuVmVyYm9zZTpcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGFyYW1zLCBudWxsLCA0KTtcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuQ29tcGFjdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGFyYW1zKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVNlbmRpbmdSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFjZUZvcm1hdCA9PT0gVHJhY2VGb3JtYXQuVGV4dCkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSAmJiBtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBgUGFyYW1zOiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucGFyYW1zKX1cXG5cXG5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJhY2VyLmxvZyhgU2VuZGluZyByZXF1ZXN0ICcke21lc3NhZ2UubWV0aG9kfSAtICgke21lc3NhZ2UuaWR9KScuYCwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb2dMU1BNZXNzYWdlKCdzZW5kLXJlcXVlc3QnLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVNlbmRpbmdOb3RpZmljYXRpb24obWVzc2FnZSkge1xuICAgICAgICBpZiAodHJhY2UgPT09IFRyYWNlLk9mZiB8fCAhdHJhY2VyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYWNlRm9ybWF0ID09PSBUcmFjZUZvcm1hdC5UZXh0KSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdCkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0gYFBhcmFtczogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLnBhcmFtcyl9XFxuXFxuYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSAnTm8gcGFyYW1ldGVycyBwcm92aWRlZC5cXG5cXG4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFNlbmRpbmcgbm90aWZpY2F0aW9uICcke21lc3NhZ2UubWV0aG9kfScuYCwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb2dMU1BNZXNzYWdlKCdzZW5kLW5vdGlmaWNhdGlvbicsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhY2VGb3JtYXQgPT09IFRyYWNlRm9ybWF0LlRleHQpIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZXJyb3IgJiYgbWVzc2FnZS5lcnJvci5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgRXJyb3IgZGF0YTogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLmVycm9yLmRhdGEpfVxcblxcbmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgUmVzdWx0OiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucmVzdWx0KX1cXG5cXG5gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UuZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9ICdObyByZXN1bHQgcmV0dXJuZWQuXFxuXFxuJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFNlbmRpbmcgcmVzcG9uc2UgJyR7bWV0aG9kfSAtICgke21lc3NhZ2UuaWR9KScuIFByb2Nlc3NpbmcgcmVxdWVzdCB0b29rICR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1tc2AsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgnc2VuZC1yZXNwb25zZScsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYWNlUmVjZWl2ZWRSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFjZUZvcm1hdCA9PT0gVHJhY2VGb3JtYXQuVGV4dCkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSAmJiBtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBgUGFyYW1zOiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucGFyYW1zKX1cXG5cXG5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJhY2VyLmxvZyhgUmVjZWl2ZWQgcmVxdWVzdCAnJHttZXNzYWdlLm1ldGhvZH0gLSAoJHttZXNzYWdlLmlkfSknLmAsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1yZXF1ZXN0JywgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdHJhY2VSZWNlaXZlZE5vdGlmaWNhdGlvbihtZXNzYWdlKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIgfHwgbWVzc2FnZS5tZXRob2QgPT09IExvZ1RyYWNlTm90aWZpY2F0aW9uLnR5cGUubWV0aG9kKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYWNlRm9ybWF0ID09PSBUcmFjZUZvcm1hdC5UZXh0KSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdCkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0gYFBhcmFtczogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLnBhcmFtcyl9XFxuXFxuYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSAnTm8gcGFyYW1ldGVycyBwcm92aWRlZC5cXG5cXG4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFJlY2VpdmVkIG5vdGlmaWNhdGlvbiAnJHttZXNzYWdlLm1ldGhvZH0nLmAsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1ub3RpZmljYXRpb24nLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVJlY2VpdmVkUmVzcG9uc2UobWVzc2FnZSwgcmVzcG9uc2VQcm9taXNlKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhY2VGb3JtYXQgPT09IFRyYWNlRm9ybWF0LlRleHQpIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZXJyb3IgJiYgbWVzc2FnZS5lcnJvci5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgRXJyb3IgZGF0YTogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLmVycm9yLmRhdGEpfVxcblxcbmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgUmVzdWx0OiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucmVzdWx0KX1cXG5cXG5gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UuZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9ICdObyByZXN1bHQgcmV0dXJuZWQuXFxuXFxuJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXNwb25zZVByb21pc2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IG1lc3NhZ2UuZXJyb3IgPyBgIFJlcXVlc3QgZmFpbGVkOiAke21lc3NhZ2UuZXJyb3IubWVzc2FnZX0gKCR7bWVzc2FnZS5lcnJvci5jb2RlfSkuYCA6ICcnO1xuICAgICAgICAgICAgICAgIHRyYWNlci5sb2coYFJlY2VpdmVkIHJlc3BvbnNlICcke3Jlc3BvbnNlUHJvbWlzZS5tZXRob2R9IC0gKCR7bWVzc2FnZS5pZH0pJyBpbiAke0RhdGUubm93KCkgLSByZXNwb25zZVByb21pc2UudGltZXJTdGFydH1tcy4ke2Vycm9yfWAsIGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJhY2VyLmxvZyhgUmVjZWl2ZWQgcmVzcG9uc2UgJHttZXNzYWdlLmlkfSB3aXRob3V0IGFjdGl2ZSByZXNwb25zZSBwcm9taXNlLmAsIGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1yZXNwb25zZScsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGxvZ0xTUE1lc3NhZ2UodHlwZSwgbWVzc2FnZSkge1xuICAgICAgICBpZiAoIXRyYWNlciB8fCB0cmFjZSA9PT0gVHJhY2UuT2ZmKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbHNwTWVzc2FnZSA9IHtcbiAgICAgICAgICAgIGlzTFNQTWVzc2FnZTogdHJ1ZSxcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpXG4gICAgICAgIH07XG4gICAgICAgIHRyYWNlci5sb2cobHNwTWVzc2FnZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRocm93SWZDbG9zZWRPckRpc3Bvc2VkKCkge1xuICAgICAgICBpZiAoaXNDbG9zZWQoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IENvbm5lY3Rpb25FcnJvcihDb25uZWN0aW9uRXJyb3JzLkNsb3NlZCwgJ0Nvbm5lY3Rpb24gaXMgY2xvc2VkLicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0Rpc3Bvc2VkKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb25uZWN0aW9uRXJyb3IoQ29ubmVjdGlvbkVycm9ycy5EaXNwb3NlZCwgJ0Nvbm5lY3Rpb24gaXMgZGlzcG9zZWQuJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdGhyb3dJZkxpc3RlbmluZygpIHtcbiAgICAgICAgaWYgKGlzTGlzdGVuaW5nKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb25uZWN0aW9uRXJyb3IoQ29ubmVjdGlvbkVycm9ycy5BbHJlYWR5TGlzdGVuaW5nLCAnQ29ubmVjdGlvbiBpcyBhbHJlYWR5IGxpc3RlbmluZycpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRocm93SWZOb3RMaXN0ZW5pbmcoKSB7XG4gICAgICAgIGlmICghaXNMaXN0ZW5pbmcoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYWxsIGxpc3RlbigpIGZpcnN0LicpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVuZGVmaW5lZFRvTnVsbChwYXJhbSkge1xuICAgICAgICBpZiAocGFyYW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyYW07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gbnVsbFRvVW5kZWZpbmVkKHBhcmFtKSB7XG4gICAgICAgIGlmIChwYXJhbSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJhbTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBpc05hbWVkUGFyYW0ocGFyYW0pIHtcbiAgICAgICAgcmV0dXJuIHBhcmFtICE9PSB1bmRlZmluZWQgJiYgcGFyYW0gIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkocGFyYW0pICYmIHR5cGVvZiBwYXJhbSA9PT0gJ29iamVjdCc7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXB1dGVTaW5nbGVQYXJhbShwYXJhbWV0ZXJTdHJ1Y3R1cmVzLCBwYXJhbSkge1xuICAgICAgICBzd2l0Y2ggKHBhcmFtZXRlclN0cnVjdHVyZXMpIHtcbiAgICAgICAgICAgIGNhc2UgbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG86XG4gICAgICAgICAgICAgICAgaWYgKGlzTmFtZWRQYXJhbShwYXJhbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxUb1VuZGVmaW5lZChwYXJhbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3VuZGVmaW5lZFRvTnVsbChwYXJhbSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZTpcbiAgICAgICAgICAgICAgICBpZiAoIWlzTmFtZWRQYXJhbShwYXJhbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWNlaXZlZCBwYXJhbWV0ZXJzIGJ5IG5hbWUgYnV0IHBhcmFtIGlzIG5vdCBhbiBvYmplY3QgbGl0ZXJhbC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGxUb1VuZGVmaW5lZChwYXJhbSk7XG4gICAgICAgICAgICBjYXNlIG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieVBvc2l0aW9uOlxuICAgICAgICAgICAgICAgIHJldHVybiBbdW5kZWZpbmVkVG9OdWxsKHBhcmFtKV07XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBwYXJhbWV0ZXIgc3RydWN0dXJlICR7cGFyYW1ldGVyU3RydWN0dXJlcy50b1N0cmluZygpfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXB1dGVNZXNzYWdlUGFyYW1zKHR5cGUsIHBhcmFtcykge1xuICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICBjb25zdCBudW1iZXJPZlBhcmFtcyA9IHR5cGUubnVtYmVyT2ZQYXJhbXM7XG4gICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gY29tcHV0ZVNpbmdsZVBhcmFtKHR5cGUucGFyYW1ldGVyU3RydWN0dXJlcywgcGFyYW1zWzBdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoICYmIGkgPCBudW1iZXJPZlBhcmFtczsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHVuZGVmaW5lZFRvTnVsbChwYXJhbXNbaV0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPCBudW1iZXJPZlBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gcGFyYW1zLmxlbmd0aDsgaSA8IG51bWJlck9mUGFyYW1zOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB7XG4gICAgICAgIHNlbmROb3RpZmljYXRpb246ICh0eXBlLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlUGFyYW1zO1xuICAgICAgICAgICAgaWYgKElzLnN0cmluZyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICAgIGxldCBwYXJhbVN0YXJ0ID0gMDtcbiAgICAgICAgICAgICAgICBsZXQgcGFyYW1ldGVyU3RydWN0dXJlcyA9IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvO1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuaXMoZmlyc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtU3RhcnQgPSAxO1xuICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gZmlyc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBwYXJhbUVuZCA9IGFyZ3MubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gcGFyYW1FbmQgLSBwYXJhbVN0YXJ0O1xuICAgICAgICAgICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zID0gY29tcHV0ZVNpbmdsZVBhcmFtKHBhcmFtZXRlclN0cnVjdHVyZXMsIGFyZ3NbcGFyYW1TdGFydF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjZWl2ZWQgJHtudW1iZXJPZlBhcmFtc30gcGFyYW1ldGVycyBmb3IgJ2J5IE5hbWUnIG5vdGlmaWNhdGlvbiBwYXJhbWV0ZXIgc3RydWN0dXJlLmApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IGFyZ3Muc2xpY2UocGFyYW1TdGFydCwgcGFyYW1FbmQpLm1hcCh2YWx1ZSA9PiB1bmRlZmluZWRUb051bGwodmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IGFyZ3M7XG4gICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZS5tZXRob2Q7XG4gICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IGNvbXB1dGVNZXNzYWdlUGFyYW1zKHR5cGUsIHBhcmFtcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBub3RpZmljYXRpb25NZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBtZXNzYWdlUGFyYW1zXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdHJhY2VTZW5kaW5nTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbk1lc3NhZ2UpO1xuICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2VXcml0ZXIud3JpdGUobm90aWZpY2F0aW9uTWVzc2FnZSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBTZW5kaW5nIG5vdGlmaWNhdGlvbiBmYWlsZWQuYCk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25Ob3RpZmljYXRpb246ICh0eXBlLCBoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGlmIChJcy5mdW5jKHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB0eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaGFuZGxlcikge1xuICAgICAgICAgICAgICAgIGlmIChJcy5zdHJpbmcodHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZTtcbiAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uSGFuZGxlcnMuc2V0KHR5cGUsIHsgdHlwZTogdW5kZWZpbmVkLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZS5tZXRob2Q7XG4gICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXJzLnNldCh0eXBlLm1ldGhvZCwgeyB0eXBlLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXJzLmRlbGV0ZShtZXRob2QpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBvblByb2dyZXNzOiAoX3R5cGUsIHRva2VuLCBoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgICBpZiAocHJvZ3Jlc3NIYW5kbGVycy5oYXModG9rZW4pKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm9ncmVzcyBoYW5kbGVyIGZvciB0b2tlbiAke3Rva2VufSBhbHJlYWR5IHJlZ2lzdGVyZWRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByb2dyZXNzSGFuZGxlcnMuc2V0KHRva2VuLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc0hhbmRsZXJzLmRlbGV0ZSh0b2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgc2VuZFByb2dyZXNzOiAoX3R5cGUsIHRva2VuLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGF3YWl0IGJ1dCBzaW1wbGUgcmV0dXJuIHRvIGVuc3VyZSB0aGF0IHdlIGRvbid0IGhhdmUgYW5vdGhlclxuICAgICAgICAgICAgLy8gYXN5bmMgc2NoZWR1bGluZy4gT3RoZXJ3aXNlIG9uZSBzZW5kIGNvdWxkIG92ZXJ0YWtlIGFub3RoZXIgc2VuZC5cbiAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLnNlbmROb3RpZmljYXRpb24oUHJvZ3Jlc3NOb3RpZmljYXRpb24udHlwZSwgeyB0b2tlbiwgdmFsdWUgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uVW5oYW5kbGVkUHJvZ3Jlc3M6IHVuaGFuZGxlZFByb2dyZXNzRW1pdHRlci5ldmVudCxcbiAgICAgICAgc2VuZFJlcXVlc3Q6ICh0eXBlLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgdGhyb3dJZk5vdExpc3RlbmluZygpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlUGFyYW1zO1xuICAgICAgICAgICAgbGV0IHRva2VuID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKElzLnN0cmluZyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3QgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgbGV0IHBhcmFtU3RhcnQgPSAwO1xuICAgICAgICAgICAgICAgIGxldCBwYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG87XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5pcyhmaXJzdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1TdGFydCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlclN0cnVjdHVyZXMgPSBmaXJzdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHBhcmFtRW5kID0gYXJncy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuLmlzKGxhc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtRW5kID0gcGFyYW1FbmQgLSAxO1xuICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IGxhc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gcGFyYW1FbmQgLSBwYXJhbVN0YXJ0O1xuICAgICAgICAgICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zID0gY29tcHV0ZVNpbmdsZVBhcmFtKHBhcmFtZXRlclN0cnVjdHVyZXMsIGFyZ3NbcGFyYW1TdGFydF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjZWl2ZWQgJHtudW1iZXJPZlBhcmFtc30gcGFyYW1ldGVycyBmb3IgJ2J5IE5hbWUnIHJlcXVlc3QgcGFyYW1ldGVyIHN0cnVjdHVyZS5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMgPSBhcmdzLnNsaWNlKHBhcmFtU3RhcnQsIHBhcmFtRW5kKS5tYXAodmFsdWUgPT4gdW5kZWZpbmVkVG9OdWxsKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBhcmdzO1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGUubWV0aG9kO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMgPSBjb21wdXRlTWVzc2FnZVBhcmFtcyh0eXBlLCBwYXJhbXMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gdHlwZS5udW1iZXJPZlBhcmFtcztcbiAgICAgICAgICAgICAgICB0b2tlbiA9IGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuLmlzKHBhcmFtc1tudW1iZXJPZlBhcmFtc10pID8gcGFyYW1zW251bWJlck9mUGFyYW1zXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGlkID0gc2VxdWVuY2VOdW1iZXIrKztcbiAgICAgICAgICAgIGxldCBkaXNwb3NhYmxlO1xuICAgICAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgICAgICAgZGlzcG9zYWJsZSA9IHRva2VuLm9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcCA9IGNhbmNlbGxhdGlvblN0cmF0ZWd5LnNlbmRlci5zZW5kQ2FuY2VsbGF0aW9uKGNvbm5lY3Rpb24sIGlkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhgUmVjZWl2ZWQgbm8gcHJvbWlzZSBmcm9tIGNhbmNlbGxhdGlvbiBzdHJhdGVneSB3aGVuIGNhbmNlbGxpbmcgaWQgJHtpZH1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIubG9nKGBTZW5kaW5nIGNhbmNlbGxhdGlvbiBtZXNzYWdlcyBmb3IgaWQgJHtpZH0gZmFpbGVkYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdE1lc3NhZ2UgPSB7XG4gICAgICAgICAgICAgICAganNvbnJwYzogdmVyc2lvbixcbiAgICAgICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBtZXNzYWdlUGFyYW1zXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdHJhY2VTZW5kaW5nUmVxdWVzdChyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNhbmNlbGxhdGlvblN0cmF0ZWd5LnNlbmRlci5lbmFibGVDYW5jZWxsYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25TdHJhdGVneS5zZW5kZXIuZW5hYmxlQ2FuY2VsbGF0aW9uKHJlcXVlc3RNZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZVdpdGhDbGVhbnVwID0gKHIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyKTtcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uU3RyYXRlZ3kuc2VuZGVyLmNsZWFudXAoaWQpO1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlPy5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWplY3RXaXRoQ2xlYW51cCA9IChyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChyKTtcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uU3RyYXRlZ3kuc2VuZGVyLmNsZWFudXAoaWQpO1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlPy5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZVByb21pc2UgPSB7IG1ldGhvZDogbWV0aG9kLCB0aW1lclN0YXJ0OiBEYXRlLm5vdygpLCByZXNvbHZlOiByZXNvbHZlV2l0aENsZWFudXAsIHJlamVjdDogcmVqZWN0V2l0aENsZWFudXAgfTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2VzLnNldChpZCwgcmVzcG9uc2VQcm9taXNlKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbWVzc2FnZVdyaXRlci53cml0ZShyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAvLyBXcml0aW5nIHRoZSBtZXNzYWdlIGZhaWxlZC4gU28gd2UgbmVlZCB0byBkZWxldGUgaXQgZnJvbSB0aGUgcmVzcG9uc2UgcHJvbWlzZXMgYW5kXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlamVjdCBpdC5cbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlcy5kZWxldGUoaWQpO1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2UucmVqZWN0KG5ldyBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IobWVzc2FnZXNfMS5FcnJvckNvZGVzLk1lc3NhZ2VXcml0ZUVycm9yLCBlcnJvci5tZXNzYWdlID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIHJlYXNvbicpKTtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlcXVlc3QgZmFpbGVkLmApO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25SZXF1ZXN0OiAodHlwZSwgaGFuZGxlcikgPT4ge1xuICAgICAgICAgICAgdGhyb3dJZkNsb3NlZE9yRGlzcG9zZWQoKTtcbiAgICAgICAgICAgIGxldCBtZXRob2QgPSBudWxsO1xuICAgICAgICAgICAgaWYgKFN0YXJSZXF1ZXN0SGFuZGxlci5pcyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBzdGFyUmVxdWVzdEhhbmRsZXIgPSB0eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoSXMuc3RyaW5nKHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgbWV0aG9kID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoaGFuZGxlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RIYW5kbGVycy5zZXQodHlwZSwgeyBoYW5kbGVyOiBoYW5kbGVyLCB0eXBlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSB0eXBlLm1ldGhvZDtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEhhbmRsZXJzLnNldCh0eXBlLm1ldGhvZCwgeyB0eXBlLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SGFuZGxlcnMuZGVsZXRlKG1ldGhvZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFyUmVxdWVzdEhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBoYXNQZW5kaW5nUmVzcG9uc2U6ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZVByb21pc2VzLnNpemUgPiAwO1xuICAgICAgICB9LFxuICAgICAgICB0cmFjZTogYXN5bmMgKF92YWx1ZSwgX3RyYWNlciwgc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBsZXQgX3NlbmROb3RpZmljYXRpb24gPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBfdHJhY2VGb3JtYXQgPSBUcmFjZUZvcm1hdC5UZXh0O1xuICAgICAgICAgICAgaWYgKHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKElzLmJvb2xlYW4oc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zKSkge1xuICAgICAgICAgICAgICAgICAgICBfc2VuZE5vdGlmaWNhdGlvbiA9IHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF9zZW5kTm90aWZpY2F0aW9uID0gc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zLnNlbmROb3RpZmljYXRpb24gfHwgZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIF90cmFjZUZvcm1hdCA9IHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucy50cmFjZUZvcm1hdCB8fCBUcmFjZUZvcm1hdC5UZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlID0gX3ZhbHVlO1xuICAgICAgICAgICAgdHJhY2VGb3JtYXQgPSBfdHJhY2VGb3JtYXQ7XG4gICAgICAgICAgICBpZiAodHJhY2UgPT09IFRyYWNlLk9mZikge1xuICAgICAgICAgICAgICAgIHRyYWNlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRyYWNlciA9IF90cmFjZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoX3NlbmROb3RpZmljYXRpb24gJiYgIWlzQ2xvc2VkKCkgJiYgIWlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGNvbm5lY3Rpb24uc2VuZE5vdGlmaWNhdGlvbihTZXRUcmFjZU5vdGlmaWNhdGlvbi50eXBlLCB7IHZhbHVlOiBUcmFjZS50b1N0cmluZyhfdmFsdWUpIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBvbkVycm9yOiBlcnJvckVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIG9uQ2xvc2U6IGNsb3NlRW1pdHRlci5ldmVudCxcbiAgICAgICAgb25VbmhhbmRsZWROb3RpZmljYXRpb246IHVuaGFuZGxlZE5vdGlmaWNhdGlvbkVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIG9uRGlzcG9zZTogZGlzcG9zZUVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIGVuZDogKCkgPT4ge1xuICAgICAgICAgICAgbWVzc2FnZVdyaXRlci5lbmQoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLkRpc3Bvc2VkO1xuICAgICAgICAgICAgZGlzcG9zZUVtaXR0ZXIuZmlyZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5QZW5kaW5nUmVzcG9uc2VSZWplY3RlZCwgJ1BlbmRpbmcgcmVzcG9uc2UgcmVqZWN0ZWQgc2luY2UgY29ubmVjdGlvbiBnb3QgZGlzcG9zZWQnKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvbWlzZSBvZiByZXNwb25zZVByb21pc2VzLnZhbHVlcygpKSB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBrbm93bkNhbmNlbGVkUmVxdWVzdHMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICBtZXNzYWdlUXVldWUgPSBuZXcgbGlua2VkTWFwXzEuTGlua2VkTWFwKCk7XG4gICAgICAgICAgICAvLyBUZXN0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgaWYgKElzLmZ1bmMobWVzc2FnZVdyaXRlci5kaXNwb3NlKSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKElzLmZ1bmMobWVzc2FnZVJlYWRlci5kaXNwb3NlKSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VSZWFkZXIuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBsaXN0ZW46ICgpID0+IHtcbiAgICAgICAgICAgIHRocm93SWZDbG9zZWRPckRpc3Bvc2VkKCk7XG4gICAgICAgICAgICB0aHJvd0lmTGlzdGVuaW5nKCk7XG4gICAgICAgICAgICBzdGF0ZSA9IENvbm5lY3Rpb25TdGF0ZS5MaXN0ZW5pbmc7XG4gICAgICAgICAgICBtZXNzYWdlUmVhZGVyLmxpc3RlbihjYWxsYmFjayk7XG4gICAgICAgIH0sXG4gICAgICAgIGluc3BlY3Q6ICgpID0+IHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS5jb25zb2xlLmxvZygnaW5zcGVjdCcpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25uZWN0aW9uLm9uTm90aWZpY2F0aW9uKExvZ1RyYWNlTm90aWZpY2F0aW9uLnR5cGUsIChwYXJhbXMpID0+IHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZlcmJvc2UgPSB0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdDtcbiAgICAgICAgdHJhY2VyLmxvZyhwYXJhbXMubWVzc2FnZSwgdmVyYm9zZSA/IHBhcmFtcy52ZXJib3NlIDogdW5kZWZpbmVkKTtcbiAgICB9KTtcbiAgICBjb25uZWN0aW9uLm9uTm90aWZpY2F0aW9uKFByb2dyZXNzTm90aWZpY2F0aW9uLnR5cGUsIChwYXJhbXMpID0+IHtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IHByb2dyZXNzSGFuZGxlcnMuZ2V0KHBhcmFtcy50b2tlbik7XG4gICAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICAgICBoYW5kbGVyKHBhcmFtcy52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1bmhhbmRsZWRQcm9ncmVzc0VtaXR0ZXIuZmlyZShwYXJhbXMpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbm5lY3Rpb247XG59XG5leHBvcnRzLmNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uID0gY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb247XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vdHlwaW5ncy90aGVuYWJsZS5kLnRzXCIgLz5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUHJvZ3Jlc3NUeXBlID0gZXhwb3J0cy5Qcm9ncmVzc1Rva2VuID0gZXhwb3J0cy5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiA9IGV4cG9ydHMuTnVsbExvZ2dlciA9IGV4cG9ydHMuQ29ubmVjdGlvbk9wdGlvbnMgPSBleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IGV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlQnVmZmVyID0gZXhwb3J0cy5Xcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyID0gZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLk1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLlJlYWRhYmxlU3RyZWFtTWVzc2FnZVJlYWRlciA9IGV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlUmVhZGVyID0gZXhwb3J0cy5NZXNzYWdlUmVhZGVyID0gZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblRva2VuID0gZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IGV4cG9ydHMuRW1pdHRlciA9IGV4cG9ydHMuRXZlbnQgPSBleHBvcnRzLkRpc3Bvc2FibGUgPSBleHBvcnRzLkxSVUNhY2hlID0gZXhwb3J0cy5Ub3VjaCA9IGV4cG9ydHMuTGlua2VkTWFwID0gZXhwb3J0cy5QYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlOSA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTggPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU3ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNiA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTUgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU0ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMyA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTIgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUxID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMCA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZSA9IGV4cG9ydHMuRXJyb3JDb2RlcyA9IGV4cG9ydHMuUmVzcG9uc2VFcnJvciA9IGV4cG9ydHMuUmVxdWVzdFR5cGU5ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTggPSBleHBvcnRzLlJlcXVlc3RUeXBlNyA9IGV4cG9ydHMuUmVxdWVzdFR5cGU2ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTUgPSBleHBvcnRzLlJlcXVlc3RUeXBlNCA9IGV4cG9ydHMuUmVxdWVzdFR5cGUzID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTIgPSBleHBvcnRzLlJlcXVlc3RUeXBlMSA9IGV4cG9ydHMuUmVxdWVzdFR5cGUwID0gZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IGV4cG9ydHMuTWVzc2FnZSA9IGV4cG9ydHMuUkFMID0gdm9pZCAwO1xuZXhwb3J0cy5NZXNzYWdlU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblN0cmF0ZWd5ID0gZXhwb3J0cy5DYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IGV4cG9ydHMuQ29ubmVjdGlvbkVycm9yID0gZXhwb3J0cy5Db25uZWN0aW9uRXJyb3JzID0gZXhwb3J0cy5Mb2dUcmFjZU5vdGlmaWNhdGlvbiA9IGV4cG9ydHMuU2V0VHJhY2VOb3RpZmljYXRpb24gPSBleHBvcnRzLlRyYWNlRm9ybWF0ID0gZXhwb3J0cy5UcmFjZVZhbHVlcyA9IGV4cG9ydHMuVHJhY2UgPSB2b2lkIDA7XG5jb25zdCBtZXNzYWdlc18xID0gcmVxdWlyZShcIi4vbWVzc2FnZXNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNZXNzYWdlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk1lc3NhZ2U7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlMFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTA7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTFcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGUxOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGUyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlMjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlM1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGU0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGU1XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlNTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlNlwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTY7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTdcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGU3OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGU4XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlODsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlOVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTk7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXNwb25zZUVycm9yXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3I7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJFcnJvckNvZGVzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLkVycm9yQ29kZXM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlMFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlMDsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGUxXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGUxOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZTJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlM1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlMzsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGU0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZTVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlNlwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlNjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGU3XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU3OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZThcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTg7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlOVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlOTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlBhcmFtZXRlclN0cnVjdHVyZXNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlczsgfSB9KTtcbmNvbnN0IGxpbmtlZE1hcF8xID0gcmVxdWlyZShcIi4vbGlua2VkTWFwXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTGlua2VkTWFwXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBsaW5rZWRNYXBfMS5MaW5rZWRNYXA7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJMUlVDYWNoZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbGlua2VkTWFwXzEuTFJVQ2FjaGU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJUb3VjaFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbGlua2VkTWFwXzEuVG91Y2g7IH0gfSk7XG5jb25zdCBkaXNwb3NhYmxlXzEgPSByZXF1aXJlKFwiLi9kaXNwb3NhYmxlXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiRGlzcG9zYWJsZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZGlzcG9zYWJsZV8xLkRpc3Bvc2FibGU7IH0gfSk7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCIuL2V2ZW50c1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkV2ZW50XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBldmVudHNfMS5FdmVudDsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkVtaXR0ZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGV2ZW50c18xLkVtaXR0ZXI7IH0gfSk7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblRva2VuU291cmNlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjYW5jZWxsYXRpb25fMS5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblRva2VuXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjYW5jZWxsYXRpb25fMS5DYW5jZWxsYXRpb25Ub2tlbjsgfSB9KTtcbmNvbnN0IHNoYXJlZEFycmF5Q2FuY2VsbGF0aW9uXzEgPSByZXF1aXJlKFwiLi9zaGFyZWRBcnJheUNhbmNlbGxhdGlvblwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHNoYXJlZEFycmF5Q2FuY2VsbGF0aW9uXzEuU2hhcmVkQXJyYXlTZW5kZXJTdHJhdGVneTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlNoYXJlZEFycmF5UmVjZWl2ZXJTdHJhdGVneVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gc2hhcmVkQXJyYXlDYW5jZWxsYXRpb25fMS5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3k7IH0gfSk7XG5jb25zdCBtZXNzYWdlUmVhZGVyXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlUmVhZGVyXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTWVzc2FnZVJlYWRlclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZVJlYWRlcl8xLk1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VSZWFkZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VSZWFkZXJfMS5BYnN0cmFjdE1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VSZWFkZXJfMS5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5jb25zdCBtZXNzYWdlV3JpdGVyXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlV3JpdGVyXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTWVzc2FnZVdyaXRlclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZVdyaXRlcl8xLk1lc3NhZ2VXcml0ZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VXcml0ZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VXcml0ZXJfMS5BYnN0cmFjdE1lc3NhZ2VXcml0ZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJXcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlV3JpdGVyXzEuV3JpdGVhYmxlU3RyZWFtTWVzc2FnZVdyaXRlcjsgfSB9KTtcbmNvbnN0IG1lc3NhZ2VCdWZmZXJfMSA9IHJlcXVpcmUoXCIuL21lc3NhZ2VCdWZmZXJcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VCdWZmZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VCdWZmZXJfMS5BYnN0cmFjdE1lc3NhZ2VCdWZmZXI7IH0gfSk7XG5jb25zdCBjb25uZWN0aW9uXzEgPSByZXF1aXJlKFwiLi9jb25uZWN0aW9uXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29ubmVjdGlvblN0cmF0ZWd5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ29ubmVjdGlvblN0cmF0ZWd5OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29ubmVjdGlvbk9wdGlvbnNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5Db25uZWN0aW9uT3B0aW9uczsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk51bGxMb2dnZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5OdWxsTG9nZ2VyOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb25cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlByb2dyZXNzVG9rZW5cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5Qcm9ncmVzc1Rva2VuOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUHJvZ3Jlc3NUeXBlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuUHJvZ3Jlc3NUeXBlOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiVHJhY2VcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5UcmFjZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlRyYWNlVmFsdWVzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuVHJhY2VWYWx1ZXM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJUcmFjZUZvcm1hdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29ubmVjdGlvbl8xLlRyYWNlRm9ybWF0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiU2V0VHJhY2VOb3RpZmljYXRpb25cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5TZXRUcmFjZU5vdGlmaWNhdGlvbjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkxvZ1RyYWNlTm90aWZpY2F0aW9uXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuTG9nVHJhY2VOb3RpZmljYXRpb247IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJDb25uZWN0aW9uRXJyb3JzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ29ubmVjdGlvbkVycm9yczsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNvbm5lY3Rpb25FcnJvclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29ubmVjdGlvbl8xLkNvbm5lY3Rpb25FcnJvcjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5DYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5DYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblN0cmF0ZWd5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ2FuY2VsbGF0aW9uU3RyYXRlZ3k7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNZXNzYWdlU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5NZXNzYWdlU3RyYXRlZ3k7IH0gfSk7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbmV4cG9ydHMuUkFMID0gcmFsXzEuZGVmYXVsdDtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGFwaV8xID0gcmVxdWlyZShcIi4uL2NvbW1vbi9hcGlcIik7XG5jbGFzcyBNZXNzYWdlQnVmZmVyIGV4dGVuZHMgYXBpXzEuQWJzdHJhY3RNZXNzYWdlQnVmZmVyIHtcbiAgICBjb25zdHJ1Y3RvcihlbmNvZGluZyA9ICd1dGYtOCcpIHtcbiAgICAgICAgc3VwZXIoZW5jb2RpbmcpO1xuICAgICAgICB0aGlzLmFzY2lpRGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcignYXNjaWknKTtcbiAgICB9XG4gICAgZW1wdHlCdWZmZXIoKSB7XG4gICAgICAgIHJldHVybiBNZXNzYWdlQnVmZmVyLmVtcHR5QnVmZmVyO1xuICAgIH1cbiAgICBmcm9tU3RyaW5nKHZhbHVlLCBfZW5jb2RpbmcpIHtcbiAgICAgICAgcmV0dXJuIChuZXcgVGV4dEVuY29kZXIoKSkuZW5jb2RlKHZhbHVlKTtcbiAgICB9XG4gICAgdG9TdHJpbmcodmFsdWUsIGVuY29kaW5nKSB7XG4gICAgICAgIGlmIChlbmNvZGluZyA9PT0gJ2FzY2lpJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXNjaWlEZWNvZGVyLmRlY29kZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gKG5ldyBUZXh0RGVjb2RlcihlbmNvZGluZykpLmRlY29kZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXNOYXRpdmUoYnVmZmVyLCBsZW5ndGgpIHtcbiAgICAgICAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlci5zbGljZSgwLCBsZW5ndGgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFsbG9jTmF0aXZlKGxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTtcbiAgICB9XG59XG5NZXNzYWdlQnVmZmVyLmVtcHR5QnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMCk7XG5jbGFzcyBSZWFkYWJsZVN0cmVhbVdyYXBwZXIge1xuICAgIGNvbnN0cnVjdG9yKHNvY2tldCkge1xuICAgICAgICB0aGlzLnNvY2tldCA9IHNvY2tldDtcbiAgICAgICAgdGhpcy5fb25EYXRhID0gbmV3IGFwaV8xLkVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5fbWVzc2FnZUxpc3RlbmVyID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBibG9iID0gZXZlbnQuZGF0YTtcbiAgICAgICAgICAgIGJsb2IuYXJyYXlCdWZmZXIoKS50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkRhdGEuZmlyZShuZXcgVWludDhBcnJheShidWZmZXIpKTtcbiAgICAgICAgICAgIH0sICgpID0+IHtcbiAgICAgICAgICAgICAgICAoMCwgYXBpXzEuUkFMKSgpLmNvbnNvbGUuZXJyb3IoYENvbnZlcnRpbmcgYmxvYiB0byBhcnJheSBidWZmZXIgZmFpbGVkLmApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLl9tZXNzYWdlTGlzdGVuZXIpO1xuICAgIH1cbiAgICBvbkNsb3NlKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2Nsb3NlJywgbGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gYXBpXzEuRGlzcG9zYWJsZS5jcmVhdGUoKCkgPT4gdGhpcy5zb2NrZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xvc2UnLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkVycm9yKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgbGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gYXBpXzEuRGlzcG9zYWJsZS5jcmVhdGUoKCkgPT4gdGhpcy5zb2NrZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkVuZChsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKCdlbmQnLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdlbmQnLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkRhdGEobGlzdGVuZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uRGF0YS5ldmVudChsaXN0ZW5lcik7XG4gICAgfVxufVxuY2xhc3MgV3JpdGFibGVTdHJlYW1XcmFwcGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihzb2NrZXQpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7XG4gICAgfVxuICAgIG9uQ2xvc2UobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignY2xvc2UnLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbG9zZScsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIG9uRXJyb3IobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIG9uRW5kKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2VuZCcsIGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIGFwaV8xLkRpc3Bvc2FibGUuY3JlYXRlKCgpID0+IHRoaXMuc29ja2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2VuZCcsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIHdyaXRlKGRhdGEsIGVuY29kaW5nKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkICYmIGVuY29kaW5nICE9PSAndXRmLTgnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbiBhIEJyb3dzZXIgZW52aXJvbm1lbnRzIG9ubHkgdXRmLTggdGV4dCBlbmNvZGluZyBpcyBzdXBwb3J0ZWQuIEJ1dCBnb3QgZW5jb2Rpbmc6ICR7ZW5jb2Rpbmd9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKTtcbiAgICB9XG59XG5jb25zdCBfdGV4dEVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbmNvbnN0IF9yaWwgPSBPYmplY3QuZnJlZXplKHtcbiAgICBtZXNzYWdlQnVmZmVyOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgY3JlYXRlOiAoZW5jb2RpbmcpID0+IG5ldyBNZXNzYWdlQnVmZmVyKGVuY29kaW5nKVxuICAgIH0pLFxuICAgIGFwcGxpY2F0aW9uSnNvbjogT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGVuY29kZXI6IE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgbmFtZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgZW5jb2RlOiAobXNnLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2hhcnNldCAhPT0gJ3V0Zi04Jykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluIGEgQnJvd3NlciBlbnZpcm9ubWVudHMgb25seSB1dGYtOCB0ZXh0IGVuY29kaW5nIGlzIHN1cHBvcnRlZC4gQnV0IGdvdCBlbmNvZGluZzogJHtvcHRpb25zLmNoYXJzZXR9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoX3RleHRFbmNvZGVyLmVuY29kZShKU09OLnN0cmluZ2lmeShtc2csIHVuZGVmaW5lZCwgMCkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIGRlY29kZXI6IE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgbmFtZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgZGVjb2RlOiAoYnVmZmVyLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCEoYnVmZmVyIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbiBhIEJyb3dzZXIgZW52aXJvbm1lbnRzIG9ubHkgVWludDhBcnJheXMgYXJlIHN1cHBvcnRlZC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShKU09OLnBhcnNlKG5ldyBUZXh0RGVjb2RlcihvcHRpb25zLmNoYXJzZXQpLmRlY29kZShidWZmZXIpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfSksXG4gICAgc3RyZWFtOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgYXNSZWFkYWJsZVN0cmVhbTogKHNvY2tldCkgPT4gbmV3IFJlYWRhYmxlU3RyZWFtV3JhcHBlcihzb2NrZXQpLFxuICAgICAgICBhc1dyaXRhYmxlU3RyZWFtOiAoc29ja2V0KSA9PiBuZXcgV3JpdGFibGVTdHJlYW1XcmFwcGVyKHNvY2tldClcbiAgICB9KSxcbiAgICBjb25zb2xlOiBjb25zb2xlLFxuICAgIHRpbWVyOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgc2V0VGltZW91dChjYWxsYmFjaywgbXMsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHNldFRpbWVvdXQoY2FsbGJhY2ssIG1zLCAuLi5hcmdzKTtcbiAgICAgICAgICAgIHJldHVybiB7IGRpc3Bvc2U6ICgpID0+IGNsZWFyVGltZW91dChoYW5kbGUpIH07XG4gICAgICAgIH0sXG4gICAgICAgIHNldEltbWVkaWF0ZShjYWxsYmFjaywgLi4uYXJncykge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gc2V0VGltZW91dChjYWxsYmFjaywgMCwgLi4uYXJncyk7XG4gICAgICAgICAgICByZXR1cm4geyBkaXNwb3NlOiAoKSA9PiBjbGVhclRpbWVvdXQoaGFuZGxlKSB9O1xuICAgICAgICB9LFxuICAgICAgICBzZXRJbnRlcnZhbChjYWxsYmFjaywgbXMsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHNldEludGVydmFsKGNhbGxiYWNrLCBtcywgLi4uYXJncyk7XG4gICAgICAgICAgICByZXR1cm4geyBkaXNwb3NlOiAoKSA9PiBjbGVhckludGVydmFsKGhhbmRsZSkgfTtcbiAgICAgICAgfSxcbiAgICB9KVxufSk7XG5mdW5jdGlvbiBSSUwoKSB7XG4gICAgcmV0dXJuIF9yaWw7XG59XG4oZnVuY3Rpb24gKFJJTCkge1xuICAgIGZ1bmN0aW9uIGluc3RhbGwoKSB7XG4gICAgICAgIGFwaV8xLlJBTC5pbnN0YWxsKF9yaWwpO1xuICAgIH1cbiAgICBSSUwuaW5zdGFsbCA9IGluc3RhbGw7XG59KShSSUwgfHwgKFJJTCA9IHt9KSk7XG5leHBvcnRzLmRlZmF1bHQgPSBSSUw7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24gPSBleHBvcnRzLkJyb3dzZXJNZXNzYWdlV3JpdGVyID0gZXhwb3J0cy5Ccm93c2VyTWVzc2FnZVJlYWRlciA9IHZvaWQgMDtcbmNvbnN0IHJpbF8xID0gcmVxdWlyZShcIi4vcmlsXCIpO1xuLy8gSW5zdGFsbCB0aGUgYnJvd3NlciBydW50aW1lIGFic3RyYWN0LlxucmlsXzEuZGVmYXVsdC5pbnN0YWxsKCk7XG5jb25zdCBhcGlfMSA9IHJlcXVpcmUoXCIuLi9jb21tb24vYXBpXCIpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuLi9jb21tb24vYXBpXCIpLCBleHBvcnRzKTtcbmNsYXNzIEJyb3dzZXJNZXNzYWdlUmVhZGVyIGV4dGVuZHMgYXBpXzEuQWJzdHJhY3RNZXNzYWdlUmVhZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihwb3J0KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX29uRGF0YSA9IG5ldyBhcGlfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuX21lc3NhZ2VMaXN0ZW5lciA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fb25EYXRhLmZpcmUoZXZlbnQuZGF0YSk7XG4gICAgICAgIH07XG4gICAgICAgIHBvcnQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoZXZlbnQpID0+IHRoaXMuZmlyZUVycm9yKGV2ZW50KSk7XG4gICAgICAgIHBvcnQub25tZXNzYWdlID0gdGhpcy5fbWVzc2FnZUxpc3RlbmVyO1xuICAgIH1cbiAgICBsaXN0ZW4oY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uRGF0YS5ldmVudChjYWxsYmFjayk7XG4gICAgfVxufVxuZXhwb3J0cy5Ccm93c2VyTWVzc2FnZVJlYWRlciA9IEJyb3dzZXJNZXNzYWdlUmVhZGVyO1xuY2xhc3MgQnJvd3Nlck1lc3NhZ2VXcml0ZXIgZXh0ZW5kcyBhcGlfMS5BYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKHBvcnQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50ID0gMDtcbiAgICAgICAgcG9ydC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIChldmVudCkgPT4gdGhpcy5maXJlRXJyb3IoZXZlbnQpKTtcbiAgICB9XG4gICAgd3JpdGUobXNnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnBvcnQucG9zdE1lc3NhZ2UobXNnKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IsIG1zZyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZUVycm9yKGVycm9yLCBtc2cpIHtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50Kys7XG4gICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yLCBtc2csIHRoaXMuZXJyb3JDb3VudCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICB9XG59XG5leHBvcnRzLkJyb3dzZXJNZXNzYWdlV3JpdGVyID0gQnJvd3Nlck1lc3NhZ2VXcml0ZXI7XG5mdW5jdGlvbiBjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbihyZWFkZXIsIHdyaXRlciwgbG9nZ2VyLCBvcHRpb25zKSB7XG4gICAgaWYgKGxvZ2dlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxvZ2dlciA9IGFwaV8xLk51bGxMb2dnZXI7XG4gICAgfVxuICAgIGlmIChhcGlfMS5Db25uZWN0aW9uU3RyYXRlZ3kuaXMob3B0aW9ucykpIHtcbiAgICAgICAgb3B0aW9ucyA9IHsgY29ubmVjdGlvblN0cmF0ZWd5OiBvcHRpb25zIH07XG4gICAgfVxuICAgIHJldHVybiAoMCwgYXBpXzEuY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24pKHJlYWRlciwgd3JpdGVyLCBsb2dnZXIsIG9wdGlvbnMpO1xufVxuZXhwb3J0cy5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiA9IGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uO1xuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL2Jyb3dzZXIvbWFpbicpOyIsICIvKlxuICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMjYgRWNsaXBzZSBEaXJpZ2libGUgY29udHJpYnV0b3JzXG4gKlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlXG4gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2Mi4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG4gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MjAuaHRtbFxuICpcbiAqIFNQRFgtRmlsZUNvcHlyaWdodFRleHQ6IEVjbGlwc2UgRGlyaWdpYmxlIGNvbnRyaWJ1dG9ycyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbi8qKlxuICogSmF2YSBMU1AgY2xpZW50IGJ1bmRsZS5cbiAqXG4gKiBVc2VzIHZzY29kZS13cy1qc29ucnBjIGZvciB0eXBlZCBKU09OLVJQQyBvdmVyIFdlYlNvY2tldCBhbmQgcmVnaXN0ZXJzIE1vbmFjb1xuICogcHJvdmlkZXJzIHRoYXQgZGVsZWdhdGUgdG8gSkRULkxTLiBFeHBvc2VkIGFzIGdsb2JhbCBKYXZhTHNwQ2xpZW50TGliIHNvIHRoYXRcbiAqIGVkaXRvci5qcyBjYW4gY2FsbCBKYXZhTHNwQ2xpZW50TGliLmNvbm5lY3QocmVzb3VyY2VQYXRoKS5cbiAqXG4gKiBPbmUgSkRULkxTIHByb2Nlc3MgY292ZXJzIHRoZSBlbnRpcmUgd29ya3NwYWNlLCBzbyBhIHNpbmdsZSBXZWJTb2NrZXQgY29ubmVjdGlvblxuICogaXMgc2hhcmVkIGFjcm9zcyBhbGwgSmF2YSBmaWxlcyBvcGVuIGluIHRoZSBzYW1lIGJyb3dzZXIgcGFnZS4gVGhlIGNvbm5lY3Rpb24gaXNcbiAqIGVzdGFibGlzaGVkIG9uIHRoZSBmaXJzdCBjb25uZWN0KCkgY2FsbCBhbmQgcmV1c2VkIGZvciBhbGwgc3Vic2VxdWVudCBjYWxscy5cbiAqXG4gKiBlZGl0b3IuanMgc2V0cyB3aW5kb3cubW9uYWNvIGJlZm9yZSBjYWxsaW5nIGNvbm5lY3QoKSwgc28gdGhlIG1vbmFjby1zaGltJ3MgbGF6eVxuICogUHJveGllcyByZXNvbHZlIGNvcnJlY3RseSBhdCBjYWxsIHRpbWUuXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24sIE1lc3NhZ2VDb25uZWN0aW9uIH0gZnJvbSAndnNjb2RlLWpzb25ycGMvYnJvd3Nlcic7XG5pbXBvcnQgeyB0b1NvY2tldCwgV2ViU29ja2V0TWVzc2FnZVJlYWRlciwgV2ViU29ja2V0TWVzc2FnZVdyaXRlciB9IGZyb20gJ3ZzY29kZS13cy1qc29ucnBjJztcbmltcG9ydCAqIGFzIG1vbmFjbyBmcm9tICdtb25hY28tZWRpdG9yJztcbmltcG9ydCB7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLFxuICAgIERpYWdub3N0aWNTZXZlcml0eSxcbiAgICBJbnNlcnRUZXh0Rm9ybWF0LFxuICAgIE1hcmt1cENvbnRlbnQsXG4gICAgTWFya3VwS2luZCxcbiAgICB0eXBlIENvbXBsZXRpb25JdGVtLFxuICAgIHR5cGUgQ29tcGxldGlvbkxpc3QsXG4gICAgdHlwZSBEaWFnbm9zdGljLFxuICAgIHR5cGUgSG92ZXIsXG4gICAgdHlwZSBMb2NhdGlvbixcbiAgICB0eXBlIFBhcmFtZXRlckluZm9ybWF0aW9uLFxuICAgIHR5cGUgU2lnbmF0dXJlSGVscCxcbiAgICB0eXBlIFNpZ25hdHVyZUluZm9ybWF0aW9uLFxufSBmcm9tICd2c2NvZGUtbGFuZ3VhZ2VzZXJ2ZXItdHlwZXMnO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBTaW5nbGV0b24gc3RhdGVcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIFNoYXJlZCBjb25uZWN0aW9uIFx1MjAxNCBvbmUgcGVyIGJyb3dzZXIgcGFnZSwgY292ZXJpbmcgYWxsIHByb2plY3RzIGluIHRoZSB3b3Jrc3BhY2UuICovXG5sZXQgX2Nvbm46IE1lc3NhZ2VDb25uZWN0aW9uIHwgbnVsbCA9IG51bGw7XG5cbi8qKlxuICogVmlydHVhbCB3b3Jrc3BhY2Ugcm9vdCBVUkksIGUuZy4ge0Bjb2RlIGZpbGU6Ly8vd29ya3NwYWNlL3dvcmtzcGFjZS99LlxuICogU2V0IG9uY2Ugb24gZmlyc3QgY29ubmVjdCgpOyB1c2VkIHRvIHNjb3BlIE1vbmFjbyBwcm92aWRlcnMgdG8gd29ya3NwYWNlIGZpbGVzLlxuICovXG5sZXQgX3dvcmtzcGFjZVJvb3QgPSAnJztcblxuLyoqIFVSSXMgZm9yIHdoaWNoIHRleHREb2N1bWVudC9kaWRPcGVuIGhhcyBhbHJlYWR5IGJlZW4gc2VudC4gKi9cbmNvbnN0IF9vcGVuRmlsZXM6IFNldDxzdHJpbmc+ID0gbmV3IFNldCgpO1xuXG5sZXQgX3Byb3ZpZGVyc1JlZ2lzdGVyZWQgPSBmYWxzZTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gUHVibGljIEFQSVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogQ2FsbGVkIGJ5IGVkaXRvci5qcyB3aGVuIGEgSmF2YSBmaWxlIGlzIG9wZW5lZC4gU2FmZSB0byBjYWxsIG11bHRpcGxlIHRpbWVzLiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNvbm5lY3QocmVzb3VyY2VQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBwYXJ0cyA9IHJlc291cmNlUGF0aC5yZXBsYWNlKC9eXFwvLywgJycpLnNwbGl0KCcvJyk7XG4gICAgY29uc3Qgd29ya3NwYWNlID0gcGFydHNbMF07XG4gICAgY29uc3QgcHJvamVjdCAgID0gcGFydHNbMV07XG4gICAgY29uc3QgZmlsZVVyaSA9IGBmaWxlOi8vL3dvcmtzcGFjZS8ke3dvcmtzcGFjZX0vJHtwcm9qZWN0fS8ke3BhcnRzLnNsaWNlKDIpLmpvaW4oJy8nKX1gO1xuXG4gICAgaWYgKF9jb25uKSB7XG4gICAgICAgIC8vIENvbm5lY3Rpb24gYWxyZWFkeSBlc3RhYmxpc2hlZCBcdTIwMTQganVzdCBvcGVuIHRoZSBuZXcgZmlsZS5cbiAgICAgICAgb3BlbkZpbGUoZmlsZVVyaSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBfd29ya3NwYWNlUm9vdCA9IGBmaWxlOi8vL3dvcmtzcGFjZS8ke3dvcmtzcGFjZX0vYDtcblxuICAgIGNvbnN0IHByb3RvID0gbG9jYXRpb24ucHJvdG9jb2wgPT09ICdodHRwczonID8gJ3dzcycgOiAnd3MnO1xuICAgIGNvbnN0IHdzVXJsID0gYCR7cHJvdG99Oi8vJHtsb2NhdGlvbi5ob3N0fS93ZWJzb2NrZXRzL2lkZS9qYXZhLWxzcGBcbiAgICAgICAgICAgICAgICArIGA/d29ya3NwYWNlPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHdvcmtzcGFjZSl9YDtcblxuICAgIGNvbnN0IHdzID0gbmV3IFdlYlNvY2tldCh3c1VybCk7XG4gICAgYXdhaXQgbmV3IFByb21pc2U8dm9pZD4oKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICB3cy5vbm9wZW4gID0gKCkgPT4gcmVzb2x2ZSgpO1xuICAgICAgICB3cy5vbmVycm9yID0gKCkgPT4gcmVqZWN0KG5ldyBFcnJvcihgW2phdmEtbHNwXSBXZWJTb2NrZXQgY29ubmVjdCBmYWlsZWQ6ICR7d3NVcmx9YCkpO1xuICAgIH0pO1xuXG4gICAgY29uc3Qgc29ja2V0ID0gdG9Tb2NrZXQod3MpO1xuICAgIGNvbnN0IHJlYWRlciA9IG5ldyBXZWJTb2NrZXRNZXNzYWdlUmVhZGVyKHNvY2tldCk7XG4gICAgY29uc3Qgd3JpdGVyID0gbmV3IFdlYlNvY2tldE1lc3NhZ2VXcml0ZXIoc29ja2V0KTtcbiAgICBfY29ubiA9IGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uKHJlYWRlciwgd3JpdGVyKTtcblxuICAgIC8vIERpYWdub3N0aWNzIG5vdGlmaWNhdGlvbiBcdTIxOTIgTW9uYWNvIG1hcmtlcnMgKGFwcGxpZXMgdG8gYW55IHdvcmtzcGFjZSBmaWxlKVxuICAgIF9jb25uLm9uTm90aWZpY2F0aW9uKCd0ZXh0RG9jdW1lbnQvcHVibGlzaERpYWdub3N0aWNzJywgKHBhcmFtczogeyB1cmk6IHN0cmluZzsgZGlhZ25vc3RpY3M6IERpYWdub3N0aWNbXSB9KSA9PiB7XG4gICAgICAgIGNvbnN0IG1vZGVsID0gbW9uYWNvLmVkaXRvci5nZXRNb2RlbHMoKS5maW5kKG0gPT4gbS51cmkudG9TdHJpbmcoKSA9PT0gcGFyYW1zLnVyaSk7XG4gICAgICAgIGlmICghbW9kZWwpIHJldHVybjtcbiAgICAgICAgbW9uYWNvLmVkaXRvci5zZXRNb2RlbE1hcmtlcnMobW9kZWwsICdqYXZhLWxzcCcsIHBhcmFtcy5kaWFnbm9zdGljcy5tYXAoZCA9PiAoe1xuICAgICAgICAgICAgc2V2ZXJpdHk6ICAgICAgICBsc3BTZXZlcml0eShkLnNldmVyaXR5KSxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICAgICAgICAgZC5tZXNzYWdlLFxuICAgICAgICAgICAgc291cmNlOiAgICAgICAgICBkLnNvdXJjZSA/PyAnamF2YScsXG4gICAgICAgICAgICBzdGFydExpbmVOdW1iZXI6IGQucmFuZ2Uuc3RhcnQubGluZSArIDEsXG4gICAgICAgICAgICBzdGFydENvbHVtbjogICAgIGQucmFuZ2Uuc3RhcnQuY2hhcmFjdGVyICsgMSxcbiAgICAgICAgICAgIGVuZExpbmVOdW1iZXI6ICAgZC5yYW5nZS5lbmQubGluZSArIDEsXG4gICAgICAgICAgICBlbmRDb2x1bW46ICAgICAgIGQucmFuZ2UuZW5kLmNoYXJhY3RlciArIDEsXG4gICAgICAgIH0pKSk7XG4gICAgfSk7XG5cbiAgICBfY29ubi5saXN0ZW4oKTtcblxuICAgIGNvbnN0IHJvb3RVcmkgPSBfd29ya3NwYWNlUm9vdDtcbiAgICBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgnaW5pdGlhbGl6ZScsIHtcbiAgICAgICAgcHJvY2Vzc0lkOiBudWxsLFxuICAgICAgICByb290VXJpLFxuICAgICAgICBpbml0aWFsaXphdGlvbk9wdGlvbnM6IHtcbiAgICAgICAgICAgIHNldHRpbmdzOiBqZHRsc1NldHRpbmdzKCksXG4gICAgICAgICAgICBleHRlbmRlZENsaWVudENhcGFiaWxpdGllczoge1xuICAgICAgICAgICAgICAgIHByb2dyZXNzUmVwb3J0UHJvdmlkZXI6ICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAgIGNsYXNzRmlsZUNvbnRlbnRzU3VwcG9ydDogICAgIHRydWUsXG4gICAgICAgICAgICAgICAgcmVzb2x2ZUFkZGl0aW9uYWxUZXh0RWRpdHNTdXBwb3J0OiB0cnVlLFxuICAgICAgICAgICAgICAgIGluZmVyU2VsZWN0aW9uU3VwcG9ydDogICAgICAgIFtdLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgd29ya3NwYWNlRm9sZGVyczogW3sgdXJpOiByb290VXJpLCBuYW1lOiB3b3Jrc3BhY2UgfV0sXG4gICAgICAgIGNhcGFiaWxpdGllczoge1xuICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7XG4gICAgICAgICAgICAgICAgc3luY2hyb25pemF0aW9uOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUsIHdpbGxTYXZlOiBmYWxzZSwgZGlkU2F2ZTogdHJ1ZSwgd2lsbFNhdmVXYWl0VW50aWw6IGZhbHNlIH0sXG4gICAgICAgICAgICAgICAgY29tcGxldGlvbjoge1xuICAgICAgICAgICAgICAgICAgICBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uSXRlbTogeyBzbmlwcGV0U3VwcG9ydDogdHJ1ZSwgZG9jdW1lbnRhdGlvbkZvcm1hdDogWydtYXJrZG93bicsICdwbGFpbnRleHQnXSwgZGVwcmVjYXRlZFN1cHBvcnQ6IHRydWUsIGNvbW1pdENoYXJhY3RlcnNTdXBwb3J0OiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHRTdXBwb3J0OiB0cnVlLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgaG92ZXI6ICAgICAgICAgIHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSwgY29udGVudEZvcm1hdDogWydtYXJrZG93bicsICdwbGFpbnRleHQnXSB9LFxuICAgICAgICAgICAgICAgIHNpZ25hdHVyZUhlbHA6ICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUsIHNpZ25hdHVyZUluZm9ybWF0aW9uOiB7IGRvY3VtZW50YXRpb25Gb3JtYXQ6IFsnbWFya2Rvd24nLCAncGxhaW50ZXh0J10sIHBhcmFtZXRlckluZm9ybWF0aW9uOiB7IGxhYmVsT2Zmc2V0U3VwcG9ydDogdHJ1ZSB9IH0gfSxcbiAgICAgICAgICAgICAgICBkZWZpbml0aW9uOiAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgcHVibGlzaERpYWdub3N0aWNzOiB7IHJlbGF0ZWRJbmZvcm1hdGlvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdvcmtzcGFjZTogeyBjb25maWd1cmF0aW9uOiB0cnVlLCBkaWRDaGFuZ2VDb25maWd1cmF0aW9uOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSB9LFxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgX2Nvbm4uc2VuZE5vdGlmaWNhdGlvbignaW5pdGlhbGl6ZWQnLCB7fSk7XG4gICAgX2Nvbm4uc2VuZE5vdGlmaWNhdGlvbignd29ya3NwYWNlL2RpZENoYW5nZUNvbmZpZ3VyYXRpb24nLCB7IHNldHRpbmdzOiBqZHRsc1NldHRpbmdzKCkgfSk7XG5cbiAgICBvcGVuRmlsZShmaWxlVXJpKTtcblxuICAgIGlmICghX3Byb3ZpZGVyc1JlZ2lzdGVyZWQpIHtcbiAgICAgICAgX3Byb3ZpZGVyc1JlZ2lzdGVyZWQgPSB0cnVlO1xuICAgICAgICByZWdpc3RlclByb3ZpZGVycygpO1xuICAgIH1cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRmlsZSBsaWZlY3ljbGVcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBTZW5kcyB0ZXh0RG9jdW1lbnQvZGlkT3BlbiBmb3IgdGhlIGdpdmVuIFVSSSAoaWYgbm90IGFscmVhZHkgc2VudCkgYW5kIHJlZ2lzdGVycyBhIGRlYm91bmNlZFxuICogdGV4dERvY3VtZW50L2RpZENoYW5nZSBsaXN0ZW5lciBvbiB0aGUgY29ycmVzcG9uZGluZyBNb25hY28gbW9kZWwuXG4gKi9cbmZ1bmN0aW9uIG9wZW5GaWxlKGZpbGVVcmk6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChfb3BlbkZpbGVzLmhhcyhmaWxlVXJpKSB8fCAhX2Nvbm4pIHJldHVybjtcbiAgICBfb3BlbkZpbGVzLmFkZChmaWxlVXJpKTtcblxuICAgIGNvbnN0IG1vZGVsID0gbW9uYWNvLmVkaXRvci5nZXRNb2RlbHMoKS5maW5kKG0gPT4gbS51cmkudG9TdHJpbmcoKSA9PT0gZmlsZVVyaSk7XG4gICAgX2Nvbm4uc2VuZE5vdGlmaWNhdGlvbigndGV4dERvY3VtZW50L2RpZE9wZW4nLCB7XG4gICAgICAgIHRleHREb2N1bWVudDoge1xuICAgICAgICAgICAgdXJpOiAgICAgICAgZmlsZVVyaSxcbiAgICAgICAgICAgIGxhbmd1YWdlSWQ6ICdqYXZhJyxcbiAgICAgICAgICAgIHZlcnNpb246ICAgIDEsXG4gICAgICAgICAgICB0ZXh0OiAgICAgICBtb2RlbD8uZ2V0VmFsdWUoKSA/PyAnJyxcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIGlmIChtb2RlbCkge1xuICAgICAgICBsZXQgdGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+O1xuICAgICAgICBtb2RlbC5vbkRpZENoYW5nZUNvbnRlbnQoKCkgPT4ge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgICAgIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgX2Nvbm4/LnNlbmROb3RpZmljYXRpb24oJ3RleHREb2N1bWVudC9kaWRDaGFuZ2UnLCB7XG4gICAgICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogICB7IHVyaTogZmlsZVVyaSwgdmVyc2lvbjogbW9kZWwuZ2V0VmVyc2lvbklkKCkgfSxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudENoYW5nZXM6IFt7IHRleHQ6IG1vZGVsLmdldFZhbHVlKCkgfV0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LCA0MDApO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFdvcmtzcGFjZSBmaWxlIHByZWRpY2F0ZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFJldHVybnMge0Bjb2RlIHRydWV9IHdoZW4gdGhlIGdpdmVuIG1vZGVsIFVSSSBiZWxvbmdzIHRvIHRoZSBjdXJyZW50bHkgY29ubmVjdGVkIHdvcmtzcGFjZS4gVXNlZFxuICogYnkgTW9uYWNvIHByb3ZpZGVycyB0byBza2lwIG5vbi1KYXZhLXdvcmtzcGFjZSBtb2RlbHMgd2l0aG91dCBhbiBleGFjdC1VUkkgY29tcGFyaXNvbi5cbiAqL1xuZnVuY3Rpb24gaXNXb3Jrc3BhY2VGaWxlKHVyaTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIF93b3Jrc3BhY2VSb290ICE9PSAnJyAmJiB1cmkuc3RhcnRzV2l0aChfd29ya3NwYWNlUm9vdCk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIE1vbmFjbyBwcm92aWRlciByZWdpc3RyYXRpb25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gcmVnaXN0ZXJQcm92aWRlcnMoKTogdm9pZCB7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyQ29tcGxldGlvbkl0ZW1Qcm92aWRlcignamF2YScsIHtcbiAgICAgICAgdHJpZ2dlckNoYXJhY3RlcnM6IFsnLicsICdAJywgJzwnXSxcbiAgICAgICAgcHJvdmlkZUNvbXBsZXRpb25JdGVtczogYXN5bmMgKG1vZGVsLCBwb3NpdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBmaWxlVXJpID0gbW9kZWwudXJpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IENvbXBsZXRpb25MaXN0IHwgQ29tcGxldGlvbkl0ZW1bXSB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L2NvbXBsZXRpb24nLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogZmlsZVVyaSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICAgICAgY29udGV4dDogICAgICB7IHRyaWdnZXJLaW5kOiAxIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gQXJyYXkuaXNBcnJheShyZXN1bHQpID8gcmVzdWx0IDogKHJlc3VsdD8uaXRlbXMgPz8gW10pO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBzdWdnZXN0aW9uczogaXRlbXMubWFwKGl0ZW0gPT4gbHNwQ29tcGxldGlvblRvTW9uYWNvKGl0ZW0sIG1vZGVsLCBwb3NpdGlvbikpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJIb3ZlclByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlSG92ZXI6IGFzeW5jIChtb2RlbCwgcG9zaXRpb24pID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgZmlsZVVyaSA9IG1vZGVsLnVyaS50b1N0cmluZygpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBIb3ZlciB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L2hvdmVyJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IGZpbGVVcmkgfSxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogICAgIHsgbGluZTogcG9zaXRpb24ubGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogcG9zaXRpb24uY29sdW1uIC0gMSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdD8uY29udGVudHMpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgY29udGVudHMgPSBBcnJheS5pc0FycmF5KHJlc3VsdC5jb250ZW50cykgPyByZXN1bHQuY29udGVudHMgOiBbcmVzdWx0LmNvbnRlbnRzXTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgY29udGVudHM6IGNvbnRlbnRzLm1hcChjID0+ICh7XG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiB0eXBlb2YgYyA9PT0gJ3N0cmluZycgPyBjIDogKGMgYXMgTWFya3VwQ29udGVudCkudmFsdWUsXG4gICAgICAgICAgICAgICAgICAgIGlzVHJ1c3RlZDogZmFsc2UsXG4gICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgIHJhbmdlOiByZXN1bHQucmFuZ2UgPyBsc3BSYW5nZVRvTW9uYWNvKHJlc3VsdC5yYW5nZSkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlclNpZ25hdHVyZUhlbHBQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgc2lnbmF0dXJlSGVscFRyaWdnZXJDaGFyYWN0ZXJzOiBbJygnLCAnLCddLFxuICAgICAgICBwcm92aWRlU2lnbmF0dXJlSGVscDogYXN5bmMgKG1vZGVsLCBwb3NpdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBmaWxlVXJpID0gbW9kZWwudXJpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IFNpZ25hdHVyZUhlbHAgfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9zaWduYXR1cmVIZWxwJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IGZpbGVVcmkgfSxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogICAgIHsgbGluZTogcG9zaXRpb24ubGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogcG9zaXRpb24uY29sdW1uIC0gMSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHZhbHVlOiB7XG4gICAgICAgICAgICAgICAgICAgIHNpZ25hdHVyZXM6IHJlc3VsdC5zaWduYXR1cmVzLm1hcCgoc2lnOiBTaWduYXR1cmVJbmZvcm1hdGlvbikgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAgICAgICAgIHNpZy5sYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50YXRpb246IHNpZy5kb2N1bWVudGF0aW9uID8gbWFya3VwVG9TdHJpbmcoc2lnLmRvY3VtZW50YXRpb24pIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVyczogICAgKHNpZy5wYXJhbWV0ZXJzID8/IFtdKS5tYXAoKHA6IFBhcmFtZXRlckluZm9ybWF0aW9uKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsOiAgICAgICAgIHAubGFiZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRhdGlvbjogcC5kb2N1bWVudGF0aW9uID8gbWFya3VwVG9TdHJpbmcocC5kb2N1bWVudGF0aW9uKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgICAgICBhY3RpdmVTaWduYXR1cmU6IHJlc3VsdC5hY3RpdmVTaWduYXR1cmUgPz8gMCxcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlUGFyYW1ldGVyOiByZXN1bHQuYWN0aXZlUGFyYW1ldGVyID8/IDAsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBkaXNwb3NlOiAoKSA9PiB7fSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyRGVmaW5pdGlvblByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlRGVmaW5pdGlvbjogYXN5bmMgKG1vZGVsLCBwb3NpdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBmaWxlVXJpID0gbW9kZWwudXJpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IExvY2F0aW9uIHwgTG9jYXRpb25bXSB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L2RlZmluaXRpb24nLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogZmlsZVVyaSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGxvY2F0aW9ucyA9IEFycmF5LmlzQXJyYXkocmVzdWx0KSA/IHJlc3VsdCA6IFtyZXN1bHRdO1xuICAgICAgICAgICAgcmV0dXJuIGxvY2F0aW9ucy5tYXAobG9jID0+ICh7XG4gICAgICAgICAgICAgICAgdXJpOiAgIG1vbmFjby5VcmkucGFyc2UobG9jLnVyaSksXG4gICAgICAgICAgICAgICAgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28obG9jLnJhbmdlKSxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgfSxcbiAgICB9KTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gSGVscGVyc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiBsc3BTZXZlcml0eShzZXZlcml0eTogRGlhZ25vc3RpY1NldmVyaXR5IHwgdW5kZWZpbmVkKTogbW9uYWNvLk1hcmtlclNldmVyaXR5IHtcbiAgICBzd2l0Y2ggKHNldmVyaXR5KSB7XG4gICAgICAgIGNhc2UgRGlhZ25vc3RpY1NldmVyaXR5LkVycm9yOiAgICAgICByZXR1cm4gbW9uYWNvLk1hcmtlclNldmVyaXR5LkVycm9yO1xuICAgICAgICBjYXNlIERpYWdub3N0aWNTZXZlcml0eS5XYXJuaW5nOiAgICAgcmV0dXJuIG1vbmFjby5NYXJrZXJTZXZlcml0eS5XYXJuaW5nO1xuICAgICAgICBjYXNlIERpYWdub3N0aWNTZXZlcml0eS5JbmZvcm1hdGlvbjogcmV0dXJuIG1vbmFjby5NYXJrZXJTZXZlcml0eS5JbmZvO1xuICAgICAgICBjYXNlIERpYWdub3N0aWNTZXZlcml0eS5IaW50OiAgICAgICAgcmV0dXJuIG1vbmFjby5NYXJrZXJTZXZlcml0eS5IaW50O1xuICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vbmFjby5NYXJrZXJTZXZlcml0eS5FcnJvcjtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGxzcFJhbmdlVG9Nb25hY28ocjogeyBzdGFydDogeyBsaW5lOiBudW1iZXI7IGNoYXJhY3RlcjogbnVtYmVyIH07IGVuZDogeyBsaW5lOiBudW1iZXI7IGNoYXJhY3RlcjogbnVtYmVyIH0gfSk6IG1vbmFjby5JUmFuZ2Uge1xuICAgIHJldHVybiB7XG4gICAgICAgIHN0YXJ0TGluZU51bWJlcjogci5zdGFydC5saW5lICsgMSxcbiAgICAgICAgc3RhcnRDb2x1bW46ICAgICByLnN0YXJ0LmNoYXJhY3RlciArIDEsXG4gICAgICAgIGVuZExpbmVOdW1iZXI6ICAgci5lbmQubGluZSArIDEsXG4gICAgICAgIGVuZENvbHVtbjogICAgICAgci5lbmQuY2hhcmFjdGVyICsgMSxcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBtYXJrdXBUb1N0cmluZyhjOiBzdHJpbmcgfCBNYXJrdXBDb250ZW50KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdHlwZW9mIGMgPT09ICdzdHJpbmcnID8gYyA6IGMudmFsdWU7XG59XG5cbmZ1bmN0aW9uIGxzcENvbXBsZXRpb25LaW5kKGtpbmQ6IENvbXBsZXRpb25JdGVtS2luZCB8IHVuZGVmaW5lZCk6IG1vbmFjby5sYW5ndWFnZXMuQ29tcGxldGlvbkl0ZW1LaW5kIHtcbiAgICBjb25zdCBLID0gbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbUtpbmQ7XG4gICAgc3dpdGNoIChraW5kKSB7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLlRleHQ6ICAgICAgICAgIHJldHVybiBLLlRleHQ7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLk1ldGhvZDogICAgICAgIHJldHVybiBLLk1ldGhvZDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuRnVuY3Rpb246ICAgICAgcmV0dXJuIEsuRnVuY3Rpb247XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLkNvbnN0cnVjdG9yOiAgIHJldHVybiBLLkNvbnN0cnVjdG9yO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5GaWVsZDogICAgICAgICByZXR1cm4gSy5GaWVsZDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuVmFyaWFibGU6ICAgICAgcmV0dXJuIEsuVmFyaWFibGU7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLkNsYXNzOiAgICAgICAgIHJldHVybiBLLkNsYXNzO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5JbnRlcmZhY2U6ICAgICByZXR1cm4gSy5JbnRlcmZhY2U7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLk1vZHVsZTogICAgICAgIHJldHVybiBLLk1vZHVsZTtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuUHJvcGVydHk6ICAgICAgcmV0dXJuIEsuUHJvcGVydHk7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLktleXdvcmQ6ICAgICAgIHJldHVybiBLLktleXdvcmQ7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLlNuaXBwZXQ6ICAgICAgIHJldHVybiBLLlNuaXBwZXQ7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLkNvbnN0YW50OiAgICAgIHJldHVybiBLLkNvbnN0YW50O1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5TdHJ1Y3Q6ICAgICAgICByZXR1cm4gSy5TdHJ1Y3Q7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLlR5cGVQYXJhbWV0ZXI6IHJldHVybiBLLlR5cGVQYXJhbWV0ZXI7XG4gICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBLLlRleHQ7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBsc3BDb21wbGV0aW9uVG9Nb25hY28oXG4gICAgaXRlbTogQ29tcGxldGlvbkl0ZW0sXG4gICAgbW9kZWw6IG1vbmFjby5lZGl0b3IuSVRleHRNb2RlbCxcbiAgICBwb3NpdGlvbjogbW9uYWNvLlBvc2l0aW9uLFxuKTogbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbSB7XG4gICAgY29uc3Qgd29yZCA9IG1vZGVsLmdldFdvcmRVbnRpbFBvc2l0aW9uKHBvc2l0aW9uKTtcbiAgICBjb25zdCByYW5nZTogbW9uYWNvLklSYW5nZSA9IHtcbiAgICAgICAgc3RhcnRMaW5lTnVtYmVyOiBwb3NpdGlvbi5saW5lTnVtYmVyLFxuICAgICAgICBzdGFydENvbHVtbjogICAgIHdvcmQuc3RhcnRDb2x1bW4sXG4gICAgICAgIGVuZExpbmVOdW1iZXI6ICAgcG9zaXRpb24ubGluZU51bWJlcixcbiAgICAgICAgZW5kQ29sdW1uOiAgICAgICB3b3JkLmVuZENvbHVtbixcbiAgICB9O1xuICAgIHJldHVybiB7XG4gICAgICAgIGxhYmVsOiAgICAgICAgICAgaXRlbS5sYWJlbCxcbiAgICAgICAga2luZDogICAgICAgICAgICBsc3BDb21wbGV0aW9uS2luZChpdGVtLmtpbmQpLFxuICAgICAgICBkZXRhaWw6ICAgICAgICAgIGl0ZW0uZGV0YWlsLFxuICAgICAgICBkb2N1bWVudGF0aW9uOiAgIGl0ZW0uZG9jdW1lbnRhdGlvbiA/IHsgdmFsdWU6IG1hcmt1cFRvU3RyaW5nKGl0ZW0uZG9jdW1lbnRhdGlvbiksIGlzVHJ1c3RlZDogZmFsc2UgfSA6IHVuZGVmaW5lZCxcbiAgICAgICAgaW5zZXJ0VGV4dDogICAgICBpdGVtLmluc2VydFRleHQgPz8gaXRlbS5sYWJlbCxcbiAgICAgICAgaW5zZXJ0VGV4dFJ1bGVzOiBpdGVtLmluc2VydFRleHRGb3JtYXQgPT09IEluc2VydFRleHRGb3JtYXQuU25pcHBldFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG1vbmFjby5sYW5ndWFnZXMuQ29tcGxldGlvbkl0ZW1JbnNlcnRUZXh0UnVsZS5JbnNlcnRBc1NuaXBwZXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIHJhbmdlLFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIGpkdGxzU2V0dGluZ3MoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgamF2YToge1xuICAgICAgICAgICAgaW1wb3J0OiB7XG4gICAgICAgICAgICAgICAgbWF2ZW46ICAgICAgeyBlbmFibGVkOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgZ3JhZGxlOiAgICAgeyBlbmFibGVkOiBmYWxzZSB9LFxuICAgICAgICAgICAgICAgIGV4Y2x1c2lvbnM6IFsnKiovbm9kZV9tb2R1bGVzLyoqJywgJyoqLy5tZXRhZGF0YS8qKicsICcqKi9hcmNoZXR5cGUtcmVzb3VyY2VzLyoqJ10sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYXV0b2J1aWxkOiB7IGVuYWJsZWQ6IHRydWUgfSxcbiAgICAgICAgICAgIGNvbXBsZXRpb246IHtcbiAgICAgICAgICAgICAgICBvdmVyd3JpdGU6ICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICBndWVzc01ldGhvZEFyZ3VtZW50czogZmFsc2UsXG4gICAgICAgICAgICAgICAgZmlsdGVyZWRUeXBlczogW1xuICAgICAgICAgICAgICAgICAgICAnY29tLnN1bi4qJywgJ3N1bi4qJywgJ2pkay4qJyxcbiAgICAgICAgICAgICAgICAgICAgJ29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC4qJyxcbiAgICAgICAgICAgICAgICAgICAgJ29yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuKicsXG4gICAgICAgICAgICAgICAgICAgICdvcmcuZWNsaXBzZS5vc2dpLmludGVybmFsLionLFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgaW1wb3J0T3JkZXI6IFsnamF2YScsICdqYXZheCcsICdvcmcnLCAnY29tJywgJyddLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNpZ25hdHVyZUhlbHA6ICB7IGVuYWJsZWQ6IHRydWUgfSxcbiAgICAgICAgICAgIGZvcm1hdDogICAgICAgICB7IGVuYWJsZWQ6IHRydWUgfSxcbiAgICAgICAgICAgIHNhdmVBY3Rpb25zOiAgICB7IG9yZ2FuaXplSW1wb3J0czogZmFsc2UgfSxcbiAgICAgICAgfSxcbiAgICB9O1xufVxuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjQgVHlwZUZveCBhbmQgb3RoZXJzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTElDRU5TRSBpbiB0aGUgcGFja2FnZSByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbmltcG9ydCB7IERpc3Bvc2FibGUgfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG5cbmV4cG9ydCBjbGFzcyBEaXNwb3NhYmxlQ29sbGVjdGlvbiBpbXBsZW1lbnRzIERpc3Bvc2FibGUge1xuICAgIHByb3RlY3RlZCByZWFkb25seSBkaXNwb3NhYmxlczogRGlzcG9zYWJsZVtdID0gW107XG5cbiAgICBkaXNwb3NlKCk6IHZvaWQge1xuICAgICAgICB3aGlsZSAodGhpcy5kaXNwb3NhYmxlcy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcG9zYWJsZXMucG9wKCkhLmRpc3Bvc2UoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1c2goZGlzcG9zYWJsZTogRGlzcG9zYWJsZSk6IERpc3Bvc2FibGUge1xuICAgICAgICBjb25zdCBkaXNwb3NhYmxlcyA9IHRoaXMuZGlzcG9zYWJsZXM7XG4gICAgICAgIGRpc3Bvc2FibGVzLnB1c2goZGlzcG9zYWJsZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkaXNwb3NlKCk6IHZvaWQge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gZGlzcG9zYWJsZXMuaW5kZXhPZihkaXNwb3NhYmxlKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3Bvc2FibGVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbn1cbiIsICIvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSAyMDI0IFR5cGVGb3ggYW5kIG90aGVycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExJQ0VOU0UgaW4gdGhlIHBhY2thZ2Ugcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5pbXBvcnQgeyBEaXNwb3NhYmxlIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuaW1wb3J0IHR5cGUgeyBJQ29ubmVjdGlvbiB9IGZyb20gJy4uL3NlcnZlci9jb25uZWN0aW9uLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBJV2ViU29ja2V0IGV4dGVuZHMgRGlzcG9zYWJsZSB7XG4gICAgc2VuZChjb250ZW50OiBzdHJpbmcpOiB2b2lkO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgb25NZXNzYWdlKGNiOiAoZGF0YTogYW55KSA9PiB2b2lkKTogdm9pZDtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIG9uRXJyb3IoY2I6IChyZWFzb246IGFueSkgPT4gdm9pZCk6IHZvaWQ7XG4gICAgb25DbG9zZShjYjogKGNvZGU6IG51bWJlciwgcmVhc29uOiBzdHJpbmcpID0+IHZvaWQpOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElXZWJTb2NrZXRDb25uZWN0aW9uIGV4dGVuZHMgSUNvbm5lY3Rpb24ge1xuICAgIHJlYWRvbmx5IHNvY2tldDogSVdlYlNvY2tldDtcbn1cbiIsICIvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSAyMDI0IFR5cGVGb3ggYW5kIG90aGVycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExJQ0VOU0UgaW4gdGhlIHBhY2thZ2Ugcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5pbXBvcnQgeyBEaXNwb3NhYmxlIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuLy8gVE9ETzogVXNlIGVudmlyb25tZW50LXNwZWNpZmljIGltcG9ydHMgKHZzY29kZS1qc29ucnBjL2Jyb3dzZXIgb3IgdnNjb2RlLWpzb25ycGMvbm9kZSlcbi8vIHdoZW4gdXBncmFkaW5nIHRvIHZzY29kZS1qc29ucnBjQDkueC54LW5leHQuWCB3aGljaCBzdXBwb3J0cyBwcm9wZXIgZXhwb3J0IG1hcHNcbmltcG9ydCB7IHR5cGUgRGF0YUNhbGxiYWNrLCBBYnN0cmFjdE1lc3NhZ2VSZWFkZXIsIE1lc3NhZ2VSZWFkZXIgfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG5pbXBvcnQgdHlwZSB7IElXZWJTb2NrZXQgfSBmcm9tICcuL3NvY2tldC5qcyc7XG5cbmV4cG9ydCBjbGFzcyBXZWJTb2NrZXRNZXNzYWdlUmVhZGVyIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlUmVhZGVyIGltcGxlbWVudHMgTWVzc2FnZVJlYWRlciB7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHNvY2tldDogSVdlYlNvY2tldDtcbiAgICBwcm90ZWN0ZWQgc3RhdGU6ICdpbml0aWFsJyB8ICdsaXN0ZW5pbmcnIHwgJ2Nsb3NlZCcgPSAnaW5pdGlhbCc7XG4gICAgcHJvdGVjdGVkIGNhbGxiYWNrOiBEYXRhQ2FsbGJhY2sgfCB1bmRlZmluZWQ7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZXZlbnRzOiBBcnJheTx7IG1lc3NhZ2U/OiBhbnksIGVycm9yPzogYW55IH0+ID0gW107XG5cbiAgICBjb25zdHJ1Y3Rvcihzb2NrZXQ6IElXZWJTb2NrZXQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7XG4gICAgICAgIHRoaXMuc29ja2V0Lm9uTWVzc2FnZShtZXNzYWdlID0+XG4gICAgICAgICAgICB0aGlzLnJlYWRNZXNzYWdlKG1lc3NhZ2UpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc29ja2V0Lm9uRXJyb3IoZXJyb3IgPT5cbiAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLnNvY2tldC5vbkNsb3NlKChjb2RlLCByZWFzb24pID0+IHtcbiAgICAgICAgICAgIGlmIChjb2RlICE9PSAxMDAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3I6IEVycm9yID0ge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnJyArIGNvZGUsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBFcnJvciBkdXJpbmcgc29ja2V0IHJlY29ubmVjdDogY29kZSA9ICR7Y29kZX0sIHJlYXNvbiA9ICR7cmVhc29ufWBcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZmlyZUNsb3NlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGxpc3RlbihjYWxsYmFjazogRGF0YUNhbGxiYWNrKTogRGlzcG9zYWJsZSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09PSAnaW5pdGlhbCcpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSAnbGlzdGVuaW5nJztcbiAgICAgICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgICAgICAgIHdoaWxlICh0aGlzLmV2ZW50cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBldmVudCA9IHRoaXMuZXZlbnRzLnBvcCgpITtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQubWVzc2FnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVhZE1lc3NhZ2UoZXZlbnQubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5lcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGV2ZW50LmVycm9yKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmVDbG9zZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhbGxiYWNrID09PSBjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gJ2luaXRpYWwnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbGxiYWNrID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBkaXNwb3NlKCkge1xuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSAnaW5pdGlhbCc7XG4gICAgICAgIHRoaXMuY2FsbGJhY2sgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuZXZlbnRzLnNwbGljZSgwLCB0aGlzLmV2ZW50cy5sZW5ndGgpO1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgcHJvdGVjdGVkIHJlYWRNZXNzYWdlKG1lc3NhZ2U6IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gJ2luaXRpYWwnKSB7XG4gICAgICAgICAgICB0aGlzLmV2ZW50cy5zcGxpY2UoMCwgMCwgeyBtZXNzYWdlIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUgPT09ICdsaXN0ZW5pbmcnKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2FsbGJhY2shKGRhdGEpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3I6IEVycm9yID0ge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnJyArIDQwMCxcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYEVycm9yIGR1cmluZyBtZXNzYWdlIHBhcnNpbmcsIHJlYXNvbiA9ICR7dHlwZW9mIGVyciA9PT0gJ29iamVjdCcgPyAoZXJyIGFzIGFueSkubWVzc2FnZSA6ICd1bmtub3duJ31gXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmVFcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBmaXJlRXJyb3IoZXJyb3I6IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gJ2luaXRpYWwnKSB7XG4gICAgICAgICAgICB0aGlzLmV2ZW50cy5zcGxpY2UoMCwgMCwgeyBlcnJvciB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlID09PSAnbGlzdGVuaW5nJykge1xuICAgICAgICAgICAgc3VwZXIuZmlyZUVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBmaXJlQ2xvc2UoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09PSAnaW5pdGlhbCcpIHtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRzLnNwbGljZSgwLCAwLCB7fSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZSA9PT0gJ2xpc3RlbmluZycpIHtcbiAgICAgICAgICAgIHN1cGVyLmZpcmVDbG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhdGUgPSAnY2xvc2VkJztcbiAgICB9XG59XG4iLCAiLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgMjAyNCBUeXBlRm94IGFuZCBvdGhlcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMSUNFTlNFIGluIHRoZSBwYWNrYWdlIHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuaW1wb3J0IHsgTWVzc2FnZSB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcbmltcG9ydCB7IEFic3RyYWN0TWVzc2FnZVdyaXRlciwgTWVzc2FnZVdyaXRlciB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcbmltcG9ydCB0eXBlIHsgSVdlYlNvY2tldCB9IGZyb20gJy4vc29ja2V0LmpzJztcblxuZXhwb3J0IGNsYXNzIFdlYlNvY2tldE1lc3NhZ2VXcml0ZXIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VXcml0ZXIgaW1wbGVtZW50cyBNZXNzYWdlV3JpdGVyIHtcbiAgICBwcm90ZWN0ZWQgZXJyb3JDb3VudCA9IDA7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHNvY2tldDogSVdlYlNvY2tldDtcblxuICAgIGNvbnN0cnVjdG9yKHNvY2tldDogSVdlYlNvY2tldCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnNvY2tldCA9IHNvY2tldDtcbiAgICB9XG5cbiAgICBlbmQoKTogdm9pZCB7XG4gICAgfVxuXG4gICAgYXN5bmMgd3JpdGUobXNnOiBNZXNzYWdlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobXNnKTtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0LnNlbmQoY29udGVudCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMuZXJyb3JDb3VudCsrO1xuICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZSwgbXNnLCB0aGlzLmVycm9yQ291bnQpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjQgVHlwZUZveCBhbmQgb3RoZXJzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTElDRU5TRSBpbiB0aGUgcGFja2FnZSByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbmltcG9ydCB0eXBlIHsgTWVzc2FnZUNvbm5lY3Rpb24sIExvZ2dlciB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcbmltcG9ydCB7IGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuaW1wb3J0IHR5cGUgeyBJV2ViU29ja2V0IH0gZnJvbSAnLi9zb2NrZXQuanMnO1xuaW1wb3J0IHsgV2ViU29ja2V0TWVzc2FnZVJlYWRlciB9IGZyb20gJy4vcmVhZGVyLmpzJztcbmltcG9ydCB7IFdlYlNvY2tldE1lc3NhZ2VXcml0ZXIgfSBmcm9tICcuL3dyaXRlci5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVXZWJTb2NrZXRDb25uZWN0aW9uKHNvY2tldDogSVdlYlNvY2tldCwgbG9nZ2VyOiBMb2dnZXIpOiBNZXNzYWdlQ29ubmVjdGlvbiB7XG4gICAgY29uc3QgbWVzc2FnZVJlYWRlciA9IG5ldyBXZWJTb2NrZXRNZXNzYWdlUmVhZGVyKHNvY2tldCk7XG4gICAgY29uc3QgbWVzc2FnZVdyaXRlciA9IG5ldyBXZWJTb2NrZXRNZXNzYWdlV3JpdGVyKHNvY2tldCk7XG4gICAgY29uc3QgY29ubmVjdGlvbiA9IGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uKG1lc3NhZ2VSZWFkZXIsIG1lc3NhZ2VXcml0ZXIsIGxvZ2dlcik7XG4gICAgY29ubmVjdGlvbi5vbkNsb3NlKCgpID0+IGNvbm5lY3Rpb24uZGlzcG9zZSgpKTtcbiAgICByZXR1cm4gY29ubmVjdGlvbjtcbn1cbiIsICIvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSAyMDI0IFR5cGVGb3ggYW5kIG90aGVycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExJQ0VOU0UgaW4gdGhlIHBhY2thZ2Ugcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5pbXBvcnQgdHlwZSB7IE1lc3NhZ2VDb25uZWN0aW9uLCBMb2dnZXIgfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG5pbXBvcnQgeyBjcmVhdGVXZWJTb2NrZXRDb25uZWN0aW9uIH0gZnJvbSAnLi9zb2NrZXQvY29ubmVjdGlvbi5qcyc7XG5pbXBvcnQgdHlwZSB7IElXZWJTb2NrZXQgfSBmcm9tICcuL3NvY2tldC9zb2NrZXQuanMnO1xuaW1wb3J0IHsgQ29uc29sZUxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGxpc3RlbihvcHRpb25zOiB7XG4gICAgd2ViU29ja2V0OiBXZWJTb2NrZXQ7XG4gICAgbG9nZ2VyPzogTG9nZ2VyO1xuICAgIG9uQ29ubmVjdGlvbjogKGNvbm5lY3Rpb246IE1lc3NhZ2VDb25uZWN0aW9uKSA9PiB2b2lkO1xufSkge1xuICAgIGNvbnN0IHsgd2ViU29ja2V0LCBvbkNvbm5lY3Rpb24gfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgbG9nZ2VyID0gb3B0aW9ucy5sb2dnZXIgfHwgbmV3IENvbnNvbGVMb2dnZXIoKTtcbiAgICB3ZWJTb2NrZXQub25vcGVuID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBzb2NrZXQgPSB0b1NvY2tldCh3ZWJTb2NrZXQpO1xuICAgICAgICBjb25zdCBjb25uZWN0aW9uID0gY3JlYXRlV2ViU29ja2V0Q29ubmVjdGlvbihzb2NrZXQsIGxvZ2dlcik7XG4gICAgICAgIG9uQ29ubmVjdGlvbihjb25uZWN0aW9uKTtcbiAgICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9Tb2NrZXQod2ViU29ja2V0OiBXZWJTb2NrZXQpOiBJV2ViU29ja2V0IHtcbiAgICByZXR1cm4ge1xuICAgICAgICBzZW5kOiBjb250ZW50ID0+IHdlYlNvY2tldC5zZW5kKGNvbnRlbnQpLFxuICAgICAgICBvbk1lc3NhZ2U6IGNiID0+IHtcbiAgICAgICAgICAgIHdlYlNvY2tldC5vbm1lc3NhZ2UgPSBldmVudCA9PiBjYihldmVudC5kYXRhKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25FcnJvcjogY2IgPT4ge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgIHdlYlNvY2tldC5vbmVycm9yID0gKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0Lmhhc093bihldmVudCwgJ21lc3NhZ2UnKSkge1xuICAgICAgICAgICAgICAgICAgICBjYihldmVudC5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBvbkNsb3NlOiBjYiA9PiB7XG4gICAgICAgICAgICB3ZWJTb2NrZXQub25jbG9zZSA9IGV2ZW50ID0+IGNiKGV2ZW50LmNvZGUsIGV2ZW50LnJlYXNvbik7XG4gICAgICAgIH0sXG4gICAgICAgIGRpc3Bvc2U6ICgpID0+IHdlYlNvY2tldC5jbG9zZSgpXG4gICAgfTtcbn1cbiIsICIvKlxuICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMjYgRWNsaXBzZSBEaXJpZ2libGUgY29udHJpYnV0b3JzXG4gKlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlXG4gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2Mi4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG4gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MjAuaHRtbFxuICpcbiAqIFNQRFgtRmlsZUNvcHlyaWdodFRleHQ6IEVjbGlwc2UgRGlyaWdpYmxlIGNvbnRyaWJ1dG9ycyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbi8qKlxuICogTGF6eSBQcm94eSBzaGltIGZvciBNb25hY28gRWRpdG9yIGxvYWRlZCB2aWEgQU1ELlxuICpcbiAqIGVkaXRvci5qcyBzZXRzIGdsb2JhbFRoaXMubW9uYWNvIGluc2lkZSB0aGUgQU1EIHJlcXVpcmUoKSBjYWxsYmFjaywgYmVmb3JlIGFueVxuICogSmF2YUxzcENsaWVudExpYi5jb25uZWN0KCkgY2FsbC4gQWxsIHByb3BlcnR5IGFjY2Vzc2VzIGdvIHRocm91Z2ggUHJveHkuZ2V0KCkgdHJhcHNcbiAqIHNvIHRoZXkgcmVzb2x2ZSBhZ2FpbnN0IHRoZSBsaXZlIHdpbmRvdy5tb25hY28gYXQgY2FsbCB0aW1lLCBub3QgYXQgYnVuZGxlIGxvYWQgdGltZS5cbiAqXG4gKiBUeXBlU2NyaXB0IHJlc29sdmVzIHR5cGVzIGZyb20gdGhlIHJlYWwgbW9uYWNvLWVkaXRvciBkZXZEZXBlbmRlbmN5OyBlc2J1aWxkIHJlcGxhY2VzXG4gKiB0aGUgXCJtb25hY28tZWRpdG9yXCIgaW1wb3J0IHdpdGggdGhpcyBmaWxlIGF0IGJ1bmRsZSB0aW1lIHZpYSB0aGUgYWxpYXMgb3B0aW9uLlxuICovXG5cbnR5cGUgTSA9IHR5cGVvZiBpbXBvcnQoJ21vbmFjby1lZGl0b3InKTtcblxuZnVuY3Rpb24gbSgpOiBNIHtcbiAgICByZXR1cm4gKGdsb2JhbFRoaXMgYXMgYW55KS5tb25hY28gYXMgTTtcbn1cblxuZnVuY3Rpb24gbnM8VCBleHRlbmRzIG9iamVjdD4oZ2V0dGVyOiAoKSA9PiBUKTogVCB7XG4gICAgcmV0dXJuIG5ldyBQcm94eSh7fSBhcyBULCB7XG4gICAgICAgIGdldDogKF8sIGspID0+IChnZXR0ZXIoKSBhcyBhbnkpW2sgYXMgc3RyaW5nXSxcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gY2xzPFQ+KGdldHRlcjogKCkgPT4gVCk6IFQge1xuICAgIHJldHVybiBuZXcgUHJveHkoZnVuY3Rpb24gKCkge30gYXMgYW55LCB7XG4gICAgICAgIGNvbnN0cnVjdDogKF8sIGFyZ3MpID0+IG5ldyAoZ2V0dGVyKCkgYXMgYW55KSguLi5hcmdzKSxcbiAgICAgICAgZ2V0OiAgICAgICAoXywgaykgICAgPT4gKGdldHRlcigpIGFzIGFueSlbayBhcyBzdHJpbmddLFxuICAgIH0pIGFzIFQ7XG59XG5cbmV4cG9ydCBjb25zdCBlZGl0b3IgICAgICAgICA9IG5zKCgpID0+IG0oKS5lZGl0b3IpO1xuZXhwb3J0IGNvbnN0IGxhbmd1YWdlcyAgICAgID0gbnMoKCkgPT4gbSgpLmxhbmd1YWdlcyk7XG5leHBvcnQgY29uc3QgTWFya2VyU2V2ZXJpdHkgPSBucygoKSA9PiBtKCkuTWFya2VyU2V2ZXJpdHkpO1xuZXhwb3J0IGNvbnN0IE1hcmtlclRhZyAgICAgID0gbnMoKCkgPT4gKG0oKSBhcyBhbnkpLk1hcmtlclRhZyk7XG5leHBvcnQgY29uc3QgVXJpICAgICAgICAgICAgPSBjbHMoKCkgPT4gbSgpLlVyaSk7XG5leHBvcnQgY29uc3QgUmFuZ2UgICAgICAgICAgPSBjbHMoKCkgPT4gbSgpLlJhbmdlKTtcbmV4cG9ydCBjb25zdCBQb3NpdGlvbiAgICAgICA9IGNscygoKSA9PiBtKCkuUG9zaXRpb24pO1xuZXhwb3J0IGNvbnN0IFNlbGVjdGlvbiAgICAgID0gY2xzKCgpID0+IG0oKS5TZWxlY3Rpb24pO1xuZXhwb3J0IGNvbnN0IEtleUNvZGUgICAgICAgID0gbnMoKCkgPT4gbSgpLktleUNvZGUpO1xuZXhwb3J0IGNvbnN0IEtleU1vZCAgICAgICAgID0gbnMoKCkgPT4gbSgpLktleU1vZCk7XG4iLCAiLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuJ3VzZSBzdHJpY3QnO1xuZXhwb3J0IHZhciBEb2N1bWVudFVyaTtcbihmdW5jdGlvbiAoRG9jdW1lbnRVcmkpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJztcbiAgICB9XG4gICAgRG9jdW1lbnRVcmkuaXMgPSBpcztcbn0pKERvY3VtZW50VXJpIHx8IChEb2N1bWVudFVyaSA9IHt9KSk7XG5leHBvcnQgdmFyIFVSSTtcbihmdW5jdGlvbiAoVVJJKSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZyc7XG4gICAgfVxuICAgIFVSSS5pcyA9IGlzO1xufSkoVVJJIHx8IChVUkkgPSB7fSkpO1xuZXhwb3J0IHZhciBpbnRlZ2VyO1xuKGZ1bmN0aW9uIChpbnRlZ2VyKSB7XG4gICAgaW50ZWdlci5NSU5fVkFMVUUgPSAtMjE0NzQ4MzY0ODtcbiAgICBpbnRlZ2VyLk1BWF9WQUxVRSA9IDIxNDc0ODM2NDc7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgaW50ZWdlci5NSU5fVkFMVUUgPD0gdmFsdWUgJiYgdmFsdWUgPD0gaW50ZWdlci5NQVhfVkFMVUU7XG4gICAgfVxuICAgIGludGVnZXIuaXMgPSBpcztcbn0pKGludGVnZXIgfHwgKGludGVnZXIgPSB7fSkpO1xuZXhwb3J0IHZhciB1aW50ZWdlcjtcbihmdW5jdGlvbiAodWludGVnZXIpIHtcbiAgICB1aW50ZWdlci5NSU5fVkFMVUUgPSAwO1xuICAgIHVpbnRlZ2VyLk1BWF9WQUxVRSA9IDIxNDc0ODM2NDc7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgdWludGVnZXIuTUlOX1ZBTFVFIDw9IHZhbHVlICYmIHZhbHVlIDw9IHVpbnRlZ2VyLk1BWF9WQUxVRTtcbiAgICB9XG4gICAgdWludGVnZXIuaXMgPSBpcztcbn0pKHVpbnRlZ2VyIHx8ICh1aW50ZWdlciA9IHt9KSk7XG4vKipcbiAqIFRoZSBQb3NpdGlvbiBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBQb3NpdGlvbn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgUG9zaXRpb247XG4oZnVuY3Rpb24gKFBvc2l0aW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBQb3NpdGlvbiBsaXRlcmFsIGZyb20gdGhlIGdpdmVuIGxpbmUgYW5kIGNoYXJhY3Rlci5cbiAgICAgKiBAcGFyYW0gbGluZSBUaGUgcG9zaXRpb24ncyBsaW5lLlxuICAgICAqIEBwYXJhbSBjaGFyYWN0ZXIgVGhlIHBvc2l0aW9uJ3MgY2hhcmFjdGVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShsaW5lLCBjaGFyYWN0ZXIpIHtcbiAgICAgICAgaWYgKGxpbmUgPT09IE51bWJlci5NQVhfVkFMVUUpIHtcbiAgICAgICAgICAgIGxpbmUgPSB1aW50ZWdlci5NQVhfVkFMVUU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYXJhY3RlciA9PT0gTnVtYmVyLk1BWF9WQUxVRSkge1xuICAgICAgICAgICAgY2hhcmFjdGVyID0gdWludGVnZXIuTUFYX1ZBTFVFO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGxpbmUsIGNoYXJhY3RlciB9O1xuICAgIH1cbiAgICBQb3NpdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBQb3NpdGlvbn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBJcy51aW50ZWdlcihjYW5kaWRhdGUubGluZSkgJiYgSXMudWludGVnZXIoY2FuZGlkYXRlLmNoYXJhY3Rlcik7XG4gICAgfVxuICAgIFBvc2l0aW9uLmlzID0gaXM7XG59KShQb3NpdGlvbiB8fCAoUG9zaXRpb24gPSB7fSkpO1xuLyoqXG4gKiBUaGUgUmFuZ2UgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgUmFuZ2V9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIFJhbmdlO1xuKGZ1bmN0aW9uIChSYW5nZSkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShvbmUsIHR3bywgdGhyZWUsIGZvdXIpIHtcbiAgICAgICAgaWYgKElzLnVpbnRlZ2VyKG9uZSkgJiYgSXMudWludGVnZXIodHdvKSAmJiBJcy51aW50ZWdlcih0aHJlZSkgJiYgSXMudWludGVnZXIoZm91cikpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHN0YXJ0OiBQb3NpdGlvbi5jcmVhdGUob25lLCB0d28pLCBlbmQ6IFBvc2l0aW9uLmNyZWF0ZSh0aHJlZSwgZm91cikgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChQb3NpdGlvbi5pcyhvbmUpICYmIFBvc2l0aW9uLmlzKHR3bykpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHN0YXJ0OiBvbmUsIGVuZDogdHdvIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJhbmdlI2NyZWF0ZSBjYWxsZWQgd2l0aCBpbnZhbGlkIGFyZ3VtZW50c1ske29uZX0sICR7dHdvfSwgJHt0aHJlZX0sICR7Zm91cn1dYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgUmFuZ2UuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgUmFuZ2V9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgUG9zaXRpb24uaXMoY2FuZGlkYXRlLnN0YXJ0KSAmJiBQb3NpdGlvbi5pcyhjYW5kaWRhdGUuZW5kKTtcbiAgICB9XG4gICAgUmFuZ2UuaXMgPSBpcztcbn0pKFJhbmdlIHx8IChSYW5nZSA9IHt9KSk7XG4vKipcbiAqIFRoZSBMb2NhdGlvbiBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBMb2NhdGlvbn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgTG9jYXRpb247XG4oZnVuY3Rpb24gKExvY2F0aW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIExvY2F0aW9uIGxpdGVyYWwuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgbG9jYXRpb24ncyB1cmkuXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSBsb2NhdGlvbidzIHJhbmdlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmksIHJhbmdlKSB7XG4gICAgICAgIHJldHVybiB7IHVyaSwgcmFuZ2UgfTtcbiAgICB9XG4gICAgTG9jYXRpb24uY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgTG9jYXRpb259IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiAoSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpIHx8IElzLnVuZGVmaW5lZChjYW5kaWRhdGUudXJpKSk7XG4gICAgfVxuICAgIExvY2F0aW9uLmlzID0gaXM7XG59KShMb2NhdGlvbiB8fCAoTG9jYXRpb24gPSB7fSkpO1xuLyoqXG4gKiBUaGUgTG9jYXRpb25MaW5rIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIExvY2F0aW9uTGlua30gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgTG9jYXRpb25MaW5rO1xuKGZ1bmN0aW9uIChMb2NhdGlvbkxpbmspIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgTG9jYXRpb25MaW5rIGxpdGVyYWwuXG4gICAgICogQHBhcmFtIHRhcmdldFVyaSBUaGUgZGVmaW5pdGlvbidzIHVyaS5cbiAgICAgKiBAcGFyYW0gdGFyZ2V0UmFuZ2UgVGhlIGZ1bGwgcmFuZ2Ugb2YgdGhlIGRlZmluaXRpb24uXG4gICAgICogQHBhcmFtIHRhcmdldFNlbGVjdGlvblJhbmdlIFRoZSBzcGFuIG9mIHRoZSBzeW1ib2wgZGVmaW5pdGlvbiBhdCB0aGUgdGFyZ2V0LlxuICAgICAqIEBwYXJhbSBvcmlnaW5TZWxlY3Rpb25SYW5nZSBUaGUgc3BhbiBvZiB0aGUgc3ltYm9sIGJlaW5nIGRlZmluZWQgaW4gdGhlIG9yaWdpbmF0aW5nIHNvdXJjZSBmaWxlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh0YXJnZXRVcmksIHRhcmdldFJhbmdlLCB0YXJnZXRTZWxlY3Rpb25SYW5nZSwgb3JpZ2luU2VsZWN0aW9uUmFuZ2UpIHtcbiAgICAgICAgcmV0dXJuIHsgdGFyZ2V0VXJpLCB0YXJnZXRSYW5nZSwgdGFyZ2V0U2VsZWN0aW9uUmFuZ2UsIG9yaWdpblNlbGVjdGlvblJhbmdlIH07XG4gICAgfVxuICAgIExvY2F0aW9uTGluay5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBMb2NhdGlvbkxpbmt9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnRhcmdldFJhbmdlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnRhcmdldFVyaSlcbiAgICAgICAgICAgICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS50YXJnZXRTZWxlY3Rpb25SYW5nZSlcbiAgICAgICAgICAgICYmIChSYW5nZS5pcyhjYW5kaWRhdGUub3JpZ2luU2VsZWN0aW9uUmFuZ2UpIHx8IElzLnVuZGVmaW5lZChjYW5kaWRhdGUub3JpZ2luU2VsZWN0aW9uUmFuZ2UpKTtcbiAgICB9XG4gICAgTG9jYXRpb25MaW5rLmlzID0gaXM7XG59KShMb2NhdGlvbkxpbmsgfHwgKExvY2F0aW9uTGluayA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb2xvciBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBDb2xvcn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgQ29sb3I7XG4oZnVuY3Rpb24gKENvbG9yKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDb2xvciBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmVkLFxuICAgICAgICAgICAgZ3JlZW4sXG4gICAgICAgICAgICBibHVlLFxuICAgICAgICAgICAgYWxwaGEsXG4gICAgICAgIH07XG4gICAgfVxuICAgIENvbG9yLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIENvbG9yfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgSXMubnVtYmVyUmFuZ2UoY2FuZGlkYXRlLnJlZCwgMCwgMSlcbiAgICAgICAgICAgICYmIElzLm51bWJlclJhbmdlKGNhbmRpZGF0ZS5ncmVlbiwgMCwgMSlcbiAgICAgICAgICAgICYmIElzLm51bWJlclJhbmdlKGNhbmRpZGF0ZS5ibHVlLCAwLCAxKVxuICAgICAgICAgICAgJiYgSXMubnVtYmVyUmFuZ2UoY2FuZGlkYXRlLmFscGhhLCAwLCAxKTtcbiAgICB9XG4gICAgQ29sb3IuaXMgPSBpcztcbn0pKENvbG9yIHx8IChDb2xvciA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb2xvckluZm9ybWF0aW9uIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIENvbG9ySW5mb3JtYXRpb259IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIENvbG9ySW5mb3JtYXRpb247XG4oZnVuY3Rpb24gKENvbG9ySW5mb3JtYXRpb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENvbG9ySW5mb3JtYXRpb24gbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIGNvbG9yKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByYW5nZSxcbiAgICAgICAgICAgIGNvbG9yLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBDb2xvckluZm9ybWF0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIENvbG9ySW5mb3JtYXRpb259IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIENvbG9yLmlzKGNhbmRpZGF0ZS5jb2xvcik7XG4gICAgfVxuICAgIENvbG9ySW5mb3JtYXRpb24uaXMgPSBpcztcbn0pKENvbG9ySW5mb3JtYXRpb24gfHwgKENvbG9ySW5mb3JtYXRpb24gPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29sb3IgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgQ29sb3JQcmVzZW50YXRpb259IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIENvbG9yUHJlc2VudGF0aW9uO1xuKGZ1bmN0aW9uIChDb2xvclByZXNlbnRhdGlvbikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ29sb3JJbmZvcm1hdGlvbiBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShsYWJlbCwgdGV4dEVkaXQsIGFkZGl0aW9uYWxUZXh0RWRpdHMpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgICAgdGV4dEVkaXQsXG4gICAgICAgICAgICBhZGRpdGlvbmFsVGV4dEVkaXRzLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBDb2xvclByZXNlbnRhdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBDb2xvckluZm9ybWF0aW9ufSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5sYWJlbClcbiAgICAgICAgICAgICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLnRleHRFZGl0KSB8fCBUZXh0RWRpdC5pcyhjYW5kaWRhdGUpKVxuICAgICAgICAgICAgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUuYWRkaXRpb25hbFRleHRFZGl0cykgfHwgSXMudHlwZWRBcnJheShjYW5kaWRhdGUuYWRkaXRpb25hbFRleHRFZGl0cywgVGV4dEVkaXQuaXMpKTtcbiAgICB9XG4gICAgQ29sb3JQcmVzZW50YXRpb24uaXMgPSBpcztcbn0pKENvbG9yUHJlc2VudGF0aW9uIHx8IChDb2xvclByZXNlbnRhdGlvbiA9IHt9KSk7XG4vKipcbiAqIEEgc2V0IG9mIHByZWRlZmluZWQgcmFuZ2Uga2luZHMuXG4gKi9cbmV4cG9ydCB2YXIgRm9sZGluZ1JhbmdlS2luZDtcbihmdW5jdGlvbiAoRm9sZGluZ1JhbmdlS2luZCkge1xuICAgIC8qKlxuICAgICAqIEZvbGRpbmcgcmFuZ2UgZm9yIGEgY29tbWVudFxuICAgICAqL1xuICAgIEZvbGRpbmdSYW5nZUtpbmQuQ29tbWVudCA9ICdjb21tZW50JztcbiAgICAvKipcbiAgICAgKiBGb2xkaW5nIHJhbmdlIGZvciBhbiBpbXBvcnQgb3IgaW5jbHVkZVxuICAgICAqL1xuICAgIEZvbGRpbmdSYW5nZUtpbmQuSW1wb3J0cyA9ICdpbXBvcnRzJztcbiAgICAvKipcbiAgICAgKiBGb2xkaW5nIHJhbmdlIGZvciBhIHJlZ2lvbiAoZS5nLiBgI3JlZ2lvbmApXG4gICAgICovXG4gICAgRm9sZGluZ1JhbmdlS2luZC5SZWdpb24gPSAncmVnaW9uJztcbn0pKEZvbGRpbmdSYW5nZUtpbmQgfHwgKEZvbGRpbmdSYW5nZUtpbmQgPSB7fSkpO1xuLyoqXG4gKiBUaGUgZm9sZGluZyByYW5nZSBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBGb2xkaW5nUmFuZ2V9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIEZvbGRpbmdSYW5nZTtcbihmdW5jdGlvbiAoRm9sZGluZ1JhbmdlKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBGb2xkaW5nUmFuZ2UgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUoc3RhcnRMaW5lLCBlbmRMaW5lLCBzdGFydENoYXJhY3RlciwgZW5kQ2hhcmFjdGVyLCBraW5kLCBjb2xsYXBzZWRUZXh0KSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIHN0YXJ0TGluZSxcbiAgICAgICAgICAgIGVuZExpbmVcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKElzLmRlZmluZWQoc3RhcnRDaGFyYWN0ZXIpKSB7XG4gICAgICAgICAgICByZXN1bHQuc3RhcnRDaGFyYWN0ZXIgPSBzdGFydENoYXJhY3RlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXMuZGVmaW5lZChlbmRDaGFyYWN0ZXIpKSB7XG4gICAgICAgICAgICByZXN1bHQuZW5kQ2hhcmFjdGVyID0gZW5kQ2hhcmFjdGVyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKGtpbmQpKSB7XG4gICAgICAgICAgICByZXN1bHQua2luZCA9IGtpbmQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzLmRlZmluZWQoY29sbGFwc2VkVGV4dCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5jb2xsYXBzZWRUZXh0ID0gY29sbGFwc2VkVGV4dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBGb2xkaW5nUmFuZ2UuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgRm9sZGluZ1JhbmdlfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgSXMudWludGVnZXIoY2FuZGlkYXRlLnN0YXJ0TGluZSkgJiYgSXMudWludGVnZXIoY2FuZGlkYXRlLnN0YXJ0TGluZSlcbiAgICAgICAgICAgICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLnN0YXJ0Q2hhcmFjdGVyKSB8fCBJcy51aW50ZWdlcihjYW5kaWRhdGUuc3RhcnRDaGFyYWN0ZXIpKVxuICAgICAgICAgICAgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUuZW5kQ2hhcmFjdGVyKSB8fCBJcy51aW50ZWdlcihjYW5kaWRhdGUuZW5kQ2hhcmFjdGVyKSlcbiAgICAgICAgICAgICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLmtpbmQpIHx8IElzLnN0cmluZyhjYW5kaWRhdGUua2luZCkpO1xuICAgIH1cbiAgICBGb2xkaW5nUmFuZ2UuaXMgPSBpcztcbn0pKEZvbGRpbmdSYW5nZSB8fCAoRm9sZGluZ1JhbmdlID0ge30pKTtcbi8qKlxuICogVGhlIERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24gbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbjtcbihmdW5jdGlvbiAoRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbiBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShsb2NhdGlvbiwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbG9jYXRpb24sXG4gICAgICAgICAgICBtZXNzYWdlXG4gICAgICAgIH07XG4gICAgfVxuICAgIERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24uY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBMb2NhdGlvbi5pcyhjYW5kaWRhdGUubG9jYXRpb24pICYmIElzLnN0cmluZyhjYW5kaWRhdGUubWVzc2FnZSk7XG4gICAgfVxuICAgIERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24uaXMgPSBpcztcbn0pKERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24gfHwgKERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24gPSB7fSkpO1xuLyoqXG4gKiBUaGUgZGlhZ25vc3RpYydzIHNldmVyaXR5LlxuICovXG5leHBvcnQgdmFyIERpYWdub3N0aWNTZXZlcml0eTtcbihmdW5jdGlvbiAoRGlhZ25vc3RpY1NldmVyaXR5KSB7XG4gICAgLyoqXG4gICAgICogUmVwb3J0cyBhbiBlcnJvci5cbiAgICAgKi9cbiAgICBEaWFnbm9zdGljU2V2ZXJpdHkuRXJyb3IgPSAxO1xuICAgIC8qKlxuICAgICAqIFJlcG9ydHMgYSB3YXJuaW5nLlxuICAgICAqL1xuICAgIERpYWdub3N0aWNTZXZlcml0eS5XYXJuaW5nID0gMjtcbiAgICAvKipcbiAgICAgKiBSZXBvcnRzIGFuIGluZm9ybWF0aW9uLlxuICAgICAqL1xuICAgIERpYWdub3N0aWNTZXZlcml0eS5JbmZvcm1hdGlvbiA9IDM7XG4gICAgLyoqXG4gICAgICogUmVwb3J0cyBhIGhpbnQuXG4gICAgICovXG4gICAgRGlhZ25vc3RpY1NldmVyaXR5LkhpbnQgPSA0O1xufSkoRGlhZ25vc3RpY1NldmVyaXR5IHx8IChEaWFnbm9zdGljU2V2ZXJpdHkgPSB7fSkpO1xuLyoqXG4gKiBUaGUgZGlhZ25vc3RpYyB0YWdzLlxuICpcbiAqIEBzaW5jZSAzLjE1LjBcbiAqL1xuZXhwb3J0IHZhciBEaWFnbm9zdGljVGFnO1xuKGZ1bmN0aW9uIChEaWFnbm9zdGljVGFnKSB7XG4gICAgLyoqXG4gICAgICogVW51c2VkIG9yIHVubmVjZXNzYXJ5IGNvZGUuXG4gICAgICpcbiAgICAgKiBDbGllbnRzIGFyZSBhbGxvd2VkIHRvIHJlbmRlciBkaWFnbm9zdGljcyB3aXRoIHRoaXMgdGFnIGZhZGVkIG91dCBpbnN0ZWFkIG9mIGhhdmluZ1xuICAgICAqIGFuIGVycm9yIHNxdWlnZ2xlLlxuICAgICAqL1xuICAgIERpYWdub3N0aWNUYWcuVW5uZWNlc3NhcnkgPSAxO1xuICAgIC8qKlxuICAgICAqIERlcHJlY2F0ZWQgb3Igb2Jzb2xldGUgY29kZS5cbiAgICAgKlxuICAgICAqIENsaWVudHMgYXJlIGFsbG93ZWQgdG8gcmVuZGVyZWQgZGlhZ25vc3RpY3Mgd2l0aCB0aGlzIHRhZyBzdHJpa2UgdGhyb3VnaC5cbiAgICAgKi9cbiAgICBEaWFnbm9zdGljVGFnLkRlcHJlY2F0ZWQgPSAyO1xufSkoRGlhZ25vc3RpY1RhZyB8fCAoRGlhZ25vc3RpY1RhZyA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb2RlRGVzY3JpcHRpb24gbmFtZXNwYWNlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGggZGVzY3JpcHRpb25zIGZvciBkaWFnbm9zdGljIGNvZGVzLlxuICpcbiAqIEBzaW5jZSAzLjE2LjBcbiAqL1xuZXhwb3J0IHZhciBDb2RlRGVzY3JpcHRpb247XG4oZnVuY3Rpb24gKENvZGVEZXNjcmlwdGlvbikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUuaHJlZik7XG4gICAgfVxuICAgIENvZGVEZXNjcmlwdGlvbi5pcyA9IGlzO1xufSkoQ29kZURlc2NyaXB0aW9uIHx8IChDb2RlRGVzY3JpcHRpb24gPSB7fSkpO1xuLyoqXG4gKiBUaGUgRGlhZ25vc3RpYyBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBEaWFnbm9zdGljfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBEaWFnbm9zdGljO1xuKGZ1bmN0aW9uIChEaWFnbm9zdGljKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBEaWFnbm9zdGljIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCBtZXNzYWdlLCBzZXZlcml0eSwgY29kZSwgc291cmNlLCByZWxhdGVkSW5mb3JtYXRpb24pIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHsgcmFuZ2UsIG1lc3NhZ2UgfTtcbiAgICAgICAgaWYgKElzLmRlZmluZWQoc2V2ZXJpdHkpKSB7XG4gICAgICAgICAgICByZXN1bHQuc2V2ZXJpdHkgPSBzZXZlcml0eTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXMuZGVmaW5lZChjb2RlKSkge1xuICAgICAgICAgICAgcmVzdWx0LmNvZGUgPSBjb2RlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKHNvdXJjZSkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzLmRlZmluZWQocmVsYXRlZEluZm9ybWF0aW9uKSkge1xuICAgICAgICAgICAgcmVzdWx0LnJlbGF0ZWRJbmZvcm1hdGlvbiA9IHJlbGF0ZWRJbmZvcm1hdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBEaWFnbm9zdGljLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIERpYWdub3N0aWN9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKVxuICAgICAgICAgICAgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKVxuICAgICAgICAgICAgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5tZXNzYWdlKVxuICAgICAgICAgICAgJiYgKElzLm51bWJlcihjYW5kaWRhdGUuc2V2ZXJpdHkpIHx8IElzLnVuZGVmaW5lZChjYW5kaWRhdGUuc2V2ZXJpdHkpKVxuICAgICAgICAgICAgJiYgKElzLmludGVnZXIoY2FuZGlkYXRlLmNvZGUpIHx8IElzLnN0cmluZyhjYW5kaWRhdGUuY29kZSkgfHwgSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5jb2RlKSlcbiAgICAgICAgICAgICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLmNvZGVEZXNjcmlwdGlvbikgfHwgKElzLnN0cmluZygoX2EgPSBjYW5kaWRhdGUuY29kZURlc2NyaXB0aW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaHJlZikpKVxuICAgICAgICAgICAgJiYgKElzLnN0cmluZyhjYW5kaWRhdGUuc291cmNlKSB8fCBJcy51bmRlZmluZWQoY2FuZGlkYXRlLnNvdXJjZSkpXG4gICAgICAgICAgICAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5yZWxhdGVkSW5mb3JtYXRpb24pIHx8IElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLnJlbGF0ZWRJbmZvcm1hdGlvbiwgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbi5pcykpO1xuICAgIH1cbiAgICBEaWFnbm9zdGljLmlzID0gaXM7XG59KShEaWFnbm9zdGljIHx8IChEaWFnbm9zdGljID0ge30pKTtcbi8qKlxuICogVGhlIENvbW1hbmQgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgQ29tbWFuZH0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgQ29tbWFuZDtcbihmdW5jdGlvbiAoQ29tbWFuZCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ29tbWFuZCBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh0aXRsZSwgY29tbWFuZCwgLi4uYXJncykge1xuICAgICAgICBsZXQgcmVzdWx0ID0geyB0aXRsZSwgY29tbWFuZCB9O1xuICAgICAgICBpZiAoSXMuZGVmaW5lZChhcmdzKSAmJiBhcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJlc3VsdC5hcmd1bWVudHMgPSBhcmdzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIENvbW1hbmQuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgQ29tbWFuZH0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnRpdGxlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLmNvbW1hbmQpO1xuICAgIH1cbiAgICBDb21tYW5kLmlzID0gaXM7XG59KShDb21tYW5kIHx8IChDb21tYW5kID0ge30pKTtcbi8qKlxuICogVGhlIFRleHRFZGl0IG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIHJlcGxhY2UsXG4gKiBpbnNlcnQgYW5kIGRlbGV0ZSBlZGl0cyBtb3JlIGVhc2lseS5cbiAqL1xuZXhwb3J0IHZhciBUZXh0RWRpdDtcbihmdW5jdGlvbiAoVGV4dEVkaXQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgcmVwbGFjZSB0ZXh0IGVkaXQuXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSBvZiB0ZXh0IHRvIGJlIHJlcGxhY2VkLlxuICAgICAqIEBwYXJhbSBuZXdUZXh0IFRoZSBuZXcgdGV4dC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXBsYWNlKHJhbmdlLCBuZXdUZXh0KSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCBuZXdUZXh0IH07XG4gICAgfVxuICAgIFRleHRFZGl0LnJlcGxhY2UgPSByZXBsYWNlO1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zZXJ0IHRleHQgZWRpdC5cbiAgICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIHBvc2l0aW9uIHRvIGluc2VydCB0aGUgdGV4dCBhdC5cbiAgICAgKiBAcGFyYW0gbmV3VGV4dCBUaGUgdGV4dCB0byBiZSBpbnNlcnRlZC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbnNlcnQocG9zaXRpb24sIG5ld1RleHQpIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2U6IHsgc3RhcnQ6IHBvc2l0aW9uLCBlbmQ6IHBvc2l0aW9uIH0sIG5ld1RleHQgfTtcbiAgICB9XG4gICAgVGV4dEVkaXQuaW5zZXJ0ID0gaW5zZXJ0O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBkZWxldGUgdGV4dCBlZGl0LlxuICAgICAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2Ugb2YgdGV4dCB0byBiZSBkZWxldGVkLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRlbChyYW5nZSkge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgbmV3VGV4dDogJycgfTtcbiAgICB9XG4gICAgVGV4dEVkaXQuZGVsID0gZGVsO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpXG4gICAgICAgICAgICAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLm5ld1RleHQpXG4gICAgICAgICAgICAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpO1xuICAgIH1cbiAgICBUZXh0RWRpdC5pcyA9IGlzO1xufSkoVGV4dEVkaXQgfHwgKFRleHRFZGl0ID0ge30pKTtcbmV4cG9ydCB2YXIgQ2hhbmdlQW5ub3RhdGlvbjtcbihmdW5jdGlvbiAoQ2hhbmdlQW5ub3RhdGlvbikge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShsYWJlbCwgbmVlZHNDb25maXJtYXRpb24sIGRlc2NyaXB0aW9uKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHsgbGFiZWwgfTtcbiAgICAgICAgaWYgKG5lZWRzQ29uZmlybWF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5uZWVkc0NvbmZpcm1hdGlvbiA9IG5lZWRzQ29uZmlybWF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZXNjcmlwdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBDaGFuZ2VBbm5vdGF0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLmxhYmVsKSAmJlxuICAgICAgICAgICAgKElzLmJvb2xlYW4oY2FuZGlkYXRlLm5lZWRzQ29uZmlybWF0aW9uKSB8fCBjYW5kaWRhdGUubmVlZHNDb25maXJtYXRpb24gPT09IHVuZGVmaW5lZCkgJiZcbiAgICAgICAgICAgIChJcy5zdHJpbmcoY2FuZGlkYXRlLmRlc2NyaXB0aW9uKSB8fCBjYW5kaWRhdGUuZGVzY3JpcHRpb24gPT09IHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIENoYW5nZUFubm90YXRpb24uaXMgPSBpcztcbn0pKENoYW5nZUFubm90YXRpb24gfHwgKENoYW5nZUFubm90YXRpb24gPSB7fSkpO1xuZXhwb3J0IHZhciBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllcjtcbihmdW5jdGlvbiAoQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLnN0cmluZyhjYW5kaWRhdGUpO1xuICAgIH1cbiAgICBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyA9IGlzO1xufSkoQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIgfHwgKENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyID0ge30pKTtcbmV4cG9ydCB2YXIgQW5ub3RhdGVkVGV4dEVkaXQ7XG4oZnVuY3Rpb24gKEFubm90YXRlZFRleHRFZGl0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhbm5vdGF0ZWQgcmVwbGFjZSB0ZXh0IGVkaXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlIG9mIHRleHQgdG8gYmUgcmVwbGFjZWQuXG4gICAgICogQHBhcmFtIG5ld1RleHQgVGhlIG5ldyB0ZXh0LlxuICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIFRoZSBhbm5vdGF0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlcGxhY2UocmFuZ2UsIG5ld1RleHQsIGFubm90YXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIG5ld1RleHQsIGFubm90YXRpb25JZDogYW5ub3RhdGlvbiB9O1xuICAgIH1cbiAgICBBbm5vdGF0ZWRUZXh0RWRpdC5yZXBsYWNlID0gcmVwbGFjZTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFubm90YXRlZCBpbnNlcnQgdGV4dCBlZGl0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBwb3NpdGlvbiB0byBpbnNlcnQgdGhlIHRleHQgYXQuXG4gICAgICogQHBhcmFtIG5ld1RleHQgVGhlIHRleHQgdG8gYmUgaW5zZXJ0ZWQuXG4gICAgICogQHBhcmFtIGFubm90YXRpb24gVGhlIGFubm90YXRpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5zZXJ0KHBvc2l0aW9uLCBuZXdUZXh0LCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlOiB7IHN0YXJ0OiBwb3NpdGlvbiwgZW5kOiBwb3NpdGlvbiB9LCBuZXdUZXh0LCBhbm5vdGF0aW9uSWQ6IGFubm90YXRpb24gfTtcbiAgICB9XG4gICAgQW5ub3RhdGVkVGV4dEVkaXQuaW5zZXJ0ID0gaW5zZXJ0O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYW5ub3RhdGVkIGRlbGV0ZSB0ZXh0IGVkaXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlIG9mIHRleHQgdG8gYmUgZGVsZXRlZC5cbiAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiBUaGUgYW5ub3RhdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkZWwocmFuZ2UsIGFubm90YXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIG5ld1RleHQ6ICcnLCBhbm5vdGF0aW9uSWQ6IGFubm90YXRpb24gfTtcbiAgICB9XG4gICAgQW5ub3RhdGVkVGV4dEVkaXQuZGVsID0gZGVsO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gVGV4dEVkaXQuaXMoY2FuZGlkYXRlKSAmJiAoQ2hhbmdlQW5ub3RhdGlvbi5pcyhjYW5kaWRhdGUuYW5ub3RhdGlvbklkKSB8fCBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhjYW5kaWRhdGUuYW5ub3RhdGlvbklkKSk7XG4gICAgfVxuICAgIEFubm90YXRlZFRleHRFZGl0LmlzID0gaXM7XG59KShBbm5vdGF0ZWRUZXh0RWRpdCB8fCAoQW5ub3RhdGVkVGV4dEVkaXQgPSB7fSkpO1xuLyoqXG4gKiBUaGUgVGV4dERvY3VtZW50RWRpdCBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZVxuICogYW4gZWRpdCB0aGF0IG1hbmlwdWxhdGVzIGEgdGV4dCBkb2N1bWVudC5cbiAqL1xuZXhwb3J0IHZhciBUZXh0RG9jdW1lbnRFZGl0O1xuKGZ1bmN0aW9uIChUZXh0RG9jdW1lbnRFZGl0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBgVGV4dERvY3VtZW50RWRpdGBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodGV4dERvY3VtZW50LCBlZGl0cykge1xuICAgICAgICByZXR1cm4geyB0ZXh0RG9jdW1lbnQsIGVkaXRzIH07XG4gICAgfVxuICAgIFRleHREb2N1bWVudEVkaXQuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKVxuICAgICAgICAgICAgJiYgT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmlzKGNhbmRpZGF0ZS50ZXh0RG9jdW1lbnQpXG4gICAgICAgICAgICAmJiBBcnJheS5pc0FycmF5KGNhbmRpZGF0ZS5lZGl0cyk7XG4gICAgfVxuICAgIFRleHREb2N1bWVudEVkaXQuaXMgPSBpcztcbn0pKFRleHREb2N1bWVudEVkaXQgfHwgKFRleHREb2N1bWVudEVkaXQgPSB7fSkpO1xuZXhwb3J0IHZhciBDcmVhdGVGaWxlO1xuKGZ1bmN0aW9uIChDcmVhdGVGaWxlKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKHVyaSwgb3B0aW9ucywgYW5ub3RhdGlvbikge1xuICAgICAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgICAgICAga2luZDogJ2NyZWF0ZScsXG4gICAgICAgICAgICB1cmlcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKG9wdGlvbnMgIT09IHVuZGVmaW5lZCAmJiAob3B0aW9ucy5vdmVyd3JpdGUgIT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLmlnbm9yZUlmRXhpc3RzICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICByZXN1bHQub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFubm90YXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmFubm90YXRpb25JZCA9IGFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgQ3JlYXRlRmlsZS5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIGNhbmRpZGF0ZS5raW5kID09PSAnY3JlYXRlJyAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSkgJiYgKGNhbmRpZGF0ZS5vcHRpb25zID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICgoY2FuZGlkYXRlLm9wdGlvbnMub3ZlcndyaXRlID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUub3B0aW9ucy5vdmVyd3JpdGUpKSAmJiAoY2FuZGlkYXRlLm9wdGlvbnMuaWdub3JlSWZFeGlzdHMgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5vcHRpb25zLmlnbm9yZUlmRXhpc3RzKSkpKSAmJiAoY2FuZGlkYXRlLmFubm90YXRpb25JZCA9PT0gdW5kZWZpbmVkIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQpKTtcbiAgICB9XG4gICAgQ3JlYXRlRmlsZS5pcyA9IGlzO1xufSkoQ3JlYXRlRmlsZSB8fCAoQ3JlYXRlRmlsZSA9IHt9KSk7XG5leHBvcnQgdmFyIFJlbmFtZUZpbGU7XG4oZnVuY3Rpb24gKFJlbmFtZUZpbGUpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUob2xkVXJpLCBuZXdVcmksIG9wdGlvbnMsIGFubm90YXRpb24pIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIGtpbmQ6ICdyZW5hbWUnLFxuICAgICAgICAgICAgb2xkVXJpLFxuICAgICAgICAgICAgbmV3VXJpXG4gICAgICAgIH07XG4gICAgICAgIGlmIChvcHRpb25zICE9PSB1bmRlZmluZWQgJiYgKG9wdGlvbnMub3ZlcndyaXRlICE9PSB1bmRlZmluZWQgfHwgb3B0aW9ucy5pZ25vcmVJZkV4aXN0cyAhPT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgcmVzdWx0Lm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbm5vdGF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5hbm5vdGF0aW9uSWQgPSBhbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIFJlbmFtZUZpbGUuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBjYW5kaWRhdGUua2luZCA9PT0gJ3JlbmFtZScgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5vbGRVcmkpICYmIElzLnN0cmluZyhjYW5kaWRhdGUubmV3VXJpKSAmJiAoY2FuZGlkYXRlLm9wdGlvbnMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgKChjYW5kaWRhdGUub3B0aW9ucy5vdmVyd3JpdGUgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5vcHRpb25zLm92ZXJ3cml0ZSkpICYmIChjYW5kaWRhdGUub3B0aW9ucy5pZ25vcmVJZkV4aXN0cyA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLm9wdGlvbnMuaWdub3JlSWZFeGlzdHMpKSkpICYmIChjYW5kaWRhdGUuYW5ub3RhdGlvbklkID09PSB1bmRlZmluZWQgfHwgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoY2FuZGlkYXRlLmFubm90YXRpb25JZCkpO1xuICAgIH1cbiAgICBSZW5hbWVGaWxlLmlzID0gaXM7XG59KShSZW5hbWVGaWxlIHx8IChSZW5hbWVGaWxlID0ge30pKTtcbmV4cG9ydCB2YXIgRGVsZXRlRmlsZTtcbihmdW5jdGlvbiAoRGVsZXRlRmlsZSkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmksIG9wdGlvbnMsIGFubm90YXRpb24pIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIGtpbmQ6ICdkZWxldGUnLFxuICAgICAgICAgICAgdXJpXG4gICAgICAgIH07XG4gICAgICAgIGlmIChvcHRpb25zICE9PSB1bmRlZmluZWQgJiYgKG9wdGlvbnMucmVjdXJzaXZlICE9PSB1bmRlZmluZWQgfHwgb3B0aW9ucy5pZ25vcmVJZk5vdEV4aXN0cyAhPT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgcmVzdWx0Lm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbm5vdGF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5hbm5vdGF0aW9uSWQgPSBhbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIERlbGV0ZUZpbGUuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBjYW5kaWRhdGUua2luZCA9PT0gJ2RlbGV0ZScgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpICYmIChjYW5kaWRhdGUub3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAoKGNhbmRpZGF0ZS5vcHRpb25zLnJlY3Vyc2l2ZSA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLm9wdGlvbnMucmVjdXJzaXZlKSkgJiYgKGNhbmRpZGF0ZS5vcHRpb25zLmlnbm9yZUlmTm90RXhpc3RzID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUub3B0aW9ucy5pZ25vcmVJZk5vdEV4aXN0cykpKSkgJiYgKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQgPT09IHVuZGVmaW5lZCB8fCBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhjYW5kaWRhdGUuYW5ub3RhdGlvbklkKSk7XG4gICAgfVxuICAgIERlbGV0ZUZpbGUuaXMgPSBpcztcbn0pKERlbGV0ZUZpbGUgfHwgKERlbGV0ZUZpbGUgPSB7fSkpO1xuZXhwb3J0IHZhciBXb3Jrc3BhY2VFZGl0O1xuKGZ1bmN0aW9uIChXb3Jrc3BhY2VFZGl0KSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmNoYW5nZXMgIT09IHVuZGVmaW5lZCB8fCBjYW5kaWRhdGUuZG9jdW1lbnRDaGFuZ2VzICE9PSB1bmRlZmluZWQpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmRvY3VtZW50Q2hhbmdlcyA9PT0gdW5kZWZpbmVkIHx8IGNhbmRpZGF0ZS5kb2N1bWVudENoYW5nZXMuZXZlcnkoKGNoYW5nZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChJcy5zdHJpbmcoY2hhbmdlLmtpbmQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVGaWxlLmlzKGNoYW5nZSkgfHwgUmVuYW1lRmlsZS5pcyhjaGFuZ2UpIHx8IERlbGV0ZUZpbGUuaXMoY2hhbmdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBUZXh0RG9jdW1lbnRFZGl0LmlzKGNoYW5nZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgIH1cbiAgICBXb3Jrc3BhY2VFZGl0LmlzID0gaXM7XG59KShXb3Jrc3BhY2VFZGl0IHx8IChXb3Jrc3BhY2VFZGl0ID0ge30pKTtcbmNsYXNzIFRleHRFZGl0Q2hhbmdlSW1wbCB7XG4gICAgY29uc3RydWN0b3IoZWRpdHMsIGNoYW5nZUFubm90YXRpb25zKSB7XG4gICAgICAgIHRoaXMuZWRpdHMgPSBlZGl0cztcbiAgICAgICAgdGhpcy5jaGFuZ2VBbm5vdGF0aW9ucyA9IGNoYW5nZUFubm90YXRpb25zO1xuICAgIH1cbiAgICBpbnNlcnQocG9zaXRpb24sIG5ld1RleHQsIGFubm90YXRpb24pIHtcbiAgICAgICAgbGV0IGVkaXQ7XG4gICAgICAgIGxldCBpZDtcbiAgICAgICAgaWYgKGFubm90YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZWRpdCA9IFRleHRFZGl0Lmluc2VydChwb3NpdGlvbiwgbmV3VGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoYW5ub3RhdGlvbikpIHtcbiAgICAgICAgICAgIGlkID0gYW5ub3RhdGlvbjtcbiAgICAgICAgICAgIGVkaXQgPSBBbm5vdGF0ZWRUZXh0RWRpdC5pbnNlcnQocG9zaXRpb24sIG5ld1RleHQsIGFubm90YXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hc3NlcnRDaGFuZ2VBbm5vdGF0aW9ucyh0aGlzLmNoYW5nZUFubm90YXRpb25zKTtcbiAgICAgICAgICAgIGlkID0gdGhpcy5jaGFuZ2VBbm5vdGF0aW9ucy5tYW5hZ2UoYW5ub3RhdGlvbik7XG4gICAgICAgICAgICBlZGl0ID0gQW5ub3RhdGVkVGV4dEVkaXQuaW5zZXJ0KHBvc2l0aW9uLCBuZXdUZXh0LCBpZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lZGl0cy5wdXNoKGVkaXQpO1xuICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlcGxhY2UocmFuZ2UsIG5ld1RleHQsIGFubm90YXRpb24pIHtcbiAgICAgICAgbGV0IGVkaXQ7XG4gICAgICAgIGxldCBpZDtcbiAgICAgICAgaWYgKGFubm90YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZWRpdCA9IFRleHRFZGl0LnJlcGxhY2UocmFuZ2UsIG5ld1RleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGFubm90YXRpb24pKSB7XG4gICAgICAgICAgICBpZCA9IGFubm90YXRpb247XG4gICAgICAgICAgICBlZGl0ID0gQW5ub3RhdGVkVGV4dEVkaXQucmVwbGFjZShyYW5nZSwgbmV3VGV4dCwgYW5ub3RhdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFzc2VydENoYW5nZUFubm90YXRpb25zKHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgaWQgPSB0aGlzLmNoYW5nZUFubm90YXRpb25zLm1hbmFnZShhbm5vdGF0aW9uKTtcbiAgICAgICAgICAgIGVkaXQgPSBBbm5vdGF0ZWRUZXh0RWRpdC5yZXBsYWNlKHJhbmdlLCBuZXdUZXh0LCBpZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lZGl0cy5wdXNoKGVkaXQpO1xuICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlbGV0ZShyYW5nZSwgYW5ub3RhdGlvbikge1xuICAgICAgICBsZXQgZWRpdDtcbiAgICAgICAgbGV0IGlkO1xuICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBlZGl0ID0gVGV4dEVkaXQuZGVsKHJhbmdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhhbm5vdGF0aW9uKSkge1xuICAgICAgICAgICAgaWQgPSBhbm5vdGF0aW9uO1xuICAgICAgICAgICAgZWRpdCA9IEFubm90YXRlZFRleHRFZGl0LmRlbChyYW5nZSwgYW5ub3RhdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFzc2VydENoYW5nZUFubm90YXRpb25zKHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgaWQgPSB0aGlzLmNoYW5nZUFubm90YXRpb25zLm1hbmFnZShhbm5vdGF0aW9uKTtcbiAgICAgICAgICAgIGVkaXQgPSBBbm5vdGF0ZWRUZXh0RWRpdC5kZWwocmFuZ2UsIGlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVkaXRzLnB1c2goZWRpdCk7XG4gICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYWRkKGVkaXQpIHtcbiAgICAgICAgdGhpcy5lZGl0cy5wdXNoKGVkaXQpO1xuICAgIH1cbiAgICBhbGwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRzO1xuICAgIH1cbiAgICBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5lZGl0cy5zcGxpY2UoMCwgdGhpcy5lZGl0cy5sZW5ndGgpO1xuICAgIH1cbiAgICBhc3NlcnRDaGFuZ2VBbm5vdGF0aW9ucyh2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUZXh0IGVkaXQgY2hhbmdlIGlzIG5vdCBjb25maWd1cmVkIHRvIG1hbmFnZSBjaGFuZ2UgYW5ub3RhdGlvbnMuYCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIEEgaGVscGVyIGNsYXNzXG4gKi9cbmNsYXNzIENoYW5nZUFubm90YXRpb25zIHtcbiAgICBjb25zdHJ1Y3Rvcihhbm5vdGF0aW9ucykge1xuICAgICAgICB0aGlzLl9hbm5vdGF0aW9ucyA9IGFubm90YXRpb25zID09PSB1bmRlZmluZWQgPyBPYmplY3QuY3JlYXRlKG51bGwpIDogYW5ub3RhdGlvbnM7XG4gICAgICAgIHRoaXMuX2NvdW50ZXIgPSAwO1xuICAgICAgICB0aGlzLl9zaXplID0gMDtcbiAgICB9XG4gICAgYWxsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYW5ub3RhdGlvbnM7XG4gICAgfVxuICAgIGdldCBzaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2l6ZTtcbiAgICB9XG4gICAgbWFuYWdlKGlkT3JBbm5vdGF0aW9uLCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIGxldCBpZDtcbiAgICAgICAgaWYgKENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGlkT3JBbm5vdGF0aW9uKSkge1xuICAgICAgICAgICAgaWQgPSBpZE9yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlkID0gdGhpcy5uZXh0SWQoKTtcbiAgICAgICAgICAgIGFubm90YXRpb24gPSBpZE9yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fYW5ub3RhdGlvbnNbaWRdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSWQgJHtpZH0gaXMgYWxyZWFkeSBpbiB1c2UuYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFubm90YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBhbm5vdGF0aW9uIHByb3ZpZGVkIGZvciBpZCAke2lkfWApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2Fubm90YXRpb25zW2lkXSA9IGFubm90YXRpb247XG4gICAgICAgIHRoaXMuX3NpemUrKztcbiAgICAgICAgcmV0dXJuIGlkO1xuICAgIH1cbiAgICBuZXh0SWQoKSB7XG4gICAgICAgIHRoaXMuX2NvdW50ZXIrKztcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvdW50ZXIudG9TdHJpbmcoKTtcbiAgICB9XG59XG4vKipcbiAqIEEgd29ya3NwYWNlIGNoYW5nZSBoZWxwcyBjb25zdHJ1Y3RpbmcgY2hhbmdlcyB0byBhIHdvcmtzcGFjZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFdvcmtzcGFjZUNoYW5nZSB7XG4gICAgY29uc3RydWN0b3Iod29ya3NwYWNlRWRpdCkge1xuICAgICAgICB0aGlzLl90ZXh0RWRpdENoYW5nZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBpZiAod29ya3NwYWNlRWRpdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0ID0gd29ya3NwYWNlRWRpdDtcbiAgICAgICAgICAgIGlmICh3b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZUFubm90YXRpb25zID0gbmV3IENoYW5nZUFubm90YXRpb25zKHdvcmtzcGFjZUVkaXQuY2hhbmdlQW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgICAgIHdvcmtzcGFjZUVkaXQuY2hhbmdlQW5ub3RhdGlvbnMgPSB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5hbGwoKTtcbiAgICAgICAgICAgICAgICB3b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcy5mb3JFYWNoKChjaGFuZ2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFRleHREb2N1bWVudEVkaXQuaXMoY2hhbmdlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dEVkaXRDaGFuZ2UgPSBuZXcgVGV4dEVkaXRDaGFuZ2VJbXBsKGNoYW5nZS5lZGl0cywgdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGV4dEVkaXRDaGFuZ2VzW2NoYW5nZS50ZXh0RG9jdW1lbnQudXJpXSA9IHRleHRFZGl0Q2hhbmdlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh3b3Jrc3BhY2VFZGl0LmNoYW5nZXMpIHtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyh3b3Jrc3BhY2VFZGl0LmNoYW5nZXMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0RWRpdENoYW5nZSA9IG5ldyBUZXh0RWRpdENoYW5nZUltcGwod29ya3NwYWNlRWRpdC5jaGFuZ2VzW2tleV0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXh0RWRpdENoYW5nZXNba2V5XSA9IHRleHRFZGl0Q2hhbmdlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdCA9IHt9O1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHVuZGVybHlpbmcge0BsaW5rIFdvcmtzcGFjZUVkaXR9IGxpdGVyYWxcbiAgICAgKiB1c2UgdG8gYmUgcmV0dXJuZWQgZnJvbSBhIHdvcmtzcGFjZSBlZGl0IG9wZXJhdGlvbiBsaWtlIHJlbmFtZS5cbiAgICAgKi9cbiAgICBnZXQgZWRpdCgpIHtcbiAgICAgICAgdGhpcy5pbml0RG9jdW1lbnRDaGFuZ2VzKCk7XG4gICAgICAgIGlmICh0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlQW5ub3RhdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZUFubm90YXRpb25zID0gdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMuYWxsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3dvcmtzcGFjZUVkaXQ7XG4gICAgfVxuICAgIGdldFRleHRFZGl0Q2hhbmdlKGtleSkge1xuICAgICAgICBpZiAoT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmlzKGtleSkpIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdERvY3VtZW50Q2hhbmdlcygpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dvcmtzcGFjZSBlZGl0IGlzIG5vdCBjb25maWd1cmVkIGZvciBkb2N1bWVudCBjaGFuZ2VzLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdGV4dERvY3VtZW50ID0geyB1cmk6IGtleS51cmksIHZlcnNpb246IGtleS52ZXJzaW9uIH07XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5fdGV4dEVkaXRDaGFuZ2VzW3RleHREb2N1bWVudC51cmldO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlZGl0cyA9IFtdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRleHREb2N1bWVudEVkaXQgPSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHREb2N1bWVudCxcbiAgICAgICAgICAgICAgICAgICAgZWRpdHNcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzLnB1c2godGV4dERvY3VtZW50RWRpdCk7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFRleHRFZGl0Q2hhbmdlSW1wbChlZGl0cywgdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3RleHRFZGl0Q2hhbmdlc1t0ZXh0RG9jdW1lbnQudXJpXSA9IHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmluaXRDaGFuZ2VzKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dvcmtzcGFjZSBlZGl0IGlzIG5vdCBjb25maWd1cmVkIGZvciBub3JtYWwgdGV4dCBlZGl0IGNoYW5nZXMuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5fdGV4dEVkaXRDaGFuZ2VzW2tleV07XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgICAgIGxldCBlZGl0cyA9IFtdO1xuICAgICAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlc1trZXldID0gZWRpdHM7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFRleHRFZGl0Q2hhbmdlSW1wbChlZGl0cyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGV4dEVkaXRDaGFuZ2VzW2tleV0gPSByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgfVxuICAgIGluaXREb2N1bWVudENoYW5nZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcyA9PT0gdW5kZWZpbmVkICYmIHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucyA9IG5ldyBDaGFuZ2VBbm5vdGF0aW9ucygpO1xuICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlQW5ub3RhdGlvbnMgPSB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5hbGwoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpbml0Q2hhbmdlcygpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzID09PSB1bmRlZmluZWQgJiYgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY3JlYXRlRmlsZSh1cmksIG9wdGlvbnNPckFubm90YXRpb24sIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5pbml0RG9jdW1lbnRDaGFuZ2VzKCk7XG4gICAgICAgIGlmICh0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dvcmtzcGFjZSBlZGl0IGlzIG5vdCBjb25maWd1cmVkIGZvciBkb2N1bWVudCBjaGFuZ2VzLicpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhbm5vdGF0aW9uO1xuICAgICAgICBpZiAoQ2hhbmdlQW5ub3RhdGlvbi5pcyhvcHRpb25zT3JBbm5vdGF0aW9uKSB8fCBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhvcHRpb25zT3JBbm5vdGF0aW9uKSkge1xuICAgICAgICAgICAgYW5ub3RhdGlvbiA9IG9wdGlvbnNPckFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvcHRpb25zID0gb3B0aW9uc09yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb3BlcmF0aW9uO1xuICAgICAgICBsZXQgaWQ7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wZXJhdGlvbiA9IENyZWF0ZUZpbGUuY3JlYXRlKHVyaSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZCA9IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGFubm90YXRpb24pID8gYW5ub3RhdGlvbiA6IHRoaXMuX2NoYW5nZUFubm90YXRpb25zLm1hbmFnZShhbm5vdGF0aW9uKTtcbiAgICAgICAgICAgIG9wZXJhdGlvbiA9IENyZWF0ZUZpbGUuY3JlYXRlKHVyaSwgb3B0aW9ucywgaWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzLnB1c2gob3BlcmF0aW9uKTtcbiAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZW5hbWVGaWxlKG9sZFVyaSwgbmV3VXJpLCBvcHRpb25zT3JBbm5vdGF0aW9uLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuaW5pdERvY3VtZW50Q2hhbmdlcygpO1xuICAgICAgICBpZiAodGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXb3Jrc3BhY2UgZWRpdCBpcyBub3QgY29uZmlndXJlZCBmb3IgZG9jdW1lbnQgY2hhbmdlcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYW5ub3RhdGlvbjtcbiAgICAgICAgaWYgKENoYW5nZUFubm90YXRpb24uaXMob3B0aW9uc09yQW5ub3RhdGlvbikgfHwgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMob3B0aW9uc09yQW5ub3RhdGlvbikpIHtcbiAgICAgICAgICAgIGFubm90YXRpb24gPSBvcHRpb25zT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnNPckFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG9wZXJhdGlvbjtcbiAgICAgICAgbGV0IGlkO1xuICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcGVyYXRpb24gPSBSZW5hbWVGaWxlLmNyZWF0ZShvbGRVcmksIG5ld1VyaSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZCA9IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGFubm90YXRpb24pID8gYW5ub3RhdGlvbiA6IHRoaXMuX2NoYW5nZUFubm90YXRpb25zLm1hbmFnZShhbm5vdGF0aW9uKTtcbiAgICAgICAgICAgIG9wZXJhdGlvbiA9IFJlbmFtZUZpbGUuY3JlYXRlKG9sZFVyaSwgbmV3VXJpLCBvcHRpb25zLCBpZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMucHVzaChvcGVyYXRpb24pO1xuICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlbGV0ZUZpbGUodXJpLCBvcHRpb25zT3JBbm5vdGF0aW9uLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuaW5pdERvY3VtZW50Q2hhbmdlcygpO1xuICAgICAgICBpZiAodGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXb3Jrc3BhY2UgZWRpdCBpcyBub3QgY29uZmlndXJlZCBmb3IgZG9jdW1lbnQgY2hhbmdlcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYW5ub3RhdGlvbjtcbiAgICAgICAgaWYgKENoYW5nZUFubm90YXRpb24uaXMob3B0aW9uc09yQW5ub3RhdGlvbikgfHwgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMob3B0aW9uc09yQW5ub3RhdGlvbikpIHtcbiAgICAgICAgICAgIGFubm90YXRpb24gPSBvcHRpb25zT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnNPckFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG9wZXJhdGlvbjtcbiAgICAgICAgbGV0IGlkO1xuICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcGVyYXRpb24gPSBEZWxldGVGaWxlLmNyZWF0ZSh1cmksIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWQgPSBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhhbm5vdGF0aW9uKSA/IGFubm90YXRpb24gOiB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5tYW5hZ2UoYW5ub3RhdGlvbik7XG4gICAgICAgICAgICBvcGVyYXRpb24gPSBEZWxldGVGaWxlLmNyZWF0ZSh1cmksIG9wdGlvbnMsIGlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcy5wdXNoKG9wZXJhdGlvbik7XG4gICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIFRoZSBUZXh0RG9jdW1lbnRJZGVudGlmaWVyIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIFRleHREb2N1bWVudElkZW50aWZpZXJ9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIFRleHREb2N1bWVudElkZW50aWZpZXI7XG4oZnVuY3Rpb24gKFRleHREb2N1bWVudElkZW50aWZpZXIpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFRleHREb2N1bWVudElkZW50aWZpZXIgbGl0ZXJhbC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSBkb2N1bWVudCdzIHVyaS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodXJpKSB7XG4gICAgICAgIHJldHVybiB7IHVyaSB9O1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIFRleHREb2N1bWVudElkZW50aWZpZXJ9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpO1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmlzID0gaXM7XG59KShUZXh0RG9jdW1lbnRJZGVudGlmaWVyIHx8IChUZXh0RG9jdW1lbnRJZGVudGlmaWVyID0ge30pKTtcbi8qKlxuICogVGhlIFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcjtcbihmdW5jdGlvbiAoVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciBsaXRlcmFsLlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIGRvY3VtZW50J3MgdXJpLlxuICAgICAqIEBwYXJhbSB2ZXJzaW9uIFRoZSBkb2N1bWVudCdzIHZlcnNpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHVyaSwgdmVyc2lvbikge1xuICAgICAgICByZXR1cm4geyB1cmksIHZlcnNpb24gfTtcbiAgICB9XG4gICAgVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllci5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudXJpKSAmJiBJcy5pbnRlZ2VyKGNhbmRpZGF0ZS52ZXJzaW9uKTtcbiAgICB9XG4gICAgVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllci5pcyA9IGlzO1xufSkoVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciB8fCAoVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciA9IHt9KSk7XG4vKipcbiAqIFRoZSBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXI7XG4oZnVuY3Rpb24gKE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIGxpdGVyYWwuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgZG9jdW1lbnQncyB1cmkuXG4gICAgICogQHBhcmFtIHZlcnNpb24gVGhlIGRvY3VtZW50J3MgdmVyc2lvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodXJpLCB2ZXJzaW9uKSB7XG4gICAgICAgIHJldHVybiB7IHVyaSwgdmVyc2lvbiB9O1xuICAgIH1cbiAgICBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudXJpKSAmJiAoY2FuZGlkYXRlLnZlcnNpb24gPT09IG51bGwgfHwgSXMuaW50ZWdlcihjYW5kaWRhdGUudmVyc2lvbikpO1xuICAgIH1cbiAgICBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIuaXMgPSBpcztcbn0pKE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciB8fCAoT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyID0ge30pKTtcbi8qKlxuICogVGhlIFRleHREb2N1bWVudEl0ZW0gbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgVGV4dERvY3VtZW50SXRlbX0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgVGV4dERvY3VtZW50SXRlbTtcbihmdW5jdGlvbiAoVGV4dERvY3VtZW50SXRlbSkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgVGV4dERvY3VtZW50SXRlbSBsaXRlcmFsLlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIGRvY3VtZW50J3MgdXJpLlxuICAgICAqIEBwYXJhbSBsYW5ndWFnZUlkIFRoZSBkb2N1bWVudCdzIGxhbmd1YWdlIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHZlcnNpb24gVGhlIGRvY3VtZW50J3MgdmVyc2lvbiBudW1iZXIuXG4gICAgICogQHBhcmFtIHRleHQgVGhlIGRvY3VtZW50J3MgdGV4dC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodXJpLCBsYW5ndWFnZUlkLCB2ZXJzaW9uLCB0ZXh0KSB7XG4gICAgICAgIHJldHVybiB7IHVyaSwgbGFuZ3VhZ2VJZCwgdmVyc2lvbiwgdGV4dCB9O1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnRJdGVtLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIFRleHREb2N1bWVudEl0ZW19IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpICYmIElzLnN0cmluZyhjYW5kaWRhdGUubGFuZ3VhZ2VJZCkgJiYgSXMuaW50ZWdlcihjYW5kaWRhdGUudmVyc2lvbikgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS50ZXh0KTtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50SXRlbS5pcyA9IGlzO1xufSkoVGV4dERvY3VtZW50SXRlbSB8fCAoVGV4dERvY3VtZW50SXRlbSA9IHt9KSk7XG4vKipcbiAqIERlc2NyaWJlcyB0aGUgY29udGVudCB0eXBlIHRoYXQgYSBjbGllbnQgc3VwcG9ydHMgaW4gdmFyaW91c1xuICogcmVzdWx0IGxpdGVyYWxzIGxpa2UgYEhvdmVyYCwgYFBhcmFtZXRlckluZm9gIG9yIGBDb21wbGV0aW9uSXRlbWAuXG4gKlxuICogUGxlYXNlIG5vdGUgdGhhdCBgTWFya3VwS2luZHNgIG11c3Qgbm90IHN0YXJ0IHdpdGggYSBgJGAuIFRoaXMga2luZHNcbiAqIGFyZSByZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNhZ2UuXG4gKi9cbmV4cG9ydCB2YXIgTWFya3VwS2luZDtcbihmdW5jdGlvbiAoTWFya3VwS2luZCkge1xuICAgIC8qKlxuICAgICAqIFBsYWluIHRleHQgaXMgc3VwcG9ydGVkIGFzIGEgY29udGVudCBmb3JtYXRcbiAgICAgKi9cbiAgICBNYXJrdXBLaW5kLlBsYWluVGV4dCA9ICdwbGFpbnRleHQnO1xuICAgIC8qKlxuICAgICAqIE1hcmtkb3duIGlzIHN1cHBvcnRlZCBhcyBhIGNvbnRlbnQgZm9ybWF0XG4gICAgICovXG4gICAgTWFya3VwS2luZC5NYXJrZG93biA9ICdtYXJrZG93bic7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIGlzIGEgdmFsdWUgb2YgdGhlIHtAbGluayBNYXJrdXBLaW5kfSB0eXBlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlID09PSBNYXJrdXBLaW5kLlBsYWluVGV4dCB8fCBjYW5kaWRhdGUgPT09IE1hcmt1cEtpbmQuTWFya2Rvd247XG4gICAgfVxuICAgIE1hcmt1cEtpbmQuaXMgPSBpcztcbn0pKE1hcmt1cEtpbmQgfHwgKE1hcmt1cEtpbmQgPSB7fSkpO1xuZXhwb3J0IHZhciBNYXJrdXBDb250ZW50O1xuKGZ1bmN0aW9uIChNYXJrdXBDb250ZW50KSB7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgTWFya3VwQ29udGVudH0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbCh2YWx1ZSkgJiYgTWFya3VwS2luZC5pcyhjYW5kaWRhdGUua2luZCkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS52YWx1ZSk7XG4gICAgfVxuICAgIE1hcmt1cENvbnRlbnQuaXMgPSBpcztcbn0pKE1hcmt1cENvbnRlbnQgfHwgKE1hcmt1cENvbnRlbnQgPSB7fSkpO1xuLyoqXG4gKiBUaGUga2luZCBvZiBhIGNvbXBsZXRpb24gZW50cnkuXG4gKi9cbmV4cG9ydCB2YXIgQ29tcGxldGlvbkl0ZW1LaW5kO1xuKGZ1bmN0aW9uIChDb21wbGV0aW9uSXRlbUtpbmQpIHtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuVGV4dCA9IDE7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLk1ldGhvZCA9IDI7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkZ1bmN0aW9uID0gMztcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuQ29uc3RydWN0b3IgPSA0O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5GaWVsZCA9IDU7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlZhcmlhYmxlID0gNjtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuQ2xhc3MgPSA3O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5JbnRlcmZhY2UgPSA4O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5Nb2R1bGUgPSA5O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5Qcm9wZXJ0eSA9IDEwO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5Vbml0ID0gMTE7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlZhbHVlID0gMTI7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkVudW0gPSAxMztcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuS2V5d29yZCA9IDE0O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5TbmlwcGV0ID0gMTU7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkNvbG9yID0gMTY7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkZpbGUgPSAxNztcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuUmVmZXJlbmNlID0gMTg7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkZvbGRlciA9IDE5O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5FbnVtTWVtYmVyID0gMjA7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkNvbnN0YW50ID0gMjE7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlN0cnVjdCA9IDIyO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5FdmVudCA9IDIzO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5PcGVyYXRvciA9IDI0O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5UeXBlUGFyYW1ldGVyID0gMjU7XG59KShDb21wbGV0aW9uSXRlbUtpbmQgfHwgKENvbXBsZXRpb25JdGVtS2luZCA9IHt9KSk7XG4vKipcbiAqIERlZmluZXMgd2hldGhlciB0aGUgaW5zZXJ0IHRleHQgaW4gYSBjb21wbGV0aW9uIGl0ZW0gc2hvdWxkIGJlIGludGVycHJldGVkIGFzXG4gKiBwbGFpbiB0ZXh0IG9yIGEgc25pcHBldC5cbiAqL1xuZXhwb3J0IHZhciBJbnNlcnRUZXh0Rm9ybWF0O1xuKGZ1bmN0aW9uIChJbnNlcnRUZXh0Rm9ybWF0KSB7XG4gICAgLyoqXG4gICAgICogVGhlIHByaW1hcnkgdGV4dCB0byBiZSBpbnNlcnRlZCBpcyB0cmVhdGVkIGFzIGEgcGxhaW4gc3RyaW5nLlxuICAgICAqL1xuICAgIEluc2VydFRleHRGb3JtYXQuUGxhaW5UZXh0ID0gMTtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpbWFyeSB0ZXh0IHRvIGJlIGluc2VydGVkIGlzIHRyZWF0ZWQgYXMgYSBzbmlwcGV0LlxuICAgICAqXG4gICAgICogQSBzbmlwcGV0IGNhbiBkZWZpbmUgdGFiIHN0b3BzIGFuZCBwbGFjZWhvbGRlcnMgd2l0aCBgJDFgLCBgJDJgXG4gICAgICogYW5kIGAkezM6Zm9vfWAuIGAkMGAgZGVmaW5lcyB0aGUgZmluYWwgdGFiIHN0b3AsIGl0IGRlZmF1bHRzIHRvXG4gICAgICogdGhlIGVuZCBvZiB0aGUgc25pcHBldC4gUGxhY2Vob2xkZXJzIHdpdGggZXF1YWwgaWRlbnRpZmllcnMgYXJlIGxpbmtlZCxcbiAgICAgKiB0aGF0IGlzIHR5cGluZyBpbiBvbmUgd2lsbCB1cGRhdGUgb3RoZXJzIHRvby5cbiAgICAgKlxuICAgICAqIFNlZSBhbHNvOiBodHRwczovL21pY3Jvc29mdC5naXRodWIuaW8vbGFuZ3VhZ2Utc2VydmVyLXByb3RvY29sL3NwZWNpZmljYXRpb25zL3NwZWNpZmljYXRpb24tY3VycmVudC8jc25pcHBldF9zeW50YXhcbiAgICAgKi9cbiAgICBJbnNlcnRUZXh0Rm9ybWF0LlNuaXBwZXQgPSAyO1xufSkoSW5zZXJ0VGV4dEZvcm1hdCB8fCAoSW5zZXJ0VGV4dEZvcm1hdCA9IHt9KSk7XG4vKipcbiAqIENvbXBsZXRpb24gaXRlbSB0YWdzIGFyZSBleHRyYSBhbm5vdGF0aW9ucyB0aGF0IHR3ZWFrIHRoZSByZW5kZXJpbmcgb2YgYSBjb21wbGV0aW9uXG4gKiBpdGVtLlxuICpcbiAqIEBzaW5jZSAzLjE1LjBcbiAqL1xuZXhwb3J0IHZhciBDb21wbGV0aW9uSXRlbVRhZztcbihmdW5jdGlvbiAoQ29tcGxldGlvbkl0ZW1UYWcpIHtcbiAgICAvKipcbiAgICAgKiBSZW5kZXIgYSBjb21wbGV0aW9uIGFzIG9ic29sZXRlLCB1c3VhbGx5IHVzaW5nIGEgc3RyaWtlLW91dC5cbiAgICAgKi9cbiAgICBDb21wbGV0aW9uSXRlbVRhZy5EZXByZWNhdGVkID0gMTtcbn0pKENvbXBsZXRpb25JdGVtVGFnIHx8IChDb21wbGV0aW9uSXRlbVRhZyA9IHt9KSk7XG4vKipcbiAqIFRoZSBJbnNlcnRSZXBsYWNlRWRpdCBuYW1lc3BhY2UgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCBpbnNlcnQgLyByZXBsYWNlIGVkaXRzLlxuICpcbiAqIEBzaW5jZSAzLjE2LjBcbiAqL1xuZXhwb3J0IHZhciBJbnNlcnRSZXBsYWNlRWRpdDtcbihmdW5jdGlvbiAoSW5zZXJ0UmVwbGFjZUVkaXQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGluc2VydCAvIHJlcGxhY2UgZWRpdFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShuZXdUZXh0LCBpbnNlcnQsIHJlcGxhY2UpIHtcbiAgICAgICAgcmV0dXJuIHsgbmV3VGV4dCwgaW5zZXJ0LCByZXBsYWNlIH07XG4gICAgfVxuICAgIEluc2VydFJlcGxhY2VFZGl0LmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIEluc2VydFJlcGxhY2VFZGl0fSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5uZXdUZXh0KSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUuaW5zZXJ0KSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmVwbGFjZSk7XG4gICAgfVxuICAgIEluc2VydFJlcGxhY2VFZGl0LmlzID0gaXM7XG59KShJbnNlcnRSZXBsYWNlRWRpdCB8fCAoSW5zZXJ0UmVwbGFjZUVkaXQgPSB7fSkpO1xuLyoqXG4gKiBIb3cgd2hpdGVzcGFjZSBhbmQgaW5kZW50YXRpb24gaXMgaGFuZGxlZCBkdXJpbmcgY29tcGxldGlvblxuICogaXRlbSBpbnNlcnRpb24uXG4gKlxuICogQHNpbmNlIDMuMTYuMFxuICovXG5leHBvcnQgdmFyIEluc2VydFRleHRNb2RlO1xuKGZ1bmN0aW9uIChJbnNlcnRUZXh0TW9kZSkge1xuICAgIC8qKlxuICAgICAqIFRoZSBpbnNlcnRpb24gb3IgcmVwbGFjZSBzdHJpbmdzIGlzIHRha2VuIGFzIGl0IGlzLiBJZiB0aGVcbiAgICAgKiB2YWx1ZSBpcyBtdWx0aSBsaW5lIHRoZSBsaW5lcyBiZWxvdyB0aGUgY3Vyc29yIHdpbGwgYmVcbiAgICAgKiBpbnNlcnRlZCB1c2luZyB0aGUgaW5kZW50YXRpb24gZGVmaW5lZCBpbiB0aGUgc3RyaW5nIHZhbHVlLlxuICAgICAqIFRoZSBjbGllbnQgd2lsbCBub3QgYXBwbHkgYW55IGtpbmQgb2YgYWRqdXN0bWVudHMgdG8gdGhlXG4gICAgICogc3RyaW5nLlxuICAgICAqL1xuICAgIEluc2VydFRleHRNb2RlLmFzSXMgPSAxO1xuICAgIC8qKlxuICAgICAqIFRoZSBlZGl0b3IgYWRqdXN0cyBsZWFkaW5nIHdoaXRlc3BhY2Ugb2YgbmV3IGxpbmVzIHNvIHRoYXRcbiAgICAgKiB0aGV5IG1hdGNoIHRoZSBpbmRlbnRhdGlvbiB1cCB0byB0aGUgY3Vyc29yIG9mIHRoZSBsaW5lIGZvclxuICAgICAqIHdoaWNoIHRoZSBpdGVtIGlzIGFjY2VwdGVkLlxuICAgICAqXG4gICAgICogQ29uc2lkZXIgYSBsaW5lIGxpa2UgdGhpczogPDJ0YWJzPjxjdXJzb3I+PDN0YWJzPmZvby4gQWNjZXB0aW5nIGFcbiAgICAgKiBtdWx0aSBsaW5lIGNvbXBsZXRpb24gaXRlbSBpcyBpbmRlbnRlZCB1c2luZyAyIHRhYnMgYW5kIGFsbFxuICAgICAqIGZvbGxvd2luZyBsaW5lcyBpbnNlcnRlZCB3aWxsIGJlIGluZGVudGVkIHVzaW5nIDIgdGFicyBhcyB3ZWxsLlxuICAgICAqL1xuICAgIEluc2VydFRleHRNb2RlLmFkanVzdEluZGVudGF0aW9uID0gMjtcbn0pKEluc2VydFRleHRNb2RlIHx8IChJbnNlcnRUZXh0TW9kZSA9IHt9KSk7XG5leHBvcnQgdmFyIENvbXBsZXRpb25JdGVtTGFiZWxEZXRhaWxzO1xuKGZ1bmN0aW9uIChDb21wbGV0aW9uSXRlbUxhYmVsRGV0YWlscykge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIChJcy5zdHJpbmcoY2FuZGlkYXRlLmRldGFpbCkgfHwgY2FuZGlkYXRlLmRldGFpbCA9PT0gdW5kZWZpbmVkKSAmJlxuICAgICAgICAgICAgKElzLnN0cmluZyhjYW5kaWRhdGUuZGVzY3JpcHRpb24pIHx8IGNhbmRpZGF0ZS5kZXNjcmlwdGlvbiA9PT0gdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgQ29tcGxldGlvbkl0ZW1MYWJlbERldGFpbHMuaXMgPSBpcztcbn0pKENvbXBsZXRpb25JdGVtTGFiZWxEZXRhaWxzIHx8IChDb21wbGV0aW9uSXRlbUxhYmVsRGV0YWlscyA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb21wbGV0aW9uSXRlbSBuYW1lc3BhY2UgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aFxuICogY29tcGxldGlvbiBpdGVtcy5cbiAqL1xuZXhwb3J0IHZhciBDb21wbGV0aW9uSXRlbTtcbihmdW5jdGlvbiAoQ29tcGxldGlvbkl0ZW0pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBjb21wbGV0aW9uIGl0ZW0gYW5kIHNlZWQgaXQgd2l0aCBhIGxhYmVsLlxuICAgICAqIEBwYXJhbSBsYWJlbCBUaGUgY29tcGxldGlvbiBpdGVtJ3MgbGFiZWxcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobGFiZWwpIHtcbiAgICAgICAgcmV0dXJuIHsgbGFiZWwgfTtcbiAgICB9XG4gICAgQ29tcGxldGlvbkl0ZW0uY3JlYXRlID0gY3JlYXRlO1xufSkoQ29tcGxldGlvbkl0ZW0gfHwgKENvbXBsZXRpb25JdGVtID0ge30pKTtcbi8qKlxuICogVGhlIENvbXBsZXRpb25MaXN0IG5hbWVzcGFjZSBwcm92aWRlcyBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoXG4gKiBjb21wbGV0aW9uIGxpc3RzLlxuICovXG5leHBvcnQgdmFyIENvbXBsZXRpb25MaXN0O1xuKGZ1bmN0aW9uIChDb21wbGV0aW9uTGlzdCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgY29tcGxldGlvbiBsaXN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIGl0ZW1zIFRoZSBjb21wbGV0aW9uIGl0ZW1zLlxuICAgICAqIEBwYXJhbSBpc0luY29tcGxldGUgVGhlIGxpc3QgaXMgbm90IGNvbXBsZXRlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShpdGVtcywgaXNJbmNvbXBsZXRlKSB7XG4gICAgICAgIHJldHVybiB7IGl0ZW1zOiBpdGVtcyA/IGl0ZW1zIDogW10sIGlzSW5jb21wbGV0ZTogISFpc0luY29tcGxldGUgfTtcbiAgICB9XG4gICAgQ29tcGxldGlvbkxpc3QuY3JlYXRlID0gY3JlYXRlO1xufSkoQ29tcGxldGlvbkxpc3QgfHwgKENvbXBsZXRpb25MaXN0ID0ge30pKTtcbmV4cG9ydCB2YXIgTWFya2VkU3RyaW5nO1xuKGZ1bmN0aW9uIChNYXJrZWRTdHJpbmcpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbWFya2VkIHN0cmluZyBmcm9tIHBsYWluIHRleHQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGxhaW5UZXh0IFRoZSBwbGFpbiB0ZXh0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZyb21QbGFpblRleHQocGxhaW5UZXh0KSB7XG4gICAgICAgIHJldHVybiBwbGFpblRleHQucmVwbGFjZSgvW1xcXFxgKl97fVtcXF0oKSMrXFwtLiFdL2csICdcXFxcJCYnKTsgLy8gZXNjYXBlIG1hcmtkb3duIHN5bnRheCB0b2tlbnM6IGh0dHA6Ly9kYXJpbmdmaXJlYmFsbC5uZXQvcHJvamVjdHMvbWFya2Rvd24vc3ludGF4I2JhY2tzbGFzaFxuICAgIH1cbiAgICBNYXJrZWRTdHJpbmcuZnJvbVBsYWluVGV4dCA9IGZyb21QbGFpblRleHQ7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgTWFya2VkU3RyaW5nfSB0eXBlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuc3RyaW5nKGNhbmRpZGF0ZSkgfHwgKElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLmxhbmd1YWdlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnZhbHVlKSk7XG4gICAgfVxuICAgIE1hcmtlZFN0cmluZy5pcyA9IGlzO1xufSkoTWFya2VkU3RyaW5nIHx8IChNYXJrZWRTdHJpbmcgPSB7fSkpO1xuZXhwb3J0IHZhciBIb3ZlcjtcbihmdW5jdGlvbiAoSG92ZXIpIHtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgY29uZm9ybXMgdG8gdGhlIHtAbGluayBIb3Zlcn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuICEhY2FuZGlkYXRlICYmIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiAoTWFya3VwQ29udGVudC5pcyhjYW5kaWRhdGUuY29udGVudHMpIHx8XG4gICAgICAgICAgICBNYXJrZWRTdHJpbmcuaXMoY2FuZGlkYXRlLmNvbnRlbnRzKSB8fFxuICAgICAgICAgICAgSXMudHlwZWRBcnJheShjYW5kaWRhdGUuY29udGVudHMsIE1hcmtlZFN0cmluZy5pcykpICYmICh2YWx1ZS5yYW5nZSA9PT0gdW5kZWZpbmVkIHx8IFJhbmdlLmlzKHZhbHVlLnJhbmdlKSk7XG4gICAgfVxuICAgIEhvdmVyLmlzID0gaXM7XG59KShIb3ZlciB8fCAoSG92ZXIgPSB7fSkpO1xuLyoqXG4gKiBUaGUgUGFyYW1ldGVySW5mb3JtYXRpb24gbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgUGFyYW1ldGVySW5mb3JtYXRpb259IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIFBhcmFtZXRlckluZm9ybWF0aW9uO1xuKGZ1bmN0aW9uIChQYXJhbWV0ZXJJbmZvcm1hdGlvbikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgcGFyYW1ldGVyIGluZm9ybWF0aW9uIGxpdGVyYWwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGFiZWwgQSBsYWJlbCBzdHJpbmcuXG4gICAgICogQHBhcmFtIGRvY3VtZW50YXRpb24gQSBkb2Mgc3RyaW5nLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShsYWJlbCwgZG9jdW1lbnRhdGlvbikge1xuICAgICAgICByZXR1cm4gZG9jdW1lbnRhdGlvbiA/IHsgbGFiZWwsIGRvY3VtZW50YXRpb24gfSA6IHsgbGFiZWwgfTtcbiAgICB9XG4gICAgUGFyYW1ldGVySW5mb3JtYXRpb24uY3JlYXRlID0gY3JlYXRlO1xufSkoUGFyYW1ldGVySW5mb3JtYXRpb24gfHwgKFBhcmFtZXRlckluZm9ybWF0aW9uID0ge30pKTtcbi8qKlxuICogVGhlIFNpZ25hdHVyZUluZm9ybWF0aW9uIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIFNpZ25hdHVyZUluZm9ybWF0aW9ufSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBTaWduYXR1cmVJbmZvcm1hdGlvbjtcbihmdW5jdGlvbiAoU2lnbmF0dXJlSW5mb3JtYXRpb24pIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUobGFiZWwsIGRvY3VtZW50YXRpb24sIC4uLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHsgbGFiZWwgfTtcbiAgICAgICAgaWYgKElzLmRlZmluZWQoZG9jdW1lbnRhdGlvbikpIHtcbiAgICAgICAgICAgIHJlc3VsdC5kb2N1bWVudGF0aW9uID0gZG9jdW1lbnRhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXMuZGVmaW5lZChwYXJhbWV0ZXJzKSkge1xuICAgICAgICAgICAgcmVzdWx0LnBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0LnBhcmFtZXRlcnMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBTaWduYXR1cmVJbmZvcm1hdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG59KShTaWduYXR1cmVJbmZvcm1hdGlvbiB8fCAoU2lnbmF0dXJlSW5mb3JtYXRpb24gPSB7fSkpO1xuLyoqXG4gKiBBIGRvY3VtZW50IGhpZ2hsaWdodCBraW5kLlxuICovXG5leHBvcnQgdmFyIERvY3VtZW50SGlnaGxpZ2h0S2luZDtcbihmdW5jdGlvbiAoRG9jdW1lbnRIaWdobGlnaHRLaW5kKSB7XG4gICAgLyoqXG4gICAgICogQSB0ZXh0dWFsIG9jY3VycmVuY2UuXG4gICAgICovXG4gICAgRG9jdW1lbnRIaWdobGlnaHRLaW5kLlRleHQgPSAxO1xuICAgIC8qKlxuICAgICAqIFJlYWQtYWNjZXNzIG9mIGEgc3ltYm9sLCBsaWtlIHJlYWRpbmcgYSB2YXJpYWJsZS5cbiAgICAgKi9cbiAgICBEb2N1bWVudEhpZ2hsaWdodEtpbmQuUmVhZCA9IDI7XG4gICAgLyoqXG4gICAgICogV3JpdGUtYWNjZXNzIG9mIGEgc3ltYm9sLCBsaWtlIHdyaXRpbmcgdG8gYSB2YXJpYWJsZS5cbiAgICAgKi9cbiAgICBEb2N1bWVudEhpZ2hsaWdodEtpbmQuV3JpdGUgPSAzO1xufSkoRG9jdW1lbnRIaWdobGlnaHRLaW5kIHx8IChEb2N1bWVudEhpZ2hsaWdodEtpbmQgPSB7fSkpO1xuLyoqXG4gKiBEb2N1bWVudEhpZ2hsaWdodCBuYW1lc3BhY2UgdG8gcHJvdmlkZSBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIERvY3VtZW50SGlnaGxpZ2h0fSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBEb2N1bWVudEhpZ2hsaWdodDtcbihmdW5jdGlvbiAoRG9jdW1lbnRIaWdobGlnaHQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBEb2N1bWVudEhpZ2hsaWdodCBvYmplY3QuXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSB0aGUgaGlnaGxpZ2h0IGFwcGxpZXMgdG8uXG4gICAgICogQHBhcmFtIGtpbmQgVGhlIGhpZ2hsaWdodCBraW5kXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCBraW5kKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IHJhbmdlIH07XG4gICAgICAgIGlmIChJcy5udW1iZXIoa2luZCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5raW5kID0ga2luZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBEb2N1bWVudEhpZ2hsaWdodC5jcmVhdGUgPSBjcmVhdGU7XG59KShEb2N1bWVudEhpZ2hsaWdodCB8fCAoRG9jdW1lbnRIaWdobGlnaHQgPSB7fSkpO1xuLyoqXG4gKiBBIHN5bWJvbCBraW5kLlxuICovXG5leHBvcnQgdmFyIFN5bWJvbEtpbmQ7XG4oZnVuY3Rpb24gKFN5bWJvbEtpbmQpIHtcbiAgICBTeW1ib2xLaW5kLkZpbGUgPSAxO1xuICAgIFN5bWJvbEtpbmQuTW9kdWxlID0gMjtcbiAgICBTeW1ib2xLaW5kLk5hbWVzcGFjZSA9IDM7XG4gICAgU3ltYm9sS2luZC5QYWNrYWdlID0gNDtcbiAgICBTeW1ib2xLaW5kLkNsYXNzID0gNTtcbiAgICBTeW1ib2xLaW5kLk1ldGhvZCA9IDY7XG4gICAgU3ltYm9sS2luZC5Qcm9wZXJ0eSA9IDc7XG4gICAgU3ltYm9sS2luZC5GaWVsZCA9IDg7XG4gICAgU3ltYm9sS2luZC5Db25zdHJ1Y3RvciA9IDk7XG4gICAgU3ltYm9sS2luZC5FbnVtID0gMTA7XG4gICAgU3ltYm9sS2luZC5JbnRlcmZhY2UgPSAxMTtcbiAgICBTeW1ib2xLaW5kLkZ1bmN0aW9uID0gMTI7XG4gICAgU3ltYm9sS2luZC5WYXJpYWJsZSA9IDEzO1xuICAgIFN5bWJvbEtpbmQuQ29uc3RhbnQgPSAxNDtcbiAgICBTeW1ib2xLaW5kLlN0cmluZyA9IDE1O1xuICAgIFN5bWJvbEtpbmQuTnVtYmVyID0gMTY7XG4gICAgU3ltYm9sS2luZC5Cb29sZWFuID0gMTc7XG4gICAgU3ltYm9sS2luZC5BcnJheSA9IDE4O1xuICAgIFN5bWJvbEtpbmQuT2JqZWN0ID0gMTk7XG4gICAgU3ltYm9sS2luZC5LZXkgPSAyMDtcbiAgICBTeW1ib2xLaW5kLk51bGwgPSAyMTtcbiAgICBTeW1ib2xLaW5kLkVudW1NZW1iZXIgPSAyMjtcbiAgICBTeW1ib2xLaW5kLlN0cnVjdCA9IDIzO1xuICAgIFN5bWJvbEtpbmQuRXZlbnQgPSAyNDtcbiAgICBTeW1ib2xLaW5kLk9wZXJhdG9yID0gMjU7XG4gICAgU3ltYm9sS2luZC5UeXBlUGFyYW1ldGVyID0gMjY7XG59KShTeW1ib2xLaW5kIHx8IChTeW1ib2xLaW5kID0ge30pKTtcbi8qKlxuICogU3ltYm9sIHRhZ3MgYXJlIGV4dHJhIGFubm90YXRpb25zIHRoYXQgdHdlYWsgdGhlIHJlbmRlcmluZyBvZiBhIHN5bWJvbC5cbiAqXG4gKiBAc2luY2UgMy4xNlxuICovXG5leHBvcnQgdmFyIFN5bWJvbFRhZztcbihmdW5jdGlvbiAoU3ltYm9sVGFnKSB7XG4gICAgLyoqXG4gICAgICogUmVuZGVyIGEgc3ltYm9sIGFzIG9ic29sZXRlLCB1c3VhbGx5IHVzaW5nIGEgc3RyaWtlLW91dC5cbiAgICAgKi9cbiAgICBTeW1ib2xUYWcuRGVwcmVjYXRlZCA9IDE7XG59KShTeW1ib2xUYWcgfHwgKFN5bWJvbFRhZyA9IHt9KSk7XG5leHBvcnQgdmFyIFN5bWJvbEluZm9ybWF0aW9uO1xuKGZ1bmN0aW9uIChTeW1ib2xJbmZvcm1hdGlvbikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgc3ltYm9sIGluZm9ybWF0aW9uIGxpdGVyYWwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSBraW5kIFRoZSBraW5kIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSBvZiB0aGUgbG9jYXRpb24gb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSByZXNvdXJjZSBvZiB0aGUgbG9jYXRpb24gb2Ygc3ltYm9sLlxuICAgICAqIEBwYXJhbSBjb250YWluZXJOYW1lIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgY29udGFpbmluZyB0aGUgc3ltYm9sLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShuYW1lLCBraW5kLCByYW5nZSwgdXJpLCBjb250YWluZXJOYW1lKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAga2luZCxcbiAgICAgICAgICAgIGxvY2F0aW9uOiB7IHVyaSwgcmFuZ2UgfVxuICAgICAgICB9O1xuICAgICAgICBpZiAoY29udGFpbmVyTmFtZSkge1xuICAgICAgICAgICAgcmVzdWx0LmNvbnRhaW5lck5hbWUgPSBjb250YWluZXJOYW1lO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIFN5bWJvbEluZm9ybWF0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKFN5bWJvbEluZm9ybWF0aW9uIHx8IChTeW1ib2xJbmZvcm1hdGlvbiA9IHt9KSk7XG5leHBvcnQgdmFyIFdvcmtzcGFjZVN5bWJvbDtcbihmdW5jdGlvbiAoV29ya3NwYWNlU3ltYm9sKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IHdvcmtzcGFjZSBzeW1ib2wuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSBraW5kIFRoZSBraW5kIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgcmVzb3VyY2Ugb2YgdGhlIGxvY2F0aW9uIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIHJhbmdlIEFuIG9wdGlvbnMgcmFuZ2Ugb2YgdGhlIGxvY2F0aW9uLlxuICAgICAqIEByZXR1cm5zIEEgV29ya3NwYWNlU3ltYm9sLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShuYW1lLCBraW5kLCB1cmksIHJhbmdlKSB7XG4gICAgICAgIHJldHVybiByYW5nZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IHsgbmFtZSwga2luZCwgbG9jYXRpb246IHsgdXJpLCByYW5nZSB9IH1cbiAgICAgICAgICAgIDogeyBuYW1lLCBraW5kLCBsb2NhdGlvbjogeyB1cmkgfSB9O1xuICAgIH1cbiAgICBXb3Jrc3BhY2VTeW1ib2wuY3JlYXRlID0gY3JlYXRlO1xufSkoV29ya3NwYWNlU3ltYm9sIHx8IChXb3Jrc3BhY2VTeW1ib2wgPSB7fSkpO1xuZXhwb3J0IHZhciBEb2N1bWVudFN5bWJvbDtcbihmdW5jdGlvbiAoRG9jdW1lbnRTeW1ib2wpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHN5bWJvbCBpbmZvcm1hdGlvbiBsaXRlcmFsLlxuICAgICAqXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gZGV0YWlsIFRoZSBkZXRhaWwgb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0ga2luZCBUaGUga2luZCBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2Ugb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gc2VsZWN0aW9uUmFuZ2UgVGhlIHNlbGVjdGlvblJhbmdlIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIGNoaWxkcmVuIENoaWxkcmVuIG9mIHRoZSBzeW1ib2wuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKG5hbWUsIGRldGFpbCwga2luZCwgcmFuZ2UsIHNlbGVjdGlvblJhbmdlLCBjaGlsZHJlbikge1xuICAgICAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGRldGFpbCxcbiAgICAgICAgICAgIGtpbmQsXG4gICAgICAgICAgICByYW5nZSxcbiAgICAgICAgICAgIHNlbGVjdGlvblJhbmdlXG4gICAgICAgIH07XG4gICAgICAgIGlmIChjaGlsZHJlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBEb2N1bWVudFN5bWJvbC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBEb2N1bWVudFN5bWJvbH0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJlxuICAgICAgICAgICAgSXMuc3RyaW5nKGNhbmRpZGF0ZS5uYW1lKSAmJiBJcy5udW1iZXIoY2FuZGlkYXRlLmtpbmQpICYmXG4gICAgICAgICAgICBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5zZWxlY3Rpb25SYW5nZSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuZGV0YWlsID09PSB1bmRlZmluZWQgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS5kZXRhaWwpKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5kZXByZWNhdGVkID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUuZGVwcmVjYXRlZCkpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmNoaWxkcmVuID09PSB1bmRlZmluZWQgfHwgQXJyYXkuaXNBcnJheShjYW5kaWRhdGUuY2hpbGRyZW4pKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS50YWdzID09PSB1bmRlZmluZWQgfHwgQXJyYXkuaXNBcnJheShjYW5kaWRhdGUudGFncykpO1xuICAgIH1cbiAgICBEb2N1bWVudFN5bWJvbC5pcyA9IGlzO1xufSkoRG9jdW1lbnRTeW1ib2wgfHwgKERvY3VtZW50U3ltYm9sID0ge30pKTtcbi8qKlxuICogQSBzZXQgb2YgcHJlZGVmaW5lZCBjb2RlIGFjdGlvbiBraW5kc1xuICovXG5leHBvcnQgdmFyIENvZGVBY3Rpb25LaW5kO1xuKGZ1bmN0aW9uIChDb2RlQWN0aW9uS2luZCkge1xuICAgIC8qKlxuICAgICAqIEVtcHR5IGtpbmQuXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuRW1wdHkgPSAnJztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIHF1aWNrZml4IGFjdGlvbnM6ICdxdWlja2ZpeCdcbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5RdWlja0ZpeCA9ICdxdWlja2ZpeCc7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciByZWZhY3RvcmluZyBhY3Rpb25zOiAncmVmYWN0b3InXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuUmVmYWN0b3IgPSAncmVmYWN0b3InO1xuICAgIC8qKlxuICAgICAqIEJhc2Uga2luZCBmb3IgcmVmYWN0b3JpbmcgZXh0cmFjdGlvbiBhY3Rpb25zOiAncmVmYWN0b3IuZXh0cmFjdCdcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgZXh0cmFjdCBhY3Rpb25zOlxuICAgICAqXG4gICAgICogLSBFeHRyYWN0IG1ldGhvZFxuICAgICAqIC0gRXh0cmFjdCBmdW5jdGlvblxuICAgICAqIC0gRXh0cmFjdCB2YXJpYWJsZVxuICAgICAqIC0gRXh0cmFjdCBpbnRlcmZhY2UgZnJvbSBjbGFzc1xuICAgICAqIC0gLi4uXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuUmVmYWN0b3JFeHRyYWN0ID0gJ3JlZmFjdG9yLmV4dHJhY3QnO1xuICAgIC8qKlxuICAgICAqIEJhc2Uga2luZCBmb3IgcmVmYWN0b3JpbmcgaW5saW5lIGFjdGlvbnM6ICdyZWZhY3Rvci5pbmxpbmUnXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIGlubGluZSBhY3Rpb25zOlxuICAgICAqXG4gICAgICogLSBJbmxpbmUgZnVuY3Rpb25cbiAgICAgKiAtIElubGluZSB2YXJpYWJsZVxuICAgICAqIC0gSW5saW5lIGNvbnN0YW50XG4gICAgICogLSAuLi5cbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5SZWZhY3RvcklubGluZSA9ICdyZWZhY3Rvci5pbmxpbmUnO1xuICAgIC8qKlxuICAgICAqIEJhc2Uga2luZCBmb3IgcmVmYWN0b3JpbmcgcmV3cml0ZSBhY3Rpb25zOiAncmVmYWN0b3IucmV3cml0ZSdcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgcmV3cml0ZSBhY3Rpb25zOlxuICAgICAqXG4gICAgICogLSBDb252ZXJ0IEphdmFTY3JpcHQgZnVuY3Rpb24gdG8gY2xhc3NcbiAgICAgKiAtIEFkZCBvciByZW1vdmUgcGFyYW1ldGVyXG4gICAgICogLSBFbmNhcHN1bGF0ZSBmaWVsZFxuICAgICAqIC0gTWFrZSBtZXRob2Qgc3RhdGljXG4gICAgICogLSBNb3ZlIG1ldGhvZCB0byBiYXNlIGNsYXNzXG4gICAgICogLSAuLi5cbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5SZWZhY3RvclJld3JpdGUgPSAncmVmYWN0b3IucmV3cml0ZSc7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciBzb3VyY2UgYWN0aW9uczogYHNvdXJjZWBcbiAgICAgKlxuICAgICAqIFNvdXJjZSBjb2RlIGFjdGlvbnMgYXBwbHkgdG8gdGhlIGVudGlyZSBmaWxlLlxuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlNvdXJjZSA9ICdzb3VyY2UnO1xuICAgIC8qKlxuICAgICAqIEJhc2Uga2luZCBmb3IgYW4gb3JnYW5pemUgaW1wb3J0cyBzb3VyY2UgYWN0aW9uOiBgc291cmNlLm9yZ2FuaXplSW1wb3J0c2BcbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5Tb3VyY2VPcmdhbml6ZUltcG9ydHMgPSAnc291cmNlLm9yZ2FuaXplSW1wb3J0cyc7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciBhdXRvLWZpeCBzb3VyY2UgYWN0aW9uczogYHNvdXJjZS5maXhBbGxgLlxuICAgICAqXG4gICAgICogRml4IGFsbCBhY3Rpb25zIGF1dG9tYXRpY2FsbHkgZml4IGVycm9ycyB0aGF0IGhhdmUgYSBjbGVhciBmaXggdGhhdCBkbyBub3QgcmVxdWlyZSB1c2VyIGlucHV0LlxuICAgICAqIFRoZXkgc2hvdWxkIG5vdCBzdXBwcmVzcyBlcnJvcnMgb3IgcGVyZm9ybSB1bnNhZmUgZml4ZXMgc3VjaCBhcyBnZW5lcmF0aW5nIG5ldyB0eXBlcyBvciBjbGFzc2VzLlxuICAgICAqXG4gICAgICogQHNpbmNlIDMuMTUuMFxuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlNvdXJjZUZpeEFsbCA9ICdzb3VyY2UuZml4QWxsJztcbn0pKENvZGVBY3Rpb25LaW5kIHx8IChDb2RlQWN0aW9uS2luZCA9IHt9KSk7XG4vKipcbiAqIFRoZSByZWFzb24gd2h5IGNvZGUgYWN0aW9ucyB3ZXJlIHJlcXVlc3RlZC5cbiAqXG4gKiBAc2luY2UgMy4xNy4wXG4gKi9cbmV4cG9ydCB2YXIgQ29kZUFjdGlvblRyaWdnZXJLaW5kO1xuKGZ1bmN0aW9uIChDb2RlQWN0aW9uVHJpZ2dlcktpbmQpIHtcbiAgICAvKipcbiAgICAgKiBDb2RlIGFjdGlvbnMgd2VyZSBleHBsaWNpdGx5IHJlcXVlc3RlZCBieSB0aGUgdXNlciBvciBieSBhbiBleHRlbnNpb24uXG4gICAgICovXG4gICAgQ29kZUFjdGlvblRyaWdnZXJLaW5kLkludm9rZWQgPSAxO1xuICAgIC8qKlxuICAgICAqIENvZGUgYWN0aW9ucyB3ZXJlIHJlcXVlc3RlZCBhdXRvbWF0aWNhbGx5LlxuICAgICAqXG4gICAgICogVGhpcyB0eXBpY2FsbHkgaGFwcGVucyB3aGVuIGN1cnJlbnQgc2VsZWN0aW9uIGluIGEgZmlsZSBjaGFuZ2VzLCBidXQgY2FuXG4gICAgICogYWxzbyBiZSB0cmlnZ2VyZWQgd2hlbiBmaWxlIGNvbnRlbnQgY2hhbmdlcy5cbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uVHJpZ2dlcktpbmQuQXV0b21hdGljID0gMjtcbn0pKENvZGVBY3Rpb25UcmlnZ2VyS2luZCB8fCAoQ29kZUFjdGlvblRyaWdnZXJLaW5kID0ge30pKTtcbi8qKlxuICogVGhlIENvZGVBY3Rpb25Db250ZXh0IG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIENvZGVBY3Rpb25Db250ZXh0fSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBDb2RlQWN0aW9uQ29udGV4dDtcbihmdW5jdGlvbiAoQ29kZUFjdGlvbkNvbnRleHQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENvZGVBY3Rpb25Db250ZXh0IGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGRpYWdub3N0aWNzLCBvbmx5LCB0cmlnZ2VyS2luZCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0geyBkaWFnbm9zdGljcyB9O1xuICAgICAgICBpZiAob25seSAhPT0gdW5kZWZpbmVkICYmIG9ubHkgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJlc3VsdC5vbmx5ID0gb25seTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJpZ2dlcktpbmQgIT09IHVuZGVmaW5lZCAmJiB0cmlnZ2VyS2luZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmVzdWx0LnRyaWdnZXJLaW5kID0gdHJpZ2dlcktpbmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgQ29kZUFjdGlvbkNvbnRleHQuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgQ29kZUFjdGlvbkNvbnRleHR9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMudHlwZWRBcnJheShjYW5kaWRhdGUuZGlhZ25vc3RpY3MsIERpYWdub3N0aWMuaXMpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLm9ubHkgPT09IHVuZGVmaW5lZCB8fCBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS5vbmx5LCBJcy5zdHJpbmcpKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS50cmlnZ2VyS2luZCA9PT0gdW5kZWZpbmVkIHx8IGNhbmRpZGF0ZS50cmlnZ2VyS2luZCA9PT0gQ29kZUFjdGlvblRyaWdnZXJLaW5kLkludm9rZWQgfHwgY2FuZGlkYXRlLnRyaWdnZXJLaW5kID09PSBDb2RlQWN0aW9uVHJpZ2dlcktpbmQuQXV0b21hdGljKTtcbiAgICB9XG4gICAgQ29kZUFjdGlvbkNvbnRleHQuaXMgPSBpcztcbn0pKENvZGVBY3Rpb25Db250ZXh0IHx8IChDb2RlQWN0aW9uQ29udGV4dCA9IHt9KSk7XG5leHBvcnQgdmFyIENvZGVBY3Rpb247XG4oZnVuY3Rpb24gKENvZGVBY3Rpb24pIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUodGl0bGUsIGtpbmRPckNvbW1hbmRPckVkaXQsIGtpbmQpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHsgdGl0bGUgfTtcbiAgICAgICAgbGV0IGNoZWNrS2luZCA9IHRydWU7XG4gICAgICAgIGlmICh0eXBlb2Yga2luZE9yQ29tbWFuZE9yRWRpdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNoZWNrS2luZCA9IGZhbHNlO1xuICAgICAgICAgICAgcmVzdWx0LmtpbmQgPSBraW5kT3JDb21tYW5kT3JFZGl0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKENvbW1hbmQuaXMoa2luZE9yQ29tbWFuZE9yRWRpdCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5jb21tYW5kID0ga2luZE9yQ29tbWFuZE9yRWRpdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdC5lZGl0ID0ga2luZE9yQ29tbWFuZE9yRWRpdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hlY2tLaW5kICYmIGtpbmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmtpbmQgPSBraW5kO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIENvZGVBY3Rpb24uY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnRpdGxlKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5kaWFnbm9zdGljcyA9PT0gdW5kZWZpbmVkIHx8IElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLmRpYWdub3N0aWNzLCBEaWFnbm9zdGljLmlzKSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUua2luZCA9PT0gdW5kZWZpbmVkIHx8IElzLnN0cmluZyhjYW5kaWRhdGUua2luZCkpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmVkaXQgIT09IHVuZGVmaW5lZCB8fCBjYW5kaWRhdGUuY29tbWFuZCAhPT0gdW5kZWZpbmVkKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5jb21tYW5kID09PSB1bmRlZmluZWQgfHwgQ29tbWFuZC5pcyhjYW5kaWRhdGUuY29tbWFuZCkpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmlzUHJlZmVycmVkID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUuaXNQcmVmZXJyZWQpKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5lZGl0ID09PSB1bmRlZmluZWQgfHwgV29ya3NwYWNlRWRpdC5pcyhjYW5kaWRhdGUuZWRpdCkpO1xuICAgIH1cbiAgICBDb2RlQWN0aW9uLmlzID0gaXM7XG59KShDb2RlQWN0aW9uIHx8IChDb2RlQWN0aW9uID0ge30pKTtcbi8qKlxuICogVGhlIENvZGVMZW5zIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIENvZGVMZW5zfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBDb2RlTGVucztcbihmdW5jdGlvbiAoQ29kZUxlbnMpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENvZGVMZW5zIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCBkYXRhKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IHJhbmdlIH07XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKGRhdGEpKSB7XG4gICAgICAgICAgICByZXN1bHQuZGF0YSA9IGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgQ29kZUxlbnMuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgQ29kZUxlbnN9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5jb21tYW5kKSB8fCBDb21tYW5kLmlzKGNhbmRpZGF0ZS5jb21tYW5kKSk7XG4gICAgfVxuICAgIENvZGVMZW5zLmlzID0gaXM7XG59KShDb2RlTGVucyB8fCAoQ29kZUxlbnMgPSB7fSkpO1xuLyoqXG4gKiBUaGUgRm9ybWF0dGluZ09wdGlvbnMgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgRm9ybWF0dGluZ09wdGlvbnN9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIEZvcm1hdHRpbmdPcHRpb25zO1xuKGZ1bmN0aW9uIChGb3JtYXR0aW5nT3B0aW9ucykge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgRm9ybWF0dGluZ09wdGlvbnMgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodGFiU2l6ZSwgaW5zZXJ0U3BhY2VzKSB7XG4gICAgICAgIHJldHVybiB7IHRhYlNpemUsIGluc2VydFNwYWNlcyB9O1xuICAgIH1cbiAgICBGb3JtYXR0aW5nT3B0aW9ucy5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBGb3JtYXR0aW5nT3B0aW9uc30gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy51aW50ZWdlcihjYW5kaWRhdGUudGFiU2l6ZSkgJiYgSXMuYm9vbGVhbihjYW5kaWRhdGUuaW5zZXJ0U3BhY2VzKTtcbiAgICB9XG4gICAgRm9ybWF0dGluZ09wdGlvbnMuaXMgPSBpcztcbn0pKEZvcm1hdHRpbmdPcHRpb25zIHx8IChGb3JtYXR0aW5nT3B0aW9ucyA9IHt9KSk7XG4vKipcbiAqIFRoZSBEb2N1bWVudExpbmsgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgRG9jdW1lbnRMaW5rfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBEb2N1bWVudExpbms7XG4oZnVuY3Rpb24gKERvY3VtZW50TGluaykge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgRG9jdW1lbnRMaW5rIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCB0YXJnZXQsIGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIHRhcmdldCwgZGF0YSB9O1xuICAgIH1cbiAgICBEb2N1bWVudExpbmsuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgRG9jdW1lbnRMaW5rfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUudGFyZ2V0KSB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLnRhcmdldCkpO1xuICAgIH1cbiAgICBEb2N1bWVudExpbmsuaXMgPSBpcztcbn0pKERvY3VtZW50TGluayB8fCAoRG9jdW1lbnRMaW5rID0ge30pKTtcbi8qKlxuICogVGhlIFNlbGVjdGlvblJhbmdlIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb24gdG8gd29yayB3aXRoXG4gKiBTZWxlY3Rpb25SYW5nZSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBTZWxlY3Rpb25SYW5nZTtcbihmdW5jdGlvbiAoU2VsZWN0aW9uUmFuZ2UpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFNlbGVjdGlvblJhbmdlXG4gICAgICogQHBhcmFtIHJhbmdlIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0gcGFyZW50IGFuIG9wdGlvbmFsIHBhcmVudC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIHBhcmVudCkge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgcGFyZW50IH07XG4gICAgfVxuICAgIFNlbGVjdGlvblJhbmdlLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiAoY2FuZGlkYXRlLnBhcmVudCA9PT0gdW5kZWZpbmVkIHx8IFNlbGVjdGlvblJhbmdlLmlzKGNhbmRpZGF0ZS5wYXJlbnQpKTtcbiAgICB9XG4gICAgU2VsZWN0aW9uUmFuZ2UuaXMgPSBpcztcbn0pKFNlbGVjdGlvblJhbmdlIHx8IChTZWxlY3Rpb25SYW5nZSA9IHt9KSk7XG4vKipcbiAqIEEgc2V0IG9mIHByZWRlZmluZWQgdG9rZW4gdHlwZXMuIFRoaXMgc2V0IGlzIG5vdCBmaXhlZFxuICogYW4gY2xpZW50cyBjYW4gc3BlY2lmeSBhZGRpdGlvbmFsIHRva2VuIHR5cGVzIHZpYSB0aGVcbiAqIGNvcnJlc3BvbmRpbmcgY2xpZW50IGNhcGFiaWxpdGllcy5cbiAqXG4gKiBAc2luY2UgMy4xNi4wXG4gKi9cbmV4cG9ydCB2YXIgU2VtYW50aWNUb2tlblR5cGVzO1xuKGZ1bmN0aW9uIChTZW1hbnRpY1Rva2VuVHlwZXMpIHtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJuYW1lc3BhY2VcIl0gPSBcIm5hbWVzcGFjZVwiO1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBnZW5lcmljIHR5cGUuIEFjdHMgYXMgYSBmYWxsYmFjayBmb3IgdHlwZXMgd2hpY2ggY2FuJ3QgYmUgbWFwcGVkIHRvXG4gICAgICogYSBzcGVjaWZpYyB0eXBlIGxpa2UgY2xhc3Mgb3IgZW51bS5cbiAgICAgKi9cbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJ0eXBlXCJdID0gXCJ0eXBlXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wiY2xhc3NcIl0gPSBcImNsYXNzXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wiZW51bVwiXSA9IFwiZW51bVwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImludGVyZmFjZVwiXSA9IFwiaW50ZXJmYWNlXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wic3RydWN0XCJdID0gXCJzdHJ1Y3RcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJ0eXBlUGFyYW1ldGVyXCJdID0gXCJ0eXBlUGFyYW1ldGVyXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wicGFyYW1ldGVyXCJdID0gXCJwYXJhbWV0ZXJcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJ2YXJpYWJsZVwiXSA9IFwidmFyaWFibGVcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJwcm9wZXJ0eVwiXSA9IFwicHJvcGVydHlcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJlbnVtTWVtYmVyXCJdID0gXCJlbnVtTWVtYmVyXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wiZXZlbnRcIl0gPSBcImV2ZW50XCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wiZnVuY3Rpb25cIl0gPSBcImZ1bmN0aW9uXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wibWV0aG9kXCJdID0gXCJtZXRob2RcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJtYWNyb1wiXSA9IFwibWFjcm9cIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJrZXl3b3JkXCJdID0gXCJrZXl3b3JkXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wibW9kaWZpZXJcIl0gPSBcIm1vZGlmaWVyXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wiY29tbWVudFwiXSA9IFwiY29tbWVudFwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInN0cmluZ1wiXSA9IFwic3RyaW5nXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wibnVtYmVyXCJdID0gXCJudW1iZXJcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJyZWdleHBcIl0gPSBcInJlZ2V4cFwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcIm9wZXJhdG9yXCJdID0gXCJvcGVyYXRvclwiO1xuICAgIC8qKlxuICAgICAqIEBzaW5jZSAzLjE3LjBcbiAgICAgKi9cbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJkZWNvcmF0b3JcIl0gPSBcImRlY29yYXRvclwiO1xufSkoU2VtYW50aWNUb2tlblR5cGVzIHx8IChTZW1hbnRpY1Rva2VuVHlwZXMgPSB7fSkpO1xuLyoqXG4gKiBBIHNldCBvZiBwcmVkZWZpbmVkIHRva2VuIG1vZGlmaWVycy4gVGhpcyBzZXQgaXMgbm90IGZpeGVkXG4gKiBhbiBjbGllbnRzIGNhbiBzcGVjaWZ5IGFkZGl0aW9uYWwgdG9rZW4gdHlwZXMgdmlhIHRoZVxuICogY29ycmVzcG9uZGluZyBjbGllbnQgY2FwYWJpbGl0aWVzLlxuICpcbiAqIEBzaW5jZSAzLjE2LjBcbiAqL1xuZXhwb3J0IHZhciBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzO1xuKGZ1bmN0aW9uIChTZW1hbnRpY1Rva2VuTW9kaWZpZXJzKSB7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcImRlY2xhcmF0aW9uXCJdID0gXCJkZWNsYXJhdGlvblwiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJkZWZpbml0aW9uXCJdID0gXCJkZWZpbml0aW9uXCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcInJlYWRvbmx5XCJdID0gXCJyZWFkb25seVwiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJzdGF0aWNcIl0gPSBcInN0YXRpY1wiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJkZXByZWNhdGVkXCJdID0gXCJkZXByZWNhdGVkXCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcImFic3RyYWN0XCJdID0gXCJhYnN0cmFjdFwiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJhc3luY1wiXSA9IFwiYXN5bmNcIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wibW9kaWZpY2F0aW9uXCJdID0gXCJtb2RpZmljYXRpb25cIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wiZG9jdW1lbnRhdGlvblwiXSA9IFwiZG9jdW1lbnRhdGlvblwiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJkZWZhdWx0TGlicmFyeVwiXSA9IFwiZGVmYXVsdExpYnJhcnlcIjtcbn0pKFNlbWFudGljVG9rZW5Nb2RpZmllcnMgfHwgKFNlbWFudGljVG9rZW5Nb2RpZmllcnMgPSB7fSkpO1xuLyoqXG4gKiBAc2luY2UgMy4xNi4wXG4gKi9cbmV4cG9ydCB2YXIgU2VtYW50aWNUb2tlbnM7XG4oZnVuY3Rpb24gKFNlbWFudGljVG9rZW5zKSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgKGNhbmRpZGF0ZS5yZXN1bHRJZCA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBjYW5kaWRhdGUucmVzdWx0SWQgPT09ICdzdHJpbmcnKSAmJlxuICAgICAgICAgICAgQXJyYXkuaXNBcnJheShjYW5kaWRhdGUuZGF0YSkgJiYgKGNhbmRpZGF0ZS5kYXRhLmxlbmd0aCA9PT0gMCB8fCB0eXBlb2YgY2FuZGlkYXRlLmRhdGFbMF0gPT09ICdudW1iZXInKTtcbiAgICB9XG4gICAgU2VtYW50aWNUb2tlbnMuaXMgPSBpcztcbn0pKFNlbWFudGljVG9rZW5zIHx8IChTZW1hbnRpY1Rva2VucyA9IHt9KSk7XG4vKipcbiAqIFRoZSBJbmxpbmVWYWx1ZVRleHQgbmFtZXNwYWNlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGggSW5saW5lVmFsdWVUZXh0cy5cbiAqXG4gKiBAc2luY2UgMy4xNy4wXG4gKi9cbmV4cG9ydCB2YXIgSW5saW5lVmFsdWVUZXh0O1xuKGZ1bmN0aW9uIChJbmxpbmVWYWx1ZVRleHQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IElubGluZVZhbHVlVGV4dCBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgdGV4dCkge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgdGV4dCB9O1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZVRleHQuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICE9PSB1bmRlZmluZWQgJiYgY2FuZGlkYXRlICE9PSBudWxsICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS50ZXh0KTtcbiAgICB9XG4gICAgSW5saW5lVmFsdWVUZXh0LmlzID0gaXM7XG59KShJbmxpbmVWYWx1ZVRleHQgfHwgKElubGluZVZhbHVlVGV4dCA9IHt9KSk7XG4vKipcbiAqIFRoZSBJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwIG5hbWVzcGFjZSBwcm92aWRlcyBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIElubGluZVZhbHVlVmFyaWFibGVMb29rdXBzLlxuICpcbiAqIEBzaW5jZSAzLjE3LjBcbiAqL1xuZXhwb3J0IHZhciBJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwO1xuKGZ1bmN0aW9uIChJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBJbmxpbmVWYWx1ZVRleHQgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIHZhcmlhYmxlTmFtZSwgY2FzZVNlbnNpdGl2ZUxvb2t1cCkge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgdmFyaWFibGVOYW1lLCBjYXNlU2Vuc2l0aXZlTG9va3VwIH07XG4gICAgfVxuICAgIElubGluZVZhbHVlVmFyaWFibGVMb29rdXAuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICE9PSB1bmRlZmluZWQgJiYgY2FuZGlkYXRlICE9PSBudWxsICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgSXMuYm9vbGVhbihjYW5kaWRhdGUuY2FzZVNlbnNpdGl2ZUxvb2t1cClcbiAgICAgICAgICAgICYmIChJcy5zdHJpbmcoY2FuZGlkYXRlLnZhcmlhYmxlTmFtZSkgfHwgY2FuZGlkYXRlLnZhcmlhYmxlTmFtZSA9PT0gdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cC5pcyA9IGlzO1xufSkoSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cCB8fCAoSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cCA9IHt9KSk7XG4vKipcbiAqIFRoZSBJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbiBuYW1lc3BhY2UgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCBJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbi5cbiAqXG4gKiBAc2luY2UgMy4xNy4wXG4gKi9cbmV4cG9ydCB2YXIgSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb247XG4oZnVuY3Rpb24gKElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbiBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgZXhwcmVzc2lvbikge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgZXhwcmVzc2lvbiB9O1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgIT09IHVuZGVmaW5lZCAmJiBjYW5kaWRhdGUgIT09IG51bGwgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKVxuICAgICAgICAgICAgJiYgKElzLnN0cmluZyhjYW5kaWRhdGUuZXhwcmVzc2lvbikgfHwgY2FuZGlkYXRlLmV4cHJlc3Npb24gPT09IHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uLmlzID0gaXM7XG59KShJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbiB8fCAoSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24gPSB7fSkpO1xuLyoqXG4gKiBUaGUgSW5saW5lVmFsdWVDb250ZXh0IG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIElubGluZVZhbHVlQ29udGV4dH0gbGl0ZXJhbHMuXG4gKlxuICogQHNpbmNlIDMuMTcuMFxuICovXG5leHBvcnQgdmFyIElubGluZVZhbHVlQ29udGV4dDtcbihmdW5jdGlvbiAoSW5saW5lVmFsdWVDb250ZXh0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBJbmxpbmVWYWx1ZUNvbnRleHQgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUoZnJhbWVJZCwgc3RvcHBlZExvY2F0aW9uKSB7XG4gICAgICAgIHJldHVybiB7IGZyYW1lSWQsIHN0b3BwZWRMb2NhdGlvbiB9O1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZUNvbnRleHQuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgSW5saW5lVmFsdWVDb250ZXh0fSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgUmFuZ2UuaXModmFsdWUuc3RvcHBlZExvY2F0aW9uKTtcbiAgICB9XG4gICAgSW5saW5lVmFsdWVDb250ZXh0LmlzID0gaXM7XG59KShJbmxpbmVWYWx1ZUNvbnRleHQgfHwgKElubGluZVZhbHVlQ29udGV4dCA9IHt9KSk7XG4vKipcbiAqIElubGF5IGhpbnQga2luZHMuXG4gKlxuICogQHNpbmNlIDMuMTcuMFxuICovXG5leHBvcnQgdmFyIElubGF5SGludEtpbmQ7XG4oZnVuY3Rpb24gKElubGF5SGludEtpbmQpIHtcbiAgICAvKipcbiAgICAgKiBBbiBpbmxheSBoaW50IHRoYXQgZm9yIGEgdHlwZSBhbm5vdGF0aW9uLlxuICAgICAqL1xuICAgIElubGF5SGludEtpbmQuVHlwZSA9IDE7XG4gICAgLyoqXG4gICAgICogQW4gaW5sYXkgaGludCB0aGF0IGlzIGZvciBhIHBhcmFtZXRlci5cbiAgICAgKi9cbiAgICBJbmxheUhpbnRLaW5kLlBhcmFtZXRlciA9IDI7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSAxIHx8IHZhbHVlID09PSAyO1xuICAgIH1cbiAgICBJbmxheUhpbnRLaW5kLmlzID0gaXM7XG59KShJbmxheUhpbnRLaW5kIHx8IChJbmxheUhpbnRLaW5kID0ge30pKTtcbmV4cG9ydCB2YXIgSW5sYXlIaW50TGFiZWxQYXJ0O1xuKGZ1bmN0aW9uIChJbmxheUhpbnRMYWJlbFBhcnQpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHsgdmFsdWUgfTtcbiAgICB9XG4gICAgSW5sYXlIaW50TGFiZWxQYXJ0LmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS50b29sdGlwID09PSB1bmRlZmluZWQgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS50b29sdGlwKSB8fCBNYXJrdXBDb250ZW50LmlzKGNhbmRpZGF0ZS50b29sdGlwKSlcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUubG9jYXRpb24gPT09IHVuZGVmaW5lZCB8fCBMb2NhdGlvbi5pcyhjYW5kaWRhdGUubG9jYXRpb24pKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS5jb21tYW5kID09PSB1bmRlZmluZWQgfHwgQ29tbWFuZC5pcyhjYW5kaWRhdGUuY29tbWFuZCkpO1xuICAgIH1cbiAgICBJbmxheUhpbnRMYWJlbFBhcnQuaXMgPSBpcztcbn0pKElubGF5SGludExhYmVsUGFydCB8fCAoSW5sYXlIaW50TGFiZWxQYXJ0ID0ge30pKTtcbmV4cG9ydCB2YXIgSW5sYXlIaW50O1xuKGZ1bmN0aW9uIChJbmxheUhpbnQpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUocG9zaXRpb24sIGxhYmVsLCBraW5kKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHsgcG9zaXRpb24sIGxhYmVsIH07XG4gICAgICAgIGlmIChraW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5raW5kID0ga2luZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBJbmxheUhpbnQuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIFBvc2l0aW9uLmlzKGNhbmRpZGF0ZS5wb3NpdGlvbilcbiAgICAgICAgICAgICYmIChJcy5zdHJpbmcoY2FuZGlkYXRlLmxhYmVsKSB8fCBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS5sYWJlbCwgSW5sYXlIaW50TGFiZWxQYXJ0LmlzKSlcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUua2luZCA9PT0gdW5kZWZpbmVkIHx8IElubGF5SGludEtpbmQuaXMoY2FuZGlkYXRlLmtpbmQpKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS50ZXh0RWRpdHMgPT09IHVuZGVmaW5lZCkgfHwgSXMudHlwZWRBcnJheShjYW5kaWRhdGUudGV4dEVkaXRzLCBUZXh0RWRpdC5pcylcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUudG9vbHRpcCA9PT0gdW5kZWZpbmVkIHx8IElzLnN0cmluZyhjYW5kaWRhdGUudG9vbHRpcCkgfHwgTWFya3VwQ29udGVudC5pcyhjYW5kaWRhdGUudG9vbHRpcCkpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLnBhZGRpbmdMZWZ0ID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUucGFkZGluZ0xlZnQpKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS5wYWRkaW5nUmlnaHQgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5wYWRkaW5nUmlnaHQpKTtcbiAgICB9XG4gICAgSW5sYXlIaW50LmlzID0gaXM7XG59KShJbmxheUhpbnQgfHwgKElubGF5SGludCA9IHt9KSk7XG5leHBvcnQgdmFyIFN0cmluZ1ZhbHVlO1xuKGZ1bmN0aW9uIChTdHJpbmdWYWx1ZSkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVNuaXBwZXQodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHsga2luZDogJ3NuaXBwZXQnLCB2YWx1ZSB9O1xuICAgIH1cbiAgICBTdHJpbmdWYWx1ZS5jcmVhdGVTbmlwcGV0ID0gY3JlYXRlU25pcHBldDtcbn0pKFN0cmluZ1ZhbHVlIHx8IChTdHJpbmdWYWx1ZSA9IHt9KSk7XG5leHBvcnQgdmFyIElubGluZUNvbXBsZXRpb25JdGVtO1xuKGZ1bmN0aW9uIChJbmxpbmVDb21wbGV0aW9uSXRlbSkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShpbnNlcnRUZXh0LCBmaWx0ZXJUZXh0LCByYW5nZSwgY29tbWFuZCkge1xuICAgICAgICByZXR1cm4geyBpbnNlcnRUZXh0LCBmaWx0ZXJUZXh0LCByYW5nZSwgY29tbWFuZCB9O1xuICAgIH1cbiAgICBJbmxpbmVDb21wbGV0aW9uSXRlbS5jcmVhdGUgPSBjcmVhdGU7XG59KShJbmxpbmVDb21wbGV0aW9uSXRlbSB8fCAoSW5saW5lQ29tcGxldGlvbkl0ZW0gPSB7fSkpO1xuZXhwb3J0IHZhciBJbmxpbmVDb21wbGV0aW9uTGlzdDtcbihmdW5jdGlvbiAoSW5saW5lQ29tcGxldGlvbkxpc3QpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUoaXRlbXMpIHtcbiAgICAgICAgcmV0dXJuIHsgaXRlbXMgfTtcbiAgICB9XG4gICAgSW5saW5lQ29tcGxldGlvbkxpc3QuY3JlYXRlID0gY3JlYXRlO1xufSkoSW5saW5lQ29tcGxldGlvbkxpc3QgfHwgKElubGluZUNvbXBsZXRpb25MaXN0ID0ge30pKTtcbi8qKlxuICogRGVzY3JpYmVzIGhvdyBhbiB7QGxpbmsgSW5saW5lQ29tcGxldGlvbkl0ZW1Qcm92aWRlciBpbmxpbmUgY29tcGxldGlvbiBwcm92aWRlcn0gd2FzIHRyaWdnZXJlZC5cbiAqXG4gKiBAc2luY2UgMy4xOC4wXG4gKiBAcHJvcG9zZWRcbiAqL1xuZXhwb3J0IHZhciBJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmQ7XG4oZnVuY3Rpb24gKElubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZCkge1xuICAgIC8qKlxuICAgICAqIENvbXBsZXRpb24gd2FzIHRyaWdnZXJlZCBleHBsaWNpdGx5IGJ5IGEgdXNlciBnZXN0dXJlLlxuICAgICAqL1xuICAgIElubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZC5JbnZva2VkID0gMDtcbiAgICAvKipcbiAgICAgKiBDb21wbGV0aW9uIHdhcyB0cmlnZ2VyZWQgYXV0b21hdGljYWxseSB3aGlsZSBlZGl0aW5nLlxuICAgICAqL1xuICAgIElubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZC5BdXRvbWF0aWMgPSAxO1xufSkoSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kIHx8IChJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmQgPSB7fSkpO1xuZXhwb3J0IHZhciBTZWxlY3RlZENvbXBsZXRpb25JbmZvO1xuKGZ1bmN0aW9uIChTZWxlY3RlZENvbXBsZXRpb25JbmZvKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCB0ZXh0KSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCB0ZXh0IH07XG4gICAgfVxuICAgIFNlbGVjdGVkQ29tcGxldGlvbkluZm8uY3JlYXRlID0gY3JlYXRlO1xufSkoU2VsZWN0ZWRDb21wbGV0aW9uSW5mbyB8fCAoU2VsZWN0ZWRDb21wbGV0aW9uSW5mbyA9IHt9KSk7XG5leHBvcnQgdmFyIElubGluZUNvbXBsZXRpb25Db250ZXh0O1xuKGZ1bmN0aW9uIChJbmxpbmVDb21wbGV0aW9uQ29udGV4dCkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh0cmlnZ2VyS2luZCwgc2VsZWN0ZWRDb21wbGV0aW9uSW5mbykge1xuICAgICAgICByZXR1cm4geyB0cmlnZ2VyS2luZCwgc2VsZWN0ZWRDb21wbGV0aW9uSW5mbyB9O1xuICAgIH1cbiAgICBJbmxpbmVDb21wbGV0aW9uQ29udGV4dC5jcmVhdGUgPSBjcmVhdGU7XG59KShJbmxpbmVDb21wbGV0aW9uQ29udGV4dCB8fCAoSW5saW5lQ29tcGxldGlvbkNvbnRleHQgPSB7fSkpO1xuZXhwb3J0IHZhciBXb3Jrc3BhY2VGb2xkZXI7XG4oZnVuY3Rpb24gKFdvcmtzcGFjZUZvbGRlcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIFVSSS5pcyhjYW5kaWRhdGUudXJpKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLm5hbWUpO1xuICAgIH1cbiAgICBXb3Jrc3BhY2VGb2xkZXIuaXMgPSBpcztcbn0pKFdvcmtzcGFjZUZvbGRlciB8fCAoV29ya3NwYWNlRm9sZGVyID0ge30pKTtcbmV4cG9ydCBjb25zdCBFT0wgPSBbJ1xcbicsICdcXHJcXG4nLCAnXFxyJ107XG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSB0aGUgdGV4dCBkb2N1bWVudCBmcm9tIHRoZSBuZXcgdnNjb2RlLWxhbmd1YWdlc2VydmVyLXRleHRkb2N1bWVudCBwYWNrYWdlLlxuICovXG5leHBvcnQgdmFyIFRleHREb2N1bWVudDtcbihmdW5jdGlvbiAoVGV4dERvY3VtZW50KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBJVGV4dERvY3VtZW50IGxpdGVyYWwgZnJvbSB0aGUgZ2l2ZW4gdXJpIGFuZCBjb250ZW50LlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIGRvY3VtZW50J3MgdXJpLlxuICAgICAqIEBwYXJhbSBsYW5ndWFnZUlkIFRoZSBkb2N1bWVudCdzIGxhbmd1YWdlIElkLlxuICAgICAqIEBwYXJhbSB2ZXJzaW9uIFRoZSBkb2N1bWVudCdzIHZlcnNpb24uXG4gICAgICogQHBhcmFtIGNvbnRlbnQgVGhlIGRvY3VtZW50J3MgY29udGVudC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodXJpLCBsYW5ndWFnZUlkLCB2ZXJzaW9uLCBjb250ZW50KSB7XG4gICAgICAgIHJldHVybiBuZXcgRnVsbFRleHREb2N1bWVudCh1cmksIGxhbmd1YWdlSWQsIHZlcnNpb24sIGNvbnRlbnQpO1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnQuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgSVRleHREb2N1bWVudH0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSkgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUubGFuZ3VhZ2VJZCkgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS5sYW5ndWFnZUlkKSkgJiYgSXMudWludGVnZXIoY2FuZGlkYXRlLmxpbmVDb3VudClcbiAgICAgICAgICAgICYmIElzLmZ1bmMoY2FuZGlkYXRlLmdldFRleHQpICYmIElzLmZ1bmMoY2FuZGlkYXRlLnBvc2l0aW9uQXQpICYmIElzLmZ1bmMoY2FuZGlkYXRlLm9mZnNldEF0KSA/IHRydWUgOiBmYWxzZTtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50LmlzID0gaXM7XG4gICAgZnVuY3Rpb24gYXBwbHlFZGl0cyhkb2N1bWVudCwgZWRpdHMpIHtcbiAgICAgICAgbGV0IHRleHQgPSBkb2N1bWVudC5nZXRUZXh0KCk7XG4gICAgICAgIGxldCBzb3J0ZWRFZGl0cyA9IG1lcmdlU29ydChlZGl0cywgKGEsIGIpID0+IHtcbiAgICAgICAgICAgIGxldCBkaWZmID0gYS5yYW5nZS5zdGFydC5saW5lIC0gYi5yYW5nZS5zdGFydC5saW5lO1xuICAgICAgICAgICAgaWYgKGRpZmYgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYS5yYW5nZS5zdGFydC5jaGFyYWN0ZXIgLSBiLnJhbmdlLnN0YXJ0LmNoYXJhY3RlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBkaWZmO1xuICAgICAgICB9KTtcbiAgICAgICAgbGV0IGxhc3RNb2RpZmllZE9mZnNldCA9IHRleHQubGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBpID0gc29ydGVkRWRpdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGxldCBlID0gc29ydGVkRWRpdHNbaV07XG4gICAgICAgICAgICBsZXQgc3RhcnRPZmZzZXQgPSBkb2N1bWVudC5vZmZzZXRBdChlLnJhbmdlLnN0YXJ0KTtcbiAgICAgICAgICAgIGxldCBlbmRPZmZzZXQgPSBkb2N1bWVudC5vZmZzZXRBdChlLnJhbmdlLmVuZCk7XG4gICAgICAgICAgICBpZiAoZW5kT2Zmc2V0IDw9IGxhc3RNb2RpZmllZE9mZnNldCkge1xuICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cmluZygwLCBzdGFydE9mZnNldCkgKyBlLm5ld1RleHQgKyB0ZXh0LnN1YnN0cmluZyhlbmRPZmZzZXQsIHRleHQubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignT3ZlcmxhcHBpbmcgZWRpdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkT2Zmc2V0ID0gc3RhcnRPZmZzZXQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuICAgIFRleHREb2N1bWVudC5hcHBseUVkaXRzID0gYXBwbHlFZGl0cztcbiAgICBmdW5jdGlvbiBtZXJnZVNvcnQoZGF0YSwgY29tcGFyZSkge1xuICAgICAgICBpZiAoZGF0YS5sZW5ndGggPD0gMSkge1xuICAgICAgICAgICAgLy8gc29ydGVkXG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwID0gKGRhdGEubGVuZ3RoIC8gMikgfCAwO1xuICAgICAgICBjb25zdCBsZWZ0ID0gZGF0YS5zbGljZSgwLCBwKTtcbiAgICAgICAgY29uc3QgcmlnaHQgPSBkYXRhLnNsaWNlKHApO1xuICAgICAgICBtZXJnZVNvcnQobGVmdCwgY29tcGFyZSk7XG4gICAgICAgIG1lcmdlU29ydChyaWdodCwgY29tcGFyZSk7XG4gICAgICAgIGxldCBsZWZ0SWR4ID0gMDtcbiAgICAgICAgbGV0IHJpZ2h0SWR4ID0gMDtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICB3aGlsZSAobGVmdElkeCA8IGxlZnQubGVuZ3RoICYmIHJpZ2h0SWR4IDwgcmlnaHQubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgcmV0ID0gY29tcGFyZShsZWZ0W2xlZnRJZHhdLCByaWdodFtyaWdodElkeF0pO1xuICAgICAgICAgICAgaWYgKHJldCA8PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gc21hbGxlcl9lcXVhbCAtPiB0YWtlIGxlZnQgdG8gcHJlc2VydmUgb3JkZXJcbiAgICAgICAgICAgICAgICBkYXRhW2krK10gPSBsZWZ0W2xlZnRJZHgrK107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBncmVhdGVyIC0+IHRha2UgcmlnaHRcbiAgICAgICAgICAgICAgICBkYXRhW2krK10gPSByaWdodFtyaWdodElkeCsrXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAobGVmdElkeCA8IGxlZnQubGVuZ3RoKSB7XG4gICAgICAgICAgICBkYXRhW2krK10gPSBsZWZ0W2xlZnRJZHgrK107XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKHJpZ2h0SWR4IDwgcmlnaHQubGVuZ3RoKSB7XG4gICAgICAgICAgICBkYXRhW2krK10gPSByaWdodFtyaWdodElkeCsrXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG59KShUZXh0RG9jdW1lbnQgfHwgKFRleHREb2N1bWVudCA9IHt9KSk7XG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSB0aGUgdGV4dCBkb2N1bWVudCBmcm9tIHRoZSBuZXcgdnNjb2RlLWxhbmd1YWdlc2VydmVyLXRleHRkb2N1bWVudCBwYWNrYWdlLlxuICovXG5jbGFzcyBGdWxsVGV4dERvY3VtZW50IHtcbiAgICBjb25zdHJ1Y3Rvcih1cmksIGxhbmd1YWdlSWQsIHZlcnNpb24sIGNvbnRlbnQpIHtcbiAgICAgICAgdGhpcy5fdXJpID0gdXJpO1xuICAgICAgICB0aGlzLl9sYW5ndWFnZUlkID0gbGFuZ3VhZ2VJZDtcbiAgICAgICAgdGhpcy5fdmVyc2lvbiA9IHZlcnNpb247XG4gICAgICAgIHRoaXMuX2NvbnRlbnQgPSBjb250ZW50O1xuICAgICAgICB0aGlzLl9saW5lT2Zmc2V0cyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZ2V0IHVyaSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VyaTtcbiAgICB9XG4gICAgZ2V0IGxhbmd1YWdlSWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sYW5ndWFnZUlkO1xuICAgIH1cbiAgICBnZXQgdmVyc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZlcnNpb247XG4gICAgfVxuICAgIGdldFRleHQocmFuZ2UpIHtcbiAgICAgICAgaWYgKHJhbmdlKSB7XG4gICAgICAgICAgICBsZXQgc3RhcnQgPSB0aGlzLm9mZnNldEF0KHJhbmdlLnN0YXJ0KTtcbiAgICAgICAgICAgIGxldCBlbmQgPSB0aGlzLm9mZnNldEF0KHJhbmdlLmVuZCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY29udGVudC5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRlbnQ7XG4gICAgfVxuICAgIHVwZGF0ZShldmVudCwgdmVyc2lvbikge1xuICAgICAgICB0aGlzLl9jb250ZW50ID0gZXZlbnQudGV4dDtcbiAgICAgICAgdGhpcy5fdmVyc2lvbiA9IHZlcnNpb247XG4gICAgICAgIHRoaXMuX2xpbmVPZmZzZXRzID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBnZXRMaW5lT2Zmc2V0cygpIHtcbiAgICAgICAgaWYgKHRoaXMuX2xpbmVPZmZzZXRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxldCBsaW5lT2Zmc2V0cyA9IFtdO1xuICAgICAgICAgICAgbGV0IHRleHQgPSB0aGlzLl9jb250ZW50O1xuICAgICAgICAgICAgbGV0IGlzTGluZVN0YXJ0ID0gdHJ1ZTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChpc0xpbmVTdGFydCkge1xuICAgICAgICAgICAgICAgICAgICBsaW5lT2Zmc2V0cy5wdXNoKGkpO1xuICAgICAgICAgICAgICAgICAgICBpc0xpbmVTdGFydCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgY2ggPSB0ZXh0LmNoYXJBdChpKTtcbiAgICAgICAgICAgICAgICBpc0xpbmVTdGFydCA9IChjaCA9PT0gJ1xccicgfHwgY2ggPT09ICdcXG4nKTtcbiAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICdcXHInICYmIGkgKyAxIDwgdGV4dC5sZW5ndGggJiYgdGV4dC5jaGFyQXQoaSArIDEpID09PSAnXFxuJykge1xuICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzTGluZVN0YXJ0ICYmIHRleHQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxpbmVPZmZzZXRzLnB1c2godGV4dC5sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fbGluZU9mZnNldHMgPSBsaW5lT2Zmc2V0cztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fbGluZU9mZnNldHM7XG4gICAgfVxuICAgIHBvc2l0aW9uQXQob2Zmc2V0KSB7XG4gICAgICAgIG9mZnNldCA9IE1hdGgubWF4KE1hdGgubWluKG9mZnNldCwgdGhpcy5fY29udGVudC5sZW5ndGgpLCAwKTtcbiAgICAgICAgbGV0IGxpbmVPZmZzZXRzID0gdGhpcy5nZXRMaW5lT2Zmc2V0cygpO1xuICAgICAgICBsZXQgbG93ID0gMCwgaGlnaCA9IGxpbmVPZmZzZXRzLmxlbmd0aDtcbiAgICAgICAgaWYgKGhpZ2ggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBQb3NpdGlvbi5jcmVhdGUoMCwgb2Zmc2V0KTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAobG93IDwgaGlnaCkge1xuICAgICAgICAgICAgbGV0IG1pZCA9IE1hdGguZmxvb3IoKGxvdyArIGhpZ2gpIC8gMik7XG4gICAgICAgICAgICBpZiAobGluZU9mZnNldHNbbWlkXSA+IG9mZnNldCkge1xuICAgICAgICAgICAgICAgIGhpZ2ggPSBtaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsb3cgPSBtaWQgKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGxvdyBpcyB0aGUgbGVhc3QgeCBmb3Igd2hpY2ggdGhlIGxpbmUgb2Zmc2V0IGlzIGxhcmdlciB0aGFuIHRoZSBjdXJyZW50IG9mZnNldFxuICAgICAgICAvLyBvciBhcnJheS5sZW5ndGggaWYgbm8gbGluZSBvZmZzZXQgaXMgbGFyZ2VyIHRoYW4gdGhlIGN1cnJlbnQgb2Zmc2V0XG4gICAgICAgIGxldCBsaW5lID0gbG93IC0gMTtcbiAgICAgICAgcmV0dXJuIFBvc2l0aW9uLmNyZWF0ZShsaW5lLCBvZmZzZXQgLSBsaW5lT2Zmc2V0c1tsaW5lXSk7XG4gICAgfVxuICAgIG9mZnNldEF0KHBvc2l0aW9uKSB7XG4gICAgICAgIGxldCBsaW5lT2Zmc2V0cyA9IHRoaXMuZ2V0TGluZU9mZnNldHMoKTtcbiAgICAgICAgaWYgKHBvc2l0aW9uLmxpbmUgPj0gbGluZU9mZnNldHMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY29udGVudC5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocG9zaXRpb24ubGluZSA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIGxldCBsaW5lT2Zmc2V0ID0gbGluZU9mZnNldHNbcG9zaXRpb24ubGluZV07XG4gICAgICAgIGxldCBuZXh0TGluZU9mZnNldCA9IChwb3NpdGlvbi5saW5lICsgMSA8IGxpbmVPZmZzZXRzLmxlbmd0aCkgPyBsaW5lT2Zmc2V0c1twb3NpdGlvbi5saW5lICsgMV0gOiB0aGlzLl9jb250ZW50Lmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KE1hdGgubWluKGxpbmVPZmZzZXQgKyBwb3NpdGlvbi5jaGFyYWN0ZXIsIG5leHRMaW5lT2Zmc2V0KSwgbGluZU9mZnNldCk7XG4gICAgfVxuICAgIGdldCBsaW5lQ291bnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldExpbmVPZmZzZXRzKCkubGVuZ3RoO1xuICAgIH1cbn1cbnZhciBJcztcbihmdW5jdGlvbiAoSXMpIHtcbiAgICBjb25zdCB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG4gICAgZnVuY3Rpb24gZGVmaW5lZCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJztcbiAgICB9XG4gICAgSXMuZGVmaW5lZCA9IGRlZmluZWQ7XG4gICAgZnVuY3Rpb24gdW5kZWZpbmVkKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnO1xuICAgIH1cbiAgICBJcy51bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgZnVuY3Rpb24gYm9vbGVhbih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWUgPT09IHRydWUgfHwgdmFsdWUgPT09IGZhbHNlO1xuICAgIH1cbiAgICBJcy5ib29sZWFuID0gYm9vbGVhbjtcbiAgICBmdW5jdGlvbiBzdHJpbmcodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBTdHJpbmddJztcbiAgICB9XG4gICAgSXMuc3RyaW5nID0gc3RyaW5nO1xuICAgIGZ1bmN0aW9uIG51bWJlcih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IE51bWJlcl0nO1xuICAgIH1cbiAgICBJcy5udW1iZXIgPSBudW1iZXI7XG4gICAgZnVuY3Rpb24gbnVtYmVyUmFuZ2UodmFsdWUsIG1pbiwgbWF4KSB7XG4gICAgICAgIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgTnVtYmVyXScgJiYgbWluIDw9IHZhbHVlICYmIHZhbHVlIDw9IG1heDtcbiAgICB9XG4gICAgSXMubnVtYmVyUmFuZ2UgPSBudW1iZXJSYW5nZTtcbiAgICBmdW5jdGlvbiBpbnRlZ2VyKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgTnVtYmVyXScgJiYgLTIxNDc0ODM2NDggPD0gdmFsdWUgJiYgdmFsdWUgPD0gMjE0NzQ4MzY0NztcbiAgICB9XG4gICAgSXMuaW50ZWdlciA9IGludGVnZXI7XG4gICAgZnVuY3Rpb24gdWludGVnZXIodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBOdW1iZXJdJyAmJiAwIDw9IHZhbHVlICYmIHZhbHVlIDw9IDIxNDc0ODM2NDc7XG4gICAgfVxuICAgIElzLnVpbnRlZ2VyID0gdWludGVnZXI7XG4gICAgZnVuY3Rpb24gZnVuYyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG4gICAgfVxuICAgIElzLmZ1bmMgPSBmdW5jO1xuICAgIGZ1bmN0aW9uIG9iamVjdExpdGVyYWwodmFsdWUpIHtcbiAgICAgICAgLy8gU3RyaWN0bHkgc3BlYWtpbmcgY2xhc3MgaW5zdGFuY2VzIHBhc3MgdGhpcyBjaGVjayBhcyB3ZWxsLiBTaW5jZSB0aGUgTFNQXG4gICAgICAgIC8vIGRvZXNuJ3QgdXNlIGNsYXNzZXMgd2UgaWdub3JlIHRoaXMgZm9yIG5vdy4gSWYgd2UgZG8gd2UgbmVlZCB0byBhZGQgc29tZXRoaW5nXG4gICAgICAgIC8vIGxpa2UgdGhpczogYE9iamVjdC5nZXRQcm90b3R5cGVPZihPYmplY3QuZ2V0UHJvdG90eXBlT2YoeCkpID09PSBudWxsYFxuICAgICAgICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JztcbiAgICB9XG4gICAgSXMub2JqZWN0TGl0ZXJhbCA9IG9iamVjdExpdGVyYWw7XG4gICAgZnVuY3Rpb24gdHlwZWRBcnJheSh2YWx1ZSwgY2hlY2spIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmV2ZXJ5KGNoZWNrKTtcbiAgICB9XG4gICAgSXMudHlwZWRBcnJheSA9IHR5cGVkQXJyYXk7XG59KShJcyB8fCAoSXMgPSB7fSkpO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBS0EsYUFBTyxlQUFlLFNBQVMsY0FBYyxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQzVELGNBQVEsY0FBYyxRQUFRLFFBQVEsUUFBUSxPQUFPLFFBQVEsUUFBUSxRQUFRLFNBQVMsUUFBUSxTQUFTLFFBQVEsVUFBVTtBQUN6SCxlQUFTLFFBQVEsT0FBTztBQUNwQixlQUFPLFVBQVUsUUFBUSxVQUFVO0FBQUEsTUFDdkM7QUFDQSxjQUFRLFVBQVU7QUFDbEIsZUFBUyxPQUFPLE9BQU87QUFDbkIsZUFBTyxPQUFPLFVBQVUsWUFBWSxpQkFBaUI7QUFBQSxNQUN6RDtBQUNBLGNBQVEsU0FBUztBQUNqQixlQUFTLE9BQU8sT0FBTztBQUNuQixlQUFPLE9BQU8sVUFBVSxZQUFZLGlCQUFpQjtBQUFBLE1BQ3pEO0FBQ0EsY0FBUSxTQUFTO0FBQ2pCLGVBQVMsTUFBTSxPQUFPO0FBQ2xCLGVBQU8saUJBQWlCO0FBQUEsTUFDNUI7QUFDQSxjQUFRLFFBQVE7QUFDaEIsZUFBUyxLQUFLLE9BQU87QUFDakIsZUFBTyxPQUFPLFVBQVU7QUFBQSxNQUM1QjtBQUNBLGNBQVEsT0FBTztBQUNmLGVBQVMsTUFBTSxPQUFPO0FBQ2xCLGVBQU8sTUFBTSxRQUFRLEtBQUs7QUFBQSxNQUM5QjtBQUNBLGNBQVEsUUFBUTtBQUNoQixlQUFTLFlBQVksT0FBTztBQUN4QixlQUFPLE1BQU0sS0FBSyxLQUFLLE1BQU0sTUFBTSxVQUFRLE9BQU8sSUFBSSxDQUFDO0FBQUEsTUFDM0Q7QUFDQSxjQUFRLGNBQWM7QUFBQTtBQUFBOzs7QUNsQ3RCO0FBQUE7QUFBQTtBQUtBLGFBQU8sZUFBZSxTQUFTLGNBQWMsRUFBRSxPQUFPLEtBQUssQ0FBQztBQUM1RCxjQUFRLFVBQVUs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QUFBQSxZQUFhO0FBQUEsWUFBUztBQUFBLFlBQ3RCO0FBQUEsWUFDQTtBQUFBLFlBQ0E7QUFBQSxVQUNKO0FBQUEsVUFDQSxhQUFhLENBQUMsUUFBUSxTQUFTLE9BQU8sT0FBTyxFQUFFO0FBQUEsUUFDbkQ7QUFBQSxRQUNBLGVBQWdCLEVBQUUsU0FBUyxLQUFLO0FBQUEsUUFDaEMsUUFBZ0IsRUFBRSxTQUFTLEtBQUs7QUFBQSxRQUNoQyxhQUFnQixFQUFFLGlCQUFpQixNQUFNO0FBQUEsTUFDN0M7QUFBQSxJQUNKO0FBQUEsRUFDSjsiLAogICJuYW1lcyI6IFsiRXJyb3JDb2RlcyIsICJNZXNzYWdlIiwgIlRvdWNoIiwgIkRpc3Bvc2FibGUiLCAiUkFMIiwgIkV2ZW50IiwgIklzIiwgIkNhbmNlbGxhdGlvblRva2VuIiwgIkNhbmNlbGxhdGlvblN0YXRlIiwgIl9jb25uIiwgIklzIiwgIk1lc3NhZ2VSZWFkZXIiLCAiQWJzdHJhY3RNZXNzYWdlUmVhZGVyIiwgIlJlc29sdmVkTWVzc2FnZVJlYWRlck9wdGlvbnMiLCAiSXMiLCAiTWVzc2FnZVdyaXRlciIsICJBYnN0cmFjdE1lc3NhZ2VXcml0ZXIiLCAiUmVzb2x2ZWRNZXNzYWdlV3JpdGVyT3B0aW9ucyIsICJyZXN1bHQiLCAiSXMiLCAiQ2FuY2VsTm90aWZpY2F0aW9uIiwgIlByb2dyZXNzVG9rZW4iLCAiUHJvZ3Jlc3NOb3RpZmljYXRpb24iLCAiU3RhclJlcXVlc3RIYW5kbGVyIiwgIlRyYWNlIiwgIlRyYWNlVmFsdWVzIiwgIlRyYWNlRm9ybWF0IiwgIlNldFRyYWNlTm90aWZpY2F0aW9uIiwgIkxvZ1RyYWNlTm90aWZpY2F0aW9uIiwgIkNvbm5lY3Rpb25FcnJvcnMiLCAiQ29ubmVjdGlvblN0cmF0ZWd5IiwgIklkQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSIsICJSZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSIsICJDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5IiwgIkNhbmNlbGxhdGlvblNlbmRlclN0cmF0ZWd5IiwgIkNhbmNlbGxhdGlvblN0cmF0ZWd5IiwgIk1lc3NhZ2VTdHJhdGVneSIsICJDb25uZWN0aW9uT3B0aW9ucyIsICJDb25uZWN0aW9uU3RhdGUiLCAiY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24iLCAic3RhcnRUaW1lIiwgIlJJTCIsICJtIiwgImV4cG9ydHMiLCAiY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24iLCAiaW1wb3J0X3ZzY29kZV9qc29ucnBjIiwgImltcG9ydF92c2NvZGVfanNvbnJwYyIsICJpbXBvcnRfdnNjb2RlX2pzb25ycGMiLCAiaW1wb3J0X3ZzY29kZV9qc29ucnBjIiwgIkRvY3VtZW50VXJpIiwgIlVSSSIsICJpbnRlZ2VyIiwgInVpbnRlZ2VyIiwgIlBvc2l0aW9uIiwgIlJhbmdlIiwgIkxvY2F0aW9uIiwgIkxvY2F0aW9uTGluayIsICJDb2xvciIsICJDb2xvckluZm9ybWF0aW9uIiwgIkNvbG9yUHJlc2VudGF0aW9uIiwgIkZvbGRpbmdSYW5nZUtpbmQiLCAiRm9sZGluZ1JhbmdlIiwgIkRpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24iLCAibG9jYXRpb24iLCAiRGlhZ25vc3RpY1NldmVyaXR5IiwgIkRpYWdub3N0aWNUYWciLCAiQ29kZURlc2NyaXB0aW9uIiwgIkRpYWdub3N0aWMiLCAiQ29tbWFuZCIsICJUZXh0RWRpdCIsICJDaGFuZ2VBbm5vdGF0aW9uIiwgIkNoYW5nZUFubm90YXRpb25JZGVudGlmaWVyIiwgIkFubm90YXRlZFRleHRFZGl0IiwgIlRleHREb2N1bWVudEVkaXQiLCAiQ3JlYXRlRmlsZSIsICJSZW5hbWVGaWxlIiwgIkRlbGV0ZUZpbGUiLCAiV29ya3NwYWNlRWRpdCIsICJUZXh0RG9jdW1lbnRJZGVudGlmaWVyIiwgIlZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIiLCAiT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIiwgIlRleHREb2N1bWVudEl0ZW0iLCAiTWFya3VwS2luZCIsICJNYXJrdXBDb250ZW50IiwgIkNvbXBsZXRpb25JdGVtS2luZCIsICJJbnNlcnRUZXh0Rm9ybWF0IiwgIkNvbXBsZXRpb25JdGVtVGFnIiwgIkluc2VydFJlcGxhY2VFZGl0IiwgIlJhbmdlIiwgIkluc2VydFRleHRNb2RlIiwgIkNvbXBsZXRpb25JdGVtTGFiZWxEZXRhaWxzIiwgIkNvbXBsZXRpb25JdGVtIiwgIkNvbXBsZXRpb25MaXN0IiwgIk1hcmtlZFN0cmluZyIsICJIb3ZlciIsICJQYXJhbWV0ZXJJbmZvcm1hdGlvbiIsICJTaWduYXR1cmVJbmZvcm1hdGlvbiIsICJEb2N1bWVudEhpZ2hsaWdodEtpbmQiLCAiRG9jdW1lbnRIaWdobGlnaHQiLCAiU3ltYm9sS2luZCIsICJTeW1ib2xUYWciLCAiU3ltYm9sSW5mb3JtYXRpb24iLCAiV29ya3NwYWNlU3ltYm9sIiwgIkRvY3VtZW50U3ltYm9sIiwgIkNvZGVBY3Rpb25LaW5kIiwgIkNvZGVBY3Rpb25UcmlnZ2VyS2luZCIsICJDb2RlQWN0aW9uQ29udGV4dCIsICJDb2RlQWN0aW9uIiwgIkNvZGVMZW5zIiwgIkZvcm1hdHRpbmdPcHRpb25zIiwgIkRvY3VtZW50TGluayIsICJTZWxlY3Rpb25SYW5nZSIsICJTZW1hbnRpY1Rva2VuVHlwZXMiLCAiU2VtYW50aWNUb2tlbk1vZGlmaWVycyIsICJTZW1hbnRpY1Rva2VucyIsICJJbmxpbmVWYWx1ZVRleHQiLCAiSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cCIsICJJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbiIsICJJbmxpbmVWYWx1ZUNvbnRleHQiLCAiSW5sYXlIaW50S2luZCIsICJJbmxheUhpbnRMYWJlbFBhcnQiLCAiSW5sYXlIaW50IiwgIlBvc2l0aW9uIiwgIlN0cmluZ1ZhbHVlIiwgIklubGluZUNvbXBsZXRpb25JdGVtIiwgIklubGluZUNvbXBsZXRpb25MaXN0IiwgIklubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZCIsICJTZWxlY3RlZENvbXBsZXRpb25JbmZvIiwgIklubGluZUNvbXBsZXRpb25Db250ZXh0IiwgIldvcmtzcGFjZUZvbGRlciIsICJUZXh0RG9jdW1lbnQiLCAiUG9zaXRpb24iLCAiSXMiLCAidW5kZWZpbmVkIiwgImludGVnZXIiLCAidWludGVnZXIiLCAibSJdCn0K +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvY29tbW9uL2lzLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlcy5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vbGlua2VkTWFwLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9kaXNwb3NhYmxlLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9yYWwuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvY29tbW9uL2V2ZW50cy5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vY2FuY2VsbGF0aW9uLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9zaGFyZWRBcnJheUNhbmNlbGxhdGlvbi5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vc2VtYXBob3JlLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlUmVhZGVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlV3JpdGVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlQnVmZmVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9jb25uZWN0aW9uLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9hcGkuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvYnJvd3Nlci9yaWwuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvYnJvd3Nlci9tYWluLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvYnJvd3Nlci5qcyIsICJsc3AvamF2YS1sc3AtY2xpZW50LnRzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLXdzLWpzb25ycGMvc3JjL2Rpc3Bvc2FibGUudHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvc29ja2V0L3NvY2tldC50cyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS13cy1qc29ucnBjL3NyYy9zb2NrZXQvcmVhZGVyLnRzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLXdzLWpzb25ycGMvc3JjL3NvY2tldC93cml0ZXIudHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvc29ja2V0L2Nvbm5lY3Rpb24udHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvY29ubmVjdGlvbi50cyIsICJsc3AvbW9uYWNvLXNoaW0udHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtbGFuZ3VhZ2VzZXJ2ZXItdHlwZXMvbGliL2VzbS9tYWluLmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuc3RyaW5nQXJyYXkgPSBleHBvcnRzLmFycmF5ID0gZXhwb3J0cy5mdW5jID0gZXhwb3J0cy5lcnJvciA9IGV4cG9ydHMubnVtYmVyID0gZXhwb3J0cy5zdHJpbmcgPSBleHBvcnRzLmJvb2xlYW4gPSB2b2lkIDA7XG5mdW5jdGlvbiBib29sZWFuKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZTtcbn1cbmV4cG9ydHMuYm9vbGVhbiA9IGJvb2xlYW47XG5mdW5jdGlvbiBzdHJpbmcodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZztcbn1cbmV4cG9ydHMuc3RyaW5nID0gc3RyaW5nO1xuZnVuY3Rpb24gbnVtYmVyKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdmFsdWUgaW5zdGFuY2VvZiBOdW1iZXI7XG59XG5leHBvcnRzLm51bWJlciA9IG51bWJlcjtcbmZ1bmN0aW9uIGVycm9yKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgRXJyb3I7XG59XG5leHBvcnRzLmVycm9yID0gZXJyb3I7XG5mdW5jdGlvbiBmdW5jKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cbmV4cG9ydHMuZnVuYyA9IGZ1bmM7XG5mdW5jdGlvbiBhcnJheSh2YWx1ZSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cbmV4cG9ydHMuYXJyYXkgPSBhcnJheTtcbmZ1bmN0aW9uIHN0cmluZ0FycmF5KHZhbHVlKSB7XG4gICAgcmV0dXJuIGFycmF5KHZhbHVlKSAmJiB2YWx1ZS5ldmVyeShlbGVtID0+IHN0cmluZyhlbGVtKSk7XG59XG5leHBvcnRzLnN0cmluZ0FycmF5ID0gc3RyaW5nQXJyYXk7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLk1lc3NhZ2UgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU5ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlOCA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTcgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU2ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNSA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTQgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUzID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMiA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTEgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUwID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTkgPSBleHBvcnRzLlJlcXVlc3RUeXBlOCA9IGV4cG9ydHMuUmVxdWVzdFR5cGU3ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTYgPSBleHBvcnRzLlJlcXVlc3RUeXBlNSA9IGV4cG9ydHMuUmVxdWVzdFR5cGU0ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTMgPSBleHBvcnRzLlJlcXVlc3RUeXBlMiA9IGV4cG9ydHMuUmVxdWVzdFR5cGUxID0gZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IGV4cG9ydHMuUmVxdWVzdFR5cGUwID0gZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUgPSBleHBvcnRzLlBhcmFtZXRlclN0cnVjdHVyZXMgPSBleHBvcnRzLlJlc3BvbnNlRXJyb3IgPSBleHBvcnRzLkVycm9yQ29kZXMgPSB2b2lkIDA7XG5jb25zdCBpcyA9IHJlcXVpcmUoXCIuL2lzXCIpO1xuLyoqXG4gKiBQcmVkZWZpbmVkIGVycm9yIGNvZGVzLlxuICovXG52YXIgRXJyb3JDb2RlcztcbihmdW5jdGlvbiAoRXJyb3JDb2Rlcykge1xuICAgIC8vIERlZmluZWQgYnkgSlNPTiBSUENcbiAgICBFcnJvckNvZGVzLlBhcnNlRXJyb3IgPSAtMzI3MDA7XG4gICAgRXJyb3JDb2Rlcy5JbnZhbGlkUmVxdWVzdCA9IC0zMjYwMDtcbiAgICBFcnJvckNvZGVzLk1ldGhvZE5vdEZvdW5kID0gLTMyNjAxO1xuICAgIEVycm9yQ29kZXMuSW52YWxpZFBhcmFtcyA9IC0zMjYwMjtcbiAgICBFcnJvckNvZGVzLkludGVybmFsRXJyb3IgPSAtMzI2MDM7XG4gICAgLyoqXG4gICAgICogVGhpcyBpcyB0aGUgc3RhcnQgcmFuZ2Ugb2YgSlNPTiBSUEMgcmVzZXJ2ZWQgZXJyb3IgY29kZXMuXG4gICAgICogSXQgZG9lc24ndCBkZW5vdGUgYSByZWFsIGVycm9yIGNvZGUuIE5vIGFwcGxpY2F0aW9uIGVycm9yIGNvZGVzIHNob3VsZFxuICAgICAqIGJlIGRlZmluZWQgYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCByYW5nZS4gRm9yIGJhY2t3YXJkc1xuICAgICAqIGNvbXBhdGliaWxpdHkgdGhlIGBTZXJ2ZXJOb3RJbml0aWFsaXplZGAgYW5kIHRoZSBgVW5rbm93bkVycm9yQ29kZWBcbiAgICAgKiBhcmUgbGVmdCBpbiB0aGUgcmFuZ2UuXG4gICAgICpcbiAgICAgKiBAc2luY2UgMy4xNi4wXG4gICAgKi9cbiAgICBFcnJvckNvZGVzLmpzb25ycGNSZXNlcnZlZEVycm9yUmFuZ2VTdGFydCA9IC0zMjA5OTtcbiAgICAvKiogQGRlcHJlY2F0ZWQgdXNlICBqc29ucnBjUmVzZXJ2ZWRFcnJvclJhbmdlU3RhcnQgKi9cbiAgICBFcnJvckNvZGVzLnNlcnZlckVycm9yU3RhcnQgPSAtMzIwOTk7XG4gICAgLyoqXG4gICAgICogQW4gZXJyb3Igb2NjdXJyZWQgd2hlbiB3cml0ZSBhIG1lc3NhZ2UgdG8gdGhlIHRyYW5zcG9ydCBsYXllci5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLk1lc3NhZ2VXcml0ZUVycm9yID0gLTMyMDk5O1xuICAgIC8qKlxuICAgICAqIEFuIGVycm9yIG9jY3VycmVkIHdoZW4gcmVhZGluZyBhIG1lc3NhZ2UgZnJvbSB0aGUgdHJhbnNwb3J0IGxheWVyLlxuICAgICAqL1xuICAgIEVycm9yQ29kZXMuTWVzc2FnZVJlYWRFcnJvciA9IC0zMjA5ODtcbiAgICAvKipcbiAgICAgKiBUaGUgY29ubmVjdGlvbiBnb3QgZGlzcG9zZWQgb3IgbG9zdCBhbmQgYWxsIHBlbmRpbmcgcmVzcG9uc2VzIGdvdFxuICAgICAqIHJlamVjdGVkLlxuICAgICAqL1xuICAgIEVycm9yQ29kZXMuUGVuZGluZ1Jlc3BvbnNlUmVqZWN0ZWQgPSAtMzIwOTc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gaXMgaW5hY3RpdmUgYW5kIGEgdXNlIG9mIGl0IGZhaWxlZC5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLkNvbm5lY3Rpb25JbmFjdGl2ZSA9IC0zMjA5NjtcbiAgICAvKipcbiAgICAgKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBhIHNlcnZlciByZWNlaXZlZCBhIG5vdGlmaWNhdGlvbiBvclxuICAgICAqIHJlcXVlc3QgYmVmb3JlIHRoZSBzZXJ2ZXIgaGFzIHJlY2VpdmVkIHRoZSBgaW5pdGlhbGl6ZWAgcmVxdWVzdC5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLlNlcnZlck5vdEluaXRpYWxpemVkID0gLTMyMDAyO1xuICAgIEVycm9yQ29kZXMuVW5rbm93bkVycm9yQ29kZSA9IC0zMjAwMTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIHRoZSBlbmQgcmFuZ2Ugb2YgSlNPTiBSUEMgcmVzZXJ2ZWQgZXJyb3IgY29kZXMuXG4gICAgICogSXQgZG9lc24ndCBkZW5vdGUgYSByZWFsIGVycm9yIGNvZGUuXG4gICAgICpcbiAgICAgKiBAc2luY2UgMy4xNi4wXG4gICAgKi9cbiAgICBFcnJvckNvZGVzLmpzb25ycGNSZXNlcnZlZEVycm9yUmFuZ2VFbmQgPSAtMzIwMDA7XG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSAganNvbnJwY1Jlc2VydmVkRXJyb3JSYW5nZUVuZCAqL1xuICAgIEVycm9yQ29kZXMuc2VydmVyRXJyb3JFbmQgPSAtMzIwMDA7XG59KShFcnJvckNvZGVzIHx8IChleHBvcnRzLkVycm9yQ29kZXMgPSBFcnJvckNvZGVzID0ge30pKTtcbi8qKlxuICogQW4gZXJyb3Igb2JqZWN0IHJldHVybiBpbiBhIHJlc3BvbnNlIGluIGNhc2UgYSByZXF1ZXN0XG4gKiBoYXMgZmFpbGVkLlxuICovXG5jbGFzcyBSZXNwb25zZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNvZGUsIG1lc3NhZ2UsIGRhdGEpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuY29kZSA9IGlzLm51bWJlcihjb2RlKSA/IGNvZGUgOiBFcnJvckNvZGVzLlVua25vd25FcnJvckNvZGU7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBSZXNwb25zZUVycm9yLnByb3RvdHlwZSk7XG4gICAgfVxuICAgIHRvSnNvbigpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgY29kZTogdGhpcy5jb2RlLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLmRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmRhdGEgPSB0aGlzLmRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5leHBvcnRzLlJlc3BvbnNlRXJyb3IgPSBSZXNwb25zZUVycm9yO1xuY2xhc3MgUGFyYW1ldGVyU3RydWN0dXJlcyB7XG4gICAgY29uc3RydWN0b3Ioa2luZCkge1xuICAgICAgICB0aGlzLmtpbmQgPSBraW5kO1xuICAgIH1cbiAgICBzdGF0aWMgaXModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8gfHwgdmFsdWUgPT09IFBhcmFtZXRlclN0cnVjdHVyZXMuYnlOYW1lIHx8IHZhbHVlID09PSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5UG9zaXRpb247XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5raW5kO1xuICAgIH1cbn1cbmV4cG9ydHMuUGFyYW1ldGVyU3RydWN0dXJlcyA9IFBhcmFtZXRlclN0cnVjdHVyZXM7XG4vKipcbiAqIFRoZSBwYXJhbWV0ZXIgc3RydWN0dXJlIGlzIGF1dG9tYXRpY2FsbHkgaW5mZXJyZWQgb24gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzXG4gKiBhbmQgdGhlIHBhcmFtZXRlciB0eXBlIGluIGNhc2Ugb2YgYSBzaW5nbGUgcGFyYW0uXG4gKi9cblBhcmFtZXRlclN0cnVjdHVyZXMuYXV0byA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdhdXRvJyk7XG4vKipcbiAqIEZvcmNlcyBgYnlQb3NpdGlvbmAgcGFyYW1ldGVyIHN0cnVjdHVyZS4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGhhdmUgYSBzaW5nbGVcbiAqIHBhcmFtZXRlciB3aGljaCBoYXMgYSBsaXRlcmFsIHR5cGUuXG4gKi9cblBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbiA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdieVBvc2l0aW9uJyk7XG4vKipcbiAqIEZvcmNlcyBgYnlOYW1lYCBwYXJhbWV0ZXIgc3RydWN0dXJlLiBUaGlzIGlzIG9ubHkgdXNlZnVsIHdoZW4gaGF2aW5nIGEgc2luZ2xlXG4gKiBwYXJhbWV0ZXIuIFRoZSBsaWJyYXJ5IHdpbGwgcmVwb3J0IGVycm9ycyBpZiB1c2VkIHdpdGggYSBkaWZmZXJlbnQgbnVtYmVyIG9mXG4gKiBwYXJhbWV0ZXJzLlxuICovXG5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdieU5hbWUnKTtcbi8qKlxuICogQW4gYWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgYSBNZXNzYWdlVHlwZS5cbiAqL1xuY2xhc3MgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIG51bWJlck9mUGFyYW1zKSB7XG4gICAgICAgIHRoaXMubWV0aG9kID0gbWV0aG9kO1xuICAgICAgICB0aGlzLm51bWJlck9mUGFyYW1zID0gbnVtYmVyT2ZQYXJhbXM7XG4gICAgfVxuICAgIGdldCBwYXJhbWV0ZXJTdHJ1Y3R1cmVzKCkge1xuICAgICAgICByZXR1cm4gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvO1xuICAgIH1cbn1cbmV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlID0gQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlO1xuLyoqXG4gKiBDbGFzc2VzIHRvIHR5cGUgcmVxdWVzdCByZXNwb25zZSBwYWlyc1xuICovXG5jbGFzcyBSZXF1ZXN0VHlwZTAgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDApO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGUwID0gUmVxdWVzdFR5cGUwO1xuY2xhc3MgUmVxdWVzdFR5cGUgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCwgX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8pIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAxKTtcbiAgICAgICAgdGhpcy5fcGFyYW1ldGVyU3RydWN0dXJlcyA9IF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbiAgICBnZXQgcGFyYW1ldGVyU3RydWN0dXJlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXM7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IFJlcXVlc3RUeXBlO1xuY2xhc3MgUmVxdWVzdFR5cGUxIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMSk7XG4gICAgICAgIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBfcGFyYW1ldGVyU3RydWN0dXJlcztcbiAgICB9XG4gICAgZ2V0IHBhcmFtZXRlclN0cnVjdHVyZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGUxID0gUmVxdWVzdFR5cGUxO1xuY2xhc3MgUmVxdWVzdFR5cGUyIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAyKTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlMiA9IFJlcXVlc3RUeXBlMjtcbmNsYXNzIFJlcXVlc3RUeXBlMyBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMyk7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTMgPSBSZXF1ZXN0VHlwZTM7XG5jbGFzcyBSZXF1ZXN0VHlwZTQgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDQpO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGU0ID0gUmVxdWVzdFR5cGU0O1xuY2xhc3MgUmVxdWVzdFR5cGU1IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA1KTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlNSA9IFJlcXVlc3RUeXBlNTtcbmNsYXNzIFJlcXVlc3RUeXBlNiBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNik7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTYgPSBSZXF1ZXN0VHlwZTY7XG5jbGFzcyBSZXF1ZXN0VHlwZTcgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDcpO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGU3ID0gUmVxdWVzdFR5cGU3O1xuY2xhc3MgUmVxdWVzdFR5cGU4IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA4KTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlOCA9IFJlcXVlc3RUeXBlODtcbmNsYXNzIFJlcXVlc3RUeXBlOSBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgOSk7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTkgPSBSZXF1ZXN0VHlwZTk7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMSk7XG4gICAgICAgIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBfcGFyYW1ldGVyU3RydWN0dXJlcztcbiAgICB9XG4gICAgZ2V0IHBhcmFtZXRlclN0cnVjdHVyZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZSA9IE5vdGlmaWNhdGlvblR5cGU7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlMCBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMCk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMCA9IE5vdGlmaWNhdGlvblR5cGUwO1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTEgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCwgX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8pIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAxKTtcbiAgICAgICAgdGhpcy5fcGFyYW1ldGVyU3RydWN0dXJlcyA9IF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbiAgICBnZXQgcGFyYW1ldGVyU3RydWN0dXJlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXM7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMSA9IE5vdGlmaWNhdGlvblR5cGUxO1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDIpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTIgPSBOb3RpZmljYXRpb25UeXBlMjtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGUzIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAzKTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGUzID0gTm90aWZpY2F0aW9uVHlwZTM7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlNCBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNCk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNCA9IE5vdGlmaWNhdGlvblR5cGU0O1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTUgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDUpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTUgPSBOb3RpZmljYXRpb25UeXBlNTtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGU2IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA2KTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGU2ID0gTm90aWZpY2F0aW9uVHlwZTY7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlNyBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNyk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNyA9IE5vdGlmaWNhdGlvblR5cGU3O1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTggZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDgpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTggPSBOb3RpZmljYXRpb25UeXBlODtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGU5IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA5KTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGU5ID0gTm90aWZpY2F0aW9uVHlwZTk7XG52YXIgTWVzc2FnZTtcbihmdW5jdGlvbiAoTWVzc2FnZSkge1xuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoZSBnaXZlbiBtZXNzYWdlIGlzIGEgcmVxdWVzdCBtZXNzYWdlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gbWVzc2FnZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBpcy5zdHJpbmcoY2FuZGlkYXRlLm1ldGhvZCkgJiYgKGlzLnN0cmluZyhjYW5kaWRhdGUuaWQpIHx8IGlzLm51bWJlcihjYW5kaWRhdGUuaWQpKTtcbiAgICB9XG4gICAgTWVzc2FnZS5pc1JlcXVlc3QgPSBpc1JlcXVlc3Q7XG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhlIGdpdmVuIG1lc3NhZ2UgaXMgYSBub3RpZmljYXRpb24gbWVzc2FnZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTm90aWZpY2F0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gbWVzc2FnZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBpcy5zdHJpbmcoY2FuZGlkYXRlLm1ldGhvZCkgJiYgbWVzc2FnZS5pZCA9PT0gdm9pZCAwO1xuICAgIH1cbiAgICBNZXNzYWdlLmlzTm90aWZpY2F0aW9uID0gaXNOb3RpZmljYXRpb247XG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhlIGdpdmVuIG1lc3NhZ2UgaXMgYSByZXNwb25zZSBtZXNzYWdlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNSZXNwb25zZShtZXNzYWdlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IG1lc3NhZ2U7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgKGNhbmRpZGF0ZS5yZXN1bHQgIT09IHZvaWQgMCB8fCAhIWNhbmRpZGF0ZS5lcnJvcikgJiYgKGlzLnN0cmluZyhjYW5kaWRhdGUuaWQpIHx8IGlzLm51bWJlcihjYW5kaWRhdGUuaWQpIHx8IGNhbmRpZGF0ZS5pZCA9PT0gbnVsbCk7XG4gICAgfVxuICAgIE1lc3NhZ2UuaXNSZXNwb25zZSA9IGlzUmVzcG9uc2U7XG59KShNZXNzYWdlIHx8IChleHBvcnRzLk1lc3NhZ2UgPSBNZXNzYWdlID0ge30pKTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xudmFyIF9hO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5MUlVDYWNoZSA9IGV4cG9ydHMuTGlua2VkTWFwID0gZXhwb3J0cy5Ub3VjaCA9IHZvaWQgMDtcbnZhciBUb3VjaDtcbihmdW5jdGlvbiAoVG91Y2gpIHtcbiAgICBUb3VjaC5Ob25lID0gMDtcbiAgICBUb3VjaC5GaXJzdCA9IDE7XG4gICAgVG91Y2guQXNPbGQgPSBUb3VjaC5GaXJzdDtcbiAgICBUb3VjaC5MYXN0ID0gMjtcbiAgICBUb3VjaC5Bc05ldyA9IFRvdWNoLkxhc3Q7XG59KShUb3VjaCB8fCAoZXhwb3J0cy5Ub3VjaCA9IFRvdWNoID0ge30pKTtcbmNsYXNzIExpbmtlZE1hcCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXNbX2FdID0gJ0xpbmtlZE1hcCc7XG4gICAgICAgIHRoaXMuX21hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5faGVhZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fdGFpbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IDA7XG4gICAgICAgIHRoaXMuX3N0YXRlID0gMDtcbiAgICB9XG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuX21hcC5jbGVhcigpO1xuICAgICAgICB0aGlzLl9oZWFkID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl90YWlsID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9zaXplID0gMDtcbiAgICAgICAgdGhpcy5fc3RhdGUrKztcbiAgICB9XG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLl9oZWFkICYmICF0aGlzLl90YWlsO1xuICAgIH1cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpemU7XG4gICAgfVxuICAgIGdldCBmaXJzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlYWQ/LnZhbHVlO1xuICAgIH1cbiAgICBnZXQgbGFzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhaWw/LnZhbHVlO1xuICAgIH1cbiAgICBoYXMoa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXAuaGFzKGtleSk7XG4gICAgfVxuICAgIGdldChrZXksIHRvdWNoID0gVG91Y2guTm9uZSkge1xuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5fbWFwLmdldChrZXkpO1xuICAgICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRvdWNoICE9PSBUb3VjaC5Ob25lKSB7XG4gICAgICAgICAgICB0aGlzLnRvdWNoKGl0ZW0sIHRvdWNoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICB9XG4gICAgc2V0KGtleSwgdmFsdWUsIHRvdWNoID0gVG91Y2guTm9uZSkge1xuICAgICAgICBsZXQgaXRlbSA9IHRoaXMuX21hcC5nZXQoa2V5KTtcbiAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgIGl0ZW0udmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIGlmICh0b3VjaCAhPT0gVG91Y2guTm9uZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudG91Y2goaXRlbSwgdG91Y2gpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaXRlbSA9IHsga2V5LCB2YWx1ZSwgbmV4dDogdW5kZWZpbmVkLCBwcmV2aW91czogdW5kZWZpbmVkIH07XG4gICAgICAgICAgICBzd2l0Y2ggKHRvdWNoKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBUb3VjaC5Ob25lOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFRvdWNoLkZpcnN0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1GaXJzdChpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBUb3VjaC5MYXN0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX21hcC5zZXQoa2V5LCBpdGVtKTtcbiAgICAgICAgICAgIHRoaXMuX3NpemUrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGVsZXRlKGtleSkge1xuICAgICAgICByZXR1cm4gISF0aGlzLnJlbW92ZShrZXkpO1xuICAgIH1cbiAgICByZW1vdmUoa2V5KSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl9tYXAuZ2V0KGtleSk7XG4gICAgICAgIGlmICghaXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tYXAuZGVsZXRlKGtleSk7XG4gICAgICAgIHRoaXMucmVtb3ZlSXRlbShpdGVtKTtcbiAgICAgICAgdGhpcy5fc2l6ZS0tO1xuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICB9XG4gICAgc2hpZnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5faGVhZCAmJiAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2hlYWQgfHwgIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIHRoaXMuX21hcC5kZWxldGUoaXRlbS5rZXkpO1xuICAgICAgICB0aGlzLnJlbW92ZUl0ZW0oaXRlbSk7XG4gICAgICAgIHRoaXMuX3NpemUtLTtcbiAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7XG4gICAgfVxuICAgIGZvckVhY2goY2FsbGJhY2tmbiwgdGhpc0FyZykge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3N0YXRlO1xuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICAgICAgICBpZiAodGhpc0FyZykge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrZm4uYmluZCh0aGlzQXJnKShjdXJyZW50LnZhbHVlLCBjdXJyZW50LmtleSwgdGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFja2ZuKGN1cnJlbnQudmFsdWUsIGN1cnJlbnQua2V5LCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gc3RhdGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExpbmtlZE1hcCBnb3QgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAga2V5cygpIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9zdGF0ZTtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLl9oZWFkO1xuICAgICAgICBjb25zdCBpdGVyYXRvciA9IHtcbiAgICAgICAgICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fc3RhdGUgIT09IHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTGlua2VkTWFwIGdvdCBtb2RpZmllZCBkdXJpbmcgaXRlcmF0aW9uLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7IHZhbHVlOiBjdXJyZW50LmtleSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICB9XG4gICAgdmFsdWVzKCkge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3N0YXRlO1xuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIGNvbnN0IGl0ZXJhdG9yID0ge1xuICAgICAgICAgICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlcmF0b3I7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBMaW5rZWRNYXAgZ290IG1vZGlmaWVkIGR1cmluZyBpdGVyYXRpb24uYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHsgdmFsdWU6IGN1cnJlbnQudmFsdWUsIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gaXRlcmF0b3I7XG4gICAgfVxuICAgIGVudHJpZXMoKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5fc3RhdGU7XG4gICAgICAgIGxldCBjdXJyZW50ID0gdGhpcy5faGVhZDtcbiAgICAgICAgY29uc3QgaXRlcmF0b3IgPSB7XG4gICAgICAgICAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3N0YXRlICE9PSBzdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExpbmtlZE1hcCBnb3QgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geyB2YWx1ZTogW2N1cnJlbnQua2V5LCBjdXJyZW50LnZhbHVlXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICB9XG4gICAgWyhfYSA9IFN5bWJvbC50b1N0cmluZ1RhZywgU3ltYm9sLml0ZXJhdG9yKV0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMoKTtcbiAgICB9XG4gICAgdHJpbU9sZChuZXdTaXplKSB7XG4gICAgICAgIGlmIChuZXdTaXplID49IHRoaXMuc2l6ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuZXdTaXplID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLl9oZWFkO1xuICAgICAgICBsZXQgY3VycmVudFNpemUgPSB0aGlzLnNpemU7XG4gICAgICAgIHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnRTaXplID4gbmV3U2l6ZSkge1xuICAgICAgICAgICAgdGhpcy5fbWFwLmRlbGV0ZShjdXJyZW50LmtleSk7XG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0O1xuICAgICAgICAgICAgY3VycmVudFNpemUtLTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9oZWFkID0gY3VycmVudDtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IGN1cnJlbnRTaXplO1xuICAgICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICAgICAgY3VycmVudC5wcmV2aW91cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgIH1cbiAgICBhZGRJdGVtRmlyc3QoaXRlbSkge1xuICAgICAgICAvLyBGaXJzdCB0aW1lIEluc2VydFxuICAgICAgICBpZiAoIXRoaXMuX2hlYWQgJiYgIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRoaXMuX3RhaWwgPSBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCF0aGlzLl9oZWFkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbGlzdCcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdGhpcy5faGVhZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQucHJldmlvdXMgPSBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2hlYWQgPSBpdGVtO1xuICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgIH1cbiAgICBhZGRJdGVtTGFzdChpdGVtKSB7XG4gICAgICAgIC8vIEZpcnN0IHRpbWUgSW5zZXJ0XG4gICAgICAgIGlmICghdGhpcy5faGVhZCAmJiAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgdGhpcy5faGVhZCA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpdGVtLnByZXZpb3VzID0gdGhpcy5fdGFpbDtcbiAgICAgICAgICAgIHRoaXMuX3RhaWwubmV4dCA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW07XG4gICAgICAgIHRoaXMuX3N0YXRlKys7XG4gICAgfVxuICAgIHJlbW92ZUl0ZW0oaXRlbSkge1xuICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCAmJiBpdGVtID09PSB0aGlzLl90YWlsKSB7XG4gICAgICAgICAgICB0aGlzLl9oZWFkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpdGVtID09PSB0aGlzLl9oZWFkKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGNhbiBvbmx5IGhhcHBlbmVkIGlmIHNpemUgPT09IDEgd2hpY2ggaXMgaGFuZGxlXG4gICAgICAgICAgICAvLyBieSB0aGUgY2FzZSBhYm92ZS5cbiAgICAgICAgICAgIGlmICghaXRlbS5uZXh0KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxpc3QnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGl0ZW0ubmV4dC5wcmV2aW91cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQgPSBpdGVtLm5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXRlbSA9PT0gdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgLy8gVGhpcyBjYW4gb25seSBoYXBwZW5lZCBpZiBzaXplID09PSAxIHdoaWNoIGlzIGhhbmRsZVxuICAgICAgICAgICAgLy8gYnkgdGhlIGNhc2UgYWJvdmUuXG4gICAgICAgICAgICBpZiAoIWl0ZW0ucHJldmlvdXMpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbGlzdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbS5wcmV2aW91cy5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gaXRlbS5uZXh0O1xuICAgICAgICAgICAgY29uc3QgcHJldmlvdXMgPSBpdGVtLnByZXZpb3VzO1xuICAgICAgICAgICAgaWYgKCFuZXh0IHx8ICFwcmV2aW91cykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXh0LnByZXZpb3VzID0gcHJldmlvdXM7XG4gICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gbmV4dDtcbiAgICAgICAgfVxuICAgICAgICBpdGVtLm5leHQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGl0ZW0ucHJldmlvdXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX3N0YXRlKys7XG4gICAgfVxuICAgIHRvdWNoKGl0ZW0sIHRvdWNoKSB7XG4gICAgICAgIGlmICghdGhpcy5faGVhZCB8fCAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxpc3QnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHRvdWNoICE9PSBUb3VjaC5GaXJzdCAmJiB0b3VjaCAhPT0gVG91Y2guTGFzdCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG91Y2ggPT09IFRvdWNoLkZpcnN0KSB7XG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBpdGVtLm5leHQ7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgICAgICAvLyBVbmxpbmsgdGhlIGl0ZW1cbiAgICAgICAgICAgIGlmIChpdGVtID09PSB0aGlzLl90YWlsKSB7XG4gICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgbXVzdCBiZSBkZWZpbmVkIHNpbmNlIGl0ZW0gd2FzIG5vdCBoZWFkIGJ1dCBpcyB0YWlsXG4gICAgICAgICAgICAgICAgLy8gU28gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbiBpdGVtIGluIHRoZSBtYXBcbiAgICAgICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuX3RhaWwgPSBwcmV2aW91cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEJvdGggbmV4dCBhbmQgcHJldmlvdXMgYXJlIG5vdCB1bmRlZmluZWQgc2luY2UgaXRlbSB3YXMgbmVpdGhlciBoZWFkIG5vciB0YWlsLlxuICAgICAgICAgICAgICAgIG5leHQucHJldmlvdXMgPSBwcmV2aW91cztcbiAgICAgICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEluc2VydCB0aGUgbm9kZSBhdCBoZWFkXG4gICAgICAgICAgICBpdGVtLnByZXZpb3VzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdGhpcy5faGVhZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQucHJldmlvdXMgPSBpdGVtO1xuICAgICAgICAgICAgdGhpcy5faGVhZCA9IGl0ZW07XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRvdWNoID09PSBUb3VjaC5MYXN0KSB7XG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBpdGVtLm5leHQ7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgICAgICAvLyBVbmxpbmsgdGhlIGl0ZW0uXG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCkge1xuICAgICAgICAgICAgICAgIC8vIG5leHQgbXVzdCBiZSBkZWZpbmVkIHNpbmNlIGl0ZW0gd2FzIG5vdCB0YWlsIGJ1dCBpcyBoZWFkXG4gICAgICAgICAgICAgICAgLy8gU28gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbiBpdGVtIGluIHRoZSBtYXBcbiAgICAgICAgICAgICAgICBuZXh0LnByZXZpb3VzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuX2hlYWQgPSBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQm90aCBuZXh0IGFuZCBwcmV2aW91cyBhcmUgbm90IHVuZGVmaW5lZCBzaW5jZSBpdGVtIHdhcyBuZWl0aGVyIGhlYWQgbm9yIHRhaWwuXG4gICAgICAgICAgICAgICAgbmV4dC5wcmV2aW91cyA9IHByZXZpb3VzO1xuICAgICAgICAgICAgICAgIHByZXZpb3VzLm5leHQgPSBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaXRlbS5wcmV2aW91cyA9IHRoaXMuX3RhaWw7XG4gICAgICAgICAgICB0aGlzLl90YWlsLm5leHQgPSBpdGVtO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW07XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IFtdO1xuICAgICAgICB0aGlzLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGRhdGEucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGZyb21KU09OKGRhdGEpIHtcbiAgICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBkYXRhKSB7XG4gICAgICAgICAgICB0aGlzLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuTGlua2VkTWFwID0gTGlua2VkTWFwO1xuY2xhc3MgTFJVQ2FjaGUgZXh0ZW5kcyBMaW5rZWRNYXAge1xuICAgIGNvbnN0cnVjdG9yKGxpbWl0LCByYXRpbyA9IDEpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fbGltaXQgPSBsaW1pdDtcbiAgICAgICAgdGhpcy5fcmF0aW8gPSBNYXRoLm1pbihNYXRoLm1heCgwLCByYXRpbyksIDEpO1xuICAgIH1cbiAgICBnZXQgbGltaXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9saW1pdDtcbiAgICB9XG4gICAgc2V0IGxpbWl0KGxpbWl0KSB7XG4gICAgICAgIHRoaXMuX2xpbWl0ID0gbGltaXQ7XG4gICAgICAgIHRoaXMuY2hlY2tUcmltKCk7XG4gICAgfVxuICAgIGdldCByYXRpbygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JhdGlvO1xuICAgIH1cbiAgICBzZXQgcmF0aW8ocmF0aW8pIHtcbiAgICAgICAgdGhpcy5fcmF0aW8gPSBNYXRoLm1pbihNYXRoLm1heCgwLCByYXRpbyksIDEpO1xuICAgICAgICB0aGlzLmNoZWNrVHJpbSgpO1xuICAgIH1cbiAgICBnZXQoa2V5LCB0b3VjaCA9IFRvdWNoLkFzTmV3KSB7XG4gICAgICAgIHJldHVybiBzdXBlci5nZXQoa2V5LCB0b3VjaCk7XG4gICAgfVxuICAgIHBlZWsoa2V5KSB7XG4gICAgICAgIHJldHVybiBzdXBlci5nZXQoa2V5LCBUb3VjaC5Ob25lKTtcbiAgICB9XG4gICAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgc3VwZXIuc2V0KGtleSwgdmFsdWUsIFRvdWNoLkxhc3QpO1xuICAgICAgICB0aGlzLmNoZWNrVHJpbSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgY2hlY2tUcmltKCkge1xuICAgICAgICBpZiAodGhpcy5zaXplID4gdGhpcy5fbGltaXQpIHtcbiAgICAgICAgICAgIHRoaXMudHJpbU9sZChNYXRoLnJvdW5kKHRoaXMuX2xpbWl0ICogdGhpcy5fcmF0aW8pKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuTFJVQ2FjaGUgPSBMUlVDYWNoZTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5EaXNwb3NhYmxlID0gdm9pZCAwO1xudmFyIERpc3Bvc2FibGU7XG4oZnVuY3Rpb24gKERpc3Bvc2FibGUpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUoZnVuYykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGlzcG9zZTogZnVuY1xuICAgICAgICB9O1xuICAgIH1cbiAgICBEaXNwb3NhYmxlLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKERpc3Bvc2FibGUgfHwgKGV4cG9ydHMuRGlzcG9zYWJsZSA9IERpc3Bvc2FibGUgPSB7fSkpO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xubGV0IF9yYWw7XG5mdW5jdGlvbiBSQUwoKSB7XG4gICAgaWYgKF9yYWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHJ1bnRpbWUgYWJzdHJhY3Rpb24gbGF5ZXIgaW5zdGFsbGVkYCk7XG4gICAgfVxuICAgIHJldHVybiBfcmFsO1xufVxuKGZ1bmN0aW9uIChSQUwpIHtcbiAgICBmdW5jdGlvbiBpbnN0YWxsKHJhbCkge1xuICAgICAgICBpZiAocmFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gcnVudGltZSBhYnN0cmFjdGlvbiBsYXllciBwcm92aWRlZGApO1xuICAgICAgICB9XG4gICAgICAgIF9yYWwgPSByYWw7XG4gICAgfVxuICAgIFJBTC5pbnN0YWxsID0gaW5zdGFsbDtcbn0pKFJBTCB8fCAoUkFMID0ge30pKTtcbmV4cG9ydHMuZGVmYXVsdCA9IFJBTDtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuRW1pdHRlciA9IGV4cG9ydHMuRXZlbnQgPSB2b2lkIDA7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbnZhciBFdmVudDtcbihmdW5jdGlvbiAoRXZlbnQpIHtcbiAgICBjb25zdCBfZGlzcG9zYWJsZSA9IHsgZGlzcG9zZSgpIHsgfSB9O1xuICAgIEV2ZW50Lk5vbmUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBfZGlzcG9zYWJsZTsgfTtcbn0pKEV2ZW50IHx8IChleHBvcnRzLkV2ZW50ID0gRXZlbnQgPSB7fSkpO1xuY2xhc3MgQ2FsbGJhY2tMaXN0IHtcbiAgICBhZGQoY2FsbGJhY2ssIGNvbnRleHQgPSBudWxsLCBidWNrZXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fY29udGV4dHMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgICAgIHRoaXMuX2NvbnRleHRzLnB1c2goY29udGV4dCk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGJ1Y2tldCkpIHtcbiAgICAgICAgICAgIGJ1Y2tldC5wdXNoKHsgZGlzcG9zZTogKCkgPT4gdGhpcy5yZW1vdmUoY2FsbGJhY2ssIGNvbnRleHQpIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlbW92ZShjYWxsYmFjaywgY29udGV4dCA9IG51bGwpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZm91bmRDYWxsYmFja1dpdGhEaWZmZXJlbnRDb250ZXh0ID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLl9jYWxsYmFja3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jYWxsYmFja3NbaV0gPT09IGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NvbnRleHRzW2ldID09PSBjb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrICYgY29udGV4dCBtYXRjaCA9PiByZW1vdmUgaXRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29udGV4dHMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZENhbGxiYWNrV2l0aERpZmZlcmVudENvbnRleHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZm91bmRDYWxsYmFja1dpdGhEaWZmZXJlbnRDb250ZXh0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1doZW4gYWRkaW5nIGEgbGlzdGVuZXIgd2l0aCBhIGNvbnRleHQsIHlvdSBzaG91bGQgcmVtb3ZlIGl0IHdpdGggdGhlIHNhbWUgY29udGV4dCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGludm9rZSguLi5hcmdzKSB7XG4gICAgICAgIGlmICghdGhpcy5fY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmV0ID0gW10sIGNhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcy5zbGljZSgwKSwgY29udGV4dHMgPSB0aGlzLl9jb250ZXh0cy5zbGljZSgwKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXQucHVzaChjYWxsYmFja3NbaV0uYXBwbHkoY29udGV4dHNbaV0sIGFyZ3MpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS5jb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICAgIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5fY2FsbGJhY2tzIHx8IHRoaXMuX2NhbGxiYWNrcy5sZW5ndGggPT09IDA7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fY29udGV4dHMgPSB1bmRlZmluZWQ7XG4gICAgfVxufVxuY2xhc3MgRW1pdHRlciB7XG4gICAgY29uc3RydWN0b3IoX29wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IF9vcHRpb25zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGb3IgdGhlIHB1YmxpYyB0byBhbGxvdyB0byBzdWJzY3JpYmVcbiAgICAgKiB0byBldmVudHMgZnJvbSB0aGlzIEVtaXR0ZXJcbiAgICAgKi9cbiAgICBnZXQgZXZlbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fZXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50ID0gKGxpc3RlbmVyLCB0aGlzQXJncywgZGlzcG9zYWJsZXMpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2NhbGxiYWNrcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWxsYmFja3MgPSBuZXcgQ2FsbGJhY2tMaXN0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMub25GaXJzdExpc3RlbmVyQWRkICYmIHRoaXMuX2NhbGxiYWNrcy5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy5vbkZpcnN0TGlzdGVuZXJBZGQodGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5hZGQobGlzdGVuZXIsIHRoaXNBcmdzKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlzcG9zYWJsZSBpcyBkaXNwb3NlZCBhZnRlciBlbWl0dGVyIGlzIGRpc3Bvc2VkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5yZW1vdmUobGlzdGVuZXIsIHRoaXNBcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5kaXNwb3NlID0gRW1pdHRlci5fbm9vcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMub25MYXN0TGlzdGVuZXJSZW1vdmUgJiYgdGhpcy5fY2FsbGJhY2tzLmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29wdGlvbnMub25MYXN0TGlzdGVuZXJSZW1vdmUodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRpc3Bvc2FibGVzKSkge1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlcy5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9ldmVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVG8gYmUga2VwdCBwcml2YXRlIHRvIGZpcmUgYW4gZXZlbnQgdG9cbiAgICAgKiBzdWJzY3JpYmVyc1xuICAgICAqL1xuICAgIGZpcmUoZXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NhbGxiYWNrcykge1xuICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzLmludm9rZS5jYWxsKHRoaXMuX2NhbGxiYWNrcywgZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5kaXNwb3NlKCk7XG4gICAgICAgICAgICB0aGlzLl9jYWxsYmFja3MgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLkVtaXR0ZXIgPSBFbWl0dGVyO1xuRW1pdHRlci5fbm9vcCA9IGZ1bmN0aW9uICgpIHsgfTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uVG9rZW4gPSB2b2lkIDA7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbmNvbnN0IElzID0gcmVxdWlyZShcIi4vaXNcIik7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCIuL2V2ZW50c1wiKTtcbnZhciBDYW5jZWxsYXRpb25Ub2tlbjtcbihmdW5jdGlvbiAoQ2FuY2VsbGF0aW9uVG9rZW4pIHtcbiAgICBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGlzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkOiBmYWxzZSxcbiAgICAgICAgb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6IGV2ZW50c18xLkV2ZW50Lk5vbmVcbiAgICB9KTtcbiAgICBDYW5jZWxsYXRpb25Ub2tlbi5DYW5jZWxsZWQgPSBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6IHRydWUsXG4gICAgICAgIG9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkOiBldmVudHNfMS5FdmVudC5Ob25lXG4gICAgfSk7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgKGNhbmRpZGF0ZSA9PT0gQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZVxuICAgICAgICAgICAgfHwgY2FuZGlkYXRlID09PSBDYW5jZWxsYXRpb25Ub2tlbi5DYW5jZWxsZWRcbiAgICAgICAgICAgIHx8IChJcy5ib29sZWFuKGNhbmRpZGF0ZS5pc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkgJiYgISFjYW5kaWRhdGUub25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQpKTtcbiAgICB9XG4gICAgQ2FuY2VsbGF0aW9uVG9rZW4uaXMgPSBpcztcbn0pKENhbmNlbGxhdGlvblRva2VuIHx8IChleHBvcnRzLkNhbmNlbGxhdGlvblRva2VuID0gQ2FuY2VsbGF0aW9uVG9rZW4gPSB7fSkpO1xuY29uc3Qgc2hvcnRjdXRFdmVudCA9IE9iamVjdC5mcmVlemUoZnVuY3Rpb24gKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgY29uc3QgaGFuZGxlID0gKDAsIHJhbF8xLmRlZmF1bHQpKCkudGltZXIuc2V0VGltZW91dChjYWxsYmFjay5iaW5kKGNvbnRleHQpLCAwKTtcbiAgICByZXR1cm4geyBkaXNwb3NlKCkgeyBoYW5kbGUuZGlzcG9zZSgpOyB9IH07XG59KTtcbmNsYXNzIE11dGFibGVUb2tlbiB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX2lzQ2FuY2VsbGVkID0gZmFsc2U7XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9pc0NhbmNlbGxlZCkge1xuICAgICAgICAgICAgdGhpcy5faXNDYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2VtaXR0ZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmZpcmUodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0NhbmNlbGxlZDtcbiAgICB9XG4gICAgZ2V0IG9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKCkge1xuICAgICAgICBpZiAodGhpcy5faXNDYW5jZWxsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBzaG9ydGN1dEV2ZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5fZW1pdHRlcikge1xuICAgICAgICAgICAgdGhpcy5fZW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2VtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLl9lbWl0dGVyKSB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5jbGFzcyBDYW5jZWxsYXRpb25Ub2tlblNvdXJjZSB7XG4gICAgZ2V0IHRva2VuKCkge1xuICAgICAgICBpZiAoIXRoaXMuX3Rva2VuKSB7XG4gICAgICAgICAgICAvLyBiZSBsYXp5IGFuZCBjcmVhdGUgdGhlIHRva2VuIG9ubHkgd2hlblxuICAgICAgICAgICAgLy8gYWN0dWFsbHkgbmVlZGVkXG4gICAgICAgICAgICB0aGlzLl90b2tlbiA9IG5ldyBNdXRhYmxlVG9rZW4oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fdG9rZW47XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl90b2tlbikge1xuICAgICAgICAgICAgLy8gc2F2ZSBhbiBvYmplY3QgYnkgcmV0dXJuaW5nIHRoZSBkZWZhdWx0XG4gICAgICAgICAgICAvLyBjYW5jZWxsZWQgdG9rZW4gd2hlbiBjYW5jZWxsYXRpb24gaGFwcGVuc1xuICAgICAgICAgICAgLy8gYmVmb3JlIHNvbWVvbmUgYXNrcyBmb3IgdGhlIHRva2VuXG4gICAgICAgICAgICB0aGlzLl90b2tlbiA9IENhbmNlbGxhdGlvblRva2VuLkNhbmNlbGxlZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3Rva2VuLmNhbmNlbCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICghdGhpcy5fdG9rZW4pIHtcbiAgICAgICAgICAgIC8vIGVuc3VyZSB0byBpbml0aWFsaXplIHdpdGggYW4gZW1wdHkgdG9rZW4gaWYgd2UgaGFkIG5vbmVcbiAgICAgICAgICAgIHRoaXMuX3Rva2VuID0gQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLl90b2tlbiBpbnN0YW5jZW9mIE11dGFibGVUb2tlbikge1xuICAgICAgICAgICAgLy8gYWN0dWFsbHkgZGlzcG9zZVxuICAgICAgICAgICAgdGhpcy5fdG9rZW4uZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IENhbmNlbGxhdGlvblRva2VuU291cmNlO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3kgPSB2b2lkIDA7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbnZhciBDYW5jZWxsYXRpb25TdGF0ZTtcbihmdW5jdGlvbiAoQ2FuY2VsbGF0aW9uU3RhdGUpIHtcbiAgICBDYW5jZWxsYXRpb25TdGF0ZS5Db250aW51ZSA9IDA7XG4gICAgQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkID0gMTtcbn0pKENhbmNlbGxhdGlvblN0YXRlIHx8IChDYW5jZWxsYXRpb25TdGF0ZSA9IHt9KSk7XG5jbGFzcyBTaGFyZWRBcnJheVNlbmRlclN0cmF0ZWd5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5idWZmZXJzID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICBlbmFibGVDYW5jZWxsYXRpb24ocmVxdWVzdCkge1xuICAgICAgICBpZiAocmVxdWVzdC5pZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBTaGFyZWRBcnJheUJ1ZmZlcig0KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBJbnQzMkFycmF5KGJ1ZmZlciwgMCwgMSk7XG4gICAgICAgIGRhdGFbMF0gPSBDYW5jZWxsYXRpb25TdGF0ZS5Db250aW51ZTtcbiAgICAgICAgdGhpcy5idWZmZXJzLnNldChyZXF1ZXN0LmlkLCBidWZmZXIpO1xuICAgICAgICByZXF1ZXN0LiRjYW5jZWxsYXRpb25EYXRhID0gYnVmZmVyO1xuICAgIH1cbiAgICBhc3luYyBzZW5kQ2FuY2VsbGF0aW9uKF9jb25uLCBpZCkge1xuICAgICAgICBjb25zdCBidWZmZXIgPSB0aGlzLmJ1ZmZlcnMuZ2V0KGlkKTtcbiAgICAgICAgaWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBJbnQzMkFycmF5KGJ1ZmZlciwgMCwgMSk7XG4gICAgICAgIEF0b21pY3Muc3RvcmUoZGF0YSwgMCwgQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkKTtcbiAgICB9XG4gICAgY2xlYW51cChpZCkge1xuICAgICAgICB0aGlzLmJ1ZmZlcnMuZGVsZXRlKGlkKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy5idWZmZXJzLmNsZWFyKCk7XG4gICAgfVxufVxuZXhwb3J0cy5TaGFyZWRBcnJheVNlbmRlclN0cmF0ZWd5ID0gU2hhcmVkQXJyYXlTZW5kZXJTdHJhdGVneTtcbmNsYXNzIFNoYXJlZEFycmF5QnVmZmVyQ2FuY2VsbGF0aW9uVG9rZW4ge1xuICAgIGNvbnN0cnVjdG9yKGJ1ZmZlcikge1xuICAgICAgICB0aGlzLmRhdGEgPSBuZXcgSW50MzJBcnJheShidWZmZXIsIDAsIDEpO1xuICAgIH1cbiAgICBnZXQgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHJldHVybiBBdG9taWNzLmxvYWQodGhpcy5kYXRhLCAwKSA9PT0gQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkO1xuICAgIH1cbiAgICBnZXQgb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuY2VsbGF0aW9uIG92ZXIgU2hhcmVkQXJyYXlCdWZmZXIgZG9lc24ndCBzdXBwb3J0IGNhbmNlbGxhdGlvbiBldmVudHNgKTtcbiAgICB9XG59XG5jbGFzcyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuU291cmNlIHtcbiAgICBjb25zdHJ1Y3RvcihidWZmZXIpIHtcbiAgICAgICAgdGhpcy50b2tlbiA9IG5ldyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuKGJ1ZmZlcik7XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICB9XG59XG5jbGFzcyBTaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmtpbmQgPSAncmVxdWVzdCc7XG4gICAgfVxuICAgIGNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKHJlcXVlc3QpIHtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gcmVxdWVzdC4kY2FuY2VsbGF0aW9uRGF0YTtcbiAgICAgICAgaWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuU291cmNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuU291cmNlKGJ1ZmZlcik7XG4gICAgfVxufVxuZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBTaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3k7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNlbWFwaG9yZSA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY2xhc3MgU2VtYXBob3JlIHtcbiAgICBjb25zdHJ1Y3RvcihjYXBhY2l0eSA9IDEpIHtcbiAgICAgICAgaWYgKGNhcGFjaXR5IDw9IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FwYWNpdHkgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NhcGFjaXR5ID0gY2FwYWNpdHk7XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IDA7XG4gICAgICAgIHRoaXMuX3dhaXRpbmcgPSBbXTtcbiAgICB9XG4gICAgbG9jayh0aHVuaykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fd2FpdGluZy5wdXNoKHsgdGh1bmssIHJlc29sdmUsIHJlamVjdCB9KTtcbiAgICAgICAgICAgIHRoaXMucnVuTmV4dCgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0IGFjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTtcbiAgICB9XG4gICAgcnVuTmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dhaXRpbmcubGVuZ3RoID09PSAwIHx8IHRoaXMuX2FjdGl2ZSA9PT0gdGhpcy5fY2FwYWNpdHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS50aW1lci5zZXRJbW1lZGlhdGUoKCkgPT4gdGhpcy5kb1J1bk5leHQoKSk7XG4gICAgfVxuICAgIGRvUnVuTmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dhaXRpbmcubGVuZ3RoID09PSAwIHx8IHRoaXMuX2FjdGl2ZSA9PT0gdGhpcy5fY2FwYWNpdHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5fd2FpdGluZy5zaGlmdCgpO1xuICAgICAgICB0aGlzLl9hY3RpdmUrKztcbiAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZSA+IHRoaXMuX2NhcGFjaXR5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRvIG1hbnkgdGh1bmtzIGFjdGl2ZWApO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXh0LnRodW5rKCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC50aGVuKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5yZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5OZXh0KCk7XG4gICAgICAgICAgICAgICAgfSwgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5yZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5OZXh0KCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICBuZXh0LnJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1bk5leHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgIG5leHQucmVqZWN0KGVycik7XG4gICAgICAgICAgICB0aGlzLnJ1bk5leHQoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuU2VtYXBob3JlID0gU2VtYXBob3JlO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXIgPSBleHBvcnRzLkFic3RyYWN0TWVzc2FnZVJlYWRlciA9IGV4cG9ydHMuTWVzc2FnZVJlYWRlciA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IGV2ZW50c18xID0gcmVxdWlyZShcIi4vZXZlbnRzXCIpO1xuY29uc3Qgc2VtYXBob3JlXzEgPSByZXF1aXJlKFwiLi9zZW1hcGhvcmVcIik7XG52YXIgTWVzc2FnZVJlYWRlcjtcbihmdW5jdGlvbiAoTWVzc2FnZVJlYWRlcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5saXN0ZW4pICYmIElzLmZ1bmMoY2FuZGlkYXRlLmRpc3Bvc2UpICYmXG4gICAgICAgICAgICBJcy5mdW5jKGNhbmRpZGF0ZS5vbkVycm9yKSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5vbkNsb3NlKSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5vblBhcnRpYWxNZXNzYWdlKTtcbiAgICB9XG4gICAgTWVzc2FnZVJlYWRlci5pcyA9IGlzO1xufSkoTWVzc2FnZVJlYWRlciB8fCAoZXhwb3J0cy5NZXNzYWdlUmVhZGVyID0gTWVzc2FnZVJlYWRlciA9IHt9KSk7XG5jbGFzcyBBYnN0cmFjdE1lc3NhZ2VSZWFkZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZUVtaXR0ZXIgPSBuZXcgZXZlbnRzXzEuRW1pdHRlcigpO1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlci5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgZ2V0IG9uRXJyb3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVycm9yRW1pdHRlci5ldmVudDtcbiAgICB9XG4gICAgZmlyZUVycm9yKGVycm9yKSB7XG4gICAgICAgIHRoaXMuZXJyb3JFbWl0dGVyLmZpcmUodGhpcy5hc0Vycm9yKGVycm9yKSk7XG4gICAgfVxuICAgIGdldCBvbkNsb3NlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9zZUVtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGZpcmVDbG9zZSgpIHtcbiAgICAgICAgdGhpcy5jbG9zZUVtaXR0ZXIuZmlyZSh1bmRlZmluZWQpO1xuICAgIH1cbiAgICBnZXQgb25QYXJ0aWFsTWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFydGlhbE1lc3NhZ2VFbWl0dGVyLmV2ZW50O1xuICAgIH1cbiAgICBmaXJlUGFydGlhbE1lc3NhZ2UoaW5mbykge1xuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlRW1pdHRlci5maXJlKGluZm8pO1xuICAgIH1cbiAgICBhc0Vycm9yKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKGBSZWFkZXIgcmVjZWl2ZWQgZXJyb3IuIFJlYXNvbjogJHtJcy5zdHJpbmcoZXJyb3IubWVzc2FnZSkgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24nfWApO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VSZWFkZXIgPSBBYnN0cmFjdE1lc3NhZ2VSZWFkZXI7XG52YXIgUmVzb2x2ZWRNZXNzYWdlUmVhZGVyT3B0aW9ucztcbihmdW5jdGlvbiAoUmVzb2x2ZWRNZXNzYWdlUmVhZGVyT3B0aW9ucykge1xuICAgIGZ1bmN0aW9uIGZyb21PcHRpb25zKG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IGNoYXJzZXQ7XG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIGxldCBjb250ZW50RGVjb2RlcjtcbiAgICAgICAgY29uc3QgY29udGVudERlY29kZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICBsZXQgY29udGVudFR5cGVEZWNvZGVyO1xuICAgICAgICBjb25zdCBjb250ZW50VHlwZURlY29kZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY2hhcnNldCA9IG9wdGlvbnMgPz8gJ3V0Zi04JztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNoYXJzZXQgPSBvcHRpb25zLmNoYXJzZXQgPz8gJ3V0Zi04JztcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnREZWNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50RGVjb2RlciA9IG9wdGlvbnMuY29udGVudERlY29kZXI7XG4gICAgICAgICAgICAgICAgY29udGVudERlY29kZXJzLnNldChjb250ZW50RGVjb2Rlci5uYW1lLCBjb250ZW50RGVjb2Rlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5jb250ZW50RGVjb2RlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGVjb2RlciBvZiBvcHRpb25zLmNvbnRlbnREZWNvZGVycykge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50RGVjb2RlcnMuc2V0KGRlY29kZXIubmFtZSwgZGVjb2Rlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuY29udGVudFR5cGVEZWNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXIgPSBvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcjtcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXJzLnNldChjb250ZW50VHlwZURlY29kZXIubmFtZSwgY29udGVudFR5cGVEZWNvZGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGVjb2RlciBvZiBvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGVEZWNvZGVycy5zZXQoZGVjb2Rlci5uYW1lLCBkZWNvZGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnRlbnRUeXBlRGVjb2RlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXIgPSAoMCwgcmFsXzEuZGVmYXVsdCkoKS5hcHBsaWNhdGlvbkpzb24uZGVjb2RlcjtcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlRGVjb2RlcnMuc2V0KGNvbnRlbnRUeXBlRGVjb2Rlci5uYW1lLCBjb250ZW50VHlwZURlY29kZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGNoYXJzZXQsIGNvbnRlbnREZWNvZGVyLCBjb250ZW50RGVjb2RlcnMsIGNvbnRlbnRUeXBlRGVjb2RlciwgY29udGVudFR5cGVEZWNvZGVycyB9O1xuICAgIH1cbiAgICBSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zLmZyb21PcHRpb25zID0gZnJvbU9wdGlvbnM7XG59KShSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zIHx8IChSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zID0ge30pKTtcbmNsYXNzIFJlYWRhYmxlU3RyZWFtTWVzc2FnZVJlYWRlciBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVJlYWRlciB7XG4gICAgY29uc3RydWN0b3IocmVhZGFibGUsIG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZSA9IHJlYWRhYmxlO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zLmZyb21PcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmJ1ZmZlciA9ICgwLCByYWxfMS5kZWZhdWx0KSgpLm1lc3NhZ2VCdWZmZXIuY3JlYXRlKHRoaXMub3B0aW9ucy5jaGFyc2V0KTtcbiAgICAgICAgdGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0ID0gMTAwMDA7XG4gICAgICAgIHRoaXMubmV4dE1lc3NhZ2VMZW5ndGggPSAtMTtcbiAgICAgICAgdGhpcy5tZXNzYWdlVG9rZW4gPSAwO1xuICAgICAgICB0aGlzLnJlYWRTZW1hcGhvcmUgPSBuZXcgc2VtYXBob3JlXzEuU2VtYXBob3JlKDEpO1xuICAgIH1cbiAgICBzZXQgcGFydGlhbE1lc3NhZ2VUaW1lb3V0KHRpbWVvdXQpIHtcbiAgICAgICAgdGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0ID0gdGltZW91dDtcbiAgICB9XG4gICAgZ2V0IHBhcnRpYWxNZXNzYWdlVGltZW91dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dDtcbiAgICB9XG4gICAgbGlzdGVuKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMubmV4dE1lc3NhZ2VMZW5ndGggPSAtMTtcbiAgICAgICAgdGhpcy5tZXNzYWdlVG9rZW4gPSAwO1xuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlVGltZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5yZWFkYWJsZS5vbkRhdGEoKGRhdGEpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25EYXRhKGRhdGEpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZS5vbkVycm9yKChlcnJvcikgPT4gdGhpcy5maXJlRXJyb3IoZXJyb3IpKTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZS5vbkNsb3NlKCgpID0+IHRoaXMuZmlyZUNsb3NlKCkpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBvbkRhdGEoZGF0YSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5idWZmZXIuYXBwZW5kKGRhdGEpO1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IHRoaXMuYnVmZmVyLnRyeVJlYWRIZWFkZXJzKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50TGVuZ3RoID0gaGVhZGVycy5nZXQoJ2NvbnRlbnQtbGVuZ3RoJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY29udGVudExlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IobmV3IEVycm9yKGBIZWFkZXIgbXVzdCBwcm92aWRlIGEgQ29udGVudC1MZW5ndGggcHJvcGVydHkuXFxuJHtKU09OLnN0cmluZ2lmeShPYmplY3QuZnJvbUVudHJpZXMoaGVhZGVycykpfWApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsZW5ndGggPSBwYXJzZUludChjb250ZW50TGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKGxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKG5ldyBFcnJvcihgQ29udGVudC1MZW5ndGggdmFsdWUgbXVzdCBiZSBhIG51bWJlci4gR290ICR7Y29udGVudExlbmd0aH1gKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IHRoaXMuYnVmZmVyLnRyeVJlYWRCb2R5KHRoaXMubmV4dE1lc3NhZ2VMZW5ndGgpO1xuICAgICAgICAgICAgICAgIGlmIChib2R5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLyoqIFdlIGhhdmVuJ3QgcmVjZWl2ZWQgdGhlIGZ1bGwgbWVzc2FnZSB5ZXQuICovXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0UGFydGlhbE1lc3NhZ2VUaW1lcigpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJQYXJ0aWFsTWVzc2FnZVRpbWVyKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9IC0xO1xuICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHdlIGNvbnZlcnQgb25lIHJlY2VpdmVkIG1lc3NhZ2UgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAgICAgLy8gb3RoZXIuIE90aGVyd2lzZSBpdCBjb3VsZCBoYXBwZW4gdGhhdCBhIGRlY29kaW5nIG9mIGEgc2Vjb25kXG4gICAgICAgICAgICAgICAgLy8gc21hbGxlciBtZXNzYWdlIGZpbmlzaGVkIGJlZm9yZSB0aGUgZGVjb2Rpbmcgb2YgYSBmaXJzdCBsYXJnZXJcbiAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIGFuZCB0aGVuIHdlIHdvdWxkIGRlbGl2ZXIgdGhlIHNlY29uZCBtZXNzYWdlIGZpcnN0LlxuICAgICAgICAgICAgICAgIHRoaXMucmVhZFNlbWFwaG9yZS5sb2NrKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnl0ZXMgPSB0aGlzLm9wdGlvbnMuY29udGVudERlY29kZXIgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBhd2FpdCB0aGlzLm9wdGlvbnMuY29udGVudERlY29kZXIuZGVjb2RlKGJvZHkpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGJvZHk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBhd2FpdCB0aGlzLm9wdGlvbnMuY29udGVudFR5cGVEZWNvZGVyLmRlY29kZShieXRlcywgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjayhtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNsZWFyUGFydGlhbE1lc3NhZ2VUaW1lcigpIHtcbiAgICAgICAgaWYgKHRoaXMucGFydGlhbE1lc3NhZ2VUaW1lcikge1xuICAgICAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZVRpbWVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRoaXMucGFydGlhbE1lc3NhZ2VUaW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRQYXJ0aWFsTWVzc2FnZVRpbWVyKCkge1xuICAgICAgICB0aGlzLmNsZWFyUGFydGlhbE1lc3NhZ2VUaW1lcigpO1xuICAgICAgICBpZiAodGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0IDw9IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlVGltZXIgPSAoMCwgcmFsXzEuZGVmYXVsdCkoKS50aW1lci5zZXRUaW1lb3V0KCh0b2tlbiwgdGltZW91dCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZVRpbWVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRva2VuID09PSB0aGlzLm1lc3NhZ2VUb2tlbikge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZVBhcnRpYWxNZXNzYWdlKHsgbWVzc2FnZVRva2VuOiB0b2tlbiwgd2FpdGluZ1RpbWU6IHRpbWVvdXQgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRQYXJ0aWFsTWVzc2FnZVRpbWVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dCwgdGhpcy5tZXNzYWdlVG9rZW4sIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dCk7XG4gICAgfVxufVxuZXhwb3J0cy5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXIgPSBSZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLldyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLkFic3RyYWN0TWVzc2FnZVdyaXRlciA9IGV4cG9ydHMuTWVzc2FnZVdyaXRlciA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IHNlbWFwaG9yZV8xID0gcmVxdWlyZShcIi4vc2VtYXBob3JlXCIpO1xuY29uc3QgZXZlbnRzXzEgPSByZXF1aXJlKFwiLi9ldmVudHNcIik7XG5jb25zdCBDb250ZW50TGVuZ3RoID0gJ0NvbnRlbnQtTGVuZ3RoOiAnO1xuY29uc3QgQ1JMRiA9ICdcXHJcXG4nO1xudmFyIE1lc3NhZ2VXcml0ZXI7XG4oZnVuY3Rpb24gKE1lc3NhZ2VXcml0ZXIpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgSXMuZnVuYyhjYW5kaWRhdGUuZGlzcG9zZSkgJiYgSXMuZnVuYyhjYW5kaWRhdGUub25DbG9zZSkgJiZcbiAgICAgICAgICAgIElzLmZ1bmMoY2FuZGlkYXRlLm9uRXJyb3IpICYmIElzLmZ1bmMoY2FuZGlkYXRlLndyaXRlKTtcbiAgICB9XG4gICAgTWVzc2FnZVdyaXRlci5pcyA9IGlzO1xufSkoTWVzc2FnZVdyaXRlciB8fCAoZXhwb3J0cy5NZXNzYWdlV3JpdGVyID0gTWVzc2FnZVdyaXRlciA9IHt9KSk7XG5jbGFzcyBBYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy5lcnJvckVtaXR0ZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLmNsb3NlRW1pdHRlci5kaXNwb3NlKCk7XG4gICAgfVxuICAgIGdldCBvbkVycm9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lcnJvckVtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGZpcmVFcnJvcihlcnJvciwgbWVzc2FnZSwgY291bnQpIHtcbiAgICAgICAgdGhpcy5lcnJvckVtaXR0ZXIuZmlyZShbdGhpcy5hc0Vycm9yKGVycm9yKSwgbWVzc2FnZSwgY291bnRdKTtcbiAgICB9XG4gICAgZ2V0IG9uQ2xvc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb3NlRW1pdHRlci5ldmVudDtcbiAgICB9XG4gICAgZmlyZUNsb3NlKCkge1xuICAgICAgICB0aGlzLmNsb3NlRW1pdHRlci5maXJlKHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIGFzRXJyb3IoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoYFdyaXRlciByZWNlaXZlZCBlcnJvci4gUmVhc29uOiAke0lzLnN0cmluZyhlcnJvci5tZXNzYWdlKSA/IGVycm9yLm1lc3NhZ2UgOiAndW5rbm93bid9YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLkFic3RyYWN0TWVzc2FnZVdyaXRlciA9IEFic3RyYWN0TWVzc2FnZVdyaXRlcjtcbnZhciBSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zO1xuKGZ1bmN0aW9uIChSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zKSB7XG4gICAgZnVuY3Rpb24gZnJvbU9wdGlvbnMob3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHsgY2hhcnNldDogb3B0aW9ucyA/PyAndXRmLTgnLCBjb250ZW50VHlwZUVuY29kZXI6ICgwLCByYWxfMS5kZWZhdWx0KSgpLmFwcGxpY2F0aW9uSnNvbi5lbmNvZGVyIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4geyBjaGFyc2V0OiBvcHRpb25zLmNoYXJzZXQgPz8gJ3V0Zi04JywgY29udGVudEVuY29kZXI6IG9wdGlvbnMuY29udGVudEVuY29kZXIsIGNvbnRlbnRUeXBlRW5jb2Rlcjogb3B0aW9ucy5jb250ZW50VHlwZUVuY29kZXIgPz8gKDAsIHJhbF8xLmRlZmF1bHQpKCkuYXBwbGljYXRpb25Kc29uLmVuY29kZXIgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zLmZyb21PcHRpb25zID0gZnJvbU9wdGlvbnM7XG59KShSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zIHx8IChSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zID0ge30pKTtcbmNsYXNzIFdyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKHdyaXRhYmxlLCBvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMud3JpdGFibGUgPSB3cml0YWJsZTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gUmVzb2x2ZWRNZXNzYWdlV3JpdGVyT3B0aW9ucy5mcm9tT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50ID0gMDtcbiAgICAgICAgdGhpcy53cml0ZVNlbWFwaG9yZSA9IG5ldyBzZW1hcGhvcmVfMS5TZW1hcGhvcmUoMSk7XG4gICAgICAgIHRoaXMud3JpdGFibGUub25FcnJvcigoZXJyb3IpID0+IHRoaXMuZmlyZUVycm9yKGVycm9yKSk7XG4gICAgICAgIHRoaXMud3JpdGFibGUub25DbG9zZSgoKSA9PiB0aGlzLmZpcmVDbG9zZSgpKTtcbiAgICB9XG4gICAgYXN5bmMgd3JpdGUobXNnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndyaXRlU2VtYXBob3JlLmxvY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHRoaXMub3B0aW9ucy5jb250ZW50VHlwZUVuY29kZXIuZW5jb2RlKG1zZywgdGhpcy5vcHRpb25zKS50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNvbnRlbnRFbmNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jb250ZW50RW5jb2Rlci5lbmNvZGUoYnVmZmVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZC50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJzID0gW107XG4gICAgICAgICAgICAgICAgaGVhZGVycy5wdXNoKENvbnRlbnRMZW5ndGgsIGJ1ZmZlci5ieXRlTGVuZ3RoLnRvU3RyaW5nKCksIENSTEYpO1xuICAgICAgICAgICAgICAgIGhlYWRlcnMucHVzaChDUkxGKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kb1dyaXRlKG1zZywgaGVhZGVycywgYnVmZmVyKTtcbiAgICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgZG9Xcml0ZShtc2csIGhlYWRlcnMsIGRhdGEpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMud3JpdGFibGUud3JpdGUoaGVhZGVycy5qb2luKCcnKSwgJ2FzY2lpJyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy53cml0YWJsZS53cml0ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IsIG1zZyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZUVycm9yKGVycm9yLCBtc2cpIHtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50Kys7XG4gICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yLCBtc2csIHRoaXMuZXJyb3JDb3VudCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICAgICAgdGhpcy53cml0YWJsZS5lbmQoKTtcbiAgICB9XG59XG5leHBvcnRzLldyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgPSBXcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkFic3RyYWN0TWVzc2FnZUJ1ZmZlciA9IHZvaWQgMDtcbmNvbnN0IENSID0gMTM7XG5jb25zdCBMRiA9IDEwO1xuY29uc3QgQ1JMRiA9ICdcXHJcXG4nO1xuY2xhc3MgQWJzdHJhY3RNZXNzYWdlQnVmZmVyIHtcbiAgICBjb25zdHJ1Y3RvcihlbmNvZGluZyA9ICd1dGYtOCcpIHtcbiAgICAgICAgdGhpcy5fZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgICAgICAgdGhpcy5fY2h1bmtzID0gW107XG4gICAgICAgIHRoaXMuX3RvdGFsTGVuZ3RoID0gMDtcbiAgICB9XG4gICAgZ2V0IGVuY29kaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW5jb2Rpbmc7XG4gICAgfVxuICAgIGFwcGVuZChjaHVuaykge1xuICAgICAgICBjb25zdCB0b0FwcGVuZCA9IHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZycgPyB0aGlzLmZyb21TdHJpbmcoY2h1bmssIHRoaXMuX2VuY29kaW5nKSA6IGNodW5rO1xuICAgICAgICB0aGlzLl9jaHVua3MucHVzaCh0b0FwcGVuZCk7XG4gICAgICAgIHRoaXMuX3RvdGFsTGVuZ3RoICs9IHRvQXBwZW5kLmJ5dGVMZW5ndGg7XG4gICAgfVxuICAgIHRyeVJlYWRIZWFkZXJzKGxvd2VyQ2FzZUtleXMgPSBmYWxzZSkge1xuICAgICAgICBpZiAodGhpcy5fY2h1bmtzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3RhdGUgPSAwO1xuICAgICAgICBsZXQgY2h1bmtJbmRleCA9IDA7XG4gICAgICAgIGxldCBvZmZzZXQgPSAwO1xuICAgICAgICBsZXQgY2h1bmtCeXRlc1JlYWQgPSAwO1xuICAgICAgICByb3c6IHdoaWxlIChjaHVua0luZGV4IDwgdGhpcy5fY2h1bmtzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgY2h1bmsgPSB0aGlzLl9jaHVua3NbY2h1bmtJbmRleF07XG4gICAgICAgICAgICBvZmZzZXQgPSAwO1xuICAgICAgICAgICAgY29sdW1uOiB3aGlsZSAob2Zmc2V0IDwgY2h1bmsubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjaHVua1tvZmZzZXRdO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDUjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIExGOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gNDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHJvdztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjaHVua0J5dGVzUmVhZCArPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgY2h1bmtJbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZSAhPT0gNCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgYnVmZmVyIGNvbnRhaW5zIHRoZSB0d28gQ1JMRiBhdCB0aGUgZW5kLiBTbyB3ZSB3aWxsXG4gICAgICAgIC8vIGhhdmUgdHdvIGVtcHR5IGxpbmVzIGFmdGVyIHRoZSBzcGxpdCBhdCB0aGUgZW5kIGFzIHdlbGwuXG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuX3JlYWQoY2h1bmtCeXRlc1JlYWQgKyBvZmZzZXQpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwKCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLnRvU3RyaW5nKGJ1ZmZlciwgJ2FzY2lpJykuc3BsaXQoQ1JMRik7XG4gICAgICAgIGlmIChoZWFkZXJzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXJzLmxlbmd0aCAtIDI7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaGVhZGVyID0gaGVhZGVyc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gaGVhZGVyLmluZGV4T2YoJzonKTtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1lc3NhZ2UgaGVhZGVyIG11c3Qgc2VwYXJhdGUga2V5IGFuZCB2YWx1ZSB1c2luZyAnOidcXG4ke2hlYWRlcn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGhlYWRlci5zdWJzdHIoMCwgaW5kZXgpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBoZWFkZXIuc3Vic3RyKGluZGV4ICsgMSkudHJpbSgpO1xuICAgICAgICAgICAgcmVzdWx0LnNldChsb3dlckNhc2VLZXlzID8ga2V5LnRvTG93ZXJDYXNlKCkgOiBrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICB0cnlSZWFkQm9keShsZW5ndGgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3RvdGFsTGVuZ3RoIDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkKGxlbmd0aCk7XG4gICAgfVxuICAgIGdldCBudW1iZXJPZkJ5dGVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdG90YWxMZW5ndGg7XG4gICAgfVxuICAgIF9yZWFkKGJ5dGVDb3VudCkge1xuICAgICAgICBpZiAoYnl0ZUNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbXB0eUJ1ZmZlcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChieXRlQ291bnQgPiB0aGlzLl90b3RhbExlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVhZCBzbyBtYW55IGJ5dGVzIWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jaHVua3NbMF0uYnl0ZUxlbmd0aCA9PT0gYnl0ZUNvdW50KSB7XG4gICAgICAgICAgICAvLyBzdXBlciBmYXN0IHBhdGgsIHByZWNpc2VseSBmaXJzdCBjaHVuayBtdXN0IGJlIHJldHVybmVkXG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1swXTtcbiAgICAgICAgICAgIHRoaXMuX2NodW5rcy5zaGlmdCgpO1xuICAgICAgICAgICAgdGhpcy5fdG90YWxMZW5ndGggLT0gYnl0ZUNvdW50O1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXNOYXRpdmUoY2h1bmspO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jaHVua3NbMF0uYnl0ZUxlbmd0aCA+IGJ5dGVDb3VudCkge1xuICAgICAgICAgICAgLy8gZmFzdCBwYXRoLCB0aGUgcmVhZGluZyBpcyBlbnRpcmVseSB3aXRoaW4gdGhlIGZpcnN0IGNodW5rXG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1swXTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuYXNOYXRpdmUoY2h1bmssIGJ5dGVDb3VudCk7XG4gICAgICAgICAgICB0aGlzLl9jaHVua3NbMF0gPSBjaHVuay5zbGljZShieXRlQ291bnQpO1xuICAgICAgICAgICAgdGhpcy5fdG90YWxMZW5ndGggLT0gYnl0ZUNvdW50O1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmFsbG9jTmF0aXZlKGJ5dGVDb3VudCk7XG4gICAgICAgIGxldCByZXN1bHRPZmZzZXQgPSAwO1xuICAgICAgICBsZXQgY2h1bmtJbmRleCA9IDA7XG4gICAgICAgIHdoaWxlIChieXRlQ291bnQgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1tjaHVua0luZGV4XTtcbiAgICAgICAgICAgIGlmIChjaHVuay5ieXRlTGVuZ3RoID4gYnl0ZUNvdW50KSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBjaHVuayB3aWxsIHN1cnZpdmVcbiAgICAgICAgICAgICAgICBjb25zdCBjaHVua1BhcnQgPSBjaHVuay5zbGljZSgwLCBieXRlQ291bnQpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5zZXQoY2h1bmtQYXJ0LCByZXN1bHRPZmZzZXQpO1xuICAgICAgICAgICAgICAgIHJlc3VsdE9mZnNldCArPSBieXRlQ291bnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2h1bmtzW2NodW5rSW5kZXhdID0gY2h1bmsuc2xpY2UoYnl0ZUNvdW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLl90b3RhbExlbmd0aCAtPSBieXRlQ291bnQ7XG4gICAgICAgICAgICAgICAgYnl0ZUNvdW50IC09IGJ5dGVDb3VudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHRoaXMgY2h1bmsgd2lsbCBiZSBlbnRpcmVseSByZWFkXG4gICAgICAgICAgICAgICAgcmVzdWx0LnNldChjaHVuaywgcmVzdWx0T2Zmc2V0KTtcbiAgICAgICAgICAgICAgICByZXN1bHRPZmZzZXQgKz0gY2h1bmsuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgICAgICB0aGlzLl9jaHVua3Muc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl90b3RhbExlbmd0aCAtPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgICAgIGJ5dGVDb3VudCAtPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VCdWZmZXIgPSBBYnN0cmFjdE1lc3NhZ2VCdWZmZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uID0gZXhwb3J0cy5Db25uZWN0aW9uT3B0aW9ucyA9IGV4cG9ydHMuTWVzc2FnZVN0cmF0ZWd5ID0gZXhwb3J0cy5DYW5jZWxsYXRpb25TdHJhdGVneSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gZXhwb3J0cy5JZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IGV4cG9ydHMuQ29ubmVjdGlvbkVycm9yID0gZXhwb3J0cy5Db25uZWN0aW9uRXJyb3JzID0gZXhwb3J0cy5Mb2dUcmFjZU5vdGlmaWNhdGlvbiA9IGV4cG9ydHMuU2V0VHJhY2VOb3RpZmljYXRpb24gPSBleHBvcnRzLlRyYWNlRm9ybWF0ID0gZXhwb3J0cy5UcmFjZVZhbHVlcyA9IGV4cG9ydHMuVHJhY2UgPSBleHBvcnRzLk51bGxMb2dnZXIgPSBleHBvcnRzLlByb2dyZXNzVHlwZSA9IGV4cG9ydHMuUHJvZ3Jlc3NUb2tlbiA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IG1lc3NhZ2VzXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlc1wiKTtcbmNvbnN0IGxpbmtlZE1hcF8xID0gcmVxdWlyZShcIi4vbGlua2VkTWFwXCIpO1xuY29uc3QgZXZlbnRzXzEgPSByZXF1aXJlKFwiLi9ldmVudHNcIik7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbnZhciBDYW5jZWxOb3RpZmljYXRpb247XG4oZnVuY3Rpb24gKENhbmNlbE5vdGlmaWNhdGlvbikge1xuICAgIENhbmNlbE5vdGlmaWNhdGlvbi50eXBlID0gbmV3IG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZSgnJC9jYW5jZWxSZXF1ZXN0Jyk7XG59KShDYW5jZWxOb3RpZmljYXRpb24gfHwgKENhbmNlbE5vdGlmaWNhdGlvbiA9IHt9KSk7XG52YXIgUHJvZ3Jlc3NUb2tlbjtcbihmdW5jdGlvbiAoUHJvZ3Jlc3NUb2tlbikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG4gICAgfVxuICAgIFByb2dyZXNzVG9rZW4uaXMgPSBpcztcbn0pKFByb2dyZXNzVG9rZW4gfHwgKGV4cG9ydHMuUHJvZ3Jlc3NUb2tlbiA9IFByb2dyZXNzVG9rZW4gPSB7fSkpO1xudmFyIFByb2dyZXNzTm90aWZpY2F0aW9uO1xuKGZ1bmN0aW9uIChQcm9ncmVzc05vdGlmaWNhdGlvbikge1xuICAgIFByb2dyZXNzTm90aWZpY2F0aW9uLnR5cGUgPSBuZXcgbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlKCckL3Byb2dyZXNzJyk7XG59KShQcm9ncmVzc05vdGlmaWNhdGlvbiB8fCAoUHJvZ3Jlc3NOb3RpZmljYXRpb24gPSB7fSkpO1xuY2xhc3MgUHJvZ3Jlc3NUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICB9XG59XG5leHBvcnRzLlByb2dyZXNzVHlwZSA9IFByb2dyZXNzVHlwZTtcbnZhciBTdGFyUmVxdWVzdEhhbmRsZXI7XG4oZnVuY3Rpb24gKFN0YXJSZXF1ZXN0SGFuZGxlcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBJcy5mdW5jKHZhbHVlKTtcbiAgICB9XG4gICAgU3RhclJlcXVlc3RIYW5kbGVyLmlzID0gaXM7XG59KShTdGFyUmVxdWVzdEhhbmRsZXIgfHwgKFN0YXJSZXF1ZXN0SGFuZGxlciA9IHt9KSk7XG5leHBvcnRzLk51bGxMb2dnZXIgPSBPYmplY3QuZnJlZXplKHtcbiAgICBlcnJvcjogKCkgPT4geyB9LFxuICAgIHdhcm46ICgpID0+IHsgfSxcbiAgICBpbmZvOiAoKSA9PiB7IH0sXG4gICAgbG9nOiAoKSA9PiB7IH1cbn0pO1xudmFyIFRyYWNlO1xuKGZ1bmN0aW9uIChUcmFjZSkge1xuICAgIFRyYWNlW1RyYWNlW1wiT2ZmXCJdID0gMF0gPSBcIk9mZlwiO1xuICAgIFRyYWNlW1RyYWNlW1wiTWVzc2FnZXNcIl0gPSAxXSA9IFwiTWVzc2FnZXNcIjtcbiAgICBUcmFjZVtUcmFjZVtcIkNvbXBhY3RcIl0gPSAyXSA9IFwiQ29tcGFjdFwiO1xuICAgIFRyYWNlW1RyYWNlW1wiVmVyYm9zZVwiXSA9IDNdID0gXCJWZXJib3NlXCI7XG59KShUcmFjZSB8fCAoZXhwb3J0cy5UcmFjZSA9IFRyYWNlID0ge30pKTtcbnZhciBUcmFjZVZhbHVlcztcbihmdW5jdGlvbiAoVHJhY2VWYWx1ZXMpIHtcbiAgICAvKipcbiAgICAgKiBUdXJuIHRyYWNpbmcgb2ZmLlxuICAgICAqL1xuICAgIFRyYWNlVmFsdWVzLk9mZiA9ICdvZmYnO1xuICAgIC8qKlxuICAgICAqIFRyYWNlIG1lc3NhZ2VzIG9ubHkuXG4gICAgICovXG4gICAgVHJhY2VWYWx1ZXMuTWVzc2FnZXMgPSAnbWVzc2FnZXMnO1xuICAgIC8qKlxuICAgICAqIENvbXBhY3QgbWVzc2FnZSB0cmFjaW5nLlxuICAgICAqL1xuICAgIFRyYWNlVmFsdWVzLkNvbXBhY3QgPSAnY29tcGFjdCc7XG4gICAgLyoqXG4gICAgICogVmVyYm9zZSBtZXNzYWdlIHRyYWNpbmcuXG4gICAgICovXG4gICAgVHJhY2VWYWx1ZXMuVmVyYm9zZSA9ICd2ZXJib3NlJztcbn0pKFRyYWNlVmFsdWVzIHx8IChleHBvcnRzLlRyYWNlVmFsdWVzID0gVHJhY2VWYWx1ZXMgPSB7fSkpO1xuKGZ1bmN0aW9uIChUcmFjZSkge1xuICAgIGZ1bmN0aW9uIGZyb21TdHJpbmcodmFsdWUpIHtcbiAgICAgICAgaWYgKCFJcy5zdHJpbmcodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gVHJhY2UuT2ZmO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSAnb2ZmJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gVHJhY2UuT2ZmO1xuICAgICAgICAgICAgY2FzZSAnbWVzc2FnZXMnOlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5NZXNzYWdlcztcbiAgICAgICAgICAgIGNhc2UgJ2NvbXBhY3QnOlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5Db21wYWN0O1xuICAgICAgICAgICAgY2FzZSAndmVyYm9zZSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFRyYWNlLlZlcmJvc2U7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5PZmY7XG4gICAgICAgIH1cbiAgICB9XG4gICAgVHJhY2UuZnJvbVN0cmluZyA9IGZyb21TdHJpbmc7XG4gICAgZnVuY3Rpb24gdG9TdHJpbmcodmFsdWUpIHtcbiAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5PZmY6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdvZmYnO1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5NZXNzYWdlczpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ21lc3NhZ2VzJztcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuQ29tcGFjdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2NvbXBhY3QnO1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5WZXJib3NlOlxuICAgICAgICAgICAgICAgIHJldHVybiAndmVyYm9zZSc7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAnb2ZmJztcbiAgICAgICAgfVxuICAgIH1cbiAgICBUcmFjZS50b1N0cmluZyA9IHRvU3RyaW5nO1xufSkoVHJhY2UgfHwgKGV4cG9ydHMuVHJhY2UgPSBUcmFjZSA9IHt9KSk7XG52YXIgVHJhY2VGb3JtYXQ7XG4oZnVuY3Rpb24gKFRyYWNlRm9ybWF0KSB7XG4gICAgVHJhY2VGb3JtYXRbXCJUZXh0XCJdID0gXCJ0ZXh0XCI7XG4gICAgVHJhY2VGb3JtYXRbXCJKU09OXCJdID0gXCJqc29uXCI7XG59KShUcmFjZUZvcm1hdCB8fCAoZXhwb3J0cy5UcmFjZUZvcm1hdCA9IFRyYWNlRm9ybWF0ID0ge30pKTtcbihmdW5jdGlvbiAoVHJhY2VGb3JtYXQpIHtcbiAgICBmdW5jdGlvbiBmcm9tU3RyaW5nKHZhbHVlKSB7XG4gICAgICAgIGlmICghSXMuc3RyaW5nKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIFRyYWNlRm9ybWF0LlRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAodmFsdWUgPT09ICdqc29uJykge1xuICAgICAgICAgICAgcmV0dXJuIFRyYWNlRm9ybWF0LkpTT047XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gVHJhY2VGb3JtYXQuVGV4dDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBUcmFjZUZvcm1hdC5mcm9tU3RyaW5nID0gZnJvbVN0cmluZztcbn0pKFRyYWNlRm9ybWF0IHx8IChleHBvcnRzLlRyYWNlRm9ybWF0ID0gVHJhY2VGb3JtYXQgPSB7fSkpO1xudmFyIFNldFRyYWNlTm90aWZpY2F0aW9uO1xuKGZ1bmN0aW9uIChTZXRUcmFjZU5vdGlmaWNhdGlvbikge1xuICAgIFNldFRyYWNlTm90aWZpY2F0aW9uLnR5cGUgPSBuZXcgbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlKCckL3NldFRyYWNlJyk7XG59KShTZXRUcmFjZU5vdGlmaWNhdGlvbiB8fCAoZXhwb3J0cy5TZXRUcmFjZU5vdGlmaWNhdGlvbiA9IFNldFRyYWNlTm90aWZpY2F0aW9uID0ge30pKTtcbnZhciBMb2dUcmFjZU5vdGlmaWNhdGlvbjtcbihmdW5jdGlvbiAoTG9nVHJhY2VOb3RpZmljYXRpb24pIHtcbiAgICBMb2dUcmFjZU5vdGlmaWNhdGlvbi50eXBlID0gbmV3IG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZSgnJC9sb2dUcmFjZScpO1xufSkoTG9nVHJhY2VOb3RpZmljYXRpb24gfHwgKGV4cG9ydHMuTG9nVHJhY2VOb3RpZmljYXRpb24gPSBMb2dUcmFjZU5vdGlmaWNhdGlvbiA9IHt9KSk7XG52YXIgQ29ubmVjdGlvbkVycm9ycztcbihmdW5jdGlvbiAoQ29ubmVjdGlvbkVycm9ycykge1xuICAgIC8qKlxuICAgICAqIFRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZC5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uRXJyb3JzW0Nvbm5lY3Rpb25FcnJvcnNbXCJDbG9zZWRcIl0gPSAxXSA9IFwiQ2xvc2VkXCI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gZ290IGRpc3Bvc2VkLlxuICAgICAqL1xuICAgIENvbm5lY3Rpb25FcnJvcnNbQ29ubmVjdGlvbkVycm9yc1tcIkRpc3Bvc2VkXCJdID0gMl0gPSBcIkRpc3Bvc2VkXCI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBpbiBsaXN0ZW5pbmcgbW9kZS5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uRXJyb3JzW0Nvbm5lY3Rpb25FcnJvcnNbXCJBbHJlYWR5TGlzdGVuaW5nXCJdID0gM10gPSBcIkFscmVhZHlMaXN0ZW5pbmdcIjtcbn0pKENvbm5lY3Rpb25FcnJvcnMgfHwgKGV4cG9ydHMuQ29ubmVjdGlvbkVycm9ycyA9IENvbm5lY3Rpb25FcnJvcnMgPSB7fSkpO1xuY2xhc3MgQ29ubmVjdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNvZGUsIG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBDb25uZWN0aW9uRXJyb3IucHJvdG90eXBlKTtcbiAgICB9XG59XG5leHBvcnRzLkNvbm5lY3Rpb25FcnJvciA9IENvbm5lY3Rpb25FcnJvcjtcbnZhciBDb25uZWN0aW9uU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENvbm5lY3Rpb25TdHJhdGVneSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNhbmNlbFVuZGlzcGF0Y2hlZCk7XG4gICAgfVxuICAgIENvbm5lY3Rpb25TdHJhdGVneS5pcyA9IGlzO1xufSkoQ29ubmVjdGlvblN0cmF0ZWd5IHx8IChleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IENvbm5lY3Rpb25TdHJhdGVneSA9IHt9KSk7XG52YXIgSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5O1xuKGZ1bmN0aW9uIChJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiAoY2FuZGlkYXRlLmtpbmQgPT09IHVuZGVmaW5lZCB8fCBjYW5kaWRhdGUua2luZCA9PT0gJ2lkJykgJiYgSXMuZnVuYyhjYW5kaWRhdGUuY3JlYXRlQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UpICYmIChjYW5kaWRhdGUuZGlzcG9zZSA9PT0gdW5kZWZpbmVkIHx8IElzLmZ1bmMoY2FuZGlkYXRlLmRpc3Bvc2UpKTtcbiAgICB9XG4gICAgSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzID0gaXM7XG59KShJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgfHwgKGV4cG9ydHMuSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0ge30pKTtcbnZhciBSZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneTtcbihmdW5jdGlvbiAoUmVxdWVzdENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBjYW5kaWRhdGUua2luZCA9PT0gJ3JlcXVlc3QnICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKSAmJiAoY2FuZGlkYXRlLmRpc3Bvc2UgPT09IHVuZGVmaW5lZCB8fCBJcy5mdW5jKGNhbmRpZGF0ZS5kaXNwb3NlKSk7XG4gICAgfVxuICAgIFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzID0gaXM7XG59KShSZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSB8fCAoZXhwb3J0cy5SZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0ge30pKTtcbnZhciBDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5O1xuKGZ1bmN0aW9uIChDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5NZXNzYWdlID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKF8pIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgY2FuY2VsbGF0aW9uXzEuQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UoKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kuaXModmFsdWUpIHx8IFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKHZhbHVlKTtcbiAgICB9XG4gICAgQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5pcyA9IGlzO1xufSkoQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSB8fCAoZXhwb3J0cy5DYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IHt9KSk7XG52YXIgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENhbmNlbGxhdGlvblNlbmRlclN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kuTWVzc2FnZSA9IE9iamVjdC5mcmVlemUoe1xuICAgICAgICBzZW5kQ2FuY2VsbGF0aW9uKGNvbm4sIGlkKSB7XG4gICAgICAgICAgICByZXR1cm4gY29ubi5zZW5kTm90aWZpY2F0aW9uKENhbmNlbE5vdGlmaWNhdGlvbi50eXBlLCB7IGlkIH0pO1xuICAgICAgICB9LFxuICAgICAgICBjbGVhbnVwKF8pIHsgfVxuICAgIH0pO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLnNlbmRDYW5jZWxsYXRpb24pICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNsZWFudXApO1xuICAgIH1cbiAgICBDYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneS5pcyA9IGlzO1xufSkoQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgfHwgKGV4cG9ydHMuQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgPSBDYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneSA9IHt9KSk7XG52YXIgQ2FuY2VsbGF0aW9uU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENhbmNlbGxhdGlvblN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uU3RyYXRlZ3kuTWVzc2FnZSA9IE9iamVjdC5mcmVlemUoe1xuICAgICAgICByZWNlaXZlcjogQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5NZXNzYWdlLFxuICAgICAgICBzZW5kZXI6IENhbmNlbGxhdGlvblNlbmRlclN0cmF0ZWd5Lk1lc3NhZ2VcbiAgICB9KTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKGNhbmRpZGF0ZS5yZWNlaXZlcikgJiYgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kuaXMoY2FuZGlkYXRlLnNlbmRlcik7XG4gICAgfVxuICAgIENhbmNlbGxhdGlvblN0cmF0ZWd5LmlzID0gaXM7XG59KShDYW5jZWxsYXRpb25TdHJhdGVneSB8fCAoZXhwb3J0cy5DYW5jZWxsYXRpb25TdHJhdGVneSA9IENhbmNlbGxhdGlvblN0cmF0ZWd5ID0ge30pKTtcbnZhciBNZXNzYWdlU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKE1lc3NhZ2VTdHJhdGVneSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLmhhbmRsZU1lc3NhZ2UpO1xuICAgIH1cbiAgICBNZXNzYWdlU3RyYXRlZ3kuaXMgPSBpcztcbn0pKE1lc3NhZ2VTdHJhdGVneSB8fCAoZXhwb3J0cy5NZXNzYWdlU3RyYXRlZ3kgPSBNZXNzYWdlU3RyYXRlZ3kgPSB7fSkpO1xudmFyIENvbm5lY3Rpb25PcHRpb25zO1xuKGZ1bmN0aW9uIChDb25uZWN0aW9uT3B0aW9ucykge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIChDYW5jZWxsYXRpb25TdHJhdGVneS5pcyhjYW5kaWRhdGUuY2FuY2VsbGF0aW9uU3RyYXRlZ3kpIHx8IENvbm5lY3Rpb25TdHJhdGVneS5pcyhjYW5kaWRhdGUuY29ubmVjdGlvblN0cmF0ZWd5KSB8fCBNZXNzYWdlU3RyYXRlZ3kuaXMoY2FuZGlkYXRlLm1lc3NhZ2VTdHJhdGVneSkpO1xuICAgIH1cbiAgICBDb25uZWN0aW9uT3B0aW9ucy5pcyA9IGlzO1xufSkoQ29ubmVjdGlvbk9wdGlvbnMgfHwgKGV4cG9ydHMuQ29ubmVjdGlvbk9wdGlvbnMgPSBDb25uZWN0aW9uT3B0aW9ucyA9IHt9KSk7XG52YXIgQ29ubmVjdGlvblN0YXRlO1xuKGZ1bmN0aW9uIChDb25uZWN0aW9uU3RhdGUpIHtcbiAgICBDb25uZWN0aW9uU3RhdGVbQ29ubmVjdGlvblN0YXRlW1wiTmV3XCJdID0gMV0gPSBcIk5ld1wiO1xuICAgIENvbm5lY3Rpb25TdGF0ZVtDb25uZWN0aW9uU3RhdGVbXCJMaXN0ZW5pbmdcIl0gPSAyXSA9IFwiTGlzdGVuaW5nXCI7XG4gICAgQ29ubmVjdGlvblN0YXRlW0Nvbm5lY3Rpb25TdGF0ZVtcIkNsb3NlZFwiXSA9IDNdID0gXCJDbG9zZWRcIjtcbiAgICBDb25uZWN0aW9uU3RhdGVbQ29ubmVjdGlvblN0YXRlW1wiRGlzcG9zZWRcIl0gPSA0XSA9IFwiRGlzcG9zZWRcIjtcbn0pKENvbm5lY3Rpb25TdGF0ZSB8fCAoQ29ubmVjdGlvblN0YXRlID0ge30pKTtcbmZ1bmN0aW9uIGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uKG1lc3NhZ2VSZWFkZXIsIG1lc3NhZ2VXcml0ZXIsIF9sb2dnZXIsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBsb2dnZXIgPSBfbG9nZ2VyICE9PSB1bmRlZmluZWQgPyBfbG9nZ2VyIDogZXhwb3J0cy5OdWxsTG9nZ2VyO1xuICAgIGxldCBzZXF1ZW5jZU51bWJlciA9IDA7XG4gICAgbGV0IG5vdGlmaWNhdGlvblNlcXVlbmNlTnVtYmVyID0gMDtcbiAgICBsZXQgdW5rbm93blJlc3BvbnNlU2VxdWVuY2VOdW1iZXIgPSAwO1xuICAgIGNvbnN0IHZlcnNpb24gPSAnMi4wJztcbiAgICBsZXQgc3RhclJlcXVlc3RIYW5kbGVyID0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlcXVlc3RIYW5kbGVycyA9IG5ldyBNYXAoKTtcbiAgICBsZXQgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgY29uc3Qgbm90aWZpY2F0aW9uSGFuZGxlcnMgPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgcHJvZ3Jlc3NIYW5kbGVycyA9IG5ldyBNYXAoKTtcbiAgICBsZXQgdGltZXI7XG4gICAgbGV0IG1lc3NhZ2VRdWV1ZSA9IG5ldyBsaW5rZWRNYXBfMS5MaW5rZWRNYXAoKTtcbiAgICBsZXQgcmVzcG9uc2VQcm9taXNlcyA9IG5ldyBNYXAoKTtcbiAgICBsZXQga25vd25DYW5jZWxlZFJlcXVlc3RzID0gbmV3IFNldCgpO1xuICAgIGxldCByZXF1ZXN0VG9rZW5zID0gbmV3IE1hcCgpO1xuICAgIGxldCB0cmFjZSA9IFRyYWNlLk9mZjtcbiAgICBsZXQgdHJhY2VGb3JtYXQgPSBUcmFjZUZvcm1hdC5UZXh0O1xuICAgIGxldCB0cmFjZXI7XG4gICAgbGV0IHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLk5ldztcbiAgICBjb25zdCBlcnJvckVtaXR0ZXIgPSBuZXcgZXZlbnRzXzEuRW1pdHRlcigpO1xuICAgIGNvbnN0IGNsb3NlRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgdW5oYW5kbGVkTm90aWZpY2F0aW9uRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgdW5oYW5kbGVkUHJvZ3Jlc3NFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICBjb25zdCBkaXNwb3NlRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgY2FuY2VsbGF0aW9uU3RyYXRlZ3kgPSAob3B0aW9ucyAmJiBvcHRpb25zLmNhbmNlbGxhdGlvblN0cmF0ZWd5KSA/IG9wdGlvbnMuY2FuY2VsbGF0aW9uU3RyYXRlZ3kgOiBDYW5jZWxsYXRpb25TdHJhdGVneS5NZXNzYWdlO1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlcXVlc3RRdWV1ZUtleShpZCkge1xuICAgICAgICBpZiAoaWQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuJ3Qgc2VuZCByZXF1ZXN0cyB3aXRoIGlkIG51bGwgc2luY2UgdGhlIHJlc3BvbnNlIGNhbid0IGJlIGNvcnJlbGF0ZWQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdyZXEtJyArIGlkLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlc3BvbnNlUXVldWVLZXkoaWQpIHtcbiAgICAgICAgaWYgKGlkID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3Jlcy11bmtub3duLScgKyAoKyt1bmtub3duUmVzcG9uc2VTZXF1ZW5jZU51bWJlcikudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAncmVzLScgKyBpZC50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZU5vdGlmaWNhdGlvblF1ZXVlS2V5KCkge1xuICAgICAgICByZXR1cm4gJ25vdC0nICsgKCsrbm90aWZpY2F0aW9uU2VxdWVuY2VOdW1iZXIpLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFkZE1lc3NhZ2VUb1F1ZXVlKHF1ZXVlLCBtZXNzYWdlKSB7XG4gICAgICAgIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXF1ZXN0KG1lc3NhZ2UpKSB7XG4gICAgICAgICAgICBxdWV1ZS5zZXQoY3JlYXRlUmVxdWVzdFF1ZXVlS2V5KG1lc3NhZ2UuaWQpLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXNwb25zZShtZXNzYWdlKSkge1xuICAgICAgICAgICAgcXVldWUuc2V0KGNyZWF0ZVJlc3BvbnNlUXVldWVLZXkobWVzc2FnZS5pZCksIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcXVldWUuc2V0KGNyZWF0ZU5vdGlmaWNhdGlvblF1ZXVlS2V5KCksIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNhbmNlbFVuZGlzcGF0Y2hlZChfbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0xpc3RlbmluZygpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlID09PSBDb25uZWN0aW9uU3RhdGUuTGlzdGVuaW5nO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0Nsb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlID09PSBDb25uZWN0aW9uU3RhdGUuQ2xvc2VkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0Rpc3Bvc2VkKCkge1xuICAgICAgICByZXR1cm4gc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5EaXNwb3NlZDtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2xvc2VIYW5kbGVyKCkge1xuICAgICAgICBpZiAoc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5OZXcgfHwgc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5MaXN0ZW5pbmcpIHtcbiAgICAgICAgICAgIHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLkNsb3NlZDtcbiAgICAgICAgICAgIGNsb3NlRW1pdHRlci5maXJlKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlIGNvbm5lY3Rpb24gaXMgZGlzcG9zZWQgZG9uJ3Qgc2VudCBjbG9zZSBldmVudHMuXG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlYWRFcnJvckhhbmRsZXIoZXJyb3IpIHtcbiAgICAgICAgZXJyb3JFbWl0dGVyLmZpcmUoW2Vycm9yLCB1bmRlZmluZWQsIHVuZGVmaW5lZF0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiB3cml0ZUVycm9ySGFuZGxlcihkYXRhKSB7XG4gICAgICAgIGVycm9yRW1pdHRlci5maXJlKGRhdGEpO1xuICAgIH1cbiAgICBtZXNzYWdlUmVhZGVyLm9uQ2xvc2UoY2xvc2VIYW5kbGVyKTtcbiAgICBtZXNzYWdlUmVhZGVyLm9uRXJyb3IocmVhZEVycm9ySGFuZGxlcik7XG4gICAgbWVzc2FnZVdyaXRlci5vbkNsb3NlKGNsb3NlSGFuZGxlcik7XG4gICAgbWVzc2FnZVdyaXRlci5vbkVycm9yKHdyaXRlRXJyb3JIYW5kbGVyKTtcbiAgICBmdW5jdGlvbiB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCkge1xuICAgICAgICBpZiAodGltZXIgfHwgbWVzc2FnZVF1ZXVlLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aW1lciA9ICgwLCByYWxfMS5kZWZhdWx0KSgpLnRpbWVyLnNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICAgICAgICB0aW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHByb2Nlc3NNZXNzYWdlUXVldWUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGhhbmRsZU1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICBpZiAobWVzc2FnZXNfMS5NZXNzYWdlLmlzUmVxdWVzdChtZXNzYWdlKSkge1xuICAgICAgICAgICAgaGFuZGxlUmVxdWVzdChtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNOb3RpZmljYXRpb24obWVzc2FnZSkpIHtcbiAgICAgICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvbihtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXNwb25zZShtZXNzYWdlKSkge1xuICAgICAgICAgICAgaGFuZGxlUmVzcG9uc2UobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBoYW5kbGVJbnZhbGlkTWVzc2FnZShtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBwcm9jZXNzTWVzc2FnZVF1ZXVlKCkge1xuICAgICAgICBpZiAobWVzc2FnZVF1ZXVlLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXNzYWdlID0gbWVzc2FnZVF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlU3RyYXRlZ3kgPSBvcHRpb25zPy5tZXNzYWdlU3RyYXRlZ3k7XG4gICAgICAgICAgICBpZiAoTWVzc2FnZVN0cmF0ZWd5LmlzKG1lc3NhZ2VTdHJhdGVneSkpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlU3RyYXRlZ3kuaGFuZGxlTWVzc2FnZShtZXNzYWdlLCBoYW5kbGVNZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGhhbmRsZU1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgY2FsbGJhY2sgPSAobWVzc2FnZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2UgaGF2ZSByZWNlaXZlZCBhIGNhbmNlbGxhdGlvbiBtZXNzYWdlLiBDaGVjayBpZiB0aGUgbWVzc2FnZSBpcyBzdGlsbCBpbiB0aGUgcXVldWVcbiAgICAgICAgICAgIC8vIGFuZCBjYW5jZWwgaXQgaWYgYWxsb3dlZCB0byBkbyBzby5cbiAgICAgICAgICAgIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNOb3RpZmljYXRpb24obWVzc2FnZSkgJiYgbWVzc2FnZS5tZXRob2QgPT09IENhbmNlbE5vdGlmaWNhdGlvbi50eXBlLm1ldGhvZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbmNlbElkID0gbWVzc2FnZS5wYXJhbXMuaWQ7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gY3JlYXRlUmVxdWVzdFF1ZXVlS2V5KGNhbmNlbElkKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0b0NhbmNlbCA9IG1lc3NhZ2VRdWV1ZS5nZXQoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZXNfMS5NZXNzYWdlLmlzUmVxdWVzdCh0b0NhbmNlbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyYXRlZ3kgPSBvcHRpb25zPy5jb25uZWN0aW9uU3RyYXRlZ3k7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gKHN0cmF0ZWd5ICYmIHN0cmF0ZWd5LmNhbmNlbFVuZGlzcGF0Y2hlZCkgPyBzdHJhdGVneS5jYW5jZWxVbmRpc3BhdGNoZWQodG9DYW5jZWwsIGNhbmNlbFVuZGlzcGF0Y2hlZCkgOiBjYW5jZWxVbmRpc3BhdGNoZWQodG9DYW5jZWwpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgJiYgKHJlc3BvbnNlLmVycm9yICE9PSB1bmRlZmluZWQgfHwgcmVzcG9uc2UucmVzdWx0ICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUXVldWUuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLmRlbGV0ZShjYW5jZWxJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5pZCA9IHRvQ2FuY2VsLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VTZW5kaW5nUmVzcG9uc2UocmVzcG9uc2UsIG1lc3NhZ2UubWV0aG9kLCBEYXRlLm5vdygpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUocmVzcG9uc2UpLmNhdGNoKCgpID0+IGxvZ2dlci5lcnJvcihgU2VuZGluZyByZXNwb25zZSBmb3IgY2FuY2VsZWQgbWVzc2FnZSBmYWlsZWQuYCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGNhbmNlbGxhdGlvblRva2VuID0gcmVxdWVzdFRva2Vucy5nZXQoY2FuY2VsSWQpO1xuICAgICAgICAgICAgICAgIC8vIFRoZSByZXF1ZXN0IGlzIGFscmVhZHkgcnVubmluZy4gQ2FuY2VsIHRoZSB0b2tlblxuICAgICAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbmNlbGxhdGlvblRva2VuLmNhbmNlbCgpO1xuICAgICAgICAgICAgICAgICAgICB0cmFjZVJlY2VpdmVkTm90aWZpY2F0aW9uKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZW1lbWJlciB0aGUgY2FuY2VsIGJ1dCBzdGlsbCBxdWV1ZSB0aGUgbWVzc2FnZSB0b1xuICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbiB1cCBzdGF0ZSBpbiBwcm9jZXNzIG1lc3NhZ2UuXG4gICAgICAgICAgICAgICAgICAgIGtub3duQ2FuY2VsZWRSZXF1ZXN0cy5hZGQoY2FuY2VsSWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFkZE1lc3NhZ2VUb1F1ZXVlKG1lc3NhZ2VRdWV1ZSwgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGZ1bmN0aW9uIGhhbmRsZVJlcXVlc3QocmVxdWVzdE1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgLy8gd2UgcmV0dXJuIGhlcmUgc2lsZW50bHkgc2luY2Ugd2UgZmlyZWQgYW4gZXZlbnQgd2hlbiB0aGVcbiAgICAgICAgICAgIC8vIGNvbm5lY3Rpb24gZ290IGRpc3Bvc2VkLlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHJlcGx5KHJlc3VsdE9yRXJyb3IsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgaWQ6IHJlcXVlc3RNZXNzYWdlLmlkXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKHJlc3VsdE9yRXJyb3IgaW5zdGFuY2VvZiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlLmVycm9yID0gcmVzdWx0T3JFcnJvci50b0pzb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVzdWx0ID0gcmVzdWx0T3JFcnJvciA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHJlc3VsdE9yRXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cmFjZVNlbmRpbmdSZXNwb25zZShtZXNzYWdlLCBtZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICBtZXNzYWdlV3JpdGVyLndyaXRlKG1lc3NhZ2UpLmNhdGNoKCgpID0+IGxvZ2dlci5lcnJvcihgU2VuZGluZyByZXNwb25zZSBmYWlsZWQuYCkpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHJlcGx5RXJyb3IoZXJyb3IsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgaWQ6IHJlcXVlc3RNZXNzYWdlLmlkLFxuICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvci50b0pzb24oKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUobWVzc2FnZSkuY2F0Y2goKCkgPT4gbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlc3BvbnNlIGZhaWxlZC5gKSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gcmVwbHlTdWNjZXNzKHJlc3VsdCwgbWV0aG9kLCBzdGFydFRpbWUpIHtcbiAgICAgICAgICAgIC8vIFRoZSBKU09OIFJQQyBkZWZpbmVzIHRoYXQgYSByZXNwb25zZSBtdXN0IGVpdGhlciBoYXZlIGEgcmVzdWx0IG9yIGFuIGVycm9yXG4gICAgICAgICAgICAvLyBTbyB3ZSBjYW4ndCB0cmVhdCB1bmRlZmluZWQgYXMgYSB2YWxpZCByZXNwb25zZSByZXN1bHQuXG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgICAgICAgICAgICBqc29ucnBjOiB2ZXJzaW9uLFxuICAgICAgICAgICAgICAgIGlkOiByZXF1ZXN0TWVzc2FnZS5pZCxcbiAgICAgICAgICAgICAgICByZXN1bHQ6IHJlc3VsdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUobWVzc2FnZSkuY2F0Y2goKCkgPT4gbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlc3BvbnNlIGZhaWxlZC5gKSk7XG4gICAgICAgIH1cbiAgICAgICAgdHJhY2VSZWNlaXZlZFJlcXVlc3QocmVxdWVzdE1lc3NhZ2UpO1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gcmVxdWVzdEhhbmRsZXJzLmdldChyZXF1ZXN0TWVzc2FnZS5tZXRob2QpO1xuICAgICAgICBsZXQgdHlwZTtcbiAgICAgICAgbGV0IHJlcXVlc3RIYW5kbGVyO1xuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgdHlwZSA9IGVsZW1lbnQudHlwZTtcbiAgICAgICAgICAgIHJlcXVlc3RIYW5kbGVyID0gZWxlbWVudC5oYW5kbGVyO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIGlmIChyZXF1ZXN0SGFuZGxlciB8fCBzdGFyUmVxdWVzdEhhbmRsZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHRva2VuS2V5ID0gcmVxdWVzdE1lc3NhZ2UuaWQgPz8gU3RyaW5nKERhdGUubm93KCkpOyAvL1xuICAgICAgICAgICAgY29uc3QgY2FuY2VsbGF0aW9uU291cmNlID0gSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKGNhbmNlbGxhdGlvblN0cmF0ZWd5LnJlY2VpdmVyKVxuICAgICAgICAgICAgICAgID8gY2FuY2VsbGF0aW9uU3RyYXRlZ3kucmVjZWl2ZXIuY3JlYXRlQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UodG9rZW5LZXkpXG4gICAgICAgICAgICAgICAgOiBjYW5jZWxsYXRpb25TdHJhdGVneS5yZWNlaXZlci5jcmVhdGVDYW5jZWxsYXRpb25Ub2tlblNvdXJjZShyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICBpZiAocmVxdWVzdE1lc3NhZ2UuaWQgIT09IG51bGwgJiYga25vd25DYW5jZWxlZFJlcXVlc3RzLmhhcyhyZXF1ZXN0TWVzc2FnZS5pZCkpIHtcbiAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25Tb3VyY2UuY2FuY2VsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVxdWVzdE1lc3NhZ2UuaWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLnNldCh0b2tlbktleSwgY2FuY2VsbGF0aW9uU291cmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IGhhbmRsZXJSZXN1bHQ7XG4gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0TWVzc2FnZS5wYXJhbXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlLm51bWJlck9mUGFyYW1zICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1zLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyAke3R5cGUubnVtYmVyT2ZQYXJhbXN9IHBhcmFtcyBidXQgcmVjZWl2ZWQgbm9uZS5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJSZXN1bHQgPSByZXF1ZXN0SGFuZGxlcihjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVxdWVzdE1lc3NhZ2UucGFyYW1zKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlLnBhcmFtZXRlclN0cnVjdHVyZXMgPT09IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseUVycm9yKG5ldyBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IobWVzc2FnZXNfMS5FcnJvckNvZGVzLkludmFsaWRQYXJhbXMsIGBSZXF1ZXN0ICR7cmVxdWVzdE1lc3NhZ2UubWV0aG9kfSBkZWZpbmVzIHBhcmFtZXRlcnMgYnkgbmFtZSBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBwb3NpdGlvbmApLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlclJlc3VsdCA9IHJlcXVlc3RIYW5kbGVyKC4uLnJlcXVlc3RNZXNzYWdlLnBhcmFtcywgY2FuY2VsbGF0aW9uU291cmNlLnRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS5wYXJhbWV0ZXJTdHJ1Y3R1cmVzID09PSBtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW52YWxpZFBhcmFtcywgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGRlZmluZXMgcGFyYW1ldGVycyBieSBwb3NpdGlvbiBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBuYW1lYCksIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gcmVxdWVzdEhhbmRsZXIocmVxdWVzdE1lc3NhZ2UucGFyYW1zLCBjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0YXJSZXF1ZXN0SGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gc3RhclJlcXVlc3RIYW5kbGVyKHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgcmVxdWVzdE1lc3NhZ2UucGFyYW1zLCBjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBwcm9taXNlID0gaGFuZGxlclJlc3VsdDtcbiAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZXJSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFRva2Vucy5kZWxldGUodG9rZW5LZXkpO1xuICAgICAgICAgICAgICAgICAgICByZXBseVN1Y2Nlc3MoaGFuZGxlclJlc3VsdCwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwcm9taXNlLnRoZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS50aGVuKChyZXN1bHRPckVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLmRlbGV0ZSh0b2tlbktleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXBseShyZXN1bHRPckVycm9yLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IoZXJyb3IsIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVycm9yICYmIElzLnN0cmluZyhlcnJvci5tZXNzYWdlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGZhaWxlZCB3aXRoIG1lc3NhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZmFpbGVkIHVuZXhwZWN0ZWRseSB3aXRob3V0IHByb3ZpZGluZyBhbnkgZGV0YWlscy5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHkoaGFuZGxlclJlc3VsdCwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHkoZXJyb3IsIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZXJyb3IgJiYgSXMuc3RyaW5nKGVycm9yLm1lc3NhZ2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGZhaWxlZCB3aXRoIG1lc3NhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZmFpbGVkIHVuZXhwZWN0ZWRseSB3aXRob3V0IHByb3ZpZGluZyBhbnkgZGV0YWlscy5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuTWV0aG9kTm90Rm91bmQsIGBVbmhhbmRsZWQgbWV0aG9kICR7cmVxdWVzdE1lc3NhZ2UubWV0aG9kfWApLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlUmVzcG9uc2UocmVzcG9uc2VNZXNzYWdlKSB7XG4gICAgICAgIGlmIChpc0Rpc3Bvc2VkKCkpIHtcbiAgICAgICAgICAgIC8vIFNlZSBoYW5kbGUgcmVxdWVzdC5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzcG9uc2VNZXNzYWdlLmlkID09PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VNZXNzYWdlLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBSZWNlaXZlZCByZXNwb25zZSBtZXNzYWdlIHdpdGhvdXQgaWQ6IEVycm9yIGlzOiBcXG4ke0pTT04uc3RyaW5naWZ5KHJlc3BvbnNlTWVzc2FnZS5lcnJvciwgdW5kZWZpbmVkLCA0KX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgUmVjZWl2ZWQgcmVzcG9uc2UgbWVzc2FnZSB3aXRob3V0IGlkLiBObyBmdXJ0aGVyIGVycm9yIGluZm9ybWF0aW9uIHByb3ZpZGVkLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gcmVzcG9uc2VNZXNzYWdlLmlkO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VQcm9taXNlID0gcmVzcG9uc2VQcm9taXNlcy5nZXQoa2V5KTtcbiAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWRSZXNwb25zZShyZXNwb25zZU1lc3NhZ2UsIHJlc3BvbnNlUHJvbWlzZSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VQcm9taXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2VzLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZU1lc3NhZ2UuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gcmVzcG9uc2VNZXNzYWdlLmVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlLnJlamVjdChuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKGVycm9yLmNvZGUsIGVycm9yLm1lc3NhZ2UsIGVycm9yLmRhdGEpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXNwb25zZU1lc3NhZ2UucmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlTWVzc2FnZS5yZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgbmV2ZXIgaGFwcGVuLicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IubWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBSZXNwb25zZSBoYW5kbGVyICcke3Jlc3BvbnNlUHJvbWlzZS5tZXRob2R9JyBmYWlsZWQgd2l0aCBtZXNzYWdlOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYFJlc3BvbnNlIGhhbmRsZXIgJyR7cmVzcG9uc2VQcm9taXNlLm1ldGhvZH0nIGZhaWxlZCB1bmV4cGVjdGVkbHkuYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlTm90aWZpY2F0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgLy8gU2VlIGhhbmRsZSByZXF1ZXN0LlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0eXBlID0gdW5kZWZpbmVkO1xuICAgICAgICBsZXQgbm90aWZpY2F0aW9uSGFuZGxlcjtcbiAgICAgICAgaWYgKG1lc3NhZ2UubWV0aG9kID09PSBDYW5jZWxOb3RpZmljYXRpb24udHlwZS5tZXRob2QpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhbmNlbElkID0gbWVzc2FnZS5wYXJhbXMuaWQ7XG4gICAgICAgICAgICBrbm93bkNhbmNlbGVkUmVxdWVzdHMuZGVsZXRlKGNhbmNlbElkKTtcbiAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWROb3RpZmljYXRpb24obWVzc2FnZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gbm90aWZpY2F0aW9uSGFuZGxlcnMuZ2V0KG1lc3NhZ2UubWV0aG9kKTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uSGFuZGxlciA9IGVsZW1lbnQuaGFuZGxlcjtcbiAgICAgICAgICAgICAgICB0eXBlID0gZWxlbWVudC50eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChub3RpZmljYXRpb25IYW5kbGVyIHx8IHN0YXJOb3RpZmljYXRpb25IYW5kbGVyKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWROb3RpZmljYXRpb24obWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgaWYgKG5vdGlmaWNhdGlvbkhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UucGFyYW1zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5udW1iZXJPZlBhcmFtcyAhPT0gMCAmJiB0eXBlLnBhcmFtZXRlclN0cnVjdHVyZXMgIT09IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBOb3RpZmljYXRpb24gJHttZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyAke3R5cGUubnVtYmVyT2ZQYXJhbXN9IHBhcmFtcyBidXQgcmVjZWl2ZWQgbm9uZS5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShtZXNzYWdlLnBhcmFtcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGFyZSBKU09OLVJQQyBsaWJyYXJpZXMgdGhhdCBzZW5kIHByb2dyZXNzIG1lc3NhZ2UgYXMgcG9zaXRpb25hbCBwYXJhbXMgYWx0aG91Z2hcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpZmllZCBhcyBuYW1lZC4gU28gY29udmVydCB0aGVtIGlmIHRoaXMgaXMgdGhlIGNhc2UuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBtZXNzYWdlLnBhcmFtcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLm1ldGhvZCA9PT0gUHJvZ3Jlc3NOb3RpZmljYXRpb24udHlwZS5tZXRob2QgJiYgcGFyYW1zLmxlbmd0aCA9PT0gMiAmJiBQcm9ncmVzc1Rva2VuLmlzKHBhcmFtc1swXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKHsgdG9rZW46IHBhcmFtc1swXSwgdmFsdWU6IHBhcmFtc1sxXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUucGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBOb3RpZmljYXRpb24gJHttZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyBwYXJhbWV0ZXJzIGJ5IG5hbWUgYnV0IHJlY2VpdmVkIHBhcmFtZXRlcnMgYnkgcG9zaXRpb25gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5udW1iZXJPZlBhcmFtcyAhPT0gbWVzc2FnZS5wYXJhbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYE5vdGlmaWNhdGlvbiAke21lc3NhZ2UubWV0aG9kfSBkZWZpbmVzICR7dHlwZS5udW1iZXJPZlBhcmFtc30gcGFyYW1zIGJ1dCByZWNlaXZlZCAke3BhcmFtcy5sZW5ndGh9IGFyZ3VtZW50c2ApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXIoLi4ucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS5wYXJhbWV0ZXJTdHJ1Y3R1cmVzID09PSBtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgTm90aWZpY2F0aW9uICR7bWVzc2FnZS5tZXRob2R9IGRlZmluZXMgcGFyYW1ldGVycyBieSBwb3NpdGlvbiBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBuYW1lYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKG1lc3NhZ2UucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGFyTm90aWZpY2F0aW9uSGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICBzdGFyTm90aWZpY2F0aW9uSGFuZGxlcihtZXNzYWdlLm1ldGhvZCwgbWVzc2FnZS5wYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvci5tZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgTm90aWZpY2F0aW9uIGhhbmRsZXIgJyR7bWVzc2FnZS5tZXRob2R9JyBmYWlsZWQgd2l0aCBtZXNzYWdlOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYE5vdGlmaWNhdGlvbiBoYW5kbGVyICcke21lc3NhZ2UubWV0aG9kfScgZmFpbGVkIHVuZXhwZWN0ZWRseS5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1bmhhbmRsZWROb3RpZmljYXRpb25FbWl0dGVyLmZpcmUobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlSW52YWxpZE1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignUmVjZWl2ZWQgZW1wdHkgbWVzc2FnZS4nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsb2dnZXIuZXJyb3IoYFJlY2VpdmVkIG1lc3NhZ2Ugd2hpY2ggaXMgbmVpdGhlciBhIHJlc3BvbnNlIG5vciBhIG5vdGlmaWNhdGlvbiBtZXNzYWdlOlxcbiR7SlNPTi5zdHJpbmdpZnkobWVzc2FnZSwgbnVsbCwgNCl9YCk7XG4gICAgICAgIC8vIFRlc3Qgd2hldGhlciB3ZSBmaW5kIGFuIGlkIHRvIHJlamVjdCB0aGUgcHJvbWlzZVxuICAgICAgICBjb25zdCByZXNwb25zZU1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICBpZiAoSXMuc3RyaW5nKHJlc3BvbnNlTWVzc2FnZS5pZCkgfHwgSXMubnVtYmVyKHJlc3BvbnNlTWVzc2FnZS5pZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHJlc3BvbnNlTWVzc2FnZS5pZDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxlciA9IHJlc3BvbnNlUHJvbWlzZXMuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VIYW5kbGVyLnJlamVjdChuZXcgRXJyb3IoJ1RoZSByZWNlaXZlZCByZXNwb25zZSBoYXMgbmVpdGhlciBhIHJlc3VsdCBub3IgYW4gZXJyb3IgcHJvcGVydHkuJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0cmluZ2lmeVRyYWNlKHBhcmFtcykge1xuICAgICAgICBpZiAocGFyYW1zID09PSB1bmRlZmluZWQgfHwgcGFyYW1zID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAodHJhY2UpIHtcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuVmVyYm9zZTpcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGFyYW1zLCBudWxsLCA0KTtcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuQ29tcGFjdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGFyYW1zKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVNlbmRpbmdSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFjZUZvcm1hdCA9PT0gVHJhY2VGb3JtYXQuVGV4dCkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSAmJiBtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBgUGFyYW1zOiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucGFyYW1zKX1cXG5cXG5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJhY2VyLmxvZyhgU2VuZGluZyByZXF1ZXN0ICcke21lc3NhZ2UubWV0aG9kfSAtICgke21lc3NhZ2UuaWR9KScuYCwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb2dMU1BNZXNzYWdlKCdzZW5kLXJlcXVlc3QnLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVNlbmRpbmdOb3RpZmljYXRpb24obWVzc2FnZSkge1xuICAgICAgICBpZiAodHJhY2UgPT09IFRyYWNlLk9mZiB8fCAhdHJhY2VyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYWNlRm9ybWF0ID09PSBUcmFjZUZvcm1hdC5UZXh0KSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdCkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0gYFBhcmFtczogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLnBhcmFtcyl9XFxuXFxuYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSAnTm8gcGFyYW1ldGVycyBwcm92aWRlZC5cXG5cXG4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFNlbmRpbmcgbm90aWZpY2F0aW9uICcke21lc3NhZ2UubWV0aG9kfScuYCwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb2dMU1BNZXNzYWdlKCdzZW5kLW5vdGlmaWNhdGlvbicsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhY2VGb3JtYXQgPT09IFRyYWNlRm9ybWF0LlRleHQpIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZXJyb3IgJiYgbWVzc2FnZS5lcnJvci5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgRXJyb3IgZGF0YTogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLmVycm9yLmRhdGEpfVxcblxcbmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgUmVzdWx0OiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucmVzdWx0KX1cXG5cXG5gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UuZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9ICdObyByZXN1bHQgcmV0dXJuZWQuXFxuXFxuJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFNlbmRpbmcgcmVzcG9uc2UgJyR7bWV0aG9kfSAtICgke21lc3NhZ2UuaWR9KScuIFByb2Nlc3NpbmcgcmVxdWVzdCB0b29rICR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1tc2AsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgnc2VuZC1yZXNwb25zZScsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYWNlUmVjZWl2ZWRSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFjZUZvcm1hdCA9PT0gVHJhY2VGb3JtYXQuVGV4dCkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSAmJiBtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBgUGFyYW1zOiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucGFyYW1zKX1cXG5cXG5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJhY2VyLmxvZyhgUmVjZWl2ZWQgcmVxdWVzdCAnJHttZXNzYWdlLm1ldGhvZH0gLSAoJHttZXNzYWdlLmlkfSknLmAsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1yZXF1ZXN0JywgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdHJhY2VSZWNlaXZlZE5vdGlmaWNhdGlvbihtZXNzYWdlKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIgfHwgbWVzc2FnZS5tZXRob2QgPT09IExvZ1RyYWNlTm90aWZpY2F0aW9uLnR5cGUubWV0aG9kKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYWNlRm9ybWF0ID09PSBUcmFjZUZvcm1hdC5UZXh0KSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdCkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0gYFBhcmFtczogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLnBhcmFtcyl9XFxuXFxuYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSAnTm8gcGFyYW1ldGVycyBwcm92aWRlZC5cXG5cXG4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFJlY2VpdmVkIG5vdGlmaWNhdGlvbiAnJHttZXNzYWdlLm1ldGhvZH0nLmAsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1ub3RpZmljYXRpb24nLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVJlY2VpdmVkUmVzcG9uc2UobWVzc2FnZSwgcmVzcG9uc2VQcm9taXNlKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhY2VGb3JtYXQgPT09IFRyYWNlRm9ybWF0LlRleHQpIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZXJyb3IgJiYgbWVzc2FnZS5lcnJvci5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgRXJyb3IgZGF0YTogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLmVycm9yLmRhdGEpfVxcblxcbmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgUmVzdWx0OiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucmVzdWx0KX1cXG5cXG5gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UuZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9ICdObyByZXN1bHQgcmV0dXJuZWQuXFxuXFxuJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXNwb25zZVByb21pc2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IG1lc3NhZ2UuZXJyb3IgPyBgIFJlcXVlc3QgZmFpbGVkOiAke21lc3NhZ2UuZXJyb3IubWVzc2FnZX0gKCR7bWVzc2FnZS5lcnJvci5jb2RlfSkuYCA6ICcnO1xuICAgICAgICAgICAgICAgIHRyYWNlci5sb2coYFJlY2VpdmVkIHJlc3BvbnNlICcke3Jlc3BvbnNlUHJvbWlzZS5tZXRob2R9IC0gKCR7bWVzc2FnZS5pZH0pJyBpbiAke0RhdGUubm93KCkgLSByZXNwb25zZVByb21pc2UudGltZXJTdGFydH1tcy4ke2Vycm9yfWAsIGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJhY2VyLmxvZyhgUmVjZWl2ZWQgcmVzcG9uc2UgJHttZXNzYWdlLmlkfSB3aXRob3V0IGFjdGl2ZSByZXNwb25zZSBwcm9taXNlLmAsIGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1yZXNwb25zZScsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGxvZ0xTUE1lc3NhZ2UodHlwZSwgbWVzc2FnZSkge1xuICAgICAgICBpZiAoIXRyYWNlciB8fCB0cmFjZSA9PT0gVHJhY2UuT2ZmKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbHNwTWVzc2FnZSA9IHtcbiAgICAgICAgICAgIGlzTFNQTWVzc2FnZTogdHJ1ZSxcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpXG4gICAgICAgIH07XG4gICAgICAgIHRyYWNlci5sb2cobHNwTWVzc2FnZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRocm93SWZDbG9zZWRPckRpc3Bvc2VkKCkge1xuICAgICAgICBpZiAoaXNDbG9zZWQoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IENvbm5lY3Rpb25FcnJvcihDb25uZWN0aW9uRXJyb3JzLkNsb3NlZCwgJ0Nvbm5lY3Rpb24gaXMgY2xvc2VkLicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0Rpc3Bvc2VkKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb25uZWN0aW9uRXJyb3IoQ29ubmVjdGlvbkVycm9ycy5EaXNwb3NlZCwgJ0Nvbm5lY3Rpb24gaXMgZGlzcG9zZWQuJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdGhyb3dJZkxpc3RlbmluZygpIHtcbiAgICAgICAgaWYgKGlzTGlzdGVuaW5nKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb25uZWN0aW9uRXJyb3IoQ29ubmVjdGlvbkVycm9ycy5BbHJlYWR5TGlzdGVuaW5nLCAnQ29ubmVjdGlvbiBpcyBhbHJlYWR5IGxpc3RlbmluZycpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRocm93SWZOb3RMaXN0ZW5pbmcoKSB7XG4gICAgICAgIGlmICghaXNMaXN0ZW5pbmcoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYWxsIGxpc3RlbigpIGZpcnN0LicpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVuZGVmaW5lZFRvTnVsbChwYXJhbSkge1xuICAgICAgICBpZiAocGFyYW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyYW07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gbnVsbFRvVW5kZWZpbmVkKHBhcmFtKSB7XG4gICAgICAgIGlmIChwYXJhbSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJhbTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBpc05hbWVkUGFyYW0ocGFyYW0pIHtcbiAgICAgICAgcmV0dXJuIHBhcmFtICE9PSB1bmRlZmluZWQgJiYgcGFyYW0gIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkocGFyYW0pICYmIHR5cGVvZiBwYXJhbSA9PT0gJ29iamVjdCc7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXB1dGVTaW5nbGVQYXJhbShwYXJhbWV0ZXJTdHJ1Y3R1cmVzLCBwYXJhbSkge1xuICAgICAgICBzd2l0Y2ggKHBhcmFtZXRlclN0cnVjdHVyZXMpIHtcbiAgICAgICAgICAgIGNhc2UgbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG86XG4gICAgICAgICAgICAgICAgaWYgKGlzTmFtZWRQYXJhbShwYXJhbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxUb1VuZGVmaW5lZChwYXJhbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3VuZGVmaW5lZFRvTnVsbChwYXJhbSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZTpcbiAgICAgICAgICAgICAgICBpZiAoIWlzTmFtZWRQYXJhbShwYXJhbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWNlaXZlZCBwYXJhbWV0ZXJzIGJ5IG5hbWUgYnV0IHBhcmFtIGlzIG5vdCBhbiBvYmplY3QgbGl0ZXJhbC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGxUb1VuZGVmaW5lZChwYXJhbSk7XG4gICAgICAgICAgICBjYXNlIG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieVBvc2l0aW9uOlxuICAgICAgICAgICAgICAgIHJldHVybiBbdW5kZWZpbmVkVG9OdWxsKHBhcmFtKV07XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBwYXJhbWV0ZXIgc3RydWN0dXJlICR7cGFyYW1ldGVyU3RydWN0dXJlcy50b1N0cmluZygpfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXB1dGVNZXNzYWdlUGFyYW1zKHR5cGUsIHBhcmFtcykge1xuICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICBjb25zdCBudW1iZXJPZlBhcmFtcyA9IHR5cGUubnVtYmVyT2ZQYXJhbXM7XG4gICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gY29tcHV0ZVNpbmdsZVBhcmFtKHR5cGUucGFyYW1ldGVyU3RydWN0dXJlcywgcGFyYW1zWzBdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoICYmIGkgPCBudW1iZXJPZlBhcmFtczsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHVuZGVmaW5lZFRvTnVsbChwYXJhbXNbaV0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPCBudW1iZXJPZlBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gcGFyYW1zLmxlbmd0aDsgaSA8IG51bWJlck9mUGFyYW1zOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB7XG4gICAgICAgIHNlbmROb3RpZmljYXRpb246ICh0eXBlLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlUGFyYW1zO1xuICAgICAgICAgICAgaWYgKElzLnN0cmluZyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICAgIGxldCBwYXJhbVN0YXJ0ID0gMDtcbiAgICAgICAgICAgICAgICBsZXQgcGFyYW1ldGVyU3RydWN0dXJlcyA9IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvO1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuaXMoZmlyc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtU3RhcnQgPSAxO1xuICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gZmlyc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBwYXJhbUVuZCA9IGFyZ3MubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gcGFyYW1FbmQgLSBwYXJhbVN0YXJ0O1xuICAgICAgICAgICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zID0gY29tcHV0ZVNpbmdsZVBhcmFtKHBhcmFtZXRlclN0cnVjdHVyZXMsIGFyZ3NbcGFyYW1TdGFydF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjZWl2ZWQgJHtudW1iZXJPZlBhcmFtc30gcGFyYW1ldGVycyBmb3IgJ2J5IE5hbWUnIG5vdGlmaWNhdGlvbiBwYXJhbWV0ZXIgc3RydWN0dXJlLmApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IGFyZ3Muc2xpY2UocGFyYW1TdGFydCwgcGFyYW1FbmQpLm1hcCh2YWx1ZSA9PiB1bmRlZmluZWRUb051bGwodmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IGFyZ3M7XG4gICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZS5tZXRob2Q7XG4gICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IGNvbXB1dGVNZXNzYWdlUGFyYW1zKHR5cGUsIHBhcmFtcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBub3RpZmljYXRpb25NZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBtZXNzYWdlUGFyYW1zXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdHJhY2VTZW5kaW5nTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbk1lc3NhZ2UpO1xuICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2VXcml0ZXIud3JpdGUobm90aWZpY2F0aW9uTWVzc2FnZSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBTZW5kaW5nIG5vdGlmaWNhdGlvbiBmYWlsZWQuYCk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25Ob3RpZmljYXRpb246ICh0eXBlLCBoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGlmIChJcy5mdW5jKHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB0eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaGFuZGxlcikge1xuICAgICAgICAgICAgICAgIGlmIChJcy5zdHJpbmcodHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZTtcbiAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uSGFuZGxlcnMuc2V0KHR5cGUsIHsgdHlwZTogdW5kZWZpbmVkLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZS5tZXRob2Q7XG4gICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXJzLnNldCh0eXBlLm1ldGhvZCwgeyB0eXBlLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXJzLmRlbGV0ZShtZXRob2QpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBvblByb2dyZXNzOiAoX3R5cGUsIHRva2VuLCBoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgICBpZiAocHJvZ3Jlc3NIYW5kbGVycy5oYXModG9rZW4pKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm9ncmVzcyBoYW5kbGVyIGZvciB0b2tlbiAke3Rva2VufSBhbHJlYWR5IHJlZ2lzdGVyZWRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByb2dyZXNzSGFuZGxlcnMuc2V0KHRva2VuLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc0hhbmRsZXJzLmRlbGV0ZSh0b2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgc2VuZFByb2dyZXNzOiAoX3R5cGUsIHRva2VuLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGF3YWl0IGJ1dCBzaW1wbGUgcmV0dXJuIHRvIGVuc3VyZSB0aGF0IHdlIGRvbid0IGhhdmUgYW5vdGhlclxuICAgICAgICAgICAgLy8gYXN5bmMgc2NoZWR1bGluZy4gT3RoZXJ3aXNlIG9uZSBzZW5kIGNvdWxkIG92ZXJ0YWtlIGFub3RoZXIgc2VuZC5cbiAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLnNlbmROb3RpZmljYXRpb24oUHJvZ3Jlc3NOb3RpZmljYXRpb24udHlwZSwgeyB0b2tlbiwgdmFsdWUgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uVW5oYW5kbGVkUHJvZ3Jlc3M6IHVuaGFuZGxlZFByb2dyZXNzRW1pdHRlci5ldmVudCxcbiAgICAgICAgc2VuZFJlcXVlc3Q6ICh0eXBlLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgdGhyb3dJZk5vdExpc3RlbmluZygpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlUGFyYW1zO1xuICAgICAgICAgICAgbGV0IHRva2VuID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKElzLnN0cmluZyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3QgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgbGV0IHBhcmFtU3RhcnQgPSAwO1xuICAgICAgICAgICAgICAgIGxldCBwYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG87XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5pcyhmaXJzdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1TdGFydCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlclN0cnVjdHVyZXMgPSBmaXJzdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHBhcmFtRW5kID0gYXJncy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuLmlzKGxhc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtRW5kID0gcGFyYW1FbmQgLSAxO1xuICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IGxhc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gcGFyYW1FbmQgLSBwYXJhbVN0YXJ0O1xuICAgICAgICAgICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zID0gY29tcHV0ZVNpbmdsZVBhcmFtKHBhcmFtZXRlclN0cnVjdHVyZXMsIGFyZ3NbcGFyYW1TdGFydF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjZWl2ZWQgJHtudW1iZXJPZlBhcmFtc30gcGFyYW1ldGVycyBmb3IgJ2J5IE5hbWUnIHJlcXVlc3QgcGFyYW1ldGVyIHN0cnVjdHVyZS5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMgPSBhcmdzLnNsaWNlKHBhcmFtU3RhcnQsIHBhcmFtRW5kKS5tYXAodmFsdWUgPT4gdW5kZWZpbmVkVG9OdWxsKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBhcmdzO1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGUubWV0aG9kO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMgPSBjb21wdXRlTWVzc2FnZVBhcmFtcyh0eXBlLCBwYXJhbXMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gdHlwZS5udW1iZXJPZlBhcmFtcztcbiAgICAgICAgICAgICAgICB0b2tlbiA9IGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuLmlzKHBhcmFtc1tudW1iZXJPZlBhcmFtc10pID8gcGFyYW1zW251bWJlck9mUGFyYW1zXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGlkID0gc2VxdWVuY2VOdW1iZXIrKztcbiAgICAgICAgICAgIGxldCBkaXNwb3NhYmxlO1xuICAgICAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgICAgICAgZGlzcG9zYWJsZSA9IHRva2VuLm9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcCA9IGNhbmNlbGxhdGlvblN0cmF0ZWd5LnNlbmRlci5zZW5kQ2FuY2VsbGF0aW9uKGNvbm5lY3Rpb24sIGlkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhgUmVjZWl2ZWQgbm8gcHJvbWlzZSBmcm9tIGNhbmNlbGxhdGlvbiBzdHJhdGVneSB3aGVuIGNhbmNlbGxpbmcgaWQgJHtpZH1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIubG9nKGBTZW5kaW5nIGNhbmNlbGxhdGlvbiBtZXNzYWdlcyBmb3IgaWQgJHtpZH0gZmFpbGVkYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdE1lc3NhZ2UgPSB7XG4gICAgICAgICAgICAgICAganNvbnJwYzogdmVyc2lvbixcbiAgICAgICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBtZXNzYWdlUGFyYW1zXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdHJhY2VTZW5kaW5nUmVxdWVzdChyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNhbmNlbGxhdGlvblN0cmF0ZWd5LnNlbmRlci5lbmFibGVDYW5jZWxsYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25TdHJhdGVneS5zZW5kZXIuZW5hYmxlQ2FuY2VsbGF0aW9uKHJlcXVlc3RNZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZVdpdGhDbGVhbnVwID0gKHIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyKTtcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uU3RyYXRlZ3kuc2VuZGVyLmNsZWFudXAoaWQpO1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlPy5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWplY3RXaXRoQ2xlYW51cCA9IChyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChyKTtcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uU3RyYXRlZ3kuc2VuZGVyLmNsZWFudXAoaWQpO1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlPy5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZVByb21pc2UgPSB7IG1ldGhvZDogbWV0aG9kLCB0aW1lclN0YXJ0OiBEYXRlLm5vdygpLCByZXNvbHZlOiByZXNvbHZlV2l0aENsZWFudXAsIHJlamVjdDogcmVqZWN0V2l0aENsZWFudXAgfTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2VzLnNldChpZCwgcmVzcG9uc2VQcm9taXNlKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbWVzc2FnZVdyaXRlci53cml0ZShyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAvLyBXcml0aW5nIHRoZSBtZXNzYWdlIGZhaWxlZC4gU28gd2UgbmVlZCB0byBkZWxldGUgaXQgZnJvbSB0aGUgcmVzcG9uc2UgcHJvbWlzZXMgYW5kXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlamVjdCBpdC5cbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlcy5kZWxldGUoaWQpO1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2UucmVqZWN0KG5ldyBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IobWVzc2FnZXNfMS5FcnJvckNvZGVzLk1lc3NhZ2VXcml0ZUVycm9yLCBlcnJvci5tZXNzYWdlID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIHJlYXNvbicpKTtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlcXVlc3QgZmFpbGVkLmApO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25SZXF1ZXN0OiAodHlwZSwgaGFuZGxlcikgPT4ge1xuICAgICAgICAgICAgdGhyb3dJZkNsb3NlZE9yRGlzcG9zZWQoKTtcbiAgICAgICAgICAgIGxldCBtZXRob2QgPSBudWxsO1xuICAgICAgICAgICAgaWYgKFN0YXJSZXF1ZXN0SGFuZGxlci5pcyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBzdGFyUmVxdWVzdEhhbmRsZXIgPSB0eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoSXMuc3RyaW5nKHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgbWV0aG9kID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoaGFuZGxlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RIYW5kbGVycy5zZXQodHlwZSwgeyBoYW5kbGVyOiBoYW5kbGVyLCB0eXBlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSB0eXBlLm1ldGhvZDtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEhhbmRsZXJzLnNldCh0eXBlLm1ldGhvZCwgeyB0eXBlLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SGFuZGxlcnMuZGVsZXRlKG1ldGhvZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFyUmVxdWVzdEhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBoYXNQZW5kaW5nUmVzcG9uc2U6ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZVByb21pc2VzLnNpemUgPiAwO1xuICAgICAgICB9LFxuICAgICAgICB0cmFjZTogYXN5bmMgKF92YWx1ZSwgX3RyYWNlciwgc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBsZXQgX3NlbmROb3RpZmljYXRpb24gPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBfdHJhY2VGb3JtYXQgPSBUcmFjZUZvcm1hdC5UZXh0O1xuICAgICAgICAgICAgaWYgKHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKElzLmJvb2xlYW4oc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zKSkge1xuICAgICAgICAgICAgICAgICAgICBfc2VuZE5vdGlmaWNhdGlvbiA9IHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF9zZW5kTm90aWZpY2F0aW9uID0gc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zLnNlbmROb3RpZmljYXRpb24gfHwgZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIF90cmFjZUZvcm1hdCA9IHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucy50cmFjZUZvcm1hdCB8fCBUcmFjZUZvcm1hdC5UZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlID0gX3ZhbHVlO1xuICAgICAgICAgICAgdHJhY2VGb3JtYXQgPSBfdHJhY2VGb3JtYXQ7XG4gICAgICAgICAgICBpZiAodHJhY2UgPT09IFRyYWNlLk9mZikge1xuICAgICAgICAgICAgICAgIHRyYWNlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRyYWNlciA9IF90cmFjZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoX3NlbmROb3RpZmljYXRpb24gJiYgIWlzQ2xvc2VkKCkgJiYgIWlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGNvbm5lY3Rpb24uc2VuZE5vdGlmaWNhdGlvbihTZXRUcmFjZU5vdGlmaWNhdGlvbi50eXBlLCB7IHZhbHVlOiBUcmFjZS50b1N0cmluZyhfdmFsdWUpIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBvbkVycm9yOiBlcnJvckVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIG9uQ2xvc2U6IGNsb3NlRW1pdHRlci5ldmVudCxcbiAgICAgICAgb25VbmhhbmRsZWROb3RpZmljYXRpb246IHVuaGFuZGxlZE5vdGlmaWNhdGlvbkVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIG9uRGlzcG9zZTogZGlzcG9zZUVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIGVuZDogKCkgPT4ge1xuICAgICAgICAgICAgbWVzc2FnZVdyaXRlci5lbmQoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLkRpc3Bvc2VkO1xuICAgICAgICAgICAgZGlzcG9zZUVtaXR0ZXIuZmlyZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5QZW5kaW5nUmVzcG9uc2VSZWplY3RlZCwgJ1BlbmRpbmcgcmVzcG9uc2UgcmVqZWN0ZWQgc2luY2UgY29ubmVjdGlvbiBnb3QgZGlzcG9zZWQnKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvbWlzZSBvZiByZXNwb25zZVByb21pc2VzLnZhbHVlcygpKSB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBrbm93bkNhbmNlbGVkUmVxdWVzdHMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICBtZXNzYWdlUXVldWUgPSBuZXcgbGlua2VkTWFwXzEuTGlua2VkTWFwKCk7XG4gICAgICAgICAgICAvLyBUZXN0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgaWYgKElzLmZ1bmMobWVzc2FnZVdyaXRlci5kaXNwb3NlKSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKElzLmZ1bmMobWVzc2FnZVJlYWRlci5kaXNwb3NlKSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VSZWFkZXIuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBsaXN0ZW46ICgpID0+IHtcbiAgICAgICAgICAgIHRocm93SWZDbG9zZWRPckRpc3Bvc2VkKCk7XG4gICAgICAgICAgICB0aHJvd0lmTGlzdGVuaW5nKCk7XG4gICAgICAgICAgICBzdGF0ZSA9IENvbm5lY3Rpb25TdGF0ZS5MaXN0ZW5pbmc7XG4gICAgICAgICAgICBtZXNzYWdlUmVhZGVyLmxpc3RlbihjYWxsYmFjayk7XG4gICAgICAgIH0sXG4gICAgICAgIGluc3BlY3Q6ICgpID0+IHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS5jb25zb2xlLmxvZygnaW5zcGVjdCcpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25uZWN0aW9uLm9uTm90aWZpY2F0aW9uKExvZ1RyYWNlTm90aWZpY2F0aW9uLnR5cGUsIChwYXJhbXMpID0+IHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZlcmJvc2UgPSB0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdDtcbiAgICAgICAgdHJhY2VyLmxvZyhwYXJhbXMubWVzc2FnZSwgdmVyYm9zZSA/IHBhcmFtcy52ZXJib3NlIDogdW5kZWZpbmVkKTtcbiAgICB9KTtcbiAgICBjb25uZWN0aW9uLm9uTm90aWZpY2F0aW9uKFByb2dyZXNzTm90aWZpY2F0aW9uLnR5cGUsIChwYXJhbXMpID0+IHtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IHByb2dyZXNzSGFuZGxlcnMuZ2V0KHBhcmFtcy50b2tlbik7XG4gICAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICAgICBoYW5kbGVyKHBhcmFtcy52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1bmhhbmRsZWRQcm9ncmVzc0VtaXR0ZXIuZmlyZShwYXJhbXMpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbm5lY3Rpb247XG59XG5leHBvcnRzLmNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uID0gY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb247XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vdHlwaW5ncy90aGVuYWJsZS5kLnRzXCIgLz5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUHJvZ3Jlc3NUeXBlID0gZXhwb3J0cy5Qcm9ncmVzc1Rva2VuID0gZXhwb3J0cy5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiA9IGV4cG9ydHMuTnVsbExvZ2dlciA9IGV4cG9ydHMuQ29ubmVjdGlvbk9wdGlvbnMgPSBleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IGV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlQnVmZmVyID0gZXhwb3J0cy5Xcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyID0gZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLk1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLlJlYWRhYmxlU3RyZWFtTWVzc2FnZVJlYWRlciA9IGV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlUmVhZGVyID0gZXhwb3J0cy5NZXNzYWdlUmVhZGVyID0gZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblRva2VuID0gZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IGV4cG9ydHMuRW1pdHRlciA9IGV4cG9ydHMuRXZlbnQgPSBleHBvcnRzLkRpc3Bvc2FibGUgPSBleHBvcnRzLkxSVUNhY2hlID0gZXhwb3J0cy5Ub3VjaCA9IGV4cG9ydHMuTGlua2VkTWFwID0gZXhwb3J0cy5QYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlOSA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTggPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU3ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNiA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTUgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU0ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMyA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTIgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUxID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMCA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZSA9IGV4cG9ydHMuRXJyb3JDb2RlcyA9IGV4cG9ydHMuUmVzcG9uc2VFcnJvciA9IGV4cG9ydHMuUmVxdWVzdFR5cGU5ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTggPSBleHBvcnRzLlJlcXVlc3RUeXBlNyA9IGV4cG9ydHMuUmVxdWVzdFR5cGU2ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTUgPSBleHBvcnRzLlJlcXVlc3RUeXBlNCA9IGV4cG9ydHMuUmVxdWVzdFR5cGUzID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTIgPSBleHBvcnRzLlJlcXVlc3RUeXBlMSA9IGV4cG9ydHMuUmVxdWVzdFR5cGUwID0gZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IGV4cG9ydHMuTWVzc2FnZSA9IGV4cG9ydHMuUkFMID0gdm9pZCAwO1xuZXhwb3J0cy5NZXNzYWdlU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblN0cmF0ZWd5ID0gZXhwb3J0cy5DYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IGV4cG9ydHMuQ29ubmVjdGlvbkVycm9yID0gZXhwb3J0cy5Db25uZWN0aW9uRXJyb3JzID0gZXhwb3J0cy5Mb2dUcmFjZU5vdGlmaWNhdGlvbiA9IGV4cG9ydHMuU2V0VHJhY2VOb3RpZmljYXRpb24gPSBleHBvcnRzLlRyYWNlRm9ybWF0ID0gZXhwb3J0cy5UcmFjZVZhbHVlcyA9IGV4cG9ydHMuVHJhY2UgPSB2b2lkIDA7XG5jb25zdCBtZXNzYWdlc18xID0gcmVxdWlyZShcIi4vbWVzc2FnZXNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNZXNzYWdlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk1lc3NhZ2U7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlMFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTA7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTFcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGUxOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGUyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlMjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlM1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGU0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGU1XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlNTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlNlwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTY7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTdcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGU3OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGU4XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlODsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlOVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTk7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXNwb25zZUVycm9yXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3I7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJFcnJvckNvZGVzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLkVycm9yQ29kZXM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlMFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlMDsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGUxXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGUxOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZTJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlM1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlMzsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGU0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZTVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlNlwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlNjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGU3XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU3OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZThcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTg7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlOVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlOTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlBhcmFtZXRlclN0cnVjdHVyZXNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlczsgfSB9KTtcbmNvbnN0IGxpbmtlZE1hcF8xID0gcmVxdWlyZShcIi4vbGlua2VkTWFwXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTGlua2VkTWFwXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBsaW5rZWRNYXBfMS5MaW5rZWRNYXA7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJMUlVDYWNoZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbGlua2VkTWFwXzEuTFJVQ2FjaGU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJUb3VjaFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbGlua2VkTWFwXzEuVG91Y2g7IH0gfSk7XG5jb25zdCBkaXNwb3NhYmxlXzEgPSByZXF1aXJlKFwiLi9kaXNwb3NhYmxlXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiRGlzcG9zYWJsZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZGlzcG9zYWJsZV8xLkRpc3Bvc2FibGU7IH0gfSk7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCIuL2V2ZW50c1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkV2ZW50XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBldmVudHNfMS5FdmVudDsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkVtaXR0ZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGV2ZW50c18xLkVtaXR0ZXI7IH0gfSk7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblRva2VuU291cmNlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjYW5jZWxsYXRpb25fMS5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblRva2VuXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjYW5jZWxsYXRpb25fMS5DYW5jZWxsYXRpb25Ub2tlbjsgfSB9KTtcbmNvbnN0IHNoYXJlZEFycmF5Q2FuY2VsbGF0aW9uXzEgPSByZXF1aXJlKFwiLi9zaGFyZWRBcnJheUNhbmNlbGxhdGlvblwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHNoYXJlZEFycmF5Q2FuY2VsbGF0aW9uXzEuU2hhcmVkQXJyYXlTZW5kZXJTdHJhdGVneTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlNoYXJlZEFycmF5UmVjZWl2ZXJTdHJhdGVneVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gc2hhcmVkQXJyYXlDYW5jZWxsYXRpb25fMS5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3k7IH0gfSk7XG5jb25zdCBtZXNzYWdlUmVhZGVyXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlUmVhZGVyXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTWVzc2FnZVJlYWRlclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZVJlYWRlcl8xLk1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VSZWFkZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VSZWFkZXJfMS5BYnN0cmFjdE1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VSZWFkZXJfMS5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5jb25zdCBtZXNzYWdlV3JpdGVyXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlV3JpdGVyXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTWVzc2FnZVdyaXRlclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZVdyaXRlcl8xLk1lc3NhZ2VXcml0ZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VXcml0ZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VXcml0ZXJfMS5BYnN0cmFjdE1lc3NhZ2VXcml0ZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJXcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlV3JpdGVyXzEuV3JpdGVhYmxlU3RyZWFtTWVzc2FnZVdyaXRlcjsgfSB9KTtcbmNvbnN0IG1lc3NhZ2VCdWZmZXJfMSA9IHJlcXVpcmUoXCIuL21lc3NhZ2VCdWZmZXJcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VCdWZmZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VCdWZmZXJfMS5BYnN0cmFjdE1lc3NhZ2VCdWZmZXI7IH0gfSk7XG5jb25zdCBjb25uZWN0aW9uXzEgPSByZXF1aXJlKFwiLi9jb25uZWN0aW9uXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29ubmVjdGlvblN0cmF0ZWd5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ29ubmVjdGlvblN0cmF0ZWd5OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29ubmVjdGlvbk9wdGlvbnNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5Db25uZWN0aW9uT3B0aW9uczsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk51bGxMb2dnZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5OdWxsTG9nZ2VyOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb25cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlByb2dyZXNzVG9rZW5cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5Qcm9ncmVzc1Rva2VuOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUHJvZ3Jlc3NUeXBlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuUHJvZ3Jlc3NUeXBlOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiVHJhY2VcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5UcmFjZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlRyYWNlVmFsdWVzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuVHJhY2VWYWx1ZXM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJUcmFjZUZvcm1hdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29ubmVjdGlvbl8xLlRyYWNlRm9ybWF0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiU2V0VHJhY2VOb3RpZmljYXRpb25cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5TZXRUcmFjZU5vdGlmaWNhdGlvbjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkxvZ1RyYWNlTm90aWZpY2F0aW9uXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuTG9nVHJhY2VOb3RpZmljYXRpb247IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJDb25uZWN0aW9uRXJyb3JzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ29ubmVjdGlvbkVycm9yczsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNvbm5lY3Rpb25FcnJvclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29ubmVjdGlvbl8xLkNvbm5lY3Rpb25FcnJvcjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5DYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5DYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblN0cmF0ZWd5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ2FuY2VsbGF0aW9uU3RyYXRlZ3k7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNZXNzYWdlU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5NZXNzYWdlU3RyYXRlZ3k7IH0gfSk7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbmV4cG9ydHMuUkFMID0gcmFsXzEuZGVmYXVsdDtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGFwaV8xID0gcmVxdWlyZShcIi4uL2NvbW1vbi9hcGlcIik7XG5jbGFzcyBNZXNzYWdlQnVmZmVyIGV4dGVuZHMgYXBpXzEuQWJzdHJhY3RNZXNzYWdlQnVmZmVyIHtcbiAgICBjb25zdHJ1Y3RvcihlbmNvZGluZyA9ICd1dGYtOCcpIHtcbiAgICAgICAgc3VwZXIoZW5jb2RpbmcpO1xuICAgICAgICB0aGlzLmFzY2lpRGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcignYXNjaWknKTtcbiAgICB9XG4gICAgZW1wdHlCdWZmZXIoKSB7XG4gICAgICAgIHJldHVybiBNZXNzYWdlQnVmZmVyLmVtcHR5QnVmZmVyO1xuICAgIH1cbiAgICBmcm9tU3RyaW5nKHZhbHVlLCBfZW5jb2RpbmcpIHtcbiAgICAgICAgcmV0dXJuIChuZXcgVGV4dEVuY29kZXIoKSkuZW5jb2RlKHZhbHVlKTtcbiAgICB9XG4gICAgdG9TdHJpbmcodmFsdWUsIGVuY29kaW5nKSB7XG4gICAgICAgIGlmIChlbmNvZGluZyA9PT0gJ2FzY2lpJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXNjaWlEZWNvZGVyLmRlY29kZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gKG5ldyBUZXh0RGVjb2RlcihlbmNvZGluZykpLmRlY29kZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXNOYXRpdmUoYnVmZmVyLCBsZW5ndGgpIHtcbiAgICAgICAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlci5zbGljZSgwLCBsZW5ndGgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFsbG9jTmF0aXZlKGxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTtcbiAgICB9XG59XG5NZXNzYWdlQnVmZmVyLmVtcHR5QnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMCk7XG5jbGFzcyBSZWFkYWJsZVN0cmVhbVdyYXBwZXIge1xuICAgIGNvbnN0cnVjdG9yKHNvY2tldCkge1xuICAgICAgICB0aGlzLnNvY2tldCA9IHNvY2tldDtcbiAgICAgICAgdGhpcy5fb25EYXRhID0gbmV3IGFwaV8xLkVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5fbWVzc2FnZUxpc3RlbmVyID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBibG9iID0gZXZlbnQuZGF0YTtcbiAgICAgICAgICAgIGJsb2IuYXJyYXlCdWZmZXIoKS50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkRhdGEuZmlyZShuZXcgVWludDhBcnJheShidWZmZXIpKTtcbiAgICAgICAgICAgIH0sICgpID0+IHtcbiAgICAgICAgICAgICAgICAoMCwgYXBpXzEuUkFMKSgpLmNvbnNvbGUuZXJyb3IoYENvbnZlcnRpbmcgYmxvYiB0byBhcnJheSBidWZmZXIgZmFpbGVkLmApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLl9tZXNzYWdlTGlzdGVuZXIpO1xuICAgIH1cbiAgICBvbkNsb3NlKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2Nsb3NlJywgbGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gYXBpXzEuRGlzcG9zYWJsZS5jcmVhdGUoKCkgPT4gdGhpcy5zb2NrZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xvc2UnLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkVycm9yKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgbGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gYXBpXzEuRGlzcG9zYWJsZS5jcmVhdGUoKCkgPT4gdGhpcy5zb2NrZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkVuZChsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKCdlbmQnLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdlbmQnLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkRhdGEobGlzdGVuZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uRGF0YS5ldmVudChsaXN0ZW5lcik7XG4gICAgfVxufVxuY2xhc3MgV3JpdGFibGVTdHJlYW1XcmFwcGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihzb2NrZXQpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7XG4gICAgfVxuICAgIG9uQ2xvc2UobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignY2xvc2UnLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbG9zZScsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIG9uRXJyb3IobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIG9uRW5kKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2VuZCcsIGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIGFwaV8xLkRpc3Bvc2FibGUuY3JlYXRlKCgpID0+IHRoaXMuc29ja2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2VuZCcsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIHdyaXRlKGRhdGEsIGVuY29kaW5nKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkICYmIGVuY29kaW5nICE9PSAndXRmLTgnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbiBhIEJyb3dzZXIgZW52aXJvbm1lbnRzIG9ubHkgdXRmLTggdGV4dCBlbmNvZGluZyBpcyBzdXBwb3J0ZWQuIEJ1dCBnb3QgZW5jb2Rpbmc6ICR7ZW5jb2Rpbmd9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKTtcbiAgICB9XG59XG5jb25zdCBfdGV4dEVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbmNvbnN0IF9yaWwgPSBPYmplY3QuZnJlZXplKHtcbiAgICBtZXNzYWdlQnVmZmVyOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgY3JlYXRlOiAoZW5jb2RpbmcpID0+IG5ldyBNZXNzYWdlQnVmZmVyKGVuY29kaW5nKVxuICAgIH0pLFxuICAgIGFwcGxpY2F0aW9uSnNvbjogT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGVuY29kZXI6IE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgbmFtZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgZW5jb2RlOiAobXNnLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2hhcnNldCAhPT0gJ3V0Zi04Jykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluIGEgQnJvd3NlciBlbnZpcm9ubWVudHMgb25seSB1dGYtOCB0ZXh0IGVuY29kaW5nIGlzIHN1cHBvcnRlZC4gQnV0IGdvdCBlbmNvZGluZzogJHtvcHRpb25zLmNoYXJzZXR9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoX3RleHRFbmNvZGVyLmVuY29kZShKU09OLnN0cmluZ2lmeShtc2csIHVuZGVmaW5lZCwgMCkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIGRlY29kZXI6IE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgbmFtZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgZGVjb2RlOiAoYnVmZmVyLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCEoYnVmZmVyIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbiBhIEJyb3dzZXIgZW52aXJvbm1lbnRzIG9ubHkgVWludDhBcnJheXMgYXJlIHN1cHBvcnRlZC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShKU09OLnBhcnNlKG5ldyBUZXh0RGVjb2RlcihvcHRpb25zLmNoYXJzZXQpLmRlY29kZShidWZmZXIpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfSksXG4gICAgc3RyZWFtOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgYXNSZWFkYWJsZVN0cmVhbTogKHNvY2tldCkgPT4gbmV3IFJlYWRhYmxlU3RyZWFtV3JhcHBlcihzb2NrZXQpLFxuICAgICAgICBhc1dyaXRhYmxlU3RyZWFtOiAoc29ja2V0KSA9PiBuZXcgV3JpdGFibGVTdHJlYW1XcmFwcGVyKHNvY2tldClcbiAgICB9KSxcbiAgICBjb25zb2xlOiBjb25zb2xlLFxuICAgIHRpbWVyOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgc2V0VGltZW91dChjYWxsYmFjaywgbXMsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHNldFRpbWVvdXQoY2FsbGJhY2ssIG1zLCAuLi5hcmdzKTtcbiAgICAgICAgICAgIHJldHVybiB7IGRpc3Bvc2U6ICgpID0+IGNsZWFyVGltZW91dChoYW5kbGUpIH07XG4gICAgICAgIH0sXG4gICAgICAgIHNldEltbWVkaWF0ZShjYWxsYmFjaywgLi4uYXJncykge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gc2V0VGltZW91dChjYWxsYmFjaywgMCwgLi4uYXJncyk7XG4gICAgICAgICAgICByZXR1cm4geyBkaXNwb3NlOiAoKSA9PiBjbGVhclRpbWVvdXQoaGFuZGxlKSB9O1xuICAgICAgICB9LFxuICAgICAgICBzZXRJbnRlcnZhbChjYWxsYmFjaywgbXMsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHNldEludGVydmFsKGNhbGxiYWNrLCBtcywgLi4uYXJncyk7XG4gICAgICAgICAgICByZXR1cm4geyBkaXNwb3NlOiAoKSA9PiBjbGVhckludGVydmFsKGhhbmRsZSkgfTtcbiAgICAgICAgfSxcbiAgICB9KVxufSk7XG5mdW5jdGlvbiBSSUwoKSB7XG4gICAgcmV0dXJuIF9yaWw7XG59XG4oZnVuY3Rpb24gKFJJTCkge1xuICAgIGZ1bmN0aW9uIGluc3RhbGwoKSB7XG4gICAgICAgIGFwaV8xLlJBTC5pbnN0YWxsKF9yaWwpO1xuICAgIH1cbiAgICBSSUwuaW5zdGFsbCA9IGluc3RhbGw7XG59KShSSUwgfHwgKFJJTCA9IHt9KSk7XG5leHBvcnRzLmRlZmF1bHQgPSBSSUw7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24gPSBleHBvcnRzLkJyb3dzZXJNZXNzYWdlV3JpdGVyID0gZXhwb3J0cy5Ccm93c2VyTWVzc2FnZVJlYWRlciA9IHZvaWQgMDtcbmNvbnN0IHJpbF8xID0gcmVxdWlyZShcIi4vcmlsXCIpO1xuLy8gSW5zdGFsbCB0aGUgYnJvd3NlciBydW50aW1lIGFic3RyYWN0LlxucmlsXzEuZGVmYXVsdC5pbnN0YWxsKCk7XG5jb25zdCBhcGlfMSA9IHJlcXVpcmUoXCIuLi9jb21tb24vYXBpXCIpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuLi9jb21tb24vYXBpXCIpLCBleHBvcnRzKTtcbmNsYXNzIEJyb3dzZXJNZXNzYWdlUmVhZGVyIGV4dGVuZHMgYXBpXzEuQWJzdHJhY3RNZXNzYWdlUmVhZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihwb3J0KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX29uRGF0YSA9IG5ldyBhcGlfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuX21lc3NhZ2VMaXN0ZW5lciA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fb25EYXRhLmZpcmUoZXZlbnQuZGF0YSk7XG4gICAgICAgIH07XG4gICAgICAgIHBvcnQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoZXZlbnQpID0+IHRoaXMuZmlyZUVycm9yKGV2ZW50KSk7XG4gICAgICAgIHBvcnQub25tZXNzYWdlID0gdGhpcy5fbWVzc2FnZUxpc3RlbmVyO1xuICAgIH1cbiAgICBsaXN0ZW4oY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uRGF0YS5ldmVudChjYWxsYmFjayk7XG4gICAgfVxufVxuZXhwb3J0cy5Ccm93c2VyTWVzc2FnZVJlYWRlciA9IEJyb3dzZXJNZXNzYWdlUmVhZGVyO1xuY2xhc3MgQnJvd3Nlck1lc3NhZ2VXcml0ZXIgZXh0ZW5kcyBhcGlfMS5BYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKHBvcnQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50ID0gMDtcbiAgICAgICAgcG9ydC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIChldmVudCkgPT4gdGhpcy5maXJlRXJyb3IoZXZlbnQpKTtcbiAgICB9XG4gICAgd3JpdGUobXNnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnBvcnQucG9zdE1lc3NhZ2UobXNnKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IsIG1zZyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZUVycm9yKGVycm9yLCBtc2cpIHtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50Kys7XG4gICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yLCBtc2csIHRoaXMuZXJyb3JDb3VudCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICB9XG59XG5leHBvcnRzLkJyb3dzZXJNZXNzYWdlV3JpdGVyID0gQnJvd3Nlck1lc3NhZ2VXcml0ZXI7XG5mdW5jdGlvbiBjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbihyZWFkZXIsIHdyaXRlciwgbG9nZ2VyLCBvcHRpb25zKSB7XG4gICAgaWYgKGxvZ2dlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxvZ2dlciA9IGFwaV8xLk51bGxMb2dnZXI7XG4gICAgfVxuICAgIGlmIChhcGlfMS5Db25uZWN0aW9uU3RyYXRlZ3kuaXMob3B0aW9ucykpIHtcbiAgICAgICAgb3B0aW9ucyA9IHsgY29ubmVjdGlvblN0cmF0ZWd5OiBvcHRpb25zIH07XG4gICAgfVxuICAgIHJldHVybiAoMCwgYXBpXzEuY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24pKHJlYWRlciwgd3JpdGVyLCBsb2dnZXIsIG9wdGlvbnMpO1xufVxuZXhwb3J0cy5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiA9IGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uO1xuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL2Jyb3dzZXIvbWFpbicpOyIsICIvKlxuICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMjYgRWNsaXBzZSBEaXJpZ2libGUgY29udHJpYnV0b3JzXG4gKlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlXG4gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2Mi4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG4gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MjAuaHRtbFxuICpcbiAqIFNQRFgtRmlsZUNvcHlyaWdodFRleHQ6IEVjbGlwc2UgRGlyaWdpYmxlIGNvbnRyaWJ1dG9ycyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbi8qKlxuICogSmF2YSBMU1AgY2xpZW50IGJ1bmRsZS5cbiAqXG4gKiBVc2VzIHZzY29kZS13cy1qc29ucnBjIGZvciB0eXBlZCBKU09OLVJQQyBvdmVyIFdlYlNvY2tldCBhbmQgcmVnaXN0ZXJzIE1vbmFjb1xuICogcHJvdmlkZXJzIHRoYXQgZGVsZWdhdGUgdG8gSkRULkxTLiBFeHBvc2VkIGFzIGdsb2JhbCBKYXZhTHNwQ2xpZW50TGliIHNvIHRoYXRcbiAqIGVkaXRvci5qcyBjYW4gY2FsbCBKYXZhTHNwQ2xpZW50TGliLmNvbm5lY3QocmVzb3VyY2VQYXRoKS5cbiAqXG4gKiBPbmUgSkRULkxTIHByb2Nlc3MgY292ZXJzIHRoZSBlbnRpcmUgd29ya3NwYWNlLCBzbyBhIHNpbmdsZSBXZWJTb2NrZXQgY29ubmVjdGlvblxuICogaXMgc2hhcmVkIGFjcm9zcyBhbGwgSmF2YSBmaWxlcyBvcGVuIGluIHRoZSBzYW1lIGJyb3dzZXIgcGFnZS4gVGhlIGNvbm5lY3Rpb24gaXNcbiAqIGVzdGFibGlzaGVkIG9uIHRoZSBmaXJzdCBjb25uZWN0KCkgY2FsbCBhbmQgcmV1c2VkIGZvciBhbGwgc3Vic2VxdWVudCBjYWxscy5cbiAqXG4gKiBlZGl0b3IuanMgc2V0cyB3aW5kb3cubW9uYWNvIGJlZm9yZSBjYWxsaW5nIGNvbm5lY3QoKSwgc28gdGhlIG1vbmFjby1zaGltJ3MgbGF6eVxuICogUHJveGllcyByZXNvbHZlIGNvcnJlY3RseSBhdCBjYWxsIHRpbWUuXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24sIE1lc3NhZ2VDb25uZWN0aW9uIH0gZnJvbSAndnNjb2RlLWpzb25ycGMvYnJvd3Nlcic7XG5pbXBvcnQgeyB0b1NvY2tldCwgV2ViU29ja2V0TWVzc2FnZVJlYWRlciwgV2ViU29ja2V0TWVzc2FnZVdyaXRlciB9IGZyb20gJ3ZzY29kZS13cy1qc29ucnBjJztcbmltcG9ydCAqIGFzIG1vbmFjbyBmcm9tICdtb25hY28tZWRpdG9yJztcbmltcG9ydCB7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLFxuICAgIERpYWdub3N0aWNTZXZlcml0eSxcbiAgICBJbnNlcnRUZXh0Rm9ybWF0LFxuICAgIE1hcmt1cENvbnRlbnQsXG4gICAgTWFya3VwS2luZCxcbiAgICB0eXBlIENvZGVBY3Rpb24sXG4gICAgdHlwZSBDb21tYW5kLFxuICAgIHR5cGUgQ29tcGxldGlvbkl0ZW0sXG4gICAgdHlwZSBDb21wbGV0aW9uTGlzdCxcbiAgICB0eXBlIERpYWdub3N0aWMsXG4gICAgdHlwZSBIb3ZlcixcbiAgICB0eXBlIExvY2F0aW9uLFxuICAgIHR5cGUgUGFyYW1ldGVySW5mb3JtYXRpb24sXG4gICAgdHlwZSBTaWduYXR1cmVIZWxwLFxuICAgIHR5cGUgU2lnbmF0dXJlSW5mb3JtYXRpb24sXG4gICAgdHlwZSBUZXh0RWRpdCxcbiAgICB0eXBlIFdvcmtzcGFjZUVkaXQsXG59IGZyb20gJ3ZzY29kZS1sYW5ndWFnZXNlcnZlci10eXBlcyc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNpbmdsZXRvbiBzdGF0ZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogU2hhcmVkIGNvbm5lY3Rpb24gXHUyMDE0IG9uZSBwZXIgYnJvd3NlciBwYWdlLCBjb3ZlcmluZyBhbGwgcHJvamVjdHMgaW4gdGhlIHdvcmtzcGFjZS4gKi9cbmxldCBfY29ubjogTWVzc2FnZUNvbm5lY3Rpb24gfCBudWxsID0gbnVsbDtcblxuLyoqXG4gKiBWaXJ0dWFsIHdvcmtzcGFjZSByb290IFVSSSwgZS5nLiB7QGNvZGUgZmlsZTovLy93b3Jrc3BhY2Uvd29ya3NwYWNlL30uXG4gKiBTZXQgb25jZSBvbiBmaXJzdCBjb25uZWN0KCk7IHVzZWQgdG8gc2NvcGUgTW9uYWNvIHByb3ZpZGVycyB0byB3b3Jrc3BhY2UgZmlsZXMuXG4gKi9cbmxldCBfd29ya3NwYWNlUm9vdCA9ICcnO1xuXG4vKiogVVJJcyBmb3Igd2hpY2ggdGV4dERvY3VtZW50L2RpZE9wZW4gaGFzIGFscmVhZHkgYmVlbiBzZW50LiAqL1xuY29uc3QgX29wZW5GaWxlczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cbmxldCBfcHJvdmlkZXJzUmVnaXN0ZXJlZCA9IGZhbHNlO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBQdWJsaWMgQVBJXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBDYWxsZWQgYnkgZWRpdG9yLmpzIHdoZW4gYSBKYXZhIGZpbGUgaXMgb3BlbmVkLiBTYWZlIHRvIGNhbGwgbXVsdGlwbGUgdGltZXMuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29ubmVjdChyZXNvdXJjZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcnRzID0gcmVzb3VyY2VQYXRoLnJlcGxhY2UoL15cXC8vLCAnJykuc3BsaXQoJy8nKTtcbiAgICBjb25zdCB3b3Jrc3BhY2UgPSBwYXJ0c1swXTtcbiAgICBjb25zdCBwcm9qZWN0ICAgPSBwYXJ0c1sxXTtcbiAgICBjb25zdCBmaWxlVXJpID0gYGZpbGU6Ly8vd29ya3NwYWNlLyR7d29ya3NwYWNlfS8ke3Byb2plY3R9LyR7cGFydHMuc2xpY2UoMikuam9pbignLycpfWA7XG5cbiAgICBpZiAoX2Nvbm4pIHtcbiAgICAgICAgLy8gQ29ubmVjdGlvbiBhbHJlYWR5IGVzdGFibGlzaGVkIFx1MjAxNCBqdXN0IG9wZW4gdGhlIG5ldyBmaWxlLlxuICAgICAgICBvcGVuRmlsZShmaWxlVXJpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIF93b3Jrc3BhY2VSb290ID0gYGZpbGU6Ly8vd29ya3NwYWNlLyR7d29ya3NwYWNlfS9gO1xuXG4gICAgY29uc3QgcHJvdG8gPSBsb2NhdGlvbi5wcm90b2NvbCA9PT0gJ2h0dHBzOicgPyAnd3NzJyA6ICd3cyc7XG4gICAgY29uc3Qgd3NVcmwgPSBgJHtwcm90b306Ly8ke2xvY2F0aW9uLmhvc3R9L3dlYnNvY2tldHMvaWRlL2phdmEtbHNwYFxuICAgICAgICAgICAgICAgICsgYD93b3Jrc3BhY2U9JHtlbmNvZGVVUklDb21wb25lbnQod29ya3NwYWNlKX1gO1xuXG4gICAgY29uc3Qgd3MgPSBuZXcgV2ViU29ja2V0KHdzVXJsKTtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHdzLm9ub3BlbiAgPSAoKSA9PiByZXNvbHZlKCk7XG4gICAgICAgIHdzLm9uZXJyb3IgPSAoKSA9PiByZWplY3QobmV3IEVycm9yKGBbamF2YS1sc3BdIFdlYlNvY2tldCBjb25uZWN0IGZhaWxlZDogJHt3c1VybH1gKSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBzb2NrZXQgPSB0b1NvY2tldCh3cyk7XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IFdlYlNvY2tldE1lc3NhZ2VSZWFkZXIoc29ja2V0KTtcbiAgICBjb25zdCB3cml0ZXIgPSBuZXcgV2ViU29ja2V0TWVzc2FnZVdyaXRlcihzb2NrZXQpO1xuICAgIF9jb25uID0gY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24ocmVhZGVyLCB3cml0ZXIpO1xuXG4gICAgLy8gRGlhZ25vc3RpY3Mgbm90aWZpY2F0aW9uIFx1MjE5MiBNb25hY28gbWFya2VycyAoYXBwbGllcyB0byBhbnkgd29ya3NwYWNlIGZpbGUpXG4gICAgX2Nvbm4ub25Ob3RpZmljYXRpb24oJ3RleHREb2N1bWVudC9wdWJsaXNoRGlhZ25vc3RpY3MnLCAocGFyYW1zOiB7IHVyaTogc3RyaW5nOyBkaWFnbm9zdGljczogRGlhZ25vc3RpY1tdIH0pID0+IHtcbiAgICAgICAgY29uc3QgbW9kZWwgPSBtb25hY28uZWRpdG9yLmdldE1vZGVscygpLmZpbmQobSA9PiBtLnVyaS50b1N0cmluZygpID09PSBwYXJhbXMudXJpKTtcbiAgICAgICAgaWYgKCFtb2RlbCkgcmV0dXJuO1xuICAgICAgICBtb25hY28uZWRpdG9yLnNldE1vZGVsTWFya2Vycyhtb2RlbCwgJ2phdmEtbHNwJywgcGFyYW1zLmRpYWdub3N0aWNzLm1hcChkID0+ICh7XG4gICAgICAgICAgICBzZXZlcml0eTogICAgICAgIGxzcFNldmVyaXR5KGQuc2V2ZXJpdHkpLFxuICAgICAgICAgICAgbWVzc2FnZTogICAgICAgICBkLm1lc3NhZ2UsXG4gICAgICAgICAgICBzb3VyY2U6ICAgICAgICAgIGQuc291cmNlID8/ICdqYXZhJyxcbiAgICAgICAgICAgIHN0YXJ0TGluZU51bWJlcjogZC5yYW5nZS5zdGFydC5saW5lICsgMSxcbiAgICAgICAgICAgIHN0YXJ0Q29sdW1uOiAgICAgZC5yYW5nZS5zdGFydC5jaGFyYWN0ZXIgKyAxLFxuICAgICAgICAgICAgZW5kTGluZU51bWJlcjogICBkLnJhbmdlLmVuZC5saW5lICsgMSxcbiAgICAgICAgICAgIGVuZENvbHVtbjogICAgICAgZC5yYW5nZS5lbmQuY2hhcmFjdGVyICsgMSxcbiAgICAgICAgfSkpKTtcbiAgICB9KTtcblxuICAgIC8vIFNlcnZlciAtPiBjbGllbnQgcmVxdWVzdHMgdGhhdCBkcml2ZSByZWZhY3RvciAvIGdlbmVyYXRlIHJlc3VsdHMgYW5kIGR5bmFtaWMgcmVnaXN0cmF0aW9uLlxuICAgIF9jb25uLm9uUmVxdWVzdCgnd29ya3NwYWNlL2FwcGx5RWRpdCcsIChwYXJhbXM6IHsgZWRpdDogV29ya3NwYWNlRWRpdCB9KSA9PiB7XG4gICAgICAgIGFwcGx5V29ya3NwYWNlRWRpdChwYXJhbXMuZWRpdCk7XG4gICAgICAgIHJldHVybiB7IGFwcGxpZWQ6IHRydWUgfTtcbiAgICB9KTtcbiAgICBfY29ubi5vblJlcXVlc3QoJ3dvcmtzcGFjZS9jb25maWd1cmF0aW9uJywgKHBhcmFtczogeyBpdGVtczogQXJyYXk8eyBzZWN0aW9uPzogc3RyaW5nIH0+IH0pID0+XG4gICAgICAgIChwYXJhbXMuaXRlbXMgPz8gW10pLm1hcCgoKSA9PiBqZHRsc1NldHRpbmdzKCkuamF2YSkpO1xuICAgIF9jb25uLm9uUmVxdWVzdCgnY2xpZW50L3JlZ2lzdGVyQ2FwYWJpbGl0eScsICgpID0+IG51bGwpO1xuICAgIF9jb25uLm9uUmVxdWVzdCgnY2xpZW50L3VucmVnaXN0ZXJDYXBhYmlsaXR5JywgKCkgPT4gbnVsbCk7XG4gICAgX2Nvbm4ub25SZXF1ZXN0KCd3aW5kb3cvc2hvd01lc3NhZ2VSZXF1ZXN0JywgKCkgPT4gbnVsbCk7XG4gICAgX2Nvbm4ub25SZXF1ZXN0KCd3aW5kb3cvd29ya0RvbmVQcm9ncmVzcy9jcmVhdGUnLCAoKSA9PiBudWxsKTtcbiAgICBfY29ubi5vbk5vdGlmaWNhdGlvbignd2luZG93L2xvZ01lc3NhZ2UnLCAocDogeyBtZXNzYWdlOiBzdHJpbmcgfSkgPT4gY29uc29sZS5kZWJ1ZygnW2phdmEtbHNwXScsIHA/Lm1lc3NhZ2UpKTtcbiAgICBfY29ubi5vbk5vdGlmaWNhdGlvbignd2luZG93L3Nob3dNZXNzYWdlJywgKHA6IHsgbWVzc2FnZTogc3RyaW5nIH0pID0+IGNvbnNvbGUuaW5mbygnW2phdmEtbHNwXScsIHA/Lm1lc3NhZ2UpKTtcbiAgICAvLyBKRFQuTFMgbGFuZ3VhZ2Utc3RhdHVzIC8gcHJvZ3Jlc3Mgbm90aWZpY2F0aW9ucyBcdTIwMTQgYWNrbm93bGVkZ2VkIHNpbGVudGx5LlxuICAgIF9jb25uLm9uTm90aWZpY2F0aW9uKCdsYW5ndWFnZS9zdGF0dXMnLCAoKSA9PiB7IC8qIGluZGV4aW5nL3JlYWR5IHN0YXR1cywgaWdub3JlZCAqLyB9KTtcbiAgICBfY29ubi5vbk5vdGlmaWNhdGlvbignbGFuZ3VhZ2UvcHJvZ3Jlc3NSZXBvcnQnLCAoKSA9PiB7IC8qIGJ1aWxkIHByb2dyZXNzLCBpZ25vcmVkICovIH0pO1xuXG4gICAgX2Nvbm4ubGlzdGVuKCk7XG5cbiAgICBjb25zdCByb290VXJpID0gX3dvcmtzcGFjZVJvb3Q7XG4gICAgYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ2luaXRpYWxpemUnLCB7XG4gICAgICAgIHByb2Nlc3NJZDogbnVsbCxcbiAgICAgICAgcm9vdFVyaSxcbiAgICAgICAgaW5pdGlhbGl6YXRpb25PcHRpb25zOiB7XG4gICAgICAgICAgICBzZXR0aW5nczogamR0bHNTZXR0aW5ncygpLFxuICAgICAgICAgICAgZXh0ZW5kZWRDbGllbnRDYXBhYmlsaXRpZXM6IHtcbiAgICAgICAgICAgICAgICBwcm9ncmVzc1JlcG9ydFByb3ZpZGVyOiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAgIGNsYXNzRmlsZUNvbnRlbnRzU3VwcG9ydDogICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICByZXNvbHZlQWRkaXRpb25hbFRleHRFZGl0c1N1cHBvcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgYWR2YW5jZWRHZW5lcmF0ZUFjY2Vzc29yc1N1cHBvcnQ6ICB0cnVlLFxuICAgICAgICAgICAgICAgIGdlbmVyYXRlVG9TdHJpbmdQcm9tcHRTdXBwb3J0OiAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICBnZW5lcmF0ZUNvbnN0cnVjdG9yc1Byb21wdFN1cHBvcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgZ2VuZXJhdGVEZWxlZ2F0ZU1ldGhvZHNQcm9tcHRTdXBwb3J0OiB0cnVlLFxuICAgICAgICAgICAgICAgIGhhc2hDb2RlRXF1YWxzUHJvbXB0U3VwcG9ydDogICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICBhZHZhbmNlZE9yZ2FuaXplSW1wb3J0c1N1cHBvcnQ6ICAgIHRydWUsXG4gICAgICAgICAgICAgICAgaW5mZXJTZWxlY3Rpb25TdXBwb3J0OiAgICAgICAgICAgICBbJ2V4dHJhY3RNZXRob2QnLCAnZXh0cmFjdFZhcmlhYmxlJywgJ2V4dHJhY3RGaWVsZCddLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgd29ya3NwYWNlRm9sZGVyczogW3sgdXJpOiByb290VXJpLCBuYW1lOiB3b3Jrc3BhY2UgfV0sXG4gICAgICAgIGNhcGFiaWxpdGllczoge1xuICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7XG4gICAgICAgICAgICAgICAgc3luY2hyb25pemF0aW9uOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUsIHdpbGxTYXZlOiBmYWxzZSwgZGlkU2F2ZTogdHJ1ZSwgd2lsbFNhdmVXYWl0VW50aWw6IGZhbHNlIH0sXG4gICAgICAgICAgICAgICAgY29tcGxldGlvbjoge1xuICAgICAgICAgICAgICAgICAgICBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uSXRlbToge1xuICAgICAgICAgICAgICAgICAgICAgICAgc25pcHBldFN1cHBvcnQ6ICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRhdGlvbkZvcm1hdDogICBbJ21hcmtkb3duJywgJ3BsYWludGV4dCddLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRlZFN1cHBvcnQ6ICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWl0Q2hhcmFjdGVyc1N1cHBvcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlU3VwcG9ydDogICAgICAgIHsgcHJvcGVydGllczogWydkb2N1bWVudGF0aW9uJywgJ2RldGFpbCcsICdhZGRpdGlvbmFsVGV4dEVkaXRzJ10gfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dFN1cHBvcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBob3ZlcjogICAgICAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLCBjb250ZW50Rm9ybWF0OiBbJ21hcmtkb3duJywgJ3BsYWludGV4dCddIH0sXG4gICAgICAgICAgICAgICAgc2lnbmF0dXJlSGVscDogIHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSwgc2lnbmF0dXJlSW5mb3JtYXRpb246IHsgZG9jdW1lbnRhdGlvbkZvcm1hdDogWydtYXJrZG93bicsICdwbGFpbnRleHQnXSwgcGFyYW1ldGVySW5mb3JtYXRpb246IHsgbGFiZWxPZmZzZXRTdXBwb3J0OiB0cnVlIH0gfSB9LFxuICAgICAgICAgICAgICAgIGRlZmluaXRpb246ICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VzOiAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgZG9jdW1lbnRTeW1ib2w6IHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIGZvcm1hdHRpbmc6ICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICByYW5nZUZvcm1hdHRpbmc6IHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIHJlbmFtZTogICAgICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUsIHByZXBhcmVTdXBwb3J0OiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgY29kZUFjdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjb2RlQWN0aW9uTGl0ZXJhbFN1cHBvcnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVBY3Rpb25LaW5kOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTZXQ6IFsncXVpY2tmaXgnLCAncmVmYWN0b3InLCAncmVmYWN0b3IuZXh0cmFjdCcsICdyZWZhY3Rvci5pbmxpbmUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVmYWN0b3IucmV3cml0ZScsICdzb3VyY2UnLCAnc291cmNlLm9yZ2FuaXplSW1wb3J0cyddLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgaXNQcmVmZXJyZWRTdXBwb3J0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBkYXRhU3VwcG9ydDogICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmVTdXBwb3J0OiAgICAgeyBwcm9wZXJ0aWVzOiBbJ2VkaXQnXSB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcHVibGlzaERpYWdub3N0aWNzOiB7IHJlbGF0ZWRJbmZvcm1hdGlvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdvcmtzcGFjZToge1xuICAgICAgICAgICAgICAgIGFwcGx5RWRpdDogICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbjogICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICBleGVjdXRlQ29tbWFuZDogICAgICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICBkaWRDaGFuZ2VDb25maWd1cmF0aW9uOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICB3b3Jrc3BhY2VFZGl0OiAgICAgICAgICB7IGRvY3VtZW50Q2hhbmdlczogdHJ1ZSwgcmVzb3VyY2VPcGVyYXRpb25zOiBbJ2NyZWF0ZScsICdyZW5hbWUnLCAnZGVsZXRlJ10gfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBfY29ubi5zZW5kTm90aWZpY2F0aW9uKCdpbml0aWFsaXplZCcsIHt9KTtcbiAgICBfY29ubi5zZW5kTm90aWZpY2F0aW9uKCd3b3Jrc3BhY2UvZGlkQ2hhbmdlQ29uZmlndXJhdGlvbicsIHsgc2V0dGluZ3M6IGpkdGxzU2V0dGluZ3MoKSB9KTtcblxuICAgIG9wZW5GaWxlKGZpbGVVcmkpO1xuXG4gICAgaWYgKCFfcHJvdmlkZXJzUmVnaXN0ZXJlZCkge1xuICAgICAgICBfcHJvdmlkZXJzUmVnaXN0ZXJlZCA9IHRydWU7XG4gICAgICAgIHJlZ2lzdGVyUHJvdmlkZXJzKCk7XG4gICAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBGaWxlIGxpZmVjeWNsZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFNlbmRzIHRleHREb2N1bWVudC9kaWRPcGVuIGZvciB0aGUgZ2l2ZW4gVVJJIChpZiBub3QgYWxyZWFkeSBzZW50KSBhbmQgcmVnaXN0ZXJzIGEgZGVib3VuY2VkXG4gKiB0ZXh0RG9jdW1lbnQvZGlkQ2hhbmdlIGxpc3RlbmVyIG9uIHRoZSBjb3JyZXNwb25kaW5nIE1vbmFjbyBtb2RlbC5cbiAqL1xuZnVuY3Rpb24gb3BlbkZpbGUoZmlsZVVyaTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKF9vcGVuRmlsZXMuaGFzKGZpbGVVcmkpIHx8ICFfY29ubikgcmV0dXJuO1xuICAgIF9vcGVuRmlsZXMuYWRkKGZpbGVVcmkpO1xuXG4gICAgY29uc3QgbW9kZWwgPSBtb25hY28uZWRpdG9yLmdldE1vZGVscygpLmZpbmQobSA9PiBtLnVyaS50b1N0cmluZygpID09PSBmaWxlVXJpKTtcbiAgICBfY29ubi5zZW5kTm90aWZpY2F0aW9uKCd0ZXh0RG9jdW1lbnQvZGlkT3BlbicsIHtcbiAgICAgICAgdGV4dERvY3VtZW50OiB7XG4gICAgICAgICAgICB1cmk6ICAgICAgICBmaWxlVXJpLFxuICAgICAgICAgICAgbGFuZ3VhZ2VJZDogJ2phdmEnLFxuICAgICAgICAgICAgdmVyc2lvbjogICAgMSxcbiAgICAgICAgICAgIHRleHQ6ICAgICAgIG1vZGVsPy5nZXRWYWx1ZSgpID8/ICcnLFxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgaWYgKG1vZGVsKSB7XG4gICAgICAgIGxldCB0aW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG4gICAgICAgIG1vZGVsLm9uRGlkQ2hhbmdlQ29udGVudCgoKSA9PiB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBfY29ubj8uc2VuZE5vdGlmaWNhdGlvbigndGV4dERvY3VtZW50L2RpZENoYW5nZScsIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiAgIHsgdXJpOiBmaWxlVXJpLCB2ZXJzaW9uOiBtb2RlbC5nZXRWZXJzaW9uSWQoKSB9LFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50Q2hhbmdlczogW3sgdGV4dDogbW9kZWwuZ2V0VmFsdWUoKSB9XSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sIDQwMCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gV29ya3NwYWNlIGZpbGUgcHJlZGljYXRlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogUmV0dXJucyB7QGNvZGUgdHJ1ZX0gd2hlbiB0aGUgZ2l2ZW4gbW9kZWwgVVJJIGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnRseSBjb25uZWN0ZWQgd29ya3NwYWNlLiBVc2VkXG4gKiBieSBNb25hY28gcHJvdmlkZXJzIHRvIHNraXAgbm9uLUphdmEtd29ya3NwYWNlIG1vZGVscyB3aXRob3V0IGFuIGV4YWN0LVVSSSBjb21wYXJpc29uLlxuICovXG5mdW5jdGlvbiBpc1dvcmtzcGFjZUZpbGUodXJpOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gX3dvcmtzcGFjZVJvb3QgIT09ICcnICYmIHVyaS5zdGFydHNXaXRoKF93b3Jrc3BhY2VSb290KTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gTW9uYWNvIHByb3ZpZGVyIHJlZ2lzdHJhdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiByZWdpc3RlclByb3ZpZGVycygpOiB2b2lkIHtcblxuICAgIG1vbmFjby5lZGl0b3IucmVnaXN0ZXJDb21tYW5kKEFQUExZX0FDVElPTl9DT01NQU5ELCAoX2FjY2Vzc29yOiB1bmtub3duLCBhY3Rpb246IENvZGVBY3Rpb24gfCBDb21tYW5kKSA9PiB7XG4gICAgICAgIGFwcGx5Q29kZUFjdGlvbihhY3Rpb24pO1xuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckNvbXBsZXRpb25JdGVtUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHRyaWdnZXJDaGFyYWN0ZXJzOiBbJy4nLCAnQCcsICc8J10sXG4gICAgICAgIHByb3ZpZGVDb21wbGV0aW9uSXRlbXM6IGFzeW5jIChtb2RlbCwgcG9zaXRpb24pID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgZmlsZVVyaSA9IG1vZGVsLnVyaS50b1N0cmluZygpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBDb21wbGV0aW9uTGlzdCB8IENvbXBsZXRpb25JdGVtW10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9jb21wbGV0aW9uJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IGZpbGVVcmkgfSxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogICAgIHsgbGluZTogcG9zaXRpb24ubGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogcG9zaXRpb24uY29sdW1uIC0gMSB9LFxuICAgICAgICAgICAgICAgIGNvbnRleHQ6ICAgICAgeyB0cmlnZ2VyS2luZDogMSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBpdGVtcyA9IEFycmF5LmlzQXJyYXkocmVzdWx0KSA/IHJlc3VsdCA6IChyZXN1bHQ/Lml0ZW1zID8/IFtdKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3VnZ2VzdGlvbnM6IGl0ZW1zLm1hcChpdGVtID0+IGxzcENvbXBsZXRpb25Ub01vbmFjbyhpdGVtLCBtb2RlbCwgcG9zaXRpb24pKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8vIFJlc29sdmUgZG9jdW1lbnRhdGlvbiBhbmQsIGNydWNpYWxseSwgdGhlIGF1dG8taW1wb3J0IGFkZGl0aW9uYWxUZXh0RWRpdHMgd2hpY2ggSkRULkxTIG9ubHlcbiAgICAgICAgLy8gYXR0YWNoZXMgb24gcmVzb2x2ZSBcdTIwMTQgc2VsZWN0aW5nIGEgdHlwZSB0aGVuIGluc2VydHMgaXRzIGltcG9ydCBzdGF0ZW1lbnQuXG4gICAgICAgIHJlc29sdmVDb21wbGV0aW9uSXRlbTogYXN5bmMgKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxzcCA9IChpdGVtIGFzIE1vbmFjb0NvbXBsZXRpb25JdGVtKS5fbHNwO1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhbHNwKSByZXR1cm4gaXRlbTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWQ6IENvbXBsZXRpb25JdGVtID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ2NvbXBsZXRpb25JdGVtL3Jlc29sdmUnLCBsc3ApO1xuICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZC5kb2N1bWVudGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uZG9jdW1lbnRhdGlvbiA9IHsgdmFsdWU6IG1hcmt1cFRvU3RyaW5nKHJlc29sdmVkLmRvY3VtZW50YXRpb24pLCBpc1RydXN0ZWQ6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZC5kZXRhaWwpIGl0ZW0uZGV0YWlsID0gcmVzb2x2ZWQuZGV0YWlsO1xuICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZC5hZGRpdGlvbmFsVGV4dEVkaXRzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5hZGRpdGlvbmFsVGV4dEVkaXRzID0gcmVzb2x2ZWQuYWRkaXRpb25hbFRleHRFZGl0cy5tYXAodGV4dEVkaXRUb01vbmFjbyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoJ1tqYXZhLWxzcF0gY29tcGxldGlvbiByZXNvbHZlIGZhaWxlZDonLCAoZSBhcyBFcnJvcik/Lm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVySG92ZXJQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZUhvdmVyOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVVcmkgPSBtb2RlbC51cmkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogSG92ZXIgfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9ob3ZlcicsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBmaWxlVXJpIH0sXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQ/LmNvbnRlbnRzKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRzID0gQXJyYXkuaXNBcnJheShyZXN1bHQuY29udGVudHMpID8gcmVzdWx0LmNvbnRlbnRzIDogW3Jlc3VsdC5jb250ZW50c107XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGNvbnRlbnRzOiBjb250ZW50cy5tYXAoYyA9PiAoe1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdHlwZW9mIGMgPT09ICdzdHJpbmcnID8gYyA6IChjIGFzIE1hcmt1cENvbnRlbnQpLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBpc1RydXN0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgICByYW5nZTogcmVzdWx0LnJhbmdlID8gbHNwUmFuZ2VUb01vbmFjbyhyZXN1bHQucmFuZ2UpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJTaWduYXR1cmVIZWxwUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHNpZ25hdHVyZUhlbHBUcmlnZ2VyQ2hhcmFjdGVyczogWycoJywgJywnXSxcbiAgICAgICAgcHJvdmlkZVNpZ25hdHVyZUhlbHA6IGFzeW5jIChtb2RlbCwgcG9zaXRpb24pID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgZmlsZVVyaSA9IG1vZGVsLnVyaS50b1N0cmluZygpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBTaWduYXR1cmVIZWxwIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvc2lnbmF0dXJlSGVscCcsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBmaWxlVXJpIH0sXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVzOiByZXN1bHQuc2lnbmF0dXJlcy5tYXAoKHNpZzogU2lnbmF0dXJlSW5mb3JtYXRpb24pID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogICAgICAgICBzaWcubGFiZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudGF0aW9uOiBzaWcuZG9jdW1lbnRhdGlvbiA/IG1hcmt1cFRvU3RyaW5nKHNpZy5kb2N1bWVudGF0aW9uKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6ICAgIChzaWcucGFyYW1ldGVycyA/PyBbXSkubWFwKChwOiBQYXJhbWV0ZXJJbmZvcm1hdGlvbikgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogICAgICAgICBwLmxhYmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50YXRpb246IHAuZG9jdW1lbnRhdGlvbiA/IG1hcmt1cFRvU3RyaW5nKHAuZG9jdW1lbnRhdGlvbikgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlU2lnbmF0dXJlOiByZXN1bHQuYWN0aXZlU2lnbmF0dXJlID8/IDAsXG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZVBhcmFtZXRlcjogcmVzdWx0LmFjdGl2ZVBhcmFtZXRlciA/PyAwLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge30sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckRlZmluaXRpb25Qcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZURlZmluaXRpb246IGFzeW5jIChtb2RlbCwgcG9zaXRpb24pID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgZmlsZVVyaSA9IG1vZGVsLnVyaS50b1N0cmluZygpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBMb2NhdGlvbiB8IExvY2F0aW9uW10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9kZWZpbml0aW9uJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IGZpbGVVcmkgfSxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogICAgIHsgbGluZTogcG9zaXRpb24ubGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogcG9zaXRpb24uY29sdW1uIC0gMSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBsb2NhdGlvbnMgPSBBcnJheS5pc0FycmF5KHJlc3VsdCkgPyByZXN1bHQgOiBbcmVzdWx0XTtcbiAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbnMubWFwKGxvYyA9PiAoe1xuICAgICAgICAgICAgICAgIHVyaTogICBtb25hY28uVXJpLnBhcnNlKGxvYy51cmkpLFxuICAgICAgICAgICAgICAgIHJhbmdlOiBsc3BSYW5nZVRvTW9uYWNvKGxvYy5yYW5nZSksXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyUmVmZXJlbmNlUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVSZWZlcmVuY2VzOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uLCBjb250ZXh0KSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogTG9jYXRpb25bXSB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L3JlZmVyZW5jZXMnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogICAgIHsgbGluZTogcG9zaXRpb24ubGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogcG9zaXRpb24uY29sdW1uIC0gMSB9LFxuICAgICAgICAgICAgICAgIGNvbnRleHQ6ICAgICAgeyBpbmNsdWRlRGVjbGFyYXRpb246IGNvbnRleHQuaW5jbHVkZURlY2xhcmF0aW9uIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQubWFwKGxvYyA9PiAoeyB1cmk6IG1vbmFjby5VcmkucGFyc2UobG9jLnVyaSksIHJhbmdlOiBsc3BSYW5nZVRvTW9uYWNvKGxvYy5yYW5nZSkgfSkpO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlclJlbmFtZVByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlUmVuYW1lRWRpdHM6IGFzeW5jIChtb2RlbCwgcG9zaXRpb24sIG5ld05hbWUpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiB7IGVkaXRzOiBbXSB9O1xuICAgICAgICAgICAgY29uc3QgZWRpdDogV29ya3NwYWNlRWRpdCB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L3JlbmFtZScsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICAgICAgbmV3TmFtZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHdvcmtzcGFjZUVkaXRUb01vbmFjbyhlZGl0KTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVzb2x2ZVJlbmFtZUxvY2F0aW9uOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0OiB7IHJhbmdlOiBMc3BSYW5nZTsgcGxhY2Vob2xkZXI/OiBzdHJpbmcgfSB8IExzcFJhbmdlIHwgbnVsbCA9XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvcHJlcGFyZVJlbmFtZScsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogICAgIHsgbGluZTogcG9zaXRpb24ubGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogcG9zaXRpb24uY29sdW1uIC0gMSB9LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSAncmFuZ2UnIGluIHJlc3VsdCA/IHJlc3VsdC5yYW5nZSA6IHJlc3VsdDtcbiAgICAgICAgICAgICAgICBjb25zdCBwbGFjZWhvbGRlciA9ICdwbGFjZWhvbGRlcicgaW4gcmVzdWx0ICYmIHJlc3VsdC5wbGFjZWhvbGRlclxuICAgICAgICAgICAgICAgICAgICA/IHJlc3VsdC5wbGFjZWhvbGRlclxuICAgICAgICAgICAgICAgICAgICA6IG1vZGVsLmdldFdvcmRBdFBvc2l0aW9uKHBvc2l0aW9uKT8ud29yZCA/PyAnJztcbiAgICAgICAgICAgICAgICByZXR1cm4geyByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhyYW5nZSksIHRleHQ6IHBsYWNlaG9sZGVyIH07XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICBjb25zdCB3b3JkID0gbW9kZWwuZ2V0V29yZEF0UG9zaXRpb24ocG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIHJldHVybiB3b3JkID8ge1xuICAgICAgICAgICAgICAgICAgICByYW5nZTogeyBzdGFydExpbmVOdW1iZXI6IHBvc2l0aW9uLmxpbmVOdW1iZXIsIHN0YXJ0Q29sdW1uOiB3b3JkLnN0YXJ0Q29sdW1uLCBlbmRMaW5lTnVtYmVyOiBwb3NpdGlvbi5saW5lTnVtYmVyLCBlbmRDb2x1bW46IHdvcmQuZW5kQ29sdW1uIH0sXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IHdvcmQud29yZCxcbiAgICAgICAgICAgICAgICB9IDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIFJlZ2lzdGVyaW5nIHRoaXMgcHJvdmlkZXIgYWxzbyBlbmFibGVzIGVkaXRvci5qcydzIGV4aXN0aW5nIGZvcm1hdC1vbi1zYXZlIHBhdGggZm9yIEphdmE6IHRoZVxuICAgIC8vIHNoYXJlZCBTYXZlIGFjdGlvbiBydW5zIGVkaXRvci5hY3Rpb24uZm9ybWF0RG9jdW1lbnQgd2hlbiBhdXRvLWZvcm1hdHRpbmcgaXMgb24gKHRoZSBzYW1lXG4gICAgLy8gbWVjaGFuaXNtIGFuZCBnbG9iYWwgdG9nZ2xlIHVzZWQgZm9yIFR5cGVTY3JpcHQpLlxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJEb2N1bWVudEZvcm1hdHRpbmdFZGl0UHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVEb2N1bWVudEZvcm1hdHRpbmdFZGl0czogYXN5bmMgKG1vZGVsKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGVkaXRzOiBUZXh0RWRpdFtdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvZm9ybWF0dGluZycsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6ICAgICAgeyB0YWJTaXplOiBtb2RlbC5nZXRPcHRpb25zKCkudGFiU2l6ZSwgaW5zZXJ0U3BhY2VzOiBtb2RlbC5nZXRPcHRpb25zKCkuaW5zZXJ0U3BhY2VzIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBlZGl0cyA/IGVkaXRzLm1hcCh0ZXh0RWRpdFRvTW9uYWNvKSA6IG51bGw7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyQ29kZUFjdGlvblByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlQ29kZUFjdGlvbnM6IGFzeW5jIChtb2RlbCwgcmFuZ2UsIGNvbnRleHQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVtcHR5ID0geyBhY3Rpb25zOiBbXSwgZGlzcG9zZSgpIHsgLyogbm90aGluZyB0byBkaXNwb3NlICovIH0gfTtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBlbXB0eTtcbiAgICAgICAgICAgIGNvbnN0IGRpYWdub3N0aWNzID0gKGNvbnRleHQubWFya2VycyA/PyBbXSkubWFwKG1hcmtlclRvTHNwRGlhZ25vc3RpYyk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IEFycmF5PENvZGVBY3Rpb24gfCBDb21tYW5kPiB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L2NvZGVBY3Rpb24nLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgICAgICByYW5nZTogICAgICAgIG1vbmFjb1JhbmdlVG9Mc3AocmFuZ2UpLFxuICAgICAgICAgICAgICAgIGNvbnRleHQ6ICAgICAgeyBkaWFnbm9zdGljcywgb25seTogY29udGV4dC5vbmx5ID8gW2NvbnRleHQub25seV0gOiB1bmRlZmluZWQgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQ/Lmxlbmd0aCkgcmV0dXJuIGVtcHR5O1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBhY3Rpb25zOiByZXN1bHQubWFwKGxzcENvZGVBY3Rpb25Ub01vbmFjbyksXG4gICAgICAgICAgICAgICAgZGlzcG9zZSgpIHsgLyogbm90aGluZyB0byBkaXNwb3NlICovIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgIH0sIHtcbiAgICAgICAgcHJvdmlkZWRDb2RlQWN0aW9uS2luZHM6IFsncXVpY2tmaXgnLCAncmVmYWN0b3InLCAncmVmYWN0b3IuZXh0cmFjdCcsICdyZWZhY3Rvci5pbmxpbmUnLFxuICAgICAgICAgICAgJ3JlZmFjdG9yLnJld3JpdGUnLCAnc291cmNlJywgJ3NvdXJjZS5vcmdhbml6ZUltcG9ydHMnXSxcbiAgICB9KTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gSGVscGVyc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiBsc3BTZXZlcml0eShzZXZlcml0eTogRGlhZ25vc3RpY1NldmVyaXR5IHwgdW5kZWZpbmVkKTogbW9uYWNvLk1hcmtlclNldmVyaXR5IHtcbiAgICBzd2l0Y2ggKHNldmVyaXR5KSB7XG4gICAgICAgIGNhc2UgRGlhZ25vc3RpY1NldmVyaXR5LkVycm9yOiAgICAgICByZXR1cm4gbW9uYWNvLk1hcmtlclNldmVyaXR5LkVycm9yO1xuICAgICAgICBjYXNlIERpYWdub3N0aWNTZXZlcml0eS5XYXJuaW5nOiAgICAgcmV0dXJuIG1vbmFjby5NYXJrZXJTZXZlcml0eS5XYXJuaW5nO1xuICAgICAgICBjYXNlIERpYWdub3N0aWNTZXZlcml0eS5JbmZvcm1hdGlvbjogcmV0dXJuIG1vbmFjby5NYXJrZXJTZXZlcml0eS5JbmZvO1xuICAgICAgICBjYXNlIERpYWdub3N0aWNTZXZlcml0eS5IaW50OiAgICAgICAgcmV0dXJuIG1vbmFjby5NYXJrZXJTZXZlcml0eS5IaW50O1xuICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vbmFjby5NYXJrZXJTZXZlcml0eS5FcnJvcjtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGxzcFJhbmdlVG9Nb25hY28ocjogeyBzdGFydDogeyBsaW5lOiBudW1iZXI7IGNoYXJhY3RlcjogbnVtYmVyIH07IGVuZDogeyBsaW5lOiBudW1iZXI7IGNoYXJhY3RlcjogbnVtYmVyIH0gfSk6IG1vbmFjby5JUmFuZ2Uge1xuICAgIHJldHVybiB7XG4gICAgICAgIHN0YXJ0TGluZU51bWJlcjogci5zdGFydC5saW5lICsgMSxcbiAgICAgICAgc3RhcnRDb2x1bW46ICAgICByLnN0YXJ0LmNoYXJhY3RlciArIDEsXG4gICAgICAgIGVuZExpbmVOdW1iZXI6ICAgci5lbmQubGluZSArIDEsXG4gICAgICAgIGVuZENvbHVtbjogICAgICAgci5lbmQuY2hhcmFjdGVyICsgMSxcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBtYXJrdXBUb1N0cmluZyhjOiBzdHJpbmcgfCBNYXJrdXBDb250ZW50KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdHlwZW9mIGMgPT09ICdzdHJpbmcnID8gYyA6IGMudmFsdWU7XG59XG5cbmZ1bmN0aW9uIGxzcENvbXBsZXRpb25LaW5kKGtpbmQ6IENvbXBsZXRpb25JdGVtS2luZCB8IHVuZGVmaW5lZCk6IG1vbmFjby5sYW5ndWFnZXMuQ29tcGxldGlvbkl0ZW1LaW5kIHtcbiAgICBjb25zdCBLID0gbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbUtpbmQ7XG4gICAgc3dpdGNoIChraW5kKSB7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLlRleHQ6ICAgICAgICAgIHJldHVybiBLLlRleHQ7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLk1ldGhvZDogICAgICAgIHJldHVybiBLLk1ldGhvZDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuRnVuY3Rpb246ICAgICAgcmV0dXJuIEsuRnVuY3Rpb247XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLkNvbnN0cnVjdG9yOiAgIHJldHVybiBLLkNvbnN0cnVjdG9yO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5GaWVsZDogICAgICAgICByZXR1cm4gSy5GaWVsZDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuVmFyaWFibGU6ICAgICAgcmV0dXJuIEsuVmFyaWFibGU7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLkNsYXNzOiAgICAgICAgIHJldHVybiBLLkNsYXNzO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5JbnRlcmZhY2U6ICAgICByZXR1cm4gSy5JbnRlcmZhY2U7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLk1vZHVsZTogICAgICAgIHJldHVybiBLLk1vZHVsZTtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuUHJvcGVydHk6ICAgICAgcmV0dXJuIEsuUHJvcGVydHk7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLktleXdvcmQ6ICAgICAgIHJldHVybiBLLktleXdvcmQ7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLlNuaXBwZXQ6ICAgICAgIHJldHVybiBLLlNuaXBwZXQ7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLkNvbnN0YW50OiAgICAgIHJldHVybiBLLkNvbnN0YW50O1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5TdHJ1Y3Q6ICAgICAgICByZXR1cm4gSy5TdHJ1Y3Q7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLlR5cGVQYXJhbWV0ZXI6IHJldHVybiBLLlR5cGVQYXJhbWV0ZXI7XG4gICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBLLlRleHQ7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBsc3BDb21wbGV0aW9uVG9Nb25hY28oXG4gICAgaXRlbTogQ29tcGxldGlvbkl0ZW0sXG4gICAgbW9kZWw6IG1vbmFjby5lZGl0b3IuSVRleHRNb2RlbCxcbiAgICBwb3NpdGlvbjogbW9uYWNvLlBvc2l0aW9uLFxuKTogTW9uYWNvQ29tcGxldGlvbkl0ZW0ge1xuICAgIGNvbnN0IHdvcmQgPSBtb2RlbC5nZXRXb3JkVW50aWxQb3NpdGlvbihwb3NpdGlvbik7XG4gICAgbGV0IHJhbmdlOiBtb25hY28uSVJhbmdlID0ge1xuICAgICAgICBzdGFydExpbmVOdW1iZXI6IHBvc2l0aW9uLmxpbmVOdW1iZXIsXG4gICAgICAgIHN0YXJ0Q29sdW1uOiAgICAgd29yZC5zdGFydENvbHVtbixcbiAgICAgICAgZW5kTGluZU51bWJlcjogICBwb3NpdGlvbi5saW5lTnVtYmVyLFxuICAgICAgICBlbmRDb2x1bW46ICAgICAgIHdvcmQuZW5kQ29sdW1uLFxuICAgIH07XG4gICAgbGV0IGluc2VydFRleHQgPSBpdGVtLmluc2VydFRleHQgPz8gaXRlbS5sYWJlbDtcbiAgICBjb25zdCB0ZXh0RWRpdCA9IGl0ZW0udGV4dEVkaXQgYXMgeyByYW5nZT86IExzcFJhbmdlOyByZXBsYWNlPzogTHNwUmFuZ2U7IGluc2VydD86IExzcFJhbmdlOyBuZXdUZXh0Pzogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG4gICAgaWYgKHRleHRFZGl0KSB7XG4gICAgICAgIGNvbnN0IHIgPSB0ZXh0RWRpdC5yYW5nZSA/PyB0ZXh0RWRpdC5yZXBsYWNlID8/IHRleHRFZGl0Lmluc2VydDtcbiAgICAgICAgaWYgKHIpIHJhbmdlID0gbHNwUmFuZ2VUb01vbmFjbyhyKTtcbiAgICAgICAgaWYgKHR5cGVvZiB0ZXh0RWRpdC5uZXdUZXh0ID09PSAnc3RyaW5nJykgaW5zZXJ0VGV4dCA9IHRleHRFZGl0Lm5ld1RleHQ7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdDogTW9uYWNvQ29tcGxldGlvbkl0ZW0gPSB7XG4gICAgICAgIGxhYmVsOiAgICAgICAgICAgaXRlbS5sYWJlbCxcbiAgICAgICAga2luZDogICAgICAgICAgICBsc3BDb21wbGV0aW9uS2luZChpdGVtLmtpbmQpLFxuICAgICAgICBkZXRhaWw6ICAgICAgICAgIGl0ZW0uZGV0YWlsLFxuICAgICAgICBkb2N1bWVudGF0aW9uOiAgIGl0ZW0uZG9jdW1lbnRhdGlvbiA/IHsgdmFsdWU6IG1hcmt1cFRvU3RyaW5nKGl0ZW0uZG9jdW1lbnRhdGlvbiksIGlzVHJ1c3RlZDogZmFsc2UgfSA6IHVuZGVmaW5lZCxcbiAgICAgICAgaW5zZXJ0VGV4dCxcbiAgICAgICAgaW5zZXJ0VGV4dFJ1bGVzOiBpdGVtLmluc2VydFRleHRGb3JtYXQgPT09IEluc2VydFRleHRGb3JtYXQuU25pcHBldFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG1vbmFjby5sYW5ndWFnZXMuQ29tcGxldGlvbkl0ZW1JbnNlcnRUZXh0UnVsZS5JbnNlcnRBc1NuaXBwZXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIHJhbmdlLFxuICAgICAgICBzb3J0VGV4dDogICAgICAgICAgICBzZGtQcmlvcml0aXNlZFNvcnRUZXh0KGl0ZW0pLFxuICAgICAgICBhZGRpdGlvbmFsVGV4dEVkaXRzOiBpdGVtLmFkZGl0aW9uYWxUZXh0RWRpdHM/Lm1hcCh0ZXh0RWRpdFRvTW9uYWNvKSxcbiAgICB9O1xuICAgIHJlc3VsdC5fbHNwID0gaXRlbTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFJhbmtzIERpcmlnaWJsZSBTREsgc3VnZ2VzdGlvbnMgKHtAY29kZSBvcmcuZWNsaXBzZS5kaXJpZ2libGUuc2RrLip9KSBhYm92ZSBldmVyeXRoaW5nIGVsc2UgYnlcbiAqIHByZWZpeGluZyB0aGUgc2VydmVyIHNvcnRUZXh0IHdpdGggYSBwcmlvcml0eSBidWNrZXQsIHByZXNlcnZpbmcgdGhlIHNlcnZlciBvcmRlciB3aXRoaW4gZWFjaCBidWNrZXQuXG4gKi9cbmZ1bmN0aW9uIHNka1ByaW9yaXRpc2VkU29ydFRleHQoaXRlbTogQ29tcGxldGlvbkl0ZW0pOiBzdHJpbmcge1xuICAgIGNvbnN0IGJhc2UgPSBpdGVtLnNvcnRUZXh0ID8/ICh0eXBlb2YgaXRlbS5sYWJlbCA9PT0gJ3N0cmluZycgPyBpdGVtLmxhYmVsIDogJycpO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gKGl0ZW0ubGFiZWxEZXRhaWxzICYmIHR5cGVvZiBpdGVtLmxhYmVsRGV0YWlscy5kZXNjcmlwdGlvbiA9PT0gJ3N0cmluZycpXG4gICAgICAgID8gaXRlbS5sYWJlbERldGFpbHMuZGVzY3JpcHRpb24gOiAnJztcbiAgICBjb25zdCBoYXlzdGFjayA9IGAke2l0ZW0uZGV0YWlsID8/ICcnfSAke2Rlc2NyaXB0aW9ufWA7XG4gICAgcmV0dXJuIGhheXN0YWNrLmluY2x1ZGVzKCdvcmcuZWNsaXBzZS5kaXJpZ2libGUuc2RrJykgPyBgMF8ke2Jhc2V9YCA6IGAxXyR7YmFzZX1gO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDb2RlIGFjdGlvbnMsIGNvbW1hbmRzLCByZWZhY3Rvci9nZW5lcmF0ZSwgd29ya3NwYWNlIGVkaXRzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBNb25hY28gY29tbWFuZCBpZCB1c2VkIHRvIGFwcGx5IGEgZGVmZXJyZWQgTFNQIGNvZGUgYWN0aW9uIHdoZW4gdGhlIHVzZXIgc2VsZWN0cyBpdC4gKi9cbmNvbnN0IEFQUExZX0FDVElPTl9DT01NQU5EID0gJ2RpcmlnaWJsZS5qYXZhLmFwcGx5Q29kZUFjdGlvbic7XG5cbnR5cGUgTHNwUmFuZ2UgPSB7IHN0YXJ0OiB7IGxpbmU6IG51bWJlcjsgY2hhcmFjdGVyOiBudW1iZXIgfTsgZW5kOiB7IGxpbmU6IG51bWJlcjsgY2hhcmFjdGVyOiBudW1iZXIgfSB9O1xuXG4vKiogTW9uYWNvIGNvbXBsZXRpb24gaXRlbSBjYXJyeWluZyB0aGUgb3JpZ2luYXRpbmcgTFNQIGl0ZW0gc28gcmVzb2x2ZSBjYW4gZmV0Y2ggaXRzIGltcG9ydCBlZGl0cy4gKi9cbnR5cGUgTW9uYWNvQ29tcGxldGlvbkl0ZW0gPSBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtICYgeyBfbHNwPzogQ29tcGxldGlvbkl0ZW0gfTtcblxuZnVuY3Rpb24gdGV4dEVkaXRUb01vbmFjbyhlZGl0OiBUZXh0RWRpdCk6IG1vbmFjby5sYW5ndWFnZXMuVGV4dEVkaXQge1xuICAgIHJldHVybiB7IHJhbmdlOiBsc3BSYW5nZVRvTW9uYWNvKGVkaXQucmFuZ2UpLCB0ZXh0OiBlZGl0Lm5ld1RleHQgfTtcbn1cblxuZnVuY3Rpb24gbW9uYWNvUmFuZ2VUb0xzcChyOiBtb25hY28uSVJhbmdlKTogTHNwUmFuZ2Uge1xuICAgIHJldHVybiB7XG4gICAgICAgIHN0YXJ0OiB7IGxpbmU6IHIuc3RhcnRMaW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiByLnN0YXJ0Q29sdW1uIC0gMSB9LFxuICAgICAgICBlbmQ6ICAgeyBsaW5lOiByLmVuZExpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHIuZW5kQ29sdW1uIC0gMSB9LFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIG1vbmFjb1NldmVyaXR5VG9Mc3Aoc2V2ZXJpdHk6IG1vbmFjby5NYXJrZXJTZXZlcml0eSk6IERpYWdub3N0aWNTZXZlcml0eSB7XG4gICAgc3dpdGNoIChzZXZlcml0eSkge1xuICAgICAgICBjYXNlIG1vbmFjby5NYXJrZXJTZXZlcml0eS5FcnJvcjogICByZXR1cm4gRGlhZ25vc3RpY1NldmVyaXR5LkVycm9yO1xuICAgICAgICBjYXNlIG1vbmFjby5NYXJrZXJTZXZlcml0eS5XYXJuaW5nOiByZXR1cm4gRGlhZ25vc3RpY1NldmVyaXR5Lldhcm5pbmc7XG4gICAgICAgIGNhc2UgbW9uYWNvLk1hcmtlclNldmVyaXR5LkluZm86ICAgIHJldHVybiBEaWFnbm9zdGljU2V2ZXJpdHkuSW5mb3JtYXRpb247XG4gICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBEaWFnbm9zdGljU2V2ZXJpdHkuSGludDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIG1hcmtlclRvTHNwRGlhZ25vc3RpYyhtOiBtb25hY28uZWRpdG9yLklNYXJrZXJEYXRhKTogRGlhZ25vc3RpYyB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcmFuZ2U6ICAgIHsgc3RhcnQ6IHsgbGluZTogbS5zdGFydExpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IG0uc3RhcnRDb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICAgICAgICAgIGVuZDogICB7IGxpbmU6IG0uZW5kTGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogbS5lbmRDb2x1bW4gLSAxIH0gfSxcbiAgICAgICAgbWVzc2FnZTogIG0ubWVzc2FnZSxcbiAgICAgICAgc2V2ZXJpdHk6IG1vbmFjb1NldmVyaXR5VG9Mc3AobS5zZXZlcml0eSksXG4gICAgICAgIHNvdXJjZTogICBtLnNvdXJjZSxcbiAgICB9IGFzIERpYWdub3N0aWM7XG59XG5cbmZ1bmN0aW9uIGxzcENvZGVBY3Rpb25Ub01vbmFjbyhhY3Rpb246IENvZGVBY3Rpb24gfCBDb21tYW5kKTogbW9uYWNvLmxhbmd1YWdlcy5Db2RlQWN0aW9uIHtcbiAgICBjb25zdCBpc0NvbW1hbmQgPSB0eXBlb2YgKGFjdGlvbiBhcyBDb21tYW5kKS5jb21tYW5kID09PSAnc3RyaW5nJztcbiAgICBjb25zdCB0aXRsZSA9IGFjdGlvbi50aXRsZVxuICAgICAgICA/PyAoaXNDb21tYW5kID8gKGFjdGlvbiBhcyBDb21tYW5kKS5jb21tYW5kIDogKGFjdGlvbiBhcyBDb2RlQWN0aW9uKS5jb21tYW5kPy50aXRsZSlcbiAgICAgICAgPz8gJ0FjdGlvbic7XG4gICAgY29uc3Qga2luZCA9IGlzQ29tbWFuZCA/ICdxdWlja2ZpeCcgOiAoKGFjdGlvbiBhcyBDb2RlQWN0aW9uKS5raW5kID8/ICdxdWlja2ZpeCcpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHRpdGxlLFxuICAgICAgICBraW5kLFxuICAgICAgICBkaWFnbm9zdGljczogW10sXG4gICAgICAgIGlzUHJlZmVycmVkOiAoYWN0aW9uIGFzIENvZGVBY3Rpb24pLmlzUHJlZmVycmVkLFxuICAgICAgICAvLyBBcHBseSBsYXppbHkgdGhyb3VnaCBvdXIgY29tbWFuZCBzbyB3ZSBjYW4gcmVzb2x2ZSwgcnVuIHNlcnZlciBjb21tYW5kcyBhbmQgYXBwbHkgZWRpdHMgdW5pZm9ybWx5LlxuICAgICAgICBjb21tYW5kOiB7IGlkOiBBUFBMWV9BQ1RJT05fQ09NTUFORCwgdGl0bGUsIGFyZ3VtZW50czogW2FjdGlvbl0gfSxcbiAgICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBhcHBseUNvZGVBY3Rpb24oYWN0aW9uOiBDb2RlQWN0aW9uIHwgQ29tbWFuZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghX2Nvbm4pIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIChhY3Rpb24gYXMgQ29tbWFuZCkuY29tbWFuZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGF3YWl0IHJ1blNlcnZlckNvbW1hbmQoYWN0aW9uIGFzIENvbW1hbmQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXNvbHZlZCA9IGFjdGlvbiBhcyBDb2RlQWN0aW9uO1xuICAgICAgICBpZiAoIXJlc29sdmVkLmVkaXQgJiYgKHJlc29sdmVkIGFzIHsgZGF0YT86IHVua25vd24gfSkuZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXNvbHZlZCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCdjb2RlQWN0aW9uL3Jlc29sdmUnLCByZXNvbHZlZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc29sdmVkLmVkaXQpIGFwcGx5V29ya3NwYWNlRWRpdChyZXNvbHZlZC5lZGl0KTtcbiAgICAgICAgaWYgKHJlc29sdmVkLmNvbW1hbmQpIGF3YWl0IHJ1blNlcnZlckNvbW1hbmQocmVzb2x2ZWQuY29tbWFuZCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tqYXZhLWxzcF0gY29kZSBhY3Rpb24gZmFpbGVkOicsIChlIGFzIEVycm9yKT8ubWVzc2FnZSA/PyBlKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGlzV29ya3NwYWNlRWRpdCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFdvcmtzcGFjZUVkaXQge1xuICAgIHJldHVybiAhIXZhbHVlICYmICghISh2YWx1ZSBhcyBXb3Jrc3BhY2VFZGl0KS5jaGFuZ2VzIHx8ICEhKHZhbHVlIGFzIFdvcmtzcGFjZUVkaXQpLmRvY3VtZW50Q2hhbmdlcyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1blNlcnZlckNvbW1hbmQoY21kOiBDb21tYW5kKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFfY29ubiB8fCAhY21kPy5jb21tYW5kKSByZXR1cm47XG4gICAgaWYgKEdFTkVSQVRFW2NtZC5jb21tYW5kXSkge1xuICAgICAgICBhd2FpdCBydW5HZW5lcmF0ZShjbWQuY29tbWFuZCwgY21kLmFyZ3VtZW50cyA/PyBbXSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3dvcmtzcGFjZS9leGVjdXRlQ29tbWFuZCcsIHsgY29tbWFuZDogY21kLmNvbW1hbmQsIGFyZ3VtZW50czogY21kLmFyZ3VtZW50cyA/PyBbXSB9KTtcbiAgICBpZiAoaXNXb3Jrc3BhY2VFZGl0KHJlc3VsdCkpIGFwcGx5V29ya3NwYWNlRWRpdChyZXN1bHQpO1xufVxuXG5pbnRlcmZhY2UgR2VuZXJhdGVTcGVjIHtcbiAgICBsYWJlbDogc3RyaW5nO1xuICAgIHN0YXR1czogc3RyaW5nO1xuICAgIGdlbmVyYXRlOiBzdHJpbmc7XG4gICAgbWVtYmVyczogKHN0YXR1czogYW55KSA9PiBBcnJheTx7IGxhYmVsOiBzdHJpbmc7IHJlZjogYW55IH0+O1xuICAgIGJ1aWxkQXJnczogKHByb21wdEFyZ3M6IGFueVtdLCBzdGF0dXM6IGFueSwgc2VsZWN0ZWQ6IGFueVtdKSA9PiBhbnlbXTtcbn1cblxuLyoqIE1lbWJlci1uYW1lZCBmaWVsZHMgXHUyMTkyIHBpY2tlciBsYWJlbHMuICovXG5mdW5jdGlvbiBmaWVsZExhYmVsKGY6IGFueSk6IHN0cmluZyB7XG4gICAgY29uc3QgbmFtZSA9IGY/Lm5hbWUgPz8gZj8uZmllbGROYW1lID8/ICcnO1xuICAgIGNvbnN0IHR5cGUgPSBmPy50eXBlID8/IGY/LnR5cGVOYW1lO1xuICAgIHJldHVybiB0eXBlID8gYCR7bmFtZX06ICR7dHlwZX1gIDogYCR7bmFtZX1gO1xufVxuXG4vKipcbiAqIFRoZSBKRFQuTFMgc291cmNlLWdlbmVyYXRpb24gY29tbWFuZHMgKGNvbnN0cnVjdG9ycywgZ2V0dGVycy9zZXR0ZXJzLCB0b1N0cmluZywgaGFzaENvZGUvZXF1YWxzKS5cbiAqIEVhY2ggbWFwcyB0aGUgY2xpZW50IFwiKlByb21wdFwiIGNvbW1hbmQgdG8gdGhlIHNlcnZlciBzdGF0dXMgKyBnZW5lcmF0ZSBkZWxlZ2F0ZSBjb21tYW5kczsgdGhlIHN0YXR1c1xuICogY2FsbCB5aWVsZHMgdGhlIGNhbmRpZGF0ZSBmaWVsZHMgc2hvd24gaW4gdGhlIG1lbWJlciBwaWNrZXIsIHRoZSBnZW5lcmF0ZSBjYWxsIHJldHVybnMgdGhlIGVkaXQuXG4gKi9cbmNvbnN0IEdFTkVSQVRFOiBSZWNvcmQ8c3RyaW5nLCBHZW5lcmF0ZVNwZWM+ID0ge1xuICAgICdqYXZhLmFjdGlvbi5nZW5lcmF0ZUNvbnN0cnVjdG9yc1Byb21wdCc6IHtcbiAgICAgICAgbGFiZWw6ICdTZWxlY3QgZmllbGRzIGFuZCBjb25zdHJ1Y3RvcnMnLFxuICAgICAgICBzdGF0dXM6ICdqYXZhLmFjdGlvbi5jaGVja0NvbnN0cnVjdG9yc1N0YXR1cycsXG4gICAgICAgIGdlbmVyYXRlOiAnamF2YS5hY3Rpb24uZ2VuZXJhdGVDb25zdHJ1Y3RvcnMnLFxuICAgICAgICBtZW1iZXJzOiAocykgPT4gKHM/LmZpZWxkcyA/PyBbXSkubWFwKChmOiBhbnkpID0+ICh7IGxhYmVsOiBmaWVsZExhYmVsKGYpLCByZWY6IGYgfSkpLFxuICAgICAgICBidWlsZEFyZ3M6IChhcmdzLCBzLCBzZWwpID0+IFthcmdzWzBdLCB7IGNvbnN0cnVjdG9yczogcz8uY29uc3RydWN0b3JzID8/IFtdLCBmaWVsZHM6IHNlbC5tYXAobSA9PiBtLnJlZikgfV0sXG4gICAgfSxcbiAgICAnamF2YS5hY3Rpb24uZ2VuZXJhdGVUb1N0cmluZ1Byb21wdCc6IHtcbiAgICAgICAgbGFiZWw6ICdTZWxlY3QgZmllbGRzIHRvIGluY2x1ZGUgaW4gdG9TdHJpbmcoKScsXG4gICAgICAgIHN0YXR1czogJ2phdmEuYWN0aW9uLmNoZWNrVG9TdHJpbmdTdGF0dXMnLFxuICAgICAgICBnZW5lcmF0ZTogJ2phdmEuYWN0aW9uLmdlbmVyYXRlVG9TdHJpbmcnLFxuICAgICAgICBtZW1iZXJzOiAocykgPT4gKHM/LmZpZWxkcyA/PyBbXSkubWFwKChmOiBhbnkpID0+ICh7IGxhYmVsOiBmaWVsZExhYmVsKGYpLCByZWY6IGYgfSkpLFxuICAgICAgICBidWlsZEFyZ3M6IChhcmdzLCBfcywgc2VsKSA9PiBbYXJnc1swXSwgc2VsLm1hcChtID0+IG0ucmVmKV0sXG4gICAgfSxcbiAgICAnamF2YS5hY3Rpb24uaGFzaENvZGVFcXVhbHNQcm9tcHQnOiB7XG4gICAgICAgIGxhYmVsOiAnU2VsZWN0IGZpZWxkcyBmb3IgaGFzaENvZGUoKSBhbmQgZXF1YWxzKCknLFxuICAgICAgICBzdGF0dXM6ICdqYXZhLmFjdGlvbi5jaGVja0hhc2hDb2RlRXF1YWxzU3RhdHVzJyxcbiAgICAgICAgZ2VuZXJhdGU6ICdqYXZhLmFjdGlvbi5nZW5lcmF0ZUhhc2hDb2RlRXF1YWxzJyxcbiAgICAgICAgbWVtYmVyczogKHMpID0+IChzPy5maWVsZHMgPz8gW10pLm1hcCgoZjogYW55KSA9PiAoeyBsYWJlbDogZmllbGRMYWJlbChmKSwgcmVmOiBmIH0pKSxcbiAgICAgICAgYnVpbGRBcmdzOiAoYXJncywgX3MsIHNlbCkgPT4gW2FyZ3NbMF0sIHNlbC5tYXAobSA9PiBtLnJlZiksIGZhbHNlXSxcbiAgICB9LFxuICAgICdqYXZhLmFjdGlvbi5nZW5lcmF0ZUFjY2Vzc29yc1Byb21wdCc6IHtcbiAgICAgICAgbGFiZWw6ICdTZWxlY3QgZmllbGRzIHRvIGdlbmVyYXRlIGdldHRlcnMgYW5kIHNldHRlcnMnLFxuICAgICAgICBzdGF0dXM6ICdqYXZhLmFjdGlvbi5jaGVja0FjY2Vzc29yc1N0YXR1cycsXG4gICAgICAgIGdlbmVyYXRlOiAnamF2YS5hY3Rpb24uZ2VuZXJhdGVBY2Nlc3NvcnMnLFxuICAgICAgICBtZW1iZXJzOiAocykgPT4gKHM/LmFjY2Vzc29ycyA/PyBzID8/IFtdKS5tYXAoKGE6IGFueSkgPT4gKHsgbGFiZWw6IGZpZWxkTGFiZWwoYSksIHJlZjogYSB9KSksXG4gICAgICAgIGJ1aWxkQXJnczogKGFyZ3MsIF9zLCBzZWwpID0+IFthcmdzWzBdLCBzZWwubWFwKG0gPT4gbS5yZWYpXSxcbiAgICB9LFxufTtcblxuYXN5bmMgZnVuY3Rpb24gcnVuR2VuZXJhdGUocHJvbXB0SWQ6IHN0cmluZywgYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIV9jb25uKSByZXR1cm47XG4gICAgY29uc3Qgc3BlYyA9IEdFTkVSQVRFW3Byb21wdElkXTtcbiAgICBjb25zdCBzdGF0dXMgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgnd29ya3NwYWNlL2V4ZWN1dGVDb21tYW5kJywgeyBjb21tYW5kOiBzcGVjLnN0YXR1cywgYXJndW1lbnRzOiBhcmdzIH0pO1xuICAgIGlmICghc3RhdHVzKSByZXR1cm47XG4gICAgY29uc3QgbWVtYmVycyA9IHNwZWMubWVtYmVycyhzdGF0dXMpO1xuICAgIGxldCBzZWxlY3RlZCA9IG1lbWJlcnM7XG4gICAgY29uc3QgcGlja2VyID0gKGdsb2JhbFRoaXMgYXMgYW55KS5qYXZhTHNwTWVtYmVyUGlja2VyO1xuICAgIGlmIChtZW1iZXJzLmxlbmd0aCAmJiB0eXBlb2YgcGlja2VyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNvbnN0IGNob3Nlbjogc3RyaW5nW10gfCBudWxsID0gYXdhaXQgcGlja2VyKHNwZWMubGFiZWwsIG1lbWJlcnMubWFwKG0gPT4gbS5sYWJlbCkpO1xuICAgICAgICBpZiAoY2hvc2VuID09PSBudWxsKSByZXR1cm47IC8vIHVzZXIgY2FuY2VsbGVkIHRoZSBkaWFsb2dcbiAgICAgICAgc2VsZWN0ZWQgPSBtZW1iZXJzLmZpbHRlcihtID0+IGNob3Nlbi5pbmNsdWRlcyhtLmxhYmVsKSk7XG4gICAgfVxuICAgIGNvbnN0IGVkaXQgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgnd29ya3NwYWNlL2V4ZWN1dGVDb21tYW5kJywge1xuICAgICAgICBjb21tYW5kOiBzcGVjLmdlbmVyYXRlLFxuICAgICAgICBhcmd1bWVudHM6IHNwZWMuYnVpbGRBcmdzKGFyZ3MsIHN0YXR1cywgc2VsZWN0ZWQpLFxuICAgIH0pO1xuICAgIGlmIChpc1dvcmtzcGFjZUVkaXQoZWRpdCkpIGFwcGx5V29ya3NwYWNlRWRpdChlZGl0KTtcbn1cblxuLyoqIEdyb3VwcyBhIHdvcmtzcGFjZSBlZGl0J3MgdGV4dCBlZGl0cyBieSBkb2N1bWVudCBhbmQgYXBwbGllcyB0aGVtIGluIHBsYWNlIHRvIG9wZW4gTW9uYWNvIG1vZGVscy4gKi9cbmZ1bmN0aW9uIGFwcGx5V29ya3NwYWNlRWRpdChlZGl0OiBXb3Jrc3BhY2VFZGl0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGlmICghZWRpdCkgcmV0dXJuO1xuICAgIGNvbnN0IGJ5VXJpOiBSZWNvcmQ8c3RyaW5nLCBUZXh0RWRpdFtdPiA9IHt9O1xuICAgIGlmIChlZGl0LmNoYW5nZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCB1cmkgaW4gZWRpdC5jaGFuZ2VzKSBieVVyaVt1cmldID0gKGJ5VXJpW3VyaV0gPz8gW10pLmNvbmNhdChlZGl0LmNoYW5nZXNbdXJpXSk7XG4gICAgfVxuICAgIGlmIChlZGl0LmRvY3VtZW50Q2hhbmdlcykge1xuICAgICAgICBmb3IgKGNvbnN0IGRjIG9mIGVkaXQuZG9jdW1lbnRDaGFuZ2VzIGFzIGFueVtdKSB7XG4gICAgICAgICAgICBpZiAoZGM/LnRleHREb2N1bWVudD8udXJpICYmIEFycmF5LmlzQXJyYXkoZGMuZWRpdHMpKSB7XG4gICAgICAgICAgICAgICAgYnlVcmlbZGMudGV4dERvY3VtZW50LnVyaV0gPSAoYnlVcmlbZGMudGV4dERvY3VtZW50LnVyaV0gPz8gW10pLmNvbmNhdChkYy5lZGl0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCB1cmkgaW4gYnlVcmkpIHtcbiAgICAgICAgY29uc3QgbW9kZWwgPSBtb25hY28uZWRpdG9yLmdldE1vZGVscygpLmZpbmQobSA9PiBtLnVyaS50b1N0cmluZygpID09PSB1cmkpO1xuICAgICAgICBpZiAoIW1vZGVsKSBjb250aW51ZTtcbiAgICAgICAgY29uc3Qgb3BzID0gYnlVcmlbdXJpXS5tYXAoZSA9PiAoeyByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhlLnJhbmdlKSwgdGV4dDogZS5uZXdUZXh0LCBmb3JjZU1vdmVNYXJrZXJzOiB0cnVlIH0pKTtcbiAgICAgICAgbW9kZWwucHVzaEVkaXRPcGVyYXRpb25zKFtdLCBvcHMsICgpID0+IG51bGwpO1xuICAgIH1cbn1cblxuLyoqIENvbnZlcnRzIGFuIExTUCB3b3Jrc3BhY2UgZWRpdCBpbnRvIHRoZSBNb25hY28gc2hhcGUgcmV0dXJuZWQgYnkgdGhlIHJlbmFtZSBwcm92aWRlci4gKi9cbmZ1bmN0aW9uIHdvcmtzcGFjZUVkaXRUb01vbmFjbyhlZGl0OiBXb3Jrc3BhY2VFZGl0IHwgbnVsbCk6IG1vbmFjby5sYW5ndWFnZXMuV29ya3NwYWNlRWRpdCB7XG4gICAgY29uc3QgZWRpdHM6IGFueVtdID0gW107XG4gICAgY29uc3QgcHVzaCA9ICh1cmk6IHN0cmluZywgbGlzdDogVGV4dEVkaXRbXSkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGUgb2YgbGlzdCkge1xuICAgICAgICAgICAgZWRpdHMucHVzaCh7IHJlc291cmNlOiBtb25hY28uVXJpLnBhcnNlKHVyaSksIHRleHRFZGl0OiB7IHJhbmdlOiBsc3BSYW5nZVRvTW9uYWNvKGUucmFuZ2UpLCB0ZXh0OiBlLm5ld1RleHQgfSwgdmVyc2lvbklkOiB1bmRlZmluZWQgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGlmIChlZGl0Py5jaGFuZ2VzKSB7XG4gICAgICAgIGZvciAoY29uc3QgdXJpIGluIGVkaXQuY2hhbmdlcykgcHVzaCh1cmksIGVkaXQuY2hhbmdlc1t1cmldKTtcbiAgICB9XG4gICAgaWYgKGVkaXQ/LmRvY3VtZW50Q2hhbmdlcykge1xuICAgICAgICBmb3IgKGNvbnN0IGRjIG9mIGVkaXQuZG9jdW1lbnRDaGFuZ2VzIGFzIGFueVtdKSB7XG4gICAgICAgICAgICBpZiAoZGM/LnRleHREb2N1bWVudD8udXJpICYmIEFycmF5LmlzQXJyYXkoZGMuZWRpdHMpKSBwdXNoKGRjLnRleHREb2N1bWVudC51cmksIGRjLmVkaXRzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBlZGl0cyB9O1xufVxuXG5mdW5jdGlvbiBqZHRsc1NldHRpbmdzKCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGphdmE6IHtcbiAgICAgICAgICAgIGltcG9ydDoge1xuICAgICAgICAgICAgICAgIG1hdmVuOiAgICAgIHsgZW5hYmxlZDogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIGdyYWRsZTogICAgIHsgZW5hYmxlZDogZmFsc2UgfSxcbiAgICAgICAgICAgICAgICBleGNsdXNpb25zOiBbJyoqL25vZGVfbW9kdWxlcy8qKicsICcqKi8ubWV0YWRhdGEvKionLCAnKiovYXJjaGV0eXBlLXJlc291cmNlcy8qKiddLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGF1dG9idWlsZDogeyBlbmFibGVkOiB0cnVlIH0sXG4gICAgICAgICAgICBjb21wbGV0aW9uOiB7XG4gICAgICAgICAgICAgICAgb3ZlcndyaXRlOiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgZ3Vlc3NNZXRob2RBcmd1bWVudHM6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGZpbHRlcmVkVHlwZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgJ2NvbS5zdW4uKicsICdzdW4uKicsICdqZGsuKicsXG4gICAgICAgICAgICAgICAgICAgICdvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuKicsXG4gICAgICAgICAgICAgICAgICAgICdvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLionLFxuICAgICAgICAgICAgICAgICAgICAnb3JnLmVjbGlwc2Uub3NnaS5pbnRlcm5hbC4qJyxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIGltcG9ydE9yZGVyOiBbJ2phdmEnLCAnamF2YXgnLCAnb3JnJywgJ2NvbScsICcnXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzaWduYXR1cmVIZWxwOiAgeyBlbmFibGVkOiB0cnVlIH0sXG4gICAgICAgICAgICBmb3JtYXQ6ICAgICAgICAgeyBlbmFibGVkOiB0cnVlIH0sXG4gICAgICAgICAgICBzYXZlQWN0aW9uczogICAgeyBvcmdhbml6ZUltcG9ydHM6IGZhbHNlIH0sXG4gICAgICAgIH0sXG4gICAgfTtcbn1cbiIsICIvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSAyMDI0IFR5cGVGb3ggYW5kIG90aGVycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExJQ0VOU0UgaW4gdGhlIHBhY2thZ2Ugcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5pbXBvcnQgeyBEaXNwb3NhYmxlIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuXG5leHBvcnQgY2xhc3MgRGlzcG9zYWJsZUNvbGxlY3Rpb24gaW1wbGVtZW50cyBEaXNwb3NhYmxlIHtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGlzcG9zYWJsZXM6IERpc3Bvc2FibGVbXSA9IFtdO1xuXG4gICAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICAgICAgd2hpbGUgKHRoaXMuZGlzcG9zYWJsZXMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmRpc3Bvc2FibGVzLnBvcCgpIS5kaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdXNoKGRpc3Bvc2FibGU6IERpc3Bvc2FibGUpOiBEaXNwb3NhYmxlIHtcbiAgICAgICAgY29uc3QgZGlzcG9zYWJsZXMgPSB0aGlzLmRpc3Bvc2FibGVzO1xuICAgICAgICBkaXNwb3NhYmxlcy5wdXNoKGRpc3Bvc2FibGUpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IGRpc3Bvc2FibGVzLmluZGV4T2YoZGlzcG9zYWJsZSk7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG59XG4iLCAiLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgMjAyNCBUeXBlRm94IGFuZCBvdGhlcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMSUNFTlNFIGluIHRoZSBwYWNrYWdlIHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuaW1wb3J0IHsgRGlzcG9zYWJsZSB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcbmltcG9ydCB0eXBlIHsgSUNvbm5lY3Rpb24gfSBmcm9tICcuLi9zZXJ2ZXIvY29ubmVjdGlvbi5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVdlYlNvY2tldCBleHRlbmRzIERpc3Bvc2FibGUge1xuICAgIHNlbmQoY29udGVudDogc3RyaW5nKTogdm9pZDtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIG9uTWVzc2FnZShjYjogKGRhdGE6IGFueSkgPT4gdm9pZCk6IHZvaWQ7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBvbkVycm9yKGNiOiAocmVhc29uOiBhbnkpID0+IHZvaWQpOiB2b2lkO1xuICAgIG9uQ2xvc2UoY2I6IChjb2RlOiBudW1iZXIsIHJlYXNvbjogc3RyaW5nKSA9PiB2b2lkKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJV2ViU29ja2V0Q29ubmVjdGlvbiBleHRlbmRzIElDb25uZWN0aW9uIHtcbiAgICByZWFkb25seSBzb2NrZXQ6IElXZWJTb2NrZXQ7XG59XG4iLCAiLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgMjAyNCBUeXBlRm94IGFuZCBvdGhlcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMSUNFTlNFIGluIHRoZSBwYWNrYWdlIHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuaW1wb3J0IHsgRGlzcG9zYWJsZSB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcbi8vIFRPRE86IFVzZSBlbnZpcm9ubWVudC1zcGVjaWZpYyBpbXBvcnRzICh2c2NvZGUtanNvbnJwYy9icm93c2VyIG9yIHZzY29kZS1qc29ucnBjL25vZGUpXG4vLyB3aGVuIHVwZ3JhZGluZyB0byB2c2NvZGUtanNvbnJwY0A5LngueC1uZXh0Llggd2hpY2ggc3VwcG9ydHMgcHJvcGVyIGV4cG9ydCBtYXBzXG5pbXBvcnQgeyB0eXBlIERhdGFDYWxsYmFjaywgQWJzdHJhY3RNZXNzYWdlUmVhZGVyLCBNZXNzYWdlUmVhZGVyIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuaW1wb3J0IHR5cGUgeyBJV2ViU29ja2V0IH0gZnJvbSAnLi9zb2NrZXQuanMnO1xuXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0TWVzc2FnZVJlYWRlciBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVJlYWRlciBpbXBsZW1lbnRzIE1lc3NhZ2VSZWFkZXIge1xuICAgIHByb3RlY3RlZCByZWFkb25seSBzb2NrZXQ6IElXZWJTb2NrZXQ7XG4gICAgcHJvdGVjdGVkIHN0YXRlOiAnaW5pdGlhbCcgfCAnbGlzdGVuaW5nJyB8ICdjbG9zZWQnID0gJ2luaXRpYWwnO1xuICAgIHByb3RlY3RlZCBjYWxsYmFjazogRGF0YUNhbGxiYWNrIHwgdW5kZWZpbmVkO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGV2ZW50czogQXJyYXk8eyBtZXNzYWdlPzogYW55LCBlcnJvcj86IGFueSB9PiA9IFtdO1xuXG4gICAgY29uc3RydWN0b3Ioc29ja2V0OiBJV2ViU29ja2V0KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuc29ja2V0ID0gc29ja2V0O1xuICAgICAgICB0aGlzLnNvY2tldC5vbk1lc3NhZ2UobWVzc2FnZSA9PlxuICAgICAgICAgICAgdGhpcy5yZWFkTWVzc2FnZShtZXNzYWdlKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLnNvY2tldC5vbkVycm9yKGVycm9yID0+XG4gICAgICAgICAgICB0aGlzLmZpcmVFcnJvcihlcnJvcilcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zb2NrZXQub25DbG9zZSgoY29kZSwgcmVhc29uKSA9PiB7XG4gICAgICAgICAgICBpZiAoY29kZSAhPT0gMTAwMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yOiBFcnJvciA9IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJycgKyBjb2RlLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgRXJyb3IgZHVyaW5nIHNvY2tldCByZWNvbm5lY3Q6IGNvZGUgPSAke2NvZGV9LCByZWFzb24gPSAke3JlYXNvbn1gXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmVFcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmZpcmVDbG9zZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBsaXN0ZW4oY2FsbGJhY2s6IERhdGFDYWxsYmFjayk6IERpc3Bvc2FibGUge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gJ2luaXRpYWwnKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gJ2xpc3RlbmluZyc7XG4gICAgICAgICAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgICAgICAgICB3aGlsZSAodGhpcy5ldmVudHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnQgPSB0aGlzLmV2ZW50cy5wb3AoKSE7XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50Lm1lc3NhZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlYWRNZXNzYWdlKGV2ZW50Lm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuZXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmVFcnJvcihldmVudC5lcnJvcik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlQ2xvc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jYWxsYmFjayA9PT0gY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9ICdpbml0aWFsJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjayA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgZGlzcG9zZSgpIHtcbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLnN0YXRlID0gJ2luaXRpYWwnO1xuICAgICAgICB0aGlzLmNhbGxiYWNrID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmV2ZW50cy5zcGxpY2UoMCwgdGhpcy5ldmVudHMubGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHByb3RlY3RlZCByZWFkTWVzc2FnZShtZXNzYWdlOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09ICdpbml0aWFsJykge1xuICAgICAgICAgICAgdGhpcy5ldmVudHMuc3BsaWNlKDAsIDAsIHsgbWVzc2FnZSB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlID09PSAnbGlzdGVuaW5nJykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNhbGxiYWNrIShkYXRhKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yOiBFcnJvciA9IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJycgKyA0MDAsXG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBFcnJvciBkdXJpbmcgbWVzc2FnZSBwYXJzaW5nLCByZWFzb24gPSAke3R5cGVvZiBlcnIgPT09ICdvYmplY3QnID8gKGVyciBhcyBhbnkpLm1lc3NhZ2UgOiAndW5rbm93bid9YFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZmlyZUVycm9yKGVycm9yOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09ICdpbml0aWFsJykge1xuICAgICAgICAgICAgdGhpcy5ldmVudHMuc3BsaWNlKDAsIDAsIHsgZXJyb3IgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZSA9PT0gJ2xpc3RlbmluZycpIHtcbiAgICAgICAgICAgIHN1cGVyLmZpcmVFcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZmlyZUNsb3NlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gJ2luaXRpYWwnKSB7XG4gICAgICAgICAgICB0aGlzLmV2ZW50cy5zcGxpY2UoMCwgMCwge30pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUgPT09ICdsaXN0ZW5pbmcnKSB7XG4gICAgICAgICAgICBzdXBlci5maXJlQ2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0YXRlID0gJ2Nsb3NlZCc7XG4gICAgfVxufVxuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjQgVHlwZUZveCBhbmQgb3RoZXJzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTElDRU5TRSBpbiB0aGUgcGFja2FnZSByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbmltcG9ydCB7IE1lc3NhZ2UgfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG5pbXBvcnQgeyBBYnN0cmFjdE1lc3NhZ2VXcml0ZXIsIE1lc3NhZ2VXcml0ZXIgfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG5pbXBvcnQgdHlwZSB7IElXZWJTb2NrZXQgfSBmcm9tICcuL3NvY2tldC5qcyc7XG5cbmV4cG9ydCBjbGFzcyBXZWJTb2NrZXRNZXNzYWdlV3JpdGVyIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlV3JpdGVyIGltcGxlbWVudHMgTWVzc2FnZVdyaXRlciB7XG4gICAgcHJvdGVjdGVkIGVycm9yQ291bnQgPSAwO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBzb2NrZXQ6IElXZWJTb2NrZXQ7XG5cbiAgICBjb25zdHJ1Y3Rvcihzb2NrZXQ6IElXZWJTb2NrZXQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7XG4gICAgfVxuXG4gICAgZW5kKCk6IHZvaWQge1xuICAgIH1cblxuICAgIGFzeW5jIHdyaXRlKG1zZzogTWVzc2FnZSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgY29udGVudCA9IEpTT04uc3RyaW5naWZ5KG1zZyk7XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKGNvbnRlbnQpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmVycm9yQ291bnQrKztcbiAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGUsIG1zZywgdGhpcy5lcnJvckNvdW50KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICIvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSAyMDI0IFR5cGVGb3ggYW5kIG90aGVycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExJQ0VOU0UgaW4gdGhlIHBhY2thZ2Ugcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5pbXBvcnQgdHlwZSB7IE1lc3NhZ2VDb25uZWN0aW9uLCBMb2dnZXIgfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG5pbXBvcnQgeyBjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcbmltcG9ydCB0eXBlIHsgSVdlYlNvY2tldCB9IGZyb20gJy4vc29ja2V0LmpzJztcbmltcG9ydCB7IFdlYlNvY2tldE1lc3NhZ2VSZWFkZXIgfSBmcm9tICcuL3JlYWRlci5qcyc7XG5pbXBvcnQgeyBXZWJTb2NrZXRNZXNzYWdlV3JpdGVyIH0gZnJvbSAnLi93cml0ZXIuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlV2ViU29ja2V0Q29ubmVjdGlvbihzb2NrZXQ6IElXZWJTb2NrZXQsIGxvZ2dlcjogTG9nZ2VyKTogTWVzc2FnZUNvbm5lY3Rpb24ge1xuICAgIGNvbnN0IG1lc3NhZ2VSZWFkZXIgPSBuZXcgV2ViU29ja2V0TWVzc2FnZVJlYWRlcihzb2NrZXQpO1xuICAgIGNvbnN0IG1lc3NhZ2VXcml0ZXIgPSBuZXcgV2ViU29ja2V0TWVzc2FnZVdyaXRlcihzb2NrZXQpO1xuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbihtZXNzYWdlUmVhZGVyLCBtZXNzYWdlV3JpdGVyLCBsb2dnZXIpO1xuICAgIGNvbm5lY3Rpb24ub25DbG9zZSgoKSA9PiBjb25uZWN0aW9uLmRpc3Bvc2UoKSk7XG4gICAgcmV0dXJuIGNvbm5lY3Rpb247XG59XG4iLCAiLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgMjAyNCBUeXBlRm94IGFuZCBvdGhlcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMSUNFTlNFIGluIHRoZSBwYWNrYWdlIHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuaW1wb3J0IHR5cGUgeyBNZXNzYWdlQ29ubmVjdGlvbiwgTG9nZ2VyIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuaW1wb3J0IHsgY3JlYXRlV2ViU29ja2V0Q29ubmVjdGlvbiB9IGZyb20gJy4vc29ja2V0L2Nvbm5lY3Rpb24uanMnO1xuaW1wb3J0IHR5cGUgeyBJV2ViU29ja2V0IH0gZnJvbSAnLi9zb2NrZXQvc29ja2V0LmpzJztcbmltcG9ydCB7IENvbnNvbGVMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBsaXN0ZW4ob3B0aW9uczoge1xuICAgIHdlYlNvY2tldDogV2ViU29ja2V0O1xuICAgIGxvZ2dlcj86IExvZ2dlcjtcbiAgICBvbkNvbm5lY3Rpb246IChjb25uZWN0aW9uOiBNZXNzYWdlQ29ubmVjdGlvbikgPT4gdm9pZDtcbn0pIHtcbiAgICBjb25zdCB7IHdlYlNvY2tldCwgb25Db25uZWN0aW9uIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IGxvZ2dlciA9IG9wdGlvbnMubG9nZ2VyIHx8IG5ldyBDb25zb2xlTG9nZ2VyKCk7XG4gICAgd2ViU29ja2V0Lm9ub3BlbiA9ICgpID0+IHtcbiAgICAgICAgY29uc3Qgc29ja2V0ID0gdG9Tb2NrZXQod2ViU29ja2V0KTtcbiAgICAgICAgY29uc3QgY29ubmVjdGlvbiA9IGNyZWF0ZVdlYlNvY2tldENvbm5lY3Rpb24oc29ja2V0LCBsb2dnZXIpO1xuICAgICAgICBvbkNvbm5lY3Rpb24oY29ubmVjdGlvbik7XG4gICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvU29ja2V0KHdlYlNvY2tldDogV2ViU29ja2V0KTogSVdlYlNvY2tldCB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc2VuZDogY29udGVudCA9PiB3ZWJTb2NrZXQuc2VuZChjb250ZW50KSxcbiAgICAgICAgb25NZXNzYWdlOiBjYiA9PiB7XG4gICAgICAgICAgICB3ZWJTb2NrZXQub25tZXNzYWdlID0gZXZlbnQgPT4gY2IoZXZlbnQuZGF0YSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uRXJyb3I6IGNiID0+IHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICB3ZWJTb2NrZXQub25lcnJvciA9IChldmVudDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5oYXNPd24oZXZlbnQsICdtZXNzYWdlJykpIHtcbiAgICAgICAgICAgICAgICAgICAgY2IoZXZlbnQubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgb25DbG9zZTogY2IgPT4ge1xuICAgICAgICAgICAgd2ViU29ja2V0Lm9uY2xvc2UgPSBldmVudCA9PiBjYihldmVudC5jb2RlLCBldmVudC5yZWFzb24pO1xuICAgICAgICB9LFxuICAgICAgICBkaXNwb3NlOiAoKSA9PiB3ZWJTb2NrZXQuY2xvc2UoKVxuICAgIH07XG59XG4iLCAiLypcbiAqIENvcHlyaWdodCAoYykgMjAxMC0yMDI2IEVjbGlwc2UgRGlyaWdpYmxlIGNvbnRyaWJ1dG9yc1xuICpcbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZVxuICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjIuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjIwLmh0bWxcbiAqXG4gKiBTUERYLUZpbGVDb3B5cmlnaHRUZXh0OiBFY2xpcHNlIERpcmlnaWJsZSBjb250cmlidXRvcnMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjBcbiAqL1xuXG4vKipcbiAqIExhenkgUHJveHkgc2hpbSBmb3IgTW9uYWNvIEVkaXRvciBsb2FkZWQgdmlhIEFNRC5cbiAqXG4gKiBlZGl0b3IuanMgc2V0cyBnbG9iYWxUaGlzLm1vbmFjbyBpbnNpZGUgdGhlIEFNRCByZXF1aXJlKCkgY2FsbGJhY2ssIGJlZm9yZSBhbnlcbiAqIEphdmFMc3BDbGllbnRMaWIuY29ubmVjdCgpIGNhbGwuIEFsbCBwcm9wZXJ0eSBhY2Nlc3NlcyBnbyB0aHJvdWdoIFByb3h5LmdldCgpIHRyYXBzXG4gKiBzbyB0aGV5IHJlc29sdmUgYWdhaW5zdCB0aGUgbGl2ZSB3aW5kb3cubW9uYWNvIGF0IGNhbGwgdGltZSwgbm90IGF0IGJ1bmRsZSBsb2FkIHRpbWUuXG4gKlxuICogVHlwZVNjcmlwdCByZXNvbHZlcyB0eXBlcyBmcm9tIHRoZSByZWFsIG1vbmFjby1lZGl0b3IgZGV2RGVwZW5kZW5jeTsgZXNidWlsZCByZXBsYWNlc1xuICogdGhlIFwibW9uYWNvLWVkaXRvclwiIGltcG9ydCB3aXRoIHRoaXMgZmlsZSBhdCBidW5kbGUgdGltZSB2aWEgdGhlIGFsaWFzIG9wdGlvbi5cbiAqL1xuXG50eXBlIE0gPSB0eXBlb2YgaW1wb3J0KCdtb25hY28tZWRpdG9yJyk7XG5cbmZ1bmN0aW9uIG0oKTogTSB7XG4gICAgcmV0dXJuIChnbG9iYWxUaGlzIGFzIGFueSkubW9uYWNvIGFzIE07XG59XG5cbmZ1bmN0aW9uIG5zPFQgZXh0ZW5kcyBvYmplY3Q+KGdldHRlcjogKCkgPT4gVCk6IFQge1xuICAgIHJldHVybiBuZXcgUHJveHkoe30gYXMgVCwge1xuICAgICAgICBnZXQ6IChfLCBrKSA9PiAoZ2V0dGVyKCkgYXMgYW55KVtrIGFzIHN0cmluZ10sXG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGNsczxUPihnZXR0ZXI6ICgpID0+IFQpOiBUIHtcbiAgICByZXR1cm4gbmV3IFByb3h5KGZ1bmN0aW9uICgpIHt9IGFzIGFueSwge1xuICAgICAgICBjb25zdHJ1Y3Q6IChfLCBhcmdzKSA9PiBuZXcgKGdldHRlcigpIGFzIGFueSkoLi4uYXJncyksXG4gICAgICAgIGdldDogICAgICAgKF8sIGspICAgID0+IChnZXR0ZXIoKSBhcyBhbnkpW2sgYXMgc3RyaW5nXSxcbiAgICB9KSBhcyBUO1xufVxuXG5leHBvcnQgY29uc3QgZWRpdG9yICAgICAgICAgPSBucygoKSA9PiBtKCkuZWRpdG9yKTtcbmV4cG9ydCBjb25zdCBsYW5ndWFnZXMgICAgICA9IG5zKCgpID0+IG0oKS5sYW5ndWFnZXMpO1xuZXhwb3J0IGNvbnN0IE1hcmtlclNldmVyaXR5ID0gbnMoKCkgPT4gbSgpLk1hcmtlclNldmVyaXR5KTtcbmV4cG9ydCBjb25zdCBNYXJrZXJUYWcgICAgICA9IG5zKCgpID0+IChtKCkgYXMgYW55KS5NYXJrZXJUYWcpO1xuZXhwb3J0IGNvbnN0IFVyaSAgICAgICAgICAgID0gY2xzKCgpID0+IG0oKS5VcmkpO1xuZXhwb3J0IGNvbnN0IFJhbmdlICAgICAgICAgID0gY2xzKCgpID0+IG0oKS5SYW5nZSk7XG5leHBvcnQgY29uc3QgUG9zaXRpb24gICAgICAgPSBjbHMoKCkgPT4gbSgpLlBvc2l0aW9uKTtcbmV4cG9ydCBjb25zdCBTZWxlY3Rpb24gICAgICA9IGNscygoKSA9PiBtKCkuU2VsZWN0aW9uKTtcbmV4cG9ydCBjb25zdCBLZXlDb2RlICAgICAgICA9IG5zKCgpID0+IG0oKS5LZXlDb2RlKTtcbmV4cG9ydCBjb25zdCBLZXlNb2QgICAgICAgICA9IG5zKCgpID0+IG0oKS5LZXlNb2QpO1xuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbid1c2Ugc3RyaWN0JztcbmV4cG9ydCB2YXIgRG9jdW1lbnRVcmk7XG4oZnVuY3Rpb24gKERvY3VtZW50VXJpKSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZyc7XG4gICAgfVxuICAgIERvY3VtZW50VXJpLmlzID0gaXM7XG59KShEb2N1bWVudFVyaSB8fCAoRG9jdW1lbnRVcmkgPSB7fSkpO1xuZXhwb3J0IHZhciBVUkk7XG4oZnVuY3Rpb24gKFVSSSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnO1xuICAgIH1cbiAgICBVUkkuaXMgPSBpcztcbn0pKFVSSSB8fCAoVVJJID0ge30pKTtcbmV4cG9ydCB2YXIgaW50ZWdlcjtcbihmdW5jdGlvbiAoaW50ZWdlcikge1xuICAgIGludGVnZXIuTUlOX1ZBTFVFID0gLTIxNDc0ODM2NDg7XG4gICAgaW50ZWdlci5NQVhfVkFMVUUgPSAyMTQ3NDgzNjQ3O1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIGludGVnZXIuTUlOX1ZBTFVFIDw9IHZhbHVlICYmIHZhbHVlIDw9IGludGVnZXIuTUFYX1ZBTFVFO1xuICAgIH1cbiAgICBpbnRlZ2VyLmlzID0gaXM7XG59KShpbnRlZ2VyIHx8IChpbnRlZ2VyID0ge30pKTtcbmV4cG9ydCB2YXIgdWludGVnZXI7XG4oZnVuY3Rpb24gKHVpbnRlZ2VyKSB7XG4gICAgdWludGVnZXIuTUlOX1ZBTFVFID0gMDtcbiAgICB1aW50ZWdlci5NQVhfVkFMVUUgPSAyMTQ3NDgzNjQ3O1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIHVpbnRlZ2VyLk1JTl9WQUxVRSA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSB1aW50ZWdlci5NQVhfVkFMVUU7XG4gICAgfVxuICAgIHVpbnRlZ2VyLmlzID0gaXM7XG59KSh1aW50ZWdlciB8fCAodWludGVnZXIgPSB7fSkpO1xuLyoqXG4gKiBUaGUgUG9zaXRpb24gbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgUG9zaXRpb259IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIFBvc2l0aW9uO1xuKGZ1bmN0aW9uIChQb3NpdGlvbikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgUG9zaXRpb24gbGl0ZXJhbCBmcm9tIHRoZSBnaXZlbiBsaW5lIGFuZCBjaGFyYWN0ZXIuXG4gICAgICogQHBhcmFtIGxpbmUgVGhlIHBvc2l0aW9uJ3MgbGluZS5cbiAgICAgKiBAcGFyYW0gY2hhcmFjdGVyIFRoZSBwb3NpdGlvbidzIGNoYXJhY3Rlci5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobGluZSwgY2hhcmFjdGVyKSB7XG4gICAgICAgIGlmIChsaW5lID09PSBOdW1iZXIuTUFYX1ZBTFVFKSB7XG4gICAgICAgICAgICBsaW5lID0gdWludGVnZXIuTUFYX1ZBTFVFO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFyYWN0ZXIgPT09IE51bWJlci5NQVhfVkFMVUUpIHtcbiAgICAgICAgICAgIGNoYXJhY3RlciA9IHVpbnRlZ2VyLk1BWF9WQUxVRTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBsaW5lLCBjaGFyYWN0ZXIgfTtcbiAgICB9XG4gICAgUG9zaXRpb24uY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgUG9zaXRpb259IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgSXMudWludGVnZXIoY2FuZGlkYXRlLmxpbmUpICYmIElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS5jaGFyYWN0ZXIpO1xuICAgIH1cbiAgICBQb3NpdGlvbi5pcyA9IGlzO1xufSkoUG9zaXRpb24gfHwgKFBvc2l0aW9uID0ge30pKTtcbi8qKlxuICogVGhlIFJhbmdlIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIFJhbmdlfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBSYW5nZTtcbihmdW5jdGlvbiAoUmFuZ2UpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUob25lLCB0d28sIHRocmVlLCBmb3VyKSB7XG4gICAgICAgIGlmIChJcy51aW50ZWdlcihvbmUpICYmIElzLnVpbnRlZ2VyKHR3bykgJiYgSXMudWludGVnZXIodGhyZWUpICYmIElzLnVpbnRlZ2VyKGZvdXIpKSB7XG4gICAgICAgICAgICByZXR1cm4geyBzdGFydDogUG9zaXRpb24uY3JlYXRlKG9uZSwgdHdvKSwgZW5kOiBQb3NpdGlvbi5jcmVhdGUodGhyZWUsIGZvdXIpIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoUG9zaXRpb24uaXMob25lKSAmJiBQb3NpdGlvbi5pcyh0d28pKSB7XG4gICAgICAgICAgICByZXR1cm4geyBzdGFydDogb25lLCBlbmQ6IHR3byB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSYW5nZSNjcmVhdGUgY2FsbGVkIHdpdGggaW52YWxpZCBhcmd1bWVudHNbJHtvbmV9LCAke3R3b30sICR7dGhyZWV9LCAke2ZvdXJ9XWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIFJhbmdlLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIFJhbmdlfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIFBvc2l0aW9uLmlzKGNhbmRpZGF0ZS5zdGFydCkgJiYgUG9zaXRpb24uaXMoY2FuZGlkYXRlLmVuZCk7XG4gICAgfVxuICAgIFJhbmdlLmlzID0gaXM7XG59KShSYW5nZSB8fCAoUmFuZ2UgPSB7fSkpO1xuLyoqXG4gKiBUaGUgTG9jYXRpb24gbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgTG9jYXRpb259IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIExvY2F0aW9uO1xuKGZ1bmN0aW9uIChMb2NhdGlvbikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBMb2NhdGlvbiBsaXRlcmFsLlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIGxvY2F0aW9uJ3MgdXJpLlxuICAgICAqIEBwYXJhbSByYW5nZSBUaGUgbG9jYXRpb24ncyByYW5nZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodXJpLCByYW5nZSkge1xuICAgICAgICByZXR1cm4geyB1cmksIHJhbmdlIH07XG4gICAgfVxuICAgIExvY2F0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIExvY2F0aW9ufSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgKElzLnN0cmluZyhjYW5kaWRhdGUudXJpKSB8fCBJcy51bmRlZmluZWQoY2FuZGlkYXRlLnVyaSkpO1xuICAgIH1cbiAgICBMb2NhdGlvbi5pcyA9IGlzO1xufSkoTG9jYXRpb24gfHwgKExvY2F0aW9uID0ge30pKTtcbi8qKlxuICogVGhlIExvY2F0aW9uTGluayBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBMb2NhdGlvbkxpbmt9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIExvY2F0aW9uTGluaztcbihmdW5jdGlvbiAoTG9jYXRpb25MaW5rKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIExvY2F0aW9uTGluayBsaXRlcmFsLlxuICAgICAqIEBwYXJhbSB0YXJnZXRVcmkgVGhlIGRlZmluaXRpb24ncyB1cmkuXG4gICAgICogQHBhcmFtIHRhcmdldFJhbmdlIFRoZSBmdWxsIHJhbmdlIG9mIHRoZSBkZWZpbml0aW9uLlxuICAgICAqIEBwYXJhbSB0YXJnZXRTZWxlY3Rpb25SYW5nZSBUaGUgc3BhbiBvZiB0aGUgc3ltYm9sIGRlZmluaXRpb24gYXQgdGhlIHRhcmdldC5cbiAgICAgKiBAcGFyYW0gb3JpZ2luU2VsZWN0aW9uUmFuZ2UgVGhlIHNwYW4gb2YgdGhlIHN5bWJvbCBiZWluZyBkZWZpbmVkIGluIHRoZSBvcmlnaW5hdGluZyBzb3VyY2UgZmlsZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodGFyZ2V0VXJpLCB0YXJnZXRSYW5nZSwgdGFyZ2V0U2VsZWN0aW9uUmFuZ2UsIG9yaWdpblNlbGVjdGlvblJhbmdlKSB7XG4gICAgICAgIHJldHVybiB7IHRhcmdldFVyaSwgdGFyZ2V0UmFuZ2UsIHRhcmdldFNlbGVjdGlvblJhbmdlLCBvcmlnaW5TZWxlY3Rpb25SYW5nZSB9O1xuICAgIH1cbiAgICBMb2NhdGlvbkxpbmsuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgTG9jYXRpb25MaW5rfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS50YXJnZXRSYW5nZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS50YXJnZXRVcmkpXG4gICAgICAgICAgICAmJiBSYW5nZS5pcyhjYW5kaWRhdGUudGFyZ2V0U2VsZWN0aW9uUmFuZ2UpXG4gICAgICAgICAgICAmJiAoUmFuZ2UuaXMoY2FuZGlkYXRlLm9yaWdpblNlbGVjdGlvblJhbmdlKSB8fCBJcy51bmRlZmluZWQoY2FuZGlkYXRlLm9yaWdpblNlbGVjdGlvblJhbmdlKSk7XG4gICAgfVxuICAgIExvY2F0aW9uTGluay5pcyA9IGlzO1xufSkoTG9jYXRpb25MaW5rIHx8IChMb2NhdGlvbkxpbmsgPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29sb3IgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgQ29sb3J9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIENvbG9yO1xuKGZ1bmN0aW9uIChDb2xvcikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ29sb3IgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJlZCxcbiAgICAgICAgICAgIGdyZWVuLFxuICAgICAgICAgICAgYmx1ZSxcbiAgICAgICAgICAgIGFscGhhLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBDb2xvci5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBDb2xvcn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIElzLm51bWJlclJhbmdlKGNhbmRpZGF0ZS5yZWQsIDAsIDEpXG4gICAgICAgICAgICAmJiBJcy5udW1iZXJSYW5nZShjYW5kaWRhdGUuZ3JlZW4sIDAsIDEpXG4gICAgICAgICAgICAmJiBJcy5udW1iZXJSYW5nZShjYW5kaWRhdGUuYmx1ZSwgMCwgMSlcbiAgICAgICAgICAgICYmIElzLm51bWJlclJhbmdlKGNhbmRpZGF0ZS5hbHBoYSwgMCwgMSk7XG4gICAgfVxuICAgIENvbG9yLmlzID0gaXM7XG59KShDb2xvciB8fCAoQ29sb3IgPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29sb3JJbmZvcm1hdGlvbiBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBDb2xvckluZm9ybWF0aW9ufSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBDb2xvckluZm9ybWF0aW9uO1xuKGZ1bmN0aW9uIChDb2xvckluZm9ybWF0aW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDb2xvckluZm9ybWF0aW9uIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCBjb2xvcikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmFuZ2UsXG4gICAgICAgICAgICBjb2xvcixcbiAgICAgICAgfTtcbiAgICB9XG4gICAgQ29sb3JJbmZvcm1hdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBDb2xvckluZm9ybWF0aW9ufSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiBDb2xvci5pcyhjYW5kaWRhdGUuY29sb3IpO1xuICAgIH1cbiAgICBDb2xvckluZm9ybWF0aW9uLmlzID0gaXM7XG59KShDb2xvckluZm9ybWF0aW9uIHx8IChDb2xvckluZm9ybWF0aW9uID0ge30pKTtcbi8qKlxuICogVGhlIENvbG9yIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIENvbG9yUHJlc2VudGF0aW9ufSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBDb2xvclByZXNlbnRhdGlvbjtcbihmdW5jdGlvbiAoQ29sb3JQcmVzZW50YXRpb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENvbG9ySW5mb3JtYXRpb24gbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobGFiZWwsIHRleHRFZGl0LCBhZGRpdGlvbmFsVGV4dEVkaXRzKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICAgIHRleHRFZGl0LFxuICAgICAgICAgICAgYWRkaXRpb25hbFRleHRFZGl0cyxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgQ29sb3JQcmVzZW50YXRpb24uY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgQ29sb3JJbmZvcm1hdGlvbn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUubGFiZWwpXG4gICAgICAgICAgICAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS50ZXh0RWRpdCkgfHwgVGV4dEVkaXQuaXMoY2FuZGlkYXRlKSlcbiAgICAgICAgICAgICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLmFkZGl0aW9uYWxUZXh0RWRpdHMpIHx8IElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLmFkZGl0aW9uYWxUZXh0RWRpdHMsIFRleHRFZGl0LmlzKSk7XG4gICAgfVxuICAgIENvbG9yUHJlc2VudGF0aW9uLmlzID0gaXM7XG59KShDb2xvclByZXNlbnRhdGlvbiB8fCAoQ29sb3JQcmVzZW50YXRpb24gPSB7fSkpO1xuLyoqXG4gKiBBIHNldCBvZiBwcmVkZWZpbmVkIHJhbmdlIGtpbmRzLlxuICovXG5leHBvcnQgdmFyIEZvbGRpbmdSYW5nZUtpbmQ7XG4oZnVuY3Rpb24gKEZvbGRpbmdSYW5nZUtpbmQpIHtcbiAgICAvKipcbiAgICAgKiBGb2xkaW5nIHJhbmdlIGZvciBhIGNvbW1lbnRcbiAgICAgKi9cbiAgICBGb2xkaW5nUmFuZ2VLaW5kLkNvbW1lbnQgPSAnY29tbWVudCc7XG4gICAgLyoqXG4gICAgICogRm9sZGluZyByYW5nZSBmb3IgYW4gaW1wb3J0IG9yIGluY2x1ZGVcbiAgICAgKi9cbiAgICBGb2xkaW5nUmFuZ2VLaW5kLkltcG9ydHMgPSAnaW1wb3J0cyc7XG4gICAgLyoqXG4gICAgICogRm9sZGluZyByYW5nZSBmb3IgYSByZWdpb24gKGUuZy4gYCNyZWdpb25gKVxuICAgICAqL1xuICAgIEZvbGRpbmdSYW5nZUtpbmQuUmVnaW9uID0gJ3JlZ2lvbic7XG59KShGb2xkaW5nUmFuZ2VLaW5kIHx8IChGb2xkaW5nUmFuZ2VLaW5kID0ge30pKTtcbi8qKlxuICogVGhlIGZvbGRpbmcgcmFuZ2UgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgRm9sZGluZ1JhbmdlfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBGb2xkaW5nUmFuZ2U7XG4oZnVuY3Rpb24gKEZvbGRpbmdSYW5nZSkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgRm9sZGluZ1JhbmdlIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHN0YXJ0TGluZSwgZW5kTGluZSwgc3RhcnRDaGFyYWN0ZXIsIGVuZENoYXJhY3Rlciwga2luZCwgY29sbGFwc2VkVGV4dCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICBzdGFydExpbmUsXG4gICAgICAgICAgICBlbmRMaW5lXG4gICAgICAgIH07XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKHN0YXJ0Q2hhcmFjdGVyKSkge1xuICAgICAgICAgICAgcmVzdWx0LnN0YXJ0Q2hhcmFjdGVyID0gc3RhcnRDaGFyYWN0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzLmRlZmluZWQoZW5kQ2hhcmFjdGVyKSkge1xuICAgICAgICAgICAgcmVzdWx0LmVuZENoYXJhY3RlciA9IGVuZENoYXJhY3RlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXMuZGVmaW5lZChraW5kKSkge1xuICAgICAgICAgICAgcmVzdWx0LmtpbmQgPSBraW5kO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKGNvbGxhcHNlZFRleHQpKSB7XG4gICAgICAgICAgICByZXN1bHQuY29sbGFwc2VkVGV4dCA9IGNvbGxhcHNlZFRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgRm9sZGluZ1JhbmdlLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIEZvbGRpbmdSYW5nZX0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS5zdGFydExpbmUpICYmIElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS5zdGFydExpbmUpXG4gICAgICAgICAgICAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5zdGFydENoYXJhY3RlcikgfHwgSXMudWludGVnZXIoY2FuZGlkYXRlLnN0YXJ0Q2hhcmFjdGVyKSlcbiAgICAgICAgICAgICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLmVuZENoYXJhY3RlcikgfHwgSXMudWludGVnZXIoY2FuZGlkYXRlLmVuZENoYXJhY3RlcikpXG4gICAgICAgICAgICAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5raW5kKSB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLmtpbmQpKTtcbiAgICB9XG4gICAgRm9sZGluZ1JhbmdlLmlzID0gaXM7XG59KShGb2xkaW5nUmFuZ2UgfHwgKEZvbGRpbmdSYW5nZSA9IHt9KSk7XG4vKipcbiAqIFRoZSBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb259IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb247XG4oZnVuY3Rpb24gKERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24gbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobG9jYXRpb24sIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxvY2F0aW9uLFxuICAgICAgICAgICAgbWVzc2FnZVxuICAgICAgICB9O1xuICAgIH1cbiAgICBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb259IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgTG9jYXRpb24uaXMoY2FuZGlkYXRlLmxvY2F0aW9uKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLm1lc3NhZ2UpO1xuICAgIH1cbiAgICBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uLmlzID0gaXM7XG59KShEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uIHx8IChEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uID0ge30pKTtcbi8qKlxuICogVGhlIGRpYWdub3N0aWMncyBzZXZlcml0eS5cbiAqL1xuZXhwb3J0IHZhciBEaWFnbm9zdGljU2V2ZXJpdHk7XG4oZnVuY3Rpb24gKERpYWdub3N0aWNTZXZlcml0eSkge1xuICAgIC8qKlxuICAgICAqIFJlcG9ydHMgYW4gZXJyb3IuXG4gICAgICovXG4gICAgRGlhZ25vc3RpY1NldmVyaXR5LkVycm9yID0gMTtcbiAgICAvKipcbiAgICAgKiBSZXBvcnRzIGEgd2FybmluZy5cbiAgICAgKi9cbiAgICBEaWFnbm9zdGljU2V2ZXJpdHkuV2FybmluZyA9IDI7XG4gICAgLyoqXG4gICAgICogUmVwb3J0cyBhbiBpbmZvcm1hdGlvbi5cbiAgICAgKi9cbiAgICBEaWFnbm9zdGljU2V2ZXJpdHkuSW5mb3JtYXRpb24gPSAzO1xuICAgIC8qKlxuICAgICAqIFJlcG9ydHMgYSBoaW50LlxuICAgICAqL1xuICAgIERpYWdub3N0aWNTZXZlcml0eS5IaW50ID0gNDtcbn0pKERpYWdub3N0aWNTZXZlcml0eSB8fCAoRGlhZ25vc3RpY1NldmVyaXR5ID0ge30pKTtcbi8qKlxuICogVGhlIGRpYWdub3N0aWMgdGFncy5cbiAqXG4gKiBAc2luY2UgMy4xNS4wXG4gKi9cbmV4cG9ydCB2YXIgRGlhZ25vc3RpY1RhZztcbihmdW5jdGlvbiAoRGlhZ25vc3RpY1RhZykge1xuICAgIC8qKlxuICAgICAqIFVudXNlZCBvciB1bm5lY2Vzc2FyeSBjb2RlLlxuICAgICAqXG4gICAgICogQ2xpZW50cyBhcmUgYWxsb3dlZCB0byByZW5kZXIgZGlhZ25vc3RpY3Mgd2l0aCB0aGlzIHRhZyBmYWRlZCBvdXQgaW5zdGVhZCBvZiBoYXZpbmdcbiAgICAgKiBhbiBlcnJvciBzcXVpZ2dsZS5cbiAgICAgKi9cbiAgICBEaWFnbm9zdGljVGFnLlVubmVjZXNzYXJ5ID0gMTtcbiAgICAvKipcbiAgICAgKiBEZXByZWNhdGVkIG9yIG9ic29sZXRlIGNvZGUuXG4gICAgICpcbiAgICAgKiBDbGllbnRzIGFyZSBhbGxvd2VkIHRvIHJlbmRlcmVkIGRpYWdub3N0aWNzIHdpdGggdGhpcyB0YWcgc3RyaWtlIHRocm91Z2guXG4gICAgICovXG4gICAgRGlhZ25vc3RpY1RhZy5EZXByZWNhdGVkID0gMjtcbn0pKERpYWdub3N0aWNUYWcgfHwgKERpYWdub3N0aWNUYWcgPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29kZURlc2NyaXB0aW9uIG5hbWVzcGFjZSBwcm92aWRlcyBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIGRlc2NyaXB0aW9ucyBmb3IgZGlhZ25vc3RpYyBjb2Rlcy5cbiAqXG4gKiBAc2luY2UgMy4xNi4wXG4gKi9cbmV4cG9ydCB2YXIgQ29kZURlc2NyaXB0aW9uO1xuKGZ1bmN0aW9uIChDb2RlRGVzY3JpcHRpb24pIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLmhyZWYpO1xuICAgIH1cbiAgICBDb2RlRGVzY3JpcHRpb24uaXMgPSBpcztcbn0pKENvZGVEZXNjcmlwdGlvbiB8fCAoQ29kZURlc2NyaXB0aW9uID0ge30pKTtcbi8qKlxuICogVGhlIERpYWdub3N0aWMgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgRGlhZ25vc3RpY30gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgRGlhZ25vc3RpYztcbihmdW5jdGlvbiAoRGlhZ25vc3RpYykge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgRGlhZ25vc3RpYyBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgbWVzc2FnZSwgc2V2ZXJpdHksIGNvZGUsIHNvdXJjZSwgcmVsYXRlZEluZm9ybWF0aW9uKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IHJhbmdlLCBtZXNzYWdlIH07XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKHNldmVyaXR5KSkge1xuICAgICAgICAgICAgcmVzdWx0LnNldmVyaXR5ID0gc2V2ZXJpdHk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzLmRlZmluZWQoY29kZSkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5jb2RlID0gY29kZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXMuZGVmaW5lZChzb3VyY2UpKSB7XG4gICAgICAgICAgICByZXN1bHQuc291cmNlID0gc291cmNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKHJlbGF0ZWRJbmZvcm1hdGlvbikpIHtcbiAgICAgICAgICAgIHJlc3VsdC5yZWxhdGVkSW5mb3JtYXRpb24gPSByZWxhdGVkSW5mb3JtYXRpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgRGlhZ25vc3RpYy5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBEaWFnbm9zdGljfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSlcbiAgICAgICAgICAgICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSlcbiAgICAgICAgICAgICYmIElzLnN0cmluZyhjYW5kaWRhdGUubWVzc2FnZSlcbiAgICAgICAgICAgICYmIChJcy5udW1iZXIoY2FuZGlkYXRlLnNldmVyaXR5KSB8fCBJcy51bmRlZmluZWQoY2FuZGlkYXRlLnNldmVyaXR5KSlcbiAgICAgICAgICAgICYmIChJcy5pbnRlZ2VyKGNhbmRpZGF0ZS5jb2RlKSB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLmNvZGUpIHx8IElzLnVuZGVmaW5lZChjYW5kaWRhdGUuY29kZSkpXG4gICAgICAgICAgICAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5jb2RlRGVzY3JpcHRpb24pIHx8IChJcy5zdHJpbmcoKF9hID0gY2FuZGlkYXRlLmNvZGVEZXNjcmlwdGlvbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmhyZWYpKSlcbiAgICAgICAgICAgICYmIChJcy5zdHJpbmcoY2FuZGlkYXRlLnNvdXJjZSkgfHwgSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5zb3VyY2UpKVxuICAgICAgICAgICAgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUucmVsYXRlZEluZm9ybWF0aW9uKSB8fCBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS5yZWxhdGVkSW5mb3JtYXRpb24sIERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24uaXMpKTtcbiAgICB9XG4gICAgRGlhZ25vc3RpYy5pcyA9IGlzO1xufSkoRGlhZ25vc3RpYyB8fCAoRGlhZ25vc3RpYyA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb21tYW5kIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIENvbW1hbmR9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIENvbW1hbmQ7XG4oZnVuY3Rpb24gKENvbW1hbmQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENvbW1hbmQgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodGl0bGUsIGNvbW1hbmQsIC4uLmFyZ3MpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHsgdGl0bGUsIGNvbW1hbmQgfTtcbiAgICAgICAgaWYgKElzLmRlZmluZWQoYXJncykgJiYgYXJncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXN1bHQuYXJndW1lbnRzID0gYXJncztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBDb21tYW5kLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIENvbW1hbmR9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS50aXRsZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5jb21tYW5kKTtcbiAgICB9XG4gICAgQ29tbWFuZC5pcyA9IGlzO1xufSkoQ29tbWFuZCB8fCAoQ29tbWFuZCA9IHt9KSk7XG4vKipcbiAqIFRoZSBUZXh0RWRpdCBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSByZXBsYWNlLFxuICogaW5zZXJ0IGFuZCBkZWxldGUgZWRpdHMgbW9yZSBlYXNpbHkuXG4gKi9cbmV4cG9ydCB2YXIgVGV4dEVkaXQ7XG4oZnVuY3Rpb24gKFRleHRFZGl0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHJlcGxhY2UgdGV4dCBlZGl0LlxuICAgICAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2Ugb2YgdGV4dCB0byBiZSByZXBsYWNlZC5cbiAgICAgKiBAcGFyYW0gbmV3VGV4dCBUaGUgbmV3IHRleHQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVwbGFjZShyYW5nZSwgbmV3VGV4dCkge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgbmV3VGV4dCB9O1xuICAgIH1cbiAgICBUZXh0RWRpdC5yZXBsYWNlID0gcmVwbGFjZTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc2VydCB0ZXh0IGVkaXQuXG4gICAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBwb3NpdGlvbiB0byBpbnNlcnQgdGhlIHRleHQgYXQuXG4gICAgICogQHBhcmFtIG5ld1RleHQgVGhlIHRleHQgdG8gYmUgaW5zZXJ0ZWQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5zZXJ0KHBvc2l0aW9uLCBuZXdUZXh0KSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlOiB7IHN0YXJ0OiBwb3NpdGlvbiwgZW5kOiBwb3NpdGlvbiB9LCBuZXdUZXh0IH07XG4gICAgfVxuICAgIFRleHRFZGl0Lmluc2VydCA9IGluc2VydDtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZGVsZXRlIHRleHQgZWRpdC5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlIG9mIHRleHQgdG8gYmUgZGVsZXRlZC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkZWwocmFuZ2UpIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIG5ld1RleHQ6ICcnIH07XG4gICAgfVxuICAgIFRleHRFZGl0LmRlbCA9IGRlbDtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKVxuICAgICAgICAgICAgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5uZXdUZXh0KVxuICAgICAgICAgICAgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKTtcbiAgICB9XG4gICAgVGV4dEVkaXQuaXMgPSBpcztcbn0pKFRleHRFZGl0IHx8IChUZXh0RWRpdCA9IHt9KSk7XG5leHBvcnQgdmFyIENoYW5nZUFubm90YXRpb247XG4oZnVuY3Rpb24gKENoYW5nZUFubm90YXRpb24pIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUobGFiZWwsIG5lZWRzQ29uZmlybWF0aW9uLCBkZXNjcmlwdGlvbikge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB7IGxhYmVsIH07XG4gICAgICAgIGlmIChuZWVkc0NvbmZpcm1hdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQubmVlZHNDb25maXJtYXRpb24gPSBuZWVkc0NvbmZpcm1hdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVzY3JpcHRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgQ2hhbmdlQW5ub3RhdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5sYWJlbCkgJiZcbiAgICAgICAgICAgIChJcy5ib29sZWFuKGNhbmRpZGF0ZS5uZWVkc0NvbmZpcm1hdGlvbikgfHwgY2FuZGlkYXRlLm5lZWRzQ29uZmlybWF0aW9uID09PSB1bmRlZmluZWQpICYmXG4gICAgICAgICAgICAoSXMuc3RyaW5nKGNhbmRpZGF0ZS5kZXNjcmlwdGlvbikgfHwgY2FuZGlkYXRlLmRlc2NyaXB0aW9uID09PSB1bmRlZmluZWQpO1xuICAgIH1cbiAgICBDaGFuZ2VBbm5vdGF0aW9uLmlzID0gaXM7XG59KShDaGFuZ2VBbm5vdGF0aW9uIHx8IChDaGFuZ2VBbm5vdGF0aW9uID0ge30pKTtcbmV4cG9ydCB2YXIgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXI7XG4oZnVuY3Rpb24gKENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyKSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5zdHJpbmcoY2FuZGlkYXRlKTtcbiAgICB9XG4gICAgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMgPSBpcztcbn0pKENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyIHx8IChDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllciA9IHt9KSk7XG5leHBvcnQgdmFyIEFubm90YXRlZFRleHRFZGl0O1xuKGZ1bmN0aW9uIChBbm5vdGF0ZWRUZXh0RWRpdCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYW5ub3RhdGVkIHJlcGxhY2UgdGV4dCBlZGl0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSBvZiB0ZXh0IHRvIGJlIHJlcGxhY2VkLlxuICAgICAqIEBwYXJhbSBuZXdUZXh0IFRoZSBuZXcgdGV4dC5cbiAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiBUaGUgYW5ub3RhdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXBsYWNlKHJhbmdlLCBuZXdUZXh0LCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCBuZXdUZXh0LCBhbm5vdGF0aW9uSWQ6IGFubm90YXRpb24gfTtcbiAgICB9XG4gICAgQW5ub3RhdGVkVGV4dEVkaXQucmVwbGFjZSA9IHJlcGxhY2U7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhbm5vdGF0ZWQgaW5zZXJ0IHRleHQgZWRpdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgcG9zaXRpb24gdG8gaW5zZXJ0IHRoZSB0ZXh0IGF0LlxuICAgICAqIEBwYXJhbSBuZXdUZXh0IFRoZSB0ZXh0IHRvIGJlIGluc2VydGVkLlxuICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIFRoZSBhbm5vdGF0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluc2VydChwb3NpdGlvbiwgbmV3VGV4dCwgYW5ub3RhdGlvbikge1xuICAgICAgICByZXR1cm4geyByYW5nZTogeyBzdGFydDogcG9zaXRpb24sIGVuZDogcG9zaXRpb24gfSwgbmV3VGV4dCwgYW5ub3RhdGlvbklkOiBhbm5vdGF0aW9uIH07XG4gICAgfVxuICAgIEFubm90YXRlZFRleHRFZGl0Lmluc2VydCA9IGluc2VydDtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFubm90YXRlZCBkZWxldGUgdGV4dCBlZGl0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSBvZiB0ZXh0IHRvIGJlIGRlbGV0ZWQuXG4gICAgICogQHBhcmFtIGFubm90YXRpb24gVGhlIGFubm90YXRpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gZGVsKHJhbmdlLCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCBuZXdUZXh0OiAnJywgYW5ub3RhdGlvbklkOiBhbm5vdGF0aW9uIH07XG4gICAgfVxuICAgIEFubm90YXRlZFRleHRFZGl0LmRlbCA9IGRlbDtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIFRleHRFZGl0LmlzKGNhbmRpZGF0ZSkgJiYgKENoYW5nZUFubm90YXRpb24uaXMoY2FuZGlkYXRlLmFubm90YXRpb25JZCkgfHwgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoY2FuZGlkYXRlLmFubm90YXRpb25JZCkpO1xuICAgIH1cbiAgICBBbm5vdGF0ZWRUZXh0RWRpdC5pcyA9IGlzO1xufSkoQW5ub3RhdGVkVGV4dEVkaXQgfHwgKEFubm90YXRlZFRleHRFZGl0ID0ge30pKTtcbi8qKlxuICogVGhlIFRleHREb2N1bWVudEVkaXQgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGVcbiAqIGFuIGVkaXQgdGhhdCBtYW5pcHVsYXRlcyBhIHRleHQgZG9jdW1lbnQuXG4gKi9cbmV4cG9ydCB2YXIgVGV4dERvY3VtZW50RWRpdDtcbihmdW5jdGlvbiAoVGV4dERvY3VtZW50RWRpdCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgYFRleHREb2N1bWVudEVkaXRgXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHRleHREb2N1bWVudCwgZWRpdHMpIHtcbiAgICAgICAgcmV0dXJuIHsgdGV4dERvY3VtZW50LCBlZGl0cyB9O1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnRFZGl0LmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSlcbiAgICAgICAgICAgICYmIE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllci5pcyhjYW5kaWRhdGUudGV4dERvY3VtZW50KVxuICAgICAgICAgICAgJiYgQXJyYXkuaXNBcnJheShjYW5kaWRhdGUuZWRpdHMpO1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnRFZGl0LmlzID0gaXM7XG59KShUZXh0RG9jdW1lbnRFZGl0IHx8IChUZXh0RG9jdW1lbnRFZGl0ID0ge30pKTtcbmV4cG9ydCB2YXIgQ3JlYXRlRmlsZTtcbihmdW5jdGlvbiAoQ3JlYXRlRmlsZSkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmksIG9wdGlvbnMsIGFubm90YXRpb24pIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIGtpbmQ6ICdjcmVhdGUnLFxuICAgICAgICAgICAgdXJpXG4gICAgICAgIH07XG4gICAgICAgIGlmIChvcHRpb25zICE9PSB1bmRlZmluZWQgJiYgKG9wdGlvbnMub3ZlcndyaXRlICE9PSB1bmRlZmluZWQgfHwgb3B0aW9ucy5pZ25vcmVJZkV4aXN0cyAhPT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgcmVzdWx0Lm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbm5vdGF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5hbm5vdGF0aW9uSWQgPSBhbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIENyZWF0ZUZpbGUuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBjYW5kaWRhdGUua2luZCA9PT0gJ2NyZWF0ZScgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpICYmIChjYW5kaWRhdGUub3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAoKGNhbmRpZGF0ZS5vcHRpb25zLm92ZXJ3cml0ZSA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLm9wdGlvbnMub3ZlcndyaXRlKSkgJiYgKGNhbmRpZGF0ZS5vcHRpb25zLmlnbm9yZUlmRXhpc3RzID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUub3B0aW9ucy5pZ25vcmVJZkV4aXN0cykpKSkgJiYgKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQgPT09IHVuZGVmaW5lZCB8fCBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhjYW5kaWRhdGUuYW5ub3RhdGlvbklkKSk7XG4gICAgfVxuICAgIENyZWF0ZUZpbGUuaXMgPSBpcztcbn0pKENyZWF0ZUZpbGUgfHwgKENyZWF0ZUZpbGUgPSB7fSkpO1xuZXhwb3J0IHZhciBSZW5hbWVGaWxlO1xuKGZ1bmN0aW9uIChSZW5hbWVGaWxlKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKG9sZFVyaSwgbmV3VXJpLCBvcHRpb25zLCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7XG4gICAgICAgICAgICBraW5kOiAncmVuYW1lJyxcbiAgICAgICAgICAgIG9sZFVyaSxcbiAgICAgICAgICAgIG5ld1VyaVxuICAgICAgICB9O1xuICAgICAgICBpZiAob3B0aW9ucyAhPT0gdW5kZWZpbmVkICYmIChvcHRpb25zLm92ZXJ3cml0ZSAhPT0gdW5kZWZpbmVkIHx8IG9wdGlvbnMuaWdub3JlSWZFeGlzdHMgIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgfVxuICAgICAgICBpZiAoYW5ub3RhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQuYW5ub3RhdGlvbklkID0gYW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBSZW5hbWVGaWxlLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgY2FuZGlkYXRlLmtpbmQgPT09ICdyZW5hbWUnICYmIElzLnN0cmluZyhjYW5kaWRhdGUub2xkVXJpKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLm5ld1VyaSkgJiYgKGNhbmRpZGF0ZS5vcHRpb25zID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICgoY2FuZGlkYXRlLm9wdGlvbnMub3ZlcndyaXRlID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUub3B0aW9ucy5vdmVyd3JpdGUpKSAmJiAoY2FuZGlkYXRlLm9wdGlvbnMuaWdub3JlSWZFeGlzdHMgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5vcHRpb25zLmlnbm9yZUlmRXhpc3RzKSkpKSAmJiAoY2FuZGlkYXRlLmFubm90YXRpb25JZCA9PT0gdW5kZWZpbmVkIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQpKTtcbiAgICB9XG4gICAgUmVuYW1lRmlsZS5pcyA9IGlzO1xufSkoUmVuYW1lRmlsZSB8fCAoUmVuYW1lRmlsZSA9IHt9KSk7XG5leHBvcnQgdmFyIERlbGV0ZUZpbGU7XG4oZnVuY3Rpb24gKERlbGV0ZUZpbGUpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUodXJpLCBvcHRpb25zLCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7XG4gICAgICAgICAgICBraW5kOiAnZGVsZXRlJyxcbiAgICAgICAgICAgIHVyaVxuICAgICAgICB9O1xuICAgICAgICBpZiAob3B0aW9ucyAhPT0gdW5kZWZpbmVkICYmIChvcHRpb25zLnJlY3Vyc2l2ZSAhPT0gdW5kZWZpbmVkIHx8IG9wdGlvbnMuaWdub3JlSWZOb3RFeGlzdHMgIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgfVxuICAgICAgICBpZiAoYW5ub3RhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQuYW5ub3RhdGlvbklkID0gYW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBEZWxldGVGaWxlLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgY2FuZGlkYXRlLmtpbmQgPT09ICdkZWxldGUnICYmIElzLnN0cmluZyhjYW5kaWRhdGUudXJpKSAmJiAoY2FuZGlkYXRlLm9wdGlvbnMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgKChjYW5kaWRhdGUub3B0aW9ucy5yZWN1cnNpdmUgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5vcHRpb25zLnJlY3Vyc2l2ZSkpICYmIChjYW5kaWRhdGUub3B0aW9ucy5pZ25vcmVJZk5vdEV4aXN0cyA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLm9wdGlvbnMuaWdub3JlSWZOb3RFeGlzdHMpKSkpICYmIChjYW5kaWRhdGUuYW5ub3RhdGlvbklkID09PSB1bmRlZmluZWQgfHwgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoY2FuZGlkYXRlLmFubm90YXRpb25JZCkpO1xuICAgIH1cbiAgICBEZWxldGVGaWxlLmlzID0gaXM7XG59KShEZWxldGVGaWxlIHx8IChEZWxldGVGaWxlID0ge30pKTtcbmV4cG9ydCB2YXIgV29ya3NwYWNlRWRpdDtcbihmdW5jdGlvbiAoV29ya3NwYWNlRWRpdCkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5jaGFuZ2VzICE9PSB1bmRlZmluZWQgfHwgY2FuZGlkYXRlLmRvY3VtZW50Q2hhbmdlcyAhPT0gdW5kZWZpbmVkKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5kb2N1bWVudENoYW5nZXMgPT09IHVuZGVmaW5lZCB8fCBjYW5kaWRhdGUuZG9jdW1lbnRDaGFuZ2VzLmV2ZXJ5KChjaGFuZ2UpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoSXMuc3RyaW5nKGNoYW5nZS5raW5kKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlRmlsZS5pcyhjaGFuZ2UpIHx8IFJlbmFtZUZpbGUuaXMoY2hhbmdlKSB8fCBEZWxldGVGaWxlLmlzKGNoYW5nZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gVGV4dERvY3VtZW50RWRpdC5pcyhjaGFuZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKTtcbiAgICB9XG4gICAgV29ya3NwYWNlRWRpdC5pcyA9IGlzO1xufSkoV29ya3NwYWNlRWRpdCB8fCAoV29ya3NwYWNlRWRpdCA9IHt9KSk7XG5jbGFzcyBUZXh0RWRpdENoYW5nZUltcGwge1xuICAgIGNvbnN0cnVjdG9yKGVkaXRzLCBjaGFuZ2VBbm5vdGF0aW9ucykge1xuICAgICAgICB0aGlzLmVkaXRzID0gZWRpdHM7XG4gICAgICAgIHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMgPSBjaGFuZ2VBbm5vdGF0aW9ucztcbiAgICB9XG4gICAgaW5zZXJ0KHBvc2l0aW9uLCBuZXdUZXh0LCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIGxldCBlZGl0O1xuICAgICAgICBsZXQgaWQ7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGVkaXQgPSBUZXh0RWRpdC5pbnNlcnQocG9zaXRpb24sIG5ld1RleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGFubm90YXRpb24pKSB7XG4gICAgICAgICAgICBpZCA9IGFubm90YXRpb247XG4gICAgICAgICAgICBlZGl0ID0gQW5ub3RhdGVkVGV4dEVkaXQuaW5zZXJ0KHBvc2l0aW9uLCBuZXdUZXh0LCBhbm5vdGF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYXNzZXJ0Q2hhbmdlQW5ub3RhdGlvbnModGhpcy5jaGFuZ2VBbm5vdGF0aW9ucyk7XG4gICAgICAgICAgICBpZCA9IHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMubWFuYWdlKGFubm90YXRpb24pO1xuICAgICAgICAgICAgZWRpdCA9IEFubm90YXRlZFRleHRFZGl0Lmluc2VydChwb3NpdGlvbiwgbmV3VGV4dCwgaWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWRpdHMucHVzaChlZGl0KTtcbiAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXBsYWNlKHJhbmdlLCBuZXdUZXh0LCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIGxldCBlZGl0O1xuICAgICAgICBsZXQgaWQ7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGVkaXQgPSBUZXh0RWRpdC5yZXBsYWNlKHJhbmdlLCBuZXdUZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhhbm5vdGF0aW9uKSkge1xuICAgICAgICAgICAgaWQgPSBhbm5vdGF0aW9uO1xuICAgICAgICAgICAgZWRpdCA9IEFubm90YXRlZFRleHRFZGl0LnJlcGxhY2UocmFuZ2UsIG5ld1RleHQsIGFubm90YXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hc3NlcnRDaGFuZ2VBbm5vdGF0aW9ucyh0aGlzLmNoYW5nZUFubm90YXRpb25zKTtcbiAgICAgICAgICAgIGlkID0gdGhpcy5jaGFuZ2VBbm5vdGF0aW9ucy5tYW5hZ2UoYW5ub3RhdGlvbik7XG4gICAgICAgICAgICBlZGl0ID0gQW5ub3RhdGVkVGV4dEVkaXQucmVwbGFjZShyYW5nZSwgbmV3VGV4dCwgaWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWRpdHMucHVzaChlZGl0KTtcbiAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkZWxldGUocmFuZ2UsIGFubm90YXRpb24pIHtcbiAgICAgICAgbGV0IGVkaXQ7XG4gICAgICAgIGxldCBpZDtcbiAgICAgICAgaWYgKGFubm90YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZWRpdCA9IFRleHRFZGl0LmRlbChyYW5nZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoYW5ub3RhdGlvbikpIHtcbiAgICAgICAgICAgIGlkID0gYW5ub3RhdGlvbjtcbiAgICAgICAgICAgIGVkaXQgPSBBbm5vdGF0ZWRUZXh0RWRpdC5kZWwocmFuZ2UsIGFubm90YXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hc3NlcnRDaGFuZ2VBbm5vdGF0aW9ucyh0aGlzLmNoYW5nZUFubm90YXRpb25zKTtcbiAgICAgICAgICAgIGlkID0gdGhpcy5jaGFuZ2VBbm5vdGF0aW9ucy5tYW5hZ2UoYW5ub3RhdGlvbik7XG4gICAgICAgICAgICBlZGl0ID0gQW5ub3RhdGVkVGV4dEVkaXQuZGVsKHJhbmdlLCBpZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lZGl0cy5wdXNoKGVkaXQpO1xuICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFkZChlZGl0KSB7XG4gICAgICAgIHRoaXMuZWRpdHMucHVzaChlZGl0KTtcbiAgICB9XG4gICAgYWxsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0cztcbiAgICB9XG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuZWRpdHMuc3BsaWNlKDAsIHRoaXMuZWRpdHMubGVuZ3RoKTtcbiAgICB9XG4gICAgYXNzZXJ0Q2hhbmdlQW5ub3RhdGlvbnModmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGV4dCBlZGl0IGNoYW5nZSBpcyBub3QgY29uZmlndXJlZCB0byBtYW5hZ2UgY2hhbmdlIGFubm90YXRpb25zLmApO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBBIGhlbHBlciBjbGFzc1xuICovXG5jbGFzcyBDaGFuZ2VBbm5vdGF0aW9ucyB7XG4gICAgY29uc3RydWN0b3IoYW5ub3RhdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9ucyA9PT0gdW5kZWZpbmVkID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IGFubm90YXRpb25zO1xuICAgICAgICB0aGlzLl9jb3VudGVyID0gMDtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IDA7XG4gICAgfVxuICAgIGFsbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Fubm90YXRpb25zO1xuICAgIH1cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpemU7XG4gICAgfVxuICAgIG1hbmFnZShpZE9yQW5ub3RhdGlvbiwgYW5ub3RhdGlvbikge1xuICAgICAgICBsZXQgaWQ7XG4gICAgICAgIGlmIChDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhpZE9yQW5ub3RhdGlvbikpIHtcbiAgICAgICAgICAgIGlkID0gaWRPckFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZCA9IHRoaXMubmV4dElkKCk7XG4gICAgICAgICAgICBhbm5vdGF0aW9uID0gaWRPckFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2Fubm90YXRpb25zW2lkXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYElkICR7aWR9IGlzIGFscmVhZHkgaW4gdXNlLmApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbm5vdGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gYW5ub3RhdGlvbiBwcm92aWRlZCBmb3IgaWQgJHtpZH1gKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9hbm5vdGF0aW9uc1tpZF0gPSBhbm5vdGF0aW9uO1xuICAgICAgICB0aGlzLl9zaXplKys7XG4gICAgICAgIHJldHVybiBpZDtcbiAgICB9XG4gICAgbmV4dElkKCkge1xuICAgICAgICB0aGlzLl9jb3VudGVyKys7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb3VudGVyLnRvU3RyaW5nKCk7XG4gICAgfVxufVxuLyoqXG4gKiBBIHdvcmtzcGFjZSBjaGFuZ2UgaGVscHMgY29uc3RydWN0aW5nIGNoYW5nZXMgdG8gYSB3b3Jrc3BhY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBXb3Jrc3BhY2VDaGFuZ2Uge1xuICAgIGNvbnN0cnVjdG9yKHdvcmtzcGFjZUVkaXQpIHtcbiAgICAgICAgdGhpcy5fdGV4dEVkaXRDaGFuZ2VzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgaWYgKHdvcmtzcGFjZUVkaXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdCA9IHdvcmtzcGFjZUVkaXQ7XG4gICAgICAgICAgICBpZiAod29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucyA9IG5ldyBDaGFuZ2VBbm5vdGF0aW9ucyh3b3Jrc3BhY2VFZGl0LmNoYW5nZUFubm90YXRpb25zKTtcbiAgICAgICAgICAgICAgICB3b3Jrc3BhY2VFZGl0LmNoYW5nZUFubm90YXRpb25zID0gdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMuYWxsKCk7XG4gICAgICAgICAgICAgICAgd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMuZm9yRWFjaCgoY2hhbmdlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChUZXh0RG9jdW1lbnRFZGl0LmlzKGNoYW5nZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHRFZGl0Q2hhbmdlID0gbmV3IFRleHRFZGl0Q2hhbmdlSW1wbChjaGFuZ2UuZWRpdHMsIHRoaXMuX2NoYW5nZUFubm90YXRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RleHRFZGl0Q2hhbmdlc1tjaGFuZ2UudGV4dERvY3VtZW50LnVyaV0gPSB0ZXh0RWRpdENoYW5nZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAod29ya3NwYWNlRWRpdC5jaGFuZ2VzKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMod29ya3NwYWNlRWRpdC5jaGFuZ2VzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dEVkaXRDaGFuZ2UgPSBuZXcgVGV4dEVkaXRDaGFuZ2VJbXBsKHdvcmtzcGFjZUVkaXQuY2hhbmdlc1trZXldKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGV4dEVkaXRDaGFuZ2VzW2tleV0gPSB0ZXh0RWRpdENoYW5nZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQgPSB7fTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIHtAbGluayBXb3Jrc3BhY2VFZGl0fSBsaXRlcmFsXG4gICAgICogdXNlIHRvIGJlIHJldHVybmVkIGZyb20gYSB3b3Jrc3BhY2UgZWRpdCBvcGVyYXRpb24gbGlrZSByZW5hbWUuXG4gICAgICovXG4gICAgZ2V0IGVkaXQoKSB7XG4gICAgICAgIHRoaXMuaW5pdERvY3VtZW50Q2hhbmdlcygpO1xuICAgICAgICBpZiAodGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2NoYW5nZUFubm90YXRpb25zLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZUFubm90YXRpb25zID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VBbm5vdGF0aW9ucyA9IHRoaXMuX2NoYW5nZUFubm90YXRpb25zLmFsbCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl93b3Jrc3BhY2VFZGl0O1xuICAgIH1cbiAgICBnZXRUZXh0RWRpdENoYW5nZShrZXkpIHtcbiAgICAgICAgaWYgKE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllci5pcyhrZXkpKSB7XG4gICAgICAgICAgICB0aGlzLmluaXREb2N1bWVudENoYW5nZXMoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXb3Jrc3BhY2UgZWRpdCBpcyBub3QgY29uZmlndXJlZCBmb3IgZG9jdW1lbnQgY2hhbmdlcy4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHRleHREb2N1bWVudCA9IHsgdXJpOiBrZXkudXJpLCB2ZXJzaW9uOiBrZXkudmVyc2lvbiB9O1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuX3RleHRFZGl0Q2hhbmdlc1t0ZXh0RG9jdW1lbnQudXJpXTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWRpdHMgPSBbXTtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0RG9jdW1lbnRFZGl0ID0ge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIGVkaXRzXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcy5wdXNoKHRleHREb2N1bWVudEVkaXQpO1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBUZXh0RWRpdENoYW5nZUltcGwoZWRpdHMsIHRoaXMuX2NoYW5nZUFubm90YXRpb25zKTtcbiAgICAgICAgICAgICAgICB0aGlzLl90ZXh0RWRpdENoYW5nZXNbdGV4dERvY3VtZW50LnVyaV0gPSByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pbml0Q2hhbmdlcygpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXb3Jrc3BhY2UgZWRpdCBpcyBub3QgY29uZmlndXJlZCBmb3Igbm9ybWFsIHRleHQgZWRpdCBjaGFuZ2VzLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuX3RleHRFZGl0Q2hhbmdlc1trZXldO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBsZXQgZWRpdHMgPSBbXTtcbiAgICAgICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZXNba2V5XSA9IGVkaXRzO1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBUZXh0RWRpdENoYW5nZUltcGwoZWRpdHMpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3RleHRFZGl0Q2hhbmdlc1trZXldID0gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpbml0RG9jdW1lbnRDaGFuZ2VzKCkge1xuICAgICAgICBpZiAodGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMgPT09IHVuZGVmaW5lZCAmJiB0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMgPSBuZXcgQ2hhbmdlQW5ub3RhdGlvbnMoKTtcbiAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzID0gW107XG4gICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZUFubm90YXRpb25zID0gdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMuYWxsKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaW5pdENoYW5nZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcyA9PT0gdW5kZWZpbmVkICYmIHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNyZWF0ZUZpbGUodXJpLCBvcHRpb25zT3JBbm5vdGF0aW9uLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuaW5pdERvY3VtZW50Q2hhbmdlcygpO1xuICAgICAgICBpZiAodGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXb3Jrc3BhY2UgZWRpdCBpcyBub3QgY29uZmlndXJlZCBmb3IgZG9jdW1lbnQgY2hhbmdlcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYW5ub3RhdGlvbjtcbiAgICAgICAgaWYgKENoYW5nZUFubm90YXRpb24uaXMob3B0aW9uc09yQW5ub3RhdGlvbikgfHwgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMob3B0aW9uc09yQW5ub3RhdGlvbikpIHtcbiAgICAgICAgICAgIGFubm90YXRpb24gPSBvcHRpb25zT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnNPckFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG9wZXJhdGlvbjtcbiAgICAgICAgbGV0IGlkO1xuICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcGVyYXRpb24gPSBDcmVhdGVGaWxlLmNyZWF0ZSh1cmksIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWQgPSBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhhbm5vdGF0aW9uKSA/IGFubm90YXRpb24gOiB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5tYW5hZ2UoYW5ub3RhdGlvbik7XG4gICAgICAgICAgICBvcGVyYXRpb24gPSBDcmVhdGVGaWxlLmNyZWF0ZSh1cmksIG9wdGlvbnMsIGlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcy5wdXNoKG9wZXJhdGlvbik7XG4gICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVuYW1lRmlsZShvbGRVcmksIG5ld1VyaSwgb3B0aW9uc09yQW5ub3RhdGlvbiwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLmluaXREb2N1bWVudENoYW5nZXMoKTtcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV29ya3NwYWNlIGVkaXQgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIGRvY3VtZW50IGNoYW5nZXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGFubm90YXRpb247XG4gICAgICAgIGlmIChDaGFuZ2VBbm5vdGF0aW9uLmlzKG9wdGlvbnNPckFubm90YXRpb24pIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKG9wdGlvbnNPckFubm90YXRpb24pKSB7XG4gICAgICAgICAgICBhbm5vdGF0aW9uID0gb3B0aW9uc09yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGxldCBvcGVyYXRpb247XG4gICAgICAgIGxldCBpZDtcbiAgICAgICAgaWYgKGFubm90YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3BlcmF0aW9uID0gUmVuYW1lRmlsZS5jcmVhdGUob2xkVXJpLCBuZXdVcmksIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWQgPSBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhhbm5vdGF0aW9uKSA/IGFubm90YXRpb24gOiB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5tYW5hZ2UoYW5ub3RhdGlvbik7XG4gICAgICAgICAgICBvcGVyYXRpb24gPSBSZW5hbWVGaWxlLmNyZWF0ZShvbGRVcmksIG5ld1VyaSwgb3B0aW9ucywgaWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzLnB1c2gob3BlcmF0aW9uKTtcbiAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkZWxldGVGaWxlKHVyaSwgb3B0aW9uc09yQW5ub3RhdGlvbiwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLmluaXREb2N1bWVudENoYW5nZXMoKTtcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV29ya3NwYWNlIGVkaXQgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIGRvY3VtZW50IGNoYW5nZXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGFubm90YXRpb247XG4gICAgICAgIGlmIChDaGFuZ2VBbm5vdGF0aW9uLmlzKG9wdGlvbnNPckFubm90YXRpb24pIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKG9wdGlvbnNPckFubm90YXRpb24pKSB7XG4gICAgICAgICAgICBhbm5vdGF0aW9uID0gb3B0aW9uc09yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGxldCBvcGVyYXRpb247XG4gICAgICAgIGxldCBpZDtcbiAgICAgICAgaWYgKGFubm90YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3BlcmF0aW9uID0gRGVsZXRlRmlsZS5jcmVhdGUodXJpLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlkID0gQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoYW5ub3RhdGlvbikgPyBhbm5vdGF0aW9uIDogdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMubWFuYWdlKGFubm90YXRpb24pO1xuICAgICAgICAgICAgb3BlcmF0aW9uID0gRGVsZXRlRmlsZS5jcmVhdGUodXJpLCBvcHRpb25zLCBpZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMucHVzaChvcGVyYXRpb24pO1xuICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBUaGUgVGV4dERvY3VtZW50SWRlbnRpZmllciBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBUZXh0RG9jdW1lbnRJZGVudGlmaWVyfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBUZXh0RG9jdW1lbnRJZGVudGlmaWVyO1xuKGZ1bmN0aW9uIChUZXh0RG9jdW1lbnRJZGVudGlmaWVyKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBUZXh0RG9jdW1lbnRJZGVudGlmaWVyIGxpdGVyYWwuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgZG9jdW1lbnQncyB1cmkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHVyaSkge1xuICAgICAgICByZXR1cm4geyB1cmkgfTtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50SWRlbnRpZmllci5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBUZXh0RG9jdW1lbnRJZGVudGlmaWVyfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudXJpKTtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50SWRlbnRpZmllci5pcyA9IGlzO1xufSkoVGV4dERvY3VtZW50SWRlbnRpZmllciB8fCAoVGV4dERvY3VtZW50SWRlbnRpZmllciA9IHt9KSk7XG4vKipcbiAqIFRoZSBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXJ9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXI7XG4oZnVuY3Rpb24gKFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIgbGl0ZXJhbC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSBkb2N1bWVudCdzIHVyaS5cbiAgICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgZG9jdW1lbnQncyB2ZXJzaW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmksIHZlcnNpb24pIHtcbiAgICAgICAgcmV0dXJuIHsgdXJpLCB2ZXJzaW9uIH07XG4gICAgfVxuICAgIFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSkgJiYgSXMuaW50ZWdlcihjYW5kaWRhdGUudmVyc2lvbik7XG4gICAgfVxuICAgIFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIuaXMgPSBpcztcbn0pKFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIgfHwgKFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIgPSB7fSkpO1xuLyoqXG4gKiBUaGUgT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyO1xuKGZ1bmN0aW9uIChPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciBsaXRlcmFsLlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIGRvY3VtZW50J3MgdXJpLlxuICAgICAqIEBwYXJhbSB2ZXJzaW9uIFRoZSBkb2N1bWVudCdzIHZlcnNpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHVyaSwgdmVyc2lvbikge1xuICAgICAgICByZXR1cm4geyB1cmksIHZlcnNpb24gfTtcbiAgICB9XG4gICAgT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSkgJiYgKGNhbmRpZGF0ZS52ZXJzaW9uID09PSBudWxsIHx8IElzLmludGVnZXIoY2FuZGlkYXRlLnZlcnNpb24pKTtcbiAgICB9XG4gICAgT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmlzID0gaXM7XG59KShPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIgfHwgKE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciA9IHt9KSk7XG4vKipcbiAqIFRoZSBUZXh0RG9jdW1lbnRJdGVtIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIFRleHREb2N1bWVudEl0ZW19IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIFRleHREb2N1bWVudEl0ZW07XG4oZnVuY3Rpb24gKFRleHREb2N1bWVudEl0ZW0pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFRleHREb2N1bWVudEl0ZW0gbGl0ZXJhbC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSBkb2N1bWVudCdzIHVyaS5cbiAgICAgKiBAcGFyYW0gbGFuZ3VhZ2VJZCBUaGUgZG9jdW1lbnQncyBsYW5ndWFnZSBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB2ZXJzaW9uIFRoZSBkb2N1bWVudCdzIHZlcnNpb24gbnVtYmVyLlxuICAgICAqIEBwYXJhbSB0ZXh0IFRoZSBkb2N1bWVudCdzIHRleHQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHVyaSwgbGFuZ3VhZ2VJZCwgdmVyc2lvbiwgdGV4dCkge1xuICAgICAgICByZXR1cm4geyB1cmksIGxhbmd1YWdlSWQsIHZlcnNpb24sIHRleHQgfTtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50SXRlbS5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBUZXh0RG9jdW1lbnRJdGVtfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudXJpKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLmxhbmd1YWdlSWQpICYmIElzLmludGVnZXIoY2FuZGlkYXRlLnZlcnNpb24pICYmIElzLnN0cmluZyhjYW5kaWRhdGUudGV4dCk7XG4gICAgfVxuICAgIFRleHREb2N1bWVudEl0ZW0uaXMgPSBpcztcbn0pKFRleHREb2N1bWVudEl0ZW0gfHwgKFRleHREb2N1bWVudEl0ZW0gPSB7fSkpO1xuLyoqXG4gKiBEZXNjcmliZXMgdGhlIGNvbnRlbnQgdHlwZSB0aGF0IGEgY2xpZW50IHN1cHBvcnRzIGluIHZhcmlvdXNcbiAqIHJlc3VsdCBsaXRlcmFscyBsaWtlIGBIb3ZlcmAsIGBQYXJhbWV0ZXJJbmZvYCBvciBgQ29tcGxldGlvbkl0ZW1gLlxuICpcbiAqIFBsZWFzZSBub3RlIHRoYXQgYE1hcmt1cEtpbmRzYCBtdXN0IG5vdCBzdGFydCB3aXRoIGEgYCRgLiBUaGlzIGtpbmRzXG4gKiBhcmUgcmVzZXJ2ZWQgZm9yIGludGVybmFsIHVzYWdlLlxuICovXG5leHBvcnQgdmFyIE1hcmt1cEtpbmQ7XG4oZnVuY3Rpb24gKE1hcmt1cEtpbmQpIHtcbiAgICAvKipcbiAgICAgKiBQbGFpbiB0ZXh0IGlzIHN1cHBvcnRlZCBhcyBhIGNvbnRlbnQgZm9ybWF0XG4gICAgICovXG4gICAgTWFya3VwS2luZC5QbGFpblRleHQgPSAncGxhaW50ZXh0JztcbiAgICAvKipcbiAgICAgKiBNYXJrZG93biBpcyBzdXBwb3J0ZWQgYXMgYSBjb250ZW50IGZvcm1hdFxuICAgICAqL1xuICAgIE1hcmt1cEtpbmQuTWFya2Rvd24gPSAnbWFya2Rvd24nO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBpcyBhIHZhbHVlIG9mIHRoZSB7QGxpbmsgTWFya3VwS2luZH0gdHlwZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSA9PT0gTWFya3VwS2luZC5QbGFpblRleHQgfHwgY2FuZGlkYXRlID09PSBNYXJrdXBLaW5kLk1hcmtkb3duO1xuICAgIH1cbiAgICBNYXJrdXBLaW5kLmlzID0gaXM7XG59KShNYXJrdXBLaW5kIHx8IChNYXJrdXBLaW5kID0ge30pKTtcbmV4cG9ydCB2YXIgTWFya3VwQ29udGVudDtcbihmdW5jdGlvbiAoTWFya3VwQ29udGVudCkge1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBjb25mb3JtcyB0byB0aGUge0BsaW5rIE1hcmt1cENvbnRlbnR9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwodmFsdWUpICYmIE1hcmt1cEtpbmQuaXMoY2FuZGlkYXRlLmtpbmQpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudmFsdWUpO1xuICAgIH1cbiAgICBNYXJrdXBDb250ZW50LmlzID0gaXM7XG59KShNYXJrdXBDb250ZW50IHx8IChNYXJrdXBDb250ZW50ID0ge30pKTtcbi8qKlxuICogVGhlIGtpbmQgb2YgYSBjb21wbGV0aW9uIGVudHJ5LlxuICovXG5leHBvcnQgdmFyIENvbXBsZXRpb25JdGVtS2luZDtcbihmdW5jdGlvbiAoQ29tcGxldGlvbkl0ZW1LaW5kKSB7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlRleHQgPSAxO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5NZXRob2QgPSAyO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5GdW5jdGlvbiA9IDM7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkNvbnN0cnVjdG9yID0gNDtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuRmllbGQgPSA1O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5WYXJpYWJsZSA9IDY7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkNsYXNzID0gNztcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuSW50ZXJmYWNlID0gODtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuTW9kdWxlID0gOTtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuUHJvcGVydHkgPSAxMDtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuVW5pdCA9IDExO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5WYWx1ZSA9IDEyO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5FbnVtID0gMTM7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLktleXdvcmQgPSAxNDtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuU25pcHBldCA9IDE1O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5Db2xvciA9IDE2O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5GaWxlID0gMTc7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlJlZmVyZW5jZSA9IDE4O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5Gb2xkZXIgPSAxOTtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuRW51bU1lbWJlciA9IDIwO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5Db25zdGFudCA9IDIxO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5TdHJ1Y3QgPSAyMjtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuRXZlbnQgPSAyMztcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuT3BlcmF0b3IgPSAyNDtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuVHlwZVBhcmFtZXRlciA9IDI1O1xufSkoQ29tcGxldGlvbkl0ZW1LaW5kIHx8IChDb21wbGV0aW9uSXRlbUtpbmQgPSB7fSkpO1xuLyoqXG4gKiBEZWZpbmVzIHdoZXRoZXIgdGhlIGluc2VydCB0ZXh0IGluIGEgY29tcGxldGlvbiBpdGVtIHNob3VsZCBiZSBpbnRlcnByZXRlZCBhc1xuICogcGxhaW4gdGV4dCBvciBhIHNuaXBwZXQuXG4gKi9cbmV4cG9ydCB2YXIgSW5zZXJ0VGV4dEZvcm1hdDtcbihmdW5jdGlvbiAoSW5zZXJ0VGV4dEZvcm1hdCkge1xuICAgIC8qKlxuICAgICAqIFRoZSBwcmltYXJ5IHRleHQgdG8gYmUgaW5zZXJ0ZWQgaXMgdHJlYXRlZCBhcyBhIHBsYWluIHN0cmluZy5cbiAgICAgKi9cbiAgICBJbnNlcnRUZXh0Rm9ybWF0LlBsYWluVGV4dCA9IDE7XG4gICAgLyoqXG4gICAgICogVGhlIHByaW1hcnkgdGV4dCB0byBiZSBpbnNlcnRlZCBpcyB0cmVhdGVkIGFzIGEgc25pcHBldC5cbiAgICAgKlxuICAgICAqIEEgc25pcHBldCBjYW4gZGVmaW5lIHRhYiBzdG9wcyBhbmQgcGxhY2Vob2xkZXJzIHdpdGggYCQxYCwgYCQyYFxuICAgICAqIGFuZCBgJHszOmZvb31gLiBgJDBgIGRlZmluZXMgdGhlIGZpbmFsIHRhYiBzdG9wLCBpdCBkZWZhdWx0cyB0b1xuICAgICAqIHRoZSBlbmQgb2YgdGhlIHNuaXBwZXQuIFBsYWNlaG9sZGVycyB3aXRoIGVxdWFsIGlkZW50aWZpZXJzIGFyZSBsaW5rZWQsXG4gICAgICogdGhhdCBpcyB0eXBpbmcgaW4gb25lIHdpbGwgdXBkYXRlIG90aGVycyB0b28uXG4gICAgICpcbiAgICAgKiBTZWUgYWxzbzogaHR0cHM6Ly9taWNyb3NvZnQuZ2l0aHViLmlvL2xhbmd1YWdlLXNlcnZlci1wcm90b2NvbC9zcGVjaWZpY2F0aW9ucy9zcGVjaWZpY2F0aW9uLWN1cnJlbnQvI3NuaXBwZXRfc3ludGF4XG4gICAgICovXG4gICAgSW5zZXJ0VGV4dEZvcm1hdC5TbmlwcGV0ID0gMjtcbn0pKEluc2VydFRleHRGb3JtYXQgfHwgKEluc2VydFRleHRGb3JtYXQgPSB7fSkpO1xuLyoqXG4gKiBDb21wbGV0aW9uIGl0ZW0gdGFncyBhcmUgZXh0cmEgYW5ub3RhdGlvbnMgdGhhdCB0d2VhayB0aGUgcmVuZGVyaW5nIG9mIGEgY29tcGxldGlvblxuICogaXRlbS5cbiAqXG4gKiBAc2luY2UgMy4xNS4wXG4gKi9cbmV4cG9ydCB2YXIgQ29tcGxldGlvbkl0ZW1UYWc7XG4oZnVuY3Rpb24gKENvbXBsZXRpb25JdGVtVGFnKSB7XG4gICAgLyoqXG4gICAgICogUmVuZGVyIGEgY29tcGxldGlvbiBhcyBvYnNvbGV0ZSwgdXN1YWxseSB1c2luZyBhIHN0cmlrZS1vdXQuXG4gICAgICovXG4gICAgQ29tcGxldGlvbkl0ZW1UYWcuRGVwcmVjYXRlZCA9IDE7XG59KShDb21wbGV0aW9uSXRlbVRhZyB8fCAoQ29tcGxldGlvbkl0ZW1UYWcgPSB7fSkpO1xuLyoqXG4gKiBUaGUgSW5zZXJ0UmVwbGFjZUVkaXQgbmFtZXNwYWNlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGggaW5zZXJ0IC8gcmVwbGFjZSBlZGl0cy5cbiAqXG4gKiBAc2luY2UgMy4xNi4wXG4gKi9cbmV4cG9ydCB2YXIgSW5zZXJ0UmVwbGFjZUVkaXQ7XG4oZnVuY3Rpb24gKEluc2VydFJlcGxhY2VFZGl0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBpbnNlcnQgLyByZXBsYWNlIGVkaXRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobmV3VGV4dCwgaW5zZXJ0LCByZXBsYWNlKSB7XG4gICAgICAgIHJldHVybiB7IG5ld1RleHQsIGluc2VydCwgcmVwbGFjZSB9O1xuICAgIH1cbiAgICBJbnNlcnRSZXBsYWNlRWRpdC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBJbnNlcnRSZXBsYWNlRWRpdH0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLnN0cmluZyhjYW5kaWRhdGUubmV3VGV4dCkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLmluc2VydCkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJlcGxhY2UpO1xuICAgIH1cbiAgICBJbnNlcnRSZXBsYWNlRWRpdC5pcyA9IGlzO1xufSkoSW5zZXJ0UmVwbGFjZUVkaXQgfHwgKEluc2VydFJlcGxhY2VFZGl0ID0ge30pKTtcbi8qKlxuICogSG93IHdoaXRlc3BhY2UgYW5kIGluZGVudGF0aW9uIGlzIGhhbmRsZWQgZHVyaW5nIGNvbXBsZXRpb25cbiAqIGl0ZW0gaW5zZXJ0aW9uLlxuICpcbiAqIEBzaW5jZSAzLjE2LjBcbiAqL1xuZXhwb3J0IHZhciBJbnNlcnRUZXh0TW9kZTtcbihmdW5jdGlvbiAoSW5zZXJ0VGV4dE1vZGUpIHtcbiAgICAvKipcbiAgICAgKiBUaGUgaW5zZXJ0aW9uIG9yIHJlcGxhY2Ugc3RyaW5ncyBpcyB0YWtlbiBhcyBpdCBpcy4gSWYgdGhlXG4gICAgICogdmFsdWUgaXMgbXVsdGkgbGluZSB0aGUgbGluZXMgYmVsb3cgdGhlIGN1cnNvciB3aWxsIGJlXG4gICAgICogaW5zZXJ0ZWQgdXNpbmcgdGhlIGluZGVudGF0aW9uIGRlZmluZWQgaW4gdGhlIHN0cmluZyB2YWx1ZS5cbiAgICAgKiBUaGUgY2xpZW50IHdpbGwgbm90IGFwcGx5IGFueSBraW5kIG9mIGFkanVzdG1lbnRzIHRvIHRoZVxuICAgICAqIHN0cmluZy5cbiAgICAgKi9cbiAgICBJbnNlcnRUZXh0TW9kZS5hc0lzID0gMTtcbiAgICAvKipcbiAgICAgKiBUaGUgZWRpdG9yIGFkanVzdHMgbGVhZGluZyB3aGl0ZXNwYWNlIG9mIG5ldyBsaW5lcyBzbyB0aGF0XG4gICAgICogdGhleSBtYXRjaCB0aGUgaW5kZW50YXRpb24gdXAgdG8gdGhlIGN1cnNvciBvZiB0aGUgbGluZSBmb3JcbiAgICAgKiB3aGljaCB0aGUgaXRlbSBpcyBhY2NlcHRlZC5cbiAgICAgKlxuICAgICAqIENvbnNpZGVyIGEgbGluZSBsaWtlIHRoaXM6IDwydGFicz48Y3Vyc29yPjwzdGFicz5mb28uIEFjY2VwdGluZyBhXG4gICAgICogbXVsdGkgbGluZSBjb21wbGV0aW9uIGl0ZW0gaXMgaW5kZW50ZWQgdXNpbmcgMiB0YWJzIGFuZCBhbGxcbiAgICAgKiBmb2xsb3dpbmcgbGluZXMgaW5zZXJ0ZWQgd2lsbCBiZSBpbmRlbnRlZCB1c2luZyAyIHRhYnMgYXMgd2VsbC5cbiAgICAgKi9cbiAgICBJbnNlcnRUZXh0TW9kZS5hZGp1c3RJbmRlbnRhdGlvbiA9IDI7XG59KShJbnNlcnRUZXh0TW9kZSB8fCAoSW5zZXJ0VGV4dE1vZGUgPSB7fSkpO1xuZXhwb3J0IHZhciBDb21wbGV0aW9uSXRlbUxhYmVsRGV0YWlscztcbihmdW5jdGlvbiAoQ29tcGxldGlvbkl0ZW1MYWJlbERldGFpbHMpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiAoSXMuc3RyaW5nKGNhbmRpZGF0ZS5kZXRhaWwpIHx8IGNhbmRpZGF0ZS5kZXRhaWwgPT09IHVuZGVmaW5lZCkgJiZcbiAgICAgICAgICAgIChJcy5zdHJpbmcoY2FuZGlkYXRlLmRlc2NyaXB0aW9uKSB8fCBjYW5kaWRhdGUuZGVzY3JpcHRpb24gPT09IHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIENvbXBsZXRpb25JdGVtTGFiZWxEZXRhaWxzLmlzID0gaXM7XG59KShDb21wbGV0aW9uSXRlbUxhYmVsRGV0YWlscyB8fCAoQ29tcGxldGlvbkl0ZW1MYWJlbERldGFpbHMgPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29tcGxldGlvbkl0ZW0gbmFtZXNwYWNlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGhcbiAqIGNvbXBsZXRpb24gaXRlbXMuXG4gKi9cbmV4cG9ydCB2YXIgQ29tcGxldGlvbkl0ZW07XG4oZnVuY3Rpb24gKENvbXBsZXRpb25JdGVtKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgY29tcGxldGlvbiBpdGVtIGFuZCBzZWVkIGl0IHdpdGggYSBsYWJlbC5cbiAgICAgKiBAcGFyYW0gbGFiZWwgVGhlIGNvbXBsZXRpb24gaXRlbSdzIGxhYmVsXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGxhYmVsKSB7XG4gICAgICAgIHJldHVybiB7IGxhYmVsIH07XG4gICAgfVxuICAgIENvbXBsZXRpb25JdGVtLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKENvbXBsZXRpb25JdGVtIHx8IChDb21wbGV0aW9uSXRlbSA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb21wbGV0aW9uTGlzdCBuYW1lc3BhY2UgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aFxuICogY29tcGxldGlvbiBsaXN0cy5cbiAqL1xuZXhwb3J0IHZhciBDb21wbGV0aW9uTGlzdDtcbihmdW5jdGlvbiAoQ29tcGxldGlvbkxpc3QpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGNvbXBsZXRpb24gbGlzdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpdGVtcyBUaGUgY29tcGxldGlvbiBpdGVtcy5cbiAgICAgKiBAcGFyYW0gaXNJbmNvbXBsZXRlIFRoZSBsaXN0IGlzIG5vdCBjb21wbGV0ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUoaXRlbXMsIGlzSW5jb21wbGV0ZSkge1xuICAgICAgICByZXR1cm4geyBpdGVtczogaXRlbXMgPyBpdGVtcyA6IFtdLCBpc0luY29tcGxldGU6ICEhaXNJbmNvbXBsZXRlIH07XG4gICAgfVxuICAgIENvbXBsZXRpb25MaXN0LmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKENvbXBsZXRpb25MaXN0IHx8IChDb21wbGV0aW9uTGlzdCA9IHt9KSk7XG5leHBvcnQgdmFyIE1hcmtlZFN0cmluZztcbihmdW5jdGlvbiAoTWFya2VkU3RyaW5nKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG1hcmtlZCBzdHJpbmcgZnJvbSBwbGFpbiB0ZXh0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHBsYWluVGV4dCBUaGUgcGxhaW4gdGV4dC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmcm9tUGxhaW5UZXh0KHBsYWluVGV4dCkge1xuICAgICAgICByZXR1cm4gcGxhaW5UZXh0LnJlcGxhY2UoL1tcXFxcYCpfe31bXFxdKCkjK1xcLS4hXS9nLCAnXFxcXCQmJyk7IC8vIGVzY2FwZSBtYXJrZG93biBzeW50YXggdG9rZW5zOiBodHRwOi8vZGFyaW5nZmlyZWJhbGwubmV0L3Byb2plY3RzL21hcmtkb3duL3N5bnRheCNiYWNrc2xhc2hcbiAgICB9XG4gICAgTWFya2VkU3RyaW5nLmZyb21QbGFpblRleHQgPSBmcm9tUGxhaW5UZXh0O1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBjb25mb3JtcyB0byB0aGUge0BsaW5rIE1hcmtlZFN0cmluZ30gdHlwZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLnN0cmluZyhjYW5kaWRhdGUpIHx8IChJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5sYW5ndWFnZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS52YWx1ZSkpO1xuICAgIH1cbiAgICBNYXJrZWRTdHJpbmcuaXMgPSBpcztcbn0pKE1hcmtlZFN0cmluZyB8fCAoTWFya2VkU3RyaW5nID0ge30pKTtcbmV4cG9ydCB2YXIgSG92ZXI7XG4oZnVuY3Rpb24gKEhvdmVyKSB7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgSG92ZXJ9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiAhIWNhbmRpZGF0ZSAmJiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgKE1hcmt1cENvbnRlbnQuaXMoY2FuZGlkYXRlLmNvbnRlbnRzKSB8fFxuICAgICAgICAgICAgTWFya2VkU3RyaW5nLmlzKGNhbmRpZGF0ZS5jb250ZW50cykgfHxcbiAgICAgICAgICAgIElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLmNvbnRlbnRzLCBNYXJrZWRTdHJpbmcuaXMpKSAmJiAodmFsdWUucmFuZ2UgPT09IHVuZGVmaW5lZCB8fCBSYW5nZS5pcyh2YWx1ZS5yYW5nZSkpO1xuICAgIH1cbiAgICBIb3Zlci5pcyA9IGlzO1xufSkoSG92ZXIgfHwgKEhvdmVyID0ge30pKTtcbi8qKlxuICogVGhlIFBhcmFtZXRlckluZm9ybWF0aW9uIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIFBhcmFtZXRlckluZm9ybWF0aW9ufSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBQYXJhbWV0ZXJJbmZvcm1hdGlvbjtcbihmdW5jdGlvbiAoUGFyYW1ldGVySW5mb3JtYXRpb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHBhcmFtZXRlciBpbmZvcm1hdGlvbiBsaXRlcmFsLlxuICAgICAqXG4gICAgICogQHBhcmFtIGxhYmVsIEEgbGFiZWwgc3RyaW5nLlxuICAgICAqIEBwYXJhbSBkb2N1bWVudGF0aW9uIEEgZG9jIHN0cmluZy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobGFiZWwsIGRvY3VtZW50YXRpb24pIHtcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50YXRpb24gPyB7IGxhYmVsLCBkb2N1bWVudGF0aW9uIH0gOiB7IGxhYmVsIH07XG4gICAgfVxuICAgIFBhcmFtZXRlckluZm9ybWF0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKFBhcmFtZXRlckluZm9ybWF0aW9uIHx8IChQYXJhbWV0ZXJJbmZvcm1hdGlvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBTaWduYXR1cmVJbmZvcm1hdGlvbiBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBTaWduYXR1cmVJbmZvcm1hdGlvbn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgU2lnbmF0dXJlSW5mb3JtYXRpb247XG4oZnVuY3Rpb24gKFNpZ25hdHVyZUluZm9ybWF0aW9uKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKGxhYmVsLCBkb2N1bWVudGF0aW9uLCAuLi5wYXJhbWV0ZXJzKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IGxhYmVsIH07XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKGRvY3VtZW50YXRpb24pKSB7XG4gICAgICAgICAgICByZXN1bHQuZG9jdW1lbnRhdGlvbiA9IGRvY3VtZW50YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzLmRlZmluZWQocGFyYW1ldGVycykpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wYXJhbWV0ZXJzID0gcGFyYW1ldGVycztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdC5wYXJhbWV0ZXJzID0gW107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgU2lnbmF0dXJlSW5mb3JtYXRpb24uY3JlYXRlID0gY3JlYXRlO1xufSkoU2lnbmF0dXJlSW5mb3JtYXRpb24gfHwgKFNpZ25hdHVyZUluZm9ybWF0aW9uID0ge30pKTtcbi8qKlxuICogQSBkb2N1bWVudCBoaWdobGlnaHQga2luZC5cbiAqL1xuZXhwb3J0IHZhciBEb2N1bWVudEhpZ2hsaWdodEtpbmQ7XG4oZnVuY3Rpb24gKERvY3VtZW50SGlnaGxpZ2h0S2luZCkge1xuICAgIC8qKlxuICAgICAqIEEgdGV4dHVhbCBvY2N1cnJlbmNlLlxuICAgICAqL1xuICAgIERvY3VtZW50SGlnaGxpZ2h0S2luZC5UZXh0ID0gMTtcbiAgICAvKipcbiAgICAgKiBSZWFkLWFjY2VzcyBvZiBhIHN5bWJvbCwgbGlrZSByZWFkaW5nIGEgdmFyaWFibGUuXG4gICAgICovXG4gICAgRG9jdW1lbnRIaWdobGlnaHRLaW5kLlJlYWQgPSAyO1xuICAgIC8qKlxuICAgICAqIFdyaXRlLWFjY2VzcyBvZiBhIHN5bWJvbCwgbGlrZSB3cml0aW5nIHRvIGEgdmFyaWFibGUuXG4gICAgICovXG4gICAgRG9jdW1lbnRIaWdobGlnaHRLaW5kLldyaXRlID0gMztcbn0pKERvY3VtZW50SGlnaGxpZ2h0S2luZCB8fCAoRG9jdW1lbnRIaWdobGlnaHRLaW5kID0ge30pKTtcbi8qKlxuICogRG9jdW1lbnRIaWdobGlnaHQgbmFtZXNwYWNlIHRvIHByb3ZpZGUgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBEb2N1bWVudEhpZ2hsaWdodH0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgRG9jdW1lbnRIaWdobGlnaHQ7XG4oZnVuY3Rpb24gKERvY3VtZW50SGlnaGxpZ2h0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgRG9jdW1lbnRIaWdobGlnaHQgb2JqZWN0LlxuICAgICAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2UgdGhlIGhpZ2hsaWdodCBhcHBsaWVzIHRvLlxuICAgICAqIEBwYXJhbSBraW5kIFRoZSBoaWdobGlnaHQga2luZFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwga2luZCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0geyByYW5nZSB9O1xuICAgICAgICBpZiAoSXMubnVtYmVyKGtpbmQpKSB7XG4gICAgICAgICAgICByZXN1bHQua2luZCA9IGtpbmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgRG9jdW1lbnRIaWdobGlnaHQuY3JlYXRlID0gY3JlYXRlO1xufSkoRG9jdW1lbnRIaWdobGlnaHQgfHwgKERvY3VtZW50SGlnaGxpZ2h0ID0ge30pKTtcbi8qKlxuICogQSBzeW1ib2wga2luZC5cbiAqL1xuZXhwb3J0IHZhciBTeW1ib2xLaW5kO1xuKGZ1bmN0aW9uIChTeW1ib2xLaW5kKSB7XG4gICAgU3ltYm9sS2luZC5GaWxlID0gMTtcbiAgICBTeW1ib2xLaW5kLk1vZHVsZSA9IDI7XG4gICAgU3ltYm9sS2luZC5OYW1lc3BhY2UgPSAzO1xuICAgIFN5bWJvbEtpbmQuUGFja2FnZSA9IDQ7XG4gICAgU3ltYm9sS2luZC5DbGFzcyA9IDU7XG4gICAgU3ltYm9sS2luZC5NZXRob2QgPSA2O1xuICAgIFN5bWJvbEtpbmQuUHJvcGVydHkgPSA3O1xuICAgIFN5bWJvbEtpbmQuRmllbGQgPSA4O1xuICAgIFN5bWJvbEtpbmQuQ29uc3RydWN0b3IgPSA5O1xuICAgIFN5bWJvbEtpbmQuRW51bSA9IDEwO1xuICAgIFN5bWJvbEtpbmQuSW50ZXJmYWNlID0gMTE7XG4gICAgU3ltYm9sS2luZC5GdW5jdGlvbiA9IDEyO1xuICAgIFN5bWJvbEtpbmQuVmFyaWFibGUgPSAxMztcbiAgICBTeW1ib2xLaW5kLkNvbnN0YW50ID0gMTQ7XG4gICAgU3ltYm9sS2luZC5TdHJpbmcgPSAxNTtcbiAgICBTeW1ib2xLaW5kLk51bWJlciA9IDE2O1xuICAgIFN5bWJvbEtpbmQuQm9vbGVhbiA9IDE3O1xuICAgIFN5bWJvbEtpbmQuQXJyYXkgPSAxODtcbiAgICBTeW1ib2xLaW5kLk9iamVjdCA9IDE5O1xuICAgIFN5bWJvbEtpbmQuS2V5ID0gMjA7XG4gICAgU3ltYm9sS2luZC5OdWxsID0gMjE7XG4gICAgU3ltYm9sS2luZC5FbnVtTWVtYmVyID0gMjI7XG4gICAgU3ltYm9sS2luZC5TdHJ1Y3QgPSAyMztcbiAgICBTeW1ib2xLaW5kLkV2ZW50ID0gMjQ7XG4gICAgU3ltYm9sS2luZC5PcGVyYXRvciA9IDI1O1xuICAgIFN5bWJvbEtpbmQuVHlwZVBhcmFtZXRlciA9IDI2O1xufSkoU3ltYm9sS2luZCB8fCAoU3ltYm9sS2luZCA9IHt9KSk7XG4vKipcbiAqIFN5bWJvbCB0YWdzIGFyZSBleHRyYSBhbm5vdGF0aW9ucyB0aGF0IHR3ZWFrIHRoZSByZW5kZXJpbmcgb2YgYSBzeW1ib2wuXG4gKlxuICogQHNpbmNlIDMuMTZcbiAqL1xuZXhwb3J0IHZhciBTeW1ib2xUYWc7XG4oZnVuY3Rpb24gKFN5bWJvbFRhZykge1xuICAgIC8qKlxuICAgICAqIFJlbmRlciBhIHN5bWJvbCBhcyBvYnNvbGV0ZSwgdXN1YWxseSB1c2luZyBhIHN0cmlrZS1vdXQuXG4gICAgICovXG4gICAgU3ltYm9sVGFnLkRlcHJlY2F0ZWQgPSAxO1xufSkoU3ltYm9sVGFnIHx8IChTeW1ib2xUYWcgPSB7fSkpO1xuZXhwb3J0IHZhciBTeW1ib2xJbmZvcm1hdGlvbjtcbihmdW5jdGlvbiAoU3ltYm9sSW5mb3JtYXRpb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHN5bWJvbCBpbmZvcm1hdGlvbiBsaXRlcmFsLlxuICAgICAqXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0ga2luZCBUaGUga2luZCBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2Ugb2YgdGhlIGxvY2F0aW9uIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgcmVzb3VyY2Ugb2YgdGhlIGxvY2F0aW9uIG9mIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gY29udGFpbmVyTmFtZSBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sIGNvbnRhaW5pbmcgdGhlIHN5bWJvbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobmFtZSwga2luZCwgcmFuZ2UsIHVyaSwgY29udGFpbmVyTmFtZSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGtpbmQsXG4gICAgICAgICAgICBsb2NhdGlvbjogeyB1cmksIHJhbmdlIH1cbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGNvbnRhaW5lck5hbWUpIHtcbiAgICAgICAgICAgIHJlc3VsdC5jb250YWluZXJOYW1lID0gY29udGFpbmVyTmFtZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBTeW1ib2xJbmZvcm1hdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG59KShTeW1ib2xJbmZvcm1hdGlvbiB8fCAoU3ltYm9sSW5mb3JtYXRpb24gPSB7fSkpO1xuZXhwb3J0IHZhciBXb3Jrc3BhY2VTeW1ib2w7XG4oZnVuY3Rpb24gKFdvcmtzcGFjZVN5bWJvbCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyB3b3Jrc3BhY2Ugc3ltYm9sLlxuICAgICAqXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0ga2luZCBUaGUga2luZCBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIHJlc291cmNlIG9mIHRoZSBsb2NhdGlvbiBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSByYW5nZSBBbiBvcHRpb25zIHJhbmdlIG9mIHRoZSBsb2NhdGlvbi5cbiAgICAgKiBAcmV0dXJucyBBIFdvcmtzcGFjZVN5bWJvbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobmFtZSwga2luZCwgdXJpLCByYW5nZSkge1xuICAgICAgICByZXR1cm4gcmFuZ2UgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyB7IG5hbWUsIGtpbmQsIGxvY2F0aW9uOiB7IHVyaSwgcmFuZ2UgfSB9XG4gICAgICAgICAgICA6IHsgbmFtZSwga2luZCwgbG9jYXRpb246IHsgdXJpIH0gfTtcbiAgICB9XG4gICAgV29ya3NwYWNlU3ltYm9sLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKFdvcmtzcGFjZVN5bWJvbCB8fCAoV29ya3NwYWNlU3ltYm9sID0ge30pKTtcbmV4cG9ydCB2YXIgRG9jdW1lbnRTeW1ib2w7XG4oZnVuY3Rpb24gKERvY3VtZW50U3ltYm9sKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBzeW1ib2wgaW5mb3JtYXRpb24gbGl0ZXJhbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIGRldGFpbCBUaGUgZGV0YWlsIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIGtpbmQgVGhlIGtpbmQgb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIHNlbGVjdGlvblJhbmdlIFRoZSBzZWxlY3Rpb25SYW5nZSBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSBjaGlsZHJlbiBDaGlsZHJlbiBvZiB0aGUgc3ltYm9sLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShuYW1lLCBkZXRhaWwsIGtpbmQsIHJhbmdlLCBzZWxlY3Rpb25SYW5nZSwgY2hpbGRyZW4pIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBkZXRhaWwsXG4gICAgICAgICAgICBraW5kLFxuICAgICAgICAgICAgcmFuZ2UsXG4gICAgICAgICAgICBzZWxlY3Rpb25SYW5nZVxuICAgICAgICB9O1xuICAgICAgICBpZiAoY2hpbGRyZW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmNoaWxkcmVuID0gY2hpbGRyZW47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgRG9jdW1lbnRTeW1ib2wuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgRG9jdW1lbnRTeW1ib2x9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiZcbiAgICAgICAgICAgIElzLnN0cmluZyhjYW5kaWRhdGUubmFtZSkgJiYgSXMubnVtYmVyKGNhbmRpZGF0ZS5raW5kKSAmJlxuICAgICAgICAgICAgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUuc2VsZWN0aW9uUmFuZ2UpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmRldGFpbCA9PT0gdW5kZWZpbmVkIHx8IElzLnN0cmluZyhjYW5kaWRhdGUuZGV0YWlsKSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuZGVwcmVjYXRlZCA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLmRlcHJlY2F0ZWQpKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5jaGlsZHJlbiA9PT0gdW5kZWZpbmVkIHx8IEFycmF5LmlzQXJyYXkoY2FuZGlkYXRlLmNoaWxkcmVuKSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUudGFncyA9PT0gdW5kZWZpbmVkIHx8IEFycmF5LmlzQXJyYXkoY2FuZGlkYXRlLnRhZ3MpKTtcbiAgICB9XG4gICAgRG9jdW1lbnRTeW1ib2wuaXMgPSBpcztcbn0pKERvY3VtZW50U3ltYm9sIHx8IChEb2N1bWVudFN5bWJvbCA9IHt9KSk7XG4vKipcbiAqIEEgc2V0IG9mIHByZWRlZmluZWQgY29kZSBhY3Rpb24ga2luZHNcbiAqL1xuZXhwb3J0IHZhciBDb2RlQWN0aW9uS2luZDtcbihmdW5jdGlvbiAoQ29kZUFjdGlvbktpbmQpIHtcbiAgICAvKipcbiAgICAgKiBFbXB0eSBraW5kLlxuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLkVtcHR5ID0gJyc7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciBxdWlja2ZpeCBhY3Rpb25zOiAncXVpY2tmaXgnXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuUXVpY2tGaXggPSAncXVpY2tmaXgnO1xuICAgIC8qKlxuICAgICAqIEJhc2Uga2luZCBmb3IgcmVmYWN0b3JpbmcgYWN0aW9uczogJ3JlZmFjdG9yJ1xuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlJlZmFjdG9yID0gJ3JlZmFjdG9yJztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIHJlZmFjdG9yaW5nIGV4dHJhY3Rpb24gYWN0aW9uczogJ3JlZmFjdG9yLmV4dHJhY3QnXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIGV4dHJhY3QgYWN0aW9uczpcbiAgICAgKlxuICAgICAqIC0gRXh0cmFjdCBtZXRob2RcbiAgICAgKiAtIEV4dHJhY3QgZnVuY3Rpb25cbiAgICAgKiAtIEV4dHJhY3QgdmFyaWFibGVcbiAgICAgKiAtIEV4dHJhY3QgaW50ZXJmYWNlIGZyb20gY2xhc3NcbiAgICAgKiAtIC4uLlxuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlJlZmFjdG9yRXh0cmFjdCA9ICdyZWZhY3Rvci5leHRyYWN0JztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIHJlZmFjdG9yaW5nIGlubGluZSBhY3Rpb25zOiAncmVmYWN0b3IuaW5saW5lJ1xuICAgICAqXG4gICAgICogRXhhbXBsZSBpbmxpbmUgYWN0aW9uczpcbiAgICAgKlxuICAgICAqIC0gSW5saW5lIGZ1bmN0aW9uXG4gICAgICogLSBJbmxpbmUgdmFyaWFibGVcbiAgICAgKiAtIElubGluZSBjb25zdGFudFxuICAgICAqIC0gLi4uXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuUmVmYWN0b3JJbmxpbmUgPSAncmVmYWN0b3IuaW5saW5lJztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIHJlZmFjdG9yaW5nIHJld3JpdGUgYWN0aW9uczogJ3JlZmFjdG9yLnJld3JpdGUnXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIHJld3JpdGUgYWN0aW9uczpcbiAgICAgKlxuICAgICAqIC0gQ29udmVydCBKYXZhU2NyaXB0IGZ1bmN0aW9uIHRvIGNsYXNzXG4gICAgICogLSBBZGQgb3IgcmVtb3ZlIHBhcmFtZXRlclxuICAgICAqIC0gRW5jYXBzdWxhdGUgZmllbGRcbiAgICAgKiAtIE1ha2UgbWV0aG9kIHN0YXRpY1xuICAgICAqIC0gTW92ZSBtZXRob2QgdG8gYmFzZSBjbGFzc1xuICAgICAqIC0gLi4uXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuUmVmYWN0b3JSZXdyaXRlID0gJ3JlZmFjdG9yLnJld3JpdGUnO1xuICAgIC8qKlxuICAgICAqIEJhc2Uga2luZCBmb3Igc291cmNlIGFjdGlvbnM6IGBzb3VyY2VgXG4gICAgICpcbiAgICAgKiBTb3VyY2UgY29kZSBhY3Rpb25zIGFwcGx5IHRvIHRoZSBlbnRpcmUgZmlsZS5cbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5Tb3VyY2UgPSAnc291cmNlJztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIGFuIG9yZ2FuaXplIGltcG9ydHMgc291cmNlIGFjdGlvbjogYHNvdXJjZS5vcmdhbml6ZUltcG9ydHNgXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuU291cmNlT3JnYW5pemVJbXBvcnRzID0gJ3NvdXJjZS5vcmdhbml6ZUltcG9ydHMnO1xuICAgIC8qKlxuICAgICAqIEJhc2Uga2luZCBmb3IgYXV0by1maXggc291cmNlIGFjdGlvbnM6IGBzb3VyY2UuZml4QWxsYC5cbiAgICAgKlxuICAgICAqIEZpeCBhbGwgYWN0aW9ucyBhdXRvbWF0aWNhbGx5IGZpeCBlcnJvcnMgdGhhdCBoYXZlIGEgY2xlYXIgZml4IHRoYXQgZG8gbm90IHJlcXVpcmUgdXNlciBpbnB1dC5cbiAgICAgKiBUaGV5IHNob3VsZCBub3Qgc3VwcHJlc3MgZXJyb3JzIG9yIHBlcmZvcm0gdW5zYWZlIGZpeGVzIHN1Y2ggYXMgZ2VuZXJhdGluZyBuZXcgdHlwZXMgb3IgY2xhc3Nlcy5cbiAgICAgKlxuICAgICAqIEBzaW5jZSAzLjE1LjBcbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5Tb3VyY2VGaXhBbGwgPSAnc291cmNlLmZpeEFsbCc7XG59KShDb2RlQWN0aW9uS2luZCB8fCAoQ29kZUFjdGlvbktpbmQgPSB7fSkpO1xuLyoqXG4gKiBUaGUgcmVhc29uIHdoeSBjb2RlIGFjdGlvbnMgd2VyZSByZXF1ZXN0ZWQuXG4gKlxuICogQHNpbmNlIDMuMTcuMFxuICovXG5leHBvcnQgdmFyIENvZGVBY3Rpb25UcmlnZ2VyS2luZDtcbihmdW5jdGlvbiAoQ29kZUFjdGlvblRyaWdnZXJLaW5kKSB7XG4gICAgLyoqXG4gICAgICogQ29kZSBhY3Rpb25zIHdlcmUgZXhwbGljaXRseSByZXF1ZXN0ZWQgYnkgdGhlIHVzZXIgb3IgYnkgYW4gZXh0ZW5zaW9uLlxuICAgICAqL1xuICAgIENvZGVBY3Rpb25UcmlnZ2VyS2luZC5JbnZva2VkID0gMTtcbiAgICAvKipcbiAgICAgKiBDb2RlIGFjdGlvbnMgd2VyZSByZXF1ZXN0ZWQgYXV0b21hdGljYWxseS5cbiAgICAgKlxuICAgICAqIFRoaXMgdHlwaWNhbGx5IGhhcHBlbnMgd2hlbiBjdXJyZW50IHNlbGVjdGlvbiBpbiBhIGZpbGUgY2hhbmdlcywgYnV0IGNhblxuICAgICAqIGFsc28gYmUgdHJpZ2dlcmVkIHdoZW4gZmlsZSBjb250ZW50IGNoYW5nZXMuXG4gICAgICovXG4gICAgQ29kZUFjdGlvblRyaWdnZXJLaW5kLkF1dG9tYXRpYyA9IDI7XG59KShDb2RlQWN0aW9uVHJpZ2dlcktpbmQgfHwgKENvZGVBY3Rpb25UcmlnZ2VyS2luZCA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb2RlQWN0aW9uQ29udGV4dCBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBDb2RlQWN0aW9uQ29udGV4dH0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgQ29kZUFjdGlvbkNvbnRleHQ7XG4oZnVuY3Rpb24gKENvZGVBY3Rpb25Db250ZXh0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDb2RlQWN0aW9uQ29udGV4dCBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShkaWFnbm9zdGljcywgb25seSwgdHJpZ2dlcktpbmQpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHsgZGlhZ25vc3RpY3MgfTtcbiAgICAgICAgaWYgKG9ubHkgIT09IHVuZGVmaW5lZCAmJiBvbmx5ICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXN1bHQub25seSA9IG9ubHk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyaWdnZXJLaW5kICE9PSB1bmRlZmluZWQgJiYgdHJpZ2dlcktpbmQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJlc3VsdC50cmlnZ2VyS2luZCA9IHRyaWdnZXJLaW5kO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIENvZGVBY3Rpb25Db250ZXh0LmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIENvZGVBY3Rpb25Db250ZXh0fSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLmRpYWdub3N0aWNzLCBEaWFnbm9zdGljLmlzKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS5vbmx5ID09PSB1bmRlZmluZWQgfHwgSXMudHlwZWRBcnJheShjYW5kaWRhdGUub25seSwgSXMuc3RyaW5nKSlcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUudHJpZ2dlcktpbmQgPT09IHVuZGVmaW5lZCB8fCBjYW5kaWRhdGUudHJpZ2dlcktpbmQgPT09IENvZGVBY3Rpb25UcmlnZ2VyS2luZC5JbnZva2VkIHx8IGNhbmRpZGF0ZS50cmlnZ2VyS2luZCA9PT0gQ29kZUFjdGlvblRyaWdnZXJLaW5kLkF1dG9tYXRpYyk7XG4gICAgfVxuICAgIENvZGVBY3Rpb25Db250ZXh0LmlzID0gaXM7XG59KShDb2RlQWN0aW9uQ29udGV4dCB8fCAoQ29kZUFjdGlvbkNvbnRleHQgPSB7fSkpO1xuZXhwb3J0IHZhciBDb2RlQWN0aW9uO1xuKGZ1bmN0aW9uIChDb2RlQWN0aW9uKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKHRpdGxlLCBraW5kT3JDb21tYW5kT3JFZGl0LCBraW5kKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IHRpdGxlIH07XG4gICAgICAgIGxldCBjaGVja0tpbmQgPSB0cnVlO1xuICAgICAgICBpZiAodHlwZW9mIGtpbmRPckNvbW1hbmRPckVkaXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjaGVja0tpbmQgPSBmYWxzZTtcbiAgICAgICAgICAgIHJlc3VsdC5raW5kID0ga2luZE9yQ29tbWFuZE9yRWRpdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChDb21tYW5kLmlzKGtpbmRPckNvbW1hbmRPckVkaXQpKSB7XG4gICAgICAgICAgICByZXN1bHQuY29tbWFuZCA9IGtpbmRPckNvbW1hbmRPckVkaXQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQuZWRpdCA9IGtpbmRPckNvbW1hbmRPckVkaXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoZWNrS2luZCAmJiBraW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5raW5kID0ga2luZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBDb2RlQWN0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS50aXRsZSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuZGlhZ25vc3RpY3MgPT09IHVuZGVmaW5lZCB8fCBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS5kaWFnbm9zdGljcywgRGlhZ25vc3RpYy5pcykpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmtpbmQgPT09IHVuZGVmaW5lZCB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLmtpbmQpKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5lZGl0ICE9PSB1bmRlZmluZWQgfHwgY2FuZGlkYXRlLmNvbW1hbmQgIT09IHVuZGVmaW5lZCkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuY29tbWFuZCA9PT0gdW5kZWZpbmVkIHx8IENvbW1hbmQuaXMoY2FuZGlkYXRlLmNvbW1hbmQpKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5pc1ByZWZlcnJlZCA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLmlzUHJlZmVycmVkKSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuZWRpdCA9PT0gdW5kZWZpbmVkIHx8IFdvcmtzcGFjZUVkaXQuaXMoY2FuZGlkYXRlLmVkaXQpKTtcbiAgICB9XG4gICAgQ29kZUFjdGlvbi5pcyA9IGlzO1xufSkoQ29kZUFjdGlvbiB8fCAoQ29kZUFjdGlvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb2RlTGVucyBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBDb2RlTGVuc30gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgQ29kZUxlbnM7XG4oZnVuY3Rpb24gKENvZGVMZW5zKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDb2RlTGVucyBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgZGF0YSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0geyByYW5nZSB9O1xuICAgICAgICBpZiAoSXMuZGVmaW5lZChkYXRhKSkge1xuICAgICAgICAgICAgcmVzdWx0LmRhdGEgPSBkYXRhO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIENvZGVMZW5zLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIENvZGVMZW5zfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUuY29tbWFuZCkgfHwgQ29tbWFuZC5pcyhjYW5kaWRhdGUuY29tbWFuZCkpO1xuICAgIH1cbiAgICBDb2RlTGVucy5pcyA9IGlzO1xufSkoQ29kZUxlbnMgfHwgKENvZGVMZW5zID0ge30pKTtcbi8qKlxuICogVGhlIEZvcm1hdHRpbmdPcHRpb25zIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIEZvcm1hdHRpbmdPcHRpb25zfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBGb3JtYXR0aW5nT3B0aW9ucztcbihmdW5jdGlvbiAoRm9ybWF0dGluZ09wdGlvbnMpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IEZvcm1hdHRpbmdPcHRpb25zIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHRhYlNpemUsIGluc2VydFNwYWNlcykge1xuICAgICAgICByZXR1cm4geyB0YWJTaXplLCBpbnNlcnRTcGFjZXMgfTtcbiAgICB9XG4gICAgRm9ybWF0dGluZ09wdGlvbnMuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgRm9ybWF0dGluZ09wdGlvbnN9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMudWludGVnZXIoY2FuZGlkYXRlLnRhYlNpemUpICYmIElzLmJvb2xlYW4oY2FuZGlkYXRlLmluc2VydFNwYWNlcyk7XG4gICAgfVxuICAgIEZvcm1hdHRpbmdPcHRpb25zLmlzID0gaXM7XG59KShGb3JtYXR0aW5nT3B0aW9ucyB8fCAoRm9ybWF0dGluZ09wdGlvbnMgPSB7fSkpO1xuLyoqXG4gKiBUaGUgRG9jdW1lbnRMaW5rIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIERvY3VtZW50TGlua30gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgRG9jdW1lbnRMaW5rO1xuKGZ1bmN0aW9uIChEb2N1bWVudExpbmspIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IERvY3VtZW50TGluayBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgdGFyZ2V0LCBkYXRhKSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCB0YXJnZXQsIGRhdGEgfTtcbiAgICB9XG4gICAgRG9jdW1lbnRMaW5rLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIERvY3VtZW50TGlua30gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLnRhcmdldCkgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS50YXJnZXQpKTtcbiAgICB9XG4gICAgRG9jdW1lbnRMaW5rLmlzID0gaXM7XG59KShEb2N1bWVudExpbmsgfHwgKERvY3VtZW50TGluayA9IHt9KSk7XG4vKipcbiAqIFRoZSBTZWxlY3Rpb25SYW5nZSBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9uIHRvIHdvcmsgd2l0aFxuICogU2VsZWN0aW9uUmFuZ2UgbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgU2VsZWN0aW9uUmFuZ2U7XG4oZnVuY3Rpb24gKFNlbGVjdGlvblJhbmdlKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBTZWxlY3Rpb25SYW5nZVxuICAgICAqIEBwYXJhbSByYW5nZSB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHBhcmVudCBhbiBvcHRpb25hbCBwYXJlbnQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCBwYXJlbnQpIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIHBhcmVudCB9O1xuICAgIH1cbiAgICBTZWxlY3Rpb25SYW5nZS5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgKGNhbmRpZGF0ZS5wYXJlbnQgPT09IHVuZGVmaW5lZCB8fCBTZWxlY3Rpb25SYW5nZS5pcyhjYW5kaWRhdGUucGFyZW50KSk7XG4gICAgfVxuICAgIFNlbGVjdGlvblJhbmdlLmlzID0gaXM7XG59KShTZWxlY3Rpb25SYW5nZSB8fCAoU2VsZWN0aW9uUmFuZ2UgPSB7fSkpO1xuLyoqXG4gKiBBIHNldCBvZiBwcmVkZWZpbmVkIHRva2VuIHR5cGVzLiBUaGlzIHNldCBpcyBub3QgZml4ZWRcbiAqIGFuIGNsaWVudHMgY2FuIHNwZWNpZnkgYWRkaXRpb25hbCB0b2tlbiB0eXBlcyB2aWEgdGhlXG4gKiBjb3JyZXNwb25kaW5nIGNsaWVudCBjYXBhYmlsaXRpZXMuXG4gKlxuICogQHNpbmNlIDMuMTYuMFxuICovXG5leHBvcnQgdmFyIFNlbWFudGljVG9rZW5UeXBlcztcbihmdW5jdGlvbiAoU2VtYW50aWNUb2tlblR5cGVzKSB7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wibmFtZXNwYWNlXCJdID0gXCJuYW1lc3BhY2VcIjtcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgZ2VuZXJpYyB0eXBlLiBBY3RzIGFzIGEgZmFsbGJhY2sgZm9yIHR5cGVzIHdoaWNoIGNhbid0IGJlIG1hcHBlZCB0b1xuICAgICAqIGEgc3BlY2lmaWMgdHlwZSBsaWtlIGNsYXNzIG9yIGVudW0uXG4gICAgICovXG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1widHlwZVwiXSA9IFwidHlwZVwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImNsYXNzXCJdID0gXCJjbGFzc1wiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImVudW1cIl0gPSBcImVudW1cIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJpbnRlcmZhY2VcIl0gPSBcImludGVyZmFjZVwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInN0cnVjdFwiXSA9IFwic3RydWN0XCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1widHlwZVBhcmFtZXRlclwiXSA9IFwidHlwZVBhcmFtZXRlclwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInBhcmFtZXRlclwiXSA9IFwicGFyYW1ldGVyXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1widmFyaWFibGVcIl0gPSBcInZhcmlhYmxlXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wicHJvcGVydHlcIl0gPSBcInByb3BlcnR5XCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wiZW51bU1lbWJlclwiXSA9IFwiZW51bU1lbWJlclwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImV2ZW50XCJdID0gXCJldmVudFwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImZ1bmN0aW9uXCJdID0gXCJmdW5jdGlvblwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcIm1ldGhvZFwiXSA9IFwibWV0aG9kXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wibWFjcm9cIl0gPSBcIm1hY3JvXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wia2V5d29yZFwiXSA9IFwia2V5d29yZFwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcIm1vZGlmaWVyXCJdID0gXCJtb2RpZmllclwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImNvbW1lbnRcIl0gPSBcImNvbW1lbnRcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJzdHJpbmdcIl0gPSBcInN0cmluZ1wiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcIm51bWJlclwiXSA9IFwibnVtYmVyXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wicmVnZXhwXCJdID0gXCJyZWdleHBcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJvcGVyYXRvclwiXSA9IFwib3BlcmF0b3JcIjtcbiAgICAvKipcbiAgICAgKiBAc2luY2UgMy4xNy4wXG4gICAgICovXG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wiZGVjb3JhdG9yXCJdID0gXCJkZWNvcmF0b3JcIjtcbn0pKFNlbWFudGljVG9rZW5UeXBlcyB8fCAoU2VtYW50aWNUb2tlblR5cGVzID0ge30pKTtcbi8qKlxuICogQSBzZXQgb2YgcHJlZGVmaW5lZCB0b2tlbiBtb2RpZmllcnMuIFRoaXMgc2V0IGlzIG5vdCBmaXhlZFxuICogYW4gY2xpZW50cyBjYW4gc3BlY2lmeSBhZGRpdGlvbmFsIHRva2VuIHR5cGVzIHZpYSB0aGVcbiAqIGNvcnJlc3BvbmRpbmcgY2xpZW50IGNhcGFiaWxpdGllcy5cbiAqXG4gKiBAc2luY2UgMy4xNi4wXG4gKi9cbmV4cG9ydCB2YXIgU2VtYW50aWNUb2tlbk1vZGlmaWVycztcbihmdW5jdGlvbiAoU2VtYW50aWNUb2tlbk1vZGlmaWVycykge1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJkZWNsYXJhdGlvblwiXSA9IFwiZGVjbGFyYXRpb25cIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wiZGVmaW5pdGlvblwiXSA9IFwiZGVmaW5pdGlvblwiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJyZWFkb25seVwiXSA9IFwicmVhZG9ubHlcIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wic3RhdGljXCJdID0gXCJzdGF0aWNcIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wiZGVwcmVjYXRlZFwiXSA9IFwiZGVwcmVjYXRlZFwiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJhYnN0cmFjdFwiXSA9IFwiYWJzdHJhY3RcIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wiYXN5bmNcIl0gPSBcImFzeW5jXCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcIm1vZGlmaWNhdGlvblwiXSA9IFwibW9kaWZpY2F0aW9uXCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcImRvY3VtZW50YXRpb25cIl0gPSBcImRvY3VtZW50YXRpb25cIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wiZGVmYXVsdExpYnJhcnlcIl0gPSBcImRlZmF1bHRMaWJyYXJ5XCI7XG59KShTZW1hbnRpY1Rva2VuTW9kaWZpZXJzIHx8IChTZW1hbnRpY1Rva2VuTW9kaWZpZXJzID0ge30pKTtcbi8qKlxuICogQHNpbmNlIDMuMTYuMFxuICovXG5leHBvcnQgdmFyIFNlbWFudGljVG9rZW5zO1xuKGZ1bmN0aW9uIChTZW1hbnRpY1Rva2Vucykge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIChjYW5kaWRhdGUucmVzdWx0SWQgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgY2FuZGlkYXRlLnJlc3VsdElkID09PSAnc3RyaW5nJykgJiZcbiAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoY2FuZGlkYXRlLmRhdGEpICYmIChjYW5kaWRhdGUuZGF0YS5sZW5ndGggPT09IDAgfHwgdHlwZW9mIGNhbmRpZGF0ZS5kYXRhWzBdID09PSAnbnVtYmVyJyk7XG4gICAgfVxuICAgIFNlbWFudGljVG9rZW5zLmlzID0gaXM7XG59KShTZW1hbnRpY1Rva2VucyB8fCAoU2VtYW50aWNUb2tlbnMgPSB7fSkpO1xuLyoqXG4gKiBUaGUgSW5saW5lVmFsdWVUZXh0IG5hbWVzcGFjZSBwcm92aWRlcyBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIElubGluZVZhbHVlVGV4dHMuXG4gKlxuICogQHNpbmNlIDMuMTcuMFxuICovXG5leHBvcnQgdmFyIElubGluZVZhbHVlVGV4dDtcbihmdW5jdGlvbiAoSW5saW5lVmFsdWVUZXh0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBJbmxpbmVWYWx1ZVRleHQgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIHRleHQpIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIHRleHQgfTtcbiAgICB9XG4gICAgSW5saW5lVmFsdWVUZXh0LmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAhPT0gdW5kZWZpbmVkICYmIGNhbmRpZGF0ZSAhPT0gbnVsbCAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudGV4dCk7XG4gICAgfVxuICAgIElubGluZVZhbHVlVGV4dC5pcyA9IGlzO1xufSkoSW5saW5lVmFsdWVUZXh0IHx8IChJbmxpbmVWYWx1ZVRleHQgPSB7fSkpO1xuLyoqXG4gKiBUaGUgSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cCBuYW1lc3BhY2UgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCBJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3Vwcy5cbiAqXG4gKiBAc2luY2UgMy4xNy4wXG4gKi9cbmV4cG9ydCB2YXIgSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cDtcbihmdW5jdGlvbiAoSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgSW5saW5lVmFsdWVUZXh0IGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCB2YXJpYWJsZU5hbWUsIGNhc2VTZW5zaXRpdmVMb29rdXApIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIHZhcmlhYmxlTmFtZSwgY2FzZVNlbnNpdGl2ZUxvb2t1cCB9O1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAhPT0gdW5kZWZpbmVkICYmIGNhbmRpZGF0ZSAhPT0gbnVsbCAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIElzLmJvb2xlYW4oY2FuZGlkYXRlLmNhc2VTZW5zaXRpdmVMb29rdXApXG4gICAgICAgICAgICAmJiAoSXMuc3RyaW5nKGNhbmRpZGF0ZS52YXJpYWJsZU5hbWUpIHx8IGNhbmRpZGF0ZS52YXJpYWJsZU5hbWUgPT09IHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIElubGluZVZhbHVlVmFyaWFibGVMb29rdXAuaXMgPSBpcztcbn0pKElubGluZVZhbHVlVmFyaWFibGVMb29rdXAgfHwgKElubGluZVZhbHVlVmFyaWFibGVMb29rdXAgPSB7fSkpO1xuLyoqXG4gKiBUaGUgSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24gbmFtZXNwYWNlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGggSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24uXG4gKlxuICogQHNpbmNlIDMuMTcuMFxuICovXG5leHBvcnQgdmFyIElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uO1xuKGZ1bmN0aW9uIChJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24gbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIGV4cHJlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIGV4cHJlc3Npb24gfTtcbiAgICB9XG4gICAgSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24uY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICE9PSB1bmRlZmluZWQgJiYgY2FuZGlkYXRlICE9PSBudWxsICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSlcbiAgICAgICAgICAgICYmIChJcy5zdHJpbmcoY2FuZGlkYXRlLmV4cHJlc3Npb24pIHx8IGNhbmRpZGF0ZS5leHByZXNzaW9uID09PSB1bmRlZmluZWQpO1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbi5pcyA9IGlzO1xufSkoSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24gfHwgKElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uID0ge30pKTtcbi8qKlxuICogVGhlIElubGluZVZhbHVlQ29udGV4dCBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBJbmxpbmVWYWx1ZUNvbnRleHR9IGxpdGVyYWxzLlxuICpcbiAqIEBzaW5jZSAzLjE3LjBcbiAqL1xuZXhwb3J0IHZhciBJbmxpbmVWYWx1ZUNvbnRleHQ7XG4oZnVuY3Rpb24gKElubGluZVZhbHVlQ29udGV4dCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgSW5saW5lVmFsdWVDb250ZXh0IGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGZyYW1lSWQsIHN0b3BwZWRMb2NhdGlvbikge1xuICAgICAgICByZXR1cm4geyBmcmFtZUlkLCBzdG9wcGVkTG9jYXRpb24gfTtcbiAgICB9XG4gICAgSW5saW5lVmFsdWVDb250ZXh0LmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIElubGluZVZhbHVlQ29udGV4dH0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIFJhbmdlLmlzKHZhbHVlLnN0b3BwZWRMb2NhdGlvbik7XG4gICAgfVxuICAgIElubGluZVZhbHVlQ29udGV4dC5pcyA9IGlzO1xufSkoSW5saW5lVmFsdWVDb250ZXh0IHx8IChJbmxpbmVWYWx1ZUNvbnRleHQgPSB7fSkpO1xuLyoqXG4gKiBJbmxheSBoaW50IGtpbmRzLlxuICpcbiAqIEBzaW5jZSAzLjE3LjBcbiAqL1xuZXhwb3J0IHZhciBJbmxheUhpbnRLaW5kO1xuKGZ1bmN0aW9uIChJbmxheUhpbnRLaW5kKSB7XG4gICAgLyoqXG4gICAgICogQW4gaW5sYXkgaGludCB0aGF0IGZvciBhIHR5cGUgYW5ub3RhdGlvbi5cbiAgICAgKi9cbiAgICBJbmxheUhpbnRLaW5kLlR5cGUgPSAxO1xuICAgIC8qKlxuICAgICAqIEFuIGlubGF5IGhpbnQgdGhhdCBpcyBmb3IgYSBwYXJhbWV0ZXIuXG4gICAgICovXG4gICAgSW5sYXlIaW50S2luZC5QYXJhbWV0ZXIgPSAyO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gMSB8fCB2YWx1ZSA9PT0gMjtcbiAgICB9XG4gICAgSW5sYXlIaW50S2luZC5pcyA9IGlzO1xufSkoSW5sYXlIaW50S2luZCB8fCAoSW5sYXlIaW50S2luZCA9IHt9KSk7XG5leHBvcnQgdmFyIElubGF5SGludExhYmVsUGFydDtcbihmdW5jdGlvbiAoSW5sYXlIaW50TGFiZWxQYXJ0KSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB7IHZhbHVlIH07XG4gICAgfVxuICAgIElubGF5SGludExhYmVsUGFydC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSlcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUudG9vbHRpcCA9PT0gdW5kZWZpbmVkIHx8IElzLnN0cmluZyhjYW5kaWRhdGUudG9vbHRpcCkgfHwgTWFya3VwQ29udGVudC5pcyhjYW5kaWRhdGUudG9vbHRpcCkpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLmxvY2F0aW9uID09PSB1bmRlZmluZWQgfHwgTG9jYXRpb24uaXMoY2FuZGlkYXRlLmxvY2F0aW9uKSlcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUuY29tbWFuZCA9PT0gdW5kZWZpbmVkIHx8IENvbW1hbmQuaXMoY2FuZGlkYXRlLmNvbW1hbmQpKTtcbiAgICB9XG4gICAgSW5sYXlIaW50TGFiZWxQYXJ0LmlzID0gaXM7XG59KShJbmxheUhpbnRMYWJlbFBhcnQgfHwgKElubGF5SGludExhYmVsUGFydCA9IHt9KSk7XG5leHBvcnQgdmFyIElubGF5SGludDtcbihmdW5jdGlvbiAoSW5sYXlIaW50KSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKHBvc2l0aW9uLCBsYWJlbCwga2luZCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB7IHBvc2l0aW9uLCBsYWJlbCB9O1xuICAgICAgICBpZiAoa2luZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQua2luZCA9IGtpbmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgSW5sYXlIaW50LmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBQb3NpdGlvbi5pcyhjYW5kaWRhdGUucG9zaXRpb24pXG4gICAgICAgICAgICAmJiAoSXMuc3RyaW5nKGNhbmRpZGF0ZS5sYWJlbCkgfHwgSXMudHlwZWRBcnJheShjYW5kaWRhdGUubGFiZWwsIElubGF5SGludExhYmVsUGFydC5pcykpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLmtpbmQgPT09IHVuZGVmaW5lZCB8fCBJbmxheUhpbnRLaW5kLmlzKGNhbmRpZGF0ZS5raW5kKSlcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUudGV4dEVkaXRzID09PSB1bmRlZmluZWQpIHx8IElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLnRleHRFZGl0cywgVGV4dEVkaXQuaXMpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLnRvb2x0aXAgPT09IHVuZGVmaW5lZCB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLnRvb2x0aXApIHx8IE1hcmt1cENvbnRlbnQuaXMoY2FuZGlkYXRlLnRvb2x0aXApKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS5wYWRkaW5nTGVmdCA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLnBhZGRpbmdMZWZ0KSlcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUucGFkZGluZ1JpZ2h0ID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUucGFkZGluZ1JpZ2h0KSk7XG4gICAgfVxuICAgIElubGF5SGludC5pcyA9IGlzO1xufSkoSW5sYXlIaW50IHx8IChJbmxheUhpbnQgPSB7fSkpO1xuZXhwb3J0IHZhciBTdHJpbmdWYWx1ZTtcbihmdW5jdGlvbiAoU3RyaW5nVmFsdWUpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGVTbmlwcGV0KHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB7IGtpbmQ6ICdzbmlwcGV0JywgdmFsdWUgfTtcbiAgICB9XG4gICAgU3RyaW5nVmFsdWUuY3JlYXRlU25pcHBldCA9IGNyZWF0ZVNuaXBwZXQ7XG59KShTdHJpbmdWYWx1ZSB8fCAoU3RyaW5nVmFsdWUgPSB7fSkpO1xuZXhwb3J0IHZhciBJbmxpbmVDb21wbGV0aW9uSXRlbTtcbihmdW5jdGlvbiAoSW5saW5lQ29tcGxldGlvbkl0ZW0pIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUoaW5zZXJ0VGV4dCwgZmlsdGVyVGV4dCwgcmFuZ2UsIGNvbW1hbmQpIHtcbiAgICAgICAgcmV0dXJuIHsgaW5zZXJ0VGV4dCwgZmlsdGVyVGV4dCwgcmFuZ2UsIGNvbW1hbmQgfTtcbiAgICB9XG4gICAgSW5saW5lQ29tcGxldGlvbkl0ZW0uY3JlYXRlID0gY3JlYXRlO1xufSkoSW5saW5lQ29tcGxldGlvbkl0ZW0gfHwgKElubGluZUNvbXBsZXRpb25JdGVtID0ge30pKTtcbmV4cG9ydCB2YXIgSW5saW5lQ29tcGxldGlvbkxpc3Q7XG4oZnVuY3Rpb24gKElubGluZUNvbXBsZXRpb25MaXN0KSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKGl0ZW1zKSB7XG4gICAgICAgIHJldHVybiB7IGl0ZW1zIH07XG4gICAgfVxuICAgIElubGluZUNvbXBsZXRpb25MaXN0LmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKElubGluZUNvbXBsZXRpb25MaXN0IHx8IChJbmxpbmVDb21wbGV0aW9uTGlzdCA9IHt9KSk7XG4vKipcbiAqIERlc2NyaWJlcyBob3cgYW4ge0BsaW5rIElubGluZUNvbXBsZXRpb25JdGVtUHJvdmlkZXIgaW5saW5lIGNvbXBsZXRpb24gcHJvdmlkZXJ9IHdhcyB0cmlnZ2VyZWQuXG4gKlxuICogQHNpbmNlIDMuMTguMFxuICogQHByb3Bvc2VkXG4gKi9cbmV4cG9ydCB2YXIgSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kO1xuKGZ1bmN0aW9uIChJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmQpIHtcbiAgICAvKipcbiAgICAgKiBDb21wbGV0aW9uIHdhcyB0cmlnZ2VyZWQgZXhwbGljaXRseSBieSBhIHVzZXIgZ2VzdHVyZS5cbiAgICAgKi9cbiAgICBJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmQuSW52b2tlZCA9IDA7XG4gICAgLyoqXG4gICAgICogQ29tcGxldGlvbiB3YXMgdHJpZ2dlcmVkIGF1dG9tYXRpY2FsbHkgd2hpbGUgZWRpdGluZy5cbiAgICAgKi9cbiAgICBJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmQuQXV0b21hdGljID0gMTtcbn0pKElubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZCB8fCAoSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kID0ge30pKTtcbmV4cG9ydCB2YXIgU2VsZWN0ZWRDb21wbGV0aW9uSW5mbztcbihmdW5jdGlvbiAoU2VsZWN0ZWRDb21wbGV0aW9uSW5mbykge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgdGV4dCkge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgdGV4dCB9O1xuICAgIH1cbiAgICBTZWxlY3RlZENvbXBsZXRpb25JbmZvLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKFNlbGVjdGVkQ29tcGxldGlvbkluZm8gfHwgKFNlbGVjdGVkQ29tcGxldGlvbkluZm8gPSB7fSkpO1xuZXhwb3J0IHZhciBJbmxpbmVDb21wbGV0aW9uQ29udGV4dDtcbihmdW5jdGlvbiAoSW5saW5lQ29tcGxldGlvbkNvbnRleHQpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUodHJpZ2dlcktpbmQsIHNlbGVjdGVkQ29tcGxldGlvbkluZm8pIHtcbiAgICAgICAgcmV0dXJuIHsgdHJpZ2dlcktpbmQsIHNlbGVjdGVkQ29tcGxldGlvbkluZm8gfTtcbiAgICB9XG4gICAgSW5saW5lQ29tcGxldGlvbkNvbnRleHQuY3JlYXRlID0gY3JlYXRlO1xufSkoSW5saW5lQ29tcGxldGlvbkNvbnRleHQgfHwgKElubGluZUNvbXBsZXRpb25Db250ZXh0ID0ge30pKTtcbmV4cG9ydCB2YXIgV29ya3NwYWNlRm9sZGVyO1xuKGZ1bmN0aW9uIChXb3Jrc3BhY2VGb2xkZXIpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBVUkkuaXMoY2FuZGlkYXRlLnVyaSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5uYW1lKTtcbiAgICB9XG4gICAgV29ya3NwYWNlRm9sZGVyLmlzID0gaXM7XG59KShXb3Jrc3BhY2VGb2xkZXIgfHwgKFdvcmtzcGFjZUZvbGRlciA9IHt9KSk7XG5leHBvcnQgY29uc3QgRU9MID0gWydcXG4nLCAnXFxyXFxuJywgJ1xcciddO1xuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgdGhlIHRleHQgZG9jdW1lbnQgZnJvbSB0aGUgbmV3IHZzY29kZS1sYW5ndWFnZXNlcnZlci10ZXh0ZG9jdW1lbnQgcGFja2FnZS5cbiAqL1xuZXhwb3J0IHZhciBUZXh0RG9jdW1lbnQ7XG4oZnVuY3Rpb24gKFRleHREb2N1bWVudCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgSVRleHREb2N1bWVudCBsaXRlcmFsIGZyb20gdGhlIGdpdmVuIHVyaSBhbmQgY29udGVudC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSBkb2N1bWVudCdzIHVyaS5cbiAgICAgKiBAcGFyYW0gbGFuZ3VhZ2VJZCBUaGUgZG9jdW1lbnQncyBsYW5ndWFnZSBJZC5cbiAgICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgZG9jdW1lbnQncyB2ZXJzaW9uLlxuICAgICAqIEBwYXJhbSBjb250ZW50IFRoZSBkb2N1bWVudCdzIGNvbnRlbnQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHVyaSwgbGFuZ3VhZ2VJZCwgdmVyc2lvbiwgY29udGVudCkge1xuICAgICAgICByZXR1cm4gbmV3IEZ1bGxUZXh0RG9jdW1lbnQodXJpLCBsYW5ndWFnZUlkLCB2ZXJzaW9uLCBjb250ZW50KTtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50LmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIElUZXh0RG9jdW1lbnR9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLmxhbmd1YWdlSWQpIHx8IElzLnN0cmluZyhjYW5kaWRhdGUubGFuZ3VhZ2VJZCkpICYmIElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS5saW5lQ291bnQpXG4gICAgICAgICAgICAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5nZXRUZXh0KSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5wb3NpdGlvbkF0KSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5vZmZzZXRBdCkgPyB0cnVlIDogZmFsc2U7XG4gICAgfVxuICAgIFRleHREb2N1bWVudC5pcyA9IGlzO1xuICAgIGZ1bmN0aW9uIGFwcGx5RWRpdHMoZG9jdW1lbnQsIGVkaXRzKSB7XG4gICAgICAgIGxldCB0ZXh0ID0gZG9jdW1lbnQuZ2V0VGV4dCgpO1xuICAgICAgICBsZXQgc29ydGVkRWRpdHMgPSBtZXJnZVNvcnQoZWRpdHMsIChhLCBiKSA9PiB7XG4gICAgICAgICAgICBsZXQgZGlmZiA9IGEucmFuZ2Uuc3RhcnQubGluZSAtIGIucmFuZ2Uuc3RhcnQubGluZTtcbiAgICAgICAgICAgIGlmIChkaWZmID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEucmFuZ2Uuc3RhcnQuY2hhcmFjdGVyIC0gYi5yYW5nZS5zdGFydC5jaGFyYWN0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZGlmZjtcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBsYXN0TW9kaWZpZWRPZmZzZXQgPSB0ZXh0Lmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaSA9IHNvcnRlZEVkaXRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBsZXQgZSA9IHNvcnRlZEVkaXRzW2ldO1xuICAgICAgICAgICAgbGV0IHN0YXJ0T2Zmc2V0ID0gZG9jdW1lbnQub2Zmc2V0QXQoZS5yYW5nZS5zdGFydCk7XG4gICAgICAgICAgICBsZXQgZW5kT2Zmc2V0ID0gZG9jdW1lbnQub2Zmc2V0QXQoZS5yYW5nZS5lbmQpO1xuICAgICAgICAgICAgaWYgKGVuZE9mZnNldCA8PSBsYXN0TW9kaWZpZWRPZmZzZXQpIHtcbiAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMCwgc3RhcnRPZmZzZXQpICsgZS5uZXdUZXh0ICsgdGV4dC5zdWJzdHJpbmcoZW5kT2Zmc2V0LCB0ZXh0Lmxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ092ZXJsYXBwaW5nIGVkaXQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxhc3RNb2RpZmllZE9mZnNldCA9IHN0YXJ0T2Zmc2V0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnQuYXBwbHlFZGl0cyA9IGFwcGx5RWRpdHM7XG4gICAgZnVuY3Rpb24gbWVyZ2VTb3J0KGRhdGEsIGNvbXBhcmUpIHtcbiAgICAgICAgaWYgKGRhdGEubGVuZ3RoIDw9IDEpIHtcbiAgICAgICAgICAgIC8vIHNvcnRlZFxuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcCA9IChkYXRhLmxlbmd0aCAvIDIpIHwgMDtcbiAgICAgICAgY29uc3QgbGVmdCA9IGRhdGEuc2xpY2UoMCwgcCk7XG4gICAgICAgIGNvbnN0IHJpZ2h0ID0gZGF0YS5zbGljZShwKTtcbiAgICAgICAgbWVyZ2VTb3J0KGxlZnQsIGNvbXBhcmUpO1xuICAgICAgICBtZXJnZVNvcnQocmlnaHQsIGNvbXBhcmUpO1xuICAgICAgICBsZXQgbGVmdElkeCA9IDA7XG4gICAgICAgIGxldCByaWdodElkeCA9IDA7XG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgd2hpbGUgKGxlZnRJZHggPCBsZWZ0Lmxlbmd0aCAmJiByaWdodElkeCA8IHJpZ2h0Lmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IHJldCA9IGNvbXBhcmUobGVmdFtsZWZ0SWR4XSwgcmlnaHRbcmlnaHRJZHhdKTtcbiAgICAgICAgICAgIGlmIChyZXQgPD0gMCkge1xuICAgICAgICAgICAgICAgIC8vIHNtYWxsZXJfZXF1YWwgLT4gdGFrZSBsZWZ0IHRvIHByZXNlcnZlIG9yZGVyXG4gICAgICAgICAgICAgICAgZGF0YVtpKytdID0gbGVmdFtsZWZ0SWR4KytdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gZ3JlYXRlciAtPiB0YWtlIHJpZ2h0XG4gICAgICAgICAgICAgICAgZGF0YVtpKytdID0gcmlnaHRbcmlnaHRJZHgrK107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKGxlZnRJZHggPCBsZWZ0Lmxlbmd0aCkge1xuICAgICAgICAgICAgZGF0YVtpKytdID0gbGVmdFtsZWZ0SWR4KytdO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChyaWdodElkeCA8IHJpZ2h0Lmxlbmd0aCkge1xuICAgICAgICAgICAgZGF0YVtpKytdID0gcmlnaHRbcmlnaHRJZHgrK107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxufSkoVGV4dERvY3VtZW50IHx8IChUZXh0RG9jdW1lbnQgPSB7fSkpO1xuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgdGhlIHRleHQgZG9jdW1lbnQgZnJvbSB0aGUgbmV3IHZzY29kZS1sYW5ndWFnZXNlcnZlci10ZXh0ZG9jdW1lbnQgcGFja2FnZS5cbiAqL1xuY2xhc3MgRnVsbFRleHREb2N1bWVudCB7XG4gICAgY29uc3RydWN0b3IodXJpLCBsYW5ndWFnZUlkLCB2ZXJzaW9uLCBjb250ZW50KSB7XG4gICAgICAgIHRoaXMuX3VyaSA9IHVyaTtcbiAgICAgICAgdGhpcy5fbGFuZ3VhZ2VJZCA9IGxhbmd1YWdlSWQ7XG4gICAgICAgIHRoaXMuX3ZlcnNpb24gPSB2ZXJzaW9uO1xuICAgICAgICB0aGlzLl9jb250ZW50ID0gY29udGVudDtcbiAgICAgICAgdGhpcy5fbGluZU9mZnNldHMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGdldCB1cmkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl91cmk7XG4gICAgfVxuICAgIGdldCBsYW5ndWFnZUlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGFuZ3VhZ2VJZDtcbiAgICB9XG4gICAgZ2V0IHZlcnNpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92ZXJzaW9uO1xuICAgIH1cbiAgICBnZXRUZXh0KHJhbmdlKSB7XG4gICAgICAgIGlmIChyYW5nZSkge1xuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5vZmZzZXRBdChyYW5nZS5zdGFydCk7XG4gICAgICAgICAgICBsZXQgZW5kID0gdGhpcy5vZmZzZXRBdChyYW5nZS5lbmQpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRlbnQuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9jb250ZW50O1xuICAgIH1cbiAgICB1cGRhdGUoZXZlbnQsIHZlcnNpb24pIHtcbiAgICAgICAgdGhpcy5fY29udGVudCA9IGV2ZW50LnRleHQ7XG4gICAgICAgIHRoaXMuX3ZlcnNpb24gPSB2ZXJzaW9uO1xuICAgICAgICB0aGlzLl9saW5lT2Zmc2V0cyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZ2V0TGluZU9mZnNldHMoKSB7XG4gICAgICAgIGlmICh0aGlzLl9saW5lT2Zmc2V0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsZXQgbGluZU9mZnNldHMgPSBbXTtcbiAgICAgICAgICAgIGxldCB0ZXh0ID0gdGhpcy5fY29udGVudDtcbiAgICAgICAgICAgIGxldCBpc0xpbmVTdGFydCA9IHRydWU7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNMaW5lU3RhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGluZU9mZnNldHMucHVzaChpKTtcbiAgICAgICAgICAgICAgICAgICAgaXNMaW5lU3RhcnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGNoID0gdGV4dC5jaGFyQXQoaSk7XG4gICAgICAgICAgICAgICAgaXNMaW5lU3RhcnQgPSAoY2ggPT09ICdcXHInIHx8IGNoID09PSAnXFxuJyk7XG4gICAgICAgICAgICAgICAgaWYgKGNoID09PSAnXFxyJyAmJiBpICsgMSA8IHRleHQubGVuZ3RoICYmIHRleHQuY2hhckF0KGkgKyAxKSA9PT0gJ1xcbicpIHtcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc0xpbmVTdGFydCAmJiB0ZXh0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsaW5lT2Zmc2V0cy5wdXNoKHRleHQubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2xpbmVPZmZzZXRzID0gbGluZU9mZnNldHM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2xpbmVPZmZzZXRzO1xuICAgIH1cbiAgICBwb3NpdGlvbkF0KG9mZnNldCkge1xuICAgICAgICBvZmZzZXQgPSBNYXRoLm1heChNYXRoLm1pbihvZmZzZXQsIHRoaXMuX2NvbnRlbnQubGVuZ3RoKSwgMCk7XG4gICAgICAgIGxldCBsaW5lT2Zmc2V0cyA9IHRoaXMuZ2V0TGluZU9mZnNldHMoKTtcbiAgICAgICAgbGV0IGxvdyA9IDAsIGhpZ2ggPSBsaW5lT2Zmc2V0cy5sZW5ndGg7XG4gICAgICAgIGlmIChoaWdoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUG9zaXRpb24uY3JlYXRlKDAsIG9mZnNldCk7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKGxvdyA8IGhpZ2gpIHtcbiAgICAgICAgICAgIGxldCBtaWQgPSBNYXRoLmZsb29yKChsb3cgKyBoaWdoKSAvIDIpO1xuICAgICAgICAgICAgaWYgKGxpbmVPZmZzZXRzW21pZF0gPiBvZmZzZXQpIHtcbiAgICAgICAgICAgICAgICBoaWdoID0gbWlkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbG93ID0gbWlkICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBsb3cgaXMgdGhlIGxlYXN0IHggZm9yIHdoaWNoIHRoZSBsaW5lIG9mZnNldCBpcyBsYXJnZXIgdGhhbiB0aGUgY3VycmVudCBvZmZzZXRcbiAgICAgICAgLy8gb3IgYXJyYXkubGVuZ3RoIGlmIG5vIGxpbmUgb2Zmc2V0IGlzIGxhcmdlciB0aGFuIHRoZSBjdXJyZW50IG9mZnNldFxuICAgICAgICBsZXQgbGluZSA9IGxvdyAtIDE7XG4gICAgICAgIHJldHVybiBQb3NpdGlvbi5jcmVhdGUobGluZSwgb2Zmc2V0IC0gbGluZU9mZnNldHNbbGluZV0pO1xuICAgIH1cbiAgICBvZmZzZXRBdChwb3NpdGlvbikge1xuICAgICAgICBsZXQgbGluZU9mZnNldHMgPSB0aGlzLmdldExpbmVPZmZzZXRzKCk7XG4gICAgICAgIGlmIChwb3NpdGlvbi5saW5lID49IGxpbmVPZmZzZXRzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRlbnQubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBvc2l0aW9uLmxpbmUgPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbGluZU9mZnNldCA9IGxpbmVPZmZzZXRzW3Bvc2l0aW9uLmxpbmVdO1xuICAgICAgICBsZXQgbmV4dExpbmVPZmZzZXQgPSAocG9zaXRpb24ubGluZSArIDEgPCBsaW5lT2Zmc2V0cy5sZW5ndGgpID8gbGluZU9mZnNldHNbcG9zaXRpb24ubGluZSArIDFdIDogdGhpcy5fY29udGVudC5sZW5ndGg7XG4gICAgICAgIHJldHVybiBNYXRoLm1heChNYXRoLm1pbihsaW5lT2Zmc2V0ICsgcG9zaXRpb24uY2hhcmFjdGVyLCBuZXh0TGluZU9mZnNldCksIGxpbmVPZmZzZXQpO1xuICAgIH1cbiAgICBnZXQgbGluZUNvdW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRMaW5lT2Zmc2V0cygpLmxlbmd0aDtcbiAgICB9XG59XG52YXIgSXM7XG4oZnVuY3Rpb24gKElzKSB7XG4gICAgY29uc3QgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuICAgIGZ1bmN0aW9uIGRlZmluZWQodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCc7XG4gICAgfVxuICAgIElzLmRlZmluZWQgPSBkZWZpbmVkO1xuICAgIGZ1bmN0aW9uIHVuZGVmaW5lZCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJztcbiAgICB9XG4gICAgSXMudW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGZ1bmN0aW9uIGJvb2xlYW4odmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZTtcbiAgICB9XG4gICAgSXMuYm9vbGVhbiA9IGJvb2xlYW47XG4gICAgZnVuY3Rpb24gc3RyaW5nKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgU3RyaW5nXSc7XG4gICAgfVxuICAgIElzLnN0cmluZyA9IHN0cmluZztcbiAgICBmdW5jdGlvbiBudW1iZXIodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBOdW1iZXJdJztcbiAgICB9XG4gICAgSXMubnVtYmVyID0gbnVtYmVyO1xuICAgIGZ1bmN0aW9uIG51bWJlclJhbmdlKHZhbHVlLCBtaW4sIG1heCkge1xuICAgICAgICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IE51bWJlcl0nICYmIG1pbiA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSBtYXg7XG4gICAgfVxuICAgIElzLm51bWJlclJhbmdlID0gbnVtYmVyUmFuZ2U7XG4gICAgZnVuY3Rpb24gaW50ZWdlcih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IE51bWJlcl0nICYmIC0yMTQ3NDgzNjQ4IDw9IHZhbHVlICYmIHZhbHVlIDw9IDIxNDc0ODM2NDc7XG4gICAgfVxuICAgIElzLmludGVnZXIgPSBpbnRlZ2VyO1xuICAgIGZ1bmN0aW9uIHVpbnRlZ2VyKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgTnVtYmVyXScgJiYgMCA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSAyMTQ3NDgzNjQ3O1xuICAgIH1cbiAgICBJcy51aW50ZWdlciA9IHVpbnRlZ2VyO1xuICAgIGZ1bmN0aW9uIGZ1bmModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xuICAgIH1cbiAgICBJcy5mdW5jID0gZnVuYztcbiAgICBmdW5jdGlvbiBvYmplY3RMaXRlcmFsKHZhbHVlKSB7XG4gICAgICAgIC8vIFN0cmljdGx5IHNwZWFraW5nIGNsYXNzIGluc3RhbmNlcyBwYXNzIHRoaXMgY2hlY2sgYXMgd2VsbC4gU2luY2UgdGhlIExTUFxuICAgICAgICAvLyBkb2Vzbid0IHVzZSBjbGFzc2VzIHdlIGlnbm9yZSB0aGlzIGZvciBub3cuIElmIHdlIGRvIHdlIG5lZWQgdG8gYWRkIHNvbWV0aGluZ1xuICAgICAgICAvLyBsaWtlIHRoaXM6IGBPYmplY3QuZ2V0UHJvdG90eXBlT2YoT2JqZWN0LmdldFByb3RvdHlwZU9mKHgpKSA9PT0gbnVsbGBcbiAgICAgICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCc7XG4gICAgfVxuICAgIElzLm9iamVjdExpdGVyYWwgPSBvYmplY3RMaXRlcmFsO1xuICAgIGZ1bmN0aW9uIHR5cGVkQXJyYXkodmFsdWUsIGNoZWNrKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5ldmVyeShjaGVjayk7XG4gICAgfVxuICAgIElzLnR5cGVkQXJyYXkgPSB0eXBlZEFycmF5O1xufSkoSXMgfHwgKElzID0ge30pKTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUtBLGFBQU8sZUFBZSxTQUFTLGNBQWMsRUFBRSxPQUFPLEtBQUssQ0FBQztBQUM1RCxjQUFRLGNBQWMsUUFBUSxRQUFRLFFBQVEsT0FBTyxRQUFRLFFBQVEsUUFBUSxTQUFTLFFBQVEsU0FBUyxRQUFRLFVBQVU7QUFDekgs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Q3RCLGlCQUFPLEtBQUs7QUFBQSxRQUNoQjtBQUFBLE1BQ0o7QUFDQSxjQUFRLGVBQWU7QUFDdkIsVUFBTSxlQUFOLGNBQTJCLHlCQUF5QjtBQUFBLFFBQ2hELFlBQVksUUFBUTtBQUNoQixnQkFBTSxRQUFRLENBQUM7QUFBQSxRQUNuQjtBQUFBLE1BQ0o7QUFDQSxjQUFRLGVBQWU7QUFDdkIsVUFBTSxlQUFOLGNBQTJCLHlCQUF5QjtBQUFBLFFBQ2hELFlBQVksUUFBUTtBQUNoQixnQkFBTSxRQUFRLENBQUM7QUFBQSxRQUNuQjtBQUFBLE1BQ0o7QUFDQSxjQUFRLGVBQWU7QUFDdkIsVUFBTSxlQUFOLGNBQTJCLHlCQUF5QjtBQUFBLFFBQ2hELFlBQVksUUFBUTtBQUNoQixnQkFBTSxRQUFRLENBQUM7QUFBQSxRQUNuQjtBQUFBLE1BQ0o7QUFDQSxjQUFRLGVBQWU7QUFDdkIsVUFBTSxlQUFOLGNBQTJCLHlCQUF5QjtBQUFBLFFBQ2hELFlBQVksUUFBUTtBQUNoQixnQkFBTSxRQUFRLENBQUM7QUFBQSxRQUNuQjtBQUFBLE1BQ0o7QUFDQSxjQUFRLGVBQWU7QUFDdkIsVUFBTSxlQUFOLGNBQTJCLHlCQUF5QjtBQUFBLFFBQ2hELFlBQVksUUFBUTtBQUNoQixnQkFBTSxRQUFRLENBQUM7QUFBQSxRQUNuQjtBQUFBLE1BQ0o7QUFDQSxjQUFRLGVBQWU7QUFDdkIsVUFBTSxlQUFOLGNBQTJCLHlCQUF5QjtBQUFBLFFBQ2hELFlBQVksUUFBUTtBQUNoQixnQkFBTSxRQUFRLENBQUM7QUFBQSxRQUNuQjtBQUFBLE1BQ0o7QUFDQSxjQUFRLGVBQWU7QUFDdkIsVUFBTSxlQUFOLGNBQTJCLHlCQUF5QjtBQUFBLFFBQ2hELFlBQVksUUFBUTtBQUNoQixnQkFBTSxRQUFRLENBQUM7QUFBQSxRQUNuQjtBQUFBLE1BQ0o7QUFDQSxjQUFRLGVBQWU7QUFDdkIsVUFBTSxlQUFOLGNBQTJCLHlCQUF5QjtBQUFBLFFBQ2hELFlBQVksUUFBUTtBQUNoQixnQkFBTSxRQUFRLENBQUM7QUFBQSxRQUNuQjtBQUFBLE1BQ0o7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YWdlIiwgIlRvdWNoIiwgIkRpc3Bvc2FibGUiLCAiUkFMIiwgIkV2ZW50IiwgIklzIiwgIkNhbmNlbGxhdGlvblRva2VuIiwgIkNhbmNlbGxhdGlvblN0YXRlIiwgIl9jb25uIiwgIklzIiwgIk1lc3NhZ2VSZWFkZXIiLCAiQWJzdHJhY3RNZXNzYWdlUmVhZGVyIiwgIlJlc29sdmVkTWVzc2FnZVJlYWRlck9wdGlvbnMiLCAiSXMiLCAiTWVzc2FnZVdyaXRlciIsICJBYnN0cmFjdE1lc3NhZ2VXcml0ZXIiLCAiUmVzb2x2ZWRNZXNzYWdlV3JpdGVyT3B0aW9ucyIsICJyZXN1bHQiLCAiSXMiLCAiQ2FuY2VsTm90aWZpY2F0aW9uIiwgIlByb2dyZXNzVG9rZW4iLCAiUHJvZ3Jlc3NOb3RpZmljYXRpb24iLCAiU3RhclJlcXVlc3RIYW5kbGVyIiwgIlRyYWNlIiwgIlRyYWNlVmFsdWVzIiwgIlRyYWNlRm9ybWF0IiwgIlNldFRyYWNlTm90aWZpY2F0aW9uIiwgIkxvZ1RyYWNlTm90aWZpY2F0aW9uIiwgIkNvbm5lY3Rpb25FcnJvcnMiLCAiQ29ubmVjdGlvblN0cmF0ZWd5IiwgIklkQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSIsICJSZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSIsICJDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5IiwgIkNhbmNlbGxhdGlvblNlbmRlclN0cmF0ZWd5IiwgIkNhbmNlbGxhdGlvblN0cmF0ZWd5IiwgIk1lc3NhZ2VTdHJhdGVneSIsICJDb25uZWN0aW9uT3B0aW9ucyIsICJDb25uZWN0aW9uU3RhdGUiLCAiY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24iLCAic3RhcnRUaW1lIiwgIlJJTCIsICJtIiwgImV4cG9ydHMiLCAiY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24iLCAiaW1wb3J0X3ZzY29kZV9qc29ucnBjIiwgImltcG9ydF92c2NvZGVfanNvbnJwYyIsICJpbXBvcnRfdnNjb2RlX2pzb25ycGMiLCAiaW1wb3J0X3ZzY29kZV9qc29ucnBjIiwgIkRvY3VtZW50VXJpIiwgIlVSSSIsICJpbnRlZ2VyIiwgInVpbnRlZ2VyIiwgIlBvc2l0aW9uIiwgIlJhbmdlIiwgIkxvY2F0aW9uIiwgIkxvY2F0aW9uTGluayIsICJDb2xvciIsICJDb2xvckluZm9ybWF0aW9uIiwgIkNvbG9yUHJlc2VudGF0aW9uIiwgIkZvbGRpbmdSYW5nZUtpbmQiLCAiRm9sZGluZ1JhbmdlIiwgIkRpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24iLCAibG9jYXRpb24iLCAiRGlhZ25vc3RpY1NldmVyaXR5IiwgIkRpYWdub3N0aWNUYWciLCAiQ29kZURlc2NyaXB0aW9uIiwgIkRpYWdub3N0aWMiLCAiQ29tbWFuZCIsICJUZXh0RWRpdCIsICJDaGFuZ2VBbm5vdGF0aW9uIiwgIkNoYW5nZUFubm90YXRpb25JZGVudGlmaWVyIiwgIkFubm90YXRlZFRleHRFZGl0IiwgIlRleHREb2N1bWVudEVkaXQiLCAiQ3JlYXRlRmlsZSIsICJSZW5hbWVGaWxlIiwgIkRlbGV0ZUZpbGUiLCAiV29ya3NwYWNlRWRpdCIsICJUZXh0RG9jdW1lbnRJZGVudGlmaWVyIiwgIlZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIiLCAiT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIiwgIlRleHREb2N1bWVudEl0ZW0iLCAiTWFya3VwS2luZCIsICJNYXJrdXBDb250ZW50IiwgIkNvbXBsZXRpb25JdGVtS2luZCIsICJJbnNlcnRUZXh0Rm9ybWF0IiwgIkNvbXBsZXRpb25JdGVtVGFnIiwgIkluc2VydFJlcGxhY2VFZGl0IiwgIlJhbmdlIiwgIkluc2VydFRleHRNb2RlIiwgIkNvbXBsZXRpb25JdGVtTGFiZWxEZXRhaWxzIiwgIkNvbXBsZXRpb25JdGVtIiwgIkNvbXBsZXRpb25MaXN0IiwgIk1hcmtlZFN0cmluZyIsICJIb3ZlciIsICJQYXJhbWV0ZXJJbmZvcm1hdGlvbiIsICJTaWduYXR1cmVJbmZvcm1hdGlvbiIsICJEb2N1bWVudEhpZ2hsaWdodEtpbmQiLCAiRG9jdW1lbnRIaWdobGlnaHQiLCAiU3ltYm9sS2luZCIsICJTeW1ib2xUYWciLCAiU3ltYm9sSW5mb3JtYXRpb24iLCAiV29ya3NwYWNlU3ltYm9sIiwgIkRvY3VtZW50U3ltYm9sIiwgIkNvZGVBY3Rpb25LaW5kIiwgIkNvZGVBY3Rpb25UcmlnZ2VyS2luZCIsICJDb2RlQWN0aW9uQ29udGV4dCIsICJDb2RlQWN0aW9uIiwgIkNvZGVMZW5zIiwgIkZvcm1hdHRpbmdPcHRpb25zIiwgIkRvY3VtZW50TGluayIsICJTZWxlY3Rpb25SYW5nZSIsICJTZW1hbnRpY1Rva2VuVHlwZXMiLCAiU2VtYW50aWNUb2tlbk1vZGlmaWVycyIsICJTZW1hbnRpY1Rva2VucyIsICJJbmxpbmVWYWx1ZVRleHQiLCAiSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cCIsICJJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbiIsICJJbmxpbmVWYWx1ZUNvbnRleHQiLCAiSW5sYXlIaW50S2luZCIsICJJbmxheUhpbnRMYWJlbFBhcnQiLCAiSW5sYXlIaW50IiwgIlBvc2l0aW9uIiwgIlN0cmluZ1ZhbHVlIiwgIklubGluZUNvbXBsZXRpb25JdGVtIiwgIklubGluZUNvbXBsZXRpb25MaXN0IiwgIklubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZCIsICJTZWxlY3RlZENvbXBsZXRpb25JbmZvIiwgIklubGluZUNvbXBsZXRpb25Db250ZXh0IiwgIldvcmtzcGFjZUZvbGRlciIsICJUZXh0RG9jdW1lbnQiLCAiUG9zaXRpb24iLCAiSXMiLCAidW5kZWZpbmVkIiwgImludGVnZXIiLCAidWludGVnZXIiLCAibSJdCn0K diff --git a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/lsp/java-lsp-client.ts b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/lsp/java-lsp-client.ts index 7f859e8186f..e916ecfcc19 100644 --- a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/lsp/java-lsp-client.ts +++ b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/lsp/java-lsp-client.ts @@ -32,6 +32,8 @@ import { InsertTextFormat, MarkupContent, MarkupKind, + type CodeAction, + type Command, type CompletionItem, type CompletionList, type Diagnostic, @@ -40,6 +42,8 @@ import { type ParameterInformation, type SignatureHelp, type SignatureInformation, + type TextEdit, + type WorkspaceEdit, } from 'vscode-languageserver-types'; // ------------------------------------------------------------------------- @@ -109,6 +113,23 @@ export async function connect(resourcePath: string): Promise { }))); }); + // Server -> client requests that drive refactor / generate results and dynamic registration. + _conn.onRequest('workspace/applyEdit', (params: { edit: WorkspaceEdit }) => { + applyWorkspaceEdit(params.edit); + return { applied: true }; + }); + _conn.onRequest('workspace/configuration', (params: { items: Array<{ section?: string }> }) => + (params.items ?? []).map(() => jdtlsSettings().java)); + _conn.onRequest('client/registerCapability', () => null); + _conn.onRequest('client/unregisterCapability', () => null); + _conn.onRequest('window/showMessageRequest', () => null); + _conn.onRequest('window/workDoneProgress/create', () => null); + _conn.onNotification('window/logMessage', (p: { message: string }) => console.debug('[java-lsp]', p?.message)); + _conn.onNotification('window/showMessage', (p: { message: string }) => console.info('[java-lsp]', p?.message)); + // JDT.LS language-status / progress notifications — acknowledged silently. + _conn.onNotification('language/status', () => { /* indexing/ready status, ignored */ }); + _conn.onNotification('language/progressReport', () => { /* build progress, ignored */ }); + _conn.listen(); const rootUri = _workspaceRoot; @@ -118,10 +139,16 @@ export async function connect(resourcePath: string): Promise { initializationOptions: { settings: jdtlsSettings(), extendedClientCapabilities: { - progressReportProvider: false, - classFileContentsSupport: true, + progressReportProvider: false, + classFileContentsSupport: true, resolveAdditionalTextEditsSupport: true, - inferSelectionSupport: [], + advancedGenerateAccessorsSupport: true, + generateToStringPromptSupport: true, + generateConstructorsPromptSupport: true, + generateDelegateMethodsPromptSupport: true, + hashCodeEqualsPromptSupport: true, + advancedOrganizeImportsSupport: true, + inferSelectionSupport: ['extractMethod', 'extractVariable', 'extractField'], }, }, workspaceFolders: [{ uri: rootUri, name: workspace }], @@ -130,15 +157,44 @@ export async function connect(resourcePath: string): Promise { synchronization: { dynamicRegistration: true, willSave: false, didSave: true, willSaveWaitUntil: false }, completion: { dynamicRegistration: true, - completionItem: { snippetSupport: true, documentationFormat: ['markdown', 'plaintext'], deprecatedSupport: true, commitCharactersSupport: true }, + completionItem: { + snippetSupport: true, + documentationFormat: ['markdown', 'plaintext'], + deprecatedSupport: true, + commitCharactersSupport: true, + resolveSupport: { properties: ['documentation', 'detail', 'additionalTextEdits'] }, + }, contextSupport: true, }, hover: { dynamicRegistration: true, contentFormat: ['markdown', 'plaintext'] }, signatureHelp: { dynamicRegistration: true, signatureInformation: { documentationFormat: ['markdown', 'plaintext'], parameterInformation: { labelOffsetSupport: true } } }, definition: { dynamicRegistration: true }, + references: { dynamicRegistration: true }, + documentSymbol: { dynamicRegistration: true }, + formatting: { dynamicRegistration: true }, + rangeFormatting: { dynamicRegistration: true }, + rename: { dynamicRegistration: true, prepareSupport: true }, + codeAction: { + dynamicRegistration: true, + codeActionLiteralSupport: { + codeActionKind: { + valueSet: ['quickfix', 'refactor', 'refactor.extract', 'refactor.inline', + 'refactor.rewrite', 'source', 'source.organizeImports'], + }, + }, + isPreferredSupport: true, + dataSupport: true, + resolveSupport: { properties: ['edit'] }, + }, publishDiagnostics: { relatedInformation: true }, }, - workspace: { configuration: true, didChangeConfiguration: { dynamicRegistration: true } }, + workspace: { + applyEdit: true, + configuration: true, + executeCommand: { dynamicRegistration: true }, + didChangeConfiguration: { dynamicRegistration: true }, + workspaceEdit: { documentChanges: true, resourceOperations: ['create', 'rename', 'delete'] }, + }, }, }); @@ -207,6 +263,10 @@ function isWorkspaceFile(uri: string): boolean { function registerProviders(): void { + monaco.editor.registerCommand(APPLY_ACTION_COMMAND, (_accessor: unknown, action: CodeAction | Command) => { + applyCodeAction(action); + }); + monaco.languages.registerCompletionItemProvider('java', { triggerCharacters: ['.', '@', '<'], provideCompletionItems: async (model, position) => { @@ -222,6 +282,25 @@ function registerProviders(): void { suggestions: items.map(item => lspCompletionToMonaco(item, model, position)), }; }, + // Resolve documentation and, crucially, the auto-import additionalTextEdits which JDT.LS only + // attaches on resolve — selecting a type then inserts its import statement. + resolveCompletionItem: async (item) => { + const lsp = (item as MonacoCompletionItem)._lsp; + if (!_conn || !lsp) return item; + try { + const resolved: CompletionItem = await _conn.sendRequest('completionItem/resolve', lsp); + if (resolved.documentation) { + item.documentation = { value: markupToString(resolved.documentation), isTrusted: false }; + } + if (resolved.detail) item.detail = resolved.detail; + if (resolved.additionalTextEdits?.length) { + item.additionalTextEdits = resolved.additionalTextEdits.map(textEditToMonaco); + } + } catch (e) { + console.debug('[java-lsp] completion resolve failed:', (e as Error)?.message); + } + return item; + }, }); monaco.languages.registerHoverProvider('java', { @@ -288,6 +367,88 @@ function registerProviders(): void { })); }, }); + + monaco.languages.registerReferenceProvider('java', { + provideReferences: async (model, position, context) => { + if (!_conn || !isWorkspaceFile(model.uri.toString())) return null; + const result: Location[] | null = await _conn.sendRequest('textDocument/references', { + textDocument: { uri: model.uri.toString() }, + position: { line: position.lineNumber - 1, character: position.column - 1 }, + context: { includeDeclaration: context.includeDeclaration }, + }); + if (!result) return null; + return result.map(loc => ({ uri: monaco.Uri.parse(loc.uri), range: lspRangeToMonaco(loc.range) })); + }, + }); + + monaco.languages.registerRenameProvider('java', { + provideRenameEdits: async (model, position, newName) => { + if (!_conn || !isWorkspaceFile(model.uri.toString())) return { edits: [] }; + const edit: WorkspaceEdit | null = await _conn.sendRequest('textDocument/rename', { + textDocument: { uri: model.uri.toString() }, + position: { line: position.lineNumber - 1, character: position.column - 1 }, + newName, + }); + return workspaceEditToMonaco(edit); + }, + resolveRenameLocation: async (model, position) => { + if (!_conn || !isWorkspaceFile(model.uri.toString())) return null; + try { + const result: { range: LspRange; placeholder?: string } | LspRange | null = + await _conn.sendRequest('textDocument/prepareRename', { + textDocument: { uri: model.uri.toString() }, + position: { line: position.lineNumber - 1, character: position.column - 1 }, + }); + if (!result) return null; + const range = 'range' in result ? result.range : result; + const placeholder = 'placeholder' in result && result.placeholder + ? result.placeholder + : model.getWordAtPosition(position)?.word ?? ''; + return { range: lspRangeToMonaco(range), text: placeholder }; + } catch { + const word = model.getWordAtPosition(position); + return word ? { + range: { startLineNumber: position.lineNumber, startColumn: word.startColumn, endLineNumber: position.lineNumber, endColumn: word.endColumn }, + text: word.word, + } : null; + } + }, + }); + + // Registering this provider also enables editor.js's existing format-on-save path for Java: the + // shared Save action runs editor.action.formatDocument when auto-formatting is on (the same + // mechanism and global toggle used for TypeScript). + monaco.languages.registerDocumentFormattingEditProvider('java', { + provideDocumentFormattingEdits: async (model) => { + if (!_conn || !isWorkspaceFile(model.uri.toString())) return null; + const edits: TextEdit[] | null = await _conn.sendRequest('textDocument/formatting', { + textDocument: { uri: model.uri.toString() }, + options: { tabSize: model.getOptions().tabSize, insertSpaces: model.getOptions().insertSpaces }, + }); + return edits ? edits.map(textEditToMonaco) : null; + }, + }); + + monaco.languages.registerCodeActionProvider('java', { + provideCodeActions: async (model, range, context) => { + const empty = { actions: [], dispose() { /* nothing to dispose */ } }; + if (!_conn || !isWorkspaceFile(model.uri.toString())) return empty; + const diagnostics = (context.markers ?? []).map(markerToLspDiagnostic); + const result: Array | null = await _conn.sendRequest('textDocument/codeAction', { + textDocument: { uri: model.uri.toString() }, + range: monacoRangeToLsp(range), + context: { diagnostics, only: context.only ? [context.only] : undefined }, + }); + if (!result?.length) return empty; + return { + actions: result.map(lspCodeActionToMonaco), + dispose() { /* nothing to dispose */ }, + }; + }, + }, { + providedCodeActionKinds: ['quickfix', 'refactor', 'refactor.extract', 'refactor.inline', + 'refactor.rewrite', 'source', 'source.organizeImports'], + }); } // ------------------------------------------------------------------------- @@ -343,25 +504,250 @@ function lspCompletionToMonaco( item: CompletionItem, model: monaco.editor.ITextModel, position: monaco.Position, -): monaco.languages.CompletionItem { +): MonacoCompletionItem { const word = model.getWordUntilPosition(position); - const range: monaco.IRange = { + let range: monaco.IRange = { startLineNumber: position.lineNumber, startColumn: word.startColumn, endLineNumber: position.lineNumber, endColumn: word.endColumn, }; - return { + let insertText = item.insertText ?? item.label; + const textEdit = item.textEdit as { range?: LspRange; replace?: LspRange; insert?: LspRange; newText?: string } | undefined; + if (textEdit) { + const r = textEdit.range ?? textEdit.replace ?? textEdit.insert; + if (r) range = lspRangeToMonaco(r); + if (typeof textEdit.newText === 'string') insertText = textEdit.newText; + } + const result: MonacoCompletionItem = { label: item.label, kind: lspCompletionKind(item.kind), detail: item.detail, documentation: item.documentation ? { value: markupToString(item.documentation), isTrusted: false } : undefined, - insertText: item.insertText ?? item.label, + insertText, insertTextRules: item.insertTextFormat === InsertTextFormat.Snippet ? monaco.languages.CompletionItemInsertTextRule.InsertAsSnippet : undefined, range, + sortText: sdkPrioritisedSortText(item), + additionalTextEdits: item.additionalTextEdits?.map(textEditToMonaco), }; + result._lsp = item; + return result; +} + +/** + * Ranks Dirigible SDK suggestions ({@code org.eclipse.dirigible.sdk.*}) above everything else by + * prefixing the server sortText with a priority bucket, preserving the server order within each bucket. + */ +function sdkPrioritisedSortText(item: CompletionItem): string { + const base = item.sortText ?? (typeof item.label === 'string' ? item.label : ''); + const description = (item.labelDetails && typeof item.labelDetails.description === 'string') + ? item.labelDetails.description : ''; + const haystack = `${item.detail ?? ''} ${description}`; + return haystack.includes('org.eclipse.dirigible.sdk') ? `0_${base}` : `1_${base}`; +} + +// ------------------------------------------------------------------------- +// Code actions, commands, refactor/generate, workspace edits +// ------------------------------------------------------------------------- + +/** Monaco command id used to apply a deferred LSP code action when the user selects it. */ +const APPLY_ACTION_COMMAND = 'dirigible.java.applyCodeAction'; + +type LspRange = { start: { line: number; character: number }; end: { line: number; character: number } }; + +/** Monaco completion item carrying the originating LSP item so resolve can fetch its import edits. */ +type MonacoCompletionItem = monaco.languages.CompletionItem & { _lsp?: CompletionItem }; + +function textEditToMonaco(edit: TextEdit): monaco.languages.TextEdit { + return { range: lspRangeToMonaco(edit.range), text: edit.newText }; +} + +function monacoRangeToLsp(r: monaco.IRange): LspRange { + return { + start: { line: r.startLineNumber - 1, character: r.startColumn - 1 }, + end: { line: r.endLineNumber - 1, character: r.endColumn - 1 }, + }; +} + +function monacoSeverityToLsp(severity: monaco.MarkerSeverity): DiagnosticSeverity { + switch (severity) { + case monaco.MarkerSeverity.Error: return DiagnosticSeverity.Error; + case monaco.MarkerSeverity.Warning: return DiagnosticSeverity.Warning; + case monaco.MarkerSeverity.Info: return DiagnosticSeverity.Information; + default: return DiagnosticSeverity.Hint; + } +} + +function markerToLspDiagnostic(m: monaco.editor.IMarkerData): Diagnostic { + return { + range: { start: { line: m.startLineNumber - 1, character: m.startColumn - 1 }, + end: { line: m.endLineNumber - 1, character: m.endColumn - 1 } }, + message: m.message, + severity: monacoSeverityToLsp(m.severity), + source: m.source, + } as Diagnostic; +} + +function lspCodeActionToMonaco(action: CodeAction | Command): monaco.languages.CodeAction { + const isCommand = typeof (action as Command).command === 'string'; + const title = action.title + ?? (isCommand ? (action as Command).command : (action as CodeAction).command?.title) + ?? 'Action'; + const kind = isCommand ? 'quickfix' : ((action as CodeAction).kind ?? 'quickfix'); + return { + title, + kind, + diagnostics: [], + isPreferred: (action as CodeAction).isPreferred, + // Apply lazily through our command so we can resolve, run server commands and apply edits uniformly. + command: { id: APPLY_ACTION_COMMAND, title, arguments: [action] }, + }; +} + +async function applyCodeAction(action: CodeAction | Command): Promise { + if (!_conn) return; + try { + if (typeof (action as Command).command === 'string') { + await runServerCommand(action as Command); + return; + } + let resolved = action as CodeAction; + if (!resolved.edit && (resolved as { data?: unknown }).data !== undefined) { + resolved = await _conn.sendRequest('codeAction/resolve', resolved); + } + if (resolved.edit) applyWorkspaceEdit(resolved.edit); + if (resolved.command) await runServerCommand(resolved.command); + } catch (e) { + console.warn('[java-lsp] code action failed:', (e as Error)?.message ?? e); + } +} + +function isWorkspaceEdit(value: unknown): value is WorkspaceEdit { + return !!value && (!!(value as WorkspaceEdit).changes || !!(value as WorkspaceEdit).documentChanges); +} + +async function runServerCommand(cmd: Command): Promise { + if (!_conn || !cmd?.command) return; + if (GENERATE[cmd.command]) { + await runGenerate(cmd.command, cmd.arguments ?? []); + return; + } + const result = await _conn.sendRequest('workspace/executeCommand', { command: cmd.command, arguments: cmd.arguments ?? [] }); + if (isWorkspaceEdit(result)) applyWorkspaceEdit(result); +} + +interface GenerateSpec { + label: string; + status: string; + generate: string; + members: (status: any) => Array<{ label: string; ref: any }>; + buildArgs: (promptArgs: any[], status: any, selected: any[]) => any[]; +} + +/** Member-named fields → picker labels. */ +function fieldLabel(f: any): string { + const name = f?.name ?? f?.fieldName ?? ''; + const type = f?.type ?? f?.typeName; + return type ? `${name}: ${type}` : `${name}`; +} + +/** + * The JDT.LS source-generation commands (constructors, getters/setters, toString, hashCode/equals). + * Each maps the client "*Prompt" command to the server status + generate delegate commands; the status + * call yields the candidate fields shown in the member picker, the generate call returns the edit. + */ +const GENERATE: Record = { + 'java.action.generateConstructorsPrompt': { + label: 'Select fields and constructors', + status: 'java.action.checkConstructorsStatus', + generate: 'java.action.generateConstructors', + members: (s) => (s?.fields ?? []).map((f: any) => ({ label: fieldLabel(f), ref: f })), + buildArgs: (args, s, sel) => [args[0], { constructors: s?.constructors ?? [], fields: sel.map(m => m.ref) }], + }, + 'java.action.generateToStringPrompt': { + label: 'Select fields to include in toString()', + status: 'java.action.checkToStringStatus', + generate: 'java.action.generateToString', + members: (s) => (s?.fields ?? []).map((f: any) => ({ label: fieldLabel(f), ref: f })), + buildArgs: (args, _s, sel) => [args[0], sel.map(m => m.ref)], + }, + 'java.action.hashCodeEqualsPrompt': { + label: 'Select fields for hashCode() and equals()', + status: 'java.action.checkHashCodeEqualsStatus', + generate: 'java.action.generateHashCodeEquals', + members: (s) => (s?.fields ?? []).map((f: any) => ({ label: fieldLabel(f), ref: f })), + buildArgs: (args, _s, sel) => [args[0], sel.map(m => m.ref), false], + }, + 'java.action.generateAccessorsPrompt': { + label: 'Select fields to generate getters and setters', + status: 'java.action.checkAccessorsStatus', + generate: 'java.action.generateAccessors', + members: (s) => (s?.accessors ?? s ?? []).map((a: any) => ({ label: fieldLabel(a), ref: a })), + buildArgs: (args, _s, sel) => [args[0], sel.map(m => m.ref)], + }, +}; + +async function runGenerate(promptId: string, args: any[]): Promise { + if (!_conn) return; + const spec = GENERATE[promptId]; + const status = await _conn.sendRequest('workspace/executeCommand', { command: spec.status, arguments: args }); + if (!status) return; + const members = spec.members(status); + let selected = members; + const picker = (globalThis as any).javaLspMemberPicker; + if (members.length && typeof picker === 'function') { + const chosen: string[] | null = await picker(spec.label, members.map(m => m.label)); + if (chosen === null) return; // user cancelled the dialog + selected = members.filter(m => chosen.includes(m.label)); + } + const edit = await _conn.sendRequest('workspace/executeCommand', { + command: spec.generate, + arguments: spec.buildArgs(args, status, selected), + }); + if (isWorkspaceEdit(edit)) applyWorkspaceEdit(edit); +} + +/** Groups a workspace edit's text edits by document and applies them in place to open Monaco models. */ +function applyWorkspaceEdit(edit: WorkspaceEdit | null | undefined): void { + if (!edit) return; + const byUri: Record = {}; + if (edit.changes) { + for (const uri in edit.changes) byUri[uri] = (byUri[uri] ?? []).concat(edit.changes[uri]); + } + if (edit.documentChanges) { + for (const dc of edit.documentChanges as any[]) { + if (dc?.textDocument?.uri && Array.isArray(dc.edits)) { + byUri[dc.textDocument.uri] = (byUri[dc.textDocument.uri] ?? []).concat(dc.edits); + } + } + } + for (const uri in byUri) { + const model = monaco.editor.getModels().find(m => m.uri.toString() === uri); + if (!model) continue; + const ops = byUri[uri].map(e => ({ range: lspRangeToMonaco(e.range), text: e.newText, forceMoveMarkers: true })); + model.pushEditOperations([], ops, () => null); + } +} + +/** Converts an LSP workspace edit into the Monaco shape returned by the rename provider. */ +function workspaceEditToMonaco(edit: WorkspaceEdit | null): monaco.languages.WorkspaceEdit { + const edits: any[] = []; + const push = (uri: string, list: TextEdit[]) => { + for (const e of list) { + edits.push({ resource: monaco.Uri.parse(uri), textEdit: { range: lspRangeToMonaco(e.range), text: e.newText }, versionId: undefined }); + } + }; + if (edit?.changes) { + for (const uri in edit.changes) push(uri, edit.changes[uri]); + } + if (edit?.documentChanges) { + for (const dc of edit.documentChanges as any[]) { + if (dc?.textDocument?.uri && Array.isArray(dc.edits)) push(dc.textDocument.uri, dc.edits); + } + } + return { edits }; } function jdtlsSettings() { diff --git a/components/ui/view-projects/src/main/resources/META-INF/dirigible/view-projects/js/java-new.js b/components/ui/view-projects/src/main/resources/META-INF/dirigible/view-projects/js/java-new.js new file mode 100644 index 00000000000..1eab9757ba3 --- /dev/null +++ b/components/ui/view-projects/src/main/resources/META-INF/dirigible/view-projects/js/java-new.js @@ -0,0 +1,237 @@ +/* + * Copyright (c) 2010-2026 Eclipse Dirigible contributors + * + * All rights reserved. This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v2.0 which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v20.html + * + * SPDX-FileCopyrightText: Eclipse Dirigible contributors SPDX-License-Identifier: EPL-2.0 + */ +/** + * Helpers for the Projects view "New -> Java" submenu: name parsing/validation and strong-interface + * skeleton generation. Pure functions, no AngularJS or DOM dependency, so they are trivially unit + * testable and keep all Java-specific knowledge out of projects.js. Exposed as the global JavaNew. + */ +const JavaNew = (function () { + + const IDENTIFIER = /^[A-Za-z_$][A-Za-z0-9_$]*$/; + + // Java reserved words (and literals) that cannot be used as identifiers. + const RESERVED = new Set([ + 'abstract', 'assert', 'boolean', 'break', 'byte', 'case', 'catch', 'char', 'class', 'const', + 'continue', 'default', 'do', 'double', 'else', 'enum', 'extends', 'final', 'finally', 'float', + 'for', 'goto', 'if', 'implements', 'import', 'instanceof', 'int', 'interface', 'long', 'native', + 'new', 'package', 'private', 'protected', 'public', 'return', 'short', 'static', 'strictfp', + 'super', 'switch', 'synchronized', 'this', 'throw', 'throws', 'transient', 'try', 'void', + 'volatile', 'while', 'true', 'false', 'null', '_', + ]); + + /** Menu descriptors, in display order. Ids are namespaced so projects.js can route them. */ + const menuItems = [ + { id: 'java:package', kind: 'package', label: 'Package', leftIconClass: 'sap-icon--folder-blank' }, + { id: 'java:class', kind: 'class', label: 'Class', leftIconClass: 'sap-icon--syntax', separator: true }, + { id: 'java:interface', kind: 'interface', label: 'Interface', leftIconClass: 'sap-icon--syntax' }, + { id: 'java:enum', kind: 'enum', label: 'Enum', leftIconClass: 'sap-icon--syntax' }, + { id: 'java:annotation', kind: 'annotation', label: 'Annotation', leftIconClass: 'sap-icon--syntax' }, + { id: 'java:record', kind: 'record', label: 'Record', leftIconClass: 'sap-icon--syntax' }, + { id: 'java:exception', kind: 'exception', label: 'Exception', leftIconClass: 'sap-icon--syntax' }, + { id: 'java:controller', kind: 'controller', label: 'Controller', leftIconClass: 'sap-icon--source-code', separator: true }, + { id: 'java:job', kind: 'job', label: 'Job', leftIconClass: 'sap-icon--source-code' }, + { id: 'java:listener', kind: 'listener', label: 'Listener', leftIconClass: 'sap-icon--source-code' }, + { id: 'java:websocket', kind: 'websocket', label: 'WebSocket', leftIconClass: 'sap-icon--source-code' }, + { id: 'java:repository', kind: 'repository', label: 'Repository', leftIconClass: 'sap-icon--source-code' }, + ]; + + function isValidIdentifier(segment) { + return IDENTIFIER.test(segment) && !RESERVED.has(segment); + } + + /** The context-menu submenu group object consumed by projects.js. */ + function submenu() { + return { + id: 'java', + label: 'Java', + iconClass: 'sap-icon--syntax', + items: menuItems.map((i) => ({ ...i })), + }; + } + + function isJavaMenuId(id) { + return typeof id === 'string' && id.startsWith('java:'); + } + + function itemById(id) { + return menuItems.find((i) => i.id === id); + } + + function placeholderFor(kind) { + if (kind === 'package') return 'com.example.app'; + if (kind === 'controller') return 'com.example.MyController'; + if (kind === 'repository') return 'com.example.CountryRepository'; + return 'com.example.MyType'; + } + + /** + * Parses a package name like {@code com.example.app}. + * @returns {{ok: boolean, error?: string, segments?: string[]}} + */ + function parsePackage(input) { + const value = (input || '').trim(); + if (!value) return { ok: false, error: 'Provide a package name, e.g. com.example.app' }; + const segments = value.split('.'); + for (const segment of segments) { + if (!isValidIdentifier(segment)) { + return { ok: false, error: `'${segment}' is not a valid Java package segment` }; + } + } + return { ok: true, segments }; + } + + /** + * Parses a (possibly qualified) type name like {@code com.example.MyClass} or {@code MyClass}. + * @returns {{ok: boolean, error?: string, packageSegments?: string[], typeName?: string}} + */ + function parseType(input) { + const value = (input || '').trim(); + if (!value) return { ok: false, error: 'Provide a type name, e.g. MyClass or com.example.MyClass' }; + const segments = value.split('.'); + const typeName = segments.pop(); + if (!isValidIdentifier(typeName)) { + return { ok: false, error: `'${typeName}' is not a valid Java type name` }; + } + for (const segment of segments) { + if (!isValidIdentifier(segment)) { + return { ok: false, error: `'${segment}' is not a valid Java package segment` }; + } + } + return { ok: true, packageSegments: segments, typeName }; + } + + function header(packageName) { + return packageName ? `package ${packageName};\n\n` : ''; + } + + function body(kind, name) { + switch (kind) { + case 'class': + return `public class ${name} {\n\n}\n`; + case 'interface': + return `public interface ${name} {\n\n}\n`; + case 'enum': + return `public enum ${name} {\n\n}\n`; + case 'annotation': + return `public @interface ${name} {\n\n}\n`; + case 'record': + return `public record ${name}() {\n}\n`; + case 'exception': + return `public class ${name} extends Exception {\n\n` + + ` public ${name}(String message) {\n` + + ` super(message);\n` + + ` }\n\n` + + ` public ${name}(String message, Throwable cause) {\n` + + ` super(message, cause);\n` + + ` }\n}\n`; + case 'controller': + return `import org.eclipse.dirigible.sdk.http.Controller;\n` + + `import org.eclipse.dirigible.sdk.http.Get;\n\n` + + `@Controller\n` + + `public class ${name} {\n\n` + + ` @Get("/hello")\n` + + ` public String hello() {\n` + + ` return "Hello from ${name}";\n` + + ` }\n}\n`; + case 'job': + return `import org.eclipse.dirigible.sdk.component.Component;\n` + + `import org.eclipse.dirigible.sdk.job.JobHandler;\n\n` + + `@Component\n` + + `public class ${name} implements JobHandler {\n\n` + + ` @Override\n` + + ` public String cron() {\n` + + ` return "0/30 * * * * ?";\n` + + ` }\n\n` + + ` @Override\n` + + ` public void run() {\n` + + ` // TODO implement the scheduled work\n` + + ` }\n}\n`; + case 'listener': + return `import org.eclipse.dirigible.sdk.component.Component;\n` + + `import org.eclipse.dirigible.sdk.messaging.ListenerKind;\n` + + `import org.eclipse.dirigible.sdk.messaging.MessageHandler;\n\n` + + `@Component\n` + + `public class ${name} implements MessageHandler {\n\n` + + ` @Override\n` + + ` public String destination() {\n` + + ` return "${queueName(name)}";\n` + + ` }\n\n` + + ` @Override\n` + + ` public ListenerKind kind() {\n` + + ` return ListenerKind.QUEUE;\n` + + ` }\n\n` + + ` @Override\n` + + ` public void onMessage(String message) {\n` + + ` // TODO handle the message\n` + + ` }\n}\n`; + case 'websocket': + return `import org.eclipse.dirigible.sdk.component.Component;\n` + + `import org.eclipse.dirigible.sdk.net.WebsocketHandler;\n\n` + + `@Component\n` + + `public class ${name} implements WebsocketHandler {\n\n` + + ` @Override\n` + + ` public String endpoint() {\n` + + ` return "${endpointName(name)}";\n` + + ` }\n\n` + + ` @Override\n` + + ` public void onMessage(String message, String from) {\n` + + ` // TODO handle the inbound frame\n` + + ` }\n}\n`; + case 'repository': { + const entity = entityName(name); + return `import org.eclipse.dirigible.components.data.store.java.repository.JavaRepository;\n` + + `import org.eclipse.dirigible.sdk.component.Repository;\n\n` + + `@Repository\n` + + `public class ${name} extends JavaRepository<${entity}> {\n\n` + + ` public ${name}() {\n` + + ` super(${entity}.class);\n` + + ` }\n}\n`; + } + default: + return `public class ${name} {\n\n}\n`; + } + } + + /** Derives a sensible destination name from a listener class name. */ + function queueName(name) { + return name.replace(/Listener$/, '').toLowerCase() || 'queue'; + } + + /** Derives a sensible endpoint suffix from a websocket handler class name. */ + function endpointName(name) { + return name.replace(/(Socket|Handler|Websocket)$/i, '').toLowerCase() || 'endpoint'; + } + + /** Derives the entity type a repository wraps, stripping a trailing {@code Repository}. */ + function entityName(name) { + const stripped = name.replace(/Repository$/, ''); + return stripped || 'Entity'; + } + + /** + * Generates the skeleton source for the given kind. + * @returns {string} + */ + function generate(kind, packageName, typeName) { + return header(packageName) + body(kind, typeName); + } + + return { + menuItems, + submenu, + isJavaMenuId, + itemById, + placeholderFor, + parsePackage, + parseType, + generate, + isValidIdentifier, + }; +})(); diff --git a/components/ui/view-projects/src/main/resources/META-INF/dirigible/view-projects/js/projects.js b/components/ui/view-projects/src/main/resources/META-INF/dirigible/view-projects/js/projects.js index 670132f245b..b7ef48d911f 100644 --- a/components/ui/view-projects/src/main/resources/META-INF/dirigible/view-projects/js/projects.js +++ b/components/ui/view-projects/src/main/resources/META-INF/dirigible/view-projects/js/projects.js @@ -447,7 +447,7 @@ projectsView.controller('ProjectsViewController', ( label: 'Folder', leftIconClass: 'sap-icon--add-folder', separator: true, - }], + }, JavaNew.submenu()], separator: true, }; const cutObj = { @@ -670,6 +670,8 @@ projectsView.controller('ProjectsViewController', ( newNodeData.parent = contextMenuNodes[0].id; newNodeData.path = contextMenuNodes[0].data.path; openNewFolderDialog(); + } else if (JavaNew.isJavaMenuId(id)) { + newJavaArtifact(id, contextMenuNodes[0]); } else if (id === 'cut') { jstreeWidget.jstree(true).cut(jstreeWidget.jstree(true).get_top_selected(true)); } else if (id === 'copy') { @@ -1774,6 +1776,130 @@ projectsView.controller('ProjectsViewController', ( }); } + function newJavaArtifact(menuId, node) { + const meta = JavaNew.itemById(menuId); + if (!meta) return; + const projectNode = node.type === 'project' ? node : getProjectNode(node.parents); + if (!projectNode) { + console.error('Could not resolve the project for the selected node'); + return; + } + const projectPath = projectNode.data.path; // /workspace/project + const folderPath = node.data.path; // /workspace/project[/sub...] + const folderRel = folderPath.substring(projectPath.length).replace(/^\/+/, '').replace(/\/+$/, ''); + Dialogs.showFormDialog({ + title: `New Java ${meta.label}`, + form: { + 'fdti1': { + label: meta.kind === 'package' ? 'Package name' : 'Name', + controlType: 'input', + type: 'text', + placeholder: JavaNew.placeholderFor(meta.kind), + submitOnEnter: true, + focus: true, + required: true, + }, + }, + submitLabel: 'Create', + cancelLabel: 'Cancel' + }).then((form) => { + if (!form) return; + if (meta.kind === 'package') { + const parsed = JavaNew.parsePackage(form['fdti1']); + if (!parsed.ok) { showJavaNameError(parsed.error); return; } + createJavaPackage(projectNode, folderPath, parsed.segments); + } else { + const parsed = JavaNew.parseType(form['fdti1']); + if (!parsed.ok) { showJavaNameError(parsed.error); return; } + createJavaType(projectNode, folderPath, folderRel, meta.kind, parsed); + } + }, (error) => { + console.error(error); + }); + } + + function showJavaNameError(message) { + Dialogs.showAlert({ + title: 'Invalid name', + message: message, + type: AlertTypes.Error, + preformatted: false, + }); + } + + /** + * Creates the deepest folder of {@code segments} under {@code baseFolderPath}; the server's + * forceMkdir creates any missing parents. The leaf is passed as the (single-segment) name and the + * parents are folded into the target path, because WorkspaceService URL-encodes the name argument. + */ + function createNestedFolder(segments, baseFolderPath) { + const leaf = segments[segments.length - 1]; + const parents = segments.slice(0, -1); + const targetPath = parents.length ? `${baseFolderPath}/${parents.join('/')}` : baseFolderPath; + return WorkspaceService.createFolder(leaf, targetPath); + } + + function createJavaPackage(projectNode, folderPath, segments) { + createNestedFolder(segments, folderPath).then(() => { + jstreeWidget.jstree(true).refresh_node(projectNode); + StatusBar.showMessage(`Created package '${segments.join('.')}'`); + }, (response) => { + console.error(response); + Dialogs.showAlert({ + title: 'Could not create the package', + message: `There was an error while creating package '${segments.join('.')}'. It may already exist.`, + type: AlertTypes.Error, + preformatted: false, + }); + }); + } + + function createJavaType(projectNode, folderPath, folderRel, kind, parsed) { + const relSegments = folderRel ? folderRel.split('/') : []; + const packageName = relSegments.concat(parsed.packageSegments).join('.'); + const targetFolderPath = parsed.packageSegments.length + ? `${folderPath}/${parsed.packageSegments.join('/')}` + : folderPath; + const fileName = `${parsed.typeName}.java`; + const content = JavaNew.generate(kind, packageName, parsed.typeName); + // Tolerate an already-existing package folder; the file-creation step validates the real path. + const proceed = () => createJavaFile(projectNode, targetFolderPath, fileName, content); + if (parsed.packageSegments.length) { + createNestedFolder(parsed.packageSegments, folderPath).then(proceed, proceed); + } else { + proceed(); + } + } + + function createJavaFile(projectNode, targetFolderPath, fileName, content) { + const alertBody = { + title: 'Could not create the Java file', + message: `There was an error while creating '${fileName}'. It may already exist.`, + type: AlertTypes.Error, + preformatted: false, + }; + WorkspaceService.createFile(fileName, targetFolderPath, content).then((response) => { + WorkspaceService.getMetadataByUrl(response.data).then((metadata) => { + jstreeWidget.jstree(true).refresh_node(projectNode); + Layout.openEditor({ + path: metadata.data.path, + contentType: metadata.data.contentType, + params: { + resourceType: 'workspace', + gitName: projectNode.data.git ? projectNode.data.gitName : undefined, + }, + }); + StatusBar.showMessage(`Created '${fileName}'`); + }, (response) => { + console.error(response); + Dialogs.showAlert(alertBody); + }); + }, (response) => { + console.error(response); + Dialogs.showAlert(alertBody); + }); + } + function openRenameDialog(renameNode) { Dialogs.showFormDialog({ title: `Rename ${renameNode.type}`, diff --git a/components/ui/view-projects/src/main/resources/META-INF/dirigible/view-projects/projects.html b/components/ui/view-projects/src/main/resources/META-INF/dirigible/view-projects/projects.html index 80668280ccf..4c1d03897d8 100644 --- a/components/ui/view-projects/src/main/resources/META-INF/dirigible/view-projects/projects.html +++ b/components/ui/view-projects/src/main/resources/META-INF/dirigible/view-projects/projects.html @@ -26,6 +26,7 @@ + diff --git a/tests/tests-framework/src/main/java/org/eclipse/dirigible/tests/framework/browser/Browser.java b/tests/tests-framework/src/main/java/org/eclipse/dirigible/tests/framework/browser/Browser.java index 575ef3f2154..a5d648ba899 100644 --- a/tests/tests-framework/src/main/java/org/eclipse/dirigible/tests/framework/browser/Browser.java +++ b/tests/tests-framework/src/main/java/org/eclipse/dirigible/tests/framework/browser/Browser.java @@ -54,6 +54,8 @@ public interface Browser { void clickOnElementByAttributePatternAndText(HtmlElementType elementType, HtmlAttribute attribute, String pattern, String text); + void hoverOnElementByAttributePatternAndText(HtmlElementType elementType, HtmlAttribute attribute, String pattern, String text); + void assertElementExistByAttributePatternAndText(HtmlElementType elementType, HtmlAttribute attribute, String pattern, String text); void clickOnElementByAttributePatternAndText(String elementType, String attribute, String pattern, String text); diff --git a/tests/tests-framework/src/main/java/org/eclipse/dirigible/tests/framework/browser/impl/BrowserImpl.java b/tests/tests-framework/src/main/java/org/eclipse/dirigible/tests/framework/browser/impl/BrowserImpl.java index c90f72c3607..9894093c4aa 100644 --- a/tests/tests-framework/src/main/java/org/eclipse/dirigible/tests/framework/browser/impl/BrowserImpl.java +++ b/tests/tests-framework/src/main/java/org/eclipse/dirigible/tests/framework/browser/impl/BrowserImpl.java @@ -488,6 +488,15 @@ private void clickElement(SelenideElement element) { .click(); } + @Override + public void hoverOnElementByAttributePatternAndText(HtmlElementType elementType, HtmlAttribute attribute, String pattern, String text) { + By by = constructCssSelectorByTypeAndAttribute(elementType.getType(), attribute.getAttribute(), pattern); + SelenideElement element = findElementInAllFrames(by, Condition.visible, Condition.enabled, Condition.exactText(text)); + Selenide.actions() + .moveToElement(element) + .perform(); + } + @Override public void assertElementExistByAttributePatternAndText(HtmlElementType elementType, HtmlAttribute attribute, String pattern, String text) { diff --git a/tests/tests-framework/src/main/java/org/eclipse/dirigible/tests/framework/ide/Workbench.java b/tests/tests-framework/src/main/java/org/eclipse/dirigible/tests/framework/ide/Workbench.java index 7242636d3b0..795b50d06f3 100644 --- a/tests/tests-framework/src/main/java/org/eclipse/dirigible/tests/framework/ide/Workbench.java +++ b/tests/tests-framework/src/main/java/org/eclipse/dirigible/tests/framework/ide/Workbench.java @@ -77,6 +77,24 @@ public void createFileInProject(String projectName, String newFileType) { browser.clickOnElementWithText(HtmlElementType.BUTTON, "Create"); } + /** + * Creates a Java artefact through the project context menu (New -> Java -> {@code leafLabel}), + * entering {@code name} in the resulting dialog. Use for the base types (Class, Interface, ...) and + * the strong-interface skeletons (Controller, Job, Listener, WebSocket, Repository). For Package, + * {@code name} is the dotted package; for the others it is a simple or fully-qualified type name. + */ + public void createJavaArtifact(String projectName, String leafLabel, String name) { + expandProject(projectName); + browser.rightClickOnElementContainingText(HtmlElementType.ANCHOR, projectName); + + browser.hoverOnElementByAttributePatternAndText(HtmlElementType.SPAN, HtmlAttribute.CLASS, "fd-menu__title", "New"); + browser.hoverOnElementByAttributePatternAndText(HtmlElementType.SPAN, HtmlAttribute.CLASS, "fd-menu__title", "Java"); + browser.clickOnElementByAttributePatternAndText(HtmlElementType.SPAN, HtmlAttribute.CLASS, "fd-menu__title", leafLabel); + + browser.enterTextInElementById("fdti1", name); + browser.clickOnElementWithText(HtmlElementType.BUTTON, "Create"); + } + public void expandProject(String projectName) { browser.doubleClickOnElementContainingText(HtmlElementType.ANCHOR, projectName); } diff --git a/tests/tests-integrations/src/main/java/org/eclipse/dirigible/integration/tests/ui/tests/CreateJavaArtifactsIT.java b/tests/tests-integrations/src/main/java/org/eclipse/dirigible/integration/tests/ui/tests/CreateJavaArtifactsIT.java new file mode 100644 index 00000000000..bf6b9597eaa --- /dev/null +++ b/tests/tests-integrations/src/main/java/org/eclipse/dirigible/integration/tests/ui/tests/CreateJavaArtifactsIT.java @@ -0,0 +1,111 @@ +/* + * Copyright (c) 2010-2026 Eclipse Dirigible contributors + * + * All rights reserved. This program and the accompanying materials are made available under the + * terms of the Eclipse Public License v2.0 which accompanies this distribution, and is available at + * http://www.eclipse.org/legal/epl-v20.html + * + * SPDX-FileCopyrightText: Eclipse Dirigible contributors SPDX-License-Identifier: EPL-2.0 + */ +package org.eclipse.dirigible.integration.tests.ui.tests; + +import static io.restassured.RestAssured.given; +import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.not; + +import org.eclipse.dirigible.tests.base.UserInterfaceIntegrationTest; +import org.eclipse.dirigible.tests.framework.ide.Workbench; +import org.eclipse.dirigible.tests.framework.restassured.RestAssuredExecutor; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; + +/** + * Drives the Workbench "New -> Java" submenu and asserts that each artefact lands in the right + * place with the right content: a fully-qualified name creates the package folders and the matching + * {@code package} declaration, a simple name lands in the project root with no package, and each + * skeleton follows the strong-interface style. Content is read back over the workspace REST API + * rather than the Monaco DOM, which keeps the assertions deterministic. + */ +class CreateJavaArtifactsIT extends UserInterfaceIntegrationTest { + + private static final String PROJECT = "CreateJavaArtifactsIT"; + private static final String WORKSPACE_FILES = "/services/ide/workspaces/workspace/" + PROJECT; + private static final long TIMEOUT_SECONDS = 30; + + @Autowired + protected RestAssuredExecutor restAssuredExecutor; + + @Test + void createsJavaArtifactsFromTheNewMenu() { + Workbench workbench = ide.openWorkbench(); + workbench.createNewProject(PROJECT); + + // Fully-qualified name -> package folders are created and the package declaration matches. + workbench.createJavaArtifact(PROJECT, "Class", "com.test.MyClass"); + assertFileContains("/com/test/MyClass.java", "package com.test;", "public class MyClass"); + + // Simple name -> created in the project root, no package declaration. + workbench.createJavaArtifact(PROJECT, "Interface", "MyService"); + assertFileContains("/MyService.java", "public interface MyService"); + assertFileDoesNotContain("/MyService.java", "package "); + + workbench.createJavaArtifact(PROJECT, "Enum", "Color"); + assertFileContains("/Color.java", "public enum Color"); + + workbench.createJavaArtifact(PROJECT, "Annotation", "MyMarker"); + assertFileContains("/MyMarker.java", "public @interface MyMarker"); + + workbench.createJavaArtifact(PROJECT, "Record", "Point"); + assertFileContains("/Point.java", "public record Point("); + + workbench.createJavaArtifact(PROJECT, "Exception", "DomainException"); + assertFileContains("/DomainException.java", "extends Exception"); + + // Strong-interface skeletons. + workbench.createJavaArtifact(PROJECT, "Controller", "GreetController"); + assertFileContains("/GreetController.java", "@Controller", "org.eclipse.dirigible.sdk.http.Get"); + + workbench.createJavaArtifact(PROJECT, "Job", "CleanupJob"); + assertFileContains("/CleanupJob.java", "implements JobHandler", "public String cron()"); + + workbench.createJavaArtifact(PROJECT, "Listener", "OrderListener"); + assertFileContains("/OrderListener.java", "implements MessageHandler", "ListenerKind"); + + workbench.createJavaArtifact(PROJECT, "Repository", "CountryRepository"); + assertFileContains("/CountryRepository.java", "@Repository", "extends JavaRepository"); + + // Package -> the full nested folder chain is created from a dotted name. + workbench.createJavaArtifact(PROJECT, "Package", "com.test.iliyan"); + assertFolderExists("/com/test/iliyan"); + } + + private void assertFileContains(String path, String... fragments) { + restAssuredExecutor.execute(() -> { + var response = given().when() + .get(WORKSPACE_FILES + path) + .then() + .statusCode(200); + for (String fragment : fragments) { + response.body(containsString(fragment)); + } + }, TIMEOUT_SECONDS); + } + + private void assertFileDoesNotContain(String path, String fragment) { + restAssuredExecutor.execute(() -> given().when() + .get(WORKSPACE_FILES + path) + .then() + .statusCode(200) + .body(not(containsString(fragment))), + TIMEOUT_SECONDS); + } + + private void assertFolderExists(String path) { + restAssuredExecutor.execute(() -> given().when() + .get(WORKSPACE_FILES + path) + .then() + .statusCode(200), + TIMEOUT_SECONDS); + } + +} From 880a01bc116dc77182ef5b6227d42f746aea2903 Mon Sep 17 00:00:00 2001 From: Iliyan Velichkov Date: Tue, 23 Jun 2026 13:16:35 +0300 Subject: [PATCH 02/14] fix(engine-java-lsp): raise JDT.LS heap (configurable) + make CreateJavaArtifactsIT pass MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit JDT.LS was launched with -Xmx512m, which OOMs ("Java heap space") while indexing the full platform classpath (~1000+ entries), killing the language server and with it completion / auto-import / code actions. Make the max heap configurable via DIRIGIBLE_JAVA_LSP_MAX_HEAP (DirigibleConfig.JAVA_LSP_MAX_HEAP) and default it to 2g. Test framework: CreateJavaArtifactsIT now drives the nested New → Java → context menu reliably. Replaced the strict hover/visibility approach (which cannot reach a collapsed 3rd-level submenu in headless Chrome, where moveToElement does not fire mouseenter) with Browser.clickCascadingMenuItem, which scopes to the open context menu and drives its own Angular mouseenter/click handlers in a single in-frame script. Verified: the IT passes end to end (package folders, package declarations and strong-interface skeleton signals all asserted over the workspace REST API). Co-Authored-By: Claude Opus 4.8 (1M context) --- .../ide/lsp/java/process/JdtLsManager.java | 2 +- .../commons/config/DirigibleConfig.java | 3 ++ .../tests/framework/browser/Browser.java | 8 ++++- .../framework/browser/impl/BrowserImpl.java | 30 ++++++++++++++----- .../tests/framework/ide/Workbench.java | 4 +-- 5 files changed, 35 insertions(+), 12 deletions(-) diff --git a/components/ide/ide-java-lsp/src/main/java/org/eclipse/dirigible/components/ide/lsp/java/process/JdtLsManager.java b/components/ide/ide-java-lsp/src/main/java/org/eclipse/dirigible/components/ide/lsp/java/process/JdtLsManager.java index 43a1a20964f..ed8e3f99920 100644 --- a/components/ide/ide-java-lsp/src/main/java/org/eclipse/dirigible/components/ide/lsp/java/process/JdtLsManager.java +++ b/components/ide/ide-java-lsp/src/main/java/org/eclipse/dirigible/components/ide/lsp/java/process/JdtLsManager.java @@ -331,7 +331,7 @@ private List buildCommand(String launcherJar, String configDir, String d cmd.add("-Dlog.protocol=true"); cmd.add("-Dlog.level=ALL"); cmd.add("-noverify"); - cmd.add("-Xmx512m"); + cmd.add("-Xmx" + DirigibleConfig.JAVA_LSP_MAX_HEAP.getStringValue()); cmd.add("-jar"); cmd.add(launcherJar); cmd.add("-configuration"); diff --git a/modules/commons/commons-config/src/main/java/org/eclipse/dirigible/commons/config/DirigibleConfig.java b/modules/commons/commons-config/src/main/java/org/eclipse/dirigible/commons/config/DirigibleConfig.java index 63b65436e01..b6efdc3a711 100644 --- a/modules/commons/commons-config/src/main/java/org/eclipse/dirigible/commons/config/DirigibleConfig.java +++ b/modules/commons/commons-config/src/main/java/org/eclipse/dirigible/commons/config/DirigibleConfig.java @@ -126,6 +126,9 @@ public enum DirigibleConfig { /** Directory where the JDT Language Server is installed (or will be extracted to). */ JAVA_LSP_INSTALL_DIR("DIRIGIBLE_JAVA_LSP_INSTALL_DIR", null), + /** Max heap (-Xmx) for the JDT.LS process; 512m OOMs when indexing the full platform classpath. */ + JAVA_LSP_MAX_HEAP("DIRIGIBLE_JAVA_LSP_MAX_HEAP", "2g"), + /** Default JDWP port the Java debug adapter attaches to. */ JAVA_DEBUG_JDWP_PORT("DIRIGIBLE_JAVA_DEBUG_JDWP_PORT", "8000"), diff --git a/tests/tests-framework/src/main/java/org/eclipse/dirigible/tests/framework/browser/Browser.java b/tests/tests-framework/src/main/java/org/eclipse/dirigible/tests/framework/browser/Browser.java index a5d648ba899..d070dff4660 100644 --- a/tests/tests-framework/src/main/java/org/eclipse/dirigible/tests/framework/browser/Browser.java +++ b/tests/tests-framework/src/main/java/org/eclipse/dirigible/tests/framework/browser/Browser.java @@ -54,7 +54,13 @@ public interface Browser { void clickOnElementByAttributePatternAndText(HtmlElementType elementType, HtmlAttribute attribute, String pattern, String text); - void hoverOnElementByAttributePatternAndText(HtmlElementType elementType, HtmlAttribute attribute, String pattern, String text); + /** + * Navigates the open context menu along the given title path, expanding each intermediate submenu + * and clicking the final entry. Drives the menu's own Angular hover/click handlers inside the menu + * frame, so it works for deeply nested entries (e.g. {@code "New", "Java", "Class"}) that a strict + * hover/visibility approach cannot reach in headless mode. + */ + void clickCascadingMenuItem(String... titlePath); void assertElementExistByAttributePatternAndText(HtmlElementType elementType, HtmlAttribute attribute, String pattern, String text); diff --git a/tests/tests-framework/src/main/java/org/eclipse/dirigible/tests/framework/browser/impl/BrowserImpl.java b/tests/tests-framework/src/main/java/org/eclipse/dirigible/tests/framework/browser/impl/BrowserImpl.java index 9894093c4aa..4bcec00f823 100644 --- a/tests/tests-framework/src/main/java/org/eclipse/dirigible/tests/framework/browser/impl/BrowserImpl.java +++ b/tests/tests-framework/src/main/java/org/eclipse/dirigible/tests/framework/browser/impl/BrowserImpl.java @@ -488,13 +488,29 @@ private void clickElement(SelenideElement element) { .click(); } - @Override - public void hoverOnElementByAttributePatternAndText(HtmlElementType elementType, HtmlAttribute attribute, String pattern, String text) { - By by = constructCssSelectorByTypeAndAttribute(elementType.getType(), attribute.getAttribute(), pattern); - SelenideElement element = findElementInAllFrames(by, Condition.visible, Condition.enabled, Condition.exactText(text)); - Selenide.actions() - .moveToElement(element) - .perform(); + // Expands each parent submenu and clicks the leaf, scoped to the open context menu and driving the + // menu's own Angular mouseenter/click handlers. Run as one in-frame script because BlimpKit renders + // collapsed submenu titles with no visible text and a per-step frame switch would close the menu. + private static final String CASCADE_MENU_SCRIPT = + "var titles = arguments;" + "var roots = document.querySelectorAll('[aria-label*=\"contextmenu\"]');" + + "if (!roots.length) return 'no-menu';" + "var root = roots[roots.length - 1];" + "function find(text) {" + + " var spans = root.querySelectorAll('span.fd-menu__title');" + + " for (var i = 0; i < spans.length; i++) { if (spans[i].textContent.trim() === text) return spans[i]; }" + + " return null;" + "}" + "for (var i = 0; i < titles.length - 1; i++) {" + " var parent = find(titles[i]);" + + " if (!parent) return 'missing:' + titles[i];" + + " (parent.closest('li') || parent).dispatchEvent(new MouseEvent('mouseenter', { bubbles: true }));" + "}" + + "var leaf = find(titles[titles.length - 1]);" + "if (!leaf) return 'missing-leaf:' + titles[titles.length - 1];" + + "leaf.click();" + "return 'ok';"; + + @Override + public void clickCascadingMenuItem(String... titlePath) { + // Land in the frame that hosts the open (visible) context menu, then drive it via its own + // handlers. The menu lives in the projects-view iframe; a single in-frame script keeps it open. + findElementInAllFrames(By.cssSelector("[aria-label*='contextmenu']"), Condition.exist, Condition.visible); + Object result = Selenide.executeJavaScript(CASCADE_MENU_SCRIPT, (Object[]) titlePath); + if (!"ok".equals(result)) { + failWithScreenshot("Could not navigate context menu path " + Arrays.toString(titlePath) + " (result: " + result + ")"); + } } @Override diff --git a/tests/tests-framework/src/main/java/org/eclipse/dirigible/tests/framework/ide/Workbench.java b/tests/tests-framework/src/main/java/org/eclipse/dirigible/tests/framework/ide/Workbench.java index 795b50d06f3..b6a91a8b145 100644 --- a/tests/tests-framework/src/main/java/org/eclipse/dirigible/tests/framework/ide/Workbench.java +++ b/tests/tests-framework/src/main/java/org/eclipse/dirigible/tests/framework/ide/Workbench.java @@ -87,9 +87,7 @@ public void createJavaArtifact(String projectName, String leafLabel, String name expandProject(projectName); browser.rightClickOnElementContainingText(HtmlElementType.ANCHOR, projectName); - browser.hoverOnElementByAttributePatternAndText(HtmlElementType.SPAN, HtmlAttribute.CLASS, "fd-menu__title", "New"); - browser.hoverOnElementByAttributePatternAndText(HtmlElementType.SPAN, HtmlAttribute.CLASS, "fd-menu__title", "Java"); - browser.clickOnElementByAttributePatternAndText(HtmlElementType.SPAN, HtmlAttribute.CLASS, "fd-menu__title", leafLabel); + browser.clickCascadingMenuItem("New", "Java", leafLabel); browser.enterTextInElementById("fdti1", name); browser.clickOnElementWithText(HtmlElementType.BUTTON, "Create"); From fb31f74f16b2abe4a4a34c0171cd88118ed15780 Mon Sep 17 00:00:00 2001 From: Iliyan Velichkov Date: Tue, 23 Jun 2026 13:42:02 +0300 Subject: [PATCH 03/14] =?UTF-8?q?fix(ide):=20New=E2=86=92Java=20reveals=20?= =?UTF-8?q?the=20created=20file=20in=20the=20tree;=20Repository=20entity?= =?UTF-8?q?=20is=20an=20input?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - After creating a Java artefact the project tree now expands to and selects the new file (building/reusing the package folder nodes) instead of reloading the project node, which collapsed the structure. - The Repository skeleton no longer reuses the repository class name as its entity type parameter (DemoRepo → JavaRepository). The dialog now prompts for the entity type (simple or fully-qualified; a qualified name adds the import), producing e.g. JavaRepository with super(Country.class). - CreateJavaArtifactsIT + Workbench.createJavaArtifact updated for the entity prompt. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../dirigible/view-projects/js/java-new.js | 27 ++--- .../dirigible/view-projects/js/projects.js | 111 ++++++++++++++---- .../tests/framework/ide/Workbench.java | 12 ++ .../tests/ui/tests/CreateJavaArtifactsIT.java | 5 +- 4 files changed, 115 insertions(+), 40 deletions(-) diff --git a/components/ui/view-projects/src/main/resources/META-INF/dirigible/view-projects/js/java-new.js b/components/ui/view-projects/src/main/resources/META-INF/dirigible/view-projects/js/java-new.js index 1eab9757ba3..027cd95ab82 100644 --- a/components/ui/view-projects/src/main/resources/META-INF/dirigible/view-projects/js/java-new.js +++ b/components/ui/view-projects/src/main/resources/META-INF/dirigible/view-projects/js/java-new.js @@ -111,7 +111,7 @@ const JavaNew = (function () { return packageName ? `package ${packageName};\n\n` : ''; } - function body(kind, name) { + function body(kind, name, entity) { switch (kind) { case 'class': return `public class ${name} {\n\n}\n`; @@ -185,13 +185,17 @@ const JavaNew = (function () { + ` // TODO handle the inbound frame\n` + ` }\n}\n`; case 'repository': { - const entity = entityName(name); - return `import org.eclipse.dirigible.components.data.store.java.repository.JavaRepository;\n` + // The managed entity is supplied by the developer; a fully-qualified name adds an import. + const provided = (entity || '').trim() || 'Entity'; + const dot = provided.lastIndexOf('.'); + const entitySimple = dot >= 0 ? provided.substring(dot + 1) : provided; + const entityImport = dot >= 0 ? `import ${provided};\n` : ''; + return entityImport + `import org.eclipse.dirigible.components.data.store.java.repository.JavaRepository;\n` + `import org.eclipse.dirigible.sdk.component.Repository;\n\n` + `@Repository\n` - + `public class ${name} extends JavaRepository<${entity}> {\n\n` + + `public class ${name} extends JavaRepository<${entitySimple}> {\n\n` + ` public ${name}() {\n` - + ` super(${entity}.class);\n` + + ` super(${entitySimple}.class);\n` + ` }\n}\n`; } default: @@ -209,18 +213,13 @@ const JavaNew = (function () { return name.replace(/(Socket|Handler|Websocket)$/i, '').toLowerCase() || 'endpoint'; } - /** Derives the entity type a repository wraps, stripping a trailing {@code Repository}. */ - function entityName(name) { - const stripped = name.replace(/Repository$/, ''); - return stripped || 'Entity'; - } - /** - * Generates the skeleton source for the given kind. + * Generates the skeleton source for the given kind. {@code entity} is only used for the repository + * kind, where it is the developer-supplied entity type the repository manages. * @returns {string} */ - function generate(kind, packageName, typeName) { - return header(packageName) + body(kind, typeName); + function generate(kind, packageName, typeName, entity) { + return header(packageName) + body(kind, typeName, entity); } return { diff --git a/components/ui/view-projects/src/main/resources/META-INF/dirigible/view-projects/js/projects.js b/components/ui/view-projects/src/main/resources/META-INF/dirigible/view-projects/js/projects.js index b7ef48d911f..39fcb4569e1 100644 --- a/components/ui/view-projects/src/main/resources/META-INF/dirigible/view-projects/js/projects.js +++ b/components/ui/view-projects/src/main/resources/META-INF/dirigible/view-projects/js/projects.js @@ -1787,31 +1787,43 @@ projectsView.controller('ProjectsViewController', ( const projectPath = projectNode.data.path; // /workspace/project const folderPath = node.data.path; // /workspace/project[/sub...] const folderRel = folderPath.substring(projectPath.length).replace(/^\/+/, '').replace(/\/+$/, ''); + const form = { + 'fdti1': { + label: meta.kind === 'package' ? 'Package name' : 'Name', + controlType: 'input', + type: 'text', + placeholder: JavaNew.placeholderFor(meta.kind), + submitOnEnter: true, + focus: true, + required: true, + }, + }; + // A repository wraps an entity supplied by the developer (e.g. Country or com.example.Country). + if (meta.kind === 'repository') { + form['fdti2'] = { + label: 'Entity type', + controlType: 'input', + type: 'text', + placeholder: 'com.example.Country', + submitOnEnter: true, + required: true, + }; + } Dialogs.showFormDialog({ title: `New Java ${meta.label}`, - form: { - 'fdti1': { - label: meta.kind === 'package' ? 'Package name' : 'Name', - controlType: 'input', - type: 'text', - placeholder: JavaNew.placeholderFor(meta.kind), - submitOnEnter: true, - focus: true, - required: true, - }, - }, + form: form, submitLabel: 'Create', cancelLabel: 'Cancel' - }).then((form) => { - if (!form) return; + }).then((result) => { + if (!result) return; if (meta.kind === 'package') { - const parsed = JavaNew.parsePackage(form['fdti1']); + const parsed = JavaNew.parsePackage(result['fdti1']); if (!parsed.ok) { showJavaNameError(parsed.error); return; } - createJavaPackage(projectNode, folderPath, parsed.segments); + createJavaPackage(node, folderPath, parsed.segments); } else { - const parsed = JavaNew.parseType(form['fdti1']); + const parsed = JavaNew.parseType(result['fdti1']); if (!parsed.ok) { showJavaNameError(parsed.error); return; } - createJavaType(projectNode, folderPath, folderRel, meta.kind, parsed); + createJavaType(projectNode, node, folderPath, folderRel, meta.kind, parsed, result['fdti2']); } }, (error) => { console.error(error); @@ -1839,9 +1851,11 @@ projectsView.controller('ProjectsViewController', ( return WorkspaceService.createFolder(leaf, targetPath); } - function createJavaPackage(projectNode, folderPath, segments) { + function createJavaPackage(contextNode, folderPath, segments) { createNestedFolder(segments, folderPath).then(() => { - jstreeWidget.jstree(true).refresh_node(projectNode); + const folderNode = revealFolderNodes(contextNode, folderPath, segments); + jstreeWidget.jstree(true).deselect_all(true); + jstreeWidget.jstree(true).select_node(folderNode); StatusBar.showMessage(`Created package '${segments.join('.')}'`); }, (response) => { console.error(response); @@ -1854,16 +1868,16 @@ projectsView.controller('ProjectsViewController', ( }); } - function createJavaType(projectNode, folderPath, folderRel, kind, parsed) { + function createJavaType(projectNode, contextNode, folderPath, folderRel, kind, parsed, entity) { const relSegments = folderRel ? folderRel.split('/') : []; const packageName = relSegments.concat(parsed.packageSegments).join('.'); const targetFolderPath = parsed.packageSegments.length ? `${folderPath}/${parsed.packageSegments.join('/')}` : folderPath; const fileName = `${parsed.typeName}.java`; - const content = JavaNew.generate(kind, packageName, parsed.typeName); + const content = JavaNew.generate(kind, packageName, parsed.typeName, entity); // Tolerate an already-existing package folder; the file-creation step validates the real path. - const proceed = () => createJavaFile(projectNode, targetFolderPath, fileName, content); + const proceed = () => createJavaFile(projectNode, contextNode, folderPath, parsed.packageSegments, targetFolderPath, fileName, content); if (parsed.packageSegments.length) { createNestedFolder(parsed.packageSegments, folderPath).then(proceed, proceed); } else { @@ -1871,7 +1885,7 @@ projectsView.controller('ProjectsViewController', ( } } - function createJavaFile(projectNode, targetFolderPath, fileName, content) { + function createJavaFile(projectNode, contextNode, baseFolderPath, packageSegments, targetFolderPath, fileName, content) { const alertBody = { title: 'Could not create the Java file', message: `There was an error while creating '${fileName}'. It may already exist.`, @@ -1880,7 +1894,22 @@ projectsView.controller('ProjectsViewController', ( }; WorkspaceService.createFile(fileName, targetFolderPath, content).then((response) => { WorkspaceService.getMetadataByUrl(response.data).then((metadata) => { - jstreeWidget.jstree(true).refresh_node(projectNode); + // Build/expand the tree down to the package folder and select the new file, so the + // project structure stays open and reveals what was just created. + const folderNode = revealFolderNodes(contextNode, baseFolderPath, packageSegments); + jstreeWidget.jstree(true).deselect_all(true); + jstreeWidget.jstree(true).select_node( + jstreeWidget.jstree(true).create_node(folderNode, { + text: metadata.data.name, + type: 'file', + state: { status: metadata.data.status }, + icon: getFileIcon(metadata.data.name), + data: { + path: metadata.data.path, + contentType: metadata.data.contentType, + } + }) + ); Layout.openEditor({ path: metadata.data.path, contentType: metadata.data.contentType, @@ -1900,6 +1929,40 @@ projectsView.controller('ProjectsViewController', ( }); } + /** + * Ensures jstree folder nodes exist (and are expanded) for each package segment under + * {@code contextNode}, reusing existing nodes and creating the missing ones. Returns the deepest + * folder node (or {@code contextNode} when there are no package segments). + */ + function revealFolderNodes(contextNode, baseFolderPath, segments) { + const tree = jstreeWidget.jstree(true); + tree.open_node(contextNode); + let parentNode = contextNode; + let parentPath = baseFolderPath; + for (let i = 0; i < segments.length; i++) { + parentPath = `${parentPath.endsWith('/') ? parentPath.slice(0, -1) : parentPath}/${segments[i]}`; + let childId; + const children = parentNode.children || []; + for (let j = 0; j < children.length; j++) { + const child = tree.get_node(children[j]); + if (child.type === 'folder' && child.text === segments[i]) { + childId = children[j]; + break; + } + } + if (!childId) { + childId = tree.create_node(parentNode, { + text: segments[i], + type: 'folder', + data: { path: parentPath }, + }); + } + tree.open_node(childId); + parentNode = tree.get_node(childId); + } + return parentNode; + } + function openRenameDialog(renameNode) { Dialogs.showFormDialog({ title: `Rename ${renameNode.type}`, diff --git a/tests/tests-framework/src/main/java/org/eclipse/dirigible/tests/framework/ide/Workbench.java b/tests/tests-framework/src/main/java/org/eclipse/dirigible/tests/framework/ide/Workbench.java index b6a91a8b145..d067c83c566 100644 --- a/tests/tests-framework/src/main/java/org/eclipse/dirigible/tests/framework/ide/Workbench.java +++ b/tests/tests-framework/src/main/java/org/eclipse/dirigible/tests/framework/ide/Workbench.java @@ -84,12 +84,24 @@ public void createFileInProject(String projectName, String newFileType) { * {@code name} is the dotted package; for the others it is a simple or fully-qualified type name. */ public void createJavaArtifact(String projectName, String leafLabel, String name) { + createJavaArtifact(projectName, leafLabel, name, null); + } + + /** + * Variant for the Repository skeleton, which additionally prompts for the entity type the + * repository manages. Pass {@code entity} (simple or fully-qualified); {@code null} for the other + * kinds, which only prompt for a name. + */ + public void createJavaArtifact(String projectName, String leafLabel, String name, String entity) { expandProject(projectName); browser.rightClickOnElementContainingText(HtmlElementType.ANCHOR, projectName); browser.clickCascadingMenuItem("New", "Java", leafLabel); browser.enterTextInElementById("fdti1", name); + if (entity != null) { + browser.enterTextInElementById("fdti2", entity); + } browser.clickOnElementWithText(HtmlElementType.BUTTON, "Create"); } diff --git a/tests/tests-integrations/src/main/java/org/eclipse/dirigible/integration/tests/ui/tests/CreateJavaArtifactsIT.java b/tests/tests-integrations/src/main/java/org/eclipse/dirigible/integration/tests/ui/tests/CreateJavaArtifactsIT.java index bf6b9597eaa..193b3626df6 100644 --- a/tests/tests-integrations/src/main/java/org/eclipse/dirigible/integration/tests/ui/tests/CreateJavaArtifactsIT.java +++ b/tests/tests-integrations/src/main/java/org/eclipse/dirigible/integration/tests/ui/tests/CreateJavaArtifactsIT.java @@ -71,8 +71,9 @@ void createsJavaArtifactsFromTheNewMenu() { workbench.createJavaArtifact(PROJECT, "Listener", "OrderListener"); assertFileContains("/OrderListener.java", "implements MessageHandler", "ListenerKind"); - workbench.createJavaArtifact(PROJECT, "Repository", "CountryRepository"); - assertFileContains("/CountryRepository.java", "@Repository", "extends JavaRepository"); + // Repository additionally prompts for the entity type it manages. + workbench.createJavaArtifact(PROJECT, "Repository", "CountryRepository", "Country"); + assertFileContains("/CountryRepository.java", "@Repository", "extends JavaRepository", "super(Country.class)"); // Package -> the full nested folder chain is created from a dotted name. workbench.createJavaArtifact(PROJECT, "Package", "com.test.iliyan"); From 744f4b887e9abf436d5c6046c8b025421acd0111 Mon Sep 17 00:00:00 2001 From: Iliyan Velichkov Date: Tue, 23 Jun 2026 14:07:49 +0300 Subject: [PATCH 04/14] feat(editor): cross-file Go to Definition/References + better Java completion - Completion now propagates JDT.LS's isIncomplete so Monaco re-queries as you type (fixes the first Ctrl+Space showing nothing), and forwards the real trigger kind/character plus filterText/preselect/commitCharacters for correct filtering. - Registered a Monaco editor opener: Go to Definition / Find References to a symbol in another workspace file now opens that file in the IDE and reveals the line (the single-file editor previously had no model for other files, so navigation silently did nothing). Same-file targets still jump within the editor. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../dirigible/editor-monaco/js/editor.js | 12 +++++++ .../editor-monaco/js/java-lsp-client.js | 31 ++++++++++++++--- .../editor-monaco/js/lsp/java-lsp-client.ts | 33 +++++++++++++++++-- 3 files changed, 70 insertions(+), 6 deletions(-) diff --git a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/editor.js b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/editor.js index c55da0ccf00..bd7af27350c 100644 --- a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/editor.js +++ b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/editor.js @@ -38,6 +38,18 @@ window.javaLspMemberPicker = (title, labels) => { }); }; +// Cross-file navigation target for the Java LSP client (Go to Definition / Find References to a file +// that isn't open). Opens the file in the IDE and reveals the line via the shared reveal topic; the +// re-post covers the case where the target editor iframe is still mounting. +window.javaLspOpenFile = (path, line, column) => { + layoutHub.openEditor({ path: path }); + if (line && line > 0) { + const data = { filePath: path, line: line, column: column || 1 }; + themingHub.postMessage({ topic: 'editor.reveal.line', data: data }); + setTimeout(() => themingHub.postMessage({ topic: 'editor.reveal.line', data: data }), 1200); + } +}; + const brandingInfo = getBrandingInfo(); let csrfToken; diff --git a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/java-lsp-client.js b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/java-lsp-client.js index 38d95dee53a..1d9efb1227f 100644 --- a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/java-lsp-client.js +++ b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/java-lsp-client.js @@ -4634,19 +4634,38 @@ ${JSON.stringify(message, null, 4)}`); editor.registerCommand(APPLY_ACTION_COMMAND, (_accessor, action) => { applyCodeAction(action); }); + editor.registerEditorOpener({ + openCodeEditor: (source, resource, selectionOrPosition) => { + const uri = resource.toString(); + if (!isWorkspaceFile(uri) || !uri.startsWith(VIRTUAL_FILE_PREFIX)) return false; + const currentModel = source.getModel(); + if (currentModel && currentModel.uri.toString() === uri) return false; + const opener = globalThis.javaLspOpenFile; + if (typeof opener !== "function") return false; + const pos = selectionOrPosition; + const line = pos ? pos.startLineNumber ?? pos.lineNumber : void 0; + const column = pos ? pos.startColumn ?? pos.column : void 0; + opener(uri.substring(VIRTUAL_FILE_PREFIX.length), line, column); + return true; + } + }); languages.registerCompletionItemProvider("java", { triggerCharacters: [".", "@", "<"], - provideCompletionItems: async (model, position) => { + provideCompletionItems: async (model, position, context) => { if (!_conn || !isWorkspaceFile(model.uri.toString())) return null; const fileUri = model.uri.toString(); const result = await _conn.sendRequest("textDocument/completion", { textDocument: { uri: fileUri }, position: { line: position.lineNumber - 1, character: position.column - 1 }, - context: { triggerKind: 1 } + // Monaco trigger kinds are 0-based (Invoke/TriggerCharacter/ForIncomplete); LSP is 1-based. + context: { triggerKind: (context.triggerKind ?? 0) + 1, triggerCharacter: context.triggerCharacter } }); const items = Array.isArray(result) ? result : result?.items ?? []; return { - suggestions: items.map((item) => lspCompletionToMonaco(item, model, position)) + suggestions: items.map((item) => lspCompletionToMonaco(item, model, position)), + // JDT.LS returns a truncated list on the first keystrokes; propagating "incomplete" makes + // Monaco re-query as the user types instead of caching the first (often empty) result. + incomplete: Array.isArray(result) ? false : !!result?.isIncomplete }; }, // Resolve documentation and, crucially, the auto-import additionalTextEdits which JDT.LS only @@ -4900,6 +4919,9 @@ ${JSON.stringify(message, null, 4)}`); insertTextRules: item.insertTextFormat === InsertTextFormat.Snippet ? languages.CompletionItemInsertTextRule.InsertAsSnippet : void 0, range, sortText: sdkPrioritisedSortText(item), + filterText: item.filterText, + preselect: item.preselect, + commitCharacters: item.commitCharacters, additionalTextEdits: item.additionalTextEdits?.map(textEditToMonaco) }; result._lsp = item; @@ -4912,6 +4934,7 @@ ${JSON.stringify(message, null, 4)}`); return haystack.includes("org.eclipse.dirigible.sdk") ? `0_${base}` : `1_${base}`; } var APPLY_ACTION_COMMAND = "dirigible.java.applyCodeAction"; + var VIRTUAL_FILE_PREFIX = "file:///workspace"; function textEditToMonaco(edit) { return { range: lspRangeToMonaco(edit.range), text: edit.newText }; } @@ -5107,4 +5130,4 @@ ${JSON.stringify(message, null, 4)}`); } return __toCommonJS(java_lsp_client_exports); })(); -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvY29tbW9uL2lzLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlcy5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vbGlua2VkTWFwLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9kaXNwb3NhYmxlLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9yYWwuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvY29tbW9uL2V2ZW50cy5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vY2FuY2VsbGF0aW9uLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9zaGFyZWRBcnJheUNhbmNlbGxhdGlvbi5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vc2VtYXBob3JlLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlUmVhZGVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlV3JpdGVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlQnVmZmVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9jb25uZWN0aW9uLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9hcGkuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvYnJvd3Nlci9yaWwuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvYnJvd3Nlci9tYWluLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvYnJvd3Nlci5qcyIsICJsc3AvamF2YS1sc3AtY2xpZW50LnRzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLXdzLWpzb25ycGMvc3JjL2Rpc3Bvc2FibGUudHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvc29ja2V0L3NvY2tldC50cyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS13cy1qc29ucnBjL3NyYy9zb2NrZXQvcmVhZGVyLnRzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLXdzLWpzb25ycGMvc3JjL3NvY2tldC93cml0ZXIudHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvc29ja2V0L2Nvbm5lY3Rpb24udHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvY29ubmVjdGlvbi50cyIsICJsc3AvbW9uYWNvLXNoaW0udHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtbGFuZ3VhZ2VzZXJ2ZXItdHlwZXMvbGliL2VzbS9tYWluLmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuc3RyaW5nQXJyYXkgPSBleHBvcnRzLmFycmF5ID0gZXhwb3J0cy5mdW5jID0gZXhwb3J0cy5lcnJvciA9IGV4cG9ydHMubnVtYmVyID0gZXhwb3J0cy5zdHJpbmcgPSBleHBvcnRzLmJvb2xlYW4gPSB2b2lkIDA7XG5mdW5jdGlvbiBib29sZWFuKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZTtcbn1cbmV4cG9ydHMuYm9vbGVhbiA9IGJvb2xlYW47XG5mdW5jdGlvbiBzdHJpbmcodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZztcbn1cbmV4cG9ydHMuc3RyaW5nID0gc3RyaW5nO1xuZnVuY3Rpb24gbnVtYmVyKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdmFsdWUgaW5zdGFuY2VvZiBOdW1iZXI7XG59XG5leHBvcnRzLm51bWJlciA9IG51bWJlcjtcbmZ1bmN0aW9uIGVycm9yKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgRXJyb3I7XG59XG5leHBvcnRzLmVycm9yID0gZXJyb3I7XG5mdW5jdGlvbiBmdW5jKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cbmV4cG9ydHMuZnVuYyA9IGZ1bmM7XG5mdW5jdGlvbiBhcnJheSh2YWx1ZSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cbmV4cG9ydHMuYXJyYXkgPSBhcnJheTtcbmZ1bmN0aW9uIHN0cmluZ0FycmF5KHZhbHVlKSB7XG4gICAgcmV0dXJuIGFycmF5KHZhbHVlKSAmJiB2YWx1ZS5ldmVyeShlbGVtID0+IHN0cmluZyhlbGVtKSk7XG59XG5leHBvcnRzLnN0cmluZ0FycmF5ID0gc3RyaW5nQXJyYXk7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLk1lc3NhZ2UgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU5ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlOCA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTcgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU2ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNSA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTQgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUzID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMiA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTEgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUwID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTkgPSBleHBvcnRzLlJlcXVlc3RUeXBlOCA9IGV4cG9ydHMuUmVxdWVzdFR5cGU3ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTYgPSBleHBvcnRzLlJlcXVlc3RUeXBlNSA9IGV4cG9ydHMuUmVxdWVzdFR5cGU0ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTMgPSBleHBvcnRzLlJlcXVlc3RUeXBlMiA9IGV4cG9ydHMuUmVxdWVzdFR5cGUxID0gZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IGV4cG9ydHMuUmVxdWVzdFR5cGUwID0gZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUgPSBleHBvcnRzLlBhcmFtZXRlclN0cnVjdHVyZXMgPSBleHBvcnRzLlJlc3BvbnNlRXJyb3IgPSBleHBvcnRzLkVycm9yQ29kZXMgPSB2b2lkIDA7XG5jb25zdCBpcyA9IHJlcXVpcmUoXCIuL2lzXCIpO1xuLyoqXG4gKiBQcmVkZWZpbmVkIGVycm9yIGNvZGVzLlxuICovXG52YXIgRXJyb3JDb2RlcztcbihmdW5jdGlvbiAoRXJyb3JDb2Rlcykge1xuICAgIC8vIERlZmluZWQgYnkgSlNPTiBSUENcbiAgICBFcnJvckNvZGVzLlBhcnNlRXJyb3IgPSAtMzI3MDA7XG4gICAgRXJyb3JDb2Rlcy5JbnZhbGlkUmVxdWVzdCA9IC0zMjYwMDtcbiAgICBFcnJvckNvZGVzLk1ldGhvZE5vdEZvdW5kID0gLTMyNjAxO1xuICAgIEVycm9yQ29kZXMuSW52YWxpZFBhcmFtcyA9IC0zMjYwMjtcbiAgICBFcnJvckNvZGVzLkludGVybmFsRXJyb3IgPSAtMzI2MDM7XG4gICAgLyoqXG4gICAgICogVGhpcyBpcyB0aGUgc3RhcnQgcmFuZ2Ugb2YgSlNPTiBSUEMgcmVzZXJ2ZWQgZXJyb3IgY29kZXMuXG4gICAgICogSXQgZG9lc24ndCBkZW5vdGUgYSByZWFsIGVycm9yIGNvZGUuIE5vIGFwcGxpY2F0aW9uIGVycm9yIGNvZGVzIHNob3VsZFxuICAgICAqIGJlIGRlZmluZWQgYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCByYW5nZS4gRm9yIGJhY2t3YXJkc1xuICAgICAqIGNvbXBhdGliaWxpdHkgdGhlIGBTZXJ2ZXJOb3RJbml0aWFsaXplZGAgYW5kIHRoZSBgVW5rbm93bkVycm9yQ29kZWBcbiAgICAgKiBhcmUgbGVmdCBpbiB0aGUgcmFuZ2UuXG4gICAgICpcbiAgICAgKiBAc2luY2UgMy4xNi4wXG4gICAgKi9cbiAgICBFcnJvckNvZGVzLmpzb25ycGNSZXNlcnZlZEVycm9yUmFuZ2VTdGFydCA9IC0zMjA5OTtcbiAgICAvKiogQGRlcHJlY2F0ZWQgdXNlICBqc29ucnBjUmVzZXJ2ZWRFcnJvclJhbmdlU3RhcnQgKi9cbiAgICBFcnJvckNvZGVzLnNlcnZlckVycm9yU3RhcnQgPSAtMzIwOTk7XG4gICAgLyoqXG4gICAgICogQW4gZXJyb3Igb2NjdXJyZWQgd2hlbiB3cml0ZSBhIG1lc3NhZ2UgdG8gdGhlIHRyYW5zcG9ydCBsYXllci5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLk1lc3NhZ2VXcml0ZUVycm9yID0gLTMyMDk5O1xuICAgIC8qKlxuICAgICAqIEFuIGVycm9yIG9jY3VycmVkIHdoZW4gcmVhZGluZyBhIG1lc3NhZ2UgZnJvbSB0aGUgdHJhbnNwb3J0IGxheWVyLlxuICAgICAqL1xuICAgIEVycm9yQ29kZXMuTWVzc2FnZVJlYWRFcnJvciA9IC0zMjA5ODtcbiAgICAvKipcbiAgICAgKiBUaGUgY29ubmVjdGlvbiBnb3QgZGlzcG9zZWQgb3IgbG9zdCBhbmQgYWxsIHBlbmRpbmcgcmVzcG9uc2VzIGdvdFxuICAgICAqIHJlamVjdGVkLlxuICAgICAqL1xuICAgIEVycm9yQ29kZXMuUGVuZGluZ1Jlc3BvbnNlUmVqZWN0ZWQgPSAtMzIwOTc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gaXMgaW5hY3RpdmUgYW5kIGEgdXNlIG9mIGl0IGZhaWxlZC5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLkNvbm5lY3Rpb25JbmFjdGl2ZSA9IC0zMjA5NjtcbiAgICAvKipcbiAgICAgKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBhIHNlcnZlciByZWNlaXZlZCBhIG5vdGlmaWNhdGlvbiBvclxuICAgICAqIHJlcXVlc3QgYmVmb3JlIHRoZSBzZXJ2ZXIgaGFzIHJlY2VpdmVkIHRoZSBgaW5pdGlhbGl6ZWAgcmVxdWVzdC5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLlNlcnZlck5vdEluaXRpYWxpemVkID0gLTMyMDAyO1xuICAgIEVycm9yQ29kZXMuVW5rbm93bkVycm9yQ29kZSA9IC0zMjAwMTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIHRoZSBlbmQgcmFuZ2Ugb2YgSlNPTiBSUEMgcmVzZXJ2ZWQgZXJyb3IgY29kZXMuXG4gICAgICogSXQgZG9lc24ndCBkZW5vdGUgYSByZWFsIGVycm9yIGNvZGUuXG4gICAgICpcbiAgICAgKiBAc2luY2UgMy4xNi4wXG4gICAgKi9cbiAgICBFcnJvckNvZGVzLmpzb25ycGNSZXNlcnZlZEVycm9yUmFuZ2VFbmQgPSAtMzIwMDA7XG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSAganNvbnJwY1Jlc2VydmVkRXJyb3JSYW5nZUVuZCAqL1xuICAgIEVycm9yQ29kZXMuc2VydmVyRXJyb3JFbmQgPSAtMzIwMDA7XG59KShFcnJvckNvZGVzIHx8IChleHBvcnRzLkVycm9yQ29kZXMgPSBFcnJvckNvZGVzID0ge30pKTtcbi8qKlxuICogQW4gZXJyb3Igb2JqZWN0IHJldHVybiBpbiBhIHJlc3BvbnNlIGluIGNhc2UgYSByZXF1ZXN0XG4gKiBoYXMgZmFpbGVkLlxuICovXG5jbGFzcyBSZXNwb25zZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNvZGUsIG1lc3NhZ2UsIGRhdGEpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuY29kZSA9IGlzLm51bWJlcihjb2RlKSA/IGNvZGUgOiBFcnJvckNvZGVzLlVua25vd25FcnJvckNvZGU7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBSZXNwb25zZUVycm9yLnByb3RvdHlwZSk7XG4gICAgfVxuICAgIHRvSnNvbigpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgY29kZTogdGhpcy5jb2RlLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLmRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmRhdGEgPSB0aGlzLmRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5leHBvcnRzLlJlc3BvbnNlRXJyb3IgPSBSZXNwb25zZUVycm9yO1xuY2xhc3MgUGFyYW1ldGVyU3RydWN0dXJlcyB7XG4gICAgY29uc3RydWN0b3Ioa2luZCkge1xuICAgICAgICB0aGlzLmtpbmQgPSBraW5kO1xuICAgIH1cbiAgICBzdGF0aWMgaXModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8gfHwgdmFsdWUgPT09IFBhcmFtZXRlclN0cnVjdHVyZXMuYnlOYW1lIHx8IHZhbHVlID09PSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5UG9zaXRpb247XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5raW5kO1xuICAgIH1cbn1cbmV4cG9ydHMuUGFyYW1ldGVyU3RydWN0dXJlcyA9IFBhcmFtZXRlclN0cnVjdHVyZXM7XG4vKipcbiAqIFRoZSBwYXJhbWV0ZXIgc3RydWN0dXJlIGlzIGF1dG9tYXRpY2FsbHkgaW5mZXJyZWQgb24gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzXG4gKiBhbmQgdGhlIHBhcmFtZXRlciB0eXBlIGluIGNhc2Ugb2YgYSBzaW5nbGUgcGFyYW0uXG4gKi9cblBhcmFtZXRlclN0cnVjdHVyZXMuYXV0byA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdhdXRvJyk7XG4vKipcbiAqIEZvcmNlcyBgYnlQb3NpdGlvbmAgcGFyYW1ldGVyIHN0cnVjdHVyZS4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGhhdmUgYSBzaW5nbGVcbiAqIHBhcmFtZXRlciB3aGljaCBoYXMgYSBsaXRlcmFsIHR5cGUuXG4gKi9cblBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbiA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdieVBvc2l0aW9uJyk7XG4vKipcbiAqIEZvcmNlcyBgYnlOYW1lYCBwYXJhbWV0ZXIgc3RydWN0dXJlLiBUaGlzIGlzIG9ubHkgdXNlZnVsIHdoZW4gaGF2aW5nIGEgc2luZ2xlXG4gKiBwYXJhbWV0ZXIuIFRoZSBsaWJyYXJ5IHdpbGwgcmVwb3J0IGVycm9ycyBpZiB1c2VkIHdpdGggYSBkaWZmZXJlbnQgbnVtYmVyIG9mXG4gKiBwYXJhbWV0ZXJzLlxuICovXG5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdieU5hbWUnKTtcbi8qKlxuICogQW4gYWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgYSBNZXNzYWdlVHlwZS5cbiAqL1xuY2xhc3MgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIG51bWJlck9mUGFyYW1zKSB7XG4gICAgICAgIHRoaXMubWV0aG9kID0gbWV0aG9kO1xuICAgICAgICB0aGlzLm51bWJlck9mUGFyYW1zID0gbnVtYmVyT2ZQYXJhbXM7XG4gICAgfVxuICAgIGdldCBwYXJhbWV0ZXJTdHJ1Y3R1cmVzKCkge1xuICAgICAgICByZXR1cm4gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvO1xuICAgIH1cbn1cbmV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlID0gQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlO1xuLyoqXG4gKiBDbGFzc2VzIHRvIHR5cGUgcmVxdWVzdCByZXNwb25zZSBwYWlyc1xuICovXG5jbGFzcyBSZXF1ZXN0VHlwZTAgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDApO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGUwID0gUmVxdWVzdFR5cGUwO1xuY2xhc3MgUmVxdWVzdFR5cGUgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCwgX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8pIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAxKTtcbiAgICAgICAgdGhpcy5fcGFyYW1ldGVyU3RydWN0dXJlcyA9IF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbiAgICBnZXQgcGFyYW1ldGVyU3RydWN0dXJlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXM7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IFJlcXVlc3RUeXBlO1xuY2xhc3MgUmVxdWVzdFR5cGUxIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMSk7XG4gICAgICAgIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBfcGFyYW1ldGVyU3RydWN0dXJlcztcbiAgICB9XG4gICAgZ2V0IHBhcmFtZXRlclN0cnVjdHVyZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGUxID0gUmVxdWVzdFR5cGUxO1xuY2xhc3MgUmVxdWVzdFR5cGUyIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAyKTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlMiA9IFJlcXVlc3RUeXBlMjtcbmNsYXNzIFJlcXVlc3RUeXBlMyBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMyk7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTMgPSBSZXF1ZXN0VHlwZTM7XG5jbGFzcyBSZXF1ZXN0VHlwZTQgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDQpO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGU0ID0gUmVxdWVzdFR5cGU0O1xuY2xhc3MgUmVxdWVzdFR5cGU1IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA1KTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlNSA9IFJlcXVlc3RUeXBlNTtcbmNsYXNzIFJlcXVlc3RUeXBlNiBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNik7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTYgPSBSZXF1ZXN0VHlwZTY7XG5jbGFzcyBSZXF1ZXN0VHlwZTcgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDcpO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGU3ID0gUmVxdWVzdFR5cGU3O1xuY2xhc3MgUmVxdWVzdFR5cGU4IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA4KTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlOCA9IFJlcXVlc3RUeXBlODtcbmNsYXNzIFJlcXVlc3RUeXBlOSBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgOSk7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTkgPSBSZXF1ZXN0VHlwZTk7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMSk7XG4gICAgICAgIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBfcGFyYW1ldGVyU3RydWN0dXJlcztcbiAgICB9XG4gICAgZ2V0IHBhcmFtZXRlclN0cnVjdHVyZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZSA9IE5vdGlmaWNhdGlvblR5cGU7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlMCBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMCk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMCA9IE5vdGlmaWNhdGlvblR5cGUwO1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTEgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCwgX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8pIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAxKTtcbiAgICAgICAgdGhpcy5fcGFyYW1ldGVyU3RydWN0dXJlcyA9IF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbiAgICBnZXQgcGFyYW1ldGVyU3RydWN0dXJlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXM7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMSA9IE5vdGlmaWNhdGlvblR5cGUxO1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDIpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTIgPSBOb3RpZmljYXRpb25UeXBlMjtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGUzIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAzKTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGUzID0gTm90aWZpY2F0aW9uVHlwZTM7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlNCBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNCk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNCA9IE5vdGlmaWNhdGlvblR5cGU0O1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTUgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDUpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTUgPSBOb3RpZmljYXRpb25UeXBlNTtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGU2IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA2KTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGU2ID0gTm90aWZpY2F0aW9uVHlwZTY7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlNyBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNyk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNyA9IE5vdGlmaWNhdGlvblR5cGU3O1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTggZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDgpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTggPSBOb3RpZmljYXRpb25UeXBlODtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGU5IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA5KTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGU5ID0gTm90aWZpY2F0aW9uVHlwZTk7XG52YXIgTWVzc2FnZTtcbihmdW5jdGlvbiAoTWVzc2FnZSkge1xuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoZSBnaXZlbiBtZXNzYWdlIGlzIGEgcmVxdWVzdCBtZXNzYWdlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gbWVzc2FnZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBpcy5zdHJpbmcoY2FuZGlkYXRlLm1ldGhvZCkgJiYgKGlzLnN0cmluZyhjYW5kaWRhdGUuaWQpIHx8IGlzLm51bWJlcihjYW5kaWRhdGUuaWQpKTtcbiAgICB9XG4gICAgTWVzc2FnZS5pc1JlcXVlc3QgPSBpc1JlcXVlc3Q7XG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhlIGdpdmVuIG1lc3NhZ2UgaXMgYSBub3RpZmljYXRpb24gbWVzc2FnZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTm90aWZpY2F0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gbWVzc2FnZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBpcy5zdHJpbmcoY2FuZGlkYXRlLm1ldGhvZCkgJiYgbWVzc2FnZS5pZCA9PT0gdm9pZCAwO1xuICAgIH1cbiAgICBNZXNzYWdlLmlzTm90aWZpY2F0aW9uID0gaXNOb3RpZmljYXRpb247XG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhlIGdpdmVuIG1lc3NhZ2UgaXMgYSByZXNwb25zZSBtZXNzYWdlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNSZXNwb25zZShtZXNzYWdlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IG1lc3NhZ2U7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgKGNhbmRpZGF0ZS5yZXN1bHQgIT09IHZvaWQgMCB8fCAhIWNhbmRpZGF0ZS5lcnJvcikgJiYgKGlzLnN0cmluZyhjYW5kaWRhdGUuaWQpIHx8IGlzLm51bWJlcihjYW5kaWRhdGUuaWQpIHx8IGNhbmRpZGF0ZS5pZCA9PT0gbnVsbCk7XG4gICAgfVxuICAgIE1lc3NhZ2UuaXNSZXNwb25zZSA9IGlzUmVzcG9uc2U7XG59KShNZXNzYWdlIHx8IChleHBvcnRzLk1lc3NhZ2UgPSBNZXNzYWdlID0ge30pKTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xudmFyIF9hO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5MUlVDYWNoZSA9IGV4cG9ydHMuTGlua2VkTWFwID0gZXhwb3J0cy5Ub3VjaCA9IHZvaWQgMDtcbnZhciBUb3VjaDtcbihmdW5jdGlvbiAoVG91Y2gpIHtcbiAgICBUb3VjaC5Ob25lID0gMDtcbiAgICBUb3VjaC5GaXJzdCA9IDE7XG4gICAgVG91Y2guQXNPbGQgPSBUb3VjaC5GaXJzdDtcbiAgICBUb3VjaC5MYXN0ID0gMjtcbiAgICBUb3VjaC5Bc05ldyA9IFRvdWNoLkxhc3Q7XG59KShUb3VjaCB8fCAoZXhwb3J0cy5Ub3VjaCA9IFRvdWNoID0ge30pKTtcbmNsYXNzIExpbmtlZE1hcCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXNbX2FdID0gJ0xpbmtlZE1hcCc7XG4gICAgICAgIHRoaXMuX21hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5faGVhZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fdGFpbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IDA7XG4gICAgICAgIHRoaXMuX3N0YXRlID0gMDtcbiAgICB9XG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuX21hcC5jbGVhcigpO1xuICAgICAgICB0aGlzLl9oZWFkID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl90YWlsID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9zaXplID0gMDtcbiAgICAgICAgdGhpcy5fc3RhdGUrKztcbiAgICB9XG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLl9oZWFkICYmICF0aGlzLl90YWlsO1xuICAgIH1cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpemU7XG4gICAgfVxuICAgIGdldCBmaXJzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlYWQ/LnZhbHVlO1xuICAgIH1cbiAgICBnZXQgbGFzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhaWw/LnZhbHVlO1xuICAgIH1cbiAgICBoYXMoa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXAuaGFzKGtleSk7XG4gICAgfVxuICAgIGdldChrZXksIHRvdWNoID0gVG91Y2guTm9uZSkge1xuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5fbWFwLmdldChrZXkpO1xuICAgICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRvdWNoICE9PSBUb3VjaC5Ob25lKSB7XG4gICAgICAgICAgICB0aGlzLnRvdWNoKGl0ZW0sIHRvdWNoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICB9XG4gICAgc2V0KGtleSwgdmFsdWUsIHRvdWNoID0gVG91Y2guTm9uZSkge1xuICAgICAgICBsZXQgaXRlbSA9IHRoaXMuX21hcC5nZXQoa2V5KTtcbiAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgIGl0ZW0udmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIGlmICh0b3VjaCAhPT0gVG91Y2guTm9uZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudG91Y2goaXRlbSwgdG91Y2gpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaXRlbSA9IHsga2V5LCB2YWx1ZSwgbmV4dDogdW5kZWZpbmVkLCBwcmV2aW91czogdW5kZWZpbmVkIH07XG4gICAgICAgICAgICBzd2l0Y2ggKHRvdWNoKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBUb3VjaC5Ob25lOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFRvdWNoLkZpcnN0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1GaXJzdChpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBUb3VjaC5MYXN0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX21hcC5zZXQoa2V5LCBpdGVtKTtcbiAgICAgICAgICAgIHRoaXMuX3NpemUrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGVsZXRlKGtleSkge1xuICAgICAgICByZXR1cm4gISF0aGlzLnJlbW92ZShrZXkpO1xuICAgIH1cbiAgICByZW1vdmUoa2V5KSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl9tYXAuZ2V0KGtleSk7XG4gICAgICAgIGlmICghaXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tYXAuZGVsZXRlKGtleSk7XG4gICAgICAgIHRoaXMucmVtb3ZlSXRlbShpdGVtKTtcbiAgICAgICAgdGhpcy5fc2l6ZS0tO1xuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICB9XG4gICAgc2hpZnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5faGVhZCAmJiAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2hlYWQgfHwgIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIHRoaXMuX21hcC5kZWxldGUoaXRlbS5rZXkpO1xuICAgICAgICB0aGlzLnJlbW92ZUl0ZW0oaXRlbSk7XG4gICAgICAgIHRoaXMuX3NpemUtLTtcbiAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7XG4gICAgfVxuICAgIGZvckVhY2goY2FsbGJhY2tmbiwgdGhpc0FyZykge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3N0YXRlO1xuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICAgICAgICBpZiAodGhpc0FyZykge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrZm4uYmluZCh0aGlzQXJnKShjdXJyZW50LnZhbHVlLCBjdXJyZW50LmtleSwgdGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFja2ZuKGN1cnJlbnQudmFsdWUsIGN1cnJlbnQua2V5LCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gc3RhdGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExpbmtlZE1hcCBnb3QgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAga2V5cygpIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9zdGF0ZTtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLl9oZWFkO1xuICAgICAgICBjb25zdCBpdGVyYXRvciA9IHtcbiAgICAgICAgICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fc3RhdGUgIT09IHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTGlua2VkTWFwIGdvdCBtb2RpZmllZCBkdXJpbmcgaXRlcmF0aW9uLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7IHZhbHVlOiBjdXJyZW50LmtleSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICB9XG4gICAgdmFsdWVzKCkge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3N0YXRlO1xuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIGNvbnN0IGl0ZXJhdG9yID0ge1xuICAgICAgICAgICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlcmF0b3I7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBMaW5rZWRNYXAgZ290IG1vZGlmaWVkIGR1cmluZyBpdGVyYXRpb24uYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHsgdmFsdWU6IGN1cnJlbnQudmFsdWUsIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gaXRlcmF0b3I7XG4gICAgfVxuICAgIGVudHJpZXMoKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5fc3RhdGU7XG4gICAgICAgIGxldCBjdXJyZW50ID0gdGhpcy5faGVhZDtcbiAgICAgICAgY29uc3QgaXRlcmF0b3IgPSB7XG4gICAgICAgICAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3N0YXRlICE9PSBzdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExpbmtlZE1hcCBnb3QgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geyB2YWx1ZTogW2N1cnJlbnQua2V5LCBjdXJyZW50LnZhbHVlXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICB9XG4gICAgWyhfYSA9IFN5bWJvbC50b1N0cmluZ1RhZywgU3ltYm9sLml0ZXJhdG9yKV0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMoKTtcbiAgICB9XG4gICAgdHJpbU9sZChuZXdTaXplKSB7XG4gICAgICAgIGlmIChuZXdTaXplID49IHRoaXMuc2l6ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuZXdTaXplID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLl9oZWFkO1xuICAgICAgICBsZXQgY3VycmVudFNpemUgPSB0aGlzLnNpemU7XG4gICAgICAgIHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnRTaXplID4gbmV3U2l6ZSkge1xuICAgICAgICAgICAgdGhpcy5fbWFwLmRlbGV0ZShjdXJyZW50LmtleSk7XG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0O1xuICAgICAgICAgICAgY3VycmVudFNpemUtLTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9oZWFkID0gY3VycmVudDtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IGN1cnJlbnRTaXplO1xuICAgICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICAgICAgY3VycmVudC5wcmV2aW91cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgIH1cbiAgICBhZGRJdGVtRmlyc3QoaXRlbSkge1xuICAgICAgICAvLyBGaXJzdCB0aW1lIEluc2VydFxuICAgICAgICBpZiAoIXRoaXMuX2hlYWQgJiYgIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRoaXMuX3RhaWwgPSBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCF0aGlzLl9oZWFkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbGlzdCcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdGhpcy5faGVhZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQucHJldmlvdXMgPSBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2hlYWQgPSBpdGVtO1xuICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgIH1cbiAgICBhZGRJdGVtTGFzdChpdGVtKSB7XG4gICAgICAgIC8vIEZpcnN0IHRpbWUgSW5zZXJ0XG4gICAgICAgIGlmICghdGhpcy5faGVhZCAmJiAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgdGhpcy5faGVhZCA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpdGVtLnByZXZpb3VzID0gdGhpcy5fdGFpbDtcbiAgICAgICAgICAgIHRoaXMuX3RhaWwubmV4dCA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW07XG4gICAgICAgIHRoaXMuX3N0YXRlKys7XG4gICAgfVxuICAgIHJlbW92ZUl0ZW0oaXRlbSkge1xuICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCAmJiBpdGVtID09PSB0aGlzLl90YWlsKSB7XG4gICAgICAgICAgICB0aGlzLl9oZWFkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpdGVtID09PSB0aGlzLl9oZWFkKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGNhbiBvbmx5IGhhcHBlbmVkIGlmIHNpemUgPT09IDEgd2hpY2ggaXMgaGFuZGxlXG4gICAgICAgICAgICAvLyBieSB0aGUgY2FzZSBhYm92ZS5cbiAgICAgICAgICAgIGlmICghaXRlbS5uZXh0KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxpc3QnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGl0ZW0ubmV4dC5wcmV2aW91cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQgPSBpdGVtLm5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXRlbSA9PT0gdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgLy8gVGhpcyBjYW4gb25seSBoYXBwZW5lZCBpZiBzaXplID09PSAxIHdoaWNoIGlzIGhhbmRsZVxuICAgICAgICAgICAgLy8gYnkgdGhlIGNhc2UgYWJvdmUuXG4gICAgICAgICAgICBpZiAoIWl0ZW0ucHJldmlvdXMpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbGlzdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbS5wcmV2aW91cy5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gaXRlbS5uZXh0O1xuICAgICAgICAgICAgY29uc3QgcHJldmlvdXMgPSBpdGVtLnByZXZpb3VzO1xuICAgICAgICAgICAgaWYgKCFuZXh0IHx8ICFwcmV2aW91cykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXh0LnByZXZpb3VzID0gcHJldmlvdXM7XG4gICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gbmV4dDtcbiAgICAgICAgfVxuICAgICAgICBpdGVtLm5leHQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGl0ZW0ucHJldmlvdXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX3N0YXRlKys7XG4gICAgfVxuICAgIHRvdWNoKGl0ZW0sIHRvdWNoKSB7XG4gICAgICAgIGlmICghdGhpcy5faGVhZCB8fCAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxpc3QnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHRvdWNoICE9PSBUb3VjaC5GaXJzdCAmJiB0b3VjaCAhPT0gVG91Y2guTGFzdCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG91Y2ggPT09IFRvdWNoLkZpcnN0KSB7XG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBpdGVtLm5leHQ7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgICAgICAvLyBVbmxpbmsgdGhlIGl0ZW1cbiAgICAgICAgICAgIGlmIChpdGVtID09PSB0aGlzLl90YWlsKSB7XG4gICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgbXVzdCBiZSBkZWZpbmVkIHNpbmNlIGl0ZW0gd2FzIG5vdCBoZWFkIGJ1dCBpcyB0YWlsXG4gICAgICAgICAgICAgICAgLy8gU28gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbiBpdGVtIGluIHRoZSBtYXBcbiAgICAgICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuX3RhaWwgPSBwcmV2aW91cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEJvdGggbmV4dCBhbmQgcHJldmlvdXMgYXJlIG5vdCB1bmRlZmluZWQgc2luY2UgaXRlbSB3YXMgbmVpdGhlciBoZWFkIG5vciB0YWlsLlxuICAgICAgICAgICAgICAgIG5leHQucHJldmlvdXMgPSBwcmV2aW91cztcbiAgICAgICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEluc2VydCB0aGUgbm9kZSBhdCBoZWFkXG4gICAgICAgICAgICBpdGVtLnByZXZpb3VzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdGhpcy5faGVhZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQucHJldmlvdXMgPSBpdGVtO1xuICAgICAgICAgICAgdGhpcy5faGVhZCA9IGl0ZW07XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRvdWNoID09PSBUb3VjaC5MYXN0KSB7XG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBpdGVtLm5leHQ7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgICAgICAvLyBVbmxpbmsgdGhlIGl0ZW0uXG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCkge1xuICAgICAgICAgICAgICAgIC8vIG5leHQgbXVzdCBiZSBkZWZpbmVkIHNpbmNlIGl0ZW0gd2FzIG5vdCB0YWlsIGJ1dCBpcyBoZWFkXG4gICAgICAgICAgICAgICAgLy8gU28gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbiBpdGVtIGluIHRoZSBtYXBcbiAgICAgICAgICAgICAgICBuZXh0LnByZXZpb3VzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuX2hlYWQgPSBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQm90aCBuZXh0IGFuZCBwcmV2aW91cyBhcmUgbm90IHVuZGVmaW5lZCBzaW5jZSBpdGVtIHdhcyBuZWl0aGVyIGhlYWQgbm9yIHRhaWwuXG4gICAgICAgICAgICAgICAgbmV4dC5wcmV2aW91cyA9IHByZXZpb3VzO1xuICAgICAgICAgICAgICAgIHByZXZpb3VzLm5leHQgPSBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaXRlbS5wcmV2aW91cyA9IHRoaXMuX3RhaWw7XG4gICAgICAgICAgICB0aGlzLl90YWlsLm5leHQgPSBpdGVtO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW07XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IFtdO1xuICAgICAgICB0aGlzLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGRhdGEucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGZyb21KU09OKGRhdGEpIHtcbiAgICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBkYXRhKSB7XG4gICAgICAgICAgICB0aGlzLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuTGlua2VkTWFwID0gTGlua2VkTWFwO1xuY2xhc3MgTFJVQ2FjaGUgZXh0ZW5kcyBMaW5rZWRNYXAge1xuICAgIGNvbnN0cnVjdG9yKGxpbWl0LCByYXRpbyA9IDEpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fbGltaXQgPSBsaW1pdDtcbiAgICAgICAgdGhpcy5fcmF0aW8gPSBNYXRoLm1pbihNYXRoLm1heCgwLCByYXRpbyksIDEpO1xuICAgIH1cbiAgICBnZXQgbGltaXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9saW1pdDtcbiAgICB9XG4gICAgc2V0IGxpbWl0KGxpbWl0KSB7XG4gICAgICAgIHRoaXMuX2xpbWl0ID0gbGltaXQ7XG4gICAgICAgIHRoaXMuY2hlY2tUcmltKCk7XG4gICAgfVxuICAgIGdldCByYXRpbygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JhdGlvO1xuICAgIH1cbiAgICBzZXQgcmF0aW8ocmF0aW8pIHtcbiAgICAgICAgdGhpcy5fcmF0aW8gPSBNYXRoLm1pbihNYXRoLm1heCgwLCByYXRpbyksIDEpO1xuICAgICAgICB0aGlzLmNoZWNrVHJpbSgpO1xuICAgIH1cbiAgICBnZXQoa2V5LCB0b3VjaCA9IFRvdWNoLkFzTmV3KSB7XG4gICAgICAgIHJldHVybiBzdXBlci5nZXQoa2V5LCB0b3VjaCk7XG4gICAgfVxuICAgIHBlZWsoa2V5KSB7XG4gICAgICAgIHJldHVybiBzdXBlci5nZXQoa2V5LCBUb3VjaC5Ob25lKTtcbiAgICB9XG4gICAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgc3VwZXIuc2V0KGtleSwgdmFsdWUsIFRvdWNoLkxhc3QpO1xuICAgICAgICB0aGlzLmNoZWNrVHJpbSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgY2hlY2tUcmltKCkge1xuICAgICAgICBpZiAodGhpcy5zaXplID4gdGhpcy5fbGltaXQpIHtcbiAgICAgICAgICAgIHRoaXMudHJpbU9sZChNYXRoLnJvdW5kKHRoaXMuX2xpbWl0ICogdGhpcy5fcmF0aW8pKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuTFJVQ2FjaGUgPSBMUlVDYWNoZTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5EaXNwb3NhYmxlID0gdm9pZCAwO1xudmFyIERpc3Bvc2FibGU7XG4oZnVuY3Rpb24gKERpc3Bvc2FibGUpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUoZnVuYykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGlzcG9zZTogZnVuY1xuICAgICAgICB9O1xuICAgIH1cbiAgICBEaXNwb3NhYmxlLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKERpc3Bvc2FibGUgfHwgKGV4cG9ydHMuRGlzcG9zYWJsZSA9IERpc3Bvc2FibGUgPSB7fSkpO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xubGV0IF9yYWw7XG5mdW5jdGlvbiBSQUwoKSB7XG4gICAgaWYgKF9yYWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHJ1bnRpbWUgYWJzdHJhY3Rpb24gbGF5ZXIgaW5zdGFsbGVkYCk7XG4gICAgfVxuICAgIHJldHVybiBfcmFsO1xufVxuKGZ1bmN0aW9uIChSQUwpIHtcbiAgICBmdW5jdGlvbiBpbnN0YWxsKHJhbCkge1xuICAgICAgICBpZiAocmFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gcnVudGltZSBhYnN0cmFjdGlvbiBsYXllciBwcm92aWRlZGApO1xuICAgICAgICB9XG4gICAgICAgIF9yYWwgPSByYWw7XG4gICAgfVxuICAgIFJBTC5pbnN0YWxsID0gaW5zdGFsbDtcbn0pKFJBTCB8fCAoUkFMID0ge30pKTtcbmV4cG9ydHMuZGVmYXVsdCA9IFJBTDtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuRW1pdHRlciA9IGV4cG9ydHMuRXZlbnQgPSB2b2lkIDA7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbnZhciBFdmVudDtcbihmdW5jdGlvbiAoRXZlbnQpIHtcbiAgICBjb25zdCBfZGlzcG9zYWJsZSA9IHsgZGlzcG9zZSgpIHsgfSB9O1xuICAgIEV2ZW50Lk5vbmUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBfZGlzcG9zYWJsZTsgfTtcbn0pKEV2ZW50IHx8IChleHBvcnRzLkV2ZW50ID0gRXZlbnQgPSB7fSkpO1xuY2xhc3MgQ2FsbGJhY2tMaXN0IHtcbiAgICBhZGQoY2FsbGJhY2ssIGNvbnRleHQgPSBudWxsLCBidWNrZXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fY29udGV4dHMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgICAgIHRoaXMuX2NvbnRleHRzLnB1c2goY29udGV4dCk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGJ1Y2tldCkpIHtcbiAgICAgICAgICAgIGJ1Y2tldC5wdXNoKHsgZGlzcG9zZTogKCkgPT4gdGhpcy5yZW1vdmUoY2FsbGJhY2ssIGNvbnRleHQpIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlbW92ZShjYWxsYmFjaywgY29udGV4dCA9IG51bGwpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZm91bmRDYWxsYmFja1dpdGhEaWZmZXJlbnRDb250ZXh0ID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLl9jYWxsYmFja3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jYWxsYmFja3NbaV0gPT09IGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NvbnRleHRzW2ldID09PSBjb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrICYgY29udGV4dCBtYXRjaCA9PiByZW1vdmUgaXRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29udGV4dHMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZENhbGxiYWNrV2l0aERpZmZlcmVudENvbnRleHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZm91bmRDYWxsYmFja1dpdGhEaWZmZXJlbnRDb250ZXh0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1doZW4gYWRkaW5nIGEgbGlzdGVuZXIgd2l0aCBhIGNvbnRleHQsIHlvdSBzaG91bGQgcmVtb3ZlIGl0IHdpdGggdGhlIHNhbWUgY29udGV4dCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGludm9rZSguLi5hcmdzKSB7XG4gICAgICAgIGlmICghdGhpcy5fY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmV0ID0gW10sIGNhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcy5zbGljZSgwKSwgY29udGV4dHMgPSB0aGlzLl9jb250ZXh0cy5zbGljZSgwKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXQucHVzaChjYWxsYmFja3NbaV0uYXBwbHkoY29udGV4dHNbaV0sIGFyZ3MpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS5jb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICAgIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5fY2FsbGJhY2tzIHx8IHRoaXMuX2NhbGxiYWNrcy5sZW5ndGggPT09IDA7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fY29udGV4dHMgPSB1bmRlZmluZWQ7XG4gICAgfVxufVxuY2xhc3MgRW1pdHRlciB7XG4gICAgY29uc3RydWN0b3IoX29wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IF9vcHRpb25zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGb3IgdGhlIHB1YmxpYyB0byBhbGxvdyB0byBzdWJzY3JpYmVcbiAgICAgKiB0byBldmVudHMgZnJvbSB0aGlzIEVtaXR0ZXJcbiAgICAgKi9cbiAgICBnZXQgZXZlbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fZXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50ID0gKGxpc3RlbmVyLCB0aGlzQXJncywgZGlzcG9zYWJsZXMpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2NhbGxiYWNrcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWxsYmFja3MgPSBuZXcgQ2FsbGJhY2tMaXN0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMub25GaXJzdExpc3RlbmVyQWRkICYmIHRoaXMuX2NhbGxiYWNrcy5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy5vbkZpcnN0TGlzdGVuZXJBZGQodGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5hZGQobGlzdGVuZXIsIHRoaXNBcmdzKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlzcG9zYWJsZSBpcyBkaXNwb3NlZCBhZnRlciBlbWl0dGVyIGlzIGRpc3Bvc2VkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5yZW1vdmUobGlzdGVuZXIsIHRoaXNBcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5kaXNwb3NlID0gRW1pdHRlci5fbm9vcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMub25MYXN0TGlzdGVuZXJSZW1vdmUgJiYgdGhpcy5fY2FsbGJhY2tzLmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29wdGlvbnMub25MYXN0TGlzdGVuZXJSZW1vdmUodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRpc3Bvc2FibGVzKSkge1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlcy5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9ldmVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVG8gYmUga2VwdCBwcml2YXRlIHRvIGZpcmUgYW4gZXZlbnQgdG9cbiAgICAgKiBzdWJzY3JpYmVyc1xuICAgICAqL1xuICAgIGZpcmUoZXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NhbGxiYWNrcykge1xuICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzLmludm9rZS5jYWxsKHRoaXMuX2NhbGxiYWNrcywgZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5kaXNwb3NlKCk7XG4gICAgICAgICAgICB0aGlzLl9jYWxsYmFja3MgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLkVtaXR0ZXIgPSBFbWl0dGVyO1xuRW1pdHRlci5fbm9vcCA9IGZ1bmN0aW9uICgpIHsgfTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uVG9rZW4gPSB2b2lkIDA7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbmNvbnN0IElzID0gcmVxdWlyZShcIi4vaXNcIik7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCIuL2V2ZW50c1wiKTtcbnZhciBDYW5jZWxsYXRpb25Ub2tlbjtcbihmdW5jdGlvbiAoQ2FuY2VsbGF0aW9uVG9rZW4pIHtcbiAgICBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGlzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkOiBmYWxzZSxcbiAgICAgICAgb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6IGV2ZW50c18xLkV2ZW50Lk5vbmVcbiAgICB9KTtcbiAgICBDYW5jZWxsYXRpb25Ub2tlbi5DYW5jZWxsZWQgPSBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6IHRydWUsXG4gICAgICAgIG9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkOiBldmVudHNfMS5FdmVudC5Ob25lXG4gICAgfSk7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgKGNhbmRpZGF0ZSA9PT0gQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZVxuICAgICAgICAgICAgfHwgY2FuZGlkYXRlID09PSBDYW5jZWxsYXRpb25Ub2tlbi5DYW5jZWxsZWRcbiAgICAgICAgICAgIHx8IChJcy5ib29sZWFuKGNhbmRpZGF0ZS5pc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkgJiYgISFjYW5kaWRhdGUub25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQpKTtcbiAgICB9XG4gICAgQ2FuY2VsbGF0aW9uVG9rZW4uaXMgPSBpcztcbn0pKENhbmNlbGxhdGlvblRva2VuIHx8IChleHBvcnRzLkNhbmNlbGxhdGlvblRva2VuID0gQ2FuY2VsbGF0aW9uVG9rZW4gPSB7fSkpO1xuY29uc3Qgc2hvcnRjdXRFdmVudCA9IE9iamVjdC5mcmVlemUoZnVuY3Rpb24gKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgY29uc3QgaGFuZGxlID0gKDAsIHJhbF8xLmRlZmF1bHQpKCkudGltZXIuc2V0VGltZW91dChjYWxsYmFjay5iaW5kKGNvbnRleHQpLCAwKTtcbiAgICByZXR1cm4geyBkaXNwb3NlKCkgeyBoYW5kbGUuZGlzcG9zZSgpOyB9IH07XG59KTtcbmNsYXNzIE11dGFibGVUb2tlbiB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX2lzQ2FuY2VsbGVkID0gZmFsc2U7XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9pc0NhbmNlbGxlZCkge1xuICAgICAgICAgICAgdGhpcy5faXNDYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2VtaXR0ZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmZpcmUodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0NhbmNlbGxlZDtcbiAgICB9XG4gICAgZ2V0IG9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKCkge1xuICAgICAgICBpZiAodGhpcy5faXNDYW5jZWxsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBzaG9ydGN1dEV2ZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5fZW1pdHRlcikge1xuICAgICAgICAgICAgdGhpcy5fZW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2VtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLl9lbWl0dGVyKSB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5jbGFzcyBDYW5jZWxsYXRpb25Ub2tlblNvdXJjZSB7XG4gICAgZ2V0IHRva2VuKCkge1xuICAgICAgICBpZiAoIXRoaXMuX3Rva2VuKSB7XG4gICAgICAgICAgICAvLyBiZSBsYXp5IGFuZCBjcmVhdGUgdGhlIHRva2VuIG9ubHkgd2hlblxuICAgICAgICAgICAgLy8gYWN0dWFsbHkgbmVlZGVkXG4gICAgICAgICAgICB0aGlzLl90b2tlbiA9IG5ldyBNdXRhYmxlVG9rZW4oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fdG9rZW47XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl90b2tlbikge1xuICAgICAgICAgICAgLy8gc2F2ZSBhbiBvYmplY3QgYnkgcmV0dXJuaW5nIHRoZSBkZWZhdWx0XG4gICAgICAgICAgICAvLyBjYW5jZWxsZWQgdG9rZW4gd2hlbiBjYW5jZWxsYXRpb24gaGFwcGVuc1xuICAgICAgICAgICAgLy8gYmVmb3JlIHNvbWVvbmUgYXNrcyBmb3IgdGhlIHRva2VuXG4gICAgICAgICAgICB0aGlzLl90b2tlbiA9IENhbmNlbGxhdGlvblRva2VuLkNhbmNlbGxlZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3Rva2VuLmNhbmNlbCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICghdGhpcy5fdG9rZW4pIHtcbiAgICAgICAgICAgIC8vIGVuc3VyZSB0byBpbml0aWFsaXplIHdpdGggYW4gZW1wdHkgdG9rZW4gaWYgd2UgaGFkIG5vbmVcbiAgICAgICAgICAgIHRoaXMuX3Rva2VuID0gQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLl90b2tlbiBpbnN0YW5jZW9mIE11dGFibGVUb2tlbikge1xuICAgICAgICAgICAgLy8gYWN0dWFsbHkgZGlzcG9zZVxuICAgICAgICAgICAgdGhpcy5fdG9rZW4uZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IENhbmNlbGxhdGlvblRva2VuU291cmNlO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3kgPSB2b2lkIDA7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbnZhciBDYW5jZWxsYXRpb25TdGF0ZTtcbihmdW5jdGlvbiAoQ2FuY2VsbGF0aW9uU3RhdGUpIHtcbiAgICBDYW5jZWxsYXRpb25TdGF0ZS5Db250aW51ZSA9IDA7XG4gICAgQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkID0gMTtcbn0pKENhbmNlbGxhdGlvblN0YXRlIHx8IChDYW5jZWxsYXRpb25TdGF0ZSA9IHt9KSk7XG5jbGFzcyBTaGFyZWRBcnJheVNlbmRlclN0cmF0ZWd5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5idWZmZXJzID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICBlbmFibGVDYW5jZWxsYXRpb24ocmVxdWVzdCkge1xuICAgICAgICBpZiAocmVxdWVzdC5pZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBTaGFyZWRBcnJheUJ1ZmZlcig0KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBJbnQzMkFycmF5KGJ1ZmZlciwgMCwgMSk7XG4gICAgICAgIGRhdGFbMF0gPSBDYW5jZWxsYXRpb25TdGF0ZS5Db250aW51ZTtcbiAgICAgICAgdGhpcy5idWZmZXJzLnNldChyZXF1ZXN0LmlkLCBidWZmZXIpO1xuICAgICAgICByZXF1ZXN0LiRjYW5jZWxsYXRpb25EYXRhID0gYnVmZmVyO1xuICAgIH1cbiAgICBhc3luYyBzZW5kQ2FuY2VsbGF0aW9uKF9jb25uLCBpZCkge1xuICAgICAgICBjb25zdCBidWZmZXIgPSB0aGlzLmJ1ZmZlcnMuZ2V0KGlkKTtcbiAgICAgICAgaWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBJbnQzMkFycmF5KGJ1ZmZlciwgMCwgMSk7XG4gICAgICAgIEF0b21pY3Muc3RvcmUoZGF0YSwgMCwgQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkKTtcbiAgICB9XG4gICAgY2xlYW51cChpZCkge1xuICAgICAgICB0aGlzLmJ1ZmZlcnMuZGVsZXRlKGlkKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy5idWZmZXJzLmNsZWFyKCk7XG4gICAgfVxufVxuZXhwb3J0cy5TaGFyZWRBcnJheVNlbmRlclN0cmF0ZWd5ID0gU2hhcmVkQXJyYXlTZW5kZXJTdHJhdGVneTtcbmNsYXNzIFNoYXJlZEFycmF5QnVmZmVyQ2FuY2VsbGF0aW9uVG9rZW4ge1xuICAgIGNvbnN0cnVjdG9yKGJ1ZmZlcikge1xuICAgICAgICB0aGlzLmRhdGEgPSBuZXcgSW50MzJBcnJheShidWZmZXIsIDAsIDEpO1xuICAgIH1cbiAgICBnZXQgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHJldHVybiBBdG9taWNzLmxvYWQodGhpcy5kYXRhLCAwKSA9PT0gQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkO1xuICAgIH1cbiAgICBnZXQgb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuY2VsbGF0aW9uIG92ZXIgU2hhcmVkQXJyYXlCdWZmZXIgZG9lc24ndCBzdXBwb3J0IGNhbmNlbGxhdGlvbiBldmVudHNgKTtcbiAgICB9XG59XG5jbGFzcyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuU291cmNlIHtcbiAgICBjb25zdHJ1Y3RvcihidWZmZXIpIHtcbiAgICAgICAgdGhpcy50b2tlbiA9IG5ldyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuKGJ1ZmZlcik7XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICB9XG59XG5jbGFzcyBTaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmtpbmQgPSAncmVxdWVzdCc7XG4gICAgfVxuICAgIGNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKHJlcXVlc3QpIHtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gcmVxdWVzdC4kY2FuY2VsbGF0aW9uRGF0YTtcbiAgICAgICAgaWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuU291cmNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuU291cmNlKGJ1ZmZlcik7XG4gICAgfVxufVxuZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBTaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3k7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNlbWFwaG9yZSA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY2xhc3MgU2VtYXBob3JlIHtcbiAgICBjb25zdHJ1Y3RvcihjYXBhY2l0eSA9IDEpIHtcbiAgICAgICAgaWYgKGNhcGFjaXR5IDw9IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FwYWNpdHkgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NhcGFjaXR5ID0gY2FwYWNpdHk7XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IDA7XG4gICAgICAgIHRoaXMuX3dhaXRpbmcgPSBbXTtcbiAgICB9XG4gICAgbG9jayh0aHVuaykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fd2FpdGluZy5wdXNoKHsgdGh1bmssIHJlc29sdmUsIHJlamVjdCB9KTtcbiAgICAgICAgICAgIHRoaXMucnVuTmV4dCgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0IGFjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTtcbiAgICB9XG4gICAgcnVuTmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dhaXRpbmcubGVuZ3RoID09PSAwIHx8IHRoaXMuX2FjdGl2ZSA9PT0gdGhpcy5fY2FwYWNpdHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS50aW1lci5zZXRJbW1lZGlhdGUoKCkgPT4gdGhpcy5kb1J1bk5leHQoKSk7XG4gICAgfVxuICAgIGRvUnVuTmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dhaXRpbmcubGVuZ3RoID09PSAwIHx8IHRoaXMuX2FjdGl2ZSA9PT0gdGhpcy5fY2FwYWNpdHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5fd2FpdGluZy5zaGlmdCgpO1xuICAgICAgICB0aGlzLl9hY3RpdmUrKztcbiAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZSA+IHRoaXMuX2NhcGFjaXR5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRvIG1hbnkgdGh1bmtzIGFjdGl2ZWApO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXh0LnRodW5rKCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC50aGVuKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5yZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5OZXh0KCk7XG4gICAgICAgICAgICAgICAgfSwgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5yZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5OZXh0KCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICBuZXh0LnJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1bk5leHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgIG5leHQucmVqZWN0KGVycik7XG4gICAgICAgICAgICB0aGlzLnJ1bk5leHQoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuU2VtYXBob3JlID0gU2VtYXBob3JlO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXIgPSBleHBvcnRzLkFic3RyYWN0TWVzc2FnZVJlYWRlciA9IGV4cG9ydHMuTWVzc2FnZVJlYWRlciA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IGV2ZW50c18xID0gcmVxdWlyZShcIi4vZXZlbnRzXCIpO1xuY29uc3Qgc2VtYXBob3JlXzEgPSByZXF1aXJlKFwiLi9zZW1hcGhvcmVcIik7XG52YXIgTWVzc2FnZVJlYWRlcjtcbihmdW5jdGlvbiAoTWVzc2FnZVJlYWRlcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5saXN0ZW4pICYmIElzLmZ1bmMoY2FuZGlkYXRlLmRpc3Bvc2UpICYmXG4gICAgICAgICAgICBJcy5mdW5jKGNhbmRpZGF0ZS5vbkVycm9yKSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5vbkNsb3NlKSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5vblBhcnRpYWxNZXNzYWdlKTtcbiAgICB9XG4gICAgTWVzc2FnZVJlYWRlci5pcyA9IGlzO1xufSkoTWVzc2FnZVJlYWRlciB8fCAoZXhwb3J0cy5NZXNzYWdlUmVhZGVyID0gTWVzc2FnZVJlYWRlciA9IHt9KSk7XG5jbGFzcyBBYnN0cmFjdE1lc3NhZ2VSZWFkZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZUVtaXR0ZXIgPSBuZXcgZXZlbnRzXzEuRW1pdHRlcigpO1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlci5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgZ2V0IG9uRXJyb3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVycm9yRW1pdHRlci5ldmVudDtcbiAgICB9XG4gICAgZmlyZUVycm9yKGVycm9yKSB7XG4gICAgICAgIHRoaXMuZXJyb3JFbWl0dGVyLmZpcmUodGhpcy5hc0Vycm9yKGVycm9yKSk7XG4gICAgfVxuICAgIGdldCBvbkNsb3NlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9zZUVtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGZpcmVDbG9zZSgpIHtcbiAgICAgICAgdGhpcy5jbG9zZUVtaXR0ZXIuZmlyZSh1bmRlZmluZWQpO1xuICAgIH1cbiAgICBnZXQgb25QYXJ0aWFsTWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFydGlhbE1lc3NhZ2VFbWl0dGVyLmV2ZW50O1xuICAgIH1cbiAgICBmaXJlUGFydGlhbE1lc3NhZ2UoaW5mbykge1xuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlRW1pdHRlci5maXJlKGluZm8pO1xuICAgIH1cbiAgICBhc0Vycm9yKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKGBSZWFkZXIgcmVjZWl2ZWQgZXJyb3IuIFJlYXNvbjogJHtJcy5zdHJpbmcoZXJyb3IubWVzc2FnZSkgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24nfWApO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VSZWFkZXIgPSBBYnN0cmFjdE1lc3NhZ2VSZWFkZXI7XG52YXIgUmVzb2x2ZWRNZXNzYWdlUmVhZGVyT3B0aW9ucztcbihmdW5jdGlvbiAoUmVzb2x2ZWRNZXNzYWdlUmVhZGVyT3B0aW9ucykge1xuICAgIGZ1bmN0aW9uIGZyb21PcHRpb25zKG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IGNoYXJzZXQ7XG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIGxldCBjb250ZW50RGVjb2RlcjtcbiAgICAgICAgY29uc3QgY29udGVudERlY29kZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICBsZXQgY29udGVudFR5cGVEZWNvZGVyO1xuICAgICAgICBjb25zdCBjb250ZW50VHlwZURlY29kZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY2hhcnNldCA9IG9wdGlvbnMgPz8gJ3V0Zi04JztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNoYXJzZXQgPSBvcHRpb25zLmNoYXJzZXQgPz8gJ3V0Zi04JztcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnREZWNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50RGVjb2RlciA9IG9wdGlvbnMuY29udGVudERlY29kZXI7XG4gICAgICAgICAgICAgICAgY29udGVudERlY29kZXJzLnNldChjb250ZW50RGVjb2Rlci5uYW1lLCBjb250ZW50RGVjb2Rlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5jb250ZW50RGVjb2RlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGVjb2RlciBvZiBvcHRpb25zLmNvbnRlbnREZWNvZGVycykge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50RGVjb2RlcnMuc2V0KGRlY29kZXIubmFtZSwgZGVjb2Rlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuY29udGVudFR5cGVEZWNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXIgPSBvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcjtcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXJzLnNldChjb250ZW50VHlwZURlY29kZXIubmFtZSwgY29udGVudFR5cGVEZWNvZGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGVjb2RlciBvZiBvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGVEZWNvZGVycy5zZXQoZGVjb2Rlci5uYW1lLCBkZWNvZGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnRlbnRUeXBlRGVjb2RlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXIgPSAoMCwgcmFsXzEuZGVmYXVsdCkoKS5hcHBsaWNhdGlvbkpzb24uZGVjb2RlcjtcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlRGVjb2RlcnMuc2V0KGNvbnRlbnRUeXBlRGVjb2Rlci5uYW1lLCBjb250ZW50VHlwZURlY29kZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGNoYXJzZXQsIGNvbnRlbnREZWNvZGVyLCBjb250ZW50RGVjb2RlcnMsIGNvbnRlbnRUeXBlRGVjb2RlciwgY29udGVudFR5cGVEZWNvZGVycyB9O1xuICAgIH1cbiAgICBSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zLmZyb21PcHRpb25zID0gZnJvbU9wdGlvbnM7XG59KShSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zIHx8IChSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zID0ge30pKTtcbmNsYXNzIFJlYWRhYmxlU3RyZWFtTWVzc2FnZVJlYWRlciBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVJlYWRlciB7XG4gICAgY29uc3RydWN0b3IocmVhZGFibGUsIG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZSA9IHJlYWRhYmxlO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zLmZyb21PcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmJ1ZmZlciA9ICgwLCByYWxfMS5kZWZhdWx0KSgpLm1lc3NhZ2VCdWZmZXIuY3JlYXRlKHRoaXMub3B0aW9ucy5jaGFyc2V0KTtcbiAgICAgICAgdGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0ID0gMTAwMDA7XG4gICAgICAgIHRoaXMubmV4dE1lc3NhZ2VMZW5ndGggPSAtMTtcbiAgICAgICAgdGhpcy5tZXNzYWdlVG9rZW4gPSAwO1xuICAgICAgICB0aGlzLnJlYWRTZW1hcGhvcmUgPSBuZXcgc2VtYXBob3JlXzEuU2VtYXBob3JlKDEpO1xuICAgIH1cbiAgICBzZXQgcGFydGlhbE1lc3NhZ2VUaW1lb3V0KHRpbWVvdXQpIHtcbiAgICAgICAgdGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0ID0gdGltZW91dDtcbiAgICB9XG4gICAgZ2V0IHBhcnRpYWxNZXNzYWdlVGltZW91dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dDtcbiAgICB9XG4gICAgbGlzdGVuKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMubmV4dE1lc3NhZ2VMZW5ndGggPSAtMTtcbiAgICAgICAgdGhpcy5tZXNzYWdlVG9rZW4gPSAwO1xuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlVGltZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5yZWFkYWJsZS5vbkRhdGEoKGRhdGEpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25EYXRhKGRhdGEpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZS5vbkVycm9yKChlcnJvcikgPT4gdGhpcy5maXJlRXJyb3IoZXJyb3IpKTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZS5vbkNsb3NlKCgpID0+IHRoaXMuZmlyZUNsb3NlKCkpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBvbkRhdGEoZGF0YSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5idWZmZXIuYXBwZW5kKGRhdGEpO1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IHRoaXMuYnVmZmVyLnRyeVJlYWRIZWFkZXJzKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50TGVuZ3RoID0gaGVhZGVycy5nZXQoJ2NvbnRlbnQtbGVuZ3RoJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY29udGVudExlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IobmV3IEVycm9yKGBIZWFkZXIgbXVzdCBwcm92aWRlIGEgQ29udGVudC1MZW5ndGggcHJvcGVydHkuXFxuJHtKU09OLnN0cmluZ2lmeShPYmplY3QuZnJvbUVudHJpZXMoaGVhZGVycykpfWApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsZW5ndGggPSBwYXJzZUludChjb250ZW50TGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKGxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKG5ldyBFcnJvcihgQ29udGVudC1MZW5ndGggdmFsdWUgbXVzdCBiZSBhIG51bWJlci4gR290ICR7Y29udGVudExlbmd0aH1gKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IHRoaXMuYnVmZmVyLnRyeVJlYWRCb2R5KHRoaXMubmV4dE1lc3NhZ2VMZW5ndGgpO1xuICAgICAgICAgICAgICAgIGlmIChib2R5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLyoqIFdlIGhhdmVuJ3QgcmVjZWl2ZWQgdGhlIGZ1bGwgbWVzc2FnZSB5ZXQuICovXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0UGFydGlhbE1lc3NhZ2VUaW1lcigpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJQYXJ0aWFsTWVzc2FnZVRpbWVyKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9IC0xO1xuICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHdlIGNvbnZlcnQgb25lIHJlY2VpdmVkIG1lc3NhZ2UgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAgICAgLy8gb3RoZXIuIE90aGVyd2lzZSBpdCBjb3VsZCBoYXBwZW4gdGhhdCBhIGRlY29kaW5nIG9mIGEgc2Vjb25kXG4gICAgICAgICAgICAgICAgLy8gc21hbGxlciBtZXNzYWdlIGZpbmlzaGVkIGJlZm9yZSB0aGUgZGVjb2Rpbmcgb2YgYSBmaXJzdCBsYXJnZXJcbiAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIGFuZCB0aGVuIHdlIHdvdWxkIGRlbGl2ZXIgdGhlIHNlY29uZCBtZXNzYWdlIGZpcnN0LlxuICAgICAgICAgICAgICAgIHRoaXMucmVhZFNlbWFwaG9yZS5sb2NrKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnl0ZXMgPSB0aGlzLm9wdGlvbnMuY29udGVudERlY29kZXIgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBhd2FpdCB0aGlzLm9wdGlvbnMuY29udGVudERlY29kZXIuZGVjb2RlKGJvZHkpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGJvZHk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBhd2FpdCB0aGlzLm9wdGlvbnMuY29udGVudFR5cGVEZWNvZGVyLmRlY29kZShieXRlcywgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjayhtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNsZWFyUGFydGlhbE1lc3NhZ2VUaW1lcigpIHtcbiAgICAgICAgaWYgKHRoaXMucGFydGlhbE1lc3NhZ2VUaW1lcikge1xuICAgICAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZVRpbWVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRoaXMucGFydGlhbE1lc3NhZ2VUaW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRQYXJ0aWFsTWVzc2FnZVRpbWVyKCkge1xuICAgICAgICB0aGlzLmNsZWFyUGFydGlhbE1lc3NhZ2VUaW1lcigpO1xuICAgICAgICBpZiAodGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0IDw9IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlVGltZXIgPSAoMCwgcmFsXzEuZGVmYXVsdCkoKS50aW1lci5zZXRUaW1lb3V0KCh0b2tlbiwgdGltZW91dCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZVRpbWVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRva2VuID09PSB0aGlzLm1lc3NhZ2VUb2tlbikge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZVBhcnRpYWxNZXNzYWdlKHsgbWVzc2FnZVRva2VuOiB0b2tlbiwgd2FpdGluZ1RpbWU6IHRpbWVvdXQgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRQYXJ0aWFsTWVzc2FnZVRpbWVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dCwgdGhpcy5tZXNzYWdlVG9rZW4sIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dCk7XG4gICAgfVxufVxuZXhwb3J0cy5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXIgPSBSZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLldyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLkFic3RyYWN0TWVzc2FnZVdyaXRlciA9IGV4cG9ydHMuTWVzc2FnZVdyaXRlciA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IHNlbWFwaG9yZV8xID0gcmVxdWlyZShcIi4vc2VtYXBob3JlXCIpO1xuY29uc3QgZXZlbnRzXzEgPSByZXF1aXJlKFwiLi9ldmVudHNcIik7XG5jb25zdCBDb250ZW50TGVuZ3RoID0gJ0NvbnRlbnQtTGVuZ3RoOiAnO1xuY29uc3QgQ1JMRiA9ICdcXHJcXG4nO1xudmFyIE1lc3NhZ2VXcml0ZXI7XG4oZnVuY3Rpb24gKE1lc3NhZ2VXcml0ZXIpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgSXMuZnVuYyhjYW5kaWRhdGUuZGlzcG9zZSkgJiYgSXMuZnVuYyhjYW5kaWRhdGUub25DbG9zZSkgJiZcbiAgICAgICAgICAgIElzLmZ1bmMoY2FuZGlkYXRlLm9uRXJyb3IpICYmIElzLmZ1bmMoY2FuZGlkYXRlLndyaXRlKTtcbiAgICB9XG4gICAgTWVzc2FnZVdyaXRlci5pcyA9IGlzO1xufSkoTWVzc2FnZVdyaXRlciB8fCAoZXhwb3J0cy5NZXNzYWdlV3JpdGVyID0gTWVzc2FnZVdyaXRlciA9IHt9KSk7XG5jbGFzcyBBYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy5lcnJvckVtaXR0ZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLmNsb3NlRW1pdHRlci5kaXNwb3NlKCk7XG4gICAgfVxuICAgIGdldCBvbkVycm9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lcnJvckVtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGZpcmVFcnJvcihlcnJvciwgbWVzc2FnZSwgY291bnQpIHtcbiAgICAgICAgdGhpcy5lcnJvckVtaXR0ZXIuZmlyZShbdGhpcy5hc0Vycm9yKGVycm9yKSwgbWVzc2FnZSwgY291bnRdKTtcbiAgICB9XG4gICAgZ2V0IG9uQ2xvc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb3NlRW1pdHRlci5ldmVudDtcbiAgICB9XG4gICAgZmlyZUNsb3NlKCkge1xuICAgICAgICB0aGlzLmNsb3NlRW1pdHRlci5maXJlKHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIGFzRXJyb3IoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoYFdyaXRlciByZWNlaXZlZCBlcnJvci4gUmVhc29uOiAke0lzLnN0cmluZyhlcnJvci5tZXNzYWdlKSA/IGVycm9yLm1lc3NhZ2UgOiAndW5rbm93bid9YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLkFic3RyYWN0TWVzc2FnZVdyaXRlciA9IEFic3RyYWN0TWVzc2FnZVdyaXRlcjtcbnZhciBSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zO1xuKGZ1bmN0aW9uIChSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zKSB7XG4gICAgZnVuY3Rpb24gZnJvbU9wdGlvbnMob3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHsgY2hhcnNldDogb3B0aW9ucyA/PyAndXRmLTgnLCBjb250ZW50VHlwZUVuY29kZXI6ICgwLCByYWxfMS5kZWZhdWx0KSgpLmFwcGxpY2F0aW9uSnNvbi5lbmNvZGVyIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4geyBjaGFyc2V0OiBvcHRpb25zLmNoYXJzZXQgPz8gJ3V0Zi04JywgY29udGVudEVuY29kZXI6IG9wdGlvbnMuY29udGVudEVuY29kZXIsIGNvbnRlbnRUeXBlRW5jb2Rlcjogb3B0aW9ucy5jb250ZW50VHlwZUVuY29kZXIgPz8gKDAsIHJhbF8xLmRlZmF1bHQpKCkuYXBwbGljYXRpb25Kc29uLmVuY29kZXIgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zLmZyb21PcHRpb25zID0gZnJvbU9wdGlvbnM7XG59KShSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zIHx8IChSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zID0ge30pKTtcbmNsYXNzIFdyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKHdyaXRhYmxlLCBvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMud3JpdGFibGUgPSB3cml0YWJsZTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gUmVzb2x2ZWRNZXNzYWdlV3JpdGVyT3B0aW9ucy5mcm9tT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50ID0gMDtcbiAgICAgICAgdGhpcy53cml0ZVNlbWFwaG9yZSA9IG5ldyBzZW1hcGhvcmVfMS5TZW1hcGhvcmUoMSk7XG4gICAgICAgIHRoaXMud3JpdGFibGUub25FcnJvcigoZXJyb3IpID0+IHRoaXMuZmlyZUVycm9yKGVycm9yKSk7XG4gICAgICAgIHRoaXMud3JpdGFibGUub25DbG9zZSgoKSA9PiB0aGlzLmZpcmVDbG9zZSgpKTtcbiAgICB9XG4gICAgYXN5bmMgd3JpdGUobXNnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndyaXRlU2VtYXBob3JlLmxvY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHRoaXMub3B0aW9ucy5jb250ZW50VHlwZUVuY29kZXIuZW5jb2RlKG1zZywgdGhpcy5vcHRpb25zKS50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNvbnRlbnRFbmNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jb250ZW50RW5jb2Rlci5lbmNvZGUoYnVmZmVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZC50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJzID0gW107XG4gICAgICAgICAgICAgICAgaGVhZGVycy5wdXNoKENvbnRlbnRMZW5ndGgsIGJ1ZmZlci5ieXRlTGVuZ3RoLnRvU3RyaW5nKCksIENSTEYpO1xuICAgICAgICAgICAgICAgIGhlYWRlcnMucHVzaChDUkxGKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kb1dyaXRlKG1zZywgaGVhZGVycywgYnVmZmVyKTtcbiAgICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgZG9Xcml0ZShtc2csIGhlYWRlcnMsIGRhdGEpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMud3JpdGFibGUud3JpdGUoaGVhZGVycy5qb2luKCcnKSwgJ2FzY2lpJyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy53cml0YWJsZS53cml0ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IsIG1zZyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZUVycm9yKGVycm9yLCBtc2cpIHtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50Kys7XG4gICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yLCBtc2csIHRoaXMuZXJyb3JDb3VudCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICAgICAgdGhpcy53cml0YWJsZS5lbmQoKTtcbiAgICB9XG59XG5leHBvcnRzLldyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgPSBXcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkFic3RyYWN0TWVzc2FnZUJ1ZmZlciA9IHZvaWQgMDtcbmNvbnN0IENSID0gMTM7XG5jb25zdCBMRiA9IDEwO1xuY29uc3QgQ1JMRiA9ICdcXHJcXG4nO1xuY2xhc3MgQWJzdHJhY3RNZXNzYWdlQnVmZmVyIHtcbiAgICBjb25zdHJ1Y3RvcihlbmNvZGluZyA9ICd1dGYtOCcpIHtcbiAgICAgICAgdGhpcy5fZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgICAgICAgdGhpcy5fY2h1bmtzID0gW107XG4gICAgICAgIHRoaXMuX3RvdGFsTGVuZ3RoID0gMDtcbiAgICB9XG4gICAgZ2V0IGVuY29kaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW5jb2Rpbmc7XG4gICAgfVxuICAgIGFwcGVuZChjaHVuaykge1xuICAgICAgICBjb25zdCB0b0FwcGVuZCA9IHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZycgPyB0aGlzLmZyb21TdHJpbmcoY2h1bmssIHRoaXMuX2VuY29kaW5nKSA6IGNodW5rO1xuICAgICAgICB0aGlzLl9jaHVua3MucHVzaCh0b0FwcGVuZCk7XG4gICAgICAgIHRoaXMuX3RvdGFsTGVuZ3RoICs9IHRvQXBwZW5kLmJ5dGVMZW5ndGg7XG4gICAgfVxuICAgIHRyeVJlYWRIZWFkZXJzKGxvd2VyQ2FzZUtleXMgPSBmYWxzZSkge1xuICAgICAgICBpZiAodGhpcy5fY2h1bmtzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3RhdGUgPSAwO1xuICAgICAgICBsZXQgY2h1bmtJbmRleCA9IDA7XG4gICAgICAgIGxldCBvZmZzZXQgPSAwO1xuICAgICAgICBsZXQgY2h1bmtCeXRlc1JlYWQgPSAwO1xuICAgICAgICByb3c6IHdoaWxlIChjaHVua0luZGV4IDwgdGhpcy5fY2h1bmtzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgY2h1bmsgPSB0aGlzLl9jaHVua3NbY2h1bmtJbmRleF07XG4gICAgICAgICAgICBvZmZzZXQgPSAwO1xuICAgICAgICAgICAgY29sdW1uOiB3aGlsZSAob2Zmc2V0IDwgY2h1bmsubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjaHVua1tvZmZzZXRdO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDUjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIExGOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gNDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHJvdztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjaHVua0J5dGVzUmVhZCArPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgY2h1bmtJbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZSAhPT0gNCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgYnVmZmVyIGNvbnRhaW5zIHRoZSB0d28gQ1JMRiBhdCB0aGUgZW5kLiBTbyB3ZSB3aWxsXG4gICAgICAgIC8vIGhhdmUgdHdvIGVtcHR5IGxpbmVzIGFmdGVyIHRoZSBzcGxpdCBhdCB0aGUgZW5kIGFzIHdlbGwuXG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuX3JlYWQoY2h1bmtCeXRlc1JlYWQgKyBvZmZzZXQpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwKCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLnRvU3RyaW5nKGJ1ZmZlciwgJ2FzY2lpJykuc3BsaXQoQ1JMRik7XG4gICAgICAgIGlmIChoZWFkZXJzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXJzLmxlbmd0aCAtIDI7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaGVhZGVyID0gaGVhZGVyc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gaGVhZGVyLmluZGV4T2YoJzonKTtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1lc3NhZ2UgaGVhZGVyIG11c3Qgc2VwYXJhdGUga2V5IGFuZCB2YWx1ZSB1c2luZyAnOidcXG4ke2hlYWRlcn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGhlYWRlci5zdWJzdHIoMCwgaW5kZXgpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBoZWFkZXIuc3Vic3RyKGluZGV4ICsgMSkudHJpbSgpO1xuICAgICAgICAgICAgcmVzdWx0LnNldChsb3dlckNhc2VLZXlzID8ga2V5LnRvTG93ZXJDYXNlKCkgOiBrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICB0cnlSZWFkQm9keShsZW5ndGgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3RvdGFsTGVuZ3RoIDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkKGxlbmd0aCk7XG4gICAgfVxuICAgIGdldCBudW1iZXJPZkJ5dGVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdG90YWxMZW5ndGg7XG4gICAgfVxuICAgIF9yZWFkKGJ5dGVDb3VudCkge1xuICAgICAgICBpZiAoYnl0ZUNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbXB0eUJ1ZmZlcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChieXRlQ291bnQgPiB0aGlzLl90b3RhbExlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVhZCBzbyBtYW55IGJ5dGVzIWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jaHVua3NbMF0uYnl0ZUxlbmd0aCA9PT0gYnl0ZUNvdW50KSB7XG4gICAgICAgICAgICAvLyBzdXBlciBmYXN0IHBhdGgsIHByZWNpc2VseSBmaXJzdCBjaHVuayBtdXN0IGJlIHJldHVybmVkXG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1swXTtcbiAgICAgICAgICAgIHRoaXMuX2NodW5rcy5zaGlmdCgpO1xuICAgICAgICAgICAgdGhpcy5fdG90YWxMZW5ndGggLT0gYnl0ZUNvdW50O1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXNOYXRpdmUoY2h1bmspO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jaHVua3NbMF0uYnl0ZUxlbmd0aCA+IGJ5dGVDb3VudCkge1xuICAgICAgICAgICAgLy8gZmFzdCBwYXRoLCB0aGUgcmVhZGluZyBpcyBlbnRpcmVseSB3aXRoaW4gdGhlIGZpcnN0IGNodW5rXG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1swXTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuYXNOYXRpdmUoY2h1bmssIGJ5dGVDb3VudCk7XG4gICAgICAgICAgICB0aGlzLl9jaHVua3NbMF0gPSBjaHVuay5zbGljZShieXRlQ291bnQpO1xuICAgICAgICAgICAgdGhpcy5fdG90YWxMZW5ndGggLT0gYnl0ZUNvdW50O1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmFsbG9jTmF0aXZlKGJ5dGVDb3VudCk7XG4gICAgICAgIGxldCByZXN1bHRPZmZzZXQgPSAwO1xuICAgICAgICBsZXQgY2h1bmtJbmRleCA9IDA7XG4gICAgICAgIHdoaWxlIChieXRlQ291bnQgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1tjaHVua0luZGV4XTtcbiAgICAgICAgICAgIGlmIChjaHVuay5ieXRlTGVuZ3RoID4gYnl0ZUNvdW50KSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBjaHVuayB3aWxsIHN1cnZpdmVcbiAgICAgICAgICAgICAgICBjb25zdCBjaHVua1BhcnQgPSBjaHVuay5zbGljZSgwLCBieXRlQ291bnQpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5zZXQoY2h1bmtQYXJ0LCByZXN1bHRPZmZzZXQpO1xuICAgICAgICAgICAgICAgIHJlc3VsdE9mZnNldCArPSBieXRlQ291bnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2h1bmtzW2NodW5rSW5kZXhdID0gY2h1bmsuc2xpY2UoYnl0ZUNvdW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLl90b3RhbExlbmd0aCAtPSBieXRlQ291bnQ7XG4gICAgICAgICAgICAgICAgYnl0ZUNvdW50IC09IGJ5dGVDb3VudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHRoaXMgY2h1bmsgd2lsbCBiZSBlbnRpcmVseSByZWFkXG4gICAgICAgICAgICAgICAgcmVzdWx0LnNldChjaHVuaywgcmVzdWx0T2Zmc2V0KTtcbiAgICAgICAgICAgICAgICByZXN1bHRPZmZzZXQgKz0gY2h1bmsuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgICAgICB0aGlzLl9jaHVua3Muc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl90b3RhbExlbmd0aCAtPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgICAgIGJ5dGVDb3VudCAtPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VCdWZmZXIgPSBBYnN0cmFjdE1lc3NhZ2VCdWZmZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uID0gZXhwb3J0cy5Db25uZWN0aW9uT3B0aW9ucyA9IGV4cG9ydHMuTWVzc2FnZVN0cmF0ZWd5ID0gZXhwb3J0cy5DYW5jZWxsYXRpb25TdHJhdGVneSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gZXhwb3J0cy5JZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IGV4cG9ydHMuQ29ubmVjdGlvbkVycm9yID0gZXhwb3J0cy5Db25uZWN0aW9uRXJyb3JzID0gZXhwb3J0cy5Mb2dUcmFjZU5vdGlmaWNhdGlvbiA9IGV4cG9ydHMuU2V0VHJhY2VOb3RpZmljYXRpb24gPSBleHBvcnRzLlRyYWNlRm9ybWF0ID0gZXhwb3J0cy5UcmFjZVZhbHVlcyA9IGV4cG9ydHMuVHJhY2UgPSBleHBvcnRzLk51bGxMb2dnZXIgPSBleHBvcnRzLlByb2dyZXNzVHlwZSA9IGV4cG9ydHMuUHJvZ3Jlc3NUb2tlbiA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IG1lc3NhZ2VzXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlc1wiKTtcbmNvbnN0IGxpbmtlZE1hcF8xID0gcmVxdWlyZShcIi4vbGlua2VkTWFwXCIpO1xuY29uc3QgZXZlbnRzXzEgPSByZXF1aXJlKFwiLi9ldmVudHNcIik7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbnZhciBDYW5jZWxOb3RpZmljYXRpb247XG4oZnVuY3Rpb24gKENhbmNlbE5vdGlmaWNhdGlvbikge1xuICAgIENhbmNlbE5vdGlmaWNhdGlvbi50eXBlID0gbmV3IG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZSgnJC9jYW5jZWxSZXF1ZXN0Jyk7XG59KShDYW5jZWxOb3RpZmljYXRpb24gfHwgKENhbmNlbE5vdGlmaWNhdGlvbiA9IHt9KSk7XG52YXIgUHJvZ3Jlc3NUb2tlbjtcbihmdW5jdGlvbiAoUHJvZ3Jlc3NUb2tlbikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG4gICAgfVxuICAgIFByb2dyZXNzVG9rZW4uaXMgPSBpcztcbn0pKFByb2dyZXNzVG9rZW4gfHwgKGV4cG9ydHMuUHJvZ3Jlc3NUb2tlbiA9IFByb2dyZXNzVG9rZW4gPSB7fSkpO1xudmFyIFByb2dyZXNzTm90aWZpY2F0aW9uO1xuKGZ1bmN0aW9uIChQcm9ncmVzc05vdGlmaWNhdGlvbikge1xuICAgIFByb2dyZXNzTm90aWZpY2F0aW9uLnR5cGUgPSBuZXcgbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlKCckL3Byb2dyZXNzJyk7XG59KShQcm9ncmVzc05vdGlmaWNhdGlvbiB8fCAoUHJvZ3Jlc3NOb3RpZmljYXRpb24gPSB7fSkpO1xuY2xhc3MgUHJvZ3Jlc3NUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICB9XG59XG5leHBvcnRzLlByb2dyZXNzVHlwZSA9IFByb2dyZXNzVHlwZTtcbnZhciBTdGFyUmVxdWVzdEhhbmRsZXI7XG4oZnVuY3Rpb24gKFN0YXJSZXF1ZXN0SGFuZGxlcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBJcy5mdW5jKHZhbHVlKTtcbiAgICB9XG4gICAgU3RhclJlcXVlc3RIYW5kbGVyLmlzID0gaXM7XG59KShTdGFyUmVxdWVzdEhhbmRsZXIgfHwgKFN0YXJSZXF1ZXN0SGFuZGxlciA9IHt9KSk7XG5leHBvcnRzLk51bGxMb2dnZXIgPSBPYmplY3QuZnJlZXplKHtcbiAgICBlcnJvcjogKCkgPT4geyB9LFxuICAgIHdhcm46ICgpID0+IHsgfSxcbiAgICBpbmZvOiAoKSA9PiB7IH0sXG4gICAgbG9nOiAoKSA9PiB7IH1cbn0pO1xudmFyIFRyYWNlO1xuKGZ1bmN0aW9uIChUcmFjZSkge1xuICAgIFRyYWNlW1RyYWNlW1wiT2ZmXCJdID0gMF0gPSBcIk9mZlwiO1xuICAgIFRyYWNlW1RyYWNlW1wiTWVzc2FnZXNcIl0gPSAxXSA9IFwiTWVzc2FnZXNcIjtcbiAgICBUcmFjZVtUcmFjZVtcIkNvbXBhY3RcIl0gPSAyXSA9IFwiQ29tcGFjdFwiO1xuICAgIFRyYWNlW1RyYWNlW1wiVmVyYm9zZVwiXSA9IDNdID0gXCJWZXJib3NlXCI7XG59KShUcmFjZSB8fCAoZXhwb3J0cy5UcmFjZSA9IFRyYWNlID0ge30pKTtcbnZhciBUcmFjZVZhbHVlcztcbihmdW5jdGlvbiAoVHJhY2VWYWx1ZXMpIHtcbiAgICAvKipcbiAgICAgKiBUdXJuIHRyYWNpbmcgb2ZmLlxuICAgICAqL1xuICAgIFRyYWNlVmFsdWVzLk9mZiA9ICdvZmYnO1xuICAgIC8qKlxuICAgICAqIFRyYWNlIG1lc3NhZ2VzIG9ubHkuXG4gICAgICovXG4gICAgVHJhY2VWYWx1ZXMuTWVzc2FnZXMgPSAnbWVzc2FnZXMnO1xuICAgIC8qKlxuICAgICAqIENvbXBhY3QgbWVzc2FnZSB0cmFjaW5nLlxuICAgICAqL1xuICAgIFRyYWNlVmFsdWVzLkNvbXBhY3QgPSAnY29tcGFjdCc7XG4gICAgLyoqXG4gICAgICogVmVyYm9zZSBtZXNzYWdlIHRyYWNpbmcuXG4gICAgICovXG4gICAgVHJhY2VWYWx1ZXMuVmVyYm9zZSA9ICd2ZXJib3NlJztcbn0pKFRyYWNlVmFsdWVzIHx8IChleHBvcnRzLlRyYWNlVmFsdWVzID0gVHJhY2VWYWx1ZXMgPSB7fSkpO1xuKGZ1bmN0aW9uIChUcmFjZSkge1xuICAgIGZ1bmN0aW9uIGZyb21TdHJpbmcodmFsdWUpIHtcbiAgICAgICAgaWYgKCFJcy5zdHJpbmcodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gVHJhY2UuT2ZmO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSAnb2ZmJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gVHJhY2UuT2ZmO1xuICAgICAgICAgICAgY2FzZSAnbWVzc2FnZXMnOlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5NZXNzYWdlcztcbiAgICAgICAgICAgIGNhc2UgJ2NvbXBhY3QnOlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5Db21wYWN0O1xuICAgICAgICAgICAgY2FzZSAndmVyYm9zZSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFRyYWNlLlZlcmJvc2U7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5PZmY7XG4gICAgICAgIH1cbiAgICB9XG4gICAgVHJhY2UuZnJvbVN0cmluZyA9IGZyb21TdHJpbmc7XG4gICAgZnVuY3Rpb24gdG9TdHJpbmcodmFsdWUpIHtcbiAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5PZmY6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdvZmYnO1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5NZXNzYWdlczpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ21lc3NhZ2VzJztcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuQ29tcGFjdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2NvbXBhY3QnO1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5WZXJib3NlOlxuICAgICAgICAgICAgICAgIHJldHVybiAndmVyYm9zZSc7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAnb2ZmJztcbiAgICAgICAgfVxuICAgIH1cbiAgICBUcmFjZS50b1N0cmluZyA9IHRvU3RyaW5nO1xufSkoVHJhY2UgfHwgKGV4cG9ydHMuVHJhY2UgPSBUcmFjZSA9IHt9KSk7XG52YXIgVHJhY2VGb3JtYXQ7XG4oZnVuY3Rpb24gKFRyYWNlRm9ybWF0KSB7XG4gICAgVHJhY2VGb3JtYXRbXCJUZXh0XCJdID0gXCJ0ZXh0XCI7XG4gICAgVHJhY2VGb3JtYXRbXCJKU09OXCJdID0gXCJqc29uXCI7XG59KShUcmFjZUZvcm1hdCB8fCAoZXhwb3J0cy5UcmFjZUZvcm1hdCA9IFRyYWNlRm9ybWF0ID0ge30pKTtcbihmdW5jdGlvbiAoVHJhY2VGb3JtYXQpIHtcbiAgICBmdW5jdGlvbiBmcm9tU3RyaW5nKHZhbHVlKSB7XG4gICAgICAgIGlmICghSXMuc3RyaW5nKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIFRyYWNlRm9ybWF0LlRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAodmFsdWUgPT09ICdqc29uJykge1xuICAgICAgICAgICAgcmV0dXJuIFRyYWNlRm9ybWF0LkpTT047XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gVHJhY2VGb3JtYXQuVGV4dDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBUcmFjZUZvcm1hdC5mcm9tU3RyaW5nID0gZnJvbVN0cmluZztcbn0pKFRyYWNlRm9ybWF0IHx8IChleHBvcnRzLlRyYWNlRm9ybWF0ID0gVHJhY2VGb3JtYXQgPSB7fSkpO1xudmFyIFNldFRyYWNlTm90aWZpY2F0aW9uO1xuKGZ1bmN0aW9uIChTZXRUcmFjZU5vdGlmaWNhdGlvbikge1xuICAgIFNldFRyYWNlTm90aWZpY2F0aW9uLnR5cGUgPSBuZXcgbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlKCckL3NldFRyYWNlJyk7XG59KShTZXRUcmFjZU5vdGlmaWNhdGlvbiB8fCAoZXhwb3J0cy5TZXRUcmFjZU5vdGlmaWNhdGlvbiA9IFNldFRyYWNlTm90aWZpY2F0aW9uID0ge30pKTtcbnZhciBMb2dUcmFjZU5vdGlmaWNhdGlvbjtcbihmdW5jdGlvbiAoTG9nVHJhY2VOb3RpZmljYXRpb24pIHtcbiAgICBMb2dUcmFjZU5vdGlmaWNhdGlvbi50eXBlID0gbmV3IG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZSgnJC9sb2dUcmFjZScpO1xufSkoTG9nVHJhY2VOb3RpZmljYXRpb24gfHwgKGV4cG9ydHMuTG9nVHJhY2VOb3RpZmljYXRpb24gPSBMb2dUcmFjZU5vdGlmaWNhdGlvbiA9IHt9KSk7XG52YXIgQ29ubmVjdGlvbkVycm9ycztcbihmdW5jdGlvbiAoQ29ubmVjdGlvbkVycm9ycykge1xuICAgIC8qKlxuICAgICAqIFRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZC5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uRXJyb3JzW0Nvbm5lY3Rpb25FcnJvcnNbXCJDbG9zZWRcIl0gPSAxXSA9IFwiQ2xvc2VkXCI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gZ290IGRpc3Bvc2VkLlxuICAgICAqL1xuICAgIENvbm5lY3Rpb25FcnJvcnNbQ29ubmVjdGlvbkVycm9yc1tcIkRpc3Bvc2VkXCJdID0gMl0gPSBcIkRpc3Bvc2VkXCI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBpbiBsaXN0ZW5pbmcgbW9kZS5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uRXJyb3JzW0Nvbm5lY3Rpb25FcnJvcnNbXCJBbHJlYWR5TGlzdGVuaW5nXCJdID0gM10gPSBcIkFscmVhZHlMaXN0ZW5pbmdcIjtcbn0pKENvbm5lY3Rpb25FcnJvcnMgfHwgKGV4cG9ydHMuQ29ubmVjdGlvbkVycm9ycyA9IENvbm5lY3Rpb25FcnJvcnMgPSB7fSkpO1xuY2xhc3MgQ29ubmVjdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNvZGUsIG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBDb25uZWN0aW9uRXJyb3IucHJvdG90eXBlKTtcbiAgICB9XG59XG5leHBvcnRzLkNvbm5lY3Rpb25FcnJvciA9IENvbm5lY3Rpb25FcnJvcjtcbnZhciBDb25uZWN0aW9uU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENvbm5lY3Rpb25TdHJhdGVneSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNhbmNlbFVuZGlzcGF0Y2hlZCk7XG4gICAgfVxuICAgIENvbm5lY3Rpb25TdHJhdGVneS5pcyA9IGlzO1xufSkoQ29ubmVjdGlvblN0cmF0ZWd5IHx8IChleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IENvbm5lY3Rpb25TdHJhdGVneSA9IHt9KSk7XG52YXIgSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5O1xuKGZ1bmN0aW9uIChJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiAoY2FuZGlkYXRlLmtpbmQgPT09IHVuZGVmaW5lZCB8fCBjYW5kaWRhdGUua2luZCA9PT0gJ2lkJykgJiYgSXMuZnVuYyhjYW5kaWRhdGUuY3JlYXRlQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UpICYmIChjYW5kaWRhdGUuZGlzcG9zZSA9PT0gdW5kZWZpbmVkIHx8IElzLmZ1bmMoY2FuZGlkYXRlLmRpc3Bvc2UpKTtcbiAgICB9XG4gICAgSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzID0gaXM7XG59KShJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgfHwgKGV4cG9ydHMuSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0ge30pKTtcbnZhciBSZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneTtcbihmdW5jdGlvbiAoUmVxdWVzdENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBjYW5kaWRhdGUua2luZCA9PT0gJ3JlcXVlc3QnICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKSAmJiAoY2FuZGlkYXRlLmRpc3Bvc2UgPT09IHVuZGVmaW5lZCB8fCBJcy5mdW5jKGNhbmRpZGF0ZS5kaXNwb3NlKSk7XG4gICAgfVxuICAgIFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzID0gaXM7XG59KShSZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSB8fCAoZXhwb3J0cy5SZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0ge30pKTtcbnZhciBDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5O1xuKGZ1bmN0aW9uIChDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5NZXNzYWdlID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKF8pIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgY2FuY2VsbGF0aW9uXzEuQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UoKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kuaXModmFsdWUpIHx8IFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKHZhbHVlKTtcbiAgICB9XG4gICAgQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5pcyA9IGlzO1xufSkoQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSB8fCAoZXhwb3J0cy5DYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IHt9KSk7XG52YXIgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENhbmNlbGxhdGlvblNlbmRlclN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kuTWVzc2FnZSA9IE9iamVjdC5mcmVlemUoe1xuICAgICAgICBzZW5kQ2FuY2VsbGF0aW9uKGNvbm4sIGlkKSB7XG4gICAgICAgICAgICByZXR1cm4gY29ubi5zZW5kTm90aWZpY2F0aW9uKENhbmNlbE5vdGlmaWNhdGlvbi50eXBlLCB7IGlkIH0pO1xuICAgICAgICB9LFxuICAgICAgICBjbGVhbnVwKF8pIHsgfVxuICAgIH0pO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLnNlbmRDYW5jZWxsYXRpb24pICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNsZWFudXApO1xuICAgIH1cbiAgICBDYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneS5pcyA9IGlzO1xufSkoQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgfHwgKGV4cG9ydHMuQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgPSBDYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneSA9IHt9KSk7XG52YXIgQ2FuY2VsbGF0aW9uU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENhbmNlbGxhdGlvblN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uU3RyYXRlZ3kuTWVzc2FnZSA9IE9iamVjdC5mcmVlemUoe1xuICAgICAgICByZWNlaXZlcjogQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5NZXNzYWdlLFxuICAgICAgICBzZW5kZXI6IENhbmNlbGxhdGlvblNlbmRlclN0cmF0ZWd5Lk1lc3NhZ2VcbiAgICB9KTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKGNhbmRpZGF0ZS5yZWNlaXZlcikgJiYgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kuaXMoY2FuZGlkYXRlLnNlbmRlcik7XG4gICAgfVxuICAgIENhbmNlbGxhdGlvblN0cmF0ZWd5LmlzID0gaXM7XG59KShDYW5jZWxsYXRpb25TdHJhdGVneSB8fCAoZXhwb3J0cy5DYW5jZWxsYXRpb25TdHJhdGVneSA9IENhbmNlbGxhdGlvblN0cmF0ZWd5ID0ge30pKTtcbnZhciBNZXNzYWdlU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKE1lc3NhZ2VTdHJhdGVneSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLmhhbmRsZU1lc3NhZ2UpO1xuICAgIH1cbiAgICBNZXNzYWdlU3RyYXRlZ3kuaXMgPSBpcztcbn0pKE1lc3NhZ2VTdHJhdGVneSB8fCAoZXhwb3J0cy5NZXNzYWdlU3RyYXRlZ3kgPSBNZXNzYWdlU3RyYXRlZ3kgPSB7fSkpO1xudmFyIENvbm5lY3Rpb25PcHRpb25zO1xuKGZ1bmN0aW9uIChDb25uZWN0aW9uT3B0aW9ucykge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIChDYW5jZWxsYXRpb25TdHJhdGVneS5pcyhjYW5kaWRhdGUuY2FuY2VsbGF0aW9uU3RyYXRlZ3kpIHx8IENvbm5lY3Rpb25TdHJhdGVneS5pcyhjYW5kaWRhdGUuY29ubmVjdGlvblN0cmF0ZWd5KSB8fCBNZXNzYWdlU3RyYXRlZ3kuaXMoY2FuZGlkYXRlLm1lc3NhZ2VTdHJhdGVneSkpO1xuICAgIH1cbiAgICBDb25uZWN0aW9uT3B0aW9ucy5pcyA9IGlzO1xufSkoQ29ubmVjdGlvbk9wdGlvbnMgfHwgKGV4cG9ydHMuQ29ubmVjdGlvbk9wdGlvbnMgPSBDb25uZWN0aW9uT3B0aW9ucyA9IHt9KSk7XG52YXIgQ29ubmVjdGlvblN0YXRlO1xuKGZ1bmN0aW9uIChDb25uZWN0aW9uU3RhdGUpIHtcbiAgICBDb25uZWN0aW9uU3RhdGVbQ29ubmVjdGlvblN0YXRlW1wiTmV3XCJdID0gMV0gPSBcIk5ld1wiO1xuICAgIENvbm5lY3Rpb25TdGF0ZVtDb25uZWN0aW9uU3RhdGVbXCJMaXN0ZW5pbmdcIl0gPSAyXSA9IFwiTGlzdGVuaW5nXCI7XG4gICAgQ29ubmVjdGlvblN0YXRlW0Nvbm5lY3Rpb25TdGF0ZVtcIkNsb3NlZFwiXSA9IDNdID0gXCJDbG9zZWRcIjtcbiAgICBDb25uZWN0aW9uU3RhdGVbQ29ubmVjdGlvblN0YXRlW1wiRGlzcG9zZWRcIl0gPSA0XSA9IFwiRGlzcG9zZWRcIjtcbn0pKENvbm5lY3Rpb25TdGF0ZSB8fCAoQ29ubmVjdGlvblN0YXRlID0ge30pKTtcbmZ1bmN0aW9uIGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uKG1lc3NhZ2VSZWFkZXIsIG1lc3NhZ2VXcml0ZXIsIF9sb2dnZXIsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBsb2dnZXIgPSBfbG9nZ2VyICE9PSB1bmRlZmluZWQgPyBfbG9nZ2VyIDogZXhwb3J0cy5OdWxsTG9nZ2VyO1xuICAgIGxldCBzZXF1ZW5jZU51bWJlciA9IDA7XG4gICAgbGV0IG5vdGlmaWNhdGlvblNlcXVlbmNlTnVtYmVyID0gMDtcbiAgICBsZXQgdW5rbm93blJlc3BvbnNlU2VxdWVuY2VOdW1iZXIgPSAwO1xuICAgIGNvbnN0IHZlcnNpb24gPSAnMi4wJztcbiAgICBsZXQgc3RhclJlcXVlc3RIYW5kbGVyID0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlcXVlc3RIYW5kbGVycyA9IG5ldyBNYXAoKTtcbiAgICBsZXQgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgY29uc3Qgbm90aWZpY2F0aW9uSGFuZGxlcnMgPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgcHJvZ3Jlc3NIYW5kbGVycyA9IG5ldyBNYXAoKTtcbiAgICBsZXQgdGltZXI7XG4gICAgbGV0IG1lc3NhZ2VRdWV1ZSA9IG5ldyBsaW5rZWRNYXBfMS5MaW5rZWRNYXAoKTtcbiAgICBsZXQgcmVzcG9uc2VQcm9taXNlcyA9IG5ldyBNYXAoKTtcbiAgICBsZXQga25vd25DYW5jZWxlZFJlcXVlc3RzID0gbmV3IFNldCgpO1xuICAgIGxldCByZXF1ZXN0VG9rZW5zID0gbmV3IE1hcCgpO1xuICAgIGxldCB0cmFjZSA9IFRyYWNlLk9mZjtcbiAgICBsZXQgdHJhY2VGb3JtYXQgPSBUcmFjZUZvcm1hdC5UZXh0O1xuICAgIGxldCB0cmFjZXI7XG4gICAgbGV0IHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLk5ldztcbiAgICBjb25zdCBlcnJvckVtaXR0ZXIgPSBuZXcgZXZlbnRzXzEuRW1pdHRlcigpO1xuICAgIGNvbnN0IGNsb3NlRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgdW5oYW5kbGVkTm90aWZpY2F0aW9uRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgdW5oYW5kbGVkUHJvZ3Jlc3NFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICBjb25zdCBkaXNwb3NlRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgY2FuY2VsbGF0aW9uU3RyYXRlZ3kgPSAob3B0aW9ucyAmJiBvcHRpb25zLmNhbmNlbGxhdGlvblN0cmF0ZWd5KSA/IG9wdGlvbnMuY2FuY2VsbGF0aW9uU3RyYXRlZ3kgOiBDYW5jZWxsYXRpb25TdHJhdGVneS5NZXNzYWdlO1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlcXVlc3RRdWV1ZUtleShpZCkge1xuICAgICAgICBpZiAoaWQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuJ3Qgc2VuZCByZXF1ZXN0cyB3aXRoIGlkIG51bGwgc2luY2UgdGhlIHJlc3BvbnNlIGNhbid0IGJlIGNvcnJlbGF0ZWQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdyZXEtJyArIGlkLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlc3BvbnNlUXVldWVLZXkoaWQpIHtcbiAgICAgICAgaWYgKGlkID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3Jlcy11bmtub3duLScgKyAoKyt1bmtub3duUmVzcG9uc2VTZXF1ZW5jZU51bWJlcikudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAncmVzLScgKyBpZC50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZU5vdGlmaWNhdGlvblF1ZXVlS2V5KCkge1xuICAgICAgICByZXR1cm4gJ25vdC0nICsgKCsrbm90aWZpY2F0aW9uU2VxdWVuY2VOdW1iZXIpLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFkZE1lc3NhZ2VUb1F1ZXVlKHF1ZXVlLCBtZXNzYWdlKSB7XG4gICAgICAgIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXF1ZXN0KG1lc3NhZ2UpKSB7XG4gICAgICAgICAgICBxdWV1ZS5zZXQoY3JlYXRlUmVxdWVzdFF1ZXVlS2V5KG1lc3NhZ2UuaWQpLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXNwb25zZShtZXNzYWdlKSkge1xuICAgICAgICAgICAgcXVldWUuc2V0KGNyZWF0ZVJlc3BvbnNlUXVldWVLZXkobWVzc2FnZS5pZCksIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcXVldWUuc2V0KGNyZWF0ZU5vdGlmaWNhdGlvblF1ZXVlS2V5KCksIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNhbmNlbFVuZGlzcGF0Y2hlZChfbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0xpc3RlbmluZygpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlID09PSBDb25uZWN0aW9uU3RhdGUuTGlzdGVuaW5nO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0Nsb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlID09PSBDb25uZWN0aW9uU3RhdGUuQ2xvc2VkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0Rpc3Bvc2VkKCkge1xuICAgICAgICByZXR1cm4gc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5EaXNwb3NlZDtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2xvc2VIYW5kbGVyKCkge1xuICAgICAgICBpZiAoc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5OZXcgfHwgc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5MaXN0ZW5pbmcpIHtcbiAgICAgICAgICAgIHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLkNsb3NlZDtcbiAgICAgICAgICAgIGNsb3NlRW1pdHRlci5maXJlKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlIGNvbm5lY3Rpb24gaXMgZGlzcG9zZWQgZG9uJ3Qgc2VudCBjbG9zZSBldmVudHMuXG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlYWRFcnJvckhhbmRsZXIoZXJyb3IpIHtcbiAgICAgICAgZXJyb3JFbWl0dGVyLmZpcmUoW2Vycm9yLCB1bmRlZmluZWQsIHVuZGVmaW5lZF0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiB3cml0ZUVycm9ySGFuZGxlcihkYXRhKSB7XG4gICAgICAgIGVycm9yRW1pdHRlci5maXJlKGRhdGEpO1xuICAgIH1cbiAgICBtZXNzYWdlUmVhZGVyLm9uQ2xvc2UoY2xvc2VIYW5kbGVyKTtcbiAgICBtZXNzYWdlUmVhZGVyLm9uRXJyb3IocmVhZEVycm9ySGFuZGxlcik7XG4gICAgbWVzc2FnZVdyaXRlci5vbkNsb3NlKGNsb3NlSGFuZGxlcik7XG4gICAgbWVzc2FnZVdyaXRlci5vbkVycm9yKHdyaXRlRXJyb3JIYW5kbGVyKTtcbiAgICBmdW5jdGlvbiB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCkge1xuICAgICAgICBpZiAodGltZXIgfHwgbWVzc2FnZVF1ZXVlLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aW1lciA9ICgwLCByYWxfMS5kZWZhdWx0KSgpLnRpbWVyLnNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICAgICAgICB0aW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHByb2Nlc3NNZXNzYWdlUXVldWUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGhhbmRsZU1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICBpZiAobWVzc2FnZXNfMS5NZXNzYWdlLmlzUmVxdWVzdChtZXNzYWdlKSkge1xuICAgICAgICAgICAgaGFuZGxlUmVxdWVzdChtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNOb3RpZmljYXRpb24obWVzc2FnZSkpIHtcbiAgICAgICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvbihtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXNwb25zZShtZXNzYWdlKSkge1xuICAgICAgICAgICAgaGFuZGxlUmVzcG9uc2UobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBoYW5kbGVJbnZhbGlkTWVzc2FnZShtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBwcm9jZXNzTWVzc2FnZVF1ZXVlKCkge1xuICAgICAgICBpZiAobWVzc2FnZVF1ZXVlLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXNzYWdlID0gbWVzc2FnZVF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlU3RyYXRlZ3kgPSBvcHRpb25zPy5tZXNzYWdlU3RyYXRlZ3k7XG4gICAgICAgICAgICBpZiAoTWVzc2FnZVN0cmF0ZWd5LmlzKG1lc3NhZ2VTdHJhdGVneSkpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlU3RyYXRlZ3kuaGFuZGxlTWVzc2FnZShtZXNzYWdlLCBoYW5kbGVNZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGhhbmRsZU1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgY2FsbGJhY2sgPSAobWVzc2FnZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2UgaGF2ZSByZWNlaXZlZCBhIGNhbmNlbGxhdGlvbiBtZXNzYWdlLiBDaGVjayBpZiB0aGUgbWVzc2FnZSBpcyBzdGlsbCBpbiB0aGUgcXVldWVcbiAgICAgICAgICAgIC8vIGFuZCBjYW5jZWwgaXQgaWYgYWxsb3dlZCB0byBkbyBzby5cbiAgICAgICAgICAgIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNOb3RpZmljYXRpb24obWVzc2FnZSkgJiYgbWVzc2FnZS5tZXRob2QgPT09IENhbmNlbE5vdGlmaWNhdGlvbi50eXBlLm1ldGhvZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbmNlbElkID0gbWVzc2FnZS5wYXJhbXMuaWQ7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gY3JlYXRlUmVxdWVzdFF1ZXVlS2V5KGNhbmNlbElkKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0b0NhbmNlbCA9IG1lc3NhZ2VRdWV1ZS5nZXQoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZXNfMS5NZXNzYWdlLmlzUmVxdWVzdCh0b0NhbmNlbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyYXRlZ3kgPSBvcHRpb25zPy5jb25uZWN0aW9uU3RyYXRlZ3k7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gKHN0cmF0ZWd5ICYmIHN0cmF0ZWd5LmNhbmNlbFVuZGlzcGF0Y2hlZCkgPyBzdHJhdGVneS5jYW5jZWxVbmRpc3BhdGNoZWQodG9DYW5jZWwsIGNhbmNlbFVuZGlzcGF0Y2hlZCkgOiBjYW5jZWxVbmRpc3BhdGNoZWQodG9DYW5jZWwpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgJiYgKHJlc3BvbnNlLmVycm9yICE9PSB1bmRlZmluZWQgfHwgcmVzcG9uc2UucmVzdWx0ICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUXVldWUuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLmRlbGV0ZShjYW5jZWxJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5pZCA9IHRvQ2FuY2VsLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VTZW5kaW5nUmVzcG9uc2UocmVzcG9uc2UsIG1lc3NhZ2UubWV0aG9kLCBEYXRlLm5vdygpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUocmVzcG9uc2UpLmNhdGNoKCgpID0+IGxvZ2dlci5lcnJvcihgU2VuZGluZyByZXNwb25zZSBmb3IgY2FuY2VsZWQgbWVzc2FnZSBmYWlsZWQuYCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGNhbmNlbGxhdGlvblRva2VuID0gcmVxdWVzdFRva2Vucy5nZXQoY2FuY2VsSWQpO1xuICAgICAgICAgICAgICAgIC8vIFRoZSByZXF1ZXN0IGlzIGFscmVhZHkgcnVubmluZy4gQ2FuY2VsIHRoZSB0b2tlblxuICAgICAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbmNlbGxhdGlvblRva2VuLmNhbmNlbCgpO1xuICAgICAgICAgICAgICAgICAgICB0cmFjZVJlY2VpdmVkTm90aWZpY2F0aW9uKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZW1lbWJlciB0aGUgY2FuY2VsIGJ1dCBzdGlsbCBxdWV1ZSB0aGUgbWVzc2FnZSB0b1xuICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbiB1cCBzdGF0ZSBpbiBwcm9jZXNzIG1lc3NhZ2UuXG4gICAgICAgICAgICAgICAgICAgIGtub3duQ2FuY2VsZWRSZXF1ZXN0cy5hZGQoY2FuY2VsSWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFkZE1lc3NhZ2VUb1F1ZXVlKG1lc3NhZ2VRdWV1ZSwgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGZ1bmN0aW9uIGhhbmRsZVJlcXVlc3QocmVxdWVzdE1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgLy8gd2UgcmV0dXJuIGhlcmUgc2lsZW50bHkgc2luY2Ugd2UgZmlyZWQgYW4gZXZlbnQgd2hlbiB0aGVcbiAgICAgICAgICAgIC8vIGNvbm5lY3Rpb24gZ290IGRpc3Bvc2VkLlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHJlcGx5KHJlc3VsdE9yRXJyb3IsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgaWQ6IHJlcXVlc3RNZXNzYWdlLmlkXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKHJlc3VsdE9yRXJyb3IgaW5zdGFuY2VvZiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlLmVycm9yID0gcmVzdWx0T3JFcnJvci50b0pzb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVzdWx0ID0gcmVzdWx0T3JFcnJvciA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHJlc3VsdE9yRXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cmFjZVNlbmRpbmdSZXNwb25zZShtZXNzYWdlLCBtZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICBtZXNzYWdlV3JpdGVyLndyaXRlKG1lc3NhZ2UpLmNhdGNoKCgpID0+IGxvZ2dlci5lcnJvcihgU2VuZGluZyByZXNwb25zZSBmYWlsZWQuYCkpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHJlcGx5RXJyb3IoZXJyb3IsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgaWQ6IHJlcXVlc3RNZXNzYWdlLmlkLFxuICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvci50b0pzb24oKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUobWVzc2FnZSkuY2F0Y2goKCkgPT4gbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlc3BvbnNlIGZhaWxlZC5gKSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gcmVwbHlTdWNjZXNzKHJlc3VsdCwgbWV0aG9kLCBzdGFydFRpbWUpIHtcbiAgICAgICAgICAgIC8vIFRoZSBKU09OIFJQQyBkZWZpbmVzIHRoYXQgYSByZXNwb25zZSBtdXN0IGVpdGhlciBoYXZlIGEgcmVzdWx0IG9yIGFuIGVycm9yXG4gICAgICAgICAgICAvLyBTbyB3ZSBjYW4ndCB0cmVhdCB1bmRlZmluZWQgYXMgYSB2YWxpZCByZXNwb25zZSByZXN1bHQuXG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgICAgICAgICAgICBqc29ucnBjOiB2ZXJzaW9uLFxuICAgICAgICAgICAgICAgIGlkOiByZXF1ZXN0TWVzc2FnZS5pZCxcbiAgICAgICAgICAgICAgICByZXN1bHQ6IHJlc3VsdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUobWVzc2FnZSkuY2F0Y2goKCkgPT4gbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlc3BvbnNlIGZhaWxlZC5gKSk7XG4gICAgICAgIH1cbiAgICAgICAgdHJhY2VSZWNlaXZlZFJlcXVlc3QocmVxdWVzdE1lc3NhZ2UpO1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gcmVxdWVzdEhhbmRsZXJzLmdldChyZXF1ZXN0TWVzc2FnZS5tZXRob2QpO1xuICAgICAgICBsZXQgdHlwZTtcbiAgICAgICAgbGV0IHJlcXVlc3RIYW5kbGVyO1xuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgdHlwZSA9IGVsZW1lbnQudHlwZTtcbiAgICAgICAgICAgIHJlcXVlc3RIYW5kbGVyID0gZWxlbWVudC5oYW5kbGVyO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIGlmIChyZXF1ZXN0SGFuZGxlciB8fCBzdGFyUmVxdWVzdEhhbmRsZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHRva2VuS2V5ID0gcmVxdWVzdE1lc3NhZ2UuaWQgPz8gU3RyaW5nKERhdGUubm93KCkpOyAvL1xuICAgICAgICAgICAgY29uc3QgY2FuY2VsbGF0aW9uU291cmNlID0gSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKGNhbmNlbGxhdGlvblN0cmF0ZWd5LnJlY2VpdmVyKVxuICAgICAgICAgICAgICAgID8gY2FuY2VsbGF0aW9uU3RyYXRlZ3kucmVjZWl2ZXIuY3JlYXRlQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UodG9rZW5LZXkpXG4gICAgICAgICAgICAgICAgOiBjYW5jZWxsYXRpb25TdHJhdGVneS5yZWNlaXZlci5jcmVhdGVDYW5jZWxsYXRpb25Ub2tlblNvdXJjZShyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICBpZiAocmVxdWVzdE1lc3NhZ2UuaWQgIT09IG51bGwgJiYga25vd25DYW5jZWxlZFJlcXVlc3RzLmhhcyhyZXF1ZXN0TWVzc2FnZS5pZCkpIHtcbiAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25Tb3VyY2UuY2FuY2VsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVxdWVzdE1lc3NhZ2UuaWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLnNldCh0b2tlbktleSwgY2FuY2VsbGF0aW9uU291cmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IGhhbmRsZXJSZXN1bHQ7XG4gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0TWVzc2FnZS5wYXJhbXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlLm51bWJlck9mUGFyYW1zICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1zLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyAke3R5cGUubnVtYmVyT2ZQYXJhbXN9IHBhcmFtcyBidXQgcmVjZWl2ZWQgbm9uZS5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJSZXN1bHQgPSByZXF1ZXN0SGFuZGxlcihjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVxdWVzdE1lc3NhZ2UucGFyYW1zKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlLnBhcmFtZXRlclN0cnVjdHVyZXMgPT09IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseUVycm9yKG5ldyBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IobWVzc2FnZXNfMS5FcnJvckNvZGVzLkludmFsaWRQYXJhbXMsIGBSZXF1ZXN0ICR7cmVxdWVzdE1lc3NhZ2UubWV0aG9kfSBkZWZpbmVzIHBhcmFtZXRlcnMgYnkgbmFtZSBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBwb3NpdGlvbmApLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlclJlc3VsdCA9IHJlcXVlc3RIYW5kbGVyKC4uLnJlcXVlc3RNZXNzYWdlLnBhcmFtcywgY2FuY2VsbGF0aW9uU291cmNlLnRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS5wYXJhbWV0ZXJTdHJ1Y3R1cmVzID09PSBtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW52YWxpZFBhcmFtcywgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGRlZmluZXMgcGFyYW1ldGVycyBieSBwb3NpdGlvbiBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBuYW1lYCksIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gcmVxdWVzdEhhbmRsZXIocmVxdWVzdE1lc3NhZ2UucGFyYW1zLCBjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0YXJSZXF1ZXN0SGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gc3RhclJlcXVlc3RIYW5kbGVyKHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgcmVxdWVzdE1lc3NhZ2UucGFyYW1zLCBjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBwcm9taXNlID0gaGFuZGxlclJlc3VsdDtcbiAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZXJSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFRva2Vucy5kZWxldGUodG9rZW5LZXkpO1xuICAgICAgICAgICAgICAgICAgICByZXBseVN1Y2Nlc3MoaGFuZGxlclJlc3VsdCwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwcm9taXNlLnRoZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS50aGVuKChyZXN1bHRPckVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLmRlbGV0ZSh0b2tlbktleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXBseShyZXN1bHRPckVycm9yLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IoZXJyb3IsIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVycm9yICYmIElzLnN0cmluZyhlcnJvci5tZXNzYWdlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGZhaWxlZCB3aXRoIG1lc3NhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZmFpbGVkIHVuZXhwZWN0ZWRseSB3aXRob3V0IHByb3ZpZGluZyBhbnkgZGV0YWlscy5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHkoaGFuZGxlclJlc3VsdCwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHkoZXJyb3IsIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZXJyb3IgJiYgSXMuc3RyaW5nKGVycm9yLm1lc3NhZ2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGZhaWxlZCB3aXRoIG1lc3NhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZmFpbGVkIHVuZXhwZWN0ZWRseSB3aXRob3V0IHByb3ZpZGluZyBhbnkgZGV0YWlscy5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuTWV0aG9kTm90Rm91bmQsIGBVbmhhbmRsZWQgbWV0aG9kICR7cmVxdWVzdE1lc3NhZ2UubWV0aG9kfWApLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlUmVzcG9uc2UocmVzcG9uc2VNZXNzYWdlKSB7XG4gICAgICAgIGlmIChpc0Rpc3Bvc2VkKCkpIHtcbiAgICAgICAgICAgIC8vIFNlZSBoYW5kbGUgcmVxdWVzdC5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzcG9uc2VNZXNzYWdlLmlkID09PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VNZXNzYWdlLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBSZWNlaXZlZCByZXNwb25zZSBtZXNzYWdlIHdpdGhvdXQgaWQ6IEVycm9yIGlzOiBcXG4ke0pTT04uc3RyaW5naWZ5KHJlc3BvbnNlTWVzc2FnZS5lcnJvciwgdW5kZWZpbmVkLCA0KX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgUmVjZWl2ZWQgcmVzcG9uc2UgbWVzc2FnZSB3aXRob3V0IGlkLiBObyBmdXJ0aGVyIGVycm9yIGluZm9ybWF0aW9uIHByb3ZpZGVkLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gcmVzcG9uc2VNZXNzYWdlLmlkO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VQcm9taXNlID0gcmVzcG9uc2VQcm9taXNlcy5nZXQoa2V5KTtcbiAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWRSZXNwb25zZShyZXNwb25zZU1lc3NhZ2UsIHJlc3BvbnNlUHJvbWlzZSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VQcm9taXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2VzLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZU1lc3NhZ2UuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gcmVzcG9uc2VNZXNzYWdlLmVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlLnJlamVjdChuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKGVycm9yLmNvZGUsIGVycm9yLm1lc3NhZ2UsIGVycm9yLmRhdGEpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXNwb25zZU1lc3NhZ2UucmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlTWVzc2FnZS5yZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgbmV2ZXIgaGFwcGVuLicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IubWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBSZXNwb25zZSBoYW5kbGVyICcke3Jlc3BvbnNlUHJvbWlzZS5tZXRob2R9JyBmYWlsZWQgd2l0aCBtZXNzYWdlOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYFJlc3BvbnNlIGhhbmRsZXIgJyR7cmVzcG9uc2VQcm9taXNlLm1ldGhvZH0nIGZhaWxlZCB1bmV4cGVjdGVkbHkuYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlTm90aWZpY2F0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgLy8gU2VlIGhhbmRsZSByZXF1ZXN0LlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0eXBlID0gdW5kZWZpbmVkO1xuICAgICAgICBsZXQgbm90aWZpY2F0aW9uSGFuZGxlcjtcbiAgICAgICAgaWYgKG1lc3NhZ2UubWV0aG9kID09PSBDYW5jZWxOb3RpZmljYXRpb24udHlwZS5tZXRob2QpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhbmNlbElkID0gbWVzc2FnZS5wYXJhbXMuaWQ7XG4gICAgICAgICAgICBrbm93bkNhbmNlbGVkUmVxdWVzdHMuZGVsZXRlKGNhbmNlbElkKTtcbiAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWROb3RpZmljYXRpb24obWVzc2FnZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gbm90aWZpY2F0aW9uSGFuZGxlcnMuZ2V0KG1lc3NhZ2UubWV0aG9kKTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uSGFuZGxlciA9IGVsZW1lbnQuaGFuZGxlcjtcbiAgICAgICAgICAgICAgICB0eXBlID0gZWxlbWVudC50eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChub3RpZmljYXRpb25IYW5kbGVyIHx8IHN0YXJOb3RpZmljYXRpb25IYW5kbGVyKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWROb3RpZmljYXRpb24obWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgaWYgKG5vdGlmaWNhdGlvbkhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UucGFyYW1zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5udW1iZXJPZlBhcmFtcyAhPT0gMCAmJiB0eXBlLnBhcmFtZXRlclN0cnVjdHVyZXMgIT09IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBOb3RpZmljYXRpb24gJHttZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyAke3R5cGUubnVtYmVyT2ZQYXJhbXN9IHBhcmFtcyBidXQgcmVjZWl2ZWQgbm9uZS5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShtZXNzYWdlLnBhcmFtcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGFyZSBKU09OLVJQQyBsaWJyYXJpZXMgdGhhdCBzZW5kIHByb2dyZXNzIG1lc3NhZ2UgYXMgcG9zaXRpb25hbCBwYXJhbXMgYWx0aG91Z2hcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpZmllZCBhcyBuYW1lZC4gU28gY29udmVydCB0aGVtIGlmIHRoaXMgaXMgdGhlIGNhc2UuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBtZXNzYWdlLnBhcmFtcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLm1ldGhvZCA9PT0gUHJvZ3Jlc3NOb3RpZmljYXRpb24udHlwZS5tZXRob2QgJiYgcGFyYW1zLmxlbmd0aCA9PT0gMiAmJiBQcm9ncmVzc1Rva2VuLmlzKHBhcmFtc1swXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKHsgdG9rZW46IHBhcmFtc1swXSwgdmFsdWU6IHBhcmFtc1sxXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUucGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBOb3RpZmljYXRpb24gJHttZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyBwYXJhbWV0ZXJzIGJ5IG5hbWUgYnV0IHJlY2VpdmVkIHBhcmFtZXRlcnMgYnkgcG9zaXRpb25gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5udW1iZXJPZlBhcmFtcyAhPT0gbWVzc2FnZS5wYXJhbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYE5vdGlmaWNhdGlvbiAke21lc3NhZ2UubWV0aG9kfSBkZWZpbmVzICR7dHlwZS5udW1iZXJPZlBhcmFtc30gcGFyYW1zIGJ1dCByZWNlaXZlZCAke3BhcmFtcy5sZW5ndGh9IGFyZ3VtZW50c2ApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXIoLi4ucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS5wYXJhbWV0ZXJTdHJ1Y3R1cmVzID09PSBtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgTm90aWZpY2F0aW9uICR7bWVzc2FnZS5tZXRob2R9IGRlZmluZXMgcGFyYW1ldGVycyBieSBwb3NpdGlvbiBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBuYW1lYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKG1lc3NhZ2UucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGFyTm90aWZpY2F0aW9uSGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICBzdGFyTm90aWZpY2F0aW9uSGFuZGxlcihtZXNzYWdlLm1ldGhvZCwgbWVzc2FnZS5wYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvci5tZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgTm90aWZpY2F0aW9uIGhhbmRsZXIgJyR7bWVzc2FnZS5tZXRob2R9JyBmYWlsZWQgd2l0aCBtZXNzYWdlOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYE5vdGlmaWNhdGlvbiBoYW5kbGVyICcke21lc3NhZ2UubWV0aG9kfScgZmFpbGVkIHVuZXhwZWN0ZWRseS5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1bmhhbmRsZWROb3RpZmljYXRpb25FbWl0dGVyLmZpcmUobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlSW52YWxpZE1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignUmVjZWl2ZWQgZW1wdHkgbWVzc2FnZS4nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsb2dnZXIuZXJyb3IoYFJlY2VpdmVkIG1lc3NhZ2Ugd2hpY2ggaXMgbmVpdGhlciBhIHJlc3BvbnNlIG5vciBhIG5vdGlmaWNhdGlvbiBtZXNzYWdlOlxcbiR7SlNPTi5zdHJpbmdpZnkobWVzc2FnZSwgbnVsbCwgNCl9YCk7XG4gICAgICAgIC8vIFRlc3Qgd2hldGhlciB3ZSBmaW5kIGFuIGlkIHRvIHJlamVjdCB0aGUgcHJvbWlzZVxuICAgICAgICBjb25zdCByZXNwb25zZU1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICBpZiAoSXMuc3RyaW5nKHJlc3BvbnNlTWVzc2FnZS5pZCkgfHwgSXMubnVtYmVyKHJlc3BvbnNlTWVzc2FnZS5pZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHJlc3BvbnNlTWVzc2FnZS5pZDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxlciA9IHJlc3BvbnNlUHJvbWlzZXMuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VIYW5kbGVyLnJlamVjdChuZXcgRXJyb3IoJ1RoZSByZWNlaXZlZCByZXNwb25zZSBoYXMgbmVpdGhlciBhIHJlc3VsdCBub3IgYW4gZXJyb3IgcHJvcGVydHkuJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0cmluZ2lmeVRyYWNlKHBhcmFtcykge1xuICAgICAgICBpZiAocGFyYW1zID09PSB1bmRlZmluZWQgfHwgcGFyYW1zID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAodHJhY2UpIHtcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuVmVyYm9zZTpcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGFyYW1zLCBudWxsLCA0KTtcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuQ29tcGFjdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGFyYW1zKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVNlbmRpbmdSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFjZUZvcm1hdCA9PT0gVHJhY2VGb3JtYXQuVGV4dCkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSAmJiBtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBgUGFyYW1zOiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucGFyYW1zKX1cXG5cXG5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJhY2VyLmxvZyhgU2VuZGluZyByZXF1ZXN0ICcke21lc3NhZ2UubWV0aG9kfSAtICgke21lc3NhZ2UuaWR9KScuYCwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb2dMU1BNZXNzYWdlKCdzZW5kLXJlcXVlc3QnLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVNlbmRpbmdOb3RpZmljYXRpb24obWVzc2FnZSkge1xuICAgICAgICBpZiAodHJhY2UgPT09IFRyYWNlLk9mZiB8fCAhdHJhY2VyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYWNlRm9ybWF0ID09PSBUcmFjZUZvcm1hdC5UZXh0KSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdCkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0gYFBhcmFtczogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLnBhcmFtcyl9XFxuXFxuYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSAnTm8gcGFyYW1ldGVycyBwcm92aWRlZC5cXG5cXG4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFNlbmRpbmcgbm90aWZpY2F0aW9uICcke21lc3NhZ2UubWV0aG9kfScuYCwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb2dMU1BNZXNzYWdlKCdzZW5kLW5vdGlmaWNhdGlvbicsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhY2VGb3JtYXQgPT09IFRyYWNlRm9ybWF0LlRleHQpIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZXJyb3IgJiYgbWVzc2FnZS5lcnJvci5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgRXJyb3IgZGF0YTogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLmVycm9yLmRhdGEpfVxcblxcbmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgUmVzdWx0OiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucmVzdWx0KX1cXG5cXG5gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UuZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9ICdObyByZXN1bHQgcmV0dXJuZWQuXFxuXFxuJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFNlbmRpbmcgcmVzcG9uc2UgJyR7bWV0aG9kfSAtICgke21lc3NhZ2UuaWR9KScuIFByb2Nlc3NpbmcgcmVxdWVzdCB0b29rICR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1tc2AsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgnc2VuZC1yZXNwb25zZScsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYWNlUmVjZWl2ZWRSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFjZUZvcm1hdCA9PT0gVHJhY2VGb3JtYXQuVGV4dCkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSAmJiBtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBgUGFyYW1zOiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucGFyYW1zKX1cXG5cXG5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJhY2VyLmxvZyhgUmVjZWl2ZWQgcmVxdWVzdCAnJHttZXNzYWdlLm1ldGhvZH0gLSAoJHttZXNzYWdlLmlkfSknLmAsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1yZXF1ZXN0JywgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdHJhY2VSZWNlaXZlZE5vdGlmaWNhdGlvbihtZXNzYWdlKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIgfHwgbWVzc2FnZS5tZXRob2QgPT09IExvZ1RyYWNlTm90aWZpY2F0aW9uLnR5cGUubWV0aG9kKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYWNlRm9ybWF0ID09PSBUcmFjZUZvcm1hdC5UZXh0KSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdCkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0gYFBhcmFtczogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLnBhcmFtcyl9XFxuXFxuYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSAnTm8gcGFyYW1ldGVycyBwcm92aWRlZC5cXG5cXG4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFJlY2VpdmVkIG5vdGlmaWNhdGlvbiAnJHttZXNzYWdlLm1ldGhvZH0nLmAsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1ub3RpZmljYXRpb24nLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVJlY2VpdmVkUmVzcG9uc2UobWVzc2FnZSwgcmVzcG9uc2VQcm9taXNlKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhY2VGb3JtYXQgPT09IFRyYWNlRm9ybWF0LlRleHQpIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZXJyb3IgJiYgbWVzc2FnZS5lcnJvci5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgRXJyb3IgZGF0YTogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLmVycm9yLmRhdGEpfVxcblxcbmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgUmVzdWx0OiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucmVzdWx0KX1cXG5cXG5gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UuZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9ICdObyByZXN1bHQgcmV0dXJuZWQuXFxuXFxuJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXNwb25zZVByb21pc2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IG1lc3NhZ2UuZXJyb3IgPyBgIFJlcXVlc3QgZmFpbGVkOiAke21lc3NhZ2UuZXJyb3IubWVzc2FnZX0gKCR7bWVzc2FnZS5lcnJvci5jb2RlfSkuYCA6ICcnO1xuICAgICAgICAgICAgICAgIHRyYWNlci5sb2coYFJlY2VpdmVkIHJlc3BvbnNlICcke3Jlc3BvbnNlUHJvbWlzZS5tZXRob2R9IC0gKCR7bWVzc2FnZS5pZH0pJyBpbiAke0RhdGUubm93KCkgLSByZXNwb25zZVByb21pc2UudGltZXJTdGFydH1tcy4ke2Vycm9yfWAsIGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJhY2VyLmxvZyhgUmVjZWl2ZWQgcmVzcG9uc2UgJHttZXNzYWdlLmlkfSB3aXRob3V0IGFjdGl2ZSByZXNwb25zZSBwcm9taXNlLmAsIGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1yZXNwb25zZScsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGxvZ0xTUE1lc3NhZ2UodHlwZSwgbWVzc2FnZSkge1xuICAgICAgICBpZiAoIXRyYWNlciB8fCB0cmFjZSA9PT0gVHJhY2UuT2ZmKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbHNwTWVzc2FnZSA9IHtcbiAgICAgICAgICAgIGlzTFNQTWVzc2FnZTogdHJ1ZSxcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpXG4gICAgICAgIH07XG4gICAgICAgIHRyYWNlci5sb2cobHNwTWVzc2FnZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRocm93SWZDbG9zZWRPckRpc3Bvc2VkKCkge1xuICAgICAgICBpZiAoaXNDbG9zZWQoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IENvbm5lY3Rpb25FcnJvcihDb25uZWN0aW9uRXJyb3JzLkNsb3NlZCwgJ0Nvbm5lY3Rpb24gaXMgY2xvc2VkLicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0Rpc3Bvc2VkKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb25uZWN0aW9uRXJyb3IoQ29ubmVjdGlvbkVycm9ycy5EaXNwb3NlZCwgJ0Nvbm5lY3Rpb24gaXMgZGlzcG9zZWQuJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdGhyb3dJZkxpc3RlbmluZygpIHtcbiAgICAgICAgaWYgKGlzTGlzdGVuaW5nKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb25uZWN0aW9uRXJyb3IoQ29ubmVjdGlvbkVycm9ycy5BbHJlYWR5TGlzdGVuaW5nLCAnQ29ubmVjdGlvbiBpcyBhbHJlYWR5IGxpc3RlbmluZycpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRocm93SWZOb3RMaXN0ZW5pbmcoKSB7XG4gICAgICAgIGlmICghaXNMaXN0ZW5pbmcoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYWxsIGxpc3RlbigpIGZpcnN0LicpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVuZGVmaW5lZFRvTnVsbChwYXJhbSkge1xuICAgICAgICBpZiAocGFyYW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyYW07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gbnVsbFRvVW5kZWZpbmVkKHBhcmFtKSB7XG4gICAgICAgIGlmIChwYXJhbSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJhbTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBpc05hbWVkUGFyYW0ocGFyYW0pIHtcbiAgICAgICAgcmV0dXJuIHBhcmFtICE9PSB1bmRlZmluZWQgJiYgcGFyYW0gIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkocGFyYW0pICYmIHR5cGVvZiBwYXJhbSA9PT0gJ29iamVjdCc7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXB1dGVTaW5nbGVQYXJhbShwYXJhbWV0ZXJTdHJ1Y3R1cmVzLCBwYXJhbSkge1xuICAgICAgICBzd2l0Y2ggKHBhcmFtZXRlclN0cnVjdHVyZXMpIHtcbiAgICAgICAgICAgIGNhc2UgbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG86XG4gICAgICAgICAgICAgICAgaWYgKGlzTmFtZWRQYXJhbShwYXJhbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxUb1VuZGVmaW5lZChwYXJhbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3VuZGVmaW5lZFRvTnVsbChwYXJhbSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZTpcbiAgICAgICAgICAgICAgICBpZiAoIWlzTmFtZWRQYXJhbShwYXJhbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWNlaXZlZCBwYXJhbWV0ZXJzIGJ5IG5hbWUgYnV0IHBhcmFtIGlzIG5vdCBhbiBvYmplY3QgbGl0ZXJhbC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGxUb1VuZGVmaW5lZChwYXJhbSk7XG4gICAgICAgICAgICBjYXNlIG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieVBvc2l0aW9uOlxuICAgICAgICAgICAgICAgIHJldHVybiBbdW5kZWZpbmVkVG9OdWxsKHBhcmFtKV07XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBwYXJhbWV0ZXIgc3RydWN0dXJlICR7cGFyYW1ldGVyU3RydWN0dXJlcy50b1N0cmluZygpfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXB1dGVNZXNzYWdlUGFyYW1zKHR5cGUsIHBhcmFtcykge1xuICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICBjb25zdCBudW1iZXJPZlBhcmFtcyA9IHR5cGUubnVtYmVyT2ZQYXJhbXM7XG4gICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gY29tcHV0ZVNpbmdsZVBhcmFtKHR5cGUucGFyYW1ldGVyU3RydWN0dXJlcywgcGFyYW1zWzBdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoICYmIGkgPCBudW1iZXJPZlBhcmFtczsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHVuZGVmaW5lZFRvTnVsbChwYXJhbXNbaV0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPCBudW1iZXJPZlBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gcGFyYW1zLmxlbmd0aDsgaSA8IG51bWJlck9mUGFyYW1zOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB7XG4gICAgICAgIHNlbmROb3RpZmljYXRpb246ICh0eXBlLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlUGFyYW1zO1xuICAgICAgICAgICAgaWYgKElzLnN0cmluZyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICAgIGxldCBwYXJhbVN0YXJ0ID0gMDtcbiAgICAgICAgICAgICAgICBsZXQgcGFyYW1ldGVyU3RydWN0dXJlcyA9IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvO1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuaXMoZmlyc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtU3RhcnQgPSAxO1xuICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gZmlyc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBwYXJhbUVuZCA9IGFyZ3MubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gcGFyYW1FbmQgLSBwYXJhbVN0YXJ0O1xuICAgICAgICAgICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zID0gY29tcHV0ZVNpbmdsZVBhcmFtKHBhcmFtZXRlclN0cnVjdHVyZXMsIGFyZ3NbcGFyYW1TdGFydF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjZWl2ZWQgJHtudW1iZXJPZlBhcmFtc30gcGFyYW1ldGVycyBmb3IgJ2J5IE5hbWUnIG5vdGlmaWNhdGlvbiBwYXJhbWV0ZXIgc3RydWN0dXJlLmApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IGFyZ3Muc2xpY2UocGFyYW1TdGFydCwgcGFyYW1FbmQpLm1hcCh2YWx1ZSA9PiB1bmRlZmluZWRUb051bGwodmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IGFyZ3M7XG4gICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZS5tZXRob2Q7XG4gICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IGNvbXB1dGVNZXNzYWdlUGFyYW1zKHR5cGUsIHBhcmFtcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBub3RpZmljYXRpb25NZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBtZXNzYWdlUGFyYW1zXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdHJhY2VTZW5kaW5nTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbk1lc3NhZ2UpO1xuICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2VXcml0ZXIud3JpdGUobm90aWZpY2F0aW9uTWVzc2FnZSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBTZW5kaW5nIG5vdGlmaWNhdGlvbiBmYWlsZWQuYCk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25Ob3RpZmljYXRpb246ICh0eXBlLCBoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGlmIChJcy5mdW5jKHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB0eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaGFuZGxlcikge1xuICAgICAgICAgICAgICAgIGlmIChJcy5zdHJpbmcodHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZTtcbiAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uSGFuZGxlcnMuc2V0KHR5cGUsIHsgdHlwZTogdW5kZWZpbmVkLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZS5tZXRob2Q7XG4gICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXJzLnNldCh0eXBlLm1ldGhvZCwgeyB0eXBlLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXJzLmRlbGV0ZShtZXRob2QpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBvblByb2dyZXNzOiAoX3R5cGUsIHRva2VuLCBoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgICBpZiAocHJvZ3Jlc3NIYW5kbGVycy5oYXModG9rZW4pKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm9ncmVzcyBoYW5kbGVyIGZvciB0b2tlbiAke3Rva2VufSBhbHJlYWR5IHJlZ2lzdGVyZWRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByb2dyZXNzSGFuZGxlcnMuc2V0KHRva2VuLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc0hhbmRsZXJzLmRlbGV0ZSh0b2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgc2VuZFByb2dyZXNzOiAoX3R5cGUsIHRva2VuLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGF3YWl0IGJ1dCBzaW1wbGUgcmV0dXJuIHRvIGVuc3VyZSB0aGF0IHdlIGRvbid0IGhhdmUgYW5vdGhlclxuICAgICAgICAgICAgLy8gYXN5bmMgc2NoZWR1bGluZy4gT3RoZXJ3aXNlIG9uZSBzZW5kIGNvdWxkIG92ZXJ0YWtlIGFub3RoZXIgc2VuZC5cbiAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLnNlbmROb3RpZmljYXRpb24oUHJvZ3Jlc3NOb3RpZmljYXRpb24udHlwZSwgeyB0b2tlbiwgdmFsdWUgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uVW5oYW5kbGVkUHJvZ3Jlc3M6IHVuaGFuZGxlZFByb2dyZXNzRW1pdHRlci5ldmVudCxcbiAgICAgICAgc2VuZFJlcXVlc3Q6ICh0eXBlLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgdGhyb3dJZk5vdExpc3RlbmluZygpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlUGFyYW1zO1xuICAgICAgICAgICAgbGV0IHRva2VuID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKElzLnN0cmluZyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3QgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgbGV0IHBhcmFtU3RhcnQgPSAwO1xuICAgICAgICAgICAgICAgIGxldCBwYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG87XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5pcyhmaXJzdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1TdGFydCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlclN0cnVjdHVyZXMgPSBmaXJzdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHBhcmFtRW5kID0gYXJncy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuLmlzKGxhc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtRW5kID0gcGFyYW1FbmQgLSAxO1xuICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IGxhc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gcGFyYW1FbmQgLSBwYXJhbVN0YXJ0O1xuICAgICAgICAgICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zID0gY29tcHV0ZVNpbmdsZVBhcmFtKHBhcmFtZXRlclN0cnVjdHVyZXMsIGFyZ3NbcGFyYW1TdGFydF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjZWl2ZWQgJHtudW1iZXJPZlBhcmFtc30gcGFyYW1ldGVycyBmb3IgJ2J5IE5hbWUnIHJlcXVlc3QgcGFyYW1ldGVyIHN0cnVjdHVyZS5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMgPSBhcmdzLnNsaWNlKHBhcmFtU3RhcnQsIHBhcmFtRW5kKS5tYXAodmFsdWUgPT4gdW5kZWZpbmVkVG9OdWxsKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBhcmdzO1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGUubWV0aG9kO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMgPSBjb21wdXRlTWVzc2FnZVBhcmFtcyh0eXBlLCBwYXJhbXMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gdHlwZS5udW1iZXJPZlBhcmFtcztcbiAgICAgICAgICAgICAgICB0b2tlbiA9IGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuLmlzKHBhcmFtc1tudW1iZXJPZlBhcmFtc10pID8gcGFyYW1zW251bWJlck9mUGFyYW1zXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGlkID0gc2VxdWVuY2VOdW1iZXIrKztcbiAgICAgICAgICAgIGxldCBkaXNwb3NhYmxlO1xuICAgICAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgICAgICAgZGlzcG9zYWJsZSA9IHRva2VuLm9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcCA9IGNhbmNlbGxhdGlvblN0cmF0ZWd5LnNlbmRlci5zZW5kQ2FuY2VsbGF0aW9uKGNvbm5lY3Rpb24sIGlkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhgUmVjZWl2ZWQgbm8gcHJvbWlzZSBmcm9tIGNhbmNlbGxhdGlvbiBzdHJhdGVneSB3aGVuIGNhbmNlbGxpbmcgaWQgJHtpZH1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIubG9nKGBTZW5kaW5nIGNhbmNlbGxhdGlvbiBtZXNzYWdlcyBmb3IgaWQgJHtpZH0gZmFpbGVkYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdE1lc3NhZ2UgPSB7XG4gICAgICAgICAgICAgICAganNvbnJwYzogdmVyc2lvbixcbiAgICAgICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBtZXNzYWdlUGFyYW1zXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdHJhY2VTZW5kaW5nUmVxdWVzdChyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNhbmNlbGxhdGlvblN0cmF0ZWd5LnNlbmRlci5lbmFibGVDYW5jZWxsYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25TdHJhdGVneS5zZW5kZXIuZW5hYmxlQ2FuY2VsbGF0aW9uKHJlcXVlc3RNZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZVdpdGhDbGVhbnVwID0gKHIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyKTtcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uU3RyYXRlZ3kuc2VuZGVyLmNsZWFudXAoaWQpO1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlPy5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWplY3RXaXRoQ2xlYW51cCA9IChyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChyKTtcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uU3RyYXRlZ3kuc2VuZGVyLmNsZWFudXAoaWQpO1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlPy5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZVByb21pc2UgPSB7IG1ldGhvZDogbWV0aG9kLCB0aW1lclN0YXJ0OiBEYXRlLm5vdygpLCByZXNvbHZlOiByZXNvbHZlV2l0aENsZWFudXAsIHJlamVjdDogcmVqZWN0V2l0aENsZWFudXAgfTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2VzLnNldChpZCwgcmVzcG9uc2VQcm9taXNlKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbWVzc2FnZVdyaXRlci53cml0ZShyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAvLyBXcml0aW5nIHRoZSBtZXNzYWdlIGZhaWxlZC4gU28gd2UgbmVlZCB0byBkZWxldGUgaXQgZnJvbSB0aGUgcmVzcG9uc2UgcHJvbWlzZXMgYW5kXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlamVjdCBpdC5cbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlcy5kZWxldGUoaWQpO1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2UucmVqZWN0KG5ldyBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IobWVzc2FnZXNfMS5FcnJvckNvZGVzLk1lc3NhZ2VXcml0ZUVycm9yLCBlcnJvci5tZXNzYWdlID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIHJlYXNvbicpKTtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlcXVlc3QgZmFpbGVkLmApO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25SZXF1ZXN0OiAodHlwZSwgaGFuZGxlcikgPT4ge1xuICAgICAgICAgICAgdGhyb3dJZkNsb3NlZE9yRGlzcG9zZWQoKTtcbiAgICAgICAgICAgIGxldCBtZXRob2QgPSBudWxsO1xuICAgICAgICAgICAgaWYgKFN0YXJSZXF1ZXN0SGFuZGxlci5pcyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBzdGFyUmVxdWVzdEhhbmRsZXIgPSB0eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoSXMuc3RyaW5nKHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgbWV0aG9kID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoaGFuZGxlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RIYW5kbGVycy5zZXQodHlwZSwgeyBoYW5kbGVyOiBoYW5kbGVyLCB0eXBlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSB0eXBlLm1ldGhvZDtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEhhbmRsZXJzLnNldCh0eXBlLm1ldGhvZCwgeyB0eXBlLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SGFuZGxlcnMuZGVsZXRlKG1ldGhvZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFyUmVxdWVzdEhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBoYXNQZW5kaW5nUmVzcG9uc2U6ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZVByb21pc2VzLnNpemUgPiAwO1xuICAgICAgICB9LFxuICAgICAgICB0cmFjZTogYXN5bmMgKF92YWx1ZSwgX3RyYWNlciwgc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBsZXQgX3NlbmROb3RpZmljYXRpb24gPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBfdHJhY2VGb3JtYXQgPSBUcmFjZUZvcm1hdC5UZXh0O1xuICAgICAgICAgICAgaWYgKHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKElzLmJvb2xlYW4oc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zKSkge1xuICAgICAgICAgICAgICAgICAgICBfc2VuZE5vdGlmaWNhdGlvbiA9IHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF9zZW5kTm90aWZpY2F0aW9uID0gc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zLnNlbmROb3RpZmljYXRpb24gfHwgZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIF90cmFjZUZvcm1hdCA9IHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucy50cmFjZUZvcm1hdCB8fCBUcmFjZUZvcm1hdC5UZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlID0gX3ZhbHVlO1xuICAgICAgICAgICAgdHJhY2VGb3JtYXQgPSBfdHJhY2VGb3JtYXQ7XG4gICAgICAgICAgICBpZiAodHJhY2UgPT09IFRyYWNlLk9mZikge1xuICAgICAgICAgICAgICAgIHRyYWNlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRyYWNlciA9IF90cmFjZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoX3NlbmROb3RpZmljYXRpb24gJiYgIWlzQ2xvc2VkKCkgJiYgIWlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGNvbm5lY3Rpb24uc2VuZE5vdGlmaWNhdGlvbihTZXRUcmFjZU5vdGlmaWNhdGlvbi50eXBlLCB7IHZhbHVlOiBUcmFjZS50b1N0cmluZyhfdmFsdWUpIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBvbkVycm9yOiBlcnJvckVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIG9uQ2xvc2U6IGNsb3NlRW1pdHRlci5ldmVudCxcbiAgICAgICAgb25VbmhhbmRsZWROb3RpZmljYXRpb246IHVuaGFuZGxlZE5vdGlmaWNhdGlvbkVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIG9uRGlzcG9zZTogZGlzcG9zZUVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIGVuZDogKCkgPT4ge1xuICAgICAgICAgICAgbWVzc2FnZVdyaXRlci5lbmQoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLkRpc3Bvc2VkO1xuICAgICAgICAgICAgZGlzcG9zZUVtaXR0ZXIuZmlyZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5QZW5kaW5nUmVzcG9uc2VSZWplY3RlZCwgJ1BlbmRpbmcgcmVzcG9uc2UgcmVqZWN0ZWQgc2luY2UgY29ubmVjdGlvbiBnb3QgZGlzcG9zZWQnKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvbWlzZSBvZiByZXNwb25zZVByb21pc2VzLnZhbHVlcygpKSB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBrbm93bkNhbmNlbGVkUmVxdWVzdHMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICBtZXNzYWdlUXVldWUgPSBuZXcgbGlua2VkTWFwXzEuTGlua2VkTWFwKCk7XG4gICAgICAgICAgICAvLyBUZXN0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgaWYgKElzLmZ1bmMobWVzc2FnZVdyaXRlci5kaXNwb3NlKSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKElzLmZ1bmMobWVzc2FnZVJlYWRlci5kaXNwb3NlKSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VSZWFkZXIuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBsaXN0ZW46ICgpID0+IHtcbiAgICAgICAgICAgIHRocm93SWZDbG9zZWRPckRpc3Bvc2VkKCk7XG4gICAgICAgICAgICB0aHJvd0lmTGlzdGVuaW5nKCk7XG4gICAgICAgICAgICBzdGF0ZSA9IENvbm5lY3Rpb25TdGF0ZS5MaXN0ZW5pbmc7XG4gICAgICAgICAgICBtZXNzYWdlUmVhZGVyLmxpc3RlbihjYWxsYmFjayk7XG4gICAgICAgIH0sXG4gICAgICAgIGluc3BlY3Q6ICgpID0+IHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS5jb25zb2xlLmxvZygnaW5zcGVjdCcpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25uZWN0aW9uLm9uTm90aWZpY2F0aW9uKExvZ1RyYWNlTm90aWZpY2F0aW9uLnR5cGUsIChwYXJhbXMpID0+IHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZlcmJvc2UgPSB0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdDtcbiAgICAgICAgdHJhY2VyLmxvZyhwYXJhbXMubWVzc2FnZSwgdmVyYm9zZSA/IHBhcmFtcy52ZXJib3NlIDogdW5kZWZpbmVkKTtcbiAgICB9KTtcbiAgICBjb25uZWN0aW9uLm9uTm90aWZpY2F0aW9uKFByb2dyZXNzTm90aWZpY2F0aW9uLnR5cGUsIChwYXJhbXMpID0+IHtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IHByb2dyZXNzSGFuZGxlcnMuZ2V0KHBhcmFtcy50b2tlbik7XG4gICAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICAgICBoYW5kbGVyKHBhcmFtcy52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1bmhhbmRsZWRQcm9ncmVzc0VtaXR0ZXIuZmlyZShwYXJhbXMpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbm5lY3Rpb247XG59XG5leHBvcnRzLmNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uID0gY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb247XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vdHlwaW5ncy90aGVuYWJsZS5kLnRzXCIgLz5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUHJvZ3Jlc3NUeXBlID0gZXhwb3J0cy5Qcm9ncmVzc1Rva2VuID0gZXhwb3J0cy5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiA9IGV4cG9ydHMuTnVsbExvZ2dlciA9IGV4cG9ydHMuQ29ubmVjdGlvbk9wdGlvbnMgPSBleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IGV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlQnVmZmVyID0gZXhwb3J0cy5Xcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyID0gZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLk1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLlJlYWRhYmxlU3RyZWFtTWVzc2FnZVJlYWRlciA9IGV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlUmVhZGVyID0gZXhwb3J0cy5NZXNzYWdlUmVhZGVyID0gZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblRva2VuID0gZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IGV4cG9ydHMuRW1pdHRlciA9IGV4cG9ydHMuRXZlbnQgPSBleHBvcnRzLkRpc3Bvc2FibGUgPSBleHBvcnRzLkxSVUNhY2hlID0gZXhwb3J0cy5Ub3VjaCA9IGV4cG9ydHMuTGlua2VkTWFwID0gZXhwb3J0cy5QYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlOSA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTggPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU3ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNiA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTUgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU0ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMyA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTIgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUxID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMCA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZSA9IGV4cG9ydHMuRXJyb3JDb2RlcyA9IGV4cG9ydHMuUmVzcG9uc2VFcnJvciA9IGV4cG9ydHMuUmVxdWVzdFR5cGU5ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTggPSBleHBvcnRzLlJlcXVlc3RUeXBlNyA9IGV4cG9ydHMuUmVxdWVzdFR5cGU2ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTUgPSBleHBvcnRzLlJlcXVlc3RUeXBlNCA9IGV4cG9ydHMuUmVxdWVzdFR5cGUzID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTIgPSBleHBvcnRzLlJlcXVlc3RUeXBlMSA9IGV4cG9ydHMuUmVxdWVzdFR5cGUwID0gZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IGV4cG9ydHMuTWVzc2FnZSA9IGV4cG9ydHMuUkFMID0gdm9pZCAwO1xuZXhwb3J0cy5NZXNzYWdlU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblN0cmF0ZWd5ID0gZXhwb3J0cy5DYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IGV4cG9ydHMuQ29ubmVjdGlvbkVycm9yID0gZXhwb3J0cy5Db25uZWN0aW9uRXJyb3JzID0gZXhwb3J0cy5Mb2dUcmFjZU5vdGlmaWNhdGlvbiA9IGV4cG9ydHMuU2V0VHJhY2VOb3RpZmljYXRpb24gPSBleHBvcnRzLlRyYWNlRm9ybWF0ID0gZXhwb3J0cy5UcmFjZVZhbHVlcyA9IGV4cG9ydHMuVHJhY2UgPSB2b2lkIDA7XG5jb25zdCBtZXNzYWdlc18xID0gcmVxdWlyZShcIi4vbWVzc2FnZXNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNZXNzYWdlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk1lc3NhZ2U7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlMFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTA7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTFcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGUxOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGUyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlMjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlM1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGU0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGU1XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlNTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlNlwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTY7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTdcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGU3OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGU4XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlODsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlOVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTk7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXNwb25zZUVycm9yXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3I7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJFcnJvckNvZGVzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLkVycm9yQ29kZXM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlMFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlMDsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGUxXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGUxOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZTJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlM1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlMzsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGU0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZTVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlNlwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlNjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGU3XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU3OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZThcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTg7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlOVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlOTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlBhcmFtZXRlclN0cnVjdHVyZXNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlczsgfSB9KTtcbmNvbnN0IGxpbmtlZE1hcF8xID0gcmVxdWlyZShcIi4vbGlua2VkTWFwXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTGlua2VkTWFwXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBsaW5rZWRNYXBfMS5MaW5rZWRNYXA7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJMUlVDYWNoZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbGlua2VkTWFwXzEuTFJVQ2FjaGU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJUb3VjaFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbGlua2VkTWFwXzEuVG91Y2g7IH0gfSk7XG5jb25zdCBkaXNwb3NhYmxlXzEgPSByZXF1aXJlKFwiLi9kaXNwb3NhYmxlXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiRGlzcG9zYWJsZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZGlzcG9zYWJsZV8xLkRpc3Bvc2FibGU7IH0gfSk7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCIuL2V2ZW50c1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkV2ZW50XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBldmVudHNfMS5FdmVudDsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkVtaXR0ZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGV2ZW50c18xLkVtaXR0ZXI7IH0gfSk7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblRva2VuU291cmNlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjYW5jZWxsYXRpb25fMS5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblRva2VuXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjYW5jZWxsYXRpb25fMS5DYW5jZWxsYXRpb25Ub2tlbjsgfSB9KTtcbmNvbnN0IHNoYXJlZEFycmF5Q2FuY2VsbGF0aW9uXzEgPSByZXF1aXJlKFwiLi9zaGFyZWRBcnJheUNhbmNlbGxhdGlvblwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHNoYXJlZEFycmF5Q2FuY2VsbGF0aW9uXzEuU2hhcmVkQXJyYXlTZW5kZXJTdHJhdGVneTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlNoYXJlZEFycmF5UmVjZWl2ZXJTdHJhdGVneVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gc2hhcmVkQXJyYXlDYW5jZWxsYXRpb25fMS5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3k7IH0gfSk7XG5jb25zdCBtZXNzYWdlUmVhZGVyXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlUmVhZGVyXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTWVzc2FnZVJlYWRlclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZVJlYWRlcl8xLk1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VSZWFkZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VSZWFkZXJfMS5BYnN0cmFjdE1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VSZWFkZXJfMS5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5jb25zdCBtZXNzYWdlV3JpdGVyXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlV3JpdGVyXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTWVzc2FnZVdyaXRlclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZVdyaXRlcl8xLk1lc3NhZ2VXcml0ZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VXcml0ZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VXcml0ZXJfMS5BYnN0cmFjdE1lc3NhZ2VXcml0ZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJXcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlV3JpdGVyXzEuV3JpdGVhYmxlU3RyZWFtTWVzc2FnZVdyaXRlcjsgfSB9KTtcbmNvbnN0IG1lc3NhZ2VCdWZmZXJfMSA9IHJlcXVpcmUoXCIuL21lc3NhZ2VCdWZmZXJcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VCdWZmZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VCdWZmZXJfMS5BYnN0cmFjdE1lc3NhZ2VCdWZmZXI7IH0gfSk7XG5jb25zdCBjb25uZWN0aW9uXzEgPSByZXF1aXJlKFwiLi9jb25uZWN0aW9uXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29ubmVjdGlvblN0cmF0ZWd5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ29ubmVjdGlvblN0cmF0ZWd5OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29ubmVjdGlvbk9wdGlvbnNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5Db25uZWN0aW9uT3B0aW9uczsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk51bGxMb2dnZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5OdWxsTG9nZ2VyOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb25cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlByb2dyZXNzVG9rZW5cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5Qcm9ncmVzc1Rva2VuOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUHJvZ3Jlc3NUeXBlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuUHJvZ3Jlc3NUeXBlOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiVHJhY2VcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5UcmFjZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlRyYWNlVmFsdWVzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuVHJhY2VWYWx1ZXM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJUcmFjZUZvcm1hdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29ubmVjdGlvbl8xLlRyYWNlRm9ybWF0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiU2V0VHJhY2VOb3RpZmljYXRpb25cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5TZXRUcmFjZU5vdGlmaWNhdGlvbjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkxvZ1RyYWNlTm90aWZpY2F0aW9uXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuTG9nVHJhY2VOb3RpZmljYXRpb247IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJDb25uZWN0aW9uRXJyb3JzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ29ubmVjdGlvbkVycm9yczsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNvbm5lY3Rpb25FcnJvclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29ubmVjdGlvbl8xLkNvbm5lY3Rpb25FcnJvcjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5DYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5DYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblN0cmF0ZWd5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ2FuY2VsbGF0aW9uU3RyYXRlZ3k7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNZXNzYWdlU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5NZXNzYWdlU3RyYXRlZ3k7IH0gfSk7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbmV4cG9ydHMuUkFMID0gcmFsXzEuZGVmYXVsdDtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGFwaV8xID0gcmVxdWlyZShcIi4uL2NvbW1vbi9hcGlcIik7XG5jbGFzcyBNZXNzYWdlQnVmZmVyIGV4dGVuZHMgYXBpXzEuQWJzdHJhY3RNZXNzYWdlQnVmZmVyIHtcbiAgICBjb25zdHJ1Y3RvcihlbmNvZGluZyA9ICd1dGYtOCcpIHtcbiAgICAgICAgc3VwZXIoZW5jb2RpbmcpO1xuICAgICAgICB0aGlzLmFzY2lpRGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcignYXNjaWknKTtcbiAgICB9XG4gICAgZW1wdHlCdWZmZXIoKSB7XG4gICAgICAgIHJldHVybiBNZXNzYWdlQnVmZmVyLmVtcHR5QnVmZmVyO1xuICAgIH1cbiAgICBmcm9tU3RyaW5nKHZhbHVlLCBfZW5jb2RpbmcpIHtcbiAgICAgICAgcmV0dXJuIChuZXcgVGV4dEVuY29kZXIoKSkuZW5jb2RlKHZhbHVlKTtcbiAgICB9XG4gICAgdG9TdHJpbmcodmFsdWUsIGVuY29kaW5nKSB7XG4gICAgICAgIGlmIChlbmNvZGluZyA9PT0gJ2FzY2lpJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXNjaWlEZWNvZGVyLmRlY29kZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gKG5ldyBUZXh0RGVjb2RlcihlbmNvZGluZykpLmRlY29kZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXNOYXRpdmUoYnVmZmVyLCBsZW5ndGgpIHtcbiAgICAgICAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlci5zbGljZSgwLCBsZW5ndGgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFsbG9jTmF0aXZlKGxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTtcbiAgICB9XG59XG5NZXNzYWdlQnVmZmVyLmVtcHR5QnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMCk7XG5jbGFzcyBSZWFkYWJsZVN0cmVhbVdyYXBwZXIge1xuICAgIGNvbnN0cnVjdG9yKHNvY2tldCkge1xuICAgICAgICB0aGlzLnNvY2tldCA9IHNvY2tldDtcbiAgICAgICAgdGhpcy5fb25EYXRhID0gbmV3IGFwaV8xLkVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5fbWVzc2FnZUxpc3RlbmVyID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBibG9iID0gZXZlbnQuZGF0YTtcbiAgICAgICAgICAgIGJsb2IuYXJyYXlCdWZmZXIoKS50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkRhdGEuZmlyZShuZXcgVWludDhBcnJheShidWZmZXIpKTtcbiAgICAgICAgICAgIH0sICgpID0+IHtcbiAgICAgICAgICAgICAgICAoMCwgYXBpXzEuUkFMKSgpLmNvbnNvbGUuZXJyb3IoYENvbnZlcnRpbmcgYmxvYiB0byBhcnJheSBidWZmZXIgZmFpbGVkLmApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLl9tZXNzYWdlTGlzdGVuZXIpO1xuICAgIH1cbiAgICBvbkNsb3NlKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2Nsb3NlJywgbGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gYXBpXzEuRGlzcG9zYWJsZS5jcmVhdGUoKCkgPT4gdGhpcy5zb2NrZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xvc2UnLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkVycm9yKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgbGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gYXBpXzEuRGlzcG9zYWJsZS5jcmVhdGUoKCkgPT4gdGhpcy5zb2NrZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkVuZChsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKCdlbmQnLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdlbmQnLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkRhdGEobGlzdGVuZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uRGF0YS5ldmVudChsaXN0ZW5lcik7XG4gICAgfVxufVxuY2xhc3MgV3JpdGFibGVTdHJlYW1XcmFwcGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihzb2NrZXQpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7XG4gICAgfVxuICAgIG9uQ2xvc2UobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignY2xvc2UnLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbG9zZScsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIG9uRXJyb3IobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIG9uRW5kKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2VuZCcsIGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIGFwaV8xLkRpc3Bvc2FibGUuY3JlYXRlKCgpID0+IHRoaXMuc29ja2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2VuZCcsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIHdyaXRlKGRhdGEsIGVuY29kaW5nKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkICYmIGVuY29kaW5nICE9PSAndXRmLTgnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbiBhIEJyb3dzZXIgZW52aXJvbm1lbnRzIG9ubHkgdXRmLTggdGV4dCBlbmNvZGluZyBpcyBzdXBwb3J0ZWQuIEJ1dCBnb3QgZW5jb2Rpbmc6ICR7ZW5jb2Rpbmd9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKTtcbiAgICB9XG59XG5jb25zdCBfdGV4dEVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbmNvbnN0IF9yaWwgPSBPYmplY3QuZnJlZXplKHtcbiAgICBtZXNzYWdlQnVmZmVyOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgY3JlYXRlOiAoZW5jb2RpbmcpID0+IG5ldyBNZXNzYWdlQnVmZmVyKGVuY29kaW5nKVxuICAgIH0pLFxuICAgIGFwcGxpY2F0aW9uSnNvbjogT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGVuY29kZXI6IE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgbmFtZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgZW5jb2RlOiAobXNnLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2hhcnNldCAhPT0gJ3V0Zi04Jykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluIGEgQnJvd3NlciBlbnZpcm9ubWVudHMgb25seSB1dGYtOCB0ZXh0IGVuY29kaW5nIGlzIHN1cHBvcnRlZC4gQnV0IGdvdCBlbmNvZGluZzogJHtvcHRpb25zLmNoYXJzZXR9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoX3RleHRFbmNvZGVyLmVuY29kZShKU09OLnN0cmluZ2lmeShtc2csIHVuZGVmaW5lZCwgMCkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIGRlY29kZXI6IE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgbmFtZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgZGVjb2RlOiAoYnVmZmVyLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCEoYnVmZmVyIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbiBhIEJyb3dzZXIgZW52aXJvbm1lbnRzIG9ubHkgVWludDhBcnJheXMgYXJlIHN1cHBvcnRlZC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShKU09OLnBhcnNlKG5ldyBUZXh0RGVjb2RlcihvcHRpb25zLmNoYXJzZXQpLmRlY29kZShidWZmZXIpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfSksXG4gICAgc3RyZWFtOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgYXNSZWFkYWJsZVN0cmVhbTogKHNvY2tldCkgPT4gbmV3IFJlYWRhYmxlU3RyZWFtV3JhcHBlcihzb2NrZXQpLFxuICAgICAgICBhc1dyaXRhYmxlU3RyZWFtOiAoc29ja2V0KSA9PiBuZXcgV3JpdGFibGVTdHJlYW1XcmFwcGVyKHNvY2tldClcbiAgICB9KSxcbiAgICBjb25zb2xlOiBjb25zb2xlLFxuICAgIHRpbWVyOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgc2V0VGltZW91dChjYWxsYmFjaywgbXMsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHNldFRpbWVvdXQoY2FsbGJhY2ssIG1zLCAuLi5hcmdzKTtcbiAgICAgICAgICAgIHJldHVybiB7IGRpc3Bvc2U6ICgpID0+IGNsZWFyVGltZW91dChoYW5kbGUpIH07XG4gICAgICAgIH0sXG4gICAgICAgIHNldEltbWVkaWF0ZShjYWxsYmFjaywgLi4uYXJncykge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gc2V0VGltZW91dChjYWxsYmFjaywgMCwgLi4uYXJncyk7XG4gICAgICAgICAgICByZXR1cm4geyBkaXNwb3NlOiAoKSA9PiBjbGVhclRpbWVvdXQoaGFuZGxlKSB9O1xuICAgICAgICB9LFxuICAgICAgICBzZXRJbnRlcnZhbChjYWxsYmFjaywgbXMsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHNldEludGVydmFsKGNhbGxiYWNrLCBtcywgLi4uYXJncyk7XG4gICAgICAgICAgICByZXR1cm4geyBkaXNwb3NlOiAoKSA9PiBjbGVhckludGVydmFsKGhhbmRsZSkgfTtcbiAgICAgICAgfSxcbiAgICB9KVxufSk7XG5mdW5jdGlvbiBSSUwoKSB7XG4gICAgcmV0dXJuIF9yaWw7XG59XG4oZnVuY3Rpb24gKFJJTCkge1xuICAgIGZ1bmN0aW9uIGluc3RhbGwoKSB7XG4gICAgICAgIGFwaV8xLlJBTC5pbnN0YWxsKF9yaWwpO1xuICAgIH1cbiAgICBSSUwuaW5zdGFsbCA9IGluc3RhbGw7XG59KShSSUwgfHwgKFJJTCA9IHt9KSk7XG5leHBvcnRzLmRlZmF1bHQgPSBSSUw7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24gPSBleHBvcnRzLkJyb3dzZXJNZXNzYWdlV3JpdGVyID0gZXhwb3J0cy5Ccm93c2VyTWVzc2FnZVJlYWRlciA9IHZvaWQgMDtcbmNvbnN0IHJpbF8xID0gcmVxdWlyZShcIi4vcmlsXCIpO1xuLy8gSW5zdGFsbCB0aGUgYnJvd3NlciBydW50aW1lIGFic3RyYWN0LlxucmlsXzEuZGVmYXVsdC5pbnN0YWxsKCk7XG5jb25zdCBhcGlfMSA9IHJlcXVpcmUoXCIuLi9jb21tb24vYXBpXCIpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuLi9jb21tb24vYXBpXCIpLCBleHBvcnRzKTtcbmNsYXNzIEJyb3dzZXJNZXNzYWdlUmVhZGVyIGV4dGVuZHMgYXBpXzEuQWJzdHJhY3RNZXNzYWdlUmVhZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihwb3J0KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX29uRGF0YSA9IG5ldyBhcGlfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuX21lc3NhZ2VMaXN0ZW5lciA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fb25EYXRhLmZpcmUoZXZlbnQuZGF0YSk7XG4gICAgICAgIH07XG4gICAgICAgIHBvcnQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoZXZlbnQpID0+IHRoaXMuZmlyZUVycm9yKGV2ZW50KSk7XG4gICAgICAgIHBvcnQub25tZXNzYWdlID0gdGhpcy5fbWVzc2FnZUxpc3RlbmVyO1xuICAgIH1cbiAgICBsaXN0ZW4oY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uRGF0YS5ldmVudChjYWxsYmFjayk7XG4gICAgfVxufVxuZXhwb3J0cy5Ccm93c2VyTWVzc2FnZVJlYWRlciA9IEJyb3dzZXJNZXNzYWdlUmVhZGVyO1xuY2xhc3MgQnJvd3Nlck1lc3NhZ2VXcml0ZXIgZXh0ZW5kcyBhcGlfMS5BYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKHBvcnQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50ID0gMDtcbiAgICAgICAgcG9ydC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIChldmVudCkgPT4gdGhpcy5maXJlRXJyb3IoZXZlbnQpKTtcbiAgICB9XG4gICAgd3JpdGUobXNnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnBvcnQucG9zdE1lc3NhZ2UobXNnKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IsIG1zZyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZUVycm9yKGVycm9yLCBtc2cpIHtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50Kys7XG4gICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yLCBtc2csIHRoaXMuZXJyb3JDb3VudCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICB9XG59XG5leHBvcnRzLkJyb3dzZXJNZXNzYWdlV3JpdGVyID0gQnJvd3Nlck1lc3NhZ2VXcml0ZXI7XG5mdW5jdGlvbiBjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbihyZWFkZXIsIHdyaXRlciwgbG9nZ2VyLCBvcHRpb25zKSB7XG4gICAgaWYgKGxvZ2dlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxvZ2dlciA9IGFwaV8xLk51bGxMb2dnZXI7XG4gICAgfVxuICAgIGlmIChhcGlfMS5Db25uZWN0aW9uU3RyYXRlZ3kuaXMob3B0aW9ucykpIHtcbiAgICAgICAgb3B0aW9ucyA9IHsgY29ubmVjdGlvblN0cmF0ZWd5OiBvcHRpb25zIH07XG4gICAgfVxuICAgIHJldHVybiAoMCwgYXBpXzEuY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24pKHJlYWRlciwgd3JpdGVyLCBsb2dnZXIsIG9wdGlvbnMpO1xufVxuZXhwb3J0cy5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiA9IGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uO1xuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL2Jyb3dzZXIvbWFpbicpOyIsICIvKlxuICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMjYgRWNsaXBzZSBEaXJpZ2libGUgY29udHJpYnV0b3JzXG4gKlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlXG4gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2Mi4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG4gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MjAuaHRtbFxuICpcbiAqIFNQRFgtRmlsZUNvcHlyaWdodFRleHQ6IEVjbGlwc2UgRGlyaWdpYmxlIGNvbnRyaWJ1dG9ycyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbi8qKlxuICogSmF2YSBMU1AgY2xpZW50IGJ1bmRsZS5cbiAqXG4gKiBVc2VzIHZzY29kZS13cy1qc29ucnBjIGZvciB0eXBlZCBKU09OLVJQQyBvdmVyIFdlYlNvY2tldCBhbmQgcmVnaXN0ZXJzIE1vbmFjb1xuICogcHJvdmlkZXJzIHRoYXQgZGVsZWdhdGUgdG8gSkRULkxTLiBFeHBvc2VkIGFzIGdsb2JhbCBKYXZhTHNwQ2xpZW50TGliIHNvIHRoYXRcbiAqIGVkaXRvci5qcyBjYW4gY2FsbCBKYXZhTHNwQ2xpZW50TGliLmNvbm5lY3QocmVzb3VyY2VQYXRoKS5cbiAqXG4gKiBPbmUgSkRULkxTIHByb2Nlc3MgY292ZXJzIHRoZSBlbnRpcmUgd29ya3NwYWNlLCBzbyBhIHNpbmdsZSBXZWJTb2NrZXQgY29ubmVjdGlvblxuICogaXMgc2hhcmVkIGFjcm9zcyBhbGwgSmF2YSBmaWxlcyBvcGVuIGluIHRoZSBzYW1lIGJyb3dzZXIgcGFnZS4gVGhlIGNvbm5lY3Rpb24gaXNcbiAqIGVzdGFibGlzaGVkIG9uIHRoZSBmaXJzdCBjb25uZWN0KCkgY2FsbCBhbmQgcmV1c2VkIGZvciBhbGwgc3Vic2VxdWVudCBjYWxscy5cbiAqXG4gKiBlZGl0b3IuanMgc2V0cyB3aW5kb3cubW9uYWNvIGJlZm9yZSBjYWxsaW5nIGNvbm5lY3QoKSwgc28gdGhlIG1vbmFjby1zaGltJ3MgbGF6eVxuICogUHJveGllcyByZXNvbHZlIGNvcnJlY3RseSBhdCBjYWxsIHRpbWUuXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24sIE1lc3NhZ2VDb25uZWN0aW9uIH0gZnJvbSAndnNjb2RlLWpzb25ycGMvYnJvd3Nlcic7XG5pbXBvcnQgeyB0b1NvY2tldCwgV2ViU29ja2V0TWVzc2FnZVJlYWRlciwgV2ViU29ja2V0TWVzc2FnZVdyaXRlciB9IGZyb20gJ3ZzY29kZS13cy1qc29ucnBjJztcbmltcG9ydCAqIGFzIG1vbmFjbyBmcm9tICdtb25hY28tZWRpdG9yJztcbmltcG9ydCB7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLFxuICAgIERpYWdub3N0aWNTZXZlcml0eSxcbiAgICBJbnNlcnRUZXh0Rm9ybWF0LFxuICAgIE1hcmt1cENvbnRlbnQsXG4gICAgTWFya3VwS2luZCxcbiAgICB0eXBlIENvZGVBY3Rpb24sXG4gICAgdHlwZSBDb21tYW5kLFxuICAgIHR5cGUgQ29tcGxldGlvbkl0ZW0sXG4gICAgdHlwZSBDb21wbGV0aW9uTGlzdCxcbiAgICB0eXBlIERpYWdub3N0aWMsXG4gICAgdHlwZSBIb3ZlcixcbiAgICB0eXBlIExvY2F0aW9uLFxuICAgIHR5cGUgUGFyYW1ldGVySW5mb3JtYXRpb24sXG4gICAgdHlwZSBTaWduYXR1cmVIZWxwLFxuICAgIHR5cGUgU2lnbmF0dXJlSW5mb3JtYXRpb24sXG4gICAgdHlwZSBUZXh0RWRpdCxcbiAgICB0eXBlIFdvcmtzcGFjZUVkaXQsXG59IGZyb20gJ3ZzY29kZS1sYW5ndWFnZXNlcnZlci10eXBlcyc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNpbmdsZXRvbiBzdGF0ZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogU2hhcmVkIGNvbm5lY3Rpb24gXHUyMDE0IG9uZSBwZXIgYnJvd3NlciBwYWdlLCBjb3ZlcmluZyBhbGwgcHJvamVjdHMgaW4gdGhlIHdvcmtzcGFjZS4gKi9cbmxldCBfY29ubjogTWVzc2FnZUNvbm5lY3Rpb24gfCBudWxsID0gbnVsbDtcblxuLyoqXG4gKiBWaXJ0dWFsIHdvcmtzcGFjZSByb290IFVSSSwgZS5nLiB7QGNvZGUgZmlsZTovLy93b3Jrc3BhY2Uvd29ya3NwYWNlL30uXG4gKiBTZXQgb25jZSBvbiBmaXJzdCBjb25uZWN0KCk7IHVzZWQgdG8gc2NvcGUgTW9uYWNvIHByb3ZpZGVycyB0byB3b3Jrc3BhY2UgZmlsZXMuXG4gKi9cbmxldCBfd29ya3NwYWNlUm9vdCA9ICcnO1xuXG4vKiogVVJJcyBmb3Igd2hpY2ggdGV4dERvY3VtZW50L2RpZE9wZW4gaGFzIGFscmVhZHkgYmVlbiBzZW50LiAqL1xuY29uc3QgX29wZW5GaWxlczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cbmxldCBfcHJvdmlkZXJzUmVnaXN0ZXJlZCA9IGZhbHNlO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBQdWJsaWMgQVBJXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBDYWxsZWQgYnkgZWRpdG9yLmpzIHdoZW4gYSBKYXZhIGZpbGUgaXMgb3BlbmVkLiBTYWZlIHRvIGNhbGwgbXVsdGlwbGUgdGltZXMuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29ubmVjdChyZXNvdXJjZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcnRzID0gcmVzb3VyY2VQYXRoLnJlcGxhY2UoL15cXC8vLCAnJykuc3BsaXQoJy8nKTtcbiAgICBjb25zdCB3b3Jrc3BhY2UgPSBwYXJ0c1swXTtcbiAgICBjb25zdCBwcm9qZWN0ICAgPSBwYXJ0c1sxXTtcbiAgICBjb25zdCBmaWxlVXJpID0gYGZpbGU6Ly8vd29ya3NwYWNlLyR7d29ya3NwYWNlfS8ke3Byb2plY3R9LyR7cGFydHMuc2xpY2UoMikuam9pbignLycpfWA7XG5cbiAgICBpZiAoX2Nvbm4pIHtcbiAgICAgICAgLy8gQ29ubmVjdGlvbiBhbHJlYWR5IGVzdGFibGlzaGVkIFx1MjAxNCBqdXN0IG9wZW4gdGhlIG5ldyBmaWxlLlxuICAgICAgICBvcGVuRmlsZShmaWxlVXJpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIF93b3Jrc3BhY2VSb290ID0gYGZpbGU6Ly8vd29ya3NwYWNlLyR7d29ya3NwYWNlfS9gO1xuXG4gICAgY29uc3QgcHJvdG8gPSBsb2NhdGlvbi5wcm90b2NvbCA9PT0gJ2h0dHBzOicgPyAnd3NzJyA6ICd3cyc7XG4gICAgY29uc3Qgd3NVcmwgPSBgJHtwcm90b306Ly8ke2xvY2F0aW9uLmhvc3R9L3dlYnNvY2tldHMvaWRlL2phdmEtbHNwYFxuICAgICAgICAgICAgICAgICsgYD93b3Jrc3BhY2U9JHtlbmNvZGVVUklDb21wb25lbnQod29ya3NwYWNlKX1gO1xuXG4gICAgY29uc3Qgd3MgPSBuZXcgV2ViU29ja2V0KHdzVXJsKTtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHdzLm9ub3BlbiAgPSAoKSA9PiByZXNvbHZlKCk7XG4gICAgICAgIHdzLm9uZXJyb3IgPSAoKSA9PiByZWplY3QobmV3IEVycm9yKGBbamF2YS1sc3BdIFdlYlNvY2tldCBjb25uZWN0IGZhaWxlZDogJHt3c1VybH1gKSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBzb2NrZXQgPSB0b1NvY2tldCh3cyk7XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IFdlYlNvY2tldE1lc3NhZ2VSZWFkZXIoc29ja2V0KTtcbiAgICBjb25zdCB3cml0ZXIgPSBuZXcgV2ViU29ja2V0TWVzc2FnZVdyaXRlcihzb2NrZXQpO1xuICAgIF9jb25uID0gY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24ocmVhZGVyLCB3cml0ZXIpO1xuXG4gICAgLy8gRGlhZ25vc3RpY3Mgbm90aWZpY2F0aW9uIFx1MjE5MiBNb25hY28gbWFya2VycyAoYXBwbGllcyB0byBhbnkgd29ya3NwYWNlIGZpbGUpXG4gICAgX2Nvbm4ub25Ob3RpZmljYXRpb24oJ3RleHREb2N1bWVudC9wdWJsaXNoRGlhZ25vc3RpY3MnLCAocGFyYW1zOiB7IHVyaTogc3RyaW5nOyBkaWFnbm9zdGljczogRGlhZ25vc3RpY1tdIH0pID0+IHtcbiAgICAgICAgY29uc3QgbW9kZWwgPSBtb25hY28uZWRpdG9yLmdldE1vZGVscygpLmZpbmQobSA9PiBtLnVyaS50b1N0cmluZygpID09PSBwYXJhbXMudXJpKTtcbiAgICAgICAgaWYgKCFtb2RlbCkgcmV0dXJuO1xuICAgICAgICBtb25hY28uZWRpdG9yLnNldE1vZGVsTWFya2Vycyhtb2RlbCwgJ2phdmEtbHNwJywgcGFyYW1zLmRpYWdub3N0aWNzLm1hcChkID0+ICh7XG4gICAgICAgICAgICBzZXZlcml0eTogICAgICAgIGxzcFNldmVyaXR5KGQuc2V2ZXJpdHkpLFxuICAgICAgICAgICAgbWVzc2FnZTogICAgICAgICBkLm1lc3NhZ2UsXG4gICAgICAgICAgICBzb3VyY2U6ICAgICAgICAgIGQuc291cmNlID8/ICdqYXZhJyxcbiAgICAgICAgICAgIHN0YXJ0TGluZU51bWJlcjogZC5yYW5nZS5zdGFydC5saW5lICsgMSxcbiAgICAgICAgICAgIHN0YXJ0Q29sdW1uOiAgICAgZC5yYW5nZS5zdGFydC5jaGFyYWN0ZXIgKyAxLFxuICAgICAgICAgICAgZW5kTGluZU51bWJlcjogICBkLnJhbmdlLmVuZC5saW5lICsgMSxcbiAgICAgICAgICAgIGVuZENvbHVtbjogICAgICAgZC5yYW5nZS5lbmQuY2hhcmFjdGVyICsgMSxcbiAgICAgICAgfSkpKTtcbiAgICB9KTtcblxuICAgIC8vIFNlcnZlciAtPiBjbGllbnQgcmVxdWVzdHMgdGhhdCBkcml2ZSByZWZhY3RvciAvIGdlbmVyYXRlIHJlc3VsdHMgYW5kIGR5bmFtaWMgcmVnaXN0cmF0aW9uLlxuICAgIF9jb25uLm9uUmVxdWVzdCgnd29ya3NwYWNlL2FwcGx5RWRpdCcsIChwYXJhbXM6IHsgZWRpdDogV29ya3NwYWNlRWRpdCB9KSA9PiB7XG4gICAgICAgIGFwcGx5V29ya3NwYWNlRWRpdChwYXJhbXMuZWRpdCk7XG4gICAgICAgIHJldHVybiB7IGFwcGxpZWQ6IHRydWUgfTtcbiAgICB9KTtcbiAgICBfY29ubi5vblJlcXVlc3QoJ3dvcmtzcGFjZS9jb25maWd1cmF0aW9uJywgKHBhcmFtczogeyBpdGVtczogQXJyYXk8eyBzZWN0aW9uPzogc3RyaW5nIH0+IH0pID0+XG4gICAgICAgIChwYXJhbXMuaXRlbXMgPz8gW10pLm1hcCgoKSA9PiBqZHRsc1NldHRpbmdzKCkuamF2YSkpO1xuICAgIF9jb25uLm9uUmVxdWVzdCgnY2xpZW50L3JlZ2lzdGVyQ2FwYWJpbGl0eScsICgpID0+IG51bGwpO1xuICAgIF9jb25uLm9uUmVxdWVzdCgnY2xpZW50L3VucmVnaXN0ZXJDYXBhYmlsaXR5JywgKCkgPT4gbnVsbCk7XG4gICAgX2Nvbm4ub25SZXF1ZXN0KCd3aW5kb3cvc2hvd01lc3NhZ2VSZXF1ZXN0JywgKCkgPT4gbnVsbCk7XG4gICAgX2Nvbm4ub25SZXF1ZXN0KCd3aW5kb3cvd29ya0RvbmVQcm9ncmVzcy9jcmVhdGUnLCAoKSA9PiBudWxsKTtcbiAgICBfY29ubi5vbk5vdGlmaWNhdGlvbignd2luZG93L2xvZ01lc3NhZ2UnLCAocDogeyBtZXNzYWdlOiBzdHJpbmcgfSkgPT4gY29uc29sZS5kZWJ1ZygnW2phdmEtbHNwXScsIHA/Lm1lc3NhZ2UpKTtcbiAgICBfY29ubi5vbk5vdGlmaWNhdGlvbignd2luZG93L3Nob3dNZXNzYWdlJywgKHA6IHsgbWVzc2FnZTogc3RyaW5nIH0pID0+IGNvbnNvbGUuaW5mbygnW2phdmEtbHNwXScsIHA/Lm1lc3NhZ2UpKTtcbiAgICAvLyBKRFQuTFMgbGFuZ3VhZ2Utc3RhdHVzIC8gcHJvZ3Jlc3Mgbm90aWZpY2F0aW9ucyBcdTIwMTQgYWNrbm93bGVkZ2VkIHNpbGVudGx5LlxuICAgIF9jb25uLm9uTm90aWZpY2F0aW9uKCdsYW5ndWFnZS9zdGF0dXMnLCAoKSA9PiB7IC8qIGluZGV4aW5nL3JlYWR5IHN0YXR1cywgaWdub3JlZCAqLyB9KTtcbiAgICBfY29ubi5vbk5vdGlmaWNhdGlvbignbGFuZ3VhZ2UvcHJvZ3Jlc3NSZXBvcnQnLCAoKSA9PiB7IC8qIGJ1aWxkIHByb2dyZXNzLCBpZ25vcmVkICovIH0pO1xuXG4gICAgX2Nvbm4ubGlzdGVuKCk7XG5cbiAgICBjb25zdCByb290VXJpID0gX3dvcmtzcGFjZVJvb3Q7XG4gICAgYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ2luaXRpYWxpemUnLCB7XG4gICAgICAgIHByb2Nlc3NJZDogbnVsbCxcbiAgICAgICAgcm9vdFVyaSxcbiAgICAgICAgaW5pdGlhbGl6YXRpb25PcHRpb25zOiB7XG4gICAgICAgICAgICBzZXR0aW5nczogamR0bHNTZXR0aW5ncygpLFxuICAgICAgICAgICAgZXh0ZW5kZWRDbGllbnRDYXBhYmlsaXRpZXM6IHtcbiAgICAgICAgICAgICAgICBwcm9ncmVzc1JlcG9ydFByb3ZpZGVyOiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAgIGNsYXNzRmlsZUNvbnRlbnRzU3VwcG9ydDogICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICByZXNvbHZlQWRkaXRpb25hbFRleHRFZGl0c1N1cHBvcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgYWR2YW5jZWRHZW5lcmF0ZUFjY2Vzc29yc1N1cHBvcnQ6ICB0cnVlLFxuICAgICAgICAgICAgICAgIGdlbmVyYXRlVG9TdHJpbmdQcm9tcHRTdXBwb3J0OiAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICBnZW5lcmF0ZUNvbnN0cnVjdG9yc1Byb21wdFN1cHBvcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgZ2VuZXJhdGVEZWxlZ2F0ZU1ldGhvZHNQcm9tcHRTdXBwb3J0OiB0cnVlLFxuICAgICAgICAgICAgICAgIGhhc2hDb2RlRXF1YWxzUHJvbXB0U3VwcG9ydDogICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICBhZHZhbmNlZE9yZ2FuaXplSW1wb3J0c1N1cHBvcnQ6ICAgIHRydWUsXG4gICAgICAgICAgICAgICAgaW5mZXJTZWxlY3Rpb25TdXBwb3J0OiAgICAgICAgICAgICBbJ2V4dHJhY3RNZXRob2QnLCAnZXh0cmFjdFZhcmlhYmxlJywgJ2V4dHJhY3RGaWVsZCddLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgd29ya3NwYWNlRm9sZGVyczogW3sgdXJpOiByb290VXJpLCBuYW1lOiB3b3Jrc3BhY2UgfV0sXG4gICAgICAgIGNhcGFiaWxpdGllczoge1xuICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7XG4gICAgICAgICAgICAgICAgc3luY2hyb25pemF0aW9uOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUsIHdpbGxTYXZlOiBmYWxzZSwgZGlkU2F2ZTogdHJ1ZSwgd2lsbFNhdmVXYWl0VW50aWw6IGZhbHNlIH0sXG4gICAgICAgICAgICAgICAgY29tcGxldGlvbjoge1xuICAgICAgICAgICAgICAgICAgICBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uSXRlbToge1xuICAgICAgICAgICAgICAgICAgICAgICAgc25pcHBldFN1cHBvcnQ6ICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRhdGlvbkZvcm1hdDogICBbJ21hcmtkb3duJywgJ3BsYWludGV4dCddLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRlZFN1cHBvcnQ6ICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWl0Q2hhcmFjdGVyc1N1cHBvcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlU3VwcG9ydDogICAgICAgIHsgcHJvcGVydGllczogWydkb2N1bWVudGF0aW9uJywgJ2RldGFpbCcsICdhZGRpdGlvbmFsVGV4dEVkaXRzJ10gfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dFN1cHBvcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBob3ZlcjogICAgICAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLCBjb250ZW50Rm9ybWF0OiBbJ21hcmtkb3duJywgJ3BsYWludGV4dCddIH0sXG4gICAgICAgICAgICAgICAgc2lnbmF0dXJlSGVscDogIHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSwgc2lnbmF0dXJlSW5mb3JtYXRpb246IHsgZG9jdW1lbnRhdGlvbkZvcm1hdDogWydtYXJrZG93bicsICdwbGFpbnRleHQnXSwgcGFyYW1ldGVySW5mb3JtYXRpb246IHsgbGFiZWxPZmZzZXRTdXBwb3J0OiB0cnVlIH0gfSB9LFxuICAgICAgICAgICAgICAgIGRlZmluaXRpb246ICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VzOiAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgZG9jdW1lbnRTeW1ib2w6IHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIGZvcm1hdHRpbmc6ICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICByYW5nZUZvcm1hdHRpbmc6IHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIHJlbmFtZTogICAgICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUsIHByZXBhcmVTdXBwb3J0OiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgY29kZUFjdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjb2RlQWN0aW9uTGl0ZXJhbFN1cHBvcnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVBY3Rpb25LaW5kOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTZXQ6IFsncXVpY2tmaXgnLCAncmVmYWN0b3InLCAncmVmYWN0b3IuZXh0cmFjdCcsICdyZWZhY3Rvci5pbmxpbmUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVmYWN0b3IucmV3cml0ZScsICdzb3VyY2UnLCAnc291cmNlLm9yZ2FuaXplSW1wb3J0cyddLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgaXNQcmVmZXJyZWRTdXBwb3J0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBkYXRhU3VwcG9ydDogICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmVTdXBwb3J0OiAgICAgeyBwcm9wZXJ0aWVzOiBbJ2VkaXQnXSB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcHVibGlzaERpYWdub3N0aWNzOiB7IHJlbGF0ZWRJbmZvcm1hdGlvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdvcmtzcGFjZToge1xuICAgICAgICAgICAgICAgIGFwcGx5RWRpdDogICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbjogICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICBleGVjdXRlQ29tbWFuZDogICAgICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICBkaWRDaGFuZ2VDb25maWd1cmF0aW9uOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICB3b3Jrc3BhY2VFZGl0OiAgICAgICAgICB7IGRvY3VtZW50Q2hhbmdlczogdHJ1ZSwgcmVzb3VyY2VPcGVyYXRpb25zOiBbJ2NyZWF0ZScsICdyZW5hbWUnLCAnZGVsZXRlJ10gfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBfY29ubi5zZW5kTm90aWZpY2F0aW9uKCdpbml0aWFsaXplZCcsIHt9KTtcbiAgICBfY29ubi5zZW5kTm90aWZpY2F0aW9uKCd3b3Jrc3BhY2UvZGlkQ2hhbmdlQ29uZmlndXJhdGlvbicsIHsgc2V0dGluZ3M6IGpkdGxzU2V0dGluZ3MoKSB9KTtcblxuICAgIG9wZW5GaWxlKGZpbGVVcmkpO1xuXG4gICAgaWYgKCFfcHJvdmlkZXJzUmVnaXN0ZXJlZCkge1xuICAgICAgICBfcHJvdmlkZXJzUmVnaXN0ZXJlZCA9IHRydWU7XG4gICAgICAgIHJlZ2lzdGVyUHJvdmlkZXJzKCk7XG4gICAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBGaWxlIGxpZmVjeWNsZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFNlbmRzIHRleHREb2N1bWVudC9kaWRPcGVuIGZvciB0aGUgZ2l2ZW4gVVJJIChpZiBub3QgYWxyZWFkeSBzZW50KSBhbmQgcmVnaXN0ZXJzIGEgZGVib3VuY2VkXG4gKiB0ZXh0RG9jdW1lbnQvZGlkQ2hhbmdlIGxpc3RlbmVyIG9uIHRoZSBjb3JyZXNwb25kaW5nIE1vbmFjbyBtb2RlbC5cbiAqL1xuZnVuY3Rpb24gb3BlbkZpbGUoZmlsZVVyaTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKF9vcGVuRmlsZXMuaGFzKGZpbGVVcmkpIHx8ICFfY29ubikgcmV0dXJuO1xuICAgIF9vcGVuRmlsZXMuYWRkKGZpbGVVcmkpO1xuXG4gICAgY29uc3QgbW9kZWwgPSBtb25hY28uZWRpdG9yLmdldE1vZGVscygpLmZpbmQobSA9PiBtLnVyaS50b1N0cmluZygpID09PSBmaWxlVXJpKTtcbiAgICBfY29ubi5zZW5kTm90aWZpY2F0aW9uKCd0ZXh0RG9jdW1lbnQvZGlkT3BlbicsIHtcbiAgICAgICAgdGV4dERvY3VtZW50OiB7XG4gICAgICAgICAgICB1cmk6ICAgICAgICBmaWxlVXJpLFxuICAgICAgICAgICAgbGFuZ3VhZ2VJZDogJ2phdmEnLFxuICAgICAgICAgICAgdmVyc2lvbjogICAgMSxcbiAgICAgICAgICAgIHRleHQ6ICAgICAgIG1vZGVsPy5nZXRWYWx1ZSgpID8/ICcnLFxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgaWYgKG1vZGVsKSB7XG4gICAgICAgIGxldCB0aW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG4gICAgICAgIG1vZGVsLm9uRGlkQ2hhbmdlQ29udGVudCgoKSA9PiB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBfY29ubj8uc2VuZE5vdGlmaWNhdGlvbigndGV4dERvY3VtZW50L2RpZENoYW5nZScsIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiAgIHsgdXJpOiBmaWxlVXJpLCB2ZXJzaW9uOiBtb2RlbC5nZXRWZXJzaW9uSWQoKSB9LFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50Q2hhbmdlczogW3sgdGV4dDogbW9kZWwuZ2V0VmFsdWUoKSB9XSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sIDQwMCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gV29ya3NwYWNlIGZpbGUgcHJlZGljYXRlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogUmV0dXJucyB7QGNvZGUgdHJ1ZX0gd2hlbiB0aGUgZ2l2ZW4gbW9kZWwgVVJJIGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnRseSBjb25uZWN0ZWQgd29ya3NwYWNlLiBVc2VkXG4gKiBieSBNb25hY28gcHJvdmlkZXJzIHRvIHNraXAgbm9uLUphdmEtd29ya3NwYWNlIG1vZGVscyB3aXRob3V0IGFuIGV4YWN0LVVSSSBjb21wYXJpc29uLlxuICovXG5mdW5jdGlvbiBpc1dvcmtzcGFjZUZpbGUodXJpOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gX3dvcmtzcGFjZVJvb3QgIT09ICcnICYmIHVyaS5zdGFydHNXaXRoKF93b3Jrc3BhY2VSb290KTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gTW9uYWNvIHByb3ZpZGVyIHJlZ2lzdHJhdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiByZWdpc3RlclByb3ZpZGVycygpOiB2b2lkIHtcblxuICAgIG1vbmFjby5lZGl0b3IucmVnaXN0ZXJDb21tYW5kKEFQUExZX0FDVElPTl9DT01NQU5ELCAoX2FjY2Vzc29yOiB1bmtub3duLCBhY3Rpb246IENvZGVBY3Rpb24gfCBDb21tYW5kKSA9PiB7XG4gICAgICAgIGFwcGx5Q29kZUFjdGlvbihhY3Rpb24pO1xuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckNvbXBsZXRpb25JdGVtUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHRyaWdnZXJDaGFyYWN0ZXJzOiBbJy4nLCAnQCcsICc8J10sXG4gICAgICAgIHByb3ZpZGVDb21wbGV0aW9uSXRlbXM6IGFzeW5jIChtb2RlbCwgcG9zaXRpb24pID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgZmlsZVVyaSA9IG1vZGVsLnVyaS50b1N0cmluZygpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBDb21wbGV0aW9uTGlzdCB8IENvbXBsZXRpb25JdGVtW10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9jb21wbGV0aW9uJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IGZpbGVVcmkgfSxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogICAgIHsgbGluZTogcG9zaXRpb24ubGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogcG9zaXRpb24uY29sdW1uIC0gMSB9LFxuICAgICAgICAgICAgICAgIGNvbnRleHQ6ICAgICAgeyB0cmlnZ2VyS2luZDogMSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBpdGVtcyA9IEFycmF5LmlzQXJyYXkocmVzdWx0KSA/IHJlc3VsdCA6IChyZXN1bHQ/Lml0ZW1zID8/IFtdKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3VnZ2VzdGlvbnM6IGl0ZW1zLm1hcChpdGVtID0+IGxzcENvbXBsZXRpb25Ub01vbmFjbyhpdGVtLCBtb2RlbCwgcG9zaXRpb24pKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8vIFJlc29sdmUgZG9jdW1lbnRhdGlvbiBhbmQsIGNydWNpYWxseSwgdGhlIGF1dG8taW1wb3J0IGFkZGl0aW9uYWxUZXh0RWRpdHMgd2hpY2ggSkRULkxTIG9ubHlcbiAgICAgICAgLy8gYXR0YWNoZXMgb24gcmVzb2x2ZSBcdTIwMTQgc2VsZWN0aW5nIGEgdHlwZSB0aGVuIGluc2VydHMgaXRzIGltcG9ydCBzdGF0ZW1lbnQuXG4gICAgICAgIHJlc29sdmVDb21wbGV0aW9uSXRlbTogYXN5bmMgKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxzcCA9IChpdGVtIGFzIE1vbmFjb0NvbXBsZXRpb25JdGVtKS5fbHNwO1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhbHNwKSByZXR1cm4gaXRlbTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWQ6IENvbXBsZXRpb25JdGVtID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ2NvbXBsZXRpb25JdGVtL3Jlc29sdmUnLCBsc3ApO1xuICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZC5kb2N1bWVudGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uZG9jdW1lbnRhdGlvbiA9IHsgdmFsdWU6IG1hcmt1cFRvU3RyaW5nKHJlc29sdmVkLmRvY3VtZW50YXRpb24pLCBpc1RydXN0ZWQ6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZC5kZXRhaWwpIGl0ZW0uZGV0YWlsID0gcmVzb2x2ZWQuZGV0YWlsO1xuICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZC5hZGRpdGlvbmFsVGV4dEVkaXRzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5hZGRpdGlvbmFsVGV4dEVkaXRzID0gcmVzb2x2ZWQuYWRkaXRpb25hbFRleHRFZGl0cy5tYXAodGV4dEVkaXRUb01vbmFjbyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoJ1tqYXZhLWxzcF0gY29tcGxldGlvbiByZXNvbHZlIGZhaWxlZDonLCAoZSBhcyBFcnJvcik/Lm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVySG92ZXJQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZUhvdmVyOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVVcmkgPSBtb2RlbC51cmkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogSG92ZXIgfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9ob3ZlcicsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBmaWxlVXJpIH0sXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQ/LmNvbnRlbnRzKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRzID0gQXJyYXkuaXNBcnJheShyZXN1bHQuY29udGVudHMpID8gcmVzdWx0LmNvbnRlbnRzIDogW3Jlc3VsdC5jb250ZW50c107XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGNvbnRlbnRzOiBjb250ZW50cy5tYXAoYyA9PiAoe1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdHlwZW9mIGMgPT09ICdzdHJpbmcnID8gYyA6IChjIGFzIE1hcmt1cENvbnRlbnQpLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBpc1RydXN0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgICByYW5nZTogcmVzdWx0LnJhbmdlID8gbHNwUmFuZ2VUb01vbmFjbyhyZXN1bHQucmFuZ2UpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJTaWduYXR1cmVIZWxwUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHNpZ25hdHVyZUhlbHBUcmlnZ2VyQ2hhcmFjdGVyczogWycoJywgJywnXSxcbiAgICAgICAgcHJvdmlkZVNpZ25hdHVyZUhlbHA6IGFzeW5jIChtb2RlbCwgcG9zaXRpb24pID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgZmlsZVVyaSA9IG1vZGVsLnVyaS50b1N0cmluZygpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBTaWduYXR1cmVIZWxwIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvc2lnbmF0dXJlSGVscCcsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBmaWxlVXJpIH0sXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVzOiByZXN1bHQuc2lnbmF0dXJlcy5tYXAoKHNpZzogU2lnbmF0dXJlSW5mb3JtYXRpb24pID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogICAgICAgICBzaWcubGFiZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudGF0aW9uOiBzaWcuZG9jdW1lbnRhdGlvbiA/IG1hcmt1cFRvU3RyaW5nKHNpZy5kb2N1bWVudGF0aW9uKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6ICAgIChzaWcucGFyYW1ldGVycyA/PyBbXSkubWFwKChwOiBQYXJhbWV0ZXJJbmZvcm1hdGlvbikgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogICAgICAgICBwLmxhYmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50YXRpb246IHAuZG9jdW1lbnRhdGlvbiA/IG1hcmt1cFRvU3RyaW5nKHAuZG9jdW1lbnRhdGlvbikgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlU2lnbmF0dXJlOiByZXN1bHQuYWN0aXZlU2lnbmF0dXJlID8/IDAsXG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZVBhcmFtZXRlcjogcmVzdWx0LmFjdGl2ZVBhcmFtZXRlciA/PyAwLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge30sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckRlZmluaXRpb25Qcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZURlZmluaXRpb246IGFzeW5jIChtb2RlbCwgcG9zaXRpb24pID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgZmlsZVVyaSA9IG1vZGVsLnVyaS50b1N0cmluZygpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBMb2NhdGlvbiB8IExvY2F0aW9uW10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9kZWZpbml0aW9uJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IGZpbGVVcmkgfSxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogICAgIHsgbGluZTogcG9zaXRpb24ubGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogcG9zaXRpb24uY29sdW1uIC0gMSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBsb2NhdGlvbnMgPSBBcnJheS5pc0FycmF5KHJlc3VsdCkgPyByZXN1bHQgOiBbcmVzdWx0XTtcbiAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbnMubWFwKGxvYyA9PiAoe1xuICAgICAgICAgICAgICAgIHVyaTogICBtb25hY28uVXJpLnBhcnNlKGxvYy51cmkpLFxuICAgICAgICAgICAgICAgIHJhbmdlOiBsc3BSYW5nZVRvTW9uYWNvKGxvYy5yYW5nZSksXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyUmVmZXJlbmNlUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVSZWZlcmVuY2VzOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uLCBjb250ZXh0KSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogTG9jYXRpb25bXSB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L3JlZmVyZW5jZXMnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogICAgIHsgbGluZTogcG9zaXRpb24ubGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogcG9zaXRpb24uY29sdW1uIC0gMSB9LFxuICAgICAgICAgICAgICAgIGNvbnRleHQ6ICAgICAgeyBpbmNsdWRlRGVjbGFyYXRpb246IGNvbnRleHQuaW5jbHVkZURlY2xhcmF0aW9uIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQubWFwKGxvYyA9PiAoeyB1cmk6IG1vbmFjby5VcmkucGFyc2UobG9jLnVyaSksIHJhbmdlOiBsc3BSYW5nZVRvTW9uYWNvKGxvYy5yYW5nZSkgfSkpO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlclJlbmFtZVByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlUmVuYW1lRWRpdHM6IGFzeW5jIChtb2RlbCwgcG9zaXRpb24sIG5ld05hbWUpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiB7IGVkaXRzOiBbXSB9O1xuICAgICAgICAgICAgY29uc3QgZWRpdDogV29ya3NwYWNlRWRpdCB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L3JlbmFtZScsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICAgICAgbmV3TmFtZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHdvcmtzcGFjZUVkaXRUb01vbmFjbyhlZGl0KTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVzb2x2ZVJlbmFtZUxvY2F0aW9uOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0OiB7IHJhbmdlOiBMc3BSYW5nZTsgcGxhY2Vob2xkZXI/OiBzdHJpbmcgfSB8IExzcFJhbmdlIHwgbnVsbCA9XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvcHJlcGFyZVJlbmFtZScsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogICAgIHsgbGluZTogcG9zaXRpb24ubGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogcG9zaXRpb24uY29sdW1uIC0gMSB9LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSAncmFuZ2UnIGluIHJlc3VsdCA/IHJlc3VsdC5yYW5nZSA6IHJlc3VsdDtcbiAgICAgICAgICAgICAgICBjb25zdCBwbGFjZWhvbGRlciA9ICdwbGFjZWhvbGRlcicgaW4gcmVzdWx0ICYmIHJlc3VsdC5wbGFjZWhvbGRlclxuICAgICAgICAgICAgICAgICAgICA/IHJlc3VsdC5wbGFjZWhvbGRlclxuICAgICAgICAgICAgICAgICAgICA6IG1vZGVsLmdldFdvcmRBdFBvc2l0aW9uKHBvc2l0aW9uKT8ud29yZCA/PyAnJztcbiAgICAgICAgICAgICAgICByZXR1cm4geyByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhyYW5nZSksIHRleHQ6IHBsYWNlaG9sZGVyIH07XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICBjb25zdCB3b3JkID0gbW9kZWwuZ2V0V29yZEF0UG9zaXRpb24ocG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIHJldHVybiB3b3JkID8ge1xuICAgICAgICAgICAgICAgICAgICByYW5nZTogeyBzdGFydExpbmVOdW1iZXI6IHBvc2l0aW9uLmxpbmVOdW1iZXIsIHN0YXJ0Q29sdW1uOiB3b3JkLnN0YXJ0Q29sdW1uLCBlbmRMaW5lTnVtYmVyOiBwb3NpdGlvbi5saW5lTnVtYmVyLCBlbmRDb2x1bW46IHdvcmQuZW5kQ29sdW1uIH0sXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IHdvcmQud29yZCxcbiAgICAgICAgICAgICAgICB9IDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIFJlZ2lzdGVyaW5nIHRoaXMgcHJvdmlkZXIgYWxzbyBlbmFibGVzIGVkaXRvci5qcydzIGV4aXN0aW5nIGZvcm1hdC1vbi1zYXZlIHBhdGggZm9yIEphdmE6IHRoZVxuICAgIC8vIHNoYXJlZCBTYXZlIGFjdGlvbiBydW5zIGVkaXRvci5hY3Rpb24uZm9ybWF0RG9jdW1lbnQgd2hlbiBhdXRvLWZvcm1hdHRpbmcgaXMgb24gKHRoZSBzYW1lXG4gICAgLy8gbWVjaGFuaXNtIGFuZCBnbG9iYWwgdG9nZ2xlIHVzZWQgZm9yIFR5cGVTY3JpcHQpLlxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJEb2N1bWVudEZvcm1hdHRpbmdFZGl0UHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVEb2N1bWVudEZvcm1hdHRpbmdFZGl0czogYXN5bmMgKG1vZGVsKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGVkaXRzOiBUZXh0RWRpdFtdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvZm9ybWF0dGluZycsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6ICAgICAgeyB0YWJTaXplOiBtb2RlbC5nZXRPcHRpb25zKCkudGFiU2l6ZSwgaW5zZXJ0U3BhY2VzOiBtb2RlbC5nZXRPcHRpb25zKCkuaW5zZXJ0U3BhY2VzIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBlZGl0cyA/IGVkaXRzLm1hcCh0ZXh0RWRpdFRvTW9uYWNvKSA6IG51bGw7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyQ29kZUFjdGlvblByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlQ29kZUFjdGlvbnM6IGFzeW5jIChtb2RlbCwgcmFuZ2UsIGNvbnRleHQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVtcHR5ID0geyBhY3Rpb25zOiBbXSwgZGlzcG9zZSgpIHsgLyogbm90aGluZyB0byBkaXNwb3NlICovIH0gfTtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBlbXB0eTtcbiAgICAgICAgICAgIGNvbnN0IGRpYWdub3N0aWNzID0gKGNvbnRleHQubWFya2VycyA/PyBbXSkubWFwKG1hcmtlclRvTHNwRGlhZ25vc3RpYyk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IEFycmF5PENvZGVBY3Rpb24gfCBDb21tYW5kPiB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L2NvZGVBY3Rpb24nLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgICAgICByYW5nZTogICAgICAgIG1vbmFjb1JhbmdlVG9Mc3AocmFuZ2UpLFxuICAgICAgICAgICAgICAgIGNvbnRleHQ6ICAgICAgeyBkaWFnbm9zdGljcywgb25seTogY29udGV4dC5vbmx5ID8gW2NvbnRleHQub25seV0gOiB1bmRlZmluZWQgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQ/Lmxlbmd0aCkgcmV0dXJuIGVtcHR5O1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBhY3Rpb25zOiByZXN1bHQubWFwKGxzcENvZGVBY3Rpb25Ub01vbmFjbyksXG4gICAgICAgICAgICAgICAgZGlzcG9zZSgpIHsgLyogbm90aGluZyB0byBkaXNwb3NlICovIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgIH0sIHtcbiAgICAgICAgcHJvdmlkZWRDb2RlQWN0aW9uS2luZHM6IFsncXVpY2tmaXgnLCAncmVmYWN0b3InLCAncmVmYWN0b3IuZXh0cmFjdCcsICdyZWZhY3Rvci5pbmxpbmUnLFxuICAgICAgICAgICAgJ3JlZmFjdG9yLnJld3JpdGUnLCAnc291cmNlJywgJ3NvdXJjZS5vcmdhbml6ZUltcG9ydHMnXSxcbiAgICB9KTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gSGVscGVyc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiBsc3BTZXZlcml0eShzZXZlcml0eTogRGlhZ25vc3RpY1NldmVyaXR5IHwgdW5kZWZpbmVkKTogbW9uYWNvLk1hcmtlclNldmVyaXR5IHtcbiAgICBzd2l0Y2ggKHNldmVyaXR5KSB7XG4gICAgICAgIGNhc2UgRGlhZ25vc3RpY1NldmVyaXR5LkVycm9yOiAgICAgICByZXR1cm4gbW9uYWNvLk1hcmtlclNldmVyaXR5LkVycm9yO1xuICAgICAgICBjYXNlIERpYWdub3N0aWNTZXZlcml0eS5XYXJuaW5nOiAgICAgcmV0dXJuIG1vbmFjby5NYXJrZXJTZXZlcml0eS5XYXJuaW5nO1xuICAgICAgICBjYXNlIERpYWdub3N0aWNTZXZlcml0eS5JbmZvcm1hdGlvbjogcmV0dXJuIG1vbmFjby5NYXJrZXJTZXZlcml0eS5JbmZvO1xuICAgICAgICBjYXNlIERpYWdub3N0aWNTZXZlcml0eS5IaW50OiAgICAgICAgcmV0dXJuIG1vbmFjby5NYXJrZXJTZXZlcml0eS5IaW50O1xuICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vbmFjby5NYXJrZXJTZXZlcml0eS5FcnJvcjtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGxzcFJhbmdlVG9Nb25hY28ocjogeyBzdGFydDogeyBsaW5lOiBudW1iZXI7IGNoYXJhY3RlcjogbnVtYmVyIH07IGVuZDogeyBsaW5lOiBudW1iZXI7IGNoYXJhY3RlcjogbnVtYmVyIH0gfSk6IG1vbmFjby5JUmFuZ2Uge1xuICAgIHJldHVybiB7XG4gICAgICAgIHN0YXJ0TGluZU51bWJlcjogci5zdGFydC5saW5lICsgMSxcbiAgICAgICAgc3RhcnRDb2x1bW46ICAgICByLnN0YXJ0LmNoYXJhY3RlciArIDEsXG4gICAgICAgIGVuZExpbmVOdW1iZXI6ICAgci5lbmQubGluZSArIDEsXG4gICAgICAgIGVuZENvbHVtbjogICAgICAgci5lbmQuY2hhcmFjdGVyICsgMSxcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBtYXJrdXBUb1N0cmluZyhjOiBzdHJpbmcgfCBNYXJrdXBDb250ZW50KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdHlwZW9mIGMgPT09ICdzdHJpbmcnID8gYyA6IGMudmFsdWU7XG59XG5cbmZ1bmN0aW9uIGxzcENvbXBsZXRpb25LaW5kKGtpbmQ6IENvbXBsZXRpb25JdGVtS2luZCB8IHVuZGVmaW5lZCk6IG1vbmFjby5sYW5ndWFnZXMuQ29tcGxldGlvbkl0ZW1LaW5kIHtcbiAgICBjb25zdCBLID0gbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbUtpbmQ7XG4gICAgc3dpdGNoIChraW5kKSB7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLlRleHQ6ICAgICAgICAgIHJldHVybiBLLlRleHQ7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLk1ldGhvZDogICAgICAgIHJldHVybiBLLk1ldGhvZDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuRnVuY3Rpb246ICAgICAgcmV0dXJuIEsuRnVuY3Rpb247XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLkNvbnN0cnVjdG9yOiAgIHJldHVybiBLLkNvbnN0cnVjdG9yO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5GaWVsZDogICAgICAgICByZXR1cm4gSy5GaWVsZDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuVmFyaWFibGU6ICAgICAgcmV0dXJuIEsuVmFyaWFibGU7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLkNsYXNzOiAgICAgICAgIHJldHVybiBLLkNsYXNzO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5JbnRlcmZhY2U6ICAgICByZXR1cm4gSy5JbnRlcmZhY2U7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLk1vZHVsZTogICAgICAgIHJldHVybiBLLk1vZHVsZTtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuUHJvcGVydHk6ICAgICAgcmV0dXJuIEsuUHJvcGVydHk7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLktleXdvcmQ6ICAgICAgIHJldHVybiBLLktleXdvcmQ7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLlNuaXBwZXQ6ICAgICAgIHJldHVybiBLLlNuaXBwZXQ7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLkNvbnN0YW50OiAgICAgIHJldHVybiBLLkNvbnN0YW50O1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5TdHJ1Y3Q6ICAgICAgICByZXR1cm4gSy5TdHJ1Y3Q7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLlR5cGVQYXJhbWV0ZXI6IHJldHVybiBLLlR5cGVQYXJhbWV0ZXI7XG4gICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBLLlRleHQ7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBsc3BDb21wbGV0aW9uVG9Nb25hY28oXG4gICAgaXRlbTogQ29tcGxldGlvbkl0ZW0sXG4gICAgbW9kZWw6IG1vbmFjby5lZGl0b3IuSVRleHRNb2RlbCxcbiAgICBwb3NpdGlvbjogbW9uYWNvLlBvc2l0aW9uLFxuKTogTW9uYWNvQ29tcGxldGlvbkl0ZW0ge1xuICAgIGNvbnN0IHdvcmQgPSBtb2RlbC5nZXRXb3JkVW50aWxQb3NpdGlvbihwb3NpdGlvbik7XG4gICAgbGV0IHJhbmdlOiBtb25hY28uSVJhbmdlID0ge1xuICAgICAgICBzdGFydExpbmVOdW1iZXI6IHBvc2l0aW9uLmxpbmVOdW1iZXIsXG4gICAgICAgIHN0YXJ0Q29sdW1uOiAgICAgd29yZC5zdGFydENvbHVtbixcbiAgICAgICAgZW5kTGluZU51bWJlcjogICBwb3NpdGlvbi5saW5lTnVtYmVyLFxuICAgICAgICBlbmRDb2x1bW46ICAgICAgIHdvcmQuZW5kQ29sdW1uLFxuICAgIH07XG4gICAgbGV0IGluc2VydFRleHQgPSBpdGVtLmluc2VydFRleHQgPz8gaXRlbS5sYWJlbDtcbiAgICBjb25zdCB0ZXh0RWRpdCA9IGl0ZW0udGV4dEVkaXQgYXMgeyByYW5nZT86IExzcFJhbmdlOyByZXBsYWNlPzogTHNwUmFuZ2U7IGluc2VydD86IExzcFJhbmdlOyBuZXdUZXh0Pzogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG4gICAgaWYgKHRleHRFZGl0KSB7XG4gICAgICAgIGNvbnN0IHIgPSB0ZXh0RWRpdC5yYW5nZSA/PyB0ZXh0RWRpdC5yZXBsYWNlID8/IHRleHRFZGl0Lmluc2VydDtcbiAgICAgICAgaWYgKHIpIHJhbmdlID0gbHNwUmFuZ2VUb01vbmFjbyhyKTtcbiAgICAgICAgaWYgKHR5cGVvZiB0ZXh0RWRpdC5uZXdUZXh0ID09PSAnc3RyaW5nJykgaW5zZXJ0VGV4dCA9IHRleHRFZGl0Lm5ld1RleHQ7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdDogTW9uYWNvQ29tcGxldGlvbkl0ZW0gPSB7XG4gICAgICAgIGxhYmVsOiAgICAgICAgICAgaXRlbS5sYWJlbCxcbiAgICAgICAga2luZDogICAgICAgICAgICBsc3BDb21wbGV0aW9uS2luZChpdGVtLmtpbmQpLFxuICAgICAgICBkZXRhaWw6ICAgICAgICAgIGl0ZW0uZGV0YWlsLFxuICAgICAgICBkb2N1bWVudGF0aW9uOiAgIGl0ZW0uZG9jdW1lbnRhdGlvbiA/IHsgdmFsdWU6IG1hcmt1cFRvU3RyaW5nKGl0ZW0uZG9jdW1lbnRhdGlvbiksIGlzVHJ1c3RlZDogZmFsc2UgfSA6IHVuZGVmaW5lZCxcbiAgICAgICAgaW5zZXJ0VGV4dCxcbiAgICAgICAgaW5zZXJ0VGV4dFJ1bGVzOiBpdGVtLmluc2VydFRleHRGb3JtYXQgPT09IEluc2VydFRleHRGb3JtYXQuU25pcHBldFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG1vbmFjby5sYW5ndWFnZXMuQ29tcGxldGlvbkl0ZW1JbnNlcnRUZXh0UnVsZS5JbnNlcnRBc1NuaXBwZXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIHJhbmdlLFxuICAgICAgICBzb3J0VGV4dDogICAgICAgICAgICBzZGtQcmlvcml0aXNlZFNvcnRUZXh0KGl0ZW0pLFxuICAgICAgICBhZGRpdGlvbmFsVGV4dEVkaXRzOiBpdGVtLmFkZGl0aW9uYWxUZXh0RWRpdHM/Lm1hcCh0ZXh0RWRpdFRvTW9uYWNvKSxcbiAgICB9O1xuICAgIHJlc3VsdC5fbHNwID0gaXRlbTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFJhbmtzIERpcmlnaWJsZSBTREsgc3VnZ2VzdGlvbnMgKHtAY29kZSBvcmcuZWNsaXBzZS5kaXJpZ2libGUuc2RrLip9KSBhYm92ZSBldmVyeXRoaW5nIGVsc2UgYnlcbiAqIHByZWZpeGluZyB0aGUgc2VydmVyIHNvcnRUZXh0IHdpdGggYSBwcmlvcml0eSBidWNrZXQsIHByZXNlcnZpbmcgdGhlIHNlcnZlciBvcmRlciB3aXRoaW4gZWFjaCBidWNrZXQuXG4gKi9cbmZ1bmN0aW9uIHNka1ByaW9yaXRpc2VkU29ydFRleHQoaXRlbTogQ29tcGxldGlvbkl0ZW0pOiBzdHJpbmcge1xuICAgIGNvbnN0IGJhc2UgPSBpdGVtLnNvcnRUZXh0ID8/ICh0eXBlb2YgaXRlbS5sYWJlbCA9PT0gJ3N0cmluZycgPyBpdGVtLmxhYmVsIDogJycpO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gKGl0ZW0ubGFiZWxEZXRhaWxzICYmIHR5cGVvZiBpdGVtLmxhYmVsRGV0YWlscy5kZXNjcmlwdGlvbiA9PT0gJ3N0cmluZycpXG4gICAgICAgID8gaXRlbS5sYWJlbERldGFpbHMuZGVzY3JpcHRpb24gOiAnJztcbiAgICBjb25zdCBoYXlzdGFjayA9IGAke2l0ZW0uZGV0YWlsID8/ICcnfSAke2Rlc2NyaXB0aW9ufWA7XG4gICAgcmV0dXJuIGhheXN0YWNrLmluY2x1ZGVzKCdvcmcuZWNsaXBzZS5kaXJpZ2libGUuc2RrJykgPyBgMF8ke2Jhc2V9YCA6IGAxXyR7YmFzZX1gO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDb2RlIGFjdGlvbnMsIGNvbW1hbmRzLCByZWZhY3Rvci9nZW5lcmF0ZSwgd29ya3NwYWNlIGVkaXRzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBNb25hY28gY29tbWFuZCBpZCB1c2VkIHRvIGFwcGx5IGEgZGVmZXJyZWQgTFNQIGNvZGUgYWN0aW9uIHdoZW4gdGhlIHVzZXIgc2VsZWN0cyBpdC4gKi9cbmNvbnN0IEFQUExZX0FDVElPTl9DT01NQU5EID0gJ2RpcmlnaWJsZS5qYXZhLmFwcGx5Q29kZUFjdGlvbic7XG5cbnR5cGUgTHNwUmFuZ2UgPSB7IHN0YXJ0OiB7IGxpbmU6IG51bWJlcjsgY2hhcmFjdGVyOiBudW1iZXIgfTsgZW5kOiB7IGxpbmU6IG51bWJlcjsgY2hhcmFjdGVyOiBudW1iZXIgfSB9O1xuXG4vKiogTW9uYWNvIGNvbXBsZXRpb24gaXRlbSBjYXJyeWluZyB0aGUgb3JpZ2luYXRpbmcgTFNQIGl0ZW0gc28gcmVzb2x2ZSBjYW4gZmV0Y2ggaXRzIGltcG9ydCBlZGl0cy4gKi9cbnR5cGUgTW9uYWNvQ29tcGxldGlvbkl0ZW0gPSBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtICYgeyBfbHNwPzogQ29tcGxldGlvbkl0ZW0gfTtcblxuZnVuY3Rpb24gdGV4dEVkaXRUb01vbmFjbyhlZGl0OiBUZXh0RWRpdCk6IG1vbmFjby5sYW5ndWFnZXMuVGV4dEVkaXQge1xuICAgIHJldHVybiB7IHJhbmdlOiBsc3BSYW5nZVRvTW9uYWNvKGVkaXQucmFuZ2UpLCB0ZXh0OiBlZGl0Lm5ld1RleHQgfTtcbn1cblxuZnVuY3Rpb24gbW9uYWNvUmFuZ2VUb0xzcChyOiBtb25hY28uSVJhbmdlKTogTHNwUmFuZ2Uge1xuICAgIHJldHVybiB7XG4gICAgICAgIHN0YXJ0OiB7IGxpbmU6IHIuc3RhcnRMaW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiByLnN0YXJ0Q29sdW1uIC0gMSB9LFxuICAgICAgICBlbmQ6ICAgeyBsaW5lOiByLmVuZExpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHIuZW5kQ29sdW1uIC0gMSB9LFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIG1vbmFjb1NldmVyaXR5VG9Mc3Aoc2V2ZXJpdHk6IG1vbmFjby5NYXJrZXJTZXZlcml0eSk6IERpYWdub3N0aWNTZXZlcml0eSB7XG4gICAgc3dpdGNoIChzZXZlcml0eSkge1xuICAgICAgICBjYXNlIG1vbmFjby5NYXJrZXJTZXZlcml0eS5FcnJvcjogICByZXR1cm4gRGlhZ25vc3RpY1NldmVyaXR5LkVycm9yO1xuICAgICAgICBjYXNlIG1vbmFjby5NYXJrZXJTZXZlcml0eS5XYXJuaW5nOiByZXR1cm4gRGlhZ25vc3RpY1NldmVyaXR5Lldhcm5pbmc7XG4gICAgICAgIGNhc2UgbW9uYWNvLk1hcmtlclNldmVyaXR5LkluZm86ICAgIHJldHVybiBEaWFnbm9zdGljU2V2ZXJpdHkuSW5mb3JtYXRpb247XG4gICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBEaWFnbm9zdGljU2V2ZXJpdHkuSGludDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIG1hcmtlclRvTHNwRGlhZ25vc3RpYyhtOiBtb25hY28uZWRpdG9yLklNYXJrZXJEYXRhKTogRGlhZ25vc3RpYyB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcmFuZ2U6ICAgIHsgc3RhcnQ6IHsgbGluZTogbS5zdGFydExpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IG0uc3RhcnRDb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICAgICAgICAgIGVuZDogICB7IGxpbmU6IG0uZW5kTGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogbS5lbmRDb2x1bW4gLSAxIH0gfSxcbiAgICAgICAgbWVzc2FnZTogIG0ubWVzc2FnZSxcbiAgICAgICAgc2V2ZXJpdHk6IG1vbmFjb1NldmVyaXR5VG9Mc3AobS5zZXZlcml0eSksXG4gICAgICAgIHNvdXJjZTogICBtLnNvdXJjZSxcbiAgICB9IGFzIERpYWdub3N0aWM7XG59XG5cbmZ1bmN0aW9uIGxzcENvZGVBY3Rpb25Ub01vbmFjbyhhY3Rpb246IENvZGVBY3Rpb24gfCBDb21tYW5kKTogbW9uYWNvLmxhbmd1YWdlcy5Db2RlQWN0aW9uIHtcbiAgICBjb25zdCBpc0NvbW1hbmQgPSB0eXBlb2YgKGFjdGlvbiBhcyBDb21tYW5kKS5jb21tYW5kID09PSAnc3RyaW5nJztcbiAgICBjb25zdCB0aXRsZSA9IGFjdGlvbi50aXRsZVxuICAgICAgICA/PyAoaXNDb21tYW5kID8gKGFjdGlvbiBhcyBDb21tYW5kKS5jb21tYW5kIDogKGFjdGlvbiBhcyBDb2RlQWN0aW9uKS5jb21tYW5kPy50aXRsZSlcbiAgICAgICAgPz8gJ0FjdGlvbic7XG4gICAgY29uc3Qga2luZCA9IGlzQ29tbWFuZCA/ICdxdWlja2ZpeCcgOiAoKGFjdGlvbiBhcyBDb2RlQWN0aW9uKS5raW5kID8/ICdxdWlja2ZpeCcpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHRpdGxlLFxuICAgICAgICBraW5kLFxuICAgICAgICBkaWFnbm9zdGljczogW10sXG4gICAgICAgIGlzUHJlZmVycmVkOiAoYWN0aW9uIGFzIENvZGVBY3Rpb24pLmlzUHJlZmVycmVkLFxuICAgICAgICAvLyBBcHBseSBsYXppbHkgdGhyb3VnaCBvdXIgY29tbWFuZCBzbyB3ZSBjYW4gcmVzb2x2ZSwgcnVuIHNlcnZlciBjb21tYW5kcyBhbmQgYXBwbHkgZWRpdHMgdW5pZm9ybWx5LlxuICAgICAgICBjb21tYW5kOiB7IGlkOiBBUFBMWV9BQ1RJT05fQ09NTUFORCwgdGl0bGUsIGFyZ3VtZW50czogW2FjdGlvbl0gfSxcbiAgICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBhcHBseUNvZGVBY3Rpb24oYWN0aW9uOiBDb2RlQWN0aW9uIHwgQ29tbWFuZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghX2Nvbm4pIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIChhY3Rpb24gYXMgQ29tbWFuZCkuY29tbWFuZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGF3YWl0IHJ1blNlcnZlckNvbW1hbmQoYWN0aW9uIGFzIENvbW1hbmQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXNvbHZlZCA9IGFjdGlvbiBhcyBDb2RlQWN0aW9uO1xuICAgICAgICBpZiAoIXJlc29sdmVkLmVkaXQgJiYgKHJlc29sdmVkIGFzIHsgZGF0YT86IHVua25vd24gfSkuZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXNvbHZlZCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCdjb2RlQWN0aW9uL3Jlc29sdmUnLCByZXNvbHZlZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc29sdmVkLmVkaXQpIGFwcGx5V29ya3NwYWNlRWRpdChyZXNvbHZlZC5lZGl0KTtcbiAgICAgICAgaWYgKHJlc29sdmVkLmNvbW1hbmQpIGF3YWl0IHJ1blNlcnZlckNvbW1hbmQocmVzb2x2ZWQuY29tbWFuZCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tqYXZhLWxzcF0gY29kZSBhY3Rpb24gZmFpbGVkOicsIChlIGFzIEVycm9yKT8ubWVzc2FnZSA/PyBlKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGlzV29ya3NwYWNlRWRpdCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFdvcmtzcGFjZUVkaXQge1xuICAgIHJldHVybiAhIXZhbHVlICYmICghISh2YWx1ZSBhcyBXb3Jrc3BhY2VFZGl0KS5jaGFuZ2VzIHx8ICEhKHZhbHVlIGFzIFdvcmtzcGFjZUVkaXQpLmRvY3VtZW50Q2hhbmdlcyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1blNlcnZlckNvbW1hbmQoY21kOiBDb21tYW5kKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFfY29ubiB8fCAhY21kPy5jb21tYW5kKSByZXR1cm47XG4gICAgaWYgKEdFTkVSQVRFW2NtZC5jb21tYW5kXSkge1xuICAgICAgICBhd2FpdCBydW5HZW5lcmF0ZShjbWQuY29tbWFuZCwgY21kLmFyZ3VtZW50cyA/PyBbXSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3dvcmtzcGFjZS9leGVjdXRlQ29tbWFuZCcsIHsgY29tbWFuZDogY21kLmNvbW1hbmQsIGFyZ3VtZW50czogY21kLmFyZ3VtZW50cyA/PyBbXSB9KTtcbiAgICBpZiAoaXNXb3Jrc3BhY2VFZGl0KHJlc3VsdCkpIGFwcGx5V29ya3NwYWNlRWRpdChyZXN1bHQpO1xufVxuXG5pbnRlcmZhY2UgR2VuZXJhdGVTcGVjIHtcbiAgICBsYWJlbDogc3RyaW5nO1xuICAgIHN0YXR1czogc3RyaW5nO1xuICAgIGdlbmVyYXRlOiBzdHJpbmc7XG4gICAgbWVtYmVyczogKHN0YXR1czogYW55KSA9PiBBcnJheTx7IGxhYmVsOiBzdHJpbmc7IHJlZjogYW55IH0+O1xuICAgIGJ1aWxkQXJnczogKHByb21wdEFyZ3M6IGFueVtdLCBzdGF0dXM6IGFueSwgc2VsZWN0ZWQ6IGFueVtdKSA9PiBhbnlbXTtcbn1cblxuLyoqIE1lbWJlci1uYW1lZCBmaWVsZHMgXHUyMTkyIHBpY2tlciBsYWJlbHMuICovXG5mdW5jdGlvbiBmaWVsZExhYmVsKGY6IGFueSk6IHN0cmluZyB7XG4gICAgY29uc3QgbmFtZSA9IGY/Lm5hbWUgPz8gZj8uZmllbGROYW1lID8/ICcnO1xuICAgIGNvbnN0IHR5cGUgPSBmPy50eXBlID8/IGY/LnR5cGVOYW1lO1xuICAgIHJldHVybiB0eXBlID8gYCR7bmFtZX06ICR7dHlwZX1gIDogYCR7bmFtZX1gO1xufVxuXG4vKipcbiAqIFRoZSBKRFQuTFMgc291cmNlLWdlbmVyYXRpb24gY29tbWFuZHMgKGNvbnN0cnVjdG9ycywgZ2V0dGVycy9zZXR0ZXJzLCB0b1N0cmluZywgaGFzaENvZGUvZXF1YWxzKS5cbiAqIEVhY2ggbWFwcyB0aGUgY2xpZW50IFwiKlByb21wdFwiIGNvbW1hbmQgdG8gdGhlIHNlcnZlciBzdGF0dXMgKyBnZW5lcmF0ZSBkZWxlZ2F0ZSBjb21tYW5kczsgdGhlIHN0YXR1c1xuICogY2FsbCB5aWVsZHMgdGhlIGNhbmRpZGF0ZSBmaWVsZHMgc2hvd24gaW4gdGhlIG1lbWJlciBwaWNrZXIsIHRoZSBnZW5lcmF0ZSBjYWxsIHJldHVybnMgdGhlIGVkaXQuXG4gKi9cbmNvbnN0IEdFTkVSQVRFOiBSZWNvcmQ8c3RyaW5nLCBHZW5lcmF0ZVNwZWM+ID0ge1xuICAgICdqYXZhLmFjdGlvbi5nZW5lcmF0ZUNvbnN0cnVjdG9yc1Byb21wdCc6IHtcbiAgICAgICAgbGFiZWw6ICdTZWxlY3QgZmllbGRzIGFuZCBjb25zdHJ1Y3RvcnMnLFxuICAgICAgICBzdGF0dXM6ICdqYXZhLmFjdGlvbi5jaGVja0NvbnN0cnVjdG9yc1N0YXR1cycsXG4gICAgICAgIGdlbmVyYXRlOiAnamF2YS5hY3Rpb24uZ2VuZXJhdGVDb25zdHJ1Y3RvcnMnLFxuICAgICAgICBtZW1iZXJzOiAocykgPT4gKHM/LmZpZWxkcyA/PyBbXSkubWFwKChmOiBhbnkpID0+ICh7IGxhYmVsOiBmaWVsZExhYmVsKGYpLCByZWY6IGYgfSkpLFxuICAgICAgICBidWlsZEFyZ3M6IChhcmdzLCBzLCBzZWwpID0+IFthcmdzWzBdLCB7IGNvbnN0cnVjdG9yczogcz8uY29uc3RydWN0b3JzID8/IFtdLCBmaWVsZHM6IHNlbC5tYXAobSA9PiBtLnJlZikgfV0sXG4gICAgfSxcbiAgICAnamF2YS5hY3Rpb24uZ2VuZXJhdGVUb1N0cmluZ1Byb21wdCc6IHtcbiAgICAgICAgbGFiZWw6ICdTZWxlY3QgZmllbGRzIHRvIGluY2x1ZGUgaW4gdG9TdHJpbmcoKScsXG4gICAgICAgIHN0YXR1czogJ2phdmEuYWN0aW9uLmNoZWNrVG9TdHJpbmdTdGF0dXMnLFxuICAgICAgICBnZW5lcmF0ZTogJ2phdmEuYWN0aW9uLmdlbmVyYXRlVG9TdHJpbmcnLFxuICAgICAgICBtZW1iZXJzOiAocykgPT4gKHM/LmZpZWxkcyA/PyBbXSkubWFwKChmOiBhbnkpID0+ICh7IGxhYmVsOiBmaWVsZExhYmVsKGYpLCByZWY6IGYgfSkpLFxuICAgICAgICBidWlsZEFyZ3M6IChhcmdzLCBfcywgc2VsKSA9PiBbYXJnc1swXSwgc2VsLm1hcChtID0+IG0ucmVmKV0sXG4gICAgfSxcbiAgICAnamF2YS5hY3Rpb24uaGFzaENvZGVFcXVhbHNQcm9tcHQnOiB7XG4gICAgICAgIGxhYmVsOiAnU2VsZWN0IGZpZWxkcyBmb3IgaGFzaENvZGUoKSBhbmQgZXF1YWxzKCknLFxuICAgICAgICBzdGF0dXM6ICdqYXZhLmFjdGlvbi5jaGVja0hhc2hDb2RlRXF1YWxzU3RhdHVzJyxcbiAgICAgICAgZ2VuZXJhdGU6ICdqYXZhLmFjdGlvbi5nZW5lcmF0ZUhhc2hDb2RlRXF1YWxzJyxcbiAgICAgICAgbWVtYmVyczogKHMpID0+IChzPy5maWVsZHMgPz8gW10pLm1hcCgoZjogYW55KSA9PiAoeyBsYWJlbDogZmllbGRMYWJlbChmKSwgcmVmOiBmIH0pKSxcbiAgICAgICAgYnVpbGRBcmdzOiAoYXJncywgX3MsIHNlbCkgPT4gW2FyZ3NbMF0sIHNlbC5tYXAobSA9PiBtLnJlZiksIGZhbHNlXSxcbiAgICB9LFxuICAgICdqYXZhLmFjdGlvbi5nZW5lcmF0ZUFjY2Vzc29yc1Byb21wdCc6IHtcbiAgICAgICAgbGFiZWw6ICdTZWxlY3QgZmllbGRzIHRvIGdlbmVyYXRlIGdldHRlcnMgYW5kIHNldHRlcnMnLFxuICAgICAgICBzdGF0dXM6ICdqYXZhLmFjdGlvbi5jaGVja0FjY2Vzc29yc1N0YXR1cycsXG4gICAgICAgIGdlbmVyYXRlOiAnamF2YS5hY3Rpb24uZ2VuZXJhdGVBY2Nlc3NvcnMnLFxuICAgICAgICBtZW1iZXJzOiAocykgPT4gKHM/LmFjY2Vzc29ycyA/PyBzID8/IFtdKS5tYXAoKGE6IGFueSkgPT4gKHsgbGFiZWw6IGZpZWxkTGFiZWwoYSksIHJlZjogYSB9KSksXG4gICAgICAgIGJ1aWxkQXJnczogKGFyZ3MsIF9zLCBzZWwpID0+IFthcmdzWzBdLCBzZWwubWFwKG0gPT4gbS5yZWYpXSxcbiAgICB9LFxufTtcblxuYXN5bmMgZnVuY3Rpb24gcnVuR2VuZXJhdGUocHJvbXB0SWQ6IHN0cmluZywgYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIV9jb25uKSByZXR1cm47XG4gICAgY29uc3Qgc3BlYyA9IEdFTkVSQVRFW3Byb21wdElkXTtcbiAgICBjb25zdCBzdGF0dXMgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgnd29ya3NwYWNlL2V4ZWN1dGVDb21tYW5kJywgeyBjb21tYW5kOiBzcGVjLnN0YXR1cywgYXJndW1lbnRzOiBhcmdzIH0pO1xuICAgIGlmICghc3RhdHVzKSByZXR1cm47XG4gICAgY29uc3QgbWVtYmVycyA9IHNwZWMubWVtYmVycyhzdGF0dXMpO1xuICAgIGxldCBzZWxlY3RlZCA9IG1lbWJlcnM7XG4gICAgY29uc3QgcGlja2VyID0gKGdsb2JhbFRoaXMgYXMgYW55KS5qYXZhTHNwTWVtYmVyUGlja2VyO1xuICAgIGlmIChtZW1iZXJzLmxlbmd0aCAmJiB0eXBlb2YgcGlja2VyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNvbnN0IGNob3Nlbjogc3RyaW5nW10gfCBudWxsID0gYXdhaXQgcGlja2VyKHNwZWMubGFiZWwsIG1lbWJlcnMubWFwKG0gPT4gbS5sYWJlbCkpO1xuICAgICAgICBpZiAoY2hvc2VuID09PSBudWxsKSByZXR1cm47IC8vIHVzZXIgY2FuY2VsbGVkIHRoZSBkaWFsb2dcbiAgICAgICAgc2VsZWN0ZWQgPSBtZW1iZXJzLmZpbHRlcihtID0+IGNob3Nlbi5pbmNsdWRlcyhtLmxhYmVsKSk7XG4gICAgfVxuICAgIGNvbnN0IGVkaXQgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgnd29ya3NwYWNlL2V4ZWN1dGVDb21tYW5kJywge1xuICAgICAgICBjb21tYW5kOiBzcGVjLmdlbmVyYXRlLFxuICAgICAgICBhcmd1bWVudHM6IHNwZWMuYnVpbGRBcmdzKGFyZ3MsIHN0YXR1cywgc2VsZWN0ZWQpLFxuICAgIH0pO1xuICAgIGlmIChpc1dvcmtzcGFjZUVkaXQoZWRpdCkpIGFwcGx5V29ya3NwYWNlRWRpdChlZGl0KTtcbn1cblxuLyoqIEdyb3VwcyBhIHdvcmtzcGFjZSBlZGl0J3MgdGV4dCBlZGl0cyBieSBkb2N1bWVudCBhbmQgYXBwbGllcyB0aGVtIGluIHBsYWNlIHRvIG9wZW4gTW9uYWNvIG1vZGVscy4gKi9cbmZ1bmN0aW9uIGFwcGx5V29ya3NwYWNlRWRpdChlZGl0OiBXb3Jrc3BhY2VFZGl0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGlmICghZWRpdCkgcmV0dXJuO1xuICAgIGNvbnN0IGJ5VXJpOiBSZWNvcmQ8c3RyaW5nLCBUZXh0RWRpdFtdPiA9IHt9O1xuICAgIGlmIChlZGl0LmNoYW5nZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCB1cmkgaW4gZWRpdC5jaGFuZ2VzKSBieVVyaVt1cmldID0gKGJ5VXJpW3VyaV0gPz8gW10pLmNvbmNhdChlZGl0LmNoYW5nZXNbdXJpXSk7XG4gICAgfVxuICAgIGlmIChlZGl0LmRvY3VtZW50Q2hhbmdlcykge1xuICAgICAgICBmb3IgKGNvbnN0IGRjIG9mIGVkaXQuZG9jdW1lbnRDaGFuZ2VzIGFzIGFueVtdKSB7XG4gICAgICAgICAgICBpZiAoZGM/LnRleHREb2N1bWVudD8udXJpICYmIEFycmF5LmlzQXJyYXkoZGMuZWRpdHMpKSB7XG4gICAgICAgICAgICAgICAgYnlVcmlbZGMudGV4dERvY3VtZW50LnVyaV0gPSAoYnlVcmlbZGMudGV4dERvY3VtZW50LnVyaV0gPz8gW10pLmNvbmNhdChkYy5lZGl0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCB1cmkgaW4gYnlVcmkpIHtcbiAgICAgICAgY29uc3QgbW9kZWwgPSBtb25hY28uZWRpdG9yLmdldE1vZGVscygpLmZpbmQobSA9PiBtLnVyaS50b1N0cmluZygpID09PSB1cmkpO1xuICAgICAgICBpZiAoIW1vZGVsKSBjb250aW51ZTtcbiAgICAgICAgY29uc3Qgb3BzID0gYnlVcmlbdXJpXS5tYXAoZSA9PiAoeyByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhlLnJhbmdlKSwgdGV4dDogZS5uZXdUZXh0LCBmb3JjZU1vdmVNYXJrZXJzOiB0cnVlIH0pKTtcbiAgICAgICAgbW9kZWwucHVzaEVkaXRPcGVyYXRpb25zKFtdLCBvcHMsICgpID0+IG51bGwpO1xuICAgIH1cbn1cblxuLyoqIENvbnZlcnRzIGFuIExTUCB3b3Jrc3BhY2UgZWRpdCBpbnRvIHRoZSBNb25hY28gc2hhcGUgcmV0dXJuZWQgYnkgdGhlIHJlbmFtZSBwcm92aWRlci4gKi9cbmZ1bmN0aW9uIHdvcmtzcGFjZUVkaXRUb01vbmFjbyhlZGl0OiBXb3Jrc3BhY2VFZGl0IHwgbnVsbCk6IG1vbmFjby5sYW5ndWFnZXMuV29ya3NwYWNlRWRpdCB7XG4gICAgY29uc3QgZWRpdHM6IGFueVtdID0gW107XG4gICAgY29uc3QgcHVzaCA9ICh1cmk6IHN0cmluZywgbGlzdDogVGV4dEVkaXRbXSkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGUgb2YgbGlzdCkge1xuICAgICAgICAgICAgZWRpdHMucHVzaCh7IHJlc291cmNlOiBtb25hY28uVXJpLnBhcnNlKHVyaSksIHRleHRFZGl0OiB7IHJhbmdlOiBsc3BSYW5nZVRvTW9uYWNvKGUucmFuZ2UpLCB0ZXh0OiBlLm5ld1RleHQgfSwgdmVyc2lvbklkOiB1bmRlZmluZWQgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGlmIChlZGl0Py5jaGFuZ2VzKSB7XG4gICAgICAgIGZvciAoY29uc3QgdXJpIGluIGVkaXQuY2hhbmdlcykgcHVzaCh1cmksIGVkaXQuY2hhbmdlc1t1cmldKTtcbiAgICB9XG4gICAgaWYgKGVkaXQ/LmRvY3VtZW50Q2hhbmdlcykge1xuICAgICAgICBmb3IgKGNvbnN0IGRjIG9mIGVkaXQuZG9jdW1lbnRDaGFuZ2VzIGFzIGFueVtdKSB7XG4gICAgICAgICAgICBpZiAoZGM/LnRleHREb2N1bWVudD8udXJpICYmIEFycmF5LmlzQXJyYXkoZGMuZWRpdHMpKSBwdXNoKGRjLnRleHREb2N1bWVudC51cmksIGRjLmVkaXRzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBlZGl0cyB9O1xufVxuXG5mdW5jdGlvbiBqZHRsc1NldHRpbmdzKCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGphdmE6IHtcbiAgICAgICAgICAgIGltcG9ydDoge1xuICAgICAgICAgICAgICAgIG1hdmVuOiAgICAgIHsgZW5hYmxlZDogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIGdyYWRsZTogICAgIHsgZW5hYmxlZDogZmFsc2UgfSxcbiAgICAgICAgICAgICAgICBleGNsdXNpb25zOiBbJyoqL25vZGVfbW9kdWxlcy8qKicsICcqKi8ubWV0YWRhdGEvKionLCAnKiovYXJjaGV0eXBlLXJlc291cmNlcy8qKiddLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGF1dG9idWlsZDogeyBlbmFibGVkOiB0cnVlIH0sXG4gICAgICAgICAgICBjb21wbGV0aW9uOiB7XG4gICAgICAgICAgICAgICAgb3ZlcndyaXRlOiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgZ3Vlc3NNZXRob2RBcmd1bWVudHM6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGZpbHRlcmVkVHlwZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgJ2NvbS5zdW4uKicsICdzdW4uKicsICdqZGsuKicsXG4gICAgICAgICAgICAgICAgICAgICdvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuKicsXG4gICAgICAgICAgICAgICAgICAgICdvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLionLFxuICAgICAgICAgICAgICAgICAgICAnb3JnLmVjbGlwc2Uub3NnaS5pbnRlcm5hbC4qJyxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIGltcG9ydE9yZGVyOiBbJ2phdmEnLCAnamF2YXgnLCAnb3JnJywgJ2NvbScsICcnXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzaWduYXR1cmVIZWxwOiAgeyBlbmFibGVkOiB0cnVlIH0sXG4gICAgICAgICAgICBmb3JtYXQ6ICAgICAgICAgeyBlbmFibGVkOiB0cnVlIH0sXG4gICAgICAgICAgICBzYXZlQWN0aW9uczogICAgeyBvcmdhbml6ZUltcG9ydHM6IGZhbHNlIH0sXG4gICAgICAgIH0sXG4gICAgfTtcbn1cbiIsICIvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSAyMDI0IFR5cGVGb3ggYW5kIG90aGVycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExJQ0VOU0UgaW4gdGhlIHBhY2thZ2Ugcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5pbXBvcnQgeyBEaXNwb3NhYmxlIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuXG5leHBvcnQgY2xhc3MgRGlzcG9zYWJsZUNvbGxlY3Rpb24gaW1wbGVtZW50cyBEaXNwb3NhYmxlIHtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGlzcG9zYWJsZXM6IERpc3Bvc2FibGVbXSA9IFtdO1xuXG4gICAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICAgICAgd2hpbGUgKHRoaXMuZGlzcG9zYWJsZXMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmRpc3Bvc2FibGVzLnBvcCgpIS5kaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdXNoKGRpc3Bvc2FibGU6IERpc3Bvc2FibGUpOiBEaXNwb3NhYmxlIHtcbiAgICAgICAgY29uc3QgZGlzcG9zYWJsZXMgPSB0aGlzLmRpc3Bvc2FibGVzO1xuICAgICAgICBkaXNwb3NhYmxlcy5wdXNoKGRpc3Bvc2FibGUpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IGRpc3Bvc2FibGVzLmluZGV4T2YoZGlzcG9zYWJsZSk7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG59XG4iLCAiLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgMjAyNCBUeXBlRm94IGFuZCBvdGhlcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMSUNFTlNFIGluIHRoZSBwYWNrYWdlIHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuaW1wb3J0IHsgRGlzcG9zYWJsZSB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcbmltcG9ydCB0eXBlIHsgSUNvbm5lY3Rpb24gfSBmcm9tICcuLi9zZXJ2ZXIvY29ubmVjdGlvbi5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVdlYlNvY2tldCBleHRlbmRzIERpc3Bvc2FibGUge1xuICAgIHNlbmQoY29udGVudDogc3RyaW5nKTogdm9pZDtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIG9uTWVzc2FnZShjYjogKGRhdGE6IGFueSkgPT4gdm9pZCk6IHZvaWQ7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBvbkVycm9yKGNiOiAocmVhc29uOiBhbnkpID0+IHZvaWQpOiB2b2lkO1xuICAgIG9uQ2xvc2UoY2I6IChjb2RlOiBudW1iZXIsIHJlYXNvbjogc3RyaW5nKSA9PiB2b2lkKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJV2ViU29ja2V0Q29ubmVjdGlvbiBleHRlbmRzIElDb25uZWN0aW9uIHtcbiAgICByZWFkb25seSBzb2NrZXQ6IElXZWJTb2NrZXQ7XG59XG4iLCAiLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgMjAyNCBUeXBlRm94IGFuZCBvdGhlcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMSUNFTlNFIGluIHRoZSBwYWNrYWdlIHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuaW1wb3J0IHsgRGlzcG9zYWJsZSB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcbi8vIFRPRE86IFVzZSBlbnZpcm9ubWVudC1zcGVjaWZpYyBpbXBvcnRzICh2c2NvZGUtanNvbnJwYy9icm93c2VyIG9yIHZzY29kZS1qc29ucnBjL25vZGUpXG4vLyB3aGVuIHVwZ3JhZGluZyB0byB2c2NvZGUtanNvbnJwY0A5LngueC1uZXh0Llggd2hpY2ggc3VwcG9ydHMgcHJvcGVyIGV4cG9ydCBtYXBzXG5pbXBvcnQgeyB0eXBlIERhdGFDYWxsYmFjaywgQWJzdHJhY3RNZXNzYWdlUmVhZGVyLCBNZXNzYWdlUmVhZGVyIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuaW1wb3J0IHR5cGUgeyBJV2ViU29ja2V0IH0gZnJvbSAnLi9zb2NrZXQuanMnO1xuXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0TWVzc2FnZVJlYWRlciBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVJlYWRlciBpbXBsZW1lbnRzIE1lc3NhZ2VSZWFkZXIge1xuICAgIHByb3RlY3RlZCByZWFkb25seSBzb2NrZXQ6IElXZWJTb2NrZXQ7XG4gICAgcHJvdGVjdGVkIHN0YXRlOiAnaW5pdGlhbCcgfCAnbGlzdGVuaW5nJyB8ICdjbG9zZWQnID0gJ2luaXRpYWwnO1xuICAgIHByb3RlY3RlZCBjYWxsYmFjazogRGF0YUNhbGxiYWNrIHwgdW5kZWZpbmVkO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGV2ZW50czogQXJyYXk8eyBtZXNzYWdlPzogYW55LCBlcnJvcj86IGFueSB9PiA9IFtdO1xuXG4gICAgY29uc3RydWN0b3Ioc29ja2V0OiBJV2ViU29ja2V0KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuc29ja2V0ID0gc29ja2V0O1xuICAgICAgICB0aGlzLnNvY2tldC5vbk1lc3NhZ2UobWVzc2FnZSA9PlxuICAgICAgICAgICAgdGhpcy5yZWFkTWVzc2FnZShtZXNzYWdlKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLnNvY2tldC5vbkVycm9yKGVycm9yID0+XG4gICAgICAgICAgICB0aGlzLmZpcmVFcnJvcihlcnJvcilcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zb2NrZXQub25DbG9zZSgoY29kZSwgcmVhc29uKSA9PiB7XG4gICAgICAgICAgICBpZiAoY29kZSAhPT0gMTAwMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yOiBFcnJvciA9IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJycgKyBjb2RlLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgRXJyb3IgZHVyaW5nIHNvY2tldCByZWNvbm5lY3Q6IGNvZGUgPSAke2NvZGV9LCByZWFzb24gPSAke3JlYXNvbn1gXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmVFcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmZpcmVDbG9zZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBsaXN0ZW4oY2FsbGJhY2s6IERhdGFDYWxsYmFjayk6IERpc3Bvc2FibGUge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gJ2luaXRpYWwnKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gJ2xpc3RlbmluZyc7XG4gICAgICAgICAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgICAgICAgICB3aGlsZSAodGhpcy5ldmVudHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnQgPSB0aGlzLmV2ZW50cy5wb3AoKSE7XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50Lm1lc3NhZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlYWRNZXNzYWdlKGV2ZW50Lm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuZXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmVFcnJvcihldmVudC5lcnJvcik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlQ2xvc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jYWxsYmFjayA9PT0gY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9ICdpbml0aWFsJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjayA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgZGlzcG9zZSgpIHtcbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLnN0YXRlID0gJ2luaXRpYWwnO1xuICAgICAgICB0aGlzLmNhbGxiYWNrID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmV2ZW50cy5zcGxpY2UoMCwgdGhpcy5ldmVudHMubGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHByb3RlY3RlZCByZWFkTWVzc2FnZShtZXNzYWdlOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09ICdpbml0aWFsJykge1xuICAgICAgICAgICAgdGhpcy5ldmVudHMuc3BsaWNlKDAsIDAsIHsgbWVzc2FnZSB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlID09PSAnbGlzdGVuaW5nJykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNhbGxiYWNrIShkYXRhKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yOiBFcnJvciA9IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJycgKyA0MDAsXG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBFcnJvciBkdXJpbmcgbWVzc2FnZSBwYXJzaW5nLCByZWFzb24gPSAke3R5cGVvZiBlcnIgPT09ICdvYmplY3QnID8gKGVyciBhcyBhbnkpLm1lc3NhZ2UgOiAndW5rbm93bid9YFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZmlyZUVycm9yKGVycm9yOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09ICdpbml0aWFsJykge1xuICAgICAgICAgICAgdGhpcy5ldmVudHMuc3BsaWNlKDAsIDAsIHsgZXJyb3IgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZSA9PT0gJ2xpc3RlbmluZycpIHtcbiAgICAgICAgICAgIHN1cGVyLmZpcmVFcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZmlyZUNsb3NlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gJ2luaXRpYWwnKSB7XG4gICAgICAgICAgICB0aGlzLmV2ZW50cy5zcGxpY2UoMCwgMCwge30pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUgPT09ICdsaXN0ZW5pbmcnKSB7XG4gICAgICAgICAgICBzdXBlci5maXJlQ2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0YXRlID0gJ2Nsb3NlZCc7XG4gICAgfVxufVxuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjQgVHlwZUZveCBhbmQgb3RoZXJzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTElDRU5TRSBpbiB0aGUgcGFja2FnZSByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbmltcG9ydCB7IE1lc3NhZ2UgfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG5pbXBvcnQgeyBBYnN0cmFjdE1lc3NhZ2VXcml0ZXIsIE1lc3NhZ2VXcml0ZXIgfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG5pbXBvcnQgdHlwZSB7IElXZWJTb2NrZXQgfSBmcm9tICcuL3NvY2tldC5qcyc7XG5cbmV4cG9ydCBjbGFzcyBXZWJTb2NrZXRNZXNzYWdlV3JpdGVyIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlV3JpdGVyIGltcGxlbWVudHMgTWVzc2FnZVdyaXRlciB7XG4gICAgcHJvdGVjdGVkIGVycm9yQ291bnQgPSAwO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBzb2NrZXQ6IElXZWJTb2NrZXQ7XG5cbiAgICBjb25zdHJ1Y3Rvcihzb2NrZXQ6IElXZWJTb2NrZXQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7XG4gICAgfVxuXG4gICAgZW5kKCk6IHZvaWQge1xuICAgIH1cblxuICAgIGFzeW5jIHdyaXRlKG1zZzogTWVzc2FnZSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgY29udGVudCA9IEpTT04uc3RyaW5naWZ5KG1zZyk7XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKGNvbnRlbnQpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmVycm9yQ291bnQrKztcbiAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGUsIG1zZywgdGhpcy5lcnJvckNvdW50KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICIvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSAyMDI0IFR5cGVGb3ggYW5kIG90aGVycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExJQ0VOU0UgaW4gdGhlIHBhY2thZ2Ugcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5pbXBvcnQgdHlwZSB7IE1lc3NhZ2VDb25uZWN0aW9uLCBMb2dnZXIgfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG5pbXBvcnQgeyBjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcbmltcG9ydCB0eXBlIHsgSVdlYlNvY2tldCB9IGZyb20gJy4vc29ja2V0LmpzJztcbmltcG9ydCB7IFdlYlNvY2tldE1lc3NhZ2VSZWFkZXIgfSBmcm9tICcuL3JlYWRlci5qcyc7XG5pbXBvcnQgeyBXZWJTb2NrZXRNZXNzYWdlV3JpdGVyIH0gZnJvbSAnLi93cml0ZXIuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlV2ViU29ja2V0Q29ubmVjdGlvbihzb2NrZXQ6IElXZWJTb2NrZXQsIGxvZ2dlcjogTG9nZ2VyKTogTWVzc2FnZUNvbm5lY3Rpb24ge1xuICAgIGNvbnN0IG1lc3NhZ2VSZWFkZXIgPSBuZXcgV2ViU29ja2V0TWVzc2FnZVJlYWRlcihzb2NrZXQpO1xuICAgIGNvbnN0IG1lc3NhZ2VXcml0ZXIgPSBuZXcgV2ViU29ja2V0TWVzc2FnZVdyaXRlcihzb2NrZXQpO1xuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbihtZXNzYWdlUmVhZGVyLCBtZXNzYWdlV3JpdGVyLCBsb2dnZXIpO1xuICAgIGNvbm5lY3Rpb24ub25DbG9zZSgoKSA9PiBjb25uZWN0aW9uLmRpc3Bvc2UoKSk7XG4gICAgcmV0dXJuIGNvbm5lY3Rpb247XG59XG4iLCAiLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgMjAyNCBUeXBlRm94IGFuZCBvdGhlcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMSUNFTlNFIGluIHRoZSBwYWNrYWdlIHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuaW1wb3J0IHR5cGUgeyBNZXNzYWdlQ29ubmVjdGlvbiwgTG9nZ2VyIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuaW1wb3J0IHsgY3JlYXRlV2ViU29ja2V0Q29ubmVjdGlvbiB9IGZyb20gJy4vc29ja2V0L2Nvbm5lY3Rpb24uanMnO1xuaW1wb3J0IHR5cGUgeyBJV2ViU29ja2V0IH0gZnJvbSAnLi9zb2NrZXQvc29ja2V0LmpzJztcbmltcG9ydCB7IENvbnNvbGVMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBsaXN0ZW4ob3B0aW9uczoge1xuICAgIHdlYlNvY2tldDogV2ViU29ja2V0O1xuICAgIGxvZ2dlcj86IExvZ2dlcjtcbiAgICBvbkNvbm5lY3Rpb246IChjb25uZWN0aW9uOiBNZXNzYWdlQ29ubmVjdGlvbikgPT4gdm9pZDtcbn0pIHtcbiAgICBjb25zdCB7IHdlYlNvY2tldCwgb25Db25uZWN0aW9uIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IGxvZ2dlciA9IG9wdGlvbnMubG9nZ2VyIHx8IG5ldyBDb25zb2xlTG9nZ2VyKCk7XG4gICAgd2ViU29ja2V0Lm9ub3BlbiA9ICgpID0+IHtcbiAgICAgICAgY29uc3Qgc29ja2V0ID0gdG9Tb2NrZXQod2ViU29ja2V0KTtcbiAgICAgICAgY29uc3QgY29ubmVjdGlvbiA9IGNyZWF0ZVdlYlNvY2tldENvbm5lY3Rpb24oc29ja2V0LCBsb2dnZXIpO1xuICAgICAgICBvbkNvbm5lY3Rpb24oY29ubmVjdGlvbik7XG4gICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvU29ja2V0KHdlYlNvY2tldDogV2ViU29ja2V0KTogSVdlYlNvY2tldCB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc2VuZDogY29udGVudCA9PiB3ZWJTb2NrZXQuc2VuZChjb250ZW50KSxcbiAgICAgICAgb25NZXNzYWdlOiBjYiA9PiB7XG4gICAgICAgICAgICB3ZWJTb2NrZXQub25tZXNzYWdlID0gZXZlbnQgPT4gY2IoZXZlbnQuZGF0YSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uRXJyb3I6IGNiID0+IHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICB3ZWJTb2NrZXQub25lcnJvciA9IChldmVudDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5oYXNPd24oZXZlbnQsICdtZXNzYWdlJykpIHtcbiAgICAgICAgICAgICAgICAgICAgY2IoZXZlbnQubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgb25DbG9zZTogY2IgPT4ge1xuICAgICAgICAgICAgd2ViU29ja2V0Lm9uY2xvc2UgPSBldmVudCA9PiBjYihldmVudC5jb2RlLCBldmVudC5yZWFzb24pO1xuICAgICAgICB9LFxuICAgICAgICBkaXNwb3NlOiAoKSA9PiB3ZWJTb2NrZXQuY2xvc2UoKVxuICAgIH07XG59XG4iLCAiLypcbiAqIENvcHlyaWdodCAoYykgMjAxMC0yMDI2IEVjbGlwc2UgRGlyaWdpYmxlIGNvbnRyaWJ1dG9yc1xuICpcbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZVxuICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjIuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjIwLmh0bWxcbiAqXG4gKiBTUERYLUZpbGVDb3B5cmlnaHRUZXh0OiBFY2xpcHNlIERpcmlnaWJsZSBjb250cmlidXRvcnMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjBcbiAqL1xuXG4vKipcbiAqIExhenkgUHJveHkgc2hpbSBmb3IgTW9uYWNvIEVkaXRvciBsb2FkZWQgdmlhIEFNRC5cbiAqXG4gKiBlZGl0b3IuanMgc2V0cyBnbG9iYWxUaGlzLm1vbmFjbyBpbnNpZGUgdGhlIEFNRCByZXF1aXJlKCkgY2FsbGJhY2ssIGJlZm9yZSBhbnlcbiAqIEphdmFMc3BDbGllbnRMaWIuY29ubmVjdCgpIGNhbGwuIEFsbCBwcm9wZXJ0eSBhY2Nlc3NlcyBnbyB0aHJvdWdoIFByb3h5LmdldCgpIHRyYXBzXG4gKiBzbyB0aGV5IHJlc29sdmUgYWdhaW5zdCB0aGUgbGl2ZSB3aW5kb3cubW9uYWNvIGF0IGNhbGwgdGltZSwgbm90IGF0IGJ1bmRsZSBsb2FkIHRpbWUuXG4gKlxuICogVHlwZVNjcmlwdCByZXNvbHZlcyB0eXBlcyBmcm9tIHRoZSByZWFsIG1vbmFjby1lZGl0b3IgZGV2RGVwZW5kZW5jeTsgZXNidWlsZCByZXBsYWNlc1xuICogdGhlIFwibW9uYWNvLWVkaXRvclwiIGltcG9ydCB3aXRoIHRoaXMgZmlsZSBhdCBidW5kbGUgdGltZSB2aWEgdGhlIGFsaWFzIG9wdGlvbi5cbiAqL1xuXG50eXBlIE0gPSB0eXBlb2YgaW1wb3J0KCdtb25hY28tZWRpdG9yJyk7XG5cbmZ1bmN0aW9uIG0oKTogTSB7XG4gICAgcmV0dXJuIChnbG9iYWxUaGlzIGFzIGFueSkubW9uYWNvIGFzIE07XG59XG5cbmZ1bmN0aW9uIG5zPFQgZXh0ZW5kcyBvYmplY3Q+KGdldHRlcjogKCkgPT4gVCk6IFQge1xuICAgIHJldHVybiBuZXcgUHJveHkoe30gYXMgVCwge1xuICAgICAgICBnZXQ6IChfLCBrKSA9PiAoZ2V0dGVyKCkgYXMgYW55KVtrIGFzIHN0cmluZ10sXG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGNsczxUPihnZXR0ZXI6ICgpID0+IFQpOiBUIHtcbiAgICByZXR1cm4gbmV3IFByb3h5KGZ1bmN0aW9uICgpIHt9IGFzIGFueSwge1xuICAgICAgICBjb25zdHJ1Y3Q6IChfLCBhcmdzKSA9PiBuZXcgKGdldHRlcigpIGFzIGFueSkoLi4uYXJncyksXG4gICAgICAgIGdldDogICAgICAgKF8sIGspICAgID0+IChnZXR0ZXIoKSBhcyBhbnkpW2sgYXMgc3RyaW5nXSxcbiAgICB9KSBhcyBUO1xufVxuXG5leHBvcnQgY29uc3QgZWRpdG9yICAgICAgICAgPSBucygoKSA9PiBtKCkuZWRpdG9yKTtcbmV4cG9ydCBjb25zdCBsYW5ndWFnZXMgICAgICA9IG5zKCgpID0+IG0oKS5sYW5ndWFnZXMpO1xuZXhwb3J0IGNvbnN0IE1hcmtlclNldmVyaXR5ID0gbnMoKCkgPT4gbSgpLk1hcmtlclNldmVyaXR5KTtcbmV4cG9ydCBjb25zdCBNYXJrZXJUYWcgICAgICA9IG5zKCgpID0+IChtKCkgYXMgYW55KS5NYXJrZXJUYWcpO1xuZXhwb3J0IGNvbnN0IFVyaSAgICAgICAgICAgID0gY2xzKCgpID0+IG0oKS5VcmkpO1xuZXhwb3J0IGNvbnN0IFJhbmdlICAgICAgICAgID0gY2xzKCgpID0+IG0oKS5SYW5nZSk7XG5leHBvcnQgY29uc3QgUG9zaXRpb24gICAgICAgPSBjbHMoKCkgPT4gbSgpLlBvc2l0aW9uKTtcbmV4cG9ydCBjb25zdCBTZWxlY3Rpb24gICAgICA9IGNscygoKSA9PiBtKCkuU2VsZWN0aW9uKTtcbmV4cG9ydCBjb25zdCBLZXlDb2RlICAgICAgICA9IG5zKCgpID0+IG0oKS5LZXlDb2RlKTtcbmV4cG9ydCBjb25zdCBLZXlNb2QgICAgICAgICA9IG5zKCgpID0+IG0oKS5LZXlNb2QpO1xuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbid1c2Ugc3RyaWN0JztcbmV4cG9ydCB2YXIgRG9jdW1lbnRVcmk7XG4oZnVuY3Rpb24gKERvY3VtZW50VXJpKSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZyc7XG4gICAgfVxuICAgIERvY3VtZW50VXJpLmlzID0gaXM7XG59KShEb2N1bWVudFVyaSB8fCAoRG9jdW1lbnRVcmkgPSB7fSkpO1xuZXhwb3J0IHZhciBVUkk7XG4oZnVuY3Rpb24gKFVSSSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnO1xuICAgIH1cbiAgICBVUkkuaXMgPSBpcztcbn0pKFVSSSB8fCAoVVJJID0ge30pKTtcbmV4cG9ydCB2YXIgaW50ZWdlcjtcbihmdW5jdGlvbiAoaW50ZWdlcikge1xuICAgIGludGVnZXIuTUlOX1ZBTFVFID0gLTIxNDc0ODM2NDg7XG4gICAgaW50ZWdlci5NQVhfVkFMVUUgPSAyMTQ3NDgzNjQ3O1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIGludGVnZXIuTUlOX1ZBTFVFIDw9IHZhbHVlICYmIHZhbHVlIDw9IGludGVnZXIuTUFYX1ZBTFVFO1xuICAgIH1cbiAgICBpbnRlZ2VyLmlzID0gaXM7XG59KShpbnRlZ2VyIHx8IChpbnRlZ2VyID0ge30pKTtcbmV4cG9ydCB2YXIgdWludGVnZXI7XG4oZnVuY3Rpb24gKHVpbnRlZ2VyKSB7XG4gICAgdWludGVnZXIuTUlOX1ZBTFVFID0gMDtcbiAgICB1aW50ZWdlci5NQVhfVkFMVUUgPSAyMTQ3NDgzNjQ3O1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIHVpbnRlZ2VyLk1JTl9WQUxVRSA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSB1aW50ZWdlci5NQVhfVkFMVUU7XG4gICAgfVxuICAgIHVpbnRlZ2VyLmlzID0gaXM7XG59KSh1aW50ZWdlciB8fCAodWludGVnZXIgPSB7fSkpO1xuLyoqXG4gKiBUaGUgUG9zaXRpb24gbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgUG9zaXRpb259IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIFBvc2l0aW9uO1xuKGZ1bmN0aW9uIChQb3NpdGlvbikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgUG9zaXRpb24gbGl0ZXJhbCBmcm9tIHRoZSBnaXZlbiBsaW5lIGFuZCBjaGFyYWN0ZXIuXG4gICAgICogQHBhcmFtIGxpbmUgVGhlIHBvc2l0aW9uJ3MgbGluZS5cbiAgICAgKiBAcGFyYW0gY2hhcmFjdGVyIFRoZSBwb3NpdGlvbidzIGNoYXJhY3Rlci5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobGluZSwgY2hhcmFjdGVyKSB7XG4gICAgICAgIGlmIChsaW5lID09PSBOdW1iZXIuTUFYX1ZBTFVFKSB7XG4gICAgICAgICAgICBsaW5lID0gdWludGVnZXIuTUFYX1ZBTFVFO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFyYWN0ZXIgPT09IE51bWJlci5NQVhfVkFMVUUpIHtcbiAgICAgICAgICAgIGNoYXJhY3RlciA9IHVpbnRlZ2VyLk1BWF9WQUxVRTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBsaW5lLCBjaGFyYWN0ZXIgfTtcbiAgICB9XG4gICAgUG9zaXRpb24uY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgUG9zaXRpb259IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgSXMudWludGVnZXIoY2FuZGlkYXRlLmxpbmUpICYmIElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS5jaGFyYWN0ZXIpO1xuICAgIH1cbiAgICBQb3NpdGlvbi5pcyA9IGlzO1xufSkoUG9zaXRpb24gfHwgKFBvc2l0aW9uID0ge30pKTtcbi8qKlxuICogVGhlIFJhbmdlIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIFJhbmdlfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBSYW5nZTtcbihmdW5jdGlvbiAoUmFuZ2UpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUob25lLCB0d28sIHRocmVlLCBmb3VyKSB7XG4gICAgICAgIGlmIChJcy51aW50ZWdlcihvbmUpICYmIElzLnVpbnRlZ2VyKHR3bykgJiYgSXMudWludGVnZXIodGhyZWUpICYmIElzLnVpbnRlZ2VyKGZvdXIpKSB7XG4gICAgICAgICAgICByZXR1cm4geyBzdGFydDogUG9zaXRpb24uY3JlYXRlKG9uZSwgdHdvKSwgZW5kOiBQb3NpdGlvbi5jcmVhdGUodGhyZWUsIGZvdXIpIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoUG9zaXRpb24uaXMob25lKSAmJiBQb3NpdGlvbi5pcyh0d28pKSB7XG4gICAgICAgICAgICByZXR1cm4geyBzdGFydDogb25lLCBlbmQ6IHR3byB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSYW5nZSNjcmVhdGUgY2FsbGVkIHdpdGggaW52YWxpZCBhcmd1bWVudHNbJHtvbmV9LCAke3R3b30sICR7dGhyZWV9LCAke2ZvdXJ9XWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIFJhbmdlLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIFJhbmdlfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIFBvc2l0aW9uLmlzKGNhbmRpZGF0ZS5zdGFydCkgJiYgUG9zaXRpb24uaXMoY2FuZGlkYXRlLmVuZCk7XG4gICAgfVxuICAgIFJhbmdlLmlzID0gaXM7XG59KShSYW5nZSB8fCAoUmFuZ2UgPSB7fSkpO1xuLyoqXG4gKiBUaGUgTG9jYXRpb24gbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgTG9jYXRpb259IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIExvY2F0aW9uO1xuKGZ1bmN0aW9uIChMb2NhdGlvbikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBMb2NhdGlvbiBsaXRlcmFsLlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIGxvY2F0aW9uJ3MgdXJpLlxuICAgICAqIEBwYXJhbSByYW5nZSBUaGUgbG9jYXRpb24ncyByYW5nZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodXJpLCByYW5nZSkge1xuICAgICAgICByZXR1cm4geyB1cmksIHJhbmdlIH07XG4gICAgfVxuICAgIExvY2F0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIExvY2F0aW9ufSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgKElzLnN0cmluZyhjYW5kaWRhdGUudXJpKSB8fCBJcy51bmRlZmluZWQoY2FuZGlkYXRlLnVyaSkpO1xuICAgIH1cbiAgICBMb2NhdGlvbi5pcyA9IGlzO1xufSkoTG9jYXRpb24gfHwgKExvY2F0aW9uID0ge30pKTtcbi8qKlxuICogVGhlIExvY2F0aW9uTGluayBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBMb2NhdGlvbkxpbmt9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIExvY2F0aW9uTGluaztcbihmdW5jdGlvbiAoTG9jYXRpb25MaW5rKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIExvY2F0aW9uTGluayBsaXRlcmFsLlxuICAgICAqIEBwYXJhbSB0YXJnZXRVcmkgVGhlIGRlZmluaXRpb24ncyB1cmkuXG4gICAgICogQHBhcmFtIHRhcmdldFJhbmdlIFRoZSBmdWxsIHJhbmdlIG9mIHRoZSBkZWZpbml0aW9uLlxuICAgICAqIEBwYXJhbSB0YXJnZXRTZWxlY3Rpb25SYW5nZSBUaGUgc3BhbiBvZiB0aGUgc3ltYm9sIGRlZmluaXRpb24gYXQgdGhlIHRhcmdldC5cbiAgICAgKiBAcGFyYW0gb3JpZ2luU2VsZWN0aW9uUmFuZ2UgVGhlIHNwYW4gb2YgdGhlIHN5bWJvbCBiZWluZyBkZWZpbmVkIGluIHRoZSBvcmlnaW5hdGluZyBzb3VyY2UgZmlsZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodGFyZ2V0VXJpLCB0YXJnZXRSYW5nZSwgdGFyZ2V0U2VsZWN0aW9uUmFuZ2UsIG9yaWdpblNlbGVjdGlvblJhbmdlKSB7XG4gICAgICAgIHJldHVybiB7IHRhcmdldFVyaSwgdGFyZ2V0UmFuZ2UsIHRhcmdldFNlbGVjdGlvblJhbmdlLCBvcmlnaW5TZWxlY3Rpb25SYW5nZSB9O1xuICAgIH1cbiAgICBMb2NhdGlvbkxpbmsuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgTG9jYXRpb25MaW5rfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS50YXJnZXRSYW5nZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS50YXJnZXRVcmkpXG4gICAgICAgICAgICAmJiBSYW5nZS5pcyhjYW5kaWRhdGUudGFyZ2V0U2VsZWN0aW9uUmFuZ2UpXG4gICAgICAgICAgICAmJiAoUmFuZ2UuaXMoY2FuZGlkYXRlLm9yaWdpblNlbGVjdGlvblJhbmdlKSB8fCBJcy51bmRlZmluZWQoY2FuZGlkYXRlLm9yaWdpblNlbGVjdGlvblJhbmdlKSk7XG4gICAgfVxuICAgIExvY2F0aW9uTGluay5pcyA9IGlzO1xufSkoTG9jYXRpb25MaW5rIHx8IChMb2NhdGlvbkxpbmsgPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29sb3IgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgQ29sb3J9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIENvbG9yO1xuKGZ1bmN0aW9uIChDb2xvcikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ29sb3IgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJlZCxcbiAgICAgICAgICAgIGdyZWVuLFxuICAgICAgICAgICAgYmx1ZSxcbiAgICAgICAgICAgIGFscGhhLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBDb2xvci5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBDb2xvcn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIElzLm51bWJlclJhbmdlKGNhbmRpZGF0ZS5yZWQsIDAsIDEpXG4gICAgICAgICAgICAmJiBJcy5udW1iZXJSYW5nZShjYW5kaWRhdGUuZ3JlZW4sIDAsIDEpXG4gICAgICAgICAgICAmJiBJcy5udW1iZXJSYW5nZShjYW5kaWRhdGUuYmx1ZSwgMCwgMSlcbiAgICAgICAgICAgICYmIElzLm51bWJlclJhbmdlKGNhbmRpZGF0ZS5hbHBoYSwgMCwgMSk7XG4gICAgfVxuICAgIENvbG9yLmlzID0gaXM7XG59KShDb2xvciB8fCAoQ29sb3IgPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29sb3JJbmZvcm1hdGlvbiBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBDb2xvckluZm9ybWF0aW9ufSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBDb2xvckluZm9ybWF0aW9uO1xuKGZ1bmN0aW9uIChDb2xvckluZm9ybWF0aW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDb2xvckluZm9ybWF0aW9uIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCBjb2xvcikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmFuZ2UsXG4gICAgICAgICAgICBjb2xvcixcbiAgICAgICAgfTtcbiAgICB9XG4gICAgQ29sb3JJbmZvcm1hdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBDb2xvckluZm9ybWF0aW9ufSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiBDb2xvci5pcyhjYW5kaWRhdGUuY29sb3IpO1xuICAgIH1cbiAgICBDb2xvckluZm9ybWF0aW9uLmlzID0gaXM7XG59KShDb2xvckluZm9ybWF0aW9uIHx8IChDb2xvckluZm9ybWF0aW9uID0ge30pKTtcbi8qKlxuICogVGhlIENvbG9yIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIENvbG9yUHJlc2VudGF0aW9ufSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBDb2xvclByZXNlbnRhdGlvbjtcbihmdW5jdGlvbiAoQ29sb3JQcmVzZW50YXRpb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENvbG9ySW5mb3JtYXRpb24gbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobGFiZWwsIHRleHRFZGl0LCBhZGRpdGlvbmFsVGV4dEVkaXRzKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICAgIHRleHRFZGl0LFxuICAgICAgICAgICAgYWRkaXRpb25hbFRleHRFZGl0cyxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgQ29sb3JQcmVzZW50YXRpb24uY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgQ29sb3JJbmZvcm1hdGlvbn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUubGFiZWwpXG4gICAgICAgICAgICAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS50ZXh0RWRpdCkgfHwgVGV4dEVkaXQuaXMoY2FuZGlkYXRlKSlcbiAgICAgICAgICAgICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLmFkZGl0aW9uYWxUZXh0RWRpdHMpIHx8IElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLmFkZGl0aW9uYWxUZXh0RWRpdHMsIFRleHRFZGl0LmlzKSk7XG4gICAgfVxuICAgIENvbG9yUHJlc2VudGF0aW9uLmlzID0gaXM7XG59KShDb2xvclByZXNlbnRhdGlvbiB8fCAoQ29sb3JQcmVzZW50YXRpb24gPSB7fSkpO1xuLyoqXG4gKiBBIHNldCBvZiBwcmVkZWZpbmVkIHJhbmdlIGtpbmRzLlxuICovXG5leHBvcnQgdmFyIEZvbGRpbmdSYW5nZUtpbmQ7XG4oZnVuY3Rpb24gKEZvbGRpbmdSYW5nZUtpbmQpIHtcbiAgICAvKipcbiAgICAgKiBGb2xkaW5nIHJhbmdlIGZvciBhIGNvbW1lbnRcbiAgICAgKi9cbiAgICBGb2xkaW5nUmFuZ2VLaW5kLkNvbW1lbnQgPSAnY29tbWVudCc7XG4gICAgLyoqXG4gICAgICogRm9sZGluZyByYW5nZSBmb3IgYW4gaW1wb3J0IG9yIGluY2x1ZGVcbiAgICAgKi9cbiAgICBGb2xkaW5nUmFuZ2VLaW5kLkltcG9ydHMgPSAnaW1wb3J0cyc7XG4gICAgLyoqXG4gICAgICogRm9sZGluZyByYW5nZSBmb3IgYSByZWdpb24gKGUuZy4gYCNyZWdpb25gKVxuICAgICAqL1xuICAgIEZvbGRpbmdSYW5nZUtpbmQuUmVnaW9uID0gJ3JlZ2lvbic7XG59KShGb2xkaW5nUmFuZ2VLaW5kIHx8IChGb2xkaW5nUmFuZ2VLaW5kID0ge30pKTtcbi8qKlxuICogVGhlIGZvbGRpbmcgcmFuZ2UgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgRm9sZGluZ1JhbmdlfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBGb2xkaW5nUmFuZ2U7XG4oZnVuY3Rpb24gKEZvbGRpbmdSYW5nZSkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgRm9sZGluZ1JhbmdlIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHN0YXJ0TGluZSwgZW5kTGluZSwgc3RhcnRDaGFyYWN0ZXIsIGVuZENoYXJhY3Rlciwga2luZCwgY29sbGFwc2VkVGV4dCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICBzdGFydExpbmUsXG4gICAgICAgICAgICBlbmRMaW5lXG4gICAgICAgIH07XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKHN0YXJ0Q2hhcmFjdGVyKSkge1xuICAgICAgICAgICAgcmVzdWx0LnN0YXJ0Q2hhcmFjdGVyID0gc3RhcnRDaGFyYWN0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzLmRlZmluZWQoZW5kQ2hhcmFjdGVyKSkge1xuICAgICAgICAgICAgcmVzdWx0LmVuZENoYXJhY3RlciA9IGVuZENoYXJhY3RlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXMuZGVmaW5lZChraW5kKSkge1xuICAgICAgICAgICAgcmVzdWx0LmtpbmQgPSBraW5kO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKGNvbGxhcHNlZFRleHQpKSB7XG4gICAgICAgICAgICByZXN1bHQuY29sbGFwc2VkVGV4dCA9IGNvbGxhcHNlZFRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgRm9sZGluZ1JhbmdlLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIEZvbGRpbmdSYW5nZX0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS5zdGFydExpbmUpICYmIElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS5zdGFydExpbmUpXG4gICAgICAgICAgICAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5zdGFydENoYXJhY3RlcikgfHwgSXMudWludGVnZXIoY2FuZGlkYXRlLnN0YXJ0Q2hhcmFjdGVyKSlcbiAgICAgICAgICAgICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLmVuZENoYXJhY3RlcikgfHwgSXMudWludGVnZXIoY2FuZGlkYXRlLmVuZENoYXJhY3RlcikpXG4gICAgICAgICAgICAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5raW5kKSB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLmtpbmQpKTtcbiAgICB9XG4gICAgRm9sZGluZ1JhbmdlLmlzID0gaXM7XG59KShGb2xkaW5nUmFuZ2UgfHwgKEZvbGRpbmdSYW5nZSA9IHt9KSk7XG4vKipcbiAqIFRoZSBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb259IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb247XG4oZnVuY3Rpb24gKERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24gbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobG9jYXRpb24sIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxvY2F0aW9uLFxuICAgICAgICAgICAgbWVzc2FnZVxuICAgICAgICB9O1xuICAgIH1cbiAgICBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb259IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgTG9jYXRpb24uaXMoY2FuZGlkYXRlLmxvY2F0aW9uKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLm1lc3NhZ2UpO1xuICAgIH1cbiAgICBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uLmlzID0gaXM7XG59KShEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uIHx8IChEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uID0ge30pKTtcbi8qKlxuICogVGhlIGRpYWdub3N0aWMncyBzZXZlcml0eS5cbiAqL1xuZXhwb3J0IHZhciBEaWFnbm9zdGljU2V2ZXJpdHk7XG4oZnVuY3Rpb24gKERpYWdub3N0aWNTZXZlcml0eSkge1xuICAgIC8qKlxuICAgICAqIFJlcG9ydHMgYW4gZXJyb3IuXG4gICAgICovXG4gICAgRGlhZ25vc3RpY1NldmVyaXR5LkVycm9yID0gMTtcbiAgICAvKipcbiAgICAgKiBSZXBvcnRzIGEgd2FybmluZy5cbiAgICAgKi9cbiAgICBEaWFnbm9zdGljU2V2ZXJpdHkuV2FybmluZyA9IDI7XG4gICAgLyoqXG4gICAgICogUmVwb3J0cyBhbiBpbmZvcm1hdGlvbi5cbiAgICAgKi9cbiAgICBEaWFnbm9zdGljU2V2ZXJpdHkuSW5mb3JtYXRpb24gPSAzO1xuICAgIC8qKlxuICAgICAqIFJlcG9ydHMgYSBoaW50LlxuICAgICAqL1xuICAgIERpYWdub3N0aWNTZXZlcml0eS5IaW50ID0gNDtcbn0pKERpYWdub3N0aWNTZXZlcml0eSB8fCAoRGlhZ25vc3RpY1NldmVyaXR5ID0ge30pKTtcbi8qKlxuICogVGhlIGRpYWdub3N0aWMgdGFncy5cbiAqXG4gKiBAc2luY2UgMy4xNS4wXG4gKi9cbmV4cG9ydCB2YXIgRGlhZ25vc3RpY1RhZztcbihmdW5jdGlvbiAoRGlhZ25vc3RpY1RhZykge1xuICAgIC8qKlxuICAgICAqIFVudXNlZCBvciB1bm5lY2Vzc2FyeSBjb2RlLlxuICAgICAqXG4gICAgICogQ2xpZW50cyBhcmUgYWxsb3dlZCB0byByZW5kZXIgZGlhZ25vc3RpY3Mgd2l0aCB0aGlzIHRhZyBmYWRlZCBvdXQgaW5zdGVhZCBvZiBoYXZpbmdcbiAgICAgKiBhbiBlcnJvciBzcXVpZ2dsZS5cbiAgICAgKi9cbiAgICBEaWFnbm9zdGljVGFnLlVubmVjZXNzYXJ5ID0gMTtcbiAgICAvKipcbiAgICAgKiBEZXByZWNhdGVkIG9yIG9ic29sZXRlIGNvZGUuXG4gICAgICpcbiAgICAgKiBDbGllbnRzIGFyZSBhbGxvd2VkIHRvIHJlbmRlcmVkIGRpYWdub3N0aWNzIHdpdGggdGhpcyB0YWcgc3RyaWtlIHRocm91Z2guXG4gICAgICovXG4gICAgRGlhZ25vc3RpY1RhZy5EZXByZWNhdGVkID0gMjtcbn0pKERpYWdub3N0aWNUYWcgfHwgKERpYWdub3N0aWNUYWcgPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29kZURlc2NyaXB0aW9uIG5hbWVzcGFjZSBwcm92aWRlcyBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIGRlc2NyaXB0aW9ucyBmb3IgZGlhZ25vc3RpYyBjb2Rlcy5cbiAqXG4gKiBAc2luY2UgMy4xNi4wXG4gKi9cbmV4cG9ydCB2YXIgQ29kZURlc2NyaXB0aW9uO1xuKGZ1bmN0aW9uIChDb2RlRGVzY3JpcHRpb24pIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLmhyZWYpO1xuICAgIH1cbiAgICBDb2RlRGVzY3JpcHRpb24uaXMgPSBpcztcbn0pKENvZGVEZXNjcmlwdGlvbiB8fCAoQ29kZURlc2NyaXB0aW9uID0ge30pKTtcbi8qKlxuICogVGhlIERpYWdub3N0aWMgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgRGlhZ25vc3RpY30gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgRGlhZ25vc3RpYztcbihmdW5jdGlvbiAoRGlhZ25vc3RpYykge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgRGlhZ25vc3RpYyBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgbWVzc2FnZSwgc2V2ZXJpdHksIGNvZGUsIHNvdXJjZSwgcmVsYXRlZEluZm9ybWF0aW9uKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IHJhbmdlLCBtZXNzYWdlIH07XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKHNldmVyaXR5KSkge1xuICAgICAgICAgICAgcmVzdWx0LnNldmVyaXR5ID0gc2V2ZXJpdHk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzLmRlZmluZWQoY29kZSkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5jb2RlID0gY29kZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXMuZGVmaW5lZChzb3VyY2UpKSB7XG4gICAgICAgICAgICByZXN1bHQuc291cmNlID0gc291cmNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKHJlbGF0ZWRJbmZvcm1hdGlvbikpIHtcbiAgICAgICAgICAgIHJlc3VsdC5yZWxhdGVkSW5mb3JtYXRpb24gPSByZWxhdGVkSW5mb3JtYXRpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgRGlhZ25vc3RpYy5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBEaWFnbm9zdGljfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSlcbiAgICAgICAgICAgICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSlcbiAgICAgICAgICAgICYmIElzLnN0cmluZyhjYW5kaWRhdGUubWVzc2FnZSlcbiAgICAgICAgICAgICYmIChJcy5udW1iZXIoY2FuZGlkYXRlLnNldmVyaXR5KSB8fCBJcy51bmRlZmluZWQoY2FuZGlkYXRlLnNldmVyaXR5KSlcbiAgICAgICAgICAgICYmIChJcy5pbnRlZ2VyKGNhbmRpZGF0ZS5jb2RlKSB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLmNvZGUpIHx8IElzLnVuZGVmaW5lZChjYW5kaWRhdGUuY29kZSkpXG4gICAgICAgICAgICAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5jb2RlRGVzY3JpcHRpb24pIHx8IChJcy5zdHJpbmcoKF9hID0gY2FuZGlkYXRlLmNvZGVEZXNjcmlwdGlvbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmhyZWYpKSlcbiAgICAgICAgICAgICYmIChJcy5zdHJpbmcoY2FuZGlkYXRlLnNvdXJjZSkgfHwgSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5zb3VyY2UpKVxuICAgICAgICAgICAgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUucmVsYXRlZEluZm9ybWF0aW9uKSB8fCBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS5yZWxhdGVkSW5mb3JtYXRpb24sIERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24uaXMpKTtcbiAgICB9XG4gICAgRGlhZ25vc3RpYy5pcyA9IGlzO1xufSkoRGlhZ25vc3RpYyB8fCAoRGlhZ25vc3RpYyA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb21tYW5kIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIENvbW1hbmR9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIENvbW1hbmQ7XG4oZnVuY3Rpb24gKENvbW1hbmQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENvbW1hbmQgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodGl0bGUsIGNvbW1hbmQsIC4uLmFyZ3MpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHsgdGl0bGUsIGNvbW1hbmQgfTtcbiAgICAgICAgaWYgKElzLmRlZmluZWQoYXJncykgJiYgYXJncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXN1bHQuYXJndW1lbnRzID0gYXJncztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBDb21tYW5kLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIENvbW1hbmR9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS50aXRsZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5jb21tYW5kKTtcbiAgICB9XG4gICAgQ29tbWFuZC5pcyA9IGlzO1xufSkoQ29tbWFuZCB8fCAoQ29tbWFuZCA9IHt9KSk7XG4vKipcbiAqIFRoZSBUZXh0RWRpdCBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSByZXBsYWNlLFxuICogaW5zZXJ0IGFuZCBkZWxldGUgZWRpdHMgbW9yZSBlYXNpbHkuXG4gKi9cbmV4cG9ydCB2YXIgVGV4dEVkaXQ7XG4oZnVuY3Rpb24gKFRleHRFZGl0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHJlcGxhY2UgdGV4dCBlZGl0LlxuICAgICAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2Ugb2YgdGV4dCB0byBiZSByZXBsYWNlZC5cbiAgICAgKiBAcGFyYW0gbmV3VGV4dCBUaGUgbmV3IHRleHQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVwbGFjZShyYW5nZSwgbmV3VGV4dCkge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgbmV3VGV4dCB9O1xuICAgIH1cbiAgICBUZXh0RWRpdC5yZXBsYWNlID0gcmVwbGFjZTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc2VydCB0ZXh0IGVkaXQuXG4gICAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBwb3NpdGlvbiB0byBpbnNlcnQgdGhlIHRleHQgYXQuXG4gICAgICogQHBhcmFtIG5ld1RleHQgVGhlIHRleHQgdG8gYmUgaW5zZXJ0ZWQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5zZXJ0KHBvc2l0aW9uLCBuZXdUZXh0KSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlOiB7IHN0YXJ0OiBwb3NpdGlvbiwgZW5kOiBwb3NpdGlvbiB9LCBuZXdUZXh0IH07XG4gICAgfVxuICAgIFRleHRFZGl0Lmluc2VydCA9IGluc2VydDtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZGVsZXRlIHRleHQgZWRpdC5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlIG9mIHRleHQgdG8gYmUgZGVsZXRlZC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkZWwocmFuZ2UpIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIG5ld1RleHQ6ICcnIH07XG4gICAgfVxuICAgIFRleHRFZGl0LmRlbCA9IGRlbDtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKVxuICAgICAgICAgICAgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5uZXdUZXh0KVxuICAgICAgICAgICAgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKTtcbiAgICB9XG4gICAgVGV4dEVkaXQuaXMgPSBpcztcbn0pKFRleHRFZGl0IHx8IChUZXh0RWRpdCA9IHt9KSk7XG5leHBvcnQgdmFyIENoYW5nZUFubm90YXRpb247XG4oZnVuY3Rpb24gKENoYW5nZUFubm90YXRpb24pIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUobGFiZWwsIG5lZWRzQ29uZmlybWF0aW9uLCBkZXNjcmlwdGlvbikge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB7IGxhYmVsIH07XG4gICAgICAgIGlmIChuZWVkc0NvbmZpcm1hdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQubmVlZHNDb25maXJtYXRpb24gPSBuZWVkc0NvbmZpcm1hdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVzY3JpcHRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgQ2hhbmdlQW5ub3RhdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5sYWJlbCkgJiZcbiAgICAgICAgICAgIChJcy5ib29sZWFuKGNhbmRpZGF0ZS5uZWVkc0NvbmZpcm1hdGlvbikgfHwgY2FuZGlkYXRlLm5lZWRzQ29uZmlybWF0aW9uID09PSB1bmRlZmluZWQpICYmXG4gICAgICAgICAgICAoSXMuc3RyaW5nKGNhbmRpZGF0ZS5kZXNjcmlwdGlvbikgfHwgY2FuZGlkYXRlLmRlc2NyaXB0aW9uID09PSB1bmRlZmluZWQpO1xuICAgIH1cbiAgICBDaGFuZ2VBbm5vdGF0aW9uLmlzID0gaXM7XG59KShDaGFuZ2VBbm5vdGF0aW9uIHx8IChDaGFuZ2VBbm5vdGF0aW9uID0ge30pKTtcbmV4cG9ydCB2YXIgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXI7XG4oZnVuY3Rpb24gKENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyKSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5zdHJpbmcoY2FuZGlkYXRlKTtcbiAgICB9XG4gICAgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMgPSBpcztcbn0pKENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyIHx8IChDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllciA9IHt9KSk7XG5leHBvcnQgdmFyIEFubm90YXRlZFRleHRFZGl0O1xuKGZ1bmN0aW9uIChBbm5vdGF0ZWRUZXh0RWRpdCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYW5ub3RhdGVkIHJlcGxhY2UgdGV4dCBlZGl0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSBvZiB0ZXh0IHRvIGJlIHJlcGxhY2VkLlxuICAgICAqIEBwYXJhbSBuZXdUZXh0IFRoZSBuZXcgdGV4dC5cbiAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiBUaGUgYW5ub3RhdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXBsYWNlKHJhbmdlLCBuZXdUZXh0LCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCBuZXdUZXh0LCBhbm5vdGF0aW9uSWQ6IGFubm90YXRpb24gfTtcbiAgICB9XG4gICAgQW5ub3RhdGVkVGV4dEVkaXQucmVwbGFjZSA9IHJlcGxhY2U7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhbm5vdGF0ZWQgaW5zZXJ0IHRleHQgZWRpdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgcG9zaXRpb24gdG8gaW5zZXJ0IHRoZSB0ZXh0IGF0LlxuICAgICAqIEBwYXJhbSBuZXdUZXh0IFRoZSB0ZXh0IHRvIGJlIGluc2VydGVkLlxuICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIFRoZSBhbm5vdGF0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluc2VydChwb3NpdGlvbiwgbmV3VGV4dCwgYW5ub3RhdGlvbikge1xuICAgICAgICByZXR1cm4geyByYW5nZTogeyBzdGFydDogcG9zaXRpb24sIGVuZDogcG9zaXRpb24gfSwgbmV3VGV4dCwgYW5ub3RhdGlvbklkOiBhbm5vdGF0aW9uIH07XG4gICAgfVxuICAgIEFubm90YXRlZFRleHRFZGl0Lmluc2VydCA9IGluc2VydDtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFubm90YXRlZCBkZWxldGUgdGV4dCBlZGl0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSBvZiB0ZXh0IHRvIGJlIGRlbGV0ZWQuXG4gICAgICogQHBhcmFtIGFubm90YXRpb24gVGhlIGFubm90YXRpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gZGVsKHJhbmdlLCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCBuZXdUZXh0OiAnJywgYW5ub3RhdGlvbklkOiBhbm5vdGF0aW9uIH07XG4gICAgfVxuICAgIEFubm90YXRlZFRleHRFZGl0LmRlbCA9IGRlbDtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIFRleHRFZGl0LmlzKGNhbmRpZGF0ZSkgJiYgKENoYW5nZUFubm90YXRpb24uaXMoY2FuZGlkYXRlLmFubm90YXRpb25JZCkgfHwgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoY2FuZGlkYXRlLmFubm90YXRpb25JZCkpO1xuICAgIH1cbiAgICBBbm5vdGF0ZWRUZXh0RWRpdC5pcyA9IGlzO1xufSkoQW5ub3RhdGVkVGV4dEVkaXQgfHwgKEFubm90YXRlZFRleHRFZGl0ID0ge30pKTtcbi8qKlxuICogVGhlIFRleHREb2N1bWVudEVkaXQgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGVcbiAqIGFuIGVkaXQgdGhhdCBtYW5pcHVsYXRlcyBhIHRleHQgZG9jdW1lbnQuXG4gKi9cbmV4cG9ydCB2YXIgVGV4dERvY3VtZW50RWRpdDtcbihmdW5jdGlvbiAoVGV4dERvY3VtZW50RWRpdCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgYFRleHREb2N1bWVudEVkaXRgXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHRleHREb2N1bWVudCwgZWRpdHMpIHtcbiAgICAgICAgcmV0dXJuIHsgdGV4dERvY3VtZW50LCBlZGl0cyB9O1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnRFZGl0LmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSlcbiAgICAgICAgICAgICYmIE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllci5pcyhjYW5kaWRhdGUudGV4dERvY3VtZW50KVxuICAgICAgICAgICAgJiYgQXJyYXkuaXNBcnJheShjYW5kaWRhdGUuZWRpdHMpO1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnRFZGl0LmlzID0gaXM7XG59KShUZXh0RG9jdW1lbnRFZGl0IHx8IChUZXh0RG9jdW1lbnRFZGl0ID0ge30pKTtcbmV4cG9ydCB2YXIgQ3JlYXRlRmlsZTtcbihmdW5jdGlvbiAoQ3JlYXRlRmlsZSkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmksIG9wdGlvbnMsIGFubm90YXRpb24pIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIGtpbmQ6ICdjcmVhdGUnLFxuICAgICAgICAgICAgdXJpXG4gICAgICAgIH07XG4gICAgICAgIGlmIChvcHRpb25zICE9PSB1bmRlZmluZWQgJiYgKG9wdGlvbnMub3ZlcndyaXRlICE9PSB1bmRlZmluZWQgfHwgb3B0aW9ucy5pZ25vcmVJZkV4aXN0cyAhPT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgcmVzdWx0Lm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbm5vdGF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5hbm5vdGF0aW9uSWQgPSBhbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIENyZWF0ZUZpbGUuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBjYW5kaWRhdGUua2luZCA9PT0gJ2NyZWF0ZScgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpICYmIChjYW5kaWRhdGUub3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAoKGNhbmRpZGF0ZS5vcHRpb25zLm92ZXJ3cml0ZSA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLm9wdGlvbnMub3ZlcndyaXRlKSkgJiYgKGNhbmRpZGF0ZS5vcHRpb25zLmlnbm9yZUlmRXhpc3RzID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUub3B0aW9ucy5pZ25vcmVJZkV4aXN0cykpKSkgJiYgKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQgPT09IHVuZGVmaW5lZCB8fCBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhjYW5kaWRhdGUuYW5ub3RhdGlvbklkKSk7XG4gICAgfVxuICAgIENyZWF0ZUZpbGUuaXMgPSBpcztcbn0pKENyZWF0ZUZpbGUgfHwgKENyZWF0ZUZpbGUgPSB7fSkpO1xuZXhwb3J0IHZhciBSZW5hbWVGaWxlO1xuKGZ1bmN0aW9uIChSZW5hbWVGaWxlKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKG9sZFVyaSwgbmV3VXJpLCBvcHRpb25zLCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7XG4gICAgICAgICAgICBraW5kOiAncmVuYW1lJyxcbiAgICAgICAgICAgIG9sZFVyaSxcbiAgICAgICAgICAgIG5ld1VyaVxuICAgICAgICB9O1xuICAgICAgICBpZiAob3B0aW9ucyAhPT0gdW5kZWZpbmVkICYmIChvcHRpb25zLm92ZXJ3cml0ZSAhPT0gdW5kZWZpbmVkIHx8IG9wdGlvbnMuaWdub3JlSWZFeGlzdHMgIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgfVxuICAgICAgICBpZiAoYW5ub3RhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQuYW5ub3RhdGlvbklkID0gYW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBSZW5hbWVGaWxlLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgY2FuZGlkYXRlLmtpbmQgPT09ICdyZW5hbWUnICYmIElzLnN0cmluZyhjYW5kaWRhdGUub2xkVXJpKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLm5ld1VyaSkgJiYgKGNhbmRpZGF0ZS5vcHRpb25zID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICgoY2FuZGlkYXRlLm9wdGlvbnMub3ZlcndyaXRlID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUub3B0aW9ucy5vdmVyd3JpdGUpKSAmJiAoY2FuZGlkYXRlLm9wdGlvbnMuaWdub3JlSWZFeGlzdHMgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5vcHRpb25zLmlnbm9yZUlmRXhpc3RzKSkpKSAmJiAoY2FuZGlkYXRlLmFubm90YXRpb25JZCA9PT0gdW5kZWZpbmVkIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQpKTtcbiAgICB9XG4gICAgUmVuYW1lRmlsZS5pcyA9IGlzO1xufSkoUmVuYW1lRmlsZSB8fCAoUmVuYW1lRmlsZSA9IHt9KSk7XG5leHBvcnQgdmFyIERlbGV0ZUZpbGU7XG4oZnVuY3Rpb24gKERlbGV0ZUZpbGUpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUodXJpLCBvcHRpb25zLCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7XG4gICAgICAgICAgICBraW5kOiAnZGVsZXRlJyxcbiAgICAgICAgICAgIHVyaVxuICAgICAgICB9O1xuICAgICAgICBpZiAob3B0aW9ucyAhPT0gdW5kZWZpbmVkICYmIChvcHRpb25zLnJlY3Vyc2l2ZSAhPT0gdW5kZWZpbmVkIHx8IG9wdGlvbnMuaWdub3JlSWZOb3RFeGlzdHMgIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgfVxuICAgICAgICBpZiAoYW5ub3RhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQuYW5ub3RhdGlvbklkID0gYW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBEZWxldGVGaWxlLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgY2FuZGlkYXRlLmtpbmQgPT09ICdkZWxldGUnICYmIElzLnN0cmluZyhjYW5kaWRhdGUudXJpKSAmJiAoY2FuZGlkYXRlLm9wdGlvbnMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgKChjYW5kaWRhdGUub3B0aW9ucy5yZWN1cnNpdmUgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5vcHRpb25zLnJlY3Vyc2l2ZSkpICYmIChjYW5kaWRhdGUub3B0aW9ucy5pZ25vcmVJZk5vdEV4aXN0cyA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLm9wdGlvbnMuaWdub3JlSWZOb3RFeGlzdHMpKSkpICYmIChjYW5kaWRhdGUuYW5ub3RhdGlvbklkID09PSB1bmRlZmluZWQgfHwgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoY2FuZGlkYXRlLmFubm90YXRpb25JZCkpO1xuICAgIH1cbiAgICBEZWxldGVGaWxlLmlzID0gaXM7XG59KShEZWxldGVGaWxlIHx8IChEZWxldGVGaWxlID0ge30pKTtcbmV4cG9ydCB2YXIgV29ya3NwYWNlRWRpdDtcbihmdW5jdGlvbiAoV29ya3NwYWNlRWRpdCkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5jaGFuZ2VzICE9PSB1bmRlZmluZWQgfHwgY2FuZGlkYXRlLmRvY3VtZW50Q2hhbmdlcyAhPT0gdW5kZWZpbmVkKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5kb2N1bWVudENoYW5nZXMgPT09IHVuZGVmaW5lZCB8fCBjYW5kaWRhdGUuZG9jdW1lbnRDaGFuZ2VzLmV2ZXJ5KChjaGFuZ2UpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoSXMuc3RyaW5nKGNoYW5nZS5raW5kKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlRmlsZS5pcyhjaGFuZ2UpIHx8IFJlbmFtZUZpbGUuaXMoY2hhbmdlKSB8fCBEZWxldGVGaWxlLmlzKGNoYW5nZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gVGV4dERvY3VtZW50RWRpdC5pcyhjaGFuZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKTtcbiAgICB9XG4gICAgV29ya3NwYWNlRWRpdC5pcyA9IGlzO1xufSkoV29ya3NwYWNlRWRpdCB8fCAoV29ya3NwYWNlRWRpdCA9IHt9KSk7XG5jbGFzcyBUZXh0RWRpdENoYW5nZUltcGwge1xuICAgIGNvbnN0cnVjdG9yKGVkaXRzLCBjaGFuZ2VBbm5vdGF0aW9ucykge1xuICAgICAgICB0aGlzLmVkaXRzID0gZWRpdHM7XG4gICAgICAgIHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMgPSBjaGFuZ2VBbm5vdGF0aW9ucztcbiAgICB9XG4gICAgaW5zZXJ0KHBvc2l0aW9uLCBuZXdUZXh0LCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIGxldCBlZGl0O1xuICAgICAgICBsZXQgaWQ7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGVkaXQgPSBUZXh0RWRpdC5pbnNlcnQocG9zaXRpb24sIG5ld1RleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGFubm90YXRpb24pKSB7XG4gICAgICAgICAgICBpZCA9IGFubm90YXRpb247XG4gICAgICAgICAgICBlZGl0ID0gQW5ub3RhdGVkVGV4dEVkaXQuaW5zZXJ0KHBvc2l0aW9uLCBuZXdUZXh0LCBhbm5vdGF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYXNzZXJ0Q2hhbmdlQW5ub3RhdGlvbnModGhpcy5jaGFuZ2VBbm5vdGF0aW9ucyk7XG4gICAgICAgICAgICBpZCA9IHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMubWFuYWdlKGFubm90YXRpb24pO1xuICAgICAgICAgICAgZWRpdCA9IEFubm90YXRlZFRleHRFZGl0Lmluc2VydChwb3NpdGlvbiwgbmV3VGV4dCwgaWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWRpdHMucHVzaChlZGl0KTtcbiAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXBsYWNlKHJhbmdlLCBuZXdUZXh0LCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIGxldCBlZGl0O1xuICAgICAgICBsZXQgaWQ7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGVkaXQgPSBUZXh0RWRpdC5yZXBsYWNlKHJhbmdlLCBuZXdUZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhhbm5vdGF0aW9uKSkge1xuICAgICAgICAgICAgaWQgPSBhbm5vdGF0aW9uO1xuICAgICAgICAgICAgZWRpdCA9IEFubm90YXRlZFRleHRFZGl0LnJlcGxhY2UocmFuZ2UsIG5ld1RleHQsIGFubm90YXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hc3NlcnRDaGFuZ2VBbm5vdGF0aW9ucyh0aGlzLmNoYW5nZUFubm90YXRpb25zKTtcbiAgICAgICAgICAgIGlkID0gdGhpcy5jaGFuZ2VBbm5vdGF0aW9ucy5tYW5hZ2UoYW5ub3RhdGlvbik7XG4gICAgICAgICAgICBlZGl0ID0gQW5ub3RhdGVkVGV4dEVkaXQucmVwbGFjZShyYW5nZSwgbmV3VGV4dCwgaWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWRpdHMucHVzaChlZGl0KTtcbiAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkZWxldGUocmFuZ2UsIGFubm90YXRpb24pIHtcbiAgICAgICAgbGV0IGVkaXQ7XG4gICAgICAgIGxldCBpZDtcbiAgICAgICAgaWYgKGFubm90YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZWRpdCA9IFRleHRFZGl0LmRlbChyYW5nZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoYW5ub3RhdGlvbikpIHtcbiAgICAgICAgICAgIGlkID0gYW5ub3RhdGlvbjtcbiAgICAgICAgICAgIGVkaXQgPSBBbm5vdGF0ZWRUZXh0RWRpdC5kZWwocmFuZ2UsIGFubm90YXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hc3NlcnRDaGFuZ2VBbm5vdGF0aW9ucyh0aGlzLmNoYW5nZUFubm90YXRpb25zKTtcbiAgICAgICAgICAgIGlkID0gdGhpcy5jaGFuZ2VBbm5vdGF0aW9ucy5tYW5hZ2UoYW5ub3RhdGlvbik7XG4gICAgICAgICAgICBlZGl0ID0gQW5ub3RhdGVkVGV4dEVkaXQuZGVsKHJhbmdlLCBpZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lZGl0cy5wdXNoKGVkaXQpO1xuICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFkZChlZGl0KSB7XG4gICAgICAgIHRoaXMuZWRpdHMucHVzaChlZGl0KTtcbiAgICB9XG4gICAgYWxsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0cztcbiAgICB9XG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuZWRpdHMuc3BsaWNlKDAsIHRoaXMuZWRpdHMubGVuZ3RoKTtcbiAgICB9XG4gICAgYXNzZXJ0Q2hhbmdlQW5ub3RhdGlvbnModmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGV4dCBlZGl0IGNoYW5nZSBpcyBub3QgY29uZmlndXJlZCB0byBtYW5hZ2UgY2hhbmdlIGFubm90YXRpb25zLmApO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBBIGhlbHBlciBjbGFzc1xuICovXG5jbGFzcyBDaGFuZ2VBbm5vdGF0aW9ucyB7XG4gICAgY29uc3RydWN0b3IoYW5ub3RhdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9ucyA9PT0gdW5kZWZpbmVkID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IGFubm90YXRpb25zO1xuICAgICAgICB0aGlzLl9jb3VudGVyID0gMDtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IDA7XG4gICAgfVxuICAgIGFsbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Fubm90YXRpb25zO1xuICAgIH1cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpemU7XG4gICAgfVxuICAgIG1hbmFnZShpZE9yQW5ub3RhdGlvbiwgYW5ub3RhdGlvbikge1xuICAgICAgICBsZXQgaWQ7XG4gICAgICAgIGlmIChDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhpZE9yQW5ub3RhdGlvbikpIHtcbiAgICAgICAgICAgIGlkID0gaWRPckFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZCA9IHRoaXMubmV4dElkKCk7XG4gICAgICAgICAgICBhbm5vdGF0aW9uID0gaWRPckFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2Fubm90YXRpb25zW2lkXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYElkICR7aWR9IGlzIGFscmVhZHkgaW4gdXNlLmApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbm5vdGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gYW5ub3RhdGlvbiBwcm92aWRlZCBmb3IgaWQgJHtpZH1gKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9hbm5vdGF0aW9uc1tpZF0gPSBhbm5vdGF0aW9uO1xuICAgICAgICB0aGlzLl9zaXplKys7XG4gICAgICAgIHJldHVybiBpZDtcbiAgICB9XG4gICAgbmV4dElkKCkge1xuICAgICAgICB0aGlzLl9jb3VudGVyKys7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb3VudGVyLnRvU3RyaW5nKCk7XG4gICAgfVxufVxuLyoqXG4gKiBBIHdvcmtzcGFjZSBjaGFuZ2UgaGVscHMgY29uc3RydWN0aW5nIGNoYW5nZXMgdG8gYSB3b3Jrc3BhY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBXb3Jrc3BhY2VDaGFuZ2Uge1xuICAgIGNvbnN0cnVjdG9yKHdvcmtzcGFjZUVkaXQpIHtcbiAgICAgICAgdGhpcy5fdGV4dEVkaXRDaGFuZ2VzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgaWYgKHdvcmtzcGFjZUVkaXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdCA9IHdvcmtzcGFjZUVkaXQ7XG4gICAgICAgICAgICBpZiAod29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucyA9IG5ldyBDaGFuZ2VBbm5vdGF0aW9ucyh3b3Jrc3BhY2VFZGl0LmNoYW5nZUFubm90YXRpb25zKTtcbiAgICAgICAgICAgICAgICB3b3Jrc3BhY2VFZGl0LmNoYW5nZUFubm90YXRpb25zID0gdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMuYWxsKCk7XG4gICAgICAgICAgICAgICAgd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMuZm9yRWFjaCgoY2hhbmdlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChUZXh0RG9jdW1lbnRFZGl0LmlzKGNoYW5nZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHRFZGl0Q2hhbmdlID0gbmV3IFRleHRFZGl0Q2hhbmdlSW1wbChjaGFuZ2UuZWRpdHMsIHRoaXMuX2NoYW5nZUFubm90YXRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RleHRFZGl0Q2hhbmdlc1tjaGFuZ2UudGV4dERvY3VtZW50LnVyaV0gPSB0ZXh0RWRpdENoYW5nZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAod29ya3NwYWNlRWRpdC5jaGFuZ2VzKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMod29ya3NwYWNlRWRpdC5jaGFuZ2VzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dEVkaXRDaGFuZ2UgPSBuZXcgVGV4dEVkaXRDaGFuZ2VJbXBsKHdvcmtzcGFjZUVkaXQuY2hhbmdlc1trZXldKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGV4dEVkaXRDaGFuZ2VzW2tleV0gPSB0ZXh0RWRpdENoYW5nZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQgPSB7fTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIHtAbGluayBXb3Jrc3BhY2VFZGl0fSBsaXRlcmFsXG4gICAgICogdXNlIHRvIGJlIHJldHVybmVkIGZyb20gYSB3b3Jrc3BhY2UgZWRpdCBvcGVyYXRpb24gbGlrZSByZW5hbWUuXG4gICAgICovXG4gICAgZ2V0IGVkaXQoKSB7XG4gICAgICAgIHRoaXMuaW5pdERvY3VtZW50Q2hhbmdlcygpO1xuICAgICAgICBpZiAodGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2NoYW5nZUFubm90YXRpb25zLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZUFubm90YXRpb25zID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VBbm5vdGF0aW9ucyA9IHRoaXMuX2NoYW5nZUFubm90YXRpb25zLmFsbCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl93b3Jrc3BhY2VFZGl0O1xuICAgIH1cbiAgICBnZXRUZXh0RWRpdENoYW5nZShrZXkpIHtcbiAgICAgICAgaWYgKE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllci5pcyhrZXkpKSB7XG4gICAgICAgICAgICB0aGlzLmluaXREb2N1bWVudENoYW5nZXMoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXb3Jrc3BhY2UgZWRpdCBpcyBub3QgY29uZmlndXJlZCBmb3IgZG9jdW1lbnQgY2hhbmdlcy4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHRleHREb2N1bWVudCA9IHsgdXJpOiBrZXkudXJpLCB2ZXJzaW9uOiBrZXkudmVyc2lvbiB9O1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuX3RleHRFZGl0Q2hhbmdlc1t0ZXh0RG9jdW1lbnQudXJpXTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWRpdHMgPSBbXTtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0RG9jdW1lbnRFZGl0ID0ge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIGVkaXRzXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcy5wdXNoKHRleHREb2N1bWVudEVkaXQpO1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBUZXh0RWRpdENoYW5nZUltcGwoZWRpdHMsIHRoaXMuX2NoYW5nZUFubm90YXRpb25zKTtcbiAgICAgICAgICAgICAgICB0aGlzLl90ZXh0RWRpdENoYW5nZXNbdGV4dERvY3VtZW50LnVyaV0gPSByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pbml0Q2hhbmdlcygpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXb3Jrc3BhY2UgZWRpdCBpcyBub3QgY29uZmlndXJlZCBmb3Igbm9ybWFsIHRleHQgZWRpdCBjaGFuZ2VzLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuX3RleHRFZGl0Q2hhbmdlc1trZXldO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBsZXQgZWRpdHMgPSBbXTtcbiAgICAgICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZXNba2V5XSA9IGVkaXRzO1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBUZXh0RWRpdENoYW5nZUltcGwoZWRpdHMpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3RleHRFZGl0Q2hhbmdlc1trZXldID0gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpbml0RG9jdW1lbnRDaGFuZ2VzKCkge1xuICAgICAgICBpZiAodGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMgPT09IHVuZGVmaW5lZCAmJiB0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMgPSBuZXcgQ2hhbmdlQW5ub3RhdGlvbnMoKTtcbiAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzID0gW107XG4gICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZUFubm90YXRpb25zID0gdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMuYWxsKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaW5pdENoYW5nZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcyA9PT0gdW5kZWZpbmVkICYmIHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNyZWF0ZUZpbGUodXJpLCBvcHRpb25zT3JBbm5vdGF0aW9uLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuaW5pdERvY3VtZW50Q2hhbmdlcygpO1xuICAgICAgICBpZiAodGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXb3Jrc3BhY2UgZWRpdCBpcyBub3QgY29uZmlndXJlZCBmb3IgZG9jdW1lbnQgY2hhbmdlcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYW5ub3RhdGlvbjtcbiAgICAgICAgaWYgKENoYW5nZUFubm90YXRpb24uaXMob3B0aW9uc09yQW5ub3RhdGlvbikgfHwgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMob3B0aW9uc09yQW5ub3RhdGlvbikpIHtcbiAgICAgICAgICAgIGFubm90YXRpb24gPSBvcHRpb25zT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnNPckFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG9wZXJhdGlvbjtcbiAgICAgICAgbGV0IGlkO1xuICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcGVyYXRpb24gPSBDcmVhdGVGaWxlLmNyZWF0ZSh1cmksIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWQgPSBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhhbm5vdGF0aW9uKSA/IGFubm90YXRpb24gOiB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5tYW5hZ2UoYW5ub3RhdGlvbik7XG4gICAgICAgICAgICBvcGVyYXRpb24gPSBDcmVhdGVGaWxlLmNyZWF0ZSh1cmksIG9wdGlvbnMsIGlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcy5wdXNoKG9wZXJhdGlvbik7XG4gICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVuYW1lRmlsZShvbGRVcmksIG5ld1VyaSwgb3B0aW9uc09yQW5ub3RhdGlvbiwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLmluaXREb2N1bWVudENoYW5nZXMoKTtcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV29ya3NwYWNlIGVkaXQgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIGRvY3VtZW50IGNoYW5nZXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGFubm90YXRpb247XG4gICAgICAgIGlmIChDaGFuZ2VBbm5vdGF0aW9uLmlzKG9wdGlvbnNPckFubm90YXRpb24pIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKG9wdGlvbnNPckFubm90YXRpb24pKSB7XG4gICAgICAgICAgICBhbm5vdGF0aW9uID0gb3B0aW9uc09yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGxldCBvcGVyYXRpb247XG4gICAgICAgIGxldCBpZDtcbiAgICAgICAgaWYgKGFubm90YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3BlcmF0aW9uID0gUmVuYW1lRmlsZS5jcmVhdGUob2xkVXJpLCBuZXdVcmksIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWQgPSBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhhbm5vdGF0aW9uKSA/IGFubm90YXRpb24gOiB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5tYW5hZ2UoYW5ub3RhdGlvbik7XG4gICAgICAgICAgICBvcGVyYXRpb24gPSBSZW5hbWVGaWxlLmNyZWF0ZShvbGRVcmksIG5ld1VyaSwgb3B0aW9ucywgaWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzLnB1c2gob3BlcmF0aW9uKTtcbiAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkZWxldGVGaWxlKHVyaSwgb3B0aW9uc09yQW5ub3RhdGlvbiwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLmluaXREb2N1bWVudENoYW5nZXMoKTtcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV29ya3NwYWNlIGVkaXQgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIGRvY3VtZW50IGNoYW5nZXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGFubm90YXRpb247XG4gICAgICAgIGlmIChDaGFuZ2VBbm5vdGF0aW9uLmlzKG9wdGlvbnNPckFubm90YXRpb24pIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKG9wdGlvbnNPckFubm90YXRpb24pKSB7XG4gICAgICAgICAgICBhbm5vdGF0aW9uID0gb3B0aW9uc09yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGxldCBvcGVyYXRpb247XG4gICAgICAgIGxldCBpZDtcbiAgICAgICAgaWYgKGFubm90YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3BlcmF0aW9uID0gRGVsZXRlRmlsZS5jcmVhdGUodXJpLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlkID0gQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoYW5ub3RhdGlvbikgPyBhbm5vdGF0aW9uIDogdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMubWFuYWdlKGFubm90YXRpb24pO1xuICAgICAgICAgICAgb3BlcmF0aW9uID0gRGVsZXRlRmlsZS5jcmVhdGUodXJpLCBvcHRpb25zLCBpZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMucHVzaChvcGVyYXRpb24pO1xuICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBUaGUgVGV4dERvY3VtZW50SWRlbnRpZmllciBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBUZXh0RG9jdW1lbnRJZGVudGlmaWVyfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBUZXh0RG9jdW1lbnRJZGVudGlmaWVyO1xuKGZ1bmN0aW9uIChUZXh0RG9jdW1lbnRJZGVudGlmaWVyKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBUZXh0RG9jdW1lbnRJZGVudGlmaWVyIGxpdGVyYWwuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgZG9jdW1lbnQncyB1cmkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHVyaSkge1xuICAgICAgICByZXR1cm4geyB1cmkgfTtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50SWRlbnRpZmllci5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBUZXh0RG9jdW1lbnRJZGVudGlmaWVyfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudXJpKTtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50SWRlbnRpZmllci5pcyA9IGlzO1xufSkoVGV4dERvY3VtZW50SWRlbnRpZmllciB8fCAoVGV4dERvY3VtZW50SWRlbnRpZmllciA9IHt9KSk7XG4vKipcbiAqIFRoZSBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXJ9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXI7XG4oZnVuY3Rpb24gKFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIgbGl0ZXJhbC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSBkb2N1bWVudCdzIHVyaS5cbiAgICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgZG9jdW1lbnQncyB2ZXJzaW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmksIHZlcnNpb24pIHtcbiAgICAgICAgcmV0dXJuIHsgdXJpLCB2ZXJzaW9uIH07XG4gICAgfVxuICAgIFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSkgJiYgSXMuaW50ZWdlcihjYW5kaWRhdGUudmVyc2lvbik7XG4gICAgfVxuICAgIFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIuaXMgPSBpcztcbn0pKFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIgfHwgKFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIgPSB7fSkpO1xuLyoqXG4gKiBUaGUgT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyO1xuKGZ1bmN0aW9uIChPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciBsaXRlcmFsLlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIGRvY3VtZW50J3MgdXJpLlxuICAgICAqIEBwYXJhbSB2ZXJzaW9uIFRoZSBkb2N1bWVudCdzIHZlcnNpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHVyaSwgdmVyc2lvbikge1xuICAgICAgICByZXR1cm4geyB1cmksIHZlcnNpb24gfTtcbiAgICB9XG4gICAgT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSkgJiYgKGNhbmRpZGF0ZS52ZXJzaW9uID09PSBudWxsIHx8IElzLmludGVnZXIoY2FuZGlkYXRlLnZlcnNpb24pKTtcbiAgICB9XG4gICAgT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmlzID0gaXM7XG59KShPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIgfHwgKE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciA9IHt9KSk7XG4vKipcbiAqIFRoZSBUZXh0RG9jdW1lbnRJdGVtIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIFRleHREb2N1bWVudEl0ZW19IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIFRleHREb2N1bWVudEl0ZW07XG4oZnVuY3Rpb24gKFRleHREb2N1bWVudEl0ZW0pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFRleHREb2N1bWVudEl0ZW0gbGl0ZXJhbC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSBkb2N1bWVudCdzIHVyaS5cbiAgICAgKiBAcGFyYW0gbGFuZ3VhZ2VJZCBUaGUgZG9jdW1lbnQncyBsYW5ndWFnZSBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB2ZXJzaW9uIFRoZSBkb2N1bWVudCdzIHZlcnNpb24gbnVtYmVyLlxuICAgICAqIEBwYXJhbSB0ZXh0IFRoZSBkb2N1bWVudCdzIHRleHQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHVyaSwgbGFuZ3VhZ2VJZCwgdmVyc2lvbiwgdGV4dCkge1xuICAgICAgICByZXR1cm4geyB1cmksIGxhbmd1YWdlSWQsIHZlcnNpb24sIHRleHQgfTtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50SXRlbS5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBUZXh0RG9jdW1lbnRJdGVtfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudXJpKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLmxhbmd1YWdlSWQpICYmIElzLmludGVnZXIoY2FuZGlkYXRlLnZlcnNpb24pICYmIElzLnN0cmluZyhjYW5kaWRhdGUudGV4dCk7XG4gICAgfVxuICAgIFRleHREb2N1bWVudEl0ZW0uaXMgPSBpcztcbn0pKFRleHREb2N1bWVudEl0ZW0gfHwgKFRleHREb2N1bWVudEl0ZW0gPSB7fSkpO1xuLyoqXG4gKiBEZXNjcmliZXMgdGhlIGNvbnRlbnQgdHlwZSB0aGF0IGEgY2xpZW50IHN1cHBvcnRzIGluIHZhcmlvdXNcbiAqIHJlc3VsdCBsaXRlcmFscyBsaWtlIGBIb3ZlcmAsIGBQYXJhbWV0ZXJJbmZvYCBvciBgQ29tcGxldGlvbkl0ZW1gLlxuICpcbiAqIFBsZWFzZSBub3RlIHRoYXQgYE1hcmt1cEtpbmRzYCBtdXN0IG5vdCBzdGFydCB3aXRoIGEgYCRgLiBUaGlzIGtpbmRzXG4gKiBhcmUgcmVzZXJ2ZWQgZm9yIGludGVybmFsIHVzYWdlLlxuICovXG5leHBvcnQgdmFyIE1hcmt1cEtpbmQ7XG4oZnVuY3Rpb24gKE1hcmt1cEtpbmQpIHtcbiAgICAvKipcbiAgICAgKiBQbGFpbiB0ZXh0IGlzIHN1cHBvcnRlZCBhcyBhIGNvbnRlbnQgZm9ybWF0XG4gICAgICovXG4gICAgTWFya3VwS2luZC5QbGFpblRleHQgPSAncGxhaW50ZXh0JztcbiAgICAvKipcbiAgICAgKiBNYXJrZG93biBpcyBzdXBwb3J0ZWQgYXMgYSBjb250ZW50IGZvcm1hdFxuICAgICAqL1xuICAgIE1hcmt1cEtpbmQuTWFya2Rvd24gPSAnbWFya2Rvd24nO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBpcyBhIHZhbHVlIG9mIHRoZSB7QGxpbmsgTWFya3VwS2luZH0gdHlwZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSA9PT0gTWFya3VwS2luZC5QbGFpblRleHQgfHwgY2FuZGlkYXRlID09PSBNYXJrdXBLaW5kLk1hcmtkb3duO1xuICAgIH1cbiAgICBNYXJrdXBLaW5kLmlzID0gaXM7XG59KShNYXJrdXBLaW5kIHx8IChNYXJrdXBLaW5kID0ge30pKTtcbmV4cG9ydCB2YXIgTWFya3VwQ29udGVudDtcbihmdW5jdGlvbiAoTWFya3VwQ29udGVudCkge1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBjb25mb3JtcyB0byB0aGUge0BsaW5rIE1hcmt1cENvbnRlbnR9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwodmFsdWUpICYmIE1hcmt1cEtpbmQuaXMoY2FuZGlkYXRlLmtpbmQpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudmFsdWUpO1xuICAgIH1cbiAgICBNYXJrdXBDb250ZW50LmlzID0gaXM7XG59KShNYXJrdXBDb250ZW50IHx8IChNYXJrdXBDb250ZW50ID0ge30pKTtcbi8qKlxuICogVGhlIGtpbmQgb2YgYSBjb21wbGV0aW9uIGVudHJ5LlxuICovXG5leHBvcnQgdmFyIENvbXBsZXRpb25JdGVtS2luZDtcbihmdW5jdGlvbiAoQ29tcGxldGlvbkl0ZW1LaW5kKSB7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlRleHQgPSAxO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5NZXRob2QgPSAyO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5GdW5jdGlvbiA9IDM7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkNvbnN0cnVjdG9yID0gNDtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuRmllbGQgPSA1O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5WYXJpYWJsZSA9IDY7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkNsYXNzID0gNztcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuSW50ZXJmYWNlID0gODtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuTW9kdWxlID0gOTtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuUHJvcGVydHkgPSAxMDtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuVW5pdCA9IDExO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5WYWx1ZSA9IDEyO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5FbnVtID0gMTM7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLktleXdvcmQgPSAxNDtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuU25pcHBldCA9IDE1O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5Db2xvciA9IDE2O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5GaWxlID0gMTc7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlJlZmVyZW5jZSA9IDE4O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5Gb2xkZXIgPSAxOTtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuRW51bU1lbWJlciA9IDIwO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5Db25zdGFudCA9IDIxO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5TdHJ1Y3QgPSAyMjtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuRXZlbnQgPSAyMztcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuT3BlcmF0b3IgPSAyNDtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuVHlwZVBhcmFtZXRlciA9IDI1O1xufSkoQ29tcGxldGlvbkl0ZW1LaW5kIHx8IChDb21wbGV0aW9uSXRlbUtpbmQgPSB7fSkpO1xuLyoqXG4gKiBEZWZpbmVzIHdoZXRoZXIgdGhlIGluc2VydCB0ZXh0IGluIGEgY29tcGxldGlvbiBpdGVtIHNob3VsZCBiZSBpbnRlcnByZXRlZCBhc1xuICogcGxhaW4gdGV4dCBvciBhIHNuaXBwZXQuXG4gKi9cbmV4cG9ydCB2YXIgSW5zZXJ0VGV4dEZvcm1hdDtcbihmdW5jdGlvbiAoSW5zZXJ0VGV4dEZvcm1hdCkge1xuICAgIC8qKlxuICAgICAqIFRoZSBwcmltYXJ5IHRleHQgdG8gYmUgaW5zZXJ0ZWQgaXMgdHJlYXRlZCBhcyBhIHBsYWluIHN0cmluZy5cbiAgICAgKi9cbiAgICBJbnNlcnRUZXh0Rm9ybWF0LlBsYWluVGV4dCA9IDE7XG4gICAgLyoqXG4gICAgICogVGhlIHByaW1hcnkgdGV4dCB0byBiZSBpbnNlcnRlZCBpcyB0cmVhdGVkIGFzIGEgc25pcHBldC5cbiAgICAgKlxuICAgICAqIEEgc25pcHBldCBjYW4gZGVmaW5lIHRhYiBzdG9wcyBhbmQgcGxhY2Vob2xkZXJzIHdpdGggYCQxYCwgYCQyYFxuICAgICAqIGFuZCBgJHszOmZvb31gLiBgJDBgIGRlZmluZXMgdGhlIGZpbmFsIHRhYiBzdG9wLCBpdCBkZWZhdWx0cyB0b1xuICAgICAqIHRoZSBlbmQgb2YgdGhlIHNuaXBwZXQuIFBsYWNlaG9sZGVycyB3aXRoIGVxdWFsIGlkZW50aWZpZXJzIGFyZSBsaW5rZWQsXG4gICAgICogdGhhdCBpcyB0eXBpbmcgaW4gb25lIHdpbGwgdXBkYXRlIG90aGVycyB0b28uXG4gICAgICpcbiAgICAgKiBTZWUgYWxzbzogaHR0cHM6Ly9taWNyb3NvZnQuZ2l0aHViLmlvL2xhbmd1YWdlLXNlcnZlci1wcm90b2NvbC9zcGVjaWZpY2F0aW9ucy9zcGVjaWZpY2F0aW9uLWN1cnJlbnQvI3NuaXBwZXRfc3ludGF4XG4gICAgICovXG4gICAgSW5zZXJ0VGV4dEZvcm1hdC5TbmlwcGV0ID0gMjtcbn0pKEluc2VydFRleHRGb3JtYXQgfHwgKEluc2VydFRleHRGb3JtYXQgPSB7fSkpO1xuLyoqXG4gKiBDb21wbGV0aW9uIGl0ZW0gdGFncyBhcmUgZXh0cmEgYW5ub3RhdGlvbnMgdGhhdCB0d2VhayB0aGUgcmVuZGVyaW5nIG9mIGEgY29tcGxldGlvblxuICogaXRlbS5cbiAqXG4gKiBAc2luY2UgMy4xNS4wXG4gKi9cbmV4cG9ydCB2YXIgQ29tcGxldGlvbkl0ZW1UYWc7XG4oZnVuY3Rpb24gKENvbXBsZXRpb25JdGVtVGFnKSB7XG4gICAgLyoqXG4gICAgICogUmVuZGVyIGEgY29tcGxldGlvbiBhcyBvYnNvbGV0ZSwgdXN1YWxseSB1c2luZyBhIHN0cmlrZS1vdXQuXG4gICAgICovXG4gICAgQ29tcGxldGlvbkl0ZW1UYWcuRGVwcmVjYXRlZCA9IDE7XG59KShDb21wbGV0aW9uSXRlbVRhZyB8fCAoQ29tcGxldGlvbkl0ZW1UYWcgPSB7fSkpO1xuLyoqXG4gKiBUaGUgSW5zZXJ0UmVwbGFjZUVkaXQgbmFtZXNwYWNlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGggaW5zZXJ0IC8gcmVwbGFjZSBlZGl0cy5cbiAqXG4gKiBAc2luY2UgMy4xNi4wXG4gKi9cbmV4cG9ydCB2YXIgSW5zZXJ0UmVwbGFjZUVkaXQ7XG4oZnVuY3Rpb24gKEluc2VydFJlcGxhY2VFZGl0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBpbnNlcnQgLyByZXBsYWNlIGVkaXRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobmV3VGV4dCwgaW5zZXJ0LCByZXBsYWNlKSB7XG4gICAgICAgIHJldHVybiB7IG5ld1RleHQsIGluc2VydCwgcmVwbGFjZSB9O1xuICAgIH1cbiAgICBJbnNlcnRSZXBsYWNlRWRpdC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBJbnNlcnRSZXBsYWNlRWRpdH0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLnN0cmluZyhjYW5kaWRhdGUubmV3VGV4dCkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLmluc2VydCkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJlcGxhY2UpO1xuICAgIH1cbiAgICBJbnNlcnRSZXBsYWNlRWRpdC5pcyA9IGlzO1xufSkoSW5zZXJ0UmVwbGFjZUVkaXQgfHwgKEluc2VydFJlcGxhY2VFZGl0ID0ge30pKTtcbi8qKlxuICogSG93IHdoaXRlc3BhY2UgYW5kIGluZGVudGF0aW9uIGlzIGhhbmRsZWQgZHVyaW5nIGNvbXBsZXRpb25cbiAqIGl0ZW0gaW5zZXJ0aW9uLlxuICpcbiAqIEBzaW5jZSAzLjE2LjBcbiAqL1xuZXhwb3J0IHZhciBJbnNlcnRUZXh0TW9kZTtcbihmdW5jdGlvbiAoSW5zZXJ0VGV4dE1vZGUpIHtcbiAgICAvKipcbiAgICAgKiBUaGUgaW5zZXJ0aW9uIG9yIHJlcGxhY2Ugc3RyaW5ncyBpcyB0YWtlbiBhcyBpdCBpcy4gSWYgdGhlXG4gICAgICogdmFsdWUgaXMgbXVsdGkgbGluZSB0aGUgbGluZXMgYmVsb3cgdGhlIGN1cnNvciB3aWxsIGJlXG4gICAgICogaW5zZXJ0ZWQgdXNpbmcgdGhlIGluZGVudGF0aW9uIGRlZmluZWQgaW4gdGhlIHN0cmluZyB2YWx1ZS5cbiAgICAgKiBUaGUgY2xpZW50IHdpbGwgbm90IGFwcGx5IGFueSBraW5kIG9mIGFkanVzdG1lbnRzIHRvIHRoZVxuICAgICAqIHN0cmluZy5cbiAgICAgKi9cbiAgICBJbnNlcnRUZXh0TW9kZS5hc0lzID0gMTtcbiAgICAvKipcbiAgICAgKiBUaGUgZWRpdG9yIGFkanVzdHMgbGVhZGluZyB3aGl0ZXNwYWNlIG9mIG5ldyBsaW5lcyBzbyB0aGF0XG4gICAgICogdGhleSBtYXRjaCB0aGUgaW5kZW50YXRpb24gdXAgdG8gdGhlIGN1cnNvciBvZiB0aGUgbGluZSBmb3JcbiAgICAgKiB3aGljaCB0aGUgaXRlbSBpcyBhY2NlcHRlZC5cbiAgICAgKlxuICAgICAqIENvbnNpZGVyIGEgbGluZSBsaWtlIHRoaXM6IDwydGFicz48Y3Vyc29yPjwzdGFicz5mb28uIEFjY2VwdGluZyBhXG4gICAgICogbXVsdGkgbGluZSBjb21wbGV0aW9uIGl0ZW0gaXMgaW5kZW50ZWQgdXNpbmcgMiB0YWJzIGFuZCBhbGxcbiAgICAgKiBmb2xsb3dpbmcgbGluZXMgaW5zZXJ0ZWQgd2lsbCBiZSBpbmRlbnRlZCB1c2luZyAyIHRhYnMgYXMgd2VsbC5cbiAgICAgKi9cbiAgICBJbnNlcnRUZXh0TW9kZS5hZGp1c3RJbmRlbnRhdGlvbiA9IDI7XG59KShJbnNlcnRUZXh0TW9kZSB8fCAoSW5zZXJ0VGV4dE1vZGUgPSB7fSkpO1xuZXhwb3J0IHZhciBDb21wbGV0aW9uSXRlbUxhYmVsRGV0YWlscztcbihmdW5jdGlvbiAoQ29tcGxldGlvbkl0ZW1MYWJlbERldGFpbHMpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiAoSXMuc3RyaW5nKGNhbmRpZGF0ZS5kZXRhaWwpIHx8IGNhbmRpZGF0ZS5kZXRhaWwgPT09IHVuZGVmaW5lZCkgJiZcbiAgICAgICAgICAgIChJcy5zdHJpbmcoY2FuZGlkYXRlLmRlc2NyaXB0aW9uKSB8fCBjYW5kaWRhdGUuZGVzY3JpcHRpb24gPT09IHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIENvbXBsZXRpb25JdGVtTGFiZWxEZXRhaWxzLmlzID0gaXM7XG59KShDb21wbGV0aW9uSXRlbUxhYmVsRGV0YWlscyB8fCAoQ29tcGxldGlvbkl0ZW1MYWJlbERldGFpbHMgPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29tcGxldGlvbkl0ZW0gbmFtZXNwYWNlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGhcbiAqIGNvbXBsZXRpb24gaXRlbXMuXG4gKi9cbmV4cG9ydCB2YXIgQ29tcGxldGlvbkl0ZW07XG4oZnVuY3Rpb24gKENvbXBsZXRpb25JdGVtKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgY29tcGxldGlvbiBpdGVtIGFuZCBzZWVkIGl0IHdpdGggYSBsYWJlbC5cbiAgICAgKiBAcGFyYW0gbGFiZWwgVGhlIGNvbXBsZXRpb24gaXRlbSdzIGxhYmVsXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGxhYmVsKSB7XG4gICAgICAgIHJldHVybiB7IGxhYmVsIH07XG4gICAgfVxuICAgIENvbXBsZXRpb25JdGVtLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKENvbXBsZXRpb25JdGVtIHx8IChDb21wbGV0aW9uSXRlbSA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb21wbGV0aW9uTGlzdCBuYW1lc3BhY2UgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aFxuICogY29tcGxldGlvbiBsaXN0cy5cbiAqL1xuZXhwb3J0IHZhciBDb21wbGV0aW9uTGlzdDtcbihmdW5jdGlvbiAoQ29tcGxldGlvbkxpc3QpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGNvbXBsZXRpb24gbGlzdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpdGVtcyBUaGUgY29tcGxldGlvbiBpdGVtcy5cbiAgICAgKiBAcGFyYW0gaXNJbmNvbXBsZXRlIFRoZSBsaXN0IGlzIG5vdCBjb21wbGV0ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUoaXRlbXMsIGlzSW5jb21wbGV0ZSkge1xuICAgICAgICByZXR1cm4geyBpdGVtczogaXRlbXMgPyBpdGVtcyA6IFtdLCBpc0luY29tcGxldGU6ICEhaXNJbmNvbXBsZXRlIH07XG4gICAgfVxuICAgIENvbXBsZXRpb25MaXN0LmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKENvbXBsZXRpb25MaXN0IHx8IChDb21wbGV0aW9uTGlzdCA9IHt9KSk7XG5leHBvcnQgdmFyIE1hcmtlZFN0cmluZztcbihmdW5jdGlvbiAoTWFya2VkU3RyaW5nKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG1hcmtlZCBzdHJpbmcgZnJvbSBwbGFpbiB0ZXh0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHBsYWluVGV4dCBUaGUgcGxhaW4gdGV4dC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmcm9tUGxhaW5UZXh0KHBsYWluVGV4dCkge1xuICAgICAgICByZXR1cm4gcGxhaW5UZXh0LnJlcGxhY2UoL1tcXFxcYCpfe31bXFxdKCkjK1xcLS4hXS9nLCAnXFxcXCQmJyk7IC8vIGVzY2FwZSBtYXJrZG93biBzeW50YXggdG9rZW5zOiBodHRwOi8vZGFyaW5nZmlyZWJhbGwubmV0L3Byb2plY3RzL21hcmtkb3duL3N5bnRheCNiYWNrc2xhc2hcbiAgICB9XG4gICAgTWFya2VkU3RyaW5nLmZyb21QbGFpblRleHQgPSBmcm9tUGxhaW5UZXh0O1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBjb25mb3JtcyB0byB0aGUge0BsaW5rIE1hcmtlZFN0cmluZ30gdHlwZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLnN0cmluZyhjYW5kaWRhdGUpIHx8IChJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5sYW5ndWFnZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS52YWx1ZSkpO1xuICAgIH1cbiAgICBNYXJrZWRTdHJpbmcuaXMgPSBpcztcbn0pKE1hcmtlZFN0cmluZyB8fCAoTWFya2VkU3RyaW5nID0ge30pKTtcbmV4cG9ydCB2YXIgSG92ZXI7XG4oZnVuY3Rpb24gKEhvdmVyKSB7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgSG92ZXJ9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiAhIWNhbmRpZGF0ZSAmJiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgKE1hcmt1cENvbnRlbnQuaXMoY2FuZGlkYXRlLmNvbnRlbnRzKSB8fFxuICAgICAgICAgICAgTWFya2VkU3RyaW5nLmlzKGNhbmRpZGF0ZS5jb250ZW50cykgfHxcbiAgICAgICAgICAgIElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLmNvbnRlbnRzLCBNYXJrZWRTdHJpbmcuaXMpKSAmJiAodmFsdWUucmFuZ2UgPT09IHVuZGVmaW5lZCB8fCBSYW5nZS5pcyh2YWx1ZS5yYW5nZSkpO1xuICAgIH1cbiAgICBIb3Zlci5pcyA9IGlzO1xufSkoSG92ZXIgfHwgKEhvdmVyID0ge30pKTtcbi8qKlxuICogVGhlIFBhcmFtZXRlckluZm9ybWF0aW9uIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIFBhcmFtZXRlckluZm9ybWF0aW9ufSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBQYXJhbWV0ZXJJbmZvcm1hdGlvbjtcbihmdW5jdGlvbiAoUGFyYW1ldGVySW5mb3JtYXRpb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHBhcmFtZXRlciBpbmZvcm1hdGlvbiBsaXRlcmFsLlxuICAgICAqXG4gICAgICogQHBhcmFtIGxhYmVsIEEgbGFiZWwgc3RyaW5nLlxuICAgICAqIEBwYXJhbSBkb2N1bWVudGF0aW9uIEEgZG9jIHN0cmluZy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobGFiZWwsIGRvY3VtZW50YXRpb24pIHtcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50YXRpb24gPyB7IGxhYmVsLCBkb2N1bWVudGF0aW9uIH0gOiB7IGxhYmVsIH07XG4gICAgfVxuICAgIFBhcmFtZXRlckluZm9ybWF0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKFBhcmFtZXRlckluZm9ybWF0aW9uIHx8IChQYXJhbWV0ZXJJbmZvcm1hdGlvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBTaWduYXR1cmVJbmZvcm1hdGlvbiBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBTaWduYXR1cmVJbmZvcm1hdGlvbn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgU2lnbmF0dXJlSW5mb3JtYXRpb247XG4oZnVuY3Rpb24gKFNpZ25hdHVyZUluZm9ybWF0aW9uKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKGxhYmVsLCBkb2N1bWVudGF0aW9uLCAuLi5wYXJhbWV0ZXJzKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IGxhYmVsIH07XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKGRvY3VtZW50YXRpb24pKSB7XG4gICAgICAgICAgICByZXN1bHQuZG9jdW1lbnRhdGlvbiA9IGRvY3VtZW50YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzLmRlZmluZWQocGFyYW1ldGVycykpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wYXJhbWV0ZXJzID0gcGFyYW1ldGVycztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdC5wYXJhbWV0ZXJzID0gW107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgU2lnbmF0dXJlSW5mb3JtYXRpb24uY3JlYXRlID0gY3JlYXRlO1xufSkoU2lnbmF0dXJlSW5mb3JtYXRpb24gfHwgKFNpZ25hdHVyZUluZm9ybWF0aW9uID0ge30pKTtcbi8qKlxuICogQSBkb2N1bWVudCBoaWdobGlnaHQga2luZC5cbiAqL1xuZXhwb3J0IHZhciBEb2N1bWVudEhpZ2hsaWdodEtpbmQ7XG4oZnVuY3Rpb24gKERvY3VtZW50SGlnaGxpZ2h0S2luZCkge1xuICAgIC8qKlxuICAgICAqIEEgdGV4dHVhbCBvY2N1cnJlbmNlLlxuICAgICAqL1xuICAgIERvY3VtZW50SGlnaGxpZ2h0S2luZC5UZXh0ID0gMTtcbiAgICAvKipcbiAgICAgKiBSZWFkLWFjY2VzcyBvZiBhIHN5bWJvbCwgbGlrZSByZWFkaW5nIGEgdmFyaWFibGUuXG4gICAgICovXG4gICAgRG9jdW1lbnRIaWdobGlnaHRLaW5kLlJlYWQgPSAyO1xuICAgIC8qKlxuICAgICAqIFdyaXRlLWFjY2VzcyBvZiBhIHN5bWJvbCwgbGlrZSB3cml0aW5nIHRvIGEgdmFyaWFibGUuXG4gICAgICovXG4gICAgRG9jdW1lbnRIaWdobGlnaHRLaW5kLldyaXRlID0gMztcbn0pKERvY3VtZW50SGlnaGxpZ2h0S2luZCB8fCAoRG9jdW1lbnRIaWdobGlnaHRLaW5kID0ge30pKTtcbi8qKlxuICogRG9jdW1lbnRIaWdobGlnaHQgbmFtZXNwYWNlIHRvIHByb3ZpZGUgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBEb2N1bWVudEhpZ2hsaWdodH0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgRG9jdW1lbnRIaWdobGlnaHQ7XG4oZnVuY3Rpb24gKERvY3VtZW50SGlnaGxpZ2h0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgRG9jdW1lbnRIaWdobGlnaHQgb2JqZWN0LlxuICAgICAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2UgdGhlIGhpZ2hsaWdodCBhcHBsaWVzIHRvLlxuICAgICAqIEBwYXJhbSBraW5kIFRoZSBoaWdobGlnaHQga2luZFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwga2luZCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0geyByYW5nZSB9O1xuICAgICAgICBpZiAoSXMubnVtYmVyKGtpbmQpKSB7XG4gICAgICAgICAgICByZXN1bHQua2luZCA9IGtpbmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgRG9jdW1lbnRIaWdobGlnaHQuY3JlYXRlID0gY3JlYXRlO1xufSkoRG9jdW1lbnRIaWdobGlnaHQgfHwgKERvY3VtZW50SGlnaGxpZ2h0ID0ge30pKTtcbi8qKlxuICogQSBzeW1ib2wga2luZC5cbiAqL1xuZXhwb3J0IHZhciBTeW1ib2xLaW5kO1xuKGZ1bmN0aW9uIChTeW1ib2xLaW5kKSB7XG4gICAgU3ltYm9sS2luZC5GaWxlID0gMTtcbiAgICBTeW1ib2xLaW5kLk1vZHVsZSA9IDI7XG4gICAgU3ltYm9sS2luZC5OYW1lc3BhY2UgPSAzO1xuICAgIFN5bWJvbEtpbmQuUGFja2FnZSA9IDQ7XG4gICAgU3ltYm9sS2luZC5DbGFzcyA9IDU7XG4gICAgU3ltYm9sS2luZC5NZXRob2QgPSA2O1xuICAgIFN5bWJvbEtpbmQuUHJvcGVydHkgPSA3O1xuICAgIFN5bWJvbEtpbmQuRmllbGQgPSA4O1xuICAgIFN5bWJvbEtpbmQuQ29uc3RydWN0b3IgPSA5O1xuICAgIFN5bWJvbEtpbmQuRW51bSA9IDEwO1xuICAgIFN5bWJvbEtpbmQuSW50ZXJmYWNlID0gMTE7XG4gICAgU3ltYm9sS2luZC5GdW5jdGlvbiA9IDEyO1xuICAgIFN5bWJvbEtpbmQuVmFyaWFibGUgPSAxMztcbiAgICBTeW1ib2xLaW5kLkNvbnN0YW50ID0gMTQ7XG4gICAgU3ltYm9sS2luZC5TdHJpbmcgPSAxNTtcbiAgICBTeW1ib2xLaW5kLk51bWJlciA9IDE2O1xuICAgIFN5bWJvbEtpbmQuQm9vbGVhbiA9IDE3O1xuICAgIFN5bWJvbEtpbmQuQXJyYXkgPSAxODtcbiAgICBTeW1ib2xLaW5kLk9iamVjdCA9IDE5O1xuICAgIFN5bWJvbEtpbmQuS2V5ID0gMjA7XG4gICAgU3ltYm9sS2luZC5OdWxsID0gMjE7XG4gICAgU3ltYm9sS2luZC5FbnVtTWVtYmVyID0gMjI7XG4gICAgU3ltYm9sS2luZC5TdHJ1Y3QgPSAyMztcbiAgICBTeW1ib2xLaW5kLkV2ZW50ID0gMjQ7XG4gICAgU3ltYm9sS2luZC5PcGVyYXRvciA9IDI1O1xuICAgIFN5bWJvbEtpbmQuVHlwZVBhcmFtZXRlciA9IDI2O1xufSkoU3ltYm9sS2luZCB8fCAoU3ltYm9sS2luZCA9IHt9KSk7XG4vKipcbiAqIFN5bWJvbCB0YWdzIGFyZSBleHRyYSBhbm5vdGF0aW9ucyB0aGF0IHR3ZWFrIHRoZSByZW5kZXJpbmcgb2YgYSBzeW1ib2wuXG4gKlxuICogQHNpbmNlIDMuMTZcbiAqL1xuZXhwb3J0IHZhciBTeW1ib2xUYWc7XG4oZnVuY3Rpb24gKFN5bWJvbFRhZykge1xuICAgIC8qKlxuICAgICAqIFJlbmRlciBhIHN5bWJvbCBhcyBvYnNvbGV0ZSwgdXN1YWxseSB1c2luZyBhIHN0cmlrZS1vdXQuXG4gICAgICovXG4gICAgU3ltYm9sVGFnLkRlcHJlY2F0ZWQgPSAxO1xufSkoU3ltYm9sVGFnIHx8IChTeW1ib2xUYWcgPSB7fSkpO1xuZXhwb3J0IHZhciBTeW1ib2xJbmZvcm1hdGlvbjtcbihmdW5jdGlvbiAoU3ltYm9sSW5mb3JtYXRpb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHN5bWJvbCBpbmZvcm1hdGlvbiBsaXRlcmFsLlxuICAgICAqXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0ga2luZCBUaGUga2luZCBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2Ugb2YgdGhlIGxvY2F0aW9uIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgcmVzb3VyY2Ugb2YgdGhlIGxvY2F0aW9uIG9mIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gY29udGFpbmVyTmFtZSBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sIGNvbnRhaW5pbmcgdGhlIHN5bWJvbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobmFtZSwga2luZCwgcmFuZ2UsIHVyaSwgY29udGFpbmVyTmFtZSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGtpbmQsXG4gICAgICAgICAgICBsb2NhdGlvbjogeyB1cmksIHJhbmdlIH1cbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGNvbnRhaW5lck5hbWUpIHtcbiAgICAgICAgICAgIHJlc3VsdC5jb250YWluZXJOYW1lID0gY29udGFpbmVyTmFtZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBTeW1ib2xJbmZvcm1hdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG59KShTeW1ib2xJbmZvcm1hdGlvbiB8fCAoU3ltYm9sSW5mb3JtYXRpb24gPSB7fSkpO1xuZXhwb3J0IHZhciBXb3Jrc3BhY2VTeW1ib2w7XG4oZnVuY3Rpb24gKFdvcmtzcGFjZVN5bWJvbCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyB3b3Jrc3BhY2Ugc3ltYm9sLlxuICAgICAqXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0ga2luZCBUaGUga2luZCBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIHJlc291cmNlIG9mIHRoZSBsb2NhdGlvbiBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSByYW5nZSBBbiBvcHRpb25zIHJhbmdlIG9mIHRoZSBsb2NhdGlvbi5cbiAgICAgKiBAcmV0dXJucyBBIFdvcmtzcGFjZVN5bWJvbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobmFtZSwga2luZCwgdXJpLCByYW5nZSkge1xuICAgICAgICByZXR1cm4gcmFuZ2UgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyB7IG5hbWUsIGtpbmQsIGxvY2F0aW9uOiB7IHVyaSwgcmFuZ2UgfSB9XG4gICAgICAgICAgICA6IHsgbmFtZSwga2luZCwgbG9jYXRpb246IHsgdXJpIH0gfTtcbiAgICB9XG4gICAgV29ya3NwYWNlU3ltYm9sLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKFdvcmtzcGFjZVN5bWJvbCB8fCAoV29ya3NwYWNlU3ltYm9sID0ge30pKTtcbmV4cG9ydCB2YXIgRG9jdW1lbnRTeW1ib2w7XG4oZnVuY3Rpb24gKERvY3VtZW50U3ltYm9sKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBzeW1ib2wgaW5mb3JtYXRpb24gbGl0ZXJhbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIGRldGFpbCBUaGUgZGV0YWlsIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIGtpbmQgVGhlIGtpbmQgb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIHNlbGVjdGlvblJhbmdlIFRoZSBzZWxlY3Rpb25SYW5nZSBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSBjaGlsZHJlbiBDaGlsZHJlbiBvZiB0aGUgc3ltYm9sLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShuYW1lLCBkZXRhaWwsIGtpbmQsIHJhbmdlLCBzZWxlY3Rpb25SYW5nZSwgY2hpbGRyZW4pIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBkZXRhaWwsXG4gICAgICAgICAgICBraW5kLFxuICAgICAgICAgICAgcmFuZ2UsXG4gICAgICAgICAgICBzZWxlY3Rpb25SYW5nZVxuICAgICAgICB9O1xuICAgICAgICBpZiAoY2hpbGRyZW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmNoaWxkcmVuID0gY2hpbGRyZW47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgRG9jdW1lbnRTeW1ib2wuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgRG9jdW1lbnRTeW1ib2x9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiZcbiAgICAgICAgICAgIElzLnN0cmluZyhjYW5kaWRhdGUubmFtZSkgJiYgSXMubnVtYmVyKGNhbmRpZGF0ZS5raW5kKSAmJlxuICAgICAgICAgICAgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUuc2VsZWN0aW9uUmFuZ2UpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmRldGFpbCA9PT0gdW5kZWZpbmVkIHx8IElzLnN0cmluZyhjYW5kaWRhdGUuZGV0YWlsKSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuZGVwcmVjYXRlZCA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLmRlcHJlY2F0ZWQpKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5jaGlsZHJlbiA9PT0gdW5kZWZpbmVkIHx8IEFycmF5LmlzQXJyYXkoY2FuZGlkYXRlLmNoaWxkcmVuKSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUudGFncyA9PT0gdW5kZWZpbmVkIHx8IEFycmF5LmlzQXJyYXkoY2FuZGlkYXRlLnRhZ3MpKTtcbiAgICB9XG4gICAgRG9jdW1lbnRTeW1ib2wuaXMgPSBpcztcbn0pKERvY3VtZW50U3ltYm9sIHx8IChEb2N1bWVudFN5bWJvbCA9IHt9KSk7XG4vKipcbiAqIEEgc2V0IG9mIHByZWRlZmluZWQgY29kZSBhY3Rpb24ga2luZHNcbiAqL1xuZXhwb3J0IHZhciBDb2RlQWN0aW9uS2luZDtcbihmdW5jdGlvbiAoQ29kZUFjdGlvbktpbmQpIHtcbiAgICAvKipcbiAgICAgKiBFbXB0eSBraW5kLlxuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLkVtcHR5ID0gJyc7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciBxdWlja2ZpeCBhY3Rpb25zOiAncXVpY2tmaXgnXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuUXVpY2tGaXggPSAncXVpY2tmaXgnO1xuICAgIC8qKlxuICAgICAqIEJhc2Uga2luZCBmb3IgcmVmYWN0b3JpbmcgYWN0aW9uczogJ3JlZmFjdG9yJ1xuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlJlZmFjdG9yID0gJ3JlZmFjdG9yJztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIHJlZmFjdG9yaW5nIGV4dHJhY3Rpb24gYWN0aW9uczogJ3JlZmFjdG9yLmV4dHJhY3QnXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIGV4dHJhY3QgYWN0aW9uczpcbiAgICAgKlxuICAgICAqIC0gRXh0cmFjdCBtZXRob2RcbiAgICAgKiAtIEV4dHJhY3QgZnVuY3Rpb25cbiAgICAgKiAtIEV4dHJhY3QgdmFyaWFibGVcbiAgICAgKiAtIEV4dHJhY3QgaW50ZXJmYWNlIGZyb20gY2xhc3NcbiAgICAgKiAtIC4uLlxuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlJlZmFjdG9yRXh0cmFjdCA9ICdyZWZhY3Rvci5leHRyYWN0JztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIHJlZmFjdG9yaW5nIGlubGluZSBhY3Rpb25zOiAncmVmYWN0b3IuaW5saW5lJ1xuICAgICAqXG4gICAgICogRXhhbXBsZSBpbmxpbmUgYWN0aW9uczpcbiAgICAgKlxuICAgICAqIC0gSW5saW5lIGZ1bmN0aW9uXG4gICAgICogLSBJbmxpbmUgdmFyaWFibGVcbiAgICAgKiAtIElubGluZSBjb25zdGFudFxuICAgICAqIC0gLi4uXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuUmVmYWN0b3JJbmxpbmUgPSAncmVmYWN0b3IuaW5saW5lJztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIHJlZmFjdG9yaW5nIHJld3JpdGUgYWN0aW9uczogJ3JlZmFjdG9yLnJld3JpdGUnXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIHJld3JpdGUgYWN0aW9uczpcbiAgICAgKlxuICAgICAqIC0gQ29udmVydCBKYXZhU2NyaXB0IGZ1bmN0aW9uIHRvIGNsYXNzXG4gICAgICogLSBBZGQgb3IgcmVtb3ZlIHBhcmFtZXRlclxuICAgICAqIC0gRW5jYXBzdWxhdGUgZmllbGRcbiAgICAgKiAtIE1ha2UgbWV0aG9kIHN0YXRpY1xuICAgICAqIC0gTW92ZSBtZXRob2QgdG8gYmFzZSBjbGFzc1xuICAgICAqIC0gLi4uXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuUmVmYWN0b3JSZXdyaXRlID0gJ3JlZmFjdG9yLnJld3JpdGUnO1xuICAgIC8qKlxuICAgICAqIEJhc2Uga2luZCBmb3Igc291cmNlIGFjdGlvbnM6IGBzb3VyY2VgXG4gICAgICpcbiAgICAgKiBTb3VyY2UgY29kZSBhY3Rpb25zIGFwcGx5IHRvIHRoZSBlbnRpcmUgZmlsZS5cbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5Tb3VyY2UgPSAnc291cmNlJztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIGFuIG9yZ2FuaXplIGltcG9ydHMgc291cmNlIGFjdGlvbjogYHNvdXJjZS5vcmdhbml6ZUltcG9ydHNgXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuU291cmNlT3JnYW5pemVJbXBvcnRzID0gJ3NvdXJjZS5vcmdhbml6ZUltcG9ydHMnO1xuICAgIC8qKlxuICAgICAqIEJhc2Uga2luZCBmb3IgYXV0by1maXggc291cmNlIGFjdGlvbnM6IGBzb3VyY2UuZml4QWxsYC5cbiAgICAgKlxuICAgICAqIEZpeCBhbGwgYWN0aW9ucyBhdXRvbWF0aWNhbGx5IGZpeCBlcnJvcnMgdGhhdCBoYXZlIGEgY2xlYXIgZml4IHRoYXQgZG8gbm90IHJlcXVpcmUgdXNlciBpbnB1dC5cbiAgICAgKiBUaGV5IHNob3VsZCBub3Qgc3VwcHJlc3MgZXJyb3JzIG9yIHBlcmZvcm0gdW5zYWZlIGZpeGVzIHN1Y2ggYXMgZ2VuZXJhdGluZyBuZXcgdHlwZXMgb3IgY2xhc3Nlcy5cbiAgICAgKlxuICAgICAqIEBzaW5jZSAzLjE1LjBcbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5Tb3VyY2VGaXhBbGwgPSAnc291cmNlLmZpeEFsbCc7XG59KShDb2RlQWN0aW9uS2luZCB8fCAoQ29kZUFjdGlvbktpbmQgPSB7fSkpO1xuLyoqXG4gKiBUaGUgcmVhc29uIHdoeSBjb2RlIGFjdGlvbnMgd2VyZSByZXF1ZXN0ZWQuXG4gKlxuICogQHNpbmNlIDMuMTcuMFxuICovXG5leHBvcnQgdmFyIENvZGVBY3Rpb25UcmlnZ2VyS2luZDtcbihmdW5jdGlvbiAoQ29kZUFjdGlvblRyaWdnZXJLaW5kKSB7XG4gICAgLyoqXG4gICAgICogQ29kZSBhY3Rpb25zIHdlcmUgZXhwbGljaXRseSByZXF1ZXN0ZWQgYnkgdGhlIHVzZXIgb3IgYnkgYW4gZXh0ZW5zaW9uLlxuICAgICAqL1xuICAgIENvZGVBY3Rpb25UcmlnZ2VyS2luZC5JbnZva2VkID0gMTtcbiAgICAvKipcbiAgICAgKiBDb2RlIGFjdGlvbnMgd2VyZSByZXF1ZXN0ZWQgYXV0b21hdGljYWxseS5cbiAgICAgKlxuICAgICAqIFRoaXMgdHlwaWNhbGx5IGhhcHBlbnMgd2hlbiBjdXJyZW50IHNlbGVjdGlvbiBpbiBhIGZpbGUgY2hhbmdlcywgYnV0IGNhblxuICAgICAqIGFsc28gYmUgdHJpZ2dlcmVkIHdoZW4gZmlsZSBjb250ZW50IGNoYW5nZXMuXG4gICAgICovXG4gICAgQ29kZUFjdGlvblRyaWdnZXJLaW5kLkF1dG9tYXRpYyA9IDI7XG59KShDb2RlQWN0aW9uVHJpZ2dlcktpbmQgfHwgKENvZGVBY3Rpb25UcmlnZ2VyS2luZCA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb2RlQWN0aW9uQ29udGV4dCBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBDb2RlQWN0aW9uQ29udGV4dH0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgQ29kZUFjdGlvbkNvbnRleHQ7XG4oZnVuY3Rpb24gKENvZGVBY3Rpb25Db250ZXh0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDb2RlQWN0aW9uQ29udGV4dCBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShkaWFnbm9zdGljcywgb25seSwgdHJpZ2dlcktpbmQpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHsgZGlhZ25vc3RpY3MgfTtcbiAgICAgICAgaWYgKG9ubHkgIT09IHVuZGVmaW5lZCAmJiBvbmx5ICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXN1bHQub25seSA9IG9ubHk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyaWdnZXJLaW5kICE9PSB1bmRlZmluZWQgJiYgdHJpZ2dlcktpbmQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJlc3VsdC50cmlnZ2VyS2luZCA9IHRyaWdnZXJLaW5kO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIENvZGVBY3Rpb25Db250ZXh0LmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIENvZGVBY3Rpb25Db250ZXh0fSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLmRpYWdub3N0aWNzLCBEaWFnbm9zdGljLmlzKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS5vbmx5ID09PSB1bmRlZmluZWQgfHwgSXMudHlwZWRBcnJheShjYW5kaWRhdGUub25seSwgSXMuc3RyaW5nKSlcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUudHJpZ2dlcktpbmQgPT09IHVuZGVmaW5lZCB8fCBjYW5kaWRhdGUudHJpZ2dlcktpbmQgPT09IENvZGVBY3Rpb25UcmlnZ2VyS2luZC5JbnZva2VkIHx8IGNhbmRpZGF0ZS50cmlnZ2VyS2luZCA9PT0gQ29kZUFjdGlvblRyaWdnZXJLaW5kLkF1dG9tYXRpYyk7XG4gICAgfVxuICAgIENvZGVBY3Rpb25Db250ZXh0LmlzID0gaXM7XG59KShDb2RlQWN0aW9uQ29udGV4dCB8fCAoQ29kZUFjdGlvbkNvbnRleHQgPSB7fSkpO1xuZXhwb3J0IHZhciBDb2RlQWN0aW9uO1xuKGZ1bmN0aW9uIChDb2RlQWN0aW9uKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKHRpdGxlLCBraW5kT3JDb21tYW5kT3JFZGl0LCBraW5kKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IHRpdGxlIH07XG4gICAgICAgIGxldCBjaGVja0tpbmQgPSB0cnVlO1xuICAgICAgICBpZiAodHlwZW9mIGtpbmRPckNvbW1hbmRPckVkaXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjaGVja0tpbmQgPSBmYWxzZTtcbiAgICAgICAgICAgIHJlc3VsdC5raW5kID0ga2luZE9yQ29tbWFuZE9yRWRpdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChDb21tYW5kLmlzKGtpbmRPckNvbW1hbmRPckVkaXQpKSB7XG4gICAgICAgICAgICByZXN1bHQuY29tbWFuZCA9IGtpbmRPckNvbW1hbmRPckVkaXQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQuZWRpdCA9IGtpbmRPckNvbW1hbmRPckVkaXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoZWNrS2luZCAmJiBraW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5raW5kID0ga2luZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBDb2RlQWN0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS50aXRsZSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuZGlhZ25vc3RpY3MgPT09IHVuZGVmaW5lZCB8fCBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS5kaWFnbm9zdGljcywgRGlhZ25vc3RpYy5pcykpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmtpbmQgPT09IHVuZGVmaW5lZCB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLmtpbmQpKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5lZGl0ICE9PSB1bmRlZmluZWQgfHwgY2FuZGlkYXRlLmNvbW1hbmQgIT09IHVuZGVmaW5lZCkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuY29tbWFuZCA9PT0gdW5kZWZpbmVkIHx8IENvbW1hbmQuaXMoY2FuZGlkYXRlLmNvbW1hbmQpKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5pc1ByZWZlcnJlZCA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLmlzUHJlZmVycmVkKSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuZWRpdCA9PT0gdW5kZWZpbmVkIHx8IFdvcmtzcGFjZUVkaXQuaXMoY2FuZGlkYXRlLmVkaXQpKTtcbiAgICB9XG4gICAgQ29kZUFjdGlvbi5pcyA9IGlzO1xufSkoQ29kZUFjdGlvbiB8fCAoQ29kZUFjdGlvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb2RlTGVucyBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBDb2RlTGVuc30gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgQ29kZUxlbnM7XG4oZnVuY3Rpb24gKENvZGVMZW5zKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDb2RlTGVucyBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgZGF0YSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0geyByYW5nZSB9O1xuICAgICAgICBpZiAoSXMuZGVmaW5lZChkYXRhKSkge1xuICAgICAgICAgICAgcmVzdWx0LmRhdGEgPSBkYXRhO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIENvZGVMZW5zLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIENvZGVMZW5zfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUuY29tbWFuZCkgfHwgQ29tbWFuZC5pcyhjYW5kaWRhdGUuY29tbWFuZCkpO1xuICAgIH1cbiAgICBDb2RlTGVucy5pcyA9IGlzO1xufSkoQ29kZUxlbnMgfHwgKENvZGVMZW5zID0ge30pKTtcbi8qKlxuICogVGhlIEZvcm1hdHRpbmdPcHRpb25zIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIEZvcm1hdHRpbmdPcHRpb25zfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBGb3JtYXR0aW5nT3B0aW9ucztcbihmdW5jdGlvbiAoRm9ybWF0dGluZ09wdGlvbnMpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IEZvcm1hdHRpbmdPcHRpb25zIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHRhYlNpemUsIGluc2VydFNwYWNlcykge1xuICAgICAgICByZXR1cm4geyB0YWJTaXplLCBpbnNlcnRTcGFjZXMgfTtcbiAgICB9XG4gICAgRm9ybWF0dGluZ09wdGlvbnMuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgRm9ybWF0dGluZ09wdGlvbnN9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMudWludGVnZXIoY2FuZGlkYXRlLnRhYlNpemUpICYmIElzLmJvb2xlYW4oY2FuZGlkYXRlLmluc2VydFNwYWNlcyk7XG4gICAgfVxuICAgIEZvcm1hdHRpbmdPcHRpb25zLmlzID0gaXM7XG59KShGb3JtYXR0aW5nT3B0aW9ucyB8fCAoRm9ybWF0dGluZ09wdGlvbnMgPSB7fSkpO1xuLyoqXG4gKiBUaGUgRG9jdW1lbnRMaW5rIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIERvY3VtZW50TGlua30gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgRG9jdW1lbnRMaW5rO1xuKGZ1bmN0aW9uIChEb2N1bWVudExpbmspIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IERvY3VtZW50TGluayBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgdGFyZ2V0LCBkYXRhKSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCB0YXJnZXQsIGRhdGEgfTtcbiAgICB9XG4gICAgRG9jdW1lbnRMaW5rLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIERvY3VtZW50TGlua30gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLnRhcmdldCkgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS50YXJnZXQpKTtcbiAgICB9XG4gICAgRG9jdW1lbnRMaW5rLmlzID0gaXM7XG59KShEb2N1bWVudExpbmsgfHwgKERvY3VtZW50TGluayA9IHt9KSk7XG4vKipcbiAqIFRoZSBTZWxlY3Rpb25SYW5nZSBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9uIHRvIHdvcmsgd2l0aFxuICogU2VsZWN0aW9uUmFuZ2UgbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgU2VsZWN0aW9uUmFuZ2U7XG4oZnVuY3Rpb24gKFNlbGVjdGlvblJhbmdlKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBTZWxlY3Rpb25SYW5nZVxuICAgICAqIEBwYXJhbSByYW5nZSB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHBhcmVudCBhbiBvcHRpb25hbCBwYXJlbnQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCBwYXJlbnQpIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIHBhcmVudCB9O1xuICAgIH1cbiAgICBTZWxlY3Rpb25SYW5nZS5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgKGNhbmRpZGF0ZS5wYXJlbnQgPT09IHVuZGVmaW5lZCB8fCBTZWxlY3Rpb25SYW5nZS5pcyhjYW5kaWRhdGUucGFyZW50KSk7XG4gICAgfVxuICAgIFNlbGVjdGlvblJhbmdlLmlzID0gaXM7XG59KShTZWxlY3Rpb25SYW5nZSB8fCAoU2VsZWN0aW9uUmFuZ2UgPSB7fSkpO1xuLyoqXG4gKiBBIHNldCBvZiBwcmVkZWZpbmVkIHRva2VuIHR5cGVzLiBUaGlzIHNldCBpcyBub3QgZml4ZWRcbiAqIGFuIGNsaWVudHMgY2FuIHNwZWNpZnkgYWRkaXRpb25hbCB0b2tlbiB0eXBlcyB2aWEgdGhlXG4gKiBjb3JyZXNwb25kaW5nIGNsaWVudCBjYXBhYmlsaXRpZXMuXG4gKlxuICogQHNpbmNlIDMuMTYuMFxuICovXG5leHBvcnQgdmFyIFNlbWFudGljVG9rZW5UeXBlcztcbihmdW5jdGlvbiAoU2VtYW50aWNUb2tlblR5cGVzKSB7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wibmFtZXNwYWNlXCJdID0gXCJuYW1lc3BhY2VcIjtcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgZ2VuZXJpYyB0eXBlLiBBY3RzIGFzIGEgZmFsbGJhY2sgZm9yIHR5cGVzIHdoaWNoIGNhbid0IGJlIG1hcHBlZCB0b1xuICAgICAqIGEgc3BlY2lmaWMgdHlwZSBsaWtlIGNsYXNzIG9yIGVudW0uXG4gICAgICovXG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1widHlwZVwiXSA9IFwidHlwZVwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImNsYXNzXCJdID0gXCJjbGFzc1wiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImVudW1cIl0gPSBcImVudW1cIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJpbnRlcmZhY2VcIl0gPSBcImludGVyZmFjZVwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInN0cnVjdFwiXSA9IFwic3RydWN0XCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1widHlwZVBhcmFtZXRlclwiXSA9IFwidHlwZVBhcmFtZXRlclwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInBhcmFtZXRlclwiXSA9IFwicGFyYW1ldGVyXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1widmFyaWFibGVcIl0gPSBcInZhcmlhYmxlXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wicHJvcGVydHlcIl0gPSBcInByb3BlcnR5XCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wiZW51bU1lbWJlclwiXSA9IFwiZW51bU1lbWJlclwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImV2ZW50XCJdID0gXCJldmVudFwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImZ1bmN0aW9uXCJdID0gXCJmdW5jdGlvblwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcIm1ldGhvZFwiXSA9IFwibWV0aG9kXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wibWFjcm9cIl0gPSBcIm1hY3JvXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wia2V5d29yZFwiXSA9IFwia2V5d29yZFwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcIm1vZGlmaWVyXCJdID0gXCJtb2RpZmllclwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImNvbW1lbnRcIl0gPSBcImNvbW1lbnRcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJzdHJpbmdcIl0gPSBcInN0cmluZ1wiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcIm51bWJlclwiXSA9IFwibnVtYmVyXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wicmVnZXhwXCJdID0gXCJyZWdleHBcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJvcGVyYXRvclwiXSA9IFwib3BlcmF0b3JcIjtcbiAgICAvKipcbiAgICAgKiBAc2luY2UgMy4xNy4wXG4gICAgICovXG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wiZGVjb3JhdG9yXCJdID0gXCJkZWNvcmF0b3JcIjtcbn0pKFNlbWFudGljVG9rZW5UeXBlcyB8fCAoU2VtYW50aWNUb2tlblR5cGVzID0ge30pKTtcbi8qKlxuICogQSBzZXQgb2YgcHJlZGVmaW5lZCB0b2tlbiBtb2RpZmllcnMuIFRoaXMgc2V0IGlzIG5vdCBmaXhlZFxuICogYW4gY2xpZW50cyBjYW4gc3BlY2lmeSBhZGRpdGlvbmFsIHRva2VuIHR5cGVzIHZpYSB0aGVcbiAqIGNvcnJlc3BvbmRpbmcgY2xpZW50IGNhcGFiaWxpdGllcy5cbiAqXG4gKiBAc2luY2UgMy4xNi4wXG4gKi9cbmV4cG9ydCB2YXIgU2VtYW50aWNUb2tlbk1vZGlmaWVycztcbihmdW5jdGlvbiAoU2VtYW50aWNUb2tlbk1vZGlmaWVycykge1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJkZWNsYXJhdGlvblwiXSA9IFwiZGVjbGFyYXRpb25cIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wiZGVmaW5pdGlvblwiXSA9IFwiZGVmaW5pdGlvblwiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJyZWFkb25seVwiXSA9IFwicmVhZG9ubHlcIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wic3RhdGljXCJdID0gXCJzdGF0aWNcIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wiZGVwcmVjYXRlZFwiXSA9IFwiZGVwcmVjYXRlZFwiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJhYnN0cmFjdFwiXSA9IFwiYWJzdHJhY3RcIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wiYXN5bmNcIl0gPSBcImFzeW5jXCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcIm1vZGlmaWNhdGlvblwiXSA9IFwibW9kaWZpY2F0aW9uXCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcImRvY3VtZW50YXRpb25cIl0gPSBcImRvY3VtZW50YXRpb25cIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wiZGVmYXVsdExpYnJhcnlcIl0gPSBcImRlZmF1bHRMaWJyYXJ5XCI7XG59KShTZW1hbnRpY1Rva2VuTW9kaWZpZXJzIHx8IChTZW1hbnRpY1Rva2VuTW9kaWZpZXJzID0ge30pKTtcbi8qKlxuICogQHNpbmNlIDMuMTYuMFxuICovXG5leHBvcnQgdmFyIFNlbWFudGljVG9rZW5zO1xuKGZ1bmN0aW9uIChTZW1hbnRpY1Rva2Vucykge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIChjYW5kaWRhdGUucmVzdWx0SWQgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgY2FuZGlkYXRlLnJlc3VsdElkID09PSAnc3RyaW5nJykgJiZcbiAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoY2FuZGlkYXRlLmRhdGEpICYmIChjYW5kaWRhdGUuZGF0YS5sZW5ndGggPT09IDAgfHwgdHlwZW9mIGNhbmRpZGF0ZS5kYXRhWzBdID09PSAnbnVtYmVyJyk7XG4gICAgfVxuICAgIFNlbWFudGljVG9rZW5zLmlzID0gaXM7XG59KShTZW1hbnRpY1Rva2VucyB8fCAoU2VtYW50aWNUb2tlbnMgPSB7fSkpO1xuLyoqXG4gKiBUaGUgSW5saW5lVmFsdWVUZXh0IG5hbWVzcGFjZSBwcm92aWRlcyBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIElubGluZVZhbHVlVGV4dHMuXG4gKlxuICogQHNpbmNlIDMuMTcuMFxuICovXG5leHBvcnQgdmFyIElubGluZVZhbHVlVGV4dDtcbihmdW5jdGlvbiAoSW5saW5lVmFsdWVUZXh0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBJbmxpbmVWYWx1ZVRleHQgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIHRleHQpIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIHRleHQgfTtcbiAgICB9XG4gICAgSW5saW5lVmFsdWVUZXh0LmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAhPT0gdW5kZWZpbmVkICYmIGNhbmRpZGF0ZSAhPT0gbnVsbCAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudGV4dCk7XG4gICAgfVxuICAgIElubGluZVZhbHVlVGV4dC5pcyA9IGlzO1xufSkoSW5saW5lVmFsdWVUZXh0IHx8IChJbmxpbmVWYWx1ZVRleHQgPSB7fSkpO1xuLyoqXG4gKiBUaGUgSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cCBuYW1lc3BhY2UgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCBJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3Vwcy5cbiAqXG4gKiBAc2luY2UgMy4xNy4wXG4gKi9cbmV4cG9ydCB2YXIgSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cDtcbihmdW5jdGlvbiAoSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgSW5saW5lVmFsdWVUZXh0IGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCB2YXJpYWJsZU5hbWUsIGNhc2VTZW5zaXRpdmVMb29rdXApIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIHZhcmlhYmxlTmFtZSwgY2FzZVNlbnNpdGl2ZUxvb2t1cCB9O1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAhPT0gdW5kZWZpbmVkICYmIGNhbmRpZGF0ZSAhPT0gbnVsbCAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIElzLmJvb2xlYW4oY2FuZGlkYXRlLmNhc2VTZW5zaXRpdmVMb29rdXApXG4gICAgICAgICAgICAmJiAoSXMuc3RyaW5nKGNhbmRpZGF0ZS52YXJpYWJsZU5hbWUpIHx8IGNhbmRpZGF0ZS52YXJpYWJsZU5hbWUgPT09IHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIElubGluZVZhbHVlVmFyaWFibGVMb29rdXAuaXMgPSBpcztcbn0pKElubGluZVZhbHVlVmFyaWFibGVMb29rdXAgfHwgKElubGluZVZhbHVlVmFyaWFibGVMb29rdXAgPSB7fSkpO1xuLyoqXG4gKiBUaGUgSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24gbmFtZXNwYWNlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGggSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24uXG4gKlxuICogQHNpbmNlIDMuMTcuMFxuICovXG5leHBvcnQgdmFyIElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uO1xuKGZ1bmN0aW9uIChJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24gbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIGV4cHJlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIGV4cHJlc3Npb24gfTtcbiAgICB9XG4gICAgSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24uY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICE9PSB1bmRlZmluZWQgJiYgY2FuZGlkYXRlICE9PSBudWxsICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSlcbiAgICAgICAgICAgICYmIChJcy5zdHJpbmcoY2FuZGlkYXRlLmV4cHJlc3Npb24pIHx8IGNhbmRpZGF0ZS5leHByZXNzaW9uID09PSB1bmRlZmluZWQpO1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbi5pcyA9IGlzO1xufSkoSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24gfHwgKElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uID0ge30pKTtcbi8qKlxuICogVGhlIElubGluZVZhbHVlQ29udGV4dCBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBJbmxpbmVWYWx1ZUNvbnRleHR9IGxpdGVyYWxzLlxuICpcbiAqIEBzaW5jZSAzLjE3LjBcbiAqL1xuZXhwb3J0IHZhciBJbmxpbmVWYWx1ZUNvbnRleHQ7XG4oZnVuY3Rpb24gKElubGluZVZhbHVlQ29udGV4dCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgSW5saW5lVmFsdWVDb250ZXh0IGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGZyYW1lSWQsIHN0b3BwZWRMb2NhdGlvbikge1xuICAgICAgICByZXR1cm4geyBmcmFtZUlkLCBzdG9wcGVkTG9jYXRpb24gfTtcbiAgICB9XG4gICAgSW5saW5lVmFsdWVDb250ZXh0LmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIElubGluZVZhbHVlQ29udGV4dH0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIFJhbmdlLmlzKHZhbHVlLnN0b3BwZWRMb2NhdGlvbik7XG4gICAgfVxuICAgIElubGluZVZhbHVlQ29udGV4dC5pcyA9IGlzO1xufSkoSW5saW5lVmFsdWVDb250ZXh0IHx8IChJbmxpbmVWYWx1ZUNvbnRleHQgPSB7fSkpO1xuLyoqXG4gKiBJbmxheSBoaW50IGtpbmRzLlxuICpcbiAqIEBzaW5jZSAzLjE3LjBcbiAqL1xuZXhwb3J0IHZhciBJbmxheUhpbnRLaW5kO1xuKGZ1bmN0aW9uIChJbmxheUhpbnRLaW5kKSB7XG4gICAgLyoqXG4gICAgICogQW4gaW5sYXkgaGludCB0aGF0IGZvciBhIHR5cGUgYW5ub3RhdGlvbi5cbiAgICAgKi9cbiAgICBJbmxheUhpbnRLaW5kLlR5cGUgPSAxO1xuICAgIC8qKlxuICAgICAqIEFuIGlubGF5IGhpbnQgdGhhdCBpcyBmb3IgYSBwYXJhbWV0ZXIuXG4gICAgICovXG4gICAgSW5sYXlIaW50S2luZC5QYXJhbWV0ZXIgPSAyO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gMSB8fCB2YWx1ZSA9PT0gMjtcbiAgICB9XG4gICAgSW5sYXlIaW50S2luZC5pcyA9IGlzO1xufSkoSW5sYXlIaW50S2luZCB8fCAoSW5sYXlIaW50S2luZCA9IHt9KSk7XG5leHBvcnQgdmFyIElubGF5SGludExhYmVsUGFydDtcbihmdW5jdGlvbiAoSW5sYXlIaW50TGFiZWxQYXJ0KSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB7IHZhbHVlIH07XG4gICAgfVxuICAgIElubGF5SGludExhYmVsUGFydC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSlcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUudG9vbHRpcCA9PT0gdW5kZWZpbmVkIHx8IElzLnN0cmluZyhjYW5kaWRhdGUudG9vbHRpcCkgfHwgTWFya3VwQ29udGVudC5pcyhjYW5kaWRhdGUudG9vbHRpcCkpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLmxvY2F0aW9uID09PSB1bmRlZmluZWQgfHwgTG9jYXRpb24uaXMoY2FuZGlkYXRlLmxvY2F0aW9uKSlcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUuY29tbWFuZCA9PT0gdW5kZWZpbmVkIHx8IENvbW1hbmQuaXMoY2FuZGlkYXRlLmNvbW1hbmQpKTtcbiAgICB9XG4gICAgSW5sYXlIaW50TGFiZWxQYXJ0LmlzID0gaXM7XG59KShJbmxheUhpbnRMYWJlbFBhcnQgfHwgKElubGF5SGludExhYmVsUGFydCA9IHt9KSk7XG5leHBvcnQgdmFyIElubGF5SGludDtcbihmdW5jdGlvbiAoSW5sYXlIaW50KSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKHBvc2l0aW9uLCBsYWJlbCwga2luZCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB7IHBvc2l0aW9uLCBsYWJlbCB9O1xuICAgICAgICBpZiAoa2luZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQua2luZCA9IGtpbmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgSW5sYXlIaW50LmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBQb3NpdGlvbi5pcyhjYW5kaWRhdGUucG9zaXRpb24pXG4gICAgICAgICAgICAmJiAoSXMuc3RyaW5nKGNhbmRpZGF0ZS5sYWJlbCkgfHwgSXMudHlwZWRBcnJheShjYW5kaWRhdGUubGFiZWwsIElubGF5SGludExhYmVsUGFydC5pcykpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLmtpbmQgPT09IHVuZGVmaW5lZCB8fCBJbmxheUhpbnRLaW5kLmlzKGNhbmRpZGF0ZS5raW5kKSlcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUudGV4dEVkaXRzID09PSB1bmRlZmluZWQpIHx8IElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLnRleHRFZGl0cywgVGV4dEVkaXQuaXMpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLnRvb2x0aXAgPT09IHVuZGVmaW5lZCB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLnRvb2x0aXApIHx8IE1hcmt1cENvbnRlbnQuaXMoY2FuZGlkYXRlLnRvb2x0aXApKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS5wYWRkaW5nTGVmdCA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLnBhZGRpbmdMZWZ0KSlcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUucGFkZGluZ1JpZ2h0ID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUucGFkZGluZ1JpZ2h0KSk7XG4gICAgfVxuICAgIElubGF5SGludC5pcyA9IGlzO1xufSkoSW5sYXlIaW50IHx8IChJbmxheUhpbnQgPSB7fSkpO1xuZXhwb3J0IHZhciBTdHJpbmdWYWx1ZTtcbihmdW5jdGlvbiAoU3RyaW5nVmFsdWUpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGVTbmlwcGV0KHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB7IGtpbmQ6ICdzbmlwcGV0JywgdmFsdWUgfTtcbiAgICB9XG4gICAgU3RyaW5nVmFsdWUuY3JlYXRlU25pcHBldCA9IGNyZWF0ZVNuaXBwZXQ7XG59KShTdHJpbmdWYWx1ZSB8fCAoU3RyaW5nVmFsdWUgPSB7fSkpO1xuZXhwb3J0IHZhciBJbmxpbmVDb21wbGV0aW9uSXRlbTtcbihmdW5jdGlvbiAoSW5saW5lQ29tcGxldGlvbkl0ZW0pIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUoaW5zZXJ0VGV4dCwgZmlsdGVyVGV4dCwgcmFuZ2UsIGNvbW1hbmQpIHtcbiAgICAgICAgcmV0dXJuIHsgaW5zZXJ0VGV4dCwgZmlsdGVyVGV4dCwgcmFuZ2UsIGNvbW1hbmQgfTtcbiAgICB9XG4gICAgSW5saW5lQ29tcGxldGlvbkl0ZW0uY3JlYXRlID0gY3JlYXRlO1xufSkoSW5saW5lQ29tcGxldGlvbkl0ZW0gfHwgKElubGluZUNvbXBsZXRpb25JdGVtID0ge30pKTtcbmV4cG9ydCB2YXIgSW5saW5lQ29tcGxldGlvbkxpc3Q7XG4oZnVuY3Rpb24gKElubGluZUNvbXBsZXRpb25MaXN0KSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKGl0ZW1zKSB7XG4gICAgICAgIHJldHVybiB7IGl0ZW1zIH07XG4gICAgfVxuICAgIElubGluZUNvbXBsZXRpb25MaXN0LmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKElubGluZUNvbXBsZXRpb25MaXN0IHx8IChJbmxpbmVDb21wbGV0aW9uTGlzdCA9IHt9KSk7XG4vKipcbiAqIERlc2NyaWJlcyBob3cgYW4ge0BsaW5rIElubGluZUNvbXBsZXRpb25JdGVtUHJvdmlkZXIgaW5saW5lIGNvbXBsZXRpb24gcHJvdmlkZXJ9IHdhcyB0cmlnZ2VyZWQuXG4gKlxuICogQHNpbmNlIDMuMTguMFxuICogQHByb3Bvc2VkXG4gKi9cbmV4cG9ydCB2YXIgSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kO1xuKGZ1bmN0aW9uIChJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmQpIHtcbiAgICAvKipcbiAgICAgKiBDb21wbGV0aW9uIHdhcyB0cmlnZ2VyZWQgZXhwbGljaXRseSBieSBhIHVzZXIgZ2VzdHVyZS5cbiAgICAgKi9cbiAgICBJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmQuSW52b2tlZCA9IDA7XG4gICAgLyoqXG4gICAgICogQ29tcGxldGlvbiB3YXMgdHJpZ2dlcmVkIGF1dG9tYXRpY2FsbHkgd2hpbGUgZWRpdGluZy5cbiAgICAgKi9cbiAgICBJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmQuQXV0b21hdGljID0gMTtcbn0pKElubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZCB8fCAoSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kID0ge30pKTtcbmV4cG9ydCB2YXIgU2VsZWN0ZWRDb21wbGV0aW9uSW5mbztcbihmdW5jdGlvbiAoU2VsZWN0ZWRDb21wbGV0aW9uSW5mbykge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgdGV4dCkge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgdGV4dCB9O1xuICAgIH1cbiAgICBTZWxlY3RlZENvbXBsZXRpb25JbmZvLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKFNlbGVjdGVkQ29tcGxldGlvbkluZm8gfHwgKFNlbGVjdGVkQ29tcGxldGlvbkluZm8gPSB7fSkpO1xuZXhwb3J0IHZhciBJbmxpbmVDb21wbGV0aW9uQ29udGV4dDtcbihmdW5jdGlvbiAoSW5saW5lQ29tcGxldGlvbkNvbnRleHQpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUodHJpZ2dlcktpbmQsIHNlbGVjdGVkQ29tcGxldGlvbkluZm8pIHtcbiAgICAgICAgcmV0dXJuIHsgdHJpZ2dlcktpbmQsIHNlbGVjdGVkQ29tcGxldGlvbkluZm8gfTtcbiAgICB9XG4gICAgSW5saW5lQ29tcGxldGlvbkNvbnRleHQuY3JlYXRlID0gY3JlYXRlO1xufSkoSW5saW5lQ29tcGxldGlvbkNvbnRleHQgfHwgKElubGluZUNvbXBsZXRpb25Db250ZXh0ID0ge30pKTtcbmV4cG9ydCB2YXIgV29ya3NwYWNlRm9sZGVyO1xuKGZ1bmN0aW9uIChXb3Jrc3BhY2VGb2xkZXIpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBVUkkuaXMoY2FuZGlkYXRlLnVyaSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5uYW1lKTtcbiAgICB9XG4gICAgV29ya3NwYWNlRm9sZGVyLmlzID0gaXM7XG59KShXb3Jrc3BhY2VGb2xkZXIgfHwgKFdvcmtzcGFjZUZvbGRlciA9IHt9KSk7XG5leHBvcnQgY29uc3QgRU9MID0gWydcXG4nLCAnXFxyXFxuJywgJ1xcciddO1xuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgdGhlIHRleHQgZG9jdW1lbnQgZnJvbSB0aGUgbmV3IHZzY29kZS1sYW5ndWFnZXNlcnZlci10ZXh0ZG9jdW1lbnQgcGFja2FnZS5cbiAqL1xuZXhwb3J0IHZhciBUZXh0RG9jdW1lbnQ7XG4oZnVuY3Rpb24gKFRleHREb2N1bWVudCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgSVRleHREb2N1bWVudCBsaXRlcmFsIGZyb20gdGhlIGdpdmVuIHVyaSBhbmQgY29udGVudC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSBkb2N1bWVudCdzIHVyaS5cbiAgICAgKiBAcGFyYW0gbGFuZ3VhZ2VJZCBUaGUgZG9jdW1lbnQncyBsYW5ndWFnZSBJZC5cbiAgICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgZG9jdW1lbnQncyB2ZXJzaW9uLlxuICAgICAqIEBwYXJhbSBjb250ZW50IFRoZSBkb2N1bWVudCdzIGNvbnRlbnQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHVyaSwgbGFuZ3VhZ2VJZCwgdmVyc2lvbiwgY29udGVudCkge1xuICAgICAgICByZXR1cm4gbmV3IEZ1bGxUZXh0RG9jdW1lbnQodXJpLCBsYW5ndWFnZUlkLCB2ZXJzaW9uLCBjb250ZW50KTtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50LmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIElUZXh0RG9jdW1lbnR9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLmxhbmd1YWdlSWQpIHx8IElzLnN0cmluZyhjYW5kaWRhdGUubGFuZ3VhZ2VJZCkpICYmIElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS5saW5lQ291bnQpXG4gICAgICAgICAgICAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5nZXRUZXh0KSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5wb3NpdGlvbkF0KSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5vZmZzZXRBdCkgPyB0cnVlIDogZmFsc2U7XG4gICAgfVxuICAgIFRleHREb2N1bWVudC5pcyA9IGlzO1xuICAgIGZ1bmN0aW9uIGFwcGx5RWRpdHMoZG9jdW1lbnQsIGVkaXRzKSB7XG4gICAgICAgIGxldCB0ZXh0ID0gZG9jdW1lbnQuZ2V0VGV4dCgpO1xuICAgICAgICBsZXQgc29ydGVkRWRpdHMgPSBtZXJnZVNvcnQoZWRpdHMsIChhLCBiKSA9PiB7XG4gICAgICAgICAgICBsZXQgZGlmZiA9IGEucmFuZ2Uuc3RhcnQubGluZSAtIGIucmFuZ2Uuc3RhcnQubGluZTtcbiAgICAgICAgICAgIGlmIChkaWZmID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEucmFuZ2Uuc3RhcnQuY2hhcmFjdGVyIC0gYi5yYW5nZS5zdGFydC5jaGFyYWN0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZGlmZjtcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBsYXN0TW9kaWZpZWRPZmZzZXQgPSB0ZXh0Lmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaSA9IHNvcnRlZEVkaXRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBsZXQgZSA9IHNvcnRlZEVkaXRzW2ldO1xuICAgICAgICAgICAgbGV0IHN0YXJ0T2Zmc2V0ID0gZG9jdW1lbnQub2Zmc2V0QXQoZS5yYW5nZS5zdGFydCk7XG4gICAgICAgICAgICBsZXQgZW5kT2Zmc2V0ID0gZG9jdW1lbnQub2Zmc2V0QXQoZS5yYW5nZS5lbmQpO1xuICAgICAgICAgICAgaWYgKGVuZE9mZnNldCA8PSBsYXN0TW9kaWZpZWRPZmZzZXQpIHtcbiAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMCwgc3RhcnRPZmZzZXQpICsgZS5uZXdUZXh0ICsgdGV4dC5zdWJzdHJpbmcoZW5kT2Zmc2V0LCB0ZXh0Lmxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ092ZXJsYXBwaW5nIGVkaXQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxhc3RNb2RpZmllZE9mZnNldCA9IHN0YXJ0T2Zmc2V0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnQuYXBwbHlFZGl0cyA9IGFwcGx5RWRpdHM7XG4gICAgZnVuY3Rpb24gbWVyZ2VTb3J0KGRhdGEsIGNvbXBhcmUpIHtcbiAgICAgICAgaWYgKGRhdGEubGVuZ3RoIDw9IDEpIHtcbiAgICAgICAgICAgIC8vIHNvcnRlZFxuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcCA9IChkYXRhLmxlbmd0aCAvIDIpIHwgMDtcbiAgICAgICAgY29uc3QgbGVmdCA9IGRhdGEuc2xpY2UoMCwgcCk7XG4gICAgICAgIGNvbnN0IHJpZ2h0ID0gZGF0YS5zbGljZShwKTtcbiAgICAgICAgbWVyZ2VTb3J0KGxlZnQsIGNvbXBhcmUpO1xuICAgICAgICBtZXJnZVNvcnQocmlnaHQsIGNvbXBhcmUpO1xuICAgICAgICBsZXQgbGVmdElkeCA9IDA7XG4gICAgICAgIGxldCByaWdodElkeCA9IDA7XG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgd2hpbGUgKGxlZnRJZHggPCBsZWZ0Lmxlbmd0aCAmJiByaWdodElkeCA8IHJpZ2h0Lmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IHJldCA9IGNvbXBhcmUobGVmdFtsZWZ0SWR4XSwgcmlnaHRbcmlnaHRJZHhdKTtcbiAgICAgICAgICAgIGlmIChyZXQgPD0gMCkge1xuICAgICAgICAgICAgICAgIC8vIHNtYWxsZXJfZXF1YWwgLT4gdGFrZSBsZWZ0IHRvIHByZXNlcnZlIG9yZGVyXG4gICAgICAgICAgICAgICAgZGF0YVtpKytdID0gbGVmdFtsZWZ0SWR4KytdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gZ3JlYXRlciAtPiB0YWtlIHJpZ2h0XG4gICAgICAgICAgICAgICAgZGF0YVtpKytdID0gcmlnaHRbcmlnaHRJZHgrK107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKGxlZnRJZHggPCBsZWZ0Lmxlbmd0aCkge1xuICAgICAgICAgICAgZGF0YVtpKytdID0gbGVmdFtsZWZ0SWR4KytdO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChyaWdodElkeCA8IHJpZ2h0Lmxlbmd0aCkge1xuICAgICAgICAgICAgZGF0YVtpKytdID0gcmlnaHRbcmlnaHRJZHgrK107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxufSkoVGV4dERvY3VtZW50IHx8IChUZXh0RG9jdW1lbnQgPSB7fSkpO1xuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgdGhlIHRleHQgZG9jdW1lbnQgZnJvbSB0aGUgbmV3IHZzY29kZS1sYW5ndWFnZXNlcnZlci10ZXh0ZG9jdW1lbnQgcGFja2FnZS5cbiAqL1xuY2xhc3MgRnVsbFRleHREb2N1bWVudCB7XG4gICAgY29uc3RydWN0b3IodXJpLCBsYW5ndWFnZUlkLCB2ZXJzaW9uLCBjb250ZW50KSB7XG4gICAgICAgIHRoaXMuX3VyaSA9IHVyaTtcbiAgICAgICAgdGhpcy5fbGFuZ3VhZ2VJZCA9IGxhbmd1YWdlSWQ7XG4gICAgICAgIHRoaXMuX3ZlcnNpb24gPSB2ZXJzaW9uO1xuICAgICAgICB0aGlzLl9jb250ZW50ID0gY29udGVudDtcbiAgICAgICAgdGhpcy5fbGluZU9mZnNldHMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGdldCB1cmkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl91cmk7XG4gICAgfVxuICAgIGdldCBsYW5ndWFnZUlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGFuZ3VhZ2VJZDtcbiAgICB9XG4gICAgZ2V0IHZlcnNpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92ZXJzaW9uO1xuICAgIH1cbiAgICBnZXRUZXh0KHJhbmdlKSB7XG4gICAgICAgIGlmIChyYW5nZSkge1xuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5vZmZzZXRBdChyYW5nZS5zdGFydCk7XG4gICAgICAgICAgICBsZXQgZW5kID0gdGhpcy5vZmZzZXRBdChyYW5nZS5lbmQpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRlbnQuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9jb250ZW50O1xuICAgIH1cbiAgICB1cGRhdGUoZXZlbnQsIHZlcnNpb24pIHtcbiAgICAgICAgdGhpcy5fY29udGVudCA9IGV2ZW50LnRleHQ7XG4gICAgICAgIHRoaXMuX3ZlcnNpb24gPSB2ZXJzaW9uO1xuICAgICAgICB0aGlzLl9saW5lT2Zmc2V0cyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZ2V0TGluZU9mZnNldHMoKSB7XG4gICAgICAgIGlmICh0aGlzLl9saW5lT2Zmc2V0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsZXQgbGluZU9mZnNldHMgPSBbXTtcbiAgICAgICAgICAgIGxldCB0ZXh0ID0gdGhpcy5fY29udGVudDtcbiAgICAgICAgICAgIGxldCBpc0xpbmVTdGFydCA9IHRydWU7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNMaW5lU3RhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGluZU9mZnNldHMucHVzaChpKTtcbiAgICAgICAgICAgICAgICAgICAgaXNMaW5lU3RhcnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGNoID0gdGV4dC5jaGFyQXQoaSk7XG4gICAgICAgICAgICAgICAgaXNMaW5lU3RhcnQgPSAoY2ggPT09ICdcXHInIHx8IGNoID09PSAnXFxuJyk7XG4gICAgICAgICAgICAgICAgaWYgKGNoID09PSAnXFxyJyAmJiBpICsgMSA8IHRleHQubGVuZ3RoICYmIHRleHQuY2hhckF0KGkgKyAxKSA9PT0gJ1xcbicpIHtcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc0xpbmVTdGFydCAmJiB0ZXh0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsaW5lT2Zmc2V0cy5wdXNoKHRleHQubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2xpbmVPZmZzZXRzID0gbGluZU9mZnNldHM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2xpbmVPZmZzZXRzO1xuICAgIH1cbiAgICBwb3NpdGlvbkF0KG9mZnNldCkge1xuICAgICAgICBvZmZzZXQgPSBNYXRoLm1heChNYXRoLm1pbihvZmZzZXQsIHRoaXMuX2NvbnRlbnQubGVuZ3RoKSwgMCk7XG4gICAgICAgIGxldCBsaW5lT2Zmc2V0cyA9IHRoaXMuZ2V0TGluZU9mZnNldHMoKTtcbiAgICAgICAgbGV0IGxvdyA9IDAsIGhpZ2ggPSBsaW5lT2Zmc2V0cy5sZW5ndGg7XG4gICAgICAgIGlmIChoaWdoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUG9zaXRpb24uY3JlYXRlKDAsIG9mZnNldCk7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKGxvdyA8IGhpZ2gpIHtcbiAgICAgICAgICAgIGxldCBtaWQgPSBNYXRoLmZsb29yKChsb3cgKyBoaWdoKSAvIDIpO1xuICAgICAgICAgICAgaWYgKGxpbmVPZmZzZXRzW21pZF0gPiBvZmZzZXQpIHtcbiAgICAgICAgICAgICAgICBoaWdoID0gbWlkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbG93ID0gbWlkICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBsb3cgaXMgdGhlIGxlYXN0IHggZm9yIHdoaWNoIHRoZSBsaW5lIG9mZnNldCBpcyBsYXJnZXIgdGhhbiB0aGUgY3VycmVudCBvZmZzZXRcbiAgICAgICAgLy8gb3IgYXJyYXkubGVuZ3RoIGlmIG5vIGxpbmUgb2Zmc2V0IGlzIGxhcmdlciB0aGFuIHRoZSBjdXJyZW50IG9mZnNldFxuICAgICAgICBsZXQgbGluZSA9IGxvdyAtIDE7XG4gICAgICAgIHJldHVybiBQb3NpdGlvbi5jcmVhdGUobGluZSwgb2Zmc2V0IC0gbGluZU9mZnNldHNbbGluZV0pO1xuICAgIH1cbiAgICBvZmZzZXRBdChwb3NpdGlvbikge1xuICAgICAgICBsZXQgbGluZU9mZnNldHMgPSB0aGlzLmdldExpbmVPZmZzZXRzKCk7XG4gICAgICAgIGlmIChwb3NpdGlvbi5saW5lID49IGxpbmVPZmZzZXRzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRlbnQubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBvc2l0aW9uLmxpbmUgPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbGluZU9mZnNldCA9IGxpbmVPZmZzZXRzW3Bvc2l0aW9uLmxpbmVdO1xuICAgICAgICBsZXQgbmV4dExpbmVPZmZzZXQgPSAocG9zaXRpb24ubGluZSArIDEgPCBsaW5lT2Zmc2V0cy5sZW5ndGgpID8gbGluZU9mZnNldHNbcG9zaXRpb24ubGluZSArIDFdIDogdGhpcy5fY29udGVudC5sZW5ndGg7XG4gICAgICAgIHJldHVybiBNYXRoLm1heChNYXRoLm1pbihsaW5lT2Zmc2V0ICsgcG9zaXRpb24uY2hhcmFjdGVyLCBuZXh0TGluZU9mZnNldCksIGxpbmVPZmZzZXQpO1xuICAgIH1cbiAgICBnZXQgbGluZUNvdW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRMaW5lT2Zmc2V0cygpLmxlbmd0aDtcbiAgICB9XG59XG52YXIgSXM7XG4oZnVuY3Rpb24gKElzKSB7XG4gICAgY29uc3QgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuICAgIGZ1bmN0aW9uIGRlZmluZWQodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCc7XG4gICAgfVxuICAgIElzLmRlZmluZWQgPSBkZWZpbmVkO1xuICAgIGZ1bmN0aW9uIHVuZGVmaW5lZCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJztcbiAgICB9XG4gICAgSXMudW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGZ1bmN0aW9uIGJvb2xlYW4odmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZTtcbiAgICB9XG4gICAgSXMuYm9vbGVhbiA9IGJvb2xlYW47XG4gICAgZnVuY3Rpb24gc3RyaW5nKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgU3RyaW5nXSc7XG4gICAgfVxuICAgIElzLnN0cmluZyA9IHN0cmluZztcbiAgICBmdW5jdGlvbiBudW1iZXIodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBOdW1iZXJdJztcbiAgICB9XG4gICAgSXMubnVtYmVyID0gbnVtYmVyO1xuICAgIGZ1bmN0aW9uIG51bWJlclJhbmdlKHZhbHVlLCBtaW4sIG1heCkge1xuICAgICAgICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IE51bWJlcl0nICYmIG1pbiA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSBtYXg7XG4gICAgfVxuICAgIElzLm51bWJlclJhbmdlID0gbnVtYmVyUmFuZ2U7XG4gICAgZnVuY3Rpb24gaW50ZWdlcih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IE51bWJlcl0nICYmIC0yMTQ3NDgzNjQ4IDw9IHZhbHVlICYmIHZhbHVlIDw9IDIxNDc0ODM2NDc7XG4gICAgfVxuICAgIElzLmludGVnZXIgPSBpbnRlZ2VyO1xuICAgIGZ1bmN0aW9uIHVpbnRlZ2VyKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgTnVtYmVyXScgJiYgMCA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSAyMTQ3NDgzNjQ3O1xuICAgIH1cbiAgICBJcy51aW50ZWdlciA9IHVpbnRlZ2VyO1xuICAgIGZ1bmN0aW9uIGZ1bmModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xuICAgIH1cbiAgICBJcy5mdW5jID0gZnVuYztcbiAgICBmdW5jdGlvbiBvYmplY3RMaXRlcmFsKHZhbHVlKSB7XG4gICAgICAgIC8vIFN0cmljdGx5IHNwZWFraW5nIGNsYXNzIGluc3RhbmNlcyBwYXNzIHRoaXMgY2hlY2sgYXMgd2VsbC4gU2luY2UgdGhlIExTUFxuICAgICAgICAvLyBkb2Vzbid0IHVzZSBjbGFzc2VzIHdlIGlnbm9yZSB0aGlzIGZvciBub3cuIElmIHdlIGRvIHdlIG5lZWQgdG8gYWRkIHNvbWV0aGluZ1xuICAgICAgICAvLyBsaWtlIHRoaXM6IGBPYmplY3QuZ2V0UHJvdG90eXBlT2YoT2JqZWN0LmdldFByb3RvdHlwZU9mKHgpKSA9PT0gbnVsbGBcbiAgICAgICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCc7XG4gICAgfVxuICAgIElzLm9iamVjdExpdGVyYWwgPSBvYmplY3RMaXRlcmFsO1xuICAgIGZ1bmN0aW9uIHR5cGVkQXJyYXkodmFsdWUsIGNoZWNrKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5ldmVyeShjaGVjayk7XG4gICAgfVxuICAgIElzLnR5cGVkQXJyYXkgPSB0eXBlZEFycmF5O1xufSkoSXMgfHwgKElzID0ge30pKTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUtBLGFBQU8sZUFBZSxTQUFTLGNBQWMsRUFBRSxPQUFPLEtBQUssQ0FBQztBQUM1RCxjQUFRLGNBQWMsUUFBUSxRQUFRLFFBQVEsT0FBTyxRQUFRLFFBQVEsUUFBUSxTQUFTLFFBQVEsU0FBUyxRQUFRLFVBQVU7QUFDekgs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Q3RCLGlCQUFPLEtBQUs7QUFBQSxRQUNoQjtBQUFBLE1BQ0o7QUFDQSxjQUFRLGVBQWU7QUFDdkIsVUFBTSxlQUFOLGNBQTJCLHlCQUF5QjtBQUFBLFFBQ2hELFlBQVksUUFBUTtBQUNoQixnQkFBTSxRQUFRLENBQUM7QUFBQSxRQUNuQjtBQUFBLE1BQ0o7QUFDQSxjQUFRLGVBQWU7QUFDdkIsVUFBTSxlQUFOLGNBQTJCLHlCQUF5QjtBQUFBLFFBQ2hELFlBQVksUUFBUTtBQUNoQixnQkFBTSxRQUFRLENBQUM7QUFBQSxRQUNuQjtBQUFBLE1BQ0o7QUFDQSxjQUFRLGVBQWU7QUFDdkIsVUFBTSxlQUFOLGNBQTJCLHlCQUF5QjtBQUFBLFFBQ2hELFlBQVksUUFBUTtBQUNoQixnQkFBTSxRQUFRLENBQUM7QUFBQSxRQUNuQjtBQUFBLE1BQ0o7QUFDQSxjQUFRLGVBQWU7QUFDdkIsVUFBTSxlQUFOLGNBQTJCLHlCQUF5QjtBQUFBLFFBQ2hELFlBQVksUUFBUTtBQUNoQixnQkFBTSxRQUFRLENBQUM7QUFBQSxRQUNuQjtBQUFBLE1BQ0o7QUFDQSxjQUFRLGVBQWU7QUFDdkIsVUFBTSxlQUFOLGNBQTJCLHlCQUF5QjtBQUFBLFFBQ2hELFlBQVksUUFBUTtBQUNoQixnQkFBTSxRQUFRLENBQUM7QUFBQSxRQUNuQjtBQUFBLE1BQ0o7QUFDQSxjQUFRLGVBQWU7QUFDdkIsVUFBTSxlQUFOLGNBQTJCLHlCQUF5QjtBQUFBLFFBQ2hELFlBQVksUUFBUTtBQUNoQixnQkFBTSxRQUFRLENBQUM7QUFBQSxRQUNuQjtBQUFBLE1BQ0o7QUFDQSxjQUFRLGVBQWU7QUFDdkIsVUFBTSxlQUFOLGNBQTJCLHlCQUF5QjtBQUFBLFFBQ2hELFlBQVksUUFBUTtBQUNoQixnQkFBTSxRQUFRLENBQUM7QUFBQSxRQUNuQjtBQUFBLE1BQ0o7QUFDQSxjQUFRLGVBQWU7QUFDdkIsVUFBTSxlQUFOLGNBQTJCLHlCQUF5QjtBQUFBLFFBQ2hELFlBQVksUUFBUTtBQUNoQixnQkFBTSxRQUFRLENBQUM7QUFBQSxRQUNuQjtBQUFBLE1BQ0o7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YWdlIiwgIlRvdWNoIiwgIkRpc3Bvc2FibGUiLCAiUkFMIiwgIkV2ZW50IiwgIklzIiwgIkNhbmNlbGxhdGlvblRva2VuIiwgIkNhbmNlbGxhdGlvblN0YXRlIiwgIl9jb25uIiwgIklzIiwgIk1lc3NhZ2VSZWFkZXIiLCAiQWJzdHJhY3RNZXNzYWdlUmVhZGVyIiwgIlJlc29sdmVkTWVzc2FnZVJlYWRlck9wdGlvbnMiLCAiSXMiLCAiTWVzc2FnZVdyaXRlciIsICJBYnN0cmFjdE1lc3NhZ2VXcml0ZXIiLCAiUmVzb2x2ZWRNZXNzYWdlV3JpdGVyT3B0aW9ucyIsICJyZXN1bHQiLCAiSXMiLCAiQ2FuY2VsTm90aWZpY2F0aW9uIiwgIlByb2dyZXNzVG9rZW4iLCAiUHJvZ3Jlc3NOb3RpZmljYXRpb24iLCAiU3RhclJlcXVlc3RIYW5kbGVyIiwgIlRyYWNlIiwgIlRyYWNlVmFsdWVzIiwgIlRyYWNlRm9ybWF0IiwgIlNldFRyYWNlTm90aWZpY2F0aW9uIiwgIkxvZ1RyYWNlTm90aWZpY2F0aW9uIiwgIkNvbm5lY3Rpb25FcnJvcnMiLCAiQ29ubmVjdGlvblN0cmF0ZWd5IiwgIklkQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSIsICJSZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSIsICJDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5IiwgIkNhbmNlbGxhdGlvblNlbmRlclN0cmF0ZWd5IiwgIkNhbmNlbGxhdGlvblN0cmF0ZWd5IiwgIk1lc3NhZ2VTdHJhdGVneSIsICJDb25uZWN0aW9uT3B0aW9ucyIsICJDb25uZWN0aW9uU3RhdGUiLCAiY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24iLCAic3RhcnRUaW1lIiwgIlJJTCIsICJtIiwgImV4cG9ydHMiLCAiY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24iLCAiaW1wb3J0X3ZzY29kZV9qc29ucnBjIiwgImltcG9ydF92c2NvZGVfanNvbnJwYyIsICJpbXBvcnRfdnNjb2RlX2pzb25ycGMiLCAiaW1wb3J0X3ZzY29kZV9qc29ucnBjIiwgIkRvY3VtZW50VXJpIiwgIlVSSSIsICJpbnRlZ2VyIiwgInVpbnRlZ2VyIiwgIlBvc2l0aW9uIiwgIlJhbmdlIiwgIkxvY2F0aW9uIiwgIkxvY2F0aW9uTGluayIsICJDb2xvciIsICJDb2xvckluZm9ybWF0aW9uIiwgIkNvbG9yUHJlc2VudGF0aW9uIiwgIkZvbGRpbmdSYW5nZUtpbmQiLCAiRm9sZGluZ1JhbmdlIiwgIkRpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24iLCAibG9jYXRpb24iLCAiRGlhZ25vc3RpY1NldmVyaXR5IiwgIkRpYWdub3N0aWNUYWciLCAiQ29kZURlc2NyaXB0aW9uIiwgIkRpYWdub3N0aWMiLCAiQ29tbWFuZCIsICJUZXh0RWRpdCIsICJDaGFuZ2VBbm5vdGF0aW9uIiwgIkNoYW5nZUFubm90YXRpb25JZGVudGlmaWVyIiwgIkFubm90YXRlZFRleHRFZGl0IiwgIlRleHREb2N1bWVudEVkaXQiLCAiQ3JlYXRlRmlsZSIsICJSZW5hbWVGaWxlIiwgIkRlbGV0ZUZpbGUiLCAiV29ya3NwYWNlRWRpdCIsICJUZXh0RG9jdW1lbnRJZGVudGlmaWVyIiwgIlZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIiLCAiT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIiwgIlRleHREb2N1bWVudEl0ZW0iLCAiTWFya3VwS2luZCIsICJNYXJrdXBDb250ZW50IiwgIkNvbXBsZXRpb25JdGVtS2luZCIsICJJbnNlcnRUZXh0Rm9ybWF0IiwgIkNvbXBsZXRpb25JdGVtVGFnIiwgIkluc2VydFJlcGxhY2VFZGl0IiwgIlJhbmdlIiwgIkluc2VydFRleHRNb2RlIiwgIkNvbXBsZXRpb25JdGVtTGFiZWxEZXRhaWxzIiwgIkNvbXBsZXRpb25JdGVtIiwgIkNvbXBsZXRpb25MaXN0IiwgIk1hcmtlZFN0cmluZyIsICJIb3ZlciIsICJQYXJhbWV0ZXJJbmZvcm1hdGlvbiIsICJTaWduYXR1cmVJbmZvcm1hdGlvbiIsICJEb2N1bWVudEhpZ2hsaWdodEtpbmQiLCAiRG9jdW1lbnRIaWdobGlnaHQiLCAiU3ltYm9sS2luZCIsICJTeW1ib2xUYWciLCAiU3ltYm9sSW5mb3JtYXRpb24iLCAiV29ya3NwYWNlU3ltYm9sIiwgIkRvY3VtZW50U3ltYm9sIiwgIkNvZGVBY3Rpb25LaW5kIiwgIkNvZGVBY3Rpb25UcmlnZ2VyS2luZCIsICJDb2RlQWN0aW9uQ29udGV4dCIsICJDb2RlQWN0aW9uIiwgIkNvZGVMZW5zIiwgIkZvcm1hdHRpbmdPcHRpb25zIiwgIkRvY3VtZW50TGluayIsICJTZWxlY3Rpb25SYW5nZSIsICJTZW1hbnRpY1Rva2VuVHlwZXMiLCAiU2VtYW50aWNUb2tlbk1vZGlmaWVycyIsICJTZW1hbnRpY1Rva2VucyIsICJJbmxpbmVWYWx1ZVRleHQiLCAiSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cCIsICJJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbiIsICJJbmxpbmVWYWx1ZUNvbnRleHQiLCAiSW5sYXlIaW50S2luZCIsICJJbmxheUhpbnRMYWJlbFBhcnQiLCAiSW5sYXlIaW50IiwgIlBvc2l0aW9uIiwgIlN0cmluZ1ZhbHVlIiwgIklubGluZUNvbXBsZXRpb25JdGVtIiwgIklubGluZUNvbXBsZXRpb25MaXN0IiwgIklubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZCIsICJTZWxlY3RlZENvbXBsZXRpb25JbmZvIiwgIklubGluZUNvbXBsZXRpb25Db250ZXh0IiwgIldvcmtzcGFjZUZvbGRlciIsICJUZXh0RG9jdW1lbnQiLCAiUG9zaXRpb24iLCAiSXMiLCAidW5kZWZpbmVkIiwgImludGVnZXIiLCAidWludGVnZXIiLCAibSJdCn0K +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvY29tbW9uL2lzLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlcy5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vbGlua2VkTWFwLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9kaXNwb3NhYmxlLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9yYWwuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvY29tbW9uL2V2ZW50cy5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vY2FuY2VsbGF0aW9uLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9zaGFyZWRBcnJheUNhbmNlbGxhdGlvbi5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vc2VtYXBob3JlLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlUmVhZGVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlV3JpdGVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlQnVmZmVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9jb25uZWN0aW9uLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9hcGkuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvYnJvd3Nlci9yaWwuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvYnJvd3Nlci9tYWluLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvYnJvd3Nlci5qcyIsICJsc3AvamF2YS1sc3AtY2xpZW50LnRzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLXdzLWpzb25ycGMvc3JjL2Rpc3Bvc2FibGUudHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvc29ja2V0L3NvY2tldC50cyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS13cy1qc29ucnBjL3NyYy9zb2NrZXQvcmVhZGVyLnRzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLXdzLWpzb25ycGMvc3JjL3NvY2tldC93cml0ZXIudHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvc29ja2V0L2Nvbm5lY3Rpb24udHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvY29ubmVjdGlvbi50cyIsICJsc3AvbW9uYWNvLXNoaW0udHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtbGFuZ3VhZ2VzZXJ2ZXItdHlwZXMvbGliL2VzbS9tYWluLmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuc3RyaW5nQXJyYXkgPSBleHBvcnRzLmFycmF5ID0gZXhwb3J0cy5mdW5jID0gZXhwb3J0cy5lcnJvciA9IGV4cG9ydHMubnVtYmVyID0gZXhwb3J0cy5zdHJpbmcgPSBleHBvcnRzLmJvb2xlYW4gPSB2b2lkIDA7XG5mdW5jdGlvbiBib29sZWFuKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZTtcbn1cbmV4cG9ydHMuYm9vbGVhbiA9IGJvb2xlYW47XG5mdW5jdGlvbiBzdHJpbmcodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZztcbn1cbmV4cG9ydHMuc3RyaW5nID0gc3RyaW5nO1xuZnVuY3Rpb24gbnVtYmVyKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdmFsdWUgaW5zdGFuY2VvZiBOdW1iZXI7XG59XG5leHBvcnRzLm51bWJlciA9IG51bWJlcjtcbmZ1bmN0aW9uIGVycm9yKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgRXJyb3I7XG59XG5leHBvcnRzLmVycm9yID0gZXJyb3I7XG5mdW5jdGlvbiBmdW5jKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cbmV4cG9ydHMuZnVuYyA9IGZ1bmM7XG5mdW5jdGlvbiBhcnJheSh2YWx1ZSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cbmV4cG9ydHMuYXJyYXkgPSBhcnJheTtcbmZ1bmN0aW9uIHN0cmluZ0FycmF5KHZhbHVlKSB7XG4gICAgcmV0dXJuIGFycmF5KHZhbHVlKSAmJiB2YWx1ZS5ldmVyeShlbGVtID0+IHN0cmluZyhlbGVtKSk7XG59XG5leHBvcnRzLnN0cmluZ0FycmF5ID0gc3RyaW5nQXJyYXk7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLk1lc3NhZ2UgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU5ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlOCA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTcgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU2ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNSA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTQgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUzID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMiA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTEgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUwID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTkgPSBleHBvcnRzLlJlcXVlc3RUeXBlOCA9IGV4cG9ydHMuUmVxdWVzdFR5cGU3ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTYgPSBleHBvcnRzLlJlcXVlc3RUeXBlNSA9IGV4cG9ydHMuUmVxdWVzdFR5cGU0ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTMgPSBleHBvcnRzLlJlcXVlc3RUeXBlMiA9IGV4cG9ydHMuUmVxdWVzdFR5cGUxID0gZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IGV4cG9ydHMuUmVxdWVzdFR5cGUwID0gZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUgPSBleHBvcnRzLlBhcmFtZXRlclN0cnVjdHVyZXMgPSBleHBvcnRzLlJlc3BvbnNlRXJyb3IgPSBleHBvcnRzLkVycm9yQ29kZXMgPSB2b2lkIDA7XG5jb25zdCBpcyA9IHJlcXVpcmUoXCIuL2lzXCIpO1xuLyoqXG4gKiBQcmVkZWZpbmVkIGVycm9yIGNvZGVzLlxuICovXG52YXIgRXJyb3JDb2RlcztcbihmdW5jdGlvbiAoRXJyb3JDb2Rlcykge1xuICAgIC8vIERlZmluZWQgYnkgSlNPTiBSUENcbiAgICBFcnJvckNvZGVzLlBhcnNlRXJyb3IgPSAtMzI3MDA7XG4gICAgRXJyb3JDb2Rlcy5JbnZhbGlkUmVxdWVzdCA9IC0zMjYwMDtcbiAgICBFcnJvckNvZGVzLk1ldGhvZE5vdEZvdW5kID0gLTMyNjAxO1xuICAgIEVycm9yQ29kZXMuSW52YWxpZFBhcmFtcyA9IC0zMjYwMjtcbiAgICBFcnJvckNvZGVzLkludGVybmFsRXJyb3IgPSAtMzI2MDM7XG4gICAgLyoqXG4gICAgICogVGhpcyBpcyB0aGUgc3RhcnQgcmFuZ2Ugb2YgSlNPTiBSUEMgcmVzZXJ2ZWQgZXJyb3IgY29kZXMuXG4gICAgICogSXQgZG9lc24ndCBkZW5vdGUgYSByZWFsIGVycm9yIGNvZGUuIE5vIGFwcGxpY2F0aW9uIGVycm9yIGNvZGVzIHNob3VsZFxuICAgICAqIGJlIGRlZmluZWQgYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCByYW5nZS4gRm9yIGJhY2t3YXJkc1xuICAgICAqIGNvbXBhdGliaWxpdHkgdGhlIGBTZXJ2ZXJOb3RJbml0aWFsaXplZGAgYW5kIHRoZSBgVW5rbm93bkVycm9yQ29kZWBcbiAgICAgKiBhcmUgbGVmdCBpbiB0aGUgcmFuZ2UuXG4gICAgICpcbiAgICAgKiBAc2luY2UgMy4xNi4wXG4gICAgKi9cbiAgICBFcnJvckNvZGVzLmpzb25ycGNSZXNlcnZlZEVycm9yUmFuZ2VTdGFydCA9IC0zMjA5OTtcbiAgICAvKiogQGRlcHJlY2F0ZWQgdXNlICBqc29ucnBjUmVzZXJ2ZWRFcnJvclJhbmdlU3RhcnQgKi9cbiAgICBFcnJvckNvZGVzLnNlcnZlckVycm9yU3RhcnQgPSAtMzIwOTk7XG4gICAgLyoqXG4gICAgICogQW4gZXJyb3Igb2NjdXJyZWQgd2hlbiB3cml0ZSBhIG1lc3NhZ2UgdG8gdGhlIHRyYW5zcG9ydCBsYXllci5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLk1lc3NhZ2VXcml0ZUVycm9yID0gLTMyMDk5O1xuICAgIC8qKlxuICAgICAqIEFuIGVycm9yIG9jY3VycmVkIHdoZW4gcmVhZGluZyBhIG1lc3NhZ2UgZnJvbSB0aGUgdHJhbnNwb3J0IGxheWVyLlxuICAgICAqL1xuICAgIEVycm9yQ29kZXMuTWVzc2FnZVJlYWRFcnJvciA9IC0zMjA5ODtcbiAgICAvKipcbiAgICAgKiBUaGUgY29ubmVjdGlvbiBnb3QgZGlzcG9zZWQgb3IgbG9zdCBhbmQgYWxsIHBlbmRpbmcgcmVzcG9uc2VzIGdvdFxuICAgICAqIHJlamVjdGVkLlxuICAgICAqL1xuICAgIEVycm9yQ29kZXMuUGVuZGluZ1Jlc3BvbnNlUmVqZWN0ZWQgPSAtMzIwOTc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gaXMgaW5hY3RpdmUgYW5kIGEgdXNlIG9mIGl0IGZhaWxlZC5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLkNvbm5lY3Rpb25JbmFjdGl2ZSA9IC0zMjA5NjtcbiAgICAvKipcbiAgICAgKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBhIHNlcnZlciByZWNlaXZlZCBhIG5vdGlmaWNhdGlvbiBvclxuICAgICAqIHJlcXVlc3QgYmVmb3JlIHRoZSBzZXJ2ZXIgaGFzIHJlY2VpdmVkIHRoZSBgaW5pdGlhbGl6ZWAgcmVxdWVzdC5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLlNlcnZlck5vdEluaXRpYWxpemVkID0gLTMyMDAyO1xuICAgIEVycm9yQ29kZXMuVW5rbm93bkVycm9yQ29kZSA9IC0zMjAwMTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIHRoZSBlbmQgcmFuZ2Ugb2YgSlNPTiBSUEMgcmVzZXJ2ZWQgZXJyb3IgY29kZXMuXG4gICAgICogSXQgZG9lc24ndCBkZW5vdGUgYSByZWFsIGVycm9yIGNvZGUuXG4gICAgICpcbiAgICAgKiBAc2luY2UgMy4xNi4wXG4gICAgKi9cbiAgICBFcnJvckNvZGVzLmpzb25ycGNSZXNlcnZlZEVycm9yUmFuZ2VFbmQgPSAtMzIwMDA7XG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSAganNvbnJwY1Jlc2VydmVkRXJyb3JSYW5nZUVuZCAqL1xuICAgIEVycm9yQ29kZXMuc2VydmVyRXJyb3JFbmQgPSAtMzIwMDA7XG59KShFcnJvckNvZGVzIHx8IChleHBvcnRzLkVycm9yQ29kZXMgPSBFcnJvckNvZGVzID0ge30pKTtcbi8qKlxuICogQW4gZXJyb3Igb2JqZWN0IHJldHVybiBpbiBhIHJlc3BvbnNlIGluIGNhc2UgYSByZXF1ZXN0XG4gKiBoYXMgZmFpbGVkLlxuICovXG5jbGFzcyBSZXNwb25zZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNvZGUsIG1lc3NhZ2UsIGRhdGEpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuY29kZSA9IGlzLm51bWJlcihjb2RlKSA/IGNvZGUgOiBFcnJvckNvZGVzLlVua25vd25FcnJvckNvZGU7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBSZXNwb25zZUVycm9yLnByb3RvdHlwZSk7XG4gICAgfVxuICAgIHRvSnNvbigpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgY29kZTogdGhpcy5jb2RlLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLmRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmRhdGEgPSB0aGlzLmRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5leHBvcnRzLlJlc3BvbnNlRXJyb3IgPSBSZXNwb25zZUVycm9yO1xuY2xhc3MgUGFyYW1ldGVyU3RydWN0dXJlcyB7XG4gICAgY29uc3RydWN0b3Ioa2luZCkge1xuICAgICAgICB0aGlzLmtpbmQgPSBraW5kO1xuICAgIH1cbiAgICBzdGF0aWMgaXModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8gfHwgdmFsdWUgPT09IFBhcmFtZXRlclN0cnVjdHVyZXMuYnlOYW1lIHx8IHZhbHVlID09PSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5UG9zaXRpb247XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5raW5kO1xuICAgIH1cbn1cbmV4cG9ydHMuUGFyYW1ldGVyU3RydWN0dXJlcyA9IFBhcmFtZXRlclN0cnVjdHVyZXM7XG4vKipcbiAqIFRoZSBwYXJhbWV0ZXIgc3RydWN0dXJlIGlzIGF1dG9tYXRpY2FsbHkgaW5mZXJyZWQgb24gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzXG4gKiBhbmQgdGhlIHBhcmFtZXRlciB0eXBlIGluIGNhc2Ugb2YgYSBzaW5nbGUgcGFyYW0uXG4gKi9cblBhcmFtZXRlclN0cnVjdHVyZXMuYXV0byA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdhdXRvJyk7XG4vKipcbiAqIEZvcmNlcyBgYnlQb3NpdGlvbmAgcGFyYW1ldGVyIHN0cnVjdHVyZS4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGhhdmUgYSBzaW5nbGVcbiAqIHBhcmFtZXRlciB3aGljaCBoYXMgYSBsaXRlcmFsIHR5cGUuXG4gKi9cblBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbiA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdieVBvc2l0aW9uJyk7XG4vKipcbiAqIEZvcmNlcyBgYnlOYW1lYCBwYXJhbWV0ZXIgc3RydWN0dXJlLiBUaGlzIGlzIG9ubHkgdXNlZnVsIHdoZW4gaGF2aW5nIGEgc2luZ2xlXG4gKiBwYXJhbWV0ZXIuIFRoZSBsaWJyYXJ5IHdpbGwgcmVwb3J0IGVycm9ycyBpZiB1c2VkIHdpdGggYSBkaWZmZXJlbnQgbnVtYmVyIG9mXG4gKiBwYXJhbWV0ZXJzLlxuICovXG5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdieU5hbWUnKTtcbi8qKlxuICogQW4gYWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgYSBNZXNzYWdlVHlwZS5cbiAqL1xuY2xhc3MgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIG51bWJlck9mUGFyYW1zKSB7XG4gICAgICAgIHRoaXMubWV0aG9kID0gbWV0aG9kO1xuICAgICAgICB0aGlzLm51bWJlck9mUGFyYW1zID0gbnVtYmVyT2ZQYXJhbXM7XG4gICAgfVxuICAgIGdldCBwYXJhbWV0ZXJTdHJ1Y3R1cmVzKCkge1xuICAgICAgICByZXR1cm4gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvO1xuICAgIH1cbn1cbmV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlID0gQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlO1xuLyoqXG4gKiBDbGFzc2VzIHRvIHR5cGUgcmVxdWVzdCByZXNwb25zZSBwYWlyc1xuICovXG5jbGFzcyBSZXF1ZXN0VHlwZTAgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDApO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGUwID0gUmVxdWVzdFR5cGUwO1xuY2xhc3MgUmVxdWVzdFR5cGUgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCwgX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8pIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAxKTtcbiAgICAgICAgdGhpcy5fcGFyYW1ldGVyU3RydWN0dXJlcyA9IF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbiAgICBnZXQgcGFyYW1ldGVyU3RydWN0dXJlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXM7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IFJlcXVlc3RUeXBlO1xuY2xhc3MgUmVxdWVzdFR5cGUxIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMSk7XG4gICAgICAgIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBfcGFyYW1ldGVyU3RydWN0dXJlcztcbiAgICB9XG4gICAgZ2V0IHBhcmFtZXRlclN0cnVjdHVyZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGUxID0gUmVxdWVzdFR5cGUxO1xuY2xhc3MgUmVxdWVzdFR5cGUyIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAyKTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlMiA9IFJlcXVlc3RUeXBlMjtcbmNsYXNzIFJlcXVlc3RUeXBlMyBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMyk7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTMgPSBSZXF1ZXN0VHlwZTM7XG5jbGFzcyBSZXF1ZXN0VHlwZTQgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDQpO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGU0ID0gUmVxdWVzdFR5cGU0O1xuY2xhc3MgUmVxdWVzdFR5cGU1IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA1KTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlNSA9IFJlcXVlc3RUeXBlNTtcbmNsYXNzIFJlcXVlc3RUeXBlNiBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNik7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTYgPSBSZXF1ZXN0VHlwZTY7XG5jbGFzcyBSZXF1ZXN0VHlwZTcgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDcpO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGU3ID0gUmVxdWVzdFR5cGU3O1xuY2xhc3MgUmVxdWVzdFR5cGU4IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA4KTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlOCA9IFJlcXVlc3RUeXBlODtcbmNsYXNzIFJlcXVlc3RUeXBlOSBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgOSk7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTkgPSBSZXF1ZXN0VHlwZTk7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMSk7XG4gICAgICAgIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBfcGFyYW1ldGVyU3RydWN0dXJlcztcbiAgICB9XG4gICAgZ2V0IHBhcmFtZXRlclN0cnVjdHVyZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZSA9IE5vdGlmaWNhdGlvblR5cGU7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlMCBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMCk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMCA9IE5vdGlmaWNhdGlvblR5cGUwO1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTEgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCwgX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8pIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAxKTtcbiAgICAgICAgdGhpcy5fcGFyYW1ldGVyU3RydWN0dXJlcyA9IF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbiAgICBnZXQgcGFyYW1ldGVyU3RydWN0dXJlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXM7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMSA9IE5vdGlmaWNhdGlvblR5cGUxO1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDIpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTIgPSBOb3RpZmljYXRpb25UeXBlMjtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGUzIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAzKTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGUzID0gTm90aWZpY2F0aW9uVHlwZTM7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlNCBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNCk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNCA9IE5vdGlmaWNhdGlvblR5cGU0O1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTUgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDUpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTUgPSBOb3RpZmljYXRpb25UeXBlNTtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGU2IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA2KTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGU2ID0gTm90aWZpY2F0aW9uVHlwZTY7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlNyBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNyk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNyA9IE5vdGlmaWNhdGlvblR5cGU3O1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTggZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDgpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTggPSBOb3RpZmljYXRpb25UeXBlODtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGU5IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA5KTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGU5ID0gTm90aWZpY2F0aW9uVHlwZTk7XG52YXIgTWVzc2FnZTtcbihmdW5jdGlvbiAoTWVzc2FnZSkge1xuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoZSBnaXZlbiBtZXNzYWdlIGlzIGEgcmVxdWVzdCBtZXNzYWdlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gbWVzc2FnZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBpcy5zdHJpbmcoY2FuZGlkYXRlLm1ldGhvZCkgJiYgKGlzLnN0cmluZyhjYW5kaWRhdGUuaWQpIHx8IGlzLm51bWJlcihjYW5kaWRhdGUuaWQpKTtcbiAgICB9XG4gICAgTWVzc2FnZS5pc1JlcXVlc3QgPSBpc1JlcXVlc3Q7XG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhlIGdpdmVuIG1lc3NhZ2UgaXMgYSBub3RpZmljYXRpb24gbWVzc2FnZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTm90aWZpY2F0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gbWVzc2FnZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBpcy5zdHJpbmcoY2FuZGlkYXRlLm1ldGhvZCkgJiYgbWVzc2FnZS5pZCA9PT0gdm9pZCAwO1xuICAgIH1cbiAgICBNZXNzYWdlLmlzTm90aWZpY2F0aW9uID0gaXNOb3RpZmljYXRpb247XG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhlIGdpdmVuIG1lc3NhZ2UgaXMgYSByZXNwb25zZSBtZXNzYWdlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNSZXNwb25zZShtZXNzYWdlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IG1lc3NhZ2U7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgKGNhbmRpZGF0ZS5yZXN1bHQgIT09IHZvaWQgMCB8fCAhIWNhbmRpZGF0ZS5lcnJvcikgJiYgKGlzLnN0cmluZyhjYW5kaWRhdGUuaWQpIHx8IGlzLm51bWJlcihjYW5kaWRhdGUuaWQpIHx8IGNhbmRpZGF0ZS5pZCA9PT0gbnVsbCk7XG4gICAgfVxuICAgIE1lc3NhZ2UuaXNSZXNwb25zZSA9IGlzUmVzcG9uc2U7XG59KShNZXNzYWdlIHx8IChleHBvcnRzLk1lc3NhZ2UgPSBNZXNzYWdlID0ge30pKTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xudmFyIF9hO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5MUlVDYWNoZSA9IGV4cG9ydHMuTGlua2VkTWFwID0gZXhwb3J0cy5Ub3VjaCA9IHZvaWQgMDtcbnZhciBUb3VjaDtcbihmdW5jdGlvbiAoVG91Y2gpIHtcbiAgICBUb3VjaC5Ob25lID0gMDtcbiAgICBUb3VjaC5GaXJzdCA9IDE7XG4gICAgVG91Y2guQXNPbGQgPSBUb3VjaC5GaXJzdDtcbiAgICBUb3VjaC5MYXN0ID0gMjtcbiAgICBUb3VjaC5Bc05ldyA9IFRvdWNoLkxhc3Q7XG59KShUb3VjaCB8fCAoZXhwb3J0cy5Ub3VjaCA9IFRvdWNoID0ge30pKTtcbmNsYXNzIExpbmtlZE1hcCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXNbX2FdID0gJ0xpbmtlZE1hcCc7XG4gICAgICAgIHRoaXMuX21hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5faGVhZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fdGFpbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IDA7XG4gICAgICAgIHRoaXMuX3N0YXRlID0gMDtcbiAgICB9XG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuX21hcC5jbGVhcigpO1xuICAgICAgICB0aGlzLl9oZWFkID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl90YWlsID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9zaXplID0gMDtcbiAgICAgICAgdGhpcy5fc3RhdGUrKztcbiAgICB9XG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLl9oZWFkICYmICF0aGlzLl90YWlsO1xuICAgIH1cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpemU7XG4gICAgfVxuICAgIGdldCBmaXJzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlYWQ/LnZhbHVlO1xuICAgIH1cbiAgICBnZXQgbGFzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhaWw/LnZhbHVlO1xuICAgIH1cbiAgICBoYXMoa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXAuaGFzKGtleSk7XG4gICAgfVxuICAgIGdldChrZXksIHRvdWNoID0gVG91Y2guTm9uZSkge1xuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5fbWFwLmdldChrZXkpO1xuICAgICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRvdWNoICE9PSBUb3VjaC5Ob25lKSB7XG4gICAgICAgICAgICB0aGlzLnRvdWNoKGl0ZW0sIHRvdWNoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICB9XG4gICAgc2V0KGtleSwgdmFsdWUsIHRvdWNoID0gVG91Y2guTm9uZSkge1xuICAgICAgICBsZXQgaXRlbSA9IHRoaXMuX21hcC5nZXQoa2V5KTtcbiAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgIGl0ZW0udmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIGlmICh0b3VjaCAhPT0gVG91Y2guTm9uZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudG91Y2goaXRlbSwgdG91Y2gpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaXRlbSA9IHsga2V5LCB2YWx1ZSwgbmV4dDogdW5kZWZpbmVkLCBwcmV2aW91czogdW5kZWZpbmVkIH07XG4gICAgICAgICAgICBzd2l0Y2ggKHRvdWNoKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBUb3VjaC5Ob25lOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFRvdWNoLkZpcnN0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1GaXJzdChpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBUb3VjaC5MYXN0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX21hcC5zZXQoa2V5LCBpdGVtKTtcbiAgICAgICAgICAgIHRoaXMuX3NpemUrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGVsZXRlKGtleSkge1xuICAgICAgICByZXR1cm4gISF0aGlzLnJlbW92ZShrZXkpO1xuICAgIH1cbiAgICByZW1vdmUoa2V5KSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl9tYXAuZ2V0KGtleSk7XG4gICAgICAgIGlmICghaXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tYXAuZGVsZXRlKGtleSk7XG4gICAgICAgIHRoaXMucmVtb3ZlSXRlbShpdGVtKTtcbiAgICAgICAgdGhpcy5fc2l6ZS0tO1xuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICB9XG4gICAgc2hpZnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5faGVhZCAmJiAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2hlYWQgfHwgIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIHRoaXMuX21hcC5kZWxldGUoaXRlbS5rZXkpO1xuICAgICAgICB0aGlzLnJlbW92ZUl0ZW0oaXRlbSk7XG4gICAgICAgIHRoaXMuX3NpemUtLTtcbiAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7XG4gICAgfVxuICAgIGZvckVhY2goY2FsbGJhY2tmbiwgdGhpc0FyZykge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3N0YXRlO1xuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICAgICAgICBpZiAodGhpc0FyZykge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrZm4uYmluZCh0aGlzQXJnKShjdXJyZW50LnZhbHVlLCBjdXJyZW50LmtleSwgdGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFja2ZuKGN1cnJlbnQudmFsdWUsIGN1cnJlbnQua2V5LCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gc3RhdGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExpbmtlZE1hcCBnb3QgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAga2V5cygpIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9zdGF0ZTtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLl9oZWFkO1xuICAgICAgICBjb25zdCBpdGVyYXRvciA9IHtcbiAgICAgICAgICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fc3RhdGUgIT09IHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTGlua2VkTWFwIGdvdCBtb2RpZmllZCBkdXJpbmcgaXRlcmF0aW9uLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7IHZhbHVlOiBjdXJyZW50LmtleSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICB9XG4gICAgdmFsdWVzKCkge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3N0YXRlO1xuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIGNvbnN0IGl0ZXJhdG9yID0ge1xuICAgICAgICAgICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlcmF0b3I7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBMaW5rZWRNYXAgZ290IG1vZGlmaWVkIGR1cmluZyBpdGVyYXRpb24uYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHsgdmFsdWU6IGN1cnJlbnQudmFsdWUsIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gaXRlcmF0b3I7XG4gICAgfVxuICAgIGVudHJpZXMoKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5fc3RhdGU7XG4gICAgICAgIGxldCBjdXJyZW50ID0gdGhpcy5faGVhZDtcbiAgICAgICAgY29uc3QgaXRlcmF0b3IgPSB7XG4gICAgICAgICAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3N0YXRlICE9PSBzdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExpbmtlZE1hcCBnb3QgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geyB2YWx1ZTogW2N1cnJlbnQua2V5LCBjdXJyZW50LnZhbHVlXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICB9XG4gICAgWyhfYSA9IFN5bWJvbC50b1N0cmluZ1RhZywgU3ltYm9sLml0ZXJhdG9yKV0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMoKTtcbiAgICB9XG4gICAgdHJpbU9sZChuZXdTaXplKSB7XG4gICAgICAgIGlmIChuZXdTaXplID49IHRoaXMuc2l6ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuZXdTaXplID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLl9oZWFkO1xuICAgICAgICBsZXQgY3VycmVudFNpemUgPSB0aGlzLnNpemU7XG4gICAgICAgIHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnRTaXplID4gbmV3U2l6ZSkge1xuICAgICAgICAgICAgdGhpcy5fbWFwLmRlbGV0ZShjdXJyZW50LmtleSk7XG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0O1xuICAgICAgICAgICAgY3VycmVudFNpemUtLTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9oZWFkID0gY3VycmVudDtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IGN1cnJlbnRTaXplO1xuICAgICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICAgICAgY3VycmVudC5wcmV2aW91cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgIH1cbiAgICBhZGRJdGVtRmlyc3QoaXRlbSkge1xuICAgICAgICAvLyBGaXJzdCB0aW1lIEluc2VydFxuICAgICAgICBpZiAoIXRoaXMuX2hlYWQgJiYgIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRoaXMuX3RhaWwgPSBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCF0aGlzLl9oZWFkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbGlzdCcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdGhpcy5faGVhZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQucHJldmlvdXMgPSBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2hlYWQgPSBpdGVtO1xuICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgIH1cbiAgICBhZGRJdGVtTGFzdChpdGVtKSB7XG4gICAgICAgIC8vIEZpcnN0IHRpbWUgSW5zZXJ0XG4gICAgICAgIGlmICghdGhpcy5faGVhZCAmJiAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgdGhpcy5faGVhZCA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpdGVtLnByZXZpb3VzID0gdGhpcy5fdGFpbDtcbiAgICAgICAgICAgIHRoaXMuX3RhaWwubmV4dCA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW07XG4gICAgICAgIHRoaXMuX3N0YXRlKys7XG4gICAgfVxuICAgIHJlbW92ZUl0ZW0oaXRlbSkge1xuICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCAmJiBpdGVtID09PSB0aGlzLl90YWlsKSB7XG4gICAgICAgICAgICB0aGlzLl9oZWFkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpdGVtID09PSB0aGlzLl9oZWFkKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGNhbiBvbmx5IGhhcHBlbmVkIGlmIHNpemUgPT09IDEgd2hpY2ggaXMgaGFuZGxlXG4gICAgICAgICAgICAvLyBieSB0aGUgY2FzZSBhYm92ZS5cbiAgICAgICAgICAgIGlmICghaXRlbS5uZXh0KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxpc3QnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGl0ZW0ubmV4dC5wcmV2aW91cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQgPSBpdGVtLm5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXRlbSA9PT0gdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgLy8gVGhpcyBjYW4gb25seSBoYXBwZW5lZCBpZiBzaXplID09PSAxIHdoaWNoIGlzIGhhbmRsZVxuICAgICAgICAgICAgLy8gYnkgdGhlIGNhc2UgYWJvdmUuXG4gICAgICAgICAgICBpZiAoIWl0ZW0ucHJldmlvdXMpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbGlzdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbS5wcmV2aW91cy5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gaXRlbS5uZXh0O1xuICAgICAgICAgICAgY29uc3QgcHJldmlvdXMgPSBpdGVtLnByZXZpb3VzO1xuICAgICAgICAgICAgaWYgKCFuZXh0IHx8ICFwcmV2aW91cykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXh0LnByZXZpb3VzID0gcHJldmlvdXM7XG4gICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gbmV4dDtcbiAgICAgICAgfVxuICAgICAgICBpdGVtLm5leHQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGl0ZW0ucHJldmlvdXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX3N0YXRlKys7XG4gICAgfVxuICAgIHRvdWNoKGl0ZW0sIHRvdWNoKSB7XG4gICAgICAgIGlmICghdGhpcy5faGVhZCB8fCAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxpc3QnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHRvdWNoICE9PSBUb3VjaC5GaXJzdCAmJiB0b3VjaCAhPT0gVG91Y2guTGFzdCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG91Y2ggPT09IFRvdWNoLkZpcnN0KSB7XG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBpdGVtLm5leHQ7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgICAgICAvLyBVbmxpbmsgdGhlIGl0ZW1cbiAgICAgICAgICAgIGlmIChpdGVtID09PSB0aGlzLl90YWlsKSB7XG4gICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgbXVzdCBiZSBkZWZpbmVkIHNpbmNlIGl0ZW0gd2FzIG5vdCBoZWFkIGJ1dCBpcyB0YWlsXG4gICAgICAgICAgICAgICAgLy8gU28gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbiBpdGVtIGluIHRoZSBtYXBcbiAgICAgICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuX3RhaWwgPSBwcmV2aW91cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEJvdGggbmV4dCBhbmQgcHJldmlvdXMgYXJlIG5vdCB1bmRlZmluZWQgc2luY2UgaXRlbSB3YXMgbmVpdGhlciBoZWFkIG5vciB0YWlsLlxuICAgICAgICAgICAgICAgIG5leHQucHJldmlvdXMgPSBwcmV2aW91cztcbiAgICAgICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEluc2VydCB0aGUgbm9kZSBhdCBoZWFkXG4gICAgICAgICAgICBpdGVtLnByZXZpb3VzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdGhpcy5faGVhZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQucHJldmlvdXMgPSBpdGVtO1xuICAgICAgICAgICAgdGhpcy5faGVhZCA9IGl0ZW07XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRvdWNoID09PSBUb3VjaC5MYXN0KSB7XG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBpdGVtLm5leHQ7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgICAgICAvLyBVbmxpbmsgdGhlIGl0ZW0uXG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCkge1xuICAgICAgICAgICAgICAgIC8vIG5leHQgbXVzdCBiZSBkZWZpbmVkIHNpbmNlIGl0ZW0gd2FzIG5vdCB0YWlsIGJ1dCBpcyBoZWFkXG4gICAgICAgICAgICAgICAgLy8gU28gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbiBpdGVtIGluIHRoZSBtYXBcbiAgICAgICAgICAgICAgICBuZXh0LnByZXZpb3VzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuX2hlYWQgPSBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQm90aCBuZXh0IGFuZCBwcmV2aW91cyBhcmUgbm90IHVuZGVmaW5lZCBzaW5jZSBpdGVtIHdhcyBuZWl0aGVyIGhlYWQgbm9yIHRhaWwuXG4gICAgICAgICAgICAgICAgbmV4dC5wcmV2aW91cyA9IHByZXZpb3VzO1xuICAgICAgICAgICAgICAgIHByZXZpb3VzLm5leHQgPSBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaXRlbS5wcmV2aW91cyA9IHRoaXMuX3RhaWw7XG4gICAgICAgICAgICB0aGlzLl90YWlsLm5leHQgPSBpdGVtO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW07XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IFtdO1xuICAgICAgICB0aGlzLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGRhdGEucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGZyb21KU09OKGRhdGEpIHtcbiAgICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBkYXRhKSB7XG4gICAgICAgICAgICB0aGlzLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuTGlua2VkTWFwID0gTGlua2VkTWFwO1xuY2xhc3MgTFJVQ2FjaGUgZXh0ZW5kcyBMaW5rZWRNYXAge1xuICAgIGNvbnN0cnVjdG9yKGxpbWl0LCByYXRpbyA9IDEpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fbGltaXQgPSBsaW1pdDtcbiAgICAgICAgdGhpcy5fcmF0aW8gPSBNYXRoLm1pbihNYXRoLm1heCgwLCByYXRpbyksIDEpO1xuICAgIH1cbiAgICBnZXQgbGltaXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9saW1pdDtcbiAgICB9XG4gICAgc2V0IGxpbWl0KGxpbWl0KSB7XG4gICAgICAgIHRoaXMuX2xpbWl0ID0gbGltaXQ7XG4gICAgICAgIHRoaXMuY2hlY2tUcmltKCk7XG4gICAgfVxuICAgIGdldCByYXRpbygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JhdGlvO1xuICAgIH1cbiAgICBzZXQgcmF0aW8ocmF0aW8pIHtcbiAgICAgICAgdGhpcy5fcmF0aW8gPSBNYXRoLm1pbihNYXRoLm1heCgwLCByYXRpbyksIDEpO1xuICAgICAgICB0aGlzLmNoZWNrVHJpbSgpO1xuICAgIH1cbiAgICBnZXQoa2V5LCB0b3VjaCA9IFRvdWNoLkFzTmV3KSB7XG4gICAgICAgIHJldHVybiBzdXBlci5nZXQoa2V5LCB0b3VjaCk7XG4gICAgfVxuICAgIHBlZWsoa2V5KSB7XG4gICAgICAgIHJldHVybiBzdXBlci5nZXQoa2V5LCBUb3VjaC5Ob25lKTtcbiAgICB9XG4gICAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgc3VwZXIuc2V0KGtleSwgdmFsdWUsIFRvdWNoLkxhc3QpO1xuICAgICAgICB0aGlzLmNoZWNrVHJpbSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgY2hlY2tUcmltKCkge1xuICAgICAgICBpZiAodGhpcy5zaXplID4gdGhpcy5fbGltaXQpIHtcbiAgICAgICAgICAgIHRoaXMudHJpbU9sZChNYXRoLnJvdW5kKHRoaXMuX2xpbWl0ICogdGhpcy5fcmF0aW8pKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuTFJVQ2FjaGUgPSBMUlVDYWNoZTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5EaXNwb3NhYmxlID0gdm9pZCAwO1xudmFyIERpc3Bvc2FibGU7XG4oZnVuY3Rpb24gKERpc3Bvc2FibGUpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUoZnVuYykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGlzcG9zZTogZnVuY1xuICAgICAgICB9O1xuICAgIH1cbiAgICBEaXNwb3NhYmxlLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKERpc3Bvc2FibGUgfHwgKGV4cG9ydHMuRGlzcG9zYWJsZSA9IERpc3Bvc2FibGUgPSB7fSkpO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xubGV0IF9yYWw7XG5mdW5jdGlvbiBSQUwoKSB7XG4gICAgaWYgKF9yYWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHJ1bnRpbWUgYWJzdHJhY3Rpb24gbGF5ZXIgaW5zdGFsbGVkYCk7XG4gICAgfVxuICAgIHJldHVybiBfcmFsO1xufVxuKGZ1bmN0aW9uIChSQUwpIHtcbiAgICBmdW5jdGlvbiBpbnN0YWxsKHJhbCkge1xuICAgICAgICBpZiAocmFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gcnVudGltZSBhYnN0cmFjdGlvbiBsYXllciBwcm92aWRlZGApO1xuICAgICAgICB9XG4gICAgICAgIF9yYWwgPSByYWw7XG4gICAgfVxuICAgIFJBTC5pbnN0YWxsID0gaW5zdGFsbDtcbn0pKFJBTCB8fCAoUkFMID0ge30pKTtcbmV4cG9ydHMuZGVmYXVsdCA9IFJBTDtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuRW1pdHRlciA9IGV4cG9ydHMuRXZlbnQgPSB2b2lkIDA7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbnZhciBFdmVudDtcbihmdW5jdGlvbiAoRXZlbnQpIHtcbiAgICBjb25zdCBfZGlzcG9zYWJsZSA9IHsgZGlzcG9zZSgpIHsgfSB9O1xuICAgIEV2ZW50Lk5vbmUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBfZGlzcG9zYWJsZTsgfTtcbn0pKEV2ZW50IHx8IChleHBvcnRzLkV2ZW50ID0gRXZlbnQgPSB7fSkpO1xuY2xhc3MgQ2FsbGJhY2tMaXN0IHtcbiAgICBhZGQoY2FsbGJhY2ssIGNvbnRleHQgPSBudWxsLCBidWNrZXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fY29udGV4dHMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgICAgIHRoaXMuX2NvbnRleHRzLnB1c2goY29udGV4dCk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGJ1Y2tldCkpIHtcbiAgICAgICAgICAgIGJ1Y2tldC5wdXNoKHsgZGlzcG9zZTogKCkgPT4gdGhpcy5yZW1vdmUoY2FsbGJhY2ssIGNvbnRleHQpIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlbW92ZShjYWxsYmFjaywgY29udGV4dCA9IG51bGwpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZm91bmRDYWxsYmFja1dpdGhEaWZmZXJlbnRDb250ZXh0ID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLl9jYWxsYmFja3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jYWxsYmFja3NbaV0gPT09IGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NvbnRleHRzW2ldID09PSBjb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrICYgY29udGV4dCBtYXRjaCA9PiByZW1vdmUgaXRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29udGV4dHMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZENhbGxiYWNrV2l0aERpZmZlcmVudENvbnRleHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZm91bmRDYWxsYmFja1dpdGhEaWZmZXJlbnRDb250ZXh0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1doZW4gYWRkaW5nIGEgbGlzdGVuZXIgd2l0aCBhIGNvbnRleHQsIHlvdSBzaG91bGQgcmVtb3ZlIGl0IHdpdGggdGhlIHNhbWUgY29udGV4dCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGludm9rZSguLi5hcmdzKSB7XG4gICAgICAgIGlmICghdGhpcy5fY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmV0ID0gW10sIGNhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcy5zbGljZSgwKSwgY29udGV4dHMgPSB0aGlzLl9jb250ZXh0cy5zbGljZSgwKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXQucHVzaChjYWxsYmFja3NbaV0uYXBwbHkoY29udGV4dHNbaV0sIGFyZ3MpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS5jb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICAgIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5fY2FsbGJhY2tzIHx8IHRoaXMuX2NhbGxiYWNrcy5sZW5ndGggPT09IDA7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fY29udGV4dHMgPSB1bmRlZmluZWQ7XG4gICAgfVxufVxuY2xhc3MgRW1pdHRlciB7XG4gICAgY29uc3RydWN0b3IoX29wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IF9vcHRpb25zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGb3IgdGhlIHB1YmxpYyB0byBhbGxvdyB0byBzdWJzY3JpYmVcbiAgICAgKiB0byBldmVudHMgZnJvbSB0aGlzIEVtaXR0ZXJcbiAgICAgKi9cbiAgICBnZXQgZXZlbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fZXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50ID0gKGxpc3RlbmVyLCB0aGlzQXJncywgZGlzcG9zYWJsZXMpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2NhbGxiYWNrcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWxsYmFja3MgPSBuZXcgQ2FsbGJhY2tMaXN0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMub25GaXJzdExpc3RlbmVyQWRkICYmIHRoaXMuX2NhbGxiYWNrcy5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy5vbkZpcnN0TGlzdGVuZXJBZGQodGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5hZGQobGlzdGVuZXIsIHRoaXNBcmdzKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlzcG9zYWJsZSBpcyBkaXNwb3NlZCBhZnRlciBlbWl0dGVyIGlzIGRpc3Bvc2VkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5yZW1vdmUobGlzdGVuZXIsIHRoaXNBcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5kaXNwb3NlID0gRW1pdHRlci5fbm9vcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMub25MYXN0TGlzdGVuZXJSZW1vdmUgJiYgdGhpcy5fY2FsbGJhY2tzLmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29wdGlvbnMub25MYXN0TGlzdGVuZXJSZW1vdmUodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRpc3Bvc2FibGVzKSkge1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlcy5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9ldmVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVG8gYmUga2VwdCBwcml2YXRlIHRvIGZpcmUgYW4gZXZlbnQgdG9cbiAgICAgKiBzdWJzY3JpYmVyc1xuICAgICAqL1xuICAgIGZpcmUoZXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NhbGxiYWNrcykge1xuICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzLmludm9rZS5jYWxsKHRoaXMuX2NhbGxiYWNrcywgZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5kaXNwb3NlKCk7XG4gICAgICAgICAgICB0aGlzLl9jYWxsYmFja3MgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLkVtaXR0ZXIgPSBFbWl0dGVyO1xuRW1pdHRlci5fbm9vcCA9IGZ1bmN0aW9uICgpIHsgfTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uVG9rZW4gPSB2b2lkIDA7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbmNvbnN0IElzID0gcmVxdWlyZShcIi4vaXNcIik7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCIuL2V2ZW50c1wiKTtcbnZhciBDYW5jZWxsYXRpb25Ub2tlbjtcbihmdW5jdGlvbiAoQ2FuY2VsbGF0aW9uVG9rZW4pIHtcbiAgICBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGlzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkOiBmYWxzZSxcbiAgICAgICAgb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6IGV2ZW50c18xLkV2ZW50Lk5vbmVcbiAgICB9KTtcbiAgICBDYW5jZWxsYXRpb25Ub2tlbi5DYW5jZWxsZWQgPSBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6IHRydWUsXG4gICAgICAgIG9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkOiBldmVudHNfMS5FdmVudC5Ob25lXG4gICAgfSk7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgKGNhbmRpZGF0ZSA9PT0gQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZVxuICAgICAgICAgICAgfHwgY2FuZGlkYXRlID09PSBDYW5jZWxsYXRpb25Ub2tlbi5DYW5jZWxsZWRcbiAgICAgICAgICAgIHx8IChJcy5ib29sZWFuKGNhbmRpZGF0ZS5pc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkgJiYgISFjYW5kaWRhdGUub25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQpKTtcbiAgICB9XG4gICAgQ2FuY2VsbGF0aW9uVG9rZW4uaXMgPSBpcztcbn0pKENhbmNlbGxhdGlvblRva2VuIHx8IChleHBvcnRzLkNhbmNlbGxhdGlvblRva2VuID0gQ2FuY2VsbGF0aW9uVG9rZW4gPSB7fSkpO1xuY29uc3Qgc2hvcnRjdXRFdmVudCA9IE9iamVjdC5mcmVlemUoZnVuY3Rpb24gKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgY29uc3QgaGFuZGxlID0gKDAsIHJhbF8xLmRlZmF1bHQpKCkudGltZXIuc2V0VGltZW91dChjYWxsYmFjay5iaW5kKGNvbnRleHQpLCAwKTtcbiAgICByZXR1cm4geyBkaXNwb3NlKCkgeyBoYW5kbGUuZGlzcG9zZSgpOyB9IH07XG59KTtcbmNsYXNzIE11dGFibGVUb2tlbiB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX2lzQ2FuY2VsbGVkID0gZmFsc2U7XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9pc0NhbmNlbGxlZCkge1xuICAgICAgICAgICAgdGhpcy5faXNDYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2VtaXR0ZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmZpcmUodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0NhbmNlbGxlZDtcbiAgICB9XG4gICAgZ2V0IG9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKCkge1xuICAgICAgICBpZiAodGhpcy5faXNDYW5jZWxsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBzaG9ydGN1dEV2ZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5fZW1pdHRlcikge1xuICAgICAgICAgICAgdGhpcy5fZW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2VtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLl9lbWl0dGVyKSB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5jbGFzcyBDYW5jZWxsYXRpb25Ub2tlblNvdXJjZSB7XG4gICAgZ2V0IHRva2VuKCkge1xuICAgICAgICBpZiAoIXRoaXMuX3Rva2VuKSB7XG4gICAgICAgICAgICAvLyBiZSBsYXp5IGFuZCBjcmVhdGUgdGhlIHRva2VuIG9ubHkgd2hlblxuICAgICAgICAgICAgLy8gYWN0dWFsbHkgbmVlZGVkXG4gICAgICAgICAgICB0aGlzLl90b2tlbiA9IG5ldyBNdXRhYmxlVG9rZW4oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fdG9rZW47XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl90b2tlbikge1xuICAgICAgICAgICAgLy8gc2F2ZSBhbiBvYmplY3QgYnkgcmV0dXJuaW5nIHRoZSBkZWZhdWx0XG4gICAgICAgICAgICAvLyBjYW5jZWxsZWQgdG9rZW4gd2hlbiBjYW5jZWxsYXRpb24gaGFwcGVuc1xuICAgICAgICAgICAgLy8gYmVmb3JlIHNvbWVvbmUgYXNrcyBmb3IgdGhlIHRva2VuXG4gICAgICAgICAgICB0aGlzLl90b2tlbiA9IENhbmNlbGxhdGlvblRva2VuLkNhbmNlbGxlZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3Rva2VuLmNhbmNlbCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICghdGhpcy5fdG9rZW4pIHtcbiAgICAgICAgICAgIC8vIGVuc3VyZSB0byBpbml0aWFsaXplIHdpdGggYW4gZW1wdHkgdG9rZW4gaWYgd2UgaGFkIG5vbmVcbiAgICAgICAgICAgIHRoaXMuX3Rva2VuID0gQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLl90b2tlbiBpbnN0YW5jZW9mIE11dGFibGVUb2tlbikge1xuICAgICAgICAgICAgLy8gYWN0dWFsbHkgZGlzcG9zZVxuICAgICAgICAgICAgdGhpcy5fdG9rZW4uZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IENhbmNlbGxhdGlvblRva2VuU291cmNlO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3kgPSB2b2lkIDA7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbnZhciBDYW5jZWxsYXRpb25TdGF0ZTtcbihmdW5jdGlvbiAoQ2FuY2VsbGF0aW9uU3RhdGUpIHtcbiAgICBDYW5jZWxsYXRpb25TdGF0ZS5Db250aW51ZSA9IDA7XG4gICAgQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkID0gMTtcbn0pKENhbmNlbGxhdGlvblN0YXRlIHx8IChDYW5jZWxsYXRpb25TdGF0ZSA9IHt9KSk7XG5jbGFzcyBTaGFyZWRBcnJheVNlbmRlclN0cmF0ZWd5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5idWZmZXJzID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICBlbmFibGVDYW5jZWxsYXRpb24ocmVxdWVzdCkge1xuICAgICAgICBpZiAocmVxdWVzdC5pZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBTaGFyZWRBcnJheUJ1ZmZlcig0KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBJbnQzMkFycmF5KGJ1ZmZlciwgMCwgMSk7XG4gICAgICAgIGRhdGFbMF0gPSBDYW5jZWxsYXRpb25TdGF0ZS5Db250aW51ZTtcbiAgICAgICAgdGhpcy5idWZmZXJzLnNldChyZXF1ZXN0LmlkLCBidWZmZXIpO1xuICAgICAgICByZXF1ZXN0LiRjYW5jZWxsYXRpb25EYXRhID0gYnVmZmVyO1xuICAgIH1cbiAgICBhc3luYyBzZW5kQ2FuY2VsbGF0aW9uKF9jb25uLCBpZCkge1xuICAgICAgICBjb25zdCBidWZmZXIgPSB0aGlzLmJ1ZmZlcnMuZ2V0KGlkKTtcbiAgICAgICAgaWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBJbnQzMkFycmF5KGJ1ZmZlciwgMCwgMSk7XG4gICAgICAgIEF0b21pY3Muc3RvcmUoZGF0YSwgMCwgQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkKTtcbiAgICB9XG4gICAgY2xlYW51cChpZCkge1xuICAgICAgICB0aGlzLmJ1ZmZlcnMuZGVsZXRlKGlkKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy5idWZmZXJzLmNsZWFyKCk7XG4gICAgfVxufVxuZXhwb3J0cy5TaGFyZWRBcnJheVNlbmRlclN0cmF0ZWd5ID0gU2hhcmVkQXJyYXlTZW5kZXJTdHJhdGVneTtcbmNsYXNzIFNoYXJlZEFycmF5QnVmZmVyQ2FuY2VsbGF0aW9uVG9rZW4ge1xuICAgIGNvbnN0cnVjdG9yKGJ1ZmZlcikge1xuICAgICAgICB0aGlzLmRhdGEgPSBuZXcgSW50MzJBcnJheShidWZmZXIsIDAsIDEpO1xuICAgIH1cbiAgICBnZXQgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHJldHVybiBBdG9taWNzLmxvYWQodGhpcy5kYXRhLCAwKSA9PT0gQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkO1xuICAgIH1cbiAgICBnZXQgb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuY2VsbGF0aW9uIG92ZXIgU2hhcmVkQXJyYXlCdWZmZXIgZG9lc24ndCBzdXBwb3J0IGNhbmNlbGxhdGlvbiBldmVudHNgKTtcbiAgICB9XG59XG5jbGFzcyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuU291cmNlIHtcbiAgICBjb25zdHJ1Y3RvcihidWZmZXIpIHtcbiAgICAgICAgdGhpcy50b2tlbiA9IG5ldyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuKGJ1ZmZlcik7XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICB9XG59XG5jbGFzcyBTaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmtpbmQgPSAncmVxdWVzdCc7XG4gICAgfVxuICAgIGNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKHJlcXVlc3QpIHtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gcmVxdWVzdC4kY2FuY2VsbGF0aW9uRGF0YTtcbiAgICAgICAgaWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuU291cmNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuU291cmNlKGJ1ZmZlcik7XG4gICAgfVxufVxuZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBTaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3k7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNlbWFwaG9yZSA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY2xhc3MgU2VtYXBob3JlIHtcbiAgICBjb25zdHJ1Y3RvcihjYXBhY2l0eSA9IDEpIHtcbiAgICAgICAgaWYgKGNhcGFjaXR5IDw9IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FwYWNpdHkgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NhcGFjaXR5ID0gY2FwYWNpdHk7XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IDA7XG4gICAgICAgIHRoaXMuX3dhaXRpbmcgPSBbXTtcbiAgICB9XG4gICAgbG9jayh0aHVuaykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fd2FpdGluZy5wdXNoKHsgdGh1bmssIHJlc29sdmUsIHJlamVjdCB9KTtcbiAgICAgICAgICAgIHRoaXMucnVuTmV4dCgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0IGFjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTtcbiAgICB9XG4gICAgcnVuTmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dhaXRpbmcubGVuZ3RoID09PSAwIHx8IHRoaXMuX2FjdGl2ZSA9PT0gdGhpcy5fY2FwYWNpdHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS50aW1lci5zZXRJbW1lZGlhdGUoKCkgPT4gdGhpcy5kb1J1bk5leHQoKSk7XG4gICAgfVxuICAgIGRvUnVuTmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dhaXRpbmcubGVuZ3RoID09PSAwIHx8IHRoaXMuX2FjdGl2ZSA9PT0gdGhpcy5fY2FwYWNpdHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5fd2FpdGluZy5zaGlmdCgpO1xuICAgICAgICB0aGlzLl9hY3RpdmUrKztcbiAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZSA+IHRoaXMuX2NhcGFjaXR5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRvIG1hbnkgdGh1bmtzIGFjdGl2ZWApO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXh0LnRodW5rKCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC50aGVuKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5yZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5OZXh0KCk7XG4gICAgICAgICAgICAgICAgfSwgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5yZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5OZXh0KCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICBuZXh0LnJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1bk5leHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgIG5leHQucmVqZWN0KGVycik7XG4gICAgICAgICAgICB0aGlzLnJ1bk5leHQoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuU2VtYXBob3JlID0gU2VtYXBob3JlO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXIgPSBleHBvcnRzLkFic3RyYWN0TWVzc2FnZVJlYWRlciA9IGV4cG9ydHMuTWVzc2FnZVJlYWRlciA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IGV2ZW50c18xID0gcmVxdWlyZShcIi4vZXZlbnRzXCIpO1xuY29uc3Qgc2VtYXBob3JlXzEgPSByZXF1aXJlKFwiLi9zZW1hcGhvcmVcIik7XG52YXIgTWVzc2FnZVJlYWRlcjtcbihmdW5jdGlvbiAoTWVzc2FnZVJlYWRlcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5saXN0ZW4pICYmIElzLmZ1bmMoY2FuZGlkYXRlLmRpc3Bvc2UpICYmXG4gICAgICAgICAgICBJcy5mdW5jKGNhbmRpZGF0ZS5vbkVycm9yKSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5vbkNsb3NlKSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5vblBhcnRpYWxNZXNzYWdlKTtcbiAgICB9XG4gICAgTWVzc2FnZVJlYWRlci5pcyA9IGlzO1xufSkoTWVzc2FnZVJlYWRlciB8fCAoZXhwb3J0cy5NZXNzYWdlUmVhZGVyID0gTWVzc2FnZVJlYWRlciA9IHt9KSk7XG5jbGFzcyBBYnN0cmFjdE1lc3NhZ2VSZWFkZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZUVtaXR0ZXIgPSBuZXcgZXZlbnRzXzEuRW1pdHRlcigpO1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlci5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgZ2V0IG9uRXJyb3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVycm9yRW1pdHRlci5ldmVudDtcbiAgICB9XG4gICAgZmlyZUVycm9yKGVycm9yKSB7XG4gICAgICAgIHRoaXMuZXJyb3JFbWl0dGVyLmZpcmUodGhpcy5hc0Vycm9yKGVycm9yKSk7XG4gICAgfVxuICAgIGdldCBvbkNsb3NlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9zZUVtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGZpcmVDbG9zZSgpIHtcbiAgICAgICAgdGhpcy5jbG9zZUVtaXR0ZXIuZmlyZSh1bmRlZmluZWQpO1xuICAgIH1cbiAgICBnZXQgb25QYXJ0aWFsTWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFydGlhbE1lc3NhZ2VFbWl0dGVyLmV2ZW50O1xuICAgIH1cbiAgICBmaXJlUGFydGlhbE1lc3NhZ2UoaW5mbykge1xuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlRW1pdHRlci5maXJlKGluZm8pO1xuICAgIH1cbiAgICBhc0Vycm9yKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKGBSZWFkZXIgcmVjZWl2ZWQgZXJyb3IuIFJlYXNvbjogJHtJcy5zdHJpbmcoZXJyb3IubWVzc2FnZSkgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24nfWApO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VSZWFkZXIgPSBBYnN0cmFjdE1lc3NhZ2VSZWFkZXI7XG52YXIgUmVzb2x2ZWRNZXNzYWdlUmVhZGVyT3B0aW9ucztcbihmdW5jdGlvbiAoUmVzb2x2ZWRNZXNzYWdlUmVhZGVyT3B0aW9ucykge1xuICAgIGZ1bmN0aW9uIGZyb21PcHRpb25zKG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IGNoYXJzZXQ7XG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIGxldCBjb250ZW50RGVjb2RlcjtcbiAgICAgICAgY29uc3QgY29udGVudERlY29kZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICBsZXQgY29udGVudFR5cGVEZWNvZGVyO1xuICAgICAgICBjb25zdCBjb250ZW50VHlwZURlY29kZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY2hhcnNldCA9IG9wdGlvbnMgPz8gJ3V0Zi04JztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNoYXJzZXQgPSBvcHRpb25zLmNoYXJzZXQgPz8gJ3V0Zi04JztcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnREZWNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50RGVjb2RlciA9IG9wdGlvbnMuY29udGVudERlY29kZXI7XG4gICAgICAgICAgICAgICAgY29udGVudERlY29kZXJzLnNldChjb250ZW50RGVjb2Rlci5uYW1lLCBjb250ZW50RGVjb2Rlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5jb250ZW50RGVjb2RlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGVjb2RlciBvZiBvcHRpb25zLmNvbnRlbnREZWNvZGVycykge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50RGVjb2RlcnMuc2V0KGRlY29kZXIubmFtZSwgZGVjb2Rlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuY29udGVudFR5cGVEZWNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXIgPSBvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcjtcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXJzLnNldChjb250ZW50VHlwZURlY29kZXIubmFtZSwgY29udGVudFR5cGVEZWNvZGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGVjb2RlciBvZiBvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGVEZWNvZGVycy5zZXQoZGVjb2Rlci5uYW1lLCBkZWNvZGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnRlbnRUeXBlRGVjb2RlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXIgPSAoMCwgcmFsXzEuZGVmYXVsdCkoKS5hcHBsaWNhdGlvbkpzb24uZGVjb2RlcjtcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlRGVjb2RlcnMuc2V0KGNvbnRlbnRUeXBlRGVjb2Rlci5uYW1lLCBjb250ZW50VHlwZURlY29kZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGNoYXJzZXQsIGNvbnRlbnREZWNvZGVyLCBjb250ZW50RGVjb2RlcnMsIGNvbnRlbnRUeXBlRGVjb2RlciwgY29udGVudFR5cGVEZWNvZGVycyB9O1xuICAgIH1cbiAgICBSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zLmZyb21PcHRpb25zID0gZnJvbU9wdGlvbnM7XG59KShSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zIHx8IChSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zID0ge30pKTtcbmNsYXNzIFJlYWRhYmxlU3RyZWFtTWVzc2FnZVJlYWRlciBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVJlYWRlciB7XG4gICAgY29uc3RydWN0b3IocmVhZGFibGUsIG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZSA9IHJlYWRhYmxlO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zLmZyb21PcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmJ1ZmZlciA9ICgwLCByYWxfMS5kZWZhdWx0KSgpLm1lc3NhZ2VCdWZmZXIuY3JlYXRlKHRoaXMub3B0aW9ucy5jaGFyc2V0KTtcbiAgICAgICAgdGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0ID0gMTAwMDA7XG4gICAgICAgIHRoaXMubmV4dE1lc3NhZ2VMZW5ndGggPSAtMTtcbiAgICAgICAgdGhpcy5tZXNzYWdlVG9rZW4gPSAwO1xuICAgICAgICB0aGlzLnJlYWRTZW1hcGhvcmUgPSBuZXcgc2VtYXBob3JlXzEuU2VtYXBob3JlKDEpO1xuICAgIH1cbiAgICBzZXQgcGFydGlhbE1lc3NhZ2VUaW1lb3V0KHRpbWVvdXQpIHtcbiAgICAgICAgdGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0ID0gdGltZW91dDtcbiAgICB9XG4gICAgZ2V0IHBhcnRpYWxNZXNzYWdlVGltZW91dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dDtcbiAgICB9XG4gICAgbGlzdGVuKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMubmV4dE1lc3NhZ2VMZW5ndGggPSAtMTtcbiAgICAgICAgdGhpcy5tZXNzYWdlVG9rZW4gPSAwO1xuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlVGltZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5yZWFkYWJsZS5vbkRhdGEoKGRhdGEpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25EYXRhKGRhdGEpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZS5vbkVycm9yKChlcnJvcikgPT4gdGhpcy5maXJlRXJyb3IoZXJyb3IpKTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZS5vbkNsb3NlKCgpID0+IHRoaXMuZmlyZUNsb3NlKCkpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBvbkRhdGEoZGF0YSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5idWZmZXIuYXBwZW5kKGRhdGEpO1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IHRoaXMuYnVmZmVyLnRyeVJlYWRIZWFkZXJzKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50TGVuZ3RoID0gaGVhZGVycy5nZXQoJ2NvbnRlbnQtbGVuZ3RoJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY29udGVudExlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IobmV3IEVycm9yKGBIZWFkZXIgbXVzdCBwcm92aWRlIGEgQ29udGVudC1MZW5ndGggcHJvcGVydHkuXFxuJHtKU09OLnN0cmluZ2lmeShPYmplY3QuZnJvbUVudHJpZXMoaGVhZGVycykpfWApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsZW5ndGggPSBwYXJzZUludChjb250ZW50TGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKGxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKG5ldyBFcnJvcihgQ29udGVudC1MZW5ndGggdmFsdWUgbXVzdCBiZSBhIG51bWJlci4gR290ICR7Y29udGVudExlbmd0aH1gKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IHRoaXMuYnVmZmVyLnRyeVJlYWRCb2R5KHRoaXMubmV4dE1lc3NhZ2VMZW5ndGgpO1xuICAgICAgICAgICAgICAgIGlmIChib2R5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLyoqIFdlIGhhdmVuJ3QgcmVjZWl2ZWQgdGhlIGZ1bGwgbWVzc2FnZSB5ZXQuICovXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0UGFydGlhbE1lc3NhZ2VUaW1lcigpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJQYXJ0aWFsTWVzc2FnZVRpbWVyKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9IC0xO1xuICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHdlIGNvbnZlcnQgb25lIHJlY2VpdmVkIG1lc3NhZ2UgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAgICAgLy8gb3RoZXIuIE90aGVyd2lzZSBpdCBjb3VsZCBoYXBwZW4gdGhhdCBhIGRlY29kaW5nIG9mIGEgc2Vjb25kXG4gICAgICAgICAgICAgICAgLy8gc21hbGxlciBtZXNzYWdlIGZpbmlzaGVkIGJlZm9yZSB0aGUgZGVjb2Rpbmcgb2YgYSBmaXJzdCBsYXJnZXJcbiAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIGFuZCB0aGVuIHdlIHdvdWxkIGRlbGl2ZXIgdGhlIHNlY29uZCBtZXNzYWdlIGZpcnN0LlxuICAgICAgICAgICAgICAgIHRoaXMucmVhZFNlbWFwaG9yZS5sb2NrKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnl0ZXMgPSB0aGlzLm9wdGlvbnMuY29udGVudERlY29kZXIgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBhd2FpdCB0aGlzLm9wdGlvbnMuY29udGVudERlY29kZXIuZGVjb2RlKGJvZHkpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGJvZHk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBhd2FpdCB0aGlzLm9wdGlvbnMuY29udGVudFR5cGVEZWNvZGVyLmRlY29kZShieXRlcywgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjayhtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNsZWFyUGFydGlhbE1lc3NhZ2VUaW1lcigpIHtcbiAgICAgICAgaWYgKHRoaXMucGFydGlhbE1lc3NhZ2VUaW1lcikge1xuICAgICAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZVRpbWVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRoaXMucGFydGlhbE1lc3NhZ2VUaW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRQYXJ0aWFsTWVzc2FnZVRpbWVyKCkge1xuICAgICAgICB0aGlzLmNsZWFyUGFydGlhbE1lc3NhZ2VUaW1lcigpO1xuICAgICAgICBpZiAodGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0IDw9IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlVGltZXIgPSAoMCwgcmFsXzEuZGVmYXVsdCkoKS50aW1lci5zZXRUaW1lb3V0KCh0b2tlbiwgdGltZW91dCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZVRpbWVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRva2VuID09PSB0aGlzLm1lc3NhZ2VUb2tlbikge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZVBhcnRpYWxNZXNzYWdlKHsgbWVzc2FnZVRva2VuOiB0b2tlbiwgd2FpdGluZ1RpbWU6IHRpbWVvdXQgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRQYXJ0aWFsTWVzc2FnZVRpbWVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dCwgdGhpcy5tZXNzYWdlVG9rZW4sIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dCk7XG4gICAgfVxufVxuZXhwb3J0cy5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXIgPSBSZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLldyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLkFic3RyYWN0TWVzc2FnZVdyaXRlciA9IGV4cG9ydHMuTWVzc2FnZVdyaXRlciA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IHNlbWFwaG9yZV8xID0gcmVxdWlyZShcIi4vc2VtYXBob3JlXCIpO1xuY29uc3QgZXZlbnRzXzEgPSByZXF1aXJlKFwiLi9ldmVudHNcIik7XG5jb25zdCBDb250ZW50TGVuZ3RoID0gJ0NvbnRlbnQtTGVuZ3RoOiAnO1xuY29uc3QgQ1JMRiA9ICdcXHJcXG4nO1xudmFyIE1lc3NhZ2VXcml0ZXI7XG4oZnVuY3Rpb24gKE1lc3NhZ2VXcml0ZXIpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgSXMuZnVuYyhjYW5kaWRhdGUuZGlzcG9zZSkgJiYgSXMuZnVuYyhjYW5kaWRhdGUub25DbG9zZSkgJiZcbiAgICAgICAgICAgIElzLmZ1bmMoY2FuZGlkYXRlLm9uRXJyb3IpICYmIElzLmZ1bmMoY2FuZGlkYXRlLndyaXRlKTtcbiAgICB9XG4gICAgTWVzc2FnZVdyaXRlci5pcyA9IGlzO1xufSkoTWVzc2FnZVdyaXRlciB8fCAoZXhwb3J0cy5NZXNzYWdlV3JpdGVyID0gTWVzc2FnZVdyaXRlciA9IHt9KSk7XG5jbGFzcyBBYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy5lcnJvckVtaXR0ZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLmNsb3NlRW1pdHRlci5kaXNwb3NlKCk7XG4gICAgfVxuICAgIGdldCBvbkVycm9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lcnJvckVtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGZpcmVFcnJvcihlcnJvciwgbWVzc2FnZSwgY291bnQpIHtcbiAgICAgICAgdGhpcy5lcnJvckVtaXR0ZXIuZmlyZShbdGhpcy5hc0Vycm9yKGVycm9yKSwgbWVzc2FnZSwgY291bnRdKTtcbiAgICB9XG4gICAgZ2V0IG9uQ2xvc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb3NlRW1pdHRlci5ldmVudDtcbiAgICB9XG4gICAgZmlyZUNsb3NlKCkge1xuICAgICAgICB0aGlzLmNsb3NlRW1pdHRlci5maXJlKHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIGFzRXJyb3IoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoYFdyaXRlciByZWNlaXZlZCBlcnJvci4gUmVhc29uOiAke0lzLnN0cmluZyhlcnJvci5tZXNzYWdlKSA/IGVycm9yLm1lc3NhZ2UgOiAndW5rbm93bid9YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLkFic3RyYWN0TWVzc2FnZVdyaXRlciA9IEFic3RyYWN0TWVzc2FnZVdyaXRlcjtcbnZhciBSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zO1xuKGZ1bmN0aW9uIChSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zKSB7XG4gICAgZnVuY3Rpb24gZnJvbU9wdGlvbnMob3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHsgY2hhcnNldDogb3B0aW9ucyA/PyAndXRmLTgnLCBjb250ZW50VHlwZUVuY29kZXI6ICgwLCByYWxfMS5kZWZhdWx0KSgpLmFwcGxpY2F0aW9uSnNvbi5lbmNvZGVyIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4geyBjaGFyc2V0OiBvcHRpb25zLmNoYXJzZXQgPz8gJ3V0Zi04JywgY29udGVudEVuY29kZXI6IG9wdGlvbnMuY29udGVudEVuY29kZXIsIGNvbnRlbnRUeXBlRW5jb2Rlcjogb3B0aW9ucy5jb250ZW50VHlwZUVuY29kZXIgPz8gKDAsIHJhbF8xLmRlZmF1bHQpKCkuYXBwbGljYXRpb25Kc29uLmVuY29kZXIgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zLmZyb21PcHRpb25zID0gZnJvbU9wdGlvbnM7XG59KShSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zIHx8IChSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zID0ge30pKTtcbmNsYXNzIFdyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKHdyaXRhYmxlLCBvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMud3JpdGFibGUgPSB3cml0YWJsZTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gUmVzb2x2ZWRNZXNzYWdlV3JpdGVyT3B0aW9ucy5mcm9tT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50ID0gMDtcbiAgICAgICAgdGhpcy53cml0ZVNlbWFwaG9yZSA9IG5ldyBzZW1hcGhvcmVfMS5TZW1hcGhvcmUoMSk7XG4gICAgICAgIHRoaXMud3JpdGFibGUub25FcnJvcigoZXJyb3IpID0+IHRoaXMuZmlyZUVycm9yKGVycm9yKSk7XG4gICAgICAgIHRoaXMud3JpdGFibGUub25DbG9zZSgoKSA9PiB0aGlzLmZpcmVDbG9zZSgpKTtcbiAgICB9XG4gICAgYXN5bmMgd3JpdGUobXNnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndyaXRlU2VtYXBob3JlLmxvY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHRoaXMub3B0aW9ucy5jb250ZW50VHlwZUVuY29kZXIuZW5jb2RlKG1zZywgdGhpcy5vcHRpb25zKS50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNvbnRlbnRFbmNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jb250ZW50RW5jb2Rlci5lbmNvZGUoYnVmZmVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZC50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJzID0gW107XG4gICAgICAgICAgICAgICAgaGVhZGVycy5wdXNoKENvbnRlbnRMZW5ndGgsIGJ1ZmZlci5ieXRlTGVuZ3RoLnRvU3RyaW5nKCksIENSTEYpO1xuICAgICAgICAgICAgICAgIGhlYWRlcnMucHVzaChDUkxGKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kb1dyaXRlKG1zZywgaGVhZGVycywgYnVmZmVyKTtcbiAgICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgZG9Xcml0ZShtc2csIGhlYWRlcnMsIGRhdGEpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMud3JpdGFibGUud3JpdGUoaGVhZGVycy5qb2luKCcnKSwgJ2FzY2lpJyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy53cml0YWJsZS53cml0ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IsIG1zZyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZUVycm9yKGVycm9yLCBtc2cpIHtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50Kys7XG4gICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yLCBtc2csIHRoaXMuZXJyb3JDb3VudCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICAgICAgdGhpcy53cml0YWJsZS5lbmQoKTtcbiAgICB9XG59XG5leHBvcnRzLldyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgPSBXcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkFic3RyYWN0TWVzc2FnZUJ1ZmZlciA9IHZvaWQgMDtcbmNvbnN0IENSID0gMTM7XG5jb25zdCBMRiA9IDEwO1xuY29uc3QgQ1JMRiA9ICdcXHJcXG4nO1xuY2xhc3MgQWJzdHJhY3RNZXNzYWdlQnVmZmVyIHtcbiAgICBjb25zdHJ1Y3RvcihlbmNvZGluZyA9ICd1dGYtOCcpIHtcbiAgICAgICAgdGhpcy5fZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgICAgICAgdGhpcy5fY2h1bmtzID0gW107XG4gICAgICAgIHRoaXMuX3RvdGFsTGVuZ3RoID0gMDtcbiAgICB9XG4gICAgZ2V0IGVuY29kaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW5jb2Rpbmc7XG4gICAgfVxuICAgIGFwcGVuZChjaHVuaykge1xuICAgICAgICBjb25zdCB0b0FwcGVuZCA9IHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZycgPyB0aGlzLmZyb21TdHJpbmcoY2h1bmssIHRoaXMuX2VuY29kaW5nKSA6IGNodW5rO1xuICAgICAgICB0aGlzLl9jaHVua3MucHVzaCh0b0FwcGVuZCk7XG4gICAgICAgIHRoaXMuX3RvdGFsTGVuZ3RoICs9IHRvQXBwZW5kLmJ5dGVMZW5ndGg7XG4gICAgfVxuICAgIHRyeVJlYWRIZWFkZXJzKGxvd2VyQ2FzZUtleXMgPSBmYWxzZSkge1xuICAgICAgICBpZiAodGhpcy5fY2h1bmtzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3RhdGUgPSAwO1xuICAgICAgICBsZXQgY2h1bmtJbmRleCA9IDA7XG4gICAgICAgIGxldCBvZmZzZXQgPSAwO1xuICAgICAgICBsZXQgY2h1bmtCeXRlc1JlYWQgPSAwO1xuICAgICAgICByb3c6IHdoaWxlIChjaHVua0luZGV4IDwgdGhpcy5fY2h1bmtzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgY2h1bmsgPSB0aGlzLl9jaHVua3NbY2h1bmtJbmRleF07XG4gICAgICAgICAgICBvZmZzZXQgPSAwO1xuICAgICAgICAgICAgY29sdW1uOiB3aGlsZSAob2Zmc2V0IDwgY2h1bmsubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjaHVua1tvZmZzZXRdO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDUjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIExGOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gNDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHJvdztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjaHVua0J5dGVzUmVhZCArPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgY2h1bmtJbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZSAhPT0gNCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgYnVmZmVyIGNvbnRhaW5zIHRoZSB0d28gQ1JMRiBhdCB0aGUgZW5kLiBTbyB3ZSB3aWxsXG4gICAgICAgIC8vIGhhdmUgdHdvIGVtcHR5IGxpbmVzIGFmdGVyIHRoZSBzcGxpdCBhdCB0aGUgZW5kIGFzIHdlbGwuXG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuX3JlYWQoY2h1bmtCeXRlc1JlYWQgKyBvZmZzZXQpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwKCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLnRvU3RyaW5nKGJ1ZmZlciwgJ2FzY2lpJykuc3BsaXQoQ1JMRik7XG4gICAgICAgIGlmIChoZWFkZXJzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXJzLmxlbmd0aCAtIDI7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaGVhZGVyID0gaGVhZGVyc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gaGVhZGVyLmluZGV4T2YoJzonKTtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1lc3NhZ2UgaGVhZGVyIG11c3Qgc2VwYXJhdGUga2V5IGFuZCB2YWx1ZSB1c2luZyAnOidcXG4ke2hlYWRlcn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGhlYWRlci5zdWJzdHIoMCwgaW5kZXgpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBoZWFkZXIuc3Vic3RyKGluZGV4ICsgMSkudHJpbSgpO1xuICAgICAgICAgICAgcmVzdWx0LnNldChsb3dlckNhc2VLZXlzID8ga2V5LnRvTG93ZXJDYXNlKCkgOiBrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICB0cnlSZWFkQm9keShsZW5ndGgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3RvdGFsTGVuZ3RoIDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkKGxlbmd0aCk7XG4gICAgfVxuICAgIGdldCBudW1iZXJPZkJ5dGVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdG90YWxMZW5ndGg7XG4gICAgfVxuICAgIF9yZWFkKGJ5dGVDb3VudCkge1xuICAgICAgICBpZiAoYnl0ZUNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbXB0eUJ1ZmZlcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChieXRlQ291bnQgPiB0aGlzLl90b3RhbExlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVhZCBzbyBtYW55IGJ5dGVzIWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jaHVua3NbMF0uYnl0ZUxlbmd0aCA9PT0gYnl0ZUNvdW50KSB7XG4gICAgICAgICAgICAvLyBzdXBlciBmYXN0IHBhdGgsIHByZWNpc2VseSBmaXJzdCBjaHVuayBtdXN0IGJlIHJldHVybmVkXG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1swXTtcbiAgICAgICAgICAgIHRoaXMuX2NodW5rcy5zaGlmdCgpO1xuICAgICAgICAgICAgdGhpcy5fdG90YWxMZW5ndGggLT0gYnl0ZUNvdW50O1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXNOYXRpdmUoY2h1bmspO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jaHVua3NbMF0uYnl0ZUxlbmd0aCA+IGJ5dGVDb3VudCkge1xuICAgICAgICAgICAgLy8gZmFzdCBwYXRoLCB0aGUgcmVhZGluZyBpcyBlbnRpcmVseSB3aXRoaW4gdGhlIGZpcnN0IGNodW5rXG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1swXTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuYXNOYXRpdmUoY2h1bmssIGJ5dGVDb3VudCk7XG4gICAgICAgICAgICB0aGlzLl9jaHVua3NbMF0gPSBjaHVuay5zbGljZShieXRlQ291bnQpO1xuICAgICAgICAgICAgdGhpcy5fdG90YWxMZW5ndGggLT0gYnl0ZUNvdW50O1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmFsbG9jTmF0aXZlKGJ5dGVDb3VudCk7XG4gICAgICAgIGxldCByZXN1bHRPZmZzZXQgPSAwO1xuICAgICAgICBsZXQgY2h1bmtJbmRleCA9IDA7XG4gICAgICAgIHdoaWxlIChieXRlQ291bnQgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1tjaHVua0luZGV4XTtcbiAgICAgICAgICAgIGlmIChjaHVuay5ieXRlTGVuZ3RoID4gYnl0ZUNvdW50KSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBjaHVuayB3aWxsIHN1cnZpdmVcbiAgICAgICAgICAgICAgICBjb25zdCBjaHVua1BhcnQgPSBjaHVuay5zbGljZSgwLCBieXRlQ291bnQpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5zZXQoY2h1bmtQYXJ0LCByZXN1bHRPZmZzZXQpO1xuICAgICAgICAgICAgICAgIHJlc3VsdE9mZnNldCArPSBieXRlQ291bnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2h1bmtzW2NodW5rSW5kZXhdID0gY2h1bmsuc2xpY2UoYnl0ZUNvdW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLl90b3RhbExlbmd0aCAtPSBieXRlQ291bnQ7XG4gICAgICAgICAgICAgICAgYnl0ZUNvdW50IC09IGJ5dGVDb3VudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHRoaXMgY2h1bmsgd2lsbCBiZSBlbnRpcmVseSByZWFkXG4gICAgICAgICAgICAgICAgcmVzdWx0LnNldChjaHVuaywgcmVzdWx0T2Zmc2V0KTtcbiAgICAgICAgICAgICAgICByZXN1bHRPZmZzZXQgKz0gY2h1bmsuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgICAgICB0aGlzLl9jaHVua3Muc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl90b3RhbExlbmd0aCAtPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgICAgIGJ5dGVDb3VudCAtPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VCdWZmZXIgPSBBYnN0cmFjdE1lc3NhZ2VCdWZmZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uID0gZXhwb3J0cy5Db25uZWN0aW9uT3B0aW9ucyA9IGV4cG9ydHMuTWVzc2FnZVN0cmF0ZWd5ID0gZXhwb3J0cy5DYW5jZWxsYXRpb25TdHJhdGVneSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gZXhwb3J0cy5JZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IGV4cG9ydHMuQ29ubmVjdGlvbkVycm9yID0gZXhwb3J0cy5Db25uZWN0aW9uRXJyb3JzID0gZXhwb3J0cy5Mb2dUcmFjZU5vdGlmaWNhdGlvbiA9IGV4cG9ydHMuU2V0VHJhY2VOb3RpZmljYXRpb24gPSBleHBvcnRzLlRyYWNlRm9ybWF0ID0gZXhwb3J0cy5UcmFjZVZhbHVlcyA9IGV4cG9ydHMuVHJhY2UgPSBleHBvcnRzLk51bGxMb2dnZXIgPSBleHBvcnRzLlByb2dyZXNzVHlwZSA9IGV4cG9ydHMuUHJvZ3Jlc3NUb2tlbiA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IG1lc3NhZ2VzXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlc1wiKTtcbmNvbnN0IGxpbmtlZE1hcF8xID0gcmVxdWlyZShcIi4vbGlua2VkTWFwXCIpO1xuY29uc3QgZXZlbnRzXzEgPSByZXF1aXJlKFwiLi9ldmVudHNcIik7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbnZhciBDYW5jZWxOb3RpZmljYXRpb247XG4oZnVuY3Rpb24gKENhbmNlbE5vdGlmaWNhdGlvbikge1xuICAgIENhbmNlbE5vdGlmaWNhdGlvbi50eXBlID0gbmV3IG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZSgnJC9jYW5jZWxSZXF1ZXN0Jyk7XG59KShDYW5jZWxOb3RpZmljYXRpb24gfHwgKENhbmNlbE5vdGlmaWNhdGlvbiA9IHt9KSk7XG52YXIgUHJvZ3Jlc3NUb2tlbjtcbihmdW5jdGlvbiAoUHJvZ3Jlc3NUb2tlbikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG4gICAgfVxuICAgIFByb2dyZXNzVG9rZW4uaXMgPSBpcztcbn0pKFByb2dyZXNzVG9rZW4gfHwgKGV4cG9ydHMuUHJvZ3Jlc3NUb2tlbiA9IFByb2dyZXNzVG9rZW4gPSB7fSkpO1xudmFyIFByb2dyZXNzTm90aWZpY2F0aW9uO1xuKGZ1bmN0aW9uIChQcm9ncmVzc05vdGlmaWNhdGlvbikge1xuICAgIFByb2dyZXNzTm90aWZpY2F0aW9uLnR5cGUgPSBuZXcgbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlKCckL3Byb2dyZXNzJyk7XG59KShQcm9ncmVzc05vdGlmaWNhdGlvbiB8fCAoUHJvZ3Jlc3NOb3RpZmljYXRpb24gPSB7fSkpO1xuY2xhc3MgUHJvZ3Jlc3NUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICB9XG59XG5leHBvcnRzLlByb2dyZXNzVHlwZSA9IFByb2dyZXNzVHlwZTtcbnZhciBTdGFyUmVxdWVzdEhhbmRsZXI7XG4oZnVuY3Rpb24gKFN0YXJSZXF1ZXN0SGFuZGxlcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBJcy5mdW5jKHZhbHVlKTtcbiAgICB9XG4gICAgU3RhclJlcXVlc3RIYW5kbGVyLmlzID0gaXM7XG59KShTdGFyUmVxdWVzdEhhbmRsZXIgfHwgKFN0YXJSZXF1ZXN0SGFuZGxlciA9IHt9KSk7XG5leHBvcnRzLk51bGxMb2dnZXIgPSBPYmplY3QuZnJlZXplKHtcbiAgICBlcnJvcjogKCkgPT4geyB9LFxuICAgIHdhcm46ICgpID0+IHsgfSxcbiAgICBpbmZvOiAoKSA9PiB7IH0sXG4gICAgbG9nOiAoKSA9PiB7IH1cbn0pO1xudmFyIFRyYWNlO1xuKGZ1bmN0aW9uIChUcmFjZSkge1xuICAgIFRyYWNlW1RyYWNlW1wiT2ZmXCJdID0gMF0gPSBcIk9mZlwiO1xuICAgIFRyYWNlW1RyYWNlW1wiTWVzc2FnZXNcIl0gPSAxXSA9IFwiTWVzc2FnZXNcIjtcbiAgICBUcmFjZVtUcmFjZVtcIkNvbXBhY3RcIl0gPSAyXSA9IFwiQ29tcGFjdFwiO1xuICAgIFRyYWNlW1RyYWNlW1wiVmVyYm9zZVwiXSA9IDNdID0gXCJWZXJib3NlXCI7XG59KShUcmFjZSB8fCAoZXhwb3J0cy5UcmFjZSA9IFRyYWNlID0ge30pKTtcbnZhciBUcmFjZVZhbHVlcztcbihmdW5jdGlvbiAoVHJhY2VWYWx1ZXMpIHtcbiAgICAvKipcbiAgICAgKiBUdXJuIHRyYWNpbmcgb2ZmLlxuICAgICAqL1xuICAgIFRyYWNlVmFsdWVzLk9mZiA9ICdvZmYnO1xuICAgIC8qKlxuICAgICAqIFRyYWNlIG1lc3NhZ2VzIG9ubHkuXG4gICAgICovXG4gICAgVHJhY2VWYWx1ZXMuTWVzc2FnZXMgPSAnbWVzc2FnZXMnO1xuICAgIC8qKlxuICAgICAqIENvbXBhY3QgbWVzc2FnZSB0cmFjaW5nLlxuICAgICAqL1xuICAgIFRyYWNlVmFsdWVzLkNvbXBhY3QgPSAnY29tcGFjdCc7XG4gICAgLyoqXG4gICAgICogVmVyYm9zZSBtZXNzYWdlIHRyYWNpbmcuXG4gICAgICovXG4gICAgVHJhY2VWYWx1ZXMuVmVyYm9zZSA9ICd2ZXJib3NlJztcbn0pKFRyYWNlVmFsdWVzIHx8IChleHBvcnRzLlRyYWNlVmFsdWVzID0gVHJhY2VWYWx1ZXMgPSB7fSkpO1xuKGZ1bmN0aW9uIChUcmFjZSkge1xuICAgIGZ1bmN0aW9uIGZyb21TdHJpbmcodmFsdWUpIHtcbiAgICAgICAgaWYgKCFJcy5zdHJpbmcodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gVHJhY2UuT2ZmO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSAnb2ZmJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gVHJhY2UuT2ZmO1xuICAgICAgICAgICAgY2FzZSAnbWVzc2FnZXMnOlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5NZXNzYWdlcztcbiAgICAgICAgICAgIGNhc2UgJ2NvbXBhY3QnOlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5Db21wYWN0O1xuICAgICAgICAgICAgY2FzZSAndmVyYm9zZSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFRyYWNlLlZlcmJvc2U7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5PZmY7XG4gICAgICAgIH1cbiAgICB9XG4gICAgVHJhY2UuZnJvbVN0cmluZyA9IGZyb21TdHJpbmc7XG4gICAgZnVuY3Rpb24gdG9TdHJpbmcodmFsdWUpIHtcbiAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5PZmY6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdvZmYnO1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5NZXNzYWdlczpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ21lc3NhZ2VzJztcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuQ29tcGFjdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2NvbXBhY3QnO1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5WZXJib3NlOlxuICAgICAgICAgICAgICAgIHJldHVybiAndmVyYm9zZSc7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAnb2ZmJztcbiAgICAgICAgfVxuICAgIH1cbiAgICBUcmFjZS50b1N0cmluZyA9IHRvU3RyaW5nO1xufSkoVHJhY2UgfHwgKGV4cG9ydHMuVHJhY2UgPSBUcmFjZSA9IHt9KSk7XG52YXIgVHJhY2VGb3JtYXQ7XG4oZnVuY3Rpb24gKFRyYWNlRm9ybWF0KSB7XG4gICAgVHJhY2VGb3JtYXRbXCJUZXh0XCJdID0gXCJ0ZXh0XCI7XG4gICAgVHJhY2VGb3JtYXRbXCJKU09OXCJdID0gXCJqc29uXCI7XG59KShUcmFjZUZvcm1hdCB8fCAoZXhwb3J0cy5UcmFjZUZvcm1hdCA9IFRyYWNlRm9ybWF0ID0ge30pKTtcbihmdW5jdGlvbiAoVHJhY2VGb3JtYXQpIHtcbiAgICBmdW5jdGlvbiBmcm9tU3RyaW5nKHZhbHVlKSB7XG4gICAgICAgIGlmICghSXMuc3RyaW5nKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIFRyYWNlRm9ybWF0LlRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAodmFsdWUgPT09ICdqc29uJykge1xuICAgICAgICAgICAgcmV0dXJuIFRyYWNlRm9ybWF0LkpTT047XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gVHJhY2VGb3JtYXQuVGV4dDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBUcmFjZUZvcm1hdC5mcm9tU3RyaW5nID0gZnJvbVN0cmluZztcbn0pKFRyYWNlRm9ybWF0IHx8IChleHBvcnRzLlRyYWNlRm9ybWF0ID0gVHJhY2VGb3JtYXQgPSB7fSkpO1xudmFyIFNldFRyYWNlTm90aWZpY2F0aW9uO1xuKGZ1bmN0aW9uIChTZXRUcmFjZU5vdGlmaWNhdGlvbikge1xuICAgIFNldFRyYWNlTm90aWZpY2F0aW9uLnR5cGUgPSBuZXcgbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlKCckL3NldFRyYWNlJyk7XG59KShTZXRUcmFjZU5vdGlmaWNhdGlvbiB8fCAoZXhwb3J0cy5TZXRUcmFjZU5vdGlmaWNhdGlvbiA9IFNldFRyYWNlTm90aWZpY2F0aW9uID0ge30pKTtcbnZhciBMb2dUcmFjZU5vdGlmaWNhdGlvbjtcbihmdW5jdGlvbiAoTG9nVHJhY2VOb3RpZmljYXRpb24pIHtcbiAgICBMb2dUcmFjZU5vdGlmaWNhdGlvbi50eXBlID0gbmV3IG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZSgnJC9sb2dUcmFjZScpO1xufSkoTG9nVHJhY2VOb3RpZmljYXRpb24gfHwgKGV4cG9ydHMuTG9nVHJhY2VOb3RpZmljYXRpb24gPSBMb2dUcmFjZU5vdGlmaWNhdGlvbiA9IHt9KSk7XG52YXIgQ29ubmVjdGlvbkVycm9ycztcbihmdW5jdGlvbiAoQ29ubmVjdGlvbkVycm9ycykge1xuICAgIC8qKlxuICAgICAqIFRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZC5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uRXJyb3JzW0Nvbm5lY3Rpb25FcnJvcnNbXCJDbG9zZWRcIl0gPSAxXSA9IFwiQ2xvc2VkXCI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gZ290IGRpc3Bvc2VkLlxuICAgICAqL1xuICAgIENvbm5lY3Rpb25FcnJvcnNbQ29ubmVjdGlvbkVycm9yc1tcIkRpc3Bvc2VkXCJdID0gMl0gPSBcIkRpc3Bvc2VkXCI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBpbiBsaXN0ZW5pbmcgbW9kZS5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uRXJyb3JzW0Nvbm5lY3Rpb25FcnJvcnNbXCJBbHJlYWR5TGlzdGVuaW5nXCJdID0gM10gPSBcIkFscmVhZHlMaXN0ZW5pbmdcIjtcbn0pKENvbm5lY3Rpb25FcnJvcnMgfHwgKGV4cG9ydHMuQ29ubmVjdGlvbkVycm9ycyA9IENvbm5lY3Rpb25FcnJvcnMgPSB7fSkpO1xuY2xhc3MgQ29ubmVjdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNvZGUsIG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBDb25uZWN0aW9uRXJyb3IucHJvdG90eXBlKTtcbiAgICB9XG59XG5leHBvcnRzLkNvbm5lY3Rpb25FcnJvciA9IENvbm5lY3Rpb25FcnJvcjtcbnZhciBDb25uZWN0aW9uU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENvbm5lY3Rpb25TdHJhdGVneSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNhbmNlbFVuZGlzcGF0Y2hlZCk7XG4gICAgfVxuICAgIENvbm5lY3Rpb25TdHJhdGVneS5pcyA9IGlzO1xufSkoQ29ubmVjdGlvblN0cmF0ZWd5IHx8IChleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IENvbm5lY3Rpb25TdHJhdGVneSA9IHt9KSk7XG52YXIgSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5O1xuKGZ1bmN0aW9uIChJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiAoY2FuZGlkYXRlLmtpbmQgPT09IHVuZGVmaW5lZCB8fCBjYW5kaWRhdGUua2luZCA9PT0gJ2lkJykgJiYgSXMuZnVuYyhjYW5kaWRhdGUuY3JlYXRlQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UpICYmIChjYW5kaWRhdGUuZGlzcG9zZSA9PT0gdW5kZWZpbmVkIHx8IElzLmZ1bmMoY2FuZGlkYXRlLmRpc3Bvc2UpKTtcbiAgICB9XG4gICAgSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzID0gaXM7XG59KShJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgfHwgKGV4cG9ydHMuSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0ge30pKTtcbnZhciBSZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneTtcbihmdW5jdGlvbiAoUmVxdWVzdENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBjYW5kaWRhdGUua2luZCA9PT0gJ3JlcXVlc3QnICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKSAmJiAoY2FuZGlkYXRlLmRpc3Bvc2UgPT09IHVuZGVmaW5lZCB8fCBJcy5mdW5jKGNhbmRpZGF0ZS5kaXNwb3NlKSk7XG4gICAgfVxuICAgIFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzID0gaXM7XG59KShSZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSB8fCAoZXhwb3J0cy5SZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0ge30pKTtcbnZhciBDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5O1xuKGZ1bmN0aW9uIChDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5NZXNzYWdlID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKF8pIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgY2FuY2VsbGF0aW9uXzEuQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UoKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kuaXModmFsdWUpIHx8IFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKHZhbHVlKTtcbiAgICB9XG4gICAgQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5pcyA9IGlzO1xufSkoQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSB8fCAoZXhwb3J0cy5DYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IHt9KSk7XG52YXIgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENhbmNlbGxhdGlvblNlbmRlclN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kuTWVzc2FnZSA9IE9iamVjdC5mcmVlemUoe1xuICAgICAgICBzZW5kQ2FuY2VsbGF0aW9uKGNvbm4sIGlkKSB7XG4gICAgICAgICAgICByZXR1cm4gY29ubi5zZW5kTm90aWZpY2F0aW9uKENhbmNlbE5vdGlmaWNhdGlvbi50eXBlLCB7IGlkIH0pO1xuICAgICAgICB9LFxuICAgICAgICBjbGVhbnVwKF8pIHsgfVxuICAgIH0pO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLnNlbmRDYW5jZWxsYXRpb24pICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNsZWFudXApO1xuICAgIH1cbiAgICBDYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneS5pcyA9IGlzO1xufSkoQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgfHwgKGV4cG9ydHMuQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgPSBDYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneSA9IHt9KSk7XG52YXIgQ2FuY2VsbGF0aW9uU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENhbmNlbGxhdGlvblN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uU3RyYXRlZ3kuTWVzc2FnZSA9IE9iamVjdC5mcmVlemUoe1xuICAgICAgICByZWNlaXZlcjogQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5NZXNzYWdlLFxuICAgICAgICBzZW5kZXI6IENhbmNlbGxhdGlvblNlbmRlclN0cmF0ZWd5Lk1lc3NhZ2VcbiAgICB9KTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKGNhbmRpZGF0ZS5yZWNlaXZlcikgJiYgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kuaXMoY2FuZGlkYXRlLnNlbmRlcik7XG4gICAgfVxuICAgIENhbmNlbGxhdGlvblN0cmF0ZWd5LmlzID0gaXM7XG59KShDYW5jZWxsYXRpb25TdHJhdGVneSB8fCAoZXhwb3J0cy5DYW5jZWxsYXRpb25TdHJhdGVneSA9IENhbmNlbGxhdGlvblN0cmF0ZWd5ID0ge30pKTtcbnZhciBNZXNzYWdlU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKE1lc3NhZ2VTdHJhdGVneSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLmhhbmRsZU1lc3NhZ2UpO1xuICAgIH1cbiAgICBNZXNzYWdlU3RyYXRlZ3kuaXMgPSBpcztcbn0pKE1lc3NhZ2VTdHJhdGVneSB8fCAoZXhwb3J0cy5NZXNzYWdlU3RyYXRlZ3kgPSBNZXNzYWdlU3RyYXRlZ3kgPSB7fSkpO1xudmFyIENvbm5lY3Rpb25PcHRpb25zO1xuKGZ1bmN0aW9uIChDb25uZWN0aW9uT3B0aW9ucykge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIChDYW5jZWxsYXRpb25TdHJhdGVneS5pcyhjYW5kaWRhdGUuY2FuY2VsbGF0aW9uU3RyYXRlZ3kpIHx8IENvbm5lY3Rpb25TdHJhdGVneS5pcyhjYW5kaWRhdGUuY29ubmVjdGlvblN0cmF0ZWd5KSB8fCBNZXNzYWdlU3RyYXRlZ3kuaXMoY2FuZGlkYXRlLm1lc3NhZ2VTdHJhdGVneSkpO1xuICAgIH1cbiAgICBDb25uZWN0aW9uT3B0aW9ucy5pcyA9IGlzO1xufSkoQ29ubmVjdGlvbk9wdGlvbnMgfHwgKGV4cG9ydHMuQ29ubmVjdGlvbk9wdGlvbnMgPSBDb25uZWN0aW9uT3B0aW9ucyA9IHt9KSk7XG52YXIgQ29ubmVjdGlvblN0YXRlO1xuKGZ1bmN0aW9uIChDb25uZWN0aW9uU3RhdGUpIHtcbiAgICBDb25uZWN0aW9uU3RhdGVbQ29ubmVjdGlvblN0YXRlW1wiTmV3XCJdID0gMV0gPSBcIk5ld1wiO1xuICAgIENvbm5lY3Rpb25TdGF0ZVtDb25uZWN0aW9uU3RhdGVbXCJMaXN0ZW5pbmdcIl0gPSAyXSA9IFwiTGlzdGVuaW5nXCI7XG4gICAgQ29ubmVjdGlvblN0YXRlW0Nvbm5lY3Rpb25TdGF0ZVtcIkNsb3NlZFwiXSA9IDNdID0gXCJDbG9zZWRcIjtcbiAgICBDb25uZWN0aW9uU3RhdGVbQ29ubmVjdGlvblN0YXRlW1wiRGlzcG9zZWRcIl0gPSA0XSA9IFwiRGlzcG9zZWRcIjtcbn0pKENvbm5lY3Rpb25TdGF0ZSB8fCAoQ29ubmVjdGlvblN0YXRlID0ge30pKTtcbmZ1bmN0aW9uIGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uKG1lc3NhZ2VSZWFkZXIsIG1lc3NhZ2VXcml0ZXIsIF9sb2dnZXIsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBsb2dnZXIgPSBfbG9nZ2VyICE9PSB1bmRlZmluZWQgPyBfbG9nZ2VyIDogZXhwb3J0cy5OdWxsTG9nZ2VyO1xuICAgIGxldCBzZXF1ZW5jZU51bWJlciA9IDA7XG4gICAgbGV0IG5vdGlmaWNhdGlvblNlcXVlbmNlTnVtYmVyID0gMDtcbiAgICBsZXQgdW5rbm93blJlc3BvbnNlU2VxdWVuY2VOdW1iZXIgPSAwO1xuICAgIGNvbnN0IHZlcnNpb24gPSAnMi4wJztcbiAgICBsZXQgc3RhclJlcXVlc3RIYW5kbGVyID0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlcXVlc3RIYW5kbGVycyA9IG5ldyBNYXAoKTtcbiAgICBsZXQgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgY29uc3Qgbm90aWZpY2F0aW9uSGFuZGxlcnMgPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgcHJvZ3Jlc3NIYW5kbGVycyA9IG5ldyBNYXAoKTtcbiAgICBsZXQgdGltZXI7XG4gICAgbGV0IG1lc3NhZ2VRdWV1ZSA9IG5ldyBsaW5rZWRNYXBfMS5MaW5rZWRNYXAoKTtcbiAgICBsZXQgcmVzcG9uc2VQcm9taXNlcyA9IG5ldyBNYXAoKTtcbiAgICBsZXQga25vd25DYW5jZWxlZFJlcXVlc3RzID0gbmV3IFNldCgpO1xuICAgIGxldCByZXF1ZXN0VG9rZW5zID0gbmV3IE1hcCgpO1xuICAgIGxldCB0cmFjZSA9IFRyYWNlLk9mZjtcbiAgICBsZXQgdHJhY2VGb3JtYXQgPSBUcmFjZUZvcm1hdC5UZXh0O1xuICAgIGxldCB0cmFjZXI7XG4gICAgbGV0IHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLk5ldztcbiAgICBjb25zdCBlcnJvckVtaXR0ZXIgPSBuZXcgZXZlbnRzXzEuRW1pdHRlcigpO1xuICAgIGNvbnN0IGNsb3NlRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgdW5oYW5kbGVkTm90aWZpY2F0aW9uRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgdW5oYW5kbGVkUHJvZ3Jlc3NFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICBjb25zdCBkaXNwb3NlRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgY2FuY2VsbGF0aW9uU3RyYXRlZ3kgPSAob3B0aW9ucyAmJiBvcHRpb25zLmNhbmNlbGxhdGlvblN0cmF0ZWd5KSA/IG9wdGlvbnMuY2FuY2VsbGF0aW9uU3RyYXRlZ3kgOiBDYW5jZWxsYXRpb25TdHJhdGVneS5NZXNzYWdlO1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlcXVlc3RRdWV1ZUtleShpZCkge1xuICAgICAgICBpZiAoaWQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuJ3Qgc2VuZCByZXF1ZXN0cyB3aXRoIGlkIG51bGwgc2luY2UgdGhlIHJlc3BvbnNlIGNhbid0IGJlIGNvcnJlbGF0ZWQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdyZXEtJyArIGlkLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlc3BvbnNlUXVldWVLZXkoaWQpIHtcbiAgICAgICAgaWYgKGlkID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3Jlcy11bmtub3duLScgKyAoKyt1bmtub3duUmVzcG9uc2VTZXF1ZW5jZU51bWJlcikudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAncmVzLScgKyBpZC50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZU5vdGlmaWNhdGlvblF1ZXVlS2V5KCkge1xuICAgICAgICByZXR1cm4gJ25vdC0nICsgKCsrbm90aWZpY2F0aW9uU2VxdWVuY2VOdW1iZXIpLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFkZE1lc3NhZ2VUb1F1ZXVlKHF1ZXVlLCBtZXNzYWdlKSB7XG4gICAgICAgIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXF1ZXN0KG1lc3NhZ2UpKSB7XG4gICAgICAgICAgICBxdWV1ZS5zZXQoY3JlYXRlUmVxdWVzdFF1ZXVlS2V5KG1lc3NhZ2UuaWQpLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXNwb25zZShtZXNzYWdlKSkge1xuICAgICAgICAgICAgcXVldWUuc2V0KGNyZWF0ZVJlc3BvbnNlUXVldWVLZXkobWVzc2FnZS5pZCksIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcXVldWUuc2V0KGNyZWF0ZU5vdGlmaWNhdGlvblF1ZXVlS2V5KCksIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNhbmNlbFVuZGlzcGF0Y2hlZChfbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0xpc3RlbmluZygpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlID09PSBDb25uZWN0aW9uU3RhdGUuTGlzdGVuaW5nO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0Nsb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlID09PSBDb25uZWN0aW9uU3RhdGUuQ2xvc2VkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0Rpc3Bvc2VkKCkge1xuICAgICAgICByZXR1cm4gc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5EaXNwb3NlZDtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2xvc2VIYW5kbGVyKCkge1xuICAgICAgICBpZiAoc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5OZXcgfHwgc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5MaXN0ZW5pbmcpIHtcbiAgICAgICAgICAgIHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLkNsb3NlZDtcbiAgICAgICAgICAgIGNsb3NlRW1pdHRlci5maXJlKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlIGNvbm5lY3Rpb24gaXMgZGlzcG9zZWQgZG9uJ3Qgc2VudCBjbG9zZSBldmVudHMuXG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlYWRFcnJvckhhbmRsZXIoZXJyb3IpIHtcbiAgICAgICAgZXJyb3JFbWl0dGVyLmZpcmUoW2Vycm9yLCB1bmRlZmluZWQsIHVuZGVmaW5lZF0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiB3cml0ZUVycm9ySGFuZGxlcihkYXRhKSB7XG4gICAgICAgIGVycm9yRW1pdHRlci5maXJlKGRhdGEpO1xuICAgIH1cbiAgICBtZXNzYWdlUmVhZGVyLm9uQ2xvc2UoY2xvc2VIYW5kbGVyKTtcbiAgICBtZXNzYWdlUmVhZGVyLm9uRXJyb3IocmVhZEVycm9ySGFuZGxlcik7XG4gICAgbWVzc2FnZVdyaXRlci5vbkNsb3NlKGNsb3NlSGFuZGxlcik7XG4gICAgbWVzc2FnZVdyaXRlci5vbkVycm9yKHdyaXRlRXJyb3JIYW5kbGVyKTtcbiAgICBmdW5jdGlvbiB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCkge1xuICAgICAgICBpZiAodGltZXIgfHwgbWVzc2FnZVF1ZXVlLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aW1lciA9ICgwLCByYWxfMS5kZWZhdWx0KSgpLnRpbWVyLnNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICAgICAgICB0aW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHByb2Nlc3NNZXNzYWdlUXVldWUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGhhbmRsZU1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICBpZiAobWVzc2FnZXNfMS5NZXNzYWdlLmlzUmVxdWVzdChtZXNzYWdlKSkge1xuICAgICAgICAgICAgaGFuZGxlUmVxdWVzdChtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNOb3RpZmljYXRpb24obWVzc2FnZSkpIHtcbiAgICAgICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvbihtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXNwb25zZShtZXNzYWdlKSkge1xuICAgICAgICAgICAgaGFuZGxlUmVzcG9uc2UobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBoYW5kbGVJbnZhbGlkTWVzc2FnZShtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBwcm9jZXNzTWVzc2FnZVF1ZXVlKCkge1xuICAgICAgICBpZiAobWVzc2FnZVF1ZXVlLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXNzYWdlID0gbWVzc2FnZVF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlU3RyYXRlZ3kgPSBvcHRpb25zPy5tZXNzYWdlU3RyYXRlZ3k7XG4gICAgICAgICAgICBpZiAoTWVzc2FnZVN0cmF0ZWd5LmlzKG1lc3NhZ2VTdHJhdGVneSkpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlU3RyYXRlZ3kuaGFuZGxlTWVzc2FnZShtZXNzYWdlLCBoYW5kbGVNZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGhhbmRsZU1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgY2FsbGJhY2sgPSAobWVzc2FnZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2UgaGF2ZSByZWNlaXZlZCBhIGNhbmNlbGxhdGlvbiBtZXNzYWdlLiBDaGVjayBpZiB0aGUgbWVzc2FnZSBpcyBzdGlsbCBpbiB0aGUgcXVldWVcbiAgICAgICAgICAgIC8vIGFuZCBjYW5jZWwgaXQgaWYgYWxsb3dlZCB0byBkbyBzby5cbiAgICAgICAgICAgIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNOb3RpZmljYXRpb24obWVzc2FnZSkgJiYgbWVzc2FnZS5tZXRob2QgPT09IENhbmNlbE5vdGlmaWNhdGlvbi50eXBlLm1ldGhvZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbmNlbElkID0gbWVzc2FnZS5wYXJhbXMuaWQ7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gY3JlYXRlUmVxdWVzdFF1ZXVlS2V5KGNhbmNlbElkKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0b0NhbmNlbCA9IG1lc3NhZ2VRdWV1ZS5nZXQoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZXNfMS5NZXNzYWdlLmlzUmVxdWVzdCh0b0NhbmNlbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyYXRlZ3kgPSBvcHRpb25zPy5jb25uZWN0aW9uU3RyYXRlZ3k7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gKHN0cmF0ZWd5ICYmIHN0cmF0ZWd5LmNhbmNlbFVuZGlzcGF0Y2hlZCkgPyBzdHJhdGVneS5jYW5jZWxVbmRpc3BhdGNoZWQodG9DYW5jZWwsIGNhbmNlbFVuZGlzcGF0Y2hlZCkgOiBjYW5jZWxVbmRpc3BhdGNoZWQodG9DYW5jZWwpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgJiYgKHJlc3BvbnNlLmVycm9yICE9PSB1bmRlZmluZWQgfHwgcmVzcG9uc2UucmVzdWx0ICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUXVldWUuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLmRlbGV0ZShjYW5jZWxJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5pZCA9IHRvQ2FuY2VsLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VTZW5kaW5nUmVzcG9uc2UocmVzcG9uc2UsIG1lc3NhZ2UubWV0aG9kLCBEYXRlLm5vdygpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUocmVzcG9uc2UpLmNhdGNoKCgpID0+IGxvZ2dlci5lcnJvcihgU2VuZGluZyByZXNwb25zZSBmb3IgY2FuY2VsZWQgbWVzc2FnZSBmYWlsZWQuYCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGNhbmNlbGxhdGlvblRva2VuID0gcmVxdWVzdFRva2Vucy5nZXQoY2FuY2VsSWQpO1xuICAgICAgICAgICAgICAgIC8vIFRoZSByZXF1ZXN0IGlzIGFscmVhZHkgcnVubmluZy4gQ2FuY2VsIHRoZSB0b2tlblxuICAgICAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbmNlbGxhdGlvblRva2VuLmNhbmNlbCgpO1xuICAgICAgICAgICAgICAgICAgICB0cmFjZVJlY2VpdmVkTm90aWZpY2F0aW9uKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZW1lbWJlciB0aGUgY2FuY2VsIGJ1dCBzdGlsbCBxdWV1ZSB0aGUgbWVzc2FnZSB0b1xuICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbiB1cCBzdGF0ZSBpbiBwcm9jZXNzIG1lc3NhZ2UuXG4gICAgICAgICAgICAgICAgICAgIGtub3duQ2FuY2VsZWRSZXF1ZXN0cy5hZGQoY2FuY2VsSWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFkZE1lc3NhZ2VUb1F1ZXVlKG1lc3NhZ2VRdWV1ZSwgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGZ1bmN0aW9uIGhhbmRsZVJlcXVlc3QocmVxdWVzdE1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgLy8gd2UgcmV0dXJuIGhlcmUgc2lsZW50bHkgc2luY2Ugd2UgZmlyZWQgYW4gZXZlbnQgd2hlbiB0aGVcbiAgICAgICAgICAgIC8vIGNvbm5lY3Rpb24gZ290IGRpc3Bvc2VkLlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHJlcGx5KHJlc3VsdE9yRXJyb3IsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgaWQ6IHJlcXVlc3RNZXNzYWdlLmlkXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKHJlc3VsdE9yRXJyb3IgaW5zdGFuY2VvZiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlLmVycm9yID0gcmVzdWx0T3JFcnJvci50b0pzb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVzdWx0ID0gcmVzdWx0T3JFcnJvciA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHJlc3VsdE9yRXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cmFjZVNlbmRpbmdSZXNwb25zZShtZXNzYWdlLCBtZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICBtZXNzYWdlV3JpdGVyLndyaXRlKG1lc3NhZ2UpLmNhdGNoKCgpID0+IGxvZ2dlci5lcnJvcihgU2VuZGluZyByZXNwb25zZSBmYWlsZWQuYCkpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHJlcGx5RXJyb3IoZXJyb3IsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgaWQ6IHJlcXVlc3RNZXNzYWdlLmlkLFxuICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvci50b0pzb24oKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUobWVzc2FnZSkuY2F0Y2goKCkgPT4gbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlc3BvbnNlIGZhaWxlZC5gKSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gcmVwbHlTdWNjZXNzKHJlc3VsdCwgbWV0aG9kLCBzdGFydFRpbWUpIHtcbiAgICAgICAgICAgIC8vIFRoZSBKU09OIFJQQyBkZWZpbmVzIHRoYXQgYSByZXNwb25zZSBtdXN0IGVpdGhlciBoYXZlIGEgcmVzdWx0IG9yIGFuIGVycm9yXG4gICAgICAgICAgICAvLyBTbyB3ZSBjYW4ndCB0cmVhdCB1bmRlZmluZWQgYXMgYSB2YWxpZCByZXNwb25zZSByZXN1bHQuXG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgICAgICAgICAgICBqc29ucnBjOiB2ZXJzaW9uLFxuICAgICAgICAgICAgICAgIGlkOiByZXF1ZXN0TWVzc2FnZS5pZCxcbiAgICAgICAgICAgICAgICByZXN1bHQ6IHJlc3VsdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUobWVzc2FnZSkuY2F0Y2goKCkgPT4gbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlc3BvbnNlIGZhaWxlZC5gKSk7XG4gICAgICAgIH1cbiAgICAgICAgdHJhY2VSZWNlaXZlZFJlcXVlc3QocmVxdWVzdE1lc3NhZ2UpO1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gcmVxdWVzdEhhbmRsZXJzLmdldChyZXF1ZXN0TWVzc2FnZS5tZXRob2QpO1xuICAgICAgICBsZXQgdHlwZTtcbiAgICAgICAgbGV0IHJlcXVlc3RIYW5kbGVyO1xuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgdHlwZSA9IGVsZW1lbnQudHlwZTtcbiAgICAgICAgICAgIHJlcXVlc3RIYW5kbGVyID0gZWxlbWVudC5oYW5kbGVyO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIGlmIChyZXF1ZXN0SGFuZGxlciB8fCBzdGFyUmVxdWVzdEhhbmRsZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHRva2VuS2V5ID0gcmVxdWVzdE1lc3NhZ2UuaWQgPz8gU3RyaW5nKERhdGUubm93KCkpOyAvL1xuICAgICAgICAgICAgY29uc3QgY2FuY2VsbGF0aW9uU291cmNlID0gSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKGNhbmNlbGxhdGlvblN0cmF0ZWd5LnJlY2VpdmVyKVxuICAgICAgICAgICAgICAgID8gY2FuY2VsbGF0aW9uU3RyYXRlZ3kucmVjZWl2ZXIuY3JlYXRlQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UodG9rZW5LZXkpXG4gICAgICAgICAgICAgICAgOiBjYW5jZWxsYXRpb25TdHJhdGVneS5yZWNlaXZlci5jcmVhdGVDYW5jZWxsYXRpb25Ub2tlblNvdXJjZShyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICBpZiAocmVxdWVzdE1lc3NhZ2UuaWQgIT09IG51bGwgJiYga25vd25DYW5jZWxlZFJlcXVlc3RzLmhhcyhyZXF1ZXN0TWVzc2FnZS5pZCkpIHtcbiAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25Tb3VyY2UuY2FuY2VsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVxdWVzdE1lc3NhZ2UuaWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLnNldCh0b2tlbktleSwgY2FuY2VsbGF0aW9uU291cmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IGhhbmRsZXJSZXN1bHQ7XG4gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0TWVzc2FnZS5wYXJhbXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlLm51bWJlck9mUGFyYW1zICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1zLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyAke3R5cGUubnVtYmVyT2ZQYXJhbXN9IHBhcmFtcyBidXQgcmVjZWl2ZWQgbm9uZS5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJSZXN1bHQgPSByZXF1ZXN0SGFuZGxlcihjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVxdWVzdE1lc3NhZ2UucGFyYW1zKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlLnBhcmFtZXRlclN0cnVjdHVyZXMgPT09IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseUVycm9yKG5ldyBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IobWVzc2FnZXNfMS5FcnJvckNvZGVzLkludmFsaWRQYXJhbXMsIGBSZXF1ZXN0ICR7cmVxdWVzdE1lc3NhZ2UubWV0aG9kfSBkZWZpbmVzIHBhcmFtZXRlcnMgYnkgbmFtZSBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBwb3NpdGlvbmApLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlclJlc3VsdCA9IHJlcXVlc3RIYW5kbGVyKC4uLnJlcXVlc3RNZXNzYWdlLnBhcmFtcywgY2FuY2VsbGF0aW9uU291cmNlLnRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS5wYXJhbWV0ZXJTdHJ1Y3R1cmVzID09PSBtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW52YWxpZFBhcmFtcywgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGRlZmluZXMgcGFyYW1ldGVycyBieSBwb3NpdGlvbiBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBuYW1lYCksIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gcmVxdWVzdEhhbmRsZXIocmVxdWVzdE1lc3NhZ2UucGFyYW1zLCBjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0YXJSZXF1ZXN0SGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gc3RhclJlcXVlc3RIYW5kbGVyKHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgcmVxdWVzdE1lc3NhZ2UucGFyYW1zLCBjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBwcm9taXNlID0gaGFuZGxlclJlc3VsdDtcbiAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZXJSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFRva2Vucy5kZWxldGUodG9rZW5LZXkpO1xuICAgICAgICAgICAgICAgICAgICByZXBseVN1Y2Nlc3MoaGFuZGxlclJlc3VsdCwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwcm9taXNlLnRoZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS50aGVuKChyZXN1bHRPckVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLmRlbGV0ZSh0b2tlbktleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXBseShyZXN1bHRPckVycm9yLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IoZXJyb3IsIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVycm9yICYmIElzLnN0cmluZyhlcnJvci5tZXNzYWdlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGZhaWxlZCB3aXRoIG1lc3NhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZmFpbGVkIHVuZXhwZWN0ZWRseSB3aXRob3V0IHByb3ZpZGluZyBhbnkgZGV0YWlscy5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHkoaGFuZGxlclJlc3VsdCwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHkoZXJyb3IsIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZXJyb3IgJiYgSXMuc3RyaW5nKGVycm9yLm1lc3NhZ2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGZhaWxlZCB3aXRoIG1lc3NhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZmFpbGVkIHVuZXhwZWN0ZWRseSB3aXRob3V0IHByb3ZpZGluZyBhbnkgZGV0YWlscy5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuTWV0aG9kTm90Rm91bmQsIGBVbmhhbmRsZWQgbWV0aG9kICR7cmVxdWVzdE1lc3NhZ2UubWV0aG9kfWApLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlUmVzcG9uc2UocmVzcG9uc2VNZXNzYWdlKSB7XG4gICAgICAgIGlmIChpc0Rpc3Bvc2VkKCkpIHtcbiAgICAgICAgICAgIC8vIFNlZSBoYW5kbGUgcmVxdWVzdC5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzcG9uc2VNZXNzYWdlLmlkID09PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VNZXNzYWdlLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBSZWNlaXZlZCByZXNwb25zZSBtZXNzYWdlIHdpdGhvdXQgaWQ6IEVycm9yIGlzOiBcXG4ke0pTT04uc3RyaW5naWZ5KHJlc3BvbnNlTWVzc2FnZS5lcnJvciwgdW5kZWZpbmVkLCA0KX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgUmVjZWl2ZWQgcmVzcG9uc2UgbWVzc2FnZSB3aXRob3V0IGlkLiBObyBmdXJ0aGVyIGVycm9yIGluZm9ybWF0aW9uIHByb3ZpZGVkLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gcmVzcG9uc2VNZXNzYWdlLmlkO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VQcm9taXNlID0gcmVzcG9uc2VQcm9taXNlcy5nZXQoa2V5KTtcbiAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWRSZXNwb25zZShyZXNwb25zZU1lc3NhZ2UsIHJlc3BvbnNlUHJvbWlzZSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VQcm9taXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2VzLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZU1lc3NhZ2UuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gcmVzcG9uc2VNZXNzYWdlLmVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlLnJlamVjdChuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKGVycm9yLmNvZGUsIGVycm9yLm1lc3NhZ2UsIGVycm9yLmRhdGEpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXNwb25zZU1lc3NhZ2UucmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlTWVzc2FnZS5yZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgbmV2ZXIgaGFwcGVuLicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IubWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBSZXNwb25zZSBoYW5kbGVyICcke3Jlc3BvbnNlUHJvbWlzZS5tZXRob2R9JyBmYWlsZWQgd2l0aCBtZXNzYWdlOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYFJlc3BvbnNlIGhhbmRsZXIgJyR7cmVzcG9uc2VQcm9taXNlLm1ldGhvZH0nIGZhaWxlZCB1bmV4cGVjdGVkbHkuYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlTm90aWZpY2F0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgLy8gU2VlIGhhbmRsZSByZXF1ZXN0LlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0eXBlID0gdW5kZWZpbmVkO1xuICAgICAgICBsZXQgbm90aWZpY2F0aW9uSGFuZGxlcjtcbiAgICAgICAgaWYgKG1lc3NhZ2UubWV0aG9kID09PSBDYW5jZWxOb3RpZmljYXRpb24udHlwZS5tZXRob2QpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhbmNlbElkID0gbWVzc2FnZS5wYXJhbXMuaWQ7XG4gICAgICAgICAgICBrbm93bkNhbmNlbGVkUmVxdWVzdHMuZGVsZXRlKGNhbmNlbElkKTtcbiAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWROb3RpZmljYXRpb24obWVzc2FnZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gbm90aWZpY2F0aW9uSGFuZGxlcnMuZ2V0KG1lc3NhZ2UubWV0aG9kKTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uSGFuZGxlciA9IGVsZW1lbnQuaGFuZGxlcjtcbiAgICAgICAgICAgICAgICB0eXBlID0gZWxlbWVudC50eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChub3RpZmljYXRpb25IYW5kbGVyIHx8IHN0YXJOb3RpZmljYXRpb25IYW5kbGVyKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWROb3RpZmljYXRpb24obWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgaWYgKG5vdGlmaWNhdGlvbkhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UucGFyYW1zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5udW1iZXJPZlBhcmFtcyAhPT0gMCAmJiB0eXBlLnBhcmFtZXRlclN0cnVjdHVyZXMgIT09IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBOb3RpZmljYXRpb24gJHttZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyAke3R5cGUubnVtYmVyT2ZQYXJhbXN9IHBhcmFtcyBidXQgcmVjZWl2ZWQgbm9uZS5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShtZXNzYWdlLnBhcmFtcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGFyZSBKU09OLVJQQyBsaWJyYXJpZXMgdGhhdCBzZW5kIHByb2dyZXNzIG1lc3NhZ2UgYXMgcG9zaXRpb25hbCBwYXJhbXMgYWx0aG91Z2hcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpZmllZCBhcyBuYW1lZC4gU28gY29udmVydCB0aGVtIGlmIHRoaXMgaXMgdGhlIGNhc2UuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBtZXNzYWdlLnBhcmFtcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLm1ldGhvZCA9PT0gUHJvZ3Jlc3NOb3RpZmljYXRpb24udHlwZS5tZXRob2QgJiYgcGFyYW1zLmxlbmd0aCA9PT0gMiAmJiBQcm9ncmVzc1Rva2VuLmlzKHBhcmFtc1swXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKHsgdG9rZW46IHBhcmFtc1swXSwgdmFsdWU6IHBhcmFtc1sxXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUucGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBOb3RpZmljYXRpb24gJHttZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyBwYXJhbWV0ZXJzIGJ5IG5hbWUgYnV0IHJlY2VpdmVkIHBhcmFtZXRlcnMgYnkgcG9zaXRpb25gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5udW1iZXJPZlBhcmFtcyAhPT0gbWVzc2FnZS5wYXJhbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYE5vdGlmaWNhdGlvbiAke21lc3NhZ2UubWV0aG9kfSBkZWZpbmVzICR7dHlwZS5udW1iZXJPZlBhcmFtc30gcGFyYW1zIGJ1dCByZWNlaXZlZCAke3BhcmFtcy5sZW5ndGh9IGFyZ3VtZW50c2ApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXIoLi4ucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS5wYXJhbWV0ZXJTdHJ1Y3R1cmVzID09PSBtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgTm90aWZpY2F0aW9uICR7bWVzc2FnZS5tZXRob2R9IGRlZmluZXMgcGFyYW1ldGVycyBieSBwb3NpdGlvbiBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBuYW1lYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKG1lc3NhZ2UucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGFyTm90aWZpY2F0aW9uSGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICBzdGFyTm90aWZpY2F0aW9uSGFuZGxlcihtZXNzYWdlLm1ldGhvZCwgbWVzc2FnZS5wYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvci5tZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgTm90aWZpY2F0aW9uIGhhbmRsZXIgJyR7bWVzc2FnZS5tZXRob2R9JyBmYWlsZWQgd2l0aCBtZXNzYWdlOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYE5vdGlmaWNhdGlvbiBoYW5kbGVyICcke21lc3NhZ2UubWV0aG9kfScgZmFpbGVkIHVuZXhwZWN0ZWRseS5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1bmhhbmRsZWROb3RpZmljYXRpb25FbWl0dGVyLmZpcmUobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlSW52YWxpZE1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignUmVjZWl2ZWQgZW1wdHkgbWVzc2FnZS4nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsb2dnZXIuZXJyb3IoYFJlY2VpdmVkIG1lc3NhZ2Ugd2hpY2ggaXMgbmVpdGhlciBhIHJlc3BvbnNlIG5vciBhIG5vdGlmaWNhdGlvbiBtZXNzYWdlOlxcbiR7SlNPTi5zdHJpbmdpZnkobWVzc2FnZSwgbnVsbCwgNCl9YCk7XG4gICAgICAgIC8vIFRlc3Qgd2hldGhlciB3ZSBmaW5kIGFuIGlkIHRvIHJlamVjdCB0aGUgcHJvbWlzZVxuICAgICAgICBjb25zdCByZXNwb25zZU1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICBpZiAoSXMuc3RyaW5nKHJlc3BvbnNlTWVzc2FnZS5pZCkgfHwgSXMubnVtYmVyKHJlc3BvbnNlTWVzc2FnZS5pZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHJlc3BvbnNlTWVzc2FnZS5pZDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxlciA9IHJlc3BvbnNlUHJvbWlzZXMuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VIYW5kbGVyLnJlamVjdChuZXcgRXJyb3IoJ1RoZSByZWNlaXZlZCByZXNwb25zZSBoYXMgbmVpdGhlciBhIHJlc3VsdCBub3IgYW4gZXJyb3IgcHJvcGVydHkuJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0cmluZ2lmeVRyYWNlKHBhcmFtcykge1xuICAgICAgICBpZiAocGFyYW1zID09PSB1bmRlZmluZWQgfHwgcGFyYW1zID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAodHJhY2UpIHtcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuVmVyYm9zZTpcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGFyYW1zLCBudWxsLCA0KTtcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuQ29tcGFjdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGFyYW1zKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVNlbmRpbmdSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFjZUZvcm1hdCA9PT0gVHJhY2VGb3JtYXQuVGV4dCkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSAmJiBtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBgUGFyYW1zOiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucGFyYW1zKX1cXG5cXG5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJhY2VyLmxvZyhgU2VuZGluZyByZXF1ZXN0ICcke21lc3NhZ2UubWV0aG9kfSAtICgke21lc3NhZ2UuaWR9KScuYCwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb2dMU1BNZXNzYWdlKCdzZW5kLXJlcXVlc3QnLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVNlbmRpbmdOb3RpZmljYXRpb24obWVzc2FnZSkge1xuICAgICAgICBpZiAodHJhY2UgPT09IFRyYWNlLk9mZiB8fCAhdHJhY2VyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYWNlRm9ybWF0ID09PSBUcmFjZUZvcm1hdC5UZXh0KSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdCkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0gYFBhcmFtczogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLnBhcmFtcyl9XFxuXFxuYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSAnTm8gcGFyYW1ldGVycyBwcm92aWRlZC5cXG5cXG4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFNlbmRpbmcgbm90aWZpY2F0aW9uICcke21lc3NhZ2UubWV0aG9kfScuYCwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb2dMU1BNZXNzYWdlKCdzZW5kLW5vdGlmaWNhdGlvbicsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhY2VGb3JtYXQgPT09IFRyYWNlRm9ybWF0LlRleHQpIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZXJyb3IgJiYgbWVzc2FnZS5lcnJvci5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgRXJyb3IgZGF0YTogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLmVycm9yLmRhdGEpfVxcblxcbmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgUmVzdWx0OiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucmVzdWx0KX1cXG5cXG5gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UuZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9ICdObyByZXN1bHQgcmV0dXJuZWQuXFxuXFxuJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFNlbmRpbmcgcmVzcG9uc2UgJyR7bWV0aG9kfSAtICgke21lc3NhZ2UuaWR9KScuIFByb2Nlc3NpbmcgcmVxdWVzdCB0b29rICR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1tc2AsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgnc2VuZC1yZXNwb25zZScsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYWNlUmVjZWl2ZWRSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFjZUZvcm1hdCA9PT0gVHJhY2VGb3JtYXQuVGV4dCkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSAmJiBtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBgUGFyYW1zOiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucGFyYW1zKX1cXG5cXG5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJhY2VyLmxvZyhgUmVjZWl2ZWQgcmVxdWVzdCAnJHttZXNzYWdlLm1ldGhvZH0gLSAoJHttZXNzYWdlLmlkfSknLmAsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1yZXF1ZXN0JywgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdHJhY2VSZWNlaXZlZE5vdGlmaWNhdGlvbihtZXNzYWdlKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIgfHwgbWVzc2FnZS5tZXRob2QgPT09IExvZ1RyYWNlTm90aWZpY2F0aW9uLnR5cGUubWV0aG9kKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYWNlRm9ybWF0ID09PSBUcmFjZUZvcm1hdC5UZXh0KSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdCkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0gYFBhcmFtczogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLnBhcmFtcyl9XFxuXFxuYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSAnTm8gcGFyYW1ldGVycyBwcm92aWRlZC5cXG5cXG4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFJlY2VpdmVkIG5vdGlmaWNhdGlvbiAnJHttZXNzYWdlLm1ldGhvZH0nLmAsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1ub3RpZmljYXRpb24nLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVJlY2VpdmVkUmVzcG9uc2UobWVzc2FnZSwgcmVzcG9uc2VQcm9taXNlKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhY2VGb3JtYXQgPT09IFRyYWNlRm9ybWF0LlRleHQpIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZXJyb3IgJiYgbWVzc2FnZS5lcnJvci5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgRXJyb3IgZGF0YTogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLmVycm9yLmRhdGEpfVxcblxcbmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgUmVzdWx0OiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucmVzdWx0KX1cXG5cXG5gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UuZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9ICdObyByZXN1bHQgcmV0dXJuZWQuXFxuXFxuJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXNwb25zZVByb21pc2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IG1lc3NhZ2UuZXJyb3IgPyBgIFJlcXVlc3QgZmFpbGVkOiAke21lc3NhZ2UuZXJyb3IubWVzc2FnZX0gKCR7bWVzc2FnZS5lcnJvci5jb2RlfSkuYCA6ICcnO1xuICAgICAgICAgICAgICAgIHRyYWNlci5sb2coYFJlY2VpdmVkIHJlc3BvbnNlICcke3Jlc3BvbnNlUHJvbWlzZS5tZXRob2R9IC0gKCR7bWVzc2FnZS5pZH0pJyBpbiAke0RhdGUubm93KCkgLSByZXNwb25zZVByb21pc2UudGltZXJTdGFydH1tcy4ke2Vycm9yfWAsIGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJhY2VyLmxvZyhgUmVjZWl2ZWQgcmVzcG9uc2UgJHttZXNzYWdlLmlkfSB3aXRob3V0IGFjdGl2ZSByZXNwb25zZSBwcm9taXNlLmAsIGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1yZXNwb25zZScsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGxvZ0xTUE1lc3NhZ2UodHlwZSwgbWVzc2FnZSkge1xuICAgICAgICBpZiAoIXRyYWNlciB8fCB0cmFjZSA9PT0gVHJhY2UuT2ZmKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbHNwTWVzc2FnZSA9IHtcbiAgICAgICAgICAgIGlzTFNQTWVzc2FnZTogdHJ1ZSxcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpXG4gICAgICAgIH07XG4gICAgICAgIHRyYWNlci5sb2cobHNwTWVzc2FnZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRocm93SWZDbG9zZWRPckRpc3Bvc2VkKCkge1xuICAgICAgICBpZiAoaXNDbG9zZWQoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IENvbm5lY3Rpb25FcnJvcihDb25uZWN0aW9uRXJyb3JzLkNsb3NlZCwgJ0Nvbm5lY3Rpb24gaXMgY2xvc2VkLicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0Rpc3Bvc2VkKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb25uZWN0aW9uRXJyb3IoQ29ubmVjdGlvbkVycm9ycy5EaXNwb3NlZCwgJ0Nvbm5lY3Rpb24gaXMgZGlzcG9zZWQuJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdGhyb3dJZkxpc3RlbmluZygpIHtcbiAgICAgICAgaWYgKGlzTGlzdGVuaW5nKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb25uZWN0aW9uRXJyb3IoQ29ubmVjdGlvbkVycm9ycy5BbHJlYWR5TGlzdGVuaW5nLCAnQ29ubmVjdGlvbiBpcyBhbHJlYWR5IGxpc3RlbmluZycpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRocm93SWZOb3RMaXN0ZW5pbmcoKSB7XG4gICAgICAgIGlmICghaXNMaXN0ZW5pbmcoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYWxsIGxpc3RlbigpIGZpcnN0LicpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVuZGVmaW5lZFRvTnVsbChwYXJhbSkge1xuICAgICAgICBpZiAocGFyYW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyYW07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gbnVsbFRvVW5kZWZpbmVkKHBhcmFtKSB7XG4gICAgICAgIGlmIChwYXJhbSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJhbTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBpc05hbWVkUGFyYW0ocGFyYW0pIHtcbiAgICAgICAgcmV0dXJuIHBhcmFtICE9PSB1bmRlZmluZWQgJiYgcGFyYW0gIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkocGFyYW0pICYmIHR5cGVvZiBwYXJhbSA9PT0gJ29iamVjdCc7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXB1dGVTaW5nbGVQYXJhbShwYXJhbWV0ZXJTdHJ1Y3R1cmVzLCBwYXJhbSkge1xuICAgICAgICBzd2l0Y2ggKHBhcmFtZXRlclN0cnVjdHVyZXMpIHtcbiAgICAgICAgICAgIGNhc2UgbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG86XG4gICAgICAgICAgICAgICAgaWYgKGlzTmFtZWRQYXJhbShwYXJhbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxUb1VuZGVmaW5lZChwYXJhbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3VuZGVmaW5lZFRvTnVsbChwYXJhbSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZTpcbiAgICAgICAgICAgICAgICBpZiAoIWlzTmFtZWRQYXJhbShwYXJhbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWNlaXZlZCBwYXJhbWV0ZXJzIGJ5IG5hbWUgYnV0IHBhcmFtIGlzIG5vdCBhbiBvYmplY3QgbGl0ZXJhbC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGxUb1VuZGVmaW5lZChwYXJhbSk7XG4gICAgICAgICAgICBjYXNlIG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieVBvc2l0aW9uOlxuICAgICAgICAgICAgICAgIHJldHVybiBbdW5kZWZpbmVkVG9OdWxsKHBhcmFtKV07XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBwYXJhbWV0ZXIgc3RydWN0dXJlICR7cGFyYW1ldGVyU3RydWN0dXJlcy50b1N0cmluZygpfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXB1dGVNZXNzYWdlUGFyYW1zKHR5cGUsIHBhcmFtcykge1xuICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICBjb25zdCBudW1iZXJPZlBhcmFtcyA9IHR5cGUubnVtYmVyT2ZQYXJhbXM7XG4gICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gY29tcHV0ZVNpbmdsZVBhcmFtKHR5cGUucGFyYW1ldGVyU3RydWN0dXJlcywgcGFyYW1zWzBdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoICYmIGkgPCBudW1iZXJPZlBhcmFtczsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHVuZGVmaW5lZFRvTnVsbChwYXJhbXNbaV0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPCBudW1iZXJPZlBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gcGFyYW1zLmxlbmd0aDsgaSA8IG51bWJlck9mUGFyYW1zOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB7XG4gICAgICAgIHNlbmROb3RpZmljYXRpb246ICh0eXBlLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlUGFyYW1zO1xuICAgICAgICAgICAgaWYgKElzLnN0cmluZyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICAgIGxldCBwYXJhbVN0YXJ0ID0gMDtcbiAgICAgICAgICAgICAgICBsZXQgcGFyYW1ldGVyU3RydWN0dXJlcyA9IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvO1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuaXMoZmlyc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtU3RhcnQgPSAxO1xuICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gZmlyc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBwYXJhbUVuZCA9IGFyZ3MubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gcGFyYW1FbmQgLSBwYXJhbVN0YXJ0O1xuICAgICAgICAgICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zID0gY29tcHV0ZVNpbmdsZVBhcmFtKHBhcmFtZXRlclN0cnVjdHVyZXMsIGFyZ3NbcGFyYW1TdGFydF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjZWl2ZWQgJHtudW1iZXJPZlBhcmFtc30gcGFyYW1ldGVycyBmb3IgJ2J5IE5hbWUnIG5vdGlmaWNhdGlvbiBwYXJhbWV0ZXIgc3RydWN0dXJlLmApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IGFyZ3Muc2xpY2UocGFyYW1TdGFydCwgcGFyYW1FbmQpLm1hcCh2YWx1ZSA9PiB1bmRlZmluZWRUb051bGwodmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IGFyZ3M7XG4gICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZS5tZXRob2Q7XG4gICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IGNvbXB1dGVNZXNzYWdlUGFyYW1zKHR5cGUsIHBhcmFtcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBub3RpZmljYXRpb25NZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBtZXNzYWdlUGFyYW1zXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdHJhY2VTZW5kaW5nTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbk1lc3NhZ2UpO1xuICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2VXcml0ZXIud3JpdGUobm90aWZpY2F0aW9uTWVzc2FnZSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBTZW5kaW5nIG5vdGlmaWNhdGlvbiBmYWlsZWQuYCk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25Ob3RpZmljYXRpb246ICh0eXBlLCBoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGlmIChJcy5mdW5jKHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB0eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaGFuZGxlcikge1xuICAgICAgICAgICAgICAgIGlmIChJcy5zdHJpbmcodHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZTtcbiAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uSGFuZGxlcnMuc2V0KHR5cGUsIHsgdHlwZTogdW5kZWZpbmVkLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZS5tZXRob2Q7XG4gICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXJzLnNldCh0eXBlLm1ldGhvZCwgeyB0eXBlLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXJzLmRlbGV0ZShtZXRob2QpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBvblByb2dyZXNzOiAoX3R5cGUsIHRva2VuLCBoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgICBpZiAocHJvZ3Jlc3NIYW5kbGVycy5oYXModG9rZW4pKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm9ncmVzcyBoYW5kbGVyIGZvciB0b2tlbiAke3Rva2VufSBhbHJlYWR5IHJlZ2lzdGVyZWRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByb2dyZXNzSGFuZGxlcnMuc2V0KHRva2VuLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc0hhbmRsZXJzLmRlbGV0ZSh0b2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgc2VuZFByb2dyZXNzOiAoX3R5cGUsIHRva2VuLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGF3YWl0IGJ1dCBzaW1wbGUgcmV0dXJuIHRvIGVuc3VyZSB0aGF0IHdlIGRvbid0IGhhdmUgYW5vdGhlclxuICAgICAgICAgICAgLy8gYXN5bmMgc2NoZWR1bGluZy4gT3RoZXJ3aXNlIG9uZSBzZW5kIGNvdWxkIG92ZXJ0YWtlIGFub3RoZXIgc2VuZC5cbiAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLnNlbmROb3RpZmljYXRpb24oUHJvZ3Jlc3NOb3RpZmljYXRpb24udHlwZSwgeyB0b2tlbiwgdmFsdWUgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uVW5oYW5kbGVkUHJvZ3Jlc3M6IHVuaGFuZGxlZFByb2dyZXNzRW1pdHRlci5ldmVudCxcbiAgICAgICAgc2VuZFJlcXVlc3Q6ICh0eXBlLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgdGhyb3dJZk5vdExpc3RlbmluZygpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlUGFyYW1zO1xuICAgICAgICAgICAgbGV0IHRva2VuID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKElzLnN0cmluZyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3QgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgbGV0IHBhcmFtU3RhcnQgPSAwO1xuICAgICAgICAgICAgICAgIGxldCBwYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG87XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5pcyhmaXJzdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1TdGFydCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlclN0cnVjdHVyZXMgPSBmaXJzdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHBhcmFtRW5kID0gYXJncy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuLmlzKGxhc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtRW5kID0gcGFyYW1FbmQgLSAxO1xuICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IGxhc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gcGFyYW1FbmQgLSBwYXJhbVN0YXJ0O1xuICAgICAgICAgICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zID0gY29tcHV0ZVNpbmdsZVBhcmFtKHBhcmFtZXRlclN0cnVjdHVyZXMsIGFyZ3NbcGFyYW1TdGFydF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjZWl2ZWQgJHtudW1iZXJPZlBhcmFtc30gcGFyYW1ldGVycyBmb3IgJ2J5IE5hbWUnIHJlcXVlc3QgcGFyYW1ldGVyIHN0cnVjdHVyZS5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMgPSBhcmdzLnNsaWNlKHBhcmFtU3RhcnQsIHBhcmFtRW5kKS5tYXAodmFsdWUgPT4gdW5kZWZpbmVkVG9OdWxsKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBhcmdzO1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGUubWV0aG9kO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMgPSBjb21wdXRlTWVzc2FnZVBhcmFtcyh0eXBlLCBwYXJhbXMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gdHlwZS5udW1iZXJPZlBhcmFtcztcbiAgICAgICAgICAgICAgICB0b2tlbiA9IGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuLmlzKHBhcmFtc1tudW1iZXJPZlBhcmFtc10pID8gcGFyYW1zW251bWJlck9mUGFyYW1zXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGlkID0gc2VxdWVuY2VOdW1iZXIrKztcbiAgICAgICAgICAgIGxldCBkaXNwb3NhYmxlO1xuICAgICAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgICAgICAgZGlzcG9zYWJsZSA9IHRva2VuLm9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcCA9IGNhbmNlbGxhdGlvblN0cmF0ZWd5LnNlbmRlci5zZW5kQ2FuY2VsbGF0aW9uKGNvbm5lY3Rpb24sIGlkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhgUmVjZWl2ZWQgbm8gcHJvbWlzZSBmcm9tIGNhbmNlbGxhdGlvbiBzdHJhdGVneSB3aGVuIGNhbmNlbGxpbmcgaWQgJHtpZH1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIubG9nKGBTZW5kaW5nIGNhbmNlbGxhdGlvbiBtZXNzYWdlcyBmb3IgaWQgJHtpZH0gZmFpbGVkYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdE1lc3NhZ2UgPSB7XG4gICAgICAgICAgICAgICAganNvbnJwYzogdmVyc2lvbixcbiAgICAgICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBtZXNzYWdlUGFyYW1zXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdHJhY2VTZW5kaW5nUmVxdWVzdChyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNhbmNlbGxhdGlvblN0cmF0ZWd5LnNlbmRlci5lbmFibGVDYW5jZWxsYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25TdHJhdGVneS5zZW5kZXIuZW5hYmxlQ2FuY2VsbGF0aW9uKHJlcXVlc3RNZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZVdpdGhDbGVhbnVwID0gKHIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyKTtcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uU3RyYXRlZ3kuc2VuZGVyLmNsZWFudXAoaWQpO1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlPy5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWplY3RXaXRoQ2xlYW51cCA9IChyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChyKTtcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uU3RyYXRlZ3kuc2VuZGVyLmNsZWFudXAoaWQpO1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlPy5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZVByb21pc2UgPSB7IG1ldGhvZDogbWV0aG9kLCB0aW1lclN0YXJ0OiBEYXRlLm5vdygpLCByZXNvbHZlOiByZXNvbHZlV2l0aENsZWFudXAsIHJlamVjdDogcmVqZWN0V2l0aENsZWFudXAgfTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2VzLnNldChpZCwgcmVzcG9uc2VQcm9taXNlKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbWVzc2FnZVdyaXRlci53cml0ZShyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAvLyBXcml0aW5nIHRoZSBtZXNzYWdlIGZhaWxlZC4gU28gd2UgbmVlZCB0byBkZWxldGUgaXQgZnJvbSB0aGUgcmVzcG9uc2UgcHJvbWlzZXMgYW5kXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlamVjdCBpdC5cbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlcy5kZWxldGUoaWQpO1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2UucmVqZWN0KG5ldyBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IobWVzc2FnZXNfMS5FcnJvckNvZGVzLk1lc3NhZ2VXcml0ZUVycm9yLCBlcnJvci5tZXNzYWdlID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIHJlYXNvbicpKTtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlcXVlc3QgZmFpbGVkLmApO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25SZXF1ZXN0OiAodHlwZSwgaGFuZGxlcikgPT4ge1xuICAgICAgICAgICAgdGhyb3dJZkNsb3NlZE9yRGlzcG9zZWQoKTtcbiAgICAgICAgICAgIGxldCBtZXRob2QgPSBudWxsO1xuICAgICAgICAgICAgaWYgKFN0YXJSZXF1ZXN0SGFuZGxlci5pcyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBzdGFyUmVxdWVzdEhhbmRsZXIgPSB0eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoSXMuc3RyaW5nKHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgbWV0aG9kID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoaGFuZGxlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RIYW5kbGVycy5zZXQodHlwZSwgeyBoYW5kbGVyOiBoYW5kbGVyLCB0eXBlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSB0eXBlLm1ldGhvZDtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEhhbmRsZXJzLnNldCh0eXBlLm1ldGhvZCwgeyB0eXBlLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SGFuZGxlcnMuZGVsZXRlKG1ldGhvZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFyUmVxdWVzdEhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBoYXNQZW5kaW5nUmVzcG9uc2U6ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZVByb21pc2VzLnNpemUgPiAwO1xuICAgICAgICB9LFxuICAgICAgICB0cmFjZTogYXN5bmMgKF92YWx1ZSwgX3RyYWNlciwgc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBsZXQgX3NlbmROb3RpZmljYXRpb24gPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBfdHJhY2VGb3JtYXQgPSBUcmFjZUZvcm1hdC5UZXh0O1xuICAgICAgICAgICAgaWYgKHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKElzLmJvb2xlYW4oc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zKSkge1xuICAgICAgICAgICAgICAgICAgICBfc2VuZE5vdGlmaWNhdGlvbiA9IHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF9zZW5kTm90aWZpY2F0aW9uID0gc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zLnNlbmROb3RpZmljYXRpb24gfHwgZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIF90cmFjZUZvcm1hdCA9IHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucy50cmFjZUZvcm1hdCB8fCBUcmFjZUZvcm1hdC5UZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlID0gX3ZhbHVlO1xuICAgICAgICAgICAgdHJhY2VGb3JtYXQgPSBfdHJhY2VGb3JtYXQ7XG4gICAgICAgICAgICBpZiAodHJhY2UgPT09IFRyYWNlLk9mZikge1xuICAgICAgICAgICAgICAgIHRyYWNlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRyYWNlciA9IF90cmFjZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoX3NlbmROb3RpZmljYXRpb24gJiYgIWlzQ2xvc2VkKCkgJiYgIWlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGNvbm5lY3Rpb24uc2VuZE5vdGlmaWNhdGlvbihTZXRUcmFjZU5vdGlmaWNhdGlvbi50eXBlLCB7IHZhbHVlOiBUcmFjZS50b1N0cmluZyhfdmFsdWUpIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBvbkVycm9yOiBlcnJvckVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIG9uQ2xvc2U6IGNsb3NlRW1pdHRlci5ldmVudCxcbiAgICAgICAgb25VbmhhbmRsZWROb3RpZmljYXRpb246IHVuaGFuZGxlZE5vdGlmaWNhdGlvbkVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIG9uRGlzcG9zZTogZGlzcG9zZUVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIGVuZDogKCkgPT4ge1xuICAgICAgICAgICAgbWVzc2FnZVdyaXRlci5lbmQoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLkRpc3Bvc2VkO1xuICAgICAgICAgICAgZGlzcG9zZUVtaXR0ZXIuZmlyZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5QZW5kaW5nUmVzcG9uc2VSZWplY3RlZCwgJ1BlbmRpbmcgcmVzcG9uc2UgcmVqZWN0ZWQgc2luY2UgY29ubmVjdGlvbiBnb3QgZGlzcG9zZWQnKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvbWlzZSBvZiByZXNwb25zZVByb21pc2VzLnZhbHVlcygpKSB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBrbm93bkNhbmNlbGVkUmVxdWVzdHMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICBtZXNzYWdlUXVldWUgPSBuZXcgbGlua2VkTWFwXzEuTGlua2VkTWFwKCk7XG4gICAgICAgICAgICAvLyBUZXN0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgaWYgKElzLmZ1bmMobWVzc2FnZVdyaXRlci5kaXNwb3NlKSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKElzLmZ1bmMobWVzc2FnZVJlYWRlci5kaXNwb3NlKSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VSZWFkZXIuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBsaXN0ZW46ICgpID0+IHtcbiAgICAgICAgICAgIHRocm93SWZDbG9zZWRPckRpc3Bvc2VkKCk7XG4gICAgICAgICAgICB0aHJvd0lmTGlzdGVuaW5nKCk7XG4gICAgICAgICAgICBzdGF0ZSA9IENvbm5lY3Rpb25TdGF0ZS5MaXN0ZW5pbmc7XG4gICAgICAgICAgICBtZXNzYWdlUmVhZGVyLmxpc3RlbihjYWxsYmFjayk7XG4gICAgICAgIH0sXG4gICAgICAgIGluc3BlY3Q6ICgpID0+IHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS5jb25zb2xlLmxvZygnaW5zcGVjdCcpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25uZWN0aW9uLm9uTm90aWZpY2F0aW9uKExvZ1RyYWNlTm90aWZpY2F0aW9uLnR5cGUsIChwYXJhbXMpID0+IHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZlcmJvc2UgPSB0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdDtcbiAgICAgICAgdHJhY2VyLmxvZyhwYXJhbXMubWVzc2FnZSwgdmVyYm9zZSA/IHBhcmFtcy52ZXJib3NlIDogdW5kZWZpbmVkKTtcbiAgICB9KTtcbiAgICBjb25uZWN0aW9uLm9uTm90aWZpY2F0aW9uKFByb2dyZXNzTm90aWZpY2F0aW9uLnR5cGUsIChwYXJhbXMpID0+IHtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IHByb2dyZXNzSGFuZGxlcnMuZ2V0KHBhcmFtcy50b2tlbik7XG4gICAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICAgICBoYW5kbGVyKHBhcmFtcy52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1bmhhbmRsZWRQcm9ncmVzc0VtaXR0ZXIuZmlyZShwYXJhbXMpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbm5lY3Rpb247XG59XG5leHBvcnRzLmNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uID0gY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb247XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vdHlwaW5ncy90aGVuYWJsZS5kLnRzXCIgLz5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUHJvZ3Jlc3NUeXBlID0gZXhwb3J0cy5Qcm9ncmVzc1Rva2VuID0gZXhwb3J0cy5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiA9IGV4cG9ydHMuTnVsbExvZ2dlciA9IGV4cG9ydHMuQ29ubmVjdGlvbk9wdGlvbnMgPSBleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IGV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlQnVmZmVyID0gZXhwb3J0cy5Xcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyID0gZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLk1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLlJlYWRhYmxlU3RyZWFtTWVzc2FnZVJlYWRlciA9IGV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlUmVhZGVyID0gZXhwb3J0cy5NZXNzYWdlUmVhZGVyID0gZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblRva2VuID0gZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IGV4cG9ydHMuRW1pdHRlciA9IGV4cG9ydHMuRXZlbnQgPSBleHBvcnRzLkRpc3Bvc2FibGUgPSBleHBvcnRzLkxSVUNhY2hlID0gZXhwb3J0cy5Ub3VjaCA9IGV4cG9ydHMuTGlua2VkTWFwID0gZXhwb3J0cy5QYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlOSA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTggPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU3ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNiA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTUgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU0ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMyA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTIgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUxID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMCA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZSA9IGV4cG9ydHMuRXJyb3JDb2RlcyA9IGV4cG9ydHMuUmVzcG9uc2VFcnJvciA9IGV4cG9ydHMuUmVxdWVzdFR5cGU5ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTggPSBleHBvcnRzLlJlcXVlc3RUeXBlNyA9IGV4cG9ydHMuUmVxdWVzdFR5cGU2ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTUgPSBleHBvcnRzLlJlcXVlc3RUeXBlNCA9IGV4cG9ydHMuUmVxdWVzdFR5cGUzID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTIgPSBleHBvcnRzLlJlcXVlc3RUeXBlMSA9IGV4cG9ydHMuUmVxdWVzdFR5cGUwID0gZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IGV4cG9ydHMuTWVzc2FnZSA9IGV4cG9ydHMuUkFMID0gdm9pZCAwO1xuZXhwb3J0cy5NZXNzYWdlU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblN0cmF0ZWd5ID0gZXhwb3J0cy5DYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IGV4cG9ydHMuQ29ubmVjdGlvbkVycm9yID0gZXhwb3J0cy5Db25uZWN0aW9uRXJyb3JzID0gZXhwb3J0cy5Mb2dUcmFjZU5vdGlmaWNhdGlvbiA9IGV4cG9ydHMuU2V0VHJhY2VOb3RpZmljYXRpb24gPSBleHBvcnRzLlRyYWNlRm9ybWF0ID0gZXhwb3J0cy5UcmFjZVZhbHVlcyA9IGV4cG9ydHMuVHJhY2UgPSB2b2lkIDA7XG5jb25zdCBtZXNzYWdlc18xID0gcmVxdWlyZShcIi4vbWVzc2FnZXNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNZXNzYWdlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk1lc3NhZ2U7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlMFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTA7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTFcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGUxOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGUyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlMjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlM1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGU0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGU1XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlNTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlNlwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTY7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTdcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGU3OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGU4XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlODsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlOVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTk7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXNwb25zZUVycm9yXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3I7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJFcnJvckNvZGVzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLkVycm9yQ29kZXM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlMFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlMDsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGUxXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGUxOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZTJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlM1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlMzsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGU0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZTVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlNlwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlNjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGU3XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU3OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZThcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTg7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlOVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlOTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlBhcmFtZXRlclN0cnVjdHVyZXNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlczsgfSB9KTtcbmNvbnN0IGxpbmtlZE1hcF8xID0gcmVxdWlyZShcIi4vbGlua2VkTWFwXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTGlua2VkTWFwXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBsaW5rZWRNYXBfMS5MaW5rZWRNYXA7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJMUlVDYWNoZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbGlua2VkTWFwXzEuTFJVQ2FjaGU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJUb3VjaFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbGlua2VkTWFwXzEuVG91Y2g7IH0gfSk7XG5jb25zdCBkaXNwb3NhYmxlXzEgPSByZXF1aXJlKFwiLi9kaXNwb3NhYmxlXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiRGlzcG9zYWJsZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZGlzcG9zYWJsZV8xLkRpc3Bvc2FibGU7IH0gfSk7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCIuL2V2ZW50c1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkV2ZW50XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBldmVudHNfMS5FdmVudDsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkVtaXR0ZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGV2ZW50c18xLkVtaXR0ZXI7IH0gfSk7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblRva2VuU291cmNlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjYW5jZWxsYXRpb25fMS5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblRva2VuXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjYW5jZWxsYXRpb25fMS5DYW5jZWxsYXRpb25Ub2tlbjsgfSB9KTtcbmNvbnN0IHNoYXJlZEFycmF5Q2FuY2VsbGF0aW9uXzEgPSByZXF1aXJlKFwiLi9zaGFyZWRBcnJheUNhbmNlbGxhdGlvblwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHNoYXJlZEFycmF5Q2FuY2VsbGF0aW9uXzEuU2hhcmVkQXJyYXlTZW5kZXJTdHJhdGVneTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlNoYXJlZEFycmF5UmVjZWl2ZXJTdHJhdGVneVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gc2hhcmVkQXJyYXlDYW5jZWxsYXRpb25fMS5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3k7IH0gfSk7XG5jb25zdCBtZXNzYWdlUmVhZGVyXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlUmVhZGVyXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTWVzc2FnZVJlYWRlclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZVJlYWRlcl8xLk1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VSZWFkZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VSZWFkZXJfMS5BYnN0cmFjdE1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VSZWFkZXJfMS5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5jb25zdCBtZXNzYWdlV3JpdGVyXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlV3JpdGVyXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTWVzc2FnZVdyaXRlclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZVdyaXRlcl8xLk1lc3NhZ2VXcml0ZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VXcml0ZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VXcml0ZXJfMS5BYnN0cmFjdE1lc3NhZ2VXcml0ZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJXcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlV3JpdGVyXzEuV3JpdGVhYmxlU3RyZWFtTWVzc2FnZVdyaXRlcjsgfSB9KTtcbmNvbnN0IG1lc3NhZ2VCdWZmZXJfMSA9IHJlcXVpcmUoXCIuL21lc3NhZ2VCdWZmZXJcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VCdWZmZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VCdWZmZXJfMS5BYnN0cmFjdE1lc3NhZ2VCdWZmZXI7IH0gfSk7XG5jb25zdCBjb25uZWN0aW9uXzEgPSByZXF1aXJlKFwiLi9jb25uZWN0aW9uXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29ubmVjdGlvblN0cmF0ZWd5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ29ubmVjdGlvblN0cmF0ZWd5OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29ubmVjdGlvbk9wdGlvbnNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5Db25uZWN0aW9uT3B0aW9uczsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk51bGxMb2dnZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5OdWxsTG9nZ2VyOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb25cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlByb2dyZXNzVG9rZW5cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5Qcm9ncmVzc1Rva2VuOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUHJvZ3Jlc3NUeXBlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuUHJvZ3Jlc3NUeXBlOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiVHJhY2VcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5UcmFjZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlRyYWNlVmFsdWVzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuVHJhY2VWYWx1ZXM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJUcmFjZUZvcm1hdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29ubmVjdGlvbl8xLlRyYWNlRm9ybWF0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiU2V0VHJhY2VOb3RpZmljYXRpb25cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5TZXRUcmFjZU5vdGlmaWNhdGlvbjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkxvZ1RyYWNlTm90aWZpY2F0aW9uXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuTG9nVHJhY2VOb3RpZmljYXRpb247IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJDb25uZWN0aW9uRXJyb3JzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ29ubmVjdGlvbkVycm9yczsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNvbm5lY3Rpb25FcnJvclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29ubmVjdGlvbl8xLkNvbm5lY3Rpb25FcnJvcjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5DYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5DYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblN0cmF0ZWd5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ2FuY2VsbGF0aW9uU3RyYXRlZ3k7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNZXNzYWdlU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5NZXNzYWdlU3RyYXRlZ3k7IH0gfSk7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbmV4cG9ydHMuUkFMID0gcmFsXzEuZGVmYXVsdDtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGFwaV8xID0gcmVxdWlyZShcIi4uL2NvbW1vbi9hcGlcIik7XG5jbGFzcyBNZXNzYWdlQnVmZmVyIGV4dGVuZHMgYXBpXzEuQWJzdHJhY3RNZXNzYWdlQnVmZmVyIHtcbiAgICBjb25zdHJ1Y3RvcihlbmNvZGluZyA9ICd1dGYtOCcpIHtcbiAgICAgICAgc3VwZXIoZW5jb2RpbmcpO1xuICAgICAgICB0aGlzLmFzY2lpRGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcignYXNjaWknKTtcbiAgICB9XG4gICAgZW1wdHlCdWZmZXIoKSB7XG4gICAgICAgIHJldHVybiBNZXNzYWdlQnVmZmVyLmVtcHR5QnVmZmVyO1xuICAgIH1cbiAgICBmcm9tU3RyaW5nKHZhbHVlLCBfZW5jb2RpbmcpIHtcbiAgICAgICAgcmV0dXJuIChuZXcgVGV4dEVuY29kZXIoKSkuZW5jb2RlKHZhbHVlKTtcbiAgICB9XG4gICAgdG9TdHJpbmcodmFsdWUsIGVuY29kaW5nKSB7XG4gICAgICAgIGlmIChlbmNvZGluZyA9PT0gJ2FzY2lpJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXNjaWlEZWNvZGVyLmRlY29kZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gKG5ldyBUZXh0RGVjb2RlcihlbmNvZGluZykpLmRlY29kZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXNOYXRpdmUoYnVmZmVyLCBsZW5ndGgpIHtcbiAgICAgICAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlci5zbGljZSgwLCBsZW5ndGgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFsbG9jTmF0aXZlKGxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTtcbiAgICB9XG59XG5NZXNzYWdlQnVmZmVyLmVtcHR5QnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMCk7XG5jbGFzcyBSZWFkYWJsZVN0cmVhbVdyYXBwZXIge1xuICAgIGNvbnN0cnVjdG9yKHNvY2tldCkge1xuICAgICAgICB0aGlzLnNvY2tldCA9IHNvY2tldDtcbiAgICAgICAgdGhpcy5fb25EYXRhID0gbmV3IGFwaV8xLkVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5fbWVzc2FnZUxpc3RlbmVyID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBibG9iID0gZXZlbnQuZGF0YTtcbiAgICAgICAgICAgIGJsb2IuYXJyYXlCdWZmZXIoKS50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkRhdGEuZmlyZShuZXcgVWludDhBcnJheShidWZmZXIpKTtcbiAgICAgICAgICAgIH0sICgpID0+IHtcbiAgICAgICAgICAgICAgICAoMCwgYXBpXzEuUkFMKSgpLmNvbnNvbGUuZXJyb3IoYENvbnZlcnRpbmcgYmxvYiB0byBhcnJheSBidWZmZXIgZmFpbGVkLmApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLl9tZXNzYWdlTGlzdGVuZXIpO1xuICAgIH1cbiAgICBvbkNsb3NlKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2Nsb3NlJywgbGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gYXBpXzEuRGlzcG9zYWJsZS5jcmVhdGUoKCkgPT4gdGhpcy5zb2NrZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xvc2UnLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkVycm9yKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgbGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gYXBpXzEuRGlzcG9zYWJsZS5jcmVhdGUoKCkgPT4gdGhpcy5zb2NrZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkVuZChsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKCdlbmQnLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdlbmQnLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkRhdGEobGlzdGVuZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uRGF0YS5ldmVudChsaXN0ZW5lcik7XG4gICAgfVxufVxuY2xhc3MgV3JpdGFibGVTdHJlYW1XcmFwcGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihzb2NrZXQpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7XG4gICAgfVxuICAgIG9uQ2xvc2UobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignY2xvc2UnLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbG9zZScsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIG9uRXJyb3IobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIG9uRW5kKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2VuZCcsIGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIGFwaV8xLkRpc3Bvc2FibGUuY3JlYXRlKCgpID0+IHRoaXMuc29ja2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2VuZCcsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIHdyaXRlKGRhdGEsIGVuY29kaW5nKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkICYmIGVuY29kaW5nICE9PSAndXRmLTgnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbiBhIEJyb3dzZXIgZW52aXJvbm1lbnRzIG9ubHkgdXRmLTggdGV4dCBlbmNvZGluZyBpcyBzdXBwb3J0ZWQuIEJ1dCBnb3QgZW5jb2Rpbmc6ICR7ZW5jb2Rpbmd9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKTtcbiAgICB9XG59XG5jb25zdCBfdGV4dEVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbmNvbnN0IF9yaWwgPSBPYmplY3QuZnJlZXplKHtcbiAgICBtZXNzYWdlQnVmZmVyOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgY3JlYXRlOiAoZW5jb2RpbmcpID0+IG5ldyBNZXNzYWdlQnVmZmVyKGVuY29kaW5nKVxuICAgIH0pLFxuICAgIGFwcGxpY2F0aW9uSnNvbjogT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGVuY29kZXI6IE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgbmFtZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgZW5jb2RlOiAobXNnLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2hhcnNldCAhPT0gJ3V0Zi04Jykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluIGEgQnJvd3NlciBlbnZpcm9ubWVudHMgb25seSB1dGYtOCB0ZXh0IGVuY29kaW5nIGlzIHN1cHBvcnRlZC4gQnV0IGdvdCBlbmNvZGluZzogJHtvcHRpb25zLmNoYXJzZXR9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoX3RleHRFbmNvZGVyLmVuY29kZShKU09OLnN0cmluZ2lmeShtc2csIHVuZGVmaW5lZCwgMCkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIGRlY29kZXI6IE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgbmFtZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgZGVjb2RlOiAoYnVmZmVyLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCEoYnVmZmVyIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbiBhIEJyb3dzZXIgZW52aXJvbm1lbnRzIG9ubHkgVWludDhBcnJheXMgYXJlIHN1cHBvcnRlZC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShKU09OLnBhcnNlKG5ldyBUZXh0RGVjb2RlcihvcHRpb25zLmNoYXJzZXQpLmRlY29kZShidWZmZXIpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfSksXG4gICAgc3RyZWFtOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgYXNSZWFkYWJsZVN0cmVhbTogKHNvY2tldCkgPT4gbmV3IFJlYWRhYmxlU3RyZWFtV3JhcHBlcihzb2NrZXQpLFxuICAgICAgICBhc1dyaXRhYmxlU3RyZWFtOiAoc29ja2V0KSA9PiBuZXcgV3JpdGFibGVTdHJlYW1XcmFwcGVyKHNvY2tldClcbiAgICB9KSxcbiAgICBjb25zb2xlOiBjb25zb2xlLFxuICAgIHRpbWVyOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgc2V0VGltZW91dChjYWxsYmFjaywgbXMsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHNldFRpbWVvdXQoY2FsbGJhY2ssIG1zLCAuLi5hcmdzKTtcbiAgICAgICAgICAgIHJldHVybiB7IGRpc3Bvc2U6ICgpID0+IGNsZWFyVGltZW91dChoYW5kbGUpIH07XG4gICAgICAgIH0sXG4gICAgICAgIHNldEltbWVkaWF0ZShjYWxsYmFjaywgLi4uYXJncykge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gc2V0VGltZW91dChjYWxsYmFjaywgMCwgLi4uYXJncyk7XG4gICAgICAgICAgICByZXR1cm4geyBkaXNwb3NlOiAoKSA9PiBjbGVhclRpbWVvdXQoaGFuZGxlKSB9O1xuICAgICAgICB9LFxuICAgICAgICBzZXRJbnRlcnZhbChjYWxsYmFjaywgbXMsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHNldEludGVydmFsKGNhbGxiYWNrLCBtcywgLi4uYXJncyk7XG4gICAgICAgICAgICByZXR1cm4geyBkaXNwb3NlOiAoKSA9PiBjbGVhckludGVydmFsKGhhbmRsZSkgfTtcbiAgICAgICAgfSxcbiAgICB9KVxufSk7XG5mdW5jdGlvbiBSSUwoKSB7XG4gICAgcmV0dXJuIF9yaWw7XG59XG4oZnVuY3Rpb24gKFJJTCkge1xuICAgIGZ1bmN0aW9uIGluc3RhbGwoKSB7XG4gICAgICAgIGFwaV8xLlJBTC5pbnN0YWxsKF9yaWwpO1xuICAgIH1cbiAgICBSSUwuaW5zdGFsbCA9IGluc3RhbGw7XG59KShSSUwgfHwgKFJJTCA9IHt9KSk7XG5leHBvcnRzLmRlZmF1bHQgPSBSSUw7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24gPSBleHBvcnRzLkJyb3dzZXJNZXNzYWdlV3JpdGVyID0gZXhwb3J0cy5Ccm93c2VyTWVzc2FnZVJlYWRlciA9IHZvaWQgMDtcbmNvbnN0IHJpbF8xID0gcmVxdWlyZShcIi4vcmlsXCIpO1xuLy8gSW5zdGFsbCB0aGUgYnJvd3NlciBydW50aW1lIGFic3RyYWN0LlxucmlsXzEuZGVmYXVsdC5pbnN0YWxsKCk7XG5jb25zdCBhcGlfMSA9IHJlcXVpcmUoXCIuLi9jb21tb24vYXBpXCIpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuLi9jb21tb24vYXBpXCIpLCBleHBvcnRzKTtcbmNsYXNzIEJyb3dzZXJNZXNzYWdlUmVhZGVyIGV4dGVuZHMgYXBpXzEuQWJzdHJhY3RNZXNzYWdlUmVhZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihwb3J0KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX29uRGF0YSA9IG5ldyBhcGlfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuX21lc3NhZ2VMaXN0ZW5lciA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fb25EYXRhLmZpcmUoZXZlbnQuZGF0YSk7XG4gICAgICAgIH07XG4gICAgICAgIHBvcnQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoZXZlbnQpID0+IHRoaXMuZmlyZUVycm9yKGV2ZW50KSk7XG4gICAgICAgIHBvcnQub25tZXNzYWdlID0gdGhpcy5fbWVzc2FnZUxpc3RlbmVyO1xuICAgIH1cbiAgICBsaXN0ZW4oY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uRGF0YS5ldmVudChjYWxsYmFjayk7XG4gICAgfVxufVxuZXhwb3J0cy5Ccm93c2VyTWVzc2FnZVJlYWRlciA9IEJyb3dzZXJNZXNzYWdlUmVhZGVyO1xuY2xhc3MgQnJvd3Nlck1lc3NhZ2VXcml0ZXIgZXh0ZW5kcyBhcGlfMS5BYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKHBvcnQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50ID0gMDtcbiAgICAgICAgcG9ydC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIChldmVudCkgPT4gdGhpcy5maXJlRXJyb3IoZXZlbnQpKTtcbiAgICB9XG4gICAgd3JpdGUobXNnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnBvcnQucG9zdE1lc3NhZ2UobXNnKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IsIG1zZyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZUVycm9yKGVycm9yLCBtc2cpIHtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50Kys7XG4gICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yLCBtc2csIHRoaXMuZXJyb3JDb3VudCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICB9XG59XG5leHBvcnRzLkJyb3dzZXJNZXNzYWdlV3JpdGVyID0gQnJvd3Nlck1lc3NhZ2VXcml0ZXI7XG5mdW5jdGlvbiBjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbihyZWFkZXIsIHdyaXRlciwgbG9nZ2VyLCBvcHRpb25zKSB7XG4gICAgaWYgKGxvZ2dlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxvZ2dlciA9IGFwaV8xLk51bGxMb2dnZXI7XG4gICAgfVxuICAgIGlmIChhcGlfMS5Db25uZWN0aW9uU3RyYXRlZ3kuaXMob3B0aW9ucykpIHtcbiAgICAgICAgb3B0aW9ucyA9IHsgY29ubmVjdGlvblN0cmF0ZWd5OiBvcHRpb25zIH07XG4gICAgfVxuICAgIHJldHVybiAoMCwgYXBpXzEuY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24pKHJlYWRlciwgd3JpdGVyLCBsb2dnZXIsIG9wdGlvbnMpO1xufVxuZXhwb3J0cy5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiA9IGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uO1xuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL2Jyb3dzZXIvbWFpbicpOyIsICIvKlxuICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMjYgRWNsaXBzZSBEaXJpZ2libGUgY29udHJpYnV0b3JzXG4gKlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlXG4gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2Mi4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG4gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MjAuaHRtbFxuICpcbiAqIFNQRFgtRmlsZUNvcHlyaWdodFRleHQ6IEVjbGlwc2UgRGlyaWdpYmxlIGNvbnRyaWJ1dG9ycyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbi8qKlxuICogSmF2YSBMU1AgY2xpZW50IGJ1bmRsZS5cbiAqXG4gKiBVc2VzIHZzY29kZS13cy1qc29ucnBjIGZvciB0eXBlZCBKU09OLVJQQyBvdmVyIFdlYlNvY2tldCBhbmQgcmVnaXN0ZXJzIE1vbmFjb1xuICogcHJvdmlkZXJzIHRoYXQgZGVsZWdhdGUgdG8gSkRULkxTLiBFeHBvc2VkIGFzIGdsb2JhbCBKYXZhTHNwQ2xpZW50TGliIHNvIHRoYXRcbiAqIGVkaXRvci5qcyBjYW4gY2FsbCBKYXZhTHNwQ2xpZW50TGliLmNvbm5lY3QocmVzb3VyY2VQYXRoKS5cbiAqXG4gKiBPbmUgSkRULkxTIHByb2Nlc3MgY292ZXJzIHRoZSBlbnRpcmUgd29ya3NwYWNlLCBzbyBhIHNpbmdsZSBXZWJTb2NrZXQgY29ubmVjdGlvblxuICogaXMgc2hhcmVkIGFjcm9zcyBhbGwgSmF2YSBmaWxlcyBvcGVuIGluIHRoZSBzYW1lIGJyb3dzZXIgcGFnZS4gVGhlIGNvbm5lY3Rpb24gaXNcbiAqIGVzdGFibGlzaGVkIG9uIHRoZSBmaXJzdCBjb25uZWN0KCkgY2FsbCBhbmQgcmV1c2VkIGZvciBhbGwgc3Vic2VxdWVudCBjYWxscy5cbiAqXG4gKiBlZGl0b3IuanMgc2V0cyB3aW5kb3cubW9uYWNvIGJlZm9yZSBjYWxsaW5nIGNvbm5lY3QoKSwgc28gdGhlIG1vbmFjby1zaGltJ3MgbGF6eVxuICogUHJveGllcyByZXNvbHZlIGNvcnJlY3RseSBhdCBjYWxsIHRpbWUuXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24sIE1lc3NhZ2VDb25uZWN0aW9uIH0gZnJvbSAndnNjb2RlLWpzb25ycGMvYnJvd3Nlcic7XG5pbXBvcnQgeyB0b1NvY2tldCwgV2ViU29ja2V0TWVzc2FnZVJlYWRlciwgV2ViU29ja2V0TWVzc2FnZVdyaXRlciB9IGZyb20gJ3ZzY29kZS13cy1qc29ucnBjJztcbmltcG9ydCAqIGFzIG1vbmFjbyBmcm9tICdtb25hY28tZWRpdG9yJztcbmltcG9ydCB7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLFxuICAgIERpYWdub3N0aWNTZXZlcml0eSxcbiAgICBJbnNlcnRUZXh0Rm9ybWF0LFxuICAgIE1hcmt1cENvbnRlbnQsXG4gICAgTWFya3VwS2luZCxcbiAgICB0eXBlIENvZGVBY3Rpb24sXG4gICAgdHlwZSBDb21tYW5kLFxuICAgIHR5cGUgQ29tcGxldGlvbkl0ZW0sXG4gICAgdHlwZSBDb21wbGV0aW9uTGlzdCxcbiAgICB0eXBlIERpYWdub3N0aWMsXG4gICAgdHlwZSBIb3ZlcixcbiAgICB0eXBlIExvY2F0aW9uLFxuICAgIHR5cGUgUGFyYW1ldGVySW5mb3JtYXRpb24sXG4gICAgdHlwZSBTaWduYXR1cmVIZWxwLFxuICAgIHR5cGUgU2lnbmF0dXJlSW5mb3JtYXRpb24sXG4gICAgdHlwZSBUZXh0RWRpdCxcbiAgICB0eXBlIFdvcmtzcGFjZUVkaXQsXG59IGZyb20gJ3ZzY29kZS1sYW5ndWFnZXNlcnZlci10eXBlcyc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNpbmdsZXRvbiBzdGF0ZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogU2hhcmVkIGNvbm5lY3Rpb24gXHUyMDE0IG9uZSBwZXIgYnJvd3NlciBwYWdlLCBjb3ZlcmluZyBhbGwgcHJvamVjdHMgaW4gdGhlIHdvcmtzcGFjZS4gKi9cbmxldCBfY29ubjogTWVzc2FnZUNvbm5lY3Rpb24gfCBudWxsID0gbnVsbDtcblxuLyoqXG4gKiBWaXJ0dWFsIHdvcmtzcGFjZSByb290IFVSSSwgZS5nLiB7QGNvZGUgZmlsZTovLy93b3Jrc3BhY2Uvd29ya3NwYWNlL30uXG4gKiBTZXQgb25jZSBvbiBmaXJzdCBjb25uZWN0KCk7IHVzZWQgdG8gc2NvcGUgTW9uYWNvIHByb3ZpZGVycyB0byB3b3Jrc3BhY2UgZmlsZXMuXG4gKi9cbmxldCBfd29ya3NwYWNlUm9vdCA9ICcnO1xuXG4vKiogVVJJcyBmb3Igd2hpY2ggdGV4dERvY3VtZW50L2RpZE9wZW4gaGFzIGFscmVhZHkgYmVlbiBzZW50LiAqL1xuY29uc3QgX29wZW5GaWxlczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cbmxldCBfcHJvdmlkZXJzUmVnaXN0ZXJlZCA9IGZhbHNlO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBQdWJsaWMgQVBJXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBDYWxsZWQgYnkgZWRpdG9yLmpzIHdoZW4gYSBKYXZhIGZpbGUgaXMgb3BlbmVkLiBTYWZlIHRvIGNhbGwgbXVsdGlwbGUgdGltZXMuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29ubmVjdChyZXNvdXJjZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcnRzID0gcmVzb3VyY2VQYXRoLnJlcGxhY2UoL15cXC8vLCAnJykuc3BsaXQoJy8nKTtcbiAgICBjb25zdCB3b3Jrc3BhY2UgPSBwYXJ0c1swXTtcbiAgICBjb25zdCBwcm9qZWN0ICAgPSBwYXJ0c1sxXTtcbiAgICBjb25zdCBmaWxlVXJpID0gYGZpbGU6Ly8vd29ya3NwYWNlLyR7d29ya3NwYWNlfS8ke3Byb2plY3R9LyR7cGFydHMuc2xpY2UoMikuam9pbignLycpfWA7XG5cbiAgICBpZiAoX2Nvbm4pIHtcbiAgICAgICAgLy8gQ29ubmVjdGlvbiBhbHJlYWR5IGVzdGFibGlzaGVkIFx1MjAxNCBqdXN0IG9wZW4gdGhlIG5ldyBmaWxlLlxuICAgICAgICBvcGVuRmlsZShmaWxlVXJpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIF93b3Jrc3BhY2VSb290ID0gYGZpbGU6Ly8vd29ya3NwYWNlLyR7d29ya3NwYWNlfS9gO1xuXG4gICAgY29uc3QgcHJvdG8gPSBsb2NhdGlvbi5wcm90b2NvbCA9PT0gJ2h0dHBzOicgPyAnd3NzJyA6ICd3cyc7XG4gICAgY29uc3Qgd3NVcmwgPSBgJHtwcm90b306Ly8ke2xvY2F0aW9uLmhvc3R9L3dlYnNvY2tldHMvaWRlL2phdmEtbHNwYFxuICAgICAgICAgICAgICAgICsgYD93b3Jrc3BhY2U9JHtlbmNvZGVVUklDb21wb25lbnQod29ya3NwYWNlKX1gO1xuXG4gICAgY29uc3Qgd3MgPSBuZXcgV2ViU29ja2V0KHdzVXJsKTtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHdzLm9ub3BlbiAgPSAoKSA9PiByZXNvbHZlKCk7XG4gICAgICAgIHdzLm9uZXJyb3IgPSAoKSA9PiByZWplY3QobmV3IEVycm9yKGBbamF2YS1sc3BdIFdlYlNvY2tldCBjb25uZWN0IGZhaWxlZDogJHt3c1VybH1gKSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBzb2NrZXQgPSB0b1NvY2tldCh3cyk7XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IFdlYlNvY2tldE1lc3NhZ2VSZWFkZXIoc29ja2V0KTtcbiAgICBjb25zdCB3cml0ZXIgPSBuZXcgV2ViU29ja2V0TWVzc2FnZVdyaXRlcihzb2NrZXQpO1xuICAgIF9jb25uID0gY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24ocmVhZGVyLCB3cml0ZXIpO1xuXG4gICAgLy8gRGlhZ25vc3RpY3Mgbm90aWZpY2F0aW9uIFx1MjE5MiBNb25hY28gbWFya2VycyAoYXBwbGllcyB0byBhbnkgd29ya3NwYWNlIGZpbGUpXG4gICAgX2Nvbm4ub25Ob3RpZmljYXRpb24oJ3RleHREb2N1bWVudC9wdWJsaXNoRGlhZ25vc3RpY3MnLCAocGFyYW1zOiB7IHVyaTogc3RyaW5nOyBkaWFnbm9zdGljczogRGlhZ25vc3RpY1tdIH0pID0+IHtcbiAgICAgICAgY29uc3QgbW9kZWwgPSBtb25hY28uZWRpdG9yLmdldE1vZGVscygpLmZpbmQobSA9PiBtLnVyaS50b1N0cmluZygpID09PSBwYXJhbXMudXJpKTtcbiAgICAgICAgaWYgKCFtb2RlbCkgcmV0dXJuO1xuICAgICAgICBtb25hY28uZWRpdG9yLnNldE1vZGVsTWFya2Vycyhtb2RlbCwgJ2phdmEtbHNwJywgcGFyYW1zLmRpYWdub3N0aWNzLm1hcChkID0+ICh7XG4gICAgICAgICAgICBzZXZlcml0eTogICAgICAgIGxzcFNldmVyaXR5KGQuc2V2ZXJpdHkpLFxuICAgICAgICAgICAgbWVzc2FnZTogICAgICAgICBkLm1lc3NhZ2UsXG4gICAgICAgICAgICBzb3VyY2U6ICAgICAgICAgIGQuc291cmNlID8/ICdqYXZhJyxcbiAgICAgICAgICAgIHN0YXJ0TGluZU51bWJlcjogZC5yYW5nZS5zdGFydC5saW5lICsgMSxcbiAgICAgICAgICAgIHN0YXJ0Q29sdW1uOiAgICAgZC5yYW5nZS5zdGFydC5jaGFyYWN0ZXIgKyAxLFxuICAgICAgICAgICAgZW5kTGluZU51bWJlcjogICBkLnJhbmdlLmVuZC5saW5lICsgMSxcbiAgICAgICAgICAgIGVuZENvbHVtbjogICAgICAgZC5yYW5nZS5lbmQuY2hhcmFjdGVyICsgMSxcbiAgICAgICAgfSkpKTtcbiAgICB9KTtcblxuICAgIC8vIFNlcnZlciAtPiBjbGllbnQgcmVxdWVzdHMgdGhhdCBkcml2ZSByZWZhY3RvciAvIGdlbmVyYXRlIHJlc3VsdHMgYW5kIGR5bmFtaWMgcmVnaXN0cmF0aW9uLlxuICAgIF9jb25uLm9uUmVxdWVzdCgnd29ya3NwYWNlL2FwcGx5RWRpdCcsIChwYXJhbXM6IHsgZWRpdDogV29ya3NwYWNlRWRpdCB9KSA9PiB7XG4gICAgICAgIGFwcGx5V29ya3NwYWNlRWRpdChwYXJhbXMuZWRpdCk7XG4gICAgICAgIHJldHVybiB7IGFwcGxpZWQ6IHRydWUgfTtcbiAgICB9KTtcbiAgICBfY29ubi5vblJlcXVlc3QoJ3dvcmtzcGFjZS9jb25maWd1cmF0aW9uJywgKHBhcmFtczogeyBpdGVtczogQXJyYXk8eyBzZWN0aW9uPzogc3RyaW5nIH0+IH0pID0+XG4gICAgICAgIChwYXJhbXMuaXRlbXMgPz8gW10pLm1hcCgoKSA9PiBqZHRsc1NldHRpbmdzKCkuamF2YSkpO1xuICAgIF9jb25uLm9uUmVxdWVzdCgnY2xpZW50L3JlZ2lzdGVyQ2FwYWJpbGl0eScsICgpID0+IG51bGwpO1xuICAgIF9jb25uLm9uUmVxdWVzdCgnY2xpZW50L3VucmVnaXN0ZXJDYXBhYmlsaXR5JywgKCkgPT4gbnVsbCk7XG4gICAgX2Nvbm4ub25SZXF1ZXN0KCd3aW5kb3cvc2hvd01lc3NhZ2VSZXF1ZXN0JywgKCkgPT4gbnVsbCk7XG4gICAgX2Nvbm4ub25SZXF1ZXN0KCd3aW5kb3cvd29ya0RvbmVQcm9ncmVzcy9jcmVhdGUnLCAoKSA9PiBudWxsKTtcbiAgICBfY29ubi5vbk5vdGlmaWNhdGlvbignd2luZG93L2xvZ01lc3NhZ2UnLCAocDogeyBtZXNzYWdlOiBzdHJpbmcgfSkgPT4gY29uc29sZS5kZWJ1ZygnW2phdmEtbHNwXScsIHA/Lm1lc3NhZ2UpKTtcbiAgICBfY29ubi5vbk5vdGlmaWNhdGlvbignd2luZG93L3Nob3dNZXNzYWdlJywgKHA6IHsgbWVzc2FnZTogc3RyaW5nIH0pID0+IGNvbnNvbGUuaW5mbygnW2phdmEtbHNwXScsIHA/Lm1lc3NhZ2UpKTtcbiAgICAvLyBKRFQuTFMgbGFuZ3VhZ2Utc3RhdHVzIC8gcHJvZ3Jlc3Mgbm90aWZpY2F0aW9ucyBcdTIwMTQgYWNrbm93bGVkZ2VkIHNpbGVudGx5LlxuICAgIF9jb25uLm9uTm90aWZpY2F0aW9uKCdsYW5ndWFnZS9zdGF0dXMnLCAoKSA9PiB7IC8qIGluZGV4aW5nL3JlYWR5IHN0YXR1cywgaWdub3JlZCAqLyB9KTtcbiAgICBfY29ubi5vbk5vdGlmaWNhdGlvbignbGFuZ3VhZ2UvcHJvZ3Jlc3NSZXBvcnQnLCAoKSA9PiB7IC8qIGJ1aWxkIHByb2dyZXNzLCBpZ25vcmVkICovIH0pO1xuXG4gICAgX2Nvbm4ubGlzdGVuKCk7XG5cbiAgICBjb25zdCByb290VXJpID0gX3dvcmtzcGFjZVJvb3Q7XG4gICAgYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ2luaXRpYWxpemUnLCB7XG4gICAgICAgIHByb2Nlc3NJZDogbnVsbCxcbiAgICAgICAgcm9vdFVyaSxcbiAgICAgICAgaW5pdGlhbGl6YXRpb25PcHRpb25zOiB7XG4gICAgICAgICAgICBzZXR0aW5nczogamR0bHNTZXR0aW5ncygpLFxuICAgICAgICAgICAgZXh0ZW5kZWRDbGllbnRDYXBhYmlsaXRpZXM6IHtcbiAgICAgICAgICAgICAgICBwcm9ncmVzc1JlcG9ydFByb3ZpZGVyOiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAgIGNsYXNzRmlsZUNvbnRlbnRzU3VwcG9ydDogICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICByZXNvbHZlQWRkaXRpb25hbFRleHRFZGl0c1N1cHBvcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgYWR2YW5jZWRHZW5lcmF0ZUFjY2Vzc29yc1N1cHBvcnQ6ICB0cnVlLFxuICAgICAgICAgICAgICAgIGdlbmVyYXRlVG9TdHJpbmdQcm9tcHRTdXBwb3J0OiAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICBnZW5lcmF0ZUNvbnN0cnVjdG9yc1Byb21wdFN1cHBvcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgZ2VuZXJhdGVEZWxlZ2F0ZU1ldGhvZHNQcm9tcHRTdXBwb3J0OiB0cnVlLFxuICAgICAgICAgICAgICAgIGhhc2hDb2RlRXF1YWxzUHJvbXB0U3VwcG9ydDogICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICBhZHZhbmNlZE9yZ2FuaXplSW1wb3J0c1N1cHBvcnQ6ICAgIHRydWUsXG4gICAgICAgICAgICAgICAgaW5mZXJTZWxlY3Rpb25TdXBwb3J0OiAgICAgICAgICAgICBbJ2V4dHJhY3RNZXRob2QnLCAnZXh0cmFjdFZhcmlhYmxlJywgJ2V4dHJhY3RGaWVsZCddLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgd29ya3NwYWNlRm9sZGVyczogW3sgdXJpOiByb290VXJpLCBuYW1lOiB3b3Jrc3BhY2UgfV0sXG4gICAgICAgIGNhcGFiaWxpdGllczoge1xuICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7XG4gICAgICAgICAgICAgICAgc3luY2hyb25pemF0aW9uOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUsIHdpbGxTYXZlOiBmYWxzZSwgZGlkU2F2ZTogdHJ1ZSwgd2lsbFNhdmVXYWl0VW50aWw6IGZhbHNlIH0sXG4gICAgICAgICAgICAgICAgY29tcGxldGlvbjoge1xuICAgICAgICAgICAgICAgICAgICBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uSXRlbToge1xuICAgICAgICAgICAgICAgICAgICAgICAgc25pcHBldFN1cHBvcnQ6ICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRhdGlvbkZvcm1hdDogICBbJ21hcmtkb3duJywgJ3BsYWludGV4dCddLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRlZFN1cHBvcnQ6ICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWl0Q2hhcmFjdGVyc1N1cHBvcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlU3VwcG9ydDogICAgICAgIHsgcHJvcGVydGllczogWydkb2N1bWVudGF0aW9uJywgJ2RldGFpbCcsICdhZGRpdGlvbmFsVGV4dEVkaXRzJ10gfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dFN1cHBvcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBob3ZlcjogICAgICAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLCBjb250ZW50Rm9ybWF0OiBbJ21hcmtkb3duJywgJ3BsYWludGV4dCddIH0sXG4gICAgICAgICAgICAgICAgc2lnbmF0dXJlSGVscDogIHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSwgc2lnbmF0dXJlSW5mb3JtYXRpb246IHsgZG9jdW1lbnRhdGlvbkZvcm1hdDogWydtYXJrZG93bicsICdwbGFpbnRleHQnXSwgcGFyYW1ldGVySW5mb3JtYXRpb246IHsgbGFiZWxPZmZzZXRTdXBwb3J0OiB0cnVlIH0gfSB9LFxuICAgICAgICAgICAgICAgIGRlZmluaXRpb246ICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VzOiAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgZG9jdW1lbnRTeW1ib2w6IHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIGZvcm1hdHRpbmc6ICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICByYW5nZUZvcm1hdHRpbmc6IHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIHJlbmFtZTogICAgICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUsIHByZXBhcmVTdXBwb3J0OiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgY29kZUFjdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjb2RlQWN0aW9uTGl0ZXJhbFN1cHBvcnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVBY3Rpb25LaW5kOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTZXQ6IFsncXVpY2tmaXgnLCAncmVmYWN0b3InLCAncmVmYWN0b3IuZXh0cmFjdCcsICdyZWZhY3Rvci5pbmxpbmUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVmYWN0b3IucmV3cml0ZScsICdzb3VyY2UnLCAnc291cmNlLm9yZ2FuaXplSW1wb3J0cyddLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgaXNQcmVmZXJyZWRTdXBwb3J0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBkYXRhU3VwcG9ydDogICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmVTdXBwb3J0OiAgICAgeyBwcm9wZXJ0aWVzOiBbJ2VkaXQnXSB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcHVibGlzaERpYWdub3N0aWNzOiB7IHJlbGF0ZWRJbmZvcm1hdGlvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdvcmtzcGFjZToge1xuICAgICAgICAgICAgICAgIGFwcGx5RWRpdDogICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbjogICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICBleGVjdXRlQ29tbWFuZDogICAgICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICBkaWRDaGFuZ2VDb25maWd1cmF0aW9uOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICB3b3Jrc3BhY2VFZGl0OiAgICAgICAgICB7IGRvY3VtZW50Q2hhbmdlczogdHJ1ZSwgcmVzb3VyY2VPcGVyYXRpb25zOiBbJ2NyZWF0ZScsICdyZW5hbWUnLCAnZGVsZXRlJ10gfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBfY29ubi5zZW5kTm90aWZpY2F0aW9uKCdpbml0aWFsaXplZCcsIHt9KTtcbiAgICBfY29ubi5zZW5kTm90aWZpY2F0aW9uKCd3b3Jrc3BhY2UvZGlkQ2hhbmdlQ29uZmlndXJhdGlvbicsIHsgc2V0dGluZ3M6IGpkdGxzU2V0dGluZ3MoKSB9KTtcblxuICAgIG9wZW5GaWxlKGZpbGVVcmkpO1xuXG4gICAgaWYgKCFfcHJvdmlkZXJzUmVnaXN0ZXJlZCkge1xuICAgICAgICBfcHJvdmlkZXJzUmVnaXN0ZXJlZCA9IHRydWU7XG4gICAgICAgIHJlZ2lzdGVyUHJvdmlkZXJzKCk7XG4gICAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBGaWxlIGxpZmVjeWNsZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFNlbmRzIHRleHREb2N1bWVudC9kaWRPcGVuIGZvciB0aGUgZ2l2ZW4gVVJJIChpZiBub3QgYWxyZWFkeSBzZW50KSBhbmQgcmVnaXN0ZXJzIGEgZGVib3VuY2VkXG4gKiB0ZXh0RG9jdW1lbnQvZGlkQ2hhbmdlIGxpc3RlbmVyIG9uIHRoZSBjb3JyZXNwb25kaW5nIE1vbmFjbyBtb2RlbC5cbiAqL1xuZnVuY3Rpb24gb3BlbkZpbGUoZmlsZVVyaTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKF9vcGVuRmlsZXMuaGFzKGZpbGVVcmkpIHx8ICFfY29ubikgcmV0dXJuO1xuICAgIF9vcGVuRmlsZXMuYWRkKGZpbGVVcmkpO1xuXG4gICAgY29uc3QgbW9kZWwgPSBtb25hY28uZWRpdG9yLmdldE1vZGVscygpLmZpbmQobSA9PiBtLnVyaS50b1N0cmluZygpID09PSBmaWxlVXJpKTtcbiAgICBfY29ubi5zZW5kTm90aWZpY2F0aW9uKCd0ZXh0RG9jdW1lbnQvZGlkT3BlbicsIHtcbiAgICAgICAgdGV4dERvY3VtZW50OiB7XG4gICAgICAgICAgICB1cmk6ICAgICAgICBmaWxlVXJpLFxuICAgICAgICAgICAgbGFuZ3VhZ2VJZDogJ2phdmEnLFxuICAgICAgICAgICAgdmVyc2lvbjogICAgMSxcbiAgICAgICAgICAgIHRleHQ6ICAgICAgIG1vZGVsPy5nZXRWYWx1ZSgpID8/ICcnLFxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgaWYgKG1vZGVsKSB7XG4gICAgICAgIGxldCB0aW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG4gICAgICAgIG1vZGVsLm9uRGlkQ2hhbmdlQ29udGVudCgoKSA9PiB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBfY29ubj8uc2VuZE5vdGlmaWNhdGlvbigndGV4dERvY3VtZW50L2RpZENoYW5nZScsIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiAgIHsgdXJpOiBmaWxlVXJpLCB2ZXJzaW9uOiBtb2RlbC5nZXRWZXJzaW9uSWQoKSB9LFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50Q2hhbmdlczogW3sgdGV4dDogbW9kZWwuZ2V0VmFsdWUoKSB9XSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sIDQwMCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gV29ya3NwYWNlIGZpbGUgcHJlZGljYXRlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogUmV0dXJucyB7QGNvZGUgdHJ1ZX0gd2hlbiB0aGUgZ2l2ZW4gbW9kZWwgVVJJIGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnRseSBjb25uZWN0ZWQgd29ya3NwYWNlLiBVc2VkXG4gKiBieSBNb25hY28gcHJvdmlkZXJzIHRvIHNraXAgbm9uLUphdmEtd29ya3NwYWNlIG1vZGVscyB3aXRob3V0IGFuIGV4YWN0LVVSSSBjb21wYXJpc29uLlxuICovXG5mdW5jdGlvbiBpc1dvcmtzcGFjZUZpbGUodXJpOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gX3dvcmtzcGFjZVJvb3QgIT09ICcnICYmIHVyaS5zdGFydHNXaXRoKF93b3Jrc3BhY2VSb290KTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gTW9uYWNvIHByb3ZpZGVyIHJlZ2lzdHJhdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiByZWdpc3RlclByb3ZpZGVycygpOiB2b2lkIHtcblxuICAgIG1vbmFjby5lZGl0b3IucmVnaXN0ZXJDb21tYW5kKEFQUExZX0FDVElPTl9DT01NQU5ELCAoX2FjY2Vzc29yOiB1bmtub3duLCBhY3Rpb246IENvZGVBY3Rpb24gfCBDb21tYW5kKSA9PiB7XG4gICAgICAgIGFwcGx5Q29kZUFjdGlvbihhY3Rpb24pO1xuICAgIH0pO1xuXG4gICAgLy8gQ3Jvc3MtZmlsZSBuYXZpZ2F0aW9uOiB0aGlzIHNpbmdsZS1maWxlIGVkaXRvciBoYXMgbm8gbW9kZWwgZm9yIG90aGVyIHdvcmtzcGFjZSBmaWxlcywgc28gR28gdG9cbiAgICAvLyBEZWZpbml0aW9uIC8gRmluZCBSZWZlcmVuY2VzIHRvIGFub3RoZXIgZmlsZSB3b3VsZCBzaWxlbnRseSBkbyBub3RoaW5nLiBIYW5kIHRob3NlIG9mZiB0byB0aGUgSURFXG4gICAgLy8gdG8gb3BlbiB0aGUgdGFyZ2V0IGZpbGUgKGFuZCByZXZlYWwgdGhlIGxpbmUpLiBTYW1lLWZpbGUgdGFyZ2V0cyBmYWxsIHRocm91Z2ggdG8gTW9uYWNvLlxuICAgIG1vbmFjby5lZGl0b3IucmVnaXN0ZXJFZGl0b3JPcGVuZXIoe1xuICAgICAgICBvcGVuQ29kZUVkaXRvcjogKHNvdXJjZSwgcmVzb3VyY2UsIHNlbGVjdGlvbk9yUG9zaXRpb24pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHVyaSA9IHJlc291cmNlLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBpZiAoIWlzV29ya3NwYWNlRmlsZSh1cmkpIHx8ICF1cmkuc3RhcnRzV2l0aChWSVJUVUFMX0ZJTEVfUFJFRklYKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudE1vZGVsID0gc291cmNlLmdldE1vZGVsKCk7XG4gICAgICAgICAgICBpZiAoY3VycmVudE1vZGVsICYmIGN1cnJlbnRNb2RlbC51cmkudG9TdHJpbmcoKSA9PT0gdXJpKSByZXR1cm4gZmFsc2U7IC8vIHNhbWUgZmlsZSBcdTIwMTQgbGV0IE1vbmFjbyBqdW1wXG4gICAgICAgICAgICBjb25zdCBvcGVuZXIgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLmphdmFMc3BPcGVuRmlsZTtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3BlbmVyICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBwb3MgPSBzZWxlY3Rpb25PclBvc2l0aW9uIGFzIHsgc3RhcnRMaW5lTnVtYmVyPzogbnVtYmVyOyBsaW5lTnVtYmVyPzogbnVtYmVyOyBzdGFydENvbHVtbj86IG51bWJlcjsgY29sdW1uPzogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBsaW5lID0gcG9zID8gKHBvcy5zdGFydExpbmVOdW1iZXIgPz8gcG9zLmxpbmVOdW1iZXIpIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgY29sdW1uID0gcG9zID8gKHBvcy5zdGFydENvbHVtbiA/PyBwb3MuY29sdW1uKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIG9wZW5lcih1cmkuc3Vic3RyaW5nKFZJUlRVQUxfRklMRV9QUkVGSVgubGVuZ3RoKSwgbGluZSwgY29sdW1uKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckNvbXBsZXRpb25JdGVtUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHRyaWdnZXJDaGFyYWN0ZXJzOiBbJy4nLCAnQCcsICc8J10sXG4gICAgICAgIHByb3ZpZGVDb21wbGV0aW9uSXRlbXM6IGFzeW5jIChtb2RlbCwgcG9zaXRpb24sIGNvbnRleHQpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgZmlsZVVyaSA9IG1vZGVsLnVyaS50b1N0cmluZygpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBDb21wbGV0aW9uTGlzdCB8IENvbXBsZXRpb25JdGVtW10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9jb21wbGV0aW9uJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IGZpbGVVcmkgfSxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogICAgIHsgbGluZTogcG9zaXRpb24ubGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogcG9zaXRpb24uY29sdW1uIC0gMSB9LFxuICAgICAgICAgICAgICAgIC8vIE1vbmFjbyB0cmlnZ2VyIGtpbmRzIGFyZSAwLWJhc2VkIChJbnZva2UvVHJpZ2dlckNoYXJhY3Rlci9Gb3JJbmNvbXBsZXRlKTsgTFNQIGlzIDEtYmFzZWQuXG4gICAgICAgICAgICAgICAgY29udGV4dDogICAgICB7IHRyaWdnZXJLaW5kOiAoY29udGV4dC50cmlnZ2VyS2luZCA/PyAwKSArIDEsIHRyaWdnZXJDaGFyYWN0ZXI6IGNvbnRleHQudHJpZ2dlckNoYXJhY3RlciB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBpdGVtcyA9IEFycmF5LmlzQXJyYXkocmVzdWx0KSA/IHJlc3VsdCA6IChyZXN1bHQ/Lml0ZW1zID8/IFtdKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3VnZ2VzdGlvbnM6IGl0ZW1zLm1hcChpdGVtID0+IGxzcENvbXBsZXRpb25Ub01vbmFjbyhpdGVtLCBtb2RlbCwgcG9zaXRpb24pKSxcbiAgICAgICAgICAgICAgICAvLyBKRFQuTFMgcmV0dXJucyBhIHRydW5jYXRlZCBsaXN0IG9uIHRoZSBmaXJzdCBrZXlzdHJva2VzOyBwcm9wYWdhdGluZyBcImluY29tcGxldGVcIiBtYWtlc1xuICAgICAgICAgICAgICAgIC8vIE1vbmFjbyByZS1xdWVyeSBhcyB0aGUgdXNlciB0eXBlcyBpbnN0ZWFkIG9mIGNhY2hpbmcgdGhlIGZpcnN0IChvZnRlbiBlbXB0eSkgcmVzdWx0LlxuICAgICAgICAgICAgICAgIGluY29tcGxldGU6ICBBcnJheS5pc0FycmF5KHJlc3VsdCkgPyBmYWxzZSA6ICEhcmVzdWx0Py5pc0luY29tcGxldGUsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvLyBSZXNvbHZlIGRvY3VtZW50YXRpb24gYW5kLCBjcnVjaWFsbHksIHRoZSBhdXRvLWltcG9ydCBhZGRpdGlvbmFsVGV4dEVkaXRzIHdoaWNoIEpEVC5MUyBvbmx5XG4gICAgICAgIC8vIGF0dGFjaGVzIG9uIHJlc29sdmUgXHUyMDE0IHNlbGVjdGluZyBhIHR5cGUgdGhlbiBpbnNlcnRzIGl0cyBpbXBvcnQgc3RhdGVtZW50LlxuICAgICAgICByZXNvbHZlQ29tcGxldGlvbkl0ZW06IGFzeW5jIChpdGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsc3AgPSAoaXRlbSBhcyBNb25hY29Db21wbGV0aW9uSXRlbSkuX2xzcDtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWxzcCkgcmV0dXJuIGl0ZW07XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkOiBDb21wbGV0aW9uSXRlbSA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCdjb21wbGV0aW9uSXRlbS9yZXNvbHZlJywgbHNwKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQuZG9jdW1lbnRhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBpdGVtLmRvY3VtZW50YXRpb24gPSB7IHZhbHVlOiBtYXJrdXBUb1N0cmluZyhyZXNvbHZlZC5kb2N1bWVudGF0aW9uKSwgaXNUcnVzdGVkOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQuZGV0YWlsKSBpdGVtLmRldGFpbCA9IHJlc29sdmVkLmRldGFpbDtcbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQuYWRkaXRpb25hbFRleHRFZGl0cz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uYWRkaXRpb25hbFRleHRFZGl0cyA9IHJlc29sdmVkLmFkZGl0aW9uYWxUZXh0RWRpdHMubWFwKHRleHRFZGl0VG9Nb25hY28pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKCdbamF2YS1sc3BdIGNvbXBsZXRpb24gcmVzb2x2ZSBmYWlsZWQ6JywgKGUgYXMgRXJyb3IpPy5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckhvdmVyUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVIb3ZlcjogYXN5bmMgKG1vZGVsLCBwb3NpdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBmaWxlVXJpID0gbW9kZWwudXJpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IEhvdmVyIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvaG92ZXInLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogZmlsZVVyaSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0Py5jb250ZW50cykgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50cyA9IEFycmF5LmlzQXJyYXkocmVzdWx0LmNvbnRlbnRzKSA/IHJlc3VsdC5jb250ZW50cyA6IFtyZXN1bHQuY29udGVudHNdO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjb250ZW50czogY29udGVudHMubWFwKGMgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHR5cGVvZiBjID09PSAnc3RyaW5nJyA/IGMgOiAoYyBhcyBNYXJrdXBDb250ZW50KS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgaXNUcnVzdGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgcmFuZ2U6IHJlc3VsdC5yYW5nZSA/IGxzcFJhbmdlVG9Nb25hY28ocmVzdWx0LnJhbmdlKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyU2lnbmF0dXJlSGVscFByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBzaWduYXR1cmVIZWxwVHJpZ2dlckNoYXJhY3RlcnM6IFsnKCcsICcsJ10sXG4gICAgICAgIHByb3ZpZGVTaWduYXR1cmVIZWxwOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVVcmkgPSBtb2RlbC51cmkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogU2lnbmF0dXJlSGVscCB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L3NpZ25hdHVyZUhlbHAnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogZmlsZVVyaSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlczogcmVzdWx0LnNpZ25hdHVyZXMubWFwKChzaWc6IFNpZ25hdHVyZUluZm9ybWF0aW9uKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICAgICAgICAgc2lnLmxhYmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRhdGlvbjogc2lnLmRvY3VtZW50YXRpb24gPyBtYXJrdXBUb1N0cmluZyhzaWcuZG9jdW1lbnRhdGlvbikgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiAgICAoc2lnLnBhcmFtZXRlcnMgPz8gW10pLm1hcCgocDogUGFyYW1ldGVySW5mb3JtYXRpb24pID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICAgICAgICAgcC5sYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudGF0aW9uOiBwLmRvY3VtZW50YXRpb24gPyBtYXJrdXBUb1N0cmluZyhwLmRvY3VtZW50YXRpb24pIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZVNpZ25hdHVyZTogcmVzdWx0LmFjdGl2ZVNpZ25hdHVyZSA/PyAwLFxuICAgICAgICAgICAgICAgICAgICBhY3RpdmVQYXJhbWV0ZXI6IHJlc3VsdC5hY3RpdmVQYXJhbWV0ZXIgPz8gMCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGRpc3Bvc2U6ICgpID0+IHt9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJEZWZpbml0aW9uUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVEZWZpbml0aW9uOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVVcmkgPSBtb2RlbC51cmkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogTG9jYXRpb24gfCBMb2NhdGlvbltdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvZGVmaW5pdGlvbicsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBmaWxlVXJpIH0sXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgbG9jYXRpb25zID0gQXJyYXkuaXNBcnJheShyZXN1bHQpID8gcmVzdWx0IDogW3Jlc3VsdF07XG4gICAgICAgICAgICByZXR1cm4gbG9jYXRpb25zLm1hcChsb2MgPT4gKHtcbiAgICAgICAgICAgICAgICB1cmk6ICAgbW9uYWNvLlVyaS5wYXJzZShsb2MudXJpKSxcbiAgICAgICAgICAgICAgICByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhsb2MucmFuZ2UpLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlclJlZmVyZW5jZVByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlUmVmZXJlbmNlczogYXN5bmMgKG1vZGVsLCBwb3NpdGlvbiwgY29udGV4dCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IExvY2F0aW9uW10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9yZWZlcmVuY2VzJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgICAgICBjb250ZXh0OiAgICAgIHsgaW5jbHVkZURlY2xhcmF0aW9uOiBjb250ZXh0LmluY2x1ZGVEZWNsYXJhdGlvbiB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0Lm1hcChsb2MgPT4gKHsgdXJpOiBtb25hY28uVXJpLnBhcnNlKGxvYy51cmkpLCByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhsb2MucmFuZ2UpIH0pKTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJSZW5hbWVQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZVJlbmFtZUVkaXRzOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uLCBuZXdOYW1lKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4geyBlZGl0czogW10gfTtcbiAgICAgICAgICAgIGNvbnN0IGVkaXQ6IFdvcmtzcGFjZUVkaXQgfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9yZW5hbWUnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogICAgIHsgbGluZTogcG9zaXRpb24ubGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogcG9zaXRpb24uY29sdW1uIC0gMSB9LFxuICAgICAgICAgICAgICAgIG5ld05hbWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB3b3Jrc3BhY2VFZGl0VG9Nb25hY28oZWRpdCk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlc29sdmVSZW5hbWVMb2NhdGlvbjogYXN5bmMgKG1vZGVsLCBwb3NpdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogeyByYW5nZTogTHNwUmFuZ2U7IHBsYWNlaG9sZGVyPzogc3RyaW5nIH0gfCBMc3BSYW5nZSB8IG51bGwgPVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L3ByZXBhcmVSZW5hbWUnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gJ3JhbmdlJyBpbiByZXN1bHQgPyByZXN1bHQucmFuZ2UgOiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSAncGxhY2Vob2xkZXInIGluIHJlc3VsdCAmJiByZXN1bHQucGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICAgICAgPyByZXN1bHQucGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICAgICAgOiBtb2RlbC5nZXRXb3JkQXRQb3NpdGlvbihwb3NpdGlvbik/LndvcmQgPz8gJyc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28ocmFuZ2UpLCB0ZXh0OiBwbGFjZWhvbGRlciB9O1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgY29uc3Qgd29yZCA9IG1vZGVsLmdldFdvcmRBdFBvc2l0aW9uKHBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gd29yZCA/IHtcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2U6IHsgc3RhcnRMaW5lTnVtYmVyOiBwb3NpdGlvbi5saW5lTnVtYmVyLCBzdGFydENvbHVtbjogd29yZC5zdGFydENvbHVtbiwgZW5kTGluZU51bWJlcjogcG9zaXRpb24ubGluZU51bWJlciwgZW5kQ29sdW1uOiB3b3JkLmVuZENvbHVtbiB9LFxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiB3b3JkLndvcmQsXG4gICAgICAgICAgICAgICAgfSA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBSZWdpc3RlcmluZyB0aGlzIHByb3ZpZGVyIGFsc28gZW5hYmxlcyBlZGl0b3IuanMncyBleGlzdGluZyBmb3JtYXQtb24tc2F2ZSBwYXRoIGZvciBKYXZhOiB0aGVcbiAgICAvLyBzaGFyZWQgU2F2ZSBhY3Rpb24gcnVucyBlZGl0b3IuYWN0aW9uLmZvcm1hdERvY3VtZW50IHdoZW4gYXV0by1mb3JtYXR0aW5nIGlzIG9uICh0aGUgc2FtZVxuICAgIC8vIG1lY2hhbmlzbSBhbmQgZ2xvYmFsIHRvZ2dsZSB1c2VkIGZvciBUeXBlU2NyaXB0KS5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyRG9jdW1lbnRGb3JtYXR0aW5nRWRpdFByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlRG9jdW1lbnRGb3JtYXR0aW5nRWRpdHM6IGFzeW5jIChtb2RlbCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBlZGl0czogVGV4dEVkaXRbXSB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L2Zvcm1hdHRpbmcnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiAgICAgIHsgdGFiU2l6ZTogbW9kZWwuZ2V0T3B0aW9ucygpLnRhYlNpemUsIGluc2VydFNwYWNlczogbW9kZWwuZ2V0T3B0aW9ucygpLmluc2VydFNwYWNlcyB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gZWRpdHMgPyBlZGl0cy5tYXAodGV4dEVkaXRUb01vbmFjbykgOiBudWxsO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckNvZGVBY3Rpb25Qcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZUNvZGVBY3Rpb25zOiBhc3luYyAobW9kZWwsIHJhbmdlLCBjb250ZXh0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbXB0eSA9IHsgYWN0aW9uczogW10sIGRpc3Bvc2UoKSB7IC8qIG5vdGhpbmcgdG8gZGlzcG9zZSAqLyB9IH07XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gZW1wdHk7XG4gICAgICAgICAgICBjb25zdCBkaWFnbm9zdGljcyA9IChjb250ZXh0Lm1hcmtlcnMgPz8gW10pLm1hcChtYXJrZXJUb0xzcERpYWdub3N0aWMpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBBcnJheTxDb2RlQWN0aW9uIHwgQ29tbWFuZD4gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9jb2RlQWN0aW9uJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICAgICAgcmFuZ2U6ICAgICAgICBtb25hY29SYW5nZVRvTHNwKHJhbmdlKSxcbiAgICAgICAgICAgICAgICBjb250ZXh0OiAgICAgIHsgZGlhZ25vc3RpY3MsIG9ubHk6IGNvbnRleHQub25seSA/IFtjb250ZXh0Lm9ubHldIDogdW5kZWZpbmVkIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0Py5sZW5ndGgpIHJldHVybiBlbXB0eTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgYWN0aW9uczogcmVzdWx0Lm1hcChsc3BDb2RlQWN0aW9uVG9Nb25hY28pLFxuICAgICAgICAgICAgICAgIGRpc3Bvc2UoKSB7IC8qIG5vdGhpbmcgdG8gZGlzcG9zZSAqLyB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICB9LCB7XG4gICAgICAgIHByb3ZpZGVkQ29kZUFjdGlvbktpbmRzOiBbJ3F1aWNrZml4JywgJ3JlZmFjdG9yJywgJ3JlZmFjdG9yLmV4dHJhY3QnLCAncmVmYWN0b3IuaW5saW5lJyxcbiAgICAgICAgICAgICdyZWZhY3Rvci5yZXdyaXRlJywgJ3NvdXJjZScsICdzb3VyY2Uub3JnYW5pemVJbXBvcnRzJ10sXG4gICAgfSk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEhlbHBlcnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gbHNwU2V2ZXJpdHkoc2V2ZXJpdHk6IERpYWdub3N0aWNTZXZlcml0eSB8IHVuZGVmaW5lZCk6IG1vbmFjby5NYXJrZXJTZXZlcml0eSB7XG4gICAgc3dpdGNoIChzZXZlcml0eSkge1xuICAgICAgICBjYXNlIERpYWdub3N0aWNTZXZlcml0eS5FcnJvcjogICAgICAgcmV0dXJuIG1vbmFjby5NYXJrZXJTZXZlcml0eS5FcnJvcjtcbiAgICAgICAgY2FzZSBEaWFnbm9zdGljU2V2ZXJpdHkuV2FybmluZzogICAgIHJldHVybiBtb25hY28uTWFya2VyU2V2ZXJpdHkuV2FybmluZztcbiAgICAgICAgY2FzZSBEaWFnbm9zdGljU2V2ZXJpdHkuSW5mb3JtYXRpb246IHJldHVybiBtb25hY28uTWFya2VyU2V2ZXJpdHkuSW5mbztcbiAgICAgICAgY2FzZSBEaWFnbm9zdGljU2V2ZXJpdHkuSGludDogICAgICAgIHJldHVybiBtb25hY28uTWFya2VyU2V2ZXJpdHkuSGludDtcbiAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtb25hY28uTWFya2VyU2V2ZXJpdHkuRXJyb3I7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBsc3BSYW5nZVRvTW9uYWNvKHI6IHsgc3RhcnQ6IHsgbGluZTogbnVtYmVyOyBjaGFyYWN0ZXI6IG51bWJlciB9OyBlbmQ6IHsgbGluZTogbnVtYmVyOyBjaGFyYWN0ZXI6IG51bWJlciB9IH0pOiBtb25hY28uSVJhbmdlIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBzdGFydExpbmVOdW1iZXI6IHIuc3RhcnQubGluZSArIDEsXG4gICAgICAgIHN0YXJ0Q29sdW1uOiAgICAgci5zdGFydC5jaGFyYWN0ZXIgKyAxLFxuICAgICAgICBlbmRMaW5lTnVtYmVyOiAgIHIuZW5kLmxpbmUgKyAxLFxuICAgICAgICBlbmRDb2x1bW46ICAgICAgIHIuZW5kLmNoYXJhY3RlciArIDEsXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gbWFya3VwVG9TdHJpbmcoYzogc3RyaW5nIHwgTWFya3VwQ29udGVudCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHR5cGVvZiBjID09PSAnc3RyaW5nJyA/IGMgOiBjLnZhbHVlO1xufVxuXG5mdW5jdGlvbiBsc3BDb21wbGV0aW9uS2luZChraW5kOiBDb21wbGV0aW9uSXRlbUtpbmQgfCB1bmRlZmluZWQpOiBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtS2luZCB7XG4gICAgY29uc3QgSyA9IG1vbmFjby5sYW5ndWFnZXMuQ29tcGxldGlvbkl0ZW1LaW5kO1xuICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5UZXh0OiAgICAgICAgICByZXR1cm4gSy5UZXh0O1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5NZXRob2Q6ICAgICAgICByZXR1cm4gSy5NZXRob2Q7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLkZ1bmN0aW9uOiAgICAgIHJldHVybiBLLkZ1bmN0aW9uO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5Db25zdHJ1Y3RvcjogICByZXR1cm4gSy5Db25zdHJ1Y3RvcjtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuRmllbGQ6ICAgICAgICAgcmV0dXJuIEsuRmllbGQ7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLlZhcmlhYmxlOiAgICAgIHJldHVybiBLLlZhcmlhYmxlO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5DbGFzczogICAgICAgICByZXR1cm4gSy5DbGFzcztcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuSW50ZXJmYWNlOiAgICAgcmV0dXJuIEsuSW50ZXJmYWNlO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5Nb2R1bGU6ICAgICAgICByZXR1cm4gSy5Nb2R1bGU7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLlByb3BlcnR5OiAgICAgIHJldHVybiBLLlByb3BlcnR5O1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5LZXl3b3JkOiAgICAgICByZXR1cm4gSy5LZXl3b3JkO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5TbmlwcGV0OiAgICAgICByZXR1cm4gSy5TbmlwcGV0O1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5Db25zdGFudDogICAgICByZXR1cm4gSy5Db25zdGFudDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuU3RydWN0OiAgICAgICAgcmV0dXJuIEsuU3RydWN0O1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5UeXBlUGFyYW1ldGVyOiByZXR1cm4gSy5UeXBlUGFyYW1ldGVyO1xuICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSy5UZXh0O1xuICAgIH1cbn1cblxuZnVuY3Rpb24gbHNwQ29tcGxldGlvblRvTW9uYWNvKFxuICAgIGl0ZW06IENvbXBsZXRpb25JdGVtLFxuICAgIG1vZGVsOiBtb25hY28uZWRpdG9yLklUZXh0TW9kZWwsXG4gICAgcG9zaXRpb246IG1vbmFjby5Qb3NpdGlvbixcbik6IE1vbmFjb0NvbXBsZXRpb25JdGVtIHtcbiAgICBjb25zdCB3b3JkID0gbW9kZWwuZ2V0V29yZFVudGlsUG9zaXRpb24ocG9zaXRpb24pO1xuICAgIGxldCByYW5nZTogbW9uYWNvLklSYW5nZSA9IHtcbiAgICAgICAgc3RhcnRMaW5lTnVtYmVyOiBwb3NpdGlvbi5saW5lTnVtYmVyLFxuICAgICAgICBzdGFydENvbHVtbjogICAgIHdvcmQuc3RhcnRDb2x1bW4sXG4gICAgICAgIGVuZExpbmVOdW1iZXI6ICAgcG9zaXRpb24ubGluZU51bWJlcixcbiAgICAgICAgZW5kQ29sdW1uOiAgICAgICB3b3JkLmVuZENvbHVtbixcbiAgICB9O1xuICAgIGxldCBpbnNlcnRUZXh0ID0gaXRlbS5pbnNlcnRUZXh0ID8/IGl0ZW0ubGFiZWw7XG4gICAgY29uc3QgdGV4dEVkaXQgPSBpdGVtLnRleHRFZGl0IGFzIHsgcmFuZ2U/OiBMc3BSYW5nZTsgcmVwbGFjZT86IExzcFJhbmdlOyBpbnNlcnQ/OiBMc3BSYW5nZTsgbmV3VGV4dD86IHN0cmluZyB9IHwgdW5kZWZpbmVkO1xuICAgIGlmICh0ZXh0RWRpdCkge1xuICAgICAgICBjb25zdCByID0gdGV4dEVkaXQucmFuZ2UgPz8gdGV4dEVkaXQucmVwbGFjZSA/PyB0ZXh0RWRpdC5pbnNlcnQ7XG4gICAgICAgIGlmIChyKSByYW5nZSA9IGxzcFJhbmdlVG9Nb25hY28ocik7XG4gICAgICAgIGlmICh0eXBlb2YgdGV4dEVkaXQubmV3VGV4dCA9PT0gJ3N0cmluZycpIGluc2VydFRleHQgPSB0ZXh0RWRpdC5uZXdUZXh0O1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQ6IE1vbmFjb0NvbXBsZXRpb25JdGVtID0ge1xuICAgICAgICBsYWJlbDogICAgICAgICAgIGl0ZW0ubGFiZWwsXG4gICAgICAgIGtpbmQ6ICAgICAgICAgICAgbHNwQ29tcGxldGlvbktpbmQoaXRlbS5raW5kKSxcbiAgICAgICAgZGV0YWlsOiAgICAgICAgICBpdGVtLmRldGFpbCxcbiAgICAgICAgZG9jdW1lbnRhdGlvbjogICBpdGVtLmRvY3VtZW50YXRpb24gPyB7IHZhbHVlOiBtYXJrdXBUb1N0cmluZyhpdGVtLmRvY3VtZW50YXRpb24pLCBpc1RydXN0ZWQ6IGZhbHNlIH0gOiB1bmRlZmluZWQsXG4gICAgICAgIGluc2VydFRleHQsXG4gICAgICAgIGluc2VydFRleHRSdWxlczogaXRlbS5pbnNlcnRUZXh0Rm9ybWF0ID09PSBJbnNlcnRUZXh0Rm9ybWF0LlNuaXBwZXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtSW5zZXJ0VGV4dFJ1bGUuSW5zZXJ0QXNTbmlwcGV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICByYW5nZSxcbiAgICAgICAgc29ydFRleHQ6ICAgICAgICAgICAgc2RrUHJpb3JpdGlzZWRTb3J0VGV4dChpdGVtKSxcbiAgICAgICAgZmlsdGVyVGV4dDogICAgICAgICAgaXRlbS5maWx0ZXJUZXh0LFxuICAgICAgICBwcmVzZWxlY3Q6ICAgICAgICAgICBpdGVtLnByZXNlbGVjdCxcbiAgICAgICAgY29tbWl0Q2hhcmFjdGVyczogICAgaXRlbS5jb21taXRDaGFyYWN0ZXJzLFxuICAgICAgICBhZGRpdGlvbmFsVGV4dEVkaXRzOiBpdGVtLmFkZGl0aW9uYWxUZXh0RWRpdHM/Lm1hcCh0ZXh0RWRpdFRvTW9uYWNvKSxcbiAgICB9O1xuICAgIHJlc3VsdC5fbHNwID0gaXRlbTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFJhbmtzIERpcmlnaWJsZSBTREsgc3VnZ2VzdGlvbnMgKHtAY29kZSBvcmcuZWNsaXBzZS5kaXJpZ2libGUuc2RrLip9KSBhYm92ZSBldmVyeXRoaW5nIGVsc2UgYnlcbiAqIHByZWZpeGluZyB0aGUgc2VydmVyIHNvcnRUZXh0IHdpdGggYSBwcmlvcml0eSBidWNrZXQsIHByZXNlcnZpbmcgdGhlIHNlcnZlciBvcmRlciB3aXRoaW4gZWFjaCBidWNrZXQuXG4gKi9cbmZ1bmN0aW9uIHNka1ByaW9yaXRpc2VkU29ydFRleHQoaXRlbTogQ29tcGxldGlvbkl0ZW0pOiBzdHJpbmcge1xuICAgIGNvbnN0IGJhc2UgPSBpdGVtLnNvcnRUZXh0ID8/ICh0eXBlb2YgaXRlbS5sYWJlbCA9PT0gJ3N0cmluZycgPyBpdGVtLmxhYmVsIDogJycpO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gKGl0ZW0ubGFiZWxEZXRhaWxzICYmIHR5cGVvZiBpdGVtLmxhYmVsRGV0YWlscy5kZXNjcmlwdGlvbiA9PT0gJ3N0cmluZycpXG4gICAgICAgID8gaXRlbS5sYWJlbERldGFpbHMuZGVzY3JpcHRpb24gOiAnJztcbiAgICBjb25zdCBoYXlzdGFjayA9IGAke2l0ZW0uZGV0YWlsID8/ICcnfSAke2Rlc2NyaXB0aW9ufWA7XG4gICAgcmV0dXJuIGhheXN0YWNrLmluY2x1ZGVzKCdvcmcuZWNsaXBzZS5kaXJpZ2libGUuc2RrJykgPyBgMF8ke2Jhc2V9YCA6IGAxXyR7YmFzZX1gO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDb2RlIGFjdGlvbnMsIGNvbW1hbmRzLCByZWZhY3Rvci9nZW5lcmF0ZSwgd29ya3NwYWNlIGVkaXRzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBNb25hY28gY29tbWFuZCBpZCB1c2VkIHRvIGFwcGx5IGEgZGVmZXJyZWQgTFNQIGNvZGUgYWN0aW9uIHdoZW4gdGhlIHVzZXIgc2VsZWN0cyBpdC4gKi9cbmNvbnN0IEFQUExZX0FDVElPTl9DT01NQU5EID0gJ2RpcmlnaWJsZS5qYXZhLmFwcGx5Q29kZUFjdGlvbic7XG5cbi8qKiBWaXJ0dWFsIFVSSSBwcmVmaXggb2YgZWRpdG9yIG1vZGVsczsgc3RyaXBwaW5nIGl0IHlpZWxkcyB0aGUgSURFIHdvcmtzcGFjZSBwYXRoICgvd3MvcHJvai8uLi4pLiAqL1xuY29uc3QgVklSVFVBTF9GSUxFX1BSRUZJWCA9ICdmaWxlOi8vL3dvcmtzcGFjZSc7XG5cbnR5cGUgTHNwUmFuZ2UgPSB7IHN0YXJ0OiB7IGxpbmU6IG51bWJlcjsgY2hhcmFjdGVyOiBudW1iZXIgfTsgZW5kOiB7IGxpbmU6IG51bWJlcjsgY2hhcmFjdGVyOiBudW1iZXIgfSB9O1xuXG4vKiogTW9uYWNvIGNvbXBsZXRpb24gaXRlbSBjYXJyeWluZyB0aGUgb3JpZ2luYXRpbmcgTFNQIGl0ZW0gc28gcmVzb2x2ZSBjYW4gZmV0Y2ggaXRzIGltcG9ydCBlZGl0cy4gKi9cbnR5cGUgTW9uYWNvQ29tcGxldGlvbkl0ZW0gPSBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtICYgeyBfbHNwPzogQ29tcGxldGlvbkl0ZW0gfTtcblxuZnVuY3Rpb24gdGV4dEVkaXRUb01vbmFjbyhlZGl0OiBUZXh0RWRpdCk6IG1vbmFjby5sYW5ndWFnZXMuVGV4dEVkaXQge1xuICAgIHJldHVybiB7IHJhbmdlOiBsc3BSYW5nZVRvTW9uYWNvKGVkaXQucmFuZ2UpLCB0ZXh0OiBlZGl0Lm5ld1RleHQgfTtcbn1cblxuZnVuY3Rpb24gbW9uYWNvUmFuZ2VUb0xzcChyOiBtb25hY28uSVJhbmdlKTogTHNwUmFuZ2Uge1xuICAgIHJldHVybiB7XG4gICAgICAgIHN0YXJ0OiB7IGxpbmU6IHIuc3RhcnRMaW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiByLnN0YXJ0Q29sdW1uIC0gMSB9LFxuICAgICAgICBlbmQ6ICAgeyBsaW5lOiByLmVuZExpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHIuZW5kQ29sdW1uIC0gMSB9LFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIG1vbmFjb1NldmVyaXR5VG9Mc3Aoc2V2ZXJpdHk6IG1vbmFjby5NYXJrZXJTZXZlcml0eSk6IERpYWdub3N0aWNTZXZlcml0eSB7XG4gICAgc3dpdGNoIChzZXZlcml0eSkge1xuICAgICAgICBjYXNlIG1vbmFjby5NYXJrZXJTZXZlcml0eS5FcnJvcjogICByZXR1cm4gRGlhZ25vc3RpY1NldmVyaXR5LkVycm9yO1xuICAgICAgICBjYXNlIG1vbmFjby5NYXJrZXJTZXZlcml0eS5XYXJuaW5nOiByZXR1cm4gRGlhZ25vc3RpY1NldmVyaXR5Lldhcm5pbmc7XG4gICAgICAgIGNhc2UgbW9uYWNvLk1hcmtlclNldmVyaXR5LkluZm86ICAgIHJldHVybiBEaWFnbm9zdGljU2V2ZXJpdHkuSW5mb3JtYXRpb247XG4gICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBEaWFnbm9zdGljU2V2ZXJpdHkuSGludDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIG1hcmtlclRvTHNwRGlhZ25vc3RpYyhtOiBtb25hY28uZWRpdG9yLklNYXJrZXJEYXRhKTogRGlhZ25vc3RpYyB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcmFuZ2U6ICAgIHsgc3RhcnQ6IHsgbGluZTogbS5zdGFydExpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IG0uc3RhcnRDb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICAgICAgICAgIGVuZDogICB7IGxpbmU6IG0uZW5kTGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogbS5lbmRDb2x1bW4gLSAxIH0gfSxcbiAgICAgICAgbWVzc2FnZTogIG0ubWVzc2FnZSxcbiAgICAgICAgc2V2ZXJpdHk6IG1vbmFjb1NldmVyaXR5VG9Mc3AobS5zZXZlcml0eSksXG4gICAgICAgIHNvdXJjZTogICBtLnNvdXJjZSxcbiAgICB9IGFzIERpYWdub3N0aWM7XG59XG5cbmZ1bmN0aW9uIGxzcENvZGVBY3Rpb25Ub01vbmFjbyhhY3Rpb246IENvZGVBY3Rpb24gfCBDb21tYW5kKTogbW9uYWNvLmxhbmd1YWdlcy5Db2RlQWN0aW9uIHtcbiAgICBjb25zdCBpc0NvbW1hbmQgPSB0eXBlb2YgKGFjdGlvbiBhcyBDb21tYW5kKS5jb21tYW5kID09PSAnc3RyaW5nJztcbiAgICBjb25zdCB0aXRsZSA9IGFjdGlvbi50aXRsZVxuICAgICAgICA/PyAoaXNDb21tYW5kID8gKGFjdGlvbiBhcyBDb21tYW5kKS5jb21tYW5kIDogKGFjdGlvbiBhcyBDb2RlQWN0aW9uKS5jb21tYW5kPy50aXRsZSlcbiAgICAgICAgPz8gJ0FjdGlvbic7XG4gICAgY29uc3Qga2luZCA9IGlzQ29tbWFuZCA/ICdxdWlja2ZpeCcgOiAoKGFjdGlvbiBhcyBDb2RlQWN0aW9uKS5raW5kID8/ICdxdWlja2ZpeCcpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHRpdGxlLFxuICAgICAgICBraW5kLFxuICAgICAgICBkaWFnbm9zdGljczogW10sXG4gICAgICAgIGlzUHJlZmVycmVkOiAoYWN0aW9uIGFzIENvZGVBY3Rpb24pLmlzUHJlZmVycmVkLFxuICAgICAgICAvLyBBcHBseSBsYXppbHkgdGhyb3VnaCBvdXIgY29tbWFuZCBzbyB3ZSBjYW4gcmVzb2x2ZSwgcnVuIHNlcnZlciBjb21tYW5kcyBhbmQgYXBwbHkgZWRpdHMgdW5pZm9ybWx5LlxuICAgICAgICBjb21tYW5kOiB7IGlkOiBBUFBMWV9BQ1RJT05fQ09NTUFORCwgdGl0bGUsIGFyZ3VtZW50czogW2FjdGlvbl0gfSxcbiAgICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBhcHBseUNvZGVBY3Rpb24oYWN0aW9uOiBDb2RlQWN0aW9uIHwgQ29tbWFuZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghX2Nvbm4pIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIChhY3Rpb24gYXMgQ29tbWFuZCkuY29tbWFuZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGF3YWl0IHJ1blNlcnZlckNvbW1hbmQoYWN0aW9uIGFzIENvbW1hbmQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXNvbHZlZCA9IGFjdGlvbiBhcyBDb2RlQWN0aW9uO1xuICAgICAgICBpZiAoIXJlc29sdmVkLmVkaXQgJiYgKHJlc29sdmVkIGFzIHsgZGF0YT86IHVua25vd24gfSkuZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXNvbHZlZCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCdjb2RlQWN0aW9uL3Jlc29sdmUnLCByZXNvbHZlZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc29sdmVkLmVkaXQpIGFwcGx5V29ya3NwYWNlRWRpdChyZXNvbHZlZC5lZGl0KTtcbiAgICAgICAgaWYgKHJlc29sdmVkLmNvbW1hbmQpIGF3YWl0IHJ1blNlcnZlckNvbW1hbmQocmVzb2x2ZWQuY29tbWFuZCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tqYXZhLWxzcF0gY29kZSBhY3Rpb24gZmFpbGVkOicsIChlIGFzIEVycm9yKT8ubWVzc2FnZSA/PyBlKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGlzV29ya3NwYWNlRWRpdCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFdvcmtzcGFjZUVkaXQge1xuICAgIHJldHVybiAhIXZhbHVlICYmICghISh2YWx1ZSBhcyBXb3Jrc3BhY2VFZGl0KS5jaGFuZ2VzIHx8ICEhKHZhbHVlIGFzIFdvcmtzcGFjZUVkaXQpLmRvY3VtZW50Q2hhbmdlcyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1blNlcnZlckNvbW1hbmQoY21kOiBDb21tYW5kKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFfY29ubiB8fCAhY21kPy5jb21tYW5kKSByZXR1cm47XG4gICAgaWYgKEdFTkVSQVRFW2NtZC5jb21tYW5kXSkge1xuICAgICAgICBhd2FpdCBydW5HZW5lcmF0ZShjbWQuY29tbWFuZCwgY21kLmFyZ3VtZW50cyA/PyBbXSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3dvcmtzcGFjZS9leGVjdXRlQ29tbWFuZCcsIHsgY29tbWFuZDogY21kLmNvbW1hbmQsIGFyZ3VtZW50czogY21kLmFyZ3VtZW50cyA/PyBbXSB9KTtcbiAgICBpZiAoaXNXb3Jrc3BhY2VFZGl0KHJlc3VsdCkpIGFwcGx5V29ya3NwYWNlRWRpdChyZXN1bHQpO1xufVxuXG5pbnRlcmZhY2UgR2VuZXJhdGVTcGVjIHtcbiAgICBsYWJlbDogc3RyaW5nO1xuICAgIHN0YXR1czogc3RyaW5nO1xuICAgIGdlbmVyYXRlOiBzdHJpbmc7XG4gICAgbWVtYmVyczogKHN0YXR1czogYW55KSA9PiBBcnJheTx7IGxhYmVsOiBzdHJpbmc7IHJlZjogYW55IH0+O1xuICAgIGJ1aWxkQXJnczogKHByb21wdEFyZ3M6IGFueVtdLCBzdGF0dXM6IGFueSwgc2VsZWN0ZWQ6IGFueVtdKSA9PiBhbnlbXTtcbn1cblxuLyoqIE1lbWJlci1uYW1lZCBmaWVsZHMgXHUyMTkyIHBpY2tlciBsYWJlbHMuICovXG5mdW5jdGlvbiBmaWVsZExhYmVsKGY6IGFueSk6IHN0cmluZyB7XG4gICAgY29uc3QgbmFtZSA9IGY/Lm5hbWUgPz8gZj8uZmllbGROYW1lID8/ICcnO1xuICAgIGNvbnN0IHR5cGUgPSBmPy50eXBlID8/IGY/LnR5cGVOYW1lO1xuICAgIHJldHVybiB0eXBlID8gYCR7bmFtZX06ICR7dHlwZX1gIDogYCR7bmFtZX1gO1xufVxuXG4vKipcbiAqIFRoZSBKRFQuTFMgc291cmNlLWdlbmVyYXRpb24gY29tbWFuZHMgKGNvbnN0cnVjdG9ycywgZ2V0dGVycy9zZXR0ZXJzLCB0b1N0cmluZywgaGFzaENvZGUvZXF1YWxzKS5cbiAqIEVhY2ggbWFwcyB0aGUgY2xpZW50IFwiKlByb21wdFwiIGNvbW1hbmQgdG8gdGhlIHNlcnZlciBzdGF0dXMgKyBnZW5lcmF0ZSBkZWxlZ2F0ZSBjb21tYW5kczsgdGhlIHN0YXR1c1xuICogY2FsbCB5aWVsZHMgdGhlIGNhbmRpZGF0ZSBmaWVsZHMgc2hvd24gaW4gdGhlIG1lbWJlciBwaWNrZXIsIHRoZSBnZW5lcmF0ZSBjYWxsIHJldHVybnMgdGhlIGVkaXQuXG4gKi9cbmNvbnN0IEdFTkVSQVRFOiBSZWNvcmQ8c3RyaW5nLCBHZW5lcmF0ZVNwZWM+ID0ge1xuICAgICdqYXZhLmFjdGlvbi5nZW5lcmF0ZUNvbnN0cnVjdG9yc1Byb21wdCc6IHtcbiAgICAgICAgbGFiZWw6ICdTZWxlY3QgZmllbGRzIGFuZCBjb25zdHJ1Y3RvcnMnLFxuICAgICAgICBzdGF0dXM6ICdqYXZhLmFjdGlvbi5jaGVja0NvbnN0cnVjdG9yc1N0YXR1cycsXG4gICAgICAgIGdlbmVyYXRlOiAnamF2YS5hY3Rpb24uZ2VuZXJhdGVDb25zdHJ1Y3RvcnMnLFxuICAgICAgICBtZW1iZXJzOiAocykgPT4gKHM/LmZpZWxkcyA/PyBbXSkubWFwKChmOiBhbnkpID0+ICh7IGxhYmVsOiBmaWVsZExhYmVsKGYpLCByZWY6IGYgfSkpLFxuICAgICAgICBidWlsZEFyZ3M6IChhcmdzLCBzLCBzZWwpID0+IFthcmdzWzBdLCB7IGNvbnN0cnVjdG9yczogcz8uY29uc3RydWN0b3JzID8/IFtdLCBmaWVsZHM6IHNlbC5tYXAobSA9PiBtLnJlZikgfV0sXG4gICAgfSxcbiAgICAnamF2YS5hY3Rpb24uZ2VuZXJhdGVUb1N0cmluZ1Byb21wdCc6IHtcbiAgICAgICAgbGFiZWw6ICdTZWxlY3QgZmllbGRzIHRvIGluY2x1ZGUgaW4gdG9TdHJpbmcoKScsXG4gICAgICAgIHN0YXR1czogJ2phdmEuYWN0aW9uLmNoZWNrVG9TdHJpbmdTdGF0dXMnLFxuICAgICAgICBnZW5lcmF0ZTogJ2phdmEuYWN0aW9uLmdlbmVyYXRlVG9TdHJpbmcnLFxuICAgICAgICBtZW1iZXJzOiAocykgPT4gKHM/LmZpZWxkcyA/PyBbXSkubWFwKChmOiBhbnkpID0+ICh7IGxhYmVsOiBmaWVsZExhYmVsKGYpLCByZWY6IGYgfSkpLFxuICAgICAgICBidWlsZEFyZ3M6IChhcmdzLCBfcywgc2VsKSA9PiBbYXJnc1swXSwgc2VsLm1hcChtID0+IG0ucmVmKV0sXG4gICAgfSxcbiAgICAnamF2YS5hY3Rpb24uaGFzaENvZGVFcXVhbHNQcm9tcHQnOiB7XG4gICAgICAgIGxhYmVsOiAnU2VsZWN0IGZpZWxkcyBmb3IgaGFzaENvZGUoKSBhbmQgZXF1YWxzKCknLFxuICAgICAgICBzdGF0dXM6ICdqYXZhLmFjdGlvbi5jaGVja0hhc2hDb2RlRXF1YWxzU3RhdHVzJyxcbiAgICAgICAgZ2VuZXJhdGU6ICdqYXZhLmFjdGlvbi5nZW5lcmF0ZUhhc2hDb2RlRXF1YWxzJyxcbiAgICAgICAgbWVtYmVyczogKHMpID0+IChzPy5maWVsZHMgPz8gW10pLm1hcCgoZjogYW55KSA9PiAoeyBsYWJlbDogZmllbGRMYWJlbChmKSwgcmVmOiBmIH0pKSxcbiAgICAgICAgYnVpbGRBcmdzOiAoYXJncywgX3MsIHNlbCkgPT4gW2FyZ3NbMF0sIHNlbC5tYXAobSA9PiBtLnJlZiksIGZhbHNlXSxcbiAgICB9LFxuICAgICdqYXZhLmFjdGlvbi5nZW5lcmF0ZUFjY2Vzc29yc1Byb21wdCc6IHtcbiAgICAgICAgbGFiZWw6ICdTZWxlY3QgZmllbGRzIHRvIGdlbmVyYXRlIGdldHRlcnMgYW5kIHNldHRlcnMnLFxuICAgICAgICBzdGF0dXM6ICdqYXZhLmFjdGlvbi5jaGVja0FjY2Vzc29yc1N0YXR1cycsXG4gICAgICAgIGdlbmVyYXRlOiAnamF2YS5hY3Rpb24uZ2VuZXJhdGVBY2Nlc3NvcnMnLFxuICAgICAgICBtZW1iZXJzOiAocykgPT4gKHM/LmFjY2Vzc29ycyA/PyBzID8/IFtdKS5tYXAoKGE6IGFueSkgPT4gKHsgbGFiZWw6IGZpZWxkTGFiZWwoYSksIHJlZjogYSB9KSksXG4gICAgICAgIGJ1aWxkQXJnczogKGFyZ3MsIF9zLCBzZWwpID0+IFthcmdzWzBdLCBzZWwubWFwKG0gPT4gbS5yZWYpXSxcbiAgICB9LFxufTtcblxuYXN5bmMgZnVuY3Rpb24gcnVuR2VuZXJhdGUocHJvbXB0SWQ6IHN0cmluZywgYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIV9jb25uKSByZXR1cm47XG4gICAgY29uc3Qgc3BlYyA9IEdFTkVSQVRFW3Byb21wdElkXTtcbiAgICBjb25zdCBzdGF0dXMgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgnd29ya3NwYWNlL2V4ZWN1dGVDb21tYW5kJywgeyBjb21tYW5kOiBzcGVjLnN0YXR1cywgYXJndW1lbnRzOiBhcmdzIH0pO1xuICAgIGlmICghc3RhdHVzKSByZXR1cm47XG4gICAgY29uc3QgbWVtYmVycyA9IHNwZWMubWVtYmVycyhzdGF0dXMpO1xuICAgIGxldCBzZWxlY3RlZCA9IG1lbWJlcnM7XG4gICAgY29uc3QgcGlja2VyID0gKGdsb2JhbFRoaXMgYXMgYW55KS5qYXZhTHNwTWVtYmVyUGlja2VyO1xuICAgIGlmIChtZW1iZXJzLmxlbmd0aCAmJiB0eXBlb2YgcGlja2VyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNvbnN0IGNob3Nlbjogc3RyaW5nW10gfCBudWxsID0gYXdhaXQgcGlja2VyKHNwZWMubGFiZWwsIG1lbWJlcnMubWFwKG0gPT4gbS5sYWJlbCkpO1xuICAgICAgICBpZiAoY2hvc2VuID09PSBudWxsKSByZXR1cm47IC8vIHVzZXIgY2FuY2VsbGVkIHRoZSBkaWFsb2dcbiAgICAgICAgc2VsZWN0ZWQgPSBtZW1iZXJzLmZpbHRlcihtID0+IGNob3Nlbi5pbmNsdWRlcyhtLmxhYmVsKSk7XG4gICAgfVxuICAgIGNvbnN0IGVkaXQgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgnd29ya3NwYWNlL2V4ZWN1dGVDb21tYW5kJywge1xuICAgICAgICBjb21tYW5kOiBzcGVjLmdlbmVyYXRlLFxuICAgICAgICBhcmd1bWVudHM6IHNwZWMuYnVpbGRBcmdzKGFyZ3MsIHN0YXR1cywgc2VsZWN0ZWQpLFxuICAgIH0pO1xuICAgIGlmIChpc1dvcmtzcGFjZUVkaXQoZWRpdCkpIGFwcGx5V29ya3NwYWNlRWRpdChlZGl0KTtcbn1cblxuLyoqIEdyb3VwcyBhIHdvcmtzcGFjZSBlZGl0J3MgdGV4dCBlZGl0cyBieSBkb2N1bWVudCBhbmQgYXBwbGllcyB0aGVtIGluIHBsYWNlIHRvIG9wZW4gTW9uYWNvIG1vZGVscy4gKi9cbmZ1bmN0aW9uIGFwcGx5V29ya3NwYWNlRWRpdChlZGl0OiBXb3Jrc3BhY2VFZGl0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGlmICghZWRpdCkgcmV0dXJuO1xuICAgIGNvbnN0IGJ5VXJpOiBSZWNvcmQ8c3RyaW5nLCBUZXh0RWRpdFtdPiA9IHt9O1xuICAgIGlmIChlZGl0LmNoYW5nZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCB1cmkgaW4gZWRpdC5jaGFuZ2VzKSBieVVyaVt1cmldID0gKGJ5VXJpW3VyaV0gPz8gW10pLmNvbmNhdChlZGl0LmNoYW5nZXNbdXJpXSk7XG4gICAgfVxuICAgIGlmIChlZGl0LmRvY3VtZW50Q2hhbmdlcykge1xuICAgICAgICBmb3IgKGNvbnN0IGRjIG9mIGVkaXQuZG9jdW1lbnRDaGFuZ2VzIGFzIGFueVtdKSB7XG4gICAgICAgICAgICBpZiAoZGM/LnRleHREb2N1bWVudD8udXJpICYmIEFycmF5LmlzQXJyYXkoZGMuZWRpdHMpKSB7XG4gICAgICAgICAgICAgICAgYnlVcmlbZGMudGV4dERvY3VtZW50LnVyaV0gPSAoYnlVcmlbZGMudGV4dERvY3VtZW50LnVyaV0gPz8gW10pLmNvbmNhdChkYy5lZGl0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCB1cmkgaW4gYnlVcmkpIHtcbiAgICAgICAgY29uc3QgbW9kZWwgPSBtb25hY28uZWRpdG9yLmdldE1vZGVscygpLmZpbmQobSA9PiBtLnVyaS50b1N0cmluZygpID09PSB1cmkpO1xuICAgICAgICBpZiAoIW1vZGVsKSBjb250aW51ZTtcbiAgICAgICAgY29uc3Qgb3BzID0gYnlVcmlbdXJpXS5tYXAoZSA9PiAoeyByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhlLnJhbmdlKSwgdGV4dDogZS5uZXdUZXh0LCBmb3JjZU1vdmVNYXJrZXJzOiB0cnVlIH0pKTtcbiAgICAgICAgbW9kZWwucHVzaEVkaXRPcGVyYXRpb25zKFtdLCBvcHMsICgpID0+IG51bGwpO1xuICAgIH1cbn1cblxuLyoqIENvbnZlcnRzIGFuIExTUCB3b3Jrc3BhY2UgZWRpdCBpbnRvIHRoZSBNb25hY28gc2hhcGUgcmV0dXJuZWQgYnkgdGhlIHJlbmFtZSBwcm92aWRlci4gKi9cbmZ1bmN0aW9uIHdvcmtzcGFjZUVkaXRUb01vbmFjbyhlZGl0OiBXb3Jrc3BhY2VFZGl0IHwgbnVsbCk6IG1vbmFjby5sYW5ndWFnZXMuV29ya3NwYWNlRWRpdCB7XG4gICAgY29uc3QgZWRpdHM6IGFueVtdID0gW107XG4gICAgY29uc3QgcHVzaCA9ICh1cmk6IHN0cmluZywgbGlzdDogVGV4dEVkaXRbXSkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGUgb2YgbGlzdCkge1xuICAgICAgICAgICAgZWRpdHMucHVzaCh7IHJlc291cmNlOiBtb25hY28uVXJpLnBhcnNlKHVyaSksIHRleHRFZGl0OiB7IHJhbmdlOiBsc3BSYW5nZVRvTW9uYWNvKGUucmFuZ2UpLCB0ZXh0OiBlLm5ld1RleHQgfSwgdmVyc2lvbklkOiB1bmRlZmluZWQgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGlmIChlZGl0Py5jaGFuZ2VzKSB7XG4gICAgICAgIGZvciAoY29uc3QgdXJpIGluIGVkaXQuY2hhbmdlcykgcHVzaCh1cmksIGVkaXQuY2hhbmdlc1t1cmldKTtcbiAgICB9XG4gICAgaWYgKGVkaXQ/LmRvY3VtZW50Q2hhbmdlcykge1xuICAgICAgICBmb3IgKGNvbnN0IGRjIG9mIGVkaXQuZG9jdW1lbnRDaGFuZ2VzIGFzIGFueVtdKSB7XG4gICAgICAgICAgICBpZiAoZGM/LnRleHREb2N1bWVudD8udXJpICYmIEFycmF5LmlzQXJyYXkoZGMuZWRpdHMpKSBwdXNoKGRjLnRleHREb2N1bWVudC51cmksIGRjLmVkaXRzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBlZGl0cyB9O1xufVxuXG5mdW5jdGlvbiBqZHRsc1NldHRpbmdzKCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGphdmE6IHtcbiAgICAgICAgICAgIGltcG9ydDoge1xuICAgICAgICAgICAgICAgIG1hdmVuOiAgICAgIHsgZW5hYmxlZDogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIGdyYWRsZTogICAgIHsgZW5hYmxlZDogZmFsc2UgfSxcbiAgICAgICAgICAgICAgICBleGNsdXNpb25zOiBbJyoqL25vZGVfbW9kdWxlcy8qKicsICcqKi8ubWV0YWRhdGEvKionLCAnKiovYXJjaGV0eXBlLXJlc291cmNlcy8qKiddLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGF1dG9idWlsZDogeyBlbmFibGVkOiB0cnVlIH0sXG4gICAgICAgICAgICBjb21wbGV0aW9uOiB7XG4gICAgICAgICAgICAgICAgb3ZlcndyaXRlOiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgZ3Vlc3NNZXRob2RBcmd1bWVudHM6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGZpbHRlcmVkVHlwZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgJ2NvbS5zdW4uKicsICdzdW4uKicsICdqZGsuKicsXG4gICAgICAgICAgICAgICAgICAgICdvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuKicsXG4gICAgICAgICAgICAgICAgICAgICdvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLionLFxuICAgICAgICAgICAgICAgICAgICAnb3JnLmVjbGlwc2Uub3NnaS5pbnRlcm5hbC4qJyxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIGltcG9ydE9yZGVyOiBbJ2phdmEnLCAnamF2YXgnLCAnb3JnJywgJ2NvbScsICcnXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzaWduYXR1cmVIZWxwOiAgeyBlbmFibGVkOiB0cnVlIH0sXG4gICAgICAgICAgICBmb3JtYXQ6ICAgICAgICAgeyBlbmFibGVkOiB0cnVlIH0sXG4gICAgICAgICAgICBzYXZlQWN0aW9uczogICAgeyBvcmdhbml6ZUltcG9ydHM6IGZhbHNlIH0sXG4gICAgICAgIH0sXG4gICAgfTtcbn1cbiIsICIvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSAyMDI0IFR5cGVGb3ggYW5kIG90aGVycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExJQ0VOU0UgaW4gdGhlIHBhY2thZ2Ugcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5pbXBvcnQgeyBEaXNwb3NhYmxlIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuXG5leHBvcnQgY2xhc3MgRGlzcG9zYWJsZUNvbGxlY3Rpb24gaW1wbGVtZW50cyBEaXNwb3NhYmxlIHtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGlzcG9zYWJsZXM6IERpc3Bvc2FibGVbXSA9IFtdO1xuXG4gICAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICAgICAgd2hpbGUgKHRoaXMuZGlzcG9zYWJsZXMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmRpc3Bvc2FibGVzLnBvcCgpIS5kaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdXNoKGRpc3Bvc2FibGU6IERpc3Bvc2FibGUpOiBEaXNwb3NhYmxlIHtcbiAgICAgICAgY29uc3QgZGlzcG9zYWJsZXMgPSB0aGlzLmRpc3Bvc2FibGVzO1xuICAgICAgICBkaXNwb3NhYmxlcy5wdXNoKGRpc3Bvc2FibGUpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IGRpc3Bvc2FibGVzLmluZGV4T2YoZGlzcG9zYWJsZSk7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG59XG4iLCAiLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgMjAyNCBUeXBlRm94IGFuZCBvdGhlcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMSUNFTlNFIGluIHRoZSBwYWNrYWdlIHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuaW1wb3J0IHsgRGlzcG9zYWJsZSB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcbmltcG9ydCB0eXBlIHsgSUNvbm5lY3Rpb24gfSBmcm9tICcuLi9zZXJ2ZXIvY29ubmVjdGlvbi5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVdlYlNvY2tldCBleHRlbmRzIERpc3Bvc2FibGUge1xuICAgIHNlbmQoY29udGVudDogc3RyaW5nKTogdm9pZDtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIG9uTWVzc2FnZShjYjogKGRhdGE6IGFueSkgPT4gdm9pZCk6IHZvaWQ7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBvbkVycm9yKGNiOiAocmVhc29uOiBhbnkpID0+IHZvaWQpOiB2b2lkO1xuICAgIG9uQ2xvc2UoY2I6IChjb2RlOiBudW1iZXIsIHJlYXNvbjogc3RyaW5nKSA9PiB2b2lkKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJV2ViU29ja2V0Q29ubmVjdGlvbiBleHRlbmRzIElDb25uZWN0aW9uIHtcbiAgICByZWFkb25seSBzb2NrZXQ6IElXZWJTb2NrZXQ7XG59XG4iLCAiLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgMjAyNCBUeXBlRm94IGFuZCBvdGhlcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMSUNFTlNFIGluIHRoZSBwYWNrYWdlIHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuaW1wb3J0IHsgRGlzcG9zYWJsZSB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcbi8vIFRPRE86IFVzZSBlbnZpcm9ubWVudC1zcGVjaWZpYyBpbXBvcnRzICh2c2NvZGUtanNvbnJwYy9icm93c2VyIG9yIHZzY29kZS1qc29ucnBjL25vZGUpXG4vLyB3aGVuIHVwZ3JhZGluZyB0byB2c2NvZGUtanNvbnJwY0A5LngueC1uZXh0Llggd2hpY2ggc3VwcG9ydHMgcHJvcGVyIGV4cG9ydCBtYXBzXG5pbXBvcnQgeyB0eXBlIERhdGFDYWxsYmFjaywgQWJzdHJhY3RNZXNzYWdlUmVhZGVyLCBNZXNzYWdlUmVhZGVyIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuaW1wb3J0IHR5cGUgeyBJV2ViU29ja2V0IH0gZnJvbSAnLi9zb2NrZXQuanMnO1xuXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0TWVzc2FnZVJlYWRlciBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVJlYWRlciBpbXBsZW1lbnRzIE1lc3NhZ2VSZWFkZXIge1xuICAgIHByb3RlY3RlZCByZWFkb25seSBzb2NrZXQ6IElXZWJTb2NrZXQ7XG4gICAgcHJvdGVjdGVkIHN0YXRlOiAnaW5pdGlhbCcgfCAnbGlzdGVuaW5nJyB8ICdjbG9zZWQnID0gJ2luaXRpYWwnO1xuICAgIHByb3RlY3RlZCBjYWxsYmFjazogRGF0YUNhbGxiYWNrIHwgdW5kZWZpbmVkO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGV2ZW50czogQXJyYXk8eyBtZXNzYWdlPzogYW55LCBlcnJvcj86IGFueSB9PiA9IFtdO1xuXG4gICAgY29uc3RydWN0b3Ioc29ja2V0OiBJV2ViU29ja2V0KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuc29ja2V0ID0gc29ja2V0O1xuICAgICAgICB0aGlzLnNvY2tldC5vbk1lc3NhZ2UobWVzc2FnZSA9PlxuICAgICAgICAgICAgdGhpcy5yZWFkTWVzc2FnZShtZXNzYWdlKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLnNvY2tldC5vbkVycm9yKGVycm9yID0+XG4gICAgICAgICAgICB0aGlzLmZpcmVFcnJvcihlcnJvcilcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zb2NrZXQub25DbG9zZSgoY29kZSwgcmVhc29uKSA9PiB7XG4gICAgICAgICAgICBpZiAoY29kZSAhPT0gMTAwMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yOiBFcnJvciA9IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJycgKyBjb2RlLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgRXJyb3IgZHVyaW5nIHNvY2tldCByZWNvbm5lY3Q6IGNvZGUgPSAke2NvZGV9LCByZWFzb24gPSAke3JlYXNvbn1gXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmVFcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmZpcmVDbG9zZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBsaXN0ZW4oY2FsbGJhY2s6IERhdGFDYWxsYmFjayk6IERpc3Bvc2FibGUge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gJ2luaXRpYWwnKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gJ2xpc3RlbmluZyc7XG4gICAgICAgICAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgICAgICAgICB3aGlsZSAodGhpcy5ldmVudHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnQgPSB0aGlzLmV2ZW50cy5wb3AoKSE7XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50Lm1lc3NhZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlYWRNZXNzYWdlKGV2ZW50Lm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuZXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmVFcnJvcihldmVudC5lcnJvcik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlQ2xvc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jYWxsYmFjayA9PT0gY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9ICdpbml0aWFsJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjayA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgZGlzcG9zZSgpIHtcbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLnN0YXRlID0gJ2luaXRpYWwnO1xuICAgICAgICB0aGlzLmNhbGxiYWNrID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmV2ZW50cy5zcGxpY2UoMCwgdGhpcy5ldmVudHMubGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHByb3RlY3RlZCByZWFkTWVzc2FnZShtZXNzYWdlOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09ICdpbml0aWFsJykge1xuICAgICAgICAgICAgdGhpcy5ldmVudHMuc3BsaWNlKDAsIDAsIHsgbWVzc2FnZSB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlID09PSAnbGlzdGVuaW5nJykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNhbGxiYWNrIShkYXRhKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yOiBFcnJvciA9IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJycgKyA0MDAsXG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBFcnJvciBkdXJpbmcgbWVzc2FnZSBwYXJzaW5nLCByZWFzb24gPSAke3R5cGVvZiBlcnIgPT09ICdvYmplY3QnID8gKGVyciBhcyBhbnkpLm1lc3NhZ2UgOiAndW5rbm93bid9YFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZmlyZUVycm9yKGVycm9yOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09ICdpbml0aWFsJykge1xuICAgICAgICAgICAgdGhpcy5ldmVudHMuc3BsaWNlKDAsIDAsIHsgZXJyb3IgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZSA9PT0gJ2xpc3RlbmluZycpIHtcbiAgICAgICAgICAgIHN1cGVyLmZpcmVFcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZmlyZUNsb3NlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gJ2luaXRpYWwnKSB7XG4gICAgICAgICAgICB0aGlzLmV2ZW50cy5zcGxpY2UoMCwgMCwge30pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUgPT09ICdsaXN0ZW5pbmcnKSB7XG4gICAgICAgICAgICBzdXBlci5maXJlQ2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0YXRlID0gJ2Nsb3NlZCc7XG4gICAgfVxufVxuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjQgVHlwZUZveCBhbmQgb3RoZXJzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTElDRU5TRSBpbiB0aGUgcGFja2FnZSByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbmltcG9ydCB7IE1lc3NhZ2UgfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG5pbXBvcnQgeyBBYnN0cmFjdE1lc3NhZ2VXcml0ZXIsIE1lc3NhZ2VXcml0ZXIgfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG5pbXBvcnQgdHlwZSB7IElXZWJTb2NrZXQgfSBmcm9tICcuL3NvY2tldC5qcyc7XG5cbmV4cG9ydCBjbGFzcyBXZWJTb2NrZXRNZXNzYWdlV3JpdGVyIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlV3JpdGVyIGltcGxlbWVudHMgTWVzc2FnZVdyaXRlciB7XG4gICAgcHJvdGVjdGVkIGVycm9yQ291bnQgPSAwO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBzb2NrZXQ6IElXZWJTb2NrZXQ7XG5cbiAgICBjb25zdHJ1Y3Rvcihzb2NrZXQ6IElXZWJTb2NrZXQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7XG4gICAgfVxuXG4gICAgZW5kKCk6IHZvaWQge1xuICAgIH1cblxuICAgIGFzeW5jIHdyaXRlKG1zZzogTWVzc2FnZSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgY29udGVudCA9IEpTT04uc3RyaW5naWZ5KG1zZyk7XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKGNvbnRlbnQpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmVycm9yQ291bnQrKztcbiAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGUsIG1zZywgdGhpcy5lcnJvckNvdW50KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICIvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSAyMDI0IFR5cGVGb3ggYW5kIG90aGVycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExJQ0VOU0UgaW4gdGhlIHBhY2thZ2Ugcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5pbXBvcnQgdHlwZSB7IE1lc3NhZ2VDb25uZWN0aW9uLCBMb2dnZXIgfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG5pbXBvcnQgeyBjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcbmltcG9ydCB0eXBlIHsgSVdlYlNvY2tldCB9IGZyb20gJy4vc29ja2V0LmpzJztcbmltcG9ydCB7IFdlYlNvY2tldE1lc3NhZ2VSZWFkZXIgfSBmcm9tICcuL3JlYWRlci5qcyc7XG5pbXBvcnQgeyBXZWJTb2NrZXRNZXNzYWdlV3JpdGVyIH0gZnJvbSAnLi93cml0ZXIuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlV2ViU29ja2V0Q29ubmVjdGlvbihzb2NrZXQ6IElXZWJTb2NrZXQsIGxvZ2dlcjogTG9nZ2VyKTogTWVzc2FnZUNvbm5lY3Rpb24ge1xuICAgIGNvbnN0IG1lc3NhZ2VSZWFkZXIgPSBuZXcgV2ViU29ja2V0TWVzc2FnZVJlYWRlcihzb2NrZXQpO1xuICAgIGNvbnN0IG1lc3NhZ2VXcml0ZXIgPSBuZXcgV2ViU29ja2V0TWVzc2FnZVdyaXRlcihzb2NrZXQpO1xuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbihtZXNzYWdlUmVhZGVyLCBtZXNzYWdlV3JpdGVyLCBsb2dnZXIpO1xuICAgIGNvbm5lY3Rpb24ub25DbG9zZSgoKSA9PiBjb25uZWN0aW9uLmRpc3Bvc2UoKSk7XG4gICAgcmV0dXJuIGNvbm5lY3Rpb247XG59XG4iLCAiLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgMjAyNCBUeXBlRm94IGFuZCBvdGhlcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMSUNFTlNFIGluIHRoZSBwYWNrYWdlIHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuaW1wb3J0IHR5cGUgeyBNZXNzYWdlQ29ubmVjdGlvbiwgTG9nZ2VyIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuaW1wb3J0IHsgY3JlYXRlV2ViU29ja2V0Q29ubmVjdGlvbiB9IGZyb20gJy4vc29ja2V0L2Nvbm5lY3Rpb24uanMnO1xuaW1wb3J0IHR5cGUgeyBJV2ViU29ja2V0IH0gZnJvbSAnLi9zb2NrZXQvc29ja2V0LmpzJztcbmltcG9ydCB7IENvbnNvbGVMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBsaXN0ZW4ob3B0aW9uczoge1xuICAgIHdlYlNvY2tldDogV2ViU29ja2V0O1xuICAgIGxvZ2dlcj86IExvZ2dlcjtcbiAgICBvbkNvbm5lY3Rpb246IChjb25uZWN0aW9uOiBNZXNzYWdlQ29ubmVjdGlvbikgPT4gdm9pZDtcbn0pIHtcbiAgICBjb25zdCB7IHdlYlNvY2tldCwgb25Db25uZWN0aW9uIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IGxvZ2dlciA9IG9wdGlvbnMubG9nZ2VyIHx8IG5ldyBDb25zb2xlTG9nZ2VyKCk7XG4gICAgd2ViU29ja2V0Lm9ub3BlbiA9ICgpID0+IHtcbiAgICAgICAgY29uc3Qgc29ja2V0ID0gdG9Tb2NrZXQod2ViU29ja2V0KTtcbiAgICAgICAgY29uc3QgY29ubmVjdGlvbiA9IGNyZWF0ZVdlYlNvY2tldENvbm5lY3Rpb24oc29ja2V0LCBsb2dnZXIpO1xuICAgICAgICBvbkNvbm5lY3Rpb24oY29ubmVjdGlvbik7XG4gICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvU29ja2V0KHdlYlNvY2tldDogV2ViU29ja2V0KTogSVdlYlNvY2tldCB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc2VuZDogY29udGVudCA9PiB3ZWJTb2NrZXQuc2VuZChjb250ZW50KSxcbiAgICAgICAgb25NZXNzYWdlOiBjYiA9PiB7XG4gICAgICAgICAgICB3ZWJTb2NrZXQub25tZXNzYWdlID0gZXZlbnQgPT4gY2IoZXZlbnQuZGF0YSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uRXJyb3I6IGNiID0+IHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICB3ZWJTb2NrZXQub25lcnJvciA9IChldmVudDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5oYXNPd24oZXZlbnQsICdtZXNzYWdlJykpIHtcbiAgICAgICAgICAgICAgICAgICAgY2IoZXZlbnQubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgb25DbG9zZTogY2IgPT4ge1xuICAgICAgICAgICAgd2ViU29ja2V0Lm9uY2xvc2UgPSBldmVudCA9PiBjYihldmVudC5jb2RlLCBldmVudC5yZWFzb24pO1xuICAgICAgICB9LFxuICAgICAgICBkaXNwb3NlOiAoKSA9PiB3ZWJTb2NrZXQuY2xvc2UoKVxuICAgIH07XG59XG4iLCAiLypcbiAqIENvcHlyaWdodCAoYykgMjAxMC0yMDI2IEVjbGlwc2UgRGlyaWdpYmxlIGNvbnRyaWJ1dG9yc1xuICpcbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZVxuICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjIuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjIwLmh0bWxcbiAqXG4gKiBTUERYLUZpbGVDb3B5cmlnaHRUZXh0OiBFY2xpcHNlIERpcmlnaWJsZSBjb250cmlidXRvcnMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjBcbiAqL1xuXG4vKipcbiAqIExhenkgUHJveHkgc2hpbSBmb3IgTW9uYWNvIEVkaXRvciBsb2FkZWQgdmlhIEFNRC5cbiAqXG4gKiBlZGl0b3IuanMgc2V0cyBnbG9iYWxUaGlzLm1vbmFjbyBpbnNpZGUgdGhlIEFNRCByZXF1aXJlKCkgY2FsbGJhY2ssIGJlZm9yZSBhbnlcbiAqIEphdmFMc3BDbGllbnRMaWIuY29ubmVjdCgpIGNhbGwuIEFsbCBwcm9wZXJ0eSBhY2Nlc3NlcyBnbyB0aHJvdWdoIFByb3h5LmdldCgpIHRyYXBzXG4gKiBzbyB0aGV5IHJlc29sdmUgYWdhaW5zdCB0aGUgbGl2ZSB3aW5kb3cubW9uYWNvIGF0IGNhbGwgdGltZSwgbm90IGF0IGJ1bmRsZSBsb2FkIHRpbWUuXG4gKlxuICogVHlwZVNjcmlwdCByZXNvbHZlcyB0eXBlcyBmcm9tIHRoZSByZWFsIG1vbmFjby1lZGl0b3IgZGV2RGVwZW5kZW5jeTsgZXNidWlsZCByZXBsYWNlc1xuICogdGhlIFwibW9uYWNvLWVkaXRvclwiIGltcG9ydCB3aXRoIHRoaXMgZmlsZSBhdCBidW5kbGUgdGltZSB2aWEgdGhlIGFsaWFzIG9wdGlvbi5cbiAqL1xuXG50eXBlIE0gPSB0eXBlb2YgaW1wb3J0KCdtb25hY28tZWRpdG9yJyk7XG5cbmZ1bmN0aW9uIG0oKTogTSB7XG4gICAgcmV0dXJuIChnbG9iYWxUaGlzIGFzIGFueSkubW9uYWNvIGFzIE07XG59XG5cbmZ1bmN0aW9uIG5zPFQgZXh0ZW5kcyBvYmplY3Q+KGdldHRlcjogKCkgPT4gVCk6IFQge1xuICAgIHJldHVybiBuZXcgUHJveHkoe30gYXMgVCwge1xuICAgICAgICBnZXQ6IChfLCBrKSA9PiAoZ2V0dGVyKCkgYXMgYW55KVtrIGFzIHN0cmluZ10sXG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGNsczxUPihnZXR0ZXI6ICgpID0+IFQpOiBUIHtcbiAgICByZXR1cm4gbmV3IFByb3h5KGZ1bmN0aW9uICgpIHt9IGFzIGFueSwge1xuICAgICAgICBjb25zdHJ1Y3Q6IChfLCBhcmdzKSA9PiBuZXcgKGdldHRlcigpIGFzIGFueSkoLi4uYXJncyksXG4gICAgICAgIGdldDogICAgICAgKF8sIGspICAgID0+IChnZXR0ZXIoKSBhcyBhbnkpW2sgYXMgc3RyaW5nXSxcbiAgICB9KSBhcyBUO1xufVxuXG5leHBvcnQgY29uc3QgZWRpdG9yICAgICAgICAgPSBucygoKSA9PiBtKCkuZWRpdG9yKTtcbmV4cG9ydCBjb25zdCBsYW5ndWFnZXMgICAgICA9IG5zKCgpID0+IG0oKS5sYW5ndWFnZXMpO1xuZXhwb3J0IGNvbnN0IE1hcmtlclNldmVyaXR5ID0gbnMoKCkgPT4gbSgpLk1hcmtlclNldmVyaXR5KTtcbmV4cG9ydCBjb25zdCBNYXJrZXJUYWcgICAgICA9IG5zKCgpID0+IChtKCkgYXMgYW55KS5NYXJrZXJUYWcpO1xuZXhwb3J0IGNvbnN0IFVyaSAgICAgICAgICAgID0gY2xzKCgpID0+IG0oKS5VcmkpO1xuZXhwb3J0IGNvbnN0IFJhbmdlICAgICAgICAgID0gY2xzKCgpID0+IG0oKS5SYW5nZSk7XG5leHBvcnQgY29uc3QgUG9zaXRpb24gICAgICAgPSBjbHMoKCkgPT4gbSgpLlBvc2l0aW9uKTtcbmV4cG9ydCBjb25zdCBTZWxlY3Rpb24gICAgICA9IGNscygoKSA9PiBtKCkuU2VsZWN0aW9uKTtcbmV4cG9ydCBjb25zdCBLZXlDb2RlICAgICAgICA9IG5zKCgpID0+IG0oKS5LZXlDb2RlKTtcbmV4cG9ydCBjb25zdCBLZXlNb2QgICAgICAgICA9IG5zKCgpID0+IG0oKS5LZXlNb2QpO1xuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbid1c2Ugc3RyaWN0JztcbmV4cG9ydCB2YXIgRG9jdW1lbnRVcmk7XG4oZnVuY3Rpb24gKERvY3VtZW50VXJpKSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZyc7XG4gICAgfVxuICAgIERvY3VtZW50VXJpLmlzID0gaXM7XG59KShEb2N1bWVudFVyaSB8fCAoRG9jdW1lbnRVcmkgPSB7fSkpO1xuZXhwb3J0IHZhciBVUkk7XG4oZnVuY3Rpb24gKFVSSSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnO1xuICAgIH1cbiAgICBVUkkuaXMgPSBpcztcbn0pKFVSSSB8fCAoVVJJID0ge30pKTtcbmV4cG9ydCB2YXIgaW50ZWdlcjtcbihmdW5jdGlvbiAoaW50ZWdlcikge1xuICAgIGludGVnZXIuTUlOX1ZBTFVFID0gLTIxNDc0ODM2NDg7XG4gICAgaW50ZWdlci5NQVhfVkFMVUUgPSAyMTQ3NDgzNjQ3O1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIGludGVnZXIuTUlOX1ZBTFVFIDw9IHZhbHVlICYmIHZhbHVlIDw9IGludGVnZXIuTUFYX1ZBTFVFO1xuICAgIH1cbiAgICBpbnRlZ2VyLmlzID0gaXM7XG59KShpbnRlZ2VyIHx8IChpbnRlZ2VyID0ge30pKTtcbmV4cG9ydCB2YXIgdWludGVnZXI7XG4oZnVuY3Rpb24gKHVpbnRlZ2VyKSB7XG4gICAgdWludGVnZXIuTUlOX1ZBTFVFID0gMDtcbiAgICB1aW50ZWdlci5NQVhfVkFMVUUgPSAyMTQ3NDgzNjQ3O1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIHVpbnRlZ2VyLk1JTl9WQUxVRSA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSB1aW50ZWdlci5NQVhfVkFMVUU7XG4gICAgfVxuICAgIHVpbnRlZ2VyLmlzID0gaXM7XG59KSh1aW50ZWdlciB8fCAodWludGVnZXIgPSB7fSkpO1xuLyoqXG4gKiBUaGUgUG9zaXRpb24gbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgUG9zaXRpb259IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIFBvc2l0aW9uO1xuKGZ1bmN0aW9uIChQb3NpdGlvbikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgUG9zaXRpb24gbGl0ZXJhbCBmcm9tIHRoZSBnaXZlbiBsaW5lIGFuZCBjaGFyYWN0ZXIuXG4gICAgICogQHBhcmFtIGxpbmUgVGhlIHBvc2l0aW9uJ3MgbGluZS5cbiAgICAgKiBAcGFyYW0gY2hhcmFjdGVyIFRoZSBwb3NpdGlvbidzIGNoYXJhY3Rlci5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobGluZSwgY2hhcmFjdGVyKSB7XG4gICAgICAgIGlmIChsaW5lID09PSBOdW1iZXIuTUFYX1ZBTFVFKSB7XG4gICAgICAgICAgICBsaW5lID0gdWludGVnZXIuTUFYX1ZBTFVFO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFyYWN0ZXIgPT09IE51bWJlci5NQVhfVkFMVUUpIHtcbiAgICAgICAgICAgIGNoYXJhY3RlciA9IHVpbnRlZ2VyLk1BWF9WQUxVRTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBsaW5lLCBjaGFyYWN0ZXIgfTtcbiAgICB9XG4gICAgUG9zaXRpb24uY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgUG9zaXRpb259IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgSXMudWludGVnZXIoY2FuZGlkYXRlLmxpbmUpICYmIElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS5jaGFyYWN0ZXIpO1xuICAgIH1cbiAgICBQb3NpdGlvbi5pcyA9IGlzO1xufSkoUG9zaXRpb24gfHwgKFBvc2l0aW9uID0ge30pKTtcbi8qKlxuICogVGhlIFJhbmdlIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIFJhbmdlfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBSYW5nZTtcbihmdW5jdGlvbiAoUmFuZ2UpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUob25lLCB0d28sIHRocmVlLCBmb3VyKSB7XG4gICAgICAgIGlmIChJcy51aW50ZWdlcihvbmUpICYmIElzLnVpbnRlZ2VyKHR3bykgJiYgSXMudWludGVnZXIodGhyZWUpICYmIElzLnVpbnRlZ2VyKGZvdXIpKSB7XG4gICAgICAgICAgICByZXR1cm4geyBzdGFydDogUG9zaXRpb24uY3JlYXRlKG9uZSwgdHdvKSwgZW5kOiBQb3NpdGlvbi5jcmVhdGUodGhyZWUsIGZvdXIpIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoUG9zaXRpb24uaXMob25lKSAmJiBQb3NpdGlvbi5pcyh0d28pKSB7XG4gICAgICAgICAgICByZXR1cm4geyBzdGFydDogb25lLCBlbmQ6IHR3byB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSYW5nZSNjcmVhdGUgY2FsbGVkIHdpdGggaW52YWxpZCBhcmd1bWVudHNbJHtvbmV9LCAke3R3b30sICR7dGhyZWV9LCAke2ZvdXJ9XWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIFJhbmdlLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIFJhbmdlfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIFBvc2l0aW9uLmlzKGNhbmRpZGF0ZS5zdGFydCkgJiYgUG9zaXRpb24uaXMoY2FuZGlkYXRlLmVuZCk7XG4gICAgfVxuICAgIFJhbmdlLmlzID0gaXM7XG59KShSYW5nZSB8fCAoUmFuZ2UgPSB7fSkpO1xuLyoqXG4gKiBUaGUgTG9jYXRpb24gbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgTG9jYXRpb259IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIExvY2F0aW9uO1xuKGZ1bmN0aW9uIChMb2NhdGlvbikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBMb2NhdGlvbiBsaXRlcmFsLlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIGxvY2F0aW9uJ3MgdXJpLlxuICAgICAqIEBwYXJhbSByYW5nZSBUaGUgbG9jYXRpb24ncyByYW5nZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodXJpLCByYW5nZSkge1xuICAgICAgICByZXR1cm4geyB1cmksIHJhbmdlIH07XG4gICAgfVxuICAgIExvY2F0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIExvY2F0aW9ufSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgKElzLnN0cmluZyhjYW5kaWRhdGUudXJpKSB8fCBJcy51bmRlZmluZWQoY2FuZGlkYXRlLnVyaSkpO1xuICAgIH1cbiAgICBMb2NhdGlvbi5pcyA9IGlzO1xufSkoTG9jYXRpb24gfHwgKExvY2F0aW9uID0ge30pKTtcbi8qKlxuICogVGhlIExvY2F0aW9uTGluayBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBMb2NhdGlvbkxpbmt9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIExvY2F0aW9uTGluaztcbihmdW5jdGlvbiAoTG9jYXRpb25MaW5rKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIExvY2F0aW9uTGluayBsaXRlcmFsLlxuICAgICAqIEBwYXJhbSB0YXJnZXRVcmkgVGhlIGRlZmluaXRpb24ncyB1cmkuXG4gICAgICogQHBhcmFtIHRhcmdldFJhbmdlIFRoZSBmdWxsIHJhbmdlIG9mIHRoZSBkZWZpbml0aW9uLlxuICAgICAqIEBwYXJhbSB0YXJnZXRTZWxlY3Rpb25SYW5nZSBUaGUgc3BhbiBvZiB0aGUgc3ltYm9sIGRlZmluaXRpb24gYXQgdGhlIHRhcmdldC5cbiAgICAgKiBAcGFyYW0gb3JpZ2luU2VsZWN0aW9uUmFuZ2UgVGhlIHNwYW4gb2YgdGhlIHN5bWJvbCBiZWluZyBkZWZpbmVkIGluIHRoZSBvcmlnaW5hdGluZyBzb3VyY2UgZmlsZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodGFyZ2V0VXJpLCB0YXJnZXRSYW5nZSwgdGFyZ2V0U2VsZWN0aW9uUmFuZ2UsIG9yaWdpblNlbGVjdGlvblJhbmdlKSB7XG4gICAgICAgIHJldHVybiB7IHRhcmdldFVyaSwgdGFyZ2V0UmFuZ2UsIHRhcmdldFNlbGVjdGlvblJhbmdlLCBvcmlnaW5TZWxlY3Rpb25SYW5nZSB9O1xuICAgIH1cbiAgICBMb2NhdGlvbkxpbmsuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgTG9jYXRpb25MaW5rfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS50YXJnZXRSYW5nZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS50YXJnZXRVcmkpXG4gICAgICAgICAgICAmJiBSYW5nZS5pcyhjYW5kaWRhdGUudGFyZ2V0U2VsZWN0aW9uUmFuZ2UpXG4gICAgICAgICAgICAmJiAoUmFuZ2UuaXMoY2FuZGlkYXRlLm9yaWdpblNlbGVjdGlvblJhbmdlKSB8fCBJcy51bmRlZmluZWQoY2FuZGlkYXRlLm9yaWdpblNlbGVjdGlvblJhbmdlKSk7XG4gICAgfVxuICAgIExvY2F0aW9uTGluay5pcyA9IGlzO1xufSkoTG9jYXRpb25MaW5rIHx8IChMb2NhdGlvbkxpbmsgPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29sb3IgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgQ29sb3J9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIENvbG9yO1xuKGZ1bmN0aW9uIChDb2xvcikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ29sb3IgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJlZCxcbiAgICAgICAgICAgIGdyZWVuLFxuICAgICAgICAgICAgYmx1ZSxcbiAgICAgICAgICAgIGFscGhhLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBDb2xvci5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBDb2xvcn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIElzLm51bWJlclJhbmdlKGNhbmRpZGF0ZS5yZWQsIDAsIDEpXG4gICAgICAgICAgICAmJiBJcy5udW1iZXJSYW5nZShjYW5kaWRhdGUuZ3JlZW4sIDAsIDEpXG4gICAgICAgICAgICAmJiBJcy5udW1iZXJSYW5nZShjYW5kaWRhdGUuYmx1ZSwgMCwgMSlcbiAgICAgICAgICAgICYmIElzLm51bWJlclJhbmdlKGNhbmRpZGF0ZS5hbHBoYSwgMCwgMSk7XG4gICAgfVxuICAgIENvbG9yLmlzID0gaXM7XG59KShDb2xvciB8fCAoQ29sb3IgPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29sb3JJbmZvcm1hdGlvbiBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBDb2xvckluZm9ybWF0aW9ufSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBDb2xvckluZm9ybWF0aW9uO1xuKGZ1bmN0aW9uIChDb2xvckluZm9ybWF0aW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDb2xvckluZm9ybWF0aW9uIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCBjb2xvcikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmFuZ2UsXG4gICAgICAgICAgICBjb2xvcixcbiAgICAgICAgfTtcbiAgICB9XG4gICAgQ29sb3JJbmZvcm1hdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBDb2xvckluZm9ybWF0aW9ufSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiBDb2xvci5pcyhjYW5kaWRhdGUuY29sb3IpO1xuICAgIH1cbiAgICBDb2xvckluZm9ybWF0aW9uLmlzID0gaXM7XG59KShDb2xvckluZm9ybWF0aW9uIHx8IChDb2xvckluZm9ybWF0aW9uID0ge30pKTtcbi8qKlxuICogVGhlIENvbG9yIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIENvbG9yUHJlc2VudGF0aW9ufSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBDb2xvclByZXNlbnRhdGlvbjtcbihmdW5jdGlvbiAoQ29sb3JQcmVzZW50YXRpb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENvbG9ySW5mb3JtYXRpb24gbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobGFiZWwsIHRleHRFZGl0LCBhZGRpdGlvbmFsVGV4dEVkaXRzKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICAgIHRleHRFZGl0LFxuICAgICAgICAgICAgYWRkaXRpb25hbFRleHRFZGl0cyxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgQ29sb3JQcmVzZW50YXRpb24uY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgQ29sb3JJbmZvcm1hdGlvbn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUubGFiZWwpXG4gICAgICAgICAgICAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS50ZXh0RWRpdCkgfHwgVGV4dEVkaXQuaXMoY2FuZGlkYXRlKSlcbiAgICAgICAgICAgICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLmFkZGl0aW9uYWxUZXh0RWRpdHMpIHx8IElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLmFkZGl0aW9uYWxUZXh0RWRpdHMsIFRleHRFZGl0LmlzKSk7XG4gICAgfVxuICAgIENvbG9yUHJlc2VudGF0aW9uLmlzID0gaXM7XG59KShDb2xvclByZXNlbnRhdGlvbiB8fCAoQ29sb3JQcmVzZW50YXRpb24gPSB7fSkpO1xuLyoqXG4gKiBBIHNldCBvZiBwcmVkZWZpbmVkIHJhbmdlIGtpbmRzLlxuICovXG5leHBvcnQgdmFyIEZvbGRpbmdSYW5nZUtpbmQ7XG4oZnVuY3Rpb24gKEZvbGRpbmdSYW5nZUtpbmQpIHtcbiAgICAvKipcbiAgICAgKiBGb2xkaW5nIHJhbmdlIGZvciBhIGNvbW1lbnRcbiAgICAgKi9cbiAgICBGb2xkaW5nUmFuZ2VLaW5kLkNvbW1lbnQgPSAnY29tbWVudCc7XG4gICAgLyoqXG4gICAgICogRm9sZGluZyByYW5nZSBmb3IgYW4gaW1wb3J0IG9yIGluY2x1ZGVcbiAgICAgKi9cbiAgICBGb2xkaW5nUmFuZ2VLaW5kLkltcG9ydHMgPSAnaW1wb3J0cyc7XG4gICAgLyoqXG4gICAgICogRm9sZGluZyByYW5nZSBmb3IgYSByZWdpb24gKGUuZy4gYCNyZWdpb25gKVxuICAgICAqL1xuICAgIEZvbGRpbmdSYW5nZUtpbmQuUmVnaW9uID0gJ3JlZ2lvbic7XG59KShGb2xkaW5nUmFuZ2VLaW5kIHx8IChGb2xkaW5nUmFuZ2VLaW5kID0ge30pKTtcbi8qKlxuICogVGhlIGZvbGRpbmcgcmFuZ2UgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgRm9sZGluZ1JhbmdlfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBGb2xkaW5nUmFuZ2U7XG4oZnVuY3Rpb24gKEZvbGRpbmdSYW5nZSkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgRm9sZGluZ1JhbmdlIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHN0YXJ0TGluZSwgZW5kTGluZSwgc3RhcnRDaGFyYWN0ZXIsIGVuZENoYXJhY3Rlciwga2luZCwgY29sbGFwc2VkVGV4dCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICBzdGFydExpbmUsXG4gICAgICAgICAgICBlbmRMaW5lXG4gICAgICAgIH07XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKHN0YXJ0Q2hhcmFjdGVyKSkge1xuICAgICAgICAgICAgcmVzdWx0LnN0YXJ0Q2hhcmFjdGVyID0gc3RhcnRDaGFyYWN0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzLmRlZmluZWQoZW5kQ2hhcmFjdGVyKSkge1xuICAgICAgICAgICAgcmVzdWx0LmVuZENoYXJhY3RlciA9IGVuZENoYXJhY3RlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXMuZGVmaW5lZChraW5kKSkge1xuICAgICAgICAgICAgcmVzdWx0LmtpbmQgPSBraW5kO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKGNvbGxhcHNlZFRleHQpKSB7XG4gICAgICAgICAgICByZXN1bHQuY29sbGFwc2VkVGV4dCA9IGNvbGxhcHNlZFRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgRm9sZGluZ1JhbmdlLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIEZvbGRpbmdSYW5nZX0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS5zdGFydExpbmUpICYmIElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS5zdGFydExpbmUpXG4gICAgICAgICAgICAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5zdGFydENoYXJhY3RlcikgfHwgSXMudWludGVnZXIoY2FuZGlkYXRlLnN0YXJ0Q2hhcmFjdGVyKSlcbiAgICAgICAgICAgICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLmVuZENoYXJhY3RlcikgfHwgSXMudWludGVnZXIoY2FuZGlkYXRlLmVuZENoYXJhY3RlcikpXG4gICAgICAgICAgICAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5raW5kKSB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLmtpbmQpKTtcbiAgICB9XG4gICAgRm9sZGluZ1JhbmdlLmlzID0gaXM7XG59KShGb2xkaW5nUmFuZ2UgfHwgKEZvbGRpbmdSYW5nZSA9IHt9KSk7XG4vKipcbiAqIFRoZSBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb259IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb247XG4oZnVuY3Rpb24gKERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24gbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobG9jYXRpb24sIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxvY2F0aW9uLFxuICAgICAgICAgICAgbWVzc2FnZVxuICAgICAgICB9O1xuICAgIH1cbiAgICBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb259IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgTG9jYXRpb24uaXMoY2FuZGlkYXRlLmxvY2F0aW9uKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLm1lc3NhZ2UpO1xuICAgIH1cbiAgICBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uLmlzID0gaXM7XG59KShEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uIHx8IChEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uID0ge30pKTtcbi8qKlxuICogVGhlIGRpYWdub3N0aWMncyBzZXZlcml0eS5cbiAqL1xuZXhwb3J0IHZhciBEaWFnbm9zdGljU2V2ZXJpdHk7XG4oZnVuY3Rpb24gKERpYWdub3N0aWNTZXZlcml0eSkge1xuICAgIC8qKlxuICAgICAqIFJlcG9ydHMgYW4gZXJyb3IuXG4gICAgICovXG4gICAgRGlhZ25vc3RpY1NldmVyaXR5LkVycm9yID0gMTtcbiAgICAvKipcbiAgICAgKiBSZXBvcnRzIGEgd2FybmluZy5cbiAgICAgKi9cbiAgICBEaWFnbm9zdGljU2V2ZXJpdHkuV2FybmluZyA9IDI7XG4gICAgLyoqXG4gICAgICogUmVwb3J0cyBhbiBpbmZvcm1hdGlvbi5cbiAgICAgKi9cbiAgICBEaWFnbm9zdGljU2V2ZXJpdHkuSW5mb3JtYXRpb24gPSAzO1xuICAgIC8qKlxuICAgICAqIFJlcG9ydHMgYSBoaW50LlxuICAgICAqL1xuICAgIERpYWdub3N0aWNTZXZlcml0eS5IaW50ID0gNDtcbn0pKERpYWdub3N0aWNTZXZlcml0eSB8fCAoRGlhZ25vc3RpY1NldmVyaXR5ID0ge30pKTtcbi8qKlxuICogVGhlIGRpYWdub3N0aWMgdGFncy5cbiAqXG4gKiBAc2luY2UgMy4xNS4wXG4gKi9cbmV4cG9ydCB2YXIgRGlhZ25vc3RpY1RhZztcbihmdW5jdGlvbiAoRGlhZ25vc3RpY1RhZykge1xuICAgIC8qKlxuICAgICAqIFVudXNlZCBvciB1bm5lY2Vzc2FyeSBjb2RlLlxuICAgICAqXG4gICAgICogQ2xpZW50cyBhcmUgYWxsb3dlZCB0byByZW5kZXIgZGlhZ25vc3RpY3Mgd2l0aCB0aGlzIHRhZyBmYWRlZCBvdXQgaW5zdGVhZCBvZiBoYXZpbmdcbiAgICAgKiBhbiBlcnJvciBzcXVpZ2dsZS5cbiAgICAgKi9cbiAgICBEaWFnbm9zdGljVGFnLlVubmVjZXNzYXJ5ID0gMTtcbiAgICAvKipcbiAgICAgKiBEZXByZWNhdGVkIG9yIG9ic29sZXRlIGNvZGUuXG4gICAgICpcbiAgICAgKiBDbGllbnRzIGFyZSBhbGxvd2VkIHRvIHJlbmRlcmVkIGRpYWdub3N0aWNzIHdpdGggdGhpcyB0YWcgc3RyaWtlIHRocm91Z2guXG4gICAgICovXG4gICAgRGlhZ25vc3RpY1RhZy5EZXByZWNhdGVkID0gMjtcbn0pKERpYWdub3N0aWNUYWcgfHwgKERpYWdub3N0aWNUYWcgPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29kZURlc2NyaXB0aW9uIG5hbWVzcGFjZSBwcm92aWRlcyBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIGRlc2NyaXB0aW9ucyBmb3IgZGlhZ25vc3RpYyBjb2Rlcy5cbiAqXG4gKiBAc2luY2UgMy4xNi4wXG4gKi9cbmV4cG9ydCB2YXIgQ29kZURlc2NyaXB0aW9uO1xuKGZ1bmN0aW9uIChDb2RlRGVzY3JpcHRpb24pIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLmhyZWYpO1xuICAgIH1cbiAgICBDb2RlRGVzY3JpcHRpb24uaXMgPSBpcztcbn0pKENvZGVEZXNjcmlwdGlvbiB8fCAoQ29kZURlc2NyaXB0aW9uID0ge30pKTtcbi8qKlxuICogVGhlIERpYWdub3N0aWMgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgRGlhZ25vc3RpY30gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgRGlhZ25vc3RpYztcbihmdW5jdGlvbiAoRGlhZ25vc3RpYykge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgRGlhZ25vc3RpYyBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgbWVzc2FnZSwgc2V2ZXJpdHksIGNvZGUsIHNvdXJjZSwgcmVsYXRlZEluZm9ybWF0aW9uKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IHJhbmdlLCBtZXNzYWdlIH07XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKHNldmVyaXR5KSkge1xuICAgICAgICAgICAgcmVzdWx0LnNldmVyaXR5ID0gc2V2ZXJpdHk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzLmRlZmluZWQoY29kZSkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5jb2RlID0gY29kZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXMuZGVmaW5lZChzb3VyY2UpKSB7XG4gICAgICAgICAgICByZXN1bHQuc291cmNlID0gc291cmNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKHJlbGF0ZWRJbmZvcm1hdGlvbikpIHtcbiAgICAgICAgICAgIHJlc3VsdC5yZWxhdGVkSW5mb3JtYXRpb24gPSByZWxhdGVkSW5mb3JtYXRpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgRGlhZ25vc3RpYy5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBEaWFnbm9zdGljfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSlcbiAgICAgICAgICAgICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSlcbiAgICAgICAgICAgICYmIElzLnN0cmluZyhjYW5kaWRhdGUubWVzc2FnZSlcbiAgICAgICAgICAgICYmIChJcy5udW1iZXIoY2FuZGlkYXRlLnNldmVyaXR5KSB8fCBJcy51bmRlZmluZWQoY2FuZGlkYXRlLnNldmVyaXR5KSlcbiAgICAgICAgICAgICYmIChJcy5pbnRlZ2VyKGNhbmRpZGF0ZS5jb2RlKSB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLmNvZGUpIHx8IElzLnVuZGVmaW5lZChjYW5kaWRhdGUuY29kZSkpXG4gICAgICAgICAgICAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5jb2RlRGVzY3JpcHRpb24pIHx8IChJcy5zdHJpbmcoKF9hID0gY2FuZGlkYXRlLmNvZGVEZXNjcmlwdGlvbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmhyZWYpKSlcbiAgICAgICAgICAgICYmIChJcy5zdHJpbmcoY2FuZGlkYXRlLnNvdXJjZSkgfHwgSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5zb3VyY2UpKVxuICAgICAgICAgICAgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUucmVsYXRlZEluZm9ybWF0aW9uKSB8fCBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS5yZWxhdGVkSW5mb3JtYXRpb24sIERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24uaXMpKTtcbiAgICB9XG4gICAgRGlhZ25vc3RpYy5pcyA9IGlzO1xufSkoRGlhZ25vc3RpYyB8fCAoRGlhZ25vc3RpYyA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb21tYW5kIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIENvbW1hbmR9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIENvbW1hbmQ7XG4oZnVuY3Rpb24gKENvbW1hbmQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENvbW1hbmQgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodGl0bGUsIGNvbW1hbmQsIC4uLmFyZ3MpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHsgdGl0bGUsIGNvbW1hbmQgfTtcbiAgICAgICAgaWYgKElzLmRlZmluZWQoYXJncykgJiYgYXJncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXN1bHQuYXJndW1lbnRzID0gYXJncztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBDb21tYW5kLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIENvbW1hbmR9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS50aXRsZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5jb21tYW5kKTtcbiAgICB9XG4gICAgQ29tbWFuZC5pcyA9IGlzO1xufSkoQ29tbWFuZCB8fCAoQ29tbWFuZCA9IHt9KSk7XG4vKipcbiAqIFRoZSBUZXh0RWRpdCBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSByZXBsYWNlLFxuICogaW5zZXJ0IGFuZCBkZWxldGUgZWRpdHMgbW9yZSBlYXNpbHkuXG4gKi9cbmV4cG9ydCB2YXIgVGV4dEVkaXQ7XG4oZnVuY3Rpb24gKFRleHRFZGl0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHJlcGxhY2UgdGV4dCBlZGl0LlxuICAgICAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2Ugb2YgdGV4dCB0byBiZSByZXBsYWNlZC5cbiAgICAgKiBAcGFyYW0gbmV3VGV4dCBUaGUgbmV3IHRleHQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVwbGFjZShyYW5nZSwgbmV3VGV4dCkge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgbmV3VGV4dCB9O1xuICAgIH1cbiAgICBUZXh0RWRpdC5yZXBsYWNlID0gcmVwbGFjZTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc2VydCB0ZXh0IGVkaXQuXG4gICAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBwb3NpdGlvbiB0byBpbnNlcnQgdGhlIHRleHQgYXQuXG4gICAgICogQHBhcmFtIG5ld1RleHQgVGhlIHRleHQgdG8gYmUgaW5zZXJ0ZWQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5zZXJ0KHBvc2l0aW9uLCBuZXdUZXh0KSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlOiB7IHN0YXJ0OiBwb3NpdGlvbiwgZW5kOiBwb3NpdGlvbiB9LCBuZXdUZXh0IH07XG4gICAgfVxuICAgIFRleHRFZGl0Lmluc2VydCA9IGluc2VydDtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZGVsZXRlIHRleHQgZWRpdC5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlIG9mIHRleHQgdG8gYmUgZGVsZXRlZC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkZWwocmFuZ2UpIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIG5ld1RleHQ6ICcnIH07XG4gICAgfVxuICAgIFRleHRFZGl0LmRlbCA9IGRlbDtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKVxuICAgICAgICAgICAgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5uZXdUZXh0KVxuICAgICAgICAgICAgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKTtcbiAgICB9XG4gICAgVGV4dEVkaXQuaXMgPSBpcztcbn0pKFRleHRFZGl0IHx8IChUZXh0RWRpdCA9IHt9KSk7XG5leHBvcnQgdmFyIENoYW5nZUFubm90YXRpb247XG4oZnVuY3Rpb24gKENoYW5nZUFubm90YXRpb24pIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUobGFiZWwsIG5lZWRzQ29uZmlybWF0aW9uLCBkZXNjcmlwdGlvbikge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB7IGxhYmVsIH07XG4gICAgICAgIGlmIChuZWVkc0NvbmZpcm1hdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQubmVlZHNDb25maXJtYXRpb24gPSBuZWVkc0NvbmZpcm1hdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVzY3JpcHRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgQ2hhbmdlQW5ub3RhdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5sYWJlbCkgJiZcbiAgICAgICAgICAgIChJcy5ib29sZWFuKGNhbmRpZGF0ZS5uZWVkc0NvbmZpcm1hdGlvbikgfHwgY2FuZGlkYXRlLm5lZWRzQ29uZmlybWF0aW9uID09PSB1bmRlZmluZWQpICYmXG4gICAgICAgICAgICAoSXMuc3RyaW5nKGNhbmRpZGF0ZS5kZXNjcmlwdGlvbikgfHwgY2FuZGlkYXRlLmRlc2NyaXB0aW9uID09PSB1bmRlZmluZWQpO1xuICAgIH1cbiAgICBDaGFuZ2VBbm5vdGF0aW9uLmlzID0gaXM7XG59KShDaGFuZ2VBbm5vdGF0aW9uIHx8IChDaGFuZ2VBbm5vdGF0aW9uID0ge30pKTtcbmV4cG9ydCB2YXIgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXI7XG4oZnVuY3Rpb24gKENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyKSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5zdHJpbmcoY2FuZGlkYXRlKTtcbiAgICB9XG4gICAgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMgPSBpcztcbn0pKENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyIHx8IChDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllciA9IHt9KSk7XG5leHBvcnQgdmFyIEFubm90YXRlZFRleHRFZGl0O1xuKGZ1bmN0aW9uIChBbm5vdGF0ZWRUZXh0RWRpdCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYW5ub3RhdGVkIHJlcGxhY2UgdGV4dCBlZGl0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSBvZiB0ZXh0IHRvIGJlIHJlcGxhY2VkLlxuICAgICAqIEBwYXJhbSBuZXdUZXh0IFRoZSBuZXcgdGV4dC5cbiAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiBUaGUgYW5ub3RhdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXBsYWNlKHJhbmdlLCBuZXdUZXh0LCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCBuZXdUZXh0LCBhbm5vdGF0aW9uSWQ6IGFubm90YXRpb24gfTtcbiAgICB9XG4gICAgQW5ub3RhdGVkVGV4dEVkaXQucmVwbGFjZSA9IHJlcGxhY2U7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhbm5vdGF0ZWQgaW5zZXJ0IHRleHQgZWRpdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgcG9zaXRpb24gdG8gaW5zZXJ0IHRoZSB0ZXh0IGF0LlxuICAgICAqIEBwYXJhbSBuZXdUZXh0IFRoZSB0ZXh0IHRvIGJlIGluc2VydGVkLlxuICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIFRoZSBhbm5vdGF0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluc2VydChwb3NpdGlvbiwgbmV3VGV4dCwgYW5ub3RhdGlvbikge1xuICAgICAgICByZXR1cm4geyByYW5nZTogeyBzdGFydDogcG9zaXRpb24sIGVuZDogcG9zaXRpb24gfSwgbmV3VGV4dCwgYW5ub3RhdGlvbklkOiBhbm5vdGF0aW9uIH07XG4gICAgfVxuICAgIEFubm90YXRlZFRleHRFZGl0Lmluc2VydCA9IGluc2VydDtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFubm90YXRlZCBkZWxldGUgdGV4dCBlZGl0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSBvZiB0ZXh0IHRvIGJlIGRlbGV0ZWQuXG4gICAgICogQHBhcmFtIGFubm90YXRpb24gVGhlIGFubm90YXRpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gZGVsKHJhbmdlLCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCBuZXdUZXh0OiAnJywgYW5ub3RhdGlvbklkOiBhbm5vdGF0aW9uIH07XG4gICAgfVxuICAgIEFubm90YXRlZFRleHRFZGl0LmRlbCA9IGRlbDtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIFRleHRFZGl0LmlzKGNhbmRpZGF0ZSkgJiYgKENoYW5nZUFubm90YXRpb24uaXMoY2FuZGlkYXRlLmFubm90YXRpb25JZCkgfHwgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoY2FuZGlkYXRlLmFubm90YXRpb25JZCkpO1xuICAgIH1cbiAgICBBbm5vdGF0ZWRUZXh0RWRpdC5pcyA9IGlzO1xufSkoQW5ub3RhdGVkVGV4dEVkaXQgfHwgKEFubm90YXRlZFRleHRFZGl0ID0ge30pKTtcbi8qKlxuICogVGhlIFRleHREb2N1bWVudEVkaXQgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGVcbiAqIGFuIGVkaXQgdGhhdCBtYW5pcHVsYXRlcyBhIHRleHQgZG9jdW1lbnQuXG4gKi9cbmV4cG9ydCB2YXIgVGV4dERvY3VtZW50RWRpdDtcbihmdW5jdGlvbiAoVGV4dERvY3VtZW50RWRpdCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgYFRleHREb2N1bWVudEVkaXRgXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHRleHREb2N1bWVudCwgZWRpdHMpIHtcbiAgICAgICAgcmV0dXJuIHsgdGV4dERvY3VtZW50LCBlZGl0cyB9O1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnRFZGl0LmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSlcbiAgICAgICAgICAgICYmIE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllci5pcyhjYW5kaWRhdGUudGV4dERvY3VtZW50KVxuICAgICAgICAgICAgJiYgQXJyYXkuaXNBcnJheShjYW5kaWRhdGUuZWRpdHMpO1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnRFZGl0LmlzID0gaXM7XG59KShUZXh0RG9jdW1lbnRFZGl0IHx8IChUZXh0RG9jdW1lbnRFZGl0ID0ge30pKTtcbmV4cG9ydCB2YXIgQ3JlYXRlRmlsZTtcbihmdW5jdGlvbiAoQ3JlYXRlRmlsZSkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmksIG9wdGlvbnMsIGFubm90YXRpb24pIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIGtpbmQ6ICdjcmVhdGUnLFxuICAgICAgICAgICAgdXJpXG4gICAgICAgIH07XG4gICAgICAgIGlmIChvcHRpb25zICE9PSB1bmRlZmluZWQgJiYgKG9wdGlvbnMub3ZlcndyaXRlICE9PSB1bmRlZmluZWQgfHwgb3B0aW9ucy5pZ25vcmVJZkV4aXN0cyAhPT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgcmVzdWx0Lm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbm5vdGF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5hbm5vdGF0aW9uSWQgPSBhbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIENyZWF0ZUZpbGUuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBjYW5kaWRhdGUua2luZCA9PT0gJ2NyZWF0ZScgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpICYmIChjYW5kaWRhdGUub3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAoKGNhbmRpZGF0ZS5vcHRpb25zLm92ZXJ3cml0ZSA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLm9wdGlvbnMub3ZlcndyaXRlKSkgJiYgKGNhbmRpZGF0ZS5vcHRpb25zLmlnbm9yZUlmRXhpc3RzID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUub3B0aW9ucy5pZ25vcmVJZkV4aXN0cykpKSkgJiYgKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQgPT09IHVuZGVmaW5lZCB8fCBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhjYW5kaWRhdGUuYW5ub3RhdGlvbklkKSk7XG4gICAgfVxuICAgIENyZWF0ZUZpbGUuaXMgPSBpcztcbn0pKENyZWF0ZUZpbGUgfHwgKENyZWF0ZUZpbGUgPSB7fSkpO1xuZXhwb3J0IHZhciBSZW5hbWVGaWxlO1xuKGZ1bmN0aW9uIChSZW5hbWVGaWxlKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKG9sZFVyaSwgbmV3VXJpLCBvcHRpb25zLCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7XG4gICAgICAgICAgICBraW5kOiAncmVuYW1lJyxcbiAgICAgICAgICAgIG9sZFVyaSxcbiAgICAgICAgICAgIG5ld1VyaVxuICAgICAgICB9O1xuICAgICAgICBpZiAob3B0aW9ucyAhPT0gdW5kZWZpbmVkICYmIChvcHRpb25zLm92ZXJ3cml0ZSAhPT0gdW5kZWZpbmVkIHx8IG9wdGlvbnMuaWdub3JlSWZFeGlzdHMgIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgfVxuICAgICAgICBpZiAoYW5ub3RhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQuYW5ub3RhdGlvbklkID0gYW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBSZW5hbWVGaWxlLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgY2FuZGlkYXRlLmtpbmQgPT09ICdyZW5hbWUnICYmIElzLnN0cmluZyhjYW5kaWRhdGUub2xkVXJpKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLm5ld1VyaSkgJiYgKGNhbmRpZGF0ZS5vcHRpb25zID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICgoY2FuZGlkYXRlLm9wdGlvbnMub3ZlcndyaXRlID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUub3B0aW9ucy5vdmVyd3JpdGUpKSAmJiAoY2FuZGlkYXRlLm9wdGlvbnMuaWdub3JlSWZFeGlzdHMgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5vcHRpb25zLmlnbm9yZUlmRXhpc3RzKSkpKSAmJiAoY2FuZGlkYXRlLmFubm90YXRpb25JZCA9PT0gdW5kZWZpbmVkIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQpKTtcbiAgICB9XG4gICAgUmVuYW1lRmlsZS5pcyA9IGlzO1xufSkoUmVuYW1lRmlsZSB8fCAoUmVuYW1lRmlsZSA9IHt9KSk7XG5leHBvcnQgdmFyIERlbGV0ZUZpbGU7XG4oZnVuY3Rpb24gKERlbGV0ZUZpbGUpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUodXJpLCBvcHRpb25zLCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7XG4gICAgICAgICAgICBraW5kOiAnZGVsZXRlJyxcbiAgICAgICAgICAgIHVyaVxuICAgICAgICB9O1xuICAgICAgICBpZiAob3B0aW9ucyAhPT0gdW5kZWZpbmVkICYmIChvcHRpb25zLnJlY3Vyc2l2ZSAhPT0gdW5kZWZpbmVkIHx8IG9wdGlvbnMuaWdub3JlSWZOb3RFeGlzdHMgIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgfVxuICAgICAgICBpZiAoYW5ub3RhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQuYW5ub3RhdGlvbklkID0gYW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBEZWxldGVGaWxlLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgY2FuZGlkYXRlLmtpbmQgPT09ICdkZWxldGUnICYmIElzLnN0cmluZyhjYW5kaWRhdGUudXJpKSAmJiAoY2FuZGlkYXRlLm9wdGlvbnMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgKChjYW5kaWRhdGUub3B0aW9ucy5yZWN1cnNpdmUgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5vcHRpb25zLnJlY3Vyc2l2ZSkpICYmIChjYW5kaWRhdGUub3B0aW9ucy5pZ25vcmVJZk5vdEV4aXN0cyA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLm9wdGlvbnMuaWdub3JlSWZOb3RFeGlzdHMpKSkpICYmIChjYW5kaWRhdGUuYW5ub3RhdGlvbklkID09PSB1bmRlZmluZWQgfHwgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoY2FuZGlkYXRlLmFubm90YXRpb25JZCkpO1xuICAgIH1cbiAgICBEZWxldGVGaWxlLmlzID0gaXM7XG59KShEZWxldGVGaWxlIHx8IChEZWxldGVGaWxlID0ge30pKTtcbmV4cG9ydCB2YXIgV29ya3NwYWNlRWRpdDtcbihmdW5jdGlvbiAoV29ya3NwYWNlRWRpdCkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5jaGFuZ2VzICE9PSB1bmRlZmluZWQgfHwgY2FuZGlkYXRlLmRvY3VtZW50Q2hhbmdlcyAhPT0gdW5kZWZpbmVkKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5kb2N1bWVudENoYW5nZXMgPT09IHVuZGVmaW5lZCB8fCBjYW5kaWRhdGUuZG9jdW1lbnRDaGFuZ2VzLmV2ZXJ5KChjaGFuZ2UpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoSXMuc3RyaW5nKGNoYW5nZS5raW5kKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlRmlsZS5pcyhjaGFuZ2UpIHx8IFJlbmFtZUZpbGUuaXMoY2hhbmdlKSB8fCBEZWxldGVGaWxlLmlzKGNoYW5nZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gVGV4dERvY3VtZW50RWRpdC5pcyhjaGFuZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKTtcbiAgICB9XG4gICAgV29ya3NwYWNlRWRpdC5pcyA9IGlzO1xufSkoV29ya3NwYWNlRWRpdCB8fCAoV29ya3NwYWNlRWRpdCA9IHt9KSk7XG5jbGFzcyBUZXh0RWRpdENoYW5nZUltcGwge1xuICAgIGNvbnN0cnVjdG9yKGVkaXRzLCBjaGFuZ2VBbm5vdGF0aW9ucykge1xuICAgICAgICB0aGlzLmVkaXRzID0gZWRpdHM7XG4gICAgICAgIHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMgPSBjaGFuZ2VBbm5vdGF0aW9ucztcbiAgICB9XG4gICAgaW5zZXJ0KHBvc2l0aW9uLCBuZXdUZXh0LCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIGxldCBlZGl0O1xuICAgICAgICBsZXQgaWQ7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGVkaXQgPSBUZXh0RWRpdC5pbnNlcnQocG9zaXRpb24sIG5ld1RleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGFubm90YXRpb24pKSB7XG4gICAgICAgICAgICBpZCA9IGFubm90YXRpb247XG4gICAgICAgICAgICBlZGl0ID0gQW5ub3RhdGVkVGV4dEVkaXQuaW5zZXJ0KHBvc2l0aW9uLCBuZXdUZXh0LCBhbm5vdGF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYXNzZXJ0Q2hhbmdlQW5ub3RhdGlvbnModGhpcy5jaGFuZ2VBbm5vdGF0aW9ucyk7XG4gICAgICAgICAgICBpZCA9IHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMubWFuYWdlKGFubm90YXRpb24pO1xuICAgICAgICAgICAgZWRpdCA9IEFubm90YXRlZFRleHRFZGl0Lmluc2VydChwb3NpdGlvbiwgbmV3VGV4dCwgaWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWRpdHMucHVzaChlZGl0KTtcbiAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXBsYWNlKHJhbmdlLCBuZXdUZXh0LCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIGxldCBlZGl0O1xuICAgICAgICBsZXQgaWQ7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGVkaXQgPSBUZXh0RWRpdC5yZXBsYWNlKHJhbmdlLCBuZXdUZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhhbm5vdGF0aW9uKSkge1xuICAgICAgICAgICAgaWQgPSBhbm5vdGF0aW9uO1xuICAgICAgICAgICAgZWRpdCA9IEFubm90YXRlZFRleHRFZGl0LnJlcGxhY2UocmFuZ2UsIG5ld1RleHQsIGFubm90YXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hc3NlcnRDaGFuZ2VBbm5vdGF0aW9ucyh0aGlzLmNoYW5nZUFubm90YXRpb25zKTtcbiAgICAgICAgICAgIGlkID0gdGhpcy5jaGFuZ2VBbm5vdGF0aW9ucy5tYW5hZ2UoYW5ub3RhdGlvbik7XG4gICAgICAgICAgICBlZGl0ID0gQW5ub3RhdGVkVGV4dEVkaXQucmVwbGFjZShyYW5nZSwgbmV3VGV4dCwgaWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWRpdHMucHVzaChlZGl0KTtcbiAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkZWxldGUocmFuZ2UsIGFubm90YXRpb24pIHtcbiAgICAgICAgbGV0IGVkaXQ7XG4gICAgICAgIGxldCBpZDtcbiAgICAgICAgaWYgKGFubm90YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZWRpdCA9IFRleHRFZGl0LmRlbChyYW5nZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoYW5ub3RhdGlvbikpIHtcbiAgICAgICAgICAgIGlkID0gYW5ub3RhdGlvbjtcbiAgICAgICAgICAgIGVkaXQgPSBBbm5vdGF0ZWRUZXh0RWRpdC5kZWwocmFuZ2UsIGFubm90YXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hc3NlcnRDaGFuZ2VBbm5vdGF0aW9ucyh0aGlzLmNoYW5nZUFubm90YXRpb25zKTtcbiAgICAgICAgICAgIGlkID0gdGhpcy5jaGFuZ2VBbm5vdGF0aW9ucy5tYW5hZ2UoYW5ub3RhdGlvbik7XG4gICAgICAgICAgICBlZGl0ID0gQW5ub3RhdGVkVGV4dEVkaXQuZGVsKHJhbmdlLCBpZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lZGl0cy5wdXNoKGVkaXQpO1xuICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFkZChlZGl0KSB7XG4gICAgICAgIHRoaXMuZWRpdHMucHVzaChlZGl0KTtcbiAgICB9XG4gICAgYWxsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0cztcbiAgICB9XG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuZWRpdHMuc3BsaWNlKDAsIHRoaXMuZWRpdHMubGVuZ3RoKTtcbiAgICB9XG4gICAgYXNzZXJ0Q2hhbmdlQW5ub3RhdGlvbnModmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGV4dCBlZGl0IGNoYW5nZSBpcyBub3QgY29uZmlndXJlZCB0byBtYW5hZ2UgY2hhbmdlIGFubm90YXRpb25zLmApO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBBIGhlbHBlciBjbGFzc1xuICovXG5jbGFzcyBDaGFuZ2VBbm5vdGF0aW9ucyB7XG4gICAgY29uc3RydWN0b3IoYW5ub3RhdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9ucyA9PT0gdW5kZWZpbmVkID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IGFubm90YXRpb25zO1xuICAgICAgICB0aGlzLl9jb3VudGVyID0gMDtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IDA7XG4gICAgfVxuICAgIGFsbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Fubm90YXRpb25zO1xuICAgIH1cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpemU7XG4gICAgfVxuICAgIG1hbmFnZShpZE9yQW5ub3RhdGlvbiwgYW5ub3RhdGlvbikge1xuICAgICAgICBsZXQgaWQ7XG4gICAgICAgIGlmIChDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhpZE9yQW5ub3RhdGlvbikpIHtcbiAgICAgICAgICAgIGlkID0gaWRPckFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZCA9IHRoaXMubmV4dElkKCk7XG4gICAgICAgICAgICBhbm5vdGF0aW9uID0gaWRPckFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2Fubm90YXRpb25zW2lkXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYElkICR7aWR9IGlzIGFscmVhZHkgaW4gdXNlLmApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbm5vdGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gYW5ub3RhdGlvbiBwcm92aWRlZCBmb3IgaWQgJHtpZH1gKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9hbm5vdGF0aW9uc1tpZF0gPSBhbm5vdGF0aW9uO1xuICAgICAgICB0aGlzLl9zaXplKys7XG4gICAgICAgIHJldHVybiBpZDtcbiAgICB9XG4gICAgbmV4dElkKCkge1xuICAgICAgICB0aGlzLl9jb3VudGVyKys7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb3VudGVyLnRvU3RyaW5nKCk7XG4gICAgfVxufVxuLyoqXG4gKiBBIHdvcmtzcGFjZSBjaGFuZ2UgaGVscHMgY29uc3RydWN0aW5nIGNoYW5nZXMgdG8gYSB3b3Jrc3BhY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBXb3Jrc3BhY2VDaGFuZ2Uge1xuICAgIGNvbnN0cnVjdG9yKHdvcmtzcGFjZUVkaXQpIHtcbiAgICAgICAgdGhpcy5fdGV4dEVkaXRDaGFuZ2VzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgaWYgKHdvcmtzcGFjZUVkaXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdCA9IHdvcmtzcGFjZUVkaXQ7XG4gICAgICAgICAgICBpZiAod29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucyA9IG5ldyBDaGFuZ2VBbm5vdGF0aW9ucyh3b3Jrc3BhY2VFZGl0LmNoYW5nZUFubm90YXRpb25zKTtcbiAgICAgICAgICAgICAgICB3b3Jrc3BhY2VFZGl0LmNoYW5nZUFubm90YXRpb25zID0gdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMuYWxsKCk7XG4gICAgICAgICAgICAgICAgd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMuZm9yRWFjaCgoY2hhbmdlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChUZXh0RG9jdW1lbnRFZGl0LmlzKGNoYW5nZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHRFZGl0Q2hhbmdlID0gbmV3IFRleHRFZGl0Q2hhbmdlSW1wbChjaGFuZ2UuZWRpdHMsIHRoaXMuX2NoYW5nZUFubm90YXRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RleHRFZGl0Q2hhbmdlc1tjaGFuZ2UudGV4dERvY3VtZW50LnVyaV0gPSB0ZXh0RWRpdENoYW5nZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAod29ya3NwYWNlRWRpdC5jaGFuZ2VzKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMod29ya3NwYWNlRWRpdC5jaGFuZ2VzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dEVkaXRDaGFuZ2UgPSBuZXcgVGV4dEVkaXRDaGFuZ2VJbXBsKHdvcmtzcGFjZUVkaXQuY2hhbmdlc1trZXldKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGV4dEVkaXRDaGFuZ2VzW2tleV0gPSB0ZXh0RWRpdENoYW5nZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQgPSB7fTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIHtAbGluayBXb3Jrc3BhY2VFZGl0fSBsaXRlcmFsXG4gICAgICogdXNlIHRvIGJlIHJldHVybmVkIGZyb20gYSB3b3Jrc3BhY2UgZWRpdCBvcGVyYXRpb24gbGlrZSByZW5hbWUuXG4gICAgICovXG4gICAgZ2V0IGVkaXQoKSB7XG4gICAgICAgIHRoaXMuaW5pdERvY3VtZW50Q2hhbmdlcygpO1xuICAgICAgICBpZiAodGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2NoYW5nZUFubm90YXRpb25zLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZUFubm90YXRpb25zID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VBbm5vdGF0aW9ucyA9IHRoaXMuX2NoYW5nZUFubm90YXRpb25zLmFsbCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl93b3Jrc3BhY2VFZGl0O1xuICAgIH1cbiAgICBnZXRUZXh0RWRpdENoYW5nZShrZXkpIHtcbiAgICAgICAgaWYgKE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllci5pcyhrZXkpKSB7XG4gICAgICAgICAgICB0aGlzLmluaXREb2N1bWVudENoYW5nZXMoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXb3Jrc3BhY2UgZWRpdCBpcyBub3QgY29uZmlndXJlZCBmb3IgZG9jdW1lbnQgY2hhbmdlcy4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHRleHREb2N1bWVudCA9IHsgdXJpOiBrZXkudXJpLCB2ZXJzaW9uOiBrZXkudmVyc2lvbiB9O1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuX3RleHRFZGl0Q2hhbmdlc1t0ZXh0RG9jdW1lbnQudXJpXTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWRpdHMgPSBbXTtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0RG9jdW1lbnRFZGl0ID0ge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIGVkaXRzXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcy5wdXNoKHRleHREb2N1bWVudEVkaXQpO1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBUZXh0RWRpdENoYW5nZUltcGwoZWRpdHMsIHRoaXMuX2NoYW5nZUFubm90YXRpb25zKTtcbiAgICAgICAgICAgICAgICB0aGlzLl90ZXh0RWRpdENoYW5nZXNbdGV4dERvY3VtZW50LnVyaV0gPSByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pbml0Q2hhbmdlcygpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXb3Jrc3BhY2UgZWRpdCBpcyBub3QgY29uZmlndXJlZCBmb3Igbm9ybWFsIHRleHQgZWRpdCBjaGFuZ2VzLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuX3RleHRFZGl0Q2hhbmdlc1trZXldO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBsZXQgZWRpdHMgPSBbXTtcbiAgICAgICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZXNba2V5XSA9IGVkaXRzO1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBUZXh0RWRpdENoYW5nZUltcGwoZWRpdHMpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3RleHRFZGl0Q2hhbmdlc1trZXldID0gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpbml0RG9jdW1lbnRDaGFuZ2VzKCkge1xuICAgICAgICBpZiAodGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMgPT09IHVuZGVmaW5lZCAmJiB0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMgPSBuZXcgQ2hhbmdlQW5ub3RhdGlvbnMoKTtcbiAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzID0gW107XG4gICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZUFubm90YXRpb25zID0gdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMuYWxsKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaW5pdENoYW5nZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcyA9PT0gdW5kZWZpbmVkICYmIHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNyZWF0ZUZpbGUodXJpLCBvcHRpb25zT3JBbm5vdGF0aW9uLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuaW5pdERvY3VtZW50Q2hhbmdlcygpO1xuICAgICAgICBpZiAodGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXb3Jrc3BhY2UgZWRpdCBpcyBub3QgY29uZmlndXJlZCBmb3IgZG9jdW1lbnQgY2hhbmdlcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYW5ub3RhdGlvbjtcbiAgICAgICAgaWYgKENoYW5nZUFubm90YXRpb24uaXMob3B0aW9uc09yQW5ub3RhdGlvbikgfHwgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMob3B0aW9uc09yQW5ub3RhdGlvbikpIHtcbiAgICAgICAgICAgIGFubm90YXRpb24gPSBvcHRpb25zT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnNPckFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG9wZXJhdGlvbjtcbiAgICAgICAgbGV0IGlkO1xuICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcGVyYXRpb24gPSBDcmVhdGVGaWxlLmNyZWF0ZSh1cmksIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWQgPSBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhhbm5vdGF0aW9uKSA/IGFubm90YXRpb24gOiB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5tYW5hZ2UoYW5ub3RhdGlvbik7XG4gICAgICAgICAgICBvcGVyYXRpb24gPSBDcmVhdGVGaWxlLmNyZWF0ZSh1cmksIG9wdGlvbnMsIGlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcy5wdXNoKG9wZXJhdGlvbik7XG4gICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVuYW1lRmlsZShvbGRVcmksIG5ld1VyaSwgb3B0aW9uc09yQW5ub3RhdGlvbiwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLmluaXREb2N1bWVudENoYW5nZXMoKTtcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV29ya3NwYWNlIGVkaXQgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIGRvY3VtZW50IGNoYW5nZXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGFubm90YXRpb247XG4gICAgICAgIGlmIChDaGFuZ2VBbm5vdGF0aW9uLmlzKG9wdGlvbnNPckFubm90YXRpb24pIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKG9wdGlvbnNPckFubm90YXRpb24pKSB7XG4gICAgICAgICAgICBhbm5vdGF0aW9uID0gb3B0aW9uc09yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGxldCBvcGVyYXRpb247XG4gICAgICAgIGxldCBpZDtcbiAgICAgICAgaWYgKGFubm90YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3BlcmF0aW9uID0gUmVuYW1lRmlsZS5jcmVhdGUob2xkVXJpLCBuZXdVcmksIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWQgPSBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhhbm5vdGF0aW9uKSA/IGFubm90YXRpb24gOiB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5tYW5hZ2UoYW5ub3RhdGlvbik7XG4gICAgICAgICAgICBvcGVyYXRpb24gPSBSZW5hbWVGaWxlLmNyZWF0ZShvbGRVcmksIG5ld1VyaSwgb3B0aW9ucywgaWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzLnB1c2gob3BlcmF0aW9uKTtcbiAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkZWxldGVGaWxlKHVyaSwgb3B0aW9uc09yQW5ub3RhdGlvbiwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLmluaXREb2N1bWVudENoYW5nZXMoKTtcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV29ya3NwYWNlIGVkaXQgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIGRvY3VtZW50IGNoYW5nZXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGFubm90YXRpb247XG4gICAgICAgIGlmIChDaGFuZ2VBbm5vdGF0aW9uLmlzKG9wdGlvbnNPckFubm90YXRpb24pIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKG9wdGlvbnNPckFubm90YXRpb24pKSB7XG4gICAgICAgICAgICBhbm5vdGF0aW9uID0gb3B0aW9uc09yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGxldCBvcGVyYXRpb247XG4gICAgICAgIGxldCBpZDtcbiAgICAgICAgaWYgKGFubm90YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3BlcmF0aW9uID0gRGVsZXRlRmlsZS5jcmVhdGUodXJpLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlkID0gQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoYW5ub3RhdGlvbikgPyBhbm5vdGF0aW9uIDogdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMubWFuYWdlKGFubm90YXRpb24pO1xuICAgICAgICAgICAgb3BlcmF0aW9uID0gRGVsZXRlRmlsZS5jcmVhdGUodXJpLCBvcHRpb25zLCBpZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMucHVzaChvcGVyYXRpb24pO1xuICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBUaGUgVGV4dERvY3VtZW50SWRlbnRpZmllciBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBUZXh0RG9jdW1lbnRJZGVudGlmaWVyfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBUZXh0RG9jdW1lbnRJZGVudGlmaWVyO1xuKGZ1bmN0aW9uIChUZXh0RG9jdW1lbnRJZGVudGlmaWVyKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBUZXh0RG9jdW1lbnRJZGVudGlmaWVyIGxpdGVyYWwuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgZG9jdW1lbnQncyB1cmkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHVyaSkge1xuICAgICAgICByZXR1cm4geyB1cmkgfTtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50SWRlbnRpZmllci5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBUZXh0RG9jdW1lbnRJZGVudGlmaWVyfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudXJpKTtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50SWRlbnRpZmllci5pcyA9IGlzO1xufSkoVGV4dERvY3VtZW50SWRlbnRpZmllciB8fCAoVGV4dERvY3VtZW50SWRlbnRpZmllciA9IHt9KSk7XG4vKipcbiAqIFRoZSBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXJ9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXI7XG4oZnVuY3Rpb24gKFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIgbGl0ZXJhbC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSBkb2N1bWVudCdzIHVyaS5cbiAgICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgZG9jdW1lbnQncyB2ZXJzaW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmksIHZlcnNpb24pIHtcbiAgICAgICAgcmV0dXJuIHsgdXJpLCB2ZXJzaW9uIH07XG4gICAgfVxuICAgIFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSkgJiYgSXMuaW50ZWdlcihjYW5kaWRhdGUudmVyc2lvbik7XG4gICAgfVxuICAgIFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIuaXMgPSBpcztcbn0pKFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIgfHwgKFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIgPSB7fSkpO1xuLyoqXG4gKiBUaGUgT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyO1xuKGZ1bmN0aW9uIChPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciBsaXRlcmFsLlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIGRvY3VtZW50J3MgdXJpLlxuICAgICAqIEBwYXJhbSB2ZXJzaW9uIFRoZSBkb2N1bWVudCdzIHZlcnNpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHVyaSwgdmVyc2lvbikge1xuICAgICAgICByZXR1cm4geyB1cmksIHZlcnNpb24gfTtcbiAgICB9XG4gICAgT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSkgJiYgKGNhbmRpZGF0ZS52ZXJzaW9uID09PSBudWxsIHx8IElzLmludGVnZXIoY2FuZGlkYXRlLnZlcnNpb24pKTtcbiAgICB9XG4gICAgT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmlzID0gaXM7XG59KShPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIgfHwgKE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciA9IHt9KSk7XG4vKipcbiAqIFRoZSBUZXh0RG9jdW1lbnRJdGVtIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIFRleHREb2N1bWVudEl0ZW19IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIFRleHREb2N1bWVudEl0ZW07XG4oZnVuY3Rpb24gKFRleHREb2N1bWVudEl0ZW0pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFRleHREb2N1bWVudEl0ZW0gbGl0ZXJhbC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSBkb2N1bWVudCdzIHVyaS5cbiAgICAgKiBAcGFyYW0gbGFuZ3VhZ2VJZCBUaGUgZG9jdW1lbnQncyBsYW5ndWFnZSBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB2ZXJzaW9uIFRoZSBkb2N1bWVudCdzIHZlcnNpb24gbnVtYmVyLlxuICAgICAqIEBwYXJhbSB0ZXh0IFRoZSBkb2N1bWVudCdzIHRleHQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHVyaSwgbGFuZ3VhZ2VJZCwgdmVyc2lvbiwgdGV4dCkge1xuICAgICAgICByZXR1cm4geyB1cmksIGxhbmd1YWdlSWQsIHZlcnNpb24sIHRleHQgfTtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50SXRlbS5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBUZXh0RG9jdW1lbnRJdGVtfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudXJpKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLmxhbmd1YWdlSWQpICYmIElzLmludGVnZXIoY2FuZGlkYXRlLnZlcnNpb24pICYmIElzLnN0cmluZyhjYW5kaWRhdGUudGV4dCk7XG4gICAgfVxuICAgIFRleHREb2N1bWVudEl0ZW0uaXMgPSBpcztcbn0pKFRleHREb2N1bWVudEl0ZW0gfHwgKFRleHREb2N1bWVudEl0ZW0gPSB7fSkpO1xuLyoqXG4gKiBEZXNjcmliZXMgdGhlIGNvbnRlbnQgdHlwZSB0aGF0IGEgY2xpZW50IHN1cHBvcnRzIGluIHZhcmlvdXNcbiAqIHJlc3VsdCBsaXRlcmFscyBsaWtlIGBIb3ZlcmAsIGBQYXJhbWV0ZXJJbmZvYCBvciBgQ29tcGxldGlvbkl0ZW1gLlxuICpcbiAqIFBsZWFzZSBub3RlIHRoYXQgYE1hcmt1cEtpbmRzYCBtdXN0IG5vdCBzdGFydCB3aXRoIGEgYCRgLiBUaGlzIGtpbmRzXG4gKiBhcmUgcmVzZXJ2ZWQgZm9yIGludGVybmFsIHVzYWdlLlxuICovXG5leHBvcnQgdmFyIE1hcmt1cEtpbmQ7XG4oZnVuY3Rpb24gKE1hcmt1cEtpbmQpIHtcbiAgICAvKipcbiAgICAgKiBQbGFpbiB0ZXh0IGlzIHN1cHBvcnRlZCBhcyBhIGNvbnRlbnQgZm9ybWF0XG4gICAgICovXG4gICAgTWFya3VwS2luZC5QbGFpblRleHQgPSAncGxhaW50ZXh0JztcbiAgICAvKipcbiAgICAgKiBNYXJrZG93biBpcyBzdXBwb3J0ZWQgYXMgYSBjb250ZW50IGZvcm1hdFxuICAgICAqL1xuICAgIE1hcmt1cEtpbmQuTWFya2Rvd24gPSAnbWFya2Rvd24nO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBpcyBhIHZhbHVlIG9mIHRoZSB7QGxpbmsgTWFya3VwS2luZH0gdHlwZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSA9PT0gTWFya3VwS2luZC5QbGFpblRleHQgfHwgY2FuZGlkYXRlID09PSBNYXJrdXBLaW5kLk1hcmtkb3duO1xuICAgIH1cbiAgICBNYXJrdXBLaW5kLmlzID0gaXM7XG59KShNYXJrdXBLaW5kIHx8IChNYXJrdXBLaW5kID0ge30pKTtcbmV4cG9ydCB2YXIgTWFya3VwQ29udGVudDtcbihmdW5jdGlvbiAoTWFya3VwQ29udGVudCkge1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBjb25mb3JtcyB0byB0aGUge0BsaW5rIE1hcmt1cENvbnRlbnR9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwodmFsdWUpICYmIE1hcmt1cEtpbmQuaXMoY2FuZGlkYXRlLmtpbmQpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudmFsdWUpO1xuICAgIH1cbiAgICBNYXJrdXBDb250ZW50LmlzID0gaXM7XG59KShNYXJrdXBDb250ZW50IHx8IChNYXJrdXBDb250ZW50ID0ge30pKTtcbi8qKlxuICogVGhlIGtpbmQgb2YgYSBjb21wbGV0aW9uIGVudHJ5LlxuICovXG5leHBvcnQgdmFyIENvbXBsZXRpb25JdGVtS2luZDtcbihmdW5jdGlvbiAoQ29tcGxldGlvbkl0ZW1LaW5kKSB7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlRleHQgPSAxO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5NZXRob2QgPSAyO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5GdW5jdGlvbiA9IDM7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkNvbnN0cnVjdG9yID0gNDtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuRmllbGQgPSA1O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5WYXJpYWJsZSA9IDY7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkNsYXNzID0gNztcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuSW50ZXJmYWNlID0gODtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuTW9kdWxlID0gOTtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuUHJvcGVydHkgPSAxMDtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuVW5pdCA9IDExO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5WYWx1ZSA9IDEyO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5FbnVtID0gMTM7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLktleXdvcmQgPSAxNDtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuU25pcHBldCA9IDE1O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5Db2xvciA9IDE2O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5GaWxlID0gMTc7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlJlZmVyZW5jZSA9IDE4O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5Gb2xkZXIgPSAxOTtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuRW51bU1lbWJlciA9IDIwO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5Db25zdGFudCA9IDIxO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5TdHJ1Y3QgPSAyMjtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuRXZlbnQgPSAyMztcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuT3BlcmF0b3IgPSAyNDtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuVHlwZVBhcmFtZXRlciA9IDI1O1xufSkoQ29tcGxldGlvbkl0ZW1LaW5kIHx8IChDb21wbGV0aW9uSXRlbUtpbmQgPSB7fSkpO1xuLyoqXG4gKiBEZWZpbmVzIHdoZXRoZXIgdGhlIGluc2VydCB0ZXh0IGluIGEgY29tcGxldGlvbiBpdGVtIHNob3VsZCBiZSBpbnRlcnByZXRlZCBhc1xuICogcGxhaW4gdGV4dCBvciBhIHNuaXBwZXQuXG4gKi9cbmV4cG9ydCB2YXIgSW5zZXJ0VGV4dEZvcm1hdDtcbihmdW5jdGlvbiAoSW5zZXJ0VGV4dEZvcm1hdCkge1xuICAgIC8qKlxuICAgICAqIFRoZSBwcmltYXJ5IHRleHQgdG8gYmUgaW5zZXJ0ZWQgaXMgdHJlYXRlZCBhcyBhIHBsYWluIHN0cmluZy5cbiAgICAgKi9cbiAgICBJbnNlcnRUZXh0Rm9ybWF0LlBsYWluVGV4dCA9IDE7XG4gICAgLyoqXG4gICAgICogVGhlIHByaW1hcnkgdGV4dCB0byBiZSBpbnNlcnRlZCBpcyB0cmVhdGVkIGFzIGEgc25pcHBldC5cbiAgICAgKlxuICAgICAqIEEgc25pcHBldCBjYW4gZGVmaW5lIHRhYiBzdG9wcyBhbmQgcGxhY2Vob2xkZXJzIHdpdGggYCQxYCwgYCQyYFxuICAgICAqIGFuZCBgJHszOmZvb31gLiBgJDBgIGRlZmluZXMgdGhlIGZpbmFsIHRhYiBzdG9wLCBpdCBkZWZhdWx0cyB0b1xuICAgICAqIHRoZSBlbmQgb2YgdGhlIHNuaXBwZXQuIFBsYWNlaG9sZGVycyB3aXRoIGVxdWFsIGlkZW50aWZpZXJzIGFyZSBsaW5rZWQsXG4gICAgICogdGhhdCBpcyB0eXBpbmcgaW4gb25lIHdpbGwgdXBkYXRlIG90aGVycyB0b28uXG4gICAgICpcbiAgICAgKiBTZWUgYWxzbzogaHR0cHM6Ly9taWNyb3NvZnQuZ2l0aHViLmlvL2xhbmd1YWdlLXNlcnZlci1wcm90b2NvbC9zcGVjaWZpY2F0aW9ucy9zcGVjaWZpY2F0aW9uLWN1cnJlbnQvI3NuaXBwZXRfc3ludGF4XG4gICAgICovXG4gICAgSW5zZXJ0VGV4dEZvcm1hdC5TbmlwcGV0ID0gMjtcbn0pKEluc2VydFRleHRGb3JtYXQgfHwgKEluc2VydFRleHRGb3JtYXQgPSB7fSkpO1xuLyoqXG4gKiBDb21wbGV0aW9uIGl0ZW0gdGFncyBhcmUgZXh0cmEgYW5ub3RhdGlvbnMgdGhhdCB0d2VhayB0aGUgcmVuZGVyaW5nIG9mIGEgY29tcGxldGlvblxuICogaXRlbS5cbiAqXG4gKiBAc2luY2UgMy4xNS4wXG4gKi9cbmV4cG9ydCB2YXIgQ29tcGxldGlvbkl0ZW1UYWc7XG4oZnVuY3Rpb24gKENvbXBsZXRpb25JdGVtVGFnKSB7XG4gICAgLyoqXG4gICAgICogUmVuZGVyIGEgY29tcGxldGlvbiBhcyBvYnNvbGV0ZSwgdXN1YWxseSB1c2luZyBhIHN0cmlrZS1vdXQuXG4gICAgICovXG4gICAgQ29tcGxldGlvbkl0ZW1UYWcuRGVwcmVjYXRlZCA9IDE7XG59KShDb21wbGV0aW9uSXRlbVRhZyB8fCAoQ29tcGxldGlvbkl0ZW1UYWcgPSB7fSkpO1xuLyoqXG4gKiBUaGUgSW5zZXJ0UmVwbGFjZUVkaXQgbmFtZXNwYWNlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGggaW5zZXJ0IC8gcmVwbGFjZSBlZGl0cy5cbiAqXG4gKiBAc2luY2UgMy4xNi4wXG4gKi9cbmV4cG9ydCB2YXIgSW5zZXJ0UmVwbGFjZUVkaXQ7XG4oZnVuY3Rpb24gKEluc2VydFJlcGxhY2VFZGl0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBpbnNlcnQgLyByZXBsYWNlIGVkaXRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobmV3VGV4dCwgaW5zZXJ0LCByZXBsYWNlKSB7XG4gICAgICAgIHJldHVybiB7IG5ld1RleHQsIGluc2VydCwgcmVwbGFjZSB9O1xuICAgIH1cbiAgICBJbnNlcnRSZXBsYWNlRWRpdC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBJbnNlcnRSZXBsYWNlRWRpdH0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLnN0cmluZyhjYW5kaWRhdGUubmV3VGV4dCkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLmluc2VydCkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJlcGxhY2UpO1xuICAgIH1cbiAgICBJbnNlcnRSZXBsYWNlRWRpdC5pcyA9IGlzO1xufSkoSW5zZXJ0UmVwbGFjZUVkaXQgfHwgKEluc2VydFJlcGxhY2VFZGl0ID0ge30pKTtcbi8qKlxuICogSG93IHdoaXRlc3BhY2UgYW5kIGluZGVudGF0aW9uIGlzIGhhbmRsZWQgZHVyaW5nIGNvbXBsZXRpb25cbiAqIGl0ZW0gaW5zZXJ0aW9uLlxuICpcbiAqIEBzaW5jZSAzLjE2LjBcbiAqL1xuZXhwb3J0IHZhciBJbnNlcnRUZXh0TW9kZTtcbihmdW5jdGlvbiAoSW5zZXJ0VGV4dE1vZGUpIHtcbiAgICAvKipcbiAgICAgKiBUaGUgaW5zZXJ0aW9uIG9yIHJlcGxhY2Ugc3RyaW5ncyBpcyB0YWtlbiBhcyBpdCBpcy4gSWYgdGhlXG4gICAgICogdmFsdWUgaXMgbXVsdGkgbGluZSB0aGUgbGluZXMgYmVsb3cgdGhlIGN1cnNvciB3aWxsIGJlXG4gICAgICogaW5zZXJ0ZWQgdXNpbmcgdGhlIGluZGVudGF0aW9uIGRlZmluZWQgaW4gdGhlIHN0cmluZyB2YWx1ZS5cbiAgICAgKiBUaGUgY2xpZW50IHdpbGwgbm90IGFwcGx5IGFueSBraW5kIG9mIGFkanVzdG1lbnRzIHRvIHRoZVxuICAgICAqIHN0cmluZy5cbiAgICAgKi9cbiAgICBJbnNlcnRUZXh0TW9kZS5hc0lzID0gMTtcbiAgICAvKipcbiAgICAgKiBUaGUgZWRpdG9yIGFkanVzdHMgbGVhZGluZyB3aGl0ZXNwYWNlIG9mIG5ldyBsaW5lcyBzbyB0aGF0XG4gICAgICogdGhleSBtYXRjaCB0aGUgaW5kZW50YXRpb24gdXAgdG8gdGhlIGN1cnNvciBvZiB0aGUgbGluZSBmb3JcbiAgICAgKiB3aGljaCB0aGUgaXRlbSBpcyBhY2NlcHRlZC5cbiAgICAgKlxuICAgICAqIENvbnNpZGVyIGEgbGluZSBsaWtlIHRoaXM6IDwydGFicz48Y3Vyc29yPjwzdGFicz5mb28uIEFjY2VwdGluZyBhXG4gICAgICogbXVsdGkgbGluZSBjb21wbGV0aW9uIGl0ZW0gaXMgaW5kZW50ZWQgdXNpbmcgMiB0YWJzIGFuZCBhbGxcbiAgICAgKiBmb2xsb3dpbmcgbGluZXMgaW5zZXJ0ZWQgd2lsbCBiZSBpbmRlbnRlZCB1c2luZyAyIHRhYnMgYXMgd2VsbC5cbiAgICAgKi9cbiAgICBJbnNlcnRUZXh0TW9kZS5hZGp1c3RJbmRlbnRhdGlvbiA9IDI7XG59KShJbnNlcnRUZXh0TW9kZSB8fCAoSW5zZXJ0VGV4dE1vZGUgPSB7fSkpO1xuZXhwb3J0IHZhciBDb21wbGV0aW9uSXRlbUxhYmVsRGV0YWlscztcbihmdW5jdGlvbiAoQ29tcGxldGlvbkl0ZW1MYWJlbERldGFpbHMpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiAoSXMuc3RyaW5nKGNhbmRpZGF0ZS5kZXRhaWwpIHx8IGNhbmRpZGF0ZS5kZXRhaWwgPT09IHVuZGVmaW5lZCkgJiZcbiAgICAgICAgICAgIChJcy5zdHJpbmcoY2FuZGlkYXRlLmRlc2NyaXB0aW9uKSB8fCBjYW5kaWRhdGUuZGVzY3JpcHRpb24gPT09IHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIENvbXBsZXRpb25JdGVtTGFiZWxEZXRhaWxzLmlzID0gaXM7XG59KShDb21wbGV0aW9uSXRlbUxhYmVsRGV0YWlscyB8fCAoQ29tcGxldGlvbkl0ZW1MYWJlbERldGFpbHMgPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29tcGxldGlvbkl0ZW0gbmFtZXNwYWNlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGhcbiAqIGNvbXBsZXRpb24gaXRlbXMuXG4gKi9cbmV4cG9ydCB2YXIgQ29tcGxldGlvbkl0ZW07XG4oZnVuY3Rpb24gKENvbXBsZXRpb25JdGVtKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgY29tcGxldGlvbiBpdGVtIGFuZCBzZWVkIGl0IHdpdGggYSBsYWJlbC5cbiAgICAgKiBAcGFyYW0gbGFiZWwgVGhlIGNvbXBsZXRpb24gaXRlbSdzIGxhYmVsXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGxhYmVsKSB7XG4gICAgICAgIHJldHVybiB7IGxhYmVsIH07XG4gICAgfVxuICAgIENvbXBsZXRpb25JdGVtLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKENvbXBsZXRpb25JdGVtIHx8IChDb21wbGV0aW9uSXRlbSA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb21wbGV0aW9uTGlzdCBuYW1lc3BhY2UgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aFxuICogY29tcGxldGlvbiBsaXN0cy5cbiAqL1xuZXhwb3J0IHZhciBDb21wbGV0aW9uTGlzdDtcbihmdW5jdGlvbiAoQ29tcGxldGlvbkxpc3QpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGNvbXBsZXRpb24gbGlzdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpdGVtcyBUaGUgY29tcGxldGlvbiBpdGVtcy5cbiAgICAgKiBAcGFyYW0gaXNJbmNvbXBsZXRlIFRoZSBsaXN0IGlzIG5vdCBjb21wbGV0ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUoaXRlbXMsIGlzSW5jb21wbGV0ZSkge1xuICAgICAgICByZXR1cm4geyBpdGVtczogaXRlbXMgPyBpdGVtcyA6IFtdLCBpc0luY29tcGxldGU6ICEhaXNJbmNvbXBsZXRlIH07XG4gICAgfVxuICAgIENvbXBsZXRpb25MaXN0LmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKENvbXBsZXRpb25MaXN0IHx8IChDb21wbGV0aW9uTGlzdCA9IHt9KSk7XG5leHBvcnQgdmFyIE1hcmtlZFN0cmluZztcbihmdW5jdGlvbiAoTWFya2VkU3RyaW5nKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG1hcmtlZCBzdHJpbmcgZnJvbSBwbGFpbiB0ZXh0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHBsYWluVGV4dCBUaGUgcGxhaW4gdGV4dC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmcm9tUGxhaW5UZXh0KHBsYWluVGV4dCkge1xuICAgICAgICByZXR1cm4gcGxhaW5UZXh0LnJlcGxhY2UoL1tcXFxcYCpfe31bXFxdKCkjK1xcLS4hXS9nLCAnXFxcXCQmJyk7IC8vIGVzY2FwZSBtYXJrZG93biBzeW50YXggdG9rZW5zOiBodHRwOi8vZGFyaW5nZmlyZWJhbGwubmV0L3Byb2plY3RzL21hcmtkb3duL3N5bnRheCNiYWNrc2xhc2hcbiAgICB9XG4gICAgTWFya2VkU3RyaW5nLmZyb21QbGFpblRleHQgPSBmcm9tUGxhaW5UZXh0O1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBjb25mb3JtcyB0byB0aGUge0BsaW5rIE1hcmtlZFN0cmluZ30gdHlwZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLnN0cmluZyhjYW5kaWRhdGUpIHx8IChJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5sYW5ndWFnZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS52YWx1ZSkpO1xuICAgIH1cbiAgICBNYXJrZWRTdHJpbmcuaXMgPSBpcztcbn0pKE1hcmtlZFN0cmluZyB8fCAoTWFya2VkU3RyaW5nID0ge30pKTtcbmV4cG9ydCB2YXIgSG92ZXI7XG4oZnVuY3Rpb24gKEhvdmVyKSB7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgSG92ZXJ9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiAhIWNhbmRpZGF0ZSAmJiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgKE1hcmt1cENvbnRlbnQuaXMoY2FuZGlkYXRlLmNvbnRlbnRzKSB8fFxuICAgICAgICAgICAgTWFya2VkU3RyaW5nLmlzKGNhbmRpZGF0ZS5jb250ZW50cykgfHxcbiAgICAgICAgICAgIElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLmNvbnRlbnRzLCBNYXJrZWRTdHJpbmcuaXMpKSAmJiAodmFsdWUucmFuZ2UgPT09IHVuZGVmaW5lZCB8fCBSYW5nZS5pcyh2YWx1ZS5yYW5nZSkpO1xuICAgIH1cbiAgICBIb3Zlci5pcyA9IGlzO1xufSkoSG92ZXIgfHwgKEhvdmVyID0ge30pKTtcbi8qKlxuICogVGhlIFBhcmFtZXRlckluZm9ybWF0aW9uIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIFBhcmFtZXRlckluZm9ybWF0aW9ufSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBQYXJhbWV0ZXJJbmZvcm1hdGlvbjtcbihmdW5jdGlvbiAoUGFyYW1ldGVySW5mb3JtYXRpb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHBhcmFtZXRlciBpbmZvcm1hdGlvbiBsaXRlcmFsLlxuICAgICAqXG4gICAgICogQHBhcmFtIGxhYmVsIEEgbGFiZWwgc3RyaW5nLlxuICAgICAqIEBwYXJhbSBkb2N1bWVudGF0aW9uIEEgZG9jIHN0cmluZy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobGFiZWwsIGRvY3VtZW50YXRpb24pIHtcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50YXRpb24gPyB7IGxhYmVsLCBkb2N1bWVudGF0aW9uIH0gOiB7IGxhYmVsIH07XG4gICAgfVxuICAgIFBhcmFtZXRlckluZm9ybWF0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKFBhcmFtZXRlckluZm9ybWF0aW9uIHx8IChQYXJhbWV0ZXJJbmZvcm1hdGlvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBTaWduYXR1cmVJbmZvcm1hdGlvbiBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBTaWduYXR1cmVJbmZvcm1hdGlvbn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgU2lnbmF0dXJlSW5mb3JtYXRpb247XG4oZnVuY3Rpb24gKFNpZ25hdHVyZUluZm9ybWF0aW9uKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKGxhYmVsLCBkb2N1bWVudGF0aW9uLCAuLi5wYXJhbWV0ZXJzKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IGxhYmVsIH07XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKGRvY3VtZW50YXRpb24pKSB7XG4gICAgICAgICAgICByZXN1bHQuZG9jdW1lbnRhdGlvbiA9IGRvY3VtZW50YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzLmRlZmluZWQocGFyYW1ldGVycykpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wYXJhbWV0ZXJzID0gcGFyYW1ldGVycztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdC5wYXJhbWV0ZXJzID0gW107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgU2lnbmF0dXJlSW5mb3JtYXRpb24uY3JlYXRlID0gY3JlYXRlO1xufSkoU2lnbmF0dXJlSW5mb3JtYXRpb24gfHwgKFNpZ25hdHVyZUluZm9ybWF0aW9uID0ge30pKTtcbi8qKlxuICogQSBkb2N1bWVudCBoaWdobGlnaHQga2luZC5cbiAqL1xuZXhwb3J0IHZhciBEb2N1bWVudEhpZ2hsaWdodEtpbmQ7XG4oZnVuY3Rpb24gKERvY3VtZW50SGlnaGxpZ2h0S2luZCkge1xuICAgIC8qKlxuICAgICAqIEEgdGV4dHVhbCBvY2N1cnJlbmNlLlxuICAgICAqL1xuICAgIERvY3VtZW50SGlnaGxpZ2h0S2luZC5UZXh0ID0gMTtcbiAgICAvKipcbiAgICAgKiBSZWFkLWFjY2VzcyBvZiBhIHN5bWJvbCwgbGlrZSByZWFkaW5nIGEgdmFyaWFibGUuXG4gICAgICovXG4gICAgRG9jdW1lbnRIaWdobGlnaHRLaW5kLlJlYWQgPSAyO1xuICAgIC8qKlxuICAgICAqIFdyaXRlLWFjY2VzcyBvZiBhIHN5bWJvbCwgbGlrZSB3cml0aW5nIHRvIGEgdmFyaWFibGUuXG4gICAgICovXG4gICAgRG9jdW1lbnRIaWdobGlnaHRLaW5kLldyaXRlID0gMztcbn0pKERvY3VtZW50SGlnaGxpZ2h0S2luZCB8fCAoRG9jdW1lbnRIaWdobGlnaHRLaW5kID0ge30pKTtcbi8qKlxuICogRG9jdW1lbnRIaWdobGlnaHQgbmFtZXNwYWNlIHRvIHByb3ZpZGUgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBEb2N1bWVudEhpZ2hsaWdodH0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgRG9jdW1lbnRIaWdobGlnaHQ7XG4oZnVuY3Rpb24gKERvY3VtZW50SGlnaGxpZ2h0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgRG9jdW1lbnRIaWdobGlnaHQgb2JqZWN0LlxuICAgICAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2UgdGhlIGhpZ2hsaWdodCBhcHBsaWVzIHRvLlxuICAgICAqIEBwYXJhbSBraW5kIFRoZSBoaWdobGlnaHQga2luZFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwga2luZCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0geyByYW5nZSB9O1xuICAgICAgICBpZiAoSXMubnVtYmVyKGtpbmQpKSB7XG4gICAgICAgICAgICByZXN1bHQua2luZCA9IGtpbmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgRG9jdW1lbnRIaWdobGlnaHQuY3JlYXRlID0gY3JlYXRlO1xufSkoRG9jdW1lbnRIaWdobGlnaHQgfHwgKERvY3VtZW50SGlnaGxpZ2h0ID0ge30pKTtcbi8qKlxuICogQSBzeW1ib2wga2luZC5cbiAqL1xuZXhwb3J0IHZhciBTeW1ib2xLaW5kO1xuKGZ1bmN0aW9uIChTeW1ib2xLaW5kKSB7XG4gICAgU3ltYm9sS2luZC5GaWxlID0gMTtcbiAgICBTeW1ib2xLaW5kLk1vZHVsZSA9IDI7XG4gICAgU3ltYm9sS2luZC5OYW1lc3BhY2UgPSAzO1xuICAgIFN5bWJvbEtpbmQuUGFja2FnZSA9IDQ7XG4gICAgU3ltYm9sS2luZC5DbGFzcyA9IDU7XG4gICAgU3ltYm9sS2luZC5NZXRob2QgPSA2O1xuICAgIFN5bWJvbEtpbmQuUHJvcGVydHkgPSA3O1xuICAgIFN5bWJvbEtpbmQuRmllbGQgPSA4O1xuICAgIFN5bWJvbEtpbmQuQ29uc3RydWN0b3IgPSA5O1xuICAgIFN5bWJvbEtpbmQuRW51bSA9IDEwO1xuICAgIFN5bWJvbEtpbmQuSW50ZXJmYWNlID0gMTE7XG4gICAgU3ltYm9sS2luZC5GdW5jdGlvbiA9IDEyO1xuICAgIFN5bWJvbEtpbmQuVmFyaWFibGUgPSAxMztcbiAgICBTeW1ib2xLaW5kLkNvbnN0YW50ID0gMTQ7XG4gICAgU3ltYm9sS2luZC5TdHJpbmcgPSAxNTtcbiAgICBTeW1ib2xLaW5kLk51bWJlciA9IDE2O1xuICAgIFN5bWJvbEtpbmQuQm9vbGVhbiA9IDE3O1xuICAgIFN5bWJvbEtpbmQuQXJyYXkgPSAxODtcbiAgICBTeW1ib2xLaW5kLk9iamVjdCA9IDE5O1xuICAgIFN5bWJvbEtpbmQuS2V5ID0gMjA7XG4gICAgU3ltYm9sS2luZC5OdWxsID0gMjE7XG4gICAgU3ltYm9sS2luZC5FbnVtTWVtYmVyID0gMjI7XG4gICAgU3ltYm9sS2luZC5TdHJ1Y3QgPSAyMztcbiAgICBTeW1ib2xLaW5kLkV2ZW50ID0gMjQ7XG4gICAgU3ltYm9sS2luZC5PcGVyYXRvciA9IDI1O1xuICAgIFN5bWJvbEtpbmQuVHlwZVBhcmFtZXRlciA9IDI2O1xufSkoU3ltYm9sS2luZCB8fCAoU3ltYm9sS2luZCA9IHt9KSk7XG4vKipcbiAqIFN5bWJvbCB0YWdzIGFyZSBleHRyYSBhbm5vdGF0aW9ucyB0aGF0IHR3ZWFrIHRoZSByZW5kZXJpbmcgb2YgYSBzeW1ib2wuXG4gKlxuICogQHNpbmNlIDMuMTZcbiAqL1xuZXhwb3J0IHZhciBTeW1ib2xUYWc7XG4oZnVuY3Rpb24gKFN5bWJvbFRhZykge1xuICAgIC8qKlxuICAgICAqIFJlbmRlciBhIHN5bWJvbCBhcyBvYnNvbGV0ZSwgdXN1YWxseSB1c2luZyBhIHN0cmlrZS1vdXQuXG4gICAgICovXG4gICAgU3ltYm9sVGFnLkRlcHJlY2F0ZWQgPSAxO1xufSkoU3ltYm9sVGFnIHx8IChTeW1ib2xUYWcgPSB7fSkpO1xuZXhwb3J0IHZhciBTeW1ib2xJbmZvcm1hdGlvbjtcbihmdW5jdGlvbiAoU3ltYm9sSW5mb3JtYXRpb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHN5bWJvbCBpbmZvcm1hdGlvbiBsaXRlcmFsLlxuICAgICAqXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0ga2luZCBUaGUga2luZCBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2Ugb2YgdGhlIGxvY2F0aW9uIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgcmVzb3VyY2Ugb2YgdGhlIGxvY2F0aW9uIG9mIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gY29udGFpbmVyTmFtZSBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sIGNvbnRhaW5pbmcgdGhlIHN5bWJvbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobmFtZSwga2luZCwgcmFuZ2UsIHVyaSwgY29udGFpbmVyTmFtZSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGtpbmQsXG4gICAgICAgICAgICBsb2NhdGlvbjogeyB1cmksIHJhbmdlIH1cbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGNvbnRhaW5lck5hbWUpIHtcbiAgICAgICAgICAgIHJlc3VsdC5jb250YWluZXJOYW1lID0gY29udGFpbmVyTmFtZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBTeW1ib2xJbmZvcm1hdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG59KShTeW1ib2xJbmZvcm1hdGlvbiB8fCAoU3ltYm9sSW5mb3JtYXRpb24gPSB7fSkpO1xuZXhwb3J0IHZhciBXb3Jrc3BhY2VTeW1ib2w7XG4oZnVuY3Rpb24gKFdvcmtzcGFjZVN5bWJvbCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyB3b3Jrc3BhY2Ugc3ltYm9sLlxuICAgICAqXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0ga2luZCBUaGUga2luZCBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIHJlc291cmNlIG9mIHRoZSBsb2NhdGlvbiBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSByYW5nZSBBbiBvcHRpb25zIHJhbmdlIG9mIHRoZSBsb2NhdGlvbi5cbiAgICAgKiBAcmV0dXJucyBBIFdvcmtzcGFjZVN5bWJvbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobmFtZSwga2luZCwgdXJpLCByYW5nZSkge1xuICAgICAgICByZXR1cm4gcmFuZ2UgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyB7IG5hbWUsIGtpbmQsIGxvY2F0aW9uOiB7IHVyaSwgcmFuZ2UgfSB9XG4gICAgICAgICAgICA6IHsgbmFtZSwga2luZCwgbG9jYXRpb246IHsgdXJpIH0gfTtcbiAgICB9XG4gICAgV29ya3NwYWNlU3ltYm9sLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKFdvcmtzcGFjZVN5bWJvbCB8fCAoV29ya3NwYWNlU3ltYm9sID0ge30pKTtcbmV4cG9ydCB2YXIgRG9jdW1lbnRTeW1ib2w7XG4oZnVuY3Rpb24gKERvY3VtZW50U3ltYm9sKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBzeW1ib2wgaW5mb3JtYXRpb24gbGl0ZXJhbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIGRldGFpbCBUaGUgZGV0YWlsIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIGtpbmQgVGhlIGtpbmQgb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIHNlbGVjdGlvblJhbmdlIFRoZSBzZWxlY3Rpb25SYW5nZSBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSBjaGlsZHJlbiBDaGlsZHJlbiBvZiB0aGUgc3ltYm9sLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShuYW1lLCBkZXRhaWwsIGtpbmQsIHJhbmdlLCBzZWxlY3Rpb25SYW5nZSwgY2hpbGRyZW4pIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBkZXRhaWwsXG4gICAgICAgICAgICBraW5kLFxuICAgICAgICAgICAgcmFuZ2UsXG4gICAgICAgICAgICBzZWxlY3Rpb25SYW5nZVxuICAgICAgICB9O1xuICAgICAgICBpZiAoY2hpbGRyZW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmNoaWxkcmVuID0gY2hpbGRyZW47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgRG9jdW1lbnRTeW1ib2wuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgRG9jdW1lbnRTeW1ib2x9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiZcbiAgICAgICAgICAgIElzLnN0cmluZyhjYW5kaWRhdGUubmFtZSkgJiYgSXMubnVtYmVyKGNhbmRpZGF0ZS5raW5kKSAmJlxuICAgICAgICAgICAgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUuc2VsZWN0aW9uUmFuZ2UpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmRldGFpbCA9PT0gdW5kZWZpbmVkIHx8IElzLnN0cmluZyhjYW5kaWRhdGUuZGV0YWlsKSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuZGVwcmVjYXRlZCA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLmRlcHJlY2F0ZWQpKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5jaGlsZHJlbiA9PT0gdW5kZWZpbmVkIHx8IEFycmF5LmlzQXJyYXkoY2FuZGlkYXRlLmNoaWxkcmVuKSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUudGFncyA9PT0gdW5kZWZpbmVkIHx8IEFycmF5LmlzQXJyYXkoY2FuZGlkYXRlLnRhZ3MpKTtcbiAgICB9XG4gICAgRG9jdW1lbnRTeW1ib2wuaXMgPSBpcztcbn0pKERvY3VtZW50U3ltYm9sIHx8IChEb2N1bWVudFN5bWJvbCA9IHt9KSk7XG4vKipcbiAqIEEgc2V0IG9mIHByZWRlZmluZWQgY29kZSBhY3Rpb24ga2luZHNcbiAqL1xuZXhwb3J0IHZhciBDb2RlQWN0aW9uS2luZDtcbihmdW5jdGlvbiAoQ29kZUFjdGlvbktpbmQpIHtcbiAgICAvKipcbiAgICAgKiBFbXB0eSBraW5kLlxuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLkVtcHR5ID0gJyc7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciBxdWlja2ZpeCBhY3Rpb25zOiAncXVpY2tmaXgnXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuUXVpY2tGaXggPSAncXVpY2tmaXgnO1xuICAgIC8qKlxuICAgICAqIEJhc2Uga2luZCBmb3IgcmVmYWN0b3JpbmcgYWN0aW9uczogJ3JlZmFjdG9yJ1xuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlJlZmFjdG9yID0gJ3JlZmFjdG9yJztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIHJlZmFjdG9yaW5nIGV4dHJhY3Rpb24gYWN0aW9uczogJ3JlZmFjdG9yLmV4dHJhY3QnXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIGV4dHJhY3QgYWN0aW9uczpcbiAgICAgKlxuICAgICAqIC0gRXh0cmFjdCBtZXRob2RcbiAgICAgKiAtIEV4dHJhY3QgZnVuY3Rpb25cbiAgICAgKiAtIEV4dHJhY3QgdmFyaWFibGVcbiAgICAgKiAtIEV4dHJhY3QgaW50ZXJmYWNlIGZyb20gY2xhc3NcbiAgICAgKiAtIC4uLlxuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlJlZmFjdG9yRXh0cmFjdCA9ICdyZWZhY3Rvci5leHRyYWN0JztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIHJlZmFjdG9yaW5nIGlubGluZSBhY3Rpb25zOiAncmVmYWN0b3IuaW5saW5lJ1xuICAgICAqXG4gICAgICogRXhhbXBsZSBpbmxpbmUgYWN0aW9uczpcbiAgICAgKlxuICAgICAqIC0gSW5saW5lIGZ1bmN0aW9uXG4gICAgICogLSBJbmxpbmUgdmFyaWFibGVcbiAgICAgKiAtIElubGluZSBjb25zdGFudFxuICAgICAqIC0gLi4uXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuUmVmYWN0b3JJbmxpbmUgPSAncmVmYWN0b3IuaW5saW5lJztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIHJlZmFjdG9yaW5nIHJld3JpdGUgYWN0aW9uczogJ3JlZmFjdG9yLnJld3JpdGUnXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIHJld3JpdGUgYWN0aW9uczpcbiAgICAgKlxuICAgICAqIC0gQ29udmVydCBKYXZhU2NyaXB0IGZ1bmN0aW9uIHRvIGNsYXNzXG4gICAgICogLSBBZGQgb3IgcmVtb3ZlIHBhcmFtZXRlclxuICAgICAqIC0gRW5jYXBzdWxhdGUgZmllbGRcbiAgICAgKiAtIE1ha2UgbWV0aG9kIHN0YXRpY1xuICAgICAqIC0gTW92ZSBtZXRob2QgdG8gYmFzZSBjbGFzc1xuICAgICAqIC0gLi4uXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuUmVmYWN0b3JSZXdyaXRlID0gJ3JlZmFjdG9yLnJld3JpdGUnO1xuICAgIC8qKlxuICAgICAqIEJhc2Uga2luZCBmb3Igc291cmNlIGFjdGlvbnM6IGBzb3VyY2VgXG4gICAgICpcbiAgICAgKiBTb3VyY2UgY29kZSBhY3Rpb25zIGFwcGx5IHRvIHRoZSBlbnRpcmUgZmlsZS5cbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5Tb3VyY2UgPSAnc291cmNlJztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIGFuIG9yZ2FuaXplIGltcG9ydHMgc291cmNlIGFjdGlvbjogYHNvdXJjZS5vcmdhbml6ZUltcG9ydHNgXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuU291cmNlT3JnYW5pemVJbXBvcnRzID0gJ3NvdXJjZS5vcmdhbml6ZUltcG9ydHMnO1xuICAgIC8qKlxuICAgICAqIEJhc2Uga2luZCBmb3IgYXV0by1maXggc291cmNlIGFjdGlvbnM6IGBzb3VyY2UuZml4QWxsYC5cbiAgICAgKlxuICAgICAqIEZpeCBhbGwgYWN0aW9ucyBhdXRvbWF0aWNhbGx5IGZpeCBlcnJvcnMgdGhhdCBoYXZlIGEgY2xlYXIgZml4IHRoYXQgZG8gbm90IHJlcXVpcmUgdXNlciBpbnB1dC5cbiAgICAgKiBUaGV5IHNob3VsZCBub3Qgc3VwcHJlc3MgZXJyb3JzIG9yIHBlcmZvcm0gdW5zYWZlIGZpeGVzIHN1Y2ggYXMgZ2VuZXJhdGluZyBuZXcgdHlwZXMgb3IgY2xhc3Nlcy5cbiAgICAgKlxuICAgICAqIEBzaW5jZSAzLjE1LjBcbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5Tb3VyY2VGaXhBbGwgPSAnc291cmNlLmZpeEFsbCc7XG59KShDb2RlQWN0aW9uS2luZCB8fCAoQ29kZUFjdGlvbktpbmQgPSB7fSkpO1xuLyoqXG4gKiBUaGUgcmVhc29uIHdoeSBjb2RlIGFjdGlvbnMgd2VyZSByZXF1ZXN0ZWQuXG4gKlxuICogQHNpbmNlIDMuMTcuMFxuICovXG5leHBvcnQgdmFyIENvZGVBY3Rpb25UcmlnZ2VyS2luZDtcbihmdW5jdGlvbiAoQ29kZUFjdGlvblRyaWdnZXJLaW5kKSB7XG4gICAgLyoqXG4gICAgICogQ29kZSBhY3Rpb25zIHdlcmUgZXhwbGljaXRseSByZXF1ZXN0ZWQgYnkgdGhlIHVzZXIgb3IgYnkgYW4gZXh0ZW5zaW9uLlxuICAgICAqL1xuICAgIENvZGVBY3Rpb25UcmlnZ2VyS2luZC5JbnZva2VkID0gMTtcbiAgICAvKipcbiAgICAgKiBDb2RlIGFjdGlvbnMgd2VyZSByZXF1ZXN0ZWQgYXV0b21hdGljYWxseS5cbiAgICAgKlxuICAgICAqIFRoaXMgdHlwaWNhbGx5IGhhcHBlbnMgd2hlbiBjdXJyZW50IHNlbGVjdGlvbiBpbiBhIGZpbGUgY2hhbmdlcywgYnV0IGNhblxuICAgICAqIGFsc28gYmUgdHJpZ2dlcmVkIHdoZW4gZmlsZSBjb250ZW50IGNoYW5nZXMuXG4gICAgICovXG4gICAgQ29kZUFjdGlvblRyaWdnZXJLaW5kLkF1dG9tYXRpYyA9IDI7XG59KShDb2RlQWN0aW9uVHJpZ2dlcktpbmQgfHwgKENvZGVBY3Rpb25UcmlnZ2VyS2luZCA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb2RlQWN0aW9uQ29udGV4dCBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBDb2RlQWN0aW9uQ29udGV4dH0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgQ29kZUFjdGlvbkNvbnRleHQ7XG4oZnVuY3Rpb24gKENvZGVBY3Rpb25Db250ZXh0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDb2RlQWN0aW9uQ29udGV4dCBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShkaWFnbm9zdGljcywgb25seSwgdHJpZ2dlcktpbmQpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHsgZGlhZ25vc3RpY3MgfTtcbiAgICAgICAgaWYgKG9ubHkgIT09IHVuZGVmaW5lZCAmJiBvbmx5ICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXN1bHQub25seSA9IG9ubHk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyaWdnZXJLaW5kICE9PSB1bmRlZmluZWQgJiYgdHJpZ2dlcktpbmQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJlc3VsdC50cmlnZ2VyS2luZCA9IHRyaWdnZXJLaW5kO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIENvZGVBY3Rpb25Db250ZXh0LmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIENvZGVBY3Rpb25Db250ZXh0fSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLmRpYWdub3N0aWNzLCBEaWFnbm9zdGljLmlzKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS5vbmx5ID09PSB1bmRlZmluZWQgfHwgSXMudHlwZWRBcnJheShjYW5kaWRhdGUub25seSwgSXMuc3RyaW5nKSlcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUudHJpZ2dlcktpbmQgPT09IHVuZGVmaW5lZCB8fCBjYW5kaWRhdGUudHJpZ2dlcktpbmQgPT09IENvZGVBY3Rpb25UcmlnZ2VyS2luZC5JbnZva2VkIHx8IGNhbmRpZGF0ZS50cmlnZ2VyS2luZCA9PT0gQ29kZUFjdGlvblRyaWdnZXJLaW5kLkF1dG9tYXRpYyk7XG4gICAgfVxuICAgIENvZGVBY3Rpb25Db250ZXh0LmlzID0gaXM7XG59KShDb2RlQWN0aW9uQ29udGV4dCB8fCAoQ29kZUFjdGlvbkNvbnRleHQgPSB7fSkpO1xuZXhwb3J0IHZhciBDb2RlQWN0aW9uO1xuKGZ1bmN0aW9uIChDb2RlQWN0aW9uKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKHRpdGxlLCBraW5kT3JDb21tYW5kT3JFZGl0LCBraW5kKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IHRpdGxlIH07XG4gICAgICAgIGxldCBjaGVja0tpbmQgPSB0cnVlO1xuICAgICAgICBpZiAodHlwZW9mIGtpbmRPckNvbW1hbmRPckVkaXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjaGVja0tpbmQgPSBmYWxzZTtcbiAgICAgICAgICAgIHJlc3VsdC5raW5kID0ga2luZE9yQ29tbWFuZE9yRWRpdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChDb21tYW5kLmlzKGtpbmRPckNvbW1hbmRPckVkaXQpKSB7XG4gICAgICAgICAgICByZXN1bHQuY29tbWFuZCA9IGtpbmRPckNvbW1hbmRPckVkaXQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQuZWRpdCA9IGtpbmRPckNvbW1hbmRPckVkaXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoZWNrS2luZCAmJiBraW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5raW5kID0ga2luZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBDb2RlQWN0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS50aXRsZSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuZGlhZ25vc3RpY3MgPT09IHVuZGVmaW5lZCB8fCBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS5kaWFnbm9zdGljcywgRGlhZ25vc3RpYy5pcykpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmtpbmQgPT09IHVuZGVmaW5lZCB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLmtpbmQpKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5lZGl0ICE9PSB1bmRlZmluZWQgfHwgY2FuZGlkYXRlLmNvbW1hbmQgIT09IHVuZGVmaW5lZCkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuY29tbWFuZCA9PT0gdW5kZWZpbmVkIHx8IENvbW1hbmQuaXMoY2FuZGlkYXRlLmNvbW1hbmQpKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5pc1ByZWZlcnJlZCA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLmlzUHJlZmVycmVkKSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuZWRpdCA9PT0gdW5kZWZpbmVkIHx8IFdvcmtzcGFjZUVkaXQuaXMoY2FuZGlkYXRlLmVkaXQpKTtcbiAgICB9XG4gICAgQ29kZUFjdGlvbi5pcyA9IGlzO1xufSkoQ29kZUFjdGlvbiB8fCAoQ29kZUFjdGlvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb2RlTGVucyBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBDb2RlTGVuc30gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgQ29kZUxlbnM7XG4oZnVuY3Rpb24gKENvZGVMZW5zKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDb2RlTGVucyBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgZGF0YSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0geyByYW5nZSB9O1xuICAgICAgICBpZiAoSXMuZGVmaW5lZChkYXRhKSkge1xuICAgICAgICAgICAgcmVzdWx0LmRhdGEgPSBkYXRhO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIENvZGVMZW5zLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIENvZGVMZW5zfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUuY29tbWFuZCkgfHwgQ29tbWFuZC5pcyhjYW5kaWRhdGUuY29tbWFuZCkpO1xuICAgIH1cbiAgICBDb2RlTGVucy5pcyA9IGlzO1xufSkoQ29kZUxlbnMgfHwgKENvZGVMZW5zID0ge30pKTtcbi8qKlxuICogVGhlIEZvcm1hdHRpbmdPcHRpb25zIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIEZvcm1hdHRpbmdPcHRpb25zfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBGb3JtYXR0aW5nT3B0aW9ucztcbihmdW5jdGlvbiAoRm9ybWF0dGluZ09wdGlvbnMpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IEZvcm1hdHRpbmdPcHRpb25zIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHRhYlNpemUsIGluc2VydFNwYWNlcykge1xuICAgICAgICByZXR1cm4geyB0YWJTaXplLCBpbnNlcnRTcGFjZXMgfTtcbiAgICB9XG4gICAgRm9ybWF0dGluZ09wdGlvbnMuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgRm9ybWF0dGluZ09wdGlvbnN9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMudWludGVnZXIoY2FuZGlkYXRlLnRhYlNpemUpICYmIElzLmJvb2xlYW4oY2FuZGlkYXRlLmluc2VydFNwYWNlcyk7XG4gICAgfVxuICAgIEZvcm1hdHRpbmdPcHRpb25zLmlzID0gaXM7XG59KShGb3JtYXR0aW5nT3B0aW9ucyB8fCAoRm9ybWF0dGluZ09wdGlvbnMgPSB7fSkpO1xuLyoqXG4gKiBUaGUgRG9jdW1lbnRMaW5rIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIERvY3VtZW50TGlua30gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgRG9jdW1lbnRMaW5rO1xuKGZ1bmN0aW9uIChEb2N1bWVudExpbmspIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IERvY3VtZW50TGluayBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgdGFyZ2V0LCBkYXRhKSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCB0YXJnZXQsIGRhdGEgfTtcbiAgICB9XG4gICAgRG9jdW1lbnRMaW5rLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIERvY3VtZW50TGlua30gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLnRhcmdldCkgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS50YXJnZXQpKTtcbiAgICB9XG4gICAgRG9jdW1lbnRMaW5rLmlzID0gaXM7XG59KShEb2N1bWVudExpbmsgfHwgKERvY3VtZW50TGluayA9IHt9KSk7XG4vKipcbiAqIFRoZSBTZWxlY3Rpb25SYW5nZSBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9uIHRvIHdvcmsgd2l0aFxuICogU2VsZWN0aW9uUmFuZ2UgbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgU2VsZWN0aW9uUmFuZ2U7XG4oZnVuY3Rpb24gKFNlbGVjdGlvblJhbmdlKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBTZWxlY3Rpb25SYW5nZVxuICAgICAqIEBwYXJhbSByYW5nZSB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHBhcmVudCBhbiBvcHRpb25hbCBwYXJlbnQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCBwYXJlbnQpIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIHBhcmVudCB9O1xuICAgIH1cbiAgICBTZWxlY3Rpb25SYW5nZS5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgKGNhbmRpZGF0ZS5wYXJlbnQgPT09IHVuZGVmaW5lZCB8fCBTZWxlY3Rpb25SYW5nZS5pcyhjYW5kaWRhdGUucGFyZW50KSk7XG4gICAgfVxuICAgIFNlbGVjdGlvblJhbmdlLmlzID0gaXM7XG59KShTZWxlY3Rpb25SYW5nZSB8fCAoU2VsZWN0aW9uUmFuZ2UgPSB7fSkpO1xuLyoqXG4gKiBBIHNldCBvZiBwcmVkZWZpbmVkIHRva2VuIHR5cGVzLiBUaGlzIHNldCBpcyBub3QgZml4ZWRcbiAqIGFuIGNsaWVudHMgY2FuIHNwZWNpZnkgYWRkaXRpb25hbCB0b2tlbiB0eXBlcyB2aWEgdGhlXG4gKiBjb3JyZXNwb25kaW5nIGNsaWVudCBjYXBhYmlsaXRpZXMuXG4gKlxuICogQHNpbmNlIDMuMTYuMFxuICovXG5leHBvcnQgdmFyIFNlbWFudGljVG9rZW5UeXBlcztcbihmdW5jdGlvbiAoU2VtYW50aWNUb2tlblR5cGVzKSB7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wibmFtZXNwYWNlXCJdID0gXCJuYW1lc3BhY2VcIjtcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgZ2VuZXJpYyB0eXBlLiBBY3RzIGFzIGEgZmFsbGJhY2sgZm9yIHR5cGVzIHdoaWNoIGNhbid0IGJlIG1hcHBlZCB0b1xuICAgICAqIGEgc3BlY2lmaWMgdHlwZSBsaWtlIGNsYXNzIG9yIGVudW0uXG4gICAgICovXG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1widHlwZVwiXSA9IFwidHlwZVwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImNsYXNzXCJdID0gXCJjbGFzc1wiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImVudW1cIl0gPSBcImVudW1cIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJpbnRlcmZhY2VcIl0gPSBcImludGVyZmFjZVwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInN0cnVjdFwiXSA9IFwic3RydWN0XCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1widHlwZVBhcmFtZXRlclwiXSA9IFwidHlwZVBhcmFtZXRlclwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInBhcmFtZXRlclwiXSA9IFwicGFyYW1ldGVyXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1widmFyaWFibGVcIl0gPSBcInZhcmlhYmxlXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wicHJvcGVydHlcIl0gPSBcInByb3BlcnR5XCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wiZW51bU1lbWJlclwiXSA9IFwiZW51bU1lbWJlclwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImV2ZW50XCJdID0gXCJldmVudFwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImZ1bmN0aW9uXCJdID0gXCJmdW5jdGlvblwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcIm1ldGhvZFwiXSA9IFwibWV0aG9kXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wibWFjcm9cIl0gPSBcIm1hY3JvXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wia2V5d29yZFwiXSA9IFwia2V5d29yZFwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcIm1vZGlmaWVyXCJdID0gXCJtb2RpZmllclwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImNvbW1lbnRcIl0gPSBcImNvbW1lbnRcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJzdHJpbmdcIl0gPSBcInN0cmluZ1wiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcIm51bWJlclwiXSA9IFwibnVtYmVyXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wicmVnZXhwXCJdID0gXCJyZWdleHBcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJvcGVyYXRvclwiXSA9IFwib3BlcmF0b3JcIjtcbiAgICAvKipcbiAgICAgKiBAc2luY2UgMy4xNy4wXG4gICAgICovXG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wiZGVjb3JhdG9yXCJdID0gXCJkZWNvcmF0b3JcIjtcbn0pKFNlbWFudGljVG9rZW5UeXBlcyB8fCAoU2VtYW50aWNUb2tlblR5cGVzID0ge30pKTtcbi8qKlxuICogQSBzZXQgb2YgcHJlZGVmaW5lZCB0b2tlbiBtb2RpZmllcnMuIFRoaXMgc2V0IGlzIG5vdCBmaXhlZFxuICogYW4gY2xpZW50cyBjYW4gc3BlY2lmeSBhZGRpdGlvbmFsIHRva2VuIHR5cGVzIHZpYSB0aGVcbiAqIGNvcnJlc3BvbmRpbmcgY2xpZW50IGNhcGFiaWxpdGllcy5cbiAqXG4gKiBAc2luY2UgMy4xNi4wXG4gKi9cbmV4cG9ydCB2YXIgU2VtYW50aWNUb2tlbk1vZGlmaWVycztcbihmdW5jdGlvbiAoU2VtYW50aWNUb2tlbk1vZGlmaWVycykge1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJkZWNsYXJhdGlvblwiXSA9IFwiZGVjbGFyYXRpb25cIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wiZGVmaW5pdGlvblwiXSA9IFwiZGVmaW5pdGlvblwiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJyZWFkb25seVwiXSA9IFwicmVhZG9ubHlcIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wic3RhdGljXCJdID0gXCJzdGF0aWNcIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wiZGVwcmVjYXRlZFwiXSA9IFwiZGVwcmVjYXRlZFwiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJhYnN0cmFjdFwiXSA9IFwiYWJzdHJhY3RcIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wiYXN5bmNcIl0gPSBcImFzeW5jXCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcIm1vZGlmaWNhdGlvblwiXSA9IFwibW9kaWZpY2F0aW9uXCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcImRvY3VtZW50YXRpb25cIl0gPSBcImRvY3VtZW50YXRpb25cIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wiZGVmYXVsdExpYnJhcnlcIl0gPSBcImRlZmF1bHRMaWJyYXJ5XCI7XG59KShTZW1hbnRpY1Rva2VuTW9kaWZpZXJzIHx8IChTZW1hbnRpY1Rva2VuTW9kaWZpZXJzID0ge30pKTtcbi8qKlxuICogQHNpbmNlIDMuMTYuMFxuICovXG5leHBvcnQgdmFyIFNlbWFudGljVG9rZW5zO1xuKGZ1bmN0aW9uIChTZW1hbnRpY1Rva2Vucykge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIChjYW5kaWRhdGUucmVzdWx0SWQgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgY2FuZGlkYXRlLnJlc3VsdElkID09PSAnc3RyaW5nJykgJiZcbiAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoY2FuZGlkYXRlLmRhdGEpICYmIChjYW5kaWRhdGUuZGF0YS5sZW5ndGggPT09IDAgfHwgdHlwZW9mIGNhbmRpZGF0ZS5kYXRhWzBdID09PSAnbnVtYmVyJyk7XG4gICAgfVxuICAgIFNlbWFudGljVG9rZW5zLmlzID0gaXM7XG59KShTZW1hbnRpY1Rva2VucyB8fCAoU2VtYW50aWNUb2tlbnMgPSB7fSkpO1xuLyoqXG4gKiBUaGUgSW5saW5lVmFsdWVUZXh0IG5hbWVzcGFjZSBwcm92aWRlcyBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIElubGluZVZhbHVlVGV4dHMuXG4gKlxuICogQHNpbmNlIDMuMTcuMFxuICovXG5leHBvcnQgdmFyIElubGluZVZhbHVlVGV4dDtcbihmdW5jdGlvbiAoSW5saW5lVmFsdWVUZXh0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBJbmxpbmVWYWx1ZVRleHQgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIHRleHQpIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIHRleHQgfTtcbiAgICB9XG4gICAgSW5saW5lVmFsdWVUZXh0LmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAhPT0gdW5kZWZpbmVkICYmIGNhbmRpZGF0ZSAhPT0gbnVsbCAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudGV4dCk7XG4gICAgfVxuICAgIElubGluZVZhbHVlVGV4dC5pcyA9IGlzO1xufSkoSW5saW5lVmFsdWVUZXh0IHx8IChJbmxpbmVWYWx1ZVRleHQgPSB7fSkpO1xuLyoqXG4gKiBUaGUgSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cCBuYW1lc3BhY2UgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCBJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3Vwcy5cbiAqXG4gKiBAc2luY2UgMy4xNy4wXG4gKi9cbmV4cG9ydCB2YXIgSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cDtcbihmdW5jdGlvbiAoSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgSW5saW5lVmFsdWVUZXh0IGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCB2YXJpYWJsZU5hbWUsIGNhc2VTZW5zaXRpdmVMb29rdXApIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIHZhcmlhYmxlTmFtZSwgY2FzZVNlbnNpdGl2ZUxvb2t1cCB9O1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAhPT0gdW5kZWZpbmVkICYmIGNhbmRpZGF0ZSAhPT0gbnVsbCAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIElzLmJvb2xlYW4oY2FuZGlkYXRlLmNhc2VTZW5zaXRpdmVMb29rdXApXG4gICAgICAgICAgICAmJiAoSXMuc3RyaW5nKGNhbmRpZGF0ZS52YXJpYWJsZU5hbWUpIHx8IGNhbmRpZGF0ZS52YXJpYWJsZU5hbWUgPT09IHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIElubGluZVZhbHVlVmFyaWFibGVMb29rdXAuaXMgPSBpcztcbn0pKElubGluZVZhbHVlVmFyaWFibGVMb29rdXAgfHwgKElubGluZVZhbHVlVmFyaWFibGVMb29rdXAgPSB7fSkpO1xuLyoqXG4gKiBUaGUgSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24gbmFtZXNwYWNlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGggSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24uXG4gKlxuICogQHNpbmNlIDMuMTcuMFxuICovXG5leHBvcnQgdmFyIElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uO1xuKGZ1bmN0aW9uIChJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24gbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIGV4cHJlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIGV4cHJlc3Npb24gfTtcbiAgICB9XG4gICAgSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24uY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICE9PSB1bmRlZmluZWQgJiYgY2FuZGlkYXRlICE9PSBudWxsICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSlcbiAgICAgICAgICAgICYmIChJcy5zdHJpbmcoY2FuZGlkYXRlLmV4cHJlc3Npb24pIHx8IGNhbmRpZGF0ZS5leHByZXNzaW9uID09PSB1bmRlZmluZWQpO1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbi5pcyA9IGlzO1xufSkoSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24gfHwgKElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uID0ge30pKTtcbi8qKlxuICogVGhlIElubGluZVZhbHVlQ29udGV4dCBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBJbmxpbmVWYWx1ZUNvbnRleHR9IGxpdGVyYWxzLlxuICpcbiAqIEBzaW5jZSAzLjE3LjBcbiAqL1xuZXhwb3J0IHZhciBJbmxpbmVWYWx1ZUNvbnRleHQ7XG4oZnVuY3Rpb24gKElubGluZVZhbHVlQ29udGV4dCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgSW5saW5lVmFsdWVDb250ZXh0IGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGZyYW1lSWQsIHN0b3BwZWRMb2NhdGlvbikge1xuICAgICAgICByZXR1cm4geyBmcmFtZUlkLCBzdG9wcGVkTG9jYXRpb24gfTtcbiAgICB9XG4gICAgSW5saW5lVmFsdWVDb250ZXh0LmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIElubGluZVZhbHVlQ29udGV4dH0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIFJhbmdlLmlzKHZhbHVlLnN0b3BwZWRMb2NhdGlvbik7XG4gICAgfVxuICAgIElubGluZVZhbHVlQ29udGV4dC5pcyA9IGlzO1xufSkoSW5saW5lVmFsdWVDb250ZXh0IHx8IChJbmxpbmVWYWx1ZUNvbnRleHQgPSB7fSkpO1xuLyoqXG4gKiBJbmxheSBoaW50IGtpbmRzLlxuICpcbiAqIEBzaW5jZSAzLjE3LjBcbiAqL1xuZXhwb3J0IHZhciBJbmxheUhpbnRLaW5kO1xuKGZ1bmN0aW9uIChJbmxheUhpbnRLaW5kKSB7XG4gICAgLyoqXG4gICAgICogQW4gaW5sYXkgaGludCB0aGF0IGZvciBhIHR5cGUgYW5ub3RhdGlvbi5cbiAgICAgKi9cbiAgICBJbmxheUhpbnRLaW5kLlR5cGUgPSAxO1xuICAgIC8qKlxuICAgICAqIEFuIGlubGF5IGhpbnQgdGhhdCBpcyBmb3IgYSBwYXJhbWV0ZXIuXG4gICAgICovXG4gICAgSW5sYXlIaW50S2luZC5QYXJhbWV0ZXIgPSAyO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gMSB8fCB2YWx1ZSA9PT0gMjtcbiAgICB9XG4gICAgSW5sYXlIaW50S2luZC5pcyA9IGlzO1xufSkoSW5sYXlIaW50S2luZCB8fCAoSW5sYXlIaW50S2luZCA9IHt9KSk7XG5leHBvcnQgdmFyIElubGF5SGludExhYmVsUGFydDtcbihmdW5jdGlvbiAoSW5sYXlIaW50TGFiZWxQYXJ0KSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB7IHZhbHVlIH07XG4gICAgfVxuICAgIElubGF5SGludExhYmVsUGFydC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSlcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUudG9vbHRpcCA9PT0gdW5kZWZpbmVkIHx8IElzLnN0cmluZyhjYW5kaWRhdGUudG9vbHRpcCkgfHwgTWFya3VwQ29udGVudC5pcyhjYW5kaWRhdGUudG9vbHRpcCkpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLmxvY2F0aW9uID09PSB1bmRlZmluZWQgfHwgTG9jYXRpb24uaXMoY2FuZGlkYXRlLmxvY2F0aW9uKSlcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUuY29tbWFuZCA9PT0gdW5kZWZpbmVkIHx8IENvbW1hbmQuaXMoY2FuZGlkYXRlLmNvbW1hbmQpKTtcbiAgICB9XG4gICAgSW5sYXlIaW50TGFiZWxQYXJ0LmlzID0gaXM7XG59KShJbmxheUhpbnRMYWJlbFBhcnQgfHwgKElubGF5SGludExhYmVsUGFydCA9IHt9KSk7XG5leHBvcnQgdmFyIElubGF5SGludDtcbihmdW5jdGlvbiAoSW5sYXlIaW50KSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKHBvc2l0aW9uLCBsYWJlbCwga2luZCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB7IHBvc2l0aW9uLCBsYWJlbCB9O1xuICAgICAgICBpZiAoa2luZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQua2luZCA9IGtpbmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgSW5sYXlIaW50LmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBQb3NpdGlvbi5pcyhjYW5kaWRhdGUucG9zaXRpb24pXG4gICAgICAgICAgICAmJiAoSXMuc3RyaW5nKGNhbmRpZGF0ZS5sYWJlbCkgfHwgSXMudHlwZWRBcnJheShjYW5kaWRhdGUubGFiZWwsIElubGF5SGludExhYmVsUGFydC5pcykpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLmtpbmQgPT09IHVuZGVmaW5lZCB8fCBJbmxheUhpbnRLaW5kLmlzKGNhbmRpZGF0ZS5raW5kKSlcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUudGV4dEVkaXRzID09PSB1bmRlZmluZWQpIHx8IElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLnRleHRFZGl0cywgVGV4dEVkaXQuaXMpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLnRvb2x0aXAgPT09IHVuZGVmaW5lZCB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLnRvb2x0aXApIHx8IE1hcmt1cENvbnRlbnQuaXMoY2FuZGlkYXRlLnRvb2x0aXApKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS5wYWRkaW5nTGVmdCA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLnBhZGRpbmdMZWZ0KSlcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUucGFkZGluZ1JpZ2h0ID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUucGFkZGluZ1JpZ2h0KSk7XG4gICAgfVxuICAgIElubGF5SGludC5pcyA9IGlzO1xufSkoSW5sYXlIaW50IHx8IChJbmxheUhpbnQgPSB7fSkpO1xuZXhwb3J0IHZhciBTdHJpbmdWYWx1ZTtcbihmdW5jdGlvbiAoU3RyaW5nVmFsdWUpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGVTbmlwcGV0KHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB7IGtpbmQ6ICdzbmlwcGV0JywgdmFsdWUgfTtcbiAgICB9XG4gICAgU3RyaW5nVmFsdWUuY3JlYXRlU25pcHBldCA9IGNyZWF0ZVNuaXBwZXQ7XG59KShTdHJpbmdWYWx1ZSB8fCAoU3RyaW5nVmFsdWUgPSB7fSkpO1xuZXhwb3J0IHZhciBJbmxpbmVDb21wbGV0aW9uSXRlbTtcbihmdW5jdGlvbiAoSW5saW5lQ29tcGxldGlvbkl0ZW0pIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUoaW5zZXJ0VGV4dCwgZmlsdGVyVGV4dCwgcmFuZ2UsIGNvbW1hbmQpIHtcbiAgICAgICAgcmV0dXJuIHsgaW5zZXJ0VGV4dCwgZmlsdGVyVGV4dCwgcmFuZ2UsIGNvbW1hbmQgfTtcbiAgICB9XG4gICAgSW5saW5lQ29tcGxldGlvbkl0ZW0uY3JlYXRlID0gY3JlYXRlO1xufSkoSW5saW5lQ29tcGxldGlvbkl0ZW0gfHwgKElubGluZUNvbXBsZXRpb25JdGVtID0ge30pKTtcbmV4cG9ydCB2YXIgSW5saW5lQ29tcGxldGlvbkxpc3Q7XG4oZnVuY3Rpb24gKElubGluZUNvbXBsZXRpb25MaXN0KSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKGl0ZW1zKSB7XG4gICAgICAgIHJldHVybiB7IGl0ZW1zIH07XG4gICAgfVxuICAgIElubGluZUNvbXBsZXRpb25MaXN0LmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKElubGluZUNvbXBsZXRpb25MaXN0IHx8IChJbmxpbmVDb21wbGV0aW9uTGlzdCA9IHt9KSk7XG4vKipcbiAqIERlc2NyaWJlcyBob3cgYW4ge0BsaW5rIElubGluZUNvbXBsZXRpb25JdGVtUHJvdmlkZXIgaW5saW5lIGNvbXBsZXRpb24gcHJvdmlkZXJ9IHdhcyB0cmlnZ2VyZWQuXG4gKlxuICogQHNpbmNlIDMuMTguMFxuICogQHByb3Bvc2VkXG4gKi9cbmV4cG9ydCB2YXIgSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kO1xuKGZ1bmN0aW9uIChJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmQpIHtcbiAgICAvKipcbiAgICAgKiBDb21wbGV0aW9uIHdhcyB0cmlnZ2VyZWQgZXhwbGljaXRseSBieSBhIHVzZXIgZ2VzdHVyZS5cbiAgICAgKi9cbiAgICBJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmQuSW52b2tlZCA9IDA7XG4gICAgLyoqXG4gICAgICogQ29tcGxldGlvbiB3YXMgdHJpZ2dlcmVkIGF1dG9tYXRpY2FsbHkgd2hpbGUgZWRpdGluZy5cbiAgICAgKi9cbiAgICBJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmQuQXV0b21hdGljID0gMTtcbn0pKElubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZCB8fCAoSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kID0ge30pKTtcbmV4cG9ydCB2YXIgU2VsZWN0ZWRDb21wbGV0aW9uSW5mbztcbihmdW5jdGlvbiAoU2VsZWN0ZWRDb21wbGV0aW9uSW5mbykge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgdGV4dCkge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgdGV4dCB9O1xuICAgIH1cbiAgICBTZWxlY3RlZENvbXBsZXRpb25JbmZvLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKFNlbGVjdGVkQ29tcGxldGlvbkluZm8gfHwgKFNlbGVjdGVkQ29tcGxldGlvbkluZm8gPSB7fSkpO1xuZXhwb3J0IHZhciBJbmxpbmVDb21wbGV0aW9uQ29udGV4dDtcbihmdW5jdGlvbiAoSW5saW5lQ29tcGxldGlvbkNvbnRleHQpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUodHJpZ2dlcktpbmQsIHNlbGVjdGVkQ29tcGxldGlvbkluZm8pIHtcbiAgICAgICAgcmV0dXJuIHsgdHJpZ2dlcktpbmQsIHNlbGVjdGVkQ29tcGxldGlvbkluZm8gfTtcbiAgICB9XG4gICAgSW5saW5lQ29tcGxldGlvbkNvbnRleHQuY3JlYXRlID0gY3JlYXRlO1xufSkoSW5saW5lQ29tcGxldGlvbkNvbnRleHQgfHwgKElubGluZUNvbXBsZXRpb25Db250ZXh0ID0ge30pKTtcbmV4cG9ydCB2YXIgV29ya3NwYWNlRm9sZGVyO1xuKGZ1bmN0aW9uIChXb3Jrc3BhY2VGb2xkZXIpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBVUkkuaXMoY2FuZGlkYXRlLnVyaSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5uYW1lKTtcbiAgICB9XG4gICAgV29ya3NwYWNlRm9sZGVyLmlzID0gaXM7XG59KShXb3Jrc3BhY2VGb2xkZXIgfHwgKFdvcmtzcGFjZUZvbGRlciA9IHt9KSk7XG5leHBvcnQgY29uc3QgRU9MID0gWydcXG4nLCAnXFxyXFxuJywgJ1xcciddO1xuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgdGhlIHRleHQgZG9jdW1lbnQgZnJvbSB0aGUgbmV3IHZzY29kZS1sYW5ndWFnZXNlcnZlci10ZXh0ZG9jdW1lbnQgcGFja2FnZS5cbiAqL1xuZXhwb3J0IHZhciBUZXh0RG9jdW1lbnQ7XG4oZnVuY3Rpb24gKFRleHREb2N1bWVudCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgSVRleHREb2N1bWVudCBsaXRlcmFsIGZyb20gdGhlIGdpdmVuIHVyaSBhbmQgY29udGVudC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSBkb2N1bWVudCdzIHVyaS5cbiAgICAgKiBAcGFyYW0gbGFuZ3VhZ2VJZCBUaGUgZG9jdW1lbnQncyBsYW5ndWFnZSBJZC5cbiAgICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgZG9jdW1lbnQncyB2ZXJzaW9uLlxuICAgICAqIEBwYXJhbSBjb250ZW50IFRoZSBkb2N1bWVudCdzIGNvbnRlbnQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHVyaSwgbGFuZ3VhZ2VJZCwgdmVyc2lvbiwgY29udGVudCkge1xuICAgICAgICByZXR1cm4gbmV3IEZ1bGxUZXh0RG9jdW1lbnQodXJpLCBsYW5ndWFnZUlkLCB2ZXJzaW9uLCBjb250ZW50KTtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50LmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIElUZXh0RG9jdW1lbnR9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLmxhbmd1YWdlSWQpIHx8IElzLnN0cmluZyhjYW5kaWRhdGUubGFuZ3VhZ2VJZCkpICYmIElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS5saW5lQ291bnQpXG4gICAgICAgICAgICAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5nZXRUZXh0KSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5wb3NpdGlvbkF0KSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5vZmZzZXRBdCkgPyB0cnVlIDogZmFsc2U7XG4gICAgfVxuICAgIFRleHREb2N1bWVudC5pcyA9IGlzO1xuICAgIGZ1bmN0aW9uIGFwcGx5RWRpdHMoZG9jdW1lbnQsIGVkaXRzKSB7XG4gICAgICAgIGxldCB0ZXh0ID0gZG9jdW1lbnQuZ2V0VGV4dCgpO1xuICAgICAgICBsZXQgc29ydGVkRWRpdHMgPSBtZXJnZVNvcnQoZWRpdHMsIChhLCBiKSA9PiB7XG4gICAgICAgICAgICBsZXQgZGlmZiA9IGEucmFuZ2Uuc3RhcnQubGluZSAtIGIucmFuZ2Uuc3RhcnQubGluZTtcbiAgICAgICAgICAgIGlmIChkaWZmID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEucmFuZ2Uuc3RhcnQuY2hhcmFjdGVyIC0gYi5yYW5nZS5zdGFydC5jaGFyYWN0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZGlmZjtcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBsYXN0TW9kaWZpZWRPZmZzZXQgPSB0ZXh0Lmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaSA9IHNvcnRlZEVkaXRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBsZXQgZSA9IHNvcnRlZEVkaXRzW2ldO1xuICAgICAgICAgICAgbGV0IHN0YXJ0T2Zmc2V0ID0gZG9jdW1lbnQub2Zmc2V0QXQoZS5yYW5nZS5zdGFydCk7XG4gICAgICAgICAgICBsZXQgZW5kT2Zmc2V0ID0gZG9jdW1lbnQub2Zmc2V0QXQoZS5yYW5nZS5lbmQpO1xuICAgICAgICAgICAgaWYgKGVuZE9mZnNldCA8PSBsYXN0TW9kaWZpZWRPZmZzZXQpIHtcbiAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMCwgc3RhcnRPZmZzZXQpICsgZS5uZXdUZXh0ICsgdGV4dC5zdWJzdHJpbmcoZW5kT2Zmc2V0LCB0ZXh0Lmxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ092ZXJsYXBwaW5nIGVkaXQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxhc3RNb2RpZmllZE9mZnNldCA9IHN0YXJ0T2Zmc2V0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnQuYXBwbHlFZGl0cyA9IGFwcGx5RWRpdHM7XG4gICAgZnVuY3Rpb24gbWVyZ2VTb3J0KGRhdGEsIGNvbXBhcmUpIHtcbiAgICAgICAgaWYgKGRhdGEubGVuZ3RoIDw9IDEpIHtcbiAgICAgICAgICAgIC8vIHNvcnRlZFxuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcCA9IChkYXRhLmxlbmd0aCAvIDIpIHwgMDtcbiAgICAgICAgY29uc3QgbGVmdCA9IGRhdGEuc2xpY2UoMCwgcCk7XG4gICAgICAgIGNvbnN0IHJpZ2h0ID0gZGF0YS5zbGljZShwKTtcbiAgICAgICAgbWVyZ2VTb3J0KGxlZnQsIGNvbXBhcmUpO1xuICAgICAgICBtZXJnZVNvcnQocmlnaHQsIGNvbXBhcmUpO1xuICAgICAgICBsZXQgbGVmdElkeCA9IDA7XG4gICAgICAgIGxldCByaWdodElkeCA9IDA7XG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgd2hpbGUgKGxlZnRJZHggPCBsZWZ0Lmxlbmd0aCAmJiByaWdodElkeCA8IHJpZ2h0Lmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IHJldCA9IGNvbXBhcmUobGVmdFtsZWZ0SWR4XSwgcmlnaHRbcmlnaHRJZHhdKTtcbiAgICAgICAgICAgIGlmIChyZXQgPD0gMCkge1xuICAgICAgICAgICAgICAgIC8vIHNtYWxsZXJfZXF1YWwgLT4gdGFrZSBsZWZ0IHRvIHByZXNlcnZlIG9yZGVyXG4gICAgICAgICAgICAgICAgZGF0YVtpKytdID0gbGVmdFtsZWZ0SWR4KytdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gZ3JlYXRlciAtPiB0YWtlIHJpZ2h0XG4gICAgICAgICAgICAgICAgZGF0YVtpKytdID0gcmlnaHRbcmlnaHRJZHgrK107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKGxlZnRJZHggPCBsZWZ0Lmxlbmd0aCkge1xuICAgICAgICAgICAgZGF0YVtpKytdID0gbGVmdFtsZWZ0SWR4KytdO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChyaWdodElkeCA8IHJpZ2h0Lmxlbmd0aCkge1xuICAgICAgICAgICAgZGF0YVtpKytdID0gcmlnaHRbcmlnaHRJZHgrK107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxufSkoVGV4dERvY3VtZW50IHx8IChUZXh0RG9jdW1lbnQgPSB7fSkpO1xuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgdGhlIHRleHQgZG9jdW1lbnQgZnJvbSB0aGUgbmV3IHZzY29kZS1sYW5ndWFnZXNlcnZlci10ZXh0ZG9jdW1lbnQgcGFja2FnZS5cbiAqL1xuY2xhc3MgRnVsbFRleHREb2N1bWVudCB7XG4gICAgY29uc3RydWN0b3IodXJpLCBsYW5ndWFnZUlkLCB2ZXJzaW9uLCBjb250ZW50KSB7XG4gICAgICAgIHRoaXMuX3VyaSA9IHVyaTtcbiAgICAgICAgdGhpcy5fbGFuZ3VhZ2VJZCA9IGxhbmd1YWdlSWQ7XG4gICAgICAgIHRoaXMuX3ZlcnNpb24gPSB2ZXJzaW9uO1xuICAgICAgICB0aGlzLl9jb250ZW50ID0gY29udGVudDtcbiAgICAgICAgdGhpcy5fbGluZU9mZnNldHMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGdldCB1cmkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl91cmk7XG4gICAgfVxuICAgIGdldCBsYW5ndWFnZUlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGFuZ3VhZ2VJZDtcbiAgICB9XG4gICAgZ2V0IHZlcnNpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92ZXJzaW9uO1xuICAgIH1cbiAgICBnZXRUZXh0KHJhbmdlKSB7XG4gICAgICAgIGlmIChyYW5nZSkge1xuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5vZmZzZXRBdChyYW5nZS5zdGFydCk7XG4gICAgICAgICAgICBsZXQgZW5kID0gdGhpcy5vZmZzZXRBdChyYW5nZS5lbmQpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRlbnQuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9jb250ZW50O1xuICAgIH1cbiAgICB1cGRhdGUoZXZlbnQsIHZlcnNpb24pIHtcbiAgICAgICAgdGhpcy5fY29udGVudCA9IGV2ZW50LnRleHQ7XG4gICAgICAgIHRoaXMuX3ZlcnNpb24gPSB2ZXJzaW9uO1xuICAgICAgICB0aGlzLl9saW5lT2Zmc2V0cyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZ2V0TGluZU9mZnNldHMoKSB7XG4gICAgICAgIGlmICh0aGlzLl9saW5lT2Zmc2V0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsZXQgbGluZU9mZnNldHMgPSBbXTtcbiAgICAgICAgICAgIGxldCB0ZXh0ID0gdGhpcy5fY29udGVudDtcbiAgICAgICAgICAgIGxldCBpc0xpbmVTdGFydCA9IHRydWU7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNMaW5lU3RhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGluZU9mZnNldHMucHVzaChpKTtcbiAgICAgICAgICAgICAgICAgICAgaXNMaW5lU3RhcnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGNoID0gdGV4dC5jaGFyQXQoaSk7XG4gICAgICAgICAgICAgICAgaXNMaW5lU3RhcnQgPSAoY2ggPT09ICdcXHInIHx8IGNoID09PSAnXFxuJyk7XG4gICAgICAgICAgICAgICAgaWYgKGNoID09PSAnXFxyJyAmJiBpICsgMSA8IHRleHQubGVuZ3RoICYmIHRleHQuY2hhckF0KGkgKyAxKSA9PT0gJ1xcbicpIHtcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc0xpbmVTdGFydCAmJiB0ZXh0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsaW5lT2Zmc2V0cy5wdXNoKHRleHQubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2xpbmVPZmZzZXRzID0gbGluZU9mZnNldHM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2xpbmVPZmZzZXRzO1xuICAgIH1cbiAgICBwb3NpdGlvbkF0KG9mZnNldCkge1xuICAgICAgICBvZmZzZXQgPSBNYXRoLm1heChNYXRoLm1pbihvZmZzZXQsIHRoaXMuX2NvbnRlbnQubGVuZ3RoKSwgMCk7XG4gICAgICAgIGxldCBsaW5lT2Zmc2V0cyA9IHRoaXMuZ2V0TGluZU9mZnNldHMoKTtcbiAgICAgICAgbGV0IGxvdyA9IDAsIGhpZ2ggPSBsaW5lT2Zmc2V0cy5sZW5ndGg7XG4gICAgICAgIGlmIChoaWdoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUG9zaXRpb24uY3JlYXRlKDAsIG9mZnNldCk7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKGxvdyA8IGhpZ2gpIHtcbiAgICAgICAgICAgIGxldCBtaWQgPSBNYXRoLmZsb29yKChsb3cgKyBoaWdoKSAvIDIpO1xuICAgICAgICAgICAgaWYgKGxpbmVPZmZzZXRzW21pZF0gPiBvZmZzZXQpIHtcbiAgICAgICAgICAgICAgICBoaWdoID0gbWlkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbG93ID0gbWlkICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBsb3cgaXMgdGhlIGxlYXN0IHggZm9yIHdoaWNoIHRoZSBsaW5lIG9mZnNldCBpcyBsYXJnZXIgdGhhbiB0aGUgY3VycmVudCBvZmZzZXRcbiAgICAgICAgLy8gb3IgYXJyYXkubGVuZ3RoIGlmIG5vIGxpbmUgb2Zmc2V0IGlzIGxhcmdlciB0aGFuIHRoZSBjdXJyZW50IG9mZnNldFxuICAgICAgICBsZXQgbGluZSA9IGxvdyAtIDE7XG4gICAgICAgIHJldHVybiBQb3NpdGlvbi5jcmVhdGUobGluZSwgb2Zmc2V0IC0gbGluZU9mZnNldHNbbGluZV0pO1xuICAgIH1cbiAgICBvZmZzZXRBdChwb3NpdGlvbikge1xuICAgICAgICBsZXQgbGluZU9mZnNldHMgPSB0aGlzLmdldExpbmVPZmZzZXRzKCk7XG4gICAgICAgIGlmIChwb3NpdGlvbi5saW5lID49IGxpbmVPZmZzZXRzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRlbnQubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBvc2l0aW9uLmxpbmUgPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbGluZU9mZnNldCA9IGxpbmVPZmZzZXRzW3Bvc2l0aW9uLmxpbmVdO1xuICAgICAgICBsZXQgbmV4dExpbmVPZmZzZXQgPSAocG9zaXRpb24ubGluZSArIDEgPCBsaW5lT2Zmc2V0cy5sZW5ndGgpID8gbGluZU9mZnNldHNbcG9zaXRpb24ubGluZSArIDFdIDogdGhpcy5fY29udGVudC5sZW5ndGg7XG4gICAgICAgIHJldHVybiBNYXRoLm1heChNYXRoLm1pbihsaW5lT2Zmc2V0ICsgcG9zaXRpb24uY2hhcmFjdGVyLCBuZXh0TGluZU9mZnNldCksIGxpbmVPZmZzZXQpO1xuICAgIH1cbiAgICBnZXQgbGluZUNvdW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRMaW5lT2Zmc2V0cygpLmxlbmd0aDtcbiAgICB9XG59XG52YXIgSXM7XG4oZnVuY3Rpb24gKElzKSB7XG4gICAgY29uc3QgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuICAgIGZ1bmN0aW9uIGRlZmluZWQodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCc7XG4gICAgfVxuICAgIElzLmRlZmluZWQgPSBkZWZpbmVkO1xuICAgIGZ1bmN0aW9uIHVuZGVmaW5lZCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJztcbiAgICB9XG4gICAgSXMudW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGZ1bmN0aW9uIGJvb2xlYW4odmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZTtcbiAgICB9XG4gICAgSXMuYm9vbGVhbiA9IGJvb2xlYW47XG4gICAgZnVuY3Rpb24gc3RyaW5nKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgU3RyaW5nXSc7XG4gICAgfVxuICAgIElzLnN0cmluZyA9IHN0cmluZztcbiAgICBmdW5jdGlvbiBudW1iZXIodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBOdW1iZXJdJztcbiAgICB9XG4gICAgSXMubnVtYmVyID0gbnVtYmVyO1xuICAgIGZ1bmN0aW9uIG51bWJlclJhbmdlKHZhbHVlLCBtaW4sIG1heCkge1xuICAgICAgICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IE51bWJlcl0nICYmIG1pbiA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSBtYXg7XG4gICAgfVxuICAgIElzLm51bWJlclJhbmdlID0gbnVtYmVyUmFuZ2U7XG4gICAgZnVuY3Rpb24gaW50ZWdlcih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IE51bWJlcl0nICYmIC0yMTQ3NDgzNjQ4IDw9IHZhbHVlICYmIHZhbHVlIDw9IDIxNDc0ODM2NDc7XG4gICAgfVxuICAgIElzLmludGVnZXIgPSBpbnRlZ2VyO1xuICAgIGZ1bmN0aW9uIHVpbnRlZ2VyKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgTnVtYmVyXScgJiYgMCA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSAyMTQ3NDgzNjQ3O1xuICAgIH1cbiAgICBJcy51aW50ZWdlciA9IHVpbnRlZ2VyO1xuICAgIGZ1bmN0aW9uIGZ1bmModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xuICAgIH1cbiAgICBJcy5mdW5jID0gZnVuYztcbiAgICBmdW5jdGlvbiBvYmplY3RMaXRlcmFsKHZhbHVlKSB7XG4gICAgICAgIC8vIFN0cmljdGx5IHNwZWFraW5nIGNsYXNzIGluc3RhbmNlcyBwYXNzIHRoaXMgY2hlY2sgYXMgd2VsbC4gU2luY2UgdGhlIExTUFxuICAgICAgICAvLyBkb2Vzbid0IHVzZSBjbGFzc2VzIHdlIGlnbm9yZSB0aGlzIGZvciBub3cuIElmIHdlIGRvIHdlIG5lZWQgdG8gYWRkIHNvbWV0aGluZ1xuICAgICAgICAvLyBsaWtlIHRoaXM6IGBPYmplY3QuZ2V0UHJvdG90eXBlT2YoT2JqZWN0LmdldFByb3RvdHlwZU9mKHgpKSA9PT0gbnVsbGBcbiAgICAgICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCc7XG4gICAgfVxuICAgIElzLm9iamVjdExpdGVyYWwgPSBvYmplY3RMaXRlcmFsO1xuICAgIGZ1bmN0aW9uIHR5cGVkQXJyYXkodmFsdWUsIGNoZWNrKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5ldmVyeShjaGVjayk7XG4gICAgfVxuICAgIElzLnR5cGVkQXJyYXkgPSB0eXBlZEFycmF5O1xufSkoSXMgfHwgKElzID0ge30pKTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUtBLGFBQU8sZUFBZSxTQUFTLGNBQWMsRUFBRSxPQUFPLEtBQUssQ0FBQztBQUM1RCxjQUFRLGNBQWMsUUFBUSxRQUFRLFFBQVEsT0FBTyxRQUFRLFFBQVEsUUFBUSxTQUFTLFFBQVEsU0FBUyxRQUFRLFVBQVU7QUFDekgsZUFBUyxRQUFRLE9BQU87QUFDcEIsZUFBTyxVQUFVLFFBQVEsVUFBVTtBQUFBLE1BQ3ZDO0FBQ0EsY0FBUSxVQUFVO0FBQ2xCLGVBQVMsT0FBTyxPQUFPO0FBQ25CLGVBQU8sT0FBTyxVQUFVLFlBQVksaUJBQWlCO0FBQUEsTUFDekQ7QUFDQSxjQUFRLFNBQVM7QUFDakIsZUFBUyxPQUFPLE9BQU87QUFDbkIsZUFBTyxPQUFPLFVBQVUsWUFBWSxpQkFBaUI7QUFBQSxNQUN6RDtBQUNBLGNBQVEsU0FBUztBQUNqQixlQUFTLE1BQU0sT0FBTztBQUNsQixlQUFPLGlCQUFpQjtBQUFBLE1BQzVCO0FBQ0EsY0FBUSxRQUFRO0FBQ2hCLGVBQVMsS0FBSyxPQUFPO0FBQ2pCLGVBQU8sT0FBTyxVQUFVO0FBQUEsTUFDNUI7QUFDQSxjQUFRLE9BQU87QUFDZixlQUFTLE1BQU0sT0FBTztBQUNsQixlQUFPLE1BQU0sUUFBUSxLQUFLO0FBQUEsTUFDOUI7QUFDQSxjQUFRLFFBQVE7QUFDaEIsZUFBUyxZQUFZLE9BQU87QUFDeEIsZUFBTyxNQUFNLEtBQUssS0FBSyxNQUFNLE1BQU0sVUFBUSxPQUFPLElBQUksQ0FBQztBQUFBLE1BQzNEO0FBQ0EsY0FBUSxjQUFjO0FBQUE7QUFBQTs7O0FDbEN0QjtBQUFBO0FBQUE7QUFLQSxhQUFPLGVBQWUsU0FBUyxjQUFjLEVBQUUsT0FBTyxLQUFLLENB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QUEsSUFDSjtBQUFBLEVBQ0o7IiwKICAibmFtZXMiOiBbIkVycm9yQ29kZXMiLCAiTWVzc2FnZSIsICJUb3VjaCIsICJEaXNwb3NhYmxlIiwgIlJBTCIsICJFdmVudCIsICJJcyIsICJDYW5jZWxsYXRpb25Ub2tlbiIsICJDYW5jZWxsYXRpb25TdGF0ZSIsICJfY29ubiIsICJJcyIsICJNZXNzYWdlUmVhZGVyIiwgIkFic3RyYWN0TWVzc2FnZVJlYWRlciIsICJSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zIiwgIklzIiwgIk1lc3NhZ2VXcml0ZXIiLCAiQWJzdHJhY3RNZXNzYWdlV3JpdGVyIiwgIlJlc29sdmVkTWVzc2FnZVdyaXRlck9wdGlvbnMiLCAicmVzdWx0IiwgIklzIiwgIkNhbmNlbE5vdGlmaWNhdGlvbiIsICJQcm9ncmVzc1Rva2VuIiwgIlByb2dyZXNzTm90aWZpY2F0aW9uIiwgIlN0YXJSZXF1ZXN0SGFuZGxlciIsICJUcmFjZSIsICJUcmFjZVZhbHVlcyIsICJUcmFjZUZvcm1hdCIsICJTZXRUcmFjZU5vdGlmaWNhdGlvbiIsICJMb2dUcmFjZU5vdGlmaWNhdGlvbiIsICJDb25uZWN0aW9uRXJyb3JzIiwgIkNvbm5lY3Rpb25TdHJhdGVneSIsICJJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kiLCAiUmVxdWVzdENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kiLCAiQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSIsICJDYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneSIsICJDYW5jZWxsYXRpb25TdHJhdGVneSIsICJNZXNzYWdlU3RyYXRlZ3kiLCAiQ29ubmVjdGlvbk9wdGlvbnMiLCAiQ29ubmVjdGlvblN0YXRlIiwgImNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uIiwgInN0YXJ0VGltZSIsICJSSUwiLCAibSIsICJleHBvcnRzIiwgImNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uIiwgImltcG9ydF92c2NvZGVfanNvbnJwYyIsICJpbXBvcnRfdnNjb2RlX2pzb25ycGMiLCAiaW1wb3J0X3ZzY29kZV9qc29ucnBjIiwgImltcG9ydF92c2NvZGVfanNvbnJwYyIsICJEb2N1bWVudFVyaSIsICJVUkkiLCAiaW50ZWdlciIsICJ1aW50ZWdlciIsICJQb3NpdGlvbiIsICJSYW5nZSIsICJMb2NhdGlvbiIsICJMb2NhdGlvbkxpbmsiLCAiQ29sb3IiLCAiQ29sb3JJbmZvcm1hdGlvbiIsICJDb2xvclByZXNlbnRhdGlvbiIsICJGb2xkaW5nUmFuZ2VLaW5kIiwgIkZvbGRpbmdSYW5nZSIsICJEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uIiwgImxvY2F0aW9uIiwgIkRpYWdub3N0aWNTZXZlcml0eSIsICJEaWFnbm9zdGljVGFnIiwgIkNvZGVEZXNjcmlwdGlvbiIsICJEaWFnbm9zdGljIiwgIkNvbW1hbmQiLCAiVGV4dEVkaXQiLCAiQ2hhbmdlQW5ub3RhdGlvbiIsICJDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllciIsICJBbm5vdGF0ZWRUZXh0RWRpdCIsICJUZXh0RG9jdW1lbnRFZGl0IiwgIkNyZWF0ZUZpbGUiLCAiUmVuYW1lRmlsZSIsICJEZWxldGVGaWxlIiwgIldvcmtzcGFjZUVkaXQiLCAiVGV4dERvY3VtZW50SWRlbnRpZmllciIsICJWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIiwgIk9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciIsICJUZXh0RG9jdW1lbnRJdGVtIiwgIk1hcmt1cEtpbmQiLCAiTWFya3VwQ29udGVudCIsICJDb21wbGV0aW9uSXRlbUtpbmQiLCAiSW5zZXJ0VGV4dEZvcm1hdCIsICJDb21wbGV0aW9uSXRlbVRhZyIsICJJbnNlcnRSZXBsYWNlRWRpdCIsICJSYW5nZSIsICJJbnNlcnRUZXh0TW9kZSIsICJDb21wbGV0aW9uSXRlbUxhYmVsRGV0YWlscyIsICJDb21wbGV0aW9uSXRlbSIsICJDb21wbGV0aW9uTGlzdCIsICJNYXJrZWRTdHJpbmciLCAiSG92ZXIiLCAiUGFyYW1ldGVySW5mb3JtYXRpb24iLCAiU2lnbmF0dXJlSW5mb3JtYXRpb24iLCAiRG9jdW1lbnRIaWdobGlnaHRLaW5kIiwgIkRvY3VtZW50SGlnaGxpZ2h0IiwgIlN5bWJvbEtpbmQiLCAiU3ltYm9sVGFnIiwgIlN5bWJvbEluZm9ybWF0aW9uIiwgIldvcmtzcGFjZVN5bWJvbCIsICJEb2N1bWVudFN5bWJvbCIsICJDb2RlQWN0aW9uS2luZCIsICJDb2RlQWN0aW9uVHJpZ2dlcktpbmQiLCAiQ29kZUFjdGlvbkNvbnRleHQiLCAiQ29kZUFjdGlvbiIsICJDb2RlTGVucyIsICJGb3JtYXR0aW5nT3B0aW9ucyIsICJEb2N1bWVudExpbmsiLCAiU2VsZWN0aW9uUmFuZ2UiLCAiU2VtYW50aWNUb2tlblR5cGVzIiwgIlNlbWFudGljVG9rZW5Nb2RpZmllcnMiLCAiU2VtYW50aWNUb2tlbnMiLCAiSW5saW5lVmFsdWVUZXh0IiwgIklubGluZVZhbHVlVmFyaWFibGVMb29rdXAiLCAiSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24iLCAiSW5saW5lVmFsdWVDb250ZXh0IiwgIklubGF5SGludEtpbmQiLCAiSW5sYXlIaW50TGFiZWxQYXJ0IiwgIklubGF5SGludCIsICJQb3NpdGlvbiIsICJTdHJpbmdWYWx1ZSIsICJJbmxpbmVDb21wbGV0aW9uSXRlbSIsICJJbmxpbmVDb21wbGV0aW9uTGlzdCIsICJJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmQiLCAiU2VsZWN0ZWRDb21wbGV0aW9uSW5mbyIsICJJbmxpbmVDb21wbGV0aW9uQ29udGV4dCIsICJXb3Jrc3BhY2VGb2xkZXIiLCAiVGV4dERvY3VtZW50IiwgIlBvc2l0aW9uIiwgIklzIiwgInVuZGVmaW5lZCIsICJpbnRlZ2VyIiwgInVpbnRlZ2VyIiwgIm0iXQp9Cg== diff --git a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/lsp/java-lsp-client.ts b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/lsp/java-lsp-client.ts index e916ecfcc19..38edc8089f7 100644 --- a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/lsp/java-lsp-client.ts +++ b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/lsp/java-lsp-client.ts @@ -267,19 +267,42 @@ function registerProviders(): void { applyCodeAction(action); }); + // Cross-file navigation: this single-file editor has no model for other workspace files, so Go to + // Definition / Find References to another file would silently do nothing. Hand those off to the IDE + // to open the target file (and reveal the line). Same-file targets fall through to Monaco. + monaco.editor.registerEditorOpener({ + openCodeEditor: (source, resource, selectionOrPosition) => { + const uri = resource.toString(); + if (!isWorkspaceFile(uri) || !uri.startsWith(VIRTUAL_FILE_PREFIX)) return false; + const currentModel = source.getModel(); + if (currentModel && currentModel.uri.toString() === uri) return false; // same file — let Monaco jump + const opener = (globalThis as any).javaLspOpenFile; + if (typeof opener !== 'function') return false; + const pos = selectionOrPosition as { startLineNumber?: number; lineNumber?: number; startColumn?: number; column?: number } | undefined; + const line = pos ? (pos.startLineNumber ?? pos.lineNumber) : undefined; + const column = pos ? (pos.startColumn ?? pos.column) : undefined; + opener(uri.substring(VIRTUAL_FILE_PREFIX.length), line, column); + return true; + }, + }); + monaco.languages.registerCompletionItemProvider('java', { triggerCharacters: ['.', '@', '<'], - provideCompletionItems: async (model, position) => { + provideCompletionItems: async (model, position, context) => { if (!_conn || !isWorkspaceFile(model.uri.toString())) return null; const fileUri = model.uri.toString(); const result: CompletionList | CompletionItem[] | null = await _conn.sendRequest('textDocument/completion', { textDocument: { uri: fileUri }, position: { line: position.lineNumber - 1, character: position.column - 1 }, - context: { triggerKind: 1 }, + // Monaco trigger kinds are 0-based (Invoke/TriggerCharacter/ForIncomplete); LSP is 1-based. + context: { triggerKind: (context.triggerKind ?? 0) + 1, triggerCharacter: context.triggerCharacter }, }); const items = Array.isArray(result) ? result : (result?.items ?? []); return { suggestions: items.map(item => lspCompletionToMonaco(item, model, position)), + // JDT.LS returns a truncated list on the first keystrokes; propagating "incomplete" makes + // Monaco re-query as the user types instead of caching the first (often empty) result. + incomplete: Array.isArray(result) ? false : !!result?.isIncomplete, }; }, // Resolve documentation and, crucially, the auto-import additionalTextEdits which JDT.LS only @@ -530,6 +553,9 @@ function lspCompletionToMonaco( : undefined, range, sortText: sdkPrioritisedSortText(item), + filterText: item.filterText, + preselect: item.preselect, + commitCharacters: item.commitCharacters, additionalTextEdits: item.additionalTextEdits?.map(textEditToMonaco), }; result._lsp = item; @@ -555,6 +581,9 @@ function sdkPrioritisedSortText(item: CompletionItem): string { /** Monaco command id used to apply a deferred LSP code action when the user selects it. */ const APPLY_ACTION_COMMAND = 'dirigible.java.applyCodeAction'; +/** Virtual URI prefix of editor models; stripping it yields the IDE workspace path (/ws/proj/...). */ +const VIRTUAL_FILE_PREFIX = 'file:///workspace'; + type LspRange = { start: { line: number; character: number }; end: { line: number; character: number } }; /** Monaco completion item carrying the originating LSP item so resolve can fetch its import edits. */ From 08cc829bbcdc608085a948b4a00acb632466bc4d Mon Sep 17 00:00:00 2001 From: Iliyan Velichkov Date: Tue, 23 Jun 2026 14:23:41 +0300 Subject: [PATCH 05/14] =?UTF-8?q?feat(editor):=20cross-file=20Java=20renam?= =?UTF-8?q?e=20=E2=80=94=20references,=20and=20the=20type's=20own=20file?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Renaming a Java symbol (F2) now applies JDT.LS's full rename WorkspaceEdit across the whole workspace instead of only the current file: - Text edits in every referencing file are applied and persisted (read-modify-write over the workspace REST API, CSRF-guarded); the current file goes through the live Monaco model + save. - RenameFile operations are honoured, so renaming a public class/interface/enum also renames its .java file and updates all references; when that file is the one being edited, the editor tab switches to the new file. - Other open editors reload the changed files (dirty editors are skipped to avoid clobbering unsaved work) via a new monaco.file.reload topic. Falls back to current-file-only rename if the IDE persistence hook is unavailable. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../dirigible/editor-monaco/js/editor.js | 56 ++++++++++ .../editor-monaco/js/java-lsp-client.js | 78 ++++++++++++- .../editor-monaco/js/lsp/java-lsp-client.ts | 105 ++++++++++++++++++ 3 files changed, 238 insertions(+), 1 deletion(-) diff --git a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/editor.js b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/editor.js index bd7af27350c..c7b425d70ab 100644 --- a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/editor.js +++ b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/editor.js @@ -50,6 +50,42 @@ window.javaLspOpenFile = (path, line, column) => { } }; +// Persists a Java cross-file rename computed by the LSP client: writes the edited files (CSRF-guarded), +// performs any file rename the refactor implies (a public type renames its own .java file), switches the +// current tab when the file being edited is the one renamed, and asks other open editors to reload. +window.javaLspPersistRename = async ({ currentPath, currentContent, currentNewPath, writes, renames }) => { + const writeFile = (path, content, method) => fetch(`${WORKSPACE_API}${path}`, { + method: method, + body: content, + headers: { 'X-Requested-With': 'Fetch', 'X-CSRF-Token': csrfToken, 'Dirigible-Editor': 'Monaco', 'Content-Type': 'text/plain' }, + }); + const removeFile = (path) => fetch(`${WORKSPACE_API}${path}`, { + method: 'DELETE', + headers: { 'X-Requested-With': 'Fetch', 'X-CSRF-Token': csrfToken, 'Dirigible-Editor': 'Monaco' }, + }); + + for (const write of (writes || [])) { + if (!write.path) continue; + await writeFile(write.path, write.content, 'PUT'); + themingHub.postMessage({ topic: 'monaco.file.reload', data: { path: write.path } }); + } + for (const rename of (renames || [])) { + if (!rename.oldPath || !rename.newPath) continue; + await writeFile(rename.newPath, rename.content, 'POST'); + await removeFile(rename.oldPath); + workspaceHub.announceFileRenamed({ oldPath: rename.oldPath, newPath: rename.newPath }); + } + if (currentNewPath && currentPath) { + await writeFile(currentNewPath, currentContent, 'POST'); + await removeFile(currentPath); + workspaceHub.announceFileRenamed({ oldPath: currentPath, newPath: currentNewPath }); + layoutHub.openEditor({ path: currentNewPath }); + layoutHub.closeEditor({ path: currentPath }); + } else if (currentContent != null && currentPath) { + await DirigibleEditor.fileIO.saveText(currentContent, currentPath); + } +}; + const brandingInfo = getBrandingInfo(); let csrfToken; @@ -831,6 +867,26 @@ class DirigibleEditor { }, }); + // Reload this editor's content from disk when another file was changed by a cross-file Java + // rename. Skip dirty editors so unsaved work is never clobbered. + themingHub.addMessageListener({ + topic: 'monaco.file.reload', + handler: async (msg) => { + const { path } = msg || {}; + if (!path || path !== editorParameters.resourcePath || DirigibleEditor.dirty) return; + try { + const reloaded = await new FileIO().loadText(editorParameters.resourcePath, true); + DirigibleEditor.sourceBeingChangedProgramatically = true; + editor.getModel().setValue(reloaded.modified); + DirigibleEditor.lastSavedVersionId = editor.getModel().getAlternativeVersionId(); + DirigibleEditor.dirty = false; + DirigibleEditor.sourceBeingChangedProgramatically = false; + } catch (e) { + console.error('[java-lsp] could not reload after rename', e); + } + }, + }); + // Restore breakpoint glyphs from the debug view's persisted state themingHub.addMessageListener({ topic: 'java.debug.breakpoints', diff --git a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/java-lsp-client.js b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/java-lsp-client.js index 1d9efb1227f..e4964dce602 100644 --- a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/java-lsp-client.js +++ b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/java-lsp-client.js @@ -4771,6 +4771,16 @@ ${JSON.stringify(message, null, 4)}`); position: { line: position.lineNumber - 1, character: position.column - 1 }, newName }); + if (!edit) return { edits: [] }; + if (typeof globalThis.javaLspPersistRename === "function") { + try { + await applyRenameAcrossWorkspace(model, edit); + return { edits: [] }; + } catch (e) { + console.error("[java-lsp] cross-file rename failed, applying to the current file only:", e); + return workspaceEditToMonaco(edit); + } + } return workspaceEditToMonaco(edit); }, resolveRenameLocation: async (model, position) => { @@ -5100,6 +5110,72 @@ ${JSON.stringify(message, null, 4)}`); } return { edits }; } + function uriToWorkspacePath(uri) { + if (!uri.startsWith(VIRTUAL_FILE_PREFIX)) return null; + return decodeURIComponent(uri.substring(VIRTUAL_FILE_PREFIX.length)); + } + async function fetchWorkspaceFileText(idePath) { + const response = await fetch("/services/ide/workspaces" + idePath, { headers: { "X-Requested-With": "Fetch" } }); + if (!response.ok) { + throw new Error(`Could not read ${idePath} (HTTP ${response.status})`); + } + return response.text(); + } + function applyEditsToText(text, edits) { + const lineStarts = [0]; + for (let i = 0; i < text.length; i++) { + if (text.charCodeAt(i) === 10) lineStarts.push(i + 1); + } + const offset = (p) => (lineStarts[p.line] ?? text.length) + p.character; + const ordered = edits.slice().sort((a, b) => offset(b.range.start) - offset(a.range.start)); + let result = text; + for (const e of ordered) { + result = result.slice(0, offset(e.range.start)) + e.newText + result.slice(offset(e.range.end)); + } + return result; + } + async function applyRenameAcrossWorkspace(model, edit) { + const currentUri = model.uri.toString(); + const textByUri = {}; + const renameByUri = {}; + if (edit.changes) { + for (const uri in edit.changes) textByUri[uri] = (textByUri[uri] ?? []).concat(edit.changes[uri]); + } + if (edit.documentChanges) { + for (const dc of edit.documentChanges) { + if (dc?.kind === "rename" && dc.oldUri && dc.newUri) { + renameByUri[dc.oldUri] = dc.newUri; + } else if (dc?.textDocument?.uri && Array.isArray(dc.edits)) { + textByUri[dc.textDocument.uri] = (textByUri[dc.textDocument.uri] ?? []).concat(dc.edits); + } + } + } + const payload = { currentPath: uriToWorkspacePath(currentUri), currentContent: null, currentNewPath: null, writes: [], renames: [] }; + const uris = /* @__PURE__ */ new Set([...Object.keys(textByUri), ...Object.keys(renameByUri)]); + for (const uri of uris) { + const edits = textByUri[uri] ?? []; + let content; + if (uri === currentUri) { + if (edits.length) { + model.pushEditOperations([], edits.map((e) => ({ range: lspRangeToMonaco(e.range), text: e.newText, forceMoveMarkers: true })), () => null); + } + content = model.getValue(); + } else { + const source = await fetchWorkspaceFileText(uriToWorkspacePath(uri) ?? uri); + content = edits.length ? applyEditsToText(source, edits) : source; + } + const newUri = renameByUri[uri]; + if (uri === currentUri) { + payload.currentContent = content; + payload.currentNewPath = newUri ? uriToWorkspacePath(newUri) : null; + } else if (newUri) { + payload.renames.push({ oldPath: uriToWorkspacePath(uri), newPath: uriToWorkspacePath(newUri), content }); + } else { + payload.writes.push({ path: uriToWorkspacePath(uri), content }); + } + } + await globalThis.javaLspPersistRename(payload); + } function jdtlsSettings() { return { java: { @@ -5130,4 +5206,4 @@ ${JSON.stringify(message, null, 4)}`); } return __toCommonJS(java_lsp_client_exports); })(); -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvY29tbW9uL2lzLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlcy5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vbGlua2VkTWFwLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9kaXNwb3NhYmxlLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9yYWwuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvY29tbW9uL2V2ZW50cy5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vY2FuY2VsbGF0aW9uLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9zaGFyZWRBcnJheUNhbmNlbGxhdGlvbi5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vc2VtYXBob3JlLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlUmVhZGVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlV3JpdGVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlQnVmZmVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9jb25uZWN0aW9uLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9hcGkuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvYnJvd3Nlci9yaWwuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvYnJvd3Nlci9tYWluLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvYnJvd3Nlci5qcyIsICJsc3AvamF2YS1sc3AtY2xpZW50LnRzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLXdzLWpzb25ycGMvc3JjL2Rpc3Bvc2FibGUudHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvc29ja2V0L3NvY2tldC50cyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS13cy1qc29ucnBjL3NyYy9zb2NrZXQvcmVhZGVyLnRzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLXdzLWpzb25ycGMvc3JjL3NvY2tldC93cml0ZXIudHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvc29ja2V0L2Nvbm5lY3Rpb24udHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvY29ubmVjdGlvbi50cyIsICJsc3AvbW9uYWNvLXNoaW0udHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtbGFuZ3VhZ2VzZXJ2ZXItdHlwZXMvbGliL2VzbS9tYWluLmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuc3RyaW5nQXJyYXkgPSBleHBvcnRzLmFycmF5ID0gZXhwb3J0cy5mdW5jID0gZXhwb3J0cy5lcnJvciA9IGV4cG9ydHMubnVtYmVyID0gZXhwb3J0cy5zdHJpbmcgPSBleHBvcnRzLmJvb2xlYW4gPSB2b2lkIDA7XG5mdW5jdGlvbiBib29sZWFuKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZTtcbn1cbmV4cG9ydHMuYm9vbGVhbiA9IGJvb2xlYW47XG5mdW5jdGlvbiBzdHJpbmcodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZztcbn1cbmV4cG9ydHMuc3RyaW5nID0gc3RyaW5nO1xuZnVuY3Rpb24gbnVtYmVyKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdmFsdWUgaW5zdGFuY2VvZiBOdW1iZXI7XG59XG5leHBvcnRzLm51bWJlciA9IG51bWJlcjtcbmZ1bmN0aW9uIGVycm9yKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgRXJyb3I7XG59XG5leHBvcnRzLmVycm9yID0gZXJyb3I7XG5mdW5jdGlvbiBmdW5jKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cbmV4cG9ydHMuZnVuYyA9IGZ1bmM7XG5mdW5jdGlvbiBhcnJheSh2YWx1ZSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cbmV4cG9ydHMuYXJyYXkgPSBhcnJheTtcbmZ1bmN0aW9uIHN0cmluZ0FycmF5KHZhbHVlKSB7XG4gICAgcmV0dXJuIGFycmF5KHZhbHVlKSAmJiB2YWx1ZS5ldmVyeShlbGVtID0+IHN0cmluZyhlbGVtKSk7XG59XG5leHBvcnRzLnN0cmluZ0FycmF5ID0gc3RyaW5nQXJyYXk7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLk1lc3NhZ2UgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU5ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlOCA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTcgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU2ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNSA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTQgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUzID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMiA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTEgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUwID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTkgPSBleHBvcnRzLlJlcXVlc3RUeXBlOCA9IGV4cG9ydHMuUmVxdWVzdFR5cGU3ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTYgPSBleHBvcnRzLlJlcXVlc3RUeXBlNSA9IGV4cG9ydHMuUmVxdWVzdFR5cGU0ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTMgPSBleHBvcnRzLlJlcXVlc3RUeXBlMiA9IGV4cG9ydHMuUmVxdWVzdFR5cGUxID0gZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IGV4cG9ydHMuUmVxdWVzdFR5cGUwID0gZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUgPSBleHBvcnRzLlBhcmFtZXRlclN0cnVjdHVyZXMgPSBleHBvcnRzLlJlc3BvbnNlRXJyb3IgPSBleHBvcnRzLkVycm9yQ29kZXMgPSB2b2lkIDA7XG5jb25zdCBpcyA9IHJlcXVpcmUoXCIuL2lzXCIpO1xuLyoqXG4gKiBQcmVkZWZpbmVkIGVycm9yIGNvZGVzLlxuICovXG52YXIgRXJyb3JDb2RlcztcbihmdW5jdGlvbiAoRXJyb3JDb2Rlcykge1xuICAgIC8vIERlZmluZWQgYnkgSlNPTiBSUENcbiAgICBFcnJvckNvZGVzLlBhcnNlRXJyb3IgPSAtMzI3MDA7XG4gICAgRXJyb3JDb2Rlcy5JbnZhbGlkUmVxdWVzdCA9IC0zMjYwMDtcbiAgICBFcnJvckNvZGVzLk1ldGhvZE5vdEZvdW5kID0gLTMyNjAxO1xuICAgIEVycm9yQ29kZXMuSW52YWxpZFBhcmFtcyA9IC0zMjYwMjtcbiAgICBFcnJvckNvZGVzLkludGVybmFsRXJyb3IgPSAtMzI2MDM7XG4gICAgLyoqXG4gICAgICogVGhpcyBpcyB0aGUgc3RhcnQgcmFuZ2Ugb2YgSlNPTiBSUEMgcmVzZXJ2ZWQgZXJyb3IgY29kZXMuXG4gICAgICogSXQgZG9lc24ndCBkZW5vdGUgYSByZWFsIGVycm9yIGNvZGUuIE5vIGFwcGxpY2F0aW9uIGVycm9yIGNvZGVzIHNob3VsZFxuICAgICAqIGJlIGRlZmluZWQgYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCByYW5nZS4gRm9yIGJhY2t3YXJkc1xuICAgICAqIGNvbXBhdGliaWxpdHkgdGhlIGBTZXJ2ZXJOb3RJbml0aWFsaXplZGAgYW5kIHRoZSBgVW5rbm93bkVycm9yQ29kZWBcbiAgICAgKiBhcmUgbGVmdCBpbiB0aGUgcmFuZ2UuXG4gICAgICpcbiAgICAgKiBAc2luY2UgMy4xNi4wXG4gICAgKi9cbiAgICBFcnJvckNvZGVzLmpzb25ycGNSZXNlcnZlZEVycm9yUmFuZ2VTdGFydCA9IC0zMjA5OTtcbiAgICAvKiogQGRlcHJlY2F0ZWQgdXNlICBqc29ucnBjUmVzZXJ2ZWRFcnJvclJhbmdlU3RhcnQgKi9cbiAgICBFcnJvckNvZGVzLnNlcnZlckVycm9yU3RhcnQgPSAtMzIwOTk7XG4gICAgLyoqXG4gICAgICogQW4gZXJyb3Igb2NjdXJyZWQgd2hlbiB3cml0ZSBhIG1lc3NhZ2UgdG8gdGhlIHRyYW5zcG9ydCBsYXllci5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLk1lc3NhZ2VXcml0ZUVycm9yID0gLTMyMDk5O1xuICAgIC8qKlxuICAgICAqIEFuIGVycm9yIG9jY3VycmVkIHdoZW4gcmVhZGluZyBhIG1lc3NhZ2UgZnJvbSB0aGUgdHJhbnNwb3J0IGxheWVyLlxuICAgICAqL1xuICAgIEVycm9yQ29kZXMuTWVzc2FnZVJlYWRFcnJvciA9IC0zMjA5ODtcbiAgICAvKipcbiAgICAgKiBUaGUgY29ubmVjdGlvbiBnb3QgZGlzcG9zZWQgb3IgbG9zdCBhbmQgYWxsIHBlbmRpbmcgcmVzcG9uc2VzIGdvdFxuICAgICAqIHJlamVjdGVkLlxuICAgICAqL1xuICAgIEVycm9yQ29kZXMuUGVuZGluZ1Jlc3BvbnNlUmVqZWN0ZWQgPSAtMzIwOTc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gaXMgaW5hY3RpdmUgYW5kIGEgdXNlIG9mIGl0IGZhaWxlZC5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLkNvbm5lY3Rpb25JbmFjdGl2ZSA9IC0zMjA5NjtcbiAgICAvKipcbiAgICAgKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBhIHNlcnZlciByZWNlaXZlZCBhIG5vdGlmaWNhdGlvbiBvclxuICAgICAqIHJlcXVlc3QgYmVmb3JlIHRoZSBzZXJ2ZXIgaGFzIHJlY2VpdmVkIHRoZSBgaW5pdGlhbGl6ZWAgcmVxdWVzdC5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLlNlcnZlck5vdEluaXRpYWxpemVkID0gLTMyMDAyO1xuICAgIEVycm9yQ29kZXMuVW5rbm93bkVycm9yQ29kZSA9IC0zMjAwMTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIHRoZSBlbmQgcmFuZ2Ugb2YgSlNPTiBSUEMgcmVzZXJ2ZWQgZXJyb3IgY29kZXMuXG4gICAgICogSXQgZG9lc24ndCBkZW5vdGUgYSByZWFsIGVycm9yIGNvZGUuXG4gICAgICpcbiAgICAgKiBAc2luY2UgMy4xNi4wXG4gICAgKi9cbiAgICBFcnJvckNvZGVzLmpzb25ycGNSZXNlcnZlZEVycm9yUmFuZ2VFbmQgPSAtMzIwMDA7XG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSAganNvbnJwY1Jlc2VydmVkRXJyb3JSYW5nZUVuZCAqL1xuICAgIEVycm9yQ29kZXMuc2VydmVyRXJyb3JFbmQgPSAtMzIwMDA7XG59KShFcnJvckNvZGVzIHx8IChleHBvcnRzLkVycm9yQ29kZXMgPSBFcnJvckNvZGVzID0ge30pKTtcbi8qKlxuICogQW4gZXJyb3Igb2JqZWN0IHJldHVybiBpbiBhIHJlc3BvbnNlIGluIGNhc2UgYSByZXF1ZXN0XG4gKiBoYXMgZmFpbGVkLlxuICovXG5jbGFzcyBSZXNwb25zZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNvZGUsIG1lc3NhZ2UsIGRhdGEpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuY29kZSA9IGlzLm51bWJlcihjb2RlKSA/IGNvZGUgOiBFcnJvckNvZGVzLlVua25vd25FcnJvckNvZGU7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBSZXNwb25zZUVycm9yLnByb3RvdHlwZSk7XG4gICAgfVxuICAgIHRvSnNvbigpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgY29kZTogdGhpcy5jb2RlLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLmRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmRhdGEgPSB0aGlzLmRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5leHBvcnRzLlJlc3BvbnNlRXJyb3IgPSBSZXNwb25zZUVycm9yO1xuY2xhc3MgUGFyYW1ldGVyU3RydWN0dXJlcyB7XG4gICAgY29uc3RydWN0b3Ioa2luZCkge1xuICAgICAgICB0aGlzLmtpbmQgPSBraW5kO1xuICAgIH1cbiAgICBzdGF0aWMgaXModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8gfHwgdmFsdWUgPT09IFBhcmFtZXRlclN0cnVjdHVyZXMuYnlOYW1lIHx8IHZhbHVlID09PSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5UG9zaXRpb247XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5raW5kO1xuICAgIH1cbn1cbmV4cG9ydHMuUGFyYW1ldGVyU3RydWN0dXJlcyA9IFBhcmFtZXRlclN0cnVjdHVyZXM7XG4vKipcbiAqIFRoZSBwYXJhbWV0ZXIgc3RydWN0dXJlIGlzIGF1dG9tYXRpY2FsbHkgaW5mZXJyZWQgb24gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzXG4gKiBhbmQgdGhlIHBhcmFtZXRlciB0eXBlIGluIGNhc2Ugb2YgYSBzaW5nbGUgcGFyYW0uXG4gKi9cblBhcmFtZXRlclN0cnVjdHVyZXMuYXV0byA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdhdXRvJyk7XG4vKipcbiAqIEZvcmNlcyBgYnlQb3NpdGlvbmAgcGFyYW1ldGVyIHN0cnVjdHVyZS4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGhhdmUgYSBzaW5nbGVcbiAqIHBhcmFtZXRlciB3aGljaCBoYXMgYSBsaXRlcmFsIHR5cGUuXG4gKi9cblBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbiA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdieVBvc2l0aW9uJyk7XG4vKipcbiAqIEZvcmNlcyBgYnlOYW1lYCBwYXJhbWV0ZXIgc3RydWN0dXJlLiBUaGlzIGlzIG9ubHkgdXNlZnVsIHdoZW4gaGF2aW5nIGEgc2luZ2xlXG4gKiBwYXJhbWV0ZXIuIFRoZSBsaWJyYXJ5IHdpbGwgcmVwb3J0IGVycm9ycyBpZiB1c2VkIHdpdGggYSBkaWZmZXJlbnQgbnVtYmVyIG9mXG4gKiBwYXJhbWV0ZXJzLlxuICovXG5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdieU5hbWUnKTtcbi8qKlxuICogQW4gYWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgYSBNZXNzYWdlVHlwZS5cbiAqL1xuY2xhc3MgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIG51bWJlck9mUGFyYW1zKSB7XG4gICAgICAgIHRoaXMubWV0aG9kID0gbWV0aG9kO1xuICAgICAgICB0aGlzLm51bWJlck9mUGFyYW1zID0gbnVtYmVyT2ZQYXJhbXM7XG4gICAgfVxuICAgIGdldCBwYXJhbWV0ZXJTdHJ1Y3R1cmVzKCkge1xuICAgICAgICByZXR1cm4gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvO1xuICAgIH1cbn1cbmV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlID0gQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlO1xuLyoqXG4gKiBDbGFzc2VzIHRvIHR5cGUgcmVxdWVzdCByZXNwb25zZSBwYWlyc1xuICovXG5jbGFzcyBSZXF1ZXN0VHlwZTAgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDApO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGUwID0gUmVxdWVzdFR5cGUwO1xuY2xhc3MgUmVxdWVzdFR5cGUgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCwgX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8pIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAxKTtcbiAgICAgICAgdGhpcy5fcGFyYW1ldGVyU3RydWN0dXJlcyA9IF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbiAgICBnZXQgcGFyYW1ldGVyU3RydWN0dXJlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXM7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IFJlcXVlc3RUeXBlO1xuY2xhc3MgUmVxdWVzdFR5cGUxIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMSk7XG4gICAgICAgIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBfcGFyYW1ldGVyU3RydWN0dXJlcztcbiAgICB9XG4gICAgZ2V0IHBhcmFtZXRlclN0cnVjdHVyZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGUxID0gUmVxdWVzdFR5cGUxO1xuY2xhc3MgUmVxdWVzdFR5cGUyIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAyKTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlMiA9IFJlcXVlc3RUeXBlMjtcbmNsYXNzIFJlcXVlc3RUeXBlMyBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMyk7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTMgPSBSZXF1ZXN0VHlwZTM7XG5jbGFzcyBSZXF1ZXN0VHlwZTQgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDQpO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGU0ID0gUmVxdWVzdFR5cGU0O1xuY2xhc3MgUmVxdWVzdFR5cGU1IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA1KTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlNSA9IFJlcXVlc3RUeXBlNTtcbmNsYXNzIFJlcXVlc3RUeXBlNiBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNik7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTYgPSBSZXF1ZXN0VHlwZTY7XG5jbGFzcyBSZXF1ZXN0VHlwZTcgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDcpO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGU3ID0gUmVxdWVzdFR5cGU3O1xuY2xhc3MgUmVxdWVzdFR5cGU4IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA4KTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlOCA9IFJlcXVlc3RUeXBlODtcbmNsYXNzIFJlcXVlc3RUeXBlOSBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgOSk7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTkgPSBSZXF1ZXN0VHlwZTk7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMSk7XG4gICAgICAgIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBfcGFyYW1ldGVyU3RydWN0dXJlcztcbiAgICB9XG4gICAgZ2V0IHBhcmFtZXRlclN0cnVjdHVyZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZSA9IE5vdGlmaWNhdGlvblR5cGU7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlMCBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMCk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMCA9IE5vdGlmaWNhdGlvblR5cGUwO1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTEgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCwgX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8pIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAxKTtcbiAgICAgICAgdGhpcy5fcGFyYW1ldGVyU3RydWN0dXJlcyA9IF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbiAgICBnZXQgcGFyYW1ldGVyU3RydWN0dXJlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXM7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMSA9IE5vdGlmaWNhdGlvblR5cGUxO1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDIpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTIgPSBOb3RpZmljYXRpb25UeXBlMjtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGUzIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAzKTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGUzID0gTm90aWZpY2F0aW9uVHlwZTM7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlNCBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNCk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNCA9IE5vdGlmaWNhdGlvblR5cGU0O1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTUgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDUpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTUgPSBOb3RpZmljYXRpb25UeXBlNTtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGU2IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA2KTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGU2ID0gTm90aWZpY2F0aW9uVHlwZTY7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlNyBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNyk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNyA9IE5vdGlmaWNhdGlvblR5cGU3O1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTggZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDgpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTggPSBOb3RpZmljYXRpb25UeXBlODtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGU5IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA5KTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGU5ID0gTm90aWZpY2F0aW9uVHlwZTk7XG52YXIgTWVzc2FnZTtcbihmdW5jdGlvbiAoTWVzc2FnZSkge1xuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoZSBnaXZlbiBtZXNzYWdlIGlzIGEgcmVxdWVzdCBtZXNzYWdlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gbWVzc2FnZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBpcy5zdHJpbmcoY2FuZGlkYXRlLm1ldGhvZCkgJiYgKGlzLnN0cmluZyhjYW5kaWRhdGUuaWQpIHx8IGlzLm51bWJlcihjYW5kaWRhdGUuaWQpKTtcbiAgICB9XG4gICAgTWVzc2FnZS5pc1JlcXVlc3QgPSBpc1JlcXVlc3Q7XG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhlIGdpdmVuIG1lc3NhZ2UgaXMgYSBub3RpZmljYXRpb24gbWVzc2FnZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTm90aWZpY2F0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gbWVzc2FnZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBpcy5zdHJpbmcoY2FuZGlkYXRlLm1ldGhvZCkgJiYgbWVzc2FnZS5pZCA9PT0gdm9pZCAwO1xuICAgIH1cbiAgICBNZXNzYWdlLmlzTm90aWZpY2F0aW9uID0gaXNOb3RpZmljYXRpb247XG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhlIGdpdmVuIG1lc3NhZ2UgaXMgYSByZXNwb25zZSBtZXNzYWdlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNSZXNwb25zZShtZXNzYWdlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IG1lc3NhZ2U7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgKGNhbmRpZGF0ZS5yZXN1bHQgIT09IHZvaWQgMCB8fCAhIWNhbmRpZGF0ZS5lcnJvcikgJiYgKGlzLnN0cmluZyhjYW5kaWRhdGUuaWQpIHx8IGlzLm51bWJlcihjYW5kaWRhdGUuaWQpIHx8IGNhbmRpZGF0ZS5pZCA9PT0gbnVsbCk7XG4gICAgfVxuICAgIE1lc3NhZ2UuaXNSZXNwb25zZSA9IGlzUmVzcG9uc2U7XG59KShNZXNzYWdlIHx8IChleHBvcnRzLk1lc3NhZ2UgPSBNZXNzYWdlID0ge30pKTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xudmFyIF9hO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5MUlVDYWNoZSA9IGV4cG9ydHMuTGlua2VkTWFwID0gZXhwb3J0cy5Ub3VjaCA9IHZvaWQgMDtcbnZhciBUb3VjaDtcbihmdW5jdGlvbiAoVG91Y2gpIHtcbiAgICBUb3VjaC5Ob25lID0gMDtcbiAgICBUb3VjaC5GaXJzdCA9IDE7XG4gICAgVG91Y2guQXNPbGQgPSBUb3VjaC5GaXJzdDtcbiAgICBUb3VjaC5MYXN0ID0gMjtcbiAgICBUb3VjaC5Bc05ldyA9IFRvdWNoLkxhc3Q7XG59KShUb3VjaCB8fCAoZXhwb3J0cy5Ub3VjaCA9IFRvdWNoID0ge30pKTtcbmNsYXNzIExpbmtlZE1hcCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXNbX2FdID0gJ0xpbmtlZE1hcCc7XG4gICAgICAgIHRoaXMuX21hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5faGVhZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fdGFpbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IDA7XG4gICAgICAgIHRoaXMuX3N0YXRlID0gMDtcbiAgICB9XG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuX21hcC5jbGVhcigpO1xuICAgICAgICB0aGlzLl9oZWFkID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl90YWlsID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9zaXplID0gMDtcbiAgICAgICAgdGhpcy5fc3RhdGUrKztcbiAgICB9XG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLl9oZWFkICYmICF0aGlzLl90YWlsO1xuICAgIH1cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpemU7XG4gICAgfVxuICAgIGdldCBmaXJzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlYWQ/LnZhbHVlO1xuICAgIH1cbiAgICBnZXQgbGFzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhaWw/LnZhbHVlO1xuICAgIH1cbiAgICBoYXMoa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXAuaGFzKGtleSk7XG4gICAgfVxuICAgIGdldChrZXksIHRvdWNoID0gVG91Y2guTm9uZSkge1xuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5fbWFwLmdldChrZXkpO1xuICAgICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRvdWNoICE9PSBUb3VjaC5Ob25lKSB7XG4gICAgICAgICAgICB0aGlzLnRvdWNoKGl0ZW0sIHRvdWNoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICB9XG4gICAgc2V0KGtleSwgdmFsdWUsIHRvdWNoID0gVG91Y2guTm9uZSkge1xuICAgICAgICBsZXQgaXRlbSA9IHRoaXMuX21hcC5nZXQoa2V5KTtcbiAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgIGl0ZW0udmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIGlmICh0b3VjaCAhPT0gVG91Y2guTm9uZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudG91Y2goaXRlbSwgdG91Y2gpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaXRlbSA9IHsga2V5LCB2YWx1ZSwgbmV4dDogdW5kZWZpbmVkLCBwcmV2aW91czogdW5kZWZpbmVkIH07XG4gICAgICAgICAgICBzd2l0Y2ggKHRvdWNoKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBUb3VjaC5Ob25lOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFRvdWNoLkZpcnN0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1GaXJzdChpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBUb3VjaC5MYXN0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX21hcC5zZXQoa2V5LCBpdGVtKTtcbiAgICAgICAgICAgIHRoaXMuX3NpemUrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGVsZXRlKGtleSkge1xuICAgICAgICByZXR1cm4gISF0aGlzLnJlbW92ZShrZXkpO1xuICAgIH1cbiAgICByZW1vdmUoa2V5KSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl9tYXAuZ2V0KGtleSk7XG4gICAgICAgIGlmICghaXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tYXAuZGVsZXRlKGtleSk7XG4gICAgICAgIHRoaXMucmVtb3ZlSXRlbShpdGVtKTtcbiAgICAgICAgdGhpcy5fc2l6ZS0tO1xuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICB9XG4gICAgc2hpZnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5faGVhZCAmJiAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2hlYWQgfHwgIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIHRoaXMuX21hcC5kZWxldGUoaXRlbS5rZXkpO1xuICAgICAgICB0aGlzLnJlbW92ZUl0ZW0oaXRlbSk7XG4gICAgICAgIHRoaXMuX3NpemUtLTtcbiAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7XG4gICAgfVxuICAgIGZvckVhY2goY2FsbGJhY2tmbiwgdGhpc0FyZykge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3N0YXRlO1xuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICAgICAgICBpZiAodGhpc0FyZykge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrZm4uYmluZCh0aGlzQXJnKShjdXJyZW50LnZhbHVlLCBjdXJyZW50LmtleSwgdGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFja2ZuKGN1cnJlbnQudmFsdWUsIGN1cnJlbnQua2V5LCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gc3RhdGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExpbmtlZE1hcCBnb3QgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAga2V5cygpIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9zdGF0ZTtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLl9oZWFkO1xuICAgICAgICBjb25zdCBpdGVyYXRvciA9IHtcbiAgICAgICAgICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fc3RhdGUgIT09IHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTGlua2VkTWFwIGdvdCBtb2RpZmllZCBkdXJpbmcgaXRlcmF0aW9uLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7IHZhbHVlOiBjdXJyZW50LmtleSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICB9XG4gICAgdmFsdWVzKCkge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3N0YXRlO1xuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIGNvbnN0IGl0ZXJhdG9yID0ge1xuICAgICAgICAgICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlcmF0b3I7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBMaW5rZWRNYXAgZ290IG1vZGlmaWVkIGR1cmluZyBpdGVyYXRpb24uYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHsgdmFsdWU6IGN1cnJlbnQudmFsdWUsIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gaXRlcmF0b3I7XG4gICAgfVxuICAgIGVudHJpZXMoKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5fc3RhdGU7XG4gICAgICAgIGxldCBjdXJyZW50ID0gdGhpcy5faGVhZDtcbiAgICAgICAgY29uc3QgaXRlcmF0b3IgPSB7XG4gICAgICAgICAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3N0YXRlICE9PSBzdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExpbmtlZE1hcCBnb3QgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geyB2YWx1ZTogW2N1cnJlbnQua2V5LCBjdXJyZW50LnZhbHVlXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICB9XG4gICAgWyhfYSA9IFN5bWJvbC50b1N0cmluZ1RhZywgU3ltYm9sLml0ZXJhdG9yKV0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMoKTtcbiAgICB9XG4gICAgdHJpbU9sZChuZXdTaXplKSB7XG4gICAgICAgIGlmIChuZXdTaXplID49IHRoaXMuc2l6ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuZXdTaXplID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLl9oZWFkO1xuICAgICAgICBsZXQgY3VycmVudFNpemUgPSB0aGlzLnNpemU7XG4gICAgICAgIHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnRTaXplID4gbmV3U2l6ZSkge1xuICAgICAgICAgICAgdGhpcy5fbWFwLmRlbGV0ZShjdXJyZW50LmtleSk7XG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0O1xuICAgICAgICAgICAgY3VycmVudFNpemUtLTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9oZWFkID0gY3VycmVudDtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IGN1cnJlbnRTaXplO1xuICAgICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICAgICAgY3VycmVudC5wcmV2aW91cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgIH1cbiAgICBhZGRJdGVtRmlyc3QoaXRlbSkge1xuICAgICAgICAvLyBGaXJzdCB0aW1lIEluc2VydFxuICAgICAgICBpZiAoIXRoaXMuX2hlYWQgJiYgIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRoaXMuX3RhaWwgPSBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCF0aGlzLl9oZWFkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbGlzdCcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdGhpcy5faGVhZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQucHJldmlvdXMgPSBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2hlYWQgPSBpdGVtO1xuICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgIH1cbiAgICBhZGRJdGVtTGFzdChpdGVtKSB7XG4gICAgICAgIC8vIEZpcnN0IHRpbWUgSW5zZXJ0XG4gICAgICAgIGlmICghdGhpcy5faGVhZCAmJiAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgdGhpcy5faGVhZCA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpdGVtLnByZXZpb3VzID0gdGhpcy5fdGFpbDtcbiAgICAgICAgICAgIHRoaXMuX3RhaWwubmV4dCA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW07XG4gICAgICAgIHRoaXMuX3N0YXRlKys7XG4gICAgfVxuICAgIHJlbW92ZUl0ZW0oaXRlbSkge1xuICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCAmJiBpdGVtID09PSB0aGlzLl90YWlsKSB7XG4gICAgICAgICAgICB0aGlzLl9oZWFkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpdGVtID09PSB0aGlzLl9oZWFkKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGNhbiBvbmx5IGhhcHBlbmVkIGlmIHNpemUgPT09IDEgd2hpY2ggaXMgaGFuZGxlXG4gICAgICAgICAgICAvLyBieSB0aGUgY2FzZSBhYm92ZS5cbiAgICAgICAgICAgIGlmICghaXRlbS5uZXh0KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxpc3QnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGl0ZW0ubmV4dC5wcmV2aW91cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQgPSBpdGVtLm5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXRlbSA9PT0gdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgLy8gVGhpcyBjYW4gb25seSBoYXBwZW5lZCBpZiBzaXplID09PSAxIHdoaWNoIGlzIGhhbmRsZVxuICAgICAgICAgICAgLy8gYnkgdGhlIGNhc2UgYWJvdmUuXG4gICAgICAgICAgICBpZiAoIWl0ZW0ucHJldmlvdXMpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbGlzdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbS5wcmV2aW91cy5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gaXRlbS5uZXh0O1xuICAgICAgICAgICAgY29uc3QgcHJldmlvdXMgPSBpdGVtLnByZXZpb3VzO1xuICAgICAgICAgICAgaWYgKCFuZXh0IHx8ICFwcmV2aW91cykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXh0LnByZXZpb3VzID0gcHJldmlvdXM7XG4gICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gbmV4dDtcbiAgICAgICAgfVxuICAgICAgICBpdGVtLm5leHQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGl0ZW0ucHJldmlvdXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX3N0YXRlKys7XG4gICAgfVxuICAgIHRvdWNoKGl0ZW0sIHRvdWNoKSB7XG4gICAgICAgIGlmICghdGhpcy5faGVhZCB8fCAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxpc3QnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHRvdWNoICE9PSBUb3VjaC5GaXJzdCAmJiB0b3VjaCAhPT0gVG91Y2guTGFzdCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG91Y2ggPT09IFRvdWNoLkZpcnN0KSB7XG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBpdGVtLm5leHQ7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgICAgICAvLyBVbmxpbmsgdGhlIGl0ZW1cbiAgICAgICAgICAgIGlmIChpdGVtID09PSB0aGlzLl90YWlsKSB7XG4gICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgbXVzdCBiZSBkZWZpbmVkIHNpbmNlIGl0ZW0gd2FzIG5vdCBoZWFkIGJ1dCBpcyB0YWlsXG4gICAgICAgICAgICAgICAgLy8gU28gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbiBpdGVtIGluIHRoZSBtYXBcbiAgICAgICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuX3RhaWwgPSBwcmV2aW91cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEJvdGggbmV4dCBhbmQgcHJldmlvdXMgYXJlIG5vdCB1bmRlZmluZWQgc2luY2UgaXRlbSB3YXMgbmVpdGhlciBoZWFkIG5vciB0YWlsLlxuICAgICAgICAgICAgICAgIG5leHQucHJldmlvdXMgPSBwcmV2aW91cztcbiAgICAgICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEluc2VydCB0aGUgbm9kZSBhdCBoZWFkXG4gICAgICAgICAgICBpdGVtLnByZXZpb3VzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdGhpcy5faGVhZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQucHJldmlvdXMgPSBpdGVtO1xuICAgICAgICAgICAgdGhpcy5faGVhZCA9IGl0ZW07XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRvdWNoID09PSBUb3VjaC5MYXN0KSB7XG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBpdGVtLm5leHQ7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgICAgICAvLyBVbmxpbmsgdGhlIGl0ZW0uXG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCkge1xuICAgICAgICAgICAgICAgIC8vIG5leHQgbXVzdCBiZSBkZWZpbmVkIHNpbmNlIGl0ZW0gd2FzIG5vdCB0YWlsIGJ1dCBpcyBoZWFkXG4gICAgICAgICAgICAgICAgLy8gU28gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbiBpdGVtIGluIHRoZSBtYXBcbiAgICAgICAgICAgICAgICBuZXh0LnByZXZpb3VzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuX2hlYWQgPSBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQm90aCBuZXh0IGFuZCBwcmV2aW91cyBhcmUgbm90IHVuZGVmaW5lZCBzaW5jZSBpdGVtIHdhcyBuZWl0aGVyIGhlYWQgbm9yIHRhaWwuXG4gICAgICAgICAgICAgICAgbmV4dC5wcmV2aW91cyA9IHByZXZpb3VzO1xuICAgICAgICAgICAgICAgIHByZXZpb3VzLm5leHQgPSBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaXRlbS5wcmV2aW91cyA9IHRoaXMuX3RhaWw7XG4gICAgICAgICAgICB0aGlzLl90YWlsLm5leHQgPSBpdGVtO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW07XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IFtdO1xuICAgICAgICB0aGlzLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGRhdGEucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGZyb21KU09OKGRhdGEpIHtcbiAgICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBkYXRhKSB7XG4gICAgICAgICAgICB0aGlzLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuTGlua2VkTWFwID0gTGlua2VkTWFwO1xuY2xhc3MgTFJVQ2FjaGUgZXh0ZW5kcyBMaW5rZWRNYXAge1xuICAgIGNvbnN0cnVjdG9yKGxpbWl0LCByYXRpbyA9IDEpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fbGltaXQgPSBsaW1pdDtcbiAgICAgICAgdGhpcy5fcmF0aW8gPSBNYXRoLm1pbihNYXRoLm1heCgwLCByYXRpbyksIDEpO1xuICAgIH1cbiAgICBnZXQgbGltaXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9saW1pdDtcbiAgICB9XG4gICAgc2V0IGxpbWl0KGxpbWl0KSB7XG4gICAgICAgIHRoaXMuX2xpbWl0ID0gbGltaXQ7XG4gICAgICAgIHRoaXMuY2hlY2tUcmltKCk7XG4gICAgfVxuICAgIGdldCByYXRpbygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JhdGlvO1xuICAgIH1cbiAgICBzZXQgcmF0aW8ocmF0aW8pIHtcbiAgICAgICAgdGhpcy5fcmF0aW8gPSBNYXRoLm1pbihNYXRoLm1heCgwLCByYXRpbyksIDEpO1xuICAgICAgICB0aGlzLmNoZWNrVHJpbSgpO1xuICAgIH1cbiAgICBnZXQoa2V5LCB0b3VjaCA9IFRvdWNoLkFzTmV3KSB7XG4gICAgICAgIHJldHVybiBzdXBlci5nZXQoa2V5LCB0b3VjaCk7XG4gICAgfVxuICAgIHBlZWsoa2V5KSB7XG4gICAgICAgIHJldHVybiBzdXBlci5nZXQoa2V5LCBUb3VjaC5Ob25lKTtcbiAgICB9XG4gICAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgc3VwZXIuc2V0KGtleSwgdmFsdWUsIFRvdWNoLkxhc3QpO1xuICAgICAgICB0aGlzLmNoZWNrVHJpbSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgY2hlY2tUcmltKCkge1xuICAgICAgICBpZiAodGhpcy5zaXplID4gdGhpcy5fbGltaXQpIHtcbiAgICAgICAgICAgIHRoaXMudHJpbU9sZChNYXRoLnJvdW5kKHRoaXMuX2xpbWl0ICogdGhpcy5fcmF0aW8pKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuTFJVQ2FjaGUgPSBMUlVDYWNoZTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5EaXNwb3NhYmxlID0gdm9pZCAwO1xudmFyIERpc3Bvc2FibGU7XG4oZnVuY3Rpb24gKERpc3Bvc2FibGUpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUoZnVuYykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGlzcG9zZTogZnVuY1xuICAgICAgICB9O1xuICAgIH1cbiAgICBEaXNwb3NhYmxlLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKERpc3Bvc2FibGUgfHwgKGV4cG9ydHMuRGlzcG9zYWJsZSA9IERpc3Bvc2FibGUgPSB7fSkpO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xubGV0IF9yYWw7XG5mdW5jdGlvbiBSQUwoKSB7XG4gICAgaWYgKF9yYWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHJ1bnRpbWUgYWJzdHJhY3Rpb24gbGF5ZXIgaW5zdGFsbGVkYCk7XG4gICAgfVxuICAgIHJldHVybiBfcmFsO1xufVxuKGZ1bmN0aW9uIChSQUwpIHtcbiAgICBmdW5jdGlvbiBpbnN0YWxsKHJhbCkge1xuICAgICAgICBpZiAocmFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gcnVudGltZSBhYnN0cmFjdGlvbiBsYXllciBwcm92aWRlZGApO1xuICAgICAgICB9XG4gICAgICAgIF9yYWwgPSByYWw7XG4gICAgfVxuICAgIFJBTC5pbnN0YWxsID0gaW5zdGFsbDtcbn0pKFJBTCB8fCAoUkFMID0ge30pKTtcbmV4cG9ydHMuZGVmYXVsdCA9IFJBTDtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuRW1pdHRlciA9IGV4cG9ydHMuRXZlbnQgPSB2b2lkIDA7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbnZhciBFdmVudDtcbihmdW5jdGlvbiAoRXZlbnQpIHtcbiAgICBjb25zdCBfZGlzcG9zYWJsZSA9IHsgZGlzcG9zZSgpIHsgfSB9O1xuICAgIEV2ZW50Lk5vbmUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBfZGlzcG9zYWJsZTsgfTtcbn0pKEV2ZW50IHx8IChleHBvcnRzLkV2ZW50ID0gRXZlbnQgPSB7fSkpO1xuY2xhc3MgQ2FsbGJhY2tMaXN0IHtcbiAgICBhZGQoY2FsbGJhY2ssIGNvbnRleHQgPSBudWxsLCBidWNrZXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fY29udGV4dHMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgICAgIHRoaXMuX2NvbnRleHRzLnB1c2goY29udGV4dCk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGJ1Y2tldCkpIHtcbiAgICAgICAgICAgIGJ1Y2tldC5wdXNoKHsgZGlzcG9zZTogKCkgPT4gdGhpcy5yZW1vdmUoY2FsbGJhY2ssIGNvbnRleHQpIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlbW92ZShjYWxsYmFjaywgY29udGV4dCA9IG51bGwpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZm91bmRDYWxsYmFja1dpdGhEaWZmZXJlbnRDb250ZXh0ID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLl9jYWxsYmFja3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jYWxsYmFja3NbaV0gPT09IGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NvbnRleHRzW2ldID09PSBjb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrICYgY29udGV4dCBtYXRjaCA9PiByZW1vdmUgaXRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29udGV4dHMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZENhbGxiYWNrV2l0aERpZmZlcmVudENvbnRleHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZm91bmRDYWxsYmFja1dpdGhEaWZmZXJlbnRDb250ZXh0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1doZW4gYWRkaW5nIGEgbGlzdGVuZXIgd2l0aCBhIGNvbnRleHQsIHlvdSBzaG91bGQgcmVtb3ZlIGl0IHdpdGggdGhlIHNhbWUgY29udGV4dCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGludm9rZSguLi5hcmdzKSB7XG4gICAgICAgIGlmICghdGhpcy5fY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmV0ID0gW10sIGNhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcy5zbGljZSgwKSwgY29udGV4dHMgPSB0aGlzLl9jb250ZXh0cy5zbGljZSgwKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXQucHVzaChjYWxsYmFja3NbaV0uYXBwbHkoY29udGV4dHNbaV0sIGFyZ3MpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS5jb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICAgIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5fY2FsbGJhY2tzIHx8IHRoaXMuX2NhbGxiYWNrcy5sZW5ndGggPT09IDA7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fY29udGV4dHMgPSB1bmRlZmluZWQ7XG4gICAgfVxufVxuY2xhc3MgRW1pdHRlciB7XG4gICAgY29uc3RydWN0b3IoX29wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IF9vcHRpb25zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGb3IgdGhlIHB1YmxpYyB0byBhbGxvdyB0byBzdWJzY3JpYmVcbiAgICAgKiB0byBldmVudHMgZnJvbSB0aGlzIEVtaXR0ZXJcbiAgICAgKi9cbiAgICBnZXQgZXZlbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fZXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50ID0gKGxpc3RlbmVyLCB0aGlzQXJncywgZGlzcG9zYWJsZXMpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2NhbGxiYWNrcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWxsYmFja3MgPSBuZXcgQ2FsbGJhY2tMaXN0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMub25GaXJzdExpc3RlbmVyQWRkICYmIHRoaXMuX2NhbGxiYWNrcy5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy5vbkZpcnN0TGlzdGVuZXJBZGQodGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5hZGQobGlzdGVuZXIsIHRoaXNBcmdzKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlzcG9zYWJsZSBpcyBkaXNwb3NlZCBhZnRlciBlbWl0dGVyIGlzIGRpc3Bvc2VkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5yZW1vdmUobGlzdGVuZXIsIHRoaXNBcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5kaXNwb3NlID0gRW1pdHRlci5fbm9vcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMub25MYXN0TGlzdGVuZXJSZW1vdmUgJiYgdGhpcy5fY2FsbGJhY2tzLmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29wdGlvbnMub25MYXN0TGlzdGVuZXJSZW1vdmUodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRpc3Bvc2FibGVzKSkge1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlcy5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9ldmVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVG8gYmUga2VwdCBwcml2YXRlIHRvIGZpcmUgYW4gZXZlbnQgdG9cbiAgICAgKiBzdWJzY3JpYmVyc1xuICAgICAqL1xuICAgIGZpcmUoZXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NhbGxiYWNrcykge1xuICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzLmludm9rZS5jYWxsKHRoaXMuX2NhbGxiYWNrcywgZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5kaXNwb3NlKCk7XG4gICAgICAgICAgICB0aGlzLl9jYWxsYmFja3MgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLkVtaXR0ZXIgPSBFbWl0dGVyO1xuRW1pdHRlci5fbm9vcCA9IGZ1bmN0aW9uICgpIHsgfTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uVG9rZW4gPSB2b2lkIDA7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbmNvbnN0IElzID0gcmVxdWlyZShcIi4vaXNcIik7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCIuL2V2ZW50c1wiKTtcbnZhciBDYW5jZWxsYXRpb25Ub2tlbjtcbihmdW5jdGlvbiAoQ2FuY2VsbGF0aW9uVG9rZW4pIHtcbiAgICBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGlzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkOiBmYWxzZSxcbiAgICAgICAgb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6IGV2ZW50c18xLkV2ZW50Lk5vbmVcbiAgICB9KTtcbiAgICBDYW5jZWxsYXRpb25Ub2tlbi5DYW5jZWxsZWQgPSBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6IHRydWUsXG4gICAgICAgIG9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkOiBldmVudHNfMS5FdmVudC5Ob25lXG4gICAgfSk7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgKGNhbmRpZGF0ZSA9PT0gQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZVxuICAgICAgICAgICAgfHwgY2FuZGlkYXRlID09PSBDYW5jZWxsYXRpb25Ub2tlbi5DYW5jZWxsZWRcbiAgICAgICAgICAgIHx8IChJcy5ib29sZWFuKGNhbmRpZGF0ZS5pc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkgJiYgISFjYW5kaWRhdGUub25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQpKTtcbiAgICB9XG4gICAgQ2FuY2VsbGF0aW9uVG9rZW4uaXMgPSBpcztcbn0pKENhbmNlbGxhdGlvblRva2VuIHx8IChleHBvcnRzLkNhbmNlbGxhdGlvblRva2VuID0gQ2FuY2VsbGF0aW9uVG9rZW4gPSB7fSkpO1xuY29uc3Qgc2hvcnRjdXRFdmVudCA9IE9iamVjdC5mcmVlemUoZnVuY3Rpb24gKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgY29uc3QgaGFuZGxlID0gKDAsIHJhbF8xLmRlZmF1bHQpKCkudGltZXIuc2V0VGltZW91dChjYWxsYmFjay5iaW5kKGNvbnRleHQpLCAwKTtcbiAgICByZXR1cm4geyBkaXNwb3NlKCkgeyBoYW5kbGUuZGlzcG9zZSgpOyB9IH07XG59KTtcbmNsYXNzIE11dGFibGVUb2tlbiB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX2lzQ2FuY2VsbGVkID0gZmFsc2U7XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9pc0NhbmNlbGxlZCkge1xuICAgICAgICAgICAgdGhpcy5faXNDYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2VtaXR0ZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmZpcmUodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0NhbmNlbGxlZDtcbiAgICB9XG4gICAgZ2V0IG9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKCkge1xuICAgICAgICBpZiAodGhpcy5faXNDYW5jZWxsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBzaG9ydGN1dEV2ZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5fZW1pdHRlcikge1xuICAgICAgICAgICAgdGhpcy5fZW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2VtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLl9lbWl0dGVyKSB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5jbGFzcyBDYW5jZWxsYXRpb25Ub2tlblNvdXJjZSB7XG4gICAgZ2V0IHRva2VuKCkge1xuICAgICAgICBpZiAoIXRoaXMuX3Rva2VuKSB7XG4gICAgICAgICAgICAvLyBiZSBsYXp5IGFuZCBjcmVhdGUgdGhlIHRva2VuIG9ubHkgd2hlblxuICAgICAgICAgICAgLy8gYWN0dWFsbHkgbmVlZGVkXG4gICAgICAgICAgICB0aGlzLl90b2tlbiA9IG5ldyBNdXRhYmxlVG9rZW4oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fdG9rZW47XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl90b2tlbikge1xuICAgICAgICAgICAgLy8gc2F2ZSBhbiBvYmplY3QgYnkgcmV0dXJuaW5nIHRoZSBkZWZhdWx0XG4gICAgICAgICAgICAvLyBjYW5jZWxsZWQgdG9rZW4gd2hlbiBjYW5jZWxsYXRpb24gaGFwcGVuc1xuICAgICAgICAgICAgLy8gYmVmb3JlIHNvbWVvbmUgYXNrcyBmb3IgdGhlIHRva2VuXG4gICAgICAgICAgICB0aGlzLl90b2tlbiA9IENhbmNlbGxhdGlvblRva2VuLkNhbmNlbGxlZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3Rva2VuLmNhbmNlbCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICghdGhpcy5fdG9rZW4pIHtcbiAgICAgICAgICAgIC8vIGVuc3VyZSB0byBpbml0aWFsaXplIHdpdGggYW4gZW1wdHkgdG9rZW4gaWYgd2UgaGFkIG5vbmVcbiAgICAgICAgICAgIHRoaXMuX3Rva2VuID0gQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLl90b2tlbiBpbnN0YW5jZW9mIE11dGFibGVUb2tlbikge1xuICAgICAgICAgICAgLy8gYWN0dWFsbHkgZGlzcG9zZVxuICAgICAgICAgICAgdGhpcy5fdG9rZW4uZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IENhbmNlbGxhdGlvblRva2VuU291cmNlO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3kgPSB2b2lkIDA7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbnZhciBDYW5jZWxsYXRpb25TdGF0ZTtcbihmdW5jdGlvbiAoQ2FuY2VsbGF0aW9uU3RhdGUpIHtcbiAgICBDYW5jZWxsYXRpb25TdGF0ZS5Db250aW51ZSA9IDA7XG4gICAgQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkID0gMTtcbn0pKENhbmNlbGxhdGlvblN0YXRlIHx8IChDYW5jZWxsYXRpb25TdGF0ZSA9IHt9KSk7XG5jbGFzcyBTaGFyZWRBcnJheVNlbmRlclN0cmF0ZWd5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5idWZmZXJzID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICBlbmFibGVDYW5jZWxsYXRpb24ocmVxdWVzdCkge1xuICAgICAgICBpZiAocmVxdWVzdC5pZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBTaGFyZWRBcnJheUJ1ZmZlcig0KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBJbnQzMkFycmF5KGJ1ZmZlciwgMCwgMSk7XG4gICAgICAgIGRhdGFbMF0gPSBDYW5jZWxsYXRpb25TdGF0ZS5Db250aW51ZTtcbiAgICAgICAgdGhpcy5idWZmZXJzLnNldChyZXF1ZXN0LmlkLCBidWZmZXIpO1xuICAgICAgICByZXF1ZXN0LiRjYW5jZWxsYXRpb25EYXRhID0gYnVmZmVyO1xuICAgIH1cbiAgICBhc3luYyBzZW5kQ2FuY2VsbGF0aW9uKF9jb25uLCBpZCkge1xuICAgICAgICBjb25zdCBidWZmZXIgPSB0aGlzLmJ1ZmZlcnMuZ2V0KGlkKTtcbiAgICAgICAgaWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBJbnQzMkFycmF5KGJ1ZmZlciwgMCwgMSk7XG4gICAgICAgIEF0b21pY3Muc3RvcmUoZGF0YSwgMCwgQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkKTtcbiAgICB9XG4gICAgY2xlYW51cChpZCkge1xuICAgICAgICB0aGlzLmJ1ZmZlcnMuZGVsZXRlKGlkKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy5idWZmZXJzLmNsZWFyKCk7XG4gICAgfVxufVxuZXhwb3J0cy5TaGFyZWRBcnJheVNlbmRlclN0cmF0ZWd5ID0gU2hhcmVkQXJyYXlTZW5kZXJTdHJhdGVneTtcbmNsYXNzIFNoYXJlZEFycmF5QnVmZmVyQ2FuY2VsbGF0aW9uVG9rZW4ge1xuICAgIGNvbnN0cnVjdG9yKGJ1ZmZlcikge1xuICAgICAgICB0aGlzLmRhdGEgPSBuZXcgSW50MzJBcnJheShidWZmZXIsIDAsIDEpO1xuICAgIH1cbiAgICBnZXQgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHJldHVybiBBdG9taWNzLmxvYWQodGhpcy5kYXRhLCAwKSA9PT0gQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkO1xuICAgIH1cbiAgICBnZXQgb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuY2VsbGF0aW9uIG92ZXIgU2hhcmVkQXJyYXlCdWZmZXIgZG9lc24ndCBzdXBwb3J0IGNhbmNlbGxhdGlvbiBldmVudHNgKTtcbiAgICB9XG59XG5jbGFzcyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuU291cmNlIHtcbiAgICBjb25zdHJ1Y3RvcihidWZmZXIpIHtcbiAgICAgICAgdGhpcy50b2tlbiA9IG5ldyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuKGJ1ZmZlcik7XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICB9XG59XG5jbGFzcyBTaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmtpbmQgPSAncmVxdWVzdCc7XG4gICAgfVxuICAgIGNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKHJlcXVlc3QpIHtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gcmVxdWVzdC4kY2FuY2VsbGF0aW9uRGF0YTtcbiAgICAgICAgaWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuU291cmNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuU291cmNlKGJ1ZmZlcik7XG4gICAgfVxufVxuZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBTaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3k7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNlbWFwaG9yZSA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY2xhc3MgU2VtYXBob3JlIHtcbiAgICBjb25zdHJ1Y3RvcihjYXBhY2l0eSA9IDEpIHtcbiAgICAgICAgaWYgKGNhcGFjaXR5IDw9IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FwYWNpdHkgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NhcGFjaXR5ID0gY2FwYWNpdHk7XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IDA7XG4gICAgICAgIHRoaXMuX3dhaXRpbmcgPSBbXTtcbiAgICB9XG4gICAgbG9jayh0aHVuaykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fd2FpdGluZy5wdXNoKHsgdGh1bmssIHJlc29sdmUsIHJlamVjdCB9KTtcbiAgICAgICAgICAgIHRoaXMucnVuTmV4dCgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0IGFjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTtcbiAgICB9XG4gICAgcnVuTmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dhaXRpbmcubGVuZ3RoID09PSAwIHx8IHRoaXMuX2FjdGl2ZSA9PT0gdGhpcy5fY2FwYWNpdHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS50aW1lci5zZXRJbW1lZGlhdGUoKCkgPT4gdGhpcy5kb1J1bk5leHQoKSk7XG4gICAgfVxuICAgIGRvUnVuTmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dhaXRpbmcubGVuZ3RoID09PSAwIHx8IHRoaXMuX2FjdGl2ZSA9PT0gdGhpcy5fY2FwYWNpdHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5fd2FpdGluZy5zaGlmdCgpO1xuICAgICAgICB0aGlzLl9hY3RpdmUrKztcbiAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZSA+IHRoaXMuX2NhcGFjaXR5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRvIG1hbnkgdGh1bmtzIGFjdGl2ZWApO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXh0LnRodW5rKCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC50aGVuKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5yZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5OZXh0KCk7XG4gICAgICAgICAgICAgICAgfSwgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5yZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5OZXh0KCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICBuZXh0LnJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1bk5leHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgIG5leHQucmVqZWN0KGVycik7XG4gICAgICAgICAgICB0aGlzLnJ1bk5leHQoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuU2VtYXBob3JlID0gU2VtYXBob3JlO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXIgPSBleHBvcnRzLkFic3RyYWN0TWVzc2FnZVJlYWRlciA9IGV4cG9ydHMuTWVzc2FnZVJlYWRlciA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IGV2ZW50c18xID0gcmVxdWlyZShcIi4vZXZlbnRzXCIpO1xuY29uc3Qgc2VtYXBob3JlXzEgPSByZXF1aXJlKFwiLi9zZW1hcGhvcmVcIik7XG52YXIgTWVzc2FnZVJlYWRlcjtcbihmdW5jdGlvbiAoTWVzc2FnZVJlYWRlcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5saXN0ZW4pICYmIElzLmZ1bmMoY2FuZGlkYXRlLmRpc3Bvc2UpICYmXG4gICAgICAgICAgICBJcy5mdW5jKGNhbmRpZGF0ZS5vbkVycm9yKSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5vbkNsb3NlKSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5vblBhcnRpYWxNZXNzYWdlKTtcbiAgICB9XG4gICAgTWVzc2FnZVJlYWRlci5pcyA9IGlzO1xufSkoTWVzc2FnZVJlYWRlciB8fCAoZXhwb3J0cy5NZXNzYWdlUmVhZGVyID0gTWVzc2FnZVJlYWRlciA9IHt9KSk7XG5jbGFzcyBBYnN0cmFjdE1lc3NhZ2VSZWFkZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZUVtaXR0ZXIgPSBuZXcgZXZlbnRzXzEuRW1pdHRlcigpO1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlci5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgZ2V0IG9uRXJyb3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVycm9yRW1pdHRlci5ldmVudDtcbiAgICB9XG4gICAgZmlyZUVycm9yKGVycm9yKSB7XG4gICAgICAgIHRoaXMuZXJyb3JFbWl0dGVyLmZpcmUodGhpcy5hc0Vycm9yKGVycm9yKSk7XG4gICAgfVxuICAgIGdldCBvbkNsb3NlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9zZUVtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGZpcmVDbG9zZSgpIHtcbiAgICAgICAgdGhpcy5jbG9zZUVtaXR0ZXIuZmlyZSh1bmRlZmluZWQpO1xuICAgIH1cbiAgICBnZXQgb25QYXJ0aWFsTWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFydGlhbE1lc3NhZ2VFbWl0dGVyLmV2ZW50O1xuICAgIH1cbiAgICBmaXJlUGFydGlhbE1lc3NhZ2UoaW5mbykge1xuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlRW1pdHRlci5maXJlKGluZm8pO1xuICAgIH1cbiAgICBhc0Vycm9yKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKGBSZWFkZXIgcmVjZWl2ZWQgZXJyb3IuIFJlYXNvbjogJHtJcy5zdHJpbmcoZXJyb3IubWVzc2FnZSkgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24nfWApO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VSZWFkZXIgPSBBYnN0cmFjdE1lc3NhZ2VSZWFkZXI7XG52YXIgUmVzb2x2ZWRNZXNzYWdlUmVhZGVyT3B0aW9ucztcbihmdW5jdGlvbiAoUmVzb2x2ZWRNZXNzYWdlUmVhZGVyT3B0aW9ucykge1xuICAgIGZ1bmN0aW9uIGZyb21PcHRpb25zKG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IGNoYXJzZXQ7XG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIGxldCBjb250ZW50RGVjb2RlcjtcbiAgICAgICAgY29uc3QgY29udGVudERlY29kZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICBsZXQgY29udGVudFR5cGVEZWNvZGVyO1xuICAgICAgICBjb25zdCBjb250ZW50VHlwZURlY29kZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY2hhcnNldCA9IG9wdGlvbnMgPz8gJ3V0Zi04JztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNoYXJzZXQgPSBvcHRpb25zLmNoYXJzZXQgPz8gJ3V0Zi04JztcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnREZWNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50RGVjb2RlciA9IG9wdGlvbnMuY29udGVudERlY29kZXI7XG4gICAgICAgICAgICAgICAgY29udGVudERlY29kZXJzLnNldChjb250ZW50RGVjb2Rlci5uYW1lLCBjb250ZW50RGVjb2Rlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5jb250ZW50RGVjb2RlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGVjb2RlciBvZiBvcHRpb25zLmNvbnRlbnREZWNvZGVycykge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50RGVjb2RlcnMuc2V0KGRlY29kZXIubmFtZSwgZGVjb2Rlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuY29udGVudFR5cGVEZWNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXIgPSBvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcjtcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXJzLnNldChjb250ZW50VHlwZURlY29kZXIubmFtZSwgY29udGVudFR5cGVEZWNvZGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGVjb2RlciBvZiBvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGVEZWNvZGVycy5zZXQoZGVjb2Rlci5uYW1lLCBkZWNvZGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnRlbnRUeXBlRGVjb2RlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXIgPSAoMCwgcmFsXzEuZGVmYXVsdCkoKS5hcHBsaWNhdGlvbkpzb24uZGVjb2RlcjtcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlRGVjb2RlcnMuc2V0KGNvbnRlbnRUeXBlRGVjb2Rlci5uYW1lLCBjb250ZW50VHlwZURlY29kZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGNoYXJzZXQsIGNvbnRlbnREZWNvZGVyLCBjb250ZW50RGVjb2RlcnMsIGNvbnRlbnRUeXBlRGVjb2RlciwgY29udGVudFR5cGVEZWNvZGVycyB9O1xuICAgIH1cbiAgICBSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zLmZyb21PcHRpb25zID0gZnJvbU9wdGlvbnM7XG59KShSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zIHx8IChSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zID0ge30pKTtcbmNsYXNzIFJlYWRhYmxlU3RyZWFtTWVzc2FnZVJlYWRlciBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVJlYWRlciB7XG4gICAgY29uc3RydWN0b3IocmVhZGFibGUsIG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZSA9IHJlYWRhYmxlO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zLmZyb21PcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmJ1ZmZlciA9ICgwLCByYWxfMS5kZWZhdWx0KSgpLm1lc3NhZ2VCdWZmZXIuY3JlYXRlKHRoaXMub3B0aW9ucy5jaGFyc2V0KTtcbiAgICAgICAgdGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0ID0gMTAwMDA7XG4gICAgICAgIHRoaXMubmV4dE1lc3NhZ2VMZW5ndGggPSAtMTtcbiAgICAgICAgdGhpcy5tZXNzYWdlVG9rZW4gPSAwO1xuICAgICAgICB0aGlzLnJlYWRTZW1hcGhvcmUgPSBuZXcgc2VtYXBob3JlXzEuU2VtYXBob3JlKDEpO1xuICAgIH1cbiAgICBzZXQgcGFydGlhbE1lc3NhZ2VUaW1lb3V0KHRpbWVvdXQpIHtcbiAgICAgICAgdGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0ID0gdGltZW91dDtcbiAgICB9XG4gICAgZ2V0IHBhcnRpYWxNZXNzYWdlVGltZW91dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dDtcbiAgICB9XG4gICAgbGlzdGVuKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMubmV4dE1lc3NhZ2VMZW5ndGggPSAtMTtcbiAgICAgICAgdGhpcy5tZXNzYWdlVG9rZW4gPSAwO1xuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlVGltZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5yZWFkYWJsZS5vbkRhdGEoKGRhdGEpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25EYXRhKGRhdGEpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZS5vbkVycm9yKChlcnJvcikgPT4gdGhpcy5maXJlRXJyb3IoZXJyb3IpKTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZS5vbkNsb3NlKCgpID0+IHRoaXMuZmlyZUNsb3NlKCkpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBvbkRhdGEoZGF0YSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5idWZmZXIuYXBwZW5kKGRhdGEpO1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IHRoaXMuYnVmZmVyLnRyeVJlYWRIZWFkZXJzKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50TGVuZ3RoID0gaGVhZGVycy5nZXQoJ2NvbnRlbnQtbGVuZ3RoJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY29udGVudExlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IobmV3IEVycm9yKGBIZWFkZXIgbXVzdCBwcm92aWRlIGEgQ29udGVudC1MZW5ndGggcHJvcGVydHkuXFxuJHtKU09OLnN0cmluZ2lmeShPYmplY3QuZnJvbUVudHJpZXMoaGVhZGVycykpfWApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsZW5ndGggPSBwYXJzZUludChjb250ZW50TGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKGxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKG5ldyBFcnJvcihgQ29udGVudC1MZW5ndGggdmFsdWUgbXVzdCBiZSBhIG51bWJlci4gR290ICR7Y29udGVudExlbmd0aH1gKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IHRoaXMuYnVmZmVyLnRyeVJlYWRCb2R5KHRoaXMubmV4dE1lc3NhZ2VMZW5ndGgpO1xuICAgICAgICAgICAgICAgIGlmIChib2R5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLyoqIFdlIGhhdmVuJ3QgcmVjZWl2ZWQgdGhlIGZ1bGwgbWVzc2FnZSB5ZXQuICovXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0UGFydGlhbE1lc3NhZ2VUaW1lcigpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJQYXJ0aWFsTWVzc2FnZVRpbWVyKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9IC0xO1xuICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHdlIGNvbnZlcnQgb25lIHJlY2VpdmVkIG1lc3NhZ2UgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAgICAgLy8gb3RoZXIuIE90aGVyd2lzZSBpdCBjb3VsZCBoYXBwZW4gdGhhdCBhIGRlY29kaW5nIG9mIGEgc2Vjb25kXG4gICAgICAgICAgICAgICAgLy8gc21hbGxlciBtZXNzYWdlIGZpbmlzaGVkIGJlZm9yZSB0aGUgZGVjb2Rpbmcgb2YgYSBmaXJzdCBsYXJnZXJcbiAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIGFuZCB0aGVuIHdlIHdvdWxkIGRlbGl2ZXIgdGhlIHNlY29uZCBtZXNzYWdlIGZpcnN0LlxuICAgICAgICAgICAgICAgIHRoaXMucmVhZFNlbWFwaG9yZS5sb2NrKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnl0ZXMgPSB0aGlzLm9wdGlvbnMuY29udGVudERlY29kZXIgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBhd2FpdCB0aGlzLm9wdGlvbnMuY29udGVudERlY29kZXIuZGVjb2RlKGJvZHkpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGJvZHk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBhd2FpdCB0aGlzLm9wdGlvbnMuY29udGVudFR5cGVEZWNvZGVyLmRlY29kZShieXRlcywgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjayhtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNsZWFyUGFydGlhbE1lc3NhZ2VUaW1lcigpIHtcbiAgICAgICAgaWYgKHRoaXMucGFydGlhbE1lc3NhZ2VUaW1lcikge1xuICAgICAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZVRpbWVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRoaXMucGFydGlhbE1lc3NhZ2VUaW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRQYXJ0aWFsTWVzc2FnZVRpbWVyKCkge1xuICAgICAgICB0aGlzLmNsZWFyUGFydGlhbE1lc3NhZ2VUaW1lcigpO1xuICAgICAgICBpZiAodGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0IDw9IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlVGltZXIgPSAoMCwgcmFsXzEuZGVmYXVsdCkoKS50aW1lci5zZXRUaW1lb3V0KCh0b2tlbiwgdGltZW91dCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZVRpbWVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRva2VuID09PSB0aGlzLm1lc3NhZ2VUb2tlbikge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZVBhcnRpYWxNZXNzYWdlKHsgbWVzc2FnZVRva2VuOiB0b2tlbiwgd2FpdGluZ1RpbWU6IHRpbWVvdXQgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRQYXJ0aWFsTWVzc2FnZVRpbWVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dCwgdGhpcy5tZXNzYWdlVG9rZW4sIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dCk7XG4gICAgfVxufVxuZXhwb3J0cy5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXIgPSBSZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLldyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLkFic3RyYWN0TWVzc2FnZVdyaXRlciA9IGV4cG9ydHMuTWVzc2FnZVdyaXRlciA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IHNlbWFwaG9yZV8xID0gcmVxdWlyZShcIi4vc2VtYXBob3JlXCIpO1xuY29uc3QgZXZlbnRzXzEgPSByZXF1aXJlKFwiLi9ldmVudHNcIik7XG5jb25zdCBDb250ZW50TGVuZ3RoID0gJ0NvbnRlbnQtTGVuZ3RoOiAnO1xuY29uc3QgQ1JMRiA9ICdcXHJcXG4nO1xudmFyIE1lc3NhZ2VXcml0ZXI7XG4oZnVuY3Rpb24gKE1lc3NhZ2VXcml0ZXIpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgSXMuZnVuYyhjYW5kaWRhdGUuZGlzcG9zZSkgJiYgSXMuZnVuYyhjYW5kaWRhdGUub25DbG9zZSkgJiZcbiAgICAgICAgICAgIElzLmZ1bmMoY2FuZGlkYXRlLm9uRXJyb3IpICYmIElzLmZ1bmMoY2FuZGlkYXRlLndyaXRlKTtcbiAgICB9XG4gICAgTWVzc2FnZVdyaXRlci5pcyA9IGlzO1xufSkoTWVzc2FnZVdyaXRlciB8fCAoZXhwb3J0cy5NZXNzYWdlV3JpdGVyID0gTWVzc2FnZVdyaXRlciA9IHt9KSk7XG5jbGFzcyBBYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy5lcnJvckVtaXR0ZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLmNsb3NlRW1pdHRlci5kaXNwb3NlKCk7XG4gICAgfVxuICAgIGdldCBvbkVycm9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lcnJvckVtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGZpcmVFcnJvcihlcnJvciwgbWVzc2FnZSwgY291bnQpIHtcbiAgICAgICAgdGhpcy5lcnJvckVtaXR0ZXIuZmlyZShbdGhpcy5hc0Vycm9yKGVycm9yKSwgbWVzc2FnZSwgY291bnRdKTtcbiAgICB9XG4gICAgZ2V0IG9uQ2xvc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb3NlRW1pdHRlci5ldmVudDtcbiAgICB9XG4gICAgZmlyZUNsb3NlKCkge1xuICAgICAgICB0aGlzLmNsb3NlRW1pdHRlci5maXJlKHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIGFzRXJyb3IoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoYFdyaXRlciByZWNlaXZlZCBlcnJvci4gUmVhc29uOiAke0lzLnN0cmluZyhlcnJvci5tZXNzYWdlKSA/IGVycm9yLm1lc3NhZ2UgOiAndW5rbm93bid9YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLkFic3RyYWN0TWVzc2FnZVdyaXRlciA9IEFic3RyYWN0TWVzc2FnZVdyaXRlcjtcbnZhciBSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zO1xuKGZ1bmN0aW9uIChSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zKSB7XG4gICAgZnVuY3Rpb24gZnJvbU9wdGlvbnMob3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHsgY2hhcnNldDogb3B0aW9ucyA/PyAndXRmLTgnLCBjb250ZW50VHlwZUVuY29kZXI6ICgwLCByYWxfMS5kZWZhdWx0KSgpLmFwcGxpY2F0aW9uSnNvbi5lbmNvZGVyIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4geyBjaGFyc2V0OiBvcHRpb25zLmNoYXJzZXQgPz8gJ3V0Zi04JywgY29udGVudEVuY29kZXI6IG9wdGlvbnMuY29udGVudEVuY29kZXIsIGNvbnRlbnRUeXBlRW5jb2Rlcjogb3B0aW9ucy5jb250ZW50VHlwZUVuY29kZXIgPz8gKDAsIHJhbF8xLmRlZmF1bHQpKCkuYXBwbGljYXRpb25Kc29uLmVuY29kZXIgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zLmZyb21PcHRpb25zID0gZnJvbU9wdGlvbnM7XG59KShSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zIHx8IChSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zID0ge30pKTtcbmNsYXNzIFdyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKHdyaXRhYmxlLCBvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMud3JpdGFibGUgPSB3cml0YWJsZTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gUmVzb2x2ZWRNZXNzYWdlV3JpdGVyT3B0aW9ucy5mcm9tT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50ID0gMDtcbiAgICAgICAgdGhpcy53cml0ZVNlbWFwaG9yZSA9IG5ldyBzZW1hcGhvcmVfMS5TZW1hcGhvcmUoMSk7XG4gICAgICAgIHRoaXMud3JpdGFibGUub25FcnJvcigoZXJyb3IpID0+IHRoaXMuZmlyZUVycm9yKGVycm9yKSk7XG4gICAgICAgIHRoaXMud3JpdGFibGUub25DbG9zZSgoKSA9PiB0aGlzLmZpcmVDbG9zZSgpKTtcbiAgICB9XG4gICAgYXN5bmMgd3JpdGUobXNnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndyaXRlU2VtYXBob3JlLmxvY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHRoaXMub3B0aW9ucy5jb250ZW50VHlwZUVuY29kZXIuZW5jb2RlKG1zZywgdGhpcy5vcHRpb25zKS50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNvbnRlbnRFbmNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jb250ZW50RW5jb2Rlci5lbmNvZGUoYnVmZmVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZC50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJzID0gW107XG4gICAgICAgICAgICAgICAgaGVhZGVycy5wdXNoKENvbnRlbnRMZW5ndGgsIGJ1ZmZlci5ieXRlTGVuZ3RoLnRvU3RyaW5nKCksIENSTEYpO1xuICAgICAgICAgICAgICAgIGhlYWRlcnMucHVzaChDUkxGKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kb1dyaXRlKG1zZywgaGVhZGVycywgYnVmZmVyKTtcbiAgICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgZG9Xcml0ZShtc2csIGhlYWRlcnMsIGRhdGEpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMud3JpdGFibGUud3JpdGUoaGVhZGVycy5qb2luKCcnKSwgJ2FzY2lpJyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy53cml0YWJsZS53cml0ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IsIG1zZyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZUVycm9yKGVycm9yLCBtc2cpIHtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50Kys7XG4gICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yLCBtc2csIHRoaXMuZXJyb3JDb3VudCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICAgICAgdGhpcy53cml0YWJsZS5lbmQoKTtcbiAgICB9XG59XG5leHBvcnRzLldyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgPSBXcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkFic3RyYWN0TWVzc2FnZUJ1ZmZlciA9IHZvaWQgMDtcbmNvbnN0IENSID0gMTM7XG5jb25zdCBMRiA9IDEwO1xuY29uc3QgQ1JMRiA9ICdcXHJcXG4nO1xuY2xhc3MgQWJzdHJhY3RNZXNzYWdlQnVmZmVyIHtcbiAgICBjb25zdHJ1Y3RvcihlbmNvZGluZyA9ICd1dGYtOCcpIHtcbiAgICAgICAgdGhpcy5fZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgICAgICAgdGhpcy5fY2h1bmtzID0gW107XG4gICAgICAgIHRoaXMuX3RvdGFsTGVuZ3RoID0gMDtcbiAgICB9XG4gICAgZ2V0IGVuY29kaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW5jb2Rpbmc7XG4gICAgfVxuICAgIGFwcGVuZChjaHVuaykge1xuICAgICAgICBjb25zdCB0b0FwcGVuZCA9IHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZycgPyB0aGlzLmZyb21TdHJpbmcoY2h1bmssIHRoaXMuX2VuY29kaW5nKSA6IGNodW5rO1xuICAgICAgICB0aGlzLl9jaHVua3MucHVzaCh0b0FwcGVuZCk7XG4gICAgICAgIHRoaXMuX3RvdGFsTGVuZ3RoICs9IHRvQXBwZW5kLmJ5dGVMZW5ndGg7XG4gICAgfVxuICAgIHRyeVJlYWRIZWFkZXJzKGxvd2VyQ2FzZUtleXMgPSBmYWxzZSkge1xuICAgICAgICBpZiAodGhpcy5fY2h1bmtzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3RhdGUgPSAwO1xuICAgICAgICBsZXQgY2h1bmtJbmRleCA9IDA7XG4gICAgICAgIGxldCBvZmZzZXQgPSAwO1xuICAgICAgICBsZXQgY2h1bmtCeXRlc1JlYWQgPSAwO1xuICAgICAgICByb3c6IHdoaWxlIChjaHVua0luZGV4IDwgdGhpcy5fY2h1bmtzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgY2h1bmsgPSB0aGlzLl9jaHVua3NbY2h1bmtJbmRleF07XG4gICAgICAgICAgICBvZmZzZXQgPSAwO1xuICAgICAgICAgICAgY29sdW1uOiB3aGlsZSAob2Zmc2V0IDwgY2h1bmsubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjaHVua1tvZmZzZXRdO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDUjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIExGOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gNDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHJvdztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjaHVua0J5dGVzUmVhZCArPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgY2h1bmtJbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZSAhPT0gNCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgYnVmZmVyIGNvbnRhaW5zIHRoZSB0d28gQ1JMRiBhdCB0aGUgZW5kLiBTbyB3ZSB3aWxsXG4gICAgICAgIC8vIGhhdmUgdHdvIGVtcHR5IGxpbmVzIGFmdGVyIHRoZSBzcGxpdCBhdCB0aGUgZW5kIGFzIHdlbGwuXG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuX3JlYWQoY2h1bmtCeXRlc1JlYWQgKyBvZmZzZXQpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwKCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLnRvU3RyaW5nKGJ1ZmZlciwgJ2FzY2lpJykuc3BsaXQoQ1JMRik7XG4gICAgICAgIGlmIChoZWFkZXJzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXJzLmxlbmd0aCAtIDI7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaGVhZGVyID0gaGVhZGVyc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gaGVhZGVyLmluZGV4T2YoJzonKTtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1lc3NhZ2UgaGVhZGVyIG11c3Qgc2VwYXJhdGUga2V5IGFuZCB2YWx1ZSB1c2luZyAnOidcXG4ke2hlYWRlcn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGhlYWRlci5zdWJzdHIoMCwgaW5kZXgpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBoZWFkZXIuc3Vic3RyKGluZGV4ICsgMSkudHJpbSgpO1xuICAgICAgICAgICAgcmVzdWx0LnNldChsb3dlckNhc2VLZXlzID8ga2V5LnRvTG93ZXJDYXNlKCkgOiBrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICB0cnlSZWFkQm9keShsZW5ndGgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3RvdGFsTGVuZ3RoIDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkKGxlbmd0aCk7XG4gICAgfVxuICAgIGdldCBudW1iZXJPZkJ5dGVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdG90YWxMZW5ndGg7XG4gICAgfVxuICAgIF9yZWFkKGJ5dGVDb3VudCkge1xuICAgICAgICBpZiAoYnl0ZUNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbXB0eUJ1ZmZlcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChieXRlQ291bnQgPiB0aGlzLl90b3RhbExlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVhZCBzbyBtYW55IGJ5dGVzIWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jaHVua3NbMF0uYnl0ZUxlbmd0aCA9PT0gYnl0ZUNvdW50KSB7XG4gICAgICAgICAgICAvLyBzdXBlciBmYXN0IHBhdGgsIHByZWNpc2VseSBmaXJzdCBjaHVuayBtdXN0IGJlIHJldHVybmVkXG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1swXTtcbiAgICAgICAgICAgIHRoaXMuX2NodW5rcy5zaGlmdCgpO1xuICAgICAgICAgICAgdGhpcy5fdG90YWxMZW5ndGggLT0gYnl0ZUNvdW50O1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXNOYXRpdmUoY2h1bmspO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jaHVua3NbMF0uYnl0ZUxlbmd0aCA+IGJ5dGVDb3VudCkge1xuICAgICAgICAgICAgLy8gZmFzdCBwYXRoLCB0aGUgcmVhZGluZyBpcyBlbnRpcmVseSB3aXRoaW4gdGhlIGZpcnN0IGNodW5rXG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1swXTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuYXNOYXRpdmUoY2h1bmssIGJ5dGVDb3VudCk7XG4gICAgICAgICAgICB0aGlzLl9jaHVua3NbMF0gPSBjaHVuay5zbGljZShieXRlQ291bnQpO1xuICAgICAgICAgICAgdGhpcy5fdG90YWxMZW5ndGggLT0gYnl0ZUNvdW50O1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmFsbG9jTmF0aXZlKGJ5dGVDb3VudCk7XG4gICAgICAgIGxldCByZXN1bHRPZmZzZXQgPSAwO1xuICAgICAgICBsZXQgY2h1bmtJbmRleCA9IDA7XG4gICAgICAgIHdoaWxlIChieXRlQ291bnQgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1tjaHVua0luZGV4XTtcbiAgICAgICAgICAgIGlmIChjaHVuay5ieXRlTGVuZ3RoID4gYnl0ZUNvdW50KSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBjaHVuayB3aWxsIHN1cnZpdmVcbiAgICAgICAgICAgICAgICBjb25zdCBjaHVua1BhcnQgPSBjaHVuay5zbGljZSgwLCBieXRlQ291bnQpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5zZXQoY2h1bmtQYXJ0LCByZXN1bHRPZmZzZXQpO1xuICAgICAgICAgICAgICAgIHJlc3VsdE9mZnNldCArPSBieXRlQ291bnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2h1bmtzW2NodW5rSW5kZXhdID0gY2h1bmsuc2xpY2UoYnl0ZUNvdW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLl90b3RhbExlbmd0aCAtPSBieXRlQ291bnQ7XG4gICAgICAgICAgICAgICAgYnl0ZUNvdW50IC09IGJ5dGVDb3VudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHRoaXMgY2h1bmsgd2lsbCBiZSBlbnRpcmVseSByZWFkXG4gICAgICAgICAgICAgICAgcmVzdWx0LnNldChjaHVuaywgcmVzdWx0T2Zmc2V0KTtcbiAgICAgICAgICAgICAgICByZXN1bHRPZmZzZXQgKz0gY2h1bmsuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgICAgICB0aGlzLl9jaHVua3Muc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl90b3RhbExlbmd0aCAtPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgICAgIGJ5dGVDb3VudCAtPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VCdWZmZXIgPSBBYnN0cmFjdE1lc3NhZ2VCdWZmZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uID0gZXhwb3J0cy5Db25uZWN0aW9uT3B0aW9ucyA9IGV4cG9ydHMuTWVzc2FnZVN0cmF0ZWd5ID0gZXhwb3J0cy5DYW5jZWxsYXRpb25TdHJhdGVneSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gZXhwb3J0cy5JZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IGV4cG9ydHMuQ29ubmVjdGlvbkVycm9yID0gZXhwb3J0cy5Db25uZWN0aW9uRXJyb3JzID0gZXhwb3J0cy5Mb2dUcmFjZU5vdGlmaWNhdGlvbiA9IGV4cG9ydHMuU2V0VHJhY2VOb3RpZmljYXRpb24gPSBleHBvcnRzLlRyYWNlRm9ybWF0ID0gZXhwb3J0cy5UcmFjZVZhbHVlcyA9IGV4cG9ydHMuVHJhY2UgPSBleHBvcnRzLk51bGxMb2dnZXIgPSBleHBvcnRzLlByb2dyZXNzVHlwZSA9IGV4cG9ydHMuUHJvZ3Jlc3NUb2tlbiA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IG1lc3NhZ2VzXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlc1wiKTtcbmNvbnN0IGxpbmtlZE1hcF8xID0gcmVxdWlyZShcIi4vbGlua2VkTWFwXCIpO1xuY29uc3QgZXZlbnRzXzEgPSByZXF1aXJlKFwiLi9ldmVudHNcIik7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbnZhciBDYW5jZWxOb3RpZmljYXRpb247XG4oZnVuY3Rpb24gKENhbmNlbE5vdGlmaWNhdGlvbikge1xuICAgIENhbmNlbE5vdGlmaWNhdGlvbi50eXBlID0gbmV3IG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZSgnJC9jYW5jZWxSZXF1ZXN0Jyk7XG59KShDYW5jZWxOb3RpZmljYXRpb24gfHwgKENhbmNlbE5vdGlmaWNhdGlvbiA9IHt9KSk7XG52YXIgUHJvZ3Jlc3NUb2tlbjtcbihmdW5jdGlvbiAoUHJvZ3Jlc3NUb2tlbikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG4gICAgfVxuICAgIFByb2dyZXNzVG9rZW4uaXMgPSBpcztcbn0pKFByb2dyZXNzVG9rZW4gfHwgKGV4cG9ydHMuUHJvZ3Jlc3NUb2tlbiA9IFByb2dyZXNzVG9rZW4gPSB7fSkpO1xudmFyIFByb2dyZXNzTm90aWZpY2F0aW9uO1xuKGZ1bmN0aW9uIChQcm9ncmVzc05vdGlmaWNhdGlvbikge1xuICAgIFByb2dyZXNzTm90aWZpY2F0aW9uLnR5cGUgPSBuZXcgbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlKCckL3Byb2dyZXNzJyk7XG59KShQcm9ncmVzc05vdGlmaWNhdGlvbiB8fCAoUHJvZ3Jlc3NOb3RpZmljYXRpb24gPSB7fSkpO1xuY2xhc3MgUHJvZ3Jlc3NUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICB9XG59XG5leHBvcnRzLlByb2dyZXNzVHlwZSA9IFByb2dyZXNzVHlwZTtcbnZhciBTdGFyUmVxdWVzdEhhbmRsZXI7XG4oZnVuY3Rpb24gKFN0YXJSZXF1ZXN0SGFuZGxlcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBJcy5mdW5jKHZhbHVlKTtcbiAgICB9XG4gICAgU3RhclJlcXVlc3RIYW5kbGVyLmlzID0gaXM7XG59KShTdGFyUmVxdWVzdEhhbmRsZXIgfHwgKFN0YXJSZXF1ZXN0SGFuZGxlciA9IHt9KSk7XG5leHBvcnRzLk51bGxMb2dnZXIgPSBPYmplY3QuZnJlZXplKHtcbiAgICBlcnJvcjogKCkgPT4geyB9LFxuICAgIHdhcm46ICgpID0+IHsgfSxcbiAgICBpbmZvOiAoKSA9PiB7IH0sXG4gICAgbG9nOiAoKSA9PiB7IH1cbn0pO1xudmFyIFRyYWNlO1xuKGZ1bmN0aW9uIChUcmFjZSkge1xuICAgIFRyYWNlW1RyYWNlW1wiT2ZmXCJdID0gMF0gPSBcIk9mZlwiO1xuICAgIFRyYWNlW1RyYWNlW1wiTWVzc2FnZXNcIl0gPSAxXSA9IFwiTWVzc2FnZXNcIjtcbiAgICBUcmFjZVtUcmFjZVtcIkNvbXBhY3RcIl0gPSAyXSA9IFwiQ29tcGFjdFwiO1xuICAgIFRyYWNlW1RyYWNlW1wiVmVyYm9zZVwiXSA9IDNdID0gXCJWZXJib3NlXCI7XG59KShUcmFjZSB8fCAoZXhwb3J0cy5UcmFjZSA9IFRyYWNlID0ge30pKTtcbnZhciBUcmFjZVZhbHVlcztcbihmdW5jdGlvbiAoVHJhY2VWYWx1ZXMpIHtcbiAgICAvKipcbiAgICAgKiBUdXJuIHRyYWNpbmcgb2ZmLlxuICAgICAqL1xuICAgIFRyYWNlVmFsdWVzLk9mZiA9ICdvZmYnO1xuICAgIC8qKlxuICAgICAqIFRyYWNlIG1lc3NhZ2VzIG9ubHkuXG4gICAgICovXG4gICAgVHJhY2VWYWx1ZXMuTWVzc2FnZXMgPSAnbWVzc2FnZXMnO1xuICAgIC8qKlxuICAgICAqIENvbXBhY3QgbWVzc2FnZSB0cmFjaW5nLlxuICAgICAqL1xuICAgIFRyYWNlVmFsdWVzLkNvbXBhY3QgPSAnY29tcGFjdCc7XG4gICAgLyoqXG4gICAgICogVmVyYm9zZSBtZXNzYWdlIHRyYWNpbmcuXG4gICAgICovXG4gICAgVHJhY2VWYWx1ZXMuVmVyYm9zZSA9ICd2ZXJib3NlJztcbn0pKFRyYWNlVmFsdWVzIHx8IChleHBvcnRzLlRyYWNlVmFsdWVzID0gVHJhY2VWYWx1ZXMgPSB7fSkpO1xuKGZ1bmN0aW9uIChUcmFjZSkge1xuICAgIGZ1bmN0aW9uIGZyb21TdHJpbmcodmFsdWUpIHtcbiAgICAgICAgaWYgKCFJcy5zdHJpbmcodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gVHJhY2UuT2ZmO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSAnb2ZmJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gVHJhY2UuT2ZmO1xuICAgICAgICAgICAgY2FzZSAnbWVzc2FnZXMnOlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5NZXNzYWdlcztcbiAgICAgICAgICAgIGNhc2UgJ2NvbXBhY3QnOlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5Db21wYWN0O1xuICAgICAgICAgICAgY2FzZSAndmVyYm9zZSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFRyYWNlLlZlcmJvc2U7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5PZmY7XG4gICAgICAgIH1cbiAgICB9XG4gICAgVHJhY2UuZnJvbVN0cmluZyA9IGZyb21TdHJpbmc7XG4gICAgZnVuY3Rpb24gdG9TdHJpbmcodmFsdWUpIHtcbiAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5PZmY6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdvZmYnO1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5NZXNzYWdlczpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ21lc3NhZ2VzJztcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuQ29tcGFjdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2NvbXBhY3QnO1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5WZXJib3NlOlxuICAgICAgICAgICAgICAgIHJldHVybiAndmVyYm9zZSc7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAnb2ZmJztcbiAgICAgICAgfVxuICAgIH1cbiAgICBUcmFjZS50b1N0cmluZyA9IHRvU3RyaW5nO1xufSkoVHJhY2UgfHwgKGV4cG9ydHMuVHJhY2UgPSBUcmFjZSA9IHt9KSk7XG52YXIgVHJhY2VGb3JtYXQ7XG4oZnVuY3Rpb24gKFRyYWNlRm9ybWF0KSB7XG4gICAgVHJhY2VGb3JtYXRbXCJUZXh0XCJdID0gXCJ0ZXh0XCI7XG4gICAgVHJhY2VGb3JtYXRbXCJKU09OXCJdID0gXCJqc29uXCI7XG59KShUcmFjZUZvcm1hdCB8fCAoZXhwb3J0cy5UcmFjZUZvcm1hdCA9IFRyYWNlRm9ybWF0ID0ge30pKTtcbihmdW5jdGlvbiAoVHJhY2VGb3JtYXQpIHtcbiAgICBmdW5jdGlvbiBmcm9tU3RyaW5nKHZhbHVlKSB7XG4gICAgICAgIGlmICghSXMuc3RyaW5nKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIFRyYWNlRm9ybWF0LlRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAodmFsdWUgPT09ICdqc29uJykge1xuICAgICAgICAgICAgcmV0dXJuIFRyYWNlRm9ybWF0LkpTT047XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gVHJhY2VGb3JtYXQuVGV4dDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBUcmFjZUZvcm1hdC5mcm9tU3RyaW5nID0gZnJvbVN0cmluZztcbn0pKFRyYWNlRm9ybWF0IHx8IChleHBvcnRzLlRyYWNlRm9ybWF0ID0gVHJhY2VGb3JtYXQgPSB7fSkpO1xudmFyIFNldFRyYWNlTm90aWZpY2F0aW9uO1xuKGZ1bmN0aW9uIChTZXRUcmFjZU5vdGlmaWNhdGlvbikge1xuICAgIFNldFRyYWNlTm90aWZpY2F0aW9uLnR5cGUgPSBuZXcgbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlKCckL3NldFRyYWNlJyk7XG59KShTZXRUcmFjZU5vdGlmaWNhdGlvbiB8fCAoZXhwb3J0cy5TZXRUcmFjZU5vdGlmaWNhdGlvbiA9IFNldFRyYWNlTm90aWZpY2F0aW9uID0ge30pKTtcbnZhciBMb2dUcmFjZU5vdGlmaWNhdGlvbjtcbihmdW5jdGlvbiAoTG9nVHJhY2VOb3RpZmljYXRpb24pIHtcbiAgICBMb2dUcmFjZU5vdGlmaWNhdGlvbi50eXBlID0gbmV3IG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZSgnJC9sb2dUcmFjZScpO1xufSkoTG9nVHJhY2VOb3RpZmljYXRpb24gfHwgKGV4cG9ydHMuTG9nVHJhY2VOb3RpZmljYXRpb24gPSBMb2dUcmFjZU5vdGlmaWNhdGlvbiA9IHt9KSk7XG52YXIgQ29ubmVjdGlvbkVycm9ycztcbihmdW5jdGlvbiAoQ29ubmVjdGlvbkVycm9ycykge1xuICAgIC8qKlxuICAgICAqIFRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZC5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uRXJyb3JzW0Nvbm5lY3Rpb25FcnJvcnNbXCJDbG9zZWRcIl0gPSAxXSA9IFwiQ2xvc2VkXCI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gZ290IGRpc3Bvc2VkLlxuICAgICAqL1xuICAgIENvbm5lY3Rpb25FcnJvcnNbQ29ubmVjdGlvbkVycm9yc1tcIkRpc3Bvc2VkXCJdID0gMl0gPSBcIkRpc3Bvc2VkXCI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBpbiBsaXN0ZW5pbmcgbW9kZS5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uRXJyb3JzW0Nvbm5lY3Rpb25FcnJvcnNbXCJBbHJlYWR5TGlzdGVuaW5nXCJdID0gM10gPSBcIkFscmVhZHlMaXN0ZW5pbmdcIjtcbn0pKENvbm5lY3Rpb25FcnJvcnMgfHwgKGV4cG9ydHMuQ29ubmVjdGlvbkVycm9ycyA9IENvbm5lY3Rpb25FcnJvcnMgPSB7fSkpO1xuY2xhc3MgQ29ubmVjdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNvZGUsIG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBDb25uZWN0aW9uRXJyb3IucHJvdG90eXBlKTtcbiAgICB9XG59XG5leHBvcnRzLkNvbm5lY3Rpb25FcnJvciA9IENvbm5lY3Rpb25FcnJvcjtcbnZhciBDb25uZWN0aW9uU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENvbm5lY3Rpb25TdHJhdGVneSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNhbmNlbFVuZGlzcGF0Y2hlZCk7XG4gICAgfVxuICAgIENvbm5lY3Rpb25TdHJhdGVneS5pcyA9IGlzO1xufSkoQ29ubmVjdGlvblN0cmF0ZWd5IHx8IChleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IENvbm5lY3Rpb25TdHJhdGVneSA9IHt9KSk7XG52YXIgSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5O1xuKGZ1bmN0aW9uIChJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiAoY2FuZGlkYXRlLmtpbmQgPT09IHVuZGVmaW5lZCB8fCBjYW5kaWRhdGUua2luZCA9PT0gJ2lkJykgJiYgSXMuZnVuYyhjYW5kaWRhdGUuY3JlYXRlQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UpICYmIChjYW5kaWRhdGUuZGlzcG9zZSA9PT0gdW5kZWZpbmVkIHx8IElzLmZ1bmMoY2FuZGlkYXRlLmRpc3Bvc2UpKTtcbiAgICB9XG4gICAgSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzID0gaXM7XG59KShJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgfHwgKGV4cG9ydHMuSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0ge30pKTtcbnZhciBSZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneTtcbihmdW5jdGlvbiAoUmVxdWVzdENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBjYW5kaWRhdGUua2luZCA9PT0gJ3JlcXVlc3QnICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKSAmJiAoY2FuZGlkYXRlLmRpc3Bvc2UgPT09IHVuZGVmaW5lZCB8fCBJcy5mdW5jKGNhbmRpZGF0ZS5kaXNwb3NlKSk7XG4gICAgfVxuICAgIFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzID0gaXM7XG59KShSZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSB8fCAoZXhwb3J0cy5SZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0ge30pKTtcbnZhciBDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5O1xuKGZ1bmN0aW9uIChDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5NZXNzYWdlID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKF8pIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgY2FuY2VsbGF0aW9uXzEuQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UoKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kuaXModmFsdWUpIHx8IFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKHZhbHVlKTtcbiAgICB9XG4gICAgQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5pcyA9IGlzO1xufSkoQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSB8fCAoZXhwb3J0cy5DYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IHt9KSk7XG52YXIgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENhbmNlbGxhdGlvblNlbmRlclN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kuTWVzc2FnZSA9IE9iamVjdC5mcmVlemUoe1xuICAgICAgICBzZW5kQ2FuY2VsbGF0aW9uKGNvbm4sIGlkKSB7XG4gICAgICAgICAgICByZXR1cm4gY29ubi5zZW5kTm90aWZpY2F0aW9uKENhbmNlbE5vdGlmaWNhdGlvbi50eXBlLCB7IGlkIH0pO1xuICAgICAgICB9LFxuICAgICAgICBjbGVhbnVwKF8pIHsgfVxuICAgIH0pO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLnNlbmRDYW5jZWxsYXRpb24pICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNsZWFudXApO1xuICAgIH1cbiAgICBDYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneS5pcyA9IGlzO1xufSkoQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgfHwgKGV4cG9ydHMuQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgPSBDYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneSA9IHt9KSk7XG52YXIgQ2FuY2VsbGF0aW9uU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENhbmNlbGxhdGlvblN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uU3RyYXRlZ3kuTWVzc2FnZSA9IE9iamVjdC5mcmVlemUoe1xuICAgICAgICByZWNlaXZlcjogQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5NZXNzYWdlLFxuICAgICAgICBzZW5kZXI6IENhbmNlbGxhdGlvblNlbmRlclN0cmF0ZWd5Lk1lc3NhZ2VcbiAgICB9KTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKGNhbmRpZGF0ZS5yZWNlaXZlcikgJiYgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kuaXMoY2FuZGlkYXRlLnNlbmRlcik7XG4gICAgfVxuICAgIENhbmNlbGxhdGlvblN0cmF0ZWd5LmlzID0gaXM7XG59KShDYW5jZWxsYXRpb25TdHJhdGVneSB8fCAoZXhwb3J0cy5DYW5jZWxsYXRpb25TdHJhdGVneSA9IENhbmNlbGxhdGlvblN0cmF0ZWd5ID0ge30pKTtcbnZhciBNZXNzYWdlU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKE1lc3NhZ2VTdHJhdGVneSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLmhhbmRsZU1lc3NhZ2UpO1xuICAgIH1cbiAgICBNZXNzYWdlU3RyYXRlZ3kuaXMgPSBpcztcbn0pKE1lc3NhZ2VTdHJhdGVneSB8fCAoZXhwb3J0cy5NZXNzYWdlU3RyYXRlZ3kgPSBNZXNzYWdlU3RyYXRlZ3kgPSB7fSkpO1xudmFyIENvbm5lY3Rpb25PcHRpb25zO1xuKGZ1bmN0aW9uIChDb25uZWN0aW9uT3B0aW9ucykge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIChDYW5jZWxsYXRpb25TdHJhdGVneS5pcyhjYW5kaWRhdGUuY2FuY2VsbGF0aW9uU3RyYXRlZ3kpIHx8IENvbm5lY3Rpb25TdHJhdGVneS5pcyhjYW5kaWRhdGUuY29ubmVjdGlvblN0cmF0ZWd5KSB8fCBNZXNzYWdlU3RyYXRlZ3kuaXMoY2FuZGlkYXRlLm1lc3NhZ2VTdHJhdGVneSkpO1xuICAgIH1cbiAgICBDb25uZWN0aW9uT3B0aW9ucy5pcyA9IGlzO1xufSkoQ29ubmVjdGlvbk9wdGlvbnMgfHwgKGV4cG9ydHMuQ29ubmVjdGlvbk9wdGlvbnMgPSBDb25uZWN0aW9uT3B0aW9ucyA9IHt9KSk7XG52YXIgQ29ubmVjdGlvblN0YXRlO1xuKGZ1bmN0aW9uIChDb25uZWN0aW9uU3RhdGUpIHtcbiAgICBDb25uZWN0aW9uU3RhdGVbQ29ubmVjdGlvblN0YXRlW1wiTmV3XCJdID0gMV0gPSBcIk5ld1wiO1xuICAgIENvbm5lY3Rpb25TdGF0ZVtDb25uZWN0aW9uU3RhdGVbXCJMaXN0ZW5pbmdcIl0gPSAyXSA9IFwiTGlzdGVuaW5nXCI7XG4gICAgQ29ubmVjdGlvblN0YXRlW0Nvbm5lY3Rpb25TdGF0ZVtcIkNsb3NlZFwiXSA9IDNdID0gXCJDbG9zZWRcIjtcbiAgICBDb25uZWN0aW9uU3RhdGVbQ29ubmVjdGlvblN0YXRlW1wiRGlzcG9zZWRcIl0gPSA0XSA9IFwiRGlzcG9zZWRcIjtcbn0pKENvbm5lY3Rpb25TdGF0ZSB8fCAoQ29ubmVjdGlvblN0YXRlID0ge30pKTtcbmZ1bmN0aW9uIGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uKG1lc3NhZ2VSZWFkZXIsIG1lc3NhZ2VXcml0ZXIsIF9sb2dnZXIsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBsb2dnZXIgPSBfbG9nZ2VyICE9PSB1bmRlZmluZWQgPyBfbG9nZ2VyIDogZXhwb3J0cy5OdWxsTG9nZ2VyO1xuICAgIGxldCBzZXF1ZW5jZU51bWJlciA9IDA7XG4gICAgbGV0IG5vdGlmaWNhdGlvblNlcXVlbmNlTnVtYmVyID0gMDtcbiAgICBsZXQgdW5rbm93blJlc3BvbnNlU2VxdWVuY2VOdW1iZXIgPSAwO1xuICAgIGNvbnN0IHZlcnNpb24gPSAnMi4wJztcbiAgICBsZXQgc3RhclJlcXVlc3RIYW5kbGVyID0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlcXVlc3RIYW5kbGVycyA9IG5ldyBNYXAoKTtcbiAgICBsZXQgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgY29uc3Qgbm90aWZpY2F0aW9uSGFuZGxlcnMgPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgcHJvZ3Jlc3NIYW5kbGVycyA9IG5ldyBNYXAoKTtcbiAgICBsZXQgdGltZXI7XG4gICAgbGV0IG1lc3NhZ2VRdWV1ZSA9IG5ldyBsaW5rZWRNYXBfMS5MaW5rZWRNYXAoKTtcbiAgICBsZXQgcmVzcG9uc2VQcm9taXNlcyA9IG5ldyBNYXAoKTtcbiAgICBsZXQga25vd25DYW5jZWxlZFJlcXVlc3RzID0gbmV3IFNldCgpO1xuICAgIGxldCByZXF1ZXN0VG9rZW5zID0gbmV3IE1hcCgpO1xuICAgIGxldCB0cmFjZSA9IFRyYWNlLk9mZjtcbiAgICBsZXQgdHJhY2VGb3JtYXQgPSBUcmFjZUZvcm1hdC5UZXh0O1xuICAgIGxldCB0cmFjZXI7XG4gICAgbGV0IHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLk5ldztcbiAgICBjb25zdCBlcnJvckVtaXR0ZXIgPSBuZXcgZXZlbnRzXzEuRW1pdHRlcigpO1xuICAgIGNvbnN0IGNsb3NlRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgdW5oYW5kbGVkTm90aWZpY2F0aW9uRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgdW5oYW5kbGVkUHJvZ3Jlc3NFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICBjb25zdCBkaXNwb3NlRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgY2FuY2VsbGF0aW9uU3RyYXRlZ3kgPSAob3B0aW9ucyAmJiBvcHRpb25zLmNhbmNlbGxhdGlvblN0cmF0ZWd5KSA/IG9wdGlvbnMuY2FuY2VsbGF0aW9uU3RyYXRlZ3kgOiBDYW5jZWxsYXRpb25TdHJhdGVneS5NZXNzYWdlO1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlcXVlc3RRdWV1ZUtleShpZCkge1xuICAgICAgICBpZiAoaWQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuJ3Qgc2VuZCByZXF1ZXN0cyB3aXRoIGlkIG51bGwgc2luY2UgdGhlIHJlc3BvbnNlIGNhbid0IGJlIGNvcnJlbGF0ZWQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdyZXEtJyArIGlkLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlc3BvbnNlUXVldWVLZXkoaWQpIHtcbiAgICAgICAgaWYgKGlkID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3Jlcy11bmtub3duLScgKyAoKyt1bmtub3duUmVzcG9uc2VTZXF1ZW5jZU51bWJlcikudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAncmVzLScgKyBpZC50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZU5vdGlmaWNhdGlvblF1ZXVlS2V5KCkge1xuICAgICAgICByZXR1cm4gJ25vdC0nICsgKCsrbm90aWZpY2F0aW9uU2VxdWVuY2VOdW1iZXIpLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFkZE1lc3NhZ2VUb1F1ZXVlKHF1ZXVlLCBtZXNzYWdlKSB7XG4gICAgICAgIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXF1ZXN0KG1lc3NhZ2UpKSB7XG4gICAgICAgICAgICBxdWV1ZS5zZXQoY3JlYXRlUmVxdWVzdFF1ZXVlS2V5KG1lc3NhZ2UuaWQpLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXNwb25zZShtZXNzYWdlKSkge1xuICAgICAgICAgICAgcXVldWUuc2V0KGNyZWF0ZVJlc3BvbnNlUXVldWVLZXkobWVzc2FnZS5pZCksIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcXVldWUuc2V0KGNyZWF0ZU5vdGlmaWNhdGlvblF1ZXVlS2V5KCksIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNhbmNlbFVuZGlzcGF0Y2hlZChfbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0xpc3RlbmluZygpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlID09PSBDb25uZWN0aW9uU3RhdGUuTGlzdGVuaW5nO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0Nsb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlID09PSBDb25uZWN0aW9uU3RhdGUuQ2xvc2VkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0Rpc3Bvc2VkKCkge1xuICAgICAgICByZXR1cm4gc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5EaXNwb3NlZDtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2xvc2VIYW5kbGVyKCkge1xuICAgICAgICBpZiAoc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5OZXcgfHwgc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5MaXN0ZW5pbmcpIHtcbiAgICAgICAgICAgIHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLkNsb3NlZDtcbiAgICAgICAgICAgIGNsb3NlRW1pdHRlci5maXJlKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlIGNvbm5lY3Rpb24gaXMgZGlzcG9zZWQgZG9uJ3Qgc2VudCBjbG9zZSBldmVudHMuXG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlYWRFcnJvckhhbmRsZXIoZXJyb3IpIHtcbiAgICAgICAgZXJyb3JFbWl0dGVyLmZpcmUoW2Vycm9yLCB1bmRlZmluZWQsIHVuZGVmaW5lZF0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiB3cml0ZUVycm9ySGFuZGxlcihkYXRhKSB7XG4gICAgICAgIGVycm9yRW1pdHRlci5maXJlKGRhdGEpO1xuICAgIH1cbiAgICBtZXNzYWdlUmVhZGVyLm9uQ2xvc2UoY2xvc2VIYW5kbGVyKTtcbiAgICBtZXNzYWdlUmVhZGVyLm9uRXJyb3IocmVhZEVycm9ySGFuZGxlcik7XG4gICAgbWVzc2FnZVdyaXRlci5vbkNsb3NlKGNsb3NlSGFuZGxlcik7XG4gICAgbWVzc2FnZVdyaXRlci5vbkVycm9yKHdyaXRlRXJyb3JIYW5kbGVyKTtcbiAgICBmdW5jdGlvbiB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCkge1xuICAgICAgICBpZiAodGltZXIgfHwgbWVzc2FnZVF1ZXVlLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aW1lciA9ICgwLCByYWxfMS5kZWZhdWx0KSgpLnRpbWVyLnNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICAgICAgICB0aW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHByb2Nlc3NNZXNzYWdlUXVldWUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGhhbmRsZU1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICBpZiAobWVzc2FnZXNfMS5NZXNzYWdlLmlzUmVxdWVzdChtZXNzYWdlKSkge1xuICAgICAgICAgICAgaGFuZGxlUmVxdWVzdChtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNOb3RpZmljYXRpb24obWVzc2FnZSkpIHtcbiAgICAgICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvbihtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXNwb25zZShtZXNzYWdlKSkge1xuICAgICAgICAgICAgaGFuZGxlUmVzcG9uc2UobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBoYW5kbGVJbnZhbGlkTWVzc2FnZShtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBwcm9jZXNzTWVzc2FnZVF1ZXVlKCkge1xuICAgICAgICBpZiAobWVzc2FnZVF1ZXVlLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXNzYWdlID0gbWVzc2FnZVF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlU3RyYXRlZ3kgPSBvcHRpb25zPy5tZXNzYWdlU3RyYXRlZ3k7XG4gICAgICAgICAgICBpZiAoTWVzc2FnZVN0cmF0ZWd5LmlzKG1lc3NhZ2VTdHJhdGVneSkpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlU3RyYXRlZ3kuaGFuZGxlTWVzc2FnZShtZXNzYWdlLCBoYW5kbGVNZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGhhbmRsZU1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgY2FsbGJhY2sgPSAobWVzc2FnZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2UgaGF2ZSByZWNlaXZlZCBhIGNhbmNlbGxhdGlvbiBtZXNzYWdlLiBDaGVjayBpZiB0aGUgbWVzc2FnZSBpcyBzdGlsbCBpbiB0aGUgcXVldWVcbiAgICAgICAgICAgIC8vIGFuZCBjYW5jZWwgaXQgaWYgYWxsb3dlZCB0byBkbyBzby5cbiAgICAgICAgICAgIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNOb3RpZmljYXRpb24obWVzc2FnZSkgJiYgbWVzc2FnZS5tZXRob2QgPT09IENhbmNlbE5vdGlmaWNhdGlvbi50eXBlLm1ldGhvZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbmNlbElkID0gbWVzc2FnZS5wYXJhbXMuaWQ7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gY3JlYXRlUmVxdWVzdFF1ZXVlS2V5KGNhbmNlbElkKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0b0NhbmNlbCA9IG1lc3NhZ2VRdWV1ZS5nZXQoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZXNfMS5NZXNzYWdlLmlzUmVxdWVzdCh0b0NhbmNlbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyYXRlZ3kgPSBvcHRpb25zPy5jb25uZWN0aW9uU3RyYXRlZ3k7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gKHN0cmF0ZWd5ICYmIHN0cmF0ZWd5LmNhbmNlbFVuZGlzcGF0Y2hlZCkgPyBzdHJhdGVneS5jYW5jZWxVbmRpc3BhdGNoZWQodG9DYW5jZWwsIGNhbmNlbFVuZGlzcGF0Y2hlZCkgOiBjYW5jZWxVbmRpc3BhdGNoZWQodG9DYW5jZWwpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgJiYgKHJlc3BvbnNlLmVycm9yICE9PSB1bmRlZmluZWQgfHwgcmVzcG9uc2UucmVzdWx0ICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUXVldWUuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLmRlbGV0ZShjYW5jZWxJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5pZCA9IHRvQ2FuY2VsLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VTZW5kaW5nUmVzcG9uc2UocmVzcG9uc2UsIG1lc3NhZ2UubWV0aG9kLCBEYXRlLm5vdygpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUocmVzcG9uc2UpLmNhdGNoKCgpID0+IGxvZ2dlci5lcnJvcihgU2VuZGluZyByZXNwb25zZSBmb3IgY2FuY2VsZWQgbWVzc2FnZSBmYWlsZWQuYCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGNhbmNlbGxhdGlvblRva2VuID0gcmVxdWVzdFRva2Vucy5nZXQoY2FuY2VsSWQpO1xuICAgICAgICAgICAgICAgIC8vIFRoZSByZXF1ZXN0IGlzIGFscmVhZHkgcnVubmluZy4gQ2FuY2VsIHRoZSB0b2tlblxuICAgICAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbmNlbGxhdGlvblRva2VuLmNhbmNlbCgpO1xuICAgICAgICAgICAgICAgICAgICB0cmFjZVJlY2VpdmVkTm90aWZpY2F0aW9uKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZW1lbWJlciB0aGUgY2FuY2VsIGJ1dCBzdGlsbCBxdWV1ZSB0aGUgbWVzc2FnZSB0b1xuICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbiB1cCBzdGF0ZSBpbiBwcm9jZXNzIG1lc3NhZ2UuXG4gICAgICAgICAgICAgICAgICAgIGtub3duQ2FuY2VsZWRSZXF1ZXN0cy5hZGQoY2FuY2VsSWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFkZE1lc3NhZ2VUb1F1ZXVlKG1lc3NhZ2VRdWV1ZSwgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGZ1bmN0aW9uIGhhbmRsZVJlcXVlc3QocmVxdWVzdE1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgLy8gd2UgcmV0dXJuIGhlcmUgc2lsZW50bHkgc2luY2Ugd2UgZmlyZWQgYW4gZXZlbnQgd2hlbiB0aGVcbiAgICAgICAgICAgIC8vIGNvbm5lY3Rpb24gZ290IGRpc3Bvc2VkLlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHJlcGx5KHJlc3VsdE9yRXJyb3IsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgaWQ6IHJlcXVlc3RNZXNzYWdlLmlkXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKHJlc3VsdE9yRXJyb3IgaW5zdGFuY2VvZiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlLmVycm9yID0gcmVzdWx0T3JFcnJvci50b0pzb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVzdWx0ID0gcmVzdWx0T3JFcnJvciA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHJlc3VsdE9yRXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cmFjZVNlbmRpbmdSZXNwb25zZShtZXNzYWdlLCBtZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICBtZXNzYWdlV3JpdGVyLndyaXRlKG1lc3NhZ2UpLmNhdGNoKCgpID0+IGxvZ2dlci5lcnJvcihgU2VuZGluZyByZXNwb25zZSBmYWlsZWQuYCkpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHJlcGx5RXJyb3IoZXJyb3IsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgaWQ6IHJlcXVlc3RNZXNzYWdlLmlkLFxuICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvci50b0pzb24oKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUobWVzc2FnZSkuY2F0Y2goKCkgPT4gbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlc3BvbnNlIGZhaWxlZC5gKSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gcmVwbHlTdWNjZXNzKHJlc3VsdCwgbWV0aG9kLCBzdGFydFRpbWUpIHtcbiAgICAgICAgICAgIC8vIFRoZSBKU09OIFJQQyBkZWZpbmVzIHRoYXQgYSByZXNwb25zZSBtdXN0IGVpdGhlciBoYXZlIGEgcmVzdWx0IG9yIGFuIGVycm9yXG4gICAgICAgICAgICAvLyBTbyB3ZSBjYW4ndCB0cmVhdCB1bmRlZmluZWQgYXMgYSB2YWxpZCByZXNwb25zZSByZXN1bHQuXG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgICAgICAgICAgICBqc29ucnBjOiB2ZXJzaW9uLFxuICAgICAgICAgICAgICAgIGlkOiByZXF1ZXN0TWVzc2FnZS5pZCxcbiAgICAgICAgICAgICAgICByZXN1bHQ6IHJlc3VsdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUobWVzc2FnZSkuY2F0Y2goKCkgPT4gbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlc3BvbnNlIGZhaWxlZC5gKSk7XG4gICAgICAgIH1cbiAgICAgICAgdHJhY2VSZWNlaXZlZFJlcXVlc3QocmVxdWVzdE1lc3NhZ2UpO1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gcmVxdWVzdEhhbmRsZXJzLmdldChyZXF1ZXN0TWVzc2FnZS5tZXRob2QpO1xuICAgICAgICBsZXQgdHlwZTtcbiAgICAgICAgbGV0IHJlcXVlc3RIYW5kbGVyO1xuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgdHlwZSA9IGVsZW1lbnQudHlwZTtcbiAgICAgICAgICAgIHJlcXVlc3RIYW5kbGVyID0gZWxlbWVudC5oYW5kbGVyO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIGlmIChyZXF1ZXN0SGFuZGxlciB8fCBzdGFyUmVxdWVzdEhhbmRsZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHRva2VuS2V5ID0gcmVxdWVzdE1lc3NhZ2UuaWQgPz8gU3RyaW5nKERhdGUubm93KCkpOyAvL1xuICAgICAgICAgICAgY29uc3QgY2FuY2VsbGF0aW9uU291cmNlID0gSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKGNhbmNlbGxhdGlvblN0cmF0ZWd5LnJlY2VpdmVyKVxuICAgICAgICAgICAgICAgID8gY2FuY2VsbGF0aW9uU3RyYXRlZ3kucmVjZWl2ZXIuY3JlYXRlQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UodG9rZW5LZXkpXG4gICAgICAgICAgICAgICAgOiBjYW5jZWxsYXRpb25TdHJhdGVneS5yZWNlaXZlci5jcmVhdGVDYW5jZWxsYXRpb25Ub2tlblNvdXJjZShyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICBpZiAocmVxdWVzdE1lc3NhZ2UuaWQgIT09IG51bGwgJiYga25vd25DYW5jZWxlZFJlcXVlc3RzLmhhcyhyZXF1ZXN0TWVzc2FnZS5pZCkpIHtcbiAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25Tb3VyY2UuY2FuY2VsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVxdWVzdE1lc3NhZ2UuaWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLnNldCh0b2tlbktleSwgY2FuY2VsbGF0aW9uU291cmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IGhhbmRsZXJSZXN1bHQ7XG4gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0TWVzc2FnZS5wYXJhbXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlLm51bWJlck9mUGFyYW1zICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1zLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyAke3R5cGUubnVtYmVyT2ZQYXJhbXN9IHBhcmFtcyBidXQgcmVjZWl2ZWQgbm9uZS5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJSZXN1bHQgPSByZXF1ZXN0SGFuZGxlcihjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVxdWVzdE1lc3NhZ2UucGFyYW1zKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlLnBhcmFtZXRlclN0cnVjdHVyZXMgPT09IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseUVycm9yKG5ldyBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IobWVzc2FnZXNfMS5FcnJvckNvZGVzLkludmFsaWRQYXJhbXMsIGBSZXF1ZXN0ICR7cmVxdWVzdE1lc3NhZ2UubWV0aG9kfSBkZWZpbmVzIHBhcmFtZXRlcnMgYnkgbmFtZSBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBwb3NpdGlvbmApLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlclJlc3VsdCA9IHJlcXVlc3RIYW5kbGVyKC4uLnJlcXVlc3RNZXNzYWdlLnBhcmFtcywgY2FuY2VsbGF0aW9uU291cmNlLnRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS5wYXJhbWV0ZXJTdHJ1Y3R1cmVzID09PSBtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW52YWxpZFBhcmFtcywgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGRlZmluZXMgcGFyYW1ldGVycyBieSBwb3NpdGlvbiBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBuYW1lYCksIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gcmVxdWVzdEhhbmRsZXIocmVxdWVzdE1lc3NhZ2UucGFyYW1zLCBjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0YXJSZXF1ZXN0SGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gc3RhclJlcXVlc3RIYW5kbGVyKHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgcmVxdWVzdE1lc3NhZ2UucGFyYW1zLCBjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBwcm9taXNlID0gaGFuZGxlclJlc3VsdDtcbiAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZXJSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFRva2Vucy5kZWxldGUodG9rZW5LZXkpO1xuICAgICAgICAgICAgICAgICAgICByZXBseVN1Y2Nlc3MoaGFuZGxlclJlc3VsdCwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwcm9taXNlLnRoZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS50aGVuKChyZXN1bHRPckVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLmRlbGV0ZSh0b2tlbktleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXBseShyZXN1bHRPckVycm9yLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IoZXJyb3IsIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVycm9yICYmIElzLnN0cmluZyhlcnJvci5tZXNzYWdlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGZhaWxlZCB3aXRoIG1lc3NhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZmFpbGVkIHVuZXhwZWN0ZWRseSB3aXRob3V0IHByb3ZpZGluZyBhbnkgZGV0YWlscy5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHkoaGFuZGxlclJlc3VsdCwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHkoZXJyb3IsIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZXJyb3IgJiYgSXMuc3RyaW5nKGVycm9yLm1lc3NhZ2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGZhaWxlZCB3aXRoIG1lc3NhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZmFpbGVkIHVuZXhwZWN0ZWRseSB3aXRob3V0IHByb3ZpZGluZyBhbnkgZGV0YWlscy5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuTWV0aG9kTm90Rm91bmQsIGBVbmhhbmRsZWQgbWV0aG9kICR7cmVxdWVzdE1lc3NhZ2UubWV0aG9kfWApLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlUmVzcG9uc2UocmVzcG9uc2VNZXNzYWdlKSB7XG4gICAgICAgIGlmIChpc0Rpc3Bvc2VkKCkpIHtcbiAgICAgICAgICAgIC8vIFNlZSBoYW5kbGUgcmVxdWVzdC5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzcG9uc2VNZXNzYWdlLmlkID09PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VNZXNzYWdlLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBSZWNlaXZlZCByZXNwb25zZSBtZXNzYWdlIHdpdGhvdXQgaWQ6IEVycm9yIGlzOiBcXG4ke0pTT04uc3RyaW5naWZ5KHJlc3BvbnNlTWVzc2FnZS5lcnJvciwgdW5kZWZpbmVkLCA0KX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgUmVjZWl2ZWQgcmVzcG9uc2UgbWVzc2FnZSB3aXRob3V0IGlkLiBObyBmdXJ0aGVyIGVycm9yIGluZm9ybWF0aW9uIHByb3ZpZGVkLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gcmVzcG9uc2VNZXNzYWdlLmlkO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VQcm9taXNlID0gcmVzcG9uc2VQcm9taXNlcy5nZXQoa2V5KTtcbiAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWRSZXNwb25zZShyZXNwb25zZU1lc3NhZ2UsIHJlc3BvbnNlUHJvbWlzZSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VQcm9taXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2VzLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZU1lc3NhZ2UuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gcmVzcG9uc2VNZXNzYWdlLmVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlLnJlamVjdChuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKGVycm9yLmNvZGUsIGVycm9yLm1lc3NhZ2UsIGVycm9yLmRhdGEpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXNwb25zZU1lc3NhZ2UucmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlTWVzc2FnZS5yZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgbmV2ZXIgaGFwcGVuLicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IubWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBSZXNwb25zZSBoYW5kbGVyICcke3Jlc3BvbnNlUHJvbWlzZS5tZXRob2R9JyBmYWlsZWQgd2l0aCBtZXNzYWdlOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYFJlc3BvbnNlIGhhbmRsZXIgJyR7cmVzcG9uc2VQcm9taXNlLm1ldGhvZH0nIGZhaWxlZCB1bmV4cGVjdGVkbHkuYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlTm90aWZpY2F0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgLy8gU2VlIGhhbmRsZSByZXF1ZXN0LlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0eXBlID0gdW5kZWZpbmVkO1xuICAgICAgICBsZXQgbm90aWZpY2F0aW9uSGFuZGxlcjtcbiAgICAgICAgaWYgKG1lc3NhZ2UubWV0aG9kID09PSBDYW5jZWxOb3RpZmljYXRpb24udHlwZS5tZXRob2QpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhbmNlbElkID0gbWVzc2FnZS5wYXJhbXMuaWQ7XG4gICAgICAgICAgICBrbm93bkNhbmNlbGVkUmVxdWVzdHMuZGVsZXRlKGNhbmNlbElkKTtcbiAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWROb3RpZmljYXRpb24obWVzc2FnZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gbm90aWZpY2F0aW9uSGFuZGxlcnMuZ2V0KG1lc3NhZ2UubWV0aG9kKTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uSGFuZGxlciA9IGVsZW1lbnQuaGFuZGxlcjtcbiAgICAgICAgICAgICAgICB0eXBlID0gZWxlbWVudC50eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChub3RpZmljYXRpb25IYW5kbGVyIHx8IHN0YXJOb3RpZmljYXRpb25IYW5kbGVyKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWROb3RpZmljYXRpb24obWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgaWYgKG5vdGlmaWNhdGlvbkhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UucGFyYW1zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5udW1iZXJPZlBhcmFtcyAhPT0gMCAmJiB0eXBlLnBhcmFtZXRlclN0cnVjdHVyZXMgIT09IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBOb3RpZmljYXRpb24gJHttZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyAke3R5cGUubnVtYmVyT2ZQYXJhbXN9IHBhcmFtcyBidXQgcmVjZWl2ZWQgbm9uZS5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShtZXNzYWdlLnBhcmFtcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGFyZSBKU09OLVJQQyBsaWJyYXJpZXMgdGhhdCBzZW5kIHByb2dyZXNzIG1lc3NhZ2UgYXMgcG9zaXRpb25hbCBwYXJhbXMgYWx0aG91Z2hcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpZmllZCBhcyBuYW1lZC4gU28gY29udmVydCB0aGVtIGlmIHRoaXMgaXMgdGhlIGNhc2UuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBtZXNzYWdlLnBhcmFtcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLm1ldGhvZCA9PT0gUHJvZ3Jlc3NOb3RpZmljYXRpb24udHlwZS5tZXRob2QgJiYgcGFyYW1zLmxlbmd0aCA9PT0gMiAmJiBQcm9ncmVzc1Rva2VuLmlzKHBhcmFtc1swXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKHsgdG9rZW46IHBhcmFtc1swXSwgdmFsdWU6IHBhcmFtc1sxXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUucGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBOb3RpZmljYXRpb24gJHttZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyBwYXJhbWV0ZXJzIGJ5IG5hbWUgYnV0IHJlY2VpdmVkIHBhcmFtZXRlcnMgYnkgcG9zaXRpb25gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5udW1iZXJPZlBhcmFtcyAhPT0gbWVzc2FnZS5wYXJhbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYE5vdGlmaWNhdGlvbiAke21lc3NhZ2UubWV0aG9kfSBkZWZpbmVzICR7dHlwZS5udW1iZXJPZlBhcmFtc30gcGFyYW1zIGJ1dCByZWNlaXZlZCAke3BhcmFtcy5sZW5ndGh9IGFyZ3VtZW50c2ApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXIoLi4ucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS5wYXJhbWV0ZXJTdHJ1Y3R1cmVzID09PSBtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgTm90aWZpY2F0aW9uICR7bWVzc2FnZS5tZXRob2R9IGRlZmluZXMgcGFyYW1ldGVycyBieSBwb3NpdGlvbiBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBuYW1lYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKG1lc3NhZ2UucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGFyTm90aWZpY2F0aW9uSGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICBzdGFyTm90aWZpY2F0aW9uSGFuZGxlcihtZXNzYWdlLm1ldGhvZCwgbWVzc2FnZS5wYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvci5tZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgTm90aWZpY2F0aW9uIGhhbmRsZXIgJyR7bWVzc2FnZS5tZXRob2R9JyBmYWlsZWQgd2l0aCBtZXNzYWdlOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYE5vdGlmaWNhdGlvbiBoYW5kbGVyICcke21lc3NhZ2UubWV0aG9kfScgZmFpbGVkIHVuZXhwZWN0ZWRseS5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1bmhhbmRsZWROb3RpZmljYXRpb25FbWl0dGVyLmZpcmUobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlSW52YWxpZE1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignUmVjZWl2ZWQgZW1wdHkgbWVzc2FnZS4nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsb2dnZXIuZXJyb3IoYFJlY2VpdmVkIG1lc3NhZ2Ugd2hpY2ggaXMgbmVpdGhlciBhIHJlc3BvbnNlIG5vciBhIG5vdGlmaWNhdGlvbiBtZXNzYWdlOlxcbiR7SlNPTi5zdHJpbmdpZnkobWVzc2FnZSwgbnVsbCwgNCl9YCk7XG4gICAgICAgIC8vIFRlc3Qgd2hldGhlciB3ZSBmaW5kIGFuIGlkIHRvIHJlamVjdCB0aGUgcHJvbWlzZVxuICAgICAgICBjb25zdCByZXNwb25zZU1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICBpZiAoSXMuc3RyaW5nKHJlc3BvbnNlTWVzc2FnZS5pZCkgfHwgSXMubnVtYmVyKHJlc3BvbnNlTWVzc2FnZS5pZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHJlc3BvbnNlTWVzc2FnZS5pZDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxlciA9IHJlc3BvbnNlUHJvbWlzZXMuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VIYW5kbGVyLnJlamVjdChuZXcgRXJyb3IoJ1RoZSByZWNlaXZlZCByZXNwb25zZSBoYXMgbmVpdGhlciBhIHJlc3VsdCBub3IgYW4gZXJyb3IgcHJvcGVydHkuJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0cmluZ2lmeVRyYWNlKHBhcmFtcykge1xuICAgICAgICBpZiAocGFyYW1zID09PSB1bmRlZmluZWQgfHwgcGFyYW1zID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAodHJhY2UpIHtcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuVmVyYm9zZTpcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGFyYW1zLCBudWxsLCA0KTtcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuQ29tcGFjdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGFyYW1zKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVNlbmRpbmdSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFjZUZvcm1hdCA9PT0gVHJhY2VGb3JtYXQuVGV4dCkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSAmJiBtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBgUGFyYW1zOiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucGFyYW1zKX1cXG5cXG5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJhY2VyLmxvZyhgU2VuZGluZyByZXF1ZXN0ICcke21lc3NhZ2UubWV0aG9kfSAtICgke21lc3NhZ2UuaWR9KScuYCwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb2dMU1BNZXNzYWdlKCdzZW5kLXJlcXVlc3QnLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVNlbmRpbmdOb3RpZmljYXRpb24obWVzc2FnZSkge1xuICAgICAgICBpZiAodHJhY2UgPT09IFRyYWNlLk9mZiB8fCAhdHJhY2VyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYWNlRm9ybWF0ID09PSBUcmFjZUZvcm1hdC5UZXh0KSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdCkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0gYFBhcmFtczogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLnBhcmFtcyl9XFxuXFxuYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSAnTm8gcGFyYW1ldGVycyBwcm92aWRlZC5cXG5cXG4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFNlbmRpbmcgbm90aWZpY2F0aW9uICcke21lc3NhZ2UubWV0aG9kfScuYCwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb2dMU1BNZXNzYWdlKCdzZW5kLW5vdGlmaWNhdGlvbicsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhY2VGb3JtYXQgPT09IFRyYWNlRm9ybWF0LlRleHQpIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZXJyb3IgJiYgbWVzc2FnZS5lcnJvci5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgRXJyb3IgZGF0YTogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLmVycm9yLmRhdGEpfVxcblxcbmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgUmVzdWx0OiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucmVzdWx0KX1cXG5cXG5gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UuZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9ICdObyByZXN1bHQgcmV0dXJuZWQuXFxuXFxuJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFNlbmRpbmcgcmVzcG9uc2UgJyR7bWV0aG9kfSAtICgke21lc3NhZ2UuaWR9KScuIFByb2Nlc3NpbmcgcmVxdWVzdCB0b29rICR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1tc2AsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgnc2VuZC1yZXNwb25zZScsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYWNlUmVjZWl2ZWRSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFjZUZvcm1hdCA9PT0gVHJhY2VGb3JtYXQuVGV4dCkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSAmJiBtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBgUGFyYW1zOiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucGFyYW1zKX1cXG5cXG5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJhY2VyLmxvZyhgUmVjZWl2ZWQgcmVxdWVzdCAnJHttZXNzYWdlLm1ldGhvZH0gLSAoJHttZXNzYWdlLmlkfSknLmAsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1yZXF1ZXN0JywgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdHJhY2VSZWNlaXZlZE5vdGlmaWNhdGlvbihtZXNzYWdlKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIgfHwgbWVzc2FnZS5tZXRob2QgPT09IExvZ1RyYWNlTm90aWZpY2F0aW9uLnR5cGUubWV0aG9kKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYWNlRm9ybWF0ID09PSBUcmFjZUZvcm1hdC5UZXh0KSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdCkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0gYFBhcmFtczogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLnBhcmFtcyl9XFxuXFxuYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSAnTm8gcGFyYW1ldGVycyBwcm92aWRlZC5cXG5cXG4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFJlY2VpdmVkIG5vdGlmaWNhdGlvbiAnJHttZXNzYWdlLm1ldGhvZH0nLmAsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1ub3RpZmljYXRpb24nLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVJlY2VpdmVkUmVzcG9uc2UobWVzc2FnZSwgcmVzcG9uc2VQcm9taXNlKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhY2VGb3JtYXQgPT09IFRyYWNlRm9ybWF0LlRleHQpIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZXJyb3IgJiYgbWVzc2FnZS5lcnJvci5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgRXJyb3IgZGF0YTogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLmVycm9yLmRhdGEpfVxcblxcbmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgUmVzdWx0OiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucmVzdWx0KX1cXG5cXG5gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UuZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9ICdObyByZXN1bHQgcmV0dXJuZWQuXFxuXFxuJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXNwb25zZVByb21pc2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IG1lc3NhZ2UuZXJyb3IgPyBgIFJlcXVlc3QgZmFpbGVkOiAke21lc3NhZ2UuZXJyb3IubWVzc2FnZX0gKCR7bWVzc2FnZS5lcnJvci5jb2RlfSkuYCA6ICcnO1xuICAgICAgICAgICAgICAgIHRyYWNlci5sb2coYFJlY2VpdmVkIHJlc3BvbnNlICcke3Jlc3BvbnNlUHJvbWlzZS5tZXRob2R9IC0gKCR7bWVzc2FnZS5pZH0pJyBpbiAke0RhdGUubm93KCkgLSByZXNwb25zZVByb21pc2UudGltZXJTdGFydH1tcy4ke2Vycm9yfWAsIGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJhY2VyLmxvZyhgUmVjZWl2ZWQgcmVzcG9uc2UgJHttZXNzYWdlLmlkfSB3aXRob3V0IGFjdGl2ZSByZXNwb25zZSBwcm9taXNlLmAsIGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1yZXNwb25zZScsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGxvZ0xTUE1lc3NhZ2UodHlwZSwgbWVzc2FnZSkge1xuICAgICAgICBpZiAoIXRyYWNlciB8fCB0cmFjZSA9PT0gVHJhY2UuT2ZmKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbHNwTWVzc2FnZSA9IHtcbiAgICAgICAgICAgIGlzTFNQTWVzc2FnZTogdHJ1ZSxcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpXG4gICAgICAgIH07XG4gICAgICAgIHRyYWNlci5sb2cobHNwTWVzc2FnZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRocm93SWZDbG9zZWRPckRpc3Bvc2VkKCkge1xuICAgICAgICBpZiAoaXNDbG9zZWQoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IENvbm5lY3Rpb25FcnJvcihDb25uZWN0aW9uRXJyb3JzLkNsb3NlZCwgJ0Nvbm5lY3Rpb24gaXMgY2xvc2VkLicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0Rpc3Bvc2VkKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb25uZWN0aW9uRXJyb3IoQ29ubmVjdGlvbkVycm9ycy5EaXNwb3NlZCwgJ0Nvbm5lY3Rpb24gaXMgZGlzcG9zZWQuJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdGhyb3dJZkxpc3RlbmluZygpIHtcbiAgICAgICAgaWYgKGlzTGlzdGVuaW5nKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb25uZWN0aW9uRXJyb3IoQ29ubmVjdGlvbkVycm9ycy5BbHJlYWR5TGlzdGVuaW5nLCAnQ29ubmVjdGlvbiBpcyBhbHJlYWR5IGxpc3RlbmluZycpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRocm93SWZOb3RMaXN0ZW5pbmcoKSB7XG4gICAgICAgIGlmICghaXNMaXN0ZW5pbmcoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYWxsIGxpc3RlbigpIGZpcnN0LicpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVuZGVmaW5lZFRvTnVsbChwYXJhbSkge1xuICAgICAgICBpZiAocGFyYW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyYW07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gbnVsbFRvVW5kZWZpbmVkKHBhcmFtKSB7XG4gICAgICAgIGlmIChwYXJhbSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJhbTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBpc05hbWVkUGFyYW0ocGFyYW0pIHtcbiAgICAgICAgcmV0dXJuIHBhcmFtICE9PSB1bmRlZmluZWQgJiYgcGFyYW0gIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkocGFyYW0pICYmIHR5cGVvZiBwYXJhbSA9PT0gJ29iamVjdCc7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXB1dGVTaW5nbGVQYXJhbShwYXJhbWV0ZXJTdHJ1Y3R1cmVzLCBwYXJhbSkge1xuICAgICAgICBzd2l0Y2ggKHBhcmFtZXRlclN0cnVjdHVyZXMpIHtcbiAgICAgICAgICAgIGNhc2UgbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG86XG4gICAgICAgICAgICAgICAgaWYgKGlzTmFtZWRQYXJhbShwYXJhbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxUb1VuZGVmaW5lZChwYXJhbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3VuZGVmaW5lZFRvTnVsbChwYXJhbSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZTpcbiAgICAgICAgICAgICAgICBpZiAoIWlzTmFtZWRQYXJhbShwYXJhbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWNlaXZlZCBwYXJhbWV0ZXJzIGJ5IG5hbWUgYnV0IHBhcmFtIGlzIG5vdCBhbiBvYmplY3QgbGl0ZXJhbC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGxUb1VuZGVmaW5lZChwYXJhbSk7XG4gICAgICAgICAgICBjYXNlIG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieVBvc2l0aW9uOlxuICAgICAgICAgICAgICAgIHJldHVybiBbdW5kZWZpbmVkVG9OdWxsKHBhcmFtKV07XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBwYXJhbWV0ZXIgc3RydWN0dXJlICR7cGFyYW1ldGVyU3RydWN0dXJlcy50b1N0cmluZygpfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXB1dGVNZXNzYWdlUGFyYW1zKHR5cGUsIHBhcmFtcykge1xuICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICBjb25zdCBudW1iZXJPZlBhcmFtcyA9IHR5cGUubnVtYmVyT2ZQYXJhbXM7XG4gICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gY29tcHV0ZVNpbmdsZVBhcmFtKHR5cGUucGFyYW1ldGVyU3RydWN0dXJlcywgcGFyYW1zWzBdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoICYmIGkgPCBudW1iZXJPZlBhcmFtczsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHVuZGVmaW5lZFRvTnVsbChwYXJhbXNbaV0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPCBudW1iZXJPZlBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gcGFyYW1zLmxlbmd0aDsgaSA8IG51bWJlck9mUGFyYW1zOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB7XG4gICAgICAgIHNlbmROb3RpZmljYXRpb246ICh0eXBlLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlUGFyYW1zO1xuICAgICAgICAgICAgaWYgKElzLnN0cmluZyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICAgIGxldCBwYXJhbVN0YXJ0ID0gMDtcbiAgICAgICAgICAgICAgICBsZXQgcGFyYW1ldGVyU3RydWN0dXJlcyA9IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvO1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuaXMoZmlyc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtU3RhcnQgPSAxO1xuICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gZmlyc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBwYXJhbUVuZCA9IGFyZ3MubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gcGFyYW1FbmQgLSBwYXJhbVN0YXJ0O1xuICAgICAgICAgICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zID0gY29tcHV0ZVNpbmdsZVBhcmFtKHBhcmFtZXRlclN0cnVjdHVyZXMsIGFyZ3NbcGFyYW1TdGFydF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjZWl2ZWQgJHtudW1iZXJPZlBhcmFtc30gcGFyYW1ldGVycyBmb3IgJ2J5IE5hbWUnIG5vdGlmaWNhdGlvbiBwYXJhbWV0ZXIgc3RydWN0dXJlLmApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IGFyZ3Muc2xpY2UocGFyYW1TdGFydCwgcGFyYW1FbmQpLm1hcCh2YWx1ZSA9PiB1bmRlZmluZWRUb051bGwodmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IGFyZ3M7XG4gICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZS5tZXRob2Q7XG4gICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IGNvbXB1dGVNZXNzYWdlUGFyYW1zKHR5cGUsIHBhcmFtcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBub3RpZmljYXRpb25NZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBtZXNzYWdlUGFyYW1zXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdHJhY2VTZW5kaW5nTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbk1lc3NhZ2UpO1xuICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2VXcml0ZXIud3JpdGUobm90aWZpY2F0aW9uTWVzc2FnZSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBTZW5kaW5nIG5vdGlmaWNhdGlvbiBmYWlsZWQuYCk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25Ob3RpZmljYXRpb246ICh0eXBlLCBoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGlmIChJcy5mdW5jKHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB0eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaGFuZGxlcikge1xuICAgICAgICAgICAgICAgIGlmIChJcy5zdHJpbmcodHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZTtcbiAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uSGFuZGxlcnMuc2V0KHR5cGUsIHsgdHlwZTogdW5kZWZpbmVkLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZS5tZXRob2Q7XG4gICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXJzLnNldCh0eXBlLm1ldGhvZCwgeyB0eXBlLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXJzLmRlbGV0ZShtZXRob2QpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBvblByb2dyZXNzOiAoX3R5cGUsIHRva2VuLCBoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgICBpZiAocHJvZ3Jlc3NIYW5kbGVycy5oYXModG9rZW4pKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm9ncmVzcyBoYW5kbGVyIGZvciB0b2tlbiAke3Rva2VufSBhbHJlYWR5IHJlZ2lzdGVyZWRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByb2dyZXNzSGFuZGxlcnMuc2V0KHRva2VuLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc0hhbmRsZXJzLmRlbGV0ZSh0b2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgc2VuZFByb2dyZXNzOiAoX3R5cGUsIHRva2VuLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGF3YWl0IGJ1dCBzaW1wbGUgcmV0dXJuIHRvIGVuc3VyZSB0aGF0IHdlIGRvbid0IGhhdmUgYW5vdGhlclxuICAgICAgICAgICAgLy8gYXN5bmMgc2NoZWR1bGluZy4gT3RoZXJ3aXNlIG9uZSBzZW5kIGNvdWxkIG92ZXJ0YWtlIGFub3RoZXIgc2VuZC5cbiAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLnNlbmROb3RpZmljYXRpb24oUHJvZ3Jlc3NOb3RpZmljYXRpb24udHlwZSwgeyB0b2tlbiwgdmFsdWUgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uVW5oYW5kbGVkUHJvZ3Jlc3M6IHVuaGFuZGxlZFByb2dyZXNzRW1pdHRlci5ldmVudCxcbiAgICAgICAgc2VuZFJlcXVlc3Q6ICh0eXBlLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgdGhyb3dJZk5vdExpc3RlbmluZygpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlUGFyYW1zO1xuICAgICAgICAgICAgbGV0IHRva2VuID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKElzLnN0cmluZyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3QgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgbGV0IHBhcmFtU3RhcnQgPSAwO1xuICAgICAgICAgICAgICAgIGxldCBwYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG87XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5pcyhmaXJzdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1TdGFydCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlclN0cnVjdHVyZXMgPSBmaXJzdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHBhcmFtRW5kID0gYXJncy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuLmlzKGxhc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtRW5kID0gcGFyYW1FbmQgLSAxO1xuICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IGxhc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gcGFyYW1FbmQgLSBwYXJhbVN0YXJ0O1xuICAgICAgICAgICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zID0gY29tcHV0ZVNpbmdsZVBhcmFtKHBhcmFtZXRlclN0cnVjdHVyZXMsIGFyZ3NbcGFyYW1TdGFydF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjZWl2ZWQgJHtudW1iZXJPZlBhcmFtc30gcGFyYW1ldGVycyBmb3IgJ2J5IE5hbWUnIHJlcXVlc3QgcGFyYW1ldGVyIHN0cnVjdHVyZS5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMgPSBhcmdzLnNsaWNlKHBhcmFtU3RhcnQsIHBhcmFtRW5kKS5tYXAodmFsdWUgPT4gdW5kZWZpbmVkVG9OdWxsKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBhcmdzO1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGUubWV0aG9kO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMgPSBjb21wdXRlTWVzc2FnZVBhcmFtcyh0eXBlLCBwYXJhbXMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gdHlwZS5udW1iZXJPZlBhcmFtcztcbiAgICAgICAgICAgICAgICB0b2tlbiA9IGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuLmlzKHBhcmFtc1tudW1iZXJPZlBhcmFtc10pID8gcGFyYW1zW251bWJlck9mUGFyYW1zXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGlkID0gc2VxdWVuY2VOdW1iZXIrKztcbiAgICAgICAgICAgIGxldCBkaXNwb3NhYmxlO1xuICAgICAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgICAgICAgZGlzcG9zYWJsZSA9IHRva2VuLm9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcCA9IGNhbmNlbGxhdGlvblN0cmF0ZWd5LnNlbmRlci5zZW5kQ2FuY2VsbGF0aW9uKGNvbm5lY3Rpb24sIGlkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhgUmVjZWl2ZWQgbm8gcHJvbWlzZSBmcm9tIGNhbmNlbGxhdGlvbiBzdHJhdGVneSB3aGVuIGNhbmNlbGxpbmcgaWQgJHtpZH1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIubG9nKGBTZW5kaW5nIGNhbmNlbGxhdGlvbiBtZXNzYWdlcyBmb3IgaWQgJHtpZH0gZmFpbGVkYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdE1lc3NhZ2UgPSB7XG4gICAgICAgICAgICAgICAganNvbnJwYzogdmVyc2lvbixcbiAgICAgICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBtZXNzYWdlUGFyYW1zXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdHJhY2VTZW5kaW5nUmVxdWVzdChyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNhbmNlbGxhdGlvblN0cmF0ZWd5LnNlbmRlci5lbmFibGVDYW5jZWxsYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25TdHJhdGVneS5zZW5kZXIuZW5hYmxlQ2FuY2VsbGF0aW9uKHJlcXVlc3RNZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZVdpdGhDbGVhbnVwID0gKHIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyKTtcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uU3RyYXRlZ3kuc2VuZGVyLmNsZWFudXAoaWQpO1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlPy5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWplY3RXaXRoQ2xlYW51cCA9IChyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChyKTtcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uU3RyYXRlZ3kuc2VuZGVyLmNsZWFudXAoaWQpO1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlPy5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZVByb21pc2UgPSB7IG1ldGhvZDogbWV0aG9kLCB0aW1lclN0YXJ0OiBEYXRlLm5vdygpLCByZXNvbHZlOiByZXNvbHZlV2l0aENsZWFudXAsIHJlamVjdDogcmVqZWN0V2l0aENsZWFudXAgfTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2VzLnNldChpZCwgcmVzcG9uc2VQcm9taXNlKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbWVzc2FnZVdyaXRlci53cml0ZShyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAvLyBXcml0aW5nIHRoZSBtZXNzYWdlIGZhaWxlZC4gU28gd2UgbmVlZCB0byBkZWxldGUgaXQgZnJvbSB0aGUgcmVzcG9uc2UgcHJvbWlzZXMgYW5kXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlamVjdCBpdC5cbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlcy5kZWxldGUoaWQpO1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2UucmVqZWN0KG5ldyBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IobWVzc2FnZXNfMS5FcnJvckNvZGVzLk1lc3NhZ2VXcml0ZUVycm9yLCBlcnJvci5tZXNzYWdlID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIHJlYXNvbicpKTtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlcXVlc3QgZmFpbGVkLmApO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25SZXF1ZXN0OiAodHlwZSwgaGFuZGxlcikgPT4ge1xuICAgICAgICAgICAgdGhyb3dJZkNsb3NlZE9yRGlzcG9zZWQoKTtcbiAgICAgICAgICAgIGxldCBtZXRob2QgPSBudWxsO1xuICAgICAgICAgICAgaWYgKFN0YXJSZXF1ZXN0SGFuZGxlci5pcyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBzdGFyUmVxdWVzdEhhbmRsZXIgPSB0eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoSXMuc3RyaW5nKHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgbWV0aG9kID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoaGFuZGxlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RIYW5kbGVycy5zZXQodHlwZSwgeyBoYW5kbGVyOiBoYW5kbGVyLCB0eXBlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSB0eXBlLm1ldGhvZDtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEhhbmRsZXJzLnNldCh0eXBlLm1ldGhvZCwgeyB0eXBlLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SGFuZGxlcnMuZGVsZXRlKG1ldGhvZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFyUmVxdWVzdEhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBoYXNQZW5kaW5nUmVzcG9uc2U6ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZVByb21pc2VzLnNpemUgPiAwO1xuICAgICAgICB9LFxuICAgICAgICB0cmFjZTogYXN5bmMgKF92YWx1ZSwgX3RyYWNlciwgc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBsZXQgX3NlbmROb3RpZmljYXRpb24gPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBfdHJhY2VGb3JtYXQgPSBUcmFjZUZvcm1hdC5UZXh0O1xuICAgICAgICAgICAgaWYgKHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKElzLmJvb2xlYW4oc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zKSkge1xuICAgICAgICAgICAgICAgICAgICBfc2VuZE5vdGlmaWNhdGlvbiA9IHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF9zZW5kTm90aWZpY2F0aW9uID0gc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zLnNlbmROb3RpZmljYXRpb24gfHwgZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIF90cmFjZUZvcm1hdCA9IHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucy50cmFjZUZvcm1hdCB8fCBUcmFjZUZvcm1hdC5UZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlID0gX3ZhbHVlO1xuICAgICAgICAgICAgdHJhY2VGb3JtYXQgPSBfdHJhY2VGb3JtYXQ7XG4gICAgICAgICAgICBpZiAodHJhY2UgPT09IFRyYWNlLk9mZikge1xuICAgICAgICAgICAgICAgIHRyYWNlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRyYWNlciA9IF90cmFjZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoX3NlbmROb3RpZmljYXRpb24gJiYgIWlzQ2xvc2VkKCkgJiYgIWlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGNvbm5lY3Rpb24uc2VuZE5vdGlmaWNhdGlvbihTZXRUcmFjZU5vdGlmaWNhdGlvbi50eXBlLCB7IHZhbHVlOiBUcmFjZS50b1N0cmluZyhfdmFsdWUpIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBvbkVycm9yOiBlcnJvckVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIG9uQ2xvc2U6IGNsb3NlRW1pdHRlci5ldmVudCxcbiAgICAgICAgb25VbmhhbmRsZWROb3RpZmljYXRpb246IHVuaGFuZGxlZE5vdGlmaWNhdGlvbkVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIG9uRGlzcG9zZTogZGlzcG9zZUVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIGVuZDogKCkgPT4ge1xuICAgICAgICAgICAgbWVzc2FnZVdyaXRlci5lbmQoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLkRpc3Bvc2VkO1xuICAgICAgICAgICAgZGlzcG9zZUVtaXR0ZXIuZmlyZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5QZW5kaW5nUmVzcG9uc2VSZWplY3RlZCwgJ1BlbmRpbmcgcmVzcG9uc2UgcmVqZWN0ZWQgc2luY2UgY29ubmVjdGlvbiBnb3QgZGlzcG9zZWQnKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvbWlzZSBvZiByZXNwb25zZVByb21pc2VzLnZhbHVlcygpKSB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBrbm93bkNhbmNlbGVkUmVxdWVzdHMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICBtZXNzYWdlUXVldWUgPSBuZXcgbGlua2VkTWFwXzEuTGlua2VkTWFwKCk7XG4gICAgICAgICAgICAvLyBUZXN0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgaWYgKElzLmZ1bmMobWVzc2FnZVdyaXRlci5kaXNwb3NlKSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKElzLmZ1bmMobWVzc2FnZVJlYWRlci5kaXNwb3NlKSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VSZWFkZXIuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBsaXN0ZW46ICgpID0+IHtcbiAgICAgICAgICAgIHRocm93SWZDbG9zZWRPckRpc3Bvc2VkKCk7XG4gICAgICAgICAgICB0aHJvd0lmTGlzdGVuaW5nKCk7XG4gICAgICAgICAgICBzdGF0ZSA9IENvbm5lY3Rpb25TdGF0ZS5MaXN0ZW5pbmc7XG4gICAgICAgICAgICBtZXNzYWdlUmVhZGVyLmxpc3RlbihjYWxsYmFjayk7XG4gICAgICAgIH0sXG4gICAgICAgIGluc3BlY3Q6ICgpID0+IHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS5jb25zb2xlLmxvZygnaW5zcGVjdCcpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25uZWN0aW9uLm9uTm90aWZpY2F0aW9uKExvZ1RyYWNlTm90aWZpY2F0aW9uLnR5cGUsIChwYXJhbXMpID0+IHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZlcmJvc2UgPSB0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdDtcbiAgICAgICAgdHJhY2VyLmxvZyhwYXJhbXMubWVzc2FnZSwgdmVyYm9zZSA/IHBhcmFtcy52ZXJib3NlIDogdW5kZWZpbmVkKTtcbiAgICB9KTtcbiAgICBjb25uZWN0aW9uLm9uTm90aWZpY2F0aW9uKFByb2dyZXNzTm90aWZpY2F0aW9uLnR5cGUsIChwYXJhbXMpID0+IHtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IHByb2dyZXNzSGFuZGxlcnMuZ2V0KHBhcmFtcy50b2tlbik7XG4gICAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICAgICBoYW5kbGVyKHBhcmFtcy52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1bmhhbmRsZWRQcm9ncmVzc0VtaXR0ZXIuZmlyZShwYXJhbXMpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbm5lY3Rpb247XG59XG5leHBvcnRzLmNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uID0gY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb247XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vdHlwaW5ncy90aGVuYWJsZS5kLnRzXCIgLz5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUHJvZ3Jlc3NUeXBlID0gZXhwb3J0cy5Qcm9ncmVzc1Rva2VuID0gZXhwb3J0cy5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiA9IGV4cG9ydHMuTnVsbExvZ2dlciA9IGV4cG9ydHMuQ29ubmVjdGlvbk9wdGlvbnMgPSBleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IGV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlQnVmZmVyID0gZXhwb3J0cy5Xcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyID0gZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLk1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLlJlYWRhYmxlU3RyZWFtTWVzc2FnZVJlYWRlciA9IGV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlUmVhZGVyID0gZXhwb3J0cy5NZXNzYWdlUmVhZGVyID0gZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblRva2VuID0gZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IGV4cG9ydHMuRW1pdHRlciA9IGV4cG9ydHMuRXZlbnQgPSBleHBvcnRzLkRpc3Bvc2FibGUgPSBleHBvcnRzLkxSVUNhY2hlID0gZXhwb3J0cy5Ub3VjaCA9IGV4cG9ydHMuTGlua2VkTWFwID0gZXhwb3J0cy5QYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlOSA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTggPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU3ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNiA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTUgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU0ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMyA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTIgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUxID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMCA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZSA9IGV4cG9ydHMuRXJyb3JDb2RlcyA9IGV4cG9ydHMuUmVzcG9uc2VFcnJvciA9IGV4cG9ydHMuUmVxdWVzdFR5cGU5ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTggPSBleHBvcnRzLlJlcXVlc3RUeXBlNyA9IGV4cG9ydHMuUmVxdWVzdFR5cGU2ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTUgPSBleHBvcnRzLlJlcXVlc3RUeXBlNCA9IGV4cG9ydHMuUmVxdWVzdFR5cGUzID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTIgPSBleHBvcnRzLlJlcXVlc3RUeXBlMSA9IGV4cG9ydHMuUmVxdWVzdFR5cGUwID0gZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IGV4cG9ydHMuTWVzc2FnZSA9IGV4cG9ydHMuUkFMID0gdm9pZCAwO1xuZXhwb3J0cy5NZXNzYWdlU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblN0cmF0ZWd5ID0gZXhwb3J0cy5DYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IGV4cG9ydHMuQ29ubmVjdGlvbkVycm9yID0gZXhwb3J0cy5Db25uZWN0aW9uRXJyb3JzID0gZXhwb3J0cy5Mb2dUcmFjZU5vdGlmaWNhdGlvbiA9IGV4cG9ydHMuU2V0VHJhY2VOb3RpZmljYXRpb24gPSBleHBvcnRzLlRyYWNlRm9ybWF0ID0gZXhwb3J0cy5UcmFjZVZhbHVlcyA9IGV4cG9ydHMuVHJhY2UgPSB2b2lkIDA7XG5jb25zdCBtZXNzYWdlc18xID0gcmVxdWlyZShcIi4vbWVzc2FnZXNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNZXNzYWdlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk1lc3NhZ2U7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlMFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTA7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTFcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGUxOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGUyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlMjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlM1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGU0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGU1XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlNTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlNlwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTY7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTdcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGU3OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGU4XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlODsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlOVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTk7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXNwb25zZUVycm9yXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3I7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJFcnJvckNvZGVzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLkVycm9yQ29kZXM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlMFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlMDsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGUxXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGUxOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZTJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlM1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlMzsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGU0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZTVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlNlwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlNjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGU3XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU3OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZThcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTg7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlOVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlOTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlBhcmFtZXRlclN0cnVjdHVyZXNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlczsgfSB9KTtcbmNvbnN0IGxpbmtlZE1hcF8xID0gcmVxdWlyZShcIi4vbGlua2VkTWFwXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTGlua2VkTWFwXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBsaW5rZWRNYXBfMS5MaW5rZWRNYXA7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJMUlVDYWNoZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbGlua2VkTWFwXzEuTFJVQ2FjaGU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJUb3VjaFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbGlua2VkTWFwXzEuVG91Y2g7IH0gfSk7XG5jb25zdCBkaXNwb3NhYmxlXzEgPSByZXF1aXJlKFwiLi9kaXNwb3NhYmxlXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiRGlzcG9zYWJsZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZGlzcG9zYWJsZV8xLkRpc3Bvc2FibGU7IH0gfSk7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCIuL2V2ZW50c1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkV2ZW50XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBldmVudHNfMS5FdmVudDsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkVtaXR0ZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGV2ZW50c18xLkVtaXR0ZXI7IH0gfSk7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblRva2VuU291cmNlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjYW5jZWxsYXRpb25fMS5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblRva2VuXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjYW5jZWxsYXRpb25fMS5DYW5jZWxsYXRpb25Ub2tlbjsgfSB9KTtcbmNvbnN0IHNoYXJlZEFycmF5Q2FuY2VsbGF0aW9uXzEgPSByZXF1aXJlKFwiLi9zaGFyZWRBcnJheUNhbmNlbGxhdGlvblwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHNoYXJlZEFycmF5Q2FuY2VsbGF0aW9uXzEuU2hhcmVkQXJyYXlTZW5kZXJTdHJhdGVneTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlNoYXJlZEFycmF5UmVjZWl2ZXJTdHJhdGVneVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gc2hhcmVkQXJyYXlDYW5jZWxsYXRpb25fMS5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3k7IH0gfSk7XG5jb25zdCBtZXNzYWdlUmVhZGVyXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlUmVhZGVyXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTWVzc2FnZVJlYWRlclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZVJlYWRlcl8xLk1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VSZWFkZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VSZWFkZXJfMS5BYnN0cmFjdE1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VSZWFkZXJfMS5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5jb25zdCBtZXNzYWdlV3JpdGVyXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlV3JpdGVyXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTWVzc2FnZVdyaXRlclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZVdyaXRlcl8xLk1lc3NhZ2VXcml0ZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VXcml0ZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VXcml0ZXJfMS5BYnN0cmFjdE1lc3NhZ2VXcml0ZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJXcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlV3JpdGVyXzEuV3JpdGVhYmxlU3RyZWFtTWVzc2FnZVdyaXRlcjsgfSB9KTtcbmNvbnN0IG1lc3NhZ2VCdWZmZXJfMSA9IHJlcXVpcmUoXCIuL21lc3NhZ2VCdWZmZXJcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VCdWZmZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VCdWZmZXJfMS5BYnN0cmFjdE1lc3NhZ2VCdWZmZXI7IH0gfSk7XG5jb25zdCBjb25uZWN0aW9uXzEgPSByZXF1aXJlKFwiLi9jb25uZWN0aW9uXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29ubmVjdGlvblN0cmF0ZWd5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ29ubmVjdGlvblN0cmF0ZWd5OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29ubmVjdGlvbk9wdGlvbnNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5Db25uZWN0aW9uT3B0aW9uczsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk51bGxMb2dnZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5OdWxsTG9nZ2VyOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb25cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlByb2dyZXNzVG9rZW5cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5Qcm9ncmVzc1Rva2VuOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUHJvZ3Jlc3NUeXBlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuUHJvZ3Jlc3NUeXBlOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiVHJhY2VcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5UcmFjZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlRyYWNlVmFsdWVzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuVHJhY2VWYWx1ZXM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJUcmFjZUZvcm1hdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29ubmVjdGlvbl8xLlRyYWNlRm9ybWF0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiU2V0VHJhY2VOb3RpZmljYXRpb25cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5TZXRUcmFjZU5vdGlmaWNhdGlvbjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkxvZ1RyYWNlTm90aWZpY2F0aW9uXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuTG9nVHJhY2VOb3RpZmljYXRpb247IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJDb25uZWN0aW9uRXJyb3JzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ29ubmVjdGlvbkVycm9yczsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNvbm5lY3Rpb25FcnJvclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29ubmVjdGlvbl8xLkNvbm5lY3Rpb25FcnJvcjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5DYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5DYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblN0cmF0ZWd5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ2FuY2VsbGF0aW9uU3RyYXRlZ3k7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNZXNzYWdlU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5NZXNzYWdlU3RyYXRlZ3k7IH0gfSk7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbmV4cG9ydHMuUkFMID0gcmFsXzEuZGVmYXVsdDtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGFwaV8xID0gcmVxdWlyZShcIi4uL2NvbW1vbi9hcGlcIik7XG5jbGFzcyBNZXNzYWdlQnVmZmVyIGV4dGVuZHMgYXBpXzEuQWJzdHJhY3RNZXNzYWdlQnVmZmVyIHtcbiAgICBjb25zdHJ1Y3RvcihlbmNvZGluZyA9ICd1dGYtOCcpIHtcbiAgICAgICAgc3VwZXIoZW5jb2RpbmcpO1xuICAgICAgICB0aGlzLmFzY2lpRGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcignYXNjaWknKTtcbiAgICB9XG4gICAgZW1wdHlCdWZmZXIoKSB7XG4gICAgICAgIHJldHVybiBNZXNzYWdlQnVmZmVyLmVtcHR5QnVmZmVyO1xuICAgIH1cbiAgICBmcm9tU3RyaW5nKHZhbHVlLCBfZW5jb2RpbmcpIHtcbiAgICAgICAgcmV0dXJuIChuZXcgVGV4dEVuY29kZXIoKSkuZW5jb2RlKHZhbHVlKTtcbiAgICB9XG4gICAgdG9TdHJpbmcodmFsdWUsIGVuY29kaW5nKSB7XG4gICAgICAgIGlmIChlbmNvZGluZyA9PT0gJ2FzY2lpJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXNjaWlEZWNvZGVyLmRlY29kZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gKG5ldyBUZXh0RGVjb2RlcihlbmNvZGluZykpLmRlY29kZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXNOYXRpdmUoYnVmZmVyLCBsZW5ndGgpIHtcbiAgICAgICAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlci5zbGljZSgwLCBsZW5ndGgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFsbG9jTmF0aXZlKGxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTtcbiAgICB9XG59XG5NZXNzYWdlQnVmZmVyLmVtcHR5QnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMCk7XG5jbGFzcyBSZWFkYWJsZVN0cmVhbVdyYXBwZXIge1xuICAgIGNvbnN0cnVjdG9yKHNvY2tldCkge1xuICAgICAgICB0aGlzLnNvY2tldCA9IHNvY2tldDtcbiAgICAgICAgdGhpcy5fb25EYXRhID0gbmV3IGFwaV8xLkVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5fbWVzc2FnZUxpc3RlbmVyID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBibG9iID0gZXZlbnQuZGF0YTtcbiAgICAgICAgICAgIGJsb2IuYXJyYXlCdWZmZXIoKS50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkRhdGEuZmlyZShuZXcgVWludDhBcnJheShidWZmZXIpKTtcbiAgICAgICAgICAgIH0sICgpID0+IHtcbiAgICAgICAgICAgICAgICAoMCwgYXBpXzEuUkFMKSgpLmNvbnNvbGUuZXJyb3IoYENvbnZlcnRpbmcgYmxvYiB0byBhcnJheSBidWZmZXIgZmFpbGVkLmApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLl9tZXNzYWdlTGlzdGVuZXIpO1xuICAgIH1cbiAgICBvbkNsb3NlKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2Nsb3NlJywgbGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gYXBpXzEuRGlzcG9zYWJsZS5jcmVhdGUoKCkgPT4gdGhpcy5zb2NrZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xvc2UnLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkVycm9yKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgbGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gYXBpXzEuRGlzcG9zYWJsZS5jcmVhdGUoKCkgPT4gdGhpcy5zb2NrZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkVuZChsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKCdlbmQnLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdlbmQnLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkRhdGEobGlzdGVuZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uRGF0YS5ldmVudChsaXN0ZW5lcik7XG4gICAgfVxufVxuY2xhc3MgV3JpdGFibGVTdHJlYW1XcmFwcGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihzb2NrZXQpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7XG4gICAgfVxuICAgIG9uQ2xvc2UobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignY2xvc2UnLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbG9zZScsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIG9uRXJyb3IobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIG9uRW5kKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2VuZCcsIGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIGFwaV8xLkRpc3Bvc2FibGUuY3JlYXRlKCgpID0+IHRoaXMuc29ja2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2VuZCcsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIHdyaXRlKGRhdGEsIGVuY29kaW5nKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkICYmIGVuY29kaW5nICE9PSAndXRmLTgnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbiBhIEJyb3dzZXIgZW52aXJvbm1lbnRzIG9ubHkgdXRmLTggdGV4dCBlbmNvZGluZyBpcyBzdXBwb3J0ZWQuIEJ1dCBnb3QgZW5jb2Rpbmc6ICR7ZW5jb2Rpbmd9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKTtcbiAgICB9XG59XG5jb25zdCBfdGV4dEVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbmNvbnN0IF9yaWwgPSBPYmplY3QuZnJlZXplKHtcbiAgICBtZXNzYWdlQnVmZmVyOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgY3JlYXRlOiAoZW5jb2RpbmcpID0+IG5ldyBNZXNzYWdlQnVmZmVyKGVuY29kaW5nKVxuICAgIH0pLFxuICAgIGFwcGxpY2F0aW9uSnNvbjogT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGVuY29kZXI6IE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgbmFtZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgZW5jb2RlOiAobXNnLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2hhcnNldCAhPT0gJ3V0Zi04Jykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluIGEgQnJvd3NlciBlbnZpcm9ubWVudHMgb25seSB1dGYtOCB0ZXh0IGVuY29kaW5nIGlzIHN1cHBvcnRlZC4gQnV0IGdvdCBlbmNvZGluZzogJHtvcHRpb25zLmNoYXJzZXR9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoX3RleHRFbmNvZGVyLmVuY29kZShKU09OLnN0cmluZ2lmeShtc2csIHVuZGVmaW5lZCwgMCkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIGRlY29kZXI6IE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgbmFtZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgZGVjb2RlOiAoYnVmZmVyLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCEoYnVmZmVyIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbiBhIEJyb3dzZXIgZW52aXJvbm1lbnRzIG9ubHkgVWludDhBcnJheXMgYXJlIHN1cHBvcnRlZC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShKU09OLnBhcnNlKG5ldyBUZXh0RGVjb2RlcihvcHRpb25zLmNoYXJzZXQpLmRlY29kZShidWZmZXIpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfSksXG4gICAgc3RyZWFtOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgYXNSZWFkYWJsZVN0cmVhbTogKHNvY2tldCkgPT4gbmV3IFJlYWRhYmxlU3RyZWFtV3JhcHBlcihzb2NrZXQpLFxuICAgICAgICBhc1dyaXRhYmxlU3RyZWFtOiAoc29ja2V0KSA9PiBuZXcgV3JpdGFibGVTdHJlYW1XcmFwcGVyKHNvY2tldClcbiAgICB9KSxcbiAgICBjb25zb2xlOiBjb25zb2xlLFxuICAgIHRpbWVyOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgc2V0VGltZW91dChjYWxsYmFjaywgbXMsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHNldFRpbWVvdXQoY2FsbGJhY2ssIG1zLCAuLi5hcmdzKTtcbiAgICAgICAgICAgIHJldHVybiB7IGRpc3Bvc2U6ICgpID0+IGNsZWFyVGltZW91dChoYW5kbGUpIH07XG4gICAgICAgIH0sXG4gICAgICAgIHNldEltbWVkaWF0ZShjYWxsYmFjaywgLi4uYXJncykge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gc2V0VGltZW91dChjYWxsYmFjaywgMCwgLi4uYXJncyk7XG4gICAgICAgICAgICByZXR1cm4geyBkaXNwb3NlOiAoKSA9PiBjbGVhclRpbWVvdXQoaGFuZGxlKSB9O1xuICAgICAgICB9LFxuICAgICAgICBzZXRJbnRlcnZhbChjYWxsYmFjaywgbXMsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHNldEludGVydmFsKGNhbGxiYWNrLCBtcywgLi4uYXJncyk7XG4gICAgICAgICAgICByZXR1cm4geyBkaXNwb3NlOiAoKSA9PiBjbGVhckludGVydmFsKGhhbmRsZSkgfTtcbiAgICAgICAgfSxcbiAgICB9KVxufSk7XG5mdW5jdGlvbiBSSUwoKSB7XG4gICAgcmV0dXJuIF9yaWw7XG59XG4oZnVuY3Rpb24gKFJJTCkge1xuICAgIGZ1bmN0aW9uIGluc3RhbGwoKSB7XG4gICAgICAgIGFwaV8xLlJBTC5pbnN0YWxsKF9yaWwpO1xuICAgIH1cbiAgICBSSUwuaW5zdGFsbCA9IGluc3RhbGw7XG59KShSSUwgfHwgKFJJTCA9IHt9KSk7XG5leHBvcnRzLmRlZmF1bHQgPSBSSUw7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24gPSBleHBvcnRzLkJyb3dzZXJNZXNzYWdlV3JpdGVyID0gZXhwb3J0cy5Ccm93c2VyTWVzc2FnZVJlYWRlciA9IHZvaWQgMDtcbmNvbnN0IHJpbF8xID0gcmVxdWlyZShcIi4vcmlsXCIpO1xuLy8gSW5zdGFsbCB0aGUgYnJvd3NlciBydW50aW1lIGFic3RyYWN0LlxucmlsXzEuZGVmYXVsdC5pbnN0YWxsKCk7XG5jb25zdCBhcGlfMSA9IHJlcXVpcmUoXCIuLi9jb21tb24vYXBpXCIpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuLi9jb21tb24vYXBpXCIpLCBleHBvcnRzKTtcbmNsYXNzIEJyb3dzZXJNZXNzYWdlUmVhZGVyIGV4dGVuZHMgYXBpXzEuQWJzdHJhY3RNZXNzYWdlUmVhZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihwb3J0KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX29uRGF0YSA9IG5ldyBhcGlfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuX21lc3NhZ2VMaXN0ZW5lciA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fb25EYXRhLmZpcmUoZXZlbnQuZGF0YSk7XG4gICAgICAgIH07XG4gICAgICAgIHBvcnQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoZXZlbnQpID0+IHRoaXMuZmlyZUVycm9yKGV2ZW50KSk7XG4gICAgICAgIHBvcnQub25tZXNzYWdlID0gdGhpcy5fbWVzc2FnZUxpc3RlbmVyO1xuICAgIH1cbiAgICBsaXN0ZW4oY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uRGF0YS5ldmVudChjYWxsYmFjayk7XG4gICAgfVxufVxuZXhwb3J0cy5Ccm93c2VyTWVzc2FnZVJlYWRlciA9IEJyb3dzZXJNZXNzYWdlUmVhZGVyO1xuY2xhc3MgQnJvd3Nlck1lc3NhZ2VXcml0ZXIgZXh0ZW5kcyBhcGlfMS5BYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKHBvcnQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50ID0gMDtcbiAgICAgICAgcG9ydC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIChldmVudCkgPT4gdGhpcy5maXJlRXJyb3IoZXZlbnQpKTtcbiAgICB9XG4gICAgd3JpdGUobXNnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnBvcnQucG9zdE1lc3NhZ2UobXNnKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IsIG1zZyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZUVycm9yKGVycm9yLCBtc2cpIHtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50Kys7XG4gICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yLCBtc2csIHRoaXMuZXJyb3JDb3VudCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICB9XG59XG5leHBvcnRzLkJyb3dzZXJNZXNzYWdlV3JpdGVyID0gQnJvd3Nlck1lc3NhZ2VXcml0ZXI7XG5mdW5jdGlvbiBjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbihyZWFkZXIsIHdyaXRlciwgbG9nZ2VyLCBvcHRpb25zKSB7XG4gICAgaWYgKGxvZ2dlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxvZ2dlciA9IGFwaV8xLk51bGxMb2dnZXI7XG4gICAgfVxuICAgIGlmIChhcGlfMS5Db25uZWN0aW9uU3RyYXRlZ3kuaXMob3B0aW9ucykpIHtcbiAgICAgICAgb3B0aW9ucyA9IHsgY29ubmVjdGlvblN0cmF0ZWd5OiBvcHRpb25zIH07XG4gICAgfVxuICAgIHJldHVybiAoMCwgYXBpXzEuY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24pKHJlYWRlciwgd3JpdGVyLCBsb2dnZXIsIG9wdGlvbnMpO1xufVxuZXhwb3J0cy5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiA9IGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uO1xuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL2Jyb3dzZXIvbWFpbicpOyIsICIvKlxuICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMjYgRWNsaXBzZSBEaXJpZ2libGUgY29udHJpYnV0b3JzXG4gKlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlXG4gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2Mi4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG4gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MjAuaHRtbFxuICpcbiAqIFNQRFgtRmlsZUNvcHlyaWdodFRleHQ6IEVjbGlwc2UgRGlyaWdpYmxlIGNvbnRyaWJ1dG9ycyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbi8qKlxuICogSmF2YSBMU1AgY2xpZW50IGJ1bmRsZS5cbiAqXG4gKiBVc2VzIHZzY29kZS13cy1qc29ucnBjIGZvciB0eXBlZCBKU09OLVJQQyBvdmVyIFdlYlNvY2tldCBhbmQgcmVnaXN0ZXJzIE1vbmFjb1xuICogcHJvdmlkZXJzIHRoYXQgZGVsZWdhdGUgdG8gSkRULkxTLiBFeHBvc2VkIGFzIGdsb2JhbCBKYXZhTHNwQ2xpZW50TGliIHNvIHRoYXRcbiAqIGVkaXRvci5qcyBjYW4gY2FsbCBKYXZhTHNwQ2xpZW50TGliLmNvbm5lY3QocmVzb3VyY2VQYXRoKS5cbiAqXG4gKiBPbmUgSkRULkxTIHByb2Nlc3MgY292ZXJzIHRoZSBlbnRpcmUgd29ya3NwYWNlLCBzbyBhIHNpbmdsZSBXZWJTb2NrZXQgY29ubmVjdGlvblxuICogaXMgc2hhcmVkIGFjcm9zcyBhbGwgSmF2YSBmaWxlcyBvcGVuIGluIHRoZSBzYW1lIGJyb3dzZXIgcGFnZS4gVGhlIGNvbm5lY3Rpb24gaXNcbiAqIGVzdGFibGlzaGVkIG9uIHRoZSBmaXJzdCBjb25uZWN0KCkgY2FsbCBhbmQgcmV1c2VkIGZvciBhbGwgc3Vic2VxdWVudCBjYWxscy5cbiAqXG4gKiBlZGl0b3IuanMgc2V0cyB3aW5kb3cubW9uYWNvIGJlZm9yZSBjYWxsaW5nIGNvbm5lY3QoKSwgc28gdGhlIG1vbmFjby1zaGltJ3MgbGF6eVxuICogUHJveGllcyByZXNvbHZlIGNvcnJlY3RseSBhdCBjYWxsIHRpbWUuXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24sIE1lc3NhZ2VDb25uZWN0aW9uIH0gZnJvbSAndnNjb2RlLWpzb25ycGMvYnJvd3Nlcic7XG5pbXBvcnQgeyB0b1NvY2tldCwgV2ViU29ja2V0TWVzc2FnZVJlYWRlciwgV2ViU29ja2V0TWVzc2FnZVdyaXRlciB9IGZyb20gJ3ZzY29kZS13cy1qc29ucnBjJztcbmltcG9ydCAqIGFzIG1vbmFjbyBmcm9tICdtb25hY28tZWRpdG9yJztcbmltcG9ydCB7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLFxuICAgIERpYWdub3N0aWNTZXZlcml0eSxcbiAgICBJbnNlcnRUZXh0Rm9ybWF0LFxuICAgIE1hcmt1cENvbnRlbnQsXG4gICAgTWFya3VwS2luZCxcbiAgICB0eXBlIENvZGVBY3Rpb24sXG4gICAgdHlwZSBDb21tYW5kLFxuICAgIHR5cGUgQ29tcGxldGlvbkl0ZW0sXG4gICAgdHlwZSBDb21wbGV0aW9uTGlzdCxcbiAgICB0eXBlIERpYWdub3N0aWMsXG4gICAgdHlwZSBIb3ZlcixcbiAgICB0eXBlIExvY2F0aW9uLFxuICAgIHR5cGUgUGFyYW1ldGVySW5mb3JtYXRpb24sXG4gICAgdHlwZSBTaWduYXR1cmVIZWxwLFxuICAgIHR5cGUgU2lnbmF0dXJlSW5mb3JtYXRpb24sXG4gICAgdHlwZSBUZXh0RWRpdCxcbiAgICB0eXBlIFdvcmtzcGFjZUVkaXQsXG59IGZyb20gJ3ZzY29kZS1sYW5ndWFnZXNlcnZlci10eXBlcyc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNpbmdsZXRvbiBzdGF0ZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogU2hhcmVkIGNvbm5lY3Rpb24gXHUyMDE0IG9uZSBwZXIgYnJvd3NlciBwYWdlLCBjb3ZlcmluZyBhbGwgcHJvamVjdHMgaW4gdGhlIHdvcmtzcGFjZS4gKi9cbmxldCBfY29ubjogTWVzc2FnZUNvbm5lY3Rpb24gfCBudWxsID0gbnVsbDtcblxuLyoqXG4gKiBWaXJ0dWFsIHdvcmtzcGFjZSByb290IFVSSSwgZS5nLiB7QGNvZGUgZmlsZTovLy93b3Jrc3BhY2Uvd29ya3NwYWNlL30uXG4gKiBTZXQgb25jZSBvbiBmaXJzdCBjb25uZWN0KCk7IHVzZWQgdG8gc2NvcGUgTW9uYWNvIHByb3ZpZGVycyB0byB3b3Jrc3BhY2UgZmlsZXMuXG4gKi9cbmxldCBfd29ya3NwYWNlUm9vdCA9ICcnO1xuXG4vKiogVVJJcyBmb3Igd2hpY2ggdGV4dERvY3VtZW50L2RpZE9wZW4gaGFzIGFscmVhZHkgYmVlbiBzZW50LiAqL1xuY29uc3QgX29wZW5GaWxlczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cbmxldCBfcHJvdmlkZXJzUmVnaXN0ZXJlZCA9IGZhbHNlO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBQdWJsaWMgQVBJXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBDYWxsZWQgYnkgZWRpdG9yLmpzIHdoZW4gYSBKYXZhIGZpbGUgaXMgb3BlbmVkLiBTYWZlIHRvIGNhbGwgbXVsdGlwbGUgdGltZXMuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29ubmVjdChyZXNvdXJjZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcnRzID0gcmVzb3VyY2VQYXRoLnJlcGxhY2UoL15cXC8vLCAnJykuc3BsaXQoJy8nKTtcbiAgICBjb25zdCB3b3Jrc3BhY2UgPSBwYXJ0c1swXTtcbiAgICBjb25zdCBwcm9qZWN0ICAgPSBwYXJ0c1sxXTtcbiAgICBjb25zdCBmaWxlVXJpID0gYGZpbGU6Ly8vd29ya3NwYWNlLyR7d29ya3NwYWNlfS8ke3Byb2plY3R9LyR7cGFydHMuc2xpY2UoMikuam9pbignLycpfWA7XG5cbiAgICBpZiAoX2Nvbm4pIHtcbiAgICAgICAgLy8gQ29ubmVjdGlvbiBhbHJlYWR5IGVzdGFibGlzaGVkIFx1MjAxNCBqdXN0IG9wZW4gdGhlIG5ldyBmaWxlLlxuICAgICAgICBvcGVuRmlsZShmaWxlVXJpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIF93b3Jrc3BhY2VSb290ID0gYGZpbGU6Ly8vd29ya3NwYWNlLyR7d29ya3NwYWNlfS9gO1xuXG4gICAgY29uc3QgcHJvdG8gPSBsb2NhdGlvbi5wcm90b2NvbCA9PT0gJ2h0dHBzOicgPyAnd3NzJyA6ICd3cyc7XG4gICAgY29uc3Qgd3NVcmwgPSBgJHtwcm90b306Ly8ke2xvY2F0aW9uLmhvc3R9L3dlYnNvY2tldHMvaWRlL2phdmEtbHNwYFxuICAgICAgICAgICAgICAgICsgYD93b3Jrc3BhY2U9JHtlbmNvZGVVUklDb21wb25lbnQod29ya3NwYWNlKX1gO1xuXG4gICAgY29uc3Qgd3MgPSBuZXcgV2ViU29ja2V0KHdzVXJsKTtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHdzLm9ub3BlbiAgPSAoKSA9PiByZXNvbHZlKCk7XG4gICAgICAgIHdzLm9uZXJyb3IgPSAoKSA9PiByZWplY3QobmV3IEVycm9yKGBbamF2YS1sc3BdIFdlYlNvY2tldCBjb25uZWN0IGZhaWxlZDogJHt3c1VybH1gKSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBzb2NrZXQgPSB0b1NvY2tldCh3cyk7XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IFdlYlNvY2tldE1lc3NhZ2VSZWFkZXIoc29ja2V0KTtcbiAgICBjb25zdCB3cml0ZXIgPSBuZXcgV2ViU29ja2V0TWVzc2FnZVdyaXRlcihzb2NrZXQpO1xuICAgIF9jb25uID0gY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24ocmVhZGVyLCB3cml0ZXIpO1xuXG4gICAgLy8gRGlhZ25vc3RpY3Mgbm90aWZpY2F0aW9uIFx1MjE5MiBNb25hY28gbWFya2VycyAoYXBwbGllcyB0byBhbnkgd29ya3NwYWNlIGZpbGUpXG4gICAgX2Nvbm4ub25Ob3RpZmljYXRpb24oJ3RleHREb2N1bWVudC9wdWJsaXNoRGlhZ25vc3RpY3MnLCAocGFyYW1zOiB7IHVyaTogc3RyaW5nOyBkaWFnbm9zdGljczogRGlhZ25vc3RpY1tdIH0pID0+IHtcbiAgICAgICAgY29uc3QgbW9kZWwgPSBtb25hY28uZWRpdG9yLmdldE1vZGVscygpLmZpbmQobSA9PiBtLnVyaS50b1N0cmluZygpID09PSBwYXJhbXMudXJpKTtcbiAgICAgICAgaWYgKCFtb2RlbCkgcmV0dXJuO1xuICAgICAgICBtb25hY28uZWRpdG9yLnNldE1vZGVsTWFya2Vycyhtb2RlbCwgJ2phdmEtbHNwJywgcGFyYW1zLmRpYWdub3N0aWNzLm1hcChkID0+ICh7XG4gICAgICAgICAgICBzZXZlcml0eTogICAgICAgIGxzcFNldmVyaXR5KGQuc2V2ZXJpdHkpLFxuICAgICAgICAgICAgbWVzc2FnZTogICAgICAgICBkLm1lc3NhZ2UsXG4gICAgICAgICAgICBzb3VyY2U6ICAgICAgICAgIGQuc291cmNlID8/ICdqYXZhJyxcbiAgICAgICAgICAgIHN0YXJ0TGluZU51bWJlcjogZC5yYW5nZS5zdGFydC5saW5lICsgMSxcbiAgICAgICAgICAgIHN0YXJ0Q29sdW1uOiAgICAgZC5yYW5nZS5zdGFydC5jaGFyYWN0ZXIgKyAxLFxuICAgICAgICAgICAgZW5kTGluZU51bWJlcjogICBkLnJhbmdlLmVuZC5saW5lICsgMSxcbiAgICAgICAgICAgIGVuZENvbHVtbjogICAgICAgZC5yYW5nZS5lbmQuY2hhcmFjdGVyICsgMSxcbiAgICAgICAgfSkpKTtcbiAgICB9KTtcblxuICAgIC8vIFNlcnZlciAtPiBjbGllbnQgcmVxdWVzdHMgdGhhdCBkcml2ZSByZWZhY3RvciAvIGdlbmVyYXRlIHJlc3VsdHMgYW5kIGR5bmFtaWMgcmVnaXN0cmF0aW9uLlxuICAgIF9jb25uLm9uUmVxdWVzdCgnd29ya3NwYWNlL2FwcGx5RWRpdCcsIChwYXJhbXM6IHsgZWRpdDogV29ya3NwYWNlRWRpdCB9KSA9PiB7XG4gICAgICAgIGFwcGx5V29ya3NwYWNlRWRpdChwYXJhbXMuZWRpdCk7XG4gICAgICAgIHJldHVybiB7IGFwcGxpZWQ6IHRydWUgfTtcbiAgICB9KTtcbiAgICBfY29ubi5vblJlcXVlc3QoJ3dvcmtzcGFjZS9jb25maWd1cmF0aW9uJywgKHBhcmFtczogeyBpdGVtczogQXJyYXk8eyBzZWN0aW9uPzogc3RyaW5nIH0+IH0pID0+XG4gICAgICAgIChwYXJhbXMuaXRlbXMgPz8gW10pLm1hcCgoKSA9PiBqZHRsc1NldHRpbmdzKCkuamF2YSkpO1xuICAgIF9jb25uLm9uUmVxdWVzdCgnY2xpZW50L3JlZ2lzdGVyQ2FwYWJpbGl0eScsICgpID0+IG51bGwpO1xuICAgIF9jb25uLm9uUmVxdWVzdCgnY2xpZW50L3VucmVnaXN0ZXJDYXBhYmlsaXR5JywgKCkgPT4gbnVsbCk7XG4gICAgX2Nvbm4ub25SZXF1ZXN0KCd3aW5kb3cvc2hvd01lc3NhZ2VSZXF1ZXN0JywgKCkgPT4gbnVsbCk7XG4gICAgX2Nvbm4ub25SZXF1ZXN0KCd3aW5kb3cvd29ya0RvbmVQcm9ncmVzcy9jcmVhdGUnLCAoKSA9PiBudWxsKTtcbiAgICBfY29ubi5vbk5vdGlmaWNhdGlvbignd2luZG93L2xvZ01lc3NhZ2UnLCAocDogeyBtZXNzYWdlOiBzdHJpbmcgfSkgPT4gY29uc29sZS5kZWJ1ZygnW2phdmEtbHNwXScsIHA/Lm1lc3NhZ2UpKTtcbiAgICBfY29ubi5vbk5vdGlmaWNhdGlvbignd2luZG93L3Nob3dNZXNzYWdlJywgKHA6IHsgbWVzc2FnZTogc3RyaW5nIH0pID0+IGNvbnNvbGUuaW5mbygnW2phdmEtbHNwXScsIHA/Lm1lc3NhZ2UpKTtcbiAgICAvLyBKRFQuTFMgbGFuZ3VhZ2Utc3RhdHVzIC8gcHJvZ3Jlc3Mgbm90aWZpY2F0aW9ucyBcdTIwMTQgYWNrbm93bGVkZ2VkIHNpbGVudGx5LlxuICAgIF9jb25uLm9uTm90aWZpY2F0aW9uKCdsYW5ndWFnZS9zdGF0dXMnLCAoKSA9PiB7IC8qIGluZGV4aW5nL3JlYWR5IHN0YXR1cywgaWdub3JlZCAqLyB9KTtcbiAgICBfY29ubi5vbk5vdGlmaWNhdGlvbignbGFuZ3VhZ2UvcHJvZ3Jlc3NSZXBvcnQnLCAoKSA9PiB7IC8qIGJ1aWxkIHByb2dyZXNzLCBpZ25vcmVkICovIH0pO1xuXG4gICAgX2Nvbm4ubGlzdGVuKCk7XG5cbiAgICBjb25zdCByb290VXJpID0gX3dvcmtzcGFjZVJvb3Q7XG4gICAgYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ2luaXRpYWxpemUnLCB7XG4gICAgICAgIHByb2Nlc3NJZDogbnVsbCxcbiAgICAgICAgcm9vdFVyaSxcbiAgICAgICAgaW5pdGlhbGl6YXRpb25PcHRpb25zOiB7XG4gICAgICAgICAgICBzZXR0aW5nczogamR0bHNTZXR0aW5ncygpLFxuICAgICAgICAgICAgZXh0ZW5kZWRDbGllbnRDYXBhYmlsaXRpZXM6IHtcbiAgICAgICAgICAgICAgICBwcm9ncmVzc1JlcG9ydFByb3ZpZGVyOiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAgIGNsYXNzRmlsZUNvbnRlbnRzU3VwcG9ydDogICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICByZXNvbHZlQWRkaXRpb25hbFRleHRFZGl0c1N1cHBvcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgYWR2YW5jZWRHZW5lcmF0ZUFjY2Vzc29yc1N1cHBvcnQ6ICB0cnVlLFxuICAgICAgICAgICAgICAgIGdlbmVyYXRlVG9TdHJpbmdQcm9tcHRTdXBwb3J0OiAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICBnZW5lcmF0ZUNvbnN0cnVjdG9yc1Byb21wdFN1cHBvcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgZ2VuZXJhdGVEZWxlZ2F0ZU1ldGhvZHNQcm9tcHRTdXBwb3J0OiB0cnVlLFxuICAgICAgICAgICAgICAgIGhhc2hDb2RlRXF1YWxzUHJvbXB0U3VwcG9ydDogICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICBhZHZhbmNlZE9yZ2FuaXplSW1wb3J0c1N1cHBvcnQ6ICAgIHRydWUsXG4gICAgICAgICAgICAgICAgaW5mZXJTZWxlY3Rpb25TdXBwb3J0OiAgICAgICAgICAgICBbJ2V4dHJhY3RNZXRob2QnLCAnZXh0cmFjdFZhcmlhYmxlJywgJ2V4dHJhY3RGaWVsZCddLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgd29ya3NwYWNlRm9sZGVyczogW3sgdXJpOiByb290VXJpLCBuYW1lOiB3b3Jrc3BhY2UgfV0sXG4gICAgICAgIGNhcGFiaWxpdGllczoge1xuICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7XG4gICAgICAgICAgICAgICAgc3luY2hyb25pemF0aW9uOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUsIHdpbGxTYXZlOiBmYWxzZSwgZGlkU2F2ZTogdHJ1ZSwgd2lsbFNhdmVXYWl0VW50aWw6IGZhbHNlIH0sXG4gICAgICAgICAgICAgICAgY29tcGxldGlvbjoge1xuICAgICAgICAgICAgICAgICAgICBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uSXRlbToge1xuICAgICAgICAgICAgICAgICAgICAgICAgc25pcHBldFN1cHBvcnQ6ICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRhdGlvbkZvcm1hdDogICBbJ21hcmtkb3duJywgJ3BsYWludGV4dCddLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRlZFN1cHBvcnQ6ICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWl0Q2hhcmFjdGVyc1N1cHBvcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlU3VwcG9ydDogICAgICAgIHsgcHJvcGVydGllczogWydkb2N1bWVudGF0aW9uJywgJ2RldGFpbCcsICdhZGRpdGlvbmFsVGV4dEVkaXRzJ10gfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dFN1cHBvcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBob3ZlcjogICAgICAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLCBjb250ZW50Rm9ybWF0OiBbJ21hcmtkb3duJywgJ3BsYWludGV4dCddIH0sXG4gICAgICAgICAgICAgICAgc2lnbmF0dXJlSGVscDogIHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSwgc2lnbmF0dXJlSW5mb3JtYXRpb246IHsgZG9jdW1lbnRhdGlvbkZvcm1hdDogWydtYXJrZG93bicsICdwbGFpbnRleHQnXSwgcGFyYW1ldGVySW5mb3JtYXRpb246IHsgbGFiZWxPZmZzZXRTdXBwb3J0OiB0cnVlIH0gfSB9LFxuICAgICAgICAgICAgICAgIGRlZmluaXRpb246ICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VzOiAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgZG9jdW1lbnRTeW1ib2w6IHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIGZvcm1hdHRpbmc6ICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICByYW5nZUZvcm1hdHRpbmc6IHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIHJlbmFtZTogICAgICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUsIHByZXBhcmVTdXBwb3J0OiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgY29kZUFjdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjb2RlQWN0aW9uTGl0ZXJhbFN1cHBvcnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVBY3Rpb25LaW5kOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTZXQ6IFsncXVpY2tmaXgnLCAncmVmYWN0b3InLCAncmVmYWN0b3IuZXh0cmFjdCcsICdyZWZhY3Rvci5pbmxpbmUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVmYWN0b3IucmV3cml0ZScsICdzb3VyY2UnLCAnc291cmNlLm9yZ2FuaXplSW1wb3J0cyddLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgaXNQcmVmZXJyZWRTdXBwb3J0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBkYXRhU3VwcG9ydDogICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmVTdXBwb3J0OiAgICAgeyBwcm9wZXJ0aWVzOiBbJ2VkaXQnXSB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcHVibGlzaERpYWdub3N0aWNzOiB7IHJlbGF0ZWRJbmZvcm1hdGlvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdvcmtzcGFjZToge1xuICAgICAgICAgICAgICAgIGFwcGx5RWRpdDogICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbjogICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICBleGVjdXRlQ29tbWFuZDogICAgICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICBkaWRDaGFuZ2VDb25maWd1cmF0aW9uOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICB3b3Jrc3BhY2VFZGl0OiAgICAgICAgICB7IGRvY3VtZW50Q2hhbmdlczogdHJ1ZSwgcmVzb3VyY2VPcGVyYXRpb25zOiBbJ2NyZWF0ZScsICdyZW5hbWUnLCAnZGVsZXRlJ10gfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBfY29ubi5zZW5kTm90aWZpY2F0aW9uKCdpbml0aWFsaXplZCcsIHt9KTtcbiAgICBfY29ubi5zZW5kTm90aWZpY2F0aW9uKCd3b3Jrc3BhY2UvZGlkQ2hhbmdlQ29uZmlndXJhdGlvbicsIHsgc2V0dGluZ3M6IGpkdGxzU2V0dGluZ3MoKSB9KTtcblxuICAgIG9wZW5GaWxlKGZpbGVVcmkpO1xuXG4gICAgaWYgKCFfcHJvdmlkZXJzUmVnaXN0ZXJlZCkge1xuICAgICAgICBfcHJvdmlkZXJzUmVnaXN0ZXJlZCA9IHRydWU7XG4gICAgICAgIHJlZ2lzdGVyUHJvdmlkZXJzKCk7XG4gICAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBGaWxlIGxpZmVjeWNsZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFNlbmRzIHRleHREb2N1bWVudC9kaWRPcGVuIGZvciB0aGUgZ2l2ZW4gVVJJIChpZiBub3QgYWxyZWFkeSBzZW50KSBhbmQgcmVnaXN0ZXJzIGEgZGVib3VuY2VkXG4gKiB0ZXh0RG9jdW1lbnQvZGlkQ2hhbmdlIGxpc3RlbmVyIG9uIHRoZSBjb3JyZXNwb25kaW5nIE1vbmFjbyBtb2RlbC5cbiAqL1xuZnVuY3Rpb24gb3BlbkZpbGUoZmlsZVVyaTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKF9vcGVuRmlsZXMuaGFzKGZpbGVVcmkpIHx8ICFfY29ubikgcmV0dXJuO1xuICAgIF9vcGVuRmlsZXMuYWRkKGZpbGVVcmkpO1xuXG4gICAgY29uc3QgbW9kZWwgPSBtb25hY28uZWRpdG9yLmdldE1vZGVscygpLmZpbmQobSA9PiBtLnVyaS50b1N0cmluZygpID09PSBmaWxlVXJpKTtcbiAgICBfY29ubi5zZW5kTm90aWZpY2F0aW9uKCd0ZXh0RG9jdW1lbnQvZGlkT3BlbicsIHtcbiAgICAgICAgdGV4dERvY3VtZW50OiB7XG4gICAgICAgICAgICB1cmk6ICAgICAgICBmaWxlVXJpLFxuICAgICAgICAgICAgbGFuZ3VhZ2VJZDogJ2phdmEnLFxuICAgICAgICAgICAgdmVyc2lvbjogICAgMSxcbiAgICAgICAgICAgIHRleHQ6ICAgICAgIG1vZGVsPy5nZXRWYWx1ZSgpID8/ICcnLFxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgaWYgKG1vZGVsKSB7XG4gICAgICAgIGxldCB0aW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG4gICAgICAgIG1vZGVsLm9uRGlkQ2hhbmdlQ29udGVudCgoKSA9PiB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBfY29ubj8uc2VuZE5vdGlmaWNhdGlvbigndGV4dERvY3VtZW50L2RpZENoYW5nZScsIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiAgIHsgdXJpOiBmaWxlVXJpLCB2ZXJzaW9uOiBtb2RlbC5nZXRWZXJzaW9uSWQoKSB9LFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50Q2hhbmdlczogW3sgdGV4dDogbW9kZWwuZ2V0VmFsdWUoKSB9XSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sIDQwMCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gV29ya3NwYWNlIGZpbGUgcHJlZGljYXRlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogUmV0dXJucyB7QGNvZGUgdHJ1ZX0gd2hlbiB0aGUgZ2l2ZW4gbW9kZWwgVVJJIGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnRseSBjb25uZWN0ZWQgd29ya3NwYWNlLiBVc2VkXG4gKiBieSBNb25hY28gcHJvdmlkZXJzIHRvIHNraXAgbm9uLUphdmEtd29ya3NwYWNlIG1vZGVscyB3aXRob3V0IGFuIGV4YWN0LVVSSSBjb21wYXJpc29uLlxuICovXG5mdW5jdGlvbiBpc1dvcmtzcGFjZUZpbGUodXJpOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gX3dvcmtzcGFjZVJvb3QgIT09ICcnICYmIHVyaS5zdGFydHNXaXRoKF93b3Jrc3BhY2VSb290KTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gTW9uYWNvIHByb3ZpZGVyIHJlZ2lzdHJhdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiByZWdpc3RlclByb3ZpZGVycygpOiB2b2lkIHtcblxuICAgIG1vbmFjby5lZGl0b3IucmVnaXN0ZXJDb21tYW5kKEFQUExZX0FDVElPTl9DT01NQU5ELCAoX2FjY2Vzc29yOiB1bmtub3duLCBhY3Rpb246IENvZGVBY3Rpb24gfCBDb21tYW5kKSA9PiB7XG4gICAgICAgIGFwcGx5Q29kZUFjdGlvbihhY3Rpb24pO1xuICAgIH0pO1xuXG4gICAgLy8gQ3Jvc3MtZmlsZSBuYXZpZ2F0aW9uOiB0aGlzIHNpbmdsZS1maWxlIGVkaXRvciBoYXMgbm8gbW9kZWwgZm9yIG90aGVyIHdvcmtzcGFjZSBmaWxlcywgc28gR28gdG9cbiAgICAvLyBEZWZpbml0aW9uIC8gRmluZCBSZWZlcmVuY2VzIHRvIGFub3RoZXIgZmlsZSB3b3VsZCBzaWxlbnRseSBkbyBub3RoaW5nLiBIYW5kIHRob3NlIG9mZiB0byB0aGUgSURFXG4gICAgLy8gdG8gb3BlbiB0aGUgdGFyZ2V0IGZpbGUgKGFuZCByZXZlYWwgdGhlIGxpbmUpLiBTYW1lLWZpbGUgdGFyZ2V0cyBmYWxsIHRocm91Z2ggdG8gTW9uYWNvLlxuICAgIG1vbmFjby5lZGl0b3IucmVnaXN0ZXJFZGl0b3JPcGVuZXIoe1xuICAgICAgICBvcGVuQ29kZUVkaXRvcjogKHNvdXJjZSwgcmVzb3VyY2UsIHNlbGVjdGlvbk9yUG9zaXRpb24pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHVyaSA9IHJlc291cmNlLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBpZiAoIWlzV29ya3NwYWNlRmlsZSh1cmkpIHx8ICF1cmkuc3RhcnRzV2l0aChWSVJUVUFMX0ZJTEVfUFJFRklYKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudE1vZGVsID0gc291cmNlLmdldE1vZGVsKCk7XG4gICAgICAgICAgICBpZiAoY3VycmVudE1vZGVsICYmIGN1cnJlbnRNb2RlbC51cmkudG9TdHJpbmcoKSA9PT0gdXJpKSByZXR1cm4gZmFsc2U7IC8vIHNhbWUgZmlsZSBcdTIwMTQgbGV0IE1vbmFjbyBqdW1wXG4gICAgICAgICAgICBjb25zdCBvcGVuZXIgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLmphdmFMc3BPcGVuRmlsZTtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3BlbmVyICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBwb3MgPSBzZWxlY3Rpb25PclBvc2l0aW9uIGFzIHsgc3RhcnRMaW5lTnVtYmVyPzogbnVtYmVyOyBsaW5lTnVtYmVyPzogbnVtYmVyOyBzdGFydENvbHVtbj86IG51bWJlcjsgY29sdW1uPzogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBsaW5lID0gcG9zID8gKHBvcy5zdGFydExpbmVOdW1iZXIgPz8gcG9zLmxpbmVOdW1iZXIpIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgY29sdW1uID0gcG9zID8gKHBvcy5zdGFydENvbHVtbiA/PyBwb3MuY29sdW1uKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIG9wZW5lcih1cmkuc3Vic3RyaW5nKFZJUlRVQUxfRklMRV9QUkVGSVgubGVuZ3RoKSwgbGluZSwgY29sdW1uKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckNvbXBsZXRpb25JdGVtUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHRyaWdnZXJDaGFyYWN0ZXJzOiBbJy4nLCAnQCcsICc8J10sXG4gICAgICAgIHByb3ZpZGVDb21wbGV0aW9uSXRlbXM6IGFzeW5jIChtb2RlbCwgcG9zaXRpb24sIGNvbnRleHQpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgZmlsZVVyaSA9IG1vZGVsLnVyaS50b1N0cmluZygpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBDb21wbGV0aW9uTGlzdCB8IENvbXBsZXRpb25JdGVtW10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9jb21wbGV0aW9uJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IGZpbGVVcmkgfSxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogICAgIHsgbGluZTogcG9zaXRpb24ubGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogcG9zaXRpb24uY29sdW1uIC0gMSB9LFxuICAgICAgICAgICAgICAgIC8vIE1vbmFjbyB0cmlnZ2VyIGtpbmRzIGFyZSAwLWJhc2VkIChJbnZva2UvVHJpZ2dlckNoYXJhY3Rlci9Gb3JJbmNvbXBsZXRlKTsgTFNQIGlzIDEtYmFzZWQuXG4gICAgICAgICAgICAgICAgY29udGV4dDogICAgICB7IHRyaWdnZXJLaW5kOiAoY29udGV4dC50cmlnZ2VyS2luZCA/PyAwKSArIDEsIHRyaWdnZXJDaGFyYWN0ZXI6IGNvbnRleHQudHJpZ2dlckNoYXJhY3RlciB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBpdGVtcyA9IEFycmF5LmlzQXJyYXkocmVzdWx0KSA/IHJlc3VsdCA6IChyZXN1bHQ/Lml0ZW1zID8/IFtdKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3VnZ2VzdGlvbnM6IGl0ZW1zLm1hcChpdGVtID0+IGxzcENvbXBsZXRpb25Ub01vbmFjbyhpdGVtLCBtb2RlbCwgcG9zaXRpb24pKSxcbiAgICAgICAgICAgICAgICAvLyBKRFQuTFMgcmV0dXJucyBhIHRydW5jYXRlZCBsaXN0IG9uIHRoZSBmaXJzdCBrZXlzdHJva2VzOyBwcm9wYWdhdGluZyBcImluY29tcGxldGVcIiBtYWtlc1xuICAgICAgICAgICAgICAgIC8vIE1vbmFjbyByZS1xdWVyeSBhcyB0aGUgdXNlciB0eXBlcyBpbnN0ZWFkIG9mIGNhY2hpbmcgdGhlIGZpcnN0IChvZnRlbiBlbXB0eSkgcmVzdWx0LlxuICAgICAgICAgICAgICAgIGluY29tcGxldGU6ICBBcnJheS5pc0FycmF5KHJlc3VsdCkgPyBmYWxzZSA6ICEhcmVzdWx0Py5pc0luY29tcGxldGUsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvLyBSZXNvbHZlIGRvY3VtZW50YXRpb24gYW5kLCBjcnVjaWFsbHksIHRoZSBhdXRvLWltcG9ydCBhZGRpdGlvbmFsVGV4dEVkaXRzIHdoaWNoIEpEVC5MUyBvbmx5XG4gICAgICAgIC8vIGF0dGFjaGVzIG9uIHJlc29sdmUgXHUyMDE0IHNlbGVjdGluZyBhIHR5cGUgdGhlbiBpbnNlcnRzIGl0cyBpbXBvcnQgc3RhdGVtZW50LlxuICAgICAgICByZXNvbHZlQ29tcGxldGlvbkl0ZW06IGFzeW5jIChpdGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsc3AgPSAoaXRlbSBhcyBNb25hY29Db21wbGV0aW9uSXRlbSkuX2xzcDtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWxzcCkgcmV0dXJuIGl0ZW07XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkOiBDb21wbGV0aW9uSXRlbSA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCdjb21wbGV0aW9uSXRlbS9yZXNvbHZlJywgbHNwKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQuZG9jdW1lbnRhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBpdGVtLmRvY3VtZW50YXRpb24gPSB7IHZhbHVlOiBtYXJrdXBUb1N0cmluZyhyZXNvbHZlZC5kb2N1bWVudGF0aW9uKSwgaXNUcnVzdGVkOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQuZGV0YWlsKSBpdGVtLmRldGFpbCA9IHJlc29sdmVkLmRldGFpbDtcbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQuYWRkaXRpb25hbFRleHRFZGl0cz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uYWRkaXRpb25hbFRleHRFZGl0cyA9IHJlc29sdmVkLmFkZGl0aW9uYWxUZXh0RWRpdHMubWFwKHRleHRFZGl0VG9Nb25hY28pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKCdbamF2YS1sc3BdIGNvbXBsZXRpb24gcmVzb2x2ZSBmYWlsZWQ6JywgKGUgYXMgRXJyb3IpPy5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckhvdmVyUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVIb3ZlcjogYXN5bmMgKG1vZGVsLCBwb3NpdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBmaWxlVXJpID0gbW9kZWwudXJpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IEhvdmVyIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvaG92ZXInLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogZmlsZVVyaSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0Py5jb250ZW50cykgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50cyA9IEFycmF5LmlzQXJyYXkocmVzdWx0LmNvbnRlbnRzKSA/IHJlc3VsdC5jb250ZW50cyA6IFtyZXN1bHQuY29udGVudHNdO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjb250ZW50czogY29udGVudHMubWFwKGMgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHR5cGVvZiBjID09PSAnc3RyaW5nJyA/IGMgOiAoYyBhcyBNYXJrdXBDb250ZW50KS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgaXNUcnVzdGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgcmFuZ2U6IHJlc3VsdC5yYW5nZSA/IGxzcFJhbmdlVG9Nb25hY28ocmVzdWx0LnJhbmdlKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyU2lnbmF0dXJlSGVscFByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBzaWduYXR1cmVIZWxwVHJpZ2dlckNoYXJhY3RlcnM6IFsnKCcsICcsJ10sXG4gICAgICAgIHByb3ZpZGVTaWduYXR1cmVIZWxwOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVVcmkgPSBtb2RlbC51cmkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogU2lnbmF0dXJlSGVscCB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L3NpZ25hdHVyZUhlbHAnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogZmlsZVVyaSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlczogcmVzdWx0LnNpZ25hdHVyZXMubWFwKChzaWc6IFNpZ25hdHVyZUluZm9ybWF0aW9uKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICAgICAgICAgc2lnLmxhYmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRhdGlvbjogc2lnLmRvY3VtZW50YXRpb24gPyBtYXJrdXBUb1N0cmluZyhzaWcuZG9jdW1lbnRhdGlvbikgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiAgICAoc2lnLnBhcmFtZXRlcnMgPz8gW10pLm1hcCgocDogUGFyYW1ldGVySW5mb3JtYXRpb24pID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICAgICAgICAgcC5sYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudGF0aW9uOiBwLmRvY3VtZW50YXRpb24gPyBtYXJrdXBUb1N0cmluZyhwLmRvY3VtZW50YXRpb24pIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZVNpZ25hdHVyZTogcmVzdWx0LmFjdGl2ZVNpZ25hdHVyZSA/PyAwLFxuICAgICAgICAgICAgICAgICAgICBhY3RpdmVQYXJhbWV0ZXI6IHJlc3VsdC5hY3RpdmVQYXJhbWV0ZXIgPz8gMCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGRpc3Bvc2U6ICgpID0+IHt9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJEZWZpbml0aW9uUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVEZWZpbml0aW9uOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVVcmkgPSBtb2RlbC51cmkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogTG9jYXRpb24gfCBMb2NhdGlvbltdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvZGVmaW5pdGlvbicsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBmaWxlVXJpIH0sXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgbG9jYXRpb25zID0gQXJyYXkuaXNBcnJheShyZXN1bHQpID8gcmVzdWx0IDogW3Jlc3VsdF07XG4gICAgICAgICAgICByZXR1cm4gbG9jYXRpb25zLm1hcChsb2MgPT4gKHtcbiAgICAgICAgICAgICAgICB1cmk6ICAgbW9uYWNvLlVyaS5wYXJzZShsb2MudXJpKSxcbiAgICAgICAgICAgICAgICByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhsb2MucmFuZ2UpLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlclJlZmVyZW5jZVByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlUmVmZXJlbmNlczogYXN5bmMgKG1vZGVsLCBwb3NpdGlvbiwgY29udGV4dCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IExvY2F0aW9uW10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9yZWZlcmVuY2VzJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgICAgICBjb250ZXh0OiAgICAgIHsgaW5jbHVkZURlY2xhcmF0aW9uOiBjb250ZXh0LmluY2x1ZGVEZWNsYXJhdGlvbiB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0Lm1hcChsb2MgPT4gKHsgdXJpOiBtb25hY28uVXJpLnBhcnNlKGxvYy51cmkpLCByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhsb2MucmFuZ2UpIH0pKTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJSZW5hbWVQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZVJlbmFtZUVkaXRzOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uLCBuZXdOYW1lKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4geyBlZGl0czogW10gfTtcbiAgICAgICAgICAgIGNvbnN0IGVkaXQ6IFdvcmtzcGFjZUVkaXQgfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9yZW5hbWUnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogICAgIHsgbGluZTogcG9zaXRpb24ubGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogcG9zaXRpb24uY29sdW1uIC0gMSB9LFxuICAgICAgICAgICAgICAgIG5ld05hbWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiB3b3Jrc3BhY2VFZGl0VG9Nb25hY28oZWRpdCk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlc29sdmVSZW5hbWVMb2NhdGlvbjogYXN5bmMgKG1vZGVsLCBwb3NpdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogeyByYW5nZTogTHNwUmFuZ2U7IHBsYWNlaG9sZGVyPzogc3RyaW5nIH0gfCBMc3BSYW5nZSB8IG51bGwgPVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L3ByZXBhcmVSZW5hbWUnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gJ3JhbmdlJyBpbiByZXN1bHQgPyByZXN1bHQucmFuZ2UgOiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSAncGxhY2Vob2xkZXInIGluIHJlc3VsdCAmJiByZXN1bHQucGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICAgICAgPyByZXN1bHQucGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICAgICAgOiBtb2RlbC5nZXRXb3JkQXRQb3NpdGlvbihwb3NpdGlvbik/LndvcmQgPz8gJyc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28ocmFuZ2UpLCB0ZXh0OiBwbGFjZWhvbGRlciB9O1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgY29uc3Qgd29yZCA9IG1vZGVsLmdldFdvcmRBdFBvc2l0aW9uKHBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gd29yZCA/IHtcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2U6IHsgc3RhcnRMaW5lTnVtYmVyOiBwb3NpdGlvbi5saW5lTnVtYmVyLCBzdGFydENvbHVtbjogd29yZC5zdGFydENvbHVtbiwgZW5kTGluZU51bWJlcjogcG9zaXRpb24ubGluZU51bWJlciwgZW5kQ29sdW1uOiB3b3JkLmVuZENvbHVtbiB9LFxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiB3b3JkLndvcmQsXG4gICAgICAgICAgICAgICAgfSA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBSZWdpc3RlcmluZyB0aGlzIHByb3ZpZGVyIGFsc28gZW5hYmxlcyBlZGl0b3IuanMncyBleGlzdGluZyBmb3JtYXQtb24tc2F2ZSBwYXRoIGZvciBKYXZhOiB0aGVcbiAgICAvLyBzaGFyZWQgU2F2ZSBhY3Rpb24gcnVucyBlZGl0b3IuYWN0aW9uLmZvcm1hdERvY3VtZW50IHdoZW4gYXV0by1mb3JtYXR0aW5nIGlzIG9uICh0aGUgc2FtZVxuICAgIC8vIG1lY2hhbmlzbSBhbmQgZ2xvYmFsIHRvZ2dsZSB1c2VkIGZvciBUeXBlU2NyaXB0KS5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyRG9jdW1lbnRGb3JtYXR0aW5nRWRpdFByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlRG9jdW1lbnRGb3JtYXR0aW5nRWRpdHM6IGFzeW5jIChtb2RlbCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBlZGl0czogVGV4dEVkaXRbXSB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L2Zvcm1hdHRpbmcnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiAgICAgIHsgdGFiU2l6ZTogbW9kZWwuZ2V0T3B0aW9ucygpLnRhYlNpemUsIGluc2VydFNwYWNlczogbW9kZWwuZ2V0T3B0aW9ucygpLmluc2VydFNwYWNlcyB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gZWRpdHMgPyBlZGl0cy5tYXAodGV4dEVkaXRUb01vbmFjbykgOiBudWxsO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckNvZGVBY3Rpb25Qcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZUNvZGVBY3Rpb25zOiBhc3luYyAobW9kZWwsIHJhbmdlLCBjb250ZXh0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbXB0eSA9IHsgYWN0aW9uczogW10sIGRpc3Bvc2UoKSB7IC8qIG5vdGhpbmcgdG8gZGlzcG9zZSAqLyB9IH07XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gZW1wdHk7XG4gICAgICAgICAgICBjb25zdCBkaWFnbm9zdGljcyA9IChjb250ZXh0Lm1hcmtlcnMgPz8gW10pLm1hcChtYXJrZXJUb0xzcERpYWdub3N0aWMpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBBcnJheTxDb2RlQWN0aW9uIHwgQ29tbWFuZD4gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9jb2RlQWN0aW9uJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICAgICAgcmFuZ2U6ICAgICAgICBtb25hY29SYW5nZVRvTHNwKHJhbmdlKSxcbiAgICAgICAgICAgICAgICBjb250ZXh0OiAgICAgIHsgZGlhZ25vc3RpY3MsIG9ubHk6IGNvbnRleHQub25seSA/IFtjb250ZXh0Lm9ubHldIDogdW5kZWZpbmVkIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0Py5sZW5ndGgpIHJldHVybiBlbXB0eTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgYWN0aW9uczogcmVzdWx0Lm1hcChsc3BDb2RlQWN0aW9uVG9Nb25hY28pLFxuICAgICAgICAgICAgICAgIGRpc3Bvc2UoKSB7IC8qIG5vdGhpbmcgdG8gZGlzcG9zZSAqLyB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICB9LCB7XG4gICAgICAgIHByb3ZpZGVkQ29kZUFjdGlvbktpbmRzOiBbJ3F1aWNrZml4JywgJ3JlZmFjdG9yJywgJ3JlZmFjdG9yLmV4dHJhY3QnLCAncmVmYWN0b3IuaW5saW5lJyxcbiAgICAgICAgICAgICdyZWZhY3Rvci5yZXdyaXRlJywgJ3NvdXJjZScsICdzb3VyY2Uub3JnYW5pemVJbXBvcnRzJ10sXG4gICAgfSk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEhlbHBlcnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gbHNwU2V2ZXJpdHkoc2V2ZXJpdHk6IERpYWdub3N0aWNTZXZlcml0eSB8IHVuZGVmaW5lZCk6IG1vbmFjby5NYXJrZXJTZXZlcml0eSB7XG4gICAgc3dpdGNoIChzZXZlcml0eSkge1xuICAgICAgICBjYXNlIERpYWdub3N0aWNTZXZlcml0eS5FcnJvcjogICAgICAgcmV0dXJuIG1vbmFjby5NYXJrZXJTZXZlcml0eS5FcnJvcjtcbiAgICAgICAgY2FzZSBEaWFnbm9zdGljU2V2ZXJpdHkuV2FybmluZzogICAgIHJldHVybiBtb25hY28uTWFya2VyU2V2ZXJpdHkuV2FybmluZztcbiAgICAgICAgY2FzZSBEaWFnbm9zdGljU2V2ZXJpdHkuSW5mb3JtYXRpb246IHJldHVybiBtb25hY28uTWFya2VyU2V2ZXJpdHkuSW5mbztcbiAgICAgICAgY2FzZSBEaWFnbm9zdGljU2V2ZXJpdHkuSGludDogICAgICAgIHJldHVybiBtb25hY28uTWFya2VyU2V2ZXJpdHkuSGludDtcbiAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtb25hY28uTWFya2VyU2V2ZXJpdHkuRXJyb3I7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBsc3BSYW5nZVRvTW9uYWNvKHI6IHsgc3RhcnQ6IHsgbGluZTogbnVtYmVyOyBjaGFyYWN0ZXI6IG51bWJlciB9OyBlbmQ6IHsgbGluZTogbnVtYmVyOyBjaGFyYWN0ZXI6IG51bWJlciB9IH0pOiBtb25hY28uSVJhbmdlIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBzdGFydExpbmVOdW1iZXI6IHIuc3RhcnQubGluZSArIDEsXG4gICAgICAgIHN0YXJ0Q29sdW1uOiAgICAgci5zdGFydC5jaGFyYWN0ZXIgKyAxLFxuICAgICAgICBlbmRMaW5lTnVtYmVyOiAgIHIuZW5kLmxpbmUgKyAxLFxuICAgICAgICBlbmRDb2x1bW46ICAgICAgIHIuZW5kLmNoYXJhY3RlciArIDEsXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gbWFya3VwVG9TdHJpbmcoYzogc3RyaW5nIHwgTWFya3VwQ29udGVudCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHR5cGVvZiBjID09PSAnc3RyaW5nJyA/IGMgOiBjLnZhbHVlO1xufVxuXG5mdW5jdGlvbiBsc3BDb21wbGV0aW9uS2luZChraW5kOiBDb21wbGV0aW9uSXRlbUtpbmQgfCB1bmRlZmluZWQpOiBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtS2luZCB7XG4gICAgY29uc3QgSyA9IG1vbmFjby5sYW5ndWFnZXMuQ29tcGxldGlvbkl0ZW1LaW5kO1xuICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5UZXh0OiAgICAgICAgICByZXR1cm4gSy5UZXh0O1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5NZXRob2Q6ICAgICAgICByZXR1cm4gSy5NZXRob2Q7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLkZ1bmN0aW9uOiAgICAgIHJldHVybiBLLkZ1bmN0aW9uO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5Db25zdHJ1Y3RvcjogICByZXR1cm4gSy5Db25zdHJ1Y3RvcjtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuRmllbGQ6ICAgICAgICAgcmV0dXJuIEsuRmllbGQ7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLlZhcmlhYmxlOiAgICAgIHJldHVybiBLLlZhcmlhYmxlO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5DbGFzczogICAgICAgICByZXR1cm4gSy5DbGFzcztcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuSW50ZXJmYWNlOiAgICAgcmV0dXJuIEsuSW50ZXJmYWNlO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5Nb2R1bGU6ICAgICAgICByZXR1cm4gSy5Nb2R1bGU7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLlByb3BlcnR5OiAgICAgIHJldHVybiBLLlByb3BlcnR5O1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5LZXl3b3JkOiAgICAgICByZXR1cm4gSy5LZXl3b3JkO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5TbmlwcGV0OiAgICAgICByZXR1cm4gSy5TbmlwcGV0O1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5Db25zdGFudDogICAgICByZXR1cm4gSy5Db25zdGFudDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuU3RydWN0OiAgICAgICAgcmV0dXJuIEsuU3RydWN0O1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5UeXBlUGFyYW1ldGVyOiByZXR1cm4gSy5UeXBlUGFyYW1ldGVyO1xuICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSy5UZXh0O1xuICAgIH1cbn1cblxuZnVuY3Rpb24gbHNwQ29tcGxldGlvblRvTW9uYWNvKFxuICAgIGl0ZW06IENvbXBsZXRpb25JdGVtLFxuICAgIG1vZGVsOiBtb25hY28uZWRpdG9yLklUZXh0TW9kZWwsXG4gICAgcG9zaXRpb246IG1vbmFjby5Qb3NpdGlvbixcbik6IE1vbmFjb0NvbXBsZXRpb25JdGVtIHtcbiAgICBjb25zdCB3b3JkID0gbW9kZWwuZ2V0V29yZFVudGlsUG9zaXRpb24ocG9zaXRpb24pO1xuICAgIGxldCByYW5nZTogbW9uYWNvLklSYW5nZSA9IHtcbiAgICAgICAgc3RhcnRMaW5lTnVtYmVyOiBwb3NpdGlvbi5saW5lTnVtYmVyLFxuICAgICAgICBzdGFydENvbHVtbjogICAgIHdvcmQuc3RhcnRDb2x1bW4sXG4gICAgICAgIGVuZExpbmVOdW1iZXI6ICAgcG9zaXRpb24ubGluZU51bWJlcixcbiAgICAgICAgZW5kQ29sdW1uOiAgICAgICB3b3JkLmVuZENvbHVtbixcbiAgICB9O1xuICAgIGxldCBpbnNlcnRUZXh0ID0gaXRlbS5pbnNlcnRUZXh0ID8/IGl0ZW0ubGFiZWw7XG4gICAgY29uc3QgdGV4dEVkaXQgPSBpdGVtLnRleHRFZGl0IGFzIHsgcmFuZ2U/OiBMc3BSYW5nZTsgcmVwbGFjZT86IExzcFJhbmdlOyBpbnNlcnQ/OiBMc3BSYW5nZTsgbmV3VGV4dD86IHN0cmluZyB9IHwgdW5kZWZpbmVkO1xuICAgIGlmICh0ZXh0RWRpdCkge1xuICAgICAgICBjb25zdCByID0gdGV4dEVkaXQucmFuZ2UgPz8gdGV4dEVkaXQucmVwbGFjZSA/PyB0ZXh0RWRpdC5pbnNlcnQ7XG4gICAgICAgIGlmIChyKSByYW5nZSA9IGxzcFJhbmdlVG9Nb25hY28ocik7XG4gICAgICAgIGlmICh0eXBlb2YgdGV4dEVkaXQubmV3VGV4dCA9PT0gJ3N0cmluZycpIGluc2VydFRleHQgPSB0ZXh0RWRpdC5uZXdUZXh0O1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQ6IE1vbmFjb0NvbXBsZXRpb25JdGVtID0ge1xuICAgICAgICBsYWJlbDogICAgICAgICAgIGl0ZW0ubGFiZWwsXG4gICAgICAgIGtpbmQ6ICAgICAgICAgICAgbHNwQ29tcGxldGlvbktpbmQoaXRlbS5raW5kKSxcbiAgICAgICAgZGV0YWlsOiAgICAgICAgICBpdGVtLmRldGFpbCxcbiAgICAgICAgZG9jdW1lbnRhdGlvbjogICBpdGVtLmRvY3VtZW50YXRpb24gPyB7IHZhbHVlOiBtYXJrdXBUb1N0cmluZyhpdGVtLmRvY3VtZW50YXRpb24pLCBpc1RydXN0ZWQ6IGZhbHNlIH0gOiB1bmRlZmluZWQsXG4gICAgICAgIGluc2VydFRleHQsXG4gICAgICAgIGluc2VydFRleHRSdWxlczogaXRlbS5pbnNlcnRUZXh0Rm9ybWF0ID09PSBJbnNlcnRUZXh0Rm9ybWF0LlNuaXBwZXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtSW5zZXJ0VGV4dFJ1bGUuSW5zZXJ0QXNTbmlwcGV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICByYW5nZSxcbiAgICAgICAgc29ydFRleHQ6ICAgICAgICAgICAgc2RrUHJpb3JpdGlzZWRTb3J0VGV4dChpdGVtKSxcbiAgICAgICAgZmlsdGVyVGV4dDogICAgICAgICAgaXRlbS5maWx0ZXJUZXh0LFxuICAgICAgICBwcmVzZWxlY3Q6ICAgICAgICAgICBpdGVtLnByZXNlbGVjdCxcbiAgICAgICAgY29tbWl0Q2hhcmFjdGVyczogICAgaXRlbS5jb21taXRDaGFyYWN0ZXJzLFxuICAgICAgICBhZGRpdGlvbmFsVGV4dEVkaXRzOiBpdGVtLmFkZGl0aW9uYWxUZXh0RWRpdHM/Lm1hcCh0ZXh0RWRpdFRvTW9uYWNvKSxcbiAgICB9O1xuICAgIHJlc3VsdC5fbHNwID0gaXRlbTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFJhbmtzIERpcmlnaWJsZSBTREsgc3VnZ2VzdGlvbnMgKHtAY29kZSBvcmcuZWNsaXBzZS5kaXJpZ2libGUuc2RrLip9KSBhYm92ZSBldmVyeXRoaW5nIGVsc2UgYnlcbiAqIHByZWZpeGluZyB0aGUgc2VydmVyIHNvcnRUZXh0IHdpdGggYSBwcmlvcml0eSBidWNrZXQsIHByZXNlcnZpbmcgdGhlIHNlcnZlciBvcmRlciB3aXRoaW4gZWFjaCBidWNrZXQuXG4gKi9cbmZ1bmN0aW9uIHNka1ByaW9yaXRpc2VkU29ydFRleHQoaXRlbTogQ29tcGxldGlvbkl0ZW0pOiBzdHJpbmcge1xuICAgIGNvbnN0IGJhc2UgPSBpdGVtLnNvcnRUZXh0ID8/ICh0eXBlb2YgaXRlbS5sYWJlbCA9PT0gJ3N0cmluZycgPyBpdGVtLmxhYmVsIDogJycpO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gKGl0ZW0ubGFiZWxEZXRhaWxzICYmIHR5cGVvZiBpdGVtLmxhYmVsRGV0YWlscy5kZXNjcmlwdGlvbiA9PT0gJ3N0cmluZycpXG4gICAgICAgID8gaXRlbS5sYWJlbERldGFpbHMuZGVzY3JpcHRpb24gOiAnJztcbiAgICBjb25zdCBoYXlzdGFjayA9IGAke2l0ZW0uZGV0YWlsID8/ICcnfSAke2Rlc2NyaXB0aW9ufWA7XG4gICAgcmV0dXJuIGhheXN0YWNrLmluY2x1ZGVzKCdvcmcuZWNsaXBzZS5kaXJpZ2libGUuc2RrJykgPyBgMF8ke2Jhc2V9YCA6IGAxXyR7YmFzZX1gO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDb2RlIGFjdGlvbnMsIGNvbW1hbmRzLCByZWZhY3Rvci9nZW5lcmF0ZSwgd29ya3NwYWNlIGVkaXRzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBNb25hY28gY29tbWFuZCBpZCB1c2VkIHRvIGFwcGx5IGEgZGVmZXJyZWQgTFNQIGNvZGUgYWN0aW9uIHdoZW4gdGhlIHVzZXIgc2VsZWN0cyBpdC4gKi9cbmNvbnN0IEFQUExZX0FDVElPTl9DT01NQU5EID0gJ2RpcmlnaWJsZS5qYXZhLmFwcGx5Q29kZUFjdGlvbic7XG5cbi8qKiBWaXJ0dWFsIFVSSSBwcmVmaXggb2YgZWRpdG9yIG1vZGVsczsgc3RyaXBwaW5nIGl0IHlpZWxkcyB0aGUgSURFIHdvcmtzcGFjZSBwYXRoICgvd3MvcHJvai8uLi4pLiAqL1xuY29uc3QgVklSVFVBTF9GSUxFX1BSRUZJWCA9ICdmaWxlOi8vL3dvcmtzcGFjZSc7XG5cbnR5cGUgTHNwUmFuZ2UgPSB7IHN0YXJ0OiB7IGxpbmU6IG51bWJlcjsgY2hhcmFjdGVyOiBudW1iZXIgfTsgZW5kOiB7IGxpbmU6IG51bWJlcjsgY2hhcmFjdGVyOiBudW1iZXIgfSB9O1xuXG4vKiogTW9uYWNvIGNvbXBsZXRpb24gaXRlbSBjYXJyeWluZyB0aGUgb3JpZ2luYXRpbmcgTFNQIGl0ZW0gc28gcmVzb2x2ZSBjYW4gZmV0Y2ggaXRzIGltcG9ydCBlZGl0cy4gKi9cbnR5cGUgTW9uYWNvQ29tcGxldGlvbkl0ZW0gPSBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtICYgeyBfbHNwPzogQ29tcGxldGlvbkl0ZW0gfTtcblxuZnVuY3Rpb24gdGV4dEVkaXRUb01vbmFjbyhlZGl0OiBUZXh0RWRpdCk6IG1vbmFjby5sYW5ndWFnZXMuVGV4dEVkaXQge1xuICAgIHJldHVybiB7IHJhbmdlOiBsc3BSYW5nZVRvTW9uYWNvKGVkaXQucmFuZ2UpLCB0ZXh0OiBlZGl0Lm5ld1RleHQgfTtcbn1cblxuZnVuY3Rpb24gbW9uYWNvUmFuZ2VUb0xzcChyOiBtb25hY28uSVJhbmdlKTogTHNwUmFuZ2Uge1xuICAgIHJldHVybiB7XG4gICAgICAgIHN0YXJ0OiB7IGxpbmU6IHIuc3RhcnRMaW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiByLnN0YXJ0Q29sdW1uIC0gMSB9LFxuICAgICAgICBlbmQ6ICAgeyBsaW5lOiByLmVuZExpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHIuZW5kQ29sdW1uIC0gMSB9LFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIG1vbmFjb1NldmVyaXR5VG9Mc3Aoc2V2ZXJpdHk6IG1vbmFjby5NYXJrZXJTZXZlcml0eSk6IERpYWdub3N0aWNTZXZlcml0eSB7XG4gICAgc3dpdGNoIChzZXZlcml0eSkge1xuICAgICAgICBjYXNlIG1vbmFjby5NYXJrZXJTZXZlcml0eS5FcnJvcjogICByZXR1cm4gRGlhZ25vc3RpY1NldmVyaXR5LkVycm9yO1xuICAgICAgICBjYXNlIG1vbmFjby5NYXJrZXJTZXZlcml0eS5XYXJuaW5nOiByZXR1cm4gRGlhZ25vc3RpY1NldmVyaXR5Lldhcm5pbmc7XG4gICAgICAgIGNhc2UgbW9uYWNvLk1hcmtlclNldmVyaXR5LkluZm86ICAgIHJldHVybiBEaWFnbm9zdGljU2V2ZXJpdHkuSW5mb3JtYXRpb247XG4gICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBEaWFnbm9zdGljU2V2ZXJpdHkuSGludDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIG1hcmtlclRvTHNwRGlhZ25vc3RpYyhtOiBtb25hY28uZWRpdG9yLklNYXJrZXJEYXRhKTogRGlhZ25vc3RpYyB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcmFuZ2U6ICAgIHsgc3RhcnQ6IHsgbGluZTogbS5zdGFydExpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IG0uc3RhcnRDb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICAgICAgICAgIGVuZDogICB7IGxpbmU6IG0uZW5kTGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogbS5lbmRDb2x1bW4gLSAxIH0gfSxcbiAgICAgICAgbWVzc2FnZTogIG0ubWVzc2FnZSxcbiAgICAgICAgc2V2ZXJpdHk6IG1vbmFjb1NldmVyaXR5VG9Mc3AobS5zZXZlcml0eSksXG4gICAgICAgIHNvdXJjZTogICBtLnNvdXJjZSxcbiAgICB9IGFzIERpYWdub3N0aWM7XG59XG5cbmZ1bmN0aW9uIGxzcENvZGVBY3Rpb25Ub01vbmFjbyhhY3Rpb246IENvZGVBY3Rpb24gfCBDb21tYW5kKTogbW9uYWNvLmxhbmd1YWdlcy5Db2RlQWN0aW9uIHtcbiAgICBjb25zdCBpc0NvbW1hbmQgPSB0eXBlb2YgKGFjdGlvbiBhcyBDb21tYW5kKS5jb21tYW5kID09PSAnc3RyaW5nJztcbiAgICBjb25zdCB0aXRsZSA9IGFjdGlvbi50aXRsZVxuICAgICAgICA/PyAoaXNDb21tYW5kID8gKGFjdGlvbiBhcyBDb21tYW5kKS5jb21tYW5kIDogKGFjdGlvbiBhcyBDb2RlQWN0aW9uKS5jb21tYW5kPy50aXRsZSlcbiAgICAgICAgPz8gJ0FjdGlvbic7XG4gICAgY29uc3Qga2luZCA9IGlzQ29tbWFuZCA/ICdxdWlja2ZpeCcgOiAoKGFjdGlvbiBhcyBDb2RlQWN0aW9uKS5raW5kID8/ICdxdWlja2ZpeCcpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHRpdGxlLFxuICAgICAgICBraW5kLFxuICAgICAgICBkaWFnbm9zdGljczogW10sXG4gICAgICAgIGlzUHJlZmVycmVkOiAoYWN0aW9uIGFzIENvZGVBY3Rpb24pLmlzUHJlZmVycmVkLFxuICAgICAgICAvLyBBcHBseSBsYXppbHkgdGhyb3VnaCBvdXIgY29tbWFuZCBzbyB3ZSBjYW4gcmVzb2x2ZSwgcnVuIHNlcnZlciBjb21tYW5kcyBhbmQgYXBwbHkgZWRpdHMgdW5pZm9ybWx5LlxuICAgICAgICBjb21tYW5kOiB7IGlkOiBBUFBMWV9BQ1RJT05fQ09NTUFORCwgdGl0bGUsIGFyZ3VtZW50czogW2FjdGlvbl0gfSxcbiAgICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBhcHBseUNvZGVBY3Rpb24oYWN0aW9uOiBDb2RlQWN0aW9uIHwgQ29tbWFuZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghX2Nvbm4pIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIChhY3Rpb24gYXMgQ29tbWFuZCkuY29tbWFuZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGF3YWl0IHJ1blNlcnZlckNvbW1hbmQoYWN0aW9uIGFzIENvbW1hbmQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXNvbHZlZCA9IGFjdGlvbiBhcyBDb2RlQWN0aW9uO1xuICAgICAgICBpZiAoIXJlc29sdmVkLmVkaXQgJiYgKHJlc29sdmVkIGFzIHsgZGF0YT86IHVua25vd24gfSkuZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXNvbHZlZCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCdjb2RlQWN0aW9uL3Jlc29sdmUnLCByZXNvbHZlZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc29sdmVkLmVkaXQpIGFwcGx5V29ya3NwYWNlRWRpdChyZXNvbHZlZC5lZGl0KTtcbiAgICAgICAgaWYgKHJlc29sdmVkLmNvbW1hbmQpIGF3YWl0IHJ1blNlcnZlckNvbW1hbmQocmVzb2x2ZWQuY29tbWFuZCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tqYXZhLWxzcF0gY29kZSBhY3Rpb24gZmFpbGVkOicsIChlIGFzIEVycm9yKT8ubWVzc2FnZSA/PyBlKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGlzV29ya3NwYWNlRWRpdCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFdvcmtzcGFjZUVkaXQge1xuICAgIHJldHVybiAhIXZhbHVlICYmICghISh2YWx1ZSBhcyBXb3Jrc3BhY2VFZGl0KS5jaGFuZ2VzIHx8ICEhKHZhbHVlIGFzIFdvcmtzcGFjZUVkaXQpLmRvY3VtZW50Q2hhbmdlcyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1blNlcnZlckNvbW1hbmQoY21kOiBDb21tYW5kKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFfY29ubiB8fCAhY21kPy5jb21tYW5kKSByZXR1cm47XG4gICAgaWYgKEdFTkVSQVRFW2NtZC5jb21tYW5kXSkge1xuICAgICAgICBhd2FpdCBydW5HZW5lcmF0ZShjbWQuY29tbWFuZCwgY21kLmFyZ3VtZW50cyA/PyBbXSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3dvcmtzcGFjZS9leGVjdXRlQ29tbWFuZCcsIHsgY29tbWFuZDogY21kLmNvbW1hbmQsIGFyZ3VtZW50czogY21kLmFyZ3VtZW50cyA/PyBbXSB9KTtcbiAgICBpZiAoaXNXb3Jrc3BhY2VFZGl0KHJlc3VsdCkpIGFwcGx5V29ya3NwYWNlRWRpdChyZXN1bHQpO1xufVxuXG5pbnRlcmZhY2UgR2VuZXJhdGVTcGVjIHtcbiAgICBsYWJlbDogc3RyaW5nO1xuICAgIHN0YXR1czogc3RyaW5nO1xuICAgIGdlbmVyYXRlOiBzdHJpbmc7XG4gICAgbWVtYmVyczogKHN0YXR1czogYW55KSA9PiBBcnJheTx7IGxhYmVsOiBzdHJpbmc7IHJlZjogYW55IH0+O1xuICAgIGJ1aWxkQXJnczogKHByb21wdEFyZ3M6IGFueVtdLCBzdGF0dXM6IGFueSwgc2VsZWN0ZWQ6IGFueVtdKSA9PiBhbnlbXTtcbn1cblxuLyoqIE1lbWJlci1uYW1lZCBmaWVsZHMgXHUyMTkyIHBpY2tlciBsYWJlbHMuICovXG5mdW5jdGlvbiBmaWVsZExhYmVsKGY6IGFueSk6IHN0cmluZyB7XG4gICAgY29uc3QgbmFtZSA9IGY/Lm5hbWUgPz8gZj8uZmllbGROYW1lID8/ICcnO1xuICAgIGNvbnN0IHR5cGUgPSBmPy50eXBlID8/IGY/LnR5cGVOYW1lO1xuICAgIHJldHVybiB0eXBlID8gYCR7bmFtZX06ICR7dHlwZX1gIDogYCR7bmFtZX1gO1xufVxuXG4vKipcbiAqIFRoZSBKRFQuTFMgc291cmNlLWdlbmVyYXRpb24gY29tbWFuZHMgKGNvbnN0cnVjdG9ycywgZ2V0dGVycy9zZXR0ZXJzLCB0b1N0cmluZywgaGFzaENvZGUvZXF1YWxzKS5cbiAqIEVhY2ggbWFwcyB0aGUgY2xpZW50IFwiKlByb21wdFwiIGNvbW1hbmQgdG8gdGhlIHNlcnZlciBzdGF0dXMgKyBnZW5lcmF0ZSBkZWxlZ2F0ZSBjb21tYW5kczsgdGhlIHN0YXR1c1xuICogY2FsbCB5aWVsZHMgdGhlIGNhbmRpZGF0ZSBmaWVsZHMgc2hvd24gaW4gdGhlIG1lbWJlciBwaWNrZXIsIHRoZSBnZW5lcmF0ZSBjYWxsIHJldHVybnMgdGhlIGVkaXQuXG4gKi9cbmNvbnN0IEdFTkVSQVRFOiBSZWNvcmQ8c3RyaW5nLCBHZW5lcmF0ZVNwZWM+ID0ge1xuICAgICdqYXZhLmFjdGlvbi5nZW5lcmF0ZUNvbnN0cnVjdG9yc1Byb21wdCc6IHtcbiAgICAgICAgbGFiZWw6ICdTZWxlY3QgZmllbGRzIGFuZCBjb25zdHJ1Y3RvcnMnLFxuICAgICAgICBzdGF0dXM6ICdqYXZhLmFjdGlvbi5jaGVja0NvbnN0cnVjdG9yc1N0YXR1cycsXG4gICAgICAgIGdlbmVyYXRlOiAnamF2YS5hY3Rpb24uZ2VuZXJhdGVDb25zdHJ1Y3RvcnMnLFxuICAgICAgICBtZW1iZXJzOiAocykgPT4gKHM/LmZpZWxkcyA/PyBbXSkubWFwKChmOiBhbnkpID0+ICh7IGxhYmVsOiBmaWVsZExhYmVsKGYpLCByZWY6IGYgfSkpLFxuICAgICAgICBidWlsZEFyZ3M6IChhcmdzLCBzLCBzZWwpID0+IFthcmdzWzBdLCB7IGNvbnN0cnVjdG9yczogcz8uY29uc3RydWN0b3JzID8/IFtdLCBmaWVsZHM6IHNlbC5tYXAobSA9PiBtLnJlZikgfV0sXG4gICAgfSxcbiAgICAnamF2YS5hY3Rpb24uZ2VuZXJhdGVUb1N0cmluZ1Byb21wdCc6IHtcbiAgICAgICAgbGFiZWw6ICdTZWxlY3QgZmllbGRzIHRvIGluY2x1ZGUgaW4gdG9TdHJpbmcoKScsXG4gICAgICAgIHN0YXR1czogJ2phdmEuYWN0aW9uLmNoZWNrVG9TdHJpbmdTdGF0dXMnLFxuICAgICAgICBnZW5lcmF0ZTogJ2phdmEuYWN0aW9uLmdlbmVyYXRlVG9TdHJpbmcnLFxuICAgICAgICBtZW1iZXJzOiAocykgPT4gKHM/LmZpZWxkcyA/PyBbXSkubWFwKChmOiBhbnkpID0+ICh7IGxhYmVsOiBmaWVsZExhYmVsKGYpLCByZWY6IGYgfSkpLFxuICAgICAgICBidWlsZEFyZ3M6IChhcmdzLCBfcywgc2VsKSA9PiBbYXJnc1swXSwgc2VsLm1hcChtID0+IG0ucmVmKV0sXG4gICAgfSxcbiAgICAnamF2YS5hY3Rpb24uaGFzaENvZGVFcXVhbHNQcm9tcHQnOiB7XG4gICAgICAgIGxhYmVsOiAnU2VsZWN0IGZpZWxkcyBmb3IgaGFzaENvZGUoKSBhbmQgZXF1YWxzKCknLFxuICAgICAgICBzdGF0dXM6ICdqYXZhLmFjdGlvbi5jaGVja0hhc2hDb2RlRXF1YWxzU3RhdHVzJyxcbiAgICAgICAgZ2VuZXJhdGU6ICdqYXZhLmFjdGlvbi5nZW5lcmF0ZUhhc2hDb2RlRXF1YWxzJyxcbiAgICAgICAgbWVtYmVyczogKHMpID0+IChzPy5maWVsZHMgPz8gW10pLm1hcCgoZjogYW55KSA9PiAoeyBsYWJlbDogZmllbGRMYWJlbChmKSwgcmVmOiBmIH0pKSxcbiAgICAgICAgYnVpbGRBcmdzOiAoYXJncywgX3MsIHNlbCkgPT4gW2FyZ3NbMF0sIHNlbC5tYXAobSA9PiBtLnJlZiksIGZhbHNlXSxcbiAgICB9LFxuICAgICdqYXZhLmFjdGlvbi5nZW5lcmF0ZUFjY2Vzc29yc1Byb21wdCc6IHtcbiAgICAgICAgbGFiZWw6ICdTZWxlY3QgZmllbGRzIHRvIGdlbmVyYXRlIGdldHRlcnMgYW5kIHNldHRlcnMnLFxuICAgICAgICBzdGF0dXM6ICdqYXZhLmFjdGlvbi5jaGVja0FjY2Vzc29yc1N0YXR1cycsXG4gICAgICAgIGdlbmVyYXRlOiAnamF2YS5hY3Rpb24uZ2VuZXJhdGVBY2Nlc3NvcnMnLFxuICAgICAgICBtZW1iZXJzOiAocykgPT4gKHM/LmFjY2Vzc29ycyA/PyBzID8/IFtdKS5tYXAoKGE6IGFueSkgPT4gKHsgbGFiZWw6IGZpZWxkTGFiZWwoYSksIHJlZjogYSB9KSksXG4gICAgICAgIGJ1aWxkQXJnczogKGFyZ3MsIF9zLCBzZWwpID0+IFthcmdzWzBdLCBzZWwubWFwKG0gPT4gbS5yZWYpXSxcbiAgICB9LFxufTtcblxuYXN5bmMgZnVuY3Rpb24gcnVuR2VuZXJhdGUocHJvbXB0SWQ6IHN0cmluZywgYXJnczogYW55W10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIV9jb25uKSByZXR1cm47XG4gICAgY29uc3Qgc3BlYyA9IEdFTkVSQVRFW3Byb21wdElkXTtcbiAgICBjb25zdCBzdGF0dXMgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgnd29ya3NwYWNlL2V4ZWN1dGVDb21tYW5kJywgeyBjb21tYW5kOiBzcGVjLnN0YXR1cywgYXJndW1lbnRzOiBhcmdzIH0pO1xuICAgIGlmICghc3RhdHVzKSByZXR1cm47XG4gICAgY29uc3QgbWVtYmVycyA9IHNwZWMubWVtYmVycyhzdGF0dXMpO1xuICAgIGxldCBzZWxlY3RlZCA9IG1lbWJlcnM7XG4gICAgY29uc3QgcGlja2VyID0gKGdsb2JhbFRoaXMgYXMgYW55KS5qYXZhTHNwTWVtYmVyUGlja2VyO1xuICAgIGlmIChtZW1iZXJzLmxlbmd0aCAmJiB0eXBlb2YgcGlja2VyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIGNvbnN0IGNob3Nlbjogc3RyaW5nW10gfCBudWxsID0gYXdhaXQgcGlja2VyKHNwZWMubGFiZWwsIG1lbWJlcnMubWFwKG0gPT4gbS5sYWJlbCkpO1xuICAgICAgICBpZiAoY2hvc2VuID09PSBudWxsKSByZXR1cm47IC8vIHVzZXIgY2FuY2VsbGVkIHRoZSBkaWFsb2dcbiAgICAgICAgc2VsZWN0ZWQgPSBtZW1iZXJzLmZpbHRlcihtID0+IGNob3Nlbi5pbmNsdWRlcyhtLmxhYmVsKSk7XG4gICAgfVxuICAgIGNvbnN0IGVkaXQgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgnd29ya3NwYWNlL2V4ZWN1dGVDb21tYW5kJywge1xuICAgICAgICBjb21tYW5kOiBzcGVjLmdlbmVyYXRlLFxuICAgICAgICBhcmd1bWVudHM6IHNwZWMuYnVpbGRBcmdzKGFyZ3MsIHN0YXR1cywgc2VsZWN0ZWQpLFxuICAgIH0pO1xuICAgIGlmIChpc1dvcmtzcGFjZUVkaXQoZWRpdCkpIGFwcGx5V29ya3NwYWNlRWRpdChlZGl0KTtcbn1cblxuLyoqIEdyb3VwcyBhIHdvcmtzcGFjZSBlZGl0J3MgdGV4dCBlZGl0cyBieSBkb2N1bWVudCBhbmQgYXBwbGllcyB0aGVtIGluIHBsYWNlIHRvIG9wZW4gTW9uYWNvIG1vZGVscy4gKi9cbmZ1bmN0aW9uIGFwcGx5V29ya3NwYWNlRWRpdChlZGl0OiBXb3Jrc3BhY2VFZGl0IHwgbnVsbCB8IHVuZGVmaW5lZCk6IHZvaWQge1xuICAgIGlmICghZWRpdCkgcmV0dXJuO1xuICAgIGNvbnN0IGJ5VXJpOiBSZWNvcmQ8c3RyaW5nLCBUZXh0RWRpdFtdPiA9IHt9O1xuICAgIGlmIChlZGl0LmNoYW5nZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCB1cmkgaW4gZWRpdC5jaGFuZ2VzKSBieVVyaVt1cmldID0gKGJ5VXJpW3VyaV0gPz8gW10pLmNvbmNhdChlZGl0LmNoYW5nZXNbdXJpXSk7XG4gICAgfVxuICAgIGlmIChlZGl0LmRvY3VtZW50Q2hhbmdlcykge1xuICAgICAgICBmb3IgKGNvbnN0IGRjIG9mIGVkaXQuZG9jdW1lbnRDaGFuZ2VzIGFzIGFueVtdKSB7XG4gICAgICAgICAgICBpZiAoZGM/LnRleHREb2N1bWVudD8udXJpICYmIEFycmF5LmlzQXJyYXkoZGMuZWRpdHMpKSB7XG4gICAgICAgICAgICAgICAgYnlVcmlbZGMudGV4dERvY3VtZW50LnVyaV0gPSAoYnlVcmlbZGMudGV4dERvY3VtZW50LnVyaV0gPz8gW10pLmNvbmNhdChkYy5lZGl0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZm9yIChjb25zdCB1cmkgaW4gYnlVcmkpIHtcbiAgICAgICAgY29uc3QgbW9kZWwgPSBtb25hY28uZWRpdG9yLmdldE1vZGVscygpLmZpbmQobSA9PiBtLnVyaS50b1N0cmluZygpID09PSB1cmkpO1xuICAgICAgICBpZiAoIW1vZGVsKSBjb250aW51ZTtcbiAgICAgICAgY29uc3Qgb3BzID0gYnlVcmlbdXJpXS5tYXAoZSA9PiAoeyByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhlLnJhbmdlKSwgdGV4dDogZS5uZXdUZXh0LCBmb3JjZU1vdmVNYXJrZXJzOiB0cnVlIH0pKTtcbiAgICAgICAgbW9kZWwucHVzaEVkaXRPcGVyYXRpb25zKFtdLCBvcHMsICgpID0+IG51bGwpO1xuICAgIH1cbn1cblxuLyoqIENvbnZlcnRzIGFuIExTUCB3b3Jrc3BhY2UgZWRpdCBpbnRvIHRoZSBNb25hY28gc2hhcGUgcmV0dXJuZWQgYnkgdGhlIHJlbmFtZSBwcm92aWRlci4gKi9cbmZ1bmN0aW9uIHdvcmtzcGFjZUVkaXRUb01vbmFjbyhlZGl0OiBXb3Jrc3BhY2VFZGl0IHwgbnVsbCk6IG1vbmFjby5sYW5ndWFnZXMuV29ya3NwYWNlRWRpdCB7XG4gICAgY29uc3QgZWRpdHM6IGFueVtdID0gW107XG4gICAgY29uc3QgcHVzaCA9ICh1cmk6IHN0cmluZywgbGlzdDogVGV4dEVkaXRbXSkgPT4ge1xuICAgICAgICBmb3IgKGNvbnN0IGUgb2YgbGlzdCkge1xuICAgICAgICAgICAgZWRpdHMucHVzaCh7IHJlc291cmNlOiBtb25hY28uVXJpLnBhcnNlKHVyaSksIHRleHRFZGl0OiB7IHJhbmdlOiBsc3BSYW5nZVRvTW9uYWNvKGUucmFuZ2UpLCB0ZXh0OiBlLm5ld1RleHQgfSwgdmVyc2lvbklkOiB1bmRlZmluZWQgfSk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGlmIChlZGl0Py5jaGFuZ2VzKSB7XG4gICAgICAgIGZvciAoY29uc3QgdXJpIGluIGVkaXQuY2hhbmdlcykgcHVzaCh1cmksIGVkaXQuY2hhbmdlc1t1cmldKTtcbiAgICB9XG4gICAgaWYgKGVkaXQ/LmRvY3VtZW50Q2hhbmdlcykge1xuICAgICAgICBmb3IgKGNvbnN0IGRjIG9mIGVkaXQuZG9jdW1lbnRDaGFuZ2VzIGFzIGFueVtdKSB7XG4gICAgICAgICAgICBpZiAoZGM/LnRleHREb2N1bWVudD8udXJpICYmIEFycmF5LmlzQXJyYXkoZGMuZWRpdHMpKSBwdXNoKGRjLnRleHREb2N1bWVudC51cmksIGRjLmVkaXRzKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4geyBlZGl0cyB9O1xufVxuXG5mdW5jdGlvbiBqZHRsc1NldHRpbmdzKCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGphdmE6IHtcbiAgICAgICAgICAgIGltcG9ydDoge1xuICAgICAgICAgICAgICAgIG1hdmVuOiAgICAgIHsgZW5hYmxlZDogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIGdyYWRsZTogICAgIHsgZW5hYmxlZDogZmFsc2UgfSxcbiAgICAgICAgICAgICAgICBleGNsdXNpb25zOiBbJyoqL25vZGVfbW9kdWxlcy8qKicsICcqKi8ubWV0YWRhdGEvKionLCAnKiovYXJjaGV0eXBlLXJlc291cmNlcy8qKiddLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGF1dG9idWlsZDogeyBlbmFibGVkOiB0cnVlIH0sXG4gICAgICAgICAgICBjb21wbGV0aW9uOiB7XG4gICAgICAgICAgICAgICAgb3ZlcndyaXRlOiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgZ3Vlc3NNZXRob2RBcmd1bWVudHM6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGZpbHRlcmVkVHlwZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgJ2NvbS5zdW4uKicsICdzdW4uKicsICdqZGsuKicsXG4gICAgICAgICAgICAgICAgICAgICdvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuKicsXG4gICAgICAgICAgICAgICAgICAgICdvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLionLFxuICAgICAgICAgICAgICAgICAgICAnb3JnLmVjbGlwc2Uub3NnaS5pbnRlcm5hbC4qJyxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIGltcG9ydE9yZGVyOiBbJ2phdmEnLCAnamF2YXgnLCAnb3JnJywgJ2NvbScsICcnXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzaWduYXR1cmVIZWxwOiAgeyBlbmFibGVkOiB0cnVlIH0sXG4gICAgICAgICAgICBmb3JtYXQ6ICAgICAgICAgeyBlbmFibGVkOiB0cnVlIH0sXG4gICAgICAgICAgICBzYXZlQWN0aW9uczogICAgeyBvcmdhbml6ZUltcG9ydHM6IGZhbHNlIH0sXG4gICAgICAgIH0sXG4gICAgfTtcbn1cbiIsICIvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSAyMDI0IFR5cGVGb3ggYW5kIG90aGVycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExJQ0VOU0UgaW4gdGhlIHBhY2thZ2Ugcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5pbXBvcnQgeyBEaXNwb3NhYmxlIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuXG5leHBvcnQgY2xhc3MgRGlzcG9zYWJsZUNvbGxlY3Rpb24gaW1wbGVtZW50cyBEaXNwb3NhYmxlIHtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGlzcG9zYWJsZXM6IERpc3Bvc2FibGVbXSA9IFtdO1xuXG4gICAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICAgICAgd2hpbGUgKHRoaXMuZGlzcG9zYWJsZXMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmRpc3Bvc2FibGVzLnBvcCgpIS5kaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdXNoKGRpc3Bvc2FibGU6IERpc3Bvc2FibGUpOiBEaXNwb3NhYmxlIHtcbiAgICAgICAgY29uc3QgZGlzcG9zYWJsZXMgPSB0aGlzLmRpc3Bvc2FibGVzO1xuICAgICAgICBkaXNwb3NhYmxlcy5wdXNoKGRpc3Bvc2FibGUpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IGRpc3Bvc2FibGVzLmluZGV4T2YoZGlzcG9zYWJsZSk7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG59XG4iLCAiLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgMjAyNCBUeXBlRm94IGFuZCBvdGhlcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMSUNFTlNFIGluIHRoZSBwYWNrYWdlIHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuaW1wb3J0IHsgRGlzcG9zYWJsZSB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcbmltcG9ydCB0eXBlIHsgSUNvbm5lY3Rpb24gfSBmcm9tICcuLi9zZXJ2ZXIvY29ubmVjdGlvbi5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVdlYlNvY2tldCBleHRlbmRzIERpc3Bvc2FibGUge1xuICAgIHNlbmQoY29udGVudDogc3RyaW5nKTogdm9pZDtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIG9uTWVzc2FnZShjYjogKGRhdGE6IGFueSkgPT4gdm9pZCk6IHZvaWQ7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBvbkVycm9yKGNiOiAocmVhc29uOiBhbnkpID0+IHZvaWQpOiB2b2lkO1xuICAgIG9uQ2xvc2UoY2I6IChjb2RlOiBudW1iZXIsIHJlYXNvbjogc3RyaW5nKSA9PiB2b2lkKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJV2ViU29ja2V0Q29ubmVjdGlvbiBleHRlbmRzIElDb25uZWN0aW9uIHtcbiAgICByZWFkb25seSBzb2NrZXQ6IElXZWJTb2NrZXQ7XG59XG4iLCAiLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgMjAyNCBUeXBlRm94IGFuZCBvdGhlcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMSUNFTlNFIGluIHRoZSBwYWNrYWdlIHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuaW1wb3J0IHsgRGlzcG9zYWJsZSB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcbi8vIFRPRE86IFVzZSBlbnZpcm9ubWVudC1zcGVjaWZpYyBpbXBvcnRzICh2c2NvZGUtanNvbnJwYy9icm93c2VyIG9yIHZzY29kZS1qc29ucnBjL25vZGUpXG4vLyB3aGVuIHVwZ3JhZGluZyB0byB2c2NvZGUtanNvbnJwY0A5LngueC1uZXh0Llggd2hpY2ggc3VwcG9ydHMgcHJvcGVyIGV4cG9ydCBtYXBzXG5pbXBvcnQgeyB0eXBlIERhdGFDYWxsYmFjaywgQWJzdHJhY3RNZXNzYWdlUmVhZGVyLCBNZXNzYWdlUmVhZGVyIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuaW1wb3J0IHR5cGUgeyBJV2ViU29ja2V0IH0gZnJvbSAnLi9zb2NrZXQuanMnO1xuXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0TWVzc2FnZVJlYWRlciBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVJlYWRlciBpbXBsZW1lbnRzIE1lc3NhZ2VSZWFkZXIge1xuICAgIHByb3RlY3RlZCByZWFkb25seSBzb2NrZXQ6IElXZWJTb2NrZXQ7XG4gICAgcHJvdGVjdGVkIHN0YXRlOiAnaW5pdGlhbCcgfCAnbGlzdGVuaW5nJyB8ICdjbG9zZWQnID0gJ2luaXRpYWwnO1xuICAgIHByb3RlY3RlZCBjYWxsYmFjazogRGF0YUNhbGxiYWNrIHwgdW5kZWZpbmVkO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGV2ZW50czogQXJyYXk8eyBtZXNzYWdlPzogYW55LCBlcnJvcj86IGFueSB9PiA9IFtdO1xuXG4gICAgY29uc3RydWN0b3Ioc29ja2V0OiBJV2ViU29ja2V0KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuc29ja2V0ID0gc29ja2V0O1xuICAgICAgICB0aGlzLnNvY2tldC5vbk1lc3NhZ2UobWVzc2FnZSA9PlxuICAgICAgICAgICAgdGhpcy5yZWFkTWVzc2FnZShtZXNzYWdlKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLnNvY2tldC5vbkVycm9yKGVycm9yID0+XG4gICAgICAgICAgICB0aGlzLmZpcmVFcnJvcihlcnJvcilcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zb2NrZXQub25DbG9zZSgoY29kZSwgcmVhc29uKSA9PiB7XG4gICAgICAgICAgICBpZiAoY29kZSAhPT0gMTAwMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yOiBFcnJvciA9IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJycgKyBjb2RlLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgRXJyb3IgZHVyaW5nIHNvY2tldCByZWNvbm5lY3Q6IGNvZGUgPSAke2NvZGV9LCByZWFzb24gPSAke3JlYXNvbn1gXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmVFcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmZpcmVDbG9zZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBsaXN0ZW4oY2FsbGJhY2s6IERhdGFDYWxsYmFjayk6IERpc3Bvc2FibGUge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gJ2luaXRpYWwnKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gJ2xpc3RlbmluZyc7XG4gICAgICAgICAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgICAgICAgICB3aGlsZSAodGhpcy5ldmVudHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnQgPSB0aGlzLmV2ZW50cy5wb3AoKSE7XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50Lm1lc3NhZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlYWRNZXNzYWdlKGV2ZW50Lm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuZXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmVFcnJvcihldmVudC5lcnJvcik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlQ2xvc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jYWxsYmFjayA9PT0gY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9ICdpbml0aWFsJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjayA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgZGlzcG9zZSgpIHtcbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLnN0YXRlID0gJ2luaXRpYWwnO1xuICAgICAgICB0aGlzLmNhbGxiYWNrID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmV2ZW50cy5zcGxpY2UoMCwgdGhpcy5ldmVudHMubGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHByb3RlY3RlZCByZWFkTWVzc2FnZShtZXNzYWdlOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09ICdpbml0aWFsJykge1xuICAgICAgICAgICAgdGhpcy5ldmVudHMuc3BsaWNlKDAsIDAsIHsgbWVzc2FnZSB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlID09PSAnbGlzdGVuaW5nJykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNhbGxiYWNrIShkYXRhKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yOiBFcnJvciA9IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJycgKyA0MDAsXG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBFcnJvciBkdXJpbmcgbWVzc2FnZSBwYXJzaW5nLCByZWFzb24gPSAke3R5cGVvZiBlcnIgPT09ICdvYmplY3QnID8gKGVyciBhcyBhbnkpLm1lc3NhZ2UgOiAndW5rbm93bid9YFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZmlyZUVycm9yKGVycm9yOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09ICdpbml0aWFsJykge1xuICAgICAgICAgICAgdGhpcy5ldmVudHMuc3BsaWNlKDAsIDAsIHsgZXJyb3IgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZSA9PT0gJ2xpc3RlbmluZycpIHtcbiAgICAgICAgICAgIHN1cGVyLmZpcmVFcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZmlyZUNsb3NlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gJ2luaXRpYWwnKSB7XG4gICAgICAgICAgICB0aGlzLmV2ZW50cy5zcGxpY2UoMCwgMCwge30pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUgPT09ICdsaXN0ZW5pbmcnKSB7XG4gICAgICAgICAgICBzdXBlci5maXJlQ2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0YXRlID0gJ2Nsb3NlZCc7XG4gICAgfVxufVxuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjQgVHlwZUZveCBhbmQgb3RoZXJzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTElDRU5TRSBpbiB0aGUgcGFja2FnZSByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbmltcG9ydCB7IE1lc3NhZ2UgfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG5pbXBvcnQgeyBBYnN0cmFjdE1lc3NhZ2VXcml0ZXIsIE1lc3NhZ2VXcml0ZXIgfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG5pbXBvcnQgdHlwZSB7IElXZWJTb2NrZXQgfSBmcm9tICcuL3NvY2tldC5qcyc7XG5cbmV4cG9ydCBjbGFzcyBXZWJTb2NrZXRNZXNzYWdlV3JpdGVyIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlV3JpdGVyIGltcGxlbWVudHMgTWVzc2FnZVdyaXRlciB7XG4gICAgcHJvdGVjdGVkIGVycm9yQ291bnQgPSAwO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBzb2NrZXQ6IElXZWJTb2NrZXQ7XG5cbiAgICBjb25zdHJ1Y3Rvcihzb2NrZXQ6IElXZWJTb2NrZXQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7XG4gICAgfVxuXG4gICAgZW5kKCk6IHZvaWQge1xuICAgIH1cblxuICAgIGFzeW5jIHdyaXRlKG1zZzogTWVzc2FnZSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgY29udGVudCA9IEpTT04uc3RyaW5naWZ5KG1zZyk7XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKGNvbnRlbnQpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmVycm9yQ291bnQrKztcbiAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGUsIG1zZywgdGhpcy5lcnJvckNvdW50KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICIvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSAyMDI0IFR5cGVGb3ggYW5kIG90aGVycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExJQ0VOU0UgaW4gdGhlIHBhY2thZ2Ugcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5pbXBvcnQgdHlwZSB7IE1lc3NhZ2VDb25uZWN0aW9uLCBMb2dnZXIgfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG5pbXBvcnQgeyBjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcbmltcG9ydCB0eXBlIHsgSVdlYlNvY2tldCB9IGZyb20gJy4vc29ja2V0LmpzJztcbmltcG9ydCB7IFdlYlNvY2tldE1lc3NhZ2VSZWFkZXIgfSBmcm9tICcuL3JlYWRlci5qcyc7XG5pbXBvcnQgeyBXZWJTb2NrZXRNZXNzYWdlV3JpdGVyIH0gZnJvbSAnLi93cml0ZXIuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlV2ViU29ja2V0Q29ubmVjdGlvbihzb2NrZXQ6IElXZWJTb2NrZXQsIGxvZ2dlcjogTG9nZ2VyKTogTWVzc2FnZUNvbm5lY3Rpb24ge1xuICAgIGNvbnN0IG1lc3NhZ2VSZWFkZXIgPSBuZXcgV2ViU29ja2V0TWVzc2FnZVJlYWRlcihzb2NrZXQpO1xuICAgIGNvbnN0IG1lc3NhZ2VXcml0ZXIgPSBuZXcgV2ViU29ja2V0TWVzc2FnZVdyaXRlcihzb2NrZXQpO1xuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbihtZXNzYWdlUmVhZGVyLCBtZXNzYWdlV3JpdGVyLCBsb2dnZXIpO1xuICAgIGNvbm5lY3Rpb24ub25DbG9zZSgoKSA9PiBjb25uZWN0aW9uLmRpc3Bvc2UoKSk7XG4gICAgcmV0dXJuIGNvbm5lY3Rpb247XG59XG4iLCAiLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgMjAyNCBUeXBlRm94IGFuZCBvdGhlcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMSUNFTlNFIGluIHRoZSBwYWNrYWdlIHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuaW1wb3J0IHR5cGUgeyBNZXNzYWdlQ29ubmVjdGlvbiwgTG9nZ2VyIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuaW1wb3J0IHsgY3JlYXRlV2ViU29ja2V0Q29ubmVjdGlvbiB9IGZyb20gJy4vc29ja2V0L2Nvbm5lY3Rpb24uanMnO1xuaW1wb3J0IHR5cGUgeyBJV2ViU29ja2V0IH0gZnJvbSAnLi9zb2NrZXQvc29ja2V0LmpzJztcbmltcG9ydCB7IENvbnNvbGVMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBsaXN0ZW4ob3B0aW9uczoge1xuICAgIHdlYlNvY2tldDogV2ViU29ja2V0O1xuICAgIGxvZ2dlcj86IExvZ2dlcjtcbiAgICBvbkNvbm5lY3Rpb246IChjb25uZWN0aW9uOiBNZXNzYWdlQ29ubmVjdGlvbikgPT4gdm9pZDtcbn0pIHtcbiAgICBjb25zdCB7IHdlYlNvY2tldCwgb25Db25uZWN0aW9uIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IGxvZ2dlciA9IG9wdGlvbnMubG9nZ2VyIHx8IG5ldyBDb25zb2xlTG9nZ2VyKCk7XG4gICAgd2ViU29ja2V0Lm9ub3BlbiA9ICgpID0+IHtcbiAgICAgICAgY29uc3Qgc29ja2V0ID0gdG9Tb2NrZXQod2ViU29ja2V0KTtcbiAgICAgICAgY29uc3QgY29ubmVjdGlvbiA9IGNyZWF0ZVdlYlNvY2tldENvbm5lY3Rpb24oc29ja2V0LCBsb2dnZXIpO1xuICAgICAgICBvbkNvbm5lY3Rpb24oY29ubmVjdGlvbik7XG4gICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvU29ja2V0KHdlYlNvY2tldDogV2ViU29ja2V0KTogSVdlYlNvY2tldCB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc2VuZDogY29udGVudCA9PiB3ZWJTb2NrZXQuc2VuZChjb250ZW50KSxcbiAgICAgICAgb25NZXNzYWdlOiBjYiA9PiB7XG4gICAgICAgICAgICB3ZWJTb2NrZXQub25tZXNzYWdlID0gZXZlbnQgPT4gY2IoZXZlbnQuZGF0YSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uRXJyb3I6IGNiID0+IHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICB3ZWJTb2NrZXQub25lcnJvciA9IChldmVudDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5oYXNPd24oZXZlbnQsICdtZXNzYWdlJykpIHtcbiAgICAgICAgICAgICAgICAgICAgY2IoZXZlbnQubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgb25DbG9zZTogY2IgPT4ge1xuICAgICAgICAgICAgd2ViU29ja2V0Lm9uY2xvc2UgPSBldmVudCA9PiBjYihldmVudC5jb2RlLCBldmVudC5yZWFzb24pO1xuICAgICAgICB9LFxuICAgICAgICBkaXNwb3NlOiAoKSA9PiB3ZWJTb2NrZXQuY2xvc2UoKVxuICAgIH07XG59XG4iLCAiLypcbiAqIENvcHlyaWdodCAoYykgMjAxMC0yMDI2IEVjbGlwc2UgRGlyaWdpYmxlIGNvbnRyaWJ1dG9yc1xuICpcbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZVxuICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjIuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjIwLmh0bWxcbiAqXG4gKiBTUERYLUZpbGVDb3B5cmlnaHRUZXh0OiBFY2xpcHNlIERpcmlnaWJsZSBjb250cmlidXRvcnMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjBcbiAqL1xuXG4vKipcbiAqIExhenkgUHJveHkgc2hpbSBmb3IgTW9uYWNvIEVkaXRvciBsb2FkZWQgdmlhIEFNRC5cbiAqXG4gKiBlZGl0b3IuanMgc2V0cyBnbG9iYWxUaGlzLm1vbmFjbyBpbnNpZGUgdGhlIEFNRCByZXF1aXJlKCkgY2FsbGJhY2ssIGJlZm9yZSBhbnlcbiAqIEphdmFMc3BDbGllbnRMaWIuY29ubmVjdCgpIGNhbGwuIEFsbCBwcm9wZXJ0eSBhY2Nlc3NlcyBnbyB0aHJvdWdoIFByb3h5LmdldCgpIHRyYXBzXG4gKiBzbyB0aGV5IHJlc29sdmUgYWdhaW5zdCB0aGUgbGl2ZSB3aW5kb3cubW9uYWNvIGF0IGNhbGwgdGltZSwgbm90IGF0IGJ1bmRsZSBsb2FkIHRpbWUuXG4gKlxuICogVHlwZVNjcmlwdCByZXNvbHZlcyB0eXBlcyBmcm9tIHRoZSByZWFsIG1vbmFjby1lZGl0b3IgZGV2RGVwZW5kZW5jeTsgZXNidWlsZCByZXBsYWNlc1xuICogdGhlIFwibW9uYWNvLWVkaXRvclwiIGltcG9ydCB3aXRoIHRoaXMgZmlsZSBhdCBidW5kbGUgdGltZSB2aWEgdGhlIGFsaWFzIG9wdGlvbi5cbiAqL1xuXG50eXBlIE0gPSB0eXBlb2YgaW1wb3J0KCdtb25hY28tZWRpdG9yJyk7XG5cbmZ1bmN0aW9uIG0oKTogTSB7XG4gICAgcmV0dXJuIChnbG9iYWxUaGlzIGFzIGFueSkubW9uYWNvIGFzIE07XG59XG5cbmZ1bmN0aW9uIG5zPFQgZXh0ZW5kcyBvYmplY3Q+KGdldHRlcjogKCkgPT4gVCk6IFQge1xuICAgIHJldHVybiBuZXcgUHJveHkoe30gYXMgVCwge1xuICAgICAgICBnZXQ6IChfLCBrKSA9PiAoZ2V0dGVyKCkgYXMgYW55KVtrIGFzIHN0cmluZ10sXG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGNsczxUPihnZXR0ZXI6ICgpID0+IFQpOiBUIHtcbiAgICByZXR1cm4gbmV3IFByb3h5KGZ1bmN0aW9uICgpIHt9IGFzIGFueSwge1xuICAgICAgICBjb25zdHJ1Y3Q6IChfLCBhcmdzKSA9PiBuZXcgKGdldHRlcigpIGFzIGFueSkoLi4uYXJncyksXG4gICAgICAgIGdldDogICAgICAgKF8sIGspICAgID0+IChnZXR0ZXIoKSBhcyBhbnkpW2sgYXMgc3RyaW5nXSxcbiAgICB9KSBhcyBUO1xufVxuXG5leHBvcnQgY29uc3QgZWRpdG9yICAgICAgICAgPSBucygoKSA9PiBtKCkuZWRpdG9yKTtcbmV4cG9ydCBjb25zdCBsYW5ndWFnZXMgICAgICA9IG5zKCgpID0+IG0oKS5sYW5ndWFnZXMpO1xuZXhwb3J0IGNvbnN0IE1hcmtlclNldmVyaXR5ID0gbnMoKCkgPT4gbSgpLk1hcmtlclNldmVyaXR5KTtcbmV4cG9ydCBjb25zdCBNYXJrZXJUYWcgICAgICA9IG5zKCgpID0+IChtKCkgYXMgYW55KS5NYXJrZXJUYWcpO1xuZXhwb3J0IGNvbnN0IFVyaSAgICAgICAgICAgID0gY2xzKCgpID0+IG0oKS5VcmkpO1xuZXhwb3J0IGNvbnN0IFJhbmdlICAgICAgICAgID0gY2xzKCgpID0+IG0oKS5SYW5nZSk7XG5leHBvcnQgY29uc3QgUG9zaXRpb24gICAgICAgPSBjbHMoKCkgPT4gbSgpLlBvc2l0aW9uKTtcbmV4cG9ydCBjb25zdCBTZWxlY3Rpb24gICAgICA9IGNscygoKSA9PiBtKCkuU2VsZWN0aW9uKTtcbmV4cG9ydCBjb25zdCBLZXlDb2RlICAgICAgICA9IG5zKCgpID0+IG0oKS5LZXlDb2RlKTtcbmV4cG9ydCBjb25zdCBLZXlNb2QgICAgICAgICA9IG5zKCgpID0+IG0oKS5LZXlNb2QpO1xuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbid1c2Ugc3RyaWN0JztcbmV4cG9ydCB2YXIgRG9jdW1lbnRVcmk7XG4oZnVuY3Rpb24gKERvY3VtZW50VXJpKSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZyc7XG4gICAgfVxuICAgIERvY3VtZW50VXJpLmlzID0gaXM7XG59KShEb2N1bWVudFVyaSB8fCAoRG9jdW1lbnRVcmkgPSB7fSkpO1xuZXhwb3J0IHZhciBVUkk7XG4oZnVuY3Rpb24gKFVSSSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnO1xuICAgIH1cbiAgICBVUkkuaXMgPSBpcztcbn0pKFVSSSB8fCAoVVJJID0ge30pKTtcbmV4cG9ydCB2YXIgaW50ZWdlcjtcbihmdW5jdGlvbiAoaW50ZWdlcikge1xuICAgIGludGVnZXIuTUlOX1ZBTFVFID0gLTIxNDc0ODM2NDg7XG4gICAgaW50ZWdlci5NQVhfVkFMVUUgPSAyMTQ3NDgzNjQ3O1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIGludGVnZXIuTUlOX1ZBTFVFIDw9IHZhbHVlICYmIHZhbHVlIDw9IGludGVnZXIuTUFYX1ZBTFVFO1xuICAgIH1cbiAgICBpbnRlZ2VyLmlzID0gaXM7XG59KShpbnRlZ2VyIHx8IChpbnRlZ2VyID0ge30pKTtcbmV4cG9ydCB2YXIgdWludGVnZXI7XG4oZnVuY3Rpb24gKHVpbnRlZ2VyKSB7XG4gICAgdWludGVnZXIuTUlOX1ZBTFVFID0gMDtcbiAgICB1aW50ZWdlci5NQVhfVkFMVUUgPSAyMTQ3NDgzNjQ3O1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIHVpbnRlZ2VyLk1JTl9WQUxVRSA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSB1aW50ZWdlci5NQVhfVkFMVUU7XG4gICAgfVxuICAgIHVpbnRlZ2VyLmlzID0gaXM7XG59KSh1aW50ZWdlciB8fCAodWludGVnZXIgPSB7fSkpO1xuLyoqXG4gKiBUaGUgUG9zaXRpb24gbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgUG9zaXRpb259IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIFBvc2l0aW9uO1xuKGZ1bmN0aW9uIChQb3NpdGlvbikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgUG9zaXRpb24gbGl0ZXJhbCBmcm9tIHRoZSBnaXZlbiBsaW5lIGFuZCBjaGFyYWN0ZXIuXG4gICAgICogQHBhcmFtIGxpbmUgVGhlIHBvc2l0aW9uJ3MgbGluZS5cbiAgICAgKiBAcGFyYW0gY2hhcmFjdGVyIFRoZSBwb3NpdGlvbidzIGNoYXJhY3Rlci5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobGluZSwgY2hhcmFjdGVyKSB7XG4gICAgICAgIGlmIChsaW5lID09PSBOdW1iZXIuTUFYX1ZBTFVFKSB7XG4gICAgICAgICAgICBsaW5lID0gdWludGVnZXIuTUFYX1ZBTFVFO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFyYWN0ZXIgPT09IE51bWJlci5NQVhfVkFMVUUpIHtcbiAgICAgICAgICAgIGNoYXJhY3RlciA9IHVpbnRlZ2VyLk1BWF9WQUxVRTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBsaW5lLCBjaGFyYWN0ZXIgfTtcbiAgICB9XG4gICAgUG9zaXRpb24uY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgUG9zaXRpb259IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgSXMudWludGVnZXIoY2FuZGlkYXRlLmxpbmUpICYmIElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS5jaGFyYWN0ZXIpO1xuICAgIH1cbiAgICBQb3NpdGlvbi5pcyA9IGlzO1xufSkoUG9zaXRpb24gfHwgKFBvc2l0aW9uID0ge30pKTtcbi8qKlxuICogVGhlIFJhbmdlIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIFJhbmdlfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBSYW5nZTtcbihmdW5jdGlvbiAoUmFuZ2UpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUob25lLCB0d28sIHRocmVlLCBmb3VyKSB7XG4gICAgICAgIGlmIChJcy51aW50ZWdlcihvbmUpICYmIElzLnVpbnRlZ2VyKHR3bykgJiYgSXMudWludGVnZXIodGhyZWUpICYmIElzLnVpbnRlZ2VyKGZvdXIpKSB7XG4gICAgICAgICAgICByZXR1cm4geyBzdGFydDogUG9zaXRpb24uY3JlYXRlKG9uZSwgdHdvKSwgZW5kOiBQb3NpdGlvbi5jcmVhdGUodGhyZWUsIGZvdXIpIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoUG9zaXRpb24uaXMob25lKSAmJiBQb3NpdGlvbi5pcyh0d28pKSB7XG4gICAgICAgICAgICByZXR1cm4geyBzdGFydDogb25lLCBlbmQ6IHR3byB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSYW5nZSNjcmVhdGUgY2FsbGVkIHdpdGggaW52YWxpZCBhcmd1bWVudHNbJHtvbmV9LCAke3R3b30sICR7dGhyZWV9LCAke2ZvdXJ9XWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIFJhbmdlLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIFJhbmdlfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIFBvc2l0aW9uLmlzKGNhbmRpZGF0ZS5zdGFydCkgJiYgUG9zaXRpb24uaXMoY2FuZGlkYXRlLmVuZCk7XG4gICAgfVxuICAgIFJhbmdlLmlzID0gaXM7XG59KShSYW5nZSB8fCAoUmFuZ2UgPSB7fSkpO1xuLyoqXG4gKiBUaGUgTG9jYXRpb24gbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgTG9jYXRpb259IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIExvY2F0aW9uO1xuKGZ1bmN0aW9uIChMb2NhdGlvbikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBMb2NhdGlvbiBsaXRlcmFsLlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIGxvY2F0aW9uJ3MgdXJpLlxuICAgICAqIEBwYXJhbSByYW5nZSBUaGUgbG9jYXRpb24ncyByYW5nZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodXJpLCByYW5nZSkge1xuICAgICAgICByZXR1cm4geyB1cmksIHJhbmdlIH07XG4gICAgfVxuICAgIExvY2F0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIExvY2F0aW9ufSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgKElzLnN0cmluZyhjYW5kaWRhdGUudXJpKSB8fCBJcy51bmRlZmluZWQoY2FuZGlkYXRlLnVyaSkpO1xuICAgIH1cbiAgICBMb2NhdGlvbi5pcyA9IGlzO1xufSkoTG9jYXRpb24gfHwgKExvY2F0aW9uID0ge30pKTtcbi8qKlxuICogVGhlIExvY2F0aW9uTGluayBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBMb2NhdGlvbkxpbmt9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIExvY2F0aW9uTGluaztcbihmdW5jdGlvbiAoTG9jYXRpb25MaW5rKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIExvY2F0aW9uTGluayBsaXRlcmFsLlxuICAgICAqIEBwYXJhbSB0YXJnZXRVcmkgVGhlIGRlZmluaXRpb24ncyB1cmkuXG4gICAgICogQHBhcmFtIHRhcmdldFJhbmdlIFRoZSBmdWxsIHJhbmdlIG9mIHRoZSBkZWZpbml0aW9uLlxuICAgICAqIEBwYXJhbSB0YXJnZXRTZWxlY3Rpb25SYW5nZSBUaGUgc3BhbiBvZiB0aGUgc3ltYm9sIGRlZmluaXRpb24gYXQgdGhlIHRhcmdldC5cbiAgICAgKiBAcGFyYW0gb3JpZ2luU2VsZWN0aW9uUmFuZ2UgVGhlIHNwYW4gb2YgdGhlIHN5bWJvbCBiZWluZyBkZWZpbmVkIGluIHRoZSBvcmlnaW5hdGluZyBzb3VyY2UgZmlsZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodGFyZ2V0VXJpLCB0YXJnZXRSYW5nZSwgdGFyZ2V0U2VsZWN0aW9uUmFuZ2UsIG9yaWdpblNlbGVjdGlvblJhbmdlKSB7XG4gICAgICAgIHJldHVybiB7IHRhcmdldFVyaSwgdGFyZ2V0UmFuZ2UsIHRhcmdldFNlbGVjdGlvblJhbmdlLCBvcmlnaW5TZWxlY3Rpb25SYW5nZSB9O1xuICAgIH1cbiAgICBMb2NhdGlvbkxpbmsuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgTG9jYXRpb25MaW5rfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS50YXJnZXRSYW5nZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS50YXJnZXRVcmkpXG4gICAgICAgICAgICAmJiBSYW5nZS5pcyhjYW5kaWRhdGUudGFyZ2V0U2VsZWN0aW9uUmFuZ2UpXG4gICAgICAgICAgICAmJiAoUmFuZ2UuaXMoY2FuZGlkYXRlLm9yaWdpblNlbGVjdGlvblJhbmdlKSB8fCBJcy51bmRlZmluZWQoY2FuZGlkYXRlLm9yaWdpblNlbGVjdGlvblJhbmdlKSk7XG4gICAgfVxuICAgIExvY2F0aW9uTGluay5pcyA9IGlzO1xufSkoTG9jYXRpb25MaW5rIHx8IChMb2NhdGlvbkxpbmsgPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29sb3IgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgQ29sb3J9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIENvbG9yO1xuKGZ1bmN0aW9uIChDb2xvcikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ29sb3IgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJlZCxcbiAgICAgICAgICAgIGdyZWVuLFxuICAgICAgICAgICAgYmx1ZSxcbiAgICAgICAgICAgIGFscGhhLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBDb2xvci5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBDb2xvcn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIElzLm51bWJlclJhbmdlKGNhbmRpZGF0ZS5yZWQsIDAsIDEpXG4gICAgICAgICAgICAmJiBJcy5udW1iZXJSYW5nZShjYW5kaWRhdGUuZ3JlZW4sIDAsIDEpXG4gICAgICAgICAgICAmJiBJcy5udW1iZXJSYW5nZShjYW5kaWRhdGUuYmx1ZSwgMCwgMSlcbiAgICAgICAgICAgICYmIElzLm51bWJlclJhbmdlKGNhbmRpZGF0ZS5hbHBoYSwgMCwgMSk7XG4gICAgfVxuICAgIENvbG9yLmlzID0gaXM7XG59KShDb2xvciB8fCAoQ29sb3IgPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29sb3JJbmZvcm1hdGlvbiBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBDb2xvckluZm9ybWF0aW9ufSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBDb2xvckluZm9ybWF0aW9uO1xuKGZ1bmN0aW9uIChDb2xvckluZm9ybWF0aW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDb2xvckluZm9ybWF0aW9uIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCBjb2xvcikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmFuZ2UsXG4gICAgICAgICAgICBjb2xvcixcbiAgICAgICAgfTtcbiAgICB9XG4gICAgQ29sb3JJbmZvcm1hdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBDb2xvckluZm9ybWF0aW9ufSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiBDb2xvci5pcyhjYW5kaWRhdGUuY29sb3IpO1xuICAgIH1cbiAgICBDb2xvckluZm9ybWF0aW9uLmlzID0gaXM7XG59KShDb2xvckluZm9ybWF0aW9uIHx8IChDb2xvckluZm9ybWF0aW9uID0ge30pKTtcbi8qKlxuICogVGhlIENvbG9yIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIENvbG9yUHJlc2VudGF0aW9ufSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBDb2xvclByZXNlbnRhdGlvbjtcbihmdW5jdGlvbiAoQ29sb3JQcmVzZW50YXRpb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENvbG9ySW5mb3JtYXRpb24gbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobGFiZWwsIHRleHRFZGl0LCBhZGRpdGlvbmFsVGV4dEVkaXRzKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICAgIHRleHRFZGl0LFxuICAgICAgICAgICAgYWRkaXRpb25hbFRleHRFZGl0cyxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgQ29sb3JQcmVzZW50YXRpb24uY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgQ29sb3JJbmZvcm1hdGlvbn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUubGFiZWwpXG4gICAgICAgICAgICAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS50ZXh0RWRpdCkgfHwgVGV4dEVkaXQuaXMoY2FuZGlkYXRlKSlcbiAgICAgICAgICAgICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLmFkZGl0aW9uYWxUZXh0RWRpdHMpIHx8IElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLmFkZGl0aW9uYWxUZXh0RWRpdHMsIFRleHRFZGl0LmlzKSk7XG4gICAgfVxuICAgIENvbG9yUHJlc2VudGF0aW9uLmlzID0gaXM7XG59KShDb2xvclByZXNlbnRhdGlvbiB8fCAoQ29sb3JQcmVzZW50YXRpb24gPSB7fSkpO1xuLyoqXG4gKiBBIHNldCBvZiBwcmVkZWZpbmVkIHJhbmdlIGtpbmRzLlxuICovXG5leHBvcnQgdmFyIEZvbGRpbmdSYW5nZUtpbmQ7XG4oZnVuY3Rpb24gKEZvbGRpbmdSYW5nZUtpbmQpIHtcbiAgICAvKipcbiAgICAgKiBGb2xkaW5nIHJhbmdlIGZvciBhIGNvbW1lbnRcbiAgICAgKi9cbiAgICBGb2xkaW5nUmFuZ2VLaW5kLkNvbW1lbnQgPSAnY29tbWVudCc7XG4gICAgLyoqXG4gICAgICogRm9sZGluZyByYW5nZSBmb3IgYW4gaW1wb3J0IG9yIGluY2x1ZGVcbiAgICAgKi9cbiAgICBGb2xkaW5nUmFuZ2VLaW5kLkltcG9ydHMgPSAnaW1wb3J0cyc7XG4gICAgLyoqXG4gICAgICogRm9sZGluZyByYW5nZSBmb3IgYSByZWdpb24gKGUuZy4gYCNyZWdpb25gKVxuICAgICAqL1xuICAgIEZvbGRpbmdSYW5nZUtpbmQuUmVnaW9uID0gJ3JlZ2lvbic7XG59KShGb2xkaW5nUmFuZ2VLaW5kIHx8IChGb2xkaW5nUmFuZ2VLaW5kID0ge30pKTtcbi8qKlxuICogVGhlIGZvbGRpbmcgcmFuZ2UgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgRm9sZGluZ1JhbmdlfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBGb2xkaW5nUmFuZ2U7XG4oZnVuY3Rpb24gKEZvbGRpbmdSYW5nZSkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgRm9sZGluZ1JhbmdlIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHN0YXJ0TGluZSwgZW5kTGluZSwgc3RhcnRDaGFyYWN0ZXIsIGVuZENoYXJhY3Rlciwga2luZCwgY29sbGFwc2VkVGV4dCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICBzdGFydExpbmUsXG4gICAgICAgICAgICBlbmRMaW5lXG4gICAgICAgIH07XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKHN0YXJ0Q2hhcmFjdGVyKSkge1xuICAgICAgICAgICAgcmVzdWx0LnN0YXJ0Q2hhcmFjdGVyID0gc3RhcnRDaGFyYWN0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzLmRlZmluZWQoZW5kQ2hhcmFjdGVyKSkge1xuICAgICAgICAgICAgcmVzdWx0LmVuZENoYXJhY3RlciA9IGVuZENoYXJhY3RlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXMuZGVmaW5lZChraW5kKSkge1xuICAgICAgICAgICAgcmVzdWx0LmtpbmQgPSBraW5kO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKGNvbGxhcHNlZFRleHQpKSB7XG4gICAgICAgICAgICByZXN1bHQuY29sbGFwc2VkVGV4dCA9IGNvbGxhcHNlZFRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgRm9sZGluZ1JhbmdlLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIEZvbGRpbmdSYW5nZX0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS5zdGFydExpbmUpICYmIElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS5zdGFydExpbmUpXG4gICAgICAgICAgICAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5zdGFydENoYXJhY3RlcikgfHwgSXMudWludGVnZXIoY2FuZGlkYXRlLnN0YXJ0Q2hhcmFjdGVyKSlcbiAgICAgICAgICAgICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLmVuZENoYXJhY3RlcikgfHwgSXMudWludGVnZXIoY2FuZGlkYXRlLmVuZENoYXJhY3RlcikpXG4gICAgICAgICAgICAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5raW5kKSB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLmtpbmQpKTtcbiAgICB9XG4gICAgRm9sZGluZ1JhbmdlLmlzID0gaXM7XG59KShGb2xkaW5nUmFuZ2UgfHwgKEZvbGRpbmdSYW5nZSA9IHt9KSk7XG4vKipcbiAqIFRoZSBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb259IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb247XG4oZnVuY3Rpb24gKERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24gbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobG9jYXRpb24sIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxvY2F0aW9uLFxuICAgICAgICAgICAgbWVzc2FnZVxuICAgICAgICB9O1xuICAgIH1cbiAgICBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb259IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgTG9jYXRpb24uaXMoY2FuZGlkYXRlLmxvY2F0aW9uKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLm1lc3NhZ2UpO1xuICAgIH1cbiAgICBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uLmlzID0gaXM7XG59KShEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uIHx8IChEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uID0ge30pKTtcbi8qKlxuICogVGhlIGRpYWdub3N0aWMncyBzZXZlcml0eS5cbiAqL1xuZXhwb3J0IHZhciBEaWFnbm9zdGljU2V2ZXJpdHk7XG4oZnVuY3Rpb24gKERpYWdub3N0aWNTZXZlcml0eSkge1xuICAgIC8qKlxuICAgICAqIFJlcG9ydHMgYW4gZXJyb3IuXG4gICAgICovXG4gICAgRGlhZ25vc3RpY1NldmVyaXR5LkVycm9yID0gMTtcbiAgICAvKipcbiAgICAgKiBSZXBvcnRzIGEgd2FybmluZy5cbiAgICAgKi9cbiAgICBEaWFnbm9zdGljU2V2ZXJpdHkuV2FybmluZyA9IDI7XG4gICAgLyoqXG4gICAgICogUmVwb3J0cyBhbiBpbmZvcm1hdGlvbi5cbiAgICAgKi9cbiAgICBEaWFnbm9zdGljU2V2ZXJpdHkuSW5mb3JtYXRpb24gPSAzO1xuICAgIC8qKlxuICAgICAqIFJlcG9ydHMgYSBoaW50LlxuICAgICAqL1xuICAgIERpYWdub3N0aWNTZXZlcml0eS5IaW50ID0gNDtcbn0pKERpYWdub3N0aWNTZXZlcml0eSB8fCAoRGlhZ25vc3RpY1NldmVyaXR5ID0ge30pKTtcbi8qKlxuICogVGhlIGRpYWdub3N0aWMgdGFncy5cbiAqXG4gKiBAc2luY2UgMy4xNS4wXG4gKi9cbmV4cG9ydCB2YXIgRGlhZ25vc3RpY1RhZztcbihmdW5jdGlvbiAoRGlhZ25vc3RpY1RhZykge1xuICAgIC8qKlxuICAgICAqIFVudXNlZCBvciB1bm5lY2Vzc2FyeSBjb2RlLlxuICAgICAqXG4gICAgICogQ2xpZW50cyBhcmUgYWxsb3dlZCB0byByZW5kZXIgZGlhZ25vc3RpY3Mgd2l0aCB0aGlzIHRhZyBmYWRlZCBvdXQgaW5zdGVhZCBvZiBoYXZpbmdcbiAgICAgKiBhbiBlcnJvciBzcXVpZ2dsZS5cbiAgICAgKi9cbiAgICBEaWFnbm9zdGljVGFnLlVubmVjZXNzYXJ5ID0gMTtcbiAgICAvKipcbiAgICAgKiBEZXByZWNhdGVkIG9yIG9ic29sZXRlIGNvZGUuXG4gICAgICpcbiAgICAgKiBDbGllbnRzIGFyZSBhbGxvd2VkIHRvIHJlbmRlcmVkIGRpYWdub3N0aWNzIHdpdGggdGhpcyB0YWcgc3RyaWtlIHRocm91Z2guXG4gICAgICovXG4gICAgRGlhZ25vc3RpY1RhZy5EZXByZWNhdGVkID0gMjtcbn0pKERpYWdub3N0aWNUYWcgfHwgKERpYWdub3N0aWNUYWcgPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29kZURlc2NyaXB0aW9uIG5hbWVzcGFjZSBwcm92aWRlcyBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIGRlc2NyaXB0aW9ucyBmb3IgZGlhZ25vc3RpYyBjb2Rlcy5cbiAqXG4gKiBAc2luY2UgMy4xNi4wXG4gKi9cbmV4cG9ydCB2YXIgQ29kZURlc2NyaXB0aW9uO1xuKGZ1bmN0aW9uIChDb2RlRGVzY3JpcHRpb24pIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLmhyZWYpO1xuICAgIH1cbiAgICBDb2RlRGVzY3JpcHRpb24uaXMgPSBpcztcbn0pKENvZGVEZXNjcmlwdGlvbiB8fCAoQ29kZURlc2NyaXB0aW9uID0ge30pKTtcbi8qKlxuICogVGhlIERpYWdub3N0aWMgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgRGlhZ25vc3RpY30gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgRGlhZ25vc3RpYztcbihmdW5jdGlvbiAoRGlhZ25vc3RpYykge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgRGlhZ25vc3RpYyBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgbWVzc2FnZSwgc2V2ZXJpdHksIGNvZGUsIHNvdXJjZSwgcmVsYXRlZEluZm9ybWF0aW9uKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IHJhbmdlLCBtZXNzYWdlIH07XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKHNldmVyaXR5KSkge1xuICAgICAgICAgICAgcmVzdWx0LnNldmVyaXR5ID0gc2V2ZXJpdHk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzLmRlZmluZWQoY29kZSkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5jb2RlID0gY29kZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXMuZGVmaW5lZChzb3VyY2UpKSB7XG4gICAgICAgICAgICByZXN1bHQuc291cmNlID0gc291cmNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKHJlbGF0ZWRJbmZvcm1hdGlvbikpIHtcbiAgICAgICAgICAgIHJlc3VsdC5yZWxhdGVkSW5mb3JtYXRpb24gPSByZWxhdGVkSW5mb3JtYXRpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgRGlhZ25vc3RpYy5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBEaWFnbm9zdGljfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSlcbiAgICAgICAgICAgICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSlcbiAgICAgICAgICAgICYmIElzLnN0cmluZyhjYW5kaWRhdGUubWVzc2FnZSlcbiAgICAgICAgICAgICYmIChJcy5udW1iZXIoY2FuZGlkYXRlLnNldmVyaXR5KSB8fCBJcy51bmRlZmluZWQoY2FuZGlkYXRlLnNldmVyaXR5KSlcbiAgICAgICAgICAgICYmIChJcy5pbnRlZ2VyKGNhbmRpZGF0ZS5jb2RlKSB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLmNvZGUpIHx8IElzLnVuZGVmaW5lZChjYW5kaWRhdGUuY29kZSkpXG4gICAgICAgICAgICAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5jb2RlRGVzY3JpcHRpb24pIHx8IChJcy5zdHJpbmcoKF9hID0gY2FuZGlkYXRlLmNvZGVEZXNjcmlwdGlvbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmhyZWYpKSlcbiAgICAgICAgICAgICYmIChJcy5zdHJpbmcoY2FuZGlkYXRlLnNvdXJjZSkgfHwgSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5zb3VyY2UpKVxuICAgICAgICAgICAgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUucmVsYXRlZEluZm9ybWF0aW9uKSB8fCBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS5yZWxhdGVkSW5mb3JtYXRpb24sIERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24uaXMpKTtcbiAgICB9XG4gICAgRGlhZ25vc3RpYy5pcyA9IGlzO1xufSkoRGlhZ25vc3RpYyB8fCAoRGlhZ25vc3RpYyA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb21tYW5kIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIENvbW1hbmR9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIENvbW1hbmQ7XG4oZnVuY3Rpb24gKENvbW1hbmQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENvbW1hbmQgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodGl0bGUsIGNvbW1hbmQsIC4uLmFyZ3MpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHsgdGl0bGUsIGNvbW1hbmQgfTtcbiAgICAgICAgaWYgKElzLmRlZmluZWQoYXJncykgJiYgYXJncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXN1bHQuYXJndW1lbnRzID0gYXJncztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBDb21tYW5kLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIENvbW1hbmR9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS50aXRsZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5jb21tYW5kKTtcbiAgICB9XG4gICAgQ29tbWFuZC5pcyA9IGlzO1xufSkoQ29tbWFuZCB8fCAoQ29tbWFuZCA9IHt9KSk7XG4vKipcbiAqIFRoZSBUZXh0RWRpdCBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSByZXBsYWNlLFxuICogaW5zZXJ0IGFuZCBkZWxldGUgZWRpdHMgbW9yZSBlYXNpbHkuXG4gKi9cbmV4cG9ydCB2YXIgVGV4dEVkaXQ7XG4oZnVuY3Rpb24gKFRleHRFZGl0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHJlcGxhY2UgdGV4dCBlZGl0LlxuICAgICAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2Ugb2YgdGV4dCB0byBiZSByZXBsYWNlZC5cbiAgICAgKiBAcGFyYW0gbmV3VGV4dCBUaGUgbmV3IHRleHQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVwbGFjZShyYW5nZSwgbmV3VGV4dCkge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgbmV3VGV4dCB9O1xuICAgIH1cbiAgICBUZXh0RWRpdC5yZXBsYWNlID0gcmVwbGFjZTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc2VydCB0ZXh0IGVkaXQuXG4gICAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBwb3NpdGlvbiB0byBpbnNlcnQgdGhlIHRleHQgYXQuXG4gICAgICogQHBhcmFtIG5ld1RleHQgVGhlIHRleHQgdG8gYmUgaW5zZXJ0ZWQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5zZXJ0KHBvc2l0aW9uLCBuZXdUZXh0KSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlOiB7IHN0YXJ0OiBwb3NpdGlvbiwgZW5kOiBwb3NpdGlvbiB9LCBuZXdUZXh0IH07XG4gICAgfVxuICAgIFRleHRFZGl0Lmluc2VydCA9IGluc2VydDtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZGVsZXRlIHRleHQgZWRpdC5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlIG9mIHRleHQgdG8gYmUgZGVsZXRlZC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkZWwocmFuZ2UpIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIG5ld1RleHQ6ICcnIH07XG4gICAgfVxuICAgIFRleHRFZGl0LmRlbCA9IGRlbDtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKVxuICAgICAgICAgICAgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5uZXdUZXh0KVxuICAgICAgICAgICAgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKTtcbiAgICB9XG4gICAgVGV4dEVkaXQuaXMgPSBpcztcbn0pKFRleHRFZGl0IHx8IChUZXh0RWRpdCA9IHt9KSk7XG5leHBvcnQgdmFyIENoYW5nZUFubm90YXRpb247XG4oZnVuY3Rpb24gKENoYW5nZUFubm90YXRpb24pIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUobGFiZWwsIG5lZWRzQ29uZmlybWF0aW9uLCBkZXNjcmlwdGlvbikge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB7IGxhYmVsIH07XG4gICAgICAgIGlmIChuZWVkc0NvbmZpcm1hdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQubmVlZHNDb25maXJtYXRpb24gPSBuZWVkc0NvbmZpcm1hdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVzY3JpcHRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgQ2hhbmdlQW5ub3RhdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5sYWJlbCkgJiZcbiAgICAgICAgICAgIChJcy5ib29sZWFuKGNhbmRpZGF0ZS5uZWVkc0NvbmZpcm1hdGlvbikgfHwgY2FuZGlkYXRlLm5lZWRzQ29uZmlybWF0aW9uID09PSB1bmRlZmluZWQpICYmXG4gICAgICAgICAgICAoSXMuc3RyaW5nKGNhbmRpZGF0ZS5kZXNjcmlwdGlvbikgfHwgY2FuZGlkYXRlLmRlc2NyaXB0aW9uID09PSB1bmRlZmluZWQpO1xuICAgIH1cbiAgICBDaGFuZ2VBbm5vdGF0aW9uLmlzID0gaXM7XG59KShDaGFuZ2VBbm5vdGF0aW9uIHx8IChDaGFuZ2VBbm5vdGF0aW9uID0ge30pKTtcbmV4cG9ydCB2YXIgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXI7XG4oZnVuY3Rpb24gKENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyKSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5zdHJpbmcoY2FuZGlkYXRlKTtcbiAgICB9XG4gICAgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMgPSBpcztcbn0pKENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyIHx8IChDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllciA9IHt9KSk7XG5leHBvcnQgdmFyIEFubm90YXRlZFRleHRFZGl0O1xuKGZ1bmN0aW9uIChBbm5vdGF0ZWRUZXh0RWRpdCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYW5ub3RhdGVkIHJlcGxhY2UgdGV4dCBlZGl0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSBvZiB0ZXh0IHRvIGJlIHJlcGxhY2VkLlxuICAgICAqIEBwYXJhbSBuZXdUZXh0IFRoZSBuZXcgdGV4dC5cbiAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiBUaGUgYW5ub3RhdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXBsYWNlKHJhbmdlLCBuZXdUZXh0LCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCBuZXdUZXh0LCBhbm5vdGF0aW9uSWQ6IGFubm90YXRpb24gfTtcbiAgICB9XG4gICAgQW5ub3RhdGVkVGV4dEVkaXQucmVwbGFjZSA9IHJlcGxhY2U7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhbm5vdGF0ZWQgaW5zZXJ0IHRleHQgZWRpdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgcG9zaXRpb24gdG8gaW5zZXJ0IHRoZSB0ZXh0IGF0LlxuICAgICAqIEBwYXJhbSBuZXdUZXh0IFRoZSB0ZXh0IHRvIGJlIGluc2VydGVkLlxuICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIFRoZSBhbm5vdGF0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluc2VydChwb3NpdGlvbiwgbmV3VGV4dCwgYW5ub3RhdGlvbikge1xuICAgICAgICByZXR1cm4geyByYW5nZTogeyBzdGFydDogcG9zaXRpb24sIGVuZDogcG9zaXRpb24gfSwgbmV3VGV4dCwgYW5ub3RhdGlvbklkOiBhbm5vdGF0aW9uIH07XG4gICAgfVxuICAgIEFubm90YXRlZFRleHRFZGl0Lmluc2VydCA9IGluc2VydDtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFubm90YXRlZCBkZWxldGUgdGV4dCBlZGl0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSBvZiB0ZXh0IHRvIGJlIGRlbGV0ZWQuXG4gICAgICogQHBhcmFtIGFubm90YXRpb24gVGhlIGFubm90YXRpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gZGVsKHJhbmdlLCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCBuZXdUZXh0OiAnJywgYW5ub3RhdGlvbklkOiBhbm5vdGF0aW9uIH07XG4gICAgfVxuICAgIEFubm90YXRlZFRleHRFZGl0LmRlbCA9IGRlbDtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIFRleHRFZGl0LmlzKGNhbmRpZGF0ZSkgJiYgKENoYW5nZUFubm90YXRpb24uaXMoY2FuZGlkYXRlLmFubm90YXRpb25JZCkgfHwgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoY2FuZGlkYXRlLmFubm90YXRpb25JZCkpO1xuICAgIH1cbiAgICBBbm5vdGF0ZWRUZXh0RWRpdC5pcyA9IGlzO1xufSkoQW5ub3RhdGVkVGV4dEVkaXQgfHwgKEFubm90YXRlZFRleHRFZGl0ID0ge30pKTtcbi8qKlxuICogVGhlIFRleHREb2N1bWVudEVkaXQgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGVcbiAqIGFuIGVkaXQgdGhhdCBtYW5pcHVsYXRlcyBhIHRleHQgZG9jdW1lbnQuXG4gKi9cbmV4cG9ydCB2YXIgVGV4dERvY3VtZW50RWRpdDtcbihmdW5jdGlvbiAoVGV4dERvY3VtZW50RWRpdCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgYFRleHREb2N1bWVudEVkaXRgXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHRleHREb2N1bWVudCwgZWRpdHMpIHtcbiAgICAgICAgcmV0dXJuIHsgdGV4dERvY3VtZW50LCBlZGl0cyB9O1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnRFZGl0LmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSlcbiAgICAgICAgICAgICYmIE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllci5pcyhjYW5kaWRhdGUudGV4dERvY3VtZW50KVxuICAgICAgICAgICAgJiYgQXJyYXkuaXNBcnJheShjYW5kaWRhdGUuZWRpdHMpO1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnRFZGl0LmlzID0gaXM7XG59KShUZXh0RG9jdW1lbnRFZGl0IHx8IChUZXh0RG9jdW1lbnRFZGl0ID0ge30pKTtcbmV4cG9ydCB2YXIgQ3JlYXRlRmlsZTtcbihmdW5jdGlvbiAoQ3JlYXRlRmlsZSkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmksIG9wdGlvbnMsIGFubm90YXRpb24pIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIGtpbmQ6ICdjcmVhdGUnLFxuICAgICAgICAgICAgdXJpXG4gICAgICAgIH07XG4gICAgICAgIGlmIChvcHRpb25zICE9PSB1bmRlZmluZWQgJiYgKG9wdGlvbnMub3ZlcndyaXRlICE9PSB1bmRlZmluZWQgfHwgb3B0aW9ucy5pZ25vcmVJZkV4aXN0cyAhPT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgcmVzdWx0Lm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbm5vdGF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5hbm5vdGF0aW9uSWQgPSBhbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIENyZWF0ZUZpbGUuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBjYW5kaWRhdGUua2luZCA9PT0gJ2NyZWF0ZScgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpICYmIChjYW5kaWRhdGUub3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAoKGNhbmRpZGF0ZS5vcHRpb25zLm92ZXJ3cml0ZSA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLm9wdGlvbnMub3ZlcndyaXRlKSkgJiYgKGNhbmRpZGF0ZS5vcHRpb25zLmlnbm9yZUlmRXhpc3RzID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUub3B0aW9ucy5pZ25vcmVJZkV4aXN0cykpKSkgJiYgKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQgPT09IHVuZGVmaW5lZCB8fCBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhjYW5kaWRhdGUuYW5ub3RhdGlvbklkKSk7XG4gICAgfVxuICAgIENyZWF0ZUZpbGUuaXMgPSBpcztcbn0pKENyZWF0ZUZpbGUgfHwgKENyZWF0ZUZpbGUgPSB7fSkpO1xuZXhwb3J0IHZhciBSZW5hbWVGaWxlO1xuKGZ1bmN0aW9uIChSZW5hbWVGaWxlKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKG9sZFVyaSwgbmV3VXJpLCBvcHRpb25zLCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7XG4gICAgICAgICAgICBraW5kOiAncmVuYW1lJyxcbiAgICAgICAgICAgIG9sZFVyaSxcbiAgICAgICAgICAgIG5ld1VyaVxuICAgICAgICB9O1xuICAgICAgICBpZiAob3B0aW9ucyAhPT0gdW5kZWZpbmVkICYmIChvcHRpb25zLm92ZXJ3cml0ZSAhPT0gdW5kZWZpbmVkIHx8IG9wdGlvbnMuaWdub3JlSWZFeGlzdHMgIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgfVxuICAgICAgICBpZiAoYW5ub3RhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQuYW5ub3RhdGlvbklkID0gYW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBSZW5hbWVGaWxlLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgY2FuZGlkYXRlLmtpbmQgPT09ICdyZW5hbWUnICYmIElzLnN0cmluZyhjYW5kaWRhdGUub2xkVXJpKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLm5ld1VyaSkgJiYgKGNhbmRpZGF0ZS5vcHRpb25zID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICgoY2FuZGlkYXRlLm9wdGlvbnMub3ZlcndyaXRlID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUub3B0aW9ucy5vdmVyd3JpdGUpKSAmJiAoY2FuZGlkYXRlLm9wdGlvbnMuaWdub3JlSWZFeGlzdHMgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5vcHRpb25zLmlnbm9yZUlmRXhpc3RzKSkpKSAmJiAoY2FuZGlkYXRlLmFubm90YXRpb25JZCA9PT0gdW5kZWZpbmVkIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQpKTtcbiAgICB9XG4gICAgUmVuYW1lRmlsZS5pcyA9IGlzO1xufSkoUmVuYW1lRmlsZSB8fCAoUmVuYW1lRmlsZSA9IHt9KSk7XG5leHBvcnQgdmFyIERlbGV0ZUZpbGU7XG4oZnVuY3Rpb24gKERlbGV0ZUZpbGUpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUodXJpLCBvcHRpb25zLCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7XG4gICAgICAgICAgICBraW5kOiAnZGVsZXRlJyxcbiAgICAgICAgICAgIHVyaVxuICAgICAgICB9O1xuICAgICAgICBpZiAob3B0aW9ucyAhPT0gdW5kZWZpbmVkICYmIChvcHRpb25zLnJlY3Vyc2l2ZSAhPT0gdW5kZWZpbmVkIHx8IG9wdGlvbnMuaWdub3JlSWZOb3RFeGlzdHMgIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgfVxuICAgICAgICBpZiAoYW5ub3RhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQuYW5ub3RhdGlvbklkID0gYW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBEZWxldGVGaWxlLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgY2FuZGlkYXRlLmtpbmQgPT09ICdkZWxldGUnICYmIElzLnN0cmluZyhjYW5kaWRhdGUudXJpKSAmJiAoY2FuZGlkYXRlLm9wdGlvbnMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgKChjYW5kaWRhdGUub3B0aW9ucy5yZWN1cnNpdmUgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5vcHRpb25zLnJlY3Vyc2l2ZSkpICYmIChjYW5kaWRhdGUub3B0aW9ucy5pZ25vcmVJZk5vdEV4aXN0cyA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLm9wdGlvbnMuaWdub3JlSWZOb3RFeGlzdHMpKSkpICYmIChjYW5kaWRhdGUuYW5ub3RhdGlvbklkID09PSB1bmRlZmluZWQgfHwgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoY2FuZGlkYXRlLmFubm90YXRpb25JZCkpO1xuICAgIH1cbiAgICBEZWxldGVGaWxlLmlzID0gaXM7XG59KShEZWxldGVGaWxlIHx8IChEZWxldGVGaWxlID0ge30pKTtcbmV4cG9ydCB2YXIgV29ya3NwYWNlRWRpdDtcbihmdW5jdGlvbiAoV29ya3NwYWNlRWRpdCkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5jaGFuZ2VzICE9PSB1bmRlZmluZWQgfHwgY2FuZGlkYXRlLmRvY3VtZW50Q2hhbmdlcyAhPT0gdW5kZWZpbmVkKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5kb2N1bWVudENoYW5nZXMgPT09IHVuZGVmaW5lZCB8fCBjYW5kaWRhdGUuZG9jdW1lbnRDaGFuZ2VzLmV2ZXJ5KChjaGFuZ2UpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoSXMuc3RyaW5nKGNoYW5nZS5raW5kKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlRmlsZS5pcyhjaGFuZ2UpIHx8IFJlbmFtZUZpbGUuaXMoY2hhbmdlKSB8fCBEZWxldGVGaWxlLmlzKGNoYW5nZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gVGV4dERvY3VtZW50RWRpdC5pcyhjaGFuZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKTtcbiAgICB9XG4gICAgV29ya3NwYWNlRWRpdC5pcyA9IGlzO1xufSkoV29ya3NwYWNlRWRpdCB8fCAoV29ya3NwYWNlRWRpdCA9IHt9KSk7XG5jbGFzcyBUZXh0RWRpdENoYW5nZUltcGwge1xuICAgIGNvbnN0cnVjdG9yKGVkaXRzLCBjaGFuZ2VBbm5vdGF0aW9ucykge1xuICAgICAgICB0aGlzLmVkaXRzID0gZWRpdHM7XG4gICAgICAgIHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMgPSBjaGFuZ2VBbm5vdGF0aW9ucztcbiAgICB9XG4gICAgaW5zZXJ0KHBvc2l0aW9uLCBuZXdUZXh0LCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIGxldCBlZGl0O1xuICAgICAgICBsZXQgaWQ7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGVkaXQgPSBUZXh0RWRpdC5pbnNlcnQocG9zaXRpb24sIG5ld1RleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGFubm90YXRpb24pKSB7XG4gICAgICAgICAgICBpZCA9IGFubm90YXRpb247XG4gICAgICAgICAgICBlZGl0ID0gQW5ub3RhdGVkVGV4dEVkaXQuaW5zZXJ0KHBvc2l0aW9uLCBuZXdUZXh0LCBhbm5vdGF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYXNzZXJ0Q2hhbmdlQW5ub3RhdGlvbnModGhpcy5jaGFuZ2VBbm5vdGF0aW9ucyk7XG4gICAgICAgICAgICBpZCA9IHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMubWFuYWdlKGFubm90YXRpb24pO1xuICAgICAgICAgICAgZWRpdCA9IEFubm90YXRlZFRleHRFZGl0Lmluc2VydChwb3NpdGlvbiwgbmV3VGV4dCwgaWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWRpdHMucHVzaChlZGl0KTtcbiAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXBsYWNlKHJhbmdlLCBuZXdUZXh0LCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIGxldCBlZGl0O1xuICAgICAgICBsZXQgaWQ7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGVkaXQgPSBUZXh0RWRpdC5yZXBsYWNlKHJhbmdlLCBuZXdUZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhhbm5vdGF0aW9uKSkge1xuICAgICAgICAgICAgaWQgPSBhbm5vdGF0aW9uO1xuICAgICAgICAgICAgZWRpdCA9IEFubm90YXRlZFRleHRFZGl0LnJlcGxhY2UocmFuZ2UsIG5ld1RleHQsIGFubm90YXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hc3NlcnRDaGFuZ2VBbm5vdGF0aW9ucyh0aGlzLmNoYW5nZUFubm90YXRpb25zKTtcbiAgICAgICAgICAgIGlkID0gdGhpcy5jaGFuZ2VBbm5vdGF0aW9ucy5tYW5hZ2UoYW5ub3RhdGlvbik7XG4gICAgICAgICAgICBlZGl0ID0gQW5ub3RhdGVkVGV4dEVkaXQucmVwbGFjZShyYW5nZSwgbmV3VGV4dCwgaWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWRpdHMucHVzaChlZGl0KTtcbiAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkZWxldGUocmFuZ2UsIGFubm90YXRpb24pIHtcbiAgICAgICAgbGV0IGVkaXQ7XG4gICAgICAgIGxldCBpZDtcbiAgICAgICAgaWYgKGFubm90YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZWRpdCA9IFRleHRFZGl0LmRlbChyYW5nZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoYW5ub3RhdGlvbikpIHtcbiAgICAgICAgICAgIGlkID0gYW5ub3RhdGlvbjtcbiAgICAgICAgICAgIGVkaXQgPSBBbm5vdGF0ZWRUZXh0RWRpdC5kZWwocmFuZ2UsIGFubm90YXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hc3NlcnRDaGFuZ2VBbm5vdGF0aW9ucyh0aGlzLmNoYW5nZUFubm90YXRpb25zKTtcbiAgICAgICAgICAgIGlkID0gdGhpcy5jaGFuZ2VBbm5vdGF0aW9ucy5tYW5hZ2UoYW5ub3RhdGlvbik7XG4gICAgICAgICAgICBlZGl0ID0gQW5ub3RhdGVkVGV4dEVkaXQuZGVsKHJhbmdlLCBpZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lZGl0cy5wdXNoKGVkaXQpO1xuICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFkZChlZGl0KSB7XG4gICAgICAgIHRoaXMuZWRpdHMucHVzaChlZGl0KTtcbiAgICB9XG4gICAgYWxsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0cztcbiAgICB9XG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuZWRpdHMuc3BsaWNlKDAsIHRoaXMuZWRpdHMubGVuZ3RoKTtcbiAgICB9XG4gICAgYXNzZXJ0Q2hhbmdlQW5ub3RhdGlvbnModmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGV4dCBlZGl0IGNoYW5nZSBpcyBub3QgY29uZmlndXJlZCB0byBtYW5hZ2UgY2hhbmdlIGFubm90YXRpb25zLmApO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBBIGhlbHBlciBjbGFzc1xuICovXG5jbGFzcyBDaGFuZ2VBbm5vdGF0aW9ucyB7XG4gICAgY29uc3RydWN0b3IoYW5ub3RhdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9ucyA9PT0gdW5kZWZpbmVkID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IGFubm90YXRpb25zO1xuICAgICAgICB0aGlzLl9jb3VudGVyID0gMDtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IDA7XG4gICAgfVxuICAgIGFsbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Fubm90YXRpb25zO1xuICAgIH1cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpemU7XG4gICAgfVxuICAgIG1hbmFnZShpZE9yQW5ub3RhdGlvbiwgYW5ub3RhdGlvbikge1xuICAgICAgICBsZXQgaWQ7XG4gICAgICAgIGlmIChDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhpZE9yQW5ub3RhdGlvbikpIHtcbiAgICAgICAgICAgIGlkID0gaWRPckFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZCA9IHRoaXMubmV4dElkKCk7XG4gICAgICAgICAgICBhbm5vdGF0aW9uID0gaWRPckFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2Fubm90YXRpb25zW2lkXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYElkICR7aWR9IGlzIGFscmVhZHkgaW4gdXNlLmApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbm5vdGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gYW5ub3RhdGlvbiBwcm92aWRlZCBmb3IgaWQgJHtpZH1gKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9hbm5vdGF0aW9uc1tpZF0gPSBhbm5vdGF0aW9uO1xuICAgICAgICB0aGlzLl9zaXplKys7XG4gICAgICAgIHJldHVybiBpZDtcbiAgICB9XG4gICAgbmV4dElkKCkge1xuICAgICAgICB0aGlzLl9jb3VudGVyKys7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb3VudGVyLnRvU3RyaW5nKCk7XG4gICAgfVxufVxuLyoqXG4gKiBBIHdvcmtzcGFjZSBjaGFuZ2UgaGVscHMgY29uc3RydWN0aW5nIGNoYW5nZXMgdG8gYSB3b3Jrc3BhY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBXb3Jrc3BhY2VDaGFuZ2Uge1xuICAgIGNvbnN0cnVjdG9yKHdvcmtzcGFjZUVkaXQpIHtcbiAgICAgICAgdGhpcy5fdGV4dEVkaXRDaGFuZ2VzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgaWYgKHdvcmtzcGFjZUVkaXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdCA9IHdvcmtzcGFjZUVkaXQ7XG4gICAgICAgICAgICBpZiAod29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucyA9IG5ldyBDaGFuZ2VBbm5vdGF0aW9ucyh3b3Jrc3BhY2VFZGl0LmNoYW5nZUFubm90YXRpb25zKTtcbiAgICAgICAgICAgICAgICB3b3Jrc3BhY2VFZGl0LmNoYW5nZUFubm90YXRpb25zID0gdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMuYWxsKCk7XG4gICAgICAgICAgICAgICAgd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMuZm9yRWFjaCgoY2hhbmdlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChUZXh0RG9jdW1lbnRFZGl0LmlzKGNoYW5nZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHRFZGl0Q2hhbmdlID0gbmV3IFRleHRFZGl0Q2hhbmdlSW1wbChjaGFuZ2UuZWRpdHMsIHRoaXMuX2NoYW5nZUFubm90YXRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RleHRFZGl0Q2hhbmdlc1tjaGFuZ2UudGV4dERvY3VtZW50LnVyaV0gPSB0ZXh0RWRpdENoYW5nZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAod29ya3NwYWNlRWRpdC5jaGFuZ2VzKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMod29ya3NwYWNlRWRpdC5jaGFuZ2VzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dEVkaXRDaGFuZ2UgPSBuZXcgVGV4dEVkaXRDaGFuZ2VJbXBsKHdvcmtzcGFjZUVkaXQuY2hhbmdlc1trZXldKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGV4dEVkaXRDaGFuZ2VzW2tleV0gPSB0ZXh0RWRpdENoYW5nZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQgPSB7fTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIHtAbGluayBXb3Jrc3BhY2VFZGl0fSBsaXRlcmFsXG4gICAgICogdXNlIHRvIGJlIHJldHVybmVkIGZyb20gYSB3b3Jrc3BhY2UgZWRpdCBvcGVyYXRpb24gbGlrZSByZW5hbWUuXG4gICAgICovXG4gICAgZ2V0IGVkaXQoKSB7XG4gICAgICAgIHRoaXMuaW5pdERvY3VtZW50Q2hhbmdlcygpO1xuICAgICAgICBpZiAodGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2NoYW5nZUFubm90YXRpb25zLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZUFubm90YXRpb25zID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VBbm5vdGF0aW9ucyA9IHRoaXMuX2NoYW5nZUFubm90YXRpb25zLmFsbCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl93b3Jrc3BhY2VFZGl0O1xuICAgIH1cbiAgICBnZXRUZXh0RWRpdENoYW5nZShrZXkpIHtcbiAgICAgICAgaWYgKE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllci5pcyhrZXkpKSB7XG4gICAgICAgICAgICB0aGlzLmluaXREb2N1bWVudENoYW5nZXMoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXb3Jrc3BhY2UgZWRpdCBpcyBub3QgY29uZmlndXJlZCBmb3IgZG9jdW1lbnQgY2hhbmdlcy4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHRleHREb2N1bWVudCA9IHsgdXJpOiBrZXkudXJpLCB2ZXJzaW9uOiBrZXkudmVyc2lvbiB9O1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuX3RleHRFZGl0Q2hhbmdlc1t0ZXh0RG9jdW1lbnQudXJpXTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWRpdHMgPSBbXTtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0RG9jdW1lbnRFZGl0ID0ge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIGVkaXRzXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcy5wdXNoKHRleHREb2N1bWVudEVkaXQpO1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBUZXh0RWRpdENoYW5nZUltcGwoZWRpdHMsIHRoaXMuX2NoYW5nZUFubm90YXRpb25zKTtcbiAgICAgICAgICAgICAgICB0aGlzLl90ZXh0RWRpdENoYW5nZXNbdGV4dERvY3VtZW50LnVyaV0gPSByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pbml0Q2hhbmdlcygpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXb3Jrc3BhY2UgZWRpdCBpcyBub3QgY29uZmlndXJlZCBmb3Igbm9ybWFsIHRleHQgZWRpdCBjaGFuZ2VzLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuX3RleHRFZGl0Q2hhbmdlc1trZXldO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBsZXQgZWRpdHMgPSBbXTtcbiAgICAgICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZXNba2V5XSA9IGVkaXRzO1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBUZXh0RWRpdENoYW5nZUltcGwoZWRpdHMpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3RleHRFZGl0Q2hhbmdlc1trZXldID0gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpbml0RG9jdW1lbnRDaGFuZ2VzKCkge1xuICAgICAgICBpZiAodGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMgPT09IHVuZGVmaW5lZCAmJiB0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMgPSBuZXcgQ2hhbmdlQW5ub3RhdGlvbnMoKTtcbiAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzID0gW107XG4gICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZUFubm90YXRpb25zID0gdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMuYWxsKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaW5pdENoYW5nZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcyA9PT0gdW5kZWZpbmVkICYmIHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNyZWF0ZUZpbGUodXJpLCBvcHRpb25zT3JBbm5vdGF0aW9uLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuaW5pdERvY3VtZW50Q2hhbmdlcygpO1xuICAgICAgICBpZiAodGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXb3Jrc3BhY2UgZWRpdCBpcyBub3QgY29uZmlndXJlZCBmb3IgZG9jdW1lbnQgY2hhbmdlcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYW5ub3RhdGlvbjtcbiAgICAgICAgaWYgKENoYW5nZUFubm90YXRpb24uaXMob3B0aW9uc09yQW5ub3RhdGlvbikgfHwgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMob3B0aW9uc09yQW5ub3RhdGlvbikpIHtcbiAgICAgICAgICAgIGFubm90YXRpb24gPSBvcHRpb25zT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnNPckFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG9wZXJhdGlvbjtcbiAgICAgICAgbGV0IGlkO1xuICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcGVyYXRpb24gPSBDcmVhdGVGaWxlLmNyZWF0ZSh1cmksIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWQgPSBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhhbm5vdGF0aW9uKSA/IGFubm90YXRpb24gOiB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5tYW5hZ2UoYW5ub3RhdGlvbik7XG4gICAgICAgICAgICBvcGVyYXRpb24gPSBDcmVhdGVGaWxlLmNyZWF0ZSh1cmksIG9wdGlvbnMsIGlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcy5wdXNoKG9wZXJhdGlvbik7XG4gICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVuYW1lRmlsZShvbGRVcmksIG5ld1VyaSwgb3B0aW9uc09yQW5ub3RhdGlvbiwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLmluaXREb2N1bWVudENoYW5nZXMoKTtcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV29ya3NwYWNlIGVkaXQgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIGRvY3VtZW50IGNoYW5nZXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGFubm90YXRpb247XG4gICAgICAgIGlmIChDaGFuZ2VBbm5vdGF0aW9uLmlzKG9wdGlvbnNPckFubm90YXRpb24pIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKG9wdGlvbnNPckFubm90YXRpb24pKSB7XG4gICAgICAgICAgICBhbm5vdGF0aW9uID0gb3B0aW9uc09yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGxldCBvcGVyYXRpb247XG4gICAgICAgIGxldCBpZDtcbiAgICAgICAgaWYgKGFubm90YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3BlcmF0aW9uID0gUmVuYW1lRmlsZS5jcmVhdGUob2xkVXJpLCBuZXdVcmksIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWQgPSBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhhbm5vdGF0aW9uKSA/IGFubm90YXRpb24gOiB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5tYW5hZ2UoYW5ub3RhdGlvbik7XG4gICAgICAgICAgICBvcGVyYXRpb24gPSBSZW5hbWVGaWxlLmNyZWF0ZShvbGRVcmksIG5ld1VyaSwgb3B0aW9ucywgaWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzLnB1c2gob3BlcmF0aW9uKTtcbiAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkZWxldGVGaWxlKHVyaSwgb3B0aW9uc09yQW5ub3RhdGlvbiwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLmluaXREb2N1bWVudENoYW5nZXMoKTtcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV29ya3NwYWNlIGVkaXQgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIGRvY3VtZW50IGNoYW5nZXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGFubm90YXRpb247XG4gICAgICAgIGlmIChDaGFuZ2VBbm5vdGF0aW9uLmlzKG9wdGlvbnNPckFubm90YXRpb24pIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKG9wdGlvbnNPckFubm90YXRpb24pKSB7XG4gICAgICAgICAgICBhbm5vdGF0aW9uID0gb3B0aW9uc09yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGxldCBvcGVyYXRpb247XG4gICAgICAgIGxldCBpZDtcbiAgICAgICAgaWYgKGFubm90YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3BlcmF0aW9uID0gRGVsZXRlRmlsZS5jcmVhdGUodXJpLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlkID0gQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoYW5ub3RhdGlvbikgPyBhbm5vdGF0aW9uIDogdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMubWFuYWdlKGFubm90YXRpb24pO1xuICAgICAgICAgICAgb3BlcmF0aW9uID0gRGVsZXRlRmlsZS5jcmVhdGUodXJpLCBvcHRpb25zLCBpZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMucHVzaChvcGVyYXRpb24pO1xuICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBUaGUgVGV4dERvY3VtZW50SWRlbnRpZmllciBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBUZXh0RG9jdW1lbnRJZGVudGlmaWVyfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBUZXh0RG9jdW1lbnRJZGVudGlmaWVyO1xuKGZ1bmN0aW9uIChUZXh0RG9jdW1lbnRJZGVudGlmaWVyKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBUZXh0RG9jdW1lbnRJZGVudGlmaWVyIGxpdGVyYWwuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgZG9jdW1lbnQncyB1cmkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHVyaSkge1xuICAgICAgICByZXR1cm4geyB1cmkgfTtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50SWRlbnRpZmllci5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBUZXh0RG9jdW1lbnRJZGVudGlmaWVyfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudXJpKTtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50SWRlbnRpZmllci5pcyA9IGlzO1xufSkoVGV4dERvY3VtZW50SWRlbnRpZmllciB8fCAoVGV4dERvY3VtZW50SWRlbnRpZmllciA9IHt9KSk7XG4vKipcbiAqIFRoZSBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXJ9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXI7XG4oZnVuY3Rpb24gKFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIgbGl0ZXJhbC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSBkb2N1bWVudCdzIHVyaS5cbiAgICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgZG9jdW1lbnQncyB2ZXJzaW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmksIHZlcnNpb24pIHtcbiAgICAgICAgcmV0dXJuIHsgdXJpLCB2ZXJzaW9uIH07XG4gICAgfVxuICAgIFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSkgJiYgSXMuaW50ZWdlcihjYW5kaWRhdGUudmVyc2lvbik7XG4gICAgfVxuICAgIFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIuaXMgPSBpcztcbn0pKFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIgfHwgKFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIgPSB7fSkpO1xuLyoqXG4gKiBUaGUgT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyO1xuKGZ1bmN0aW9uIChPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciBsaXRlcmFsLlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIGRvY3VtZW50J3MgdXJpLlxuICAgICAqIEBwYXJhbSB2ZXJzaW9uIFRoZSBkb2N1bWVudCdzIHZlcnNpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHVyaSwgdmVyc2lvbikge1xuICAgICAgICByZXR1cm4geyB1cmksIHZlcnNpb24gfTtcbiAgICB9XG4gICAgT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSkgJiYgKGNhbmRpZGF0ZS52ZXJzaW9uID09PSBudWxsIHx8IElzLmludGVnZXIoY2FuZGlkYXRlLnZlcnNpb24pKTtcbiAgICB9XG4gICAgT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmlzID0gaXM7XG59KShPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIgfHwgKE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciA9IHt9KSk7XG4vKipcbiAqIFRoZSBUZXh0RG9jdW1lbnRJdGVtIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIFRleHREb2N1bWVudEl0ZW19IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIFRleHREb2N1bWVudEl0ZW07XG4oZnVuY3Rpb24gKFRleHREb2N1bWVudEl0ZW0pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFRleHREb2N1bWVudEl0ZW0gbGl0ZXJhbC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSBkb2N1bWVudCdzIHVyaS5cbiAgICAgKiBAcGFyYW0gbGFuZ3VhZ2VJZCBUaGUgZG9jdW1lbnQncyBsYW5ndWFnZSBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB2ZXJzaW9uIFRoZSBkb2N1bWVudCdzIHZlcnNpb24gbnVtYmVyLlxuICAgICAqIEBwYXJhbSB0ZXh0IFRoZSBkb2N1bWVudCdzIHRleHQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHVyaSwgbGFuZ3VhZ2VJZCwgdmVyc2lvbiwgdGV4dCkge1xuICAgICAgICByZXR1cm4geyB1cmksIGxhbmd1YWdlSWQsIHZlcnNpb24sIHRleHQgfTtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50SXRlbS5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBUZXh0RG9jdW1lbnRJdGVtfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudXJpKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLmxhbmd1YWdlSWQpICYmIElzLmludGVnZXIoY2FuZGlkYXRlLnZlcnNpb24pICYmIElzLnN0cmluZyhjYW5kaWRhdGUudGV4dCk7XG4gICAgfVxuICAgIFRleHREb2N1bWVudEl0ZW0uaXMgPSBpcztcbn0pKFRleHREb2N1bWVudEl0ZW0gfHwgKFRleHREb2N1bWVudEl0ZW0gPSB7fSkpO1xuLyoqXG4gKiBEZXNjcmliZXMgdGhlIGNvbnRlbnQgdHlwZSB0aGF0IGEgY2xpZW50IHN1cHBvcnRzIGluIHZhcmlvdXNcbiAqIHJlc3VsdCBsaXRlcmFscyBsaWtlIGBIb3ZlcmAsIGBQYXJhbWV0ZXJJbmZvYCBvciBgQ29tcGxldGlvbkl0ZW1gLlxuICpcbiAqIFBsZWFzZSBub3RlIHRoYXQgYE1hcmt1cEtpbmRzYCBtdXN0IG5vdCBzdGFydCB3aXRoIGEgYCRgLiBUaGlzIGtpbmRzXG4gKiBhcmUgcmVzZXJ2ZWQgZm9yIGludGVybmFsIHVzYWdlLlxuICovXG5leHBvcnQgdmFyIE1hcmt1cEtpbmQ7XG4oZnVuY3Rpb24gKE1hcmt1cEtpbmQpIHtcbiAgICAvKipcbiAgICAgKiBQbGFpbiB0ZXh0IGlzIHN1cHBvcnRlZCBhcyBhIGNvbnRlbnQgZm9ybWF0XG4gICAgICovXG4gICAgTWFya3VwS2luZC5QbGFpblRleHQgPSAncGxhaW50ZXh0JztcbiAgICAvKipcbiAgICAgKiBNYXJrZG93biBpcyBzdXBwb3J0ZWQgYXMgYSBjb250ZW50IGZvcm1hdFxuICAgICAqL1xuICAgIE1hcmt1cEtpbmQuTWFya2Rvd24gPSAnbWFya2Rvd24nO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBpcyBhIHZhbHVlIG9mIHRoZSB7QGxpbmsgTWFya3VwS2luZH0gdHlwZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSA9PT0gTWFya3VwS2luZC5QbGFpblRleHQgfHwgY2FuZGlkYXRlID09PSBNYXJrdXBLaW5kLk1hcmtkb3duO1xuICAgIH1cbiAgICBNYXJrdXBLaW5kLmlzID0gaXM7XG59KShNYXJrdXBLaW5kIHx8IChNYXJrdXBLaW5kID0ge30pKTtcbmV4cG9ydCB2YXIgTWFya3VwQ29udGVudDtcbihmdW5jdGlvbiAoTWFya3VwQ29udGVudCkge1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBjb25mb3JtcyB0byB0aGUge0BsaW5rIE1hcmt1cENvbnRlbnR9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwodmFsdWUpICYmIE1hcmt1cEtpbmQuaXMoY2FuZGlkYXRlLmtpbmQpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudmFsdWUpO1xuICAgIH1cbiAgICBNYXJrdXBDb250ZW50LmlzID0gaXM7XG59KShNYXJrdXBDb250ZW50IHx8IChNYXJrdXBDb250ZW50ID0ge30pKTtcbi8qKlxuICogVGhlIGtpbmQgb2YgYSBjb21wbGV0aW9uIGVudHJ5LlxuICovXG5leHBvcnQgdmFyIENvbXBsZXRpb25JdGVtS2luZDtcbihmdW5jdGlvbiAoQ29tcGxldGlvbkl0ZW1LaW5kKSB7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlRleHQgPSAxO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5NZXRob2QgPSAyO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5GdW5jdGlvbiA9IDM7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkNvbnN0cnVjdG9yID0gNDtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuRmllbGQgPSA1O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5WYXJpYWJsZSA9IDY7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkNsYXNzID0gNztcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuSW50ZXJmYWNlID0gODtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuTW9kdWxlID0gOTtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuUHJvcGVydHkgPSAxMDtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuVW5pdCA9IDExO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5WYWx1ZSA9IDEyO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5FbnVtID0gMTM7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLktleXdvcmQgPSAxNDtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuU25pcHBldCA9IDE1O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5Db2xvciA9IDE2O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5GaWxlID0gMTc7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlJlZmVyZW5jZSA9IDE4O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5Gb2xkZXIgPSAxOTtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuRW51bU1lbWJlciA9IDIwO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5Db25zdGFudCA9IDIxO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5TdHJ1Y3QgPSAyMjtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuRXZlbnQgPSAyMztcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuT3BlcmF0b3IgPSAyNDtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuVHlwZVBhcmFtZXRlciA9IDI1O1xufSkoQ29tcGxldGlvbkl0ZW1LaW5kIHx8IChDb21wbGV0aW9uSXRlbUtpbmQgPSB7fSkpO1xuLyoqXG4gKiBEZWZpbmVzIHdoZXRoZXIgdGhlIGluc2VydCB0ZXh0IGluIGEgY29tcGxldGlvbiBpdGVtIHNob3VsZCBiZSBpbnRlcnByZXRlZCBhc1xuICogcGxhaW4gdGV4dCBvciBhIHNuaXBwZXQuXG4gKi9cbmV4cG9ydCB2YXIgSW5zZXJ0VGV4dEZvcm1hdDtcbihmdW5jdGlvbiAoSW5zZXJ0VGV4dEZvcm1hdCkge1xuICAgIC8qKlxuICAgICAqIFRoZSBwcmltYXJ5IHRleHQgdG8gYmUgaW5zZXJ0ZWQgaXMgdHJlYXRlZCBhcyBhIHBsYWluIHN0cmluZy5cbiAgICAgKi9cbiAgICBJbnNlcnRUZXh0Rm9ybWF0LlBsYWluVGV4dCA9IDE7XG4gICAgLyoqXG4gICAgICogVGhlIHByaW1hcnkgdGV4dCB0byBiZSBpbnNlcnRlZCBpcyB0cmVhdGVkIGFzIGEgc25pcHBldC5cbiAgICAgKlxuICAgICAqIEEgc25pcHBldCBjYW4gZGVmaW5lIHRhYiBzdG9wcyBhbmQgcGxhY2Vob2xkZXJzIHdpdGggYCQxYCwgYCQyYFxuICAgICAqIGFuZCBgJHszOmZvb31gLiBgJDBgIGRlZmluZXMgdGhlIGZpbmFsIHRhYiBzdG9wLCBpdCBkZWZhdWx0cyB0b1xuICAgICAqIHRoZSBlbmQgb2YgdGhlIHNuaXBwZXQuIFBsYWNlaG9sZGVycyB3aXRoIGVxdWFsIGlkZW50aWZpZXJzIGFyZSBsaW5rZWQsXG4gICAgICogdGhhdCBpcyB0eXBpbmcgaW4gb25lIHdpbGwgdXBkYXRlIG90aGVycyB0b28uXG4gICAgICpcbiAgICAgKiBTZWUgYWxzbzogaHR0cHM6Ly9taWNyb3NvZnQuZ2l0aHViLmlvL2xhbmd1YWdlLXNlcnZlci1wcm90b2NvbC9zcGVjaWZpY2F0aW9ucy9zcGVjaWZpY2F0aW9uLWN1cnJlbnQvI3NuaXBwZXRfc3ludGF4XG4gICAgICovXG4gICAgSW5zZXJ0VGV4dEZvcm1hdC5TbmlwcGV0ID0gMjtcbn0pKEluc2VydFRleHRGb3JtYXQgfHwgKEluc2VydFRleHRGb3JtYXQgPSB7fSkpO1xuLyoqXG4gKiBDb21wbGV0aW9uIGl0ZW0gdGFncyBhcmUgZXh0cmEgYW5ub3RhdGlvbnMgdGhhdCB0d2VhayB0aGUgcmVuZGVyaW5nIG9mIGEgY29tcGxldGlvblxuICogaXRlbS5cbiAqXG4gKiBAc2luY2UgMy4xNS4wXG4gKi9cbmV4cG9ydCB2YXIgQ29tcGxldGlvbkl0ZW1UYWc7XG4oZnVuY3Rpb24gKENvbXBsZXRpb25JdGVtVGFnKSB7XG4gICAgLyoqXG4gICAgICogUmVuZGVyIGEgY29tcGxldGlvbiBhcyBvYnNvbGV0ZSwgdXN1YWxseSB1c2luZyBhIHN0cmlrZS1vdXQuXG4gICAgICovXG4gICAgQ29tcGxldGlvbkl0ZW1UYWcuRGVwcmVjYXRlZCA9IDE7XG59KShDb21wbGV0aW9uSXRlbVRhZyB8fCAoQ29tcGxldGlvbkl0ZW1UYWcgPSB7fSkpO1xuLyoqXG4gKiBUaGUgSW5zZXJ0UmVwbGFjZUVkaXQgbmFtZXNwYWNlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGggaW5zZXJ0IC8gcmVwbGFjZSBlZGl0cy5cbiAqXG4gKiBAc2luY2UgMy4xNi4wXG4gKi9cbmV4cG9ydCB2YXIgSW5zZXJ0UmVwbGFjZUVkaXQ7XG4oZnVuY3Rpb24gKEluc2VydFJlcGxhY2VFZGl0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBpbnNlcnQgLyByZXBsYWNlIGVkaXRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobmV3VGV4dCwgaW5zZXJ0LCByZXBsYWNlKSB7XG4gICAgICAgIHJldHVybiB7IG5ld1RleHQsIGluc2VydCwgcmVwbGFjZSB9O1xuICAgIH1cbiAgICBJbnNlcnRSZXBsYWNlRWRpdC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBJbnNlcnRSZXBsYWNlRWRpdH0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLnN0cmluZyhjYW5kaWRhdGUubmV3VGV4dCkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLmluc2VydCkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJlcGxhY2UpO1xuICAgIH1cbiAgICBJbnNlcnRSZXBsYWNlRWRpdC5pcyA9IGlzO1xufSkoSW5zZXJ0UmVwbGFjZUVkaXQgfHwgKEluc2VydFJlcGxhY2VFZGl0ID0ge30pKTtcbi8qKlxuICogSG93IHdoaXRlc3BhY2UgYW5kIGluZGVudGF0aW9uIGlzIGhhbmRsZWQgZHVyaW5nIGNvbXBsZXRpb25cbiAqIGl0ZW0gaW5zZXJ0aW9uLlxuICpcbiAqIEBzaW5jZSAzLjE2LjBcbiAqL1xuZXhwb3J0IHZhciBJbnNlcnRUZXh0TW9kZTtcbihmdW5jdGlvbiAoSW5zZXJ0VGV4dE1vZGUpIHtcbiAgICAvKipcbiAgICAgKiBUaGUgaW5zZXJ0aW9uIG9yIHJlcGxhY2Ugc3RyaW5ncyBpcyB0YWtlbiBhcyBpdCBpcy4gSWYgdGhlXG4gICAgICogdmFsdWUgaXMgbXVsdGkgbGluZSB0aGUgbGluZXMgYmVsb3cgdGhlIGN1cnNvciB3aWxsIGJlXG4gICAgICogaW5zZXJ0ZWQgdXNpbmcgdGhlIGluZGVudGF0aW9uIGRlZmluZWQgaW4gdGhlIHN0cmluZyB2YWx1ZS5cbiAgICAgKiBUaGUgY2xpZW50IHdpbGwgbm90IGFwcGx5IGFueSBraW5kIG9mIGFkanVzdG1lbnRzIHRvIHRoZVxuICAgICAqIHN0cmluZy5cbiAgICAgKi9cbiAgICBJbnNlcnRUZXh0TW9kZS5hc0lzID0gMTtcbiAgICAvKipcbiAgICAgKiBUaGUgZWRpdG9yIGFkanVzdHMgbGVhZGluZyB3aGl0ZXNwYWNlIG9mIG5ldyBsaW5lcyBzbyB0aGF0XG4gICAgICogdGhleSBtYXRjaCB0aGUgaW5kZW50YXRpb24gdXAgdG8gdGhlIGN1cnNvciBvZiB0aGUgbGluZSBmb3JcbiAgICAgKiB3aGljaCB0aGUgaXRlbSBpcyBhY2NlcHRlZC5cbiAgICAgKlxuICAgICAqIENvbnNpZGVyIGEgbGluZSBsaWtlIHRoaXM6IDwydGFicz48Y3Vyc29yPjwzdGFicz5mb28uIEFjY2VwdGluZyBhXG4gICAgICogbXVsdGkgbGluZSBjb21wbGV0aW9uIGl0ZW0gaXMgaW5kZW50ZWQgdXNpbmcgMiB0YWJzIGFuZCBhbGxcbiAgICAgKiBmb2xsb3dpbmcgbGluZXMgaW5zZXJ0ZWQgd2lsbCBiZSBpbmRlbnRlZCB1c2luZyAyIHRhYnMgYXMgd2VsbC5cbiAgICAgKi9cbiAgICBJbnNlcnRUZXh0TW9kZS5hZGp1c3RJbmRlbnRhdGlvbiA9IDI7XG59KShJbnNlcnRUZXh0TW9kZSB8fCAoSW5zZXJ0VGV4dE1vZGUgPSB7fSkpO1xuZXhwb3J0IHZhciBDb21wbGV0aW9uSXRlbUxhYmVsRGV0YWlscztcbihmdW5jdGlvbiAoQ29tcGxldGlvbkl0ZW1MYWJlbERldGFpbHMpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiAoSXMuc3RyaW5nKGNhbmRpZGF0ZS5kZXRhaWwpIHx8IGNhbmRpZGF0ZS5kZXRhaWwgPT09IHVuZGVmaW5lZCkgJiZcbiAgICAgICAgICAgIChJcy5zdHJpbmcoY2FuZGlkYXRlLmRlc2NyaXB0aW9uKSB8fCBjYW5kaWRhdGUuZGVzY3JpcHRpb24gPT09IHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIENvbXBsZXRpb25JdGVtTGFiZWxEZXRhaWxzLmlzID0gaXM7XG59KShDb21wbGV0aW9uSXRlbUxhYmVsRGV0YWlscyB8fCAoQ29tcGxldGlvbkl0ZW1MYWJlbERldGFpbHMgPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29tcGxldGlvbkl0ZW0gbmFtZXNwYWNlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGhcbiAqIGNvbXBsZXRpb24gaXRlbXMuXG4gKi9cbmV4cG9ydCB2YXIgQ29tcGxldGlvbkl0ZW07XG4oZnVuY3Rpb24gKENvbXBsZXRpb25JdGVtKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgY29tcGxldGlvbiBpdGVtIGFuZCBzZWVkIGl0IHdpdGggYSBsYWJlbC5cbiAgICAgKiBAcGFyYW0gbGFiZWwgVGhlIGNvbXBsZXRpb24gaXRlbSdzIGxhYmVsXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGxhYmVsKSB7XG4gICAgICAgIHJldHVybiB7IGxhYmVsIH07XG4gICAgfVxuICAgIENvbXBsZXRpb25JdGVtLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKENvbXBsZXRpb25JdGVtIHx8IChDb21wbGV0aW9uSXRlbSA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb21wbGV0aW9uTGlzdCBuYW1lc3BhY2UgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aFxuICogY29tcGxldGlvbiBsaXN0cy5cbiAqL1xuZXhwb3J0IHZhciBDb21wbGV0aW9uTGlzdDtcbihmdW5jdGlvbiAoQ29tcGxldGlvbkxpc3QpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGNvbXBsZXRpb24gbGlzdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpdGVtcyBUaGUgY29tcGxldGlvbiBpdGVtcy5cbiAgICAgKiBAcGFyYW0gaXNJbmNvbXBsZXRlIFRoZSBsaXN0IGlzIG5vdCBjb21wbGV0ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUoaXRlbXMsIGlzSW5jb21wbGV0ZSkge1xuICAgICAgICByZXR1cm4geyBpdGVtczogaXRlbXMgPyBpdGVtcyA6IFtdLCBpc0luY29tcGxldGU6ICEhaXNJbmNvbXBsZXRlIH07XG4gICAgfVxuICAgIENvbXBsZXRpb25MaXN0LmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKENvbXBsZXRpb25MaXN0IHx8IChDb21wbGV0aW9uTGlzdCA9IHt9KSk7XG5leHBvcnQgdmFyIE1hcmtlZFN0cmluZztcbihmdW5jdGlvbiAoTWFya2VkU3RyaW5nKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG1hcmtlZCBzdHJpbmcgZnJvbSBwbGFpbiB0ZXh0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHBsYWluVGV4dCBUaGUgcGxhaW4gdGV4dC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmcm9tUGxhaW5UZXh0KHBsYWluVGV4dCkge1xuICAgICAgICByZXR1cm4gcGxhaW5UZXh0LnJlcGxhY2UoL1tcXFxcYCpfe31bXFxdKCkjK1xcLS4hXS9nLCAnXFxcXCQmJyk7IC8vIGVzY2FwZSBtYXJrZG93biBzeW50YXggdG9rZW5zOiBodHRwOi8vZGFyaW5nZmlyZWJhbGwubmV0L3Byb2plY3RzL21hcmtkb3duL3N5bnRheCNiYWNrc2xhc2hcbiAgICB9XG4gICAgTWFya2VkU3RyaW5nLmZyb21QbGFpblRleHQgPSBmcm9tUGxhaW5UZXh0O1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBjb25mb3JtcyB0byB0aGUge0BsaW5rIE1hcmtlZFN0cmluZ30gdHlwZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLnN0cmluZyhjYW5kaWRhdGUpIHx8IChJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5sYW5ndWFnZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS52YWx1ZSkpO1xuICAgIH1cbiAgICBNYXJrZWRTdHJpbmcuaXMgPSBpcztcbn0pKE1hcmtlZFN0cmluZyB8fCAoTWFya2VkU3RyaW5nID0ge30pKTtcbmV4cG9ydCB2YXIgSG92ZXI7XG4oZnVuY3Rpb24gKEhvdmVyKSB7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgSG92ZXJ9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiAhIWNhbmRpZGF0ZSAmJiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgKE1hcmt1cENvbnRlbnQuaXMoY2FuZGlkYXRlLmNvbnRlbnRzKSB8fFxuICAgICAgICAgICAgTWFya2VkU3RyaW5nLmlzKGNhbmRpZGF0ZS5jb250ZW50cykgfHxcbiAgICAgICAgICAgIElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLmNvbnRlbnRzLCBNYXJrZWRTdHJpbmcuaXMpKSAmJiAodmFsdWUucmFuZ2UgPT09IHVuZGVmaW5lZCB8fCBSYW5nZS5pcyh2YWx1ZS5yYW5nZSkpO1xuICAgIH1cbiAgICBIb3Zlci5pcyA9IGlzO1xufSkoSG92ZXIgfHwgKEhvdmVyID0ge30pKTtcbi8qKlxuICogVGhlIFBhcmFtZXRlckluZm9ybWF0aW9uIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIFBhcmFtZXRlckluZm9ybWF0aW9ufSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBQYXJhbWV0ZXJJbmZvcm1hdGlvbjtcbihmdW5jdGlvbiAoUGFyYW1ldGVySW5mb3JtYXRpb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHBhcmFtZXRlciBpbmZvcm1hdGlvbiBsaXRlcmFsLlxuICAgICAqXG4gICAgICogQHBhcmFtIGxhYmVsIEEgbGFiZWwgc3RyaW5nLlxuICAgICAqIEBwYXJhbSBkb2N1bWVudGF0aW9uIEEgZG9jIHN0cmluZy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobGFiZWwsIGRvY3VtZW50YXRpb24pIHtcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50YXRpb24gPyB7IGxhYmVsLCBkb2N1bWVudGF0aW9uIH0gOiB7IGxhYmVsIH07XG4gICAgfVxuICAgIFBhcmFtZXRlckluZm9ybWF0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKFBhcmFtZXRlckluZm9ybWF0aW9uIHx8IChQYXJhbWV0ZXJJbmZvcm1hdGlvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBTaWduYXR1cmVJbmZvcm1hdGlvbiBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBTaWduYXR1cmVJbmZvcm1hdGlvbn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgU2lnbmF0dXJlSW5mb3JtYXRpb247XG4oZnVuY3Rpb24gKFNpZ25hdHVyZUluZm9ybWF0aW9uKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKGxhYmVsLCBkb2N1bWVudGF0aW9uLCAuLi5wYXJhbWV0ZXJzKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IGxhYmVsIH07XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKGRvY3VtZW50YXRpb24pKSB7XG4gICAgICAgICAgICByZXN1bHQuZG9jdW1lbnRhdGlvbiA9IGRvY3VtZW50YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzLmRlZmluZWQocGFyYW1ldGVycykpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wYXJhbWV0ZXJzID0gcGFyYW1ldGVycztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdC5wYXJhbWV0ZXJzID0gW107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgU2lnbmF0dXJlSW5mb3JtYXRpb24uY3JlYXRlID0gY3JlYXRlO1xufSkoU2lnbmF0dXJlSW5mb3JtYXRpb24gfHwgKFNpZ25hdHVyZUluZm9ybWF0aW9uID0ge30pKTtcbi8qKlxuICogQSBkb2N1bWVudCBoaWdobGlnaHQga2luZC5cbiAqL1xuZXhwb3J0IHZhciBEb2N1bWVudEhpZ2hsaWdodEtpbmQ7XG4oZnVuY3Rpb24gKERvY3VtZW50SGlnaGxpZ2h0S2luZCkge1xuICAgIC8qKlxuICAgICAqIEEgdGV4dHVhbCBvY2N1cnJlbmNlLlxuICAgICAqL1xuICAgIERvY3VtZW50SGlnaGxpZ2h0S2luZC5UZXh0ID0gMTtcbiAgICAvKipcbiAgICAgKiBSZWFkLWFjY2VzcyBvZiBhIHN5bWJvbCwgbGlrZSByZWFkaW5nIGEgdmFyaWFibGUuXG4gICAgICovXG4gICAgRG9jdW1lbnRIaWdobGlnaHRLaW5kLlJlYWQgPSAyO1xuICAgIC8qKlxuICAgICAqIFdyaXRlLWFjY2VzcyBvZiBhIHN5bWJvbCwgbGlrZSB3cml0aW5nIHRvIGEgdmFyaWFibGUuXG4gICAgICovXG4gICAgRG9jdW1lbnRIaWdobGlnaHRLaW5kLldyaXRlID0gMztcbn0pKERvY3VtZW50SGlnaGxpZ2h0S2luZCB8fCAoRG9jdW1lbnRIaWdobGlnaHRLaW5kID0ge30pKTtcbi8qKlxuICogRG9jdW1lbnRIaWdobGlnaHQgbmFtZXNwYWNlIHRvIHByb3ZpZGUgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBEb2N1bWVudEhpZ2hsaWdodH0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgRG9jdW1lbnRIaWdobGlnaHQ7XG4oZnVuY3Rpb24gKERvY3VtZW50SGlnaGxpZ2h0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgRG9jdW1lbnRIaWdobGlnaHQgb2JqZWN0LlxuICAgICAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2UgdGhlIGhpZ2hsaWdodCBhcHBsaWVzIHRvLlxuICAgICAqIEBwYXJhbSBraW5kIFRoZSBoaWdobGlnaHQga2luZFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwga2luZCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0geyByYW5nZSB9O1xuICAgICAgICBpZiAoSXMubnVtYmVyKGtpbmQpKSB7XG4gICAgICAgICAgICByZXN1bHQua2luZCA9IGtpbmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgRG9jdW1lbnRIaWdobGlnaHQuY3JlYXRlID0gY3JlYXRlO1xufSkoRG9jdW1lbnRIaWdobGlnaHQgfHwgKERvY3VtZW50SGlnaGxpZ2h0ID0ge30pKTtcbi8qKlxuICogQSBzeW1ib2wga2luZC5cbiAqL1xuZXhwb3J0IHZhciBTeW1ib2xLaW5kO1xuKGZ1bmN0aW9uIChTeW1ib2xLaW5kKSB7XG4gICAgU3ltYm9sS2luZC5GaWxlID0gMTtcbiAgICBTeW1ib2xLaW5kLk1vZHVsZSA9IDI7XG4gICAgU3ltYm9sS2luZC5OYW1lc3BhY2UgPSAzO1xuICAgIFN5bWJvbEtpbmQuUGFja2FnZSA9IDQ7XG4gICAgU3ltYm9sS2luZC5DbGFzcyA9IDU7XG4gICAgU3ltYm9sS2luZC5NZXRob2QgPSA2O1xuICAgIFN5bWJvbEtpbmQuUHJvcGVydHkgPSA3O1xuICAgIFN5bWJvbEtpbmQuRmllbGQgPSA4O1xuICAgIFN5bWJvbEtpbmQuQ29uc3RydWN0b3IgPSA5O1xuICAgIFN5bWJvbEtpbmQuRW51bSA9IDEwO1xuICAgIFN5bWJvbEtpbmQuSW50ZXJmYWNlID0gMTE7XG4gICAgU3ltYm9sS2luZC5GdW5jdGlvbiA9IDEyO1xuICAgIFN5bWJvbEtpbmQuVmFyaWFibGUgPSAxMztcbiAgICBTeW1ib2xLaW5kLkNvbnN0YW50ID0gMTQ7XG4gICAgU3ltYm9sS2luZC5TdHJpbmcgPSAxNTtcbiAgICBTeW1ib2xLaW5kLk51bWJlciA9IDE2O1xuICAgIFN5bWJvbEtpbmQuQm9vbGVhbiA9IDE3O1xuICAgIFN5bWJvbEtpbmQuQXJyYXkgPSAxODtcbiAgICBTeW1ib2xLaW5kLk9iamVjdCA9IDE5O1xuICAgIFN5bWJvbEtpbmQuS2V5ID0gMjA7XG4gICAgU3ltYm9sS2luZC5OdWxsID0gMjE7XG4gICAgU3ltYm9sS2luZC5FbnVtTWVtYmVyID0gMjI7XG4gICAgU3ltYm9sS2luZC5TdHJ1Y3QgPSAyMztcbiAgICBTeW1ib2xLaW5kLkV2ZW50ID0gMjQ7XG4gICAgU3ltYm9sS2luZC5PcGVyYXRvciA9IDI1O1xuICAgIFN5bWJvbEtpbmQuVHlwZVBhcmFtZXRlciA9IDI2O1xufSkoU3ltYm9sS2luZCB8fCAoU3ltYm9sS2luZCA9IHt9KSk7XG4vKipcbiAqIFN5bWJvbCB0YWdzIGFyZSBleHRyYSBhbm5vdGF0aW9ucyB0aGF0IHR3ZWFrIHRoZSByZW5kZXJpbmcgb2YgYSBzeW1ib2wuXG4gKlxuICogQHNpbmNlIDMuMTZcbiAqL1xuZXhwb3J0IHZhciBTeW1ib2xUYWc7XG4oZnVuY3Rpb24gKFN5bWJvbFRhZykge1xuICAgIC8qKlxuICAgICAqIFJlbmRlciBhIHN5bWJvbCBhcyBvYnNvbGV0ZSwgdXN1YWxseSB1c2luZyBhIHN0cmlrZS1vdXQuXG4gICAgICovXG4gICAgU3ltYm9sVGFnLkRlcHJlY2F0ZWQgPSAxO1xufSkoU3ltYm9sVGFnIHx8IChTeW1ib2xUYWcgPSB7fSkpO1xuZXhwb3J0IHZhciBTeW1ib2xJbmZvcm1hdGlvbjtcbihmdW5jdGlvbiAoU3ltYm9sSW5mb3JtYXRpb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHN5bWJvbCBpbmZvcm1hdGlvbiBsaXRlcmFsLlxuICAgICAqXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0ga2luZCBUaGUga2luZCBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2Ugb2YgdGhlIGxvY2F0aW9uIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgcmVzb3VyY2Ugb2YgdGhlIGxvY2F0aW9uIG9mIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gY29udGFpbmVyTmFtZSBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sIGNvbnRhaW5pbmcgdGhlIHN5bWJvbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobmFtZSwga2luZCwgcmFuZ2UsIHVyaSwgY29udGFpbmVyTmFtZSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGtpbmQsXG4gICAgICAgICAgICBsb2NhdGlvbjogeyB1cmksIHJhbmdlIH1cbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGNvbnRhaW5lck5hbWUpIHtcbiAgICAgICAgICAgIHJlc3VsdC5jb250YWluZXJOYW1lID0gY29udGFpbmVyTmFtZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBTeW1ib2xJbmZvcm1hdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG59KShTeW1ib2xJbmZvcm1hdGlvbiB8fCAoU3ltYm9sSW5mb3JtYXRpb24gPSB7fSkpO1xuZXhwb3J0IHZhciBXb3Jrc3BhY2VTeW1ib2w7XG4oZnVuY3Rpb24gKFdvcmtzcGFjZVN5bWJvbCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyB3b3Jrc3BhY2Ugc3ltYm9sLlxuICAgICAqXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0ga2luZCBUaGUga2luZCBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIHJlc291cmNlIG9mIHRoZSBsb2NhdGlvbiBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSByYW5nZSBBbiBvcHRpb25zIHJhbmdlIG9mIHRoZSBsb2NhdGlvbi5cbiAgICAgKiBAcmV0dXJucyBBIFdvcmtzcGFjZVN5bWJvbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobmFtZSwga2luZCwgdXJpLCByYW5nZSkge1xuICAgICAgICByZXR1cm4gcmFuZ2UgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyB7IG5hbWUsIGtpbmQsIGxvY2F0aW9uOiB7IHVyaSwgcmFuZ2UgfSB9XG4gICAgICAgICAgICA6IHsgbmFtZSwga2luZCwgbG9jYXRpb246IHsgdXJpIH0gfTtcbiAgICB9XG4gICAgV29ya3NwYWNlU3ltYm9sLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKFdvcmtzcGFjZVN5bWJvbCB8fCAoV29ya3NwYWNlU3ltYm9sID0ge30pKTtcbmV4cG9ydCB2YXIgRG9jdW1lbnRTeW1ib2w7XG4oZnVuY3Rpb24gKERvY3VtZW50U3ltYm9sKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBzeW1ib2wgaW5mb3JtYXRpb24gbGl0ZXJhbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIGRldGFpbCBUaGUgZGV0YWlsIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIGtpbmQgVGhlIGtpbmQgb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIHNlbGVjdGlvblJhbmdlIFRoZSBzZWxlY3Rpb25SYW5nZSBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSBjaGlsZHJlbiBDaGlsZHJlbiBvZiB0aGUgc3ltYm9sLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShuYW1lLCBkZXRhaWwsIGtpbmQsIHJhbmdlLCBzZWxlY3Rpb25SYW5nZSwgY2hpbGRyZW4pIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBkZXRhaWwsXG4gICAgICAgICAgICBraW5kLFxuICAgICAgICAgICAgcmFuZ2UsXG4gICAgICAgICAgICBzZWxlY3Rpb25SYW5nZVxuICAgICAgICB9O1xuICAgICAgICBpZiAoY2hpbGRyZW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmNoaWxkcmVuID0gY2hpbGRyZW47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgRG9jdW1lbnRTeW1ib2wuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgRG9jdW1lbnRTeW1ib2x9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiZcbiAgICAgICAgICAgIElzLnN0cmluZyhjYW5kaWRhdGUubmFtZSkgJiYgSXMubnVtYmVyKGNhbmRpZGF0ZS5raW5kKSAmJlxuICAgICAgICAgICAgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUuc2VsZWN0aW9uUmFuZ2UpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmRldGFpbCA9PT0gdW5kZWZpbmVkIHx8IElzLnN0cmluZyhjYW5kaWRhdGUuZGV0YWlsKSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuZGVwcmVjYXRlZCA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLmRlcHJlY2F0ZWQpKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5jaGlsZHJlbiA9PT0gdW5kZWZpbmVkIHx8IEFycmF5LmlzQXJyYXkoY2FuZGlkYXRlLmNoaWxkcmVuKSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUudGFncyA9PT0gdW5kZWZpbmVkIHx8IEFycmF5LmlzQXJyYXkoY2FuZGlkYXRlLnRhZ3MpKTtcbiAgICB9XG4gICAgRG9jdW1lbnRTeW1ib2wuaXMgPSBpcztcbn0pKERvY3VtZW50U3ltYm9sIHx8IChEb2N1bWVudFN5bWJvbCA9IHt9KSk7XG4vKipcbiAqIEEgc2V0IG9mIHByZWRlZmluZWQgY29kZSBhY3Rpb24ga2luZHNcbiAqL1xuZXhwb3J0IHZhciBDb2RlQWN0aW9uS2luZDtcbihmdW5jdGlvbiAoQ29kZUFjdGlvbktpbmQpIHtcbiAgICAvKipcbiAgICAgKiBFbXB0eSBraW5kLlxuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLkVtcHR5ID0gJyc7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciBxdWlja2ZpeCBhY3Rpb25zOiAncXVpY2tmaXgnXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuUXVpY2tGaXggPSAncXVpY2tmaXgnO1xuICAgIC8qKlxuICAgICAqIEJhc2Uga2luZCBmb3IgcmVmYWN0b3JpbmcgYWN0aW9uczogJ3JlZmFjdG9yJ1xuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlJlZmFjdG9yID0gJ3JlZmFjdG9yJztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIHJlZmFjdG9yaW5nIGV4dHJhY3Rpb24gYWN0aW9uczogJ3JlZmFjdG9yLmV4dHJhY3QnXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIGV4dHJhY3QgYWN0aW9uczpcbiAgICAgKlxuICAgICAqIC0gRXh0cmFjdCBtZXRob2RcbiAgICAgKiAtIEV4dHJhY3QgZnVuY3Rpb25cbiAgICAgKiAtIEV4dHJhY3QgdmFyaWFibGVcbiAgICAgKiAtIEV4dHJhY3QgaW50ZXJmYWNlIGZyb20gY2xhc3NcbiAgICAgKiAtIC4uLlxuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlJlZmFjdG9yRXh0cmFjdCA9ICdyZWZhY3Rvci5leHRyYWN0JztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIHJlZmFjdG9yaW5nIGlubGluZSBhY3Rpb25zOiAncmVmYWN0b3IuaW5saW5lJ1xuICAgICAqXG4gICAgICogRXhhbXBsZSBpbmxpbmUgYWN0aW9uczpcbiAgICAgKlxuICAgICAqIC0gSW5saW5lIGZ1bmN0aW9uXG4gICAgICogLSBJbmxpbmUgdmFyaWFibGVcbiAgICAgKiAtIElubGluZSBjb25zdGFudFxuICAgICAqIC0gLi4uXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuUmVmYWN0b3JJbmxpbmUgPSAncmVmYWN0b3IuaW5saW5lJztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIHJlZmFjdG9yaW5nIHJld3JpdGUgYWN0aW9uczogJ3JlZmFjdG9yLnJld3JpdGUnXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIHJld3JpdGUgYWN0aW9uczpcbiAgICAgKlxuICAgICAqIC0gQ29udmVydCBKYXZhU2NyaXB0IGZ1bmN0aW9uIHRvIGNsYXNzXG4gICAgICogLSBBZGQgb3IgcmVtb3ZlIHBhcmFtZXRlclxuICAgICAqIC0gRW5jYXBzdWxhdGUgZmllbGRcbiAgICAgKiAtIE1ha2UgbWV0aG9kIHN0YXRpY1xuICAgICAqIC0gTW92ZSBtZXRob2QgdG8gYmFzZSBjbGFzc1xuICAgICAqIC0gLi4uXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuUmVmYWN0b3JSZXdyaXRlID0gJ3JlZmFjdG9yLnJld3JpdGUnO1xuICAgIC8qKlxuICAgICAqIEJhc2Uga2luZCBmb3Igc291cmNlIGFjdGlvbnM6IGBzb3VyY2VgXG4gICAgICpcbiAgICAgKiBTb3VyY2UgY29kZSBhY3Rpb25zIGFwcGx5IHRvIHRoZSBlbnRpcmUgZmlsZS5cbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5Tb3VyY2UgPSAnc291cmNlJztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIGFuIG9yZ2FuaXplIGltcG9ydHMgc291cmNlIGFjdGlvbjogYHNvdXJjZS5vcmdhbml6ZUltcG9ydHNgXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuU291cmNlT3JnYW5pemVJbXBvcnRzID0gJ3NvdXJjZS5vcmdhbml6ZUltcG9ydHMnO1xuICAgIC8qKlxuICAgICAqIEJhc2Uga2luZCBmb3IgYXV0by1maXggc291cmNlIGFjdGlvbnM6IGBzb3VyY2UuZml4QWxsYC5cbiAgICAgKlxuICAgICAqIEZpeCBhbGwgYWN0aW9ucyBhdXRvbWF0aWNhbGx5IGZpeCBlcnJvcnMgdGhhdCBoYXZlIGEgY2xlYXIgZml4IHRoYXQgZG8gbm90IHJlcXVpcmUgdXNlciBpbnB1dC5cbiAgICAgKiBUaGV5IHNob3VsZCBub3Qgc3VwcHJlc3MgZXJyb3JzIG9yIHBlcmZvcm0gdW5zYWZlIGZpeGVzIHN1Y2ggYXMgZ2VuZXJhdGluZyBuZXcgdHlwZXMgb3IgY2xhc3Nlcy5cbiAgICAgKlxuICAgICAqIEBzaW5jZSAzLjE1LjBcbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5Tb3VyY2VGaXhBbGwgPSAnc291cmNlLmZpeEFsbCc7XG59KShDb2RlQWN0aW9uS2luZCB8fCAoQ29kZUFjdGlvbktpbmQgPSB7fSkpO1xuLyoqXG4gKiBUaGUgcmVhc29uIHdoeSBjb2RlIGFjdGlvbnMgd2VyZSByZXF1ZXN0ZWQuXG4gKlxuICogQHNpbmNlIDMuMTcuMFxuICovXG5leHBvcnQgdmFyIENvZGVBY3Rpb25UcmlnZ2VyS2luZDtcbihmdW5jdGlvbiAoQ29kZUFjdGlvblRyaWdnZXJLaW5kKSB7XG4gICAgLyoqXG4gICAgICogQ29kZSBhY3Rpb25zIHdlcmUgZXhwbGljaXRseSByZXF1ZXN0ZWQgYnkgdGhlIHVzZXIgb3IgYnkgYW4gZXh0ZW5zaW9uLlxuICAgICAqL1xuICAgIENvZGVBY3Rpb25UcmlnZ2VyS2luZC5JbnZva2VkID0gMTtcbiAgICAvKipcbiAgICAgKiBDb2RlIGFjdGlvbnMgd2VyZSByZXF1ZXN0ZWQgYXV0b21hdGljYWxseS5cbiAgICAgKlxuICAgICAqIFRoaXMgdHlwaWNhbGx5IGhhcHBlbnMgd2hlbiBjdXJyZW50IHNlbGVjdGlvbiBpbiBhIGZpbGUgY2hhbmdlcywgYnV0IGNhblxuICAgICAqIGFsc28gYmUgdHJpZ2dlcmVkIHdoZW4gZmlsZSBjb250ZW50IGNoYW5nZXMuXG4gICAgICovXG4gICAgQ29kZUFjdGlvblRyaWdnZXJLaW5kLkF1dG9tYXRpYyA9IDI7XG59KShDb2RlQWN0aW9uVHJpZ2dlcktpbmQgfHwgKENvZGVBY3Rpb25UcmlnZ2VyS2luZCA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb2RlQWN0aW9uQ29udGV4dCBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBDb2RlQWN0aW9uQ29udGV4dH0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgQ29kZUFjdGlvbkNvbnRleHQ7XG4oZnVuY3Rpb24gKENvZGVBY3Rpb25Db250ZXh0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDb2RlQWN0aW9uQ29udGV4dCBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShkaWFnbm9zdGljcywgb25seSwgdHJpZ2dlcktpbmQpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHsgZGlhZ25vc3RpY3MgfTtcbiAgICAgICAgaWYgKG9ubHkgIT09IHVuZGVmaW5lZCAmJiBvbmx5ICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXN1bHQub25seSA9IG9ubHk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyaWdnZXJLaW5kICE9PSB1bmRlZmluZWQgJiYgdHJpZ2dlcktpbmQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJlc3VsdC50cmlnZ2VyS2luZCA9IHRyaWdnZXJLaW5kO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIENvZGVBY3Rpb25Db250ZXh0LmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIENvZGVBY3Rpb25Db250ZXh0fSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLmRpYWdub3N0aWNzLCBEaWFnbm9zdGljLmlzKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS5vbmx5ID09PSB1bmRlZmluZWQgfHwgSXMudHlwZWRBcnJheShjYW5kaWRhdGUub25seSwgSXMuc3RyaW5nKSlcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUudHJpZ2dlcktpbmQgPT09IHVuZGVmaW5lZCB8fCBjYW5kaWRhdGUudHJpZ2dlcktpbmQgPT09IENvZGVBY3Rpb25UcmlnZ2VyS2luZC5JbnZva2VkIHx8IGNhbmRpZGF0ZS50cmlnZ2VyS2luZCA9PT0gQ29kZUFjdGlvblRyaWdnZXJLaW5kLkF1dG9tYXRpYyk7XG4gICAgfVxuICAgIENvZGVBY3Rpb25Db250ZXh0LmlzID0gaXM7XG59KShDb2RlQWN0aW9uQ29udGV4dCB8fCAoQ29kZUFjdGlvbkNvbnRleHQgPSB7fSkpO1xuZXhwb3J0IHZhciBDb2RlQWN0aW9uO1xuKGZ1bmN0aW9uIChDb2RlQWN0aW9uKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKHRpdGxlLCBraW5kT3JDb21tYW5kT3JFZGl0LCBraW5kKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IHRpdGxlIH07XG4gICAgICAgIGxldCBjaGVja0tpbmQgPSB0cnVlO1xuICAgICAgICBpZiAodHlwZW9mIGtpbmRPckNvbW1hbmRPckVkaXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjaGVja0tpbmQgPSBmYWxzZTtcbiAgICAgICAgICAgIHJlc3VsdC5raW5kID0ga2luZE9yQ29tbWFuZE9yRWRpdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChDb21tYW5kLmlzKGtpbmRPckNvbW1hbmRPckVkaXQpKSB7XG4gICAgICAgICAgICByZXN1bHQuY29tbWFuZCA9IGtpbmRPckNvbW1hbmRPckVkaXQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQuZWRpdCA9IGtpbmRPckNvbW1hbmRPckVkaXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoZWNrS2luZCAmJiBraW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5raW5kID0ga2luZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBDb2RlQWN0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS50aXRsZSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuZGlhZ25vc3RpY3MgPT09IHVuZGVmaW5lZCB8fCBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS5kaWFnbm9zdGljcywgRGlhZ25vc3RpYy5pcykpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmtpbmQgPT09IHVuZGVmaW5lZCB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLmtpbmQpKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5lZGl0ICE9PSB1bmRlZmluZWQgfHwgY2FuZGlkYXRlLmNvbW1hbmQgIT09IHVuZGVmaW5lZCkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuY29tbWFuZCA9PT0gdW5kZWZpbmVkIHx8IENvbW1hbmQuaXMoY2FuZGlkYXRlLmNvbW1hbmQpKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5pc1ByZWZlcnJlZCA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLmlzUHJlZmVycmVkKSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuZWRpdCA9PT0gdW5kZWZpbmVkIHx8IFdvcmtzcGFjZUVkaXQuaXMoY2FuZGlkYXRlLmVkaXQpKTtcbiAgICB9XG4gICAgQ29kZUFjdGlvbi5pcyA9IGlzO1xufSkoQ29kZUFjdGlvbiB8fCAoQ29kZUFjdGlvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb2RlTGVucyBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBDb2RlTGVuc30gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgQ29kZUxlbnM7XG4oZnVuY3Rpb24gKENvZGVMZW5zKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDb2RlTGVucyBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgZGF0YSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0geyByYW5nZSB9O1xuICAgICAgICBpZiAoSXMuZGVmaW5lZChkYXRhKSkge1xuICAgICAgICAgICAgcmVzdWx0LmRhdGEgPSBkYXRhO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIENvZGVMZW5zLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIENvZGVMZW5zfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUuY29tbWFuZCkgfHwgQ29tbWFuZC5pcyhjYW5kaWRhdGUuY29tbWFuZCkpO1xuICAgIH1cbiAgICBDb2RlTGVucy5pcyA9IGlzO1xufSkoQ29kZUxlbnMgfHwgKENvZGVMZW5zID0ge30pKTtcbi8qKlxuICogVGhlIEZvcm1hdHRpbmdPcHRpb25zIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIEZvcm1hdHRpbmdPcHRpb25zfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBGb3JtYXR0aW5nT3B0aW9ucztcbihmdW5jdGlvbiAoRm9ybWF0dGluZ09wdGlvbnMpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IEZvcm1hdHRpbmdPcHRpb25zIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHRhYlNpemUsIGluc2VydFNwYWNlcykge1xuICAgICAgICByZXR1cm4geyB0YWJTaXplLCBpbnNlcnRTcGFjZXMgfTtcbiAgICB9XG4gICAgRm9ybWF0dGluZ09wdGlvbnMuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgRm9ybWF0dGluZ09wdGlvbnN9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMudWludGVnZXIoY2FuZGlkYXRlLnRhYlNpemUpICYmIElzLmJvb2xlYW4oY2FuZGlkYXRlLmluc2VydFNwYWNlcyk7XG4gICAgfVxuICAgIEZvcm1hdHRpbmdPcHRpb25zLmlzID0gaXM7XG59KShGb3JtYXR0aW5nT3B0aW9ucyB8fCAoRm9ybWF0dGluZ09wdGlvbnMgPSB7fSkpO1xuLyoqXG4gKiBUaGUgRG9jdW1lbnRMaW5rIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIERvY3VtZW50TGlua30gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgRG9jdW1lbnRMaW5rO1xuKGZ1bmN0aW9uIChEb2N1bWVudExpbmspIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IERvY3VtZW50TGluayBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgdGFyZ2V0LCBkYXRhKSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCB0YXJnZXQsIGRhdGEgfTtcbiAgICB9XG4gICAgRG9jdW1lbnRMaW5rLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIERvY3VtZW50TGlua30gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLnRhcmdldCkgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS50YXJnZXQpKTtcbiAgICB9XG4gICAgRG9jdW1lbnRMaW5rLmlzID0gaXM7XG59KShEb2N1bWVudExpbmsgfHwgKERvY3VtZW50TGluayA9IHt9KSk7XG4vKipcbiAqIFRoZSBTZWxlY3Rpb25SYW5nZSBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9uIHRvIHdvcmsgd2l0aFxuICogU2VsZWN0aW9uUmFuZ2UgbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgU2VsZWN0aW9uUmFuZ2U7XG4oZnVuY3Rpb24gKFNlbGVjdGlvblJhbmdlKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBTZWxlY3Rpb25SYW5nZVxuICAgICAqIEBwYXJhbSByYW5nZSB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHBhcmVudCBhbiBvcHRpb25hbCBwYXJlbnQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCBwYXJlbnQpIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIHBhcmVudCB9O1xuICAgIH1cbiAgICBTZWxlY3Rpb25SYW5nZS5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgKGNhbmRpZGF0ZS5wYXJlbnQgPT09IHVuZGVmaW5lZCB8fCBTZWxlY3Rpb25SYW5nZS5pcyhjYW5kaWRhdGUucGFyZW50KSk7XG4gICAgfVxuICAgIFNlbGVjdGlvblJhbmdlLmlzID0gaXM7XG59KShTZWxlY3Rpb25SYW5nZSB8fCAoU2VsZWN0aW9uUmFuZ2UgPSB7fSkpO1xuLyoqXG4gKiBBIHNldCBvZiBwcmVkZWZpbmVkIHRva2VuIHR5cGVzLiBUaGlzIHNldCBpcyBub3QgZml4ZWRcbiAqIGFuIGNsaWVudHMgY2FuIHNwZWNpZnkgYWRkaXRpb25hbCB0b2tlbiB0eXBlcyB2aWEgdGhlXG4gKiBjb3JyZXNwb25kaW5nIGNsaWVudCBjYXBhYmlsaXRpZXMuXG4gKlxuICogQHNpbmNlIDMuMTYuMFxuICovXG5leHBvcnQgdmFyIFNlbWFudGljVG9rZW5UeXBlcztcbihmdW5jdGlvbiAoU2VtYW50aWNUb2tlblR5cGVzKSB7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wibmFtZXNwYWNlXCJdID0gXCJuYW1lc3BhY2VcIjtcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgZ2VuZXJpYyB0eXBlLiBBY3RzIGFzIGEgZmFsbGJhY2sgZm9yIHR5cGVzIHdoaWNoIGNhbid0IGJlIG1hcHBlZCB0b1xuICAgICAqIGEgc3BlY2lmaWMgdHlwZSBsaWtlIGNsYXNzIG9yIGVudW0uXG4gICAgICovXG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1widHlwZVwiXSA9IFwidHlwZVwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImNsYXNzXCJdID0gXCJjbGFzc1wiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImVudW1cIl0gPSBcImVudW1cIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJpbnRlcmZhY2VcIl0gPSBcImludGVyZmFjZVwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInN0cnVjdFwiXSA9IFwic3RydWN0XCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1widHlwZVBhcmFtZXRlclwiXSA9IFwidHlwZVBhcmFtZXRlclwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInBhcmFtZXRlclwiXSA9IFwicGFyYW1ldGVyXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1widmFyaWFibGVcIl0gPSBcInZhcmlhYmxlXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wicHJvcGVydHlcIl0gPSBcInByb3BlcnR5XCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wiZW51bU1lbWJlclwiXSA9IFwiZW51bU1lbWJlclwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImV2ZW50XCJdID0gXCJldmVudFwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImZ1bmN0aW9uXCJdID0gXCJmdW5jdGlvblwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcIm1ldGhvZFwiXSA9IFwibWV0aG9kXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wibWFjcm9cIl0gPSBcIm1hY3JvXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wia2V5d29yZFwiXSA9IFwia2V5d29yZFwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcIm1vZGlmaWVyXCJdID0gXCJtb2RpZmllclwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImNvbW1lbnRcIl0gPSBcImNvbW1lbnRcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJzdHJpbmdcIl0gPSBcInN0cmluZ1wiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcIm51bWJlclwiXSA9IFwibnVtYmVyXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wicmVnZXhwXCJdID0gXCJyZWdleHBcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJvcGVyYXRvclwiXSA9IFwib3BlcmF0b3JcIjtcbiAgICAvKipcbiAgICAgKiBAc2luY2UgMy4xNy4wXG4gICAgICovXG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wiZGVjb3JhdG9yXCJdID0gXCJkZWNvcmF0b3JcIjtcbn0pKFNlbWFudGljVG9rZW5UeXBlcyB8fCAoU2VtYW50aWNUb2tlblR5cGVzID0ge30pKTtcbi8qKlxuICogQSBzZXQgb2YgcHJlZGVmaW5lZCB0b2tlbiBtb2RpZmllcnMuIFRoaXMgc2V0IGlzIG5vdCBmaXhlZFxuICogYW4gY2xpZW50cyBjYW4gc3BlY2lmeSBhZGRpdGlvbmFsIHRva2VuIHR5cGVzIHZpYSB0aGVcbiAqIGNvcnJlc3BvbmRpbmcgY2xpZW50IGNhcGFiaWxpdGllcy5cbiAqXG4gKiBAc2luY2UgMy4xNi4wXG4gKi9cbmV4cG9ydCB2YXIgU2VtYW50aWNUb2tlbk1vZGlmaWVycztcbihmdW5jdGlvbiAoU2VtYW50aWNUb2tlbk1vZGlmaWVycykge1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJkZWNsYXJhdGlvblwiXSA9IFwiZGVjbGFyYXRpb25cIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wiZGVmaW5pdGlvblwiXSA9IFwiZGVmaW5pdGlvblwiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJyZWFkb25seVwiXSA9IFwicmVhZG9ubHlcIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wic3RhdGljXCJdID0gXCJzdGF0aWNcIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wiZGVwcmVjYXRlZFwiXSA9IFwiZGVwcmVjYXRlZFwiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJhYnN0cmFjdFwiXSA9IFwiYWJzdHJhY3RcIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wiYXN5bmNcIl0gPSBcImFzeW5jXCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcIm1vZGlmaWNhdGlvblwiXSA9IFwibW9kaWZpY2F0aW9uXCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcImRvY3VtZW50YXRpb25cIl0gPSBcImRvY3VtZW50YXRpb25cIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wiZGVmYXVsdExpYnJhcnlcIl0gPSBcImRlZmF1bHRMaWJyYXJ5XCI7XG59KShTZW1hbnRpY1Rva2VuTW9kaWZpZXJzIHx8IChTZW1hbnRpY1Rva2VuTW9kaWZpZXJzID0ge30pKTtcbi8qKlxuICogQHNpbmNlIDMuMTYuMFxuICovXG5leHBvcnQgdmFyIFNlbWFudGljVG9rZW5zO1xuKGZ1bmN0aW9uIChTZW1hbnRpY1Rva2Vucykge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIChjYW5kaWRhdGUucmVzdWx0SWQgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgY2FuZGlkYXRlLnJlc3VsdElkID09PSAnc3RyaW5nJykgJiZcbiAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoY2FuZGlkYXRlLmRhdGEpICYmIChjYW5kaWRhdGUuZGF0YS5sZW5ndGggPT09IDAgfHwgdHlwZW9mIGNhbmRpZGF0ZS5kYXRhWzBdID09PSAnbnVtYmVyJyk7XG4gICAgfVxuICAgIFNlbWFudGljVG9rZW5zLmlzID0gaXM7XG59KShTZW1hbnRpY1Rva2VucyB8fCAoU2VtYW50aWNUb2tlbnMgPSB7fSkpO1xuLyoqXG4gKiBUaGUgSW5saW5lVmFsdWVUZXh0IG5hbWVzcGFjZSBwcm92aWRlcyBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIElubGluZVZhbHVlVGV4dHMuXG4gKlxuICogQHNpbmNlIDMuMTcuMFxuICovXG5leHBvcnQgdmFyIElubGluZVZhbHVlVGV4dDtcbihmdW5jdGlvbiAoSW5saW5lVmFsdWVUZXh0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBJbmxpbmVWYWx1ZVRleHQgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIHRleHQpIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIHRleHQgfTtcbiAgICB9XG4gICAgSW5saW5lVmFsdWVUZXh0LmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAhPT0gdW5kZWZpbmVkICYmIGNhbmRpZGF0ZSAhPT0gbnVsbCAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudGV4dCk7XG4gICAgfVxuICAgIElubGluZVZhbHVlVGV4dC5pcyA9IGlzO1xufSkoSW5saW5lVmFsdWVUZXh0IHx8IChJbmxpbmVWYWx1ZVRleHQgPSB7fSkpO1xuLyoqXG4gKiBUaGUgSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cCBuYW1lc3BhY2UgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCBJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3Vwcy5cbiAqXG4gKiBAc2luY2UgMy4xNy4wXG4gKi9cbmV4cG9ydCB2YXIgSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cDtcbihmdW5jdGlvbiAoSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgSW5saW5lVmFsdWVUZXh0IGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCB2YXJpYWJsZU5hbWUsIGNhc2VTZW5zaXRpdmVMb29rdXApIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIHZhcmlhYmxlTmFtZSwgY2FzZVNlbnNpdGl2ZUxvb2t1cCB9O1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAhPT0gdW5kZWZpbmVkICYmIGNhbmRpZGF0ZSAhPT0gbnVsbCAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIElzLmJvb2xlYW4oY2FuZGlkYXRlLmNhc2VTZW5zaXRpdmVMb29rdXApXG4gICAgICAgICAgICAmJiAoSXMuc3RyaW5nKGNhbmRpZGF0ZS52YXJpYWJsZU5hbWUpIHx8IGNhbmRpZGF0ZS52YXJpYWJsZU5hbWUgPT09IHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIElubGluZVZhbHVlVmFyaWFibGVMb29rdXAuaXMgPSBpcztcbn0pKElubGluZVZhbHVlVmFyaWFibGVMb29rdXAgfHwgKElubGluZVZhbHVlVmFyaWFibGVMb29rdXAgPSB7fSkpO1xuLyoqXG4gKiBUaGUgSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24gbmFtZXNwYWNlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGggSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24uXG4gKlxuICogQHNpbmNlIDMuMTcuMFxuICovXG5leHBvcnQgdmFyIElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uO1xuKGZ1bmN0aW9uIChJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24gbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIGV4cHJlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIGV4cHJlc3Npb24gfTtcbiAgICB9XG4gICAgSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24uY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICE9PSB1bmRlZmluZWQgJiYgY2FuZGlkYXRlICE9PSBudWxsICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSlcbiAgICAgICAgICAgICYmIChJcy5zdHJpbmcoY2FuZGlkYXRlLmV4cHJlc3Npb24pIHx8IGNhbmRpZGF0ZS5leHByZXNzaW9uID09PSB1bmRlZmluZWQpO1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbi5pcyA9IGlzO1xufSkoSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24gfHwgKElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uID0ge30pKTtcbi8qKlxuICogVGhlIElubGluZVZhbHVlQ29udGV4dCBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBJbmxpbmVWYWx1ZUNvbnRleHR9IGxpdGVyYWxzLlxuICpcbiAqIEBzaW5jZSAzLjE3LjBcbiAqL1xuZXhwb3J0IHZhciBJbmxpbmVWYWx1ZUNvbnRleHQ7XG4oZnVuY3Rpb24gKElubGluZVZhbHVlQ29udGV4dCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgSW5saW5lVmFsdWVDb250ZXh0IGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGZyYW1lSWQsIHN0b3BwZWRMb2NhdGlvbikge1xuICAgICAgICByZXR1cm4geyBmcmFtZUlkLCBzdG9wcGVkTG9jYXRpb24gfTtcbiAgICB9XG4gICAgSW5saW5lVmFsdWVDb250ZXh0LmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIElubGluZVZhbHVlQ29udGV4dH0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIFJhbmdlLmlzKHZhbHVlLnN0b3BwZWRMb2NhdGlvbik7XG4gICAgfVxuICAgIElubGluZVZhbHVlQ29udGV4dC5pcyA9IGlzO1xufSkoSW5saW5lVmFsdWVDb250ZXh0IHx8IChJbmxpbmVWYWx1ZUNvbnRleHQgPSB7fSkpO1xuLyoqXG4gKiBJbmxheSBoaW50IGtpbmRzLlxuICpcbiAqIEBzaW5jZSAzLjE3LjBcbiAqL1xuZXhwb3J0IHZhciBJbmxheUhpbnRLaW5kO1xuKGZ1bmN0aW9uIChJbmxheUhpbnRLaW5kKSB7XG4gICAgLyoqXG4gICAgICogQW4gaW5sYXkgaGludCB0aGF0IGZvciBhIHR5cGUgYW5ub3RhdGlvbi5cbiAgICAgKi9cbiAgICBJbmxheUhpbnRLaW5kLlR5cGUgPSAxO1xuICAgIC8qKlxuICAgICAqIEFuIGlubGF5IGhpbnQgdGhhdCBpcyBmb3IgYSBwYXJhbWV0ZXIuXG4gICAgICovXG4gICAgSW5sYXlIaW50S2luZC5QYXJhbWV0ZXIgPSAyO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gMSB8fCB2YWx1ZSA9PT0gMjtcbiAgICB9XG4gICAgSW5sYXlIaW50S2luZC5pcyA9IGlzO1xufSkoSW5sYXlIaW50S2luZCB8fCAoSW5sYXlIaW50S2luZCA9IHt9KSk7XG5leHBvcnQgdmFyIElubGF5SGludExhYmVsUGFydDtcbihmdW5jdGlvbiAoSW5sYXlIaW50TGFiZWxQYXJ0KSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB7IHZhbHVlIH07XG4gICAgfVxuICAgIElubGF5SGludExhYmVsUGFydC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSlcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUudG9vbHRpcCA9PT0gdW5kZWZpbmVkIHx8IElzLnN0cmluZyhjYW5kaWRhdGUudG9vbHRpcCkgfHwgTWFya3VwQ29udGVudC5pcyhjYW5kaWRhdGUudG9vbHRpcCkpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLmxvY2F0aW9uID09PSB1bmRlZmluZWQgfHwgTG9jYXRpb24uaXMoY2FuZGlkYXRlLmxvY2F0aW9uKSlcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUuY29tbWFuZCA9PT0gdW5kZWZpbmVkIHx8IENvbW1hbmQuaXMoY2FuZGlkYXRlLmNvbW1hbmQpKTtcbiAgICB9XG4gICAgSW5sYXlIaW50TGFiZWxQYXJ0LmlzID0gaXM7XG59KShJbmxheUhpbnRMYWJlbFBhcnQgfHwgKElubGF5SGludExhYmVsUGFydCA9IHt9KSk7XG5leHBvcnQgdmFyIElubGF5SGludDtcbihmdW5jdGlvbiAoSW5sYXlIaW50KSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKHBvc2l0aW9uLCBsYWJlbCwga2luZCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB7IHBvc2l0aW9uLCBsYWJlbCB9O1xuICAgICAgICBpZiAoa2luZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQua2luZCA9IGtpbmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgSW5sYXlIaW50LmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBQb3NpdGlvbi5pcyhjYW5kaWRhdGUucG9zaXRpb24pXG4gICAgICAgICAgICAmJiAoSXMuc3RyaW5nKGNhbmRpZGF0ZS5sYWJlbCkgfHwgSXMudHlwZWRBcnJheShjYW5kaWRhdGUubGFiZWwsIElubGF5SGludExhYmVsUGFydC5pcykpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLmtpbmQgPT09IHVuZGVmaW5lZCB8fCBJbmxheUhpbnRLaW5kLmlzKGNhbmRpZGF0ZS5raW5kKSlcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUudGV4dEVkaXRzID09PSB1bmRlZmluZWQpIHx8IElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLnRleHRFZGl0cywgVGV4dEVkaXQuaXMpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLnRvb2x0aXAgPT09IHVuZGVmaW5lZCB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLnRvb2x0aXApIHx8IE1hcmt1cENvbnRlbnQuaXMoY2FuZGlkYXRlLnRvb2x0aXApKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS5wYWRkaW5nTGVmdCA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLnBhZGRpbmdMZWZ0KSlcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUucGFkZGluZ1JpZ2h0ID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUucGFkZGluZ1JpZ2h0KSk7XG4gICAgfVxuICAgIElubGF5SGludC5pcyA9IGlzO1xufSkoSW5sYXlIaW50IHx8IChJbmxheUhpbnQgPSB7fSkpO1xuZXhwb3J0IHZhciBTdHJpbmdWYWx1ZTtcbihmdW5jdGlvbiAoU3RyaW5nVmFsdWUpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGVTbmlwcGV0KHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB7IGtpbmQ6ICdzbmlwcGV0JywgdmFsdWUgfTtcbiAgICB9XG4gICAgU3RyaW5nVmFsdWUuY3JlYXRlU25pcHBldCA9IGNyZWF0ZVNuaXBwZXQ7XG59KShTdHJpbmdWYWx1ZSB8fCAoU3RyaW5nVmFsdWUgPSB7fSkpO1xuZXhwb3J0IHZhciBJbmxpbmVDb21wbGV0aW9uSXRlbTtcbihmdW5jdGlvbiAoSW5saW5lQ29tcGxldGlvbkl0ZW0pIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUoaW5zZXJ0VGV4dCwgZmlsdGVyVGV4dCwgcmFuZ2UsIGNvbW1hbmQpIHtcbiAgICAgICAgcmV0dXJuIHsgaW5zZXJ0VGV4dCwgZmlsdGVyVGV4dCwgcmFuZ2UsIGNvbW1hbmQgfTtcbiAgICB9XG4gICAgSW5saW5lQ29tcGxldGlvbkl0ZW0uY3JlYXRlID0gY3JlYXRlO1xufSkoSW5saW5lQ29tcGxldGlvbkl0ZW0gfHwgKElubGluZUNvbXBsZXRpb25JdGVtID0ge30pKTtcbmV4cG9ydCB2YXIgSW5saW5lQ29tcGxldGlvbkxpc3Q7XG4oZnVuY3Rpb24gKElubGluZUNvbXBsZXRpb25MaXN0KSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKGl0ZW1zKSB7XG4gICAgICAgIHJldHVybiB7IGl0ZW1zIH07XG4gICAgfVxuICAgIElubGluZUNvbXBsZXRpb25MaXN0LmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKElubGluZUNvbXBsZXRpb25MaXN0IHx8IChJbmxpbmVDb21wbGV0aW9uTGlzdCA9IHt9KSk7XG4vKipcbiAqIERlc2NyaWJlcyBob3cgYW4ge0BsaW5rIElubGluZUNvbXBsZXRpb25JdGVtUHJvdmlkZXIgaW5saW5lIGNvbXBsZXRpb24gcHJvdmlkZXJ9IHdhcyB0cmlnZ2VyZWQuXG4gKlxuICogQHNpbmNlIDMuMTguMFxuICogQHByb3Bvc2VkXG4gKi9cbmV4cG9ydCB2YXIgSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kO1xuKGZ1bmN0aW9uIChJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmQpIHtcbiAgICAvKipcbiAgICAgKiBDb21wbGV0aW9uIHdhcyB0cmlnZ2VyZWQgZXhwbGljaXRseSBieSBhIHVzZXIgZ2VzdHVyZS5cbiAgICAgKi9cbiAgICBJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmQuSW52b2tlZCA9IDA7XG4gICAgLyoqXG4gICAgICogQ29tcGxldGlvbiB3YXMgdHJpZ2dlcmVkIGF1dG9tYXRpY2FsbHkgd2hpbGUgZWRpdGluZy5cbiAgICAgKi9cbiAgICBJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmQuQXV0b21hdGljID0gMTtcbn0pKElubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZCB8fCAoSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kID0ge30pKTtcbmV4cG9ydCB2YXIgU2VsZWN0ZWRDb21wbGV0aW9uSW5mbztcbihmdW5jdGlvbiAoU2VsZWN0ZWRDb21wbGV0aW9uSW5mbykge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgdGV4dCkge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgdGV4dCB9O1xuICAgIH1cbiAgICBTZWxlY3RlZENvbXBsZXRpb25JbmZvLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKFNlbGVjdGVkQ29tcGxldGlvbkluZm8gfHwgKFNlbGVjdGVkQ29tcGxldGlvbkluZm8gPSB7fSkpO1xuZXhwb3J0IHZhciBJbmxpbmVDb21wbGV0aW9uQ29udGV4dDtcbihmdW5jdGlvbiAoSW5saW5lQ29tcGxldGlvbkNvbnRleHQpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUodHJpZ2dlcktpbmQsIHNlbGVjdGVkQ29tcGxldGlvbkluZm8pIHtcbiAgICAgICAgcmV0dXJuIHsgdHJpZ2dlcktpbmQsIHNlbGVjdGVkQ29tcGxldGlvbkluZm8gfTtcbiAgICB9XG4gICAgSW5saW5lQ29tcGxldGlvbkNvbnRleHQuY3JlYXRlID0gY3JlYXRlO1xufSkoSW5saW5lQ29tcGxldGlvbkNvbnRleHQgfHwgKElubGluZUNvbXBsZXRpb25Db250ZXh0ID0ge30pKTtcbmV4cG9ydCB2YXIgV29ya3NwYWNlRm9sZGVyO1xuKGZ1bmN0aW9uIChXb3Jrc3BhY2VGb2xkZXIpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBVUkkuaXMoY2FuZGlkYXRlLnVyaSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5uYW1lKTtcbiAgICB9XG4gICAgV29ya3NwYWNlRm9sZGVyLmlzID0gaXM7XG59KShXb3Jrc3BhY2VGb2xkZXIgfHwgKFdvcmtzcGFjZUZvbGRlciA9IHt9KSk7XG5leHBvcnQgY29uc3QgRU9MID0gWydcXG4nLCAnXFxyXFxuJywgJ1xcciddO1xuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgdGhlIHRleHQgZG9jdW1lbnQgZnJvbSB0aGUgbmV3IHZzY29kZS1sYW5ndWFnZXNlcnZlci10ZXh0ZG9jdW1lbnQgcGFja2FnZS5cbiAqL1xuZXhwb3J0IHZhciBUZXh0RG9jdW1lbnQ7XG4oZnVuY3Rpb24gKFRleHREb2N1bWVudCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgSVRleHREb2N1bWVudCBsaXRlcmFsIGZyb20gdGhlIGdpdmVuIHVyaSBhbmQgY29udGVudC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSBkb2N1bWVudCdzIHVyaS5cbiAgICAgKiBAcGFyYW0gbGFuZ3VhZ2VJZCBUaGUgZG9jdW1lbnQncyBsYW5ndWFnZSBJZC5cbiAgICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgZG9jdW1lbnQncyB2ZXJzaW9uLlxuICAgICAqIEBwYXJhbSBjb250ZW50IFRoZSBkb2N1bWVudCdzIGNvbnRlbnQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHVyaSwgbGFuZ3VhZ2VJZCwgdmVyc2lvbiwgY29udGVudCkge1xuICAgICAgICByZXR1cm4gbmV3IEZ1bGxUZXh0RG9jdW1lbnQodXJpLCBsYW5ndWFnZUlkLCB2ZXJzaW9uLCBjb250ZW50KTtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50LmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIElUZXh0RG9jdW1lbnR9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLmxhbmd1YWdlSWQpIHx8IElzLnN0cmluZyhjYW5kaWRhdGUubGFuZ3VhZ2VJZCkpICYmIElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS5saW5lQ291bnQpXG4gICAgICAgICAgICAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5nZXRUZXh0KSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5wb3NpdGlvbkF0KSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5vZmZzZXRBdCkgPyB0cnVlIDogZmFsc2U7XG4gICAgfVxuICAgIFRleHREb2N1bWVudC5pcyA9IGlzO1xuICAgIGZ1bmN0aW9uIGFwcGx5RWRpdHMoZG9jdW1lbnQsIGVkaXRzKSB7XG4gICAgICAgIGxldCB0ZXh0ID0gZG9jdW1lbnQuZ2V0VGV4dCgpO1xuICAgICAgICBsZXQgc29ydGVkRWRpdHMgPSBtZXJnZVNvcnQoZWRpdHMsIChhLCBiKSA9PiB7XG4gICAgICAgICAgICBsZXQgZGlmZiA9IGEucmFuZ2Uuc3RhcnQubGluZSAtIGIucmFuZ2Uuc3RhcnQubGluZTtcbiAgICAgICAgICAgIGlmIChkaWZmID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEucmFuZ2Uuc3RhcnQuY2hhcmFjdGVyIC0gYi5yYW5nZS5zdGFydC5jaGFyYWN0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZGlmZjtcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBsYXN0TW9kaWZpZWRPZmZzZXQgPSB0ZXh0Lmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaSA9IHNvcnRlZEVkaXRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBsZXQgZSA9IHNvcnRlZEVkaXRzW2ldO1xuICAgICAgICAgICAgbGV0IHN0YXJ0T2Zmc2V0ID0gZG9jdW1lbnQub2Zmc2V0QXQoZS5yYW5nZS5zdGFydCk7XG4gICAgICAgICAgICBsZXQgZW5kT2Zmc2V0ID0gZG9jdW1lbnQub2Zmc2V0QXQoZS5yYW5nZS5lbmQpO1xuICAgICAgICAgICAgaWYgKGVuZE9mZnNldCA8PSBsYXN0TW9kaWZpZWRPZmZzZXQpIHtcbiAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMCwgc3RhcnRPZmZzZXQpICsgZS5uZXdUZXh0ICsgdGV4dC5zdWJzdHJpbmcoZW5kT2Zmc2V0LCB0ZXh0Lmxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ092ZXJsYXBwaW5nIGVkaXQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxhc3RNb2RpZmllZE9mZnNldCA9IHN0YXJ0T2Zmc2V0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnQuYXBwbHlFZGl0cyA9IGFwcGx5RWRpdHM7XG4gICAgZnVuY3Rpb24gbWVyZ2VTb3J0KGRhdGEsIGNvbXBhcmUpIHtcbiAgICAgICAgaWYgKGRhdGEubGVuZ3RoIDw9IDEpIHtcbiAgICAgICAgICAgIC8vIHNvcnRlZFxuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcCA9IChkYXRhLmxlbmd0aCAvIDIpIHwgMDtcbiAgICAgICAgY29uc3QgbGVmdCA9IGRhdGEuc2xpY2UoMCwgcCk7XG4gICAgICAgIGNvbnN0IHJpZ2h0ID0gZGF0YS5zbGljZShwKTtcbiAgICAgICAgbWVyZ2VTb3J0KGxlZnQsIGNvbXBhcmUpO1xuICAgICAgICBtZXJnZVNvcnQocmlnaHQsIGNvbXBhcmUpO1xuICAgICAgICBsZXQgbGVmdElkeCA9IDA7XG4gICAgICAgIGxldCByaWdodElkeCA9IDA7XG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgd2hpbGUgKGxlZnRJZHggPCBsZWZ0Lmxlbmd0aCAmJiByaWdodElkeCA8IHJpZ2h0Lmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IHJldCA9IGNvbXBhcmUobGVmdFtsZWZ0SWR4XSwgcmlnaHRbcmlnaHRJZHhdKTtcbiAgICAgICAgICAgIGlmIChyZXQgPD0gMCkge1xuICAgICAgICAgICAgICAgIC8vIHNtYWxsZXJfZXF1YWwgLT4gdGFrZSBsZWZ0IHRvIHByZXNlcnZlIG9yZGVyXG4gICAgICAgICAgICAgICAgZGF0YVtpKytdID0gbGVmdFtsZWZ0SWR4KytdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gZ3JlYXRlciAtPiB0YWtlIHJpZ2h0XG4gICAgICAgICAgICAgICAgZGF0YVtpKytdID0gcmlnaHRbcmlnaHRJZHgrK107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKGxlZnRJZHggPCBsZWZ0Lmxlbmd0aCkge1xuICAgICAgICAgICAgZGF0YVtpKytdID0gbGVmdFtsZWZ0SWR4KytdO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChyaWdodElkeCA8IHJpZ2h0Lmxlbmd0aCkge1xuICAgICAgICAgICAgZGF0YVtpKytdID0gcmlnaHRbcmlnaHRJZHgrK107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxufSkoVGV4dERvY3VtZW50IHx8IChUZXh0RG9jdW1lbnQgPSB7fSkpO1xuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgdGhlIHRleHQgZG9jdW1lbnQgZnJvbSB0aGUgbmV3IHZzY29kZS1sYW5ndWFnZXNlcnZlci10ZXh0ZG9jdW1lbnQgcGFja2FnZS5cbiAqL1xuY2xhc3MgRnVsbFRleHREb2N1bWVudCB7XG4gICAgY29uc3RydWN0b3IodXJpLCBsYW5ndWFnZUlkLCB2ZXJzaW9uLCBjb250ZW50KSB7XG4gICAgICAgIHRoaXMuX3VyaSA9IHVyaTtcbiAgICAgICAgdGhpcy5fbGFuZ3VhZ2VJZCA9IGxhbmd1YWdlSWQ7XG4gICAgICAgIHRoaXMuX3ZlcnNpb24gPSB2ZXJzaW9uO1xuICAgICAgICB0aGlzLl9jb250ZW50ID0gY29udGVudDtcbiAgICAgICAgdGhpcy5fbGluZU9mZnNldHMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGdldCB1cmkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl91cmk7XG4gICAgfVxuICAgIGdldCBsYW5ndWFnZUlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGFuZ3VhZ2VJZDtcbiAgICB9XG4gICAgZ2V0IHZlcnNpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92ZXJzaW9uO1xuICAgIH1cbiAgICBnZXRUZXh0KHJhbmdlKSB7XG4gICAgICAgIGlmIChyYW5nZSkge1xuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5vZmZzZXRBdChyYW5nZS5zdGFydCk7XG4gICAgICAgICAgICBsZXQgZW5kID0gdGhpcy5vZmZzZXRBdChyYW5nZS5lbmQpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRlbnQuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9jb250ZW50O1xuICAgIH1cbiAgICB1cGRhdGUoZXZlbnQsIHZlcnNpb24pIHtcbiAgICAgICAgdGhpcy5fY29udGVudCA9IGV2ZW50LnRleHQ7XG4gICAgICAgIHRoaXMuX3ZlcnNpb24gPSB2ZXJzaW9uO1xuICAgICAgICB0aGlzLl9saW5lT2Zmc2V0cyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZ2V0TGluZU9mZnNldHMoKSB7XG4gICAgICAgIGlmICh0aGlzLl9saW5lT2Zmc2V0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsZXQgbGluZU9mZnNldHMgPSBbXTtcbiAgICAgICAgICAgIGxldCB0ZXh0ID0gdGhpcy5fY29udGVudDtcbiAgICAgICAgICAgIGxldCBpc0xpbmVTdGFydCA9IHRydWU7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNMaW5lU3RhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGluZU9mZnNldHMucHVzaChpKTtcbiAgICAgICAgICAgICAgICAgICAgaXNMaW5lU3RhcnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGNoID0gdGV4dC5jaGFyQXQoaSk7XG4gICAgICAgICAgICAgICAgaXNMaW5lU3RhcnQgPSAoY2ggPT09ICdcXHInIHx8IGNoID09PSAnXFxuJyk7XG4gICAgICAgICAgICAgICAgaWYgKGNoID09PSAnXFxyJyAmJiBpICsgMSA8IHRleHQubGVuZ3RoICYmIHRleHQuY2hhckF0KGkgKyAxKSA9PT0gJ1xcbicpIHtcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc0xpbmVTdGFydCAmJiB0ZXh0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsaW5lT2Zmc2V0cy5wdXNoKHRleHQubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2xpbmVPZmZzZXRzID0gbGluZU9mZnNldHM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2xpbmVPZmZzZXRzO1xuICAgIH1cbiAgICBwb3NpdGlvbkF0KG9mZnNldCkge1xuICAgICAgICBvZmZzZXQgPSBNYXRoLm1heChNYXRoLm1pbihvZmZzZXQsIHRoaXMuX2NvbnRlbnQubGVuZ3RoKSwgMCk7XG4gICAgICAgIGxldCBsaW5lT2Zmc2V0cyA9IHRoaXMuZ2V0TGluZU9mZnNldHMoKTtcbiAgICAgICAgbGV0IGxvdyA9IDAsIGhpZ2ggPSBsaW5lT2Zmc2V0cy5sZW5ndGg7XG4gICAgICAgIGlmIChoaWdoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUG9zaXRpb24uY3JlYXRlKDAsIG9mZnNldCk7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKGxvdyA8IGhpZ2gpIHtcbiAgICAgICAgICAgIGxldCBtaWQgPSBNYXRoLmZsb29yKChsb3cgKyBoaWdoKSAvIDIpO1xuICAgICAgICAgICAgaWYgKGxpbmVPZmZzZXRzW21pZF0gPiBvZmZzZXQpIHtcbiAgICAgICAgICAgICAgICBoaWdoID0gbWlkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbG93ID0gbWlkICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBsb3cgaXMgdGhlIGxlYXN0IHggZm9yIHdoaWNoIHRoZSBsaW5lIG9mZnNldCBpcyBsYXJnZXIgdGhhbiB0aGUgY3VycmVudCBvZmZzZXRcbiAgICAgICAgLy8gb3IgYXJyYXkubGVuZ3RoIGlmIG5vIGxpbmUgb2Zmc2V0IGlzIGxhcmdlciB0aGFuIHRoZSBjdXJyZW50IG9mZnNldFxuICAgICAgICBsZXQgbGluZSA9IGxvdyAtIDE7XG4gICAgICAgIHJldHVybiBQb3NpdGlvbi5jcmVhdGUobGluZSwgb2Zmc2V0IC0gbGluZU9mZnNldHNbbGluZV0pO1xuICAgIH1cbiAgICBvZmZzZXRBdChwb3NpdGlvbikge1xuICAgICAgICBsZXQgbGluZU9mZnNldHMgPSB0aGlzLmdldExpbmVPZmZzZXRzKCk7XG4gICAgICAgIGlmIChwb3NpdGlvbi5saW5lID49IGxpbmVPZmZzZXRzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRlbnQubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBvc2l0aW9uLmxpbmUgPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbGluZU9mZnNldCA9IGxpbmVPZmZzZXRzW3Bvc2l0aW9uLmxpbmVdO1xuICAgICAgICBsZXQgbmV4dExpbmVPZmZzZXQgPSAocG9zaXRpb24ubGluZSArIDEgPCBsaW5lT2Zmc2V0cy5sZW5ndGgpID8gbGluZU9mZnNldHNbcG9zaXRpb24ubGluZSArIDFdIDogdGhpcy5fY29udGVudC5sZW5ndGg7XG4gICAgICAgIHJldHVybiBNYXRoLm1heChNYXRoLm1pbihsaW5lT2Zmc2V0ICsgcG9zaXRpb24uY2hhcmFjdGVyLCBuZXh0TGluZU9mZnNldCksIGxpbmVPZmZzZXQpO1xuICAgIH1cbiAgICBnZXQgbGluZUNvdW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRMaW5lT2Zmc2V0cygpLmxlbmd0aDtcbiAgICB9XG59XG52YXIgSXM7XG4oZnVuY3Rpb24gKElzKSB7XG4gICAgY29uc3QgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuICAgIGZ1bmN0aW9uIGRlZmluZWQodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCc7XG4gICAgfVxuICAgIElzLmRlZmluZWQgPSBkZWZpbmVkO1xuICAgIGZ1bmN0aW9uIHVuZGVmaW5lZCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJztcbiAgICB9XG4gICAgSXMudW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGZ1bmN0aW9uIGJvb2xlYW4odmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZTtcbiAgICB9XG4gICAgSXMuYm9vbGVhbiA9IGJvb2xlYW47XG4gICAgZnVuY3Rpb24gc3RyaW5nKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgU3RyaW5nXSc7XG4gICAgfVxuICAgIElzLnN0cmluZyA9IHN0cmluZztcbiAgICBmdW5jdGlvbiBudW1iZXIodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBOdW1iZXJdJztcbiAgICB9XG4gICAgSXMubnVtYmVyID0gbnVtYmVyO1xuICAgIGZ1bmN0aW9uIG51bWJlclJhbmdlKHZhbHVlLCBtaW4sIG1heCkge1xuICAgICAgICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IE51bWJlcl0nICYmIG1pbiA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSBtYXg7XG4gICAgfVxuICAgIElzLm51bWJlclJhbmdlID0gbnVtYmVyUmFuZ2U7XG4gICAgZnVuY3Rpb24gaW50ZWdlcih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IE51bWJlcl0nICYmIC0yMTQ3NDgzNjQ4IDw9IHZhbHVlICYmIHZhbHVlIDw9IDIxNDc0ODM2NDc7XG4gICAgfVxuICAgIElzLmludGVnZXIgPSBpbnRlZ2VyO1xuICAgIGZ1bmN0aW9uIHVpbnRlZ2VyKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgTnVtYmVyXScgJiYgMCA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSAyMTQ3NDgzNjQ3O1xuICAgIH1cbiAgICBJcy51aW50ZWdlciA9IHVpbnRlZ2VyO1xuICAgIGZ1bmN0aW9uIGZ1bmModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xuICAgIH1cbiAgICBJcy5mdW5jID0gZnVuYztcbiAgICBmdW5jdGlvbiBvYmplY3RMaXRlcmFsKHZhbHVlKSB7XG4gICAgICAgIC8vIFN0cmljdGx5IHNwZWFraW5nIGNsYXNzIGluc3RhbmNlcyBwYXNzIHRoaXMgY2hlY2sgYXMgd2VsbC4gU2luY2UgdGhlIExTUFxuICAgICAgICAvLyBkb2Vzbid0IHVzZSBjbGFzc2VzIHdlIGlnbm9yZSB0aGlzIGZvciBub3cuIElmIHdlIGRvIHdlIG5lZWQgdG8gYWRkIHNvbWV0aGluZ1xuICAgICAgICAvLyBsaWtlIHRoaXM6IGBPYmplY3QuZ2V0UHJvdG90eXBlT2YoT2JqZWN0LmdldFByb3RvdHlwZU9mKHgpKSA9PT0gbnVsbGBcbiAgICAgICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCc7XG4gICAgfVxuICAgIElzLm9iamVjdExpdGVyYWwgPSBvYmplY3RMaXRlcmFsO1xuICAgIGZ1bmN0aW9uIHR5cGVkQXJyYXkodmFsdWUsIGNoZWNrKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5ldmVyeShjaGVjayk7XG4gICAgfVxuICAgIElzLnR5cGVkQXJyYXkgPSB0eXBlZEFycmF5O1xufSkoSXMgfHwgKElzID0ge30pKTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUtBLGFBQU8sZUFBZSxTQUFTLGNBQWMsRUFBRSxPQUFPLEtBQUssQ0FBQztBQUM1RCxjQUFRLGNBQWMsUUFBUSxRQUFRLFFBQVEsT0FBTyxRQUFRLFFBQVEsUUFBUSxTQUFTLFFBQVEsU0FBUyxRQUFRLFVBQVU7QUFDekgsZUFBUyxRQUFRLE9BQU87QUFDcEIsZUFBTyxVQUFVLFFBQVEsVUFBVTtBQUFBLE1BQ3ZDO0FBQ0EsY0FBUSxVQUFVO0FBQ2xCLGVBQVMsT0FBTyxPQUFPO0FBQ25CLGVBQU8sT0FBTyxVQUFVLFlBQVksaUJBQWlCO0FBQUEsTUFDekQ7QUFDQSxjQUFRLFNBQVM7QUFDakIsZUFBUyxPQUFPLE9BQU87QUFDbkIsZUFBTyxPQUFPLFVBQVUsWUFBWSxpQkFBaUI7QUFBQSxNQUN6RDtBQUNBLGNBQVEsU0FBUztBQUNqQixlQUFTLE1BQU0sT0FBTztBQUNsQixlQUFPLGlCQUFpQjtBQUFBLE1BQzVCO0FBQ0EsY0FBUSxRQUFRO0FBQ2hCLGVBQVMsS0FBSyxPQUFPO0FBQ2pCLGVBQU8sT0FBTyxVQUFVO0FBQUEsTUFDNUI7QUFDQSxjQUFRLE9BQU87QUFDZixlQUFTLE1BQU0sT0FBTztBQUNsQixlQUFPLE1BQU0sUUFBUSxLQUFLO0FBQUEsTUFDOUI7QUFDQSxjQUFRLFFBQVE7QUFDaEIsZUFBUyxZQUFZLE9BQU87QUFDeEIsZUFBTyxNQUFNLEtBQUssS0FBSyxNQUFNLE1BQU0sVUFBUSxPQUFPLElBQUksQ0FBQztBQUFBLE1BQzNEO0FBQ0EsY0FBUSxjQUFjO0FBQUE7QUFBQTs7O0FDbEN0QjtBQUFBO0FBQUE7QUFLQSxhQUFPLGVBQWUsU0FBUyxjQUFjLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDNUQsY0FBUSxVQUFVLFFBQVEsb0JBQW9CLFFBQVEsb0JBQW9CLFFBQVEsb0JBQW9CLFFBQVEsb0JBQW9CLFFBQVEsb0JBQW9CLFFBQVEsb0JBQW9CLFFBQVEsb0JBQW9CLFFBQVEsb0JBQW9CLFFBQVEsb0JBQW9CLFFBQVEsb0JBQW9CLFFBQVEsbUJBQW1CLFFBQVEsZUFBZSxRQUFRLGVBQWUsUUFBUSxlQUFlLFFBQVEsZUFBZSxRQUFRLGVBQWUsUUFBUSxlQUFlLFFBQVEsZUFBZSxRQUFRLGVBQWUsUUFBUSxlQUFlLFFBQVEsY0FBYyxRQUFRLGVBQWUsUUFBUSwyQkFBMkIsUUFBUSxzQkFBc0IsUUFBUSxnQkFBZ0IsUUFBUSxhQUFhO0FBQy9xQixVQUFNLEtBQUs7QUFJWCxVQUFJO0FBQ0osT0FBQyxTQUFVQSxhQUFZO0FBRW5CLFFBQUFBLFlBQVcsYUFBYTtBQUN4QixRQUFBQSxZQUFXLGlCQUFpQjtBQUM1QixRQUFBQSxZQUFXLGlCQUFpQjtBQUM1QixRQUFBQSxZQUFXLGdCQUFnQjtBQUMzQixRQUFBQSxZQUFXLGdCQUFnQjtBQVUzQixRQUFBQSxZQUFXLGlDQUFpQztBQUU1QyxRQUFBQSxZQUFXLG1CQUFtQjtBQUk5QixRQUFBQSxZQUFXLG9CQUFvQjtBQUkvQixRQUFBQSxZQUFXLG1CQUFtQjtBQUs5QixRQUFBQSxZQUFXLDBCQUEwQjtBQUlyQyxRQUFBQSxZQUFXLHFCQUFxQjtBQUtoQyxRQUFBQSxZQUFXLHVCQUF1QjtBQUNsQyxRQUFBQSxZQUFXLG1CQUFtQjtBQU85QixRQUFBQSxZQUFXLCtCQUErQjtBQUUxQyxRQUFBQSxZQUFXLGlCQUFpQjtBQUFBLE1BQ2hDLEdBQUcsZUFBZSxRQUFRLGFBQWEsYUFBYSxDQUFDLEVBQUU7QUFLdkQsVUFBTSxnQkFBTixNQUFNLHVCQUFzQixNQUFNO0FBQUEsUUFDOUIsWUFBWSxNQUFNLFNBQVMsTUFBTTtBQUM3QixnQkFBTSxPQUFPO0FBQ2IsZUFBSyxPQUFPLEdBQUcsT0FBTyxJQUFJLElBQUksT0FBTyxXQUFXO0FBQ2hELGVBQUssT0FBTztBQUNaLGlCQUFPLGVBQWUsTUFBTSxlQUFjLFNBQVM7QUFBQSxRQUN2RDtBQUFBLFFBQ0EsU0FBUztBQUNMLGdCQUFNLFNBQVM7QUFBQSxZQUNYLE1BQU0sS0FBSztBQUFBLFlBQ1gsU0FBUyxLQUFLO0FBQUEsVUFDbEI7QUFDQSxjQUFJLEtBQUssU0FBUyxRQUFXO0FBQ3pCLG1CQUFPLE9BQU8sS0FBSztBQUFBLFVBQ3ZCO0FBQ0EsaUJBQU87QUFBQSxRQUNYO0FBQUEsTUFDSjtBQUNBLGNBQVEsZ0JBQWdCO0FBQ3hCLFVBQU0sc0JBQU4sTUFBTSxxQkFBb0I7QUFBQSxRQUN0QixZQUFZLE1BQU07QUFDZCxlQUFLLE9BQU87QUFBQSxRQUNoQjtBQUFBLFFBQ0EsT0FBTyxHQUFHLE9BQU87QUFDYixpQkFBTyxVQUFVLHFCQUFvQixRQUFRLFVBQVUscUJBQW9CLFVBQVUsVUFBVSxxQkFBb0I7QUFBQSxRQUN2SDtBQUFBLFFBQ0EsV0FBVztBQUNQLGlCQUFPLEtBQUs7QUFBQSxRQUNoQjtBQUFBLE1BQ0o7QUFDQSxjQUFRLHNCQUFzQjtBQUs5QiwwQkFBb0IsT0FBTyxJQUFJLG9CQUFvQixNQUFNO0FBS3pELDBCQUFvQixhQUFhLElBQUksb0JBQW9CLFlBQVk7QUFNckUsMEJBQW9CLFNBQVMsSUFBSSxvQkFBb0IsUUFBUTtBQUk3RCxVQUFNLDJCQUFOLE1BQStCO0FBQUEsUUFDM0IsWUFBWSxRQUFRLGdCQUFnQjtBQUNoQyxlQUFLLFNBQVM7QUFDZCxlQUFLLGlCQUFpQjtBQUFBLFFBQzFCO0FBQUEsUUFDQSxJQUFJLHNCQUFzQjtBQUN0QixpQkFBTyxvQkFBb0I7QUFBQSxRQUMvQjtBQUFBLE1BQ0o7QUFDQSxjQUFRLDJCQUEyQjtBQUluQyxVQUFNLGVBQU4sY0FBMkIseUJBQXlCO0FBQUEsUUFDaEQsWUFBWSxRQUFRO0FBQ2hCLGdCQUFNLFFBQVEsQ0FBQztBQUFBLFFBQ25CO0FBQUEsTUFDSjtBQUNBLGNBQVEsZUFBZTtBQUN2QixVQUFNLGNBQU4sY0FBMEIseUJBQXlCO0FBQUEsUUFDL0MsWUFBWSxRQUFRLHVCQUF1QixvQkFBb0IsTUFBTTtBQUNqRSxnQkFBTSxRQUFRLENBQUM7QUFDZixlQUFLLHVCQUF1QjtBQUFBLFFBQ2hDO0FBQUEsUUFDQSxJQUFJLHNCQUFzQjtBQUN0QixpQkFBTyxLQUFLO0FBQUEsUUFDaEI7QUFBQSxNQUNKO0FBQ0EsY0FBUSxjQUFjO0FBQ3RCLFVBQU0sZUFBTixjQUEyQix5QkFBeUI7QUFBQSxRQUNoRCxZQUFZLFFBQVEsdUJBQXVCLG9CQUFvQixNQUFNO0FBQ2pFLGdCQUFNLFFBQVEsQ0FBQztBQUNmLGVBQUssdUJBQXVCO0FBQUEsUUFDaEM7QUFBQSxRQUNBLElBQUksc0JBQXNCO0FBQ3RCLGlCQUFPLEtBQUs7QUFBQSxRQUNoQjtBQUFBLE1BQ0o7QUFDQSxjQUFRLGVBQWU7QUFDdkIsVUFBTSxlQUFOLGNBQTJCLHlCQUF5QjtBQUFBLFFBQ2hELFlBQVksUUFBUTtBQUNoQixnQkFBTSxRQUFRLENBQUM7QUFBQSxRQUNuQjtBQUFBLE1BQ0o7QUFDQSxjQUFRLGVBQWU7QUFDdkIsVUFBTSxlQUFOLGNBQTJCLHlCQUF5QjtBQUFBLFFBQ2hELFlBQVksUUFBUTtBQUNoQixnQkFBTSxRQUFRLENBQUM7QUFBQSxRQUNuQjtBQUFBLE1BQ0o7QUFDQSxjQUFRLGVBQWU7QUFDdkIsVUFBTSxlQUFOLGNBQTJCLHlCQUF5QjtBQUFBLFFBQ2hELFlBQVksUUFBUTtBQUNoQixnQkFBTSxRQUFRLENBQUM7QUFBQSxRQUNuQjtBQUFBLE1BQ0o7QUFDQSxjQUFRLGVBQWU7QUFDdkIsVUFBTSxlQUFOLGNBQTJCLHlCQUF5QjtBQUFBLFFBQ2hELFlBQVksUUFBUTtBQUNoQixnQkFBTSxRQUFRLENBQUM7QUFBQSxRQUNuQjtBQUFBLE1BQ0o7QUFDQSxjQUFRLGVBQWU7QUFDdkIsVUFBTSxlQUFOLGNBQTJCLHlCQUF5QjtBQUFBLFFBQ2hELFlBQVksUUFBUTtBQUNoQixnQkFBTSxRQUFRLENBQUM7QUFBQSxRQUNuQjtBQUFBLE1BQ0o7QUFDQSxjQUFRLGVBQWU7QUFDdkIsVUFBTSxlQUFOLGNBQTJCLHlCQUF5QjtBQUFBLFFBQ2hELFlBQVksUUFBUTtBQUNoQixnQkFBTSxRQUFRLENBQUM7QUFBQSxRQUNuQjtBQUFBLE1BQ0o7QUFDQSxjQUFRLGVBQWU7QUFDdkIsVUFBTSxlQUFOLGNBQTJCLHlCQUF5QjtBQUFBLFFBQ2hELFlBQVksUUFBUTtBQUNoQixnQkFBTSxRQUFRLENBQUM7QUFBQSxRQUNuQjtBQUFBLE1BQ0o7QUFDQSxjQUFRLGVBQWU7QUFDdkIsVUFBTSxlQUFOLGNBQTJCLHlCQUF5QjtBQUFBLFFBQ2hELFlBQVksUUFBUTtBQUNoQixnQkFBTSxRQUFRLENBQUM7QUFBQSxRQUNuQjtBQUFBLE1BQ0o7QUFDQSxjQUFRLGVBQWU7QUFDdkIsVUFBTSxtQkFBTixjQUErQix5QkFBeUI7QUFBQSxRQUNwRCxZQUFZLFFBQVEsdUJBQXVCLG9CQUFvQixNQUFNO0FBQ2pFLGdCQUFNLFFBQVEsQ0FBQztBQUNmLGVBQUssdUJBQXVCO0FBQUEsUUFDaEM7QUFBQSxRQUNBLElBQUksc0JBQXNCO0FBQ3RCLGlCQUFPLEtBQUs7QUFBQSxRQUNoQjtBQUFBLE1BQ0o7QUFDQSxjQUFRLG1CQUFtQjtBQUMzQixVQUFNLG9CQUFOLGNBQWdDLHlCQUF5QjtBQUFBLFFBQ3JELFlBQVksUUFBUTtBQUNoQixnQkFBTSxRQUFRLENBQUM7QUFBQSxRQUNuQjtBQUFBLE1BQ0o7QUFDQSxjQUFRLG9CQUFvQjtBQUM1QixVQUFNLG9CQUFOLGNBQWdDLHlCQUF5QjtBQUFBLFFBQ3JELFlBQVksUUFBUSx1QkFBdUIsb0JBQW9CLE1BQU07QUFDakUsZ0JBQU0sUUFBUSxDQUFDO0FBQ2YsZUFBSyx1QkFBdUI7QUFBQSxRQUNoQztBQUFBLFFBQ0EsSUFBSSxzQkFBc0I7QUFDdEIsaUJBQU8sS0FBSztBQUFBLFFBQ2hCO0FBQUEsTUFDSjtBQUNBLGNBQVEsb0JBQW9CO0FBQzVCLFVBQU0sb0JBQU4sY0FBZ0MseUJBQXlCO0FBQUEsUUFDckQsWUFBWSxRQUFRO0FBQ2hCLGdCQUFNLFFBQVEsQ0FBQztBQUFBLFFBQ25CO0FBQUEsTUFDSjtBQUNBLGNBQVEsb0JBQW9CO0FBQzVCLFVBQU0sb0JBQU4sY0FBZ0MseUJBQXlCO0FBQUEsUUFDckQsWUFBWSxRQUFRO0FBQ2hCLGdCQUFNLFFBQVEsQ0FBQztBQUFBLFFBQ25CO0FBQUEsTUFDSjtBQUNBLGNBQVEsb0JBQW9CO0FBQzVCLFVBQU0sb0JBQU4sY0FBZ0MseUJBQXlCO0FBQUEsUUFDckQsWUFBWSxRQUFRO0FBQ2hCLGdCQUFNLFFBQVEsQ0FBQztBQUFBLFFBQ25CO0FBQUEsTUFDSjtBQUNBLGNBQVEsb0JBQW9CO0FBQzVCLFVBQU0sb0JBQU4sY0FBZ0MseUJBQXlCO0FBQUEsUUFDckQsWUFBWSxRQUFRO0FBQ2hCLGdCQUFNLFFBQVEsQ0FBQztBQUFBLFFBQ25CO0FBQUEsTUFDSjtBQUNBLGNBQVEsb0JBQW9CO0FBQzVCLFVBQU0sb0JBQU4sY0FBZ0MseUJBQXlCO0FBQUEsUUFDckQsWUFBWSxRQUFRO0FBQ2hCLGdCQUFNLFFBQVEsQ0FBQztBQUFBLFFBQ25CO0FBQUEsTUFDSjtBQUNBLGNBQVEsb0JBQW9CO0FBQzVCLFVBQU0sb0JBQU4sY0FBZ0MseUJBQXlCO0FBQUEsUUFDckQsWUFBWSxRQUFRO0FBQ2hCLGdCQUFNLFFBQVEsQ0FBQztBQUFBLFFBQ25CO0FBQUEsTUFDSjtBQUNBLGNBQVEsb0JBQW9CO0FBQzVCLFVBQU0sb0JBQU4sY0FBZ0MseUJBQXlCO0FBQUEsUUFDckQsWUFBWSxRQUFRO0FBQ2hCLGdCQUFNLFFBQVEsQ0FBQztBQUFBLFFBQ25CO0FBQUEsTUFDSjtBQUNBLGNBQVEsb0JBQW9CO0FBQzVCLFVBQU0sb0JBQU4sY0FBZ0MseUJBQXlCO0FBQUEsUUFDckQsWUFBWSxRQUFRO0FBQ2hCLGdCQUFNLFFBQVEsQ0FBQztBQUFBLFFBQ25CO0FBQUEsTUFDSjtBQUNBLGNBQVEsb0JBQW9CO0FBQzVCLFVBQUlDO0FBQ0osT0FBQyxTQUFVQSxVQUFTO0FBSWhCLGlCQUFTLFVBQVUsU0FBUztBQUN4QixnQkFBTSxZQUFZO0FBQ2xCLGlCQUFPLGFBQWEsR0FBRyxPQUFPLFVBQVUsTUFBTSxNQUFNLEdBQUcsT0FBTyxVQUFVLEVBQUUsS0FBSyxHQUFHLE9BQU8sVUFBVSxFQUFFO0FBQUEsUUFDekc7QUFDQSxRQUFBQSxTQUFRLFlBQVk7QUFJcEIsaUJBQVMsZUFBZSxTQUFTO0FBQzdCLGdCQUFNLFlBQVk7QUFDbEIsaUJBQU8sYUFBYSxHQUFHLE9BQU8sVUFBVSxNQUFNLEtBQUssUUFBUSxPQUFPO0FBQUEsUUFDdEU7QUFDQSxRQUFBQSxTQUFRLGlCQUFpQjtBQUl6QixpQkFBUyxXQUFXLFNBQVM7QUFDekIsZ0JBQU0sWUFBWTtBQUNsQixpQkFBTyxjQUFjLFVBQVUsV0FBVyxVQUFVLENBQUMsQ0FBQyxVQUFVLFdBQVcsR0FBRyxPQUFPLFVBQVUsRUFBRSxLQUFLLEdBQUcsT0FBTyxVQUFVLEVBQUUsS0FBSyxVQUFVLE9BQU87QUFBQSxRQUN0SjtBQUNBLFFBQUFBLFNBQVEsYUFBYTtBQUFBLE1BQ3pCLEdBQUdBLGFBQVksUUFBUSxVQUFVQSxXQUFVLENBQUMsRUFBRTtBQUFBO0FBQUE7OztBQ2pUOUM7QUFBQTtBQUFBO0FBS0EsVUFBSTtBQUNKLGFBQU8sZUFBZSxTQUFTLGNBQWMsRUFBRSxPQUFPLEtBQUssQ0FBQztBQUM1RCxjQUFRLFdBQVcsUUFBUSxZQUFZLFFBQVEsUUFBUTtBQUN2RCxVQUFJO0FBQ0osT0FBQyxTQUFVQyxRQUFPO0FBQ2QsUUFBQUEsT0FBTSxPQUFPO0FBQ2IsUUFBQUEsT0FBTSxRQUFRO0FBQ2QsUUFBQUEsT0FBTSxRQUFRQSxPQUFNO0FBQ3BCLFFBQUFBLE9BQU0sT0FBTztBQUNiLFFBQUFBLE9BQU0sUUFBUUEsT0FBTTtBQUFBLE1BQ3hCLEdBQUcsVUFBVSxRQUFRLFFBQVEsUUFBUSxDQUFDLEVBQUU7QUFDeEMsVUFBTSxZQUFOLE1BQWdCO0FBQUEsUUFDWixjQUFjO0FBQ1YsZUFBSyxFQUFFLElBQUk7QUFDWCxlQUFLLE9BQU8sb0JBQUksSUFBSTtBQUNwQixlQUFLLFFBQVE7QUFDYixlQUFLLFFBQVE7QUFDYixlQUFLLFFBQVE7QUFDYixlQUFLLFNBQVM7QUFBQSxRQUNsQjtBQUFBLFFBQ0EsUUFBUTtBQUNKLGVBQUssS0FBSyxNQUFNO0FBQ2hCLGVBQUssUUFBUTtBQUNiLGVBQUssUUFBUTtBQUNiLGVBQUssUUFBUTtBQUNiLGVBQUs7QUFBQSxRQUNUO0FBQUEsUUFDQSxVQUFVO0FBQ04saUJBQU8sQ0FBQyxLQUFLLFNBQVMsQ0FBQyxLQUFLO0FBQUEsUUFDaEM7QUFBQSxRQUNBLElBQUksT0FBTztBQUNQLGlCQUFPLEtBQUs7QUFBQSxRQUNoQjtBQUFBLFFBQ0EsSUFBSSxRQUFRO0FBQ1IsaUJBQU8sS0FBSyxPQUFPO0FBQUEsUUFDdkI7QUFBQSxRQUNBLElBQUksT0FBTztBQUNQLGlCQUFPLEtBQUssT0FBTztBQUFBLFFBQ3ZCO0FBQUEsUUFDQSxJQUFJLEtBQUs7QUFDTCxpQkFBTyxLQUFLLEtBQUssSUFBSSxHQUFHO0FBQUEsUUFDNUI7QUFBQSxRQUNBLElBQUksS0FBSyxRQUFRLE1BQU0sTUFBTTtBQUN6QixnQkFBTSxPQUFPLEtBQUssS0FBSyxJQUFJLEdBQUc7QUFDOUIsY0FBSSxDQUFDLE1BQU07QUFDUCxtQkFBTztBQUFBLFVBQ1g7QUFDQSxjQUFJLFVBQVUsTUFBTSxNQUFNO0FBQ3RCLGlCQUFLLE1BQU0sTUFBTSxLQUFLO0FBQUEsVUFDMUI7QUFDQSxpQkFBTyxLQUFLO0FBQUEsUUFDaEI7QUFBQSxRQUNBLElBQUksS0FBSyxPQUFPLFFBQVEsTUFBTSxNQUFNO0FBQ2hDLGNBQUksT0FBTyxLQUFLLEtBQUssSUFBSSxHQUFHO0FBQzVCLGNBQUksTUFBTTtBQUNOLGlCQUFLLFFBQVE7QUFDYixnQkFBSSxVQUFVLE1BQU0sTUFBTTtBQUN0QixtQkFBSyxNQUFNLE1BQU0sS0FBSztBQUFBLFlBQzFCO0FBQUEsVUFDSixPQUNLO0FBQ0QsbUJBQU8sRUFBRSxLQUFLLE9BQU8sTUFBTSxRQUFXLFVBQVUsT0FBVTtBQUMxRCxvQkFBUSxPQUFPO0FBQUEsY0FDWCxLQUFLLE1BQU07QUFDUCxxQkFBSyxZQUFZLElBQUk7QUFDckI7QUFBQSxjQUNKLEtBQUssTUFBTTtBQUNQLHFCQUFLLGFBQWEsSUFBSTtBQUN0QjtBQUFBLGNBQ0osS0FBSyxNQUFNO0FBQ1AscUJBQUssWUFBWSxJQUFJO0FBQ3JCO0FBQUEsY0FDSjtBQUNJLHFCQUFLLFlBQVksSUFBSTtBQUNyQjtBQUFBLFlBQ1I7QUFDQSxpQkFBSyxLQUFLLElBQUksS0FBSyxJQUFJO0FBQ3ZCLGlCQUFLO0FBQUEsVUFDVDtBQUNBLGlCQUFPO0FBQUEsUUFDWDtBQUFBLFFBQ0EsT0FBTyxLQUFLO0FBQ1IsaUJBQU8sQ0FBQyxDQUFDLEtBQUssT0FBTyxHQUFHO0FBQUEsUUFDNUI7QUFBQSxRQUNBLE9BQU8sS0FBSztBQUNSLGdCQUFNLE9BQU8sS0FBSyxLQUFLLElBQUksR0FBRztBQUM5QixjQUFJLENBQUMsTUFBTTtBQUNQLG1CQUFPO0FBQUEsVUFDWDtBQUNBLGVBQUssS0FBSyxPQUFPLEdBQUc7QUFDcEIsZUFBSyxXQUFXLElBQUk7QUFDcEIsZUFBSztBQUNMLGlCQUFPLEtBQUs7QUFBQSxRQUNoQjtBQUFBLFFBQ0EsUUFBUTtBQUNKLGNBQUksQ0FBQyxLQUFLLFNBQVMsQ0FBQyxLQUFLLE9BQU87QUFDNUIsbUJBQU87QUFBQSxVQUNYO0FBQ0EsY0FBSSxDQUFDLEtBQUssU0FBUyxDQUFDLEtBQUssT0FBTztBQUM1QixrQkFBTSxJQUFJLE1BQU0sY0FBYztBQUFBLFVBQ2xDO0FBQ0EsZ0JBQU0sT0FBTyxLQUFLO0FBQ2xCLGVBQUssS0FBSyxPQUFPLEtBQUssR0FBRztBQUN6QixlQUFLLFdBQVcsSUFBSTtBQUNwQixlQUFLO0FBQ0wsaUJBQU8sS0FBSztBQUFBLFFBQ2hCO0FBQUEsUUFDQSxRQUFRLFlBQVksU0FBUztBQUN6QixnQkFBTSxRQUFRLEtBQUs7QUFDbkIsY0FBSSxVQUFVLEtBQUs7QUFDbkIsaUJBQU8sU0FBUztBQUNaLGdCQUFJLFNBQVM7QUFDVCx5QkFBVyxLQUFLLE9BQU8sRUFBRSxRQUFRLE9BQU8sUUFBUSxLQUFLLElBQUk7QUFBQSxZQUM3RCxPQUNLO0FBQ0QseUJBQVcsUUFBUSxPQUFPLFFBQVEsS0FBSyxJQUFJO0FBQUEsWUFDL0M7QUFDQSxnQkFBSSxLQUFLLFdBQVcsT0FBTztBQUN2QixvQkFBTSxJQUFJLE1BQU0sMENBQTBDO0FBQUEsWUFDOUQ7QUFDQSxzQkFBVSxRQUFRO0FBQUEsVUFDdEI7QUFBQSxRQUNKO0FBQUEsUUFDQSxPQUFPO0FBQ0gsZ0JBQU0sUUFBUSxLQUFLO0FBQ25CLGNBQUksVUFBVSxLQUFLO0FBQ25CLGdCQUFNLFdBQVc7QUFBQSxZQUNiLENBQUMsT0FBTyxRQUFRLEdBQUcsTUFBTTtBQUNyQixxQkFBTztBQUFBLFlBQ1g7QUFBQSxZQUNBLE1BQU0sTUFBTTtBQUNSLGtCQUFJLEtBQUssV0FBVyxPQUFPO0FBQ3ZCLHNCQUFNLElBQUksTUFBTSwwQ0FBMEM7QUFBQSxjQUM5RDtBQUNBLGtCQUFJLFNBQVM7QUFDVCxzQkFBTSxTQUFTLEVBQUUsT0FBTyxRQUFRLEtBQUssTUFBTSxNQUFNO0FBQ2pELDBCQUFVLFFBQVE7QUFDbEIsdUJBQU87QUFBQSxjQUNYLE9BQ0s7QUFDRCx1QkFBTyxFQUFFLE9BQU8sUUFBVyxNQUFNLEtBQUs7QUFBQSxjQUMxQztBQUFBLFlBQ0o7QUFBQSxVQUNKO0FBQ0EsaUJBQU87QUFBQSxRQUNYO0FBQUEsUUFDQSxTQUFTO0FBQ0wsZ0JBQU0sUUFBUSxLQUFLO0FBQ25CLGNBQUksVUFBVSxLQUFLO0FBQ25CLGdCQUFNLFdBQVc7QUFBQSxZQUNiLENBQUMsT0FBTyxRQUFRLEdBQUcsTUFBTTtBQUNyQixxQkFBTztBQUFBLFlBQ1g7QUFBQSxZQUNBLE1BQU0sTUFBTTtBQUNSLGtCQUFJLEtBQUssV0FBVyxPQUFPO0FBQ3ZCLHNCQUFNLElBQUksTUFBTSwwQ0FBMEM7QUFBQSxjQUM5RDtBQUNBLGtCQUFJLFNBQVM7QUFDVCxzQkFBTSxTQUFTLEVBQUUsT0FBTyxRQUFRLE9BQU8sTUFBTSxNQUFNO0FBQ25ELDBCQUFVLFFBQVE7QUFDbEIsdUJBQU87QUFBQSxjQUNYLE9BQ0s7QUFDRCx1QkFBTyxFQUFFLE9BQU8sUUFBVyxNQUFNLEtBQUs7QUFBQSxjQUMxQztBQUFBLFlBQ0o7QUFBQSxVQUNKO0FBQ0EsaUJBQU87QUFBQSxRQUNYO0FBQUEsUUFDQSxVQUFVO0FBQ04sZ0JBQU0sUUFBUSxLQUFLO0FBQ25CLGNBQUksVUFBVSxLQUFLO0FBQ25CLGdCQUFNLFdBQVc7QUFBQSxZQUNiLENBQUMsT0FBTyxRQUFRLEdBQUcsTUFBTTtBQUNyQixxQkFBTztBQUFBLFlBQ1g7QUFBQSxZQUNBLE1BQU0sTUFBTTtBQUNSLGtCQUFJLEtBQUssV0FBVyxPQUFPO0FBQ3ZCLHNCQUFNLElBQUksTUFBTSwwQ0FBMEM7QUFBQSxjQUM5RDtBQUNBLGtCQUFJLFNBQVM7QUFDVCxzQkFBTSxTQUFTLEVBQUUsT0FBTyxDQUFDLFFBQVEsS0FBSyxRQUFRLEtBQUssR0FBRyxNQUFNLE1BQU07QUFDbEUsMEJBQVUsUUFBUTtBQUNsQix1QkFBTztBQUFBLGNBQ1gsT0FDSztBQUNELHVCQUFPLEVBQUUsT0FBTyxRQUFXLE1BQU0sS0FBSztBQUFBLGNBQzFDO0FBQUEsWUFDSjtBQUFBLFVBQ0o7QUFDQSxpQkFBTztBQUFBLFFBQ1g7QUFBQSxRQUNBLEVBQUUsS0FBSyxPQUFPLGFBQWEsT0FBTyxTQUFTLElBQUk7QUFDM0MsaUJBQU8sS0FBSyxRQUFRO0FBQUEsUUFDeEI7QUFBQSxRQUNBLFFBQVEsU0FBUztBQUNiLGNBQUksV0FBVyxLQUFLLE1BQU07QUFDdEI7QUFBQSxVQUNKO0FBQ0EsY0FBSSxZQUFZLEdBQUc7QUFDZixpQkFBSyxNQUFNO0FBQ1g7QUFBQSxVQUNKO0FBQ0EsY0FBSSxVQUFVLEtBQUs7QUFDbkIsY0FBSSxjQUFjLEtBQUs7QUFDdkIsaUJBQU8sV0FBVyxjQUFjLFNBQVM7QUFDckMsaUJBQUssS0FBSyxPQUFPLFFBQVEsR0FBRztBQUM1QixzQkFBVSxRQUFRO0FBQ2xCO0FBQUEsVUFDSjtBQUNBLGVBQUssUUFBUTtBQUNiLGVBQUssUUFBUTtBQUNiLGNBQUksU0FBUztBQUNULG9CQUFRLFdBQVc7QUFBQSxVQUN2QjtBQUNBLGVBQUs7QUFBQSxRQUNUO0FBQUEsUUFDQSxhQUFhLE1BQU07QUFFZixjQUFJLENBQUMsS0FBSyxTQUFTLENBQUMsS0FBSyxPQUFPO0FBQzVCLGlCQUFLLFFBQVE7QUFBQSxVQUNqQixXQUNTLENBQUMsS0FBSyxPQUFPO0FBQ2xCLGtCQUFNLElBQUksTUFBTSxjQUFjO0FBQUEsVUFDbEMsT0FDSztBQUNELGlCQUFLLE9BQU8sS0FBSztBQUNqQixpQkFBSyxNQUFNLFdBQVc7QUFBQSxVQUMxQjtBQUNBLGVBQUssUUFBUTtBQUNiLGVBQUs7QUFBQSxRQUNUO0FBQUEsUUFDQSxZQUFZLE1BQU07QUFFZCxjQUFJLENBQUMsS0FBSyxTQUFTLENBQUMsS0FBSyxPQUFPO0FBQzVCLGlCQUFLLFFBQVE7QUFBQSxVQUNqQixXQUNTLENBQUMsS0FBSyxPQUFPO0FBQ2xCLGtCQUFNLElBQUksTUFBTSxjQUFjO0FBQUEsVUFDbEMsT0FDSztBQUNELGlCQUFLLFdBQVcsS0FBSztBQUNyQixpQkFBSyxNQUFNLE9BQU87QUFBQSxVQUN0QjtBQUNBLGVBQUssUUFBUTtBQUNiLGVBQUs7QUFBQSxRQUNUO0FBQUEsUUFDQSxXQUFXLE1BQU07QUFDYixjQUFJLFNBQVMsS0FBSyxTQUFTLFNBQVMsS0FBSyxPQUFPO0FBQzVDLGlCQUFLLFFBQVE7QUFDYixpQkFBSyxRQUFRO0FBQUEsVUFDakIsV0FDUyxTQUFTLEtBQUssT0FBTztBQUcxQixnQkFBSSxDQUFDLEtBQUssTUFBTTtBQUNaLG9CQUFNLElBQUksTUFBTSxjQUFjO0FBQUEsWUFDbEM7QUFDQSxpQkFBSyxLQUFLLFdBQVc7QUFDckIsaUJBQUssUUFBUSxLQUFLO0FBQUEsVUFDdEIsV0FDUyxTQUFTLEtBQUssT0FBTztBQUcxQixnQkFBSSxDQUFDLEtBQUssVUFBVTtBQUNoQixvQkFBTSxJQUFJLE1BQU0sY0FBYztBQUFBLFlBQ2xDO0FBQ0EsaUJBQUssU0FBUyxPQUFPO0FBQ3JCLGlCQUFLLFFBQVEsS0FBSztBQUFBLFVBQ3RCLE9BQ0s7QUFDRCxrQkFBTSxPQUFPLEtBQUs7QUFDbEIsa0JBQU0sV0FBVyxLQUFLO0FBQ3RCLGdCQUFJLENBQUMsUUFBUSxDQUFDLFVBQVU7QUFDcEIsb0JBQU0sSUFBSSxNQUFNLGNBQWM7QUFBQSxZQUNsQztBQUNBLGlCQUFLLFdBQVc7QUFDaEIscUJBQVMsT0FBTztBQUFBLFVBQ3BCO0FBQ0EsZUFBSyxPQUFPO0FBQ1osZUFBSyxXQUFXO0FBQ2hCLGVBQUs7QUFBQSxRQUNUO0FBQUEsUUFDQSxNQUFNLE1BQU0sT0FBTztBQUNmLGNBQUksQ0FBQyxLQUFLLFNBQVMsQ0FBQyxLQUFLLE9BQU87QUFDNUIsa0JBQU0sSUFBSSxNQUFNLGNBQWM7QUFBQSxVQUNsQztBQUNBLGNBQUssVUFBVSxNQUFNLFNBQVMsVUFBVSxNQUFNLE1BQU87QUFDakQ7QUFBQSxVQUNKO0FBQ0EsY0FBSSxVQUFVLE1BQU0sT0FBTztBQUN2QixnQkFBSSxTQUFTLEtBQUssT0FBTztBQUNyQjtBQUFBLFlBQ0o7QUFDQSxrQkFBTSxPQUFPLEtBQUs7QUFDbEIsa0JBQU0sV0FBVyxLQUFLO0FBRXRCLGdCQUFJLFNBQVMsS0FBSyxPQUFPO0FBR3JCLHVCQUFTLE9BQU87QUFDaEIsbUJBQUssUUFBUTtBQUFBLFlBQ2pCLE9BQ0s7QUFFRCxtQkFBSyxXQUFXO0FBQ2hCLHVCQUFTLE9BQU87QUFBQSxZQUNwQjtBQUVBLGlCQUFLLFdBQVc7QUFDaEIsaUJBQUssT0FBTyxLQUFLO0FBQ2pCLGlCQUFLLE1BQU0sV0FBVztBQUN0QixpQkFBSyxRQUFRO0FBQ2IsaUJBQUs7QUFBQSxVQUNULFdBQ1MsVUFBVSxNQUFNLE1BQU07QUFDM0IsZ0JBQUksU0FBUyxLQUFLLE9BQU87QUFDckI7QUFBQSxZQUNKO0FBQ0Esa0JBQU0sT0FBTyxLQUFLO0FBQ2xCLGtCQUFNLFdBQVcsS0FBSztBQUV0QixnQkFBSSxTQUFTLEtBQUssT0FBTztBQUdyQixtQkFBSyxXQUFXO0FBQ2hCLG1CQUFLLFFBQVE7QUFBQSxZQUNqQixPQUNLO0FBRUQsbUJBQUssV0FBVztBQUNoQix1QkFBUyxPQUFPO0FBQUEsWUFDcEI7QUFDQSxpQkFBSyxPQUFPO0FBQ1osaUJBQUssV0FBVyxLQUFLO0FBQ3JCLGlCQUFLLE1BQU0sT0FBTztBQUNsQixpQkFBSyxRQUFRO0FBQ2IsaUJBQUs7QUFBQSxVQUNUO0FBQUEsUUFDSjtBQUFBLFFBQ0EsU0FBUztBQUNMLGdCQUFNLE9BQU8sQ0FBQztBQUNkLGVBQUssUUFBUSxDQUFDLE9BQU8sUUFBUTtBQUN6QixpQkFBSyxLQUFLLENBQUMsS0FBSyxLQUFLLENBQUM7QUFBQSxVQUMxQixDQUFDO0FBQ0QsaUJBQU87QUFBQSxRQUNYO0FBQUEsUUFDQSxTQUFTLE1BQU07QUFDWCxlQUFLLE1BQU07QUFDWCxxQkFBVyxDQUFDLEtBQUssS0FBSyxLQUFLLE1BQU07QUFDN0IsaUJBQUssSUFBSSxLQUFLLEtBQUs7QUFBQSxVQUN2QjtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQ0EsY0FBUSxZQUFZO0FBQ3BCLFVBQU0sV0FBTixjQUF1QixVQUFVO0FBQUEsUUFDN0IsWUFBWSxPQUFPLFFBQVEsR0FBRztBQUMxQixnQkFBTTtBQUNOLGVBQUssU0FBUztBQUNkLGVBQUssU0FBUyxLQUFLLElBQUksS0FBSyxJQUFJLEdBQUcsS0FBSyxHQUFHLENBQUM7QUFBQSxRQUNoRDtBQUFBLFFBQ0EsSUFBSSxRQUFRO0FBQ1IsaUJBQU8sS0FBSztBQUFBLFFBQ2hCO0FBQUEsUUFDQSxJQUFJLE1BQU0sT0FBTztBQUNiLGVBQUssU0FBUztBQUNkLGVBQUssVUFBVTtBQUFBLFFBQ25CO0FBQUEsUUFDQSxJQUFJLFFBQVE7QUFDUixpQkFBTyxLQUFLO0FBQUEsUUFDaEI7QUFBQSxRQUNBLElBQUksTUFBTSxPQUFPO0FBQ2IsZUFBSyxTQUFTLEtBQUssSUFBSSxLQUFLLElBQUksR0FBRyxLQUFLLEdBQUcsQ0FBQztBQUM1QyxlQUFLLFVBQVU7QUFBQSxRQUNuQjtBQUFBLFFBQ0EsSUFBSSxLQUFLLFFBQVEsTUFBTSxPQUFPO0FBQzFCLGlCQUFPLE1BQU0sSUFBSSxLQUFLLEtBQUs7QUFBQSxRQUMvQjtBQUFBLFFBQ0EsS0FBSyxLQUFLO0FBQ04saUJBQU8sTUFBTSxJQUFJLEtBQUssTUFBTSxJQUFJO0FBQUEsUUFDcEM7QUFBQSxRQUNBLElBQUksS0FBSyxPQUFPO0FBQ1osZ0JBQU0sSUFBSSxLQUFLLE9BQU8sTUFBTSxJQUFJO0FBQ2hDLGVBQUssVUFBVTtBQUNmLGlCQUFPO0FBQUEsUUFDWDtBQUFBLFFBQ0EsWUFBWTtBQUNSLGNBQUksS0FBSyxPQUFPLEtBQUssUUFBUTtBQUN6QixpQkFBSyxRQUFRLEtBQUssTUFBTSxLQUFLLFNBQVMsS0FBSyxNQUFNLENBQUM7QUFBQSxVQUN0RDtBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQ0EsY0FBUSxXQUFXO0FBQUE7QUFBQTs7O0FDN1luQjtBQUFBO0FBQUE7QUFLQSxhQUFPLGVBQWUsU0FBUyxjQUFjLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDNUQsY0FBUSxhQUFhO0FBQ3JCLFVBQUlDO0FBQ0osT0FBQyxTQUFVQSxhQUFZO0FBQ25CLGlCQUFTLE9BQU8sTUFBTTtBQUNsQixpQkFBTztBQUFBLFlBQ0gsU0FBUztBQUFBLFVBQ2I7QUFBQSxRQUNKO0FBQ0EsUUFBQUEsWUFBVyxTQUFTO0FBQUEsTUFDeEIsR0FBR0EsZ0JBQWUsUUFBUSxhQUFhQSxjQUFhLENBQUMsRUFBRTtBQUFBO0FBQUE7OztBQ2Z2RDtBQUFBO0FBQUE7QUFLQSxhQUFPLGVBQWUsU0FBUyxjQUFjLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDNUQsVUFBSTtBQUNKLGVBQVMsTUFBTTtBQUNYLFlBQUksU0FBUyxRQUFXO0FBQ3BCLGdCQUFNLElBQUksTUFBTSx3Q0FBd0M7QUFBQSxRQUM1RDtBQUNBLGVBQU87QUFBQSxNQUNYO0FBQ0EsT0FBQyxTQUFVQyxNQUFLO0FBQ1osaUJBQVMsUUFBUSxLQUFLO0FBQ2xCLGNBQUksUUFBUSxRQUFXO0FBQ25CLGtCQUFNLElBQUksTUFBTSx1Q0FBdUM7QUFBQSxVQUMzRDtBQUNBLGlCQUFPO0FBQUEsUUFDWDtBQUNBLFFBQUFBLEtBQUksVUFBVTtBQUFBLE1BQ2xCLEdBQUcsUUFBUSxNQUFNLENBQUMsRUFBRTtBQUNwQixjQUFRLFVBQVU7QUFBQTtBQUFBOzs7QUN0QmxCO0FBQUE7QUFBQTtBQUtBLGFBQU8sZUFBZSxTQUFTLGNBQWMsRUFBRSxPQUFPLEtBQUssQ0FBQztBQUM1RCxjQUFRLFVBQVUsUUFBUSxRQUFRO0FBQ2xDLFVBQU0sUUFBUTtBQUNkLFVBQUk7QUFDSixPQUFDLFNBQVVDLFFBQU87QUFDZCxjQUFNLGNBQWMsRUFBRSxVQUFVO0FBQUEsUUFBRSxFQUFFO0FBQ3BDLFFBQUFBLE9BQU0sT0FBTyxXQUFZO0FBQUUsaUJBQU87QUFBQSxRQUFhO0FBQUEsTUFDbkQsR0FBRyxVQUFVLFFBQVEsUUFBUSxRQUFRLENBQUMsRUFBRTtBQUN4QyxVQUFNLGVBQU4sTUFBbUI7QUFBQSxRQUNmLElBQUksVUFBVSxVQUFVLE1BQU0sUUFBUTtBQUNsQyxjQUFJLENBQUMsS0FBSyxZQUFZO0FBQ2xCLGlCQUFLLGFBQWEsQ0FBQztBQUNuQixpQkFBSyxZQUFZLENBQUM7QUFBQSxVQUN0QjtBQUNBLGVBQUssV0FBVyxLQUFLLFFBQVE7QUFDN0IsZUFBSyxVQUFVLEtBQUssT0FBTztBQUMzQixjQUFJLE1BQU0sUUFBUSxNQUFNLEdBQUc7QUFDdkIsbUJBQU8sS0FBSyxFQUFFLFNBQVMsTUFBTSxLQUFLLE9BQU8sVUFBVSxPQUFPLEVBQUUsQ0FBQztBQUFBLFVBQ2pFO0FBQUEsUUFDSjtBQUFBLFFBQ0EsT0FBTyxVQUFVLFVBQVUsTUFBTTtBQUM3QixjQUFJLENBQUMsS0FBSyxZQUFZO0FBQ2xCO0FBQUEsVUFDSjtBQUNBLGNBQUksb0NBQW9DO0FBQ3hDLG1CQUFTLElBQUksR0FBRyxNQUFNLEtBQUssV0FBVyxRQUFRLElBQUksS0FBSyxLQUFLO0FBQ3hELGdCQUFJLEtBQUssV0FBVyxDQUFDLE1BQU0sVUFBVTtBQUNqQyxrQkFBSSxLQUFLLFVBQVUsQ0FBQyxNQUFNLFNBQVM7QUFFL0IscUJBQUssV0FBVyxPQUFPLEdBQUcsQ0FBQztBQUMzQixxQkFBSyxVQUFVLE9BQU8sR0FBRyxDQUFDO0FBQzFCO0FBQUEsY0FDSixPQUNLO0FBQ0Qsb0RBQW9DO0FBQUEsY0FDeEM7QUFBQSxZQUNKO0FBQUEsVUFDSjtBQUNBLGNBQUksbUNBQW1DO0FBQ25DLGtCQUFNLElBQUksTUFBTSxtRkFBbUY7QUFBQSxVQUN2RztBQUFBLFFBQ0o7QUFBQSxRQUNBLFVBQVUsTUFBTTtBQUNaLGNBQUksQ0FBQyxLQUFLLFlBQVk7QUFDbEIsbUJBQU8sQ0FBQztBQUFBLFVBQ1o7QUFDQSxnQkFBTSxNQUFNLENBQUMsR0FBRyxZQUFZLEtBQUssV0FBVyxNQUFNLENBQUMsR0FBRyxXQUFXLEtBQUssVUFBVSxNQUFNLENBQUM7QUFDdkYsbUJBQVMsSUFBSSxHQUFHLE1BQU0sVUFBVSxRQUFRLElBQUksS0FBSyxLQUFLO0FBQ2xELGdCQUFJO0FBQ0Esa0JBQUksS0FBSyxVQUFVLENBQUMsRUFBRSxNQUFNLFNBQVMsQ0FBQyxHQUFHLElBQUksQ0FBQztBQUFBLFlBQ2xELFNBQ08sR0FBRztBQUVOLGVBQUMsR0FBRyxNQUFNLFNBQVMsRUFBRSxRQUFRLE1BQU0sQ0FBQztBQUFBLFlBQ3hDO0FBQUEsVUFDSjtBQUNBLGlCQUFPO0FBQUEsUUFDWDtBQUFBLFFBQ0EsVUFBVTtBQUNOLGlCQUFPLENBQUMsS0FBSyxjQUFjLEtBQUssV0FBVyxXQUFXO0FBQUEsUUFDMUQ7QUFBQSxRQUNBLFVBQVU7QUFDTixlQUFLLGFBQWE7QUFDbEIsZUFBSyxZQUFZO0FBQUEsUUFDckI7QUFBQSxNQUNKO0FBQ0EsVUFBTSxVQUFOLE1BQU0sU0FBUTtBQUFBLFFBQ1YsWUFBWSxVQUFVO0FBQ2xCLGVBQUssV0FBVztBQUFBLFFBQ3BCO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQSxRQUtBLElBQUksUUFBUTtBQUNSLGNBQUksQ0FBQyxLQUFLLFFBQVE7QUFDZCxpQkFBSyxTQUFTLENBQUMsVUFBVSxVQUFVLGdCQUFnQjtBQUMvQyxrQkFBSSxDQUFDLEtBQUssWUFBWTtBQUNsQixxQkFBSyxhQUFhLElBQUksYUFBYTtBQUFBLGNBQ3ZDO0FBQ0Esa0JBQUksS0FBSyxZQUFZLEtBQUssU0FBUyxzQkFBc0IsS0FBSyxXQUFXLFFBQVEsR0FBRztBQUNoRixxQkFBSyxTQUFTLG1CQUFtQixJQUFJO0FBQUEsY0FDekM7QUFDQSxtQkFBSyxXQUFXLElBQUksVUFBVSxRQUFRO0FBQ3RDLG9CQUFNLFNBQVM7QUFBQSxnQkFDWCxTQUFTLE1BQU07QUFDWCxzQkFBSSxDQUFDLEtBQUssWUFBWTtBQUVsQjtBQUFBLGtCQUNKO0FBQ0EsdUJBQUssV0FBVyxPQUFPLFVBQVUsUUFBUTtBQUN6Qyx5QkFBTyxVQUFVLFNBQVE7QUFDekIsc0JBQUksS0FBSyxZQUFZLEtBQUssU0FBUyx3QkFBd0IsS0FBSyxXQUFXLFFBQVEsR0FBRztBQUNsRix5QkFBSyxTQUFTLHFCQUFxQixJQUFJO0FBQUEsa0JBQzNDO0FBQUEsZ0JBQ0o7QUFBQSxjQUNKO0FBQ0Esa0JBQUksTUFBTSxRQUFRLFdBQVcsR0FBRztBQUM1Qiw0QkFBWSxLQUFLLE1BQU07QUFBQSxjQUMzQjtBQUNBLHFCQUFPO0FBQUEsWUFDWDtBQUFBLFVBQ0o7QUFDQSxpQkFBTyxLQUFLO0FBQUEsUUFDaEI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFFBS0EsS0FBSyxPQUFPO0FBQ1IsY0FBSSxLQUFLLFlBQVk7QUFDakIsaUJBQUssV0FBVyxPQUFPLEtBQUssS0FBSyxZQUFZLEtBQUs7QUFBQSxVQUN0RDtBQUFBLFFBQ0o7QUFBQSxRQUNBLFVBQVU7QUFDTixjQUFJLEtBQUssWUFBWTtBQUNqQixpQkFBSyxXQUFXLFFBQVE7QUFDeEIsaUJBQUssYUFBYTtBQUFBLFVBQ3RCO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFDQSxjQUFRLFVBQVU7QUFDbEIsY0FBUSxRQUFRLFdBQVk7QUFBQSxNQUFFO0FBQUE7QUFBQTs7O0FDL0g5QjtBQUFBO0FBQUE7QUFLQSxhQUFPLGVBQWUsU0FBUyxjQUFjLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDNUQsY0FBUSwwQkFBMEIsUUFBUSxvQkFBb0I7QUFDOUQsVUFBTSxRQUFRO0FBQ2QsVUFBTUMsTUFBSztBQUNYLFVBQU0sV0FBVztBQUNqQixVQUFJO0FBQ0osT0FBQyxTQUFVQyxvQkFBbUI7QUFDMUIsUUFBQUEsbUJBQWtCLE9BQU8sT0FBTyxPQUFPO0FBQUEsVUFDbkMseUJBQXlCO0FBQUEsVUFDekIseUJBQXlCLFNBQVMsTUFBTTtBQUFBLFFBQzVDLENBQUM7QUFDRCxRQUFBQSxtQkFBa0IsWUFBWSxPQUFPLE9BQU87QUFBQSxVQUN4Qyx5QkFBeUI7QUFBQSxVQUN6Qix5QkFBeUIsU0FBUyxNQUFNO0FBQUEsUUFDNUMsQ0FBQztBQUNELGlCQUFTLEdBQUcsT0FBTztBQUNmLGdCQUFNLFlBQVk7QUFDbEIsaUJBQU8sY0FBYyxjQUFjQSxtQkFBa0IsUUFDOUMsY0FBY0EsbUJBQWtCLGFBQy9CRCxJQUFHLFFBQVEsVUFBVSx1QkFBdUIsS0FBSyxDQUFDLENBQUMsVUFBVTtBQUFBLFFBQ3pFO0FBQ0EsUUFBQUMsbUJBQWtCLEtBQUs7QUFBQSxNQUMzQixHQUFHLHNCQUFzQixRQUFRLG9CQUFvQixvQkFBb0IsQ0FBQyxFQUFFO0FBQzVFLFVBQU0sZ0JBQWdCLE9BQU8sT0FBTyxTQUFVLFVBQVUsU0FBUztBQUM3RCxjQUFNLFVBQVUsR0FBRyxNQUFNLFNBQVMsRUFBRSxNQUFNLFdBQVcsU0FBUyxLQUFLLE9BQU8sR0FBRyxDQUFDO0FBQzlFLGVBQU8sRUFBRSxVQUFVO0FBQUUsaUJBQU8sUUFBUTtBQUFBLFFBQUcsRUFBRTtBQUFBLE1BQzdDLENBQUM7QUFDRCxVQUFNLGVBQU4sTUFBbUI7QUFBQSxRQUNmLGNBQWM7QUFDVixlQUFLLGVBQWU7QUFBQSxRQUN4QjtBQUFBLFFBQ0EsU0FBUztBQUNMLGNBQUksQ0FBQyxLQUFLLGNBQWM7QUFDcEIsaUJBQUssZUFBZTtBQUNwQixnQkFBSSxLQUFLLFVBQVU7QUFDZixtQkFBSyxTQUFTLEtBQUssTUFBUztBQUM1QixtQkFBSyxRQUFRO0FBQUEsWUFDakI7QUFBQSxVQUNKO0FBQUEsUUFDSjtBQUFBLFFBQ0EsSUFBSSwwQkFBMEI7QUFDMUIsaUJBQU8sS0FBSztBQUFBLFFBQ2hCO0FBQUEsUUFDQSxJQUFJLDBCQUEwQjtBQUMxQixjQUFJLEtBQUssY0FBYztBQUNuQixtQkFBTztBQUFBLFVBQ1g7QUFDQSxjQUFJLENBQUMsS0FBSyxVQUFVO0FBQ2hCLGlCQUFLLFdBQVcsSUFBSSxTQUFTLFFBQVE7QUFBQSxVQUN6QztBQUNBLGlCQUFPLEtBQUssU0FBUztBQUFBLFFBQ3pCO0FBQUEsUUFDQSxVQUFVO0FBQ04sY0FBSSxLQUFLLFVBQVU7QUFDZixpQkFBSyxTQUFTLFFBQVE7QUFDdEIsaUJBQUssV0FBVztBQUFBLFVBQ3BCO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFDQSxVQUFNLDBCQUFOLE1BQThCO0FBQUEsUUFDMUIsSUFBSSxRQUFRO0FBQ1IsY0FBSSxDQUFDLEtBQUssUUFBUTtBQUdkLGlCQUFLLFNBQVMsSUFBSSxhQUFhO0FBQUEsVUFDbkM7QUFDQSxpQkFBTyxLQUFLO0FBQUEsUUFDaEI7QUFBQSxRQUNBLFNBQVM7QUFDTCxjQUFJLENBQUMsS0FBSyxRQUFRO0FBSWQsaUJBQUssU0FBUyxrQkFBa0I7QUFBQSxVQUNwQyxPQUNLO0FBQ0QsaUJBQUssT0FBTyxPQUFPO0FBQUEsVUFDdkI7QUFBQSxRQUNKO0FBQUEsUUFDQSxVQUFVO0FBQ04sY0FBSSxDQUFDLEtBQUssUUFBUTtBQUVkLGlCQUFLLFNBQVMsa0JBQWtCO0FBQUEsVUFDcEMsV0FDUyxLQUFLLGtCQUFrQixjQUFjO0FBRTFDLGlCQUFLLE9BQU8sUUFBUTtBQUFBLFVBQ3hCO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFDQSxjQUFRLDBCQUEwQjtBQUFBO0FBQUE7OztBQy9GbEM7QUFBQTtBQUFBO0FBS0EsYUFBTyxlQUFlLFNBQVMsY0FBYyxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQzVELGNBQVEsOEJBQThCLFFBQVEsNEJBQTRCO0FBQzFFLFVBQU0saUJBQWlCO0FBQ3ZCLFVBQUk7QUFDSixPQUFDLFNBQVVDLG9CQUFtQjtBQUMxQixRQUFBQSxtQkFBa0IsV0FBVztBQUM3QixRQUFBQSxtQkFBa0IsWUFBWTtBQUFBLE1BQ2xDLEdBQUcsc0JBQXNCLG9CQUFvQixDQUFDLEVBQUU7QUFDaEQsVUFBTSw0QkFBTixNQUFnQztBQUFBLFFBQzVCLGNBQWM7QUFDVixlQUFLLFVBQVUsb0JBQUksSUFBSTtBQUFBLFFBQzNCO0FBQUEsUUFDQSxtQkFBbUIsU0FBUztBQUN4QixjQUFJLFFBQVEsT0FBTyxNQUFNO0FBQ3JCO0FBQUEsVUFDSjtBQUNBLGdCQUFNLFNBQVMsSUFBSSxrQkFBa0IsQ0FBQztBQUN0QyxnQkFBTSxPQUFPLElBQUksV0FBVyxRQUFRLEdBQUcsQ0FBQztBQUN4QyxlQUFLLENBQUMsSUFBSSxrQkFBa0I7QUFDNUIsZUFBSyxRQUFRLElBQUksUUFBUSxJQUFJLE1BQU07QUFDbkMsa0JBQVEsb0JBQW9CO0FBQUEsUUFDaEM7QUFBQSxRQUNBLE1BQU0saUJBQWlCQyxRQUFPLElBQUk7QUFDOUIsZ0JBQU0sU0FBUyxLQUFLLFFBQVEsSUFBSSxFQUFFO0FBQ2xDLGNBQUksV0FBVyxRQUFXO0FBQ3RCO0FBQUEsVUFDSjtBQUNBLGdCQUFNLE9BQU8sSUFBSSxXQUFXLFFBQVEsR0FBRyxDQUFDO0FBQ3hDLGtCQUFRLE1BQU0sTUFBTSxHQUFHLGtCQUFrQixTQUFTO0FBQUEsUUFDdEQ7QUFBQSxRQUNBLFFBQVEsSUFBSTtBQUNSLGVBQUssUUFBUSxPQUFPLEVBQUU7QUFBQSxRQUMxQjtBQUFBLFFBQ0EsVUFBVTtBQUNOLGVBQUssUUFBUSxNQUFNO0FBQUEsUUFDdkI7QUFBQSxNQUNKO0FBQ0EsY0FBUSw0QkFBNEI7QUFDcEMsVUFBTSxxQ0FBTixNQUF5QztBQUFBLFFBQ3JDLFlBQVksUUFBUTtBQUNoQixlQUFLLE9BQU8sSUFBSSxXQUFXLFFBQVEsR0FBRyxDQUFDO0FBQUEsUUFDM0M7QUFBQSxRQUNBLElBQUksMEJBQTBCO0FBQzFCLGlCQUFPLFFBQVEsS0FBSyxLQUFLLE1BQU0sQ0FBQyxNQUFNLGtCQUFrQjtBQUFBLFFBQzVEO0FBQUEsUUFDQSxJQUFJLDBCQUEwQjtBQUMxQixnQkFBTSxJQUFJLE1BQU0seUVBQXlFO0FBQUEsUUFDN0Y7QUFBQSxNQUNKO0FBQ0EsVUFBTSwyQ0FBTixNQUErQztBQUFBLFFBQzNDLFlBQVksUUFBUTtBQUNoQixlQUFLLFFBQVEsSUFBSSxtQ0FBbUMsTUFBTTtBQUFBLFFBQzlEO0FBQUEsUUFDQSxTQUFTO0FBQUEsUUFDVDtBQUFBLFFBQ0EsVUFBVTtBQUFBLFFBQ1Y7QUFBQSxNQUNKO0FBQ0EsVUFBTSw4QkFBTixNQUFrQztBQUFBLFFBQzlCLGNBQWM7QUFDVixlQUFLLE9BQU87QUFBQSxRQUNoQjtBQUFBLFFBQ0EsOEJBQThCLFNBQVM7QUFDbkMsZ0JBQU0sU0FBUyxRQUFRO0FBQ3ZCLGNBQUksV0FBVyxRQUFXO0FBQ3RCLG1CQUFPLElBQUksZUFBZSx3QkFBd0I7QUFBQSxVQUN0RDtBQUNBLGlCQUFPLElBQUkseUNBQXlDLE1BQU07QUFBQSxRQUM5RDtBQUFBLE1BQ0o7QUFDQSxjQUFRLDhCQUE4QjtBQUFBO0FBQUE7OztBQzNFdEM7QUFBQTtBQUFBO0FBS0EsYUFBTyxlQUFlLFNBQVMsY0FBYyxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQzVELGNBQVEsWUFBWTtBQUNwQixVQUFNLFFBQVE7QUFDZCxVQUFNLFlBQU4sTUFBZ0I7QUFBQSxRQUNaLFlBQVksV0FBVyxHQUFHO0FBQ3RCLGNBQUksWUFBWSxHQUFHO0FBQ2Ysa0JBQU0sSUFBSSxNQUFNLGlDQUFpQztBQUFBLFVBQ3JEO0FBQ0EsZUFBSyxZQUFZO0FBQ2pCLGVBQUssVUFBVTtBQUNmLGVBQUssV0FBVyxDQUFDO0FBQUEsUUFDckI7QUFBQSxRQUNBLEtBQUssT0FBTztBQUNSLGlCQUFPLElBQUksUUFBUSxDQUFDLFNBQVMsV0FBVztBQUNwQyxpQkFBSyxTQUFTLEtBQUssRUFBRSxPQUFPLFNBQVMsT0FBTyxDQUFDO0FBQzdDLGlCQUFLLFFBQVE7QUFBQSxVQUNqQixDQUFDO0FBQUEsUUFDTDtBQUFBLFFBQ0EsSUFBSSxTQUFTO0FBQ1QsaUJBQU8sS0FBSztBQUFBLFFBQ2hCO0FBQUEsUUFDQSxVQUFVO0FBQ04sY0FBSSxLQUFLLFNBQVMsV0FBVyxLQUFLLEtBQUssWUFBWSxLQUFLLFdBQVc7QUFDL0Q7QUFBQSxVQUNKO0FBQ0EsV0FBQyxHQUFHLE1BQU0sU0FBUyxFQUFFLE1BQU0sYUFBYSxNQUFNLEtBQUssVUFBVSxDQUFDO0FBQUEsUUFDbEU7QUFBQSxRQUNBLFlBQVk7QUFDUixjQUFJLEtBQUssU0FBUyxXQUFXLEtBQUssS0FBSyxZQUFZLEtBQUssV0FBVztBQUMvRDtBQUFBLFVBQ0o7QUFDQSxnQkFBTSxPQUFPLEtBQUssU0FBUyxNQUFNO0FBQ2pDLGVBQUs7QUFDTCxjQUFJLEtBQUssVUFBVSxLQUFLLFdBQVc7QUFDL0Isa0JBQU0sSUFBSSxNQUFNLHVCQUF1QjtBQUFBLFVBQzNDO0FBQ0EsY0FBSTtBQUNBLGtCQUFNLFNBQVMsS0FBSyxNQUFNO0FBQzFCLGdCQUFJLGtCQUFrQixTQUFTO0FBQzNCLHFCQUFPLEtBQUssQ0FBQyxVQUFVO0FBQ25CLHFCQUFLO0FBQ0wscUJBQUssUUFBUSxLQUFLO0FBQ2xCLHFCQUFLLFFBQVE7QUFBQSxjQUNqQixHQUFHLENBQUMsUUFBUTtBQUNSLHFCQUFLO0FBQ0wscUJBQUssT0FBTyxHQUFHO0FBQ2YscUJBQUssUUFBUTtBQUFBLGNBQ2pCLENBQUM7QUFBQSxZQUNMLE9BQ0s7QUFDRCxtQkFBSztBQUNMLG1CQUFLLFFBQVEsTUFBTTtBQUNuQixtQkFBSyxRQUFRO0FBQUEsWUFDakI7QUFBQSxVQUNKLFNBQ08sS0FBSztBQUNSLGlCQUFLO0FBQ0wsaUJBQUssT0FBTyxHQUFHO0FBQ2YsaUJBQUssUUFBUTtBQUFBLFVBQ2pCO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFDQSxjQUFRLFlBQVk7QUFBQTtBQUFBOzs7QUNuRXBCO0FBQUE7QUFBQTtBQUtBLGFBQU8sZUFBZSxTQUFTLGNBQWMsRUFBRSxPQUFPLEtBQUssQ0FBQztBQUM1RCxjQUFRLDhCQUE4QixRQUFRLHdCQUF3QixRQUFRLGdCQUFnQjtBQUM5RixVQUFNLFFBQVE7QUFDZCxVQUFNQyxNQUFLO0FBQ1gsVUFBTSxXQUFXO0FBQ2pCLFVBQU0sY0FBYztBQUNwQixVQUFJQztBQUNKLE9BQUMsU0FBVUEsZ0JBQWU7QUFDdEIsaUJBQVMsR0FBRyxPQUFPO0FBQ2YsY0FBSSxZQUFZO0FBQ2hCLGlCQUFPLGFBQWFELElBQUcsS0FBSyxVQUFVLE1BQU0sS0FBS0EsSUFBRyxLQUFLLFVBQVUsT0FBTyxLQUN0RUEsSUFBRyxLQUFLLFVBQVUsT0FBTyxLQUFLQSxJQUFHLEtBQUssVUFBVSxPQUFPLEtBQUtBLElBQUcsS0FBSyxVQUFVLGdCQUFnQjtBQUFBLFFBQ3RHO0FBQ0EsUUFBQUMsZUFBYyxLQUFLO0FBQUEsTUFDdkIsR0FBR0EsbUJBQWtCLFFBQVEsZ0JBQWdCQSxpQkFBZ0IsQ0FBQyxFQUFFO0FBQ2hFLFVBQU1DLHlCQUFOLE1BQTRCO0FBQUEsUUFDeEIsY0FBYztBQUNWLGVBQUssZUFBZSxJQUFJLFNBQVMsUUFBUTtBQUN6QyxlQUFLLGVBQWUsSUFBSSxTQUFTLFFBQVE7QUFDekMsZUFBSyx3QkFBd0IsSUFBSSxTQUFTLFFBQVE7QUFBQSxRQUN0RDtBQUFBLFFBQ0EsVUFBVTtBQUNOLGVBQUssYUFBYSxRQUFRO0FBQzFCLGVBQUssYUFBYSxRQUFRO0FBQUEsUUFDOUI7QUFBQSxRQUNBLElBQUksVUFBVTtBQUNWLGlCQUFPLEtBQUssYUFBYTtBQUFBLFFBQzdCO0FBQUEsUUFDQSxVQUFVLE9BQU87QUFDYixlQUFLLGFBQWEsS0FBSyxLQUFLLFFBQVEsS0FBSyxDQUFDO0FBQUEsUUFDOUM7QUFBQSxRQUNBLElBQUksVUFBVTtBQUNWLGlCQUFPLEtBQUssYUFBYTtBQUFBLFFBQzdCO0FBQUEsUUFDQSxZQUFZO0FBQ1IsZUFBSyxhQUFhLEtBQUssTUFBUztBQUFBLFFBQ3BDO0FBQUEsUUFDQSxJQUFJLG1CQUFtQjtBQUNuQixpQkFBTyxLQUFLLHNCQUFzQjtBQUFBLFFBQ3RDO0FBQUEsUUFDQSxtQkFBbUIsTUFBTTtBQUNyQixlQUFLLHNCQUFzQixLQUFLLElBQUk7QUFBQSxRQUN4QztBQUFBLFFBQ0EsUUFBUSxPQUFPO0FBQ1gsY0FBSSxpQkFBaUIsT0FBTztBQUN4QixtQkFBTztBQUFBLFVBQ1gsT0FDSztBQUNELG1CQUFPLElBQUksTUFBTSxrQ0FBa0NGLElBQUcsT0FBTyxNQUFNLE9BQU8sSUFBSSxNQUFNLFVBQVUsU0FBUyxFQUFFO0FBQUEsVUFDN0c7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUNBLGNBQVEsd0JBQXdCRTtBQUNoQyxVQUFJO0FBQ0osT0FBQyxTQUFVQywrQkFBOEI7QUFDckMsaUJBQVMsWUFBWSxTQUFTO0FBQzFCLGNBQUk7QUFDSixjQUFJO0FBQ0osY0FBSTtBQUNKLGdCQUFNLGtCQUFrQixvQkFBSSxJQUFJO0FBQ2hDLGNBQUk7QUFDSixnQkFBTSxzQkFBc0Isb0JBQUksSUFBSTtBQUNwQyxjQUFJLFlBQVksVUFBYSxPQUFPLFlBQVksVUFBVTtBQUN0RCxzQkFBVSxXQUFXO0FBQUEsVUFDekIsT0FDSztBQUNELHNCQUFVLFFBQVEsV0FBVztBQUM3QixnQkFBSSxRQUFRLG1CQUFtQixRQUFXO0FBQ3RDLCtCQUFpQixRQUFRO0FBQ3pCLDhCQUFnQixJQUFJLGVBQWUsTUFBTSxjQUFjO0FBQUEsWUFDM0Q7QUFDQSxnQkFBSSxRQUFRLG9CQUFvQixRQUFXO0FBQ3ZDLHlCQUFXLFdBQVcsUUFBUSxpQkFBaUI7QUFDM0MsZ0NBQWdCLElBQUksUUFBUSxNQUFNLE9BQU87QUFBQSxjQUM3QztBQUFBLFlBQ0o7QUFDQSxnQkFBSSxRQUFRLHVCQUF1QixRQUFXO0FBQzFDLG1DQUFxQixRQUFRO0FBQzdCLGtDQUFvQixJQUFJLG1CQUFtQixNQUFNLGtCQUFrQjtBQUFBLFlBQ3ZFO0FBQ0EsZ0JBQUksUUFBUSx3QkFBd0IsUUFBVztBQUMzQyx5QkFBVyxXQUFXLFFBQVEscUJBQXFCO0FBQy9DLG9DQUFvQixJQUFJLFFBQVEsTUFBTSxPQUFPO0FBQUEsY0FDakQ7QUFBQSxZQUNKO0FBQUEsVUFDSjtBQUNBLGNBQUksdUJBQXVCLFFBQVc7QUFDbEMsa0NBQXNCLEdBQUcsTUFBTSxTQUFTLEVBQUUsZ0JBQWdCO0FBQzFELGdDQUFvQixJQUFJLG1CQUFtQixNQUFNLGtCQUFrQjtBQUFBLFVBQ3ZFO0FBQ0EsaUJBQU8sRUFBRSxTQUFTLGdCQUFnQixpQkFBaUIsb0JBQW9CLG9CQUFvQjtBQUFBLFFBQy9GO0FBQ0EsUUFBQUEsOEJBQTZCLGNBQWM7QUFBQSxNQUMvQyxHQUFHLGlDQUFpQywrQkFBK0IsQ0FBQyxFQUFFO0FBQ3RFLFVBQU0sOEJBQU4sY0FBMENELHVCQUFzQjtBQUFBLFFBQzVELFlBQVksVUFBVSxTQUFTO0FBQzNCLGdCQUFNO0FBQ04sZUFBSyxXQUFXO0FBQ2hCLGVBQUssVUFBVSw2QkFBNkIsWUFBWSxPQUFPO0FBQy9ELGVBQUssVUFBVSxHQUFHLE1BQU0sU0FBUyxFQUFFLGNBQWMsT0FBTyxLQUFLLFFBQVEsT0FBTztBQUM1RSxlQUFLLHlCQUF5QjtBQUM5QixlQUFLLG9CQUFvQjtBQUN6QixlQUFLLGVBQWU7QUFDcEIsZUFBSyxnQkFBZ0IsSUFBSSxZQUFZLFVBQVUsQ0FBQztBQUFBLFFBQ3BEO0FBQUEsUUFDQSxJQUFJLHNCQUFzQixTQUFTO0FBQy9CLGVBQUsseUJBQXlCO0FBQUEsUUFDbEM7QUFBQSxRQUNBLElBQUksd0JBQXdCO0FBQ3hCLGlCQUFPLEtBQUs7QUFBQSxRQUNoQjtBQUFBLFFBQ0EsT0FBTyxVQUFVO0FBQ2IsZUFBSyxvQkFBb0I7QUFDekIsZUFBSyxlQUFlO0FBQ3BCLGVBQUssc0JBQXNCO0FBQzNCLGVBQUssV0FBVztBQUNoQixnQkFBTSxTQUFTLEtBQUssU0FBUyxPQUFPLENBQUMsU0FBUztBQUMxQyxpQkFBSyxPQUFPLElBQUk7QUFBQSxVQUNwQixDQUFDO0FBQ0QsZUFBSyxTQUFTLFFBQVEsQ0FBQyxVQUFVLEtBQUssVUFBVSxLQUFLLENBQUM7QUFDdEQsZUFBSyxTQUFTLFFBQVEsTUFBTSxLQUFLLFVBQVUsQ0FBQztBQUM1QyxpQkFBTztBQUFBLFFBQ1g7QUFBQSxRQUNBLE9BQU8sTUFBTTtBQUNULGNBQUk7QUFDQSxpQkFBSyxPQUFPLE9BQU8sSUFBSTtBQUN2QixtQkFBTyxNQUFNO0FBQ1Qsa0JBQUksS0FBSyxzQkFBc0IsSUFBSTtBQUMvQixzQkFBTSxVQUFVLEtBQUssT0FBTyxlQUFlLElBQUk7QUFDL0Msb0JBQUksQ0FBQyxTQUFTO0FBQ1Y7QUFBQSxnQkFDSjtBQUNBLHNCQUFNLGdCQUFnQixRQUFRLElBQUksZ0JBQWdCO0FBQ2xELG9CQUFJLENBQUMsZUFBZTtBQUNoQix1QkFBSyxVQUFVLElBQUksTUFBTTtBQUFBLEVBQW1ELEtBQUssVUFBVSxPQUFPLFlBQVksT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDO0FBQzFIO0FBQUEsZ0JBQ0o7QUFDQSxzQkFBTSxTQUFTLFNBQVMsYUFBYTtBQUNyQyxvQkFBSSxNQUFNLE1BQU0sR0FBRztBQUNmLHVCQUFLLFVBQVUsSUFBSSxNQUFNLDhDQUE4QyxhQUFhLEVBQUUsQ0FBQztBQUN2RjtBQUFBLGdCQUNKO0FBQ0EscUJBQUssb0JBQW9CO0FBQUEsY0FDN0I7QUFDQSxvQkFBTSxPQUFPLEtBQUssT0FBTyxZQUFZLEtBQUssaUJBQWlCO0FBQzNELGtCQUFJLFNBQVMsUUFBVztBQUVwQixxQkFBSyx1QkFBdUI7QUFDNUI7QUFBQSxjQUNKO0FBQ0EsbUJBQUsseUJBQXlCO0FBQzlCLG1CQUFLLG9CQUFvQjtBQUt6QixtQkFBSyxjQUFjLEtBQUssWUFBWTtBQUNoQyxzQkFBTSxRQUFRLEtBQUssUUFBUSxtQkFBbUIsU0FDeEMsTUFBTSxLQUFLLFFBQVEsZUFBZSxPQUFPLElBQUksSUFDN0M7QUFDTixzQkFBTSxVQUFVLE1BQU0sS0FBSyxRQUFRLG1CQUFtQixPQUFPLE9BQU8sS0FBSyxPQUFPO0FBQ2hGLHFCQUFLLFNBQVMsT0FBTztBQUFBLGNBQ3pCLENBQUMsRUFBRSxNQUFNLENBQUMsVUFBVTtBQUNoQixxQkFBSyxVQUFVLEtBQUs7QUFBQSxjQUN4QixDQUFDO0FBQUEsWUFDTDtBQUFBLFVBQ0osU0FDTyxPQUFPO0FBQ1YsaUJBQUssVUFBVSxLQUFLO0FBQUEsVUFDeEI7QUFBQSxRQUNKO0FBQUEsUUFDQSwyQkFBMkI7QUFDdkIsY0FBSSxLQUFLLHFCQUFxQjtBQUMxQixpQkFBSyxvQkFBb0IsUUFBUTtBQUNqQyxpQkFBSyxzQkFBc0I7QUFBQSxVQUMvQjtBQUFBLFFBQ0o7QUFBQSxRQUNBLHlCQUF5QjtBQUNyQixlQUFLLHlCQUF5QjtBQUM5QixjQUFJLEtBQUssMEJBQTBCLEdBQUc7QUFDbEM7QUFBQSxVQUNKO0FBQ0EsZUFBSyx1QkFBdUIsR0FBRyxNQUFNLFNBQVMsRUFBRSxNQUFNLFdBQVcsQ0FBQyxPQUFPLFlBQVk7QUFDakYsaUJBQUssc0JBQXNCO0FBQzNCLGdCQUFJLFVBQVUsS0FBSyxjQUFjO0FBQzdCLG1CQUFLLG1CQUFtQixFQUFFLGNBQWMsT0FBTyxhQUFhLFFBQVEsQ0FBQztBQUNyRSxtQkFBSyx1QkFBdUI7QUFBQSxZQUNoQztBQUFBLFVBQ0osR0FBRyxLQUFLLHdCQUF3QixLQUFLLGNBQWMsS0FBSyxzQkFBc0I7QUFBQSxRQUNsRjtBQUFBLE1BQ0o7QUFDQSxjQUFRLDhCQUE4QjtBQUFBO0FBQUE7OztBQ3BNdEM7QUFBQTtBQUFBO0FBS0EsYUFBTyxlQUFlLFNBQVMsY0FBYyxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQzVELGNBQVEsK0JBQStCLFFBQVEsd0JBQXdCLFFBQVEsZ0JBQWdCO0FBQy9GLFVBQU0sUUFBUTtBQUNkLFVBQU1FLE1BQUs7QUFDWCxVQUFNLGNBQWM7QUFDcEIsVUFBTSxXQUFXO0FBQ2pCLFVBQU0sZ0JBQWdCO0FBQ3RCLFVBQU0sT0FBTztBQUNiLFVBQUlDO0FBQ0osT0FBQyxTQUFVQSxnQkFBZTtBQUN0QixpQkFBUyxHQUFHLE9BQU87QUFDZixjQUFJLFlBQVk7QUFDaEIsaUJBQU8sYUFBYUQsSUFBRyxLQUFLLFVBQVUsT0FBTyxLQUFLQSxJQUFHLEtBQUssVUFBVSxPQUFPLEtBQ3ZFQSxJQUFHLEtBQUssVUFBVSxPQUFPLEtBQUtBLElBQUcsS0FBSyxVQUFVLEtBQUs7QUFBQSxRQUM3RDtBQUNBLFFBQUFDLGVBQWMsS0FBSztBQUFBLE1BQ3ZCLEdBQUdBLG1CQUFrQixRQUFRLGdCQUFnQkEsaUJBQWdCLENBQUMsRUFBRTtBQUNoRSxVQUFNQyx5QkFBTixNQUE0QjtBQUFBLFFBQ3hCLGNBQWM7QUFDVixlQUFLLGVBQWUsSUFBSSxTQUFTLFFBQVE7QUFDekMsZUFBSyxlQUFlLElBQUksU0FBUyxRQUFRO0FBQUEsUUFDN0M7QUFBQSxRQUNBLFVBQVU7QUFDTixlQUFLLGFBQWEsUUFBUTtBQUMxQixlQUFLLGFBQWEsUUFBUTtBQUFBLFFBQzlCO0FBQUEsUUFDQSxJQUFJLFVBQVU7QUFDVixpQkFBTyxLQUFLLGFBQWE7QUFBQSxRQUM3QjtBQUFBLFFBQ0EsVUFBVSxPQUFPLFNBQVMsT0FBTztBQUM3QixlQUFLLGFBQWEsS0FBSyxDQUFDLEtBQUssUUFBUSxLQUFLLEdBQUcsU0FBUyxLQUFLLENBQUM7QUFBQSxRQUNoRTtBQUFBLFFBQ0EsSUFBSSxVQUFVO0FBQ1YsaUJBQU8sS0FBSyxhQUFhO0FBQUEsUUFDN0I7QUFBQSxRQUNBLFlBQVk7QUFDUixlQUFLLGFBQWEsS0FBSyxNQUFTO0FBQUEsUUFDcEM7QUFBQSxRQUNBLFFBQVEsT0FBTztBQUNYLGNBQUksaUJBQWlCLE9BQU87QUFDeEIsbUJBQU87QUFBQSxVQUNYLE9BQ0s7QUFDRCxtQkFBTyxJQUFJLE1BQU0sa0NBQWtDRixJQUFHLE9BQU8sTUFBTSxPQUFPLElBQUksTUFBTSxVQUFVLFNBQVMsRUFBRTtBQUFBLFVBQzdHO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFDQSxjQUFRLHdCQUF3QkU7QUFDaEMsVUFBSTtBQUNKLE9BQUMsU0FBVUMsK0JBQThCO0FBQ3JDLGlCQUFTLFlBQVksU0FBUztBQUMxQixjQUFJLFlBQVksVUFBYSxPQUFPLFlBQVksVUFBVTtBQUN0RCxtQkFBTyxFQUFFLFNBQVMsV0FBVyxTQUFTLHFCQUFxQixHQUFHLE1BQU0sU0FBUyxFQUFFLGdCQUFnQixRQUFRO0FBQUEsVUFDM0csT0FDSztBQUNELG1CQUFPLEVBQUUsU0FBUyxRQUFRLFdBQVcsU0FBUyxnQkFBZ0IsUUFBUSxnQkFBZ0Isb0JBQW9CLFFBQVEsdUJBQXVCLEdBQUcsTUFBTSxTQUFTLEVBQUUsZ0JBQWdCLFFBQVE7QUFBQSxVQUN6TDtBQUFBLFFBQ0o7QUFDQSxRQUFBQSw4QkFBNkIsY0FBYztBQUFBLE1BQy9DLEdBQUcsaUNBQWlDLCtCQUErQixDQUFDLEVBQUU7QUFDdEUsVUFBTSwrQkFBTixjQUEyQ0QsdUJBQXNCO0FBQUEsUUFDN0QsWUFBWSxVQUFVLFNBQVM7QUFDM0IsZ0JBQU07QUFDTixlQUFLLFdBQVc7QUFDaEIsZUFBSyxVQUFVLDZCQUE2QixZQUFZLE9BQU87QUFDL0QsZUFBSyxhQUFhO0FBQ2xCLGVBQUssaUJBQWlCLElBQUksWUFBWSxVQUFVLENBQUM7QUFDakQsZUFBSyxTQUFTLFFBQVEsQ0FBQyxVQUFVLEtBQUssVUFBVSxLQUFLLENBQUM7QUFDdEQsZUFBSyxTQUFTLFFBQVEsTUFBTSxLQUFLLFVBQVUsQ0FBQztBQUFBLFFBQ2hEO0FBQUEsUUFDQSxNQUFNLE1BQU0sS0FBSztBQUNiLGlCQUFPLEtBQUssZUFBZSxLQUFLLFlBQVk7QUFDeEMsa0JBQU0sVUFBVSxLQUFLLFFBQVEsbUJBQW1CLE9BQU8sS0FBSyxLQUFLLE9BQU8sRUFBRSxLQUFLLENBQUMsV0FBVztBQUN2RixrQkFBSSxLQUFLLFFBQVEsbUJBQW1CLFFBQVc7QUFDM0MsdUJBQU8sS0FBSyxRQUFRLGVBQWUsT0FBTyxNQUFNO0FBQUEsY0FDcEQsT0FDSztBQUNELHVCQUFPO0FBQUEsY0FDWDtBQUFBLFlBQ0osQ0FBQztBQUNELG1CQUFPLFFBQVEsS0FBSyxDQUFDLFdBQVc7QUFDNUIsb0JBQU0sVUFBVSxDQUFDO0FBQ2pCLHNCQUFRLEtBQUssZUFBZSxPQUFPLFdBQVcsU0FBUyxHQUFHLElBQUk7QUFDOUQsc0JBQVEsS0FBSyxJQUFJO0FBQ2pCLHFCQUFPLEtBQUssUUFBUSxLQUFLLFNBQVMsTUFBTTtBQUFBLFlBQzVDLEdBQUcsQ0FBQyxVQUFVO0FBQ1YsbUJBQUssVUFBVSxLQUFLO0FBQ3BCLG9CQUFNO0FBQUEsWUFDVixDQUFDO0FBQUEsVUFDTCxDQUFDO0FBQUEsUUFDTDtBQUFBLFFBQ0EsTUFBTSxRQUFRLEtBQUssU0FBUyxNQUFNO0FBQzlCLGNBQUk7QUFDQSxrQkFBTSxLQUFLLFNBQVMsTUFBTSxRQUFRLEtBQUssRUFBRSxHQUFHLE9BQU87QUFDbkQsbUJBQU8sS0FBSyxTQUFTLE1BQU0sSUFBSTtBQUFBLFVBQ25DLFNBQ08sT0FBTztBQUNWLGlCQUFLLFlBQVksT0FBTyxHQUFHO0FBQzNCLG1CQUFPLFFBQVEsT0FBTyxLQUFLO0FBQUEsVUFDL0I7QUFBQSxRQUNKO0FBQUEsUUFDQSxZQUFZLE9BQU8sS0FBSztBQUNwQixlQUFLO0FBQ0wsZUFBSyxVQUFVLE9BQU8sS0FBSyxLQUFLLFVBQVU7QUFBQSxRQUM5QztBQUFBLFFBQ0EsTUFBTTtBQUNGLGVBQUssU0FBUyxJQUFJO0FBQUEsUUFDdEI7QUFBQSxNQUNKO0FBQ0EsY0FBUSwrQkFBK0I7QUFBQTtBQUFBOzs7QUNsSHZDO0FBQUE7QUFBQTtBQUtBLGFBQU8sZUFBZSxTQUFTLGNBQWMsRUFBRSxPQUFPLEtBQUssQ0FBQztBQUM1RCxjQUFRLHdCQUF3QjtBQUNoQyxVQUFNLEtBQUs7QUFDWCxVQUFNLEtBQUs7QUFDWCxVQUFNLE9BQU87QUFDYixVQUFNLHdCQUFOLE1BQTRCO0FBQUEsUUFDeEIsWUFBWSxXQUFXLFNBQVM7QUFDNUIsZUFBSyxZQUFZO0FBQ2pCLGVBQUssVUFBVSxDQUFDO0FBQ2hCLGVBQUssZUFBZTtBQUFBLFFBQ3hCO0FBQUEsUUFDQSxJQUFJLFdBQVc7QUFDWCxpQkFBTyxLQUFLO0FBQUEsUUFDaEI7QUFBQSxRQUNBLE9BQU8sT0FBTztBQUNWLGdCQUFNLFdBQVcsT0FBTyxVQUFVLFdBQVcsS0FBSyxXQUFXLE9BQU8sS0FBSyxTQUFTLElBQUk7QUFDdEYsZUFBSyxRQUFRLEtBQUssUUFBUTtBQUMxQixlQUFLLGdCQUFnQixTQUFTO0FBQUEsUUFDbEM7QUFBQSxRQUNBLGVBQWUsZ0JBQWdCLE9BQU87QUFDbEMsY0FBSSxLQUFLLFFBQVEsV0FBVyxHQUFHO0FBQzNCLG1CQUFPO0FBQUEsVUFDWDtBQUNBLGNBQUksUUFBUTtBQUNaLGNBQUksYUFBYTtBQUNqQixjQUFJLFNBQVM7QUFDYixjQUFJLGlCQUFpQjtBQUNyQixjQUFLLFFBQU8sYUFBYSxLQUFLLFFBQVEsUUFBUTtBQUMxQyxrQkFBTSxRQUFRLEtBQUssUUFBUSxVQUFVO0FBQ3JDLHFCQUFTO0FBQ1QsbUJBQVEsUUFBTyxTQUFTLE1BQU0sUUFBUTtBQUNsQyxvQkFBTSxRQUFRLE1BQU0sTUFBTTtBQUMxQixzQkFBUSxPQUFPO0FBQUEsZ0JBQ1gsS0FBSztBQUNELDBCQUFRLE9BQU87QUFBQSxvQkFDWCxLQUFLO0FBQ0QsOEJBQVE7QUFDUjtBQUFBLG9CQUNKLEtBQUs7QUFDRCw4QkFBUTtBQUNSO0FBQUEsb0JBQ0o7QUFDSSw4QkFBUTtBQUFBLGtCQUNoQjtBQUNBO0FBQUEsZ0JBQ0osS0FBSztBQUNELDBCQUFRLE9BQU87QUFBQSxvQkFDWCxLQUFLO0FBQ0QsOEJBQVE7QUFDUjtBQUFBLG9CQUNKLEtBQUs7QUFDRCw4QkFBUTtBQUNSO0FBQ0EsNEJBQU07QUFBQSxvQkFDVjtBQUNJLDhCQUFRO0FBQUEsa0JBQ2hCO0FBQ0E7QUFBQSxnQkFDSjtBQUNJLDBCQUFRO0FBQUEsY0FDaEI7QUFDQTtBQUFBLFlBQ0o7QUFDQSw4QkFBa0IsTUFBTTtBQUN4QjtBQUFBLFVBQ0o7QUFDQSxjQUFJLFVBQVUsR0FBRztBQUNiLG1CQUFPO0FBQUEsVUFDWDtBQUdBLGdCQUFNLFNBQVMsS0FBSyxNQUFNLGlCQUFpQixNQUFNO0FBQ2pELGdCQUFNLFNBQVMsb0JBQUksSUFBSTtBQUN2QixnQkFBTSxVQUFVLEtBQUssU0FBUyxRQUFRLE9BQU8sRUFBRSxNQUFNLElBQUk7QUFDekQsY0FBSSxRQUFRLFNBQVMsR0FBRztBQUNwQixtQkFBTztBQUFBLFVBQ1g7QUFDQSxtQkFBUyxJQUFJLEdBQUcsSUFBSSxRQUFRLFNBQVMsR0FBRyxLQUFLO0FBQ3pDLGtCQUFNLFNBQVMsUUFBUSxDQUFDO0FBQ3hCLGtCQUFNLFFBQVEsT0FBTyxRQUFRLEdBQUc7QUFDaEMsZ0JBQUksVUFBVSxJQUFJO0FBQ2Qsb0JBQU0sSUFBSSxNQUFNO0FBQUEsRUFBeUQsTUFBTSxFQUFFO0FBQUEsWUFDckY7QUFDQSxrQkFBTSxNQUFNLE9BQU8sT0FBTyxHQUFHLEtBQUs7QUFDbEMsa0JBQU0sUUFBUSxPQUFPLE9BQU8sUUFBUSxDQUFDLEVBQUUsS0FBSztBQUM1QyxtQkFBTyxJQUFJLGdCQUFnQixJQUFJLFlBQVksSUFBSSxLQUFLLEtBQUs7QUFBQSxVQUM3RDtBQUNBLGlCQUFPO0FBQUEsUUFDWDtBQUFBLFFBQ0EsWUFBWSxRQUFRO0FBQ2hCLGNBQUksS0FBSyxlQUFlLFFBQVE7QUFDNUIsbUJBQU87QUFBQSxVQUNYO0FBQ0EsaUJBQU8sS0FBSyxNQUFNLE1BQU07QUFBQSxRQUM1QjtBQUFBLFFBQ0EsSUFBSSxnQkFBZ0I7QUFDaEIsaUJBQU8sS0FBSztBQUFBLFFBQ2hCO0FBQUEsUUFDQSxNQUFNLFdBQVc7QUFDYixjQUFJLGNBQWMsR0FBRztBQUNqQixtQkFBTyxLQUFLLFlBQVk7QUFBQSxVQUM1QjtBQUNBLGNBQUksWUFBWSxLQUFLLGNBQWM7QUFDL0Isa0JBQU0sSUFBSSxNQUFNLDRCQUE0QjtBQUFBLFVBQ2hEO0FBQ0EsY0FBSSxLQUFLLFFBQVEsQ0FBQyxFQUFFLGVBQWUsV0FBVztBQUUxQyxrQkFBTSxRQUFRLEtBQUssUUFBUSxDQUFDO0FBQzVCLGlCQUFLLFFBQVEsTUFBTTtBQUNuQixpQkFBSyxnQkFBZ0I7QUFDckIsbUJBQU8sS0FBSyxTQUFTLEtBQUs7QUFBQSxVQUM5QjtBQUNBLGNBQUksS0FBSyxRQUFRLENBQUMsRUFBRSxhQUFhLFdBQVc7QUFFeEMsa0JBQU0sUUFBUSxLQUFLLFFBQVEsQ0FBQztBQUM1QixrQkFBTUUsVUFBUyxLQUFLLFNBQVMsT0FBTyxTQUFTO0FBQzdDLGlCQUFLLFFBQVEsQ0FBQyxJQUFJLE1BQU0sTUFBTSxTQUFTO0FBQ3ZDLGlCQUFLLGdCQUFnQjtBQUNyQixtQkFBT0E7QUFBQSxVQUNYO0FBQ0EsZ0JBQU0sU0FBUyxLQUFLLFlBQVksU0FBUztBQUN6QyxjQUFJLGVBQWU7QUFDbkIsY0FBSSxhQUFhO0FBQ2pCLGlCQUFPLFlBQVksR0FBRztBQUNsQixrQkFBTSxRQUFRLEtBQUssUUFBUSxVQUFVO0FBQ3JDLGdCQUFJLE1BQU0sYUFBYSxXQUFXO0FBRTlCLG9CQUFNLFlBQVksTUFBTSxNQUFNLEdBQUcsU0FBUztBQUMxQyxxQkFBTyxJQUFJLFdBQVcsWUFBWTtBQUNsQyw4QkFBZ0I7QUFDaEIsbUJBQUssUUFBUSxVQUFVLElBQUksTUFBTSxNQUFNLFNBQVM7QUFDaEQsbUJBQUssZ0JBQWdCO0FBQ3JCLDJCQUFhO0FBQUEsWUFDakIsT0FDSztBQUVELHFCQUFPLElBQUksT0FBTyxZQUFZO0FBQzlCLDhCQUFnQixNQUFNO0FBQ3RCLG1CQUFLLFFBQVEsTUFBTTtBQUNuQixtQkFBSyxnQkFBZ0IsTUFBTTtBQUMzQiwyQkFBYSxNQUFNO0FBQUEsWUFDdkI7QUFBQSxVQUNKO0FBQ0EsaUJBQU87QUFBQSxRQUNYO0FBQUEsTUFDSjtBQUNBLGNBQVEsd0JBQXdCO0FBQUE7QUFBQTs7O0FDdkpoQztBQUFBO0FBQUE7QUFLQSxhQUFPLGVBQWUsU0FBUyxjQUFjLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDNUQsY0FBUSwwQkFBMEIsUUFBUSxvQkFBb0IsUUFBUSxrQkFBa0IsUUFBUSx1QkFBdUIsUUFBUSw2QkFBNkIsUUFBUSwrQkFBK0IsUUFBUSxzQ0FBc0MsUUFBUSxpQ0FBaUMsUUFBUSxxQkFBcUIsUUFBUSxrQkFBa0IsUUFBUSxtQkFBbUIsUUFBUSx1QkFBdUIsUUFBUSx1QkFBdUIsUUFBUSxjQUFjLFFBQVEsY0FBYyxRQUFRLFFBQVEsUUFBUSxhQUFhLFFBQVEsZUFBZSxRQUFRLGdCQUFnQjtBQUMxaUIsVUFBTSxRQUFRO0FBQ2QsVUFBTUMsTUFBSztBQUNYLFVBQU0sYUFBYTtBQUNuQixVQUFNLGNBQWM7QUFDcEIsVUFBTSxXQUFXO0FBQ2pCLFVBQU0saUJBQWlCO0FBQ3ZCLFVBQUk7QUFDSixPQUFDLFNBQVVDLHFCQUFvQjtBQUMzQixRQUFBQSxvQkFBbUIsT0FBTyxJQUFJLFdBQVcsaUJBQWlCLGlCQUFpQjtBQUFBLE1BQy9FLEdBQUcsdUJBQXVCLHFCQUFxQixDQUFDLEVBQUU7QUFDbEQsVUFBSTtBQUNKLE9BQUMsU0FBVUMsZ0JBQWU7QUFDdEIsaUJBQVMsR0FBRyxPQUFPO0FBQ2YsaUJBQU8sT0FBTyxVQUFVLFlBQVksT0FBTyxVQUFVO0FBQUEsUUFDekQ7QUFDQSxRQUFBQSxlQUFjLEtBQUs7QUFBQSxNQUN2QixHQUFHLGtCQUFrQixRQUFRLGdCQUFnQixnQkFBZ0IsQ0FBQyxFQUFFO0FBQ2hFLFVBQUk7QUFDSixPQUFDLFNBQVVDLHVCQUFzQjtBQUM3QixRQUFBQSxzQkFBcUIsT0FBTyxJQUFJLFdBQVcsaUJBQWlCLFlBQVk7QUFBQSxNQUM1RSxHQUFHLHlCQUF5Qix1QkFBdUIsQ0FBQyxFQUFFO0FBQ3RELFVBQU0sZUFBTixNQUFtQjtBQUFBLFFBQ2YsY0FBYztBQUFBLFFBQ2Q7QUFBQSxNQUNKO0FBQ0EsY0FBUSxlQUFlO0FBQ3ZCLFVBQUk7QUFDSixPQUFDLFNBQVVDLHFCQUFvQjtBQUMzQixpQkFBUyxHQUFHLE9BQU87QUFDZixpQkFBT0osSUFBRyxLQUFLLEtBQUs7QUFBQSxRQUN4QjtBQUNBLFFBQUFJLG9CQUFtQixLQUFLO0FBQUEsTUFDNUIsR0FBRyx1QkFBdUIscUJBQXFCLENBQUMsRUFBRTtBQUNsRCxjQUFRLGFBQWEsT0FBTyxPQUFPO0FBQUEsUUFDL0IsT0FBTyxNQUFNO0FBQUEsUUFBRTtBQUFBLFFBQ2YsTUFBTSxNQUFNO0FBQUEsUUFBRTtBQUFBLFFBQ2QsTUFBTSxNQUFNO0FBQUEsUUFBRTtBQUFBLFFBQ2QsS0FBSyxNQUFNO0FBQUEsUUFBRTtBQUFBLE1BQ2pCLENBQUM7QUFDRCxVQUFJO0FBQ0osT0FBQyxTQUFVQyxRQUFPO0FBQ2QsUUFBQUEsT0FBTUEsT0FBTSxLQUFLLElBQUksQ0FBQyxJQUFJO0FBQzFCLFFBQUFBLE9BQU1BLE9BQU0sVUFBVSxJQUFJLENBQUMsSUFBSTtBQUMvQixRQUFBQSxPQUFNQSxPQUFNLFNBQVMsSUFBSSxDQUFDLElBQUk7QUFDOUIsUUFBQUEsT0FBTUEsT0FBTSxTQUFTLElBQUksQ0FBQyxJQUFJO0FBQUEsTUFDbEMsR0FBRyxVQUFVLFFBQVEsUUFBUSxRQUFRLENBQUMsRUFBRTtBQUN4QyxVQUFJO0FBQ0osT0FBQyxTQUFVQyxjQUFhO0FBSXBCLFFBQUFBLGFBQVksTUFBTTtBQUlsQixRQUFBQSxhQUFZLFdBQVc7QUFJdkIsUUFBQUEsYUFBWSxVQUFVO0FBSXRCLFFBQUFBLGFBQVksVUFBVTtBQUFBLE1BQzFCLEdBQUcsZ0JBQWdCLFFBQVEsY0FBYyxjQUFjLENBQUMsRUFBRTtBQUMxRCxPQUFDLFNBQVVELFFBQU87QUFDZCxpQkFBUyxXQUFXLE9BQU87QUFDdkIsY0FBSSxDQUFDTCxJQUFHLE9BQU8sS0FBSyxHQUFHO0FBQ25CLG1CQUFPSyxPQUFNO0FBQUEsVUFDakI7QUFDQSxrQkFBUSxNQUFNLFlBQVk7QUFDMUIsa0JBQVEsT0FBTztBQUFBLFlBQ1gsS0FBSztBQUNELHFCQUFPQSxPQUFNO0FBQUEsWUFDakIsS0FBSztBQUNELHFCQUFPQSxPQUFNO0FBQUEsWUFDakIsS0FBSztBQUNELHFCQUFPQSxPQUFNO0FBQUEsWUFDakIsS0FBSztBQUNELHFCQUFPQSxPQUFNO0FBQUEsWUFDakI7QUFDSSxxQkFBT0EsT0FBTTtBQUFBLFVBQ3JCO0FBQUEsUUFDSjtBQUNBLFFBQUFBLE9BQU0sYUFBYTtBQUNuQixpQkFBUyxTQUFTLE9BQU87QUFDckIsa0JBQVEsT0FBTztBQUFBLFlBQ1gsS0FBS0EsT0FBTTtBQUNQLHFCQUFPO0FBQUEsWUFDWCxLQUFLQSxPQUFNO0FBQ1AscUJBQU87QUFBQSxZQUNYLEtBQUtBLE9BQU07QUFDUCxxQkFBTztBQUFBLFlBQ1gsS0FBS0EsT0FBTTtBQUNQLHFCQUFPO0FBQUEsWUFDWDtBQUNJLHFCQUFPO0FBQUEsVUFDZjtBQUFBLFFBQ0o7QUFDQSxRQUFBQSxPQUFNLFdBQVc7QUFBQSxNQUNyQixHQUFHLFVBQVUsUUFBUSxRQUFRLFFBQVEsQ0FBQyxFQUFFO0FBQ3hDLFVBQUk7QUFDSixPQUFDLFNBQVVFLGNBQWE7QUFDcEIsUUFBQUEsYUFBWSxNQUFNLElBQUk7QUFDdEIsUUFBQUEsYUFBWSxNQUFNLElBQUk7QUFBQSxNQUMxQixHQUFHLGdCQUFnQixRQUFRLGNBQWMsY0FBYyxDQUFDLEVBQUU7QUFDMUQsT0FBQyxTQUFVQSxjQUFhO0FBQ3BCLGlCQUFTLFdBQVcsT0FBTztBQUN2QixjQUFJLENBQUNQLElBQUcsT0FBTyxLQUFLLEdBQUc7QUFDbkIsbUJBQU9PLGFBQVk7QUFBQSxVQUN2QjtBQUNBLGtCQUFRLE1BQU0sWUFBWTtBQUMxQixjQUFJLFVBQVUsUUFBUTtBQUNsQixtQkFBT0EsYUFBWTtBQUFBLFVBQ3ZCLE9BQ0s7QUFDRCxtQkFBT0EsYUFBWTtBQUFBLFVBQ3ZCO0FBQUEsUUFDSjtBQUNBLFFBQUFBLGFBQVksYUFBYTtBQUFBLE1BQzdCLEdBQUcsZ0JBQWdCLFFBQVEsY0FBYyxjQUFjLENBQUMsRUFBRTtBQUMxRCxVQUFJO0FBQ0osT0FBQyxTQUFVQyx1QkFBc0I7QUFDN0IsUUFBQUEsc0JBQXFCLE9BQU8sSUFBSSxXQUFXLGlCQUFpQixZQUFZO0FBQUEsTUFDNUUsR0FBRyx5QkFBeUIsUUFBUSx1QkFBdUIsdUJBQXVCLENBQUMsRUFBRTtBQUNyRixVQUFJO0FBQ0osT0FBQyxTQUFVQyx1QkFBc0I7QUFDN0IsUUFBQUEsc0JBQXFCLE9BQU8sSUFBSSxXQUFXLGlCQUFpQixZQUFZO0FBQUEsTUFDNUUsR0FBRyx5QkFBeUIsUUFBUSx1QkFBdUIsdUJBQXVCLENBQUMsRUFBRTtBQUNyRixVQUFJO0FBQ0osT0FBQyxTQUFVQyxtQkFBa0I7QUFJekIsUUFBQUEsa0JBQWlCQSxrQkFBaUIsUUFBUSxJQUFJLENBQUMsSUFBSTtBQUluRCxRQUFBQSxrQkFBaUJBLGtCQUFpQixVQUFVLElBQUksQ0FBQyxJQUFJO0FBSXJELFFBQUFBLGtCQUFpQkEsa0JBQWlCLGtCQUFrQixJQUFJLENBQUMsSUFBSTtBQUFBLE1BQ2pFLEdBQUcscUJBQXFCLFFBQVEsbUJBQW1CLG1CQUFtQixDQUFDLEVBQUU7QUFDekUsVUFBTSxrQkFBTixNQUFNLHlCQUF3QixNQUFNO0FBQUEsUUFDaEMsWUFBWSxNQUFNLFNBQVM7QUFDdkIsZ0JBQU0sT0FBTztBQUNiLGVBQUssT0FBTztBQUNaLGlCQUFPLGVBQWUsTUFBTSxpQkFBZ0IsU0FBUztBQUFBLFFBQ3pEO0FBQUEsTUFDSjtBQUNBLGNBQVEsa0JBQWtCO0FBQzFCLFVBQUk7QUFDSixPQUFDLFNBQVVDLHFCQUFvQjtBQUMzQixpQkFBUyxHQUFHLE9BQU87QUFDZixnQkFBTSxZQUFZO0FBQ2xCLGlCQUFPLGFBQWFYLElBQUcsS0FBSyxVQUFVLGtCQUFrQjtBQUFBLFFBQzVEO0FBQ0EsUUFBQVcsb0JBQW1CLEtBQUs7QUFBQSxNQUM1QixHQUFHLHVCQUF1QixRQUFRLHFCQUFxQixxQkFBcUIsQ0FBQyxFQUFFO0FBQy9FLFVBQUk7QUFDSixPQUFDLFNBQVVDLGlDQUFnQztBQUN2QyxpQkFBUyxHQUFHLE9BQU87QUFDZixnQkFBTSxZQUFZO0FBQ2xCLGlCQUFPLGNBQWMsVUFBVSxTQUFTLFVBQWEsVUFBVSxTQUFTLFNBQVNaLElBQUcsS0FBSyxVQUFVLDZCQUE2QixNQUFNLFVBQVUsWUFBWSxVQUFhQSxJQUFHLEtBQUssVUFBVSxPQUFPO0FBQUEsUUFDdE07QUFDQSxRQUFBWSxnQ0FBK0IsS0FBSztBQUFBLE1BQ3hDLEdBQUcsbUNBQW1DLFFBQVEsaUNBQWlDLGlDQUFpQyxDQUFDLEVBQUU7QUFDbkgsVUFBSTtBQUNKLE9BQUMsU0FBVUMsc0NBQXFDO0FBQzVDLGlCQUFTLEdBQUcsT0FBTztBQUNmLGdCQUFNLFlBQVk7QUFDbEIsaUJBQU8sYUFBYSxVQUFVLFNBQVMsYUFBYWIsSUFBRyxLQUFLLFVBQVUsNkJBQTZCLE1BQU0sVUFBVSxZQUFZLFVBQWFBLElBQUcsS0FBSyxVQUFVLE9BQU87QUFBQSxRQUN6SztBQUNBLFFBQUFhLHFDQUFvQyxLQUFLO0FBQUEsTUFDN0MsR0FBRyx3Q0FBd0MsUUFBUSxzQ0FBc0Msc0NBQXNDLENBQUMsRUFBRTtBQUNsSSxVQUFJO0FBQ0osT0FBQyxTQUFVQywrQkFBOEI7QUFDckMsUUFBQUEsOEJBQTZCLFVBQVUsT0FBTyxPQUFPO0FBQUEsVUFDakQsOEJBQThCLEdBQUc7QUFDN0IsbUJBQU8sSUFBSSxlQUFlLHdCQUF3QjtBQUFBLFVBQ3REO0FBQUEsUUFDSixDQUFDO0FBQ0QsaUJBQVMsR0FBRyxPQUFPO0FBQ2YsaUJBQU8sK0JBQStCLEdBQUcsS0FBSyxLQUFLLG9DQUFvQyxHQUFHLEtBQUs7QUFBQSxRQUNuRztBQUNBLFFBQUFBLDhCQUE2QixLQUFLO0FBQUEsTUFDdEMsR0FBRyxpQ0FBaUMsUUFBUSwrQkFBK0IsK0JBQStCLENBQUMsRUFBRTtBQUM3RyxVQUFJO0FBQ0osT0FBQyxTQUFVQyw2QkFBNEI7QUFDbkMsUUFBQUEsNEJBQTJCLFVBQVUsT0FBTyxPQUFPO0FBQUEsVUFDL0MsaUJBQWlCLE1BQU0sSUFBSTtBQUN2QixtQkFBTyxLQUFLLGlCQUFpQixtQkFBbUIsTUFBTSxFQUFFLEdBQUcsQ0FBQztBQUFBLFVBQ2hFO0FBQUEsVUFDQSxRQUFRLEdBQUc7QUFBQSxVQUFFO0FBQUEsUUFDakIsQ0FBQztBQUNELGlCQUFTLEdBQUcsT0FBTztBQUNmLGdCQUFNLFlBQVk7QUFDbEIsaUJBQU8sYUFBYWYsSUFBRyxLQUFLLFVBQVUsZ0JBQWdCLEtBQUtBLElBQUcsS0FBSyxVQUFVLE9BQU87QUFBQSxRQUN4RjtBQUNBLFFBQUFlLDRCQUEyQixLQUFLO0FBQUEsTUFDcEMsR0FBRywrQkFBK0IsUUFBUSw2QkFBNkIsNkJBQTZCLENBQUMsRUFBRTtBQUN2RyxVQUFJO0FBQ0osT0FBQyxTQUFVQyx1QkFBc0I7QUFDN0IsUUFBQUEsc0JBQXFCLFVBQVUsT0FBTyxPQUFPO0FBQUEsVUFDekMsVUFBVSw2QkFBNkI7QUFBQSxVQUN2QyxRQUFRLDJCQUEyQjtBQUFBLFFBQ3ZDLENBQUM7QUFDRCxpQkFBUyxHQUFHLE9BQU87QUFDZixnQkFBTSxZQUFZO0FBQ2xCLGlCQUFPLGFBQWEsNkJBQTZCLEdBQUcsVUFBVSxRQUFRLEtBQUssMkJBQTJCLEdBQUcsVUFBVSxNQUFNO0FBQUEsUUFDN0g7QUFDQSxRQUFBQSxzQkFBcUIsS0FBSztBQUFBLE1BQzlCLEdBQUcseUJBQXlCLFFBQVEsdUJBQXVCLHVCQUF1QixDQUFDLEVBQUU7QUFDckYsVUFBSTtBQUNKLE9BQUMsU0FBVUMsa0JBQWlCO0FBQ3hCLGlCQUFTLEdBQUcsT0FBTztBQUNmLGdCQUFNLFlBQVk7QUFDbEIsaUJBQU8sYUFBYWpCLElBQUcsS0FBSyxVQUFVLGFBQWE7QUFBQSxRQUN2RDtBQUNBLFFBQUFpQixpQkFBZ0IsS0FBSztBQUFBLE1BQ3pCLEdBQUcsb0JBQW9CLFFBQVEsa0JBQWtCLGtCQUFrQixDQUFDLEVBQUU7QUFDdEUsVUFBSTtBQUNKLE9BQUMsU0FBVUMsb0JBQW1CO0FBQzFCLGlCQUFTLEdBQUcsT0FBTztBQUNmLGdCQUFNLFlBQVk7QUFDbEIsaUJBQU8sY0FBYyxxQkFBcUIsR0FBRyxVQUFVLG9CQUFvQixLQUFLLG1CQUFtQixHQUFHLFVBQVUsa0JBQWtCLEtBQUssZ0JBQWdCLEdBQUcsVUFBVSxlQUFlO0FBQUEsUUFDdkw7QUFDQSxRQUFBQSxtQkFBa0IsS0FBSztBQUFBLE1BQzNCLEdBQUcsc0JBQXNCLFFBQVEsb0JBQW9CLG9CQUFvQixDQUFDLEVBQUU7QUFDNUUsVUFBSTtBQUNKLE9BQUMsU0FBVUMsa0JBQWlCO0FBQ3hCLFFBQUFBLGlCQUFnQkEsaUJBQWdCLEtBQUssSUFBSSxDQUFDLElBQUk7QUFDOUMsUUFBQUEsaUJBQWdCQSxpQkFBZ0IsV0FBVyxJQUFJLENBQUMsSUFBSTtBQUNwRCxRQUFBQSxpQkFBZ0JBLGlCQUFnQixRQUFRLElBQUksQ0FBQyxJQUFJO0FBQ2pELFFBQUFBLGlCQUFnQkEsaUJBQWdCLFVBQVUsSUFBSSxDQUFDLElBQUk7QUFBQSxNQUN2RCxHQUFHLG9CQUFvQixrQkFBa0IsQ0FBQyxFQUFFO0FBQzVDLGVBQVNDLHlCQUF3QixlQUFlLGVBQWUsU0FBUyxTQUFTO0FBQzdFLGNBQU0sU0FBUyxZQUFZLFNBQVksVUFBVSxRQUFRO0FBQ3pELFlBQUksaUJBQWlCO0FBQ3JCLFlBQUksNkJBQTZCO0FBQ2pDLFlBQUksZ0NBQWdDO0FBQ3BDLGNBQU0sVUFBVTtBQUNoQixZQUFJLHFCQUFxQjtBQUN6QixjQUFNLGtCQUFrQixvQkFBSSxJQUFJO0FBQ2hDLFlBQUksMEJBQTBCO0FBQzlCLGNBQU0sdUJBQXVCLG9CQUFJLElBQUk7QUFDckMsY0FBTSxtQkFBbUIsb0JBQUksSUFBSTtBQUNqQyxZQUFJO0FBQ0osWUFBSSxlQUFlLElBQUksWUFBWSxVQUFVO0FBQzdDLFlBQUksbUJBQW1CLG9CQUFJLElBQUk7QUFDL0IsWUFBSSx3QkFBd0Isb0JBQUksSUFBSTtBQUNwQyxZQUFJLGdCQUFnQixvQkFBSSxJQUFJO0FBQzVCLFlBQUksUUFBUSxNQUFNO0FBQ2xCLFlBQUksY0FBYyxZQUFZO0FBQzlCLFlBQUk7QUFDSixZQUFJLFFBQVEsZ0JBQWdCO0FBQzVCLGNBQU0sZUFBZSxJQUFJLFNBQVMsUUFBUTtBQUMxQyxjQUFNLGVBQWUsSUFBSSxTQUFTLFFBQVE7QUFDMUMsY0FBTSwrQkFBK0IsSUFBSSxTQUFTLFFBQVE7QUFDMUQsY0FBTSwyQkFBMkIsSUFBSSxTQUFTLFFBQVE7QUFDdEQsY0FBTSxpQkFBaUIsSUFBSSxTQUFTLFFBQVE7QUFDNUMsY0FBTSx1QkFBd0IsV0FBVyxRQUFRLHVCQUF3QixRQUFRLHVCQUF1QixxQkFBcUI7QUFDN0gsaUJBQVMsc0JBQXNCLElBQUk7QUFDL0IsY0FBSSxPQUFPLE1BQU07QUFDYixrQkFBTSxJQUFJLE1BQU0sMEVBQTBFO0FBQUEsVUFDOUY7QUFDQSxpQkFBTyxTQUFTLEdBQUcsU0FBUztBQUFBLFFBQ2hDO0FBQ0EsaUJBQVMsdUJBQXVCLElBQUk7QUFDaEMsY0FBSSxPQUFPLE1BQU07QUFDYixtQkFBTyxrQkFBa0IsRUFBRSwrQkFBK0IsU0FBUztBQUFBLFVBQ3ZFLE9BQ0s7QUFDRCxtQkFBTyxTQUFTLEdBQUcsU0FBUztBQUFBLFVBQ2hDO0FBQUEsUUFDSjtBQUNBLGlCQUFTLDZCQUE2QjtBQUNsQyxpQkFBTyxVQUFVLEVBQUUsNEJBQTRCLFNBQVM7QUFBQSxRQUM1RDtBQUNBLGlCQUFTLGtCQUFrQixPQUFPLFNBQVM7QUFDdkMsY0FBSSxXQUFXLFFBQVEsVUFBVSxPQUFPLEdBQUc7QUFDdkMsa0JBQU0sSUFBSSxzQkFBc0IsUUFBUSxFQUFFLEdBQUcsT0FBTztBQUFBLFVBQ3hELFdBQ1MsV0FBVyxRQUFRLFdBQVcsT0FBTyxHQUFHO0FBQzdDLGtCQUFNLElBQUksdUJBQXVCLFFBQVEsRUFBRSxHQUFHLE9BQU87QUFBQSxVQUN6RCxPQUNLO0FBQ0Qsa0JBQU0sSUFBSSwyQkFBMkIsR0FBRyxPQUFPO0FBQUEsVUFDbkQ7QUFBQSxRQUNKO0FBQ0EsaUJBQVMsbUJBQW1CLFVBQVU7QUFDbEMsaUJBQU87QUFBQSxRQUNYO0FBQ0EsaUJBQVMsY0FBYztBQUNuQixpQkFBTyxVQUFVLGdCQUFnQjtBQUFBLFFBQ3JDO0FBQ0EsaUJBQVMsV0FBVztBQUNoQixpQkFBTyxVQUFVLGdCQUFnQjtBQUFBLFFBQ3JDO0FBQ0EsaUJBQVMsYUFBYTtBQUNsQixpQkFBTyxVQUFVLGdCQUFnQjtBQUFBLFFBQ3JDO0FBQ0EsaUJBQVMsZUFBZTtBQUNwQixjQUFJLFVBQVUsZ0JBQWdCLE9BQU8sVUFBVSxnQkFBZ0IsV0FBVztBQUN0RSxvQkFBUSxnQkFBZ0I7QUFDeEIseUJBQWEsS0FBSyxNQUFTO0FBQUEsVUFDL0I7QUFBQSxRQUVKO0FBQ0EsaUJBQVMsaUJBQWlCLE9BQU87QUFDN0IsdUJBQWEsS0FBSyxDQUFDLE9BQU8sUUFBVyxNQUFTLENBQUM7QUFBQSxRQUNuRDtBQUNBLGlCQUFTLGtCQUFrQixNQUFNO0FBQzdCLHVCQUFhLEtBQUssSUFBSTtBQUFBLFFBQzFCO0FBQ0Esc0JBQWMsUUFBUSxZQUFZO0FBQ2xDLHNCQUFjLFFBQVEsZ0JBQWdCO0FBQ3RDLHNCQUFjLFFBQVEsWUFBWTtBQUNsQyxzQkFBYyxRQUFRLGlCQUFpQjtBQUN2QyxpQkFBUyxzQkFBc0I7QUFDM0IsY0FBSSxTQUFTLGFBQWEsU0FBUyxHQUFHO0FBQ2xDO0FBQUEsVUFDSjtBQUNBLG1CQUFTLEdBQUcsTUFBTSxTQUFTLEVBQUUsTUFBTSxhQUFhLE1BQU07QUFDbEQsb0JBQVE7QUFDUixnQ0FBb0I7QUFBQSxVQUN4QixDQUFDO0FBQUEsUUFDTDtBQUNBLGlCQUFTLGNBQWMsU0FBUztBQUM1QixjQUFJLFdBQVcsUUFBUSxVQUFVLE9BQU8sR0FBRztBQUN2QywwQkFBYyxPQUFPO0FBQUEsVUFDekIsV0FDUyxXQUFXLFFBQVEsZUFBZSxPQUFPLEdBQUc7QUFDakQsK0JBQW1CLE9BQU87QUFBQSxVQUM5QixXQUNTLFdBQVcsUUFBUSxXQUFXLE9BQU8sR0FBRztBQUM3QywyQkFBZSxPQUFPO0FBQUEsVUFDMUIsT0FDSztBQUNELGlDQUFxQixPQUFPO0FBQUEsVUFDaEM7QUFBQSxRQUNKO0FBQ0EsaUJBQVMsc0JBQXNCO0FBQzNCLGNBQUksYUFBYSxTQUFTLEdBQUc7QUFDekI7QUFBQSxVQUNKO0FBQ0EsZ0JBQU0sVUFBVSxhQUFhLE1BQU07QUFDbkMsY0FBSTtBQUNBLGtCQUFNLGtCQUFrQixTQUFTO0FBQ2pDLGdCQUFJLGdCQUFnQixHQUFHLGVBQWUsR0FBRztBQUNyQyw4QkFBZ0IsY0FBYyxTQUFTLGFBQWE7QUFBQSxZQUN4RCxPQUNLO0FBQ0QsNEJBQWMsT0FBTztBQUFBLFlBQ3pCO0FBQUEsVUFDSixVQUNBO0FBQ0ksZ0NBQW9CO0FBQUEsVUFDeEI7QUFBQSxRQUNKO0FBQ0EsY0FBTSxXQUFXLENBQUMsWUFBWTtBQUMxQixjQUFJO0FBR0EsZ0JBQUksV0FBVyxRQUFRLGVBQWUsT0FBTyxLQUFLLFFBQVEsV0FBVyxtQkFBbUIsS0FBSyxRQUFRO0FBQ2pHLG9CQUFNLFdBQVcsUUFBUSxPQUFPO0FBQ2hDLG9CQUFNLE1BQU0sc0JBQXNCLFFBQVE7QUFDMUMsb0JBQU0sV0FBVyxhQUFhLElBQUksR0FBRztBQUNyQyxrQkFBSSxXQUFXLFFBQVEsVUFBVSxRQUFRLEdBQUc7QUFDeEMsc0JBQU0sV0FBVyxTQUFTO0FBQzFCLHNCQUFNLFdBQVksWUFBWSxTQUFTLHFCQUFzQixTQUFTLG1CQUFtQixVQUFVLGtCQUFrQixJQUFJLG1CQUFtQixRQUFRO0FBQ3BKLG9CQUFJLGFBQWEsU0FBUyxVQUFVLFVBQWEsU0FBUyxXQUFXLFNBQVk7QUFDN0UsK0JBQWEsT0FBTyxHQUFHO0FBQ3ZCLGdDQUFjLE9BQU8sUUFBUTtBQUM3QiwyQkFBUyxLQUFLLFNBQVM7QUFDdkIsdUNBQXFCLFVBQVUsUUFBUSxRQUFRLEtBQUssSUFBSSxDQUFDO0FBQ3pELGdDQUFjLE1BQU0sUUFBUSxFQUFFLE1BQU0sTUFBTSxPQUFPLE1BQU0sK0NBQStDLENBQUM7QUFDdkc7QUFBQSxnQkFDSjtBQUFBLGNBQ0o7QUFDQSxvQkFBTSxvQkFBb0IsY0FBYyxJQUFJLFFBQVE7QUFFcEQsa0JBQUksc0JBQXNCLFFBQVc7QUFDakMsa0NBQWtCLE9BQU87QUFDekIsMENBQTBCLE9BQU87QUFDakM7QUFBQSxjQUNKLE9BQ0s7QUFHRCxzQ0FBc0IsSUFBSSxRQUFRO0FBQUEsY0FDdEM7QUFBQSxZQUNKO0FBQ0EsOEJBQWtCLGNBQWMsT0FBTztBQUFBLFVBQzNDLFVBQ0E7QUFDSSxnQ0FBb0I7QUFBQSxVQUN4QjtBQUFBLFFBQ0o7QUFDQSxpQkFBUyxjQUFjLGdCQUFnQjtBQUNuQyxjQUFJLFdBQVcsR0FBRztBQUdkO0FBQUEsVUFDSjtBQUNBLG1CQUFTLE1BQU0sZUFBZSxRQUFRQyxZQUFXO0FBQzdDLGtCQUFNLFVBQVU7QUFBQSxjQUNaLFNBQVM7QUFBQSxjQUNULElBQUksZUFBZTtBQUFBLFlBQ3ZCO0FBQ0EsZ0JBQUkseUJBQXlCLFdBQVcsZUFBZTtBQUNuRCxzQkFBUSxRQUFRLGNBQWMsT0FBTztBQUFBLFlBQ3pDLE9BQ0s7QUFDRCxzQkFBUSxTQUFTLGtCQUFrQixTQUFZLE9BQU87QUFBQSxZQUMxRDtBQUNBLGlDQUFxQixTQUFTLFFBQVFBLFVBQVM7QUFDL0MsMEJBQWMsTUFBTSxPQUFPLEVBQUUsTUFBTSxNQUFNLE9BQU8sTUFBTSwwQkFBMEIsQ0FBQztBQUFBLFVBQ3JGO0FBQ0EsbUJBQVMsV0FBVyxPQUFPLFFBQVFBLFlBQVc7QUFDMUMsa0JBQU0sVUFBVTtBQUFBLGNBQ1osU0FBUztBQUFBLGNBQ1QsSUFBSSxlQUFlO0FBQUEsY0FDbkIsT0FBTyxNQUFNLE9BQU87QUFBQSxZQUN4QjtBQUNBLGlDQUFxQixTQUFTLFFBQVFBLFVBQVM7QUFDL0MsMEJBQWMsTUFBTSxPQUFPLEVBQUUsTUFBTSxNQUFNLE9BQU8sTUFBTSwwQkFBMEIsQ0FBQztBQUFBLFVBQ3JGO0FBQ0EsbUJBQVMsYUFBYSxRQUFRLFFBQVFBLFlBQVc7QUFHN0MsZ0JBQUksV0FBVyxRQUFXO0FBQ3RCLHVCQUFTO0FBQUEsWUFDYjtBQUNBLGtCQUFNLFVBQVU7QUFBQSxjQUNaLFNBQVM7QUFBQSxjQUNULElBQUksZUFBZTtBQUFBLGNBQ25CO0FBQUEsWUFDSjtBQUNBLGlDQUFxQixTQUFTLFFBQVFBLFVBQVM7QUFDL0MsMEJBQWMsTUFBTSxPQUFPLEVBQUUsTUFBTSxNQUFNLE9BQU8sTUFBTSwwQkFBMEIsQ0FBQztBQUFBLFVBQ3JGO0FBQ0EsK0JBQXFCLGNBQWM7QUFDbkMsZ0JBQU0sVUFBVSxnQkFBZ0IsSUFBSSxlQUFlLE1BQU07QUFDekQsY0FBSTtBQUNKLGNBQUk7QUFDSixjQUFJLFNBQVM7QUFDVCxtQkFBTyxRQUFRO0FBQ2YsNkJBQWlCLFFBQVE7QUFBQSxVQUM3QjtBQUNBLGdCQUFNLFlBQVksS0FBSyxJQUFJO0FBQzNCLGNBQUksa0JBQWtCLG9CQUFvQjtBQUN0QyxrQkFBTSxXQUFXLGVBQWUsTUFBTSxPQUFPLEtBQUssSUFBSSxDQUFDO0FBQ3ZELGtCQUFNLHFCQUFxQiwrQkFBK0IsR0FBRyxxQkFBcUIsUUFBUSxJQUNwRixxQkFBcUIsU0FBUyw4QkFBOEIsUUFBUSxJQUNwRSxxQkFBcUIsU0FBUyw4QkFBOEIsY0FBYztBQUNoRixnQkFBSSxlQUFlLE9BQU8sUUFBUSxzQkFBc0IsSUFBSSxlQUFlLEVBQUUsR0FBRztBQUM1RSxpQ0FBbUIsT0FBTztBQUFBLFlBQzlCO0FBQ0EsZ0JBQUksZUFBZSxPQUFPLE1BQU07QUFDNUIsNEJBQWMsSUFBSSxVQUFVLGtCQUFrQjtBQUFBLFlBQ2xEO0FBQ0EsZ0JBQUk7QUFDQSxrQkFBSTtBQUNKLGtCQUFJLGdCQUFnQjtBQUNoQixvQkFBSSxlQUFlLFdBQVcsUUFBVztBQUNyQyxzQkFBSSxTQUFTLFVBQWEsS0FBSyxtQkFBbUIsR0FBRztBQUNqRCwrQkFBVyxJQUFJLFdBQVcsY0FBYyxXQUFXLFdBQVcsZUFBZSxXQUFXLGVBQWUsTUFBTSxZQUFZLEtBQUssY0FBYyw0QkFBNEIsR0FBRyxlQUFlLFFBQVEsU0FBUztBQUMzTTtBQUFBLGtCQUNKO0FBQ0Esa0NBQWdCLGVBQWUsbUJBQW1CLEtBQUs7QUFBQSxnQkFDM0QsV0FDUyxNQUFNLFFBQVEsZUFBZSxNQUFNLEdBQUc7QUFDM0Msc0JBQUksU0FBUyxVQUFhLEtBQUssd0JBQXdCLFdBQVcsb0JBQW9CLFFBQVE7QUFDMUYsK0JBQVcsSUFBSSxXQUFXLGNBQWMsV0FBVyxXQUFXLGVBQWUsV0FBVyxlQUFlLE1BQU0saUVBQWlFLEdBQUcsZUFBZSxRQUFRLFNBQVM7QUFDak47QUFBQSxrQkFDSjtBQUNBLGtDQUFnQixlQUFlLEdBQUcsZUFBZSxRQUFRLG1CQUFtQixLQUFLO0FBQUEsZ0JBQ3JGLE9BQ0s7QUFDRCxzQkFBSSxTQUFTLFVBQWEsS0FBSyx3QkFBd0IsV0FBVyxvQkFBb0IsWUFBWTtBQUM5RiwrQkFBVyxJQUFJLFdBQVcsY0FBYyxXQUFXLFdBQVcsZUFBZSxXQUFXLGVBQWUsTUFBTSxpRUFBaUUsR0FBRyxlQUFlLFFBQVEsU0FBUztBQUNqTjtBQUFBLGtCQUNKO0FBQ0Esa0NBQWdCLGVBQWUsZUFBZSxRQUFRLG1CQUFtQixLQUFLO0FBQUEsZ0JBQ2xGO0FBQUEsY0FDSixXQUNTLG9CQUFvQjtBQUN6QixnQ0FBZ0IsbUJBQW1CLGVBQWUsUUFBUSxlQUFlLFFBQVEsbUJBQW1CLEtBQUs7QUFBQSxjQUM3RztBQUNBLG9CQUFNLFVBQVU7QUFDaEIsa0JBQUksQ0FBQyxlQUFlO0FBQ2hCLDhCQUFjLE9BQU8sUUFBUTtBQUM3Qiw2QkFBYSxlQUFlLGVBQWUsUUFBUSxTQUFTO0FBQUEsY0FDaEUsV0FDUyxRQUFRLE1BQU07QUFDbkIsd0JBQVEsS0FBSyxDQUFDLGtCQUFrQjtBQUM1QixnQ0FBYyxPQUFPLFFBQVE7QUFDN0Isd0JBQU0sZUFBZSxlQUFlLFFBQVEsU0FBUztBQUFBLGdCQUN6RCxHQUFHLFdBQVM7QUFDUixnQ0FBYyxPQUFPLFFBQVE7QUFDN0Isc0JBQUksaUJBQWlCLFdBQVcsZUFBZTtBQUMzQywrQkFBVyxPQUFPLGVBQWUsUUFBUSxTQUFTO0FBQUEsa0JBQ3RELFdBQ1MsU0FBU3JCLElBQUcsT0FBTyxNQUFNLE9BQU8sR0FBRztBQUN4QywrQkFBVyxJQUFJLFdBQVcsY0FBYyxXQUFXLFdBQVcsZUFBZSxXQUFXLGVBQWUsTUFBTSx5QkFBeUIsTUFBTSxPQUFPLEVBQUUsR0FBRyxlQUFlLFFBQVEsU0FBUztBQUFBLGtCQUM1TCxPQUNLO0FBQ0QsK0JBQVcsSUFBSSxXQUFXLGNBQWMsV0FBVyxXQUFXLGVBQWUsV0FBVyxlQUFlLE1BQU0scURBQXFELEdBQUcsZUFBZSxRQUFRLFNBQVM7QUFBQSxrQkFDek07QUFBQSxnQkFDSixDQUFDO0FBQUEsY0FDTCxPQUNLO0FBQ0QsOEJBQWMsT0FBTyxRQUFRO0FBQzdCLHNCQUFNLGVBQWUsZUFBZSxRQUFRLFNBQVM7QUFBQSxjQUN6RDtBQUFBLFlBQ0osU0FDTyxPQUFPO0FBQ1YsNEJBQWMsT0FBTyxRQUFRO0FBQzdCLGtCQUFJLGlCQUFpQixXQUFXLGVBQWU7QUFDM0Msc0JBQU0sT0FBTyxlQUFlLFFBQVEsU0FBUztBQUFBLGNBQ2pELFdBQ1MsU0FBU0EsSUFBRyxPQUFPLE1BQU0sT0FBTyxHQUFHO0FBQ3hDLDJCQUFXLElBQUksV0FBVyxjQUFjLFdBQVcsV0FBVyxlQUFlLFdBQVcsZUFBZSxNQUFNLHlCQUF5QixNQUFNLE9BQU8sRUFBRSxHQUFHLGVBQWUsUUFBUSxTQUFTO0FBQUEsY0FDNUwsT0FDSztBQUNELDJCQUFXLElBQUksV0FBVyxjQUFjLFdBQVcsV0FBVyxlQUFlLFdBQVcsZUFBZSxNQUFNLHFEQUFxRCxHQUFHLGVBQWUsUUFBUSxTQUFTO0FBQUEsY0FDek07QUFBQSxZQUNKO0FBQUEsVUFDSixPQUNLO0FBQ0QsdUJBQVcsSUFBSSxXQUFXLGNBQWMsV0FBVyxXQUFXLGdCQUFnQixvQkFBb0IsZUFBZSxNQUFNLEVBQUUsR0FBRyxlQUFlLFFBQVEsU0FBUztBQUFBLFVBQ2hLO0FBQUEsUUFDSjtBQUNBLGlCQUFTLGVBQWUsaUJBQWlCO0FBQ3JDLGNBQUksV0FBVyxHQUFHO0FBRWQ7QUFBQSxVQUNKO0FBQ0EsY0FBSSxnQkFBZ0IsT0FBTyxNQUFNO0FBQzdCLGdCQUFJLGdCQUFnQixPQUFPO0FBQ3ZCLHFCQUFPLE1BQU07QUFBQSxFQUFxRCxLQUFLLFVBQVUsZ0JBQWdCLE9BQU8sUUFBVyxDQUFDLENBQUMsRUFBRTtBQUFBLFlBQzNILE9BQ0s7QUFDRCxxQkFBTyxNQUFNLDhFQUE4RTtBQUFBLFlBQy9GO0FBQUEsVUFDSixPQUNLO0FBQ0Qsa0JBQU0sTUFBTSxnQkFBZ0I7QUFDNUIsa0JBQU0sa0JBQWtCLGlCQUFpQixJQUFJLEdBQUc7QUFDaEQsa0NBQXNCLGlCQUFpQixlQUFlO0FBQ3RELGdCQUFJLG9CQUFvQixRQUFXO0FBQy9CLCtCQUFpQixPQUFPLEdBQUc7QUFDM0Isa0JBQUk7QUFDQSxvQkFBSSxnQkFBZ0IsT0FBTztBQUN2Qix3QkFBTSxRQUFRLGdCQUFnQjtBQUM5QixrQ0FBZ0IsT0FBTyxJQUFJLFdBQVcsY0FBYyxNQUFNLE1BQU0sTUFBTSxTQUFTLE1BQU0sSUFBSSxDQUFDO0FBQUEsZ0JBQzlGLFdBQ1MsZ0JBQWdCLFdBQVcsUUFBVztBQUMzQyxrQ0FBZ0IsUUFBUSxnQkFBZ0IsTUFBTTtBQUFBLGdCQUNsRCxPQUNLO0FBQ0Qsd0JBQU0sSUFBSSxNQUFNLHNCQUFzQjtBQUFBLGdCQUMxQztBQUFBLGNBQ0osU0FDTyxPQUFPO0FBQ1Ysb0JBQUksTUFBTSxTQUFTO0FBQ2YseUJBQU8sTUFBTSxxQkFBcUIsZ0JBQWdCLE1BQU0sMEJBQTBCLE1BQU0sT0FBTyxFQUFFO0FBQUEsZ0JBQ3JHLE9BQ0s7QUFDRCx5QkFBTyxNQUFNLHFCQUFxQixnQkFBZ0IsTUFBTSx3QkFBd0I7QUFBQSxnQkFDcEY7QUFBQSxjQUNKO0FBQUEsWUFDSjtBQUFBLFVBQ0o7QUFBQSxRQUNKO0FBQ0EsaUJBQVMsbUJBQW1CLFNBQVM7QUFDakMsY0FBSSxXQUFXLEdBQUc7QUFFZDtBQUFBLFVBQ0o7QUFDQSxjQUFJLE9BQU87QUFDWCxjQUFJO0FBQ0osY0FBSSxRQUFRLFdBQVcsbUJBQW1CLEtBQUssUUFBUTtBQUNuRCxrQkFBTSxXQUFXLFFBQVEsT0FBTztBQUNoQyxrQ0FBc0IsT0FBTyxRQUFRO0FBQ3JDLHNDQUEwQixPQUFPO0FBQ2pDO0FBQUEsVUFDSixPQUNLO0FBQ0Qsa0JBQU0sVUFBVSxxQkFBcUIsSUFBSSxRQUFRLE1BQU07QUFDdkQsZ0JBQUksU0FBUztBQUNULG9DQUFzQixRQUFRO0FBQzlCLHFCQUFPLFFBQVE7QUFBQSxZQUNuQjtBQUFBLFVBQ0o7QUFDQSxjQUFJLHVCQUF1Qix5QkFBeUI7QUFDaEQsZ0JBQUk7QUFDQSx3Q0FBMEIsT0FBTztBQUNqQyxrQkFBSSxxQkFBcUI7QUFDckIsb0JBQUksUUFBUSxXQUFXLFFBQVc7QUFDOUIsc0JBQUksU0FBUyxRQUFXO0FBQ3BCLHdCQUFJLEtBQUssbUJBQW1CLEtBQUssS0FBSyx3QkFBd0IsV0FBVyxvQkFBb0IsUUFBUTtBQUNqRyw2QkFBTyxNQUFNLGdCQUFnQixRQUFRLE1BQU0sWUFBWSxLQUFLLGNBQWMsNEJBQTRCO0FBQUEsb0JBQzFHO0FBQUEsa0JBQ0o7QUFDQSxzQ0FBb0I7QUFBQSxnQkFDeEIsV0FDUyxNQUFNLFFBQVEsUUFBUSxNQUFNLEdBQUc7QUFHcEMsd0JBQU0sU0FBUyxRQUFRO0FBQ3ZCLHNCQUFJLFFBQVEsV0FBVyxxQkFBcUIsS0FBSyxVQUFVLE9BQU8sV0FBVyxLQUFLLGNBQWMsR0FBRyxPQUFPLENBQUMsQ0FBQyxHQUFHO0FBQzNHLHdDQUFvQixFQUFFLE9BQU8sT0FBTyxDQUFDLEdBQUcsT0FBTyxPQUFPLENBQUMsRUFBRSxDQUFDO0FBQUEsa0JBQzlELE9BQ0s7QUFDRCx3QkFBSSxTQUFTLFFBQVc7QUFDcEIsMEJBQUksS0FBSyx3QkFBd0IsV0FBVyxvQkFBb0IsUUFBUTtBQUNwRSwrQkFBTyxNQUFNLGdCQUFnQixRQUFRLE1BQU0saUVBQWlFO0FBQUEsc0JBQ2hIO0FBQ0EsMEJBQUksS0FBSyxtQkFBbUIsUUFBUSxPQUFPLFFBQVE7QUFDL0MsK0JBQU8sTUFBTSxnQkFBZ0IsUUFBUSxNQUFNLFlBQVksS0FBSyxjQUFjLHdCQUF3QixPQUFPLE1BQU0sWUFBWTtBQUFBLHNCQUMvSDtBQUFBLG9CQUNKO0FBQ0Esd0NBQW9CLEdBQUcsTUFBTTtBQUFBLGtCQUNqQztBQUFBLGdCQUNKLE9BQ0s7QUFDRCxzQkFBSSxTQUFTLFVBQWEsS0FBSyx3QkFBd0IsV0FBVyxvQkFBb0IsWUFBWTtBQUM5RiwyQkFBTyxNQUFNLGdCQUFnQixRQUFRLE1BQU0saUVBQWlFO0FBQUEsa0JBQ2hIO0FBQ0Esc0NBQW9CLFFBQVEsTUFBTTtBQUFBLGdCQUN0QztBQUFBLGNBQ0osV0FDUyx5QkFBeUI7QUFDOUIsd0NBQXdCLFFBQVEsUUFBUSxRQUFRLE1BQU07QUFBQSxjQUMxRDtBQUFBLFlBQ0osU0FDTyxPQUFPO0FBQ1Ysa0JBQUksTUFBTSxTQUFTO0FBQ2YsdUJBQU8sTUFBTSx5QkFBeUIsUUFBUSxNQUFNLDBCQUEwQixNQUFNLE9BQU8sRUFBRTtBQUFBLGNBQ2pHLE9BQ0s7QUFDRCx1QkFBTyxNQUFNLHlCQUF5QixRQUFRLE1BQU0sd0JBQXdCO0FBQUEsY0FDaEY7QUFBQSxZQUNKO0FBQUEsVUFDSixPQUNLO0FBQ0QseUNBQTZCLEtBQUssT0FBTztBQUFBLFVBQzdDO0FBQUEsUUFDSjtBQUNBLGlCQUFTLHFCQUFxQixTQUFTO0FBQ25DLGNBQUksQ0FBQyxTQUFTO0FBQ1YsbUJBQU8sTUFBTSx5QkFBeUI7QUFDdEM7QUFBQSxVQUNKO0FBQ0EsaUJBQU8sTUFBTTtBQUFBLEVBQTZFLEtBQUssVUFBVSxTQUFTLE1BQU0sQ0FBQyxDQUFDLEVBQUU7QUFFNUgsZ0JBQU0sa0JBQWtCO0FBQ3hCLGNBQUlBLElBQUcsT0FBTyxnQkFBZ0IsRUFBRSxLQUFLQSxJQUFHLE9BQU8sZ0JBQWdCLEVBQUUsR0FBRztBQUNoRSxrQkFBTSxNQUFNLGdCQUFnQjtBQUM1QixrQkFBTSxrQkFBa0IsaUJBQWlCLElBQUksR0FBRztBQUNoRCxnQkFBSSxpQkFBaUI7QUFDakIsOEJBQWdCLE9BQU8sSUFBSSxNQUFNLG1FQUFtRSxDQUFDO0FBQUEsWUFDekc7QUFBQSxVQUNKO0FBQUEsUUFDSjtBQUNBLGlCQUFTLGVBQWUsUUFBUTtBQUM1QixjQUFJLFdBQVcsVUFBYSxXQUFXLE1BQU07QUFDekMsbUJBQU87QUFBQSxVQUNYO0FBQ0Esa0JBQVEsT0FBTztBQUFBLFlBQ1gsS0FBSyxNQUFNO0FBQ1AscUJBQU8sS0FBSyxVQUFVLFFBQVEsTUFBTSxDQUFDO0FBQUEsWUFDekMsS0FBSyxNQUFNO0FBQ1AscUJBQU8sS0FBSyxVQUFVLE1BQU07QUFBQSxZQUNoQztBQUNJLHFCQUFPO0FBQUEsVUFDZjtBQUFBLFFBQ0o7QUFDQSxpQkFBUyxvQkFBb0IsU0FBUztBQUNsQyxjQUFJLFVBQVUsTUFBTSxPQUFPLENBQUMsUUFBUTtBQUNoQztBQUFBLFVBQ0o7QUFDQSxjQUFJLGdCQUFnQixZQUFZLE1BQU07QUFDbEMsZ0JBQUksT0FBTztBQUNYLGlCQUFLLFVBQVUsTUFBTSxXQUFXLFVBQVUsTUFBTSxZQUFZLFFBQVEsUUFBUTtBQUN4RSxxQkFBTyxXQUFXLGVBQWUsUUFBUSxNQUFNLENBQUM7QUFBQTtBQUFBO0FBQUEsWUFDcEQ7QUFDQSxtQkFBTyxJQUFJLG9CQUFvQixRQUFRLE1BQU0sT0FBTyxRQUFRLEVBQUUsT0FBTyxJQUFJO0FBQUEsVUFDN0UsT0FDSztBQUNELDBCQUFjLGdCQUFnQixPQUFPO0FBQUEsVUFDekM7QUFBQSxRQUNKO0FBQ0EsaUJBQVMseUJBQXlCLFNBQVM7QUFDdkMsY0FBSSxVQUFVLE1BQU0sT0FBTyxDQUFDLFFBQVE7QUFDaEM7QUFBQSxVQUNKO0FBQ0EsY0FBSSxnQkFBZ0IsWUFBWSxNQUFNO0FBQ2xDLGdCQUFJLE9BQU87QUFDWCxnQkFBSSxVQUFVLE1BQU0sV0FBVyxVQUFVLE1BQU0sU0FBUztBQUNwRCxrQkFBSSxRQUFRLFFBQVE7QUFDaEIsdUJBQU8sV0FBVyxlQUFlLFFBQVEsTUFBTSxDQUFDO0FBQUE7QUFBQTtBQUFBLGNBQ3BELE9BQ0s7QUFDRCx1QkFBTztBQUFBLGNBQ1g7QUFBQSxZQUNKO0FBQ0EsbUJBQU8sSUFBSSx5QkFBeUIsUUFBUSxNQUFNLE1BQU0sSUFBSTtBQUFBLFVBQ2hFLE9BQ0s7QUFDRCwwQkFBYyxxQkFBcUIsT0FBTztBQUFBLFVBQzlDO0FBQUEsUUFDSjtBQUNBLGlCQUFTLHFCQUFxQixTQUFTLFFBQVEsV0FBVztBQUN0RCxjQUFJLFVBQVUsTUFBTSxPQUFPLENBQUMsUUFBUTtBQUNoQztBQUFBLFVBQ0o7QUFDQSxjQUFJLGdCQUFnQixZQUFZLE1BQU07QUFDbEMsZ0JBQUksT0FBTztBQUNYLGdCQUFJLFVBQVUsTUFBTSxXQUFXLFVBQVUsTUFBTSxTQUFTO0FBQ3BELGtCQUFJLFFBQVEsU0FBUyxRQUFRLE1BQU0sTUFBTTtBQUNyQyx1QkFBTyxlQUFlLGVBQWUsUUFBUSxNQUFNLElBQUksQ0FBQztBQUFBO0FBQUE7QUFBQSxjQUM1RCxPQUNLO0FBQ0Qsb0JBQUksUUFBUSxRQUFRO0FBQ2hCLHlCQUFPLFdBQVcsZUFBZSxRQUFRLE1BQU0sQ0FBQztBQUFBO0FBQUE7QUFBQSxnQkFDcEQsV0FDUyxRQUFRLFVBQVUsUUFBVztBQUNsQyx5QkFBTztBQUFBLGdCQUNYO0FBQUEsY0FDSjtBQUFBLFlBQ0o7QUFDQSxtQkFBTyxJQUFJLHFCQUFxQixNQUFNLE9BQU8sUUFBUSxFQUFFLCtCQUErQixLQUFLLElBQUksSUFBSSxTQUFTLE1BQU0sSUFBSTtBQUFBLFVBQzFILE9BQ0s7QUFDRCwwQkFBYyxpQkFBaUIsT0FBTztBQUFBLFVBQzFDO0FBQUEsUUFDSjtBQUNBLGlCQUFTLHFCQUFxQixTQUFTO0FBQ25DLGNBQUksVUFBVSxNQUFNLE9BQU8sQ0FBQyxRQUFRO0FBQ2hDO0FBQUEsVUFDSjtBQUNBLGNBQUksZ0JBQWdCLFlBQVksTUFBTTtBQUNsQyxnQkFBSSxPQUFPO0FBQ1gsaUJBQUssVUFBVSxNQUFNLFdBQVcsVUFBVSxNQUFNLFlBQVksUUFBUSxRQUFRO0FBQ3hFLHFCQUFPLFdBQVcsZUFBZSxRQUFRLE1BQU0sQ0FBQztBQUFBO0FBQUE7QUFBQSxZQUNwRDtBQUNBLG1CQUFPLElBQUkscUJBQXFCLFFBQVEsTUFBTSxPQUFPLFFBQVEsRUFBRSxPQUFPLElBQUk7QUFBQSxVQUM5RSxPQUNLO0FBQ0QsMEJBQWMsbUJBQW1CLE9BQU87QUFBQSxVQUM1QztBQUFBLFFBQ0o7QUFDQSxpQkFBUywwQkFBMEIsU0FBUztBQUN4QyxjQUFJLFVBQVUsTUFBTSxPQUFPLENBQUMsVUFBVSxRQUFRLFdBQVcscUJBQXFCLEtBQUssUUFBUTtBQUN2RjtBQUFBLFVBQ0o7QUFDQSxjQUFJLGdCQUFnQixZQUFZLE1BQU07QUFDbEMsZ0JBQUksT0FBTztBQUNYLGdCQUFJLFVBQVUsTUFBTSxXQUFXLFVBQVUsTUFBTSxTQUFTO0FBQ3BELGtCQUFJLFFBQVEsUUFBUTtBQUNoQix1QkFBTyxXQUFXLGVBQWUsUUFBUSxNQUFNLENBQUM7QUFBQTtBQUFBO0FBQUEsY0FDcEQsT0FDSztBQUNELHVCQUFPO0FBQUEsY0FDWDtBQUFBLFlBQ0o7QUFDQSxtQkFBTyxJQUFJLDBCQUEwQixRQUFRLE1BQU0sTUFBTSxJQUFJO0FBQUEsVUFDakUsT0FDSztBQUNELDBCQUFjLHdCQUF3QixPQUFPO0FBQUEsVUFDakQ7QUFBQSxRQUNKO0FBQ0EsaUJBQVMsc0JBQXNCLFNBQVMsaUJBQWlCO0FBQ3JELGNBQUksVUFBVSxNQUFNLE9BQU8sQ0FBQyxRQUFRO0FBQ2hDO0FBQUEsVUFDSjtBQUNBLGNBQUksZ0JBQWdCLFlBQVksTUFBTTtBQUNsQyxnQkFBSSxPQUFPO0FBQ1gsZ0JBQUksVUFBVSxNQUFNLFdBQVcsVUFBVSxNQUFNLFNBQVM7QUFDcEQsa0JBQUksUUFBUSxTQUFTLFFBQVEsTUFBTSxNQUFNO0FBQ3JDLHVCQUFPLGVBQWUsZUFBZSxRQUFRLE1BQU0sSUFBSSxDQUFDO0FBQUE7QUFBQTtBQUFBLGNBQzVELE9BQ0s7QUFDRCxvQkFBSSxRQUFRLFFBQVE7QUFDaEIseUJBQU8sV0FBVyxlQUFlLFFBQVEsTUFBTSxDQUFDO0FBQUE7QUFBQTtBQUFBLGdCQUNwRCxXQUNTLFFBQVEsVUFBVSxRQUFXO0FBQ2xDLHlCQUFPO0FBQUEsZ0JBQ1g7QUFBQSxjQUNKO0FBQUEsWUFDSjtBQUNBLGdCQUFJLGlCQUFpQjtBQUNqQixvQkFBTSxRQUFRLFFBQVEsUUFBUSxvQkFBb0IsUUFBUSxNQUFNLE9BQU8sS0FBSyxRQUFRLE1BQU0sSUFBSSxPQUFPO0FBQ3JHLHFCQUFPLElBQUksc0JBQXNCLGdCQUFnQixNQUFNLE9BQU8sUUFBUSxFQUFFLFNBQVMsS0FBSyxJQUFJLElBQUksZ0JBQWdCLFVBQVUsTUFBTSxLQUFLLElBQUksSUFBSTtBQUFBLFlBQy9JLE9BQ0s7QUFDRCxxQkFBTyxJQUFJLHFCQUFxQixRQUFRLEVBQUUscUNBQXFDLElBQUk7QUFBQSxZQUN2RjtBQUFBLFVBQ0osT0FDSztBQUNELDBCQUFjLG9CQUFvQixPQUFPO0FBQUEsVUFDN0M7QUFBQSxRQUNKO0FBQ0EsaUJBQVMsY0FBYyxNQUFNLFNBQVM7QUFDbEMsY0FBSSxDQUFDLFVBQVUsVUFBVSxNQUFNLEtBQUs7QUFDaEM7QUFBQSxVQUNKO0FBQ0EsZ0JBQU0sYUFBYTtBQUFBLFlBQ2YsY0FBYztBQUFBLFlBQ2Q7QUFBQSxZQUNBO0FBQUEsWUFDQSxXQUFXLEtBQUssSUFBSTtBQUFBLFVBQ3hCO0FBQ0EsaUJBQU8sSUFBSSxVQUFVO0FBQUEsUUFDekI7QUFDQSxpQkFBUywwQkFBMEI7QUFDL0IsY0FBSSxTQUFTLEdBQUc7QUFDWixrQkFBTSxJQUFJLGdCQUFnQixpQkFBaUIsUUFBUSx1QkFBdUI7QUFBQSxVQUM5RTtBQUNBLGNBQUksV0FBVyxHQUFHO0FBQ2Qsa0JBQU0sSUFBSSxnQkFBZ0IsaUJBQWlCLFVBQVUseUJBQXlCO0FBQUEsVUFDbEY7QUFBQSxRQUNKO0FBQ0EsaUJBQVMsbUJBQW1CO0FBQ3hCLGNBQUksWUFBWSxHQUFHO0FBQ2Ysa0JBQU0sSUFBSSxnQkFBZ0IsaUJBQWlCLGtCQUFrQixpQ0FBaUM7QUFBQSxVQUNsRztBQUFBLFFBQ0o7QUFDQSxpQkFBUyxzQkFBc0I7QUFDM0IsY0FBSSxDQUFDLFlBQVksR0FBRztBQUNoQixrQkFBTSxJQUFJLE1BQU0sc0JBQXNCO0FBQUEsVUFDMUM7QUFBQSxRQUNKO0FBQ0EsaUJBQVMsZ0JBQWdCLE9BQU87QUFDNUIsY0FBSSxVQUFVLFFBQVc7QUFDckIsbUJBQU87QUFBQSxVQUNYLE9BQ0s7QUFDRCxtQkFBTztBQUFBLFVBQ1g7QUFBQSxRQUNKO0FBQ0EsaUJBQVMsZ0JBQWdCLE9BQU87QUFDNUIsY0FBSSxVQUFVLE1BQU07QUFDaEIsbUJBQU87QUFBQSxVQUNYLE9BQ0s7QUFDRCxtQkFBTztBQUFBLFVBQ1g7QUFBQSxRQUNKO0FBQ0EsaUJBQVMsYUFBYSxPQUFPO0FBQ3pCLGlCQUFPLFVBQVUsVUFBYSxVQUFVLFFBQVEsQ0FBQyxNQUFNLFFBQVEsS0FBSyxLQUFLLE9BQU8sVUFBVTtBQUFBLFFBQzlGO0FBQ0EsaUJBQVMsbUJBQW1CLHFCQUFxQixPQUFPO0FBQ3BELGtCQUFRLHFCQUFxQjtBQUFBLFlBQ3pCLEtBQUssV0FBVyxvQkFBb0I7QUFDaEMsa0JBQUksYUFBYSxLQUFLLEdBQUc7QUFDckIsdUJBQU8sZ0JBQWdCLEtBQUs7QUFBQSxjQUNoQyxPQUNLO0FBQ0QsdUJBQU8sQ0FBQyxnQkFBZ0IsS0FBSyxDQUFDO0FBQUEsY0FDbEM7QUFBQSxZQUNKLEtBQUssV0FBVyxvQkFBb0I7QUFDaEMsa0JBQUksQ0FBQyxhQUFhLEtBQUssR0FBRztBQUN0QixzQkFBTSxJQUFJLE1BQU0saUVBQWlFO0FBQUEsY0FDckY7QUFDQSxxQkFBTyxnQkFBZ0IsS0FBSztBQUFBLFlBQ2hDLEtBQUssV0FBVyxvQkFBb0I7QUFDaEMscUJBQU8sQ0FBQyxnQkFBZ0IsS0FBSyxDQUFDO0FBQUEsWUFDbEM7QUFDSSxvQkFBTSxJQUFJLE1BQU0sK0JBQStCLG9CQUFvQixTQUFTLENBQUMsRUFBRTtBQUFBLFVBQ3ZGO0FBQUEsUUFDSjtBQUNBLGlCQUFTLHFCQUFxQixNQUFNLFFBQVE7QUFDeEMsY0FBSTtBQUNKLGdCQUFNLGlCQUFpQixLQUFLO0FBQzVCLGtCQUFRLGdCQUFnQjtBQUFBLFlBQ3BCLEtBQUs7QUFDRCx1QkFBUztBQUNUO0FBQUEsWUFDSixLQUFLO0FBQ0QsdUJBQVMsbUJBQW1CLEtBQUsscUJBQXFCLE9BQU8sQ0FBQyxDQUFDO0FBQy9EO0FBQUEsWUFDSjtBQUNJLHVCQUFTLENBQUM7QUFDVix1QkFBUyxJQUFJLEdBQUcsSUFBSSxPQUFPLFVBQVUsSUFBSSxnQkFBZ0IsS0FBSztBQUMxRCx1QkFBTyxLQUFLLGdCQUFnQixPQUFPLENBQUMsQ0FBQyxDQUFDO0FBQUEsY0FDMUM7QUFDQSxrQkFBSSxPQUFPLFNBQVMsZ0JBQWdCO0FBQ2hDLHlCQUFTLElBQUksT0FBTyxRQUFRLElBQUksZ0JBQWdCLEtBQUs7QUFDakQseUJBQU8sS0FBSyxJQUFJO0FBQUEsZ0JBQ3BCO0FBQUEsY0FDSjtBQUNBO0FBQUEsVUFDUjtBQUNBLGlCQUFPO0FBQUEsUUFDWDtBQUNBLGNBQU0sYUFBYTtBQUFBLFVBQ2Ysa0JBQWtCLENBQUMsU0FBUyxTQUFTO0FBQ2pDLG9DQUF3QjtBQUN4QixnQkFBSTtBQUNKLGdCQUFJO0FBQ0osZ0JBQUlBLElBQUcsT0FBTyxJQUFJLEdBQUc7QUFDakIsdUJBQVM7QUFDVCxvQkFBTSxRQUFRLEtBQUssQ0FBQztBQUNwQixrQkFBSSxhQUFhO0FBQ2pCLGtCQUFJLHNCQUFzQixXQUFXLG9CQUFvQjtBQUN6RCxrQkFBSSxXQUFXLG9CQUFvQixHQUFHLEtBQUssR0FBRztBQUMxQyw2QkFBYTtBQUNiLHNDQUFzQjtBQUFBLGNBQzFCO0FBQ0Esa0JBQUksV0FBVyxLQUFLO0FBQ3BCLG9CQUFNLGlCQUFpQixXQUFXO0FBQ2xDLHNCQUFRLGdCQUFnQjtBQUFBLGdCQUNwQixLQUFLO0FBQ0Qsa0NBQWdCO0FBQ2hCO0FBQUEsZ0JBQ0osS0FBSztBQUNELGtDQUFnQixtQkFBbUIscUJBQXFCLEtBQUssVUFBVSxDQUFDO0FBQ3hFO0FBQUEsZ0JBQ0o7QUFDSSxzQkFBSSx3QkFBd0IsV0FBVyxvQkFBb0IsUUFBUTtBQUMvRCwwQkFBTSxJQUFJLE1BQU0sWUFBWSxjQUFjLDZEQUE2RDtBQUFBLGtCQUMzRztBQUNBLGtDQUFnQixLQUFLLE1BQU0sWUFBWSxRQUFRLEVBQUUsSUFBSSxXQUFTLGdCQUFnQixLQUFLLENBQUM7QUFDcEY7QUFBQSxjQUNSO0FBQUEsWUFDSixPQUNLO0FBQ0Qsb0JBQU0sU0FBUztBQUNmLHVCQUFTLEtBQUs7QUFDZCw4QkFBZ0IscUJBQXFCLE1BQU0sTUFBTTtBQUFBLFlBQ3JEO0FBQ0Esa0JBQU0sc0JBQXNCO0FBQUEsY0FDeEIsU0FBUztBQUFBLGNBQ1Q7QUFBQSxjQUNBLFFBQVE7QUFBQSxZQUNaO0FBQ0EscUNBQXlCLG1CQUFtQjtBQUM1QyxtQkFBTyxjQUFjLE1BQU0sbUJBQW1CLEVBQUUsTUFBTSxDQUFDLFVBQVU7QUFDN0QscUJBQU8sTUFBTSw4QkFBOEI7QUFDM0Msb0JBQU07QUFBQSxZQUNWLENBQUM7QUFBQSxVQUNMO0FBQUEsVUFDQSxnQkFBZ0IsQ0FBQyxNQUFNLFlBQVk7QUFDL0Isb0NBQXdCO0FBQ3hCLGdCQUFJO0FBQ0osZ0JBQUlBLElBQUcsS0FBSyxJQUFJLEdBQUc7QUFDZix3Q0FBMEI7QUFBQSxZQUM5QixXQUNTLFNBQVM7QUFDZCxrQkFBSUEsSUFBRyxPQUFPLElBQUksR0FBRztBQUNqQix5QkFBUztBQUNULHFDQUFxQixJQUFJLE1BQU0sRUFBRSxNQUFNLFFBQVcsUUFBUSxDQUFDO0FBQUEsY0FDL0QsT0FDSztBQUNELHlCQUFTLEtBQUs7QUFDZCxxQ0FBcUIsSUFBSSxLQUFLLFFBQVEsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUFBLGNBQzNEO0FBQUEsWUFDSjtBQUNBLG1CQUFPO0FBQUEsY0FDSCxTQUFTLE1BQU07QUFDWCxvQkFBSSxXQUFXLFFBQVc7QUFDdEIsdUNBQXFCLE9BQU8sTUFBTTtBQUFBLGdCQUN0QyxPQUNLO0FBQ0QsNENBQTBCO0FBQUEsZ0JBQzlCO0FBQUEsY0FDSjtBQUFBLFlBQ0o7QUFBQSxVQUNKO0FBQUEsVUFDQSxZQUFZLENBQUMsT0FBTyxPQUFPLFlBQVk7QUFDbkMsZ0JBQUksaUJBQWlCLElBQUksS0FBSyxHQUFHO0FBQzdCLG9CQUFNLElBQUksTUFBTSw4QkFBOEIsS0FBSyxxQkFBcUI7QUFBQSxZQUM1RTtBQUNBLDZCQUFpQixJQUFJLE9BQU8sT0FBTztBQUNuQyxtQkFBTztBQUFBLGNBQ0gsU0FBUyxNQUFNO0FBQ1gsaUNBQWlCLE9BQU8sS0FBSztBQUFBLGNBQ2pDO0FBQUEsWUFDSjtBQUFBLFVBQ0o7QUFBQSxVQUNBLGNBQWMsQ0FBQyxPQUFPLE9BQU8sVUFBVTtBQUduQyxtQkFBTyxXQUFXLGlCQUFpQixxQkFBcUIsTUFBTSxFQUFFLE9BQU8sTUFBTSxDQUFDO0FBQUEsVUFDbEY7QUFBQSxVQUNBLHFCQUFxQix5QkFBeUI7QUFBQSxVQUM5QyxhQUFhLENBQUMsU0FBUyxTQUFTO0FBQzVCLG9DQUF3QjtBQUN4QixnQ0FBb0I7QUFDcEIsZ0JBQUk7QUFDSixnQkFBSTtBQUNKLGdCQUFJLFFBQVE7QUFDWixnQkFBSUEsSUFBRyxPQUFPLElBQUksR0FBRztBQUNqQix1QkFBUztBQUNULG9CQUFNLFFBQVEsS0FBSyxDQUFDO0FBQ3BCLG9CQUFNLE9BQU8sS0FBSyxLQUFLLFNBQVMsQ0FBQztBQUNqQyxrQkFBSSxhQUFhO0FBQ2pCLGtCQUFJLHNCQUFzQixXQUFXLG9CQUFvQjtBQUN6RCxrQkFBSSxXQUFXLG9CQUFvQixHQUFHLEtBQUssR0FBRztBQUMxQyw2QkFBYTtBQUNiLHNDQUFzQjtBQUFBLGNBQzFCO0FBQ0Esa0JBQUksV0FBVyxLQUFLO0FBQ3BCLGtCQUFJLGVBQWUsa0JBQWtCLEdBQUcsSUFBSSxHQUFHO0FBQzNDLDJCQUFXLFdBQVc7QUFDdEIsd0JBQVE7QUFBQSxjQUNaO0FBQ0Esb0JBQU0saUJBQWlCLFdBQVc7QUFDbEMsc0JBQVEsZ0JBQWdCO0FBQUEsZ0JBQ3BCLEtBQUs7QUFDRCxrQ0FBZ0I7QUFDaEI7QUFBQSxnQkFDSixLQUFLO0FBQ0Qsa0NBQWdCLG1CQUFtQixxQkFBcUIsS0FBSyxVQUFVLENBQUM7QUFDeEU7QUFBQSxnQkFDSjtBQUNJLHNCQUFJLHdCQUF3QixXQUFXLG9CQUFvQixRQUFRO0FBQy9ELDBCQUFNLElBQUksTUFBTSxZQUFZLGNBQWMsd0RBQXdEO0FBQUEsa0JBQ3RHO0FBQ0Esa0NBQWdCLEtBQUssTUFBTSxZQUFZLFFBQVEsRUFBRSxJQUFJLFdBQVMsZ0JBQWdCLEtBQUssQ0FBQztBQUNwRjtBQUFBLGNBQ1I7QUFBQSxZQUNKLE9BQ0s7QUFDRCxvQkFBTSxTQUFTO0FBQ2YsdUJBQVMsS0FBSztBQUNkLDhCQUFnQixxQkFBcUIsTUFBTSxNQUFNO0FBQ2pELG9CQUFNLGlCQUFpQixLQUFLO0FBQzVCLHNCQUFRLGVBQWUsa0JBQWtCLEdBQUcsT0FBTyxjQUFjLENBQUMsSUFBSSxPQUFPLGNBQWMsSUFBSTtBQUFBLFlBQ25HO0FBQ0Esa0JBQU0sS0FBSztBQUNYLGdCQUFJO0FBQ0osZ0JBQUksT0FBTztBQUNQLDJCQUFhLE1BQU0sd0JBQXdCLE1BQU07QUFDN0Msc0JBQU0sSUFBSSxxQkFBcUIsT0FBTyxpQkFBaUIsWUFBWSxFQUFFO0FBQ3JFLG9CQUFJLE1BQU0sUUFBVztBQUNqQix5QkFBTyxJQUFJLHFFQUFxRSxFQUFFLEVBQUU7QUFDcEYseUJBQU8sUUFBUSxRQUFRO0FBQUEsZ0JBQzNCLE9BQ0s7QUFDRCx5QkFBTyxFQUFFLE1BQU0sTUFBTTtBQUNqQiwyQkFBTyxJQUFJLHdDQUF3QyxFQUFFLFNBQVM7QUFBQSxrQkFDbEUsQ0FBQztBQUFBLGdCQUNMO0FBQUEsY0FDSixDQUFDO0FBQUEsWUFDTDtBQUNBLGtCQUFNLGlCQUFpQjtBQUFBLGNBQ25CLFNBQVM7QUFBQSxjQUNUO0FBQUEsY0FDQTtBQUFBLGNBQ0EsUUFBUTtBQUFBLFlBQ1o7QUFDQSxnQ0FBb0IsY0FBYztBQUNsQyxnQkFBSSxPQUFPLHFCQUFxQixPQUFPLHVCQUF1QixZQUFZO0FBQ3RFLG1DQUFxQixPQUFPLG1CQUFtQixjQUFjO0FBQUEsWUFDakU7QUFDQSxtQkFBTyxJQUFJLFFBQVEsT0FBTyxTQUFTLFdBQVc7QUFDMUMsb0JBQU0scUJBQXFCLENBQUMsTUFBTTtBQUM5Qix3QkFBUSxDQUFDO0FBQ1QscUNBQXFCLE9BQU8sUUFBUSxFQUFFO0FBQ3RDLDRCQUFZLFFBQVE7QUFBQSxjQUN4QjtBQUNBLG9CQUFNLG9CQUFvQixDQUFDLE1BQU07QUFDN0IsdUJBQU8sQ0FBQztBQUNSLHFDQUFxQixPQUFPLFFBQVEsRUFBRTtBQUN0Qyw0QkFBWSxRQUFRO0FBQUEsY0FDeEI7QUFDQSxvQkFBTSxrQkFBa0IsRUFBRSxRQUFnQixZQUFZLEtBQUssSUFBSSxHQUFHLFNBQVMsb0JBQW9CLFFBQVEsa0JBQWtCO0FBQ3pILGtCQUFJO0FBQ0EsaUNBQWlCLElBQUksSUFBSSxlQUFlO0FBQ3hDLHNCQUFNLGNBQWMsTUFBTSxjQUFjO0FBQUEsY0FDNUMsU0FDTyxPQUFPO0FBR1YsaUNBQWlCLE9BQU8sRUFBRTtBQUMxQixnQ0FBZ0IsT0FBTyxJQUFJLFdBQVcsY0FBYyxXQUFXLFdBQVcsbUJBQW1CLE1BQU0sVUFBVSxNQUFNLFVBQVUsZ0JBQWdCLENBQUM7QUFDOUksdUJBQU8sTUFBTSx5QkFBeUI7QUFDdEMsc0JBQU07QUFBQSxjQUNWO0FBQUEsWUFDSixDQUFDO0FBQUEsVUFDTDtBQUFBLFVBQ0EsV0FBVyxDQUFDLE1BQU0sWUFBWTtBQUMxQixvQ0FBd0I7QUFDeEIsZ0JBQUksU0FBUztBQUNiLGdCQUFJLG1CQUFtQixHQUFHLElBQUksR0FBRztBQUM3Qix1QkFBUztBQUNULG1DQUFxQjtBQUFBLFlBQ3pCLFdBQ1NBLElBQUcsT0FBTyxJQUFJLEdBQUc7QUFDdEIsdUJBQVM7QUFDVCxrQkFBSSxZQUFZLFFBQVc7QUFDdkIseUJBQVM7QUFDVCxnQ0FBZ0IsSUFBSSxNQUFNLEVBQUUsU0FBa0IsTUFBTSxPQUFVLENBQUM7QUFBQSxjQUNuRTtBQUFBLFlBQ0osT0FDSztBQUNELGtCQUFJLFlBQVksUUFBVztBQUN2Qix5QkFBUyxLQUFLO0FBQ2QsZ0NBQWdCLElBQUksS0FBSyxRQUFRLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFBQSxjQUN0RDtBQUFBLFlBQ0o7QUFDQSxtQkFBTztBQUFBLGNBQ0gsU0FBUyxNQUFNO0FBQ1gsb0JBQUksV0FBVyxNQUFNO0FBQ2pCO0FBQUEsZ0JBQ0o7QUFDQSxvQkFBSSxXQUFXLFFBQVc7QUFDdEIsa0NBQWdCLE9BQU8sTUFBTTtBQUFBLGdCQUNqQyxPQUNLO0FBQ0QsdUNBQXFCO0FBQUEsZ0JBQ3pCO0FBQUEsY0FDSjtBQUFBLFlBQ0o7QUFBQSxVQUNKO0FBQUEsVUFDQSxvQkFBb0IsTUFBTTtBQUN0QixtQkFBTyxpQkFBaUIsT0FBTztBQUFBLFVBQ25DO0FBQUEsVUFDQSxPQUFPLE9BQU8sUUFBUSxTQUFTLG1DQUFtQztBQUM5RCxnQkFBSSxvQkFBb0I7QUFDeEIsZ0JBQUksZUFBZSxZQUFZO0FBQy9CLGdCQUFJLG1DQUFtQyxRQUFXO0FBQzlDLGtCQUFJQSxJQUFHLFFBQVEsOEJBQThCLEdBQUc7QUFDNUMsb0NBQW9CO0FBQUEsY0FDeEIsT0FDSztBQUNELG9DQUFvQiwrQkFBK0Isb0JBQW9CO0FBQ3ZFLCtCQUFlLCtCQUErQixlQUFlLFlBQVk7QUFBQSxjQUM3RTtBQUFBLFlBQ0o7QUFDQSxvQkFBUTtBQUNSLDBCQUFjO0FBQ2QsZ0JBQUksVUFBVSxNQUFNLEtBQUs7QUFDckIsdUJBQVM7QUFBQSxZQUNiLE9BQ0s7QUFDRCx1QkFBUztBQUFBLFlBQ2I7QUFDQSxnQkFBSSxxQkFBcUIsQ0FBQyxTQUFTLEtBQUssQ0FBQyxXQUFXLEdBQUc7QUFDbkQsb0JBQU0sV0FBVyxpQkFBaUIscUJBQXFCLE1BQU0sRUFBRSxPQUFPLE1BQU0sU0FBUyxNQUFNLEVBQUUsQ0FBQztBQUFBLFlBQ2xHO0FBQUEsVUFDSjtBQUFBLFVBQ0EsU0FBUyxhQUFhO0FBQUEsVUFDdEIsU0FBUyxhQUFhO0FBQUEsVUFDdEIseUJBQXlCLDZCQUE2QjtBQUFBLFVBQ3RELFdBQVcsZUFBZTtBQUFBLFVBQzFCLEtBQUssTUFBTTtBQUNQLDBCQUFjLElBQUk7QUFBQSxVQUN0QjtBQUFBLFVBQ0EsU0FBUyxNQUFNO0FBQ1gsZ0JBQUksV0FBVyxHQUFHO0FBQ2Q7QUFBQSxZQUNKO0FBQ0Esb0JBQVEsZ0JBQWdCO0FBQ3hCLDJCQUFlLEtBQUssTUFBUztBQUM3QixrQkFBTSxRQUFRLElBQUksV0FBVyxjQUFjLFdBQVcsV0FBVyx5QkFBeUIseURBQXlEO0FBQ25KLHVCQUFXLFdBQVcsaUJBQWlCLE9BQU8sR0FBRztBQUM3QyxzQkFBUSxPQUFPLEtBQUs7QUFBQSxZQUN4QjtBQUNBLCtCQUFtQixvQkFBSSxJQUFJO0FBQzNCLDRCQUFnQixvQkFBSSxJQUFJO0FBQ3hCLG9DQUF3QixvQkFBSSxJQUFJO0FBQ2hDLDJCQUFlLElBQUksWUFBWSxVQUFVO0FBRXpDLGdCQUFJQSxJQUFHLEtBQUssY0FBYyxPQUFPLEdBQUc7QUFDaEMsNEJBQWMsUUFBUTtBQUFBLFlBQzFCO0FBQ0EsZ0JBQUlBLElBQUcsS0FBSyxjQUFjLE9BQU8sR0FBRztBQUNoQyw0QkFBYyxRQUFRO0FBQUEsWUFDMUI7QUFBQSxVQUNKO0FBQUEsVUFDQSxRQUFRLE1BQU07QUFDVixvQ0FBd0I7QUFDeEIsNkJBQWlCO0FBQ2pCLG9CQUFRLGdCQUFnQjtBQUN4QiwwQkFBYyxPQUFPLFFBQVE7QUFBQSxVQUNqQztBQUFBLFVBQ0EsU0FBUyxNQUFNO0FBRVgsYUFBQyxHQUFHLE1BQU0sU0FBUyxFQUFFLFFBQVEsSUFBSSxTQUFTO0FBQUEsVUFDOUM7QUFBQSxRQUNKO0FBQ0EsbUJBQVcsZUFBZSxxQkFBcUIsTUFBTSxDQUFDLFdBQVc7QUFDN0QsY0FBSSxVQUFVLE1BQU0sT0FBTyxDQUFDLFFBQVE7QUFDaEM7QUFBQSxVQUNKO0FBQ0EsZ0JBQU0sVUFBVSxVQUFVLE1BQU0sV0FBVyxVQUFVLE1BQU07QUFDM0QsaUJBQU8sSUFBSSxPQUFPLFNBQVMsVUFBVSxPQUFPLFVBQVUsTUFBUztBQUFBLFFBQ25FLENBQUM7QUFDRCxtQkFBVyxlQUFlLHFCQUFxQixNQUFNLENBQUMsV0FBVztBQUM3RCxnQkFBTSxVQUFVLGlCQUFpQixJQUFJLE9BQU8sS0FBSztBQUNqRCxjQUFJLFNBQVM7QUFDVCxvQkFBUSxPQUFPLEtBQUs7QUFBQSxVQUN4QixPQUNLO0FBQ0QscUNBQXlCLEtBQUssTUFBTTtBQUFBLFVBQ3hDO0FBQUEsUUFDSixDQUFDO0FBQ0QsZUFBTztBQUFBLE1BQ1g7QUFDQSxjQUFRLDBCQUEwQm9CO0FBQUE7QUFBQTs7O0FDN3JDbEM7QUFBQTtBQUFBO0FBTUEsYUFBTyxlQUFlLFNBQVMsY0FBYyxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQzVELGNBQVEsZUFBZSxRQUFRLGdCQUFnQixRQUFRLDBCQUEwQixRQUFRLGFBQWEsUUFBUSxvQkFBb0IsUUFBUSxxQkFBcUIsUUFBUSx3QkFBd0IsUUFBUSwrQkFBK0IsUUFBUSx3QkFBd0IsUUFBUSxnQkFBZ0IsUUFBUSw4QkFBOEIsUUFBUSx3QkFBd0IsUUFBUSxnQkFBZ0IsUUFBUSw4QkFBOEIsUUFBUSw0QkFBNEIsUUFBUSxvQkFBb0IsUUFBUSwwQkFBMEIsUUFBUSxVQUFVLFFBQVEsUUFBUSxRQUFRLGFBQWEsUUFBUSxXQUFXLFFBQVEsUUFBUSxRQUFRLFlBQVksUUFBUSxzQkFBc0IsUUFBUSxvQkFBb0IsUUFBUSxvQkFBb0IsUUFBUSxvQkFBb0IsUUFBUSxvQkFBb0IsUUFBUSxvQkFBb0IsUUFBUSxvQkFBb0IsUUFBUSxvQkFBb0IsUUFBUSxvQkFBb0IsUUFBUSxvQkFBb0IsUUFBUSxvQkFBb0IsUUFBUSxtQkFBbUIsUUFBUSxhQUFhLFFBQVEsZ0JBQWdCLFFBQVEsZUFBZSxRQUFRLGVBQWUsUUFBUSxlQUFlLFFBQVEsZUFBZSxRQUFRLGVBQWUsUUFBUSxlQUFlLFFBQVEsZUFBZSxRQUFRLGVBQWUsUUFBUSxlQUFlLFFBQVEsZUFBZSxRQUFRLGNBQWMsUUFBUSxVQUFVLFFBQVEsTUFBTTtBQUM1d0MsY0FBUSxrQkFBa0IsUUFBUSx1QkFBdUIsUUFBUSw2QkFBNkIsUUFBUSwrQkFBK0IsUUFBUSxrQkFBa0IsUUFBUSxtQkFBbUIsUUFBUSx1QkFBdUIsUUFBUSx1QkFBdUIsUUFBUSxjQUFjLFFBQVEsY0FBYyxRQUFRLFFBQVE7QUFDcFQsVUFBTSxhQUFhO0FBQ25CLGFBQU8sZUFBZSxTQUFTLFdBQVcsRUFBRSxZQUFZLE1BQU0sS0FBSyxXQUFZO0FBQUUsZUFBTyxXQUFXO0FBQUEsTUFBUyxFQUFFLENBQUM7QUFDL0csYUFBTyxlQUFlLFNBQVMsZUFBZSxFQUFFLFlBQVksTUFBTSxLQUFLLFdBQVk7QUFBRSxlQUFPLFdBQVc7QUFBQSxNQUFhLEVBQUUsQ0FBQztBQUN2SCxhQUFPLGVBQWUsU0FBUyxnQkFBZ0IsRUFBRSxZQUFZLE1BQU0sS0FBSyxXQUFZO0FBQUUsZUFBTyxXQUFXO0FBQUEsTUFBYyxFQUFFLENBQUM7QUFDekgsYUFBTyxlQUFlLFNBQVMsZ0JBQWdCLEVBQUUsWUFBWSxNQUFNLEtBQUssV0FBWTtBQUFFLGVBQU8sV0FBVztBQUFBLE1BQWMsRUFBRSxDQUFDO0FBQ3pILGFBQU8sZUFBZSxTQUFTLGdCQUFnQixFQUFFLFlBQVksTUFBTSxLQUFLLFdBQVk7QUFBRSxlQUFPLFdBQVc7QUFBQSxNQUFjLEVBQUUsQ0FBQztBQUN6SCxhQUFPLGVBQWUsU0FBUyxnQkFBZ0IsRUFBRSxZQUFZLE1BQU0sS0FBSyxXQUFZO0FBQUUsZUFBTyxXQUFXO0FBQUEsTUFBYyxFQUFFLENBQUM7QUFDekgsYUFBTyxlQUFlLFNBQVMsZ0JBQWdCLEVBQUUsWUFBWSxNQUFNLEtBQUssV0FBWTtBQUFFLGVBQU8sV0FBVztBQUFBLE1BQWMsRUFBRSxDQUFDO0FBQ3pILGFBQU8sZUFBZSxTQUFTLGdCQUFnQixFQUFFLFlBQVksTUFBTSxLQUFLLFdBQVk7QUFBRSxlQUFPLFdBQVc7QUFBQSxNQUFjLEVBQUUsQ0FBQztBQUN6SCxhQUFPLGVBQWUsU0FBUyxnQkFBZ0IsRUFBRSxZQUFZLE1BQU0sS0FBSyxXQUFZO0FBQUUsZUFBTyxXQUFXO0FBQUEsTUFBYyxFQUFFLENBQUM7QUFDekgsYUFBTyxlQUFlLFNBQVMsZ0JBQWdCLEVBQUUsWUFBWSxNQUFNLEtBQUssV0FBWTtBQUFFLGVBQU8sV0FBVztBQUFBLE1BQWMsRUFBRSxDQUFDO0FBQ3pILGFBQU8sZUFBZSxTQUFTLGdCQUFnQixFQUFFLFlBQVksTUFBTSxLQUFLLFdBQVk7QUFBRSxlQUFPLFdBQVc7QUFBQSxNQUFjLEVBQUUsQ0FBQztBQUN6SCxhQUFPLGVBQWUsU0FBUyxnQkFBZ0IsRUFBRSxZQUFZLE1BQU0sS0FBSyxXQUFZO0FBQUUsZUFBTyxXQUFXO0FBQUEsTUFBYyxFQUFFLENBQUM7QUFDekgsYUFBTyxlQUFlLFNBQVMsaUJBQWlCLEVBQUUsWUFBWSxNQUFNLEtBQUssV0FBWTtBQUFFLGVBQU8sV0FBVztBQUFBLE1BQWUsRUFBRSxDQUFDO0FBQzNILGFBQU8sZUFBZSxTQUFTLGNBQWMsRUFBRSxZQUFZLE1BQU0sS0FBSyxXQUFZO0FBQUUsZUFBTyxXQUFXO0FBQUEsTUFBWSxFQUFFLENBQUM7QUFDckgsYUFBTyxlQUFlLFNBQVMsb0JBQW9CLEVBQUUsWUFBWSxNQUFNLEtBQUssV0FBWTtBQUFFLGVBQU8sV0FBVztBQUFBLE1BQWtCLEVBQUUsQ0FBQztBQUNqSSxhQUFPLGVBQWUsU0FBUyxxQkFBcUIsRUFBRSxZQUFZLE1BQU0sS0FBSyxXQUFZO0FBQUUsZUFBTyxXQUFXO0FBQUEsTUFBbUIsRUFBRSxDQUFDO0FBQ25JLGFBQU8sZUFBZSxTQUFTLHFCQUFxQixFQUFFLFlBQVksTUFBTSxLQUFLLFdBQVk7QUFBRSxlQUFPLFdBQVc7QUFBQSxNQUFtQixFQUFFLENBQUM7QUFDbkksYUFBTyxlQUFlLFNBQVMscUJBQXFCLEVBQUUsWUFBWSxNQUFNLEtBQUssV0FBWTtBQUFFLGVBQU8sV0FBVztBQUFBLE1BQW1CLEVBQUUsQ0FBQztBQUNuSSxhQUFPLGVBQWUsU0FBUyxxQkFBcUIsRUFBRSxZQUFZLE1BQU0sS0FBSyxXQUFZO0FBQUUsZUFBTyxXQUFXO0FBQUEsTUFBbUIsRUFBRSxDQUFDO0FBQ25JLGFBQU8sZUFBZSxTQUFTLHFCQUFxQixFQUFFLFlBQVksTUFBTSxLQUFLLFdBQVk7QUFBRSxlQUFPLFdBQVc7QUFBQSxNQUFtQixFQUFFLENBQUM7QUFDbkksYUFBTyxlQUFlLFNBQVMscUJBQXFCLEVBQUUsWUFBWSxNQUFNLEtBQUssV0FBWTtBQUFFLGVBQU8sV0FBVztBQUFBLE1BQW1CLEVBQUUsQ0FBQztBQUNuSSxhQUFPLGVBQWUsU0FBUyxxQkFBcUIsRUFBRSxZQUFZLE1BQU0sS0FBSyxXQUFZO0FBQUUsZUFBTyxXQUFXO0FBQUEsTUFBbUIsRUFBRSxDQUFDO0FBQ25JLGFBQU8sZUFBZSxTQUFTLHFCQUFxQixFQUFFLFlBQVksTUFBTSxLQUFLLFdBQVk7QUFBRSxlQUFPLFdBQVc7QUFBQSxNQUFtQixFQUFFLENBQUM7QUFDbkksYUFBTyxlQUFlLFNBQVMscUJBQXFCLEVBQUUsWUFBWSxNQUFNLEtBQUssV0FBWTtBQUFFLGVBQU8sV0FBVztBQUFBLE1BQW1CLEVBQUUsQ0FBQztBQUNuSSxhQUFPLGVBQWUsU0FBUyxxQkFBcUIsRUFBRSxZQUFZLE1BQU0sS0FBSyxXQUFZO0FBQUUsZUFBTyxXQUFXO0FBQUEsTUFBbUIsRUFBRSxDQUFDO0FBQ25JLGFBQU8sZUFBZSxTQUFTLHVCQUF1QixFQUFFLFlBQVksTUFBTSxLQUFLLFdBQVk7QUFBRSxlQUFPLFdBQVc7QUFBQSxNQUFxQixFQUFFLENBQUM7QUFDdkksVUFBTSxjQUFjO0FBQ3BCLGFBQU8sZUFBZSxTQUFTLGFBQWEsRUFBRSxZQUFZLE1BQU0sS0FBSyxXQUFZO0FBQUUsZUFBTyxZQUFZO0FBQUEsTUFBVyxFQUFFLENBQUM7QUFDcEgsYUFBTyxlQUFlLFNBQVMsWUFBWSxFQUFFLFlBQVksTUFBTSxLQUFLLFdBQVk7QUFBRSxlQUFPLFlBQVk7QUFBQSxNQUFVLEVBQUUsQ0FBQztBQUNsSCxhQUFPLGVBQWUsU0FBUyxTQUFTLEVBQUUsWUFBWSxNQUFNLEtBQUssV0FBWTtBQUFFLGVBQU8sWUFBWTtBQUFBLE1BQU8sRUFBRSxDQUFDO0FBQzVHLFVBQU0sZUFBZTtBQUNyQixhQUFPLGVBQWUsU0FBUyxjQUFjLEVBQUUsWUFBWSxNQUFNLEtBQUssV0FBWTtBQUFFLGVBQU8sYUFBYTtBQUFBLE1BQVksRUFBRSxDQUFDO0FBQ3ZILFVBQU0sV0FBVztBQUNqQixhQUFPLGVBQWUsU0FBUyxTQUFTLEVBQUUsWUFBWSxNQUFNLEtBQUssV0FBWTtBQUFFLGVBQU8sU0FBUztBQUFBLE1BQU8sRUFBRSxDQUFDO0FBQ3pHLGFBQU8sZUFBZSxTQUFTLFdBQVcsRUFBRSxZQUFZLE1BQU0sS0FBSyxXQUFZO0FBQUUsZUFBTyxTQUFTO0FBQUEsTUFBUyxFQUFFLENBQUM7QUFDN0csVUFBTSxpQkFBaUI7QUFDdkIsYUFBTyxlQUFlLFNBQVMsMkJBQTJCLEVBQUUsWUFBWSxNQUFNLEtBQUssV0FBWTtBQUFFLGVBQU8sZUFBZTtBQUFBLE1BQXlCLEVBQUUsQ0FBQztBQUNuSixhQUFPLGVBQWUsU0FBUyxxQkFBcUIsRUFBRSxZQUFZLE1BQU0sS0FBSyxXQUFZO0FBQUUsZUFBTyxlQUFlO0FBQUEsTUFBbUIsRUFBRSxDQUFDO0FBQ3ZJLFVBQU0sNEJBQTRCO0FBQ2xDLGFBQU8sZUFBZSxTQUFTLDZCQUE2QixFQUFFLFlBQVksTUFBTSxLQUFLLFdBQVk7QUFBRSxlQUFPLDBCQUEwQjtBQUFBLE1BQTJCLEVBQUUsQ0FBQztBQUNsSyxhQUFPLGVBQWUsU0FBUywrQkFBK0IsRUFBRSxZQUFZLE1BQU0sS0FBSyxXQUFZO0FBQUUsZUFBTywwQkFBMEI7QUFBQSxNQUE2QixFQUFFLENBQUM7QUFDdEssVUFBTSxrQkFBa0I7QUFDeEIsYUFBTyxlQUFlLFNBQVMsaUJBQWlCLEVBQUUsWUFBWSxNQUFNLEtBQUssV0FBWTtBQUFFLGVBQU8sZ0JBQWdCO0FBQUEsTUFBZSxFQUFFLENBQUM7QUFDaEksYUFBTyxlQUFlLFNBQVMseUJBQXlCLEVBQUUsWUFBWSxNQUFNLEtBQUssV0FBWTtBQUFFLGVBQU8sZ0JBQWdCO0FBQUEsTUFBdUIsRUFBRSxDQUFDO0FBQ2hKLGFBQU8sZUFBZSxTQUFTLCtCQUErQixFQUFFLFlBQVksTUFBTSxLQUFLLFdBQVk7QUFBRSxlQUFPLGdCQUFnQjtBQUFBLE1BQTZCLEVBQUUsQ0FBQztBQUM1SixVQUFNLGtCQUFrQjtBQUN4QixhQUFPLGVBQWUsU0FBUyxpQkFBaUIsRUFBRSxZQUFZLE1BQU0sS0FBSyxXQUFZO0FBQUUsZUFBTyxnQkFBZ0I7QUFBQSxNQUFlLEVBQUUsQ0FBQztBQUNoSSxhQUFPLGVBQWUsU0FBUyx5QkFBeUIsRUFBRSxZQUFZLE1BQU0sS0FBSyxXQUFZO0FBQUUsZUFBTyxnQkFBZ0I7QUFBQSxNQUF1QixFQUFFLENBQUM7QUFDaEosYUFBTyxlQUFlLFNBQVMsZ0NBQWdDLEVBQUUsWUFBWSxNQUFNLEtBQUssV0FBWTtBQUFFLGVBQU8sZ0JBQWdCO0FBQUEsTUFBOEIsRUFBRSxDQUFDO0FBQzlKLFVBQU0sa0JBQWtCO0FBQ3hCLGFBQU8sZUFBZSxTQUFTLHlCQUF5QixFQUFFLFlBQVksTUFBTSxLQUFLLFdBQVk7QUFBRSxlQUFPLGdCQUFnQjtBQUFBLE1BQXVCLEVBQUUsQ0FBQztBQUNoSixVQUFNLGVBQWU7QUFDckIsYUFBTyxlQUFlLFNBQVMsc0JBQXNCLEVBQUUsWUFBWSxNQUFNLEtBQUssV0FBWTtBQUFFLGVBQU8sYUFBYTtBQUFBLE1BQW9CLEVBQUUsQ0FBQztBQUN2SSxhQUFPLGVBQWUsU0FBUyxxQkFBcUIsRUFBRSxZQUFZLE1BQU0sS0FBSyxXQUFZO0FBQUUsZUFBTyxhQUFhO0FBQUEsTUFBbUIsRUFBRSxDQUFDO0FBQ3JJLGFBQU8sZUFBZSxTQUFTLGNBQWMsRUFBRSxZQUFZLE1BQU0sS0FBSyxXQUFZO0FBQUUsZUFBTyxhQUFhO0FBQUEsTUFBWSxFQUFFLENBQUM7QUFDdkgsYUFBTyxlQUFlLFNBQVMsMkJBQTJCLEVBQUUsWUFBWSxNQUFNLEtBQUssV0FBWTtBQUFFLGVBQU8sYUFBYTtBQUFBLE1BQXlCLEVBQUUsQ0FBQztBQUNqSixhQUFPLGVBQWUsU0FBUyxpQkFBaUIsRUFBRSxZQUFZLE1BQU0sS0FBSyxXQUFZO0FBQUUsZUFBTyxhQUFhO0FBQUEsTUFBZSxFQUFFLENBQUM7QUFDN0gsYUFBTyxlQUFlLFNBQVMsZ0JBQWdCLEVBQUUsWUFBWSxNQUFNLEtBQUssV0FBWTtBQUFFLGVBQU8sYUFBYTtBQUFBLE1BQWMsRUFBRSxDQUFDO0FBQzNILGFBQU8sZUFBZSxTQUFTLFNBQVMsRUFBRSxZQUFZLE1BQU0sS0FBSyxXQUFZO0FBQUUsZUFBTyxhQUFhO0FBQUEsTUFBTyxFQUFFLENBQUM7QUFDN0csYUFBTyxlQUFlLFNBQVMsZUFBZSxFQUFFLFlBQVksTUFBTSxLQUFLLFdBQVk7QUFBRSxlQUFPLGFBQWE7QUFBQSxNQUFhLEVBQUUsQ0FBQztBQUN6SCxhQUFPLGVBQWUsU0FBUyxlQUFlLEVBQUUsWUFBWSxNQUFNLEtBQUssV0FBWTtBQUFFLGVBQU8sYUFBYTtBQUFBLE1BQWEsRUFBRSxDQUFDO0FBQ3pILGFBQU8sZUFBZSxTQUFTLHdCQUF3QixFQUFFLFlBQVksTUFBTSxLQUFLLFdBQVk7QUFBRSxlQUFPLGFBQWE7QUFBQSxNQUFzQixFQUFFLENBQUM7QUFDM0ksYUFBTyxlQUFlLFNBQVMsd0JBQXdCLEVBQUUsWUFBWSxNQUFNLEtBQUssV0FBWTtBQUFFLGVBQU8sYUFBYTtBQUFBLE1BQXNCLEVBQUUsQ0FBQztBQUMzSSxhQUFPLGVBQWUsU0FBUyxvQkFBb0IsRUFBRSxZQUFZLE1BQU0sS0FBSyxXQUFZO0FBQUUsZUFBTyxhQUFhO0FBQUEsTUFBa0IsRUFBRSxDQUFDO0FBQ25JLGFBQU8sZUFBZSxTQUFTLG1CQUFtQixFQUFFLFlBQVksTUFBTSxLQUFLLFdBQVk7QUFBRSxlQUFPLGFBQWE7QUFBQSxNQUFpQixFQUFFLENBQUM7QUFDakksYUFBTyxlQUFlLFNBQVMsZ0NBQWdDLEVBQUUsWUFBWSxNQUFNLEtBQUssV0FBWTtBQUFFLGVBQU8sYUFBYTtBQUFBLE1BQThCLEVBQUUsQ0FBQztBQUMzSixhQUFPLGVBQWUsU0FBUyw4QkFBOEIsRUFBRSxZQUFZLE1BQU0sS0FBSyxXQUFZO0FBQUUsZUFBTyxhQUFhO0FBQUEsTUFBNEIsRUFBRSxDQUFDO0FBQ3ZKLGFBQU8sZUFBZSxTQUFTLHdCQUF3QixFQUFFLFlBQVksTUFBTSxLQUFLLFdBQVk7QUFBRSxlQUFPLGFBQWE7QUFBQSxNQUFzQixFQUFFLENBQUM7QUFDM0ksYUFBTyxlQUFlLFNBQVMsbUJBQW1CLEVBQUUsWUFBWSxNQUFNLEtBQUssV0FBWTtBQUFFLGVBQU8sYUFBYTtBQUFBLE1BQWlCLEVBQUUsQ0FBQztBQUNqSSxVQUFNLFFBQVE7QUFDZCxjQUFRLE1BQU0sTUFBTTtBQUFBO0FBQUE7OztBQ2hGcEI7QUFBQTtBQUFBO0FBS0EsYUFBTyxlQUFlLFNBQVMsY0FBYyxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQzVELFVBQU0sUUFBUTtBQUNkLFVBQU0sZ0JBQU4sTUFBTSx1QkFBc0IsTUFBTSxzQkFBc0I7QUFBQSxRQUNwRCxZQUFZLFdBQVcsU0FBUztBQUM1QixnQkFBTSxRQUFRO0FBQ2QsZUFBSyxlQUFlLElBQUksWUFBWSxPQUFPO0FBQUEsUUFDL0M7QUFBQSxRQUNBLGNBQWM7QUFDVixpQkFBTyxlQUFjO0FBQUEsUUFDekI7QUFBQSxRQUNBLFdBQVcsT0FBTyxXQUFXO0FBQ3pCLGlCQUFRLElBQUksWUFBWSxFQUFHLE9BQU8sS0FBSztBQUFBLFFBQzNDO0FBQUEsUUFDQSxTQUFTLE9BQU8sVUFBVTtBQUN0QixjQUFJLGFBQWEsU0FBUztBQUN0QixtQkFBTyxLQUFLLGFBQWEsT0FBTyxLQUFLO0FBQUEsVUFDekMsT0FDSztBQUNELG1CQUFRLElBQUksWUFBWSxRQUFRLEVBQUcsT0FBTyxLQUFLO0FBQUEsVUFDbkQ7QUFBQSxRQUNKO0FBQUEsUUFDQSxTQUFTLFFBQVEsUUFBUTtBQUNyQixjQUFJLFdBQVcsUUFBVztBQUN0QixtQkFBTztBQUFBLFVBQ1gsT0FDSztBQUNELG1CQUFPLE9BQU8sTUFBTSxHQUFHLE1BQU07QUFBQSxVQUNqQztBQUFBLFFBQ0o7QUFBQSxRQUNBLFlBQVksUUFBUTtBQUNoQixpQkFBTyxJQUFJLFdBQVcsTUFBTTtBQUFBLFFBQ2hDO0FBQUEsTUFDSjtBQUNBLG9CQUFjLGNBQWMsSUFBSSxXQUFXLENBQUM7QUFDNUMsVUFBTSx3QkFBTixNQUE0QjtBQUFBLFFBQ3hCLFlBQVksUUFBUTtBQUNoQixlQUFLLFNBQVM7QUFDZCxlQUFLLFVBQVUsSUFBSSxNQUFNLFFBQVE7QUFDakMsZUFBSyxtQkFBbUIsQ0FBQyxVQUFVO0FBQy9CLGtCQUFNLE9BQU8sTUFBTTtBQUNuQixpQkFBSyxZQUFZLEVBQUUsS0FBSyxDQUFDLFdBQVc7QUFDaEMsbUJBQUssUUFBUSxLQUFLLElBQUksV0FBVyxNQUFNLENBQUM7QUFBQSxZQUM1QyxHQUFHLE1BQU07QUFDTCxlQUFDLEdBQUcsTUFBTSxLQUFLLEVBQUUsUUFBUSxNQUFNLHlDQUF5QztBQUFBLFlBQzVFLENBQUM7QUFBQSxVQUNMO0FBQ0EsZUFBSyxPQUFPLGlCQUFpQixXQUFXLEtBQUssZ0JBQWdCO0FBQUEsUUFDakU7QUFBQSxRQUNBLFFBQVEsVUFBVTtBQUNkLGVBQUssT0FBTyxpQkFBaUIsU0FBUyxRQUFRO0FBQzlDLGlCQUFPLE1BQU0sV0FBVyxPQUFPLE1BQU0sS0FBSyxPQUFPLG9CQUFvQixTQUFTLFFBQVEsQ0FBQztBQUFBLFFBQzNGO0FBQUEsUUFDQSxRQUFRLFVBQVU7QUFDZCxlQUFLLE9BQU8saUJBQWlCLFNBQVMsUUFBUTtBQUM5QyxpQkFBTyxNQUFNLFdBQVcsT0FBTyxNQUFNLEtBQUssT0FBTyxvQkFBb0IsU0FBUyxRQUFRLENBQUM7QUFBQSxRQUMzRjtBQUFBLFFBQ0EsTUFBTSxVQUFVO0FBQ1osZUFBSyxPQUFPLGlCQUFpQixPQUFPLFFBQVE7QUFDNUMsaUJBQU8sTUFBTSxXQUFXLE9BQU8sTUFBTSxLQUFLLE9BQU8sb0JBQW9CLE9BQU8sUUFBUSxDQUFDO0FBQUEsUUFDekY7QUFBQSxRQUNBLE9BQU8sVUFBVTtBQUNiLGlCQUFPLEtBQUssUUFBUSxNQUFNLFFBQVE7QUFBQSxRQUN0QztBQUFBLE1BQ0o7QUFDQSxVQUFNLHdCQUFOLE1BQTRCO0FBQUEsUUFDeEIsWUFBWSxRQUFRO0FBQ2hCLGVBQUssU0FBUztBQUFBLFFBQ2xCO0FBQUEsUUFDQSxRQUFRLFVBQVU7QUFDZCxlQUFLLE9BQU8saUJBQWlCLFNBQVMsUUFBUTtBQUM5QyxpQkFBTyxNQUFNLFdBQVcsT0FBTyxNQUFNLEtBQUssT0FBTyxvQkFBb0IsU0FBUyxRQUFRLENBQUM7QUFBQSxRQUMzRjtBQUFBLFFBQ0EsUUFBUSxVQUFVO0FBQ2QsZUFBSyxPQUFPLGlCQUFpQixTQUFTLFFBQVE7QUFDOUMsaUJBQU8sTUFBTSxXQUFXLE9BQU8sTUFBTSxLQUFLLE9BQU8sb0JBQW9CLFNBQVMsUUFBUSxDQUFDO0FBQUEsUUFDM0Y7QUFBQSxRQUNBLE1BQU0sVUFBVTtBQUNaLGVBQUssT0FBTyxpQkFBaUIsT0FBTyxRQUFRO0FBQzVDLGlCQUFPLE1BQU0sV0FBVyxPQUFPLE1BQU0sS0FBSyxPQUFPLG9CQUFvQixPQUFPLFFBQVEsQ0FBQztBQUFBLFFBQ3pGO0FBQUEsUUFDQSxNQUFNLE1BQU0sVUFBVTtBQUNsQixjQUFJLE9BQU8sU0FBUyxVQUFVO0FBQzFCLGdCQUFJLGFBQWEsVUFBYSxhQUFhLFNBQVM7QUFDaEQsb0JBQU0sSUFBSSxNQUFNLHNGQUFzRixRQUFRLEVBQUU7QUFBQSxZQUNwSDtBQUNBLGlCQUFLLE9BQU8sS0FBSyxJQUFJO0FBQUEsVUFDekIsT0FDSztBQUNELGlCQUFLLE9BQU8sS0FBSyxJQUFJO0FBQUEsVUFDekI7QUFDQSxpQkFBTyxRQUFRLFFBQVE7QUFBQSxRQUMzQjtBQUFBLFFBQ0EsTUFBTTtBQUNGLGVBQUssT0FBTyxNQUFNO0FBQUEsUUFDdEI7QUFBQSxNQUNKO0FBQ0EsVUFBTSxlQUFlLElBQUksWUFBWTtBQUNyQyxVQUFNLE9BQU8sT0FBTyxPQUFPO0FBQUEsUUFDdkIsZUFBZSxPQUFPLE9BQU87QUFBQSxVQUN6QixRQUFRLENBQUMsYUFBYSxJQUFJLGNBQWMsUUFBUTtBQUFBLFFBQ3BELENBQUM7QUFBQSxRQUNELGlCQUFpQixPQUFPLE9BQU87QUFBQSxVQUMzQixTQUFTLE9BQU8sT0FBTztBQUFBLFlBQ25CLE1BQU07QUFBQSxZQUNOLFFBQVEsQ0FBQyxLQUFLLFlBQVk7QUFDdEIsa0JBQUksUUFBUSxZQUFZLFNBQVM7QUFDN0Isc0JBQU0sSUFBSSxNQUFNLHNGQUFzRixRQUFRLE9BQU8sRUFBRTtBQUFBLGNBQzNIO0FBQ0EscUJBQU8sUUFBUSxRQUFRLGFBQWEsT0FBTyxLQUFLLFVBQVUsS0FBSyxRQUFXLENBQUMsQ0FBQyxDQUFDO0FBQUEsWUFDakY7QUFBQSxVQUNKLENBQUM7QUFBQSxVQUNELFNBQVMsT0FBTyxPQUFPO0FBQUEsWUFDbkIsTUFBTTtBQUFBLFlBQ04sUUFBUSxDQUFDLFFBQVEsWUFBWTtBQUN6QixrQkFBSSxFQUFFLGtCQUFrQixhQUFhO0FBQ2pDLHNCQUFNLElBQUksTUFBTSwyREFBMkQ7QUFBQSxjQUMvRTtBQUNBLHFCQUFPLFFBQVEsUUFBUSxLQUFLLE1BQU0sSUFBSSxZQUFZLFFBQVEsT0FBTyxFQUFFLE9BQU8sTUFBTSxDQUFDLENBQUM7QUFBQSxZQUN0RjtBQUFBLFVBQ0osQ0FBQztBQUFBLFFBQ0wsQ0FBQztBQUFBLFFBQ0QsUUFBUSxPQUFPLE9BQU87QUFBQSxVQUNsQixrQkFBa0IsQ0FBQyxXQUFXLElBQUksc0JBQXNCLE1BQU07QUFBQSxVQUM5RCxrQkFBa0IsQ0FBQyxXQUFXLElBQUksc0JBQXNCLE1BQU07QUFBQSxRQUNsRSxDQUFDO0FBQUEsUUFDRDtBQUFBLFFBQ0EsT0FBTyxPQUFPLE9BQU87QUFBQSxVQUNqQixXQUFXLFVBQVUsT0FBTyxNQUFNO0FBQzlCLGtCQUFNLFNBQVMsV0FBVyxVQUFVLElBQUksR0FBRyxJQUFJO0FBQy9DLG1CQUFPLEVBQUUsU0FBUyxNQUFNLGFBQWEsTUFBTSxFQUFFO0FBQUEsVUFDakQ7QUFBQSxVQUNBLGFBQWEsYUFBYSxNQUFNO0FBQzVCLGtCQUFNLFNBQVMsV0FBVyxVQUFVLEdBQUcsR0FBRyxJQUFJO0FBQzlDLG1CQUFPLEVBQUUsU0FBUyxNQUFNLGFBQWEsTUFBTSxFQUFFO0FBQUEsVUFDakQ7QUFBQSxVQUNBLFlBQVksVUFBVSxPQUFPLE1BQU07QUFDL0Isa0JBQU0sU0FBUyxZQUFZLFVBQVUsSUFBSSxHQUFHLElBQUk7QUFDaEQsbUJBQU8sRUFBRSxTQUFTLE1BQU0sY0FBYyxNQUFNLEVBQUU7QUFBQSxVQUNsRDtBQUFBLFFBQ0osQ0FBQztBQUFBLE1BQ0wsQ0FBQztBQUNELGVBQVMsTUFBTTtBQUNYLGVBQU87QUFBQSxNQUNYO0FBQ0EsT0FBQyxTQUFVRSxNQUFLO0FBQ1osaUJBQVMsVUFBVTtBQUNmLGdCQUFNLElBQUksUUFBUSxJQUFJO0FBQUEsUUFDMUI7QUFDQSxRQUFBQSxLQUFJLFVBQVU7QUFBQSxNQUNsQixHQUFHLFFBQVEsTUFBTSxDQUFDLEVBQUU7QUFDcEIsY0FBUSxVQUFVO0FBQUE7QUFBQTs7O0FDM0psQjtBQUFBO0FBQUE7QUFLQSxVQUFJLGtCQUFtQixXQUFRLFFBQUssb0JBQXFCLE9BQU8sU0FBVSxTQUFTLEdBQUdDLElBQUcsR0FBRyxJQUFJO0FBQzVGLFlBQUksT0FBTyxPQUFXLE1BQUs7QUFDM0IsWUFBSSxPQUFPLE9BQU8seUJBQXlCQSxJQUFHLENBQUM7QUFDL0MsWUFBSSxDQUFDLFNBQVMsU0FBUyxPQUFPLENBQUNBLEdBQUUsYUFBYSxLQUFLLFlBQVksS0FBSyxlQUFlO0FBQ2pGLGlCQUFPLEVBQUUsWUFBWSxNQUFNLEtBQUssV0FBVztBQUFFLG1CQUFPQSxHQUFFLENBQUM7QUFBQSxVQUFHLEVBQUU7QUFBQSxRQUM5RDtBQUNBLGVBQU8sZUFBZSxHQUFHLElBQUksSUFBSTtBQUFBLE1BQ3JDLElBQU0sU0FBUyxHQUFHQSxJQUFHLEdBQUcsSUFBSTtBQUN4QixZQUFJLE9BQU8sT0FBVyxNQUFLO0FBQzNCLFVBQUUsRUFBRSxJQUFJQSxHQUFFLENBQUM7QUFBQSxNQUNmO0FBQ0EsVUFBSSxlQUFnQixXQUFRLFFBQUssZ0JBQWlCLFNBQVNBLElBQUdDLFVBQVM7QUFDbkUsaUJBQVMsS0FBS0QsR0FBRyxLQUFJLE1BQU0sYUFBYSxDQUFDLE9BQU8sVUFBVSxlQUFlLEtBQUtDLFVBQVMsQ0FBQyxFQUFHLGlCQUFnQkEsVUFBU0QsSUFBRyxDQUFDO0FBQUEsTUFDNUg7QUFDQSxhQUFPLGVBQWUsU0FBUyxjQUFjLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDNUQsY0FBUSwwQkFBMEIsUUFBUSx1QkFBdUIsUUFBUSx1QkFBdUI7QUFDaEcsVUFBTSxRQUFRO0FBRWQsWUFBTSxRQUFRLFFBQVE7QUFDdEIsVUFBTSxRQUFRO0FBQ2QsbUJBQWEsZUFBMEIsT0FBTztBQUM5QyxVQUFNLHVCQUFOLGNBQW1DLE1BQU0sc0JBQXNCO0FBQUEsUUFDM0QsWUFBWSxNQUFNO0FBQ2QsZ0JBQU07QUFDTixlQUFLLFVBQVUsSUFBSSxNQUFNLFFBQVE7QUFDakMsZUFBSyxtQkFBbUIsQ0FBQyxVQUFVO0FBQy9CLGlCQUFLLFFBQVEsS0FBSyxNQUFNLElBQUk7QUFBQSxVQUNoQztBQUNBLGVBQUssaUJBQWlCLFNBQVMsQ0FBQyxVQUFVLEtBQUssVUFBVSxLQUFLLENBQUM7QUFDL0QsZUFBSyxZQUFZLEtBQUs7QUFBQSxRQUMxQjtBQUFBLFFBQ0EsT0FBTyxVQUFVO0FBQ2IsaUJBQU8sS0FBSyxRQUFRLE1BQU0sUUFBUTtBQUFBLFFBQ3RDO0FBQUEsTUFDSjtBQUNBLGNBQVEsdUJBQXVCO0FBQy9CLFVBQU0sdUJBQU4sY0FBbUMsTUFBTSxzQkFBc0I7QUFBQSxRQUMzRCxZQUFZLE1BQU07QUFDZCxnQkFBTTtBQUNOLGVBQUssT0FBTztBQUNaLGVBQUssYUFBYTtBQUNsQixlQUFLLGlCQUFpQixTQUFTLENBQUMsVUFBVSxLQUFLLFVBQVUsS0FBSyxDQUFDO0FBQUEsUUFDbkU7QUFBQSxRQUNBLE1BQU0sS0FBSztBQUNQLGNBQUk7QUFDQSxpQkFBSyxLQUFLLFlBQVksR0FBRztBQUN6QixtQkFBTyxRQUFRLFFBQVE7QUFBQSxVQUMzQixTQUNPLE9BQU87QUFDVixpQkFBSyxZQUFZLE9BQU8sR0FBRztBQUMzQixtQkFBTyxRQUFRLE9BQU8sS0FBSztBQUFBLFVBQy9CO0FBQUEsUUFDSjtBQUFBLFFBQ0EsWUFBWSxPQUFPLEtBQUs7QUFDcEIsZUFBSztBQUNMLGVBQUssVUFBVSxPQUFPLEtBQUssS0FBSyxVQUFVO0FBQUEsUUFDOUM7QUFBQSxRQUNBLE1BQU07QUFBQSxRQUNOO0FBQUEsTUFDSjtBQUNBLGNBQVEsdUJBQXVCO0FBQy9CLGVBQVNFLHlCQUF3QixRQUFRLFFBQVEsUUFBUSxTQUFTO0FBQzlELFlBQUksV0FBVyxRQUFXO0FBQ3RCLG1CQUFTLE1BQU07QUFBQSxRQUNuQjtBQUNBLFlBQUksTUFBTSxtQkFBbUIsR0FBRyxPQUFPLEdBQUc7QUFDdEMsb0JBQVUsRUFBRSxvQkFBb0IsUUFBUTtBQUFBLFFBQzVDO0FBQ0EsZ0JBQVEsR0FBRyxNQUFNLHlCQUF5QixRQUFRLFFBQVEsUUFBUSxPQUFPO0FBQUEsTUFDN0U7QUFDQSxjQUFRLDBCQUEwQkE7QUFBQTtBQUFBOzs7QUMzRWxDO0FBQUE7QUFBQTtBQU1BLGFBQU8sVUFBVTtBQUFBO0FBQUE7OztBQ05qQjtBQUFBO0FBQUE7QUFBQTtBQXlCQSx1QkFBMkQ7OztBQ3BCM0QsOEJBQTJCOzs7QUNBM0IsTUFBQUMseUJBQTJCOzs7QUNBM0IsTUFBQUMseUJBQTJCO0FBRzNCLE1BQUFBLHlCQUF3RTtBQUdsRSxNQUFPLHlCQUFQLGNBQXNDLDZDQUFxQjtJQU83RCxZQUFZLFFBQWtCO0FBQzFCLFlBQUs7QUFQVTtBQUNULG1DQUE0QztBQUM1QztBQUVTO29DQUFnRCxDQUFBO0FBSS9ELFdBQUssU0FBUztBQUNkLFdBQUssT0FBTyxVQUFVLGFBQ2xCLEtBQUssWUFBWSxPQUFPLENBQUM7QUFFN0IsV0FBSyxPQUFPLFFBQVEsV0FDaEIsS0FBSyxVQUFVLEtBQUssQ0FBQztBQUV6QixXQUFLLE9BQU8sUUFBUSxDQUFDLE1BQU0sV0FBVTtBQUNqQyxZQUFJLFNBQVMsS0FBTTtBQUNmLGdCQUFNLFFBQWU7WUFDakIsTUFBTSxLQUFLO1lBQ1gsU0FBUyx5Q0FBeUMsSUFBSSxjQUFjLE1BQU07O0FBRTlFLGVBQUssVUFBVSxLQUFLO1FBQ3hCO0FBQ0EsYUFBSyxVQUFTO01BQ2xCLENBQUM7SUFDTDtJQUVBLE9BQU8sVUFBc0I7QUFDekIsVUFBSSxLQUFLLFVBQVUsV0FBVztBQUMxQixhQUFLLFFBQVE7QUFDYixhQUFLLFdBQVc7QUFDaEIsZUFBTyxLQUFLLE9BQU8sV0FBVyxHQUFHO0FBQzdCLGdCQUFNLFFBQVEsS0FBSyxPQUFPLElBQUc7QUFDN0IsY0FBSSxNQUFNLFlBQVksUUFBVztBQUM3QixpQkFBSyxZQUFZLE1BQU0sT0FBTztVQUNsQyxXQUFXLE1BQU0sVUFBVSxRQUFXO0FBQ2xDLGlCQUFLLFVBQVUsTUFBTSxLQUFLO1VBQzlCLE9BQU87QUFDSCxpQkFBSyxVQUFTO1VBQ2xCO1FBQ0o7TUFDSjtBQUNBLGFBQU87UUFDSCxTQUFTLE1BQUs7QUFDVixjQUFJLEtBQUssYUFBYSxVQUFVO0FBQzVCLGlCQUFLLFFBQVE7QUFDYixpQkFBSyxXQUFXO1VBQ3BCO1FBQ0o7O0lBRVI7SUFFUyxVQUFPO0FBQ1osWUFBTSxRQUFPO0FBQ2IsV0FBSyxRQUFRO0FBQ2IsV0FBSyxXQUFXO0FBQ2hCLFdBQUssT0FBTyxPQUFPLEdBQUcsS0FBSyxPQUFPLE1BQU07SUFDNUM7O0lBR1UsWUFBWSxTQUFZO0FBQzlCLFVBQUksS0FBSyxVQUFVLFdBQVc7QUFDMUIsYUFBSyxPQUFPLE9BQU8sR0FBRyxHQUFHLEVBQUUsUUFBTyxDQUFFO01BQ3hDLFdBQVcsS0FBSyxVQUFVLGFBQWE7QUFDbkMsWUFBSTtBQUNBLGdCQUFNLE9BQU8sS0FBSyxNQUFNLE9BQU87QUFDL0IsZUFBSyxTQUFVLElBQUk7UUFDdkIsU0FBUyxLQUFLO0FBQ1YsZ0JBQU0sUUFBZTtZQUNqQixNQUFNOztZQUVOLFNBQVMsMENBQTBDLE9BQU8sUUFBUSxXQUFZLElBQVksVUFBVSxTQUFTOztBQUVqSCxlQUFLLFVBQVUsS0FBSztRQUN4QjtNQUNKO0lBQ0o7O0lBR21CLFVBQVUsT0FBVTtBQUNuQyxVQUFJLEtBQUssVUFBVSxXQUFXO0FBQzFCLGFBQUssT0FBTyxPQUFPLEdBQUcsR0FBRyxFQUFFLE1BQUssQ0FBRTtNQUN0QyxXQUFXLEtBQUssVUFBVSxhQUFhO0FBQ25DLGNBQU0sVUFBVSxLQUFLO01BQ3pCO0lBQ0o7SUFFbUIsWUFBUztBQUN4QixVQUFJLEtBQUssVUFBVSxXQUFXO0FBQzFCLGFBQUssT0FBTyxPQUFPLEdBQUcsR0FBRyxDQUFBLENBQUU7TUFDL0IsV0FBVyxLQUFLLFVBQVUsYUFBYTtBQUNuQyxjQUFNLFVBQVM7TUFDbkI7QUFDQSxXQUFLLFFBQVE7SUFDakI7Ozs7QUNyR0osTUFBQUMseUJBQXdCO0FBQ3hCLE1BQUFBLHlCQUFxRDtBQUcvQyxNQUFPLHlCQUFQLGNBQXNDLDZDQUFxQjtJQUk3RCxZQUFZLFFBQWtCO0FBQzFCLFlBQUs7QUFKQyx3Q0FBYTtBQUNKO0FBSWYsV0FBSyxTQUFTO0lBQ2xCO0lBRUEsTUFBRztJQUNIO0lBRUEsTUFBTSxNQUFNLEtBQVk7QUFDcEIsVUFBSTtBQUNBLGNBQU0sVUFBVSxLQUFLLFVBQVUsR0FBRztBQUNsQyxhQUFLLE9BQU8sS0FBSyxPQUFPO01BQzVCLFNBQVMsR0FBRztBQUNSLGFBQUs7QUFDTCxhQUFLLFVBQVUsR0FBRyxLQUFLLEtBQUssVUFBVTtNQUMxQztJQUNKOzs7O0FDdkJKLE1BQUFDLHlCQUF3Qzs7O0FDa0JsQyxXQUFVLFNBQVMsV0FBb0I7QUFDekMsV0FBTztNQUNILE1BQU0sYUFBVyxVQUFVLEtBQUssT0FBTztNQUN2QyxXQUFXLFFBQUs7QUFDWixrQkFBVSxZQUFZLFdBQVMsR0FBRyxNQUFNLElBQUk7TUFDaEQ7TUFDQSxTQUFTLFFBQUs7QUFFVixrQkFBVSxVQUFVLENBQUMsVUFBYztBQUMvQixjQUFJLE9BQU8sT0FBTyxPQUFPLFNBQVMsR0FBRztBQUNqQyxlQUFHLE1BQU0sT0FBTztVQUNwQjtRQUNKO01BQ0o7TUFDQSxTQUFTLFFBQUs7QUFDVixrQkFBVSxVQUFVLFdBQVMsR0FBRyxNQUFNLE1BQU0sTUFBTSxNQUFNO01BQzVEO01BQ0EsU0FBUyxNQUFNLFVBQVUsTUFBSzs7RUFFdEM7OztBQ3BCQSxXQUFTLElBQU87QUFDWixXQUFRLFdBQW1CO0FBQUEsRUFDL0I7QUFFQSxXQUFTLEdBQXFCLFFBQW9CO0FBQzlDLFdBQU8sSUFBSSxNQUFNLENBQUMsR0FBUTtBQUFBLE1BQ3RCLEtBQUssQ0FBQyxHQUFHLE1BQU8sT0FBTyxFQUFVLENBQVc7QUFBQSxJQUNoRCxDQUFDO0FBQUEsRUFDTDtBQUVBLFdBQVMsSUFBTyxRQUFvQjtBQUNoQyxXQUFPLElBQUksTUFBTSxXQUFZO0FBQUEsSUFBQyxHQUFVO0FBQUEsTUFDcEMsV0FBVyxDQUFDLEdBQUcsU0FBUyxLQUFLLE9BQU8sR0FBVSxHQUFHLElBQUk7QUFBQSxNQUNyRCxLQUFXLENBQUMsR0FBRyxNQUFVLE9BQU8sRUFBVSxDQUFXO0FBQUEsSUFDekQsQ0FBQztBQUFBLEVBQ0w7QUFFTyxNQUFNLFNBQWlCLEdBQUcsTUFBTSxFQUFFLEVBQUUsTUFBTTtBQUMxQyxNQUFNLFlBQWlCLEdBQUcsTUFBTSxFQUFFLEVBQUUsU0FBUztBQUM3QyxNQUFNLGlCQUFpQixHQUFHLE1BQU0sRUFBRSxFQUFFLGNBQWM7QUFDbEQsTUFBTSxZQUFpQixHQUFHLE1BQU8sRUFBRSxFQUFVLFNBQVM7QUFDdEQsTUFBTSxNQUFpQixJQUFJLE1BQU0sRUFBRSxFQUFFLEdBQUc7QUFDeEMsTUFBTSxRQUFpQixJQUFJLE1BQU0sRUFBRSxFQUFFLEtBQUs7QUFDMUMsTUFBTSxXQUFpQixJQUFJLE1BQU0sRUFBRSxFQUFFLFFBQVE7QUFDN0MsTUFBTSxZQUFpQixJQUFJLE1BQU0sRUFBRSxFQUFFLFNBQVM7QUFDOUMsTUFBTSxVQUFpQixHQUFHLE1BQU0sRUFBRSxFQUFFLE9BQU87QUFDM0MsTUFBTSxTQUFpQixHQUFHLE1BQU0sRUFBRSxFQUFFLE1BQU07OztBQzVDMUMsTUFBSTtBQUNYLEdBQUMsU0FBVUMsY0FBYTtBQUNwQixhQUFTLEdBQUcsT0FBTztBQUNmLGFBQU8sT0FBTyxVQUFVO0FBQUEsSUFDNUI7QUFDQSxJQUFBQSxhQUFZLEtBQUs7QUFBQSxFQUNyQixHQUFHLGdCQUFnQixjQUFjLENBQUMsRUFBRTtBQUM3QixNQUFJO0FBQ1gsR0FBQyxTQUFVQyxNQUFLO0FBQ1osYUFBUyxHQUFHLE9BQU87QUFDZixhQUFPLE9BQU8sVUFBVTtBQUFBLElBQzVCO0FBQ0EsSUFBQUEsS0FBSSxLQUFLO0FBQUEsRUFDYixHQUFHLFFBQVEsTUFBTSxDQUFDLEVBQUU7QUFDYixNQUFJO0FBQ1gsR0FBQyxTQUFVQyxVQUFTO0FBQ2hCLElBQUFBLFNBQVEsWUFBWTtBQUNwQixJQUFBQSxTQUFRLFlBQVk7QUFDcEIsYUFBUyxHQUFHLE9BQU87QUFDZixhQUFPLE9BQU8sVUFBVSxZQUFZQSxTQUFRLGFBQWEsU0FBUyxTQUFTQSxTQUFRO0FBQUEsSUFDdkY7QUFDQSxJQUFBQSxTQUFRLEtBQUs7QUFBQSxFQUNqQixHQUFHLFlBQVksVUFBVSxDQUFDLEVBQUU7QUFDckIsTUFBSTtBQUNYLEdBQUMsU0FBVUMsV0FBVTtBQUNqQixJQUFBQSxVQUFTLFlBQVk7QUFDckIsSUFBQUEsVUFBUyxZQUFZO0FBQ3JCLGFBQVMsR0FBRyxPQUFPO0FBQ2YsYUFBTyxPQUFPLFVBQVUsWUFBWUEsVUFBUyxhQUFhLFNBQVMsU0FBU0EsVUFBUztBQUFBLElBQ3pGO0FBQ0EsSUFBQUEsVUFBUyxLQUFLO0FBQUEsRUFDbEIsR0FBRyxhQUFhLFdBQVcsQ0FBQyxFQUFFO0FBS3ZCLE1BQUlDO0FBQ1gsR0FBQyxTQUFVQSxXQUFVO0FBTWpCLGFBQVMsT0FBTyxNQUFNLFdBQVc7QUFDN0IsVUFBSSxTQUFTLE9BQU8sV0FBVztBQUMzQixlQUFPLFNBQVM7QUFBQSxNQUNwQjtBQUNBLFVBQUksY0FBYyxPQUFPLFdBQVc7QUFDaEMsb0JBQVksU0FBUztBQUFBLE1BQ3pCO0FBQ0EsYUFBTyxFQUFFLE1BQU0sVUFBVTtBQUFBLElBQzdCO0FBQ0EsSUFBQUEsVUFBUyxTQUFTO0FBSWxCLGFBQVMsR0FBRyxPQUFPO0FBQ2YsVUFBSSxZQUFZO0FBQ2hCLGFBQU8sR0FBRyxjQUFjLFNBQVMsS0FBSyxHQUFHLFNBQVMsVUFBVSxJQUFJLEtBQUssR0FBRyxTQUFTLFVBQVUsU0FBUztBQUFBLElBQ3hHO0FBQ0EsSUFBQUEsVUFBUyxLQUFLO0FBQUEsRUFDbEIsR0FBR0EsY0FBYUEsWUFBVyxDQUFDLEVBQUU7QUFLdkIsTUFBSUM7QUFDWCxHQUFDLFNBQVVBLFFBQU87QUFDZCxhQUFTLE9BQU8sS0FBSyxLQUFLLE9BQU8sTUFBTTtBQUNuQyxVQUFJLEdBQUcsU0FBUyxHQUFHLEtBQUssR0FBRyxTQUFTLEdBQUcsS0FBSyxHQUFHLFNBQVMsS0FBSyxLQUFLLEdBQUcsU0FBUyxJQUFJLEdBQUc7QUFDakYsZUFBTyxFQUFFLE9BQU9ELFVBQVMsT0FBTyxLQUFLLEdBQUcsR0FBRyxLQUFLQSxVQUFTLE9BQU8sT0FBTyxJQUFJLEVBQUU7QUFBQSxNQUNqRixXQUNTQSxVQUFTLEdBQUcsR0FBRyxLQUFLQSxVQUFTLEdBQUcsR0FBRyxHQUFHO0FBQzNDLGVBQU8sRUFBRSxPQUFPLEtBQUssS0FBSyxJQUFJO0FBQUEsTUFDbEMsT0FDSztBQUNELGNBQU0sSUFBSSxNQUFNLDhDQUE4QyxHQUFHLEtBQUssR0FBRyxLQUFLLEtBQUssS0FBSyxJQUFJLEdBQUc7QUFBQSxNQUNuRztBQUFBLElBQ0o7QUFDQSxJQUFBQyxPQUFNLFNBQVM7QUFJZixhQUFTLEdBQUcsT0FBTztBQUNmLFVBQUksWUFBWTtBQUNoQixhQUFPLEdBQUcsY0FBYyxTQUFTLEtBQUtELFVBQVMsR0FBRyxVQUFVLEtBQUssS0FBS0EsVUFBUyxHQUFHLFVBQVUsR0FBRztBQUFBLElBQ25HO0FBQ0EsSUFBQUMsT0FBTSxLQUFLO0FBQUEsRUFDZixHQUFHQSxXQUFVQSxTQUFRLENBQUMsRUFBRTtBQUtqQixNQUFJO0FBQ1gsR0FBQyxTQUFVQyxXQUFVO0FBTWpCLGFBQVMsT0FBTyxLQUFLLE9BQU87QUFDeEIsYUFBTyxFQUFFLEtBQUssTUFBTTtBQUFBLElBQ3hCO0FBQ0EsSUFBQUEsVUFBUyxTQUFTO0FBSWxCLGFBQVMsR0FBRyxPQUFPO0FBQ2YsVUFBSSxZQUFZO0FBQ2hCLGFBQU8sR0FBRyxjQUFjLFNBQVMsS0FBS0QsT0FBTSxHQUFHLFVBQVUsS0FBSyxNQUFNLEdBQUcsT0FBTyxVQUFVLEdBQUcsS0FBSyxHQUFHLFVBQVUsVUFBVSxHQUFHO0FBQUEsSUFDOUg7QUFDQSxJQUFBQyxVQUFTLEtBQUs7QUFBQSxFQUNsQixHQUFHLGFBQWEsV0FBVyxDQUFDLEVBQUU7QUFLdkIsTUFBSTtBQUNYLEdBQUMsU0FBVUMsZUFBYztBQVFyQixhQUFTLE9BQU8sV0FBVyxhQUFhLHNCQUFzQixzQkFBc0I7QUFDaEYsYUFBTyxFQUFFLFdBQVcsYUFBYSxzQkFBc0IscUJBQXFCO0FBQUEsSUFDaEY7QUFDQSxJQUFBQSxjQUFhLFNBQVM7QUFJdEIsYUFBUyxHQUFHLE9BQU87QUFDZixVQUFJLFlBQVk7QUFDaEIsYUFBTyxHQUFHLGNBQWMsU0FBUyxLQUFLRixPQUFNLEdBQUcsVUFBVSxXQUFXLEtBQUssR0FBRyxPQUFPLFVBQVUsU0FBUyxLQUMvRkEsT0FBTSxHQUFHLFVBQVUsb0JBQW9CLE1BQ3RDQSxPQUFNLEdBQUcsVUFBVSxvQkFBb0IsS0FBSyxHQUFHLFVBQVUsVUFBVSxvQkFBb0I7QUFBQSxJQUNuRztBQUNBLElBQUFFLGNBQWEsS0FBSztBQUFBLEVBQ3RCLEdBQUcsaUJBQWlCLGVBQWUsQ0FBQyxFQUFFO0FBSy9CLE1BQUk7QUFDWCxHQUFDLFNBQVVDLFFBQU87QUFJZCxhQUFTLE9BQU8sS0FBSyxPQUFPLE1BQU0sT0FBTztBQUNyQyxhQUFPO0FBQUEsUUFDSDtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQ0EsSUFBQUEsT0FBTSxTQUFTO0FBSWYsYUFBUyxHQUFHLE9BQU87QUFDZixZQUFNLFlBQVk7QUFDbEIsYUFBTyxHQUFHLGNBQWMsU0FBUyxLQUFLLEdBQUcsWUFBWSxVQUFVLEtBQUssR0FBRyxDQUFDLEtBQ2pFLEdBQUcsWUFBWSxVQUFVLE9BQU8sR0FBRyxDQUFDLEtBQ3BDLEdBQUcsWUFBWSxVQUFVLE1BQU0sR0FBRyxDQUFDLEtBQ25DLEdBQUcsWUFBWSxVQUFVLE9BQU8sR0FBRyxDQUFDO0FBQUEsSUFDL0M7QUFDQSxJQUFBQSxPQUFNLEtBQUs7QUFBQSxFQUNmLEdBQUcsVUFBVSxRQUFRLENBQUMsRUFBRTtBQUtqQixNQUFJO0FBQ1gsR0FBQyxTQUFVQyxtQkFBa0I7QUFJekIsYUFBUyxPQUFPLE9BQU8sT0FBTztBQUMxQixhQUFPO0FBQUEsUUFDSDtBQUFBLFFBQ0E7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQUNBLElBQUFBLGtCQUFpQixTQUFTO0FBSTFCLGFBQVMsR0FBRyxPQUFPO0FBQ2YsWUFBTSxZQUFZO0FBQ2xCLGFBQU8sR0FBRyxjQUFjLFNBQVMsS0FBS0osT0FBTSxHQUFHLFVBQVUsS0FBSyxLQUFLLE1BQU0sR0FBRyxVQUFVLEtBQUs7QUFBQSxJQUMvRjtBQUNBLElBQUFJLGtCQUFpQixLQUFLO0FBQUEsRUFDMUIsR0FBRyxxQkFBcUIsbUJBQW1CLENBQUMsRUFBRTtBQUt2QyxNQUFJO0FBQ1gsR0FBQyxTQUFVQyxvQkFBbUI7QUFJMUIsYUFBUyxPQUFPLE9BQU8sVUFBVSxxQkFBcUI7QUFDbEQsYUFBTztBQUFBLFFBQ0g7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQ0EsSUFBQUEsbUJBQWtCLFNBQVM7QUFJM0IsYUFBUyxHQUFHLE9BQU87QUFDZixZQUFNLFlBQVk7QUFDbEIsYUFBTyxHQUFHLGNBQWMsU0FBUyxLQUFLLEdBQUcsT0FBTyxVQUFVLEtBQUssTUFDdkQsR0FBRyxVQUFVLFVBQVUsUUFBUSxLQUFLLFNBQVMsR0FBRyxTQUFTLE9BQ3pELEdBQUcsVUFBVSxVQUFVLG1CQUFtQixLQUFLLEdBQUcsV0FBVyxVQUFVLHFCQUFxQixTQUFTLEVBQUU7QUFBQSxJQUNuSDtBQUNBLElBQUFBLG1CQUFrQixLQUFLO0FBQUEsRUFDM0IsR0FBRyxzQkFBc0Isb0JBQW9CLENBQUMsRUFBRTtBQUl6QyxNQUFJO0FBQ1gsR0FBQyxTQUFVQyxtQkFBa0I7QUFJekIsSUFBQUEsa0JBQWlCLFVBQVU7QUFJM0IsSUFBQUEsa0JBQWlCLFVBQVU7QUFJM0IsSUFBQUEsa0JBQWlCLFNBQVM7QUFBQSxFQUM5QixHQUFHLHFCQUFxQixtQkFBbUIsQ0FBQyxFQUFFO0FBS3ZDLE1BQUk7QUFDWCxHQUFDLFNBQVVDLGVBQWM7QUFJckIsYUFBUyxPQUFPLFdBQVcsU0FBUyxnQkFBZ0IsY0FBYyxNQUFNLGVBQWU7QUFDbkYsWUFBTSxTQUFTO0FBQUEsUUFDWDtBQUFBLFFBQ0E7QUFBQSxNQUNKO0FBQ0EsVUFBSSxHQUFHLFFBQVEsY0FBYyxHQUFHO0FBQzVCLGVBQU8saUJBQWlCO0FBQUEsTUFDNUI7QUFDQSxVQUFJLEdBQUcsUUFBUSxZQUFZLEdBQUc7QUFDMUIsZUFBTyxlQUFlO0FBQUEsTUFDMUI7QUFDQSxVQUFJLEdBQUcsUUFBUSxJQUFJLEdBQUc7QUFDbEIsZUFBTyxPQUFPO0FBQUEsTUFDbEI7QUFDQSxVQUFJLEdBQUcsUUFBUSxhQUFhLEdBQUc7QUFDM0IsZUFBTyxnQkFBZ0I7QUFBQSxNQUMzQjtBQUNBLGFBQU87QUFBQSxJQUNYO0FBQ0EsSUFBQUEsY0FBYSxTQUFTO0FBSXRCLGFBQVMsR0FBRyxPQUFPO0FBQ2YsWUFBTSxZQUFZO0FBQ2xCLGFBQU8sR0FBRyxjQUFjLFNBQVMsS0FBSyxHQUFHLFNBQVMsVUFBVSxTQUFTLEtBQUssR0FBRyxTQUFTLFVBQVUsU0FBUyxNQUNqRyxHQUFHLFVBQVUsVUFBVSxjQUFjLEtBQUssR0FBRyxTQUFTLFVBQVUsY0FBYyxPQUM5RSxHQUFHLFVBQVUsVUFBVSxZQUFZLEtBQUssR0FBRyxTQUFTLFVBQVUsWUFBWSxPQUMxRSxHQUFHLFVBQVUsVUFBVSxJQUFJLEtBQUssR0FBRyxPQUFPLFVBQVUsSUFBSTtBQUFBLElBQ3BFO0FBQ0EsSUFBQUEsY0FBYSxLQUFLO0FBQUEsRUFDdEIsR0FBRyxpQkFBaUIsZUFBZSxDQUFDLEVBQUU7QUFLL0IsTUFBSTtBQUNYLEdBQUMsU0FBVUMsK0JBQThCO0FBSXJDLGFBQVMsT0FBT0MsV0FBVSxTQUFTO0FBQy9CLGFBQU87QUFBQSxRQUNILFVBQUFBO0FBQUEsUUFDQTtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQ0EsSUFBQUQsOEJBQTZCLFNBQVM7QUFJdEMsYUFBUyxHQUFHLE9BQU87QUFDZixVQUFJLFlBQVk7QUFDaEIsYUFBTyxHQUFHLFFBQVEsU0FBUyxLQUFLLFNBQVMsR0FBRyxVQUFVLFFBQVEsS0FBSyxHQUFHLE9BQU8sVUFBVSxPQUFPO0FBQUEsSUFDbEc7QUFDQSxJQUFBQSw4QkFBNkIsS0FBSztBQUFBLEVBQ3RDLEdBQUcsaUNBQWlDLCtCQUErQixDQUFDLEVBQUU7QUFJL0QsTUFBSTtBQUNYLEdBQUMsU0FBVUUscUJBQW9CO0FBSTNCLElBQUFBLG9CQUFtQixRQUFRO0FBSTNCLElBQUFBLG9CQUFtQixVQUFVO0FBSTdCLElBQUFBLG9CQUFtQixjQUFjO0FBSWpDLElBQUFBLG9CQUFtQixPQUFPO0FBQUEsRUFDOUIsR0FBRyx1QkFBdUIscUJBQXFCLENBQUMsRUFBRTtBQU0zQyxNQUFJO0FBQ1gsR0FBQyxTQUFVQyxnQkFBZTtBQU90QixJQUFBQSxlQUFjLGNBQWM7QUFNNUIsSUFBQUEsZUFBYyxhQUFhO0FBQUEsRUFDL0IsR0FBRyxrQkFBa0IsZ0JBQWdCLENBQUMsRUFBRTtBQU1qQyxNQUFJO0FBQ1gsR0FBQyxTQUFVQyxrQkFBaUI7QUFDeEIsYUFBUyxHQUFHLE9BQU87QUFDZixZQUFNLFlBQVk7QUFDbEIsYUFBTyxHQUFHLGNBQWMsU0FBUyxLQUFLLEdBQUcsT0FBTyxVQUFVLElBQUk7QUFBQSxJQUNsRTtBQUNBLElBQUFBLGlCQUFnQixLQUFLO0FBQUEsRUFDekIsR0FBRyxvQkFBb0Isa0JBQWtCLENBQUMsRUFBRTtBQUtyQyxNQUFJO0FBQ1gsR0FBQyxTQUFVQyxhQUFZO0FBSW5CLGFBQVMsT0FBTyxPQUFPLFNBQVMsVUFBVSxNQUFNLFFBQVEsb0JBQW9CO0FBQ3hFLFVBQUksU0FBUyxFQUFFLE9BQU8sUUFBUTtBQUM5QixVQUFJLEdBQUcsUUFBUSxRQUFRLEdBQUc7QUFDdEIsZUFBTyxXQUFXO0FBQUEsTUFDdEI7QUFDQSxVQUFJLEdBQUcsUUFBUSxJQUFJLEdBQUc7QUFDbEIsZUFBTyxPQUFPO0FBQUEsTUFDbEI7QUFDQSxVQUFJLEdBQUcsUUFBUSxNQUFNLEdBQUc7QUFDcEIsZUFBTyxTQUFTO0FBQUEsTUFDcEI7QUFDQSxVQUFJLEdBQUcsUUFBUSxrQkFBa0IsR0FBRztBQUNoQyxlQUFPLHFCQUFxQjtBQUFBLE1BQ2hDO0FBQ0EsYUFBTztBQUFBLElBQ1g7QUFDQSxJQUFBQSxZQUFXLFNBQVM7QUFJcEIsYUFBUyxHQUFHLE9BQU87QUFDZixVQUFJO0FBQ0osVUFBSSxZQUFZO0FBQ2hCLGFBQU8sR0FBRyxRQUFRLFNBQVMsS0FDcEJiLE9BQU0sR0FBRyxVQUFVLEtBQUssS0FDeEIsR0FBRyxPQUFPLFVBQVUsT0FBTyxNQUMxQixHQUFHLE9BQU8sVUFBVSxRQUFRLEtBQUssR0FBRyxVQUFVLFVBQVUsUUFBUSxPQUNoRSxHQUFHLFFBQVEsVUFBVSxJQUFJLEtBQUssR0FBRyxPQUFPLFVBQVUsSUFBSSxLQUFLLEdBQUcsVUFBVSxVQUFVLElBQUksT0FDdEYsR0FBRyxVQUFVLFVBQVUsZUFBZSxLQUFNLEdBQUcsUUFBUSxLQUFLLFVBQVUscUJBQXFCLFFBQVEsT0FBTyxTQUFTLFNBQVMsR0FBRyxJQUFJLE9BQ25JLEdBQUcsT0FBTyxVQUFVLE1BQU0sS0FBSyxHQUFHLFVBQVUsVUFBVSxNQUFNLE9BQzVELEdBQUcsVUFBVSxVQUFVLGtCQUFrQixLQUFLLEdBQUcsV0FBVyxVQUFVLG9CQUFvQiw2QkFBNkIsRUFBRTtBQUFBLElBQ3JJO0FBQ0EsSUFBQWEsWUFBVyxLQUFLO0FBQUEsRUFDcEIsR0FBRyxlQUFlLGFBQWEsQ0FBQyxFQUFFO0FBSzNCLE1BQUk7QUFDWCxHQUFDLFNBQVVDLFVBQVM7QUFJaEIsYUFBUyxPQUFPLE9BQU8sWUFBWSxNQUFNO0FBQ3JDLFVBQUksU0FBUyxFQUFFLE9BQU8sUUFBUTtBQUM5QixVQUFJLEdBQUcsUUFBUSxJQUFJLEtBQUssS0FBSyxTQUFTLEdBQUc7QUFDckMsZUFBTyxZQUFZO0FBQUEsTUFDdkI7QUFDQSxhQUFPO0FBQUEsSUFDWDtBQUNBLElBQUFBLFNBQVEsU0FBUztBQUlqQixhQUFTLEdBQUcsT0FBTztBQUNmLFVBQUksWUFBWTtBQUNoQixhQUFPLEdBQUcsUUFBUSxTQUFTLEtBQUssR0FBRyxPQUFPLFVBQVUsS0FBSyxLQUFLLEdBQUcsT0FBTyxVQUFVLE9BQU87QUFBQSxJQUM3RjtBQUNBLElBQUFBLFNBQVEsS0FBSztBQUFBLEVBQ2pCLEdBQUcsWUFBWSxVQUFVLENBQUMsRUFBRTtBQUtyQixNQUFJO0FBQ1gsR0FBQyxTQUFVQyxXQUFVO0FBTWpCLGFBQVMsUUFBUSxPQUFPLFNBQVM7QUFDN0IsYUFBTyxFQUFFLE9BQU8sUUFBUTtBQUFBLElBQzVCO0FBQ0EsSUFBQUEsVUFBUyxVQUFVO0FBTW5CLGFBQVMsT0FBTyxVQUFVLFNBQVM7QUFDL0IsYUFBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLFVBQVUsS0FBSyxTQUFTLEdBQUcsUUFBUTtBQUFBLElBQ2hFO0FBQ0EsSUFBQUEsVUFBUyxTQUFTO0FBS2xCLGFBQVMsSUFBSSxPQUFPO0FBQ2hCLGFBQU8sRUFBRSxPQUFPLFNBQVMsR0FBRztBQUFBLElBQ2hDO0FBQ0EsSUFBQUEsVUFBUyxNQUFNO0FBQ2YsYUFBUyxHQUFHLE9BQU87QUFDZixZQUFNLFlBQVk7QUFDbEIsYUFBTyxHQUFHLGNBQWMsU0FBUyxLQUMxQixHQUFHLE9BQU8sVUFBVSxPQUFPLEtBQzNCZixPQUFNLEdBQUcsVUFBVSxLQUFLO0FBQUEsSUFDbkM7QUFDQSxJQUFBZSxVQUFTLEtBQUs7QUFBQSxFQUNsQixHQUFHLGFBQWEsV0FBVyxDQUFDLEVBQUU7QUFDdkIsTUFBSTtBQUNYLEdBQUMsU0FBVUMsbUJBQWtCO0FBQ3pCLGFBQVMsT0FBTyxPQUFPLG1CQUFtQixhQUFhO0FBQ25ELFlBQU0sU0FBUyxFQUFFLE1BQU07QUFDdkIsVUFBSSxzQkFBc0IsUUFBVztBQUNqQyxlQUFPLG9CQUFvQjtBQUFBLE1BQy9CO0FBQ0EsVUFBSSxnQkFBZ0IsUUFBVztBQUMzQixlQUFPLGNBQWM7QUFBQSxNQUN6QjtBQUNBLGFBQU87QUFBQSxJQUNYO0FBQ0EsSUFBQUEsa0JBQWlCLFNBQVM7QUFDMUIsYUFBUyxHQUFHLE9BQU87QUFDZixZQUFNLFlBQVk7QUFDbEIsYUFBTyxHQUFHLGNBQWMsU0FBUyxLQUFLLEdBQUcsT0FBTyxVQUFVLEtBQUssTUFDMUQsR0FBRyxRQUFRLFVBQVUsaUJBQWlCLEtBQUssVUFBVSxzQkFBc0IsWUFDM0UsR0FBRyxPQUFPLFVBQVUsV0FBVyxLQUFLLFVBQVUsZ0JBQWdCO0FBQUEsSUFDdkU7QUFDQSxJQUFBQSxrQkFBaUIsS0FBSztBQUFBLEVBQzFCLEdBQUcscUJBQXFCLG1CQUFtQixDQUFDLEVBQUU7QUFDdkMsTUFBSTtBQUNYLEdBQUMsU0FBVUMsNkJBQTRCO0FBQ25DLGFBQVMsR0FBRyxPQUFPO0FBQ2YsWUFBTSxZQUFZO0FBQ2xCLGFBQU8sR0FBRyxPQUFPLFNBQVM7QUFBQSxJQUM5QjtBQUNBLElBQUFBLDRCQUEyQixLQUFLO0FBQUEsRUFDcEMsR0FBRywrQkFBK0IsNkJBQTZCLENBQUMsRUFBRTtBQUMzRCxNQUFJO0FBQ1gsR0FBQyxTQUFVQyxvQkFBbUI7QUFRMUIsYUFBUyxRQUFRLE9BQU8sU0FBUyxZQUFZO0FBQ3pDLGFBQU8sRUFBRSxPQUFPLFNBQVMsY0FBYyxXQUFXO0FBQUEsSUFDdEQ7QUFDQSxJQUFBQSxtQkFBa0IsVUFBVTtBQVE1QixhQUFTLE9BQU8sVUFBVSxTQUFTLFlBQVk7QUFDM0MsYUFBTyxFQUFFLE9BQU8sRUFBRSxPQUFPLFVBQVUsS0FBSyxTQUFTLEdBQUcsU0FBUyxjQUFjLFdBQVc7QUFBQSxJQUMxRjtBQUNBLElBQUFBLG1CQUFrQixTQUFTO0FBTzNCLGFBQVMsSUFBSSxPQUFPLFlBQVk7QUFDNUIsYUFBTyxFQUFFLE9BQU8sU0FBUyxJQUFJLGNBQWMsV0FBVztBQUFBLElBQzFEO0FBQ0EsSUFBQUEsbUJBQWtCLE1BQU07QUFDeEIsYUFBUyxHQUFHLE9BQU87QUFDZixZQUFNLFlBQVk7QUFDbEIsYUFBTyxTQUFTLEdBQUcsU0FBUyxNQUFNLGlCQUFpQixHQUFHLFVBQVUsWUFBWSxLQUFLLDJCQUEyQixHQUFHLFVBQVUsWUFBWTtBQUFBLElBQ3pJO0FBQ0EsSUFBQUEsbUJBQWtCLEtBQUs7QUFBQSxFQUMzQixHQUFHLHNCQUFzQixvQkFBb0IsQ0FBQyxFQUFFO0FBS3pDLE1BQUk7QUFDWCxHQUFDLFNBQVVDLG1CQUFrQjtBQUl6QixhQUFTLE9BQU8sY0FBYyxPQUFPO0FBQ2pDLGFBQU8sRUFBRSxjQUFjLE1BQU07QUFBQSxJQUNqQztBQUNBLElBQUFBLGtCQUFpQixTQUFTO0FBQzFCLGFBQVMsR0FBRyxPQUFPO0FBQ2YsVUFBSSxZQUFZO0FBQ2hCLGFBQU8sR0FBRyxRQUFRLFNBQVMsS0FDcEIsd0NBQXdDLEdBQUcsVUFBVSxZQUFZLEtBQ2pFLE1BQU0sUUFBUSxVQUFVLEtBQUs7QUFBQSxJQUN4QztBQUNBLElBQUFBLGtCQUFpQixLQUFLO0FBQUEsRUFDMUIsR0FBRyxxQkFBcUIsbUJBQW1CLENBQUMsRUFBRTtBQUN2QyxNQUFJO0FBQ1gsR0FBQyxTQUFVQyxhQUFZO0FBQ25CLGFBQVMsT0FBTyxLQUFLLFNBQVMsWUFBWTtBQUN0QyxVQUFJLFNBQVM7QUFBQSxRQUNULE1BQU07QUFBQSxRQUNOO0FBQUEsTUFDSjtBQUNBLFVBQUksWUFBWSxXQUFjLFFBQVEsY0FBYyxVQUFhLFFBQVEsbUJBQW1CLFNBQVk7QUFDcEcsZUFBTyxVQUFVO0FBQUEsTUFDckI7QUFDQSxVQUFJLGVBQWUsUUFBVztBQUMxQixlQUFPLGVBQWU7QUFBQSxNQUMxQjtBQUNBLGFBQU87QUFBQSxJQUNYO0FBQ0EsSUFBQUEsWUFBVyxTQUFTO0FBQ3BCLGFBQVMsR0FBRyxPQUFPO0FBQ2YsVUFBSSxZQUFZO0FBQ2hCLGFBQU8sYUFBYSxVQUFVLFNBQVMsWUFBWSxHQUFHLE9BQU8sVUFBVSxHQUFHLE1BQU0sVUFBVSxZQUFZLFdBQ2hHLFVBQVUsUUFBUSxjQUFjLFVBQWEsR0FBRyxRQUFRLFVBQVUsUUFBUSxTQUFTLE9BQU8sVUFBVSxRQUFRLG1CQUFtQixVQUFhLEdBQUcsUUFBUSxVQUFVLFFBQVEsY0FBYyxRQUFTLFVBQVUsaUJBQWlCLFVBQWEsMkJBQTJCLEdBQUcsVUFBVSxZQUFZO0FBQUEsSUFDdFM7QUFDQSxJQUFBQSxZQUFXLEtBQUs7QUFBQSxFQUNwQixHQUFHLGVBQWUsYUFBYSxDQUFDLEVBQUU7QUFDM0IsTUFBSTtBQUNYLEdBQUMsU0FBVUMsYUFBWTtBQUNuQixhQUFTLE9BQU8sUUFBUSxRQUFRLFNBQVMsWUFBWTtBQUNqRCxVQUFJLFNBQVM7QUFBQSxRQUNULE1BQU07QUFBQSxRQUNOO0FBQUEsUUFDQTtBQUFBLE1BQ0o7QUFDQSxVQUFJLFlBQVksV0FBYyxRQUFRLGNBQWMsVUFBYSxRQUFRLG1CQUFtQixTQUFZO0FBQ3BHLGVBQU8sVUFBVTtBQUFBLE1BQ3JCO0FBQ0EsVUFBSSxlQUFlLFFBQVc7QUFDMUIsZUFBTyxlQUFlO0FBQUEsTUFDMUI7QUFDQSxhQUFPO0FBQUEsSUFDWDtBQUNBLElBQUFBLFlBQVcsU0FBUztBQUNwQixhQUFTLEdBQUcsT0FBTztBQUNmLFVBQUksWUFBWTtBQUNoQixhQUFPLGFBQWEsVUFBVSxTQUFTLFlBQVksR0FBRyxPQUFPLFVBQVUsTUFBTSxLQUFLLEdBQUcsT0FBTyxVQUFVLE1BQU0sTUFBTSxVQUFVLFlBQVksV0FDbEksVUFBVSxRQUFRLGNBQWMsVUFBYSxHQUFHLFFBQVEsVUFBVSxRQUFRLFNBQVMsT0FBTyxVQUFVLFFBQVEsbUJBQW1CLFVBQWEsR0FBRyxRQUFRLFVBQVUsUUFBUSxjQUFjLFFBQVMsVUFBVSxpQkFBaUIsVUFBYSwyQkFBMkIsR0FBRyxVQUFVLFlBQVk7QUFBQSxJQUN0UztBQUNBLElBQUFBLFlBQVcsS0FBSztBQUFBLEVBQ3BCLEdBQUcsZUFBZSxhQUFhLENBQUMsRUFBRTtBQUMzQixNQUFJO0FBQ1gsR0FBQyxTQUFVQyxhQUFZO0FBQ25CLGFBQVMsT0FBTyxLQUFLLFNBQVMsWUFBWTtBQUN0QyxVQUFJLFNBQVM7QUFBQSxRQUNULE1BQU07QUFBQSxRQUNOO0FBQUEsTUFDSjtBQUNBLFVBQUksWUFBWSxXQUFjLFFBQVEsY0FBYyxVQUFhLFFBQVEsc0JBQXNCLFNBQVk7QUFDdkcsZUFBTyxVQUFVO0FBQUEsTUFDckI7QUFDQSxVQUFJLGVBQWUsUUFBVztBQUMxQixlQUFPLGVBQWU7QUFBQSxNQUMxQjtBQUNBLGFBQU87QUFBQSxJQUNYO0FBQ0EsSUFBQUEsWUFBVyxTQUFTO0FBQ3BCLGFBQVMsR0FBRyxPQUFPO0FBQ2YsVUFBSSxZQUFZO0FBQ2hCLGFBQU8sYUFBYSxVQUFVLFNBQVMsWUFBWSxHQUFHLE9BQU8sVUFBVSxHQUFHLE1BQU0sVUFBVSxZQUFZLFdBQ2hHLFVBQVUsUUFBUSxjQUFjLFVBQWEsR0FBRyxRQUFRLFVBQVUsUUFBUSxTQUFTLE9BQU8sVUFBVSxRQUFRLHNCQUFzQixVQUFhLEdBQUcsUUFBUSxVQUFVLFFBQVEsaUJBQWlCLFFBQVMsVUFBVSxpQkFBaUIsVUFBYSwyQkFBMkIsR0FBRyxVQUFVLFlBQVk7QUFBQSxJQUM1UztBQUNBLElBQUFBLFlBQVcsS0FBSztBQUFBLEVBQ3BCLEdBQUcsZUFBZSxhQUFhLENBQUMsRUFBRTtBQUMzQixNQUFJO0FBQ1gsR0FBQyxTQUFVQyxnQkFBZTtBQUN0QixhQUFTLEdBQUcsT0FBTztBQUNmLFVBQUksWUFBWTtBQUNoQixhQUFPLGNBQ0YsVUFBVSxZQUFZLFVBQWEsVUFBVSxvQkFBb0IsWUFDakUsVUFBVSxvQkFBb0IsVUFBYSxVQUFVLGdCQUFnQixNQUFNLENBQUMsV0FBVztBQUNwRixZQUFJLEdBQUcsT0FBTyxPQUFPLElBQUksR0FBRztBQUN4QixpQkFBTyxXQUFXLEdBQUcsTUFBTSxLQUFLLFdBQVcsR0FBRyxNQUFNLEtBQUssV0FBVyxHQUFHLE1BQU07QUFBQSxRQUNqRixPQUNLO0FBQ0QsaUJBQU8saUJBQWlCLEdBQUcsTUFBTTtBQUFBLFFBQ3JDO0FBQUEsTUFDSixDQUFDO0FBQUEsSUFDVDtBQUNBLElBQUFBLGVBQWMsS0FBSztBQUFBLEVBQ3ZCLEdBQUcsa0JBQWtCLGdCQUFnQixDQUFDLEVBQUU7QUF1U2pDLE1BQUk7QUFDWCxHQUFDLFNBQVVDLHlCQUF3QjtBQUsvQixhQUFTLE9BQU8sS0FBSztBQUNqQixhQUFPLEVBQUUsSUFBSTtBQUFBLElBQ2pCO0FBQ0EsSUFBQUEsd0JBQXVCLFNBQVM7QUFJaEMsYUFBUyxHQUFHLE9BQU87QUFDZixVQUFJLFlBQVk7QUFDaEIsYUFBTyxHQUFHLFFBQVEsU0FBUyxLQUFLLEdBQUcsT0FBTyxVQUFVLEdBQUc7QUFBQSxJQUMzRDtBQUNBLElBQUFBLHdCQUF1QixLQUFLO0FBQUEsRUFDaEMsR0FBRywyQkFBMkIseUJBQXlCLENBQUMsRUFBRTtBQUtuRCxNQUFJO0FBQ1gsR0FBQyxTQUFVQyxrQ0FBaUM7QUFNeEMsYUFBUyxPQUFPLEtBQUssU0FBUztBQUMxQixhQUFPLEVBQUUsS0FBSyxRQUFRO0FBQUEsSUFDMUI7QUFDQSxJQUFBQSxpQ0FBZ0MsU0FBUztBQUl6QyxhQUFTLEdBQUcsT0FBTztBQUNmLFVBQUksWUFBWTtBQUNoQixhQUFPLEdBQUcsUUFBUSxTQUFTLEtBQUssR0FBRyxPQUFPLFVBQVUsR0FBRyxLQUFLLEdBQUcsUUFBUSxVQUFVLE9BQU87QUFBQSxJQUM1RjtBQUNBLElBQUFBLGlDQUFnQyxLQUFLO0FBQUEsRUFDekMsR0FBRyxvQ0FBb0Msa0NBQWtDLENBQUMsRUFBRTtBQUtyRSxNQUFJO0FBQ1gsR0FBQyxTQUFVQywwQ0FBeUM7QUFNaEQsYUFBUyxPQUFPLEtBQUssU0FBUztBQUMxQixhQUFPLEVBQUUsS0FBSyxRQUFRO0FBQUEsSUFDMUI7QUFDQSxJQUFBQSx5Q0FBd0MsU0FBUztBQUlqRCxhQUFTLEdBQUcsT0FBTztBQUNmLFVBQUksWUFBWTtBQUNoQixhQUFPLEdBQUcsUUFBUSxTQUFTLEtBQUssR0FBRyxPQUFPLFVBQVUsR0FBRyxNQUFNLFVBQVUsWUFBWSxRQUFRLEdBQUcsUUFBUSxVQUFVLE9BQU87QUFBQSxJQUMzSDtBQUNBLElBQUFBLHlDQUF3QyxLQUFLO0FBQUEsRUFDakQsR0FBRyw0Q0FBNEMsMENBQTBDLENBQUMsRUFBRTtBQUtyRixNQUFJO0FBQ1gsR0FBQyxTQUFVQyxtQkFBa0I7QUFRekIsYUFBUyxPQUFPLEtBQUssWUFBWSxTQUFTLE1BQU07QUFDNUMsYUFBTyxFQUFFLEtBQUssWUFBWSxTQUFTLEtBQUs7QUFBQSxJQUM1QztBQUNBLElBQUFBLGtCQUFpQixTQUFTO0FBSTFCLGFBQVMsR0FBRyxPQUFPO0FBQ2YsVUFBSSxZQUFZO0FBQ2hCLGFBQU8sR0FBRyxRQUFRLFNBQVMsS0FBSyxHQUFHLE9BQU8sVUFBVSxHQUFHLEtBQUssR0FBRyxPQUFPLFVBQVUsVUFBVSxLQUFLLEdBQUcsUUFBUSxVQUFVLE9BQU8sS0FBSyxHQUFHLE9BQU8sVUFBVSxJQUFJO0FBQUEsSUFDNUo7QUFDQSxJQUFBQSxrQkFBaUIsS0FBSztBQUFBLEVBQzFCLEdBQUcscUJBQXFCLG1CQUFtQixDQUFDLEVBQUU7QUFRdkMsTUFBSTtBQUNYLEdBQUMsU0FBVUMsYUFBWTtBQUluQixJQUFBQSxZQUFXLFlBQVk7QUFJdkIsSUFBQUEsWUFBVyxXQUFXO0FBSXRCLGFBQVMsR0FBRyxPQUFPO0FBQ2YsWUFBTSxZQUFZO0FBQ2xCLGFBQU8sY0FBY0EsWUFBVyxhQUFhLGNBQWNBLFlBQVc7QUFBQSxJQUMxRTtBQUNBLElBQUFBLFlBQVcsS0FBSztBQUFBLEVBQ3BCLEdBQUcsZUFBZSxhQUFhLENBQUMsRUFBRTtBQUMzQixNQUFJO0FBQ1gsR0FBQyxTQUFVQyxnQkFBZTtBQUl0QixhQUFTLEdBQUcsT0FBTztBQUNmLFlBQU0sWUFBWTtBQUNsQixhQUFPLEdBQUcsY0FBYyxLQUFLLEtBQUssV0FBVyxHQUFHLFVBQVUsSUFBSSxLQUFLLEdBQUcsT0FBTyxVQUFVLEtBQUs7QUFBQSxJQUNoRztBQUNBLElBQUFBLGVBQWMsS0FBSztBQUFBLEVBQ3ZCLEdBQUcsa0JBQWtCLGdCQUFnQixDQUFDLEVBQUU7QUFJakMsTUFBSTtBQUNYLEdBQUMsU0FBVUMscUJBQW9CO0FBQzNCLElBQUFBLG9CQUFtQixPQUFPO0FBQzFCLElBQUFBLG9CQUFtQixTQUFTO0FBQzVCLElBQUFBLG9CQUFtQixXQUFXO0FBQzlCLElBQUFBLG9CQUFtQixjQUFjO0FBQ2pDLElBQUFBLG9CQUFtQixRQUFRO0FBQzNCLElBQUFBLG9CQUFtQixXQUFXO0FBQzlCLElBQUFBLG9CQUFtQixRQUFRO0FBQzNCLElBQUFBLG9CQUFtQixZQUFZO0FBQy9CLElBQUFBLG9CQUFtQixTQUFTO0FBQzVCLElBQUFBLG9CQUFtQixXQUFXO0FBQzlCLElBQUFBLG9CQUFtQixPQUFPO0FBQzFCLElBQUFBLG9CQUFtQixRQUFRO0FBQzNCLElBQUFBLG9CQUFtQixPQUFPO0FBQzFCLElBQUFBLG9CQUFtQixVQUFVO0FBQzdCLElBQUFBLG9CQUFtQixVQUFVO0FBQzdCLElBQUFBLG9CQUFtQixRQUFRO0FBQzNCLElBQUFBLG9CQUFtQixPQUFPO0FBQzFCLElBQUFBLG9CQUFtQixZQUFZO0FBQy9CLElBQUFBLG9CQUFtQixTQUFTO0FBQzVCLElBQUFBLG9CQUFtQixhQUFhO0FBQ2hDLElBQUFBLG9CQUFtQixXQUFXO0FBQzlCLElBQUFBLG9CQUFtQixTQUFTO0FBQzVCLElBQUFBLG9CQUFtQixRQUFRO0FBQzNCLElBQUFBLG9CQUFtQixXQUFXO0FBQzlCLElBQUFBLG9CQUFtQixnQkFBZ0I7QUFBQSxFQUN2QyxHQUFHLHVCQUF1QixxQkFBcUIsQ0FBQyxFQUFFO0FBSzNDLE1BQUk7QUFDWCxHQUFDLFNBQVVDLG1CQUFrQjtBQUl6QixJQUFBQSxrQkFBaUIsWUFBWTtBQVc3QixJQUFBQSxrQkFBaUIsVUFBVTtBQUFBLEVBQy9CLEdBQUcscUJBQXFCLG1CQUFtQixDQUFDLEVBQUU7QUFPdkMsTUFBSTtBQUNYLEdBQUMsU0FBVUMsb0JBQW1CO0FBSTFCLElBQUFBLG1CQUFrQixhQUFhO0FBQUEsRUFDbkMsR0FBRyxzQkFBc0Isb0JBQW9CLENBQUMsRUFBRTtBQU16QyxNQUFJO0FBQ1gsR0FBQyxTQUFVQyxvQkFBbUI7QUFJMUIsYUFBUyxPQUFPLFNBQVMsUUFBUSxTQUFTO0FBQ3RDLGFBQU8sRUFBRSxTQUFTLFFBQVEsUUFBUTtBQUFBLElBQ3RDO0FBQ0EsSUFBQUEsbUJBQWtCLFNBQVM7QUFJM0IsYUFBUyxHQUFHLE9BQU87QUFDZixZQUFNLFlBQVk7QUFDbEIsYUFBTyxhQUFhLEdBQUcsT0FBTyxVQUFVLE9BQU8sS0FBS0MsT0FBTSxHQUFHLFVBQVUsTUFBTSxLQUFLQSxPQUFNLEdBQUcsVUFBVSxPQUFPO0FBQUEsSUFDaEg7QUFDQSxJQUFBRCxtQkFBa0IsS0FBSztBQUFBLEVBQzNCLEdBQUcsc0JBQXNCLG9CQUFvQixDQUFDLEVBQUU7QUFPekMsTUFBSTtBQUNYLEdBQUMsU0FBVUUsaUJBQWdCO0FBUXZCLElBQUFBLGdCQUFlLE9BQU87QUFVdEIsSUFBQUEsZ0JBQWUsb0JBQW9CO0FBQUEsRUFDdkMsR0FBRyxtQkFBbUIsaUJBQWlCLENBQUMsRUFBRTtBQUNuQyxNQUFJO0FBQ1gsR0FBQyxTQUFVQyw2QkFBNEI7QUFDbkMsYUFBUyxHQUFHLE9BQU87QUFDZixZQUFNLFlBQVk7QUFDbEIsYUFBTyxjQUFjLEdBQUcsT0FBTyxVQUFVLE1BQU0sS0FBSyxVQUFVLFdBQVcsWUFDcEUsR0FBRyxPQUFPLFVBQVUsV0FBVyxLQUFLLFVBQVUsZ0JBQWdCO0FBQUEsSUFDdkU7QUFDQSxJQUFBQSw0QkFBMkIsS0FBSztBQUFBLEVBQ3BDLEdBQUcsK0JBQStCLDZCQUE2QixDQUFDLEVBQUU7QUFLM0QsTUFBSTtBQUNYLEdBQUMsU0FBVUMsaUJBQWdCO0FBS3ZCLGFBQVMsT0FBTyxPQUFPO0FBQ25CLGFBQU8sRUFBRSxNQUFNO0FBQUEsSUFDbkI7QUFDQSxJQUFBQSxnQkFBZSxTQUFTO0FBQUEsRUFDNUIsR0FBRyxtQkFBbUIsaUJBQWlCLENBQUMsRUFBRTtBQUtuQyxNQUFJO0FBQ1gsR0FBQyxTQUFVQyxpQkFBZ0I7QUFPdkIsYUFBUyxPQUFPLE9BQU8sY0FBYztBQUNqQyxhQUFPLEVBQUUsT0FBTyxRQUFRLFFBQVEsQ0FBQyxHQUFHLGNBQWMsQ0FBQyxDQUFDLGFBQWE7QUFBQSxJQUNyRTtBQUNBLElBQUFBLGdCQUFlLFNBQVM7QUFBQSxFQUM1QixHQUFHLG1CQUFtQixpQkFBaUIsQ0FBQyxFQUFFO0FBQ25DLE1BQUk7QUFDWCxHQUFDLFNBQVVDLGVBQWM7QUFNckIsYUFBUyxjQUFjLFdBQVc7QUFDOUIsYUFBTyxVQUFVLFFBQVEseUJBQXlCLE1BQU07QUFBQSxJQUM1RDtBQUNBLElBQUFBLGNBQWEsZ0JBQWdCO0FBSTdCLGFBQVMsR0FBRyxPQUFPO0FBQ2YsWUFBTSxZQUFZO0FBQ2xCLGFBQU8sR0FBRyxPQUFPLFNBQVMsS0FBTSxHQUFHLGNBQWMsU0FBUyxLQUFLLEdBQUcsT0FBTyxVQUFVLFFBQVEsS0FBSyxHQUFHLE9BQU8sVUFBVSxLQUFLO0FBQUEsSUFDN0g7QUFDQSxJQUFBQSxjQUFhLEtBQUs7QUFBQSxFQUN0QixHQUFHLGlCQUFpQixlQUFlLENBQUMsRUFBRTtBQUMvQixNQUFJO0FBQ1gsR0FBQyxTQUFVQyxRQUFPO0FBSWQsYUFBUyxHQUFHLE9BQU87QUFDZixVQUFJLFlBQVk7QUFDaEIsYUFBTyxDQUFDLENBQUMsYUFBYSxHQUFHLGNBQWMsU0FBUyxNQUFNLGNBQWMsR0FBRyxVQUFVLFFBQVEsS0FDckYsYUFBYSxHQUFHLFVBQVUsUUFBUSxLQUNsQyxHQUFHLFdBQVcsVUFBVSxVQUFVLGFBQWEsRUFBRSxPQUFPLE1BQU0sVUFBVSxVQUFhTixPQUFNLEdBQUcsTUFBTSxLQUFLO0FBQUEsSUFDakg7QUFDQSxJQUFBTSxPQUFNLEtBQUs7QUFBQSxFQUNmLEdBQUcsVUFBVSxRQUFRLENBQUMsRUFBRTtBQUtqQixNQUFJO0FBQ1gsR0FBQyxTQUFVQyx1QkFBc0I7QUFPN0IsYUFBUyxPQUFPLE9BQU8sZUFBZTtBQUNsQyxhQUFPLGdCQUFnQixFQUFFLE9BQU8sY0FBYyxJQUFJLEVBQUUsTUFBTTtBQUFBLElBQzlEO0FBQ0EsSUFBQUEsc0JBQXFCLFNBQVM7QUFBQSxFQUNsQyxHQUFHLHlCQUF5Qix1QkFBdUIsQ0FBQyxFQUFFO0FBSy9DLE1BQUk7QUFDWCxHQUFDLFNBQVVDLHVCQUFzQjtBQUM3QixhQUFTLE9BQU8sT0FBTyxrQkFBa0IsWUFBWTtBQUNqRCxVQUFJLFNBQVMsRUFBRSxNQUFNO0FBQ3JCLFVBQUksR0FBRyxRQUFRLGFBQWEsR0FBRztBQUMzQixlQUFPLGdCQUFnQjtBQUFBLE1BQzNCO0FBQ0EsVUFBSSxHQUFHLFFBQVEsVUFBVSxHQUFHO0FBQ3hCLGVBQU8sYUFBYTtBQUFBLE1BQ3hCLE9BQ0s7QUFDRCxlQUFPLGFBQWEsQ0FBQztBQUFBLE1BQ3pCO0FBQ0EsYUFBTztBQUFBLElBQ1g7QUFDQSxJQUFBQSxzQkFBcUIsU0FBUztBQUFBLEVBQ2xDLEdBQUcseUJBQXlCLHVCQUF1QixDQUFDLEVBQUU7QUFJL0MsTUFBSTtBQUNYLEdBQUMsU0FBVUMsd0JBQXVCO0FBSTlCLElBQUFBLHVCQUFzQixPQUFPO0FBSTdCLElBQUFBLHVCQUFzQixPQUFPO0FBSTdCLElBQUFBLHVCQUFzQixRQUFRO0FBQUEsRUFDbEMsR0FBRywwQkFBMEIsd0JBQXdCLENBQUMsRUFBRTtBQUtqRCxNQUFJO0FBQ1gsR0FBQyxTQUFVQyxvQkFBbUI7QUFNMUIsYUFBUyxPQUFPLE9BQU8sTUFBTTtBQUN6QixVQUFJLFNBQVMsRUFBRSxNQUFNO0FBQ3JCLFVBQUksR0FBRyxPQUFPLElBQUksR0FBRztBQUNqQixlQUFPLE9BQU87QUFBQSxNQUNsQjtBQUNBLGFBQU87QUFBQSxJQUNYO0FBQ0EsSUFBQUEsbUJBQWtCLFNBQVM7QUFBQSxFQUMvQixHQUFHLHNCQUFzQixvQkFBb0IsQ0FBQyxFQUFFO0FBSXpDLE1BQUk7QUFDWCxHQUFDLFNBQVVDLGFBQVk7QUFDbkIsSUFBQUEsWUFBVyxPQUFPO0FBQ2xCLElBQUFBLFlBQVcsU0FBUztBQUNwQixJQUFBQSxZQUFXLFlBQVk7QUFDdkIsSUFBQUEsWUFBVyxVQUFVO0FBQ3JCLElBQUFBLFlBQVcsUUFBUTtBQUNuQixJQUFBQSxZQUFXLFNBQVM7QUFDcEIsSUFBQUEsWUFBVyxXQUFXO0FBQ3RCLElBQUFBLFlBQVcsUUFBUTtBQUNuQixJQUFBQSxZQUFXLGNBQWM7QUFDekIsSUFBQUEsWUFBVyxPQUFPO0FBQ2xCLElBQUFBLFlBQVcsWUFBWTtBQUN2QixJQUFBQSxZQUFXLFdBQVc7QUFDdEIsSUFBQUEsWUFBVyxXQUFXO0FBQ3RCLElBQUFBLFlBQVcsV0FBVztBQUN0QixJQUFBQSxZQUFXLFNBQVM7QUFDcEIsSUFBQUEsWUFBVyxTQUFTO0FBQ3BCLElBQUFBLFlBQVcsVUFBVTtBQUNyQixJQUFBQSxZQUFXLFFBQVE7QUFDbkIsSUFBQUEsWUFBVyxTQUFTO0FBQ3BCLElBQUFBLFlBQVcsTUFBTTtBQUNqQixJQUFBQSxZQUFXLE9BQU87QUFDbEIsSUFBQUEsWUFBVyxhQUFhO0FBQ3hCLElBQUFBLFlBQVcsU0FBUztBQUNwQixJQUFBQSxZQUFXLFFBQVE7QUFDbkIsSUFBQUEsWUFBVyxXQUFXO0FBQ3RCLElBQUFBLFlBQVcsZ0JBQWdCO0FBQUEsRUFDL0IsR0FBRyxlQUFlLGFBQWEsQ0FBQyxFQUFFO0FBTTNCLE1BQUk7QUFDWCxHQUFDLFNBQVVDLFlBQVc7QUFJbEIsSUFBQUEsV0FBVSxhQUFhO0FBQUEsRUFDM0IsR0FBRyxjQUFjLFlBQVksQ0FBQyxFQUFFO0FBQ3pCLE1BQUk7QUFDWCxHQUFDLFNBQVVDLG9CQUFtQjtBQVUxQixhQUFTLE9BQU8sTUFBTSxNQUFNLE9BQU8sS0FBSyxlQUFlO0FBQ25ELFVBQUksU0FBUztBQUFBLFFBQ1Q7QUFBQSxRQUNBO0FBQUEsUUFDQSxVQUFVLEVBQUUsS0FBSyxNQUFNO0FBQUEsTUFDM0I7QUFDQSxVQUFJLGVBQWU7QUFDZixlQUFPLGdCQUFnQjtBQUFBLE1BQzNCO0FBQ0EsYUFBTztBQUFBLElBQ1g7QUFDQSxJQUFBQSxtQkFBa0IsU0FBUztBQUFBLEVBQy9CLEdBQUcsc0JBQXNCLG9CQUFvQixDQUFDLEVBQUU7QUFDekMsTUFBSTtBQUNYLEdBQUMsU0FBVUMsa0JBQWlCO0FBVXhCLGFBQVMsT0FBTyxNQUFNLE1BQU0sS0FBSyxPQUFPO0FBQ3BDLGFBQU8sVUFBVSxTQUNYLEVBQUUsTUFBTSxNQUFNLFVBQVUsRUFBRSxLQUFLLE1BQU0sRUFBRSxJQUN2QyxFQUFFLE1BQU0sTUFBTSxVQUFVLEVBQUUsSUFBSSxFQUFFO0FBQUEsSUFDMUM7QUFDQSxJQUFBQSxpQkFBZ0IsU0FBUztBQUFBLEVBQzdCLEdBQUcsb0JBQW9CLGtCQUFrQixDQUFDLEVBQUU7QUFDckMsTUFBSTtBQUNYLEdBQUMsU0FBVUMsaUJBQWdCO0FBV3ZCLGFBQVMsT0FBTyxNQUFNLFFBQVEsTUFBTSxPQUFPLGdCQUFnQixVQUFVO0FBQ2pFLFVBQUksU0FBUztBQUFBLFFBQ1Q7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsTUFDSjtBQUNBLFVBQUksYUFBYSxRQUFXO0FBQ3hCLGVBQU8sV0FBVztBQUFBLE1BQ3RCO0FBQ0EsYUFBTztBQUFBLElBQ1g7QUFDQSxJQUFBQSxnQkFBZSxTQUFTO0FBSXhCLGFBQVMsR0FBRyxPQUFPO0FBQ2YsVUFBSSxZQUFZO0FBQ2hCLGFBQU8sYUFDSCxHQUFHLE9BQU8sVUFBVSxJQUFJLEtBQUssR0FBRyxPQUFPLFVBQVUsSUFBSSxLQUNyRGYsT0FBTSxHQUFHLFVBQVUsS0FBSyxLQUFLQSxPQUFNLEdBQUcsVUFBVSxjQUFjLE1BQzdELFVBQVUsV0FBVyxVQUFhLEdBQUcsT0FBTyxVQUFVLE1BQU0sT0FDNUQsVUFBVSxlQUFlLFVBQWEsR0FBRyxRQUFRLFVBQVUsVUFBVSxPQUNyRSxVQUFVLGFBQWEsVUFBYSxNQUFNLFFBQVEsVUFBVSxRQUFRLE9BQ3BFLFVBQVUsU0FBUyxVQUFhLE1BQU0sUUFBUSxVQUFVLElBQUk7QUFBQSxJQUNyRTtBQUNBLElBQUFlLGdCQUFlLEtBQUs7QUFBQSxFQUN4QixHQUFHLG1CQUFtQixpQkFBaUIsQ0FBQyxFQUFFO0FBSW5DLE1BQUk7QUFDWCxHQUFDLFNBQVVDLGlCQUFnQjtBQUl2QixJQUFBQSxnQkFBZSxRQUFRO0FBSXZCLElBQUFBLGdCQUFlLFdBQVc7QUFJMUIsSUFBQUEsZ0JBQWUsV0FBVztBQVkxQixJQUFBQSxnQkFBZSxrQkFBa0I7QUFXakMsSUFBQUEsZ0JBQWUsaUJBQWlCO0FBYWhDLElBQUFBLGdCQUFlLGtCQUFrQjtBQU1qQyxJQUFBQSxnQkFBZSxTQUFTO0FBSXhCLElBQUFBLGdCQUFlLHdCQUF3QjtBQVN2QyxJQUFBQSxnQkFBZSxlQUFlO0FBQUEsRUFDbEMsR0FBRyxtQkFBbUIsaUJBQWlCLENBQUMsRUFBRTtBQU1uQyxNQUFJO0FBQ1gsR0FBQyxTQUFVQyx3QkFBdUI7QUFJOUIsSUFBQUEsdUJBQXNCLFVBQVU7QUFPaEMsSUFBQUEsdUJBQXNCLFlBQVk7QUFBQSxFQUN0QyxHQUFHLDBCQUEwQix3QkFBd0IsQ0FBQyxFQUFFO0FBS2pELE1BQUk7QUFDWCxHQUFDLFNBQVVDLG9CQUFtQjtBQUkxQixhQUFTLE9BQU8sYUFBYSxNQUFNLGFBQWE7QUFDNUMsVUFBSSxTQUFTLEVBQUUsWUFBWTtBQUMzQixVQUFJLFNBQVMsVUFBYSxTQUFTLE1BQU07QUFDckMsZUFBTyxPQUFPO0FBQUEsTUFDbEI7QUFDQSxVQUFJLGdCQUFnQixVQUFhLGdCQUFnQixNQUFNO0FBQ25ELGVBQU8sY0FBYztBQUFBLE1BQ3pCO0FBQ0EsYUFBTztBQUFBLElBQ1g7QUFDQSxJQUFBQSxtQkFBa0IsU0FBUztBQUkzQixhQUFTLEdBQUcsT0FBTztBQUNmLFVBQUksWUFBWTtBQUNoQixhQUFPLEdBQUcsUUFBUSxTQUFTLEtBQUssR0FBRyxXQUFXLFVBQVUsYUFBYSxXQUFXLEVBQUUsTUFDMUUsVUFBVSxTQUFTLFVBQWEsR0FBRyxXQUFXLFVBQVUsTUFBTSxHQUFHLE1BQU0sT0FDdkUsVUFBVSxnQkFBZ0IsVUFBYSxVQUFVLGdCQUFnQixzQkFBc0IsV0FBVyxVQUFVLGdCQUFnQixzQkFBc0I7QUFBQSxJQUM5SjtBQUNBLElBQUFBLG1CQUFrQixLQUFLO0FBQUEsRUFDM0IsR0FBRyxzQkFBc0Isb0JBQW9CLENBQUMsRUFBRTtBQUN6QyxNQUFJO0FBQ1gsR0FBQyxTQUFVQyxhQUFZO0FBQ25CLGFBQVMsT0FBTyxPQUFPLHFCQUFxQixNQUFNO0FBQzlDLFVBQUksU0FBUyxFQUFFLE1BQU07QUFDckIsVUFBSSxZQUFZO0FBQ2hCLFVBQUksT0FBTyx3QkFBd0IsVUFBVTtBQUN6QyxvQkFBWTtBQUNaLGVBQU8sT0FBTztBQUFBLE1BQ2xCLFdBQ1MsUUFBUSxHQUFHLG1CQUFtQixHQUFHO0FBQ3RDLGVBQU8sVUFBVTtBQUFBLE1BQ3JCLE9BQ0s7QUFDRCxlQUFPLE9BQU87QUFBQSxNQUNsQjtBQUNBLFVBQUksYUFBYSxTQUFTLFFBQVc7QUFDakMsZUFBTyxPQUFPO0FBQUEsTUFDbEI7QUFDQSxhQUFPO0FBQUEsSUFDWDtBQUNBLElBQUFBLFlBQVcsU0FBUztBQUNwQixhQUFTLEdBQUcsT0FBTztBQUNmLFVBQUksWUFBWTtBQUNoQixhQUFPLGFBQWEsR0FBRyxPQUFPLFVBQVUsS0FBSyxNQUN4QyxVQUFVLGdCQUFnQixVQUFhLEdBQUcsV0FBVyxVQUFVLGFBQWEsV0FBVyxFQUFFLE9BQ3pGLFVBQVUsU0FBUyxVQUFhLEdBQUcsT0FBTyxVQUFVLElBQUksT0FDeEQsVUFBVSxTQUFTLFVBQWEsVUFBVSxZQUFZLFlBQ3RELFVBQVUsWUFBWSxVQUFhLFFBQVEsR0FBRyxVQUFVLE9BQU8sT0FDL0QsVUFBVSxnQkFBZ0IsVUFBYSxHQUFHLFFBQVEsVUFBVSxXQUFXLE9BQ3ZFLFVBQVUsU0FBUyxVQUFhLGNBQWMsR0FBRyxVQUFVLElBQUk7QUFBQSxJQUN4RTtBQUNBLElBQUFBLFlBQVcsS0FBSztBQUFBLEVBQ3BCLEdBQUcsZUFBZSxhQUFhLENBQUMsRUFBRTtBQUszQixNQUFJO0FBQ1gsR0FBQyxTQUFVQyxXQUFVO0FBSWpCLGFBQVMsT0FBTyxPQUFPLE1BQU07QUFDekIsVUFBSSxTQUFTLEVBQUUsTUFBTTtBQUNyQixVQUFJLEdBQUcsUUFBUSxJQUFJLEdBQUc7QUFDbEIsZUFBTyxPQUFPO0FBQUEsTUFDbEI7QUFDQSxhQUFPO0FBQUEsSUFDWDtBQUNBLElBQUFBLFVBQVMsU0FBUztBQUlsQixhQUFTLEdBQUcsT0FBTztBQUNmLFVBQUksWUFBWTtBQUNoQixhQUFPLEdBQUcsUUFBUSxTQUFTLEtBQUtwQixPQUFNLEdBQUcsVUFBVSxLQUFLLE1BQU0sR0FBRyxVQUFVLFVBQVUsT0FBTyxLQUFLLFFBQVEsR0FBRyxVQUFVLE9BQU87QUFBQSxJQUNqSTtBQUNBLElBQUFvQixVQUFTLEtBQUs7QUFBQSxFQUNsQixHQUFHLGFBQWEsV0FBVyxDQUFDLEVBQUU7QUFLdkIsTUFBSTtBQUNYLEdBQUMsU0FBVUMsb0JBQW1CO0FBSTFCLGFBQVMsT0FBTyxTQUFTLGNBQWM7QUFDbkMsYUFBTyxFQUFFLFNBQVMsYUFBYTtBQUFBLElBQ25DO0FBQ0EsSUFBQUEsbUJBQWtCLFNBQVM7QUFJM0IsYUFBUyxHQUFHLE9BQU87QUFDZixVQUFJLFlBQVk7QUFDaEIsYUFBTyxHQUFHLFFBQVEsU0FBUyxLQUFLLEdBQUcsU0FBUyxVQUFVLE9BQU8sS0FBSyxHQUFHLFFBQVEsVUFBVSxZQUFZO0FBQUEsSUFDdkc7QUFDQSxJQUFBQSxtQkFBa0IsS0FBSztBQUFBLEVBQzNCLEdBQUcsc0JBQXNCLG9CQUFvQixDQUFDLEVBQUU7QUFLekMsTUFBSTtBQUNYLEdBQUMsU0FBVUMsZUFBYztBQUlyQixhQUFTLE9BQU8sT0FBTyxRQUFRLE1BQU07QUFDakMsYUFBTyxFQUFFLE9BQU8sUUFBUSxLQUFLO0FBQUEsSUFDakM7QUFDQSxJQUFBQSxjQUFhLFNBQVM7QUFJdEIsYUFBUyxHQUFHLE9BQU87QUFDZixVQUFJLFlBQVk7QUFDaEIsYUFBTyxHQUFHLFFBQVEsU0FBUyxLQUFLdEIsT0FBTSxHQUFHLFVBQVUsS0FBSyxNQUFNLEdBQUcsVUFBVSxVQUFVLE1BQU0sS0FBSyxHQUFHLE9BQU8sVUFBVSxNQUFNO0FBQUEsSUFDOUg7QUFDQSxJQUFBc0IsY0FBYSxLQUFLO0FBQUEsRUFDdEIsR0FBRyxpQkFBaUIsZUFBZSxDQUFDLEVBQUU7QUFLL0IsTUFBSTtBQUNYLEdBQUMsU0FBVUMsaUJBQWdCO0FBTXZCLGFBQVMsT0FBTyxPQUFPLFFBQVE7QUFDM0IsYUFBTyxFQUFFLE9BQU8sT0FBTztBQUFBLElBQzNCO0FBQ0EsSUFBQUEsZ0JBQWUsU0FBUztBQUN4QixhQUFTLEdBQUcsT0FBTztBQUNmLFVBQUksWUFBWTtBQUNoQixhQUFPLEdBQUcsY0FBYyxTQUFTLEtBQUt2QixPQUFNLEdBQUcsVUFBVSxLQUFLLE1BQU0sVUFBVSxXQUFXLFVBQWF1QixnQkFBZSxHQUFHLFVBQVUsTUFBTTtBQUFBLElBQzVJO0FBQ0EsSUFBQUEsZ0JBQWUsS0FBSztBQUFBLEVBQ3hCLEdBQUcsbUJBQW1CLGlCQUFpQixDQUFDLEVBQUU7QUFRbkMsTUFBSTtBQUNYLEdBQUMsU0FBVUMscUJBQW9CO0FBQzNCLElBQUFBLG9CQUFtQixXQUFXLElBQUk7QUFLbEMsSUFBQUEsb0JBQW1CLE1BQU0sSUFBSTtBQUM3QixJQUFBQSxvQkFBbUIsT0FBTyxJQUFJO0FBQzlCLElBQUFBLG9CQUFtQixNQUFNLElBQUk7QUFDN0IsSUFBQUEsb0JBQW1CLFdBQVcsSUFBSTtBQUNsQyxJQUFBQSxvQkFBbUIsUUFBUSxJQUFJO0FBQy9CLElBQUFBLG9CQUFtQixlQUFlLElBQUk7QUFDdEMsSUFBQUEsb0JBQW1CLFdBQVcsSUFBSTtBQUNsQyxJQUFBQSxvQkFBbUIsVUFBVSxJQUFJO0FBQ2pDLElBQUFBLG9CQUFtQixVQUFVLElBQUk7QUFDakMsSUFBQUEsb0JBQW1CLFlBQVksSUFBSTtBQUNuQyxJQUFBQSxvQkFBbUIsT0FBTyxJQUFJO0FBQzlCLElBQUFBLG9CQUFtQixVQUFVLElBQUk7QUFDakMsSUFBQUEsb0JBQW1CLFFBQVEsSUFBSTtBQUMvQixJQUFBQSxvQkFBbUIsT0FBTyxJQUFJO0FBQzlCLElBQUFBLG9CQUFtQixTQUFTLElBQUk7QUFDaEMsSUFBQUEsb0JBQW1CLFVBQVUsSUFBSTtBQUNqQyxJQUFBQSxvQkFBbUIsU0FBUyxJQUFJO0FBQ2hDLElBQUFBLG9CQUFtQixRQUFRLElBQUk7QUFDL0IsSUFBQUEsb0JBQW1CLFFBQVEsSUFBSTtBQUMvQixJQUFBQSxvQkFBbUIsUUFBUSxJQUFJO0FBQy9CLElBQUFBLG9CQUFtQixVQUFVLElBQUk7QUFJakMsSUFBQUEsb0JBQW1CLFdBQVcsSUFBSTtBQUFBLEVBQ3RDLEdBQUcsdUJBQXVCLHFCQUFxQixDQUFDLEVBQUU7QUFRM0MsTUFBSTtBQUNYLEdBQUMsU0FBVUMseUJBQXdCO0FBQy9CLElBQUFBLHdCQUF1QixhQUFhLElBQUk7QUFDeEMsSUFBQUEsd0JBQXVCLFlBQVksSUFBSTtBQUN2QyxJQUFBQSx3QkFBdUIsVUFBVSxJQUFJO0FBQ3JDLElBQUFBLHdCQUF1QixRQUFRLElBQUk7QUFDbkMsSUFBQUEsd0JBQXVCLFlBQVksSUFBSTtBQUN2QyxJQUFBQSx3QkFBdUIsVUFBVSxJQUFJO0FBQ3JDLElBQUFBLHdCQUF1QixPQUFPLElBQUk7QUFDbEMsSUFBQUEsd0JBQXVCLGNBQWMsSUFBSTtBQUN6QyxJQUFBQSx3QkFBdUIsZUFBZSxJQUFJO0FBQzFDLElBQUFBLHdCQUF1QixnQkFBZ0IsSUFBSTtBQUFBLEVBQy9DLEdBQUcsMkJBQTJCLHlCQUF5QixDQUFDLEVBQUU7QUFJbkQsTUFBSTtBQUNYLEdBQUMsU0FBVUMsaUJBQWdCO0FBQ3ZCLGFBQVMsR0FBRyxPQUFPO0FBQ2YsWUFBTSxZQUFZO0FBQ2xCLGFBQU8sR0FBRyxjQUFjLFNBQVMsTUFBTSxVQUFVLGFBQWEsVUFBYSxPQUFPLFVBQVUsYUFBYSxhQUNyRyxNQUFNLFFBQVEsVUFBVSxJQUFJLE1BQU0sVUFBVSxLQUFLLFdBQVcsS0FBSyxPQUFPLFVBQVUsS0FBSyxDQUFDLE1BQU07QUFBQSxJQUN0RztBQUNBLElBQUFBLGdCQUFlLEtBQUs7QUFBQSxFQUN4QixHQUFHLG1CQUFtQixpQkFBaUIsQ0FBQyxFQUFFO0FBTW5DLE1BQUk7QUFDWCxHQUFDLFNBQVVDLGtCQUFpQjtBQUl4QixhQUFTLE9BQU8sT0FBTyxNQUFNO0FBQ3pCLGFBQU8sRUFBRSxPQUFPLEtBQUs7QUFBQSxJQUN6QjtBQUNBLElBQUFBLGlCQUFnQixTQUFTO0FBQ3pCLGFBQVMsR0FBRyxPQUFPO0FBQ2YsWUFBTSxZQUFZO0FBQ2xCLGFBQU8sY0FBYyxVQUFhLGNBQWMsUUFBUTNCLE9BQU0sR0FBRyxVQUFVLEtBQUssS0FBSyxHQUFHLE9BQU8sVUFBVSxJQUFJO0FBQUEsSUFDakg7QUFDQSxJQUFBMkIsaUJBQWdCLEtBQUs7QUFBQSxFQUN6QixHQUFHLG9CQUFvQixrQkFBa0IsQ0FBQyxFQUFFO0FBTXJDLE1BQUk7QUFDWCxHQUFDLFNBQVVDLDRCQUEyQjtBQUlsQyxhQUFTLE9BQU8sT0FBTyxjQUFjLHFCQUFxQjtBQUN0RCxhQUFPLEVBQUUsT0FBTyxjQUFjLG9CQUFvQjtBQUFBLElBQ3REO0FBQ0EsSUFBQUEsMkJBQTBCLFNBQVM7QUFDbkMsYUFBUyxHQUFHLE9BQU87QUFDZixZQUFNLFlBQVk7QUFDbEIsYUFBTyxjQUFjLFVBQWEsY0FBYyxRQUFRNUIsT0FBTSxHQUFHLFVBQVUsS0FBSyxLQUFLLEdBQUcsUUFBUSxVQUFVLG1CQUFtQixNQUNySCxHQUFHLE9BQU8sVUFBVSxZQUFZLEtBQUssVUFBVSxpQkFBaUI7QUFBQSxJQUM1RTtBQUNBLElBQUE0QiwyQkFBMEIsS0FBSztBQUFBLEVBQ25DLEdBQUcsOEJBQThCLDRCQUE0QixDQUFDLEVBQUU7QUFNekQsTUFBSTtBQUNYLEdBQUMsU0FBVUMsbUNBQWtDO0FBSXpDLGFBQVMsT0FBTyxPQUFPLFlBQVk7QUFDL0IsYUFBTyxFQUFFLE9BQU8sV0FBVztBQUFBLElBQy9CO0FBQ0EsSUFBQUEsa0NBQWlDLFNBQVM7QUFDMUMsYUFBUyxHQUFHLE9BQU87QUFDZixZQUFNLFlBQVk7QUFDbEIsYUFBTyxjQUFjLFVBQWEsY0FBYyxRQUFRN0IsT0FBTSxHQUFHLFVBQVUsS0FBSyxNQUN4RSxHQUFHLE9BQU8sVUFBVSxVQUFVLEtBQUssVUFBVSxlQUFlO0FBQUEsSUFDeEU7QUFDQSxJQUFBNkIsa0NBQWlDLEtBQUs7QUFBQSxFQUMxQyxHQUFHLHFDQUFxQyxtQ0FBbUMsQ0FBQyxFQUFFO0FBT3ZFLE1BQUk7QUFDWCxHQUFDLFNBQVVDLHFCQUFvQjtBQUkzQixhQUFTLE9BQU8sU0FBUyxpQkFBaUI7QUFDdEMsYUFBTyxFQUFFLFNBQVMsZ0JBQWdCO0FBQUEsSUFDdEM7QUFDQSxJQUFBQSxvQkFBbUIsU0FBUztBQUk1QixhQUFTLEdBQUcsT0FBTztBQUNmLFlBQU0sWUFBWTtBQUNsQixhQUFPLEdBQUcsUUFBUSxTQUFTLEtBQUs5QixPQUFNLEdBQUcsTUFBTSxlQUFlO0FBQUEsSUFDbEU7QUFDQSxJQUFBOEIsb0JBQW1CLEtBQUs7QUFBQSxFQUM1QixHQUFHLHVCQUF1QixxQkFBcUIsQ0FBQyxFQUFFO0FBTTNDLE1BQUk7QUFDWCxHQUFDLFNBQVVDLGdCQUFlO0FBSXRCLElBQUFBLGVBQWMsT0FBTztBQUlyQixJQUFBQSxlQUFjLFlBQVk7QUFDMUIsYUFBUyxHQUFHLE9BQU87QUFDZixhQUFPLFVBQVUsS0FBSyxVQUFVO0FBQUEsSUFDcEM7QUFDQSxJQUFBQSxlQUFjLEtBQUs7QUFBQSxFQUN2QixHQUFHLGtCQUFrQixnQkFBZ0IsQ0FBQyxFQUFFO0FBQ2pDLE1BQUk7QUFDWCxHQUFDLFNBQVVDLHFCQUFvQjtBQUMzQixhQUFTLE9BQU8sT0FBTztBQUNuQixhQUFPLEVBQUUsTUFBTTtBQUFBLElBQ25CO0FBQ0EsSUFBQUEsb0JBQW1CLFNBQVM7QUFDNUIsYUFBUyxHQUFHLE9BQU87QUFDZixZQUFNLFlBQVk7QUFDbEIsYUFBTyxHQUFHLGNBQWMsU0FBUyxNQUN6QixVQUFVLFlBQVksVUFBYSxHQUFHLE9BQU8sVUFBVSxPQUFPLEtBQUssY0FBYyxHQUFHLFVBQVUsT0FBTyxPQUNyRyxVQUFVLGFBQWEsVUFBYSxTQUFTLEdBQUcsVUFBVSxRQUFRLE9BQ2xFLFVBQVUsWUFBWSxVQUFhLFFBQVEsR0FBRyxVQUFVLE9BQU87QUFBQSxJQUMzRTtBQUNBLElBQUFBLG9CQUFtQixLQUFLO0FBQUEsRUFDNUIsR0FBRyx1QkFBdUIscUJBQXFCLENBQUMsRUFBRTtBQUMzQyxNQUFJO0FBQ1gsR0FBQyxTQUFVQyxZQUFXO0FBQ2xCLGFBQVMsT0FBTyxVQUFVLE9BQU8sTUFBTTtBQUNuQyxZQUFNLFNBQVMsRUFBRSxVQUFVLE1BQU07QUFDakMsVUFBSSxTQUFTLFFBQVc7QUFDcEIsZUFBTyxPQUFPO0FBQUEsTUFDbEI7QUFDQSxhQUFPO0FBQUEsSUFDWDtBQUNBLElBQUFBLFdBQVUsU0FBUztBQUNuQixhQUFTLEdBQUcsT0FBTztBQUNmLFlBQU0sWUFBWTtBQUNsQixhQUFPLEdBQUcsY0FBYyxTQUFTLEtBQUtDLFVBQVMsR0FBRyxVQUFVLFFBQVEsTUFDNUQsR0FBRyxPQUFPLFVBQVUsS0FBSyxLQUFLLEdBQUcsV0FBVyxVQUFVLE9BQU8sbUJBQW1CLEVBQUUsT0FDbEYsVUFBVSxTQUFTLFVBQWEsY0FBYyxHQUFHLFVBQVUsSUFBSSxNQUMvRCxVQUFVLGNBQWMsVUFBYyxHQUFHLFdBQVcsVUFBVSxXQUFXLFNBQVMsRUFBRSxNQUNwRixVQUFVLFlBQVksVUFBYSxHQUFHLE9BQU8sVUFBVSxPQUFPLEtBQUssY0FBYyxHQUFHLFVBQVUsT0FBTyxPQUNyRyxVQUFVLGdCQUFnQixVQUFhLEdBQUcsUUFBUSxVQUFVLFdBQVcsT0FDdkUsVUFBVSxpQkFBaUIsVUFBYSxHQUFHLFFBQVEsVUFBVSxZQUFZO0FBQUEsSUFDckY7QUFDQSxJQUFBRCxXQUFVLEtBQUs7QUFBQSxFQUNuQixHQUFHLGNBQWMsWUFBWSxDQUFDLEVBQUU7QUFDekIsTUFBSTtBQUNYLEdBQUMsU0FBVUUsY0FBYTtBQUNwQixhQUFTLGNBQWMsT0FBTztBQUMxQixhQUFPLEVBQUUsTUFBTSxXQUFXLE1BQU07QUFBQSxJQUNwQztBQUNBLElBQUFBLGFBQVksZ0JBQWdCO0FBQUEsRUFDaEMsR0FBRyxnQkFBZ0IsY0FBYyxDQUFDLEVBQUU7QUFDN0IsTUFBSTtBQUNYLEdBQUMsU0FBVUMsdUJBQXNCO0FBQzdCLGFBQVMsT0FBTyxZQUFZLFlBQVksT0FBTyxTQUFTO0FBQ3BELGFBQU8sRUFBRSxZQUFZLFlBQVksT0FBTyxRQUFRO0FBQUEsSUFDcEQ7QUFDQSxJQUFBQSxzQkFBcUIsU0FBUztBQUFBLEVBQ2xDLEdBQUcseUJBQXlCLHVCQUF1QixDQUFDLEVBQUU7QUFDL0MsTUFBSTtBQUNYLEdBQUMsU0FBVUMsdUJBQXNCO0FBQzdCLGFBQVMsT0FBTyxPQUFPO0FBQ25CLGFBQU8sRUFBRSxNQUFNO0FBQUEsSUFDbkI7QUFDQSxJQUFBQSxzQkFBcUIsU0FBUztBQUFBLEVBQ2xDLEdBQUcseUJBQXlCLHVCQUF1QixDQUFDLEVBQUU7QUFPL0MsTUFBSTtBQUNYLEdBQUMsU0FBVUMsOEJBQTZCO0FBSXBDLElBQUFBLDZCQUE0QixVQUFVO0FBSXRDLElBQUFBLDZCQUE0QixZQUFZO0FBQUEsRUFDNUMsR0FBRyxnQ0FBZ0MsOEJBQThCLENBQUMsRUFBRTtBQUM3RCxNQUFJO0FBQ1gsR0FBQyxTQUFVQyx5QkFBd0I7QUFDL0IsYUFBUyxPQUFPLE9BQU8sTUFBTTtBQUN6QixhQUFPLEVBQUUsT0FBTyxLQUFLO0FBQUEsSUFDekI7QUFDQSxJQUFBQSx3QkFBdUIsU0FBUztBQUFBLEVBQ3BDLEdBQUcsMkJBQTJCLHlCQUF5QixDQUFDLEVBQUU7QUFDbkQsTUFBSTtBQUNYLEdBQUMsU0FBVUMsMEJBQXlCO0FBQ2hDLGFBQVMsT0FBTyxhQUFhLHdCQUF3QjtBQUNqRCxhQUFPLEVBQUUsYUFBYSx1QkFBdUI7QUFBQSxJQUNqRDtBQUNBLElBQUFBLHlCQUF3QixTQUFTO0FBQUEsRUFDckMsR0FBRyw0QkFBNEIsMEJBQTBCLENBQUMsRUFBRTtBQUNyRCxNQUFJO0FBQ1gsR0FBQyxTQUFVQyxrQkFBaUI7QUFDeEIsYUFBUyxHQUFHLE9BQU87QUFDZixZQUFNLFlBQVk7QUFDbEIsYUFBTyxHQUFHLGNBQWMsU0FBUyxLQUFLLElBQUksR0FBRyxVQUFVLEdBQUcsS0FBSyxHQUFHLE9BQU8sVUFBVSxJQUFJO0FBQUEsSUFDM0Y7QUFDQSxJQUFBQSxpQkFBZ0IsS0FBSztBQUFBLEVBQ3pCLEdBQUcsb0JBQW9CLGtCQUFrQixDQUFDLEVBQUU7QUFLckMsTUFBSTtBQUNYLEdBQUMsU0FBVUMsZUFBYztBQVFyQixhQUFTLE9BQU8sS0FBSyxZQUFZLFNBQVMsU0FBUztBQUMvQyxhQUFPLElBQUksaUJBQWlCLEtBQUssWUFBWSxTQUFTLE9BQU87QUFBQSxJQUNqRTtBQUNBLElBQUFBLGNBQWEsU0FBUztBQUl0QixhQUFTLEdBQUcsT0FBTztBQUNmLFVBQUksWUFBWTtBQUNoQixhQUFPLEdBQUcsUUFBUSxTQUFTLEtBQUssR0FBRyxPQUFPLFVBQVUsR0FBRyxNQUFNLEdBQUcsVUFBVSxVQUFVLFVBQVUsS0FBSyxHQUFHLE9BQU8sVUFBVSxVQUFVLE1BQU0sR0FBRyxTQUFTLFVBQVUsU0FBUyxLQUMvSixHQUFHLEtBQUssVUFBVSxPQUFPLEtBQUssR0FBRyxLQUFLLFVBQVUsVUFBVSxLQUFLLEdBQUcsS0FBSyxVQUFVLFFBQVEsSUFBSSxPQUFPO0FBQUEsSUFDL0c7QUFDQSxJQUFBQSxjQUFhLEtBQUs7QUFDbEIsYUFBUyxXQUFXLFVBQVUsT0FBTztBQUNqQyxVQUFJLE9BQU8sU0FBUyxRQUFRO0FBQzVCLFVBQUksY0FBYyxVQUFVLE9BQU8sQ0FBQyxHQUFHLE1BQU07QUFDekMsWUFBSSxPQUFPLEVBQUUsTUFBTSxNQUFNLE9BQU8sRUFBRSxNQUFNLE1BQU07QUFDOUMsWUFBSSxTQUFTLEdBQUc7QUFDWixpQkFBTyxFQUFFLE1BQU0sTUFBTSxZQUFZLEVBQUUsTUFBTSxNQUFNO0FBQUEsUUFDbkQ7QUFDQSxlQUFPO0FBQUEsTUFDWCxDQUFDO0FBQ0QsVUFBSSxxQkFBcUIsS0FBSztBQUM5QixlQUFTLElBQUksWUFBWSxTQUFTLEdBQUcsS0FBSyxHQUFHLEtBQUs7QUFDOUMsWUFBSSxJQUFJLFlBQVksQ0FBQztBQUNyQixZQUFJLGNBQWMsU0FBUyxTQUFTLEVBQUUsTUFBTSxLQUFLO0FBQ2pELFlBQUksWUFBWSxTQUFTLFNBQVMsRUFBRSxNQUFNLEdBQUc7QUFDN0MsWUFBSSxhQUFhLG9CQUFvQjtBQUNqQyxpQkFBTyxLQUFLLFVBQVUsR0FBRyxXQUFXLElBQUksRUFBRSxVQUFVLEtBQUssVUFBVSxXQUFXLEtBQUssTUFBTTtBQUFBLFFBQzdGLE9BQ0s7QUFDRCxnQkFBTSxJQUFJLE1BQU0sa0JBQWtCO0FBQUEsUUFDdEM7QUFDQSw2QkFBcUI7QUFBQSxNQUN6QjtBQUNBLGFBQU87QUFBQSxJQUNYO0FBQ0EsSUFBQUEsY0FBYSxhQUFhO0FBQzFCLGFBQVMsVUFBVSxNQUFNLFNBQVM7QUFDOUIsVUFBSSxLQUFLLFVBQVUsR0FBRztBQUVsQixlQUFPO0FBQUEsTUFDWDtBQUNBLFlBQU0sSUFBSyxLQUFLLFNBQVMsSUFBSztBQUM5QixZQUFNLE9BQU8sS0FBSyxNQUFNLEdBQUcsQ0FBQztBQUM1QixZQUFNLFFBQVEsS0FBSyxNQUFNLENBQUM7QUFDMUIsZ0JBQVUsTUFBTSxPQUFPO0FBQ3ZCLGdCQUFVLE9BQU8sT0FBTztBQUN4QixVQUFJLFVBQVU7QUFDZCxVQUFJLFdBQVc7QUFDZixVQUFJLElBQUk7QUFDUixhQUFPLFVBQVUsS0FBSyxVQUFVLFdBQVcsTUFBTSxRQUFRO0FBQ3JELFlBQUksTUFBTSxRQUFRLEtBQUssT0FBTyxHQUFHLE1BQU0sUUFBUSxDQUFDO0FBQ2hELFlBQUksT0FBTyxHQUFHO0FBRVYsZUFBSyxHQUFHLElBQUksS0FBSyxTQUFTO0FBQUEsUUFDOUIsT0FDSztBQUVELGVBQUssR0FBRyxJQUFJLE1BQU0sVUFBVTtBQUFBLFFBQ2hDO0FBQUEsTUFDSjtBQUNBLGFBQU8sVUFBVSxLQUFLLFFBQVE7QUFDMUIsYUFBSyxHQUFHLElBQUksS0FBSyxTQUFTO0FBQUEsTUFDOUI7QUFDQSxhQUFPLFdBQVcsTUFBTSxRQUFRO0FBQzVCLGFBQUssR0FBRyxJQUFJLE1BQU0sVUFBVTtBQUFBLE1BQ2hDO0FBQ0EsYUFBTztBQUFBLElBQ1g7QUFBQSxFQUNKLEdBQUcsaUJBQWlCLGVBQWUsQ0FBQyxFQUFFO0FBSXRDLE1BQU0sbUJBQU4sTUFBdUI7QUFBQSxJQUNuQixZQUFZLEtBQUssWUFBWSxTQUFTLFNBQVM7QUFDM0MsV0FBSyxPQUFPO0FBQ1osV0FBSyxjQUFjO0FBQ25CLFdBQUssV0FBVztBQUNoQixXQUFLLFdBQVc7QUFDaEIsV0FBSyxlQUFlO0FBQUEsSUFDeEI7QUFBQSxJQUNBLElBQUksTUFBTTtBQUNOLGFBQU8sS0FBSztBQUFBLElBQ2hCO0FBQUEsSUFDQSxJQUFJLGFBQWE7QUFDYixhQUFPLEtBQUs7QUFBQSxJQUNoQjtBQUFBLElBQ0EsSUFBSSxVQUFVO0FBQ1YsYUFBTyxLQUFLO0FBQUEsSUFDaEI7QUFBQSxJQUNBLFFBQVEsT0FBTztBQUNYLFVBQUksT0FBTztBQUNQLFlBQUksUUFBUSxLQUFLLFNBQVMsTUFBTSxLQUFLO0FBQ3JDLFlBQUksTUFBTSxLQUFLLFNBQVMsTUFBTSxHQUFHO0FBQ2pDLGVBQU8sS0FBSyxTQUFTLFVBQVUsT0FBTyxHQUFHO0FBQUEsTUFDN0M7QUFDQSxhQUFPLEtBQUs7QUFBQSxJQUNoQjtBQUFBLElBQ0EsT0FBTyxPQUFPLFNBQVM7QUFDbkIsV0FBSyxXQUFXLE1BQU07QUFDdEIsV0FBSyxXQUFXO0FBQ2hCLFdBQUssZUFBZTtBQUFBLElBQ3hCO0FBQUEsSUFDQSxpQkFBaUI7QUFDYixVQUFJLEtBQUssaUJBQWlCLFFBQVc7QUFDakMsWUFBSSxjQUFjLENBQUM7QUFDbkIsWUFBSSxPQUFPLEtBQUs7QUFDaEIsWUFBSSxjQUFjO0FBQ2xCLGlCQUFTLElBQUksR0FBRyxJQUFJLEtBQUssUUFBUSxLQUFLO0FBQ2xDLGNBQUksYUFBYTtBQUNiLHdCQUFZLEtBQUssQ0FBQztBQUNsQiwwQkFBYztBQUFBLFVBQ2xCO0FBQ0EsY0FBSSxLQUFLLEtBQUssT0FBTyxDQUFDO0FBQ3RCLHdCQUFlLE9BQU8sUUFBUSxPQUFPO0FBQ3JDLGNBQUksT0FBTyxRQUFRLElBQUksSUFBSSxLQUFLLFVBQVUsS0FBSyxPQUFPLElBQUksQ0FBQyxNQUFNLE1BQU07QUFDbkU7QUFBQSxVQUNKO0FBQUEsUUFDSjtBQUNBLFlBQUksZUFBZSxLQUFLLFNBQVMsR0FBRztBQUNoQyxzQkFBWSxLQUFLLEtBQUssTUFBTTtBQUFBLFFBQ2hDO0FBQ0EsYUFBSyxlQUFlO0FBQUEsTUFDeEI7QUFDQSxhQUFPLEtBQUs7QUFBQSxJQUNoQjtBQUFBLElBQ0EsV0FBVyxRQUFRO0FBQ2YsZUFBUyxLQUFLLElBQUksS0FBSyxJQUFJLFFBQVEsS0FBSyxTQUFTLE1BQU0sR0FBRyxDQUFDO0FBQzNELFVBQUksY0FBYyxLQUFLLGVBQWU7QUFDdEMsVUFBSSxNQUFNLEdBQUcsT0FBTyxZQUFZO0FBQ2hDLFVBQUksU0FBUyxHQUFHO0FBQ1osZUFBT0MsVUFBUyxPQUFPLEdBQUcsTUFBTTtBQUFBLE1BQ3BDO0FBQ0EsYUFBTyxNQUFNLE1BQU07QUFDZixZQUFJLE1BQU0sS0FBSyxPQUFPLE1BQU0sUUFBUSxDQUFDO0FBQ3JDLFlBQUksWUFBWSxHQUFHLElBQUksUUFBUTtBQUMzQixpQkFBTztBQUFBLFFBQ1gsT0FDSztBQUNELGdCQUFNLE1BQU07QUFBQSxRQUNoQjtBQUFBLE1BQ0o7QUFHQSxVQUFJLE9BQU8sTUFBTTtBQUNqQixhQUFPQSxVQUFTLE9BQU8sTUFBTSxTQUFTLFlBQVksSUFBSSxDQUFDO0FBQUEsSUFDM0Q7QUFBQSxJQUNBLFNBQVMsVUFBVTtBQUNmLFVBQUksY0FBYyxLQUFLLGVBQWU7QUFDdEMsVUFBSSxTQUFTLFFBQVEsWUFBWSxRQUFRO0FBQ3JDLGVBQU8sS0FBSyxTQUFTO0FBQUEsTUFDekIsV0FDUyxTQUFTLE9BQU8sR0FBRztBQUN4QixlQUFPO0FBQUEsTUFDWDtBQUNBLFVBQUksYUFBYSxZQUFZLFNBQVMsSUFBSTtBQUMxQyxVQUFJLGlCQUFrQixTQUFTLE9BQU8sSUFBSSxZQUFZLFNBQVUsWUFBWSxTQUFTLE9BQU8sQ0FBQyxJQUFJLEtBQUssU0FBUztBQUMvRyxhQUFPLEtBQUssSUFBSSxLQUFLLElBQUksYUFBYSxTQUFTLFdBQVcsY0FBYyxHQUFHLFVBQVU7QUFBQSxJQUN6RjtBQUFBLElBQ0EsSUFBSSxZQUFZO0FBQ1osYUFBTyxLQUFLLGVBQWUsRUFBRTtBQUFBLElBQ2pDO0FBQUEsRUFDSjtBQUNBLE1BQUk7QUFDSixHQUFDLFNBQVVDLEtBQUk7QUFDWCxVQUFNLFdBQVcsT0FBTyxVQUFVO0FBQ2xDLGFBQVMsUUFBUSxPQUFPO0FBQ3BCLGFBQU8sT0FBTyxVQUFVO0FBQUEsSUFDNUI7QUFDQSxJQUFBQSxJQUFHLFVBQVU7QUFDYixhQUFTQyxXQUFVLE9BQU87QUFDdEIsYUFBTyxPQUFPLFVBQVU7QUFBQSxJQUM1QjtBQUNBLElBQUFELElBQUcsWUFBWUM7QUFDZixhQUFTLFFBQVEsT0FBTztBQUNwQixhQUFPLFVBQVUsUUFBUSxVQUFVO0FBQUEsSUFDdkM7QUFDQSxJQUFBRCxJQUFHLFVBQVU7QUFDYixhQUFTLE9BQU8sT0FBTztBQUNuQixhQUFPLFNBQVMsS0FBSyxLQUFLLE1BQU07QUFBQSxJQUNwQztBQUNBLElBQUFBLElBQUcsU0FBUztBQUNaLGFBQVMsT0FBTyxPQUFPO0FBQ25CLGFBQU8sU0FBUyxLQUFLLEtBQUssTUFBTTtBQUFBLElBQ3BDO0FBQ0EsSUFBQUEsSUFBRyxTQUFTO0FBQ1osYUFBUyxZQUFZLE9BQU8sS0FBSyxLQUFLO0FBQ2xDLGFBQU8sU0FBUyxLQUFLLEtBQUssTUFBTSxxQkFBcUIsT0FBTyxTQUFTLFNBQVM7QUFBQSxJQUNsRjtBQUNBLElBQUFBLElBQUcsY0FBYztBQUNqQixhQUFTRSxTQUFRLE9BQU87QUFDcEIsYUFBTyxTQUFTLEtBQUssS0FBSyxNQUFNLHFCQUFxQixlQUFlLFNBQVMsU0FBUztBQUFBLElBQzFGO0FBQ0EsSUFBQUYsSUFBRyxVQUFVRTtBQUNiLGFBQVNDLFVBQVMsT0FBTztBQUNyQixhQUFPLFNBQVMsS0FBSyxLQUFLLE1BQU0scUJBQXFCLEtBQUssU0FBUyxTQUFTO0FBQUEsSUFDaEY7QUFDQSxJQUFBSCxJQUFHLFdBQVdHO0FBQ2QsYUFBUyxLQUFLLE9BQU87QUFDakIsYUFBTyxTQUFTLEtBQUssS0FBSyxNQUFNO0FBQUEsSUFDcEM7QUFDQSxJQUFBSCxJQUFHLE9BQU87QUFDVixhQUFTLGNBQWMsT0FBTztBQUkxQixhQUFPLFVBQVUsUUFBUSxPQUFPLFVBQVU7QUFBQSxJQUM5QztBQUNBLElBQUFBLElBQUcsZ0JBQWdCO0FBQ25CLGFBQVMsV0FBVyxPQUFPLE9BQU87QUFDOUIsYUFBTyxNQUFNLFFBQVEsS0FBSyxLQUFLLE1BQU0sTUFBTSxLQUFLO0FBQUEsSUFDcEQ7QUFDQSxJQUFBQSxJQUFHLGFBQWE7QUFBQSxFQUNwQixHQUFHLE9BQU8sS0FBSyxDQUFDLEVBQUU7OztBUnhuRWxCLE1BQUksUUFBa0M7QUFNdEMsTUFBSSxpQkFBaUI7QUFHckIsTUFBTSxhQUEwQixvQkFBSSxJQUFJO0FBRXhDLE1BQUksdUJBQXVCO0FBTzNCLGlCQUFzQixRQUFRLGNBQXFDO0FBQy9ELFVBQU0sUUFBUSxhQUFhLFFBQVEsT0FBTyxFQUFFLEVBQUUsTUFBTSxHQUFHO0FBQ3ZELFVBQU0sWUFBWSxNQUFNLENBQUM7QUFDekIsVUFBTSxVQUFZLE1BQU0sQ0FBQztBQUN6QixVQUFNLFVBQVUscUJBQXFCLFNBQVMsSUFBSSxPQUFPLElBQUksTUFBTSxNQUFNLENBQUMsRUFBRSxLQUFLLEdBQUcsQ0FBQztBQUVyRixRQUFJLE9BQU87QUFFUCxlQUFTLE9BQU87QUFDaEI7QUFBQSxJQUNKO0FBRUEscUJBQWlCLHFCQUFxQixTQUFTO0FBRS9DLFVBQU0sUUFBUSxTQUFTLGFBQWEsV0FBVyxRQUFRO0FBQ3ZELFVBQU0sUUFBUSxHQUFHLEtBQUssTUFBTSxTQUFTLElBQUksc0NBQ2IsbUJBQW1CLFNBQVMsQ0FBQztBQUV6RCxVQUFNLEtBQUssSUFBSSxVQUFVLEtBQUs7QUFDOUIsVUFBTSxJQUFJLFFBQWMsQ0FBQyxTQUFTLFdBQVc7QUFDekMsU0FBRyxTQUFVLE1BQU0sUUFBUTtBQUMzQixTQUFHLFVBQVUsTUFBTSxPQUFPLElBQUksTUFBTSx3Q0FBd0MsS0FBSyxFQUFFLENBQUM7QUFBQSxJQUN4RixDQUFDO0FBRUQsVUFBTSxTQUFTLFNBQVMsRUFBRTtBQUMxQixVQUFNLFNBQVMsSUFBSSx1QkFBdUIsTUFBTTtBQUNoRCxVQUFNLFNBQVMsSUFBSSx1QkFBdUIsTUFBTTtBQUNoRCxnQkFBUSx3Q0FBd0IsUUFBUSxNQUFNO0FBRzlDLFVBQU0sZUFBZSxtQ0FBbUMsQ0FBQyxXQUF1RDtBQUM1RyxZQUFNLFFBQWUsT0FBTyxVQUFVLEVBQUUsS0FBSyxDQUFBSSxPQUFLQSxHQUFFLElBQUksU0FBUyxNQUFNLE9BQU8sR0FBRztBQUNqRixVQUFJLENBQUMsTUFBTztBQUNaLE1BQU8sT0FBTyxnQkFBZ0IsT0FBTyxZQUFZLE9BQU8sWUFBWSxJQUFJLFFBQU07QUFBQSxRQUMxRSxVQUFpQixZQUFZLEVBQUUsUUFBUTtBQUFBLFFBQ3ZDLFNBQWlCLEVBQUU7QUFBQSxRQUNuQixRQUFpQixFQUFFLFVBQVU7QUFBQSxRQUM3QixpQkFBaUIsRUFBRSxNQUFNLE1BQU0sT0FBTztBQUFBLFFBQ3RDLGFBQWlCLEVBQUUsTUFBTSxNQUFNLFlBQVk7QUFBQSxRQUMzQyxlQUFpQixFQUFFLE1BQU0sSUFBSSxPQUFPO0FBQUEsUUFDcEMsV0FBaUIsRUFBRSxNQUFNLElBQUksWUFBWTtBQUFBLE1BQzdDLEVBQUUsQ0FBQztBQUFBLElBQ1AsQ0FBQztBQUdELFVBQU0sVUFBVSx1QkFBdUIsQ0FBQyxXQUFvQztBQUN4RSx5QkFBbUIsT0FBTyxJQUFJO0FBQzlCLGFBQU8sRUFBRSxTQUFTLEtBQUs7QUFBQSxJQUMzQixDQUFDO0FBQ0QsVUFBTSxVQUFVLDJCQUEyQixDQUFDLFlBQ3ZDLE9BQU8sU0FBUyxDQUFDLEdBQUcsSUFBSSxNQUFNLGNBQWMsRUFBRSxJQUFJLENBQUM7QUFDeEQsVUFBTSxVQUFVLDZCQUE2QixNQUFNLElBQUk7QUFDdkQsVUFBTSxVQUFVLCtCQUErQixNQUFNLElBQUk7QUFDekQsVUFBTSxVQUFVLDZCQUE2QixNQUFNLElBQUk7QUFDdkQsVUFBTSxVQUFVLGtDQUFrQyxNQUFNLElBQUk7QUFDNUQsVUFBTSxlQUFlLHFCQUFxQixDQUFDLE1BQTJCLFFBQVEsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDO0FBQzdHLFVBQU0sZUFBZSxzQkFBc0IsQ0FBQyxNQUEyQixRQUFRLEtBQUssY0FBYyxHQUFHLE9BQU8sQ0FBQztBQUU3RyxVQUFNLGVBQWUsbUJBQW1CLE1BQU07QUFBQSxJQUF1QyxDQUFDO0FBQ3RGLFVBQU0sZUFBZSwyQkFBMkIsTUFBTTtBQUFBLElBQWdDLENBQUM7QUFFdkYsVUFBTSxPQUFPO0FBRWIsVUFBTSxVQUFVO0FBQ2hCLFVBQU0sTUFBTSxZQUFZLGNBQWM7QUFBQSxNQUNsQyxXQUFXO0FBQUEsTUFDWDtBQUFBLE1BQ0EsdUJBQXVCO0FBQUEsUUFDbkIsVUFBVSxjQUFjO0FBQUEsUUFDeEIsNEJBQTRCO0FBQUEsVUFDeEIsd0JBQW1DO0FBQUEsVUFDbkMsMEJBQW1DO0FBQUEsVUFDbkMsbUNBQW1DO0FBQUEsVUFDbkMsa0NBQW1DO0FBQUEsVUFDbkMsK0JBQW1DO0FBQUEsVUFDbkMsbUNBQW1DO0FBQUEsVUFDbkMsc0NBQXNDO0FBQUEsVUFDdEMsNkJBQW1DO0FBQUEsVUFDbkMsZ0NBQW1DO0FBQUEsVUFDbkMsdUJBQW1DLENBQUMsaUJBQWlCLG1CQUFtQixjQUFjO0FBQUEsUUFDMUY7QUFBQSxNQUNKO0FBQUEsTUFDQSxrQkFBa0IsQ0FBQyxFQUFFLEtBQUssU0FBUyxNQUFNLFVBQVUsQ0FBQztBQUFBLE1BQ3BELGNBQWM7QUFBQSxRQUNWLGNBQWM7QUFBQSxVQUNWLGlCQUFpQixFQUFFLHFCQUFxQixNQUFNLFVBQVUsT0FBTyxTQUFTLE1BQU0sbUJBQW1CLE1BQU07QUFBQSxVQUN2RyxZQUFZO0FBQUEsWUFDUixxQkFBcUI7QUFBQSxZQUNyQixnQkFBZ0I7QUFBQSxjQUNaLGdCQUF1QjtBQUFBLGNBQ3ZCLHFCQUF1QixDQUFDLFlBQVksV0FBVztBQUFBLGNBQy9DLG1CQUF1QjtBQUFBLGNBQ3ZCLHlCQUF5QjtBQUFBLGNBQ3pCLGdCQUF1QixFQUFFLFlBQVksQ0FBQyxpQkFBaUIsVUFBVSxxQkFBcUIsRUFBRTtBQUFBLFlBQzVGO0FBQUEsWUFDQSxnQkFBZ0I7QUFBQSxVQUNwQjtBQUFBLFVBQ0EsT0FBZ0IsRUFBRSxxQkFBcUIsTUFBTSxlQUFlLENBQUMsWUFBWSxXQUFXLEVBQUU7QUFBQSxVQUN0RixlQUFnQixFQUFFLHFCQUFxQixNQUFNLHNCQUFzQixFQUFFLHFCQUFxQixDQUFDLFlBQVksV0FBVyxHQUFHLHNCQUFzQixFQUFFLG9CQUFvQixLQUFLLEVBQUUsRUFBRTtBQUFBLFVBQzFLLFlBQWdCLEVBQUUscUJBQXFCLEtBQUs7QUFBQSxVQUM1QyxZQUFnQixFQUFFLHFCQUFxQixLQUFLO0FBQUEsVUFDNUMsZ0JBQWdCLEVBQUUscUJBQXFCLEtBQUs7QUFBQSxVQUM1QyxZQUFnQixFQUFFLHFCQUFxQixLQUFLO0FBQUEsVUFDNUMsaUJBQWlCLEVBQUUscUJBQXFCLEtBQUs7QUFBQSxVQUM3QyxRQUFnQixFQUFFLHFCQUFxQixNQUFNLGdCQUFnQixLQUFLO0FBQUEsVUFDbEUsWUFBWTtBQUFBLFlBQ1IscUJBQXFCO0FBQUEsWUFDckIsMEJBQTBCO0FBQUEsY0FDdEIsZ0JBQWdCO0FBQUEsZ0JBQ1osVUFBVTtBQUFBLGtCQUFDO0FBQUEsa0JBQVk7QUFBQSxrQkFBWTtBQUFBLGtCQUFvQjtBQUFBLGtCQUNuRDtBQUFBLGtCQUFvQjtBQUFBLGtCQUFVO0FBQUEsZ0JBQXdCO0FBQUEsY0FDOUQ7QUFBQSxZQUNKO0FBQUEsWUFDQSxvQkFBb0I7QUFBQSxZQUNwQixhQUFvQjtBQUFBLFlBQ3BCLGdCQUFvQixFQUFFLFlBQVksQ0FBQyxNQUFNLEVBQUU7QUFBQSxVQUMvQztBQUFBLFVBQ0Esb0JBQW9CLEVBQUUsb0JBQW9CLEtBQUs7QUFBQSxRQUNuRDtBQUFBLFFBQ0EsV0FBVztBQUFBLFVBQ1AsV0FBd0I7QUFBQSxVQUN4QixlQUF3QjtBQUFBLFVBQ3hCLGdCQUF3QixFQUFFLHFCQUFxQixLQUFLO0FBQUEsVUFDcEQsd0JBQXdCLEVBQUUscUJBQXFCLEtBQUs7QUFBQSxVQUNwRCxlQUF3QixFQUFFLGlCQUFpQixNQUFNLG9CQUFvQixDQUFDLFVBQVUsVUFBVSxRQUFRLEVBQUU7QUFBQSxRQUN4RztBQUFBLE1BQ0o7QUFBQSxJQUNKLENBQUM7QUFFRCxVQUFNLGlCQUFpQixlQUFlLENBQUMsQ0FBQztBQUN4QyxVQUFNLGlCQUFpQixvQ0FBb0MsRUFBRSxVQUFVLGNBQWMsRUFBRSxDQUFDO0FBRXhGLGFBQVMsT0FBTztBQUVoQixRQUFJLENBQUMsc0JBQXNCO0FBQ3ZCLDZCQUF1QjtBQUN2Qix3QkFBa0I7QUFBQSxJQUN0QjtBQUFBLEVBQ0o7QUFVQSxXQUFTLFNBQVMsU0FBdUI7QUFDckMsUUFBSSxXQUFXLElBQUksT0FBTyxLQUFLLENBQUMsTUFBTztBQUN2QyxlQUFXLElBQUksT0FBTztBQUV0QixVQUFNLFFBQWUsT0FBTyxVQUFVLEVBQUUsS0FBSyxDQUFBQSxPQUFLQSxHQUFFLElBQUksU0FBUyxNQUFNLE9BQU87QUFDOUUsVUFBTSxpQkFBaUIsd0JBQXdCO0FBQUEsTUFDM0MsY0FBYztBQUFBLFFBQ1YsS0FBWTtBQUFBLFFBQ1osWUFBWTtBQUFBLFFBQ1osU0FBWTtBQUFBLFFBQ1osTUFBWSxPQUFPLFNBQVMsS0FBSztBQUFBLE1BQ3JDO0FBQUEsSUFDSixDQUFDO0FBRUQsUUFBSSxPQUFPO0FBQ1AsVUFBSTtBQUNKLFlBQU0sbUJBQW1CLE1BQU07QUFDM0IscUJBQWEsS0FBSztBQUNsQixnQkFBUSxXQUFXLE1BQU07QUFDckIsaUJBQU8saUJBQWlCLDBCQUEwQjtBQUFBLFlBQzlDLGNBQWdCLEVBQUUsS0FBSyxTQUFTLFNBQVMsTUFBTSxhQUFhLEVBQUU7QUFBQSxZQUM5RCxnQkFBZ0IsQ0FBQyxFQUFFLE1BQU0sTUFBTSxTQUFTLEVBQUUsQ0FBQztBQUFBLFVBQy9DLENBQUM7QUFBQSxRQUNMLEdBQUcsR0FBRztBQUFBLE1BQ1YsQ0FBQztBQUFBLElBQ0w7QUFBQSxFQUNKO0FBVUEsV0FBUyxnQkFBZ0IsS0FBc0I7QUFDM0MsV0FBTyxtQkFBbUIsTUFBTSxJQUFJLFdBQVcsY0FBYztBQUFBLEVBQ2pFO0FBTUEsV0FBUyxvQkFBMEI7QUFFL0IsSUFBTyxPQUFPLGdCQUFnQixzQkFBc0IsQ0FBQyxXQUFvQixXQUFpQztBQUN0RyxzQkFBZ0IsTUFBTTtBQUFBLElBQzFCLENBQUM7QUFLRCxJQUFPLE9BQU8scUJBQXFCO0FBQUEsTUFDL0IsZ0JBQWdCLENBQUMsUUFBUSxVQUFVLHdCQUF3QjtBQUN2RCxjQUFNLE1BQU0sU0FBUyxTQUFTO0FBQzlCLFlBQUksQ0FBQyxnQkFBZ0IsR0FBRyxLQUFLLENBQUMsSUFBSSxXQUFXLG1CQUFtQixFQUFHLFFBQU87QUFDMUUsY0FBTSxlQUFlLE9BQU8sU0FBUztBQUNyQyxZQUFJLGdCQUFnQixhQUFhLElBQUksU0FBUyxNQUFNLElBQUssUUFBTztBQUNoRSxjQUFNLFNBQVUsV0FBbUI7QUFDbkMsWUFBSSxPQUFPLFdBQVcsV0FBWSxRQUFPO0FBQ3pDLGNBQU0sTUFBTTtBQUNaLGNBQU0sT0FBTyxNQUFPLElBQUksbUJBQW1CLElBQUksYUFBYztBQUM3RCxjQUFNLFNBQVMsTUFBTyxJQUFJLGVBQWUsSUFBSSxTQUFVO0FBQ3ZELGVBQU8sSUFBSSxVQUFVLG9CQUFvQixNQUFNLEdBQUcsTUFBTSxNQUFNO0FBQzlELGVBQU87QUFBQSxNQUNYO0FBQUEsSUFDSixDQUFDO0FBRUQsSUFBTyxVQUFVLCtCQUErQixRQUFRO0FBQUEsTUFDcEQsbUJBQW1CLENBQUMsS0FBSyxLQUFLLEdBQUc7QUFBQSxNQUNqQyx3QkFBd0IsT0FBTyxPQUFPLFVBQVUsWUFBWTtBQUN4RCxZQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixNQUFNLElBQUksU0FBUyxDQUFDLEVBQUcsUUFBTztBQUM3RCxjQUFNLFVBQVUsTUFBTSxJQUFJLFNBQVM7QUFDbkMsY0FBTSxTQUFtRCxNQUFNLE1BQU0sWUFBWSwyQkFBMkI7QUFBQSxVQUN4RyxjQUFjLEVBQUUsS0FBSyxRQUFRO0FBQUEsVUFDN0IsVUFBYyxFQUFFLE1BQU0sU0FBUyxhQUFhLEdBQUcsV0FBVyxTQUFTLFNBQVMsRUFBRTtBQUFBO0FBQUEsVUFFOUUsU0FBYyxFQUFFLGNBQWMsUUFBUSxlQUFlLEtBQUssR0FBRyxrQkFBa0IsUUFBUSxpQkFBaUI7QUFBQSxRQUM1RyxDQUFDO0FBQ0QsY0FBTSxRQUFRLE1BQU0sUUFBUSxNQUFNLElBQUksU0FBVSxRQUFRLFNBQVMsQ0FBQztBQUNsRSxlQUFPO0FBQUEsVUFDSCxhQUFhLE1BQU0sSUFBSSxVQUFRLHNCQUFzQixNQUFNLE9BQU8sUUFBUSxDQUFDO0FBQUE7QUFBQTtBQUFBLFVBRzNFLFlBQWEsTUFBTSxRQUFRLE1BQU0sSUFBSSxRQUFRLENBQUMsQ0FBQyxRQUFRO0FBQUEsUUFDM0Q7QUFBQSxNQUNKO0FBQUE7QUFBQTtBQUFBLE1BR0EsdUJBQXVCLE9BQU8sU0FBUztBQUNuQyxjQUFNLE1BQU8sS0FBOEI7QUFDM0MsWUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFLLFFBQU87QUFDM0IsWUFBSTtBQUNBLGdCQUFNLFdBQTJCLE1BQU0sTUFBTSxZQUFZLDBCQUEwQixHQUFHO0FBQ3RGLGNBQUksU0FBUyxlQUFlO0FBQ3hCLGlCQUFLLGdCQUFnQixFQUFFLE9BQU8sZUFBZSxTQUFTLGFBQWEsR0FBRyxXQUFXLE1BQU07QUFBQSxVQUMzRjtBQUNBLGNBQUksU0FBUyxPQUFRLE1BQUssU0FBUyxTQUFTO0FBQzVDLGNBQUksU0FBUyxxQkFBcUIsUUFBUTtBQUN0QyxpQkFBSyxzQkFBc0IsU0FBUyxvQkFBb0IsSUFBSSxnQkFBZ0I7QUFBQSxVQUNoRjtBQUFBLFFBQ0osU0FBUyxHQUFHO0FBQ1Isa0JBQVEsTUFBTSx5Q0FBMEMsR0FBYSxPQUFPO0FBQUEsUUFDaEY7QUFDQSxlQUFPO0FBQUEsTUFDWDtBQUFBLElBQ0osQ0FBQztBQUVELElBQU8sVUFBVSxzQkFBc0IsUUFBUTtBQUFBLE1BQzNDLGNBQWMsT0FBTyxPQUFPLGFBQWE7QUFDckMsWUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsTUFBTSxJQUFJLFNBQVMsQ0FBQyxFQUFHLFFBQU87QUFDN0QsY0FBTSxVQUFVLE1BQU0sSUFBSSxTQUFTO0FBQ25DLGNBQU0sU0FBdUIsTUFBTSxNQUFNLFlBQVksc0JBQXNCO0FBQUEsVUFDdkUsY0FBYyxFQUFFLEtBQUssUUFBUTtBQUFBLFVBQzdCLFVBQWMsRUFBRSxNQUFNLFNBQVMsYUFBYSxHQUFHLFdBQVcsU0FBUyxTQUFTLEVBQUU7QUFBQSxRQUNsRixDQUFDO0FBQ0QsWUFBSSxDQUFDLFFBQVEsU0FBVSxRQUFPO0FBQzlCLGNBQU0sV0FBVyxNQUFNLFFBQVEsT0FBTyxRQUFRLElBQUksT0FBTyxXQUFXLENBQUMsT0FBTyxRQUFRO0FBQ3BGLGVBQU87QUFBQSxVQUNILFVBQVUsU0FBUyxJQUFJLFFBQU07QUFBQSxZQUN6QixPQUFPLE9BQU8sTUFBTSxXQUFXLElBQUssRUFBb0I7QUFBQSxZQUN4RCxXQUFXO0FBQUEsVUFDZixFQUFFO0FBQUEsVUFDRixPQUFPLE9BQU8sUUFBUSxpQkFBaUIsT0FBTyxLQUFLLElBQUk7QUFBQSxRQUMzRDtBQUFBLE1BQ0o7QUFBQSxJQUNKLENBQUM7QUFFRCxJQUFPLFVBQVUsOEJBQThCLFFBQVE7QUFBQSxNQUNuRCxnQ0FBZ0MsQ0FBQyxLQUFLLEdBQUc7QUFBQSxNQUN6QyxzQkFBc0IsT0FBTyxPQUFPLGFBQWE7QUFDN0MsWUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsTUFBTSxJQUFJLFNBQVMsQ0FBQyxFQUFHLFFBQU87QUFDN0QsY0FBTSxVQUFVLE1BQU0sSUFBSSxTQUFTO0FBQ25DLGNBQU0sU0FBK0IsTUFBTSxNQUFNLFlBQVksOEJBQThCO0FBQUEsVUFDdkYsY0FBYyxFQUFFLEtBQUssUUFBUTtBQUFBLFVBQzdCLFVBQWMsRUFBRSxNQUFNLFNBQVMsYUFBYSxHQUFHLFdBQVcsU0FBUyxTQUFTLEVBQUU7QUFBQSxRQUNsRixDQUFDO0FBQ0QsWUFBSSxDQUFDLE9BQVEsUUFBTztBQUNwQixlQUFPO0FBQUEsVUFDSCxPQUFPO0FBQUEsWUFDSCxZQUFZLE9BQU8sV0FBVyxJQUFJLENBQUMsU0FBK0I7QUFBQSxjQUM5RCxPQUFlLElBQUk7QUFBQSxjQUNuQixlQUFlLElBQUksZ0JBQWdCLGVBQWUsSUFBSSxhQUFhLElBQUk7QUFBQSxjQUN2RSxhQUFnQixJQUFJLGNBQWMsQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUE2QjtBQUFBLGdCQUNwRSxPQUFlLEVBQUU7QUFBQSxnQkFDakIsZUFBZSxFQUFFLGdCQUFnQixlQUFlLEVBQUUsYUFBYSxJQUFJO0FBQUEsY0FDdkUsRUFBRTtBQUFBLFlBQ04sRUFBRTtBQUFBLFlBQ0YsaUJBQWlCLE9BQU8sbUJBQW1CO0FBQUEsWUFDM0MsaUJBQWlCLE9BQU8sbUJBQW1CO0FBQUEsVUFDL0M7QUFBQSxVQUNBLFNBQVMsTUFBTTtBQUFBLFVBQUM7QUFBQSxRQUNwQjtBQUFBLE1BQ0o7QUFBQSxJQUNKLENBQUM7QUFFRCxJQUFPLFVBQVUsMkJBQTJCLFFBQVE7QUFBQSxNQUNoRCxtQkFBbUIsT0FBTyxPQUFPLGFBQWE7QUFDMUMsWUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsTUFBTSxJQUFJLFNBQVMsQ0FBQyxFQUFHLFFBQU87QUFDN0QsY0FBTSxVQUFVLE1BQU0sSUFBSSxTQUFTO0FBQ25DLGNBQU0sU0FBdUMsTUFBTSxNQUFNLFlBQVksMkJBQTJCO0FBQUEsVUFDNUYsY0FBYyxFQUFFLEtBQUssUUFBUTtBQUFBLFVBQzdCLFVBQWMsRUFBRSxNQUFNLFNBQVMsYUFBYSxHQUFHLFdBQVcsU0FBUyxTQUFTLEVBQUU7QUFBQSxRQUNsRixDQUFDO0FBQ0QsWUFBSSxDQUFDLE9BQVEsUUFBTztBQUNwQixjQUFNLFlBQVksTUFBTSxRQUFRLE1BQU0sSUFBSSxTQUFTLENBQUMsTUFBTTtBQUMxRCxlQUFPLFVBQVUsSUFBSSxVQUFRO0FBQUEsVUFDekIsS0FBYyxJQUFJLE1BQU0sSUFBSSxHQUFHO0FBQUEsVUFDL0IsT0FBTyxpQkFBaUIsSUFBSSxLQUFLO0FBQUEsUUFDckMsRUFBRTtBQUFBLE1BQ047QUFBQSxJQUNKLENBQUM7QUFFRCxJQUFPLFVBQVUsMEJBQTBCLFFBQVE7QUFBQSxNQUMvQyxtQkFBbUIsT0FBTyxPQUFPLFVBQVUsWUFBWTtBQUNuRCxZQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixNQUFNLElBQUksU0FBUyxDQUFDLEVBQUcsUUFBTztBQUM3RCxjQUFNLFNBQTRCLE1BQU0sTUFBTSxZQUFZLDJCQUEyQjtBQUFBLFVBQ2pGLGNBQWMsRUFBRSxLQUFLLE1BQU0sSUFBSSxTQUFTLEVBQUU7QUFBQSxVQUMxQyxVQUFjLEVBQUUsTUFBTSxTQUFTLGFBQWEsR0FBRyxXQUFXLFNBQVMsU0FBUyxFQUFFO0FBQUEsVUFDOUUsU0FBYyxFQUFFLG9CQUFvQixRQUFRLG1CQUFtQjtBQUFBLFFBQ25FLENBQUM7QUFDRCxZQUFJLENBQUMsT0FBUSxRQUFPO0FBQ3BCLGVBQU8sT0FBTyxJQUFJLFVBQVEsRUFBRSxLQUFZLElBQUksTUFBTSxJQUFJLEdBQUcsR0FBRyxPQUFPLGlCQUFpQixJQUFJLEtBQUssRUFBRSxFQUFFO0FBQUEsTUFDckc7QUFBQSxJQUNKLENBQUM7QUFFRCxJQUFPLFVBQVUsdUJBQXVCLFFBQVE7QUFBQSxNQUM1QyxvQkFBb0IsT0FBTyxPQUFPLFVBQVUsWUFBWTtBQUNwRCxZQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixNQUFNLElBQUksU0FBUyxDQUFDLEVBQUcsUUFBTyxFQUFFLE9BQU8sQ0FBQyxFQUFFO0FBQ3pFLGNBQU0sT0FBNkIsTUFBTSxNQUFNLFlBQVksdUJBQXVCO0FBQUEsVUFDOUUsY0FBYyxFQUFFLEtBQUssTUFBTSxJQUFJLFNBQVMsRUFBRTtBQUFBLFVBQzFDLFVBQWMsRUFBRSxNQUFNLFNBQVMsYUFBYSxHQUFHLFdBQVcsU0FBUyxTQUFTLEVBQUU7QUFBQSxVQUM5RTtBQUFBLFFBQ0osQ0FBQztBQUNELGVBQU8sc0JBQXNCLElBQUk7QUFBQSxNQUNyQztBQUFBLE1BQ0EsdUJBQXVCLE9BQU8sT0FBTyxhQUFhO0FBQzlDLFlBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLE1BQU0sSUFBSSxTQUFTLENBQUMsRUFBRyxRQUFPO0FBQzdELFlBQUk7QUFDQSxnQkFBTSxTQUNGLE1BQU0sTUFBTSxZQUFZLDhCQUE4QjtBQUFBLFlBQ2xELGNBQWMsRUFBRSxLQUFLLE1BQU0sSUFBSSxTQUFTLEVBQUU7QUFBQSxZQUMxQyxVQUFjLEVBQUUsTUFBTSxTQUFTLGFBQWEsR0FBRyxXQUFXLFNBQVMsU0FBUyxFQUFFO0FBQUEsVUFDbEYsQ0FBQztBQUNMLGNBQUksQ0FBQyxPQUFRLFFBQU87QUFDcEIsZ0JBQU0sUUFBUSxXQUFXLFNBQVMsT0FBTyxRQUFRO0FBQ2pELGdCQUFNLGNBQWMsaUJBQWlCLFVBQVUsT0FBTyxjQUNoRCxPQUFPLGNBQ1AsTUFBTSxrQkFBa0IsUUFBUSxHQUFHLFFBQVE7QUFDakQsaUJBQU8sRUFBRSxPQUFPLGlCQUFpQixLQUFLLEdBQUcsTUFBTSxZQUFZO0FBQUEsUUFDL0QsUUFBUTtBQUNKLGdCQUFNLE9BQU8sTUFBTSxrQkFBa0IsUUFBUTtBQUM3QyxpQkFBTyxPQUFPO0FBQUEsWUFDVixPQUFPLEVBQUUsaUJBQWlCLFNBQVMsWUFBWSxhQUFhLEtBQUssYUFBYSxlQUFlLFNBQVMsWUFBWSxXQUFXLEtBQUssVUFBVTtBQUFBLFlBQzVJLE1BQU0sS0FBSztBQUFBLFVBQ2YsSUFBSTtBQUFBLFFBQ1I7QUFBQSxNQUNKO0FBQUEsSUFDSixDQUFDO0FBS0QsSUFBTyxVQUFVLHVDQUF1QyxRQUFRO0FBQUEsTUFDNUQsZ0NBQWdDLE9BQU8sVUFBVTtBQUM3QyxZQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixNQUFNLElBQUksU0FBUyxDQUFDLEVBQUcsUUFBTztBQUM3RCxjQUFNLFFBQTJCLE1BQU0sTUFBTSxZQUFZLDJCQUEyQjtBQUFBLFVBQ2hGLGNBQWMsRUFBRSxLQUFLLE1BQU0sSUFBSSxTQUFTLEVBQUU7QUFBQSxVQUMxQyxTQUFjLEVBQUUsU0FBUyxNQUFNLFdBQVcsRUFBRSxTQUFTLGNBQWMsTUFBTSxXQUFXLEVBQUUsYUFBYTtBQUFBLFFBQ3ZHLENBQUM7QUFDRCxlQUFPLFFBQVEsTUFBTSxJQUFJLGdCQUFnQixJQUFJO0FBQUEsTUFDakQ7QUFBQSxJQUNKLENBQUM7QUFFRCxJQUFPLFVBQVUsMkJBQTJCLFFBQVE7QUFBQSxNQUNoRCxvQkFBb0IsT0FBTyxPQUFPLE9BQU8sWUFBWTtBQUNqRCxjQUFNLFFBQVEsRUFBRSxTQUFTLENBQUMsR0FBRyxVQUFVO0FBQUEsUUFBMkIsRUFBRTtBQUNwRSxZQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixNQUFNLElBQUksU0FBUyxDQUFDLEVBQUcsUUFBTztBQUM3RCxjQUFNLGVBQWUsUUFBUSxXQUFXLENBQUMsR0FBRyxJQUFJLHFCQUFxQjtBQUNyRSxjQUFNLFNBQTZDLE1BQU0sTUFBTSxZQUFZLDJCQUEyQjtBQUFBLFVBQ2xHLGNBQWMsRUFBRSxLQUFLLE1BQU0sSUFBSSxTQUFTLEVBQUU7QUFBQSxVQUMxQyxPQUFjLGlCQUFpQixLQUFLO0FBQUEsVUFDcEMsU0FBYyxFQUFFLGFBQWEsTUFBTSxRQUFRLE9BQU8sQ0FBQyxRQUFRLElBQUksSUFBSSxPQUFVO0FBQUEsUUFDakYsQ0FBQztBQUNELFlBQUksQ0FBQyxRQUFRLE9BQVEsUUFBTztBQUM1QixlQUFPO0FBQUEsVUFDSCxTQUFTLE9BQU8sSUFBSSxxQkFBcUI7QUFBQSxVQUN6QyxVQUFVO0FBQUEsVUFBMkI7QUFBQSxRQUN6QztBQUFBLE1BQ0o7QUFBQSxJQUNKLEdBQUc7QUFBQSxNQUNDLHlCQUF5QjtBQUFBLFFBQUM7QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQW9CO0FBQUEsUUFDbEU7QUFBQSxRQUFvQjtBQUFBLFFBQVU7QUFBQSxNQUF3QjtBQUFBLElBQzlELENBQUM7QUFBQSxFQUNMO0FBTUEsV0FBUyxZQUFZLFVBQWlFO0FBQ2xGLFlBQVEsVUFBVTtBQUFBLE1BQ2QsS0FBSyxtQkFBbUI7QUFBYSxlQUFjLGVBQWU7QUFBQSxNQUNsRSxLQUFLLG1CQUFtQjtBQUFhLGVBQWMsZUFBZTtBQUFBLE1BQ2xFLEtBQUssbUJBQW1CO0FBQWEsZUFBYyxlQUFlO0FBQUEsTUFDbEUsS0FBSyxtQkFBbUI7QUFBYSxlQUFjLGVBQWU7QUFBQSxNQUNsRTtBQUFxQyxlQUFjLGVBQWU7QUFBQSxJQUN0RTtBQUFBLEVBQ0o7QUFFQSxXQUFTLGlCQUFpQixHQUE0RztBQUNsSSxXQUFPO0FBQUEsTUFDSCxpQkFBaUIsRUFBRSxNQUFNLE9BQU87QUFBQSxNQUNoQyxhQUFpQixFQUFFLE1BQU0sWUFBWTtBQUFBLE1BQ3JDLGVBQWlCLEVBQUUsSUFBSSxPQUFPO0FBQUEsTUFDOUIsV0FBaUIsRUFBRSxJQUFJLFlBQVk7QUFBQSxJQUN2QztBQUFBLEVBQ0o7QUFFQSxXQUFTLGVBQWUsR0FBbUM7QUFDdkQsV0FBTyxPQUFPLE1BQU0sV0FBVyxJQUFJLEVBQUU7QUFBQSxFQUN6QztBQUVBLFdBQVMsa0JBQWtCLE1BQTJFO0FBQ2xHLFVBQU0sSUFBVyxVQUFVO0FBQzNCLFlBQVEsTUFBTTtBQUFBLE1BQ1YsS0FBSyxtQkFBbUI7QUFBZSxlQUFPLEVBQUU7QUFBQSxNQUNoRCxLQUFLLG1CQUFtQjtBQUFlLGVBQU8sRUFBRTtBQUFBLE1BQ2hELEtBQUssbUJBQW1CO0FBQWUsZUFBTyxFQUFFO0FBQUEsTUFDaEQsS0FBSyxtQkFBbUI7QUFBZSxlQUFPLEVBQUU7QUFBQSxNQUNoRCxLQUFLLG1CQUFtQjtBQUFlLGVBQU8sRUFBRTtBQUFBLE1BQ2hELEtBQUssbUJBQW1CO0FBQWUsZUFBTyxFQUFFO0FBQUEsTUFDaEQsS0FBSyxtQkFBbUI7QUFBZSxlQUFPLEVBQUU7QUFBQSxNQUNoRCxLQUFLLG1CQUFtQjtBQUFlLGVBQU8sRUFBRTtBQUFBLE1BQ2hELEtBQUssbUJBQW1CO0FBQWUsZUFBTyxFQUFFO0FBQUEsTUFDaEQsS0FBSyxtQkFBbUI7QUFBZSxlQUFPLEVBQUU7QUFBQSxNQUNoRCxLQUFLLG1CQUFtQjtBQUFlLGVBQU8sRUFBRTtBQUFBLE1BQ2hELEtBQUssbUJBQW1CO0FBQWUsZUFBTyxFQUFFO0FBQUEsTUFDaEQsS0FBSyxtQkFBbUI7QUFBZSxlQUFPLEVBQUU7QUFBQSxNQUNoRCxLQUFLLG1CQUFtQjtBQUFlLGVBQU8sRUFBRTtBQUFBLE1BQ2hELEtBQUssbUJBQW1CO0FBQWUsZUFBTyxFQUFFO0FBQUEsTUFDaEQ7QUFBdUMsZUFBTyxFQUFFO0FBQUEsSUFDcEQ7QUFBQSxFQUNKO0FBRUEsV0FBUyxzQkFDTCxNQUNBLE9BQ0EsVUFDb0I7QUFDcEIsVUFBTSxPQUFPLE1BQU0scUJBQXFCLFFBQVE7QUFDaEQsUUFBSSxRQUF1QjtBQUFBLE1BQ3ZCLGlCQUFpQixTQUFTO0FBQUEsTUFDMUIsYUFBaUIsS0FBSztBQUFBLE1BQ3RCLGVBQWlCLFNBQVM7QUFBQSxNQUMxQixXQUFpQixLQUFLO0FBQUEsSUFDMUI7QUFDQSxRQUFJLGFBQWEsS0FBSyxjQUFjLEtBQUs7QUFDekMsVUFBTSxXQUFXLEtBQUs7QUFDdEIsUUFBSSxVQUFVO0FBQ1YsWUFBTSxJQUFJLFNBQVMsU0FBUyxTQUFTLFdBQVcsU0FBUztBQUN6RCxVQUFJLEVBQUcsU0FBUSxpQkFBaUIsQ0FBQztBQUNqQyxVQUFJLE9BQU8sU0FBUyxZQUFZLFNBQVUsY0FBYSxTQUFTO0FBQUEsSUFDcEU7QUFDQSxVQUFNLFNBQStCO0FBQUEsTUFDakMsT0FBaUIsS0FBSztBQUFBLE1BQ3RCLE1BQWlCLGtCQUFrQixLQUFLLElBQUk7QUFBQSxNQUM1QyxRQUFpQixLQUFLO0FBQUEsTUFDdEIsZUFBaUIsS0FBSyxnQkFBZ0IsRUFBRSxPQUFPLGVBQWUsS0FBSyxhQUFhLEdBQUcsV0FBVyxNQUFNLElBQUk7QUFBQSxNQUN4RztBQUFBLE1BQ0EsaUJBQWlCLEtBQUsscUJBQXFCLGlCQUFpQixVQUM5QixVQUFVLDZCQUE2QixrQkFDOUM7QUFBQSxNQUN2QjtBQUFBLE1BQ0EsVUFBcUIsdUJBQXVCLElBQUk7QUFBQSxNQUNoRCxZQUFxQixLQUFLO0FBQUEsTUFDMUIsV0FBcUIsS0FBSztBQUFBLE1BQzFCLGtCQUFxQixLQUFLO0FBQUEsTUFDMUIscUJBQXFCLEtBQUsscUJBQXFCLElBQUksZ0JBQWdCO0FBQUEsSUFDdkU7QUFDQSxXQUFPLE9BQU87QUFDZCxXQUFPO0FBQUEsRUFDWDtBQU1BLFdBQVMsdUJBQXVCLE1BQThCO0FBQzFELFVBQU0sT0FBTyxLQUFLLGFBQWEsT0FBTyxLQUFLLFVBQVUsV0FBVyxLQUFLLFFBQVE7QUFDN0UsVUFBTSxjQUFlLEtBQUssZ0JBQWdCLE9BQU8sS0FBSyxhQUFhLGdCQUFnQixXQUM3RSxLQUFLLGFBQWEsY0FBYztBQUN0QyxVQUFNLFdBQVcsR0FBRyxLQUFLLFVBQVUsRUFBRSxJQUFJLFdBQVc7QUFDcEQsV0FBTyxTQUFTLFNBQVMsMkJBQTJCLElBQUksS0FBSyxJQUFJLEtBQUssS0FBSyxJQUFJO0FBQUEsRUFDbkY7QUFPQSxNQUFNLHVCQUF1QjtBQUc3QixNQUFNLHNCQUFzQjtBQU81QixXQUFTLGlCQUFpQixNQUEyQztBQUNqRSxXQUFPLEVBQUUsT0FBTyxpQkFBaUIsS0FBSyxLQUFLLEdBQUcsTUFBTSxLQUFLLFFBQVE7QUFBQSxFQUNyRTtBQUVBLFdBQVMsaUJBQWlCLEdBQTRCO0FBQ2xELFdBQU87QUFBQSxNQUNILE9BQU8sRUFBRSxNQUFNLEVBQUUsa0JBQWtCLEdBQUcsV0FBVyxFQUFFLGNBQWMsRUFBRTtBQUFBLE1BQ25FLEtBQU8sRUFBRSxNQUFNLEVBQUUsZ0JBQWdCLEdBQUcsV0FBVyxFQUFFLFlBQVksRUFBRTtBQUFBLElBQ25FO0FBQUEsRUFDSjtBQUVBLFdBQVMsb0JBQW9CLFVBQXFEO0FBQzlFLFlBQVEsVUFBVTtBQUFBLE1BQ2QsS0FBWSxlQUFlO0FBQVMsZUFBTyxtQkFBbUI7QUFBQSxNQUM5RCxLQUFZLGVBQWU7QUFBUyxlQUFPLG1CQUFtQjtBQUFBLE1BQzlELEtBQVksZUFBZTtBQUFTLGVBQU8sbUJBQW1CO0FBQUEsTUFDOUQ7QUFBb0MsZUFBTyxtQkFBbUI7QUFBQSxJQUNsRTtBQUFBLEVBQ0o7QUFFQSxXQUFTLHNCQUFzQkEsSUFBMEM7QUFDckUsV0FBTztBQUFBLE1BQ0gsT0FBVTtBQUFBLFFBQUUsT0FBTyxFQUFFLE1BQU1BLEdBQUUsa0JBQWtCLEdBQUcsV0FBV0EsR0FBRSxjQUFjLEVBQUU7QUFBQSxRQUNuRSxLQUFPLEVBQUUsTUFBTUEsR0FBRSxnQkFBZ0IsR0FBRyxXQUFXQSxHQUFFLFlBQVksRUFBRTtBQUFBLE1BQUU7QUFBQSxNQUM3RSxTQUFVQSxHQUFFO0FBQUEsTUFDWixVQUFVLG9CQUFvQkEsR0FBRSxRQUFRO0FBQUEsTUFDeEMsUUFBVUEsR0FBRTtBQUFBLElBQ2hCO0FBQUEsRUFDSjtBQUVBLFdBQVMsc0JBQXNCLFFBQTJEO0FBQ3RGLFVBQU0sWUFBWSxPQUFRLE9BQW1CLFlBQVk7QUFDekQsVUFBTSxRQUFRLE9BQU8sVUFDYixZQUFhLE9BQW1CLFVBQVcsT0FBc0IsU0FBUyxVQUMzRTtBQUNQLFVBQU0sT0FBTyxZQUFZLGFBQWUsT0FBc0IsUUFBUTtBQUN0RSxXQUFPO0FBQUEsTUFDSDtBQUFBLE1BQ0E7QUFBQSxNQUNBLGFBQWEsQ0FBQztBQUFBLE1BQ2QsYUFBYyxPQUFzQjtBQUFBO0FBQUEsTUFFcEMsU0FBUyxFQUFFLElBQUksc0JBQXNCLE9BQU8sV0FBVyxDQUFDLE1BQU0sRUFBRTtBQUFBLElBQ3BFO0FBQUEsRUFDSjtBQUVBLGlCQUFlLGdCQUFnQixRQUE2QztBQUN4RSxRQUFJLENBQUMsTUFBTztBQUNaLFFBQUk7QUFDQSxVQUFJLE9BQVEsT0FBbUIsWUFBWSxVQUFVO0FBQ2pELGNBQU0saUJBQWlCLE1BQWlCO0FBQ3hDO0FBQUEsTUFDSjtBQUNBLFVBQUksV0FBVztBQUNmLFVBQUksQ0FBQyxTQUFTLFFBQVMsU0FBZ0MsU0FBUyxRQUFXO0FBQ3ZFLG1CQUFXLE1BQU0sTUFBTSxZQUFZLHNCQUFzQixRQUFRO0FBQUEsTUFDckU7QUFDQSxVQUFJLFNBQVMsS0FBTSxvQkFBbUIsU0FBUyxJQUFJO0FBQ25ELFVBQUksU0FBUyxRQUFTLE9BQU0saUJBQWlCLFNBQVMsT0FBTztBQUFBLElBQ2pFLFNBQVMsR0FBRztBQUNSLGNBQVEsS0FBSyxrQ0FBbUMsR0FBYSxXQUFXLENBQUM7QUFBQSxJQUM3RTtBQUFBLEVBQ0o7QUFFQSxXQUFTLGdCQUFnQixPQUF3QztBQUM3RCxXQUFPLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBRSxNQUF3QixXQUFXLENBQUMsQ0FBRSxNQUF3QjtBQUFBLEVBQ3hGO0FBRUEsaUJBQWUsaUJBQWlCLEtBQTZCO0FBQ3pELFFBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxRQUFTO0FBQzdCLFFBQUksU0FBUyxJQUFJLE9BQU8sR0FBRztBQUN2QixZQUFNLFlBQVksSUFBSSxTQUFTLElBQUksYUFBYSxDQUFDLENBQUM7QUFDbEQ7QUFBQSxJQUNKO0FBQ0EsVUFBTSxTQUFTLE1BQU0sTUFBTSxZQUFZLDRCQUE0QixFQUFFLFNBQVMsSUFBSSxTQUFTLFdBQVcsSUFBSSxhQUFhLENBQUMsRUFBRSxDQUFDO0FBQzNILFFBQUksZ0JBQWdCLE1BQU0sRUFBRyxvQkFBbUIsTUFBTTtBQUFBLEVBQzFEO0FBV0EsV0FBUyxXQUFXLEdBQWdCO0FBQ2hDLFVBQU0sT0FBTyxHQUFHLFFBQVEsR0FBRyxhQUFhO0FBQ3hDLFVBQU0sT0FBTyxHQUFHLFFBQVEsR0FBRztBQUMzQixXQUFPLE9BQU8sR0FBRyxJQUFJLEtBQUssSUFBSSxLQUFLLEdBQUcsSUFBSTtBQUFBLEVBQzlDO0FBT0EsTUFBTSxXQUF5QztBQUFBLElBQzNDLDBDQUEwQztBQUFBLE1BQ3RDLE9BQU87QUFBQSxNQUNQLFFBQVE7QUFBQSxNQUNSLFVBQVU7QUFBQSxNQUNWLFNBQVMsQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQVksRUFBRSxPQUFPLFdBQVcsQ0FBQyxHQUFHLEtBQUssRUFBRSxFQUFFO0FBQUEsTUFDcEYsV0FBVyxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxjQUFjLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxRQUFRLElBQUksSUFBSSxDQUFBQSxPQUFLQSxHQUFFLEdBQUcsRUFBRSxDQUFDO0FBQUEsSUFDL0c7QUFBQSxJQUNBLHNDQUFzQztBQUFBLE1BQ2xDLE9BQU87QUFBQSxNQUNQLFFBQVE7QUFBQSxNQUNSLFVBQVU7QUFBQSxNQUNWLFNBQVMsQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQVksRUFBRSxPQUFPLFdBQVcsQ0FBQyxHQUFHLEtBQUssRUFBRSxFQUFFO0FBQUEsTUFDcEYsV0FBVyxDQUFDLE1BQU0sSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUFBLE9BQUtBLEdBQUUsR0FBRyxDQUFDO0FBQUEsSUFDL0Q7QUFBQSxJQUNBLG9DQUFvQztBQUFBLE1BQ2hDLE9BQU87QUFBQSxNQUNQLFFBQVE7QUFBQSxNQUNSLFVBQVU7QUFBQSxNQUNWLFNBQVMsQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQVksRUFBRSxPQUFPLFdBQVcsQ0FBQyxHQUFHLEtBQUssRUFBRSxFQUFFO0FBQUEsTUFDcEYsV0FBVyxDQUFDLE1BQU0sSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUFBLE9BQUtBLEdBQUUsR0FBRyxHQUFHLEtBQUs7QUFBQSxJQUN0RTtBQUFBLElBQ0EsdUNBQXVDO0FBQUEsTUFDbkMsT0FBTztBQUFBLE1BQ1AsUUFBUTtBQUFBLE1BQ1IsVUFBVTtBQUFBLE1BQ1YsU0FBUyxDQUFDLE9BQU8sR0FBRyxhQUFhLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFZLEVBQUUsT0FBTyxXQUFXLENBQUMsR0FBRyxLQUFLLEVBQUUsRUFBRTtBQUFBLE1BQzVGLFdBQVcsQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFBQSxPQUFLQSxHQUFFLEdBQUcsQ0FBQztBQUFBLElBQy9EO0FBQUEsRUFDSjtBQUVBLGlCQUFlLFlBQVksVUFBa0IsTUFBNEI7QUFDckUsUUFBSSxDQUFDLE1BQU87QUFDWixVQUFNLE9BQU8sU0FBUyxRQUFRO0FBQzlCLFVBQU0sU0FBUyxNQUFNLE1BQU0sWUFBWSw0QkFBNEIsRUFBRSxTQUFTLEtBQUssUUFBUSxXQUFXLEtBQUssQ0FBQztBQUM1RyxRQUFJLENBQUMsT0FBUTtBQUNiLFVBQU0sVUFBVSxLQUFLLFFBQVEsTUFBTTtBQUNuQyxRQUFJLFdBQVc7QUFDZixVQUFNLFNBQVUsV0FBbUI7QUFDbkMsUUFBSSxRQUFRLFVBQVUsT0FBTyxXQUFXLFlBQVk7QUFDaEQsWUFBTSxTQUEwQixNQUFNLE9BQU8sS0FBSyxPQUFPLFFBQVEsSUFBSSxDQUFBQSxPQUFLQSxHQUFFLEtBQUssQ0FBQztBQUNsRixVQUFJLFdBQVcsS0FBTTtBQUNyQixpQkFBVyxRQUFRLE9BQU8sQ0FBQUEsT0FBSyxPQUFPLFNBQVNBLEdBQUUsS0FBSyxDQUFDO0FBQUEsSUFDM0Q7QUFDQSxVQUFNLE9BQU8sTUFBTSxNQUFNLFlBQVksNEJBQTRCO0FBQUEsTUFDN0QsU0FBUyxLQUFLO0FBQUEsTUFDZCxXQUFXLEtBQUssVUFBVSxNQUFNLFFBQVEsUUFBUTtBQUFBLElBQ3BELENBQUM7QUFDRCxRQUFJLGdCQUFnQixJQUFJLEVBQUcsb0JBQW1CLElBQUk7QUFBQSxFQUN0RDtBQUdBLFdBQVMsbUJBQW1CLE1BQThDO0FBQ3RFLFFBQUksQ0FBQyxLQUFNO0FBQ1gsVUFBTSxRQUFvQyxDQUFDO0FBQzNDLFFBQUksS0FBSyxTQUFTO0FBQ2QsaUJBQVcsT0FBTyxLQUFLLFFBQVMsT0FBTSxHQUFHLEtBQUssTUFBTSxHQUFHLEtBQUssQ0FBQyxHQUFHLE9BQU8sS0FBSyxRQUFRLEdBQUcsQ0FBQztBQUFBLElBQzVGO0FBQ0EsUUFBSSxLQUFLLGlCQUFpQjtBQUN0QixpQkFBVyxNQUFNLEtBQUssaUJBQTBCO0FBQzVDLFlBQUksSUFBSSxjQUFjLE9BQU8sTUFBTSxRQUFRLEdBQUcsS0FBSyxHQUFHO0FBQ2xELGdCQUFNLEdBQUcsYUFBYSxHQUFHLEtBQUssTUFBTSxHQUFHLGFBQWEsR0FBRyxLQUFLLENBQUMsR0FBRyxPQUFPLEdBQUcsS0FBSztBQUFBLFFBQ25GO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFDQSxlQUFXLE9BQU8sT0FBTztBQUNyQixZQUFNLFFBQWUsT0FBTyxVQUFVLEVBQUUsS0FBSyxDQUFBQSxPQUFLQSxHQUFFLElBQUksU0FBUyxNQUFNLEdBQUc7QUFDMUUsVUFBSSxDQUFDLE1BQU87QUFDWixZQUFNLE1BQU0sTUFBTSxHQUFHLEVBQUUsSUFBSSxRQUFNLEVBQUUsT0FBTyxpQkFBaUIsRUFBRSxLQUFLLEdBQUcsTUFBTSxFQUFFLFNBQVMsa0JBQWtCLEtBQUssRUFBRTtBQUMvRyxZQUFNLG1CQUFtQixDQUFDLEdBQUcsS0FBSyxNQUFNLElBQUk7QUFBQSxJQUNoRDtBQUFBLEVBQ0o7QUFHQSxXQUFTLHNCQUFzQixNQUE0RDtBQUN2RixVQUFNLFFBQWUsQ0FBQztBQUN0QixVQUFNLE9BQU8sQ0FBQyxLQUFhLFNBQXFCO0FBQzVDLGlCQUFXLEtBQUssTUFBTTtBQUNsQixjQUFNLEtBQUssRUFBRSxVQUFpQixJQUFJLE1BQU0sR0FBRyxHQUFHLFVBQVUsRUFBRSxPQUFPLGlCQUFpQixFQUFFLEtBQUssR0FBRyxNQUFNLEVBQUUsUUFBUSxHQUFHLFdBQVcsT0FBVSxDQUFDO0FBQUEsTUFDekk7QUFBQSxJQUNKO0FBQ0EsUUFBSSxNQUFNLFNBQVM7QUFDZixpQkFBVyxPQUFPLEtBQUssUUFBUyxNQUFLLEtBQUssS0FBSyxRQUFRLEdBQUcsQ0FBQztBQUFBLElBQy9EO0FBQ0EsUUFBSSxNQUFNLGlCQUFpQjtBQUN2QixpQkFBVyxNQUFNLEtBQUssaUJBQTBCO0FBQzVDLFlBQUksSUFBSSxjQUFjLE9BQU8sTUFBTSxRQUFRLEdBQUcsS0FBSyxFQUFHLE1BQUssR0FBRyxhQUFhLEtBQUssR0FBRyxLQUFLO0FBQUEsTUFDNUY7QUFBQSxJQUNKO0FBQ0EsV0FBTyxFQUFFLE1BQU07QUFBQSxFQUNuQjtBQUVBLFdBQVMsZ0JBQWdCO0FBQ3JCLFdBQU87QUFBQSxNQUNILE1BQU07QUFBQSxRQUNGLFFBQVE7QUFBQSxVQUNKLE9BQVksRUFBRSxTQUFTLEtBQUs7QUFBQSxVQUM1QixRQUFZLEVBQUUsU0FBUyxNQUFNO0FBQUEsVUFDN0IsWUFBWSxDQUFDLHNCQUFzQixtQkFBbUIsMkJBQTJCO0FBQUEsUUFDckY7QUFBQSxRQUNBLFdBQVcsRUFBRSxTQUFTLEtBQUs7QUFBQSxRQUMzQixZQUFZO0FBQUEsVUFDUixXQUFzQjtBQUFBLFVBQ3RCLHNCQUFzQjtBQUFBLFVBQ3RCLGVBQWU7QUFBQSxZQUNYO0FBQUEsWUFBYTtBQUFBLFlBQVM7QUFBQSxZQUN0QjtBQUFBLFlBQ0E7QUFBQSxZQUNBO0FBQUEsVUFDSjtBQUFBLFVBQ0EsYUFBYSxDQUFDLFFBQVEsU0FBUyxPQUFPLE9BQU8sRUFBRTtBQUFBLFFBQ25EO0FBQUEsUUFDQSxlQUFnQixFQUFFLFNBQVMsS0FBSztBQUFBLFFBQ2hDLFFBQWdCLEVBQUUsU0FBUyxLQUFLO0FBQUEsUUFDaEMsYUFBZ0IsRUFBRSxpQkFBaUIsTUFBTTtBQUFBLE1BQzdDO0FBQUEsSUFDSjtBQUFBLEVBQ0o7IiwKICAibmFtZXMiOiBbIkVycm9yQ29kZXMiLCAiTWVzc2FnZSIsICJUb3VjaCIsICJEaXNwb3NhYmxlIiwgIlJBTCIsICJFdmVudCIsICJJcyIsICJDYW5jZWxsYXRpb25Ub2tlbiIsICJDYW5jZWxsYXRpb25TdGF0ZSIsICJfY29ubiIsICJJcyIsICJNZXNzYWdlUmVhZGVyIiwgIkFic3RyYWN0TWVzc2FnZVJlYWRlciIsICJSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zIiwgIklzIiwgIk1lc3NhZ2VXcml0ZXIiLCAiQWJzdHJhY3RNZXNzYWdlV3JpdGVyIiwgIlJlc29sdmVkTWVzc2FnZVdyaXRlck9wdGlvbnMiLCAicmVzdWx0IiwgIklzIiwgIkNhbmNlbE5vdGlmaWNhdGlvbiIsICJQcm9ncmVzc1Rva2VuIiwgIlByb2dyZXNzTm90aWZpY2F0aW9uIiwgIlN0YXJSZXF1ZXN0SGFuZGxlciIsICJUcmFjZSIsICJUcmFjZVZhbHVlcyIsICJUcmFjZUZvcm1hdCIsICJTZXRUcmFjZU5vdGlmaWNhdGlvbiIsICJMb2dUcmFjZU5vdGlmaWNhdGlvbiIsICJDb25uZWN0aW9uRXJyb3JzIiwgIkNvbm5lY3Rpb25TdHJhdGVneSIsICJJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kiLCAiUmVxdWVzdENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kiLCAiQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSIsICJDYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneSIsICJDYW5jZWxsYXRpb25TdHJhdGVneSIsICJNZXNzYWdlU3RyYXRlZ3kiLCAiQ29ubmVjdGlvbk9wdGlvbnMiLCAiQ29ubmVjdGlvblN0YXRlIiwgImNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uIiwgInN0YXJ0VGltZSIsICJSSUwiLCAibSIsICJleHBvcnRzIiwgImNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uIiwgImltcG9ydF92c2NvZGVfanNvbnJwYyIsICJpbXBvcnRfdnNjb2RlX2pzb25ycGMiLCAiaW1wb3J0X3ZzY29kZV9qc29ucnBjIiwgImltcG9ydF92c2NvZGVfanNvbnJwYyIsICJEb2N1bWVudFVyaSIsICJVUkkiLCAiaW50ZWdlciIsICJ1aW50ZWdlciIsICJQb3NpdGlvbiIsICJSYW5nZSIsICJMb2NhdGlvbiIsICJMb2NhdGlvbkxpbmsiLCAiQ29sb3IiLCAiQ29sb3JJbmZvcm1hdGlvbiIsICJDb2xvclByZXNlbnRhdGlvbiIsICJGb2xkaW5nUmFuZ2VLaW5kIiwgIkZvbGRpbmdSYW5nZSIsICJEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uIiwgImxvY2F0aW9uIiwgIkRpYWdub3N0aWNTZXZlcml0eSIsICJEaWFnbm9zdGljVGFnIiwgIkNvZGVEZXNjcmlwdGlvbiIsICJEaWFnbm9zdGljIiwgIkNvbW1hbmQiLCAiVGV4dEVkaXQiLCAiQ2hhbmdlQW5ub3RhdGlvbiIsICJDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllciIsICJBbm5vdGF0ZWRUZXh0RWRpdCIsICJUZXh0RG9jdW1lbnRFZGl0IiwgIkNyZWF0ZUZpbGUiLCAiUmVuYW1lRmlsZSIsICJEZWxldGVGaWxlIiwgIldvcmtzcGFjZUVkaXQiLCAiVGV4dERvY3VtZW50SWRlbnRpZmllciIsICJWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIiwgIk9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciIsICJUZXh0RG9jdW1lbnRJdGVtIiwgIk1hcmt1cEtpbmQiLCAiTWFya3VwQ29udGVudCIsICJDb21wbGV0aW9uSXRlbUtpbmQiLCAiSW5zZXJ0VGV4dEZvcm1hdCIsICJDb21wbGV0aW9uSXRlbVRhZyIsICJJbnNlcnRSZXBsYWNlRWRpdCIsICJSYW5nZSIsICJJbnNlcnRUZXh0TW9kZSIsICJDb21wbGV0aW9uSXRlbUxhYmVsRGV0YWlscyIsICJDb21wbGV0aW9uSXRlbSIsICJDb21wbGV0aW9uTGlzdCIsICJNYXJrZWRTdHJpbmciLCAiSG92ZXIiLCAiUGFyYW1ldGVySW5mb3JtYXRpb24iLCAiU2lnbmF0dXJlSW5mb3JtYXRpb24iLCAiRG9jdW1lbnRIaWdobGlnaHRLaW5kIiwgIkRvY3VtZW50SGlnaGxpZ2h0IiwgIlN5bWJvbEtpbmQiLCAiU3ltYm9sVGFnIiwgIlN5bWJvbEluZm9ybWF0aW9uIiwgIldvcmtzcGFjZVN5bWJvbCIsICJEb2N1bWVudFN5bWJvbCIsICJDb2RlQWN0aW9uS2luZCIsICJDb2RlQWN0aW9uVHJpZ2dlcktpbmQiLCAiQ29kZUFjdGlvbkNvbnRleHQiLCAiQ29kZUFjdGlvbiIsICJDb2RlTGVucyIsICJGb3JtYXR0aW5nT3B0aW9ucyIsICJEb2N1bWVudExpbmsiLCAiU2VsZWN0aW9uUmFuZ2UiLCAiU2VtYW50aWNUb2tlblR5cGVzIiwgIlNlbWFudGljVG9rZW5Nb2RpZmllcnMiLCAiU2VtYW50aWNUb2tlbnMiLCAiSW5saW5lVmFsdWVUZXh0IiwgIklubGluZVZhbHVlVmFyaWFibGVMb29rdXAiLCAiSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24iLCAiSW5saW5lVmFsdWVDb250ZXh0IiwgIklubGF5SGludEtpbmQiLCAiSW5sYXlIaW50TGFiZWxQYXJ0IiwgIklubGF5SGludCIsICJQb3NpdGlvbiIsICJTdHJpbmdWYWx1ZSIsICJJbmxpbmVDb21wbGV0aW9uSXRlbSIsICJJbmxpbmVDb21wbGV0aW9uTGlzdCIsICJJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmQiLCAiU2VsZWN0ZWRDb21wbGV0aW9uSW5mbyIsICJJbmxpbmVDb21wbGV0aW9uQ29udGV4dCIsICJXb3Jrc3BhY2VGb2xkZXIiLCAiVGV4dERvY3VtZW50IiwgIlBvc2l0aW9uIiwgIklzIiwgInVuZGVmaW5lZCIsICJpbnRlZ2VyIiwgInVpbnRlZ2VyIiwgIm0iXQp9Cg== +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvY29tbW9uL2lzLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlcy5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vbGlua2VkTWFwLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9kaXNwb3NhYmxlLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9yYWwuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvY29tbW9uL2V2ZW50cy5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vY2FuY2VsbGF0aW9uLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9zaGFyZWRBcnJheUNhbmNlbGxhdGlvbi5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vc2VtYXBob3JlLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlUmVhZGVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlV3JpdGVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlQnVmZmVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9jb25uZWN0aW9uLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9hcGkuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvYnJvd3Nlci9yaWwuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvYnJvd3Nlci9tYWluLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvYnJvd3Nlci5qcyIsICJsc3AvamF2YS1sc3AtY2xpZW50LnRzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLXdzLWpzb25ycGMvc3JjL2Rpc3Bvc2FibGUudHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvc29ja2V0L3NvY2tldC50cyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS13cy1qc29ucnBjL3NyYy9zb2NrZXQvcmVhZGVyLnRzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLXdzLWpzb25ycGMvc3JjL3NvY2tldC93cml0ZXIudHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvc29ja2V0L2Nvbm5lY3Rpb24udHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvY29ubmVjdGlvbi50cyIsICJsc3AvbW9uYWNvLXNoaW0udHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtbGFuZ3VhZ2VzZXJ2ZXItdHlwZXMvbGliL2VzbS9tYWluLmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuc3RyaW5nQXJyYXkgPSBleHBvcnRzLmFycmF5ID0gZXhwb3J0cy5mdW5jID0gZXhwb3J0cy5lcnJvciA9IGV4cG9ydHMubnVtYmVyID0gZXhwb3J0cy5zdHJpbmcgPSBleHBvcnRzLmJvb2xlYW4gPSB2b2lkIDA7XG5mdW5jdGlvbiBib29sZWFuKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZTtcbn1cbmV4cG9ydHMuYm9vbGVhbiA9IGJvb2xlYW47XG5mdW5jdGlvbiBzdHJpbmcodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZztcbn1cbmV4cG9ydHMuc3RyaW5nID0gc3RyaW5nO1xuZnVuY3Rpb24gbnVtYmVyKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdmFsdWUgaW5zdGFuY2VvZiBOdW1iZXI7XG59XG5leHBvcnRzLm51bWJlciA9IG51bWJlcjtcbmZ1bmN0aW9uIGVycm9yKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgRXJyb3I7XG59XG5leHBvcnRzLmVycm9yID0gZXJyb3I7XG5mdW5jdGlvbiBmdW5jKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cbmV4cG9ydHMuZnVuYyA9IGZ1bmM7XG5mdW5jdGlvbiBhcnJheSh2YWx1ZSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cbmV4cG9ydHMuYXJyYXkgPSBhcnJheTtcbmZ1bmN0aW9uIHN0cmluZ0FycmF5KHZhbHVlKSB7XG4gICAgcmV0dXJuIGFycmF5KHZhbHVlKSAmJiB2YWx1ZS5ldmVyeShlbGVtID0+IHN0cmluZyhlbGVtKSk7XG59XG5leHBvcnRzLnN0cmluZ0FycmF5ID0gc3RyaW5nQXJyYXk7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLk1lc3NhZ2UgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU5ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlOCA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTcgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU2ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNSA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTQgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUzID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMiA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTEgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUwID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTkgPSBleHBvcnRzLlJlcXVlc3RUeXBlOCA9IGV4cG9ydHMuUmVxdWVzdFR5cGU3ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTYgPSBleHBvcnRzLlJlcXVlc3RUeXBlNSA9IGV4cG9ydHMuUmVxdWVzdFR5cGU0ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTMgPSBleHBvcnRzLlJlcXVlc3RUeXBlMiA9IGV4cG9ydHMuUmVxdWVzdFR5cGUxID0gZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IGV4cG9ydHMuUmVxdWVzdFR5cGUwID0gZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUgPSBleHBvcnRzLlBhcmFtZXRlclN0cnVjdHVyZXMgPSBleHBvcnRzLlJlc3BvbnNlRXJyb3IgPSBleHBvcnRzLkVycm9yQ29kZXMgPSB2b2lkIDA7XG5jb25zdCBpcyA9IHJlcXVpcmUoXCIuL2lzXCIpO1xuLyoqXG4gKiBQcmVkZWZpbmVkIGVycm9yIGNvZGVzLlxuICovXG52YXIgRXJyb3JDb2RlcztcbihmdW5jdGlvbiAoRXJyb3JDb2Rlcykge1xuICAgIC8vIERlZmluZWQgYnkgSlNPTiBSUENcbiAgICBFcnJvckNvZGVzLlBhcnNlRXJyb3IgPSAtMzI3MDA7XG4gICAgRXJyb3JDb2Rlcy5JbnZhbGlkUmVxdWVzdCA9IC0zMjYwMDtcbiAgICBFcnJvckNvZGVzLk1ldGhvZE5vdEZvdW5kID0gLTMyNjAxO1xuICAgIEVycm9yQ29kZXMuSW52YWxpZFBhcmFtcyA9IC0zMjYwMjtcbiAgICBFcnJvckNvZGVzLkludGVybmFsRXJyb3IgPSAtMzI2MDM7XG4gICAgLyoqXG4gICAgICogVGhpcyBpcyB0aGUgc3RhcnQgcmFuZ2Ugb2YgSlNPTiBSUEMgcmVzZXJ2ZWQgZXJyb3IgY29kZXMuXG4gICAgICogSXQgZG9lc24ndCBkZW5vdGUgYSByZWFsIGVycm9yIGNvZGUuIE5vIGFwcGxpY2F0aW9uIGVycm9yIGNvZGVzIHNob3VsZFxuICAgICAqIGJlIGRlZmluZWQgYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCByYW5nZS4gRm9yIGJhY2t3YXJkc1xuICAgICAqIGNvbXBhdGliaWxpdHkgdGhlIGBTZXJ2ZXJOb3RJbml0aWFsaXplZGAgYW5kIHRoZSBgVW5rbm93bkVycm9yQ29kZWBcbiAgICAgKiBhcmUgbGVmdCBpbiB0aGUgcmFuZ2UuXG4gICAgICpcbiAgICAgKiBAc2luY2UgMy4xNi4wXG4gICAgKi9cbiAgICBFcnJvckNvZGVzLmpzb25ycGNSZXNlcnZlZEVycm9yUmFuZ2VTdGFydCA9IC0zMjA5OTtcbiAgICAvKiogQGRlcHJlY2F0ZWQgdXNlICBqc29ucnBjUmVzZXJ2ZWRFcnJvclJhbmdlU3RhcnQgKi9cbiAgICBFcnJvckNvZGVzLnNlcnZlckVycm9yU3RhcnQgPSAtMzIwOTk7XG4gICAgLyoqXG4gICAgICogQW4gZXJyb3Igb2NjdXJyZWQgd2hlbiB3cml0ZSBhIG1lc3NhZ2UgdG8gdGhlIHRyYW5zcG9ydCBsYXllci5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLk1lc3NhZ2VXcml0ZUVycm9yID0gLTMyMDk5O1xuICAgIC8qKlxuICAgICAqIEFuIGVycm9yIG9jY3VycmVkIHdoZW4gcmVhZGluZyBhIG1lc3NhZ2UgZnJvbSB0aGUgdHJhbnNwb3J0IGxheWVyLlxuICAgICAqL1xuICAgIEVycm9yQ29kZXMuTWVzc2FnZVJlYWRFcnJvciA9IC0zMjA5ODtcbiAgICAvKipcbiAgICAgKiBUaGUgY29ubmVjdGlvbiBnb3QgZGlzcG9zZWQgb3IgbG9zdCBhbmQgYWxsIHBlbmRpbmcgcmVzcG9uc2VzIGdvdFxuICAgICAqIHJlamVjdGVkLlxuICAgICAqL1xuICAgIEVycm9yQ29kZXMuUGVuZGluZ1Jlc3BvbnNlUmVqZWN0ZWQgPSAtMzIwOTc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gaXMgaW5hY3RpdmUgYW5kIGEgdXNlIG9mIGl0IGZhaWxlZC5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLkNvbm5lY3Rpb25JbmFjdGl2ZSA9IC0zMjA5NjtcbiAgICAvKipcbiAgICAgKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBhIHNlcnZlciByZWNlaXZlZCBhIG5vdGlmaWNhdGlvbiBvclxuICAgICAqIHJlcXVlc3QgYmVmb3JlIHRoZSBzZXJ2ZXIgaGFzIHJlY2VpdmVkIHRoZSBgaW5pdGlhbGl6ZWAgcmVxdWVzdC5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLlNlcnZlck5vdEluaXRpYWxpemVkID0gLTMyMDAyO1xuICAgIEVycm9yQ29kZXMuVW5rbm93bkVycm9yQ29kZSA9IC0zMjAwMTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIHRoZSBlbmQgcmFuZ2Ugb2YgSlNPTiBSUEMgcmVzZXJ2ZWQgZXJyb3IgY29kZXMuXG4gICAgICogSXQgZG9lc24ndCBkZW5vdGUgYSByZWFsIGVycm9yIGNvZGUuXG4gICAgICpcbiAgICAgKiBAc2luY2UgMy4xNi4wXG4gICAgKi9cbiAgICBFcnJvckNvZGVzLmpzb25ycGNSZXNlcnZlZEVycm9yUmFuZ2VFbmQgPSAtMzIwMDA7XG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSAganNvbnJwY1Jlc2VydmVkRXJyb3JSYW5nZUVuZCAqL1xuICAgIEVycm9yQ29kZXMuc2VydmVyRXJyb3JFbmQgPSAtMzIwMDA7XG59KShFcnJvckNvZGVzIHx8IChleHBvcnRzLkVycm9yQ29kZXMgPSBFcnJvckNvZGVzID0ge30pKTtcbi8qKlxuICogQW4gZXJyb3Igb2JqZWN0IHJldHVybiBpbiBhIHJlc3BvbnNlIGluIGNhc2UgYSByZXF1ZXN0XG4gKiBoYXMgZmFpbGVkLlxuICovXG5jbGFzcyBSZXNwb25zZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNvZGUsIG1lc3NhZ2UsIGRhdGEpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuY29kZSA9IGlzLm51bWJlcihjb2RlKSA/IGNvZGUgOiBFcnJvckNvZGVzLlVua25vd25FcnJvckNvZGU7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBSZXNwb25zZUVycm9yLnByb3RvdHlwZSk7XG4gICAgfVxuICAgIHRvSnNvbigpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgY29kZTogdGhpcy5jb2RlLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLmRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmRhdGEgPSB0aGlzLmRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5leHBvcnRzLlJlc3BvbnNlRXJyb3IgPSBSZXNwb25zZUVycm9yO1xuY2xhc3MgUGFyYW1ldGVyU3RydWN0dXJlcyB7XG4gICAgY29uc3RydWN0b3Ioa2luZCkge1xuICAgICAgICB0aGlzLmtpbmQgPSBraW5kO1xuICAgIH1cbiAgICBzdGF0aWMgaXModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8gfHwgdmFsdWUgPT09IFBhcmFtZXRlclN0cnVjdHVyZXMuYnlOYW1lIHx8IHZhbHVlID09PSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5UG9zaXRpb247XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5raW5kO1xuICAgIH1cbn1cbmV4cG9ydHMuUGFyYW1ldGVyU3RydWN0dXJlcyA9IFBhcmFtZXRlclN0cnVjdHVyZXM7XG4vKipcbiAqIFRoZSBwYXJhbWV0ZXIgc3RydWN0dXJlIGlzIGF1dG9tYXRpY2FsbHkgaW5mZXJyZWQgb24gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzXG4gKiBhbmQgdGhlIHBhcmFtZXRlciB0eXBlIGluIGNhc2Ugb2YgYSBzaW5nbGUgcGFyYW0uXG4gKi9cblBhcmFtZXRlclN0cnVjdHVyZXMuYXV0byA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdhdXRvJyk7XG4vKipcbiAqIEZvcmNlcyBgYnlQb3NpdGlvbmAgcGFyYW1ldGVyIHN0cnVjdHVyZS4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGhhdmUgYSBzaW5nbGVcbiAqIHBhcmFtZXRlciB3aGljaCBoYXMgYSBsaXRlcmFsIHR5cGUuXG4gKi9cblBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbiA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdieVBvc2l0aW9uJyk7XG4vKipcbiAqIEZvcmNlcyBgYnlOYW1lYCBwYXJhbWV0ZXIgc3RydWN0dXJlLiBUaGlzIGlzIG9ubHkgdXNlZnVsIHdoZW4gaGF2aW5nIGEgc2luZ2xlXG4gKiBwYXJhbWV0ZXIuIFRoZSBsaWJyYXJ5IHdpbGwgcmVwb3J0IGVycm9ycyBpZiB1c2VkIHdpdGggYSBkaWZmZXJlbnQgbnVtYmVyIG9mXG4gKiBwYXJhbWV0ZXJzLlxuICovXG5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdieU5hbWUnKTtcbi8qKlxuICogQW4gYWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgYSBNZXNzYWdlVHlwZS5cbiAqL1xuY2xhc3MgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIG51bWJlck9mUGFyYW1zKSB7XG4gICAgICAgIHRoaXMubWV0aG9kID0gbWV0aG9kO1xuICAgICAgICB0aGlzLm51bWJlck9mUGFyYW1zID0gbnVtYmVyT2ZQYXJhbXM7XG4gICAgfVxuICAgIGdldCBwYXJhbWV0ZXJTdHJ1Y3R1cmVzKCkge1xuICAgICAgICByZXR1cm4gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvO1xuICAgIH1cbn1cbmV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlID0gQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlO1xuLyoqXG4gKiBDbGFzc2VzIHRvIHR5cGUgcmVxdWVzdCByZXNwb25zZSBwYWlyc1xuICovXG5jbGFzcyBSZXF1ZXN0VHlwZTAgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDApO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGUwID0gUmVxdWVzdFR5cGUwO1xuY2xhc3MgUmVxdWVzdFR5cGUgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCwgX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8pIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAxKTtcbiAgICAgICAgdGhpcy5fcGFyYW1ldGVyU3RydWN0dXJlcyA9IF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbiAgICBnZXQgcGFyYW1ldGVyU3RydWN0dXJlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXM7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IFJlcXVlc3RUeXBlO1xuY2xhc3MgUmVxdWVzdFR5cGUxIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMSk7XG4gICAgICAgIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBfcGFyYW1ldGVyU3RydWN0dXJlcztcbiAgICB9XG4gICAgZ2V0IHBhcmFtZXRlclN0cnVjdHVyZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGUxID0gUmVxdWVzdFR5cGUxO1xuY2xhc3MgUmVxdWVzdFR5cGUyIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAyKTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlMiA9IFJlcXVlc3RUeXBlMjtcbmNsYXNzIFJlcXVlc3RUeXBlMyBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMyk7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTMgPSBSZXF1ZXN0VHlwZTM7XG5jbGFzcyBSZXF1ZXN0VHlwZTQgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDQpO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGU0ID0gUmVxdWVzdFR5cGU0O1xuY2xhc3MgUmVxdWVzdFR5cGU1IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA1KTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlNSA9IFJlcXVlc3RUeXBlNTtcbmNsYXNzIFJlcXVlc3RUeXBlNiBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNik7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTYgPSBSZXF1ZXN0VHlwZTY7XG5jbGFzcyBSZXF1ZXN0VHlwZTcgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDcpO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGU3ID0gUmVxdWVzdFR5cGU3O1xuY2xhc3MgUmVxdWVzdFR5cGU4IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA4KTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlOCA9IFJlcXVlc3RUeXBlODtcbmNsYXNzIFJlcXVlc3RUeXBlOSBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgOSk7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTkgPSBSZXF1ZXN0VHlwZTk7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMSk7XG4gICAgICAgIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBfcGFyYW1ldGVyU3RydWN0dXJlcztcbiAgICB9XG4gICAgZ2V0IHBhcmFtZXRlclN0cnVjdHVyZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZSA9IE5vdGlmaWNhdGlvblR5cGU7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlMCBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMCk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMCA9IE5vdGlmaWNhdGlvblR5cGUwO1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTEgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCwgX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8pIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAxKTtcbiAgICAgICAgdGhpcy5fcGFyYW1ldGVyU3RydWN0dXJlcyA9IF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbiAgICBnZXQgcGFyYW1ldGVyU3RydWN0dXJlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXM7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMSA9IE5vdGlmaWNhdGlvblR5cGUxO1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDIpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTIgPSBOb3RpZmljYXRpb25UeXBlMjtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGUzIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAzKTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGUzID0gTm90aWZpY2F0aW9uVHlwZTM7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlNCBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNCk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNCA9IE5vdGlmaWNhdGlvblR5cGU0O1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTUgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDUpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTUgPSBOb3RpZmljYXRpb25UeXBlNTtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGU2IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA2KTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGU2ID0gTm90aWZpY2F0aW9uVHlwZTY7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlNyBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNyk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNyA9IE5vdGlmaWNhdGlvblR5cGU3O1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTggZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDgpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTggPSBOb3RpZmljYXRpb25UeXBlODtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGU5IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA5KTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGU5ID0gTm90aWZpY2F0aW9uVHlwZTk7XG52YXIgTWVzc2FnZTtcbihmdW5jdGlvbiAoTWVzc2FnZSkge1xuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoZSBnaXZlbiBtZXNzYWdlIGlzIGEgcmVxdWVzdCBtZXNzYWdlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gbWVzc2FnZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBpcy5zdHJpbmcoY2FuZGlkYXRlLm1ldGhvZCkgJiYgKGlzLnN0cmluZyhjYW5kaWRhdGUuaWQpIHx8IGlzLm51bWJlcihjYW5kaWRhdGUuaWQpKTtcbiAgICB9XG4gICAgTWVzc2FnZS5pc1JlcXVlc3QgPSBpc1JlcXVlc3Q7XG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhlIGdpdmVuIG1lc3NhZ2UgaXMgYSBub3RpZmljYXRpb24gbWVzc2FnZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTm90aWZpY2F0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gbWVzc2FnZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBpcy5zdHJpbmcoY2FuZGlkYXRlLm1ldGhvZCkgJiYgbWVzc2FnZS5pZCA9PT0gdm9pZCAwO1xuICAgIH1cbiAgICBNZXNzYWdlLmlzTm90aWZpY2F0aW9uID0gaXNOb3RpZmljYXRpb247XG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhlIGdpdmVuIG1lc3NhZ2UgaXMgYSByZXNwb25zZSBtZXNzYWdlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNSZXNwb25zZShtZXNzYWdlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IG1lc3NhZ2U7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgKGNhbmRpZGF0ZS5yZXN1bHQgIT09IHZvaWQgMCB8fCAhIWNhbmRpZGF0ZS5lcnJvcikgJiYgKGlzLnN0cmluZyhjYW5kaWRhdGUuaWQpIHx8IGlzLm51bWJlcihjYW5kaWRhdGUuaWQpIHx8IGNhbmRpZGF0ZS5pZCA9PT0gbnVsbCk7XG4gICAgfVxuICAgIE1lc3NhZ2UuaXNSZXNwb25zZSA9IGlzUmVzcG9uc2U7XG59KShNZXNzYWdlIHx8IChleHBvcnRzLk1lc3NhZ2UgPSBNZXNzYWdlID0ge30pKTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xudmFyIF9hO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5MUlVDYWNoZSA9IGV4cG9ydHMuTGlua2VkTWFwID0gZXhwb3J0cy5Ub3VjaCA9IHZvaWQgMDtcbnZhciBUb3VjaDtcbihmdW5jdGlvbiAoVG91Y2gpIHtcbiAgICBUb3VjaC5Ob25lID0gMDtcbiAgICBUb3VjaC5GaXJzdCA9IDE7XG4gICAgVG91Y2guQXNPbGQgPSBUb3VjaC5GaXJzdDtcbiAgICBUb3VjaC5MYXN0ID0gMjtcbiAgICBUb3VjaC5Bc05ldyA9IFRvdWNoLkxhc3Q7XG59KShUb3VjaCB8fCAoZXhwb3J0cy5Ub3VjaCA9IFRvdWNoID0ge30pKTtcbmNsYXNzIExpbmtlZE1hcCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXNbX2FdID0gJ0xpbmtlZE1hcCc7XG4gICAgICAgIHRoaXMuX21hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5faGVhZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fdGFpbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IDA7XG4gICAgICAgIHRoaXMuX3N0YXRlID0gMDtcbiAgICB9XG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuX21hcC5jbGVhcigpO1xuICAgICAgICB0aGlzLl9oZWFkID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl90YWlsID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9zaXplID0gMDtcbiAgICAgICAgdGhpcy5fc3RhdGUrKztcbiAgICB9XG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLl9oZWFkICYmICF0aGlzLl90YWlsO1xuICAgIH1cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpemU7XG4gICAgfVxuICAgIGdldCBmaXJzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlYWQ/LnZhbHVlO1xuICAgIH1cbiAgICBnZXQgbGFzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhaWw/LnZhbHVlO1xuICAgIH1cbiAgICBoYXMoa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXAuaGFzKGtleSk7XG4gICAgfVxuICAgIGdldChrZXksIHRvdWNoID0gVG91Y2guTm9uZSkge1xuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5fbWFwLmdldChrZXkpO1xuICAgICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRvdWNoICE9PSBUb3VjaC5Ob25lKSB7XG4gICAgICAgICAgICB0aGlzLnRvdWNoKGl0ZW0sIHRvdWNoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICB9XG4gICAgc2V0KGtleSwgdmFsdWUsIHRvdWNoID0gVG91Y2guTm9uZSkge1xuICAgICAgICBsZXQgaXRlbSA9IHRoaXMuX21hcC5nZXQoa2V5KTtcbiAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgIGl0ZW0udmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIGlmICh0b3VjaCAhPT0gVG91Y2guTm9uZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudG91Y2goaXRlbSwgdG91Y2gpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaXRlbSA9IHsga2V5LCB2YWx1ZSwgbmV4dDogdW5kZWZpbmVkLCBwcmV2aW91czogdW5kZWZpbmVkIH07XG4gICAgICAgICAgICBzd2l0Y2ggKHRvdWNoKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBUb3VjaC5Ob25lOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFRvdWNoLkZpcnN0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1GaXJzdChpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBUb3VjaC5MYXN0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX21hcC5zZXQoa2V5LCBpdGVtKTtcbiAgICAgICAgICAgIHRoaXMuX3NpemUrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGVsZXRlKGtleSkge1xuICAgICAgICByZXR1cm4gISF0aGlzLnJlbW92ZShrZXkpO1xuICAgIH1cbiAgICByZW1vdmUoa2V5KSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl9tYXAuZ2V0KGtleSk7XG4gICAgICAgIGlmICghaXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tYXAuZGVsZXRlKGtleSk7XG4gICAgICAgIHRoaXMucmVtb3ZlSXRlbShpdGVtKTtcbiAgICAgICAgdGhpcy5fc2l6ZS0tO1xuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICB9XG4gICAgc2hpZnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5faGVhZCAmJiAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2hlYWQgfHwgIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIHRoaXMuX21hcC5kZWxldGUoaXRlbS5rZXkpO1xuICAgICAgICB0aGlzLnJlbW92ZUl0ZW0oaXRlbSk7XG4gICAgICAgIHRoaXMuX3NpemUtLTtcbiAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7XG4gICAgfVxuICAgIGZvckVhY2goY2FsbGJhY2tmbiwgdGhpc0FyZykge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3N0YXRlO1xuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICAgICAgICBpZiAodGhpc0FyZykge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrZm4uYmluZCh0aGlzQXJnKShjdXJyZW50LnZhbHVlLCBjdXJyZW50LmtleSwgdGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFja2ZuKGN1cnJlbnQudmFsdWUsIGN1cnJlbnQua2V5LCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gc3RhdGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExpbmtlZE1hcCBnb3QgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAga2V5cygpIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9zdGF0ZTtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLl9oZWFkO1xuICAgICAgICBjb25zdCBpdGVyYXRvciA9IHtcbiAgICAgICAgICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fc3RhdGUgIT09IHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTGlua2VkTWFwIGdvdCBtb2RpZmllZCBkdXJpbmcgaXRlcmF0aW9uLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7IHZhbHVlOiBjdXJyZW50LmtleSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICB9XG4gICAgdmFsdWVzKCkge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3N0YXRlO1xuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIGNvbnN0IGl0ZXJhdG9yID0ge1xuICAgICAgICAgICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlcmF0b3I7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBMaW5rZWRNYXAgZ290IG1vZGlmaWVkIGR1cmluZyBpdGVyYXRpb24uYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHsgdmFsdWU6IGN1cnJlbnQudmFsdWUsIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gaXRlcmF0b3I7XG4gICAgfVxuICAgIGVudHJpZXMoKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5fc3RhdGU7XG4gICAgICAgIGxldCBjdXJyZW50ID0gdGhpcy5faGVhZDtcbiAgICAgICAgY29uc3QgaXRlcmF0b3IgPSB7XG4gICAgICAgICAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3N0YXRlICE9PSBzdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExpbmtlZE1hcCBnb3QgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geyB2YWx1ZTogW2N1cnJlbnQua2V5LCBjdXJyZW50LnZhbHVlXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICB9XG4gICAgWyhfYSA9IFN5bWJvbC50b1N0cmluZ1RhZywgU3ltYm9sLml0ZXJhdG9yKV0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMoKTtcbiAgICB9XG4gICAgdHJpbU9sZChuZXdTaXplKSB7XG4gICAgICAgIGlmIChuZXdTaXplID49IHRoaXMuc2l6ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuZXdTaXplID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLl9oZWFkO1xuICAgICAgICBsZXQgY3VycmVudFNpemUgPSB0aGlzLnNpemU7XG4gICAgICAgIHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnRTaXplID4gbmV3U2l6ZSkge1xuICAgICAgICAgICAgdGhpcy5fbWFwLmRlbGV0ZShjdXJyZW50LmtleSk7XG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0O1xuICAgICAgICAgICAgY3VycmVudFNpemUtLTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9oZWFkID0gY3VycmVudDtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IGN1cnJlbnRTaXplO1xuICAgICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICAgICAgY3VycmVudC5wcmV2aW91cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgIH1cbiAgICBhZGRJdGVtRmlyc3QoaXRlbSkge1xuICAgICAgICAvLyBGaXJzdCB0aW1lIEluc2VydFxuICAgICAgICBpZiAoIXRoaXMuX2hlYWQgJiYgIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRoaXMuX3RhaWwgPSBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCF0aGlzLl9oZWFkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbGlzdCcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdGhpcy5faGVhZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQucHJldmlvdXMgPSBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2hlYWQgPSBpdGVtO1xuICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgIH1cbiAgICBhZGRJdGVtTGFzdChpdGVtKSB7XG4gICAgICAgIC8vIEZpcnN0IHRpbWUgSW5zZXJ0XG4gICAgICAgIGlmICghdGhpcy5faGVhZCAmJiAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgdGhpcy5faGVhZCA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpdGVtLnByZXZpb3VzID0gdGhpcy5fdGFpbDtcbiAgICAgICAgICAgIHRoaXMuX3RhaWwubmV4dCA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW07XG4gICAgICAgIHRoaXMuX3N0YXRlKys7XG4gICAgfVxuICAgIHJlbW92ZUl0ZW0oaXRlbSkge1xuICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCAmJiBpdGVtID09PSB0aGlzLl90YWlsKSB7XG4gICAgICAgICAgICB0aGlzLl9oZWFkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpdGVtID09PSB0aGlzLl9oZWFkKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGNhbiBvbmx5IGhhcHBlbmVkIGlmIHNpemUgPT09IDEgd2hpY2ggaXMgaGFuZGxlXG4gICAgICAgICAgICAvLyBieSB0aGUgY2FzZSBhYm92ZS5cbiAgICAgICAgICAgIGlmICghaXRlbS5uZXh0KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxpc3QnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGl0ZW0ubmV4dC5wcmV2aW91cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQgPSBpdGVtLm5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXRlbSA9PT0gdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgLy8gVGhpcyBjYW4gb25seSBoYXBwZW5lZCBpZiBzaXplID09PSAxIHdoaWNoIGlzIGhhbmRsZVxuICAgICAgICAgICAgLy8gYnkgdGhlIGNhc2UgYWJvdmUuXG4gICAgICAgICAgICBpZiAoIWl0ZW0ucHJldmlvdXMpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbGlzdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbS5wcmV2aW91cy5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gaXRlbS5uZXh0O1xuICAgICAgICAgICAgY29uc3QgcHJldmlvdXMgPSBpdGVtLnByZXZpb3VzO1xuICAgICAgICAgICAgaWYgKCFuZXh0IHx8ICFwcmV2aW91cykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXh0LnByZXZpb3VzID0gcHJldmlvdXM7XG4gICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gbmV4dDtcbiAgICAgICAgfVxuICAgICAgICBpdGVtLm5leHQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGl0ZW0ucHJldmlvdXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX3N0YXRlKys7XG4gICAgfVxuICAgIHRvdWNoKGl0ZW0sIHRvdWNoKSB7XG4gICAgICAgIGlmICghdGhpcy5faGVhZCB8fCAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxpc3QnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHRvdWNoICE9PSBUb3VjaC5GaXJzdCAmJiB0b3VjaCAhPT0gVG91Y2guTGFzdCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG91Y2ggPT09IFRvdWNoLkZpcnN0KSB7XG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBpdGVtLm5leHQ7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgICAgICAvLyBVbmxpbmsgdGhlIGl0ZW1cbiAgICAgICAgICAgIGlmIChpdGVtID09PSB0aGlzLl90YWlsKSB7XG4gICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgbXVzdCBiZSBkZWZpbmVkIHNpbmNlIGl0ZW0gd2FzIG5vdCBoZWFkIGJ1dCBpcyB0YWlsXG4gICAgICAgICAgICAgICAgLy8gU28gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbiBpdGVtIGluIHRoZSBtYXBcbiAgICAgICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuX3RhaWwgPSBwcmV2aW91cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEJvdGggbmV4dCBhbmQgcHJldmlvdXMgYXJlIG5vdCB1bmRlZmluZWQgc2luY2UgaXRlbSB3YXMgbmVpdGhlciBoZWFkIG5vciB0YWlsLlxuICAgICAgICAgICAgICAgIG5leHQucHJldmlvdXMgPSBwcmV2aW91cztcbiAgICAgICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEluc2VydCB0aGUgbm9kZSBhdCBoZWFkXG4gICAgICAgICAgICBpdGVtLnByZXZpb3VzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdGhpcy5faGVhZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQucHJldmlvdXMgPSBpdGVtO1xuICAgICAgICAgICAgdGhpcy5faGVhZCA9IGl0ZW07XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRvdWNoID09PSBUb3VjaC5MYXN0KSB7XG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBpdGVtLm5leHQ7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgICAgICAvLyBVbmxpbmsgdGhlIGl0ZW0uXG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCkge1xuICAgICAgICAgICAgICAgIC8vIG5leHQgbXVzdCBiZSBkZWZpbmVkIHNpbmNlIGl0ZW0gd2FzIG5vdCB0YWlsIGJ1dCBpcyBoZWFkXG4gICAgICAgICAgICAgICAgLy8gU28gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbiBpdGVtIGluIHRoZSBtYXBcbiAgICAgICAgICAgICAgICBuZXh0LnByZXZpb3VzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuX2hlYWQgPSBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQm90aCBuZXh0IGFuZCBwcmV2aW91cyBhcmUgbm90IHVuZGVmaW5lZCBzaW5jZSBpdGVtIHdhcyBuZWl0aGVyIGhlYWQgbm9yIHRhaWwuXG4gICAgICAgICAgICAgICAgbmV4dC5wcmV2aW91cyA9IHByZXZpb3VzO1xuICAgICAgICAgICAgICAgIHByZXZpb3VzLm5leHQgPSBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaXRlbS5wcmV2aW91cyA9IHRoaXMuX3RhaWw7XG4gICAgICAgICAgICB0aGlzLl90YWlsLm5leHQgPSBpdGVtO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW07XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IFtdO1xuICAgICAgICB0aGlzLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGRhdGEucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGZyb21KU09OKGRhdGEpIHtcbiAgICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBkYXRhKSB7XG4gICAgICAgICAgICB0aGlzLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuTGlua2VkTWFwID0gTGlua2VkTWFwO1xuY2xhc3MgTFJVQ2FjaGUgZXh0ZW5kcyBMaW5rZWRNYXAge1xuICAgIGNvbnN0cnVjdG9yKGxpbWl0LCByYXRpbyA9IDEpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fbGltaXQgPSBsaW1pdDtcbiAgICAgICAgdGhpcy5fcmF0aW8gPSBNYXRoLm1pbihNYXRoLm1heCgwLCByYXRpbyksIDEpO1xuICAgIH1cbiAgICBnZXQgbGltaXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9saW1pdDtcbiAgICB9XG4gICAgc2V0IGxpbWl0KGxpbWl0KSB7XG4gICAgICAgIHRoaXMuX2xpbWl0ID0gbGltaXQ7XG4gICAgICAgIHRoaXMuY2hlY2tUcmltKCk7XG4gICAgfVxuICAgIGdldCByYXRpbygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JhdGlvO1xuICAgIH1cbiAgICBzZXQgcmF0aW8ocmF0aW8pIHtcbiAgICAgICAgdGhpcy5fcmF0aW8gPSBNYXRoLm1pbihNYXRoLm1heCgwLCByYXRpbyksIDEpO1xuICAgICAgICB0aGlzLmNoZWNrVHJpbSgpO1xuICAgIH1cbiAgICBnZXQoa2V5LCB0b3VjaCA9IFRvdWNoLkFzTmV3KSB7XG4gICAgICAgIHJldHVybiBzdXBlci5nZXQoa2V5LCB0b3VjaCk7XG4gICAgfVxuICAgIHBlZWsoa2V5KSB7XG4gICAgICAgIHJldHVybiBzdXBlci5nZXQoa2V5LCBUb3VjaC5Ob25lKTtcbiAgICB9XG4gICAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgc3VwZXIuc2V0KGtleSwgdmFsdWUsIFRvdWNoLkxhc3QpO1xuICAgICAgICB0aGlzLmNoZWNrVHJpbSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgY2hlY2tUcmltKCkge1xuICAgICAgICBpZiAodGhpcy5zaXplID4gdGhpcy5fbGltaXQpIHtcbiAgICAgICAgICAgIHRoaXMudHJpbU9sZChNYXRoLnJvdW5kKHRoaXMuX2xpbWl0ICogdGhpcy5fcmF0aW8pKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuTFJVQ2FjaGUgPSBMUlVDYWNoZTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5EaXNwb3NhYmxlID0gdm9pZCAwO1xudmFyIERpc3Bvc2FibGU7XG4oZnVuY3Rpb24gKERpc3Bvc2FibGUpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUoZnVuYykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGlzcG9zZTogZnVuY1xuICAgICAgICB9O1xuICAgIH1cbiAgICBEaXNwb3NhYmxlLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKERpc3Bvc2FibGUgfHwgKGV4cG9ydHMuRGlzcG9zYWJsZSA9IERpc3Bvc2FibGUgPSB7fSkpO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xubGV0IF9yYWw7XG5mdW5jdGlvbiBSQUwoKSB7XG4gICAgaWYgKF9yYWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHJ1bnRpbWUgYWJzdHJhY3Rpb24gbGF5ZXIgaW5zdGFsbGVkYCk7XG4gICAgfVxuICAgIHJldHVybiBfcmFsO1xufVxuKGZ1bmN0aW9uIChSQUwpIHtcbiAgICBmdW5jdGlvbiBpbnN0YWxsKHJhbCkge1xuICAgICAgICBpZiAocmFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gcnVudGltZSBhYnN0cmFjdGlvbiBsYXllciBwcm92aWRlZGApO1xuICAgICAgICB9XG4gICAgICAgIF9yYWwgPSByYWw7XG4gICAgfVxuICAgIFJBTC5pbnN0YWxsID0gaW5zdGFsbDtcbn0pKFJBTCB8fCAoUkFMID0ge30pKTtcbmV4cG9ydHMuZGVmYXVsdCA9IFJBTDtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuRW1pdHRlciA9IGV4cG9ydHMuRXZlbnQgPSB2b2lkIDA7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbnZhciBFdmVudDtcbihmdW5jdGlvbiAoRXZlbnQpIHtcbiAgICBjb25zdCBfZGlzcG9zYWJsZSA9IHsgZGlzcG9zZSgpIHsgfSB9O1xuICAgIEV2ZW50Lk5vbmUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBfZGlzcG9zYWJsZTsgfTtcbn0pKEV2ZW50IHx8IChleHBvcnRzLkV2ZW50ID0gRXZlbnQgPSB7fSkpO1xuY2xhc3MgQ2FsbGJhY2tMaXN0IHtcbiAgICBhZGQoY2FsbGJhY2ssIGNvbnRleHQgPSBudWxsLCBidWNrZXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fY29udGV4dHMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgICAgIHRoaXMuX2NvbnRleHRzLnB1c2goY29udGV4dCk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGJ1Y2tldCkpIHtcbiAgICAgICAgICAgIGJ1Y2tldC5wdXNoKHsgZGlzcG9zZTogKCkgPT4gdGhpcy5yZW1vdmUoY2FsbGJhY2ssIGNvbnRleHQpIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlbW92ZShjYWxsYmFjaywgY29udGV4dCA9IG51bGwpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZm91bmRDYWxsYmFja1dpdGhEaWZmZXJlbnRDb250ZXh0ID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLl9jYWxsYmFja3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jYWxsYmFja3NbaV0gPT09IGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NvbnRleHRzW2ldID09PSBjb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrICYgY29udGV4dCBtYXRjaCA9PiByZW1vdmUgaXRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29udGV4dHMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZENhbGxiYWNrV2l0aERpZmZlcmVudENvbnRleHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZm91bmRDYWxsYmFja1dpdGhEaWZmZXJlbnRDb250ZXh0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1doZW4gYWRkaW5nIGEgbGlzdGVuZXIgd2l0aCBhIGNvbnRleHQsIHlvdSBzaG91bGQgcmVtb3ZlIGl0IHdpdGggdGhlIHNhbWUgY29udGV4dCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGludm9rZSguLi5hcmdzKSB7XG4gICAgICAgIGlmICghdGhpcy5fY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmV0ID0gW10sIGNhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcy5zbGljZSgwKSwgY29udGV4dHMgPSB0aGlzLl9jb250ZXh0cy5zbGljZSgwKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXQucHVzaChjYWxsYmFja3NbaV0uYXBwbHkoY29udGV4dHNbaV0sIGFyZ3MpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS5jb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICAgIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5fY2FsbGJhY2tzIHx8IHRoaXMuX2NhbGxiYWNrcy5sZW5ndGggPT09IDA7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fY29udGV4dHMgPSB1bmRlZmluZWQ7XG4gICAgfVxufVxuY2xhc3MgRW1pdHRlciB7XG4gICAgY29uc3RydWN0b3IoX29wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IF9vcHRpb25zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGb3IgdGhlIHB1YmxpYyB0byBhbGxvdyB0byBzdWJzY3JpYmVcbiAgICAgKiB0byBldmVudHMgZnJvbSB0aGlzIEVtaXR0ZXJcbiAgICAgKi9cbiAgICBnZXQgZXZlbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fZXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50ID0gKGxpc3RlbmVyLCB0aGlzQXJncywgZGlzcG9zYWJsZXMpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2NhbGxiYWNrcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWxsYmFja3MgPSBuZXcgQ2FsbGJhY2tMaXN0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMub25GaXJzdExpc3RlbmVyQWRkICYmIHRoaXMuX2NhbGxiYWNrcy5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy5vbkZpcnN0TGlzdGVuZXJBZGQodGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5hZGQobGlzdGVuZXIsIHRoaXNBcmdzKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlzcG9zYWJsZSBpcyBkaXNwb3NlZCBhZnRlciBlbWl0dGVyIGlzIGRpc3Bvc2VkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5yZW1vdmUobGlzdGVuZXIsIHRoaXNBcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5kaXNwb3NlID0gRW1pdHRlci5fbm9vcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMub25MYXN0TGlzdGVuZXJSZW1vdmUgJiYgdGhpcy5fY2FsbGJhY2tzLmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29wdGlvbnMub25MYXN0TGlzdGVuZXJSZW1vdmUodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRpc3Bvc2FibGVzKSkge1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlcy5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9ldmVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVG8gYmUga2VwdCBwcml2YXRlIHRvIGZpcmUgYW4gZXZlbnQgdG9cbiAgICAgKiBzdWJzY3JpYmVyc1xuICAgICAqL1xuICAgIGZpcmUoZXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NhbGxiYWNrcykge1xuICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzLmludm9rZS5jYWxsKHRoaXMuX2NhbGxiYWNrcywgZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5kaXNwb3NlKCk7XG4gICAgICAgICAgICB0aGlzLl9jYWxsYmFja3MgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLkVtaXR0ZXIgPSBFbWl0dGVyO1xuRW1pdHRlci5fbm9vcCA9IGZ1bmN0aW9uICgpIHsgfTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uVG9rZW4gPSB2b2lkIDA7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbmNvbnN0IElzID0gcmVxdWlyZShcIi4vaXNcIik7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCIuL2V2ZW50c1wiKTtcbnZhciBDYW5jZWxsYXRpb25Ub2tlbjtcbihmdW5jdGlvbiAoQ2FuY2VsbGF0aW9uVG9rZW4pIHtcbiAgICBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGlzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkOiBmYWxzZSxcbiAgICAgICAgb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6IGV2ZW50c18xLkV2ZW50Lk5vbmVcbiAgICB9KTtcbiAgICBDYW5jZWxsYXRpb25Ub2tlbi5DYW5jZWxsZWQgPSBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6IHRydWUsXG4gICAgICAgIG9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkOiBldmVudHNfMS5FdmVudC5Ob25lXG4gICAgfSk7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgKGNhbmRpZGF0ZSA9PT0gQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZVxuICAgICAgICAgICAgfHwgY2FuZGlkYXRlID09PSBDYW5jZWxsYXRpb25Ub2tlbi5DYW5jZWxsZWRcbiAgICAgICAgICAgIHx8IChJcy5ib29sZWFuKGNhbmRpZGF0ZS5pc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkgJiYgISFjYW5kaWRhdGUub25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQpKTtcbiAgICB9XG4gICAgQ2FuY2VsbGF0aW9uVG9rZW4uaXMgPSBpcztcbn0pKENhbmNlbGxhdGlvblRva2VuIHx8IChleHBvcnRzLkNhbmNlbGxhdGlvblRva2VuID0gQ2FuY2VsbGF0aW9uVG9rZW4gPSB7fSkpO1xuY29uc3Qgc2hvcnRjdXRFdmVudCA9IE9iamVjdC5mcmVlemUoZnVuY3Rpb24gKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgY29uc3QgaGFuZGxlID0gKDAsIHJhbF8xLmRlZmF1bHQpKCkudGltZXIuc2V0VGltZW91dChjYWxsYmFjay5iaW5kKGNvbnRleHQpLCAwKTtcbiAgICByZXR1cm4geyBkaXNwb3NlKCkgeyBoYW5kbGUuZGlzcG9zZSgpOyB9IH07XG59KTtcbmNsYXNzIE11dGFibGVUb2tlbiB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX2lzQ2FuY2VsbGVkID0gZmFsc2U7XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9pc0NhbmNlbGxlZCkge1xuICAgICAgICAgICAgdGhpcy5faXNDYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2VtaXR0ZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmZpcmUodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0NhbmNlbGxlZDtcbiAgICB9XG4gICAgZ2V0IG9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKCkge1xuICAgICAgICBpZiAodGhpcy5faXNDYW5jZWxsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBzaG9ydGN1dEV2ZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5fZW1pdHRlcikge1xuICAgICAgICAgICAgdGhpcy5fZW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2VtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLl9lbWl0dGVyKSB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5jbGFzcyBDYW5jZWxsYXRpb25Ub2tlblNvdXJjZSB7XG4gICAgZ2V0IHRva2VuKCkge1xuICAgICAgICBpZiAoIXRoaXMuX3Rva2VuKSB7XG4gICAgICAgICAgICAvLyBiZSBsYXp5IGFuZCBjcmVhdGUgdGhlIHRva2VuIG9ubHkgd2hlblxuICAgICAgICAgICAgLy8gYWN0dWFsbHkgbmVlZGVkXG4gICAgICAgICAgICB0aGlzLl90b2tlbiA9IG5ldyBNdXRhYmxlVG9rZW4oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fdG9rZW47XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl90b2tlbikge1xuICAgICAgICAgICAgLy8gc2F2ZSBhbiBvYmplY3QgYnkgcmV0dXJuaW5nIHRoZSBkZWZhdWx0XG4gICAgICAgICAgICAvLyBjYW5jZWxsZWQgdG9rZW4gd2hlbiBjYW5jZWxsYXRpb24gaGFwcGVuc1xuICAgICAgICAgICAgLy8gYmVmb3JlIHNvbWVvbmUgYXNrcyBmb3IgdGhlIHRva2VuXG4gICAgICAgICAgICB0aGlzLl90b2tlbiA9IENhbmNlbGxhdGlvblRva2VuLkNhbmNlbGxlZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3Rva2VuLmNhbmNlbCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICghdGhpcy5fdG9rZW4pIHtcbiAgICAgICAgICAgIC8vIGVuc3VyZSB0byBpbml0aWFsaXplIHdpdGggYW4gZW1wdHkgdG9rZW4gaWYgd2UgaGFkIG5vbmVcbiAgICAgICAgICAgIHRoaXMuX3Rva2VuID0gQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLl90b2tlbiBpbnN0YW5jZW9mIE11dGFibGVUb2tlbikge1xuICAgICAgICAgICAgLy8gYWN0dWFsbHkgZGlzcG9zZVxuICAgICAgICAgICAgdGhpcy5fdG9rZW4uZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IENhbmNlbGxhdGlvblRva2VuU291cmNlO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3kgPSB2b2lkIDA7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbnZhciBDYW5jZWxsYXRpb25TdGF0ZTtcbihmdW5jdGlvbiAoQ2FuY2VsbGF0aW9uU3RhdGUpIHtcbiAgICBDYW5jZWxsYXRpb25TdGF0ZS5Db250aW51ZSA9IDA7XG4gICAgQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkID0gMTtcbn0pKENhbmNlbGxhdGlvblN0YXRlIHx8IChDYW5jZWxsYXRpb25TdGF0ZSA9IHt9KSk7XG5jbGFzcyBTaGFyZWRBcnJheVNlbmRlclN0cmF0ZWd5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5idWZmZXJzID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICBlbmFibGVDYW5jZWxsYXRpb24ocmVxdWVzdCkge1xuICAgICAgICBpZiAocmVxdWVzdC5pZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBTaGFyZWRBcnJheUJ1ZmZlcig0KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBJbnQzMkFycmF5KGJ1ZmZlciwgMCwgMSk7XG4gICAgICAgIGRhdGFbMF0gPSBDYW5jZWxsYXRpb25TdGF0ZS5Db250aW51ZTtcbiAgICAgICAgdGhpcy5idWZmZXJzLnNldChyZXF1ZXN0LmlkLCBidWZmZXIpO1xuICAgICAgICByZXF1ZXN0LiRjYW5jZWxsYXRpb25EYXRhID0gYnVmZmVyO1xuICAgIH1cbiAgICBhc3luYyBzZW5kQ2FuY2VsbGF0aW9uKF9jb25uLCBpZCkge1xuICAgICAgICBjb25zdCBidWZmZXIgPSB0aGlzLmJ1ZmZlcnMuZ2V0KGlkKTtcbiAgICAgICAgaWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBJbnQzMkFycmF5KGJ1ZmZlciwgMCwgMSk7XG4gICAgICAgIEF0b21pY3Muc3RvcmUoZGF0YSwgMCwgQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkKTtcbiAgICB9XG4gICAgY2xlYW51cChpZCkge1xuICAgICAgICB0aGlzLmJ1ZmZlcnMuZGVsZXRlKGlkKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy5idWZmZXJzLmNsZWFyKCk7XG4gICAgfVxufVxuZXhwb3J0cy5TaGFyZWRBcnJheVNlbmRlclN0cmF0ZWd5ID0gU2hhcmVkQXJyYXlTZW5kZXJTdHJhdGVneTtcbmNsYXNzIFNoYXJlZEFycmF5QnVmZmVyQ2FuY2VsbGF0aW9uVG9rZW4ge1xuICAgIGNvbnN0cnVjdG9yKGJ1ZmZlcikge1xuICAgICAgICB0aGlzLmRhdGEgPSBuZXcgSW50MzJBcnJheShidWZmZXIsIDAsIDEpO1xuICAgIH1cbiAgICBnZXQgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHJldHVybiBBdG9taWNzLmxvYWQodGhpcy5kYXRhLCAwKSA9PT0gQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkO1xuICAgIH1cbiAgICBnZXQgb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuY2VsbGF0aW9uIG92ZXIgU2hhcmVkQXJyYXlCdWZmZXIgZG9lc24ndCBzdXBwb3J0IGNhbmNlbGxhdGlvbiBldmVudHNgKTtcbiAgICB9XG59XG5jbGFzcyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuU291cmNlIHtcbiAgICBjb25zdHJ1Y3RvcihidWZmZXIpIHtcbiAgICAgICAgdGhpcy50b2tlbiA9IG5ldyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuKGJ1ZmZlcik7XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICB9XG59XG5jbGFzcyBTaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmtpbmQgPSAncmVxdWVzdCc7XG4gICAgfVxuICAgIGNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKHJlcXVlc3QpIHtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gcmVxdWVzdC4kY2FuY2VsbGF0aW9uRGF0YTtcbiAgICAgICAgaWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuU291cmNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuU291cmNlKGJ1ZmZlcik7XG4gICAgfVxufVxuZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBTaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3k7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNlbWFwaG9yZSA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY2xhc3MgU2VtYXBob3JlIHtcbiAgICBjb25zdHJ1Y3RvcihjYXBhY2l0eSA9IDEpIHtcbiAgICAgICAgaWYgKGNhcGFjaXR5IDw9IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FwYWNpdHkgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NhcGFjaXR5ID0gY2FwYWNpdHk7XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IDA7XG4gICAgICAgIHRoaXMuX3dhaXRpbmcgPSBbXTtcbiAgICB9XG4gICAgbG9jayh0aHVuaykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fd2FpdGluZy5wdXNoKHsgdGh1bmssIHJlc29sdmUsIHJlamVjdCB9KTtcbiAgICAgICAgICAgIHRoaXMucnVuTmV4dCgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0IGFjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTtcbiAgICB9XG4gICAgcnVuTmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dhaXRpbmcubGVuZ3RoID09PSAwIHx8IHRoaXMuX2FjdGl2ZSA9PT0gdGhpcy5fY2FwYWNpdHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS50aW1lci5zZXRJbW1lZGlhdGUoKCkgPT4gdGhpcy5kb1J1bk5leHQoKSk7XG4gICAgfVxuICAgIGRvUnVuTmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dhaXRpbmcubGVuZ3RoID09PSAwIHx8IHRoaXMuX2FjdGl2ZSA9PT0gdGhpcy5fY2FwYWNpdHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5fd2FpdGluZy5zaGlmdCgpO1xuICAgICAgICB0aGlzLl9hY3RpdmUrKztcbiAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZSA+IHRoaXMuX2NhcGFjaXR5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRvIG1hbnkgdGh1bmtzIGFjdGl2ZWApO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXh0LnRodW5rKCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC50aGVuKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5yZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5OZXh0KCk7XG4gICAgICAgICAgICAgICAgfSwgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5yZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5OZXh0KCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICBuZXh0LnJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1bk5leHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgIG5leHQucmVqZWN0KGVycik7XG4gICAgICAgICAgICB0aGlzLnJ1bk5leHQoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuU2VtYXBob3JlID0gU2VtYXBob3JlO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXIgPSBleHBvcnRzLkFic3RyYWN0TWVzc2FnZVJlYWRlciA9IGV4cG9ydHMuTWVzc2FnZVJlYWRlciA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IGV2ZW50c18xID0gcmVxdWlyZShcIi4vZXZlbnRzXCIpO1xuY29uc3Qgc2VtYXBob3JlXzEgPSByZXF1aXJlKFwiLi9zZW1hcGhvcmVcIik7XG52YXIgTWVzc2FnZVJlYWRlcjtcbihmdW5jdGlvbiAoTWVzc2FnZVJlYWRlcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5saXN0ZW4pICYmIElzLmZ1bmMoY2FuZGlkYXRlLmRpc3Bvc2UpICYmXG4gICAgICAgICAgICBJcy5mdW5jKGNhbmRpZGF0ZS5vbkVycm9yKSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5vbkNsb3NlKSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5vblBhcnRpYWxNZXNzYWdlKTtcbiAgICB9XG4gICAgTWVzc2FnZVJlYWRlci5pcyA9IGlzO1xufSkoTWVzc2FnZVJlYWRlciB8fCAoZXhwb3J0cy5NZXNzYWdlUmVhZGVyID0gTWVzc2FnZVJlYWRlciA9IHt9KSk7XG5jbGFzcyBBYnN0cmFjdE1lc3NhZ2VSZWFkZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZUVtaXR0ZXIgPSBuZXcgZXZlbnRzXzEuRW1pdHRlcigpO1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlci5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgZ2V0IG9uRXJyb3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVycm9yRW1pdHRlci5ldmVudDtcbiAgICB9XG4gICAgZmlyZUVycm9yKGVycm9yKSB7XG4gICAgICAgIHRoaXMuZXJyb3JFbWl0dGVyLmZpcmUodGhpcy5hc0Vycm9yKGVycm9yKSk7XG4gICAgfVxuICAgIGdldCBvbkNsb3NlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9zZUVtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGZpcmVDbG9zZSgpIHtcbiAgICAgICAgdGhpcy5jbG9zZUVtaXR0ZXIuZmlyZSh1bmRlZmluZWQpO1xuICAgIH1cbiAgICBnZXQgb25QYXJ0aWFsTWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFydGlhbE1lc3NhZ2VFbWl0dGVyLmV2ZW50O1xuICAgIH1cbiAgICBmaXJlUGFydGlhbE1lc3NhZ2UoaW5mbykge1xuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlRW1pdHRlci5maXJlKGluZm8pO1xuICAgIH1cbiAgICBhc0Vycm9yKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKGBSZWFkZXIgcmVjZWl2ZWQgZXJyb3IuIFJlYXNvbjogJHtJcy5zdHJpbmcoZXJyb3IubWVzc2FnZSkgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24nfWApO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VSZWFkZXIgPSBBYnN0cmFjdE1lc3NhZ2VSZWFkZXI7XG52YXIgUmVzb2x2ZWRNZXNzYWdlUmVhZGVyT3B0aW9ucztcbihmdW5jdGlvbiAoUmVzb2x2ZWRNZXNzYWdlUmVhZGVyT3B0aW9ucykge1xuICAgIGZ1bmN0aW9uIGZyb21PcHRpb25zKG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IGNoYXJzZXQ7XG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIGxldCBjb250ZW50RGVjb2RlcjtcbiAgICAgICAgY29uc3QgY29udGVudERlY29kZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICBsZXQgY29udGVudFR5cGVEZWNvZGVyO1xuICAgICAgICBjb25zdCBjb250ZW50VHlwZURlY29kZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY2hhcnNldCA9IG9wdGlvbnMgPz8gJ3V0Zi04JztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNoYXJzZXQgPSBvcHRpb25zLmNoYXJzZXQgPz8gJ3V0Zi04JztcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnREZWNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50RGVjb2RlciA9IG9wdGlvbnMuY29udGVudERlY29kZXI7XG4gICAgICAgICAgICAgICAgY29udGVudERlY29kZXJzLnNldChjb250ZW50RGVjb2Rlci5uYW1lLCBjb250ZW50RGVjb2Rlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5jb250ZW50RGVjb2RlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGVjb2RlciBvZiBvcHRpb25zLmNvbnRlbnREZWNvZGVycykge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50RGVjb2RlcnMuc2V0KGRlY29kZXIubmFtZSwgZGVjb2Rlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuY29udGVudFR5cGVEZWNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXIgPSBvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcjtcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXJzLnNldChjb250ZW50VHlwZURlY29kZXIubmFtZSwgY29udGVudFR5cGVEZWNvZGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGVjb2RlciBvZiBvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGVEZWNvZGVycy5zZXQoZGVjb2Rlci5uYW1lLCBkZWNvZGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnRlbnRUeXBlRGVjb2RlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXIgPSAoMCwgcmFsXzEuZGVmYXVsdCkoKS5hcHBsaWNhdGlvbkpzb24uZGVjb2RlcjtcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlRGVjb2RlcnMuc2V0KGNvbnRlbnRUeXBlRGVjb2Rlci5uYW1lLCBjb250ZW50VHlwZURlY29kZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGNoYXJzZXQsIGNvbnRlbnREZWNvZGVyLCBjb250ZW50RGVjb2RlcnMsIGNvbnRlbnRUeXBlRGVjb2RlciwgY29udGVudFR5cGVEZWNvZGVycyB9O1xuICAgIH1cbiAgICBSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zLmZyb21PcHRpb25zID0gZnJvbU9wdGlvbnM7XG59KShSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zIHx8IChSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zID0ge30pKTtcbmNsYXNzIFJlYWRhYmxlU3RyZWFtTWVzc2FnZVJlYWRlciBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVJlYWRlciB7XG4gICAgY29uc3RydWN0b3IocmVhZGFibGUsIG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZSA9IHJlYWRhYmxlO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zLmZyb21PcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmJ1ZmZlciA9ICgwLCByYWxfMS5kZWZhdWx0KSgpLm1lc3NhZ2VCdWZmZXIuY3JlYXRlKHRoaXMub3B0aW9ucy5jaGFyc2V0KTtcbiAgICAgICAgdGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0ID0gMTAwMDA7XG4gICAgICAgIHRoaXMubmV4dE1lc3NhZ2VMZW5ndGggPSAtMTtcbiAgICAgICAgdGhpcy5tZXNzYWdlVG9rZW4gPSAwO1xuICAgICAgICB0aGlzLnJlYWRTZW1hcGhvcmUgPSBuZXcgc2VtYXBob3JlXzEuU2VtYXBob3JlKDEpO1xuICAgIH1cbiAgICBzZXQgcGFydGlhbE1lc3NhZ2VUaW1lb3V0KHRpbWVvdXQpIHtcbiAgICAgICAgdGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0ID0gdGltZW91dDtcbiAgICB9XG4gICAgZ2V0IHBhcnRpYWxNZXNzYWdlVGltZW91dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dDtcbiAgICB9XG4gICAgbGlzdGVuKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMubmV4dE1lc3NhZ2VMZW5ndGggPSAtMTtcbiAgICAgICAgdGhpcy5tZXNzYWdlVG9rZW4gPSAwO1xuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlVGltZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5yZWFkYWJsZS5vbkRhdGEoKGRhdGEpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25EYXRhKGRhdGEpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZS5vbkVycm9yKChlcnJvcikgPT4gdGhpcy5maXJlRXJyb3IoZXJyb3IpKTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZS5vbkNsb3NlKCgpID0+IHRoaXMuZmlyZUNsb3NlKCkpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBvbkRhdGEoZGF0YSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5idWZmZXIuYXBwZW5kKGRhdGEpO1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IHRoaXMuYnVmZmVyLnRyeVJlYWRIZWFkZXJzKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50TGVuZ3RoID0gaGVhZGVycy5nZXQoJ2NvbnRlbnQtbGVuZ3RoJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY29udGVudExlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IobmV3IEVycm9yKGBIZWFkZXIgbXVzdCBwcm92aWRlIGEgQ29udGVudC1MZW5ndGggcHJvcGVydHkuXFxuJHtKU09OLnN0cmluZ2lmeShPYmplY3QuZnJvbUVudHJpZXMoaGVhZGVycykpfWApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsZW5ndGggPSBwYXJzZUludChjb250ZW50TGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKGxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKG5ldyBFcnJvcihgQ29udGVudC1MZW5ndGggdmFsdWUgbXVzdCBiZSBhIG51bWJlci4gR290ICR7Y29udGVudExlbmd0aH1gKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IHRoaXMuYnVmZmVyLnRyeVJlYWRCb2R5KHRoaXMubmV4dE1lc3NhZ2VMZW5ndGgpO1xuICAgICAgICAgICAgICAgIGlmIChib2R5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLyoqIFdlIGhhdmVuJ3QgcmVjZWl2ZWQgdGhlIGZ1bGwgbWVzc2FnZSB5ZXQuICovXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0UGFydGlhbE1lc3NhZ2VUaW1lcigpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJQYXJ0aWFsTWVzc2FnZVRpbWVyKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9IC0xO1xuICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHdlIGNvbnZlcnQgb25lIHJlY2VpdmVkIG1lc3NhZ2UgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAgICAgLy8gb3RoZXIuIE90aGVyd2lzZSBpdCBjb3VsZCBoYXBwZW4gdGhhdCBhIGRlY29kaW5nIG9mIGEgc2Vjb25kXG4gICAgICAgICAgICAgICAgLy8gc21hbGxlciBtZXNzYWdlIGZpbmlzaGVkIGJlZm9yZSB0aGUgZGVjb2Rpbmcgb2YgYSBmaXJzdCBsYXJnZXJcbiAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIGFuZCB0aGVuIHdlIHdvdWxkIGRlbGl2ZXIgdGhlIHNlY29uZCBtZXNzYWdlIGZpcnN0LlxuICAgICAgICAgICAgICAgIHRoaXMucmVhZFNlbWFwaG9yZS5sb2NrKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnl0ZXMgPSB0aGlzLm9wdGlvbnMuY29udGVudERlY29kZXIgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBhd2FpdCB0aGlzLm9wdGlvbnMuY29udGVudERlY29kZXIuZGVjb2RlKGJvZHkpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGJvZHk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBhd2FpdCB0aGlzLm9wdGlvbnMuY29udGVudFR5cGVEZWNvZGVyLmRlY29kZShieXRlcywgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjayhtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNsZWFyUGFydGlhbE1lc3NhZ2VUaW1lcigpIHtcbiAgICAgICAgaWYgKHRoaXMucGFydGlhbE1lc3NhZ2VUaW1lcikge1xuICAgICAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZVRpbWVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRoaXMucGFydGlhbE1lc3NhZ2VUaW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRQYXJ0aWFsTWVzc2FnZVRpbWVyKCkge1xuICAgICAgICB0aGlzLmNsZWFyUGFydGlhbE1lc3NhZ2VUaW1lcigpO1xuICAgICAgICBpZiAodGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0IDw9IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlVGltZXIgPSAoMCwgcmFsXzEuZGVmYXVsdCkoKS50aW1lci5zZXRUaW1lb3V0KCh0b2tlbiwgdGltZW91dCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZVRpbWVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRva2VuID09PSB0aGlzLm1lc3NhZ2VUb2tlbikge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZVBhcnRpYWxNZXNzYWdlKHsgbWVzc2FnZVRva2VuOiB0b2tlbiwgd2FpdGluZ1RpbWU6IHRpbWVvdXQgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRQYXJ0aWFsTWVzc2FnZVRpbWVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dCwgdGhpcy5tZXNzYWdlVG9rZW4sIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dCk7XG4gICAgfVxufVxuZXhwb3J0cy5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXIgPSBSZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLldyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLkFic3RyYWN0TWVzc2FnZVdyaXRlciA9IGV4cG9ydHMuTWVzc2FnZVdyaXRlciA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IHNlbWFwaG9yZV8xID0gcmVxdWlyZShcIi4vc2VtYXBob3JlXCIpO1xuY29uc3QgZXZlbnRzXzEgPSByZXF1aXJlKFwiLi9ldmVudHNcIik7XG5jb25zdCBDb250ZW50TGVuZ3RoID0gJ0NvbnRlbnQtTGVuZ3RoOiAnO1xuY29uc3QgQ1JMRiA9ICdcXHJcXG4nO1xudmFyIE1lc3NhZ2VXcml0ZXI7XG4oZnVuY3Rpb24gKE1lc3NhZ2VXcml0ZXIpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgSXMuZnVuYyhjYW5kaWRhdGUuZGlzcG9zZSkgJiYgSXMuZnVuYyhjYW5kaWRhdGUub25DbG9zZSkgJiZcbiAgICAgICAgICAgIElzLmZ1bmMoY2FuZGlkYXRlLm9uRXJyb3IpICYmIElzLmZ1bmMoY2FuZGlkYXRlLndyaXRlKTtcbiAgICB9XG4gICAgTWVzc2FnZVdyaXRlci5pcyA9IGlzO1xufSkoTWVzc2FnZVdyaXRlciB8fCAoZXhwb3J0cy5NZXNzYWdlV3JpdGVyID0gTWVzc2FnZVdyaXRlciA9IHt9KSk7XG5jbGFzcyBBYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy5lcnJvckVtaXR0ZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLmNsb3NlRW1pdHRlci5kaXNwb3NlKCk7XG4gICAgfVxuICAgIGdldCBvbkVycm9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lcnJvckVtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGZpcmVFcnJvcihlcnJvciwgbWVzc2FnZSwgY291bnQpIHtcbiAgICAgICAgdGhpcy5lcnJvckVtaXR0ZXIuZmlyZShbdGhpcy5hc0Vycm9yKGVycm9yKSwgbWVzc2FnZSwgY291bnRdKTtcbiAgICB9XG4gICAgZ2V0IG9uQ2xvc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb3NlRW1pdHRlci5ldmVudDtcbiAgICB9XG4gICAgZmlyZUNsb3NlKCkge1xuICAgICAgICB0aGlzLmNsb3NlRW1pdHRlci5maXJlKHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIGFzRXJyb3IoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoYFdyaXRlciByZWNlaXZlZCBlcnJvci4gUmVhc29uOiAke0lzLnN0cmluZyhlcnJvci5tZXNzYWdlKSA/IGVycm9yLm1lc3NhZ2UgOiAndW5rbm93bid9YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLkFic3RyYWN0TWVzc2FnZVdyaXRlciA9IEFic3RyYWN0TWVzc2FnZVdyaXRlcjtcbnZhciBSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zO1xuKGZ1bmN0aW9uIChSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zKSB7XG4gICAgZnVuY3Rpb24gZnJvbU9wdGlvbnMob3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHsgY2hhcnNldDogb3B0aW9ucyA/PyAndXRmLTgnLCBjb250ZW50VHlwZUVuY29kZXI6ICgwLCByYWxfMS5kZWZhdWx0KSgpLmFwcGxpY2F0aW9uSnNvbi5lbmNvZGVyIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4geyBjaGFyc2V0OiBvcHRpb25zLmNoYXJzZXQgPz8gJ3V0Zi04JywgY29udGVudEVuY29kZXI6IG9wdGlvbnMuY29udGVudEVuY29kZXIsIGNvbnRlbnRUeXBlRW5jb2Rlcjogb3B0aW9ucy5jb250ZW50VHlwZUVuY29kZXIgPz8gKDAsIHJhbF8xLmRlZmF1bHQpKCkuYXBwbGljYXRpb25Kc29uLmVuY29kZXIgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zLmZyb21PcHRpb25zID0gZnJvbU9wdGlvbnM7XG59KShSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zIHx8IChSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zID0ge30pKTtcbmNsYXNzIFdyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKHdyaXRhYmxlLCBvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMud3JpdGFibGUgPSB3cml0YWJsZTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gUmVzb2x2ZWRNZXNzYWdlV3JpdGVyT3B0aW9ucy5mcm9tT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50ID0gMDtcbiAgICAgICAgdGhpcy53cml0ZVNlbWFwaG9yZSA9IG5ldyBzZW1hcGhvcmVfMS5TZW1hcGhvcmUoMSk7XG4gICAgICAgIHRoaXMud3JpdGFibGUub25FcnJvcigoZXJyb3IpID0+IHRoaXMuZmlyZUVycm9yKGVycm9yKSk7XG4gICAgICAgIHRoaXMud3JpdGFibGUub25DbG9zZSgoKSA9PiB0aGlzLmZpcmVDbG9zZSgpKTtcbiAgICB9XG4gICAgYXN5bmMgd3JpdGUobXNnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndyaXRlU2VtYXBob3JlLmxvY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHRoaXMub3B0aW9ucy5jb250ZW50VHlwZUVuY29kZXIuZW5jb2RlKG1zZywgdGhpcy5vcHRpb25zKS50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNvbnRlbnRFbmNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jb250ZW50RW5jb2Rlci5lbmNvZGUoYnVmZmVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZC50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJzID0gW107XG4gICAgICAgICAgICAgICAgaGVhZGVycy5wdXNoKENvbnRlbnRMZW5ndGgsIGJ1ZmZlci5ieXRlTGVuZ3RoLnRvU3RyaW5nKCksIENSTEYpO1xuICAgICAgICAgICAgICAgIGhlYWRlcnMucHVzaChDUkxGKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kb1dyaXRlKG1zZywgaGVhZGVycywgYnVmZmVyKTtcbiAgICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgZG9Xcml0ZShtc2csIGhlYWRlcnMsIGRhdGEpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMud3JpdGFibGUud3JpdGUoaGVhZGVycy5qb2luKCcnKSwgJ2FzY2lpJyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy53cml0YWJsZS53cml0ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IsIG1zZyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZUVycm9yKGVycm9yLCBtc2cpIHtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50Kys7XG4gICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yLCBtc2csIHRoaXMuZXJyb3JDb3VudCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICAgICAgdGhpcy53cml0YWJsZS5lbmQoKTtcbiAgICB9XG59XG5leHBvcnRzLldyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgPSBXcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkFic3RyYWN0TWVzc2FnZUJ1ZmZlciA9IHZvaWQgMDtcbmNvbnN0IENSID0gMTM7XG5jb25zdCBMRiA9IDEwO1xuY29uc3QgQ1JMRiA9ICdcXHJcXG4nO1xuY2xhc3MgQWJzdHJhY3RNZXNzYWdlQnVmZmVyIHtcbiAgICBjb25zdHJ1Y3RvcihlbmNvZGluZyA9ICd1dGYtOCcpIHtcbiAgICAgICAgdGhpcy5fZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgICAgICAgdGhpcy5fY2h1bmtzID0gW107XG4gICAgICAgIHRoaXMuX3RvdGFsTGVuZ3RoID0gMDtcbiAgICB9XG4gICAgZ2V0IGVuY29kaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW5jb2Rpbmc7XG4gICAgfVxuICAgIGFwcGVuZChjaHVuaykge1xuICAgICAgICBjb25zdCB0b0FwcGVuZCA9IHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZycgPyB0aGlzLmZyb21TdHJpbmcoY2h1bmssIHRoaXMuX2VuY29kaW5nKSA6IGNodW5rO1xuICAgICAgICB0aGlzLl9jaHVua3MucHVzaCh0b0FwcGVuZCk7XG4gICAgICAgIHRoaXMuX3RvdGFsTGVuZ3RoICs9IHRvQXBwZW5kLmJ5dGVMZW5ndGg7XG4gICAgfVxuICAgIHRyeVJlYWRIZWFkZXJzKGxvd2VyQ2FzZUtleXMgPSBmYWxzZSkge1xuICAgICAgICBpZiAodGhpcy5fY2h1bmtzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3RhdGUgPSAwO1xuICAgICAgICBsZXQgY2h1bmtJbmRleCA9IDA7XG4gICAgICAgIGxldCBvZmZzZXQgPSAwO1xuICAgICAgICBsZXQgY2h1bmtCeXRlc1JlYWQgPSAwO1xuICAgICAgICByb3c6IHdoaWxlIChjaHVua0luZGV4IDwgdGhpcy5fY2h1bmtzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgY2h1bmsgPSB0aGlzLl9jaHVua3NbY2h1bmtJbmRleF07XG4gICAgICAgICAgICBvZmZzZXQgPSAwO1xuICAgICAgICAgICAgY29sdW1uOiB3aGlsZSAob2Zmc2V0IDwgY2h1bmsubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjaHVua1tvZmZzZXRdO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDUjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIExGOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gNDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHJvdztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjaHVua0J5dGVzUmVhZCArPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgY2h1bmtJbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZSAhPT0gNCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgYnVmZmVyIGNvbnRhaW5zIHRoZSB0d28gQ1JMRiBhdCB0aGUgZW5kLiBTbyB3ZSB3aWxsXG4gICAgICAgIC8vIGhhdmUgdHdvIGVtcHR5IGxpbmVzIGFmdGVyIHRoZSBzcGxpdCBhdCB0aGUgZW5kIGFzIHdlbGwuXG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuX3JlYWQoY2h1bmtCeXRlc1JlYWQgKyBvZmZzZXQpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwKCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLnRvU3RyaW5nKGJ1ZmZlciwgJ2FzY2lpJykuc3BsaXQoQ1JMRik7XG4gICAgICAgIGlmIChoZWFkZXJzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXJzLmxlbmd0aCAtIDI7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaGVhZGVyID0gaGVhZGVyc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gaGVhZGVyLmluZGV4T2YoJzonKTtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1lc3NhZ2UgaGVhZGVyIG11c3Qgc2VwYXJhdGUga2V5IGFuZCB2YWx1ZSB1c2luZyAnOidcXG4ke2hlYWRlcn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGhlYWRlci5zdWJzdHIoMCwgaW5kZXgpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBoZWFkZXIuc3Vic3RyKGluZGV4ICsgMSkudHJpbSgpO1xuICAgICAgICAgICAgcmVzdWx0LnNldChsb3dlckNhc2VLZXlzID8ga2V5LnRvTG93ZXJDYXNlKCkgOiBrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICB0cnlSZWFkQm9keShsZW5ndGgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3RvdGFsTGVuZ3RoIDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkKGxlbmd0aCk7XG4gICAgfVxuICAgIGdldCBudW1iZXJPZkJ5dGVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdG90YWxMZW5ndGg7XG4gICAgfVxuICAgIF9yZWFkKGJ5dGVDb3VudCkge1xuICAgICAgICBpZiAoYnl0ZUNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbXB0eUJ1ZmZlcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChieXRlQ291bnQgPiB0aGlzLl90b3RhbExlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVhZCBzbyBtYW55IGJ5dGVzIWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jaHVua3NbMF0uYnl0ZUxlbmd0aCA9PT0gYnl0ZUNvdW50KSB7XG4gICAgICAgICAgICAvLyBzdXBlciBmYXN0IHBhdGgsIHByZWNpc2VseSBmaXJzdCBjaHVuayBtdXN0IGJlIHJldHVybmVkXG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1swXTtcbiAgICAgICAgICAgIHRoaXMuX2NodW5rcy5zaGlmdCgpO1xuICAgICAgICAgICAgdGhpcy5fdG90YWxMZW5ndGggLT0gYnl0ZUNvdW50O1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXNOYXRpdmUoY2h1bmspO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jaHVua3NbMF0uYnl0ZUxlbmd0aCA+IGJ5dGVDb3VudCkge1xuICAgICAgICAgICAgLy8gZmFzdCBwYXRoLCB0aGUgcmVhZGluZyBpcyBlbnRpcmVseSB3aXRoaW4gdGhlIGZpcnN0IGNodW5rXG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1swXTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuYXNOYXRpdmUoY2h1bmssIGJ5dGVDb3VudCk7XG4gICAgICAgICAgICB0aGlzLl9jaHVua3NbMF0gPSBjaHVuay5zbGljZShieXRlQ291bnQpO1xuICAgICAgICAgICAgdGhpcy5fdG90YWxMZW5ndGggLT0gYnl0ZUNvdW50O1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmFsbG9jTmF0aXZlKGJ5dGVDb3VudCk7XG4gICAgICAgIGxldCByZXN1bHRPZmZzZXQgPSAwO1xuICAgICAgICBsZXQgY2h1bmtJbmRleCA9IDA7XG4gICAgICAgIHdoaWxlIChieXRlQ291bnQgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1tjaHVua0luZGV4XTtcbiAgICAgICAgICAgIGlmIChjaHVuay5ieXRlTGVuZ3RoID4gYnl0ZUNvdW50KSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBjaHVuayB3aWxsIHN1cnZpdmVcbiAgICAgICAgICAgICAgICBjb25zdCBjaHVua1BhcnQgPSBjaHVuay5zbGljZSgwLCBieXRlQ291bnQpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5zZXQoY2h1bmtQYXJ0LCByZXN1bHRPZmZzZXQpO1xuICAgICAgICAgICAgICAgIHJlc3VsdE9mZnNldCArPSBieXRlQ291bnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2h1bmtzW2NodW5rSW5kZXhdID0gY2h1bmsuc2xpY2UoYnl0ZUNvdW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLl90b3RhbExlbmd0aCAtPSBieXRlQ291bnQ7XG4gICAgICAgICAgICAgICAgYnl0ZUNvdW50IC09IGJ5dGVDb3VudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHRoaXMgY2h1bmsgd2lsbCBiZSBlbnRpcmVseSByZWFkXG4gICAgICAgICAgICAgICAgcmVzdWx0LnNldChjaHVuaywgcmVzdWx0T2Zmc2V0KTtcbiAgICAgICAgICAgICAgICByZXN1bHRPZmZzZXQgKz0gY2h1bmsuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgICAgICB0aGlzLl9jaHVua3Muc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl90b3RhbExlbmd0aCAtPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgICAgIGJ5dGVDb3VudCAtPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VCdWZmZXIgPSBBYnN0cmFjdE1lc3NhZ2VCdWZmZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uID0gZXhwb3J0cy5Db25uZWN0aW9uT3B0aW9ucyA9IGV4cG9ydHMuTWVzc2FnZVN0cmF0ZWd5ID0gZXhwb3J0cy5DYW5jZWxsYXRpb25TdHJhdGVneSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gZXhwb3J0cy5JZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IGV4cG9ydHMuQ29ubmVjdGlvbkVycm9yID0gZXhwb3J0cy5Db25uZWN0aW9uRXJyb3JzID0gZXhwb3J0cy5Mb2dUcmFjZU5vdGlmaWNhdGlvbiA9IGV4cG9ydHMuU2V0VHJhY2VOb3RpZmljYXRpb24gPSBleHBvcnRzLlRyYWNlRm9ybWF0ID0gZXhwb3J0cy5UcmFjZVZhbHVlcyA9IGV4cG9ydHMuVHJhY2UgPSBleHBvcnRzLk51bGxMb2dnZXIgPSBleHBvcnRzLlByb2dyZXNzVHlwZSA9IGV4cG9ydHMuUHJvZ3Jlc3NUb2tlbiA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IG1lc3NhZ2VzXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlc1wiKTtcbmNvbnN0IGxpbmtlZE1hcF8xID0gcmVxdWlyZShcIi4vbGlua2VkTWFwXCIpO1xuY29uc3QgZXZlbnRzXzEgPSByZXF1aXJlKFwiLi9ldmVudHNcIik7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbnZhciBDYW5jZWxOb3RpZmljYXRpb247XG4oZnVuY3Rpb24gKENhbmNlbE5vdGlmaWNhdGlvbikge1xuICAgIENhbmNlbE5vdGlmaWNhdGlvbi50eXBlID0gbmV3IG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZSgnJC9jYW5jZWxSZXF1ZXN0Jyk7XG59KShDYW5jZWxOb3RpZmljYXRpb24gfHwgKENhbmNlbE5vdGlmaWNhdGlvbiA9IHt9KSk7XG52YXIgUHJvZ3Jlc3NUb2tlbjtcbihmdW5jdGlvbiAoUHJvZ3Jlc3NUb2tlbikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG4gICAgfVxuICAgIFByb2dyZXNzVG9rZW4uaXMgPSBpcztcbn0pKFByb2dyZXNzVG9rZW4gfHwgKGV4cG9ydHMuUHJvZ3Jlc3NUb2tlbiA9IFByb2dyZXNzVG9rZW4gPSB7fSkpO1xudmFyIFByb2dyZXNzTm90aWZpY2F0aW9uO1xuKGZ1bmN0aW9uIChQcm9ncmVzc05vdGlmaWNhdGlvbikge1xuICAgIFByb2dyZXNzTm90aWZpY2F0aW9uLnR5cGUgPSBuZXcgbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlKCckL3Byb2dyZXNzJyk7XG59KShQcm9ncmVzc05vdGlmaWNhdGlvbiB8fCAoUHJvZ3Jlc3NOb3RpZmljYXRpb24gPSB7fSkpO1xuY2xhc3MgUHJvZ3Jlc3NUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICB9XG59XG5leHBvcnRzLlByb2dyZXNzVHlwZSA9IFByb2dyZXNzVHlwZTtcbnZhciBTdGFyUmVxdWVzdEhhbmRsZXI7XG4oZnVuY3Rpb24gKFN0YXJSZXF1ZXN0SGFuZGxlcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBJcy5mdW5jKHZhbHVlKTtcbiAgICB9XG4gICAgU3RhclJlcXVlc3RIYW5kbGVyLmlzID0gaXM7XG59KShTdGFyUmVxdWVzdEhhbmRsZXIgfHwgKFN0YXJSZXF1ZXN0SGFuZGxlciA9IHt9KSk7XG5leHBvcnRzLk51bGxMb2dnZXIgPSBPYmplY3QuZnJlZXplKHtcbiAgICBlcnJvcjogKCkgPT4geyB9LFxuICAgIHdhcm46ICgpID0+IHsgfSxcbiAgICBpbmZvOiAoKSA9PiB7IH0sXG4gICAgbG9nOiAoKSA9PiB7IH1cbn0pO1xudmFyIFRyYWNlO1xuKGZ1bmN0aW9uIChUcmFjZSkge1xuICAgIFRyYWNlW1RyYWNlW1wiT2ZmXCJdID0gMF0gPSBcIk9mZlwiO1xuICAgIFRyYWNlW1RyYWNlW1wiTWVzc2FnZXNcIl0gPSAxXSA9IFwiTWVzc2FnZXNcIjtcbiAgICBUcmFjZVtUcmFjZVtcIkNvbXBhY3RcIl0gPSAyXSA9IFwiQ29tcGFjdFwiO1xuICAgIFRyYWNlW1RyYWNlW1wiVmVyYm9zZVwiXSA9IDNdID0gXCJWZXJib3NlXCI7XG59KShUcmFjZSB8fCAoZXhwb3J0cy5UcmFjZSA9IFRyYWNlID0ge30pKTtcbnZhciBUcmFjZVZhbHVlcztcbihmdW5jdGlvbiAoVHJhY2VWYWx1ZXMpIHtcbiAgICAvKipcbiAgICAgKiBUdXJuIHRyYWNpbmcgb2ZmLlxuICAgICAqL1xuICAgIFRyYWNlVmFsdWVzLk9mZiA9ICdvZmYnO1xuICAgIC8qKlxuICAgICAqIFRyYWNlIG1lc3NhZ2VzIG9ubHkuXG4gICAgICovXG4gICAgVHJhY2VWYWx1ZXMuTWVzc2FnZXMgPSAnbWVzc2FnZXMnO1xuICAgIC8qKlxuICAgICAqIENvbXBhY3QgbWVzc2FnZSB0cmFjaW5nLlxuICAgICAqL1xuICAgIFRyYWNlVmFsdWVzLkNvbXBhY3QgPSAnY29tcGFjdCc7XG4gICAgLyoqXG4gICAgICogVmVyYm9zZSBtZXNzYWdlIHRyYWNpbmcuXG4gICAgICovXG4gICAgVHJhY2VWYWx1ZXMuVmVyYm9zZSA9ICd2ZXJib3NlJztcbn0pKFRyYWNlVmFsdWVzIHx8IChleHBvcnRzLlRyYWNlVmFsdWVzID0gVHJhY2VWYWx1ZXMgPSB7fSkpO1xuKGZ1bmN0aW9uIChUcmFjZSkge1xuICAgIGZ1bmN0aW9uIGZyb21TdHJpbmcodmFsdWUpIHtcbiAgICAgICAgaWYgKCFJcy5zdHJpbmcodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gVHJhY2UuT2ZmO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSAnb2ZmJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gVHJhY2UuT2ZmO1xuICAgICAgICAgICAgY2FzZSAnbWVzc2FnZXMnOlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5NZXNzYWdlcztcbiAgICAgICAgICAgIGNhc2UgJ2NvbXBhY3QnOlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5Db21wYWN0O1xuICAgICAgICAgICAgY2FzZSAndmVyYm9zZSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFRyYWNlLlZlcmJvc2U7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5PZmY7XG4gICAgICAgIH1cbiAgICB9XG4gICAgVHJhY2UuZnJvbVN0cmluZyA9IGZyb21TdHJpbmc7XG4gICAgZnVuY3Rpb24gdG9TdHJpbmcodmFsdWUpIHtcbiAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5PZmY6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdvZmYnO1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5NZXNzYWdlczpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ21lc3NhZ2VzJztcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuQ29tcGFjdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2NvbXBhY3QnO1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5WZXJib3NlOlxuICAgICAgICAgICAgICAgIHJldHVybiAndmVyYm9zZSc7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAnb2ZmJztcbiAgICAgICAgfVxuICAgIH1cbiAgICBUcmFjZS50b1N0cmluZyA9IHRvU3RyaW5nO1xufSkoVHJhY2UgfHwgKGV4cG9ydHMuVHJhY2UgPSBUcmFjZSA9IHt9KSk7XG52YXIgVHJhY2VGb3JtYXQ7XG4oZnVuY3Rpb24gKFRyYWNlRm9ybWF0KSB7XG4gICAgVHJhY2VGb3JtYXRbXCJUZXh0XCJdID0gXCJ0ZXh0XCI7XG4gICAgVHJhY2VGb3JtYXRbXCJKU09OXCJdID0gXCJqc29uXCI7XG59KShUcmFjZUZvcm1hdCB8fCAoZXhwb3J0cy5UcmFjZUZvcm1hdCA9IFRyYWNlRm9ybWF0ID0ge30pKTtcbihmdW5jdGlvbiAoVHJhY2VGb3JtYXQpIHtcbiAgICBmdW5jdGlvbiBmcm9tU3RyaW5nKHZhbHVlKSB7XG4gICAgICAgIGlmICghSXMuc3RyaW5nKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIFRyYWNlRm9ybWF0LlRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAodmFsdWUgPT09ICdqc29uJykge1xuICAgICAgICAgICAgcmV0dXJuIFRyYWNlRm9ybWF0LkpTT047XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gVHJhY2VGb3JtYXQuVGV4dDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBUcmFjZUZvcm1hdC5mcm9tU3RyaW5nID0gZnJvbVN0cmluZztcbn0pKFRyYWNlRm9ybWF0IHx8IChleHBvcnRzLlRyYWNlRm9ybWF0ID0gVHJhY2VGb3JtYXQgPSB7fSkpO1xudmFyIFNldFRyYWNlTm90aWZpY2F0aW9uO1xuKGZ1bmN0aW9uIChTZXRUcmFjZU5vdGlmaWNhdGlvbikge1xuICAgIFNldFRyYWNlTm90aWZpY2F0aW9uLnR5cGUgPSBuZXcgbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlKCckL3NldFRyYWNlJyk7XG59KShTZXRUcmFjZU5vdGlmaWNhdGlvbiB8fCAoZXhwb3J0cy5TZXRUcmFjZU5vdGlmaWNhdGlvbiA9IFNldFRyYWNlTm90aWZpY2F0aW9uID0ge30pKTtcbnZhciBMb2dUcmFjZU5vdGlmaWNhdGlvbjtcbihmdW5jdGlvbiAoTG9nVHJhY2VOb3RpZmljYXRpb24pIHtcbiAgICBMb2dUcmFjZU5vdGlmaWNhdGlvbi50eXBlID0gbmV3IG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZSgnJC9sb2dUcmFjZScpO1xufSkoTG9nVHJhY2VOb3RpZmljYXRpb24gfHwgKGV4cG9ydHMuTG9nVHJhY2VOb3RpZmljYXRpb24gPSBMb2dUcmFjZU5vdGlmaWNhdGlvbiA9IHt9KSk7XG52YXIgQ29ubmVjdGlvbkVycm9ycztcbihmdW5jdGlvbiAoQ29ubmVjdGlvbkVycm9ycykge1xuICAgIC8qKlxuICAgICAqIFRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZC5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uRXJyb3JzW0Nvbm5lY3Rpb25FcnJvcnNbXCJDbG9zZWRcIl0gPSAxXSA9IFwiQ2xvc2VkXCI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gZ290IGRpc3Bvc2VkLlxuICAgICAqL1xuICAgIENvbm5lY3Rpb25FcnJvcnNbQ29ubmVjdGlvbkVycm9yc1tcIkRpc3Bvc2VkXCJdID0gMl0gPSBcIkRpc3Bvc2VkXCI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBpbiBsaXN0ZW5pbmcgbW9kZS5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uRXJyb3JzW0Nvbm5lY3Rpb25FcnJvcnNbXCJBbHJlYWR5TGlzdGVuaW5nXCJdID0gM10gPSBcIkFscmVhZHlMaXN0ZW5pbmdcIjtcbn0pKENvbm5lY3Rpb25FcnJvcnMgfHwgKGV4cG9ydHMuQ29ubmVjdGlvbkVycm9ycyA9IENvbm5lY3Rpb25FcnJvcnMgPSB7fSkpO1xuY2xhc3MgQ29ubmVjdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNvZGUsIG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBDb25uZWN0aW9uRXJyb3IucHJvdG90eXBlKTtcbiAgICB9XG59XG5leHBvcnRzLkNvbm5lY3Rpb25FcnJvciA9IENvbm5lY3Rpb25FcnJvcjtcbnZhciBDb25uZWN0aW9uU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENvbm5lY3Rpb25TdHJhdGVneSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNhbmNlbFVuZGlzcGF0Y2hlZCk7XG4gICAgfVxuICAgIENvbm5lY3Rpb25TdHJhdGVneS5pcyA9IGlzO1xufSkoQ29ubmVjdGlvblN0cmF0ZWd5IHx8IChleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IENvbm5lY3Rpb25TdHJhdGVneSA9IHt9KSk7XG52YXIgSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5O1xuKGZ1bmN0aW9uIChJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiAoY2FuZGlkYXRlLmtpbmQgPT09IHVuZGVmaW5lZCB8fCBjYW5kaWRhdGUua2luZCA9PT0gJ2lkJykgJiYgSXMuZnVuYyhjYW5kaWRhdGUuY3JlYXRlQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UpICYmIChjYW5kaWRhdGUuZGlzcG9zZSA9PT0gdW5kZWZpbmVkIHx8IElzLmZ1bmMoY2FuZGlkYXRlLmRpc3Bvc2UpKTtcbiAgICB9XG4gICAgSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzID0gaXM7XG59KShJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgfHwgKGV4cG9ydHMuSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0ge30pKTtcbnZhciBSZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneTtcbihmdW5jdGlvbiAoUmVxdWVzdENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBjYW5kaWRhdGUua2luZCA9PT0gJ3JlcXVlc3QnICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKSAmJiAoY2FuZGlkYXRlLmRpc3Bvc2UgPT09IHVuZGVmaW5lZCB8fCBJcy5mdW5jKGNhbmRpZGF0ZS5kaXNwb3NlKSk7XG4gICAgfVxuICAgIFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzID0gaXM7XG59KShSZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSB8fCAoZXhwb3J0cy5SZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0ge30pKTtcbnZhciBDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5O1xuKGZ1bmN0aW9uIChDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5NZXNzYWdlID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKF8pIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgY2FuY2VsbGF0aW9uXzEuQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UoKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kuaXModmFsdWUpIHx8IFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKHZhbHVlKTtcbiAgICB9XG4gICAgQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5pcyA9IGlzO1xufSkoQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSB8fCAoZXhwb3J0cy5DYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IHt9KSk7XG52YXIgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENhbmNlbGxhdGlvblNlbmRlclN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kuTWVzc2FnZSA9IE9iamVjdC5mcmVlemUoe1xuICAgICAgICBzZW5kQ2FuY2VsbGF0aW9uKGNvbm4sIGlkKSB7XG4gICAgICAgICAgICByZXR1cm4gY29ubi5zZW5kTm90aWZpY2F0aW9uKENhbmNlbE5vdGlmaWNhdGlvbi50eXBlLCB7IGlkIH0pO1xuICAgICAgICB9LFxuICAgICAgICBjbGVhbnVwKF8pIHsgfVxuICAgIH0pO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLnNlbmRDYW5jZWxsYXRpb24pICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNsZWFudXApO1xuICAgIH1cbiAgICBDYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneS5pcyA9IGlzO1xufSkoQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgfHwgKGV4cG9ydHMuQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgPSBDYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneSA9IHt9KSk7XG52YXIgQ2FuY2VsbGF0aW9uU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENhbmNlbGxhdGlvblN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uU3RyYXRlZ3kuTWVzc2FnZSA9IE9iamVjdC5mcmVlemUoe1xuICAgICAgICByZWNlaXZlcjogQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5NZXNzYWdlLFxuICAgICAgICBzZW5kZXI6IENhbmNlbGxhdGlvblNlbmRlclN0cmF0ZWd5Lk1lc3NhZ2VcbiAgICB9KTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKGNhbmRpZGF0ZS5yZWNlaXZlcikgJiYgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kuaXMoY2FuZGlkYXRlLnNlbmRlcik7XG4gICAgfVxuICAgIENhbmNlbGxhdGlvblN0cmF0ZWd5LmlzID0gaXM7XG59KShDYW5jZWxsYXRpb25TdHJhdGVneSB8fCAoZXhwb3J0cy5DYW5jZWxsYXRpb25TdHJhdGVneSA9IENhbmNlbGxhdGlvblN0cmF0ZWd5ID0ge30pKTtcbnZhciBNZXNzYWdlU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKE1lc3NhZ2VTdHJhdGVneSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLmhhbmRsZU1lc3NhZ2UpO1xuICAgIH1cbiAgICBNZXNzYWdlU3RyYXRlZ3kuaXMgPSBpcztcbn0pKE1lc3NhZ2VTdHJhdGVneSB8fCAoZXhwb3J0cy5NZXNzYWdlU3RyYXRlZ3kgPSBNZXNzYWdlU3RyYXRlZ3kgPSB7fSkpO1xudmFyIENvbm5lY3Rpb25PcHRpb25zO1xuKGZ1bmN0aW9uIChDb25uZWN0aW9uT3B0aW9ucykge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIChDYW5jZWxsYXRpb25TdHJhdGVneS5pcyhjYW5kaWRhdGUuY2FuY2VsbGF0aW9uU3RyYXRlZ3kpIHx8IENvbm5lY3Rpb25TdHJhdGVneS5pcyhjYW5kaWRhdGUuY29ubmVjdGlvblN0cmF0ZWd5KSB8fCBNZXNzYWdlU3RyYXRlZ3kuaXMoY2FuZGlkYXRlLm1lc3NhZ2VTdHJhdGVneSkpO1xuICAgIH1cbiAgICBDb25uZWN0aW9uT3B0aW9ucy5pcyA9IGlzO1xufSkoQ29ubmVjdGlvbk9wdGlvbnMgfHwgKGV4cG9ydHMuQ29ubmVjdGlvbk9wdGlvbnMgPSBDb25uZWN0aW9uT3B0aW9ucyA9IHt9KSk7XG52YXIgQ29ubmVjdGlvblN0YXRlO1xuKGZ1bmN0aW9uIChDb25uZWN0aW9uU3RhdGUpIHtcbiAgICBDb25uZWN0aW9uU3RhdGVbQ29ubmVjdGlvblN0YXRlW1wiTmV3XCJdID0gMV0gPSBcIk5ld1wiO1xuICAgIENvbm5lY3Rpb25TdGF0ZVtDb25uZWN0aW9uU3RhdGVbXCJMaXN0ZW5pbmdcIl0gPSAyXSA9IFwiTGlzdGVuaW5nXCI7XG4gICAgQ29ubmVjdGlvblN0YXRlW0Nvbm5lY3Rpb25TdGF0ZVtcIkNsb3NlZFwiXSA9IDNdID0gXCJDbG9zZWRcIjtcbiAgICBDb25uZWN0aW9uU3RhdGVbQ29ubmVjdGlvblN0YXRlW1wiRGlzcG9zZWRcIl0gPSA0XSA9IFwiRGlzcG9zZWRcIjtcbn0pKENvbm5lY3Rpb25TdGF0ZSB8fCAoQ29ubmVjdGlvblN0YXRlID0ge30pKTtcbmZ1bmN0aW9uIGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uKG1lc3NhZ2VSZWFkZXIsIG1lc3NhZ2VXcml0ZXIsIF9sb2dnZXIsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBsb2dnZXIgPSBfbG9nZ2VyICE9PSB1bmRlZmluZWQgPyBfbG9nZ2VyIDogZXhwb3J0cy5OdWxsTG9nZ2VyO1xuICAgIGxldCBzZXF1ZW5jZU51bWJlciA9IDA7XG4gICAgbGV0IG5vdGlmaWNhdGlvblNlcXVlbmNlTnVtYmVyID0gMDtcbiAgICBsZXQgdW5rbm93blJlc3BvbnNlU2VxdWVuY2VOdW1iZXIgPSAwO1xuICAgIGNvbnN0IHZlcnNpb24gPSAnMi4wJztcbiAgICBsZXQgc3RhclJlcXVlc3RIYW5kbGVyID0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlcXVlc3RIYW5kbGVycyA9IG5ldyBNYXAoKTtcbiAgICBsZXQgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgY29uc3Qgbm90aWZpY2F0aW9uSGFuZGxlcnMgPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgcHJvZ3Jlc3NIYW5kbGVycyA9IG5ldyBNYXAoKTtcbiAgICBsZXQgdGltZXI7XG4gICAgbGV0IG1lc3NhZ2VRdWV1ZSA9IG5ldyBsaW5rZWRNYXBfMS5MaW5rZWRNYXAoKTtcbiAgICBsZXQgcmVzcG9uc2VQcm9taXNlcyA9IG5ldyBNYXAoKTtcbiAgICBsZXQga25vd25DYW5jZWxlZFJlcXVlc3RzID0gbmV3IFNldCgpO1xuICAgIGxldCByZXF1ZXN0VG9rZW5zID0gbmV3IE1hcCgpO1xuICAgIGxldCB0cmFjZSA9IFRyYWNlLk9mZjtcbiAgICBsZXQgdHJhY2VGb3JtYXQgPSBUcmFjZUZvcm1hdC5UZXh0O1xuICAgIGxldCB0cmFjZXI7XG4gICAgbGV0IHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLk5ldztcbiAgICBjb25zdCBlcnJvckVtaXR0ZXIgPSBuZXcgZXZlbnRzXzEuRW1pdHRlcigpO1xuICAgIGNvbnN0IGNsb3NlRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgdW5oYW5kbGVkTm90aWZpY2F0aW9uRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgdW5oYW5kbGVkUHJvZ3Jlc3NFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICBjb25zdCBkaXNwb3NlRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgY2FuY2VsbGF0aW9uU3RyYXRlZ3kgPSAob3B0aW9ucyAmJiBvcHRpb25zLmNhbmNlbGxhdGlvblN0cmF0ZWd5KSA/IG9wdGlvbnMuY2FuY2VsbGF0aW9uU3RyYXRlZ3kgOiBDYW5jZWxsYXRpb25TdHJhdGVneS5NZXNzYWdlO1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlcXVlc3RRdWV1ZUtleShpZCkge1xuICAgICAgICBpZiAoaWQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuJ3Qgc2VuZCByZXF1ZXN0cyB3aXRoIGlkIG51bGwgc2luY2UgdGhlIHJlc3BvbnNlIGNhbid0IGJlIGNvcnJlbGF0ZWQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdyZXEtJyArIGlkLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlc3BvbnNlUXVldWVLZXkoaWQpIHtcbiAgICAgICAgaWYgKGlkID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3Jlcy11bmtub3duLScgKyAoKyt1bmtub3duUmVzcG9uc2VTZXF1ZW5jZU51bWJlcikudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAncmVzLScgKyBpZC50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZU5vdGlmaWNhdGlvblF1ZXVlS2V5KCkge1xuICAgICAgICByZXR1cm4gJ25vdC0nICsgKCsrbm90aWZpY2F0aW9uU2VxdWVuY2VOdW1iZXIpLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFkZE1lc3NhZ2VUb1F1ZXVlKHF1ZXVlLCBtZXNzYWdlKSB7XG4gICAgICAgIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXF1ZXN0KG1lc3NhZ2UpKSB7XG4gICAgICAgICAgICBxdWV1ZS5zZXQoY3JlYXRlUmVxdWVzdFF1ZXVlS2V5KG1lc3NhZ2UuaWQpLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXNwb25zZShtZXNzYWdlKSkge1xuICAgICAgICAgICAgcXVldWUuc2V0KGNyZWF0ZVJlc3BvbnNlUXVldWVLZXkobWVzc2FnZS5pZCksIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcXVldWUuc2V0KGNyZWF0ZU5vdGlmaWNhdGlvblF1ZXVlS2V5KCksIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNhbmNlbFVuZGlzcGF0Y2hlZChfbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0xpc3RlbmluZygpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlID09PSBDb25uZWN0aW9uU3RhdGUuTGlzdGVuaW5nO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0Nsb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlID09PSBDb25uZWN0aW9uU3RhdGUuQ2xvc2VkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0Rpc3Bvc2VkKCkge1xuICAgICAgICByZXR1cm4gc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5EaXNwb3NlZDtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2xvc2VIYW5kbGVyKCkge1xuICAgICAgICBpZiAoc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5OZXcgfHwgc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5MaXN0ZW5pbmcpIHtcbiAgICAgICAgICAgIHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLkNsb3NlZDtcbiAgICAgICAgICAgIGNsb3NlRW1pdHRlci5maXJlKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlIGNvbm5lY3Rpb24gaXMgZGlzcG9zZWQgZG9uJ3Qgc2VudCBjbG9zZSBldmVudHMuXG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlYWRFcnJvckhhbmRsZXIoZXJyb3IpIHtcbiAgICAgICAgZXJyb3JFbWl0dGVyLmZpcmUoW2Vycm9yLCB1bmRlZmluZWQsIHVuZGVmaW5lZF0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiB3cml0ZUVycm9ySGFuZGxlcihkYXRhKSB7XG4gICAgICAgIGVycm9yRW1pdHRlci5maXJlKGRhdGEpO1xuICAgIH1cbiAgICBtZXNzYWdlUmVhZGVyLm9uQ2xvc2UoY2xvc2VIYW5kbGVyKTtcbiAgICBtZXNzYWdlUmVhZGVyLm9uRXJyb3IocmVhZEVycm9ySGFuZGxlcik7XG4gICAgbWVzc2FnZVdyaXRlci5vbkNsb3NlKGNsb3NlSGFuZGxlcik7XG4gICAgbWVzc2FnZVdyaXRlci5vbkVycm9yKHdyaXRlRXJyb3JIYW5kbGVyKTtcbiAgICBmdW5jdGlvbiB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCkge1xuICAgICAgICBpZiAodGltZXIgfHwgbWVzc2FnZVF1ZXVlLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aW1lciA9ICgwLCByYWxfMS5kZWZhdWx0KSgpLnRpbWVyLnNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICAgICAgICB0aW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHByb2Nlc3NNZXNzYWdlUXVldWUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGhhbmRsZU1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICBpZiAobWVzc2FnZXNfMS5NZXNzYWdlLmlzUmVxdWVzdChtZXNzYWdlKSkge1xuICAgICAgICAgICAgaGFuZGxlUmVxdWVzdChtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNOb3RpZmljYXRpb24obWVzc2FnZSkpIHtcbiAgICAgICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvbihtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXNwb25zZShtZXNzYWdlKSkge1xuICAgICAgICAgICAgaGFuZGxlUmVzcG9uc2UobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBoYW5kbGVJbnZhbGlkTWVzc2FnZShtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBwcm9jZXNzTWVzc2FnZVF1ZXVlKCkge1xuICAgICAgICBpZiAobWVzc2FnZVF1ZXVlLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXNzYWdlID0gbWVzc2FnZVF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlU3RyYXRlZ3kgPSBvcHRpb25zPy5tZXNzYWdlU3RyYXRlZ3k7XG4gICAgICAgICAgICBpZiAoTWVzc2FnZVN0cmF0ZWd5LmlzKG1lc3NhZ2VTdHJhdGVneSkpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlU3RyYXRlZ3kuaGFuZGxlTWVzc2FnZShtZXNzYWdlLCBoYW5kbGVNZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGhhbmRsZU1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgY2FsbGJhY2sgPSAobWVzc2FnZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2UgaGF2ZSByZWNlaXZlZCBhIGNhbmNlbGxhdGlvbiBtZXNzYWdlLiBDaGVjayBpZiB0aGUgbWVzc2FnZSBpcyBzdGlsbCBpbiB0aGUgcXVldWVcbiAgICAgICAgICAgIC8vIGFuZCBjYW5jZWwgaXQgaWYgYWxsb3dlZCB0byBkbyBzby5cbiAgICAgICAgICAgIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNOb3RpZmljYXRpb24obWVzc2FnZSkgJiYgbWVzc2FnZS5tZXRob2QgPT09IENhbmNlbE5vdGlmaWNhdGlvbi50eXBlLm1ldGhvZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbmNlbElkID0gbWVzc2FnZS5wYXJhbXMuaWQ7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gY3JlYXRlUmVxdWVzdFF1ZXVlS2V5KGNhbmNlbElkKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0b0NhbmNlbCA9IG1lc3NhZ2VRdWV1ZS5nZXQoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZXNfMS5NZXNzYWdlLmlzUmVxdWVzdCh0b0NhbmNlbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyYXRlZ3kgPSBvcHRpb25zPy5jb25uZWN0aW9uU3RyYXRlZ3k7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gKHN0cmF0ZWd5ICYmIHN0cmF0ZWd5LmNhbmNlbFVuZGlzcGF0Y2hlZCkgPyBzdHJhdGVneS5jYW5jZWxVbmRpc3BhdGNoZWQodG9DYW5jZWwsIGNhbmNlbFVuZGlzcGF0Y2hlZCkgOiBjYW5jZWxVbmRpc3BhdGNoZWQodG9DYW5jZWwpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgJiYgKHJlc3BvbnNlLmVycm9yICE9PSB1bmRlZmluZWQgfHwgcmVzcG9uc2UucmVzdWx0ICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUXVldWUuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLmRlbGV0ZShjYW5jZWxJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5pZCA9IHRvQ2FuY2VsLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VTZW5kaW5nUmVzcG9uc2UocmVzcG9uc2UsIG1lc3NhZ2UubWV0aG9kLCBEYXRlLm5vdygpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUocmVzcG9uc2UpLmNhdGNoKCgpID0+IGxvZ2dlci5lcnJvcihgU2VuZGluZyByZXNwb25zZSBmb3IgY2FuY2VsZWQgbWVzc2FnZSBmYWlsZWQuYCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGNhbmNlbGxhdGlvblRva2VuID0gcmVxdWVzdFRva2Vucy5nZXQoY2FuY2VsSWQpO1xuICAgICAgICAgICAgICAgIC8vIFRoZSByZXF1ZXN0IGlzIGFscmVhZHkgcnVubmluZy4gQ2FuY2VsIHRoZSB0b2tlblxuICAgICAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbmNlbGxhdGlvblRva2VuLmNhbmNlbCgpO1xuICAgICAgICAgICAgICAgICAgICB0cmFjZVJlY2VpdmVkTm90aWZpY2F0aW9uKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZW1lbWJlciB0aGUgY2FuY2VsIGJ1dCBzdGlsbCBxdWV1ZSB0aGUgbWVzc2FnZSB0b1xuICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbiB1cCBzdGF0ZSBpbiBwcm9jZXNzIG1lc3NhZ2UuXG4gICAgICAgICAgICAgICAgICAgIGtub3duQ2FuY2VsZWRSZXF1ZXN0cy5hZGQoY2FuY2VsSWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFkZE1lc3NhZ2VUb1F1ZXVlKG1lc3NhZ2VRdWV1ZSwgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGZ1bmN0aW9uIGhhbmRsZVJlcXVlc3QocmVxdWVzdE1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgLy8gd2UgcmV0dXJuIGhlcmUgc2lsZW50bHkgc2luY2Ugd2UgZmlyZWQgYW4gZXZlbnQgd2hlbiB0aGVcbiAgICAgICAgICAgIC8vIGNvbm5lY3Rpb24gZ290IGRpc3Bvc2VkLlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHJlcGx5KHJlc3VsdE9yRXJyb3IsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgaWQ6IHJlcXVlc3RNZXNzYWdlLmlkXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKHJlc3VsdE9yRXJyb3IgaW5zdGFuY2VvZiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlLmVycm9yID0gcmVzdWx0T3JFcnJvci50b0pzb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVzdWx0ID0gcmVzdWx0T3JFcnJvciA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHJlc3VsdE9yRXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cmFjZVNlbmRpbmdSZXNwb25zZShtZXNzYWdlLCBtZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICBtZXNzYWdlV3JpdGVyLndyaXRlKG1lc3NhZ2UpLmNhdGNoKCgpID0+IGxvZ2dlci5lcnJvcihgU2VuZGluZyByZXNwb25zZSBmYWlsZWQuYCkpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHJlcGx5RXJyb3IoZXJyb3IsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgaWQ6IHJlcXVlc3RNZXNzYWdlLmlkLFxuICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvci50b0pzb24oKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUobWVzc2FnZSkuY2F0Y2goKCkgPT4gbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlc3BvbnNlIGZhaWxlZC5gKSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gcmVwbHlTdWNjZXNzKHJlc3VsdCwgbWV0aG9kLCBzdGFydFRpbWUpIHtcbiAgICAgICAgICAgIC8vIFRoZSBKU09OIFJQQyBkZWZpbmVzIHRoYXQgYSByZXNwb25zZSBtdXN0IGVpdGhlciBoYXZlIGEgcmVzdWx0IG9yIGFuIGVycm9yXG4gICAgICAgICAgICAvLyBTbyB3ZSBjYW4ndCB0cmVhdCB1bmRlZmluZWQgYXMgYSB2YWxpZCByZXNwb25zZSByZXN1bHQuXG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgICAgICAgICAgICBqc29ucnBjOiB2ZXJzaW9uLFxuICAgICAgICAgICAgICAgIGlkOiByZXF1ZXN0TWVzc2FnZS5pZCxcbiAgICAgICAgICAgICAgICByZXN1bHQ6IHJlc3VsdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUobWVzc2FnZSkuY2F0Y2goKCkgPT4gbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlc3BvbnNlIGZhaWxlZC5gKSk7XG4gICAgICAgIH1cbiAgICAgICAgdHJhY2VSZWNlaXZlZFJlcXVlc3QocmVxdWVzdE1lc3NhZ2UpO1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gcmVxdWVzdEhhbmRsZXJzLmdldChyZXF1ZXN0TWVzc2FnZS5tZXRob2QpO1xuICAgICAgICBsZXQgdHlwZTtcbiAgICAgICAgbGV0IHJlcXVlc3RIYW5kbGVyO1xuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgdHlwZSA9IGVsZW1lbnQudHlwZTtcbiAgICAgICAgICAgIHJlcXVlc3RIYW5kbGVyID0gZWxlbWVudC5oYW5kbGVyO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIGlmIChyZXF1ZXN0SGFuZGxlciB8fCBzdGFyUmVxdWVzdEhhbmRsZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHRva2VuS2V5ID0gcmVxdWVzdE1lc3NhZ2UuaWQgPz8gU3RyaW5nKERhdGUubm93KCkpOyAvL1xuICAgICAgICAgICAgY29uc3QgY2FuY2VsbGF0aW9uU291cmNlID0gSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKGNhbmNlbGxhdGlvblN0cmF0ZWd5LnJlY2VpdmVyKVxuICAgICAgICAgICAgICAgID8gY2FuY2VsbGF0aW9uU3RyYXRlZ3kucmVjZWl2ZXIuY3JlYXRlQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UodG9rZW5LZXkpXG4gICAgICAgICAgICAgICAgOiBjYW5jZWxsYXRpb25TdHJhdGVneS5yZWNlaXZlci5jcmVhdGVDYW5jZWxsYXRpb25Ub2tlblNvdXJjZShyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICBpZiAocmVxdWVzdE1lc3NhZ2UuaWQgIT09IG51bGwgJiYga25vd25DYW5jZWxlZFJlcXVlc3RzLmhhcyhyZXF1ZXN0TWVzc2FnZS5pZCkpIHtcbiAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25Tb3VyY2UuY2FuY2VsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVxdWVzdE1lc3NhZ2UuaWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLnNldCh0b2tlbktleSwgY2FuY2VsbGF0aW9uU291cmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IGhhbmRsZXJSZXN1bHQ7XG4gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0TWVzc2FnZS5wYXJhbXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlLm51bWJlck9mUGFyYW1zICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1zLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyAke3R5cGUubnVtYmVyT2ZQYXJhbXN9IHBhcmFtcyBidXQgcmVjZWl2ZWQgbm9uZS5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJSZXN1bHQgPSByZXF1ZXN0SGFuZGxlcihjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVxdWVzdE1lc3NhZ2UucGFyYW1zKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlLnBhcmFtZXRlclN0cnVjdHVyZXMgPT09IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseUVycm9yKG5ldyBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IobWVzc2FnZXNfMS5FcnJvckNvZGVzLkludmFsaWRQYXJhbXMsIGBSZXF1ZXN0ICR7cmVxdWVzdE1lc3NhZ2UubWV0aG9kfSBkZWZpbmVzIHBhcmFtZXRlcnMgYnkgbmFtZSBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBwb3NpdGlvbmApLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlclJlc3VsdCA9IHJlcXVlc3RIYW5kbGVyKC4uLnJlcXVlc3RNZXNzYWdlLnBhcmFtcywgY2FuY2VsbGF0aW9uU291cmNlLnRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS5wYXJhbWV0ZXJTdHJ1Y3R1cmVzID09PSBtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW52YWxpZFBhcmFtcywgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGRlZmluZXMgcGFyYW1ldGVycyBieSBwb3NpdGlvbiBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBuYW1lYCksIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gcmVxdWVzdEhhbmRsZXIocmVxdWVzdE1lc3NhZ2UucGFyYW1zLCBjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0YXJSZXF1ZXN0SGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gc3RhclJlcXVlc3RIYW5kbGVyKHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgcmVxdWVzdE1lc3NhZ2UucGFyYW1zLCBjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBwcm9taXNlID0gaGFuZGxlclJlc3VsdDtcbiAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZXJSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFRva2Vucy5kZWxldGUodG9rZW5LZXkpO1xuICAgICAgICAgICAgICAgICAgICByZXBseVN1Y2Nlc3MoaGFuZGxlclJlc3VsdCwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwcm9taXNlLnRoZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS50aGVuKChyZXN1bHRPckVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLmRlbGV0ZSh0b2tlbktleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXBseShyZXN1bHRPckVycm9yLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IoZXJyb3IsIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVycm9yICYmIElzLnN0cmluZyhlcnJvci5tZXNzYWdlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGZhaWxlZCB3aXRoIG1lc3NhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZmFpbGVkIHVuZXhwZWN0ZWRseSB3aXRob3V0IHByb3ZpZGluZyBhbnkgZGV0YWlscy5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHkoaGFuZGxlclJlc3VsdCwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHkoZXJyb3IsIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZXJyb3IgJiYgSXMuc3RyaW5nKGVycm9yLm1lc3NhZ2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGZhaWxlZCB3aXRoIG1lc3NhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZmFpbGVkIHVuZXhwZWN0ZWRseSB3aXRob3V0IHByb3ZpZGluZyBhbnkgZGV0YWlscy5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuTWV0aG9kTm90Rm91bmQsIGBVbmhhbmRsZWQgbWV0aG9kICR7cmVxdWVzdE1lc3NhZ2UubWV0aG9kfWApLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlUmVzcG9uc2UocmVzcG9uc2VNZXNzYWdlKSB7XG4gICAgICAgIGlmIChpc0Rpc3Bvc2VkKCkpIHtcbiAgICAgICAgICAgIC8vIFNlZSBoYW5kbGUgcmVxdWVzdC5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzcG9uc2VNZXNzYWdlLmlkID09PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VNZXNzYWdlLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBSZWNlaXZlZCByZXNwb25zZSBtZXNzYWdlIHdpdGhvdXQgaWQ6IEVycm9yIGlzOiBcXG4ke0pTT04uc3RyaW5naWZ5KHJlc3BvbnNlTWVzc2FnZS5lcnJvciwgdW5kZWZpbmVkLCA0KX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgUmVjZWl2ZWQgcmVzcG9uc2UgbWVzc2FnZSB3aXRob3V0IGlkLiBObyBmdXJ0aGVyIGVycm9yIGluZm9ybWF0aW9uIHByb3ZpZGVkLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gcmVzcG9uc2VNZXNzYWdlLmlkO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VQcm9taXNlID0gcmVzcG9uc2VQcm9taXNlcy5nZXQoa2V5KTtcbiAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWRSZXNwb25zZShyZXNwb25zZU1lc3NhZ2UsIHJlc3BvbnNlUHJvbWlzZSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VQcm9taXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2VzLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZU1lc3NhZ2UuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gcmVzcG9uc2VNZXNzYWdlLmVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlLnJlamVjdChuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKGVycm9yLmNvZGUsIGVycm9yLm1lc3NhZ2UsIGVycm9yLmRhdGEpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXNwb25zZU1lc3NhZ2UucmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlTWVzc2FnZS5yZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgbmV2ZXIgaGFwcGVuLicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IubWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBSZXNwb25zZSBoYW5kbGVyICcke3Jlc3BvbnNlUHJvbWlzZS5tZXRob2R9JyBmYWlsZWQgd2l0aCBtZXNzYWdlOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYFJlc3BvbnNlIGhhbmRsZXIgJyR7cmVzcG9uc2VQcm9taXNlLm1ldGhvZH0nIGZhaWxlZCB1bmV4cGVjdGVkbHkuYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlTm90aWZpY2F0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgLy8gU2VlIGhhbmRsZSByZXF1ZXN0LlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0eXBlID0gdW5kZWZpbmVkO1xuICAgICAgICBsZXQgbm90aWZpY2F0aW9uSGFuZGxlcjtcbiAgICAgICAgaWYgKG1lc3NhZ2UubWV0aG9kID09PSBDYW5jZWxOb3RpZmljYXRpb24udHlwZS5tZXRob2QpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhbmNlbElkID0gbWVzc2FnZS5wYXJhbXMuaWQ7XG4gICAgICAgICAgICBrbm93bkNhbmNlbGVkUmVxdWVzdHMuZGVsZXRlKGNhbmNlbElkKTtcbiAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWROb3RpZmljYXRpb24obWVzc2FnZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gbm90aWZpY2F0aW9uSGFuZGxlcnMuZ2V0KG1lc3NhZ2UubWV0aG9kKTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uSGFuZGxlciA9IGVsZW1lbnQuaGFuZGxlcjtcbiAgICAgICAgICAgICAgICB0eXBlID0gZWxlbWVudC50eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChub3RpZmljYXRpb25IYW5kbGVyIHx8IHN0YXJOb3RpZmljYXRpb25IYW5kbGVyKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWROb3RpZmljYXRpb24obWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgaWYgKG5vdGlmaWNhdGlvbkhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UucGFyYW1zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5udW1iZXJPZlBhcmFtcyAhPT0gMCAmJiB0eXBlLnBhcmFtZXRlclN0cnVjdHVyZXMgIT09IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBOb3RpZmljYXRpb24gJHttZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyAke3R5cGUubnVtYmVyT2ZQYXJhbXN9IHBhcmFtcyBidXQgcmVjZWl2ZWQgbm9uZS5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShtZXNzYWdlLnBhcmFtcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGFyZSBKU09OLVJQQyBsaWJyYXJpZXMgdGhhdCBzZW5kIHByb2dyZXNzIG1lc3NhZ2UgYXMgcG9zaXRpb25hbCBwYXJhbXMgYWx0aG91Z2hcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpZmllZCBhcyBuYW1lZC4gU28gY29udmVydCB0aGVtIGlmIHRoaXMgaXMgdGhlIGNhc2UuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBtZXNzYWdlLnBhcmFtcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLm1ldGhvZCA9PT0gUHJvZ3Jlc3NOb3RpZmljYXRpb24udHlwZS5tZXRob2QgJiYgcGFyYW1zLmxlbmd0aCA9PT0gMiAmJiBQcm9ncmVzc1Rva2VuLmlzKHBhcmFtc1swXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKHsgdG9rZW46IHBhcmFtc1swXSwgdmFsdWU6IHBhcmFtc1sxXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUucGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBOb3RpZmljYXRpb24gJHttZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyBwYXJhbWV0ZXJzIGJ5IG5hbWUgYnV0IHJlY2VpdmVkIHBhcmFtZXRlcnMgYnkgcG9zaXRpb25gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5udW1iZXJPZlBhcmFtcyAhPT0gbWVzc2FnZS5wYXJhbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYE5vdGlmaWNhdGlvbiAke21lc3NhZ2UubWV0aG9kfSBkZWZpbmVzICR7dHlwZS5udW1iZXJPZlBhcmFtc30gcGFyYW1zIGJ1dCByZWNlaXZlZCAke3BhcmFtcy5sZW5ndGh9IGFyZ3VtZW50c2ApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXIoLi4ucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS5wYXJhbWV0ZXJTdHJ1Y3R1cmVzID09PSBtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgTm90aWZpY2F0aW9uICR7bWVzc2FnZS5tZXRob2R9IGRlZmluZXMgcGFyYW1ldGVycyBieSBwb3NpdGlvbiBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBuYW1lYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKG1lc3NhZ2UucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGFyTm90aWZpY2F0aW9uSGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICBzdGFyTm90aWZpY2F0aW9uSGFuZGxlcihtZXNzYWdlLm1ldGhvZCwgbWVzc2FnZS5wYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvci5tZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgTm90aWZpY2F0aW9uIGhhbmRsZXIgJyR7bWVzc2FnZS5tZXRob2R9JyBmYWlsZWQgd2l0aCBtZXNzYWdlOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYE5vdGlmaWNhdGlvbiBoYW5kbGVyICcke21lc3NhZ2UubWV0aG9kfScgZmFpbGVkIHVuZXhwZWN0ZWRseS5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1bmhhbmRsZWROb3RpZmljYXRpb25FbWl0dGVyLmZpcmUobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlSW52YWxpZE1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignUmVjZWl2ZWQgZW1wdHkgbWVzc2FnZS4nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsb2dnZXIuZXJyb3IoYFJlY2VpdmVkIG1lc3NhZ2Ugd2hpY2ggaXMgbmVpdGhlciBhIHJlc3BvbnNlIG5vciBhIG5vdGlmaWNhdGlvbiBtZXNzYWdlOlxcbiR7SlNPTi5zdHJpbmdpZnkobWVzc2FnZSwgbnVsbCwgNCl9YCk7XG4gICAgICAgIC8vIFRlc3Qgd2hldGhlciB3ZSBmaW5kIGFuIGlkIHRvIHJlamVjdCB0aGUgcHJvbWlzZVxuICAgICAgICBjb25zdCByZXNwb25zZU1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICBpZiAoSXMuc3RyaW5nKHJlc3BvbnNlTWVzc2FnZS5pZCkgfHwgSXMubnVtYmVyKHJlc3BvbnNlTWVzc2FnZS5pZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHJlc3BvbnNlTWVzc2FnZS5pZDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxlciA9IHJlc3BvbnNlUHJvbWlzZXMuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VIYW5kbGVyLnJlamVjdChuZXcgRXJyb3IoJ1RoZSByZWNlaXZlZCByZXNwb25zZSBoYXMgbmVpdGhlciBhIHJlc3VsdCBub3IgYW4gZXJyb3IgcHJvcGVydHkuJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0cmluZ2lmeVRyYWNlKHBhcmFtcykge1xuICAgICAgICBpZiAocGFyYW1zID09PSB1bmRlZmluZWQgfHwgcGFyYW1zID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAodHJhY2UpIHtcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuVmVyYm9zZTpcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGFyYW1zLCBudWxsLCA0KTtcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuQ29tcGFjdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGFyYW1zKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVNlbmRpbmdSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFjZUZvcm1hdCA9PT0gVHJhY2VGb3JtYXQuVGV4dCkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSAmJiBtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBgUGFyYW1zOiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucGFyYW1zKX1cXG5cXG5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJhY2VyLmxvZyhgU2VuZGluZyByZXF1ZXN0ICcke21lc3NhZ2UubWV0aG9kfSAtICgke21lc3NhZ2UuaWR9KScuYCwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb2dMU1BNZXNzYWdlKCdzZW5kLXJlcXVlc3QnLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVNlbmRpbmdOb3RpZmljYXRpb24obWVzc2FnZSkge1xuICAgICAgICBpZiAodHJhY2UgPT09IFRyYWNlLk9mZiB8fCAhdHJhY2VyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYWNlRm9ybWF0ID09PSBUcmFjZUZvcm1hdC5UZXh0KSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdCkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0gYFBhcmFtczogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLnBhcmFtcyl9XFxuXFxuYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSAnTm8gcGFyYW1ldGVycyBwcm92aWRlZC5cXG5cXG4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFNlbmRpbmcgbm90aWZpY2F0aW9uICcke21lc3NhZ2UubWV0aG9kfScuYCwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb2dMU1BNZXNzYWdlKCdzZW5kLW5vdGlmaWNhdGlvbicsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhY2VGb3JtYXQgPT09IFRyYWNlRm9ybWF0LlRleHQpIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZXJyb3IgJiYgbWVzc2FnZS5lcnJvci5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgRXJyb3IgZGF0YTogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLmVycm9yLmRhdGEpfVxcblxcbmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgUmVzdWx0OiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucmVzdWx0KX1cXG5cXG5gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UuZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9ICdObyByZXN1bHQgcmV0dXJuZWQuXFxuXFxuJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFNlbmRpbmcgcmVzcG9uc2UgJyR7bWV0aG9kfSAtICgke21lc3NhZ2UuaWR9KScuIFByb2Nlc3NpbmcgcmVxdWVzdCB0b29rICR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1tc2AsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgnc2VuZC1yZXNwb25zZScsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYWNlUmVjZWl2ZWRSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFjZUZvcm1hdCA9PT0gVHJhY2VGb3JtYXQuVGV4dCkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSAmJiBtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBgUGFyYW1zOiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucGFyYW1zKX1cXG5cXG5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJhY2VyLmxvZyhgUmVjZWl2ZWQgcmVxdWVzdCAnJHttZXNzYWdlLm1ldGhvZH0gLSAoJHttZXNzYWdlLmlkfSknLmAsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1yZXF1ZXN0JywgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdHJhY2VSZWNlaXZlZE5vdGlmaWNhdGlvbihtZXNzYWdlKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIgfHwgbWVzc2FnZS5tZXRob2QgPT09IExvZ1RyYWNlTm90aWZpY2F0aW9uLnR5cGUubWV0aG9kKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYWNlRm9ybWF0ID09PSBUcmFjZUZvcm1hdC5UZXh0KSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdCkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0gYFBhcmFtczogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLnBhcmFtcyl9XFxuXFxuYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSAnTm8gcGFyYW1ldGVycyBwcm92aWRlZC5cXG5cXG4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFJlY2VpdmVkIG5vdGlmaWNhdGlvbiAnJHttZXNzYWdlLm1ldGhvZH0nLmAsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1ub3RpZmljYXRpb24nLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVJlY2VpdmVkUmVzcG9uc2UobWVzc2FnZSwgcmVzcG9uc2VQcm9taXNlKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhY2VGb3JtYXQgPT09IFRyYWNlRm9ybWF0LlRleHQpIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZXJyb3IgJiYgbWVzc2FnZS5lcnJvci5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgRXJyb3IgZGF0YTogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLmVycm9yLmRhdGEpfVxcblxcbmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgUmVzdWx0OiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucmVzdWx0KX1cXG5cXG5gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UuZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9ICdObyByZXN1bHQgcmV0dXJuZWQuXFxuXFxuJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXNwb25zZVByb21pc2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IG1lc3NhZ2UuZXJyb3IgPyBgIFJlcXVlc3QgZmFpbGVkOiAke21lc3NhZ2UuZXJyb3IubWVzc2FnZX0gKCR7bWVzc2FnZS5lcnJvci5jb2RlfSkuYCA6ICcnO1xuICAgICAgICAgICAgICAgIHRyYWNlci5sb2coYFJlY2VpdmVkIHJlc3BvbnNlICcke3Jlc3BvbnNlUHJvbWlzZS5tZXRob2R9IC0gKCR7bWVzc2FnZS5pZH0pJyBpbiAke0RhdGUubm93KCkgLSByZXNwb25zZVByb21pc2UudGltZXJTdGFydH1tcy4ke2Vycm9yfWAsIGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJhY2VyLmxvZyhgUmVjZWl2ZWQgcmVzcG9uc2UgJHttZXNzYWdlLmlkfSB3aXRob3V0IGFjdGl2ZSByZXNwb25zZSBwcm9taXNlLmAsIGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1yZXNwb25zZScsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGxvZ0xTUE1lc3NhZ2UodHlwZSwgbWVzc2FnZSkge1xuICAgICAgICBpZiAoIXRyYWNlciB8fCB0cmFjZSA9PT0gVHJhY2UuT2ZmKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbHNwTWVzc2FnZSA9IHtcbiAgICAgICAgICAgIGlzTFNQTWVzc2FnZTogdHJ1ZSxcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpXG4gICAgICAgIH07XG4gICAgICAgIHRyYWNlci5sb2cobHNwTWVzc2FnZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRocm93SWZDbG9zZWRPckRpc3Bvc2VkKCkge1xuICAgICAgICBpZiAoaXNDbG9zZWQoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IENvbm5lY3Rpb25FcnJvcihDb25uZWN0aW9uRXJyb3JzLkNsb3NlZCwgJ0Nvbm5lY3Rpb24gaXMgY2xvc2VkLicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0Rpc3Bvc2VkKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb25uZWN0aW9uRXJyb3IoQ29ubmVjdGlvbkVycm9ycy5EaXNwb3NlZCwgJ0Nvbm5lY3Rpb24gaXMgZGlzcG9zZWQuJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdGhyb3dJZkxpc3RlbmluZygpIHtcbiAgICAgICAgaWYgKGlzTGlzdGVuaW5nKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb25uZWN0aW9uRXJyb3IoQ29ubmVjdGlvbkVycm9ycy5BbHJlYWR5TGlzdGVuaW5nLCAnQ29ubmVjdGlvbiBpcyBhbHJlYWR5IGxpc3RlbmluZycpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRocm93SWZOb3RMaXN0ZW5pbmcoKSB7XG4gICAgICAgIGlmICghaXNMaXN0ZW5pbmcoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYWxsIGxpc3RlbigpIGZpcnN0LicpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVuZGVmaW5lZFRvTnVsbChwYXJhbSkge1xuICAgICAgICBpZiAocGFyYW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyYW07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gbnVsbFRvVW5kZWZpbmVkKHBhcmFtKSB7XG4gICAgICAgIGlmIChwYXJhbSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJhbTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBpc05hbWVkUGFyYW0ocGFyYW0pIHtcbiAgICAgICAgcmV0dXJuIHBhcmFtICE9PSB1bmRlZmluZWQgJiYgcGFyYW0gIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkocGFyYW0pICYmIHR5cGVvZiBwYXJhbSA9PT0gJ29iamVjdCc7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXB1dGVTaW5nbGVQYXJhbShwYXJhbWV0ZXJTdHJ1Y3R1cmVzLCBwYXJhbSkge1xuICAgICAgICBzd2l0Y2ggKHBhcmFtZXRlclN0cnVjdHVyZXMpIHtcbiAgICAgICAgICAgIGNhc2UgbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG86XG4gICAgICAgICAgICAgICAgaWYgKGlzTmFtZWRQYXJhbShwYXJhbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxUb1VuZGVmaW5lZChwYXJhbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3VuZGVmaW5lZFRvTnVsbChwYXJhbSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZTpcbiAgICAgICAgICAgICAgICBpZiAoIWlzTmFtZWRQYXJhbShwYXJhbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWNlaXZlZCBwYXJhbWV0ZXJzIGJ5IG5hbWUgYnV0IHBhcmFtIGlzIG5vdCBhbiBvYmplY3QgbGl0ZXJhbC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGxUb1VuZGVmaW5lZChwYXJhbSk7XG4gICAgICAgICAgICBjYXNlIG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieVBvc2l0aW9uOlxuICAgICAgICAgICAgICAgIHJldHVybiBbdW5kZWZpbmVkVG9OdWxsKHBhcmFtKV07XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBwYXJhbWV0ZXIgc3RydWN0dXJlICR7cGFyYW1ldGVyU3RydWN0dXJlcy50b1N0cmluZygpfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXB1dGVNZXNzYWdlUGFyYW1zKHR5cGUsIHBhcmFtcykge1xuICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICBjb25zdCBudW1iZXJPZlBhcmFtcyA9IHR5cGUubnVtYmVyT2ZQYXJhbXM7XG4gICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gY29tcHV0ZVNpbmdsZVBhcmFtKHR5cGUucGFyYW1ldGVyU3RydWN0dXJlcywgcGFyYW1zWzBdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoICYmIGkgPCBudW1iZXJPZlBhcmFtczsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHVuZGVmaW5lZFRvTnVsbChwYXJhbXNbaV0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPCBudW1iZXJPZlBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gcGFyYW1zLmxlbmd0aDsgaSA8IG51bWJlck9mUGFyYW1zOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB7XG4gICAgICAgIHNlbmROb3RpZmljYXRpb246ICh0eXBlLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlUGFyYW1zO1xuICAgICAgICAgICAgaWYgKElzLnN0cmluZyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICAgIGxldCBwYXJhbVN0YXJ0ID0gMDtcbiAgICAgICAgICAgICAgICBsZXQgcGFyYW1ldGVyU3RydWN0dXJlcyA9IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvO1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuaXMoZmlyc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtU3RhcnQgPSAxO1xuICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gZmlyc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBwYXJhbUVuZCA9IGFyZ3MubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gcGFyYW1FbmQgLSBwYXJhbVN0YXJ0O1xuICAgICAgICAgICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zID0gY29tcHV0ZVNpbmdsZVBhcmFtKHBhcmFtZXRlclN0cnVjdHVyZXMsIGFyZ3NbcGFyYW1TdGFydF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjZWl2ZWQgJHtudW1iZXJPZlBhcmFtc30gcGFyYW1ldGVycyBmb3IgJ2J5IE5hbWUnIG5vdGlmaWNhdGlvbiBwYXJhbWV0ZXIgc3RydWN0dXJlLmApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IGFyZ3Muc2xpY2UocGFyYW1TdGFydCwgcGFyYW1FbmQpLm1hcCh2YWx1ZSA9PiB1bmRlZmluZWRUb051bGwodmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IGFyZ3M7XG4gICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZS5tZXRob2Q7XG4gICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IGNvbXB1dGVNZXNzYWdlUGFyYW1zKHR5cGUsIHBhcmFtcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBub3RpZmljYXRpb25NZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBtZXNzYWdlUGFyYW1zXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdHJhY2VTZW5kaW5nTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbk1lc3NhZ2UpO1xuICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2VXcml0ZXIud3JpdGUobm90aWZpY2F0aW9uTWVzc2FnZSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBTZW5kaW5nIG5vdGlmaWNhdGlvbiBmYWlsZWQuYCk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25Ob3RpZmljYXRpb246ICh0eXBlLCBoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGlmIChJcy5mdW5jKHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB0eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaGFuZGxlcikge1xuICAgICAgICAgICAgICAgIGlmIChJcy5zdHJpbmcodHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZTtcbiAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uSGFuZGxlcnMuc2V0KHR5cGUsIHsgdHlwZTogdW5kZWZpbmVkLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZS5tZXRob2Q7XG4gICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXJzLnNldCh0eXBlLm1ldGhvZCwgeyB0eXBlLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXJzLmRlbGV0ZShtZXRob2QpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBvblByb2dyZXNzOiAoX3R5cGUsIHRva2VuLCBoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgICBpZiAocHJvZ3Jlc3NIYW5kbGVycy5oYXModG9rZW4pKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm9ncmVzcyBoYW5kbGVyIGZvciB0b2tlbiAke3Rva2VufSBhbHJlYWR5IHJlZ2lzdGVyZWRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByb2dyZXNzSGFuZGxlcnMuc2V0KHRva2VuLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc0hhbmRsZXJzLmRlbGV0ZSh0b2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgc2VuZFByb2dyZXNzOiAoX3R5cGUsIHRva2VuLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGF3YWl0IGJ1dCBzaW1wbGUgcmV0dXJuIHRvIGVuc3VyZSB0aGF0IHdlIGRvbid0IGhhdmUgYW5vdGhlclxuICAgICAgICAgICAgLy8gYXN5bmMgc2NoZWR1bGluZy4gT3RoZXJ3aXNlIG9uZSBzZW5kIGNvdWxkIG92ZXJ0YWtlIGFub3RoZXIgc2VuZC5cbiAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLnNlbmROb3RpZmljYXRpb24oUHJvZ3Jlc3NOb3RpZmljYXRpb24udHlwZSwgeyB0b2tlbiwgdmFsdWUgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uVW5oYW5kbGVkUHJvZ3Jlc3M6IHVuaGFuZGxlZFByb2dyZXNzRW1pdHRlci5ldmVudCxcbiAgICAgICAgc2VuZFJlcXVlc3Q6ICh0eXBlLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgdGhyb3dJZk5vdExpc3RlbmluZygpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlUGFyYW1zO1xuICAgICAgICAgICAgbGV0IHRva2VuID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKElzLnN0cmluZyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3QgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgbGV0IHBhcmFtU3RhcnQgPSAwO1xuICAgICAgICAgICAgICAgIGxldCBwYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG87XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5pcyhmaXJzdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1TdGFydCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlclN0cnVjdHVyZXMgPSBmaXJzdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHBhcmFtRW5kID0gYXJncy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuLmlzKGxhc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtRW5kID0gcGFyYW1FbmQgLSAxO1xuICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IGxhc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gcGFyYW1FbmQgLSBwYXJhbVN0YXJ0O1xuICAgICAgICAgICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zID0gY29tcHV0ZVNpbmdsZVBhcmFtKHBhcmFtZXRlclN0cnVjdHVyZXMsIGFyZ3NbcGFyYW1TdGFydF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjZWl2ZWQgJHtudW1iZXJPZlBhcmFtc30gcGFyYW1ldGVycyBmb3IgJ2J5IE5hbWUnIHJlcXVlc3QgcGFyYW1ldGVyIHN0cnVjdHVyZS5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMgPSBhcmdzLnNsaWNlKHBhcmFtU3RhcnQsIHBhcmFtRW5kKS5tYXAodmFsdWUgPT4gdW5kZWZpbmVkVG9OdWxsKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBhcmdzO1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGUubWV0aG9kO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMgPSBjb21wdXRlTWVzc2FnZVBhcmFtcyh0eXBlLCBwYXJhbXMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gdHlwZS5udW1iZXJPZlBhcmFtcztcbiAgICAgICAgICAgICAgICB0b2tlbiA9IGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuLmlzKHBhcmFtc1tudW1iZXJPZlBhcmFtc10pID8gcGFyYW1zW251bWJlck9mUGFyYW1zXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGlkID0gc2VxdWVuY2VOdW1iZXIrKztcbiAgICAgICAgICAgIGxldCBkaXNwb3NhYmxlO1xuICAgICAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgICAgICAgZGlzcG9zYWJsZSA9IHRva2VuLm9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcCA9IGNhbmNlbGxhdGlvblN0cmF0ZWd5LnNlbmRlci5zZW5kQ2FuY2VsbGF0aW9uKGNvbm5lY3Rpb24sIGlkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhgUmVjZWl2ZWQgbm8gcHJvbWlzZSBmcm9tIGNhbmNlbGxhdGlvbiBzdHJhdGVneSB3aGVuIGNhbmNlbGxpbmcgaWQgJHtpZH1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIubG9nKGBTZW5kaW5nIGNhbmNlbGxhdGlvbiBtZXNzYWdlcyBmb3IgaWQgJHtpZH0gZmFpbGVkYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdE1lc3NhZ2UgPSB7XG4gICAgICAgICAgICAgICAganNvbnJwYzogdmVyc2lvbixcbiAgICAgICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBtZXNzYWdlUGFyYW1zXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdHJhY2VTZW5kaW5nUmVxdWVzdChyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNhbmNlbGxhdGlvblN0cmF0ZWd5LnNlbmRlci5lbmFibGVDYW5jZWxsYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25TdHJhdGVneS5zZW5kZXIuZW5hYmxlQ2FuY2VsbGF0aW9uKHJlcXVlc3RNZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZVdpdGhDbGVhbnVwID0gKHIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyKTtcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uU3RyYXRlZ3kuc2VuZGVyLmNsZWFudXAoaWQpO1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlPy5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWplY3RXaXRoQ2xlYW51cCA9IChyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChyKTtcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uU3RyYXRlZ3kuc2VuZGVyLmNsZWFudXAoaWQpO1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlPy5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZVByb21pc2UgPSB7IG1ldGhvZDogbWV0aG9kLCB0aW1lclN0YXJ0OiBEYXRlLm5vdygpLCByZXNvbHZlOiByZXNvbHZlV2l0aENsZWFudXAsIHJlamVjdDogcmVqZWN0V2l0aENsZWFudXAgfTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2VzLnNldChpZCwgcmVzcG9uc2VQcm9taXNlKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbWVzc2FnZVdyaXRlci53cml0ZShyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAvLyBXcml0aW5nIHRoZSBtZXNzYWdlIGZhaWxlZC4gU28gd2UgbmVlZCB0byBkZWxldGUgaXQgZnJvbSB0aGUgcmVzcG9uc2UgcHJvbWlzZXMgYW5kXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlamVjdCBpdC5cbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlcy5kZWxldGUoaWQpO1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2UucmVqZWN0KG5ldyBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IobWVzc2FnZXNfMS5FcnJvckNvZGVzLk1lc3NhZ2VXcml0ZUVycm9yLCBlcnJvci5tZXNzYWdlID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIHJlYXNvbicpKTtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlcXVlc3QgZmFpbGVkLmApO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25SZXF1ZXN0OiAodHlwZSwgaGFuZGxlcikgPT4ge1xuICAgICAgICAgICAgdGhyb3dJZkNsb3NlZE9yRGlzcG9zZWQoKTtcbiAgICAgICAgICAgIGxldCBtZXRob2QgPSBudWxsO1xuICAgICAgICAgICAgaWYgKFN0YXJSZXF1ZXN0SGFuZGxlci5pcyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBzdGFyUmVxdWVzdEhhbmRsZXIgPSB0eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoSXMuc3RyaW5nKHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgbWV0aG9kID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoaGFuZGxlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RIYW5kbGVycy5zZXQodHlwZSwgeyBoYW5kbGVyOiBoYW5kbGVyLCB0eXBlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSB0eXBlLm1ldGhvZDtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEhhbmRsZXJzLnNldCh0eXBlLm1ldGhvZCwgeyB0eXBlLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SGFuZGxlcnMuZGVsZXRlKG1ldGhvZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFyUmVxdWVzdEhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBoYXNQZW5kaW5nUmVzcG9uc2U6ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZVByb21pc2VzLnNpemUgPiAwO1xuICAgICAgICB9LFxuICAgICAgICB0cmFjZTogYXN5bmMgKF92YWx1ZSwgX3RyYWNlciwgc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBsZXQgX3NlbmROb3RpZmljYXRpb24gPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBfdHJhY2VGb3JtYXQgPSBUcmFjZUZvcm1hdC5UZXh0O1xuICAgICAgICAgICAgaWYgKHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKElzLmJvb2xlYW4oc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zKSkge1xuICAgICAgICAgICAgICAgICAgICBfc2VuZE5vdGlmaWNhdGlvbiA9IHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF9zZW5kTm90aWZpY2F0aW9uID0gc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zLnNlbmROb3RpZmljYXRpb24gfHwgZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIF90cmFjZUZvcm1hdCA9IHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucy50cmFjZUZvcm1hdCB8fCBUcmFjZUZvcm1hdC5UZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlID0gX3ZhbHVlO1xuICAgICAgICAgICAgdHJhY2VGb3JtYXQgPSBfdHJhY2VGb3JtYXQ7XG4gICAgICAgICAgICBpZiAodHJhY2UgPT09IFRyYWNlLk9mZikge1xuICAgICAgICAgICAgICAgIHRyYWNlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRyYWNlciA9IF90cmFjZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoX3NlbmROb3RpZmljYXRpb24gJiYgIWlzQ2xvc2VkKCkgJiYgIWlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGNvbm5lY3Rpb24uc2VuZE5vdGlmaWNhdGlvbihTZXRUcmFjZU5vdGlmaWNhdGlvbi50eXBlLCB7IHZhbHVlOiBUcmFjZS50b1N0cmluZyhfdmFsdWUpIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBvbkVycm9yOiBlcnJvckVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIG9uQ2xvc2U6IGNsb3NlRW1pdHRlci5ldmVudCxcbiAgICAgICAgb25VbmhhbmRsZWROb3RpZmljYXRpb246IHVuaGFuZGxlZE5vdGlmaWNhdGlvbkVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIG9uRGlzcG9zZTogZGlzcG9zZUVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIGVuZDogKCkgPT4ge1xuICAgICAgICAgICAgbWVzc2FnZVdyaXRlci5lbmQoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLkRpc3Bvc2VkO1xuICAgICAgICAgICAgZGlzcG9zZUVtaXR0ZXIuZmlyZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5QZW5kaW5nUmVzcG9uc2VSZWplY3RlZCwgJ1BlbmRpbmcgcmVzcG9uc2UgcmVqZWN0ZWQgc2luY2UgY29ubmVjdGlvbiBnb3QgZGlzcG9zZWQnKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvbWlzZSBvZiByZXNwb25zZVByb21pc2VzLnZhbHVlcygpKSB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBrbm93bkNhbmNlbGVkUmVxdWVzdHMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICBtZXNzYWdlUXVldWUgPSBuZXcgbGlua2VkTWFwXzEuTGlua2VkTWFwKCk7XG4gICAgICAgICAgICAvLyBUZXN0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgaWYgKElzLmZ1bmMobWVzc2FnZVdyaXRlci5kaXNwb3NlKSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKElzLmZ1bmMobWVzc2FnZVJlYWRlci5kaXNwb3NlKSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VSZWFkZXIuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBsaXN0ZW46ICgpID0+IHtcbiAgICAgICAgICAgIHRocm93SWZDbG9zZWRPckRpc3Bvc2VkKCk7XG4gICAgICAgICAgICB0aHJvd0lmTGlzdGVuaW5nKCk7XG4gICAgICAgICAgICBzdGF0ZSA9IENvbm5lY3Rpb25TdGF0ZS5MaXN0ZW5pbmc7XG4gICAgICAgICAgICBtZXNzYWdlUmVhZGVyLmxpc3RlbihjYWxsYmFjayk7XG4gICAgICAgIH0sXG4gICAgICAgIGluc3BlY3Q6ICgpID0+IHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS5jb25zb2xlLmxvZygnaW5zcGVjdCcpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25uZWN0aW9uLm9uTm90aWZpY2F0aW9uKExvZ1RyYWNlTm90aWZpY2F0aW9uLnR5cGUsIChwYXJhbXMpID0+IHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZlcmJvc2UgPSB0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdDtcbiAgICAgICAgdHJhY2VyLmxvZyhwYXJhbXMubWVzc2FnZSwgdmVyYm9zZSA/IHBhcmFtcy52ZXJib3NlIDogdW5kZWZpbmVkKTtcbiAgICB9KTtcbiAgICBjb25uZWN0aW9uLm9uTm90aWZpY2F0aW9uKFByb2dyZXNzTm90aWZpY2F0aW9uLnR5cGUsIChwYXJhbXMpID0+IHtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IHByb2dyZXNzSGFuZGxlcnMuZ2V0KHBhcmFtcy50b2tlbik7XG4gICAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICAgICBoYW5kbGVyKHBhcmFtcy52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1bmhhbmRsZWRQcm9ncmVzc0VtaXR0ZXIuZmlyZShwYXJhbXMpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbm5lY3Rpb247XG59XG5leHBvcnRzLmNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uID0gY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb247XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vdHlwaW5ncy90aGVuYWJsZS5kLnRzXCIgLz5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUHJvZ3Jlc3NUeXBlID0gZXhwb3J0cy5Qcm9ncmVzc1Rva2VuID0gZXhwb3J0cy5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiA9IGV4cG9ydHMuTnVsbExvZ2dlciA9IGV4cG9ydHMuQ29ubmVjdGlvbk9wdGlvbnMgPSBleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IGV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlQnVmZmVyID0gZXhwb3J0cy5Xcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyID0gZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLk1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLlJlYWRhYmxlU3RyZWFtTWVzc2FnZVJlYWRlciA9IGV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlUmVhZGVyID0gZXhwb3J0cy5NZXNzYWdlUmVhZGVyID0gZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblRva2VuID0gZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IGV4cG9ydHMuRW1pdHRlciA9IGV4cG9ydHMuRXZlbnQgPSBleHBvcnRzLkRpc3Bvc2FibGUgPSBleHBvcnRzLkxSVUNhY2hlID0gZXhwb3J0cy5Ub3VjaCA9IGV4cG9ydHMuTGlua2VkTWFwID0gZXhwb3J0cy5QYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlOSA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTggPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU3ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNiA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTUgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU0ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMyA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTIgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUxID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMCA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZSA9IGV4cG9ydHMuRXJyb3JDb2RlcyA9IGV4cG9ydHMuUmVzcG9uc2VFcnJvciA9IGV4cG9ydHMuUmVxdWVzdFR5cGU5ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTggPSBleHBvcnRzLlJlcXVlc3RUeXBlNyA9IGV4cG9ydHMuUmVxdWVzdFR5cGU2ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTUgPSBleHBvcnRzLlJlcXVlc3RUeXBlNCA9IGV4cG9ydHMuUmVxdWVzdFR5cGUzID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTIgPSBleHBvcnRzLlJlcXVlc3RUeXBlMSA9IGV4cG9ydHMuUmVxdWVzdFR5cGUwID0gZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IGV4cG9ydHMuTWVzc2FnZSA9IGV4cG9ydHMuUkFMID0gdm9pZCAwO1xuZXhwb3J0cy5NZXNzYWdlU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblN0cmF0ZWd5ID0gZXhwb3J0cy5DYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IGV4cG9ydHMuQ29ubmVjdGlvbkVycm9yID0gZXhwb3J0cy5Db25uZWN0aW9uRXJyb3JzID0gZXhwb3J0cy5Mb2dUcmFjZU5vdGlmaWNhdGlvbiA9IGV4cG9ydHMuU2V0VHJhY2VOb3RpZmljYXRpb24gPSBleHBvcnRzLlRyYWNlRm9ybWF0ID0gZXhwb3J0cy5UcmFjZVZhbHVlcyA9IGV4cG9ydHMuVHJhY2UgPSB2b2lkIDA7XG5jb25zdCBtZXNzYWdlc18xID0gcmVxdWlyZShcIi4vbWVzc2FnZXNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNZXNzYWdlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk1lc3NhZ2U7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlMFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTA7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTFcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGUxOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGUyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlMjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlM1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGU0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGU1XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlNTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlNlwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTY7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTdcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGU3OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGU4XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlODsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlOVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTk7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXNwb25zZUVycm9yXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3I7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJFcnJvckNvZGVzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLkVycm9yQ29kZXM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlMFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlMDsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGUxXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGUxOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZTJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlM1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlMzsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGU0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZTVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlNlwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlNjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGU3XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU3OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZThcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTg7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlOVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlOTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlBhcmFtZXRlclN0cnVjdHVyZXNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlczsgfSB9KTtcbmNvbnN0IGxpbmtlZE1hcF8xID0gcmVxdWlyZShcIi4vbGlua2VkTWFwXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTGlua2VkTWFwXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBsaW5rZWRNYXBfMS5MaW5rZWRNYXA7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJMUlVDYWNoZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbGlua2VkTWFwXzEuTFJVQ2FjaGU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJUb3VjaFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbGlua2VkTWFwXzEuVG91Y2g7IH0gfSk7XG5jb25zdCBkaXNwb3NhYmxlXzEgPSByZXF1aXJlKFwiLi9kaXNwb3NhYmxlXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiRGlzcG9zYWJsZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZGlzcG9zYWJsZV8xLkRpc3Bvc2FibGU7IH0gfSk7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCIuL2V2ZW50c1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkV2ZW50XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBldmVudHNfMS5FdmVudDsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkVtaXR0ZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGV2ZW50c18xLkVtaXR0ZXI7IH0gfSk7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblRva2VuU291cmNlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjYW5jZWxsYXRpb25fMS5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblRva2VuXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjYW5jZWxsYXRpb25fMS5DYW5jZWxsYXRpb25Ub2tlbjsgfSB9KTtcbmNvbnN0IHNoYXJlZEFycmF5Q2FuY2VsbGF0aW9uXzEgPSByZXF1aXJlKFwiLi9zaGFyZWRBcnJheUNhbmNlbGxhdGlvblwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHNoYXJlZEFycmF5Q2FuY2VsbGF0aW9uXzEuU2hhcmVkQXJyYXlTZW5kZXJTdHJhdGVneTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlNoYXJlZEFycmF5UmVjZWl2ZXJTdHJhdGVneVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gc2hhcmVkQXJyYXlDYW5jZWxsYXRpb25fMS5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3k7IH0gfSk7XG5jb25zdCBtZXNzYWdlUmVhZGVyXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlUmVhZGVyXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTWVzc2FnZVJlYWRlclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZVJlYWRlcl8xLk1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VSZWFkZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VSZWFkZXJfMS5BYnN0cmFjdE1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VSZWFkZXJfMS5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5jb25zdCBtZXNzYWdlV3JpdGVyXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlV3JpdGVyXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTWVzc2FnZVdyaXRlclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZVdyaXRlcl8xLk1lc3NhZ2VXcml0ZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VXcml0ZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VXcml0ZXJfMS5BYnN0cmFjdE1lc3NhZ2VXcml0ZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJXcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlV3JpdGVyXzEuV3JpdGVhYmxlU3RyZWFtTWVzc2FnZVdyaXRlcjsgfSB9KTtcbmNvbnN0IG1lc3NhZ2VCdWZmZXJfMSA9IHJlcXVpcmUoXCIuL21lc3NhZ2VCdWZmZXJcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VCdWZmZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VCdWZmZXJfMS5BYnN0cmFjdE1lc3NhZ2VCdWZmZXI7IH0gfSk7XG5jb25zdCBjb25uZWN0aW9uXzEgPSByZXF1aXJlKFwiLi9jb25uZWN0aW9uXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29ubmVjdGlvblN0cmF0ZWd5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ29ubmVjdGlvblN0cmF0ZWd5OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29ubmVjdGlvbk9wdGlvbnNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5Db25uZWN0aW9uT3B0aW9uczsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk51bGxMb2dnZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5OdWxsTG9nZ2VyOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb25cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlByb2dyZXNzVG9rZW5cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5Qcm9ncmVzc1Rva2VuOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUHJvZ3Jlc3NUeXBlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuUHJvZ3Jlc3NUeXBlOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiVHJhY2VcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5UcmFjZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlRyYWNlVmFsdWVzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuVHJhY2VWYWx1ZXM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJUcmFjZUZvcm1hdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29ubmVjdGlvbl8xLlRyYWNlRm9ybWF0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiU2V0VHJhY2VOb3RpZmljYXRpb25cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5TZXRUcmFjZU5vdGlmaWNhdGlvbjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkxvZ1RyYWNlTm90aWZpY2F0aW9uXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuTG9nVHJhY2VOb3RpZmljYXRpb247IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJDb25uZWN0aW9uRXJyb3JzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ29ubmVjdGlvbkVycm9yczsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNvbm5lY3Rpb25FcnJvclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29ubmVjdGlvbl8xLkNvbm5lY3Rpb25FcnJvcjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5DYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5DYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblN0cmF0ZWd5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ2FuY2VsbGF0aW9uU3RyYXRlZ3k7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNZXNzYWdlU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5NZXNzYWdlU3RyYXRlZ3k7IH0gfSk7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbmV4cG9ydHMuUkFMID0gcmFsXzEuZGVmYXVsdDtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGFwaV8xID0gcmVxdWlyZShcIi4uL2NvbW1vbi9hcGlcIik7XG5jbGFzcyBNZXNzYWdlQnVmZmVyIGV4dGVuZHMgYXBpXzEuQWJzdHJhY3RNZXNzYWdlQnVmZmVyIHtcbiAgICBjb25zdHJ1Y3RvcihlbmNvZGluZyA9ICd1dGYtOCcpIHtcbiAgICAgICAgc3VwZXIoZW5jb2RpbmcpO1xuICAgICAgICB0aGlzLmFzY2lpRGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcignYXNjaWknKTtcbiAgICB9XG4gICAgZW1wdHlCdWZmZXIoKSB7XG4gICAgICAgIHJldHVybiBNZXNzYWdlQnVmZmVyLmVtcHR5QnVmZmVyO1xuICAgIH1cbiAgICBmcm9tU3RyaW5nKHZhbHVlLCBfZW5jb2RpbmcpIHtcbiAgICAgICAgcmV0dXJuIChuZXcgVGV4dEVuY29kZXIoKSkuZW5jb2RlKHZhbHVlKTtcbiAgICB9XG4gICAgdG9TdHJpbmcodmFsdWUsIGVuY29kaW5nKSB7XG4gICAgICAgIGlmIChlbmNvZGluZyA9PT0gJ2FzY2lpJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXNjaWlEZWNvZGVyLmRlY29kZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gKG5ldyBUZXh0RGVjb2RlcihlbmNvZGluZykpLmRlY29kZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXNOYXRpdmUoYnVmZmVyLCBsZW5ndGgpIHtcbiAgICAgICAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlci5zbGljZSgwLCBsZW5ndGgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFsbG9jTmF0aXZlKGxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTtcbiAgICB9XG59XG5NZXNzYWdlQnVmZmVyLmVtcHR5QnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMCk7XG5jbGFzcyBSZWFkYWJsZVN0cmVhbVdyYXBwZXIge1xuICAgIGNvbnN0cnVjdG9yKHNvY2tldCkge1xuICAgICAgICB0aGlzLnNvY2tldCA9IHNvY2tldDtcbiAgICAgICAgdGhpcy5fb25EYXRhID0gbmV3IGFwaV8xLkVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5fbWVzc2FnZUxpc3RlbmVyID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBibG9iID0gZXZlbnQuZGF0YTtcbiAgICAgICAgICAgIGJsb2IuYXJyYXlCdWZmZXIoKS50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkRhdGEuZmlyZShuZXcgVWludDhBcnJheShidWZmZXIpKTtcbiAgICAgICAgICAgIH0sICgpID0+IHtcbiAgICAgICAgICAgICAgICAoMCwgYXBpXzEuUkFMKSgpLmNvbnNvbGUuZXJyb3IoYENvbnZlcnRpbmcgYmxvYiB0byBhcnJheSBidWZmZXIgZmFpbGVkLmApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLl9tZXNzYWdlTGlzdGVuZXIpO1xuICAgIH1cbiAgICBvbkNsb3NlKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2Nsb3NlJywgbGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gYXBpXzEuRGlzcG9zYWJsZS5jcmVhdGUoKCkgPT4gdGhpcy5zb2NrZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xvc2UnLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkVycm9yKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgbGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gYXBpXzEuRGlzcG9zYWJsZS5jcmVhdGUoKCkgPT4gdGhpcy5zb2NrZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkVuZChsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKCdlbmQnLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdlbmQnLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkRhdGEobGlzdGVuZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uRGF0YS5ldmVudChsaXN0ZW5lcik7XG4gICAgfVxufVxuY2xhc3MgV3JpdGFibGVTdHJlYW1XcmFwcGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihzb2NrZXQpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7XG4gICAgfVxuICAgIG9uQ2xvc2UobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignY2xvc2UnLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbG9zZScsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIG9uRXJyb3IobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIG9uRW5kKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2VuZCcsIGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIGFwaV8xLkRpc3Bvc2FibGUuY3JlYXRlKCgpID0+IHRoaXMuc29ja2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2VuZCcsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIHdyaXRlKGRhdGEsIGVuY29kaW5nKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkICYmIGVuY29kaW5nICE9PSAndXRmLTgnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbiBhIEJyb3dzZXIgZW52aXJvbm1lbnRzIG9ubHkgdXRmLTggdGV4dCBlbmNvZGluZyBpcyBzdXBwb3J0ZWQuIEJ1dCBnb3QgZW5jb2Rpbmc6ICR7ZW5jb2Rpbmd9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKTtcbiAgICB9XG59XG5jb25zdCBfdGV4dEVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbmNvbnN0IF9yaWwgPSBPYmplY3QuZnJlZXplKHtcbiAgICBtZXNzYWdlQnVmZmVyOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgY3JlYXRlOiAoZW5jb2RpbmcpID0+IG5ldyBNZXNzYWdlQnVmZmVyKGVuY29kaW5nKVxuICAgIH0pLFxuICAgIGFwcGxpY2F0aW9uSnNvbjogT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGVuY29kZXI6IE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgbmFtZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgZW5jb2RlOiAobXNnLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2hhcnNldCAhPT0gJ3V0Zi04Jykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluIGEgQnJvd3NlciBlbnZpcm9ubWVudHMgb25seSB1dGYtOCB0ZXh0IGVuY29kaW5nIGlzIHN1cHBvcnRlZC4gQnV0IGdvdCBlbmNvZGluZzogJHtvcHRpb25zLmNoYXJzZXR9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoX3RleHRFbmNvZGVyLmVuY29kZShKU09OLnN0cmluZ2lmeShtc2csIHVuZGVmaW5lZCwgMCkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIGRlY29kZXI6IE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgbmFtZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgZGVjb2RlOiAoYnVmZmVyLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCEoYnVmZmVyIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbiBhIEJyb3dzZXIgZW52aXJvbm1lbnRzIG9ubHkgVWludDhBcnJheXMgYXJlIHN1cHBvcnRlZC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShKU09OLnBhcnNlKG5ldyBUZXh0RGVjb2RlcihvcHRpb25zLmNoYXJzZXQpLmRlY29kZShidWZmZXIpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfSksXG4gICAgc3RyZWFtOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgYXNSZWFkYWJsZVN0cmVhbTogKHNvY2tldCkgPT4gbmV3IFJlYWRhYmxlU3RyZWFtV3JhcHBlcihzb2NrZXQpLFxuICAgICAgICBhc1dyaXRhYmxlU3RyZWFtOiAoc29ja2V0KSA9PiBuZXcgV3JpdGFibGVTdHJlYW1XcmFwcGVyKHNvY2tldClcbiAgICB9KSxcbiAgICBjb25zb2xlOiBjb25zb2xlLFxuICAgIHRpbWVyOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgc2V0VGltZW91dChjYWxsYmFjaywgbXMsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHNldFRpbWVvdXQoY2FsbGJhY2ssIG1zLCAuLi5hcmdzKTtcbiAgICAgICAgICAgIHJldHVybiB7IGRpc3Bvc2U6ICgpID0+IGNsZWFyVGltZW91dChoYW5kbGUpIH07XG4gICAgICAgIH0sXG4gICAgICAgIHNldEltbWVkaWF0ZShjYWxsYmFjaywgLi4uYXJncykge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gc2V0VGltZW91dChjYWxsYmFjaywgMCwgLi4uYXJncyk7XG4gICAgICAgICAgICByZXR1cm4geyBkaXNwb3NlOiAoKSA9PiBjbGVhclRpbWVvdXQoaGFuZGxlKSB9O1xuICAgICAgICB9LFxuICAgICAgICBzZXRJbnRlcnZhbChjYWxsYmFjaywgbXMsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHNldEludGVydmFsKGNhbGxiYWNrLCBtcywgLi4uYXJncyk7XG4gICAgICAgICAgICByZXR1cm4geyBkaXNwb3NlOiAoKSA9PiBjbGVhckludGVydmFsKGhhbmRsZSkgfTtcbiAgICAgICAgfSxcbiAgICB9KVxufSk7XG5mdW5jdGlvbiBSSUwoKSB7XG4gICAgcmV0dXJuIF9yaWw7XG59XG4oZnVuY3Rpb24gKFJJTCkge1xuICAgIGZ1bmN0aW9uIGluc3RhbGwoKSB7XG4gICAgICAgIGFwaV8xLlJBTC5pbnN0YWxsKF9yaWwpO1xuICAgIH1cbiAgICBSSUwuaW5zdGFsbCA9IGluc3RhbGw7XG59KShSSUwgfHwgKFJJTCA9IHt9KSk7XG5leHBvcnRzLmRlZmF1bHQgPSBSSUw7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24gPSBleHBvcnRzLkJyb3dzZXJNZXNzYWdlV3JpdGVyID0gZXhwb3J0cy5Ccm93c2VyTWVzc2FnZVJlYWRlciA9IHZvaWQgMDtcbmNvbnN0IHJpbF8xID0gcmVxdWlyZShcIi4vcmlsXCIpO1xuLy8gSW5zdGFsbCB0aGUgYnJvd3NlciBydW50aW1lIGFic3RyYWN0LlxucmlsXzEuZGVmYXVsdC5pbnN0YWxsKCk7XG5jb25zdCBhcGlfMSA9IHJlcXVpcmUoXCIuLi9jb21tb24vYXBpXCIpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuLi9jb21tb24vYXBpXCIpLCBleHBvcnRzKTtcbmNsYXNzIEJyb3dzZXJNZXNzYWdlUmVhZGVyIGV4dGVuZHMgYXBpXzEuQWJzdHJhY3RNZXNzYWdlUmVhZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihwb3J0KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX29uRGF0YSA9IG5ldyBhcGlfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuX21lc3NhZ2VMaXN0ZW5lciA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fb25EYXRhLmZpcmUoZXZlbnQuZGF0YSk7XG4gICAgICAgIH07XG4gICAgICAgIHBvcnQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoZXZlbnQpID0+IHRoaXMuZmlyZUVycm9yKGV2ZW50KSk7XG4gICAgICAgIHBvcnQub25tZXNzYWdlID0gdGhpcy5fbWVzc2FnZUxpc3RlbmVyO1xuICAgIH1cbiAgICBsaXN0ZW4oY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uRGF0YS5ldmVudChjYWxsYmFjayk7XG4gICAgfVxufVxuZXhwb3J0cy5Ccm93c2VyTWVzc2FnZVJlYWRlciA9IEJyb3dzZXJNZXNzYWdlUmVhZGVyO1xuY2xhc3MgQnJvd3Nlck1lc3NhZ2VXcml0ZXIgZXh0ZW5kcyBhcGlfMS5BYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKHBvcnQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50ID0gMDtcbiAgICAgICAgcG9ydC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIChldmVudCkgPT4gdGhpcy5maXJlRXJyb3IoZXZlbnQpKTtcbiAgICB9XG4gICAgd3JpdGUobXNnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnBvcnQucG9zdE1lc3NhZ2UobXNnKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IsIG1zZyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZUVycm9yKGVycm9yLCBtc2cpIHtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50Kys7XG4gICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yLCBtc2csIHRoaXMuZXJyb3JDb3VudCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICB9XG59XG5leHBvcnRzLkJyb3dzZXJNZXNzYWdlV3JpdGVyID0gQnJvd3Nlck1lc3NhZ2VXcml0ZXI7XG5mdW5jdGlvbiBjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbihyZWFkZXIsIHdyaXRlciwgbG9nZ2VyLCBvcHRpb25zKSB7XG4gICAgaWYgKGxvZ2dlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxvZ2dlciA9IGFwaV8xLk51bGxMb2dnZXI7XG4gICAgfVxuICAgIGlmIChhcGlfMS5Db25uZWN0aW9uU3RyYXRlZ3kuaXMob3B0aW9ucykpIHtcbiAgICAgICAgb3B0aW9ucyA9IHsgY29ubmVjdGlvblN0cmF0ZWd5OiBvcHRpb25zIH07XG4gICAgfVxuICAgIHJldHVybiAoMCwgYXBpXzEuY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24pKHJlYWRlciwgd3JpdGVyLCBsb2dnZXIsIG9wdGlvbnMpO1xufVxuZXhwb3J0cy5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiA9IGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uO1xuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL2Jyb3dzZXIvbWFpbicpOyIsICIvKlxuICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMjYgRWNsaXBzZSBEaXJpZ2libGUgY29udHJpYnV0b3JzXG4gKlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlXG4gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2Mi4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG4gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MjAuaHRtbFxuICpcbiAqIFNQRFgtRmlsZUNvcHlyaWdodFRleHQ6IEVjbGlwc2UgRGlyaWdpYmxlIGNvbnRyaWJ1dG9ycyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbi8qKlxuICogSmF2YSBMU1AgY2xpZW50IGJ1bmRsZS5cbiAqXG4gKiBVc2VzIHZzY29kZS13cy1qc29ucnBjIGZvciB0eXBlZCBKU09OLVJQQyBvdmVyIFdlYlNvY2tldCBhbmQgcmVnaXN0ZXJzIE1vbmFjb1xuICogcHJvdmlkZXJzIHRoYXQgZGVsZWdhdGUgdG8gSkRULkxTLiBFeHBvc2VkIGFzIGdsb2JhbCBKYXZhTHNwQ2xpZW50TGliIHNvIHRoYXRcbiAqIGVkaXRvci5qcyBjYW4gY2FsbCBKYXZhTHNwQ2xpZW50TGliLmNvbm5lY3QocmVzb3VyY2VQYXRoKS5cbiAqXG4gKiBPbmUgSkRULkxTIHByb2Nlc3MgY292ZXJzIHRoZSBlbnRpcmUgd29ya3NwYWNlLCBzbyBhIHNpbmdsZSBXZWJTb2NrZXQgY29ubmVjdGlvblxuICogaXMgc2hhcmVkIGFjcm9zcyBhbGwgSmF2YSBmaWxlcyBvcGVuIGluIHRoZSBzYW1lIGJyb3dzZXIgcGFnZS4gVGhlIGNvbm5lY3Rpb24gaXNcbiAqIGVzdGFibGlzaGVkIG9uIHRoZSBmaXJzdCBjb25uZWN0KCkgY2FsbCBhbmQgcmV1c2VkIGZvciBhbGwgc3Vic2VxdWVudCBjYWxscy5cbiAqXG4gKiBlZGl0b3IuanMgc2V0cyB3aW5kb3cubW9uYWNvIGJlZm9yZSBjYWxsaW5nIGNvbm5lY3QoKSwgc28gdGhlIG1vbmFjby1zaGltJ3MgbGF6eVxuICogUHJveGllcyByZXNvbHZlIGNvcnJlY3RseSBhdCBjYWxsIHRpbWUuXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24sIE1lc3NhZ2VDb25uZWN0aW9uIH0gZnJvbSAndnNjb2RlLWpzb25ycGMvYnJvd3Nlcic7XG5pbXBvcnQgeyB0b1NvY2tldCwgV2ViU29ja2V0TWVzc2FnZVJlYWRlciwgV2ViU29ja2V0TWVzc2FnZVdyaXRlciB9IGZyb20gJ3ZzY29kZS13cy1qc29ucnBjJztcbmltcG9ydCAqIGFzIG1vbmFjbyBmcm9tICdtb25hY28tZWRpdG9yJztcbmltcG9ydCB7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLFxuICAgIERpYWdub3N0aWNTZXZlcml0eSxcbiAgICBJbnNlcnRUZXh0Rm9ybWF0LFxuICAgIE1hcmt1cENvbnRlbnQsXG4gICAgTWFya3VwS2luZCxcbiAgICB0eXBlIENvZGVBY3Rpb24sXG4gICAgdHlwZSBDb21tYW5kLFxuICAgIHR5cGUgQ29tcGxldGlvbkl0ZW0sXG4gICAgdHlwZSBDb21wbGV0aW9uTGlzdCxcbiAgICB0eXBlIERpYWdub3N0aWMsXG4gICAgdHlwZSBIb3ZlcixcbiAgICB0eXBlIExvY2F0aW9uLFxuICAgIHR5cGUgUGFyYW1ldGVySW5mb3JtYXRpb24sXG4gICAgdHlwZSBTaWduYXR1cmVIZWxwLFxuICAgIHR5cGUgU2lnbmF0dXJlSW5mb3JtYXRpb24sXG4gICAgdHlwZSBUZXh0RWRpdCxcbiAgICB0eXBlIFdvcmtzcGFjZUVkaXQsXG59IGZyb20gJ3ZzY29kZS1sYW5ndWFnZXNlcnZlci10eXBlcyc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNpbmdsZXRvbiBzdGF0ZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogU2hhcmVkIGNvbm5lY3Rpb24gXHUyMDE0IG9uZSBwZXIgYnJvd3NlciBwYWdlLCBjb3ZlcmluZyBhbGwgcHJvamVjdHMgaW4gdGhlIHdvcmtzcGFjZS4gKi9cbmxldCBfY29ubjogTWVzc2FnZUNvbm5lY3Rpb24gfCBudWxsID0gbnVsbDtcblxuLyoqXG4gKiBWaXJ0dWFsIHdvcmtzcGFjZSByb290IFVSSSwgZS5nLiB7QGNvZGUgZmlsZTovLy93b3Jrc3BhY2Uvd29ya3NwYWNlL30uXG4gKiBTZXQgb25jZSBvbiBmaXJzdCBjb25uZWN0KCk7IHVzZWQgdG8gc2NvcGUgTW9uYWNvIHByb3ZpZGVycyB0byB3b3Jrc3BhY2UgZmlsZXMuXG4gKi9cbmxldCBfd29ya3NwYWNlUm9vdCA9ICcnO1xuXG4vKiogVVJJcyBmb3Igd2hpY2ggdGV4dERvY3VtZW50L2RpZE9wZW4gaGFzIGFscmVhZHkgYmVlbiBzZW50LiAqL1xuY29uc3QgX29wZW5GaWxlczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cbmxldCBfcHJvdmlkZXJzUmVnaXN0ZXJlZCA9IGZhbHNlO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBQdWJsaWMgQVBJXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBDYWxsZWQgYnkgZWRpdG9yLmpzIHdoZW4gYSBKYXZhIGZpbGUgaXMgb3BlbmVkLiBTYWZlIHRvIGNhbGwgbXVsdGlwbGUgdGltZXMuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29ubmVjdChyZXNvdXJjZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcnRzID0gcmVzb3VyY2VQYXRoLnJlcGxhY2UoL15cXC8vLCAnJykuc3BsaXQoJy8nKTtcbiAgICBjb25zdCB3b3Jrc3BhY2UgPSBwYXJ0c1swXTtcbiAgICBjb25zdCBwcm9qZWN0ICAgPSBwYXJ0c1sxXTtcbiAgICBjb25zdCBmaWxlVXJpID0gYGZpbGU6Ly8vd29ya3NwYWNlLyR7d29ya3NwYWNlfS8ke3Byb2plY3R9LyR7cGFydHMuc2xpY2UoMikuam9pbignLycpfWA7XG5cbiAgICBpZiAoX2Nvbm4pIHtcbiAgICAgICAgLy8gQ29ubmVjdGlvbiBhbHJlYWR5IGVzdGFibGlzaGVkIFx1MjAxNCBqdXN0IG9wZW4gdGhlIG5ldyBmaWxlLlxuICAgICAgICBvcGVuRmlsZShmaWxlVXJpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIF93b3Jrc3BhY2VSb290ID0gYGZpbGU6Ly8vd29ya3NwYWNlLyR7d29ya3NwYWNlfS9gO1xuXG4gICAgY29uc3QgcHJvdG8gPSBsb2NhdGlvbi5wcm90b2NvbCA9PT0gJ2h0dHBzOicgPyAnd3NzJyA6ICd3cyc7XG4gICAgY29uc3Qgd3NVcmwgPSBgJHtwcm90b306Ly8ke2xvY2F0aW9uLmhvc3R9L3dlYnNvY2tldHMvaWRlL2phdmEtbHNwYFxuICAgICAgICAgICAgICAgICsgYD93b3Jrc3BhY2U9JHtlbmNvZGVVUklDb21wb25lbnQod29ya3NwYWNlKX1gO1xuXG4gICAgY29uc3Qgd3MgPSBuZXcgV2ViU29ja2V0KHdzVXJsKTtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHdzLm9ub3BlbiAgPSAoKSA9PiByZXNvbHZlKCk7XG4gICAgICAgIHdzLm9uZXJyb3IgPSAoKSA9PiByZWplY3QobmV3IEVycm9yKGBbamF2YS1sc3BdIFdlYlNvY2tldCBjb25uZWN0IGZhaWxlZDogJHt3c1VybH1gKSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBzb2NrZXQgPSB0b1NvY2tldCh3cyk7XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IFdlYlNvY2tldE1lc3NhZ2VSZWFkZXIoc29ja2V0KTtcbiAgICBjb25zdCB3cml0ZXIgPSBuZXcgV2ViU29ja2V0TWVzc2FnZVdyaXRlcihzb2NrZXQpO1xuICAgIF9jb25uID0gY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24ocmVhZGVyLCB3cml0ZXIpO1xuXG4gICAgLy8gRGlhZ25vc3RpY3Mgbm90aWZpY2F0aW9uIFx1MjE5MiBNb25hY28gbWFya2VycyAoYXBwbGllcyB0byBhbnkgd29ya3NwYWNlIGZpbGUpXG4gICAgX2Nvbm4ub25Ob3RpZmljYXRpb24oJ3RleHREb2N1bWVudC9wdWJsaXNoRGlhZ25vc3RpY3MnLCAocGFyYW1zOiB7IHVyaTogc3RyaW5nOyBkaWFnbm9zdGljczogRGlhZ25vc3RpY1tdIH0pID0+IHtcbiAgICAgICAgY29uc3QgbW9kZWwgPSBtb25hY28uZWRpdG9yLmdldE1vZGVscygpLmZpbmQobSA9PiBtLnVyaS50b1N0cmluZygpID09PSBwYXJhbXMudXJpKTtcbiAgICAgICAgaWYgKCFtb2RlbCkgcmV0dXJuO1xuICAgICAgICBtb25hY28uZWRpdG9yLnNldE1vZGVsTWFya2Vycyhtb2RlbCwgJ2phdmEtbHNwJywgcGFyYW1zLmRpYWdub3N0aWNzLm1hcChkID0+ICh7XG4gICAgICAgICAgICBzZXZlcml0eTogICAgICAgIGxzcFNldmVyaXR5KGQuc2V2ZXJpdHkpLFxuICAgICAgICAgICAgbWVzc2FnZTogICAgICAgICBkLm1lc3NhZ2UsXG4gICAgICAgICAgICBzb3VyY2U6ICAgICAgICAgIGQuc291cmNlID8/ICdqYXZhJyxcbiAgICAgICAgICAgIHN0YXJ0TGluZU51bWJlcjogZC5yYW5nZS5zdGFydC5saW5lICsgMSxcbiAgICAgICAgICAgIHN0YXJ0Q29sdW1uOiAgICAgZC5yYW5nZS5zdGFydC5jaGFyYWN0ZXIgKyAxLFxuICAgICAgICAgICAgZW5kTGluZU51bWJlcjogICBkLnJhbmdlLmVuZC5saW5lICsgMSxcbiAgICAgICAgICAgIGVuZENvbHVtbjogICAgICAgZC5yYW5nZS5lbmQuY2hhcmFjdGVyICsgMSxcbiAgICAgICAgfSkpKTtcbiAgICB9KTtcblxuICAgIC8vIFNlcnZlciAtPiBjbGllbnQgcmVxdWVzdHMgdGhhdCBkcml2ZSByZWZhY3RvciAvIGdlbmVyYXRlIHJlc3VsdHMgYW5kIGR5bmFtaWMgcmVnaXN0cmF0aW9uLlxuICAgIF9jb25uLm9uUmVxdWVzdCgnd29ya3NwYWNlL2FwcGx5RWRpdCcsIChwYXJhbXM6IHsgZWRpdDogV29ya3NwYWNlRWRpdCB9KSA9PiB7XG4gICAgICAgIGFwcGx5V29ya3NwYWNlRWRpdChwYXJhbXMuZWRpdCk7XG4gICAgICAgIHJldHVybiB7IGFwcGxpZWQ6IHRydWUgfTtcbiAgICB9KTtcbiAgICBfY29ubi5vblJlcXVlc3QoJ3dvcmtzcGFjZS9jb25maWd1cmF0aW9uJywgKHBhcmFtczogeyBpdGVtczogQXJyYXk8eyBzZWN0aW9uPzogc3RyaW5nIH0+IH0pID0+XG4gICAgICAgIChwYXJhbXMuaXRlbXMgPz8gW10pLm1hcCgoKSA9PiBqZHRsc1NldHRpbmdzKCkuamF2YSkpO1xuICAgIF9jb25uLm9uUmVxdWVzdCgnY2xpZW50L3JlZ2lzdGVyQ2FwYWJpbGl0eScsICgpID0+IG51bGwpO1xuICAgIF9jb25uLm9uUmVxdWVzdCgnY2xpZW50L3VucmVnaXN0ZXJDYXBhYmlsaXR5JywgKCkgPT4gbnVsbCk7XG4gICAgX2Nvbm4ub25SZXF1ZXN0KCd3aW5kb3cvc2hvd01lc3NhZ2VSZXF1ZXN0JywgKCkgPT4gbnVsbCk7XG4gICAgX2Nvbm4ub25SZXF1ZXN0KCd3aW5kb3cvd29ya0RvbmVQcm9ncmVzcy9jcmVhdGUnLCAoKSA9PiBudWxsKTtcbiAgICBfY29ubi5vbk5vdGlmaWNhdGlvbignd2luZG93L2xvZ01lc3NhZ2UnLCAocDogeyBtZXNzYWdlOiBzdHJpbmcgfSkgPT4gY29uc29sZS5kZWJ1ZygnW2phdmEtbHNwXScsIHA/Lm1lc3NhZ2UpKTtcbiAgICBfY29ubi5vbk5vdGlmaWNhdGlvbignd2luZG93L3Nob3dNZXNzYWdlJywgKHA6IHsgbWVzc2FnZTogc3RyaW5nIH0pID0+IGNvbnNvbGUuaW5mbygnW2phdmEtbHNwXScsIHA/Lm1lc3NhZ2UpKTtcbiAgICAvLyBKRFQuTFMgbGFuZ3VhZ2Utc3RhdHVzIC8gcHJvZ3Jlc3Mgbm90aWZpY2F0aW9ucyBcdTIwMTQgYWNrbm93bGVkZ2VkIHNpbGVudGx5LlxuICAgIF9jb25uLm9uTm90aWZpY2F0aW9uKCdsYW5ndWFnZS9zdGF0dXMnLCAoKSA9PiB7IC8qIGluZGV4aW5nL3JlYWR5IHN0YXR1cywgaWdub3JlZCAqLyB9KTtcbiAgICBfY29ubi5vbk5vdGlmaWNhdGlvbignbGFuZ3VhZ2UvcHJvZ3Jlc3NSZXBvcnQnLCAoKSA9PiB7IC8qIGJ1aWxkIHByb2dyZXNzLCBpZ25vcmVkICovIH0pO1xuXG4gICAgX2Nvbm4ubGlzdGVuKCk7XG5cbiAgICBjb25zdCByb290VXJpID0gX3dvcmtzcGFjZVJvb3Q7XG4gICAgYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ2luaXRpYWxpemUnLCB7XG4gICAgICAgIHByb2Nlc3NJZDogbnVsbCxcbiAgICAgICAgcm9vdFVyaSxcbiAgICAgICAgaW5pdGlhbGl6YXRpb25PcHRpb25zOiB7XG4gICAgICAgICAgICBzZXR0aW5nczogamR0bHNTZXR0aW5ncygpLFxuICAgICAgICAgICAgZXh0ZW5kZWRDbGllbnRDYXBhYmlsaXRpZXM6IHtcbiAgICAgICAgICAgICAgICBwcm9ncmVzc1JlcG9ydFByb3ZpZGVyOiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAgIGNsYXNzRmlsZUNvbnRlbnRzU3VwcG9ydDogICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICByZXNvbHZlQWRkaXRpb25hbFRleHRFZGl0c1N1cHBvcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgYWR2YW5jZWRHZW5lcmF0ZUFjY2Vzc29yc1N1cHBvcnQ6ICB0cnVlLFxuICAgICAgICAgICAgICAgIGdlbmVyYXRlVG9TdHJpbmdQcm9tcHRTdXBwb3J0OiAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICBnZW5lcmF0ZUNvbnN0cnVjdG9yc1Byb21wdFN1cHBvcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgZ2VuZXJhdGVEZWxlZ2F0ZU1ldGhvZHNQcm9tcHRTdXBwb3J0OiB0cnVlLFxuICAgICAgICAgICAgICAgIGhhc2hDb2RlRXF1YWxzUHJvbXB0U3VwcG9ydDogICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICBhZHZhbmNlZE9yZ2FuaXplSW1wb3J0c1N1cHBvcnQ6ICAgIHRydWUsXG4gICAgICAgICAgICAgICAgaW5mZXJTZWxlY3Rpb25TdXBwb3J0OiAgICAgICAgICAgICBbJ2V4dHJhY3RNZXRob2QnLCAnZXh0cmFjdFZhcmlhYmxlJywgJ2V4dHJhY3RGaWVsZCddLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgd29ya3NwYWNlRm9sZGVyczogW3sgdXJpOiByb290VXJpLCBuYW1lOiB3b3Jrc3BhY2UgfV0sXG4gICAgICAgIGNhcGFiaWxpdGllczoge1xuICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7XG4gICAgICAgICAgICAgICAgc3luY2hyb25pemF0aW9uOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUsIHdpbGxTYXZlOiBmYWxzZSwgZGlkU2F2ZTogdHJ1ZSwgd2lsbFNhdmVXYWl0VW50aWw6IGZhbHNlIH0sXG4gICAgICAgICAgICAgICAgY29tcGxldGlvbjoge1xuICAgICAgICAgICAgICAgICAgICBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uSXRlbToge1xuICAgICAgICAgICAgICAgICAgICAgICAgc25pcHBldFN1cHBvcnQ6ICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRhdGlvbkZvcm1hdDogICBbJ21hcmtkb3duJywgJ3BsYWludGV4dCddLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRlZFN1cHBvcnQ6ICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWl0Q2hhcmFjdGVyc1N1cHBvcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlU3VwcG9ydDogICAgICAgIHsgcHJvcGVydGllczogWydkb2N1bWVudGF0aW9uJywgJ2RldGFpbCcsICdhZGRpdGlvbmFsVGV4dEVkaXRzJ10gfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dFN1cHBvcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBob3ZlcjogICAgICAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLCBjb250ZW50Rm9ybWF0OiBbJ21hcmtkb3duJywgJ3BsYWludGV4dCddIH0sXG4gICAgICAgICAgICAgICAgc2lnbmF0dXJlSGVscDogIHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSwgc2lnbmF0dXJlSW5mb3JtYXRpb246IHsgZG9jdW1lbnRhdGlvbkZvcm1hdDogWydtYXJrZG93bicsICdwbGFpbnRleHQnXSwgcGFyYW1ldGVySW5mb3JtYXRpb246IHsgbGFiZWxPZmZzZXRTdXBwb3J0OiB0cnVlIH0gfSB9LFxuICAgICAgICAgICAgICAgIGRlZmluaXRpb246ICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VzOiAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgZG9jdW1lbnRTeW1ib2w6IHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIGZvcm1hdHRpbmc6ICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICByYW5nZUZvcm1hdHRpbmc6IHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIHJlbmFtZTogICAgICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUsIHByZXBhcmVTdXBwb3J0OiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgY29kZUFjdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjb2RlQWN0aW9uTGl0ZXJhbFN1cHBvcnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVBY3Rpb25LaW5kOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTZXQ6IFsncXVpY2tmaXgnLCAncmVmYWN0b3InLCAncmVmYWN0b3IuZXh0cmFjdCcsICdyZWZhY3Rvci5pbmxpbmUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVmYWN0b3IucmV3cml0ZScsICdzb3VyY2UnLCAnc291cmNlLm9yZ2FuaXplSW1wb3J0cyddLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgaXNQcmVmZXJyZWRTdXBwb3J0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBkYXRhU3VwcG9ydDogICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmVTdXBwb3J0OiAgICAgeyBwcm9wZXJ0aWVzOiBbJ2VkaXQnXSB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcHVibGlzaERpYWdub3N0aWNzOiB7IHJlbGF0ZWRJbmZvcm1hdGlvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdvcmtzcGFjZToge1xuICAgICAgICAgICAgICAgIGFwcGx5RWRpdDogICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbjogICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICBleGVjdXRlQ29tbWFuZDogICAgICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICBkaWRDaGFuZ2VDb25maWd1cmF0aW9uOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICB3b3Jrc3BhY2VFZGl0OiAgICAgICAgICB7IGRvY3VtZW50Q2hhbmdlczogdHJ1ZSwgcmVzb3VyY2VPcGVyYXRpb25zOiBbJ2NyZWF0ZScsICdyZW5hbWUnLCAnZGVsZXRlJ10gfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBfY29ubi5zZW5kTm90aWZpY2F0aW9uKCdpbml0aWFsaXplZCcsIHt9KTtcbiAgICBfY29ubi5zZW5kTm90aWZpY2F0aW9uKCd3b3Jrc3BhY2UvZGlkQ2hhbmdlQ29uZmlndXJhdGlvbicsIHsgc2V0dGluZ3M6IGpkdGxzU2V0dGluZ3MoKSB9KTtcblxuICAgIG9wZW5GaWxlKGZpbGVVcmkpO1xuXG4gICAgaWYgKCFfcHJvdmlkZXJzUmVnaXN0ZXJlZCkge1xuICAgICAgICBfcHJvdmlkZXJzUmVnaXN0ZXJlZCA9IHRydWU7XG4gICAgICAgIHJlZ2lzdGVyUHJvdmlkZXJzKCk7XG4gICAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBGaWxlIGxpZmVjeWNsZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFNlbmRzIHRleHREb2N1bWVudC9kaWRPcGVuIGZvciB0aGUgZ2l2ZW4gVVJJIChpZiBub3QgYWxyZWFkeSBzZW50KSBhbmQgcmVnaXN0ZXJzIGEgZGVib3VuY2VkXG4gKiB0ZXh0RG9jdW1lbnQvZGlkQ2hhbmdlIGxpc3RlbmVyIG9uIHRoZSBjb3JyZXNwb25kaW5nIE1vbmFjbyBtb2RlbC5cbiAqL1xuZnVuY3Rpb24gb3BlbkZpbGUoZmlsZVVyaTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKF9vcGVuRmlsZXMuaGFzKGZpbGVVcmkpIHx8ICFfY29ubikgcmV0dXJuO1xuICAgIF9vcGVuRmlsZXMuYWRkKGZpbGVVcmkpO1xuXG4gICAgY29uc3QgbW9kZWwgPSBtb25hY28uZWRpdG9yLmdldE1vZGVscygpLmZpbmQobSA9PiBtLnVyaS50b1N0cmluZygpID09PSBmaWxlVXJpKTtcbiAgICBfY29ubi5zZW5kTm90aWZpY2F0aW9uKCd0ZXh0RG9jdW1lbnQvZGlkT3BlbicsIHtcbiAgICAgICAgdGV4dERvY3VtZW50OiB7XG4gICAgICAgICAgICB1cmk6ICAgICAgICBmaWxlVXJpLFxuICAgICAgICAgICAgbGFuZ3VhZ2VJZDogJ2phdmEnLFxuICAgICAgICAgICAgdmVyc2lvbjogICAgMSxcbiAgICAgICAgICAgIHRleHQ6ICAgICAgIG1vZGVsPy5nZXRWYWx1ZSgpID8/ICcnLFxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgaWYgKG1vZGVsKSB7XG4gICAgICAgIGxldCB0aW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG4gICAgICAgIG1vZGVsLm9uRGlkQ2hhbmdlQ29udGVudCgoKSA9PiB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBfY29ubj8uc2VuZE5vdGlmaWNhdGlvbigndGV4dERvY3VtZW50L2RpZENoYW5nZScsIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiAgIHsgdXJpOiBmaWxlVXJpLCB2ZXJzaW9uOiBtb2RlbC5nZXRWZXJzaW9uSWQoKSB9LFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50Q2hhbmdlczogW3sgdGV4dDogbW9kZWwuZ2V0VmFsdWUoKSB9XSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sIDQwMCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gV29ya3NwYWNlIGZpbGUgcHJlZGljYXRlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogUmV0dXJucyB7QGNvZGUgdHJ1ZX0gd2hlbiB0aGUgZ2l2ZW4gbW9kZWwgVVJJIGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnRseSBjb25uZWN0ZWQgd29ya3NwYWNlLiBVc2VkXG4gKiBieSBNb25hY28gcHJvdmlkZXJzIHRvIHNraXAgbm9uLUphdmEtd29ya3NwYWNlIG1vZGVscyB3aXRob3V0IGFuIGV4YWN0LVVSSSBjb21wYXJpc29uLlxuICovXG5mdW5jdGlvbiBpc1dvcmtzcGFjZUZpbGUodXJpOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gX3dvcmtzcGFjZVJvb3QgIT09ICcnICYmIHVyaS5zdGFydHNXaXRoKF93b3Jrc3BhY2VSb290KTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gTW9uYWNvIHByb3ZpZGVyIHJlZ2lzdHJhdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiByZWdpc3RlclByb3ZpZGVycygpOiB2b2lkIHtcblxuICAgIG1vbmFjby5lZGl0b3IucmVnaXN0ZXJDb21tYW5kKEFQUExZX0FDVElPTl9DT01NQU5ELCAoX2FjY2Vzc29yOiB1bmtub3duLCBhY3Rpb246IENvZGVBY3Rpb24gfCBDb21tYW5kKSA9PiB7XG4gICAgICAgIGFwcGx5Q29kZUFjdGlvbihhY3Rpb24pO1xuICAgIH0pO1xuXG4gICAgLy8gQ3Jvc3MtZmlsZSBuYXZpZ2F0aW9uOiB0aGlzIHNpbmdsZS1maWxlIGVkaXRvciBoYXMgbm8gbW9kZWwgZm9yIG90aGVyIHdvcmtzcGFjZSBmaWxlcywgc28gR28gdG9cbiAgICAvLyBEZWZpbml0aW9uIC8gRmluZCBSZWZlcmVuY2VzIHRvIGFub3RoZXIgZmlsZSB3b3VsZCBzaWxlbnRseSBkbyBub3RoaW5nLiBIYW5kIHRob3NlIG9mZiB0byB0aGUgSURFXG4gICAgLy8gdG8gb3BlbiB0aGUgdGFyZ2V0IGZpbGUgKGFuZCByZXZlYWwgdGhlIGxpbmUpLiBTYW1lLWZpbGUgdGFyZ2V0cyBmYWxsIHRocm91Z2ggdG8gTW9uYWNvLlxuICAgIG1vbmFjby5lZGl0b3IucmVnaXN0ZXJFZGl0b3JPcGVuZXIoe1xuICAgICAgICBvcGVuQ29kZUVkaXRvcjogKHNvdXJjZSwgcmVzb3VyY2UsIHNlbGVjdGlvbk9yUG9zaXRpb24pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHVyaSA9IHJlc291cmNlLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBpZiAoIWlzV29ya3NwYWNlRmlsZSh1cmkpIHx8ICF1cmkuc3RhcnRzV2l0aChWSVJUVUFMX0ZJTEVfUFJFRklYKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudE1vZGVsID0gc291cmNlLmdldE1vZGVsKCk7XG4gICAgICAgICAgICBpZiAoY3VycmVudE1vZGVsICYmIGN1cnJlbnRNb2RlbC51cmkudG9TdHJpbmcoKSA9PT0gdXJpKSByZXR1cm4gZmFsc2U7IC8vIHNhbWUgZmlsZSBcdTIwMTQgbGV0IE1vbmFjbyBqdW1wXG4gICAgICAgICAgICBjb25zdCBvcGVuZXIgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLmphdmFMc3BPcGVuRmlsZTtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3BlbmVyICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBwb3MgPSBzZWxlY3Rpb25PclBvc2l0aW9uIGFzIHsgc3RhcnRMaW5lTnVtYmVyPzogbnVtYmVyOyBsaW5lTnVtYmVyPzogbnVtYmVyOyBzdGFydENvbHVtbj86IG51bWJlcjsgY29sdW1uPzogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBsaW5lID0gcG9zID8gKHBvcy5zdGFydExpbmVOdW1iZXIgPz8gcG9zLmxpbmVOdW1iZXIpIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgY29sdW1uID0gcG9zID8gKHBvcy5zdGFydENvbHVtbiA/PyBwb3MuY29sdW1uKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIG9wZW5lcih1cmkuc3Vic3RyaW5nKFZJUlRVQUxfRklMRV9QUkVGSVgubGVuZ3RoKSwgbGluZSwgY29sdW1uKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckNvbXBsZXRpb25JdGVtUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHRyaWdnZXJDaGFyYWN0ZXJzOiBbJy4nLCAnQCcsICc8J10sXG4gICAgICAgIHByb3ZpZGVDb21wbGV0aW9uSXRlbXM6IGFzeW5jIChtb2RlbCwgcG9zaXRpb24sIGNvbnRleHQpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgZmlsZVVyaSA9IG1vZGVsLnVyaS50b1N0cmluZygpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBDb21wbGV0aW9uTGlzdCB8IENvbXBsZXRpb25JdGVtW10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9jb21wbGV0aW9uJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IGZpbGVVcmkgfSxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogICAgIHsgbGluZTogcG9zaXRpb24ubGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogcG9zaXRpb24uY29sdW1uIC0gMSB9LFxuICAgICAgICAgICAgICAgIC8vIE1vbmFjbyB0cmlnZ2VyIGtpbmRzIGFyZSAwLWJhc2VkIChJbnZva2UvVHJpZ2dlckNoYXJhY3Rlci9Gb3JJbmNvbXBsZXRlKTsgTFNQIGlzIDEtYmFzZWQuXG4gICAgICAgICAgICAgICAgY29udGV4dDogICAgICB7IHRyaWdnZXJLaW5kOiAoY29udGV4dC50cmlnZ2VyS2luZCA/PyAwKSArIDEsIHRyaWdnZXJDaGFyYWN0ZXI6IGNvbnRleHQudHJpZ2dlckNoYXJhY3RlciB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBpdGVtcyA9IEFycmF5LmlzQXJyYXkocmVzdWx0KSA/IHJlc3VsdCA6IChyZXN1bHQ/Lml0ZW1zID8/IFtdKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3VnZ2VzdGlvbnM6IGl0ZW1zLm1hcChpdGVtID0+IGxzcENvbXBsZXRpb25Ub01vbmFjbyhpdGVtLCBtb2RlbCwgcG9zaXRpb24pKSxcbiAgICAgICAgICAgICAgICAvLyBKRFQuTFMgcmV0dXJucyBhIHRydW5jYXRlZCBsaXN0IG9uIHRoZSBmaXJzdCBrZXlzdHJva2VzOyBwcm9wYWdhdGluZyBcImluY29tcGxldGVcIiBtYWtlc1xuICAgICAgICAgICAgICAgIC8vIE1vbmFjbyByZS1xdWVyeSBhcyB0aGUgdXNlciB0eXBlcyBpbnN0ZWFkIG9mIGNhY2hpbmcgdGhlIGZpcnN0IChvZnRlbiBlbXB0eSkgcmVzdWx0LlxuICAgICAgICAgICAgICAgIGluY29tcGxldGU6ICBBcnJheS5pc0FycmF5KHJlc3VsdCkgPyBmYWxzZSA6ICEhcmVzdWx0Py5pc0luY29tcGxldGUsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvLyBSZXNvbHZlIGRvY3VtZW50YXRpb24gYW5kLCBjcnVjaWFsbHksIHRoZSBhdXRvLWltcG9ydCBhZGRpdGlvbmFsVGV4dEVkaXRzIHdoaWNoIEpEVC5MUyBvbmx5XG4gICAgICAgIC8vIGF0dGFjaGVzIG9uIHJlc29sdmUgXHUyMDE0IHNlbGVjdGluZyBhIHR5cGUgdGhlbiBpbnNlcnRzIGl0cyBpbXBvcnQgc3RhdGVtZW50LlxuICAgICAgICByZXNvbHZlQ29tcGxldGlvbkl0ZW06IGFzeW5jIChpdGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsc3AgPSAoaXRlbSBhcyBNb25hY29Db21wbGV0aW9uSXRlbSkuX2xzcDtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWxzcCkgcmV0dXJuIGl0ZW07XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkOiBDb21wbGV0aW9uSXRlbSA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCdjb21wbGV0aW9uSXRlbS9yZXNvbHZlJywgbHNwKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQuZG9jdW1lbnRhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBpdGVtLmRvY3VtZW50YXRpb24gPSB7IHZhbHVlOiBtYXJrdXBUb1N0cmluZyhyZXNvbHZlZC5kb2N1bWVudGF0aW9uKSwgaXNUcnVzdGVkOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQuZGV0YWlsKSBpdGVtLmRldGFpbCA9IHJlc29sdmVkLmRldGFpbDtcbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQuYWRkaXRpb25hbFRleHRFZGl0cz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uYWRkaXRpb25hbFRleHRFZGl0cyA9IHJlc29sdmVkLmFkZGl0aW9uYWxUZXh0RWRpdHMubWFwKHRleHRFZGl0VG9Nb25hY28pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKCdbamF2YS1sc3BdIGNvbXBsZXRpb24gcmVzb2x2ZSBmYWlsZWQ6JywgKGUgYXMgRXJyb3IpPy5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckhvdmVyUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVIb3ZlcjogYXN5bmMgKG1vZGVsLCBwb3NpdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBmaWxlVXJpID0gbW9kZWwudXJpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IEhvdmVyIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvaG92ZXInLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogZmlsZVVyaSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0Py5jb250ZW50cykgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50cyA9IEFycmF5LmlzQXJyYXkocmVzdWx0LmNvbnRlbnRzKSA/IHJlc3VsdC5jb250ZW50cyA6IFtyZXN1bHQuY29udGVudHNdO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjb250ZW50czogY29udGVudHMubWFwKGMgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHR5cGVvZiBjID09PSAnc3RyaW5nJyA/IGMgOiAoYyBhcyBNYXJrdXBDb250ZW50KS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgaXNUcnVzdGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgcmFuZ2U6IHJlc3VsdC5yYW5nZSA/IGxzcFJhbmdlVG9Nb25hY28ocmVzdWx0LnJhbmdlKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyU2lnbmF0dXJlSGVscFByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBzaWduYXR1cmVIZWxwVHJpZ2dlckNoYXJhY3RlcnM6IFsnKCcsICcsJ10sXG4gICAgICAgIHByb3ZpZGVTaWduYXR1cmVIZWxwOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVVcmkgPSBtb2RlbC51cmkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogU2lnbmF0dXJlSGVscCB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L3NpZ25hdHVyZUhlbHAnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogZmlsZVVyaSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlczogcmVzdWx0LnNpZ25hdHVyZXMubWFwKChzaWc6IFNpZ25hdHVyZUluZm9ybWF0aW9uKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICAgICAgICAgc2lnLmxhYmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRhdGlvbjogc2lnLmRvY3VtZW50YXRpb24gPyBtYXJrdXBUb1N0cmluZyhzaWcuZG9jdW1lbnRhdGlvbikgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiAgICAoc2lnLnBhcmFtZXRlcnMgPz8gW10pLm1hcCgocDogUGFyYW1ldGVySW5mb3JtYXRpb24pID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICAgICAgICAgcC5sYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudGF0aW9uOiBwLmRvY3VtZW50YXRpb24gPyBtYXJrdXBUb1N0cmluZyhwLmRvY3VtZW50YXRpb24pIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZVNpZ25hdHVyZTogcmVzdWx0LmFjdGl2ZVNpZ25hdHVyZSA/PyAwLFxuICAgICAgICAgICAgICAgICAgICBhY3RpdmVQYXJhbWV0ZXI6IHJlc3VsdC5hY3RpdmVQYXJhbWV0ZXIgPz8gMCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGRpc3Bvc2U6ICgpID0+IHt9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJEZWZpbml0aW9uUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVEZWZpbml0aW9uOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVVcmkgPSBtb2RlbC51cmkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogTG9jYXRpb24gfCBMb2NhdGlvbltdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvZGVmaW5pdGlvbicsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBmaWxlVXJpIH0sXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgbG9jYXRpb25zID0gQXJyYXkuaXNBcnJheShyZXN1bHQpID8gcmVzdWx0IDogW3Jlc3VsdF07XG4gICAgICAgICAgICByZXR1cm4gbG9jYXRpb25zLm1hcChsb2MgPT4gKHtcbiAgICAgICAgICAgICAgICB1cmk6ICAgbW9uYWNvLlVyaS5wYXJzZShsb2MudXJpKSxcbiAgICAgICAgICAgICAgICByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhsb2MucmFuZ2UpLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlclJlZmVyZW5jZVByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlUmVmZXJlbmNlczogYXN5bmMgKG1vZGVsLCBwb3NpdGlvbiwgY29udGV4dCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IExvY2F0aW9uW10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9yZWZlcmVuY2VzJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgICAgICBjb250ZXh0OiAgICAgIHsgaW5jbHVkZURlY2xhcmF0aW9uOiBjb250ZXh0LmluY2x1ZGVEZWNsYXJhdGlvbiB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0Lm1hcChsb2MgPT4gKHsgdXJpOiBtb25hY28uVXJpLnBhcnNlKGxvYy51cmkpLCByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhsb2MucmFuZ2UpIH0pKTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJSZW5hbWVQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZVJlbmFtZUVkaXRzOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uLCBuZXdOYW1lKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4geyBlZGl0czogW10gfTtcbiAgICAgICAgICAgIGNvbnN0IGVkaXQ6IFdvcmtzcGFjZUVkaXQgfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9yZW5hbWUnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogICAgIHsgbGluZTogcG9zaXRpb24ubGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogcG9zaXRpb24uY29sdW1uIC0gMSB9LFxuICAgICAgICAgICAgICAgIG5ld05hbWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghZWRpdCkgcmV0dXJuIHsgZWRpdHM6IFtdIH07XG4gICAgICAgICAgICAvLyBBIEpEVC5MUyByZW5hbWUgY2FuIHNwYW4gbWFueSBmaWxlcyBhbmQgZXZlbiByZW5hbWUgdGhlIHR5cGUncyBvd24gLmphdmEgZmlsZS4gTW9uYWNvJ3NcbiAgICAgICAgICAgIC8vIHNpbmdsZS1maWxlIGVkaXRvciB3b3VsZCBkcm9wIGV2ZXJ5dGhpbmcgYnV0IHRoZSBjdXJyZW50IG1vZGVsLCBzbyBhcHBseSB0aGUgd2hvbGUgZWRpdFxuICAgICAgICAgICAgLy8gdGhyb3VnaCB0aGUgd29ya3NwYWNlIG91cnNlbHZlcyB3aGVuIHRoZSBJREUgcGVyc2lzdGVuY2UgaG9vayBpcyBhdmFpbGFibGUuXG4gICAgICAgICAgICBpZiAodHlwZW9mIChnbG9iYWxUaGlzIGFzIGFueSkuamF2YUxzcFBlcnNpc3RSZW5hbWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBhcHBseVJlbmFtZUFjcm9zc1dvcmtzcGFjZShtb2RlbCwgZWRpdCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGVkaXRzOiBbXSB9O1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignW2phdmEtbHNwXSBjcm9zcy1maWxlIHJlbmFtZSBmYWlsZWQsIGFwcGx5aW5nIHRvIHRoZSBjdXJyZW50IGZpbGUgb25seTonLCBlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdvcmtzcGFjZUVkaXRUb01vbmFjbyhlZGl0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gd29ya3NwYWNlRWRpdFRvTW9uYWNvKGVkaXQpO1xuICAgICAgICB9LFxuICAgICAgICByZXNvbHZlUmVuYW1lTG9jYXRpb246IGFzeW5jIChtb2RlbCwgcG9zaXRpb24pID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQ6IHsgcmFuZ2U6IExzcFJhbmdlOyBwbGFjZWhvbGRlcj86IHN0cmluZyB9IHwgTHNwUmFuZ2UgfCBudWxsID1cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9wcmVwYXJlUmVuYW1lJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCByYW5nZSA9ICdyYW5nZScgaW4gcmVzdWx0ID8gcmVzdWx0LnJhbmdlIDogcmVzdWx0O1xuICAgICAgICAgICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gJ3BsYWNlaG9sZGVyJyBpbiByZXN1bHQgJiYgcmVzdWx0LnBsYWNlaG9sZGVyXG4gICAgICAgICAgICAgICAgICAgID8gcmVzdWx0LnBsYWNlaG9sZGVyXG4gICAgICAgICAgICAgICAgICAgIDogbW9kZWwuZ2V0V29yZEF0UG9zaXRpb24ocG9zaXRpb24pPy53b3JkID8/ICcnO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHJhbmdlOiBsc3BSYW5nZVRvTW9uYWNvKHJhbmdlKSwgdGV4dDogcGxhY2Vob2xkZXIgfTtcbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgIGNvbnN0IHdvcmQgPSBtb2RlbC5nZXRXb3JkQXRQb3NpdGlvbihwb3NpdGlvbik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdvcmQgPyB7XG4gICAgICAgICAgICAgICAgICAgIHJhbmdlOiB7IHN0YXJ0TGluZU51bWJlcjogcG9zaXRpb24ubGluZU51bWJlciwgc3RhcnRDb2x1bW46IHdvcmQuc3RhcnRDb2x1bW4sIGVuZExpbmVOdW1iZXI6IHBvc2l0aW9uLmxpbmVOdW1iZXIsIGVuZENvbHVtbjogd29yZC5lbmRDb2x1bW4gfSxcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogd29yZC53b3JkLFxuICAgICAgICAgICAgICAgIH0gOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gUmVnaXN0ZXJpbmcgdGhpcyBwcm92aWRlciBhbHNvIGVuYWJsZXMgZWRpdG9yLmpzJ3MgZXhpc3RpbmcgZm9ybWF0LW9uLXNhdmUgcGF0aCBmb3IgSmF2YTogdGhlXG4gICAgLy8gc2hhcmVkIFNhdmUgYWN0aW9uIHJ1bnMgZWRpdG9yLmFjdGlvbi5mb3JtYXREb2N1bWVudCB3aGVuIGF1dG8tZm9ybWF0dGluZyBpcyBvbiAodGhlIHNhbWVcbiAgICAvLyBtZWNoYW5pc20gYW5kIGdsb2JhbCB0b2dnbGUgdXNlZCBmb3IgVHlwZVNjcmlwdCkuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckRvY3VtZW50Rm9ybWF0dGluZ0VkaXRQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZURvY3VtZW50Rm9ybWF0dGluZ0VkaXRzOiBhc3luYyAobW9kZWwpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgZWRpdHM6IFRleHRFZGl0W10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9mb3JtYXR0aW5nJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICAgICAgb3B0aW9uczogICAgICB7IHRhYlNpemU6IG1vZGVsLmdldE9wdGlvbnMoKS50YWJTaXplLCBpbnNlcnRTcGFjZXM6IG1vZGVsLmdldE9wdGlvbnMoKS5pbnNlcnRTcGFjZXMgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGVkaXRzID8gZWRpdHMubWFwKHRleHRFZGl0VG9Nb25hY28pIDogbnVsbDtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJDb2RlQWN0aW9uUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVDb2RlQWN0aW9uczogYXN5bmMgKG1vZGVsLCByYW5nZSwgY29udGV4dCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZW1wdHkgPSB7IGFjdGlvbnM6IFtdLCBkaXNwb3NlKCkgeyAvKiBub3RoaW5nIHRvIGRpc3Bvc2UgKi8gfSB9O1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIGVtcHR5O1xuICAgICAgICAgICAgY29uc3QgZGlhZ25vc3RpY3MgPSAoY29udGV4dC5tYXJrZXJzID8/IFtdKS5tYXAobWFya2VyVG9Mc3BEaWFnbm9zdGljKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogQXJyYXk8Q29kZUFjdGlvbiB8IENvbW1hbmQ+IHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvY29kZUFjdGlvbicsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgIHJhbmdlOiAgICAgICAgbW9uYWNvUmFuZ2VUb0xzcChyYW5nZSksXG4gICAgICAgICAgICAgICAgY29udGV4dDogICAgICB7IGRpYWdub3N0aWNzLCBvbmx5OiBjb250ZXh0Lm9ubHkgPyBbY29udGV4dC5vbmx5XSA6IHVuZGVmaW5lZCB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdD8ubGVuZ3RoKSByZXR1cm4gZW1wdHk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGFjdGlvbnM6IHJlc3VsdC5tYXAobHNwQ29kZUFjdGlvblRvTW9uYWNvKSxcbiAgICAgICAgICAgICAgICBkaXNwb3NlKCkgeyAvKiBub3RoaW5nIHRvIGRpc3Bvc2UgKi8gfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgfSwge1xuICAgICAgICBwcm92aWRlZENvZGVBY3Rpb25LaW5kczogWydxdWlja2ZpeCcsICdyZWZhY3RvcicsICdyZWZhY3Rvci5leHRyYWN0JywgJ3JlZmFjdG9yLmlubGluZScsXG4gICAgICAgICAgICAncmVmYWN0b3IucmV3cml0ZScsICdzb3VyY2UnLCAnc291cmNlLm9yZ2FuaXplSW1wb3J0cyddLFxuICAgIH0pO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBIZWxwZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIGxzcFNldmVyaXR5KHNldmVyaXR5OiBEaWFnbm9zdGljU2V2ZXJpdHkgfCB1bmRlZmluZWQpOiBtb25hY28uTWFya2VyU2V2ZXJpdHkge1xuICAgIHN3aXRjaCAoc2V2ZXJpdHkpIHtcbiAgICAgICAgY2FzZSBEaWFnbm9zdGljU2V2ZXJpdHkuRXJyb3I6ICAgICAgIHJldHVybiBtb25hY28uTWFya2VyU2V2ZXJpdHkuRXJyb3I7XG4gICAgICAgIGNhc2UgRGlhZ25vc3RpY1NldmVyaXR5Lldhcm5pbmc6ICAgICByZXR1cm4gbW9uYWNvLk1hcmtlclNldmVyaXR5Lldhcm5pbmc7XG4gICAgICAgIGNhc2UgRGlhZ25vc3RpY1NldmVyaXR5LkluZm9ybWF0aW9uOiByZXR1cm4gbW9uYWNvLk1hcmtlclNldmVyaXR5LkluZm87XG4gICAgICAgIGNhc2UgRGlhZ25vc3RpY1NldmVyaXR5LkhpbnQ6ICAgICAgICByZXR1cm4gbW9uYWNvLk1hcmtlclNldmVyaXR5LkhpbnQ7XG4gICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9uYWNvLk1hcmtlclNldmVyaXR5LkVycm9yO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gbHNwUmFuZ2VUb01vbmFjbyhyOiB7IHN0YXJ0OiB7IGxpbmU6IG51bWJlcjsgY2hhcmFjdGVyOiBudW1iZXIgfTsgZW5kOiB7IGxpbmU6IG51bWJlcjsgY2hhcmFjdGVyOiBudW1iZXIgfSB9KTogbW9uYWNvLklSYW5nZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnRMaW5lTnVtYmVyOiByLnN0YXJ0LmxpbmUgKyAxLFxuICAgICAgICBzdGFydENvbHVtbjogICAgIHIuc3RhcnQuY2hhcmFjdGVyICsgMSxcbiAgICAgICAgZW5kTGluZU51bWJlcjogICByLmVuZC5saW5lICsgMSxcbiAgICAgICAgZW5kQ29sdW1uOiAgICAgICByLmVuZC5jaGFyYWN0ZXIgKyAxLFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIG1hcmt1cFRvU3RyaW5nKGM6IHN0cmluZyB8IE1hcmt1cENvbnRlbnQpOiBzdHJpbmcge1xuICAgIHJldHVybiB0eXBlb2YgYyA9PT0gJ3N0cmluZycgPyBjIDogYy52YWx1ZTtcbn1cblxuZnVuY3Rpb24gbHNwQ29tcGxldGlvbktpbmQoa2luZDogQ29tcGxldGlvbkl0ZW1LaW5kIHwgdW5kZWZpbmVkKTogbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbUtpbmQge1xuICAgIGNvbnN0IEsgPSBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtS2luZDtcbiAgICBzd2l0Y2ggKGtpbmQpIHtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuVGV4dDogICAgICAgICAgcmV0dXJuIEsuVGV4dDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuTWV0aG9kOiAgICAgICAgcmV0dXJuIEsuTWV0aG9kO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5GdW5jdGlvbjogICAgICByZXR1cm4gSy5GdW5jdGlvbjtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuQ29uc3RydWN0b3I6ICAgcmV0dXJuIEsuQ29uc3RydWN0b3I7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLkZpZWxkOiAgICAgICAgIHJldHVybiBLLkZpZWxkO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5WYXJpYWJsZTogICAgICByZXR1cm4gSy5WYXJpYWJsZTtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuQ2xhc3M6ICAgICAgICAgcmV0dXJuIEsuQ2xhc3M7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLkludGVyZmFjZTogICAgIHJldHVybiBLLkludGVyZmFjZTtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuTW9kdWxlOiAgICAgICAgcmV0dXJuIEsuTW9kdWxlO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5Qcm9wZXJ0eTogICAgICByZXR1cm4gSy5Qcm9wZXJ0eTtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuS2V5d29yZDogICAgICAgcmV0dXJuIEsuS2V5d29yZDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuU25pcHBldDogICAgICAgcmV0dXJuIEsuU25pcHBldDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuQ29uc3RhbnQ6ICAgICAgcmV0dXJuIEsuQ29uc3RhbnQ7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLlN0cnVjdDogICAgICAgIHJldHVybiBLLlN0cnVjdDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuVHlwZVBhcmFtZXRlcjogcmV0dXJuIEsuVHlwZVBhcmFtZXRlcjtcbiAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEsuVGV4dDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGxzcENvbXBsZXRpb25Ub01vbmFjbyhcbiAgICBpdGVtOiBDb21wbGV0aW9uSXRlbSxcbiAgICBtb2RlbDogbW9uYWNvLmVkaXRvci5JVGV4dE1vZGVsLFxuICAgIHBvc2l0aW9uOiBtb25hY28uUG9zaXRpb24sXG4pOiBNb25hY29Db21wbGV0aW9uSXRlbSB7XG4gICAgY29uc3Qgd29yZCA9IG1vZGVsLmdldFdvcmRVbnRpbFBvc2l0aW9uKHBvc2l0aW9uKTtcbiAgICBsZXQgcmFuZ2U6IG1vbmFjby5JUmFuZ2UgPSB7XG4gICAgICAgIHN0YXJ0TGluZU51bWJlcjogcG9zaXRpb24ubGluZU51bWJlcixcbiAgICAgICAgc3RhcnRDb2x1bW46ICAgICB3b3JkLnN0YXJ0Q29sdW1uLFxuICAgICAgICBlbmRMaW5lTnVtYmVyOiAgIHBvc2l0aW9uLmxpbmVOdW1iZXIsXG4gICAgICAgIGVuZENvbHVtbjogICAgICAgd29yZC5lbmRDb2x1bW4sXG4gICAgfTtcbiAgICBsZXQgaW5zZXJ0VGV4dCA9IGl0ZW0uaW5zZXJ0VGV4dCA/PyBpdGVtLmxhYmVsO1xuICAgIGNvbnN0IHRleHRFZGl0ID0gaXRlbS50ZXh0RWRpdCBhcyB7IHJhbmdlPzogTHNwUmFuZ2U7IHJlcGxhY2U/OiBMc3BSYW5nZTsgaW5zZXJ0PzogTHNwUmFuZ2U7IG5ld1RleHQ/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcbiAgICBpZiAodGV4dEVkaXQpIHtcbiAgICAgICAgY29uc3QgciA9IHRleHRFZGl0LnJhbmdlID8/IHRleHRFZGl0LnJlcGxhY2UgPz8gdGV4dEVkaXQuaW5zZXJ0O1xuICAgICAgICBpZiAocikgcmFuZ2UgPSBsc3BSYW5nZVRvTW9uYWNvKHIpO1xuICAgICAgICBpZiAodHlwZW9mIHRleHRFZGl0Lm5ld1RleHQgPT09ICdzdHJpbmcnKSBpbnNlcnRUZXh0ID0gdGV4dEVkaXQubmV3VGV4dDtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0OiBNb25hY29Db21wbGV0aW9uSXRlbSA9IHtcbiAgICAgICAgbGFiZWw6ICAgICAgICAgICBpdGVtLmxhYmVsLFxuICAgICAgICBraW5kOiAgICAgICAgICAgIGxzcENvbXBsZXRpb25LaW5kKGl0ZW0ua2luZCksXG4gICAgICAgIGRldGFpbDogICAgICAgICAgaXRlbS5kZXRhaWwsXG4gICAgICAgIGRvY3VtZW50YXRpb246ICAgaXRlbS5kb2N1bWVudGF0aW9uID8geyB2YWx1ZTogbWFya3VwVG9TdHJpbmcoaXRlbS5kb2N1bWVudGF0aW9uKSwgaXNUcnVzdGVkOiBmYWxzZSB9IDogdW5kZWZpbmVkLFxuICAgICAgICBpbnNlcnRUZXh0LFxuICAgICAgICBpbnNlcnRUZXh0UnVsZXM6IGl0ZW0uaW5zZXJ0VGV4dEZvcm1hdCA9PT0gSW5zZXJ0VGV4dEZvcm1hdC5TbmlwcGV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbUluc2VydFRleHRSdWxlLkluc2VydEFzU25pcHBldFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgcmFuZ2UsXG4gICAgICAgIHNvcnRUZXh0OiAgICAgICAgICAgIHNka1ByaW9yaXRpc2VkU29ydFRleHQoaXRlbSksXG4gICAgICAgIGZpbHRlclRleHQ6ICAgICAgICAgIGl0ZW0uZmlsdGVyVGV4dCxcbiAgICAgICAgcHJlc2VsZWN0OiAgICAgICAgICAgaXRlbS5wcmVzZWxlY3QsXG4gICAgICAgIGNvbW1pdENoYXJhY3RlcnM6ICAgIGl0ZW0uY29tbWl0Q2hhcmFjdGVycyxcbiAgICAgICAgYWRkaXRpb25hbFRleHRFZGl0czogaXRlbS5hZGRpdGlvbmFsVGV4dEVkaXRzPy5tYXAodGV4dEVkaXRUb01vbmFjbyksXG4gICAgfTtcbiAgICByZXN1bHQuX2xzcCA9IGl0ZW07XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBSYW5rcyBEaXJpZ2libGUgU0RLIHN1Z2dlc3Rpb25zICh7QGNvZGUgb3JnLmVjbGlwc2UuZGlyaWdpYmxlLnNkay4qfSkgYWJvdmUgZXZlcnl0aGluZyBlbHNlIGJ5XG4gKiBwcmVmaXhpbmcgdGhlIHNlcnZlciBzb3J0VGV4dCB3aXRoIGEgcHJpb3JpdHkgYnVja2V0LCBwcmVzZXJ2aW5nIHRoZSBzZXJ2ZXIgb3JkZXIgd2l0aGluIGVhY2ggYnVja2V0LlxuICovXG5mdW5jdGlvbiBzZGtQcmlvcml0aXNlZFNvcnRUZXh0KGl0ZW06IENvbXBsZXRpb25JdGVtKTogc3RyaW5nIHtcbiAgICBjb25zdCBiYXNlID0gaXRlbS5zb3J0VGV4dCA/PyAodHlwZW9mIGl0ZW0ubGFiZWwgPT09ICdzdHJpbmcnID8gaXRlbS5sYWJlbCA6ICcnKTtcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IChpdGVtLmxhYmVsRGV0YWlscyAmJiB0eXBlb2YgaXRlbS5sYWJlbERldGFpbHMuZGVzY3JpcHRpb24gPT09ICdzdHJpbmcnKVxuICAgICAgICA/IGl0ZW0ubGFiZWxEZXRhaWxzLmRlc2NyaXB0aW9uIDogJyc7XG4gICAgY29uc3QgaGF5c3RhY2sgPSBgJHtpdGVtLmRldGFpbCA/PyAnJ30gJHtkZXNjcmlwdGlvbn1gO1xuICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcygnb3JnLmVjbGlwc2UuZGlyaWdpYmxlLnNkaycpID8gYDBfJHtiYXNlfWAgOiBgMV8ke2Jhc2V9YDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ29kZSBhY3Rpb25zLCBjb21tYW5kcywgcmVmYWN0b3IvZ2VuZXJhdGUsIHdvcmtzcGFjZSBlZGl0c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogTW9uYWNvIGNvbW1hbmQgaWQgdXNlZCB0byBhcHBseSBhIGRlZmVycmVkIExTUCBjb2RlIGFjdGlvbiB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgaXQuICovXG5jb25zdCBBUFBMWV9BQ1RJT05fQ09NTUFORCA9ICdkaXJpZ2libGUuamF2YS5hcHBseUNvZGVBY3Rpb24nO1xuXG4vKiogVmlydHVhbCBVUkkgcHJlZml4IG9mIGVkaXRvciBtb2RlbHM7IHN0cmlwcGluZyBpdCB5aWVsZHMgdGhlIElERSB3b3Jrc3BhY2UgcGF0aCAoL3dzL3Byb2ovLi4uKS4gKi9cbmNvbnN0IFZJUlRVQUxfRklMRV9QUkVGSVggPSAnZmlsZTovLy93b3Jrc3BhY2UnO1xuXG50eXBlIExzcFJhbmdlID0geyBzdGFydDogeyBsaW5lOiBudW1iZXI7IGNoYXJhY3RlcjogbnVtYmVyIH07IGVuZDogeyBsaW5lOiBudW1iZXI7IGNoYXJhY3RlcjogbnVtYmVyIH0gfTtcblxuLyoqIE1vbmFjbyBjb21wbGV0aW9uIGl0ZW0gY2FycnlpbmcgdGhlIG9yaWdpbmF0aW5nIExTUCBpdGVtIHNvIHJlc29sdmUgY2FuIGZldGNoIGl0cyBpbXBvcnQgZWRpdHMuICovXG50eXBlIE1vbmFjb0NvbXBsZXRpb25JdGVtID0gbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbSAmIHsgX2xzcD86IENvbXBsZXRpb25JdGVtIH07XG5cbmZ1bmN0aW9uIHRleHRFZGl0VG9Nb25hY28oZWRpdDogVGV4dEVkaXQpOiBtb25hY28ubGFuZ3VhZ2VzLlRleHRFZGl0IHtcbiAgICByZXR1cm4geyByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhlZGl0LnJhbmdlKSwgdGV4dDogZWRpdC5uZXdUZXh0IH07XG59XG5cbmZ1bmN0aW9uIG1vbmFjb1JhbmdlVG9Mc3AocjogbW9uYWNvLklSYW5nZSk6IExzcFJhbmdlIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBzdGFydDogeyBsaW5lOiByLnN0YXJ0TGluZU51bWJlciAtIDEsIGNoYXJhY3Rlcjogci5zdGFydENvbHVtbiAtIDEgfSxcbiAgICAgICAgZW5kOiAgIHsgbGluZTogci5lbmRMaW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiByLmVuZENvbHVtbiAtIDEgfSxcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBtb25hY29TZXZlcml0eVRvTHNwKHNldmVyaXR5OiBtb25hY28uTWFya2VyU2V2ZXJpdHkpOiBEaWFnbm9zdGljU2V2ZXJpdHkge1xuICAgIHN3aXRjaCAoc2V2ZXJpdHkpIHtcbiAgICAgICAgY2FzZSBtb25hY28uTWFya2VyU2V2ZXJpdHkuRXJyb3I6ICAgcmV0dXJuIERpYWdub3N0aWNTZXZlcml0eS5FcnJvcjtcbiAgICAgICAgY2FzZSBtb25hY28uTWFya2VyU2V2ZXJpdHkuV2FybmluZzogcmV0dXJuIERpYWdub3N0aWNTZXZlcml0eS5XYXJuaW5nO1xuICAgICAgICBjYXNlIG1vbmFjby5NYXJrZXJTZXZlcml0eS5JbmZvOiAgICByZXR1cm4gRGlhZ25vc3RpY1NldmVyaXR5LkluZm9ybWF0aW9uO1xuICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRGlhZ25vc3RpY1NldmVyaXR5LkhpbnQ7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBtYXJrZXJUb0xzcERpYWdub3N0aWMobTogbW9uYWNvLmVkaXRvci5JTWFya2VyRGF0YSk6IERpYWdub3N0aWMge1xuICAgIHJldHVybiB7XG4gICAgICAgIHJhbmdlOiAgICB7IHN0YXJ0OiB7IGxpbmU6IG0uc3RhcnRMaW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBtLnN0YXJ0Q29sdW1uIC0gMSB9LFxuICAgICAgICAgICAgICAgICAgICBlbmQ6ICAgeyBsaW5lOiBtLmVuZExpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IG0uZW5kQ29sdW1uIC0gMSB9IH0sXG4gICAgICAgIG1lc3NhZ2U6ICBtLm1lc3NhZ2UsXG4gICAgICAgIHNldmVyaXR5OiBtb25hY29TZXZlcml0eVRvTHNwKG0uc2V2ZXJpdHkpLFxuICAgICAgICBzb3VyY2U6ICAgbS5zb3VyY2UsXG4gICAgfSBhcyBEaWFnbm9zdGljO1xufVxuXG5mdW5jdGlvbiBsc3BDb2RlQWN0aW9uVG9Nb25hY28oYWN0aW9uOiBDb2RlQWN0aW9uIHwgQ29tbWFuZCk6IG1vbmFjby5sYW5ndWFnZXMuQ29kZUFjdGlvbiB7XG4gICAgY29uc3QgaXNDb21tYW5kID0gdHlwZW9mIChhY3Rpb24gYXMgQ29tbWFuZCkuY29tbWFuZCA9PT0gJ3N0cmluZyc7XG4gICAgY29uc3QgdGl0bGUgPSBhY3Rpb24udGl0bGVcbiAgICAgICAgPz8gKGlzQ29tbWFuZCA/IChhY3Rpb24gYXMgQ29tbWFuZCkuY29tbWFuZCA6IChhY3Rpb24gYXMgQ29kZUFjdGlvbikuY29tbWFuZD8udGl0bGUpXG4gICAgICAgID8/ICdBY3Rpb24nO1xuICAgIGNvbnN0IGtpbmQgPSBpc0NvbW1hbmQgPyAncXVpY2tmaXgnIDogKChhY3Rpb24gYXMgQ29kZUFjdGlvbikua2luZCA/PyAncXVpY2tmaXgnKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB0aXRsZSxcbiAgICAgICAga2luZCxcbiAgICAgICAgZGlhZ25vc3RpY3M6IFtdLFxuICAgICAgICBpc1ByZWZlcnJlZDogKGFjdGlvbiBhcyBDb2RlQWN0aW9uKS5pc1ByZWZlcnJlZCxcbiAgICAgICAgLy8gQXBwbHkgbGF6aWx5IHRocm91Z2ggb3VyIGNvbW1hbmQgc28gd2UgY2FuIHJlc29sdmUsIHJ1biBzZXJ2ZXIgY29tbWFuZHMgYW5kIGFwcGx5IGVkaXRzIHVuaWZvcm1seS5cbiAgICAgICAgY29tbWFuZDogeyBpZDogQVBQTFlfQUNUSU9OX0NPTU1BTkQsIHRpdGxlLCBhcmd1bWVudHM6IFthY3Rpb25dIH0sXG4gICAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gYXBwbHlDb2RlQWN0aW9uKGFjdGlvbjogQ29kZUFjdGlvbiB8IENvbW1hbmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIV9jb25uKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiAoYWN0aW9uIGFzIENvbW1hbmQpLmNvbW1hbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBhd2FpdCBydW5TZXJ2ZXJDb21tYW5kKGFjdGlvbiBhcyBDb21tYW5kKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzb2x2ZWQgPSBhY3Rpb24gYXMgQ29kZUFjdGlvbjtcbiAgICAgICAgaWYgKCFyZXNvbHZlZC5lZGl0ICYmIChyZXNvbHZlZCBhcyB7IGRhdGE/OiB1bmtub3duIH0pLmRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzb2x2ZWQgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgnY29kZUFjdGlvbi9yZXNvbHZlJywgcmVzb2x2ZWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXNvbHZlZC5lZGl0KSBhcHBseVdvcmtzcGFjZUVkaXQocmVzb2x2ZWQuZWRpdCk7XG4gICAgICAgIGlmIChyZXNvbHZlZC5jb21tYW5kKSBhd2FpdCBydW5TZXJ2ZXJDb21tYW5kKHJlc29sdmVkLmNvbW1hbmQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbamF2YS1sc3BdIGNvZGUgYWN0aW9uIGZhaWxlZDonLCAoZSBhcyBFcnJvcik/Lm1lc3NhZ2UgPz8gZSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBpc1dvcmtzcGFjZUVkaXQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBXb3Jrc3BhY2VFZGl0IHtcbiAgICByZXR1cm4gISF2YWx1ZSAmJiAoISEodmFsdWUgYXMgV29ya3NwYWNlRWRpdCkuY2hhbmdlcyB8fCAhISh2YWx1ZSBhcyBXb3Jrc3BhY2VFZGl0KS5kb2N1bWVudENoYW5nZXMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5TZXJ2ZXJDb21tYW5kKGNtZDogQ29tbWFuZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghX2Nvbm4gfHwgIWNtZD8uY29tbWFuZCkgcmV0dXJuO1xuICAgIGlmIChHRU5FUkFURVtjbWQuY29tbWFuZF0pIHtcbiAgICAgICAgYXdhaXQgcnVuR2VuZXJhdGUoY21kLmNvbW1hbmQsIGNtZC5hcmd1bWVudHMgPz8gW10pO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd3b3Jrc3BhY2UvZXhlY3V0ZUNvbW1hbmQnLCB7IGNvbW1hbmQ6IGNtZC5jb21tYW5kLCBhcmd1bWVudHM6IGNtZC5hcmd1bWVudHMgPz8gW10gfSk7XG4gICAgaWYgKGlzV29ya3NwYWNlRWRpdChyZXN1bHQpKSBhcHBseVdvcmtzcGFjZUVkaXQocmVzdWx0KTtcbn1cblxuaW50ZXJmYWNlIEdlbmVyYXRlU3BlYyB7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICBzdGF0dXM6IHN0cmluZztcbiAgICBnZW5lcmF0ZTogc3RyaW5nO1xuICAgIG1lbWJlcnM6IChzdGF0dXM6IGFueSkgPT4gQXJyYXk8eyBsYWJlbDogc3RyaW5nOyByZWY6IGFueSB9PjtcbiAgICBidWlsZEFyZ3M6IChwcm9tcHRBcmdzOiBhbnlbXSwgc3RhdHVzOiBhbnksIHNlbGVjdGVkOiBhbnlbXSkgPT4gYW55W107XG59XG5cbi8qKiBNZW1iZXItbmFtZWQgZmllbGRzIFx1MjE5MiBwaWNrZXIgbGFiZWxzLiAqL1xuZnVuY3Rpb24gZmllbGRMYWJlbChmOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSBmPy5uYW1lID8/IGY/LmZpZWxkTmFtZSA/PyAnJztcbiAgICBjb25zdCB0eXBlID0gZj8udHlwZSA/PyBmPy50eXBlTmFtZTtcbiAgICByZXR1cm4gdHlwZSA/IGAke25hbWV9OiAke3R5cGV9YCA6IGAke25hbWV9YDtcbn1cblxuLyoqXG4gKiBUaGUgSkRULkxTIHNvdXJjZS1nZW5lcmF0aW9uIGNvbW1hbmRzIChjb25zdHJ1Y3RvcnMsIGdldHRlcnMvc2V0dGVycywgdG9TdHJpbmcsIGhhc2hDb2RlL2VxdWFscykuXG4gKiBFYWNoIG1hcHMgdGhlIGNsaWVudCBcIipQcm9tcHRcIiBjb21tYW5kIHRvIHRoZSBzZXJ2ZXIgc3RhdHVzICsgZ2VuZXJhdGUgZGVsZWdhdGUgY29tbWFuZHM7IHRoZSBzdGF0dXNcbiAqIGNhbGwgeWllbGRzIHRoZSBjYW5kaWRhdGUgZmllbGRzIHNob3duIGluIHRoZSBtZW1iZXIgcGlja2VyLCB0aGUgZ2VuZXJhdGUgY2FsbCByZXR1cm5zIHRoZSBlZGl0LlxuICovXG5jb25zdCBHRU5FUkFURTogUmVjb3JkPHN0cmluZywgR2VuZXJhdGVTcGVjPiA9IHtcbiAgICAnamF2YS5hY3Rpb24uZ2VuZXJhdGVDb25zdHJ1Y3RvcnNQcm9tcHQnOiB7XG4gICAgICAgIGxhYmVsOiAnU2VsZWN0IGZpZWxkcyBhbmQgY29uc3RydWN0b3JzJyxcbiAgICAgICAgc3RhdHVzOiAnamF2YS5hY3Rpb24uY2hlY2tDb25zdHJ1Y3RvcnNTdGF0dXMnLFxuICAgICAgICBnZW5lcmF0ZTogJ2phdmEuYWN0aW9uLmdlbmVyYXRlQ29uc3RydWN0b3JzJyxcbiAgICAgICAgbWVtYmVyczogKHMpID0+IChzPy5maWVsZHMgPz8gW10pLm1hcCgoZjogYW55KSA9PiAoeyBsYWJlbDogZmllbGRMYWJlbChmKSwgcmVmOiBmIH0pKSxcbiAgICAgICAgYnVpbGRBcmdzOiAoYXJncywgcywgc2VsKSA9PiBbYXJnc1swXSwgeyBjb25zdHJ1Y3RvcnM6IHM/LmNvbnN0cnVjdG9ycyA/PyBbXSwgZmllbGRzOiBzZWwubWFwKG0gPT4gbS5yZWYpIH1dLFxuICAgIH0sXG4gICAgJ2phdmEuYWN0aW9uLmdlbmVyYXRlVG9TdHJpbmdQcm9tcHQnOiB7XG4gICAgICAgIGxhYmVsOiAnU2VsZWN0IGZpZWxkcyB0byBpbmNsdWRlIGluIHRvU3RyaW5nKCknLFxuICAgICAgICBzdGF0dXM6ICdqYXZhLmFjdGlvbi5jaGVja1RvU3RyaW5nU3RhdHVzJyxcbiAgICAgICAgZ2VuZXJhdGU6ICdqYXZhLmFjdGlvbi5nZW5lcmF0ZVRvU3RyaW5nJyxcbiAgICAgICAgbWVtYmVyczogKHMpID0+IChzPy5maWVsZHMgPz8gW10pLm1hcCgoZjogYW55KSA9PiAoeyBsYWJlbDogZmllbGRMYWJlbChmKSwgcmVmOiBmIH0pKSxcbiAgICAgICAgYnVpbGRBcmdzOiAoYXJncywgX3MsIHNlbCkgPT4gW2FyZ3NbMF0sIHNlbC5tYXAobSA9PiBtLnJlZildLFxuICAgIH0sXG4gICAgJ2phdmEuYWN0aW9uLmhhc2hDb2RlRXF1YWxzUHJvbXB0Jzoge1xuICAgICAgICBsYWJlbDogJ1NlbGVjdCBmaWVsZHMgZm9yIGhhc2hDb2RlKCkgYW5kIGVxdWFscygpJyxcbiAgICAgICAgc3RhdHVzOiAnamF2YS5hY3Rpb24uY2hlY2tIYXNoQ29kZUVxdWFsc1N0YXR1cycsXG4gICAgICAgIGdlbmVyYXRlOiAnamF2YS5hY3Rpb24uZ2VuZXJhdGVIYXNoQ29kZUVxdWFscycsXG4gICAgICAgIG1lbWJlcnM6IChzKSA9PiAocz8uZmllbGRzID8/IFtdKS5tYXAoKGY6IGFueSkgPT4gKHsgbGFiZWw6IGZpZWxkTGFiZWwoZiksIHJlZjogZiB9KSksXG4gICAgICAgIGJ1aWxkQXJnczogKGFyZ3MsIF9zLCBzZWwpID0+IFthcmdzWzBdLCBzZWwubWFwKG0gPT4gbS5yZWYpLCBmYWxzZV0sXG4gICAgfSxcbiAgICAnamF2YS5hY3Rpb24uZ2VuZXJhdGVBY2Nlc3NvcnNQcm9tcHQnOiB7XG4gICAgICAgIGxhYmVsOiAnU2VsZWN0IGZpZWxkcyB0byBnZW5lcmF0ZSBnZXR0ZXJzIGFuZCBzZXR0ZXJzJyxcbiAgICAgICAgc3RhdHVzOiAnamF2YS5hY3Rpb24uY2hlY2tBY2Nlc3NvcnNTdGF0dXMnLFxuICAgICAgICBnZW5lcmF0ZTogJ2phdmEuYWN0aW9uLmdlbmVyYXRlQWNjZXNzb3JzJyxcbiAgICAgICAgbWVtYmVyczogKHMpID0+IChzPy5hY2Nlc3NvcnMgPz8gcyA/PyBbXSkubWFwKChhOiBhbnkpID0+ICh7IGxhYmVsOiBmaWVsZExhYmVsKGEpLCByZWY6IGEgfSkpLFxuICAgICAgICBidWlsZEFyZ3M6IChhcmdzLCBfcywgc2VsKSA9PiBbYXJnc1swXSwgc2VsLm1hcChtID0+IG0ucmVmKV0sXG4gICAgfSxcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1bkdlbmVyYXRlKHByb21wdElkOiBzdHJpbmcsIGFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFfY29ubikgcmV0dXJuO1xuICAgIGNvbnN0IHNwZWMgPSBHRU5FUkFURVtwcm9tcHRJZF07XG4gICAgY29uc3Qgc3RhdHVzID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3dvcmtzcGFjZS9leGVjdXRlQ29tbWFuZCcsIHsgY29tbWFuZDogc3BlYy5zdGF0dXMsIGFyZ3VtZW50czogYXJncyB9KTtcbiAgICBpZiAoIXN0YXR1cykgcmV0dXJuO1xuICAgIGNvbnN0IG1lbWJlcnMgPSBzcGVjLm1lbWJlcnMoc3RhdHVzKTtcbiAgICBsZXQgc2VsZWN0ZWQgPSBtZW1iZXJzO1xuICAgIGNvbnN0IHBpY2tlciA9IChnbG9iYWxUaGlzIGFzIGFueSkuamF2YUxzcE1lbWJlclBpY2tlcjtcbiAgICBpZiAobWVtYmVycy5sZW5ndGggJiYgdHlwZW9mIHBpY2tlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjb25zdCBjaG9zZW46IHN0cmluZ1tdIHwgbnVsbCA9IGF3YWl0IHBpY2tlcihzcGVjLmxhYmVsLCBtZW1iZXJzLm1hcChtID0+IG0ubGFiZWwpKTtcbiAgICAgICAgaWYgKGNob3NlbiA9PT0gbnVsbCkgcmV0dXJuOyAvLyB1c2VyIGNhbmNlbGxlZCB0aGUgZGlhbG9nXG4gICAgICAgIHNlbGVjdGVkID0gbWVtYmVycy5maWx0ZXIobSA9PiBjaG9zZW4uaW5jbHVkZXMobS5sYWJlbCkpO1xuICAgIH1cbiAgICBjb25zdCBlZGl0ID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3dvcmtzcGFjZS9leGVjdXRlQ29tbWFuZCcsIHtcbiAgICAgICAgY29tbWFuZDogc3BlYy5nZW5lcmF0ZSxcbiAgICAgICAgYXJndW1lbnRzOiBzcGVjLmJ1aWxkQXJncyhhcmdzLCBzdGF0dXMsIHNlbGVjdGVkKSxcbiAgICB9KTtcbiAgICBpZiAoaXNXb3Jrc3BhY2VFZGl0KGVkaXQpKSBhcHBseVdvcmtzcGFjZUVkaXQoZWRpdCk7XG59XG5cbi8qKiBHcm91cHMgYSB3b3Jrc3BhY2UgZWRpdCdzIHRleHQgZWRpdHMgYnkgZG9jdW1lbnQgYW5kIGFwcGxpZXMgdGhlbSBpbiBwbGFjZSB0byBvcGVuIE1vbmFjbyBtb2RlbHMuICovXG5mdW5jdGlvbiBhcHBseVdvcmtzcGFjZUVkaXQoZWRpdDogV29ya3NwYWNlRWRpdCB8IG51bGwgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBpZiAoIWVkaXQpIHJldHVybjtcbiAgICBjb25zdCBieVVyaTogUmVjb3JkPHN0cmluZywgVGV4dEVkaXRbXT4gPSB7fTtcbiAgICBpZiAoZWRpdC5jaGFuZ2VzKSB7XG4gICAgICAgIGZvciAoY29uc3QgdXJpIGluIGVkaXQuY2hhbmdlcykgYnlVcmlbdXJpXSA9IChieVVyaVt1cmldID8/IFtdKS5jb25jYXQoZWRpdC5jaGFuZ2VzW3VyaV0pO1xuICAgIH1cbiAgICBpZiAoZWRpdC5kb2N1bWVudENoYW5nZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBkYyBvZiBlZGl0LmRvY3VtZW50Q2hhbmdlcyBhcyBhbnlbXSkge1xuICAgICAgICAgICAgaWYgKGRjPy50ZXh0RG9jdW1lbnQ/LnVyaSAmJiBBcnJheS5pc0FycmF5KGRjLmVkaXRzKSkge1xuICAgICAgICAgICAgICAgIGJ5VXJpW2RjLnRleHREb2N1bWVudC51cmldID0gKGJ5VXJpW2RjLnRleHREb2N1bWVudC51cmldID8/IFtdKS5jb25jYXQoZGMuZWRpdHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgdXJpIGluIGJ5VXJpKSB7XG4gICAgICAgIGNvbnN0IG1vZGVsID0gbW9uYWNvLmVkaXRvci5nZXRNb2RlbHMoKS5maW5kKG0gPT4gbS51cmkudG9TdHJpbmcoKSA9PT0gdXJpKTtcbiAgICAgICAgaWYgKCFtb2RlbCkgY29udGludWU7XG4gICAgICAgIGNvbnN0IG9wcyA9IGJ5VXJpW3VyaV0ubWFwKGUgPT4gKHsgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28oZS5yYW5nZSksIHRleHQ6IGUubmV3VGV4dCwgZm9yY2VNb3ZlTWFya2VyczogdHJ1ZSB9KSk7XG4gICAgICAgIG1vZGVsLnB1c2hFZGl0T3BlcmF0aW9ucyhbXSwgb3BzLCAoKSA9PiBudWxsKTtcbiAgICB9XG59XG5cbi8qKiBDb252ZXJ0cyBhbiBMU1Agd29ya3NwYWNlIGVkaXQgaW50byB0aGUgTW9uYWNvIHNoYXBlIHJldHVybmVkIGJ5IHRoZSByZW5hbWUgcHJvdmlkZXIuICovXG5mdW5jdGlvbiB3b3Jrc3BhY2VFZGl0VG9Nb25hY28oZWRpdDogV29ya3NwYWNlRWRpdCB8IG51bGwpOiBtb25hY28ubGFuZ3VhZ2VzLldvcmtzcGFjZUVkaXQge1xuICAgIGNvbnN0IGVkaXRzOiBhbnlbXSA9IFtdO1xuICAgIGNvbnN0IHB1c2ggPSAodXJpOiBzdHJpbmcsIGxpc3Q6IFRleHRFZGl0W10pID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBlIG9mIGxpc3QpIHtcbiAgICAgICAgICAgIGVkaXRzLnB1c2goeyByZXNvdXJjZTogbW9uYWNvLlVyaS5wYXJzZSh1cmkpLCB0ZXh0RWRpdDogeyByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhlLnJhbmdlKSwgdGV4dDogZS5uZXdUZXh0IH0sIHZlcnNpb25JZDogdW5kZWZpbmVkIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBpZiAoZWRpdD8uY2hhbmdlcykge1xuICAgICAgICBmb3IgKGNvbnN0IHVyaSBpbiBlZGl0LmNoYW5nZXMpIHB1c2godXJpLCBlZGl0LmNoYW5nZXNbdXJpXSk7XG4gICAgfVxuICAgIGlmIChlZGl0Py5kb2N1bWVudENoYW5nZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBkYyBvZiBlZGl0LmRvY3VtZW50Q2hhbmdlcyBhcyBhbnlbXSkge1xuICAgICAgICAgICAgaWYgKGRjPy50ZXh0RG9jdW1lbnQ/LnVyaSAmJiBBcnJheS5pc0FycmF5KGRjLmVkaXRzKSkgcHVzaChkYy50ZXh0RG9jdW1lbnQudXJpLCBkYy5lZGl0cyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgZWRpdHMgfTtcbn1cblxuLyoqIE1hcHMgYSB2aXJ0dWFsIGVkaXRvciBVUkkgYmFjayB0byB0aGUgSURFIHdvcmtzcGFjZSBwYXRoICh7QGNvZGUgL3dzL3Byb2ovLi4ufSkuICovXG5mdW5jdGlvbiB1cmlUb1dvcmtzcGFjZVBhdGgodXJpOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoIXVyaS5zdGFydHNXaXRoKFZJUlRVQUxfRklMRV9QUkVGSVgpKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHVyaS5zdWJzdHJpbmcoVklSVFVBTF9GSUxFX1BSRUZJWC5sZW5ndGgpKTtcbn1cblxuLyoqIFJlYWRzIGEgd29ya3NwYWNlIGZpbGUncyBjdXJyZW50IHRleHQgb3ZlciB0aGUgSURFIFJFU1QgQVBJLiAqL1xuYXN5bmMgZnVuY3Rpb24gZmV0Y2hXb3Jrc3BhY2VGaWxlVGV4dChpZGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9zZXJ2aWNlcy9pZGUvd29ya3NwYWNlcycgKyBpZGVQYXRoLCB7IGhlYWRlcnM6IHsgJ1gtUmVxdWVzdGVkLVdpdGgnOiAnRmV0Y2gnIH0gfSk7XG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCByZWFkICR7aWRlUGF0aH0gKEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9KWApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzcG9uc2UudGV4dCgpO1xufVxuXG4vKiogQXBwbGllcyBMU1AgdGV4dCBlZGl0cyB0byBhIHN0cmluZy4gT2Zmc2V0cyBhcmUgcmVzb2x2ZWQgYWdhaW5zdCB0aGUgb3JpZ2luYWwgdGV4dCBhbmQgZWRpdHMgYXJlXG4gKiAgYXBwbGllZCBmcm9tIHRoZSBlbmQgYmFja3dhcmRzLCBzbyBlYXJsaWVyIG9mZnNldHMgc3RheSB2YWxpZC4gKi9cbmZ1bmN0aW9uIGFwcGx5RWRpdHNUb1RleHQodGV4dDogc3RyaW5nLCBlZGl0czogVGV4dEVkaXRbXSk6IHN0cmluZyB7XG4gICAgY29uc3QgbGluZVN0YXJ0cyA9IFswXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHRleHQuY2hhckNvZGVBdChpKSA9PT0gMTAgLyogXFxuICovKSBsaW5lU3RhcnRzLnB1c2goaSArIDEpO1xuICAgIH1cbiAgICBjb25zdCBvZmZzZXQgPSAocDogeyBsaW5lOiBudW1iZXI7IGNoYXJhY3RlcjogbnVtYmVyIH0pID0+IChsaW5lU3RhcnRzW3AubGluZV0gPz8gdGV4dC5sZW5ndGgpICsgcC5jaGFyYWN0ZXI7XG4gICAgY29uc3Qgb3JkZXJlZCA9IGVkaXRzLnNsaWNlKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gb2Zmc2V0KGIucmFuZ2Uuc3RhcnQpIC0gb2Zmc2V0KGEucmFuZ2Uuc3RhcnQpKTtcbiAgICBsZXQgcmVzdWx0ID0gdGV4dDtcbiAgICBmb3IgKGNvbnN0IGUgb2Ygb3JkZXJlZCkge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQuc2xpY2UoMCwgb2Zmc2V0KGUucmFuZ2Uuc3RhcnQpKSArIGUubmV3VGV4dCArIHJlc3VsdC5zbGljZShvZmZzZXQoZS5yYW5nZS5lbmQpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBBcHBsaWVzIGEgSkRULkxTIHJlbmFtZSB7QGxpbmsgV29ya3NwYWNlRWRpdH0gYWNyb3NzIHRoZSB3aG9sZSB3b3Jrc3BhY2U6IHRleHQgZWRpdHMgaW4gZXZlcnlcbiAqIGFmZmVjdGVkIGZpbGUgcGx1cyBhbnkge0Bjb2RlIFJlbmFtZUZpbGV9IG9wZXJhdGlvbiAoYSBwdWJsaWMtdHlwZSByZW5hbWUgcmVuYW1lcyBpdHMgb3duXG4gKiB7QGNvZGUgLmphdmF9IGZpbGUpLiBUaGUgY3VycmVudCBmaWxlJ3MgZWRpdHMgZ28gdGhyb3VnaCB0aGUgbGl2ZSBNb25hY28gbW9kZWw7IHRoZSByZXN0IGFyZSByZWFkLFxuICogZWRpdGVkIGFuZCB3cml0dGVuIGJhY2sgb3ZlciBSRVNULiBQZXJzaXN0ZW5jZSAoQ1NSRi1ndWFyZGVkIHdyaXRlcywgdGhlIHRhYiBzd2l0Y2ggd2hlbiB0aGUgY3VycmVudFxuICogZmlsZSBpcyByZW5hbWVkLCBhbmQgcmVsb2FkaW5nIG90aGVyIG9wZW4gZWRpdG9ycykgaXMgZGVsZWdhdGVkIHRvIHRoZSBJREUgdmlhIGphdmFMc3BQZXJzaXN0UmVuYW1lLlxuICovXG5hc3luYyBmdW5jdGlvbiBhcHBseVJlbmFtZUFjcm9zc1dvcmtzcGFjZShtb2RlbDogbW9uYWNvLmVkaXRvci5JVGV4dE1vZGVsLCBlZGl0OiBXb3Jrc3BhY2VFZGl0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY3VycmVudFVyaSA9IG1vZGVsLnVyaS50b1N0cmluZygpO1xuICAgIGNvbnN0IHRleHRCeVVyaTogUmVjb3JkPHN0cmluZywgVGV4dEVkaXRbXT4gPSB7fTtcbiAgICBjb25zdCByZW5hbWVCeVVyaTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gICAgaWYgKGVkaXQuY2hhbmdlcykge1xuICAgICAgICBmb3IgKGNvbnN0IHVyaSBpbiBlZGl0LmNoYW5nZXMpIHRleHRCeVVyaVt1cmldID0gKHRleHRCeVVyaVt1cmldID8/IFtdKS5jb25jYXQoZWRpdC5jaGFuZ2VzW3VyaV0pO1xuICAgIH1cbiAgICBpZiAoZWRpdC5kb2N1bWVudENoYW5nZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBkYyBvZiBlZGl0LmRvY3VtZW50Q2hhbmdlcyBhcyBhbnlbXSkge1xuICAgICAgICAgICAgaWYgKGRjPy5raW5kID09PSAncmVuYW1lJyAmJiBkYy5vbGRVcmkgJiYgZGMubmV3VXJpKSB7XG4gICAgICAgICAgICAgICAgcmVuYW1lQnlVcmlbZGMub2xkVXJpXSA9IGRjLm5ld1VyaTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGM/LnRleHREb2N1bWVudD8udXJpICYmIEFycmF5LmlzQXJyYXkoZGMuZWRpdHMpKSB7XG4gICAgICAgICAgICAgICAgdGV4dEJ5VXJpW2RjLnRleHREb2N1bWVudC51cmldID0gKHRleHRCeVVyaVtkYy50ZXh0RG9jdW1lbnQudXJpXSA/PyBbXSkuY29uY2F0KGRjLmVkaXRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHBheWxvYWQ6IHtcbiAgICAgICAgY3VycmVudFBhdGg6IHN0cmluZyB8IG51bGw7XG4gICAgICAgIGN1cnJlbnRDb250ZW50OiBzdHJpbmcgfCBudWxsO1xuICAgICAgICBjdXJyZW50TmV3UGF0aDogc3RyaW5nIHwgbnVsbDtcbiAgICAgICAgd3JpdGVzOiBBcnJheTx7IHBhdGg6IHN0cmluZyB8IG51bGw7IGNvbnRlbnQ6IHN0cmluZyB9PjtcbiAgICAgICAgcmVuYW1lczogQXJyYXk8eyBvbGRQYXRoOiBzdHJpbmcgfCBudWxsOyBuZXdQYXRoOiBzdHJpbmcgfCBudWxsOyBjb250ZW50OiBzdHJpbmcgfT47XG4gICAgfSA9IHsgY3VycmVudFBhdGg6IHVyaVRvV29ya3NwYWNlUGF0aChjdXJyZW50VXJpKSwgY3VycmVudENvbnRlbnQ6IG51bGwsIGN1cnJlbnROZXdQYXRoOiBudWxsLCB3cml0ZXM6IFtdLCByZW5hbWVzOiBbXSB9O1xuXG4gICAgY29uc3QgdXJpcyA9IG5ldyBTZXQ8c3RyaW5nPihbLi4uT2JqZWN0LmtleXModGV4dEJ5VXJpKSwgLi4uT2JqZWN0LmtleXMocmVuYW1lQnlVcmkpXSk7XG4gICAgZm9yIChjb25zdCB1cmkgb2YgdXJpcykge1xuICAgICAgICBjb25zdCBlZGl0cyA9IHRleHRCeVVyaVt1cmldID8/IFtdO1xuICAgICAgICBsZXQgY29udGVudDogc3RyaW5nO1xuICAgICAgICBpZiAodXJpID09PSBjdXJyZW50VXJpKSB7XG4gICAgICAgICAgICBpZiAoZWRpdHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbW9kZWwucHVzaEVkaXRPcGVyYXRpb25zKFtdLCBlZGl0cy5tYXAoZSA9PiAoeyByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhlLnJhbmdlKSwgdGV4dDogZS5uZXdUZXh0LCBmb3JjZU1vdmVNYXJrZXJzOiB0cnVlIH0pKSwgKCkgPT4gbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250ZW50ID0gbW9kZWwuZ2V0VmFsdWUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IGF3YWl0IGZldGNoV29ya3NwYWNlRmlsZVRleHQodXJpVG9Xb3Jrc3BhY2VQYXRoKHVyaSkgPz8gdXJpKTtcbiAgICAgICAgICAgIGNvbnRlbnQgPSBlZGl0cy5sZW5ndGggPyBhcHBseUVkaXRzVG9UZXh0KHNvdXJjZSwgZWRpdHMpIDogc291cmNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld1VyaSA9IHJlbmFtZUJ5VXJpW3VyaV07XG4gICAgICAgIGlmICh1cmkgPT09IGN1cnJlbnRVcmkpIHtcbiAgICAgICAgICAgIHBheWxvYWQuY3VycmVudENvbnRlbnQgPSBjb250ZW50O1xuICAgICAgICAgICAgcGF5bG9hZC5jdXJyZW50TmV3UGF0aCA9IG5ld1VyaSA/IHVyaVRvV29ya3NwYWNlUGF0aChuZXdVcmkpIDogbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmIChuZXdVcmkpIHtcbiAgICAgICAgICAgIHBheWxvYWQucmVuYW1lcy5wdXNoKHsgb2xkUGF0aDogdXJpVG9Xb3Jrc3BhY2VQYXRoKHVyaSksIG5ld1BhdGg6IHVyaVRvV29ya3NwYWNlUGF0aChuZXdVcmkpLCBjb250ZW50IH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGF5bG9hZC53cml0ZXMucHVzaCh7IHBhdGg6IHVyaVRvV29ya3NwYWNlUGF0aCh1cmkpLCBjb250ZW50IH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgKGdsb2JhbFRoaXMgYXMgYW55KS5qYXZhTHNwUGVyc2lzdFJlbmFtZShwYXlsb2FkKTtcbn1cblxuZnVuY3Rpb24gamR0bHNTZXR0aW5ncygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBqYXZhOiB7XG4gICAgICAgICAgICBpbXBvcnQ6IHtcbiAgICAgICAgICAgICAgICBtYXZlbjogICAgICB7IGVuYWJsZWQ6IHRydWUgfSxcbiAgICAgICAgICAgICAgICBncmFkbGU6ICAgICB7IGVuYWJsZWQ6IGZhbHNlIH0sXG4gICAgICAgICAgICAgICAgZXhjbHVzaW9uczogWycqKi9ub2RlX21vZHVsZXMvKionLCAnKiovLm1ldGFkYXRhLyoqJywgJyoqL2FyY2hldHlwZS1yZXNvdXJjZXMvKionXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhdXRvYnVpbGQ6IHsgZW5hYmxlZDogdHJ1ZSB9LFxuICAgICAgICAgICAgY29tcGxldGlvbjoge1xuICAgICAgICAgICAgICAgIG92ZXJ3cml0ZTogICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgIGd1ZXNzTWV0aG9kQXJndW1lbnRzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBmaWx0ZXJlZFR5cGVzOiBbXG4gICAgICAgICAgICAgICAgICAgICdjb20uc3VuLionLCAnc3VuLionLCAnamRrLionLFxuICAgICAgICAgICAgICAgICAgICAnb3JnLmVjbGlwc2UuamR0LmludGVybmFsLionLFxuICAgICAgICAgICAgICAgICAgICAnb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC4qJyxcbiAgICAgICAgICAgICAgICAgICAgJ29yZy5lY2xpcHNlLm9zZ2kuaW50ZXJuYWwuKicsXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBpbXBvcnRPcmRlcjogWydqYXZhJywgJ2phdmF4JywgJ29yZycsICdjb20nLCAnJ10sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2lnbmF0dXJlSGVscDogIHsgZW5hYmxlZDogdHJ1ZSB9LFxuICAgICAgICAgICAgZm9ybWF0OiAgICAgICAgIHsgZW5hYmxlZDogdHJ1ZSB9LFxuICAgICAgICAgICAgc2F2ZUFjdGlvbnM6ICAgIHsgb3JnYW5pemVJbXBvcnRzOiBmYWxzZSB9LFxuICAgICAgICB9LFxuICAgIH07XG59XG4iLCAiLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgMjAyNCBUeXBlRm94IGFuZCBvdGhlcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMSUNFTlNFIGluIHRoZSBwYWNrYWdlIHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuaW1wb3J0IHsgRGlzcG9zYWJsZSB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcblxuZXhwb3J0IGNsYXNzIERpc3Bvc2FibGVDb2xsZWN0aW9uIGltcGxlbWVudHMgRGlzcG9zYWJsZSB7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGRpc3Bvc2FibGVzOiBEaXNwb3NhYmxlW10gPSBbXTtcblxuICAgIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgICAgIHdoaWxlICh0aGlzLmRpc3Bvc2FibGVzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgdGhpcy5kaXNwb3NhYmxlcy5wb3AoKSEuZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVzaChkaXNwb3NhYmxlOiBEaXNwb3NhYmxlKTogRGlzcG9zYWJsZSB7XG4gICAgICAgIGNvbnN0IGRpc3Bvc2FibGVzID0gdGhpcy5kaXNwb3NhYmxlcztcbiAgICAgICAgZGlzcG9zYWJsZXMucHVzaChkaXNwb3NhYmxlKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBkaXNwb3NhYmxlcy5pbmRleE9mKGRpc3Bvc2FibGUpO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgZGlzcG9zYWJsZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxufVxuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjQgVHlwZUZveCBhbmQgb3RoZXJzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTElDRU5TRSBpbiB0aGUgcGFja2FnZSByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbmltcG9ydCB7IERpc3Bvc2FibGUgfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG5pbXBvcnQgdHlwZSB7IElDb25uZWN0aW9uIH0gZnJvbSAnLi4vc2VydmVyL2Nvbm5lY3Rpb24uanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElXZWJTb2NrZXQgZXh0ZW5kcyBEaXNwb3NhYmxlIHtcbiAgICBzZW5kKGNvbnRlbnQ6IHN0cmluZyk6IHZvaWQ7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBvbk1lc3NhZ2UoY2I6IChkYXRhOiBhbnkpID0+IHZvaWQpOiB2b2lkO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgb25FcnJvcihjYjogKHJlYXNvbjogYW55KSA9PiB2b2lkKTogdm9pZDtcbiAgICBvbkNsb3NlKGNiOiAoY29kZTogbnVtYmVyLCByZWFzb246IHN0cmluZykgPT4gdm9pZCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVdlYlNvY2tldENvbm5lY3Rpb24gZXh0ZW5kcyBJQ29ubmVjdGlvbiB7XG4gICAgcmVhZG9ubHkgc29ja2V0OiBJV2ViU29ja2V0O1xufVxuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjQgVHlwZUZveCBhbmQgb3RoZXJzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTElDRU5TRSBpbiB0aGUgcGFja2FnZSByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbmltcG9ydCB7IERpc3Bvc2FibGUgfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG4vLyBUT0RPOiBVc2UgZW52aXJvbm1lbnQtc3BlY2lmaWMgaW1wb3J0cyAodnNjb2RlLWpzb25ycGMvYnJvd3NlciBvciB2c2NvZGUtanNvbnJwYy9ub2RlKVxuLy8gd2hlbiB1cGdyYWRpbmcgdG8gdnNjb2RlLWpzb25ycGNAOS54LngtbmV4dC5YIHdoaWNoIHN1cHBvcnRzIHByb3BlciBleHBvcnQgbWFwc1xuaW1wb3J0IHsgdHlwZSBEYXRhQ2FsbGJhY2ssIEFic3RyYWN0TWVzc2FnZVJlYWRlciwgTWVzc2FnZVJlYWRlciB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcbmltcG9ydCB0eXBlIHsgSVdlYlNvY2tldCB9IGZyb20gJy4vc29ja2V0LmpzJztcblxuZXhwb3J0IGNsYXNzIFdlYlNvY2tldE1lc3NhZ2VSZWFkZXIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VSZWFkZXIgaW1wbGVtZW50cyBNZXNzYWdlUmVhZGVyIHtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgc29ja2V0OiBJV2ViU29ja2V0O1xuICAgIHByb3RlY3RlZCBzdGF0ZTogJ2luaXRpYWwnIHwgJ2xpc3RlbmluZycgfCAnY2xvc2VkJyA9ICdpbml0aWFsJztcbiAgICBwcm90ZWN0ZWQgY2FsbGJhY2s6IERhdGFDYWxsYmFjayB8IHVuZGVmaW5lZDtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHByb3RlY3RlZCByZWFkb25seSBldmVudHM6IEFycmF5PHsgbWVzc2FnZT86IGFueSwgZXJyb3I/OiBhbnkgfT4gPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKHNvY2tldDogSVdlYlNvY2tldCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnNvY2tldCA9IHNvY2tldDtcbiAgICAgICAgdGhpcy5zb2NrZXQub25NZXNzYWdlKG1lc3NhZ2UgPT5cbiAgICAgICAgICAgIHRoaXMucmVhZE1lc3NhZ2UobWVzc2FnZSlcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zb2NrZXQub25FcnJvcihlcnJvciA9PlxuICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc29ja2V0Lm9uQ2xvc2UoKGNvZGUsIHJlYXNvbikgPT4ge1xuICAgICAgICAgICAgaWYgKGNvZGUgIT09IDEwMDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvcjogRXJyb3IgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICcnICsgY29kZSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYEVycm9yIGR1cmluZyBzb2NrZXQgcmVjb25uZWN0OiBjb2RlID0gJHtjb2RlfSwgcmVhc29uID0gJHtyZWFzb259YFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5maXJlQ2xvc2UoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbGlzdGVuKGNhbGxiYWNrOiBEYXRhQ2FsbGJhY2spOiBEaXNwb3NhYmxlIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09ICdpbml0aWFsJykge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9ICdsaXN0ZW5pbmcnO1xuICAgICAgICAgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgICAgICAgd2hpbGUgKHRoaXMuZXZlbnRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gdGhpcy5ldmVudHMucG9wKCkhO1xuICAgICAgICAgICAgICAgIGlmIChldmVudC5tZXNzYWdlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWFkTWVzc2FnZShldmVudC5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXZlbnQuZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZUNsb3NlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkaXNwb3NlOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2FsbGJhY2sgPT09IGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSAnaW5pdGlhbCc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsbGJhY2sgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIG92ZXJyaWRlIGRpc3Bvc2UoKSB7XG4gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9ICdpbml0aWFsJztcbiAgICAgICAgdGhpcy5jYWxsYmFjayA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5ldmVudHMuc3BsaWNlKDAsIHRoaXMuZXZlbnRzLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBwcm90ZWN0ZWQgcmVhZE1lc3NhZ2UobWVzc2FnZTogYW55KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09PSAnaW5pdGlhbCcpIHtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRzLnNwbGljZSgwLCAwLCB7IG1lc3NhZ2UgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZSA9PT0gJ2xpc3RlbmluZycpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjayEoZGF0YSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvcjogRXJyb3IgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICcnICsgNDAwLFxuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgRXJyb3IgZHVyaW5nIG1lc3NhZ2UgcGFyc2luZywgcmVhc29uID0gJHt0eXBlb2YgZXJyID09PSAnb2JqZWN0JyA/IChlcnIgYXMgYW55KS5tZXNzYWdlIDogJ3Vua25vd24nfWBcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIGZpcmVFcnJvcihlcnJvcjogYW55KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09PSAnaW5pdGlhbCcpIHtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRzLnNwbGljZSgwLCAwLCB7IGVycm9yIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUgPT09ICdsaXN0ZW5pbmcnKSB7XG4gICAgICAgICAgICBzdXBlci5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIGZpcmVDbG9zZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09ICdpbml0aWFsJykge1xuICAgICAgICAgICAgdGhpcy5ldmVudHMuc3BsaWNlKDAsIDAsIHt9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlID09PSAnbGlzdGVuaW5nJykge1xuICAgICAgICAgICAgc3VwZXIuZmlyZUNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGF0ZSA9ICdjbG9zZWQnO1xuICAgIH1cbn1cbiIsICIvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSAyMDI0IFR5cGVGb3ggYW5kIG90aGVycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExJQ0VOU0UgaW4gdGhlIHBhY2thZ2Ugcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5pbXBvcnQgeyBNZXNzYWdlIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuaW1wb3J0IHsgQWJzdHJhY3RNZXNzYWdlV3JpdGVyLCBNZXNzYWdlV3JpdGVyIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuaW1wb3J0IHR5cGUgeyBJV2ViU29ja2V0IH0gZnJvbSAnLi9zb2NrZXQuanMnO1xuXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0TWVzc2FnZVdyaXRlciBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVdyaXRlciBpbXBsZW1lbnRzIE1lc3NhZ2VXcml0ZXIge1xuICAgIHByb3RlY3RlZCBlcnJvckNvdW50ID0gMDtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgc29ja2V0OiBJV2ViU29ja2V0O1xuXG4gICAgY29uc3RydWN0b3Ioc29ja2V0OiBJV2ViU29ja2V0KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuc29ja2V0ID0gc29ja2V0O1xuICAgIH1cblxuICAgIGVuZCgpOiB2b2lkIHtcbiAgICB9XG5cbiAgICBhc3luYyB3cml0ZShtc2c6IE1lc3NhZ2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShtc2cpO1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChjb250ZW50KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5lcnJvckNvdW50Kys7XG4gICAgICAgICAgICB0aGlzLmZpcmVFcnJvcihlLCBtc2csIHRoaXMuZXJyb3JDb3VudCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgMjAyNCBUeXBlRm94IGFuZCBvdGhlcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMSUNFTlNFIGluIHRoZSBwYWNrYWdlIHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuaW1wb3J0IHR5cGUgeyBNZXNzYWdlQ29ubmVjdGlvbiwgTG9nZ2VyIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuaW1wb3J0IHsgY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24gfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG5pbXBvcnQgdHlwZSB7IElXZWJTb2NrZXQgfSBmcm9tICcuL3NvY2tldC5qcyc7XG5pbXBvcnQgeyBXZWJTb2NrZXRNZXNzYWdlUmVhZGVyIH0gZnJvbSAnLi9yZWFkZXIuanMnO1xuaW1wb3J0IHsgV2ViU29ja2V0TWVzc2FnZVdyaXRlciB9IGZyb20gJy4vd3JpdGVyLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdlYlNvY2tldENvbm5lY3Rpb24oc29ja2V0OiBJV2ViU29ja2V0LCBsb2dnZXI6IExvZ2dlcik6IE1lc3NhZ2VDb25uZWN0aW9uIHtcbiAgICBjb25zdCBtZXNzYWdlUmVhZGVyID0gbmV3IFdlYlNvY2tldE1lc3NhZ2VSZWFkZXIoc29ja2V0KTtcbiAgICBjb25zdCBtZXNzYWdlV3JpdGVyID0gbmV3IFdlYlNvY2tldE1lc3NhZ2VXcml0ZXIoc29ja2V0KTtcbiAgICBjb25zdCBjb25uZWN0aW9uID0gY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24obWVzc2FnZVJlYWRlciwgbWVzc2FnZVdyaXRlciwgbG9nZ2VyKTtcbiAgICBjb25uZWN0aW9uLm9uQ2xvc2UoKCkgPT4gY29ubmVjdGlvbi5kaXNwb3NlKCkpO1xuICAgIHJldHVybiBjb25uZWN0aW9uO1xufVxuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjQgVHlwZUZveCBhbmQgb3RoZXJzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTElDRU5TRSBpbiB0aGUgcGFja2FnZSByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbmltcG9ydCB0eXBlIHsgTWVzc2FnZUNvbm5lY3Rpb24sIExvZ2dlciB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcbmltcG9ydCB7IGNyZWF0ZVdlYlNvY2tldENvbm5lY3Rpb24gfSBmcm9tICcuL3NvY2tldC9jb25uZWN0aW9uLmpzJztcbmltcG9ydCB0eXBlIHsgSVdlYlNvY2tldCB9IGZyb20gJy4vc29ja2V0L3NvY2tldC5qcyc7XG5pbXBvcnQgeyBDb25zb2xlTG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gbGlzdGVuKG9wdGlvbnM6IHtcbiAgICB3ZWJTb2NrZXQ6IFdlYlNvY2tldDtcbiAgICBsb2dnZXI/OiBMb2dnZXI7XG4gICAgb25Db25uZWN0aW9uOiAoY29ubmVjdGlvbjogTWVzc2FnZUNvbm5lY3Rpb24pID0+IHZvaWQ7XG59KSB7XG4gICAgY29uc3QgeyB3ZWJTb2NrZXQsIG9uQ29ubmVjdGlvbiB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBsb2dnZXIgPSBvcHRpb25zLmxvZ2dlciB8fCBuZXcgQ29uc29sZUxvZ2dlcigpO1xuICAgIHdlYlNvY2tldC5vbm9wZW4gPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNvY2tldCA9IHRvU29ja2V0KHdlYlNvY2tldCk7XG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBjcmVhdGVXZWJTb2NrZXRDb25uZWN0aW9uKHNvY2tldCwgbG9nZ2VyKTtcbiAgICAgICAgb25Db25uZWN0aW9uKGNvbm5lY3Rpb24pO1xuICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1NvY2tldCh3ZWJTb2NrZXQ6IFdlYlNvY2tldCk6IElXZWJTb2NrZXQge1xuICAgIHJldHVybiB7XG4gICAgICAgIHNlbmQ6IGNvbnRlbnQgPT4gd2ViU29ja2V0LnNlbmQoY29udGVudCksXG4gICAgICAgIG9uTWVzc2FnZTogY2IgPT4ge1xuICAgICAgICAgICAgd2ViU29ja2V0Lm9ubWVzc2FnZSA9IGV2ZW50ID0+IGNiKGV2ZW50LmRhdGEpO1xuICAgICAgICB9LFxuICAgICAgICBvbkVycm9yOiBjYiA9PiB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgd2ViU29ja2V0Lm9uZXJyb3IgPSAoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3QuaGFzT3duKGV2ZW50LCAnbWVzc2FnZScpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNiKGV2ZW50Lm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIG9uQ2xvc2U6IGNiID0+IHtcbiAgICAgICAgICAgIHdlYlNvY2tldC5vbmNsb3NlID0gZXZlbnQgPT4gY2IoZXZlbnQuY29kZSwgZXZlbnQucmVhc29uKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGlzcG9zZTogKCkgPT4gd2ViU29ja2V0LmNsb3NlKClcbiAgICB9O1xufVxuIiwgIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAyNiBFY2xpcHNlIERpcmlnaWJsZSBjb250cmlidXRvcnNcbiAqXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGVcbiAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYyLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcbiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYyMC5odG1sXG4gKlxuICogU1BEWC1GaWxlQ29weXJpZ2h0VGV4dDogRWNsaXBzZSBEaXJpZ2libGUgY29udHJpYnV0b3JzIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wXG4gKi9cblxuLyoqXG4gKiBMYXp5IFByb3h5IHNoaW0gZm9yIE1vbmFjbyBFZGl0b3IgbG9hZGVkIHZpYSBBTUQuXG4gKlxuICogZWRpdG9yLmpzIHNldHMgZ2xvYmFsVGhpcy5tb25hY28gaW5zaWRlIHRoZSBBTUQgcmVxdWlyZSgpIGNhbGxiYWNrLCBiZWZvcmUgYW55XG4gKiBKYXZhTHNwQ2xpZW50TGliLmNvbm5lY3QoKSBjYWxsLiBBbGwgcHJvcGVydHkgYWNjZXNzZXMgZ28gdGhyb3VnaCBQcm94eS5nZXQoKSB0cmFwc1xuICogc28gdGhleSByZXNvbHZlIGFnYWluc3QgdGhlIGxpdmUgd2luZG93Lm1vbmFjbyBhdCBjYWxsIHRpbWUsIG5vdCBhdCBidW5kbGUgbG9hZCB0aW1lLlxuICpcbiAqIFR5cGVTY3JpcHQgcmVzb2x2ZXMgdHlwZXMgZnJvbSB0aGUgcmVhbCBtb25hY28tZWRpdG9yIGRldkRlcGVuZGVuY3k7IGVzYnVpbGQgcmVwbGFjZXNcbiAqIHRoZSBcIm1vbmFjby1lZGl0b3JcIiBpbXBvcnQgd2l0aCB0aGlzIGZpbGUgYXQgYnVuZGxlIHRpbWUgdmlhIHRoZSBhbGlhcyBvcHRpb24uXG4gKi9cblxudHlwZSBNID0gdHlwZW9mIGltcG9ydCgnbW9uYWNvLWVkaXRvcicpO1xuXG5mdW5jdGlvbiBtKCk6IE0ge1xuICAgIHJldHVybiAoZ2xvYmFsVGhpcyBhcyBhbnkpLm1vbmFjbyBhcyBNO1xufVxuXG5mdW5jdGlvbiBuczxUIGV4dGVuZHMgb2JqZWN0PihnZXR0ZXI6ICgpID0+IFQpOiBUIHtcbiAgICByZXR1cm4gbmV3IFByb3h5KHt9IGFzIFQsIHtcbiAgICAgICAgZ2V0OiAoXywgaykgPT4gKGdldHRlcigpIGFzIGFueSlbayBhcyBzdHJpbmddLFxuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBjbHM8VD4oZ2V0dGVyOiAoKSA9PiBUKTogVCB7XG4gICAgcmV0dXJuIG5ldyBQcm94eShmdW5jdGlvbiAoKSB7fSBhcyBhbnksIHtcbiAgICAgICAgY29uc3RydWN0OiAoXywgYXJncykgPT4gbmV3IChnZXR0ZXIoKSBhcyBhbnkpKC4uLmFyZ3MpLFxuICAgICAgICBnZXQ6ICAgICAgIChfLCBrKSAgICA9PiAoZ2V0dGVyKCkgYXMgYW55KVtrIGFzIHN0cmluZ10sXG4gICAgfSkgYXMgVDtcbn1cblxuZXhwb3J0IGNvbnN0IGVkaXRvciAgICAgICAgID0gbnMoKCkgPT4gbSgpLmVkaXRvcik7XG5leHBvcnQgY29uc3QgbGFuZ3VhZ2VzICAgICAgPSBucygoKSA9PiBtKCkubGFuZ3VhZ2VzKTtcbmV4cG9ydCBjb25zdCBNYXJrZXJTZXZlcml0eSA9IG5zKCgpID0+IG0oKS5NYXJrZXJTZXZlcml0eSk7XG5leHBvcnQgY29uc3QgTWFya2VyVGFnICAgICAgPSBucygoKSA9PiAobSgpIGFzIGFueSkuTWFya2VyVGFnKTtcbmV4cG9ydCBjb25zdCBVcmkgICAgICAgICAgICA9IGNscygoKSA9PiBtKCkuVXJpKTtcbmV4cG9ydCBjb25zdCBSYW5nZSAgICAgICAgICA9IGNscygoKSA9PiBtKCkuUmFuZ2UpO1xuZXhwb3J0IGNvbnN0IFBvc2l0aW9uICAgICAgID0gY2xzKCgpID0+IG0oKS5Qb3NpdGlvbik7XG5leHBvcnQgY29uc3QgU2VsZWN0aW9uICAgICAgPSBjbHMoKCkgPT4gbSgpLlNlbGVjdGlvbik7XG5leHBvcnQgY29uc3QgS2V5Q29kZSAgICAgICAgPSBucygoKSA9PiBtKCkuS2V5Q29kZSk7XG5leHBvcnQgY29uc3QgS2V5TW9kICAgICAgICAgPSBucygoKSA9PiBtKCkuS2V5TW9kKTtcbiIsICIvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4ndXNlIHN0cmljdCc7XG5leHBvcnQgdmFyIERvY3VtZW50VXJpO1xuKGZ1bmN0aW9uIChEb2N1bWVudFVyaSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnO1xuICAgIH1cbiAgICBEb2N1bWVudFVyaS5pcyA9IGlzO1xufSkoRG9jdW1lbnRVcmkgfHwgKERvY3VtZW50VXJpID0ge30pKTtcbmV4cG9ydCB2YXIgVVJJO1xuKGZ1bmN0aW9uIChVUkkpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJztcbiAgICB9XG4gICAgVVJJLmlzID0gaXM7XG59KShVUkkgfHwgKFVSSSA9IHt9KSk7XG5leHBvcnQgdmFyIGludGVnZXI7XG4oZnVuY3Rpb24gKGludGVnZXIpIHtcbiAgICBpbnRlZ2VyLk1JTl9WQUxVRSA9IC0yMTQ3NDgzNjQ4O1xuICAgIGludGVnZXIuTUFYX1ZBTFVFID0gMjE0NzQ4MzY0NztcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBpbnRlZ2VyLk1JTl9WQUxVRSA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSBpbnRlZ2VyLk1BWF9WQUxVRTtcbiAgICB9XG4gICAgaW50ZWdlci5pcyA9IGlzO1xufSkoaW50ZWdlciB8fCAoaW50ZWdlciA9IHt9KSk7XG5leHBvcnQgdmFyIHVpbnRlZ2VyO1xuKGZ1bmN0aW9uICh1aW50ZWdlcikge1xuICAgIHVpbnRlZ2VyLk1JTl9WQUxVRSA9IDA7XG4gICAgdWludGVnZXIuTUFYX1ZBTFVFID0gMjE0NzQ4MzY0NztcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiB1aW50ZWdlci5NSU5fVkFMVUUgPD0gdmFsdWUgJiYgdmFsdWUgPD0gdWludGVnZXIuTUFYX1ZBTFVFO1xuICAgIH1cbiAgICB1aW50ZWdlci5pcyA9IGlzO1xufSkodWludGVnZXIgfHwgKHVpbnRlZ2VyID0ge30pKTtcbi8qKlxuICogVGhlIFBvc2l0aW9uIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIFBvc2l0aW9ufSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBQb3NpdGlvbjtcbihmdW5jdGlvbiAoUG9zaXRpb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFBvc2l0aW9uIGxpdGVyYWwgZnJvbSB0aGUgZ2l2ZW4gbGluZSBhbmQgY2hhcmFjdGVyLlxuICAgICAqIEBwYXJhbSBsaW5lIFRoZSBwb3NpdGlvbidzIGxpbmUuXG4gICAgICogQHBhcmFtIGNoYXJhY3RlciBUaGUgcG9zaXRpb24ncyBjaGFyYWN0ZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGxpbmUsIGNoYXJhY3Rlcikge1xuICAgICAgICBpZiAobGluZSA9PT0gTnVtYmVyLk1BWF9WQUxVRSkge1xuICAgICAgICAgICAgbGluZSA9IHVpbnRlZ2VyLk1BWF9WQUxVRTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhcmFjdGVyID09PSBOdW1iZXIuTUFYX1ZBTFVFKSB7XG4gICAgICAgICAgICBjaGFyYWN0ZXIgPSB1aW50ZWdlci5NQVhfVkFMVUU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgbGluZSwgY2hhcmFjdGVyIH07XG4gICAgfVxuICAgIFBvc2l0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIFBvc2l0aW9ufSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS5saW5lKSAmJiBJcy51aW50ZWdlcihjYW5kaWRhdGUuY2hhcmFjdGVyKTtcbiAgICB9XG4gICAgUG9zaXRpb24uaXMgPSBpcztcbn0pKFBvc2l0aW9uIHx8IChQb3NpdGlvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBSYW5nZSBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBSYW5nZX0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgUmFuZ2U7XG4oZnVuY3Rpb24gKFJhbmdlKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKG9uZSwgdHdvLCB0aHJlZSwgZm91cikge1xuICAgICAgICBpZiAoSXMudWludGVnZXIob25lKSAmJiBJcy51aW50ZWdlcih0d28pICYmIElzLnVpbnRlZ2VyKHRocmVlKSAmJiBJcy51aW50ZWdlcihmb3VyKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IFBvc2l0aW9uLmNyZWF0ZShvbmUsIHR3byksIGVuZDogUG9zaXRpb24uY3JlYXRlKHRocmVlLCBmb3VyKSB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKFBvc2l0aW9uLmlzKG9uZSkgJiYgUG9zaXRpb24uaXModHdvKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IG9uZSwgZW5kOiB0d28gfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmFuZ2UjY3JlYXRlIGNhbGxlZCB3aXRoIGludmFsaWQgYXJndW1lbnRzWyR7b25lfSwgJHt0d299LCAke3RocmVlfSwgJHtmb3VyfV1gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBSYW5nZS5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBSYW5nZX0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBQb3NpdGlvbi5pcyhjYW5kaWRhdGUuc3RhcnQpICYmIFBvc2l0aW9uLmlzKGNhbmRpZGF0ZS5lbmQpO1xuICAgIH1cbiAgICBSYW5nZS5pcyA9IGlzO1xufSkoUmFuZ2UgfHwgKFJhbmdlID0ge30pKTtcbi8qKlxuICogVGhlIExvY2F0aW9uIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIExvY2F0aW9ufSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBMb2NhdGlvbjtcbihmdW5jdGlvbiAoTG9jYXRpb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgTG9jYXRpb24gbGl0ZXJhbC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSBsb2NhdGlvbidzIHVyaS5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIGxvY2F0aW9uJ3MgcmFuZ2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHVyaSwgcmFuZ2UpIHtcbiAgICAgICAgcmV0dXJuIHsgdXJpLCByYW5nZSB9O1xuICAgIH1cbiAgICBMb2NhdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBMb2NhdGlvbn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIChJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSkgfHwgSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS51cmkpKTtcbiAgICB9XG4gICAgTG9jYXRpb24uaXMgPSBpcztcbn0pKExvY2F0aW9uIHx8IChMb2NhdGlvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBMb2NhdGlvbkxpbmsgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgTG9jYXRpb25MaW5rfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBMb2NhdGlvbkxpbms7XG4oZnVuY3Rpb24gKExvY2F0aW9uTGluaykge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBMb2NhdGlvbkxpbmsgbGl0ZXJhbC5cbiAgICAgKiBAcGFyYW0gdGFyZ2V0VXJpIFRoZSBkZWZpbml0aW9uJ3MgdXJpLlxuICAgICAqIEBwYXJhbSB0YXJnZXRSYW5nZSBUaGUgZnVsbCByYW5nZSBvZiB0aGUgZGVmaW5pdGlvbi5cbiAgICAgKiBAcGFyYW0gdGFyZ2V0U2VsZWN0aW9uUmFuZ2UgVGhlIHNwYW4gb2YgdGhlIHN5bWJvbCBkZWZpbml0aW9uIGF0IHRoZSB0YXJnZXQuXG4gICAgICogQHBhcmFtIG9yaWdpblNlbGVjdGlvblJhbmdlIFRoZSBzcGFuIG9mIHRoZSBzeW1ib2wgYmVpbmcgZGVmaW5lZCBpbiB0aGUgb3JpZ2luYXRpbmcgc291cmNlIGZpbGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHRhcmdldFVyaSwgdGFyZ2V0UmFuZ2UsIHRhcmdldFNlbGVjdGlvblJhbmdlLCBvcmlnaW5TZWxlY3Rpb25SYW5nZSkge1xuICAgICAgICByZXR1cm4geyB0YXJnZXRVcmksIHRhcmdldFJhbmdlLCB0YXJnZXRTZWxlY3Rpb25SYW5nZSwgb3JpZ2luU2VsZWN0aW9uUmFuZ2UgfTtcbiAgICB9XG4gICAgTG9jYXRpb25MaW5rLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIExvY2F0aW9uTGlua30gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUudGFyZ2V0UmFuZ2UpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudGFyZ2V0VXJpKVxuICAgICAgICAgICAgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnRhcmdldFNlbGVjdGlvblJhbmdlKVxuICAgICAgICAgICAgJiYgKFJhbmdlLmlzKGNhbmRpZGF0ZS5vcmlnaW5TZWxlY3Rpb25SYW5nZSkgfHwgSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5vcmlnaW5TZWxlY3Rpb25SYW5nZSkpO1xuICAgIH1cbiAgICBMb2NhdGlvbkxpbmsuaXMgPSBpcztcbn0pKExvY2F0aW9uTGluayB8fCAoTG9jYXRpb25MaW5rID0ge30pKTtcbi8qKlxuICogVGhlIENvbG9yIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIENvbG9yfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBDb2xvcjtcbihmdW5jdGlvbiAoQ29sb3IpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENvbG9yIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZWQsXG4gICAgICAgICAgICBncmVlbixcbiAgICAgICAgICAgIGJsdWUsXG4gICAgICAgICAgICBhbHBoYSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgQ29sb3IuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgQ29sb3J9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBJcy5udW1iZXJSYW5nZShjYW5kaWRhdGUucmVkLCAwLCAxKVxuICAgICAgICAgICAgJiYgSXMubnVtYmVyUmFuZ2UoY2FuZGlkYXRlLmdyZWVuLCAwLCAxKVxuICAgICAgICAgICAgJiYgSXMubnVtYmVyUmFuZ2UoY2FuZGlkYXRlLmJsdWUsIDAsIDEpXG4gICAgICAgICAgICAmJiBJcy5udW1iZXJSYW5nZShjYW5kaWRhdGUuYWxwaGEsIDAsIDEpO1xuICAgIH1cbiAgICBDb2xvci5pcyA9IGlzO1xufSkoQ29sb3IgfHwgKENvbG9yID0ge30pKTtcbi8qKlxuICogVGhlIENvbG9ySW5mb3JtYXRpb24gbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgQ29sb3JJbmZvcm1hdGlvbn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgQ29sb3JJbmZvcm1hdGlvbjtcbihmdW5jdGlvbiAoQ29sb3JJbmZvcm1hdGlvbikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ29sb3JJbmZvcm1hdGlvbiBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgY29sb3IpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJhbmdlLFxuICAgICAgICAgICAgY29sb3IsXG4gICAgICAgIH07XG4gICAgfVxuICAgIENvbG9ySW5mb3JtYXRpb24uY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgQ29sb3JJbmZvcm1hdGlvbn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgQ29sb3IuaXMoY2FuZGlkYXRlLmNvbG9yKTtcbiAgICB9XG4gICAgQ29sb3JJbmZvcm1hdGlvbi5pcyA9IGlzO1xufSkoQ29sb3JJbmZvcm1hdGlvbiB8fCAoQ29sb3JJbmZvcm1hdGlvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb2xvciBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBDb2xvclByZXNlbnRhdGlvbn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgQ29sb3JQcmVzZW50YXRpb247XG4oZnVuY3Rpb24gKENvbG9yUHJlc2VudGF0aW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDb2xvckluZm9ybWF0aW9uIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGxhYmVsLCB0ZXh0RWRpdCwgYWRkaXRpb25hbFRleHRFZGl0cykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICB0ZXh0RWRpdCxcbiAgICAgICAgICAgIGFkZGl0aW9uYWxUZXh0RWRpdHMsXG4gICAgICAgIH07XG4gICAgfVxuICAgIENvbG9yUHJlc2VudGF0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIENvbG9ySW5mb3JtYXRpb259IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLmxhYmVsKVxuICAgICAgICAgICAgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUudGV4dEVkaXQpIHx8IFRleHRFZGl0LmlzKGNhbmRpZGF0ZSkpXG4gICAgICAgICAgICAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5hZGRpdGlvbmFsVGV4dEVkaXRzKSB8fCBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS5hZGRpdGlvbmFsVGV4dEVkaXRzLCBUZXh0RWRpdC5pcykpO1xuICAgIH1cbiAgICBDb2xvclByZXNlbnRhdGlvbi5pcyA9IGlzO1xufSkoQ29sb3JQcmVzZW50YXRpb24gfHwgKENvbG9yUHJlc2VudGF0aW9uID0ge30pKTtcbi8qKlxuICogQSBzZXQgb2YgcHJlZGVmaW5lZCByYW5nZSBraW5kcy5cbiAqL1xuZXhwb3J0IHZhciBGb2xkaW5nUmFuZ2VLaW5kO1xuKGZ1bmN0aW9uIChGb2xkaW5nUmFuZ2VLaW5kKSB7XG4gICAgLyoqXG4gICAgICogRm9sZGluZyByYW5nZSBmb3IgYSBjb21tZW50XG4gICAgICovXG4gICAgRm9sZGluZ1JhbmdlS2luZC5Db21tZW50ID0gJ2NvbW1lbnQnO1xuICAgIC8qKlxuICAgICAqIEZvbGRpbmcgcmFuZ2UgZm9yIGFuIGltcG9ydCBvciBpbmNsdWRlXG4gICAgICovXG4gICAgRm9sZGluZ1JhbmdlS2luZC5JbXBvcnRzID0gJ2ltcG9ydHMnO1xuICAgIC8qKlxuICAgICAqIEZvbGRpbmcgcmFuZ2UgZm9yIGEgcmVnaW9uIChlLmcuIGAjcmVnaW9uYClcbiAgICAgKi9cbiAgICBGb2xkaW5nUmFuZ2VLaW5kLlJlZ2lvbiA9ICdyZWdpb24nO1xufSkoRm9sZGluZ1JhbmdlS2luZCB8fCAoRm9sZGluZ1JhbmdlS2luZCA9IHt9KSk7XG4vKipcbiAqIFRoZSBmb2xkaW5nIHJhbmdlIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIEZvbGRpbmdSYW5nZX0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgRm9sZGluZ1JhbmdlO1xuKGZ1bmN0aW9uIChGb2xkaW5nUmFuZ2UpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IEZvbGRpbmdSYW5nZSBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShzdGFydExpbmUsIGVuZExpbmUsIHN0YXJ0Q2hhcmFjdGVyLCBlbmRDaGFyYWN0ZXIsIGtpbmQsIGNvbGxhcHNlZFRleHQpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgc3RhcnRMaW5lLFxuICAgICAgICAgICAgZW5kTGluZVxuICAgICAgICB9O1xuICAgICAgICBpZiAoSXMuZGVmaW5lZChzdGFydENoYXJhY3RlcikpIHtcbiAgICAgICAgICAgIHJlc3VsdC5zdGFydENoYXJhY3RlciA9IHN0YXJ0Q2hhcmFjdGVyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKGVuZENoYXJhY3RlcikpIHtcbiAgICAgICAgICAgIHJlc3VsdC5lbmRDaGFyYWN0ZXIgPSBlbmRDaGFyYWN0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzLmRlZmluZWQoa2luZCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5raW5kID0ga2luZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXMuZGVmaW5lZChjb2xsYXBzZWRUZXh0KSkge1xuICAgICAgICAgICAgcmVzdWx0LmNvbGxhcHNlZFRleHQgPSBjb2xsYXBzZWRUZXh0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIEZvbGRpbmdSYW5nZS5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBGb2xkaW5nUmFuZ2V9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBJcy51aW50ZWdlcihjYW5kaWRhdGUuc3RhcnRMaW5lKSAmJiBJcy51aW50ZWdlcihjYW5kaWRhdGUuc3RhcnRMaW5lKVxuICAgICAgICAgICAgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUuc3RhcnRDaGFyYWN0ZXIpIHx8IElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS5zdGFydENoYXJhY3RlcikpXG4gICAgICAgICAgICAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5lbmRDaGFyYWN0ZXIpIHx8IElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS5lbmRDaGFyYWN0ZXIpKVxuICAgICAgICAgICAgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUua2luZCkgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS5raW5kKSk7XG4gICAgfVxuICAgIEZvbGRpbmdSYW5nZS5pcyA9IGlzO1xufSkoRm9sZGluZ1JhbmdlIHx8IChGb2xkaW5nUmFuZ2UgPSB7fSkpO1xuLyoqXG4gKiBUaGUgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbiBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9ufSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uO1xuKGZ1bmN0aW9uIChEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGxvY2F0aW9uLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgICAgIG1lc3NhZ2VcbiAgICAgICAgfTtcbiAgICB9XG4gICAgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9ufSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIExvY2F0aW9uLmlzKGNhbmRpZGF0ZS5sb2NhdGlvbikgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5tZXNzYWdlKTtcbiAgICB9XG4gICAgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbi5pcyA9IGlzO1xufSkoRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbiB8fCAoRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBkaWFnbm9zdGljJ3Mgc2V2ZXJpdHkuXG4gKi9cbmV4cG9ydCB2YXIgRGlhZ25vc3RpY1NldmVyaXR5O1xuKGZ1bmN0aW9uIChEaWFnbm9zdGljU2V2ZXJpdHkpIHtcbiAgICAvKipcbiAgICAgKiBSZXBvcnRzIGFuIGVycm9yLlxuICAgICAqL1xuICAgIERpYWdub3N0aWNTZXZlcml0eS5FcnJvciA9IDE7XG4gICAgLyoqXG4gICAgICogUmVwb3J0cyBhIHdhcm5pbmcuXG4gICAgICovXG4gICAgRGlhZ25vc3RpY1NldmVyaXR5Lldhcm5pbmcgPSAyO1xuICAgIC8qKlxuICAgICAqIFJlcG9ydHMgYW4gaW5mb3JtYXRpb24uXG4gICAgICovXG4gICAgRGlhZ25vc3RpY1NldmVyaXR5LkluZm9ybWF0aW9uID0gMztcbiAgICAvKipcbiAgICAgKiBSZXBvcnRzIGEgaGludC5cbiAgICAgKi9cbiAgICBEaWFnbm9zdGljU2V2ZXJpdHkuSGludCA9IDQ7XG59KShEaWFnbm9zdGljU2V2ZXJpdHkgfHwgKERpYWdub3N0aWNTZXZlcml0eSA9IHt9KSk7XG4vKipcbiAqIFRoZSBkaWFnbm9zdGljIHRhZ3MuXG4gKlxuICogQHNpbmNlIDMuMTUuMFxuICovXG5leHBvcnQgdmFyIERpYWdub3N0aWNUYWc7XG4oZnVuY3Rpb24gKERpYWdub3N0aWNUYWcpIHtcbiAgICAvKipcbiAgICAgKiBVbnVzZWQgb3IgdW5uZWNlc3NhcnkgY29kZS5cbiAgICAgKlxuICAgICAqIENsaWVudHMgYXJlIGFsbG93ZWQgdG8gcmVuZGVyIGRpYWdub3N0aWNzIHdpdGggdGhpcyB0YWcgZmFkZWQgb3V0IGluc3RlYWQgb2YgaGF2aW5nXG4gICAgICogYW4gZXJyb3Igc3F1aWdnbGUuXG4gICAgICovXG4gICAgRGlhZ25vc3RpY1RhZy5Vbm5lY2Vzc2FyeSA9IDE7XG4gICAgLyoqXG4gICAgICogRGVwcmVjYXRlZCBvciBvYnNvbGV0ZSBjb2RlLlxuICAgICAqXG4gICAgICogQ2xpZW50cyBhcmUgYWxsb3dlZCB0byByZW5kZXJlZCBkaWFnbm9zdGljcyB3aXRoIHRoaXMgdGFnIHN0cmlrZSB0aHJvdWdoLlxuICAgICAqL1xuICAgIERpYWdub3N0aWNUYWcuRGVwcmVjYXRlZCA9IDI7XG59KShEaWFnbm9zdGljVGFnIHx8IChEaWFnbm9zdGljVGFnID0ge30pKTtcbi8qKlxuICogVGhlIENvZGVEZXNjcmlwdGlvbiBuYW1lc3BhY2UgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCBkZXNjcmlwdGlvbnMgZm9yIGRpYWdub3N0aWMgY29kZXMuXG4gKlxuICogQHNpbmNlIDMuMTYuMFxuICovXG5leHBvcnQgdmFyIENvZGVEZXNjcmlwdGlvbjtcbihmdW5jdGlvbiAoQ29kZURlc2NyaXB0aW9uKSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5ocmVmKTtcbiAgICB9XG4gICAgQ29kZURlc2NyaXB0aW9uLmlzID0gaXM7XG59KShDb2RlRGVzY3JpcHRpb24gfHwgKENvZGVEZXNjcmlwdGlvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBEaWFnbm9zdGljIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIERpYWdub3N0aWN9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIERpYWdub3N0aWM7XG4oZnVuY3Rpb24gKERpYWdub3N0aWMpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IERpYWdub3N0aWMgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIG1lc3NhZ2UsIHNldmVyaXR5LCBjb2RlLCBzb3VyY2UsIHJlbGF0ZWRJbmZvcm1hdGlvbikge1xuICAgICAgICBsZXQgcmVzdWx0ID0geyByYW5nZSwgbWVzc2FnZSB9O1xuICAgICAgICBpZiAoSXMuZGVmaW5lZChzZXZlcml0eSkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5zZXZlcml0eSA9IHNldmVyaXR5O1xuICAgICAgICB9XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKGNvZGUpKSB7XG4gICAgICAgICAgICByZXN1bHQuY29kZSA9IGNvZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzLmRlZmluZWQoc291cmNlKSkge1xuICAgICAgICAgICAgcmVzdWx0LnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXMuZGVmaW5lZChyZWxhdGVkSW5mb3JtYXRpb24pKSB7XG4gICAgICAgICAgICByZXN1bHQucmVsYXRlZEluZm9ybWF0aW9uID0gcmVsYXRlZEluZm9ybWF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIERpYWdub3N0aWMuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgRGlhZ25vc3RpY30gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpXG4gICAgICAgICAgICAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpXG4gICAgICAgICAgICAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLm1lc3NhZ2UpXG4gICAgICAgICAgICAmJiAoSXMubnVtYmVyKGNhbmRpZGF0ZS5zZXZlcml0eSkgfHwgSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5zZXZlcml0eSkpXG4gICAgICAgICAgICAmJiAoSXMuaW50ZWdlcihjYW5kaWRhdGUuY29kZSkgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS5jb2RlKSB8fCBJcy51bmRlZmluZWQoY2FuZGlkYXRlLmNvZGUpKVxuICAgICAgICAgICAgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUuY29kZURlc2NyaXB0aW9uKSB8fCAoSXMuc3RyaW5nKChfYSA9IGNhbmRpZGF0ZS5jb2RlRGVzY3JpcHRpb24pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5ocmVmKSkpXG4gICAgICAgICAgICAmJiAoSXMuc3RyaW5nKGNhbmRpZGF0ZS5zb3VyY2UpIHx8IElzLnVuZGVmaW5lZChjYW5kaWRhdGUuc291cmNlKSlcbiAgICAgICAgICAgICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLnJlbGF0ZWRJbmZvcm1hdGlvbikgfHwgSXMudHlwZWRBcnJheShjYW5kaWRhdGUucmVsYXRlZEluZm9ybWF0aW9uLCBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uLmlzKSk7XG4gICAgfVxuICAgIERpYWdub3N0aWMuaXMgPSBpcztcbn0pKERpYWdub3N0aWMgfHwgKERpYWdub3N0aWMgPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29tbWFuZCBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBDb21tYW5kfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBDb21tYW5kO1xuKGZ1bmN0aW9uIChDb21tYW5kKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDb21tYW5kIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHRpdGxlLCBjb21tYW5kLCAuLi5hcmdzKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IHRpdGxlLCBjb21tYW5kIH07XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKGFyZ3MpICYmIGFyZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmVzdWx0LmFyZ3VtZW50cyA9IGFyZ3M7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgQ29tbWFuZC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBDb21tYW5kfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudGl0bGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUuY29tbWFuZCk7XG4gICAgfVxuICAgIENvbW1hbmQuaXMgPSBpcztcbn0pKENvbW1hbmQgfHwgKENvbW1hbmQgPSB7fSkpO1xuLyoqXG4gKiBUaGUgVGV4dEVkaXQgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgcmVwbGFjZSxcbiAqIGluc2VydCBhbmQgZGVsZXRlIGVkaXRzIG1vcmUgZWFzaWx5LlxuICovXG5leHBvcnQgdmFyIFRleHRFZGl0O1xuKGZ1bmN0aW9uIChUZXh0RWRpdCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSByZXBsYWNlIHRleHQgZWRpdC5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlIG9mIHRleHQgdG8gYmUgcmVwbGFjZWQuXG4gICAgICogQHBhcmFtIG5ld1RleHQgVGhlIG5ldyB0ZXh0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlcGxhY2UocmFuZ2UsIG5ld1RleHQpIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIG5ld1RleHQgfTtcbiAgICB9XG4gICAgVGV4dEVkaXQucmVwbGFjZSA9IHJlcGxhY2U7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnNlcnQgdGV4dCBlZGl0LlxuICAgICAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgcG9zaXRpb24gdG8gaW5zZXJ0IHRoZSB0ZXh0IGF0LlxuICAgICAqIEBwYXJhbSBuZXdUZXh0IFRoZSB0ZXh0IHRvIGJlIGluc2VydGVkLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluc2VydChwb3NpdGlvbiwgbmV3VGV4dCkge1xuICAgICAgICByZXR1cm4geyByYW5nZTogeyBzdGFydDogcG9zaXRpb24sIGVuZDogcG9zaXRpb24gfSwgbmV3VGV4dCB9O1xuICAgIH1cbiAgICBUZXh0RWRpdC5pbnNlcnQgPSBpbnNlcnQ7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGRlbGV0ZSB0ZXh0IGVkaXQuXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSBvZiB0ZXh0IHRvIGJlIGRlbGV0ZWQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZGVsKHJhbmdlKSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCBuZXdUZXh0OiAnJyB9O1xuICAgIH1cbiAgICBUZXh0RWRpdC5kZWwgPSBkZWw7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSlcbiAgICAgICAgICAgICYmIElzLnN0cmluZyhjYW5kaWRhdGUubmV3VGV4dClcbiAgICAgICAgICAgICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSk7XG4gICAgfVxuICAgIFRleHRFZGl0LmlzID0gaXM7XG59KShUZXh0RWRpdCB8fCAoVGV4dEVkaXQgPSB7fSkpO1xuZXhwb3J0IHZhciBDaGFuZ2VBbm5vdGF0aW9uO1xuKGZ1bmN0aW9uIChDaGFuZ2VBbm5vdGF0aW9uKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKGxhYmVsLCBuZWVkc0NvbmZpcm1hdGlvbiwgZGVzY3JpcHRpb24pIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0geyBsYWJlbCB9O1xuICAgICAgICBpZiAobmVlZHNDb25maXJtYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0Lm5lZWRzQ29uZmlybWF0aW9uID0gbmVlZHNDb25maXJtYXRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIENoYW5nZUFubm90YXRpb24uY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUubGFiZWwpICYmXG4gICAgICAgICAgICAoSXMuYm9vbGVhbihjYW5kaWRhdGUubmVlZHNDb25maXJtYXRpb24pIHx8IGNhbmRpZGF0ZS5uZWVkc0NvbmZpcm1hdGlvbiA9PT0gdW5kZWZpbmVkKSAmJlxuICAgICAgICAgICAgKElzLnN0cmluZyhjYW5kaWRhdGUuZGVzY3JpcHRpb24pIHx8IGNhbmRpZGF0ZS5kZXNjcmlwdGlvbiA9PT0gdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgQ2hhbmdlQW5ub3RhdGlvbi5pcyA9IGlzO1xufSkoQ2hhbmdlQW5ub3RhdGlvbiB8fCAoQ2hhbmdlQW5ub3RhdGlvbiA9IHt9KSk7XG5leHBvcnQgdmFyIENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyO1xuKGZ1bmN0aW9uIChDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuc3RyaW5nKGNhbmRpZGF0ZSk7XG4gICAgfVxuICAgIENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzID0gaXM7XG59KShDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllciB8fCAoQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIgPSB7fSkpO1xuZXhwb3J0IHZhciBBbm5vdGF0ZWRUZXh0RWRpdDtcbihmdW5jdGlvbiAoQW5ub3RhdGVkVGV4dEVkaXQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFubm90YXRlZCByZXBsYWNlIHRleHQgZWRpdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2Ugb2YgdGV4dCB0byBiZSByZXBsYWNlZC5cbiAgICAgKiBAcGFyYW0gbmV3VGV4dCBUaGUgbmV3IHRleHQuXG4gICAgICogQHBhcmFtIGFubm90YXRpb24gVGhlIGFubm90YXRpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVwbGFjZShyYW5nZSwgbmV3VGV4dCwgYW5ub3RhdGlvbikge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgbmV3VGV4dCwgYW5ub3RhdGlvbklkOiBhbm5vdGF0aW9uIH07XG4gICAgfVxuICAgIEFubm90YXRlZFRleHRFZGl0LnJlcGxhY2UgPSByZXBsYWNlO1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYW5ub3RhdGVkIGluc2VydCB0ZXh0IGVkaXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIHBvc2l0aW9uIHRvIGluc2VydCB0aGUgdGV4dCBhdC5cbiAgICAgKiBAcGFyYW0gbmV3VGV4dCBUaGUgdGV4dCB0byBiZSBpbnNlcnRlZC5cbiAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiBUaGUgYW5ub3RhdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbnNlcnQocG9zaXRpb24sIG5ld1RleHQsIGFubm90YXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2U6IHsgc3RhcnQ6IHBvc2l0aW9uLCBlbmQ6IHBvc2l0aW9uIH0sIG5ld1RleHQsIGFubm90YXRpb25JZDogYW5ub3RhdGlvbiB9O1xuICAgIH1cbiAgICBBbm5vdGF0ZWRUZXh0RWRpdC5pbnNlcnQgPSBpbnNlcnQ7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhbm5vdGF0ZWQgZGVsZXRlIHRleHQgZWRpdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2Ugb2YgdGV4dCB0byBiZSBkZWxldGVkLlxuICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIFRoZSBhbm5vdGF0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRlbChyYW5nZSwgYW5ub3RhdGlvbikge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgbmV3VGV4dDogJycsIGFubm90YXRpb25JZDogYW5ub3RhdGlvbiB9O1xuICAgIH1cbiAgICBBbm5vdGF0ZWRUZXh0RWRpdC5kZWwgPSBkZWw7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBUZXh0RWRpdC5pcyhjYW5kaWRhdGUpICYmIChDaGFuZ2VBbm5vdGF0aW9uLmlzKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQpIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQpKTtcbiAgICB9XG4gICAgQW5ub3RhdGVkVGV4dEVkaXQuaXMgPSBpcztcbn0pKEFubm90YXRlZFRleHRFZGl0IHx8IChBbm5vdGF0ZWRUZXh0RWRpdCA9IHt9KSk7XG4vKipcbiAqIFRoZSBUZXh0RG9jdW1lbnRFZGl0IG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlXG4gKiBhbiBlZGl0IHRoYXQgbWFuaXB1bGF0ZXMgYSB0ZXh0IGRvY3VtZW50LlxuICovXG5leHBvcnQgdmFyIFRleHREb2N1bWVudEVkaXQ7XG4oZnVuY3Rpb24gKFRleHREb2N1bWVudEVkaXQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGBUZXh0RG9jdW1lbnRFZGl0YFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh0ZXh0RG9jdW1lbnQsIGVkaXRzKSB7XG4gICAgICAgIHJldHVybiB7IHRleHREb2N1bWVudCwgZWRpdHMgfTtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50RWRpdC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpXG4gICAgICAgICAgICAmJiBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIuaXMoY2FuZGlkYXRlLnRleHREb2N1bWVudClcbiAgICAgICAgICAgICYmIEFycmF5LmlzQXJyYXkoY2FuZGlkYXRlLmVkaXRzKTtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50RWRpdC5pcyA9IGlzO1xufSkoVGV4dERvY3VtZW50RWRpdCB8fCAoVGV4dERvY3VtZW50RWRpdCA9IHt9KSk7XG5leHBvcnQgdmFyIENyZWF0ZUZpbGU7XG4oZnVuY3Rpb24gKENyZWF0ZUZpbGUpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUodXJpLCBvcHRpb25zLCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7XG4gICAgICAgICAgICBraW5kOiAnY3JlYXRlJyxcbiAgICAgICAgICAgIHVyaVxuICAgICAgICB9O1xuICAgICAgICBpZiAob3B0aW9ucyAhPT0gdW5kZWZpbmVkICYmIChvcHRpb25zLm92ZXJ3cml0ZSAhPT0gdW5kZWZpbmVkIHx8IG9wdGlvbnMuaWdub3JlSWZFeGlzdHMgIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgfVxuICAgICAgICBpZiAoYW5ub3RhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQuYW5ub3RhdGlvbklkID0gYW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBDcmVhdGVGaWxlLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgY2FuZGlkYXRlLmtpbmQgPT09ICdjcmVhdGUnICYmIElzLnN0cmluZyhjYW5kaWRhdGUudXJpKSAmJiAoY2FuZGlkYXRlLm9wdGlvbnMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgKChjYW5kaWRhdGUub3B0aW9ucy5vdmVyd3JpdGUgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5vcHRpb25zLm92ZXJ3cml0ZSkpICYmIChjYW5kaWRhdGUub3B0aW9ucy5pZ25vcmVJZkV4aXN0cyA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLm9wdGlvbnMuaWdub3JlSWZFeGlzdHMpKSkpICYmIChjYW5kaWRhdGUuYW5ub3RhdGlvbklkID09PSB1bmRlZmluZWQgfHwgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoY2FuZGlkYXRlLmFubm90YXRpb25JZCkpO1xuICAgIH1cbiAgICBDcmVhdGVGaWxlLmlzID0gaXM7XG59KShDcmVhdGVGaWxlIHx8IChDcmVhdGVGaWxlID0ge30pKTtcbmV4cG9ydCB2YXIgUmVuYW1lRmlsZTtcbihmdW5jdGlvbiAoUmVuYW1lRmlsZSkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShvbGRVcmksIG5ld1VyaSwgb3B0aW9ucywgYW5ub3RhdGlvbikge1xuICAgICAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgICAgICAga2luZDogJ3JlbmFtZScsXG4gICAgICAgICAgICBvbGRVcmksXG4gICAgICAgICAgICBuZXdVcmlcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKG9wdGlvbnMgIT09IHVuZGVmaW5lZCAmJiAob3B0aW9ucy5vdmVyd3JpdGUgIT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLmlnbm9yZUlmRXhpc3RzICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICByZXN1bHQub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFubm90YXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmFubm90YXRpb25JZCA9IGFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgUmVuYW1lRmlsZS5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIGNhbmRpZGF0ZS5raW5kID09PSAncmVuYW1lJyAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLm9sZFVyaSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5uZXdVcmkpICYmIChjYW5kaWRhdGUub3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAoKGNhbmRpZGF0ZS5vcHRpb25zLm92ZXJ3cml0ZSA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLm9wdGlvbnMub3ZlcndyaXRlKSkgJiYgKGNhbmRpZGF0ZS5vcHRpb25zLmlnbm9yZUlmRXhpc3RzID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUub3B0aW9ucy5pZ25vcmVJZkV4aXN0cykpKSkgJiYgKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQgPT09IHVuZGVmaW5lZCB8fCBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhjYW5kaWRhdGUuYW5ub3RhdGlvbklkKSk7XG4gICAgfVxuICAgIFJlbmFtZUZpbGUuaXMgPSBpcztcbn0pKFJlbmFtZUZpbGUgfHwgKFJlbmFtZUZpbGUgPSB7fSkpO1xuZXhwb3J0IHZhciBEZWxldGVGaWxlO1xuKGZ1bmN0aW9uIChEZWxldGVGaWxlKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKHVyaSwgb3B0aW9ucywgYW5ub3RhdGlvbikge1xuICAgICAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgICAgICAga2luZDogJ2RlbGV0ZScsXG4gICAgICAgICAgICB1cmlcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKG9wdGlvbnMgIT09IHVuZGVmaW5lZCAmJiAob3B0aW9ucy5yZWN1cnNpdmUgIT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLmlnbm9yZUlmTm90RXhpc3RzICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICByZXN1bHQub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFubm90YXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmFubm90YXRpb25JZCA9IGFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgRGVsZXRlRmlsZS5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIGNhbmRpZGF0ZS5raW5kID09PSAnZGVsZXRlJyAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSkgJiYgKGNhbmRpZGF0ZS5vcHRpb25zID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICgoY2FuZGlkYXRlLm9wdGlvbnMucmVjdXJzaXZlID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUub3B0aW9ucy5yZWN1cnNpdmUpKSAmJiAoY2FuZGlkYXRlLm9wdGlvbnMuaWdub3JlSWZOb3RFeGlzdHMgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5vcHRpb25zLmlnbm9yZUlmTm90RXhpc3RzKSkpKSAmJiAoY2FuZGlkYXRlLmFubm90YXRpb25JZCA9PT0gdW5kZWZpbmVkIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQpKTtcbiAgICB9XG4gICAgRGVsZXRlRmlsZS5pcyA9IGlzO1xufSkoRGVsZXRlRmlsZSB8fCAoRGVsZXRlRmlsZSA9IHt9KSk7XG5leHBvcnQgdmFyIFdvcmtzcGFjZUVkaXQ7XG4oZnVuY3Rpb24gKFdvcmtzcGFjZUVkaXQpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuY2hhbmdlcyAhPT0gdW5kZWZpbmVkIHx8IGNhbmRpZGF0ZS5kb2N1bWVudENoYW5nZXMgIT09IHVuZGVmaW5lZCkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuZG9jdW1lbnRDaGFuZ2VzID09PSB1bmRlZmluZWQgfHwgY2FuZGlkYXRlLmRvY3VtZW50Q2hhbmdlcy5ldmVyeSgoY2hhbmdlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKElzLnN0cmluZyhjaGFuZ2Uua2luZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZUZpbGUuaXMoY2hhbmdlKSB8fCBSZW5hbWVGaWxlLmlzKGNoYW5nZSkgfHwgRGVsZXRlRmlsZS5pcyhjaGFuZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRleHREb2N1bWVudEVkaXQuaXMoY2hhbmdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSk7XG4gICAgfVxuICAgIFdvcmtzcGFjZUVkaXQuaXMgPSBpcztcbn0pKFdvcmtzcGFjZUVkaXQgfHwgKFdvcmtzcGFjZUVkaXQgPSB7fSkpO1xuY2xhc3MgVGV4dEVkaXRDaGFuZ2VJbXBsIHtcbiAgICBjb25zdHJ1Y3RvcihlZGl0cywgY2hhbmdlQW5ub3RhdGlvbnMpIHtcbiAgICAgICAgdGhpcy5lZGl0cyA9IGVkaXRzO1xuICAgICAgICB0aGlzLmNoYW5nZUFubm90YXRpb25zID0gY2hhbmdlQW5ub3RhdGlvbnM7XG4gICAgfVxuICAgIGluc2VydChwb3NpdGlvbiwgbmV3VGV4dCwgYW5ub3RhdGlvbikge1xuICAgICAgICBsZXQgZWRpdDtcbiAgICAgICAgbGV0IGlkO1xuICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBlZGl0ID0gVGV4dEVkaXQuaW5zZXJ0KHBvc2l0aW9uLCBuZXdUZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhhbm5vdGF0aW9uKSkge1xuICAgICAgICAgICAgaWQgPSBhbm5vdGF0aW9uO1xuICAgICAgICAgICAgZWRpdCA9IEFubm90YXRlZFRleHRFZGl0Lmluc2VydChwb3NpdGlvbiwgbmV3VGV4dCwgYW5ub3RhdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFzc2VydENoYW5nZUFubm90YXRpb25zKHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgaWQgPSB0aGlzLmNoYW5nZUFubm90YXRpb25zLm1hbmFnZShhbm5vdGF0aW9uKTtcbiAgICAgICAgICAgIGVkaXQgPSBBbm5vdGF0ZWRUZXh0RWRpdC5pbnNlcnQocG9zaXRpb24sIG5ld1RleHQsIGlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVkaXRzLnB1c2goZWRpdCk7XG4gICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVwbGFjZShyYW5nZSwgbmV3VGV4dCwgYW5ub3RhdGlvbikge1xuICAgICAgICBsZXQgZWRpdDtcbiAgICAgICAgbGV0IGlkO1xuICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBlZGl0ID0gVGV4dEVkaXQucmVwbGFjZShyYW5nZSwgbmV3VGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoYW5ub3RhdGlvbikpIHtcbiAgICAgICAgICAgIGlkID0gYW5ub3RhdGlvbjtcbiAgICAgICAgICAgIGVkaXQgPSBBbm5vdGF0ZWRUZXh0RWRpdC5yZXBsYWNlKHJhbmdlLCBuZXdUZXh0LCBhbm5vdGF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYXNzZXJ0Q2hhbmdlQW5ub3RhdGlvbnModGhpcy5jaGFuZ2VBbm5vdGF0aW9ucyk7XG4gICAgICAgICAgICBpZCA9IHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMubWFuYWdlKGFubm90YXRpb24pO1xuICAgICAgICAgICAgZWRpdCA9IEFubm90YXRlZFRleHRFZGl0LnJlcGxhY2UocmFuZ2UsIG5ld1RleHQsIGlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVkaXRzLnB1c2goZWRpdCk7XG4gICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVsZXRlKHJhbmdlLCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIGxldCBlZGl0O1xuICAgICAgICBsZXQgaWQ7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGVkaXQgPSBUZXh0RWRpdC5kZWwocmFuZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGFubm90YXRpb24pKSB7XG4gICAgICAgICAgICBpZCA9IGFubm90YXRpb247XG4gICAgICAgICAgICBlZGl0ID0gQW5ub3RhdGVkVGV4dEVkaXQuZGVsKHJhbmdlLCBhbm5vdGF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYXNzZXJ0Q2hhbmdlQW5ub3RhdGlvbnModGhpcy5jaGFuZ2VBbm5vdGF0aW9ucyk7XG4gICAgICAgICAgICBpZCA9IHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMubWFuYWdlKGFubm90YXRpb24pO1xuICAgICAgICAgICAgZWRpdCA9IEFubm90YXRlZFRleHRFZGl0LmRlbChyYW5nZSwgaWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWRpdHMucHVzaChlZGl0KTtcbiAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhZGQoZWRpdCkge1xuICAgICAgICB0aGlzLmVkaXRzLnB1c2goZWRpdCk7XG4gICAgfVxuICAgIGFsbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdHM7XG4gICAgfVxuICAgIGNsZWFyKCkge1xuICAgICAgICB0aGlzLmVkaXRzLnNwbGljZSgwLCB0aGlzLmVkaXRzLmxlbmd0aCk7XG4gICAgfVxuICAgIGFzc2VydENoYW5nZUFubm90YXRpb25zKHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRleHQgZWRpdCBjaGFuZ2UgaXMgbm90IGNvbmZpZ3VyZWQgdG8gbWFuYWdlIGNoYW5nZSBhbm5vdGF0aW9ucy5gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogQSBoZWxwZXIgY2xhc3NcbiAqL1xuY2xhc3MgQ2hhbmdlQW5ub3RhdGlvbnMge1xuICAgIGNvbnN0cnVjdG9yKGFubm90YXRpb25zKSB7XG4gICAgICAgIHRoaXMuX2Fubm90YXRpb25zID0gYW5ub3RhdGlvbnMgPT09IHVuZGVmaW5lZCA/IE9iamVjdC5jcmVhdGUobnVsbCkgOiBhbm5vdGF0aW9ucztcbiAgICAgICAgdGhpcy5fY291bnRlciA9IDA7XG4gICAgICAgIHRoaXMuX3NpemUgPSAwO1xuICAgIH1cbiAgICBhbGwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hbm5vdGF0aW9ucztcbiAgICB9XG4gICAgZ2V0IHNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaXplO1xuICAgIH1cbiAgICBtYW5hZ2UoaWRPckFubm90YXRpb24sIGFubm90YXRpb24pIHtcbiAgICAgICAgbGV0IGlkO1xuICAgICAgICBpZiAoQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoaWRPckFubm90YXRpb24pKSB7XG4gICAgICAgICAgICBpZCA9IGlkT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWQgPSB0aGlzLm5leHRJZCgpO1xuICAgICAgICAgICAgYW5ub3RhdGlvbiA9IGlkT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9hbm5vdGF0aW9uc1tpZF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJZCAke2lkfSBpcyBhbHJlYWR5IGluIHVzZS5gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGFubm90YXRpb24gcHJvdmlkZWQgZm9yIGlkICR7aWR9YCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fYW5ub3RhdGlvbnNbaWRdID0gYW5ub3RhdGlvbjtcbiAgICAgICAgdGhpcy5fc2l6ZSsrO1xuICAgICAgICByZXR1cm4gaWQ7XG4gICAgfVxuICAgIG5leHRJZCgpIHtcbiAgICAgICAgdGhpcy5fY291bnRlcisrO1xuICAgICAgICByZXR1cm4gdGhpcy5fY291bnRlci50b1N0cmluZygpO1xuICAgIH1cbn1cbi8qKlxuICogQSB3b3Jrc3BhY2UgY2hhbmdlIGhlbHBzIGNvbnN0cnVjdGluZyBjaGFuZ2VzIHRvIGEgd29ya3NwYWNlLlxuICovXG5leHBvcnQgY2xhc3MgV29ya3NwYWNlQ2hhbmdlIHtcbiAgICBjb25zdHJ1Y3Rvcih3b3Jrc3BhY2VFZGl0KSB7XG4gICAgICAgIHRoaXMuX3RleHRFZGl0Q2hhbmdlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIGlmICh3b3Jrc3BhY2VFZGl0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQgPSB3b3Jrc3BhY2VFZGl0O1xuICAgICAgICAgICAgaWYgKHdvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMgPSBuZXcgQ2hhbmdlQW5ub3RhdGlvbnMod29ya3NwYWNlRWRpdC5jaGFuZ2VBbm5vdGF0aW9ucyk7XG4gICAgICAgICAgICAgICAgd29ya3NwYWNlRWRpdC5jaGFuZ2VBbm5vdGF0aW9ucyA9IHRoaXMuX2NoYW5nZUFubm90YXRpb25zLmFsbCgpO1xuICAgICAgICAgICAgICAgIHdvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzLmZvckVhY2goKGNoYW5nZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoVGV4dERvY3VtZW50RWRpdC5pcyhjaGFuZ2UpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0RWRpdENoYW5nZSA9IG5ldyBUZXh0RWRpdENoYW5nZUltcGwoY2hhbmdlLmVkaXRzLCB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXh0RWRpdENoYW5nZXNbY2hhbmdlLnRleHREb2N1bWVudC51cmldID0gdGV4dEVkaXRDaGFuZ2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHdvcmtzcGFjZUVkaXQuY2hhbmdlcykge1xuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHdvcmtzcGFjZUVkaXQuY2hhbmdlcykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHRFZGl0Q2hhbmdlID0gbmV3IFRleHRFZGl0Q2hhbmdlSW1wbCh3b3Jrc3BhY2VFZGl0LmNoYW5nZXNba2V5XSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RleHRFZGl0Q2hhbmdlc1trZXldID0gdGV4dEVkaXRDaGFuZ2U7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0ID0ge307XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdW5kZXJseWluZyB7QGxpbmsgV29ya3NwYWNlRWRpdH0gbGl0ZXJhbFxuICAgICAqIHVzZSB0byBiZSByZXR1cm5lZCBmcm9tIGEgd29ya3NwYWNlIGVkaXQgb3BlcmF0aW9uIGxpa2UgcmVuYW1lLlxuICAgICAqL1xuICAgIGdldCBlZGl0KCkge1xuICAgICAgICB0aGlzLmluaXREb2N1bWVudENoYW5nZXMoKTtcbiAgICAgICAgaWYgKHRoaXMuX2NoYW5nZUFubm90YXRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5zaXplID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VBbm5vdGF0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlQW5ub3RhdGlvbnMgPSB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5hbGwoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fd29ya3NwYWNlRWRpdDtcbiAgICB9XG4gICAgZ2V0VGV4dEVkaXRDaGFuZ2Uoa2V5KSB7XG4gICAgICAgIGlmIChPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIuaXMoa2V5KSkge1xuICAgICAgICAgICAgdGhpcy5pbml0RG9jdW1lbnRDaGFuZ2VzKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV29ya3NwYWNlIGVkaXQgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIGRvY3VtZW50IGNoYW5nZXMuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0ZXh0RG9jdW1lbnQgPSB7IHVyaToga2V5LnVyaSwgdmVyc2lvbjoga2V5LnZlcnNpb24gfTtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLl90ZXh0RWRpdENoYW5nZXNbdGV4dERvY3VtZW50LnVyaV07XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVkaXRzID0gW107XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dERvY3VtZW50RWRpdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dERvY3VtZW50LFxuICAgICAgICAgICAgICAgICAgICBlZGl0c1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMucHVzaCh0ZXh0RG9jdW1lbnRFZGl0KTtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgVGV4dEVkaXRDaGFuZ2VJbXBsKGVkaXRzLCB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGV4dEVkaXRDaGFuZ2VzW3RleHREb2N1bWVudC51cmldID0gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdENoYW5nZXMoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV29ya3NwYWNlIGVkaXQgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIG5vcm1hbCB0ZXh0IGVkaXQgY2hhbmdlcy4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLl90ZXh0RWRpdENoYW5nZXNba2V5XTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgbGV0IGVkaXRzID0gW107XG4gICAgICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VzW2tleV0gPSBlZGl0cztcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgVGV4dEVkaXRDaGFuZ2VJbXBsKGVkaXRzKTtcbiAgICAgICAgICAgICAgICB0aGlzLl90ZXh0RWRpdENoYW5nZXNba2V5XSA9IHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaW5pdERvY3VtZW50Q2hhbmdlcygpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzID09PSB1bmRlZmluZWQgJiYgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZUFubm90YXRpb25zID0gbmV3IENoYW5nZUFubm90YXRpb25zKCk7XG4gICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VBbm5vdGF0aW9ucyA9IHRoaXMuX2NoYW5nZUFubm90YXRpb25zLmFsbCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGluaXRDaGFuZ2VzKCkge1xuICAgICAgICBpZiAodGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMgPT09IHVuZGVmaW5lZCAmJiB0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjcmVhdGVGaWxlKHVyaSwgb3B0aW9uc09yQW5ub3RhdGlvbiwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLmluaXREb2N1bWVudENoYW5nZXMoKTtcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV29ya3NwYWNlIGVkaXQgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIGRvY3VtZW50IGNoYW5nZXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGFubm90YXRpb247XG4gICAgICAgIGlmIChDaGFuZ2VBbm5vdGF0aW9uLmlzKG9wdGlvbnNPckFubm90YXRpb24pIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKG9wdGlvbnNPckFubm90YXRpb24pKSB7XG4gICAgICAgICAgICBhbm5vdGF0aW9uID0gb3B0aW9uc09yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGxldCBvcGVyYXRpb247XG4gICAgICAgIGxldCBpZDtcbiAgICAgICAgaWYgKGFubm90YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3BlcmF0aW9uID0gQ3JlYXRlRmlsZS5jcmVhdGUodXJpLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlkID0gQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoYW5ub3RhdGlvbikgPyBhbm5vdGF0aW9uIDogdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMubWFuYWdlKGFubm90YXRpb24pO1xuICAgICAgICAgICAgb3BlcmF0aW9uID0gQ3JlYXRlRmlsZS5jcmVhdGUodXJpLCBvcHRpb25zLCBpZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMucHVzaChvcGVyYXRpb24pO1xuICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlbmFtZUZpbGUob2xkVXJpLCBuZXdVcmksIG9wdGlvbnNPckFubm90YXRpb24sIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5pbml0RG9jdW1lbnRDaGFuZ2VzKCk7XG4gICAgICAgIGlmICh0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dvcmtzcGFjZSBlZGl0IGlzIG5vdCBjb25maWd1cmVkIGZvciBkb2N1bWVudCBjaGFuZ2VzLicpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhbm5vdGF0aW9uO1xuICAgICAgICBpZiAoQ2hhbmdlQW5ub3RhdGlvbi5pcyhvcHRpb25zT3JBbm5vdGF0aW9uKSB8fCBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhvcHRpb25zT3JBbm5vdGF0aW9uKSkge1xuICAgICAgICAgICAgYW5ub3RhdGlvbiA9IG9wdGlvbnNPckFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvcHRpb25zID0gb3B0aW9uc09yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb3BlcmF0aW9uO1xuICAgICAgICBsZXQgaWQ7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wZXJhdGlvbiA9IFJlbmFtZUZpbGUuY3JlYXRlKG9sZFVyaSwgbmV3VXJpLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlkID0gQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoYW5ub3RhdGlvbikgPyBhbm5vdGF0aW9uIDogdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMubWFuYWdlKGFubm90YXRpb24pO1xuICAgICAgICAgICAgb3BlcmF0aW9uID0gUmVuYW1lRmlsZS5jcmVhdGUob2xkVXJpLCBuZXdVcmksIG9wdGlvbnMsIGlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcy5wdXNoKG9wZXJhdGlvbik7XG4gICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVsZXRlRmlsZSh1cmksIG9wdGlvbnNPckFubm90YXRpb24sIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5pbml0RG9jdW1lbnRDaGFuZ2VzKCk7XG4gICAgICAgIGlmICh0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dvcmtzcGFjZSBlZGl0IGlzIG5vdCBjb25maWd1cmVkIGZvciBkb2N1bWVudCBjaGFuZ2VzLicpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhbm5vdGF0aW9uO1xuICAgICAgICBpZiAoQ2hhbmdlQW5ub3RhdGlvbi5pcyhvcHRpb25zT3JBbm5vdGF0aW9uKSB8fCBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhvcHRpb25zT3JBbm5vdGF0aW9uKSkge1xuICAgICAgICAgICAgYW5ub3RhdGlvbiA9IG9wdGlvbnNPckFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvcHRpb25zID0gb3B0aW9uc09yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb3BlcmF0aW9uO1xuICAgICAgICBsZXQgaWQ7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wZXJhdGlvbiA9IERlbGV0ZUZpbGUuY3JlYXRlKHVyaSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZCA9IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGFubm90YXRpb24pID8gYW5ub3RhdGlvbiA6IHRoaXMuX2NoYW5nZUFubm90YXRpb25zLm1hbmFnZShhbm5vdGF0aW9uKTtcbiAgICAgICAgICAgIG9wZXJhdGlvbiA9IERlbGV0ZUZpbGUuY3JlYXRlKHVyaSwgb3B0aW9ucywgaWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzLnB1c2gob3BlcmF0aW9uKTtcbiAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogVGhlIFRleHREb2N1bWVudElkZW50aWZpZXIgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgVGV4dERvY3VtZW50SWRlbnRpZmllcn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgVGV4dERvY3VtZW50SWRlbnRpZmllcjtcbihmdW5jdGlvbiAoVGV4dERvY3VtZW50SWRlbnRpZmllcikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgVGV4dERvY3VtZW50SWRlbnRpZmllciBsaXRlcmFsLlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIGRvY3VtZW50J3MgdXJpLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmkpIHtcbiAgICAgICAgcmV0dXJuIHsgdXJpIH07XG4gICAgfVxuICAgIFRleHREb2N1bWVudElkZW50aWZpZXIuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgVGV4dERvY3VtZW50SWRlbnRpZmllcn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSk7XG4gICAgfVxuICAgIFRleHREb2N1bWVudElkZW50aWZpZXIuaXMgPSBpcztcbn0pKFRleHREb2N1bWVudElkZW50aWZpZXIgfHwgKFRleHREb2N1bWVudElkZW50aWZpZXIgPSB7fSkpO1xuLyoqXG4gKiBUaGUgVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyO1xuKGZ1bmN0aW9uIChWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIGxpdGVyYWwuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgZG9jdW1lbnQncyB1cmkuXG4gICAgICogQHBhcmFtIHZlcnNpb24gVGhlIGRvY3VtZW50J3MgdmVyc2lvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodXJpLCB2ZXJzaW9uKSB7XG4gICAgICAgIHJldHVybiB7IHVyaSwgdmVyc2lvbiB9O1xuICAgIH1cbiAgICBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXJ9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpICYmIElzLmludGVnZXIoY2FuZGlkYXRlLnZlcnNpb24pO1xuICAgIH1cbiAgICBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmlzID0gaXM7XG59KShWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIHx8IChWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyID0ge30pKTtcbi8qKlxuICogVGhlIE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXJ9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcjtcbihmdW5jdGlvbiAoT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIgbGl0ZXJhbC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSBkb2N1bWVudCdzIHVyaS5cbiAgICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgZG9jdW1lbnQncyB2ZXJzaW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmksIHZlcnNpb24pIHtcbiAgICAgICAgcmV0dXJuIHsgdXJpLCB2ZXJzaW9uIH07XG4gICAgfVxuICAgIE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllci5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXJ9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpICYmIChjYW5kaWRhdGUudmVyc2lvbiA9PT0gbnVsbCB8fCBJcy5pbnRlZ2VyKGNhbmRpZGF0ZS52ZXJzaW9uKSk7XG4gICAgfVxuICAgIE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllci5pcyA9IGlzO1xufSkoT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIHx8IChPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIgPSB7fSkpO1xuLyoqXG4gKiBUaGUgVGV4dERvY3VtZW50SXRlbSBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBUZXh0RG9jdW1lbnRJdGVtfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBUZXh0RG9jdW1lbnRJdGVtO1xuKGZ1bmN0aW9uIChUZXh0RG9jdW1lbnRJdGVtKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBUZXh0RG9jdW1lbnRJdGVtIGxpdGVyYWwuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgZG9jdW1lbnQncyB1cmkuXG4gICAgICogQHBhcmFtIGxhbmd1YWdlSWQgVGhlIGRvY3VtZW50J3MgbGFuZ3VhZ2UgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgZG9jdW1lbnQncyB2ZXJzaW9uIG51bWJlci5cbiAgICAgKiBAcGFyYW0gdGV4dCBUaGUgZG9jdW1lbnQncyB0ZXh0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmksIGxhbmd1YWdlSWQsIHZlcnNpb24sIHRleHQpIHtcbiAgICAgICAgcmV0dXJuIHsgdXJpLCBsYW5ndWFnZUlkLCB2ZXJzaW9uLCB0ZXh0IH07XG4gICAgfVxuICAgIFRleHREb2N1bWVudEl0ZW0uY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgVGV4dERvY3VtZW50SXRlbX0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5sYW5ndWFnZUlkKSAmJiBJcy5pbnRlZ2VyKGNhbmRpZGF0ZS52ZXJzaW9uKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnRleHQpO1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnRJdGVtLmlzID0gaXM7XG59KShUZXh0RG9jdW1lbnRJdGVtIHx8IChUZXh0RG9jdW1lbnRJdGVtID0ge30pKTtcbi8qKlxuICogRGVzY3JpYmVzIHRoZSBjb250ZW50IHR5cGUgdGhhdCBhIGNsaWVudCBzdXBwb3J0cyBpbiB2YXJpb3VzXG4gKiByZXN1bHQgbGl0ZXJhbHMgbGlrZSBgSG92ZXJgLCBgUGFyYW1ldGVySW5mb2Agb3IgYENvbXBsZXRpb25JdGVtYC5cbiAqXG4gKiBQbGVhc2Ugbm90ZSB0aGF0IGBNYXJrdXBLaW5kc2AgbXVzdCBub3Qgc3RhcnQgd2l0aCBhIGAkYC4gVGhpcyBraW5kc1xuICogYXJlIHJlc2VydmVkIGZvciBpbnRlcm5hbCB1c2FnZS5cbiAqL1xuZXhwb3J0IHZhciBNYXJrdXBLaW5kO1xuKGZ1bmN0aW9uIChNYXJrdXBLaW5kKSB7XG4gICAgLyoqXG4gICAgICogUGxhaW4gdGV4dCBpcyBzdXBwb3J0ZWQgYXMgYSBjb250ZW50IGZvcm1hdFxuICAgICAqL1xuICAgIE1hcmt1cEtpbmQuUGxhaW5UZXh0ID0gJ3BsYWludGV4dCc7XG4gICAgLyoqXG4gICAgICogTWFya2Rvd24gaXMgc3VwcG9ydGVkIGFzIGEgY29udGVudCBmb3JtYXRcbiAgICAgKi9cbiAgICBNYXJrdXBLaW5kLk1hcmtkb3duID0gJ21hcmtkb3duJztcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgaXMgYSB2YWx1ZSBvZiB0aGUge0BsaW5rIE1hcmt1cEtpbmR9IHR5cGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgPT09IE1hcmt1cEtpbmQuUGxhaW5UZXh0IHx8IGNhbmRpZGF0ZSA9PT0gTWFya3VwS2luZC5NYXJrZG93bjtcbiAgICB9XG4gICAgTWFya3VwS2luZC5pcyA9IGlzO1xufSkoTWFya3VwS2luZCB8fCAoTWFya3VwS2luZCA9IHt9KSk7XG5leHBvcnQgdmFyIE1hcmt1cENvbnRlbnQ7XG4oZnVuY3Rpb24gKE1hcmt1cENvbnRlbnQpIHtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgY29uZm9ybXMgdG8gdGhlIHtAbGluayBNYXJrdXBDb250ZW50fSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKHZhbHVlKSAmJiBNYXJrdXBLaW5kLmlzKGNhbmRpZGF0ZS5raW5kKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnZhbHVlKTtcbiAgICB9XG4gICAgTWFya3VwQ29udGVudC5pcyA9IGlzO1xufSkoTWFya3VwQ29udGVudCB8fCAoTWFya3VwQ29udGVudCA9IHt9KSk7XG4vKipcbiAqIFRoZSBraW5kIG9mIGEgY29tcGxldGlvbiBlbnRyeS5cbiAqL1xuZXhwb3J0IHZhciBDb21wbGV0aW9uSXRlbUtpbmQ7XG4oZnVuY3Rpb24gKENvbXBsZXRpb25JdGVtS2luZCkge1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5UZXh0ID0gMTtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuTWV0aG9kID0gMjtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuRnVuY3Rpb24gPSAzO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5Db25zdHJ1Y3RvciA9IDQ7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkZpZWxkID0gNTtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuVmFyaWFibGUgPSA2O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5DbGFzcyA9IDc7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkludGVyZmFjZSA9IDg7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLk1vZHVsZSA9IDk7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlByb3BlcnR5ID0gMTA7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlVuaXQgPSAxMTtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuVmFsdWUgPSAxMjtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuRW51bSA9IDEzO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5LZXl3b3JkID0gMTQ7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlNuaXBwZXQgPSAxNTtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuQ29sb3IgPSAxNjtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuRmlsZSA9IDE3O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5SZWZlcmVuY2UgPSAxODtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuRm9sZGVyID0gMTk7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkVudW1NZW1iZXIgPSAyMDtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuQ29uc3RhbnQgPSAyMTtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuU3RydWN0ID0gMjI7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkV2ZW50ID0gMjM7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLk9wZXJhdG9yID0gMjQ7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlR5cGVQYXJhbWV0ZXIgPSAyNTtcbn0pKENvbXBsZXRpb25JdGVtS2luZCB8fCAoQ29tcGxldGlvbkl0ZW1LaW5kID0ge30pKTtcbi8qKlxuICogRGVmaW5lcyB3aGV0aGVyIHRoZSBpbnNlcnQgdGV4dCBpbiBhIGNvbXBsZXRpb24gaXRlbSBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXNcbiAqIHBsYWluIHRleHQgb3IgYSBzbmlwcGV0LlxuICovXG5leHBvcnQgdmFyIEluc2VydFRleHRGb3JtYXQ7XG4oZnVuY3Rpb24gKEluc2VydFRleHRGb3JtYXQpIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpbWFyeSB0ZXh0IHRvIGJlIGluc2VydGVkIGlzIHRyZWF0ZWQgYXMgYSBwbGFpbiBzdHJpbmcuXG4gICAgICovXG4gICAgSW5zZXJ0VGV4dEZvcm1hdC5QbGFpblRleHQgPSAxO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcmltYXJ5IHRleHQgdG8gYmUgaW5zZXJ0ZWQgaXMgdHJlYXRlZCBhcyBhIHNuaXBwZXQuXG4gICAgICpcbiAgICAgKiBBIHNuaXBwZXQgY2FuIGRlZmluZSB0YWIgc3RvcHMgYW5kIHBsYWNlaG9sZGVycyB3aXRoIGAkMWAsIGAkMmBcbiAgICAgKiBhbmQgYCR7Mzpmb299YC4gYCQwYCBkZWZpbmVzIHRoZSBmaW5hbCB0YWIgc3RvcCwgaXQgZGVmYXVsdHMgdG9cbiAgICAgKiB0aGUgZW5kIG9mIHRoZSBzbmlwcGV0LiBQbGFjZWhvbGRlcnMgd2l0aCBlcXVhbCBpZGVudGlmaWVycyBhcmUgbGlua2VkLFxuICAgICAqIHRoYXQgaXMgdHlwaW5nIGluIG9uZSB3aWxsIHVwZGF0ZSBvdGhlcnMgdG9vLlxuICAgICAqXG4gICAgICogU2VlIGFsc286IGh0dHBzOi8vbWljcm9zb2Z0LmdpdGh1Yi5pby9sYW5ndWFnZS1zZXJ2ZXItcHJvdG9jb2wvc3BlY2lmaWNhdGlvbnMvc3BlY2lmaWNhdGlvbi1jdXJyZW50LyNzbmlwcGV0X3N5bnRheFxuICAgICAqL1xuICAgIEluc2VydFRleHRGb3JtYXQuU25pcHBldCA9IDI7XG59KShJbnNlcnRUZXh0Rm9ybWF0IHx8IChJbnNlcnRUZXh0Rm9ybWF0ID0ge30pKTtcbi8qKlxuICogQ29tcGxldGlvbiBpdGVtIHRhZ3MgYXJlIGV4dHJhIGFubm90YXRpb25zIHRoYXQgdHdlYWsgdGhlIHJlbmRlcmluZyBvZiBhIGNvbXBsZXRpb25cbiAqIGl0ZW0uXG4gKlxuICogQHNpbmNlIDMuMTUuMFxuICovXG5leHBvcnQgdmFyIENvbXBsZXRpb25JdGVtVGFnO1xuKGZ1bmN0aW9uIChDb21wbGV0aW9uSXRlbVRhZykge1xuICAgIC8qKlxuICAgICAqIFJlbmRlciBhIGNvbXBsZXRpb24gYXMgb2Jzb2xldGUsIHVzdWFsbHkgdXNpbmcgYSBzdHJpa2Utb3V0LlxuICAgICAqL1xuICAgIENvbXBsZXRpb25JdGVtVGFnLkRlcHJlY2F0ZWQgPSAxO1xufSkoQ29tcGxldGlvbkl0ZW1UYWcgfHwgKENvbXBsZXRpb25JdGVtVGFnID0ge30pKTtcbi8qKlxuICogVGhlIEluc2VydFJlcGxhY2VFZGl0IG5hbWVzcGFjZSBwcm92aWRlcyBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIGluc2VydCAvIHJlcGxhY2UgZWRpdHMuXG4gKlxuICogQHNpbmNlIDMuMTYuMFxuICovXG5leHBvcnQgdmFyIEluc2VydFJlcGxhY2VFZGl0O1xuKGZ1bmN0aW9uIChJbnNlcnRSZXBsYWNlRWRpdCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zZXJ0IC8gcmVwbGFjZSBlZGl0XG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKG5ld1RleHQsIGluc2VydCwgcmVwbGFjZSkge1xuICAgICAgICByZXR1cm4geyBuZXdUZXh0LCBpbnNlcnQsIHJlcGxhY2UgfTtcbiAgICB9XG4gICAgSW5zZXJ0UmVwbGFjZUVkaXQuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgSW5zZXJ0UmVwbGFjZUVkaXR9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLm5ld1RleHQpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5pbnNlcnQpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yZXBsYWNlKTtcbiAgICB9XG4gICAgSW5zZXJ0UmVwbGFjZUVkaXQuaXMgPSBpcztcbn0pKEluc2VydFJlcGxhY2VFZGl0IHx8IChJbnNlcnRSZXBsYWNlRWRpdCA9IHt9KSk7XG4vKipcbiAqIEhvdyB3aGl0ZXNwYWNlIGFuZCBpbmRlbnRhdGlvbiBpcyBoYW5kbGVkIGR1cmluZyBjb21wbGV0aW9uXG4gKiBpdGVtIGluc2VydGlvbi5cbiAqXG4gKiBAc2luY2UgMy4xNi4wXG4gKi9cbmV4cG9ydCB2YXIgSW5zZXJ0VGV4dE1vZGU7XG4oZnVuY3Rpb24gKEluc2VydFRleHRNb2RlKSB7XG4gICAgLyoqXG4gICAgICogVGhlIGluc2VydGlvbiBvciByZXBsYWNlIHN0cmluZ3MgaXMgdGFrZW4gYXMgaXQgaXMuIElmIHRoZVxuICAgICAqIHZhbHVlIGlzIG11bHRpIGxpbmUgdGhlIGxpbmVzIGJlbG93IHRoZSBjdXJzb3Igd2lsbCBiZVxuICAgICAqIGluc2VydGVkIHVzaW5nIHRoZSBpbmRlbnRhdGlvbiBkZWZpbmVkIGluIHRoZSBzdHJpbmcgdmFsdWUuXG4gICAgICogVGhlIGNsaWVudCB3aWxsIG5vdCBhcHBseSBhbnkga2luZCBvZiBhZGp1c3RtZW50cyB0byB0aGVcbiAgICAgKiBzdHJpbmcuXG4gICAgICovXG4gICAgSW5zZXJ0VGV4dE1vZGUuYXNJcyA9IDE7XG4gICAgLyoqXG4gICAgICogVGhlIGVkaXRvciBhZGp1c3RzIGxlYWRpbmcgd2hpdGVzcGFjZSBvZiBuZXcgbGluZXMgc28gdGhhdFxuICAgICAqIHRoZXkgbWF0Y2ggdGhlIGluZGVudGF0aW9uIHVwIHRvIHRoZSBjdXJzb3Igb2YgdGhlIGxpbmUgZm9yXG4gICAgICogd2hpY2ggdGhlIGl0ZW0gaXMgYWNjZXB0ZWQuXG4gICAgICpcbiAgICAgKiBDb25zaWRlciBhIGxpbmUgbGlrZSB0aGlzOiA8MnRhYnM+PGN1cnNvcj48M3RhYnM+Zm9vLiBBY2NlcHRpbmcgYVxuICAgICAqIG11bHRpIGxpbmUgY29tcGxldGlvbiBpdGVtIGlzIGluZGVudGVkIHVzaW5nIDIgdGFicyBhbmQgYWxsXG4gICAgICogZm9sbG93aW5nIGxpbmVzIGluc2VydGVkIHdpbGwgYmUgaW5kZW50ZWQgdXNpbmcgMiB0YWJzIGFzIHdlbGwuXG4gICAgICovXG4gICAgSW5zZXJ0VGV4dE1vZGUuYWRqdXN0SW5kZW50YXRpb24gPSAyO1xufSkoSW5zZXJ0VGV4dE1vZGUgfHwgKEluc2VydFRleHRNb2RlID0ge30pKTtcbmV4cG9ydCB2YXIgQ29tcGxldGlvbkl0ZW1MYWJlbERldGFpbHM7XG4oZnVuY3Rpb24gKENvbXBsZXRpb25JdGVtTGFiZWxEZXRhaWxzKSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgKElzLnN0cmluZyhjYW5kaWRhdGUuZGV0YWlsKSB8fCBjYW5kaWRhdGUuZGV0YWlsID09PSB1bmRlZmluZWQpICYmXG4gICAgICAgICAgICAoSXMuc3RyaW5nKGNhbmRpZGF0ZS5kZXNjcmlwdGlvbikgfHwgY2FuZGlkYXRlLmRlc2NyaXB0aW9uID09PSB1bmRlZmluZWQpO1xuICAgIH1cbiAgICBDb21wbGV0aW9uSXRlbUxhYmVsRGV0YWlscy5pcyA9IGlzO1xufSkoQ29tcGxldGlvbkl0ZW1MYWJlbERldGFpbHMgfHwgKENvbXBsZXRpb25JdGVtTGFiZWxEZXRhaWxzID0ge30pKTtcbi8qKlxuICogVGhlIENvbXBsZXRpb25JdGVtIG5hbWVzcGFjZSBwcm92aWRlcyBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoXG4gKiBjb21wbGV0aW9uIGl0ZW1zLlxuICovXG5leHBvcnQgdmFyIENvbXBsZXRpb25JdGVtO1xuKGZ1bmN0aW9uIChDb21wbGV0aW9uSXRlbSkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIGNvbXBsZXRpb24gaXRlbSBhbmQgc2VlZCBpdCB3aXRoIGEgbGFiZWwuXG4gICAgICogQHBhcmFtIGxhYmVsIFRoZSBjb21wbGV0aW9uIGl0ZW0ncyBsYWJlbFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShsYWJlbCkge1xuICAgICAgICByZXR1cm4geyBsYWJlbCB9O1xuICAgIH1cbiAgICBDb21wbGV0aW9uSXRlbS5jcmVhdGUgPSBjcmVhdGU7XG59KShDb21wbGV0aW9uSXRlbSB8fCAoQ29tcGxldGlvbkl0ZW0gPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29tcGxldGlvbkxpc3QgbmFtZXNwYWNlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGhcbiAqIGNvbXBsZXRpb24gbGlzdHMuXG4gKi9cbmV4cG9ydCB2YXIgQ29tcGxldGlvbkxpc3Q7XG4oZnVuY3Rpb24gKENvbXBsZXRpb25MaXN0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBjb21wbGV0aW9uIGxpc3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaXRlbXMgVGhlIGNvbXBsZXRpb24gaXRlbXMuXG4gICAgICogQHBhcmFtIGlzSW5jb21wbGV0ZSBUaGUgbGlzdCBpcyBub3QgY29tcGxldGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGl0ZW1zLCBpc0luY29tcGxldGUpIHtcbiAgICAgICAgcmV0dXJuIHsgaXRlbXM6IGl0ZW1zID8gaXRlbXMgOiBbXSwgaXNJbmNvbXBsZXRlOiAhIWlzSW5jb21wbGV0ZSB9O1xuICAgIH1cbiAgICBDb21wbGV0aW9uTGlzdC5jcmVhdGUgPSBjcmVhdGU7XG59KShDb21wbGV0aW9uTGlzdCB8fCAoQ29tcGxldGlvbkxpc3QgPSB7fSkpO1xuZXhwb3J0IHZhciBNYXJrZWRTdHJpbmc7XG4oZnVuY3Rpb24gKE1hcmtlZFN0cmluZykge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBtYXJrZWQgc3RyaW5nIGZyb20gcGxhaW4gdGV4dC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwbGFpblRleHQgVGhlIHBsYWluIHRleHQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZnJvbVBsYWluVGV4dChwbGFpblRleHQpIHtcbiAgICAgICAgcmV0dXJuIHBsYWluVGV4dC5yZXBsYWNlKC9bXFxcXGAqX3t9W1xcXSgpIytcXC0uIV0vZywgJ1xcXFwkJicpOyAvLyBlc2NhcGUgbWFya2Rvd24gc3ludGF4IHRva2VuczogaHR0cDovL2RhcmluZ2ZpcmViYWxsLm5ldC9wcm9qZWN0cy9tYXJrZG93bi9zeW50YXgjYmFja3NsYXNoXG4gICAgfVxuICAgIE1hcmtlZFN0cmluZy5mcm9tUGxhaW5UZXh0ID0gZnJvbVBsYWluVGV4dDtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgY29uZm9ybXMgdG8gdGhlIHtAbGluayBNYXJrZWRTdHJpbmd9IHR5cGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5zdHJpbmcoY2FuZGlkYXRlKSB8fCAoSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUubGFuZ3VhZ2UpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudmFsdWUpKTtcbiAgICB9XG4gICAgTWFya2VkU3RyaW5nLmlzID0gaXM7XG59KShNYXJrZWRTdHJpbmcgfHwgKE1hcmtlZFN0cmluZyA9IHt9KSk7XG5leHBvcnQgdmFyIEhvdmVyO1xuKGZ1bmN0aW9uIChIb3Zlcikge1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBjb25mb3JtcyB0byB0aGUge0BsaW5rIEhvdmVyfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gISFjYW5kaWRhdGUgJiYgSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIChNYXJrdXBDb250ZW50LmlzKGNhbmRpZGF0ZS5jb250ZW50cykgfHxcbiAgICAgICAgICAgIE1hcmtlZFN0cmluZy5pcyhjYW5kaWRhdGUuY29udGVudHMpIHx8XG4gICAgICAgICAgICBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS5jb250ZW50cywgTWFya2VkU3RyaW5nLmlzKSkgJiYgKHZhbHVlLnJhbmdlID09PSB1bmRlZmluZWQgfHwgUmFuZ2UuaXModmFsdWUucmFuZ2UpKTtcbiAgICB9XG4gICAgSG92ZXIuaXMgPSBpcztcbn0pKEhvdmVyIHx8IChIb3ZlciA9IHt9KSk7XG4vKipcbiAqIFRoZSBQYXJhbWV0ZXJJbmZvcm1hdGlvbiBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBQYXJhbWV0ZXJJbmZvcm1hdGlvbn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgUGFyYW1ldGVySW5mb3JtYXRpb247XG4oZnVuY3Rpb24gKFBhcmFtZXRlckluZm9ybWF0aW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBwYXJhbWV0ZXIgaW5mb3JtYXRpb24gbGl0ZXJhbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBsYWJlbCBBIGxhYmVsIHN0cmluZy5cbiAgICAgKiBAcGFyYW0gZG9jdW1lbnRhdGlvbiBBIGRvYyBzdHJpbmcuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGxhYmVsLCBkb2N1bWVudGF0aW9uKSB7XG4gICAgICAgIHJldHVybiBkb2N1bWVudGF0aW9uID8geyBsYWJlbCwgZG9jdW1lbnRhdGlvbiB9IDogeyBsYWJlbCB9O1xuICAgIH1cbiAgICBQYXJhbWV0ZXJJbmZvcm1hdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG59KShQYXJhbWV0ZXJJbmZvcm1hdGlvbiB8fCAoUGFyYW1ldGVySW5mb3JtYXRpb24gPSB7fSkpO1xuLyoqXG4gKiBUaGUgU2lnbmF0dXJlSW5mb3JtYXRpb24gbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgU2lnbmF0dXJlSW5mb3JtYXRpb259IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIFNpZ25hdHVyZUluZm9ybWF0aW9uO1xuKGZ1bmN0aW9uIChTaWduYXR1cmVJbmZvcm1hdGlvbikge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShsYWJlbCwgZG9jdW1lbnRhdGlvbiwgLi4ucGFyYW1ldGVycykge1xuICAgICAgICBsZXQgcmVzdWx0ID0geyBsYWJlbCB9O1xuICAgICAgICBpZiAoSXMuZGVmaW5lZChkb2N1bWVudGF0aW9uKSkge1xuICAgICAgICAgICAgcmVzdWx0LmRvY3VtZW50YXRpb24gPSBkb2N1bWVudGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKHBhcmFtZXRlcnMpKSB7XG4gICAgICAgICAgICByZXN1bHQucGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQucGFyYW1ldGVycyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIFNpZ25hdHVyZUluZm9ybWF0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKFNpZ25hdHVyZUluZm9ybWF0aW9uIHx8IChTaWduYXR1cmVJbmZvcm1hdGlvbiA9IHt9KSk7XG4vKipcbiAqIEEgZG9jdW1lbnQgaGlnaGxpZ2h0IGtpbmQuXG4gKi9cbmV4cG9ydCB2YXIgRG9jdW1lbnRIaWdobGlnaHRLaW5kO1xuKGZ1bmN0aW9uIChEb2N1bWVudEhpZ2hsaWdodEtpbmQpIHtcbiAgICAvKipcbiAgICAgKiBBIHRleHR1YWwgb2NjdXJyZW5jZS5cbiAgICAgKi9cbiAgICBEb2N1bWVudEhpZ2hsaWdodEtpbmQuVGV4dCA9IDE7XG4gICAgLyoqXG4gICAgICogUmVhZC1hY2Nlc3Mgb2YgYSBzeW1ib2wsIGxpa2UgcmVhZGluZyBhIHZhcmlhYmxlLlxuICAgICAqL1xuICAgIERvY3VtZW50SGlnaGxpZ2h0S2luZC5SZWFkID0gMjtcbiAgICAvKipcbiAgICAgKiBXcml0ZS1hY2Nlc3Mgb2YgYSBzeW1ib2wsIGxpa2Ugd3JpdGluZyB0byBhIHZhcmlhYmxlLlxuICAgICAqL1xuICAgIERvY3VtZW50SGlnaGxpZ2h0S2luZC5Xcml0ZSA9IDM7XG59KShEb2N1bWVudEhpZ2hsaWdodEtpbmQgfHwgKERvY3VtZW50SGlnaGxpZ2h0S2luZCA9IHt9KSk7XG4vKipcbiAqIERvY3VtZW50SGlnaGxpZ2h0IG5hbWVzcGFjZSB0byBwcm92aWRlIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgRG9jdW1lbnRIaWdobGlnaHR9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIERvY3VtZW50SGlnaGxpZ2h0O1xuKGZ1bmN0aW9uIChEb2N1bWVudEhpZ2hsaWdodCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIERvY3VtZW50SGlnaGxpZ2h0IG9iamVjdC5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlIHRoZSBoaWdobGlnaHQgYXBwbGllcyB0by5cbiAgICAgKiBAcGFyYW0ga2luZCBUaGUgaGlnaGxpZ2h0IGtpbmRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIGtpbmQpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHsgcmFuZ2UgfTtcbiAgICAgICAgaWYgKElzLm51bWJlcihraW5kKSkge1xuICAgICAgICAgICAgcmVzdWx0LmtpbmQgPSBraW5kO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIERvY3VtZW50SGlnaGxpZ2h0LmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKERvY3VtZW50SGlnaGxpZ2h0IHx8IChEb2N1bWVudEhpZ2hsaWdodCA9IHt9KSk7XG4vKipcbiAqIEEgc3ltYm9sIGtpbmQuXG4gKi9cbmV4cG9ydCB2YXIgU3ltYm9sS2luZDtcbihmdW5jdGlvbiAoU3ltYm9sS2luZCkge1xuICAgIFN5bWJvbEtpbmQuRmlsZSA9IDE7XG4gICAgU3ltYm9sS2luZC5Nb2R1bGUgPSAyO1xuICAgIFN5bWJvbEtpbmQuTmFtZXNwYWNlID0gMztcbiAgICBTeW1ib2xLaW5kLlBhY2thZ2UgPSA0O1xuICAgIFN5bWJvbEtpbmQuQ2xhc3MgPSA1O1xuICAgIFN5bWJvbEtpbmQuTWV0aG9kID0gNjtcbiAgICBTeW1ib2xLaW5kLlByb3BlcnR5ID0gNztcbiAgICBTeW1ib2xLaW5kLkZpZWxkID0gODtcbiAgICBTeW1ib2xLaW5kLkNvbnN0cnVjdG9yID0gOTtcbiAgICBTeW1ib2xLaW5kLkVudW0gPSAxMDtcbiAgICBTeW1ib2xLaW5kLkludGVyZmFjZSA9IDExO1xuICAgIFN5bWJvbEtpbmQuRnVuY3Rpb24gPSAxMjtcbiAgICBTeW1ib2xLaW5kLlZhcmlhYmxlID0gMTM7XG4gICAgU3ltYm9sS2luZC5Db25zdGFudCA9IDE0O1xuICAgIFN5bWJvbEtpbmQuU3RyaW5nID0gMTU7XG4gICAgU3ltYm9sS2luZC5OdW1iZXIgPSAxNjtcbiAgICBTeW1ib2xLaW5kLkJvb2xlYW4gPSAxNztcbiAgICBTeW1ib2xLaW5kLkFycmF5ID0gMTg7XG4gICAgU3ltYm9sS2luZC5PYmplY3QgPSAxOTtcbiAgICBTeW1ib2xLaW5kLktleSA9IDIwO1xuICAgIFN5bWJvbEtpbmQuTnVsbCA9IDIxO1xuICAgIFN5bWJvbEtpbmQuRW51bU1lbWJlciA9IDIyO1xuICAgIFN5bWJvbEtpbmQuU3RydWN0ID0gMjM7XG4gICAgU3ltYm9sS2luZC5FdmVudCA9IDI0O1xuICAgIFN5bWJvbEtpbmQuT3BlcmF0b3IgPSAyNTtcbiAgICBTeW1ib2xLaW5kLlR5cGVQYXJhbWV0ZXIgPSAyNjtcbn0pKFN5bWJvbEtpbmQgfHwgKFN5bWJvbEtpbmQgPSB7fSkpO1xuLyoqXG4gKiBTeW1ib2wgdGFncyBhcmUgZXh0cmEgYW5ub3RhdGlvbnMgdGhhdCB0d2VhayB0aGUgcmVuZGVyaW5nIG9mIGEgc3ltYm9sLlxuICpcbiAqIEBzaW5jZSAzLjE2XG4gKi9cbmV4cG9ydCB2YXIgU3ltYm9sVGFnO1xuKGZ1bmN0aW9uIChTeW1ib2xUYWcpIHtcbiAgICAvKipcbiAgICAgKiBSZW5kZXIgYSBzeW1ib2wgYXMgb2Jzb2xldGUsIHVzdWFsbHkgdXNpbmcgYSBzdHJpa2Utb3V0LlxuICAgICAqL1xuICAgIFN5bWJvbFRhZy5EZXByZWNhdGVkID0gMTtcbn0pKFN5bWJvbFRhZyB8fCAoU3ltYm9sVGFnID0ge30pKTtcbmV4cG9ydCB2YXIgU3ltYm9sSW5mb3JtYXRpb247XG4oZnVuY3Rpb24gKFN5bWJvbEluZm9ybWF0aW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBzeW1ib2wgaW5mb3JtYXRpb24gbGl0ZXJhbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIGtpbmQgVGhlIGtpbmQgb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlIG9mIHRoZSBsb2NhdGlvbiBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIHJlc291cmNlIG9mIHRoZSBsb2NhdGlvbiBvZiBzeW1ib2wuXG4gICAgICogQHBhcmFtIGNvbnRhaW5lck5hbWUgVGhlIG5hbWUgb2YgdGhlIHN5bWJvbCBjb250YWluaW5nIHRoZSBzeW1ib2wuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKG5hbWUsIGtpbmQsIHJhbmdlLCB1cmksIGNvbnRhaW5lck5hbWUpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBraW5kLFxuICAgICAgICAgICAgbG9jYXRpb246IHsgdXJpLCByYW5nZSB9XG4gICAgICAgIH07XG4gICAgICAgIGlmIChjb250YWluZXJOYW1lKSB7XG4gICAgICAgICAgICByZXN1bHQuY29udGFpbmVyTmFtZSA9IGNvbnRhaW5lck5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgU3ltYm9sSW5mb3JtYXRpb24uY3JlYXRlID0gY3JlYXRlO1xufSkoU3ltYm9sSW5mb3JtYXRpb24gfHwgKFN5bWJvbEluZm9ybWF0aW9uID0ge30pKTtcbmV4cG9ydCB2YXIgV29ya3NwYWNlU3ltYm9sO1xuKGZ1bmN0aW9uIChXb3Jrc3BhY2VTeW1ib2wpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgd29ya3NwYWNlIHN5bWJvbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIGtpbmQgVGhlIGtpbmQgb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSByZXNvdXJjZSBvZiB0aGUgbG9jYXRpb24gb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgQW4gb3B0aW9ucyByYW5nZSBvZiB0aGUgbG9jYXRpb24uXG4gICAgICogQHJldHVybnMgQSBXb3Jrc3BhY2VTeW1ib2wuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKG5hbWUsIGtpbmQsIHVyaSwgcmFuZ2UpIHtcbiAgICAgICAgcmV0dXJuIHJhbmdlICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8geyBuYW1lLCBraW5kLCBsb2NhdGlvbjogeyB1cmksIHJhbmdlIH0gfVxuICAgICAgICAgICAgOiB7IG5hbWUsIGtpbmQsIGxvY2F0aW9uOiB7IHVyaSB9IH07XG4gICAgfVxuICAgIFdvcmtzcGFjZVN5bWJvbC5jcmVhdGUgPSBjcmVhdGU7XG59KShXb3Jrc3BhY2VTeW1ib2wgfHwgKFdvcmtzcGFjZVN5bWJvbCA9IHt9KSk7XG5leHBvcnQgdmFyIERvY3VtZW50U3ltYm9sO1xuKGZ1bmN0aW9uIChEb2N1bWVudFN5bWJvbCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgc3ltYm9sIGluZm9ybWF0aW9uIGxpdGVyYWwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSBkZXRhaWwgVGhlIGRldGFpbCBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSBraW5kIFRoZSBraW5kIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSBzZWxlY3Rpb25SYW5nZSBUaGUgc2VsZWN0aW9uUmFuZ2Ugb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gY2hpbGRyZW4gQ2hpbGRyZW4gb2YgdGhlIHN5bWJvbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobmFtZSwgZGV0YWlsLCBraW5kLCByYW5nZSwgc2VsZWN0aW9uUmFuZ2UsIGNoaWxkcmVuKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgZGV0YWlsLFxuICAgICAgICAgICAga2luZCxcbiAgICAgICAgICAgIHJhbmdlLFxuICAgICAgICAgICAgc2VsZWN0aW9uUmFuZ2VcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGNoaWxkcmVuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIERvY3VtZW50U3ltYm9sLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIERvY3VtZW50U3ltYm9sfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmXG4gICAgICAgICAgICBJcy5zdHJpbmcoY2FuZGlkYXRlLm5hbWUpICYmIElzLm51bWJlcihjYW5kaWRhdGUua2luZCkgJiZcbiAgICAgICAgICAgIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnNlbGVjdGlvblJhbmdlKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5kZXRhaWwgPT09IHVuZGVmaW5lZCB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLmRldGFpbCkpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmRlcHJlY2F0ZWQgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5kZXByZWNhdGVkKSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuY2hpbGRyZW4gPT09IHVuZGVmaW5lZCB8fCBBcnJheS5pc0FycmF5KGNhbmRpZGF0ZS5jaGlsZHJlbikpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLnRhZ3MgPT09IHVuZGVmaW5lZCB8fCBBcnJheS5pc0FycmF5KGNhbmRpZGF0ZS50YWdzKSk7XG4gICAgfVxuICAgIERvY3VtZW50U3ltYm9sLmlzID0gaXM7XG59KShEb2N1bWVudFN5bWJvbCB8fCAoRG9jdW1lbnRTeW1ib2wgPSB7fSkpO1xuLyoqXG4gKiBBIHNldCBvZiBwcmVkZWZpbmVkIGNvZGUgYWN0aW9uIGtpbmRzXG4gKi9cbmV4cG9ydCB2YXIgQ29kZUFjdGlvbktpbmQ7XG4oZnVuY3Rpb24gKENvZGVBY3Rpb25LaW5kKSB7XG4gICAgLyoqXG4gICAgICogRW1wdHkga2luZC5cbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5FbXB0eSA9ICcnO1xuICAgIC8qKlxuICAgICAqIEJhc2Uga2luZCBmb3IgcXVpY2tmaXggYWN0aW9uczogJ3F1aWNrZml4J1xuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlF1aWNrRml4ID0gJ3F1aWNrZml4JztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIHJlZmFjdG9yaW5nIGFjdGlvbnM6ICdyZWZhY3RvcidcbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5SZWZhY3RvciA9ICdyZWZhY3Rvcic7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciByZWZhY3RvcmluZyBleHRyYWN0aW9uIGFjdGlvbnM6ICdyZWZhY3Rvci5leHRyYWN0J1xuICAgICAqXG4gICAgICogRXhhbXBsZSBleHRyYWN0IGFjdGlvbnM6XG4gICAgICpcbiAgICAgKiAtIEV4dHJhY3QgbWV0aG9kXG4gICAgICogLSBFeHRyYWN0IGZ1bmN0aW9uXG4gICAgICogLSBFeHRyYWN0IHZhcmlhYmxlXG4gICAgICogLSBFeHRyYWN0IGludGVyZmFjZSBmcm9tIGNsYXNzXG4gICAgICogLSAuLi5cbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5SZWZhY3RvckV4dHJhY3QgPSAncmVmYWN0b3IuZXh0cmFjdCc7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciByZWZhY3RvcmluZyBpbmxpbmUgYWN0aW9uczogJ3JlZmFjdG9yLmlubGluZSdcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgaW5saW5lIGFjdGlvbnM6XG4gICAgICpcbiAgICAgKiAtIElubGluZSBmdW5jdGlvblxuICAgICAqIC0gSW5saW5lIHZhcmlhYmxlXG4gICAgICogLSBJbmxpbmUgY29uc3RhbnRcbiAgICAgKiAtIC4uLlxuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlJlZmFjdG9ySW5saW5lID0gJ3JlZmFjdG9yLmlubGluZSc7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciByZWZhY3RvcmluZyByZXdyaXRlIGFjdGlvbnM6ICdyZWZhY3Rvci5yZXdyaXRlJ1xuICAgICAqXG4gICAgICogRXhhbXBsZSByZXdyaXRlIGFjdGlvbnM6XG4gICAgICpcbiAgICAgKiAtIENvbnZlcnQgSmF2YVNjcmlwdCBmdW5jdGlvbiB0byBjbGFzc1xuICAgICAqIC0gQWRkIG9yIHJlbW92ZSBwYXJhbWV0ZXJcbiAgICAgKiAtIEVuY2Fwc3VsYXRlIGZpZWxkXG4gICAgICogLSBNYWtlIG1ldGhvZCBzdGF0aWNcbiAgICAgKiAtIE1vdmUgbWV0aG9kIHRvIGJhc2UgY2xhc3NcbiAgICAgKiAtIC4uLlxuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlJlZmFjdG9yUmV3cml0ZSA9ICdyZWZhY3Rvci5yZXdyaXRlJztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIHNvdXJjZSBhY3Rpb25zOiBgc291cmNlYFxuICAgICAqXG4gICAgICogU291cmNlIGNvZGUgYWN0aW9ucyBhcHBseSB0byB0aGUgZW50aXJlIGZpbGUuXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuU291cmNlID0gJ3NvdXJjZSc7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciBhbiBvcmdhbml6ZSBpbXBvcnRzIHNvdXJjZSBhY3Rpb246IGBzb3VyY2Uub3JnYW5pemVJbXBvcnRzYFxuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlNvdXJjZU9yZ2FuaXplSW1wb3J0cyA9ICdzb3VyY2Uub3JnYW5pemVJbXBvcnRzJztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIGF1dG8tZml4IHNvdXJjZSBhY3Rpb25zOiBgc291cmNlLmZpeEFsbGAuXG4gICAgICpcbiAgICAgKiBGaXggYWxsIGFjdGlvbnMgYXV0b21hdGljYWxseSBmaXggZXJyb3JzIHRoYXQgaGF2ZSBhIGNsZWFyIGZpeCB0aGF0IGRvIG5vdCByZXF1aXJlIHVzZXIgaW5wdXQuXG4gICAgICogVGhleSBzaG91bGQgbm90IHN1cHByZXNzIGVycm9ycyBvciBwZXJmb3JtIHVuc2FmZSBmaXhlcyBzdWNoIGFzIGdlbmVyYXRpbmcgbmV3IHR5cGVzIG9yIGNsYXNzZXMuXG4gICAgICpcbiAgICAgKiBAc2luY2UgMy4xNS4wXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuU291cmNlRml4QWxsID0gJ3NvdXJjZS5maXhBbGwnO1xufSkoQ29kZUFjdGlvbktpbmQgfHwgKENvZGVBY3Rpb25LaW5kID0ge30pKTtcbi8qKlxuICogVGhlIHJlYXNvbiB3aHkgY29kZSBhY3Rpb25zIHdlcmUgcmVxdWVzdGVkLlxuICpcbiAqIEBzaW5jZSAzLjE3LjBcbiAqL1xuZXhwb3J0IHZhciBDb2RlQWN0aW9uVHJpZ2dlcktpbmQ7XG4oZnVuY3Rpb24gKENvZGVBY3Rpb25UcmlnZ2VyS2luZCkge1xuICAgIC8qKlxuICAgICAqIENvZGUgYWN0aW9ucyB3ZXJlIGV4cGxpY2l0bHkgcmVxdWVzdGVkIGJ5IHRoZSB1c2VyIG9yIGJ5IGFuIGV4dGVuc2lvbi5cbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uVHJpZ2dlcktpbmQuSW52b2tlZCA9IDE7XG4gICAgLyoqXG4gICAgICogQ29kZSBhY3Rpb25zIHdlcmUgcmVxdWVzdGVkIGF1dG9tYXRpY2FsbHkuXG4gICAgICpcbiAgICAgKiBUaGlzIHR5cGljYWxseSBoYXBwZW5zIHdoZW4gY3VycmVudCBzZWxlY3Rpb24gaW4gYSBmaWxlIGNoYW5nZXMsIGJ1dCBjYW5cbiAgICAgKiBhbHNvIGJlIHRyaWdnZXJlZCB3aGVuIGZpbGUgY29udGVudCBjaGFuZ2VzLlxuICAgICAqL1xuICAgIENvZGVBY3Rpb25UcmlnZ2VyS2luZC5BdXRvbWF0aWMgPSAyO1xufSkoQ29kZUFjdGlvblRyaWdnZXJLaW5kIHx8IChDb2RlQWN0aW9uVHJpZ2dlcktpbmQgPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29kZUFjdGlvbkNvbnRleHQgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgQ29kZUFjdGlvbkNvbnRleHR9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIENvZGVBY3Rpb25Db250ZXh0O1xuKGZ1bmN0aW9uIChDb2RlQWN0aW9uQ29udGV4dCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ29kZUFjdGlvbkNvbnRleHQgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUoZGlhZ25vc3RpY3MsIG9ubHksIHRyaWdnZXJLaW5kKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IGRpYWdub3N0aWNzIH07XG4gICAgICAgIGlmIChvbmx5ICE9PSB1bmRlZmluZWQgJiYgb25seSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmVzdWx0Lm9ubHkgPSBvbmx5O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmlnZ2VyS2luZCAhPT0gdW5kZWZpbmVkICYmIHRyaWdnZXJLaW5kICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXN1bHQudHJpZ2dlcktpbmQgPSB0cmlnZ2VyS2luZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBDb2RlQWN0aW9uQ29udGV4dC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBDb2RlQWN0aW9uQ29udGV4dH0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS5kaWFnbm9zdGljcywgRGlhZ25vc3RpYy5pcylcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUub25seSA9PT0gdW5kZWZpbmVkIHx8IElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLm9ubHksIElzLnN0cmluZykpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLnRyaWdnZXJLaW5kID09PSB1bmRlZmluZWQgfHwgY2FuZGlkYXRlLnRyaWdnZXJLaW5kID09PSBDb2RlQWN0aW9uVHJpZ2dlcktpbmQuSW52b2tlZCB8fCBjYW5kaWRhdGUudHJpZ2dlcktpbmQgPT09IENvZGVBY3Rpb25UcmlnZ2VyS2luZC5BdXRvbWF0aWMpO1xuICAgIH1cbiAgICBDb2RlQWN0aW9uQ29udGV4dC5pcyA9IGlzO1xufSkoQ29kZUFjdGlvbkNvbnRleHQgfHwgKENvZGVBY3Rpb25Db250ZXh0ID0ge30pKTtcbmV4cG9ydCB2YXIgQ29kZUFjdGlvbjtcbihmdW5jdGlvbiAoQ29kZUFjdGlvbikge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh0aXRsZSwga2luZE9yQ29tbWFuZE9yRWRpdCwga2luZCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0geyB0aXRsZSB9O1xuICAgICAgICBsZXQgY2hlY2tLaW5kID0gdHJ1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBraW5kT3JDb21tYW5kT3JFZGl0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY2hlY2tLaW5kID0gZmFsc2U7XG4gICAgICAgICAgICByZXN1bHQua2luZCA9IGtpbmRPckNvbW1hbmRPckVkaXQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoQ29tbWFuZC5pcyhraW5kT3JDb21tYW5kT3JFZGl0KSkge1xuICAgICAgICAgICAgcmVzdWx0LmNvbW1hbmQgPSBraW5kT3JDb21tYW5kT3JFZGl0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0LmVkaXQgPSBraW5kT3JDb21tYW5kT3JFZGl0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGVja0tpbmQgJiYga2luZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQua2luZCA9IGtpbmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgQ29kZUFjdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLnN0cmluZyhjYW5kaWRhdGUudGl0bGUpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmRpYWdub3N0aWNzID09PSB1bmRlZmluZWQgfHwgSXMudHlwZWRBcnJheShjYW5kaWRhdGUuZGlhZ25vc3RpY3MsIERpYWdub3N0aWMuaXMpKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5raW5kID09PSB1bmRlZmluZWQgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS5raW5kKSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuZWRpdCAhPT0gdW5kZWZpbmVkIHx8IGNhbmRpZGF0ZS5jb21tYW5kICE9PSB1bmRlZmluZWQpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmNvbW1hbmQgPT09IHVuZGVmaW5lZCB8fCBDb21tYW5kLmlzKGNhbmRpZGF0ZS5jb21tYW5kKSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuaXNQcmVmZXJyZWQgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5pc1ByZWZlcnJlZCkpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmVkaXQgPT09IHVuZGVmaW5lZCB8fCBXb3Jrc3BhY2VFZGl0LmlzKGNhbmRpZGF0ZS5lZGl0KSk7XG4gICAgfVxuICAgIENvZGVBY3Rpb24uaXMgPSBpcztcbn0pKENvZGVBY3Rpb24gfHwgKENvZGVBY3Rpb24gPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29kZUxlbnMgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgQ29kZUxlbnN9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIENvZGVMZW5zO1xuKGZ1bmN0aW9uIChDb2RlTGVucykge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ29kZUxlbnMgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIGRhdGEpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHsgcmFuZ2UgfTtcbiAgICAgICAgaWYgKElzLmRlZmluZWQoZGF0YSkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5kYXRhID0gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBDb2RlTGVucy5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBDb2RlTGVuc30gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLmNvbW1hbmQpIHx8IENvbW1hbmQuaXMoY2FuZGlkYXRlLmNvbW1hbmQpKTtcbiAgICB9XG4gICAgQ29kZUxlbnMuaXMgPSBpcztcbn0pKENvZGVMZW5zIHx8IChDb2RlTGVucyA9IHt9KSk7XG4vKipcbiAqIFRoZSBGb3JtYXR0aW5nT3B0aW9ucyBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBGb3JtYXR0aW5nT3B0aW9uc30gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgRm9ybWF0dGluZ09wdGlvbnM7XG4oZnVuY3Rpb24gKEZvcm1hdHRpbmdPcHRpb25zKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBGb3JtYXR0aW5nT3B0aW9ucyBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh0YWJTaXplLCBpbnNlcnRTcGFjZXMpIHtcbiAgICAgICAgcmV0dXJuIHsgdGFiU2l6ZSwgaW5zZXJ0U3BhY2VzIH07XG4gICAgfVxuICAgIEZvcm1hdHRpbmdPcHRpb25zLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIEZvcm1hdHRpbmdPcHRpb25zfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS50YWJTaXplKSAmJiBJcy5ib29sZWFuKGNhbmRpZGF0ZS5pbnNlcnRTcGFjZXMpO1xuICAgIH1cbiAgICBGb3JtYXR0aW5nT3B0aW9ucy5pcyA9IGlzO1xufSkoRm9ybWF0dGluZ09wdGlvbnMgfHwgKEZvcm1hdHRpbmdPcHRpb25zID0ge30pKTtcbi8qKlxuICogVGhlIERvY3VtZW50TGluayBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBEb2N1bWVudExpbmt9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIERvY3VtZW50TGluaztcbihmdW5jdGlvbiAoRG9jdW1lbnRMaW5rKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBEb2N1bWVudExpbmsgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIHRhcmdldCwgZGF0YSkge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgdGFyZ2V0LCBkYXRhIH07XG4gICAgfVxuICAgIERvY3VtZW50TGluay5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBEb2N1bWVudExpbmt9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS50YXJnZXQpIHx8IElzLnN0cmluZyhjYW5kaWRhdGUudGFyZ2V0KSk7XG4gICAgfVxuICAgIERvY3VtZW50TGluay5pcyA9IGlzO1xufSkoRG9jdW1lbnRMaW5rIHx8IChEb2N1bWVudExpbmsgPSB7fSkpO1xuLyoqXG4gKiBUaGUgU2VsZWN0aW9uUmFuZ2UgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbiB0byB3b3JrIHdpdGhcbiAqIFNlbGVjdGlvblJhbmdlIGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIFNlbGVjdGlvblJhbmdlO1xuKGZ1bmN0aW9uIChTZWxlY3Rpb25SYW5nZSkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgU2VsZWN0aW9uUmFuZ2VcbiAgICAgKiBAcGFyYW0gcmFuZ2UgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSBwYXJlbnQgYW4gb3B0aW9uYWwgcGFyZW50LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgcGFyZW50KSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCBwYXJlbnQgfTtcbiAgICB9XG4gICAgU2VsZWN0aW9uUmFuZ2UuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIChjYW5kaWRhdGUucGFyZW50ID09PSB1bmRlZmluZWQgfHwgU2VsZWN0aW9uUmFuZ2UuaXMoY2FuZGlkYXRlLnBhcmVudCkpO1xuICAgIH1cbiAgICBTZWxlY3Rpb25SYW5nZS5pcyA9IGlzO1xufSkoU2VsZWN0aW9uUmFuZ2UgfHwgKFNlbGVjdGlvblJhbmdlID0ge30pKTtcbi8qKlxuICogQSBzZXQgb2YgcHJlZGVmaW5lZCB0b2tlbiB0eXBlcy4gVGhpcyBzZXQgaXMgbm90IGZpeGVkXG4gKiBhbiBjbGllbnRzIGNhbiBzcGVjaWZ5IGFkZGl0aW9uYWwgdG9rZW4gdHlwZXMgdmlhIHRoZVxuICogY29ycmVzcG9uZGluZyBjbGllbnQgY2FwYWJpbGl0aWVzLlxuICpcbiAqIEBzaW5jZSAzLjE2LjBcbiAqL1xuZXhwb3J0IHZhciBTZW1hbnRpY1Rva2VuVHlwZXM7XG4oZnVuY3Rpb24gKFNlbWFudGljVG9rZW5UeXBlcykge1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcIm5hbWVzcGFjZVwiXSA9IFwibmFtZXNwYWNlXCI7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIGdlbmVyaWMgdHlwZS4gQWN0cyBhcyBhIGZhbGxiYWNrIGZvciB0eXBlcyB3aGljaCBjYW4ndCBiZSBtYXBwZWQgdG9cbiAgICAgKiBhIHNwZWNpZmljIHR5cGUgbGlrZSBjbGFzcyBvciBlbnVtLlxuICAgICAqL1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInR5cGVcIl0gPSBcInR5cGVcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJjbGFzc1wiXSA9IFwiY2xhc3NcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJlbnVtXCJdID0gXCJlbnVtXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wiaW50ZXJmYWNlXCJdID0gXCJpbnRlcmZhY2VcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJzdHJ1Y3RcIl0gPSBcInN0cnVjdFwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInR5cGVQYXJhbWV0ZXJcIl0gPSBcInR5cGVQYXJhbWV0ZXJcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJwYXJhbWV0ZXJcIl0gPSBcInBhcmFtZXRlclwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInZhcmlhYmxlXCJdID0gXCJ2YXJpYWJsZVwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInByb3BlcnR5XCJdID0gXCJwcm9wZXJ0eVwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImVudW1NZW1iZXJcIl0gPSBcImVudW1NZW1iZXJcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJldmVudFwiXSA9IFwiZXZlbnRcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJmdW5jdGlvblwiXSA9IFwiZnVuY3Rpb25cIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJtZXRob2RcIl0gPSBcIm1ldGhvZFwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcIm1hY3JvXCJdID0gXCJtYWNyb1wiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImtleXdvcmRcIl0gPSBcImtleXdvcmRcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJtb2RpZmllclwiXSA9IFwibW9kaWZpZXJcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJjb21tZW50XCJdID0gXCJjb21tZW50XCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wic3RyaW5nXCJdID0gXCJzdHJpbmdcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJudW1iZXJcIl0gPSBcIm51bWJlclwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInJlZ2V4cFwiXSA9IFwicmVnZXhwXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wib3BlcmF0b3JcIl0gPSBcIm9wZXJhdG9yXCI7XG4gICAgLyoqXG4gICAgICogQHNpbmNlIDMuMTcuMFxuICAgICAqL1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImRlY29yYXRvclwiXSA9IFwiZGVjb3JhdG9yXCI7XG59KShTZW1hbnRpY1Rva2VuVHlwZXMgfHwgKFNlbWFudGljVG9rZW5UeXBlcyA9IHt9KSk7XG4vKipcbiAqIEEgc2V0IG9mIHByZWRlZmluZWQgdG9rZW4gbW9kaWZpZXJzLiBUaGlzIHNldCBpcyBub3QgZml4ZWRcbiAqIGFuIGNsaWVudHMgY2FuIHNwZWNpZnkgYWRkaXRpb25hbCB0b2tlbiB0eXBlcyB2aWEgdGhlXG4gKiBjb3JyZXNwb25kaW5nIGNsaWVudCBjYXBhYmlsaXRpZXMuXG4gKlxuICogQHNpbmNlIDMuMTYuMFxuICovXG5leHBvcnQgdmFyIFNlbWFudGljVG9rZW5Nb2RpZmllcnM7XG4oZnVuY3Rpb24gKFNlbWFudGljVG9rZW5Nb2RpZmllcnMpIHtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wiZGVjbGFyYXRpb25cIl0gPSBcImRlY2xhcmF0aW9uXCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcImRlZmluaXRpb25cIl0gPSBcImRlZmluaXRpb25cIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wicmVhZG9ubHlcIl0gPSBcInJlYWRvbmx5XCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcInN0YXRpY1wiXSA9IFwic3RhdGljXCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcImRlcHJlY2F0ZWRcIl0gPSBcImRlcHJlY2F0ZWRcIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wiYWJzdHJhY3RcIl0gPSBcImFic3RyYWN0XCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcImFzeW5jXCJdID0gXCJhc3luY1wiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJtb2RpZmljYXRpb25cIl0gPSBcIm1vZGlmaWNhdGlvblwiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJkb2N1bWVudGF0aW9uXCJdID0gXCJkb2N1bWVudGF0aW9uXCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcImRlZmF1bHRMaWJyYXJ5XCJdID0gXCJkZWZhdWx0TGlicmFyeVwiO1xufSkoU2VtYW50aWNUb2tlbk1vZGlmaWVycyB8fCAoU2VtYW50aWNUb2tlbk1vZGlmaWVycyA9IHt9KSk7XG4vKipcbiAqIEBzaW5jZSAzLjE2LjBcbiAqL1xuZXhwb3J0IHZhciBTZW1hbnRpY1Rva2VucztcbihmdW5jdGlvbiAoU2VtYW50aWNUb2tlbnMpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiAoY2FuZGlkYXRlLnJlc3VsdElkID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIGNhbmRpZGF0ZS5yZXN1bHRJZCA9PT0gJ3N0cmluZycpICYmXG4gICAgICAgICAgICBBcnJheS5pc0FycmF5KGNhbmRpZGF0ZS5kYXRhKSAmJiAoY2FuZGlkYXRlLmRhdGEubGVuZ3RoID09PSAwIHx8IHR5cGVvZiBjYW5kaWRhdGUuZGF0YVswXSA9PT0gJ251bWJlcicpO1xuICAgIH1cbiAgICBTZW1hbnRpY1Rva2Vucy5pcyA9IGlzO1xufSkoU2VtYW50aWNUb2tlbnMgfHwgKFNlbWFudGljVG9rZW5zID0ge30pKTtcbi8qKlxuICogVGhlIElubGluZVZhbHVlVGV4dCBuYW1lc3BhY2UgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCBJbmxpbmVWYWx1ZVRleHRzLlxuICpcbiAqIEBzaW5jZSAzLjE3LjBcbiAqL1xuZXhwb3J0IHZhciBJbmxpbmVWYWx1ZVRleHQ7XG4oZnVuY3Rpb24gKElubGluZVZhbHVlVGV4dCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgSW5saW5lVmFsdWVUZXh0IGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCB0ZXh0KSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCB0ZXh0IH07XG4gICAgfVxuICAgIElubGluZVZhbHVlVGV4dC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgIT09IHVuZGVmaW5lZCAmJiBjYW5kaWRhdGUgIT09IG51bGwgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnRleHQpO1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZVRleHQuaXMgPSBpcztcbn0pKElubGluZVZhbHVlVGV4dCB8fCAoSW5saW5lVmFsdWVUZXh0ID0ge30pKTtcbi8qKlxuICogVGhlIElubGluZVZhbHVlVmFyaWFibGVMb29rdXAgbmFtZXNwYWNlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGggSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cHMuXG4gKlxuICogQHNpbmNlIDMuMTcuMFxuICovXG5leHBvcnQgdmFyIElubGluZVZhbHVlVmFyaWFibGVMb29rdXA7XG4oZnVuY3Rpb24gKElubGluZVZhbHVlVmFyaWFibGVMb29rdXApIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IElubGluZVZhbHVlVGV4dCBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgdmFyaWFibGVOYW1lLCBjYXNlU2Vuc2l0aXZlTG9va3VwKSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCB2YXJpYWJsZU5hbWUsIGNhc2VTZW5zaXRpdmVMb29rdXAgfTtcbiAgICB9XG4gICAgSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgIT09IHVuZGVmaW5lZCAmJiBjYW5kaWRhdGUgIT09IG51bGwgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiBJcy5ib29sZWFuKGNhbmRpZGF0ZS5jYXNlU2Vuc2l0aXZlTG9va3VwKVxuICAgICAgICAgICAgJiYgKElzLnN0cmluZyhjYW5kaWRhdGUudmFyaWFibGVOYW1lKSB8fCBjYW5kaWRhdGUudmFyaWFibGVOYW1lID09PSB1bmRlZmluZWQpO1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwLmlzID0gaXM7XG59KShJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwIHx8IChJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwID0ge30pKTtcbi8qKlxuICogVGhlIElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uIG5hbWVzcGFjZSBwcm92aWRlcyBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uLlxuICpcbiAqIEBzaW5jZSAzLjE3LjBcbiAqL1xuZXhwb3J0IHZhciBJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbjtcbihmdW5jdGlvbiAoSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCBleHByZXNzaW9uKSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCBleHByZXNzaW9uIH07XG4gICAgfVxuICAgIElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAhPT0gdW5kZWZpbmVkICYmIGNhbmRpZGF0ZSAhPT0gbnVsbCAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpXG4gICAgICAgICAgICAmJiAoSXMuc3RyaW5nKGNhbmRpZGF0ZS5leHByZXNzaW9uKSB8fCBjYW5kaWRhdGUuZXhwcmVzc2lvbiA9PT0gdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24uaXMgPSBpcztcbn0pKElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uIHx8IChJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBJbmxpbmVWYWx1ZUNvbnRleHQgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgSW5saW5lVmFsdWVDb250ZXh0fSBsaXRlcmFscy5cbiAqXG4gKiBAc2luY2UgMy4xNy4wXG4gKi9cbmV4cG9ydCB2YXIgSW5saW5lVmFsdWVDb250ZXh0O1xuKGZ1bmN0aW9uIChJbmxpbmVWYWx1ZUNvbnRleHQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IElubGluZVZhbHVlQ29udGV4dCBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShmcmFtZUlkLCBzdG9wcGVkTG9jYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHsgZnJhbWVJZCwgc3RvcHBlZExvY2F0aW9uIH07XG4gICAgfVxuICAgIElubGluZVZhbHVlQ29udGV4dC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBJbmxpbmVWYWx1ZUNvbnRleHR9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyh2YWx1ZS5zdG9wcGVkTG9jYXRpb24pO1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZUNvbnRleHQuaXMgPSBpcztcbn0pKElubGluZVZhbHVlQ29udGV4dCB8fCAoSW5saW5lVmFsdWVDb250ZXh0ID0ge30pKTtcbi8qKlxuICogSW5sYXkgaGludCBraW5kcy5cbiAqXG4gKiBAc2luY2UgMy4xNy4wXG4gKi9cbmV4cG9ydCB2YXIgSW5sYXlIaW50S2luZDtcbihmdW5jdGlvbiAoSW5sYXlIaW50S2luZCkge1xuICAgIC8qKlxuICAgICAqIEFuIGlubGF5IGhpbnQgdGhhdCBmb3IgYSB0eXBlIGFubm90YXRpb24uXG4gICAgICovXG4gICAgSW5sYXlIaW50S2luZC5UeXBlID0gMTtcbiAgICAvKipcbiAgICAgKiBBbiBpbmxheSBoaW50IHRoYXQgaXMgZm9yIGEgcGFyYW1ldGVyLlxuICAgICAqL1xuICAgIElubGF5SGludEtpbmQuUGFyYW1ldGVyID0gMjtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWUgPT09IDEgfHwgdmFsdWUgPT09IDI7XG4gICAgfVxuICAgIElubGF5SGludEtpbmQuaXMgPSBpcztcbn0pKElubGF5SGludEtpbmQgfHwgKElubGF5SGludEtpbmQgPSB7fSkpO1xuZXhwb3J0IHZhciBJbmxheUhpbnRMYWJlbFBhcnQ7XG4oZnVuY3Rpb24gKElubGF5SGludExhYmVsUGFydCkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh2YWx1ZSkge1xuICAgICAgICByZXR1cm4geyB2YWx1ZSB9O1xuICAgIH1cbiAgICBJbmxheUhpbnRMYWJlbFBhcnQuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLnRvb2x0aXAgPT09IHVuZGVmaW5lZCB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLnRvb2x0aXApIHx8IE1hcmt1cENvbnRlbnQuaXMoY2FuZGlkYXRlLnRvb2x0aXApKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS5sb2NhdGlvbiA9PT0gdW5kZWZpbmVkIHx8IExvY2F0aW9uLmlzKGNhbmRpZGF0ZS5sb2NhdGlvbikpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLmNvbW1hbmQgPT09IHVuZGVmaW5lZCB8fCBDb21tYW5kLmlzKGNhbmRpZGF0ZS5jb21tYW5kKSk7XG4gICAgfVxuICAgIElubGF5SGludExhYmVsUGFydC5pcyA9IGlzO1xufSkoSW5sYXlIaW50TGFiZWxQYXJ0IHx8IChJbmxheUhpbnRMYWJlbFBhcnQgPSB7fSkpO1xuZXhwb3J0IHZhciBJbmxheUhpbnQ7XG4oZnVuY3Rpb24gKElubGF5SGludCkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShwb3NpdGlvbiwgbGFiZWwsIGtpbmQpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0geyBwb3NpdGlvbiwgbGFiZWwgfTtcbiAgICAgICAgaWYgKGtpbmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmtpbmQgPSBraW5kO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIElubGF5SGludC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgUG9zaXRpb24uaXMoY2FuZGlkYXRlLnBvc2l0aW9uKVxuICAgICAgICAgICAgJiYgKElzLnN0cmluZyhjYW5kaWRhdGUubGFiZWwpIHx8IElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLmxhYmVsLCBJbmxheUhpbnRMYWJlbFBhcnQuaXMpKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS5raW5kID09PSB1bmRlZmluZWQgfHwgSW5sYXlIaW50S2luZC5pcyhjYW5kaWRhdGUua2luZCkpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLnRleHRFZGl0cyA9PT0gdW5kZWZpbmVkKSB8fCBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS50ZXh0RWRpdHMsIFRleHRFZGl0LmlzKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS50b29sdGlwID09PSB1bmRlZmluZWQgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS50b29sdGlwKSB8fCBNYXJrdXBDb250ZW50LmlzKGNhbmRpZGF0ZS50b29sdGlwKSlcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUucGFkZGluZ0xlZnQgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5wYWRkaW5nTGVmdCkpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLnBhZGRpbmdSaWdodCA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLnBhZGRpbmdSaWdodCkpO1xuICAgIH1cbiAgICBJbmxheUhpbnQuaXMgPSBpcztcbn0pKElubGF5SGludCB8fCAoSW5sYXlIaW50ID0ge30pKTtcbmV4cG9ydCB2YXIgU3RyaW5nVmFsdWU7XG4oZnVuY3Rpb24gKFN0cmluZ1ZhbHVlKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlU25pcHBldCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4geyBraW5kOiAnc25pcHBldCcsIHZhbHVlIH07XG4gICAgfVxuICAgIFN0cmluZ1ZhbHVlLmNyZWF0ZVNuaXBwZXQgPSBjcmVhdGVTbmlwcGV0O1xufSkoU3RyaW5nVmFsdWUgfHwgKFN0cmluZ1ZhbHVlID0ge30pKTtcbmV4cG9ydCB2YXIgSW5saW5lQ29tcGxldGlvbkl0ZW07XG4oZnVuY3Rpb24gKElubGluZUNvbXBsZXRpb25JdGVtKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKGluc2VydFRleHQsIGZpbHRlclRleHQsIHJhbmdlLCBjb21tYW5kKSB7XG4gICAgICAgIHJldHVybiB7IGluc2VydFRleHQsIGZpbHRlclRleHQsIHJhbmdlLCBjb21tYW5kIH07XG4gICAgfVxuICAgIElubGluZUNvbXBsZXRpb25JdGVtLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKElubGluZUNvbXBsZXRpb25JdGVtIHx8IChJbmxpbmVDb21wbGV0aW9uSXRlbSA9IHt9KSk7XG5leHBvcnQgdmFyIElubGluZUNvbXBsZXRpb25MaXN0O1xuKGZ1bmN0aW9uIChJbmxpbmVDb21wbGV0aW9uTGlzdCkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShpdGVtcykge1xuICAgICAgICByZXR1cm4geyBpdGVtcyB9O1xuICAgIH1cbiAgICBJbmxpbmVDb21wbGV0aW9uTGlzdC5jcmVhdGUgPSBjcmVhdGU7XG59KShJbmxpbmVDb21wbGV0aW9uTGlzdCB8fCAoSW5saW5lQ29tcGxldGlvbkxpc3QgPSB7fSkpO1xuLyoqXG4gKiBEZXNjcmliZXMgaG93IGFuIHtAbGluayBJbmxpbmVDb21wbGV0aW9uSXRlbVByb3ZpZGVyIGlubGluZSBjb21wbGV0aW9uIHByb3ZpZGVyfSB3YXMgdHJpZ2dlcmVkLlxuICpcbiAqIEBzaW5jZSAzLjE4LjBcbiAqIEBwcm9wb3NlZFxuICovXG5leHBvcnQgdmFyIElubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZDtcbihmdW5jdGlvbiAoSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kKSB7XG4gICAgLyoqXG4gICAgICogQ29tcGxldGlvbiB3YXMgdHJpZ2dlcmVkIGV4cGxpY2l0bHkgYnkgYSB1c2VyIGdlc3R1cmUuXG4gICAgICovXG4gICAgSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kLkludm9rZWQgPSAwO1xuICAgIC8qKlxuICAgICAqIENvbXBsZXRpb24gd2FzIHRyaWdnZXJlZCBhdXRvbWF0aWNhbGx5IHdoaWxlIGVkaXRpbmcuXG4gICAgICovXG4gICAgSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kLkF1dG9tYXRpYyA9IDE7XG59KShJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmQgfHwgKElubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZCA9IHt9KSk7XG5leHBvcnQgdmFyIFNlbGVjdGVkQ29tcGxldGlvbkluZm87XG4oZnVuY3Rpb24gKFNlbGVjdGVkQ29tcGxldGlvbkluZm8pIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIHRleHQpIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIHRleHQgfTtcbiAgICB9XG4gICAgU2VsZWN0ZWRDb21wbGV0aW9uSW5mby5jcmVhdGUgPSBjcmVhdGU7XG59KShTZWxlY3RlZENvbXBsZXRpb25JbmZvIHx8IChTZWxlY3RlZENvbXBsZXRpb25JbmZvID0ge30pKTtcbmV4cG9ydCB2YXIgSW5saW5lQ29tcGxldGlvbkNvbnRleHQ7XG4oZnVuY3Rpb24gKElubGluZUNvbXBsZXRpb25Db250ZXh0KSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKHRyaWdnZXJLaW5kLCBzZWxlY3RlZENvbXBsZXRpb25JbmZvKSB7XG4gICAgICAgIHJldHVybiB7IHRyaWdnZXJLaW5kLCBzZWxlY3RlZENvbXBsZXRpb25JbmZvIH07XG4gICAgfVxuICAgIElubGluZUNvbXBsZXRpb25Db250ZXh0LmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKElubGluZUNvbXBsZXRpb25Db250ZXh0IHx8IChJbmxpbmVDb21wbGV0aW9uQ29udGV4dCA9IHt9KSk7XG5leHBvcnQgdmFyIFdvcmtzcGFjZUZvbGRlcjtcbihmdW5jdGlvbiAoV29ya3NwYWNlRm9sZGVyKSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgVVJJLmlzKGNhbmRpZGF0ZS51cmkpICYmIElzLnN0cmluZyhjYW5kaWRhdGUubmFtZSk7XG4gICAgfVxuICAgIFdvcmtzcGFjZUZvbGRlci5pcyA9IGlzO1xufSkoV29ya3NwYWNlRm9sZGVyIHx8IChXb3Jrc3BhY2VGb2xkZXIgPSB7fSkpO1xuZXhwb3J0IGNvbnN0IEVPTCA9IFsnXFxuJywgJ1xcclxcbicsICdcXHInXTtcbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHRoZSB0ZXh0IGRvY3VtZW50IGZyb20gdGhlIG5ldyB2c2NvZGUtbGFuZ3VhZ2VzZXJ2ZXItdGV4dGRvY3VtZW50IHBhY2thZ2UuXG4gKi9cbmV4cG9ydCB2YXIgVGV4dERvY3VtZW50O1xuKGZ1bmN0aW9uIChUZXh0RG9jdW1lbnQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IElUZXh0RG9jdW1lbnQgbGl0ZXJhbCBmcm9tIHRoZSBnaXZlbiB1cmkgYW5kIGNvbnRlbnQuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgZG9jdW1lbnQncyB1cmkuXG4gICAgICogQHBhcmFtIGxhbmd1YWdlSWQgVGhlIGRvY3VtZW50J3MgbGFuZ3VhZ2UgSWQuXG4gICAgICogQHBhcmFtIHZlcnNpb24gVGhlIGRvY3VtZW50J3MgdmVyc2lvbi5cbiAgICAgKiBAcGFyYW0gY29udGVudCBUaGUgZG9jdW1lbnQncyBjb250ZW50LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmksIGxhbmd1YWdlSWQsIHZlcnNpb24sIGNvbnRlbnQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGdWxsVGV4dERvY3VtZW50KHVyaSwgbGFuZ3VhZ2VJZCwgdmVyc2lvbiwgY29udGVudCk7XG4gICAgfVxuICAgIFRleHREb2N1bWVudC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBJVGV4dERvY3VtZW50fSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudXJpKSAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5sYW5ndWFnZUlkKSB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLmxhbmd1YWdlSWQpKSAmJiBJcy51aW50ZWdlcihjYW5kaWRhdGUubGluZUNvdW50KVxuICAgICAgICAgICAgJiYgSXMuZnVuYyhjYW5kaWRhdGUuZ2V0VGV4dCkgJiYgSXMuZnVuYyhjYW5kaWRhdGUucG9zaXRpb25BdCkgJiYgSXMuZnVuYyhjYW5kaWRhdGUub2Zmc2V0QXQpID8gdHJ1ZSA6IGZhbHNlO1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnQuaXMgPSBpcztcbiAgICBmdW5jdGlvbiBhcHBseUVkaXRzKGRvY3VtZW50LCBlZGl0cykge1xuICAgICAgICBsZXQgdGV4dCA9IGRvY3VtZW50LmdldFRleHQoKTtcbiAgICAgICAgbGV0IHNvcnRlZEVkaXRzID0gbWVyZ2VTb3J0KGVkaXRzLCAoYSwgYikgPT4ge1xuICAgICAgICAgICAgbGV0IGRpZmYgPSBhLnJhbmdlLnN0YXJ0LmxpbmUgLSBiLnJhbmdlLnN0YXJ0LmxpbmU7XG4gICAgICAgICAgICBpZiAoZGlmZiA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhLnJhbmdlLnN0YXJ0LmNoYXJhY3RlciAtIGIucmFuZ2Uuc3RhcnQuY2hhcmFjdGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRpZmY7XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgbGFzdE1vZGlmaWVkT2Zmc2V0ID0gdGV4dC5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGkgPSBzb3J0ZWRFZGl0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgbGV0IGUgPSBzb3J0ZWRFZGl0c1tpXTtcbiAgICAgICAgICAgIGxldCBzdGFydE9mZnNldCA9IGRvY3VtZW50Lm9mZnNldEF0KGUucmFuZ2Uuc3RhcnQpO1xuICAgICAgICAgICAgbGV0IGVuZE9mZnNldCA9IGRvY3VtZW50Lm9mZnNldEF0KGUucmFuZ2UuZW5kKTtcbiAgICAgICAgICAgIGlmIChlbmRPZmZzZXQgPD0gbGFzdE1vZGlmaWVkT2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIHN0YXJ0T2Zmc2V0KSArIGUubmV3VGV4dCArIHRleHQuc3Vic3RyaW5nKGVuZE9mZnNldCwgdGV4dC5sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdPdmVybGFwcGluZyBlZGl0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsYXN0TW9kaWZpZWRPZmZzZXQgPSBzdGFydE9mZnNldDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50LmFwcGx5RWRpdHMgPSBhcHBseUVkaXRzO1xuICAgIGZ1bmN0aW9uIG1lcmdlU29ydChkYXRhLCBjb21wYXJlKSB7XG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCA8PSAxKSB7XG4gICAgICAgICAgICAvLyBzb3J0ZWRcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHAgPSAoZGF0YS5sZW5ndGggLyAyKSB8IDA7XG4gICAgICAgIGNvbnN0IGxlZnQgPSBkYXRhLnNsaWNlKDAsIHApO1xuICAgICAgICBjb25zdCByaWdodCA9IGRhdGEuc2xpY2UocCk7XG4gICAgICAgIG1lcmdlU29ydChsZWZ0LCBjb21wYXJlKTtcbiAgICAgICAgbWVyZ2VTb3J0KHJpZ2h0LCBjb21wYXJlKTtcbiAgICAgICAgbGV0IGxlZnRJZHggPSAwO1xuICAgICAgICBsZXQgcmlnaHRJZHggPSAwO1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIHdoaWxlIChsZWZ0SWR4IDwgbGVmdC5sZW5ndGggJiYgcmlnaHRJZHggPCByaWdodC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCByZXQgPSBjb21wYXJlKGxlZnRbbGVmdElkeF0sIHJpZ2h0W3JpZ2h0SWR4XSk7XG4gICAgICAgICAgICBpZiAocmV0IDw9IDApIHtcbiAgICAgICAgICAgICAgICAvLyBzbWFsbGVyX2VxdWFsIC0+IHRha2UgbGVmdCB0byBwcmVzZXJ2ZSBvcmRlclxuICAgICAgICAgICAgICAgIGRhdGFbaSsrXSA9IGxlZnRbbGVmdElkeCsrXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGdyZWF0ZXIgLT4gdGFrZSByaWdodFxuICAgICAgICAgICAgICAgIGRhdGFbaSsrXSA9IHJpZ2h0W3JpZ2h0SWR4KytdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChsZWZ0SWR4IDwgbGVmdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRhdGFbaSsrXSA9IGxlZnRbbGVmdElkeCsrXTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAocmlnaHRJZHggPCByaWdodC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRhdGFbaSsrXSA9IHJpZ2h0W3JpZ2h0SWR4KytdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbn0pKFRleHREb2N1bWVudCB8fCAoVGV4dERvY3VtZW50ID0ge30pKTtcbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHRoZSB0ZXh0IGRvY3VtZW50IGZyb20gdGhlIG5ldyB2c2NvZGUtbGFuZ3VhZ2VzZXJ2ZXItdGV4dGRvY3VtZW50IHBhY2thZ2UuXG4gKi9cbmNsYXNzIEZ1bGxUZXh0RG9jdW1lbnQge1xuICAgIGNvbnN0cnVjdG9yKHVyaSwgbGFuZ3VhZ2VJZCwgdmVyc2lvbiwgY29udGVudCkge1xuICAgICAgICB0aGlzLl91cmkgPSB1cmk7XG4gICAgICAgIHRoaXMuX2xhbmd1YWdlSWQgPSBsYW5ndWFnZUlkO1xuICAgICAgICB0aGlzLl92ZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgICAgdGhpcy5fY29udGVudCA9IGNvbnRlbnQ7XG4gICAgICAgIHRoaXMuX2xpbmVPZmZzZXRzID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBnZXQgdXJpKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdXJpO1xuICAgIH1cbiAgICBnZXQgbGFuZ3VhZ2VJZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhbmd1YWdlSWQ7XG4gICAgfVxuICAgIGdldCB2ZXJzaW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmVyc2lvbjtcbiAgICB9XG4gICAgZ2V0VGV4dChyYW5nZSkge1xuICAgICAgICBpZiAocmFuZ2UpIHtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IHRoaXMub2Zmc2V0QXQocmFuZ2Uuc3RhcnQpO1xuICAgICAgICAgICAgbGV0IGVuZCA9IHRoaXMub2Zmc2V0QXQocmFuZ2UuZW5kKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb250ZW50LnN1YnN0cmluZyhzdGFydCwgZW5kKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fY29udGVudDtcbiAgICB9XG4gICAgdXBkYXRlKGV2ZW50LCB2ZXJzaW9uKSB7XG4gICAgICAgIHRoaXMuX2NvbnRlbnQgPSBldmVudC50ZXh0O1xuICAgICAgICB0aGlzLl92ZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgICAgdGhpcy5fbGluZU9mZnNldHMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGdldExpbmVPZmZzZXRzKCkge1xuICAgICAgICBpZiAodGhpcy5fbGluZU9mZnNldHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbGV0IGxpbmVPZmZzZXRzID0gW107XG4gICAgICAgICAgICBsZXQgdGV4dCA9IHRoaXMuX2NvbnRlbnQ7XG4gICAgICAgICAgICBsZXQgaXNMaW5lU3RhcnQgPSB0cnVlO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzTGluZVN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgIGxpbmVPZmZzZXRzLnB1c2goaSk7XG4gICAgICAgICAgICAgICAgICAgIGlzTGluZVN0YXJ0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBjaCA9IHRleHQuY2hhckF0KGkpO1xuICAgICAgICAgICAgICAgIGlzTGluZVN0YXJ0ID0gKGNoID09PSAnXFxyJyB8fCBjaCA9PT0gJ1xcbicpO1xuICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ1xccicgJiYgaSArIDEgPCB0ZXh0Lmxlbmd0aCAmJiB0ZXh0LmNoYXJBdChpICsgMSkgPT09ICdcXG4nKSB7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNMaW5lU3RhcnQgJiYgdGV4dC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGluZU9mZnNldHMucHVzaCh0ZXh0Lmxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9saW5lT2Zmc2V0cyA9IGxpbmVPZmZzZXRzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9saW5lT2Zmc2V0cztcbiAgICB9XG4gICAgcG9zaXRpb25BdChvZmZzZXQpIHtcbiAgICAgICAgb2Zmc2V0ID0gTWF0aC5tYXgoTWF0aC5taW4ob2Zmc2V0LCB0aGlzLl9jb250ZW50Lmxlbmd0aCksIDApO1xuICAgICAgICBsZXQgbGluZU9mZnNldHMgPSB0aGlzLmdldExpbmVPZmZzZXRzKCk7XG4gICAgICAgIGxldCBsb3cgPSAwLCBoaWdoID0gbGluZU9mZnNldHMubGVuZ3RoO1xuICAgICAgICBpZiAoaGlnaCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFBvc2l0aW9uLmNyZWF0ZSgwLCBvZmZzZXQpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgICAgICAgICBsZXQgbWlkID0gTWF0aC5mbG9vcigobG93ICsgaGlnaCkgLyAyKTtcbiAgICAgICAgICAgIGlmIChsaW5lT2Zmc2V0c1ttaWRdID4gb2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgaGlnaCA9IG1pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvdyA9IG1pZCArIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gbG93IGlzIHRoZSBsZWFzdCB4IGZvciB3aGljaCB0aGUgbGluZSBvZmZzZXQgaXMgbGFyZ2VyIHRoYW4gdGhlIGN1cnJlbnQgb2Zmc2V0XG4gICAgICAgIC8vIG9yIGFycmF5Lmxlbmd0aCBpZiBubyBsaW5lIG9mZnNldCBpcyBsYXJnZXIgdGhhbiB0aGUgY3VycmVudCBvZmZzZXRcbiAgICAgICAgbGV0IGxpbmUgPSBsb3cgLSAxO1xuICAgICAgICByZXR1cm4gUG9zaXRpb24uY3JlYXRlKGxpbmUsIG9mZnNldCAtIGxpbmVPZmZzZXRzW2xpbmVdKTtcbiAgICB9XG4gICAgb2Zmc2V0QXQocG9zaXRpb24pIHtcbiAgICAgICAgbGV0IGxpbmVPZmZzZXRzID0gdGhpcy5nZXRMaW5lT2Zmc2V0cygpO1xuICAgICAgICBpZiAocG9zaXRpb24ubGluZSA+PSBsaW5lT2Zmc2V0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb250ZW50Lmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwb3NpdGlvbi5saW5lIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGxpbmVPZmZzZXQgPSBsaW5lT2Zmc2V0c1twb3NpdGlvbi5saW5lXTtcbiAgICAgICAgbGV0IG5leHRMaW5lT2Zmc2V0ID0gKHBvc2l0aW9uLmxpbmUgKyAxIDwgbGluZU9mZnNldHMubGVuZ3RoKSA/IGxpbmVPZmZzZXRzW3Bvc2l0aW9uLmxpbmUgKyAxXSA6IHRoaXMuX2NvbnRlbnQubGVuZ3RoO1xuICAgICAgICByZXR1cm4gTWF0aC5tYXgoTWF0aC5taW4obGluZU9mZnNldCArIHBvc2l0aW9uLmNoYXJhY3RlciwgbmV4dExpbmVPZmZzZXQpLCBsaW5lT2Zmc2V0KTtcbiAgICB9XG4gICAgZ2V0IGxpbmVDb3VudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TGluZU9mZnNldHMoKS5sZW5ndGg7XG4gICAgfVxufVxudmFyIElzO1xuKGZ1bmN0aW9uIChJcykge1xuICAgIGNvbnN0IHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbiAgICBmdW5jdGlvbiBkZWZpbmVkKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnO1xuICAgIH1cbiAgICBJcy5kZWZpbmVkID0gZGVmaW5lZDtcbiAgICBmdW5jdGlvbiB1bmRlZmluZWQodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCc7XG4gICAgfVxuICAgIElzLnVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBmdW5jdGlvbiBib29sZWFuKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gZmFsc2U7XG4gICAgfVxuICAgIElzLmJvb2xlYW4gPSBib29sZWFuO1xuICAgIGZ1bmN0aW9uIHN0cmluZyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IFN0cmluZ10nO1xuICAgIH1cbiAgICBJcy5zdHJpbmcgPSBzdHJpbmc7XG4gICAgZnVuY3Rpb24gbnVtYmVyKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgTnVtYmVyXSc7XG4gICAgfVxuICAgIElzLm51bWJlciA9IG51bWJlcjtcbiAgICBmdW5jdGlvbiBudW1iZXJSYW5nZSh2YWx1ZSwgbWluLCBtYXgpIHtcbiAgICAgICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBOdW1iZXJdJyAmJiBtaW4gPD0gdmFsdWUgJiYgdmFsdWUgPD0gbWF4O1xuICAgIH1cbiAgICBJcy5udW1iZXJSYW5nZSA9IG51bWJlclJhbmdlO1xuICAgIGZ1bmN0aW9uIGludGVnZXIodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBOdW1iZXJdJyAmJiAtMjE0NzQ4MzY0OCA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSAyMTQ3NDgzNjQ3O1xuICAgIH1cbiAgICBJcy5pbnRlZ2VyID0gaW50ZWdlcjtcbiAgICBmdW5jdGlvbiB1aW50ZWdlcih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IE51bWJlcl0nICYmIDAgPD0gdmFsdWUgJiYgdmFsdWUgPD0gMjE0NzQ4MzY0NztcbiAgICB9XG4gICAgSXMudWludGVnZXIgPSB1aW50ZWdlcjtcbiAgICBmdW5jdGlvbiBmdW5jKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbiAgICB9XG4gICAgSXMuZnVuYyA9IGZ1bmM7XG4gICAgZnVuY3Rpb24gb2JqZWN0TGl0ZXJhbCh2YWx1ZSkge1xuICAgICAgICAvLyBTdHJpY3RseSBzcGVha2luZyBjbGFzcyBpbnN0YW5jZXMgcGFzcyB0aGlzIGNoZWNrIGFzIHdlbGwuIFNpbmNlIHRoZSBMU1BcbiAgICAgICAgLy8gZG9lc24ndCB1c2UgY2xhc3NlcyB3ZSBpZ25vcmUgdGhpcyBmb3Igbm93LiBJZiB3ZSBkbyB3ZSBuZWVkIHRvIGFkZCBzb21ldGhpbmdcbiAgICAgICAgLy8gbGlrZSB0aGlzOiBgT2JqZWN0LmdldFByb3RvdHlwZU9mKE9iamVjdC5nZXRQcm90b3R5cGVPZih4KSkgPT09IG51bGxgXG4gICAgICAgIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnO1xuICAgIH1cbiAgICBJcy5vYmplY3RMaXRlcmFsID0gb2JqZWN0TGl0ZXJhbDtcbiAgICBmdW5jdGlvbiB0eXBlZEFycmF5KHZhbHVlLCBjaGVjaykge1xuICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUuZXZlcnkoY2hlY2spO1xuICAgIH1cbiAgICBJcy50eXBlZEFycmF5ID0gdHlwZWRBcnJh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QUFBQSxNQUMzRyxPQUFPO0FBQ0gsZ0JBQVEsT0FBTyxLQUFLLEVBQUUsTUFBTSxtQkFBbUIsR0FBRyxHQUFHLFFBQVEsQ0FBQztBQUFBLE1BQ2xFO0FBQUEsSUFDSjtBQUVBLFVBQU8sV0FBbUIscUJBQXFCLE9BQU87QUFBQSxFQUMxRDtBQUVBLFdBQVMsZ0JBQWdCO0FBQ3JCLFdBQU87QUFBQSxNQUNILE1BQU07QUFBQSxRQUNGLFFBQVE7QUFBQSxVQUNKLE9BQVksRUFBRSxTQUFTLEtBQUs7QUFBQSxVQUM1QixRQUFZLEVBQUUsU0FBUyxNQUFNO0FBQUEsVUFDN0IsWUFBWSxDQUFDLHNCQUFzQixtQkFBbUIsMkJBQTJCO0FBQUEsUUFDckY7QUFBQSxRQUNBLFdBQVcsRUFBRSxTQUFTLEtBQUs7QUFBQSxRQUMzQixZQUFZO0FBQUEsVUFDUixXQUFzQjtBQUFBLFVBQ3RCLHNCQUFzQjtBQUFBLFVBQ3RCLGVBQWU7QUFBQSxZQUNYO0FBQUEsWUFBYTtBQUFBLFlBQVM7QUFBQSxZQUN0QjtBQUFBLFlBQ0E7QUFBQSxZQUNBO0FBQUEsVUFDSjtBQUFBLFVBQ0EsYUFBYSxDQUFDLFFBQVEsU0FBUyxPQUFPLE9BQU8sRUFBRTtBQUFBLFFBQ25EO0FBQUEsUUFDQSxlQUFnQixFQUFFLFNBQVMsS0FBSztBQUFBLFFBQ2hDLFFBQWdCLEVBQUUsU0FBUyxLQUFLO0FBQUEsUUFDaEMsYUFBZ0IsRUFBRSxpQkFBaUIsTUFBTTtBQUFBLE1BQzdDO0FBQUEsSUFDSjtBQUFBLEVBQ0o7IiwKICAibmFtZXMiOiBbIkVycm9yQ29kZXMiLCAiTWVzc2FnZSIsICJUb3VjaCIsICJEaXNwb3NhYmxlIiwgIlJBTCIsICJFdmVudCIsICJJcyIsICJDYW5jZWxsYXRpb25Ub2tlbiIsICJDYW5jZWxsYXRpb25TdGF0ZSIsICJfY29ubiIsICJJcyIsICJNZXNzYWdlUmVhZGVyIiwgIkFic3RyYWN0TWVzc2FnZVJlYWRlciIsICJSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zIiwgIklzIiwgIk1lc3NhZ2VXcml0ZXIiLCAiQWJzdHJhY3RNZXNzYWdlV3JpdGVyIiwgIlJlc29sdmVkTWVzc2FnZVdyaXRlck9wdGlvbnMiLCAicmVzdWx0IiwgIklzIiwgIkNhbmNlbE5vdGlmaWNhdGlvbiIsICJQcm9ncmVzc1Rva2VuIiwgIlByb2dyZXNzTm90aWZpY2F0aW9uIiwgIlN0YXJSZXF1ZXN0SGFuZGxlciIsICJUcmFjZSIsICJUcmFjZVZhbHVlcyIsICJUcmFjZUZvcm1hdCIsICJTZXRUcmFjZU5vdGlmaWNhdGlvbiIsICJMb2dUcmFjZU5vdGlmaWNhdGlvbiIsICJDb25uZWN0aW9uRXJyb3JzIiwgIkNvbm5lY3Rpb25TdHJhdGVneSIsICJJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kiLCAiUmVxdWVzdENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kiLCAiQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSIsICJDYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneSIsICJDYW5jZWxsYXRpb25TdHJhdGVneSIsICJNZXNzYWdlU3RyYXRlZ3kiLCAiQ29ubmVjdGlvbk9wdGlvbnMiLCAiQ29ubmVjdGlvblN0YXRlIiwgImNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uIiwgInN0YXJ0VGltZSIsICJSSUwiLCAibSIsICJleHBvcnRzIiwgImNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uIiwgImltcG9ydF92c2NvZGVfanNvbnJwYyIsICJpbXBvcnRfdnNjb2RlX2pzb25ycGMiLCAiaW1wb3J0X3ZzY29kZV9qc29ucnBjIiwgImltcG9ydF92c2NvZGVfanNvbnJwYyIsICJEb2N1bWVudFVyaSIsICJVUkkiLCAiaW50ZWdlciIsICJ1aW50ZWdlciIsICJQb3NpdGlvbiIsICJSYW5nZSIsICJMb2NhdGlvbiIsICJMb2NhdGlvbkxpbmsiLCAiQ29sb3IiLCAiQ29sb3JJbmZvcm1hdGlvbiIsICJDb2xvclByZXNlbnRhdGlvbiIsICJGb2xkaW5nUmFuZ2VLaW5kIiwgIkZvbGRpbmdSYW5nZSIsICJEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uIiwgImxvY2F0aW9uIiwgIkRpYWdub3N0aWNTZXZlcml0eSIsICJEaWFnbm9zdGljVGFnIiwgIkNvZGVEZXNjcmlwdGlvbiIsICJEaWFnbm9zdGljIiwgIkNvbW1hbmQiLCAiVGV4dEVkaXQiLCAiQ2hhbmdlQW5ub3RhdGlvbiIsICJDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllciIsICJBbm5vdGF0ZWRUZXh0RWRpdCIsICJUZXh0RG9jdW1lbnRFZGl0IiwgIkNyZWF0ZUZpbGUiLCAiUmVuYW1lRmlsZSIsICJEZWxldGVGaWxlIiwgIldvcmtzcGFjZUVkaXQiLCAiVGV4dERvY3VtZW50SWRlbnRpZmllciIsICJWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIiwgIk9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciIsICJUZXh0RG9jdW1lbnRJdGVtIiwgIk1hcmt1cEtpbmQiLCAiTWFya3VwQ29udGVudCIsICJDb21wbGV0aW9uSXRlbUtpbmQiLCAiSW5zZXJ0VGV4dEZvcm1hdCIsICJDb21wbGV0aW9uSXRlbVRhZyIsICJJbnNlcnRSZXBsYWNlRWRpdCIsICJSYW5nZSIsICJJbnNlcnRUZXh0TW9kZSIsICJDb21wbGV0aW9uSXRlbUxhYmVsRGV0YWlscyIsICJDb21wbGV0aW9uSXRlbSIsICJDb21wbGV0aW9uTGlzdCIsICJNYXJrZWRTdHJpbmciLCAiSG92ZXIiLCAiUGFyYW1ldGVySW5mb3JtYXRpb24iLCAiU2lnbmF0dXJlSW5mb3JtYXRpb24iLCAiRG9jdW1lbnRIaWdobGlnaHRLaW5kIiwgIkRvY3VtZW50SGlnaGxpZ2h0IiwgIlN5bWJvbEtpbmQiLCAiU3ltYm9sVGFnIiwgIlN5bWJvbEluZm9ybWF0aW9uIiwgIldvcmtzcGFjZVN5bWJvbCIsICJEb2N1bWVudFN5bWJvbCIsICJDb2RlQWN0aW9uS2luZCIsICJDb2RlQWN0aW9uVHJpZ2dlcktpbmQiLCAiQ29kZUFjdGlvbkNvbnRleHQiLCAiQ29kZUFjdGlvbiIsICJDb2RlTGVucyIsICJGb3JtYXR0aW5nT3B0aW9ucyIsICJEb2N1bWVudExpbmsiLCAiU2VsZWN0aW9uUmFuZ2UiLCAiU2VtYW50aWNUb2tlblR5cGVzIiwgIlNlbWFudGljVG9rZW5Nb2RpZmllcnMiLCAiU2VtYW50aWNUb2tlbnMiLCAiSW5saW5lVmFsdWVUZXh0IiwgIklubGluZVZhbHVlVmFyaWFibGVMb29rdXAiLCAiSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24iLCAiSW5saW5lVmFsdWVDb250ZXh0IiwgIklubGF5SGludEtpbmQiLCAiSW5sYXlIaW50TGFiZWxQYXJ0IiwgIklubGF5SGludCIsICJQb3NpdGlvbiIsICJTdHJpbmdWYWx1ZSIsICJJbmxpbmVDb21wbGV0aW9uSXRlbSIsICJJbmxpbmVDb21wbGV0aW9uTGlzdCIsICJJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmQiLCAiU2VsZWN0ZWRDb21wbGV0aW9uSW5mbyIsICJJbmxpbmVDb21wbGV0aW9uQ29udGV4dCIsICJXb3Jrc3BhY2VGb2xkZXIiLCAiVGV4dERvY3VtZW50IiwgIlBvc2l0aW9uIiwgIklzIiwgInVuZGVmaW5lZCIsICJpbnRlZ2VyIiwgInVpbnRlZ2VyIiwgIm0iXQp9Cg== diff --git a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/lsp/java-lsp-client.ts b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/lsp/java-lsp-client.ts index 38edc8089f7..673cf753c54 100644 --- a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/lsp/java-lsp-client.ts +++ b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/lsp/java-lsp-client.ts @@ -412,6 +412,19 @@ function registerProviders(): void { position: { line: position.lineNumber - 1, character: position.column - 1 }, newName, }); + if (!edit) return { edits: [] }; + // A JDT.LS rename can span many files and even rename the type's own .java file. Monaco's + // single-file editor would drop everything but the current model, so apply the whole edit + // through the workspace ourselves when the IDE persistence hook is available. + if (typeof (globalThis as any).javaLspPersistRename === 'function') { + try { + await applyRenameAcrossWorkspace(model, edit); + return { edits: [] }; + } catch (e) { + console.error('[java-lsp] cross-file rename failed, applying to the current file only:', e); + return workspaceEditToMonaco(edit); + } + } return workspaceEditToMonaco(edit); }, resolveRenameLocation: async (model, position) => { @@ -779,6 +792,98 @@ function workspaceEditToMonaco(edit: WorkspaceEdit | null): monaco.languages.Wor return { edits }; } +/** Maps a virtual editor URI back to the IDE workspace path ({@code /ws/proj/...}). */ +function uriToWorkspacePath(uri: string): string | null { + if (!uri.startsWith(VIRTUAL_FILE_PREFIX)) return null; + return decodeURIComponent(uri.substring(VIRTUAL_FILE_PREFIX.length)); +} + +/** Reads a workspace file's current text over the IDE REST API. */ +async function fetchWorkspaceFileText(idePath: string): Promise { + const response = await fetch('/services/ide/workspaces' + idePath, { headers: { 'X-Requested-With': 'Fetch' } }); + if (!response.ok) { + throw new Error(`Could not read ${idePath} (HTTP ${response.status})`); + } + return response.text(); +} + +/** Applies LSP text edits to a string. Offsets are resolved against the original text and edits are + * applied from the end backwards, so earlier offsets stay valid. */ +function applyEditsToText(text: string, edits: TextEdit[]): string { + const lineStarts = [0]; + for (let i = 0; i < text.length; i++) { + if (text.charCodeAt(i) === 10 /* \n */) lineStarts.push(i + 1); + } + const offset = (p: { line: number; character: number }) => (lineStarts[p.line] ?? text.length) + p.character; + const ordered = edits.slice() + .sort((a, b) => offset(b.range.start) - offset(a.range.start)); + let result = text; + for (const e of ordered) { + result = result.slice(0, offset(e.range.start)) + e.newText + result.slice(offset(e.range.end)); + } + return result; +} + +/** + * Applies a JDT.LS rename {@link WorkspaceEdit} across the whole workspace: text edits in every + * affected file plus any {@code RenameFile} operation (a public-type rename renames its own + * {@code .java} file). The current file's edits go through the live Monaco model; the rest are read, + * edited and written back over REST. Persistence (CSRF-guarded writes, the tab switch when the current + * file is renamed, and reloading other open editors) is delegated to the IDE via javaLspPersistRename. + */ +async function applyRenameAcrossWorkspace(model: monaco.editor.ITextModel, edit: WorkspaceEdit): Promise { + const currentUri = model.uri.toString(); + const textByUri: Record = {}; + const renameByUri: Record = {}; + + if (edit.changes) { + for (const uri in edit.changes) textByUri[uri] = (textByUri[uri] ?? []).concat(edit.changes[uri]); + } + if (edit.documentChanges) { + for (const dc of edit.documentChanges as any[]) { + if (dc?.kind === 'rename' && dc.oldUri && dc.newUri) { + renameByUri[dc.oldUri] = dc.newUri; + } else if (dc?.textDocument?.uri && Array.isArray(dc.edits)) { + textByUri[dc.textDocument.uri] = (textByUri[dc.textDocument.uri] ?? []).concat(dc.edits); + } + } + } + + const payload: { + currentPath: string | null; + currentContent: string | null; + currentNewPath: string | null; + writes: Array<{ path: string | null; content: string }>; + renames: Array<{ oldPath: string | null; newPath: string | null; content: string }>; + } = { currentPath: uriToWorkspacePath(currentUri), currentContent: null, currentNewPath: null, writes: [], renames: [] }; + + const uris = new Set([...Object.keys(textByUri), ...Object.keys(renameByUri)]); + for (const uri of uris) { + const edits = textByUri[uri] ?? []; + let content: string; + if (uri === currentUri) { + if (edits.length) { + model.pushEditOperations([], edits.map(e => ({ range: lspRangeToMonaco(e.range), text: e.newText, forceMoveMarkers: true })), () => null); + } + content = model.getValue(); + } else { + const source = await fetchWorkspaceFileText(uriToWorkspacePath(uri) ?? uri); + content = edits.length ? applyEditsToText(source, edits) : source; + } + const newUri = renameByUri[uri]; + if (uri === currentUri) { + payload.currentContent = content; + payload.currentNewPath = newUri ? uriToWorkspacePath(newUri) : null; + } else if (newUri) { + payload.renames.push({ oldPath: uriToWorkspacePath(uri), newPath: uriToWorkspacePath(newUri), content }); + } else { + payload.writes.push({ path: uriToWorkspacePath(uri), content }); + } + } + + await (globalThis as any).javaLspPersistRename(payload); +} + function jdtlsSettings() { return { java: { From ae1e54686ce1b58e6f586557c06cb4ccbc410309 Mon Sep 17 00:00:00 2001 From: Iliyan Velichkov Date: Tue, 23 Jun 2026 15:00:24 +0300 Subject: [PATCH 06/14] =?UTF-8?q?feat(editor):=20more=20IntelliJ-style=20J?= =?UTF-8?q?ava=20=E2=80=94=20outline,=20folding,=20inlay=20hints,=20semant?= =?UTF-8?q?ic=20colors,=20CodeLens,=20override/implement,=20keywords?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Adds JDT.LS-backed language features to the Monaco Java editor: Navigation & structure: - Outline / breadcrumbs / sticky scroll (documentSymbol), code folding (foldingRange), occurrence highlight (documentHighlight), Go to Implementation and Go to Type Definition (reusing the cross-file editor opener), Format Selection (rangeFormatting) and Smart Expand Selection (selectionRange). Editor intelligence: - Inlay hints (parameter names + inferred types) and semantic-token highlighting (legend captured from the initialize result; semanticHighlighting enabled on the editor). - CodeLens with "N references / N implementations" (click opens the peek). - Override/Implement Methods wired into the existing member-picker generate flow. - Always-available Java keyword completion, ranked below SDK/LSP results. Advertises the matching client capabilities and enables the JDT.LS inlay-hint and references/implementations CodeLens settings. All are additive providers; the exact JDT.LS command ids are guarded. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../dirigible/editor-monaco/js/editor.js | 4 +- .../editor-monaco/js/java-lsp-client.js | 335 +++++++++++++++++- .../editor-monaco/js/lsp/java-lsp-client.ts | 269 +++++++++++++- 3 files changed, 601 insertions(+), 7 deletions(-) diff --git a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/editor.js b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/editor.js index c7b425d70ab..72b2539f97a 100644 --- a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/editor.js +++ b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/editor.js @@ -724,7 +724,9 @@ class DirigibleEditor { wordWrap: DirigibleEditor.getWordWrap(), minimap: { autohide: DirigibleEditor.isMinimapAutohideEnabled(), - } + }, + // Enable LSP semantic token coloring (off by default unless the theme opts in). + 'semanticHighlighting.enabled': true, }; if (TypeScriptUtils.isTypeScriptFile(fileName)) { // @ts-ignore diff --git a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/java-lsp-client.js b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/java-lsp-client.js index e4964dce602..ab004556bbf 100644 --- a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/java-lsp-client.js +++ b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/java-lsp-client.js @@ -4472,6 +4472,7 @@ ${JSON.stringify(message, null, 4)}`); var _workspaceRoot = ""; var _openFiles = /* @__PURE__ */ new Set(); var _providersRegistered = false; + var _semanticTokensLegend = null; async function connect(resourcePath) { const parts = resourcePath.replace(/^\//, "").split("/"); const workspace = parts[0]; @@ -4523,7 +4524,7 @@ ${JSON.stringify(message, null, 4)}`); }); _conn.listen(); const rootUri = _workspaceRoot; - await _conn.sendRequest("initialize", { + const initResult = await _conn.sendRequest("initialize", { processId: null, rootUri, initializationOptions: { @@ -4560,7 +4561,58 @@ ${JSON.stringify(message, null, 4)}`); signatureHelp: { dynamicRegistration: true, signatureInformation: { documentationFormat: ["markdown", "plaintext"], parameterInformation: { labelOffsetSupport: true } } }, definition: { dynamicRegistration: true }, references: { dynamicRegistration: true }, - documentSymbol: { dynamicRegistration: true }, + implementation: { dynamicRegistration: true }, + typeDefinition: { dynamicRegistration: true }, + documentHighlight: { dynamicRegistration: true }, + documentSymbol: { dynamicRegistration: true, hierarchicalDocumentSymbolSupport: true }, + foldingRange: { dynamicRegistration: true, lineFoldingOnly: false }, + selectionRange: { dynamicRegistration: true }, + codeLens: { dynamicRegistration: true }, + inlayHint: { dynamicRegistration: true, resolveSupport: { properties: ["label"] } }, + semanticTokens: { + dynamicRegistration: true, + requests: { range: false, full: { delta: false } }, + tokenTypes: [ + "namespace", + "type", + "class", + "enum", + "interface", + "struct", + "typeParameter", + "parameter", + "variable", + "property", + "enumMember", + "event", + "function", + "method", + "macro", + "keyword", + "modifier", + "comment", + "string", + "number", + "regexp", + "operator", + "decorator" + ], + tokenModifiers: [ + "declaration", + "definition", + "readonly", + "static", + "deprecated", + "abstract", + "async", + "modification", + "documentation", + "defaultLibrary" + ], + formats: ["relative"], + overlappingTokenSupport: false, + multilineTokenSupport: false + }, formatting: { dynamicRegistration: true }, rangeFormatting: { dynamicRegistration: true }, rename: { dynamicRegistration: true, prepareSupport: true }, @@ -4594,6 +4646,7 @@ ${JSON.stringify(message, null, 4)}`); } } }); + _semanticTokensLegend = initResult?.capabilities?.semanticTokensProvider?.legend ?? null; _conn.sendNotification("initialized", {}); _conn.sendNotification("workspace/didChangeConfiguration", { settings: jdtlsSettings() }); openFile(fileUri); @@ -4634,6 +4687,8 @@ ${JSON.stringify(message, null, 4)}`); editor.registerCommand(APPLY_ACTION_COMMAND, (_accessor, action) => { applyCodeAction(action); }); + editor.registerCommand(NOOP_COMMAND, () => { + }); editor.registerEditorOpener({ openCodeEditor: (source, resource, selectionOrPosition) => { const uri = resource.toString(); @@ -4842,6 +4897,149 @@ ${JSON.stringify(message, null, 4)}`); "source.organizeImports" ] }); + languages.registerImplementationProvider("java", { + provideImplementation: (model, position) => requestLocations("textDocument/implementation", model, position) + }); + languages.registerTypeDefinitionProvider("java", { + provideTypeDefinition: (model, position) => requestLocations("textDocument/typeDefinition", model, position) + }); + languages.registerDocumentHighlightProvider("java", { + provideDocumentHighlights: async (model, position) => { + if (!_conn || !isWorkspaceFile(model.uri.toString())) return null; + const result = await _conn.sendRequest("textDocument/documentHighlight", { + textDocument: { uri: model.uri.toString() }, + position: { line: position.lineNumber - 1, character: position.column - 1 } + }); + if (!result) return null; + return result.map((h) => ({ range: lspRangeToMonaco(h.range), kind: h.kind ? h.kind - 1 : void 0 })); + } + }); + languages.registerDocumentSymbolProvider("java", { + provideDocumentSymbols: async (model) => { + if (!_conn || !isWorkspaceFile(model.uri.toString())) return null; + const result = await _conn.sendRequest("textDocument/documentSymbol", { + textDocument: { uri: model.uri.toString() } + }); + return result ? mapDocumentSymbols(result) : null; + } + }); + languages.registerFoldingRangeProvider("java", { + provideFoldingRanges: async (model) => { + if (!_conn || !isWorkspaceFile(model.uri.toString())) return null; + const result = await _conn.sendRequest("textDocument/foldingRange", { + textDocument: { uri: model.uri.toString() } + }); + if (!result) return null; + return result.map((r) => ({ start: r.startLine + 1, end: r.endLine + 1, kind: foldingKind(r.kind) })); + } + }); + languages.registerSelectionRangeProvider("java", { + provideSelectionRanges: async (model, positions) => { + if (!_conn || !isWorkspaceFile(model.uri.toString())) return null; + const result = await _conn.sendRequest("textDocument/selectionRange", { + textDocument: { uri: model.uri.toString() }, + positions: positions.map((p) => ({ line: p.lineNumber - 1, character: p.column - 1 })) + }); + if (!result) return null; + return result.map(flattenSelectionRange); + } + }); + languages.registerDocumentRangeFormattingEditProvider("java", { + provideDocumentRangeFormattingEdits: async (model, range) => { + if (!_conn || !isWorkspaceFile(model.uri.toString())) return null; + const edits = await _conn.sendRequest("textDocument/rangeFormatting", { + textDocument: { uri: model.uri.toString() }, + range: monacoRangeToLsp(range), + options: { tabSize: model.getOptions().tabSize, insertSpaces: model.getOptions().insertSpaces } + }); + return edits ? edits.map(textEditToMonaco) : null; + } + }); + languages.registerInlayHintsProvider("java", { + provideInlayHints: async (model, range) => { + if (!_conn || !isWorkspaceFile(model.uri.toString())) return null; + const result = await _conn.sendRequest("textDocument/inlayHint", { + textDocument: { uri: model.uri.toString() }, + range: monacoRangeToLsp(range) + }); + if (!result) return null; + return { + hints: result.map((h) => ({ + position: { lineNumber: h.position.line + 1, column: h.position.character + 1 }, + label: typeof h.label === "string" ? h.label : (h.label ?? []).map((p) => ({ label: p.value })), + kind: h.kind, + paddingLeft: h.paddingLeft, + paddingRight: h.paddingRight, + tooltip: h.tooltip ? markupToString(h.tooltip) : void 0 + })), + dispose() { + } + }; + } + }); + languages.registerDocumentSemanticTokensProvider("java", { + getLegend: () => _semanticTokensLegend ?? { tokenTypes: [], tokenModifiers: [] }, + provideDocumentSemanticTokens: async (model) => { + if (!_conn || !isWorkspaceFile(model.uri.toString()) || !_semanticTokensLegend) return null; + const result = await _conn.sendRequest("textDocument/semanticTokens/full", { + textDocument: { uri: model.uri.toString() } + }); + if (!result?.data) return null; + return { data: new Uint32Array(result.data), resultId: result.resultId }; + }, + releaseDocumentSemanticTokens: () => { + } + }); + languages.registerCodeLensProvider("java", { + provideCodeLenses: async (model) => { + if (!_conn || !isWorkspaceFile(model.uri.toString())) return { lenses: [], dispose() { + } }; + const result = await _conn.sendRequest("textDocument/codeLens", { + textDocument: { uri: model.uri.toString() } + }); + const lenses = (result ?? []).map((lens, i) => ({ + range: lspRangeToMonaco(lens.range), + id: String(i), + command: lens.command ? mapLensCommand(lens.command) : void 0, + _lsp: lens + })); + return { lenses, dispose() { + } }; + }, + resolveCodeLens: async (_model, codeLens) => { + const lsp = codeLens._lsp; + if (_conn && lsp && !lsp.command) { + try { + const resolved = await _conn.sendRequest("codeLens/resolve", lsp); + codeLens.command = resolved?.command ? mapLensCommand(resolved.command) : { id: NOOP_COMMAND, title: "" }; + } catch { + codeLens.command = { id: NOOP_COMMAND, title: "" }; + } + } + return codeLens; + } + }); + languages.registerCompletionItemProvider("java", { + provideCompletionItems: (model, position) => { + if (!isWorkspaceFile(model.uri.toString())) return null; + const word = model.getWordUntilPosition(position); + const range = { + startLineNumber: position.lineNumber, + startColumn: word.startColumn, + endLineNumber: position.lineNumber, + endColumn: word.endColumn + }; + return { + suggestions: JAVA_KEYWORDS.map((keyword) => ({ + label: keyword, + kind: languages.CompletionItemKind.Keyword, + insertText: keyword, + range, + sortText: `9_${keyword}` + })) + }; + } + }); } function lspSeverity(severity) { switch (severity) { @@ -4945,6 +5143,122 @@ ${JSON.stringify(message, null, 4)}`); } var APPLY_ACTION_COMMAND = "dirigible.java.applyCodeAction"; var VIRTUAL_FILE_PREFIX = "file:///workspace"; + var NOOP_COMMAND = "dirigible.java.noopLens"; + var JAVA_KEYWORDS = [ + "abstract", + "assert", + "boolean", + "break", + "byte", + "case", + "catch", + "char", + "class", + "const", + "continue", + "default", + "do", + "double", + "else", + "enum", + "extends", + "final", + "finally", + "float", + "for", + "goto", + "if", + "implements", + "import", + "instanceof", + "int", + "interface", + "long", + "native", + "new", + "package", + "private", + "protected", + "public", + "return", + "short", + "static", + "strictfp", + "super", + "switch", + "synchronized", + "this", + "throw", + "throws", + "transient", + "try", + "void", + "volatile", + "while", + "var", + "yield", + "record", + "sealed", + "permits", + "true", + "false", + "null" + ]; + async function requestLocations(method, model, position) { + if (!_conn || !isWorkspaceFile(model.uri.toString())) return null; + const result = await _conn.sendRequest(method, { + textDocument: { uri: model.uri.toString() }, + position: { line: position.lineNumber - 1, character: position.column - 1 } + }); + if (!result) return null; + const locations = Array.isArray(result) ? result : [result]; + return locations.map((loc) => ({ uri: Uri.parse(loc.uri), range: lspRangeToMonaco(loc.range) })); + } + function mapDocumentSymbols(symbols) { + return (symbols ?? []).map((s) => ({ + name: s.name, + detail: s.detail ?? "", + kind: (s.kind ?? 1) - 1, + tags: s.tags ?? [], + range: lspRangeToMonaco(s.range), + selectionRange: lspRangeToMonaco(s.selectionRange ?? s.range), + children: s.children ? mapDocumentSymbols(s.children) : [] + })); + } + function foldingKind(kind) { + const FK = languages.FoldingRangeKind; + switch (kind) { + case "comment": + return FK.Comment; + case "imports": + return FK.Imports; + case "region": + return FK.Region; + default: + return void 0; + } + } + function flattenSelectionRange(selectionRange) { + const ranges = []; + let current = selectionRange; + while (current) { + ranges.push({ range: lspRangeToMonaco(current.range) }); + current = current.parent; + } + return ranges; + } + function mapLensCommand(cmd) { + const args = cmd.arguments ?? []; + if ((cmd.command === "java.show.references" || cmd.command === "java.show.implementations") && args.length >= 3) { + const locations = (args[2] ?? []).map((l) => ({ uri: Uri.parse(l.uri), range: lspRangeToMonaco(l.range) })); + return { + id: "editor.action.showReferences", + title: cmd.title, + arguments: [Uri.parse(args[0]), { lineNumber: args[1].line + 1, column: args[1].character + 1 }, locations] + }; + } + return { id: NOOP_COMMAND, title: cmd.title }; + } function textEditToMonaco(edit) { return { range: lspRangeToMonaco(edit.range), text: edit.newText }; } @@ -5052,6 +5366,16 @@ ${JSON.stringify(message, null, 4)}`); generate: "java.action.generateAccessors", members: (s) => (s?.accessors ?? s ?? []).map((a) => ({ label: fieldLabel(a), ref: a })), buildArgs: (args, _s, sel) => [args[0], sel.map((m2) => m2.ref)] + }, + "java.action.overrideMethodsPrompt": { + label: "Select methods to override or implement", + status: "java.action.listOverridableMethods", + generate: "java.action.addOverridableMethods", + members: (s) => (s?.methods ?? []).map((m2) => ({ + label: `${m2.name}(${(m2.parameters ?? []).join(", ")})${m2.declaringClass ? " : " + m2.declaringClass : ""}`, + ref: m2 + })), + buildArgs: (args, status, sel) => [args[0], { overridableMethods: sel.map((m2) => m2.ref), type: status?.type }] } }; async function runGenerate(promptId, args) { @@ -5200,10 +5524,13 @@ ${JSON.stringify(message, null, 4)}`); }, signatureHelp: { enabled: true }, format: { enabled: true }, - saveActions: { organizeImports: false } + saveActions: { organizeImports: false }, + inlayHints: { parameterNames: { enabled: "all" } }, + referencesCodeLens: { enabled: true }, + implementationsCodeLens: { enabled: true } } }; } return __toCommonJS(java_lsp_client_exports); })(); -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvY29tbW9uL2lzLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlcy5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vbGlua2VkTWFwLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9kaXNwb3NhYmxlLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9yYWwuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvY29tbW9uL2V2ZW50cy5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vY2FuY2VsbGF0aW9uLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9zaGFyZWRBcnJheUNhbmNlbGxhdGlvbi5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vc2VtYXBob3JlLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlUmVhZGVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlV3JpdGVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlQnVmZmVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9jb25uZWN0aW9uLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9hcGkuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvYnJvd3Nlci9yaWwuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvYnJvd3Nlci9tYWluLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvYnJvd3Nlci5qcyIsICJsc3AvamF2YS1sc3AtY2xpZW50LnRzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLXdzLWpzb25ycGMvc3JjL2Rpc3Bvc2FibGUudHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvc29ja2V0L3NvY2tldC50cyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS13cy1qc29ucnBjL3NyYy9zb2NrZXQvcmVhZGVyLnRzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLXdzLWpzb25ycGMvc3JjL3NvY2tldC93cml0ZXIudHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvc29ja2V0L2Nvbm5lY3Rpb24udHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvY29ubmVjdGlvbi50cyIsICJsc3AvbW9uYWNvLXNoaW0udHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtbGFuZ3VhZ2VzZXJ2ZXItdHlwZXMvbGliL2VzbS9tYWluLmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuc3RyaW5nQXJyYXkgPSBleHBvcnRzLmFycmF5ID0gZXhwb3J0cy5mdW5jID0gZXhwb3J0cy5lcnJvciA9IGV4cG9ydHMubnVtYmVyID0gZXhwb3J0cy5zdHJpbmcgPSBleHBvcnRzLmJvb2xlYW4gPSB2b2lkIDA7XG5mdW5jdGlvbiBib29sZWFuKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZTtcbn1cbmV4cG9ydHMuYm9vbGVhbiA9IGJvb2xlYW47XG5mdW5jdGlvbiBzdHJpbmcodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZztcbn1cbmV4cG9ydHMuc3RyaW5nID0gc3RyaW5nO1xuZnVuY3Rpb24gbnVtYmVyKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdmFsdWUgaW5zdGFuY2VvZiBOdW1iZXI7XG59XG5leHBvcnRzLm51bWJlciA9IG51bWJlcjtcbmZ1bmN0aW9uIGVycm9yKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgRXJyb3I7XG59XG5leHBvcnRzLmVycm9yID0gZXJyb3I7XG5mdW5jdGlvbiBmdW5jKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cbmV4cG9ydHMuZnVuYyA9IGZ1bmM7XG5mdW5jdGlvbiBhcnJheSh2YWx1ZSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cbmV4cG9ydHMuYXJyYXkgPSBhcnJheTtcbmZ1bmN0aW9uIHN0cmluZ0FycmF5KHZhbHVlKSB7XG4gICAgcmV0dXJuIGFycmF5KHZhbHVlKSAmJiB2YWx1ZS5ldmVyeShlbGVtID0+IHN0cmluZyhlbGVtKSk7XG59XG5leHBvcnRzLnN0cmluZ0FycmF5ID0gc3RyaW5nQXJyYXk7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLk1lc3NhZ2UgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU5ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlOCA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTcgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU2ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNSA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTQgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUzID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMiA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTEgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUwID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTkgPSBleHBvcnRzLlJlcXVlc3RUeXBlOCA9IGV4cG9ydHMuUmVxdWVzdFR5cGU3ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTYgPSBleHBvcnRzLlJlcXVlc3RUeXBlNSA9IGV4cG9ydHMuUmVxdWVzdFR5cGU0ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTMgPSBleHBvcnRzLlJlcXVlc3RUeXBlMiA9IGV4cG9ydHMuUmVxdWVzdFR5cGUxID0gZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IGV4cG9ydHMuUmVxdWVzdFR5cGUwID0gZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUgPSBleHBvcnRzLlBhcmFtZXRlclN0cnVjdHVyZXMgPSBleHBvcnRzLlJlc3BvbnNlRXJyb3IgPSBleHBvcnRzLkVycm9yQ29kZXMgPSB2b2lkIDA7XG5jb25zdCBpcyA9IHJlcXVpcmUoXCIuL2lzXCIpO1xuLyoqXG4gKiBQcmVkZWZpbmVkIGVycm9yIGNvZGVzLlxuICovXG52YXIgRXJyb3JDb2RlcztcbihmdW5jdGlvbiAoRXJyb3JDb2Rlcykge1xuICAgIC8vIERlZmluZWQgYnkgSlNPTiBSUENcbiAgICBFcnJvckNvZGVzLlBhcnNlRXJyb3IgPSAtMzI3MDA7XG4gICAgRXJyb3JDb2Rlcy5JbnZhbGlkUmVxdWVzdCA9IC0zMjYwMDtcbiAgICBFcnJvckNvZGVzLk1ldGhvZE5vdEZvdW5kID0gLTMyNjAxO1xuICAgIEVycm9yQ29kZXMuSW52YWxpZFBhcmFtcyA9IC0zMjYwMjtcbiAgICBFcnJvckNvZGVzLkludGVybmFsRXJyb3IgPSAtMzI2MDM7XG4gICAgLyoqXG4gICAgICogVGhpcyBpcyB0aGUgc3RhcnQgcmFuZ2Ugb2YgSlNPTiBSUEMgcmVzZXJ2ZWQgZXJyb3IgY29kZXMuXG4gICAgICogSXQgZG9lc24ndCBkZW5vdGUgYSByZWFsIGVycm9yIGNvZGUuIE5vIGFwcGxpY2F0aW9uIGVycm9yIGNvZGVzIHNob3VsZFxuICAgICAqIGJlIGRlZmluZWQgYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCByYW5nZS4gRm9yIGJhY2t3YXJkc1xuICAgICAqIGNvbXBhdGliaWxpdHkgdGhlIGBTZXJ2ZXJOb3RJbml0aWFsaXplZGAgYW5kIHRoZSBgVW5rbm93bkVycm9yQ29kZWBcbiAgICAgKiBhcmUgbGVmdCBpbiB0aGUgcmFuZ2UuXG4gICAgICpcbiAgICAgKiBAc2luY2UgMy4xNi4wXG4gICAgKi9cbiAgICBFcnJvckNvZGVzLmpzb25ycGNSZXNlcnZlZEVycm9yUmFuZ2VTdGFydCA9IC0zMjA5OTtcbiAgICAvKiogQGRlcHJlY2F0ZWQgdXNlICBqc29ucnBjUmVzZXJ2ZWRFcnJvclJhbmdlU3RhcnQgKi9cbiAgICBFcnJvckNvZGVzLnNlcnZlckVycm9yU3RhcnQgPSAtMzIwOTk7XG4gICAgLyoqXG4gICAgICogQW4gZXJyb3Igb2NjdXJyZWQgd2hlbiB3cml0ZSBhIG1lc3NhZ2UgdG8gdGhlIHRyYW5zcG9ydCBsYXllci5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLk1lc3NhZ2VXcml0ZUVycm9yID0gLTMyMDk5O1xuICAgIC8qKlxuICAgICAqIEFuIGVycm9yIG9jY3VycmVkIHdoZW4gcmVhZGluZyBhIG1lc3NhZ2UgZnJvbSB0aGUgdHJhbnNwb3J0IGxheWVyLlxuICAgICAqL1xuICAgIEVycm9yQ29kZXMuTWVzc2FnZVJlYWRFcnJvciA9IC0zMjA5ODtcbiAgICAvKipcbiAgICAgKiBUaGUgY29ubmVjdGlvbiBnb3QgZGlzcG9zZWQgb3IgbG9zdCBhbmQgYWxsIHBlbmRpbmcgcmVzcG9uc2VzIGdvdFxuICAgICAqIHJlamVjdGVkLlxuICAgICAqL1xuICAgIEVycm9yQ29kZXMuUGVuZGluZ1Jlc3BvbnNlUmVqZWN0ZWQgPSAtMzIwOTc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gaXMgaW5hY3RpdmUgYW5kIGEgdXNlIG9mIGl0IGZhaWxlZC5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLkNvbm5lY3Rpb25JbmFjdGl2ZSA9IC0zMjA5NjtcbiAgICAvKipcbiAgICAgKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBhIHNlcnZlciByZWNlaXZlZCBhIG5vdGlmaWNhdGlvbiBvclxuICAgICAqIHJlcXVlc3QgYmVmb3JlIHRoZSBzZXJ2ZXIgaGFzIHJlY2VpdmVkIHRoZSBgaW5pdGlhbGl6ZWAgcmVxdWVzdC5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLlNlcnZlck5vdEluaXRpYWxpemVkID0gLTMyMDAyO1xuICAgIEVycm9yQ29kZXMuVW5rbm93bkVycm9yQ29kZSA9IC0zMjAwMTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIHRoZSBlbmQgcmFuZ2Ugb2YgSlNPTiBSUEMgcmVzZXJ2ZWQgZXJyb3IgY29kZXMuXG4gICAgICogSXQgZG9lc24ndCBkZW5vdGUgYSByZWFsIGVycm9yIGNvZGUuXG4gICAgICpcbiAgICAgKiBAc2luY2UgMy4xNi4wXG4gICAgKi9cbiAgICBFcnJvckNvZGVzLmpzb25ycGNSZXNlcnZlZEVycm9yUmFuZ2VFbmQgPSAtMzIwMDA7XG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSAganNvbnJwY1Jlc2VydmVkRXJyb3JSYW5nZUVuZCAqL1xuICAgIEVycm9yQ29kZXMuc2VydmVyRXJyb3JFbmQgPSAtMzIwMDA7XG59KShFcnJvckNvZGVzIHx8IChleHBvcnRzLkVycm9yQ29kZXMgPSBFcnJvckNvZGVzID0ge30pKTtcbi8qKlxuICogQW4gZXJyb3Igb2JqZWN0IHJldHVybiBpbiBhIHJlc3BvbnNlIGluIGNhc2UgYSByZXF1ZXN0XG4gKiBoYXMgZmFpbGVkLlxuICovXG5jbGFzcyBSZXNwb25zZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNvZGUsIG1lc3NhZ2UsIGRhdGEpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuY29kZSA9IGlzLm51bWJlcihjb2RlKSA/IGNvZGUgOiBFcnJvckNvZGVzLlVua25vd25FcnJvckNvZGU7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBSZXNwb25zZUVycm9yLnByb3RvdHlwZSk7XG4gICAgfVxuICAgIHRvSnNvbigpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgY29kZTogdGhpcy5jb2RlLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLmRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmRhdGEgPSB0aGlzLmRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5leHBvcnRzLlJlc3BvbnNlRXJyb3IgPSBSZXNwb25zZUVycm9yO1xuY2xhc3MgUGFyYW1ldGVyU3RydWN0dXJlcyB7XG4gICAgY29uc3RydWN0b3Ioa2luZCkge1xuICAgICAgICB0aGlzLmtpbmQgPSBraW5kO1xuICAgIH1cbiAgICBzdGF0aWMgaXModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8gfHwgdmFsdWUgPT09IFBhcmFtZXRlclN0cnVjdHVyZXMuYnlOYW1lIHx8IHZhbHVlID09PSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5UG9zaXRpb247XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5raW5kO1xuICAgIH1cbn1cbmV4cG9ydHMuUGFyYW1ldGVyU3RydWN0dXJlcyA9IFBhcmFtZXRlclN0cnVjdHVyZXM7XG4vKipcbiAqIFRoZSBwYXJhbWV0ZXIgc3RydWN0dXJlIGlzIGF1dG9tYXRpY2FsbHkgaW5mZXJyZWQgb24gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzXG4gKiBhbmQgdGhlIHBhcmFtZXRlciB0eXBlIGluIGNhc2Ugb2YgYSBzaW5nbGUgcGFyYW0uXG4gKi9cblBhcmFtZXRlclN0cnVjdHVyZXMuYXV0byA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdhdXRvJyk7XG4vKipcbiAqIEZvcmNlcyBgYnlQb3NpdGlvbmAgcGFyYW1ldGVyIHN0cnVjdHVyZS4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGhhdmUgYSBzaW5nbGVcbiAqIHBhcmFtZXRlciB3aGljaCBoYXMgYSBsaXRlcmFsIHR5cGUuXG4gKi9cblBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbiA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdieVBvc2l0aW9uJyk7XG4vKipcbiAqIEZvcmNlcyBgYnlOYW1lYCBwYXJhbWV0ZXIgc3RydWN0dXJlLiBUaGlzIGlzIG9ubHkgdXNlZnVsIHdoZW4gaGF2aW5nIGEgc2luZ2xlXG4gKiBwYXJhbWV0ZXIuIFRoZSBsaWJyYXJ5IHdpbGwgcmVwb3J0IGVycm9ycyBpZiB1c2VkIHdpdGggYSBkaWZmZXJlbnQgbnVtYmVyIG9mXG4gKiBwYXJhbWV0ZXJzLlxuICovXG5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdieU5hbWUnKTtcbi8qKlxuICogQW4gYWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgYSBNZXNzYWdlVHlwZS5cbiAqL1xuY2xhc3MgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIG51bWJlck9mUGFyYW1zKSB7XG4gICAgICAgIHRoaXMubWV0aG9kID0gbWV0aG9kO1xuICAgICAgICB0aGlzLm51bWJlck9mUGFyYW1zID0gbnVtYmVyT2ZQYXJhbXM7XG4gICAgfVxuICAgIGdldCBwYXJhbWV0ZXJTdHJ1Y3R1cmVzKCkge1xuICAgICAgICByZXR1cm4gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvO1xuICAgIH1cbn1cbmV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlID0gQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlO1xuLyoqXG4gKiBDbGFzc2VzIHRvIHR5cGUgcmVxdWVzdCByZXNwb25zZSBwYWlyc1xuICovXG5jbGFzcyBSZXF1ZXN0VHlwZTAgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDApO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGUwID0gUmVxdWVzdFR5cGUwO1xuY2xhc3MgUmVxdWVzdFR5cGUgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCwgX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8pIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAxKTtcbiAgICAgICAgdGhpcy5fcGFyYW1ldGVyU3RydWN0dXJlcyA9IF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbiAgICBnZXQgcGFyYW1ldGVyU3RydWN0dXJlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXM7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IFJlcXVlc3RUeXBlO1xuY2xhc3MgUmVxdWVzdFR5cGUxIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMSk7XG4gICAgICAgIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBfcGFyYW1ldGVyU3RydWN0dXJlcztcbiAgICB9XG4gICAgZ2V0IHBhcmFtZXRlclN0cnVjdHVyZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGUxID0gUmVxdWVzdFR5cGUxO1xuY2xhc3MgUmVxdWVzdFR5cGUyIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAyKTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlMiA9IFJlcXVlc3RUeXBlMjtcbmNsYXNzIFJlcXVlc3RUeXBlMyBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMyk7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTMgPSBSZXF1ZXN0VHlwZTM7XG5jbGFzcyBSZXF1ZXN0VHlwZTQgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDQpO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGU0ID0gUmVxdWVzdFR5cGU0O1xuY2xhc3MgUmVxdWVzdFR5cGU1IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA1KTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlNSA9IFJlcXVlc3RUeXBlNTtcbmNsYXNzIFJlcXVlc3RUeXBlNiBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNik7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTYgPSBSZXF1ZXN0VHlwZTY7XG5jbGFzcyBSZXF1ZXN0VHlwZTcgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDcpO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGU3ID0gUmVxdWVzdFR5cGU3O1xuY2xhc3MgUmVxdWVzdFR5cGU4IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA4KTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlOCA9IFJlcXVlc3RUeXBlODtcbmNsYXNzIFJlcXVlc3RUeXBlOSBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgOSk7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTkgPSBSZXF1ZXN0VHlwZTk7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMSk7XG4gICAgICAgIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBfcGFyYW1ldGVyU3RydWN0dXJlcztcbiAgICB9XG4gICAgZ2V0IHBhcmFtZXRlclN0cnVjdHVyZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZSA9IE5vdGlmaWNhdGlvblR5cGU7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlMCBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMCk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMCA9IE5vdGlmaWNhdGlvblR5cGUwO1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTEgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCwgX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8pIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAxKTtcbiAgICAgICAgdGhpcy5fcGFyYW1ldGVyU3RydWN0dXJlcyA9IF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbiAgICBnZXQgcGFyYW1ldGVyU3RydWN0dXJlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXM7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMSA9IE5vdGlmaWNhdGlvblR5cGUxO1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDIpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTIgPSBOb3RpZmljYXRpb25UeXBlMjtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGUzIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAzKTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGUzID0gTm90aWZpY2F0aW9uVHlwZTM7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlNCBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNCk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNCA9IE5vdGlmaWNhdGlvblR5cGU0O1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTUgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDUpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTUgPSBOb3RpZmljYXRpb25UeXBlNTtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGU2IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA2KTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGU2ID0gTm90aWZpY2F0aW9uVHlwZTY7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlNyBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNyk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNyA9IE5vdGlmaWNhdGlvblR5cGU3O1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTggZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDgpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTggPSBOb3RpZmljYXRpb25UeXBlODtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGU5IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA5KTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGU5ID0gTm90aWZpY2F0aW9uVHlwZTk7XG52YXIgTWVzc2FnZTtcbihmdW5jdGlvbiAoTWVzc2FnZSkge1xuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoZSBnaXZlbiBtZXNzYWdlIGlzIGEgcmVxdWVzdCBtZXNzYWdlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gbWVzc2FnZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBpcy5zdHJpbmcoY2FuZGlkYXRlLm1ldGhvZCkgJiYgKGlzLnN0cmluZyhjYW5kaWRhdGUuaWQpIHx8IGlzLm51bWJlcihjYW5kaWRhdGUuaWQpKTtcbiAgICB9XG4gICAgTWVzc2FnZS5pc1JlcXVlc3QgPSBpc1JlcXVlc3Q7XG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhlIGdpdmVuIG1lc3NhZ2UgaXMgYSBub3RpZmljYXRpb24gbWVzc2FnZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTm90aWZpY2F0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gbWVzc2FnZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBpcy5zdHJpbmcoY2FuZGlkYXRlLm1ldGhvZCkgJiYgbWVzc2FnZS5pZCA9PT0gdm9pZCAwO1xuICAgIH1cbiAgICBNZXNzYWdlLmlzTm90aWZpY2F0aW9uID0gaXNOb3RpZmljYXRpb247XG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhlIGdpdmVuIG1lc3NhZ2UgaXMgYSByZXNwb25zZSBtZXNzYWdlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNSZXNwb25zZShtZXNzYWdlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IG1lc3NhZ2U7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgKGNhbmRpZGF0ZS5yZXN1bHQgIT09IHZvaWQgMCB8fCAhIWNhbmRpZGF0ZS5lcnJvcikgJiYgKGlzLnN0cmluZyhjYW5kaWRhdGUuaWQpIHx8IGlzLm51bWJlcihjYW5kaWRhdGUuaWQpIHx8IGNhbmRpZGF0ZS5pZCA9PT0gbnVsbCk7XG4gICAgfVxuICAgIE1lc3NhZ2UuaXNSZXNwb25zZSA9IGlzUmVzcG9uc2U7XG59KShNZXNzYWdlIHx8IChleHBvcnRzLk1lc3NhZ2UgPSBNZXNzYWdlID0ge30pKTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xudmFyIF9hO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5MUlVDYWNoZSA9IGV4cG9ydHMuTGlua2VkTWFwID0gZXhwb3J0cy5Ub3VjaCA9IHZvaWQgMDtcbnZhciBUb3VjaDtcbihmdW5jdGlvbiAoVG91Y2gpIHtcbiAgICBUb3VjaC5Ob25lID0gMDtcbiAgICBUb3VjaC5GaXJzdCA9IDE7XG4gICAgVG91Y2guQXNPbGQgPSBUb3VjaC5GaXJzdDtcbiAgICBUb3VjaC5MYXN0ID0gMjtcbiAgICBUb3VjaC5Bc05ldyA9IFRvdWNoLkxhc3Q7XG59KShUb3VjaCB8fCAoZXhwb3J0cy5Ub3VjaCA9IFRvdWNoID0ge30pKTtcbmNsYXNzIExpbmtlZE1hcCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXNbX2FdID0gJ0xpbmtlZE1hcCc7XG4gICAgICAgIHRoaXMuX21hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5faGVhZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fdGFpbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IDA7XG4gICAgICAgIHRoaXMuX3N0YXRlID0gMDtcbiAgICB9XG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuX21hcC5jbGVhcigpO1xuICAgICAgICB0aGlzLl9oZWFkID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl90YWlsID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9zaXplID0gMDtcbiAgICAgICAgdGhpcy5fc3RhdGUrKztcbiAgICB9XG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLl9oZWFkICYmICF0aGlzLl90YWlsO1xuICAgIH1cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpemU7XG4gICAgfVxuICAgIGdldCBmaXJzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlYWQ/LnZhbHVlO1xuICAgIH1cbiAgICBnZXQgbGFzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhaWw/LnZhbHVlO1xuICAgIH1cbiAgICBoYXMoa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXAuaGFzKGtleSk7XG4gICAgfVxuICAgIGdldChrZXksIHRvdWNoID0gVG91Y2guTm9uZSkge1xuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5fbWFwLmdldChrZXkpO1xuICAgICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRvdWNoICE9PSBUb3VjaC5Ob25lKSB7XG4gICAgICAgICAgICB0aGlzLnRvdWNoKGl0ZW0sIHRvdWNoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICB9XG4gICAgc2V0KGtleSwgdmFsdWUsIHRvdWNoID0gVG91Y2guTm9uZSkge1xuICAgICAgICBsZXQgaXRlbSA9IHRoaXMuX21hcC5nZXQoa2V5KTtcbiAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgIGl0ZW0udmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIGlmICh0b3VjaCAhPT0gVG91Y2guTm9uZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudG91Y2goaXRlbSwgdG91Y2gpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaXRlbSA9IHsga2V5LCB2YWx1ZSwgbmV4dDogdW5kZWZpbmVkLCBwcmV2aW91czogdW5kZWZpbmVkIH07XG4gICAgICAgICAgICBzd2l0Y2ggKHRvdWNoKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBUb3VjaC5Ob25lOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFRvdWNoLkZpcnN0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1GaXJzdChpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBUb3VjaC5MYXN0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX21hcC5zZXQoa2V5LCBpdGVtKTtcbiAgICAgICAgICAgIHRoaXMuX3NpemUrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGVsZXRlKGtleSkge1xuICAgICAgICByZXR1cm4gISF0aGlzLnJlbW92ZShrZXkpO1xuICAgIH1cbiAgICByZW1vdmUoa2V5KSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl9tYXAuZ2V0KGtleSk7XG4gICAgICAgIGlmICghaXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tYXAuZGVsZXRlKGtleSk7XG4gICAgICAgIHRoaXMucmVtb3ZlSXRlbShpdGVtKTtcbiAgICAgICAgdGhpcy5fc2l6ZS0tO1xuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICB9XG4gICAgc2hpZnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5faGVhZCAmJiAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2hlYWQgfHwgIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIHRoaXMuX21hcC5kZWxldGUoaXRlbS5rZXkpO1xuICAgICAgICB0aGlzLnJlbW92ZUl0ZW0oaXRlbSk7XG4gICAgICAgIHRoaXMuX3NpemUtLTtcbiAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7XG4gICAgfVxuICAgIGZvckVhY2goY2FsbGJhY2tmbiwgdGhpc0FyZykge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3N0YXRlO1xuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICAgICAgICBpZiAodGhpc0FyZykge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrZm4uYmluZCh0aGlzQXJnKShjdXJyZW50LnZhbHVlLCBjdXJyZW50LmtleSwgdGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFja2ZuKGN1cnJlbnQudmFsdWUsIGN1cnJlbnQua2V5LCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gc3RhdGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExpbmtlZE1hcCBnb3QgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAga2V5cygpIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9zdGF0ZTtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLl9oZWFkO1xuICAgICAgICBjb25zdCBpdGVyYXRvciA9IHtcbiAgICAgICAgICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fc3RhdGUgIT09IHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTGlua2VkTWFwIGdvdCBtb2RpZmllZCBkdXJpbmcgaXRlcmF0aW9uLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7IHZhbHVlOiBjdXJyZW50LmtleSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICB9XG4gICAgdmFsdWVzKCkge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3N0YXRlO1xuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIGNvbnN0IGl0ZXJhdG9yID0ge1xuICAgICAgICAgICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlcmF0b3I7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBMaW5rZWRNYXAgZ290IG1vZGlmaWVkIGR1cmluZyBpdGVyYXRpb24uYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHsgdmFsdWU6IGN1cnJlbnQudmFsdWUsIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gaXRlcmF0b3I7XG4gICAgfVxuICAgIGVudHJpZXMoKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5fc3RhdGU7XG4gICAgICAgIGxldCBjdXJyZW50ID0gdGhpcy5faGVhZDtcbiAgICAgICAgY29uc3QgaXRlcmF0b3IgPSB7XG4gICAgICAgICAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3N0YXRlICE9PSBzdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExpbmtlZE1hcCBnb3QgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geyB2YWx1ZTogW2N1cnJlbnQua2V5LCBjdXJyZW50LnZhbHVlXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICB9XG4gICAgWyhfYSA9IFN5bWJvbC50b1N0cmluZ1RhZywgU3ltYm9sLml0ZXJhdG9yKV0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMoKTtcbiAgICB9XG4gICAgdHJpbU9sZChuZXdTaXplKSB7XG4gICAgICAgIGlmIChuZXdTaXplID49IHRoaXMuc2l6ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuZXdTaXplID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLl9oZWFkO1xuICAgICAgICBsZXQgY3VycmVudFNpemUgPSB0aGlzLnNpemU7XG4gICAgICAgIHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnRTaXplID4gbmV3U2l6ZSkge1xuICAgICAgICAgICAgdGhpcy5fbWFwLmRlbGV0ZShjdXJyZW50LmtleSk7XG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0O1xuICAgICAgICAgICAgY3VycmVudFNpemUtLTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9oZWFkID0gY3VycmVudDtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IGN1cnJlbnRTaXplO1xuICAgICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICAgICAgY3VycmVudC5wcmV2aW91cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgIH1cbiAgICBhZGRJdGVtRmlyc3QoaXRlbSkge1xuICAgICAgICAvLyBGaXJzdCB0aW1lIEluc2VydFxuICAgICAgICBpZiAoIXRoaXMuX2hlYWQgJiYgIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRoaXMuX3RhaWwgPSBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCF0aGlzLl9oZWFkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbGlzdCcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdGhpcy5faGVhZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQucHJldmlvdXMgPSBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2hlYWQgPSBpdGVtO1xuICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgIH1cbiAgICBhZGRJdGVtTGFzdChpdGVtKSB7XG4gICAgICAgIC8vIEZpcnN0IHRpbWUgSW5zZXJ0XG4gICAgICAgIGlmICghdGhpcy5faGVhZCAmJiAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgdGhpcy5faGVhZCA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpdGVtLnByZXZpb3VzID0gdGhpcy5fdGFpbDtcbiAgICAgICAgICAgIHRoaXMuX3RhaWwubmV4dCA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW07XG4gICAgICAgIHRoaXMuX3N0YXRlKys7XG4gICAgfVxuICAgIHJlbW92ZUl0ZW0oaXRlbSkge1xuICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCAmJiBpdGVtID09PSB0aGlzLl90YWlsKSB7XG4gICAgICAgICAgICB0aGlzLl9oZWFkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpdGVtID09PSB0aGlzLl9oZWFkKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGNhbiBvbmx5IGhhcHBlbmVkIGlmIHNpemUgPT09IDEgd2hpY2ggaXMgaGFuZGxlXG4gICAgICAgICAgICAvLyBieSB0aGUgY2FzZSBhYm92ZS5cbiAgICAgICAgICAgIGlmICghaXRlbS5uZXh0KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxpc3QnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGl0ZW0ubmV4dC5wcmV2aW91cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQgPSBpdGVtLm5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXRlbSA9PT0gdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgLy8gVGhpcyBjYW4gb25seSBoYXBwZW5lZCBpZiBzaXplID09PSAxIHdoaWNoIGlzIGhhbmRsZVxuICAgICAgICAgICAgLy8gYnkgdGhlIGNhc2UgYWJvdmUuXG4gICAgICAgICAgICBpZiAoIWl0ZW0ucHJldmlvdXMpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbGlzdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbS5wcmV2aW91cy5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gaXRlbS5uZXh0O1xuICAgICAgICAgICAgY29uc3QgcHJldmlvdXMgPSBpdGVtLnByZXZpb3VzO1xuICAgICAgICAgICAgaWYgKCFuZXh0IHx8ICFwcmV2aW91cykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXh0LnByZXZpb3VzID0gcHJldmlvdXM7XG4gICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gbmV4dDtcbiAgICAgICAgfVxuICAgICAgICBpdGVtLm5leHQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGl0ZW0ucHJldmlvdXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX3N0YXRlKys7XG4gICAgfVxuICAgIHRvdWNoKGl0ZW0sIHRvdWNoKSB7XG4gICAgICAgIGlmICghdGhpcy5faGVhZCB8fCAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxpc3QnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHRvdWNoICE9PSBUb3VjaC5GaXJzdCAmJiB0b3VjaCAhPT0gVG91Y2guTGFzdCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG91Y2ggPT09IFRvdWNoLkZpcnN0KSB7XG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBpdGVtLm5leHQ7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgICAgICAvLyBVbmxpbmsgdGhlIGl0ZW1cbiAgICAgICAgICAgIGlmIChpdGVtID09PSB0aGlzLl90YWlsKSB7XG4gICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgbXVzdCBiZSBkZWZpbmVkIHNpbmNlIGl0ZW0gd2FzIG5vdCBoZWFkIGJ1dCBpcyB0YWlsXG4gICAgICAgICAgICAgICAgLy8gU28gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbiBpdGVtIGluIHRoZSBtYXBcbiAgICAgICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuX3RhaWwgPSBwcmV2aW91cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEJvdGggbmV4dCBhbmQgcHJldmlvdXMgYXJlIG5vdCB1bmRlZmluZWQgc2luY2UgaXRlbSB3YXMgbmVpdGhlciBoZWFkIG5vciB0YWlsLlxuICAgICAgICAgICAgICAgIG5leHQucHJldmlvdXMgPSBwcmV2aW91cztcbiAgICAgICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEluc2VydCB0aGUgbm9kZSBhdCBoZWFkXG4gICAgICAgICAgICBpdGVtLnByZXZpb3VzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdGhpcy5faGVhZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQucHJldmlvdXMgPSBpdGVtO1xuICAgICAgICAgICAgdGhpcy5faGVhZCA9IGl0ZW07XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRvdWNoID09PSBUb3VjaC5MYXN0KSB7XG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBpdGVtLm5leHQ7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgICAgICAvLyBVbmxpbmsgdGhlIGl0ZW0uXG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCkge1xuICAgICAgICAgICAgICAgIC8vIG5leHQgbXVzdCBiZSBkZWZpbmVkIHNpbmNlIGl0ZW0gd2FzIG5vdCB0YWlsIGJ1dCBpcyBoZWFkXG4gICAgICAgICAgICAgICAgLy8gU28gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbiBpdGVtIGluIHRoZSBtYXBcbiAgICAgICAgICAgICAgICBuZXh0LnByZXZpb3VzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuX2hlYWQgPSBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQm90aCBuZXh0IGFuZCBwcmV2aW91cyBhcmUgbm90IHVuZGVmaW5lZCBzaW5jZSBpdGVtIHdhcyBuZWl0aGVyIGhlYWQgbm9yIHRhaWwuXG4gICAgICAgICAgICAgICAgbmV4dC5wcmV2aW91cyA9IHByZXZpb3VzO1xuICAgICAgICAgICAgICAgIHByZXZpb3VzLm5leHQgPSBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaXRlbS5wcmV2aW91cyA9IHRoaXMuX3RhaWw7XG4gICAgICAgICAgICB0aGlzLl90YWlsLm5leHQgPSBpdGVtO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW07XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IFtdO1xuICAgICAgICB0aGlzLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGRhdGEucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGZyb21KU09OKGRhdGEpIHtcbiAgICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBkYXRhKSB7XG4gICAgICAgICAgICB0aGlzLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuTGlua2VkTWFwID0gTGlua2VkTWFwO1xuY2xhc3MgTFJVQ2FjaGUgZXh0ZW5kcyBMaW5rZWRNYXAge1xuICAgIGNvbnN0cnVjdG9yKGxpbWl0LCByYXRpbyA9IDEpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fbGltaXQgPSBsaW1pdDtcbiAgICAgICAgdGhpcy5fcmF0aW8gPSBNYXRoLm1pbihNYXRoLm1heCgwLCByYXRpbyksIDEpO1xuICAgIH1cbiAgICBnZXQgbGltaXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9saW1pdDtcbiAgICB9XG4gICAgc2V0IGxpbWl0KGxpbWl0KSB7XG4gICAgICAgIHRoaXMuX2xpbWl0ID0gbGltaXQ7XG4gICAgICAgIHRoaXMuY2hlY2tUcmltKCk7XG4gICAgfVxuICAgIGdldCByYXRpbygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JhdGlvO1xuICAgIH1cbiAgICBzZXQgcmF0aW8ocmF0aW8pIHtcbiAgICAgICAgdGhpcy5fcmF0aW8gPSBNYXRoLm1pbihNYXRoLm1heCgwLCByYXRpbyksIDEpO1xuICAgICAgICB0aGlzLmNoZWNrVHJpbSgpO1xuICAgIH1cbiAgICBnZXQoa2V5LCB0b3VjaCA9IFRvdWNoLkFzTmV3KSB7XG4gICAgICAgIHJldHVybiBzdXBlci5nZXQoa2V5LCB0b3VjaCk7XG4gICAgfVxuICAgIHBlZWsoa2V5KSB7XG4gICAgICAgIHJldHVybiBzdXBlci5nZXQoa2V5LCBUb3VjaC5Ob25lKTtcbiAgICB9XG4gICAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgc3VwZXIuc2V0KGtleSwgdmFsdWUsIFRvdWNoLkxhc3QpO1xuICAgICAgICB0aGlzLmNoZWNrVHJpbSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgY2hlY2tUcmltKCkge1xuICAgICAgICBpZiAodGhpcy5zaXplID4gdGhpcy5fbGltaXQpIHtcbiAgICAgICAgICAgIHRoaXMudHJpbU9sZChNYXRoLnJvdW5kKHRoaXMuX2xpbWl0ICogdGhpcy5fcmF0aW8pKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuTFJVQ2FjaGUgPSBMUlVDYWNoZTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5EaXNwb3NhYmxlID0gdm9pZCAwO1xudmFyIERpc3Bvc2FibGU7XG4oZnVuY3Rpb24gKERpc3Bvc2FibGUpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUoZnVuYykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGlzcG9zZTogZnVuY1xuICAgICAgICB9O1xuICAgIH1cbiAgICBEaXNwb3NhYmxlLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKERpc3Bvc2FibGUgfHwgKGV4cG9ydHMuRGlzcG9zYWJsZSA9IERpc3Bvc2FibGUgPSB7fSkpO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xubGV0IF9yYWw7XG5mdW5jdGlvbiBSQUwoKSB7XG4gICAgaWYgKF9yYWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHJ1bnRpbWUgYWJzdHJhY3Rpb24gbGF5ZXIgaW5zdGFsbGVkYCk7XG4gICAgfVxuICAgIHJldHVybiBfcmFsO1xufVxuKGZ1bmN0aW9uIChSQUwpIHtcbiAgICBmdW5jdGlvbiBpbnN0YWxsKHJhbCkge1xuICAgICAgICBpZiAocmFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gcnVudGltZSBhYnN0cmFjdGlvbiBsYXllciBwcm92aWRlZGApO1xuICAgICAgICB9XG4gICAgICAgIF9yYWwgPSByYWw7XG4gICAgfVxuICAgIFJBTC5pbnN0YWxsID0gaW5zdGFsbDtcbn0pKFJBTCB8fCAoUkFMID0ge30pKTtcbmV4cG9ydHMuZGVmYXVsdCA9IFJBTDtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuRW1pdHRlciA9IGV4cG9ydHMuRXZlbnQgPSB2b2lkIDA7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbnZhciBFdmVudDtcbihmdW5jdGlvbiAoRXZlbnQpIHtcbiAgICBjb25zdCBfZGlzcG9zYWJsZSA9IHsgZGlzcG9zZSgpIHsgfSB9O1xuICAgIEV2ZW50Lk5vbmUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBfZGlzcG9zYWJsZTsgfTtcbn0pKEV2ZW50IHx8IChleHBvcnRzLkV2ZW50ID0gRXZlbnQgPSB7fSkpO1xuY2xhc3MgQ2FsbGJhY2tMaXN0IHtcbiAgICBhZGQoY2FsbGJhY2ssIGNvbnRleHQgPSBudWxsLCBidWNrZXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fY29udGV4dHMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgICAgIHRoaXMuX2NvbnRleHRzLnB1c2goY29udGV4dCk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGJ1Y2tldCkpIHtcbiAgICAgICAgICAgIGJ1Y2tldC5wdXNoKHsgZGlzcG9zZTogKCkgPT4gdGhpcy5yZW1vdmUoY2FsbGJhY2ssIGNvbnRleHQpIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlbW92ZShjYWxsYmFjaywgY29udGV4dCA9IG51bGwpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZm91bmRDYWxsYmFja1dpdGhEaWZmZXJlbnRDb250ZXh0ID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLl9jYWxsYmFja3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jYWxsYmFja3NbaV0gPT09IGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NvbnRleHRzW2ldID09PSBjb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrICYgY29udGV4dCBtYXRjaCA9PiByZW1vdmUgaXRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29udGV4dHMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZENhbGxiYWNrV2l0aERpZmZlcmVudENvbnRleHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZm91bmRDYWxsYmFja1dpdGhEaWZmZXJlbnRDb250ZXh0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1doZW4gYWRkaW5nIGEgbGlzdGVuZXIgd2l0aCBhIGNvbnRleHQsIHlvdSBzaG91bGQgcmVtb3ZlIGl0IHdpdGggdGhlIHNhbWUgY29udGV4dCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGludm9rZSguLi5hcmdzKSB7XG4gICAgICAgIGlmICghdGhpcy5fY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmV0ID0gW10sIGNhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcy5zbGljZSgwKSwgY29udGV4dHMgPSB0aGlzLl9jb250ZXh0cy5zbGljZSgwKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXQucHVzaChjYWxsYmFja3NbaV0uYXBwbHkoY29udGV4dHNbaV0sIGFyZ3MpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS5jb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICAgIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5fY2FsbGJhY2tzIHx8IHRoaXMuX2NhbGxiYWNrcy5sZW5ndGggPT09IDA7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fY29udGV4dHMgPSB1bmRlZmluZWQ7XG4gICAgfVxufVxuY2xhc3MgRW1pdHRlciB7XG4gICAgY29uc3RydWN0b3IoX29wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IF9vcHRpb25zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGb3IgdGhlIHB1YmxpYyB0byBhbGxvdyB0byBzdWJzY3JpYmVcbiAgICAgKiB0byBldmVudHMgZnJvbSB0aGlzIEVtaXR0ZXJcbiAgICAgKi9cbiAgICBnZXQgZXZlbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fZXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50ID0gKGxpc3RlbmVyLCB0aGlzQXJncywgZGlzcG9zYWJsZXMpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2NhbGxiYWNrcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWxsYmFja3MgPSBuZXcgQ2FsbGJhY2tMaXN0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMub25GaXJzdExpc3RlbmVyQWRkICYmIHRoaXMuX2NhbGxiYWNrcy5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy5vbkZpcnN0TGlzdGVuZXJBZGQodGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5hZGQobGlzdGVuZXIsIHRoaXNBcmdzKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlzcG9zYWJsZSBpcyBkaXNwb3NlZCBhZnRlciBlbWl0dGVyIGlzIGRpc3Bvc2VkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5yZW1vdmUobGlzdGVuZXIsIHRoaXNBcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5kaXNwb3NlID0gRW1pdHRlci5fbm9vcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMub25MYXN0TGlzdGVuZXJSZW1vdmUgJiYgdGhpcy5fY2FsbGJhY2tzLmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29wdGlvbnMub25MYXN0TGlzdGVuZXJSZW1vdmUodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRpc3Bvc2FibGVzKSkge1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlcy5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9ldmVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVG8gYmUga2VwdCBwcml2YXRlIHRvIGZpcmUgYW4gZXZlbnQgdG9cbiAgICAgKiBzdWJzY3JpYmVyc1xuICAgICAqL1xuICAgIGZpcmUoZXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NhbGxiYWNrcykge1xuICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzLmludm9rZS5jYWxsKHRoaXMuX2NhbGxiYWNrcywgZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5kaXNwb3NlKCk7XG4gICAgICAgICAgICB0aGlzLl9jYWxsYmFja3MgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLkVtaXR0ZXIgPSBFbWl0dGVyO1xuRW1pdHRlci5fbm9vcCA9IGZ1bmN0aW9uICgpIHsgfTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uVG9rZW4gPSB2b2lkIDA7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbmNvbnN0IElzID0gcmVxdWlyZShcIi4vaXNcIik7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCIuL2V2ZW50c1wiKTtcbnZhciBDYW5jZWxsYXRpb25Ub2tlbjtcbihmdW5jdGlvbiAoQ2FuY2VsbGF0aW9uVG9rZW4pIHtcbiAgICBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGlzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkOiBmYWxzZSxcbiAgICAgICAgb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6IGV2ZW50c18xLkV2ZW50Lk5vbmVcbiAgICB9KTtcbiAgICBDYW5jZWxsYXRpb25Ub2tlbi5DYW5jZWxsZWQgPSBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6IHRydWUsXG4gICAgICAgIG9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkOiBldmVudHNfMS5FdmVudC5Ob25lXG4gICAgfSk7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgKGNhbmRpZGF0ZSA9PT0gQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZVxuICAgICAgICAgICAgfHwgY2FuZGlkYXRlID09PSBDYW5jZWxsYXRpb25Ub2tlbi5DYW5jZWxsZWRcbiAgICAgICAgICAgIHx8IChJcy5ib29sZWFuKGNhbmRpZGF0ZS5pc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkgJiYgISFjYW5kaWRhdGUub25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQpKTtcbiAgICB9XG4gICAgQ2FuY2VsbGF0aW9uVG9rZW4uaXMgPSBpcztcbn0pKENhbmNlbGxhdGlvblRva2VuIHx8IChleHBvcnRzLkNhbmNlbGxhdGlvblRva2VuID0gQ2FuY2VsbGF0aW9uVG9rZW4gPSB7fSkpO1xuY29uc3Qgc2hvcnRjdXRFdmVudCA9IE9iamVjdC5mcmVlemUoZnVuY3Rpb24gKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgY29uc3QgaGFuZGxlID0gKDAsIHJhbF8xLmRlZmF1bHQpKCkudGltZXIuc2V0VGltZW91dChjYWxsYmFjay5iaW5kKGNvbnRleHQpLCAwKTtcbiAgICByZXR1cm4geyBkaXNwb3NlKCkgeyBoYW5kbGUuZGlzcG9zZSgpOyB9IH07XG59KTtcbmNsYXNzIE11dGFibGVUb2tlbiB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX2lzQ2FuY2VsbGVkID0gZmFsc2U7XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9pc0NhbmNlbGxlZCkge1xuICAgICAgICAgICAgdGhpcy5faXNDYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2VtaXR0ZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmZpcmUodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0NhbmNlbGxlZDtcbiAgICB9XG4gICAgZ2V0IG9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKCkge1xuICAgICAgICBpZiAodGhpcy5faXNDYW5jZWxsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBzaG9ydGN1dEV2ZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5fZW1pdHRlcikge1xuICAgICAgICAgICAgdGhpcy5fZW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2VtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLl9lbWl0dGVyKSB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5jbGFzcyBDYW5jZWxsYXRpb25Ub2tlblNvdXJjZSB7XG4gICAgZ2V0IHRva2VuKCkge1xuICAgICAgICBpZiAoIXRoaXMuX3Rva2VuKSB7XG4gICAgICAgICAgICAvLyBiZSBsYXp5IGFuZCBjcmVhdGUgdGhlIHRva2VuIG9ubHkgd2hlblxuICAgICAgICAgICAgLy8gYWN0dWFsbHkgbmVlZGVkXG4gICAgICAgICAgICB0aGlzLl90b2tlbiA9IG5ldyBNdXRhYmxlVG9rZW4oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fdG9rZW47XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl90b2tlbikge1xuICAgICAgICAgICAgLy8gc2F2ZSBhbiBvYmplY3QgYnkgcmV0dXJuaW5nIHRoZSBkZWZhdWx0XG4gICAgICAgICAgICAvLyBjYW5jZWxsZWQgdG9rZW4gd2hlbiBjYW5jZWxsYXRpb24gaGFwcGVuc1xuICAgICAgICAgICAgLy8gYmVmb3JlIHNvbWVvbmUgYXNrcyBmb3IgdGhlIHRva2VuXG4gICAgICAgICAgICB0aGlzLl90b2tlbiA9IENhbmNlbGxhdGlvblRva2VuLkNhbmNlbGxlZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3Rva2VuLmNhbmNlbCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICghdGhpcy5fdG9rZW4pIHtcbiAgICAgICAgICAgIC8vIGVuc3VyZSB0byBpbml0aWFsaXplIHdpdGggYW4gZW1wdHkgdG9rZW4gaWYgd2UgaGFkIG5vbmVcbiAgICAgICAgICAgIHRoaXMuX3Rva2VuID0gQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLl90b2tlbiBpbnN0YW5jZW9mIE11dGFibGVUb2tlbikge1xuICAgICAgICAgICAgLy8gYWN0dWFsbHkgZGlzcG9zZVxuICAgICAgICAgICAgdGhpcy5fdG9rZW4uZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IENhbmNlbGxhdGlvblRva2VuU291cmNlO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3kgPSB2b2lkIDA7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbnZhciBDYW5jZWxsYXRpb25TdGF0ZTtcbihmdW5jdGlvbiAoQ2FuY2VsbGF0aW9uU3RhdGUpIHtcbiAgICBDYW5jZWxsYXRpb25TdGF0ZS5Db250aW51ZSA9IDA7XG4gICAgQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkID0gMTtcbn0pKENhbmNlbGxhdGlvblN0YXRlIHx8IChDYW5jZWxsYXRpb25TdGF0ZSA9IHt9KSk7XG5jbGFzcyBTaGFyZWRBcnJheVNlbmRlclN0cmF0ZWd5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5idWZmZXJzID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICBlbmFibGVDYW5jZWxsYXRpb24ocmVxdWVzdCkge1xuICAgICAgICBpZiAocmVxdWVzdC5pZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBTaGFyZWRBcnJheUJ1ZmZlcig0KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBJbnQzMkFycmF5KGJ1ZmZlciwgMCwgMSk7XG4gICAgICAgIGRhdGFbMF0gPSBDYW5jZWxsYXRpb25TdGF0ZS5Db250aW51ZTtcbiAgICAgICAgdGhpcy5idWZmZXJzLnNldChyZXF1ZXN0LmlkLCBidWZmZXIpO1xuICAgICAgICByZXF1ZXN0LiRjYW5jZWxsYXRpb25EYXRhID0gYnVmZmVyO1xuICAgIH1cbiAgICBhc3luYyBzZW5kQ2FuY2VsbGF0aW9uKF9jb25uLCBpZCkge1xuICAgICAgICBjb25zdCBidWZmZXIgPSB0aGlzLmJ1ZmZlcnMuZ2V0KGlkKTtcbiAgICAgICAgaWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBJbnQzMkFycmF5KGJ1ZmZlciwgMCwgMSk7XG4gICAgICAgIEF0b21pY3Muc3RvcmUoZGF0YSwgMCwgQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkKTtcbiAgICB9XG4gICAgY2xlYW51cChpZCkge1xuICAgICAgICB0aGlzLmJ1ZmZlcnMuZGVsZXRlKGlkKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy5idWZmZXJzLmNsZWFyKCk7XG4gICAgfVxufVxuZXhwb3J0cy5TaGFyZWRBcnJheVNlbmRlclN0cmF0ZWd5ID0gU2hhcmVkQXJyYXlTZW5kZXJTdHJhdGVneTtcbmNsYXNzIFNoYXJlZEFycmF5QnVmZmVyQ2FuY2VsbGF0aW9uVG9rZW4ge1xuICAgIGNvbnN0cnVjdG9yKGJ1ZmZlcikge1xuICAgICAgICB0aGlzLmRhdGEgPSBuZXcgSW50MzJBcnJheShidWZmZXIsIDAsIDEpO1xuICAgIH1cbiAgICBnZXQgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHJldHVybiBBdG9taWNzLmxvYWQodGhpcy5kYXRhLCAwKSA9PT0gQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkO1xuICAgIH1cbiAgICBnZXQgb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuY2VsbGF0aW9uIG92ZXIgU2hhcmVkQXJyYXlCdWZmZXIgZG9lc24ndCBzdXBwb3J0IGNhbmNlbGxhdGlvbiBldmVudHNgKTtcbiAgICB9XG59XG5jbGFzcyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuU291cmNlIHtcbiAgICBjb25zdHJ1Y3RvcihidWZmZXIpIHtcbiAgICAgICAgdGhpcy50b2tlbiA9IG5ldyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuKGJ1ZmZlcik7XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICB9XG59XG5jbGFzcyBTaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmtpbmQgPSAncmVxdWVzdCc7XG4gICAgfVxuICAgIGNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKHJlcXVlc3QpIHtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gcmVxdWVzdC4kY2FuY2VsbGF0aW9uRGF0YTtcbiAgICAgICAgaWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuU291cmNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuU291cmNlKGJ1ZmZlcik7XG4gICAgfVxufVxuZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBTaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3k7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNlbWFwaG9yZSA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY2xhc3MgU2VtYXBob3JlIHtcbiAgICBjb25zdHJ1Y3RvcihjYXBhY2l0eSA9IDEpIHtcbiAgICAgICAgaWYgKGNhcGFjaXR5IDw9IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FwYWNpdHkgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NhcGFjaXR5ID0gY2FwYWNpdHk7XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IDA7XG4gICAgICAgIHRoaXMuX3dhaXRpbmcgPSBbXTtcbiAgICB9XG4gICAgbG9jayh0aHVuaykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fd2FpdGluZy5wdXNoKHsgdGh1bmssIHJlc29sdmUsIHJlamVjdCB9KTtcbiAgICAgICAgICAgIHRoaXMucnVuTmV4dCgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0IGFjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTtcbiAgICB9XG4gICAgcnVuTmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dhaXRpbmcubGVuZ3RoID09PSAwIHx8IHRoaXMuX2FjdGl2ZSA9PT0gdGhpcy5fY2FwYWNpdHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS50aW1lci5zZXRJbW1lZGlhdGUoKCkgPT4gdGhpcy5kb1J1bk5leHQoKSk7XG4gICAgfVxuICAgIGRvUnVuTmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dhaXRpbmcubGVuZ3RoID09PSAwIHx8IHRoaXMuX2FjdGl2ZSA9PT0gdGhpcy5fY2FwYWNpdHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5fd2FpdGluZy5zaGlmdCgpO1xuICAgICAgICB0aGlzLl9hY3RpdmUrKztcbiAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZSA+IHRoaXMuX2NhcGFjaXR5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRvIG1hbnkgdGh1bmtzIGFjdGl2ZWApO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXh0LnRodW5rKCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC50aGVuKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5yZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5OZXh0KCk7XG4gICAgICAgICAgICAgICAgfSwgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5yZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5OZXh0KCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICBuZXh0LnJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1bk5leHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgIG5leHQucmVqZWN0KGVycik7XG4gICAgICAgICAgICB0aGlzLnJ1bk5leHQoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuU2VtYXBob3JlID0gU2VtYXBob3JlO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXIgPSBleHBvcnRzLkFic3RyYWN0TWVzc2FnZVJlYWRlciA9IGV4cG9ydHMuTWVzc2FnZVJlYWRlciA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IGV2ZW50c18xID0gcmVxdWlyZShcIi4vZXZlbnRzXCIpO1xuY29uc3Qgc2VtYXBob3JlXzEgPSByZXF1aXJlKFwiLi9zZW1hcGhvcmVcIik7XG52YXIgTWVzc2FnZVJlYWRlcjtcbihmdW5jdGlvbiAoTWVzc2FnZVJlYWRlcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5saXN0ZW4pICYmIElzLmZ1bmMoY2FuZGlkYXRlLmRpc3Bvc2UpICYmXG4gICAgICAgICAgICBJcy5mdW5jKGNhbmRpZGF0ZS5vbkVycm9yKSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5vbkNsb3NlKSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5vblBhcnRpYWxNZXNzYWdlKTtcbiAgICB9XG4gICAgTWVzc2FnZVJlYWRlci5pcyA9IGlzO1xufSkoTWVzc2FnZVJlYWRlciB8fCAoZXhwb3J0cy5NZXNzYWdlUmVhZGVyID0gTWVzc2FnZVJlYWRlciA9IHt9KSk7XG5jbGFzcyBBYnN0cmFjdE1lc3NhZ2VSZWFkZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZUVtaXR0ZXIgPSBuZXcgZXZlbnRzXzEuRW1pdHRlcigpO1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlci5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgZ2V0IG9uRXJyb3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVycm9yRW1pdHRlci5ldmVudDtcbiAgICB9XG4gICAgZmlyZUVycm9yKGVycm9yKSB7XG4gICAgICAgIHRoaXMuZXJyb3JFbWl0dGVyLmZpcmUodGhpcy5hc0Vycm9yKGVycm9yKSk7XG4gICAgfVxuICAgIGdldCBvbkNsb3NlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9zZUVtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGZpcmVDbG9zZSgpIHtcbiAgICAgICAgdGhpcy5jbG9zZUVtaXR0ZXIuZmlyZSh1bmRlZmluZWQpO1xuICAgIH1cbiAgICBnZXQgb25QYXJ0aWFsTWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFydGlhbE1lc3NhZ2VFbWl0dGVyLmV2ZW50O1xuICAgIH1cbiAgICBmaXJlUGFydGlhbE1lc3NhZ2UoaW5mbykge1xuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlRW1pdHRlci5maXJlKGluZm8pO1xuICAgIH1cbiAgICBhc0Vycm9yKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKGBSZWFkZXIgcmVjZWl2ZWQgZXJyb3IuIFJlYXNvbjogJHtJcy5zdHJpbmcoZXJyb3IubWVzc2FnZSkgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24nfWApO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VSZWFkZXIgPSBBYnN0cmFjdE1lc3NhZ2VSZWFkZXI7XG52YXIgUmVzb2x2ZWRNZXNzYWdlUmVhZGVyT3B0aW9ucztcbihmdW5jdGlvbiAoUmVzb2x2ZWRNZXNzYWdlUmVhZGVyT3B0aW9ucykge1xuICAgIGZ1bmN0aW9uIGZyb21PcHRpb25zKG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IGNoYXJzZXQ7XG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIGxldCBjb250ZW50RGVjb2RlcjtcbiAgICAgICAgY29uc3QgY29udGVudERlY29kZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICBsZXQgY29udGVudFR5cGVEZWNvZGVyO1xuICAgICAgICBjb25zdCBjb250ZW50VHlwZURlY29kZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY2hhcnNldCA9IG9wdGlvbnMgPz8gJ3V0Zi04JztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNoYXJzZXQgPSBvcHRpb25zLmNoYXJzZXQgPz8gJ3V0Zi04JztcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnREZWNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50RGVjb2RlciA9IG9wdGlvbnMuY29udGVudERlY29kZXI7XG4gICAgICAgICAgICAgICAgY29udGVudERlY29kZXJzLnNldChjb250ZW50RGVjb2Rlci5uYW1lLCBjb250ZW50RGVjb2Rlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5jb250ZW50RGVjb2RlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGVjb2RlciBvZiBvcHRpb25zLmNvbnRlbnREZWNvZGVycykge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50RGVjb2RlcnMuc2V0KGRlY29kZXIubmFtZSwgZGVjb2Rlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuY29udGVudFR5cGVEZWNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXIgPSBvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcjtcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXJzLnNldChjb250ZW50VHlwZURlY29kZXIubmFtZSwgY29udGVudFR5cGVEZWNvZGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGVjb2RlciBvZiBvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGVEZWNvZGVycy5zZXQoZGVjb2Rlci5uYW1lLCBkZWNvZGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnRlbnRUeXBlRGVjb2RlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXIgPSAoMCwgcmFsXzEuZGVmYXVsdCkoKS5hcHBsaWNhdGlvbkpzb24uZGVjb2RlcjtcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlRGVjb2RlcnMuc2V0KGNvbnRlbnRUeXBlRGVjb2Rlci5uYW1lLCBjb250ZW50VHlwZURlY29kZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGNoYXJzZXQsIGNvbnRlbnREZWNvZGVyLCBjb250ZW50RGVjb2RlcnMsIGNvbnRlbnRUeXBlRGVjb2RlciwgY29udGVudFR5cGVEZWNvZGVycyB9O1xuICAgIH1cbiAgICBSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zLmZyb21PcHRpb25zID0gZnJvbU9wdGlvbnM7XG59KShSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zIHx8IChSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zID0ge30pKTtcbmNsYXNzIFJlYWRhYmxlU3RyZWFtTWVzc2FnZVJlYWRlciBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVJlYWRlciB7XG4gICAgY29uc3RydWN0b3IocmVhZGFibGUsIG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZSA9IHJlYWRhYmxlO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zLmZyb21PcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmJ1ZmZlciA9ICgwLCByYWxfMS5kZWZhdWx0KSgpLm1lc3NhZ2VCdWZmZXIuY3JlYXRlKHRoaXMub3B0aW9ucy5jaGFyc2V0KTtcbiAgICAgICAgdGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0ID0gMTAwMDA7XG4gICAgICAgIHRoaXMubmV4dE1lc3NhZ2VMZW5ndGggPSAtMTtcbiAgICAgICAgdGhpcy5tZXNzYWdlVG9rZW4gPSAwO1xuICAgICAgICB0aGlzLnJlYWRTZW1hcGhvcmUgPSBuZXcgc2VtYXBob3JlXzEuU2VtYXBob3JlKDEpO1xuICAgIH1cbiAgICBzZXQgcGFydGlhbE1lc3NhZ2VUaW1lb3V0KHRpbWVvdXQpIHtcbiAgICAgICAgdGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0ID0gdGltZW91dDtcbiAgICB9XG4gICAgZ2V0IHBhcnRpYWxNZXNzYWdlVGltZW91dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dDtcbiAgICB9XG4gICAgbGlzdGVuKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMubmV4dE1lc3NhZ2VMZW5ndGggPSAtMTtcbiAgICAgICAgdGhpcy5tZXNzYWdlVG9rZW4gPSAwO1xuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlVGltZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5yZWFkYWJsZS5vbkRhdGEoKGRhdGEpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25EYXRhKGRhdGEpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZS5vbkVycm9yKChlcnJvcikgPT4gdGhpcy5maXJlRXJyb3IoZXJyb3IpKTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZS5vbkNsb3NlKCgpID0+IHRoaXMuZmlyZUNsb3NlKCkpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBvbkRhdGEoZGF0YSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5idWZmZXIuYXBwZW5kKGRhdGEpO1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IHRoaXMuYnVmZmVyLnRyeVJlYWRIZWFkZXJzKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50TGVuZ3RoID0gaGVhZGVycy5nZXQoJ2NvbnRlbnQtbGVuZ3RoJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY29udGVudExlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IobmV3IEVycm9yKGBIZWFkZXIgbXVzdCBwcm92aWRlIGEgQ29udGVudC1MZW5ndGggcHJvcGVydHkuXFxuJHtKU09OLnN0cmluZ2lmeShPYmplY3QuZnJvbUVudHJpZXMoaGVhZGVycykpfWApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsZW5ndGggPSBwYXJzZUludChjb250ZW50TGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKGxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKG5ldyBFcnJvcihgQ29udGVudC1MZW5ndGggdmFsdWUgbXVzdCBiZSBhIG51bWJlci4gR290ICR7Y29udGVudExlbmd0aH1gKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IHRoaXMuYnVmZmVyLnRyeVJlYWRCb2R5KHRoaXMubmV4dE1lc3NhZ2VMZW5ndGgpO1xuICAgICAgICAgICAgICAgIGlmIChib2R5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLyoqIFdlIGhhdmVuJ3QgcmVjZWl2ZWQgdGhlIGZ1bGwgbWVzc2FnZSB5ZXQuICovXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0UGFydGlhbE1lc3NhZ2VUaW1lcigpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJQYXJ0aWFsTWVzc2FnZVRpbWVyKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9IC0xO1xuICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHdlIGNvbnZlcnQgb25lIHJlY2VpdmVkIG1lc3NhZ2UgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAgICAgLy8gb3RoZXIuIE90aGVyd2lzZSBpdCBjb3VsZCBoYXBwZW4gdGhhdCBhIGRlY29kaW5nIG9mIGEgc2Vjb25kXG4gICAgICAgICAgICAgICAgLy8gc21hbGxlciBtZXNzYWdlIGZpbmlzaGVkIGJlZm9yZSB0aGUgZGVjb2Rpbmcgb2YgYSBmaXJzdCBsYXJnZXJcbiAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIGFuZCB0aGVuIHdlIHdvdWxkIGRlbGl2ZXIgdGhlIHNlY29uZCBtZXNzYWdlIGZpcnN0LlxuICAgICAgICAgICAgICAgIHRoaXMucmVhZFNlbWFwaG9yZS5sb2NrKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnl0ZXMgPSB0aGlzLm9wdGlvbnMuY29udGVudERlY29kZXIgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBhd2FpdCB0aGlzLm9wdGlvbnMuY29udGVudERlY29kZXIuZGVjb2RlKGJvZHkpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGJvZHk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBhd2FpdCB0aGlzLm9wdGlvbnMuY29udGVudFR5cGVEZWNvZGVyLmRlY29kZShieXRlcywgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjayhtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNsZWFyUGFydGlhbE1lc3NhZ2VUaW1lcigpIHtcbiAgICAgICAgaWYgKHRoaXMucGFydGlhbE1lc3NhZ2VUaW1lcikge1xuICAgICAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZVRpbWVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRoaXMucGFydGlhbE1lc3NhZ2VUaW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRQYXJ0aWFsTWVzc2FnZVRpbWVyKCkge1xuICAgICAgICB0aGlzLmNsZWFyUGFydGlhbE1lc3NhZ2VUaW1lcigpO1xuICAgICAgICBpZiAodGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0IDw9IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlVGltZXIgPSAoMCwgcmFsXzEuZGVmYXVsdCkoKS50aW1lci5zZXRUaW1lb3V0KCh0b2tlbiwgdGltZW91dCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZVRpbWVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRva2VuID09PSB0aGlzLm1lc3NhZ2VUb2tlbikge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZVBhcnRpYWxNZXNzYWdlKHsgbWVzc2FnZVRva2VuOiB0b2tlbiwgd2FpdGluZ1RpbWU6IHRpbWVvdXQgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRQYXJ0aWFsTWVzc2FnZVRpbWVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dCwgdGhpcy5tZXNzYWdlVG9rZW4sIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dCk7XG4gICAgfVxufVxuZXhwb3J0cy5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXIgPSBSZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLldyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLkFic3RyYWN0TWVzc2FnZVdyaXRlciA9IGV4cG9ydHMuTWVzc2FnZVdyaXRlciA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IHNlbWFwaG9yZV8xID0gcmVxdWlyZShcIi4vc2VtYXBob3JlXCIpO1xuY29uc3QgZXZlbnRzXzEgPSByZXF1aXJlKFwiLi9ldmVudHNcIik7XG5jb25zdCBDb250ZW50TGVuZ3RoID0gJ0NvbnRlbnQtTGVuZ3RoOiAnO1xuY29uc3QgQ1JMRiA9ICdcXHJcXG4nO1xudmFyIE1lc3NhZ2VXcml0ZXI7XG4oZnVuY3Rpb24gKE1lc3NhZ2VXcml0ZXIpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgSXMuZnVuYyhjYW5kaWRhdGUuZGlzcG9zZSkgJiYgSXMuZnVuYyhjYW5kaWRhdGUub25DbG9zZSkgJiZcbiAgICAgICAgICAgIElzLmZ1bmMoY2FuZGlkYXRlLm9uRXJyb3IpICYmIElzLmZ1bmMoY2FuZGlkYXRlLndyaXRlKTtcbiAgICB9XG4gICAgTWVzc2FnZVdyaXRlci5pcyA9IGlzO1xufSkoTWVzc2FnZVdyaXRlciB8fCAoZXhwb3J0cy5NZXNzYWdlV3JpdGVyID0gTWVzc2FnZVdyaXRlciA9IHt9KSk7XG5jbGFzcyBBYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy5lcnJvckVtaXR0ZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLmNsb3NlRW1pdHRlci5kaXNwb3NlKCk7XG4gICAgfVxuICAgIGdldCBvbkVycm9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lcnJvckVtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGZpcmVFcnJvcihlcnJvciwgbWVzc2FnZSwgY291bnQpIHtcbiAgICAgICAgdGhpcy5lcnJvckVtaXR0ZXIuZmlyZShbdGhpcy5hc0Vycm9yKGVycm9yKSwgbWVzc2FnZSwgY291bnRdKTtcbiAgICB9XG4gICAgZ2V0IG9uQ2xvc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb3NlRW1pdHRlci5ldmVudDtcbiAgICB9XG4gICAgZmlyZUNsb3NlKCkge1xuICAgICAgICB0aGlzLmNsb3NlRW1pdHRlci5maXJlKHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIGFzRXJyb3IoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoYFdyaXRlciByZWNlaXZlZCBlcnJvci4gUmVhc29uOiAke0lzLnN0cmluZyhlcnJvci5tZXNzYWdlKSA/IGVycm9yLm1lc3NhZ2UgOiAndW5rbm93bid9YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLkFic3RyYWN0TWVzc2FnZVdyaXRlciA9IEFic3RyYWN0TWVzc2FnZVdyaXRlcjtcbnZhciBSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zO1xuKGZ1bmN0aW9uIChSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zKSB7XG4gICAgZnVuY3Rpb24gZnJvbU9wdGlvbnMob3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHsgY2hhcnNldDogb3B0aW9ucyA/PyAndXRmLTgnLCBjb250ZW50VHlwZUVuY29kZXI6ICgwLCByYWxfMS5kZWZhdWx0KSgpLmFwcGxpY2F0aW9uSnNvbi5lbmNvZGVyIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4geyBjaGFyc2V0OiBvcHRpb25zLmNoYXJzZXQgPz8gJ3V0Zi04JywgY29udGVudEVuY29kZXI6IG9wdGlvbnMuY29udGVudEVuY29kZXIsIGNvbnRlbnRUeXBlRW5jb2Rlcjogb3B0aW9ucy5jb250ZW50VHlwZUVuY29kZXIgPz8gKDAsIHJhbF8xLmRlZmF1bHQpKCkuYXBwbGljYXRpb25Kc29uLmVuY29kZXIgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zLmZyb21PcHRpb25zID0gZnJvbU9wdGlvbnM7XG59KShSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zIHx8IChSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zID0ge30pKTtcbmNsYXNzIFdyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKHdyaXRhYmxlLCBvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMud3JpdGFibGUgPSB3cml0YWJsZTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gUmVzb2x2ZWRNZXNzYWdlV3JpdGVyT3B0aW9ucy5mcm9tT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50ID0gMDtcbiAgICAgICAgdGhpcy53cml0ZVNlbWFwaG9yZSA9IG5ldyBzZW1hcGhvcmVfMS5TZW1hcGhvcmUoMSk7XG4gICAgICAgIHRoaXMud3JpdGFibGUub25FcnJvcigoZXJyb3IpID0+IHRoaXMuZmlyZUVycm9yKGVycm9yKSk7XG4gICAgICAgIHRoaXMud3JpdGFibGUub25DbG9zZSgoKSA9PiB0aGlzLmZpcmVDbG9zZSgpKTtcbiAgICB9XG4gICAgYXN5bmMgd3JpdGUobXNnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndyaXRlU2VtYXBob3JlLmxvY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHRoaXMub3B0aW9ucy5jb250ZW50VHlwZUVuY29kZXIuZW5jb2RlKG1zZywgdGhpcy5vcHRpb25zKS50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNvbnRlbnRFbmNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jb250ZW50RW5jb2Rlci5lbmNvZGUoYnVmZmVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZC50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJzID0gW107XG4gICAgICAgICAgICAgICAgaGVhZGVycy5wdXNoKENvbnRlbnRMZW5ndGgsIGJ1ZmZlci5ieXRlTGVuZ3RoLnRvU3RyaW5nKCksIENSTEYpO1xuICAgICAgICAgICAgICAgIGhlYWRlcnMucHVzaChDUkxGKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kb1dyaXRlKG1zZywgaGVhZGVycywgYnVmZmVyKTtcbiAgICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgZG9Xcml0ZShtc2csIGhlYWRlcnMsIGRhdGEpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMud3JpdGFibGUud3JpdGUoaGVhZGVycy5qb2luKCcnKSwgJ2FzY2lpJyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy53cml0YWJsZS53cml0ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IsIG1zZyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZUVycm9yKGVycm9yLCBtc2cpIHtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50Kys7XG4gICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yLCBtc2csIHRoaXMuZXJyb3JDb3VudCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICAgICAgdGhpcy53cml0YWJsZS5lbmQoKTtcbiAgICB9XG59XG5leHBvcnRzLldyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgPSBXcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkFic3RyYWN0TWVzc2FnZUJ1ZmZlciA9IHZvaWQgMDtcbmNvbnN0IENSID0gMTM7XG5jb25zdCBMRiA9IDEwO1xuY29uc3QgQ1JMRiA9ICdcXHJcXG4nO1xuY2xhc3MgQWJzdHJhY3RNZXNzYWdlQnVmZmVyIHtcbiAgICBjb25zdHJ1Y3RvcihlbmNvZGluZyA9ICd1dGYtOCcpIHtcbiAgICAgICAgdGhpcy5fZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgICAgICAgdGhpcy5fY2h1bmtzID0gW107XG4gICAgICAgIHRoaXMuX3RvdGFsTGVuZ3RoID0gMDtcbiAgICB9XG4gICAgZ2V0IGVuY29kaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW5jb2Rpbmc7XG4gICAgfVxuICAgIGFwcGVuZChjaHVuaykge1xuICAgICAgICBjb25zdCB0b0FwcGVuZCA9IHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZycgPyB0aGlzLmZyb21TdHJpbmcoY2h1bmssIHRoaXMuX2VuY29kaW5nKSA6IGNodW5rO1xuICAgICAgICB0aGlzLl9jaHVua3MucHVzaCh0b0FwcGVuZCk7XG4gICAgICAgIHRoaXMuX3RvdGFsTGVuZ3RoICs9IHRvQXBwZW5kLmJ5dGVMZW5ndGg7XG4gICAgfVxuICAgIHRyeVJlYWRIZWFkZXJzKGxvd2VyQ2FzZUtleXMgPSBmYWxzZSkge1xuICAgICAgICBpZiAodGhpcy5fY2h1bmtzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3RhdGUgPSAwO1xuICAgICAgICBsZXQgY2h1bmtJbmRleCA9IDA7XG4gICAgICAgIGxldCBvZmZzZXQgPSAwO1xuICAgICAgICBsZXQgY2h1bmtCeXRlc1JlYWQgPSAwO1xuICAgICAgICByb3c6IHdoaWxlIChjaHVua0luZGV4IDwgdGhpcy5fY2h1bmtzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgY2h1bmsgPSB0aGlzLl9jaHVua3NbY2h1bmtJbmRleF07XG4gICAgICAgICAgICBvZmZzZXQgPSAwO1xuICAgICAgICAgICAgY29sdW1uOiB3aGlsZSAob2Zmc2V0IDwgY2h1bmsubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjaHVua1tvZmZzZXRdO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDUjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIExGOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gNDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHJvdztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjaHVua0J5dGVzUmVhZCArPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgY2h1bmtJbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZSAhPT0gNCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgYnVmZmVyIGNvbnRhaW5zIHRoZSB0d28gQ1JMRiBhdCB0aGUgZW5kLiBTbyB3ZSB3aWxsXG4gICAgICAgIC8vIGhhdmUgdHdvIGVtcHR5IGxpbmVzIGFmdGVyIHRoZSBzcGxpdCBhdCB0aGUgZW5kIGFzIHdlbGwuXG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuX3JlYWQoY2h1bmtCeXRlc1JlYWQgKyBvZmZzZXQpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwKCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLnRvU3RyaW5nKGJ1ZmZlciwgJ2FzY2lpJykuc3BsaXQoQ1JMRik7XG4gICAgICAgIGlmIChoZWFkZXJzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXJzLmxlbmd0aCAtIDI7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaGVhZGVyID0gaGVhZGVyc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gaGVhZGVyLmluZGV4T2YoJzonKTtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1lc3NhZ2UgaGVhZGVyIG11c3Qgc2VwYXJhdGUga2V5IGFuZCB2YWx1ZSB1c2luZyAnOidcXG4ke2hlYWRlcn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGhlYWRlci5zdWJzdHIoMCwgaW5kZXgpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBoZWFkZXIuc3Vic3RyKGluZGV4ICsgMSkudHJpbSgpO1xuICAgICAgICAgICAgcmVzdWx0LnNldChsb3dlckNhc2VLZXlzID8ga2V5LnRvTG93ZXJDYXNlKCkgOiBrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICB0cnlSZWFkQm9keShsZW5ndGgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3RvdGFsTGVuZ3RoIDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkKGxlbmd0aCk7XG4gICAgfVxuICAgIGdldCBudW1iZXJPZkJ5dGVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdG90YWxMZW5ndGg7XG4gICAgfVxuICAgIF9yZWFkKGJ5dGVDb3VudCkge1xuICAgICAgICBpZiAoYnl0ZUNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbXB0eUJ1ZmZlcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChieXRlQ291bnQgPiB0aGlzLl90b3RhbExlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVhZCBzbyBtYW55IGJ5dGVzIWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jaHVua3NbMF0uYnl0ZUxlbmd0aCA9PT0gYnl0ZUNvdW50KSB7XG4gICAgICAgICAgICAvLyBzdXBlciBmYXN0IHBhdGgsIHByZWNpc2VseSBmaXJzdCBjaHVuayBtdXN0IGJlIHJldHVybmVkXG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1swXTtcbiAgICAgICAgICAgIHRoaXMuX2NodW5rcy5zaGlmdCgpO1xuICAgICAgICAgICAgdGhpcy5fdG90YWxMZW5ndGggLT0gYnl0ZUNvdW50O1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXNOYXRpdmUoY2h1bmspO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jaHVua3NbMF0uYnl0ZUxlbmd0aCA+IGJ5dGVDb3VudCkge1xuICAgICAgICAgICAgLy8gZmFzdCBwYXRoLCB0aGUgcmVhZGluZyBpcyBlbnRpcmVseSB3aXRoaW4gdGhlIGZpcnN0IGNodW5rXG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1swXTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuYXNOYXRpdmUoY2h1bmssIGJ5dGVDb3VudCk7XG4gICAgICAgICAgICB0aGlzLl9jaHVua3NbMF0gPSBjaHVuay5zbGljZShieXRlQ291bnQpO1xuICAgICAgICAgICAgdGhpcy5fdG90YWxMZW5ndGggLT0gYnl0ZUNvdW50O1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmFsbG9jTmF0aXZlKGJ5dGVDb3VudCk7XG4gICAgICAgIGxldCByZXN1bHRPZmZzZXQgPSAwO1xuICAgICAgICBsZXQgY2h1bmtJbmRleCA9IDA7XG4gICAgICAgIHdoaWxlIChieXRlQ291bnQgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1tjaHVua0luZGV4XTtcbiAgICAgICAgICAgIGlmIChjaHVuay5ieXRlTGVuZ3RoID4gYnl0ZUNvdW50KSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBjaHVuayB3aWxsIHN1cnZpdmVcbiAgICAgICAgICAgICAgICBjb25zdCBjaHVua1BhcnQgPSBjaHVuay5zbGljZSgwLCBieXRlQ291bnQpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5zZXQoY2h1bmtQYXJ0LCByZXN1bHRPZmZzZXQpO1xuICAgICAgICAgICAgICAgIHJlc3VsdE9mZnNldCArPSBieXRlQ291bnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2h1bmtzW2NodW5rSW5kZXhdID0gY2h1bmsuc2xpY2UoYnl0ZUNvdW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLl90b3RhbExlbmd0aCAtPSBieXRlQ291bnQ7XG4gICAgICAgICAgICAgICAgYnl0ZUNvdW50IC09IGJ5dGVDb3VudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHRoaXMgY2h1bmsgd2lsbCBiZSBlbnRpcmVseSByZWFkXG4gICAgICAgICAgICAgICAgcmVzdWx0LnNldChjaHVuaywgcmVzdWx0T2Zmc2V0KTtcbiAgICAgICAgICAgICAgICByZXN1bHRPZmZzZXQgKz0gY2h1bmsuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgICAgICB0aGlzLl9jaHVua3Muc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl90b3RhbExlbmd0aCAtPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgICAgIGJ5dGVDb3VudCAtPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VCdWZmZXIgPSBBYnN0cmFjdE1lc3NhZ2VCdWZmZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uID0gZXhwb3J0cy5Db25uZWN0aW9uT3B0aW9ucyA9IGV4cG9ydHMuTWVzc2FnZVN0cmF0ZWd5ID0gZXhwb3J0cy5DYW5jZWxsYXRpb25TdHJhdGVneSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gZXhwb3J0cy5JZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IGV4cG9ydHMuQ29ubmVjdGlvbkVycm9yID0gZXhwb3J0cy5Db25uZWN0aW9uRXJyb3JzID0gZXhwb3J0cy5Mb2dUcmFjZU5vdGlmaWNhdGlvbiA9IGV4cG9ydHMuU2V0VHJhY2VOb3RpZmljYXRpb24gPSBleHBvcnRzLlRyYWNlRm9ybWF0ID0gZXhwb3J0cy5UcmFjZVZhbHVlcyA9IGV4cG9ydHMuVHJhY2UgPSBleHBvcnRzLk51bGxMb2dnZXIgPSBleHBvcnRzLlByb2dyZXNzVHlwZSA9IGV4cG9ydHMuUHJvZ3Jlc3NUb2tlbiA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IG1lc3NhZ2VzXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlc1wiKTtcbmNvbnN0IGxpbmtlZE1hcF8xID0gcmVxdWlyZShcIi4vbGlua2VkTWFwXCIpO1xuY29uc3QgZXZlbnRzXzEgPSByZXF1aXJlKFwiLi9ldmVudHNcIik7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbnZhciBDYW5jZWxOb3RpZmljYXRpb247XG4oZnVuY3Rpb24gKENhbmNlbE5vdGlmaWNhdGlvbikge1xuICAgIENhbmNlbE5vdGlmaWNhdGlvbi50eXBlID0gbmV3IG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZSgnJC9jYW5jZWxSZXF1ZXN0Jyk7XG59KShDYW5jZWxOb3RpZmljYXRpb24gfHwgKENhbmNlbE5vdGlmaWNhdGlvbiA9IHt9KSk7XG52YXIgUHJvZ3Jlc3NUb2tlbjtcbihmdW5jdGlvbiAoUHJvZ3Jlc3NUb2tlbikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG4gICAgfVxuICAgIFByb2dyZXNzVG9rZW4uaXMgPSBpcztcbn0pKFByb2dyZXNzVG9rZW4gfHwgKGV4cG9ydHMuUHJvZ3Jlc3NUb2tlbiA9IFByb2dyZXNzVG9rZW4gPSB7fSkpO1xudmFyIFByb2dyZXNzTm90aWZpY2F0aW9uO1xuKGZ1bmN0aW9uIChQcm9ncmVzc05vdGlmaWNhdGlvbikge1xuICAgIFByb2dyZXNzTm90aWZpY2F0aW9uLnR5cGUgPSBuZXcgbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlKCckL3Byb2dyZXNzJyk7XG59KShQcm9ncmVzc05vdGlmaWNhdGlvbiB8fCAoUHJvZ3Jlc3NOb3RpZmljYXRpb24gPSB7fSkpO1xuY2xhc3MgUHJvZ3Jlc3NUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICB9XG59XG5leHBvcnRzLlByb2dyZXNzVHlwZSA9IFByb2dyZXNzVHlwZTtcbnZhciBTdGFyUmVxdWVzdEhhbmRsZXI7XG4oZnVuY3Rpb24gKFN0YXJSZXF1ZXN0SGFuZGxlcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBJcy5mdW5jKHZhbHVlKTtcbiAgICB9XG4gICAgU3RhclJlcXVlc3RIYW5kbGVyLmlzID0gaXM7XG59KShTdGFyUmVxdWVzdEhhbmRsZXIgfHwgKFN0YXJSZXF1ZXN0SGFuZGxlciA9IHt9KSk7XG5leHBvcnRzLk51bGxMb2dnZXIgPSBPYmplY3QuZnJlZXplKHtcbiAgICBlcnJvcjogKCkgPT4geyB9LFxuICAgIHdhcm46ICgpID0+IHsgfSxcbiAgICBpbmZvOiAoKSA9PiB7IH0sXG4gICAgbG9nOiAoKSA9PiB7IH1cbn0pO1xudmFyIFRyYWNlO1xuKGZ1bmN0aW9uIChUcmFjZSkge1xuICAgIFRyYWNlW1RyYWNlW1wiT2ZmXCJdID0gMF0gPSBcIk9mZlwiO1xuICAgIFRyYWNlW1RyYWNlW1wiTWVzc2FnZXNcIl0gPSAxXSA9IFwiTWVzc2FnZXNcIjtcbiAgICBUcmFjZVtUcmFjZVtcIkNvbXBhY3RcIl0gPSAyXSA9IFwiQ29tcGFjdFwiO1xuICAgIFRyYWNlW1RyYWNlW1wiVmVyYm9zZVwiXSA9IDNdID0gXCJWZXJib3NlXCI7XG59KShUcmFjZSB8fCAoZXhwb3J0cy5UcmFjZSA9IFRyYWNlID0ge30pKTtcbnZhciBUcmFjZVZhbHVlcztcbihmdW5jdGlvbiAoVHJhY2VWYWx1ZXMpIHtcbiAgICAvKipcbiAgICAgKiBUdXJuIHRyYWNpbmcgb2ZmLlxuICAgICAqL1xuICAgIFRyYWNlVmFsdWVzLk9mZiA9ICdvZmYnO1xuICAgIC8qKlxuICAgICAqIFRyYWNlIG1lc3NhZ2VzIG9ubHkuXG4gICAgICovXG4gICAgVHJhY2VWYWx1ZXMuTWVzc2FnZXMgPSAnbWVzc2FnZXMnO1xuICAgIC8qKlxuICAgICAqIENvbXBhY3QgbWVzc2FnZSB0cmFjaW5nLlxuICAgICAqL1xuICAgIFRyYWNlVmFsdWVzLkNvbXBhY3QgPSAnY29tcGFjdCc7XG4gICAgLyoqXG4gICAgICogVmVyYm9zZSBtZXNzYWdlIHRyYWNpbmcuXG4gICAgICovXG4gICAgVHJhY2VWYWx1ZXMuVmVyYm9zZSA9ICd2ZXJib3NlJztcbn0pKFRyYWNlVmFsdWVzIHx8IChleHBvcnRzLlRyYWNlVmFsdWVzID0gVHJhY2VWYWx1ZXMgPSB7fSkpO1xuKGZ1bmN0aW9uIChUcmFjZSkge1xuICAgIGZ1bmN0aW9uIGZyb21TdHJpbmcodmFsdWUpIHtcbiAgICAgICAgaWYgKCFJcy5zdHJpbmcodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gVHJhY2UuT2ZmO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSAnb2ZmJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gVHJhY2UuT2ZmO1xuICAgICAgICAgICAgY2FzZSAnbWVzc2FnZXMnOlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5NZXNzYWdlcztcbiAgICAgICAgICAgIGNhc2UgJ2NvbXBhY3QnOlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5Db21wYWN0O1xuICAgICAgICAgICAgY2FzZSAndmVyYm9zZSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFRyYWNlLlZlcmJvc2U7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5PZmY7XG4gICAgICAgIH1cbiAgICB9XG4gICAgVHJhY2UuZnJvbVN0cmluZyA9IGZyb21TdHJpbmc7XG4gICAgZnVuY3Rpb24gdG9TdHJpbmcodmFsdWUpIHtcbiAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5PZmY6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdvZmYnO1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5NZXNzYWdlczpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ21lc3NhZ2VzJztcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuQ29tcGFjdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2NvbXBhY3QnO1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5WZXJib3NlOlxuICAgICAgICAgICAgICAgIHJldHVybiAndmVyYm9zZSc7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAnb2ZmJztcbiAgICAgICAgfVxuICAgIH1cbiAgICBUcmFjZS50b1N0cmluZyA9IHRvU3RyaW5nO1xufSkoVHJhY2UgfHwgKGV4cG9ydHMuVHJhY2UgPSBUcmFjZSA9IHt9KSk7XG52YXIgVHJhY2VGb3JtYXQ7XG4oZnVuY3Rpb24gKFRyYWNlRm9ybWF0KSB7XG4gICAgVHJhY2VGb3JtYXRbXCJUZXh0XCJdID0gXCJ0ZXh0XCI7XG4gICAgVHJhY2VGb3JtYXRbXCJKU09OXCJdID0gXCJqc29uXCI7XG59KShUcmFjZUZvcm1hdCB8fCAoZXhwb3J0cy5UcmFjZUZvcm1hdCA9IFRyYWNlRm9ybWF0ID0ge30pKTtcbihmdW5jdGlvbiAoVHJhY2VGb3JtYXQpIHtcbiAgICBmdW5jdGlvbiBmcm9tU3RyaW5nKHZhbHVlKSB7XG4gICAgICAgIGlmICghSXMuc3RyaW5nKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIFRyYWNlRm9ybWF0LlRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAodmFsdWUgPT09ICdqc29uJykge1xuICAgICAgICAgICAgcmV0dXJuIFRyYWNlRm9ybWF0LkpTT047XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gVHJhY2VGb3JtYXQuVGV4dDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBUcmFjZUZvcm1hdC5mcm9tU3RyaW5nID0gZnJvbVN0cmluZztcbn0pKFRyYWNlRm9ybWF0IHx8IChleHBvcnRzLlRyYWNlRm9ybWF0ID0gVHJhY2VGb3JtYXQgPSB7fSkpO1xudmFyIFNldFRyYWNlTm90aWZpY2F0aW9uO1xuKGZ1bmN0aW9uIChTZXRUcmFjZU5vdGlmaWNhdGlvbikge1xuICAgIFNldFRyYWNlTm90aWZpY2F0aW9uLnR5cGUgPSBuZXcgbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlKCckL3NldFRyYWNlJyk7XG59KShTZXRUcmFjZU5vdGlmaWNhdGlvbiB8fCAoZXhwb3J0cy5TZXRUcmFjZU5vdGlmaWNhdGlvbiA9IFNldFRyYWNlTm90aWZpY2F0aW9uID0ge30pKTtcbnZhciBMb2dUcmFjZU5vdGlmaWNhdGlvbjtcbihmdW5jdGlvbiAoTG9nVHJhY2VOb3RpZmljYXRpb24pIHtcbiAgICBMb2dUcmFjZU5vdGlmaWNhdGlvbi50eXBlID0gbmV3IG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZSgnJC9sb2dUcmFjZScpO1xufSkoTG9nVHJhY2VOb3RpZmljYXRpb24gfHwgKGV4cG9ydHMuTG9nVHJhY2VOb3RpZmljYXRpb24gPSBMb2dUcmFjZU5vdGlmaWNhdGlvbiA9IHt9KSk7XG52YXIgQ29ubmVjdGlvbkVycm9ycztcbihmdW5jdGlvbiAoQ29ubmVjdGlvbkVycm9ycykge1xuICAgIC8qKlxuICAgICAqIFRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZC5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uRXJyb3JzW0Nvbm5lY3Rpb25FcnJvcnNbXCJDbG9zZWRcIl0gPSAxXSA9IFwiQ2xvc2VkXCI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gZ290IGRpc3Bvc2VkLlxuICAgICAqL1xuICAgIENvbm5lY3Rpb25FcnJvcnNbQ29ubmVjdGlvbkVycm9yc1tcIkRpc3Bvc2VkXCJdID0gMl0gPSBcIkRpc3Bvc2VkXCI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBpbiBsaXN0ZW5pbmcgbW9kZS5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uRXJyb3JzW0Nvbm5lY3Rpb25FcnJvcnNbXCJBbHJlYWR5TGlzdGVuaW5nXCJdID0gM10gPSBcIkFscmVhZHlMaXN0ZW5pbmdcIjtcbn0pKENvbm5lY3Rpb25FcnJvcnMgfHwgKGV4cG9ydHMuQ29ubmVjdGlvbkVycm9ycyA9IENvbm5lY3Rpb25FcnJvcnMgPSB7fSkpO1xuY2xhc3MgQ29ubmVjdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNvZGUsIG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBDb25uZWN0aW9uRXJyb3IucHJvdG90eXBlKTtcbiAgICB9XG59XG5leHBvcnRzLkNvbm5lY3Rpb25FcnJvciA9IENvbm5lY3Rpb25FcnJvcjtcbnZhciBDb25uZWN0aW9uU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENvbm5lY3Rpb25TdHJhdGVneSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNhbmNlbFVuZGlzcGF0Y2hlZCk7XG4gICAgfVxuICAgIENvbm5lY3Rpb25TdHJhdGVneS5pcyA9IGlzO1xufSkoQ29ubmVjdGlvblN0cmF0ZWd5IHx8IChleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IENvbm5lY3Rpb25TdHJhdGVneSA9IHt9KSk7XG52YXIgSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5O1xuKGZ1bmN0aW9uIChJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiAoY2FuZGlkYXRlLmtpbmQgPT09IHVuZGVmaW5lZCB8fCBjYW5kaWRhdGUua2luZCA9PT0gJ2lkJykgJiYgSXMuZnVuYyhjYW5kaWRhdGUuY3JlYXRlQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UpICYmIChjYW5kaWRhdGUuZGlzcG9zZSA9PT0gdW5kZWZpbmVkIHx8IElzLmZ1bmMoY2FuZGlkYXRlLmRpc3Bvc2UpKTtcbiAgICB9XG4gICAgSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzID0gaXM7XG59KShJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgfHwgKGV4cG9ydHMuSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0ge30pKTtcbnZhciBSZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneTtcbihmdW5jdGlvbiAoUmVxdWVzdENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBjYW5kaWRhdGUua2luZCA9PT0gJ3JlcXVlc3QnICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKSAmJiAoY2FuZGlkYXRlLmRpc3Bvc2UgPT09IHVuZGVmaW5lZCB8fCBJcy5mdW5jKGNhbmRpZGF0ZS5kaXNwb3NlKSk7XG4gICAgfVxuICAgIFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzID0gaXM7XG59KShSZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSB8fCAoZXhwb3J0cy5SZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0ge30pKTtcbnZhciBDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5O1xuKGZ1bmN0aW9uIChDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5NZXNzYWdlID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKF8pIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgY2FuY2VsbGF0aW9uXzEuQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UoKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kuaXModmFsdWUpIHx8IFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKHZhbHVlKTtcbiAgICB9XG4gICAgQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5pcyA9IGlzO1xufSkoQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSB8fCAoZXhwb3J0cy5DYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IHt9KSk7XG52YXIgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENhbmNlbGxhdGlvblNlbmRlclN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kuTWVzc2FnZSA9IE9iamVjdC5mcmVlemUoe1xuICAgICAgICBzZW5kQ2FuY2VsbGF0aW9uKGNvbm4sIGlkKSB7XG4gICAgICAgICAgICByZXR1cm4gY29ubi5zZW5kTm90aWZpY2F0aW9uKENhbmNlbE5vdGlmaWNhdGlvbi50eXBlLCB7IGlkIH0pO1xuICAgICAgICB9LFxuICAgICAgICBjbGVhbnVwKF8pIHsgfVxuICAgIH0pO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLnNlbmRDYW5jZWxsYXRpb24pICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNsZWFudXApO1xuICAgIH1cbiAgICBDYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneS5pcyA9IGlzO1xufSkoQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgfHwgKGV4cG9ydHMuQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgPSBDYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneSA9IHt9KSk7XG52YXIgQ2FuY2VsbGF0aW9uU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENhbmNlbGxhdGlvblN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uU3RyYXRlZ3kuTWVzc2FnZSA9IE9iamVjdC5mcmVlemUoe1xuICAgICAgICByZWNlaXZlcjogQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5NZXNzYWdlLFxuICAgICAgICBzZW5kZXI6IENhbmNlbGxhdGlvblNlbmRlclN0cmF0ZWd5Lk1lc3NhZ2VcbiAgICB9KTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKGNhbmRpZGF0ZS5yZWNlaXZlcikgJiYgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kuaXMoY2FuZGlkYXRlLnNlbmRlcik7XG4gICAgfVxuICAgIENhbmNlbGxhdGlvblN0cmF0ZWd5LmlzID0gaXM7XG59KShDYW5jZWxsYXRpb25TdHJhdGVneSB8fCAoZXhwb3J0cy5DYW5jZWxsYXRpb25TdHJhdGVneSA9IENhbmNlbGxhdGlvblN0cmF0ZWd5ID0ge30pKTtcbnZhciBNZXNzYWdlU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKE1lc3NhZ2VTdHJhdGVneSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLmhhbmRsZU1lc3NhZ2UpO1xuICAgIH1cbiAgICBNZXNzYWdlU3RyYXRlZ3kuaXMgPSBpcztcbn0pKE1lc3NhZ2VTdHJhdGVneSB8fCAoZXhwb3J0cy5NZXNzYWdlU3RyYXRlZ3kgPSBNZXNzYWdlU3RyYXRlZ3kgPSB7fSkpO1xudmFyIENvbm5lY3Rpb25PcHRpb25zO1xuKGZ1bmN0aW9uIChDb25uZWN0aW9uT3B0aW9ucykge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIChDYW5jZWxsYXRpb25TdHJhdGVneS5pcyhjYW5kaWRhdGUuY2FuY2VsbGF0aW9uU3RyYXRlZ3kpIHx8IENvbm5lY3Rpb25TdHJhdGVneS5pcyhjYW5kaWRhdGUuY29ubmVjdGlvblN0cmF0ZWd5KSB8fCBNZXNzYWdlU3RyYXRlZ3kuaXMoY2FuZGlkYXRlLm1lc3NhZ2VTdHJhdGVneSkpO1xuICAgIH1cbiAgICBDb25uZWN0aW9uT3B0aW9ucy5pcyA9IGlzO1xufSkoQ29ubmVjdGlvbk9wdGlvbnMgfHwgKGV4cG9ydHMuQ29ubmVjdGlvbk9wdGlvbnMgPSBDb25uZWN0aW9uT3B0aW9ucyA9IHt9KSk7XG52YXIgQ29ubmVjdGlvblN0YXRlO1xuKGZ1bmN0aW9uIChDb25uZWN0aW9uU3RhdGUpIHtcbiAgICBDb25uZWN0aW9uU3RhdGVbQ29ubmVjdGlvblN0YXRlW1wiTmV3XCJdID0gMV0gPSBcIk5ld1wiO1xuICAgIENvbm5lY3Rpb25TdGF0ZVtDb25uZWN0aW9uU3RhdGVbXCJMaXN0ZW5pbmdcIl0gPSAyXSA9IFwiTGlzdGVuaW5nXCI7XG4gICAgQ29ubmVjdGlvblN0YXRlW0Nvbm5lY3Rpb25TdGF0ZVtcIkNsb3NlZFwiXSA9IDNdID0gXCJDbG9zZWRcIjtcbiAgICBDb25uZWN0aW9uU3RhdGVbQ29ubmVjdGlvblN0YXRlW1wiRGlzcG9zZWRcIl0gPSA0XSA9IFwiRGlzcG9zZWRcIjtcbn0pKENvbm5lY3Rpb25TdGF0ZSB8fCAoQ29ubmVjdGlvblN0YXRlID0ge30pKTtcbmZ1bmN0aW9uIGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uKG1lc3NhZ2VSZWFkZXIsIG1lc3NhZ2VXcml0ZXIsIF9sb2dnZXIsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBsb2dnZXIgPSBfbG9nZ2VyICE9PSB1bmRlZmluZWQgPyBfbG9nZ2VyIDogZXhwb3J0cy5OdWxsTG9nZ2VyO1xuICAgIGxldCBzZXF1ZW5jZU51bWJlciA9IDA7XG4gICAgbGV0IG5vdGlmaWNhdGlvblNlcXVlbmNlTnVtYmVyID0gMDtcbiAgICBsZXQgdW5rbm93blJlc3BvbnNlU2VxdWVuY2VOdW1iZXIgPSAwO1xuICAgIGNvbnN0IHZlcnNpb24gPSAnMi4wJztcbiAgICBsZXQgc3RhclJlcXVlc3RIYW5kbGVyID0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlcXVlc3RIYW5kbGVycyA9IG5ldyBNYXAoKTtcbiAgICBsZXQgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgY29uc3Qgbm90aWZpY2F0aW9uSGFuZGxlcnMgPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgcHJvZ3Jlc3NIYW5kbGVycyA9IG5ldyBNYXAoKTtcbiAgICBsZXQgdGltZXI7XG4gICAgbGV0IG1lc3NhZ2VRdWV1ZSA9IG5ldyBsaW5rZWRNYXBfMS5MaW5rZWRNYXAoKTtcbiAgICBsZXQgcmVzcG9uc2VQcm9taXNlcyA9IG5ldyBNYXAoKTtcbiAgICBsZXQga25vd25DYW5jZWxlZFJlcXVlc3RzID0gbmV3IFNldCgpO1xuICAgIGxldCByZXF1ZXN0VG9rZW5zID0gbmV3IE1hcCgpO1xuICAgIGxldCB0cmFjZSA9IFRyYWNlLk9mZjtcbiAgICBsZXQgdHJhY2VGb3JtYXQgPSBUcmFjZUZvcm1hdC5UZXh0O1xuICAgIGxldCB0cmFjZXI7XG4gICAgbGV0IHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLk5ldztcbiAgICBjb25zdCBlcnJvckVtaXR0ZXIgPSBuZXcgZXZlbnRzXzEuRW1pdHRlcigpO1xuICAgIGNvbnN0IGNsb3NlRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgdW5oYW5kbGVkTm90aWZpY2F0aW9uRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgdW5oYW5kbGVkUHJvZ3Jlc3NFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICBjb25zdCBkaXNwb3NlRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgY2FuY2VsbGF0aW9uU3RyYXRlZ3kgPSAob3B0aW9ucyAmJiBvcHRpb25zLmNhbmNlbGxhdGlvblN0cmF0ZWd5KSA/IG9wdGlvbnMuY2FuY2VsbGF0aW9uU3RyYXRlZ3kgOiBDYW5jZWxsYXRpb25TdHJhdGVneS5NZXNzYWdlO1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlcXVlc3RRdWV1ZUtleShpZCkge1xuICAgICAgICBpZiAoaWQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuJ3Qgc2VuZCByZXF1ZXN0cyB3aXRoIGlkIG51bGwgc2luY2UgdGhlIHJlc3BvbnNlIGNhbid0IGJlIGNvcnJlbGF0ZWQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdyZXEtJyArIGlkLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlc3BvbnNlUXVldWVLZXkoaWQpIHtcbiAgICAgICAgaWYgKGlkID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3Jlcy11bmtub3duLScgKyAoKyt1bmtub3duUmVzcG9uc2VTZXF1ZW5jZU51bWJlcikudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAncmVzLScgKyBpZC50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZU5vdGlmaWNhdGlvblF1ZXVlS2V5KCkge1xuICAgICAgICByZXR1cm4gJ25vdC0nICsgKCsrbm90aWZpY2F0aW9uU2VxdWVuY2VOdW1iZXIpLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFkZE1lc3NhZ2VUb1F1ZXVlKHF1ZXVlLCBtZXNzYWdlKSB7XG4gICAgICAgIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXF1ZXN0KG1lc3NhZ2UpKSB7XG4gICAgICAgICAgICBxdWV1ZS5zZXQoY3JlYXRlUmVxdWVzdFF1ZXVlS2V5KG1lc3NhZ2UuaWQpLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXNwb25zZShtZXNzYWdlKSkge1xuICAgICAgICAgICAgcXVldWUuc2V0KGNyZWF0ZVJlc3BvbnNlUXVldWVLZXkobWVzc2FnZS5pZCksIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcXVldWUuc2V0KGNyZWF0ZU5vdGlmaWNhdGlvblF1ZXVlS2V5KCksIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNhbmNlbFVuZGlzcGF0Y2hlZChfbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0xpc3RlbmluZygpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlID09PSBDb25uZWN0aW9uU3RhdGUuTGlzdGVuaW5nO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0Nsb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlID09PSBDb25uZWN0aW9uU3RhdGUuQ2xvc2VkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0Rpc3Bvc2VkKCkge1xuICAgICAgICByZXR1cm4gc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5EaXNwb3NlZDtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2xvc2VIYW5kbGVyKCkge1xuICAgICAgICBpZiAoc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5OZXcgfHwgc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5MaXN0ZW5pbmcpIHtcbiAgICAgICAgICAgIHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLkNsb3NlZDtcbiAgICAgICAgICAgIGNsb3NlRW1pdHRlci5maXJlKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlIGNvbm5lY3Rpb24gaXMgZGlzcG9zZWQgZG9uJ3Qgc2VudCBjbG9zZSBldmVudHMuXG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlYWRFcnJvckhhbmRsZXIoZXJyb3IpIHtcbiAgICAgICAgZXJyb3JFbWl0dGVyLmZpcmUoW2Vycm9yLCB1bmRlZmluZWQsIHVuZGVmaW5lZF0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiB3cml0ZUVycm9ySGFuZGxlcihkYXRhKSB7XG4gICAgICAgIGVycm9yRW1pdHRlci5maXJlKGRhdGEpO1xuICAgIH1cbiAgICBtZXNzYWdlUmVhZGVyLm9uQ2xvc2UoY2xvc2VIYW5kbGVyKTtcbiAgICBtZXNzYWdlUmVhZGVyLm9uRXJyb3IocmVhZEVycm9ySGFuZGxlcik7XG4gICAgbWVzc2FnZVdyaXRlci5vbkNsb3NlKGNsb3NlSGFuZGxlcik7XG4gICAgbWVzc2FnZVdyaXRlci5vbkVycm9yKHdyaXRlRXJyb3JIYW5kbGVyKTtcbiAgICBmdW5jdGlvbiB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCkge1xuICAgICAgICBpZiAodGltZXIgfHwgbWVzc2FnZVF1ZXVlLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aW1lciA9ICgwLCByYWxfMS5kZWZhdWx0KSgpLnRpbWVyLnNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICAgICAgICB0aW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHByb2Nlc3NNZXNzYWdlUXVldWUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGhhbmRsZU1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICBpZiAobWVzc2FnZXNfMS5NZXNzYWdlLmlzUmVxdWVzdChtZXNzYWdlKSkge1xuICAgICAgICAgICAgaGFuZGxlUmVxdWVzdChtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNOb3RpZmljYXRpb24obWVzc2FnZSkpIHtcbiAgICAgICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvbihtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXNwb25zZShtZXNzYWdlKSkge1xuICAgICAgICAgICAgaGFuZGxlUmVzcG9uc2UobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBoYW5kbGVJbnZhbGlkTWVzc2FnZShtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBwcm9jZXNzTWVzc2FnZVF1ZXVlKCkge1xuICAgICAgICBpZiAobWVzc2FnZVF1ZXVlLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXNzYWdlID0gbWVzc2FnZVF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlU3RyYXRlZ3kgPSBvcHRpb25zPy5tZXNzYWdlU3RyYXRlZ3k7XG4gICAgICAgICAgICBpZiAoTWVzc2FnZVN0cmF0ZWd5LmlzKG1lc3NhZ2VTdHJhdGVneSkpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlU3RyYXRlZ3kuaGFuZGxlTWVzc2FnZShtZXNzYWdlLCBoYW5kbGVNZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGhhbmRsZU1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgY2FsbGJhY2sgPSAobWVzc2FnZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2UgaGF2ZSByZWNlaXZlZCBhIGNhbmNlbGxhdGlvbiBtZXNzYWdlLiBDaGVjayBpZiB0aGUgbWVzc2FnZSBpcyBzdGlsbCBpbiB0aGUgcXVldWVcbiAgICAgICAgICAgIC8vIGFuZCBjYW5jZWwgaXQgaWYgYWxsb3dlZCB0byBkbyBzby5cbiAgICAgICAgICAgIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNOb3RpZmljYXRpb24obWVzc2FnZSkgJiYgbWVzc2FnZS5tZXRob2QgPT09IENhbmNlbE5vdGlmaWNhdGlvbi50eXBlLm1ldGhvZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbmNlbElkID0gbWVzc2FnZS5wYXJhbXMuaWQ7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gY3JlYXRlUmVxdWVzdFF1ZXVlS2V5KGNhbmNlbElkKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0b0NhbmNlbCA9IG1lc3NhZ2VRdWV1ZS5nZXQoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZXNfMS5NZXNzYWdlLmlzUmVxdWVzdCh0b0NhbmNlbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyYXRlZ3kgPSBvcHRpb25zPy5jb25uZWN0aW9uU3RyYXRlZ3k7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gKHN0cmF0ZWd5ICYmIHN0cmF0ZWd5LmNhbmNlbFVuZGlzcGF0Y2hlZCkgPyBzdHJhdGVneS5jYW5jZWxVbmRpc3BhdGNoZWQodG9DYW5jZWwsIGNhbmNlbFVuZGlzcGF0Y2hlZCkgOiBjYW5jZWxVbmRpc3BhdGNoZWQodG9DYW5jZWwpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgJiYgKHJlc3BvbnNlLmVycm9yICE9PSB1bmRlZmluZWQgfHwgcmVzcG9uc2UucmVzdWx0ICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUXVldWUuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLmRlbGV0ZShjYW5jZWxJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5pZCA9IHRvQ2FuY2VsLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VTZW5kaW5nUmVzcG9uc2UocmVzcG9uc2UsIG1lc3NhZ2UubWV0aG9kLCBEYXRlLm5vdygpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUocmVzcG9uc2UpLmNhdGNoKCgpID0+IGxvZ2dlci5lcnJvcihgU2VuZGluZyByZXNwb25zZSBmb3IgY2FuY2VsZWQgbWVzc2FnZSBmYWlsZWQuYCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGNhbmNlbGxhdGlvblRva2VuID0gcmVxdWVzdFRva2Vucy5nZXQoY2FuY2VsSWQpO1xuICAgICAgICAgICAgICAgIC8vIFRoZSByZXF1ZXN0IGlzIGFscmVhZHkgcnVubmluZy4gQ2FuY2VsIHRoZSB0b2tlblxuICAgICAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbmNlbGxhdGlvblRva2VuLmNhbmNlbCgpO1xuICAgICAgICAgICAgICAgICAgICB0cmFjZVJlY2VpdmVkTm90aWZpY2F0aW9uKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZW1lbWJlciB0aGUgY2FuY2VsIGJ1dCBzdGlsbCBxdWV1ZSB0aGUgbWVzc2FnZSB0b1xuICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbiB1cCBzdGF0ZSBpbiBwcm9jZXNzIG1lc3NhZ2UuXG4gICAgICAgICAgICAgICAgICAgIGtub3duQ2FuY2VsZWRSZXF1ZXN0cy5hZGQoY2FuY2VsSWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFkZE1lc3NhZ2VUb1F1ZXVlKG1lc3NhZ2VRdWV1ZSwgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGZ1bmN0aW9uIGhhbmRsZVJlcXVlc3QocmVxdWVzdE1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgLy8gd2UgcmV0dXJuIGhlcmUgc2lsZW50bHkgc2luY2Ugd2UgZmlyZWQgYW4gZXZlbnQgd2hlbiB0aGVcbiAgICAgICAgICAgIC8vIGNvbm5lY3Rpb24gZ290IGRpc3Bvc2VkLlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHJlcGx5KHJlc3VsdE9yRXJyb3IsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgaWQ6IHJlcXVlc3RNZXNzYWdlLmlkXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKHJlc3VsdE9yRXJyb3IgaW5zdGFuY2VvZiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlLmVycm9yID0gcmVzdWx0T3JFcnJvci50b0pzb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVzdWx0ID0gcmVzdWx0T3JFcnJvciA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHJlc3VsdE9yRXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cmFjZVNlbmRpbmdSZXNwb25zZShtZXNzYWdlLCBtZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICBtZXNzYWdlV3JpdGVyLndyaXRlKG1lc3NhZ2UpLmNhdGNoKCgpID0+IGxvZ2dlci5lcnJvcihgU2VuZGluZyByZXNwb25zZSBmYWlsZWQuYCkpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHJlcGx5RXJyb3IoZXJyb3IsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgaWQ6IHJlcXVlc3RNZXNzYWdlLmlkLFxuICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvci50b0pzb24oKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUobWVzc2FnZSkuY2F0Y2goKCkgPT4gbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlc3BvbnNlIGZhaWxlZC5gKSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gcmVwbHlTdWNjZXNzKHJlc3VsdCwgbWV0aG9kLCBzdGFydFRpbWUpIHtcbiAgICAgICAgICAgIC8vIFRoZSBKU09OIFJQQyBkZWZpbmVzIHRoYXQgYSByZXNwb25zZSBtdXN0IGVpdGhlciBoYXZlIGEgcmVzdWx0IG9yIGFuIGVycm9yXG4gICAgICAgICAgICAvLyBTbyB3ZSBjYW4ndCB0cmVhdCB1bmRlZmluZWQgYXMgYSB2YWxpZCByZXNwb25zZSByZXN1bHQuXG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgICAgICAgICAgICBqc29ucnBjOiB2ZXJzaW9uLFxuICAgICAgICAgICAgICAgIGlkOiByZXF1ZXN0TWVzc2FnZS5pZCxcbiAgICAgICAgICAgICAgICByZXN1bHQ6IHJlc3VsdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUobWVzc2FnZSkuY2F0Y2goKCkgPT4gbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlc3BvbnNlIGZhaWxlZC5gKSk7XG4gICAgICAgIH1cbiAgICAgICAgdHJhY2VSZWNlaXZlZFJlcXVlc3QocmVxdWVzdE1lc3NhZ2UpO1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gcmVxdWVzdEhhbmRsZXJzLmdldChyZXF1ZXN0TWVzc2FnZS5tZXRob2QpO1xuICAgICAgICBsZXQgdHlwZTtcbiAgICAgICAgbGV0IHJlcXVlc3RIYW5kbGVyO1xuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgdHlwZSA9IGVsZW1lbnQudHlwZTtcbiAgICAgICAgICAgIHJlcXVlc3RIYW5kbGVyID0gZWxlbWVudC5oYW5kbGVyO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIGlmIChyZXF1ZXN0SGFuZGxlciB8fCBzdGFyUmVxdWVzdEhhbmRsZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHRva2VuS2V5ID0gcmVxdWVzdE1lc3NhZ2UuaWQgPz8gU3RyaW5nKERhdGUubm93KCkpOyAvL1xuICAgICAgICAgICAgY29uc3QgY2FuY2VsbGF0aW9uU291cmNlID0gSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKGNhbmNlbGxhdGlvblN0cmF0ZWd5LnJlY2VpdmVyKVxuICAgICAgICAgICAgICAgID8gY2FuY2VsbGF0aW9uU3RyYXRlZ3kucmVjZWl2ZXIuY3JlYXRlQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UodG9rZW5LZXkpXG4gICAgICAgICAgICAgICAgOiBjYW5jZWxsYXRpb25TdHJhdGVneS5yZWNlaXZlci5jcmVhdGVDYW5jZWxsYXRpb25Ub2tlblNvdXJjZShyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICBpZiAocmVxdWVzdE1lc3NhZ2UuaWQgIT09IG51bGwgJiYga25vd25DYW5jZWxlZFJlcXVlc3RzLmhhcyhyZXF1ZXN0TWVzc2FnZS5pZCkpIHtcbiAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25Tb3VyY2UuY2FuY2VsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVxdWVzdE1lc3NhZ2UuaWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLnNldCh0b2tlbktleSwgY2FuY2VsbGF0aW9uU291cmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IGhhbmRsZXJSZXN1bHQ7XG4gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0TWVzc2FnZS5wYXJhbXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlLm51bWJlck9mUGFyYW1zICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1zLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyAke3R5cGUubnVtYmVyT2ZQYXJhbXN9IHBhcmFtcyBidXQgcmVjZWl2ZWQgbm9uZS5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJSZXN1bHQgPSByZXF1ZXN0SGFuZGxlcihjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVxdWVzdE1lc3NhZ2UucGFyYW1zKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlLnBhcmFtZXRlclN0cnVjdHVyZXMgPT09IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseUVycm9yKG5ldyBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IobWVzc2FnZXNfMS5FcnJvckNvZGVzLkludmFsaWRQYXJhbXMsIGBSZXF1ZXN0ICR7cmVxdWVzdE1lc3NhZ2UubWV0aG9kfSBkZWZpbmVzIHBhcmFtZXRlcnMgYnkgbmFtZSBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBwb3NpdGlvbmApLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlclJlc3VsdCA9IHJlcXVlc3RIYW5kbGVyKC4uLnJlcXVlc3RNZXNzYWdlLnBhcmFtcywgY2FuY2VsbGF0aW9uU291cmNlLnRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS5wYXJhbWV0ZXJTdHJ1Y3R1cmVzID09PSBtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW52YWxpZFBhcmFtcywgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGRlZmluZXMgcGFyYW1ldGVycyBieSBwb3NpdGlvbiBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBuYW1lYCksIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gcmVxdWVzdEhhbmRsZXIocmVxdWVzdE1lc3NhZ2UucGFyYW1zLCBjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0YXJSZXF1ZXN0SGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gc3RhclJlcXVlc3RIYW5kbGVyKHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgcmVxdWVzdE1lc3NhZ2UucGFyYW1zLCBjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBwcm9taXNlID0gaGFuZGxlclJlc3VsdDtcbiAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZXJSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFRva2Vucy5kZWxldGUodG9rZW5LZXkpO1xuICAgICAgICAgICAgICAgICAgICByZXBseVN1Y2Nlc3MoaGFuZGxlclJlc3VsdCwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwcm9taXNlLnRoZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS50aGVuKChyZXN1bHRPckVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLmRlbGV0ZSh0b2tlbktleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXBseShyZXN1bHRPckVycm9yLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IoZXJyb3IsIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVycm9yICYmIElzLnN0cmluZyhlcnJvci5tZXNzYWdlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGZhaWxlZCB3aXRoIG1lc3NhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZmFpbGVkIHVuZXhwZWN0ZWRseSB3aXRob3V0IHByb3ZpZGluZyBhbnkgZGV0YWlscy5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHkoaGFuZGxlclJlc3VsdCwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHkoZXJyb3IsIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZXJyb3IgJiYgSXMuc3RyaW5nKGVycm9yLm1lc3NhZ2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGZhaWxlZCB3aXRoIG1lc3NhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZmFpbGVkIHVuZXhwZWN0ZWRseSB3aXRob3V0IHByb3ZpZGluZyBhbnkgZGV0YWlscy5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuTWV0aG9kTm90Rm91bmQsIGBVbmhhbmRsZWQgbWV0aG9kICR7cmVxdWVzdE1lc3NhZ2UubWV0aG9kfWApLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlUmVzcG9uc2UocmVzcG9uc2VNZXNzYWdlKSB7XG4gICAgICAgIGlmIChpc0Rpc3Bvc2VkKCkpIHtcbiAgICAgICAgICAgIC8vIFNlZSBoYW5kbGUgcmVxdWVzdC5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzcG9uc2VNZXNzYWdlLmlkID09PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VNZXNzYWdlLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBSZWNlaXZlZCByZXNwb25zZSBtZXNzYWdlIHdpdGhvdXQgaWQ6IEVycm9yIGlzOiBcXG4ke0pTT04uc3RyaW5naWZ5KHJlc3BvbnNlTWVzc2FnZS5lcnJvciwgdW5kZWZpbmVkLCA0KX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgUmVjZWl2ZWQgcmVzcG9uc2UgbWVzc2FnZSB3aXRob3V0IGlkLiBObyBmdXJ0aGVyIGVycm9yIGluZm9ybWF0aW9uIHByb3ZpZGVkLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gcmVzcG9uc2VNZXNzYWdlLmlkO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VQcm9taXNlID0gcmVzcG9uc2VQcm9taXNlcy5nZXQoa2V5KTtcbiAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWRSZXNwb25zZShyZXNwb25zZU1lc3NhZ2UsIHJlc3BvbnNlUHJvbWlzZSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VQcm9taXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2VzLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZU1lc3NhZ2UuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gcmVzcG9uc2VNZXNzYWdlLmVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlLnJlamVjdChuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKGVycm9yLmNvZGUsIGVycm9yLm1lc3NhZ2UsIGVycm9yLmRhdGEpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXNwb25zZU1lc3NhZ2UucmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlTWVzc2FnZS5yZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgbmV2ZXIgaGFwcGVuLicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IubWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBSZXNwb25zZSBoYW5kbGVyICcke3Jlc3BvbnNlUHJvbWlzZS5tZXRob2R9JyBmYWlsZWQgd2l0aCBtZXNzYWdlOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYFJlc3BvbnNlIGhhbmRsZXIgJyR7cmVzcG9uc2VQcm9taXNlLm1ldGhvZH0nIGZhaWxlZCB1bmV4cGVjdGVkbHkuYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlTm90aWZpY2F0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgLy8gU2VlIGhhbmRsZSByZXF1ZXN0LlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0eXBlID0gdW5kZWZpbmVkO1xuICAgICAgICBsZXQgbm90aWZpY2F0aW9uSGFuZGxlcjtcbiAgICAgICAgaWYgKG1lc3NhZ2UubWV0aG9kID09PSBDYW5jZWxOb3RpZmljYXRpb24udHlwZS5tZXRob2QpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhbmNlbElkID0gbWVzc2FnZS5wYXJhbXMuaWQ7XG4gICAgICAgICAgICBrbm93bkNhbmNlbGVkUmVxdWVzdHMuZGVsZXRlKGNhbmNlbElkKTtcbiAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWROb3RpZmljYXRpb24obWVzc2FnZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gbm90aWZpY2F0aW9uSGFuZGxlcnMuZ2V0KG1lc3NhZ2UubWV0aG9kKTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uSGFuZGxlciA9IGVsZW1lbnQuaGFuZGxlcjtcbiAgICAgICAgICAgICAgICB0eXBlID0gZWxlbWVudC50eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChub3RpZmljYXRpb25IYW5kbGVyIHx8IHN0YXJOb3RpZmljYXRpb25IYW5kbGVyKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWROb3RpZmljYXRpb24obWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgaWYgKG5vdGlmaWNhdGlvbkhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UucGFyYW1zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5udW1iZXJPZlBhcmFtcyAhPT0gMCAmJiB0eXBlLnBhcmFtZXRlclN0cnVjdHVyZXMgIT09IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBOb3RpZmljYXRpb24gJHttZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyAke3R5cGUubnVtYmVyT2ZQYXJhbXN9IHBhcmFtcyBidXQgcmVjZWl2ZWQgbm9uZS5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShtZXNzYWdlLnBhcmFtcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGFyZSBKU09OLVJQQyBsaWJyYXJpZXMgdGhhdCBzZW5kIHByb2dyZXNzIG1lc3NhZ2UgYXMgcG9zaXRpb25hbCBwYXJhbXMgYWx0aG91Z2hcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpZmllZCBhcyBuYW1lZC4gU28gY29udmVydCB0aGVtIGlmIHRoaXMgaXMgdGhlIGNhc2UuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBtZXNzYWdlLnBhcmFtcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLm1ldGhvZCA9PT0gUHJvZ3Jlc3NOb3RpZmljYXRpb24udHlwZS5tZXRob2QgJiYgcGFyYW1zLmxlbmd0aCA9PT0gMiAmJiBQcm9ncmVzc1Rva2VuLmlzKHBhcmFtc1swXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKHsgdG9rZW46IHBhcmFtc1swXSwgdmFsdWU6IHBhcmFtc1sxXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUucGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBOb3RpZmljYXRpb24gJHttZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyBwYXJhbWV0ZXJzIGJ5IG5hbWUgYnV0IHJlY2VpdmVkIHBhcmFtZXRlcnMgYnkgcG9zaXRpb25gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5udW1iZXJPZlBhcmFtcyAhPT0gbWVzc2FnZS5wYXJhbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYE5vdGlmaWNhdGlvbiAke21lc3NhZ2UubWV0aG9kfSBkZWZpbmVzICR7dHlwZS5udW1iZXJPZlBhcmFtc30gcGFyYW1zIGJ1dCByZWNlaXZlZCAke3BhcmFtcy5sZW5ndGh9IGFyZ3VtZW50c2ApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXIoLi4ucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS5wYXJhbWV0ZXJTdHJ1Y3R1cmVzID09PSBtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgTm90aWZpY2F0aW9uICR7bWVzc2FnZS5tZXRob2R9IGRlZmluZXMgcGFyYW1ldGVycyBieSBwb3NpdGlvbiBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBuYW1lYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKG1lc3NhZ2UucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGFyTm90aWZpY2F0aW9uSGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICBzdGFyTm90aWZpY2F0aW9uSGFuZGxlcihtZXNzYWdlLm1ldGhvZCwgbWVzc2FnZS5wYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvci5tZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgTm90aWZpY2F0aW9uIGhhbmRsZXIgJyR7bWVzc2FnZS5tZXRob2R9JyBmYWlsZWQgd2l0aCBtZXNzYWdlOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYE5vdGlmaWNhdGlvbiBoYW5kbGVyICcke21lc3NhZ2UubWV0aG9kfScgZmFpbGVkIHVuZXhwZWN0ZWRseS5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1bmhhbmRsZWROb3RpZmljYXRpb25FbWl0dGVyLmZpcmUobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlSW52YWxpZE1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignUmVjZWl2ZWQgZW1wdHkgbWVzc2FnZS4nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsb2dnZXIuZXJyb3IoYFJlY2VpdmVkIG1lc3NhZ2Ugd2hpY2ggaXMgbmVpdGhlciBhIHJlc3BvbnNlIG5vciBhIG5vdGlmaWNhdGlvbiBtZXNzYWdlOlxcbiR7SlNPTi5zdHJpbmdpZnkobWVzc2FnZSwgbnVsbCwgNCl9YCk7XG4gICAgICAgIC8vIFRlc3Qgd2hldGhlciB3ZSBmaW5kIGFuIGlkIHRvIHJlamVjdCB0aGUgcHJvbWlzZVxuICAgICAgICBjb25zdCByZXNwb25zZU1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICBpZiAoSXMuc3RyaW5nKHJlc3BvbnNlTWVzc2FnZS5pZCkgfHwgSXMubnVtYmVyKHJlc3BvbnNlTWVzc2FnZS5pZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHJlc3BvbnNlTWVzc2FnZS5pZDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxlciA9IHJlc3BvbnNlUHJvbWlzZXMuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VIYW5kbGVyLnJlamVjdChuZXcgRXJyb3IoJ1RoZSByZWNlaXZlZCByZXNwb25zZSBoYXMgbmVpdGhlciBhIHJlc3VsdCBub3IgYW4gZXJyb3IgcHJvcGVydHkuJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0cmluZ2lmeVRyYWNlKHBhcmFtcykge1xuICAgICAgICBpZiAocGFyYW1zID09PSB1bmRlZmluZWQgfHwgcGFyYW1zID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAodHJhY2UpIHtcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuVmVyYm9zZTpcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGFyYW1zLCBudWxsLCA0KTtcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuQ29tcGFjdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGFyYW1zKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVNlbmRpbmdSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFjZUZvcm1hdCA9PT0gVHJhY2VGb3JtYXQuVGV4dCkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSAmJiBtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBgUGFyYW1zOiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucGFyYW1zKX1cXG5cXG5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJhY2VyLmxvZyhgU2VuZGluZyByZXF1ZXN0ICcke21lc3NhZ2UubWV0aG9kfSAtICgke21lc3NhZ2UuaWR9KScuYCwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb2dMU1BNZXNzYWdlKCdzZW5kLXJlcXVlc3QnLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVNlbmRpbmdOb3RpZmljYXRpb24obWVzc2FnZSkge1xuICAgICAgICBpZiAodHJhY2UgPT09IFRyYWNlLk9mZiB8fCAhdHJhY2VyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYWNlRm9ybWF0ID09PSBUcmFjZUZvcm1hdC5UZXh0KSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdCkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0gYFBhcmFtczogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLnBhcmFtcyl9XFxuXFxuYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSAnTm8gcGFyYW1ldGVycyBwcm92aWRlZC5cXG5cXG4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFNlbmRpbmcgbm90aWZpY2F0aW9uICcke21lc3NhZ2UubWV0aG9kfScuYCwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb2dMU1BNZXNzYWdlKCdzZW5kLW5vdGlmaWNhdGlvbicsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhY2VGb3JtYXQgPT09IFRyYWNlRm9ybWF0LlRleHQpIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZXJyb3IgJiYgbWVzc2FnZS5lcnJvci5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgRXJyb3IgZGF0YTogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLmVycm9yLmRhdGEpfVxcblxcbmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgUmVzdWx0OiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucmVzdWx0KX1cXG5cXG5gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UuZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9ICdObyByZXN1bHQgcmV0dXJuZWQuXFxuXFxuJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFNlbmRpbmcgcmVzcG9uc2UgJyR7bWV0aG9kfSAtICgke21lc3NhZ2UuaWR9KScuIFByb2Nlc3NpbmcgcmVxdWVzdCB0b29rICR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1tc2AsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgnc2VuZC1yZXNwb25zZScsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYWNlUmVjZWl2ZWRSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFjZUZvcm1hdCA9PT0gVHJhY2VGb3JtYXQuVGV4dCkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSAmJiBtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBgUGFyYW1zOiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucGFyYW1zKX1cXG5cXG5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJhY2VyLmxvZyhgUmVjZWl2ZWQgcmVxdWVzdCAnJHttZXNzYWdlLm1ldGhvZH0gLSAoJHttZXNzYWdlLmlkfSknLmAsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1yZXF1ZXN0JywgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdHJhY2VSZWNlaXZlZE5vdGlmaWNhdGlvbihtZXNzYWdlKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIgfHwgbWVzc2FnZS5tZXRob2QgPT09IExvZ1RyYWNlTm90aWZpY2F0aW9uLnR5cGUubWV0aG9kKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYWNlRm9ybWF0ID09PSBUcmFjZUZvcm1hdC5UZXh0KSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdCkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0gYFBhcmFtczogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLnBhcmFtcyl9XFxuXFxuYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSAnTm8gcGFyYW1ldGVycyBwcm92aWRlZC5cXG5cXG4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFJlY2VpdmVkIG5vdGlmaWNhdGlvbiAnJHttZXNzYWdlLm1ldGhvZH0nLmAsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1ub3RpZmljYXRpb24nLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVJlY2VpdmVkUmVzcG9uc2UobWVzc2FnZSwgcmVzcG9uc2VQcm9taXNlKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhY2VGb3JtYXQgPT09IFRyYWNlRm9ybWF0LlRleHQpIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZXJyb3IgJiYgbWVzc2FnZS5lcnJvci5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgRXJyb3IgZGF0YTogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLmVycm9yLmRhdGEpfVxcblxcbmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgUmVzdWx0OiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucmVzdWx0KX1cXG5cXG5gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UuZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9ICdObyByZXN1bHQgcmV0dXJuZWQuXFxuXFxuJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXNwb25zZVByb21pc2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IG1lc3NhZ2UuZXJyb3IgPyBgIFJlcXVlc3QgZmFpbGVkOiAke21lc3NhZ2UuZXJyb3IubWVzc2FnZX0gKCR7bWVzc2FnZS5lcnJvci5jb2RlfSkuYCA6ICcnO1xuICAgICAgICAgICAgICAgIHRyYWNlci5sb2coYFJlY2VpdmVkIHJlc3BvbnNlICcke3Jlc3BvbnNlUHJvbWlzZS5tZXRob2R9IC0gKCR7bWVzc2FnZS5pZH0pJyBpbiAke0RhdGUubm93KCkgLSByZXNwb25zZVByb21pc2UudGltZXJTdGFydH1tcy4ke2Vycm9yfWAsIGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJhY2VyLmxvZyhgUmVjZWl2ZWQgcmVzcG9uc2UgJHttZXNzYWdlLmlkfSB3aXRob3V0IGFjdGl2ZSByZXNwb25zZSBwcm9taXNlLmAsIGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1yZXNwb25zZScsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGxvZ0xTUE1lc3NhZ2UodHlwZSwgbWVzc2FnZSkge1xuICAgICAgICBpZiAoIXRyYWNlciB8fCB0cmFjZSA9PT0gVHJhY2UuT2ZmKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbHNwTWVzc2FnZSA9IHtcbiAgICAgICAgICAgIGlzTFNQTWVzc2FnZTogdHJ1ZSxcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpXG4gICAgICAgIH07XG4gICAgICAgIHRyYWNlci5sb2cobHNwTWVzc2FnZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRocm93SWZDbG9zZWRPckRpc3Bvc2VkKCkge1xuICAgICAgICBpZiAoaXNDbG9zZWQoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IENvbm5lY3Rpb25FcnJvcihDb25uZWN0aW9uRXJyb3JzLkNsb3NlZCwgJ0Nvbm5lY3Rpb24gaXMgY2xvc2VkLicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0Rpc3Bvc2VkKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb25uZWN0aW9uRXJyb3IoQ29ubmVjdGlvbkVycm9ycy5EaXNwb3NlZCwgJ0Nvbm5lY3Rpb24gaXMgZGlzcG9zZWQuJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdGhyb3dJZkxpc3RlbmluZygpIHtcbiAgICAgICAgaWYgKGlzTGlzdGVuaW5nKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb25uZWN0aW9uRXJyb3IoQ29ubmVjdGlvbkVycm9ycy5BbHJlYWR5TGlzdGVuaW5nLCAnQ29ubmVjdGlvbiBpcyBhbHJlYWR5IGxpc3RlbmluZycpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRocm93SWZOb3RMaXN0ZW5pbmcoKSB7XG4gICAgICAgIGlmICghaXNMaXN0ZW5pbmcoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYWxsIGxpc3RlbigpIGZpcnN0LicpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVuZGVmaW5lZFRvTnVsbChwYXJhbSkge1xuICAgICAgICBpZiAocGFyYW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyYW07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gbnVsbFRvVW5kZWZpbmVkKHBhcmFtKSB7XG4gICAgICAgIGlmIChwYXJhbSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJhbTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBpc05hbWVkUGFyYW0ocGFyYW0pIHtcbiAgICAgICAgcmV0dXJuIHBhcmFtICE9PSB1bmRlZmluZWQgJiYgcGFyYW0gIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkocGFyYW0pICYmIHR5cGVvZiBwYXJhbSA9PT0gJ29iamVjdCc7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXB1dGVTaW5nbGVQYXJhbShwYXJhbWV0ZXJTdHJ1Y3R1cmVzLCBwYXJhbSkge1xuICAgICAgICBzd2l0Y2ggKHBhcmFtZXRlclN0cnVjdHVyZXMpIHtcbiAgICAgICAgICAgIGNhc2UgbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG86XG4gICAgICAgICAgICAgICAgaWYgKGlzTmFtZWRQYXJhbShwYXJhbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxUb1VuZGVmaW5lZChwYXJhbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3VuZGVmaW5lZFRvTnVsbChwYXJhbSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZTpcbiAgICAgICAgICAgICAgICBpZiAoIWlzTmFtZWRQYXJhbShwYXJhbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWNlaXZlZCBwYXJhbWV0ZXJzIGJ5IG5hbWUgYnV0IHBhcmFtIGlzIG5vdCBhbiBvYmplY3QgbGl0ZXJhbC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGxUb1VuZGVmaW5lZChwYXJhbSk7XG4gICAgICAgICAgICBjYXNlIG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieVBvc2l0aW9uOlxuICAgICAgICAgICAgICAgIHJldHVybiBbdW5kZWZpbmVkVG9OdWxsKHBhcmFtKV07XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBwYXJhbWV0ZXIgc3RydWN0dXJlICR7cGFyYW1ldGVyU3RydWN0dXJlcy50b1N0cmluZygpfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXB1dGVNZXNzYWdlUGFyYW1zKHR5cGUsIHBhcmFtcykge1xuICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICBjb25zdCBudW1iZXJPZlBhcmFtcyA9IHR5cGUubnVtYmVyT2ZQYXJhbXM7XG4gICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gY29tcHV0ZVNpbmdsZVBhcmFtKHR5cGUucGFyYW1ldGVyU3RydWN0dXJlcywgcGFyYW1zWzBdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoICYmIGkgPCBudW1iZXJPZlBhcmFtczsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHVuZGVmaW5lZFRvTnVsbChwYXJhbXNbaV0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPCBudW1iZXJPZlBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gcGFyYW1zLmxlbmd0aDsgaSA8IG51bWJlck9mUGFyYW1zOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB7XG4gICAgICAgIHNlbmROb3RpZmljYXRpb246ICh0eXBlLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlUGFyYW1zO1xuICAgICAgICAgICAgaWYgKElzLnN0cmluZyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICAgIGxldCBwYXJhbVN0YXJ0ID0gMDtcbiAgICAgICAgICAgICAgICBsZXQgcGFyYW1ldGVyU3RydWN0dXJlcyA9IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvO1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuaXMoZmlyc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtU3RhcnQgPSAxO1xuICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gZmlyc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBwYXJhbUVuZCA9IGFyZ3MubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gcGFyYW1FbmQgLSBwYXJhbVN0YXJ0O1xuICAgICAgICAgICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zID0gY29tcHV0ZVNpbmdsZVBhcmFtKHBhcmFtZXRlclN0cnVjdHVyZXMsIGFyZ3NbcGFyYW1TdGFydF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjZWl2ZWQgJHtudW1iZXJPZlBhcmFtc30gcGFyYW1ldGVycyBmb3IgJ2J5IE5hbWUnIG5vdGlmaWNhdGlvbiBwYXJhbWV0ZXIgc3RydWN0dXJlLmApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IGFyZ3Muc2xpY2UocGFyYW1TdGFydCwgcGFyYW1FbmQpLm1hcCh2YWx1ZSA9PiB1bmRlZmluZWRUb051bGwodmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IGFyZ3M7XG4gICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZS5tZXRob2Q7XG4gICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IGNvbXB1dGVNZXNzYWdlUGFyYW1zKHR5cGUsIHBhcmFtcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBub3RpZmljYXRpb25NZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBtZXNzYWdlUGFyYW1zXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdHJhY2VTZW5kaW5nTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbk1lc3NhZ2UpO1xuICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2VXcml0ZXIud3JpdGUobm90aWZpY2F0aW9uTWVzc2FnZSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBTZW5kaW5nIG5vdGlmaWNhdGlvbiBmYWlsZWQuYCk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25Ob3RpZmljYXRpb246ICh0eXBlLCBoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGlmIChJcy5mdW5jKHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB0eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaGFuZGxlcikge1xuICAgICAgICAgICAgICAgIGlmIChJcy5zdHJpbmcodHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZTtcbiAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uSGFuZGxlcnMuc2V0KHR5cGUsIHsgdHlwZTogdW5kZWZpbmVkLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZS5tZXRob2Q7XG4gICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXJzLnNldCh0eXBlLm1ldGhvZCwgeyB0eXBlLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXJzLmRlbGV0ZShtZXRob2QpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBvblByb2dyZXNzOiAoX3R5cGUsIHRva2VuLCBoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgICBpZiAocHJvZ3Jlc3NIYW5kbGVycy5oYXModG9rZW4pKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm9ncmVzcyBoYW5kbGVyIGZvciB0b2tlbiAke3Rva2VufSBhbHJlYWR5IHJlZ2lzdGVyZWRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByb2dyZXNzSGFuZGxlcnMuc2V0KHRva2VuLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc0hhbmRsZXJzLmRlbGV0ZSh0b2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgc2VuZFByb2dyZXNzOiAoX3R5cGUsIHRva2VuLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGF3YWl0IGJ1dCBzaW1wbGUgcmV0dXJuIHRvIGVuc3VyZSB0aGF0IHdlIGRvbid0IGhhdmUgYW5vdGhlclxuICAgICAgICAgICAgLy8gYXN5bmMgc2NoZWR1bGluZy4gT3RoZXJ3aXNlIG9uZSBzZW5kIGNvdWxkIG92ZXJ0YWtlIGFub3RoZXIgc2VuZC5cbiAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLnNlbmROb3RpZmljYXRpb24oUHJvZ3Jlc3NOb3RpZmljYXRpb24udHlwZSwgeyB0b2tlbiwgdmFsdWUgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uVW5oYW5kbGVkUHJvZ3Jlc3M6IHVuaGFuZGxlZFByb2dyZXNzRW1pdHRlci5ldmVudCxcbiAgICAgICAgc2VuZFJlcXVlc3Q6ICh0eXBlLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgdGhyb3dJZk5vdExpc3RlbmluZygpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlUGFyYW1zO1xuICAgICAgICAgICAgbGV0IHRva2VuID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKElzLnN0cmluZyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3QgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgbGV0IHBhcmFtU3RhcnQgPSAwO1xuICAgICAgICAgICAgICAgIGxldCBwYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG87XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5pcyhmaXJzdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1TdGFydCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlclN0cnVjdHVyZXMgPSBmaXJzdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHBhcmFtRW5kID0gYXJncy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuLmlzKGxhc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtRW5kID0gcGFyYW1FbmQgLSAxO1xuICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IGxhc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gcGFyYW1FbmQgLSBwYXJhbVN0YXJ0O1xuICAgICAgICAgICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zID0gY29tcHV0ZVNpbmdsZVBhcmFtKHBhcmFtZXRlclN0cnVjdHVyZXMsIGFyZ3NbcGFyYW1TdGFydF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjZWl2ZWQgJHtudW1iZXJPZlBhcmFtc30gcGFyYW1ldGVycyBmb3IgJ2J5IE5hbWUnIHJlcXVlc3QgcGFyYW1ldGVyIHN0cnVjdHVyZS5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMgPSBhcmdzLnNsaWNlKHBhcmFtU3RhcnQsIHBhcmFtRW5kKS5tYXAodmFsdWUgPT4gdW5kZWZpbmVkVG9OdWxsKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBhcmdzO1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGUubWV0aG9kO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMgPSBjb21wdXRlTWVzc2FnZVBhcmFtcyh0eXBlLCBwYXJhbXMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gdHlwZS5udW1iZXJPZlBhcmFtcztcbiAgICAgICAgICAgICAgICB0b2tlbiA9IGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuLmlzKHBhcmFtc1tudW1iZXJPZlBhcmFtc10pID8gcGFyYW1zW251bWJlck9mUGFyYW1zXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGlkID0gc2VxdWVuY2VOdW1iZXIrKztcbiAgICAgICAgICAgIGxldCBkaXNwb3NhYmxlO1xuICAgICAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgICAgICAgZGlzcG9zYWJsZSA9IHRva2VuLm9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcCA9IGNhbmNlbGxhdGlvblN0cmF0ZWd5LnNlbmRlci5zZW5kQ2FuY2VsbGF0aW9uKGNvbm5lY3Rpb24sIGlkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhgUmVjZWl2ZWQgbm8gcHJvbWlzZSBmcm9tIGNhbmNlbGxhdGlvbiBzdHJhdGVneSB3aGVuIGNhbmNlbGxpbmcgaWQgJHtpZH1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIubG9nKGBTZW5kaW5nIGNhbmNlbGxhdGlvbiBtZXNzYWdlcyBmb3IgaWQgJHtpZH0gZmFpbGVkYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdE1lc3NhZ2UgPSB7XG4gICAgICAgICAgICAgICAganNvbnJwYzogdmVyc2lvbixcbiAgICAgICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBtZXNzYWdlUGFyYW1zXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdHJhY2VTZW5kaW5nUmVxdWVzdChyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNhbmNlbGxhdGlvblN0cmF0ZWd5LnNlbmRlci5lbmFibGVDYW5jZWxsYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25TdHJhdGVneS5zZW5kZXIuZW5hYmxlQ2FuY2VsbGF0aW9uKHJlcXVlc3RNZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZVdpdGhDbGVhbnVwID0gKHIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyKTtcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uU3RyYXRlZ3kuc2VuZGVyLmNsZWFudXAoaWQpO1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlPy5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWplY3RXaXRoQ2xlYW51cCA9IChyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChyKTtcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uU3RyYXRlZ3kuc2VuZGVyLmNsZWFudXAoaWQpO1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlPy5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZVByb21pc2UgPSB7IG1ldGhvZDogbWV0aG9kLCB0aW1lclN0YXJ0OiBEYXRlLm5vdygpLCByZXNvbHZlOiByZXNvbHZlV2l0aENsZWFudXAsIHJlamVjdDogcmVqZWN0V2l0aENsZWFudXAgfTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2VzLnNldChpZCwgcmVzcG9uc2VQcm9taXNlKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbWVzc2FnZVdyaXRlci53cml0ZShyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAvLyBXcml0aW5nIHRoZSBtZXNzYWdlIGZhaWxlZC4gU28gd2UgbmVlZCB0byBkZWxldGUgaXQgZnJvbSB0aGUgcmVzcG9uc2UgcHJvbWlzZXMgYW5kXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlamVjdCBpdC5cbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlcy5kZWxldGUoaWQpO1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2UucmVqZWN0KG5ldyBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IobWVzc2FnZXNfMS5FcnJvckNvZGVzLk1lc3NhZ2VXcml0ZUVycm9yLCBlcnJvci5tZXNzYWdlID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIHJlYXNvbicpKTtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlcXVlc3QgZmFpbGVkLmApO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25SZXF1ZXN0OiAodHlwZSwgaGFuZGxlcikgPT4ge1xuICAgICAgICAgICAgdGhyb3dJZkNsb3NlZE9yRGlzcG9zZWQoKTtcbiAgICAgICAgICAgIGxldCBtZXRob2QgPSBudWxsO1xuICAgICAgICAgICAgaWYgKFN0YXJSZXF1ZXN0SGFuZGxlci5pcyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBzdGFyUmVxdWVzdEhhbmRsZXIgPSB0eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoSXMuc3RyaW5nKHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgbWV0aG9kID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoaGFuZGxlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RIYW5kbGVycy5zZXQodHlwZSwgeyBoYW5kbGVyOiBoYW5kbGVyLCB0eXBlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSB0eXBlLm1ldGhvZDtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEhhbmRsZXJzLnNldCh0eXBlLm1ldGhvZCwgeyB0eXBlLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SGFuZGxlcnMuZGVsZXRlKG1ldGhvZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFyUmVxdWVzdEhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBoYXNQZW5kaW5nUmVzcG9uc2U6ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZVByb21pc2VzLnNpemUgPiAwO1xuICAgICAgICB9LFxuICAgICAgICB0cmFjZTogYXN5bmMgKF92YWx1ZSwgX3RyYWNlciwgc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBsZXQgX3NlbmROb3RpZmljYXRpb24gPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBfdHJhY2VGb3JtYXQgPSBUcmFjZUZvcm1hdC5UZXh0O1xuICAgICAgICAgICAgaWYgKHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKElzLmJvb2xlYW4oc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zKSkge1xuICAgICAgICAgICAgICAgICAgICBfc2VuZE5vdGlmaWNhdGlvbiA9IHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF9zZW5kTm90aWZpY2F0aW9uID0gc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zLnNlbmROb3RpZmljYXRpb24gfHwgZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIF90cmFjZUZvcm1hdCA9IHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucy50cmFjZUZvcm1hdCB8fCBUcmFjZUZvcm1hdC5UZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlID0gX3ZhbHVlO1xuICAgICAgICAgICAgdHJhY2VGb3JtYXQgPSBfdHJhY2VGb3JtYXQ7XG4gICAgICAgICAgICBpZiAodHJhY2UgPT09IFRyYWNlLk9mZikge1xuICAgICAgICAgICAgICAgIHRyYWNlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRyYWNlciA9IF90cmFjZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoX3NlbmROb3RpZmljYXRpb24gJiYgIWlzQ2xvc2VkKCkgJiYgIWlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGNvbm5lY3Rpb24uc2VuZE5vdGlmaWNhdGlvbihTZXRUcmFjZU5vdGlmaWNhdGlvbi50eXBlLCB7IHZhbHVlOiBUcmFjZS50b1N0cmluZyhfdmFsdWUpIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBvbkVycm9yOiBlcnJvckVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIG9uQ2xvc2U6IGNsb3NlRW1pdHRlci5ldmVudCxcbiAgICAgICAgb25VbmhhbmRsZWROb3RpZmljYXRpb246IHVuaGFuZGxlZE5vdGlmaWNhdGlvbkVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIG9uRGlzcG9zZTogZGlzcG9zZUVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIGVuZDogKCkgPT4ge1xuICAgICAgICAgICAgbWVzc2FnZVdyaXRlci5lbmQoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLkRpc3Bvc2VkO1xuICAgICAgICAgICAgZGlzcG9zZUVtaXR0ZXIuZmlyZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5QZW5kaW5nUmVzcG9uc2VSZWplY3RlZCwgJ1BlbmRpbmcgcmVzcG9uc2UgcmVqZWN0ZWQgc2luY2UgY29ubmVjdGlvbiBnb3QgZGlzcG9zZWQnKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvbWlzZSBvZiByZXNwb25zZVByb21pc2VzLnZhbHVlcygpKSB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBrbm93bkNhbmNlbGVkUmVxdWVzdHMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICBtZXNzYWdlUXVldWUgPSBuZXcgbGlua2VkTWFwXzEuTGlua2VkTWFwKCk7XG4gICAgICAgICAgICAvLyBUZXN0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgaWYgKElzLmZ1bmMobWVzc2FnZVdyaXRlci5kaXNwb3NlKSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKElzLmZ1bmMobWVzc2FnZVJlYWRlci5kaXNwb3NlKSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VSZWFkZXIuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBsaXN0ZW46ICgpID0+IHtcbiAgICAgICAgICAgIHRocm93SWZDbG9zZWRPckRpc3Bvc2VkKCk7XG4gICAgICAgICAgICB0aHJvd0lmTGlzdGVuaW5nKCk7XG4gICAgICAgICAgICBzdGF0ZSA9IENvbm5lY3Rpb25TdGF0ZS5MaXN0ZW5pbmc7XG4gICAgICAgICAgICBtZXNzYWdlUmVhZGVyLmxpc3RlbihjYWxsYmFjayk7XG4gICAgICAgIH0sXG4gICAgICAgIGluc3BlY3Q6ICgpID0+IHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS5jb25zb2xlLmxvZygnaW5zcGVjdCcpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25uZWN0aW9uLm9uTm90aWZpY2F0aW9uKExvZ1RyYWNlTm90aWZpY2F0aW9uLnR5cGUsIChwYXJhbXMpID0+IHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZlcmJvc2UgPSB0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdDtcbiAgICAgICAgdHJhY2VyLmxvZyhwYXJhbXMubWVzc2FnZSwgdmVyYm9zZSA/IHBhcmFtcy52ZXJib3NlIDogdW5kZWZpbmVkKTtcbiAgICB9KTtcbiAgICBjb25uZWN0aW9uLm9uTm90aWZpY2F0aW9uKFByb2dyZXNzTm90aWZpY2F0aW9uLnR5cGUsIChwYXJhbXMpID0+IHtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IHByb2dyZXNzSGFuZGxlcnMuZ2V0KHBhcmFtcy50b2tlbik7XG4gICAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICAgICBoYW5kbGVyKHBhcmFtcy52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1bmhhbmRsZWRQcm9ncmVzc0VtaXR0ZXIuZmlyZShwYXJhbXMpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbm5lY3Rpb247XG59XG5leHBvcnRzLmNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uID0gY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb247XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vdHlwaW5ncy90aGVuYWJsZS5kLnRzXCIgLz5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUHJvZ3Jlc3NUeXBlID0gZXhwb3J0cy5Qcm9ncmVzc1Rva2VuID0gZXhwb3J0cy5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiA9IGV4cG9ydHMuTnVsbExvZ2dlciA9IGV4cG9ydHMuQ29ubmVjdGlvbk9wdGlvbnMgPSBleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IGV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlQnVmZmVyID0gZXhwb3J0cy5Xcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyID0gZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLk1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLlJlYWRhYmxlU3RyZWFtTWVzc2FnZVJlYWRlciA9IGV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlUmVhZGVyID0gZXhwb3J0cy5NZXNzYWdlUmVhZGVyID0gZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblRva2VuID0gZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IGV4cG9ydHMuRW1pdHRlciA9IGV4cG9ydHMuRXZlbnQgPSBleHBvcnRzLkRpc3Bvc2FibGUgPSBleHBvcnRzLkxSVUNhY2hlID0gZXhwb3J0cy5Ub3VjaCA9IGV4cG9ydHMuTGlua2VkTWFwID0gZXhwb3J0cy5QYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlOSA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTggPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU3ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNiA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTUgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU0ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMyA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTIgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUxID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMCA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZSA9IGV4cG9ydHMuRXJyb3JDb2RlcyA9IGV4cG9ydHMuUmVzcG9uc2VFcnJvciA9IGV4cG9ydHMuUmVxdWVzdFR5cGU5ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTggPSBleHBvcnRzLlJlcXVlc3RUeXBlNyA9IGV4cG9ydHMuUmVxdWVzdFR5cGU2ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTUgPSBleHBvcnRzLlJlcXVlc3RUeXBlNCA9IGV4cG9ydHMuUmVxdWVzdFR5cGUzID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTIgPSBleHBvcnRzLlJlcXVlc3RUeXBlMSA9IGV4cG9ydHMuUmVxdWVzdFR5cGUwID0gZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IGV4cG9ydHMuTWVzc2FnZSA9IGV4cG9ydHMuUkFMID0gdm9pZCAwO1xuZXhwb3J0cy5NZXNzYWdlU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblN0cmF0ZWd5ID0gZXhwb3J0cy5DYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IGV4cG9ydHMuQ29ubmVjdGlvbkVycm9yID0gZXhwb3J0cy5Db25uZWN0aW9uRXJyb3JzID0gZXhwb3J0cy5Mb2dUcmFjZU5vdGlmaWNhdGlvbiA9IGV4cG9ydHMuU2V0VHJhY2VOb3RpZmljYXRpb24gPSBleHBvcnRzLlRyYWNlRm9ybWF0ID0gZXhwb3J0cy5UcmFjZVZhbHVlcyA9IGV4cG9ydHMuVHJhY2UgPSB2b2lkIDA7XG5jb25zdCBtZXNzYWdlc18xID0gcmVxdWlyZShcIi4vbWVzc2FnZXNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNZXNzYWdlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk1lc3NhZ2U7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlMFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTA7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTFcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGUxOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGUyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlMjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlM1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGU0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGU1XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlNTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlNlwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTY7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTdcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGU3OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGU4XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlODsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlOVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTk7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXNwb25zZUVycm9yXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3I7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJFcnJvckNvZGVzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLkVycm9yQ29kZXM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlMFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlMDsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGUxXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGUxOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZTJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlM1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlMzsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGU0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZTVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlNlwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlNjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGU3XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU3OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZThcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTg7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlOVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlOTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlBhcmFtZXRlclN0cnVjdHVyZXNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlczsgfSB9KTtcbmNvbnN0IGxpbmtlZE1hcF8xID0gcmVxdWlyZShcIi4vbGlua2VkTWFwXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTGlua2VkTWFwXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBsaW5rZWRNYXBfMS5MaW5rZWRNYXA7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJMUlVDYWNoZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbGlua2VkTWFwXzEuTFJVQ2FjaGU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJUb3VjaFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbGlua2VkTWFwXzEuVG91Y2g7IH0gfSk7XG5jb25zdCBkaXNwb3NhYmxlXzEgPSByZXF1aXJlKFwiLi9kaXNwb3NhYmxlXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiRGlzcG9zYWJsZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZGlzcG9zYWJsZV8xLkRpc3Bvc2FibGU7IH0gfSk7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCIuL2V2ZW50c1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkV2ZW50XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBldmVudHNfMS5FdmVudDsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkVtaXR0ZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGV2ZW50c18xLkVtaXR0ZXI7IH0gfSk7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblRva2VuU291cmNlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjYW5jZWxsYXRpb25fMS5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblRva2VuXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjYW5jZWxsYXRpb25fMS5DYW5jZWxsYXRpb25Ub2tlbjsgfSB9KTtcbmNvbnN0IHNoYXJlZEFycmF5Q2FuY2VsbGF0aW9uXzEgPSByZXF1aXJlKFwiLi9zaGFyZWRBcnJheUNhbmNlbGxhdGlvblwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHNoYXJlZEFycmF5Q2FuY2VsbGF0aW9uXzEuU2hhcmVkQXJyYXlTZW5kZXJTdHJhdGVneTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlNoYXJlZEFycmF5UmVjZWl2ZXJTdHJhdGVneVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gc2hhcmVkQXJyYXlDYW5jZWxsYXRpb25fMS5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3k7IH0gfSk7XG5jb25zdCBtZXNzYWdlUmVhZGVyXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlUmVhZGVyXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTWVzc2FnZVJlYWRlclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZVJlYWRlcl8xLk1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VSZWFkZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VSZWFkZXJfMS5BYnN0cmFjdE1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VSZWFkZXJfMS5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5jb25zdCBtZXNzYWdlV3JpdGVyXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlV3JpdGVyXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTWVzc2FnZVdyaXRlclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZVdyaXRlcl8xLk1lc3NhZ2VXcml0ZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VXcml0ZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VXcml0ZXJfMS5BYnN0cmFjdE1lc3NhZ2VXcml0ZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJXcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlV3JpdGVyXzEuV3JpdGVhYmxlU3RyZWFtTWVzc2FnZVdyaXRlcjsgfSB9KTtcbmNvbnN0IG1lc3NhZ2VCdWZmZXJfMSA9IHJlcXVpcmUoXCIuL21lc3NhZ2VCdWZmZXJcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VCdWZmZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VCdWZmZXJfMS5BYnN0cmFjdE1lc3NhZ2VCdWZmZXI7IH0gfSk7XG5jb25zdCBjb25uZWN0aW9uXzEgPSByZXF1aXJlKFwiLi9jb25uZWN0aW9uXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29ubmVjdGlvblN0cmF0ZWd5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ29ubmVjdGlvblN0cmF0ZWd5OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29ubmVjdGlvbk9wdGlvbnNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5Db25uZWN0aW9uT3B0aW9uczsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk51bGxMb2dnZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5OdWxsTG9nZ2VyOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb25cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlByb2dyZXNzVG9rZW5cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5Qcm9ncmVzc1Rva2VuOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUHJvZ3Jlc3NUeXBlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuUHJvZ3Jlc3NUeXBlOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiVHJhY2VcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5UcmFjZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlRyYWNlVmFsdWVzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuVHJhY2VWYWx1ZXM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJUcmFjZUZvcm1hdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29ubmVjdGlvbl8xLlRyYWNlRm9ybWF0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiU2V0VHJhY2VOb3RpZmljYXRpb25cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5TZXRUcmFjZU5vdGlmaWNhdGlvbjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkxvZ1RyYWNlTm90aWZpY2F0aW9uXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuTG9nVHJhY2VOb3RpZmljYXRpb247IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJDb25uZWN0aW9uRXJyb3JzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ29ubmVjdGlvbkVycm9yczsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNvbm5lY3Rpb25FcnJvclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29ubmVjdGlvbl8xLkNvbm5lY3Rpb25FcnJvcjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5DYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5DYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblN0cmF0ZWd5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ2FuY2VsbGF0aW9uU3RyYXRlZ3k7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNZXNzYWdlU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5NZXNzYWdlU3RyYXRlZ3k7IH0gfSk7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbmV4cG9ydHMuUkFMID0gcmFsXzEuZGVmYXVsdDtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGFwaV8xID0gcmVxdWlyZShcIi4uL2NvbW1vbi9hcGlcIik7XG5jbGFzcyBNZXNzYWdlQnVmZmVyIGV4dGVuZHMgYXBpXzEuQWJzdHJhY3RNZXNzYWdlQnVmZmVyIHtcbiAgICBjb25zdHJ1Y3RvcihlbmNvZGluZyA9ICd1dGYtOCcpIHtcbiAgICAgICAgc3VwZXIoZW5jb2RpbmcpO1xuICAgICAgICB0aGlzLmFzY2lpRGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcignYXNjaWknKTtcbiAgICB9XG4gICAgZW1wdHlCdWZmZXIoKSB7XG4gICAgICAgIHJldHVybiBNZXNzYWdlQnVmZmVyLmVtcHR5QnVmZmVyO1xuICAgIH1cbiAgICBmcm9tU3RyaW5nKHZhbHVlLCBfZW5jb2RpbmcpIHtcbiAgICAgICAgcmV0dXJuIChuZXcgVGV4dEVuY29kZXIoKSkuZW5jb2RlKHZhbHVlKTtcbiAgICB9XG4gICAgdG9TdHJpbmcodmFsdWUsIGVuY29kaW5nKSB7XG4gICAgICAgIGlmIChlbmNvZGluZyA9PT0gJ2FzY2lpJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXNjaWlEZWNvZGVyLmRlY29kZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gKG5ldyBUZXh0RGVjb2RlcihlbmNvZGluZykpLmRlY29kZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXNOYXRpdmUoYnVmZmVyLCBsZW5ndGgpIHtcbiAgICAgICAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlci5zbGljZSgwLCBsZW5ndGgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFsbG9jTmF0aXZlKGxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTtcbiAgICB9XG59XG5NZXNzYWdlQnVmZmVyLmVtcHR5QnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMCk7XG5jbGFzcyBSZWFkYWJsZVN0cmVhbVdyYXBwZXIge1xuICAgIGNvbnN0cnVjdG9yKHNvY2tldCkge1xuICAgICAgICB0aGlzLnNvY2tldCA9IHNvY2tldDtcbiAgICAgICAgdGhpcy5fb25EYXRhID0gbmV3IGFwaV8xLkVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5fbWVzc2FnZUxpc3RlbmVyID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBibG9iID0gZXZlbnQuZGF0YTtcbiAgICAgICAgICAgIGJsb2IuYXJyYXlCdWZmZXIoKS50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkRhdGEuZmlyZShuZXcgVWludDhBcnJheShidWZmZXIpKTtcbiAgICAgICAgICAgIH0sICgpID0+IHtcbiAgICAgICAgICAgICAgICAoMCwgYXBpXzEuUkFMKSgpLmNvbnNvbGUuZXJyb3IoYENvbnZlcnRpbmcgYmxvYiB0byBhcnJheSBidWZmZXIgZmFpbGVkLmApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLl9tZXNzYWdlTGlzdGVuZXIpO1xuICAgIH1cbiAgICBvbkNsb3NlKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2Nsb3NlJywgbGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gYXBpXzEuRGlzcG9zYWJsZS5jcmVhdGUoKCkgPT4gdGhpcy5zb2NrZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xvc2UnLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkVycm9yKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgbGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gYXBpXzEuRGlzcG9zYWJsZS5jcmVhdGUoKCkgPT4gdGhpcy5zb2NrZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkVuZChsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKCdlbmQnLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdlbmQnLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkRhdGEobGlzdGVuZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uRGF0YS5ldmVudChsaXN0ZW5lcik7XG4gICAgfVxufVxuY2xhc3MgV3JpdGFibGVTdHJlYW1XcmFwcGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihzb2NrZXQpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7XG4gICAgfVxuICAgIG9uQ2xvc2UobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignY2xvc2UnLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbG9zZScsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIG9uRXJyb3IobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIG9uRW5kKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2VuZCcsIGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIGFwaV8xLkRpc3Bvc2FibGUuY3JlYXRlKCgpID0+IHRoaXMuc29ja2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2VuZCcsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIHdyaXRlKGRhdGEsIGVuY29kaW5nKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkICYmIGVuY29kaW5nICE9PSAndXRmLTgnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbiBhIEJyb3dzZXIgZW52aXJvbm1lbnRzIG9ubHkgdXRmLTggdGV4dCBlbmNvZGluZyBpcyBzdXBwb3J0ZWQuIEJ1dCBnb3QgZW5jb2Rpbmc6ICR7ZW5jb2Rpbmd9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKTtcbiAgICB9XG59XG5jb25zdCBfdGV4dEVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbmNvbnN0IF9yaWwgPSBPYmplY3QuZnJlZXplKHtcbiAgICBtZXNzYWdlQnVmZmVyOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgY3JlYXRlOiAoZW5jb2RpbmcpID0+IG5ldyBNZXNzYWdlQnVmZmVyKGVuY29kaW5nKVxuICAgIH0pLFxuICAgIGFwcGxpY2F0aW9uSnNvbjogT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGVuY29kZXI6IE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgbmFtZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgZW5jb2RlOiAobXNnLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2hhcnNldCAhPT0gJ3V0Zi04Jykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluIGEgQnJvd3NlciBlbnZpcm9ubWVudHMgb25seSB1dGYtOCB0ZXh0IGVuY29kaW5nIGlzIHN1cHBvcnRlZC4gQnV0IGdvdCBlbmNvZGluZzogJHtvcHRpb25zLmNoYXJzZXR9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoX3RleHRFbmNvZGVyLmVuY29kZShKU09OLnN0cmluZ2lmeShtc2csIHVuZGVmaW5lZCwgMCkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIGRlY29kZXI6IE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgbmFtZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgZGVjb2RlOiAoYnVmZmVyLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCEoYnVmZmVyIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbiBhIEJyb3dzZXIgZW52aXJvbm1lbnRzIG9ubHkgVWludDhBcnJheXMgYXJlIHN1cHBvcnRlZC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShKU09OLnBhcnNlKG5ldyBUZXh0RGVjb2RlcihvcHRpb25zLmNoYXJzZXQpLmRlY29kZShidWZmZXIpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfSksXG4gICAgc3RyZWFtOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgYXNSZWFkYWJsZVN0cmVhbTogKHNvY2tldCkgPT4gbmV3IFJlYWRhYmxlU3RyZWFtV3JhcHBlcihzb2NrZXQpLFxuICAgICAgICBhc1dyaXRhYmxlU3RyZWFtOiAoc29ja2V0KSA9PiBuZXcgV3JpdGFibGVTdHJlYW1XcmFwcGVyKHNvY2tldClcbiAgICB9KSxcbiAgICBjb25zb2xlOiBjb25zb2xlLFxuICAgIHRpbWVyOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgc2V0VGltZW91dChjYWxsYmFjaywgbXMsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHNldFRpbWVvdXQoY2FsbGJhY2ssIG1zLCAuLi5hcmdzKTtcbiAgICAgICAgICAgIHJldHVybiB7IGRpc3Bvc2U6ICgpID0+IGNsZWFyVGltZW91dChoYW5kbGUpIH07XG4gICAgICAgIH0sXG4gICAgICAgIHNldEltbWVkaWF0ZShjYWxsYmFjaywgLi4uYXJncykge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gc2V0VGltZW91dChjYWxsYmFjaywgMCwgLi4uYXJncyk7XG4gICAgICAgICAgICByZXR1cm4geyBkaXNwb3NlOiAoKSA9PiBjbGVhclRpbWVvdXQoaGFuZGxlKSB9O1xuICAgICAgICB9LFxuICAgICAgICBzZXRJbnRlcnZhbChjYWxsYmFjaywgbXMsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHNldEludGVydmFsKGNhbGxiYWNrLCBtcywgLi4uYXJncyk7XG4gICAgICAgICAgICByZXR1cm4geyBkaXNwb3NlOiAoKSA9PiBjbGVhckludGVydmFsKGhhbmRsZSkgfTtcbiAgICAgICAgfSxcbiAgICB9KVxufSk7XG5mdW5jdGlvbiBSSUwoKSB7XG4gICAgcmV0dXJuIF9yaWw7XG59XG4oZnVuY3Rpb24gKFJJTCkge1xuICAgIGZ1bmN0aW9uIGluc3RhbGwoKSB7XG4gICAgICAgIGFwaV8xLlJBTC5pbnN0YWxsKF9yaWwpO1xuICAgIH1cbiAgICBSSUwuaW5zdGFsbCA9IGluc3RhbGw7XG59KShSSUwgfHwgKFJJTCA9IHt9KSk7XG5leHBvcnRzLmRlZmF1bHQgPSBSSUw7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24gPSBleHBvcnRzLkJyb3dzZXJNZXNzYWdlV3JpdGVyID0gZXhwb3J0cy5Ccm93c2VyTWVzc2FnZVJlYWRlciA9IHZvaWQgMDtcbmNvbnN0IHJpbF8xID0gcmVxdWlyZShcIi4vcmlsXCIpO1xuLy8gSW5zdGFsbCB0aGUgYnJvd3NlciBydW50aW1lIGFic3RyYWN0LlxucmlsXzEuZGVmYXVsdC5pbnN0YWxsKCk7XG5jb25zdCBhcGlfMSA9IHJlcXVpcmUoXCIuLi9jb21tb24vYXBpXCIpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuLi9jb21tb24vYXBpXCIpLCBleHBvcnRzKTtcbmNsYXNzIEJyb3dzZXJNZXNzYWdlUmVhZGVyIGV4dGVuZHMgYXBpXzEuQWJzdHJhY3RNZXNzYWdlUmVhZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihwb3J0KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX29uRGF0YSA9IG5ldyBhcGlfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuX21lc3NhZ2VMaXN0ZW5lciA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fb25EYXRhLmZpcmUoZXZlbnQuZGF0YSk7XG4gICAgICAgIH07XG4gICAgICAgIHBvcnQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoZXZlbnQpID0+IHRoaXMuZmlyZUVycm9yKGV2ZW50KSk7XG4gICAgICAgIHBvcnQub25tZXNzYWdlID0gdGhpcy5fbWVzc2FnZUxpc3RlbmVyO1xuICAgIH1cbiAgICBsaXN0ZW4oY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uRGF0YS5ldmVudChjYWxsYmFjayk7XG4gICAgfVxufVxuZXhwb3J0cy5Ccm93c2VyTWVzc2FnZVJlYWRlciA9IEJyb3dzZXJNZXNzYWdlUmVhZGVyO1xuY2xhc3MgQnJvd3Nlck1lc3NhZ2VXcml0ZXIgZXh0ZW5kcyBhcGlfMS5BYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKHBvcnQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50ID0gMDtcbiAgICAgICAgcG9ydC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIChldmVudCkgPT4gdGhpcy5maXJlRXJyb3IoZXZlbnQpKTtcbiAgICB9XG4gICAgd3JpdGUobXNnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnBvcnQucG9zdE1lc3NhZ2UobXNnKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IsIG1zZyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZUVycm9yKGVycm9yLCBtc2cpIHtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50Kys7XG4gICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yLCBtc2csIHRoaXMuZXJyb3JDb3VudCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICB9XG59XG5leHBvcnRzLkJyb3dzZXJNZXNzYWdlV3JpdGVyID0gQnJvd3Nlck1lc3NhZ2VXcml0ZXI7XG5mdW5jdGlvbiBjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbihyZWFkZXIsIHdyaXRlciwgbG9nZ2VyLCBvcHRpb25zKSB7XG4gICAgaWYgKGxvZ2dlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxvZ2dlciA9IGFwaV8xLk51bGxMb2dnZXI7XG4gICAgfVxuICAgIGlmIChhcGlfMS5Db25uZWN0aW9uU3RyYXRlZ3kuaXMob3B0aW9ucykpIHtcbiAgICAgICAgb3B0aW9ucyA9IHsgY29ubmVjdGlvblN0cmF0ZWd5OiBvcHRpb25zIH07XG4gICAgfVxuICAgIHJldHVybiAoMCwgYXBpXzEuY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24pKHJlYWRlciwgd3JpdGVyLCBsb2dnZXIsIG9wdGlvbnMpO1xufVxuZXhwb3J0cy5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiA9IGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uO1xuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL2Jyb3dzZXIvbWFpbicpOyIsICIvKlxuICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMjYgRWNsaXBzZSBEaXJpZ2libGUgY29udHJpYnV0b3JzXG4gKlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlXG4gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2Mi4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG4gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MjAuaHRtbFxuICpcbiAqIFNQRFgtRmlsZUNvcHlyaWdodFRleHQ6IEVjbGlwc2UgRGlyaWdpYmxlIGNvbnRyaWJ1dG9ycyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbi8qKlxuICogSmF2YSBMU1AgY2xpZW50IGJ1bmRsZS5cbiAqXG4gKiBVc2VzIHZzY29kZS13cy1qc29ucnBjIGZvciB0eXBlZCBKU09OLVJQQyBvdmVyIFdlYlNvY2tldCBhbmQgcmVnaXN0ZXJzIE1vbmFjb1xuICogcHJvdmlkZXJzIHRoYXQgZGVsZWdhdGUgdG8gSkRULkxTLiBFeHBvc2VkIGFzIGdsb2JhbCBKYXZhTHNwQ2xpZW50TGliIHNvIHRoYXRcbiAqIGVkaXRvci5qcyBjYW4gY2FsbCBKYXZhTHNwQ2xpZW50TGliLmNvbm5lY3QocmVzb3VyY2VQYXRoKS5cbiAqXG4gKiBPbmUgSkRULkxTIHByb2Nlc3MgY292ZXJzIHRoZSBlbnRpcmUgd29ya3NwYWNlLCBzbyBhIHNpbmdsZSBXZWJTb2NrZXQgY29ubmVjdGlvblxuICogaXMgc2hhcmVkIGFjcm9zcyBhbGwgSmF2YSBmaWxlcyBvcGVuIGluIHRoZSBzYW1lIGJyb3dzZXIgcGFnZS4gVGhlIGNvbm5lY3Rpb24gaXNcbiAqIGVzdGFibGlzaGVkIG9uIHRoZSBmaXJzdCBjb25uZWN0KCkgY2FsbCBhbmQgcmV1c2VkIGZvciBhbGwgc3Vic2VxdWVudCBjYWxscy5cbiAqXG4gKiBlZGl0b3IuanMgc2V0cyB3aW5kb3cubW9uYWNvIGJlZm9yZSBjYWxsaW5nIGNvbm5lY3QoKSwgc28gdGhlIG1vbmFjby1zaGltJ3MgbGF6eVxuICogUHJveGllcyByZXNvbHZlIGNvcnJlY3RseSBhdCBjYWxsIHRpbWUuXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24sIE1lc3NhZ2VDb25uZWN0aW9uIH0gZnJvbSAndnNjb2RlLWpzb25ycGMvYnJvd3Nlcic7XG5pbXBvcnQgeyB0b1NvY2tldCwgV2ViU29ja2V0TWVzc2FnZVJlYWRlciwgV2ViU29ja2V0TWVzc2FnZVdyaXRlciB9IGZyb20gJ3ZzY29kZS13cy1qc29ucnBjJztcbmltcG9ydCAqIGFzIG1vbmFjbyBmcm9tICdtb25hY28tZWRpdG9yJztcbmltcG9ydCB7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLFxuICAgIERpYWdub3N0aWNTZXZlcml0eSxcbiAgICBJbnNlcnRUZXh0Rm9ybWF0LFxuICAgIE1hcmt1cENvbnRlbnQsXG4gICAgTWFya3VwS2luZCxcbiAgICB0eXBlIENvZGVBY3Rpb24sXG4gICAgdHlwZSBDb21tYW5kLFxuICAgIHR5cGUgQ29tcGxldGlvbkl0ZW0sXG4gICAgdHlwZSBDb21wbGV0aW9uTGlzdCxcbiAgICB0eXBlIERpYWdub3N0aWMsXG4gICAgdHlwZSBIb3ZlcixcbiAgICB0eXBlIExvY2F0aW9uLFxuICAgIHR5cGUgUGFyYW1ldGVySW5mb3JtYXRpb24sXG4gICAgdHlwZSBTaWduYXR1cmVIZWxwLFxuICAgIHR5cGUgU2lnbmF0dXJlSW5mb3JtYXRpb24sXG4gICAgdHlwZSBUZXh0RWRpdCxcbiAgICB0eXBlIFdvcmtzcGFjZUVkaXQsXG59IGZyb20gJ3ZzY29kZS1sYW5ndWFnZXNlcnZlci10eXBlcyc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNpbmdsZXRvbiBzdGF0ZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogU2hhcmVkIGNvbm5lY3Rpb24gXHUyMDE0IG9uZSBwZXIgYnJvd3NlciBwYWdlLCBjb3ZlcmluZyBhbGwgcHJvamVjdHMgaW4gdGhlIHdvcmtzcGFjZS4gKi9cbmxldCBfY29ubjogTWVzc2FnZUNvbm5lY3Rpb24gfCBudWxsID0gbnVsbDtcblxuLyoqXG4gKiBWaXJ0dWFsIHdvcmtzcGFjZSByb290IFVSSSwgZS5nLiB7QGNvZGUgZmlsZTovLy93b3Jrc3BhY2Uvd29ya3NwYWNlL30uXG4gKiBTZXQgb25jZSBvbiBmaXJzdCBjb25uZWN0KCk7IHVzZWQgdG8gc2NvcGUgTW9uYWNvIHByb3ZpZGVycyB0byB3b3Jrc3BhY2UgZmlsZXMuXG4gKi9cbmxldCBfd29ya3NwYWNlUm9vdCA9ICcnO1xuXG4vKiogVVJJcyBmb3Igd2hpY2ggdGV4dERvY3VtZW50L2RpZE9wZW4gaGFzIGFscmVhZHkgYmVlbiBzZW50LiAqL1xuY29uc3QgX29wZW5GaWxlczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cbmxldCBfcHJvdmlkZXJzUmVnaXN0ZXJlZCA9IGZhbHNlO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBQdWJsaWMgQVBJXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBDYWxsZWQgYnkgZWRpdG9yLmpzIHdoZW4gYSBKYXZhIGZpbGUgaXMgb3BlbmVkLiBTYWZlIHRvIGNhbGwgbXVsdGlwbGUgdGltZXMuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY29ubmVjdChyZXNvdXJjZVBhdGg6IHN0cmluZyk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IHBhcnRzID0gcmVzb3VyY2VQYXRoLnJlcGxhY2UoL15cXC8vLCAnJykuc3BsaXQoJy8nKTtcbiAgICBjb25zdCB3b3Jrc3BhY2UgPSBwYXJ0c1swXTtcbiAgICBjb25zdCBwcm9qZWN0ICAgPSBwYXJ0c1sxXTtcbiAgICBjb25zdCBmaWxlVXJpID0gYGZpbGU6Ly8vd29ya3NwYWNlLyR7d29ya3NwYWNlfS8ke3Byb2plY3R9LyR7cGFydHMuc2xpY2UoMikuam9pbignLycpfWA7XG5cbiAgICBpZiAoX2Nvbm4pIHtcbiAgICAgICAgLy8gQ29ubmVjdGlvbiBhbHJlYWR5IGVzdGFibGlzaGVkIFx1MjAxNCBqdXN0IG9wZW4gdGhlIG5ldyBmaWxlLlxuICAgICAgICBvcGVuRmlsZShmaWxlVXJpKTtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIF93b3Jrc3BhY2VSb290ID0gYGZpbGU6Ly8vd29ya3NwYWNlLyR7d29ya3NwYWNlfS9gO1xuXG4gICAgY29uc3QgcHJvdG8gPSBsb2NhdGlvbi5wcm90b2NvbCA9PT0gJ2h0dHBzOicgPyAnd3NzJyA6ICd3cyc7XG4gICAgY29uc3Qgd3NVcmwgPSBgJHtwcm90b306Ly8ke2xvY2F0aW9uLmhvc3R9L3dlYnNvY2tldHMvaWRlL2phdmEtbHNwYFxuICAgICAgICAgICAgICAgICsgYD93b3Jrc3BhY2U9JHtlbmNvZGVVUklDb21wb25lbnQod29ya3NwYWNlKX1gO1xuXG4gICAgY29uc3Qgd3MgPSBuZXcgV2ViU29ja2V0KHdzVXJsKTtcbiAgICBhd2FpdCBuZXcgUHJvbWlzZTx2b2lkPigocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgIHdzLm9ub3BlbiAgPSAoKSA9PiByZXNvbHZlKCk7XG4gICAgICAgIHdzLm9uZXJyb3IgPSAoKSA9PiByZWplY3QobmV3IEVycm9yKGBbamF2YS1sc3BdIFdlYlNvY2tldCBjb25uZWN0IGZhaWxlZDogJHt3c1VybH1gKSk7XG4gICAgfSk7XG5cbiAgICBjb25zdCBzb2NrZXQgPSB0b1NvY2tldCh3cyk7XG4gICAgY29uc3QgcmVhZGVyID0gbmV3IFdlYlNvY2tldE1lc3NhZ2VSZWFkZXIoc29ja2V0KTtcbiAgICBjb25zdCB3cml0ZXIgPSBuZXcgV2ViU29ja2V0TWVzc2FnZVdyaXRlcihzb2NrZXQpO1xuICAgIF9jb25uID0gY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24ocmVhZGVyLCB3cml0ZXIpO1xuXG4gICAgLy8gRGlhZ25vc3RpY3Mgbm90aWZpY2F0aW9uIFx1MjE5MiBNb25hY28gbWFya2VycyAoYXBwbGllcyB0byBhbnkgd29ya3NwYWNlIGZpbGUpXG4gICAgX2Nvbm4ub25Ob3RpZmljYXRpb24oJ3RleHREb2N1bWVudC9wdWJsaXNoRGlhZ25vc3RpY3MnLCAocGFyYW1zOiB7IHVyaTogc3RyaW5nOyBkaWFnbm9zdGljczogRGlhZ25vc3RpY1tdIH0pID0+IHtcbiAgICAgICAgY29uc3QgbW9kZWwgPSBtb25hY28uZWRpdG9yLmdldE1vZGVscygpLmZpbmQobSA9PiBtLnVyaS50b1N0cmluZygpID09PSBwYXJhbXMudXJpKTtcbiAgICAgICAgaWYgKCFtb2RlbCkgcmV0dXJuO1xuICAgICAgICBtb25hY28uZWRpdG9yLnNldE1vZGVsTWFya2Vycyhtb2RlbCwgJ2phdmEtbHNwJywgcGFyYW1zLmRpYWdub3N0aWNzLm1hcChkID0+ICh7XG4gICAgICAgICAgICBzZXZlcml0eTogICAgICAgIGxzcFNldmVyaXR5KGQuc2V2ZXJpdHkpLFxuICAgICAgICAgICAgbWVzc2FnZTogICAgICAgICBkLm1lc3NhZ2UsXG4gICAgICAgICAgICBzb3VyY2U6ICAgICAgICAgIGQuc291cmNlID8/ICdqYXZhJyxcbiAgICAgICAgICAgIHN0YXJ0TGluZU51bWJlcjogZC5yYW5nZS5zdGFydC5saW5lICsgMSxcbiAgICAgICAgICAgIHN0YXJ0Q29sdW1uOiAgICAgZC5yYW5nZS5zdGFydC5jaGFyYWN0ZXIgKyAxLFxuICAgICAgICAgICAgZW5kTGluZU51bWJlcjogICBkLnJhbmdlLmVuZC5saW5lICsgMSxcbiAgICAgICAgICAgIGVuZENvbHVtbjogICAgICAgZC5yYW5nZS5lbmQuY2hhcmFjdGVyICsgMSxcbiAgICAgICAgfSkpKTtcbiAgICB9KTtcblxuICAgIC8vIFNlcnZlciAtPiBjbGllbnQgcmVxdWVzdHMgdGhhdCBkcml2ZSByZWZhY3RvciAvIGdlbmVyYXRlIHJlc3VsdHMgYW5kIGR5bmFtaWMgcmVnaXN0cmF0aW9uLlxuICAgIF9jb25uLm9uUmVxdWVzdCgnd29ya3NwYWNlL2FwcGx5RWRpdCcsIChwYXJhbXM6IHsgZWRpdDogV29ya3NwYWNlRWRpdCB9KSA9PiB7XG4gICAgICAgIGFwcGx5V29ya3NwYWNlRWRpdChwYXJhbXMuZWRpdCk7XG4gICAgICAgIHJldHVybiB7IGFwcGxpZWQ6IHRydWUgfTtcbiAgICB9KTtcbiAgICBfY29ubi5vblJlcXVlc3QoJ3dvcmtzcGFjZS9jb25maWd1cmF0aW9uJywgKHBhcmFtczogeyBpdGVtczogQXJyYXk8eyBzZWN0aW9uPzogc3RyaW5nIH0+IH0pID0+XG4gICAgICAgIChwYXJhbXMuaXRlbXMgPz8gW10pLm1hcCgoKSA9PiBqZHRsc1NldHRpbmdzKCkuamF2YSkpO1xuICAgIF9jb25uLm9uUmVxdWVzdCgnY2xpZW50L3JlZ2lzdGVyQ2FwYWJpbGl0eScsICgpID0+IG51bGwpO1xuICAgIF9jb25uLm9uUmVxdWVzdCgnY2xpZW50L3VucmVnaXN0ZXJDYXBhYmlsaXR5JywgKCkgPT4gbnVsbCk7XG4gICAgX2Nvbm4ub25SZXF1ZXN0KCd3aW5kb3cvc2hvd01lc3NhZ2VSZXF1ZXN0JywgKCkgPT4gbnVsbCk7XG4gICAgX2Nvbm4ub25SZXF1ZXN0KCd3aW5kb3cvd29ya0RvbmVQcm9ncmVzcy9jcmVhdGUnLCAoKSA9PiBudWxsKTtcbiAgICBfY29ubi5vbk5vdGlmaWNhdGlvbignd2luZG93L2xvZ01lc3NhZ2UnLCAocDogeyBtZXNzYWdlOiBzdHJpbmcgfSkgPT4gY29uc29sZS5kZWJ1ZygnW2phdmEtbHNwXScsIHA/Lm1lc3NhZ2UpKTtcbiAgICBfY29ubi5vbk5vdGlmaWNhdGlvbignd2luZG93L3Nob3dNZXNzYWdlJywgKHA6IHsgbWVzc2FnZTogc3RyaW5nIH0pID0+IGNvbnNvbGUuaW5mbygnW2phdmEtbHNwXScsIHA/Lm1lc3NhZ2UpKTtcbiAgICAvLyBKRFQuTFMgbGFuZ3VhZ2Utc3RhdHVzIC8gcHJvZ3Jlc3Mgbm90aWZpY2F0aW9ucyBcdTIwMTQgYWNrbm93bGVkZ2VkIHNpbGVudGx5LlxuICAgIF9jb25uLm9uTm90aWZpY2F0aW9uKCdsYW5ndWFnZS9zdGF0dXMnLCAoKSA9PiB7IC8qIGluZGV4aW5nL3JlYWR5IHN0YXR1cywgaWdub3JlZCAqLyB9KTtcbiAgICBfY29ubi5vbk5vdGlmaWNhdGlvbignbGFuZ3VhZ2UvcHJvZ3Jlc3NSZXBvcnQnLCAoKSA9PiB7IC8qIGJ1aWxkIHByb2dyZXNzLCBpZ25vcmVkICovIH0pO1xuXG4gICAgX2Nvbm4ubGlzdGVuKCk7XG5cbiAgICBjb25zdCByb290VXJpID0gX3dvcmtzcGFjZVJvb3Q7XG4gICAgYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ2luaXRpYWxpemUnLCB7XG4gICAgICAgIHByb2Nlc3NJZDogbnVsbCxcbiAgICAgICAgcm9vdFVyaSxcbiAgICAgICAgaW5pdGlhbGl6YXRpb25PcHRpb25zOiB7XG4gICAgICAgICAgICBzZXR0aW5nczogamR0bHNTZXR0aW5ncygpLFxuICAgICAgICAgICAgZXh0ZW5kZWRDbGllbnRDYXBhYmlsaXRpZXM6IHtcbiAgICAgICAgICAgICAgICBwcm9ncmVzc1JlcG9ydFByb3ZpZGVyOiAgICAgICAgICAgIGZhbHNlLFxuICAgICAgICAgICAgICAgIGNsYXNzRmlsZUNvbnRlbnRzU3VwcG9ydDogICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICByZXNvbHZlQWRkaXRpb25hbFRleHRFZGl0c1N1cHBvcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgYWR2YW5jZWRHZW5lcmF0ZUFjY2Vzc29yc1N1cHBvcnQ6ICB0cnVlLFxuICAgICAgICAgICAgICAgIGdlbmVyYXRlVG9TdHJpbmdQcm9tcHRTdXBwb3J0OiAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICBnZW5lcmF0ZUNvbnN0cnVjdG9yc1Byb21wdFN1cHBvcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgZ2VuZXJhdGVEZWxlZ2F0ZU1ldGhvZHNQcm9tcHRTdXBwb3J0OiB0cnVlLFxuICAgICAgICAgICAgICAgIGhhc2hDb2RlRXF1YWxzUHJvbXB0U3VwcG9ydDogICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICBhZHZhbmNlZE9yZ2FuaXplSW1wb3J0c1N1cHBvcnQ6ICAgIHRydWUsXG4gICAgICAgICAgICAgICAgaW5mZXJTZWxlY3Rpb25TdXBwb3J0OiAgICAgICAgICAgICBbJ2V4dHJhY3RNZXRob2QnLCAnZXh0cmFjdFZhcmlhYmxlJywgJ2V4dHJhY3RGaWVsZCddLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgd29ya3NwYWNlRm9sZGVyczogW3sgdXJpOiByb290VXJpLCBuYW1lOiB3b3Jrc3BhY2UgfV0sXG4gICAgICAgIGNhcGFiaWxpdGllczoge1xuICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7XG4gICAgICAgICAgICAgICAgc3luY2hyb25pemF0aW9uOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUsIHdpbGxTYXZlOiBmYWxzZSwgZGlkU2F2ZTogdHJ1ZSwgd2lsbFNhdmVXYWl0VW50aWw6IGZhbHNlIH0sXG4gICAgICAgICAgICAgICAgY29tcGxldGlvbjoge1xuICAgICAgICAgICAgICAgICAgICBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uSXRlbToge1xuICAgICAgICAgICAgICAgICAgICAgICAgc25pcHBldFN1cHBvcnQ6ICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRhdGlvbkZvcm1hdDogICBbJ21hcmtkb3duJywgJ3BsYWludGV4dCddLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRlZFN1cHBvcnQ6ICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWl0Q2hhcmFjdGVyc1N1cHBvcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlU3VwcG9ydDogICAgICAgIHsgcHJvcGVydGllczogWydkb2N1bWVudGF0aW9uJywgJ2RldGFpbCcsICdhZGRpdGlvbmFsVGV4dEVkaXRzJ10gfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dFN1cHBvcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBob3ZlcjogICAgICAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLCBjb250ZW50Rm9ybWF0OiBbJ21hcmtkb3duJywgJ3BsYWludGV4dCddIH0sXG4gICAgICAgICAgICAgICAgc2lnbmF0dXJlSGVscDogIHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSwgc2lnbmF0dXJlSW5mb3JtYXRpb246IHsgZG9jdW1lbnRhdGlvbkZvcm1hdDogWydtYXJrZG93bicsICdwbGFpbnRleHQnXSwgcGFyYW1ldGVySW5mb3JtYXRpb246IHsgbGFiZWxPZmZzZXRTdXBwb3J0OiB0cnVlIH0gfSB9LFxuICAgICAgICAgICAgICAgIGRlZmluaXRpb246ICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VzOiAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgZG9jdW1lbnRTeW1ib2w6IHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIGZvcm1hdHRpbmc6ICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICByYW5nZUZvcm1hdHRpbmc6IHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIHJlbmFtZTogICAgICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUsIHByZXBhcmVTdXBwb3J0OiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgY29kZUFjdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjb2RlQWN0aW9uTGl0ZXJhbFN1cHBvcnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVBY3Rpb25LaW5kOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTZXQ6IFsncXVpY2tmaXgnLCAncmVmYWN0b3InLCAncmVmYWN0b3IuZXh0cmFjdCcsICdyZWZhY3Rvci5pbmxpbmUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVmYWN0b3IucmV3cml0ZScsICdzb3VyY2UnLCAnc291cmNlLm9yZ2FuaXplSW1wb3J0cyddLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgaXNQcmVmZXJyZWRTdXBwb3J0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBkYXRhU3VwcG9ydDogICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmVTdXBwb3J0OiAgICAgeyBwcm9wZXJ0aWVzOiBbJ2VkaXQnXSB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcHVibGlzaERpYWdub3N0aWNzOiB7IHJlbGF0ZWRJbmZvcm1hdGlvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdvcmtzcGFjZToge1xuICAgICAgICAgICAgICAgIGFwcGx5RWRpdDogICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbjogICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICBleGVjdXRlQ29tbWFuZDogICAgICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICBkaWRDaGFuZ2VDb25maWd1cmF0aW9uOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICB3b3Jrc3BhY2VFZGl0OiAgICAgICAgICB7IGRvY3VtZW50Q2hhbmdlczogdHJ1ZSwgcmVzb3VyY2VPcGVyYXRpb25zOiBbJ2NyZWF0ZScsICdyZW5hbWUnLCAnZGVsZXRlJ10gfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBfY29ubi5zZW5kTm90aWZpY2F0aW9uKCdpbml0aWFsaXplZCcsIHt9KTtcbiAgICBfY29ubi5zZW5kTm90aWZpY2F0aW9uKCd3b3Jrc3BhY2UvZGlkQ2hhbmdlQ29uZmlndXJhdGlvbicsIHsgc2V0dGluZ3M6IGpkdGxzU2V0dGluZ3MoKSB9KTtcblxuICAgIG9wZW5GaWxlKGZpbGVVcmkpO1xuXG4gICAgaWYgKCFfcHJvdmlkZXJzUmVnaXN0ZXJlZCkge1xuICAgICAgICBfcHJvdmlkZXJzUmVnaXN0ZXJlZCA9IHRydWU7XG4gICAgICAgIHJlZ2lzdGVyUHJvdmlkZXJzKCk7XG4gICAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBGaWxlIGxpZmVjeWNsZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFNlbmRzIHRleHREb2N1bWVudC9kaWRPcGVuIGZvciB0aGUgZ2l2ZW4gVVJJIChpZiBub3QgYWxyZWFkeSBzZW50KSBhbmQgcmVnaXN0ZXJzIGEgZGVib3VuY2VkXG4gKiB0ZXh0RG9jdW1lbnQvZGlkQ2hhbmdlIGxpc3RlbmVyIG9uIHRoZSBjb3JyZXNwb25kaW5nIE1vbmFjbyBtb2RlbC5cbiAqL1xuZnVuY3Rpb24gb3BlbkZpbGUoZmlsZVVyaTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKF9vcGVuRmlsZXMuaGFzKGZpbGVVcmkpIHx8ICFfY29ubikgcmV0dXJuO1xuICAgIF9vcGVuRmlsZXMuYWRkKGZpbGVVcmkpO1xuXG4gICAgY29uc3QgbW9kZWwgPSBtb25hY28uZWRpdG9yLmdldE1vZGVscygpLmZpbmQobSA9PiBtLnVyaS50b1N0cmluZygpID09PSBmaWxlVXJpKTtcbiAgICBfY29ubi5zZW5kTm90aWZpY2F0aW9uKCd0ZXh0RG9jdW1lbnQvZGlkT3BlbicsIHtcbiAgICAgICAgdGV4dERvY3VtZW50OiB7XG4gICAgICAgICAgICB1cmk6ICAgICAgICBmaWxlVXJpLFxuICAgICAgICAgICAgbGFuZ3VhZ2VJZDogJ2phdmEnLFxuICAgICAgICAgICAgdmVyc2lvbjogICAgMSxcbiAgICAgICAgICAgIHRleHQ6ICAgICAgIG1vZGVsPy5nZXRWYWx1ZSgpID8/ICcnLFxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgaWYgKG1vZGVsKSB7XG4gICAgICAgIGxldCB0aW1lcjogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0VGltZW91dD47XG4gICAgICAgIG1vZGVsLm9uRGlkQ2hhbmdlQ29udGVudCgoKSA9PiB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZXIpO1xuICAgICAgICAgICAgdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgICAgICBfY29ubj8uc2VuZE5vdGlmaWNhdGlvbigndGV4dERvY3VtZW50L2RpZENoYW5nZScsIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiAgIHsgdXJpOiBmaWxlVXJpLCB2ZXJzaW9uOiBtb2RlbC5nZXRWZXJzaW9uSWQoKSB9LFxuICAgICAgICAgICAgICAgICAgICBjb250ZW50Q2hhbmdlczogW3sgdGV4dDogbW9kZWwuZ2V0VmFsdWUoKSB9XSxcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sIDQwMCk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gV29ya3NwYWNlIGZpbGUgcHJlZGljYXRlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogUmV0dXJucyB7QGNvZGUgdHJ1ZX0gd2hlbiB0aGUgZ2l2ZW4gbW9kZWwgVVJJIGJlbG9uZ3MgdG8gdGhlIGN1cnJlbnRseSBjb25uZWN0ZWQgd29ya3NwYWNlLiBVc2VkXG4gKiBieSBNb25hY28gcHJvdmlkZXJzIHRvIHNraXAgbm9uLUphdmEtd29ya3NwYWNlIG1vZGVscyB3aXRob3V0IGFuIGV4YWN0LVVSSSBjb21wYXJpc29uLlxuICovXG5mdW5jdGlvbiBpc1dvcmtzcGFjZUZpbGUodXJpOiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICByZXR1cm4gX3dvcmtzcGFjZVJvb3QgIT09ICcnICYmIHVyaS5zdGFydHNXaXRoKF93b3Jrc3BhY2VSb290KTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gTW9uYWNvIHByb3ZpZGVyIHJlZ2lzdHJhdGlvblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiByZWdpc3RlclByb3ZpZGVycygpOiB2b2lkIHtcblxuICAgIG1vbmFjby5lZGl0b3IucmVnaXN0ZXJDb21tYW5kKEFQUExZX0FDVElPTl9DT01NQU5ELCAoX2FjY2Vzc29yOiB1bmtub3duLCBhY3Rpb246IENvZGVBY3Rpb24gfCBDb21tYW5kKSA9PiB7XG4gICAgICAgIGFwcGx5Q29kZUFjdGlvbihhY3Rpb24pO1xuICAgIH0pO1xuXG4gICAgLy8gQ3Jvc3MtZmlsZSBuYXZpZ2F0aW9uOiB0aGlzIHNpbmdsZS1maWxlIGVkaXRvciBoYXMgbm8gbW9kZWwgZm9yIG90aGVyIHdvcmtzcGFjZSBmaWxlcywgc28gR28gdG9cbiAgICAvLyBEZWZpbml0aW9uIC8gRmluZCBSZWZlcmVuY2VzIHRvIGFub3RoZXIgZmlsZSB3b3VsZCBzaWxlbnRseSBkbyBub3RoaW5nLiBIYW5kIHRob3NlIG9mZiB0byB0aGUgSURFXG4gICAgLy8gdG8gb3BlbiB0aGUgdGFyZ2V0IGZpbGUgKGFuZCByZXZlYWwgdGhlIGxpbmUpLiBTYW1lLWZpbGUgdGFyZ2V0cyBmYWxsIHRocm91Z2ggdG8gTW9uYWNvLlxuICAgIG1vbmFjby5lZGl0b3IucmVnaXN0ZXJFZGl0b3JPcGVuZXIoe1xuICAgICAgICBvcGVuQ29kZUVkaXRvcjogKHNvdXJjZSwgcmVzb3VyY2UsIHNlbGVjdGlvbk9yUG9zaXRpb24pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHVyaSA9IHJlc291cmNlLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBpZiAoIWlzV29ya3NwYWNlRmlsZSh1cmkpIHx8ICF1cmkuc3RhcnRzV2l0aChWSVJUVUFMX0ZJTEVfUFJFRklYKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudE1vZGVsID0gc291cmNlLmdldE1vZGVsKCk7XG4gICAgICAgICAgICBpZiAoY3VycmVudE1vZGVsICYmIGN1cnJlbnRNb2RlbC51cmkudG9TdHJpbmcoKSA9PT0gdXJpKSByZXR1cm4gZmFsc2U7IC8vIHNhbWUgZmlsZSBcdTIwMTQgbGV0IE1vbmFjbyBqdW1wXG4gICAgICAgICAgICBjb25zdCBvcGVuZXIgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLmphdmFMc3BPcGVuRmlsZTtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3BlbmVyICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBwb3MgPSBzZWxlY3Rpb25PclBvc2l0aW9uIGFzIHsgc3RhcnRMaW5lTnVtYmVyPzogbnVtYmVyOyBsaW5lTnVtYmVyPzogbnVtYmVyOyBzdGFydENvbHVtbj86IG51bWJlcjsgY29sdW1uPzogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBsaW5lID0gcG9zID8gKHBvcy5zdGFydExpbmVOdW1iZXIgPz8gcG9zLmxpbmVOdW1iZXIpIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgY29sdW1uID0gcG9zID8gKHBvcy5zdGFydENvbHVtbiA/PyBwb3MuY29sdW1uKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIG9wZW5lcih1cmkuc3Vic3RyaW5nKFZJUlRVQUxfRklMRV9QUkVGSVgubGVuZ3RoKSwgbGluZSwgY29sdW1uKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckNvbXBsZXRpb25JdGVtUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHRyaWdnZXJDaGFyYWN0ZXJzOiBbJy4nLCAnQCcsICc8J10sXG4gICAgICAgIHByb3ZpZGVDb21wbGV0aW9uSXRlbXM6IGFzeW5jIChtb2RlbCwgcG9zaXRpb24sIGNvbnRleHQpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgZmlsZVVyaSA9IG1vZGVsLnVyaS50b1N0cmluZygpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBDb21wbGV0aW9uTGlzdCB8IENvbXBsZXRpb25JdGVtW10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9jb21wbGV0aW9uJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IGZpbGVVcmkgfSxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogICAgIHsgbGluZTogcG9zaXRpb24ubGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogcG9zaXRpb24uY29sdW1uIC0gMSB9LFxuICAgICAgICAgICAgICAgIC8vIE1vbmFjbyB0cmlnZ2VyIGtpbmRzIGFyZSAwLWJhc2VkIChJbnZva2UvVHJpZ2dlckNoYXJhY3Rlci9Gb3JJbmNvbXBsZXRlKTsgTFNQIGlzIDEtYmFzZWQuXG4gICAgICAgICAgICAgICAgY29udGV4dDogICAgICB7IHRyaWdnZXJLaW5kOiAoY29udGV4dC50cmlnZ2VyS2luZCA/PyAwKSArIDEsIHRyaWdnZXJDaGFyYWN0ZXI6IGNvbnRleHQudHJpZ2dlckNoYXJhY3RlciB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBpdGVtcyA9IEFycmF5LmlzQXJyYXkocmVzdWx0KSA/IHJlc3VsdCA6IChyZXN1bHQ/Lml0ZW1zID8/IFtdKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3VnZ2VzdGlvbnM6IGl0ZW1zLm1hcChpdGVtID0+IGxzcENvbXBsZXRpb25Ub01vbmFjbyhpdGVtLCBtb2RlbCwgcG9zaXRpb24pKSxcbiAgICAgICAgICAgICAgICAvLyBKRFQuTFMgcmV0dXJucyBhIHRydW5jYXRlZCBsaXN0IG9uIHRoZSBmaXJzdCBrZXlzdHJva2VzOyBwcm9wYWdhdGluZyBcImluY29tcGxldGVcIiBtYWtlc1xuICAgICAgICAgICAgICAgIC8vIE1vbmFjbyByZS1xdWVyeSBhcyB0aGUgdXNlciB0eXBlcyBpbnN0ZWFkIG9mIGNhY2hpbmcgdGhlIGZpcnN0IChvZnRlbiBlbXB0eSkgcmVzdWx0LlxuICAgICAgICAgICAgICAgIGluY29tcGxldGU6ICBBcnJheS5pc0FycmF5KHJlc3VsdCkgPyBmYWxzZSA6ICEhcmVzdWx0Py5pc0luY29tcGxldGUsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvLyBSZXNvbHZlIGRvY3VtZW50YXRpb24gYW5kLCBjcnVjaWFsbHksIHRoZSBhdXRvLWltcG9ydCBhZGRpdGlvbmFsVGV4dEVkaXRzIHdoaWNoIEpEVC5MUyBvbmx5XG4gICAgICAgIC8vIGF0dGFjaGVzIG9uIHJlc29sdmUgXHUyMDE0IHNlbGVjdGluZyBhIHR5cGUgdGhlbiBpbnNlcnRzIGl0cyBpbXBvcnQgc3RhdGVtZW50LlxuICAgICAgICByZXNvbHZlQ29tcGxldGlvbkl0ZW06IGFzeW5jIChpdGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsc3AgPSAoaXRlbSBhcyBNb25hY29Db21wbGV0aW9uSXRlbSkuX2xzcDtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWxzcCkgcmV0dXJuIGl0ZW07XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkOiBDb21wbGV0aW9uSXRlbSA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCdjb21wbGV0aW9uSXRlbS9yZXNvbHZlJywgbHNwKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQuZG9jdW1lbnRhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBpdGVtLmRvY3VtZW50YXRpb24gPSB7IHZhbHVlOiBtYXJrdXBUb1N0cmluZyhyZXNvbHZlZC5kb2N1bWVudGF0aW9uKSwgaXNUcnVzdGVkOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQuZGV0YWlsKSBpdGVtLmRldGFpbCA9IHJlc29sdmVkLmRldGFpbDtcbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQuYWRkaXRpb25hbFRleHRFZGl0cz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uYWRkaXRpb25hbFRleHRFZGl0cyA9IHJlc29sdmVkLmFkZGl0aW9uYWxUZXh0RWRpdHMubWFwKHRleHRFZGl0VG9Nb25hY28pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKCdbamF2YS1sc3BdIGNvbXBsZXRpb24gcmVzb2x2ZSBmYWlsZWQ6JywgKGUgYXMgRXJyb3IpPy5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckhvdmVyUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVIb3ZlcjogYXN5bmMgKG1vZGVsLCBwb3NpdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBmaWxlVXJpID0gbW9kZWwudXJpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IEhvdmVyIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvaG92ZXInLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogZmlsZVVyaSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0Py5jb250ZW50cykgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50cyA9IEFycmF5LmlzQXJyYXkocmVzdWx0LmNvbnRlbnRzKSA/IHJlc3VsdC5jb250ZW50cyA6IFtyZXN1bHQuY29udGVudHNdO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjb250ZW50czogY29udGVudHMubWFwKGMgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHR5cGVvZiBjID09PSAnc3RyaW5nJyA/IGMgOiAoYyBhcyBNYXJrdXBDb250ZW50KS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgaXNUcnVzdGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgcmFuZ2U6IHJlc3VsdC5yYW5nZSA/IGxzcFJhbmdlVG9Nb25hY28ocmVzdWx0LnJhbmdlKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyU2lnbmF0dXJlSGVscFByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBzaWduYXR1cmVIZWxwVHJpZ2dlckNoYXJhY3RlcnM6IFsnKCcsICcsJ10sXG4gICAgICAgIHByb3ZpZGVTaWduYXR1cmVIZWxwOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVVcmkgPSBtb2RlbC51cmkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogU2lnbmF0dXJlSGVscCB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L3NpZ25hdHVyZUhlbHAnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogZmlsZVVyaSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlczogcmVzdWx0LnNpZ25hdHVyZXMubWFwKChzaWc6IFNpZ25hdHVyZUluZm9ybWF0aW9uKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICAgICAgICAgc2lnLmxhYmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRhdGlvbjogc2lnLmRvY3VtZW50YXRpb24gPyBtYXJrdXBUb1N0cmluZyhzaWcuZG9jdW1lbnRhdGlvbikgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiAgICAoc2lnLnBhcmFtZXRlcnMgPz8gW10pLm1hcCgocDogUGFyYW1ldGVySW5mb3JtYXRpb24pID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICAgICAgICAgcC5sYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudGF0aW9uOiBwLmRvY3VtZW50YXRpb24gPyBtYXJrdXBUb1N0cmluZyhwLmRvY3VtZW50YXRpb24pIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZVNpZ25hdHVyZTogcmVzdWx0LmFjdGl2ZVNpZ25hdHVyZSA/PyAwLFxuICAgICAgICAgICAgICAgICAgICBhY3RpdmVQYXJhbWV0ZXI6IHJlc3VsdC5hY3RpdmVQYXJhbWV0ZXIgPz8gMCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGRpc3Bvc2U6ICgpID0+IHt9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJEZWZpbml0aW9uUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVEZWZpbml0aW9uOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVVcmkgPSBtb2RlbC51cmkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogTG9jYXRpb24gfCBMb2NhdGlvbltdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvZGVmaW5pdGlvbicsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBmaWxlVXJpIH0sXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgbG9jYXRpb25zID0gQXJyYXkuaXNBcnJheShyZXN1bHQpID8gcmVzdWx0IDogW3Jlc3VsdF07XG4gICAgICAgICAgICByZXR1cm4gbG9jYXRpb25zLm1hcChsb2MgPT4gKHtcbiAgICAgICAgICAgICAgICB1cmk6ICAgbW9uYWNvLlVyaS5wYXJzZShsb2MudXJpKSxcbiAgICAgICAgICAgICAgICByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhsb2MucmFuZ2UpLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlclJlZmVyZW5jZVByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlUmVmZXJlbmNlczogYXN5bmMgKG1vZGVsLCBwb3NpdGlvbiwgY29udGV4dCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IExvY2F0aW9uW10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9yZWZlcmVuY2VzJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgICAgICBjb250ZXh0OiAgICAgIHsgaW5jbHVkZURlY2xhcmF0aW9uOiBjb250ZXh0LmluY2x1ZGVEZWNsYXJhdGlvbiB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0Lm1hcChsb2MgPT4gKHsgdXJpOiBtb25hY28uVXJpLnBhcnNlKGxvYy51cmkpLCByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhsb2MucmFuZ2UpIH0pKTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJSZW5hbWVQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZVJlbmFtZUVkaXRzOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uLCBuZXdOYW1lKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4geyBlZGl0czogW10gfTtcbiAgICAgICAgICAgIGNvbnN0IGVkaXQ6IFdvcmtzcGFjZUVkaXQgfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9yZW5hbWUnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogICAgIHsgbGluZTogcG9zaXRpb24ubGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogcG9zaXRpb24uY29sdW1uIC0gMSB9LFxuICAgICAgICAgICAgICAgIG5ld05hbWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghZWRpdCkgcmV0dXJuIHsgZWRpdHM6IFtdIH07XG4gICAgICAgICAgICAvLyBBIEpEVC5MUyByZW5hbWUgY2FuIHNwYW4gbWFueSBmaWxlcyBhbmQgZXZlbiByZW5hbWUgdGhlIHR5cGUncyBvd24gLmphdmEgZmlsZS4gTW9uYWNvJ3NcbiAgICAgICAgICAgIC8vIHNpbmdsZS1maWxlIGVkaXRvciB3b3VsZCBkcm9wIGV2ZXJ5dGhpbmcgYnV0IHRoZSBjdXJyZW50IG1vZGVsLCBzbyBhcHBseSB0aGUgd2hvbGUgZWRpdFxuICAgICAgICAgICAgLy8gdGhyb3VnaCB0aGUgd29ya3NwYWNlIG91cnNlbHZlcyB3aGVuIHRoZSBJREUgcGVyc2lzdGVuY2UgaG9vayBpcyBhdmFpbGFibGUuXG4gICAgICAgICAgICBpZiAodHlwZW9mIChnbG9iYWxUaGlzIGFzIGFueSkuamF2YUxzcFBlcnNpc3RSZW5hbWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBhcHBseVJlbmFtZUFjcm9zc1dvcmtzcGFjZShtb2RlbCwgZWRpdCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGVkaXRzOiBbXSB9O1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignW2phdmEtbHNwXSBjcm9zcy1maWxlIHJlbmFtZSBmYWlsZWQsIGFwcGx5aW5nIHRvIHRoZSBjdXJyZW50IGZpbGUgb25seTonLCBlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdvcmtzcGFjZUVkaXRUb01vbmFjbyhlZGl0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gd29ya3NwYWNlRWRpdFRvTW9uYWNvKGVkaXQpO1xuICAgICAgICB9LFxuICAgICAgICByZXNvbHZlUmVuYW1lTG9jYXRpb246IGFzeW5jIChtb2RlbCwgcG9zaXRpb24pID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQ6IHsgcmFuZ2U6IExzcFJhbmdlOyBwbGFjZWhvbGRlcj86IHN0cmluZyB9IHwgTHNwUmFuZ2UgfCBudWxsID1cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9wcmVwYXJlUmVuYW1lJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCByYW5nZSA9ICdyYW5nZScgaW4gcmVzdWx0ID8gcmVzdWx0LnJhbmdlIDogcmVzdWx0O1xuICAgICAgICAgICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gJ3BsYWNlaG9sZGVyJyBpbiByZXN1bHQgJiYgcmVzdWx0LnBsYWNlaG9sZGVyXG4gICAgICAgICAgICAgICAgICAgID8gcmVzdWx0LnBsYWNlaG9sZGVyXG4gICAgICAgICAgICAgICAgICAgIDogbW9kZWwuZ2V0V29yZEF0UG9zaXRpb24ocG9zaXRpb24pPy53b3JkID8/ICcnO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHJhbmdlOiBsc3BSYW5nZVRvTW9uYWNvKHJhbmdlKSwgdGV4dDogcGxhY2Vob2xkZXIgfTtcbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgIGNvbnN0IHdvcmQgPSBtb2RlbC5nZXRXb3JkQXRQb3NpdGlvbihwb3NpdGlvbik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdvcmQgPyB7XG4gICAgICAgICAgICAgICAgICAgIHJhbmdlOiB7IHN0YXJ0TGluZU51bWJlcjogcG9zaXRpb24ubGluZU51bWJlciwgc3RhcnRDb2x1bW46IHdvcmQuc3RhcnRDb2x1bW4sIGVuZExpbmVOdW1iZXI6IHBvc2l0aW9uLmxpbmVOdW1iZXIsIGVuZENvbHVtbjogd29yZC5lbmRDb2x1bW4gfSxcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogd29yZC53b3JkLFxuICAgICAgICAgICAgICAgIH0gOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gUmVnaXN0ZXJpbmcgdGhpcyBwcm92aWRlciBhbHNvIGVuYWJsZXMgZWRpdG9yLmpzJ3MgZXhpc3RpbmcgZm9ybWF0LW9uLXNhdmUgcGF0aCBmb3IgSmF2YTogdGhlXG4gICAgLy8gc2hhcmVkIFNhdmUgYWN0aW9uIHJ1bnMgZWRpdG9yLmFjdGlvbi5mb3JtYXREb2N1bWVudCB3aGVuIGF1dG8tZm9ybWF0dGluZyBpcyBvbiAodGhlIHNhbWVcbiAgICAvLyBtZWNoYW5pc20gYW5kIGdsb2JhbCB0b2dnbGUgdXNlZCBmb3IgVHlwZVNjcmlwdCkuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckRvY3VtZW50Rm9ybWF0dGluZ0VkaXRQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZURvY3VtZW50Rm9ybWF0dGluZ0VkaXRzOiBhc3luYyAobW9kZWwpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgZWRpdHM6IFRleHRFZGl0W10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9mb3JtYXR0aW5nJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICAgICAgb3B0aW9uczogICAgICB7IHRhYlNpemU6IG1vZGVsLmdldE9wdGlvbnMoKS50YWJTaXplLCBpbnNlcnRTcGFjZXM6IG1vZGVsLmdldE9wdGlvbnMoKS5pbnNlcnRTcGFjZXMgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGVkaXRzID8gZWRpdHMubWFwKHRleHRFZGl0VG9Nb25hY28pIDogbnVsbDtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJDb2RlQWN0aW9uUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVDb2RlQWN0aW9uczogYXN5bmMgKG1vZGVsLCByYW5nZSwgY29udGV4dCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZW1wdHkgPSB7IGFjdGlvbnM6IFtdLCBkaXNwb3NlKCkgeyAvKiBub3RoaW5nIHRvIGRpc3Bvc2UgKi8gfSB9O1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIGVtcHR5O1xuICAgICAgICAgICAgY29uc3QgZGlhZ25vc3RpY3MgPSAoY29udGV4dC5tYXJrZXJzID8/IFtdKS5tYXAobWFya2VyVG9Mc3BEaWFnbm9zdGljKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogQXJyYXk8Q29kZUFjdGlvbiB8IENvbW1hbmQ+IHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvY29kZUFjdGlvbicsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgIHJhbmdlOiAgICAgICAgbW9uYWNvUmFuZ2VUb0xzcChyYW5nZSksXG4gICAgICAgICAgICAgICAgY29udGV4dDogICAgICB7IGRpYWdub3N0aWNzLCBvbmx5OiBjb250ZXh0Lm9ubHkgPyBbY29udGV4dC5vbmx5XSA6IHVuZGVmaW5lZCB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdD8ubGVuZ3RoKSByZXR1cm4gZW1wdHk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGFjdGlvbnM6IHJlc3VsdC5tYXAobHNwQ29kZUFjdGlvblRvTW9uYWNvKSxcbiAgICAgICAgICAgICAgICBkaXNwb3NlKCkgeyAvKiBub3RoaW5nIHRvIGRpc3Bvc2UgKi8gfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgfSwge1xuICAgICAgICBwcm92aWRlZENvZGVBY3Rpb25LaW5kczogWydxdWlja2ZpeCcsICdyZWZhY3RvcicsICdyZWZhY3Rvci5leHRyYWN0JywgJ3JlZmFjdG9yLmlubGluZScsXG4gICAgICAgICAgICAncmVmYWN0b3IucmV3cml0ZScsICdzb3VyY2UnLCAnc291cmNlLm9yZ2FuaXplSW1wb3J0cyddLFxuICAgIH0pO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBIZWxwZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIGxzcFNldmVyaXR5KHNldmVyaXR5OiBEaWFnbm9zdGljU2V2ZXJpdHkgfCB1bmRlZmluZWQpOiBtb25hY28uTWFya2VyU2V2ZXJpdHkge1xuICAgIHN3aXRjaCAoc2V2ZXJpdHkpIHtcbiAgICAgICAgY2FzZSBEaWFnbm9zdGljU2V2ZXJpdHkuRXJyb3I6ICAgICAgIHJldHVybiBtb25hY28uTWFya2VyU2V2ZXJpdHkuRXJyb3I7XG4gICAgICAgIGNhc2UgRGlhZ25vc3RpY1NldmVyaXR5Lldhcm5pbmc6ICAgICByZXR1cm4gbW9uYWNvLk1hcmtlclNldmVyaXR5Lldhcm5pbmc7XG4gICAgICAgIGNhc2UgRGlhZ25vc3RpY1NldmVyaXR5LkluZm9ybWF0aW9uOiByZXR1cm4gbW9uYWNvLk1hcmtlclNldmVyaXR5LkluZm87XG4gICAgICAgIGNhc2UgRGlhZ25vc3RpY1NldmVyaXR5LkhpbnQ6ICAgICAgICByZXR1cm4gbW9uYWNvLk1hcmtlclNldmVyaXR5LkhpbnQ7XG4gICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9uYWNvLk1hcmtlclNldmVyaXR5LkVycm9yO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gbHNwUmFuZ2VUb01vbmFjbyhyOiB7IHN0YXJ0OiB7IGxpbmU6IG51bWJlcjsgY2hhcmFjdGVyOiBudW1iZXIgfTsgZW5kOiB7IGxpbmU6IG51bWJlcjsgY2hhcmFjdGVyOiBudW1iZXIgfSB9KTogbW9uYWNvLklSYW5nZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnRMaW5lTnVtYmVyOiByLnN0YXJ0LmxpbmUgKyAxLFxuICAgICAgICBzdGFydENvbHVtbjogICAgIHIuc3RhcnQuY2hhcmFjdGVyICsgMSxcbiAgICAgICAgZW5kTGluZU51bWJlcjogICByLmVuZC5saW5lICsgMSxcbiAgICAgICAgZW5kQ29sdW1uOiAgICAgICByLmVuZC5jaGFyYWN0ZXIgKyAxLFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIG1hcmt1cFRvU3RyaW5nKGM6IHN0cmluZyB8IE1hcmt1cENvbnRlbnQpOiBzdHJpbmcge1xuICAgIHJldHVybiB0eXBlb2YgYyA9PT0gJ3N0cmluZycgPyBjIDogYy52YWx1ZTtcbn1cblxuZnVuY3Rpb24gbHNwQ29tcGxldGlvbktpbmQoa2luZDogQ29tcGxldGlvbkl0ZW1LaW5kIHwgdW5kZWZpbmVkKTogbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbUtpbmQge1xuICAgIGNvbnN0IEsgPSBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtS2luZDtcbiAgICBzd2l0Y2ggKGtpbmQpIHtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuVGV4dDogICAgICAgICAgcmV0dXJuIEsuVGV4dDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuTWV0aG9kOiAgICAgICAgcmV0dXJuIEsuTWV0aG9kO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5GdW5jdGlvbjogICAgICByZXR1cm4gSy5GdW5jdGlvbjtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuQ29uc3RydWN0b3I6ICAgcmV0dXJuIEsuQ29uc3RydWN0b3I7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLkZpZWxkOiAgICAgICAgIHJldHVybiBLLkZpZWxkO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5WYXJpYWJsZTogICAgICByZXR1cm4gSy5WYXJpYWJsZTtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuQ2xhc3M6ICAgICAgICAgcmV0dXJuIEsuQ2xhc3M7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLkludGVyZmFjZTogICAgIHJldHVybiBLLkludGVyZmFjZTtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuTW9kdWxlOiAgICAgICAgcmV0dXJuIEsuTW9kdWxlO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5Qcm9wZXJ0eTogICAgICByZXR1cm4gSy5Qcm9wZXJ0eTtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuS2V5d29yZDogICAgICAgcmV0dXJuIEsuS2V5d29yZDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuU25pcHBldDogICAgICAgcmV0dXJuIEsuU25pcHBldDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuQ29uc3RhbnQ6ICAgICAgcmV0dXJuIEsuQ29uc3RhbnQ7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLlN0cnVjdDogICAgICAgIHJldHVybiBLLlN0cnVjdDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuVHlwZVBhcmFtZXRlcjogcmV0dXJuIEsuVHlwZVBhcmFtZXRlcjtcbiAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEsuVGV4dDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGxzcENvbXBsZXRpb25Ub01vbmFjbyhcbiAgICBpdGVtOiBDb21wbGV0aW9uSXRlbSxcbiAgICBtb2RlbDogbW9uYWNvLmVkaXRvci5JVGV4dE1vZGVsLFxuICAgIHBvc2l0aW9uOiBtb25hY28uUG9zaXRpb24sXG4pOiBNb25hY29Db21wbGV0aW9uSXRlbSB7XG4gICAgY29uc3Qgd29yZCA9IG1vZGVsLmdldFdvcmRVbnRpbFBvc2l0aW9uKHBvc2l0aW9uKTtcbiAgICBsZXQgcmFuZ2U6IG1vbmFjby5JUmFuZ2UgPSB7XG4gICAgICAgIHN0YXJ0TGluZU51bWJlcjogcG9zaXRpb24ubGluZU51bWJlcixcbiAgICAgICAgc3RhcnRDb2x1bW46ICAgICB3b3JkLnN0YXJ0Q29sdW1uLFxuICAgICAgICBlbmRMaW5lTnVtYmVyOiAgIHBvc2l0aW9uLmxpbmVOdW1iZXIsXG4gICAgICAgIGVuZENvbHVtbjogICAgICAgd29yZC5lbmRDb2x1bW4sXG4gICAgfTtcbiAgICBsZXQgaW5zZXJ0VGV4dCA9IGl0ZW0uaW5zZXJ0VGV4dCA/PyBpdGVtLmxhYmVsO1xuICAgIGNvbnN0IHRleHRFZGl0ID0gaXRlbS50ZXh0RWRpdCBhcyB7IHJhbmdlPzogTHNwUmFuZ2U7IHJlcGxhY2U/OiBMc3BSYW5nZTsgaW5zZXJ0PzogTHNwUmFuZ2U7IG5ld1RleHQ/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcbiAgICBpZiAodGV4dEVkaXQpIHtcbiAgICAgICAgY29uc3QgciA9IHRleHRFZGl0LnJhbmdlID8/IHRleHRFZGl0LnJlcGxhY2UgPz8gdGV4dEVkaXQuaW5zZXJ0O1xuICAgICAgICBpZiAocikgcmFuZ2UgPSBsc3BSYW5nZVRvTW9uYWNvKHIpO1xuICAgICAgICBpZiAodHlwZW9mIHRleHRFZGl0Lm5ld1RleHQgPT09ICdzdHJpbmcnKSBpbnNlcnRUZXh0ID0gdGV4dEVkaXQubmV3VGV4dDtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0OiBNb25hY29Db21wbGV0aW9uSXRlbSA9IHtcbiAgICAgICAgbGFiZWw6ICAgICAgICAgICBpdGVtLmxhYmVsLFxuICAgICAgICBraW5kOiAgICAgICAgICAgIGxzcENvbXBsZXRpb25LaW5kKGl0ZW0ua2luZCksXG4gICAgICAgIGRldGFpbDogICAgICAgICAgaXRlbS5kZXRhaWwsXG4gICAgICAgIGRvY3VtZW50YXRpb246ICAgaXRlbS5kb2N1bWVudGF0aW9uID8geyB2YWx1ZTogbWFya3VwVG9TdHJpbmcoaXRlbS5kb2N1bWVudGF0aW9uKSwgaXNUcnVzdGVkOiBmYWxzZSB9IDogdW5kZWZpbmVkLFxuICAgICAgICBpbnNlcnRUZXh0LFxuICAgICAgICBpbnNlcnRUZXh0UnVsZXM6IGl0ZW0uaW5zZXJ0VGV4dEZvcm1hdCA9PT0gSW5zZXJ0VGV4dEZvcm1hdC5TbmlwcGV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbUluc2VydFRleHRSdWxlLkluc2VydEFzU25pcHBldFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgcmFuZ2UsXG4gICAgICAgIHNvcnRUZXh0OiAgICAgICAgICAgIHNka1ByaW9yaXRpc2VkU29ydFRleHQoaXRlbSksXG4gICAgICAgIGZpbHRlclRleHQ6ICAgICAgICAgIGl0ZW0uZmlsdGVyVGV4dCxcbiAgICAgICAgcHJlc2VsZWN0OiAgICAgICAgICAgaXRlbS5wcmVzZWxlY3QsXG4gICAgICAgIGNvbW1pdENoYXJhY3RlcnM6ICAgIGl0ZW0uY29tbWl0Q2hhcmFjdGVycyxcbiAgICAgICAgYWRkaXRpb25hbFRleHRFZGl0czogaXRlbS5hZGRpdGlvbmFsVGV4dEVkaXRzPy5tYXAodGV4dEVkaXRUb01vbmFjbyksXG4gICAgfTtcbiAgICByZXN1bHQuX2xzcCA9IGl0ZW07XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBSYW5rcyBEaXJpZ2libGUgU0RLIHN1Z2dlc3Rpb25zICh7QGNvZGUgb3JnLmVjbGlwc2UuZGlyaWdpYmxlLnNkay4qfSkgYWJvdmUgZXZlcnl0aGluZyBlbHNlIGJ5XG4gKiBwcmVmaXhpbmcgdGhlIHNlcnZlciBzb3J0VGV4dCB3aXRoIGEgcHJpb3JpdHkgYnVja2V0LCBwcmVzZXJ2aW5nIHRoZSBzZXJ2ZXIgb3JkZXIgd2l0aGluIGVhY2ggYnVja2V0LlxuICovXG5mdW5jdGlvbiBzZGtQcmlvcml0aXNlZFNvcnRUZXh0KGl0ZW06IENvbXBsZXRpb25JdGVtKTogc3RyaW5nIHtcbiAgICBjb25zdCBiYXNlID0gaXRlbS5zb3J0VGV4dCA/PyAodHlwZW9mIGl0ZW0ubGFiZWwgPT09ICdzdHJpbmcnID8gaXRlbS5sYWJlbCA6ICcnKTtcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IChpdGVtLmxhYmVsRGV0YWlscyAmJiB0eXBlb2YgaXRlbS5sYWJlbERldGFpbHMuZGVzY3JpcHRpb24gPT09ICdzdHJpbmcnKVxuICAgICAgICA/IGl0ZW0ubGFiZWxEZXRhaWxzLmRlc2NyaXB0aW9uIDogJyc7XG4gICAgY29uc3QgaGF5c3RhY2sgPSBgJHtpdGVtLmRldGFpbCA/PyAnJ30gJHtkZXNjcmlwdGlvbn1gO1xuICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcygnb3JnLmVjbGlwc2UuZGlyaWdpYmxlLnNkaycpID8gYDBfJHtiYXNlfWAgOiBgMV8ke2Jhc2V9YDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ29kZSBhY3Rpb25zLCBjb21tYW5kcywgcmVmYWN0b3IvZ2VuZXJhdGUsIHdvcmtzcGFjZSBlZGl0c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogTW9uYWNvIGNvbW1hbmQgaWQgdXNlZCB0byBhcHBseSBhIGRlZmVycmVkIExTUCBjb2RlIGFjdGlvbiB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgaXQuICovXG5jb25zdCBBUFBMWV9BQ1RJT05fQ09NTUFORCA9ICdkaXJpZ2libGUuamF2YS5hcHBseUNvZGVBY3Rpb24nO1xuXG4vKiogVmlydHVhbCBVUkkgcHJlZml4IG9mIGVkaXRvciBtb2RlbHM7IHN0cmlwcGluZyBpdCB5aWVsZHMgdGhlIElERSB3b3Jrc3BhY2UgcGF0aCAoL3dzL3Byb2ovLi4uKS4gKi9cbmNvbnN0IFZJUlRVQUxfRklMRV9QUkVGSVggPSAnZmlsZTovLy93b3Jrc3BhY2UnO1xuXG50eXBlIExzcFJhbmdlID0geyBzdGFydDogeyBsaW5lOiBudW1iZXI7IGNoYXJhY3RlcjogbnVtYmVyIH07IGVuZDogeyBsaW5lOiBudW1iZXI7IGNoYXJhY3RlcjogbnVtYmVyIH0gfTtcblxuLyoqIE1vbmFjbyBjb21wbGV0aW9uIGl0ZW0gY2FycnlpbmcgdGhlIG9yaWdpbmF0aW5nIExTUCBpdGVtIHNvIHJlc29sdmUgY2FuIGZldGNoIGl0cyBpbXBvcnQgZWRpdHMuICovXG50eXBlIE1vbmFjb0NvbXBsZXRpb25JdGVtID0gbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbSAmIHsgX2xzcD86IENvbXBsZXRpb25JdGVtIH07XG5cbmZ1bmN0aW9uIHRleHRFZGl0VG9Nb25hY28oZWRpdDogVGV4dEVkaXQpOiBtb25hY28ubGFuZ3VhZ2VzLlRleHRFZGl0IHtcbiAgICByZXR1cm4geyByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhlZGl0LnJhbmdlKSwgdGV4dDogZWRpdC5uZXdUZXh0IH07XG59XG5cbmZ1bmN0aW9uIG1vbmFjb1JhbmdlVG9Mc3AocjogbW9uYWNvLklSYW5nZSk6IExzcFJhbmdlIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBzdGFydDogeyBsaW5lOiByLnN0YXJ0TGluZU51bWJlciAtIDEsIGNoYXJhY3Rlcjogci5zdGFydENvbHVtbiAtIDEgfSxcbiAgICAgICAgZW5kOiAgIHsgbGluZTogci5lbmRMaW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiByLmVuZENvbHVtbiAtIDEgfSxcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBtb25hY29TZXZlcml0eVRvTHNwKHNldmVyaXR5OiBtb25hY28uTWFya2VyU2V2ZXJpdHkpOiBEaWFnbm9zdGljU2V2ZXJpdHkge1xuICAgIHN3aXRjaCAoc2V2ZXJpdHkpIHtcbiAgICAgICAgY2FzZSBtb25hY28uTWFya2VyU2V2ZXJpdHkuRXJyb3I6ICAgcmV0dXJuIERpYWdub3N0aWNTZXZlcml0eS5FcnJvcjtcbiAgICAgICAgY2FzZSBtb25hY28uTWFya2VyU2V2ZXJpdHkuV2FybmluZzogcmV0dXJuIERpYWdub3N0aWNTZXZlcml0eS5XYXJuaW5nO1xuICAgICAgICBjYXNlIG1vbmFjby5NYXJrZXJTZXZlcml0eS5JbmZvOiAgICByZXR1cm4gRGlhZ25vc3RpY1NldmVyaXR5LkluZm9ybWF0aW9uO1xuICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRGlhZ25vc3RpY1NldmVyaXR5LkhpbnQ7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBtYXJrZXJUb0xzcERpYWdub3N0aWMobTogbW9uYWNvLmVkaXRvci5JTWFya2VyRGF0YSk6IERpYWdub3N0aWMge1xuICAgIHJldHVybiB7XG4gICAgICAgIHJhbmdlOiAgICB7IHN0YXJ0OiB7IGxpbmU6IG0uc3RhcnRMaW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBtLnN0YXJ0Q29sdW1uIC0gMSB9LFxuICAgICAgICAgICAgICAgICAgICBlbmQ6ICAgeyBsaW5lOiBtLmVuZExpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IG0uZW5kQ29sdW1uIC0gMSB9IH0sXG4gICAgICAgIG1lc3NhZ2U6ICBtLm1lc3NhZ2UsXG4gICAgICAgIHNldmVyaXR5OiBtb25hY29TZXZlcml0eVRvTHNwKG0uc2V2ZXJpdHkpLFxuICAgICAgICBzb3VyY2U6ICAgbS5zb3VyY2UsXG4gICAgfSBhcyBEaWFnbm9zdGljO1xufVxuXG5mdW5jdGlvbiBsc3BDb2RlQWN0aW9uVG9Nb25hY28oYWN0aW9uOiBDb2RlQWN0aW9uIHwgQ29tbWFuZCk6IG1vbmFjby5sYW5ndWFnZXMuQ29kZUFjdGlvbiB7XG4gICAgY29uc3QgaXNDb21tYW5kID0gdHlwZW9mIChhY3Rpb24gYXMgQ29tbWFuZCkuY29tbWFuZCA9PT0gJ3N0cmluZyc7XG4gICAgY29uc3QgdGl0bGUgPSBhY3Rpb24udGl0bGVcbiAgICAgICAgPz8gKGlzQ29tbWFuZCA/IChhY3Rpb24gYXMgQ29tbWFuZCkuY29tbWFuZCA6IChhY3Rpb24gYXMgQ29kZUFjdGlvbikuY29tbWFuZD8udGl0bGUpXG4gICAgICAgID8/ICdBY3Rpb24nO1xuICAgIGNvbnN0IGtpbmQgPSBpc0NvbW1hbmQgPyAncXVpY2tmaXgnIDogKChhY3Rpb24gYXMgQ29kZUFjdGlvbikua2luZCA/PyAncXVpY2tmaXgnKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB0aXRsZSxcbiAgICAgICAga2luZCxcbiAgICAgICAgZGlhZ25vc3RpY3M6IFtdLFxuICAgICAgICBpc1ByZWZlcnJlZDogKGFjdGlvbiBhcyBDb2RlQWN0aW9uKS5pc1ByZWZlcnJlZCxcbiAgICAgICAgLy8gQXBwbHkgbGF6aWx5IHRocm91Z2ggb3VyIGNvbW1hbmQgc28gd2UgY2FuIHJlc29sdmUsIHJ1biBzZXJ2ZXIgY29tbWFuZHMgYW5kIGFwcGx5IGVkaXRzIHVuaWZvcm1seS5cbiAgICAgICAgY29tbWFuZDogeyBpZDogQVBQTFlfQUNUSU9OX0NPTU1BTkQsIHRpdGxlLCBhcmd1bWVudHM6IFthY3Rpb25dIH0sXG4gICAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gYXBwbHlDb2RlQWN0aW9uKGFjdGlvbjogQ29kZUFjdGlvbiB8IENvbW1hbmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIV9jb25uKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiAoYWN0aW9uIGFzIENvbW1hbmQpLmNvbW1hbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBhd2FpdCBydW5TZXJ2ZXJDb21tYW5kKGFjdGlvbiBhcyBDb21tYW5kKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzb2x2ZWQgPSBhY3Rpb24gYXMgQ29kZUFjdGlvbjtcbiAgICAgICAgaWYgKCFyZXNvbHZlZC5lZGl0ICYmIChyZXNvbHZlZCBhcyB7IGRhdGE/OiB1bmtub3duIH0pLmRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzb2x2ZWQgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgnY29kZUFjdGlvbi9yZXNvbHZlJywgcmVzb2x2ZWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXNvbHZlZC5lZGl0KSBhcHBseVdvcmtzcGFjZUVkaXQocmVzb2x2ZWQuZWRpdCk7XG4gICAgICAgIGlmIChyZXNvbHZlZC5jb21tYW5kKSBhd2FpdCBydW5TZXJ2ZXJDb21tYW5kKHJlc29sdmVkLmNvbW1hbmQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbamF2YS1sc3BdIGNvZGUgYWN0aW9uIGZhaWxlZDonLCAoZSBhcyBFcnJvcik/Lm1lc3NhZ2UgPz8gZSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBpc1dvcmtzcGFjZUVkaXQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBXb3Jrc3BhY2VFZGl0IHtcbiAgICByZXR1cm4gISF2YWx1ZSAmJiAoISEodmFsdWUgYXMgV29ya3NwYWNlRWRpdCkuY2hhbmdlcyB8fCAhISh2YWx1ZSBhcyBXb3Jrc3BhY2VFZGl0KS5kb2N1bWVudENoYW5nZXMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5TZXJ2ZXJDb21tYW5kKGNtZDogQ29tbWFuZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghX2Nvbm4gfHwgIWNtZD8uY29tbWFuZCkgcmV0dXJuO1xuICAgIGlmIChHRU5FUkFURVtjbWQuY29tbWFuZF0pIHtcbiAgICAgICAgYXdhaXQgcnVuR2VuZXJhdGUoY21kLmNvbW1hbmQsIGNtZC5hcmd1bWVudHMgPz8gW10pO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd3b3Jrc3BhY2UvZXhlY3V0ZUNvbW1hbmQnLCB7IGNvbW1hbmQ6IGNtZC5jb21tYW5kLCBhcmd1bWVudHM6IGNtZC5hcmd1bWVudHMgPz8gW10gfSk7XG4gICAgaWYgKGlzV29ya3NwYWNlRWRpdChyZXN1bHQpKSBhcHBseVdvcmtzcGFjZUVkaXQocmVzdWx0KTtcbn1cblxuaW50ZXJmYWNlIEdlbmVyYXRlU3BlYyB7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICBzdGF0dXM6IHN0cmluZztcbiAgICBnZW5lcmF0ZTogc3RyaW5nO1xuICAgIG1lbWJlcnM6IChzdGF0dXM6IGFueSkgPT4gQXJyYXk8eyBsYWJlbDogc3RyaW5nOyByZWY6IGFueSB9PjtcbiAgICBidWlsZEFyZ3M6IChwcm9tcHRBcmdzOiBhbnlbXSwgc3RhdHVzOiBhbnksIHNlbGVjdGVkOiBhbnlbXSkgPT4gYW55W107XG59XG5cbi8qKiBNZW1iZXItbmFtZWQgZmllbGRzIFx1MjE5MiBwaWNrZXIgbGFiZWxzLiAqL1xuZnVuY3Rpb24gZmllbGRMYWJlbChmOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSBmPy5uYW1lID8/IGY/LmZpZWxkTmFtZSA/PyAnJztcbiAgICBjb25zdCB0eXBlID0gZj8udHlwZSA/PyBmPy50eXBlTmFtZTtcbiAgICByZXR1cm4gdHlwZSA/IGAke25hbWV9OiAke3R5cGV9YCA6IGAke25hbWV9YDtcbn1cblxuLyoqXG4gKiBUaGUgSkRULkxTIHNvdXJjZS1nZW5lcmF0aW9uIGNvbW1hbmRzIChjb25zdHJ1Y3RvcnMsIGdldHRlcnMvc2V0dGVycywgdG9TdHJpbmcsIGhhc2hDb2RlL2VxdWFscykuXG4gKiBFYWNoIG1hcHMgdGhlIGNsaWVudCBcIipQcm9tcHRcIiBjb21tYW5kIHRvIHRoZSBzZXJ2ZXIgc3RhdHVzICsgZ2VuZXJhdGUgZGVsZWdhdGUgY29tbWFuZHM7IHRoZSBzdGF0dXNcbiAqIGNhbGwgeWllbGRzIHRoZSBjYW5kaWRhdGUgZmllbGRzIHNob3duIGluIHRoZSBtZW1iZXIgcGlja2VyLCB0aGUgZ2VuZXJhdGUgY2FsbCByZXR1cm5zIHRoZSBlZGl0LlxuICovXG5jb25zdCBHRU5FUkFURTogUmVjb3JkPHN0cmluZywgR2VuZXJhdGVTcGVjPiA9IHtcbiAgICAnamF2YS5hY3Rpb24uZ2VuZXJhdGVDb25zdHJ1Y3RvcnNQcm9tcHQnOiB7XG4gICAgICAgIGxhYmVsOiAnU2VsZWN0IGZpZWxkcyBhbmQgY29uc3RydWN0b3JzJyxcbiAgICAgICAgc3RhdHVzOiAnamF2YS5hY3Rpb24uY2hlY2tDb25zdHJ1Y3RvcnNTdGF0dXMnLFxuICAgICAgICBnZW5lcmF0ZTogJ2phdmEuYWN0aW9uLmdlbmVyYXRlQ29uc3RydWN0b3JzJyxcbiAgICAgICAgbWVtYmVyczogKHMpID0+IChzPy5maWVsZHMgPz8gW10pLm1hcCgoZjogYW55KSA9PiAoeyBsYWJlbDogZmllbGRMYWJlbChmKSwgcmVmOiBmIH0pKSxcbiAgICAgICAgYnVpbGRBcmdzOiAoYXJncywgcywgc2VsKSA9PiBbYXJnc1swXSwgeyBjb25zdHJ1Y3RvcnM6IHM/LmNvbnN0cnVjdG9ycyA/PyBbXSwgZmllbGRzOiBzZWwubWFwKG0gPT4gbS5yZWYpIH1dLFxuICAgIH0sXG4gICAgJ2phdmEuYWN0aW9uLmdlbmVyYXRlVG9TdHJpbmdQcm9tcHQnOiB7XG4gICAgICAgIGxhYmVsOiAnU2VsZWN0IGZpZWxkcyB0byBpbmNsdWRlIGluIHRvU3RyaW5nKCknLFxuICAgICAgICBzdGF0dXM6ICdqYXZhLmFjdGlvbi5jaGVja1RvU3RyaW5nU3RhdHVzJyxcbiAgICAgICAgZ2VuZXJhdGU6ICdqYXZhLmFjdGlvbi5nZW5lcmF0ZVRvU3RyaW5nJyxcbiAgICAgICAgbWVtYmVyczogKHMpID0+IChzPy5maWVsZHMgPz8gW10pLm1hcCgoZjogYW55KSA9PiAoeyBsYWJlbDogZmllbGRMYWJlbChmKSwgcmVmOiBmIH0pKSxcbiAgICAgICAgYnVpbGRBcmdzOiAoYXJncywgX3MsIHNlbCkgPT4gW2FyZ3NbMF0sIHNlbC5tYXAobSA9PiBtLnJlZildLFxuICAgIH0sXG4gICAgJ2phdmEuYWN0aW9uLmhhc2hDb2RlRXF1YWxzUHJvbXB0Jzoge1xuICAgICAgICBsYWJlbDogJ1NlbGVjdCBmaWVsZHMgZm9yIGhhc2hDb2RlKCkgYW5kIGVxdWFscygpJyxcbiAgICAgICAgc3RhdHVzOiAnamF2YS5hY3Rpb24uY2hlY2tIYXNoQ29kZUVxdWFsc1N0YXR1cycsXG4gICAgICAgIGdlbmVyYXRlOiAnamF2YS5hY3Rpb24uZ2VuZXJhdGVIYXNoQ29kZUVxdWFscycsXG4gICAgICAgIG1lbWJlcnM6IChzKSA9PiAocz8uZmllbGRzID8/IFtdKS5tYXAoKGY6IGFueSkgPT4gKHsgbGFiZWw6IGZpZWxkTGFiZWwoZiksIHJlZjogZiB9KSksXG4gICAgICAgIGJ1aWxkQXJnczogKGFyZ3MsIF9zLCBzZWwpID0+IFthcmdzWzBdLCBzZWwubWFwKG0gPT4gbS5yZWYpLCBmYWxzZV0sXG4gICAgfSxcbiAgICAnamF2YS5hY3Rpb24uZ2VuZXJhdGVBY2Nlc3NvcnNQcm9tcHQnOiB7XG4gICAgICAgIGxhYmVsOiAnU2VsZWN0IGZpZWxkcyB0byBnZW5lcmF0ZSBnZXR0ZXJzIGFuZCBzZXR0ZXJzJyxcbiAgICAgICAgc3RhdHVzOiAnamF2YS5hY3Rpb24uY2hlY2tBY2Nlc3NvcnNTdGF0dXMnLFxuICAgICAgICBnZW5lcmF0ZTogJ2phdmEuYWN0aW9uLmdlbmVyYXRlQWNjZXNzb3JzJyxcbiAgICAgICAgbWVtYmVyczogKHMpID0+IChzPy5hY2Nlc3NvcnMgPz8gcyA/PyBbXSkubWFwKChhOiBhbnkpID0+ICh7IGxhYmVsOiBmaWVsZExhYmVsKGEpLCByZWY6IGEgfSkpLFxuICAgICAgICBidWlsZEFyZ3M6IChhcmdzLCBfcywgc2VsKSA9PiBbYXJnc1swXSwgc2VsLm1hcChtID0+IG0ucmVmKV0sXG4gICAgfSxcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1bkdlbmVyYXRlKHByb21wdElkOiBzdHJpbmcsIGFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFfY29ubikgcmV0dXJuO1xuICAgIGNvbnN0IHNwZWMgPSBHRU5FUkFURVtwcm9tcHRJZF07XG4gICAgY29uc3Qgc3RhdHVzID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3dvcmtzcGFjZS9leGVjdXRlQ29tbWFuZCcsIHsgY29tbWFuZDogc3BlYy5zdGF0dXMsIGFyZ3VtZW50czogYXJncyB9KTtcbiAgICBpZiAoIXN0YXR1cykgcmV0dXJuO1xuICAgIGNvbnN0IG1lbWJlcnMgPSBzcGVjLm1lbWJlcnMoc3RhdHVzKTtcbiAgICBsZXQgc2VsZWN0ZWQgPSBtZW1iZXJzO1xuICAgIGNvbnN0IHBpY2tlciA9IChnbG9iYWxUaGlzIGFzIGFueSkuamF2YUxzcE1lbWJlclBpY2tlcjtcbiAgICBpZiAobWVtYmVycy5sZW5ndGggJiYgdHlwZW9mIHBpY2tlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjb25zdCBjaG9zZW46IHN0cmluZ1tdIHwgbnVsbCA9IGF3YWl0IHBpY2tlcihzcGVjLmxhYmVsLCBtZW1iZXJzLm1hcChtID0+IG0ubGFiZWwpKTtcbiAgICAgICAgaWYgKGNob3NlbiA9PT0gbnVsbCkgcmV0dXJuOyAvLyB1c2VyIGNhbmNlbGxlZCB0aGUgZGlhbG9nXG4gICAgICAgIHNlbGVjdGVkID0gbWVtYmVycy5maWx0ZXIobSA9PiBjaG9zZW4uaW5jbHVkZXMobS5sYWJlbCkpO1xuICAgIH1cbiAgICBjb25zdCBlZGl0ID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3dvcmtzcGFjZS9leGVjdXRlQ29tbWFuZCcsIHtcbiAgICAgICAgY29tbWFuZDogc3BlYy5nZW5lcmF0ZSxcbiAgICAgICAgYXJndW1lbnRzOiBzcGVjLmJ1aWxkQXJncyhhcmdzLCBzdGF0dXMsIHNlbGVjdGVkKSxcbiAgICB9KTtcbiAgICBpZiAoaXNXb3Jrc3BhY2VFZGl0KGVkaXQpKSBhcHBseVdvcmtzcGFjZUVkaXQoZWRpdCk7XG59XG5cbi8qKiBHcm91cHMgYSB3b3Jrc3BhY2UgZWRpdCdzIHRleHQgZWRpdHMgYnkgZG9jdW1lbnQgYW5kIGFwcGxpZXMgdGhlbSBpbiBwbGFjZSB0byBvcGVuIE1vbmFjbyBtb2RlbHMuICovXG5mdW5jdGlvbiBhcHBseVdvcmtzcGFjZUVkaXQoZWRpdDogV29ya3NwYWNlRWRpdCB8IG51bGwgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBpZiAoIWVkaXQpIHJldHVybjtcbiAgICBjb25zdCBieVVyaTogUmVjb3JkPHN0cmluZywgVGV4dEVkaXRbXT4gPSB7fTtcbiAgICBpZiAoZWRpdC5jaGFuZ2VzKSB7XG4gICAgICAgIGZvciAoY29uc3QgdXJpIGluIGVkaXQuY2hhbmdlcykgYnlVcmlbdXJpXSA9IChieVVyaVt1cmldID8/IFtdKS5jb25jYXQoZWRpdC5jaGFuZ2VzW3VyaV0pO1xuICAgIH1cbiAgICBpZiAoZWRpdC5kb2N1bWVudENoYW5nZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBkYyBvZiBlZGl0LmRvY3VtZW50Q2hhbmdlcyBhcyBhbnlbXSkge1xuICAgICAgICAgICAgaWYgKGRjPy50ZXh0RG9jdW1lbnQ/LnVyaSAmJiBBcnJheS5pc0FycmF5KGRjLmVkaXRzKSkge1xuICAgICAgICAgICAgICAgIGJ5VXJpW2RjLnRleHREb2N1bWVudC51cmldID0gKGJ5VXJpW2RjLnRleHREb2N1bWVudC51cmldID8/IFtdKS5jb25jYXQoZGMuZWRpdHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgdXJpIGluIGJ5VXJpKSB7XG4gICAgICAgIGNvbnN0IG1vZGVsID0gbW9uYWNvLmVkaXRvci5nZXRNb2RlbHMoKS5maW5kKG0gPT4gbS51cmkudG9TdHJpbmcoKSA9PT0gdXJpKTtcbiAgICAgICAgaWYgKCFtb2RlbCkgY29udGludWU7XG4gICAgICAgIGNvbnN0IG9wcyA9IGJ5VXJpW3VyaV0ubWFwKGUgPT4gKHsgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28oZS5yYW5nZSksIHRleHQ6IGUubmV3VGV4dCwgZm9yY2VNb3ZlTWFya2VyczogdHJ1ZSB9KSk7XG4gICAgICAgIG1vZGVsLnB1c2hFZGl0T3BlcmF0aW9ucyhbXSwgb3BzLCAoKSA9PiBudWxsKTtcbiAgICB9XG59XG5cbi8qKiBDb252ZXJ0cyBhbiBMU1Agd29ya3NwYWNlIGVkaXQgaW50byB0aGUgTW9uYWNvIHNoYXBlIHJldHVybmVkIGJ5IHRoZSByZW5hbWUgcHJvdmlkZXIuICovXG5mdW5jdGlvbiB3b3Jrc3BhY2VFZGl0VG9Nb25hY28oZWRpdDogV29ya3NwYWNlRWRpdCB8IG51bGwpOiBtb25hY28ubGFuZ3VhZ2VzLldvcmtzcGFjZUVkaXQge1xuICAgIGNvbnN0IGVkaXRzOiBhbnlbXSA9IFtdO1xuICAgIGNvbnN0IHB1c2ggPSAodXJpOiBzdHJpbmcsIGxpc3Q6IFRleHRFZGl0W10pID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBlIG9mIGxpc3QpIHtcbiAgICAgICAgICAgIGVkaXRzLnB1c2goeyByZXNvdXJjZTogbW9uYWNvLlVyaS5wYXJzZSh1cmkpLCB0ZXh0RWRpdDogeyByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhlLnJhbmdlKSwgdGV4dDogZS5uZXdUZXh0IH0sIHZlcnNpb25JZDogdW5kZWZpbmVkIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBpZiAoZWRpdD8uY2hhbmdlcykge1xuICAgICAgICBmb3IgKGNvbnN0IHVyaSBpbiBlZGl0LmNoYW5nZXMpIHB1c2godXJpLCBlZGl0LmNoYW5nZXNbdXJpXSk7XG4gICAgfVxuICAgIGlmIChlZGl0Py5kb2N1bWVudENoYW5nZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBkYyBvZiBlZGl0LmRvY3VtZW50Q2hhbmdlcyBhcyBhbnlbXSkge1xuICAgICAgICAgICAgaWYgKGRjPy50ZXh0RG9jdW1lbnQ/LnVyaSAmJiBBcnJheS5pc0FycmF5KGRjLmVkaXRzKSkgcHVzaChkYy50ZXh0RG9jdW1lbnQudXJpLCBkYy5lZGl0cyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgZWRpdHMgfTtcbn1cblxuLyoqIE1hcHMgYSB2aXJ0dWFsIGVkaXRvciBVUkkgYmFjayB0byB0aGUgSURFIHdvcmtzcGFjZSBwYXRoICh7QGNvZGUgL3dzL3Byb2ovLi4ufSkuICovXG5mdW5jdGlvbiB1cmlUb1dvcmtzcGFjZVBhdGgodXJpOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoIXVyaS5zdGFydHNXaXRoKFZJUlRVQUxfRklMRV9QUkVGSVgpKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHVyaS5zdWJzdHJpbmcoVklSVFVBTF9GSUxFX1BSRUZJWC5sZW5ndGgpKTtcbn1cblxuLyoqIFJlYWRzIGEgd29ya3NwYWNlIGZpbGUncyBjdXJyZW50IHRleHQgb3ZlciB0aGUgSURFIFJFU1QgQVBJLiAqL1xuYXN5bmMgZnVuY3Rpb24gZmV0Y2hXb3Jrc3BhY2VGaWxlVGV4dChpZGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9zZXJ2aWNlcy9pZGUvd29ya3NwYWNlcycgKyBpZGVQYXRoLCB7IGhlYWRlcnM6IHsgJ1gtUmVxdWVzdGVkLVdpdGgnOiAnRmV0Y2gnIH0gfSk7XG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCByZWFkICR7aWRlUGF0aH0gKEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9KWApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzcG9uc2UudGV4dCgpO1xufVxuXG4vKiogQXBwbGllcyBMU1AgdGV4dCBlZGl0cyB0byBhIHN0cmluZy4gT2Zmc2V0cyBhcmUgcmVzb2x2ZWQgYWdhaW5zdCB0aGUgb3JpZ2luYWwgdGV4dCBhbmQgZWRpdHMgYXJlXG4gKiAgYXBwbGllZCBmcm9tIHRoZSBlbmQgYmFja3dhcmRzLCBzbyBlYXJsaWVyIG9mZnNldHMgc3RheSB2YWxpZC4gKi9cbmZ1bmN0aW9uIGFwcGx5RWRpdHNUb1RleHQodGV4dDogc3RyaW5nLCBlZGl0czogVGV4dEVkaXRbXSk6IHN0cmluZyB7XG4gICAgY29uc3QgbGluZVN0YXJ0cyA9IFswXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHRleHQuY2hhckNvZGVBdChpKSA9PT0gMTAgLyogXFxuICovKSBsaW5lU3RhcnRzLnB1c2goaSArIDEpO1xuICAgIH1cbiAgICBjb25zdCBvZmZzZXQgPSAocDogeyBsaW5lOiBudW1iZXI7IGNoYXJhY3RlcjogbnVtYmVyIH0pID0+IChsaW5lU3RhcnRzW3AubGluZV0gPz8gdGV4dC5sZW5ndGgpICsgcC5jaGFyYWN0ZXI7XG4gICAgY29uc3Qgb3JkZXJlZCA9IGVkaXRzLnNsaWNlKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gb2Zmc2V0KGIucmFuZ2Uuc3RhcnQpIC0gb2Zmc2V0KGEucmFuZ2Uuc3RhcnQpKTtcbiAgICBsZXQgcmVzdWx0ID0gdGV4dDtcbiAgICBmb3IgKGNvbnN0IGUgb2Ygb3JkZXJlZCkge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQuc2xpY2UoMCwgb2Zmc2V0KGUucmFuZ2Uuc3RhcnQpKSArIGUubmV3VGV4dCArIHJlc3VsdC5zbGljZShvZmZzZXQoZS5yYW5nZS5lbmQpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBBcHBsaWVzIGEgSkRULkxTIHJlbmFtZSB7QGxpbmsgV29ya3NwYWNlRWRpdH0gYWNyb3NzIHRoZSB3aG9sZSB3b3Jrc3BhY2U6IHRleHQgZWRpdHMgaW4gZXZlcnlcbiAqIGFmZmVjdGVkIGZpbGUgcGx1cyBhbnkge0Bjb2RlIFJlbmFtZUZpbGV9IG9wZXJhdGlvbiAoYSBwdWJsaWMtdHlwZSByZW5hbWUgcmVuYW1lcyBpdHMgb3duXG4gKiB7QGNvZGUgLmphdmF9IGZpbGUpLiBUaGUgY3VycmVudCBmaWxlJ3MgZWRpdHMgZ28gdGhyb3VnaCB0aGUgbGl2ZSBNb25hY28gbW9kZWw7IHRoZSByZXN0IGFyZSByZWFkLFxuICogZWRpdGVkIGFuZCB3cml0dGVuIGJhY2sgb3ZlciBSRVNULiBQZXJzaXN0ZW5jZSAoQ1NSRi1ndWFyZGVkIHdyaXRlcywgdGhlIHRhYiBzd2l0Y2ggd2hlbiB0aGUgY3VycmVudFxuICogZmlsZSBpcyByZW5hbWVkLCBhbmQgcmVsb2FkaW5nIG90aGVyIG9wZW4gZWRpdG9ycykgaXMgZGVsZWdhdGVkIHRvIHRoZSBJREUgdmlhIGphdmFMc3BQZXJzaXN0UmVuYW1lLlxuICovXG5hc3luYyBmdW5jdGlvbiBhcHBseVJlbmFtZUFjcm9zc1dvcmtzcGFjZShtb2RlbDogbW9uYWNvLmVkaXRvci5JVGV4dE1vZGVsLCBlZGl0OiBXb3Jrc3BhY2VFZGl0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY3VycmVudFVyaSA9IG1vZGVsLnVyaS50b1N0cmluZygpO1xuICAgIGNvbnN0IHRleHRCeVVyaTogUmVjb3JkPHN0cmluZywgVGV4dEVkaXRbXT4gPSB7fTtcbiAgICBjb25zdCByZW5hbWVCeVVyaTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gICAgaWYgKGVkaXQuY2hhbmdlcykge1xuICAgICAgICBmb3IgKGNvbnN0IHVyaSBpbiBlZGl0LmNoYW5nZXMpIHRleHRCeVVyaVt1cmldID0gKHRleHRCeVVyaVt1cmldID8/IFtdKS5jb25jYXQoZWRpdC5jaGFuZ2VzW3VyaV0pO1xuICAgIH1cbiAgICBpZiAoZWRpdC5kb2N1bWVudENoYW5nZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBkYyBvZiBlZGl0LmRvY3VtZW50Q2hhbmdlcyBhcyBhbnlbXSkge1xuICAgICAgICAgICAgaWYgKGRjPy5raW5kID09PSAncmVuYW1lJyAmJiBkYy5vbGRVcmkgJiYgZGMubmV3VXJpKSB7XG4gICAgICAgICAgICAgICAgcmVuYW1lQnlVcmlbZGMub2xkVXJpXSA9IGRjLm5ld1VyaTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGM/LnRleHREb2N1bWVudD8udXJpICYmIEFycmF5LmlzQXJyYXkoZGMuZWRpdHMpKSB7XG4gICAgICAgICAgICAgICAgdGV4dEJ5VXJpW2RjLnRleHREb2N1bWVudC51cmldID0gKHRleHRCeVVyaVtkYy50ZXh0RG9jdW1lbnQudXJpXSA/PyBbXSkuY29uY2F0KGRjLmVkaXRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHBheWxvYWQ6IHtcbiAgICAgICAgY3VycmVudFBhdGg6IHN0cmluZyB8IG51bGw7XG4gICAgICAgIGN1cnJlbnRDb250ZW50OiBzdHJpbmcgfCBudWxsO1xuICAgICAgICBjdXJyZW50TmV3UGF0aDogc3RyaW5nIHwgbnVsbDtcbiAgICAgICAgd3JpdGVzOiBBcnJheTx7IHBhdGg6IHN0cmluZyB8IG51bGw7IGNvbnRlbnQ6IHN0cmluZyB9PjtcbiAgICAgICAgcmVuYW1lczogQXJyYXk8eyBvbGRQYXRoOiBzdHJpbmcgfCBudWxsOyBuZXdQYXRoOiBzdHJpbmcgfCBudWxsOyBjb250ZW50OiBzdHJpbmcgfT47XG4gICAgfSA9IHsgY3VycmVudFBhdGg6IHVyaVRvV29ya3NwYWNlUGF0aChjdXJyZW50VXJpKSwgY3VycmVudENvbnRlbnQ6IG51bGwsIGN1cnJlbnROZXdQYXRoOiBudWxsLCB3cml0ZXM6IFtdLCByZW5hbWVzOiBbXSB9O1xuXG4gICAgY29uc3QgdXJpcyA9IG5ldyBTZXQ8c3RyaW5nPihbLi4uT2JqZWN0LmtleXModGV4dEJ5VXJpKSwgLi4uT2JqZWN0LmtleXMocmVuYW1lQnlVcmkpXSk7XG4gICAgZm9yIChjb25zdCB1cmkgb2YgdXJpcykge1xuICAgICAgICBjb25zdCBlZGl0cyA9IHRleHRCeVVyaVt1cmldID8/IFtdO1xuICAgICAgICBsZXQgY29udGVudDogc3RyaW5nO1xuICAgICAgICBpZiAodXJpID09PSBjdXJyZW50VXJpKSB7XG4gICAgICAgICAgICBpZiAoZWRpdHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbW9kZWwucHVzaEVkaXRPcGVyYXRpb25zKFtdLCBlZGl0cy5tYXAoZSA9PiAoeyByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhlLnJhbmdlKSwgdGV4dDogZS5uZXdUZXh0LCBmb3JjZU1vdmVNYXJrZXJzOiB0cnVlIH0pKSwgKCkgPT4gbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250ZW50ID0gbW9kZWwuZ2V0VmFsdWUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IGF3YWl0IGZldGNoV29ya3NwYWNlRmlsZVRleHQodXJpVG9Xb3Jrc3BhY2VQYXRoKHVyaSkgPz8gdXJpKTtcbiAgICAgICAgICAgIGNvbnRlbnQgPSBlZGl0cy5sZW5ndGggPyBhcHBseUVkaXRzVG9UZXh0KHNvdXJjZSwgZWRpdHMpIDogc291cmNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld1VyaSA9IHJlbmFtZUJ5VXJpW3VyaV07XG4gICAgICAgIGlmICh1cmkgPT09IGN1cnJlbnRVcmkpIHtcbiAgICAgICAgICAgIHBheWxvYWQuY3VycmVudENvbnRlbnQgPSBjb250ZW50O1xuICAgICAgICAgICAgcGF5bG9hZC5jdXJyZW50TmV3UGF0aCA9IG5ld1VyaSA/IHVyaVRvV29ya3NwYWNlUGF0aChuZXdVcmkpIDogbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmIChuZXdVcmkpIHtcbiAgICAgICAgICAgIHBheWxvYWQucmVuYW1lcy5wdXNoKHsgb2xkUGF0aDogdXJpVG9Xb3Jrc3BhY2VQYXRoKHVyaSksIG5ld1BhdGg6IHVyaVRvV29ya3NwYWNlUGF0aChuZXdVcmkpLCBjb250ZW50IH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGF5bG9hZC53cml0ZXMucHVzaCh7IHBhdGg6IHVyaVRvV29ya3NwYWNlUGF0aCh1cmkpLCBjb250ZW50IH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgKGdsb2JhbFRoaXMgYXMgYW55KS5qYXZhTHNwUGVyc2lzdFJlbmFtZShwYXlsb2FkKTtcbn1cblxuZnVuY3Rpb24gamR0bHNTZXR0aW5ncygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBqYXZhOiB7XG4gICAgICAgICAgICBpbXBvcnQ6IHtcbiAgICAgICAgICAgICAgICBtYXZlbjogICAgICB7IGVuYWJsZWQ6IHRydWUgfSxcbiAgICAgICAgICAgICAgICBncmFkbGU6ICAgICB7IGVuYWJsZWQ6IGZhbHNlIH0sXG4gICAgICAgICAgICAgICAgZXhjbHVzaW9uczogWycqKi9ub2RlX21vZHVsZXMvKionLCAnKiovLm1ldGFkYXRhLyoqJywgJyoqL2FyY2hldHlwZS1yZXNvdXJjZXMvKionXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhdXRvYnVpbGQ6IHsgZW5hYmxlZDogdHJ1ZSB9LFxuICAgICAgICAgICAgY29tcGxldGlvbjoge1xuICAgICAgICAgICAgICAgIG92ZXJ3cml0ZTogICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgIGd1ZXNzTWV0aG9kQXJndW1lbnRzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBmaWx0ZXJlZFR5cGVzOiBbXG4gICAgICAgICAgICAgICAgICAgICdjb20uc3VuLionLCAnc3VuLionLCAnamRrLionLFxuICAgICAgICAgICAgICAgICAgICAnb3JnLmVjbGlwc2UuamR0LmludGVybmFsLionLFxuICAgICAgICAgICAgICAgICAgICAnb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC4qJyxcbiAgICAgICAgICAgICAgICAgICAgJ29yZy5lY2xpcHNlLm9zZ2kuaW50ZXJuYWwuKicsXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBpbXBvcnRPcmRlcjogWydqYXZhJywgJ2phdmF4JywgJ29yZycsICdjb20nLCAnJ10sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2lnbmF0dXJlSGVscDogIHsgZW5hYmxlZDogdHJ1ZSB9LFxuICAgICAgICAgICAgZm9ybWF0OiAgICAgICAgIHsgZW5hYmxlZDogdHJ1ZSB9LFxuICAgICAgICAgICAgc2F2ZUFjdGlvbnM6ICAgIHsgb3JnYW5pemVJbXBvcnRzOiBmYWxzZSB9LFxuICAgICAgICB9LFxuICAgIH07XG59XG4iLCAiLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgMjAyNCBUeXBlRm94IGFuZCBvdGhlcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMSUNFTlNFIGluIHRoZSBwYWNrYWdlIHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuaW1wb3J0IHsgRGlzcG9zYWJsZSB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcblxuZXhwb3J0IGNsYXNzIERpc3Bvc2FibGVDb2xsZWN0aW9uIGltcGxlbWVudHMgRGlzcG9zYWJsZSB7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGRpc3Bvc2FibGVzOiBEaXNwb3NhYmxlW10gPSBbXTtcblxuICAgIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgICAgIHdoaWxlICh0aGlzLmRpc3Bvc2FibGVzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgdGhpcy5kaXNwb3NhYmxlcy5wb3AoKSEuZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVzaChkaXNwb3NhYmxlOiBEaXNwb3NhYmxlKTogRGlzcG9zYWJsZSB7XG4gICAgICAgIGNvbnN0IGRpc3Bvc2FibGVzID0gdGhpcy5kaXNwb3NhYmxlcztcbiAgICAgICAgZGlzcG9zYWJsZXMucHVzaChkaXNwb3NhYmxlKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBkaXNwb3NhYmxlcy5pbmRleE9mKGRpc3Bvc2FibGUpO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgZGlzcG9zYWJsZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxufVxuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjQgVHlwZUZveCBhbmQgb3RoZXJzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTElDRU5TRSBpbiB0aGUgcGFja2FnZSByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbmltcG9ydCB7IERpc3Bvc2FibGUgfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG5pbXBvcnQgdHlwZSB7IElDb25uZWN0aW9uIH0gZnJvbSAnLi4vc2VydmVyL2Nvbm5lY3Rpb24uanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElXZWJTb2NrZXQgZXh0ZW5kcyBEaXNwb3NhYmxlIHtcbiAgICBzZW5kKGNvbnRlbnQ6IHN0cmluZyk6IHZvaWQ7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBvbk1lc3NhZ2UoY2I6IChkYXRhOiBhbnkpID0+IHZvaWQpOiB2b2lkO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgb25FcnJvcihjYjogKHJlYXNvbjogYW55KSA9PiB2b2lkKTogdm9pZDtcbiAgICBvbkNsb3NlKGNiOiAoY29kZTogbnVtYmVyLCByZWFzb246IHN0cmluZykgPT4gdm9pZCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVdlYlNvY2tldENvbm5lY3Rpb24gZXh0ZW5kcyBJQ29ubmVjdGlvbiB7XG4gICAgcmVhZG9ubHkgc29ja2V0OiBJV2ViU29ja2V0O1xufVxuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjQgVHlwZUZveCBhbmQgb3RoZXJzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTElDRU5TRSBpbiB0aGUgcGFja2FnZSByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbmltcG9ydCB7IERpc3Bvc2FibGUgfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG4vLyBUT0RPOiBVc2UgZW52aXJvbm1lbnQtc3BlY2lmaWMgaW1wb3J0cyAodnNjb2RlLWpzb25ycGMvYnJvd3NlciBvciB2c2NvZGUtanNvbnJwYy9ub2RlKVxuLy8gd2hlbiB1cGdyYWRpbmcgdG8gdnNjb2RlLWpzb25ycGNAOS54LngtbmV4dC5YIHdoaWNoIHN1cHBvcnRzIHByb3BlciBleHBvcnQgbWFwc1xuaW1wb3J0IHsgdHlwZSBEYXRhQ2FsbGJhY2ssIEFic3RyYWN0TWVzc2FnZVJlYWRlciwgTWVzc2FnZVJlYWRlciB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcbmltcG9ydCB0eXBlIHsgSVdlYlNvY2tldCB9IGZyb20gJy4vc29ja2V0LmpzJztcblxuZXhwb3J0IGNsYXNzIFdlYlNvY2tldE1lc3NhZ2VSZWFkZXIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VSZWFkZXIgaW1wbGVtZW50cyBNZXNzYWdlUmVhZGVyIHtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgc29ja2V0OiBJV2ViU29ja2V0O1xuICAgIHByb3RlY3RlZCBzdGF0ZTogJ2luaXRpYWwnIHwgJ2xpc3RlbmluZycgfCAnY2xvc2VkJyA9ICdpbml0aWFsJztcbiAgICBwcm90ZWN0ZWQgY2FsbGJhY2s6IERhdGFDYWxsYmFjayB8IHVuZGVmaW5lZDtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHByb3RlY3RlZCByZWFkb25seSBldmVudHM6IEFycmF5PHsgbWVzc2FnZT86IGFueSwgZXJyb3I/OiBhbnkgfT4gPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKHNvY2tldDogSVdlYlNvY2tldCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnNvY2tldCA9IHNvY2tldDtcbiAgICAgICAgdGhpcy5zb2NrZXQub25NZXNzYWdlKG1lc3NhZ2UgPT5cbiAgICAgICAgICAgIHRoaXMucmVhZE1lc3NhZ2UobWVzc2FnZSlcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zb2NrZXQub25FcnJvcihlcnJvciA9PlxuICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc29ja2V0Lm9uQ2xvc2UoKGNvZGUsIHJlYXNvbikgPT4ge1xuICAgICAgICAgICAgaWYgKGNvZGUgIT09IDEwMDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvcjogRXJyb3IgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICcnICsgY29kZSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYEVycm9yIGR1cmluZyBzb2NrZXQgcmVjb25uZWN0OiBjb2RlID0gJHtjb2RlfSwgcmVhc29uID0gJHtyZWFzb259YFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5maXJlQ2xvc2UoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbGlzdGVuKGNhbGxiYWNrOiBEYXRhQ2FsbGJhY2spOiBEaXNwb3NhYmxlIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09ICdpbml0aWFsJykge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9ICdsaXN0ZW5pbmcnO1xuICAgICAgICAgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgICAgICAgd2hpbGUgKHRoaXMuZXZlbnRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gdGhpcy5ldmVudHMucG9wKCkhO1xuICAgICAgICAgICAgICAgIGlmIChldmVudC5tZXNzYWdlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWFkTWVzc2FnZShldmVudC5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXZlbnQuZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZUNsb3NlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkaXNwb3NlOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2FsbGJhY2sgPT09IGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSAnaW5pdGlhbCc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsbGJhY2sgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIG92ZXJyaWRlIGRpc3Bvc2UoKSB7XG4gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9ICdpbml0aWFsJztcbiAgICAgICAgdGhpcy5jYWxsYmFjayA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5ldmVudHMuc3BsaWNlKDAsIHRoaXMuZXZlbnRzLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBwcm90ZWN0ZWQgcmVhZE1lc3NhZ2UobWVzc2FnZTogYW55KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09PSAnaW5pdGlhbCcpIHtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRzLnNwbGljZSgwLCAwLCB7IG1lc3NhZ2UgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZSA9PT0gJ2xpc3RlbmluZycpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjayEoZGF0YSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvcjogRXJyb3IgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICcnICsgNDAwLFxuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgRXJyb3IgZHVyaW5nIG1lc3NhZ2UgcGFyc2luZywgcmVhc29uID0gJHt0eXBlb2YgZXJyID09PSAnb2JqZWN0JyA/IChlcnIgYXMgYW55KS5tZXNzYWdlIDogJ3Vua25vd24nfWBcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIGZpcmVFcnJvcihlcnJvcjogYW55KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09PSAnaW5pdGlhbCcpIHtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRzLnNwbGljZSgwLCAwLCB7IGVycm9yIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUgPT09ICdsaXN0ZW5pbmcnKSB7XG4gICAgICAgICAgICBzdXBlci5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIGZpcmVDbG9zZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09ICdpbml0aWFsJykge1xuICAgICAgICAgICAgdGhpcy5ldmVudHMuc3BsaWNlKDAsIDAsIHt9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlID09PSAnbGlzdGVuaW5nJykge1xuICAgICAgICAgICAgc3VwZXIuZmlyZUNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGF0ZSA9ICdjbG9zZWQnO1xuICAgIH1cbn1cbiIsICIvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSAyMDI0IFR5cGVGb3ggYW5kIG90aGVycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExJQ0VOU0UgaW4gdGhlIHBhY2thZ2Ugcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5pbXBvcnQgeyBNZXNzYWdlIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuaW1wb3J0IHsgQWJzdHJhY3RNZXNzYWdlV3JpdGVyLCBNZXNzYWdlV3JpdGVyIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuaW1wb3J0IHR5cGUgeyBJV2ViU29ja2V0IH0gZnJvbSAnLi9zb2NrZXQuanMnO1xuXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0TWVzc2FnZVdyaXRlciBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVdyaXRlciBpbXBsZW1lbnRzIE1lc3NhZ2VXcml0ZXIge1xuICAgIHByb3RlY3RlZCBlcnJvckNvdW50ID0gMDtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgc29ja2V0OiBJV2ViU29ja2V0O1xuXG4gICAgY29uc3RydWN0b3Ioc29ja2V0OiBJV2ViU29ja2V0KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuc29ja2V0ID0gc29ja2V0O1xuICAgIH1cblxuICAgIGVuZCgpOiB2b2lkIHtcbiAgICB9XG5cbiAgICBhc3luYyB3cml0ZShtc2c6IE1lc3NhZ2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShtc2cpO1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChjb250ZW50KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5lcnJvckNvdW50Kys7XG4gICAgICAgICAgICB0aGlzLmZpcmVFcnJvcihlLCBtc2csIHRoaXMuZXJyb3JDb3VudCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgMjAyNCBUeXBlRm94IGFuZCBvdGhlcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMSUNFTlNFIGluIHRoZSBwYWNrYWdlIHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuaW1wb3J0IHR5cGUgeyBNZXNzYWdlQ29ubmVjdGlvbiwgTG9nZ2VyIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuaW1wb3J0IHsgY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24gfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG5pbXBvcnQgdHlwZSB7IElXZWJTb2NrZXQgfSBmcm9tICcuL3NvY2tldC5qcyc7XG5pbXBvcnQgeyBXZWJTb2NrZXRNZXNzYWdlUmVhZGVyIH0gZnJvbSAnLi9yZWFkZXIuanMnO1xuaW1wb3J0IHsgV2ViU29ja2V0TWVzc2FnZVdyaXRlciB9IGZyb20gJy4vd3JpdGVyLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdlYlNvY2tldENvbm5lY3Rpb24oc29ja2V0OiBJV2ViU29ja2V0LCBsb2dnZXI6IExvZ2dlcik6IE1lc3NhZ2VDb25uZWN0aW9uIHtcbiAgICBjb25zdCBtZXNzYWdlUmVhZGVyID0gbmV3IFdlYlNvY2tldE1lc3NhZ2VSZWFkZXIoc29ja2V0KTtcbiAgICBjb25zdCBtZXNzYWdlV3JpdGVyID0gbmV3IFdlYlNvY2tldE1lc3NhZ2VXcml0ZXIoc29ja2V0KTtcbiAgICBjb25zdCBjb25uZWN0aW9uID0gY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24obWVzc2FnZVJlYWRlciwgbWVzc2FnZVdyaXRlciwgbG9nZ2VyKTtcbiAgICBjb25uZWN0aW9uLm9uQ2xvc2UoKCkgPT4gY29ubmVjdGlvbi5kaXNwb3NlKCkpO1xuICAgIHJldHVybiBjb25uZWN0aW9uO1xufVxuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjQgVHlwZUZveCBhbmQgb3RoZXJzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTElDRU5TRSBpbiB0aGUgcGFja2FnZSByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbmltcG9ydCB0eXBlIHsgTWVzc2FnZUNvbm5lY3Rpb24sIExvZ2dlciB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcbmltcG9ydCB7IGNyZWF0ZVdlYlNvY2tldENvbm5lY3Rpb24gfSBmcm9tICcuL3NvY2tldC9jb25uZWN0aW9uLmpzJztcbmltcG9ydCB0eXBlIHsgSVdlYlNvY2tldCB9IGZyb20gJy4vc29ja2V0L3NvY2tldC5qcyc7XG5pbXBvcnQgeyBDb25zb2xlTG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gbGlzdGVuKG9wdGlvbnM6IHtcbiAgICB3ZWJTb2NrZXQ6IFdlYlNvY2tldDtcbiAgICBsb2dnZXI/OiBMb2dnZXI7XG4gICAgb25Db25uZWN0aW9uOiAoY29ubmVjdGlvbjogTWVzc2FnZUNvbm5lY3Rpb24pID0+IHZvaWQ7XG59KSB7XG4gICAgY29uc3QgeyB3ZWJTb2NrZXQsIG9uQ29ubmVjdGlvbiB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBsb2dnZXIgPSBvcHRpb25zLmxvZ2dlciB8fCBuZXcgQ29uc29sZUxvZ2dlcigpO1xuICAgIHdlYlNvY2tldC5vbm9wZW4gPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNvY2tldCA9IHRvU29ja2V0KHdlYlNvY2tldCk7XG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBjcmVhdGVXZWJTb2NrZXRDb25uZWN0aW9uKHNvY2tldCwgbG9nZ2VyKTtcbiAgICAgICAgb25Db25uZWN0aW9uKGNvbm5lY3Rpb24pO1xuICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1NvY2tldCh3ZWJTb2NrZXQ6IFdlYlNvY2tldCk6IElXZWJTb2NrZXQge1xuICAgIHJldHVybiB7XG4gICAgICAgIHNlbmQ6IGNvbnRlbnQgPT4gd2ViU29ja2V0LnNlbmQoY29udGVudCksXG4gICAgICAgIG9uTWVzc2FnZTogY2IgPT4ge1xuICAgICAgICAgICAgd2ViU29ja2V0Lm9ubWVzc2FnZSA9IGV2ZW50ID0+IGNiKGV2ZW50LmRhdGEpO1xuICAgICAgICB9LFxuICAgICAgICBvbkVycm9yOiBjYiA9PiB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgd2ViU29ja2V0Lm9uZXJyb3IgPSAoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3QuaGFzT3duKGV2ZW50LCAnbWVzc2FnZScpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNiKGV2ZW50Lm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIG9uQ2xvc2U6IGNiID0+IHtcbiAgICAgICAgICAgIHdlYlNvY2tldC5vbmNsb3NlID0gZXZlbnQgPT4gY2IoZXZlbnQuY29kZSwgZXZlbnQucmVhc29uKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGlzcG9zZTogKCkgPT4gd2ViU29ja2V0LmNsb3NlKClcbiAgICB9O1xufVxuIiwgIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAyNiBFY2xpcHNlIERpcmlnaWJsZSBjb250cmlidXRvcnNcbiAqXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGVcbiAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYyLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcbiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYyMC5odG1sXG4gKlxuICogU1BEWC1GaWxlQ29weXJpZ2h0VGV4dDogRWNsaXBzZSBEaXJpZ2libGUgY29udHJpYnV0b3JzIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wXG4gKi9cblxuLyoqXG4gKiBMYXp5IFByb3h5IHNoaW0gZm9yIE1vbmFjbyBFZGl0b3IgbG9hZGVkIHZpYSBBTUQuXG4gKlxuICogZWRpdG9yLmpzIHNldHMgZ2xvYmFsVGhpcy5tb25hY28gaW5zaWRlIHRoZSBBTUQgcmVxdWlyZSgpIGNhbGxiYWNrLCBiZWZvcmUgYW55XG4gKiBKYXZhTHNwQ2xpZW50TGliLmNvbm5lY3QoKSBjYWxsLiBBbGwgcHJvcGVydHkgYWNjZXNzZXMgZ28gdGhyb3VnaCBQcm94eS5nZXQoKSB0cmFwc1xuICogc28gdGhleSByZXNvbHZlIGFnYWluc3QgdGhlIGxpdmUgd2luZG93Lm1vbmFjbyBhdCBjYWxsIHRpbWUsIG5vdCBhdCBidW5kbGUgbG9hZCB0aW1lLlxuICpcbiAqIFR5cGVTY3JpcHQgcmVzb2x2ZXMgdHlwZXMgZnJvbSB0aGUgcmVhbCBtb25hY28tZWRpdG9yIGRldkRlcGVuZGVuY3k7IGVzYnVpbGQgcmVwbGFjZXNcbiAqIHRoZSBcIm1vbmFjby1lZGl0b3JcIiBpbXBvcnQgd2l0aCB0aGlzIGZpbGUgYXQgYnVuZGxlIHRpbWUgdmlhIHRoZSBhbGlhcyBvcHRpb24uXG4gKi9cblxudHlwZSBNID0gdHlwZW9mIGltcG9ydCgnbW9uYWNvLWVkaXRvcicpO1xuXG5mdW5jdGlvbiBtKCk6IE0ge1xuICAgIHJldHVybiAoZ2xvYmFsVGhpcyBhcyBhbnkpLm1vbmFjbyBhcyBNO1xufVxuXG5mdW5jdGlvbiBuczxUIGV4dGVuZHMgb2JqZWN0PihnZXR0ZXI6ICgpID0+IFQpOiBUIHtcbiAgICByZXR1cm4gbmV3IFByb3h5KHt9IGFzIFQsIHtcbiAgICAgICAgZ2V0OiAoXywgaykgPT4gKGdldHRlcigpIGFzIGFueSlbayBhcyBzdHJpbmddLFxuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBjbHM8VD4oZ2V0dGVyOiAoKSA9PiBUKTogVCB7XG4gICAgcmV0dXJuIG5ldyBQcm94eShmdW5jdGlvbiAoKSB7fSBhcyBhbnksIHtcbiAgICAgICAgY29uc3RydWN0OiAoXywgYXJncykgPT4gbmV3IChnZXR0ZXIoKSBhcyBhbnkpKC4uLmFyZ3MpLFxuICAgICAgICBnZXQ6ICAgICAgIChfLCBrKSAgICA9PiAoZ2V0dGVyKCkgYXMgYW55KVtrIGFzIHN0cmluZ10sXG4gICAgfSkgYXMgVDtcbn1cblxuZXhwb3J0IGNvbnN0IGVkaXRvciAgICAgICAgID0gbnMoKCkgPT4gbSgpLmVkaXRvcik7XG5leHBvcnQgY29uc3QgbGFuZ3VhZ2VzICAgICAgPSBucygoKSA9PiBtKCkubGFuZ3VhZ2VzKTtcbmV4cG9ydCBjb25zdCBNYXJrZXJTZXZlcml0eSA9IG5zKCgpID0+IG0oKS5NYXJrZXJTZXZlcml0eSk7XG5leHBvcnQgY29uc3QgTWFya2VyVGFnICAgICAgPSBucygoKSA9PiAobSgpIGFzIGFueSkuTWFya2VyVGFnKTtcbmV4cG9ydCBjb25zdCBVcmkgICAgICAgICAgICA9IGNscygoKSA9PiBtKCkuVXJpKTtcbmV4cG9ydCBjb25zdCBSYW5nZSAgICAgICAgICA9IGNscygoKSA9PiBtKCkuUmFuZ2UpO1xuZXhwb3J0IGNvbnN0IFBvc2l0aW9uICAgICAgID0gY2xzKCgpID0+IG0oKS5Qb3NpdGlvbik7XG5leHBvcnQgY29uc3QgU2VsZWN0aW9uICAgICAgPSBjbHMoKCkgPT4gbSgpLlNlbGVjdGlvbik7XG5leHBvcnQgY29uc3QgS2V5Q29kZSAgICAgICAgPSBucygoKSA9PiBtKCkuS2V5Q29kZSk7XG5leHBvcnQgY29uc3QgS2V5TW9kICAgICAgICAgPSBucygoKSA9PiBtKCkuS2V5TW9kKTtcbiIsICIvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4ndXNlIHN0cmljdCc7XG5leHBvcnQgdmFyIERvY3VtZW50VXJpO1xuKGZ1bmN0aW9uIChEb2N1bWVudFVyaSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnO1xuICAgIH1cbiAgICBEb2N1bWVudFVyaS5pcyA9IGlzO1xufSkoRG9jdW1lbnRVcmkgfHwgKERvY3VtZW50VXJpID0ge30pKTtcbmV4cG9ydCB2YXIgVVJJO1xuKGZ1bmN0aW9uIChVUkkpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJztcbiAgICB9XG4gICAgVVJJLmlzID0gaXM7XG59KShVUkkgfHwgKFVSSSA9IHt9KSk7XG5leHBvcnQgdmFyIGludGVnZXI7XG4oZnVuY3Rpb24gKGludGVnZXIpIHtcbiAgICBpbnRlZ2VyLk1JTl9WQUxVRSA9IC0yMTQ3NDgzNjQ4O1xuICAgIGludGVnZXIuTUFYX1ZBTFVFID0gMjE0NzQ4MzY0NztcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBpbnRlZ2VyLk1JTl9WQUxVRSA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSBpbnRlZ2VyLk1BWF9WQUxVRTtcbiAgICB9XG4gICAgaW50ZWdlci5pcyA9IGlzO1xufSkoaW50ZWdlciB8fCAoaW50ZWdlciA9IHt9KSk7XG5leHBvcnQgdmFyIHVpbnRlZ2VyO1xuKGZ1bmN0aW9uICh1aW50ZWdlcikge1xuICAgIHVpbnRlZ2VyLk1JTl9WQUxVRSA9IDA7XG4gICAgdWludGVnZXIuTUFYX1ZBTFVFID0gMjE0NzQ4MzY0NztcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiB1aW50ZWdlci5NSU5fVkFMVUUgPD0gdmFsdWUgJiYgdmFsdWUgPD0gdWludGVnZXIuTUFYX1ZBTFVFO1xuICAgIH1cbiAgICB1aW50ZWdlci5pcyA9IGlzO1xufSkodWludGVnZXIgfHwgKHVpbnRlZ2VyID0ge30pKTtcbi8qKlxuICogVGhlIFBvc2l0aW9uIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIFBvc2l0aW9ufSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBQb3NpdGlvbjtcbihmdW5jdGlvbiAoUG9zaXRpb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFBvc2l0aW9uIGxpdGVyYWwgZnJvbSB0aGUgZ2l2ZW4gbGluZSBhbmQgY2hhcmFjdGVyLlxuICAgICAqIEBwYXJhbSBsaW5lIFRoZSBwb3NpdGlvbidzIGxpbmUuXG4gICAgICogQHBhcmFtIGNoYXJhY3RlciBUaGUgcG9zaXRpb24ncyBjaGFyYWN0ZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGxpbmUsIGNoYXJhY3Rlcikge1xuICAgICAgICBpZiAobGluZSA9PT0gTnVtYmVyLk1BWF9WQUxVRSkge1xuICAgICAgICAgICAgbGluZSA9IHVpbnRlZ2VyLk1BWF9WQUxVRTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhcmFjdGVyID09PSBOdW1iZXIuTUFYX1ZBTFVFKSB7XG4gICAgICAgICAgICBjaGFyYWN0ZXIgPSB1aW50ZWdlci5NQVhfVkFMVUU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgbGluZSwgY2hhcmFjdGVyIH07XG4gICAgfVxuICAgIFBvc2l0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIFBvc2l0aW9ufSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS5saW5lKSAmJiBJcy51aW50ZWdlcihjYW5kaWRhdGUuY2hhcmFjdGVyKTtcbiAgICB9XG4gICAgUG9zaXRpb24uaXMgPSBpcztcbn0pKFBvc2l0aW9uIHx8IChQb3NpdGlvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBSYW5nZSBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBSYW5nZX0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgUmFuZ2U7XG4oZnVuY3Rpb24gKFJhbmdlKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKG9uZSwgdHdvLCB0aHJlZSwgZm91cikge1xuICAgICAgICBpZiAoSXMudWludGVnZXIob25lKSAmJiBJcy51aW50ZWdlcih0d28pICYmIElzLnVpbnRlZ2VyKHRocmVlKSAmJiBJcy51aW50ZWdlcihmb3VyKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IFBvc2l0aW9uLmNyZWF0ZShvbmUsIHR3byksIGVuZDogUG9zaXRpb24uY3JlYXRlKHRocmVlLCBmb3VyKSB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKFBvc2l0aW9uLmlzKG9uZSkgJiYgUG9zaXRpb24uaXModHdvKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IG9uZSwgZW5kOiB0d28gfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmFuZ2UjY3JlYXRlIGNhbGxlZCB3aXRoIGludmFsaWQgYXJndW1lbnRzWyR7b25lfSwgJHt0d299LCAke3RocmVlfSwgJHtmb3VyfV1gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBSYW5nZS5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBSYW5nZX0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBQb3NpdGlvbi5pcyhjYW5kaWRhdGUuc3RhcnQpICYmIFBvc2l0aW9uLmlzKGNhbmRpZGF0ZS5lbmQpO1xuICAgIH1cbiAgICBSYW5nZS5pcyA9IGlzO1xufSkoUmFuZ2UgfHwgKFJhbmdlID0ge30pKTtcbi8qKlxuICogVGhlIExvY2F0aW9uIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIExvY2F0aW9ufSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBMb2NhdGlvbjtcbihmdW5jdGlvbiAoTG9jYXRpb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgTG9jYXRpb24gbGl0ZXJhbC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSBsb2NhdGlvbidzIHVyaS5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIGxvY2F0aW9uJ3MgcmFuZ2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHVyaSwgcmFuZ2UpIHtcbiAgICAgICAgcmV0dXJuIHsgdXJpLCByYW5nZSB9O1xuICAgIH1cbiAgICBMb2NhdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBMb2NhdGlvbn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIChJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSkgfHwgSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS51cmkpKTtcbiAgICB9XG4gICAgTG9jYXRpb24uaXMgPSBpcztcbn0pKExvY2F0aW9uIHx8IChMb2NhdGlvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBMb2NhdGlvbkxpbmsgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgTG9jYXRpb25MaW5rfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBMb2NhdGlvbkxpbms7XG4oZnVuY3Rpb24gKExvY2F0aW9uTGluaykge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBMb2NhdGlvbkxpbmsgbGl0ZXJhbC5cbiAgICAgKiBAcGFyYW0gdGFyZ2V0VXJpIFRoZSBkZWZpbml0aW9uJ3MgdXJpLlxuICAgICAqIEBwYXJhbSB0YXJnZXRSYW5nZSBUaGUgZnVsbCByYW5nZSBvZiB0aGUgZGVmaW5pdGlvbi5cbiAgICAgKiBAcGFyYW0gdGFyZ2V0U2VsZWN0aW9uUmFuZ2UgVGhlIHNwYW4gb2YgdGhlIHN5bWJvbCBkZWZpbml0aW9uIGF0IHRoZSB0YXJnZXQuXG4gICAgICogQHBhcmFtIG9yaWdpblNlbGVjdGlvblJhbmdlIFRoZSBzcGFuIG9mIHRoZSBzeW1ib2wgYmVpbmcgZGVmaW5lZCBpbiB0aGUgb3JpZ2luYXRpbmcgc291cmNlIGZpbGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHRhcmdldFVyaSwgdGFyZ2V0UmFuZ2UsIHRhcmdldFNlbGVjdGlvblJhbmdlLCBvcmlnaW5TZWxlY3Rpb25SYW5nZSkge1xuICAgICAgICByZXR1cm4geyB0YXJnZXRVcmksIHRhcmdldFJhbmdlLCB0YXJnZXRTZWxlY3Rpb25SYW5nZSwgb3JpZ2luU2VsZWN0aW9uUmFuZ2UgfTtcbiAgICB9XG4gICAgTG9jYXRpb25MaW5rLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIExvY2F0aW9uTGlua30gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUudGFyZ2V0UmFuZ2UpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudGFyZ2V0VXJpKVxuICAgICAgICAgICAgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnRhcmdldFNlbGVjdGlvblJhbmdlKVxuICAgICAgICAgICAgJiYgKFJhbmdlLmlzKGNhbmRpZGF0ZS5vcmlnaW5TZWxlY3Rpb25SYW5nZSkgfHwgSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5vcmlnaW5TZWxlY3Rpb25SYW5nZSkpO1xuICAgIH1cbiAgICBMb2NhdGlvbkxpbmsuaXMgPSBpcztcbn0pKExvY2F0aW9uTGluayB8fCAoTG9jYXRpb25MaW5rID0ge30pKTtcbi8qKlxuICogVGhlIENvbG9yIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIENvbG9yfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBDb2xvcjtcbihmdW5jdGlvbiAoQ29sb3IpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENvbG9yIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZWQsXG4gICAgICAgICAgICBncmVlbixcbiAgICAgICAgICAgIGJsdWUsXG4gICAgICAgICAgICBhbHBoYSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgQ29sb3IuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgQ29sb3J9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBJcy5udW1iZXJSYW5nZShjYW5kaWRhdGUucmVkLCAwLCAxKVxuICAgICAgICAgICAgJiYgSXMubnVtYmVyUmFuZ2UoY2FuZGlkYXRlLmdyZWVuLCAwLCAxKVxuICAgICAgICAgICAgJiYgSXMubnVtYmVyUmFuZ2UoY2FuZGlkYXRlLmJsdWUsIDAsIDEpXG4gICAgICAgICAgICAmJiBJcy5udW1iZXJSYW5nZShjYW5kaWRhdGUuYWxwaGEsIDAsIDEpO1xuICAgIH1cbiAgICBDb2xvci5pcyA9IGlzO1xufSkoQ29sb3IgfHwgKENvbG9yID0ge30pKTtcbi8qKlxuICogVGhlIENvbG9ySW5mb3JtYXRpb24gbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgQ29sb3JJbmZvcm1hdGlvbn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgQ29sb3JJbmZvcm1hdGlvbjtcbihmdW5jdGlvbiAoQ29sb3JJbmZvcm1hdGlvbikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ29sb3JJbmZvcm1hdGlvbiBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgY29sb3IpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJhbmdlLFxuICAgICAgICAgICAgY29sb3IsXG4gICAgICAgIH07XG4gICAgfVxuICAgIENvbG9ySW5mb3JtYXRpb24uY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgQ29sb3JJbmZvcm1hdGlvbn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgQ29sb3IuaXMoY2FuZGlkYXRlLmNvbG9yKTtcbiAgICB9XG4gICAgQ29sb3JJbmZvcm1hdGlvbi5pcyA9IGlzO1xufSkoQ29sb3JJbmZvcm1hdGlvbiB8fCAoQ29sb3JJbmZvcm1hdGlvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb2xvciBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBDb2xvclByZXNlbnRhdGlvbn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgQ29sb3JQcmVzZW50YXRpb247XG4oZnVuY3Rpb24gKENvbG9yUHJlc2VudGF0aW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDb2xvckluZm9ybWF0aW9uIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGxhYmVsLCB0ZXh0RWRpdCwgYWRkaXRpb25hbFRleHRFZGl0cykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICB0ZXh0RWRpdCxcbiAgICAgICAgICAgIGFkZGl0aW9uYWxUZXh0RWRpdHMsXG4gICAgICAgIH07XG4gICAgfVxuICAgIENvbG9yUHJlc2VudGF0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIENvbG9ySW5mb3JtYXRpb259IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLmxhYmVsKVxuICAgICAgICAgICAgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUudGV4dEVkaXQpIHx8IFRleHRFZGl0LmlzKGNhbmRpZGF0ZSkpXG4gICAgICAgICAgICAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5hZGRpdGlvbmFsVGV4dEVkaXRzKSB8fCBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS5hZGRpdGlvbmFsVGV4dEVkaXRzLCBUZXh0RWRpdC5pcykpO1xuICAgIH1cbiAgICBDb2xvclByZXNlbnRhdGlvbi5pcyA9IGlzO1xufSkoQ29sb3JQcmVzZW50YXRpb24gfHwgKENvbG9yUHJlc2VudGF0aW9uID0ge30pKTtcbi8qKlxuICogQSBzZXQgb2YgcHJlZGVmaW5lZCByYW5nZSBraW5kcy5cbiAqL1xuZXhwb3J0IHZhciBGb2xkaW5nUmFuZ2VLaW5kO1xuKGZ1bmN0aW9uIChGb2xkaW5nUmFuZ2VLaW5kKSB7XG4gICAgLyoqXG4gICAgICogRm9sZGluZyByYW5nZSBmb3IgYSBjb21tZW50XG4gICAgICovXG4gICAgRm9sZGluZ1JhbmdlS2luZC5Db21tZW50ID0gJ2NvbW1lbnQnO1xuICAgIC8qKlxuICAgICAqIEZvbGRpbmcgcmFuZ2UgZm9yIGFuIGltcG9ydCBvciBpbmNsdWRlXG4gICAgICovXG4gICAgRm9sZGluZ1JhbmdlS2luZC5JbXBvcnRzID0gJ2ltcG9ydHMnO1xuICAgIC8qKlxuICAgICAqIEZvbGRpbmcgcmFuZ2UgZm9yIGEgcmVnaW9uIChlLmcuIGAjcmVnaW9uYClcbiAgICAgKi9cbiAgICBGb2xkaW5nUmFuZ2VLaW5kLlJlZ2lvbiA9ICdyZWdpb24nO1xufSkoRm9sZGluZ1JhbmdlS2luZCB8fCAoRm9sZGluZ1JhbmdlS2luZCA9IHt9KSk7XG4vKipcbiAqIFRoZSBmb2xkaW5nIHJhbmdlIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIEZvbGRpbmdSYW5nZX0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgRm9sZGluZ1JhbmdlO1xuKGZ1bmN0aW9uIChGb2xkaW5nUmFuZ2UpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IEZvbGRpbmdSYW5nZSBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShzdGFydExpbmUsIGVuZExpbmUsIHN0YXJ0Q2hhcmFjdGVyLCBlbmRDaGFyYWN0ZXIsIGtpbmQsIGNvbGxhcHNlZFRleHQpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgc3RhcnRMaW5lLFxuICAgICAgICAgICAgZW5kTGluZVxuICAgICAgICB9O1xuICAgICAgICBpZiAoSXMuZGVmaW5lZChzdGFydENoYXJhY3RlcikpIHtcbiAgICAgICAgICAgIHJlc3VsdC5zdGFydENoYXJhY3RlciA9IHN0YXJ0Q2hhcmFjdGVyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKGVuZENoYXJhY3RlcikpIHtcbiAgICAgICAgICAgIHJlc3VsdC5lbmRDaGFyYWN0ZXIgPSBlbmRDaGFyYWN0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzLmRlZmluZWQoa2luZCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5raW5kID0ga2luZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXMuZGVmaW5lZChjb2xsYXBzZWRUZXh0KSkge1xuICAgICAgICAgICAgcmVzdWx0LmNvbGxhcHNlZFRleHQgPSBjb2xsYXBzZWRUZXh0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIEZvbGRpbmdSYW5nZS5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBGb2xkaW5nUmFuZ2V9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBJcy51aW50ZWdlcihjYW5kaWRhdGUuc3RhcnRMaW5lKSAmJiBJcy51aW50ZWdlcihjYW5kaWRhdGUuc3RhcnRMaW5lKVxuICAgICAgICAgICAgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUuc3RhcnRDaGFyYWN0ZXIpIHx8IElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS5zdGFydENoYXJhY3RlcikpXG4gICAgICAgICAgICAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5lbmRDaGFyYWN0ZXIpIHx8IElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS5lbmRDaGFyYWN0ZXIpKVxuICAgICAgICAgICAgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUua2luZCkgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS5raW5kKSk7XG4gICAgfVxuICAgIEZvbGRpbmdSYW5nZS5pcyA9IGlzO1xufSkoRm9sZGluZ1JhbmdlIHx8IChGb2xkaW5nUmFuZ2UgPSB7fSkpO1xuLyoqXG4gKiBUaGUgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbiBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9ufSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uO1xuKGZ1bmN0aW9uIChEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGxvY2F0aW9uLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgICAgIG1lc3NhZ2VcbiAgICAgICAgfTtcbiAgICB9XG4gICAgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9ufSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIExvY2F0aW9uLmlzKGNhbmRpZGF0ZS5sb2NhdGlvbikgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5tZXNzYWdlKTtcbiAgICB9XG4gICAgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbi5pcyA9IGlzO1xufSkoRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbiB8fCAoRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBkaWFnbm9zdGljJ3Mgc2V2ZXJpdHkuXG4gKi9cbmV4cG9ydCB2YXIgRGlhZ25vc3RpY1NldmVyaXR5O1xuKGZ1bmN0aW9uIChEaWFnbm9zdGljU2V2ZXJpdHkpIHtcbiAgICAvKipcbiAgICAgKiBSZXBvcnRzIGFuIGVycm9yLlxuICAgICAqL1xuICAgIERpYWdub3N0aWNTZXZlcml0eS5FcnJvciA9IDE7XG4gICAgLyoqXG4gICAgICogUmVwb3J0cyBhIHdhcm5pbmcuXG4gICAgICovXG4gICAgRGlhZ25vc3RpY1NldmVyaXR5Lldhcm5pbmcgPSAyO1xuICAgIC8qKlxuICAgICAqIFJlcG9ydHMgYW4gaW5mb3JtYXRpb24uXG4gICAgICovXG4gICAgRGlhZ25vc3RpY1NldmVyaXR5LkluZm9ybWF0aW9uID0gMztcbiAgICAvKipcbiAgICAgKiBSZXBvcnRzIGEgaGludC5cbiAgICAgKi9cbiAgICBEaWFnbm9zdGljU2V2ZXJpdHkuSGludCA9IDQ7XG59KShEaWFnbm9zdGljU2V2ZXJpdHkgfHwgKERpYWdub3N0aWNTZXZlcml0eSA9IHt9KSk7XG4vKipcbiAqIFRoZSBkaWFnbm9zdGljIHRhZ3MuXG4gKlxuICogQHNpbmNlIDMuMTUuMFxuICovXG5leHBvcnQgdmFyIERpYWdub3N0aWNUYWc7XG4oZnVuY3Rpb24gKERpYWdub3N0aWNUYWcpIHtcbiAgICAvKipcbiAgICAgKiBVbnVzZWQgb3IgdW5uZWNlc3NhcnkgY29kZS5cbiAgICAgKlxuICAgICAqIENsaWVudHMgYXJlIGFsbG93ZWQgdG8gcmVuZGVyIGRpYWdub3N0aWNzIHdpdGggdGhpcyB0YWcgZmFkZWQgb3V0IGluc3RlYWQgb2YgaGF2aW5nXG4gICAgICogYW4gZXJyb3Igc3F1aWdnbGUuXG4gICAgICovXG4gICAgRGlhZ25vc3RpY1RhZy5Vbm5lY2Vzc2FyeSA9IDE7XG4gICAgLyoqXG4gICAgICogRGVwcmVjYXRlZCBvciBvYnNvbGV0ZSBjb2RlLlxuICAgICAqXG4gICAgICogQ2xpZW50cyBhcmUgYWxsb3dlZCB0byByZW5kZXJlZCBkaWFnbm9zdGljcyB3aXRoIHRoaXMgdGFnIHN0cmlrZSB0aHJvdWdoLlxuICAgICAqL1xuICAgIERpYWdub3N0aWNUYWcuRGVwcmVjYXRlZCA9IDI7XG59KShEaWFnbm9zdGljVGFnIHx8IChEaWFnbm9zdGljVGFnID0ge30pKTtcbi8qKlxuICogVGhlIENvZGVEZXNjcmlwdGlvbiBuYW1lc3BhY2UgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCBkZXNjcmlwdGlvbnMgZm9yIGRpYWdub3N0aWMgY29kZXMuXG4gKlxuICogQHNpbmNlIDMuMTYuMFxuICovXG5leHBvcnQgdmFyIENvZGVEZXNjcmlwdGlvbjtcbihmdW5jdGlvbiAoQ29kZURlc2NyaXB0aW9uKSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5ocmVmKTtcbiAgICB9XG4gICAgQ29kZURlc2NyaXB0aW9uLmlzID0gaXM7XG59KShDb2RlRGVzY3JpcHRpb24gfHwgKENvZGVEZXNjcmlwdGlvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBEaWFnbm9zdGljIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIERpYWdub3N0aWN9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIERpYWdub3N0aWM7XG4oZnVuY3Rpb24gKERpYWdub3N0aWMpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IERpYWdub3N0aWMgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIG1lc3NhZ2UsIHNldmVyaXR5LCBjb2RlLCBzb3VyY2UsIHJlbGF0ZWRJbmZvcm1hdGlvbikge1xuICAgICAgICBsZXQgcmVzdWx0ID0geyByYW5nZSwgbWVzc2FnZSB9O1xuICAgICAgICBpZiAoSXMuZGVmaW5lZChzZXZlcml0eSkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5zZXZlcml0eSA9IHNldmVyaXR5O1xuICAgICAgICB9XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKGNvZGUpKSB7XG4gICAgICAgICAgICByZXN1bHQuY29kZSA9IGNvZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzLmRlZmluZWQoc291cmNlKSkge1xuICAgICAgICAgICAgcmVzdWx0LnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXMuZGVmaW5lZChyZWxhdGVkSW5mb3JtYXRpb24pKSB7XG4gICAgICAgICAgICByZXN1bHQucmVsYXRlZEluZm9ybWF0aW9uID0gcmVsYXRlZEluZm9ybWF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIERpYWdub3N0aWMuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgRGlhZ25vc3RpY30gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpXG4gICAgICAgICAgICAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpXG4gICAgICAgICAgICAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLm1lc3NhZ2UpXG4gICAgICAgICAgICAmJiAoSXMubnVtYmVyKGNhbmRpZGF0ZS5zZXZlcml0eSkgfHwgSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5zZXZlcml0eSkpXG4gICAgICAgICAgICAmJiAoSXMuaW50ZWdlcihjYW5kaWRhdGUuY29kZSkgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS5jb2RlKSB8fCBJcy51bmRlZmluZWQoY2FuZGlkYXRlLmNvZGUpKVxuICAgICAgICAgICAgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUuY29kZURlc2NyaXB0aW9uKSB8fCAoSXMuc3RyaW5nKChfYSA9IGNhbmRpZGF0ZS5jb2RlRGVzY3JpcHRpb24pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5ocmVmKSkpXG4gICAgICAgICAgICAmJiAoSXMuc3RyaW5nKGNhbmRpZGF0ZS5zb3VyY2UpIHx8IElzLnVuZGVmaW5lZChjYW5kaWRhdGUuc291cmNlKSlcbiAgICAgICAgICAgICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLnJlbGF0ZWRJbmZvcm1hdGlvbikgfHwgSXMudHlwZWRBcnJheShjYW5kaWRhdGUucmVsYXRlZEluZm9ybWF0aW9uLCBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uLmlzKSk7XG4gICAgfVxuICAgIERpYWdub3N0aWMuaXMgPSBpcztcbn0pKERpYWdub3N0aWMgfHwgKERpYWdub3N0aWMgPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29tbWFuZCBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBDb21tYW5kfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBDb21tYW5kO1xuKGZ1bmN0aW9uIChDb21tYW5kKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDb21tYW5kIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHRpdGxlLCBjb21tYW5kLCAuLi5hcmdzKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IHRpdGxlLCBjb21tYW5kIH07XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKGFyZ3MpICYmIGFyZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmVzdWx0LmFyZ3VtZW50cyA9IGFyZ3M7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgQ29tbWFuZC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBDb21tYW5kfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudGl0bGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUuY29tbWFuZCk7XG4gICAgfVxuICAgIENvbW1hbmQuaXMgPSBpcztcbn0pKENvbW1hbmQgfHwgKENvbW1hbmQgPSB7fSkpO1xuLyoqXG4gKiBUaGUgVGV4dEVkaXQgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgcmVwbGFjZSxcbiAqIGluc2VydCBhbmQgZGVsZXRlIGVkaXRzIG1vcmUgZWFzaWx5LlxuICovXG5leHBvcnQgdmFyIFRleHRFZGl0O1xuKGZ1bmN0aW9uIChUZXh0RWRpdCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSByZXBsYWNlIHRleHQgZWRpdC5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlIG9mIHRleHQgdG8gYmUgcmVwbGFjZWQuXG4gICAgICogQHBhcmFtIG5ld1RleHQgVGhlIG5ldyB0ZXh0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlcGxhY2UocmFuZ2UsIG5ld1RleHQpIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIG5ld1RleHQgfTtcbiAgICB9XG4gICAgVGV4dEVkaXQucmVwbGFjZSA9IHJlcGxhY2U7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnNlcnQgdGV4dCBlZGl0LlxuICAgICAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgcG9zaXRpb24gdG8gaW5zZXJ0IHRoZSB0ZXh0IGF0LlxuICAgICAqIEBwYXJhbSBuZXdUZXh0IFRoZSB0ZXh0IHRvIGJlIGluc2VydGVkLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluc2VydChwb3NpdGlvbiwgbmV3VGV4dCkge1xuICAgICAgICByZXR1cm4geyByYW5nZTogeyBzdGFydDogcG9zaXRpb24sIGVuZDogcG9zaXRpb24gfSwgbmV3VGV4dCB9O1xuICAgIH1cbiAgICBUZXh0RWRpdC5pbnNlcnQgPSBpbnNlcnQ7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGRlbGV0ZSB0ZXh0IGVkaXQuXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSBvZiB0ZXh0IHRvIGJlIGRlbGV0ZWQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZGVsKHJhbmdlKSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCBuZXdUZXh0OiAnJyB9O1xuICAgIH1cbiAgICBUZXh0RWRpdC5kZWwgPSBkZWw7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSlcbiAgICAgICAgICAgICYmIElzLnN0cmluZyhjYW5kaWRhdGUubmV3VGV4dClcbiAgICAgICAgICAgICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSk7XG4gICAgfVxuICAgIFRleHRFZGl0LmlzID0gaXM7XG59KShUZXh0RWRpdCB8fCAoVGV4dEVkaXQgPSB7fSkpO1xuZXhwb3J0IHZhciBDaGFuZ2VBbm5vdGF0aW9uO1xuKGZ1bmN0aW9uIChDaGFuZ2VBbm5vdGF0aW9uKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKGxhYmVsLCBuZWVkc0NvbmZpcm1hdGlvbiwgZGVzY3JpcHRpb24pIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0geyBsYWJlbCB9O1xuICAgICAgICBpZiAobmVlZHNDb25maXJtYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0Lm5lZWRzQ29uZmlybWF0aW9uID0gbmVlZHNDb25maXJtYXRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIENoYW5nZUFubm90YXRpb24uY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUubGFiZWwpICYmXG4gICAgICAgICAgICAoSXMuYm9vbGVhbihjYW5kaWRhdGUubmVlZHNDb25maXJtYXRpb24pIHx8IGNhbmRpZGF0ZS5uZWVkc0NvbmZpcm1hdGlvbiA9PT0gdW5kZWZpbmVkKSAmJlxuICAgICAgICAgICAgKElzLnN0cmluZyhjYW5kaWRhdGUuZGVzY3JpcHRpb24pIHx8IGNhbmRpZGF0ZS5kZXNjcmlwdGlvbiA9PT0gdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgQ2hhbmdlQW5ub3RhdGlvbi5pcyA9IGlzO1xufSkoQ2hhbmdlQW5ub3RhdGlvbiB8fCAoQ2hhbmdlQW5ub3RhdGlvbiA9IHt9KSk7XG5leHBvcnQgdmFyIENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyO1xuKGZ1bmN0aW9uIChDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuc3RyaW5nKGNhbmRpZGF0ZSk7XG4gICAgfVxuICAgIENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzID0gaXM7XG59KShDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllciB8fCAoQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIgPSB7fSkpO1xuZXhwb3J0IHZhciBBbm5vdGF0ZWRUZXh0RWRpdDtcbihmdW5jdGlvbiAoQW5ub3RhdGVkVGV4dEVkaXQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFubm90YXRlZCByZXBsYWNlIHRleHQgZWRpdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2Ugb2YgdGV4dCB0byBiZSByZXBsYWNlZC5cbiAgICAgKiBAcGFyYW0gbmV3VGV4dCBUaGUgbmV3IHRleHQuXG4gICAgICogQHBhcmFtIGFubm90YXRpb24gVGhlIGFubm90YXRpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVwbGFjZShyYW5nZSwgbmV3VGV4dCwgYW5ub3RhdGlvbikge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgbmV3VGV4dCwgYW5ub3RhdGlvbklkOiBhbm5vdGF0aW9uIH07XG4gICAgfVxuICAgIEFubm90YXRlZFRleHRFZGl0LnJlcGxhY2UgPSByZXBsYWNlO1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYW5ub3RhdGVkIGluc2VydCB0ZXh0IGVkaXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIHBvc2l0aW9uIHRvIGluc2VydCB0aGUgdGV4dCBhdC5cbiAgICAgKiBAcGFyYW0gbmV3VGV4dCBUaGUgdGV4dCB0byBiZSBpbnNlcnRlZC5cbiAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiBUaGUgYW5ub3RhdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbnNlcnQocG9zaXRpb24sIG5ld1RleHQsIGFubm90YXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2U6IHsgc3RhcnQ6IHBvc2l0aW9uLCBlbmQ6IHBvc2l0aW9uIH0sIG5ld1RleHQsIGFubm90YXRpb25JZDogYW5ub3RhdGlvbiB9O1xuICAgIH1cbiAgICBBbm5vdGF0ZWRUZXh0RWRpdC5pbnNlcnQgPSBpbnNlcnQ7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhbm5vdGF0ZWQgZGVsZXRlIHRleHQgZWRpdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2Ugb2YgdGV4dCB0byBiZSBkZWxldGVkLlxuICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIFRoZSBhbm5vdGF0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRlbChyYW5nZSwgYW5ub3RhdGlvbikge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgbmV3VGV4dDogJycsIGFubm90YXRpb25JZDogYW5ub3RhdGlvbiB9O1xuICAgIH1cbiAgICBBbm5vdGF0ZWRUZXh0RWRpdC5kZWwgPSBkZWw7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBUZXh0RWRpdC5pcyhjYW5kaWRhdGUpICYmIChDaGFuZ2VBbm5vdGF0aW9uLmlzKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQpIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQpKTtcbiAgICB9XG4gICAgQW5ub3RhdGVkVGV4dEVkaXQuaXMgPSBpcztcbn0pKEFubm90YXRlZFRleHRFZGl0IHx8IChBbm5vdGF0ZWRUZXh0RWRpdCA9IHt9KSk7XG4vKipcbiAqIFRoZSBUZXh0RG9jdW1lbnRFZGl0IG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlXG4gKiBhbiBlZGl0IHRoYXQgbWFuaXB1bGF0ZXMgYSB0ZXh0IGRvY3VtZW50LlxuICovXG5leHBvcnQgdmFyIFRleHREb2N1bWVudEVkaXQ7XG4oZnVuY3Rpb24gKFRleHREb2N1bWVudEVkaXQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGBUZXh0RG9jdW1lbnRFZGl0YFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh0ZXh0RG9jdW1lbnQsIGVkaXRzKSB7XG4gICAgICAgIHJldHVybiB7IHRleHREb2N1bWVudCwgZWRpdHMgfTtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50RWRpdC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpXG4gICAgICAgICAgICAmJiBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIuaXMoY2FuZGlkYXRlLnRleHREb2N1bWVudClcbiAgICAgICAgICAgICYmIEFycmF5LmlzQXJyYXkoY2FuZGlkYXRlLmVkaXRzKTtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50RWRpdC5pcyA9IGlzO1xufSkoVGV4dERvY3VtZW50RWRpdCB8fCAoVGV4dERvY3VtZW50RWRpdCA9IHt9KSk7XG5leHBvcnQgdmFyIENyZWF0ZUZpbGU7XG4oZnVuY3Rpb24gKENyZWF0ZUZpbGUpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUodXJpLCBvcHRpb25zLCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7XG4gICAgICAgICAgICBraW5kOiAnY3JlYXRlJyxcbiAgICAgICAgICAgIHVyaVxuICAgICAgICB9O1xuICAgICAgICBpZiAob3B0aW9ucyAhPT0gdW5kZWZpbmVkICYmIChvcHRpb25zLm92ZXJ3cml0ZSAhPT0gdW5kZWZpbmVkIHx8IG9wdGlvbnMuaWdub3JlSWZFeGlzdHMgIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgfVxuICAgICAgICBpZiAoYW5ub3RhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQuYW5ub3RhdGlvbklkID0gYW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBDcmVhdGVGaWxlLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgY2FuZGlkYXRlLmtpbmQgPT09ICdjcmVhdGUnICYmIElzLnN0cmluZyhjYW5kaWRhdGUudXJpKSAmJiAoY2FuZGlkYXRlLm9wdGlvbnMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgKChjYW5kaWRhdGUub3B0aW9ucy5vdmVyd3JpdGUgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5vcHRpb25zLm92ZXJ3cml0ZSkpICYmIChjYW5kaWRhdGUub3B0aW9ucy5pZ25vcmVJZkV4aXN0cyA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLm9wdGlvbnMuaWdub3JlSWZFeGlzdHMpKSkpICYmIChjYW5kaWRhdGUuYW5ub3RhdGlvbklkID09PSB1bmRlZmluZWQgfHwgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoY2FuZGlkYXRlLmFubm90YXRpb25JZCkpO1xuICAgIH1cbiAgICBDcmVhdGVGaWxlLmlzID0gaXM7XG59KShDcmVhdGVGaWxlIHx8IChDcmVhdGVGaWxlID0ge30pKTtcbmV4cG9ydCB2YXIgUmVuYW1lRmlsZTtcbihmdW5jdGlvbiAoUmVuYW1lRmlsZSkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShvbGRVcmksIG5ld1VyaSwgb3B0aW9ucywgYW5ub3RhdGlvbikge1xuICAgICAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgICAgICAga2luZDogJ3JlbmFtZScsXG4gICAgICAgICAgICBvbGRVcmksXG4gICAgICAgICAgICBuZXdVcmlcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKG9wdGlvbnMgIT09IHVuZGVmaW5lZCAmJiAob3B0aW9ucy5vdmVyd3JpdGUgIT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLmlnbm9yZUlmRXhpc3RzICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICByZXN1bHQub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFubm90YXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmFubm90YXRpb25JZCA9IGFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgUmVuYW1lRmlsZS5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIGNhbmRpZGF0ZS5raW5kID09PSAncmVuYW1lJyAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLm9sZFVyaSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5uZXdVcmkpICYmIChjYW5kaWRhdGUub3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAoKGNhbmRpZGF0ZS5vcHRpb25zLm92ZXJ3cml0ZSA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLm9wdGlvbnMub3ZlcndyaXRlKSkgJiYgKGNhbmRpZGF0ZS5vcHRpb25zLmlnbm9yZUlmRXhpc3RzID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUub3B0aW9ucy5pZ25vcmVJZkV4aXN0cykpKSkgJiYgKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQgPT09IHVuZGVmaW5lZCB8fCBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhjYW5kaWRhdGUuYW5ub3RhdGlvbklkKSk7XG4gICAgfVxuICAgIFJlbmFtZUZpbGUuaXMgPSBpcztcbn0pKFJlbmFtZUZpbGUgfHwgKFJlbmFtZUZpbGUgPSB7fSkpO1xuZXhwb3J0IHZhciBEZWxldGVGaWxlO1xuKGZ1bmN0aW9uIChEZWxldGVGaWxlKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKHVyaSwgb3B0aW9ucywgYW5ub3RhdGlvbikge1xuICAgICAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgICAgICAga2luZDogJ2RlbGV0ZScsXG4gICAgICAgICAgICB1cmlcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKG9wdGlvbnMgIT09IHVuZGVmaW5lZCAmJiAob3B0aW9ucy5yZWN1cnNpdmUgIT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLmlnbm9yZUlmTm90RXhpc3RzICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICByZXN1bHQub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFubm90YXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmFubm90YXRpb25JZCA9IGFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgRGVsZXRlRmlsZS5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIGNhbmRpZGF0ZS5raW5kID09PSAnZGVsZXRlJyAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSkgJiYgKGNhbmRpZGF0ZS5vcHRpb25zID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICgoY2FuZGlkYXRlLm9wdGlvbnMucmVjdXJzaXZlID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUub3B0aW9ucy5yZWN1cnNpdmUpKSAmJiAoY2FuZGlkYXRlLm9wdGlvbnMuaWdub3JlSWZOb3RFeGlzdHMgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5vcHRpb25zLmlnbm9yZUlmTm90RXhpc3RzKSkpKSAmJiAoY2FuZGlkYXRlLmFubm90YXRpb25JZCA9PT0gdW5kZWZpbmVkIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQpKTtcbiAgICB9XG4gICAgRGVsZXRlRmlsZS5pcyA9IGlzO1xufSkoRGVsZXRlRmlsZSB8fCAoRGVsZXRlRmlsZSA9IHt9KSk7XG5leHBvcnQgdmFyIFdvcmtzcGFjZUVkaXQ7XG4oZnVuY3Rpb24gKFdvcmtzcGFjZUVkaXQpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuY2hhbmdlcyAhPT0gdW5kZWZpbmVkIHx8IGNhbmRpZGF0ZS5kb2N1bWVudENoYW5nZXMgIT09IHVuZGVmaW5lZCkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuZG9jdW1lbnRDaGFuZ2VzID09PSB1bmRlZmluZWQgfHwgY2FuZGlkYXRlLmRvY3VtZW50Q2hhbmdlcy5ldmVyeSgoY2hhbmdlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKElzLnN0cmluZyhjaGFuZ2Uua2luZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZUZpbGUuaXMoY2hhbmdlKSB8fCBSZW5hbWVGaWxlLmlzKGNoYW5nZSkgfHwgRGVsZXRlRmlsZS5pcyhjaGFuZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRleHREb2N1bWVudEVkaXQuaXMoY2hhbmdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSk7XG4gICAgfVxuICAgIFdvcmtzcGFjZUVkaXQuaXMgPSBpcztcbn0pKFdvcmtzcGFjZUVkaXQgfHwgKFdvcmtzcGFjZUVkaXQgPSB7fSkpO1xuY2xhc3MgVGV4dEVkaXRDaGFuZ2VJbXBsIHtcbiAgICBjb25zdHJ1Y3RvcihlZGl0cywgY2hhbmdlQW5ub3RhdGlvbnMpIHtcbiAgICAgICAgdGhpcy5lZGl0cyA9IGVkaXRzO1xuICAgICAgICB0aGlzLmNoYW5nZUFubm90YXRpb25zID0gY2hhbmdlQW5ub3RhdGlvbnM7XG4gICAgfVxuICAgIGluc2VydChwb3NpdGlvbiwgbmV3VGV4dCwgYW5ub3RhdGlvbikge1xuICAgICAgICBsZXQgZWRpdDtcbiAgICAgICAgbGV0IGlkO1xuICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBlZGl0ID0gVGV4dEVkaXQuaW5zZXJ0KHBvc2l0aW9uLCBuZXdUZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhhbm5vdGF0aW9uKSkge1xuICAgICAgICAgICAgaWQgPSBhbm5vdGF0aW9uO1xuICAgICAgICAgICAgZWRpdCA9IEFubm90YXRlZFRleHRFZGl0Lmluc2VydChwb3NpdGlvbiwgbmV3VGV4dCwgYW5ub3RhdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFzc2VydENoYW5nZUFubm90YXRpb25zKHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgaWQgPSB0aGlzLmNoYW5nZUFubm90YXRpb25zLm1hbmFnZShhbm5vdGF0aW9uKTtcbiAgICAgICAgICAgIGVkaXQgPSBBbm5vdGF0ZWRUZXh0RWRpdC5pbnNlcnQocG9zaXRpb24sIG5ld1RleHQsIGlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVkaXRzLnB1c2goZWRpdCk7XG4gICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVwbGFjZShyYW5nZSwgbmV3VGV4dCwgYW5ub3RhdGlvbikge1xuICAgICAgICBsZXQgZWRpdDtcbiAgICAgICAgbGV0IGlkO1xuICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBlZGl0ID0gVGV4dEVkaXQucmVwbGFjZShyYW5nZSwgbmV3VGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoYW5ub3RhdGlvbikpIHtcbiAgICAgICAgICAgIGlkID0gYW5ub3RhdGlvbjtcbiAgICAgICAgICAgIGVkaXQgPSBBbm5vdGF0ZWRUZXh0RWRpdC5yZXBsYWNlKHJhbmdlLCBuZXdUZXh0LCBhbm5vdGF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYXNzZXJ0Q2hhbmdlQW5ub3RhdGlvbnModGhpcy5jaGFuZ2VBbm5vdGF0aW9ucyk7XG4gICAgICAgICAgICBpZCA9IHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMubWFuYWdlKGFubm90YXRpb24pO1xuICAgICAgICAgICAgZWRpdCA9IEFubm90YXRlZFRleHRFZGl0LnJlcGxhY2UocmFuZ2UsIG5ld1RleHQsIGlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVkaXRzLnB1c2goZWRpdCk7XG4gICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVsZXRlKHJhbmdlLCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIGxldCBlZGl0O1xuICAgICAgICBsZXQgaWQ7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGVkaXQgPSBUZXh0RWRpdC5kZWwocmFuZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGFubm90YXRpb24pKSB7XG4gICAgICAgICAgICBpZCA9IGFubm90YXRpb247XG4gICAgICAgICAgICBlZGl0ID0gQW5ub3RhdGVkVGV4dEVkaXQuZGVsKHJhbmdlLCBhbm5vdGF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYXNzZXJ0Q2hhbmdlQW5ub3RhdGlvbnModGhpcy5jaGFuZ2VBbm5vdGF0aW9ucyk7XG4gICAgICAgICAgICBpZCA9IHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMubWFuYWdlKGFubm90YXRpb24pO1xuICAgICAgICAgICAgZWRpdCA9IEFubm90YXRlZFRleHRFZGl0LmRlbChyYW5nZSwgaWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWRpdHMucHVzaChlZGl0KTtcbiAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhZGQoZWRpdCkge1xuICAgICAgICB0aGlzLmVkaXRzLnB1c2goZWRpdCk7XG4gICAgfVxuICAgIGFsbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdHM7XG4gICAgfVxuICAgIGNsZWFyKCkge1xuICAgICAgICB0aGlzLmVkaXRzLnNwbGljZSgwLCB0aGlzLmVkaXRzLmxlbmd0aCk7XG4gICAgfVxuICAgIGFzc2VydENoYW5nZUFubm90YXRpb25zKHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRleHQgZWRpdCBjaGFuZ2UgaXMgbm90IGNvbmZpZ3VyZWQgdG8gbWFuYWdlIGNoYW5nZSBhbm5vdGF0aW9ucy5gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogQSBoZWxwZXIgY2xhc3NcbiAqL1xuY2xhc3MgQ2hhbmdlQW5ub3RhdGlvbnMge1xuICAgIGNvbnN0cnVjdG9yKGFubm90YXRpb25zKSB7XG4gICAgICAgIHRoaXMuX2Fubm90YXRpb25zID0gYW5ub3RhdGlvbnMgPT09IHVuZGVmaW5lZCA/IE9iamVjdC5jcmVhdGUobnVsbCkgOiBhbm5vdGF0aW9ucztcbiAgICAgICAgdGhpcy5fY291bnRlciA9IDA7XG4gICAgICAgIHRoaXMuX3NpemUgPSAwO1xuICAgIH1cbiAgICBhbGwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hbm5vdGF0aW9ucztcbiAgICB9XG4gICAgZ2V0IHNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaXplO1xuICAgIH1cbiAgICBtYW5hZ2UoaWRPckFubm90YXRpb24sIGFubm90YXRpb24pIHtcbiAgICAgICAgbGV0IGlkO1xuICAgICAgICBpZiAoQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoaWRPckFubm90YXRpb24pKSB7XG4gICAgICAgICAgICBpZCA9IGlkT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWQgPSB0aGlzLm5leHRJZCgpO1xuICAgICAgICAgICAgYW5ub3RhdGlvbiA9IGlkT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9hbm5vdGF0aW9uc1tpZF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJZCAke2lkfSBpcyBhbHJlYWR5IGluIHVzZS5gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGFubm90YXRpb24gcHJvdmlkZWQgZm9yIGlkICR7aWR9YCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fYW5ub3RhdGlvbnNbaWRdID0gYW5ub3RhdGlvbjtcbiAgICAgICAgdGhpcy5fc2l6ZSsrO1xuICAgICAgICByZXR1cm4gaWQ7XG4gICAgfVxuICAgIG5leHRJZCgpIHtcbiAgICAgICAgdGhpcy5fY291bnRlcisrO1xuICAgICAgICByZXR1cm4gdGhpcy5fY291bnRlci50b1N0cmluZygpO1xuICAgIH1cbn1cbi8qKlxuICogQSB3b3Jrc3BhY2UgY2hhbmdlIGhlbHBzIGNvbnN0cnVjdGluZyBjaGFuZ2VzIHRvIGEgd29ya3NwYWNlLlxuICovXG5leHBvcnQgY2xhc3MgV29ya3NwYWNlQ2hhbmdlIHtcbiAgICBjb25zdHJ1Y3Rvcih3b3Jrc3BhY2VFZGl0KSB7XG4gICAgICAgIHRoaXMuX3RleHRFZGl0Q2hhbmdlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIGlmICh3b3Jrc3BhY2VFZGl0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQgPSB3b3Jrc3BhY2VFZGl0O1xuICAgICAgICAgICAgaWYgKHdvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMgPSBuZXcgQ2hhbmdlQW5ub3RhdGlvbnMod29ya3NwYWNlRWRpdC5jaGFuZ2VBbm5vdGF0aW9ucyk7XG4gICAgICAgICAgICAgICAgd29ya3NwYWNlRWRpdC5jaGFuZ2VBbm5vdGF0aW9ucyA9IHRoaXMuX2NoYW5nZUFubm90YXRpb25zLmFsbCgpO1xuICAgICAgICAgICAgICAgIHdvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzLmZvckVhY2goKGNoYW5nZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoVGV4dERvY3VtZW50RWRpdC5pcyhjaGFuZ2UpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0RWRpdENoYW5nZSA9IG5ldyBUZXh0RWRpdENoYW5nZUltcGwoY2hhbmdlLmVkaXRzLCB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXh0RWRpdENoYW5nZXNbY2hhbmdlLnRleHREb2N1bWVudC51cmldID0gdGV4dEVkaXRDaGFuZ2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHdvcmtzcGFjZUVkaXQuY2hhbmdlcykge1xuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHdvcmtzcGFjZUVkaXQuY2hhbmdlcykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHRFZGl0Q2hhbmdlID0gbmV3IFRleHRFZGl0Q2hhbmdlSW1wbCh3b3Jrc3BhY2VFZGl0LmNoYW5nZXNba2V5XSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RleHRFZGl0Q2hhbmdlc1trZXldID0gdGV4dEVkaXRDaGFuZ2U7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0ID0ge307XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdW5kZXJseWluZyB7QGxpbmsgV29ya3NwYWNlRWRpdH0gbGl0ZXJhbFxuICAgICAqIHVzZSB0byBiZSByZXR1cm5lZCBmcm9tIGEgd29ya3NwYWNlIGVkaXQgb3BlcmF0aW9uIGxpa2UgcmVuYW1lLlxuICAgICAqL1xuICAgIGdldCBlZGl0KCkge1xuICAgICAgICB0aGlzLmluaXREb2N1bWVudENoYW5nZXMoKTtcbiAgICAgICAgaWYgKHRoaXMuX2NoYW5nZUFubm90YXRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5zaXplID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VBbm5vdGF0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlQW5ub3RhdGlvbnMgPSB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5hbGwoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fd29ya3NwYWNlRWRpdDtcbiAgICB9XG4gICAgZ2V0VGV4dEVkaXRDaGFuZ2Uoa2V5KSB7XG4gICAgICAgIGlmIChPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIuaXMoa2V5KSkge1xuICAgICAgICAgICAgdGhpcy5pbml0RG9jdW1lbnRDaGFuZ2VzKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV29ya3NwYWNlIGVkaXQgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIGRvY3VtZW50IGNoYW5nZXMuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0ZXh0RG9jdW1lbnQgPSB7IHVyaToga2V5LnVyaSwgdmVyc2lvbjoga2V5LnZlcnNpb24gfTtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLl90ZXh0RWRpdENoYW5nZXNbdGV4dERvY3VtZW50LnVyaV07XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVkaXRzID0gW107XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dERvY3VtZW50RWRpdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dERvY3VtZW50LFxuICAgICAgICAgICAgICAgICAgICBlZGl0c1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMucHVzaCh0ZXh0RG9jdW1lbnRFZGl0KTtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgVGV4dEVkaXRDaGFuZ2VJbXBsKGVkaXRzLCB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGV4dEVkaXRDaGFuZ2VzW3RleHREb2N1bWVudC51cmldID0gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdENoYW5nZXMoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV29ya3NwYWNlIGVkaXQgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIG5vcm1hbCB0ZXh0IGVkaXQgY2hhbmdlcy4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLl90ZXh0RWRpdENoYW5nZXNba2V5XTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgbGV0IGVkaXRzID0gW107XG4gICAgICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VzW2tleV0gPSBlZGl0cztcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgVGV4dEVkaXRDaGFuZ2VJbXBsKGVkaXRzKTtcbiAgICAgICAgICAgICAgICB0aGlzLl90ZXh0RWRpdENoYW5nZXNba2V5XSA9IHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaW5pdERvY3VtZW50Q2hhbmdlcygpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzID09PSB1bmRlZmluZWQgJiYgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZUFubm90YXRpb25zID0gbmV3IENoYW5nZUFubm90YXRpb25zKCk7XG4gICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VBbm5vdGF0aW9ucyA9IHRoaXMuX2NoYW5nZUFubm90YXRpb25zLmFsbCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGluaXRDaGFuZ2VzKCkge1xuICAgICAgICBpZiAodGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMgPT09IHVuZGVmaW5lZCAmJiB0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjcmVhdGVGaWxlKHVyaSwgb3B0aW9uc09yQW5ub3RhdGlvbiwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLmluaXREb2N1bWVudENoYW5nZXMoKTtcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV29ya3NwYWNlIGVkaXQgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIGRvY3VtZW50IGNoYW5nZXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGFubm90YXRpb247XG4gICAgICAgIGlmIChDaGFuZ2VBbm5vdGF0aW9uLmlzKG9wdGlvbnNPckFubm90YXRpb24pIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKG9wdGlvbnNPckFubm90YXRpb24pKSB7XG4gICAgICAgICAgICBhbm5vdGF0aW9uID0gb3B0aW9uc09yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGxldCBvcGVyYXRpb247XG4gICAgICAgIGxldCBpZDtcbiAgICAgICAgaWYgKGFubm90YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3BlcmF0aW9uID0gQ3JlYXRlRmlsZS5jcmVhdGUodXJpLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlkID0gQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoYW5ub3RhdGlvbikgPyBhbm5vdGF0aW9uIDogdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMubWFuYWdlKGFubm90YXRpb24pO1xuICAgICAgICAgICAgb3BlcmF0aW9uID0gQ3JlYXRlRmlsZS5jcmVhdGUodXJpLCBvcHRpb25zLCBpZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMucHVzaChvcGVyYXRpb24pO1xuICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlbmFtZUZpbGUob2xkVXJpLCBuZXdVcmksIG9wdGlvbnNPckFubm90YXRpb24sIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5pbml0RG9jdW1lbnRDaGFuZ2VzKCk7XG4gICAgICAgIGlmICh0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dvcmtzcGFjZSBlZGl0IGlzIG5vdCBjb25maWd1cmVkIGZvciBkb2N1bWVudCBjaGFuZ2VzLicpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhbm5vdGF0aW9uO1xuICAgICAgICBpZiAoQ2hhbmdlQW5ub3RhdGlvbi5pcyhvcHRpb25zT3JBbm5vdGF0aW9uKSB8fCBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhvcHRpb25zT3JBbm5vdGF0aW9uKSkge1xuICAgICAgICAgICAgYW5ub3RhdGlvbiA9IG9wdGlvbnNPckFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvcHRpb25zID0gb3B0aW9uc09yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb3BlcmF0aW9uO1xuICAgICAgICBsZXQgaWQ7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wZXJhdGlvbiA9IFJlbmFtZUZpbGUuY3JlYXRlKG9sZFVyaSwgbmV3VXJpLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlkID0gQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoYW5ub3RhdGlvbikgPyBhbm5vdGF0aW9uIDogdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMubWFuYWdlKGFubm90YXRpb24pO1xuICAgICAgICAgICAgb3BlcmF0aW9uID0gUmVuYW1lRmlsZS5jcmVhdGUob2xkVXJpLCBuZXdVcmksIG9wdGlvbnMsIGlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcy5wdXNoKG9wZXJhdGlvbik7XG4gICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVsZXRlRmlsZSh1cmksIG9wdGlvbnNPckFubm90YXRpb24sIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5pbml0RG9jdW1lbnRDaGFuZ2VzKCk7XG4gICAgICAgIGlmICh0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dvcmtzcGFjZSBlZGl0IGlzIG5vdCBjb25maWd1cmVkIGZvciBkb2N1bWVudCBjaGFuZ2VzLicpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhbm5vdGF0aW9uO1xuICAgICAgICBpZiAoQ2hhbmdlQW5ub3RhdGlvbi5pcyhvcHRpb25zT3JBbm5vdGF0aW9uKSB8fCBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhvcHRpb25zT3JBbm5vdGF0aW9uKSkge1xuICAgICAgICAgICAgYW5ub3RhdGlvbiA9IG9wdGlvbnNPckFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvcHRpb25zID0gb3B0aW9uc09yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb3BlcmF0aW9uO1xuICAgICAgICBsZXQgaWQ7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wZXJhdGlvbiA9IERlbGV0ZUZpbGUuY3JlYXRlKHVyaSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZCA9IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGFubm90YXRpb24pID8gYW5ub3RhdGlvbiA6IHRoaXMuX2NoYW5nZUFubm90YXRpb25zLm1hbmFnZShhbm5vdGF0aW9uKTtcbiAgICAgICAgICAgIG9wZXJhdGlvbiA9IERlbGV0ZUZpbGUuY3JlYXRlKHVyaSwgb3B0aW9ucywgaWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzLnB1c2gob3BlcmF0aW9uKTtcbiAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogVGhlIFRleHREb2N1bWVudElkZW50aWZpZXIgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgVGV4dERvY3VtZW50SWRlbnRpZmllcn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgVGV4dERvY3VtZW50SWRlbnRpZmllcjtcbihmdW5jdGlvbiAoVGV4dERvY3VtZW50SWRlbnRpZmllcikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgVGV4dERvY3VtZW50SWRlbnRpZmllciBsaXRlcmFsLlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIGRvY3VtZW50J3MgdXJpLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmkpIHtcbiAgICAgICAgcmV0dXJuIHsgdXJpIH07XG4gICAgfVxuICAgIFRleHREb2N1bWVudElkZW50aWZpZXIuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgVGV4dERvY3VtZW50SWRlbnRpZmllcn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSk7XG4gICAgfVxuICAgIFRleHREb2N1bWVudElkZW50aWZpZXIuaXMgPSBpcztcbn0pKFRleHREb2N1bWVudElkZW50aWZpZXIgfHwgKFRleHREb2N1bWVudElkZW50aWZpZXIgPSB7fSkpO1xuLyoqXG4gKiBUaGUgVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyO1xuKGZ1bmN0aW9uIChWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIGxpdGVyYWwuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgZG9jdW1lbnQncyB1cmkuXG4gICAgICogQHBhcmFtIHZlcnNpb24gVGhlIGRvY3VtZW50J3MgdmVyc2lvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodXJpLCB2ZXJzaW9uKSB7XG4gICAgICAgIHJldHVybiB7IHVyaSwgdmVyc2lvbiB9O1xuICAgIH1cbiAgICBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXJ9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpICYmIElzLmludGVnZXIoY2FuZGlkYXRlLnZlcnNpb24pO1xuICAgIH1cbiAgICBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmlzID0gaXM7XG59KShWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIHx8IChWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyID0ge30pKTtcbi8qKlxuICogVGhlIE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXJ9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcjtcbihmdW5jdGlvbiAoT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIgbGl0ZXJhbC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSBkb2N1bWVudCdzIHVyaS5cbiAgICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgZG9jdW1lbnQncyB2ZXJzaW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmksIHZlcnNpb24pIHtcbiAgICAgICAgcmV0dXJuIHsgdXJpLCB2ZXJzaW9uIH07XG4gICAgfVxuICAgIE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllci5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXJ9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpICYmIChjYW5kaWRhdGUudmVyc2lvbiA9PT0gbnVsbCB8fCBJcy5pbnRlZ2VyKGNhbmRpZGF0ZS52ZXJzaW9uKSk7XG4gICAgfVxuICAgIE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllci5pcyA9IGlzO1xufSkoT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIHx8IChPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIgPSB7fSkpO1xuLyoqXG4gKiBUaGUgVGV4dERvY3VtZW50SXRlbSBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBUZXh0RG9jdW1lbnRJdGVtfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBUZXh0RG9jdW1lbnRJdGVtO1xuKGZ1bmN0aW9uIChUZXh0RG9jdW1lbnRJdGVtKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBUZXh0RG9jdW1lbnRJdGVtIGxpdGVyYWwuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgZG9jdW1lbnQncyB1cmkuXG4gICAgICogQHBhcmFtIGxhbmd1YWdlSWQgVGhlIGRvY3VtZW50J3MgbGFuZ3VhZ2UgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgZG9jdW1lbnQncyB2ZXJzaW9uIG51bWJlci5cbiAgICAgKiBAcGFyYW0gdGV4dCBUaGUgZG9jdW1lbnQncyB0ZXh0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmksIGxhbmd1YWdlSWQsIHZlcnNpb24sIHRleHQpIHtcbiAgICAgICAgcmV0dXJuIHsgdXJpLCBsYW5ndWFnZUlkLCB2ZXJzaW9uLCB0ZXh0IH07XG4gICAgfVxuICAgIFRleHREb2N1bWVudEl0ZW0uY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgVGV4dERvY3VtZW50SXRlbX0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5sYW5ndWFnZUlkKSAmJiBJcy5pbnRlZ2VyKGNhbmRpZGF0ZS52ZXJzaW9uKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnRleHQpO1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnRJdGVtLmlzID0gaXM7XG59KShUZXh0RG9jdW1lbnRJdGVtIHx8IChUZXh0RG9jdW1lbnRJdGVtID0ge30pKTtcbi8qKlxuICogRGVzY3JpYmVzIHRoZSBjb250ZW50IHR5cGUgdGhhdCBhIGNsaWVudCBzdXBwb3J0cyBpbiB2YXJpb3VzXG4gKiByZXN1bHQgbGl0ZXJhbHMgbGlrZSBgSG92ZXJgLCBgUGFyYW1ldGVySW5mb2Agb3IgYENvbXBsZXRpb25JdGVtYC5cbiAqXG4gKiBQbGVhc2Ugbm90ZSB0aGF0IGBNYXJrdXBLaW5kc2AgbXVzdCBub3Qgc3RhcnQgd2l0aCBhIGAkYC4gVGhpcyBraW5kc1xuICogYXJlIHJlc2VydmVkIGZvciBpbnRlcm5hbCB1c2FnZS5cbiAqL1xuZXhwb3J0IHZhciBNYXJrdXBLaW5kO1xuKGZ1bmN0aW9uIChNYXJrdXBLaW5kKSB7XG4gICAgLyoqXG4gICAgICogUGxhaW4gdGV4dCBpcyBzdXBwb3J0ZWQgYXMgYSBjb250ZW50IGZvcm1hdFxuICAgICAqL1xuICAgIE1hcmt1cEtpbmQuUGxhaW5UZXh0ID0gJ3BsYWludGV4dCc7XG4gICAgLyoqXG4gICAgICogTWFya2Rvd24gaXMgc3VwcG9ydGVkIGFzIGEgY29udGVudCBmb3JtYXRcbiAgICAgKi9cbiAgICBNYXJrdXBLaW5kLk1hcmtkb3duID0gJ21hcmtkb3duJztcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgaXMgYSB2YWx1ZSBvZiB0aGUge0BsaW5rIE1hcmt1cEtpbmR9IHR5cGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgPT09IE1hcmt1cEtpbmQuUGxhaW5UZXh0IHx8IGNhbmRpZGF0ZSA9PT0gTWFya3VwS2luZC5NYXJrZG93bjtcbiAgICB9XG4gICAgTWFya3VwS2luZC5pcyA9IGlzO1xufSkoTWFya3VwS2luZCB8fCAoTWFya3VwS2luZCA9IHt9KSk7XG5leHBvcnQgdmFyIE1hcmt1cENvbnRlbnQ7XG4oZnVuY3Rpb24gKE1hcmt1cENvbnRlbnQpIHtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgY29uZm9ybXMgdG8gdGhlIHtAbGluayBNYXJrdXBDb250ZW50fSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKHZhbHVlKSAmJiBNYXJrdXBLaW5kLmlzKGNhbmRpZGF0ZS5raW5kKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnZhbHVlKTtcbiAgICB9XG4gICAgTWFya3VwQ29udGVudC5pcyA9IGlzO1xufSkoTWFya3VwQ29udGVudCB8fCAoTWFya3VwQ29udGVudCA9IHt9KSk7XG4vKipcbiAqIFRoZSBraW5kIG9mIGEgY29tcGxldGlvbiBlbnRyeS5cbiAqL1xuZXhwb3J0IHZhciBDb21wbGV0aW9uSXRlbUtpbmQ7XG4oZnVuY3Rpb24gKENvbXBsZXRpb25JdGVtS2luZCkge1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5UZXh0ID0gMTtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuTWV0aG9kID0gMjtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuRnVuY3Rpb24gPSAzO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5Db25zdHJ1Y3RvciA9IDQ7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkZpZWxkID0gNTtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuVmFyaWFibGUgPSA2O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5DbGFzcyA9IDc7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkludGVyZmFjZSA9IDg7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLk1vZHVsZSA9IDk7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlByb3BlcnR5ID0gMTA7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlVuaXQgPSAxMTtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuVmFsdWUgPSAxMjtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuRW51bSA9IDEzO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5LZXl3b3JkID0gMTQ7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlNuaXBwZXQgPSAxNTtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuQ29sb3IgPSAxNjtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuRmlsZSA9IDE3O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5SZWZlcmVuY2UgPSAxODtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuRm9sZGVyID0gMTk7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkVudW1NZW1iZXIgPSAyMDtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuQ29uc3RhbnQgPSAyMTtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuU3RydWN0ID0gMjI7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkV2ZW50ID0gMjM7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLk9wZXJhdG9yID0gMjQ7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlR5cGVQYXJhbWV0ZXIgPSAyNTtcbn0pKENvbXBsZXRpb25JdGVtS2luZCB8fCAoQ29tcGxldGlvbkl0ZW1LaW5kID0ge30pKTtcbi8qKlxuICogRGVmaW5lcyB3aGV0aGVyIHRoZSBpbnNlcnQgdGV4dCBpbiBhIGNvbXBsZXRpb24gaXRlbSBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXNcbiAqIHBsYWluIHRleHQgb3IgYSBzbmlwcGV0LlxuICovXG5leHBvcnQgdmFyIEluc2VydFRleHRGb3JtYXQ7XG4oZnVuY3Rpb24gKEluc2VydFRleHRGb3JtYXQpIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpbWFyeSB0ZXh0IHRvIGJlIGluc2VydGVkIGlzIHRyZWF0ZWQgYXMgYSBwbGFpbiBzdHJpbmcuXG4gICAgICovXG4gICAgSW5zZXJ0VGV4dEZvcm1hdC5QbGFpblRleHQgPSAxO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcmltYXJ5IHRleHQgdG8gYmUgaW5zZXJ0ZWQgaXMgdHJlYXRlZCBhcyBhIHNuaXBwZXQuXG4gICAgICpcbiAgICAgKiBBIHNuaXBwZXQgY2FuIGRlZmluZSB0YWIgc3RvcHMgYW5kIHBsYWNlaG9sZGVycyB3aXRoIGAkMWAsIGAkMmBcbiAgICAgKiBhbmQgYCR7Mzpmb299YC4gYCQwYCBkZWZpbmVzIHRoZSBmaW5hbCB0YWIgc3RvcCwgaXQgZGVmYXVsdHMgdG9cbiAgICAgKiB0aGUgZW5kIG9mIHRoZSBzbmlwcGV0LiBQbGFjZWhvbGRlcnMgd2l0aCBlcXVhbCBpZGVudGlmaWVycyBhcmUgbGlua2VkLFxuICAgICAqIHRoYXQgaXMgdHlwaW5nIGluIG9uZSB3aWxsIHVwZGF0ZSBvdGhlcnMgdG9vLlxuICAgICAqXG4gICAgICogU2VlIGFsc286IGh0dHBzOi8vbWljcm9zb2Z0LmdpdGh1Yi5pby9sYW5ndWFnZS1zZXJ2ZXItcHJvdG9jb2wvc3BlY2lmaWNhdGlvbnMvc3BlY2lmaWNhdGlvbi1jdXJyZW50LyNzbmlwcGV0X3N5bnRheFxuICAgICAqL1xuICAgIEluc2VydFRleHRGb3JtYXQuU25pcHBldCA9IDI7XG59KShJbnNlcnRUZXh0Rm9ybWF0IHx8IChJbnNlcnRUZXh0Rm9ybWF0ID0ge30pKTtcbi8qKlxuICogQ29tcGxldGlvbiBpdGVtIHRhZ3MgYXJlIGV4dHJhIGFubm90YXRpb25zIHRoYXQgdHdlYWsgdGhlIHJlbmRlcmluZyBvZiBhIGNvbXBsZXRpb25cbiAqIGl0ZW0uXG4gKlxuICogQHNpbmNlIDMuMTUuMFxuICovXG5leHBvcnQgdmFyIENvbXBsZXRpb25JdGVtVGFnO1xuKGZ1bmN0aW9uIChDb21wbGV0aW9uSXRlbVRhZykge1xuICAgIC8qKlxuICAgICAqIFJlbmRlciBhIGNvbXBsZXRpb24gYXMgb2Jzb2xldGUsIHVzdWFsbHkgdXNpbmcgYSBzdHJpa2Utb3V0LlxuICAgICAqL1xuICAgIENvbXBsZXRpb25JdGVtVGFnLkRlcHJlY2F0ZWQgPSAxO1xufSkoQ29tcGxldGlvbkl0ZW1UYWcgfHwgKENvbXBsZXRpb25JdGVtVGFnID0ge30pKTtcbi8qKlxuICogVGhlIEluc2VydFJlcGxhY2VFZGl0IG5hbWVzcGFjZSBwcm92aWRlcyBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIGluc2VydCAvIHJlcGxhY2UgZWRpdHMuXG4gKlxuICogQHNpbmNlIDMuMTYuMFxuICovXG5leHBvcnQgdmFyIEluc2VydFJlcGxhY2VFZGl0O1xuKGZ1bmN0aW9uIChJbnNlcnRSZXBsYWNlRWRpdCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zZXJ0IC8gcmVwbGFjZSBlZGl0XG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKG5ld1RleHQsIGluc2VydCwgcmVwbGFjZSkge1xuICAgICAgICByZXR1cm4geyBuZXdUZXh0LCBpbnNlcnQsIHJlcGxhY2UgfTtcbiAgICB9XG4gICAgSW5zZXJ0UmVwbGFjZUVkaXQuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgSW5zZXJ0UmVwbGFjZUVkaXR9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLm5ld1RleHQpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5pbnNlcnQpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yZXBsYWNlKTtcbiAgICB9XG4gICAgSW5zZXJ0UmVwbGFjZUVkaXQuaXMgPSBpcztcbn0pKEluc2VydFJlcGxhY2VFZGl0IHx8IChJbnNlcnRSZXBsYWNlRWRpdCA9IHt9KSk7XG4vKipcbiAqIEhvdyB3aGl0ZXNwYWNlIGFuZCBpbmRlbnRhdGlvbiBpcyBoYW5kbGVkIGR1cmluZyBjb21wbGV0aW9uXG4gKiBpdGVtIGluc2VydGlvbi5cbiAqXG4gKiBAc2luY2UgMy4xNi4wXG4gKi9cbmV4cG9ydCB2YXIgSW5zZXJ0VGV4dE1vZGU7XG4oZnVuY3Rpb24gKEluc2VydFRleHRNb2RlKSB7XG4gICAgLyoqXG4gICAgICogVGhlIGluc2VydGlvbiBvciByZXBsYWNlIHN0cmluZ3MgaXMgdGFrZW4gYXMgaXQgaXMuIElmIHRoZVxuICAgICAqIHZhbHVlIGlzIG11bHRpIGxpbmUgdGhlIGxpbmVzIGJlbG93IHRoZSBjdXJzb3Igd2lsbCBiZVxuICAgICAqIGluc2VydGVkIHVzaW5nIHRoZSBpbmRlbnRhdGlvbiBkZWZpbmVkIGluIHRoZSBzdHJpbmcgdmFsdWUuXG4gICAgICogVGhlIGNsaWVudCB3aWxsIG5vdCBhcHBseSBhbnkga2luZCBvZiBhZGp1c3RtZW50cyB0byB0aGVcbiAgICAgKiBzdHJpbmcuXG4gICAgICovXG4gICAgSW5zZXJ0VGV4dE1vZGUuYXNJcyA9IDE7XG4gICAgLyoqXG4gICAgICogVGhlIGVkaXRvciBhZGp1c3RzIGxlYWRpbmcgd2hpdGVzcGFjZSBvZiBuZXcgbGluZXMgc28gdGhhdFxuICAgICAqIHRoZXkgbWF0Y2ggdGhlIGluZGVudGF0aW9uIHVwIHRvIHRoZSBjdXJzb3Igb2YgdGhlIGxpbmUgZm9yXG4gICAgICogd2hpY2ggdGhlIGl0ZW0gaXMgYWNjZXB0ZWQuXG4gICAgICpcbiAgICAgKiBDb25zaWRlciBhIGxpbmUgbGlrZSB0aGlzOiA8MnRhYnM+PGN1cnNvcj48M3RhYnM+Zm9vLiBBY2NlcHRpbmcgYVxuICAgICAqIG11bHRpIGxpbmUgY29tcGxldGlvbiBpdGVtIGlzIGluZGVudGVkIHVzaW5nIDIgdGFicyBhbmQgYWxsXG4gICAgICogZm9sbG93aW5nIGxpbmVzIGluc2VydGVkIHdpbGwgYmUgaW5kZW50ZWQgdXNpbmcgMiB0YWJzIGFzIHdlbGwuXG4gICAgICovXG4gICAgSW5zZXJ0VGV4dE1vZGUuYWRqdXN0SW5kZW50YXRpb24gPSAyO1xufSkoSW5zZXJ0VGV4dE1vZGUgfHwgKEluc2VydFRleHRNb2RlID0ge30pKTtcbmV4cG9ydCB2YXIgQ29tcGxldGlvbkl0ZW1MYWJlbERldGFpbHM7XG4oZnVuY3Rpb24gKENvbXBsZXRpb25JdGVtTGFiZWxEZXRhaWxzKSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgKElzLnN0cmluZyhjYW5kaWRhdGUuZGV0YWlsKSB8fCBjYW5kaWRhdGUuZGV0YWlsID09PSB1bmRlZmluZWQpICYmXG4gICAgICAgICAgICAoSXMuc3RyaW5nKGNhbmRpZGF0ZS5kZXNjcmlwdGlvbikgfHwgY2FuZGlkYXRlLmRlc2NyaXB0aW9uID09PSB1bmRlZmluZWQpO1xuICAgIH1cbiAgICBDb21wbGV0aW9uSXRlbUxhYmVsRGV0YWlscy5pcyA9IGlzO1xufSkoQ29tcGxldGlvbkl0ZW1MYWJlbERldGFpbHMgfHwgKENvbXBsZXRpb25JdGVtTGFiZWxEZXRhaWxzID0ge30pKTtcbi8qKlxuICogVGhlIENvbXBsZXRpb25JdGVtIG5hbWVzcGFjZSBwcm92aWRlcyBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoXG4gKiBjb21wbGV0aW9uIGl0ZW1zLlxuICovXG5leHBvcnQgdmFyIENvbXBsZXRpb25JdGVtO1xuKGZ1bmN0aW9uIChDb21wbGV0aW9uSXRlbSkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIGNvbXBsZXRpb24gaXRlbSBhbmQgc2VlZCBpdCB3aXRoIGEgbGFiZWwuXG4gICAgICogQHBhcmFtIGxhYmVsIFRoZSBjb21wbGV0aW9uIGl0ZW0ncyBsYWJlbFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShsYWJlbCkge1xuICAgICAgICByZXR1cm4geyBsYWJlbCB9O1xuICAgIH1cbiAgICBDb21wbGV0aW9uSXRlbS5jcmVhdGUgPSBjcmVhdGU7XG59KShDb21wbGV0aW9uSXRlbSB8fCAoQ29tcGxldGlvbkl0ZW0gPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29tcGxldGlvbkxpc3QgbmFtZXNwYWNlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGhcbiAqIGNvbXBsZXRpb24gbGlzdHMuXG4gKi9cbmV4cG9ydCB2YXIgQ29tcGxldGlvbkxpc3Q7XG4oZnVuY3Rpb24gKENvbXBsZXRpb25MaXN0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBjb21wbGV0aW9uIGxpc3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaXRlbXMgVGhlIGNvbXBsZXRpb24gaXRlbXMuXG4gICAgICogQHBhcmFtIGlzSW5jb21wbGV0ZSBUaGUgbGlzdCBpcyBub3QgY29tcGxldGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGl0ZW1zLCBpc0luY29tcGxldGUpIHtcbiAgICAgICAgcmV0dXJuIHsgaXRlbXM6IGl0ZW1zID8gaXRlbXMgOiBbXSwgaXNJbmNvbXBsZXRlOiAhIWlzSW5jb21wbGV0ZSB9O1xuICAgIH1cbiAgICBDb21wbGV0aW9uTGlzdC5jcmVhdGUgPSBjcmVhdGU7XG59KShDb21wbGV0aW9uTGlzdCB8fCAoQ29tcGxldGlvbkxpc3QgPSB7fSkpO1xuZXhwb3J0IHZhciBNYXJrZWRTdHJpbmc7XG4oZnVuY3Rpb24gKE1hcmtlZFN0cmluZykge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBtYXJrZWQgc3RyaW5nIGZyb20gcGxhaW4gdGV4dC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwbGFpblRleHQgVGhlIHBsYWluIHRleHQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZnJvbVBsYWluVGV4dChwbGFpblRleHQpIHtcbiAgICAgICAgcmV0dXJuIHBsYWluVGV4dC5yZXBsYWNlKC9bXFxcXGAqX3t9W1xcXSgpIytcXC0uIV0vZywgJ1xcXFwkJicpOyAvLyBlc2NhcGUgbWFya2Rvd24gc3ludGF4IHRva2VuczogaHR0cDovL2RhcmluZ2ZpcmViYWxsLm5ldC9wcm9qZWN0cy9tYXJrZG93bi9zeW50YXgjYmFja3NsYXNoXG4gICAgfVxuICAgIE1hcmtlZFN0cmluZy5mcm9tUGxhaW5UZXh0ID0gZnJvbVBsYWluVGV4dDtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgY29uZm9ybXMgdG8gdGhlIHtAbGluayBNYXJrZWRTdHJpbmd9IHR5cGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5zdHJpbmcoY2FuZGlkYXRlKSB8fCAoSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUubGFuZ3VhZ2UpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudmFsdWUpKTtcbiAgICB9XG4gICAgTWFya2VkU3RyaW5nLmlzID0gaXM7XG59KShNYXJrZWRTdHJpbmcgfHwgKE1hcmtlZFN0cmluZyA9IHt9KSk7XG5leHBvcnQgdmFyIEhvdmVyO1xuKGZ1bmN0aW9uIChIb3Zlcikge1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBjb25mb3JtcyB0byB0aGUge0BsaW5rIEhvdmVyfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gISFjYW5kaWRhdGUgJiYgSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIChNYXJrdXBDb250ZW50LmlzKGNhbmRpZGF0ZS5jb250ZW50cykgfHxcbiAgICAgICAgICAgIE1hcmtlZFN0cmluZy5pcyhjYW5kaWRhdGUuY29udGVudHMpIHx8XG4gICAgICAgICAgICBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS5jb250ZW50cywgTWFya2VkU3RyaW5nLmlzKSkgJiYgKHZhbHVlLnJhbmdlID09PSB1bmRlZmluZWQgfHwgUmFuZ2UuaXModmFsdWUucmFuZ2UpKTtcbiAgICB9XG4gICAgSG92ZXIuaXMgPSBpcztcbn0pKEhvdmVyIHx8IChIb3ZlciA9IHt9KSk7XG4vKipcbiAqIFRoZSBQYXJhbWV0ZXJJbmZvcm1hdGlvbiBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBQYXJhbWV0ZXJJbmZvcm1hdGlvbn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgUGFyYW1ldGVySW5mb3JtYXRpb247XG4oZnVuY3Rpb24gKFBhcmFtZXRlckluZm9ybWF0aW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBwYXJhbWV0ZXIgaW5mb3JtYXRpb24gbGl0ZXJhbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBsYWJlbCBBIGxhYmVsIHN0cmluZy5cbiAgICAgKiBAcGFyYW0gZG9jdW1lbnRhdGlvbiBBIGRvYyBzdHJpbmcuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGxhYmVsLCBkb2N1bWVudGF0aW9uKSB7XG4gICAgICAgIHJldHVybiBkb2N1bWVudGF0aW9uID8geyBsYWJlbCwgZG9jdW1lbnRhdGlvbiB9IDogeyBsYWJlbCB9O1xuICAgIH1cbiAgICBQYXJhbWV0ZXJJbmZvcm1hdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG59KShQYXJhbWV0ZXJJbmZvcm1hdGlvbiB8fCAoUGFyYW1ldGVySW5mb3JtYXRpb24gPSB7fSkpO1xuLyoqXG4gKiBUaGUgU2lnbmF0dXJlSW5mb3JtYXRpb24gbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgU2lnbmF0dXJlSW5mb3JtYXRpb259IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIFNpZ25hdHVyZUluZm9ybWF0aW9uO1xuKGZ1bmN0aW9uIChTaWduYXR1cmVJbmZvcm1hdGlvbikge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShsYWJlbCwgZG9jdW1lbnRhdGlvbiwgLi4ucGFyYW1ldGVycykge1xuICAgICAgICBsZXQgcmVzdWx0ID0geyBsYWJlbCB9O1xuICAgICAgICBpZiAoSXMuZGVmaW5lZChkb2N1bWVudGF0aW9uKSkge1xuICAgICAgICAgICAgcmVzdWx0LmRvY3VtZW50YXRpb24gPSBkb2N1bWVudGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKHBhcmFtZXRlcnMpKSB7XG4gICAgICAgICAgICByZXN1bHQucGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQucGFyYW1ldGVycyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIFNpZ25hdHVyZUluZm9ybWF0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKFNpZ25hdHVyZUluZm9ybWF0aW9uIHx8IChTaWduYXR1cmVJbmZvcm1hdGlvbiA9IHt9KSk7XG4vKipcbiAqIEEgZG9jdW1lbnQgaGlnaGxpZ2h0IGtpbmQuXG4gKi9cbmV4cG9ydCB2YXIgRG9jdW1lbnRIaWdobGlnaHRLaW5kO1xuKGZ1bmN0aW9uIChEb2N1bWVudEhpZ2hsaWdodEtpbmQpIHtcbiAgICAvKipcbiAgICAgKiBBIHRleHR1YWwgb2NjdXJyZW5jZS5cbiAgICAgKi9cbiAgICBEb2N1bWVudEhpZ2hsaWdodEtpbmQuVGV4dCA9IDE7XG4gICAgLyoqXG4gICAgICogUmVhZC1hY2Nlc3Mgb2YgYSBzeW1ib2wsIGxpa2UgcmVhZGluZyBhIHZhcmlhYmxlLlxuICAgICAqL1xuICAgIERvY3VtZW50SGlnaGxpZ2h0S2luZC5SZWFkID0gMjtcbiAgICAvKipcbiAgICAgKiBXcml0ZS1hY2Nlc3Mgb2YgYSBzeW1ib2wsIGxpa2Ugd3JpdGluZyB0byBhIHZhcmlhYmxlLlxuICAgICAqL1xuICAgIERvY3VtZW50SGlnaGxpZ2h0S2luZC5Xcml0ZSA9IDM7XG59KShEb2N1bWVudEhpZ2hsaWdodEtpbmQgfHwgKERvY3VtZW50SGlnaGxpZ2h0S2luZCA9IHt9KSk7XG4vKipcbiAqIERvY3VtZW50SGlnaGxpZ2h0IG5hbWVzcGFjZSB0byBwcm92aWRlIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgRG9jdW1lbnRIaWdobGlnaHR9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIERvY3VtZW50SGlnaGxpZ2h0O1xuKGZ1bmN0aW9uIChEb2N1bWVudEhpZ2hsaWdodCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIERvY3VtZW50SGlnaGxpZ2h0IG9iamVjdC5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlIHRoZSBoaWdobGlnaHQgYXBwbGllcyB0by5cbiAgICAgKiBAcGFyYW0ga2luZCBUaGUgaGlnaGxpZ2h0IGtpbmRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIGtpbmQpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHsgcmFuZ2UgfTtcbiAgICAgICAgaWYgKElzLm51bWJlcihraW5kKSkge1xuICAgICAgICAgICAgcmVzdWx0LmtpbmQgPSBraW5kO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIERvY3VtZW50SGlnaGxpZ2h0LmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKERvY3VtZW50SGlnaGxpZ2h0IHx8IChEb2N1bWVudEhpZ2hsaWdodCA9IHt9KSk7XG4vKipcbiAqIEEgc3ltYm9sIGtpbmQuXG4gKi9cbmV4cG9ydCB2YXIgU3ltYm9sS2luZDtcbihmdW5jdGlvbiAoU3ltYm9sS2luZCkge1xuICAgIFN5bWJvbEtpbmQuRmlsZSA9IDE7XG4gICAgU3ltYm9sS2luZC5Nb2R1bGUgPSAyO1xuICAgIFN5bWJvbEtpbmQuTmFtZXNwYWNlID0gMztcbiAgICBTeW1ib2xLaW5kLlBhY2thZ2UgPSA0O1xuICAgIFN5bWJvbEtpbmQuQ2xhc3MgPSA1O1xuICAgIFN5bWJvbEtpbmQuTWV0aG9kID0gNjtcbiAgICBTeW1ib2xLaW5kLlByb3BlcnR5ID0gNztcbiAgICBTeW1ib2xLaW5kLkZpZWxkID0gODtcbiAgICBTeW1ib2xLaW5kLkNvbnN0cnVjdG9yID0gOTtcbiAgICBTeW1ib2xLaW5kLkVudW0gPSAxMDtcbiAgICBTeW1ib2xLaW5kLkludGVyZmFjZSA9IDExO1xuICAgIFN5bWJvbEtpbmQuRnVuY3Rpb24gPSAxMjtcbiAgICBTeW1ib2xLaW5kLlZhcmlhYmxlID0gMTM7XG4gICAgU3ltYm9sS2luZC5Db25zdGFudCA9IDE0O1xuICAgIFN5bWJvbEtpbmQuU3RyaW5nID0gMTU7XG4gICAgU3ltYm9sS2luZC5OdW1iZXIgPSAxNjtcbiAgICBTeW1ib2xLaW5kLkJvb2xlYW4gPSAxNztcbiAgICBTeW1ib2xLaW5kLkFycmF5ID0gMTg7XG4gICAgU3ltYm9sS2luZC5PYmplY3QgPSAxOTtcbiAgICBTeW1ib2xLaW5kLktleSA9IDIwO1xuICAgIFN5bWJvbEtpbmQuTnVsbCA9IDIxO1xuICAgIFN5bWJvbEtpbmQuRW51bU1lbWJlciA9IDIyO1xuICAgIFN5bWJvbEtpbmQuU3RydWN0ID0gMjM7XG4gICAgU3ltYm9sS2luZC5FdmVudCA9IDI0O1xuICAgIFN5bWJvbEtpbmQuT3BlcmF0b3IgPSAyNTtcbiAgICBTeW1ib2xLaW5kLlR5cGVQYXJhbWV0ZXIgPSAyNjtcbn0pKFN5bWJvbEtpbmQgfHwgKFN5bWJvbEtpbmQgPSB7fSkpO1xuLyoqXG4gKiBTeW1ib2wgdGFncyBhcmUgZXh0cmEgYW5ub3RhdGlvbnMgdGhhdCB0d2VhayB0aGUgcmVuZGVyaW5nIG9mIGEgc3ltYm9sLlxuICpcbiAqIEBzaW5jZSAzLjE2XG4gKi9cbmV4cG9ydCB2YXIgU3ltYm9sVGFnO1xuKGZ1bmN0aW9uIChTeW1ib2xUYWcpIHtcbiAgICAvKipcbiAgICAgKiBSZW5kZXIgYSBzeW1ib2wgYXMgb2Jzb2xldGUsIHVzdWFsbHkgdXNpbmcgYSBzdHJpa2Utb3V0LlxuICAgICAqL1xuICAgIFN5bWJvbFRhZy5EZXByZWNhdGVkID0gMTtcbn0pKFN5bWJvbFRhZyB8fCAoU3ltYm9sVGFnID0ge30pKTtcbmV4cG9ydCB2YXIgU3ltYm9sSW5mb3JtYXRpb247XG4oZnVuY3Rpb24gKFN5bWJvbEluZm9ybWF0aW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBzeW1ib2wgaW5mb3JtYXRpb24gbGl0ZXJhbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIGtpbmQgVGhlIGtpbmQgb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlIG9mIHRoZSBsb2NhdGlvbiBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIHJlc291cmNlIG9mIHRoZSBsb2NhdGlvbiBvZiBzeW1ib2wuXG4gICAgICogQHBhcmFtIGNvbnRhaW5lck5hbWUgVGhlIG5hbWUgb2YgdGhlIHN5bWJvbCBjb250YWluaW5nIHRoZSBzeW1ib2wuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKG5hbWUsIGtpbmQsIHJhbmdlLCB1cmksIGNvbnRhaW5lck5hbWUpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBraW5kLFxuICAgICAgICAgICAgbG9jYXRpb246IHsgdXJpLCByYW5nZSB9XG4gICAgICAgIH07XG4gICAgICAgIGlmIChjb250YWluZXJOYW1lKSB7XG4gICAgICAgICAgICByZXN1bHQuY29udGFpbmVyTmFtZSA9IGNvbnRhaW5lck5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgU3ltYm9sSW5mb3JtYXRpb24uY3JlYXRlID0gY3JlYXRlO1xufSkoU3ltYm9sSW5mb3JtYXRpb24gfHwgKFN5bWJvbEluZm9ybWF0aW9uID0ge30pKTtcbmV4cG9ydCB2YXIgV29ya3NwYWNlU3ltYm9sO1xuKGZ1bmN0aW9uIChXb3Jrc3BhY2VTeW1ib2wpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgd29ya3NwYWNlIHN5bWJvbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIGtpbmQgVGhlIGtpbmQgb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSByZXNvdXJjZSBvZiB0aGUgbG9jYXRpb24gb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgQW4gb3B0aW9ucyByYW5nZSBvZiB0aGUgbG9jYXRpb24uXG4gICAgICogQHJldHVybnMgQSBXb3Jrc3BhY2VTeW1ib2wuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKG5hbWUsIGtpbmQsIHVyaSwgcmFuZ2UpIHtcbiAgICAgICAgcmV0dXJuIHJhbmdlICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8geyBuYW1lLCBraW5kLCBsb2NhdGlvbjogeyB1cmksIHJhbmdlIH0gfVxuICAgICAgICAgICAgOiB7IG5hbWUsIGtpbmQsIGxvY2F0aW9uOiB7IHVyaSB9IH07XG4gICAgfVxuICAgIFdvcmtzcGFjZVN5bWJvbC5jcmVhdGUgPSBjcmVhdGU7XG59KShXb3Jrc3BhY2VTeW1ib2wgfHwgKFdvcmtzcGFjZVN5bWJvbCA9IHt9KSk7XG5leHBvcnQgdmFyIERvY3VtZW50U3ltYm9sO1xuKGZ1bmN0aW9uIChEb2N1bWVudFN5bWJvbCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgc3ltYm9sIGluZm9ybWF0aW9uIGxpdGVyYWwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSBkZXRhaWwgVGhlIGRldGFpbCBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSBraW5kIFRoZSBraW5kIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSBzZWxlY3Rpb25SYW5nZSBUaGUgc2VsZWN0aW9uUmFuZ2Ugb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gY2hpbGRyZW4gQ2hpbGRyZW4gb2YgdGhlIHN5bWJvbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobmFtZSwgZGV0YWlsLCBraW5kLCByYW5nZSwgc2VsZWN0aW9uUmFuZ2UsIGNoaWxkcmVuKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgZGV0YWlsLFxuICAgICAgICAgICAga2luZCxcbiAgICAgICAgICAgIHJhbmdlLFxuICAgICAgICAgICAgc2VsZWN0aW9uUmFuZ2VcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGNoaWxkcmVuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIERvY3VtZW50U3ltYm9sLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIERvY3VtZW50U3ltYm9sfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmXG4gICAgICAgICAgICBJcy5zdHJpbmcoY2FuZGlkYXRlLm5hbWUpICYmIElzLm51bWJlcihjYW5kaWRhdGUua2luZCkgJiZcbiAgICAgICAgICAgIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnNlbGVjdGlvblJhbmdlKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5kZXRhaWwgPT09IHVuZGVmaW5lZCB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLmRldGFpbCkpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmRlcHJlY2F0ZWQgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5kZXByZWNhdGVkKSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuY2hpbGRyZW4gPT09IHVuZGVmaW5lZCB8fCBBcnJheS5pc0FycmF5KGNhbmRpZGF0ZS5jaGlsZHJlbikpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLnRhZ3MgPT09IHVuZGVmaW5lZCB8fCBBcnJheS5pc0FycmF5KGNhbmRpZGF0ZS50YWdzKSk7XG4gICAgfVxuICAgIERvY3VtZW50U3ltYm9sLmlzID0gaXM7XG59KShEb2N1bWVudFN5bWJvbCB8fCAoRG9jdW1lbnRTeW1ib2wgPSB7fSkpO1xuLyoqXG4gKiBBIHNldCBvZiBwcmVkZWZpbmVkIGNvZGUgYWN0aW9uIGtpbmRzXG4gKi9cbmV4cG9ydCB2YXIgQ29kZUFjdGlvbktpbmQ7XG4oZnVuY3Rpb24gKENvZGVBY3Rpb25LaW5kKSB7XG4gICAgLyoqXG4gICAgICogRW1wdHkga2luZC5cbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5FbXB0eSA9ICcnO1xuICAgIC8qKlxuICAgICAqIEJhc2Uga2luZCBmb3IgcXVpY2tmaXggYWN0aW9uczogJ3F1aWNrZml4J1xuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlF1aWNrRml4ID0gJ3F1aWNrZml4JztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIHJlZmFjdG9yaW5nIGFjdGlvbnM6ICdyZWZhY3RvcidcbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5SZWZhY3RvciA9ICdyZWZhY3Rvcic7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciByZWZhY3RvcmluZyBleHRyYWN0aW9uIGFjdGlvbnM6ICdyZWZhY3Rvci5leHRyYWN0J1xuICAgICAqXG4gICAgICogRXhhbXBsZSBleHRyYWN0IGFjdGlvbnM6XG4gICAgICpcbiAgICAgKiAtIEV4dHJhY3QgbWV0aG9kXG4gICAgICogLSBFeHRyYWN0IGZ1bmN0aW9uXG4gICAgICogLSBFeHRyYWN0IHZhcmlhYmxlXG4gICAgICogLSBFeHRyYWN0IGludGVyZmFjZSBmcm9tIGNsYXNzXG4gICAgICogLSAuLi5cbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5SZWZhY3RvckV4dHJhY3QgPSAncmVmYWN0b3IuZXh0cmFjdCc7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciByZWZhY3RvcmluZyBpbmxpbmUgYWN0aW9uczogJ3JlZmFjdG9yLmlubGluZSdcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgaW5saW5lIGFjdGlvbnM6XG4gICAgICpcbiAgICAgKiAtIElubGluZSBmdW5jdGlvblxuICAgICAqIC0gSW5saW5lIHZhcmlhYmxlXG4gICAgICogLSBJbmxpbmUgY29uc3RhbnRcbiAgICAgKiAtIC4uLlxuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlJlZmFjdG9ySW5saW5lID0gJ3JlZmFjdG9yLmlubGluZSc7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciByZWZhY3RvcmluZyByZXdyaXRlIGFjdGlvbnM6ICdyZWZhY3Rvci5yZXdyaXRlJ1xuICAgICAqXG4gICAgICogRXhhbXBsZSByZXdyaXRlIGFjdGlvbnM6XG4gICAgICpcbiAgICAgKiAtIENvbnZlcnQgSmF2YVNjcmlwdCBmdW5jdGlvbiB0byBjbGFzc1xuICAgICAqIC0gQWRkIG9yIHJlbW92ZSBwYXJhbWV0ZXJcbiAgICAgKiAtIEVuY2Fwc3VsYXRlIGZpZWxkXG4gICAgICogLSBNYWtlIG1ldGhvZCBzdGF0aWNcbiAgICAgKiAtIE1vdmUgbWV0aG9kIHRvIGJhc2UgY2xhc3NcbiAgICAgKiAtIC4uLlxuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlJlZmFjdG9yUmV3cml0ZSA9ICdyZWZhY3Rvci5yZXdyaXRlJztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIHNvdXJjZSBhY3Rpb25zOiBgc291cmNlYFxuICAgICAqXG4gICAgICogU291cmNlIGNvZGUgYWN0aW9ucyBhcHBseSB0byB0aGUgZW50aXJlIGZpbGUuXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuU291cmNlID0gJ3NvdXJjZSc7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciBhbiBvcmdhbml6ZSBpbXBvcnRzIHNvdXJjZSBhY3Rpb246IGBzb3VyY2Uub3JnYW5pemVJbXBvcnRzYFxuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlNvdXJjZU9yZ2FuaXplSW1wb3J0cyA9ICdzb3VyY2Uub3JnYW5pemVJbXBvcnRzJztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIGF1dG8tZml4IHNvdXJjZSBhY3Rpb25zOiBgc291cmNlLmZpeEFsbGAuXG4gICAgICpcbiAgICAgKiBGaXggYWxsIGFjdGlvbnMgYXV0b21hdGljYWxseSBmaXggZXJyb3JzIHRoYXQgaGF2ZSBhIGNsZWFyIGZpeCB0aGF0IGRvIG5vdCByZXF1aXJlIHVzZXIgaW5wdXQuXG4gICAgICogVGhleSBzaG91bGQgbm90IHN1cHByZXNzIGVycm9ycyBvciBwZXJmb3JtIHVuc2FmZSBmaXhlcyBzdWNoIGFzIGdlbmVyYXRpbmcgbmV3IHR5cGVzIG9yIGNsYXNzZXMuXG4gICAgICpcbiAgICAgKiBAc2luY2UgMy4xNS4wXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuU291cmNlRml4QWxsID0gJ3NvdXJjZS5maXhBbGwnO1xufSkoQ29kZUFjdGlvbktpbmQgfHwgKENvZGVBY3Rpb25LaW5kID0ge30pKTtcbi8qKlxuICogVGhlIHJlYXNvbiB3aHkgY29kZSBhY3Rpb25zIHdlcmUgcmVxdWVzdGVkLlxuICpcbiAqIEBzaW5jZSAzLjE3LjBcbiAqL1xuZXhwb3J0IHZhciBDb2RlQWN0aW9uVHJpZ2dlcktpbmQ7XG4oZnVuY3Rpb24gKENvZGVBY3Rpb25UcmlnZ2VyS2luZCkge1xuICAgIC8qKlxuICAgICAqIENvZGUgYWN0aW9ucyB3ZXJlIGV4cGxpY2l0bHkgcmVxdWVzdGVkIGJ5IHRoZSB1c2VyIG9yIGJ5IGFuIGV4dGVuc2lvbi5cbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uVHJpZ2dlcktpbmQuSW52b2tlZCA9IDE7XG4gICAgLyoqXG4gICAgICogQ29kZSBhY3Rpb25zIHdlcmUgcmVxdWVzdGVkIGF1dG9tYXRpY2FsbHkuXG4gICAgICpcbiAgICAgKiBUaGlzIHR5cGljYWxseSBoYXBwZW5zIHdoZW4gY3VycmVudCBzZWxlY3Rpb24gaW4gYSBmaWxlIGNoYW5nZXMsIGJ1dCBjYW5cbiAgICAgKiBhbHNvIGJlIHRyaWdnZXJlZCB3aGVuIGZpbGUgY29udGVudCBjaGFuZ2VzLlxuICAgICAqL1xuICAgIENvZGVBY3Rpb25UcmlnZ2VyS2luZC5BdXRvbWF0aWMgPSAyO1xufSkoQ29kZUFjdGlvblRyaWdnZXJLaW5kIHx8IChDb2RlQWN0aW9uVHJpZ2dlcktpbmQgPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29kZUFjdGlvbkNvbnRleHQgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgQ29kZUFjdGlvbkNvbnRleHR9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIENvZGVBY3Rpb25Db250ZXh0O1xuKGZ1bmN0aW9uIChDb2RlQWN0aW9uQ29udGV4dCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ29kZUFjdGlvbkNvbnRleHQgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUoZGlhZ25vc3RpY3MsIG9ubHksIHRyaWdnZXJLaW5kKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IGRpYWdub3N0aWNzIH07XG4gICAgICAgIGlmIChvbmx5ICE9PSB1bmRlZmluZWQgJiYgb25seSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmVzdWx0Lm9ubHkgPSBvbmx5O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmlnZ2VyS2luZCAhPT0gdW5kZWZpbmVkICYmIHRyaWdnZXJLaW5kICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXN1bHQudHJpZ2dlcktpbmQgPSB0cmlnZ2VyS2luZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBDb2RlQWN0aW9uQ29udGV4dC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBDb2RlQWN0aW9uQ29udGV4dH0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS5kaWFnbm9zdGljcywgRGlhZ25vc3RpYy5pcylcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUub25seSA9PT0gdW5kZWZpbmVkIHx8IElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLm9ubHksIElzLnN0cmluZykpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLnRyaWdnZXJLaW5kID09PSB1bmRlZmluZWQgfHwgY2FuZGlkYXRlLnRyaWdnZXJLaW5kID09PSBDb2RlQWN0aW9uVHJpZ2dlcktpbmQuSW52b2tlZCB8fCBjYW5kaWRhdGUudHJpZ2dlcktpbmQgPT09IENvZGVBY3Rpb25UcmlnZ2VyS2luZC5BdXRvbWF0aWMpO1xuICAgIH1cbiAgICBDb2RlQWN0aW9uQ29udGV4dC5pcyA9IGlzO1xufSkoQ29kZUFjdGlvbkNvbnRleHQgfHwgKENvZGVBY3Rpb25Db250ZXh0ID0ge30pKTtcbmV4cG9ydCB2YXIgQ29kZUFjdGlvbjtcbihmdW5jdGlvbiAoQ29kZUFjdGlvbikge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh0aXRsZSwga2luZE9yQ29tbWFuZE9yRWRpdCwga2luZCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0geyB0aXRsZSB9O1xuICAgICAgICBsZXQgY2hlY2tLaW5kID0gdHJ1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBraW5kT3JDb21tYW5kT3JFZGl0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY2hlY2tLaW5kID0gZmFsc2U7XG4gICAgICAgICAgICByZXN1bHQua2luZCA9IGtpbmRPckNvbW1hbmRPckVkaXQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoQ29tbWFuZC5pcyhraW5kT3JDb21tYW5kT3JFZGl0KSkge1xuICAgICAgICAgICAgcmVzdWx0LmNvbW1hbmQgPSBraW5kT3JDb21tYW5kT3JFZGl0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0LmVkaXQgPSBraW5kT3JDb21tYW5kT3JFZGl0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGVja0tpbmQgJiYga2luZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQua2luZCA9IGtpbmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgQ29kZUFjdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLnN0cmluZyhjYW5kaWRhdGUudGl0bGUpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmRpYWdub3N0aWNzID09PSB1bmRlZmluZWQgfHwgSXMudHlwZWRBcnJheShjYW5kaWRhdGUuZGlhZ25vc3RpY3MsIERpYWdub3N0aWMuaXMpKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5raW5kID09PSB1bmRlZmluZWQgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS5raW5kKSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuZWRpdCAhPT0gdW5kZWZpbmVkIHx8IGNhbmRpZGF0ZS5jb21tYW5kICE9PSB1bmRlZmluZWQpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmNvbW1hbmQgPT09IHVuZGVmaW5lZCB8fCBDb21tYW5kLmlzKGNhbmRpZGF0ZS5jb21tYW5kKSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuaXNQcmVmZXJyZWQgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5pc1ByZWZlcnJlZCkpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmVkaXQgPT09IHVuZGVmaW5lZCB8fCBXb3Jrc3BhY2VFZGl0LmlzKGNhbmRpZGF0ZS5lZGl0KSk7XG4gICAgfVxuICAgIENvZGVBY3Rpb24uaXMgPSBpcztcbn0pKENvZGVBY3Rpb24gfHwgKENvZGVBY3Rpb24gPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29kZUxlbnMgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgQ29kZUxlbnN9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIENvZGVMZW5zO1xuKGZ1bmN0aW9uIChDb2RlTGVucykge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ29kZUxlbnMgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIGRhdGEpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHsgcmFuZ2UgfTtcbiAgICAgICAgaWYgKElzLmRlZmluZWQoZGF0YSkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5kYXRhID0gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBDb2RlTGVucy5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBDb2RlTGVuc30gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLmNvbW1hbmQpIHx8IENvbW1hbmQuaXMoY2FuZGlkYXRlLmNvbW1hbmQpKTtcbiAgICB9XG4gICAgQ29kZUxlbnMuaXMgPSBpcztcbn0pKENvZGVMZW5zIHx8IChDb2RlTGVucyA9IHt9KSk7XG4vKipcbiAqIFRoZSBGb3JtYXR0aW5nT3B0aW9ucyBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBGb3JtYXR0aW5nT3B0aW9uc30gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgRm9ybWF0dGluZ09wdGlvbnM7XG4oZnVuY3Rpb24gKEZvcm1hdHRpbmdPcHRpb25zKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBGb3JtYXR0aW5nT3B0aW9ucyBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh0YWJTaXplLCBpbnNlcnRTcGFjZXMpIHtcbiAgICAgICAgcmV0dXJuIHsgdGFiU2l6ZSwgaW5zZXJ0U3BhY2VzIH07XG4gICAgfVxuICAgIEZvcm1hdHRpbmdPcHRpb25zLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIEZvcm1hdHRpbmdPcHRpb25zfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS50YWJTaXplKSAmJiBJcy5ib29sZWFuKGNhbmRpZGF0ZS5pbnNlcnRTcGFjZXMpO1xuICAgIH1cbiAgICBGb3JtYXR0aW5nT3B0aW9ucy5pcyA9IGlzO1xufSkoRm9ybWF0dGluZ09wdGlvbnMgfHwgKEZvcm1hdHRpbmdPcHRpb25zID0ge30pKTtcbi8qKlxuICogVGhlIERvY3VtZW50TGluayBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBEb2N1bWVudExpbmt9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIERvY3VtZW50TGluaztcbihmdW5jdGlvbiAoRG9jdW1lbnRMaW5rKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBEb2N1bWVudExpbmsgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIHRhcmdldCwgZGF0YSkge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgdGFyZ2V0LCBkYXRhIH07XG4gICAgfVxuICAgIERvY3VtZW50TGluay5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBEb2N1bWVudExpbmt9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS50YXJnZXQpIHx8IElzLnN0cmluZyhjYW5kaWRhdGUudGFyZ2V0KSk7XG4gICAgfVxuICAgIERvY3VtZW50TGluay5pcyA9IGlzO1xufSkoRG9jdW1lbnRMaW5rIHx8IChEb2N1bWVudExpbmsgPSB7fSkpO1xuLyoqXG4gKiBUaGUgU2VsZWN0aW9uUmFuZ2UgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbiB0byB3b3JrIHdpdGhcbiAqIFNlbGVjdGlvblJhbmdlIGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIFNlbGVjdGlvblJhbmdlO1xuKGZ1bmN0aW9uIChTZWxlY3Rpb25SYW5nZSkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgU2VsZWN0aW9uUmFuZ2VcbiAgICAgKiBAcGFyYW0gcmFuZ2UgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSBwYXJlbnQgYW4gb3B0aW9uYWwgcGFyZW50LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgcGFyZW50KSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCBwYXJlbnQgfTtcbiAgICB9XG4gICAgU2VsZWN0aW9uUmFuZ2UuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIChjYW5kaWRhdGUucGFyZW50ID09PSB1bmRlZmluZWQgfHwgU2VsZWN0aW9uUmFuZ2UuaXMoY2FuZGlkYXRlLnBhcmVudCkpO1xuICAgIH1cbiAgICBTZWxlY3Rpb25SYW5nZS5pcyA9IGlzO1xufSkoU2VsZWN0aW9uUmFuZ2UgfHwgKFNlbGVjdGlvblJhbmdlID0ge30pKTtcbi8qKlxuICogQSBzZXQgb2YgcHJlZGVmaW5lZCB0b2tlbiB0eXBlcy4gVGhpcyBzZXQgaXMgbm90IGZpeGVkXG4gKiBhbiBjbGllbnRzIGNhbiBzcGVjaWZ5IGFkZGl0aW9uYWwgdG9rZW4gdHlwZXMgdmlhIHRoZVxuICogY29ycmVzcG9uZGluZyBjbGllbnQgY2FwYWJpbGl0aWVzLlxuICpcbiAqIEBzaW5jZSAzLjE2LjBcbiAqL1xuZXhwb3J0IHZhciBTZW1hbnRpY1Rva2VuVHlwZXM7XG4oZnVuY3Rpb24gKFNlbWFudGljVG9rZW5UeXBlcykge1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcIm5hbWVzcGFjZVwiXSA9IFwibmFtZXNwYWNlXCI7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIGdlbmVyaWMgdHlwZS4gQWN0cyBhcyBhIGZhbGxiYWNrIGZvciB0eXBlcyB3aGljaCBjYW4ndCBiZSBtYXBwZWQgdG9cbiAgICAgKiBhIHNwZWNpZmljIHR5cGUgbGlrZSBjbGFzcyBvciBlbnVtLlxuICAgICAqL1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInR5cGVcIl0gPSBcInR5cGVcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJjbGFzc1wiXSA9IFwiY2xhc3NcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJlbnVtXCJdID0gXCJlbnVtXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wiaW50ZXJmYWNlXCJdID0gXCJpbnRlcmZhY2VcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJzdHJ1Y3RcIl0gPSBcInN0cnVjdFwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInR5cGVQYXJhbWV0ZXJcIl0gPSBcInR5cGVQYXJhbWV0ZXJcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJwYXJhbWV0ZXJcIl0gPSBcInBhcmFtZXRlclwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInZhcmlhYmxlXCJdID0gXCJ2YXJpYWJsZVwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInByb3BlcnR5XCJdID0gXCJwcm9wZXJ0eVwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImVudW1NZW1iZXJcIl0gPSBcImVudW1NZW1iZXJcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJldmVudFwiXSA9IFwiZXZlbnRcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJmdW5jdGlvblwiXSA9IFwiZnVuY3Rpb25cIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJtZXRob2RcIl0gPSBcIm1ldGhvZFwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcIm1hY3JvXCJdID0gXCJtYWNyb1wiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImtleXdvcmRcIl0gPSBcImtleXdvcmRcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJtb2RpZmllclwiXSA9IFwibW9kaWZpZXJcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJjb21tZW50XCJdID0gXCJjb21tZW50XCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wic3RyaW5nXCJdID0gXCJzdHJpbmdcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJudW1iZXJcIl0gPSBcIm51bWJlclwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInJlZ2V4cFwiXSA9IFwicmVnZXhwXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wib3BlcmF0b3JcIl0gPSBcIm9wZXJhdG9yXCI7XG4gICAgLyoqXG4gICAgICogQHNpbmNlIDMuMTcuMFxuICAgICAqL1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImRlY29yYXRvclwiXSA9IFwiZGVjb3JhdG9yXCI7XG59KShTZW1hbnRpY1Rva2VuVHlwZXMgfHwgKFNlbWFudGljVG9rZW5UeXBlcyA9IHt9KSk7XG4vKipcbiAqIEEgc2V0IG9mIHByZWRlZmluZWQgdG9rZW4gbW9kaWZpZXJzLiBUaGlzIHNldCBpcyBub3QgZml4ZWRcbiAqIGFuIGNsaWVudHMgY2FuIHNwZWNpZnkgYWRkaXRpb25hbCB0b2tlbiB0eXBlcyB2aWEgdGhlXG4gKiBjb3JyZXNwb25kaW5nIGNsaWVudCBjYXBhYmlsaXRpZXMuXG4gKlxuICogQHNpbmNlIDMuMTYuMFxuICovXG5leHBvcnQgdmFyIFNlbWFudGljVG9rZW5Nb2RpZmllcnM7XG4oZnVuY3Rpb24gKFNlbWFudGljVG9rZW5Nb2RpZmllcnMpIHtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wiZGVjbGFyYXRpb25cIl0gPSBcImRlY2xhcmF0aW9uXCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcImRlZmluaXRpb25cIl0gPSBcImRlZmluaXRpb25cIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wicmVhZG9ubHlcIl0gPSBcInJlYWRvbmx5XCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcInN0YXRpY1wiXSA9IFwic3RhdGljXCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcImRlcHJlY2F0ZWRcIl0gPSBcImRlcHJlY2F0ZWRcIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wiYWJzdHJhY3RcIl0gPSBcImFic3RyYWN0XCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcImFzeW5jXCJdID0gXCJhc3luY1wiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJtb2RpZmljYXRpb25cIl0gPSBcIm1vZGlmaWNhdGlvblwiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJkb2N1bWVudGF0aW9uXCJdID0gXCJkb2N1bWVudGF0aW9uXCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcImRlZmF1bHRMaWJyYXJ5XCJdID0gXCJkZWZhdWx0TGlicmFyeVwiO1xufSkoU2VtYW50aWNUb2tlbk1vZGlmaWVycyB8fCAoU2VtYW50aWNUb2tlbk1vZGlmaWVycyA9IHt9KSk7XG4vKipcbiAqIEBzaW5jZSAzLjE2LjBcbiAqL1xuZXhwb3J0IHZhciBTZW1hbnRpY1Rva2VucztcbihmdW5jdGlvbiAoU2VtYW50aWNUb2tlbnMpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiAoY2FuZGlkYXRlLnJlc3VsdElkID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIGNhbmRpZGF0ZS5yZXN1bHRJZCA9PT0gJ3N0cmluZycpICYmXG4gICAgICAgICAgICBBcnJheS5pc0FycmF5KGNhbmRpZGF0ZS5kYXRhKSAmJiAoY2FuZGlkYXRlLmRhdGEubGVuZ3RoID09PSAwIHx8IHR5cGVvZiBjYW5kaWRhdGUuZGF0YVswXSA9PT0gJ251bWJlcicpO1xuICAgIH1cbiAgICBTZW1hbnRpY1Rva2Vucy5pcyA9IGlzO1xufSkoU2VtYW50aWNUb2tlbnMgfHwgKFNlbWFudGljVG9rZW5zID0ge30pKTtcbi8qKlxuICogVGhlIElubGluZVZhbHVlVGV4dCBuYW1lc3BhY2UgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCBJbmxpbmVWYWx1ZVRleHRzLlxuICpcbiAqIEBzaW5jZSAzLjE3LjBcbiAqL1xuZXhwb3J0IHZhciBJbmxpbmVWYWx1ZVRleHQ7XG4oZnVuY3Rpb24gKElubGluZVZhbHVlVGV4dCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgSW5saW5lVmFsdWVUZXh0IGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCB0ZXh0KSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCB0ZXh0IH07XG4gICAgfVxuICAgIElubGluZVZhbHVlVGV4dC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgIT09IHVuZGVmaW5lZCAmJiBjYW5kaWRhdGUgIT09IG51bGwgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnRleHQpO1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZVRleHQuaXMgPSBpcztcbn0pKElubGluZVZhbHVlVGV4dCB8fCAoSW5saW5lVmFsdWVUZXh0ID0ge30pKTtcbi8qKlxuICogVGhlIElubGluZVZhbHVlVmFyaWFibGVMb29rdXAgbmFtZXNwYWNlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGggSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cHMuXG4gKlxuICogQHNpbmNlIDMuMTcuMFxuICovXG5leHBvcnQgdmFyIElubGluZVZhbHVlVmFyaWFibGVMb29rdXA7XG4oZnVuY3Rpb24gKElubGluZVZhbHVlVmFyaWFibGVMb29rdXApIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IElubGluZVZhbHVlVGV4dCBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgdmFyaWFibGVOYW1lLCBjYXNlU2Vuc2l0aXZlTG9va3VwKSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCB2YXJpYWJsZU5hbWUsIGNhc2VTZW5zaXRpdmVMb29rdXAgfTtcbiAgICB9XG4gICAgSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgIT09IHVuZGVmaW5lZCAmJiBjYW5kaWRhdGUgIT09IG51bGwgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiBJcy5ib29sZWFuKGNhbmRpZGF0ZS5jYXNlU2Vuc2l0aXZlTG9va3VwKVxuICAgICAgICAgICAgJiYgKElzLnN0cmluZyhjYW5kaWRhdGUudmFyaWFibGVOYW1lKSB8fCBjYW5kaWRhdGUudmFyaWFibGVOYW1lID09PSB1bmRlZmluZWQpO1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwLmlzID0gaXM7XG59KShJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwIHx8IChJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwID0ge30pKTtcbi8qKlxuICogVGhlIElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uIG5hbWVzcGFjZSBwcm92aWRlcyBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uLlxuICpcbiAqIEBzaW5jZSAzLjE3LjBcbiAqL1xuZXhwb3J0IHZhciBJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbjtcbihmdW5jdGlvbiAoSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCBleHByZXNzaW9uKSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCBleHByZXNzaW9uIH07XG4gICAgfVxuICAgIElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAhPT0gdW5kZWZpbmVkICYmIGNhbmRpZGF0ZSAhPT0gbnVsbCAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpXG4gICAgICAgICAgICAmJiAoSXMuc3RyaW5nKGNhbmRpZGF0ZS5leHByZXNzaW9uKSB8fCBjYW5kaWRhdGUuZXhwcmVzc2lvbiA9PT0gdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24uaXMgPSBpcztcbn0pKElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uIHx8IChJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBJbmxpbmVWYWx1ZUNvbnRleHQgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgSW5saW5lVmFsdWVDb250ZXh0fSBsaXRlcmFscy5cbiAqXG4gKiBAc2luY2UgMy4xNy4wXG4gKi9cbmV4cG9ydCB2YXIgSW5saW5lVmFsdWVDb250ZXh0O1xuKGZ1bmN0aW9uIChJbmxpbmVWYWx1ZUNvbnRleHQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IElubGluZVZhbHVlQ29udGV4dCBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShmcmFtZUlkLCBzdG9wcGVkTG9jYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHsgZnJhbWVJZCwgc3RvcHBlZExvY2F0aW9uIH07XG4gICAgfVxuICAgIElubGluZVZhbHVlQ29udGV4dC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBJbmxpbmVWYWx1ZUNvbnRleHR9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyh2YWx1ZS5zdG9wcGVkTG9jYXRpb24pO1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZUNvbnRleHQuaXMgPSBpcztcbn0pKElubGluZVZhbHVlQ29udGV4dCB8fCAoSW5saW5lVmFsdWVDb250ZXh0ID0ge30pKTtcbi8qKlxuICogSW5sYXkgaGludCBraW5kcy5cbiAqXG4gKiBAc2luY2UgMy4xNy4wXG4gKi9cbmV4cG9ydCB2YXIgSW5sYXlIaW50S2luZDtcbihmdW5jdGlvbiAoSW5sYXlIaW50S2luZCkge1xuICAgIC8qKlxuICAgICAqIEFuIGlubGF5IGhpbnQgdGhhdCBmb3IgYSB0eXBlIGFubm90YXRpb24uXG4gICAgICovXG4gICAgSW5sYXlIaW50S2luZC5UeXBlID0gMTtcbiAgICAvKipcbiAgICAgKiBBbiBpbmxheSBoaW50IHRoYXQgaXMgZm9yIGEgcGFyYW1ldGVyLlxuICAgICAqL1xuICAgIElubGF5SGludEtpbmQuUGFyYW1ldGVyID0gMjtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWUgPT09IDEgfHwgdmFsdWUgPT09IDI7XG4gICAgfVxuICAgIElubGF5SGludEtpbmQuaXMgPSBpcztcbn0pKElubGF5SGludEtpbmQgfHwgKElubGF5SGludEtpbmQgPSB7fSkpO1xuZXhwb3J0IHZhciBJbmxheUhpbnRMYWJlbFBhcnQ7XG4oZnVuY3Rpb24gKElubGF5SGludExhYmVsUGFydCkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh2YWx1ZSkge1xuICAgICAgICByZXR1cm4geyB2YWx1ZSB9O1xuICAgIH1cbiAgICBJbmxheUhpbnRMYWJlbFBhcnQuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLnRvb2x0aXAgPT09IHVuZGVmaW5lZCB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLnRvb2x0aXApIHx8IE1hcmt1cENvbnRlbnQuaXMoY2FuZGlkYXRlLnRvb2x0aXApKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS5sb2NhdGlvbiA9PT0gdW5kZWZpbmVkIHx8IExvY2F0aW9uLmlzKGNhbmRpZGF0ZS5sb2NhdGlvbikpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLmNvbW1hbmQgPT09IHVuZGVmaW5lZCB8fCBDb21tYW5kLmlzKGNhbmRpZGF0ZS5jb21tYW5kKSk7XG4gICAgfVxuICAgIElubGF5SGludExhYmVsUGFydC5pcyA9IGlzO1xufSkoSW5sYXlIaW50TGFiZWxQYXJ0IHx8IChJbmxheUhpbnRMYWJlbFBhcnQgPSB7fSkpO1xuZXhwb3J0IHZhciBJbmxheUhpbnQ7XG4oZnVuY3Rpb24gKElubGF5SGludCkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShwb3NpdGlvbiwgbGFiZWwsIGtpbmQpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0geyBwb3NpdGlvbiwgbGFiZWwgfTtcbiAgICAgICAgaWYgKGtpbmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmtpbmQgPSBraW5kO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIElubGF5SGludC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgUG9zaXRpb24uaXMoY2FuZGlkYXRlLnBvc2l0aW9uKVxuICAgICAgICAgICAgJiYgKElzLnN0cmluZyhjYW5kaWRhdGUubGFiZWwpIHx8IElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLmxhYmVsLCBJbmxheUhpbnRMYWJlbFBhcnQuaXMpKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS5raW5kID09PSB1bmRlZmluZWQgfHwgSW5sYXlIaW50S2luZC5pcyhjYW5kaWRhdGUua2luZCkpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLnRleHRFZGl0cyA9PT0gdW5kZWZpbmVkKSB8fCBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS50ZXh0RWRpdHMsIFRleHRFZGl0LmlzKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS50b29sdGlwID09PSB1bmRlZmluZWQgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS50b29sdGlwKSB8fCBNYXJrdXBDb250ZW50LmlzKGNhbmRpZGF0ZS50b29sdGlwKSlcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUucGFkZGluZ0xlZnQgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5wYWRkaW5nTGVmdCkpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLnBhZGRpbmdSaWdodCA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLnBhZGRpbmdSaWdodCkpO1xuICAgIH1cbiAgICBJbmxheUhpbnQuaXMgPSBpcztcbn0pKElubGF5SGludCB8fCAoSW5sYXlIaW50ID0ge30pKTtcbmV4cG9ydCB2YXIgU3RyaW5nVmFsdWU7XG4oZnVuY3Rpb24gKFN0cmluZ1ZhbHVlKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlU25pcHBldCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4geyBraW5kOiAnc25pcHBldCcsIHZhbHVlIH07XG4gICAgfVxuICAgIFN0cmluZ1ZhbHVlLmNyZWF0ZVNuaXBwZXQgPSBjcmVhdGVTbmlwcGV0O1xufSkoU3RyaW5nVmFsdWUgfHwgKFN0cmluZ1ZhbHVlID0ge30pKTtcbmV4cG9ydCB2YXIgSW5saW5lQ29tcGxldGlvbkl0ZW07XG4oZnVuY3Rpb24gKElubGluZUNvbXBsZXRpb25JdGVtKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKGluc2VydFRleHQsIGZpbHRlclRleHQsIHJhbmdlLCBjb21tYW5kKSB7XG4gICAgICAgIHJldHVybiB7IGluc2VydFRleHQsIGZpbHRlclRleHQsIHJhbmdlLCBjb21tYW5kIH07XG4gICAgfVxuICAgIElubGluZUNvbXBsZXRpb25JdGVtLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKElubGluZUNvbXBsZXRpb25JdGVtIHx8IChJbmxpbmVDb21wbGV0aW9uSXRlbSA9IHt9KSk7XG5leHBvcnQgdmFyIElubGluZUNvbXBsZXRpb25MaXN0O1xuKGZ1bmN0aW9uIChJbmxpbmVDb21wbGV0aW9uTGlzdCkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShpdGVtcykge1xuICAgICAgICByZXR1cm4geyBpdGVtcyB9O1xuICAgIH1cbiAgICBJbmxpbmVDb21wbGV0aW9uTGlzdC5jcmVhdGUgPSBjcmVhdGU7XG59KShJbmxpbmVDb21wbGV0aW9uTGlzdCB8fCAoSW5saW5lQ29tcGxldGlvbkxpc3QgPSB7fSkpO1xuLyoqXG4gKiBEZXNjcmliZXMgaG93IGFuIHtAbGluayBJbmxpbmVDb21wbGV0aW9uSXRlbVByb3ZpZGVyIGlubGluZSBjb21wbGV0aW9uIHByb3ZpZGVyfSB3YXMgdHJpZ2dlcmVkLlxuICpcbiAqIEBzaW5jZSAzLjE4LjBcbiAqIEBwcm9wb3NlZFxuICovXG5leHBvcnQgdmFyIElubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZDtcbihmdW5jdGlvbiAoSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kKSB7XG4gICAgLyoqXG4gICAgICogQ29tcGxldGlvbiB3YXMgdHJpZ2dlcmVkIGV4cGxpY2l0bHkgYnkgYSB1c2VyIGdlc3R1cmUuXG4gICAgICovXG4gICAgSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kLkludm9rZWQgPSAwO1xuICAgIC8qKlxuICAgICAqIENvbXBsZXRpb24gd2FzIHRyaWdnZXJlZCBhdXRvbWF0aWNhbGx5IHdoaWxlIGVkaXRpbmcuXG4gICAgICovXG4gICAgSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kLkF1dG9tYXRpYyA9IDE7XG59KShJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmQgfHwgKElubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZCA9IHt9KSk7XG5leHBvcnQgdmFyIFNlbGVjdGVkQ29tcGxldGlvbkluZm87XG4oZnVuY3Rpb24gKFNlbGVjdGVkQ29tcGxldGlvbkluZm8pIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIHRleHQpIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIHRleHQgfTtcbiAgICB9XG4gICAgU2VsZWN0ZWRDb21wbGV0aW9uSW5mby5jcmVhdGUgPSBjcmVhdGU7XG59KShTZWxlY3RlZENvbXBsZXRpb25JbmZvIHx8IChTZWxlY3RlZENvbXBsZXRpb25JbmZvID0ge30pKTtcbmV4cG9ydCB2YXIgSW5saW5lQ29tcGxldGlvbkNvbnRleHQ7XG4oZnVuY3Rpb24gKElubGluZUNvbXBsZXRpb25Db250ZXh0KSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKHRyaWdnZXJLaW5kLCBzZWxlY3RlZENvbXBsZXRpb25JbmZvKSB7XG4gICAgICAgIHJldHVybiB7IHRyaWdnZXJLaW5kLCBzZWxlY3RlZENvbXBsZXRpb25JbmZvIH07XG4gICAgfVxuICAgIElubGluZUNvbXBsZXRpb25Db250ZXh0LmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKElubGluZUNvbXBsZXRpb25Db250ZXh0IHx8IChJbmxpbmVDb21wbGV0aW9uQ29udGV4dCA9IHt9KSk7XG5leHBvcnQgdmFyIFdvcmtzcGFjZUZvbGRlcjtcbihmdW5jdGlvbiAoV29ya3NwYWNlRm9sZGVyKSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgVVJJLmlzKGNhbmRpZGF0ZS51cmkpICYmIElzLnN0cmluZyhjYW5kaWRhdGUubmFtZSk7XG4gICAgfVxuICAgIFdvcmtzcGFjZUZvbGRlci5pcyA9IGlzO1xufSkoV29ya3NwYWNlRm9sZGVyIHx8IChXb3Jrc3BhY2VGb2xkZXIgPSB7fSkpO1xuZXhwb3J0IGNvbnN0IEVPTCA9IFsnXFxuJywgJ1xcclxcbicsICdcXHInXTtcbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHRoZSB0ZXh0IGRvY3VtZW50IGZyb20gdGhlIG5ldyB2c2NvZGUtbGFuZ3VhZ2VzZXJ2ZXItdGV4dGRvY3VtZW50IHBhY2thZ2UuXG4gKi9cbmV4cG9ydCB2YXIgVGV4dERvY3VtZW50O1xuKGZ1bmN0aW9uIChUZXh0RG9jdW1lbnQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IElUZXh0RG9jdW1lbnQgbGl0ZXJhbCBmcm9tIHRoZSBnaXZlbiB1cmkgYW5kIGNvbnRlbnQuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgZG9jdW1lbnQncyB1cmkuXG4gICAgICogQHBhcmFtIGxhbmd1YWdlSWQgVGhlIGRvY3VtZW50J3MgbGFuZ3VhZ2UgSWQuXG4gICAgICogQHBhcmFtIHZlcnNpb24gVGhlIGRvY3VtZW50J3MgdmVyc2lvbi5cbiAgICAgKiBAcGFyYW0gY29udGVudCBUaGUgZG9jdW1lbnQncyBjb250ZW50LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmksIGxhbmd1YWdlSWQsIHZlcnNpb24sIGNvbnRlbnQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGdWxsVGV4dERvY3VtZW50KHVyaSwgbGFuZ3VhZ2VJZCwgdmVyc2lvbiwgY29udGVudCk7XG4gICAgfVxuICAgIFRleHREb2N1bWVudC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBJVGV4dERvY3VtZW50fSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudXJpKSAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5sYW5ndWFnZUlkKSB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLmxhbmd1YWdlSWQpKSAmJiBJcy51aW50ZWdlcihjYW5kaWRhdGUubGluZUNvdW50KVxuICAgICAgICAgICAgJiYgSXMuZnVuYyhjYW5kaWRhdGUuZ2V0VGV4dCkgJiYgSXMuZnVuYyhjYW5kaWRhdGUucG9zaXRpb25BdCkgJiYgSXMuZnVuYyhjYW5kaWRhdGUub2Zmc2V0QXQpID8gdHJ1ZSA6IGZhbHNlO1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnQuaXMgPSBpcztcbiAgICBmdW5jdGlvbiBhcHBseUVkaXRzKGRvY3VtZW50LCBlZGl0cykge1xuICAgICAgICBsZXQgdGV4dCA9IGRvY3VtZW50LmdldFRleHQoKTtcbiAgICAgICAgbGV0IHNvcnRlZEVkaXRzID0gbWVyZ2VTb3J0KGVkaXRzLCAoYSwgYikgPT4ge1xuICAgICAgICAgICAgbGV0IGRpZmYgPSBhLnJhbmdlLnN0YXJ0LmxpbmUgLSBiLnJhbmdlLnN0YXJ0LmxpbmU7XG4gICAgICAgICAgICBpZiAoZGlmZiA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhLnJhbmdlLnN0YXJ0LmNoYXJhY3RlciAtIGIucmFuZ2Uuc3RhcnQuY2hhcmFjdGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRpZmY7XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgbGFzdE1vZGlmaWVkT2Zmc2V0ID0gdGV4dC5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGkgPSBzb3J0ZWRFZGl0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgbGV0IGUgPSBzb3J0ZWRFZGl0c1tpXTtcbiAgICAgICAgICAgIGxldCBzdGFydE9mZnNldCA9IGRvY3VtZW50Lm9mZnNldEF0KGUucmFuZ2Uuc3RhcnQpO1xuICAgICAgICAgICAgbGV0IGVuZE9mZnNldCA9IGRvY3VtZW50Lm9mZnNldEF0KGUucmFuZ2UuZW5kKTtcbiAgICAgICAgICAgIGlmIChlbmRPZmZzZXQgPD0gbGFzdE1vZGlmaWVkT2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIHN0YXJ0T2Zmc2V0KSArIGUubmV3VGV4dCArIHRleHQuc3Vic3RyaW5nKGVuZE9mZnNldCwgdGV4dC5sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdPdmVybGFwcGluZyBlZGl0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsYXN0TW9kaWZpZWRPZmZzZXQgPSBzdGFydE9mZnNldDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50LmFwcGx5RWRpdHMgPSBhcHBseUVkaXRzO1xuICAgIGZ1bmN0aW9uIG1lcmdlU29ydChkYXRhLCBjb21wYXJlKSB7XG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCA8PSAxKSB7XG4gICAgICAgICAgICAvLyBzb3J0ZWRcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHAgPSAoZGF0YS5sZW5ndGggLyAyKSB8IDA7XG4gICAgICAgIGNvbnN0IGxlZnQgPSBkYXRhLnNsaWNlKDAsIHApO1xuICAgICAgICBjb25zdCByaWdodCA9IGRhdGEuc2xpY2UocCk7XG4gICAgICAgIG1lcmdlU29ydChsZWZ0LCBjb21wYXJlKTtcbiAgICAgICAgbWVyZ2VTb3J0KHJpZ2h0LCBjb21wYXJlKTtcbiAgICAgICAgbGV0IGxlZnRJZHggPSAwO1xuICAgICAgICBsZXQgcmlnaHRJZHggPSAwO1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIHdoaWxlIChsZWZ0SWR4IDwgbGVmdC5sZW5ndGggJiYgcmlnaHRJZHggPCByaWdodC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCByZXQgPSBjb21wYXJlKGxlZnRbbGVmdElkeF0sIHJpZ2h0W3JpZ2h0SWR4XSk7XG4gICAgICAgICAgICBpZiAocmV0IDw9IDApIHtcbiAgICAgICAgICAgICAgICAvLyBzbWFsbGVyX2VxdWFsIC0+IHRha2UgbGVmdCB0byBwcmVzZXJ2ZSBvcmRlclxuICAgICAgICAgICAgICAgIGRhdGFbaSsrXSA9IGxlZnRbbGVmdElkeCsrXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGdyZWF0ZXIgLT4gdGFrZSByaWdodFxuICAgICAgICAgICAgICAgIGRhdGFbaSsrXSA9IHJpZ2h0W3JpZ2h0SWR4KytdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChsZWZ0SWR4IDwgbGVmdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRhdGFbaSsrXSA9IGxlZnRbbGVmdElkeCsrXTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAocmlnaHRJZHggPCByaWdodC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRhdGFbaSsrXSA9IHJpZ2h0W3JpZ2h0SWR4KytdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbn0pKFRleHREb2N1bWVudCB8fCAoVGV4dERvY3VtZW50ID0ge30pKTtcbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHRoZSB0ZXh0IGRvY3VtZW50IGZyb20gdGhlIG5ldyB2c2NvZGUtbGFuZ3VhZ2VzZXJ2ZXItdGV4dGRvY3VtZW50IHBhY2thZ2UuXG4gKi9cbmNsYXNzIEZ1bGxUZXh0RG9jdW1lbnQge1xuICAgIGNvbnN0cnVjdG9yKHVyaSwgbGFuZ3VhZ2VJZCwgdmVyc2lvbiwgY29udGVudCkge1xuICAgICAgICB0aGlzLl91cmkgPSB1cmk7XG4gICAgICAgIHRoaXMuX2xhbmd1YWdlSWQgPSBsYW5ndWFnZUlkO1xuICAgICAgICB0aGlzLl92ZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgICAgdGhpcy5fY29udGVudCA9IGNvbnRlbnQ7XG4gICAgICAgIHRoaXMuX2xpbmVPZmZzZXRzID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBnZXQgdXJpKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdXJpO1xuICAgIH1cbiAgICBnZXQgbGFuZ3VhZ2VJZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhbmd1YWdlSWQ7XG4gICAgfVxuICAgIGdldCB2ZXJzaW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmVyc2lvbjtcbiAgICB9XG4gICAgZ2V0VGV4dChyYW5nZSkge1xuICAgICAgICBpZiAocmFuZ2UpIHtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IHRoaXMub2Zmc2V0QXQocmFuZ2Uuc3RhcnQpO1xuICAgICAgICAgICAgbGV0IGVuZCA9IHRoaXMub2Zmc2V0QXQocmFuZ2UuZW5kKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb250ZW50LnN1YnN0cmluZyhzdGFydCwgZW5kKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fY29udGVudDtcbiAgICB9XG4gICAgdXBkYXRlKGV2ZW50LCB2ZXJzaW9uKSB7XG4gICAgICAgIHRoaXMuX2NvbnRlbnQgPSBldmVudC50ZXh0O1xuICAgICAgICB0aGlzLl92ZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgICAgdGhpcy5fbGluZU9mZnNldHMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGdldExpbmVPZmZzZXRzKCkge1xuICAgICAgICBpZiAodGhpcy5fbGluZU9mZnNldHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbGV0IGxpbmVPZmZzZXRzID0gW107XG4gICAgICAgICAgICBsZXQgdGV4dCA9IHRoaXMuX2NvbnRlbnQ7XG4gICAgICAgICAgICBsZXQgaXNMaW5lU3RhcnQgPSB0cnVlO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzTGluZVN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgIGxpbmVPZmZzZXRzLnB1c2goaSk7XG4gICAgICAgICAgICAgICAgICAgIGlzTGluZVN0YXJ0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBjaCA9IHRleHQuY2hhckF0KGkpO1xuICAgICAgICAgICAgICAgIGlzTGluZVN0YXJ0ID0gKGNoID09PSAnXFxyJyB8fCBjaCA9PT0gJ1xcbicpO1xuICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ1xccicgJiYgaSArIDEgPCB0ZXh0Lmxlbmd0aCAmJiB0ZXh0LmNoYXJBdChpICsgMSkgPT09ICdcXG4nKSB7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNMaW5lU3RhcnQgJiYgdGV4dC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGluZU9mZnNldHMucHVzaCh0ZXh0Lmxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9saW5lT2Zmc2V0cyA9IGxpbmVPZmZzZXRzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9saW5lT2Zmc2V0cztcbiAgICB9XG4gICAgcG9zaXRpb25BdChvZmZzZXQpIHtcbiAgICAgICAgb2Zmc2V0ID0gTWF0aC5tYXgoTWF0aC5taW4ob2Zmc2V0LCB0aGlzLl9jb250ZW50Lmxlbmd0aCksIDApO1xuICAgICAgICBsZXQgbGluZU9mZnNldHMgPSB0aGlzLmdldExpbmVPZmZzZXRzKCk7XG4gICAgICAgIGxldCBsb3cgPSAwLCBoaWdoID0gbGluZU9mZnNldHMubGVuZ3RoO1xuICAgICAgICBpZiAoaGlnaCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFBvc2l0aW9uLmNyZWF0ZSgwLCBvZmZzZXQpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgICAgICAgICBsZXQgbWlkID0gTWF0aC5mbG9vcigobG93ICsgaGlnaCkgLyAyKTtcbiAgICAgICAgICAgIGlmIChsaW5lT2Zmc2V0c1ttaWRdID4gb2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgaGlnaCA9IG1pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvdyA9IG1pZCArIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gbG93IGlzIHRoZSBsZWFzdCB4IGZvciB3aGljaCB0aGUgbGluZSBvZmZzZXQgaXMgbGFyZ2VyIHRoYW4gdGhlIGN1cnJlbnQgb2Zmc2V0XG4gICAgICAgIC8vIG9yIGFycmF5Lmxlbmd0aCBpZiBubyBsaW5lIG9mZnNldCBpcyBsYXJnZXIgdGhhbiB0aGUgY3VycmVudCBvZmZzZXRcbiAgICAgICAgbGV0IGxpbmUgPSBsb3cgLSAxO1xuICAgICAgICByZXR1cm4gUG9zaXRpb24uY3JlYXRlKGxpbmUsIG9mZnNldCAtIGxpbmVPZmZzZXRzW2xpbmVdKTtcbiAgICB9XG4gICAgb2Zmc2V0QXQocG9zaXRpb24pIHtcbiAgICAgICAgbGV0IGxpbmVPZmZzZXRzID0gdGhpcy5nZXRMaW5lT2Zmc2V0cygpO1xuICAgICAgICBpZiAocG9zaXRpb24ubGluZSA+PSBsaW5lT2Zmc2V0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb250ZW50Lmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwb3NpdGlvbi5saW5lIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGxpbmVPZmZzZXQgPSBsaW5lT2Zmc2V0c1twb3NpdGlvbi5saW5lXTtcbiAgICAgICAgbGV0IG5leHRMaW5lT2Zmc2V0ID0gKHBvc2l0aW9uLmxpbmUgKyAxIDwgbGluZU9mZnNldHMubGVuZ3RoKSA/IGxpbmVPZmZzZXRzW3Bvc2l0aW9uLmxpbmUgKyAxXSA6IHRoaXMuX2NvbnRlbnQubGVuZ3RoO1xuICAgICAgICByZXR1cm4gTWF0aC5tYXgoTWF0aC5taW4obGluZU9mZnNldCArIHBvc2l0aW9uLmNoYXJhY3RlciwgbmV4dExpbmVPZmZzZXQpLCBsaW5lT2Zmc2V0KTtcbiAgICB9XG4gICAgZ2V0IGxpbmVDb3VudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TGluZU9mZnNldHMoKS5sZW5ndGg7XG4gICAgfVxufVxudmFyIElzO1xuKGZ1bmN0aW9uIChJcykge1xuICAgIGNvbnN0IHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbiAgICBmdW5jdGlvbiBkZWZpbmVkKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnO1xuICAgIH1cbiAgICBJcy5kZWZpbmVkID0gZGVmaW5lZDtcbiAgICBmdW5jdGlvbiB1bmRlZmluZWQodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCc7XG4gICAgfVxuICAgIElzLnVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBmdW5jdGlvbiBib29sZWFuKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gZmFsc2U7XG4gICAgfVxuICAgIElzLmJvb2xlYW4gPSBib29sZWFuO1xuICAgIGZ1bmN0aW9uIHN0cmluZyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IFN0cmluZ10nO1xuICAgIH1cbiAgICBJcy5zdHJpbmcgPSBzdHJpbmc7XG4gICAgZnVuY3Rpb24gbnVtYmVyKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgTnVtYmVyXSc7XG4gICAgfVxuICAgIElzLm51bWJlciA9IG51bWJlcjtcbiAgICBmdW5jdGlvbiBudW1iZXJSYW5nZSh2YWx1ZSwgbWluLCBtYXgpIHtcbiAgICAgICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBOdW1iZXJdJyAmJiBtaW4gPD0gdmFsdWUgJiYgdmFsdWUgPD0gbWF4O1xuICAgIH1cbiAgICBJcy5udW1iZXJSYW5nZSA9IG51bWJlclJhbmdlO1xuICAgIGZ1bmN0aW9uIGludGVnZXIodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBOdW1iZXJdJyAmJiAtMjE0NzQ4MzY0OCA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSAyMTQ3NDgzNjQ3O1xuICAgIH1cbiAgICBJcy5pbnRlZ2VyID0gaW50ZWdlcjtcbiAgICBmdW5jdGlvbiB1aW50ZWdlcih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IE51bWJlcl0nICYmIDAgPD0gdmFsdWUgJiYgdmFsdWUgPD0gMjE0NzQ4MzY0NztcbiAgICB9XG4gICAgSXMudWludGVnZXIgPSB1aW50ZWdlcjtcbiAgICBmdW5jdGlvbiBmdW5jKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbiAgICB9XG4gICAgSXMuZnVuYyA9IGZ1bmM7XG4gICAgZnVuY3Rpb24gb2JqZWN0TGl0ZXJhbCh2YWx1ZSkge1xuICAgICAgICAvLyBTdHJpY3RseSBzcGVha2luZyBjbGFzcyBpbnN0YW5jZXMgcGFzcyB0aGlzIGNoZWNrIGFzIHdlbGwuIFNpbmNlIHRoZSBMU1BcbiAgICAgICAgLy8gZG9lc24ndCB1c2UgY2xhc3NlcyB3ZSBpZ25vcmUgdGhpcyBmb3Igbm93LiBJZiB3ZSBkbyB3ZSBuZWVkIHRvIGFkZCBzb21ldGhpbmdcbiAgICAgICAgLy8gbGlrZSB0aGlzOiBgT2JqZWN0LmdldFByb3RvdHlwZU9mKE9iamVjdC5nZXRQcm90b3R5cGVPZih4KSkgPT09IG51bGxgXG4gICAgICAgIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnO1xuICAgIH1cbiAgICBJcy5vYmplY3RMaXRlcmFsID0gb2JqZWN0TGl0ZXJhbDtcbiAgICBmdW5jdGlvbiB0eXBlZEFycmF5KHZhbHVlLCBjaGVjaykge1xuICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUuZXZlcnkoY2hlY2spO1xuICAgIH1cbiAgICBJcy50eXBlZEFycmF5ID0gdHlwZWRBcnJh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QUFBQSxNQUMzRyxPQUFPO0FBQ0gsZ0JBQVEsT0FBTyxLQUFLLEVBQUUsTUFBTSxtQkFBbUIsR0FBRyxHQUFHLFFBQVEsQ0FBQztBQUFBLE1BQ2xFO0FBQUEsSUFDSjtBQUVBLFVBQU8sV0FBbUIscUJBQXFCLE9BQU87QUFBQSxFQUMxRDtBQUVBLFdBQVMsZ0JBQWdCO0FBQ3JCLFdBQU87QUFBQSxNQUNILE1BQU07QUFBQSxRQUNGLFFBQVE7QUFBQSxVQUNKLE9BQVksRUFBRSxTQUFTLEtBQUs7QUFBQSxVQUM1QixRQUFZLEVBQUUsU0FBUyxNQUFNO0FBQUEsVUFDN0IsWUFBWSxDQUFDLHNCQUFzQixtQkFBbUIsMkJBQTJCO0FBQUEsUUFDckY7QUFBQSxRQUNBLFdBQVcsRUFBRSxTQUFTLEtBQUs7QUFBQSxRQUMzQixZQUFZO0FBQUEsVUFDUixXQUFzQjtBQUFBLFVBQ3RCLHNCQUFzQjtBQUFBLFVBQ3RCLGVBQWU7QUFBQSxZQUNYO0FBQUEsWUFBYTtBQUFBLFlBQVM7QUFBQSxZQUN0QjtBQUFBLFlBQ0E7QUFBQSxZQUNBO0FBQUEsVUFDSjtBQUFBLFVBQ0EsYUFBYSxDQUFDLFFBQVEsU0FBUyxPQUFPLE9BQU8sRUFBRTtBQUFBLFFBQ25EO0FBQUEsUUFDQSxlQUFnQixFQUFFLFNBQVMsS0FBSztBQUFBLFFBQ2hDLFFBQWdCLEVBQUUsU0FBUyxLQUFLO0FBQUEsUUFDaEMsYUFBZ0IsRUFBRSxpQkFBaUIsTUFBTTtBQUFBLE1BQzdDO0FBQUEsSUFDSjtBQUFBLEVBQ0o7IiwKICAibmFtZXMiOiBbIkVycm9yQ29kZXMiLCAiTWVzc2FnZSIsICJUb3VjaCIsICJEaXNwb3NhYmxlIiwgIlJBTCIsICJFdmVudCIsICJJcyIsICJDYW5jZWxsYXRpb25Ub2tlbiIsICJDYW5jZWxsYXRpb25TdGF0ZSIsICJfY29ubiIsICJJcyIsICJNZXNzYWdlUmVhZGVyIiwgIkFic3RyYWN0TWVzc2FnZVJlYWRlciIsICJSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zIiwgIklzIiwgIk1lc3NhZ2VXcml0ZXIiLCAiQWJzdHJhY3RNZXNzYWdlV3JpdGVyIiwgIlJlc29sdmVkTWVzc2FnZVdyaXRlck9wdGlvbnMiLCAicmVzdWx0IiwgIklzIiwgIkNhbmNlbE5vdGlmaWNhdGlvbiIsICJQcm9ncmVzc1Rva2VuIiwgIlByb2dyZXNzTm90aWZpY2F0aW9uIiwgIlN0YXJSZXF1ZXN0SGFuZGxlciIsICJUcmFjZSIsICJUcmFjZVZhbHVlcyIsICJUcmFjZUZvcm1hdCIsICJTZXRUcmFjZU5vdGlmaWNhdGlvbiIsICJMb2dUcmFjZU5vdGlmaWNhdGlvbiIsICJDb25uZWN0aW9uRXJyb3JzIiwgIkNvbm5lY3Rpb25TdHJhdGVneSIsICJJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kiLCAiUmVxdWVzdENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kiLCAiQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSIsICJDYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneSIsICJDYW5jZWxsYXRpb25TdHJhdGVneSIsICJNZXNzYWdlU3RyYXRlZ3kiLCAiQ29ubmVjdGlvbk9wdGlvbnMiLCAiQ29ubmVjdGlvblN0YXRlIiwgImNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uIiwgInN0YXJ0VGltZSIsICJSSUwiLCAibSIsICJleHBvcnRzIiwgImNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uIiwgImltcG9ydF92c2NvZGVfanNvbnJwYyIsICJpbXBvcnRfdnNjb2RlX2pzb25ycGMiLCAiaW1wb3J0X3ZzY29kZV9qc29ucnBjIiwgImltcG9ydF92c2NvZGVfanNvbnJwYyIsICJEb2N1bWVudFVyaSIsICJVUkkiLCAiaW50ZWdlciIsICJ1aW50ZWdlciIsICJQb3NpdGlvbiIsICJSYW5nZSIsICJMb2NhdGlvbiIsICJMb2NhdGlvbkxpbmsiLCAiQ29sb3IiLCAiQ29sb3JJbmZvcm1hdGlvbiIsICJDb2xvclByZXNlbnRhdGlvbiIsICJGb2xkaW5nUmFuZ2VLaW5kIiwgIkZvbGRpbmdSYW5nZSIsICJEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uIiwgImxvY2F0aW9uIiwgIkRpYWdub3N0aWNTZXZlcml0eSIsICJEaWFnbm9zdGljVGFnIiwgIkNvZGVEZXNjcmlwdGlvbiIsICJEaWFnbm9zdGljIiwgIkNvbW1hbmQiLCAiVGV4dEVkaXQiLCAiQ2hhbmdlQW5ub3RhdGlvbiIsICJDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllciIsICJBbm5vdGF0ZWRUZXh0RWRpdCIsICJUZXh0RG9jdW1lbnRFZGl0IiwgIkNyZWF0ZUZpbGUiLCAiUmVuYW1lRmlsZSIsICJEZWxldGVGaWxlIiwgIldvcmtzcGFjZUVkaXQiLCAiVGV4dERvY3VtZW50SWRlbnRpZmllciIsICJWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIiwgIk9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciIsICJUZXh0RG9jdW1lbnRJdGVtIiwgIk1hcmt1cEtpbmQiLCAiTWFya3VwQ29udGVudCIsICJDb21wbGV0aW9uSXRlbUtpbmQiLCAiSW5zZXJ0VGV4dEZvcm1hdCIsICJDb21wbGV0aW9uSXRlbVRhZyIsICJJbnNlcnRSZXBsYWNlRWRpdCIsICJSYW5nZSIsICJJbnNlcnRUZXh0TW9kZSIsICJDb21wbGV0aW9uSXRlbUxhYmVsRGV0YWlscyIsICJDb21wbGV0aW9uSXRlbSIsICJDb21wbGV0aW9uTGlzdCIsICJNYXJrZWRTdHJpbmciLCAiSG92ZXIiLCAiUGFyYW1ldGVySW5mb3JtYXRpb24iLCAiU2lnbmF0dXJlSW5mb3JtYXRpb24iLCAiRG9jdW1lbnRIaWdobGlnaHRLaW5kIiwgIkRvY3VtZW50SGlnaGxpZ2h0IiwgIlN5bWJvbEtpbmQiLCAiU3ltYm9sVGFnIiwgIlN5bWJvbEluZm9ybWF0aW9uIiwgIldvcmtzcGFjZVN5bWJvbCIsICJEb2N1bWVudFN5bWJvbCIsICJDb2RlQWN0aW9uS2luZCIsICJDb2RlQWN0aW9uVHJpZ2dlcktpbmQiLCAiQ29kZUFjdGlvbkNvbnRleHQiLCAiQ29kZUFjdGlvbiIsICJDb2RlTGVucyIsICJGb3JtYXR0aW5nT3B0aW9ucyIsICJEb2N1bWVudExpbmsiLCAiU2VsZWN0aW9uUmFuZ2UiLCAiU2VtYW50aWNUb2tlblR5cGVzIiwgIlNlbWFudGljVG9rZW5Nb2RpZmllcnMiLCAiU2VtYW50aWNUb2tlbnMiLCAiSW5saW5lVmFsdWVUZXh0IiwgIklubGluZVZhbHVlVmFyaWFibGVMb29rdXAiLCAiSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24iLCAiSW5saW5lVmFsdWVDb250ZXh0IiwgIklubGF5SGludEtpbmQiLCAiSW5sYXlIaW50TGFiZWxQYXJ0IiwgIklubGF5SGludCIsICJQb3NpdGlvbiIsICJTdHJpbmdWYWx1ZSIsICJJbmxpbmVDb21wbGV0aW9uSXRlbSIsICJJbmxpbmVDb21wbGV0aW9uTGlzdCIsICJJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmQiLCAiU2VsZWN0ZWRDb21wbGV0aW9uSW5mbyIsICJJbmxpbmVDb21wbGV0aW9uQ29udGV4dCIsICJXb3Jrc3BhY2VGb2xkZXIiLCAiVGV4dERvY3VtZW50IiwgIlBvc2l0aW9uIiwgIklzIiwgInVuZGVmaW5lZCIsICJpbnRlZ2VyIiwgInVpbnRlZ2VyIiwgIm0iXQp9Cg== +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvY29tbW9uL2lzLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlcy5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vbGlua2VkTWFwLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9kaXNwb3NhYmxlLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9yYWwuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvY29tbW9uL2V2ZW50cy5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vY2FuY2VsbGF0aW9uLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9zaGFyZWRBcnJheUNhbmNlbGxhdGlvbi5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vc2VtYXBob3JlLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlUmVhZGVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlV3JpdGVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlQnVmZmVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9jb25uZWN0aW9uLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9hcGkuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvYnJvd3Nlci9yaWwuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvYnJvd3Nlci9tYWluLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvYnJvd3Nlci5qcyIsICJsc3AvamF2YS1sc3AtY2xpZW50LnRzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLXdzLWpzb25ycGMvc3JjL2Rpc3Bvc2FibGUudHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvc29ja2V0L3NvY2tldC50cyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS13cy1qc29ucnBjL3NyYy9zb2NrZXQvcmVhZGVyLnRzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLXdzLWpzb25ycGMvc3JjL3NvY2tldC93cml0ZXIudHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvc29ja2V0L2Nvbm5lY3Rpb24udHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvY29ubmVjdGlvbi50cyIsICJsc3AvbW9uYWNvLXNoaW0udHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtbGFuZ3VhZ2VzZXJ2ZXItdHlwZXMvbGliL2VzbS9tYWluLmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuc3RyaW5nQXJyYXkgPSBleHBvcnRzLmFycmF5ID0gZXhwb3J0cy5mdW5jID0gZXhwb3J0cy5lcnJvciA9IGV4cG9ydHMubnVtYmVyID0gZXhwb3J0cy5zdHJpbmcgPSBleHBvcnRzLmJvb2xlYW4gPSB2b2lkIDA7XG5mdW5jdGlvbiBib29sZWFuKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZTtcbn1cbmV4cG9ydHMuYm9vbGVhbiA9IGJvb2xlYW47XG5mdW5jdGlvbiBzdHJpbmcodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZztcbn1cbmV4cG9ydHMuc3RyaW5nID0gc3RyaW5nO1xuZnVuY3Rpb24gbnVtYmVyKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdmFsdWUgaW5zdGFuY2VvZiBOdW1iZXI7XG59XG5leHBvcnRzLm51bWJlciA9IG51bWJlcjtcbmZ1bmN0aW9uIGVycm9yKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgRXJyb3I7XG59XG5leHBvcnRzLmVycm9yID0gZXJyb3I7XG5mdW5jdGlvbiBmdW5jKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cbmV4cG9ydHMuZnVuYyA9IGZ1bmM7XG5mdW5jdGlvbiBhcnJheSh2YWx1ZSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cbmV4cG9ydHMuYXJyYXkgPSBhcnJheTtcbmZ1bmN0aW9uIHN0cmluZ0FycmF5KHZhbHVlKSB7XG4gICAgcmV0dXJuIGFycmF5KHZhbHVlKSAmJiB2YWx1ZS5ldmVyeShlbGVtID0+IHN0cmluZyhlbGVtKSk7XG59XG5leHBvcnRzLnN0cmluZ0FycmF5ID0gc3RyaW5nQXJyYXk7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLk1lc3NhZ2UgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU5ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlOCA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTcgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU2ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNSA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTQgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUzID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMiA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTEgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUwID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTkgPSBleHBvcnRzLlJlcXVlc3RUeXBlOCA9IGV4cG9ydHMuUmVxdWVzdFR5cGU3ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTYgPSBleHBvcnRzLlJlcXVlc3RUeXBlNSA9IGV4cG9ydHMuUmVxdWVzdFR5cGU0ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTMgPSBleHBvcnRzLlJlcXVlc3RUeXBlMiA9IGV4cG9ydHMuUmVxdWVzdFR5cGUxID0gZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IGV4cG9ydHMuUmVxdWVzdFR5cGUwID0gZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUgPSBleHBvcnRzLlBhcmFtZXRlclN0cnVjdHVyZXMgPSBleHBvcnRzLlJlc3BvbnNlRXJyb3IgPSBleHBvcnRzLkVycm9yQ29kZXMgPSB2b2lkIDA7XG5jb25zdCBpcyA9IHJlcXVpcmUoXCIuL2lzXCIpO1xuLyoqXG4gKiBQcmVkZWZpbmVkIGVycm9yIGNvZGVzLlxuICovXG52YXIgRXJyb3JDb2RlcztcbihmdW5jdGlvbiAoRXJyb3JDb2Rlcykge1xuICAgIC8vIERlZmluZWQgYnkgSlNPTiBSUENcbiAgICBFcnJvckNvZGVzLlBhcnNlRXJyb3IgPSAtMzI3MDA7XG4gICAgRXJyb3JDb2Rlcy5JbnZhbGlkUmVxdWVzdCA9IC0zMjYwMDtcbiAgICBFcnJvckNvZGVzLk1ldGhvZE5vdEZvdW5kID0gLTMyNjAxO1xuICAgIEVycm9yQ29kZXMuSW52YWxpZFBhcmFtcyA9IC0zMjYwMjtcbiAgICBFcnJvckNvZGVzLkludGVybmFsRXJyb3IgPSAtMzI2MDM7XG4gICAgLyoqXG4gICAgICogVGhpcyBpcyB0aGUgc3RhcnQgcmFuZ2Ugb2YgSlNPTiBSUEMgcmVzZXJ2ZWQgZXJyb3IgY29kZXMuXG4gICAgICogSXQgZG9lc24ndCBkZW5vdGUgYSByZWFsIGVycm9yIGNvZGUuIE5vIGFwcGxpY2F0aW9uIGVycm9yIGNvZGVzIHNob3VsZFxuICAgICAqIGJlIGRlZmluZWQgYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCByYW5nZS4gRm9yIGJhY2t3YXJkc1xuICAgICAqIGNvbXBhdGliaWxpdHkgdGhlIGBTZXJ2ZXJOb3RJbml0aWFsaXplZGAgYW5kIHRoZSBgVW5rbm93bkVycm9yQ29kZWBcbiAgICAgKiBhcmUgbGVmdCBpbiB0aGUgcmFuZ2UuXG4gICAgICpcbiAgICAgKiBAc2luY2UgMy4xNi4wXG4gICAgKi9cbiAgICBFcnJvckNvZGVzLmpzb25ycGNSZXNlcnZlZEVycm9yUmFuZ2VTdGFydCA9IC0zMjA5OTtcbiAgICAvKiogQGRlcHJlY2F0ZWQgdXNlICBqc29ucnBjUmVzZXJ2ZWRFcnJvclJhbmdlU3RhcnQgKi9cbiAgICBFcnJvckNvZGVzLnNlcnZlckVycm9yU3RhcnQgPSAtMzIwOTk7XG4gICAgLyoqXG4gICAgICogQW4gZXJyb3Igb2NjdXJyZWQgd2hlbiB3cml0ZSBhIG1lc3NhZ2UgdG8gdGhlIHRyYW5zcG9ydCBsYXllci5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLk1lc3NhZ2VXcml0ZUVycm9yID0gLTMyMDk5O1xuICAgIC8qKlxuICAgICAqIEFuIGVycm9yIG9jY3VycmVkIHdoZW4gcmVhZGluZyBhIG1lc3NhZ2UgZnJvbSB0aGUgdHJhbnNwb3J0IGxheWVyLlxuICAgICAqL1xuICAgIEVycm9yQ29kZXMuTWVzc2FnZVJlYWRFcnJvciA9IC0zMjA5ODtcbiAgICAvKipcbiAgICAgKiBUaGUgY29ubmVjdGlvbiBnb3QgZGlzcG9zZWQgb3IgbG9zdCBhbmQgYWxsIHBlbmRpbmcgcmVzcG9uc2VzIGdvdFxuICAgICAqIHJlamVjdGVkLlxuICAgICAqL1xuICAgIEVycm9yQ29kZXMuUGVuZGluZ1Jlc3BvbnNlUmVqZWN0ZWQgPSAtMzIwOTc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gaXMgaW5hY3RpdmUgYW5kIGEgdXNlIG9mIGl0IGZhaWxlZC5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLkNvbm5lY3Rpb25JbmFjdGl2ZSA9IC0zMjA5NjtcbiAgICAvKipcbiAgICAgKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBhIHNlcnZlciByZWNlaXZlZCBhIG5vdGlmaWNhdGlvbiBvclxuICAgICAqIHJlcXVlc3QgYmVmb3JlIHRoZSBzZXJ2ZXIgaGFzIHJlY2VpdmVkIHRoZSBgaW5pdGlhbGl6ZWAgcmVxdWVzdC5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLlNlcnZlck5vdEluaXRpYWxpemVkID0gLTMyMDAyO1xuICAgIEVycm9yQ29kZXMuVW5rbm93bkVycm9yQ29kZSA9IC0zMjAwMTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIHRoZSBlbmQgcmFuZ2Ugb2YgSlNPTiBSUEMgcmVzZXJ2ZWQgZXJyb3IgY29kZXMuXG4gICAgICogSXQgZG9lc24ndCBkZW5vdGUgYSByZWFsIGVycm9yIGNvZGUuXG4gICAgICpcbiAgICAgKiBAc2luY2UgMy4xNi4wXG4gICAgKi9cbiAgICBFcnJvckNvZGVzLmpzb25ycGNSZXNlcnZlZEVycm9yUmFuZ2VFbmQgPSAtMzIwMDA7XG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSAganNvbnJwY1Jlc2VydmVkRXJyb3JSYW5nZUVuZCAqL1xuICAgIEVycm9yQ29kZXMuc2VydmVyRXJyb3JFbmQgPSAtMzIwMDA7XG59KShFcnJvckNvZGVzIHx8IChleHBvcnRzLkVycm9yQ29kZXMgPSBFcnJvckNvZGVzID0ge30pKTtcbi8qKlxuICogQW4gZXJyb3Igb2JqZWN0IHJldHVybiBpbiBhIHJlc3BvbnNlIGluIGNhc2UgYSByZXF1ZXN0XG4gKiBoYXMgZmFpbGVkLlxuICovXG5jbGFzcyBSZXNwb25zZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNvZGUsIG1lc3NhZ2UsIGRhdGEpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuY29kZSA9IGlzLm51bWJlcihjb2RlKSA/IGNvZGUgOiBFcnJvckNvZGVzLlVua25vd25FcnJvckNvZGU7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBSZXNwb25zZUVycm9yLnByb3RvdHlwZSk7XG4gICAgfVxuICAgIHRvSnNvbigpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgY29kZTogdGhpcy5jb2RlLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLmRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmRhdGEgPSB0aGlzLmRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5leHBvcnRzLlJlc3BvbnNlRXJyb3IgPSBSZXNwb25zZUVycm9yO1xuY2xhc3MgUGFyYW1ldGVyU3RydWN0dXJlcyB7XG4gICAgY29uc3RydWN0b3Ioa2luZCkge1xuICAgICAgICB0aGlzLmtpbmQgPSBraW5kO1xuICAgIH1cbiAgICBzdGF0aWMgaXModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8gfHwgdmFsdWUgPT09IFBhcmFtZXRlclN0cnVjdHVyZXMuYnlOYW1lIHx8IHZhbHVlID09PSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5UG9zaXRpb247XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5raW5kO1xuICAgIH1cbn1cbmV4cG9ydHMuUGFyYW1ldGVyU3RydWN0dXJlcyA9IFBhcmFtZXRlclN0cnVjdHVyZXM7XG4vKipcbiAqIFRoZSBwYXJhbWV0ZXIgc3RydWN0dXJlIGlzIGF1dG9tYXRpY2FsbHkgaW5mZXJyZWQgb24gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzXG4gKiBhbmQgdGhlIHBhcmFtZXRlciB0eXBlIGluIGNhc2Ugb2YgYSBzaW5nbGUgcGFyYW0uXG4gKi9cblBhcmFtZXRlclN0cnVjdHVyZXMuYXV0byA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdhdXRvJyk7XG4vKipcbiAqIEZvcmNlcyBgYnlQb3NpdGlvbmAgcGFyYW1ldGVyIHN0cnVjdHVyZS4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGhhdmUgYSBzaW5nbGVcbiAqIHBhcmFtZXRlciB3aGljaCBoYXMgYSBsaXRlcmFsIHR5cGUuXG4gKi9cblBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbiA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdieVBvc2l0aW9uJyk7XG4vKipcbiAqIEZvcmNlcyBgYnlOYW1lYCBwYXJhbWV0ZXIgc3RydWN0dXJlLiBUaGlzIGlzIG9ubHkgdXNlZnVsIHdoZW4gaGF2aW5nIGEgc2luZ2xlXG4gKiBwYXJhbWV0ZXIuIFRoZSBsaWJyYXJ5IHdpbGwgcmVwb3J0IGVycm9ycyBpZiB1c2VkIHdpdGggYSBkaWZmZXJlbnQgbnVtYmVyIG9mXG4gKiBwYXJhbWV0ZXJzLlxuICovXG5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdieU5hbWUnKTtcbi8qKlxuICogQW4gYWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgYSBNZXNzYWdlVHlwZS5cbiAqL1xuY2xhc3MgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIG51bWJlck9mUGFyYW1zKSB7XG4gICAgICAgIHRoaXMubWV0aG9kID0gbWV0aG9kO1xuICAgICAgICB0aGlzLm51bWJlck9mUGFyYW1zID0gbnVtYmVyT2ZQYXJhbXM7XG4gICAgfVxuICAgIGdldCBwYXJhbWV0ZXJTdHJ1Y3R1cmVzKCkge1xuICAgICAgICByZXR1cm4gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvO1xuICAgIH1cbn1cbmV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlID0gQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlO1xuLyoqXG4gKiBDbGFzc2VzIHRvIHR5cGUgcmVxdWVzdCByZXNwb25zZSBwYWlyc1xuICovXG5jbGFzcyBSZXF1ZXN0VHlwZTAgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDApO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGUwID0gUmVxdWVzdFR5cGUwO1xuY2xhc3MgUmVxdWVzdFR5cGUgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCwgX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8pIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAxKTtcbiAgICAgICAgdGhpcy5fcGFyYW1ldGVyU3RydWN0dXJlcyA9IF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbiAgICBnZXQgcGFyYW1ldGVyU3RydWN0dXJlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXM7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IFJlcXVlc3RUeXBlO1xuY2xhc3MgUmVxdWVzdFR5cGUxIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMSk7XG4gICAgICAgIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBfcGFyYW1ldGVyU3RydWN0dXJlcztcbiAgICB9XG4gICAgZ2V0IHBhcmFtZXRlclN0cnVjdHVyZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGUxID0gUmVxdWVzdFR5cGUxO1xuY2xhc3MgUmVxdWVzdFR5cGUyIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAyKTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlMiA9IFJlcXVlc3RUeXBlMjtcbmNsYXNzIFJlcXVlc3RUeXBlMyBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMyk7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTMgPSBSZXF1ZXN0VHlwZTM7XG5jbGFzcyBSZXF1ZXN0VHlwZTQgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDQpO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGU0ID0gUmVxdWVzdFR5cGU0O1xuY2xhc3MgUmVxdWVzdFR5cGU1IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA1KTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlNSA9IFJlcXVlc3RUeXBlNTtcbmNsYXNzIFJlcXVlc3RUeXBlNiBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNik7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTYgPSBSZXF1ZXN0VHlwZTY7XG5jbGFzcyBSZXF1ZXN0VHlwZTcgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDcpO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGU3ID0gUmVxdWVzdFR5cGU3O1xuY2xhc3MgUmVxdWVzdFR5cGU4IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA4KTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlOCA9IFJlcXVlc3RUeXBlODtcbmNsYXNzIFJlcXVlc3RUeXBlOSBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgOSk7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTkgPSBSZXF1ZXN0VHlwZTk7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMSk7XG4gICAgICAgIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBfcGFyYW1ldGVyU3RydWN0dXJlcztcbiAgICB9XG4gICAgZ2V0IHBhcmFtZXRlclN0cnVjdHVyZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZSA9IE5vdGlmaWNhdGlvblR5cGU7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlMCBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMCk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMCA9IE5vdGlmaWNhdGlvblR5cGUwO1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTEgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCwgX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8pIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAxKTtcbiAgICAgICAgdGhpcy5fcGFyYW1ldGVyU3RydWN0dXJlcyA9IF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbiAgICBnZXQgcGFyYW1ldGVyU3RydWN0dXJlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXM7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMSA9IE5vdGlmaWNhdGlvblR5cGUxO1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDIpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTIgPSBOb3RpZmljYXRpb25UeXBlMjtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGUzIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAzKTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGUzID0gTm90aWZpY2F0aW9uVHlwZTM7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlNCBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNCk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNCA9IE5vdGlmaWNhdGlvblR5cGU0O1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTUgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDUpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTUgPSBOb3RpZmljYXRpb25UeXBlNTtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGU2IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA2KTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGU2ID0gTm90aWZpY2F0aW9uVHlwZTY7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlNyBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNyk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNyA9IE5vdGlmaWNhdGlvblR5cGU3O1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTggZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDgpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTggPSBOb3RpZmljYXRpb25UeXBlODtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGU5IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA5KTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGU5ID0gTm90aWZpY2F0aW9uVHlwZTk7XG52YXIgTWVzc2FnZTtcbihmdW5jdGlvbiAoTWVzc2FnZSkge1xuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoZSBnaXZlbiBtZXNzYWdlIGlzIGEgcmVxdWVzdCBtZXNzYWdlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gbWVzc2FnZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBpcy5zdHJpbmcoY2FuZGlkYXRlLm1ldGhvZCkgJiYgKGlzLnN0cmluZyhjYW5kaWRhdGUuaWQpIHx8IGlzLm51bWJlcihjYW5kaWRhdGUuaWQpKTtcbiAgICB9XG4gICAgTWVzc2FnZS5pc1JlcXVlc3QgPSBpc1JlcXVlc3Q7XG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhlIGdpdmVuIG1lc3NhZ2UgaXMgYSBub3RpZmljYXRpb24gbWVzc2FnZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTm90aWZpY2F0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gbWVzc2FnZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBpcy5zdHJpbmcoY2FuZGlkYXRlLm1ldGhvZCkgJiYgbWVzc2FnZS5pZCA9PT0gdm9pZCAwO1xuICAgIH1cbiAgICBNZXNzYWdlLmlzTm90aWZpY2F0aW9uID0gaXNOb3RpZmljYXRpb247XG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhlIGdpdmVuIG1lc3NhZ2UgaXMgYSByZXNwb25zZSBtZXNzYWdlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNSZXNwb25zZShtZXNzYWdlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IG1lc3NhZ2U7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgKGNhbmRpZGF0ZS5yZXN1bHQgIT09IHZvaWQgMCB8fCAhIWNhbmRpZGF0ZS5lcnJvcikgJiYgKGlzLnN0cmluZyhjYW5kaWRhdGUuaWQpIHx8IGlzLm51bWJlcihjYW5kaWRhdGUuaWQpIHx8IGNhbmRpZGF0ZS5pZCA9PT0gbnVsbCk7XG4gICAgfVxuICAgIE1lc3NhZ2UuaXNSZXNwb25zZSA9IGlzUmVzcG9uc2U7XG59KShNZXNzYWdlIHx8IChleHBvcnRzLk1lc3NhZ2UgPSBNZXNzYWdlID0ge30pKTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xudmFyIF9hO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5MUlVDYWNoZSA9IGV4cG9ydHMuTGlua2VkTWFwID0gZXhwb3J0cy5Ub3VjaCA9IHZvaWQgMDtcbnZhciBUb3VjaDtcbihmdW5jdGlvbiAoVG91Y2gpIHtcbiAgICBUb3VjaC5Ob25lID0gMDtcbiAgICBUb3VjaC5GaXJzdCA9IDE7XG4gICAgVG91Y2guQXNPbGQgPSBUb3VjaC5GaXJzdDtcbiAgICBUb3VjaC5MYXN0ID0gMjtcbiAgICBUb3VjaC5Bc05ldyA9IFRvdWNoLkxhc3Q7XG59KShUb3VjaCB8fCAoZXhwb3J0cy5Ub3VjaCA9IFRvdWNoID0ge30pKTtcbmNsYXNzIExpbmtlZE1hcCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXNbX2FdID0gJ0xpbmtlZE1hcCc7XG4gICAgICAgIHRoaXMuX21hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5faGVhZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fdGFpbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IDA7XG4gICAgICAgIHRoaXMuX3N0YXRlID0gMDtcbiAgICB9XG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuX21hcC5jbGVhcigpO1xuICAgICAgICB0aGlzLl9oZWFkID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl90YWlsID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9zaXplID0gMDtcbiAgICAgICAgdGhpcy5fc3RhdGUrKztcbiAgICB9XG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLl9oZWFkICYmICF0aGlzLl90YWlsO1xuICAgIH1cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpemU7XG4gICAgfVxuICAgIGdldCBmaXJzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlYWQ/LnZhbHVlO1xuICAgIH1cbiAgICBnZXQgbGFzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhaWw/LnZhbHVlO1xuICAgIH1cbiAgICBoYXMoa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXAuaGFzKGtleSk7XG4gICAgfVxuICAgIGdldChrZXksIHRvdWNoID0gVG91Y2guTm9uZSkge1xuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5fbWFwLmdldChrZXkpO1xuICAgICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRvdWNoICE9PSBUb3VjaC5Ob25lKSB7XG4gICAgICAgICAgICB0aGlzLnRvdWNoKGl0ZW0sIHRvdWNoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICB9XG4gICAgc2V0KGtleSwgdmFsdWUsIHRvdWNoID0gVG91Y2guTm9uZSkge1xuICAgICAgICBsZXQgaXRlbSA9IHRoaXMuX21hcC5nZXQoa2V5KTtcbiAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgIGl0ZW0udmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIGlmICh0b3VjaCAhPT0gVG91Y2guTm9uZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudG91Y2goaXRlbSwgdG91Y2gpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaXRlbSA9IHsga2V5LCB2YWx1ZSwgbmV4dDogdW5kZWZpbmVkLCBwcmV2aW91czogdW5kZWZpbmVkIH07XG4gICAgICAgICAgICBzd2l0Y2ggKHRvdWNoKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBUb3VjaC5Ob25lOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFRvdWNoLkZpcnN0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1GaXJzdChpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBUb3VjaC5MYXN0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX21hcC5zZXQoa2V5LCBpdGVtKTtcbiAgICAgICAgICAgIHRoaXMuX3NpemUrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGVsZXRlKGtleSkge1xuICAgICAgICByZXR1cm4gISF0aGlzLnJlbW92ZShrZXkpO1xuICAgIH1cbiAgICByZW1vdmUoa2V5KSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl9tYXAuZ2V0KGtleSk7XG4gICAgICAgIGlmICghaXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tYXAuZGVsZXRlKGtleSk7XG4gICAgICAgIHRoaXMucmVtb3ZlSXRlbShpdGVtKTtcbiAgICAgICAgdGhpcy5fc2l6ZS0tO1xuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICB9XG4gICAgc2hpZnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5faGVhZCAmJiAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2hlYWQgfHwgIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIHRoaXMuX21hcC5kZWxldGUoaXRlbS5rZXkpO1xuICAgICAgICB0aGlzLnJlbW92ZUl0ZW0oaXRlbSk7XG4gICAgICAgIHRoaXMuX3NpemUtLTtcbiAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7XG4gICAgfVxuICAgIGZvckVhY2goY2FsbGJhY2tmbiwgdGhpc0FyZykge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3N0YXRlO1xuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICAgICAgICBpZiAodGhpc0FyZykge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrZm4uYmluZCh0aGlzQXJnKShjdXJyZW50LnZhbHVlLCBjdXJyZW50LmtleSwgdGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFja2ZuKGN1cnJlbnQudmFsdWUsIGN1cnJlbnQua2V5LCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gc3RhdGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExpbmtlZE1hcCBnb3QgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAga2V5cygpIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9zdGF0ZTtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLl9oZWFkO1xuICAgICAgICBjb25zdCBpdGVyYXRvciA9IHtcbiAgICAgICAgICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fc3RhdGUgIT09IHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTGlua2VkTWFwIGdvdCBtb2RpZmllZCBkdXJpbmcgaXRlcmF0aW9uLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7IHZhbHVlOiBjdXJyZW50LmtleSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICB9XG4gICAgdmFsdWVzKCkge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3N0YXRlO1xuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIGNvbnN0IGl0ZXJhdG9yID0ge1xuICAgICAgICAgICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlcmF0b3I7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBMaW5rZWRNYXAgZ290IG1vZGlmaWVkIGR1cmluZyBpdGVyYXRpb24uYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHsgdmFsdWU6IGN1cnJlbnQudmFsdWUsIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gaXRlcmF0b3I7XG4gICAgfVxuICAgIGVudHJpZXMoKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5fc3RhdGU7XG4gICAgICAgIGxldCBjdXJyZW50ID0gdGhpcy5faGVhZDtcbiAgICAgICAgY29uc3QgaXRlcmF0b3IgPSB7XG4gICAgICAgICAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3N0YXRlICE9PSBzdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExpbmtlZE1hcCBnb3QgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geyB2YWx1ZTogW2N1cnJlbnQua2V5LCBjdXJyZW50LnZhbHVlXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICB9XG4gICAgWyhfYSA9IFN5bWJvbC50b1N0cmluZ1RhZywgU3ltYm9sLml0ZXJhdG9yKV0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMoKTtcbiAgICB9XG4gICAgdHJpbU9sZChuZXdTaXplKSB7XG4gICAgICAgIGlmIChuZXdTaXplID49IHRoaXMuc2l6ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuZXdTaXplID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLl9oZWFkO1xuICAgICAgICBsZXQgY3VycmVudFNpemUgPSB0aGlzLnNpemU7XG4gICAgICAgIHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnRTaXplID4gbmV3U2l6ZSkge1xuICAgICAgICAgICAgdGhpcy5fbWFwLmRlbGV0ZShjdXJyZW50LmtleSk7XG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0O1xuICAgICAgICAgICAgY3VycmVudFNpemUtLTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9oZWFkID0gY3VycmVudDtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IGN1cnJlbnRTaXplO1xuICAgICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICAgICAgY3VycmVudC5wcmV2aW91cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgIH1cbiAgICBhZGRJdGVtRmlyc3QoaXRlbSkge1xuICAgICAgICAvLyBGaXJzdCB0aW1lIEluc2VydFxuICAgICAgICBpZiAoIXRoaXMuX2hlYWQgJiYgIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRoaXMuX3RhaWwgPSBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCF0aGlzLl9oZWFkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbGlzdCcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdGhpcy5faGVhZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQucHJldmlvdXMgPSBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2hlYWQgPSBpdGVtO1xuICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgIH1cbiAgICBhZGRJdGVtTGFzdChpdGVtKSB7XG4gICAgICAgIC8vIEZpcnN0IHRpbWUgSW5zZXJ0XG4gICAgICAgIGlmICghdGhpcy5faGVhZCAmJiAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgdGhpcy5faGVhZCA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpdGVtLnByZXZpb3VzID0gdGhpcy5fdGFpbDtcbiAgICAgICAgICAgIHRoaXMuX3RhaWwubmV4dCA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW07XG4gICAgICAgIHRoaXMuX3N0YXRlKys7XG4gICAgfVxuICAgIHJlbW92ZUl0ZW0oaXRlbSkge1xuICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCAmJiBpdGVtID09PSB0aGlzLl90YWlsKSB7XG4gICAgICAgICAgICB0aGlzLl9oZWFkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpdGVtID09PSB0aGlzLl9oZWFkKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGNhbiBvbmx5IGhhcHBlbmVkIGlmIHNpemUgPT09IDEgd2hpY2ggaXMgaGFuZGxlXG4gICAgICAgICAgICAvLyBieSB0aGUgY2FzZSBhYm92ZS5cbiAgICAgICAgICAgIGlmICghaXRlbS5uZXh0KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxpc3QnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGl0ZW0ubmV4dC5wcmV2aW91cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQgPSBpdGVtLm5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXRlbSA9PT0gdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgLy8gVGhpcyBjYW4gb25seSBoYXBwZW5lZCBpZiBzaXplID09PSAxIHdoaWNoIGlzIGhhbmRsZVxuICAgICAgICAgICAgLy8gYnkgdGhlIGNhc2UgYWJvdmUuXG4gICAgICAgICAgICBpZiAoIWl0ZW0ucHJldmlvdXMpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbGlzdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbS5wcmV2aW91cy5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gaXRlbS5uZXh0O1xuICAgICAgICAgICAgY29uc3QgcHJldmlvdXMgPSBpdGVtLnByZXZpb3VzO1xuICAgICAgICAgICAgaWYgKCFuZXh0IHx8ICFwcmV2aW91cykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXh0LnByZXZpb3VzID0gcHJldmlvdXM7XG4gICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gbmV4dDtcbiAgICAgICAgfVxuICAgICAgICBpdGVtLm5leHQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGl0ZW0ucHJldmlvdXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX3N0YXRlKys7XG4gICAgfVxuICAgIHRvdWNoKGl0ZW0sIHRvdWNoKSB7XG4gICAgICAgIGlmICghdGhpcy5faGVhZCB8fCAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxpc3QnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHRvdWNoICE9PSBUb3VjaC5GaXJzdCAmJiB0b3VjaCAhPT0gVG91Y2guTGFzdCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG91Y2ggPT09IFRvdWNoLkZpcnN0KSB7XG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBpdGVtLm5leHQ7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgICAgICAvLyBVbmxpbmsgdGhlIGl0ZW1cbiAgICAgICAgICAgIGlmIChpdGVtID09PSB0aGlzLl90YWlsKSB7XG4gICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgbXVzdCBiZSBkZWZpbmVkIHNpbmNlIGl0ZW0gd2FzIG5vdCBoZWFkIGJ1dCBpcyB0YWlsXG4gICAgICAgICAgICAgICAgLy8gU28gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbiBpdGVtIGluIHRoZSBtYXBcbiAgICAgICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuX3RhaWwgPSBwcmV2aW91cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEJvdGggbmV4dCBhbmQgcHJldmlvdXMgYXJlIG5vdCB1bmRlZmluZWQgc2luY2UgaXRlbSB3YXMgbmVpdGhlciBoZWFkIG5vciB0YWlsLlxuICAgICAgICAgICAgICAgIG5leHQucHJldmlvdXMgPSBwcmV2aW91cztcbiAgICAgICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEluc2VydCB0aGUgbm9kZSBhdCBoZWFkXG4gICAgICAgICAgICBpdGVtLnByZXZpb3VzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdGhpcy5faGVhZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQucHJldmlvdXMgPSBpdGVtO1xuICAgICAgICAgICAgdGhpcy5faGVhZCA9IGl0ZW07XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRvdWNoID09PSBUb3VjaC5MYXN0KSB7XG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBpdGVtLm5leHQ7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgICAgICAvLyBVbmxpbmsgdGhlIGl0ZW0uXG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCkge1xuICAgICAgICAgICAgICAgIC8vIG5leHQgbXVzdCBiZSBkZWZpbmVkIHNpbmNlIGl0ZW0gd2FzIG5vdCB0YWlsIGJ1dCBpcyBoZWFkXG4gICAgICAgICAgICAgICAgLy8gU28gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbiBpdGVtIGluIHRoZSBtYXBcbiAgICAgICAgICAgICAgICBuZXh0LnByZXZpb3VzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuX2hlYWQgPSBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQm90aCBuZXh0IGFuZCBwcmV2aW91cyBhcmUgbm90IHVuZGVmaW5lZCBzaW5jZSBpdGVtIHdhcyBuZWl0aGVyIGhlYWQgbm9yIHRhaWwuXG4gICAgICAgICAgICAgICAgbmV4dC5wcmV2aW91cyA9IHByZXZpb3VzO1xuICAgICAgICAgICAgICAgIHByZXZpb3VzLm5leHQgPSBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaXRlbS5wcmV2aW91cyA9IHRoaXMuX3RhaWw7XG4gICAgICAgICAgICB0aGlzLl90YWlsLm5leHQgPSBpdGVtO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW07XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IFtdO1xuICAgICAgICB0aGlzLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGRhdGEucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGZyb21KU09OKGRhdGEpIHtcbiAgICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBkYXRhKSB7XG4gICAgICAgICAgICB0aGlzLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuTGlua2VkTWFwID0gTGlua2VkTWFwO1xuY2xhc3MgTFJVQ2FjaGUgZXh0ZW5kcyBMaW5rZWRNYXAge1xuICAgIGNvbnN0cnVjdG9yKGxpbWl0LCByYXRpbyA9IDEpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fbGltaXQgPSBsaW1pdDtcbiAgICAgICAgdGhpcy5fcmF0aW8gPSBNYXRoLm1pbihNYXRoLm1heCgwLCByYXRpbyksIDEpO1xuICAgIH1cbiAgICBnZXQgbGltaXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9saW1pdDtcbiAgICB9XG4gICAgc2V0IGxpbWl0KGxpbWl0KSB7XG4gICAgICAgIHRoaXMuX2xpbWl0ID0gbGltaXQ7XG4gICAgICAgIHRoaXMuY2hlY2tUcmltKCk7XG4gICAgfVxuICAgIGdldCByYXRpbygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JhdGlvO1xuICAgIH1cbiAgICBzZXQgcmF0aW8ocmF0aW8pIHtcbiAgICAgICAgdGhpcy5fcmF0aW8gPSBNYXRoLm1pbihNYXRoLm1heCgwLCByYXRpbyksIDEpO1xuICAgICAgICB0aGlzLmNoZWNrVHJpbSgpO1xuICAgIH1cbiAgICBnZXQoa2V5LCB0b3VjaCA9IFRvdWNoLkFzTmV3KSB7XG4gICAgICAgIHJldHVybiBzdXBlci5nZXQoa2V5LCB0b3VjaCk7XG4gICAgfVxuICAgIHBlZWsoa2V5KSB7XG4gICAgICAgIHJldHVybiBzdXBlci5nZXQoa2V5LCBUb3VjaC5Ob25lKTtcbiAgICB9XG4gICAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgc3VwZXIuc2V0KGtleSwgdmFsdWUsIFRvdWNoLkxhc3QpO1xuICAgICAgICB0aGlzLmNoZWNrVHJpbSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgY2hlY2tUcmltKCkge1xuICAgICAgICBpZiAodGhpcy5zaXplID4gdGhpcy5fbGltaXQpIHtcbiAgICAgICAgICAgIHRoaXMudHJpbU9sZChNYXRoLnJvdW5kKHRoaXMuX2xpbWl0ICogdGhpcy5fcmF0aW8pKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuTFJVQ2FjaGUgPSBMUlVDYWNoZTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5EaXNwb3NhYmxlID0gdm9pZCAwO1xudmFyIERpc3Bvc2FibGU7XG4oZnVuY3Rpb24gKERpc3Bvc2FibGUpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUoZnVuYykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGlzcG9zZTogZnVuY1xuICAgICAgICB9O1xuICAgIH1cbiAgICBEaXNwb3NhYmxlLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKERpc3Bvc2FibGUgfHwgKGV4cG9ydHMuRGlzcG9zYWJsZSA9IERpc3Bvc2FibGUgPSB7fSkpO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xubGV0IF9yYWw7XG5mdW5jdGlvbiBSQUwoKSB7XG4gICAgaWYgKF9yYWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHJ1bnRpbWUgYWJzdHJhY3Rpb24gbGF5ZXIgaW5zdGFsbGVkYCk7XG4gICAgfVxuICAgIHJldHVybiBfcmFsO1xufVxuKGZ1bmN0aW9uIChSQUwpIHtcbiAgICBmdW5jdGlvbiBpbnN0YWxsKHJhbCkge1xuICAgICAgICBpZiAocmFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gcnVudGltZSBhYnN0cmFjdGlvbiBsYXllciBwcm92aWRlZGApO1xuICAgICAgICB9XG4gICAgICAgIF9yYWwgPSByYWw7XG4gICAgfVxuICAgIFJBTC5pbnN0YWxsID0gaW5zdGFsbDtcbn0pKFJBTCB8fCAoUkFMID0ge30pKTtcbmV4cG9ydHMuZGVmYXVsdCA9IFJBTDtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuRW1pdHRlciA9IGV4cG9ydHMuRXZlbnQgPSB2b2lkIDA7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbnZhciBFdmVudDtcbihmdW5jdGlvbiAoRXZlbnQpIHtcbiAgICBjb25zdCBfZGlzcG9zYWJsZSA9IHsgZGlzcG9zZSgpIHsgfSB9O1xuICAgIEV2ZW50Lk5vbmUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBfZGlzcG9zYWJsZTsgfTtcbn0pKEV2ZW50IHx8IChleHBvcnRzLkV2ZW50ID0gRXZlbnQgPSB7fSkpO1xuY2xhc3MgQ2FsbGJhY2tMaXN0IHtcbiAgICBhZGQoY2FsbGJhY2ssIGNvbnRleHQgPSBudWxsLCBidWNrZXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fY29udGV4dHMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgICAgIHRoaXMuX2NvbnRleHRzLnB1c2goY29udGV4dCk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGJ1Y2tldCkpIHtcbiAgICAgICAgICAgIGJ1Y2tldC5wdXNoKHsgZGlzcG9zZTogKCkgPT4gdGhpcy5yZW1vdmUoY2FsbGJhY2ssIGNvbnRleHQpIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlbW92ZShjYWxsYmFjaywgY29udGV4dCA9IG51bGwpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZm91bmRDYWxsYmFja1dpdGhEaWZmZXJlbnRDb250ZXh0ID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLl9jYWxsYmFja3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jYWxsYmFja3NbaV0gPT09IGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NvbnRleHRzW2ldID09PSBjb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrICYgY29udGV4dCBtYXRjaCA9PiByZW1vdmUgaXRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29udGV4dHMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZENhbGxiYWNrV2l0aERpZmZlcmVudENvbnRleHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZm91bmRDYWxsYmFja1dpdGhEaWZmZXJlbnRDb250ZXh0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1doZW4gYWRkaW5nIGEgbGlzdGVuZXIgd2l0aCBhIGNvbnRleHQsIHlvdSBzaG91bGQgcmVtb3ZlIGl0IHdpdGggdGhlIHNhbWUgY29udGV4dCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGludm9rZSguLi5hcmdzKSB7XG4gICAgICAgIGlmICghdGhpcy5fY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmV0ID0gW10sIGNhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcy5zbGljZSgwKSwgY29udGV4dHMgPSB0aGlzLl9jb250ZXh0cy5zbGljZSgwKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXQucHVzaChjYWxsYmFja3NbaV0uYXBwbHkoY29udGV4dHNbaV0sIGFyZ3MpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS5jb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICAgIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5fY2FsbGJhY2tzIHx8IHRoaXMuX2NhbGxiYWNrcy5sZW5ndGggPT09IDA7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fY29udGV4dHMgPSB1bmRlZmluZWQ7XG4gICAgfVxufVxuY2xhc3MgRW1pdHRlciB7XG4gICAgY29uc3RydWN0b3IoX29wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IF9vcHRpb25zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGb3IgdGhlIHB1YmxpYyB0byBhbGxvdyB0byBzdWJzY3JpYmVcbiAgICAgKiB0byBldmVudHMgZnJvbSB0aGlzIEVtaXR0ZXJcbiAgICAgKi9cbiAgICBnZXQgZXZlbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fZXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50ID0gKGxpc3RlbmVyLCB0aGlzQXJncywgZGlzcG9zYWJsZXMpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2NhbGxiYWNrcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWxsYmFja3MgPSBuZXcgQ2FsbGJhY2tMaXN0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMub25GaXJzdExpc3RlbmVyQWRkICYmIHRoaXMuX2NhbGxiYWNrcy5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy5vbkZpcnN0TGlzdGVuZXJBZGQodGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5hZGQobGlzdGVuZXIsIHRoaXNBcmdzKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlzcG9zYWJsZSBpcyBkaXNwb3NlZCBhZnRlciBlbWl0dGVyIGlzIGRpc3Bvc2VkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5yZW1vdmUobGlzdGVuZXIsIHRoaXNBcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5kaXNwb3NlID0gRW1pdHRlci5fbm9vcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMub25MYXN0TGlzdGVuZXJSZW1vdmUgJiYgdGhpcy5fY2FsbGJhY2tzLmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29wdGlvbnMub25MYXN0TGlzdGVuZXJSZW1vdmUodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRpc3Bvc2FibGVzKSkge1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlcy5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9ldmVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVG8gYmUga2VwdCBwcml2YXRlIHRvIGZpcmUgYW4gZXZlbnQgdG9cbiAgICAgKiBzdWJzY3JpYmVyc1xuICAgICAqL1xuICAgIGZpcmUoZXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NhbGxiYWNrcykge1xuICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzLmludm9rZS5jYWxsKHRoaXMuX2NhbGxiYWNrcywgZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5kaXNwb3NlKCk7XG4gICAgICAgICAgICB0aGlzLl9jYWxsYmFja3MgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLkVtaXR0ZXIgPSBFbWl0dGVyO1xuRW1pdHRlci5fbm9vcCA9IGZ1bmN0aW9uICgpIHsgfTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uVG9rZW4gPSB2b2lkIDA7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbmNvbnN0IElzID0gcmVxdWlyZShcIi4vaXNcIik7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCIuL2V2ZW50c1wiKTtcbnZhciBDYW5jZWxsYXRpb25Ub2tlbjtcbihmdW5jdGlvbiAoQ2FuY2VsbGF0aW9uVG9rZW4pIHtcbiAgICBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGlzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkOiBmYWxzZSxcbiAgICAgICAgb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6IGV2ZW50c18xLkV2ZW50Lk5vbmVcbiAgICB9KTtcbiAgICBDYW5jZWxsYXRpb25Ub2tlbi5DYW5jZWxsZWQgPSBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6IHRydWUsXG4gICAgICAgIG9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkOiBldmVudHNfMS5FdmVudC5Ob25lXG4gICAgfSk7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgKGNhbmRpZGF0ZSA9PT0gQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZVxuICAgICAgICAgICAgfHwgY2FuZGlkYXRlID09PSBDYW5jZWxsYXRpb25Ub2tlbi5DYW5jZWxsZWRcbiAgICAgICAgICAgIHx8IChJcy5ib29sZWFuKGNhbmRpZGF0ZS5pc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkgJiYgISFjYW5kaWRhdGUub25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQpKTtcbiAgICB9XG4gICAgQ2FuY2VsbGF0aW9uVG9rZW4uaXMgPSBpcztcbn0pKENhbmNlbGxhdGlvblRva2VuIHx8IChleHBvcnRzLkNhbmNlbGxhdGlvblRva2VuID0gQ2FuY2VsbGF0aW9uVG9rZW4gPSB7fSkpO1xuY29uc3Qgc2hvcnRjdXRFdmVudCA9IE9iamVjdC5mcmVlemUoZnVuY3Rpb24gKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgY29uc3QgaGFuZGxlID0gKDAsIHJhbF8xLmRlZmF1bHQpKCkudGltZXIuc2V0VGltZW91dChjYWxsYmFjay5iaW5kKGNvbnRleHQpLCAwKTtcbiAgICByZXR1cm4geyBkaXNwb3NlKCkgeyBoYW5kbGUuZGlzcG9zZSgpOyB9IH07XG59KTtcbmNsYXNzIE11dGFibGVUb2tlbiB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX2lzQ2FuY2VsbGVkID0gZmFsc2U7XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9pc0NhbmNlbGxlZCkge1xuICAgICAgICAgICAgdGhpcy5faXNDYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2VtaXR0ZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmZpcmUodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0NhbmNlbGxlZDtcbiAgICB9XG4gICAgZ2V0IG9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKCkge1xuICAgICAgICBpZiAodGhpcy5faXNDYW5jZWxsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBzaG9ydGN1dEV2ZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5fZW1pdHRlcikge1xuICAgICAgICAgICAgdGhpcy5fZW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2VtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLl9lbWl0dGVyKSB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5jbGFzcyBDYW5jZWxsYXRpb25Ub2tlblNvdXJjZSB7XG4gICAgZ2V0IHRva2VuKCkge1xuICAgICAgICBpZiAoIXRoaXMuX3Rva2VuKSB7XG4gICAgICAgICAgICAvLyBiZSBsYXp5IGFuZCBjcmVhdGUgdGhlIHRva2VuIG9ubHkgd2hlblxuICAgICAgICAgICAgLy8gYWN0dWFsbHkgbmVlZGVkXG4gICAgICAgICAgICB0aGlzLl90b2tlbiA9IG5ldyBNdXRhYmxlVG9rZW4oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fdG9rZW47XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl90b2tlbikge1xuICAgICAgICAgICAgLy8gc2F2ZSBhbiBvYmplY3QgYnkgcmV0dXJuaW5nIHRoZSBkZWZhdWx0XG4gICAgICAgICAgICAvLyBjYW5jZWxsZWQgdG9rZW4gd2hlbiBjYW5jZWxsYXRpb24gaGFwcGVuc1xuICAgICAgICAgICAgLy8gYmVmb3JlIHNvbWVvbmUgYXNrcyBmb3IgdGhlIHRva2VuXG4gICAgICAgICAgICB0aGlzLl90b2tlbiA9IENhbmNlbGxhdGlvblRva2VuLkNhbmNlbGxlZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3Rva2VuLmNhbmNlbCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICghdGhpcy5fdG9rZW4pIHtcbiAgICAgICAgICAgIC8vIGVuc3VyZSB0byBpbml0aWFsaXplIHdpdGggYW4gZW1wdHkgdG9rZW4gaWYgd2UgaGFkIG5vbmVcbiAgICAgICAgICAgIHRoaXMuX3Rva2VuID0gQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLl90b2tlbiBpbnN0YW5jZW9mIE11dGFibGVUb2tlbikge1xuICAgICAgICAgICAgLy8gYWN0dWFsbHkgZGlzcG9zZVxuICAgICAgICAgICAgdGhpcy5fdG9rZW4uZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IENhbmNlbGxhdGlvblRva2VuU291cmNlO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3kgPSB2b2lkIDA7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbnZhciBDYW5jZWxsYXRpb25TdGF0ZTtcbihmdW5jdGlvbiAoQ2FuY2VsbGF0aW9uU3RhdGUpIHtcbiAgICBDYW5jZWxsYXRpb25TdGF0ZS5Db250aW51ZSA9IDA7XG4gICAgQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkID0gMTtcbn0pKENhbmNlbGxhdGlvblN0YXRlIHx8IChDYW5jZWxsYXRpb25TdGF0ZSA9IHt9KSk7XG5jbGFzcyBTaGFyZWRBcnJheVNlbmRlclN0cmF0ZWd5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5idWZmZXJzID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICBlbmFibGVDYW5jZWxsYXRpb24ocmVxdWVzdCkge1xuICAgICAgICBpZiAocmVxdWVzdC5pZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBTaGFyZWRBcnJheUJ1ZmZlcig0KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBJbnQzMkFycmF5KGJ1ZmZlciwgMCwgMSk7XG4gICAgICAgIGRhdGFbMF0gPSBDYW5jZWxsYXRpb25TdGF0ZS5Db250aW51ZTtcbiAgICAgICAgdGhpcy5idWZmZXJzLnNldChyZXF1ZXN0LmlkLCBidWZmZXIpO1xuICAgICAgICByZXF1ZXN0LiRjYW5jZWxsYXRpb25EYXRhID0gYnVmZmVyO1xuICAgIH1cbiAgICBhc3luYyBzZW5kQ2FuY2VsbGF0aW9uKF9jb25uLCBpZCkge1xuICAgICAgICBjb25zdCBidWZmZXIgPSB0aGlzLmJ1ZmZlcnMuZ2V0KGlkKTtcbiAgICAgICAgaWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBJbnQzMkFycmF5KGJ1ZmZlciwgMCwgMSk7XG4gICAgICAgIEF0b21pY3Muc3RvcmUoZGF0YSwgMCwgQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkKTtcbiAgICB9XG4gICAgY2xlYW51cChpZCkge1xuICAgICAgICB0aGlzLmJ1ZmZlcnMuZGVsZXRlKGlkKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy5idWZmZXJzLmNsZWFyKCk7XG4gICAgfVxufVxuZXhwb3J0cy5TaGFyZWRBcnJheVNlbmRlclN0cmF0ZWd5ID0gU2hhcmVkQXJyYXlTZW5kZXJTdHJhdGVneTtcbmNsYXNzIFNoYXJlZEFycmF5QnVmZmVyQ2FuY2VsbGF0aW9uVG9rZW4ge1xuICAgIGNvbnN0cnVjdG9yKGJ1ZmZlcikge1xuICAgICAgICB0aGlzLmRhdGEgPSBuZXcgSW50MzJBcnJheShidWZmZXIsIDAsIDEpO1xuICAgIH1cbiAgICBnZXQgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHJldHVybiBBdG9taWNzLmxvYWQodGhpcy5kYXRhLCAwKSA9PT0gQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkO1xuICAgIH1cbiAgICBnZXQgb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuY2VsbGF0aW9uIG92ZXIgU2hhcmVkQXJyYXlCdWZmZXIgZG9lc24ndCBzdXBwb3J0IGNhbmNlbGxhdGlvbiBldmVudHNgKTtcbiAgICB9XG59XG5jbGFzcyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuU291cmNlIHtcbiAgICBjb25zdHJ1Y3RvcihidWZmZXIpIHtcbiAgICAgICAgdGhpcy50b2tlbiA9IG5ldyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuKGJ1ZmZlcik7XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICB9XG59XG5jbGFzcyBTaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmtpbmQgPSAncmVxdWVzdCc7XG4gICAgfVxuICAgIGNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKHJlcXVlc3QpIHtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gcmVxdWVzdC4kY2FuY2VsbGF0aW9uRGF0YTtcbiAgICAgICAgaWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuU291cmNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuU291cmNlKGJ1ZmZlcik7XG4gICAgfVxufVxuZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBTaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3k7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNlbWFwaG9yZSA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY2xhc3MgU2VtYXBob3JlIHtcbiAgICBjb25zdHJ1Y3RvcihjYXBhY2l0eSA9IDEpIHtcbiAgICAgICAgaWYgKGNhcGFjaXR5IDw9IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FwYWNpdHkgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NhcGFjaXR5ID0gY2FwYWNpdHk7XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IDA7XG4gICAgICAgIHRoaXMuX3dhaXRpbmcgPSBbXTtcbiAgICB9XG4gICAgbG9jayh0aHVuaykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fd2FpdGluZy5wdXNoKHsgdGh1bmssIHJlc29sdmUsIHJlamVjdCB9KTtcbiAgICAgICAgICAgIHRoaXMucnVuTmV4dCgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0IGFjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTtcbiAgICB9XG4gICAgcnVuTmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dhaXRpbmcubGVuZ3RoID09PSAwIHx8IHRoaXMuX2FjdGl2ZSA9PT0gdGhpcy5fY2FwYWNpdHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS50aW1lci5zZXRJbW1lZGlhdGUoKCkgPT4gdGhpcy5kb1J1bk5leHQoKSk7XG4gICAgfVxuICAgIGRvUnVuTmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dhaXRpbmcubGVuZ3RoID09PSAwIHx8IHRoaXMuX2FjdGl2ZSA9PT0gdGhpcy5fY2FwYWNpdHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5fd2FpdGluZy5zaGlmdCgpO1xuICAgICAgICB0aGlzLl9hY3RpdmUrKztcbiAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZSA+IHRoaXMuX2NhcGFjaXR5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRvIG1hbnkgdGh1bmtzIGFjdGl2ZWApO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXh0LnRodW5rKCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC50aGVuKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5yZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5OZXh0KCk7XG4gICAgICAgICAgICAgICAgfSwgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5yZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5OZXh0KCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICBuZXh0LnJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1bk5leHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgIG5leHQucmVqZWN0KGVycik7XG4gICAgICAgICAgICB0aGlzLnJ1bk5leHQoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuU2VtYXBob3JlID0gU2VtYXBob3JlO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXIgPSBleHBvcnRzLkFic3RyYWN0TWVzc2FnZVJlYWRlciA9IGV4cG9ydHMuTWVzc2FnZVJlYWRlciA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IGV2ZW50c18xID0gcmVxdWlyZShcIi4vZXZlbnRzXCIpO1xuY29uc3Qgc2VtYXBob3JlXzEgPSByZXF1aXJlKFwiLi9zZW1hcGhvcmVcIik7XG52YXIgTWVzc2FnZVJlYWRlcjtcbihmdW5jdGlvbiAoTWVzc2FnZVJlYWRlcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5saXN0ZW4pICYmIElzLmZ1bmMoY2FuZGlkYXRlLmRpc3Bvc2UpICYmXG4gICAgICAgICAgICBJcy5mdW5jKGNhbmRpZGF0ZS5vbkVycm9yKSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5vbkNsb3NlKSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5vblBhcnRpYWxNZXNzYWdlKTtcbiAgICB9XG4gICAgTWVzc2FnZVJlYWRlci5pcyA9IGlzO1xufSkoTWVzc2FnZVJlYWRlciB8fCAoZXhwb3J0cy5NZXNzYWdlUmVhZGVyID0gTWVzc2FnZVJlYWRlciA9IHt9KSk7XG5jbGFzcyBBYnN0cmFjdE1lc3NhZ2VSZWFkZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZUVtaXR0ZXIgPSBuZXcgZXZlbnRzXzEuRW1pdHRlcigpO1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlci5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgZ2V0IG9uRXJyb3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVycm9yRW1pdHRlci5ldmVudDtcbiAgICB9XG4gICAgZmlyZUVycm9yKGVycm9yKSB7XG4gICAgICAgIHRoaXMuZXJyb3JFbWl0dGVyLmZpcmUodGhpcy5hc0Vycm9yKGVycm9yKSk7XG4gICAgfVxuICAgIGdldCBvbkNsb3NlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9zZUVtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGZpcmVDbG9zZSgpIHtcbiAgICAgICAgdGhpcy5jbG9zZUVtaXR0ZXIuZmlyZSh1bmRlZmluZWQpO1xuICAgIH1cbiAgICBnZXQgb25QYXJ0aWFsTWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFydGlhbE1lc3NhZ2VFbWl0dGVyLmV2ZW50O1xuICAgIH1cbiAgICBmaXJlUGFydGlhbE1lc3NhZ2UoaW5mbykge1xuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlRW1pdHRlci5maXJlKGluZm8pO1xuICAgIH1cbiAgICBhc0Vycm9yKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKGBSZWFkZXIgcmVjZWl2ZWQgZXJyb3IuIFJlYXNvbjogJHtJcy5zdHJpbmcoZXJyb3IubWVzc2FnZSkgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24nfWApO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VSZWFkZXIgPSBBYnN0cmFjdE1lc3NhZ2VSZWFkZXI7XG52YXIgUmVzb2x2ZWRNZXNzYWdlUmVhZGVyT3B0aW9ucztcbihmdW5jdGlvbiAoUmVzb2x2ZWRNZXNzYWdlUmVhZGVyT3B0aW9ucykge1xuICAgIGZ1bmN0aW9uIGZyb21PcHRpb25zKG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IGNoYXJzZXQ7XG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIGxldCBjb250ZW50RGVjb2RlcjtcbiAgICAgICAgY29uc3QgY29udGVudERlY29kZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICBsZXQgY29udGVudFR5cGVEZWNvZGVyO1xuICAgICAgICBjb25zdCBjb250ZW50VHlwZURlY29kZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY2hhcnNldCA9IG9wdGlvbnMgPz8gJ3V0Zi04JztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNoYXJzZXQgPSBvcHRpb25zLmNoYXJzZXQgPz8gJ3V0Zi04JztcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnREZWNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50RGVjb2RlciA9IG9wdGlvbnMuY29udGVudERlY29kZXI7XG4gICAgICAgICAgICAgICAgY29udGVudERlY29kZXJzLnNldChjb250ZW50RGVjb2Rlci5uYW1lLCBjb250ZW50RGVjb2Rlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5jb250ZW50RGVjb2RlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGVjb2RlciBvZiBvcHRpb25zLmNvbnRlbnREZWNvZGVycykge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50RGVjb2RlcnMuc2V0KGRlY29kZXIubmFtZSwgZGVjb2Rlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuY29udGVudFR5cGVEZWNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXIgPSBvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcjtcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXJzLnNldChjb250ZW50VHlwZURlY29kZXIubmFtZSwgY29udGVudFR5cGVEZWNvZGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGVjb2RlciBvZiBvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGVEZWNvZGVycy5zZXQoZGVjb2Rlci5uYW1lLCBkZWNvZGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnRlbnRUeXBlRGVjb2RlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXIgPSAoMCwgcmFsXzEuZGVmYXVsdCkoKS5hcHBsaWNhdGlvbkpzb24uZGVjb2RlcjtcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlRGVjb2RlcnMuc2V0KGNvbnRlbnRUeXBlRGVjb2Rlci5uYW1lLCBjb250ZW50VHlwZURlY29kZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGNoYXJzZXQsIGNvbnRlbnREZWNvZGVyLCBjb250ZW50RGVjb2RlcnMsIGNvbnRlbnRUeXBlRGVjb2RlciwgY29udGVudFR5cGVEZWNvZGVycyB9O1xuICAgIH1cbiAgICBSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zLmZyb21PcHRpb25zID0gZnJvbU9wdGlvbnM7XG59KShSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zIHx8IChSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zID0ge30pKTtcbmNsYXNzIFJlYWRhYmxlU3RyZWFtTWVzc2FnZVJlYWRlciBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVJlYWRlciB7XG4gICAgY29uc3RydWN0b3IocmVhZGFibGUsIG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZSA9IHJlYWRhYmxlO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zLmZyb21PcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmJ1ZmZlciA9ICgwLCByYWxfMS5kZWZhdWx0KSgpLm1lc3NhZ2VCdWZmZXIuY3JlYXRlKHRoaXMub3B0aW9ucy5jaGFyc2V0KTtcbiAgICAgICAgdGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0ID0gMTAwMDA7XG4gICAgICAgIHRoaXMubmV4dE1lc3NhZ2VMZW5ndGggPSAtMTtcbiAgICAgICAgdGhpcy5tZXNzYWdlVG9rZW4gPSAwO1xuICAgICAgICB0aGlzLnJlYWRTZW1hcGhvcmUgPSBuZXcgc2VtYXBob3JlXzEuU2VtYXBob3JlKDEpO1xuICAgIH1cbiAgICBzZXQgcGFydGlhbE1lc3NhZ2VUaW1lb3V0KHRpbWVvdXQpIHtcbiAgICAgICAgdGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0ID0gdGltZW91dDtcbiAgICB9XG4gICAgZ2V0IHBhcnRpYWxNZXNzYWdlVGltZW91dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dDtcbiAgICB9XG4gICAgbGlzdGVuKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMubmV4dE1lc3NhZ2VMZW5ndGggPSAtMTtcbiAgICAgICAgdGhpcy5tZXNzYWdlVG9rZW4gPSAwO1xuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlVGltZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5yZWFkYWJsZS5vbkRhdGEoKGRhdGEpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25EYXRhKGRhdGEpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZS5vbkVycm9yKChlcnJvcikgPT4gdGhpcy5maXJlRXJyb3IoZXJyb3IpKTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZS5vbkNsb3NlKCgpID0+IHRoaXMuZmlyZUNsb3NlKCkpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBvbkRhdGEoZGF0YSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5idWZmZXIuYXBwZW5kKGRhdGEpO1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IHRoaXMuYnVmZmVyLnRyeVJlYWRIZWFkZXJzKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50TGVuZ3RoID0gaGVhZGVycy5nZXQoJ2NvbnRlbnQtbGVuZ3RoJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY29udGVudExlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IobmV3IEVycm9yKGBIZWFkZXIgbXVzdCBwcm92aWRlIGEgQ29udGVudC1MZW5ndGggcHJvcGVydHkuXFxuJHtKU09OLnN0cmluZ2lmeShPYmplY3QuZnJvbUVudHJpZXMoaGVhZGVycykpfWApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsZW5ndGggPSBwYXJzZUludChjb250ZW50TGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKGxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKG5ldyBFcnJvcihgQ29udGVudC1MZW5ndGggdmFsdWUgbXVzdCBiZSBhIG51bWJlci4gR290ICR7Y29udGVudExlbmd0aH1gKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IHRoaXMuYnVmZmVyLnRyeVJlYWRCb2R5KHRoaXMubmV4dE1lc3NhZ2VMZW5ndGgpO1xuICAgICAgICAgICAgICAgIGlmIChib2R5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLyoqIFdlIGhhdmVuJ3QgcmVjZWl2ZWQgdGhlIGZ1bGwgbWVzc2FnZSB5ZXQuICovXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0UGFydGlhbE1lc3NhZ2VUaW1lcigpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJQYXJ0aWFsTWVzc2FnZVRpbWVyKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9IC0xO1xuICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHdlIGNvbnZlcnQgb25lIHJlY2VpdmVkIG1lc3NhZ2UgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAgICAgLy8gb3RoZXIuIE90aGVyd2lzZSBpdCBjb3VsZCBoYXBwZW4gdGhhdCBhIGRlY29kaW5nIG9mIGEgc2Vjb25kXG4gICAgICAgICAgICAgICAgLy8gc21hbGxlciBtZXNzYWdlIGZpbmlzaGVkIGJlZm9yZSB0aGUgZGVjb2Rpbmcgb2YgYSBmaXJzdCBsYXJnZXJcbiAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIGFuZCB0aGVuIHdlIHdvdWxkIGRlbGl2ZXIgdGhlIHNlY29uZCBtZXNzYWdlIGZpcnN0LlxuICAgICAgICAgICAgICAgIHRoaXMucmVhZFNlbWFwaG9yZS5sb2NrKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnl0ZXMgPSB0aGlzLm9wdGlvbnMuY29udGVudERlY29kZXIgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBhd2FpdCB0aGlzLm9wdGlvbnMuY29udGVudERlY29kZXIuZGVjb2RlKGJvZHkpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGJvZHk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBhd2FpdCB0aGlzLm9wdGlvbnMuY29udGVudFR5cGVEZWNvZGVyLmRlY29kZShieXRlcywgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjayhtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNsZWFyUGFydGlhbE1lc3NhZ2VUaW1lcigpIHtcbiAgICAgICAgaWYgKHRoaXMucGFydGlhbE1lc3NhZ2VUaW1lcikge1xuICAgICAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZVRpbWVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRoaXMucGFydGlhbE1lc3NhZ2VUaW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRQYXJ0aWFsTWVzc2FnZVRpbWVyKCkge1xuICAgICAgICB0aGlzLmNsZWFyUGFydGlhbE1lc3NhZ2VUaW1lcigpO1xuICAgICAgICBpZiAodGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0IDw9IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlVGltZXIgPSAoMCwgcmFsXzEuZGVmYXVsdCkoKS50aW1lci5zZXRUaW1lb3V0KCh0b2tlbiwgdGltZW91dCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZVRpbWVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRva2VuID09PSB0aGlzLm1lc3NhZ2VUb2tlbikge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZVBhcnRpYWxNZXNzYWdlKHsgbWVzc2FnZVRva2VuOiB0b2tlbiwgd2FpdGluZ1RpbWU6IHRpbWVvdXQgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRQYXJ0aWFsTWVzc2FnZVRpbWVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dCwgdGhpcy5tZXNzYWdlVG9rZW4sIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dCk7XG4gICAgfVxufVxuZXhwb3J0cy5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXIgPSBSZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLldyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLkFic3RyYWN0TWVzc2FnZVdyaXRlciA9IGV4cG9ydHMuTWVzc2FnZVdyaXRlciA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IHNlbWFwaG9yZV8xID0gcmVxdWlyZShcIi4vc2VtYXBob3JlXCIpO1xuY29uc3QgZXZlbnRzXzEgPSByZXF1aXJlKFwiLi9ldmVudHNcIik7XG5jb25zdCBDb250ZW50TGVuZ3RoID0gJ0NvbnRlbnQtTGVuZ3RoOiAnO1xuY29uc3QgQ1JMRiA9ICdcXHJcXG4nO1xudmFyIE1lc3NhZ2VXcml0ZXI7XG4oZnVuY3Rpb24gKE1lc3NhZ2VXcml0ZXIpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgSXMuZnVuYyhjYW5kaWRhdGUuZGlzcG9zZSkgJiYgSXMuZnVuYyhjYW5kaWRhdGUub25DbG9zZSkgJiZcbiAgICAgICAgICAgIElzLmZ1bmMoY2FuZGlkYXRlLm9uRXJyb3IpICYmIElzLmZ1bmMoY2FuZGlkYXRlLndyaXRlKTtcbiAgICB9XG4gICAgTWVzc2FnZVdyaXRlci5pcyA9IGlzO1xufSkoTWVzc2FnZVdyaXRlciB8fCAoZXhwb3J0cy5NZXNzYWdlV3JpdGVyID0gTWVzc2FnZVdyaXRlciA9IHt9KSk7XG5jbGFzcyBBYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy5lcnJvckVtaXR0ZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLmNsb3NlRW1pdHRlci5kaXNwb3NlKCk7XG4gICAgfVxuICAgIGdldCBvbkVycm9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lcnJvckVtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGZpcmVFcnJvcihlcnJvciwgbWVzc2FnZSwgY291bnQpIHtcbiAgICAgICAgdGhpcy5lcnJvckVtaXR0ZXIuZmlyZShbdGhpcy5hc0Vycm9yKGVycm9yKSwgbWVzc2FnZSwgY291bnRdKTtcbiAgICB9XG4gICAgZ2V0IG9uQ2xvc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb3NlRW1pdHRlci5ldmVudDtcbiAgICB9XG4gICAgZmlyZUNsb3NlKCkge1xuICAgICAgICB0aGlzLmNsb3NlRW1pdHRlci5maXJlKHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIGFzRXJyb3IoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoYFdyaXRlciByZWNlaXZlZCBlcnJvci4gUmVhc29uOiAke0lzLnN0cmluZyhlcnJvci5tZXNzYWdlKSA/IGVycm9yLm1lc3NhZ2UgOiAndW5rbm93bid9YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLkFic3RyYWN0TWVzc2FnZVdyaXRlciA9IEFic3RyYWN0TWVzc2FnZVdyaXRlcjtcbnZhciBSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zO1xuKGZ1bmN0aW9uIChSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zKSB7XG4gICAgZnVuY3Rpb24gZnJvbU9wdGlvbnMob3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHsgY2hhcnNldDogb3B0aW9ucyA/PyAndXRmLTgnLCBjb250ZW50VHlwZUVuY29kZXI6ICgwLCByYWxfMS5kZWZhdWx0KSgpLmFwcGxpY2F0aW9uSnNvbi5lbmNvZGVyIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4geyBjaGFyc2V0OiBvcHRpb25zLmNoYXJzZXQgPz8gJ3V0Zi04JywgY29udGVudEVuY29kZXI6IG9wdGlvbnMuY29udGVudEVuY29kZXIsIGNvbnRlbnRUeXBlRW5jb2Rlcjogb3B0aW9ucy5jb250ZW50VHlwZUVuY29kZXIgPz8gKDAsIHJhbF8xLmRlZmF1bHQpKCkuYXBwbGljYXRpb25Kc29uLmVuY29kZXIgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zLmZyb21PcHRpb25zID0gZnJvbU9wdGlvbnM7XG59KShSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zIHx8IChSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zID0ge30pKTtcbmNsYXNzIFdyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKHdyaXRhYmxlLCBvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMud3JpdGFibGUgPSB3cml0YWJsZTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gUmVzb2x2ZWRNZXNzYWdlV3JpdGVyT3B0aW9ucy5mcm9tT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50ID0gMDtcbiAgICAgICAgdGhpcy53cml0ZVNlbWFwaG9yZSA9IG5ldyBzZW1hcGhvcmVfMS5TZW1hcGhvcmUoMSk7XG4gICAgICAgIHRoaXMud3JpdGFibGUub25FcnJvcigoZXJyb3IpID0+IHRoaXMuZmlyZUVycm9yKGVycm9yKSk7XG4gICAgICAgIHRoaXMud3JpdGFibGUub25DbG9zZSgoKSA9PiB0aGlzLmZpcmVDbG9zZSgpKTtcbiAgICB9XG4gICAgYXN5bmMgd3JpdGUobXNnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndyaXRlU2VtYXBob3JlLmxvY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHRoaXMub3B0aW9ucy5jb250ZW50VHlwZUVuY29kZXIuZW5jb2RlKG1zZywgdGhpcy5vcHRpb25zKS50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNvbnRlbnRFbmNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jb250ZW50RW5jb2Rlci5lbmNvZGUoYnVmZmVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZC50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJzID0gW107XG4gICAgICAgICAgICAgICAgaGVhZGVycy5wdXNoKENvbnRlbnRMZW5ndGgsIGJ1ZmZlci5ieXRlTGVuZ3RoLnRvU3RyaW5nKCksIENSTEYpO1xuICAgICAgICAgICAgICAgIGhlYWRlcnMucHVzaChDUkxGKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kb1dyaXRlKG1zZywgaGVhZGVycywgYnVmZmVyKTtcbiAgICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgZG9Xcml0ZShtc2csIGhlYWRlcnMsIGRhdGEpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMud3JpdGFibGUud3JpdGUoaGVhZGVycy5qb2luKCcnKSwgJ2FzY2lpJyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy53cml0YWJsZS53cml0ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IsIG1zZyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZUVycm9yKGVycm9yLCBtc2cpIHtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50Kys7XG4gICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yLCBtc2csIHRoaXMuZXJyb3JDb3VudCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICAgICAgdGhpcy53cml0YWJsZS5lbmQoKTtcbiAgICB9XG59XG5leHBvcnRzLldyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgPSBXcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkFic3RyYWN0TWVzc2FnZUJ1ZmZlciA9IHZvaWQgMDtcbmNvbnN0IENSID0gMTM7XG5jb25zdCBMRiA9IDEwO1xuY29uc3QgQ1JMRiA9ICdcXHJcXG4nO1xuY2xhc3MgQWJzdHJhY3RNZXNzYWdlQnVmZmVyIHtcbiAgICBjb25zdHJ1Y3RvcihlbmNvZGluZyA9ICd1dGYtOCcpIHtcbiAgICAgICAgdGhpcy5fZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgICAgICAgdGhpcy5fY2h1bmtzID0gW107XG4gICAgICAgIHRoaXMuX3RvdGFsTGVuZ3RoID0gMDtcbiAgICB9XG4gICAgZ2V0IGVuY29kaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW5jb2Rpbmc7XG4gICAgfVxuICAgIGFwcGVuZChjaHVuaykge1xuICAgICAgICBjb25zdCB0b0FwcGVuZCA9IHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZycgPyB0aGlzLmZyb21TdHJpbmcoY2h1bmssIHRoaXMuX2VuY29kaW5nKSA6IGNodW5rO1xuICAgICAgICB0aGlzLl9jaHVua3MucHVzaCh0b0FwcGVuZCk7XG4gICAgICAgIHRoaXMuX3RvdGFsTGVuZ3RoICs9IHRvQXBwZW5kLmJ5dGVMZW5ndGg7XG4gICAgfVxuICAgIHRyeVJlYWRIZWFkZXJzKGxvd2VyQ2FzZUtleXMgPSBmYWxzZSkge1xuICAgICAgICBpZiAodGhpcy5fY2h1bmtzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3RhdGUgPSAwO1xuICAgICAgICBsZXQgY2h1bmtJbmRleCA9IDA7XG4gICAgICAgIGxldCBvZmZzZXQgPSAwO1xuICAgICAgICBsZXQgY2h1bmtCeXRlc1JlYWQgPSAwO1xuICAgICAgICByb3c6IHdoaWxlIChjaHVua0luZGV4IDwgdGhpcy5fY2h1bmtzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgY2h1bmsgPSB0aGlzLl9jaHVua3NbY2h1bmtJbmRleF07XG4gICAgICAgICAgICBvZmZzZXQgPSAwO1xuICAgICAgICAgICAgY29sdW1uOiB3aGlsZSAob2Zmc2V0IDwgY2h1bmsubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjaHVua1tvZmZzZXRdO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDUjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIExGOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gNDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHJvdztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjaHVua0J5dGVzUmVhZCArPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgY2h1bmtJbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZSAhPT0gNCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgYnVmZmVyIGNvbnRhaW5zIHRoZSB0d28gQ1JMRiBhdCB0aGUgZW5kLiBTbyB3ZSB3aWxsXG4gICAgICAgIC8vIGhhdmUgdHdvIGVtcHR5IGxpbmVzIGFmdGVyIHRoZSBzcGxpdCBhdCB0aGUgZW5kIGFzIHdlbGwuXG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuX3JlYWQoY2h1bmtCeXRlc1JlYWQgKyBvZmZzZXQpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwKCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLnRvU3RyaW5nKGJ1ZmZlciwgJ2FzY2lpJykuc3BsaXQoQ1JMRik7XG4gICAgICAgIGlmIChoZWFkZXJzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXJzLmxlbmd0aCAtIDI7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaGVhZGVyID0gaGVhZGVyc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gaGVhZGVyLmluZGV4T2YoJzonKTtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1lc3NhZ2UgaGVhZGVyIG11c3Qgc2VwYXJhdGUga2V5IGFuZCB2YWx1ZSB1c2luZyAnOidcXG4ke2hlYWRlcn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGhlYWRlci5zdWJzdHIoMCwgaW5kZXgpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBoZWFkZXIuc3Vic3RyKGluZGV4ICsgMSkudHJpbSgpO1xuICAgICAgICAgICAgcmVzdWx0LnNldChsb3dlckNhc2VLZXlzID8ga2V5LnRvTG93ZXJDYXNlKCkgOiBrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICB0cnlSZWFkQm9keShsZW5ndGgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3RvdGFsTGVuZ3RoIDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkKGxlbmd0aCk7XG4gICAgfVxuICAgIGdldCBudW1iZXJPZkJ5dGVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdG90YWxMZW5ndGg7XG4gICAgfVxuICAgIF9yZWFkKGJ5dGVDb3VudCkge1xuICAgICAgICBpZiAoYnl0ZUNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbXB0eUJ1ZmZlcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChieXRlQ291bnQgPiB0aGlzLl90b3RhbExlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVhZCBzbyBtYW55IGJ5dGVzIWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jaHVua3NbMF0uYnl0ZUxlbmd0aCA9PT0gYnl0ZUNvdW50KSB7XG4gICAgICAgICAgICAvLyBzdXBlciBmYXN0IHBhdGgsIHByZWNpc2VseSBmaXJzdCBjaHVuayBtdXN0IGJlIHJldHVybmVkXG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1swXTtcbiAgICAgICAgICAgIHRoaXMuX2NodW5rcy5zaGlmdCgpO1xuICAgICAgICAgICAgdGhpcy5fdG90YWxMZW5ndGggLT0gYnl0ZUNvdW50O1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXNOYXRpdmUoY2h1bmspO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jaHVua3NbMF0uYnl0ZUxlbmd0aCA+IGJ5dGVDb3VudCkge1xuICAgICAgICAgICAgLy8gZmFzdCBwYXRoLCB0aGUgcmVhZGluZyBpcyBlbnRpcmVseSB3aXRoaW4gdGhlIGZpcnN0IGNodW5rXG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1swXTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuYXNOYXRpdmUoY2h1bmssIGJ5dGVDb3VudCk7XG4gICAgICAgICAgICB0aGlzLl9jaHVua3NbMF0gPSBjaHVuay5zbGljZShieXRlQ291bnQpO1xuICAgICAgICAgICAgdGhpcy5fdG90YWxMZW5ndGggLT0gYnl0ZUNvdW50O1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmFsbG9jTmF0aXZlKGJ5dGVDb3VudCk7XG4gICAgICAgIGxldCByZXN1bHRPZmZzZXQgPSAwO1xuICAgICAgICBsZXQgY2h1bmtJbmRleCA9IDA7XG4gICAgICAgIHdoaWxlIChieXRlQ291bnQgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1tjaHVua0luZGV4XTtcbiAgICAgICAgICAgIGlmIChjaHVuay5ieXRlTGVuZ3RoID4gYnl0ZUNvdW50KSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBjaHVuayB3aWxsIHN1cnZpdmVcbiAgICAgICAgICAgICAgICBjb25zdCBjaHVua1BhcnQgPSBjaHVuay5zbGljZSgwLCBieXRlQ291bnQpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5zZXQoY2h1bmtQYXJ0LCByZXN1bHRPZmZzZXQpO1xuICAgICAgICAgICAgICAgIHJlc3VsdE9mZnNldCArPSBieXRlQ291bnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2h1bmtzW2NodW5rSW5kZXhdID0gY2h1bmsuc2xpY2UoYnl0ZUNvdW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLl90b3RhbExlbmd0aCAtPSBieXRlQ291bnQ7XG4gICAgICAgICAgICAgICAgYnl0ZUNvdW50IC09IGJ5dGVDb3VudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHRoaXMgY2h1bmsgd2lsbCBiZSBlbnRpcmVseSByZWFkXG4gICAgICAgICAgICAgICAgcmVzdWx0LnNldChjaHVuaywgcmVzdWx0T2Zmc2V0KTtcbiAgICAgICAgICAgICAgICByZXN1bHRPZmZzZXQgKz0gY2h1bmsuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgICAgICB0aGlzLl9jaHVua3Muc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl90b3RhbExlbmd0aCAtPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgICAgIGJ5dGVDb3VudCAtPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VCdWZmZXIgPSBBYnN0cmFjdE1lc3NhZ2VCdWZmZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uID0gZXhwb3J0cy5Db25uZWN0aW9uT3B0aW9ucyA9IGV4cG9ydHMuTWVzc2FnZVN0cmF0ZWd5ID0gZXhwb3J0cy5DYW5jZWxsYXRpb25TdHJhdGVneSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gZXhwb3J0cy5JZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IGV4cG9ydHMuQ29ubmVjdGlvbkVycm9yID0gZXhwb3J0cy5Db25uZWN0aW9uRXJyb3JzID0gZXhwb3J0cy5Mb2dUcmFjZU5vdGlmaWNhdGlvbiA9IGV4cG9ydHMuU2V0VHJhY2VOb3RpZmljYXRpb24gPSBleHBvcnRzLlRyYWNlRm9ybWF0ID0gZXhwb3J0cy5UcmFjZVZhbHVlcyA9IGV4cG9ydHMuVHJhY2UgPSBleHBvcnRzLk51bGxMb2dnZXIgPSBleHBvcnRzLlByb2dyZXNzVHlwZSA9IGV4cG9ydHMuUHJvZ3Jlc3NUb2tlbiA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IG1lc3NhZ2VzXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlc1wiKTtcbmNvbnN0IGxpbmtlZE1hcF8xID0gcmVxdWlyZShcIi4vbGlua2VkTWFwXCIpO1xuY29uc3QgZXZlbnRzXzEgPSByZXF1aXJlKFwiLi9ldmVudHNcIik7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbnZhciBDYW5jZWxOb3RpZmljYXRpb247XG4oZnVuY3Rpb24gKENhbmNlbE5vdGlmaWNhdGlvbikge1xuICAgIENhbmNlbE5vdGlmaWNhdGlvbi50eXBlID0gbmV3IG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZSgnJC9jYW5jZWxSZXF1ZXN0Jyk7XG59KShDYW5jZWxOb3RpZmljYXRpb24gfHwgKENhbmNlbE5vdGlmaWNhdGlvbiA9IHt9KSk7XG52YXIgUHJvZ3Jlc3NUb2tlbjtcbihmdW5jdGlvbiAoUHJvZ3Jlc3NUb2tlbikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG4gICAgfVxuICAgIFByb2dyZXNzVG9rZW4uaXMgPSBpcztcbn0pKFByb2dyZXNzVG9rZW4gfHwgKGV4cG9ydHMuUHJvZ3Jlc3NUb2tlbiA9IFByb2dyZXNzVG9rZW4gPSB7fSkpO1xudmFyIFByb2dyZXNzTm90aWZpY2F0aW9uO1xuKGZ1bmN0aW9uIChQcm9ncmVzc05vdGlmaWNhdGlvbikge1xuICAgIFByb2dyZXNzTm90aWZpY2F0aW9uLnR5cGUgPSBuZXcgbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlKCckL3Byb2dyZXNzJyk7XG59KShQcm9ncmVzc05vdGlmaWNhdGlvbiB8fCAoUHJvZ3Jlc3NOb3RpZmljYXRpb24gPSB7fSkpO1xuY2xhc3MgUHJvZ3Jlc3NUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICB9XG59XG5leHBvcnRzLlByb2dyZXNzVHlwZSA9IFByb2dyZXNzVHlwZTtcbnZhciBTdGFyUmVxdWVzdEhhbmRsZXI7XG4oZnVuY3Rpb24gKFN0YXJSZXF1ZXN0SGFuZGxlcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBJcy5mdW5jKHZhbHVlKTtcbiAgICB9XG4gICAgU3RhclJlcXVlc3RIYW5kbGVyLmlzID0gaXM7XG59KShTdGFyUmVxdWVzdEhhbmRsZXIgfHwgKFN0YXJSZXF1ZXN0SGFuZGxlciA9IHt9KSk7XG5leHBvcnRzLk51bGxMb2dnZXIgPSBPYmplY3QuZnJlZXplKHtcbiAgICBlcnJvcjogKCkgPT4geyB9LFxuICAgIHdhcm46ICgpID0+IHsgfSxcbiAgICBpbmZvOiAoKSA9PiB7IH0sXG4gICAgbG9nOiAoKSA9PiB7IH1cbn0pO1xudmFyIFRyYWNlO1xuKGZ1bmN0aW9uIChUcmFjZSkge1xuICAgIFRyYWNlW1RyYWNlW1wiT2ZmXCJdID0gMF0gPSBcIk9mZlwiO1xuICAgIFRyYWNlW1RyYWNlW1wiTWVzc2FnZXNcIl0gPSAxXSA9IFwiTWVzc2FnZXNcIjtcbiAgICBUcmFjZVtUcmFjZVtcIkNvbXBhY3RcIl0gPSAyXSA9IFwiQ29tcGFjdFwiO1xuICAgIFRyYWNlW1RyYWNlW1wiVmVyYm9zZVwiXSA9IDNdID0gXCJWZXJib3NlXCI7XG59KShUcmFjZSB8fCAoZXhwb3J0cy5UcmFjZSA9IFRyYWNlID0ge30pKTtcbnZhciBUcmFjZVZhbHVlcztcbihmdW5jdGlvbiAoVHJhY2VWYWx1ZXMpIHtcbiAgICAvKipcbiAgICAgKiBUdXJuIHRyYWNpbmcgb2ZmLlxuICAgICAqL1xuICAgIFRyYWNlVmFsdWVzLk9mZiA9ICdvZmYnO1xuICAgIC8qKlxuICAgICAqIFRyYWNlIG1lc3NhZ2VzIG9ubHkuXG4gICAgICovXG4gICAgVHJhY2VWYWx1ZXMuTWVzc2FnZXMgPSAnbWVzc2FnZXMnO1xuICAgIC8qKlxuICAgICAqIENvbXBhY3QgbWVzc2FnZSB0cmFjaW5nLlxuICAgICAqL1xuICAgIFRyYWNlVmFsdWVzLkNvbXBhY3QgPSAnY29tcGFjdCc7XG4gICAgLyoqXG4gICAgICogVmVyYm9zZSBtZXNzYWdlIHRyYWNpbmcuXG4gICAgICovXG4gICAgVHJhY2VWYWx1ZXMuVmVyYm9zZSA9ICd2ZXJib3NlJztcbn0pKFRyYWNlVmFsdWVzIHx8IChleHBvcnRzLlRyYWNlVmFsdWVzID0gVHJhY2VWYWx1ZXMgPSB7fSkpO1xuKGZ1bmN0aW9uIChUcmFjZSkge1xuICAgIGZ1bmN0aW9uIGZyb21TdHJpbmcodmFsdWUpIHtcbiAgICAgICAgaWYgKCFJcy5zdHJpbmcodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gVHJhY2UuT2ZmO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSAnb2ZmJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gVHJhY2UuT2ZmO1xuICAgICAgICAgICAgY2FzZSAnbWVzc2FnZXMnOlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5NZXNzYWdlcztcbiAgICAgICAgICAgIGNhc2UgJ2NvbXBhY3QnOlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5Db21wYWN0O1xuICAgICAgICAgICAgY2FzZSAndmVyYm9zZSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFRyYWNlLlZlcmJvc2U7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5PZmY7XG4gICAgICAgIH1cbiAgICB9XG4gICAgVHJhY2UuZnJvbVN0cmluZyA9IGZyb21TdHJpbmc7XG4gICAgZnVuY3Rpb24gdG9TdHJpbmcodmFsdWUpIHtcbiAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5PZmY6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdvZmYnO1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5NZXNzYWdlczpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ21lc3NhZ2VzJztcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuQ29tcGFjdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2NvbXBhY3QnO1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5WZXJib3NlOlxuICAgICAgICAgICAgICAgIHJldHVybiAndmVyYm9zZSc7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAnb2ZmJztcbiAgICAgICAgfVxuICAgIH1cbiAgICBUcmFjZS50b1N0cmluZyA9IHRvU3RyaW5nO1xufSkoVHJhY2UgfHwgKGV4cG9ydHMuVHJhY2UgPSBUcmFjZSA9IHt9KSk7XG52YXIgVHJhY2VGb3JtYXQ7XG4oZnVuY3Rpb24gKFRyYWNlRm9ybWF0KSB7XG4gICAgVHJhY2VGb3JtYXRbXCJUZXh0XCJdID0gXCJ0ZXh0XCI7XG4gICAgVHJhY2VGb3JtYXRbXCJKU09OXCJdID0gXCJqc29uXCI7XG59KShUcmFjZUZvcm1hdCB8fCAoZXhwb3J0cy5UcmFjZUZvcm1hdCA9IFRyYWNlRm9ybWF0ID0ge30pKTtcbihmdW5jdGlvbiAoVHJhY2VGb3JtYXQpIHtcbiAgICBmdW5jdGlvbiBmcm9tU3RyaW5nKHZhbHVlKSB7XG4gICAgICAgIGlmICghSXMuc3RyaW5nKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIFRyYWNlRm9ybWF0LlRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAodmFsdWUgPT09ICdqc29uJykge1xuICAgICAgICAgICAgcmV0dXJuIFRyYWNlRm9ybWF0LkpTT047XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gVHJhY2VGb3JtYXQuVGV4dDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBUcmFjZUZvcm1hdC5mcm9tU3RyaW5nID0gZnJvbVN0cmluZztcbn0pKFRyYWNlRm9ybWF0IHx8IChleHBvcnRzLlRyYWNlRm9ybWF0ID0gVHJhY2VGb3JtYXQgPSB7fSkpO1xudmFyIFNldFRyYWNlTm90aWZpY2F0aW9uO1xuKGZ1bmN0aW9uIChTZXRUcmFjZU5vdGlmaWNhdGlvbikge1xuICAgIFNldFRyYWNlTm90aWZpY2F0aW9uLnR5cGUgPSBuZXcgbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlKCckL3NldFRyYWNlJyk7XG59KShTZXRUcmFjZU5vdGlmaWNhdGlvbiB8fCAoZXhwb3J0cy5TZXRUcmFjZU5vdGlmaWNhdGlvbiA9IFNldFRyYWNlTm90aWZpY2F0aW9uID0ge30pKTtcbnZhciBMb2dUcmFjZU5vdGlmaWNhdGlvbjtcbihmdW5jdGlvbiAoTG9nVHJhY2VOb3RpZmljYXRpb24pIHtcbiAgICBMb2dUcmFjZU5vdGlmaWNhdGlvbi50eXBlID0gbmV3IG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZSgnJC9sb2dUcmFjZScpO1xufSkoTG9nVHJhY2VOb3RpZmljYXRpb24gfHwgKGV4cG9ydHMuTG9nVHJhY2VOb3RpZmljYXRpb24gPSBMb2dUcmFjZU5vdGlmaWNhdGlvbiA9IHt9KSk7XG52YXIgQ29ubmVjdGlvbkVycm9ycztcbihmdW5jdGlvbiAoQ29ubmVjdGlvbkVycm9ycykge1xuICAgIC8qKlxuICAgICAqIFRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZC5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uRXJyb3JzW0Nvbm5lY3Rpb25FcnJvcnNbXCJDbG9zZWRcIl0gPSAxXSA9IFwiQ2xvc2VkXCI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gZ290IGRpc3Bvc2VkLlxuICAgICAqL1xuICAgIENvbm5lY3Rpb25FcnJvcnNbQ29ubmVjdGlvbkVycm9yc1tcIkRpc3Bvc2VkXCJdID0gMl0gPSBcIkRpc3Bvc2VkXCI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBpbiBsaXN0ZW5pbmcgbW9kZS5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uRXJyb3JzW0Nvbm5lY3Rpb25FcnJvcnNbXCJBbHJlYWR5TGlzdGVuaW5nXCJdID0gM10gPSBcIkFscmVhZHlMaXN0ZW5pbmdcIjtcbn0pKENvbm5lY3Rpb25FcnJvcnMgfHwgKGV4cG9ydHMuQ29ubmVjdGlvbkVycm9ycyA9IENvbm5lY3Rpb25FcnJvcnMgPSB7fSkpO1xuY2xhc3MgQ29ubmVjdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNvZGUsIG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBDb25uZWN0aW9uRXJyb3IucHJvdG90eXBlKTtcbiAgICB9XG59XG5leHBvcnRzLkNvbm5lY3Rpb25FcnJvciA9IENvbm5lY3Rpb25FcnJvcjtcbnZhciBDb25uZWN0aW9uU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENvbm5lY3Rpb25TdHJhdGVneSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNhbmNlbFVuZGlzcGF0Y2hlZCk7XG4gICAgfVxuICAgIENvbm5lY3Rpb25TdHJhdGVneS5pcyA9IGlzO1xufSkoQ29ubmVjdGlvblN0cmF0ZWd5IHx8IChleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IENvbm5lY3Rpb25TdHJhdGVneSA9IHt9KSk7XG52YXIgSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5O1xuKGZ1bmN0aW9uIChJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiAoY2FuZGlkYXRlLmtpbmQgPT09IHVuZGVmaW5lZCB8fCBjYW5kaWRhdGUua2luZCA9PT0gJ2lkJykgJiYgSXMuZnVuYyhjYW5kaWRhdGUuY3JlYXRlQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UpICYmIChjYW5kaWRhdGUuZGlzcG9zZSA9PT0gdW5kZWZpbmVkIHx8IElzLmZ1bmMoY2FuZGlkYXRlLmRpc3Bvc2UpKTtcbiAgICB9XG4gICAgSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzID0gaXM7XG59KShJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgfHwgKGV4cG9ydHMuSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0ge30pKTtcbnZhciBSZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneTtcbihmdW5jdGlvbiAoUmVxdWVzdENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBjYW5kaWRhdGUua2luZCA9PT0gJ3JlcXVlc3QnICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKSAmJiAoY2FuZGlkYXRlLmRpc3Bvc2UgPT09IHVuZGVmaW5lZCB8fCBJcy5mdW5jKGNhbmRpZGF0ZS5kaXNwb3NlKSk7XG4gICAgfVxuICAgIFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzID0gaXM7XG59KShSZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSB8fCAoZXhwb3J0cy5SZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0ge30pKTtcbnZhciBDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5O1xuKGZ1bmN0aW9uIChDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5NZXNzYWdlID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKF8pIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgY2FuY2VsbGF0aW9uXzEuQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UoKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kuaXModmFsdWUpIHx8IFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKHZhbHVlKTtcbiAgICB9XG4gICAgQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5pcyA9IGlzO1xufSkoQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSB8fCAoZXhwb3J0cy5DYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IHt9KSk7XG52YXIgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENhbmNlbGxhdGlvblNlbmRlclN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kuTWVzc2FnZSA9IE9iamVjdC5mcmVlemUoe1xuICAgICAgICBzZW5kQ2FuY2VsbGF0aW9uKGNvbm4sIGlkKSB7XG4gICAgICAgICAgICByZXR1cm4gY29ubi5zZW5kTm90aWZpY2F0aW9uKENhbmNlbE5vdGlmaWNhdGlvbi50eXBlLCB7IGlkIH0pO1xuICAgICAgICB9LFxuICAgICAgICBjbGVhbnVwKF8pIHsgfVxuICAgIH0pO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLnNlbmRDYW5jZWxsYXRpb24pICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNsZWFudXApO1xuICAgIH1cbiAgICBDYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneS5pcyA9IGlzO1xufSkoQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgfHwgKGV4cG9ydHMuQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgPSBDYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneSA9IHt9KSk7XG52YXIgQ2FuY2VsbGF0aW9uU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENhbmNlbGxhdGlvblN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uU3RyYXRlZ3kuTWVzc2FnZSA9IE9iamVjdC5mcmVlemUoe1xuICAgICAgICByZWNlaXZlcjogQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5NZXNzYWdlLFxuICAgICAgICBzZW5kZXI6IENhbmNlbGxhdGlvblNlbmRlclN0cmF0ZWd5Lk1lc3NhZ2VcbiAgICB9KTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKGNhbmRpZGF0ZS5yZWNlaXZlcikgJiYgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kuaXMoY2FuZGlkYXRlLnNlbmRlcik7XG4gICAgfVxuICAgIENhbmNlbGxhdGlvblN0cmF0ZWd5LmlzID0gaXM7XG59KShDYW5jZWxsYXRpb25TdHJhdGVneSB8fCAoZXhwb3J0cy5DYW5jZWxsYXRpb25TdHJhdGVneSA9IENhbmNlbGxhdGlvblN0cmF0ZWd5ID0ge30pKTtcbnZhciBNZXNzYWdlU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKE1lc3NhZ2VTdHJhdGVneSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLmhhbmRsZU1lc3NhZ2UpO1xuICAgIH1cbiAgICBNZXNzYWdlU3RyYXRlZ3kuaXMgPSBpcztcbn0pKE1lc3NhZ2VTdHJhdGVneSB8fCAoZXhwb3J0cy5NZXNzYWdlU3RyYXRlZ3kgPSBNZXNzYWdlU3RyYXRlZ3kgPSB7fSkpO1xudmFyIENvbm5lY3Rpb25PcHRpb25zO1xuKGZ1bmN0aW9uIChDb25uZWN0aW9uT3B0aW9ucykge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIChDYW5jZWxsYXRpb25TdHJhdGVneS5pcyhjYW5kaWRhdGUuY2FuY2VsbGF0aW9uU3RyYXRlZ3kpIHx8IENvbm5lY3Rpb25TdHJhdGVneS5pcyhjYW5kaWRhdGUuY29ubmVjdGlvblN0cmF0ZWd5KSB8fCBNZXNzYWdlU3RyYXRlZ3kuaXMoY2FuZGlkYXRlLm1lc3NhZ2VTdHJhdGVneSkpO1xuICAgIH1cbiAgICBDb25uZWN0aW9uT3B0aW9ucy5pcyA9IGlzO1xufSkoQ29ubmVjdGlvbk9wdGlvbnMgfHwgKGV4cG9ydHMuQ29ubmVjdGlvbk9wdGlvbnMgPSBDb25uZWN0aW9uT3B0aW9ucyA9IHt9KSk7XG52YXIgQ29ubmVjdGlvblN0YXRlO1xuKGZ1bmN0aW9uIChDb25uZWN0aW9uU3RhdGUpIHtcbiAgICBDb25uZWN0aW9uU3RhdGVbQ29ubmVjdGlvblN0YXRlW1wiTmV3XCJdID0gMV0gPSBcIk5ld1wiO1xuICAgIENvbm5lY3Rpb25TdGF0ZVtDb25uZWN0aW9uU3RhdGVbXCJMaXN0ZW5pbmdcIl0gPSAyXSA9IFwiTGlzdGVuaW5nXCI7XG4gICAgQ29ubmVjdGlvblN0YXRlW0Nvbm5lY3Rpb25TdGF0ZVtcIkNsb3NlZFwiXSA9IDNdID0gXCJDbG9zZWRcIjtcbiAgICBDb25uZWN0aW9uU3RhdGVbQ29ubmVjdGlvblN0YXRlW1wiRGlzcG9zZWRcIl0gPSA0XSA9IFwiRGlzcG9zZWRcIjtcbn0pKENvbm5lY3Rpb25TdGF0ZSB8fCAoQ29ubmVjdGlvblN0YXRlID0ge30pKTtcbmZ1bmN0aW9uIGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uKG1lc3NhZ2VSZWFkZXIsIG1lc3NhZ2VXcml0ZXIsIF9sb2dnZXIsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBsb2dnZXIgPSBfbG9nZ2VyICE9PSB1bmRlZmluZWQgPyBfbG9nZ2VyIDogZXhwb3J0cy5OdWxsTG9nZ2VyO1xuICAgIGxldCBzZXF1ZW5jZU51bWJlciA9IDA7XG4gICAgbGV0IG5vdGlmaWNhdGlvblNlcXVlbmNlTnVtYmVyID0gMDtcbiAgICBsZXQgdW5rbm93blJlc3BvbnNlU2VxdWVuY2VOdW1iZXIgPSAwO1xuICAgIGNvbnN0IHZlcnNpb24gPSAnMi4wJztcbiAgICBsZXQgc3RhclJlcXVlc3RIYW5kbGVyID0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlcXVlc3RIYW5kbGVycyA9IG5ldyBNYXAoKTtcbiAgICBsZXQgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgY29uc3Qgbm90aWZpY2F0aW9uSGFuZGxlcnMgPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgcHJvZ3Jlc3NIYW5kbGVycyA9IG5ldyBNYXAoKTtcbiAgICBsZXQgdGltZXI7XG4gICAgbGV0IG1lc3NhZ2VRdWV1ZSA9IG5ldyBsaW5rZWRNYXBfMS5MaW5rZWRNYXAoKTtcbiAgICBsZXQgcmVzcG9uc2VQcm9taXNlcyA9IG5ldyBNYXAoKTtcbiAgICBsZXQga25vd25DYW5jZWxlZFJlcXVlc3RzID0gbmV3IFNldCgpO1xuICAgIGxldCByZXF1ZXN0VG9rZW5zID0gbmV3IE1hcCgpO1xuICAgIGxldCB0cmFjZSA9IFRyYWNlLk9mZjtcbiAgICBsZXQgdHJhY2VGb3JtYXQgPSBUcmFjZUZvcm1hdC5UZXh0O1xuICAgIGxldCB0cmFjZXI7XG4gICAgbGV0IHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLk5ldztcbiAgICBjb25zdCBlcnJvckVtaXR0ZXIgPSBuZXcgZXZlbnRzXzEuRW1pdHRlcigpO1xuICAgIGNvbnN0IGNsb3NlRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgdW5oYW5kbGVkTm90aWZpY2F0aW9uRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgdW5oYW5kbGVkUHJvZ3Jlc3NFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICBjb25zdCBkaXNwb3NlRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgY2FuY2VsbGF0aW9uU3RyYXRlZ3kgPSAob3B0aW9ucyAmJiBvcHRpb25zLmNhbmNlbGxhdGlvblN0cmF0ZWd5KSA/IG9wdGlvbnMuY2FuY2VsbGF0aW9uU3RyYXRlZ3kgOiBDYW5jZWxsYXRpb25TdHJhdGVneS5NZXNzYWdlO1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlcXVlc3RRdWV1ZUtleShpZCkge1xuICAgICAgICBpZiAoaWQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuJ3Qgc2VuZCByZXF1ZXN0cyB3aXRoIGlkIG51bGwgc2luY2UgdGhlIHJlc3BvbnNlIGNhbid0IGJlIGNvcnJlbGF0ZWQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdyZXEtJyArIGlkLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlc3BvbnNlUXVldWVLZXkoaWQpIHtcbiAgICAgICAgaWYgKGlkID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3Jlcy11bmtub3duLScgKyAoKyt1bmtub3duUmVzcG9uc2VTZXF1ZW5jZU51bWJlcikudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAncmVzLScgKyBpZC50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZU5vdGlmaWNhdGlvblF1ZXVlS2V5KCkge1xuICAgICAgICByZXR1cm4gJ25vdC0nICsgKCsrbm90aWZpY2F0aW9uU2VxdWVuY2VOdW1iZXIpLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFkZE1lc3NhZ2VUb1F1ZXVlKHF1ZXVlLCBtZXNzYWdlKSB7XG4gICAgICAgIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXF1ZXN0KG1lc3NhZ2UpKSB7XG4gICAgICAgICAgICBxdWV1ZS5zZXQoY3JlYXRlUmVxdWVzdFF1ZXVlS2V5KG1lc3NhZ2UuaWQpLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXNwb25zZShtZXNzYWdlKSkge1xuICAgICAgICAgICAgcXVldWUuc2V0KGNyZWF0ZVJlc3BvbnNlUXVldWVLZXkobWVzc2FnZS5pZCksIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcXVldWUuc2V0KGNyZWF0ZU5vdGlmaWNhdGlvblF1ZXVlS2V5KCksIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNhbmNlbFVuZGlzcGF0Y2hlZChfbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0xpc3RlbmluZygpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlID09PSBDb25uZWN0aW9uU3RhdGUuTGlzdGVuaW5nO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0Nsb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlID09PSBDb25uZWN0aW9uU3RhdGUuQ2xvc2VkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0Rpc3Bvc2VkKCkge1xuICAgICAgICByZXR1cm4gc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5EaXNwb3NlZDtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2xvc2VIYW5kbGVyKCkge1xuICAgICAgICBpZiAoc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5OZXcgfHwgc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5MaXN0ZW5pbmcpIHtcbiAgICAgICAgICAgIHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLkNsb3NlZDtcbiAgICAgICAgICAgIGNsb3NlRW1pdHRlci5maXJlKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlIGNvbm5lY3Rpb24gaXMgZGlzcG9zZWQgZG9uJ3Qgc2VudCBjbG9zZSBldmVudHMuXG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlYWRFcnJvckhhbmRsZXIoZXJyb3IpIHtcbiAgICAgICAgZXJyb3JFbWl0dGVyLmZpcmUoW2Vycm9yLCB1bmRlZmluZWQsIHVuZGVmaW5lZF0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiB3cml0ZUVycm9ySGFuZGxlcihkYXRhKSB7XG4gICAgICAgIGVycm9yRW1pdHRlci5maXJlKGRhdGEpO1xuICAgIH1cbiAgICBtZXNzYWdlUmVhZGVyLm9uQ2xvc2UoY2xvc2VIYW5kbGVyKTtcbiAgICBtZXNzYWdlUmVhZGVyLm9uRXJyb3IocmVhZEVycm9ySGFuZGxlcik7XG4gICAgbWVzc2FnZVdyaXRlci5vbkNsb3NlKGNsb3NlSGFuZGxlcik7XG4gICAgbWVzc2FnZVdyaXRlci5vbkVycm9yKHdyaXRlRXJyb3JIYW5kbGVyKTtcbiAgICBmdW5jdGlvbiB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCkge1xuICAgICAgICBpZiAodGltZXIgfHwgbWVzc2FnZVF1ZXVlLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aW1lciA9ICgwLCByYWxfMS5kZWZhdWx0KSgpLnRpbWVyLnNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICAgICAgICB0aW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHByb2Nlc3NNZXNzYWdlUXVldWUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGhhbmRsZU1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICBpZiAobWVzc2FnZXNfMS5NZXNzYWdlLmlzUmVxdWVzdChtZXNzYWdlKSkge1xuICAgICAgICAgICAgaGFuZGxlUmVxdWVzdChtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNOb3RpZmljYXRpb24obWVzc2FnZSkpIHtcbiAgICAgICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvbihtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXNwb25zZShtZXNzYWdlKSkge1xuICAgICAgICAgICAgaGFuZGxlUmVzcG9uc2UobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBoYW5kbGVJbnZhbGlkTWVzc2FnZShtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBwcm9jZXNzTWVzc2FnZVF1ZXVlKCkge1xuICAgICAgICBpZiAobWVzc2FnZVF1ZXVlLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXNzYWdlID0gbWVzc2FnZVF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlU3RyYXRlZ3kgPSBvcHRpb25zPy5tZXNzYWdlU3RyYXRlZ3k7XG4gICAgICAgICAgICBpZiAoTWVzc2FnZVN0cmF0ZWd5LmlzKG1lc3NhZ2VTdHJhdGVneSkpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlU3RyYXRlZ3kuaGFuZGxlTWVzc2FnZShtZXNzYWdlLCBoYW5kbGVNZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGhhbmRsZU1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgY2FsbGJhY2sgPSAobWVzc2FnZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2UgaGF2ZSByZWNlaXZlZCBhIGNhbmNlbGxhdGlvbiBtZXNzYWdlLiBDaGVjayBpZiB0aGUgbWVzc2FnZSBpcyBzdGlsbCBpbiB0aGUgcXVldWVcbiAgICAgICAgICAgIC8vIGFuZCBjYW5jZWwgaXQgaWYgYWxsb3dlZCB0byBkbyBzby5cbiAgICAgICAgICAgIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNOb3RpZmljYXRpb24obWVzc2FnZSkgJiYgbWVzc2FnZS5tZXRob2QgPT09IENhbmNlbE5vdGlmaWNhdGlvbi50eXBlLm1ldGhvZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbmNlbElkID0gbWVzc2FnZS5wYXJhbXMuaWQ7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gY3JlYXRlUmVxdWVzdFF1ZXVlS2V5KGNhbmNlbElkKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0b0NhbmNlbCA9IG1lc3NhZ2VRdWV1ZS5nZXQoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZXNfMS5NZXNzYWdlLmlzUmVxdWVzdCh0b0NhbmNlbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyYXRlZ3kgPSBvcHRpb25zPy5jb25uZWN0aW9uU3RyYXRlZ3k7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gKHN0cmF0ZWd5ICYmIHN0cmF0ZWd5LmNhbmNlbFVuZGlzcGF0Y2hlZCkgPyBzdHJhdGVneS5jYW5jZWxVbmRpc3BhdGNoZWQodG9DYW5jZWwsIGNhbmNlbFVuZGlzcGF0Y2hlZCkgOiBjYW5jZWxVbmRpc3BhdGNoZWQodG9DYW5jZWwpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgJiYgKHJlc3BvbnNlLmVycm9yICE9PSB1bmRlZmluZWQgfHwgcmVzcG9uc2UucmVzdWx0ICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUXVldWUuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLmRlbGV0ZShjYW5jZWxJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5pZCA9IHRvQ2FuY2VsLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VTZW5kaW5nUmVzcG9uc2UocmVzcG9uc2UsIG1lc3NhZ2UubWV0aG9kLCBEYXRlLm5vdygpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUocmVzcG9uc2UpLmNhdGNoKCgpID0+IGxvZ2dlci5lcnJvcihgU2VuZGluZyByZXNwb25zZSBmb3IgY2FuY2VsZWQgbWVzc2FnZSBmYWlsZWQuYCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGNhbmNlbGxhdGlvblRva2VuID0gcmVxdWVzdFRva2Vucy5nZXQoY2FuY2VsSWQpO1xuICAgICAgICAgICAgICAgIC8vIFRoZSByZXF1ZXN0IGlzIGFscmVhZHkgcnVubmluZy4gQ2FuY2VsIHRoZSB0b2tlblxuICAgICAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbmNlbGxhdGlvblRva2VuLmNhbmNlbCgpO1xuICAgICAgICAgICAgICAgICAgICB0cmFjZVJlY2VpdmVkTm90aWZpY2F0aW9uKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZW1lbWJlciB0aGUgY2FuY2VsIGJ1dCBzdGlsbCBxdWV1ZSB0aGUgbWVzc2FnZSB0b1xuICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbiB1cCBzdGF0ZSBpbiBwcm9jZXNzIG1lc3NhZ2UuXG4gICAgICAgICAgICAgICAgICAgIGtub3duQ2FuY2VsZWRSZXF1ZXN0cy5hZGQoY2FuY2VsSWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFkZE1lc3NhZ2VUb1F1ZXVlKG1lc3NhZ2VRdWV1ZSwgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGZ1bmN0aW9uIGhhbmRsZVJlcXVlc3QocmVxdWVzdE1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgLy8gd2UgcmV0dXJuIGhlcmUgc2lsZW50bHkgc2luY2Ugd2UgZmlyZWQgYW4gZXZlbnQgd2hlbiB0aGVcbiAgICAgICAgICAgIC8vIGNvbm5lY3Rpb24gZ290IGRpc3Bvc2VkLlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHJlcGx5KHJlc3VsdE9yRXJyb3IsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgaWQ6IHJlcXVlc3RNZXNzYWdlLmlkXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKHJlc3VsdE9yRXJyb3IgaW5zdGFuY2VvZiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlLmVycm9yID0gcmVzdWx0T3JFcnJvci50b0pzb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVzdWx0ID0gcmVzdWx0T3JFcnJvciA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHJlc3VsdE9yRXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cmFjZVNlbmRpbmdSZXNwb25zZShtZXNzYWdlLCBtZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICBtZXNzYWdlV3JpdGVyLndyaXRlKG1lc3NhZ2UpLmNhdGNoKCgpID0+IGxvZ2dlci5lcnJvcihgU2VuZGluZyByZXNwb25zZSBmYWlsZWQuYCkpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHJlcGx5RXJyb3IoZXJyb3IsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgaWQ6IHJlcXVlc3RNZXNzYWdlLmlkLFxuICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvci50b0pzb24oKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUobWVzc2FnZSkuY2F0Y2goKCkgPT4gbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlc3BvbnNlIGZhaWxlZC5gKSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gcmVwbHlTdWNjZXNzKHJlc3VsdCwgbWV0aG9kLCBzdGFydFRpbWUpIHtcbiAgICAgICAgICAgIC8vIFRoZSBKU09OIFJQQyBkZWZpbmVzIHRoYXQgYSByZXNwb25zZSBtdXN0IGVpdGhlciBoYXZlIGEgcmVzdWx0IG9yIGFuIGVycm9yXG4gICAgICAgICAgICAvLyBTbyB3ZSBjYW4ndCB0cmVhdCB1bmRlZmluZWQgYXMgYSB2YWxpZCByZXNwb25zZSByZXN1bHQuXG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgICAgICAgICAgICBqc29ucnBjOiB2ZXJzaW9uLFxuICAgICAgICAgICAgICAgIGlkOiByZXF1ZXN0TWVzc2FnZS5pZCxcbiAgICAgICAgICAgICAgICByZXN1bHQ6IHJlc3VsdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUobWVzc2FnZSkuY2F0Y2goKCkgPT4gbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlc3BvbnNlIGZhaWxlZC5gKSk7XG4gICAgICAgIH1cbiAgICAgICAgdHJhY2VSZWNlaXZlZFJlcXVlc3QocmVxdWVzdE1lc3NhZ2UpO1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gcmVxdWVzdEhhbmRsZXJzLmdldChyZXF1ZXN0TWVzc2FnZS5tZXRob2QpO1xuICAgICAgICBsZXQgdHlwZTtcbiAgICAgICAgbGV0IHJlcXVlc3RIYW5kbGVyO1xuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgdHlwZSA9IGVsZW1lbnQudHlwZTtcbiAgICAgICAgICAgIHJlcXVlc3RIYW5kbGVyID0gZWxlbWVudC5oYW5kbGVyO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIGlmIChyZXF1ZXN0SGFuZGxlciB8fCBzdGFyUmVxdWVzdEhhbmRsZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHRva2VuS2V5ID0gcmVxdWVzdE1lc3NhZ2UuaWQgPz8gU3RyaW5nKERhdGUubm93KCkpOyAvL1xuICAgICAgICAgICAgY29uc3QgY2FuY2VsbGF0aW9uU291cmNlID0gSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKGNhbmNlbGxhdGlvblN0cmF0ZWd5LnJlY2VpdmVyKVxuICAgICAgICAgICAgICAgID8gY2FuY2VsbGF0aW9uU3RyYXRlZ3kucmVjZWl2ZXIuY3JlYXRlQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UodG9rZW5LZXkpXG4gICAgICAgICAgICAgICAgOiBjYW5jZWxsYXRpb25TdHJhdGVneS5yZWNlaXZlci5jcmVhdGVDYW5jZWxsYXRpb25Ub2tlblNvdXJjZShyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICBpZiAocmVxdWVzdE1lc3NhZ2UuaWQgIT09IG51bGwgJiYga25vd25DYW5jZWxlZFJlcXVlc3RzLmhhcyhyZXF1ZXN0TWVzc2FnZS5pZCkpIHtcbiAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25Tb3VyY2UuY2FuY2VsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVxdWVzdE1lc3NhZ2UuaWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLnNldCh0b2tlbktleSwgY2FuY2VsbGF0aW9uU291cmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IGhhbmRsZXJSZXN1bHQ7XG4gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0TWVzc2FnZS5wYXJhbXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlLm51bWJlck9mUGFyYW1zICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1zLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyAke3R5cGUubnVtYmVyT2ZQYXJhbXN9IHBhcmFtcyBidXQgcmVjZWl2ZWQgbm9uZS5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJSZXN1bHQgPSByZXF1ZXN0SGFuZGxlcihjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVxdWVzdE1lc3NhZ2UucGFyYW1zKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlLnBhcmFtZXRlclN0cnVjdHVyZXMgPT09IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseUVycm9yKG5ldyBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IobWVzc2FnZXNfMS5FcnJvckNvZGVzLkludmFsaWRQYXJhbXMsIGBSZXF1ZXN0ICR7cmVxdWVzdE1lc3NhZ2UubWV0aG9kfSBkZWZpbmVzIHBhcmFtZXRlcnMgYnkgbmFtZSBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBwb3NpdGlvbmApLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlclJlc3VsdCA9IHJlcXVlc3RIYW5kbGVyKC4uLnJlcXVlc3RNZXNzYWdlLnBhcmFtcywgY2FuY2VsbGF0aW9uU291cmNlLnRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS5wYXJhbWV0ZXJTdHJ1Y3R1cmVzID09PSBtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW52YWxpZFBhcmFtcywgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGRlZmluZXMgcGFyYW1ldGVycyBieSBwb3NpdGlvbiBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBuYW1lYCksIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gcmVxdWVzdEhhbmRsZXIocmVxdWVzdE1lc3NhZ2UucGFyYW1zLCBjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0YXJSZXF1ZXN0SGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gc3RhclJlcXVlc3RIYW5kbGVyKHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgcmVxdWVzdE1lc3NhZ2UucGFyYW1zLCBjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBwcm9taXNlID0gaGFuZGxlclJlc3VsdDtcbiAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZXJSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFRva2Vucy5kZWxldGUodG9rZW5LZXkpO1xuICAgICAgICAgICAgICAgICAgICByZXBseVN1Y2Nlc3MoaGFuZGxlclJlc3VsdCwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwcm9taXNlLnRoZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS50aGVuKChyZXN1bHRPckVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLmRlbGV0ZSh0b2tlbktleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXBseShyZXN1bHRPckVycm9yLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IoZXJyb3IsIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVycm9yICYmIElzLnN0cmluZyhlcnJvci5tZXNzYWdlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGZhaWxlZCB3aXRoIG1lc3NhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZmFpbGVkIHVuZXhwZWN0ZWRseSB3aXRob3V0IHByb3ZpZGluZyBhbnkgZGV0YWlscy5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHkoaGFuZGxlclJlc3VsdCwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHkoZXJyb3IsIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZXJyb3IgJiYgSXMuc3RyaW5nKGVycm9yLm1lc3NhZ2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGZhaWxlZCB3aXRoIG1lc3NhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZmFpbGVkIHVuZXhwZWN0ZWRseSB3aXRob3V0IHByb3ZpZGluZyBhbnkgZGV0YWlscy5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuTWV0aG9kTm90Rm91bmQsIGBVbmhhbmRsZWQgbWV0aG9kICR7cmVxdWVzdE1lc3NhZ2UubWV0aG9kfWApLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlUmVzcG9uc2UocmVzcG9uc2VNZXNzYWdlKSB7XG4gICAgICAgIGlmIChpc0Rpc3Bvc2VkKCkpIHtcbiAgICAgICAgICAgIC8vIFNlZSBoYW5kbGUgcmVxdWVzdC5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzcG9uc2VNZXNzYWdlLmlkID09PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VNZXNzYWdlLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBSZWNlaXZlZCByZXNwb25zZSBtZXNzYWdlIHdpdGhvdXQgaWQ6IEVycm9yIGlzOiBcXG4ke0pTT04uc3RyaW5naWZ5KHJlc3BvbnNlTWVzc2FnZS5lcnJvciwgdW5kZWZpbmVkLCA0KX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgUmVjZWl2ZWQgcmVzcG9uc2UgbWVzc2FnZSB3aXRob3V0IGlkLiBObyBmdXJ0aGVyIGVycm9yIGluZm9ybWF0aW9uIHByb3ZpZGVkLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gcmVzcG9uc2VNZXNzYWdlLmlkO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VQcm9taXNlID0gcmVzcG9uc2VQcm9taXNlcy5nZXQoa2V5KTtcbiAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWRSZXNwb25zZShyZXNwb25zZU1lc3NhZ2UsIHJlc3BvbnNlUHJvbWlzZSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VQcm9taXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2VzLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZU1lc3NhZ2UuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gcmVzcG9uc2VNZXNzYWdlLmVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlLnJlamVjdChuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKGVycm9yLmNvZGUsIGVycm9yLm1lc3NhZ2UsIGVycm9yLmRhdGEpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXNwb25zZU1lc3NhZ2UucmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlTWVzc2FnZS5yZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgbmV2ZXIgaGFwcGVuLicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IubWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBSZXNwb25zZSBoYW5kbGVyICcke3Jlc3BvbnNlUHJvbWlzZS5tZXRob2R9JyBmYWlsZWQgd2l0aCBtZXNzYWdlOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYFJlc3BvbnNlIGhhbmRsZXIgJyR7cmVzcG9uc2VQcm9taXNlLm1ldGhvZH0nIGZhaWxlZCB1bmV4cGVjdGVkbHkuYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlTm90aWZpY2F0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgLy8gU2VlIGhhbmRsZSByZXF1ZXN0LlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0eXBlID0gdW5kZWZpbmVkO1xuICAgICAgICBsZXQgbm90aWZpY2F0aW9uSGFuZGxlcjtcbiAgICAgICAgaWYgKG1lc3NhZ2UubWV0aG9kID09PSBDYW5jZWxOb3RpZmljYXRpb24udHlwZS5tZXRob2QpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhbmNlbElkID0gbWVzc2FnZS5wYXJhbXMuaWQ7XG4gICAgICAgICAgICBrbm93bkNhbmNlbGVkUmVxdWVzdHMuZGVsZXRlKGNhbmNlbElkKTtcbiAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWROb3RpZmljYXRpb24obWVzc2FnZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gbm90aWZpY2F0aW9uSGFuZGxlcnMuZ2V0KG1lc3NhZ2UubWV0aG9kKTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uSGFuZGxlciA9IGVsZW1lbnQuaGFuZGxlcjtcbiAgICAgICAgICAgICAgICB0eXBlID0gZWxlbWVudC50eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChub3RpZmljYXRpb25IYW5kbGVyIHx8IHN0YXJOb3RpZmljYXRpb25IYW5kbGVyKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWROb3RpZmljYXRpb24obWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgaWYgKG5vdGlmaWNhdGlvbkhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UucGFyYW1zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5udW1iZXJPZlBhcmFtcyAhPT0gMCAmJiB0eXBlLnBhcmFtZXRlclN0cnVjdHVyZXMgIT09IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBOb3RpZmljYXRpb24gJHttZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyAke3R5cGUubnVtYmVyT2ZQYXJhbXN9IHBhcmFtcyBidXQgcmVjZWl2ZWQgbm9uZS5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShtZXNzYWdlLnBhcmFtcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGFyZSBKU09OLVJQQyBsaWJyYXJpZXMgdGhhdCBzZW5kIHByb2dyZXNzIG1lc3NhZ2UgYXMgcG9zaXRpb25hbCBwYXJhbXMgYWx0aG91Z2hcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpZmllZCBhcyBuYW1lZC4gU28gY29udmVydCB0aGVtIGlmIHRoaXMgaXMgdGhlIGNhc2UuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBtZXNzYWdlLnBhcmFtcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLm1ldGhvZCA9PT0gUHJvZ3Jlc3NOb3RpZmljYXRpb24udHlwZS5tZXRob2QgJiYgcGFyYW1zLmxlbmd0aCA9PT0gMiAmJiBQcm9ncmVzc1Rva2VuLmlzKHBhcmFtc1swXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKHsgdG9rZW46IHBhcmFtc1swXSwgdmFsdWU6IHBhcmFtc1sxXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUucGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBOb3RpZmljYXRpb24gJHttZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyBwYXJhbWV0ZXJzIGJ5IG5hbWUgYnV0IHJlY2VpdmVkIHBhcmFtZXRlcnMgYnkgcG9zaXRpb25gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5udW1iZXJPZlBhcmFtcyAhPT0gbWVzc2FnZS5wYXJhbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYE5vdGlmaWNhdGlvbiAke21lc3NhZ2UubWV0aG9kfSBkZWZpbmVzICR7dHlwZS5udW1iZXJPZlBhcmFtc30gcGFyYW1zIGJ1dCByZWNlaXZlZCAke3BhcmFtcy5sZW5ndGh9IGFyZ3VtZW50c2ApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXIoLi4ucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS5wYXJhbWV0ZXJTdHJ1Y3R1cmVzID09PSBtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgTm90aWZpY2F0aW9uICR7bWVzc2FnZS5tZXRob2R9IGRlZmluZXMgcGFyYW1ldGVycyBieSBwb3NpdGlvbiBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBuYW1lYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKG1lc3NhZ2UucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGFyTm90aWZpY2F0aW9uSGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICBzdGFyTm90aWZpY2F0aW9uSGFuZGxlcihtZXNzYWdlLm1ldGhvZCwgbWVzc2FnZS5wYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvci5tZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgTm90aWZpY2F0aW9uIGhhbmRsZXIgJyR7bWVzc2FnZS5tZXRob2R9JyBmYWlsZWQgd2l0aCBtZXNzYWdlOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYE5vdGlmaWNhdGlvbiBoYW5kbGVyICcke21lc3NhZ2UubWV0aG9kfScgZmFpbGVkIHVuZXhwZWN0ZWRseS5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1bmhhbmRsZWROb3RpZmljYXRpb25FbWl0dGVyLmZpcmUobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlSW52YWxpZE1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignUmVjZWl2ZWQgZW1wdHkgbWVzc2FnZS4nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsb2dnZXIuZXJyb3IoYFJlY2VpdmVkIG1lc3NhZ2Ugd2hpY2ggaXMgbmVpdGhlciBhIHJlc3BvbnNlIG5vciBhIG5vdGlmaWNhdGlvbiBtZXNzYWdlOlxcbiR7SlNPTi5zdHJpbmdpZnkobWVzc2FnZSwgbnVsbCwgNCl9YCk7XG4gICAgICAgIC8vIFRlc3Qgd2hldGhlciB3ZSBmaW5kIGFuIGlkIHRvIHJlamVjdCB0aGUgcHJvbWlzZVxuICAgICAgICBjb25zdCByZXNwb25zZU1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICBpZiAoSXMuc3RyaW5nKHJlc3BvbnNlTWVzc2FnZS5pZCkgfHwgSXMubnVtYmVyKHJlc3BvbnNlTWVzc2FnZS5pZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHJlc3BvbnNlTWVzc2FnZS5pZDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxlciA9IHJlc3BvbnNlUHJvbWlzZXMuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VIYW5kbGVyLnJlamVjdChuZXcgRXJyb3IoJ1RoZSByZWNlaXZlZCByZXNwb25zZSBoYXMgbmVpdGhlciBhIHJlc3VsdCBub3IgYW4gZXJyb3IgcHJvcGVydHkuJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0cmluZ2lmeVRyYWNlKHBhcmFtcykge1xuICAgICAgICBpZiAocGFyYW1zID09PSB1bmRlZmluZWQgfHwgcGFyYW1zID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAodHJhY2UpIHtcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuVmVyYm9zZTpcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGFyYW1zLCBudWxsLCA0KTtcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuQ29tcGFjdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGFyYW1zKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVNlbmRpbmdSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFjZUZvcm1hdCA9PT0gVHJhY2VGb3JtYXQuVGV4dCkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSAmJiBtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBgUGFyYW1zOiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucGFyYW1zKX1cXG5cXG5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJhY2VyLmxvZyhgU2VuZGluZyByZXF1ZXN0ICcke21lc3NhZ2UubWV0aG9kfSAtICgke21lc3NhZ2UuaWR9KScuYCwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb2dMU1BNZXNzYWdlKCdzZW5kLXJlcXVlc3QnLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVNlbmRpbmdOb3RpZmljYXRpb24obWVzc2FnZSkge1xuICAgICAgICBpZiAodHJhY2UgPT09IFRyYWNlLk9mZiB8fCAhdHJhY2VyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYWNlRm9ybWF0ID09PSBUcmFjZUZvcm1hdC5UZXh0KSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdCkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0gYFBhcmFtczogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLnBhcmFtcyl9XFxuXFxuYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSAnTm8gcGFyYW1ldGVycyBwcm92aWRlZC5cXG5cXG4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFNlbmRpbmcgbm90aWZpY2F0aW9uICcke21lc3NhZ2UubWV0aG9kfScuYCwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb2dMU1BNZXNzYWdlKCdzZW5kLW5vdGlmaWNhdGlvbicsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhY2VGb3JtYXQgPT09IFRyYWNlRm9ybWF0LlRleHQpIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZXJyb3IgJiYgbWVzc2FnZS5lcnJvci5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgRXJyb3IgZGF0YTogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLmVycm9yLmRhdGEpfVxcblxcbmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgUmVzdWx0OiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucmVzdWx0KX1cXG5cXG5gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UuZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9ICdObyByZXN1bHQgcmV0dXJuZWQuXFxuXFxuJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFNlbmRpbmcgcmVzcG9uc2UgJyR7bWV0aG9kfSAtICgke21lc3NhZ2UuaWR9KScuIFByb2Nlc3NpbmcgcmVxdWVzdCB0b29rICR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1tc2AsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgnc2VuZC1yZXNwb25zZScsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYWNlUmVjZWl2ZWRSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFjZUZvcm1hdCA9PT0gVHJhY2VGb3JtYXQuVGV4dCkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSAmJiBtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBgUGFyYW1zOiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucGFyYW1zKX1cXG5cXG5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJhY2VyLmxvZyhgUmVjZWl2ZWQgcmVxdWVzdCAnJHttZXNzYWdlLm1ldGhvZH0gLSAoJHttZXNzYWdlLmlkfSknLmAsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1yZXF1ZXN0JywgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdHJhY2VSZWNlaXZlZE5vdGlmaWNhdGlvbihtZXNzYWdlKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIgfHwgbWVzc2FnZS5tZXRob2QgPT09IExvZ1RyYWNlTm90aWZpY2F0aW9uLnR5cGUubWV0aG9kKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYWNlRm9ybWF0ID09PSBUcmFjZUZvcm1hdC5UZXh0KSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdCkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0gYFBhcmFtczogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLnBhcmFtcyl9XFxuXFxuYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSAnTm8gcGFyYW1ldGVycyBwcm92aWRlZC5cXG5cXG4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFJlY2VpdmVkIG5vdGlmaWNhdGlvbiAnJHttZXNzYWdlLm1ldGhvZH0nLmAsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1ub3RpZmljYXRpb24nLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVJlY2VpdmVkUmVzcG9uc2UobWVzc2FnZSwgcmVzcG9uc2VQcm9taXNlKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhY2VGb3JtYXQgPT09IFRyYWNlRm9ybWF0LlRleHQpIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZXJyb3IgJiYgbWVzc2FnZS5lcnJvci5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgRXJyb3IgZGF0YTogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLmVycm9yLmRhdGEpfVxcblxcbmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgUmVzdWx0OiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucmVzdWx0KX1cXG5cXG5gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UuZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9ICdObyByZXN1bHQgcmV0dXJuZWQuXFxuXFxuJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXNwb25zZVByb21pc2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IG1lc3NhZ2UuZXJyb3IgPyBgIFJlcXVlc3QgZmFpbGVkOiAke21lc3NhZ2UuZXJyb3IubWVzc2FnZX0gKCR7bWVzc2FnZS5lcnJvci5jb2RlfSkuYCA6ICcnO1xuICAgICAgICAgICAgICAgIHRyYWNlci5sb2coYFJlY2VpdmVkIHJlc3BvbnNlICcke3Jlc3BvbnNlUHJvbWlzZS5tZXRob2R9IC0gKCR7bWVzc2FnZS5pZH0pJyBpbiAke0RhdGUubm93KCkgLSByZXNwb25zZVByb21pc2UudGltZXJTdGFydH1tcy4ke2Vycm9yfWAsIGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJhY2VyLmxvZyhgUmVjZWl2ZWQgcmVzcG9uc2UgJHttZXNzYWdlLmlkfSB3aXRob3V0IGFjdGl2ZSByZXNwb25zZSBwcm9taXNlLmAsIGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1yZXNwb25zZScsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGxvZ0xTUE1lc3NhZ2UodHlwZSwgbWVzc2FnZSkge1xuICAgICAgICBpZiAoIXRyYWNlciB8fCB0cmFjZSA9PT0gVHJhY2UuT2ZmKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbHNwTWVzc2FnZSA9IHtcbiAgICAgICAgICAgIGlzTFNQTWVzc2FnZTogdHJ1ZSxcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpXG4gICAgICAgIH07XG4gICAgICAgIHRyYWNlci5sb2cobHNwTWVzc2FnZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRocm93SWZDbG9zZWRPckRpc3Bvc2VkKCkge1xuICAgICAgICBpZiAoaXNDbG9zZWQoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IENvbm5lY3Rpb25FcnJvcihDb25uZWN0aW9uRXJyb3JzLkNsb3NlZCwgJ0Nvbm5lY3Rpb24gaXMgY2xvc2VkLicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0Rpc3Bvc2VkKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb25uZWN0aW9uRXJyb3IoQ29ubmVjdGlvbkVycm9ycy5EaXNwb3NlZCwgJ0Nvbm5lY3Rpb24gaXMgZGlzcG9zZWQuJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdGhyb3dJZkxpc3RlbmluZygpIHtcbiAgICAgICAgaWYgKGlzTGlzdGVuaW5nKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb25uZWN0aW9uRXJyb3IoQ29ubmVjdGlvbkVycm9ycy5BbHJlYWR5TGlzdGVuaW5nLCAnQ29ubmVjdGlvbiBpcyBhbHJlYWR5IGxpc3RlbmluZycpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRocm93SWZOb3RMaXN0ZW5pbmcoKSB7XG4gICAgICAgIGlmICghaXNMaXN0ZW5pbmcoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYWxsIGxpc3RlbigpIGZpcnN0LicpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVuZGVmaW5lZFRvTnVsbChwYXJhbSkge1xuICAgICAgICBpZiAocGFyYW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyYW07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gbnVsbFRvVW5kZWZpbmVkKHBhcmFtKSB7XG4gICAgICAgIGlmIChwYXJhbSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJhbTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBpc05hbWVkUGFyYW0ocGFyYW0pIHtcbiAgICAgICAgcmV0dXJuIHBhcmFtICE9PSB1bmRlZmluZWQgJiYgcGFyYW0gIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkocGFyYW0pICYmIHR5cGVvZiBwYXJhbSA9PT0gJ29iamVjdCc7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXB1dGVTaW5nbGVQYXJhbShwYXJhbWV0ZXJTdHJ1Y3R1cmVzLCBwYXJhbSkge1xuICAgICAgICBzd2l0Y2ggKHBhcmFtZXRlclN0cnVjdHVyZXMpIHtcbiAgICAgICAgICAgIGNhc2UgbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG86XG4gICAgICAgICAgICAgICAgaWYgKGlzTmFtZWRQYXJhbShwYXJhbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxUb1VuZGVmaW5lZChwYXJhbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3VuZGVmaW5lZFRvTnVsbChwYXJhbSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZTpcbiAgICAgICAgICAgICAgICBpZiAoIWlzTmFtZWRQYXJhbShwYXJhbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWNlaXZlZCBwYXJhbWV0ZXJzIGJ5IG5hbWUgYnV0IHBhcmFtIGlzIG5vdCBhbiBvYmplY3QgbGl0ZXJhbC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGxUb1VuZGVmaW5lZChwYXJhbSk7XG4gICAgICAgICAgICBjYXNlIG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieVBvc2l0aW9uOlxuICAgICAgICAgICAgICAgIHJldHVybiBbdW5kZWZpbmVkVG9OdWxsKHBhcmFtKV07XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBwYXJhbWV0ZXIgc3RydWN0dXJlICR7cGFyYW1ldGVyU3RydWN0dXJlcy50b1N0cmluZygpfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXB1dGVNZXNzYWdlUGFyYW1zKHR5cGUsIHBhcmFtcykge1xuICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICBjb25zdCBudW1iZXJPZlBhcmFtcyA9IHR5cGUubnVtYmVyT2ZQYXJhbXM7XG4gICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gY29tcHV0ZVNpbmdsZVBhcmFtKHR5cGUucGFyYW1ldGVyU3RydWN0dXJlcywgcGFyYW1zWzBdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoICYmIGkgPCBudW1iZXJPZlBhcmFtczsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHVuZGVmaW5lZFRvTnVsbChwYXJhbXNbaV0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPCBudW1iZXJPZlBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gcGFyYW1zLmxlbmd0aDsgaSA8IG51bWJlck9mUGFyYW1zOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB7XG4gICAgICAgIHNlbmROb3RpZmljYXRpb246ICh0eXBlLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlUGFyYW1zO1xuICAgICAgICAgICAgaWYgKElzLnN0cmluZyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICAgIGxldCBwYXJhbVN0YXJ0ID0gMDtcbiAgICAgICAgICAgICAgICBsZXQgcGFyYW1ldGVyU3RydWN0dXJlcyA9IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvO1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuaXMoZmlyc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtU3RhcnQgPSAxO1xuICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gZmlyc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBwYXJhbUVuZCA9IGFyZ3MubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gcGFyYW1FbmQgLSBwYXJhbVN0YXJ0O1xuICAgICAgICAgICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zID0gY29tcHV0ZVNpbmdsZVBhcmFtKHBhcmFtZXRlclN0cnVjdHVyZXMsIGFyZ3NbcGFyYW1TdGFydF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjZWl2ZWQgJHtudW1iZXJPZlBhcmFtc30gcGFyYW1ldGVycyBmb3IgJ2J5IE5hbWUnIG5vdGlmaWNhdGlvbiBwYXJhbWV0ZXIgc3RydWN0dXJlLmApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IGFyZ3Muc2xpY2UocGFyYW1TdGFydCwgcGFyYW1FbmQpLm1hcCh2YWx1ZSA9PiB1bmRlZmluZWRUb051bGwodmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IGFyZ3M7XG4gICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZS5tZXRob2Q7XG4gICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IGNvbXB1dGVNZXNzYWdlUGFyYW1zKHR5cGUsIHBhcmFtcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBub3RpZmljYXRpb25NZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBtZXNzYWdlUGFyYW1zXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdHJhY2VTZW5kaW5nTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbk1lc3NhZ2UpO1xuICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2VXcml0ZXIud3JpdGUobm90aWZpY2F0aW9uTWVzc2FnZSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBTZW5kaW5nIG5vdGlmaWNhdGlvbiBmYWlsZWQuYCk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25Ob3RpZmljYXRpb246ICh0eXBlLCBoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGlmIChJcy5mdW5jKHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB0eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaGFuZGxlcikge1xuICAgICAgICAgICAgICAgIGlmIChJcy5zdHJpbmcodHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZTtcbiAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uSGFuZGxlcnMuc2V0KHR5cGUsIHsgdHlwZTogdW5kZWZpbmVkLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZS5tZXRob2Q7XG4gICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXJzLnNldCh0eXBlLm1ldGhvZCwgeyB0eXBlLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXJzLmRlbGV0ZShtZXRob2QpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBvblByb2dyZXNzOiAoX3R5cGUsIHRva2VuLCBoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgICBpZiAocHJvZ3Jlc3NIYW5kbGVycy5oYXModG9rZW4pKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm9ncmVzcyBoYW5kbGVyIGZvciB0b2tlbiAke3Rva2VufSBhbHJlYWR5IHJlZ2lzdGVyZWRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByb2dyZXNzSGFuZGxlcnMuc2V0KHRva2VuLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc0hhbmRsZXJzLmRlbGV0ZSh0b2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgc2VuZFByb2dyZXNzOiAoX3R5cGUsIHRva2VuLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGF3YWl0IGJ1dCBzaW1wbGUgcmV0dXJuIHRvIGVuc3VyZSB0aGF0IHdlIGRvbid0IGhhdmUgYW5vdGhlclxuICAgICAgICAgICAgLy8gYXN5bmMgc2NoZWR1bGluZy4gT3RoZXJ3aXNlIG9uZSBzZW5kIGNvdWxkIG92ZXJ0YWtlIGFub3RoZXIgc2VuZC5cbiAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLnNlbmROb3RpZmljYXRpb24oUHJvZ3Jlc3NOb3RpZmljYXRpb24udHlwZSwgeyB0b2tlbiwgdmFsdWUgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uVW5oYW5kbGVkUHJvZ3Jlc3M6IHVuaGFuZGxlZFByb2dyZXNzRW1pdHRlci5ldmVudCxcbiAgICAgICAgc2VuZFJlcXVlc3Q6ICh0eXBlLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgdGhyb3dJZk5vdExpc3RlbmluZygpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlUGFyYW1zO1xuICAgICAgICAgICAgbGV0IHRva2VuID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKElzLnN0cmluZyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3QgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgbGV0IHBhcmFtU3RhcnQgPSAwO1xuICAgICAgICAgICAgICAgIGxldCBwYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG87XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5pcyhmaXJzdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1TdGFydCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlclN0cnVjdHVyZXMgPSBmaXJzdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHBhcmFtRW5kID0gYXJncy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuLmlzKGxhc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtRW5kID0gcGFyYW1FbmQgLSAxO1xuICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IGxhc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gcGFyYW1FbmQgLSBwYXJhbVN0YXJ0O1xuICAgICAgICAgICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zID0gY29tcHV0ZVNpbmdsZVBhcmFtKHBhcmFtZXRlclN0cnVjdHVyZXMsIGFyZ3NbcGFyYW1TdGFydF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjZWl2ZWQgJHtudW1iZXJPZlBhcmFtc30gcGFyYW1ldGVycyBmb3IgJ2J5IE5hbWUnIHJlcXVlc3QgcGFyYW1ldGVyIHN0cnVjdHVyZS5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMgPSBhcmdzLnNsaWNlKHBhcmFtU3RhcnQsIHBhcmFtRW5kKS5tYXAodmFsdWUgPT4gdW5kZWZpbmVkVG9OdWxsKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBhcmdzO1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGUubWV0aG9kO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMgPSBjb21wdXRlTWVzc2FnZVBhcmFtcyh0eXBlLCBwYXJhbXMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gdHlwZS5udW1iZXJPZlBhcmFtcztcbiAgICAgICAgICAgICAgICB0b2tlbiA9IGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuLmlzKHBhcmFtc1tudW1iZXJPZlBhcmFtc10pID8gcGFyYW1zW251bWJlck9mUGFyYW1zXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGlkID0gc2VxdWVuY2VOdW1iZXIrKztcbiAgICAgICAgICAgIGxldCBkaXNwb3NhYmxlO1xuICAgICAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgICAgICAgZGlzcG9zYWJsZSA9IHRva2VuLm9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcCA9IGNhbmNlbGxhdGlvblN0cmF0ZWd5LnNlbmRlci5zZW5kQ2FuY2VsbGF0aW9uKGNvbm5lY3Rpb24sIGlkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhgUmVjZWl2ZWQgbm8gcHJvbWlzZSBmcm9tIGNhbmNlbGxhdGlvbiBzdHJhdGVneSB3aGVuIGNhbmNlbGxpbmcgaWQgJHtpZH1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIubG9nKGBTZW5kaW5nIGNhbmNlbGxhdGlvbiBtZXNzYWdlcyBmb3IgaWQgJHtpZH0gZmFpbGVkYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdE1lc3NhZ2UgPSB7XG4gICAgICAgICAgICAgICAganNvbnJwYzogdmVyc2lvbixcbiAgICAgICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBtZXNzYWdlUGFyYW1zXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdHJhY2VTZW5kaW5nUmVxdWVzdChyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNhbmNlbGxhdGlvblN0cmF0ZWd5LnNlbmRlci5lbmFibGVDYW5jZWxsYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25TdHJhdGVneS5zZW5kZXIuZW5hYmxlQ2FuY2VsbGF0aW9uKHJlcXVlc3RNZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZVdpdGhDbGVhbnVwID0gKHIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyKTtcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uU3RyYXRlZ3kuc2VuZGVyLmNsZWFudXAoaWQpO1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlPy5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWplY3RXaXRoQ2xlYW51cCA9IChyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChyKTtcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uU3RyYXRlZ3kuc2VuZGVyLmNsZWFudXAoaWQpO1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlPy5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZVByb21pc2UgPSB7IG1ldGhvZDogbWV0aG9kLCB0aW1lclN0YXJ0OiBEYXRlLm5vdygpLCByZXNvbHZlOiByZXNvbHZlV2l0aENsZWFudXAsIHJlamVjdDogcmVqZWN0V2l0aENsZWFudXAgfTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2VzLnNldChpZCwgcmVzcG9uc2VQcm9taXNlKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbWVzc2FnZVdyaXRlci53cml0ZShyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAvLyBXcml0aW5nIHRoZSBtZXNzYWdlIGZhaWxlZC4gU28gd2UgbmVlZCB0byBkZWxldGUgaXQgZnJvbSB0aGUgcmVzcG9uc2UgcHJvbWlzZXMgYW5kXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlamVjdCBpdC5cbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlcy5kZWxldGUoaWQpO1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2UucmVqZWN0KG5ldyBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IobWVzc2FnZXNfMS5FcnJvckNvZGVzLk1lc3NhZ2VXcml0ZUVycm9yLCBlcnJvci5tZXNzYWdlID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIHJlYXNvbicpKTtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlcXVlc3QgZmFpbGVkLmApO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25SZXF1ZXN0OiAodHlwZSwgaGFuZGxlcikgPT4ge1xuICAgICAgICAgICAgdGhyb3dJZkNsb3NlZE9yRGlzcG9zZWQoKTtcbiAgICAgICAgICAgIGxldCBtZXRob2QgPSBudWxsO1xuICAgICAgICAgICAgaWYgKFN0YXJSZXF1ZXN0SGFuZGxlci5pcyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBzdGFyUmVxdWVzdEhhbmRsZXIgPSB0eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoSXMuc3RyaW5nKHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgbWV0aG9kID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoaGFuZGxlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RIYW5kbGVycy5zZXQodHlwZSwgeyBoYW5kbGVyOiBoYW5kbGVyLCB0eXBlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSB0eXBlLm1ldGhvZDtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEhhbmRsZXJzLnNldCh0eXBlLm1ldGhvZCwgeyB0eXBlLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SGFuZGxlcnMuZGVsZXRlKG1ldGhvZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFyUmVxdWVzdEhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBoYXNQZW5kaW5nUmVzcG9uc2U6ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZVByb21pc2VzLnNpemUgPiAwO1xuICAgICAgICB9LFxuICAgICAgICB0cmFjZTogYXN5bmMgKF92YWx1ZSwgX3RyYWNlciwgc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBsZXQgX3NlbmROb3RpZmljYXRpb24gPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBfdHJhY2VGb3JtYXQgPSBUcmFjZUZvcm1hdC5UZXh0O1xuICAgICAgICAgICAgaWYgKHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKElzLmJvb2xlYW4oc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zKSkge1xuICAgICAgICAgICAgICAgICAgICBfc2VuZE5vdGlmaWNhdGlvbiA9IHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF9zZW5kTm90aWZpY2F0aW9uID0gc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zLnNlbmROb3RpZmljYXRpb24gfHwgZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIF90cmFjZUZvcm1hdCA9IHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucy50cmFjZUZvcm1hdCB8fCBUcmFjZUZvcm1hdC5UZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlID0gX3ZhbHVlO1xuICAgICAgICAgICAgdHJhY2VGb3JtYXQgPSBfdHJhY2VGb3JtYXQ7XG4gICAgICAgICAgICBpZiAodHJhY2UgPT09IFRyYWNlLk9mZikge1xuICAgICAgICAgICAgICAgIHRyYWNlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRyYWNlciA9IF90cmFjZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoX3NlbmROb3RpZmljYXRpb24gJiYgIWlzQ2xvc2VkKCkgJiYgIWlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGNvbm5lY3Rpb24uc2VuZE5vdGlmaWNhdGlvbihTZXRUcmFjZU5vdGlmaWNhdGlvbi50eXBlLCB7IHZhbHVlOiBUcmFjZS50b1N0cmluZyhfdmFsdWUpIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBvbkVycm9yOiBlcnJvckVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIG9uQ2xvc2U6IGNsb3NlRW1pdHRlci5ldmVudCxcbiAgICAgICAgb25VbmhhbmRsZWROb3RpZmljYXRpb246IHVuaGFuZGxlZE5vdGlmaWNhdGlvbkVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIG9uRGlzcG9zZTogZGlzcG9zZUVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIGVuZDogKCkgPT4ge1xuICAgICAgICAgICAgbWVzc2FnZVdyaXRlci5lbmQoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLkRpc3Bvc2VkO1xuICAgICAgICAgICAgZGlzcG9zZUVtaXR0ZXIuZmlyZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5QZW5kaW5nUmVzcG9uc2VSZWplY3RlZCwgJ1BlbmRpbmcgcmVzcG9uc2UgcmVqZWN0ZWQgc2luY2UgY29ubmVjdGlvbiBnb3QgZGlzcG9zZWQnKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvbWlzZSBvZiByZXNwb25zZVByb21pc2VzLnZhbHVlcygpKSB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBrbm93bkNhbmNlbGVkUmVxdWVzdHMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICBtZXNzYWdlUXVldWUgPSBuZXcgbGlua2VkTWFwXzEuTGlua2VkTWFwKCk7XG4gICAgICAgICAgICAvLyBUZXN0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgaWYgKElzLmZ1bmMobWVzc2FnZVdyaXRlci5kaXNwb3NlKSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKElzLmZ1bmMobWVzc2FnZVJlYWRlci5kaXNwb3NlKSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VSZWFkZXIuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBsaXN0ZW46ICgpID0+IHtcbiAgICAgICAgICAgIHRocm93SWZDbG9zZWRPckRpc3Bvc2VkKCk7XG4gICAgICAgICAgICB0aHJvd0lmTGlzdGVuaW5nKCk7XG4gICAgICAgICAgICBzdGF0ZSA9IENvbm5lY3Rpb25TdGF0ZS5MaXN0ZW5pbmc7XG4gICAgICAgICAgICBtZXNzYWdlUmVhZGVyLmxpc3RlbihjYWxsYmFjayk7XG4gICAgICAgIH0sXG4gICAgICAgIGluc3BlY3Q6ICgpID0+IHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS5jb25zb2xlLmxvZygnaW5zcGVjdCcpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25uZWN0aW9uLm9uTm90aWZpY2F0aW9uKExvZ1RyYWNlTm90aWZpY2F0aW9uLnR5cGUsIChwYXJhbXMpID0+IHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZlcmJvc2UgPSB0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdDtcbiAgICAgICAgdHJhY2VyLmxvZyhwYXJhbXMubWVzc2FnZSwgdmVyYm9zZSA/IHBhcmFtcy52ZXJib3NlIDogdW5kZWZpbmVkKTtcbiAgICB9KTtcbiAgICBjb25uZWN0aW9uLm9uTm90aWZpY2F0aW9uKFByb2dyZXNzTm90aWZpY2F0aW9uLnR5cGUsIChwYXJhbXMpID0+IHtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IHByb2dyZXNzSGFuZGxlcnMuZ2V0KHBhcmFtcy50b2tlbik7XG4gICAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICAgICBoYW5kbGVyKHBhcmFtcy52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1bmhhbmRsZWRQcm9ncmVzc0VtaXR0ZXIuZmlyZShwYXJhbXMpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbm5lY3Rpb247XG59XG5leHBvcnRzLmNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uID0gY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb247XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vdHlwaW5ncy90aGVuYWJsZS5kLnRzXCIgLz5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUHJvZ3Jlc3NUeXBlID0gZXhwb3J0cy5Qcm9ncmVzc1Rva2VuID0gZXhwb3J0cy5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiA9IGV4cG9ydHMuTnVsbExvZ2dlciA9IGV4cG9ydHMuQ29ubmVjdGlvbk9wdGlvbnMgPSBleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IGV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlQnVmZmVyID0gZXhwb3J0cy5Xcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyID0gZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLk1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLlJlYWRhYmxlU3RyZWFtTWVzc2FnZVJlYWRlciA9IGV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlUmVhZGVyID0gZXhwb3J0cy5NZXNzYWdlUmVhZGVyID0gZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblRva2VuID0gZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IGV4cG9ydHMuRW1pdHRlciA9IGV4cG9ydHMuRXZlbnQgPSBleHBvcnRzLkRpc3Bvc2FibGUgPSBleHBvcnRzLkxSVUNhY2hlID0gZXhwb3J0cy5Ub3VjaCA9IGV4cG9ydHMuTGlua2VkTWFwID0gZXhwb3J0cy5QYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlOSA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTggPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU3ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNiA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTUgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU0ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMyA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTIgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUxID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMCA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZSA9IGV4cG9ydHMuRXJyb3JDb2RlcyA9IGV4cG9ydHMuUmVzcG9uc2VFcnJvciA9IGV4cG9ydHMuUmVxdWVzdFR5cGU5ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTggPSBleHBvcnRzLlJlcXVlc3RUeXBlNyA9IGV4cG9ydHMuUmVxdWVzdFR5cGU2ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTUgPSBleHBvcnRzLlJlcXVlc3RUeXBlNCA9IGV4cG9ydHMuUmVxdWVzdFR5cGUzID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTIgPSBleHBvcnRzLlJlcXVlc3RUeXBlMSA9IGV4cG9ydHMuUmVxdWVzdFR5cGUwID0gZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IGV4cG9ydHMuTWVzc2FnZSA9IGV4cG9ydHMuUkFMID0gdm9pZCAwO1xuZXhwb3J0cy5NZXNzYWdlU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblN0cmF0ZWd5ID0gZXhwb3J0cy5DYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IGV4cG9ydHMuQ29ubmVjdGlvbkVycm9yID0gZXhwb3J0cy5Db25uZWN0aW9uRXJyb3JzID0gZXhwb3J0cy5Mb2dUcmFjZU5vdGlmaWNhdGlvbiA9IGV4cG9ydHMuU2V0VHJhY2VOb3RpZmljYXRpb24gPSBleHBvcnRzLlRyYWNlRm9ybWF0ID0gZXhwb3J0cy5UcmFjZVZhbHVlcyA9IGV4cG9ydHMuVHJhY2UgPSB2b2lkIDA7XG5jb25zdCBtZXNzYWdlc18xID0gcmVxdWlyZShcIi4vbWVzc2FnZXNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNZXNzYWdlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk1lc3NhZ2U7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlMFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTA7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTFcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGUxOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGUyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlMjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlM1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGU0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGU1XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlNTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlNlwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTY7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTdcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGU3OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGU4XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlODsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlOVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTk7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXNwb25zZUVycm9yXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3I7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJFcnJvckNvZGVzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLkVycm9yQ29kZXM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlMFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlMDsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGUxXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGUxOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZTJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlM1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlMzsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGU0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZTVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlNlwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlNjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGU3XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU3OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZThcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTg7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlOVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlOTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlBhcmFtZXRlclN0cnVjdHVyZXNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlczsgfSB9KTtcbmNvbnN0IGxpbmtlZE1hcF8xID0gcmVxdWlyZShcIi4vbGlua2VkTWFwXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTGlua2VkTWFwXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBsaW5rZWRNYXBfMS5MaW5rZWRNYXA7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJMUlVDYWNoZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbGlua2VkTWFwXzEuTFJVQ2FjaGU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJUb3VjaFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbGlua2VkTWFwXzEuVG91Y2g7IH0gfSk7XG5jb25zdCBkaXNwb3NhYmxlXzEgPSByZXF1aXJlKFwiLi9kaXNwb3NhYmxlXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiRGlzcG9zYWJsZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZGlzcG9zYWJsZV8xLkRpc3Bvc2FibGU7IH0gfSk7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCIuL2V2ZW50c1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkV2ZW50XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBldmVudHNfMS5FdmVudDsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkVtaXR0ZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGV2ZW50c18xLkVtaXR0ZXI7IH0gfSk7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblRva2VuU291cmNlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjYW5jZWxsYXRpb25fMS5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblRva2VuXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjYW5jZWxsYXRpb25fMS5DYW5jZWxsYXRpb25Ub2tlbjsgfSB9KTtcbmNvbnN0IHNoYXJlZEFycmF5Q2FuY2VsbGF0aW9uXzEgPSByZXF1aXJlKFwiLi9zaGFyZWRBcnJheUNhbmNlbGxhdGlvblwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHNoYXJlZEFycmF5Q2FuY2VsbGF0aW9uXzEuU2hhcmVkQXJyYXlTZW5kZXJTdHJhdGVneTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlNoYXJlZEFycmF5UmVjZWl2ZXJTdHJhdGVneVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gc2hhcmVkQXJyYXlDYW5jZWxsYXRpb25fMS5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3k7IH0gfSk7XG5jb25zdCBtZXNzYWdlUmVhZGVyXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlUmVhZGVyXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTWVzc2FnZVJlYWRlclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZVJlYWRlcl8xLk1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VSZWFkZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VSZWFkZXJfMS5BYnN0cmFjdE1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VSZWFkZXJfMS5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5jb25zdCBtZXNzYWdlV3JpdGVyXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlV3JpdGVyXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTWVzc2FnZVdyaXRlclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZVdyaXRlcl8xLk1lc3NhZ2VXcml0ZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VXcml0ZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VXcml0ZXJfMS5BYnN0cmFjdE1lc3NhZ2VXcml0ZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJXcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlV3JpdGVyXzEuV3JpdGVhYmxlU3RyZWFtTWVzc2FnZVdyaXRlcjsgfSB9KTtcbmNvbnN0IG1lc3NhZ2VCdWZmZXJfMSA9IHJlcXVpcmUoXCIuL21lc3NhZ2VCdWZmZXJcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VCdWZmZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VCdWZmZXJfMS5BYnN0cmFjdE1lc3NhZ2VCdWZmZXI7IH0gfSk7XG5jb25zdCBjb25uZWN0aW9uXzEgPSByZXF1aXJlKFwiLi9jb25uZWN0aW9uXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29ubmVjdGlvblN0cmF0ZWd5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ29ubmVjdGlvblN0cmF0ZWd5OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29ubmVjdGlvbk9wdGlvbnNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5Db25uZWN0aW9uT3B0aW9uczsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk51bGxMb2dnZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5OdWxsTG9nZ2VyOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb25cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlByb2dyZXNzVG9rZW5cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5Qcm9ncmVzc1Rva2VuOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUHJvZ3Jlc3NUeXBlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuUHJvZ3Jlc3NUeXBlOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiVHJhY2VcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5UcmFjZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlRyYWNlVmFsdWVzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuVHJhY2VWYWx1ZXM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJUcmFjZUZvcm1hdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29ubmVjdGlvbl8xLlRyYWNlRm9ybWF0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiU2V0VHJhY2VOb3RpZmljYXRpb25cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5TZXRUcmFjZU5vdGlmaWNhdGlvbjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkxvZ1RyYWNlTm90aWZpY2F0aW9uXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuTG9nVHJhY2VOb3RpZmljYXRpb247IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJDb25uZWN0aW9uRXJyb3JzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ29ubmVjdGlvbkVycm9yczsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNvbm5lY3Rpb25FcnJvclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29ubmVjdGlvbl8xLkNvbm5lY3Rpb25FcnJvcjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5DYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5DYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblN0cmF0ZWd5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ2FuY2VsbGF0aW9uU3RyYXRlZ3k7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNZXNzYWdlU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5NZXNzYWdlU3RyYXRlZ3k7IH0gfSk7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbmV4cG9ydHMuUkFMID0gcmFsXzEuZGVmYXVsdDtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGFwaV8xID0gcmVxdWlyZShcIi4uL2NvbW1vbi9hcGlcIik7XG5jbGFzcyBNZXNzYWdlQnVmZmVyIGV4dGVuZHMgYXBpXzEuQWJzdHJhY3RNZXNzYWdlQnVmZmVyIHtcbiAgICBjb25zdHJ1Y3RvcihlbmNvZGluZyA9ICd1dGYtOCcpIHtcbiAgICAgICAgc3VwZXIoZW5jb2RpbmcpO1xuICAgICAgICB0aGlzLmFzY2lpRGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcignYXNjaWknKTtcbiAgICB9XG4gICAgZW1wdHlCdWZmZXIoKSB7XG4gICAgICAgIHJldHVybiBNZXNzYWdlQnVmZmVyLmVtcHR5QnVmZmVyO1xuICAgIH1cbiAgICBmcm9tU3RyaW5nKHZhbHVlLCBfZW5jb2RpbmcpIHtcbiAgICAgICAgcmV0dXJuIChuZXcgVGV4dEVuY29kZXIoKSkuZW5jb2RlKHZhbHVlKTtcbiAgICB9XG4gICAgdG9TdHJpbmcodmFsdWUsIGVuY29kaW5nKSB7XG4gICAgICAgIGlmIChlbmNvZGluZyA9PT0gJ2FzY2lpJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXNjaWlEZWNvZGVyLmRlY29kZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gKG5ldyBUZXh0RGVjb2RlcihlbmNvZGluZykpLmRlY29kZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXNOYXRpdmUoYnVmZmVyLCBsZW5ndGgpIHtcbiAgICAgICAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlci5zbGljZSgwLCBsZW5ndGgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFsbG9jTmF0aXZlKGxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTtcbiAgICB9XG59XG5NZXNzYWdlQnVmZmVyLmVtcHR5QnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMCk7XG5jbGFzcyBSZWFkYWJsZVN0cmVhbVdyYXBwZXIge1xuICAgIGNvbnN0cnVjdG9yKHNvY2tldCkge1xuICAgICAgICB0aGlzLnNvY2tldCA9IHNvY2tldDtcbiAgICAgICAgdGhpcy5fb25EYXRhID0gbmV3IGFwaV8xLkVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5fbWVzc2FnZUxpc3RlbmVyID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBibG9iID0gZXZlbnQuZGF0YTtcbiAgICAgICAgICAgIGJsb2IuYXJyYXlCdWZmZXIoKS50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkRhdGEuZmlyZShuZXcgVWludDhBcnJheShidWZmZXIpKTtcbiAgICAgICAgICAgIH0sICgpID0+IHtcbiAgICAgICAgICAgICAgICAoMCwgYXBpXzEuUkFMKSgpLmNvbnNvbGUuZXJyb3IoYENvbnZlcnRpbmcgYmxvYiB0byBhcnJheSBidWZmZXIgZmFpbGVkLmApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLl9tZXNzYWdlTGlzdGVuZXIpO1xuICAgIH1cbiAgICBvbkNsb3NlKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2Nsb3NlJywgbGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gYXBpXzEuRGlzcG9zYWJsZS5jcmVhdGUoKCkgPT4gdGhpcy5zb2NrZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xvc2UnLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkVycm9yKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgbGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gYXBpXzEuRGlzcG9zYWJsZS5jcmVhdGUoKCkgPT4gdGhpcy5zb2NrZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkVuZChsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKCdlbmQnLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdlbmQnLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkRhdGEobGlzdGVuZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uRGF0YS5ldmVudChsaXN0ZW5lcik7XG4gICAgfVxufVxuY2xhc3MgV3JpdGFibGVTdHJlYW1XcmFwcGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihzb2NrZXQpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7XG4gICAgfVxuICAgIG9uQ2xvc2UobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignY2xvc2UnLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbG9zZScsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIG9uRXJyb3IobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIG9uRW5kKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2VuZCcsIGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIGFwaV8xLkRpc3Bvc2FibGUuY3JlYXRlKCgpID0+IHRoaXMuc29ja2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2VuZCcsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIHdyaXRlKGRhdGEsIGVuY29kaW5nKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkICYmIGVuY29kaW5nICE9PSAndXRmLTgnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbiBhIEJyb3dzZXIgZW52aXJvbm1lbnRzIG9ubHkgdXRmLTggdGV4dCBlbmNvZGluZyBpcyBzdXBwb3J0ZWQuIEJ1dCBnb3QgZW5jb2Rpbmc6ICR7ZW5jb2Rpbmd9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKTtcbiAgICB9XG59XG5jb25zdCBfdGV4dEVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbmNvbnN0IF9yaWwgPSBPYmplY3QuZnJlZXplKHtcbiAgICBtZXNzYWdlQnVmZmVyOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgY3JlYXRlOiAoZW5jb2RpbmcpID0+IG5ldyBNZXNzYWdlQnVmZmVyKGVuY29kaW5nKVxuICAgIH0pLFxuICAgIGFwcGxpY2F0aW9uSnNvbjogT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGVuY29kZXI6IE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgbmFtZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgZW5jb2RlOiAobXNnLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2hhcnNldCAhPT0gJ3V0Zi04Jykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluIGEgQnJvd3NlciBlbnZpcm9ubWVudHMgb25seSB1dGYtOCB0ZXh0IGVuY29kaW5nIGlzIHN1cHBvcnRlZC4gQnV0IGdvdCBlbmNvZGluZzogJHtvcHRpb25zLmNoYXJzZXR9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoX3RleHRFbmNvZGVyLmVuY29kZShKU09OLnN0cmluZ2lmeShtc2csIHVuZGVmaW5lZCwgMCkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIGRlY29kZXI6IE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgbmFtZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgZGVjb2RlOiAoYnVmZmVyLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCEoYnVmZmVyIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbiBhIEJyb3dzZXIgZW52aXJvbm1lbnRzIG9ubHkgVWludDhBcnJheXMgYXJlIHN1cHBvcnRlZC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShKU09OLnBhcnNlKG5ldyBUZXh0RGVjb2RlcihvcHRpb25zLmNoYXJzZXQpLmRlY29kZShidWZmZXIpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfSksXG4gICAgc3RyZWFtOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgYXNSZWFkYWJsZVN0cmVhbTogKHNvY2tldCkgPT4gbmV3IFJlYWRhYmxlU3RyZWFtV3JhcHBlcihzb2NrZXQpLFxuICAgICAgICBhc1dyaXRhYmxlU3RyZWFtOiAoc29ja2V0KSA9PiBuZXcgV3JpdGFibGVTdHJlYW1XcmFwcGVyKHNvY2tldClcbiAgICB9KSxcbiAgICBjb25zb2xlOiBjb25zb2xlLFxuICAgIHRpbWVyOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgc2V0VGltZW91dChjYWxsYmFjaywgbXMsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHNldFRpbWVvdXQoY2FsbGJhY2ssIG1zLCAuLi5hcmdzKTtcbiAgICAgICAgICAgIHJldHVybiB7IGRpc3Bvc2U6ICgpID0+IGNsZWFyVGltZW91dChoYW5kbGUpIH07XG4gICAgICAgIH0sXG4gICAgICAgIHNldEltbWVkaWF0ZShjYWxsYmFjaywgLi4uYXJncykge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gc2V0VGltZW91dChjYWxsYmFjaywgMCwgLi4uYXJncyk7XG4gICAgICAgICAgICByZXR1cm4geyBkaXNwb3NlOiAoKSA9PiBjbGVhclRpbWVvdXQoaGFuZGxlKSB9O1xuICAgICAgICB9LFxuICAgICAgICBzZXRJbnRlcnZhbChjYWxsYmFjaywgbXMsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHNldEludGVydmFsKGNhbGxiYWNrLCBtcywgLi4uYXJncyk7XG4gICAgICAgICAgICByZXR1cm4geyBkaXNwb3NlOiAoKSA9PiBjbGVhckludGVydmFsKGhhbmRsZSkgfTtcbiAgICAgICAgfSxcbiAgICB9KVxufSk7XG5mdW5jdGlvbiBSSUwoKSB7XG4gICAgcmV0dXJuIF9yaWw7XG59XG4oZnVuY3Rpb24gKFJJTCkge1xuICAgIGZ1bmN0aW9uIGluc3RhbGwoKSB7XG4gICAgICAgIGFwaV8xLlJBTC5pbnN0YWxsKF9yaWwpO1xuICAgIH1cbiAgICBSSUwuaW5zdGFsbCA9IGluc3RhbGw7XG59KShSSUwgfHwgKFJJTCA9IHt9KSk7XG5leHBvcnRzLmRlZmF1bHQgPSBSSUw7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24gPSBleHBvcnRzLkJyb3dzZXJNZXNzYWdlV3JpdGVyID0gZXhwb3J0cy5Ccm93c2VyTWVzc2FnZVJlYWRlciA9IHZvaWQgMDtcbmNvbnN0IHJpbF8xID0gcmVxdWlyZShcIi4vcmlsXCIpO1xuLy8gSW5zdGFsbCB0aGUgYnJvd3NlciBydW50aW1lIGFic3RyYWN0LlxucmlsXzEuZGVmYXVsdC5pbnN0YWxsKCk7XG5jb25zdCBhcGlfMSA9IHJlcXVpcmUoXCIuLi9jb21tb24vYXBpXCIpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuLi9jb21tb24vYXBpXCIpLCBleHBvcnRzKTtcbmNsYXNzIEJyb3dzZXJNZXNzYWdlUmVhZGVyIGV4dGVuZHMgYXBpXzEuQWJzdHJhY3RNZXNzYWdlUmVhZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihwb3J0KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX29uRGF0YSA9IG5ldyBhcGlfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuX21lc3NhZ2VMaXN0ZW5lciA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fb25EYXRhLmZpcmUoZXZlbnQuZGF0YSk7XG4gICAgICAgIH07XG4gICAgICAgIHBvcnQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoZXZlbnQpID0+IHRoaXMuZmlyZUVycm9yKGV2ZW50KSk7XG4gICAgICAgIHBvcnQub25tZXNzYWdlID0gdGhpcy5fbWVzc2FnZUxpc3RlbmVyO1xuICAgIH1cbiAgICBsaXN0ZW4oY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uRGF0YS5ldmVudChjYWxsYmFjayk7XG4gICAgfVxufVxuZXhwb3J0cy5Ccm93c2VyTWVzc2FnZVJlYWRlciA9IEJyb3dzZXJNZXNzYWdlUmVhZGVyO1xuY2xhc3MgQnJvd3Nlck1lc3NhZ2VXcml0ZXIgZXh0ZW5kcyBhcGlfMS5BYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKHBvcnQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50ID0gMDtcbiAgICAgICAgcG9ydC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIChldmVudCkgPT4gdGhpcy5maXJlRXJyb3IoZXZlbnQpKTtcbiAgICB9XG4gICAgd3JpdGUobXNnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnBvcnQucG9zdE1lc3NhZ2UobXNnKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IsIG1zZyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZUVycm9yKGVycm9yLCBtc2cpIHtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50Kys7XG4gICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yLCBtc2csIHRoaXMuZXJyb3JDb3VudCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICB9XG59XG5leHBvcnRzLkJyb3dzZXJNZXNzYWdlV3JpdGVyID0gQnJvd3Nlck1lc3NhZ2VXcml0ZXI7XG5mdW5jdGlvbiBjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbihyZWFkZXIsIHdyaXRlciwgbG9nZ2VyLCBvcHRpb25zKSB7XG4gICAgaWYgKGxvZ2dlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxvZ2dlciA9IGFwaV8xLk51bGxMb2dnZXI7XG4gICAgfVxuICAgIGlmIChhcGlfMS5Db25uZWN0aW9uU3RyYXRlZ3kuaXMob3B0aW9ucykpIHtcbiAgICAgICAgb3B0aW9ucyA9IHsgY29ubmVjdGlvblN0cmF0ZWd5OiBvcHRpb25zIH07XG4gICAgfVxuICAgIHJldHVybiAoMCwgYXBpXzEuY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24pKHJlYWRlciwgd3JpdGVyLCBsb2dnZXIsIG9wdGlvbnMpO1xufVxuZXhwb3J0cy5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiA9IGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uO1xuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL2Jyb3dzZXIvbWFpbicpOyIsICIvKlxuICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMjYgRWNsaXBzZSBEaXJpZ2libGUgY29udHJpYnV0b3JzXG4gKlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlXG4gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2Mi4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG4gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MjAuaHRtbFxuICpcbiAqIFNQRFgtRmlsZUNvcHlyaWdodFRleHQ6IEVjbGlwc2UgRGlyaWdpYmxlIGNvbnRyaWJ1dG9ycyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbi8qKlxuICogSmF2YSBMU1AgY2xpZW50IGJ1bmRsZS5cbiAqXG4gKiBVc2VzIHZzY29kZS13cy1qc29ucnBjIGZvciB0eXBlZCBKU09OLVJQQyBvdmVyIFdlYlNvY2tldCBhbmQgcmVnaXN0ZXJzIE1vbmFjb1xuICogcHJvdmlkZXJzIHRoYXQgZGVsZWdhdGUgdG8gSkRULkxTLiBFeHBvc2VkIGFzIGdsb2JhbCBKYXZhTHNwQ2xpZW50TGliIHNvIHRoYXRcbiAqIGVkaXRvci5qcyBjYW4gY2FsbCBKYXZhTHNwQ2xpZW50TGliLmNvbm5lY3QocmVzb3VyY2VQYXRoKS5cbiAqXG4gKiBPbmUgSkRULkxTIHByb2Nlc3MgY292ZXJzIHRoZSBlbnRpcmUgd29ya3NwYWNlLCBzbyBhIHNpbmdsZSBXZWJTb2NrZXQgY29ubmVjdGlvblxuICogaXMgc2hhcmVkIGFjcm9zcyBhbGwgSmF2YSBmaWxlcyBvcGVuIGluIHRoZSBzYW1lIGJyb3dzZXIgcGFnZS4gVGhlIGNvbm5lY3Rpb24gaXNcbiAqIGVzdGFibGlzaGVkIG9uIHRoZSBmaXJzdCBjb25uZWN0KCkgY2FsbCBhbmQgcmV1c2VkIGZvciBhbGwgc3Vic2VxdWVudCBjYWxscy5cbiAqXG4gKiBlZGl0b3IuanMgc2V0cyB3aW5kb3cubW9uYWNvIGJlZm9yZSBjYWxsaW5nIGNvbm5lY3QoKSwgc28gdGhlIG1vbmFjby1zaGltJ3MgbGF6eVxuICogUHJveGllcyByZXNvbHZlIGNvcnJlY3RseSBhdCBjYWxsIHRpbWUuXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24sIE1lc3NhZ2VDb25uZWN0aW9uIH0gZnJvbSAndnNjb2RlLWpzb25ycGMvYnJvd3Nlcic7XG5pbXBvcnQgeyB0b1NvY2tldCwgV2ViU29ja2V0TWVzc2FnZVJlYWRlciwgV2ViU29ja2V0TWVzc2FnZVdyaXRlciB9IGZyb20gJ3ZzY29kZS13cy1qc29ucnBjJztcbmltcG9ydCAqIGFzIG1vbmFjbyBmcm9tICdtb25hY28tZWRpdG9yJztcbmltcG9ydCB7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLFxuICAgIERpYWdub3N0aWNTZXZlcml0eSxcbiAgICBJbnNlcnRUZXh0Rm9ybWF0LFxuICAgIE1hcmt1cENvbnRlbnQsXG4gICAgTWFya3VwS2luZCxcbiAgICB0eXBlIENvZGVBY3Rpb24sXG4gICAgdHlwZSBDb21tYW5kLFxuICAgIHR5cGUgQ29tcGxldGlvbkl0ZW0sXG4gICAgdHlwZSBDb21wbGV0aW9uTGlzdCxcbiAgICB0eXBlIERpYWdub3N0aWMsXG4gICAgdHlwZSBIb3ZlcixcbiAgICB0eXBlIExvY2F0aW9uLFxuICAgIHR5cGUgUGFyYW1ldGVySW5mb3JtYXRpb24sXG4gICAgdHlwZSBTaWduYXR1cmVIZWxwLFxuICAgIHR5cGUgU2lnbmF0dXJlSW5mb3JtYXRpb24sXG4gICAgdHlwZSBUZXh0RWRpdCxcbiAgICB0eXBlIFdvcmtzcGFjZUVkaXQsXG59IGZyb20gJ3ZzY29kZS1sYW5ndWFnZXNlcnZlci10eXBlcyc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNpbmdsZXRvbiBzdGF0ZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogU2hhcmVkIGNvbm5lY3Rpb24gXHUyMDE0IG9uZSBwZXIgYnJvd3NlciBwYWdlLCBjb3ZlcmluZyBhbGwgcHJvamVjdHMgaW4gdGhlIHdvcmtzcGFjZS4gKi9cbmxldCBfY29ubjogTWVzc2FnZUNvbm5lY3Rpb24gfCBudWxsID0gbnVsbDtcblxuLyoqXG4gKiBWaXJ0dWFsIHdvcmtzcGFjZSByb290IFVSSSwgZS5nLiB7QGNvZGUgZmlsZTovLy93b3Jrc3BhY2Uvd29ya3NwYWNlL30uXG4gKiBTZXQgb25jZSBvbiBmaXJzdCBjb25uZWN0KCk7IHVzZWQgdG8gc2NvcGUgTW9uYWNvIHByb3ZpZGVycyB0byB3b3Jrc3BhY2UgZmlsZXMuXG4gKi9cbmxldCBfd29ya3NwYWNlUm9vdCA9ICcnO1xuXG4vKiogVVJJcyBmb3Igd2hpY2ggdGV4dERvY3VtZW50L2RpZE9wZW4gaGFzIGFscmVhZHkgYmVlbiBzZW50LiAqL1xuY29uc3QgX29wZW5GaWxlczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cbmxldCBfcHJvdmlkZXJzUmVnaXN0ZXJlZCA9IGZhbHNlO1xuXG4vKiogU2VtYW50aWMtdG9rZW4gbGVnZW5kIHJlcG9ydGVkIGJ5IEpEVC5MUyBpbiB0aGUgaW5pdGlhbGl6ZSByZXN1bHQ7IG5lZWRlZCB0byBkZWNvZGUgdG9rZW4gZGF0YS4gKi9cbmxldCBfc2VtYW50aWNUb2tlbnNMZWdlbmQ6IHsgdG9rZW5UeXBlczogc3RyaW5nW107IHRva2VuTW9kaWZpZXJzOiBzdHJpbmdbXSB9IHwgbnVsbCA9IG51bGw7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFB1YmxpYyBBUElcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIENhbGxlZCBieSBlZGl0b3IuanMgd2hlbiBhIEphdmEgZmlsZSBpcyBvcGVuZWQuIFNhZmUgdG8gY2FsbCBtdWx0aXBsZSB0aW1lcy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb25uZWN0KHJlc291cmNlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFydHMgPSByZXNvdXJjZVBhdGgucmVwbGFjZSgvXlxcLy8sICcnKS5zcGxpdCgnLycpO1xuICAgIGNvbnN0IHdvcmtzcGFjZSA9IHBhcnRzWzBdO1xuICAgIGNvbnN0IHByb2plY3QgICA9IHBhcnRzWzFdO1xuICAgIGNvbnN0IGZpbGVVcmkgPSBgZmlsZTovLy93b3Jrc3BhY2UvJHt3b3Jrc3BhY2V9LyR7cHJvamVjdH0vJHtwYXJ0cy5zbGljZSgyKS5qb2luKCcvJyl9YDtcblxuICAgIGlmIChfY29ubikge1xuICAgICAgICAvLyBDb25uZWN0aW9uIGFscmVhZHkgZXN0YWJsaXNoZWQgXHUyMDE0IGp1c3Qgb3BlbiB0aGUgbmV3IGZpbGUuXG4gICAgICAgIG9wZW5GaWxlKGZpbGVVcmkpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgX3dvcmtzcGFjZVJvb3QgPSBgZmlsZTovLy93b3Jrc3BhY2UvJHt3b3Jrc3BhY2V9L2A7XG5cbiAgICBjb25zdCBwcm90byA9IGxvY2F0aW9uLnByb3RvY29sID09PSAnaHR0cHM6JyA/ICd3c3MnIDogJ3dzJztcbiAgICBjb25zdCB3c1VybCA9IGAke3Byb3RvfTovLyR7bG9jYXRpb24uaG9zdH0vd2Vic29ja2V0cy9pZGUvamF2YS1sc3BgXG4gICAgICAgICAgICAgICAgKyBgP3dvcmtzcGFjZT0ke2VuY29kZVVSSUNvbXBvbmVudCh3b3Jrc3BhY2UpfWA7XG5cbiAgICBjb25zdCB3cyA9IG5ldyBXZWJTb2NrZXQod3NVcmwpO1xuICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgd3Mub25vcGVuICA9ICgpID0+IHJlc29sdmUoKTtcbiAgICAgICAgd3Mub25lcnJvciA9ICgpID0+IHJlamVjdChuZXcgRXJyb3IoYFtqYXZhLWxzcF0gV2ViU29ja2V0IGNvbm5lY3QgZmFpbGVkOiAke3dzVXJsfWApKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHNvY2tldCA9IHRvU29ja2V0KHdzKTtcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgV2ViU29ja2V0TWVzc2FnZVJlYWRlcihzb2NrZXQpO1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBXZWJTb2NrZXRNZXNzYWdlV3JpdGVyKHNvY2tldCk7XG4gICAgX2Nvbm4gPSBjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbihyZWFkZXIsIHdyaXRlcik7XG5cbiAgICAvLyBEaWFnbm9zdGljcyBub3RpZmljYXRpb24gXHUyMTkyIE1vbmFjbyBtYXJrZXJzIChhcHBsaWVzIHRvIGFueSB3b3Jrc3BhY2UgZmlsZSlcbiAgICBfY29ubi5vbk5vdGlmaWNhdGlvbigndGV4dERvY3VtZW50L3B1Ymxpc2hEaWFnbm9zdGljcycsIChwYXJhbXM6IHsgdXJpOiBzdHJpbmc7IGRpYWdub3N0aWNzOiBEaWFnbm9zdGljW10gfSkgPT4ge1xuICAgICAgICBjb25zdCBtb2RlbCA9IG1vbmFjby5lZGl0b3IuZ2V0TW9kZWxzKCkuZmluZChtID0+IG0udXJpLnRvU3RyaW5nKCkgPT09IHBhcmFtcy51cmkpO1xuICAgICAgICBpZiAoIW1vZGVsKSByZXR1cm47XG4gICAgICAgIG1vbmFjby5lZGl0b3Iuc2V0TW9kZWxNYXJrZXJzKG1vZGVsLCAnamF2YS1sc3AnLCBwYXJhbXMuZGlhZ25vc3RpY3MubWFwKGQgPT4gKHtcbiAgICAgICAgICAgIHNldmVyaXR5OiAgICAgICAgbHNwU2V2ZXJpdHkoZC5zZXZlcml0eSksXG4gICAgICAgICAgICBtZXNzYWdlOiAgICAgICAgIGQubWVzc2FnZSxcbiAgICAgICAgICAgIHNvdXJjZTogICAgICAgICAgZC5zb3VyY2UgPz8gJ2phdmEnLFxuICAgICAgICAgICAgc3RhcnRMaW5lTnVtYmVyOiBkLnJhbmdlLnN0YXJ0LmxpbmUgKyAxLFxuICAgICAgICAgICAgc3RhcnRDb2x1bW46ICAgICBkLnJhbmdlLnN0YXJ0LmNoYXJhY3RlciArIDEsXG4gICAgICAgICAgICBlbmRMaW5lTnVtYmVyOiAgIGQucmFuZ2UuZW5kLmxpbmUgKyAxLFxuICAgICAgICAgICAgZW5kQ29sdW1uOiAgICAgICBkLnJhbmdlLmVuZC5jaGFyYWN0ZXIgKyAxLFxuICAgICAgICB9KSkpO1xuICAgIH0pO1xuXG4gICAgLy8gU2VydmVyIC0+IGNsaWVudCByZXF1ZXN0cyB0aGF0IGRyaXZlIHJlZmFjdG9yIC8gZ2VuZXJhdGUgcmVzdWx0cyBhbmQgZHluYW1pYyByZWdpc3RyYXRpb24uXG4gICAgX2Nvbm4ub25SZXF1ZXN0KCd3b3Jrc3BhY2UvYXBwbHlFZGl0JywgKHBhcmFtczogeyBlZGl0OiBXb3Jrc3BhY2VFZGl0IH0pID0+IHtcbiAgICAgICAgYXBwbHlXb3Jrc3BhY2VFZGl0KHBhcmFtcy5lZGl0KTtcbiAgICAgICAgcmV0dXJuIHsgYXBwbGllZDogdHJ1ZSB9O1xuICAgIH0pO1xuICAgIF9jb25uLm9uUmVxdWVzdCgnd29ya3NwYWNlL2NvbmZpZ3VyYXRpb24nLCAocGFyYW1zOiB7IGl0ZW1zOiBBcnJheTx7IHNlY3Rpb24/OiBzdHJpbmcgfT4gfSkgPT5cbiAgICAgICAgKHBhcmFtcy5pdGVtcyA/PyBbXSkubWFwKCgpID0+IGpkdGxzU2V0dGluZ3MoKS5qYXZhKSk7XG4gICAgX2Nvbm4ub25SZXF1ZXN0KCdjbGllbnQvcmVnaXN0ZXJDYXBhYmlsaXR5JywgKCkgPT4gbnVsbCk7XG4gICAgX2Nvbm4ub25SZXF1ZXN0KCdjbGllbnQvdW5yZWdpc3RlckNhcGFiaWxpdHknLCAoKSA9PiBudWxsKTtcbiAgICBfY29ubi5vblJlcXVlc3QoJ3dpbmRvdy9zaG93TWVzc2FnZVJlcXVlc3QnLCAoKSA9PiBudWxsKTtcbiAgICBfY29ubi5vblJlcXVlc3QoJ3dpbmRvdy93b3JrRG9uZVByb2dyZXNzL2NyZWF0ZScsICgpID0+IG51bGwpO1xuICAgIF9jb25uLm9uTm90aWZpY2F0aW9uKCd3aW5kb3cvbG9nTWVzc2FnZScsIChwOiB7IG1lc3NhZ2U6IHN0cmluZyB9KSA9PiBjb25zb2xlLmRlYnVnKCdbamF2YS1sc3BdJywgcD8ubWVzc2FnZSkpO1xuICAgIF9jb25uLm9uTm90aWZpY2F0aW9uKCd3aW5kb3cvc2hvd01lc3NhZ2UnLCAocDogeyBtZXNzYWdlOiBzdHJpbmcgfSkgPT4gY29uc29sZS5pbmZvKCdbamF2YS1sc3BdJywgcD8ubWVzc2FnZSkpO1xuICAgIC8vIEpEVC5MUyBsYW5ndWFnZS1zdGF0dXMgLyBwcm9ncmVzcyBub3RpZmljYXRpb25zIFx1MjAxNCBhY2tub3dsZWRnZWQgc2lsZW50bHkuXG4gICAgX2Nvbm4ub25Ob3RpZmljYXRpb24oJ2xhbmd1YWdlL3N0YXR1cycsICgpID0+IHsgLyogaW5kZXhpbmcvcmVhZHkgc3RhdHVzLCBpZ25vcmVkICovIH0pO1xuICAgIF9jb25uLm9uTm90aWZpY2F0aW9uKCdsYW5ndWFnZS9wcm9ncmVzc1JlcG9ydCcsICgpID0+IHsgLyogYnVpbGQgcHJvZ3Jlc3MsIGlnbm9yZWQgKi8gfSk7XG5cbiAgICBfY29ubi5saXN0ZW4oKTtcblxuICAgIGNvbnN0IHJvb3RVcmkgPSBfd29ya3NwYWNlUm9vdDtcbiAgICBjb25zdCBpbml0UmVzdWx0OiBhbnkgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgnaW5pdGlhbGl6ZScsIHtcbiAgICAgICAgcHJvY2Vzc0lkOiBudWxsLFxuICAgICAgICByb290VXJpLFxuICAgICAgICBpbml0aWFsaXphdGlvbk9wdGlvbnM6IHtcbiAgICAgICAgICAgIHNldHRpbmdzOiBqZHRsc1NldHRpbmdzKCksXG4gICAgICAgICAgICBleHRlbmRlZENsaWVudENhcGFiaWxpdGllczoge1xuICAgICAgICAgICAgICAgIHByb2dyZXNzUmVwb3J0UHJvdmlkZXI6ICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgY2xhc3NGaWxlQ29udGVudHNTdXBwb3J0OiAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgIHJlc29sdmVBZGRpdGlvbmFsVGV4dEVkaXRzU3VwcG9ydDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBhZHZhbmNlZEdlbmVyYXRlQWNjZXNzb3JzU3VwcG9ydDogIHRydWUsXG4gICAgICAgICAgICAgICAgZ2VuZXJhdGVUb1N0cmluZ1Byb21wdFN1cHBvcnQ6ICAgICB0cnVlLFxuICAgICAgICAgICAgICAgIGdlbmVyYXRlQ29uc3RydWN0b3JzUHJvbXB0U3VwcG9ydDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBnZW5lcmF0ZURlbGVnYXRlTWV0aG9kc1Byb21wdFN1cHBvcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgaGFzaENvZGVFcXVhbHNQcm9tcHRTdXBwb3J0OiAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgIGFkdmFuY2VkT3JnYW5pemVJbXBvcnRzU3VwcG9ydDogICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICBpbmZlclNlbGVjdGlvblN1cHBvcnQ6ICAgICAgICAgICAgIFsnZXh0cmFjdE1ldGhvZCcsICdleHRyYWN0VmFyaWFibGUnLCAnZXh0cmFjdEZpZWxkJ10sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB3b3Jrc3BhY2VGb2xkZXJzOiBbeyB1cmk6IHJvb3RVcmksIG5hbWU6IHdvcmtzcGFjZSB9XSxcbiAgICAgICAgY2FwYWJpbGl0aWVzOiB7XG4gICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHtcbiAgICAgICAgICAgICAgICBzeW5jaHJvbml6YXRpb246IHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSwgd2lsbFNhdmU6IGZhbHNlLCBkaWRTYXZlOiB0cnVlLCB3aWxsU2F2ZVdhaXRVbnRpbDogZmFsc2UgfSxcbiAgICAgICAgICAgICAgICBjb21wbGV0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgIGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25JdGVtOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzbmlwcGV0U3VwcG9ydDogICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudGF0aW9uRm9ybWF0OiAgIFsnbWFya2Rvd24nLCAncGxhaW50ZXh0J10sXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGVkU3VwcG9ydDogICAgIHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21taXRDaGFyYWN0ZXJzU3VwcG9ydDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVTdXBwb3J0OiAgICAgICAgeyBwcm9wZXJ0aWVzOiBbJ2RvY3VtZW50YXRpb24nLCAnZGV0YWlsJywgJ2FkZGl0aW9uYWxUZXh0RWRpdHMnXSB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0U3VwcG9ydDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGhvdmVyOiAgICAgICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUsIGNvbnRlbnRGb3JtYXQ6IFsnbWFya2Rvd24nLCAncGxhaW50ZXh0J10gfSxcbiAgICAgICAgICAgICAgICBzaWduYXR1cmVIZWxwOiAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLCBzaWduYXR1cmVJbmZvcm1hdGlvbjogeyBkb2N1bWVudGF0aW9uRm9ybWF0OiBbJ21hcmtkb3duJywgJ3BsYWludGV4dCddLCBwYXJhbWV0ZXJJbmZvcm1hdGlvbjogeyBsYWJlbE9mZnNldFN1cHBvcnQ6IHRydWUgfSB9IH0sXG4gICAgICAgICAgICAgICAgZGVmaW5pdGlvbjogICAgIHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIHJlZmVyZW5jZXM6ICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbjogeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgdHlwZURlZmluaXRpb246IHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIGRvY3VtZW50SGlnaGxpZ2h0OiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICBkb2N1bWVudFN5bWJvbDogeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLCBoaWVyYXJjaGljYWxEb2N1bWVudFN5bWJvbFN1cHBvcnQ6IHRydWUgfSxcbiAgICAgICAgICAgICAgICBmb2xkaW5nUmFuZ2U6ICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLCBsaW5lRm9sZGluZ09ubHk6IGZhbHNlIH0sXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uUmFuZ2U6IHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIGNvZGVMZW5zOiAgICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICBpbmxheUhpbnQ6ICAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLCByZXNvbHZlU3VwcG9ydDogeyBwcm9wZXJ0aWVzOiBbJ2xhYmVsJ10gfSB9LFxuICAgICAgICAgICAgICAgIHNlbWFudGljVG9rZW5zOiB7XG4gICAgICAgICAgICAgICAgICAgIGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RzOiAgICAgICAgeyByYW5nZTogZmFsc2UsIGZ1bGw6IHsgZGVsdGE6IGZhbHNlIH0gfSxcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5UeXBlczogICAgICBbJ25hbWVzcGFjZScsICd0eXBlJywgJ2NsYXNzJywgJ2VudW0nLCAnaW50ZXJmYWNlJywgJ3N0cnVjdCcsICd0eXBlUGFyYW1ldGVyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdwYXJhbWV0ZXInLCAndmFyaWFibGUnLCAncHJvcGVydHknLCAnZW51bU1lbWJlcicsICdldmVudCcsICdmdW5jdGlvbicsICdtZXRob2QnLCAnbWFjcm8nLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2tleXdvcmQnLCAnbW9kaWZpZXInLCAnY29tbWVudCcsICdzdHJpbmcnLCAnbnVtYmVyJywgJ3JlZ2V4cCcsICdvcGVyYXRvcicsICdkZWNvcmF0b3InXSxcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5Nb2RpZmllcnM6ICBbJ2RlY2xhcmF0aW9uJywgJ2RlZmluaXRpb24nLCAncmVhZG9ubHknLCAnc3RhdGljJywgJ2RlcHJlY2F0ZWQnLCAnYWJzdHJhY3QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2FzeW5jJywgJ21vZGlmaWNhdGlvbicsICdkb2N1bWVudGF0aW9uJywgJ2RlZmF1bHRMaWJyYXJ5J10sXG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdHM6ICAgICAgICAgWydyZWxhdGl2ZSddLFxuICAgICAgICAgICAgICAgICAgICBvdmVybGFwcGluZ1Rva2VuU3VwcG9ydDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIG11bHRpbGluZVRva2VuU3VwcG9ydDogICBmYWxzZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGZvcm1hdHRpbmc6ICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICByYW5nZUZvcm1hdHRpbmc6IHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIHJlbmFtZTogICAgICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUsIHByZXBhcmVTdXBwb3J0OiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgY29kZUFjdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjb2RlQWN0aW9uTGl0ZXJhbFN1cHBvcnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVBY3Rpb25LaW5kOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTZXQ6IFsncXVpY2tmaXgnLCAncmVmYWN0b3InLCAncmVmYWN0b3IuZXh0cmFjdCcsICdyZWZhY3Rvci5pbmxpbmUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVmYWN0b3IucmV3cml0ZScsICdzb3VyY2UnLCAnc291cmNlLm9yZ2FuaXplSW1wb3J0cyddLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgaXNQcmVmZXJyZWRTdXBwb3J0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBkYXRhU3VwcG9ydDogICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmVTdXBwb3J0OiAgICAgeyBwcm9wZXJ0aWVzOiBbJ2VkaXQnXSB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcHVibGlzaERpYWdub3N0aWNzOiB7IHJlbGF0ZWRJbmZvcm1hdGlvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdvcmtzcGFjZToge1xuICAgICAgICAgICAgICAgIGFwcGx5RWRpdDogICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbjogICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICBleGVjdXRlQ29tbWFuZDogICAgICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICBkaWRDaGFuZ2VDb25maWd1cmF0aW9uOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICB3b3Jrc3BhY2VFZGl0OiAgICAgICAgICB7IGRvY3VtZW50Q2hhbmdlczogdHJ1ZSwgcmVzb3VyY2VPcGVyYXRpb25zOiBbJ2NyZWF0ZScsICdyZW5hbWUnLCAnZGVsZXRlJ10gfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBfc2VtYW50aWNUb2tlbnNMZWdlbmQgPSBpbml0UmVzdWx0Py5jYXBhYmlsaXRpZXM/LnNlbWFudGljVG9rZW5zUHJvdmlkZXI/LmxlZ2VuZCA/PyBudWxsO1xuXG4gICAgX2Nvbm4uc2VuZE5vdGlmaWNhdGlvbignaW5pdGlhbGl6ZWQnLCB7fSk7XG4gICAgX2Nvbm4uc2VuZE5vdGlmaWNhdGlvbignd29ya3NwYWNlL2RpZENoYW5nZUNvbmZpZ3VyYXRpb24nLCB7IHNldHRpbmdzOiBqZHRsc1NldHRpbmdzKCkgfSk7XG5cbiAgICBvcGVuRmlsZShmaWxlVXJpKTtcblxuICAgIGlmICghX3Byb3ZpZGVyc1JlZ2lzdGVyZWQpIHtcbiAgICAgICAgX3Byb3ZpZGVyc1JlZ2lzdGVyZWQgPSB0cnVlO1xuICAgICAgICByZWdpc3RlclByb3ZpZGVycygpO1xuICAgIH1cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRmlsZSBsaWZlY3ljbGVcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBTZW5kcyB0ZXh0RG9jdW1lbnQvZGlkT3BlbiBmb3IgdGhlIGdpdmVuIFVSSSAoaWYgbm90IGFscmVhZHkgc2VudCkgYW5kIHJlZ2lzdGVycyBhIGRlYm91bmNlZFxuICogdGV4dERvY3VtZW50L2RpZENoYW5nZSBsaXN0ZW5lciBvbiB0aGUgY29ycmVzcG9uZGluZyBNb25hY28gbW9kZWwuXG4gKi9cbmZ1bmN0aW9uIG9wZW5GaWxlKGZpbGVVcmk6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChfb3BlbkZpbGVzLmhhcyhmaWxlVXJpKSB8fCAhX2Nvbm4pIHJldHVybjtcbiAgICBfb3BlbkZpbGVzLmFkZChmaWxlVXJpKTtcblxuICAgIGNvbnN0IG1vZGVsID0gbW9uYWNvLmVkaXRvci5nZXRNb2RlbHMoKS5maW5kKG0gPT4gbS51cmkudG9TdHJpbmcoKSA9PT0gZmlsZVVyaSk7XG4gICAgX2Nvbm4uc2VuZE5vdGlmaWNhdGlvbigndGV4dERvY3VtZW50L2RpZE9wZW4nLCB7XG4gICAgICAgIHRleHREb2N1bWVudDoge1xuICAgICAgICAgICAgdXJpOiAgICAgICAgZmlsZVVyaSxcbiAgICAgICAgICAgIGxhbmd1YWdlSWQ6ICdqYXZhJyxcbiAgICAgICAgICAgIHZlcnNpb246ICAgIDEsXG4gICAgICAgICAgICB0ZXh0OiAgICAgICBtb2RlbD8uZ2V0VmFsdWUoKSA/PyAnJyxcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIGlmIChtb2RlbCkge1xuICAgICAgICBsZXQgdGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+O1xuICAgICAgICBtb2RlbC5vbkRpZENoYW5nZUNvbnRlbnQoKCkgPT4ge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgICAgIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgX2Nvbm4/LnNlbmROb3RpZmljYXRpb24oJ3RleHREb2N1bWVudC9kaWRDaGFuZ2UnLCB7XG4gICAgICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogICB7IHVyaTogZmlsZVVyaSwgdmVyc2lvbjogbW9kZWwuZ2V0VmVyc2lvbklkKCkgfSxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudENoYW5nZXM6IFt7IHRleHQ6IG1vZGVsLmdldFZhbHVlKCkgfV0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LCA0MDApO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFdvcmtzcGFjZSBmaWxlIHByZWRpY2F0ZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFJldHVybnMge0Bjb2RlIHRydWV9IHdoZW4gdGhlIGdpdmVuIG1vZGVsIFVSSSBiZWxvbmdzIHRvIHRoZSBjdXJyZW50bHkgY29ubmVjdGVkIHdvcmtzcGFjZS4gVXNlZFxuICogYnkgTW9uYWNvIHByb3ZpZGVycyB0byBza2lwIG5vbi1KYXZhLXdvcmtzcGFjZSBtb2RlbHMgd2l0aG91dCBhbiBleGFjdC1VUkkgY29tcGFyaXNvbi5cbiAqL1xuZnVuY3Rpb24gaXNXb3Jrc3BhY2VGaWxlKHVyaTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIF93b3Jrc3BhY2VSb290ICE9PSAnJyAmJiB1cmkuc3RhcnRzV2l0aChfd29ya3NwYWNlUm9vdCk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIE1vbmFjbyBwcm92aWRlciByZWdpc3RyYXRpb25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gcmVnaXN0ZXJQcm92aWRlcnMoKTogdm9pZCB7XG5cbiAgICBtb25hY28uZWRpdG9yLnJlZ2lzdGVyQ29tbWFuZChBUFBMWV9BQ1RJT05fQ09NTUFORCwgKF9hY2Nlc3NvcjogdW5rbm93biwgYWN0aW9uOiBDb2RlQWN0aW9uIHwgQ29tbWFuZCkgPT4ge1xuICAgICAgICBhcHBseUNvZGVBY3Rpb24oYWN0aW9uKTtcbiAgICB9KTtcbiAgICBtb25hY28uZWRpdG9yLnJlZ2lzdGVyQ29tbWFuZChOT09QX0NPTU1BTkQsICgpID0+IHsgLyogZGlzcGxheS1vbmx5IENvZGVMZW5zICovIH0pO1xuXG4gICAgLy8gQ3Jvc3MtZmlsZSBuYXZpZ2F0aW9uOiB0aGlzIHNpbmdsZS1maWxlIGVkaXRvciBoYXMgbm8gbW9kZWwgZm9yIG90aGVyIHdvcmtzcGFjZSBmaWxlcywgc28gR28gdG9cbiAgICAvLyBEZWZpbml0aW9uIC8gRmluZCBSZWZlcmVuY2VzIHRvIGFub3RoZXIgZmlsZSB3b3VsZCBzaWxlbnRseSBkbyBub3RoaW5nLiBIYW5kIHRob3NlIG9mZiB0byB0aGUgSURFXG4gICAgLy8gdG8gb3BlbiB0aGUgdGFyZ2V0IGZpbGUgKGFuZCByZXZlYWwgdGhlIGxpbmUpLiBTYW1lLWZpbGUgdGFyZ2V0cyBmYWxsIHRocm91Z2ggdG8gTW9uYWNvLlxuICAgIG1vbmFjby5lZGl0b3IucmVnaXN0ZXJFZGl0b3JPcGVuZXIoe1xuICAgICAgICBvcGVuQ29kZUVkaXRvcjogKHNvdXJjZSwgcmVzb3VyY2UsIHNlbGVjdGlvbk9yUG9zaXRpb24pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHVyaSA9IHJlc291cmNlLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBpZiAoIWlzV29ya3NwYWNlRmlsZSh1cmkpIHx8ICF1cmkuc3RhcnRzV2l0aChWSVJUVUFMX0ZJTEVfUFJFRklYKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudE1vZGVsID0gc291cmNlLmdldE1vZGVsKCk7XG4gICAgICAgICAgICBpZiAoY3VycmVudE1vZGVsICYmIGN1cnJlbnRNb2RlbC51cmkudG9TdHJpbmcoKSA9PT0gdXJpKSByZXR1cm4gZmFsc2U7IC8vIHNhbWUgZmlsZSBcdTIwMTQgbGV0IE1vbmFjbyBqdW1wXG4gICAgICAgICAgICBjb25zdCBvcGVuZXIgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLmphdmFMc3BPcGVuRmlsZTtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3BlbmVyICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBwb3MgPSBzZWxlY3Rpb25PclBvc2l0aW9uIGFzIHsgc3RhcnRMaW5lTnVtYmVyPzogbnVtYmVyOyBsaW5lTnVtYmVyPzogbnVtYmVyOyBzdGFydENvbHVtbj86IG51bWJlcjsgY29sdW1uPzogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBsaW5lID0gcG9zID8gKHBvcy5zdGFydExpbmVOdW1iZXIgPz8gcG9zLmxpbmVOdW1iZXIpIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgY29sdW1uID0gcG9zID8gKHBvcy5zdGFydENvbHVtbiA/PyBwb3MuY29sdW1uKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIG9wZW5lcih1cmkuc3Vic3RyaW5nKFZJUlRVQUxfRklMRV9QUkVGSVgubGVuZ3RoKSwgbGluZSwgY29sdW1uKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckNvbXBsZXRpb25JdGVtUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHRyaWdnZXJDaGFyYWN0ZXJzOiBbJy4nLCAnQCcsICc8J10sXG4gICAgICAgIHByb3ZpZGVDb21wbGV0aW9uSXRlbXM6IGFzeW5jIChtb2RlbCwgcG9zaXRpb24sIGNvbnRleHQpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgZmlsZVVyaSA9IG1vZGVsLnVyaS50b1N0cmluZygpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBDb21wbGV0aW9uTGlzdCB8IENvbXBsZXRpb25JdGVtW10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9jb21wbGV0aW9uJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IGZpbGVVcmkgfSxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogICAgIHsgbGluZTogcG9zaXRpb24ubGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogcG9zaXRpb24uY29sdW1uIC0gMSB9LFxuICAgICAgICAgICAgICAgIC8vIE1vbmFjbyB0cmlnZ2VyIGtpbmRzIGFyZSAwLWJhc2VkIChJbnZva2UvVHJpZ2dlckNoYXJhY3Rlci9Gb3JJbmNvbXBsZXRlKTsgTFNQIGlzIDEtYmFzZWQuXG4gICAgICAgICAgICAgICAgY29udGV4dDogICAgICB7IHRyaWdnZXJLaW5kOiAoY29udGV4dC50cmlnZ2VyS2luZCA/PyAwKSArIDEsIHRyaWdnZXJDaGFyYWN0ZXI6IGNvbnRleHQudHJpZ2dlckNoYXJhY3RlciB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBpdGVtcyA9IEFycmF5LmlzQXJyYXkocmVzdWx0KSA/IHJlc3VsdCA6IChyZXN1bHQ/Lml0ZW1zID8/IFtdKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3VnZ2VzdGlvbnM6IGl0ZW1zLm1hcChpdGVtID0+IGxzcENvbXBsZXRpb25Ub01vbmFjbyhpdGVtLCBtb2RlbCwgcG9zaXRpb24pKSxcbiAgICAgICAgICAgICAgICAvLyBKRFQuTFMgcmV0dXJucyBhIHRydW5jYXRlZCBsaXN0IG9uIHRoZSBmaXJzdCBrZXlzdHJva2VzOyBwcm9wYWdhdGluZyBcImluY29tcGxldGVcIiBtYWtlc1xuICAgICAgICAgICAgICAgIC8vIE1vbmFjbyByZS1xdWVyeSBhcyB0aGUgdXNlciB0eXBlcyBpbnN0ZWFkIG9mIGNhY2hpbmcgdGhlIGZpcnN0IChvZnRlbiBlbXB0eSkgcmVzdWx0LlxuICAgICAgICAgICAgICAgIGluY29tcGxldGU6ICBBcnJheS5pc0FycmF5KHJlc3VsdCkgPyBmYWxzZSA6ICEhcmVzdWx0Py5pc0luY29tcGxldGUsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvLyBSZXNvbHZlIGRvY3VtZW50YXRpb24gYW5kLCBjcnVjaWFsbHksIHRoZSBhdXRvLWltcG9ydCBhZGRpdGlvbmFsVGV4dEVkaXRzIHdoaWNoIEpEVC5MUyBvbmx5XG4gICAgICAgIC8vIGF0dGFjaGVzIG9uIHJlc29sdmUgXHUyMDE0IHNlbGVjdGluZyBhIHR5cGUgdGhlbiBpbnNlcnRzIGl0cyBpbXBvcnQgc3RhdGVtZW50LlxuICAgICAgICByZXNvbHZlQ29tcGxldGlvbkl0ZW06IGFzeW5jIChpdGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsc3AgPSAoaXRlbSBhcyBNb25hY29Db21wbGV0aW9uSXRlbSkuX2xzcDtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWxzcCkgcmV0dXJuIGl0ZW07XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkOiBDb21wbGV0aW9uSXRlbSA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCdjb21wbGV0aW9uSXRlbS9yZXNvbHZlJywgbHNwKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQuZG9jdW1lbnRhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBpdGVtLmRvY3VtZW50YXRpb24gPSB7IHZhbHVlOiBtYXJrdXBUb1N0cmluZyhyZXNvbHZlZC5kb2N1bWVudGF0aW9uKSwgaXNUcnVzdGVkOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQuZGV0YWlsKSBpdGVtLmRldGFpbCA9IHJlc29sdmVkLmRldGFpbDtcbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQuYWRkaXRpb25hbFRleHRFZGl0cz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uYWRkaXRpb25hbFRleHRFZGl0cyA9IHJlc29sdmVkLmFkZGl0aW9uYWxUZXh0RWRpdHMubWFwKHRleHRFZGl0VG9Nb25hY28pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKCdbamF2YS1sc3BdIGNvbXBsZXRpb24gcmVzb2x2ZSBmYWlsZWQ6JywgKGUgYXMgRXJyb3IpPy5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckhvdmVyUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVIb3ZlcjogYXN5bmMgKG1vZGVsLCBwb3NpdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBmaWxlVXJpID0gbW9kZWwudXJpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IEhvdmVyIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvaG92ZXInLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogZmlsZVVyaSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0Py5jb250ZW50cykgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50cyA9IEFycmF5LmlzQXJyYXkocmVzdWx0LmNvbnRlbnRzKSA/IHJlc3VsdC5jb250ZW50cyA6IFtyZXN1bHQuY29udGVudHNdO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjb250ZW50czogY29udGVudHMubWFwKGMgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHR5cGVvZiBjID09PSAnc3RyaW5nJyA/IGMgOiAoYyBhcyBNYXJrdXBDb250ZW50KS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgaXNUcnVzdGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgcmFuZ2U6IHJlc3VsdC5yYW5nZSA/IGxzcFJhbmdlVG9Nb25hY28ocmVzdWx0LnJhbmdlKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyU2lnbmF0dXJlSGVscFByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBzaWduYXR1cmVIZWxwVHJpZ2dlckNoYXJhY3RlcnM6IFsnKCcsICcsJ10sXG4gICAgICAgIHByb3ZpZGVTaWduYXR1cmVIZWxwOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVVcmkgPSBtb2RlbC51cmkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogU2lnbmF0dXJlSGVscCB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L3NpZ25hdHVyZUhlbHAnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogZmlsZVVyaSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlczogcmVzdWx0LnNpZ25hdHVyZXMubWFwKChzaWc6IFNpZ25hdHVyZUluZm9ybWF0aW9uKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICAgICAgICAgc2lnLmxhYmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRhdGlvbjogc2lnLmRvY3VtZW50YXRpb24gPyBtYXJrdXBUb1N0cmluZyhzaWcuZG9jdW1lbnRhdGlvbikgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiAgICAoc2lnLnBhcmFtZXRlcnMgPz8gW10pLm1hcCgocDogUGFyYW1ldGVySW5mb3JtYXRpb24pID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICAgICAgICAgcC5sYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudGF0aW9uOiBwLmRvY3VtZW50YXRpb24gPyBtYXJrdXBUb1N0cmluZyhwLmRvY3VtZW50YXRpb24pIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZVNpZ25hdHVyZTogcmVzdWx0LmFjdGl2ZVNpZ25hdHVyZSA/PyAwLFxuICAgICAgICAgICAgICAgICAgICBhY3RpdmVQYXJhbWV0ZXI6IHJlc3VsdC5hY3RpdmVQYXJhbWV0ZXIgPz8gMCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGRpc3Bvc2U6ICgpID0+IHt9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJEZWZpbml0aW9uUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVEZWZpbml0aW9uOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVVcmkgPSBtb2RlbC51cmkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogTG9jYXRpb24gfCBMb2NhdGlvbltdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvZGVmaW5pdGlvbicsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBmaWxlVXJpIH0sXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgbG9jYXRpb25zID0gQXJyYXkuaXNBcnJheShyZXN1bHQpID8gcmVzdWx0IDogW3Jlc3VsdF07XG4gICAgICAgICAgICByZXR1cm4gbG9jYXRpb25zLm1hcChsb2MgPT4gKHtcbiAgICAgICAgICAgICAgICB1cmk6ICAgbW9uYWNvLlVyaS5wYXJzZShsb2MudXJpKSxcbiAgICAgICAgICAgICAgICByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhsb2MucmFuZ2UpLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlclJlZmVyZW5jZVByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlUmVmZXJlbmNlczogYXN5bmMgKG1vZGVsLCBwb3NpdGlvbiwgY29udGV4dCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IExvY2F0aW9uW10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9yZWZlcmVuY2VzJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgICAgICBjb250ZXh0OiAgICAgIHsgaW5jbHVkZURlY2xhcmF0aW9uOiBjb250ZXh0LmluY2x1ZGVEZWNsYXJhdGlvbiB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0Lm1hcChsb2MgPT4gKHsgdXJpOiBtb25hY28uVXJpLnBhcnNlKGxvYy51cmkpLCByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhsb2MucmFuZ2UpIH0pKTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJSZW5hbWVQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZVJlbmFtZUVkaXRzOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uLCBuZXdOYW1lKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4geyBlZGl0czogW10gfTtcbiAgICAgICAgICAgIGNvbnN0IGVkaXQ6IFdvcmtzcGFjZUVkaXQgfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9yZW5hbWUnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogICAgIHsgbGluZTogcG9zaXRpb24ubGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogcG9zaXRpb24uY29sdW1uIC0gMSB9LFxuICAgICAgICAgICAgICAgIG5ld05hbWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghZWRpdCkgcmV0dXJuIHsgZWRpdHM6IFtdIH07XG4gICAgICAgICAgICAvLyBBIEpEVC5MUyByZW5hbWUgY2FuIHNwYW4gbWFueSBmaWxlcyBhbmQgZXZlbiByZW5hbWUgdGhlIHR5cGUncyBvd24gLmphdmEgZmlsZS4gTW9uYWNvJ3NcbiAgICAgICAgICAgIC8vIHNpbmdsZS1maWxlIGVkaXRvciB3b3VsZCBkcm9wIGV2ZXJ5dGhpbmcgYnV0IHRoZSBjdXJyZW50IG1vZGVsLCBzbyBhcHBseSB0aGUgd2hvbGUgZWRpdFxuICAgICAgICAgICAgLy8gdGhyb3VnaCB0aGUgd29ya3NwYWNlIG91cnNlbHZlcyB3aGVuIHRoZSBJREUgcGVyc2lzdGVuY2UgaG9vayBpcyBhdmFpbGFibGUuXG4gICAgICAgICAgICBpZiAodHlwZW9mIChnbG9iYWxUaGlzIGFzIGFueSkuamF2YUxzcFBlcnNpc3RSZW5hbWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBhcHBseVJlbmFtZUFjcm9zc1dvcmtzcGFjZShtb2RlbCwgZWRpdCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGVkaXRzOiBbXSB9O1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignW2phdmEtbHNwXSBjcm9zcy1maWxlIHJlbmFtZSBmYWlsZWQsIGFwcGx5aW5nIHRvIHRoZSBjdXJyZW50IGZpbGUgb25seTonLCBlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdvcmtzcGFjZUVkaXRUb01vbmFjbyhlZGl0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gd29ya3NwYWNlRWRpdFRvTW9uYWNvKGVkaXQpO1xuICAgICAgICB9LFxuICAgICAgICByZXNvbHZlUmVuYW1lTG9jYXRpb246IGFzeW5jIChtb2RlbCwgcG9zaXRpb24pID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQ6IHsgcmFuZ2U6IExzcFJhbmdlOyBwbGFjZWhvbGRlcj86IHN0cmluZyB9IHwgTHNwUmFuZ2UgfCBudWxsID1cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9wcmVwYXJlUmVuYW1lJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCByYW5nZSA9ICdyYW5nZScgaW4gcmVzdWx0ID8gcmVzdWx0LnJhbmdlIDogcmVzdWx0O1xuICAgICAgICAgICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gJ3BsYWNlaG9sZGVyJyBpbiByZXN1bHQgJiYgcmVzdWx0LnBsYWNlaG9sZGVyXG4gICAgICAgICAgICAgICAgICAgID8gcmVzdWx0LnBsYWNlaG9sZGVyXG4gICAgICAgICAgICAgICAgICAgIDogbW9kZWwuZ2V0V29yZEF0UG9zaXRpb24ocG9zaXRpb24pPy53b3JkID8/ICcnO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHJhbmdlOiBsc3BSYW5nZVRvTW9uYWNvKHJhbmdlKSwgdGV4dDogcGxhY2Vob2xkZXIgfTtcbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgIGNvbnN0IHdvcmQgPSBtb2RlbC5nZXRXb3JkQXRQb3NpdGlvbihwb3NpdGlvbik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdvcmQgPyB7XG4gICAgICAgICAgICAgICAgICAgIHJhbmdlOiB7IHN0YXJ0TGluZU51bWJlcjogcG9zaXRpb24ubGluZU51bWJlciwgc3RhcnRDb2x1bW46IHdvcmQuc3RhcnRDb2x1bW4sIGVuZExpbmVOdW1iZXI6IHBvc2l0aW9uLmxpbmVOdW1iZXIsIGVuZENvbHVtbjogd29yZC5lbmRDb2x1bW4gfSxcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogd29yZC53b3JkLFxuICAgICAgICAgICAgICAgIH0gOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gUmVnaXN0ZXJpbmcgdGhpcyBwcm92aWRlciBhbHNvIGVuYWJsZXMgZWRpdG9yLmpzJ3MgZXhpc3RpbmcgZm9ybWF0LW9uLXNhdmUgcGF0aCBmb3IgSmF2YTogdGhlXG4gICAgLy8gc2hhcmVkIFNhdmUgYWN0aW9uIHJ1bnMgZWRpdG9yLmFjdGlvbi5mb3JtYXREb2N1bWVudCB3aGVuIGF1dG8tZm9ybWF0dGluZyBpcyBvbiAodGhlIHNhbWVcbiAgICAvLyBtZWNoYW5pc20gYW5kIGdsb2JhbCB0b2dnbGUgdXNlZCBmb3IgVHlwZVNjcmlwdCkuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckRvY3VtZW50Rm9ybWF0dGluZ0VkaXRQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZURvY3VtZW50Rm9ybWF0dGluZ0VkaXRzOiBhc3luYyAobW9kZWwpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgZWRpdHM6IFRleHRFZGl0W10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9mb3JtYXR0aW5nJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICAgICAgb3B0aW9uczogICAgICB7IHRhYlNpemU6IG1vZGVsLmdldE9wdGlvbnMoKS50YWJTaXplLCBpbnNlcnRTcGFjZXM6IG1vZGVsLmdldE9wdGlvbnMoKS5pbnNlcnRTcGFjZXMgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGVkaXRzID8gZWRpdHMubWFwKHRleHRFZGl0VG9Nb25hY28pIDogbnVsbDtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJDb2RlQWN0aW9uUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVDb2RlQWN0aW9uczogYXN5bmMgKG1vZGVsLCByYW5nZSwgY29udGV4dCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZW1wdHkgPSB7IGFjdGlvbnM6IFtdLCBkaXNwb3NlKCkgeyAvKiBub3RoaW5nIHRvIGRpc3Bvc2UgKi8gfSB9O1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIGVtcHR5O1xuICAgICAgICAgICAgY29uc3QgZGlhZ25vc3RpY3MgPSAoY29udGV4dC5tYXJrZXJzID8/IFtdKS5tYXAobWFya2VyVG9Mc3BEaWFnbm9zdGljKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogQXJyYXk8Q29kZUFjdGlvbiB8IENvbW1hbmQ+IHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvY29kZUFjdGlvbicsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgIHJhbmdlOiAgICAgICAgbW9uYWNvUmFuZ2VUb0xzcChyYW5nZSksXG4gICAgICAgICAgICAgICAgY29udGV4dDogICAgICB7IGRpYWdub3N0aWNzLCBvbmx5OiBjb250ZXh0Lm9ubHkgPyBbY29udGV4dC5vbmx5XSA6IHVuZGVmaW5lZCB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdD8ubGVuZ3RoKSByZXR1cm4gZW1wdHk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGFjdGlvbnM6IHJlc3VsdC5tYXAobHNwQ29kZUFjdGlvblRvTW9uYWNvKSxcbiAgICAgICAgICAgICAgICBkaXNwb3NlKCkgeyAvKiBub3RoaW5nIHRvIGRpc3Bvc2UgKi8gfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgfSwge1xuICAgICAgICBwcm92aWRlZENvZGVBY3Rpb25LaW5kczogWydxdWlja2ZpeCcsICdyZWZhY3RvcicsICdyZWZhY3Rvci5leHRyYWN0JywgJ3JlZmFjdG9yLmlubGluZScsXG4gICAgICAgICAgICAncmVmYWN0b3IucmV3cml0ZScsICdzb3VyY2UnLCAnc291cmNlLm9yZ2FuaXplSW1wb3J0cyddLFxuICAgIH0pO1xuXG4gICAgLy8gLS0tIE5hdmlnYXRpb24gJiBzdHJ1Y3R1cmUgKFBhY2sgMSkgLS0tXG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVySW1wbGVtZW50YXRpb25Qcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZUltcGxlbWVudGF0aW9uOiAobW9kZWwsIHBvc2l0aW9uKSA9PiByZXF1ZXN0TG9jYXRpb25zKCd0ZXh0RG9jdW1lbnQvaW1wbGVtZW50YXRpb24nLCBtb2RlbCwgcG9zaXRpb24pLFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlclR5cGVEZWZpbml0aW9uUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVUeXBlRGVmaW5pdGlvbjogKG1vZGVsLCBwb3NpdGlvbikgPT4gcmVxdWVzdExvY2F0aW9ucygndGV4dERvY3VtZW50L3R5cGVEZWZpbml0aW9uJywgbW9kZWwsIHBvc2l0aW9uKSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJEb2N1bWVudEhpZ2hsaWdodFByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlRG9jdW1lbnRIaWdobGlnaHRzOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55W10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9kb2N1bWVudEhpZ2hsaWdodCcsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQubWFwKGggPT4gKHsgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28oaC5yYW5nZSksIGtpbmQ6IGgua2luZCA/IGgua2luZCAtIDEgOiB1bmRlZmluZWQgfSkpO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckRvY3VtZW50U3ltYm9sUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVEb2N1bWVudFN5bWJvbHM6IGFzeW5jIChtb2RlbCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IGFueVtdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvZG9jdW1lbnRTeW1ib2wnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCA/IG1hcERvY3VtZW50U3ltYm9scyhyZXN1bHQpIDogbnVsbDtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJGb2xkaW5nUmFuZ2VQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZUZvbGRpbmdSYW5nZXM6IGFzeW5jIChtb2RlbCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IGFueVtdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvZm9sZGluZ1JhbmdlJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQubWFwKHIgPT4gKHsgc3RhcnQ6IHIuc3RhcnRMaW5lICsgMSwgZW5kOiByLmVuZExpbmUgKyAxLCBraW5kOiBmb2xkaW5nS2luZChyLmtpbmQpIH0pKTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJTZWxlY3Rpb25SYW5nZVByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlU2VsZWN0aW9uUmFuZ2VzOiBhc3luYyAobW9kZWwsIHBvc2l0aW9ucykgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IGFueVtdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvc2VsZWN0aW9uUmFuZ2UnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbnM6ICAgIHBvc2l0aW9ucy5tYXAocCA9PiAoeyBsaW5lOiBwLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHAuY29sdW1uIC0gMSB9KSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQubWFwKGZsYXR0ZW5TZWxlY3Rpb25SYW5nZSk7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyRG9jdW1lbnRSYW5nZUZvcm1hdHRpbmdFZGl0UHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVEb2N1bWVudFJhbmdlRm9ybWF0dGluZ0VkaXRzOiBhc3luYyAobW9kZWwsIHJhbmdlKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGVkaXRzOiBUZXh0RWRpdFtdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvcmFuZ2VGb3JtYXR0aW5nJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICAgICAgcmFuZ2U6ICAgICAgICBtb25hY29SYW5nZVRvTHNwKHJhbmdlKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiAgICAgIHsgdGFiU2l6ZTogbW9kZWwuZ2V0T3B0aW9ucygpLnRhYlNpemUsIGluc2VydFNwYWNlczogbW9kZWwuZ2V0T3B0aW9ucygpLmluc2VydFNwYWNlcyB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gZWRpdHMgPyBlZGl0cy5tYXAodGV4dEVkaXRUb01vbmFjbykgOiBudWxsO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gLS0tIElubGF5IGhpbnRzICsgc2VtYW50aWMgaGlnaGxpZ2h0aW5nIChQYWNrIDIpIC0tLVxuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlcklubGF5SGludHNQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZUlubGF5SGludHM6IGFzeW5jIChtb2RlbCwgcmFuZ2UpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBhbnlbXSB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L2lubGF5SGludCcsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgIHJhbmdlOiAgICAgICAgbW9uYWNvUmFuZ2VUb0xzcChyYW5nZSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaGludHM6IHJlc3VsdC5tYXAoaCA9PiAoe1xuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogICAgIHsgbGluZU51bWJlcjogaC5wb3NpdGlvbi5saW5lICsgMSwgY29sdW1uOiBoLnBvc2l0aW9uLmNoYXJhY3RlciArIDEgfSxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICAgICAgICB0eXBlb2YgaC5sYWJlbCA9PT0gJ3N0cmluZycgPyBoLmxhYmVsIDogKGgubGFiZWwgPz8gW10pLm1hcCgocDogYW55KSA9PiAoeyBsYWJlbDogcC52YWx1ZSB9KSksXG4gICAgICAgICAgICAgICAgICAgIGtpbmQ6ICAgICAgICAgaC5raW5kLFxuICAgICAgICAgICAgICAgICAgICBwYWRkaW5nTGVmdDogIGgucGFkZGluZ0xlZnQsXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmdSaWdodDogaC5wYWRkaW5nUmlnaHQsXG4gICAgICAgICAgICAgICAgICAgIHRvb2x0aXA6ICAgICAgaC50b29sdGlwID8gbWFya3VwVG9TdHJpbmcoaC50b29sdGlwKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgZGlzcG9zZSgpIHsgLyogbm90aGluZyB0byBkaXNwb3NlICovIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckRvY3VtZW50U2VtYW50aWNUb2tlbnNQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgZ2V0TGVnZW5kOiAoKSA9PiBfc2VtYW50aWNUb2tlbnNMZWdlbmQgPz8geyB0b2tlblR5cGVzOiBbXSwgdG9rZW5Nb2RpZmllcnM6IFtdIH0sXG4gICAgICAgIHByb3ZpZGVEb2N1bWVudFNlbWFudGljVG9rZW5zOiBhc3luYyAobW9kZWwpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkgfHwgIV9zZW1hbnRpY1Rva2Vuc0xlZ2VuZCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IHsgZGF0YTogbnVtYmVyW107IHJlc3VsdElkPzogc3RyaW5nIH0gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9zZW1hbnRpY1Rva2Vucy9mdWxsJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0Py5kYXRhKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IG5ldyBVaW50MzJBcnJheShyZXN1bHQuZGF0YSksIHJlc3VsdElkOiByZXN1bHQucmVzdWx0SWQgfTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVsZWFzZURvY3VtZW50U2VtYW50aWNUb2tlbnM6ICgpID0+IHsgLyogbm90aGluZyB0byByZWxlYXNlICovIH0sXG4gICAgfSk7XG5cbiAgICAvLyAtLS0gQ29kZUxlbnMgKFBhY2sgMykgLS0tXG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyQ29kZUxlbnNQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZUNvZGVMZW5zZXM6IGFzeW5jIChtb2RlbCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIHsgbGVuc2VzOiBbXSwgZGlzcG9zZSgpIHsgLyogKi8gfSB9O1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBhbnlbXSB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L2NvZGVMZW5zJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGxlbnNlcyA9IChyZXN1bHQgPz8gW10pLm1hcCgobGVucywgaSkgPT4gKHtcbiAgICAgICAgICAgICAgICByYW5nZTogICAgbHNwUmFuZ2VUb01vbmFjbyhsZW5zLnJhbmdlKSxcbiAgICAgICAgICAgICAgICBpZDogICAgICAgU3RyaW5nKGkpLFxuICAgICAgICAgICAgICAgIGNvbW1hbmQ6ICBsZW5zLmNvbW1hbmQgPyBtYXBMZW5zQ29tbWFuZChsZW5zLmNvbW1hbmQpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIF9sc3A6ICAgICBsZW5zLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgcmV0dXJuIHsgbGVuc2VzLCBkaXNwb3NlKCkgeyAvKiAqLyB9IH07XG4gICAgICAgIH0sXG4gICAgICAgIHJlc29sdmVDb2RlTGVuczogYXN5bmMgKF9tb2RlbCwgY29kZUxlbnMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxzcCA9IChjb2RlTGVucyBhcyBhbnkpLl9sc3A7XG4gICAgICAgICAgICBpZiAoX2Nvbm4gJiYgbHNwICYmICFsc3AuY29tbWFuZCkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkOiBhbnkgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgnY29kZUxlbnMvcmVzb2x2ZScsIGxzcCk7XG4gICAgICAgICAgICAgICAgICAgIGNvZGVMZW5zLmNvbW1hbmQgPSByZXNvbHZlZD8uY29tbWFuZCA/IG1hcExlbnNDb21tYW5kKHJlc29sdmVkLmNvbW1hbmQpIDogeyBpZDogTk9PUF9DT01NQU5ELCB0aXRsZTogJycgfTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZUxlbnMuY29tbWFuZCA9IHsgaWQ6IE5PT1BfQ09NTUFORCwgdGl0bGU6ICcnIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvZGVMZW5zO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gLS0tIEphdmEga2V5d29yZCBjb21wbGV0aW9uIChQYWNrIDFiKTogYWx3YXlzLWF2YWlsYWJsZSwgcmFua2VkIGJlbG93IFNESy9MU1AgcmVzdWx0cyAtLS1cblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJDb21wbGV0aW9uSXRlbVByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlQ29tcGxldGlvbkl0ZW1zOiAobW9kZWwsIHBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3Qgd29yZCA9IG1vZGVsLmdldFdvcmRVbnRpbFBvc2l0aW9uKHBvc2l0aW9uKTtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlOiBtb25hY28uSVJhbmdlID0ge1xuICAgICAgICAgICAgICAgIHN0YXJ0TGluZU51bWJlcjogcG9zaXRpb24ubGluZU51bWJlciwgc3RhcnRDb2x1bW46IHdvcmQuc3RhcnRDb2x1bW4sXG4gICAgICAgICAgICAgICAgZW5kTGluZU51bWJlcjogICBwb3NpdGlvbi5saW5lTnVtYmVyLCBlbmRDb2x1bW46ICAgd29yZC5lbmRDb2x1bW4sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBzdWdnZXN0aW9uczogSkFWQV9LRVlXT1JEUy5tYXAoa2V5d29yZCA9PiAoe1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogICAgICBrZXl3b3JkLFxuICAgICAgICAgICAgICAgICAgICBraW5kOiAgICAgICBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtS2luZC5LZXl3b3JkLFxuICAgICAgICAgICAgICAgICAgICBpbnNlcnRUZXh0OiBrZXl3b3JkLFxuICAgICAgICAgICAgICAgICAgICByYW5nZSxcbiAgICAgICAgICAgICAgICAgICAgc29ydFRleHQ6ICAgYDlfJHtrZXl3b3JkfWAsXG4gICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICB9KTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gSGVscGVyc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiBsc3BTZXZlcml0eShzZXZlcml0eTogRGlhZ25vc3RpY1NldmVyaXR5IHwgdW5kZWZpbmVkKTogbW9uYWNvLk1hcmtlclNldmVyaXR5IHtcbiAgICBzd2l0Y2ggKHNldmVyaXR5KSB7XG4gICAgICAgIGNhc2UgRGlhZ25vc3RpY1NldmVyaXR5LkVycm9yOiAgICAgICByZXR1cm4gbW9uYWNvLk1hcmtlclNldmVyaXR5LkVycm9yO1xuICAgICAgICBjYXNlIERpYWdub3N0aWNTZXZlcml0eS5XYXJuaW5nOiAgICAgcmV0dXJuIG1vbmFjby5NYXJrZXJTZXZlcml0eS5XYXJuaW5nO1xuICAgICAgICBjYXNlIERpYWdub3N0aWNTZXZlcml0eS5JbmZvcm1hdGlvbjogcmV0dXJuIG1vbmFjby5NYXJrZXJTZXZlcml0eS5JbmZvO1xuICAgICAgICBjYXNlIERpYWdub3N0aWNTZXZlcml0eS5IaW50OiAgICAgICAgcmV0dXJuIG1vbmFjby5NYXJrZXJTZXZlcml0eS5IaW50O1xuICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vbmFjby5NYXJrZXJTZXZlcml0eS5FcnJvcjtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGxzcFJhbmdlVG9Nb25hY28ocjogeyBzdGFydDogeyBsaW5lOiBudW1iZXI7IGNoYXJhY3RlcjogbnVtYmVyIH07IGVuZDogeyBsaW5lOiBudW1iZXI7IGNoYXJhY3RlcjogbnVtYmVyIH0gfSk6IG1vbmFjby5JUmFuZ2Uge1xuICAgIHJldHVybiB7XG4gICAgICAgIHN0YXJ0TGluZU51bWJlcjogci5zdGFydC5saW5lICsgMSxcbiAgICAgICAgc3RhcnRDb2x1bW46ICAgICByLnN0YXJ0LmNoYXJhY3RlciArIDEsXG4gICAgICAgIGVuZExpbmVOdW1iZXI6ICAgci5lbmQubGluZSArIDEsXG4gICAgICAgIGVuZENvbHVtbjogICAgICAgci5lbmQuY2hhcmFjdGVyICsgMSxcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBtYXJrdXBUb1N0cmluZyhjOiBzdHJpbmcgfCBNYXJrdXBDb250ZW50KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdHlwZW9mIGMgPT09ICdzdHJpbmcnID8gYyA6IGMudmFsdWU7XG59XG5cbmZ1bmN0aW9uIGxzcENvbXBsZXRpb25LaW5kKGtpbmQ6IENvbXBsZXRpb25JdGVtS2luZCB8IHVuZGVmaW5lZCk6IG1vbmFjby5sYW5ndWFnZXMuQ29tcGxldGlvbkl0ZW1LaW5kIHtcbiAgICBjb25zdCBLID0gbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbUtpbmQ7XG4gICAgc3dpdGNoIChraW5kKSB7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLlRleHQ6ICAgICAgICAgIHJldHVybiBLLlRleHQ7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLk1ldGhvZDogICAgICAgIHJldHVybiBLLk1ldGhvZDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuRnVuY3Rpb246ICAgICAgcmV0dXJuIEsuRnVuY3Rpb247XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLkNvbnN0cnVjdG9yOiAgIHJldHVybiBLLkNvbnN0cnVjdG9yO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5GaWVsZDogICAgICAgICByZXR1cm4gSy5GaWVsZDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuVmFyaWFibGU6ICAgICAgcmV0dXJuIEsuVmFyaWFibGU7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLkNsYXNzOiAgICAgICAgIHJldHVybiBLLkNsYXNzO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5JbnRlcmZhY2U6ICAgICByZXR1cm4gSy5JbnRlcmZhY2U7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLk1vZHVsZTogICAgICAgIHJldHVybiBLLk1vZHVsZTtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuUHJvcGVydHk6ICAgICAgcmV0dXJuIEsuUHJvcGVydHk7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLktleXdvcmQ6ICAgICAgIHJldHVybiBLLktleXdvcmQ7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLlNuaXBwZXQ6ICAgICAgIHJldHVybiBLLlNuaXBwZXQ7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLkNvbnN0YW50OiAgICAgIHJldHVybiBLLkNvbnN0YW50O1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5TdHJ1Y3Q6ICAgICAgICByZXR1cm4gSy5TdHJ1Y3Q7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLlR5cGVQYXJhbWV0ZXI6IHJldHVybiBLLlR5cGVQYXJhbWV0ZXI7XG4gICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBLLlRleHQ7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBsc3BDb21wbGV0aW9uVG9Nb25hY28oXG4gICAgaXRlbTogQ29tcGxldGlvbkl0ZW0sXG4gICAgbW9kZWw6IG1vbmFjby5lZGl0b3IuSVRleHRNb2RlbCxcbiAgICBwb3NpdGlvbjogbW9uYWNvLlBvc2l0aW9uLFxuKTogTW9uYWNvQ29tcGxldGlvbkl0ZW0ge1xuICAgIGNvbnN0IHdvcmQgPSBtb2RlbC5nZXRXb3JkVW50aWxQb3NpdGlvbihwb3NpdGlvbik7XG4gICAgbGV0IHJhbmdlOiBtb25hY28uSVJhbmdlID0ge1xuICAgICAgICBzdGFydExpbmVOdW1iZXI6IHBvc2l0aW9uLmxpbmVOdW1iZXIsXG4gICAgICAgIHN0YXJ0Q29sdW1uOiAgICAgd29yZC5zdGFydENvbHVtbixcbiAgICAgICAgZW5kTGluZU51bWJlcjogICBwb3NpdGlvbi5saW5lTnVtYmVyLFxuICAgICAgICBlbmRDb2x1bW46ICAgICAgIHdvcmQuZW5kQ29sdW1uLFxuICAgIH07XG4gICAgbGV0IGluc2VydFRleHQgPSBpdGVtLmluc2VydFRleHQgPz8gaXRlbS5sYWJlbDtcbiAgICBjb25zdCB0ZXh0RWRpdCA9IGl0ZW0udGV4dEVkaXQgYXMgeyByYW5nZT86IExzcFJhbmdlOyByZXBsYWNlPzogTHNwUmFuZ2U7IGluc2VydD86IExzcFJhbmdlOyBuZXdUZXh0Pzogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG4gICAgaWYgKHRleHRFZGl0KSB7XG4gICAgICAgIGNvbnN0IHIgPSB0ZXh0RWRpdC5yYW5nZSA/PyB0ZXh0RWRpdC5yZXBsYWNlID8/IHRleHRFZGl0Lmluc2VydDtcbiAgICAgICAgaWYgKHIpIHJhbmdlID0gbHNwUmFuZ2VUb01vbmFjbyhyKTtcbiAgICAgICAgaWYgKHR5cGVvZiB0ZXh0RWRpdC5uZXdUZXh0ID09PSAnc3RyaW5nJykgaW5zZXJ0VGV4dCA9IHRleHRFZGl0Lm5ld1RleHQ7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdDogTW9uYWNvQ29tcGxldGlvbkl0ZW0gPSB7XG4gICAgICAgIGxhYmVsOiAgICAgICAgICAgaXRlbS5sYWJlbCxcbiAgICAgICAga2luZDogICAgICAgICAgICBsc3BDb21wbGV0aW9uS2luZChpdGVtLmtpbmQpLFxuICAgICAgICBkZXRhaWw6ICAgICAgICAgIGl0ZW0uZGV0YWlsLFxuICAgICAgICBkb2N1bWVudGF0aW9uOiAgIGl0ZW0uZG9jdW1lbnRhdGlvbiA/IHsgdmFsdWU6IG1hcmt1cFRvU3RyaW5nKGl0ZW0uZG9jdW1lbnRhdGlvbiksIGlzVHJ1c3RlZDogZmFsc2UgfSA6IHVuZGVmaW5lZCxcbiAgICAgICAgaW5zZXJ0VGV4dCxcbiAgICAgICAgaW5zZXJ0VGV4dFJ1bGVzOiBpdGVtLmluc2VydFRleHRGb3JtYXQgPT09IEluc2VydFRleHRGb3JtYXQuU25pcHBldFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG1vbmFjby5sYW5ndWFnZXMuQ29tcGxldGlvbkl0ZW1JbnNlcnRUZXh0UnVsZS5JbnNlcnRBc1NuaXBwZXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIHJhbmdlLFxuICAgICAgICBzb3J0VGV4dDogICAgICAgICAgICBzZGtQcmlvcml0aXNlZFNvcnRUZXh0KGl0ZW0pLFxuICAgICAgICBmaWx0ZXJUZXh0OiAgICAgICAgICBpdGVtLmZpbHRlclRleHQsXG4gICAgICAgIHByZXNlbGVjdDogICAgICAgICAgIGl0ZW0ucHJlc2VsZWN0LFxuICAgICAgICBjb21taXRDaGFyYWN0ZXJzOiAgICBpdGVtLmNvbW1pdENoYXJhY3RlcnMsXG4gICAgICAgIGFkZGl0aW9uYWxUZXh0RWRpdHM6IGl0ZW0uYWRkaXRpb25hbFRleHRFZGl0cz8ubWFwKHRleHRFZGl0VG9Nb25hY28pLFxuICAgIH07XG4gICAgcmVzdWx0Ll9sc3AgPSBpdGVtO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogUmFua3MgRGlyaWdpYmxlIFNESyBzdWdnZXN0aW9ucyAoe0Bjb2RlIG9yZy5lY2xpcHNlLmRpcmlnaWJsZS5zZGsuKn0pIGFib3ZlIGV2ZXJ5dGhpbmcgZWxzZSBieVxuICogcHJlZml4aW5nIHRoZSBzZXJ2ZXIgc29ydFRleHQgd2l0aCBhIHByaW9yaXR5IGJ1Y2tldCwgcHJlc2VydmluZyB0aGUgc2VydmVyIG9yZGVyIHdpdGhpbiBlYWNoIGJ1Y2tldC5cbiAqL1xuZnVuY3Rpb24gc2RrUHJpb3JpdGlzZWRTb3J0VGV4dChpdGVtOiBDb21wbGV0aW9uSXRlbSk6IHN0cmluZyB7XG4gICAgY29uc3QgYmFzZSA9IGl0ZW0uc29ydFRleHQgPz8gKHR5cGVvZiBpdGVtLmxhYmVsID09PSAnc3RyaW5nJyA/IGl0ZW0ubGFiZWwgOiAnJyk7XG4gICAgY29uc3QgZGVzY3JpcHRpb24gPSAoaXRlbS5sYWJlbERldGFpbHMgJiYgdHlwZW9mIGl0ZW0ubGFiZWxEZXRhaWxzLmRlc2NyaXB0aW9uID09PSAnc3RyaW5nJylcbiAgICAgICAgPyBpdGVtLmxhYmVsRGV0YWlscy5kZXNjcmlwdGlvbiA6ICcnO1xuICAgIGNvbnN0IGhheXN0YWNrID0gYCR7aXRlbS5kZXRhaWwgPz8gJyd9ICR7ZGVzY3JpcHRpb259YDtcbiAgICByZXR1cm4gaGF5c3RhY2suaW5jbHVkZXMoJ29yZy5lY2xpcHNlLmRpcmlnaWJsZS5zZGsnKSA/IGAwXyR7YmFzZX1gIDogYDFfJHtiYXNlfWA7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENvZGUgYWN0aW9ucywgY29tbWFuZHMsIHJlZmFjdG9yL2dlbmVyYXRlLCB3b3Jrc3BhY2UgZWRpdHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIE1vbmFjbyBjb21tYW5kIGlkIHVzZWQgdG8gYXBwbHkgYSBkZWZlcnJlZCBMU1AgY29kZSBhY3Rpb24gd2hlbiB0aGUgdXNlciBzZWxlY3RzIGl0LiAqL1xuY29uc3QgQVBQTFlfQUNUSU9OX0NPTU1BTkQgPSAnZGlyaWdpYmxlLmphdmEuYXBwbHlDb2RlQWN0aW9uJztcblxuLyoqIFZpcnR1YWwgVVJJIHByZWZpeCBvZiBlZGl0b3IgbW9kZWxzOyBzdHJpcHBpbmcgaXQgeWllbGRzIHRoZSBJREUgd29ya3NwYWNlIHBhdGggKC93cy9wcm9qLy4uLikuICovXG5jb25zdCBWSVJUVUFMX0ZJTEVfUFJFRklYID0gJ2ZpbGU6Ly8vd29ya3NwYWNlJztcblxuLyoqIE1vbmFjbyBjb21tYW5kIGlkIHVzZWQgZm9yIGRpc3BsYXktb25seSBDb2RlTGVuc2VzIChlLmcuIGEgcmVmZXJlbmNlIGNvdW50IHdpdGggbm8gcmVzb2x2ZWQgYWN0aW9uKS4gKi9cbmNvbnN0IE5PT1BfQ09NTUFORCA9ICdkaXJpZ2libGUuamF2YS5ub29wTGVucyc7XG5cbi8qKiBKYXZhIFNFIGtleXdvcmRzL2xpdGVyYWxzIG9mZmVyZWQgYXMgbG93LXByaW9yaXR5IGNvbXBsZXRpb24gc28gdGhleSBhbHdheXMgYXBwZWFyIHdoaWxlIHR5cGluZy4gKi9cbmNvbnN0IEpBVkFfS0VZV09SRFMgPSBbJ2Fic3RyYWN0JywgJ2Fzc2VydCcsICdib29sZWFuJywgJ2JyZWFrJywgJ2J5dGUnLCAnY2FzZScsICdjYXRjaCcsICdjaGFyJywgJ2NsYXNzJyxcbiAgICAnY29uc3QnLCAnY29udGludWUnLCAnZGVmYXVsdCcsICdkbycsICdkb3VibGUnLCAnZWxzZScsICdlbnVtJywgJ2V4dGVuZHMnLCAnZmluYWwnLCAnZmluYWxseScsICdmbG9hdCcsXG4gICAgJ2ZvcicsICdnb3RvJywgJ2lmJywgJ2ltcGxlbWVudHMnLCAnaW1wb3J0JywgJ2luc3RhbmNlb2YnLCAnaW50JywgJ2ludGVyZmFjZScsICdsb25nJywgJ25hdGl2ZScsICduZXcnLFxuICAgICdwYWNrYWdlJywgJ3ByaXZhdGUnLCAncHJvdGVjdGVkJywgJ3B1YmxpYycsICdyZXR1cm4nLCAnc2hvcnQnLCAnc3RhdGljJywgJ3N0cmljdGZwJywgJ3N1cGVyJywgJ3N3aXRjaCcsXG4gICAgJ3N5bmNocm9uaXplZCcsICd0aGlzJywgJ3Rocm93JywgJ3Rocm93cycsICd0cmFuc2llbnQnLCAndHJ5JywgJ3ZvaWQnLCAndm9sYXRpbGUnLCAnd2hpbGUnLCAndmFyJyxcbiAgICAneWllbGQnLCAncmVjb3JkJywgJ3NlYWxlZCcsICdwZXJtaXRzJywgJ3RydWUnLCAnZmFsc2UnLCAnbnVsbCddO1xuXG4vKiogU2hhcmVkIGRlZmluaXRpb24tc3R5bGUgbG9jYXRpb24gcmVxdWVzdCB1c2VkIGJ5IGdvLXRvLWRlZmluaXRpb24vaW1wbGVtZW50YXRpb24vdHlwZS1kZWZpbml0aW9uLiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVxdWVzdExvY2F0aW9ucyhtZXRob2Q6IHN0cmluZywgbW9kZWw6IG1vbmFjby5lZGl0b3IuSVRleHRNb2RlbCwgcG9zaXRpb246IG1vbmFjby5Qb3NpdGlvbikge1xuICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHJlc3VsdDogTG9jYXRpb24gfCBMb2NhdGlvbltdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KG1ldGhvZCwge1xuICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICBwb3NpdGlvbjogICAgIHsgbGluZTogcG9zaXRpb24ubGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogcG9zaXRpb24uY29sdW1uIC0gMSB9LFxuICAgIH0pO1xuICAgIGlmICghcmVzdWx0KSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBsb2NhdGlvbnMgPSBBcnJheS5pc0FycmF5KHJlc3VsdCkgPyByZXN1bHQgOiBbcmVzdWx0XTtcbiAgICByZXR1cm4gbG9jYXRpb25zLm1hcChsb2MgPT4gKHsgdXJpOiBtb25hY28uVXJpLnBhcnNlKGxvYy51cmkpLCByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhsb2MucmFuZ2UpIH0pKTtcbn1cblxuLyoqIFJlY3Vyc2l2ZWx5IG1hcHMgTFNQIGhpZXJhcmNoaWNhbCBEb2N1bWVudFN5bWJvbHMgdG8gTW9uYWNvJ3Mgc2hhcGUgKGtpbmRzIGFyZSAxLWJhc2VkIHZzIDAtYmFzZWQpLiAqL1xuZnVuY3Rpb24gbWFwRG9jdW1lbnRTeW1ib2xzKHN5bWJvbHM6IGFueVtdKTogbW9uYWNvLmxhbmd1YWdlcy5Eb2N1bWVudFN5bWJvbFtdIHtcbiAgICByZXR1cm4gKHN5bWJvbHMgPz8gW10pLm1hcChzID0+ICh7XG4gICAgICAgIG5hbWU6ICAgICAgICAgICBzLm5hbWUsXG4gICAgICAgIGRldGFpbDogICAgICAgICBzLmRldGFpbCA/PyAnJyxcbiAgICAgICAga2luZDogICAgICAgICAgIChzLmtpbmQgPz8gMSkgLSAxLFxuICAgICAgICB0YWdzOiAgICAgICAgICAgcy50YWdzID8/IFtdLFxuICAgICAgICByYW5nZTogICAgICAgICAgbHNwUmFuZ2VUb01vbmFjbyhzLnJhbmdlKSxcbiAgICAgICAgc2VsZWN0aW9uUmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28ocy5zZWxlY3Rpb25SYW5nZSA/PyBzLnJhbmdlKSxcbiAgICAgICAgY2hpbGRyZW46ICAgICAgIHMuY2hpbGRyZW4gPyBtYXBEb2N1bWVudFN5bWJvbHMocy5jaGlsZHJlbikgOiBbXSxcbiAgICB9KSk7XG59XG5cbmZ1bmN0aW9uIGZvbGRpbmdLaW5kKGtpbmQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IG1vbmFjby5sYW5ndWFnZXMuRm9sZGluZ1JhbmdlS2luZCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgRksgPSBtb25hY28ubGFuZ3VhZ2VzLkZvbGRpbmdSYW5nZUtpbmQ7XG4gICAgc3dpdGNoIChraW5kKSB7XG4gICAgICAgIGNhc2UgJ2NvbW1lbnQnOiByZXR1cm4gRksuQ29tbWVudDtcbiAgICAgICAgY2FzZSAnaW1wb3J0cyc6IHJldHVybiBGSy5JbXBvcnRzO1xuICAgICAgICBjYXNlICdyZWdpb24nOiAgcmV0dXJuIEZLLlJlZ2lvbjtcbiAgICAgICAgZGVmYXVsdDogICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxufVxuXG4vKiogRmxhdHRlbnMgYW4gTFNQIFNlbGVjdGlvblJhbmdlIHBhcmVudC1jaGFpbiBpbnRvIE1vbmFjbydzIGlubmVybW9zdC10by1vdXRlcm1vc3QgYXJyYXkuICovXG5mdW5jdGlvbiBmbGF0dGVuU2VsZWN0aW9uUmFuZ2Uoc2VsZWN0aW9uUmFuZ2U6IGFueSk6IG1vbmFjby5sYW5ndWFnZXMuU2VsZWN0aW9uUmFuZ2VbXSB7XG4gICAgY29uc3QgcmFuZ2VzOiBtb25hY28ubGFuZ3VhZ2VzLlNlbGVjdGlvblJhbmdlW10gPSBbXTtcbiAgICBsZXQgY3VycmVudCA9IHNlbGVjdGlvblJhbmdlO1xuICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICAgIHJhbmdlcy5wdXNoKHsgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28oY3VycmVudC5yYW5nZSkgfSk7XG4gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudDtcbiAgICB9XG4gICAgcmV0dXJuIHJhbmdlcztcbn1cblxuLyoqIE1hcHMgYSBKRFQuTFMgQ29kZUxlbnMgY29tbWFuZCB0byBhIE1vbmFjbyBjb21tYW5kLCB3aXJpbmcgdGhlIHJlZmVyZW5jZXMvaW1wbGVtZW50YXRpb25zIHBlZWsuICovXG5mdW5jdGlvbiBtYXBMZW5zQ29tbWFuZChjbWQ6IGFueSk6IG1vbmFjby5sYW5ndWFnZXMuQ29tbWFuZCB7XG4gICAgY29uc3QgYXJncyA9IGNtZC5hcmd1bWVudHMgPz8gW107XG4gICAgaWYgKChjbWQuY29tbWFuZCA9PT0gJ2phdmEuc2hvdy5yZWZlcmVuY2VzJyB8fCBjbWQuY29tbWFuZCA9PT0gJ2phdmEuc2hvdy5pbXBsZW1lbnRhdGlvbnMnKSAmJiBhcmdzLmxlbmd0aCA+PSAzKSB7XG4gICAgICAgIGNvbnN0IGxvY2F0aW9ucyA9IChhcmdzWzJdID8/IFtdKS5tYXAoKGw6IGFueSkgPT4gKHsgdXJpOiBtb25hY28uVXJpLnBhcnNlKGwudXJpKSwgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28obC5yYW5nZSkgfSkpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6ICAgICAgICAnZWRpdG9yLmFjdGlvbi5zaG93UmVmZXJlbmNlcycsXG4gICAgICAgICAgICB0aXRsZTogICAgIGNtZC50aXRsZSxcbiAgICAgICAgICAgIGFyZ3VtZW50czogW21vbmFjby5VcmkucGFyc2UoYXJnc1swXSksIHsgbGluZU51bWJlcjogYXJnc1sxXS5saW5lICsgMSwgY29sdW1uOiBhcmdzWzFdLmNoYXJhY3RlciArIDEgfSwgbG9jYXRpb25zXSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgaWQ6IE5PT1BfQ09NTUFORCwgdGl0bGU6IGNtZC50aXRsZSB9O1xufVxuXG50eXBlIExzcFJhbmdlID0geyBzdGFydDogeyBsaW5lOiBudW1iZXI7IGNoYXJhY3RlcjogbnVtYmVyIH07IGVuZDogeyBsaW5lOiBudW1iZXI7IGNoYXJhY3RlcjogbnVtYmVyIH0gfTtcblxuLyoqIE1vbmFjbyBjb21wbGV0aW9uIGl0ZW0gY2FycnlpbmcgdGhlIG9yaWdpbmF0aW5nIExTUCBpdGVtIHNvIHJlc29sdmUgY2FuIGZldGNoIGl0cyBpbXBvcnQgZWRpdHMuICovXG50eXBlIE1vbmFjb0NvbXBsZXRpb25JdGVtID0gbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbSAmIHsgX2xzcD86IENvbXBsZXRpb25JdGVtIH07XG5cbmZ1bmN0aW9uIHRleHRFZGl0VG9Nb25hY28oZWRpdDogVGV4dEVkaXQpOiBtb25hY28ubGFuZ3VhZ2VzLlRleHRFZGl0IHtcbiAgICByZXR1cm4geyByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhlZGl0LnJhbmdlKSwgdGV4dDogZWRpdC5uZXdUZXh0IH07XG59XG5cbmZ1bmN0aW9uIG1vbmFjb1JhbmdlVG9Mc3AocjogbW9uYWNvLklSYW5nZSk6IExzcFJhbmdlIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBzdGFydDogeyBsaW5lOiByLnN0YXJ0TGluZU51bWJlciAtIDEsIGNoYXJhY3Rlcjogci5zdGFydENvbHVtbiAtIDEgfSxcbiAgICAgICAgZW5kOiAgIHsgbGluZTogci5lbmRMaW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiByLmVuZENvbHVtbiAtIDEgfSxcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBtb25hY29TZXZlcml0eVRvTHNwKHNldmVyaXR5OiBtb25hY28uTWFya2VyU2V2ZXJpdHkpOiBEaWFnbm9zdGljU2V2ZXJpdHkge1xuICAgIHN3aXRjaCAoc2V2ZXJpdHkpIHtcbiAgICAgICAgY2FzZSBtb25hY28uTWFya2VyU2V2ZXJpdHkuRXJyb3I6ICAgcmV0dXJuIERpYWdub3N0aWNTZXZlcml0eS5FcnJvcjtcbiAgICAgICAgY2FzZSBtb25hY28uTWFya2VyU2V2ZXJpdHkuV2FybmluZzogcmV0dXJuIERpYWdub3N0aWNTZXZlcml0eS5XYXJuaW5nO1xuICAgICAgICBjYXNlIG1vbmFjby5NYXJrZXJTZXZlcml0eS5JbmZvOiAgICByZXR1cm4gRGlhZ25vc3RpY1NldmVyaXR5LkluZm9ybWF0aW9uO1xuICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRGlhZ25vc3RpY1NldmVyaXR5LkhpbnQ7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBtYXJrZXJUb0xzcERpYWdub3N0aWMobTogbW9uYWNvLmVkaXRvci5JTWFya2VyRGF0YSk6IERpYWdub3N0aWMge1xuICAgIHJldHVybiB7XG4gICAgICAgIHJhbmdlOiAgICB7IHN0YXJ0OiB7IGxpbmU6IG0uc3RhcnRMaW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBtLnN0YXJ0Q29sdW1uIC0gMSB9LFxuICAgICAgICAgICAgICAgICAgICBlbmQ6ICAgeyBsaW5lOiBtLmVuZExpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IG0uZW5kQ29sdW1uIC0gMSB9IH0sXG4gICAgICAgIG1lc3NhZ2U6ICBtLm1lc3NhZ2UsXG4gICAgICAgIHNldmVyaXR5OiBtb25hY29TZXZlcml0eVRvTHNwKG0uc2V2ZXJpdHkpLFxuICAgICAgICBzb3VyY2U6ICAgbS5zb3VyY2UsXG4gICAgfSBhcyBEaWFnbm9zdGljO1xufVxuXG5mdW5jdGlvbiBsc3BDb2RlQWN0aW9uVG9Nb25hY28oYWN0aW9uOiBDb2RlQWN0aW9uIHwgQ29tbWFuZCk6IG1vbmFjby5sYW5ndWFnZXMuQ29kZUFjdGlvbiB7XG4gICAgY29uc3QgaXNDb21tYW5kID0gdHlwZW9mIChhY3Rpb24gYXMgQ29tbWFuZCkuY29tbWFuZCA9PT0gJ3N0cmluZyc7XG4gICAgY29uc3QgdGl0bGUgPSBhY3Rpb24udGl0bGVcbiAgICAgICAgPz8gKGlzQ29tbWFuZCA/IChhY3Rpb24gYXMgQ29tbWFuZCkuY29tbWFuZCA6IChhY3Rpb24gYXMgQ29kZUFjdGlvbikuY29tbWFuZD8udGl0bGUpXG4gICAgICAgID8/ICdBY3Rpb24nO1xuICAgIGNvbnN0IGtpbmQgPSBpc0NvbW1hbmQgPyAncXVpY2tmaXgnIDogKChhY3Rpb24gYXMgQ29kZUFjdGlvbikua2luZCA/PyAncXVpY2tmaXgnKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB0aXRsZSxcbiAgICAgICAga2luZCxcbiAgICAgICAgZGlhZ25vc3RpY3M6IFtdLFxuICAgICAgICBpc1ByZWZlcnJlZDogKGFjdGlvbiBhcyBDb2RlQWN0aW9uKS5pc1ByZWZlcnJlZCxcbiAgICAgICAgLy8gQXBwbHkgbGF6aWx5IHRocm91Z2ggb3VyIGNvbW1hbmQgc28gd2UgY2FuIHJlc29sdmUsIHJ1biBzZXJ2ZXIgY29tbWFuZHMgYW5kIGFwcGx5IGVkaXRzIHVuaWZvcm1seS5cbiAgICAgICAgY29tbWFuZDogeyBpZDogQVBQTFlfQUNUSU9OX0NPTU1BTkQsIHRpdGxlLCBhcmd1bWVudHM6IFthY3Rpb25dIH0sXG4gICAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gYXBwbHlDb2RlQWN0aW9uKGFjdGlvbjogQ29kZUFjdGlvbiB8IENvbW1hbmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIV9jb25uKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiAoYWN0aW9uIGFzIENvbW1hbmQpLmNvbW1hbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBhd2FpdCBydW5TZXJ2ZXJDb21tYW5kKGFjdGlvbiBhcyBDb21tYW5kKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzb2x2ZWQgPSBhY3Rpb24gYXMgQ29kZUFjdGlvbjtcbiAgICAgICAgaWYgKCFyZXNvbHZlZC5lZGl0ICYmIChyZXNvbHZlZCBhcyB7IGRhdGE/OiB1bmtub3duIH0pLmRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzb2x2ZWQgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgnY29kZUFjdGlvbi9yZXNvbHZlJywgcmVzb2x2ZWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXNvbHZlZC5lZGl0KSBhcHBseVdvcmtzcGFjZUVkaXQocmVzb2x2ZWQuZWRpdCk7XG4gICAgICAgIGlmIChyZXNvbHZlZC5jb21tYW5kKSBhd2FpdCBydW5TZXJ2ZXJDb21tYW5kKHJlc29sdmVkLmNvbW1hbmQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbamF2YS1sc3BdIGNvZGUgYWN0aW9uIGZhaWxlZDonLCAoZSBhcyBFcnJvcik/Lm1lc3NhZ2UgPz8gZSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBpc1dvcmtzcGFjZUVkaXQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBXb3Jrc3BhY2VFZGl0IHtcbiAgICByZXR1cm4gISF2YWx1ZSAmJiAoISEodmFsdWUgYXMgV29ya3NwYWNlRWRpdCkuY2hhbmdlcyB8fCAhISh2YWx1ZSBhcyBXb3Jrc3BhY2VFZGl0KS5kb2N1bWVudENoYW5nZXMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5TZXJ2ZXJDb21tYW5kKGNtZDogQ29tbWFuZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghX2Nvbm4gfHwgIWNtZD8uY29tbWFuZCkgcmV0dXJuO1xuICAgIGlmIChHRU5FUkFURVtjbWQuY29tbWFuZF0pIHtcbiAgICAgICAgYXdhaXQgcnVuR2VuZXJhdGUoY21kLmNvbW1hbmQsIGNtZC5hcmd1bWVudHMgPz8gW10pO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd3b3Jrc3BhY2UvZXhlY3V0ZUNvbW1hbmQnLCB7IGNvbW1hbmQ6IGNtZC5jb21tYW5kLCBhcmd1bWVudHM6IGNtZC5hcmd1bWVudHMgPz8gW10gfSk7XG4gICAgaWYgKGlzV29ya3NwYWNlRWRpdChyZXN1bHQpKSBhcHBseVdvcmtzcGFjZUVkaXQocmVzdWx0KTtcbn1cblxuaW50ZXJmYWNlIEdlbmVyYXRlU3BlYyB7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICBzdGF0dXM6IHN0cmluZztcbiAgICBnZW5lcmF0ZTogc3RyaW5nO1xuICAgIG1lbWJlcnM6IChzdGF0dXM6IGFueSkgPT4gQXJyYXk8eyBsYWJlbDogc3RyaW5nOyByZWY6IGFueSB9PjtcbiAgICBidWlsZEFyZ3M6IChwcm9tcHRBcmdzOiBhbnlbXSwgc3RhdHVzOiBhbnksIHNlbGVjdGVkOiBhbnlbXSkgPT4gYW55W107XG59XG5cbi8qKiBNZW1iZXItbmFtZWQgZmllbGRzIFx1MjE5MiBwaWNrZXIgbGFiZWxzLiAqL1xuZnVuY3Rpb24gZmllbGRMYWJlbChmOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSBmPy5uYW1lID8/IGY/LmZpZWxkTmFtZSA/PyAnJztcbiAgICBjb25zdCB0eXBlID0gZj8udHlwZSA/PyBmPy50eXBlTmFtZTtcbiAgICByZXR1cm4gdHlwZSA/IGAke25hbWV9OiAke3R5cGV9YCA6IGAke25hbWV9YDtcbn1cblxuLyoqXG4gKiBUaGUgSkRULkxTIHNvdXJjZS1nZW5lcmF0aW9uIGNvbW1hbmRzIChjb25zdHJ1Y3RvcnMsIGdldHRlcnMvc2V0dGVycywgdG9TdHJpbmcsIGhhc2hDb2RlL2VxdWFscykuXG4gKiBFYWNoIG1hcHMgdGhlIGNsaWVudCBcIipQcm9tcHRcIiBjb21tYW5kIHRvIHRoZSBzZXJ2ZXIgc3RhdHVzICsgZ2VuZXJhdGUgZGVsZWdhdGUgY29tbWFuZHM7IHRoZSBzdGF0dXNcbiAqIGNhbGwgeWllbGRzIHRoZSBjYW5kaWRhdGUgZmllbGRzIHNob3duIGluIHRoZSBtZW1iZXIgcGlja2VyLCB0aGUgZ2VuZXJhdGUgY2FsbCByZXR1cm5zIHRoZSBlZGl0LlxuICovXG5jb25zdCBHRU5FUkFURTogUmVjb3JkPHN0cmluZywgR2VuZXJhdGVTcGVjPiA9IHtcbiAgICAnamF2YS5hY3Rpb24uZ2VuZXJhdGVDb25zdHJ1Y3RvcnNQcm9tcHQnOiB7XG4gICAgICAgIGxhYmVsOiAnU2VsZWN0IGZpZWxkcyBhbmQgY29uc3RydWN0b3JzJyxcbiAgICAgICAgc3RhdHVzOiAnamF2YS5hY3Rpb24uY2hlY2tDb25zdHJ1Y3RvcnNTdGF0dXMnLFxuICAgICAgICBnZW5lcmF0ZTogJ2phdmEuYWN0aW9uLmdlbmVyYXRlQ29uc3RydWN0b3JzJyxcbiAgICAgICAgbWVtYmVyczogKHMpID0+IChzPy5maWVsZHMgPz8gW10pLm1hcCgoZjogYW55KSA9PiAoeyBsYWJlbDogZmllbGRMYWJlbChmKSwgcmVmOiBmIH0pKSxcbiAgICAgICAgYnVpbGRBcmdzOiAoYXJncywgcywgc2VsKSA9PiBbYXJnc1swXSwgeyBjb25zdHJ1Y3RvcnM6IHM/LmNvbnN0cnVjdG9ycyA/PyBbXSwgZmllbGRzOiBzZWwubWFwKG0gPT4gbS5yZWYpIH1dLFxuICAgIH0sXG4gICAgJ2phdmEuYWN0aW9uLmdlbmVyYXRlVG9TdHJpbmdQcm9tcHQnOiB7XG4gICAgICAgIGxhYmVsOiAnU2VsZWN0IGZpZWxkcyB0byBpbmNsdWRlIGluIHRvU3RyaW5nKCknLFxuICAgICAgICBzdGF0dXM6ICdqYXZhLmFjdGlvbi5jaGVja1RvU3RyaW5nU3RhdHVzJyxcbiAgICAgICAgZ2VuZXJhdGU6ICdqYXZhLmFjdGlvbi5nZW5lcmF0ZVRvU3RyaW5nJyxcbiAgICAgICAgbWVtYmVyczogKHMpID0+IChzPy5maWVsZHMgPz8gW10pLm1hcCgoZjogYW55KSA9PiAoeyBsYWJlbDogZmllbGRMYWJlbChmKSwgcmVmOiBmIH0pKSxcbiAgICAgICAgYnVpbGRBcmdzOiAoYXJncywgX3MsIHNlbCkgPT4gW2FyZ3NbMF0sIHNlbC5tYXAobSA9PiBtLnJlZildLFxuICAgIH0sXG4gICAgJ2phdmEuYWN0aW9uLmhhc2hDb2RlRXF1YWxzUHJvbXB0Jzoge1xuICAgICAgICBsYWJlbDogJ1NlbGVjdCBmaWVsZHMgZm9yIGhhc2hDb2RlKCkgYW5kIGVxdWFscygpJyxcbiAgICAgICAgc3RhdHVzOiAnamF2YS5hY3Rpb24uY2hlY2tIYXNoQ29kZUVxdWFsc1N0YXR1cycsXG4gICAgICAgIGdlbmVyYXRlOiAnamF2YS5hY3Rpb24uZ2VuZXJhdGVIYXNoQ29kZUVxdWFscycsXG4gICAgICAgIG1lbWJlcnM6IChzKSA9PiAocz8uZmllbGRzID8/IFtdKS5tYXAoKGY6IGFueSkgPT4gKHsgbGFiZWw6IGZpZWxkTGFiZWwoZiksIHJlZjogZiB9KSksXG4gICAgICAgIGJ1aWxkQXJnczogKGFyZ3MsIF9zLCBzZWwpID0+IFthcmdzWzBdLCBzZWwubWFwKG0gPT4gbS5yZWYpLCBmYWxzZV0sXG4gICAgfSxcbiAgICAnamF2YS5hY3Rpb24uZ2VuZXJhdGVBY2Nlc3NvcnNQcm9tcHQnOiB7XG4gICAgICAgIGxhYmVsOiAnU2VsZWN0IGZpZWxkcyB0byBnZW5lcmF0ZSBnZXR0ZXJzIGFuZCBzZXR0ZXJzJyxcbiAgICAgICAgc3RhdHVzOiAnamF2YS5hY3Rpb24uY2hlY2tBY2Nlc3NvcnNTdGF0dXMnLFxuICAgICAgICBnZW5lcmF0ZTogJ2phdmEuYWN0aW9uLmdlbmVyYXRlQWNjZXNzb3JzJyxcbiAgICAgICAgbWVtYmVyczogKHMpID0+IChzPy5hY2Nlc3NvcnMgPz8gcyA/PyBbXSkubWFwKChhOiBhbnkpID0+ICh7IGxhYmVsOiBmaWVsZExhYmVsKGEpLCByZWY6IGEgfSkpLFxuICAgICAgICBidWlsZEFyZ3M6IChhcmdzLCBfcywgc2VsKSA9PiBbYXJnc1swXSwgc2VsLm1hcChtID0+IG0ucmVmKV0sXG4gICAgfSxcbiAgICAnamF2YS5hY3Rpb24ub3ZlcnJpZGVNZXRob2RzUHJvbXB0Jzoge1xuICAgICAgICBsYWJlbDogJ1NlbGVjdCBtZXRob2RzIHRvIG92ZXJyaWRlIG9yIGltcGxlbWVudCcsXG4gICAgICAgIHN0YXR1czogJ2phdmEuYWN0aW9uLmxpc3RPdmVycmlkYWJsZU1ldGhvZHMnLFxuICAgICAgICBnZW5lcmF0ZTogJ2phdmEuYWN0aW9uLmFkZE92ZXJyaWRhYmxlTWV0aG9kcycsXG4gICAgICAgIG1lbWJlcnM6IChzKSA9PiAocz8ubWV0aG9kcyA/PyBbXSkubWFwKChtOiBhbnkpID0+ICh7XG4gICAgICAgICAgICBsYWJlbDogYCR7bS5uYW1lfSgkeyhtLnBhcmFtZXRlcnMgPz8gW10pLmpvaW4oJywgJyl9KSR7bS5kZWNsYXJpbmdDbGFzcyA/ICcgOiAnICsgbS5kZWNsYXJpbmdDbGFzcyA6ICcnfWAsXG4gICAgICAgICAgICByZWY6IG0sXG4gICAgICAgIH0pKSxcbiAgICAgICAgYnVpbGRBcmdzOiAoYXJncywgc3RhdHVzLCBzZWwpID0+IFthcmdzWzBdLCB7IG92ZXJyaWRhYmxlTWV0aG9kczogc2VsLm1hcChtID0+IG0ucmVmKSwgdHlwZTogc3RhdHVzPy50eXBlIH1dLFxuICAgIH0sXG59O1xuXG5hc3luYyBmdW5jdGlvbiBydW5HZW5lcmF0ZShwcm9tcHRJZDogc3RyaW5nLCBhcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghX2Nvbm4pIHJldHVybjtcbiAgICBjb25zdCBzcGVjID0gR0VORVJBVEVbcHJvbXB0SWRdO1xuICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd3b3Jrc3BhY2UvZXhlY3V0ZUNvbW1hbmQnLCB7IGNvbW1hbmQ6IHNwZWMuc3RhdHVzLCBhcmd1bWVudHM6IGFyZ3MgfSk7XG4gICAgaWYgKCFzdGF0dXMpIHJldHVybjtcbiAgICBjb25zdCBtZW1iZXJzID0gc3BlYy5tZW1iZXJzKHN0YXR1cyk7XG4gICAgbGV0IHNlbGVjdGVkID0gbWVtYmVycztcbiAgICBjb25zdCBwaWNrZXIgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLmphdmFMc3BNZW1iZXJQaWNrZXI7XG4gICAgaWYgKG1lbWJlcnMubGVuZ3RoICYmIHR5cGVvZiBwaWNrZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY29uc3QgY2hvc2VuOiBzdHJpbmdbXSB8IG51bGwgPSBhd2FpdCBwaWNrZXIoc3BlYy5sYWJlbCwgbWVtYmVycy5tYXAobSA9PiBtLmxhYmVsKSk7XG4gICAgICAgIGlmIChjaG9zZW4gPT09IG51bGwpIHJldHVybjsgLy8gdXNlciBjYW5jZWxsZWQgdGhlIGRpYWxvZ1xuICAgICAgICBzZWxlY3RlZCA9IG1lbWJlcnMuZmlsdGVyKG0gPT4gY2hvc2VuLmluY2x1ZGVzKG0ubGFiZWwpKTtcbiAgICB9XG4gICAgY29uc3QgZWRpdCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd3b3Jrc3BhY2UvZXhlY3V0ZUNvbW1hbmQnLCB7XG4gICAgICAgIGNvbW1hbmQ6IHNwZWMuZ2VuZXJhdGUsXG4gICAgICAgIGFyZ3VtZW50czogc3BlYy5idWlsZEFyZ3MoYXJncywgc3RhdHVzLCBzZWxlY3RlZCksXG4gICAgfSk7XG4gICAgaWYgKGlzV29ya3NwYWNlRWRpdChlZGl0KSkgYXBwbHlXb3Jrc3BhY2VFZGl0KGVkaXQpO1xufVxuXG4vKiogR3JvdXBzIGEgd29ya3NwYWNlIGVkaXQncyB0ZXh0IGVkaXRzIGJ5IGRvY3VtZW50IGFuZCBhcHBsaWVzIHRoZW0gaW4gcGxhY2UgdG8gb3BlbiBNb25hY28gbW9kZWxzLiAqL1xuZnVuY3Rpb24gYXBwbHlXb3Jrc3BhY2VFZGl0KGVkaXQ6IFdvcmtzcGFjZUVkaXQgfCBudWxsIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0KSByZXR1cm47XG4gICAgY29uc3QgYnlVcmk6IFJlY29yZDxzdHJpbmcsIFRleHRFZGl0W10+ID0ge307XG4gICAgaWYgKGVkaXQuY2hhbmdlcykge1xuICAgICAgICBmb3IgKGNvbnN0IHVyaSBpbiBlZGl0LmNoYW5nZXMpIGJ5VXJpW3VyaV0gPSAoYnlVcmlbdXJpXSA/PyBbXSkuY29uY2F0KGVkaXQuY2hhbmdlc1t1cmldKTtcbiAgICB9XG4gICAgaWYgKGVkaXQuZG9jdW1lbnRDaGFuZ2VzKSB7XG4gICAgICAgIGZvciAoY29uc3QgZGMgb2YgZWRpdC5kb2N1bWVudENoYW5nZXMgYXMgYW55W10pIHtcbiAgICAgICAgICAgIGlmIChkYz8udGV4dERvY3VtZW50Py51cmkgJiYgQXJyYXkuaXNBcnJheShkYy5lZGl0cykpIHtcbiAgICAgICAgICAgICAgICBieVVyaVtkYy50ZXh0RG9jdW1lbnQudXJpXSA9IChieVVyaVtkYy50ZXh0RG9jdW1lbnQudXJpXSA/PyBbXSkuY29uY2F0KGRjLmVkaXRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IHVyaSBpbiBieVVyaSkge1xuICAgICAgICBjb25zdCBtb2RlbCA9IG1vbmFjby5lZGl0b3IuZ2V0TW9kZWxzKCkuZmluZChtID0+IG0udXJpLnRvU3RyaW5nKCkgPT09IHVyaSk7XG4gICAgICAgIGlmICghbW9kZWwpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBvcHMgPSBieVVyaVt1cmldLm1hcChlID0+ICh7IHJhbmdlOiBsc3BSYW5nZVRvTW9uYWNvKGUucmFuZ2UpLCB0ZXh0OiBlLm5ld1RleHQsIGZvcmNlTW92ZU1hcmtlcnM6IHRydWUgfSkpO1xuICAgICAgICBtb2RlbC5wdXNoRWRpdE9wZXJhdGlvbnMoW10sIG9wcywgKCkgPT4gbnVsbCk7XG4gICAgfVxufVxuXG4vKiogQ29udmVydHMgYW4gTFNQIHdvcmtzcGFjZSBlZGl0IGludG8gdGhlIE1vbmFjbyBzaGFwZSByZXR1cm5lZCBieSB0aGUgcmVuYW1lIHByb3ZpZGVyLiAqL1xuZnVuY3Rpb24gd29ya3NwYWNlRWRpdFRvTW9uYWNvKGVkaXQ6IFdvcmtzcGFjZUVkaXQgfCBudWxsKTogbW9uYWNvLmxhbmd1YWdlcy5Xb3Jrc3BhY2VFZGl0IHtcbiAgICBjb25zdCBlZGl0czogYW55W10gPSBbXTtcbiAgICBjb25zdCBwdXNoID0gKHVyaTogc3RyaW5nLCBsaXN0OiBUZXh0RWRpdFtdKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgZSBvZiBsaXN0KSB7XG4gICAgICAgICAgICBlZGl0cy5wdXNoKHsgcmVzb3VyY2U6IG1vbmFjby5VcmkucGFyc2UodXJpKSwgdGV4dEVkaXQ6IHsgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28oZS5yYW5nZSksIHRleHQ6IGUubmV3VGV4dCB9LCB2ZXJzaW9uSWQ6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgaWYgKGVkaXQ/LmNoYW5nZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCB1cmkgaW4gZWRpdC5jaGFuZ2VzKSBwdXNoKHVyaSwgZWRpdC5jaGFuZ2VzW3VyaV0pO1xuICAgIH1cbiAgICBpZiAoZWRpdD8uZG9jdW1lbnRDaGFuZ2VzKSB7XG4gICAgICAgIGZvciAoY29uc3QgZGMgb2YgZWRpdC5kb2N1bWVudENoYW5nZXMgYXMgYW55W10pIHtcbiAgICAgICAgICAgIGlmIChkYz8udGV4dERvY3VtZW50Py51cmkgJiYgQXJyYXkuaXNBcnJheShkYy5lZGl0cykpIHB1c2goZGMudGV4dERvY3VtZW50LnVyaSwgZGMuZWRpdHMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGVkaXRzIH07XG59XG5cbi8qKiBNYXBzIGEgdmlydHVhbCBlZGl0b3IgVVJJIGJhY2sgdG8gdGhlIElERSB3b3Jrc3BhY2UgcGF0aCAoe0Bjb2RlIC93cy9wcm9qLy4uLn0pLiAqL1xuZnVuY3Rpb24gdXJpVG9Xb3Jrc3BhY2VQYXRoKHVyaTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCF1cmkuc3RhcnRzV2l0aChWSVJUVUFMX0ZJTEVfUFJFRklYKSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh1cmkuc3Vic3RyaW5nKFZJUlRVQUxfRklMRV9QUkVGSVgubGVuZ3RoKSk7XG59XG5cbi8qKiBSZWFkcyBhIHdvcmtzcGFjZSBmaWxlJ3MgY3VycmVudCB0ZXh0IG92ZXIgdGhlIElERSBSRVNUIEFQSS4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZldGNoV29ya3NwYWNlRmlsZVRleHQoaWRlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvc2VydmljZXMvaWRlL3dvcmtzcGFjZXMnICsgaWRlUGF0aCwgeyBoZWFkZXJzOiB7ICdYLVJlcXVlc3RlZC1XaXRoJzogJ0ZldGNoJyB9IH0pO1xuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgcmVhZCAke2lkZVBhdGh9IChIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfSlgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTtcbn1cblxuLyoqIEFwcGxpZXMgTFNQIHRleHQgZWRpdHMgdG8gYSBzdHJpbmcuIE9mZnNldHMgYXJlIHJlc29sdmVkIGFnYWluc3QgdGhlIG9yaWdpbmFsIHRleHQgYW5kIGVkaXRzIGFyZVxuICogIGFwcGxpZWQgZnJvbSB0aGUgZW5kIGJhY2t3YXJkcywgc28gZWFybGllciBvZmZzZXRzIHN0YXkgdmFsaWQuICovXG5mdW5jdGlvbiBhcHBseUVkaXRzVG9UZXh0KHRleHQ6IHN0cmluZywgZWRpdHM6IFRleHRFZGl0W10pOiBzdHJpbmcge1xuICAgIGNvbnN0IGxpbmVTdGFydHMgPSBbMF07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICh0ZXh0LmNoYXJDb2RlQXQoaSkgPT09IDEwIC8qIFxcbiAqLykgbGluZVN0YXJ0cy5wdXNoKGkgKyAxKTtcbiAgICB9XG4gICAgY29uc3Qgb2Zmc2V0ID0gKHA6IHsgbGluZTogbnVtYmVyOyBjaGFyYWN0ZXI6IG51bWJlciB9KSA9PiAobGluZVN0YXJ0c1twLmxpbmVdID8/IHRleHQubGVuZ3RoKSArIHAuY2hhcmFjdGVyO1xuICAgIGNvbnN0IG9yZGVyZWQgPSBlZGl0cy5zbGljZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IG9mZnNldChiLnJhbmdlLnN0YXJ0KSAtIG9mZnNldChhLnJhbmdlLnN0YXJ0KSk7XG4gICAgbGV0IHJlc3VsdCA9IHRleHQ7XG4gICAgZm9yIChjb25zdCBlIG9mIG9yZGVyZWQpIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnNsaWNlKDAsIG9mZnNldChlLnJhbmdlLnN0YXJ0KSkgKyBlLm5ld1RleHQgKyByZXN1bHQuc2xpY2Uob2Zmc2V0KGUucmFuZ2UuZW5kKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQXBwbGllcyBhIEpEVC5MUyByZW5hbWUge0BsaW5rIFdvcmtzcGFjZUVkaXR9IGFjcm9zcyB0aGUgd2hvbGUgd29ya3NwYWNlOiB0ZXh0IGVkaXRzIGluIGV2ZXJ5XG4gKiBhZmZlY3RlZCBmaWxlIHBsdXMgYW55IHtAY29kZSBSZW5hbWVGaWxlfSBvcGVyYXRpb24gKGEgcHVibGljLXR5cGUgcmVuYW1lIHJlbmFtZXMgaXRzIG93blxuICoge0Bjb2RlIC5qYXZhfSBmaWxlKS4gVGhlIGN1cnJlbnQgZmlsZSdzIGVkaXRzIGdvIHRocm91Z2ggdGhlIGxpdmUgTW9uYWNvIG1vZGVsOyB0aGUgcmVzdCBhcmUgcmVhZCxcbiAqIGVkaXRlZCBhbmQgd3JpdHRlbiBiYWNrIG92ZXIgUkVTVC4gUGVyc2lzdGVuY2UgKENTUkYtZ3VhcmRlZCB3cml0ZXMsIHRoZSB0YWIgc3dpdGNoIHdoZW4gdGhlIGN1cnJlbnRcbiAqIGZpbGUgaXMgcmVuYW1lZCwgYW5kIHJlbG9hZGluZyBvdGhlciBvcGVuIGVkaXRvcnMpIGlzIGRlbGVnYXRlZCB0byB0aGUgSURFIHZpYSBqYXZhTHNwUGVyc2lzdFJlbmFtZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYXBwbHlSZW5hbWVBY3Jvc3NXb3Jrc3BhY2UobW9kZWw6IG1vbmFjby5lZGl0b3IuSVRleHRNb2RlbCwgZWRpdDogV29ya3NwYWNlRWRpdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGN1cnJlbnRVcmkgPSBtb2RlbC51cmkudG9TdHJpbmcoKTtcbiAgICBjb25zdCB0ZXh0QnlVcmk6IFJlY29yZDxzdHJpbmcsIFRleHRFZGl0W10+ID0ge307XG4gICAgY29uc3QgcmVuYW1lQnlVcmk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgIGlmIChlZGl0LmNoYW5nZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCB1cmkgaW4gZWRpdC5jaGFuZ2VzKSB0ZXh0QnlVcmlbdXJpXSA9ICh0ZXh0QnlVcmlbdXJpXSA/PyBbXSkuY29uY2F0KGVkaXQuY2hhbmdlc1t1cmldKTtcbiAgICB9XG4gICAgaWYgKGVkaXQuZG9jdW1lbnRDaGFuZ2VzKSB7XG4gICAgICAgIGZvciAoY29uc3QgZGMgb2YgZWRpdC5kb2N1bWVudENoYW5nZXMgYXMgYW55W10pIHtcbiAgICAgICAgICAgIGlmIChkYz8ua2luZCA9PT0gJ3JlbmFtZScgJiYgZGMub2xkVXJpICYmIGRjLm5ld1VyaSkge1xuICAgICAgICAgICAgICAgIHJlbmFtZUJ5VXJpW2RjLm9sZFVyaV0gPSBkYy5uZXdVcmk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRjPy50ZXh0RG9jdW1lbnQ/LnVyaSAmJiBBcnJheS5pc0FycmF5KGRjLmVkaXRzKSkge1xuICAgICAgICAgICAgICAgIHRleHRCeVVyaVtkYy50ZXh0RG9jdW1lbnQudXJpXSA9ICh0ZXh0QnlVcmlbZGMudGV4dERvY3VtZW50LnVyaV0gPz8gW10pLmNvbmNhdChkYy5lZGl0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBwYXlsb2FkOiB7XG4gICAgICAgIGN1cnJlbnRQYXRoOiBzdHJpbmcgfCBudWxsO1xuICAgICAgICBjdXJyZW50Q29udGVudDogc3RyaW5nIHwgbnVsbDtcbiAgICAgICAgY3VycmVudE5ld1BhdGg6IHN0cmluZyB8IG51bGw7XG4gICAgICAgIHdyaXRlczogQXJyYXk8eyBwYXRoOiBzdHJpbmcgfCBudWxsOyBjb250ZW50OiBzdHJpbmcgfT47XG4gICAgICAgIHJlbmFtZXM6IEFycmF5PHsgb2xkUGF0aDogc3RyaW5nIHwgbnVsbDsgbmV3UGF0aDogc3RyaW5nIHwgbnVsbDsgY29udGVudDogc3RyaW5nIH0+O1xuICAgIH0gPSB7IGN1cnJlbnRQYXRoOiB1cmlUb1dvcmtzcGFjZVBhdGgoY3VycmVudFVyaSksIGN1cnJlbnRDb250ZW50OiBudWxsLCBjdXJyZW50TmV3UGF0aDogbnVsbCwgd3JpdGVzOiBbXSwgcmVuYW1lczogW10gfTtcblxuICAgIGNvbnN0IHVyaXMgPSBuZXcgU2V0PHN0cmluZz4oWy4uLk9iamVjdC5rZXlzKHRleHRCeVVyaSksIC4uLk9iamVjdC5rZXlzKHJlbmFtZUJ5VXJpKV0pO1xuICAgIGZvciAoY29uc3QgdXJpIG9mIHVyaXMpIHtcbiAgICAgICAgY29uc3QgZWRpdHMgPSB0ZXh0QnlVcmlbdXJpXSA/PyBbXTtcbiAgICAgICAgbGV0IGNvbnRlbnQ6IHN0cmluZztcbiAgICAgICAgaWYgKHVyaSA9PT0gY3VycmVudFVyaSkge1xuICAgICAgICAgICAgaWYgKGVkaXRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIG1vZGVsLnB1c2hFZGl0T3BlcmF0aW9ucyhbXSwgZWRpdHMubWFwKGUgPT4gKHsgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28oZS5yYW5nZSksIHRleHQ6IGUubmV3VGV4dCwgZm9yY2VNb3ZlTWFya2VyczogdHJ1ZSB9KSksICgpID0+IG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGVudCA9IG1vZGVsLmdldFZhbHVlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBhd2FpdCBmZXRjaFdvcmtzcGFjZUZpbGVUZXh0KHVyaVRvV29ya3NwYWNlUGF0aCh1cmkpID8/IHVyaSk7XG4gICAgICAgICAgICBjb250ZW50ID0gZWRpdHMubGVuZ3RoID8gYXBwbHlFZGl0c1RvVGV4dChzb3VyY2UsIGVkaXRzKSA6IHNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdVcmkgPSByZW5hbWVCeVVyaVt1cmldO1xuICAgICAgICBpZiAodXJpID09PSBjdXJyZW50VXJpKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmN1cnJlbnRDb250ZW50ID0gY29udGVudDtcbiAgICAgICAgICAgIHBheWxvYWQuY3VycmVudE5ld1BhdGggPSBuZXdVcmkgPyB1cmlUb1dvcmtzcGFjZVBhdGgobmV3VXJpKSA6IG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAobmV3VXJpKSB7XG4gICAgICAgICAgICBwYXlsb2FkLnJlbmFtZXMucHVzaCh7IG9sZFBhdGg6IHVyaVRvV29ya3NwYWNlUGF0aCh1cmkpLCBuZXdQYXRoOiB1cmlUb1dvcmtzcGFjZVBhdGgobmV3VXJpKSwgY29udGVudCB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBheWxvYWQud3JpdGVzLnB1c2goeyBwYXRoOiB1cmlUb1dvcmtzcGFjZVBhdGgodXJpKSwgY29udGVudCB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IChnbG9iYWxUaGlzIGFzIGFueSkuamF2YUxzcFBlcnNpc3RSZW5hbWUocGF5bG9hZCk7XG59XG5cbmZ1bmN0aW9uIGpkdGxzU2V0dGluZ3MoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgamF2YToge1xuICAgICAgICAgICAgaW1wb3J0OiB7XG4gICAgICAgICAgICAgICAgbWF2ZW46ICAgICAgeyBlbmFibGVkOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgZ3JhZGxlOiAgICAgeyBlbmFibGVkOiBmYWxzZSB9LFxuICAgICAgICAgICAgICAgIGV4Y2x1c2lvbnM6IFsnKiovbm9kZV9tb2R1bGVzLyoqJywgJyoqLy5tZXRhZGF0YS8qKicsICcqKi9hcmNoZXR5cGUtcmVzb3VyY2VzLyoqJ10sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYXV0b2J1aWxkOiB7IGVuYWJsZWQ6IHRydWUgfSxcbiAgICAgICAgICAgIGNvbXBsZXRpb246IHtcbiAgICAgICAgICAgICAgICBvdmVyd3JpdGU6ICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICBndWVzc01ldGhvZEFyZ3VtZW50czogZmFsc2UsXG4gICAgICAgICAgICAgICAgZmlsdGVyZWRUeXBlczogW1xuICAgICAgICAgICAgICAgICAgICAnY29tLnN1bi4qJywgJ3N1bi4qJywgJ2pkay4qJyxcbiAgICAgICAgICAgICAgICAgICAgJ29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC4qJyxcbiAgICAgICAgICAgICAgICAgICAgJ29yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuKicsXG4gICAgICAgICAgICAgICAgICAgICdvcmcuZWNsaXBzZS5vc2dpLmludGVybmFsLionLFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgaW1wb3J0T3JkZXI6IFsnamF2YScsICdqYXZheCcsICdvcmcnLCAnY29tJywgJyddLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNpZ25hdHVyZUhlbHA6ICB7IGVuYWJsZWQ6IHRydWUgfSxcbiAgICAgICAgICAgIGZvcm1hdDogICAgICAgICB7IGVuYWJsZWQ6IHRydWUgfSxcbiAgICAgICAgICAgIHNhdmVBY3Rpb25zOiAgICB7IG9yZ2FuaXplSW1wb3J0czogZmFsc2UgfSxcbiAgICAgICAgICAgIGlubGF5SGludHM6ICAgICB7IHBhcmFtZXRlck5hbWVzOiB7IGVuYWJsZWQ6ICdhbGwnIH0gfSxcbiAgICAgICAgICAgIHJlZmVyZW5jZXNDb2RlTGVuczogICAgIHsgZW5hYmxlZDogdHJ1ZSB9LFxuICAgICAgICAgICAgaW1wbGVtZW50YXRpb25zQ29kZUxlbnM6IHsgZW5hYmxlZDogdHJ1ZSB9LFxuICAgICAgICB9LFxuICAgIH07XG59XG4iLCAiLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgMjAyNCBUeXBlRm94IGFuZCBvdGhlcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMSUNFTlNFIGluIHRoZSBwYWNrYWdlIHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuaW1wb3J0IHsgRGlzcG9zYWJsZSB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcblxuZXhwb3J0IGNsYXNzIERpc3Bvc2FibGVDb2xsZWN0aW9uIGltcGxlbWVudHMgRGlzcG9zYWJsZSB7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGRpc3Bvc2FibGVzOiBEaXNwb3NhYmxlW10gPSBbXTtcblxuICAgIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgICAgIHdoaWxlICh0aGlzLmRpc3Bvc2FibGVzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgdGhpcy5kaXNwb3NhYmxlcy5wb3AoKSEuZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVzaChkaXNwb3NhYmxlOiBEaXNwb3NhYmxlKTogRGlzcG9zYWJsZSB7XG4gICAgICAgIGNvbnN0IGRpc3Bvc2FibGVzID0gdGhpcy5kaXNwb3NhYmxlcztcbiAgICAgICAgZGlzcG9zYWJsZXMucHVzaChkaXNwb3NhYmxlKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBkaXNwb3NhYmxlcy5pbmRleE9mKGRpc3Bvc2FibGUpO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgZGlzcG9zYWJsZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxufVxuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjQgVHlwZUZveCBhbmQgb3RoZXJzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTElDRU5TRSBpbiB0aGUgcGFja2FnZSByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbmltcG9ydCB7IERpc3Bvc2FibGUgfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG5pbXBvcnQgdHlwZSB7IElDb25uZWN0aW9uIH0gZnJvbSAnLi4vc2VydmVyL2Nvbm5lY3Rpb24uanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElXZWJTb2NrZXQgZXh0ZW5kcyBEaXNwb3NhYmxlIHtcbiAgICBzZW5kKGNvbnRlbnQ6IHN0cmluZyk6IHZvaWQ7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBvbk1lc3NhZ2UoY2I6IChkYXRhOiBhbnkpID0+IHZvaWQpOiB2b2lkO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgb25FcnJvcihjYjogKHJlYXNvbjogYW55KSA9PiB2b2lkKTogdm9pZDtcbiAgICBvbkNsb3NlKGNiOiAoY29kZTogbnVtYmVyLCByZWFzb246IHN0cmluZykgPT4gdm9pZCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVdlYlNvY2tldENvbm5lY3Rpb24gZXh0ZW5kcyBJQ29ubmVjdGlvbiB7XG4gICAgcmVhZG9ubHkgc29ja2V0OiBJV2ViU29ja2V0O1xufVxuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjQgVHlwZUZveCBhbmQgb3RoZXJzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTElDRU5TRSBpbiB0aGUgcGFja2FnZSByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbmltcG9ydCB7IERpc3Bvc2FibGUgfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG4vLyBUT0RPOiBVc2UgZW52aXJvbm1lbnQtc3BlY2lmaWMgaW1wb3J0cyAodnNjb2RlLWpzb25ycGMvYnJvd3NlciBvciB2c2NvZGUtanNvbnJwYy9ub2RlKVxuLy8gd2hlbiB1cGdyYWRpbmcgdG8gdnNjb2RlLWpzb25ycGNAOS54LngtbmV4dC5YIHdoaWNoIHN1cHBvcnRzIHByb3BlciBleHBvcnQgbWFwc1xuaW1wb3J0IHsgdHlwZSBEYXRhQ2FsbGJhY2ssIEFic3RyYWN0TWVzc2FnZVJlYWRlciwgTWVzc2FnZVJlYWRlciB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcbmltcG9ydCB0eXBlIHsgSVdlYlNvY2tldCB9IGZyb20gJy4vc29ja2V0LmpzJztcblxuZXhwb3J0IGNsYXNzIFdlYlNvY2tldE1lc3NhZ2VSZWFkZXIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VSZWFkZXIgaW1wbGVtZW50cyBNZXNzYWdlUmVhZGVyIHtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgc29ja2V0OiBJV2ViU29ja2V0O1xuICAgIHByb3RlY3RlZCBzdGF0ZTogJ2luaXRpYWwnIHwgJ2xpc3RlbmluZycgfCAnY2xvc2VkJyA9ICdpbml0aWFsJztcbiAgICBwcm90ZWN0ZWQgY2FsbGJhY2s6IERhdGFDYWxsYmFjayB8IHVuZGVmaW5lZDtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHByb3RlY3RlZCByZWFkb25seSBldmVudHM6IEFycmF5PHsgbWVzc2FnZT86IGFueSwgZXJyb3I/OiBhbnkgfT4gPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKHNvY2tldDogSVdlYlNvY2tldCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnNvY2tldCA9IHNvY2tldDtcbiAgICAgICAgdGhpcy5zb2NrZXQub25NZXNzYWdlKG1lc3NhZ2UgPT5cbiAgICAgICAgICAgIHRoaXMucmVhZE1lc3NhZ2UobWVzc2FnZSlcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zb2NrZXQub25FcnJvcihlcnJvciA9PlxuICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc29ja2V0Lm9uQ2xvc2UoKGNvZGUsIHJlYXNvbikgPT4ge1xuICAgICAgICAgICAgaWYgKGNvZGUgIT09IDEwMDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvcjogRXJyb3IgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICcnICsgY29kZSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYEVycm9yIGR1cmluZyBzb2NrZXQgcmVjb25uZWN0OiBjb2RlID0gJHtjb2RlfSwgcmVhc29uID0gJHtyZWFzb259YFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5maXJlQ2xvc2UoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbGlzdGVuKGNhbGxiYWNrOiBEYXRhQ2FsbGJhY2spOiBEaXNwb3NhYmxlIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09ICdpbml0aWFsJykge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9ICdsaXN0ZW5pbmcnO1xuICAgICAgICAgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgICAgICAgd2hpbGUgKHRoaXMuZXZlbnRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gdGhpcy5ldmVudHMucG9wKCkhO1xuICAgICAgICAgICAgICAgIGlmIChldmVudC5tZXNzYWdlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWFkTWVzc2FnZShldmVudC5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXZlbnQuZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZUNsb3NlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkaXNwb3NlOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2FsbGJhY2sgPT09IGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSAnaW5pdGlhbCc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsbGJhY2sgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIG92ZXJyaWRlIGRpc3Bvc2UoKSB7XG4gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9ICdpbml0aWFsJztcbiAgICAgICAgdGhpcy5jYWxsYmFjayA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5ldmVudHMuc3BsaWNlKDAsIHRoaXMuZXZlbnRzLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBwcm90ZWN0ZWQgcmVhZE1lc3NhZ2UobWVzc2FnZTogYW55KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09PSAnaW5pdGlhbCcpIHtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRzLnNwbGljZSgwLCAwLCB7IG1lc3NhZ2UgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZSA9PT0gJ2xpc3RlbmluZycpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjayEoZGF0YSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvcjogRXJyb3IgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICcnICsgNDAwLFxuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgRXJyb3IgZHVyaW5nIG1lc3NhZ2UgcGFyc2luZywgcmVhc29uID0gJHt0eXBlb2YgZXJyID09PSAnb2JqZWN0JyA/IChlcnIgYXMgYW55KS5tZXNzYWdlIDogJ3Vua25vd24nfWBcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIGZpcmVFcnJvcihlcnJvcjogYW55KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09PSAnaW5pdGlhbCcpIHtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRzLnNwbGljZSgwLCAwLCB7IGVycm9yIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUgPT09ICdsaXN0ZW5pbmcnKSB7XG4gICAgICAgICAgICBzdXBlci5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIGZpcmVDbG9zZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09ICdpbml0aWFsJykge1xuICAgICAgICAgICAgdGhpcy5ldmVudHMuc3BsaWNlKDAsIDAsIHt9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlID09PSAnbGlzdGVuaW5nJykge1xuICAgICAgICAgICAgc3VwZXIuZmlyZUNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGF0ZSA9ICdjbG9zZWQnO1xuICAgIH1cbn1cbiIsICIvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSAyMDI0IFR5cGVGb3ggYW5kIG90aGVycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExJQ0VOU0UgaW4gdGhlIHBhY2thZ2Ugcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5pbXBvcnQgeyBNZXNzYWdlIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuaW1wb3J0IHsgQWJzdHJhY3RNZXNzYWdlV3JpdGVyLCBNZXNzYWdlV3JpdGVyIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuaW1wb3J0IHR5cGUgeyBJV2ViU29ja2V0IH0gZnJvbSAnLi9zb2NrZXQuanMnO1xuXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0TWVzc2FnZVdyaXRlciBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVdyaXRlciBpbXBsZW1lbnRzIE1lc3NhZ2VXcml0ZXIge1xuICAgIHByb3RlY3RlZCBlcnJvckNvdW50ID0gMDtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgc29ja2V0OiBJV2ViU29ja2V0O1xuXG4gICAgY29uc3RydWN0b3Ioc29ja2V0OiBJV2ViU29ja2V0KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuc29ja2V0ID0gc29ja2V0O1xuICAgIH1cblxuICAgIGVuZCgpOiB2b2lkIHtcbiAgICB9XG5cbiAgICBhc3luYyB3cml0ZShtc2c6IE1lc3NhZ2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShtc2cpO1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChjb250ZW50KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5lcnJvckNvdW50Kys7XG4gICAgICAgICAgICB0aGlzLmZpcmVFcnJvcihlLCBtc2csIHRoaXMuZXJyb3JDb3VudCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgMjAyNCBUeXBlRm94IGFuZCBvdGhlcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMSUNFTlNFIGluIHRoZSBwYWNrYWdlIHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuaW1wb3J0IHR5cGUgeyBNZXNzYWdlQ29ubmVjdGlvbiwgTG9nZ2VyIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuaW1wb3J0IHsgY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24gfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG5pbXBvcnQgdHlwZSB7IElXZWJTb2NrZXQgfSBmcm9tICcuL3NvY2tldC5qcyc7XG5pbXBvcnQgeyBXZWJTb2NrZXRNZXNzYWdlUmVhZGVyIH0gZnJvbSAnLi9yZWFkZXIuanMnO1xuaW1wb3J0IHsgV2ViU29ja2V0TWVzc2FnZVdyaXRlciB9IGZyb20gJy4vd3JpdGVyLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdlYlNvY2tldENvbm5lY3Rpb24oc29ja2V0OiBJV2ViU29ja2V0LCBsb2dnZXI6IExvZ2dlcik6IE1lc3NhZ2VDb25uZWN0aW9uIHtcbiAgICBjb25zdCBtZXNzYWdlUmVhZGVyID0gbmV3IFdlYlNvY2tldE1lc3NhZ2VSZWFkZXIoc29ja2V0KTtcbiAgICBjb25zdCBtZXNzYWdlV3JpdGVyID0gbmV3IFdlYlNvY2tldE1lc3NhZ2VXcml0ZXIoc29ja2V0KTtcbiAgICBjb25zdCBjb25uZWN0aW9uID0gY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24obWVzc2FnZVJlYWRlciwgbWVzc2FnZVdyaXRlciwgbG9nZ2VyKTtcbiAgICBjb25uZWN0aW9uLm9uQ2xvc2UoKCkgPT4gY29ubmVjdGlvbi5kaXNwb3NlKCkpO1xuICAgIHJldHVybiBjb25uZWN0aW9uO1xufVxuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjQgVHlwZUZveCBhbmQgb3RoZXJzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTElDRU5TRSBpbiB0aGUgcGFja2FnZSByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbmltcG9ydCB0eXBlIHsgTWVzc2FnZUNvbm5lY3Rpb24sIExvZ2dlciB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcbmltcG9ydCB7IGNyZWF0ZVdlYlNvY2tldENvbm5lY3Rpb24gfSBmcm9tICcuL3NvY2tldC9jb25uZWN0aW9uLmpzJztcbmltcG9ydCB0eXBlIHsgSVdlYlNvY2tldCB9IGZyb20gJy4vc29ja2V0L3NvY2tldC5qcyc7XG5pbXBvcnQgeyBDb25zb2xlTG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gbGlzdGVuKG9wdGlvbnM6IHtcbiAgICB3ZWJTb2NrZXQ6IFdlYlNvY2tldDtcbiAgICBsb2dnZXI/OiBMb2dnZXI7XG4gICAgb25Db25uZWN0aW9uOiAoY29ubmVjdGlvbjogTWVzc2FnZUNvbm5lY3Rpb24pID0+IHZvaWQ7XG59KSB7XG4gICAgY29uc3QgeyB3ZWJTb2NrZXQsIG9uQ29ubmVjdGlvbiB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBsb2dnZXIgPSBvcHRpb25zLmxvZ2dlciB8fCBuZXcgQ29uc29sZUxvZ2dlcigpO1xuICAgIHdlYlNvY2tldC5vbm9wZW4gPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNvY2tldCA9IHRvU29ja2V0KHdlYlNvY2tldCk7XG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBjcmVhdGVXZWJTb2NrZXRDb25uZWN0aW9uKHNvY2tldCwgbG9nZ2VyKTtcbiAgICAgICAgb25Db25uZWN0aW9uKGNvbm5lY3Rpb24pO1xuICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1NvY2tldCh3ZWJTb2NrZXQ6IFdlYlNvY2tldCk6IElXZWJTb2NrZXQge1xuICAgIHJldHVybiB7XG4gICAgICAgIHNlbmQ6IGNvbnRlbnQgPT4gd2ViU29ja2V0LnNlbmQoY29udGVudCksXG4gICAgICAgIG9uTWVzc2FnZTogY2IgPT4ge1xuICAgICAgICAgICAgd2ViU29ja2V0Lm9ubWVzc2FnZSA9IGV2ZW50ID0+IGNiKGV2ZW50LmRhdGEpO1xuICAgICAgICB9LFxuICAgICAgICBvbkVycm9yOiBjYiA9PiB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgd2ViU29ja2V0Lm9uZXJyb3IgPSAoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3QuaGFzT3duKGV2ZW50LCAnbWVzc2FnZScpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNiKGV2ZW50Lm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIG9uQ2xvc2U6IGNiID0+IHtcbiAgICAgICAgICAgIHdlYlNvY2tldC5vbmNsb3NlID0gZXZlbnQgPT4gY2IoZXZlbnQuY29kZSwgZXZlbnQucmVhc29uKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGlzcG9zZTogKCkgPT4gd2ViU29ja2V0LmNsb3NlKClcbiAgICB9O1xufVxuIiwgIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAyNiBFY2xpcHNlIERpcmlnaWJsZSBjb250cmlidXRvcnNcbiAqXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGVcbiAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYyLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcbiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYyMC5odG1sXG4gKlxuICogU1BEWC1GaWxlQ29weXJpZ2h0VGV4dDogRWNsaXBzZSBEaXJpZ2libGUgY29udHJpYnV0b3JzIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wXG4gKi9cblxuLyoqXG4gKiBMYXp5IFByb3h5IHNoaW0gZm9yIE1vbmFjbyBFZGl0b3IgbG9hZGVkIHZpYSBBTUQuXG4gKlxuICogZWRpdG9yLmpzIHNldHMgZ2xvYmFsVGhpcy5tb25hY28gaW5zaWRlIHRoZSBBTUQgcmVxdWlyZSgpIGNhbGxiYWNrLCBiZWZvcmUgYW55XG4gKiBKYXZhTHNwQ2xpZW50TGliLmNvbm5lY3QoKSBjYWxsLiBBbGwgcHJvcGVydHkgYWNjZXNzZXMgZ28gdGhyb3VnaCBQcm94eS5nZXQoKSB0cmFwc1xuICogc28gdGhleSByZXNvbHZlIGFnYWluc3QgdGhlIGxpdmUgd2luZG93Lm1vbmFjbyBhdCBjYWxsIHRpbWUsIG5vdCBhdCBidW5kbGUgbG9hZCB0aW1lLlxuICpcbiAqIFR5cGVTY3JpcHQgcmVzb2x2ZXMgdHlwZXMgZnJvbSB0aGUgcmVhbCBtb25hY28tZWRpdG9yIGRldkRlcGVuZGVuY3k7IGVzYnVpbGQgcmVwbGFjZXNcbiAqIHRoZSBcIm1vbmFjby1lZGl0b3JcIiBpbXBvcnQgd2l0aCB0aGlzIGZpbGUgYXQgYnVuZGxlIHRpbWUgdmlhIHRoZSBhbGlhcyBvcHRpb24uXG4gKi9cblxudHlwZSBNID0gdHlwZW9mIGltcG9ydCgnbW9uYWNvLWVkaXRvcicpO1xuXG5mdW5jdGlvbiBtKCk6IE0ge1xuICAgIHJldHVybiAoZ2xvYmFsVGhpcyBhcyBhbnkpLm1vbmFjbyBhcyBNO1xufVxuXG5mdW5jdGlvbiBuczxUIGV4dGVuZHMgb2JqZWN0PihnZXR0ZXI6ICgpID0+IFQpOiBUIHtcbiAgICByZXR1cm4gbmV3IFByb3h5KHt9IGFzIFQsIHtcbiAgICAgICAgZ2V0OiAoXywgaykgPT4gKGdldHRlcigpIGFzIGFueSlbayBhcyBzdHJpbmddLFxuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBjbHM8VD4oZ2V0dGVyOiAoKSA9PiBUKTogVCB7XG4gICAgcmV0dXJuIG5ldyBQcm94eShmdW5jdGlvbiAoKSB7fSBhcyBhbnksIHtcbiAgICAgICAgY29uc3RydWN0OiAoXywgYXJncykgPT4gbmV3IChnZXR0ZXIoKSBhcyBhbnkpKC4uLmFyZ3MpLFxuICAgICAgICBnZXQ6ICAgICAgIChfLCBrKSAgICA9PiAoZ2V0dGVyKCkgYXMgYW55KVtrIGFzIHN0cmluZ10sXG4gICAgfSkgYXMgVDtcbn1cblxuZXhwb3J0IGNvbnN0IGVkaXRvciAgICAgICAgID0gbnMoKCkgPT4gbSgpLmVkaXRvcik7XG5leHBvcnQgY29uc3QgbGFuZ3VhZ2VzICAgICAgPSBucygoKSA9PiBtKCkubGFuZ3VhZ2VzKTtcbmV4cG9ydCBjb25zdCBNYXJrZXJTZXZlcml0eSA9IG5zKCgpID0+IG0oKS5NYXJrZXJTZXZlcml0eSk7XG5leHBvcnQgY29uc3QgTWFya2VyVGFnICAgICAgPSBucygoKSA9PiAobSgpIGFzIGFueSkuTWFya2VyVGFnKTtcbmV4cG9ydCBjb25zdCBVcmkgICAgICAgICAgICA9IGNscygoKSA9PiBtKCkuVXJpKTtcbmV4cG9ydCBjb25zdCBSYW5nZSAgICAgICAgICA9IGNscygoKSA9PiBtKCkuUmFuZ2UpO1xuZXhwb3J0IGNvbnN0IFBvc2l0aW9uICAgICAgID0gY2xzKCgpID0+IG0oKS5Qb3NpdGlvbik7XG5leHBvcnQgY29uc3QgU2VsZWN0aW9uICAgICAgPSBjbHMoKCkgPT4gbSgpLlNlbGVjdGlvbik7XG5leHBvcnQgY29uc3QgS2V5Q29kZSAgICAgICAgPSBucygoKSA9PiBtKCkuS2V5Q29kZSk7XG5leHBvcnQgY29uc3QgS2V5TW9kICAgICAgICAgPSBucygoKSA9PiBtKCkuS2V5TW9kKTtcbiIsICIvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4ndXNlIHN0cmljdCc7XG5leHBvcnQgdmFyIERvY3VtZW50VXJpO1xuKGZ1bmN0aW9uIChEb2N1bWVudFVyaSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnO1xuICAgIH1cbiAgICBEb2N1bWVudFVyaS5pcyA9IGlzO1xufSkoRG9jdW1lbnRVcmkgfHwgKERvY3VtZW50VXJpID0ge30pKTtcbmV4cG9ydCB2YXIgVVJJO1xuKGZ1bmN0aW9uIChVUkkpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJztcbiAgICB9XG4gICAgVVJJLmlzID0gaXM7XG59KShVUkkgfHwgKFVSSSA9IHt9KSk7XG5leHBvcnQgdmFyIGludGVnZXI7XG4oZnVuY3Rpb24gKGludGVnZXIpIHtcbiAgICBpbnRlZ2VyLk1JTl9WQUxVRSA9IC0yMTQ3NDgzNjQ4O1xuICAgIGludGVnZXIuTUFYX1ZBTFVFID0gMjE0NzQ4MzY0NztcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBpbnRlZ2VyLk1JTl9WQUxVRSA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSBpbnRlZ2VyLk1BWF9WQUxVRTtcbiAgICB9XG4gICAgaW50ZWdlci5pcyA9IGlzO1xufSkoaW50ZWdlciB8fCAoaW50ZWdlciA9IHt9KSk7XG5leHBvcnQgdmFyIHVpbnRlZ2VyO1xuKGZ1bmN0aW9uICh1aW50ZWdlcikge1xuICAgIHVpbnRlZ2VyLk1JTl9WQUxVRSA9IDA7XG4gICAgdWludGVnZXIuTUFYX1ZBTFVFID0gMjE0NzQ4MzY0NztcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiB1aW50ZWdlci5NSU5fVkFMVUUgPD0gdmFsdWUgJiYgdmFsdWUgPD0gdWludGVnZXIuTUFYX1ZBTFVFO1xuICAgIH1cbiAgICB1aW50ZWdlci5pcyA9IGlzO1xufSkodWludGVnZXIgfHwgKHVpbnRlZ2VyID0ge30pKTtcbi8qKlxuICogVGhlIFBvc2l0aW9uIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIFBvc2l0aW9ufSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBQb3NpdGlvbjtcbihmdW5jdGlvbiAoUG9zaXRpb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFBvc2l0aW9uIGxpdGVyYWwgZnJvbSB0aGUgZ2l2ZW4gbGluZSBhbmQgY2hhcmFjdGVyLlxuICAgICAqIEBwYXJhbSBsaW5lIFRoZSBwb3NpdGlvbidzIGxpbmUuXG4gICAgICogQHBhcmFtIGNoYXJhY3RlciBUaGUgcG9zaXRpb24ncyBjaGFyYWN0ZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGxpbmUsIGNoYXJhY3Rlcikge1xuICAgICAgICBpZiAobGluZSA9PT0gTnVtYmVyLk1BWF9WQUxVRSkge1xuICAgICAgICAgICAgbGluZSA9IHVpbnRlZ2VyLk1BWF9WQUxVRTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhcmFjdGVyID09PSBOdW1iZXIuTUFYX1ZBTFVFKSB7XG4gICAgICAgICAgICBjaGFyYWN0ZXIgPSB1aW50ZWdlci5NQVhfVkFMVUU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgbGluZSwgY2hhcmFjdGVyIH07XG4gICAgfVxuICAgIFBvc2l0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIFBvc2l0aW9ufSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS5saW5lKSAmJiBJcy51aW50ZWdlcihjYW5kaWRhdGUuY2hhcmFjdGVyKTtcbiAgICB9XG4gICAgUG9zaXRpb24uaXMgPSBpcztcbn0pKFBvc2l0aW9uIHx8IChQb3NpdGlvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBSYW5nZSBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBSYW5nZX0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgUmFuZ2U7XG4oZnVuY3Rpb24gKFJhbmdlKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKG9uZSwgdHdvLCB0aHJlZSwgZm91cikge1xuICAgICAgICBpZiAoSXMudWludGVnZXIob25lKSAmJiBJcy51aW50ZWdlcih0d28pICYmIElzLnVpbnRlZ2VyKHRocmVlKSAmJiBJcy51aW50ZWdlcihmb3VyKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IFBvc2l0aW9uLmNyZWF0ZShvbmUsIHR3byksIGVuZDogUG9zaXRpb24uY3JlYXRlKHRocmVlLCBmb3VyKSB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKFBvc2l0aW9uLmlzKG9uZSkgJiYgUG9zaXRpb24uaXModHdvKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IG9uZSwgZW5kOiB0d28gfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmFuZ2UjY3JlYXRlIGNhbGxlZCB3aXRoIGludmFsaWQgYXJndW1lbnRzWyR7b25lfSwgJHt0d299LCAke3RocmVlfSwgJHtmb3VyfV1gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBSYW5nZS5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBSYW5nZX0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBQb3NpdGlvbi5pcyhjYW5kaWRhdGUuc3RhcnQpICYmIFBvc2l0aW9uLmlzKGNhbmRpZGF0ZS5lbmQpO1xuICAgIH1cbiAgICBSYW5nZS5pcyA9IGlzO1xufSkoUmFuZ2UgfHwgKFJhbmdlID0ge30pKTtcbi8qKlxuICogVGhlIExvY2F0aW9uIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIExvY2F0aW9ufSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBMb2NhdGlvbjtcbihmdW5jdGlvbiAoTG9jYXRpb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgTG9jYXRpb24gbGl0ZXJhbC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSBsb2NhdGlvbidzIHVyaS5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIGxvY2F0aW9uJ3MgcmFuZ2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHVyaSwgcmFuZ2UpIHtcbiAgICAgICAgcmV0dXJuIHsgdXJpLCByYW5nZSB9O1xuICAgIH1cbiAgICBMb2NhdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBMb2NhdGlvbn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIChJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSkgfHwgSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS51cmkpKTtcbiAgICB9XG4gICAgTG9jYXRpb24uaXMgPSBpcztcbn0pKExvY2F0aW9uIHx8IChMb2NhdGlvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBMb2NhdGlvbkxpbmsgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgTG9jYXRpb25MaW5rfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBMb2NhdGlvbkxpbms7XG4oZnVuY3Rpb24gKExvY2F0aW9uTGluaykge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBMb2NhdGlvbkxpbmsgbGl0ZXJhbC5cbiAgICAgKiBAcGFyYW0gdGFyZ2V0VXJpIFRoZSBkZWZpbml0aW9uJ3MgdXJpLlxuICAgICAqIEBwYXJhbSB0YXJnZXRSYW5nZSBUaGUgZnVsbCByYW5nZSBvZiB0aGUgZGVmaW5pdGlvbi5cbiAgICAgKiBAcGFyYW0gdGFyZ2V0U2VsZWN0aW9uUmFuZ2UgVGhlIHNwYW4gb2YgdGhlIHN5bWJvbCBkZWZpbml0aW9uIGF0IHRoZSB0YXJnZXQuXG4gICAgICogQHBhcmFtIG9yaWdpblNlbGVjdGlvblJhbmdlIFRoZSBzcGFuIG9mIHRoZSBzeW1ib2wgYmVpbmcgZGVmaW5lZCBpbiB0aGUgb3JpZ2luYXRpbmcgc291cmNlIGZpbGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHRhcmdldFVyaSwgdGFyZ2V0UmFuZ2UsIHRhcmdldFNlbGVjdGlvblJhbmdlLCBvcmlnaW5TZWxlY3Rpb25SYW5nZSkge1xuICAgICAgICByZXR1cm4geyB0YXJnZXRVcmksIHRhcmdldFJhbmdlLCB0YXJnZXRTZWxlY3Rpb25SYW5nZSwgb3JpZ2luU2VsZWN0aW9uUmFuZ2UgfTtcbiAgICB9XG4gICAgTG9jYXRpb25MaW5rLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIExvY2F0aW9uTGlua30gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUudGFyZ2V0UmFuZ2UpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudGFyZ2V0VXJpKVxuICAgICAgICAgICAgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnRhcmdldFNlbGVjdGlvblJhbmdlKVxuICAgICAgICAgICAgJiYgKFJhbmdlLmlzKGNhbmRpZGF0ZS5vcmlnaW5TZWxlY3Rpb25SYW5nZSkgfHwgSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5vcmlnaW5TZWxlY3Rpb25SYW5nZSkpO1xuICAgIH1cbiAgICBMb2NhdGlvbkxpbmsuaXMgPSBpcztcbn0pKExvY2F0aW9uTGluayB8fCAoTG9jYXRpb25MaW5rID0ge30pKTtcbi8qKlxuICogVGhlIENvbG9yIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIENvbG9yfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBDb2xvcjtcbihmdW5jdGlvbiAoQ29sb3IpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENvbG9yIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZWQsXG4gICAgICAgICAgICBncmVlbixcbiAgICAgICAgICAgIGJsdWUsXG4gICAgICAgICAgICBhbHBoYSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgQ29sb3IuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgQ29sb3J9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBJcy5udW1iZXJSYW5nZShjYW5kaWRhdGUucmVkLCAwLCAxKVxuICAgICAgICAgICAgJiYgSXMubnVtYmVyUmFuZ2UoY2FuZGlkYXRlLmdyZWVuLCAwLCAxKVxuICAgICAgICAgICAgJiYgSXMubnVtYmVyUmFuZ2UoY2FuZGlkYXRlLmJsdWUsIDAsIDEpXG4gICAgICAgICAgICAmJiBJcy5udW1iZXJSYW5nZShjYW5kaWRhdGUuYWxwaGEsIDAsIDEpO1xuICAgIH1cbiAgICBDb2xvci5pcyA9IGlzO1xufSkoQ29sb3IgfHwgKENvbG9yID0ge30pKTtcbi8qKlxuICogVGhlIENvbG9ySW5mb3JtYXRpb24gbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgQ29sb3JJbmZvcm1hdGlvbn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgQ29sb3JJbmZvcm1hdGlvbjtcbihmdW5jdGlvbiAoQ29sb3JJbmZvcm1hdGlvbikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ29sb3JJbmZvcm1hdGlvbiBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgY29sb3IpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJhbmdlLFxuICAgICAgICAgICAgY29sb3IsXG4gICAgICAgIH07XG4gICAgfVxuICAgIENvbG9ySW5mb3JtYXRpb24uY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgQ29sb3JJbmZvcm1hdGlvbn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgQ29sb3IuaXMoY2FuZGlkYXRlLmNvbG9yKTtcbiAgICB9XG4gICAgQ29sb3JJbmZvcm1hdGlvbi5pcyA9IGlzO1xufSkoQ29sb3JJbmZvcm1hdGlvbiB8fCAoQ29sb3JJbmZvcm1hdGlvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb2xvciBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBDb2xvclByZXNlbnRhdGlvbn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgQ29sb3JQcmVzZW50YXRpb247XG4oZnVuY3Rpb24gKENvbG9yUHJlc2VudGF0aW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDb2xvckluZm9ybWF0aW9uIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGxhYmVsLCB0ZXh0RWRpdCwgYWRkaXRpb25hbFRleHRFZGl0cykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICB0ZXh0RWRpdCxcbiAgICAgICAgICAgIGFkZGl0aW9uYWxUZXh0RWRpdHMsXG4gICAgICAgIH07XG4gICAgfVxuICAgIENvbG9yUHJlc2VudGF0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIENvbG9ySW5mb3JtYXRpb259IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLmxhYmVsKVxuICAgICAgICAgICAgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUudGV4dEVkaXQpIHx8IFRleHRFZGl0LmlzKGNhbmRpZGF0ZSkpXG4gICAgICAgICAgICAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5hZGRpdGlvbmFsVGV4dEVkaXRzKSB8fCBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS5hZGRpdGlvbmFsVGV4dEVkaXRzLCBUZXh0RWRpdC5pcykpO1xuICAgIH1cbiAgICBDb2xvclByZXNlbnRhdGlvbi5pcyA9IGlzO1xufSkoQ29sb3JQcmVzZW50YXRpb24gfHwgKENvbG9yUHJlc2VudGF0aW9uID0ge30pKTtcbi8qKlxuICogQSBzZXQgb2YgcHJlZGVmaW5lZCByYW5nZSBraW5kcy5cbiAqL1xuZXhwb3J0IHZhciBGb2xkaW5nUmFuZ2VLaW5kO1xuKGZ1bmN0aW9uIChGb2xkaW5nUmFuZ2VLaW5kKSB7XG4gICAgLyoqXG4gICAgICogRm9sZGluZyByYW5nZSBmb3IgYSBjb21tZW50XG4gICAgICovXG4gICAgRm9sZGluZ1JhbmdlS2luZC5Db21tZW50ID0gJ2NvbW1lbnQnO1xuICAgIC8qKlxuICAgICAqIEZvbGRpbmcgcmFuZ2UgZm9yIGFuIGltcG9ydCBvciBpbmNsdWRlXG4gICAgICovXG4gICAgRm9sZGluZ1JhbmdlS2luZC5JbXBvcnRzID0gJ2ltcG9ydHMnO1xuICAgIC8qKlxuICAgICAqIEZvbGRpbmcgcmFuZ2UgZm9yIGEgcmVnaW9uIChlLmcuIGAjcmVnaW9uYClcbiAgICAgKi9cbiAgICBGb2xkaW5nUmFuZ2VLaW5kLlJlZ2lvbiA9ICdyZWdpb24nO1xufSkoRm9sZGluZ1JhbmdlS2luZCB8fCAoRm9sZGluZ1JhbmdlS2luZCA9IHt9KSk7XG4vKipcbiAqIFRoZSBmb2xkaW5nIHJhbmdlIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIEZvbGRpbmdSYW5nZX0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgRm9sZGluZ1JhbmdlO1xuKGZ1bmN0aW9uIChGb2xkaW5nUmFuZ2UpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IEZvbGRpbmdSYW5nZSBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShzdGFydExpbmUsIGVuZExpbmUsIHN0YXJ0Q2hhcmFjdGVyLCBlbmRDaGFyYWN0ZXIsIGtpbmQsIGNvbGxhcHNlZFRleHQpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgc3RhcnRMaW5lLFxuICAgICAgICAgICAgZW5kTGluZVxuICAgICAgICB9O1xuICAgICAgICBpZiAoSXMuZGVmaW5lZChzdGFydENoYXJhY3RlcikpIHtcbiAgICAgICAgICAgIHJlc3VsdC5zdGFydENoYXJhY3RlciA9IHN0YXJ0Q2hhcmFjdGVyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKGVuZENoYXJhY3RlcikpIHtcbiAgICAgICAgICAgIHJlc3VsdC5lbmRDaGFyYWN0ZXIgPSBlbmRDaGFyYWN0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzLmRlZmluZWQoa2luZCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5raW5kID0ga2luZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXMuZGVmaW5lZChjb2xsYXBzZWRUZXh0KSkge1xuICAgICAgICAgICAgcmVzdWx0LmNvbGxhcHNlZFRleHQgPSBjb2xsYXBzZWRUZXh0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIEZvbGRpbmdSYW5nZS5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBGb2xkaW5nUmFuZ2V9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBJcy51aW50ZWdlcihjYW5kaWRhdGUuc3RhcnRMaW5lKSAmJiBJcy51aW50ZWdlcihjYW5kaWRhdGUuc3RhcnRMaW5lKVxuICAgICAgICAgICAgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUuc3RhcnRDaGFyYWN0ZXIpIHx8IElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS5zdGFydENoYXJhY3RlcikpXG4gICAgICAgICAgICAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5lbmRDaGFyYWN0ZXIpIHx8IElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS5lbmRDaGFyYWN0ZXIpKVxuICAgICAgICAgICAgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUua2luZCkgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS5raW5kKSk7XG4gICAgfVxuICAgIEZvbGRpbmdSYW5nZS5pcyA9IGlzO1xufSkoRm9sZGluZ1JhbmdlIHx8IChGb2xkaW5nUmFuZ2UgPSB7fSkpO1xuLyoqXG4gKiBUaGUgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbiBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9ufSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uO1xuKGZ1bmN0aW9uIChEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGxvY2F0aW9uLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgICAgIG1lc3NhZ2VcbiAgICAgICAgfTtcbiAgICB9XG4gICAgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9ufSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIExvY2F0aW9uLmlzKGNhbmRpZGF0ZS5sb2NhdGlvbikgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5tZXNzYWdlKTtcbiAgICB9XG4gICAgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbi5pcyA9IGlzO1xufSkoRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbiB8fCAoRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBkaWFnbm9zdGljJ3Mgc2V2ZXJpdHkuXG4gKi9cbmV4cG9ydCB2YXIgRGlhZ25vc3RpY1NldmVyaXR5O1xuKGZ1bmN0aW9uIChEaWFnbm9zdGljU2V2ZXJpdHkpIHtcbiAgICAvKipcbiAgICAgKiBSZXBvcnRzIGFuIGVycm9yLlxuICAgICAqL1xuICAgIERpYWdub3N0aWNTZXZlcml0eS5FcnJvciA9IDE7XG4gICAgLyoqXG4gICAgICogUmVwb3J0cyBhIHdhcm5pbmcuXG4gICAgICovXG4gICAgRGlhZ25vc3RpY1NldmVyaXR5Lldhcm5pbmcgPSAyO1xuICAgIC8qKlxuICAgICAqIFJlcG9ydHMgYW4gaW5mb3JtYXRpb24uXG4gICAgICovXG4gICAgRGlhZ25vc3RpY1NldmVyaXR5LkluZm9ybWF0aW9uID0gMztcbiAgICAvKipcbiAgICAgKiBSZXBvcnRzIGEgaGludC5cbiAgICAgKi9cbiAgICBEaWFnbm9zdGljU2V2ZXJpdHkuSGludCA9IDQ7XG59KShEaWFnbm9zdGljU2V2ZXJpdHkgfHwgKERpYWdub3N0aWNTZXZlcml0eSA9IHt9KSk7XG4vKipcbiAqIFRoZSBkaWFnbm9zdGljIHRhZ3MuXG4gKlxuICogQHNpbmNlIDMuMTUuMFxuICovXG5leHBvcnQgdmFyIERpYWdub3N0aWNUYWc7XG4oZnVuY3Rpb24gKERpYWdub3N0aWNUYWcpIHtcbiAgICAvKipcbiAgICAgKiBVbnVzZWQgb3IgdW5uZWNlc3NhcnkgY29kZS5cbiAgICAgKlxuICAgICAqIENsaWVudHMgYXJlIGFsbG93ZWQgdG8gcmVuZGVyIGRpYWdub3N0aWNzIHdpdGggdGhpcyB0YWcgZmFkZWQgb3V0IGluc3RlYWQgb2YgaGF2aW5nXG4gICAgICogYW4gZXJyb3Igc3F1aWdnbGUuXG4gICAgICovXG4gICAgRGlhZ25vc3RpY1RhZy5Vbm5lY2Vzc2FyeSA9IDE7XG4gICAgLyoqXG4gICAgICogRGVwcmVjYXRlZCBvciBvYnNvbGV0ZSBjb2RlLlxuICAgICAqXG4gICAgICogQ2xpZW50cyBhcmUgYWxsb3dlZCB0byByZW5kZXJlZCBkaWFnbm9zdGljcyB3aXRoIHRoaXMgdGFnIHN0cmlrZSB0aHJvdWdoLlxuICAgICAqL1xuICAgIERpYWdub3N0aWNUYWcuRGVwcmVjYXRlZCA9IDI7XG59KShEaWFnbm9zdGljVGFnIHx8IChEaWFnbm9zdGljVGFnID0ge30pKTtcbi8qKlxuICogVGhlIENvZGVEZXNjcmlwdGlvbiBuYW1lc3BhY2UgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCBkZXNjcmlwdGlvbnMgZm9yIGRpYWdub3N0aWMgY29kZXMuXG4gKlxuICogQHNpbmNlIDMuMTYuMFxuICovXG5leHBvcnQgdmFyIENvZGVEZXNjcmlwdGlvbjtcbihmdW5jdGlvbiAoQ29kZURlc2NyaXB0aW9uKSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5ocmVmKTtcbiAgICB9XG4gICAgQ29kZURlc2NyaXB0aW9uLmlzID0gaXM7XG59KShDb2RlRGVzY3JpcHRpb24gfHwgKENvZGVEZXNjcmlwdGlvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBEaWFnbm9zdGljIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIERpYWdub3N0aWN9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIERpYWdub3N0aWM7XG4oZnVuY3Rpb24gKERpYWdub3N0aWMpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IERpYWdub3N0aWMgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIG1lc3NhZ2UsIHNldmVyaXR5LCBjb2RlLCBzb3VyY2UsIHJlbGF0ZWRJbmZvcm1hdGlvbikge1xuICAgICAgICBsZXQgcmVzdWx0ID0geyByYW5nZSwgbWVzc2FnZSB9O1xuICAgICAgICBpZiAoSXMuZGVmaW5lZChzZXZlcml0eSkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5zZXZlcml0eSA9IHNldmVyaXR5O1xuICAgICAgICB9XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKGNvZGUpKSB7XG4gICAgICAgICAgICByZXN1bHQuY29kZSA9IGNvZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzLmRlZmluZWQoc291cmNlKSkge1xuICAgICAgICAgICAgcmVzdWx0LnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXMuZGVmaW5lZChyZWxhdGVkSW5mb3JtYXRpb24pKSB7XG4gICAgICAgICAgICByZXN1bHQucmVsYXRlZEluZm9ybWF0aW9uID0gcmVsYXRlZEluZm9ybWF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIERpYWdub3N0aWMuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgRGlhZ25vc3RpY30gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpXG4gICAgICAgICAgICAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpXG4gICAgICAgICAgICAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLm1lc3NhZ2UpXG4gICAgICAgICAgICAmJiAoSXMubnVtYmVyKGNhbmRpZGF0ZS5zZXZlcml0eSkgfHwgSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5zZXZlcml0eSkpXG4gICAgICAgICAgICAmJiAoSXMuaW50ZWdlcihjYW5kaWRhdGUuY29kZSkgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS5jb2RlKSB8fCBJcy51bmRlZmluZWQoY2FuZGlkYXRlLmNvZGUpKVxuICAgICAgICAgICAgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUuY29kZURlc2NyaXB0aW9uKSB8fCAoSXMuc3RyaW5nKChfYSA9IGNhbmRpZGF0ZS5jb2RlRGVzY3JpcHRpb24pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5ocmVmKSkpXG4gICAgICAgICAgICAmJiAoSXMuc3RyaW5nKGNhbmRpZGF0ZS5zb3VyY2UpIHx8IElzLnVuZGVmaW5lZChjYW5kaWRhdGUuc291cmNlKSlcbiAgICAgICAgICAgICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLnJlbGF0ZWRJbmZvcm1hdGlvbikgfHwgSXMudHlwZWRBcnJheShjYW5kaWRhdGUucmVsYXRlZEluZm9ybWF0aW9uLCBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uLmlzKSk7XG4gICAgfVxuICAgIERpYWdub3N0aWMuaXMgPSBpcztcbn0pKERpYWdub3N0aWMgfHwgKERpYWdub3N0aWMgPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29tbWFuZCBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBDb21tYW5kfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBDb21tYW5kO1xuKGZ1bmN0aW9uIChDb21tYW5kKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDb21tYW5kIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHRpdGxlLCBjb21tYW5kLCAuLi5hcmdzKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IHRpdGxlLCBjb21tYW5kIH07XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKGFyZ3MpICYmIGFyZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmVzdWx0LmFyZ3VtZW50cyA9IGFyZ3M7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgQ29tbWFuZC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBDb21tYW5kfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudGl0bGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUuY29tbWFuZCk7XG4gICAgfVxuICAgIENvbW1hbmQuaXMgPSBpcztcbn0pKENvbW1hbmQgfHwgKENvbW1hbmQgPSB7fSkpO1xuLyoqXG4gKiBUaGUgVGV4dEVkaXQgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgcmVwbGFjZSxcbiAqIGluc2VydCBhbmQgZGVsZXRlIGVkaXRzIG1vcmUgZWFzaWx5LlxuICovXG5leHBvcnQgdmFyIFRleHRFZGl0O1xuKGZ1bmN0aW9uIChUZXh0RWRpdCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSByZXBsYWNlIHRleHQgZWRpdC5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlIG9mIHRleHQgdG8gYmUgcmVwbGFjZWQuXG4gICAgICogQHBhcmFtIG5ld1RleHQgVGhlIG5ldyB0ZXh0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlcGxhY2UocmFuZ2UsIG5ld1RleHQpIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIG5ld1RleHQgfTtcbiAgICB9XG4gICAgVGV4dEVkaXQucmVwbGFjZSA9IHJlcGxhY2U7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnNlcnQgdGV4dCBlZGl0LlxuICAgICAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgcG9zaXRpb24gdG8gaW5zZXJ0IHRoZSB0ZXh0IGF0LlxuICAgICAqIEBwYXJhbSBuZXdUZXh0IFRoZSB0ZXh0IHRvIGJlIGluc2VydGVkLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluc2VydChwb3NpdGlvbiwgbmV3VGV4dCkge1xuICAgICAgICByZXR1cm4geyByYW5nZTogeyBzdGFydDogcG9zaXRpb24sIGVuZDogcG9zaXRpb24gfSwgbmV3VGV4dCB9O1xuICAgIH1cbiAgICBUZXh0RWRpdC5pbnNlcnQgPSBpbnNlcnQ7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGRlbGV0ZSB0ZXh0IGVkaXQuXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSBvZiB0ZXh0IHRvIGJlIGRlbGV0ZWQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZGVsKHJhbmdlKSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCBuZXdUZXh0OiAnJyB9O1xuICAgIH1cbiAgICBUZXh0RWRpdC5kZWwgPSBkZWw7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSlcbiAgICAgICAgICAgICYmIElzLnN0cmluZyhjYW5kaWRhdGUubmV3VGV4dClcbiAgICAgICAgICAgICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSk7XG4gICAgfVxuICAgIFRleHRFZGl0LmlzID0gaXM7XG59KShUZXh0RWRpdCB8fCAoVGV4dEVkaXQgPSB7fSkpO1xuZXhwb3J0IHZhciBDaGFuZ2VBbm5vdGF0aW9uO1xuKGZ1bmN0aW9uIChDaGFuZ2VBbm5vdGF0aW9uKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKGxhYmVsLCBuZWVkc0NvbmZpcm1hdGlvbiwgZGVzY3JpcHRpb24pIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0geyBsYWJlbCB9O1xuICAgICAgICBpZiAobmVlZHNDb25maXJtYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0Lm5lZWRzQ29uZmlybWF0aW9uID0gbmVlZHNDb25maXJtYXRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIENoYW5nZUFubm90YXRpb24uY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUubGFiZWwpICYmXG4gICAgICAgICAgICAoSXMuYm9vbGVhbihjYW5kaWRhdGUubmVlZHNDb25maXJtYXRpb24pIHx8IGNhbmRpZGF0ZS5uZWVkc0NvbmZpcm1hdGlvbiA9PT0gdW5kZWZpbmVkKSAmJlxuICAgICAgICAgICAgKElzLnN0cmluZyhjYW5kaWRhdGUuZGVzY3JpcHRpb24pIHx8IGNhbmRpZGF0ZS5kZXNjcmlwdGlvbiA9PT0gdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgQ2hhbmdlQW5ub3RhdGlvbi5pcyA9IGlzO1xufSkoQ2hhbmdlQW5ub3RhdGlvbiB8fCAoQ2hhbmdlQW5ub3RhdGlvbiA9IHt9KSk7XG5leHBvcnQgdmFyIENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyO1xuKGZ1bmN0aW9uIChDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuc3RyaW5nKGNhbmRpZGF0ZSk7XG4gICAgfVxuICAgIENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzID0gaXM7XG59KShDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllciB8fCAoQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIgPSB7fSkpO1xuZXhwb3J0IHZhciBBbm5vdGF0ZWRUZXh0RWRpdDtcbihmdW5jdGlvbiAoQW5ub3RhdGVkVGV4dEVkaXQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFubm90YXRlZCByZXBsYWNlIHRleHQgZWRpdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2Ugb2YgdGV4dCB0byBiZSByZXBsYWNlZC5cbiAgICAgKiBAcGFyYW0gbmV3VGV4dCBUaGUgbmV3IHRleHQuXG4gICAgICogQHBhcmFtIGFubm90YXRpb24gVGhlIGFubm90YXRpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVwbGFjZShyYW5nZSwgbmV3VGV4dCwgYW5ub3RhdGlvbikge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgbmV3VGV4dCwgYW5ub3RhdGlvbklkOiBhbm5vdGF0aW9uIH07XG4gICAgfVxuICAgIEFubm90YXRlZFRleHRFZGl0LnJlcGxhY2UgPSByZXBsYWNlO1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYW5ub3RhdGVkIGluc2VydCB0ZXh0IGVkaXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIHBvc2l0aW9uIHRvIGluc2VydCB0aGUgdGV4dCBhdC5cbiAgICAgKiBAcGFyYW0gbmV3VGV4dCBUaGUgdGV4dCB0byBiZSBpbnNlcnRlZC5cbiAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiBUaGUgYW5ub3RhdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbnNlcnQocG9zaXRpb24sIG5ld1RleHQsIGFubm90YXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2U6IHsgc3RhcnQ6IHBvc2l0aW9uLCBlbmQ6IHBvc2l0aW9uIH0sIG5ld1RleHQsIGFubm90YXRpb25JZDogYW5ub3RhdGlvbiB9O1xuICAgIH1cbiAgICBBbm5vdGF0ZWRUZXh0RWRpdC5pbnNlcnQgPSBpbnNlcnQ7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhbm5vdGF0ZWQgZGVsZXRlIHRleHQgZWRpdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2Ugb2YgdGV4dCB0byBiZSBkZWxldGVkLlxuICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIFRoZSBhbm5vdGF0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRlbChyYW5nZSwgYW5ub3RhdGlvbikge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgbmV3VGV4dDogJycsIGFubm90YXRpb25JZDogYW5ub3RhdGlvbiB9O1xuICAgIH1cbiAgICBBbm5vdGF0ZWRUZXh0RWRpdC5kZWwgPSBkZWw7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBUZXh0RWRpdC5pcyhjYW5kaWRhdGUpICYmIChDaGFuZ2VBbm5vdGF0aW9uLmlzKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQpIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQpKTtcbiAgICB9XG4gICAgQW5ub3RhdGVkVGV4dEVkaXQuaXMgPSBpcztcbn0pKEFubm90YXRlZFRleHRFZGl0IHx8IChBbm5vdGF0ZWRUZXh0RWRpdCA9IHt9KSk7XG4vKipcbiAqIFRoZSBUZXh0RG9jdW1lbnRFZGl0IG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlXG4gKiBhbiBlZGl0IHRoYXQgbWFuaXB1bGF0ZXMgYSB0ZXh0IGRvY3VtZW50LlxuICovXG5leHBvcnQgdmFyIFRleHREb2N1bWVudEVkaXQ7XG4oZnVuY3Rpb24gKFRleHREb2N1bWVudEVkaXQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGBUZXh0RG9jdW1lbnRFZGl0YFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh0ZXh0RG9jdW1lbnQsIGVkaXRzKSB7XG4gICAgICAgIHJldHVybiB7IHRleHREb2N1bWVudCwgZWRpdHMgfTtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50RWRpdC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpXG4gICAgICAgICAgICAmJiBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIuaXMoY2FuZGlkYXRlLnRleHREb2N1bWVudClcbiAgICAgICAgICAgICYmIEFycmF5LmlzQXJyYXkoY2FuZGlkYXRlLmVkaXRzKTtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50RWRpdC5pcyA9IGlzO1xufSkoVGV4dERvY3VtZW50RWRpdCB8fCAoVGV4dERvY3VtZW50RWRpdCA9IHt9KSk7XG5leHBvcnQgdmFyIENyZWF0ZUZpbGU7XG4oZnVuY3Rpb24gKENyZWF0ZUZpbGUpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUodXJpLCBvcHRpb25zLCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7XG4gICAgICAgICAgICBraW5kOiAnY3JlYXRlJyxcbiAgICAgICAgICAgIHVyaVxuICAgICAgICB9O1xuICAgICAgICBpZiAob3B0aW9ucyAhPT0gdW5kZWZpbmVkICYmIChvcHRpb25zLm92ZXJ3cml0ZSAhPT0gdW5kZWZpbmVkIHx8IG9wdGlvbnMuaWdub3JlSWZFeGlzdHMgIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgfVxuICAgICAgICBpZiAoYW5ub3RhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQuYW5ub3RhdGlvbklkID0gYW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBDcmVhdGVGaWxlLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgY2FuZGlkYXRlLmtpbmQgPT09ICdjcmVhdGUnICYmIElzLnN0cmluZyhjYW5kaWRhdGUudXJpKSAmJiAoY2FuZGlkYXRlLm9wdGlvbnMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgKChjYW5kaWRhdGUub3B0aW9ucy5vdmVyd3JpdGUgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5vcHRpb25zLm92ZXJ3cml0ZSkpICYmIChjYW5kaWRhdGUub3B0aW9ucy5pZ25vcmVJZkV4aXN0cyA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLm9wdGlvbnMuaWdub3JlSWZFeGlzdHMpKSkpICYmIChjYW5kaWRhdGUuYW5ub3RhdGlvbklkID09PSB1bmRlZmluZWQgfHwgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoY2FuZGlkYXRlLmFubm90YXRpb25JZCkpO1xuICAgIH1cbiAgICBDcmVhdGVGaWxlLmlzID0gaXM7XG59KShDcmVhdGVGaWxlIHx8IChDcmVhdGVGaWxlID0ge30pKTtcbmV4cG9ydCB2YXIgUmVuYW1lRmlsZTtcbihmdW5jdGlvbiAoUmVuYW1lRmlsZSkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShvbGRVcmksIG5ld1VyaSwgb3B0aW9ucywgYW5ub3RhdGlvbikge1xuICAgICAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgICAgICAga2luZDogJ3JlbmFtZScsXG4gICAgICAgICAgICBvbGRVcmksXG4gICAgICAgICAgICBuZXdVcmlcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKG9wdGlvbnMgIT09IHVuZGVmaW5lZCAmJiAob3B0aW9ucy5vdmVyd3JpdGUgIT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLmlnbm9yZUlmRXhpc3RzICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICByZXN1bHQub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFubm90YXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmFubm90YXRpb25JZCA9IGFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgUmVuYW1lRmlsZS5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIGNhbmRpZGF0ZS5raW5kID09PSAncmVuYW1lJyAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLm9sZFVyaSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5uZXdVcmkpICYmIChjYW5kaWRhdGUub3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAoKGNhbmRpZGF0ZS5vcHRpb25zLm92ZXJ3cml0ZSA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLm9wdGlvbnMub3ZlcndyaXRlKSkgJiYgKGNhbmRpZGF0ZS5vcHRpb25zLmlnbm9yZUlmRXhpc3RzID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUub3B0aW9ucy5pZ25vcmVJZkV4aXN0cykpKSkgJiYgKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQgPT09IHVuZGVmaW5lZCB8fCBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhjYW5kaWRhdGUuYW5ub3RhdGlvbklkKSk7XG4gICAgfVxuICAgIFJlbmFtZUZpbGUuaXMgPSBpcztcbn0pKFJlbmFtZUZpbGUgfHwgKFJlbmFtZUZpbGUgPSB7fSkpO1xuZXhwb3J0IHZhciBEZWxldGVGaWxlO1xuKGZ1bmN0aW9uIChEZWxldGVGaWxlKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKHVyaSwgb3B0aW9ucywgYW5ub3RhdGlvbikge1xuICAgICAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgICAgICAga2luZDogJ2RlbGV0ZScsXG4gICAgICAgICAgICB1cmlcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKG9wdGlvbnMgIT09IHVuZGVmaW5lZCAmJiAob3B0aW9ucy5yZWN1cnNpdmUgIT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLmlnbm9yZUlmTm90RXhpc3RzICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICByZXN1bHQub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFubm90YXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmFubm90YXRpb25JZCA9IGFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgRGVsZXRlRmlsZS5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIGNhbmRpZGF0ZS5raW5kID09PSAnZGVsZXRlJyAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSkgJiYgKGNhbmRpZGF0ZS5vcHRpb25zID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICgoY2FuZGlkYXRlLm9wdGlvbnMucmVjdXJzaXZlID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUub3B0aW9ucy5yZWN1cnNpdmUpKSAmJiAoY2FuZGlkYXRlLm9wdGlvbnMuaWdub3JlSWZOb3RFeGlzdHMgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5vcHRpb25zLmlnbm9yZUlmTm90RXhpc3RzKSkpKSAmJiAoY2FuZGlkYXRlLmFubm90YXRpb25JZCA9PT0gdW5kZWZpbmVkIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQpKTtcbiAgICB9XG4gICAgRGVsZXRlRmlsZS5pcyA9IGlzO1xufSkoRGVsZXRlRmlsZSB8fCAoRGVsZXRlRmlsZSA9IHt9KSk7XG5leHBvcnQgdmFyIFdvcmtzcGFjZUVkaXQ7XG4oZnVuY3Rpb24gKFdvcmtzcGFjZUVkaXQpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuY2hhbmdlcyAhPT0gdW5kZWZpbmVkIHx8IGNhbmRpZGF0ZS5kb2N1bWVudENoYW5nZXMgIT09IHVuZGVmaW5lZCkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuZG9jdW1lbnRDaGFuZ2VzID09PSB1bmRlZmluZWQgfHwgY2FuZGlkYXRlLmRvY3VtZW50Q2hhbmdlcy5ldmVyeSgoY2hhbmdlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKElzLnN0cmluZyhjaGFuZ2Uua2luZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZUZpbGUuaXMoY2hhbmdlKSB8fCBSZW5hbWVGaWxlLmlzKGNoYW5nZSkgfHwgRGVsZXRlRmlsZS5pcyhjaGFuZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRleHREb2N1bWVudEVkaXQuaXMoY2hhbmdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSk7XG4gICAgfVxuICAgIFdvcmtzcGFjZUVkaXQuaXMgPSBpcztcbn0pKFdvcmtzcGFjZUVkaXQgfHwgKFdvcmtzcGFjZUVkaXQgPSB7fSkpO1xuY2xhc3MgVGV4dEVkaXRDaGFuZ2VJbXBsIHtcbiAgICBjb25zdHJ1Y3RvcihlZGl0cywgY2hhbmdlQW5ub3RhdGlvbnMpIHtcbiAgICAgICAgdGhpcy5lZGl0cyA9IGVkaXRzO1xuICAgICAgICB0aGlzLmNoYW5nZUFubm90YXRpb25zID0gY2hhbmdlQW5ub3RhdGlvbnM7XG4gICAgfVxuICAgIGluc2VydChwb3NpdGlvbiwgbmV3VGV4dCwgYW5ub3RhdGlvbikge1xuICAgICAgICBsZXQgZWRpdDtcbiAgICAgICAgbGV0IGlkO1xuICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBlZGl0ID0gVGV4dEVkaXQuaW5zZXJ0KHBvc2l0aW9uLCBuZXdUZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhhbm5vdGF0aW9uKSkge1xuICAgICAgICAgICAgaWQgPSBhbm5vdGF0aW9uO1xuICAgICAgICAgICAgZWRpdCA9IEFubm90YXRlZFRleHRFZGl0Lmluc2VydChwb3NpdGlvbiwgbmV3VGV4dCwgYW5ub3RhdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFzc2VydENoYW5nZUFubm90YXRpb25zKHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgaWQgPSB0aGlzLmNoYW5nZUFubm90YXRpb25zLm1hbmFnZShhbm5vdGF0aW9uKTtcbiAgICAgICAgICAgIGVkaXQgPSBBbm5vdGF0ZWRUZXh0RWRpdC5pbnNlcnQocG9zaXRpb24sIG5ld1RleHQsIGlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVkaXRzLnB1c2goZWRpdCk7XG4gICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVwbGFjZShyYW5nZSwgbmV3VGV4dCwgYW5ub3RhdGlvbikge1xuICAgICAgICBsZXQgZWRpdDtcbiAgICAgICAgbGV0IGlkO1xuICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBlZGl0ID0gVGV4dEVkaXQucmVwbGFjZShyYW5nZSwgbmV3VGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoYW5ub3RhdGlvbikpIHtcbiAgICAgICAgICAgIGlkID0gYW5ub3RhdGlvbjtcbiAgICAgICAgICAgIGVkaXQgPSBBbm5vdGF0ZWRUZXh0RWRpdC5yZXBsYWNlKHJhbmdlLCBuZXdUZXh0LCBhbm5vdGF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYXNzZXJ0Q2hhbmdlQW5ub3RhdGlvbnModGhpcy5jaGFuZ2VBbm5vdGF0aW9ucyk7XG4gICAgICAgICAgICBpZCA9IHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMubWFuYWdlKGFubm90YXRpb24pO1xuICAgICAgICAgICAgZWRpdCA9IEFubm90YXRlZFRleHRFZGl0LnJlcGxhY2UocmFuZ2UsIG5ld1RleHQsIGlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVkaXRzLnB1c2goZWRpdCk7XG4gICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVsZXRlKHJhbmdlLCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIGxldCBlZGl0O1xuICAgICAgICBsZXQgaWQ7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGVkaXQgPSBUZXh0RWRpdC5kZWwocmFuZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGFubm90YXRpb24pKSB7XG4gICAgICAgICAgICBpZCA9IGFubm90YXRpb247XG4gICAgICAgICAgICBlZGl0ID0gQW5ub3RhdGVkVGV4dEVkaXQuZGVsKHJhbmdlLCBhbm5vdGF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYXNzZXJ0Q2hhbmdlQW5ub3RhdGlvbnModGhpcy5jaGFuZ2VBbm5vdGF0aW9ucyk7XG4gICAgICAgICAgICBpZCA9IHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMubWFuYWdlKGFubm90YXRpb24pO1xuICAgICAgICAgICAgZWRpdCA9IEFubm90YXRlZFRleHRFZGl0LmRlbChyYW5nZSwgaWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWRpdHMucHVzaChlZGl0KTtcbiAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhZGQoZWRpdCkge1xuICAgICAgICB0aGlzLmVkaXRzLnB1c2goZWRpdCk7XG4gICAgfVxuICAgIGFsbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdHM7XG4gICAgfVxuICAgIGNsZWFyKCkge1xuICAgICAgICB0aGlzLmVkaXRzLnNwbGljZSgwLCB0aGlzLmVkaXRzLmxlbmd0aCk7XG4gICAgfVxuICAgIGFzc2VydENoYW5nZUFubm90YXRpb25zKHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRleHQgZWRpdCBjaGFuZ2UgaXMgbm90IGNvbmZpZ3VyZWQgdG8gbWFuYWdlIGNoYW5nZSBhbm5vdGF0aW9ucy5gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogQSBoZWxwZXIgY2xhc3NcbiAqL1xuY2xhc3MgQ2hhbmdlQW5ub3RhdGlvbnMge1xuICAgIGNvbnN0cnVjdG9yKGFubm90YXRpb25zKSB7XG4gICAgICAgIHRoaXMuX2Fubm90YXRpb25zID0gYW5ub3RhdGlvbnMgPT09IHVuZGVmaW5lZCA/IE9iamVjdC5jcmVhdGUobnVsbCkgOiBhbm5vdGF0aW9ucztcbiAgICAgICAgdGhpcy5fY291bnRlciA9IDA7XG4gICAgICAgIHRoaXMuX3NpemUgPSAwO1xuICAgIH1cbiAgICBhbGwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hbm5vdGF0aW9ucztcbiAgICB9XG4gICAgZ2V0IHNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaXplO1xuICAgIH1cbiAgICBtYW5hZ2UoaWRPckFubm90YXRpb24sIGFubm90YXRpb24pIHtcbiAgICAgICAgbGV0IGlkO1xuICAgICAgICBpZiAoQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoaWRPckFubm90YXRpb24pKSB7XG4gICAgICAgICAgICBpZCA9IGlkT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWQgPSB0aGlzLm5leHRJZCgpO1xuICAgICAgICAgICAgYW5ub3RhdGlvbiA9IGlkT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9hbm5vdGF0aW9uc1tpZF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJZCAke2lkfSBpcyBhbHJlYWR5IGluIHVzZS5gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGFubm90YXRpb24gcHJvdmlkZWQgZm9yIGlkICR7aWR9YCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fYW5ub3RhdGlvbnNbaWRdID0gYW5ub3RhdGlvbjtcbiAgICAgICAgdGhpcy5fc2l6ZSsrO1xuICAgICAgICByZXR1cm4gaWQ7XG4gICAgfVxuICAgIG5leHRJZCgpIHtcbiAgICAgICAgdGhpcy5fY291bnRlcisrO1xuICAgICAgICByZXR1cm4gdGhpcy5fY291bnRlci50b1N0cmluZygpO1xuICAgIH1cbn1cbi8qKlxuICogQSB3b3Jrc3BhY2UgY2hhbmdlIGhlbHBzIGNvbnN0cnVjdGluZyBjaGFuZ2VzIHRvIGEgd29ya3NwYWNlLlxuICovXG5leHBvcnQgY2xhc3MgV29ya3NwYWNlQ2hhbmdlIHtcbiAgICBjb25zdHJ1Y3Rvcih3b3Jrc3BhY2VFZGl0KSB7XG4gICAgICAgIHRoaXMuX3RleHRFZGl0Q2hhbmdlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIGlmICh3b3Jrc3BhY2VFZGl0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQgPSB3b3Jrc3BhY2VFZGl0O1xuICAgICAgICAgICAgaWYgKHdvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMgPSBuZXcgQ2hhbmdlQW5ub3RhdGlvbnMod29ya3NwYWNlRWRpdC5jaGFuZ2VBbm5vdGF0aW9ucyk7XG4gICAgICAgICAgICAgICAgd29ya3NwYWNlRWRpdC5jaGFuZ2VBbm5vdGF0aW9ucyA9IHRoaXMuX2NoYW5nZUFubm90YXRpb25zLmFsbCgpO1xuICAgICAgICAgICAgICAgIHdvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzLmZvckVhY2goKGNoYW5nZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoVGV4dERvY3VtZW50RWRpdC5pcyhjaGFuZ2UpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0RWRpdENoYW5nZSA9IG5ldyBUZXh0RWRpdENoYW5nZUltcGwoY2hhbmdlLmVkaXRzLCB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXh0RWRpdENoYW5nZXNbY2hhbmdlLnRleHREb2N1bWVudC51cmldID0gdGV4dEVkaXRDaGFuZ2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHdvcmtzcGFjZUVkaXQuY2hhbmdlcykge1xuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHdvcmtzcGFjZUVkaXQuY2hhbmdlcykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHRFZGl0Q2hhbmdlID0gbmV3IFRleHRFZGl0Q2hhbmdlSW1wbCh3b3Jrc3BhY2VFZGl0LmNoYW5nZXNba2V5XSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RleHRFZGl0Q2hhbmdlc1trZXldID0gdGV4dEVkaXRDaGFuZ2U7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0ID0ge307XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdW5kZXJseWluZyB7QGxpbmsgV29ya3NwYWNlRWRpdH0gbGl0ZXJhbFxuICAgICAqIHVzZSB0byBiZSByZXR1cm5lZCBmcm9tIGEgd29ya3NwYWNlIGVkaXQgb3BlcmF0aW9uIGxpa2UgcmVuYW1lLlxuICAgICAqL1xuICAgIGdldCBlZGl0KCkge1xuICAgICAgICB0aGlzLmluaXREb2N1bWVudENoYW5nZXMoKTtcbiAgICAgICAgaWYgKHRoaXMuX2NoYW5nZUFubm90YXRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5zaXplID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VBbm5vdGF0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlQW5ub3RhdGlvbnMgPSB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5hbGwoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fd29ya3NwYWNlRWRpdDtcbiAgICB9XG4gICAgZ2V0VGV4dEVkaXRDaGFuZ2Uoa2V5KSB7XG4gICAgICAgIGlmIChPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIuaXMoa2V5KSkge1xuICAgICAgICAgICAgdGhpcy5pbml0RG9jdW1lbnRDaGFuZ2VzKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV29ya3NwYWNlIGVkaXQgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIGRvY3VtZW50IGNoYW5nZXMuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0ZXh0RG9jdW1lbnQgPSB7IHVyaToga2V5LnVyaSwgdmVyc2lvbjoga2V5LnZlcnNpb24gfTtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLl90ZXh0RWRpdENoYW5nZXNbdGV4dERvY3VtZW50LnVyaV07XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVkaXRzID0gW107XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dERvY3VtZW50RWRpdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dERvY3VtZW50LFxuICAgICAgICAgICAgICAgICAgICBlZGl0c1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMucHVzaCh0ZXh0RG9jdW1lbnRFZGl0KTtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgVGV4dEVkaXRDaGFuZ2VJbXBsKGVkaXRzLCB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGV4dEVkaXRDaGFuZ2VzW3RleHREb2N1bWVudC51cmldID0gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdENoYW5nZXMoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV29ya3NwYWNlIGVkaXQgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIG5vcm1hbCB0ZXh0IGVkaXQgY2hhbmdlcy4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLl90ZXh0RWRpdENoYW5nZXNba2V5XTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgbGV0IGVkaXRzID0gW107XG4gICAgICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VzW2tleV0gPSBlZGl0cztcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgVGV4dEVkaXRDaGFuZ2VJbXBsKGVkaXRzKTtcbiAgICAgICAgICAgICAgICB0aGlzLl90ZXh0RWRpdENoYW5nZXNba2V5XSA9IHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaW5pdERvY3VtZW50Q2hhbmdlcygpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzID09PSB1bmRlZmluZWQgJiYgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZUFubm90YXRpb25zID0gbmV3IENoYW5nZUFubm90YXRpb25zKCk7XG4gICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VBbm5vdGF0aW9ucyA9IHRoaXMuX2NoYW5nZUFubm90YXRpb25zLmFsbCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGluaXRDaGFuZ2VzKCkge1xuICAgICAgICBpZiAodGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMgPT09IHVuZGVmaW5lZCAmJiB0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjcmVhdGVGaWxlKHVyaSwgb3B0aW9uc09yQW5ub3RhdGlvbiwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLmluaXREb2N1bWVudENoYW5nZXMoKTtcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV29ya3NwYWNlIGVkaXQgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIGRvY3VtZW50IGNoYW5nZXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGFubm90YXRpb247XG4gICAgICAgIGlmIChDaGFuZ2VBbm5vdGF0aW9uLmlzKG9wdGlvbnNPckFubm90YXRpb24pIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKG9wdGlvbnNPckFubm90YXRpb24pKSB7XG4gICAgICAgICAgICBhbm5vdGF0aW9uID0gb3B0aW9uc09yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGxldCBvcGVyYXRpb247XG4gICAgICAgIGxldCBpZDtcbiAgICAgICAgaWYgKGFubm90YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3BlcmF0aW9uID0gQ3JlYXRlRmlsZS5jcmVhdGUodXJpLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlkID0gQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoYW5ub3RhdGlvbikgPyBhbm5vdGF0aW9uIDogdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMubWFuYWdlKGFubm90YXRpb24pO1xuICAgICAgICAgICAgb3BlcmF0aW9uID0gQ3JlYXRlRmlsZS5jcmVhdGUodXJpLCBvcHRpb25zLCBpZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMucHVzaChvcGVyYXRpb24pO1xuICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlbmFtZUZpbGUob2xkVXJpLCBuZXdVcmksIG9wdGlvbnNPckFubm90YXRpb24sIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5pbml0RG9jdW1lbnRDaGFuZ2VzKCk7XG4gICAgICAgIGlmICh0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dvcmtzcGFjZSBlZGl0IGlzIG5vdCBjb25maWd1cmVkIGZvciBkb2N1bWVudCBjaGFuZ2VzLicpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhbm5vdGF0aW9uO1xuICAgICAgICBpZiAoQ2hhbmdlQW5ub3RhdGlvbi5pcyhvcHRpb25zT3JBbm5vdGF0aW9uKSB8fCBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhvcHRpb25zT3JBbm5vdGF0aW9uKSkge1xuICAgICAgICAgICAgYW5ub3RhdGlvbiA9IG9wdGlvbnNPckFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvcHRpb25zID0gb3B0aW9uc09yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb3BlcmF0aW9uO1xuICAgICAgICBsZXQgaWQ7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wZXJhdGlvbiA9IFJlbmFtZUZpbGUuY3JlYXRlKG9sZFVyaSwgbmV3VXJpLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlkID0gQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoYW5ub3RhdGlvbikgPyBhbm5vdGF0aW9uIDogdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMubWFuYWdlKGFubm90YXRpb24pO1xuICAgICAgICAgICAgb3BlcmF0aW9uID0gUmVuYW1lRmlsZS5jcmVhdGUob2xkVXJpLCBuZXdVcmksIG9wdGlvbnMsIGlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcy5wdXNoKG9wZXJhdGlvbik7XG4gICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVsZXRlRmlsZSh1cmksIG9wdGlvbnNPckFubm90YXRpb24sIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5pbml0RG9jdW1lbnRDaGFuZ2VzKCk7XG4gICAgICAgIGlmICh0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dvcmtzcGFjZSBlZGl0IGlzIG5vdCBjb25maWd1cmVkIGZvciBkb2N1bWVudCBjaGFuZ2VzLicpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhbm5vdGF0aW9uO1xuICAgICAgICBpZiAoQ2hhbmdlQW5ub3RhdGlvbi5pcyhvcHRpb25zT3JBbm5vdGF0aW9uKSB8fCBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhvcHRpb25zT3JBbm5vdGF0aW9uKSkge1xuICAgICAgICAgICAgYW5ub3RhdGlvbiA9IG9wdGlvbnNPckFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvcHRpb25zID0gb3B0aW9uc09yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb3BlcmF0aW9uO1xuICAgICAgICBsZXQgaWQ7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wZXJhdGlvbiA9IERlbGV0ZUZpbGUuY3JlYXRlKHVyaSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZCA9IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGFubm90YXRpb24pID8gYW5ub3RhdGlvbiA6IHRoaXMuX2NoYW5nZUFubm90YXRpb25zLm1hbmFnZShhbm5vdGF0aW9uKTtcbiAgICAgICAgICAgIG9wZXJhdGlvbiA9IERlbGV0ZUZpbGUuY3JlYXRlKHVyaSwgb3B0aW9ucywgaWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzLnB1c2gob3BlcmF0aW9uKTtcbiAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogVGhlIFRleHREb2N1bWVudElkZW50aWZpZXIgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgVGV4dERvY3VtZW50SWRlbnRpZmllcn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgVGV4dERvY3VtZW50SWRlbnRpZmllcjtcbihmdW5jdGlvbiAoVGV4dERvY3VtZW50SWRlbnRpZmllcikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgVGV4dERvY3VtZW50SWRlbnRpZmllciBsaXRlcmFsLlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIGRvY3VtZW50J3MgdXJpLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmkpIHtcbiAgICAgICAgcmV0dXJuIHsgdXJpIH07XG4gICAgfVxuICAgIFRleHREb2N1bWVudElkZW50aWZpZXIuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgVGV4dERvY3VtZW50SWRlbnRpZmllcn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSk7XG4gICAgfVxuICAgIFRleHREb2N1bWVudElkZW50aWZpZXIuaXMgPSBpcztcbn0pKFRleHREb2N1bWVudElkZW50aWZpZXIgfHwgKFRleHREb2N1bWVudElkZW50aWZpZXIgPSB7fSkpO1xuLyoqXG4gKiBUaGUgVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyO1xuKGZ1bmN0aW9uIChWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIGxpdGVyYWwuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgZG9jdW1lbnQncyB1cmkuXG4gICAgICogQHBhcmFtIHZlcnNpb24gVGhlIGRvY3VtZW50J3MgdmVyc2lvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodXJpLCB2ZXJzaW9uKSB7XG4gICAgICAgIHJldHVybiB7IHVyaSwgdmVyc2lvbiB9O1xuICAgIH1cbiAgICBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXJ9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpICYmIElzLmludGVnZXIoY2FuZGlkYXRlLnZlcnNpb24pO1xuICAgIH1cbiAgICBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmlzID0gaXM7XG59KShWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIHx8IChWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyID0ge30pKTtcbi8qKlxuICogVGhlIE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXJ9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcjtcbihmdW5jdGlvbiAoT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIgbGl0ZXJhbC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSBkb2N1bWVudCdzIHVyaS5cbiAgICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgZG9jdW1lbnQncyB2ZXJzaW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmksIHZlcnNpb24pIHtcbiAgICAgICAgcmV0dXJuIHsgdXJpLCB2ZXJzaW9uIH07XG4gICAgfVxuICAgIE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllci5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXJ9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpICYmIChjYW5kaWRhdGUudmVyc2lvbiA9PT0gbnVsbCB8fCBJcy5pbnRlZ2VyKGNhbmRpZGF0ZS52ZXJzaW9uKSk7XG4gICAgfVxuICAgIE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllci5pcyA9IGlzO1xufSkoT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIHx8IChPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIgPSB7fSkpO1xuLyoqXG4gKiBUaGUgVGV4dERvY3VtZW50SXRlbSBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBUZXh0RG9jdW1lbnRJdGVtfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBUZXh0RG9jdW1lbnRJdGVtO1xuKGZ1bmN0aW9uIChUZXh0RG9jdW1lbnRJdGVtKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBUZXh0RG9jdW1lbnRJdGVtIGxpdGVyYWwuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgZG9jdW1lbnQncyB1cmkuXG4gICAgICogQHBhcmFtIGxhbmd1YWdlSWQgVGhlIGRvY3VtZW50J3MgbGFuZ3VhZ2UgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgZG9jdW1lbnQncyB2ZXJzaW9uIG51bWJlci5cbiAgICAgKiBAcGFyYW0gdGV4dCBUaGUgZG9jdW1lbnQncyB0ZXh0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmksIGxhbmd1YWdlSWQsIHZlcnNpb24sIHRleHQpIHtcbiAgICAgICAgcmV0dXJuIHsgdXJpLCBsYW5ndWFnZUlkLCB2ZXJzaW9uLCB0ZXh0IH07XG4gICAgfVxuICAgIFRleHREb2N1bWVudEl0ZW0uY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgVGV4dERvY3VtZW50SXRlbX0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5sYW5ndWFnZUlkKSAmJiBJcy5pbnRlZ2VyKGNhbmRpZGF0ZS52ZXJzaW9uKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnRleHQpO1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnRJdGVtLmlzID0gaXM7XG59KShUZXh0RG9jdW1lbnRJdGVtIHx8IChUZXh0RG9jdW1lbnRJdGVtID0ge30pKTtcbi8qKlxuICogRGVzY3JpYmVzIHRoZSBjb250ZW50IHR5cGUgdGhhdCBhIGNsaWVudCBzdXBwb3J0cyBpbiB2YXJpb3VzXG4gKiByZXN1bHQgbGl0ZXJhbHMgbGlrZSBgSG92ZXJgLCBgUGFyYW1ldGVySW5mb2Agb3IgYENvbXBsZXRpb25JdGVtYC5cbiAqXG4gKiBQbGVhc2Ugbm90ZSB0aGF0IGBNYXJrdXBLaW5kc2AgbXVzdCBub3Qgc3RhcnQgd2l0aCBhIGAkYC4gVGhpcyBraW5kc1xuICogYXJlIHJlc2VydmVkIGZvciBpbnRlcm5hbCB1c2FnZS5cbiAqL1xuZXhwb3J0IHZhciBNYXJrdXBLaW5kO1xuKGZ1bmN0aW9uIChNYXJrdXBLaW5kKSB7XG4gICAgLyoqXG4gICAgICogUGxhaW4gdGV4dCBpcyBzdXBwb3J0ZWQgYXMgYSBjb250ZW50IGZvcm1hdFxuICAgICAqL1xuICAgIE1hcmt1cEtpbmQuUGxhaW5UZXh0ID0gJ3BsYWludGV4dCc7XG4gICAgLyoqXG4gICAgICogTWFya2Rvd24gaXMgc3VwcG9ydGVkIGFzIGEgY29udGVudCBmb3JtYXRcbiAgICAgKi9cbiAgICBNYXJrdXBLaW5kLk1hcmtkb3duID0gJ21hcmtkb3duJztcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgaXMgYSB2YWx1ZSBvZiB0aGUge0BsaW5rIE1hcmt1cEtpbmR9IHR5cGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgPT09IE1hcmt1cEtpbmQuUGxhaW5UZXh0IHx8IGNhbmRpZGF0ZSA9PT0gTWFya3VwS2luZC5NYXJrZG93bjtcbiAgICB9XG4gICAgTWFya3VwS2luZC5pcyA9IGlzO1xufSkoTWFya3VwS2luZCB8fCAoTWFya3VwS2luZCA9IHt9KSk7XG5leHBvcnQgdmFyIE1hcmt1cENvbnRlbnQ7XG4oZnVuY3Rpb24gKE1hcmt1cENvbnRlbnQpIHtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgY29uZm9ybXMgdG8gdGhlIHtAbGluayBNYXJrdXBDb250ZW50fSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKHZhbHVlKSAmJiBNYXJrdXBLaW5kLmlzKGNhbmRpZGF0ZS5raW5kKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnZhbHVlKTtcbiAgICB9XG4gICAgTWFya3VwQ29udGVudC5pcyA9IGlzO1xufSkoTWFya3VwQ29udGVudCB8fCAoTWFya3VwQ29udGVudCA9IHt9KSk7XG4vKipcbiAqIFRoZSBraW5kIG9mIGEgY29tcGxldGlvbiBlbnRyeS5cbiAqL1xuZXhwb3J0IHZhciBDb21wbGV0aW9uSXRlbUtpbmQ7XG4oZnVuY3Rpb24gKENvbXBsZXRpb25JdGVtS2luZCkge1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5UZXh0ID0gMTtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuTWV0aG9kID0gMjtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuRnVuY3Rpb24gPSAzO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5Db25zdHJ1Y3RvciA9IDQ7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkZpZWxkID0gNTtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuVmFyaWFibGUgPSA2O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5DbGFzcyA9IDc7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkludGVyZmFjZSA9IDg7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLk1vZHVsZSA9IDk7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlByb3BlcnR5ID0gMTA7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlVuaXQgPSAxMTtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuVmFsdWUgPSAxMjtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuRW51bSA9IDEzO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5LZXl3b3JkID0gMTQ7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlNuaXBwZXQgPSAxNTtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuQ29sb3IgPSAxNjtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuRmlsZSA9IDE3O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5SZWZlcmVuY2UgPSAxODtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuRm9sZGVyID0gMTk7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkVudW1NZW1iZXIgPSAyMDtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuQ29uc3RhbnQgPSAyMTtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuU3RydWN0ID0gMjI7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkV2ZW50ID0gMjM7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLk9wZXJhdG9yID0gMjQ7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlR5cGVQYXJhbWV0ZXIgPSAyNTtcbn0pKENvbXBsZXRpb25JdGVtS2luZCB8fCAoQ29tcGxldGlvbkl0ZW1LaW5kID0ge30pKTtcbi8qKlxuICogRGVmaW5lcyB3aGV0aGVyIHRoZSBpbnNlcnQgdGV4dCBpbiBhIGNvbXBsZXRpb24gaXRlbSBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXNcbiAqIHBsYWluIHRleHQgb3IgYSBzbmlwcGV0LlxuICovXG5leHBvcnQgdmFyIEluc2VydFRleHRGb3JtYXQ7XG4oZnVuY3Rpb24gKEluc2VydFRleHRGb3JtYXQpIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpbWFyeSB0ZXh0IHRvIGJlIGluc2VydGVkIGlzIHRyZWF0ZWQgYXMgYSBwbGFpbiBzdHJpbmcuXG4gICAgICovXG4gICAgSW5zZXJ0VGV4dEZvcm1hdC5QbGFpblRleHQgPSAxO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcmltYXJ5IHRleHQgdG8gYmUgaW5zZXJ0ZWQgaXMgdHJlYXRlZCBhcyBhIHNuaXBwZXQuXG4gICAgICpcbiAgICAgKiBBIHNuaXBwZXQgY2FuIGRlZmluZSB0YWIgc3RvcHMgYW5kIHBsYWNlaG9sZGVycyB3aXRoIGAkMWAsIGAkMmBcbiAgICAgKiBhbmQgYCR7Mzpmb299YC4gYCQwYCBkZWZpbmVzIHRoZSBmaW5hbCB0YWIgc3RvcCwgaXQgZGVmYXVsdHMgdG9cbiAgICAgKiB0aGUgZW5kIG9mIHRoZSBzbmlwcGV0LiBQbGFjZWhvbGRlcnMgd2l0aCBlcXVhbCBpZGVudGlmaWVycyBhcmUgbGlua2VkLFxuICAgICAqIHRoYXQgaXMgdHlwaW5nIGluIG9uZSB3aWxsIHVwZGF0ZSBvdGhlcnMgdG9vLlxuICAgICAqXG4gICAgICogU2VlIGFsc286IGh0dHBzOi8vbWljcm9zb2Z0LmdpdGh1Yi5pby9sYW5ndWFnZS1zZXJ2ZXItcHJvdG9jb2wvc3BlY2lmaWNhdGlvbnMvc3BlY2lmaWNhdGlvbi1jdXJyZW50LyNzbmlwcGV0X3N5bnRheFxuICAgICAqL1xuICAgIEluc2VydFRleHRGb3JtYXQuU25pcHBldCA9IDI7XG59KShJbnNlcnRUZXh0Rm9ybWF0IHx8IChJbnNlcnRUZXh0Rm9ybWF0ID0ge30pKTtcbi8qKlxuICogQ29tcGxldGlvbiBpdGVtIHRhZ3MgYXJlIGV4dHJhIGFubm90YXRpb25zIHRoYXQgdHdlYWsgdGhlIHJlbmRlcmluZyBvZiBhIGNvbXBsZXRpb25cbiAqIGl0ZW0uXG4gKlxuICogQHNpbmNlIDMuMTUuMFxuICovXG5leHBvcnQgdmFyIENvbXBsZXRpb25JdGVtVGFnO1xuKGZ1bmN0aW9uIChDb21wbGV0aW9uSXRlbVRhZykge1xuICAgIC8qKlxuICAgICAqIFJlbmRlciBhIGNvbXBsZXRpb24gYXMgb2Jzb2xldGUsIHVzdWFsbHkgdXNpbmcgYSBzdHJpa2Utb3V0LlxuICAgICAqL1xuICAgIENvbXBsZXRpb25JdGVtVGFnLkRlcHJlY2F0ZWQgPSAxO1xufSkoQ29tcGxldGlvbkl0ZW1UYWcgfHwgKENvbXBsZXRpb25JdGVtVGFnID0ge30pKTtcbi8qKlxuICogVGhlIEluc2VydFJlcGxhY2VFZGl0IG5hbWVzcGFjZSBwcm92aWRlcyBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIGluc2VydCAvIHJlcGxhY2UgZWRpdHMuXG4gKlxuICogQHNpbmNlIDMuMTYuMFxuICovXG5leHBvcnQgdmFyIEluc2VydFJlcGxhY2VFZGl0O1xuKGZ1bmN0aW9uIChJbnNlcnRSZXBsYWNlRWRpdCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zZXJ0IC8gcmVwbGFjZSBlZGl0XG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKG5ld1RleHQsIGluc2VydCwgcmVwbGFjZSkge1xuICAgICAgICByZXR1cm4geyBuZXdUZXh0LCBpbnNlcnQsIHJlcGxhY2UgfTtcbiAgICB9XG4gICAgSW5zZXJ0UmVwbGFjZUVkaXQuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgSW5zZXJ0UmVwbGFjZUVkaXR9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLm5ld1RleHQpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5pbnNlcnQpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yZXBsYWNlKTtcbiAgICB9XG4gICAgSW5zZXJ0UmVwbGFjZUVkaXQuaXMgPSBpcztcbn0pKEluc2VydFJlcGxhY2VFZGl0IHx8IChJbnNlcnRSZXBsYWNlRWRpdCA9IHt9KSk7XG4vKipcbiAqIEhvdyB3aGl0ZXNwYWNlIGFuZCBpbmRlbnRhdGlvbiBpcyBoYW5kbGVkIGR1cmluZyBjb21wbGV0aW9uXG4gKiBpdGVtIGluc2VydGlvbi5cbiAqXG4gKiBAc2luY2UgMy4xNi4wXG4gKi9cbmV4cG9ydCB2YXIgSW5zZXJ0VGV4dE1vZGU7XG4oZnVuY3Rpb24gKEluc2VydFRleHRNb2RlKSB7XG4gICAgLyoqXG4gICAgICogVGhlIGluc2VydGlvbiBvciByZXBsYWNlIHN0cmluZ3MgaXMgdGFrZW4gYXMgaXQgaXMuIElmIHRoZVxuICAgICAqIHZhbHVlIGlzIG11bHRpIGxpbmUgdGhlIGxpbmVzIGJlbG93IHRoZSBjdXJzb3Igd2lsbCBiZVxuICAgICAqIGluc2VydGVkIHVzaW5nIHRoZSBpbmRlbnRhdGlvbiBkZWZpbmVkIGluIHRoZSBzdHJpbmcgdmFsdWUuXG4gICAgICogVGhlIGNsaWVudCB3aWxsIG5vdCBhcHBseSBhbnkga2luZCBvZiBhZGp1c3RtZW50cyB0byB0aGVcbiAgICAgKiBzdHJpbmcuXG4gICAgICovXG4gICAgSW5zZXJ0VGV4dE1vZGUuYXNJcyA9IDE7XG4gICAgLyoqXG4gICAgICogVGhlIGVkaXRvciBhZGp1c3RzIGxlYWRpbmcgd2hpdGVzcGFjZSBvZiBuZXcgbGluZXMgc28gdGhhdFxuICAgICAqIHRoZXkgbWF0Y2ggdGhlIGluZGVudGF0aW9uIHVwIHRvIHRoZSBjdXJzb3Igb2YgdGhlIGxpbmUgZm9yXG4gICAgICogd2hpY2ggdGhlIGl0ZW0gaXMgYWNjZXB0ZWQuXG4gICAgICpcbiAgICAgKiBDb25zaWRlciBhIGxpbmUgbGlrZSB0aGlzOiA8MnRhYnM+PGN1cnNvcj48M3RhYnM+Zm9vLiBBY2NlcHRpbmcgYVxuICAgICAqIG11bHRpIGxpbmUgY29tcGxldGlvbiBpdGVtIGlzIGluZGVudGVkIHVzaW5nIDIgdGFicyBhbmQgYWxsXG4gICAgICogZm9sbG93aW5nIGxpbmVzIGluc2VydGVkIHdpbGwgYmUgaW5kZW50ZWQgdXNpbmcgMiB0YWJzIGFzIHdlbGwuXG4gICAgICovXG4gICAgSW5zZXJ0VGV4dE1vZGUuYWRqdXN0SW5kZW50YXRpb24gPSAyO1xufSkoSW5zZXJ0VGV4dE1vZGUgfHwgKEluc2VydFRleHRNb2RlID0ge30pKTtcbmV4cG9ydCB2YXIgQ29tcGxldGlvbkl0ZW1MYWJlbERldGFpbHM7XG4oZnVuY3Rpb24gKENvbXBsZXRpb25JdGVtTGFiZWxEZXRhaWxzKSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgKElzLnN0cmluZyhjYW5kaWRhdGUuZGV0YWlsKSB8fCBjYW5kaWRhdGUuZGV0YWlsID09PSB1bmRlZmluZWQpICYmXG4gICAgICAgICAgICAoSXMuc3RyaW5nKGNhbmRpZGF0ZS5kZXNjcmlwdGlvbikgfHwgY2FuZGlkYXRlLmRlc2NyaXB0aW9uID09PSB1bmRlZmluZWQpO1xuICAgIH1cbiAgICBDb21wbGV0aW9uSXRlbUxhYmVsRGV0YWlscy5pcyA9IGlzO1xufSkoQ29tcGxldGlvbkl0ZW1MYWJlbERldGFpbHMgfHwgKENvbXBsZXRpb25JdGVtTGFiZWxEZXRhaWxzID0ge30pKTtcbi8qKlxuICogVGhlIENvbXBsZXRpb25JdGVtIG5hbWVzcGFjZSBwcm92aWRlcyBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoXG4gKiBjb21wbGV0aW9uIGl0ZW1zLlxuICovXG5leHBvcnQgdmFyIENvbXBsZXRpb25JdGVtO1xuKGZ1bmN0aW9uIChDb21wbGV0aW9uSXRlbSkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIGNvbXBsZXRpb24gaXRlbSBhbmQgc2VlZCBpdCB3aXRoIGEgbGFiZWwuXG4gICAgICogQHBhcmFtIGxhYmVsIFRoZSBjb21wbGV0aW9uIGl0ZW0ncyBsYWJlbFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShsYWJlbCkge1xuICAgICAgICByZXR1cm4geyBsYWJlbCB9O1xuICAgIH1cbiAgICBDb21wbGV0aW9uSXRlbS5jcmVhdGUgPSBjcmVhdGU7XG59KShDb21wbGV0aW9uSXRlbSB8fCAoQ29tcGxldGlvbkl0ZW0gPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29tcGxldGlvbkxpc3QgbmFtZXNwYWNlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGhcbiAqIGNvbXBsZXRpb24gbGlzdHMuXG4gKi9cbmV4cG9ydCB2YXIgQ29tcGxldGlvbkxpc3Q7XG4oZnVuY3Rpb24gKENvbXBsZXRpb25MaXN0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBjb21wbGV0aW9uIGxpc3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaXRlbXMgVGhlIGNvbXBsZXRpb24gaXRlbXMuXG4gICAgICogQHBhcmFtIGlzSW5jb21wbGV0ZSBUaGUgbGlzdCBpcyBub3QgY29tcGxldGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGl0ZW1zLCBpc0luY29tcGxldGUpIHtcbiAgICAgICAgcmV0dXJuIHsgaXRlbXM6IGl0ZW1zID8gaXRlbXMgOiBbXSwgaXNJbmNvbXBsZXRlOiAhIWlzSW5jb21wbGV0ZSB9O1xuICAgIH1cbiAgICBDb21wbGV0aW9uTGlzdC5jcmVhdGUgPSBjcmVhdGU7XG59KShDb21wbGV0aW9uTGlzdCB8fCAoQ29tcGxldGlvbkxpc3QgPSB7fSkpO1xuZXhwb3J0IHZhciBNYXJrZWRTdHJpbmc7XG4oZnVuY3Rpb24gKE1hcmtlZFN0cmluZykge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBtYXJrZWQgc3RyaW5nIGZyb20gcGxhaW4gdGV4dC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwbGFpblRleHQgVGhlIHBsYWluIHRleHQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZnJvbVBsYWluVGV4dChwbGFpblRleHQpIHtcbiAgICAgICAgcmV0dXJuIHBsYWluVGV4dC5yZXBsYWNlKC9bXFxcXGAqX3t9W1xcXSgpIytcXC0uIV0vZywgJ1xcXFwkJicpOyAvLyBlc2NhcGUgbWFya2Rvd24gc3ludGF4IHRva2VuczogaHR0cDovL2RhcmluZ2ZpcmViYWxsLm5ldC9wcm9qZWN0cy9tYXJrZG93bi9zeW50YXgjYmFja3NsYXNoXG4gICAgfVxuICAgIE1hcmtlZFN0cmluZy5mcm9tUGxhaW5UZXh0ID0gZnJvbVBsYWluVGV4dDtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgY29uZm9ybXMgdG8gdGhlIHtAbGluayBNYXJrZWRTdHJpbmd9IHR5cGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5zdHJpbmcoY2FuZGlkYXRlKSB8fCAoSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUubGFuZ3VhZ2UpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudmFsdWUpKTtcbiAgICB9XG4gICAgTWFya2VkU3RyaW5nLmlzID0gaXM7XG59KShNYXJrZWRTdHJpbmcgfHwgKE1hcmtlZFN0cmluZyA9IHt9KSk7XG5leHBvcnQgdmFyIEhvdmVyO1xuKGZ1bmN0aW9uIChIb3Zlcikge1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBjb25mb3JtcyB0byB0aGUge0BsaW5rIEhvdmVyfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gISFjYW5kaWRhdGUgJiYgSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIChNYXJrdXBDb250ZW50LmlzKGNhbmRpZGF0ZS5jb250ZW50cykgfHxcbiAgICAgICAgICAgIE1hcmtlZFN0cmluZy5pcyhjYW5kaWRhdGUuY29udGVudHMpIHx8XG4gICAgICAgICAgICBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS5jb250ZW50cywgTWFya2VkU3RyaW5nLmlzKSkgJiYgKHZhbHVlLnJhbmdlID09PSB1bmRlZmluZWQgfHwgUmFuZ2UuaXModmFsdWUucmFuZ2UpKTtcbiAgICB9XG4gICAgSG92ZXIuaXMgPSBpcztcbn0pKEhvdmVyIHx8IChIb3ZlciA9IHt9KSk7XG4vKipcbiAqIFRoZSBQYXJhbWV0ZXJJbmZvcm1hdGlvbiBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBQYXJhbWV0ZXJJbmZvcm1hdGlvbn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgUGFyYW1ldGVySW5mb3JtYXRpb247XG4oZnVuY3Rpb24gKFBhcmFtZXRlckluZm9ybWF0aW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBwYXJhbWV0ZXIgaW5mb3JtYXRpb24gbGl0ZXJhbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBsYWJlbCBBIGxhYmVsIHN0cmluZy5cbiAgICAgKiBAcGFyYW0gZG9jdW1lbnRhdGlvbiBBIGRvYyBzdHJpbmcuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGxhYmVsLCBkb2N1bWVudGF0aW9uKSB7XG4gICAgICAgIHJldHVybiBkb2N1bWVudGF0aW9uID8geyBsYWJlbCwgZG9jdW1lbnRhdGlvbiB9IDogeyBsYWJlbCB9O1xuICAgIH1cbiAgICBQYXJhbWV0ZXJJbmZvcm1hdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG59KShQYXJhbWV0ZXJJbmZvcm1hdGlvbiB8fCAoUGFyYW1ldGVySW5mb3JtYXRpb24gPSB7fSkpO1xuLyoqXG4gKiBUaGUgU2lnbmF0dXJlSW5mb3JtYXRpb24gbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgU2lnbmF0dXJlSW5mb3JtYXRpb259IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIFNpZ25hdHVyZUluZm9ybWF0aW9uO1xuKGZ1bmN0aW9uIChTaWduYXR1cmVJbmZvcm1hdGlvbikge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShsYWJlbCwgZG9jdW1lbnRhdGlvbiwgLi4ucGFyYW1ldGVycykge1xuICAgICAgICBsZXQgcmVzdWx0ID0geyBsYWJlbCB9O1xuICAgICAgICBpZiAoSXMuZGVmaW5lZChkb2N1bWVudGF0aW9uKSkge1xuICAgICAgICAgICAgcmVzdWx0LmRvY3VtZW50YXRpb24gPSBkb2N1bWVudGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKHBhcmFtZXRlcnMpKSB7XG4gICAgICAgICAgICByZXN1bHQucGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQucGFyYW1ldGVycyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIFNpZ25hdHVyZUluZm9ybWF0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKFNpZ25hdHVyZUluZm9ybWF0aW9uIHx8IChTaWduYXR1cmVJbmZvcm1hdGlvbiA9IHt9KSk7XG4vKipcbiAqIEEgZG9jdW1lbnQgaGlnaGxpZ2h0IGtpbmQuXG4gKi9cbmV4cG9ydCB2YXIgRG9jdW1lbnRIaWdobGlnaHRLaW5kO1xuKGZ1bmN0aW9uIChEb2N1bWVudEhpZ2hsaWdodEtpbmQpIHtcbiAgICAvKipcbiAgICAgKiBBIHRleHR1YWwgb2NjdXJyZW5jZS5cbiAgICAgKi9cbiAgICBEb2N1bWVudEhpZ2hsaWdodEtpbmQuVGV4dCA9IDE7XG4gICAgLyoqXG4gICAgICogUmVhZC1hY2Nlc3Mgb2YgYSBzeW1ib2wsIGxpa2UgcmVhZGluZyBhIHZhcmlhYmxlLlxuICAgICAqL1xuICAgIERvY3VtZW50SGlnaGxpZ2h0S2luZC5SZWFkID0gMjtcbiAgICAvKipcbiAgICAgKiBXcml0ZS1hY2Nlc3Mgb2YgYSBzeW1ib2wsIGxpa2Ugd3JpdGluZyB0byBhIHZhcmlhYmxlLlxuICAgICAqL1xuICAgIERvY3VtZW50SGlnaGxpZ2h0S2luZC5Xcml0ZSA9IDM7XG59KShEb2N1bWVudEhpZ2hsaWdodEtpbmQgfHwgKERvY3VtZW50SGlnaGxpZ2h0S2luZCA9IHt9KSk7XG4vKipcbiAqIERvY3VtZW50SGlnaGxpZ2h0IG5hbWVzcGFjZSB0byBwcm92aWRlIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgRG9jdW1lbnRIaWdobGlnaHR9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIERvY3VtZW50SGlnaGxpZ2h0O1xuKGZ1bmN0aW9uIChEb2N1bWVudEhpZ2hsaWdodCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIERvY3VtZW50SGlnaGxpZ2h0IG9iamVjdC5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlIHRoZSBoaWdobGlnaHQgYXBwbGllcyB0by5cbiAgICAgKiBAcGFyYW0ga2luZCBUaGUgaGlnaGxpZ2h0IGtpbmRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIGtpbmQpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHsgcmFuZ2UgfTtcbiAgICAgICAgaWYgKElzLm51bWJlcihraW5kKSkge1xuICAgICAgICAgICAgcmVzdWx0LmtpbmQgPSBraW5kO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIERvY3VtZW50SGlnaGxpZ2h0LmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKERvY3VtZW50SGlnaGxpZ2h0IHx8IChEb2N1bWVudEhpZ2hsaWdodCA9IHt9KSk7XG4vKipcbiAqIEEgc3ltYm9sIGtpbmQuXG4gKi9cbmV4cG9ydCB2YXIgU3ltYm9sS2luZDtcbihmdW5jdGlvbiAoU3ltYm9sS2luZCkge1xuICAgIFN5bWJvbEtpbmQuRmlsZSA9IDE7XG4gICAgU3ltYm9sS2luZC5Nb2R1bGUgPSAyO1xuICAgIFN5bWJvbEtpbmQuTmFtZXNwYWNlID0gMztcbiAgICBTeW1ib2xLaW5kLlBhY2thZ2UgPSA0O1xuICAgIFN5bWJvbEtpbmQuQ2xhc3MgPSA1O1xuICAgIFN5bWJvbEtpbmQuTWV0aG9kID0gNjtcbiAgICBTeW1ib2xLaW5kLlByb3BlcnR5ID0gNztcbiAgICBTeW1ib2xLaW5kLkZpZWxkID0gODtcbiAgICBTeW1ib2xLaW5kLkNvbnN0cnVjdG9yID0gOTtcbiAgICBTeW1ib2xLaW5kLkVudW0gPSAxMDtcbiAgICBTeW1ib2xLaW5kLkludGVyZmFjZSA9IDExO1xuICAgIFN5bWJvbEtpbmQuRnVuY3Rpb24gPSAxMjtcbiAgICBTeW1ib2xLaW5kLlZhcmlhYmxlID0gMTM7XG4gICAgU3ltYm9sS2luZC5Db25zdGFudCA9IDE0O1xuICAgIFN5bWJvbEtpbmQuU3RyaW5nID0gMTU7XG4gICAgU3ltYm9sS2luZC5OdW1iZXIgPSAxNjtcbiAgICBTeW1ib2xLaW5kLkJvb2xlYW4gPSAxNztcbiAgICBTeW1ib2xLaW5kLkFycmF5ID0gMTg7XG4gICAgU3ltYm9sS2luZC5PYmplY3QgPSAxOTtcbiAgICBTeW1ib2xLaW5kLktleSA9IDIwO1xuICAgIFN5bWJvbEtpbmQuTnVsbCA9IDIxO1xuICAgIFN5bWJvbEtpbmQuRW51bU1lbWJlciA9IDIyO1xuICAgIFN5bWJvbEtpbmQuU3RydWN0ID0gMjM7XG4gICAgU3ltYm9sS2luZC5FdmVudCA9IDI0O1xuICAgIFN5bWJvbEtpbmQuT3BlcmF0b3IgPSAyNTtcbiAgICBTeW1ib2xLaW5kLlR5cGVQYXJhbWV0ZXIgPSAyNjtcbn0pKFN5bWJvbEtpbmQgfHwgKFN5bWJvbEtpbmQgPSB7fSkpO1xuLyoqXG4gKiBTeW1ib2wgdGFncyBhcmUgZXh0cmEgYW5ub3RhdGlvbnMgdGhhdCB0d2VhayB0aGUgcmVuZGVyaW5nIG9mIGEgc3ltYm9sLlxuICpcbiAqIEBzaW5jZSAzLjE2XG4gKi9cbmV4cG9ydCB2YXIgU3ltYm9sVGFnO1xuKGZ1bmN0aW9uIChTeW1ib2xUYWcpIHtcbiAgICAvKipcbiAgICAgKiBSZW5kZXIgYSBzeW1ib2wgYXMgb2Jzb2xldGUsIHVzdWFsbHkgdXNpbmcgYSBzdHJpa2Utb3V0LlxuICAgICAqL1xuICAgIFN5bWJvbFRhZy5EZXByZWNhdGVkID0gMTtcbn0pKFN5bWJvbFRhZyB8fCAoU3ltYm9sVGFnID0ge30pKTtcbmV4cG9ydCB2YXIgU3ltYm9sSW5mb3JtYXRpb247XG4oZnVuY3Rpb24gKFN5bWJvbEluZm9ybWF0aW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBzeW1ib2wgaW5mb3JtYXRpb24gbGl0ZXJhbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIGtpbmQgVGhlIGtpbmQgb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlIG9mIHRoZSBsb2NhdGlvbiBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIHJlc291cmNlIG9mIHRoZSBsb2NhdGlvbiBvZiBzeW1ib2wuXG4gICAgICogQHBhcmFtIGNvbnRhaW5lck5hbWUgVGhlIG5hbWUgb2YgdGhlIHN5bWJvbCBjb250YWluaW5nIHRoZSBzeW1ib2wuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKG5hbWUsIGtpbmQsIHJhbmdlLCB1cmksIGNvbnRhaW5lck5hbWUpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBraW5kLFxuICAgICAgICAgICAgbG9jYXRpb246IHsgdXJpLCByYW5nZSB9XG4gICAgICAgIH07XG4gICAgICAgIGlmIChjb250YWluZXJOYW1lKSB7XG4gICAgICAgICAgICByZXN1bHQuY29udGFpbmVyTmFtZSA9IGNvbnRhaW5lck5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgU3ltYm9sSW5mb3JtYXRpb24uY3JlYXRlID0gY3JlYXRlO1xufSkoU3ltYm9sSW5mb3JtYXRpb24gfHwgKFN5bWJvbEluZm9ybWF0aW9uID0ge30pKTtcbmV4cG9ydCB2YXIgV29ya3NwYWNlU3ltYm9sO1xuKGZ1bmN0aW9uIChXb3Jrc3BhY2VTeW1ib2wpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgd29ya3NwYWNlIHN5bWJvbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIGtpbmQgVGhlIGtpbmQgb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSByZXNvdXJjZSBvZiB0aGUgbG9jYXRpb24gb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgQW4gb3B0aW9ucyByYW5nZSBvZiB0aGUgbG9jYXRpb24uXG4gICAgICogQHJldHVybnMgQSBXb3Jrc3BhY2VTeW1ib2wuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKG5hbWUsIGtpbmQsIHVyaSwgcmFuZ2UpIHtcbiAgICAgICAgcmV0dXJuIHJhbmdlICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8geyBuYW1lLCBraW5kLCBsb2NhdGlvbjogeyB1cmksIHJhbmdlIH0gfVxuICAgICAgICAgICAgOiB7IG5hbWUsIGtpbmQsIGxvY2F0aW9uOiB7IHVyaSB9IH07XG4gICAgfVxuICAgIFdvcmtzcGFjZVN5bWJvbC5jcmVhdGUgPSBjcmVhdGU7XG59KShXb3Jrc3BhY2VTeW1ib2wgfHwgKFdvcmtzcGFjZVN5bWJvbCA9IHt9KSk7XG5leHBvcnQgdmFyIERvY3VtZW50U3ltYm9sO1xuKGZ1bmN0aW9uIChEb2N1bWVudFN5bWJvbCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgc3ltYm9sIGluZm9ybWF0aW9uIGxpdGVyYWwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSBkZXRhaWwgVGhlIGRldGFpbCBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSBraW5kIFRoZSBraW5kIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSBzZWxlY3Rpb25SYW5nZSBUaGUgc2VsZWN0aW9uUmFuZ2Ugb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gY2hpbGRyZW4gQ2hpbGRyZW4gb2YgdGhlIHN5bWJvbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobmFtZSwgZGV0YWlsLCBraW5kLCByYW5nZSwgc2VsZWN0aW9uUmFuZ2UsIGNoaWxkcmVuKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgZGV0YWlsLFxuICAgICAgICAgICAga2luZCxcbiAgICAgICAgICAgIHJhbmdlLFxuICAgICAgICAgICAgc2VsZWN0aW9uUmFuZ2VcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGNoaWxkcmVuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIERvY3VtZW50U3ltYm9sLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIERvY3VtZW50U3ltYm9sfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmXG4gICAgICAgICAgICBJcy5zdHJpbmcoY2FuZGlkYXRlLm5hbWUpICYmIElzLm51bWJlcihjYW5kaWRhdGUua2luZCkgJiZcbiAgICAgICAgICAgIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnNlbGVjdGlvblJhbmdlKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5kZXRhaWwgPT09IHVuZGVmaW5lZCB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLmRldGFpbCkpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmRlcHJlY2F0ZWQgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5kZXByZWNhdGVkKSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuY2hpbGRyZW4gPT09IHVuZGVmaW5lZCB8fCBBcnJheS5pc0FycmF5KGNhbmRpZGF0ZS5jaGlsZHJlbikpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLnRhZ3MgPT09IHVuZGVmaW5lZCB8fCBBcnJheS5pc0FycmF5KGNhbmRpZGF0ZS50YWdzKSk7XG4gICAgfVxuICAgIERvY3VtZW50U3ltYm9sLmlzID0gaXM7XG59KShEb2N1bWVudFN5bWJvbCB8fCAoRG9jdW1lbnRTeW1ib2wgPSB7fSkpO1xuLyoqXG4gKiBBIHNldCBvZiBwcmVkZWZpbmVkIGNvZGUgYWN0aW9uIGtpbmRzXG4gKi9cbmV4cG9ydCB2YXIgQ29kZUFjdGlvbktpbmQ7XG4oZnVuY3Rpb24gKENvZGVBY3Rpb25LaW5kKSB7XG4gICAgLyoqXG4gICAgICogRW1wdHkga2luZC5cbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5FbXB0eSA9ICcnO1xuICAgIC8qKlxuICAgICAqIEJhc2Uga2luZCBmb3IgcXVpY2tmaXggYWN0aW9uczogJ3F1aWNrZml4J1xuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlF1aWNrRml4ID0gJ3F1aWNrZml4JztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIHJlZmFjdG9yaW5nIGFjdGlvbnM6ICdyZWZhY3RvcidcbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5SZWZhY3RvciA9ICdyZWZhY3Rvcic7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciByZWZhY3RvcmluZyBleHRyYWN0aW9uIGFjdGlvbnM6ICdyZWZhY3Rvci5leHRyYWN0J1xuICAgICAqXG4gICAgICogRXhhbXBsZSBleHRyYWN0IGFjdGlvbnM6XG4gICAgICpcbiAgICAgKiAtIEV4dHJhY3QgbWV0aG9kXG4gICAgICogLSBFeHRyYWN0IGZ1bmN0aW9uXG4gICAgICogLSBFeHRyYWN0IHZhcmlhYmxlXG4gICAgICogLSBFeHRyYWN0IGludGVyZmFjZSBmcm9tIGNsYXNzXG4gICAgICogLSAuLi5cbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5SZWZhY3RvckV4dHJhY3QgPSAncmVmYWN0b3IuZXh0cmFjdCc7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciByZWZhY3RvcmluZyBpbmxpbmUgYWN0aW9uczogJ3JlZmFjdG9yLmlubGluZSdcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgaW5saW5lIGFjdGlvbnM6XG4gICAgICpcbiAgICAgKiAtIElubGluZSBmdW5jdGlvblxuICAgICAqIC0gSW5saW5lIHZhcmlhYmxlXG4gICAgICogLSBJbmxpbmUgY29uc3RhbnRcbiAgICAgKiAtIC4uLlxuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlJlZmFjdG9ySW5saW5lID0gJ3JlZmFjdG9yLmlubGluZSc7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciByZWZhY3RvcmluZyByZXdyaXRlIGFjdGlvbnM6ICdyZWZhY3Rvci5yZXdyaXRlJ1xuICAgICAqXG4gICAgICogRXhhbXBsZSByZXdyaXRlIGFjdGlvbnM6XG4gICAgICpcbiAgICAgKiAtIENvbnZlcnQgSmF2YVNjcmlwdCBmdW5jdGlvbiB0byBjbGFzc1xuICAgICAqIC0gQWRkIG9yIHJlbW92ZSBwYXJhbWV0ZXJcbiAgICAgKiAtIEVuY2Fwc3VsYXRlIGZpZWxkXG4gICAgICogLSBNYWtlIG1ldGhvZCBzdGF0aWNcbiAgICAgKiAtIE1vdmUgbWV0aG9kIHRvIGJhc2UgY2xhc3NcbiAgICAgKiAtIC4uLlxuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlJlZmFjdG9yUmV3cml0ZSA9ICdyZWZhY3Rvci5yZXdyaXRlJztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIHNvdXJjZSBhY3Rpb25zOiBgc291cmNlYFxuICAgICAqXG4gICAgICogU291cmNlIGNvZGUgYWN0aW9ucyBhcHBseSB0byB0aGUgZW50aXJlIGZpbGUuXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuU291cmNlID0gJ3NvdXJjZSc7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciBhbiBvcmdhbml6ZSBpbXBvcnRzIHNvdXJjZSBhY3Rpb246IGBzb3VyY2Uub3JnYW5pemVJbXBvcnRzYFxuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlNvdXJjZU9yZ2FuaXplSW1wb3J0cyA9ICdzb3VyY2Uub3JnYW5pemVJbXBvcnRzJztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIGF1dG8tZml4IHNvdXJjZSBhY3Rpb25zOiBgc291cmNlLmZpeEFsbGAuXG4gICAgICpcbiAgICAgKiBGaXggYWxsIGFjdGlvbnMgYXV0b21hdGljYWxseSBmaXggZXJyb3JzIHRoYXQgaGF2ZSBhIGNsZWFyIGZpeCB0aGF0IGRvIG5vdCByZXF1aXJlIHVzZXIgaW5wdXQuXG4gICAgICogVGhleSBzaG91bGQgbm90IHN1cHByZXNzIGVycm9ycyBvciBwZXJmb3JtIHVuc2FmZSBmaXhlcyBzdWNoIGFzIGdlbmVyYXRpbmcgbmV3IHR5cGVzIG9yIGNsYXNzZXMuXG4gICAgICpcbiAgICAgKiBAc2luY2UgMy4xNS4wXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuU291cmNlRml4QWxsID0gJ3NvdXJjZS5maXhBbGwnO1xufSkoQ29kZUFjdGlvbktpbmQgfHwgKENvZGVBY3Rpb25LaW5kID0ge30pKTtcbi8qKlxuICogVGhlIHJlYXNvbiB3aHkgY29kZSBhY3Rpb25zIHdlcmUgcmVxdWVzdGVkLlxuICpcbiAqIEBzaW5jZSAzLjE3LjBcbiAqL1xuZXhwb3J0IHZhciBDb2RlQWN0aW9uVHJpZ2dlcktpbmQ7XG4oZnVuY3Rpb24gKENvZGVBY3Rpb25UcmlnZ2VyS2luZCkge1xuICAgIC8qKlxuICAgICAqIENvZGUgYWN0aW9ucyB3ZXJlIGV4cGxpY2l0bHkgcmVxdWVzdGVkIGJ5IHRoZSB1c2VyIG9yIGJ5IGFuIGV4dGVuc2lvbi5cbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uVHJpZ2dlcktpbmQuSW52b2tlZCA9IDE7XG4gICAgLyoqXG4gICAgICogQ29kZSBhY3Rpb25zIHdlcmUgcmVxdWVzdGVkIGF1dG9tYXRpY2FsbHkuXG4gICAgICpcbiAgICAgKiBUaGlzIHR5cGljYWxseSBoYXBwZW5zIHdoZW4gY3VycmVudCBzZWxlY3Rpb24gaW4gYSBmaWxlIGNoYW5nZXMsIGJ1dCBjYW5cbiAgICAgKiBhbHNvIGJlIHRyaWdnZXJlZCB3aGVuIGZpbGUgY29udGVudCBjaGFuZ2VzLlxuICAgICAqL1xuICAgIENvZGVBY3Rpb25UcmlnZ2VyS2luZC5BdXRvbWF0aWMgPSAyO1xufSkoQ29kZUFjdGlvblRyaWdnZXJLaW5kIHx8IChDb2RlQWN0aW9uVHJpZ2dlcktpbmQgPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29kZUFjdGlvbkNvbnRleHQgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgQ29kZUFjdGlvbkNvbnRleHR9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIENvZGVBY3Rpb25Db250ZXh0O1xuKGZ1bmN0aW9uIChDb2RlQWN0aW9uQ29udGV4dCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ29kZUFjdGlvbkNvbnRleHQgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUoZGlhZ25vc3RpY3MsIG9ubHksIHRyaWdnZXJLaW5kKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IGRpYWdub3N0aWNzIH07XG4gICAgICAgIGlmIChvbmx5ICE9PSB1bmRlZmluZWQgJiYgb25seSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmVzdWx0Lm9ubHkgPSBvbmx5O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmlnZ2VyS2luZCAhPT0gdW5kZWZpbmVkICYmIHRyaWdnZXJLaW5kICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXN1bHQudHJpZ2dlcktpbmQgPSB0cmlnZ2VyS2luZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBDb2RlQWN0aW9uQ29udGV4dC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBDb2RlQWN0aW9uQ29udGV4dH0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS5kaWFnbm9zdGljcywgRGlhZ25vc3RpYy5pcylcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUub25seSA9PT0gdW5kZWZpbmVkIHx8IElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLm9ubHksIElzLnN0cmluZykpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLnRyaWdnZXJLaW5kID09PSB1bmRlZmluZWQgfHwgY2FuZGlkYXRlLnRyaWdnZXJLaW5kID09PSBDb2RlQWN0aW9uVHJpZ2dlcktpbmQuSW52b2tlZCB8fCBjYW5kaWRhdGUudHJpZ2dlcktpbmQgPT09IENvZGVBY3Rpb25UcmlnZ2VyS2luZC5BdXRvbWF0aWMpO1xuICAgIH1cbiAgICBDb2RlQWN0aW9uQ29udGV4dC5pcyA9IGlzO1xufSkoQ29kZUFjdGlvbkNvbnRleHQgfHwgKENvZGVBY3Rpb25Db250ZXh0ID0ge30pKTtcbmV4cG9ydCB2YXIgQ29kZUFjdGlvbjtcbihmdW5jdGlvbiAoQ29kZUFjdGlvbikge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh0aXRsZSwga2luZE9yQ29tbWFuZE9yRWRpdCwga2luZCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0geyB0aXRsZSB9O1xuICAgICAgICBsZXQgY2hlY2tLaW5kID0gdHJ1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBraW5kT3JDb21tYW5kT3JFZGl0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY2hlY2tLaW5kID0gZmFsc2U7XG4gICAgICAgICAgICByZXN1bHQua2luZCA9IGtpbmRPckNvbW1hbmRPckVkaXQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoQ29tbWFuZC5pcyhraW5kT3JDb21tYW5kT3JFZGl0KSkge1xuICAgICAgICAgICAgcmVzdWx0LmNvbW1hbmQgPSBraW5kT3JDb21tYW5kT3JFZGl0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0LmVkaXQgPSBraW5kT3JDb21tYW5kT3JFZGl0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGVja0tpbmQgJiYga2luZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQua2luZCA9IGtpbmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgQ29kZUFjdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLnN0cmluZyhjYW5kaWRhdGUudGl0bGUpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmRpYWdub3N0aWNzID09PSB1bmRlZmluZWQgfHwgSXMudHlwZWRBcnJheShjYW5kaWRhdGUuZGlhZ25vc3RpY3MsIERpYWdub3N0aWMuaXMpKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5raW5kID09PSB1bmRlZmluZWQgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS5raW5kKSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuZWRpdCAhPT0gdW5kZWZpbmVkIHx8IGNhbmRpZGF0ZS5jb21tYW5kICE9PSB1bmRlZmluZWQpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmNvbW1hbmQgPT09IHVuZGVmaW5lZCB8fCBDb21tYW5kLmlzKGNhbmRpZGF0ZS5jb21tYW5kKSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuaXNQcmVmZXJyZWQgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5pc1ByZWZlcnJlZCkpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmVkaXQgPT09IHVuZGVmaW5lZCB8fCBXb3Jrc3BhY2VFZGl0LmlzKGNhbmRpZGF0ZS5lZGl0KSk7XG4gICAgfVxuICAgIENvZGVBY3Rpb24uaXMgPSBpcztcbn0pKENvZGVBY3Rpb24gfHwgKENvZGVBY3Rpb24gPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29kZUxlbnMgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgQ29kZUxlbnN9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIENvZGVMZW5zO1xuKGZ1bmN0aW9uIChDb2RlTGVucykge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ29kZUxlbnMgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIGRhdGEpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHsgcmFuZ2UgfTtcbiAgICAgICAgaWYgKElzLmRlZmluZWQoZGF0YSkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5kYXRhID0gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBDb2RlTGVucy5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBDb2RlTGVuc30gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLmNvbW1hbmQpIHx8IENvbW1hbmQuaXMoY2FuZGlkYXRlLmNvbW1hbmQpKTtcbiAgICB9XG4gICAgQ29kZUxlbnMuaXMgPSBpcztcbn0pKENvZGVMZW5zIHx8IChDb2RlTGVucyA9IHt9KSk7XG4vKipcbiAqIFRoZSBGb3JtYXR0aW5nT3B0aW9ucyBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBGb3JtYXR0aW5nT3B0aW9uc30gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgRm9ybWF0dGluZ09wdGlvbnM7XG4oZnVuY3Rpb24gKEZvcm1hdHRpbmdPcHRpb25zKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBGb3JtYXR0aW5nT3B0aW9ucyBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh0YWJTaXplLCBpbnNlcnRTcGFjZXMpIHtcbiAgICAgICAgcmV0dXJuIHsgdGFiU2l6ZSwgaW5zZXJ0U3BhY2VzIH07XG4gICAgfVxuICAgIEZvcm1hdHRpbmdPcHRpb25zLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIEZvcm1hdHRpbmdPcHRpb25zfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS50YWJTaXplKSAmJiBJcy5ib29sZWFuKGNhbmRpZGF0ZS5pbnNlcnRTcGFjZXMpO1xuICAgIH1cbiAgICBGb3JtYXR0aW5nT3B0aW9ucy5pcyA9IGlzO1xufSkoRm9ybWF0dGluZ09wdGlvbnMgfHwgKEZvcm1hdHRpbmdPcHRpb25zID0ge30pKTtcbi8qKlxuICogVGhlIERvY3VtZW50TGluayBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBEb2N1bWVudExpbmt9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIERvY3VtZW50TGluaztcbihmdW5jdGlvbiAoRG9jdW1lbnRMaW5rKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBEb2N1bWVudExpbmsgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIHRhcmdldCwgZGF0YSkge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgdGFyZ2V0LCBkYXRhIH07XG4gICAgfVxuICAgIERvY3VtZW50TGluay5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBEb2N1bWVudExpbmt9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS50YXJnZXQpIHx8IElzLnN0cmluZyhjYW5kaWRhdGUudGFyZ2V0KSk7XG4gICAgfVxuICAgIERvY3VtZW50TGluay5pcyA9IGlzO1xufSkoRG9jdW1lbnRMaW5rIHx8IChEb2N1bWVudExpbmsgPSB7fSkpO1xuLyoqXG4gKiBUaGUgU2VsZWN0aW9uUmFuZ2UgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbiB0byB3b3JrIHdpdGhcbiAqIFNlbGVjdGlvblJhbmdlIGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIFNlbGVjdGlvblJhbmdlO1xuKGZ1bmN0aW9uIChTZWxlY3Rpb25SYW5nZSkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgU2VsZWN0aW9uUmFuZ2VcbiAgICAgKiBAcGFyYW0gcmFuZ2UgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSBwYXJlbnQgYW4gb3B0aW9uYWwgcGFyZW50LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgcGFyZW50KSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCBwYXJlbnQgfTtcbiAgICB9XG4gICAgU2VsZWN0aW9uUmFuZ2UuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIChjYW5kaWRhdGUucGFyZW50ID09PSB1bmRlZmluZWQgfHwgU2VsZWN0aW9uUmFuZ2UuaXMoY2FuZGlkYXRlLnBhcmVudCkpO1xuICAgIH1cbiAgICBTZWxlY3Rpb25SYW5nZS5pcyA9IGlzO1xufSkoU2VsZWN0aW9uUmFuZ2UgfHwgKFNlbGVjdGlvblJhbmdlID0ge30pKTtcbi8qKlxuICogQSBzZXQgb2YgcHJlZGVmaW5lZCB0b2tlbiB0eXBlcy4gVGhpcyBzZXQgaXMgbm90IGZpeGVkXG4gKiBhbiBjbGllbnRzIGNhbiBzcGVjaWZ5IGFkZGl0aW9uYWwgdG9rZW4gdHlwZXMgdmlhIHRoZVxuICogY29ycmVzcG9uZGluZyBjbGllbnQgY2FwYWJpbGl0aWVzLlxuICpcbiAqIEBzaW5jZSAzLjE2LjBcbiAqL1xuZXhwb3J0IHZhciBTZW1hbnRpY1Rva2VuVHlwZXM7XG4oZnVuY3Rpb24gKFNlbWFudGljVG9rZW5UeXBlcykge1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcIm5hbWVzcGFjZVwiXSA9IFwibmFtZXNwYWNlXCI7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIGdlbmVyaWMgdHlwZS4gQWN0cyBhcyBhIGZhbGxiYWNrIGZvciB0eXBlcyB3aGljaCBjYW4ndCBiZSBtYXBwZWQgdG9cbiAgICAgKiBhIHNwZWNpZmljIHR5cGUgbGlrZSBjbGFzcyBvciBlbnVtLlxuICAgICAqL1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInR5cGVcIl0gPSBcInR5cGVcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJjbGFzc1wiXSA9IFwiY2xhc3NcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJlbnVtXCJdID0gXCJlbnVtXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wiaW50ZXJmYWNlXCJdID0gXCJpbnRlcmZhY2VcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJzdHJ1Y3RcIl0gPSBcInN0cnVjdFwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInR5cGVQYXJhbWV0ZXJcIl0gPSBcInR5cGVQYXJhbWV0ZXJcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJwYXJhbWV0ZXJcIl0gPSBcInBhcmFtZXRlclwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInZhcmlhYmxlXCJdID0gXCJ2YXJpYWJsZVwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInByb3BlcnR5XCJdID0gXCJwcm9wZXJ0eVwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImVudW1NZW1iZXJcIl0gPSBcImVudW1NZW1iZXJcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJldmVudFwiXSA9IFwiZXZlbnRcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJmdW5jdGlvblwiXSA9IFwiZnVuY3Rpb25cIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJtZXRob2RcIl0gPSBcIm1ldGhvZFwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcIm1hY3JvXCJdID0gXCJtYWNyb1wiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImtleXdvcmRcIl0gPSBcImtleXdvcmRcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJtb2RpZmllclwiXSA9IFwibW9kaWZpZXJcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJjb21tZW50XCJdID0gXCJjb21tZW50XCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wic3RyaW5nXCJdID0gXCJzdHJpbmdcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJudW1iZXJcIl0gPSBcIm51bWJlclwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInJlZ2V4cFwiXSA9IFwicmVnZXhwXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wib3BlcmF0b3JcIl0gPSBcIm9wZXJhdG9yXCI7XG4gICAgLyoqXG4gICAgICogQHNpbmNlIDMuMTcuMFxuICAgICAqL1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImRlY29yYXRvclwiXSA9IFwiZGVjb3JhdG9yXCI7XG59KShTZW1hbnRpY1Rva2VuVHlwZXMgfHwgKFNlbWFudGljVG9rZW5UeXBlcyA9IHt9KSk7XG4vKipcbiAqIEEgc2V0IG9mIHByZWRlZmluZWQgdG9rZW4gbW9kaWZpZXJzLiBUaGlzIHNldCBpcyBub3QgZml4ZWRcbiAqIGFuIGNsaWVudHMgY2FuIHNwZWNpZnkgYWRkaXRpb25hbCB0b2tlbiB0eXBlcyB2aWEgdGhlXG4gKiBjb3JyZXNwb25kaW5nIGNsaWVudCBjYXBhYmlsaXRpZXMuXG4gKlxuICogQHNpbmNlIDMuMTYuMFxuICovXG5leHBvcnQgdmFyIFNlbWFudGljVG9rZW5Nb2RpZmllcnM7XG4oZnVuY3Rpb24gKFNlbWFudGljVG9rZW5Nb2RpZmllcnMpIHtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wiZGVjbGFyYXRpb25cIl0gPSBcImRlY2xhcmF0aW9uXCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcImRlZmluaXRpb25cIl0gPSBcImRlZmluaXRpb25cIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wicmVhZG9ubHlcIl0gPSBcInJlYWRvbmx5XCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcInN0YXRpY1wiXSA9IFwic3RhdGljXCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcImRlcHJlY2F0ZWRcIl0gPSBcImRlcHJlY2F0ZWRcIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wiYWJzdHJhY3RcIl0gPSBcImFic3RyYWN0XCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcImFzeW5jXCJdID0gXCJhc3luY1wiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJtb2RpZmljYXRpb25cIl0gPSBcIm1vZGlmaWNhdGlvblwiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJkb2N1bWVudGF0aW9uXCJdID0gXCJkb2N1bWVudGF0aW9uXCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcImRlZmF1bHRMaWJyYXJ5XCJdID0gXCJkZWZhdWx0TGlicmFyeVwiO1xufSkoU2VtYW50aWNUb2tlbk1vZGlmaWVycyB8fCAoU2VtYW50aWNUb2tlbk1vZGlmaWVycyA9IHt9KSk7XG4vKipcbiAqIEBzaW5jZSAzLjE2LjBcbiAqL1xuZXhwb3J0IHZhciBTZW1hbnRpY1Rva2VucztcbihmdW5jdGlvbiAoU2VtYW50aWNUb2tlbnMpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiAoY2FuZGlkYXRlLnJlc3VsdElkID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIGNhbmRpZGF0ZS5yZXN1bHRJZCA9PT0gJ3N0cmluZycpICYmXG4gICAgICAgICAgICBBcnJheS5pc0FycmF5KGNhbmRpZGF0ZS5kYXRhKSAmJiAoY2FuZGlkYXRlLmRhdGEubGVuZ3RoID09PSAwIHx8IHR5cGVvZiBjYW5kaWRhdGUuZGF0YVswXSA9PT0gJ251bWJlcicpO1xuICAgIH1cbiAgICBTZW1hbnRpY1Rva2Vucy5pcyA9IGlzO1xufSkoU2VtYW50aWNUb2tlbnMgfHwgKFNlbWFudGljVG9rZW5zID0ge30pKTtcbi8qKlxuICogVGhlIElubGluZVZhbHVlVGV4dCBuYW1lc3BhY2UgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCBJbmxpbmVWYWx1ZVRleHRzLlxuICpcbiAqIEBzaW5jZSAzLjE3LjBcbiAqL1xuZXhwb3J0IHZhciBJbmxpbmVWYWx1ZVRleHQ7XG4oZnVuY3Rpb24gKElubGluZVZhbHVlVGV4dCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgSW5saW5lVmFsdWVUZXh0IGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCB0ZXh0KSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCB0ZXh0IH07XG4gICAgfVxuICAgIElubGluZVZhbHVlVGV4dC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgIT09IHVuZGVmaW5lZCAmJiBjYW5kaWRhdGUgIT09IG51bGwgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnRleHQpO1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZVRleHQuaXMgPSBpcztcbn0pKElubGluZVZhbHVlVGV4dCB8fCAoSW5saW5lVmFsdWVUZXh0ID0ge30pKTtcbi8qKlxuICogVGhlIElubGluZVZhbHVlVmFyaWFibGVMb29rdXAgbmFtZXNwYWNlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGggSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cHMuXG4gKlxuICogQHNpbmNlIDMuMTcuMFxuICovXG5leHBvcnQgdmFyIElubGluZVZhbHVlVmFyaWFibGVMb29rdXA7XG4oZnVuY3Rpb24gKElubGluZVZhbHVlVmFyaWFibGVMb29rdXApIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IElubGluZVZhbHVlVGV4dCBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgdmFyaWFibGVOYW1lLCBjYXNlU2Vuc2l0aXZlTG9va3VwKSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCB2YXJpYWJsZU5hbWUsIGNhc2VTZW5zaXRpdmVMb29rdXAgfTtcbiAgICB9XG4gICAgSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgIT09IHVuZGVmaW5lZCAmJiBjYW5kaWRhdGUgIT09IG51bGwgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiBJcy5ib29sZWFuKGNhbmRpZGF0ZS5jYXNlU2Vuc2l0aXZlTG9va3VwKVxuICAgICAgICAgICAgJiYgKElzLnN0cmluZyhjYW5kaWRhdGUudmFyaWFibGVOYW1lKSB8fCBjYW5kaWRhdGUudmFyaWFibGVOYW1lID09PSB1bmRlZmluZWQpO1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwLmlzID0gaXM7XG59KShJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwIHx8IChJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwID0ge30pKTtcbi8qKlxuICogVGhlIElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uIG5hbWVzcGFjZSBwcm92aWRlcyBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uLlxuICpcbiAqIEBzaW5jZSAzLjE3LjBcbiAqL1xuZXhwb3J0IHZhciBJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbjtcbihmdW5jdGlvbiAoSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCBleHByZXNzaW9uKSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCBleHByZXNzaW9uIH07XG4gICAgfVxuICAgIElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAhPT0gdW5kZWZpbmVkICYmIGNhbmRpZGF0ZSAhPT0gbnVsbCAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpXG4gICAgICAgICAgICAmJiAoSXMuc3RyaW5nKGNhbmRpZGF0ZS5leHByZXNzaW9uKSB8fCBjYW5kaWRhdGUuZXhwcmVzc2lvbiA9PT0gdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24uaXMgPSBpcztcbn0pKElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uIHx8IChJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBJbmxpbmVWYWx1ZUNvbnRleHQgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgSW5saW5lVmFsdWVDb250ZXh0fSBsaXRlcmFscy5cbiAqXG4gKiBAc2luY2UgMy4xNy4wXG4gKi9cbmV4cG9ydCB2YXIgSW5saW5lVmFsdWVDb250ZXh0O1xuKGZ1bmN0aW9uIChJbmxpbmVWYWx1ZUNvbnRleHQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IElubGluZVZhbHVlQ29udGV4dCBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShmcmFtZUlkLCBzdG9wcGVkTG9jYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHsgZnJhbWVJZCwgc3RvcHBlZExvY2F0aW9uIH07XG4gICAgfVxuICAgIElubGluZVZhbHVlQ29udGV4dC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBJbmxpbmVWYWx1ZUNvbnRleHR9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyh2YWx1ZS5zdG9wcGVkTG9jYXRpb24pO1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZUNvbnRleHQuaXMgPSBpcztcbn0pKElubGluZVZhbHVlQ29udGV4dCB8fCAoSW5saW5lVmFsdWVDb250ZXh0ID0ge30pKTtcbi8qKlxuICogSW5sYXkgaGludCBraW5kcy5cbiAqXG4gKiBAc2luY2UgMy4xNy4wXG4gKi9cbmV4cG9ydCB2YXIgSW5sYXlIaW50S2luZDtcbihmdW5jdGlvbiAoSW5sYXlIaW50S2luZCkge1xuICAgIC8qKlxuICAgICAqIEFuIGlubGF5IGhpbnQgdGhhdCBmb3IgYSB0eXBlIGFubm90YXRpb24uXG4gICAgICovXG4gICAgSW5sYXlIaW50S2luZC5UeXBlID0gMTtcbiAgICAvKipcbiAgICAgKiBBbiBpbmxheSBoaW50IHRoYXQgaXMgZm9yIGEgcGFyYW1ldGVyLlxuICAgICAqL1xuICAgIElubGF5SGludEtpbmQuUGFyYW1ldGVyID0gMjtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWUgPT09IDEgfHwgdmFsdWUgPT09IDI7XG4gICAgfVxuICAgIElubGF5SGludEtpbmQuaXMgPSBpcztcbn0pKElubGF5SGludEtpbmQgfHwgKElubGF5SGludEtpbmQgPSB7fSkpO1xuZXhwb3J0IHZhciBJbmxheUhpbnRMYWJlbFBhcnQ7XG4oZnVuY3Rpb24gKElubGF5SGludExhYmVsUGFydCkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh2YWx1ZSkge1xuICAgICAgICByZXR1cm4geyB2YWx1ZSB9O1xuICAgIH1cbiAgICBJbmxheUhpbnRMYWJlbFBhcnQuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLnRvb2x0aXAgPT09IHVuZGVmaW5lZCB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLnRvb2x0aXApIHx8IE1hcmt1cENvbnRlbnQuaXMoY2FuZGlkYXRlLnRvb2x0aXApKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS5sb2NhdGlvbiA9PT0gdW5kZWZpbmVkIHx8IExvY2F0aW9uLmlzKGNhbmRpZGF0ZS5sb2NhdGlvbikpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLmNvbW1hbmQgPT09IHVuZGVmaW5lZCB8fCBDb21tYW5kLmlzKGNhbmRpZGF0ZS5jb21tYW5kKSk7XG4gICAgfVxuICAgIElubGF5SGludExhYmVsUGFydC5pcyA9IGlzO1xufSkoSW5sYXlIaW50TGFiZWxQYXJ0IHx8IChJbmxheUhpbnRMYWJlbFBhcnQgPSB7fSkpO1xuZXhwb3J0IHZhciBJbmxheUhpbnQ7XG4oZnVuY3Rpb24gKElubGF5SGludCkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShwb3NpdGlvbiwgbGFiZWwsIGtpbmQpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0geyBwb3NpdGlvbiwgbGFiZWwgfTtcbiAgICAgICAgaWYgKGtpbmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmtpbmQgPSBraW5kO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIElubGF5SGludC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgUG9zaXRpb24uaXMoY2FuZGlkYXRlLnBvc2l0aW9uKVxuICAgICAgICAgICAgJiYgKElzLnN0cmluZyhjYW5kaWRhdGUubGFiZWwpIHx8IElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLmxhYmVsLCBJbmxheUhpbnRMYWJlbFBhcnQuaXMpKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS5raW5kID09PSB1bmRlZmluZWQgfHwgSW5sYXlIaW50S2luZC5pcyhjYW5kaWRhdGUua2luZCkpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLnRleHRFZGl0cyA9PT0gdW5kZWZpbmVkKSB8fCBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS50ZXh0RWRpdHMsIFRleHRFZGl0LmlzKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS50b29sdGlwID09PSB1bmRlZmluZWQgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS50b29sdGlwKSB8fCBNYXJrdXBDb250ZW50LmlzKGNhbmRpZGF0ZS50b29sdGlwKSlcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUucGFkZGluZ0xlZnQgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5wYWRkaW5nTGVmdCkpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLnBhZGRpbmdSaWdodCA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLnBhZGRpbmdSaWdodCkpO1xuICAgIH1cbiAgICBJbmxheUhpbnQuaXMgPSBpcztcbn0pKElubGF5SGludCB8fCAoSW5sYXlIaW50ID0ge30pKTtcbmV4cG9ydCB2YXIgU3RyaW5nVmFsdWU7XG4oZnVuY3Rpb24gKFN0cmluZ1ZhbHVlKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlU25pcHBldCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4geyBraW5kOiAnc25pcHBldCcsIHZhbHVlIH07XG4gICAgfVxuICAgIFN0cmluZ1ZhbHVlLmNyZWF0ZVNuaXBwZXQgPSBjcmVhdGVTbmlwcGV0O1xufSkoU3RyaW5nVmFsdWUgfHwgKFN0cmluZ1ZhbHVlID0ge30pKTtcbmV4cG9ydCB2YXIgSW5saW5lQ29tcGxldGlvbkl0ZW07XG4oZnVuY3Rpb24gKElubGluZUNvbXBsZXRpb25JdGVtKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKGluc2VydFRleHQsIGZpbHRlclRleHQsIHJhbmdlLCBjb21tYW5kKSB7XG4gICAgICAgIHJldHVybiB7IGluc2VydFRleHQsIGZpbHRlclRleHQsIHJhbmdlLCBjb21tYW5kIH07XG4gICAgfVxuICAgIElubGluZUNvbXBsZXRpb25JdGVtLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKElubGluZUNvbXBsZXRpb25JdGVtIHx8IChJbmxpbmVDb21wbGV0aW9uSXRlbSA9IHt9KSk7XG5leHBvcnQgdmFyIElubGluZUNvbXBsZXRpb25MaXN0O1xuKGZ1bmN0aW9uIChJbmxpbmVDb21wbGV0aW9uTGlzdCkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShpdGVtcykge1xuICAgICAgICByZXR1cm4geyBpdGVtcyB9O1xuICAgIH1cbiAgICBJbmxpbmVDb21wbGV0aW9uTGlzdC5jcmVhdGUgPSBjcmVhdGU7XG59KShJbmxpbmVDb21wbGV0aW9uTGlzdCB8fCAoSW5saW5lQ29tcGxldGlvbkxpc3QgPSB7fSkpO1xuLyoqXG4gKiBEZXNjcmliZXMgaG93IGFuIHtAbGluayBJbmxpbmVDb21wbGV0aW9uSXRlbVByb3ZpZGVyIGlubGluZSBjb21wbGV0aW9uIHByb3ZpZGVyfSB3YXMgdHJpZ2dlcmVkLlxuICpcbiAqIEBzaW5jZSAzLjE4LjBcbiAqIEBwcm9wb3NlZFxuICovXG5leHBvcnQgdmFyIElubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZDtcbihmdW5jdGlvbiAoSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kKSB7XG4gICAgLyoqXG4gICAgICogQ29tcGxldGlvbiB3YXMgdHJpZ2dlcmVkIGV4cGxpY2l0bHkgYnkgYSB1c2VyIGdlc3R1cmUuXG4gICAgICovXG4gICAgSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kLkludm9rZWQgPSAwO1xuICAgIC8qKlxuICAgICAqIENvbXBsZXRpb24gd2FzIHRyaWdnZXJlZCBhdXRvbWF0aWNhbGx5IHdoaWxlIGVkaXRpbmcuXG4gICAgICovXG4gICAgSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kLkF1dG9tYXRpYyA9IDE7XG59KShJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmQgfHwgKElubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZCA9IHt9KSk7XG5leHBvcnQgdmFyIFNlbGVjdGVkQ29tcGxldGlvbkluZm87XG4oZnVuY3Rpb24gKFNlbGVjdGVkQ29tcGxldGlvbkluZm8pIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIHRleHQpIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIHRleHQgfTtcbiAgICB9XG4gICAgU2VsZWN0ZWRDb21wbGV0aW9uSW5mby5jcmVhdGUgPSBjcmVhdGU7XG59KShTZWxlY3RlZENvbXBsZXRpb25JbmZvIHx8IChTZWxlY3RlZENvbXBsZXRpb25JbmZvID0ge30pKTtcbmV4cG9ydCB2YXIgSW5saW5lQ29tcGxldGlvbkNvbnRleHQ7XG4oZnVuY3Rpb24gKElubGluZUNvbXBsZXRpb25Db250ZXh0KSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKHRyaWdnZXJLaW5kLCBzZWxlY3RlZENvbXBsZXRpb25JbmZvKSB7XG4gICAgICAgIHJldHVybiB7IHRyaWdnZXJLaW5kLCBzZWxlY3RlZENvbXBsZXRpb25JbmZvIH07XG4gICAgfVxuICAgIElubGluZUNvbXBsZXRpb25Db250ZXh0LmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKElubGluZUNvbXBsZXRpb25Db250ZXh0IHx8IChJbmxpbmVDb21wbGV0aW9uQ29udGV4dCA9IHt9KSk7XG5leHBvcnQgdmFyIFdvcmtzcGFjZUZvbGRlcjtcbihmdW5jdGlvbiAoV29ya3NwYWNlRm9sZGVyKSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgVVJJLmlzKGNhbmRpZGF0ZS51cmkpICYmIElzLnN0cmluZyhjYW5kaWRhdGUubmFtZSk7XG4gICAgfVxuICAgIFdvcmtzcGFjZUZvbGRlci5pcyA9IGlzO1xufSkoV29ya3NwYWNlRm9sZGVyIHx8IChXb3Jrc3BhY2VGb2xkZXIgPSB7fSkpO1xuZXhwb3J0IGNvbnN0IEVPTCA9IFsnXFxuJywgJ1xcclxcbicsICdcXHInXTtcbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHRoZSB0ZXh0IGRvY3VtZW50IGZyb20gdGhlIG5ldyB2c2NvZGUtbGFuZ3VhZ2VzZXJ2ZXItdGV4dGRvY3VtZW50IHBhY2thZ2UuXG4gKi9cbmV4cG9ydCB2YXIgVGV4dERvY3VtZW50O1xuKGZ1bmN0aW9uIChUZXh0RG9jdW1lbnQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IElUZXh0RG9jdW1lbnQgbGl0ZXJhbCBmcm9tIHRoZSBnaXZlbiB1cmkgYW5kIGNvbnRlbnQuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgZG9jdW1lbnQncyB1cmkuXG4gICAgICogQHBhcmFtIGxhbmd1YWdlSWQgVGhlIGRvY3VtZW50J3MgbGFuZ3VhZ2UgSWQuXG4gICAgICogQHBhcmFtIHZlcnNpb24gVGhlIGRvY3VtZW50J3MgdmVyc2lvbi5cbiAgICAgKiBAcGFyYW0gY29udGVudCBUaGUgZG9jdW1lbnQncyBjb250ZW50LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmksIGxhbmd1YWdlSWQsIHZlcnNpb24sIGNvbnRlbnQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGdWxsVGV4dERvY3VtZW50KHVyaSwgbGFuZ3VhZ2VJZCwgdmVyc2lvbiwgY29udGVudCk7XG4gICAgfVxuICAgIFRleHREb2N1bWVudC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBJVGV4dERvY3VtZW50fSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudXJpKSAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5sYW5ndWFnZUlkKSB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLmxhbmd1YWdlSWQpKSAmJiBJcy51aW50ZWdlcihjYW5kaWRhdGUubGluZUNvdW50KVxuICAgICAgICAgICAgJiYgSXMuZnVuYyhjYW5kaWRhdGUuZ2V0VGV4dCkgJiYgSXMuZnVuYyhjYW5kaWRhdGUucG9zaXRpb25BdCkgJiYgSXMuZnVuYyhjYW5kaWRhdGUub2Zmc2V0QXQpID8gdHJ1ZSA6IGZhbHNlO1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnQuaXMgPSBpcztcbiAgICBmdW5jdGlvbiBhcHBseUVkaXRzKGRvY3VtZW50LCBlZGl0cykge1xuICAgICAgICBsZXQgdGV4dCA9IGRvY3VtZW50LmdldFRleHQoKTtcbiAgICAgICAgbGV0IHNvcnRlZEVkaXRzID0gbWVyZ2VTb3J0KGVkaXRzLCAoYSwgYikgPT4ge1xuICAgICAgICAgICAgbGV0IGRpZmYgPSBhLnJhbmdlLnN0YXJ0LmxpbmUgLSBiLnJhbmdlLnN0YXJ0LmxpbmU7XG4gICAgICAgICAgICBpZiAoZGlmZiA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhLnJhbmdlLnN0YXJ0LmNoYXJhY3RlciAtIGIucmFuZ2Uuc3RhcnQuY2hhcmFjdGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRpZmY7XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgbGFzdE1vZGlmaWVkT2Zmc2V0ID0gdGV4dC5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGkgPSBzb3J0ZWRFZGl0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgbGV0IGUgPSBzb3J0ZWRFZGl0c1tpXTtcbiAgICAgICAgICAgIGxldCBzdGFydE9mZnNldCA9IGRvY3VtZW50Lm9mZnNldEF0KGUucmFuZ2Uuc3RhcnQpO1xuICAgICAgICAgICAgbGV0IGVuZE9mZnNldCA9IGRvY3VtZW50Lm9mZnNldEF0KGUucmFuZ2UuZW5kKTtcbiAgICAgICAgICAgIGlmIChlbmRPZmZzZXQgPD0gbGFzdE1vZGlmaWVkT2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIHN0YXJ0T2Zmc2V0KSArIGUubmV3VGV4dCArIHRleHQuc3Vic3RyaW5nKGVuZE9mZnNldCwgdGV4dC5sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdPdmVybGFwcGluZyBlZGl0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsYXN0TW9kaWZpZWRPZmZzZXQgPSBzdGFydE9mZnNldDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50LmFwcGx5RWRpdHMgPSBhcHBseUVkaXRzO1xuICAgIGZ1bmN0aW9uIG1lcmdlU29ydChkYXRhLCBjb21wYXJlKSB7XG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCA8PSAxKSB7XG4gICAgICAgICAgICAvLyBzb3J0ZWRcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHAgPSAoZGF0YS5sZW5ndGggLyAyKSB8IDA7XG4gICAgICAgIGNvbnN0IGxlZnQgPSBkYXRhLnNsaWNlKDAsIHApO1xuICAgICAgICBjb25zdCByaWdodCA9IGRhdGEuc2xpY2UocCk7XG4gICAgICAgIG1lcmdlU29ydChsZWZ0LCBjb21wYXJlKTtcbiAgICAgICAgbWVyZ2VTb3J0KHJpZ2h0LCBjb21wYXJlKTtcbiAgICAgICAgbGV0IGxlZnRJZHggPSAwO1xuICAgICAgICBsZXQgcmlnaHRJZHggPSAwO1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIHdoaWxlIChsZWZ0SWR4IDwgbGVmdC5sZW5ndGggJiYgcmlnaHRJZHggPCByaWdodC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCByZXQgPSBjb21wYXJlKGxlZnRbbGVmdElkeF0sIHJpZ2h0W3JpZ2h0SWR4XSk7XG4gICAgICAgICAgICBpZiAocmV0IDw9IDApIHtcbiAgICAgICAgICAgICAgICAvLyBzbWFsbGVyX2VxdWFsIC0+IHRha2UgbGVmdCB0byBwcmVzZXJ2ZSBvcmRlclxuICAgICAgICAgICAgICAgIGRhdGFbaSsrXSA9IGxlZnRbbGVmdElkeCsrXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGdyZWF0ZXIgLT4gdGFrZSByaWdodFxuICAgICAgICAgICAgICAgIGRhdGFbaSsrXSA9IHJpZ2h0W3JpZ2h0SWR4KytdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChsZWZ0SWR4IDwgbGVmdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRhdGFbaSsrXSA9IGxlZnRbbGVmdElkeCsrXTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAocmlnaHRJZHggPCByaWdodC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRhdGFbaSsrXSA9IHJpZ2h0W3JpZ2h0SWR4KytdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbn0pKFRleHREb2N1bWVudCB8fCAoVGV4dERvY3VtZW50ID0ge30pKTtcbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHRoZSB0ZXh0IGRvY3VtZW50IGZyb20gdGhlIG5ldyB2c2NvZGUtbGFuZ3VhZ2VzZXJ2ZXItdGV4dGRvY3VtZW50IHBhY2thZ2UuXG4gKi9cbmNsYXNzIEZ1bGxUZXh0RG9jdW1lbnQge1xuICAgIGNvbnN0cnVjdG9yKHVyaSwgbGFuZ3VhZ2VJZCwgdmVyc2lvbiwgY29udGVudCkge1xuICAgICAgICB0aGlzLl91cmkgPSB1cmk7XG4gICAgICAgIHRoaXMuX2xhbmd1YWdlSWQgPSBsYW5ndWFnZUlkO1xuICAgICAgICB0aGlzLl92ZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgICAgdGhpcy5fY29udGVudCA9IGNvbnRlbnQ7XG4gICAgICAgIHRoaXMuX2xpbmVPZmZzZXRzID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBnZXQgdXJpKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdXJpO1xuICAgIH1cbiAgICBnZXQgbGFuZ3VhZ2VJZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhbmd1YWdlSWQ7XG4gICAgfVxuICAgIGdldCB2ZXJzaW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmVyc2lvbjtcbiAgICB9XG4gICAgZ2V0VGV4dChyYW5nZSkge1xuICAgICAgICBpZiAocmFuZ2UpIHtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IHRoaXMub2Zmc2V0QXQocmFuZ2Uuc3RhcnQpO1xuICAgICAgICAgICAgbGV0IGVuZCA9IHRoaXMub2Zmc2V0QXQocmFuZ2UuZW5kKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb250ZW50LnN1YnN0cmluZyhzdGFydCwgZW5kKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fY29udGVudDtcbiAgICB9XG4gICAgdXBkYXRlKGV2ZW50LCB2ZXJzaW9uKSB7XG4gICAgICAgIHRoaXMuX2NvbnRlbnQgPSBldmVudC50ZXh0O1xuICAgICAgICB0aGlzLl92ZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgICAgdGhpcy5fbGluZU9mZnNldHMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGdldExpbmVPZmZzZXRzKCkge1xuICAgICAgICBpZiAodGhpcy5fbGluZU9mZnNldHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbGV0IGxpbmVPZmZzZXRzID0gW107XG4gICAgICAgICAgICBsZXQgdGV4dCA9IHRoaXMuX2NvbnRlbnQ7XG4gICAgICAgICAgICBsZXQgaXNMaW5lU3RhcnQgPSB0cnVlO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzTGluZVN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgIGxpbmVPZmZzZXRzLnB1c2goaSk7XG4gICAgICAgICAgICAgICAgICAgIGlzTGluZVN0YXJ0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBjaCA9IHRleHQuY2hhckF0KGkpO1xuICAgICAgICAgICAgICAgIGlzTGluZVN0YXJ0ID0gKGNoID09PSAnXFxyJyB8fCBjaCA9PT0gJ1xcbicpO1xuICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ1xccicgJiYgaSArIDEgPCB0ZXh0Lmxlbmd0aCAmJiB0ZXh0LmNoYXJBdChpICsgMSkgPT09ICdcXG4nKSB7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNMaW5lU3RhcnQgJiYgdGV4dC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGluZU9mZnNldHMucHVzaCh0ZXh0Lmxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9saW5lT2Zmc2V0cyA9IGxpbmVPZmZzZXRzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9saW5lT2Zmc2V0cztcbiAgICB9XG4gICAgcG9zaXRpb25BdChvZmZzZXQpIHtcbiAgICAgICAgb2Zmc2V0ID0gTWF0aC5tYXgoTWF0aC5taW4ob2Zmc2V0LCB0aGlzLl9jb250ZW50Lmxlbmd0aCksIDApO1xuICAgICAgICBsZXQgbGluZU9mZnNldHMgPSB0aGlzLmdldExpbmVPZmZzZXRzKCk7XG4gICAgICAgIGxldCBsb3cgPSAwLCBoaWdoID0gbGluZU9mZnNldHMubGVuZ3RoO1xuICAgICAgICBpZiAoaGlnaCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFBvc2l0aW9uLmNyZWF0ZSgwLCBvZmZzZXQpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgICAgICAgICBsZXQgbWlkID0gTWF0aC5mbG9vcigobG93ICsgaGlnaCkgLyAyKTtcbiAgICAgICAgICAgIGlmIChsaW5lT2Zmc2V0c1ttaWRdID4gb2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgaGlnaCA9IG1pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvdyA9IG1pZCArIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gbG93IGlzIHRoZSBsZWFzdCB4IGZvciB3aGljaCB0aGUgbGluZSBvZmZzZXQgaXMgbGFyZ2VyIHRoYW4gdGhlIGN1cnJlbnQgb2Zmc2V0XG4gICAgICAgIC8vIG9yIGFycmF5Lmxlbmd0aCBpZiBubyBsaW5lIG9mZnNldCBpcyBsYXJnZXIgdGhhbiB0aGUgY3VycmVudCBvZmZzZXRcbiAgICAgICAgbGV0IGxpbmUgPSBsb3cgLSAxO1xuICAgICAgICByZXR1cm4gUG9zaXRpb24uY3JlYXRlKGxpbmUsIG9mZnNldCAtIGxpbmVPZmZzZXRzW2xpbmVdKTtcbiAgICB9XG4gICAgb2Zmc2V0QXQocG9zaXRpb24pIHtcbiAgICAgICAgbGV0IGxpbmVPZmZzZXRzID0gdGhpcy5nZXRMaW5lT2Zmc2V0cygpO1xuICAgICAgICBpZiAocG9zaXRpb24ubGluZSA+PSBsaW5lT2Zmc2V0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb250ZW50Lmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwb3NpdGlvbi5saW5lIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGxpbmVPZmZzZXQgPSBsaW5lT2Zmc2V0c1twb3NpdGlvbi5saW5lXTtcbiAgICAgICAgbGV0IG5leHRMaW5lT2Zmc2V0ID0gKHBvc2l0aW9uLmxpbmUgKyAxIDwgbGluZU9mZnNldHMubGVuZ3RoKSA/IGxpbmVPZmZzZXRzW3Bvc2l0aW9uLmxpbmUgKyAxXSA6IHRoaXMuX2NvbnRlbnQubGVuZ3RoO1xuICAgICAgICByZXR1cm4gTWF0aC5tYXgoTWF0aC5taW4obGluZU9mZnNldCArIHBvc2l0aW9uLmNoYXJhY3RlciwgbmV4dExpbmVPZmZzZXQpLCBsaW5lT2Zmc2V0KTtcbiAgICB9XG4gICAgZ2V0IGxpbmVDb3VudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TGluZU9mZnNldHMoKS5sZW5ndGg7XG4gICAgfVxufVxudmFyIElzO1xuKGZ1bmN0aW9uIChJcykge1xuICAgIGNvbnN0IHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbiAgICBmdW5jdGlvbiBkZWZpbmVkKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnO1xuICAgIH1cbiAgICBJcy5kZWZpbmVkID0gZGVmaW5lZDtcbiAgICBmdW5jdGlvbiB1bmRlZmluZWQodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCc7XG4gICAgfVxuICAgIElzLnVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBmdW5jdGlvbiBib29sZWFuKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gZmFsc2U7XG4gICAgfVxuICAgIElzLmJvb2xlYW4gPSBib29sZWFuO1xuICAgIGZ1bmN0aW9uIHN0cmluZyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IFN0cmluZ10nO1xuICAgIH1cbiAgICBJcy5zdHJpbmcgPSBzdHJpbmc7XG4gICAgZnVuY3Rpb24gbnVtYmVyKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgTnVtYmVyXSc7XG4gICAgfVxuICAgIElzLm51bWJlciA9IG51bWJlcjtcbiAgICBmdW5jdGlvbiBudW1iZXJSYW5nZSh2YWx1ZSwgbWluLCBtYXgpIHtcbiAgICAgICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBOdW1iZXJdJyAmJiBtaW4gPD0gdmFsdWUgJiYgdmFsdWUgPD0gbWF4O1xuICAgIH1cbiAgICBJcy5udW1iZXJSYW5nZSA9IG51bWJlclJhbmdlO1xuICAgIGZ1bmN0aW9uIGludGVnZXIodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBOdW1iZXJdJyAmJiAtMjE0NzQ4MzY0OCA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSAyMTQ3NDgzNjQ3O1xuICAgIH1cbiAgICBJcy5pbnRlZ2VyID0gaW50ZWdlcjtcbiAgICBmdW5jdGlvbiB1aW50ZWdlcih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IE51bWJlcl0nICYmIDAgPD0gdmFsdWUgJiYgdmFsdWUgPD0gMjE0NzQ4MzY0NztcbiAgICB9XG4gICAgSXMudWludGVnZXIgPSB1aW50ZWdlcjtcbiAgICBmdW5jdGlvbiBmdW5jKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbiAgICB9XG4gICAgSXMuZnVuYyA9IGZ1bmM7XG4gICAgZnVuY3Rpb24gb2JqZWN0TGl0ZXJhbCh2YWx1ZSkge1xuICAgICAgICAvLyBTdHJpY3RseSBzcGVha2luZyBjbGFzcyBpbnN0YW5jZXMgcGFzcyB0aGlzIGNoZWNrIGFzIHdlbGwuIFNpbmNlIHRoZSBMU1BcbiAgICAgICAgLy8gZG9lc24ndCB1c2UgY2xhc3NlcyB3ZSBpZ25vcmUgdGhpcyBmb3Igbm93LiBJZiB3ZSBkbyB3ZSBuZWVkIHRvIGFkZCBzb21ldGhpbmdcbiAgICAgICAgLy8gbGlrZSB0aGlzOiBgT2JqZWN0LmdldFByb3RvdHlwZU9mKE9iamVjdC5nZXRQcm90b3R5cGVPZih4KSkgPT09IG51bGxgXG4gICAgICAgIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnO1xuICAgIH1cbiAgICBJcy5vYmplY3RMaXRlcmFsID0gb2JqZWN0TGl0ZXJhbDtcbiAgICBmdW5jdGlvbiB0eXBlZEFycmF5KHZhbHVlLCBjaGVjaykge1xuICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUuZXZlcnkoY2hlY2spO1xuICAgIH1cbiAgICBJcy50eXBlZEFycmF5ID0gdHlwZWRBcnJheTtcbn0pKElzIHx8IChJcyA9IHt9KSk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFLQSxhQUFPLGVBQWUsU0FBUyxjQUFjLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDNUQsY0FBUSxjQUFjLFFBQVEsUUFBUSxRQUFRLE9BQU8sUUFBUSxRQUFRLFFBQVEsU0FBUyxRQUFRLFNBQVMsUUFBUSxVQUFVO0FBQ3pILGVBQVMsUUFBUSxPQUFPO0FBQ3BCLGVBQU8sVUFBVSxRQUFRLFVBQVU7QUFBQSxNQUN2QztBQUNBLGNBQVEsVUFBVTtBQUNsQixlQUFTLE9BQU8sT0FBTztBQUNuQixlQUFPLE9BQU8sVUFBVSxZQUFZLGlCQUFpQjtBQUFBLE1BQ3pEO0FB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LHNCQUFzQjtBQUFBLFVBQ3RCLGVBQWU7QUFBQSxZQUNYO0FBQUEsWUFBYTtBQUFBLFlBQVM7QUFBQSxZQUN0QjtBQUFBLFlBQ0E7QUFBQSxZQUNBO0FBQUEsVUFDSjtBQUFBLFVBQ0EsYUFBYSxDQUFDLFFBQVEsU0FBUyxPQUFPLE9BQU8sRUFBRTtBQUFBLFFBQ25EO0FBQUEsUUFDQSxlQUFnQixFQUFFLFNBQVMsS0FBSztBQUFBLFFBQ2hDLFFBQWdCLEVBQUUsU0FBUyxLQUFLO0FBQUEsUUFDaEMsYUFBZ0IsRUFBRSxpQkFBaUIsTUFBTTtBQUFBLFFBQ3pDLFlBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsU0FBUyxNQUFNLEVBQUU7QUFBQSxRQUNyRCxvQkFBd0IsRUFBRSxTQUFTLEtBQUs7QUFBQSxRQUN4Qyx5QkFBeUIsRUFBRSxTQUFTLEtBQUs7QUFBQSxNQUM3QztBQUFBLElBQ0o7QUFBQSxFQUNKOyIsCiAgIm5hbWVzIjogWyJFcnJvckNvZGVzIiwgIk1lc3NhZ2UiLCAiVG91Y2giLCAiRGlzcG9zYWJsZSIsICJSQUwiLCAiRXZlbnQiLCAiSXMiLCAiQ2FuY2VsbGF0aW9uVG9rZW4iLCAiQ2FuY2VsbGF0aW9uU3RhdGUiLCAiX2Nvbm4iLCAiSXMiLCAiTWVzc2FnZVJlYWRlciIsICJBYnN0cmFjdE1lc3NhZ2VSZWFkZXIiLCAiUmVzb2x2ZWRNZXNzYWdlUmVhZGVyT3B0aW9ucyIsICJJcyIsICJNZXNzYWdlV3JpdGVyIiwgIkFic3RyYWN0TWVzc2FnZVdyaXRlciIsICJSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zIiwgInJlc3VsdCIsICJJcyIsICJDYW5jZWxOb3RpZmljYXRpb24iLCAiUHJvZ3Jlc3NUb2tlbiIsICJQcm9ncmVzc05vdGlmaWNhdGlvbiIsICJTdGFyUmVxdWVzdEhhbmRsZXIiLCAiVHJhY2UiLCAiVHJhY2VWYWx1ZXMiLCAiVHJhY2VGb3JtYXQiLCAiU2V0VHJhY2VOb3RpZmljYXRpb24iLCAiTG9nVHJhY2VOb3RpZmljYXRpb24iLCAiQ29ubmVjdGlvbkVycm9ycyIsICJDb25uZWN0aW9uU3RyYXRlZ3kiLCAiSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5IiwgIlJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5IiwgIkNhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kiLCAiQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kiLCAiQ2FuY2VsbGF0aW9uU3RyYXRlZ3kiLCAiTWVzc2FnZVN0cmF0ZWd5IiwgIkNvbm5lY3Rpb25PcHRpb25zIiwgIkNvbm5lY3Rpb25TdGF0ZSIsICJjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiIsICJzdGFydFRpbWUiLCAiUklMIiwgIm0iLCAiZXhwb3J0cyIsICJjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiIsICJpbXBvcnRfdnNjb2RlX2pzb25ycGMiLCAiaW1wb3J0X3ZzY29kZV9qc29ucnBjIiwgImltcG9ydF92c2NvZGVfanNvbnJwYyIsICJpbXBvcnRfdnNjb2RlX2pzb25ycGMiLCAiRG9jdW1lbnRVcmkiLCAiVVJJIiwgImludGVnZXIiLCAidWludGVnZXIiLCAiUG9zaXRpb24iLCAiUmFuZ2UiLCAiTG9jYXRpb24iLCAiTG9jYXRpb25MaW5rIiwgIkNvbG9yIiwgIkNvbG9ySW5mb3JtYXRpb24iLCAiQ29sb3JQcmVzZW50YXRpb24iLCAiRm9sZGluZ1JhbmdlS2luZCIsICJGb2xkaW5nUmFuZ2UiLCAiRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbiIsICJsb2NhdGlvbiIsICJEaWFnbm9zdGljU2V2ZXJpdHkiLCAiRGlhZ25vc3RpY1RhZyIsICJDb2RlRGVzY3JpcHRpb24iLCAiRGlhZ25vc3RpYyIsICJDb21tYW5kIiwgIlRleHRFZGl0IiwgIkNoYW5nZUFubm90YXRpb24iLCAiQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIiLCAiQW5ub3RhdGVkVGV4dEVkaXQiLCAiVGV4dERvY3VtZW50RWRpdCIsICJDcmVhdGVGaWxlIiwgIlJlbmFtZUZpbGUiLCAiRGVsZXRlRmlsZSIsICJXb3Jrc3BhY2VFZGl0IiwgIlRleHREb2N1bWVudElkZW50aWZpZXIiLCAiVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciIsICJPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIiLCAiVGV4dERvY3VtZW50SXRlbSIsICJNYXJrdXBLaW5kIiwgIk1hcmt1cENvbnRlbnQiLCAiQ29tcGxldGlvbkl0ZW1LaW5kIiwgIkluc2VydFRleHRGb3JtYXQiLCAiQ29tcGxldGlvbkl0ZW1UYWciLCAiSW5zZXJ0UmVwbGFjZUVkaXQiLCAiUmFuZ2UiLCAiSW5zZXJ0VGV4dE1vZGUiLCAiQ29tcGxldGlvbkl0ZW1MYWJlbERldGFpbHMiLCAiQ29tcGxldGlvbkl0ZW0iLCAiQ29tcGxldGlvbkxpc3QiLCAiTWFya2VkU3RyaW5nIiwgIkhvdmVyIiwgIlBhcmFtZXRlckluZm9ybWF0aW9uIiwgIlNpZ25hdHVyZUluZm9ybWF0aW9uIiwgIkRvY3VtZW50SGlnaGxpZ2h0S2luZCIsICJEb2N1bWVudEhpZ2hsaWdodCIsICJTeW1ib2xLaW5kIiwgIlN5bWJvbFRhZyIsICJTeW1ib2xJbmZvcm1hdGlvbiIsICJXb3Jrc3BhY2VTeW1ib2wiLCAiRG9jdW1lbnRTeW1ib2wiLCAiQ29kZUFjdGlvbktpbmQiLCAiQ29kZUFjdGlvblRyaWdnZXJLaW5kIiwgIkNvZGVBY3Rpb25Db250ZXh0IiwgIkNvZGVBY3Rpb24iLCAiQ29kZUxlbnMiLCAiRm9ybWF0dGluZ09wdGlvbnMiLCAiRG9jdW1lbnRMaW5rIiwgIlNlbGVjdGlvblJhbmdlIiwgIlNlbWFudGljVG9rZW5UeXBlcyIsICJTZW1hbnRpY1Rva2VuTW9kaWZpZXJzIiwgIlNlbWFudGljVG9rZW5zIiwgIklubGluZVZhbHVlVGV4dCIsICJJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwIiwgIklubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uIiwgIklubGluZVZhbHVlQ29udGV4dCIsICJJbmxheUhpbnRLaW5kIiwgIklubGF5SGludExhYmVsUGFydCIsICJJbmxheUhpbnQiLCAiUG9zaXRpb24iLCAiU3RyaW5nVmFsdWUiLCAiSW5saW5lQ29tcGxldGlvbkl0ZW0iLCAiSW5saW5lQ29tcGxldGlvbkxpc3QiLCAiSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kIiwgIlNlbGVjdGVkQ29tcGxldGlvbkluZm8iLCAiSW5saW5lQ29tcGxldGlvbkNvbnRleHQiLCAiV29ya3NwYWNlRm9sZGVyIiwgIlRleHREb2N1bWVudCIsICJQb3NpdGlvbiIsICJJcyIsICJ1bmRlZmluZWQiLCAiaW50ZWdlciIsICJ1aW50ZWdlciIsICJtIl0KfQo= diff --git a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/lsp/java-lsp-client.ts b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/lsp/java-lsp-client.ts index 673cf753c54..bc7b14e94cb 100644 --- a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/lsp/java-lsp-client.ts +++ b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/lsp/java-lsp-client.ts @@ -64,6 +64,9 @@ const _openFiles: Set = new Set(); let _providersRegistered = false; +/** Semantic-token legend reported by JDT.LS in the initialize result; needed to decode token data. */ +let _semanticTokensLegend: { tokenTypes: string[]; tokenModifiers: string[] } | null = null; + // ------------------------------------------------------------------------- // Public API // ------------------------------------------------------------------------- @@ -133,7 +136,7 @@ export async function connect(resourcePath: string): Promise { _conn.listen(); const rootUri = _workspaceRoot; - await _conn.sendRequest('initialize', { + const initResult: any = await _conn.sendRequest('initialize', { processId: null, rootUri, initializationOptions: { @@ -170,7 +173,26 @@ export async function connect(resourcePath: string): Promise { signatureHelp: { dynamicRegistration: true, signatureInformation: { documentationFormat: ['markdown', 'plaintext'], parameterInformation: { labelOffsetSupport: true } } }, definition: { dynamicRegistration: true }, references: { dynamicRegistration: true }, - documentSymbol: { dynamicRegistration: true }, + implementation: { dynamicRegistration: true }, + typeDefinition: { dynamicRegistration: true }, + documentHighlight: { dynamicRegistration: true }, + documentSymbol: { dynamicRegistration: true, hierarchicalDocumentSymbolSupport: true }, + foldingRange: { dynamicRegistration: true, lineFoldingOnly: false }, + selectionRange: { dynamicRegistration: true }, + codeLens: { dynamicRegistration: true }, + inlayHint: { dynamicRegistration: true, resolveSupport: { properties: ['label'] } }, + semanticTokens: { + dynamicRegistration: true, + requests: { range: false, full: { delta: false } }, + tokenTypes: ['namespace', 'type', 'class', 'enum', 'interface', 'struct', 'typeParameter', + 'parameter', 'variable', 'property', 'enumMember', 'event', 'function', 'method', 'macro', + 'keyword', 'modifier', 'comment', 'string', 'number', 'regexp', 'operator', 'decorator'], + tokenModifiers: ['declaration', 'definition', 'readonly', 'static', 'deprecated', 'abstract', + 'async', 'modification', 'documentation', 'defaultLibrary'], + formats: ['relative'], + overlappingTokenSupport: false, + multilineTokenSupport: false, + }, formatting: { dynamicRegistration: true }, rangeFormatting: { dynamicRegistration: true }, rename: { dynamicRegistration: true, prepareSupport: true }, @@ -198,6 +220,8 @@ export async function connect(resourcePath: string): Promise { }, }); + _semanticTokensLegend = initResult?.capabilities?.semanticTokensProvider?.legend ?? null; + _conn.sendNotification('initialized', {}); _conn.sendNotification('workspace/didChangeConfiguration', { settings: jdtlsSettings() }); @@ -266,6 +290,7 @@ function registerProviders(): void { monaco.editor.registerCommand(APPLY_ACTION_COMMAND, (_accessor: unknown, action: CodeAction | Command) => { applyCodeAction(action); }); + monaco.editor.registerCommand(NOOP_COMMAND, () => { /* display-only CodeLens */ }); // Cross-file navigation: this single-file editor has no model for other workspace files, so Go to // Definition / Find References to another file would silently do nothing. Hand those off to the IDE @@ -485,6 +510,162 @@ function registerProviders(): void { providedCodeActionKinds: ['quickfix', 'refactor', 'refactor.extract', 'refactor.inline', 'refactor.rewrite', 'source', 'source.organizeImports'], }); + + // --- Navigation & structure (Pack 1) --- + + monaco.languages.registerImplementationProvider('java', { + provideImplementation: (model, position) => requestLocations('textDocument/implementation', model, position), + }); + + monaco.languages.registerTypeDefinitionProvider('java', { + provideTypeDefinition: (model, position) => requestLocations('textDocument/typeDefinition', model, position), + }); + + monaco.languages.registerDocumentHighlightProvider('java', { + provideDocumentHighlights: async (model, position) => { + if (!_conn || !isWorkspaceFile(model.uri.toString())) return null; + const result: any[] | null = await _conn.sendRequest('textDocument/documentHighlight', { + textDocument: { uri: model.uri.toString() }, + position: { line: position.lineNumber - 1, character: position.column - 1 }, + }); + if (!result) return null; + return result.map(h => ({ range: lspRangeToMonaco(h.range), kind: h.kind ? h.kind - 1 : undefined })); + }, + }); + + monaco.languages.registerDocumentSymbolProvider('java', { + provideDocumentSymbols: async (model) => { + if (!_conn || !isWorkspaceFile(model.uri.toString())) return null; + const result: any[] | null = await _conn.sendRequest('textDocument/documentSymbol', { + textDocument: { uri: model.uri.toString() }, + }); + return result ? mapDocumentSymbols(result) : null; + }, + }); + + monaco.languages.registerFoldingRangeProvider('java', { + provideFoldingRanges: async (model) => { + if (!_conn || !isWorkspaceFile(model.uri.toString())) return null; + const result: any[] | null = await _conn.sendRequest('textDocument/foldingRange', { + textDocument: { uri: model.uri.toString() }, + }); + if (!result) return null; + return result.map(r => ({ start: r.startLine + 1, end: r.endLine + 1, kind: foldingKind(r.kind) })); + }, + }); + + monaco.languages.registerSelectionRangeProvider('java', { + provideSelectionRanges: async (model, positions) => { + if (!_conn || !isWorkspaceFile(model.uri.toString())) return null; + const result: any[] | null = await _conn.sendRequest('textDocument/selectionRange', { + textDocument: { uri: model.uri.toString() }, + positions: positions.map(p => ({ line: p.lineNumber - 1, character: p.column - 1 })), + }); + if (!result) return null; + return result.map(flattenSelectionRange); + }, + }); + + monaco.languages.registerDocumentRangeFormattingEditProvider('java', { + provideDocumentRangeFormattingEdits: async (model, range) => { + if (!_conn || !isWorkspaceFile(model.uri.toString())) return null; + const edits: TextEdit[] | null = await _conn.sendRequest('textDocument/rangeFormatting', { + textDocument: { uri: model.uri.toString() }, + range: monacoRangeToLsp(range), + options: { tabSize: model.getOptions().tabSize, insertSpaces: model.getOptions().insertSpaces }, + }); + return edits ? edits.map(textEditToMonaco) : null; + }, + }); + + // --- Inlay hints + semantic highlighting (Pack 2) --- + + monaco.languages.registerInlayHintsProvider('java', { + provideInlayHints: async (model, range) => { + if (!_conn || !isWorkspaceFile(model.uri.toString())) return null; + const result: any[] | null = await _conn.sendRequest('textDocument/inlayHint', { + textDocument: { uri: model.uri.toString() }, + range: monacoRangeToLsp(range), + }); + if (!result) return null; + return { + hints: result.map(h => ({ + position: { lineNumber: h.position.line + 1, column: h.position.character + 1 }, + label: typeof h.label === 'string' ? h.label : (h.label ?? []).map((p: any) => ({ label: p.value })), + kind: h.kind, + paddingLeft: h.paddingLeft, + paddingRight: h.paddingRight, + tooltip: h.tooltip ? markupToString(h.tooltip) : undefined, + })), + dispose() { /* nothing to dispose */ }, + }; + }, + }); + + monaco.languages.registerDocumentSemanticTokensProvider('java', { + getLegend: () => _semanticTokensLegend ?? { tokenTypes: [], tokenModifiers: [] }, + provideDocumentSemanticTokens: async (model) => { + if (!_conn || !isWorkspaceFile(model.uri.toString()) || !_semanticTokensLegend) return null; + const result: { data: number[]; resultId?: string } | null = await _conn.sendRequest('textDocument/semanticTokens/full', { + textDocument: { uri: model.uri.toString() }, + }); + if (!result?.data) return null; + return { data: new Uint32Array(result.data), resultId: result.resultId }; + }, + releaseDocumentSemanticTokens: () => { /* nothing to release */ }, + }); + + // --- CodeLens (Pack 3) --- + + monaco.languages.registerCodeLensProvider('java', { + provideCodeLenses: async (model) => { + if (!_conn || !isWorkspaceFile(model.uri.toString())) return { lenses: [], dispose() { /* */ } }; + const result: any[] | null = await _conn.sendRequest('textDocument/codeLens', { + textDocument: { uri: model.uri.toString() }, + }); + const lenses = (result ?? []).map((lens, i) => ({ + range: lspRangeToMonaco(lens.range), + id: String(i), + command: lens.command ? mapLensCommand(lens.command) : undefined, + _lsp: lens, + })); + return { lenses, dispose() { /* */ } }; + }, + resolveCodeLens: async (_model, codeLens) => { + const lsp = (codeLens as any)._lsp; + if (_conn && lsp && !lsp.command) { + try { + const resolved: any = await _conn.sendRequest('codeLens/resolve', lsp); + codeLens.command = resolved?.command ? mapLensCommand(resolved.command) : { id: NOOP_COMMAND, title: '' }; + } catch { + codeLens.command = { id: NOOP_COMMAND, title: '' }; + } + } + return codeLens; + }, + }); + + // --- Java keyword completion (Pack 1b): always-available, ranked below SDK/LSP results --- + + monaco.languages.registerCompletionItemProvider('java', { + provideCompletionItems: (model, position) => { + if (!isWorkspaceFile(model.uri.toString())) return null; + const word = model.getWordUntilPosition(position); + const range: monaco.IRange = { + startLineNumber: position.lineNumber, startColumn: word.startColumn, + endLineNumber: position.lineNumber, endColumn: word.endColumn, + }; + return { + suggestions: JAVA_KEYWORDS.map(keyword => ({ + label: keyword, + kind: monaco.languages.CompletionItemKind.Keyword, + insertText: keyword, + range, + sortText: `9_${keyword}`, + })), + }; + }, + }); } // ------------------------------------------------------------------------- @@ -597,6 +778,77 @@ const APPLY_ACTION_COMMAND = 'dirigible.java.applyCodeAction'; /** Virtual URI prefix of editor models; stripping it yields the IDE workspace path (/ws/proj/...). */ const VIRTUAL_FILE_PREFIX = 'file:///workspace'; +/** Monaco command id used for display-only CodeLenses (e.g. a reference count with no resolved action). */ +const NOOP_COMMAND = 'dirigible.java.noopLens'; + +/** Java SE keywords/literals offered as low-priority completion so they always appear while typing. */ +const JAVA_KEYWORDS = ['abstract', 'assert', 'boolean', 'break', 'byte', 'case', 'catch', 'char', 'class', + 'const', 'continue', 'default', 'do', 'double', 'else', 'enum', 'extends', 'final', 'finally', 'float', + 'for', 'goto', 'if', 'implements', 'import', 'instanceof', 'int', 'interface', 'long', 'native', 'new', + 'package', 'private', 'protected', 'public', 'return', 'short', 'static', 'strictfp', 'super', 'switch', + 'synchronized', 'this', 'throw', 'throws', 'transient', 'try', 'void', 'volatile', 'while', 'var', + 'yield', 'record', 'sealed', 'permits', 'true', 'false', 'null']; + +/** Shared definition-style location request used by go-to-definition/implementation/type-definition. */ +async function requestLocations(method: string, model: monaco.editor.ITextModel, position: monaco.Position) { + if (!_conn || !isWorkspaceFile(model.uri.toString())) return null; + const result: Location | Location[] | null = await _conn.sendRequest(method, { + textDocument: { uri: model.uri.toString() }, + position: { line: position.lineNumber - 1, character: position.column - 1 }, + }); + if (!result) return null; + const locations = Array.isArray(result) ? result : [result]; + return locations.map(loc => ({ uri: monaco.Uri.parse(loc.uri), range: lspRangeToMonaco(loc.range) })); +} + +/** Recursively maps LSP hierarchical DocumentSymbols to Monaco's shape (kinds are 1-based vs 0-based). */ +function mapDocumentSymbols(symbols: any[]): monaco.languages.DocumentSymbol[] { + return (symbols ?? []).map(s => ({ + name: s.name, + detail: s.detail ?? '', + kind: (s.kind ?? 1) - 1, + tags: s.tags ?? [], + range: lspRangeToMonaco(s.range), + selectionRange: lspRangeToMonaco(s.selectionRange ?? s.range), + children: s.children ? mapDocumentSymbols(s.children) : [], + })); +} + +function foldingKind(kind: string | undefined): monaco.languages.FoldingRangeKind | undefined { + const FK = monaco.languages.FoldingRangeKind; + switch (kind) { + case 'comment': return FK.Comment; + case 'imports': return FK.Imports; + case 'region': return FK.Region; + default: return undefined; + } +} + +/** Flattens an LSP SelectionRange parent-chain into Monaco's innermost-to-outermost array. */ +function flattenSelectionRange(selectionRange: any): monaco.languages.SelectionRange[] { + const ranges: monaco.languages.SelectionRange[] = []; + let current = selectionRange; + while (current) { + ranges.push({ range: lspRangeToMonaco(current.range) }); + current = current.parent; + } + return ranges; +} + +/** Maps a JDT.LS CodeLens command to a Monaco command, wiring the references/implementations peek. */ +function mapLensCommand(cmd: any): monaco.languages.Command { + const args = cmd.arguments ?? []; + if ((cmd.command === 'java.show.references' || cmd.command === 'java.show.implementations') && args.length >= 3) { + const locations = (args[2] ?? []).map((l: any) => ({ uri: monaco.Uri.parse(l.uri), range: lspRangeToMonaco(l.range) })); + return { + id: 'editor.action.showReferences', + title: cmd.title, + arguments: [monaco.Uri.parse(args[0]), { lineNumber: args[1].line + 1, column: args[1].character + 1 }, locations], + }; + } + return { id: NOOP_COMMAND, title: cmd.title }; +} + type LspRange = { start: { line: number; character: number }; end: { line: number; character: number } }; /** Monaco completion item carrying the originating LSP item so resolve can fetch its import edits. */ @@ -729,6 +981,16 @@ const GENERATE: Record = { members: (s) => (s?.accessors ?? s ?? []).map((a: any) => ({ label: fieldLabel(a), ref: a })), buildArgs: (args, _s, sel) => [args[0], sel.map(m => m.ref)], }, + 'java.action.overrideMethodsPrompt': { + label: 'Select methods to override or implement', + status: 'java.action.listOverridableMethods', + generate: 'java.action.addOverridableMethods', + members: (s) => (s?.methods ?? []).map((m: any) => ({ + label: `${m.name}(${(m.parameters ?? []).join(', ')})${m.declaringClass ? ' : ' + m.declaringClass : ''}`, + ref: m, + })), + buildArgs: (args, status, sel) => [args[0], { overridableMethods: sel.map(m => m.ref), type: status?.type }], + }, }; async function runGenerate(promptId: string, args: any[]): Promise { @@ -907,6 +1169,9 @@ function jdtlsSettings() { signatureHelp: { enabled: true }, format: { enabled: true }, saveActions: { organizeImports: false }, + inlayHints: { parameterNames: { enabled: 'all' } }, + referencesCodeLens: { enabled: true }, + implementationsCodeLens: { enabled: true }, }, }; } From 1dcc9a346d313ed8d97cb181fc3d26b4199b7b41 Mon Sep 17 00:00:00 2001 From: Iliyan Velichkov Date: Tue, 23 Jun 2026 15:19:20 +0300 Subject: [PATCH 07/14] fix(editor): references code preview, first-Ctrl+Space completion, keyword colors - Find/Peek References (and go-to-definition/implementation/type-definition) now create in-memory models for the referenced files, so the peek shows a real code preview instead of only file/line/column. - Flush the pending debounced didChange before a completion request, so JDT.LS sees the just-typed text on the first Ctrl+Space (previously the first invocation completed against stale content and only the second worked). - Revert the forced semanticHighlighting flag: JDT.LS emits keyword/modifier semantic tokens the vs-dark-based themes don't style, which left Java keywords uncolored. The semantic-tokens provider stays registered (inert until a theme opts in) so basic Monarch keyword coloring is restored. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../dirigible/editor-monaco/js/editor.js | 2 - .../editor-monaco/js/java-lsp-client.js | 58 ++++++++++---- .../editor-monaco/js/lsp/java-lsp-client.ts | 76 +++++++++++++++---- 3 files changed, 107 insertions(+), 29 deletions(-) diff --git a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/editor.js b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/editor.js index 72b2539f97a..3f3db5198af 100644 --- a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/editor.js +++ b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/editor.js @@ -725,8 +725,6 @@ class DirigibleEditor { minimap: { autohide: DirigibleEditor.isMinimapAutohideEnabled(), }, - // Enable LSP semantic token coloring (off by default unless the theme opts in). - 'semanticHighlighting.enabled': true, }; if (TypeScriptUtils.isTypeScriptFile(fileName)) { // @ts-ignore diff --git a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/java-lsp-client.js b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/java-lsp-client.js index ab004556bbf..00a6b6bc17c 100644 --- a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/java-lsp-client.js +++ b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/java-lsp-client.js @@ -4471,6 +4471,7 @@ ${JSON.stringify(message, null, 4)}`); var _conn = null; var _workspaceRoot = ""; var _openFiles = /* @__PURE__ */ new Set(); + var _changeTimers = /* @__PURE__ */ new Map(); var _providersRegistered = false; var _semanticTokensLegend = null; async function connect(resourcePath) { @@ -4668,18 +4669,29 @@ ${JSON.stringify(message, null, 4)}`); } }); if (model) { - let timer; model.onDidChangeContent(() => { - clearTimeout(timer); - timer = setTimeout(() => { - _conn?.sendNotification("textDocument/didChange", { - textDocument: { uri: fileUri, version: model.getVersionId() }, - contentChanges: [{ text: model.getValue() }] - }); - }, 400); + const existing = _changeTimers.get(fileUri); + if (existing) clearTimeout(existing); + _changeTimers.set(fileUri, setTimeout(() => sendDidChange(fileUri), 400)); }); } } + function sendDidChange(fileUri) { + _changeTimers.delete(fileUri); + const model = editor.getModel(Uri.parse(fileUri)); + if (_conn && model) { + _conn.sendNotification("textDocument/didChange", { + textDocument: { uri: fileUri, version: model.getVersionId() }, + contentChanges: [{ text: model.getValue() }] + }); + } + } + function flushPendingChange(fileUri) { + if (_changeTimers.has(fileUri)) { + clearTimeout(_changeTimers.get(fileUri)); + sendDidChange(fileUri); + } + } function isWorkspaceFile(uri) { return _workspaceRoot !== "" && uri.startsWith(_workspaceRoot); } @@ -4709,6 +4721,7 @@ ${JSON.stringify(message, null, 4)}`); provideCompletionItems: async (model, position, context) => { if (!_conn || !isWorkspaceFile(model.uri.toString())) return null; const fileUri = model.uri.toString(); + flushPendingChange(fileUri); const result = await _conn.sendRequest("textDocument/completion", { textDocument: { uri: fileUri }, position: { line: position.lineNumber - 1, character: position.column - 1 }, @@ -4799,11 +4812,12 @@ ${JSON.stringify(message, null, 4)}`); position: { line: position.lineNumber - 1, character: position.column - 1 } }); if (!result) return null; - const locations = Array.isArray(result) ? result : [result]; - return locations.map((loc) => ({ + const locations = (Array.isArray(result) ? result : [result]).map((loc) => ({ uri: Uri.parse(loc.uri), range: lspRangeToMonaco(loc.range) })); + await ensureModelsForLocations(locations); + return locations; } }); languages.registerReferenceProvider("java", { @@ -4815,7 +4829,9 @@ ${JSON.stringify(message, null, 4)}`); context: { includeDeclaration: context.includeDeclaration } }); if (!result) return null; - return result.map((loc) => ({ uri: Uri.parse(loc.uri), range: lspRangeToMonaco(loc.range) })); + const locations = result.map((loc) => ({ uri: Uri.parse(loc.uri), range: lspRangeToMonaco(loc.range) })); + await ensureModelsForLocations(locations); + return locations; } }); languages.registerRenameProvider("java", { @@ -5211,8 +5227,22 @@ ${JSON.stringify(message, null, 4)}`); position: { line: position.lineNumber - 1, character: position.column - 1 } }); if (!result) return null; - const locations = Array.isArray(result) ? result : [result]; - return locations.map((loc) => ({ uri: Uri.parse(loc.uri), range: lspRangeToMonaco(loc.range) })); + const locations = (Array.isArray(result) ? result : [result]).map((loc) => ({ uri: Uri.parse(loc.uri), range: lspRangeToMonaco(loc.range) })); + await ensureModelsForLocations(locations); + return locations; + } + async function ensureModelsForLocations(locations) { + const seen = /* @__PURE__ */ new Set(); + await Promise.all(locations.map(async ({ uri }) => { + const uriStr = uri.toString(); + if (seen.has(uriStr) || !uriStr.startsWith(VIRTUAL_FILE_PREFIX) || editor.getModel(uri)) return; + seen.add(uriStr); + try { + const text = await fetchWorkspaceFileText(uriToWorkspacePath(uriStr) ?? uriStr); + if (!editor.getModel(uri)) editor.createModel(text, "java", uri); + } catch { + } + })); } function mapDocumentSymbols(symbols) { return (symbols ?? []).map((s) => ({ @@ -5533,4 +5563,4 @@ ${JSON.stringify(message, null, 4)}`); } return __toCommonJS(java_lsp_client_exports); })(); -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvY29tbW9uL2lzLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlcy5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vbGlua2VkTWFwLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9kaXNwb3NhYmxlLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9yYWwuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvY29tbW9uL2V2ZW50cy5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vY2FuY2VsbGF0aW9uLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9zaGFyZWRBcnJheUNhbmNlbGxhdGlvbi5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vc2VtYXBob3JlLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlUmVhZGVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlV3JpdGVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlQnVmZmVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9jb25uZWN0aW9uLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9hcGkuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvYnJvd3Nlci9yaWwuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvYnJvd3Nlci9tYWluLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvYnJvd3Nlci5qcyIsICJsc3AvamF2YS1sc3AtY2xpZW50LnRzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLXdzLWpzb25ycGMvc3JjL2Rpc3Bvc2FibGUudHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvc29ja2V0L3NvY2tldC50cyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS13cy1qc29ucnBjL3NyYy9zb2NrZXQvcmVhZGVyLnRzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLXdzLWpzb25ycGMvc3JjL3NvY2tldC93cml0ZXIudHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvc29ja2V0L2Nvbm5lY3Rpb24udHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvY29ubmVjdGlvbi50cyIsICJsc3AvbW9uYWNvLXNoaW0udHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtbGFuZ3VhZ2VzZXJ2ZXItdHlwZXMvbGliL2VzbS9tYWluLmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuc3RyaW5nQXJyYXkgPSBleHBvcnRzLmFycmF5ID0gZXhwb3J0cy5mdW5jID0gZXhwb3J0cy5lcnJvciA9IGV4cG9ydHMubnVtYmVyID0gZXhwb3J0cy5zdHJpbmcgPSBleHBvcnRzLmJvb2xlYW4gPSB2b2lkIDA7XG5mdW5jdGlvbiBib29sZWFuKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZTtcbn1cbmV4cG9ydHMuYm9vbGVhbiA9IGJvb2xlYW47XG5mdW5jdGlvbiBzdHJpbmcodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZztcbn1cbmV4cG9ydHMuc3RyaW5nID0gc3RyaW5nO1xuZnVuY3Rpb24gbnVtYmVyKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdmFsdWUgaW5zdGFuY2VvZiBOdW1iZXI7XG59XG5leHBvcnRzLm51bWJlciA9IG51bWJlcjtcbmZ1bmN0aW9uIGVycm9yKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgRXJyb3I7XG59XG5leHBvcnRzLmVycm9yID0gZXJyb3I7XG5mdW5jdGlvbiBmdW5jKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cbmV4cG9ydHMuZnVuYyA9IGZ1bmM7XG5mdW5jdGlvbiBhcnJheSh2YWx1ZSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cbmV4cG9ydHMuYXJyYXkgPSBhcnJheTtcbmZ1bmN0aW9uIHN0cmluZ0FycmF5KHZhbHVlKSB7XG4gICAgcmV0dXJuIGFycmF5KHZhbHVlKSAmJiB2YWx1ZS5ldmVyeShlbGVtID0+IHN0cmluZyhlbGVtKSk7XG59XG5leHBvcnRzLnN0cmluZ0FycmF5ID0gc3RyaW5nQXJyYXk7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLk1lc3NhZ2UgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU5ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlOCA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTcgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU2ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNSA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTQgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUzID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMiA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTEgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUwID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTkgPSBleHBvcnRzLlJlcXVlc3RUeXBlOCA9IGV4cG9ydHMuUmVxdWVzdFR5cGU3ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTYgPSBleHBvcnRzLlJlcXVlc3RUeXBlNSA9IGV4cG9ydHMuUmVxdWVzdFR5cGU0ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTMgPSBleHBvcnRzLlJlcXVlc3RUeXBlMiA9IGV4cG9ydHMuUmVxdWVzdFR5cGUxID0gZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IGV4cG9ydHMuUmVxdWVzdFR5cGUwID0gZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUgPSBleHBvcnRzLlBhcmFtZXRlclN0cnVjdHVyZXMgPSBleHBvcnRzLlJlc3BvbnNlRXJyb3IgPSBleHBvcnRzLkVycm9yQ29kZXMgPSB2b2lkIDA7XG5jb25zdCBpcyA9IHJlcXVpcmUoXCIuL2lzXCIpO1xuLyoqXG4gKiBQcmVkZWZpbmVkIGVycm9yIGNvZGVzLlxuICovXG52YXIgRXJyb3JDb2RlcztcbihmdW5jdGlvbiAoRXJyb3JDb2Rlcykge1xuICAgIC8vIERlZmluZWQgYnkgSlNPTiBSUENcbiAgICBFcnJvckNvZGVzLlBhcnNlRXJyb3IgPSAtMzI3MDA7XG4gICAgRXJyb3JDb2Rlcy5JbnZhbGlkUmVxdWVzdCA9IC0zMjYwMDtcbiAgICBFcnJvckNvZGVzLk1ldGhvZE5vdEZvdW5kID0gLTMyNjAxO1xuICAgIEVycm9yQ29kZXMuSW52YWxpZFBhcmFtcyA9IC0zMjYwMjtcbiAgICBFcnJvckNvZGVzLkludGVybmFsRXJyb3IgPSAtMzI2MDM7XG4gICAgLyoqXG4gICAgICogVGhpcyBpcyB0aGUgc3RhcnQgcmFuZ2Ugb2YgSlNPTiBSUEMgcmVzZXJ2ZWQgZXJyb3IgY29kZXMuXG4gICAgICogSXQgZG9lc24ndCBkZW5vdGUgYSByZWFsIGVycm9yIGNvZGUuIE5vIGFwcGxpY2F0aW9uIGVycm9yIGNvZGVzIHNob3VsZFxuICAgICAqIGJlIGRlZmluZWQgYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCByYW5nZS4gRm9yIGJhY2t3YXJkc1xuICAgICAqIGNvbXBhdGliaWxpdHkgdGhlIGBTZXJ2ZXJOb3RJbml0aWFsaXplZGAgYW5kIHRoZSBgVW5rbm93bkVycm9yQ29kZWBcbiAgICAgKiBhcmUgbGVmdCBpbiB0aGUgcmFuZ2UuXG4gICAgICpcbiAgICAgKiBAc2luY2UgMy4xNi4wXG4gICAgKi9cbiAgICBFcnJvckNvZGVzLmpzb25ycGNSZXNlcnZlZEVycm9yUmFuZ2VTdGFydCA9IC0zMjA5OTtcbiAgICAvKiogQGRlcHJlY2F0ZWQgdXNlICBqc29ucnBjUmVzZXJ2ZWRFcnJvclJhbmdlU3RhcnQgKi9cbiAgICBFcnJvckNvZGVzLnNlcnZlckVycm9yU3RhcnQgPSAtMzIwOTk7XG4gICAgLyoqXG4gICAgICogQW4gZXJyb3Igb2NjdXJyZWQgd2hlbiB3cml0ZSBhIG1lc3NhZ2UgdG8gdGhlIHRyYW5zcG9ydCBsYXllci5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLk1lc3NhZ2VXcml0ZUVycm9yID0gLTMyMDk5O1xuICAgIC8qKlxuICAgICAqIEFuIGVycm9yIG9jY3VycmVkIHdoZW4gcmVhZGluZyBhIG1lc3NhZ2UgZnJvbSB0aGUgdHJhbnNwb3J0IGxheWVyLlxuICAgICAqL1xuICAgIEVycm9yQ29kZXMuTWVzc2FnZVJlYWRFcnJvciA9IC0zMjA5ODtcbiAgICAvKipcbiAgICAgKiBUaGUgY29ubmVjdGlvbiBnb3QgZGlzcG9zZWQgb3IgbG9zdCBhbmQgYWxsIHBlbmRpbmcgcmVzcG9uc2VzIGdvdFxuICAgICAqIHJlamVjdGVkLlxuICAgICAqL1xuICAgIEVycm9yQ29kZXMuUGVuZGluZ1Jlc3BvbnNlUmVqZWN0ZWQgPSAtMzIwOTc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gaXMgaW5hY3RpdmUgYW5kIGEgdXNlIG9mIGl0IGZhaWxlZC5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLkNvbm5lY3Rpb25JbmFjdGl2ZSA9IC0zMjA5NjtcbiAgICAvKipcbiAgICAgKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBhIHNlcnZlciByZWNlaXZlZCBhIG5vdGlmaWNhdGlvbiBvclxuICAgICAqIHJlcXVlc3QgYmVmb3JlIHRoZSBzZXJ2ZXIgaGFzIHJlY2VpdmVkIHRoZSBgaW5pdGlhbGl6ZWAgcmVxdWVzdC5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLlNlcnZlck5vdEluaXRpYWxpemVkID0gLTMyMDAyO1xuICAgIEVycm9yQ29kZXMuVW5rbm93bkVycm9yQ29kZSA9IC0zMjAwMTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIHRoZSBlbmQgcmFuZ2Ugb2YgSlNPTiBSUEMgcmVzZXJ2ZWQgZXJyb3IgY29kZXMuXG4gICAgICogSXQgZG9lc24ndCBkZW5vdGUgYSByZWFsIGVycm9yIGNvZGUuXG4gICAgICpcbiAgICAgKiBAc2luY2UgMy4xNi4wXG4gICAgKi9cbiAgICBFcnJvckNvZGVzLmpzb25ycGNSZXNlcnZlZEVycm9yUmFuZ2VFbmQgPSAtMzIwMDA7XG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSAganNvbnJwY1Jlc2VydmVkRXJyb3JSYW5nZUVuZCAqL1xuICAgIEVycm9yQ29kZXMuc2VydmVyRXJyb3JFbmQgPSAtMzIwMDA7XG59KShFcnJvckNvZGVzIHx8IChleHBvcnRzLkVycm9yQ29kZXMgPSBFcnJvckNvZGVzID0ge30pKTtcbi8qKlxuICogQW4gZXJyb3Igb2JqZWN0IHJldHVybiBpbiBhIHJlc3BvbnNlIGluIGNhc2UgYSByZXF1ZXN0XG4gKiBoYXMgZmFpbGVkLlxuICovXG5jbGFzcyBSZXNwb25zZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNvZGUsIG1lc3NhZ2UsIGRhdGEpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuY29kZSA9IGlzLm51bWJlcihjb2RlKSA/IGNvZGUgOiBFcnJvckNvZGVzLlVua25vd25FcnJvckNvZGU7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBSZXNwb25zZUVycm9yLnByb3RvdHlwZSk7XG4gICAgfVxuICAgIHRvSnNvbigpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgY29kZTogdGhpcy5jb2RlLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLmRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmRhdGEgPSB0aGlzLmRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5leHBvcnRzLlJlc3BvbnNlRXJyb3IgPSBSZXNwb25zZUVycm9yO1xuY2xhc3MgUGFyYW1ldGVyU3RydWN0dXJlcyB7XG4gICAgY29uc3RydWN0b3Ioa2luZCkge1xuICAgICAgICB0aGlzLmtpbmQgPSBraW5kO1xuICAgIH1cbiAgICBzdGF0aWMgaXModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8gfHwgdmFsdWUgPT09IFBhcmFtZXRlclN0cnVjdHVyZXMuYnlOYW1lIHx8IHZhbHVlID09PSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5UG9zaXRpb247XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5raW5kO1xuICAgIH1cbn1cbmV4cG9ydHMuUGFyYW1ldGVyU3RydWN0dXJlcyA9IFBhcmFtZXRlclN0cnVjdHVyZXM7XG4vKipcbiAqIFRoZSBwYXJhbWV0ZXIgc3RydWN0dXJlIGlzIGF1dG9tYXRpY2FsbHkgaW5mZXJyZWQgb24gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzXG4gKiBhbmQgdGhlIHBhcmFtZXRlciB0eXBlIGluIGNhc2Ugb2YgYSBzaW5nbGUgcGFyYW0uXG4gKi9cblBhcmFtZXRlclN0cnVjdHVyZXMuYXV0byA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdhdXRvJyk7XG4vKipcbiAqIEZvcmNlcyBgYnlQb3NpdGlvbmAgcGFyYW1ldGVyIHN0cnVjdHVyZS4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGhhdmUgYSBzaW5nbGVcbiAqIHBhcmFtZXRlciB3aGljaCBoYXMgYSBsaXRlcmFsIHR5cGUuXG4gKi9cblBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbiA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdieVBvc2l0aW9uJyk7XG4vKipcbiAqIEZvcmNlcyBgYnlOYW1lYCBwYXJhbWV0ZXIgc3RydWN0dXJlLiBUaGlzIGlzIG9ubHkgdXNlZnVsIHdoZW4gaGF2aW5nIGEgc2luZ2xlXG4gKiBwYXJhbWV0ZXIuIFRoZSBsaWJyYXJ5IHdpbGwgcmVwb3J0IGVycm9ycyBpZiB1c2VkIHdpdGggYSBkaWZmZXJlbnQgbnVtYmVyIG9mXG4gKiBwYXJhbWV0ZXJzLlxuICovXG5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdieU5hbWUnKTtcbi8qKlxuICogQW4gYWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgYSBNZXNzYWdlVHlwZS5cbiAqL1xuY2xhc3MgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIG51bWJlck9mUGFyYW1zKSB7XG4gICAgICAgIHRoaXMubWV0aG9kID0gbWV0aG9kO1xuICAgICAgICB0aGlzLm51bWJlck9mUGFyYW1zID0gbnVtYmVyT2ZQYXJhbXM7XG4gICAgfVxuICAgIGdldCBwYXJhbWV0ZXJTdHJ1Y3R1cmVzKCkge1xuICAgICAgICByZXR1cm4gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvO1xuICAgIH1cbn1cbmV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlID0gQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlO1xuLyoqXG4gKiBDbGFzc2VzIHRvIHR5cGUgcmVxdWVzdCByZXNwb25zZSBwYWlyc1xuICovXG5jbGFzcyBSZXF1ZXN0VHlwZTAgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDApO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGUwID0gUmVxdWVzdFR5cGUwO1xuY2xhc3MgUmVxdWVzdFR5cGUgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCwgX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8pIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAxKTtcbiAgICAgICAgdGhpcy5fcGFyYW1ldGVyU3RydWN0dXJlcyA9IF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbiAgICBnZXQgcGFyYW1ldGVyU3RydWN0dXJlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXM7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IFJlcXVlc3RUeXBlO1xuY2xhc3MgUmVxdWVzdFR5cGUxIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMSk7XG4gICAgICAgIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBfcGFyYW1ldGVyU3RydWN0dXJlcztcbiAgICB9XG4gICAgZ2V0IHBhcmFtZXRlclN0cnVjdHVyZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGUxID0gUmVxdWVzdFR5cGUxO1xuY2xhc3MgUmVxdWVzdFR5cGUyIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAyKTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlMiA9IFJlcXVlc3RUeXBlMjtcbmNsYXNzIFJlcXVlc3RUeXBlMyBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMyk7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTMgPSBSZXF1ZXN0VHlwZTM7XG5jbGFzcyBSZXF1ZXN0VHlwZTQgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDQpO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGU0ID0gUmVxdWVzdFR5cGU0O1xuY2xhc3MgUmVxdWVzdFR5cGU1IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA1KTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlNSA9IFJlcXVlc3RUeXBlNTtcbmNsYXNzIFJlcXVlc3RUeXBlNiBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNik7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTYgPSBSZXF1ZXN0VHlwZTY7XG5jbGFzcyBSZXF1ZXN0VHlwZTcgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDcpO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGU3ID0gUmVxdWVzdFR5cGU3O1xuY2xhc3MgUmVxdWVzdFR5cGU4IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA4KTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlOCA9IFJlcXVlc3RUeXBlODtcbmNsYXNzIFJlcXVlc3RUeXBlOSBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgOSk7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTkgPSBSZXF1ZXN0VHlwZTk7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMSk7XG4gICAgICAgIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBfcGFyYW1ldGVyU3RydWN0dXJlcztcbiAgICB9XG4gICAgZ2V0IHBhcmFtZXRlclN0cnVjdHVyZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZSA9IE5vdGlmaWNhdGlvblR5cGU7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlMCBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMCk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMCA9IE5vdGlmaWNhdGlvblR5cGUwO1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTEgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCwgX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8pIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAxKTtcbiAgICAgICAgdGhpcy5fcGFyYW1ldGVyU3RydWN0dXJlcyA9IF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbiAgICBnZXQgcGFyYW1ldGVyU3RydWN0dXJlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXM7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMSA9IE5vdGlmaWNhdGlvblR5cGUxO1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDIpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTIgPSBOb3RpZmljYXRpb25UeXBlMjtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGUzIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAzKTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGUzID0gTm90aWZpY2F0aW9uVHlwZTM7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlNCBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNCk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNCA9IE5vdGlmaWNhdGlvblR5cGU0O1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTUgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDUpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTUgPSBOb3RpZmljYXRpb25UeXBlNTtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGU2IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA2KTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGU2ID0gTm90aWZpY2F0aW9uVHlwZTY7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlNyBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNyk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNyA9IE5vdGlmaWNhdGlvblR5cGU3O1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTggZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDgpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTggPSBOb3RpZmljYXRpb25UeXBlODtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGU5IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA5KTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGU5ID0gTm90aWZpY2F0aW9uVHlwZTk7XG52YXIgTWVzc2FnZTtcbihmdW5jdGlvbiAoTWVzc2FnZSkge1xuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoZSBnaXZlbiBtZXNzYWdlIGlzIGEgcmVxdWVzdCBtZXNzYWdlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gbWVzc2FnZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBpcy5zdHJpbmcoY2FuZGlkYXRlLm1ldGhvZCkgJiYgKGlzLnN0cmluZyhjYW5kaWRhdGUuaWQpIHx8IGlzLm51bWJlcihjYW5kaWRhdGUuaWQpKTtcbiAgICB9XG4gICAgTWVzc2FnZS5pc1JlcXVlc3QgPSBpc1JlcXVlc3Q7XG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhlIGdpdmVuIG1lc3NhZ2UgaXMgYSBub3RpZmljYXRpb24gbWVzc2FnZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTm90aWZpY2F0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gbWVzc2FnZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBpcy5zdHJpbmcoY2FuZGlkYXRlLm1ldGhvZCkgJiYgbWVzc2FnZS5pZCA9PT0gdm9pZCAwO1xuICAgIH1cbiAgICBNZXNzYWdlLmlzTm90aWZpY2F0aW9uID0gaXNOb3RpZmljYXRpb247XG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhlIGdpdmVuIG1lc3NhZ2UgaXMgYSByZXNwb25zZSBtZXNzYWdlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNSZXNwb25zZShtZXNzYWdlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IG1lc3NhZ2U7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgKGNhbmRpZGF0ZS5yZXN1bHQgIT09IHZvaWQgMCB8fCAhIWNhbmRpZGF0ZS5lcnJvcikgJiYgKGlzLnN0cmluZyhjYW5kaWRhdGUuaWQpIHx8IGlzLm51bWJlcihjYW5kaWRhdGUuaWQpIHx8IGNhbmRpZGF0ZS5pZCA9PT0gbnVsbCk7XG4gICAgfVxuICAgIE1lc3NhZ2UuaXNSZXNwb25zZSA9IGlzUmVzcG9uc2U7XG59KShNZXNzYWdlIHx8IChleHBvcnRzLk1lc3NhZ2UgPSBNZXNzYWdlID0ge30pKTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xudmFyIF9hO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5MUlVDYWNoZSA9IGV4cG9ydHMuTGlua2VkTWFwID0gZXhwb3J0cy5Ub3VjaCA9IHZvaWQgMDtcbnZhciBUb3VjaDtcbihmdW5jdGlvbiAoVG91Y2gpIHtcbiAgICBUb3VjaC5Ob25lID0gMDtcbiAgICBUb3VjaC5GaXJzdCA9IDE7XG4gICAgVG91Y2guQXNPbGQgPSBUb3VjaC5GaXJzdDtcbiAgICBUb3VjaC5MYXN0ID0gMjtcbiAgICBUb3VjaC5Bc05ldyA9IFRvdWNoLkxhc3Q7XG59KShUb3VjaCB8fCAoZXhwb3J0cy5Ub3VjaCA9IFRvdWNoID0ge30pKTtcbmNsYXNzIExpbmtlZE1hcCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXNbX2FdID0gJ0xpbmtlZE1hcCc7XG4gICAgICAgIHRoaXMuX21hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5faGVhZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fdGFpbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IDA7XG4gICAgICAgIHRoaXMuX3N0YXRlID0gMDtcbiAgICB9XG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuX21hcC5jbGVhcigpO1xuICAgICAgICB0aGlzLl9oZWFkID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl90YWlsID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9zaXplID0gMDtcbiAgICAgICAgdGhpcy5fc3RhdGUrKztcbiAgICB9XG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLl9oZWFkICYmICF0aGlzLl90YWlsO1xuICAgIH1cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpemU7XG4gICAgfVxuICAgIGdldCBmaXJzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlYWQ/LnZhbHVlO1xuICAgIH1cbiAgICBnZXQgbGFzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhaWw/LnZhbHVlO1xuICAgIH1cbiAgICBoYXMoa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXAuaGFzKGtleSk7XG4gICAgfVxuICAgIGdldChrZXksIHRvdWNoID0gVG91Y2guTm9uZSkge1xuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5fbWFwLmdldChrZXkpO1xuICAgICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRvdWNoICE9PSBUb3VjaC5Ob25lKSB7XG4gICAgICAgICAgICB0aGlzLnRvdWNoKGl0ZW0sIHRvdWNoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICB9XG4gICAgc2V0KGtleSwgdmFsdWUsIHRvdWNoID0gVG91Y2guTm9uZSkge1xuICAgICAgICBsZXQgaXRlbSA9IHRoaXMuX21hcC5nZXQoa2V5KTtcbiAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgIGl0ZW0udmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIGlmICh0b3VjaCAhPT0gVG91Y2guTm9uZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudG91Y2goaXRlbSwgdG91Y2gpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaXRlbSA9IHsga2V5LCB2YWx1ZSwgbmV4dDogdW5kZWZpbmVkLCBwcmV2aW91czogdW5kZWZpbmVkIH07XG4gICAgICAgICAgICBzd2l0Y2ggKHRvdWNoKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBUb3VjaC5Ob25lOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFRvdWNoLkZpcnN0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1GaXJzdChpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBUb3VjaC5MYXN0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX21hcC5zZXQoa2V5LCBpdGVtKTtcbiAgICAgICAgICAgIHRoaXMuX3NpemUrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGVsZXRlKGtleSkge1xuICAgICAgICByZXR1cm4gISF0aGlzLnJlbW92ZShrZXkpO1xuICAgIH1cbiAgICByZW1vdmUoa2V5KSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl9tYXAuZ2V0KGtleSk7XG4gICAgICAgIGlmICghaXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tYXAuZGVsZXRlKGtleSk7XG4gICAgICAgIHRoaXMucmVtb3ZlSXRlbShpdGVtKTtcbiAgICAgICAgdGhpcy5fc2l6ZS0tO1xuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICB9XG4gICAgc2hpZnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5faGVhZCAmJiAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2hlYWQgfHwgIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIHRoaXMuX21hcC5kZWxldGUoaXRlbS5rZXkpO1xuICAgICAgICB0aGlzLnJlbW92ZUl0ZW0oaXRlbSk7XG4gICAgICAgIHRoaXMuX3NpemUtLTtcbiAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7XG4gICAgfVxuICAgIGZvckVhY2goY2FsbGJhY2tmbiwgdGhpc0FyZykge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3N0YXRlO1xuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICAgICAgICBpZiAodGhpc0FyZykge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrZm4uYmluZCh0aGlzQXJnKShjdXJyZW50LnZhbHVlLCBjdXJyZW50LmtleSwgdGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFja2ZuKGN1cnJlbnQudmFsdWUsIGN1cnJlbnQua2V5LCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gc3RhdGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExpbmtlZE1hcCBnb3QgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAga2V5cygpIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9zdGF0ZTtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLl9oZWFkO1xuICAgICAgICBjb25zdCBpdGVyYXRvciA9IHtcbiAgICAgICAgICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fc3RhdGUgIT09IHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTGlua2VkTWFwIGdvdCBtb2RpZmllZCBkdXJpbmcgaXRlcmF0aW9uLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7IHZhbHVlOiBjdXJyZW50LmtleSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICB9XG4gICAgdmFsdWVzKCkge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3N0YXRlO1xuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIGNvbnN0IGl0ZXJhdG9yID0ge1xuICAgICAgICAgICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlcmF0b3I7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBMaW5rZWRNYXAgZ290IG1vZGlmaWVkIGR1cmluZyBpdGVyYXRpb24uYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHsgdmFsdWU6IGN1cnJlbnQudmFsdWUsIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gaXRlcmF0b3I7XG4gICAgfVxuICAgIGVudHJpZXMoKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5fc3RhdGU7XG4gICAgICAgIGxldCBjdXJyZW50ID0gdGhpcy5faGVhZDtcbiAgICAgICAgY29uc3QgaXRlcmF0b3IgPSB7XG4gICAgICAgICAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3N0YXRlICE9PSBzdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExpbmtlZE1hcCBnb3QgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geyB2YWx1ZTogW2N1cnJlbnQua2V5LCBjdXJyZW50LnZhbHVlXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICB9XG4gICAgWyhfYSA9IFN5bWJvbC50b1N0cmluZ1RhZywgU3ltYm9sLml0ZXJhdG9yKV0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMoKTtcbiAgICB9XG4gICAgdHJpbU9sZChuZXdTaXplKSB7XG4gICAgICAgIGlmIChuZXdTaXplID49IHRoaXMuc2l6ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuZXdTaXplID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLl9oZWFkO1xuICAgICAgICBsZXQgY3VycmVudFNpemUgPSB0aGlzLnNpemU7XG4gICAgICAgIHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnRTaXplID4gbmV3U2l6ZSkge1xuICAgICAgICAgICAgdGhpcy5fbWFwLmRlbGV0ZShjdXJyZW50LmtleSk7XG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0O1xuICAgICAgICAgICAgY3VycmVudFNpemUtLTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9oZWFkID0gY3VycmVudDtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IGN1cnJlbnRTaXplO1xuICAgICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICAgICAgY3VycmVudC5wcmV2aW91cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgIH1cbiAgICBhZGRJdGVtRmlyc3QoaXRlbSkge1xuICAgICAgICAvLyBGaXJzdCB0aW1lIEluc2VydFxuICAgICAgICBpZiAoIXRoaXMuX2hlYWQgJiYgIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRoaXMuX3RhaWwgPSBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCF0aGlzLl9oZWFkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbGlzdCcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdGhpcy5faGVhZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQucHJldmlvdXMgPSBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2hlYWQgPSBpdGVtO1xuICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgIH1cbiAgICBhZGRJdGVtTGFzdChpdGVtKSB7XG4gICAgICAgIC8vIEZpcnN0IHRpbWUgSW5zZXJ0XG4gICAgICAgIGlmICghdGhpcy5faGVhZCAmJiAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgdGhpcy5faGVhZCA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpdGVtLnByZXZpb3VzID0gdGhpcy5fdGFpbDtcbiAgICAgICAgICAgIHRoaXMuX3RhaWwubmV4dCA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW07XG4gICAgICAgIHRoaXMuX3N0YXRlKys7XG4gICAgfVxuICAgIHJlbW92ZUl0ZW0oaXRlbSkge1xuICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCAmJiBpdGVtID09PSB0aGlzLl90YWlsKSB7XG4gICAgICAgICAgICB0aGlzLl9oZWFkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpdGVtID09PSB0aGlzLl9oZWFkKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGNhbiBvbmx5IGhhcHBlbmVkIGlmIHNpemUgPT09IDEgd2hpY2ggaXMgaGFuZGxlXG4gICAgICAgICAgICAvLyBieSB0aGUgY2FzZSBhYm92ZS5cbiAgICAgICAgICAgIGlmICghaXRlbS5uZXh0KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxpc3QnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGl0ZW0ubmV4dC5wcmV2aW91cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQgPSBpdGVtLm5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXRlbSA9PT0gdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgLy8gVGhpcyBjYW4gb25seSBoYXBwZW5lZCBpZiBzaXplID09PSAxIHdoaWNoIGlzIGhhbmRsZVxuICAgICAgICAgICAgLy8gYnkgdGhlIGNhc2UgYWJvdmUuXG4gICAgICAgICAgICBpZiAoIWl0ZW0ucHJldmlvdXMpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbGlzdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbS5wcmV2aW91cy5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gaXRlbS5uZXh0O1xuICAgICAgICAgICAgY29uc3QgcHJldmlvdXMgPSBpdGVtLnByZXZpb3VzO1xuICAgICAgICAgICAgaWYgKCFuZXh0IHx8ICFwcmV2aW91cykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXh0LnByZXZpb3VzID0gcHJldmlvdXM7XG4gICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gbmV4dDtcbiAgICAgICAgfVxuICAgICAgICBpdGVtLm5leHQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGl0ZW0ucHJldmlvdXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX3N0YXRlKys7XG4gICAgfVxuICAgIHRvdWNoKGl0ZW0sIHRvdWNoKSB7XG4gICAgICAgIGlmICghdGhpcy5faGVhZCB8fCAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxpc3QnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHRvdWNoICE9PSBUb3VjaC5GaXJzdCAmJiB0b3VjaCAhPT0gVG91Y2guTGFzdCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG91Y2ggPT09IFRvdWNoLkZpcnN0KSB7XG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBpdGVtLm5leHQ7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgICAgICAvLyBVbmxpbmsgdGhlIGl0ZW1cbiAgICAgICAgICAgIGlmIChpdGVtID09PSB0aGlzLl90YWlsKSB7XG4gICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgbXVzdCBiZSBkZWZpbmVkIHNpbmNlIGl0ZW0gd2FzIG5vdCBoZWFkIGJ1dCBpcyB0YWlsXG4gICAgICAgICAgICAgICAgLy8gU28gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbiBpdGVtIGluIHRoZSBtYXBcbiAgICAgICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuX3RhaWwgPSBwcmV2aW91cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEJvdGggbmV4dCBhbmQgcHJldmlvdXMgYXJlIG5vdCB1bmRlZmluZWQgc2luY2UgaXRlbSB3YXMgbmVpdGhlciBoZWFkIG5vciB0YWlsLlxuICAgICAgICAgICAgICAgIG5leHQucHJldmlvdXMgPSBwcmV2aW91cztcbiAgICAgICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEluc2VydCB0aGUgbm9kZSBhdCBoZWFkXG4gICAgICAgICAgICBpdGVtLnByZXZpb3VzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdGhpcy5faGVhZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQucHJldmlvdXMgPSBpdGVtO1xuICAgICAgICAgICAgdGhpcy5faGVhZCA9IGl0ZW07XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRvdWNoID09PSBUb3VjaC5MYXN0KSB7XG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBpdGVtLm5leHQ7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgICAgICAvLyBVbmxpbmsgdGhlIGl0ZW0uXG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCkge1xuICAgICAgICAgICAgICAgIC8vIG5leHQgbXVzdCBiZSBkZWZpbmVkIHNpbmNlIGl0ZW0gd2FzIG5vdCB0YWlsIGJ1dCBpcyBoZWFkXG4gICAgICAgICAgICAgICAgLy8gU28gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbiBpdGVtIGluIHRoZSBtYXBcbiAgICAgICAgICAgICAgICBuZXh0LnByZXZpb3VzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuX2hlYWQgPSBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQm90aCBuZXh0IGFuZCBwcmV2aW91cyBhcmUgbm90IHVuZGVmaW5lZCBzaW5jZSBpdGVtIHdhcyBuZWl0aGVyIGhlYWQgbm9yIHRhaWwuXG4gICAgICAgICAgICAgICAgbmV4dC5wcmV2aW91cyA9IHByZXZpb3VzO1xuICAgICAgICAgICAgICAgIHByZXZpb3VzLm5leHQgPSBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaXRlbS5wcmV2aW91cyA9IHRoaXMuX3RhaWw7XG4gICAgICAgICAgICB0aGlzLl90YWlsLm5leHQgPSBpdGVtO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW07XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IFtdO1xuICAgICAgICB0aGlzLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGRhdGEucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGZyb21KU09OKGRhdGEpIHtcbiAgICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBkYXRhKSB7XG4gICAgICAgICAgICB0aGlzLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuTGlua2VkTWFwID0gTGlua2VkTWFwO1xuY2xhc3MgTFJVQ2FjaGUgZXh0ZW5kcyBMaW5rZWRNYXAge1xuICAgIGNvbnN0cnVjdG9yKGxpbWl0LCByYXRpbyA9IDEpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fbGltaXQgPSBsaW1pdDtcbiAgICAgICAgdGhpcy5fcmF0aW8gPSBNYXRoLm1pbihNYXRoLm1heCgwLCByYXRpbyksIDEpO1xuICAgIH1cbiAgICBnZXQgbGltaXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9saW1pdDtcbiAgICB9XG4gICAgc2V0IGxpbWl0KGxpbWl0KSB7XG4gICAgICAgIHRoaXMuX2xpbWl0ID0gbGltaXQ7XG4gICAgICAgIHRoaXMuY2hlY2tUcmltKCk7XG4gICAgfVxuICAgIGdldCByYXRpbygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JhdGlvO1xuICAgIH1cbiAgICBzZXQgcmF0aW8ocmF0aW8pIHtcbiAgICAgICAgdGhpcy5fcmF0aW8gPSBNYXRoLm1pbihNYXRoLm1heCgwLCByYXRpbyksIDEpO1xuICAgICAgICB0aGlzLmNoZWNrVHJpbSgpO1xuICAgIH1cbiAgICBnZXQoa2V5LCB0b3VjaCA9IFRvdWNoLkFzTmV3KSB7XG4gICAgICAgIHJldHVybiBzdXBlci5nZXQoa2V5LCB0b3VjaCk7XG4gICAgfVxuICAgIHBlZWsoa2V5KSB7XG4gICAgICAgIHJldHVybiBzdXBlci5nZXQoa2V5LCBUb3VjaC5Ob25lKTtcbiAgICB9XG4gICAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgc3VwZXIuc2V0KGtleSwgdmFsdWUsIFRvdWNoLkxhc3QpO1xuICAgICAgICB0aGlzLmNoZWNrVHJpbSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgY2hlY2tUcmltKCkge1xuICAgICAgICBpZiAodGhpcy5zaXplID4gdGhpcy5fbGltaXQpIHtcbiAgICAgICAgICAgIHRoaXMudHJpbU9sZChNYXRoLnJvdW5kKHRoaXMuX2xpbWl0ICogdGhpcy5fcmF0aW8pKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuTFJVQ2FjaGUgPSBMUlVDYWNoZTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5EaXNwb3NhYmxlID0gdm9pZCAwO1xudmFyIERpc3Bvc2FibGU7XG4oZnVuY3Rpb24gKERpc3Bvc2FibGUpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUoZnVuYykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGlzcG9zZTogZnVuY1xuICAgICAgICB9O1xuICAgIH1cbiAgICBEaXNwb3NhYmxlLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKERpc3Bvc2FibGUgfHwgKGV4cG9ydHMuRGlzcG9zYWJsZSA9IERpc3Bvc2FibGUgPSB7fSkpO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xubGV0IF9yYWw7XG5mdW5jdGlvbiBSQUwoKSB7XG4gICAgaWYgKF9yYWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHJ1bnRpbWUgYWJzdHJhY3Rpb24gbGF5ZXIgaW5zdGFsbGVkYCk7XG4gICAgfVxuICAgIHJldHVybiBfcmFsO1xufVxuKGZ1bmN0aW9uIChSQUwpIHtcbiAgICBmdW5jdGlvbiBpbnN0YWxsKHJhbCkge1xuICAgICAgICBpZiAocmFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gcnVudGltZSBhYnN0cmFjdGlvbiBsYXllciBwcm92aWRlZGApO1xuICAgICAgICB9XG4gICAgICAgIF9yYWwgPSByYWw7XG4gICAgfVxuICAgIFJBTC5pbnN0YWxsID0gaW5zdGFsbDtcbn0pKFJBTCB8fCAoUkFMID0ge30pKTtcbmV4cG9ydHMuZGVmYXVsdCA9IFJBTDtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuRW1pdHRlciA9IGV4cG9ydHMuRXZlbnQgPSB2b2lkIDA7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbnZhciBFdmVudDtcbihmdW5jdGlvbiAoRXZlbnQpIHtcbiAgICBjb25zdCBfZGlzcG9zYWJsZSA9IHsgZGlzcG9zZSgpIHsgfSB9O1xuICAgIEV2ZW50Lk5vbmUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBfZGlzcG9zYWJsZTsgfTtcbn0pKEV2ZW50IHx8IChleHBvcnRzLkV2ZW50ID0gRXZlbnQgPSB7fSkpO1xuY2xhc3MgQ2FsbGJhY2tMaXN0IHtcbiAgICBhZGQoY2FsbGJhY2ssIGNvbnRleHQgPSBudWxsLCBidWNrZXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fY29udGV4dHMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgICAgIHRoaXMuX2NvbnRleHRzLnB1c2goY29udGV4dCk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGJ1Y2tldCkpIHtcbiAgICAgICAgICAgIGJ1Y2tldC5wdXNoKHsgZGlzcG9zZTogKCkgPT4gdGhpcy5yZW1vdmUoY2FsbGJhY2ssIGNvbnRleHQpIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlbW92ZShjYWxsYmFjaywgY29udGV4dCA9IG51bGwpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZm91bmRDYWxsYmFja1dpdGhEaWZmZXJlbnRDb250ZXh0ID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLl9jYWxsYmFja3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jYWxsYmFja3NbaV0gPT09IGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NvbnRleHRzW2ldID09PSBjb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrICYgY29udGV4dCBtYXRjaCA9PiByZW1vdmUgaXRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29udGV4dHMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZENhbGxiYWNrV2l0aERpZmZlcmVudENvbnRleHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZm91bmRDYWxsYmFja1dpdGhEaWZmZXJlbnRDb250ZXh0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1doZW4gYWRkaW5nIGEgbGlzdGVuZXIgd2l0aCBhIGNvbnRleHQsIHlvdSBzaG91bGQgcmVtb3ZlIGl0IHdpdGggdGhlIHNhbWUgY29udGV4dCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGludm9rZSguLi5hcmdzKSB7XG4gICAgICAgIGlmICghdGhpcy5fY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmV0ID0gW10sIGNhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcy5zbGljZSgwKSwgY29udGV4dHMgPSB0aGlzLl9jb250ZXh0cy5zbGljZSgwKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXQucHVzaChjYWxsYmFja3NbaV0uYXBwbHkoY29udGV4dHNbaV0sIGFyZ3MpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS5jb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICAgIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5fY2FsbGJhY2tzIHx8IHRoaXMuX2NhbGxiYWNrcy5sZW5ndGggPT09IDA7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fY29udGV4dHMgPSB1bmRlZmluZWQ7XG4gICAgfVxufVxuY2xhc3MgRW1pdHRlciB7XG4gICAgY29uc3RydWN0b3IoX29wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IF9vcHRpb25zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGb3IgdGhlIHB1YmxpYyB0byBhbGxvdyB0byBzdWJzY3JpYmVcbiAgICAgKiB0byBldmVudHMgZnJvbSB0aGlzIEVtaXR0ZXJcbiAgICAgKi9cbiAgICBnZXQgZXZlbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fZXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50ID0gKGxpc3RlbmVyLCB0aGlzQXJncywgZGlzcG9zYWJsZXMpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2NhbGxiYWNrcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWxsYmFja3MgPSBuZXcgQ2FsbGJhY2tMaXN0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMub25GaXJzdExpc3RlbmVyQWRkICYmIHRoaXMuX2NhbGxiYWNrcy5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy5vbkZpcnN0TGlzdGVuZXJBZGQodGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5hZGQobGlzdGVuZXIsIHRoaXNBcmdzKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlzcG9zYWJsZSBpcyBkaXNwb3NlZCBhZnRlciBlbWl0dGVyIGlzIGRpc3Bvc2VkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5yZW1vdmUobGlzdGVuZXIsIHRoaXNBcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5kaXNwb3NlID0gRW1pdHRlci5fbm9vcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMub25MYXN0TGlzdGVuZXJSZW1vdmUgJiYgdGhpcy5fY2FsbGJhY2tzLmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29wdGlvbnMub25MYXN0TGlzdGVuZXJSZW1vdmUodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRpc3Bvc2FibGVzKSkge1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlcy5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9ldmVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVG8gYmUga2VwdCBwcml2YXRlIHRvIGZpcmUgYW4gZXZlbnQgdG9cbiAgICAgKiBzdWJzY3JpYmVyc1xuICAgICAqL1xuICAgIGZpcmUoZXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NhbGxiYWNrcykge1xuICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzLmludm9rZS5jYWxsKHRoaXMuX2NhbGxiYWNrcywgZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5kaXNwb3NlKCk7XG4gICAgICAgICAgICB0aGlzLl9jYWxsYmFja3MgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLkVtaXR0ZXIgPSBFbWl0dGVyO1xuRW1pdHRlci5fbm9vcCA9IGZ1bmN0aW9uICgpIHsgfTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uVG9rZW4gPSB2b2lkIDA7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbmNvbnN0IElzID0gcmVxdWlyZShcIi4vaXNcIik7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCIuL2V2ZW50c1wiKTtcbnZhciBDYW5jZWxsYXRpb25Ub2tlbjtcbihmdW5jdGlvbiAoQ2FuY2VsbGF0aW9uVG9rZW4pIHtcbiAgICBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGlzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkOiBmYWxzZSxcbiAgICAgICAgb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6IGV2ZW50c18xLkV2ZW50Lk5vbmVcbiAgICB9KTtcbiAgICBDYW5jZWxsYXRpb25Ub2tlbi5DYW5jZWxsZWQgPSBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6IHRydWUsXG4gICAgICAgIG9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkOiBldmVudHNfMS5FdmVudC5Ob25lXG4gICAgfSk7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgKGNhbmRpZGF0ZSA9PT0gQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZVxuICAgICAgICAgICAgfHwgY2FuZGlkYXRlID09PSBDYW5jZWxsYXRpb25Ub2tlbi5DYW5jZWxsZWRcbiAgICAgICAgICAgIHx8IChJcy5ib29sZWFuKGNhbmRpZGF0ZS5pc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkgJiYgISFjYW5kaWRhdGUub25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQpKTtcbiAgICB9XG4gICAgQ2FuY2VsbGF0aW9uVG9rZW4uaXMgPSBpcztcbn0pKENhbmNlbGxhdGlvblRva2VuIHx8IChleHBvcnRzLkNhbmNlbGxhdGlvblRva2VuID0gQ2FuY2VsbGF0aW9uVG9rZW4gPSB7fSkpO1xuY29uc3Qgc2hvcnRjdXRFdmVudCA9IE9iamVjdC5mcmVlemUoZnVuY3Rpb24gKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgY29uc3QgaGFuZGxlID0gKDAsIHJhbF8xLmRlZmF1bHQpKCkudGltZXIuc2V0VGltZW91dChjYWxsYmFjay5iaW5kKGNvbnRleHQpLCAwKTtcbiAgICByZXR1cm4geyBkaXNwb3NlKCkgeyBoYW5kbGUuZGlzcG9zZSgpOyB9IH07XG59KTtcbmNsYXNzIE11dGFibGVUb2tlbiB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX2lzQ2FuY2VsbGVkID0gZmFsc2U7XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9pc0NhbmNlbGxlZCkge1xuICAgICAgICAgICAgdGhpcy5faXNDYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2VtaXR0ZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmZpcmUodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0NhbmNlbGxlZDtcbiAgICB9XG4gICAgZ2V0IG9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKCkge1xuICAgICAgICBpZiAodGhpcy5faXNDYW5jZWxsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBzaG9ydGN1dEV2ZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5fZW1pdHRlcikge1xuICAgICAgICAgICAgdGhpcy5fZW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2VtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLl9lbWl0dGVyKSB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5jbGFzcyBDYW5jZWxsYXRpb25Ub2tlblNvdXJjZSB7XG4gICAgZ2V0IHRva2VuKCkge1xuICAgICAgICBpZiAoIXRoaXMuX3Rva2VuKSB7XG4gICAgICAgICAgICAvLyBiZSBsYXp5IGFuZCBjcmVhdGUgdGhlIHRva2VuIG9ubHkgd2hlblxuICAgICAgICAgICAgLy8gYWN0dWFsbHkgbmVlZGVkXG4gICAgICAgICAgICB0aGlzLl90b2tlbiA9IG5ldyBNdXRhYmxlVG9rZW4oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fdG9rZW47XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl90b2tlbikge1xuICAgICAgICAgICAgLy8gc2F2ZSBhbiBvYmplY3QgYnkgcmV0dXJuaW5nIHRoZSBkZWZhdWx0XG4gICAgICAgICAgICAvLyBjYW5jZWxsZWQgdG9rZW4gd2hlbiBjYW5jZWxsYXRpb24gaGFwcGVuc1xuICAgICAgICAgICAgLy8gYmVmb3JlIHNvbWVvbmUgYXNrcyBmb3IgdGhlIHRva2VuXG4gICAgICAgICAgICB0aGlzLl90b2tlbiA9IENhbmNlbGxhdGlvblRva2VuLkNhbmNlbGxlZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3Rva2VuLmNhbmNlbCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICghdGhpcy5fdG9rZW4pIHtcbiAgICAgICAgICAgIC8vIGVuc3VyZSB0byBpbml0aWFsaXplIHdpdGggYW4gZW1wdHkgdG9rZW4gaWYgd2UgaGFkIG5vbmVcbiAgICAgICAgICAgIHRoaXMuX3Rva2VuID0gQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLl90b2tlbiBpbnN0YW5jZW9mIE11dGFibGVUb2tlbikge1xuICAgICAgICAgICAgLy8gYWN0dWFsbHkgZGlzcG9zZVxuICAgICAgICAgICAgdGhpcy5fdG9rZW4uZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IENhbmNlbGxhdGlvblRva2VuU291cmNlO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3kgPSB2b2lkIDA7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbnZhciBDYW5jZWxsYXRpb25TdGF0ZTtcbihmdW5jdGlvbiAoQ2FuY2VsbGF0aW9uU3RhdGUpIHtcbiAgICBDYW5jZWxsYXRpb25TdGF0ZS5Db250aW51ZSA9IDA7XG4gICAgQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkID0gMTtcbn0pKENhbmNlbGxhdGlvblN0YXRlIHx8IChDYW5jZWxsYXRpb25TdGF0ZSA9IHt9KSk7XG5jbGFzcyBTaGFyZWRBcnJheVNlbmRlclN0cmF0ZWd5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5idWZmZXJzID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICBlbmFibGVDYW5jZWxsYXRpb24ocmVxdWVzdCkge1xuICAgICAgICBpZiAocmVxdWVzdC5pZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBTaGFyZWRBcnJheUJ1ZmZlcig0KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBJbnQzMkFycmF5KGJ1ZmZlciwgMCwgMSk7XG4gICAgICAgIGRhdGFbMF0gPSBDYW5jZWxsYXRpb25TdGF0ZS5Db250aW51ZTtcbiAgICAgICAgdGhpcy5idWZmZXJzLnNldChyZXF1ZXN0LmlkLCBidWZmZXIpO1xuICAgICAgICByZXF1ZXN0LiRjYW5jZWxsYXRpb25EYXRhID0gYnVmZmVyO1xuICAgIH1cbiAgICBhc3luYyBzZW5kQ2FuY2VsbGF0aW9uKF9jb25uLCBpZCkge1xuICAgICAgICBjb25zdCBidWZmZXIgPSB0aGlzLmJ1ZmZlcnMuZ2V0KGlkKTtcbiAgICAgICAgaWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBJbnQzMkFycmF5KGJ1ZmZlciwgMCwgMSk7XG4gICAgICAgIEF0b21pY3Muc3RvcmUoZGF0YSwgMCwgQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkKTtcbiAgICB9XG4gICAgY2xlYW51cChpZCkge1xuICAgICAgICB0aGlzLmJ1ZmZlcnMuZGVsZXRlKGlkKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy5idWZmZXJzLmNsZWFyKCk7XG4gICAgfVxufVxuZXhwb3J0cy5TaGFyZWRBcnJheVNlbmRlclN0cmF0ZWd5ID0gU2hhcmVkQXJyYXlTZW5kZXJTdHJhdGVneTtcbmNsYXNzIFNoYXJlZEFycmF5QnVmZmVyQ2FuY2VsbGF0aW9uVG9rZW4ge1xuICAgIGNvbnN0cnVjdG9yKGJ1ZmZlcikge1xuICAgICAgICB0aGlzLmRhdGEgPSBuZXcgSW50MzJBcnJheShidWZmZXIsIDAsIDEpO1xuICAgIH1cbiAgICBnZXQgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHJldHVybiBBdG9taWNzLmxvYWQodGhpcy5kYXRhLCAwKSA9PT0gQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkO1xuICAgIH1cbiAgICBnZXQgb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuY2VsbGF0aW9uIG92ZXIgU2hhcmVkQXJyYXlCdWZmZXIgZG9lc24ndCBzdXBwb3J0IGNhbmNlbGxhdGlvbiBldmVudHNgKTtcbiAgICB9XG59XG5jbGFzcyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuU291cmNlIHtcbiAgICBjb25zdHJ1Y3RvcihidWZmZXIpIHtcbiAgICAgICAgdGhpcy50b2tlbiA9IG5ldyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuKGJ1ZmZlcik7XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICB9XG59XG5jbGFzcyBTaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmtpbmQgPSAncmVxdWVzdCc7XG4gICAgfVxuICAgIGNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKHJlcXVlc3QpIHtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gcmVxdWVzdC4kY2FuY2VsbGF0aW9uRGF0YTtcbiAgICAgICAgaWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuU291cmNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuU291cmNlKGJ1ZmZlcik7XG4gICAgfVxufVxuZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBTaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3k7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNlbWFwaG9yZSA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY2xhc3MgU2VtYXBob3JlIHtcbiAgICBjb25zdHJ1Y3RvcihjYXBhY2l0eSA9IDEpIHtcbiAgICAgICAgaWYgKGNhcGFjaXR5IDw9IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FwYWNpdHkgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NhcGFjaXR5ID0gY2FwYWNpdHk7XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IDA7XG4gICAgICAgIHRoaXMuX3dhaXRpbmcgPSBbXTtcbiAgICB9XG4gICAgbG9jayh0aHVuaykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fd2FpdGluZy5wdXNoKHsgdGh1bmssIHJlc29sdmUsIHJlamVjdCB9KTtcbiAgICAgICAgICAgIHRoaXMucnVuTmV4dCgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0IGFjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTtcbiAgICB9XG4gICAgcnVuTmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dhaXRpbmcubGVuZ3RoID09PSAwIHx8IHRoaXMuX2FjdGl2ZSA9PT0gdGhpcy5fY2FwYWNpdHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS50aW1lci5zZXRJbW1lZGlhdGUoKCkgPT4gdGhpcy5kb1J1bk5leHQoKSk7XG4gICAgfVxuICAgIGRvUnVuTmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dhaXRpbmcubGVuZ3RoID09PSAwIHx8IHRoaXMuX2FjdGl2ZSA9PT0gdGhpcy5fY2FwYWNpdHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5fd2FpdGluZy5zaGlmdCgpO1xuICAgICAgICB0aGlzLl9hY3RpdmUrKztcbiAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZSA+IHRoaXMuX2NhcGFjaXR5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRvIG1hbnkgdGh1bmtzIGFjdGl2ZWApO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXh0LnRodW5rKCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC50aGVuKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5yZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5OZXh0KCk7XG4gICAgICAgICAgICAgICAgfSwgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5yZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5OZXh0KCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICBuZXh0LnJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1bk5leHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgIG5leHQucmVqZWN0KGVycik7XG4gICAgICAgICAgICB0aGlzLnJ1bk5leHQoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuU2VtYXBob3JlID0gU2VtYXBob3JlO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXIgPSBleHBvcnRzLkFic3RyYWN0TWVzc2FnZVJlYWRlciA9IGV4cG9ydHMuTWVzc2FnZVJlYWRlciA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IGV2ZW50c18xID0gcmVxdWlyZShcIi4vZXZlbnRzXCIpO1xuY29uc3Qgc2VtYXBob3JlXzEgPSByZXF1aXJlKFwiLi9zZW1hcGhvcmVcIik7XG52YXIgTWVzc2FnZVJlYWRlcjtcbihmdW5jdGlvbiAoTWVzc2FnZVJlYWRlcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5saXN0ZW4pICYmIElzLmZ1bmMoY2FuZGlkYXRlLmRpc3Bvc2UpICYmXG4gICAgICAgICAgICBJcy5mdW5jKGNhbmRpZGF0ZS5vbkVycm9yKSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5vbkNsb3NlKSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5vblBhcnRpYWxNZXNzYWdlKTtcbiAgICB9XG4gICAgTWVzc2FnZVJlYWRlci5pcyA9IGlzO1xufSkoTWVzc2FnZVJlYWRlciB8fCAoZXhwb3J0cy5NZXNzYWdlUmVhZGVyID0gTWVzc2FnZVJlYWRlciA9IHt9KSk7XG5jbGFzcyBBYnN0cmFjdE1lc3NhZ2VSZWFkZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZUVtaXR0ZXIgPSBuZXcgZXZlbnRzXzEuRW1pdHRlcigpO1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlci5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgZ2V0IG9uRXJyb3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVycm9yRW1pdHRlci5ldmVudDtcbiAgICB9XG4gICAgZmlyZUVycm9yKGVycm9yKSB7XG4gICAgICAgIHRoaXMuZXJyb3JFbWl0dGVyLmZpcmUodGhpcy5hc0Vycm9yKGVycm9yKSk7XG4gICAgfVxuICAgIGdldCBvbkNsb3NlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9zZUVtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGZpcmVDbG9zZSgpIHtcbiAgICAgICAgdGhpcy5jbG9zZUVtaXR0ZXIuZmlyZSh1bmRlZmluZWQpO1xuICAgIH1cbiAgICBnZXQgb25QYXJ0aWFsTWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFydGlhbE1lc3NhZ2VFbWl0dGVyLmV2ZW50O1xuICAgIH1cbiAgICBmaXJlUGFydGlhbE1lc3NhZ2UoaW5mbykge1xuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlRW1pdHRlci5maXJlKGluZm8pO1xuICAgIH1cbiAgICBhc0Vycm9yKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKGBSZWFkZXIgcmVjZWl2ZWQgZXJyb3IuIFJlYXNvbjogJHtJcy5zdHJpbmcoZXJyb3IubWVzc2FnZSkgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24nfWApO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VSZWFkZXIgPSBBYnN0cmFjdE1lc3NhZ2VSZWFkZXI7XG52YXIgUmVzb2x2ZWRNZXNzYWdlUmVhZGVyT3B0aW9ucztcbihmdW5jdGlvbiAoUmVzb2x2ZWRNZXNzYWdlUmVhZGVyT3B0aW9ucykge1xuICAgIGZ1bmN0aW9uIGZyb21PcHRpb25zKG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IGNoYXJzZXQ7XG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIGxldCBjb250ZW50RGVjb2RlcjtcbiAgICAgICAgY29uc3QgY29udGVudERlY29kZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICBsZXQgY29udGVudFR5cGVEZWNvZGVyO1xuICAgICAgICBjb25zdCBjb250ZW50VHlwZURlY29kZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY2hhcnNldCA9IG9wdGlvbnMgPz8gJ3V0Zi04JztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNoYXJzZXQgPSBvcHRpb25zLmNoYXJzZXQgPz8gJ3V0Zi04JztcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnREZWNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50RGVjb2RlciA9IG9wdGlvbnMuY29udGVudERlY29kZXI7XG4gICAgICAgICAgICAgICAgY29udGVudERlY29kZXJzLnNldChjb250ZW50RGVjb2Rlci5uYW1lLCBjb250ZW50RGVjb2Rlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5jb250ZW50RGVjb2RlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGVjb2RlciBvZiBvcHRpb25zLmNvbnRlbnREZWNvZGVycykge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50RGVjb2RlcnMuc2V0KGRlY29kZXIubmFtZSwgZGVjb2Rlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuY29udGVudFR5cGVEZWNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXIgPSBvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcjtcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXJzLnNldChjb250ZW50VHlwZURlY29kZXIubmFtZSwgY29udGVudFR5cGVEZWNvZGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGVjb2RlciBvZiBvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGVEZWNvZGVycy5zZXQoZGVjb2Rlci5uYW1lLCBkZWNvZGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnRlbnRUeXBlRGVjb2RlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXIgPSAoMCwgcmFsXzEuZGVmYXVsdCkoKS5hcHBsaWNhdGlvbkpzb24uZGVjb2RlcjtcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlRGVjb2RlcnMuc2V0KGNvbnRlbnRUeXBlRGVjb2Rlci5uYW1lLCBjb250ZW50VHlwZURlY29kZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGNoYXJzZXQsIGNvbnRlbnREZWNvZGVyLCBjb250ZW50RGVjb2RlcnMsIGNvbnRlbnRUeXBlRGVjb2RlciwgY29udGVudFR5cGVEZWNvZGVycyB9O1xuICAgIH1cbiAgICBSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zLmZyb21PcHRpb25zID0gZnJvbU9wdGlvbnM7XG59KShSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zIHx8IChSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zID0ge30pKTtcbmNsYXNzIFJlYWRhYmxlU3RyZWFtTWVzc2FnZVJlYWRlciBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVJlYWRlciB7XG4gICAgY29uc3RydWN0b3IocmVhZGFibGUsIG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZSA9IHJlYWRhYmxlO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zLmZyb21PcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmJ1ZmZlciA9ICgwLCByYWxfMS5kZWZhdWx0KSgpLm1lc3NhZ2VCdWZmZXIuY3JlYXRlKHRoaXMub3B0aW9ucy5jaGFyc2V0KTtcbiAgICAgICAgdGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0ID0gMTAwMDA7XG4gICAgICAgIHRoaXMubmV4dE1lc3NhZ2VMZW5ndGggPSAtMTtcbiAgICAgICAgdGhpcy5tZXNzYWdlVG9rZW4gPSAwO1xuICAgICAgICB0aGlzLnJlYWRTZW1hcGhvcmUgPSBuZXcgc2VtYXBob3JlXzEuU2VtYXBob3JlKDEpO1xuICAgIH1cbiAgICBzZXQgcGFydGlhbE1lc3NhZ2VUaW1lb3V0KHRpbWVvdXQpIHtcbiAgICAgICAgdGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0ID0gdGltZW91dDtcbiAgICB9XG4gICAgZ2V0IHBhcnRpYWxNZXNzYWdlVGltZW91dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dDtcbiAgICB9XG4gICAgbGlzdGVuKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMubmV4dE1lc3NhZ2VMZW5ndGggPSAtMTtcbiAgICAgICAgdGhpcy5tZXNzYWdlVG9rZW4gPSAwO1xuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlVGltZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5yZWFkYWJsZS5vbkRhdGEoKGRhdGEpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25EYXRhKGRhdGEpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZS5vbkVycm9yKChlcnJvcikgPT4gdGhpcy5maXJlRXJyb3IoZXJyb3IpKTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZS5vbkNsb3NlKCgpID0+IHRoaXMuZmlyZUNsb3NlKCkpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBvbkRhdGEoZGF0YSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5idWZmZXIuYXBwZW5kKGRhdGEpO1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IHRoaXMuYnVmZmVyLnRyeVJlYWRIZWFkZXJzKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50TGVuZ3RoID0gaGVhZGVycy5nZXQoJ2NvbnRlbnQtbGVuZ3RoJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY29udGVudExlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IobmV3IEVycm9yKGBIZWFkZXIgbXVzdCBwcm92aWRlIGEgQ29udGVudC1MZW5ndGggcHJvcGVydHkuXFxuJHtKU09OLnN0cmluZ2lmeShPYmplY3QuZnJvbUVudHJpZXMoaGVhZGVycykpfWApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsZW5ndGggPSBwYXJzZUludChjb250ZW50TGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKGxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKG5ldyBFcnJvcihgQ29udGVudC1MZW5ndGggdmFsdWUgbXVzdCBiZSBhIG51bWJlci4gR290ICR7Y29udGVudExlbmd0aH1gKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IHRoaXMuYnVmZmVyLnRyeVJlYWRCb2R5KHRoaXMubmV4dE1lc3NhZ2VMZW5ndGgpO1xuICAgICAgICAgICAgICAgIGlmIChib2R5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLyoqIFdlIGhhdmVuJ3QgcmVjZWl2ZWQgdGhlIGZ1bGwgbWVzc2FnZSB5ZXQuICovXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0UGFydGlhbE1lc3NhZ2VUaW1lcigpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJQYXJ0aWFsTWVzc2FnZVRpbWVyKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9IC0xO1xuICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHdlIGNvbnZlcnQgb25lIHJlY2VpdmVkIG1lc3NhZ2UgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAgICAgLy8gb3RoZXIuIE90aGVyd2lzZSBpdCBjb3VsZCBoYXBwZW4gdGhhdCBhIGRlY29kaW5nIG9mIGEgc2Vjb25kXG4gICAgICAgICAgICAgICAgLy8gc21hbGxlciBtZXNzYWdlIGZpbmlzaGVkIGJlZm9yZSB0aGUgZGVjb2Rpbmcgb2YgYSBmaXJzdCBsYXJnZXJcbiAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIGFuZCB0aGVuIHdlIHdvdWxkIGRlbGl2ZXIgdGhlIHNlY29uZCBtZXNzYWdlIGZpcnN0LlxuICAgICAgICAgICAgICAgIHRoaXMucmVhZFNlbWFwaG9yZS5sb2NrKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnl0ZXMgPSB0aGlzLm9wdGlvbnMuY29udGVudERlY29kZXIgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBhd2FpdCB0aGlzLm9wdGlvbnMuY29udGVudERlY29kZXIuZGVjb2RlKGJvZHkpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGJvZHk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBhd2FpdCB0aGlzLm9wdGlvbnMuY29udGVudFR5cGVEZWNvZGVyLmRlY29kZShieXRlcywgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjayhtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNsZWFyUGFydGlhbE1lc3NhZ2VUaW1lcigpIHtcbiAgICAgICAgaWYgKHRoaXMucGFydGlhbE1lc3NhZ2VUaW1lcikge1xuICAgICAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZVRpbWVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRoaXMucGFydGlhbE1lc3NhZ2VUaW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRQYXJ0aWFsTWVzc2FnZVRpbWVyKCkge1xuICAgICAgICB0aGlzLmNsZWFyUGFydGlhbE1lc3NhZ2VUaW1lcigpO1xuICAgICAgICBpZiAodGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0IDw9IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlVGltZXIgPSAoMCwgcmFsXzEuZGVmYXVsdCkoKS50aW1lci5zZXRUaW1lb3V0KCh0b2tlbiwgdGltZW91dCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZVRpbWVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRva2VuID09PSB0aGlzLm1lc3NhZ2VUb2tlbikge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZVBhcnRpYWxNZXNzYWdlKHsgbWVzc2FnZVRva2VuOiB0b2tlbiwgd2FpdGluZ1RpbWU6IHRpbWVvdXQgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRQYXJ0aWFsTWVzc2FnZVRpbWVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dCwgdGhpcy5tZXNzYWdlVG9rZW4sIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dCk7XG4gICAgfVxufVxuZXhwb3J0cy5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXIgPSBSZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLldyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLkFic3RyYWN0TWVzc2FnZVdyaXRlciA9IGV4cG9ydHMuTWVzc2FnZVdyaXRlciA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IHNlbWFwaG9yZV8xID0gcmVxdWlyZShcIi4vc2VtYXBob3JlXCIpO1xuY29uc3QgZXZlbnRzXzEgPSByZXF1aXJlKFwiLi9ldmVudHNcIik7XG5jb25zdCBDb250ZW50TGVuZ3RoID0gJ0NvbnRlbnQtTGVuZ3RoOiAnO1xuY29uc3QgQ1JMRiA9ICdcXHJcXG4nO1xudmFyIE1lc3NhZ2VXcml0ZXI7XG4oZnVuY3Rpb24gKE1lc3NhZ2VXcml0ZXIpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgSXMuZnVuYyhjYW5kaWRhdGUuZGlzcG9zZSkgJiYgSXMuZnVuYyhjYW5kaWRhdGUub25DbG9zZSkgJiZcbiAgICAgICAgICAgIElzLmZ1bmMoY2FuZGlkYXRlLm9uRXJyb3IpICYmIElzLmZ1bmMoY2FuZGlkYXRlLndyaXRlKTtcbiAgICB9XG4gICAgTWVzc2FnZVdyaXRlci5pcyA9IGlzO1xufSkoTWVzc2FnZVdyaXRlciB8fCAoZXhwb3J0cy5NZXNzYWdlV3JpdGVyID0gTWVzc2FnZVdyaXRlciA9IHt9KSk7XG5jbGFzcyBBYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy5lcnJvckVtaXR0ZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLmNsb3NlRW1pdHRlci5kaXNwb3NlKCk7XG4gICAgfVxuICAgIGdldCBvbkVycm9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lcnJvckVtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGZpcmVFcnJvcihlcnJvciwgbWVzc2FnZSwgY291bnQpIHtcbiAgICAgICAgdGhpcy5lcnJvckVtaXR0ZXIuZmlyZShbdGhpcy5hc0Vycm9yKGVycm9yKSwgbWVzc2FnZSwgY291bnRdKTtcbiAgICB9XG4gICAgZ2V0IG9uQ2xvc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb3NlRW1pdHRlci5ldmVudDtcbiAgICB9XG4gICAgZmlyZUNsb3NlKCkge1xuICAgICAgICB0aGlzLmNsb3NlRW1pdHRlci5maXJlKHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIGFzRXJyb3IoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoYFdyaXRlciByZWNlaXZlZCBlcnJvci4gUmVhc29uOiAke0lzLnN0cmluZyhlcnJvci5tZXNzYWdlKSA/IGVycm9yLm1lc3NhZ2UgOiAndW5rbm93bid9YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLkFic3RyYWN0TWVzc2FnZVdyaXRlciA9IEFic3RyYWN0TWVzc2FnZVdyaXRlcjtcbnZhciBSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zO1xuKGZ1bmN0aW9uIChSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zKSB7XG4gICAgZnVuY3Rpb24gZnJvbU9wdGlvbnMob3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHsgY2hhcnNldDogb3B0aW9ucyA/PyAndXRmLTgnLCBjb250ZW50VHlwZUVuY29kZXI6ICgwLCByYWxfMS5kZWZhdWx0KSgpLmFwcGxpY2F0aW9uSnNvbi5lbmNvZGVyIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4geyBjaGFyc2V0OiBvcHRpb25zLmNoYXJzZXQgPz8gJ3V0Zi04JywgY29udGVudEVuY29kZXI6IG9wdGlvbnMuY29udGVudEVuY29kZXIsIGNvbnRlbnRUeXBlRW5jb2Rlcjogb3B0aW9ucy5jb250ZW50VHlwZUVuY29kZXIgPz8gKDAsIHJhbF8xLmRlZmF1bHQpKCkuYXBwbGljYXRpb25Kc29uLmVuY29kZXIgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zLmZyb21PcHRpb25zID0gZnJvbU9wdGlvbnM7XG59KShSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zIHx8IChSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zID0ge30pKTtcbmNsYXNzIFdyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKHdyaXRhYmxlLCBvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMud3JpdGFibGUgPSB3cml0YWJsZTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gUmVzb2x2ZWRNZXNzYWdlV3JpdGVyT3B0aW9ucy5mcm9tT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50ID0gMDtcbiAgICAgICAgdGhpcy53cml0ZVNlbWFwaG9yZSA9IG5ldyBzZW1hcGhvcmVfMS5TZW1hcGhvcmUoMSk7XG4gICAgICAgIHRoaXMud3JpdGFibGUub25FcnJvcigoZXJyb3IpID0+IHRoaXMuZmlyZUVycm9yKGVycm9yKSk7XG4gICAgICAgIHRoaXMud3JpdGFibGUub25DbG9zZSgoKSA9PiB0aGlzLmZpcmVDbG9zZSgpKTtcbiAgICB9XG4gICAgYXN5bmMgd3JpdGUobXNnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndyaXRlU2VtYXBob3JlLmxvY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHRoaXMub3B0aW9ucy5jb250ZW50VHlwZUVuY29kZXIuZW5jb2RlKG1zZywgdGhpcy5vcHRpb25zKS50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNvbnRlbnRFbmNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jb250ZW50RW5jb2Rlci5lbmNvZGUoYnVmZmVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZC50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJzID0gW107XG4gICAgICAgICAgICAgICAgaGVhZGVycy5wdXNoKENvbnRlbnRMZW5ndGgsIGJ1ZmZlci5ieXRlTGVuZ3RoLnRvU3RyaW5nKCksIENSTEYpO1xuICAgICAgICAgICAgICAgIGhlYWRlcnMucHVzaChDUkxGKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kb1dyaXRlKG1zZywgaGVhZGVycywgYnVmZmVyKTtcbiAgICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgZG9Xcml0ZShtc2csIGhlYWRlcnMsIGRhdGEpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMud3JpdGFibGUud3JpdGUoaGVhZGVycy5qb2luKCcnKSwgJ2FzY2lpJyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy53cml0YWJsZS53cml0ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IsIG1zZyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZUVycm9yKGVycm9yLCBtc2cpIHtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50Kys7XG4gICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yLCBtc2csIHRoaXMuZXJyb3JDb3VudCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICAgICAgdGhpcy53cml0YWJsZS5lbmQoKTtcbiAgICB9XG59XG5leHBvcnRzLldyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgPSBXcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkFic3RyYWN0TWVzc2FnZUJ1ZmZlciA9IHZvaWQgMDtcbmNvbnN0IENSID0gMTM7XG5jb25zdCBMRiA9IDEwO1xuY29uc3QgQ1JMRiA9ICdcXHJcXG4nO1xuY2xhc3MgQWJzdHJhY3RNZXNzYWdlQnVmZmVyIHtcbiAgICBjb25zdHJ1Y3RvcihlbmNvZGluZyA9ICd1dGYtOCcpIHtcbiAgICAgICAgdGhpcy5fZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgICAgICAgdGhpcy5fY2h1bmtzID0gW107XG4gICAgICAgIHRoaXMuX3RvdGFsTGVuZ3RoID0gMDtcbiAgICB9XG4gICAgZ2V0IGVuY29kaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW5jb2Rpbmc7XG4gICAgfVxuICAgIGFwcGVuZChjaHVuaykge1xuICAgICAgICBjb25zdCB0b0FwcGVuZCA9IHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZycgPyB0aGlzLmZyb21TdHJpbmcoY2h1bmssIHRoaXMuX2VuY29kaW5nKSA6IGNodW5rO1xuICAgICAgICB0aGlzLl9jaHVua3MucHVzaCh0b0FwcGVuZCk7XG4gICAgICAgIHRoaXMuX3RvdGFsTGVuZ3RoICs9IHRvQXBwZW5kLmJ5dGVMZW5ndGg7XG4gICAgfVxuICAgIHRyeVJlYWRIZWFkZXJzKGxvd2VyQ2FzZUtleXMgPSBmYWxzZSkge1xuICAgICAgICBpZiAodGhpcy5fY2h1bmtzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3RhdGUgPSAwO1xuICAgICAgICBsZXQgY2h1bmtJbmRleCA9IDA7XG4gICAgICAgIGxldCBvZmZzZXQgPSAwO1xuICAgICAgICBsZXQgY2h1bmtCeXRlc1JlYWQgPSAwO1xuICAgICAgICByb3c6IHdoaWxlIChjaHVua0luZGV4IDwgdGhpcy5fY2h1bmtzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgY2h1bmsgPSB0aGlzLl9jaHVua3NbY2h1bmtJbmRleF07XG4gICAgICAgICAgICBvZmZzZXQgPSAwO1xuICAgICAgICAgICAgY29sdW1uOiB3aGlsZSAob2Zmc2V0IDwgY2h1bmsubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjaHVua1tvZmZzZXRdO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDUjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIExGOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gNDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHJvdztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjaHVua0J5dGVzUmVhZCArPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgY2h1bmtJbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZSAhPT0gNCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgYnVmZmVyIGNvbnRhaW5zIHRoZSB0d28gQ1JMRiBhdCB0aGUgZW5kLiBTbyB3ZSB3aWxsXG4gICAgICAgIC8vIGhhdmUgdHdvIGVtcHR5IGxpbmVzIGFmdGVyIHRoZSBzcGxpdCBhdCB0aGUgZW5kIGFzIHdlbGwuXG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuX3JlYWQoY2h1bmtCeXRlc1JlYWQgKyBvZmZzZXQpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwKCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLnRvU3RyaW5nKGJ1ZmZlciwgJ2FzY2lpJykuc3BsaXQoQ1JMRik7XG4gICAgICAgIGlmIChoZWFkZXJzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXJzLmxlbmd0aCAtIDI7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaGVhZGVyID0gaGVhZGVyc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gaGVhZGVyLmluZGV4T2YoJzonKTtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1lc3NhZ2UgaGVhZGVyIG11c3Qgc2VwYXJhdGUga2V5IGFuZCB2YWx1ZSB1c2luZyAnOidcXG4ke2hlYWRlcn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGhlYWRlci5zdWJzdHIoMCwgaW5kZXgpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBoZWFkZXIuc3Vic3RyKGluZGV4ICsgMSkudHJpbSgpO1xuICAgICAgICAgICAgcmVzdWx0LnNldChsb3dlckNhc2VLZXlzID8ga2V5LnRvTG93ZXJDYXNlKCkgOiBrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICB0cnlSZWFkQm9keShsZW5ndGgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3RvdGFsTGVuZ3RoIDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkKGxlbmd0aCk7XG4gICAgfVxuICAgIGdldCBudW1iZXJPZkJ5dGVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdG90YWxMZW5ndGg7XG4gICAgfVxuICAgIF9yZWFkKGJ5dGVDb3VudCkge1xuICAgICAgICBpZiAoYnl0ZUNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbXB0eUJ1ZmZlcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChieXRlQ291bnQgPiB0aGlzLl90b3RhbExlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVhZCBzbyBtYW55IGJ5dGVzIWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jaHVua3NbMF0uYnl0ZUxlbmd0aCA9PT0gYnl0ZUNvdW50KSB7XG4gICAgICAgICAgICAvLyBzdXBlciBmYXN0IHBhdGgsIHByZWNpc2VseSBmaXJzdCBjaHVuayBtdXN0IGJlIHJldHVybmVkXG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1swXTtcbiAgICAgICAgICAgIHRoaXMuX2NodW5rcy5zaGlmdCgpO1xuICAgICAgICAgICAgdGhpcy5fdG90YWxMZW5ndGggLT0gYnl0ZUNvdW50O1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXNOYXRpdmUoY2h1bmspO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jaHVua3NbMF0uYnl0ZUxlbmd0aCA+IGJ5dGVDb3VudCkge1xuICAgICAgICAgICAgLy8gZmFzdCBwYXRoLCB0aGUgcmVhZGluZyBpcyBlbnRpcmVseSB3aXRoaW4gdGhlIGZpcnN0IGNodW5rXG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1swXTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuYXNOYXRpdmUoY2h1bmssIGJ5dGVDb3VudCk7XG4gICAgICAgICAgICB0aGlzLl9jaHVua3NbMF0gPSBjaHVuay5zbGljZShieXRlQ291bnQpO1xuICAgICAgICAgICAgdGhpcy5fdG90YWxMZW5ndGggLT0gYnl0ZUNvdW50O1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmFsbG9jTmF0aXZlKGJ5dGVDb3VudCk7XG4gICAgICAgIGxldCByZXN1bHRPZmZzZXQgPSAwO1xuICAgICAgICBsZXQgY2h1bmtJbmRleCA9IDA7XG4gICAgICAgIHdoaWxlIChieXRlQ291bnQgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1tjaHVua0luZGV4XTtcbiAgICAgICAgICAgIGlmIChjaHVuay5ieXRlTGVuZ3RoID4gYnl0ZUNvdW50KSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBjaHVuayB3aWxsIHN1cnZpdmVcbiAgICAgICAgICAgICAgICBjb25zdCBjaHVua1BhcnQgPSBjaHVuay5zbGljZSgwLCBieXRlQ291bnQpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5zZXQoY2h1bmtQYXJ0LCByZXN1bHRPZmZzZXQpO1xuICAgICAgICAgICAgICAgIHJlc3VsdE9mZnNldCArPSBieXRlQ291bnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2h1bmtzW2NodW5rSW5kZXhdID0gY2h1bmsuc2xpY2UoYnl0ZUNvdW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLl90b3RhbExlbmd0aCAtPSBieXRlQ291bnQ7XG4gICAgICAgICAgICAgICAgYnl0ZUNvdW50IC09IGJ5dGVDb3VudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHRoaXMgY2h1bmsgd2lsbCBiZSBlbnRpcmVseSByZWFkXG4gICAgICAgICAgICAgICAgcmVzdWx0LnNldChjaHVuaywgcmVzdWx0T2Zmc2V0KTtcbiAgICAgICAgICAgICAgICByZXN1bHRPZmZzZXQgKz0gY2h1bmsuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgICAgICB0aGlzLl9jaHVua3Muc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl90b3RhbExlbmd0aCAtPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgICAgIGJ5dGVDb3VudCAtPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VCdWZmZXIgPSBBYnN0cmFjdE1lc3NhZ2VCdWZmZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uID0gZXhwb3J0cy5Db25uZWN0aW9uT3B0aW9ucyA9IGV4cG9ydHMuTWVzc2FnZVN0cmF0ZWd5ID0gZXhwb3J0cy5DYW5jZWxsYXRpb25TdHJhdGVneSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gZXhwb3J0cy5JZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IGV4cG9ydHMuQ29ubmVjdGlvbkVycm9yID0gZXhwb3J0cy5Db25uZWN0aW9uRXJyb3JzID0gZXhwb3J0cy5Mb2dUcmFjZU5vdGlmaWNhdGlvbiA9IGV4cG9ydHMuU2V0VHJhY2VOb3RpZmljYXRpb24gPSBleHBvcnRzLlRyYWNlRm9ybWF0ID0gZXhwb3J0cy5UcmFjZVZhbHVlcyA9IGV4cG9ydHMuVHJhY2UgPSBleHBvcnRzLk51bGxMb2dnZXIgPSBleHBvcnRzLlByb2dyZXNzVHlwZSA9IGV4cG9ydHMuUHJvZ3Jlc3NUb2tlbiA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IG1lc3NhZ2VzXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlc1wiKTtcbmNvbnN0IGxpbmtlZE1hcF8xID0gcmVxdWlyZShcIi4vbGlua2VkTWFwXCIpO1xuY29uc3QgZXZlbnRzXzEgPSByZXF1aXJlKFwiLi9ldmVudHNcIik7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbnZhciBDYW5jZWxOb3RpZmljYXRpb247XG4oZnVuY3Rpb24gKENhbmNlbE5vdGlmaWNhdGlvbikge1xuICAgIENhbmNlbE5vdGlmaWNhdGlvbi50eXBlID0gbmV3IG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZSgnJC9jYW5jZWxSZXF1ZXN0Jyk7XG59KShDYW5jZWxOb3RpZmljYXRpb24gfHwgKENhbmNlbE5vdGlmaWNhdGlvbiA9IHt9KSk7XG52YXIgUHJvZ3Jlc3NUb2tlbjtcbihmdW5jdGlvbiAoUHJvZ3Jlc3NUb2tlbikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG4gICAgfVxuICAgIFByb2dyZXNzVG9rZW4uaXMgPSBpcztcbn0pKFByb2dyZXNzVG9rZW4gfHwgKGV4cG9ydHMuUHJvZ3Jlc3NUb2tlbiA9IFByb2dyZXNzVG9rZW4gPSB7fSkpO1xudmFyIFByb2dyZXNzTm90aWZpY2F0aW9uO1xuKGZ1bmN0aW9uIChQcm9ncmVzc05vdGlmaWNhdGlvbikge1xuICAgIFByb2dyZXNzTm90aWZpY2F0aW9uLnR5cGUgPSBuZXcgbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlKCckL3Byb2dyZXNzJyk7XG59KShQcm9ncmVzc05vdGlmaWNhdGlvbiB8fCAoUHJvZ3Jlc3NOb3RpZmljYXRpb24gPSB7fSkpO1xuY2xhc3MgUHJvZ3Jlc3NUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICB9XG59XG5leHBvcnRzLlByb2dyZXNzVHlwZSA9IFByb2dyZXNzVHlwZTtcbnZhciBTdGFyUmVxdWVzdEhhbmRsZXI7XG4oZnVuY3Rpb24gKFN0YXJSZXF1ZXN0SGFuZGxlcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBJcy5mdW5jKHZhbHVlKTtcbiAgICB9XG4gICAgU3RhclJlcXVlc3RIYW5kbGVyLmlzID0gaXM7XG59KShTdGFyUmVxdWVzdEhhbmRsZXIgfHwgKFN0YXJSZXF1ZXN0SGFuZGxlciA9IHt9KSk7XG5leHBvcnRzLk51bGxMb2dnZXIgPSBPYmplY3QuZnJlZXplKHtcbiAgICBlcnJvcjogKCkgPT4geyB9LFxuICAgIHdhcm46ICgpID0+IHsgfSxcbiAgICBpbmZvOiAoKSA9PiB7IH0sXG4gICAgbG9nOiAoKSA9PiB7IH1cbn0pO1xudmFyIFRyYWNlO1xuKGZ1bmN0aW9uIChUcmFjZSkge1xuICAgIFRyYWNlW1RyYWNlW1wiT2ZmXCJdID0gMF0gPSBcIk9mZlwiO1xuICAgIFRyYWNlW1RyYWNlW1wiTWVzc2FnZXNcIl0gPSAxXSA9IFwiTWVzc2FnZXNcIjtcbiAgICBUcmFjZVtUcmFjZVtcIkNvbXBhY3RcIl0gPSAyXSA9IFwiQ29tcGFjdFwiO1xuICAgIFRyYWNlW1RyYWNlW1wiVmVyYm9zZVwiXSA9IDNdID0gXCJWZXJib3NlXCI7XG59KShUcmFjZSB8fCAoZXhwb3J0cy5UcmFjZSA9IFRyYWNlID0ge30pKTtcbnZhciBUcmFjZVZhbHVlcztcbihmdW5jdGlvbiAoVHJhY2VWYWx1ZXMpIHtcbiAgICAvKipcbiAgICAgKiBUdXJuIHRyYWNpbmcgb2ZmLlxuICAgICAqL1xuICAgIFRyYWNlVmFsdWVzLk9mZiA9ICdvZmYnO1xuICAgIC8qKlxuICAgICAqIFRyYWNlIG1lc3NhZ2VzIG9ubHkuXG4gICAgICovXG4gICAgVHJhY2VWYWx1ZXMuTWVzc2FnZXMgPSAnbWVzc2FnZXMnO1xuICAgIC8qKlxuICAgICAqIENvbXBhY3QgbWVzc2FnZSB0cmFjaW5nLlxuICAgICAqL1xuICAgIFRyYWNlVmFsdWVzLkNvbXBhY3QgPSAnY29tcGFjdCc7XG4gICAgLyoqXG4gICAgICogVmVyYm9zZSBtZXNzYWdlIHRyYWNpbmcuXG4gICAgICovXG4gICAgVHJhY2VWYWx1ZXMuVmVyYm9zZSA9ICd2ZXJib3NlJztcbn0pKFRyYWNlVmFsdWVzIHx8IChleHBvcnRzLlRyYWNlVmFsdWVzID0gVHJhY2VWYWx1ZXMgPSB7fSkpO1xuKGZ1bmN0aW9uIChUcmFjZSkge1xuICAgIGZ1bmN0aW9uIGZyb21TdHJpbmcodmFsdWUpIHtcbiAgICAgICAgaWYgKCFJcy5zdHJpbmcodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gVHJhY2UuT2ZmO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSAnb2ZmJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gVHJhY2UuT2ZmO1xuICAgICAgICAgICAgY2FzZSAnbWVzc2FnZXMnOlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5NZXNzYWdlcztcbiAgICAgICAgICAgIGNhc2UgJ2NvbXBhY3QnOlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5Db21wYWN0O1xuICAgICAgICAgICAgY2FzZSAndmVyYm9zZSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFRyYWNlLlZlcmJvc2U7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5PZmY7XG4gICAgICAgIH1cbiAgICB9XG4gICAgVHJhY2UuZnJvbVN0cmluZyA9IGZyb21TdHJpbmc7XG4gICAgZnVuY3Rpb24gdG9TdHJpbmcodmFsdWUpIHtcbiAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5PZmY6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdvZmYnO1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5NZXNzYWdlczpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ21lc3NhZ2VzJztcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuQ29tcGFjdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2NvbXBhY3QnO1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5WZXJib3NlOlxuICAgICAgICAgICAgICAgIHJldHVybiAndmVyYm9zZSc7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAnb2ZmJztcbiAgICAgICAgfVxuICAgIH1cbiAgICBUcmFjZS50b1N0cmluZyA9IHRvU3RyaW5nO1xufSkoVHJhY2UgfHwgKGV4cG9ydHMuVHJhY2UgPSBUcmFjZSA9IHt9KSk7XG52YXIgVHJhY2VGb3JtYXQ7XG4oZnVuY3Rpb24gKFRyYWNlRm9ybWF0KSB7XG4gICAgVHJhY2VGb3JtYXRbXCJUZXh0XCJdID0gXCJ0ZXh0XCI7XG4gICAgVHJhY2VGb3JtYXRbXCJKU09OXCJdID0gXCJqc29uXCI7XG59KShUcmFjZUZvcm1hdCB8fCAoZXhwb3J0cy5UcmFjZUZvcm1hdCA9IFRyYWNlRm9ybWF0ID0ge30pKTtcbihmdW5jdGlvbiAoVHJhY2VGb3JtYXQpIHtcbiAgICBmdW5jdGlvbiBmcm9tU3RyaW5nKHZhbHVlKSB7XG4gICAgICAgIGlmICghSXMuc3RyaW5nKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIFRyYWNlRm9ybWF0LlRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAodmFsdWUgPT09ICdqc29uJykge1xuICAgICAgICAgICAgcmV0dXJuIFRyYWNlRm9ybWF0LkpTT047XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gVHJhY2VGb3JtYXQuVGV4dDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBUcmFjZUZvcm1hdC5mcm9tU3RyaW5nID0gZnJvbVN0cmluZztcbn0pKFRyYWNlRm9ybWF0IHx8IChleHBvcnRzLlRyYWNlRm9ybWF0ID0gVHJhY2VGb3JtYXQgPSB7fSkpO1xudmFyIFNldFRyYWNlTm90aWZpY2F0aW9uO1xuKGZ1bmN0aW9uIChTZXRUcmFjZU5vdGlmaWNhdGlvbikge1xuICAgIFNldFRyYWNlTm90aWZpY2F0aW9uLnR5cGUgPSBuZXcgbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlKCckL3NldFRyYWNlJyk7XG59KShTZXRUcmFjZU5vdGlmaWNhdGlvbiB8fCAoZXhwb3J0cy5TZXRUcmFjZU5vdGlmaWNhdGlvbiA9IFNldFRyYWNlTm90aWZpY2F0aW9uID0ge30pKTtcbnZhciBMb2dUcmFjZU5vdGlmaWNhdGlvbjtcbihmdW5jdGlvbiAoTG9nVHJhY2VOb3RpZmljYXRpb24pIHtcbiAgICBMb2dUcmFjZU5vdGlmaWNhdGlvbi50eXBlID0gbmV3IG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZSgnJC9sb2dUcmFjZScpO1xufSkoTG9nVHJhY2VOb3RpZmljYXRpb24gfHwgKGV4cG9ydHMuTG9nVHJhY2VOb3RpZmljYXRpb24gPSBMb2dUcmFjZU5vdGlmaWNhdGlvbiA9IHt9KSk7XG52YXIgQ29ubmVjdGlvbkVycm9ycztcbihmdW5jdGlvbiAoQ29ubmVjdGlvbkVycm9ycykge1xuICAgIC8qKlxuICAgICAqIFRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZC5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uRXJyb3JzW0Nvbm5lY3Rpb25FcnJvcnNbXCJDbG9zZWRcIl0gPSAxXSA9IFwiQ2xvc2VkXCI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gZ290IGRpc3Bvc2VkLlxuICAgICAqL1xuICAgIENvbm5lY3Rpb25FcnJvcnNbQ29ubmVjdGlvbkVycm9yc1tcIkRpc3Bvc2VkXCJdID0gMl0gPSBcIkRpc3Bvc2VkXCI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBpbiBsaXN0ZW5pbmcgbW9kZS5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uRXJyb3JzW0Nvbm5lY3Rpb25FcnJvcnNbXCJBbHJlYWR5TGlzdGVuaW5nXCJdID0gM10gPSBcIkFscmVhZHlMaXN0ZW5pbmdcIjtcbn0pKENvbm5lY3Rpb25FcnJvcnMgfHwgKGV4cG9ydHMuQ29ubmVjdGlvbkVycm9ycyA9IENvbm5lY3Rpb25FcnJvcnMgPSB7fSkpO1xuY2xhc3MgQ29ubmVjdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNvZGUsIG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBDb25uZWN0aW9uRXJyb3IucHJvdG90eXBlKTtcbiAgICB9XG59XG5leHBvcnRzLkNvbm5lY3Rpb25FcnJvciA9IENvbm5lY3Rpb25FcnJvcjtcbnZhciBDb25uZWN0aW9uU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENvbm5lY3Rpb25TdHJhdGVneSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNhbmNlbFVuZGlzcGF0Y2hlZCk7XG4gICAgfVxuICAgIENvbm5lY3Rpb25TdHJhdGVneS5pcyA9IGlzO1xufSkoQ29ubmVjdGlvblN0cmF0ZWd5IHx8IChleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IENvbm5lY3Rpb25TdHJhdGVneSA9IHt9KSk7XG52YXIgSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5O1xuKGZ1bmN0aW9uIChJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiAoY2FuZGlkYXRlLmtpbmQgPT09IHVuZGVmaW5lZCB8fCBjYW5kaWRhdGUua2luZCA9PT0gJ2lkJykgJiYgSXMuZnVuYyhjYW5kaWRhdGUuY3JlYXRlQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UpICYmIChjYW5kaWRhdGUuZGlzcG9zZSA9PT0gdW5kZWZpbmVkIHx8IElzLmZ1bmMoY2FuZGlkYXRlLmRpc3Bvc2UpKTtcbiAgICB9XG4gICAgSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzID0gaXM7XG59KShJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgfHwgKGV4cG9ydHMuSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0ge30pKTtcbnZhciBSZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneTtcbihmdW5jdGlvbiAoUmVxdWVzdENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBjYW5kaWRhdGUua2luZCA9PT0gJ3JlcXVlc3QnICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKSAmJiAoY2FuZGlkYXRlLmRpc3Bvc2UgPT09IHVuZGVmaW5lZCB8fCBJcy5mdW5jKGNhbmRpZGF0ZS5kaXNwb3NlKSk7XG4gICAgfVxuICAgIFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzID0gaXM7XG59KShSZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSB8fCAoZXhwb3J0cy5SZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0ge30pKTtcbnZhciBDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5O1xuKGZ1bmN0aW9uIChDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5NZXNzYWdlID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKF8pIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgY2FuY2VsbGF0aW9uXzEuQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UoKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kuaXModmFsdWUpIHx8IFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKHZhbHVlKTtcbiAgICB9XG4gICAgQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5pcyA9IGlzO1xufSkoQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSB8fCAoZXhwb3J0cy5DYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IHt9KSk7XG52YXIgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENhbmNlbGxhdGlvblNlbmRlclN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kuTWVzc2FnZSA9IE9iamVjdC5mcmVlemUoe1xuICAgICAgICBzZW5kQ2FuY2VsbGF0aW9uKGNvbm4sIGlkKSB7XG4gICAgICAgICAgICByZXR1cm4gY29ubi5zZW5kTm90aWZpY2F0aW9uKENhbmNlbE5vdGlmaWNhdGlvbi50eXBlLCB7IGlkIH0pO1xuICAgICAgICB9LFxuICAgICAgICBjbGVhbnVwKF8pIHsgfVxuICAgIH0pO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLnNlbmRDYW5jZWxsYXRpb24pICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNsZWFudXApO1xuICAgIH1cbiAgICBDYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneS5pcyA9IGlzO1xufSkoQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgfHwgKGV4cG9ydHMuQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgPSBDYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneSA9IHt9KSk7XG52YXIgQ2FuY2VsbGF0aW9uU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENhbmNlbGxhdGlvblN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uU3RyYXRlZ3kuTWVzc2FnZSA9IE9iamVjdC5mcmVlemUoe1xuICAgICAgICByZWNlaXZlcjogQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5NZXNzYWdlLFxuICAgICAgICBzZW5kZXI6IENhbmNlbGxhdGlvblNlbmRlclN0cmF0ZWd5Lk1lc3NhZ2VcbiAgICB9KTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKGNhbmRpZGF0ZS5yZWNlaXZlcikgJiYgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kuaXMoY2FuZGlkYXRlLnNlbmRlcik7XG4gICAgfVxuICAgIENhbmNlbGxhdGlvblN0cmF0ZWd5LmlzID0gaXM7XG59KShDYW5jZWxsYXRpb25TdHJhdGVneSB8fCAoZXhwb3J0cy5DYW5jZWxsYXRpb25TdHJhdGVneSA9IENhbmNlbGxhdGlvblN0cmF0ZWd5ID0ge30pKTtcbnZhciBNZXNzYWdlU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKE1lc3NhZ2VTdHJhdGVneSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLmhhbmRsZU1lc3NhZ2UpO1xuICAgIH1cbiAgICBNZXNzYWdlU3RyYXRlZ3kuaXMgPSBpcztcbn0pKE1lc3NhZ2VTdHJhdGVneSB8fCAoZXhwb3J0cy5NZXNzYWdlU3RyYXRlZ3kgPSBNZXNzYWdlU3RyYXRlZ3kgPSB7fSkpO1xudmFyIENvbm5lY3Rpb25PcHRpb25zO1xuKGZ1bmN0aW9uIChDb25uZWN0aW9uT3B0aW9ucykge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIChDYW5jZWxsYXRpb25TdHJhdGVneS5pcyhjYW5kaWRhdGUuY2FuY2VsbGF0aW9uU3RyYXRlZ3kpIHx8IENvbm5lY3Rpb25TdHJhdGVneS5pcyhjYW5kaWRhdGUuY29ubmVjdGlvblN0cmF0ZWd5KSB8fCBNZXNzYWdlU3RyYXRlZ3kuaXMoY2FuZGlkYXRlLm1lc3NhZ2VTdHJhdGVneSkpO1xuICAgIH1cbiAgICBDb25uZWN0aW9uT3B0aW9ucy5pcyA9IGlzO1xufSkoQ29ubmVjdGlvbk9wdGlvbnMgfHwgKGV4cG9ydHMuQ29ubmVjdGlvbk9wdGlvbnMgPSBDb25uZWN0aW9uT3B0aW9ucyA9IHt9KSk7XG52YXIgQ29ubmVjdGlvblN0YXRlO1xuKGZ1bmN0aW9uIChDb25uZWN0aW9uU3RhdGUpIHtcbiAgICBDb25uZWN0aW9uU3RhdGVbQ29ubmVjdGlvblN0YXRlW1wiTmV3XCJdID0gMV0gPSBcIk5ld1wiO1xuICAgIENvbm5lY3Rpb25TdGF0ZVtDb25uZWN0aW9uU3RhdGVbXCJMaXN0ZW5pbmdcIl0gPSAyXSA9IFwiTGlzdGVuaW5nXCI7XG4gICAgQ29ubmVjdGlvblN0YXRlW0Nvbm5lY3Rpb25TdGF0ZVtcIkNsb3NlZFwiXSA9IDNdID0gXCJDbG9zZWRcIjtcbiAgICBDb25uZWN0aW9uU3RhdGVbQ29ubmVjdGlvblN0YXRlW1wiRGlzcG9zZWRcIl0gPSA0XSA9IFwiRGlzcG9zZWRcIjtcbn0pKENvbm5lY3Rpb25TdGF0ZSB8fCAoQ29ubmVjdGlvblN0YXRlID0ge30pKTtcbmZ1bmN0aW9uIGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uKG1lc3NhZ2VSZWFkZXIsIG1lc3NhZ2VXcml0ZXIsIF9sb2dnZXIsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBsb2dnZXIgPSBfbG9nZ2VyICE9PSB1bmRlZmluZWQgPyBfbG9nZ2VyIDogZXhwb3J0cy5OdWxsTG9nZ2VyO1xuICAgIGxldCBzZXF1ZW5jZU51bWJlciA9IDA7XG4gICAgbGV0IG5vdGlmaWNhdGlvblNlcXVlbmNlTnVtYmVyID0gMDtcbiAgICBsZXQgdW5rbm93blJlc3BvbnNlU2VxdWVuY2VOdW1iZXIgPSAwO1xuICAgIGNvbnN0IHZlcnNpb24gPSAnMi4wJztcbiAgICBsZXQgc3RhclJlcXVlc3RIYW5kbGVyID0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlcXVlc3RIYW5kbGVycyA9IG5ldyBNYXAoKTtcbiAgICBsZXQgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgY29uc3Qgbm90aWZpY2F0aW9uSGFuZGxlcnMgPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgcHJvZ3Jlc3NIYW5kbGVycyA9IG5ldyBNYXAoKTtcbiAgICBsZXQgdGltZXI7XG4gICAgbGV0IG1lc3NhZ2VRdWV1ZSA9IG5ldyBsaW5rZWRNYXBfMS5MaW5rZWRNYXAoKTtcbiAgICBsZXQgcmVzcG9uc2VQcm9taXNlcyA9IG5ldyBNYXAoKTtcbiAgICBsZXQga25vd25DYW5jZWxlZFJlcXVlc3RzID0gbmV3IFNldCgpO1xuICAgIGxldCByZXF1ZXN0VG9rZW5zID0gbmV3IE1hcCgpO1xuICAgIGxldCB0cmFjZSA9IFRyYWNlLk9mZjtcbiAgICBsZXQgdHJhY2VGb3JtYXQgPSBUcmFjZUZvcm1hdC5UZXh0O1xuICAgIGxldCB0cmFjZXI7XG4gICAgbGV0IHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLk5ldztcbiAgICBjb25zdCBlcnJvckVtaXR0ZXIgPSBuZXcgZXZlbnRzXzEuRW1pdHRlcigpO1xuICAgIGNvbnN0IGNsb3NlRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgdW5oYW5kbGVkTm90aWZpY2F0aW9uRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgdW5oYW5kbGVkUHJvZ3Jlc3NFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICBjb25zdCBkaXNwb3NlRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgY2FuY2VsbGF0aW9uU3RyYXRlZ3kgPSAob3B0aW9ucyAmJiBvcHRpb25zLmNhbmNlbGxhdGlvblN0cmF0ZWd5KSA/IG9wdGlvbnMuY2FuY2VsbGF0aW9uU3RyYXRlZ3kgOiBDYW5jZWxsYXRpb25TdHJhdGVneS5NZXNzYWdlO1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlcXVlc3RRdWV1ZUtleShpZCkge1xuICAgICAgICBpZiAoaWQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuJ3Qgc2VuZCByZXF1ZXN0cyB3aXRoIGlkIG51bGwgc2luY2UgdGhlIHJlc3BvbnNlIGNhbid0IGJlIGNvcnJlbGF0ZWQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdyZXEtJyArIGlkLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlc3BvbnNlUXVldWVLZXkoaWQpIHtcbiAgICAgICAgaWYgKGlkID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3Jlcy11bmtub3duLScgKyAoKyt1bmtub3duUmVzcG9uc2VTZXF1ZW5jZU51bWJlcikudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAncmVzLScgKyBpZC50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZU5vdGlmaWNhdGlvblF1ZXVlS2V5KCkge1xuICAgICAgICByZXR1cm4gJ25vdC0nICsgKCsrbm90aWZpY2F0aW9uU2VxdWVuY2VOdW1iZXIpLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFkZE1lc3NhZ2VUb1F1ZXVlKHF1ZXVlLCBtZXNzYWdlKSB7XG4gICAgICAgIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXF1ZXN0KG1lc3NhZ2UpKSB7XG4gICAgICAgICAgICBxdWV1ZS5zZXQoY3JlYXRlUmVxdWVzdFF1ZXVlS2V5KG1lc3NhZ2UuaWQpLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXNwb25zZShtZXNzYWdlKSkge1xuICAgICAgICAgICAgcXVldWUuc2V0KGNyZWF0ZVJlc3BvbnNlUXVldWVLZXkobWVzc2FnZS5pZCksIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcXVldWUuc2V0KGNyZWF0ZU5vdGlmaWNhdGlvblF1ZXVlS2V5KCksIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNhbmNlbFVuZGlzcGF0Y2hlZChfbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0xpc3RlbmluZygpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlID09PSBDb25uZWN0aW9uU3RhdGUuTGlzdGVuaW5nO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0Nsb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlID09PSBDb25uZWN0aW9uU3RhdGUuQ2xvc2VkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0Rpc3Bvc2VkKCkge1xuICAgICAgICByZXR1cm4gc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5EaXNwb3NlZDtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2xvc2VIYW5kbGVyKCkge1xuICAgICAgICBpZiAoc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5OZXcgfHwgc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5MaXN0ZW5pbmcpIHtcbiAgICAgICAgICAgIHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLkNsb3NlZDtcbiAgICAgICAgICAgIGNsb3NlRW1pdHRlci5maXJlKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlIGNvbm5lY3Rpb24gaXMgZGlzcG9zZWQgZG9uJ3Qgc2VudCBjbG9zZSBldmVudHMuXG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlYWRFcnJvckhhbmRsZXIoZXJyb3IpIHtcbiAgICAgICAgZXJyb3JFbWl0dGVyLmZpcmUoW2Vycm9yLCB1bmRlZmluZWQsIHVuZGVmaW5lZF0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiB3cml0ZUVycm9ySGFuZGxlcihkYXRhKSB7XG4gICAgICAgIGVycm9yRW1pdHRlci5maXJlKGRhdGEpO1xuICAgIH1cbiAgICBtZXNzYWdlUmVhZGVyLm9uQ2xvc2UoY2xvc2VIYW5kbGVyKTtcbiAgICBtZXNzYWdlUmVhZGVyLm9uRXJyb3IocmVhZEVycm9ySGFuZGxlcik7XG4gICAgbWVzc2FnZVdyaXRlci5vbkNsb3NlKGNsb3NlSGFuZGxlcik7XG4gICAgbWVzc2FnZVdyaXRlci5vbkVycm9yKHdyaXRlRXJyb3JIYW5kbGVyKTtcbiAgICBmdW5jdGlvbiB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCkge1xuICAgICAgICBpZiAodGltZXIgfHwgbWVzc2FnZVF1ZXVlLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aW1lciA9ICgwLCByYWxfMS5kZWZhdWx0KSgpLnRpbWVyLnNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICAgICAgICB0aW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHByb2Nlc3NNZXNzYWdlUXVldWUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGhhbmRsZU1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICBpZiAobWVzc2FnZXNfMS5NZXNzYWdlLmlzUmVxdWVzdChtZXNzYWdlKSkge1xuICAgICAgICAgICAgaGFuZGxlUmVxdWVzdChtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNOb3RpZmljYXRpb24obWVzc2FnZSkpIHtcbiAgICAgICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvbihtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXNwb25zZShtZXNzYWdlKSkge1xuICAgICAgICAgICAgaGFuZGxlUmVzcG9uc2UobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBoYW5kbGVJbnZhbGlkTWVzc2FnZShtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBwcm9jZXNzTWVzc2FnZVF1ZXVlKCkge1xuICAgICAgICBpZiAobWVzc2FnZVF1ZXVlLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXNzYWdlID0gbWVzc2FnZVF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlU3RyYXRlZ3kgPSBvcHRpb25zPy5tZXNzYWdlU3RyYXRlZ3k7XG4gICAgICAgICAgICBpZiAoTWVzc2FnZVN0cmF0ZWd5LmlzKG1lc3NhZ2VTdHJhdGVneSkpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlU3RyYXRlZ3kuaGFuZGxlTWVzc2FnZShtZXNzYWdlLCBoYW5kbGVNZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGhhbmRsZU1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgY2FsbGJhY2sgPSAobWVzc2FnZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2UgaGF2ZSByZWNlaXZlZCBhIGNhbmNlbGxhdGlvbiBtZXNzYWdlLiBDaGVjayBpZiB0aGUgbWVzc2FnZSBpcyBzdGlsbCBpbiB0aGUgcXVldWVcbiAgICAgICAgICAgIC8vIGFuZCBjYW5jZWwgaXQgaWYgYWxsb3dlZCB0byBkbyBzby5cbiAgICAgICAgICAgIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNOb3RpZmljYXRpb24obWVzc2FnZSkgJiYgbWVzc2FnZS5tZXRob2QgPT09IENhbmNlbE5vdGlmaWNhdGlvbi50eXBlLm1ldGhvZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbmNlbElkID0gbWVzc2FnZS5wYXJhbXMuaWQ7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gY3JlYXRlUmVxdWVzdFF1ZXVlS2V5KGNhbmNlbElkKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0b0NhbmNlbCA9IG1lc3NhZ2VRdWV1ZS5nZXQoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZXNfMS5NZXNzYWdlLmlzUmVxdWVzdCh0b0NhbmNlbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyYXRlZ3kgPSBvcHRpb25zPy5jb25uZWN0aW9uU3RyYXRlZ3k7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gKHN0cmF0ZWd5ICYmIHN0cmF0ZWd5LmNhbmNlbFVuZGlzcGF0Y2hlZCkgPyBzdHJhdGVneS5jYW5jZWxVbmRpc3BhdGNoZWQodG9DYW5jZWwsIGNhbmNlbFVuZGlzcGF0Y2hlZCkgOiBjYW5jZWxVbmRpc3BhdGNoZWQodG9DYW5jZWwpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgJiYgKHJlc3BvbnNlLmVycm9yICE9PSB1bmRlZmluZWQgfHwgcmVzcG9uc2UucmVzdWx0ICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUXVldWUuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLmRlbGV0ZShjYW5jZWxJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5pZCA9IHRvQ2FuY2VsLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VTZW5kaW5nUmVzcG9uc2UocmVzcG9uc2UsIG1lc3NhZ2UubWV0aG9kLCBEYXRlLm5vdygpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUocmVzcG9uc2UpLmNhdGNoKCgpID0+IGxvZ2dlci5lcnJvcihgU2VuZGluZyByZXNwb25zZSBmb3IgY2FuY2VsZWQgbWVzc2FnZSBmYWlsZWQuYCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGNhbmNlbGxhdGlvblRva2VuID0gcmVxdWVzdFRva2Vucy5nZXQoY2FuY2VsSWQpO1xuICAgICAgICAgICAgICAgIC8vIFRoZSByZXF1ZXN0IGlzIGFscmVhZHkgcnVubmluZy4gQ2FuY2VsIHRoZSB0b2tlblxuICAgICAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbmNlbGxhdGlvblRva2VuLmNhbmNlbCgpO1xuICAgICAgICAgICAgICAgICAgICB0cmFjZVJlY2VpdmVkTm90aWZpY2F0aW9uKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZW1lbWJlciB0aGUgY2FuY2VsIGJ1dCBzdGlsbCBxdWV1ZSB0aGUgbWVzc2FnZSB0b1xuICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbiB1cCBzdGF0ZSBpbiBwcm9jZXNzIG1lc3NhZ2UuXG4gICAgICAgICAgICAgICAgICAgIGtub3duQ2FuY2VsZWRSZXF1ZXN0cy5hZGQoY2FuY2VsSWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFkZE1lc3NhZ2VUb1F1ZXVlKG1lc3NhZ2VRdWV1ZSwgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGZ1bmN0aW9uIGhhbmRsZVJlcXVlc3QocmVxdWVzdE1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgLy8gd2UgcmV0dXJuIGhlcmUgc2lsZW50bHkgc2luY2Ugd2UgZmlyZWQgYW4gZXZlbnQgd2hlbiB0aGVcbiAgICAgICAgICAgIC8vIGNvbm5lY3Rpb24gZ290IGRpc3Bvc2VkLlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHJlcGx5KHJlc3VsdE9yRXJyb3IsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgaWQ6IHJlcXVlc3RNZXNzYWdlLmlkXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKHJlc3VsdE9yRXJyb3IgaW5zdGFuY2VvZiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlLmVycm9yID0gcmVzdWx0T3JFcnJvci50b0pzb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVzdWx0ID0gcmVzdWx0T3JFcnJvciA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHJlc3VsdE9yRXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cmFjZVNlbmRpbmdSZXNwb25zZShtZXNzYWdlLCBtZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICBtZXNzYWdlV3JpdGVyLndyaXRlKG1lc3NhZ2UpLmNhdGNoKCgpID0+IGxvZ2dlci5lcnJvcihgU2VuZGluZyByZXNwb25zZSBmYWlsZWQuYCkpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHJlcGx5RXJyb3IoZXJyb3IsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgaWQ6IHJlcXVlc3RNZXNzYWdlLmlkLFxuICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvci50b0pzb24oKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUobWVzc2FnZSkuY2F0Y2goKCkgPT4gbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlc3BvbnNlIGZhaWxlZC5gKSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gcmVwbHlTdWNjZXNzKHJlc3VsdCwgbWV0aG9kLCBzdGFydFRpbWUpIHtcbiAgICAgICAgICAgIC8vIFRoZSBKU09OIFJQQyBkZWZpbmVzIHRoYXQgYSByZXNwb25zZSBtdXN0IGVpdGhlciBoYXZlIGEgcmVzdWx0IG9yIGFuIGVycm9yXG4gICAgICAgICAgICAvLyBTbyB3ZSBjYW4ndCB0cmVhdCB1bmRlZmluZWQgYXMgYSB2YWxpZCByZXNwb25zZSByZXN1bHQuXG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgICAgICAgICAgICBqc29ucnBjOiB2ZXJzaW9uLFxuICAgICAgICAgICAgICAgIGlkOiByZXF1ZXN0TWVzc2FnZS5pZCxcbiAgICAgICAgICAgICAgICByZXN1bHQ6IHJlc3VsdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUobWVzc2FnZSkuY2F0Y2goKCkgPT4gbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlc3BvbnNlIGZhaWxlZC5gKSk7XG4gICAgICAgIH1cbiAgICAgICAgdHJhY2VSZWNlaXZlZFJlcXVlc3QocmVxdWVzdE1lc3NhZ2UpO1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gcmVxdWVzdEhhbmRsZXJzLmdldChyZXF1ZXN0TWVzc2FnZS5tZXRob2QpO1xuICAgICAgICBsZXQgdHlwZTtcbiAgICAgICAgbGV0IHJlcXVlc3RIYW5kbGVyO1xuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgdHlwZSA9IGVsZW1lbnQudHlwZTtcbiAgICAgICAgICAgIHJlcXVlc3RIYW5kbGVyID0gZWxlbWVudC5oYW5kbGVyO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIGlmIChyZXF1ZXN0SGFuZGxlciB8fCBzdGFyUmVxdWVzdEhhbmRsZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHRva2VuS2V5ID0gcmVxdWVzdE1lc3NhZ2UuaWQgPz8gU3RyaW5nKERhdGUubm93KCkpOyAvL1xuICAgICAgICAgICAgY29uc3QgY2FuY2VsbGF0aW9uU291cmNlID0gSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKGNhbmNlbGxhdGlvblN0cmF0ZWd5LnJlY2VpdmVyKVxuICAgICAgICAgICAgICAgID8gY2FuY2VsbGF0aW9uU3RyYXRlZ3kucmVjZWl2ZXIuY3JlYXRlQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UodG9rZW5LZXkpXG4gICAgICAgICAgICAgICAgOiBjYW5jZWxsYXRpb25TdHJhdGVneS5yZWNlaXZlci5jcmVhdGVDYW5jZWxsYXRpb25Ub2tlblNvdXJjZShyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICBpZiAocmVxdWVzdE1lc3NhZ2UuaWQgIT09IG51bGwgJiYga25vd25DYW5jZWxlZFJlcXVlc3RzLmhhcyhyZXF1ZXN0TWVzc2FnZS5pZCkpIHtcbiAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25Tb3VyY2UuY2FuY2VsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVxdWVzdE1lc3NhZ2UuaWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLnNldCh0b2tlbktleSwgY2FuY2VsbGF0aW9uU291cmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IGhhbmRsZXJSZXN1bHQ7XG4gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0TWVzc2FnZS5wYXJhbXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlLm51bWJlck9mUGFyYW1zICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1zLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyAke3R5cGUubnVtYmVyT2ZQYXJhbXN9IHBhcmFtcyBidXQgcmVjZWl2ZWQgbm9uZS5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJSZXN1bHQgPSByZXF1ZXN0SGFuZGxlcihjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVxdWVzdE1lc3NhZ2UucGFyYW1zKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlLnBhcmFtZXRlclN0cnVjdHVyZXMgPT09IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseUVycm9yKG5ldyBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IobWVzc2FnZXNfMS5FcnJvckNvZGVzLkludmFsaWRQYXJhbXMsIGBSZXF1ZXN0ICR7cmVxdWVzdE1lc3NhZ2UubWV0aG9kfSBkZWZpbmVzIHBhcmFtZXRlcnMgYnkgbmFtZSBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBwb3NpdGlvbmApLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlclJlc3VsdCA9IHJlcXVlc3RIYW5kbGVyKC4uLnJlcXVlc3RNZXNzYWdlLnBhcmFtcywgY2FuY2VsbGF0aW9uU291cmNlLnRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS5wYXJhbWV0ZXJTdHJ1Y3R1cmVzID09PSBtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW52YWxpZFBhcmFtcywgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGRlZmluZXMgcGFyYW1ldGVycyBieSBwb3NpdGlvbiBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBuYW1lYCksIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gcmVxdWVzdEhhbmRsZXIocmVxdWVzdE1lc3NhZ2UucGFyYW1zLCBjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0YXJSZXF1ZXN0SGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gc3RhclJlcXVlc3RIYW5kbGVyKHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgcmVxdWVzdE1lc3NhZ2UucGFyYW1zLCBjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBwcm9taXNlID0gaGFuZGxlclJlc3VsdDtcbiAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZXJSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFRva2Vucy5kZWxldGUodG9rZW5LZXkpO1xuICAgICAgICAgICAgICAgICAgICByZXBseVN1Y2Nlc3MoaGFuZGxlclJlc3VsdCwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwcm9taXNlLnRoZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS50aGVuKChyZXN1bHRPckVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLmRlbGV0ZSh0b2tlbktleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXBseShyZXN1bHRPckVycm9yLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IoZXJyb3IsIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVycm9yICYmIElzLnN0cmluZyhlcnJvci5tZXNzYWdlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGZhaWxlZCB3aXRoIG1lc3NhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZmFpbGVkIHVuZXhwZWN0ZWRseSB3aXRob3V0IHByb3ZpZGluZyBhbnkgZGV0YWlscy5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHkoaGFuZGxlclJlc3VsdCwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHkoZXJyb3IsIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZXJyb3IgJiYgSXMuc3RyaW5nKGVycm9yLm1lc3NhZ2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGZhaWxlZCB3aXRoIG1lc3NhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZmFpbGVkIHVuZXhwZWN0ZWRseSB3aXRob3V0IHByb3ZpZGluZyBhbnkgZGV0YWlscy5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuTWV0aG9kTm90Rm91bmQsIGBVbmhhbmRsZWQgbWV0aG9kICR7cmVxdWVzdE1lc3NhZ2UubWV0aG9kfWApLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlUmVzcG9uc2UocmVzcG9uc2VNZXNzYWdlKSB7XG4gICAgICAgIGlmIChpc0Rpc3Bvc2VkKCkpIHtcbiAgICAgICAgICAgIC8vIFNlZSBoYW5kbGUgcmVxdWVzdC5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzcG9uc2VNZXNzYWdlLmlkID09PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VNZXNzYWdlLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBSZWNlaXZlZCByZXNwb25zZSBtZXNzYWdlIHdpdGhvdXQgaWQ6IEVycm9yIGlzOiBcXG4ke0pTT04uc3RyaW5naWZ5KHJlc3BvbnNlTWVzc2FnZS5lcnJvciwgdW5kZWZpbmVkLCA0KX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgUmVjZWl2ZWQgcmVzcG9uc2UgbWVzc2FnZSB3aXRob3V0IGlkLiBObyBmdXJ0aGVyIGVycm9yIGluZm9ybWF0aW9uIHByb3ZpZGVkLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gcmVzcG9uc2VNZXNzYWdlLmlkO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VQcm9taXNlID0gcmVzcG9uc2VQcm9taXNlcy5nZXQoa2V5KTtcbiAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWRSZXNwb25zZShyZXNwb25zZU1lc3NhZ2UsIHJlc3BvbnNlUHJvbWlzZSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VQcm9taXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2VzLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZU1lc3NhZ2UuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gcmVzcG9uc2VNZXNzYWdlLmVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlLnJlamVjdChuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKGVycm9yLmNvZGUsIGVycm9yLm1lc3NhZ2UsIGVycm9yLmRhdGEpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXNwb25zZU1lc3NhZ2UucmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlTWVzc2FnZS5yZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgbmV2ZXIgaGFwcGVuLicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IubWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBSZXNwb25zZSBoYW5kbGVyICcke3Jlc3BvbnNlUHJvbWlzZS5tZXRob2R9JyBmYWlsZWQgd2l0aCBtZXNzYWdlOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYFJlc3BvbnNlIGhhbmRsZXIgJyR7cmVzcG9uc2VQcm9taXNlLm1ldGhvZH0nIGZhaWxlZCB1bmV4cGVjdGVkbHkuYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlTm90aWZpY2F0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgLy8gU2VlIGhhbmRsZSByZXF1ZXN0LlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0eXBlID0gdW5kZWZpbmVkO1xuICAgICAgICBsZXQgbm90aWZpY2F0aW9uSGFuZGxlcjtcbiAgICAgICAgaWYgKG1lc3NhZ2UubWV0aG9kID09PSBDYW5jZWxOb3RpZmljYXRpb24udHlwZS5tZXRob2QpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhbmNlbElkID0gbWVzc2FnZS5wYXJhbXMuaWQ7XG4gICAgICAgICAgICBrbm93bkNhbmNlbGVkUmVxdWVzdHMuZGVsZXRlKGNhbmNlbElkKTtcbiAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWROb3RpZmljYXRpb24obWVzc2FnZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gbm90aWZpY2F0aW9uSGFuZGxlcnMuZ2V0KG1lc3NhZ2UubWV0aG9kKTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uSGFuZGxlciA9IGVsZW1lbnQuaGFuZGxlcjtcbiAgICAgICAgICAgICAgICB0eXBlID0gZWxlbWVudC50eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChub3RpZmljYXRpb25IYW5kbGVyIHx8IHN0YXJOb3RpZmljYXRpb25IYW5kbGVyKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWROb3RpZmljYXRpb24obWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgaWYgKG5vdGlmaWNhdGlvbkhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UucGFyYW1zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5udW1iZXJPZlBhcmFtcyAhPT0gMCAmJiB0eXBlLnBhcmFtZXRlclN0cnVjdHVyZXMgIT09IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBOb3RpZmljYXRpb24gJHttZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyAke3R5cGUubnVtYmVyT2ZQYXJhbXN9IHBhcmFtcyBidXQgcmVjZWl2ZWQgbm9uZS5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShtZXNzYWdlLnBhcmFtcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGFyZSBKU09OLVJQQyBsaWJyYXJpZXMgdGhhdCBzZW5kIHByb2dyZXNzIG1lc3NhZ2UgYXMgcG9zaXRpb25hbCBwYXJhbXMgYWx0aG91Z2hcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpZmllZCBhcyBuYW1lZC4gU28gY29udmVydCB0aGVtIGlmIHRoaXMgaXMgdGhlIGNhc2UuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBtZXNzYWdlLnBhcmFtcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLm1ldGhvZCA9PT0gUHJvZ3Jlc3NOb3RpZmljYXRpb24udHlwZS5tZXRob2QgJiYgcGFyYW1zLmxlbmd0aCA9PT0gMiAmJiBQcm9ncmVzc1Rva2VuLmlzKHBhcmFtc1swXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKHsgdG9rZW46IHBhcmFtc1swXSwgdmFsdWU6IHBhcmFtc1sxXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUucGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBOb3RpZmljYXRpb24gJHttZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyBwYXJhbWV0ZXJzIGJ5IG5hbWUgYnV0IHJlY2VpdmVkIHBhcmFtZXRlcnMgYnkgcG9zaXRpb25gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5udW1iZXJPZlBhcmFtcyAhPT0gbWVzc2FnZS5wYXJhbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYE5vdGlmaWNhdGlvbiAke21lc3NhZ2UubWV0aG9kfSBkZWZpbmVzICR7dHlwZS5udW1iZXJPZlBhcmFtc30gcGFyYW1zIGJ1dCByZWNlaXZlZCAke3BhcmFtcy5sZW5ndGh9IGFyZ3VtZW50c2ApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXIoLi4ucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS5wYXJhbWV0ZXJTdHJ1Y3R1cmVzID09PSBtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgTm90aWZpY2F0aW9uICR7bWVzc2FnZS5tZXRob2R9IGRlZmluZXMgcGFyYW1ldGVycyBieSBwb3NpdGlvbiBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBuYW1lYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKG1lc3NhZ2UucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGFyTm90aWZpY2F0aW9uSGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICBzdGFyTm90aWZpY2F0aW9uSGFuZGxlcihtZXNzYWdlLm1ldGhvZCwgbWVzc2FnZS5wYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvci5tZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgTm90aWZpY2F0aW9uIGhhbmRsZXIgJyR7bWVzc2FnZS5tZXRob2R9JyBmYWlsZWQgd2l0aCBtZXNzYWdlOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYE5vdGlmaWNhdGlvbiBoYW5kbGVyICcke21lc3NhZ2UubWV0aG9kfScgZmFpbGVkIHVuZXhwZWN0ZWRseS5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1bmhhbmRsZWROb3RpZmljYXRpb25FbWl0dGVyLmZpcmUobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlSW52YWxpZE1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignUmVjZWl2ZWQgZW1wdHkgbWVzc2FnZS4nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsb2dnZXIuZXJyb3IoYFJlY2VpdmVkIG1lc3NhZ2Ugd2hpY2ggaXMgbmVpdGhlciBhIHJlc3BvbnNlIG5vciBhIG5vdGlmaWNhdGlvbiBtZXNzYWdlOlxcbiR7SlNPTi5zdHJpbmdpZnkobWVzc2FnZSwgbnVsbCwgNCl9YCk7XG4gICAgICAgIC8vIFRlc3Qgd2hldGhlciB3ZSBmaW5kIGFuIGlkIHRvIHJlamVjdCB0aGUgcHJvbWlzZVxuICAgICAgICBjb25zdCByZXNwb25zZU1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICBpZiAoSXMuc3RyaW5nKHJlc3BvbnNlTWVzc2FnZS5pZCkgfHwgSXMubnVtYmVyKHJlc3BvbnNlTWVzc2FnZS5pZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHJlc3BvbnNlTWVzc2FnZS5pZDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxlciA9IHJlc3BvbnNlUHJvbWlzZXMuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VIYW5kbGVyLnJlamVjdChuZXcgRXJyb3IoJ1RoZSByZWNlaXZlZCByZXNwb25zZSBoYXMgbmVpdGhlciBhIHJlc3VsdCBub3IgYW4gZXJyb3IgcHJvcGVydHkuJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0cmluZ2lmeVRyYWNlKHBhcmFtcykge1xuICAgICAgICBpZiAocGFyYW1zID09PSB1bmRlZmluZWQgfHwgcGFyYW1zID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAodHJhY2UpIHtcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuVmVyYm9zZTpcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGFyYW1zLCBudWxsLCA0KTtcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuQ29tcGFjdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGFyYW1zKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVNlbmRpbmdSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFjZUZvcm1hdCA9PT0gVHJhY2VGb3JtYXQuVGV4dCkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSAmJiBtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBgUGFyYW1zOiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucGFyYW1zKX1cXG5cXG5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJhY2VyLmxvZyhgU2VuZGluZyByZXF1ZXN0ICcke21lc3NhZ2UubWV0aG9kfSAtICgke21lc3NhZ2UuaWR9KScuYCwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb2dMU1BNZXNzYWdlKCdzZW5kLXJlcXVlc3QnLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVNlbmRpbmdOb3RpZmljYXRpb24obWVzc2FnZSkge1xuICAgICAgICBpZiAodHJhY2UgPT09IFRyYWNlLk9mZiB8fCAhdHJhY2VyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYWNlRm9ybWF0ID09PSBUcmFjZUZvcm1hdC5UZXh0KSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdCkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0gYFBhcmFtczogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLnBhcmFtcyl9XFxuXFxuYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSAnTm8gcGFyYW1ldGVycyBwcm92aWRlZC5cXG5cXG4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFNlbmRpbmcgbm90aWZpY2F0aW9uICcke21lc3NhZ2UubWV0aG9kfScuYCwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb2dMU1BNZXNzYWdlKCdzZW5kLW5vdGlmaWNhdGlvbicsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhY2VGb3JtYXQgPT09IFRyYWNlRm9ybWF0LlRleHQpIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZXJyb3IgJiYgbWVzc2FnZS5lcnJvci5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgRXJyb3IgZGF0YTogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLmVycm9yLmRhdGEpfVxcblxcbmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgUmVzdWx0OiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucmVzdWx0KX1cXG5cXG5gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UuZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9ICdObyByZXN1bHQgcmV0dXJuZWQuXFxuXFxuJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFNlbmRpbmcgcmVzcG9uc2UgJyR7bWV0aG9kfSAtICgke21lc3NhZ2UuaWR9KScuIFByb2Nlc3NpbmcgcmVxdWVzdCB0b29rICR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1tc2AsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgnc2VuZC1yZXNwb25zZScsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYWNlUmVjZWl2ZWRSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFjZUZvcm1hdCA9PT0gVHJhY2VGb3JtYXQuVGV4dCkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSAmJiBtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBgUGFyYW1zOiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucGFyYW1zKX1cXG5cXG5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJhY2VyLmxvZyhgUmVjZWl2ZWQgcmVxdWVzdCAnJHttZXNzYWdlLm1ldGhvZH0gLSAoJHttZXNzYWdlLmlkfSknLmAsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1yZXF1ZXN0JywgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdHJhY2VSZWNlaXZlZE5vdGlmaWNhdGlvbihtZXNzYWdlKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIgfHwgbWVzc2FnZS5tZXRob2QgPT09IExvZ1RyYWNlTm90aWZpY2F0aW9uLnR5cGUubWV0aG9kKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYWNlRm9ybWF0ID09PSBUcmFjZUZvcm1hdC5UZXh0KSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdCkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0gYFBhcmFtczogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLnBhcmFtcyl9XFxuXFxuYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSAnTm8gcGFyYW1ldGVycyBwcm92aWRlZC5cXG5cXG4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFJlY2VpdmVkIG5vdGlmaWNhdGlvbiAnJHttZXNzYWdlLm1ldGhvZH0nLmAsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1ub3RpZmljYXRpb24nLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVJlY2VpdmVkUmVzcG9uc2UobWVzc2FnZSwgcmVzcG9uc2VQcm9taXNlKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhY2VGb3JtYXQgPT09IFRyYWNlRm9ybWF0LlRleHQpIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZXJyb3IgJiYgbWVzc2FnZS5lcnJvci5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgRXJyb3IgZGF0YTogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLmVycm9yLmRhdGEpfVxcblxcbmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgUmVzdWx0OiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucmVzdWx0KX1cXG5cXG5gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UuZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9ICdObyByZXN1bHQgcmV0dXJuZWQuXFxuXFxuJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXNwb25zZVByb21pc2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IG1lc3NhZ2UuZXJyb3IgPyBgIFJlcXVlc3QgZmFpbGVkOiAke21lc3NhZ2UuZXJyb3IubWVzc2FnZX0gKCR7bWVzc2FnZS5lcnJvci5jb2RlfSkuYCA6ICcnO1xuICAgICAgICAgICAgICAgIHRyYWNlci5sb2coYFJlY2VpdmVkIHJlc3BvbnNlICcke3Jlc3BvbnNlUHJvbWlzZS5tZXRob2R9IC0gKCR7bWVzc2FnZS5pZH0pJyBpbiAke0RhdGUubm93KCkgLSByZXNwb25zZVByb21pc2UudGltZXJTdGFydH1tcy4ke2Vycm9yfWAsIGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJhY2VyLmxvZyhgUmVjZWl2ZWQgcmVzcG9uc2UgJHttZXNzYWdlLmlkfSB3aXRob3V0IGFjdGl2ZSByZXNwb25zZSBwcm9taXNlLmAsIGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1yZXNwb25zZScsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGxvZ0xTUE1lc3NhZ2UodHlwZSwgbWVzc2FnZSkge1xuICAgICAgICBpZiAoIXRyYWNlciB8fCB0cmFjZSA9PT0gVHJhY2UuT2ZmKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbHNwTWVzc2FnZSA9IHtcbiAgICAgICAgICAgIGlzTFNQTWVzc2FnZTogdHJ1ZSxcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpXG4gICAgICAgIH07XG4gICAgICAgIHRyYWNlci5sb2cobHNwTWVzc2FnZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRocm93SWZDbG9zZWRPckRpc3Bvc2VkKCkge1xuICAgICAgICBpZiAoaXNDbG9zZWQoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IENvbm5lY3Rpb25FcnJvcihDb25uZWN0aW9uRXJyb3JzLkNsb3NlZCwgJ0Nvbm5lY3Rpb24gaXMgY2xvc2VkLicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0Rpc3Bvc2VkKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb25uZWN0aW9uRXJyb3IoQ29ubmVjdGlvbkVycm9ycy5EaXNwb3NlZCwgJ0Nvbm5lY3Rpb24gaXMgZGlzcG9zZWQuJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdGhyb3dJZkxpc3RlbmluZygpIHtcbiAgICAgICAgaWYgKGlzTGlzdGVuaW5nKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb25uZWN0aW9uRXJyb3IoQ29ubmVjdGlvbkVycm9ycy5BbHJlYWR5TGlzdGVuaW5nLCAnQ29ubmVjdGlvbiBpcyBhbHJlYWR5IGxpc3RlbmluZycpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRocm93SWZOb3RMaXN0ZW5pbmcoKSB7XG4gICAgICAgIGlmICghaXNMaXN0ZW5pbmcoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYWxsIGxpc3RlbigpIGZpcnN0LicpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVuZGVmaW5lZFRvTnVsbChwYXJhbSkge1xuICAgICAgICBpZiAocGFyYW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyYW07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gbnVsbFRvVW5kZWZpbmVkKHBhcmFtKSB7XG4gICAgICAgIGlmIChwYXJhbSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJhbTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBpc05hbWVkUGFyYW0ocGFyYW0pIHtcbiAgICAgICAgcmV0dXJuIHBhcmFtICE9PSB1bmRlZmluZWQgJiYgcGFyYW0gIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkocGFyYW0pICYmIHR5cGVvZiBwYXJhbSA9PT0gJ29iamVjdCc7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXB1dGVTaW5nbGVQYXJhbShwYXJhbWV0ZXJTdHJ1Y3R1cmVzLCBwYXJhbSkge1xuICAgICAgICBzd2l0Y2ggKHBhcmFtZXRlclN0cnVjdHVyZXMpIHtcbiAgICAgICAgICAgIGNhc2UgbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG86XG4gICAgICAgICAgICAgICAgaWYgKGlzTmFtZWRQYXJhbShwYXJhbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxUb1VuZGVmaW5lZChwYXJhbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3VuZGVmaW5lZFRvTnVsbChwYXJhbSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZTpcbiAgICAgICAgICAgICAgICBpZiAoIWlzTmFtZWRQYXJhbShwYXJhbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWNlaXZlZCBwYXJhbWV0ZXJzIGJ5IG5hbWUgYnV0IHBhcmFtIGlzIG5vdCBhbiBvYmplY3QgbGl0ZXJhbC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGxUb1VuZGVmaW5lZChwYXJhbSk7XG4gICAgICAgICAgICBjYXNlIG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieVBvc2l0aW9uOlxuICAgICAgICAgICAgICAgIHJldHVybiBbdW5kZWZpbmVkVG9OdWxsKHBhcmFtKV07XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBwYXJhbWV0ZXIgc3RydWN0dXJlICR7cGFyYW1ldGVyU3RydWN0dXJlcy50b1N0cmluZygpfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXB1dGVNZXNzYWdlUGFyYW1zKHR5cGUsIHBhcmFtcykge1xuICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICBjb25zdCBudW1iZXJPZlBhcmFtcyA9IHR5cGUubnVtYmVyT2ZQYXJhbXM7XG4gICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gY29tcHV0ZVNpbmdsZVBhcmFtKHR5cGUucGFyYW1ldGVyU3RydWN0dXJlcywgcGFyYW1zWzBdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoICYmIGkgPCBudW1iZXJPZlBhcmFtczsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHVuZGVmaW5lZFRvTnVsbChwYXJhbXNbaV0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPCBudW1iZXJPZlBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gcGFyYW1zLmxlbmd0aDsgaSA8IG51bWJlck9mUGFyYW1zOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB7XG4gICAgICAgIHNlbmROb3RpZmljYXRpb246ICh0eXBlLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlUGFyYW1zO1xuICAgICAgICAgICAgaWYgKElzLnN0cmluZyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICAgIGxldCBwYXJhbVN0YXJ0ID0gMDtcbiAgICAgICAgICAgICAgICBsZXQgcGFyYW1ldGVyU3RydWN0dXJlcyA9IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvO1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuaXMoZmlyc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtU3RhcnQgPSAxO1xuICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gZmlyc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBwYXJhbUVuZCA9IGFyZ3MubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gcGFyYW1FbmQgLSBwYXJhbVN0YXJ0O1xuICAgICAgICAgICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zID0gY29tcHV0ZVNpbmdsZVBhcmFtKHBhcmFtZXRlclN0cnVjdHVyZXMsIGFyZ3NbcGFyYW1TdGFydF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjZWl2ZWQgJHtudW1iZXJPZlBhcmFtc30gcGFyYW1ldGVycyBmb3IgJ2J5IE5hbWUnIG5vdGlmaWNhdGlvbiBwYXJhbWV0ZXIgc3RydWN0dXJlLmApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IGFyZ3Muc2xpY2UocGFyYW1TdGFydCwgcGFyYW1FbmQpLm1hcCh2YWx1ZSA9PiB1bmRlZmluZWRUb051bGwodmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IGFyZ3M7XG4gICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZS5tZXRob2Q7XG4gICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IGNvbXB1dGVNZXNzYWdlUGFyYW1zKHR5cGUsIHBhcmFtcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBub3RpZmljYXRpb25NZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBtZXNzYWdlUGFyYW1zXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdHJhY2VTZW5kaW5nTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbk1lc3NhZ2UpO1xuICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2VXcml0ZXIud3JpdGUobm90aWZpY2F0aW9uTWVzc2FnZSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBTZW5kaW5nIG5vdGlmaWNhdGlvbiBmYWlsZWQuYCk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25Ob3RpZmljYXRpb246ICh0eXBlLCBoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGlmIChJcy5mdW5jKHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB0eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaGFuZGxlcikge1xuICAgICAgICAgICAgICAgIGlmIChJcy5zdHJpbmcodHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZTtcbiAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uSGFuZGxlcnMuc2V0KHR5cGUsIHsgdHlwZTogdW5kZWZpbmVkLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZS5tZXRob2Q7XG4gICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXJzLnNldCh0eXBlLm1ldGhvZCwgeyB0eXBlLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXJzLmRlbGV0ZShtZXRob2QpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBvblByb2dyZXNzOiAoX3R5cGUsIHRva2VuLCBoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgICBpZiAocHJvZ3Jlc3NIYW5kbGVycy5oYXModG9rZW4pKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm9ncmVzcyBoYW5kbGVyIGZvciB0b2tlbiAke3Rva2VufSBhbHJlYWR5IHJlZ2lzdGVyZWRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByb2dyZXNzSGFuZGxlcnMuc2V0KHRva2VuLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc0hhbmRsZXJzLmRlbGV0ZSh0b2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgc2VuZFByb2dyZXNzOiAoX3R5cGUsIHRva2VuLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGF3YWl0IGJ1dCBzaW1wbGUgcmV0dXJuIHRvIGVuc3VyZSB0aGF0IHdlIGRvbid0IGhhdmUgYW5vdGhlclxuICAgICAgICAgICAgLy8gYXN5bmMgc2NoZWR1bGluZy4gT3RoZXJ3aXNlIG9uZSBzZW5kIGNvdWxkIG92ZXJ0YWtlIGFub3RoZXIgc2VuZC5cbiAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLnNlbmROb3RpZmljYXRpb24oUHJvZ3Jlc3NOb3RpZmljYXRpb24udHlwZSwgeyB0b2tlbiwgdmFsdWUgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uVW5oYW5kbGVkUHJvZ3Jlc3M6IHVuaGFuZGxlZFByb2dyZXNzRW1pdHRlci5ldmVudCxcbiAgICAgICAgc2VuZFJlcXVlc3Q6ICh0eXBlLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgdGhyb3dJZk5vdExpc3RlbmluZygpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlUGFyYW1zO1xuICAgICAgICAgICAgbGV0IHRva2VuID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKElzLnN0cmluZyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3QgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgbGV0IHBhcmFtU3RhcnQgPSAwO1xuICAgICAgICAgICAgICAgIGxldCBwYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG87XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5pcyhmaXJzdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1TdGFydCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlclN0cnVjdHVyZXMgPSBmaXJzdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHBhcmFtRW5kID0gYXJncy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuLmlzKGxhc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtRW5kID0gcGFyYW1FbmQgLSAxO1xuICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IGxhc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gcGFyYW1FbmQgLSBwYXJhbVN0YXJ0O1xuICAgICAgICAgICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zID0gY29tcHV0ZVNpbmdsZVBhcmFtKHBhcmFtZXRlclN0cnVjdHVyZXMsIGFyZ3NbcGFyYW1TdGFydF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjZWl2ZWQgJHtudW1iZXJPZlBhcmFtc30gcGFyYW1ldGVycyBmb3IgJ2J5IE5hbWUnIHJlcXVlc3QgcGFyYW1ldGVyIHN0cnVjdHVyZS5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMgPSBhcmdzLnNsaWNlKHBhcmFtU3RhcnQsIHBhcmFtRW5kKS5tYXAodmFsdWUgPT4gdW5kZWZpbmVkVG9OdWxsKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBhcmdzO1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGUubWV0aG9kO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMgPSBjb21wdXRlTWVzc2FnZVBhcmFtcyh0eXBlLCBwYXJhbXMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gdHlwZS5udW1iZXJPZlBhcmFtcztcbiAgICAgICAgICAgICAgICB0b2tlbiA9IGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuLmlzKHBhcmFtc1tudW1iZXJPZlBhcmFtc10pID8gcGFyYW1zW251bWJlck9mUGFyYW1zXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGlkID0gc2VxdWVuY2VOdW1iZXIrKztcbiAgICAgICAgICAgIGxldCBkaXNwb3NhYmxlO1xuICAgICAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgICAgICAgZGlzcG9zYWJsZSA9IHRva2VuLm9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcCA9IGNhbmNlbGxhdGlvblN0cmF0ZWd5LnNlbmRlci5zZW5kQ2FuY2VsbGF0aW9uKGNvbm5lY3Rpb24sIGlkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhgUmVjZWl2ZWQgbm8gcHJvbWlzZSBmcm9tIGNhbmNlbGxhdGlvbiBzdHJhdGVneSB3aGVuIGNhbmNlbGxpbmcgaWQgJHtpZH1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIubG9nKGBTZW5kaW5nIGNhbmNlbGxhdGlvbiBtZXNzYWdlcyBmb3IgaWQgJHtpZH0gZmFpbGVkYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdE1lc3NhZ2UgPSB7XG4gICAgICAgICAgICAgICAganNvbnJwYzogdmVyc2lvbixcbiAgICAgICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBtZXNzYWdlUGFyYW1zXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdHJhY2VTZW5kaW5nUmVxdWVzdChyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNhbmNlbGxhdGlvblN0cmF0ZWd5LnNlbmRlci5lbmFibGVDYW5jZWxsYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25TdHJhdGVneS5zZW5kZXIuZW5hYmxlQ2FuY2VsbGF0aW9uKHJlcXVlc3RNZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZVdpdGhDbGVhbnVwID0gKHIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyKTtcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uU3RyYXRlZ3kuc2VuZGVyLmNsZWFudXAoaWQpO1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlPy5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWplY3RXaXRoQ2xlYW51cCA9IChyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChyKTtcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uU3RyYXRlZ3kuc2VuZGVyLmNsZWFudXAoaWQpO1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlPy5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZVByb21pc2UgPSB7IG1ldGhvZDogbWV0aG9kLCB0aW1lclN0YXJ0OiBEYXRlLm5vdygpLCByZXNvbHZlOiByZXNvbHZlV2l0aENsZWFudXAsIHJlamVjdDogcmVqZWN0V2l0aENsZWFudXAgfTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2VzLnNldChpZCwgcmVzcG9uc2VQcm9taXNlKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbWVzc2FnZVdyaXRlci53cml0ZShyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAvLyBXcml0aW5nIHRoZSBtZXNzYWdlIGZhaWxlZC4gU28gd2UgbmVlZCB0byBkZWxldGUgaXQgZnJvbSB0aGUgcmVzcG9uc2UgcHJvbWlzZXMgYW5kXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlamVjdCBpdC5cbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlcy5kZWxldGUoaWQpO1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2UucmVqZWN0KG5ldyBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IobWVzc2FnZXNfMS5FcnJvckNvZGVzLk1lc3NhZ2VXcml0ZUVycm9yLCBlcnJvci5tZXNzYWdlID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIHJlYXNvbicpKTtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlcXVlc3QgZmFpbGVkLmApO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25SZXF1ZXN0OiAodHlwZSwgaGFuZGxlcikgPT4ge1xuICAgICAgICAgICAgdGhyb3dJZkNsb3NlZE9yRGlzcG9zZWQoKTtcbiAgICAgICAgICAgIGxldCBtZXRob2QgPSBudWxsO1xuICAgICAgICAgICAgaWYgKFN0YXJSZXF1ZXN0SGFuZGxlci5pcyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBzdGFyUmVxdWVzdEhhbmRsZXIgPSB0eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoSXMuc3RyaW5nKHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgbWV0aG9kID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoaGFuZGxlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RIYW5kbGVycy5zZXQodHlwZSwgeyBoYW5kbGVyOiBoYW5kbGVyLCB0eXBlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSB0eXBlLm1ldGhvZDtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEhhbmRsZXJzLnNldCh0eXBlLm1ldGhvZCwgeyB0eXBlLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SGFuZGxlcnMuZGVsZXRlKG1ldGhvZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFyUmVxdWVzdEhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBoYXNQZW5kaW5nUmVzcG9uc2U6ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZVByb21pc2VzLnNpemUgPiAwO1xuICAgICAgICB9LFxuICAgICAgICB0cmFjZTogYXN5bmMgKF92YWx1ZSwgX3RyYWNlciwgc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBsZXQgX3NlbmROb3RpZmljYXRpb24gPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBfdHJhY2VGb3JtYXQgPSBUcmFjZUZvcm1hdC5UZXh0O1xuICAgICAgICAgICAgaWYgKHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKElzLmJvb2xlYW4oc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zKSkge1xuICAgICAgICAgICAgICAgICAgICBfc2VuZE5vdGlmaWNhdGlvbiA9IHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF9zZW5kTm90aWZpY2F0aW9uID0gc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zLnNlbmROb3RpZmljYXRpb24gfHwgZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIF90cmFjZUZvcm1hdCA9IHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucy50cmFjZUZvcm1hdCB8fCBUcmFjZUZvcm1hdC5UZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlID0gX3ZhbHVlO1xuICAgICAgICAgICAgdHJhY2VGb3JtYXQgPSBfdHJhY2VGb3JtYXQ7XG4gICAgICAgICAgICBpZiAodHJhY2UgPT09IFRyYWNlLk9mZikge1xuICAgICAgICAgICAgICAgIHRyYWNlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRyYWNlciA9IF90cmFjZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoX3NlbmROb3RpZmljYXRpb24gJiYgIWlzQ2xvc2VkKCkgJiYgIWlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGNvbm5lY3Rpb24uc2VuZE5vdGlmaWNhdGlvbihTZXRUcmFjZU5vdGlmaWNhdGlvbi50eXBlLCB7IHZhbHVlOiBUcmFjZS50b1N0cmluZyhfdmFsdWUpIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBvbkVycm9yOiBlcnJvckVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIG9uQ2xvc2U6IGNsb3NlRW1pdHRlci5ldmVudCxcbiAgICAgICAgb25VbmhhbmRsZWROb3RpZmljYXRpb246IHVuaGFuZGxlZE5vdGlmaWNhdGlvbkVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIG9uRGlzcG9zZTogZGlzcG9zZUVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIGVuZDogKCkgPT4ge1xuICAgICAgICAgICAgbWVzc2FnZVdyaXRlci5lbmQoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLkRpc3Bvc2VkO1xuICAgICAgICAgICAgZGlzcG9zZUVtaXR0ZXIuZmlyZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5QZW5kaW5nUmVzcG9uc2VSZWplY3RlZCwgJ1BlbmRpbmcgcmVzcG9uc2UgcmVqZWN0ZWQgc2luY2UgY29ubmVjdGlvbiBnb3QgZGlzcG9zZWQnKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvbWlzZSBvZiByZXNwb25zZVByb21pc2VzLnZhbHVlcygpKSB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBrbm93bkNhbmNlbGVkUmVxdWVzdHMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICBtZXNzYWdlUXVldWUgPSBuZXcgbGlua2VkTWFwXzEuTGlua2VkTWFwKCk7XG4gICAgICAgICAgICAvLyBUZXN0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgaWYgKElzLmZ1bmMobWVzc2FnZVdyaXRlci5kaXNwb3NlKSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKElzLmZ1bmMobWVzc2FnZVJlYWRlci5kaXNwb3NlKSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VSZWFkZXIuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBsaXN0ZW46ICgpID0+IHtcbiAgICAgICAgICAgIHRocm93SWZDbG9zZWRPckRpc3Bvc2VkKCk7XG4gICAgICAgICAgICB0aHJvd0lmTGlzdGVuaW5nKCk7XG4gICAgICAgICAgICBzdGF0ZSA9IENvbm5lY3Rpb25TdGF0ZS5MaXN0ZW5pbmc7XG4gICAgICAgICAgICBtZXNzYWdlUmVhZGVyLmxpc3RlbihjYWxsYmFjayk7XG4gICAgICAgIH0sXG4gICAgICAgIGluc3BlY3Q6ICgpID0+IHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS5jb25zb2xlLmxvZygnaW5zcGVjdCcpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25uZWN0aW9uLm9uTm90aWZpY2F0aW9uKExvZ1RyYWNlTm90aWZpY2F0aW9uLnR5cGUsIChwYXJhbXMpID0+IHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZlcmJvc2UgPSB0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdDtcbiAgICAgICAgdHJhY2VyLmxvZyhwYXJhbXMubWVzc2FnZSwgdmVyYm9zZSA/IHBhcmFtcy52ZXJib3NlIDogdW5kZWZpbmVkKTtcbiAgICB9KTtcbiAgICBjb25uZWN0aW9uLm9uTm90aWZpY2F0aW9uKFByb2dyZXNzTm90aWZpY2F0aW9uLnR5cGUsIChwYXJhbXMpID0+IHtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IHByb2dyZXNzSGFuZGxlcnMuZ2V0KHBhcmFtcy50b2tlbik7XG4gICAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICAgICBoYW5kbGVyKHBhcmFtcy52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1bmhhbmRsZWRQcm9ncmVzc0VtaXR0ZXIuZmlyZShwYXJhbXMpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbm5lY3Rpb247XG59XG5leHBvcnRzLmNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uID0gY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb247XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vdHlwaW5ncy90aGVuYWJsZS5kLnRzXCIgLz5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUHJvZ3Jlc3NUeXBlID0gZXhwb3J0cy5Qcm9ncmVzc1Rva2VuID0gZXhwb3J0cy5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiA9IGV4cG9ydHMuTnVsbExvZ2dlciA9IGV4cG9ydHMuQ29ubmVjdGlvbk9wdGlvbnMgPSBleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IGV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlQnVmZmVyID0gZXhwb3J0cy5Xcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyID0gZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLk1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLlJlYWRhYmxlU3RyZWFtTWVzc2FnZVJlYWRlciA9IGV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlUmVhZGVyID0gZXhwb3J0cy5NZXNzYWdlUmVhZGVyID0gZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblRva2VuID0gZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IGV4cG9ydHMuRW1pdHRlciA9IGV4cG9ydHMuRXZlbnQgPSBleHBvcnRzLkRpc3Bvc2FibGUgPSBleHBvcnRzLkxSVUNhY2hlID0gZXhwb3J0cy5Ub3VjaCA9IGV4cG9ydHMuTGlua2VkTWFwID0gZXhwb3J0cy5QYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlOSA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTggPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU3ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNiA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTUgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU0ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMyA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTIgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUxID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMCA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZSA9IGV4cG9ydHMuRXJyb3JDb2RlcyA9IGV4cG9ydHMuUmVzcG9uc2VFcnJvciA9IGV4cG9ydHMuUmVxdWVzdFR5cGU5ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTggPSBleHBvcnRzLlJlcXVlc3RUeXBlNyA9IGV4cG9ydHMuUmVxdWVzdFR5cGU2ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTUgPSBleHBvcnRzLlJlcXVlc3RUeXBlNCA9IGV4cG9ydHMuUmVxdWVzdFR5cGUzID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTIgPSBleHBvcnRzLlJlcXVlc3RUeXBlMSA9IGV4cG9ydHMuUmVxdWVzdFR5cGUwID0gZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IGV4cG9ydHMuTWVzc2FnZSA9IGV4cG9ydHMuUkFMID0gdm9pZCAwO1xuZXhwb3J0cy5NZXNzYWdlU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblN0cmF0ZWd5ID0gZXhwb3J0cy5DYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IGV4cG9ydHMuQ29ubmVjdGlvbkVycm9yID0gZXhwb3J0cy5Db25uZWN0aW9uRXJyb3JzID0gZXhwb3J0cy5Mb2dUcmFjZU5vdGlmaWNhdGlvbiA9IGV4cG9ydHMuU2V0VHJhY2VOb3RpZmljYXRpb24gPSBleHBvcnRzLlRyYWNlRm9ybWF0ID0gZXhwb3J0cy5UcmFjZVZhbHVlcyA9IGV4cG9ydHMuVHJhY2UgPSB2b2lkIDA7XG5jb25zdCBtZXNzYWdlc18xID0gcmVxdWlyZShcIi4vbWVzc2FnZXNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNZXNzYWdlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk1lc3NhZ2U7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlMFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTA7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTFcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGUxOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGUyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlMjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlM1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGU0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGU1XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlNTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlNlwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTY7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTdcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGU3OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGU4XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlODsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlOVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTk7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXNwb25zZUVycm9yXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3I7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJFcnJvckNvZGVzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLkVycm9yQ29kZXM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlMFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlMDsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGUxXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGUxOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZTJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlM1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlMzsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGU0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZTVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlNlwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlNjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGU3XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU3OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZThcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTg7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlOVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlOTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlBhcmFtZXRlclN0cnVjdHVyZXNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlczsgfSB9KTtcbmNvbnN0IGxpbmtlZE1hcF8xID0gcmVxdWlyZShcIi4vbGlua2VkTWFwXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTGlua2VkTWFwXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBsaW5rZWRNYXBfMS5MaW5rZWRNYXA7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJMUlVDYWNoZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbGlua2VkTWFwXzEuTFJVQ2FjaGU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJUb3VjaFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbGlua2VkTWFwXzEuVG91Y2g7IH0gfSk7XG5jb25zdCBkaXNwb3NhYmxlXzEgPSByZXF1aXJlKFwiLi9kaXNwb3NhYmxlXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiRGlzcG9zYWJsZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZGlzcG9zYWJsZV8xLkRpc3Bvc2FibGU7IH0gfSk7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCIuL2V2ZW50c1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkV2ZW50XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBldmVudHNfMS5FdmVudDsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkVtaXR0ZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGV2ZW50c18xLkVtaXR0ZXI7IH0gfSk7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblRva2VuU291cmNlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjYW5jZWxsYXRpb25fMS5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblRva2VuXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjYW5jZWxsYXRpb25fMS5DYW5jZWxsYXRpb25Ub2tlbjsgfSB9KTtcbmNvbnN0IHNoYXJlZEFycmF5Q2FuY2VsbGF0aW9uXzEgPSByZXF1aXJlKFwiLi9zaGFyZWRBcnJheUNhbmNlbGxhdGlvblwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHNoYXJlZEFycmF5Q2FuY2VsbGF0aW9uXzEuU2hhcmVkQXJyYXlTZW5kZXJTdHJhdGVneTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlNoYXJlZEFycmF5UmVjZWl2ZXJTdHJhdGVneVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gc2hhcmVkQXJyYXlDYW5jZWxsYXRpb25fMS5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3k7IH0gfSk7XG5jb25zdCBtZXNzYWdlUmVhZGVyXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlUmVhZGVyXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTWVzc2FnZVJlYWRlclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZVJlYWRlcl8xLk1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VSZWFkZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VSZWFkZXJfMS5BYnN0cmFjdE1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VSZWFkZXJfMS5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5jb25zdCBtZXNzYWdlV3JpdGVyXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlV3JpdGVyXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTWVzc2FnZVdyaXRlclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZVdyaXRlcl8xLk1lc3NhZ2VXcml0ZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VXcml0ZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VXcml0ZXJfMS5BYnN0cmFjdE1lc3NhZ2VXcml0ZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJXcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlV3JpdGVyXzEuV3JpdGVhYmxlU3RyZWFtTWVzc2FnZVdyaXRlcjsgfSB9KTtcbmNvbnN0IG1lc3NhZ2VCdWZmZXJfMSA9IHJlcXVpcmUoXCIuL21lc3NhZ2VCdWZmZXJcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VCdWZmZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VCdWZmZXJfMS5BYnN0cmFjdE1lc3NhZ2VCdWZmZXI7IH0gfSk7XG5jb25zdCBjb25uZWN0aW9uXzEgPSByZXF1aXJlKFwiLi9jb25uZWN0aW9uXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29ubmVjdGlvblN0cmF0ZWd5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ29ubmVjdGlvblN0cmF0ZWd5OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29ubmVjdGlvbk9wdGlvbnNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5Db25uZWN0aW9uT3B0aW9uczsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk51bGxMb2dnZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5OdWxsTG9nZ2VyOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb25cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlByb2dyZXNzVG9rZW5cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5Qcm9ncmVzc1Rva2VuOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUHJvZ3Jlc3NUeXBlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuUHJvZ3Jlc3NUeXBlOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiVHJhY2VcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5UcmFjZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlRyYWNlVmFsdWVzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuVHJhY2VWYWx1ZXM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJUcmFjZUZvcm1hdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29ubmVjdGlvbl8xLlRyYWNlRm9ybWF0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiU2V0VHJhY2VOb3RpZmljYXRpb25cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5TZXRUcmFjZU5vdGlmaWNhdGlvbjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkxvZ1RyYWNlTm90aWZpY2F0aW9uXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuTG9nVHJhY2VOb3RpZmljYXRpb247IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJDb25uZWN0aW9uRXJyb3JzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ29ubmVjdGlvbkVycm9yczsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNvbm5lY3Rpb25FcnJvclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29ubmVjdGlvbl8xLkNvbm5lY3Rpb25FcnJvcjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5DYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5DYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblN0cmF0ZWd5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ2FuY2VsbGF0aW9uU3RyYXRlZ3k7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNZXNzYWdlU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5NZXNzYWdlU3RyYXRlZ3k7IH0gfSk7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbmV4cG9ydHMuUkFMID0gcmFsXzEuZGVmYXVsdDtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGFwaV8xID0gcmVxdWlyZShcIi4uL2NvbW1vbi9hcGlcIik7XG5jbGFzcyBNZXNzYWdlQnVmZmVyIGV4dGVuZHMgYXBpXzEuQWJzdHJhY3RNZXNzYWdlQnVmZmVyIHtcbiAgICBjb25zdHJ1Y3RvcihlbmNvZGluZyA9ICd1dGYtOCcpIHtcbiAgICAgICAgc3VwZXIoZW5jb2RpbmcpO1xuICAgICAgICB0aGlzLmFzY2lpRGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcignYXNjaWknKTtcbiAgICB9XG4gICAgZW1wdHlCdWZmZXIoKSB7XG4gICAgICAgIHJldHVybiBNZXNzYWdlQnVmZmVyLmVtcHR5QnVmZmVyO1xuICAgIH1cbiAgICBmcm9tU3RyaW5nKHZhbHVlLCBfZW5jb2RpbmcpIHtcbiAgICAgICAgcmV0dXJuIChuZXcgVGV4dEVuY29kZXIoKSkuZW5jb2RlKHZhbHVlKTtcbiAgICB9XG4gICAgdG9TdHJpbmcodmFsdWUsIGVuY29kaW5nKSB7XG4gICAgICAgIGlmIChlbmNvZGluZyA9PT0gJ2FzY2lpJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXNjaWlEZWNvZGVyLmRlY29kZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gKG5ldyBUZXh0RGVjb2RlcihlbmNvZGluZykpLmRlY29kZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXNOYXRpdmUoYnVmZmVyLCBsZW5ndGgpIHtcbiAgICAgICAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlci5zbGljZSgwLCBsZW5ndGgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFsbG9jTmF0aXZlKGxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTtcbiAgICB9XG59XG5NZXNzYWdlQnVmZmVyLmVtcHR5QnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMCk7XG5jbGFzcyBSZWFkYWJsZVN0cmVhbVdyYXBwZXIge1xuICAgIGNvbnN0cnVjdG9yKHNvY2tldCkge1xuICAgICAgICB0aGlzLnNvY2tldCA9IHNvY2tldDtcbiAgICAgICAgdGhpcy5fb25EYXRhID0gbmV3IGFwaV8xLkVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5fbWVzc2FnZUxpc3RlbmVyID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBibG9iID0gZXZlbnQuZGF0YTtcbiAgICAgICAgICAgIGJsb2IuYXJyYXlCdWZmZXIoKS50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkRhdGEuZmlyZShuZXcgVWludDhBcnJheShidWZmZXIpKTtcbiAgICAgICAgICAgIH0sICgpID0+IHtcbiAgICAgICAgICAgICAgICAoMCwgYXBpXzEuUkFMKSgpLmNvbnNvbGUuZXJyb3IoYENvbnZlcnRpbmcgYmxvYiB0byBhcnJheSBidWZmZXIgZmFpbGVkLmApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLl9tZXNzYWdlTGlzdGVuZXIpO1xuICAgIH1cbiAgICBvbkNsb3NlKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2Nsb3NlJywgbGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gYXBpXzEuRGlzcG9zYWJsZS5jcmVhdGUoKCkgPT4gdGhpcy5zb2NrZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xvc2UnLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkVycm9yKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgbGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gYXBpXzEuRGlzcG9zYWJsZS5jcmVhdGUoKCkgPT4gdGhpcy5zb2NrZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkVuZChsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKCdlbmQnLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdlbmQnLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkRhdGEobGlzdGVuZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uRGF0YS5ldmVudChsaXN0ZW5lcik7XG4gICAgfVxufVxuY2xhc3MgV3JpdGFibGVTdHJlYW1XcmFwcGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihzb2NrZXQpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7XG4gICAgfVxuICAgIG9uQ2xvc2UobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignY2xvc2UnLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbG9zZScsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIG9uRXJyb3IobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIG9uRW5kKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2VuZCcsIGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIGFwaV8xLkRpc3Bvc2FibGUuY3JlYXRlKCgpID0+IHRoaXMuc29ja2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2VuZCcsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIHdyaXRlKGRhdGEsIGVuY29kaW5nKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkICYmIGVuY29kaW5nICE9PSAndXRmLTgnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbiBhIEJyb3dzZXIgZW52aXJvbm1lbnRzIG9ubHkgdXRmLTggdGV4dCBlbmNvZGluZyBpcyBzdXBwb3J0ZWQuIEJ1dCBnb3QgZW5jb2Rpbmc6ICR7ZW5jb2Rpbmd9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKTtcbiAgICB9XG59XG5jb25zdCBfdGV4dEVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbmNvbnN0IF9yaWwgPSBPYmplY3QuZnJlZXplKHtcbiAgICBtZXNzYWdlQnVmZmVyOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgY3JlYXRlOiAoZW5jb2RpbmcpID0+IG5ldyBNZXNzYWdlQnVmZmVyKGVuY29kaW5nKVxuICAgIH0pLFxuICAgIGFwcGxpY2F0aW9uSnNvbjogT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGVuY29kZXI6IE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgbmFtZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgZW5jb2RlOiAobXNnLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2hhcnNldCAhPT0gJ3V0Zi04Jykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluIGEgQnJvd3NlciBlbnZpcm9ubWVudHMgb25seSB1dGYtOCB0ZXh0IGVuY29kaW5nIGlzIHN1cHBvcnRlZC4gQnV0IGdvdCBlbmNvZGluZzogJHtvcHRpb25zLmNoYXJzZXR9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoX3RleHRFbmNvZGVyLmVuY29kZShKU09OLnN0cmluZ2lmeShtc2csIHVuZGVmaW5lZCwgMCkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIGRlY29kZXI6IE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgbmFtZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgZGVjb2RlOiAoYnVmZmVyLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCEoYnVmZmVyIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbiBhIEJyb3dzZXIgZW52aXJvbm1lbnRzIG9ubHkgVWludDhBcnJheXMgYXJlIHN1cHBvcnRlZC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShKU09OLnBhcnNlKG5ldyBUZXh0RGVjb2RlcihvcHRpb25zLmNoYXJzZXQpLmRlY29kZShidWZmZXIpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfSksXG4gICAgc3RyZWFtOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgYXNSZWFkYWJsZVN0cmVhbTogKHNvY2tldCkgPT4gbmV3IFJlYWRhYmxlU3RyZWFtV3JhcHBlcihzb2NrZXQpLFxuICAgICAgICBhc1dyaXRhYmxlU3RyZWFtOiAoc29ja2V0KSA9PiBuZXcgV3JpdGFibGVTdHJlYW1XcmFwcGVyKHNvY2tldClcbiAgICB9KSxcbiAgICBjb25zb2xlOiBjb25zb2xlLFxuICAgIHRpbWVyOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgc2V0VGltZW91dChjYWxsYmFjaywgbXMsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHNldFRpbWVvdXQoY2FsbGJhY2ssIG1zLCAuLi5hcmdzKTtcbiAgICAgICAgICAgIHJldHVybiB7IGRpc3Bvc2U6ICgpID0+IGNsZWFyVGltZW91dChoYW5kbGUpIH07XG4gICAgICAgIH0sXG4gICAgICAgIHNldEltbWVkaWF0ZShjYWxsYmFjaywgLi4uYXJncykge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gc2V0VGltZW91dChjYWxsYmFjaywgMCwgLi4uYXJncyk7XG4gICAgICAgICAgICByZXR1cm4geyBkaXNwb3NlOiAoKSA9PiBjbGVhclRpbWVvdXQoaGFuZGxlKSB9O1xuICAgICAgICB9LFxuICAgICAgICBzZXRJbnRlcnZhbChjYWxsYmFjaywgbXMsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHNldEludGVydmFsKGNhbGxiYWNrLCBtcywgLi4uYXJncyk7XG4gICAgICAgICAgICByZXR1cm4geyBkaXNwb3NlOiAoKSA9PiBjbGVhckludGVydmFsKGhhbmRsZSkgfTtcbiAgICAgICAgfSxcbiAgICB9KVxufSk7XG5mdW5jdGlvbiBSSUwoKSB7XG4gICAgcmV0dXJuIF9yaWw7XG59XG4oZnVuY3Rpb24gKFJJTCkge1xuICAgIGZ1bmN0aW9uIGluc3RhbGwoKSB7XG4gICAgICAgIGFwaV8xLlJBTC5pbnN0YWxsKF9yaWwpO1xuICAgIH1cbiAgICBSSUwuaW5zdGFsbCA9IGluc3RhbGw7XG59KShSSUwgfHwgKFJJTCA9IHt9KSk7XG5leHBvcnRzLmRlZmF1bHQgPSBSSUw7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24gPSBleHBvcnRzLkJyb3dzZXJNZXNzYWdlV3JpdGVyID0gZXhwb3J0cy5Ccm93c2VyTWVzc2FnZVJlYWRlciA9IHZvaWQgMDtcbmNvbnN0IHJpbF8xID0gcmVxdWlyZShcIi4vcmlsXCIpO1xuLy8gSW5zdGFsbCB0aGUgYnJvd3NlciBydW50aW1lIGFic3RyYWN0LlxucmlsXzEuZGVmYXVsdC5pbnN0YWxsKCk7XG5jb25zdCBhcGlfMSA9IHJlcXVpcmUoXCIuLi9jb21tb24vYXBpXCIpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuLi9jb21tb24vYXBpXCIpLCBleHBvcnRzKTtcbmNsYXNzIEJyb3dzZXJNZXNzYWdlUmVhZGVyIGV4dGVuZHMgYXBpXzEuQWJzdHJhY3RNZXNzYWdlUmVhZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihwb3J0KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX29uRGF0YSA9IG5ldyBhcGlfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuX21lc3NhZ2VMaXN0ZW5lciA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fb25EYXRhLmZpcmUoZXZlbnQuZGF0YSk7XG4gICAgICAgIH07XG4gICAgICAgIHBvcnQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoZXZlbnQpID0+IHRoaXMuZmlyZUVycm9yKGV2ZW50KSk7XG4gICAgICAgIHBvcnQub25tZXNzYWdlID0gdGhpcy5fbWVzc2FnZUxpc3RlbmVyO1xuICAgIH1cbiAgICBsaXN0ZW4oY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uRGF0YS5ldmVudChjYWxsYmFjayk7XG4gICAgfVxufVxuZXhwb3J0cy5Ccm93c2VyTWVzc2FnZVJlYWRlciA9IEJyb3dzZXJNZXNzYWdlUmVhZGVyO1xuY2xhc3MgQnJvd3Nlck1lc3NhZ2VXcml0ZXIgZXh0ZW5kcyBhcGlfMS5BYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKHBvcnQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50ID0gMDtcbiAgICAgICAgcG9ydC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIChldmVudCkgPT4gdGhpcy5maXJlRXJyb3IoZXZlbnQpKTtcbiAgICB9XG4gICAgd3JpdGUobXNnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnBvcnQucG9zdE1lc3NhZ2UobXNnKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IsIG1zZyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZUVycm9yKGVycm9yLCBtc2cpIHtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50Kys7XG4gICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yLCBtc2csIHRoaXMuZXJyb3JDb3VudCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICB9XG59XG5leHBvcnRzLkJyb3dzZXJNZXNzYWdlV3JpdGVyID0gQnJvd3Nlck1lc3NhZ2VXcml0ZXI7XG5mdW5jdGlvbiBjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbihyZWFkZXIsIHdyaXRlciwgbG9nZ2VyLCBvcHRpb25zKSB7XG4gICAgaWYgKGxvZ2dlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxvZ2dlciA9IGFwaV8xLk51bGxMb2dnZXI7XG4gICAgfVxuICAgIGlmIChhcGlfMS5Db25uZWN0aW9uU3RyYXRlZ3kuaXMob3B0aW9ucykpIHtcbiAgICAgICAgb3B0aW9ucyA9IHsgY29ubmVjdGlvblN0cmF0ZWd5OiBvcHRpb25zIH07XG4gICAgfVxuICAgIHJldHVybiAoMCwgYXBpXzEuY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24pKHJlYWRlciwgd3JpdGVyLCBsb2dnZXIsIG9wdGlvbnMpO1xufVxuZXhwb3J0cy5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiA9IGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uO1xuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL2Jyb3dzZXIvbWFpbicpOyIsICIvKlxuICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMjYgRWNsaXBzZSBEaXJpZ2libGUgY29udHJpYnV0b3JzXG4gKlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlXG4gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2Mi4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG4gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MjAuaHRtbFxuICpcbiAqIFNQRFgtRmlsZUNvcHlyaWdodFRleHQ6IEVjbGlwc2UgRGlyaWdpYmxlIGNvbnRyaWJ1dG9ycyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbi8qKlxuICogSmF2YSBMU1AgY2xpZW50IGJ1bmRsZS5cbiAqXG4gKiBVc2VzIHZzY29kZS13cy1qc29ucnBjIGZvciB0eXBlZCBKU09OLVJQQyBvdmVyIFdlYlNvY2tldCBhbmQgcmVnaXN0ZXJzIE1vbmFjb1xuICogcHJvdmlkZXJzIHRoYXQgZGVsZWdhdGUgdG8gSkRULkxTLiBFeHBvc2VkIGFzIGdsb2JhbCBKYXZhTHNwQ2xpZW50TGliIHNvIHRoYXRcbiAqIGVkaXRvci5qcyBjYW4gY2FsbCBKYXZhTHNwQ2xpZW50TGliLmNvbm5lY3QocmVzb3VyY2VQYXRoKS5cbiAqXG4gKiBPbmUgSkRULkxTIHByb2Nlc3MgY292ZXJzIHRoZSBlbnRpcmUgd29ya3NwYWNlLCBzbyBhIHNpbmdsZSBXZWJTb2NrZXQgY29ubmVjdGlvblxuICogaXMgc2hhcmVkIGFjcm9zcyBhbGwgSmF2YSBmaWxlcyBvcGVuIGluIHRoZSBzYW1lIGJyb3dzZXIgcGFnZS4gVGhlIGNvbm5lY3Rpb24gaXNcbiAqIGVzdGFibGlzaGVkIG9uIHRoZSBmaXJzdCBjb25uZWN0KCkgY2FsbCBhbmQgcmV1c2VkIGZvciBhbGwgc3Vic2VxdWVudCBjYWxscy5cbiAqXG4gKiBlZGl0b3IuanMgc2V0cyB3aW5kb3cubW9uYWNvIGJlZm9yZSBjYWxsaW5nIGNvbm5lY3QoKSwgc28gdGhlIG1vbmFjby1zaGltJ3MgbGF6eVxuICogUHJveGllcyByZXNvbHZlIGNvcnJlY3RseSBhdCBjYWxsIHRpbWUuXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24sIE1lc3NhZ2VDb25uZWN0aW9uIH0gZnJvbSAndnNjb2RlLWpzb25ycGMvYnJvd3Nlcic7XG5pbXBvcnQgeyB0b1NvY2tldCwgV2ViU29ja2V0TWVzc2FnZVJlYWRlciwgV2ViU29ja2V0TWVzc2FnZVdyaXRlciB9IGZyb20gJ3ZzY29kZS13cy1qc29ucnBjJztcbmltcG9ydCAqIGFzIG1vbmFjbyBmcm9tICdtb25hY28tZWRpdG9yJztcbmltcG9ydCB7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLFxuICAgIERpYWdub3N0aWNTZXZlcml0eSxcbiAgICBJbnNlcnRUZXh0Rm9ybWF0LFxuICAgIE1hcmt1cENvbnRlbnQsXG4gICAgTWFya3VwS2luZCxcbiAgICB0eXBlIENvZGVBY3Rpb24sXG4gICAgdHlwZSBDb21tYW5kLFxuICAgIHR5cGUgQ29tcGxldGlvbkl0ZW0sXG4gICAgdHlwZSBDb21wbGV0aW9uTGlzdCxcbiAgICB0eXBlIERpYWdub3N0aWMsXG4gICAgdHlwZSBIb3ZlcixcbiAgICB0eXBlIExvY2F0aW9uLFxuICAgIHR5cGUgUGFyYW1ldGVySW5mb3JtYXRpb24sXG4gICAgdHlwZSBTaWduYXR1cmVIZWxwLFxuICAgIHR5cGUgU2lnbmF0dXJlSW5mb3JtYXRpb24sXG4gICAgdHlwZSBUZXh0RWRpdCxcbiAgICB0eXBlIFdvcmtzcGFjZUVkaXQsXG59IGZyb20gJ3ZzY29kZS1sYW5ndWFnZXNlcnZlci10eXBlcyc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNpbmdsZXRvbiBzdGF0ZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogU2hhcmVkIGNvbm5lY3Rpb24gXHUyMDE0IG9uZSBwZXIgYnJvd3NlciBwYWdlLCBjb3ZlcmluZyBhbGwgcHJvamVjdHMgaW4gdGhlIHdvcmtzcGFjZS4gKi9cbmxldCBfY29ubjogTWVzc2FnZUNvbm5lY3Rpb24gfCBudWxsID0gbnVsbDtcblxuLyoqXG4gKiBWaXJ0dWFsIHdvcmtzcGFjZSByb290IFVSSSwgZS5nLiB7QGNvZGUgZmlsZTovLy93b3Jrc3BhY2Uvd29ya3NwYWNlL30uXG4gKiBTZXQgb25jZSBvbiBmaXJzdCBjb25uZWN0KCk7IHVzZWQgdG8gc2NvcGUgTW9uYWNvIHByb3ZpZGVycyB0byB3b3Jrc3BhY2UgZmlsZXMuXG4gKi9cbmxldCBfd29ya3NwYWNlUm9vdCA9ICcnO1xuXG4vKiogVVJJcyBmb3Igd2hpY2ggdGV4dERvY3VtZW50L2RpZE9wZW4gaGFzIGFscmVhZHkgYmVlbiBzZW50LiAqL1xuY29uc3QgX29wZW5GaWxlczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cbmxldCBfcHJvdmlkZXJzUmVnaXN0ZXJlZCA9IGZhbHNlO1xuXG4vKiogU2VtYW50aWMtdG9rZW4gbGVnZW5kIHJlcG9ydGVkIGJ5IEpEVC5MUyBpbiB0aGUgaW5pdGlhbGl6ZSByZXN1bHQ7IG5lZWRlZCB0byBkZWNvZGUgdG9rZW4gZGF0YS4gKi9cbmxldCBfc2VtYW50aWNUb2tlbnNMZWdlbmQ6IHsgdG9rZW5UeXBlczogc3RyaW5nW107IHRva2VuTW9kaWZpZXJzOiBzdHJpbmdbXSB9IHwgbnVsbCA9IG51bGw7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFB1YmxpYyBBUElcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIENhbGxlZCBieSBlZGl0b3IuanMgd2hlbiBhIEphdmEgZmlsZSBpcyBvcGVuZWQuIFNhZmUgdG8gY2FsbCBtdWx0aXBsZSB0aW1lcy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb25uZWN0KHJlc291cmNlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFydHMgPSByZXNvdXJjZVBhdGgucmVwbGFjZSgvXlxcLy8sICcnKS5zcGxpdCgnLycpO1xuICAgIGNvbnN0IHdvcmtzcGFjZSA9IHBhcnRzWzBdO1xuICAgIGNvbnN0IHByb2plY3QgICA9IHBhcnRzWzFdO1xuICAgIGNvbnN0IGZpbGVVcmkgPSBgZmlsZTovLy93b3Jrc3BhY2UvJHt3b3Jrc3BhY2V9LyR7cHJvamVjdH0vJHtwYXJ0cy5zbGljZSgyKS5qb2luKCcvJyl9YDtcblxuICAgIGlmIChfY29ubikge1xuICAgICAgICAvLyBDb25uZWN0aW9uIGFscmVhZHkgZXN0YWJsaXNoZWQgXHUyMDE0IGp1c3Qgb3BlbiB0aGUgbmV3IGZpbGUuXG4gICAgICAgIG9wZW5GaWxlKGZpbGVVcmkpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgX3dvcmtzcGFjZVJvb3QgPSBgZmlsZTovLy93b3Jrc3BhY2UvJHt3b3Jrc3BhY2V9L2A7XG5cbiAgICBjb25zdCBwcm90byA9IGxvY2F0aW9uLnByb3RvY29sID09PSAnaHR0cHM6JyA/ICd3c3MnIDogJ3dzJztcbiAgICBjb25zdCB3c1VybCA9IGAke3Byb3RvfTovLyR7bG9jYXRpb24uaG9zdH0vd2Vic29ja2V0cy9pZGUvamF2YS1sc3BgXG4gICAgICAgICAgICAgICAgKyBgP3dvcmtzcGFjZT0ke2VuY29kZVVSSUNvbXBvbmVudCh3b3Jrc3BhY2UpfWA7XG5cbiAgICBjb25zdCB3cyA9IG5ldyBXZWJTb2NrZXQod3NVcmwpO1xuICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgd3Mub25vcGVuICA9ICgpID0+IHJlc29sdmUoKTtcbiAgICAgICAgd3Mub25lcnJvciA9ICgpID0+IHJlamVjdChuZXcgRXJyb3IoYFtqYXZhLWxzcF0gV2ViU29ja2V0IGNvbm5lY3QgZmFpbGVkOiAke3dzVXJsfWApKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHNvY2tldCA9IHRvU29ja2V0KHdzKTtcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgV2ViU29ja2V0TWVzc2FnZVJlYWRlcihzb2NrZXQpO1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBXZWJTb2NrZXRNZXNzYWdlV3JpdGVyKHNvY2tldCk7XG4gICAgX2Nvbm4gPSBjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbihyZWFkZXIsIHdyaXRlcik7XG5cbiAgICAvLyBEaWFnbm9zdGljcyBub3RpZmljYXRpb24gXHUyMTkyIE1vbmFjbyBtYXJrZXJzIChhcHBsaWVzIHRvIGFueSB3b3Jrc3BhY2UgZmlsZSlcbiAgICBfY29ubi5vbk5vdGlmaWNhdGlvbigndGV4dERvY3VtZW50L3B1Ymxpc2hEaWFnbm9zdGljcycsIChwYXJhbXM6IHsgdXJpOiBzdHJpbmc7IGRpYWdub3N0aWNzOiBEaWFnbm9zdGljW10gfSkgPT4ge1xuICAgICAgICBjb25zdCBtb2RlbCA9IG1vbmFjby5lZGl0b3IuZ2V0TW9kZWxzKCkuZmluZChtID0+IG0udXJpLnRvU3RyaW5nKCkgPT09IHBhcmFtcy51cmkpO1xuICAgICAgICBpZiAoIW1vZGVsKSByZXR1cm47XG4gICAgICAgIG1vbmFjby5lZGl0b3Iuc2V0TW9kZWxNYXJrZXJzKG1vZGVsLCAnamF2YS1sc3AnLCBwYXJhbXMuZGlhZ25vc3RpY3MubWFwKGQgPT4gKHtcbiAgICAgICAgICAgIHNldmVyaXR5OiAgICAgICAgbHNwU2V2ZXJpdHkoZC5zZXZlcml0eSksXG4gICAgICAgICAgICBtZXNzYWdlOiAgICAgICAgIGQubWVzc2FnZSxcbiAgICAgICAgICAgIHNvdXJjZTogICAgICAgICAgZC5zb3VyY2UgPz8gJ2phdmEnLFxuICAgICAgICAgICAgc3RhcnRMaW5lTnVtYmVyOiBkLnJhbmdlLnN0YXJ0LmxpbmUgKyAxLFxuICAgICAgICAgICAgc3RhcnRDb2x1bW46ICAgICBkLnJhbmdlLnN0YXJ0LmNoYXJhY3RlciArIDEsXG4gICAgICAgICAgICBlbmRMaW5lTnVtYmVyOiAgIGQucmFuZ2UuZW5kLmxpbmUgKyAxLFxuICAgICAgICAgICAgZW5kQ29sdW1uOiAgICAgICBkLnJhbmdlLmVuZC5jaGFyYWN0ZXIgKyAxLFxuICAgICAgICB9KSkpO1xuICAgIH0pO1xuXG4gICAgLy8gU2VydmVyIC0+IGNsaWVudCByZXF1ZXN0cyB0aGF0IGRyaXZlIHJlZmFjdG9yIC8gZ2VuZXJhdGUgcmVzdWx0cyBhbmQgZHluYW1pYyByZWdpc3RyYXRpb24uXG4gICAgX2Nvbm4ub25SZXF1ZXN0KCd3b3Jrc3BhY2UvYXBwbHlFZGl0JywgKHBhcmFtczogeyBlZGl0OiBXb3Jrc3BhY2VFZGl0IH0pID0+IHtcbiAgICAgICAgYXBwbHlXb3Jrc3BhY2VFZGl0KHBhcmFtcy5lZGl0KTtcbiAgICAgICAgcmV0dXJuIHsgYXBwbGllZDogdHJ1ZSB9O1xuICAgIH0pO1xuICAgIF9jb25uLm9uUmVxdWVzdCgnd29ya3NwYWNlL2NvbmZpZ3VyYXRpb24nLCAocGFyYW1zOiB7IGl0ZW1zOiBBcnJheTx7IHNlY3Rpb24/OiBzdHJpbmcgfT4gfSkgPT5cbiAgICAgICAgKHBhcmFtcy5pdGVtcyA/PyBbXSkubWFwKCgpID0+IGpkdGxzU2V0dGluZ3MoKS5qYXZhKSk7XG4gICAgX2Nvbm4ub25SZXF1ZXN0KCdjbGllbnQvcmVnaXN0ZXJDYXBhYmlsaXR5JywgKCkgPT4gbnVsbCk7XG4gICAgX2Nvbm4ub25SZXF1ZXN0KCdjbGllbnQvdW5yZWdpc3RlckNhcGFiaWxpdHknLCAoKSA9PiBudWxsKTtcbiAgICBfY29ubi5vblJlcXVlc3QoJ3dpbmRvdy9zaG93TWVzc2FnZVJlcXVlc3QnLCAoKSA9PiBudWxsKTtcbiAgICBfY29ubi5vblJlcXVlc3QoJ3dpbmRvdy93b3JrRG9uZVByb2dyZXNzL2NyZWF0ZScsICgpID0+IG51bGwpO1xuICAgIF9jb25uLm9uTm90aWZpY2F0aW9uKCd3aW5kb3cvbG9nTWVzc2FnZScsIChwOiB7IG1lc3NhZ2U6IHN0cmluZyB9KSA9PiBjb25zb2xlLmRlYnVnKCdbamF2YS1sc3BdJywgcD8ubWVzc2FnZSkpO1xuICAgIF9jb25uLm9uTm90aWZpY2F0aW9uKCd3aW5kb3cvc2hvd01lc3NhZ2UnLCAocDogeyBtZXNzYWdlOiBzdHJpbmcgfSkgPT4gY29uc29sZS5pbmZvKCdbamF2YS1sc3BdJywgcD8ubWVzc2FnZSkpO1xuICAgIC8vIEpEVC5MUyBsYW5ndWFnZS1zdGF0dXMgLyBwcm9ncmVzcyBub3RpZmljYXRpb25zIFx1MjAxNCBhY2tub3dsZWRnZWQgc2lsZW50bHkuXG4gICAgX2Nvbm4ub25Ob3RpZmljYXRpb24oJ2xhbmd1YWdlL3N0YXR1cycsICgpID0+IHsgLyogaW5kZXhpbmcvcmVhZHkgc3RhdHVzLCBpZ25vcmVkICovIH0pO1xuICAgIF9jb25uLm9uTm90aWZpY2F0aW9uKCdsYW5ndWFnZS9wcm9ncmVzc1JlcG9ydCcsICgpID0+IHsgLyogYnVpbGQgcHJvZ3Jlc3MsIGlnbm9yZWQgKi8gfSk7XG5cbiAgICBfY29ubi5saXN0ZW4oKTtcblxuICAgIGNvbnN0IHJvb3RVcmkgPSBfd29ya3NwYWNlUm9vdDtcbiAgICBjb25zdCBpbml0UmVzdWx0OiBhbnkgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgnaW5pdGlhbGl6ZScsIHtcbiAgICAgICAgcHJvY2Vzc0lkOiBudWxsLFxuICAgICAgICByb290VXJpLFxuICAgICAgICBpbml0aWFsaXphdGlvbk9wdGlvbnM6IHtcbiAgICAgICAgICAgIHNldHRpbmdzOiBqZHRsc1NldHRpbmdzKCksXG4gICAgICAgICAgICBleHRlbmRlZENsaWVudENhcGFiaWxpdGllczoge1xuICAgICAgICAgICAgICAgIHByb2dyZXNzUmVwb3J0UHJvdmlkZXI6ICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgY2xhc3NGaWxlQ29udGVudHNTdXBwb3J0OiAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgIHJlc29sdmVBZGRpdGlvbmFsVGV4dEVkaXRzU3VwcG9ydDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBhZHZhbmNlZEdlbmVyYXRlQWNjZXNzb3JzU3VwcG9ydDogIHRydWUsXG4gICAgICAgICAgICAgICAgZ2VuZXJhdGVUb1N0cmluZ1Byb21wdFN1cHBvcnQ6ICAgICB0cnVlLFxuICAgICAgICAgICAgICAgIGdlbmVyYXRlQ29uc3RydWN0b3JzUHJvbXB0U3VwcG9ydDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBnZW5lcmF0ZURlbGVnYXRlTWV0aG9kc1Byb21wdFN1cHBvcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgaGFzaENvZGVFcXVhbHNQcm9tcHRTdXBwb3J0OiAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgIGFkdmFuY2VkT3JnYW5pemVJbXBvcnRzU3VwcG9ydDogICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICBpbmZlclNlbGVjdGlvblN1cHBvcnQ6ICAgICAgICAgICAgIFsnZXh0cmFjdE1ldGhvZCcsICdleHRyYWN0VmFyaWFibGUnLCAnZXh0cmFjdEZpZWxkJ10sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB3b3Jrc3BhY2VGb2xkZXJzOiBbeyB1cmk6IHJvb3RVcmksIG5hbWU6IHdvcmtzcGFjZSB9XSxcbiAgICAgICAgY2FwYWJpbGl0aWVzOiB7XG4gICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHtcbiAgICAgICAgICAgICAgICBzeW5jaHJvbml6YXRpb246IHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSwgd2lsbFNhdmU6IGZhbHNlLCBkaWRTYXZlOiB0cnVlLCB3aWxsU2F2ZVdhaXRVbnRpbDogZmFsc2UgfSxcbiAgICAgICAgICAgICAgICBjb21wbGV0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgIGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25JdGVtOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzbmlwcGV0U3VwcG9ydDogICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudGF0aW9uRm9ybWF0OiAgIFsnbWFya2Rvd24nLCAncGxhaW50ZXh0J10sXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGVkU3VwcG9ydDogICAgIHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21taXRDaGFyYWN0ZXJzU3VwcG9ydDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVTdXBwb3J0OiAgICAgICAgeyBwcm9wZXJ0aWVzOiBbJ2RvY3VtZW50YXRpb24nLCAnZGV0YWlsJywgJ2FkZGl0aW9uYWxUZXh0RWRpdHMnXSB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0U3VwcG9ydDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGhvdmVyOiAgICAgICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUsIGNvbnRlbnRGb3JtYXQ6IFsnbWFya2Rvd24nLCAncGxhaW50ZXh0J10gfSxcbiAgICAgICAgICAgICAgICBzaWduYXR1cmVIZWxwOiAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLCBzaWduYXR1cmVJbmZvcm1hdGlvbjogeyBkb2N1bWVudGF0aW9uRm9ybWF0OiBbJ21hcmtkb3duJywgJ3BsYWludGV4dCddLCBwYXJhbWV0ZXJJbmZvcm1hdGlvbjogeyBsYWJlbE9mZnNldFN1cHBvcnQ6IHRydWUgfSB9IH0sXG4gICAgICAgICAgICAgICAgZGVmaW5pdGlvbjogICAgIHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIHJlZmVyZW5jZXM6ICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbjogeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgdHlwZURlZmluaXRpb246IHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIGRvY3VtZW50SGlnaGxpZ2h0OiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICBkb2N1bWVudFN5bWJvbDogeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLCBoaWVyYXJjaGljYWxEb2N1bWVudFN5bWJvbFN1cHBvcnQ6IHRydWUgfSxcbiAgICAgICAgICAgICAgICBmb2xkaW5nUmFuZ2U6ICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLCBsaW5lRm9sZGluZ09ubHk6IGZhbHNlIH0sXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uUmFuZ2U6IHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIGNvZGVMZW5zOiAgICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICBpbmxheUhpbnQ6ICAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLCByZXNvbHZlU3VwcG9ydDogeyBwcm9wZXJ0aWVzOiBbJ2xhYmVsJ10gfSB9LFxuICAgICAgICAgICAgICAgIHNlbWFudGljVG9rZW5zOiB7XG4gICAgICAgICAgICAgICAgICAgIGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RzOiAgICAgICAgeyByYW5nZTogZmFsc2UsIGZ1bGw6IHsgZGVsdGE6IGZhbHNlIH0gfSxcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5UeXBlczogICAgICBbJ25hbWVzcGFjZScsICd0eXBlJywgJ2NsYXNzJywgJ2VudW0nLCAnaW50ZXJmYWNlJywgJ3N0cnVjdCcsICd0eXBlUGFyYW1ldGVyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdwYXJhbWV0ZXInLCAndmFyaWFibGUnLCAncHJvcGVydHknLCAnZW51bU1lbWJlcicsICdldmVudCcsICdmdW5jdGlvbicsICdtZXRob2QnLCAnbWFjcm8nLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2tleXdvcmQnLCAnbW9kaWZpZXInLCAnY29tbWVudCcsICdzdHJpbmcnLCAnbnVtYmVyJywgJ3JlZ2V4cCcsICdvcGVyYXRvcicsICdkZWNvcmF0b3InXSxcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5Nb2RpZmllcnM6ICBbJ2RlY2xhcmF0aW9uJywgJ2RlZmluaXRpb24nLCAncmVhZG9ubHknLCAnc3RhdGljJywgJ2RlcHJlY2F0ZWQnLCAnYWJzdHJhY3QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2FzeW5jJywgJ21vZGlmaWNhdGlvbicsICdkb2N1bWVudGF0aW9uJywgJ2RlZmF1bHRMaWJyYXJ5J10sXG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdHM6ICAgICAgICAgWydyZWxhdGl2ZSddLFxuICAgICAgICAgICAgICAgICAgICBvdmVybGFwcGluZ1Rva2VuU3VwcG9ydDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIG11bHRpbGluZVRva2VuU3VwcG9ydDogICBmYWxzZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGZvcm1hdHRpbmc6ICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICByYW5nZUZvcm1hdHRpbmc6IHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIHJlbmFtZTogICAgICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUsIHByZXBhcmVTdXBwb3J0OiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgY29kZUFjdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjb2RlQWN0aW9uTGl0ZXJhbFN1cHBvcnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVBY3Rpb25LaW5kOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTZXQ6IFsncXVpY2tmaXgnLCAncmVmYWN0b3InLCAncmVmYWN0b3IuZXh0cmFjdCcsICdyZWZhY3Rvci5pbmxpbmUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVmYWN0b3IucmV3cml0ZScsICdzb3VyY2UnLCAnc291cmNlLm9yZ2FuaXplSW1wb3J0cyddLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgaXNQcmVmZXJyZWRTdXBwb3J0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBkYXRhU3VwcG9ydDogICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmVTdXBwb3J0OiAgICAgeyBwcm9wZXJ0aWVzOiBbJ2VkaXQnXSB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcHVibGlzaERpYWdub3N0aWNzOiB7IHJlbGF0ZWRJbmZvcm1hdGlvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdvcmtzcGFjZToge1xuICAgICAgICAgICAgICAgIGFwcGx5RWRpdDogICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbjogICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICBleGVjdXRlQ29tbWFuZDogICAgICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICBkaWRDaGFuZ2VDb25maWd1cmF0aW9uOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICB3b3Jrc3BhY2VFZGl0OiAgICAgICAgICB7IGRvY3VtZW50Q2hhbmdlczogdHJ1ZSwgcmVzb3VyY2VPcGVyYXRpb25zOiBbJ2NyZWF0ZScsICdyZW5hbWUnLCAnZGVsZXRlJ10gfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBfc2VtYW50aWNUb2tlbnNMZWdlbmQgPSBpbml0UmVzdWx0Py5jYXBhYmlsaXRpZXM/LnNlbWFudGljVG9rZW5zUHJvdmlkZXI/LmxlZ2VuZCA/PyBudWxsO1xuXG4gICAgX2Nvbm4uc2VuZE5vdGlmaWNhdGlvbignaW5pdGlhbGl6ZWQnLCB7fSk7XG4gICAgX2Nvbm4uc2VuZE5vdGlmaWNhdGlvbignd29ya3NwYWNlL2RpZENoYW5nZUNvbmZpZ3VyYXRpb24nLCB7IHNldHRpbmdzOiBqZHRsc1NldHRpbmdzKCkgfSk7XG5cbiAgICBvcGVuRmlsZShmaWxlVXJpKTtcblxuICAgIGlmICghX3Byb3ZpZGVyc1JlZ2lzdGVyZWQpIHtcbiAgICAgICAgX3Byb3ZpZGVyc1JlZ2lzdGVyZWQgPSB0cnVlO1xuICAgICAgICByZWdpc3RlclByb3ZpZGVycygpO1xuICAgIH1cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRmlsZSBsaWZlY3ljbGVcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBTZW5kcyB0ZXh0RG9jdW1lbnQvZGlkT3BlbiBmb3IgdGhlIGdpdmVuIFVSSSAoaWYgbm90IGFscmVhZHkgc2VudCkgYW5kIHJlZ2lzdGVycyBhIGRlYm91bmNlZFxuICogdGV4dERvY3VtZW50L2RpZENoYW5nZSBsaXN0ZW5lciBvbiB0aGUgY29ycmVzcG9uZGluZyBNb25hY28gbW9kZWwuXG4gKi9cbmZ1bmN0aW9uIG9wZW5GaWxlKGZpbGVVcmk6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChfb3BlbkZpbGVzLmhhcyhmaWxlVXJpKSB8fCAhX2Nvbm4pIHJldHVybjtcbiAgICBfb3BlbkZpbGVzLmFkZChmaWxlVXJpKTtcblxuICAgIGNvbnN0IG1vZGVsID0gbW9uYWNvLmVkaXRvci5nZXRNb2RlbHMoKS5maW5kKG0gPT4gbS51cmkudG9TdHJpbmcoKSA9PT0gZmlsZVVyaSk7XG4gICAgX2Nvbm4uc2VuZE5vdGlmaWNhdGlvbigndGV4dERvY3VtZW50L2RpZE9wZW4nLCB7XG4gICAgICAgIHRleHREb2N1bWVudDoge1xuICAgICAgICAgICAgdXJpOiAgICAgICAgZmlsZVVyaSxcbiAgICAgICAgICAgIGxhbmd1YWdlSWQ6ICdqYXZhJyxcbiAgICAgICAgICAgIHZlcnNpb246ICAgIDEsXG4gICAgICAgICAgICB0ZXh0OiAgICAgICBtb2RlbD8uZ2V0VmFsdWUoKSA/PyAnJyxcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIGlmIChtb2RlbCkge1xuICAgICAgICBsZXQgdGltZXI6IFJldHVyblR5cGU8dHlwZW9mIHNldFRpbWVvdXQ+O1xuICAgICAgICBtb2RlbC5vbkRpZENoYW5nZUNvbnRlbnQoKCkgPT4ge1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVyKTtcbiAgICAgICAgICAgIHRpbWVyID0gc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgX2Nvbm4/LnNlbmROb3RpZmljYXRpb24oJ3RleHREb2N1bWVudC9kaWRDaGFuZ2UnLCB7XG4gICAgICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogICB7IHVyaTogZmlsZVVyaSwgdmVyc2lvbjogbW9kZWwuZ2V0VmVyc2lvbklkKCkgfSxcbiAgICAgICAgICAgICAgICAgICAgY29udGVudENoYW5nZXM6IFt7IHRleHQ6IG1vZGVsLmdldFZhbHVlKCkgfV0sXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LCA0MDApO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFdvcmtzcGFjZSBmaWxlIHByZWRpY2F0ZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFJldHVybnMge0Bjb2RlIHRydWV9IHdoZW4gdGhlIGdpdmVuIG1vZGVsIFVSSSBiZWxvbmdzIHRvIHRoZSBjdXJyZW50bHkgY29ubmVjdGVkIHdvcmtzcGFjZS4gVXNlZFxuICogYnkgTW9uYWNvIHByb3ZpZGVycyB0byBza2lwIG5vbi1KYXZhLXdvcmtzcGFjZSBtb2RlbHMgd2l0aG91dCBhbiBleGFjdC1VUkkgY29tcGFyaXNvbi5cbiAqL1xuZnVuY3Rpb24gaXNXb3Jrc3BhY2VGaWxlKHVyaTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIF93b3Jrc3BhY2VSb290ICE9PSAnJyAmJiB1cmkuc3RhcnRzV2l0aChfd29ya3NwYWNlUm9vdCk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIE1vbmFjbyBwcm92aWRlciByZWdpc3RyYXRpb25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gcmVnaXN0ZXJQcm92aWRlcnMoKTogdm9pZCB7XG5cbiAgICBtb25hY28uZWRpdG9yLnJlZ2lzdGVyQ29tbWFuZChBUFBMWV9BQ1RJT05fQ09NTUFORCwgKF9hY2Nlc3NvcjogdW5rbm93biwgYWN0aW9uOiBDb2RlQWN0aW9uIHwgQ29tbWFuZCkgPT4ge1xuICAgICAgICBhcHBseUNvZGVBY3Rpb24oYWN0aW9uKTtcbiAgICB9KTtcbiAgICBtb25hY28uZWRpdG9yLnJlZ2lzdGVyQ29tbWFuZChOT09QX0NPTU1BTkQsICgpID0+IHsgLyogZGlzcGxheS1vbmx5IENvZGVMZW5zICovIH0pO1xuXG4gICAgLy8gQ3Jvc3MtZmlsZSBuYXZpZ2F0aW9uOiB0aGlzIHNpbmdsZS1maWxlIGVkaXRvciBoYXMgbm8gbW9kZWwgZm9yIG90aGVyIHdvcmtzcGFjZSBmaWxlcywgc28gR28gdG9cbiAgICAvLyBEZWZpbml0aW9uIC8gRmluZCBSZWZlcmVuY2VzIHRvIGFub3RoZXIgZmlsZSB3b3VsZCBzaWxlbnRseSBkbyBub3RoaW5nLiBIYW5kIHRob3NlIG9mZiB0byB0aGUgSURFXG4gICAgLy8gdG8gb3BlbiB0aGUgdGFyZ2V0IGZpbGUgKGFuZCByZXZlYWwgdGhlIGxpbmUpLiBTYW1lLWZpbGUgdGFyZ2V0cyBmYWxsIHRocm91Z2ggdG8gTW9uYWNvLlxuICAgIG1vbmFjby5lZGl0b3IucmVnaXN0ZXJFZGl0b3JPcGVuZXIoe1xuICAgICAgICBvcGVuQ29kZUVkaXRvcjogKHNvdXJjZSwgcmVzb3VyY2UsIHNlbGVjdGlvbk9yUG9zaXRpb24pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHVyaSA9IHJlc291cmNlLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBpZiAoIWlzV29ya3NwYWNlRmlsZSh1cmkpIHx8ICF1cmkuc3RhcnRzV2l0aChWSVJUVUFMX0ZJTEVfUFJFRklYKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudE1vZGVsID0gc291cmNlLmdldE1vZGVsKCk7XG4gICAgICAgICAgICBpZiAoY3VycmVudE1vZGVsICYmIGN1cnJlbnRNb2RlbC51cmkudG9TdHJpbmcoKSA9PT0gdXJpKSByZXR1cm4gZmFsc2U7IC8vIHNhbWUgZmlsZSBcdTIwMTQgbGV0IE1vbmFjbyBqdW1wXG4gICAgICAgICAgICBjb25zdCBvcGVuZXIgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLmphdmFMc3BPcGVuRmlsZTtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3BlbmVyICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBwb3MgPSBzZWxlY3Rpb25PclBvc2l0aW9uIGFzIHsgc3RhcnRMaW5lTnVtYmVyPzogbnVtYmVyOyBsaW5lTnVtYmVyPzogbnVtYmVyOyBzdGFydENvbHVtbj86IG51bWJlcjsgY29sdW1uPzogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBsaW5lID0gcG9zID8gKHBvcy5zdGFydExpbmVOdW1iZXIgPz8gcG9zLmxpbmVOdW1iZXIpIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgY29sdW1uID0gcG9zID8gKHBvcy5zdGFydENvbHVtbiA/PyBwb3MuY29sdW1uKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIG9wZW5lcih1cmkuc3Vic3RyaW5nKFZJUlRVQUxfRklMRV9QUkVGSVgubGVuZ3RoKSwgbGluZSwgY29sdW1uKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckNvbXBsZXRpb25JdGVtUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHRyaWdnZXJDaGFyYWN0ZXJzOiBbJy4nLCAnQCcsICc8J10sXG4gICAgICAgIHByb3ZpZGVDb21wbGV0aW9uSXRlbXM6IGFzeW5jIChtb2RlbCwgcG9zaXRpb24sIGNvbnRleHQpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgZmlsZVVyaSA9IG1vZGVsLnVyaS50b1N0cmluZygpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBDb21wbGV0aW9uTGlzdCB8IENvbXBsZXRpb25JdGVtW10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9jb21wbGV0aW9uJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IGZpbGVVcmkgfSxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogICAgIHsgbGluZTogcG9zaXRpb24ubGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogcG9zaXRpb24uY29sdW1uIC0gMSB9LFxuICAgICAgICAgICAgICAgIC8vIE1vbmFjbyB0cmlnZ2VyIGtpbmRzIGFyZSAwLWJhc2VkIChJbnZva2UvVHJpZ2dlckNoYXJhY3Rlci9Gb3JJbmNvbXBsZXRlKTsgTFNQIGlzIDEtYmFzZWQuXG4gICAgICAgICAgICAgICAgY29udGV4dDogICAgICB7IHRyaWdnZXJLaW5kOiAoY29udGV4dC50cmlnZ2VyS2luZCA/PyAwKSArIDEsIHRyaWdnZXJDaGFyYWN0ZXI6IGNvbnRleHQudHJpZ2dlckNoYXJhY3RlciB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBpdGVtcyA9IEFycmF5LmlzQXJyYXkocmVzdWx0KSA/IHJlc3VsdCA6IChyZXN1bHQ/Lml0ZW1zID8/IFtdKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3VnZ2VzdGlvbnM6IGl0ZW1zLm1hcChpdGVtID0+IGxzcENvbXBsZXRpb25Ub01vbmFjbyhpdGVtLCBtb2RlbCwgcG9zaXRpb24pKSxcbiAgICAgICAgICAgICAgICAvLyBKRFQuTFMgcmV0dXJucyBhIHRydW5jYXRlZCBsaXN0IG9uIHRoZSBmaXJzdCBrZXlzdHJva2VzOyBwcm9wYWdhdGluZyBcImluY29tcGxldGVcIiBtYWtlc1xuICAgICAgICAgICAgICAgIC8vIE1vbmFjbyByZS1xdWVyeSBhcyB0aGUgdXNlciB0eXBlcyBpbnN0ZWFkIG9mIGNhY2hpbmcgdGhlIGZpcnN0IChvZnRlbiBlbXB0eSkgcmVzdWx0LlxuICAgICAgICAgICAgICAgIGluY29tcGxldGU6ICBBcnJheS5pc0FycmF5KHJlc3VsdCkgPyBmYWxzZSA6ICEhcmVzdWx0Py5pc0luY29tcGxldGUsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvLyBSZXNvbHZlIGRvY3VtZW50YXRpb24gYW5kLCBjcnVjaWFsbHksIHRoZSBhdXRvLWltcG9ydCBhZGRpdGlvbmFsVGV4dEVkaXRzIHdoaWNoIEpEVC5MUyBvbmx5XG4gICAgICAgIC8vIGF0dGFjaGVzIG9uIHJlc29sdmUgXHUyMDE0IHNlbGVjdGluZyBhIHR5cGUgdGhlbiBpbnNlcnRzIGl0cyBpbXBvcnQgc3RhdGVtZW50LlxuICAgICAgICByZXNvbHZlQ29tcGxldGlvbkl0ZW06IGFzeW5jIChpdGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsc3AgPSAoaXRlbSBhcyBNb25hY29Db21wbGV0aW9uSXRlbSkuX2xzcDtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWxzcCkgcmV0dXJuIGl0ZW07XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkOiBDb21wbGV0aW9uSXRlbSA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCdjb21wbGV0aW9uSXRlbS9yZXNvbHZlJywgbHNwKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQuZG9jdW1lbnRhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBpdGVtLmRvY3VtZW50YXRpb24gPSB7IHZhbHVlOiBtYXJrdXBUb1N0cmluZyhyZXNvbHZlZC5kb2N1bWVudGF0aW9uKSwgaXNUcnVzdGVkOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQuZGV0YWlsKSBpdGVtLmRldGFpbCA9IHJlc29sdmVkLmRldGFpbDtcbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQuYWRkaXRpb25hbFRleHRFZGl0cz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uYWRkaXRpb25hbFRleHRFZGl0cyA9IHJlc29sdmVkLmFkZGl0aW9uYWxUZXh0RWRpdHMubWFwKHRleHRFZGl0VG9Nb25hY28pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKCdbamF2YS1sc3BdIGNvbXBsZXRpb24gcmVzb2x2ZSBmYWlsZWQ6JywgKGUgYXMgRXJyb3IpPy5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckhvdmVyUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVIb3ZlcjogYXN5bmMgKG1vZGVsLCBwb3NpdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBmaWxlVXJpID0gbW9kZWwudXJpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IEhvdmVyIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvaG92ZXInLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogZmlsZVVyaSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0Py5jb250ZW50cykgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50cyA9IEFycmF5LmlzQXJyYXkocmVzdWx0LmNvbnRlbnRzKSA/IHJlc3VsdC5jb250ZW50cyA6IFtyZXN1bHQuY29udGVudHNdO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjb250ZW50czogY29udGVudHMubWFwKGMgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHR5cGVvZiBjID09PSAnc3RyaW5nJyA/IGMgOiAoYyBhcyBNYXJrdXBDb250ZW50KS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgaXNUcnVzdGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgcmFuZ2U6IHJlc3VsdC5yYW5nZSA/IGxzcFJhbmdlVG9Nb25hY28ocmVzdWx0LnJhbmdlKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyU2lnbmF0dXJlSGVscFByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBzaWduYXR1cmVIZWxwVHJpZ2dlckNoYXJhY3RlcnM6IFsnKCcsICcsJ10sXG4gICAgICAgIHByb3ZpZGVTaWduYXR1cmVIZWxwOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVVcmkgPSBtb2RlbC51cmkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogU2lnbmF0dXJlSGVscCB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L3NpZ25hdHVyZUhlbHAnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogZmlsZVVyaSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlczogcmVzdWx0LnNpZ25hdHVyZXMubWFwKChzaWc6IFNpZ25hdHVyZUluZm9ybWF0aW9uKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICAgICAgICAgc2lnLmxhYmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRhdGlvbjogc2lnLmRvY3VtZW50YXRpb24gPyBtYXJrdXBUb1N0cmluZyhzaWcuZG9jdW1lbnRhdGlvbikgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiAgICAoc2lnLnBhcmFtZXRlcnMgPz8gW10pLm1hcCgocDogUGFyYW1ldGVySW5mb3JtYXRpb24pID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICAgICAgICAgcC5sYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudGF0aW9uOiBwLmRvY3VtZW50YXRpb24gPyBtYXJrdXBUb1N0cmluZyhwLmRvY3VtZW50YXRpb24pIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZVNpZ25hdHVyZTogcmVzdWx0LmFjdGl2ZVNpZ25hdHVyZSA/PyAwLFxuICAgICAgICAgICAgICAgICAgICBhY3RpdmVQYXJhbWV0ZXI6IHJlc3VsdC5hY3RpdmVQYXJhbWV0ZXIgPz8gMCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGRpc3Bvc2U6ICgpID0+IHt9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJEZWZpbml0aW9uUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVEZWZpbml0aW9uOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVVcmkgPSBtb2RlbC51cmkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogTG9jYXRpb24gfCBMb2NhdGlvbltdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvZGVmaW5pdGlvbicsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBmaWxlVXJpIH0sXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgbG9jYXRpb25zID0gQXJyYXkuaXNBcnJheShyZXN1bHQpID8gcmVzdWx0IDogW3Jlc3VsdF07XG4gICAgICAgICAgICByZXR1cm4gbG9jYXRpb25zLm1hcChsb2MgPT4gKHtcbiAgICAgICAgICAgICAgICB1cmk6ICAgbW9uYWNvLlVyaS5wYXJzZShsb2MudXJpKSxcbiAgICAgICAgICAgICAgICByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhsb2MucmFuZ2UpLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlclJlZmVyZW5jZVByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlUmVmZXJlbmNlczogYXN5bmMgKG1vZGVsLCBwb3NpdGlvbiwgY29udGV4dCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IExvY2F0aW9uW10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9yZWZlcmVuY2VzJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgICAgICBjb250ZXh0OiAgICAgIHsgaW5jbHVkZURlY2xhcmF0aW9uOiBjb250ZXh0LmluY2x1ZGVEZWNsYXJhdGlvbiB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0Lm1hcChsb2MgPT4gKHsgdXJpOiBtb25hY28uVXJpLnBhcnNlKGxvYy51cmkpLCByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhsb2MucmFuZ2UpIH0pKTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJSZW5hbWVQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZVJlbmFtZUVkaXRzOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uLCBuZXdOYW1lKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4geyBlZGl0czogW10gfTtcbiAgICAgICAgICAgIGNvbnN0IGVkaXQ6IFdvcmtzcGFjZUVkaXQgfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9yZW5hbWUnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogICAgIHsgbGluZTogcG9zaXRpb24ubGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogcG9zaXRpb24uY29sdW1uIC0gMSB9LFxuICAgICAgICAgICAgICAgIG5ld05hbWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghZWRpdCkgcmV0dXJuIHsgZWRpdHM6IFtdIH07XG4gICAgICAgICAgICAvLyBBIEpEVC5MUyByZW5hbWUgY2FuIHNwYW4gbWFueSBmaWxlcyBhbmQgZXZlbiByZW5hbWUgdGhlIHR5cGUncyBvd24gLmphdmEgZmlsZS4gTW9uYWNvJ3NcbiAgICAgICAgICAgIC8vIHNpbmdsZS1maWxlIGVkaXRvciB3b3VsZCBkcm9wIGV2ZXJ5dGhpbmcgYnV0IHRoZSBjdXJyZW50IG1vZGVsLCBzbyBhcHBseSB0aGUgd2hvbGUgZWRpdFxuICAgICAgICAgICAgLy8gdGhyb3VnaCB0aGUgd29ya3NwYWNlIG91cnNlbHZlcyB3aGVuIHRoZSBJREUgcGVyc2lzdGVuY2UgaG9vayBpcyBhdmFpbGFibGUuXG4gICAgICAgICAgICBpZiAodHlwZW9mIChnbG9iYWxUaGlzIGFzIGFueSkuamF2YUxzcFBlcnNpc3RSZW5hbWUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBhd2FpdCBhcHBseVJlbmFtZUFjcm9zc1dvcmtzcGFjZShtb2RlbCwgZWRpdCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGVkaXRzOiBbXSB9O1xuICAgICAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignW2phdmEtbHNwXSBjcm9zcy1maWxlIHJlbmFtZSBmYWlsZWQsIGFwcGx5aW5nIHRvIHRoZSBjdXJyZW50IGZpbGUgb25seTonLCBlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdvcmtzcGFjZUVkaXRUb01vbmFjbyhlZGl0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gd29ya3NwYWNlRWRpdFRvTW9uYWNvKGVkaXQpO1xuICAgICAgICB9LFxuICAgICAgICByZXNvbHZlUmVuYW1lTG9jYXRpb246IGFzeW5jIChtb2RlbCwgcG9zaXRpb24pID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQ6IHsgcmFuZ2U6IExzcFJhbmdlOyBwbGFjZWhvbGRlcj86IHN0cmluZyB9IHwgTHNwUmFuZ2UgfCBudWxsID1cbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9wcmVwYXJlUmVuYW1lJywge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgICAgICBjb25zdCByYW5nZSA9ICdyYW5nZScgaW4gcmVzdWx0ID8gcmVzdWx0LnJhbmdlIDogcmVzdWx0O1xuICAgICAgICAgICAgICAgIGNvbnN0IHBsYWNlaG9sZGVyID0gJ3BsYWNlaG9sZGVyJyBpbiByZXN1bHQgJiYgcmVzdWx0LnBsYWNlaG9sZGVyXG4gICAgICAgICAgICAgICAgICAgID8gcmVzdWx0LnBsYWNlaG9sZGVyXG4gICAgICAgICAgICAgICAgICAgIDogbW9kZWwuZ2V0V29yZEF0UG9zaXRpb24ocG9zaXRpb24pPy53b3JkID8/ICcnO1xuICAgICAgICAgICAgICAgIHJldHVybiB7IHJhbmdlOiBsc3BSYW5nZVRvTW9uYWNvKHJhbmdlKSwgdGV4dDogcGxhY2Vob2xkZXIgfTtcbiAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgIGNvbnN0IHdvcmQgPSBtb2RlbC5nZXRXb3JkQXRQb3NpdGlvbihwb3NpdGlvbik7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHdvcmQgPyB7XG4gICAgICAgICAgICAgICAgICAgIHJhbmdlOiB7IHN0YXJ0TGluZU51bWJlcjogcG9zaXRpb24ubGluZU51bWJlciwgc3RhcnRDb2x1bW46IHdvcmQuc3RhcnRDb2x1bW4sIGVuZExpbmVOdW1iZXI6IHBvc2l0aW9uLmxpbmVOdW1iZXIsIGVuZENvbHVtbjogd29yZC5lbmRDb2x1bW4gfSxcbiAgICAgICAgICAgICAgICAgICAgdGV4dDogd29yZC53b3JkLFxuICAgICAgICAgICAgICAgIH0gOiBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gUmVnaXN0ZXJpbmcgdGhpcyBwcm92aWRlciBhbHNvIGVuYWJsZXMgZWRpdG9yLmpzJ3MgZXhpc3RpbmcgZm9ybWF0LW9uLXNhdmUgcGF0aCBmb3IgSmF2YTogdGhlXG4gICAgLy8gc2hhcmVkIFNhdmUgYWN0aW9uIHJ1bnMgZWRpdG9yLmFjdGlvbi5mb3JtYXREb2N1bWVudCB3aGVuIGF1dG8tZm9ybWF0dGluZyBpcyBvbiAodGhlIHNhbWVcbiAgICAvLyBtZWNoYW5pc20gYW5kIGdsb2JhbCB0b2dnbGUgdXNlZCBmb3IgVHlwZVNjcmlwdCkuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckRvY3VtZW50Rm9ybWF0dGluZ0VkaXRQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZURvY3VtZW50Rm9ybWF0dGluZ0VkaXRzOiBhc3luYyAobW9kZWwpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgZWRpdHM6IFRleHRFZGl0W10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9mb3JtYXR0aW5nJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICAgICAgb3B0aW9uczogICAgICB7IHRhYlNpemU6IG1vZGVsLmdldE9wdGlvbnMoKS50YWJTaXplLCBpbnNlcnRTcGFjZXM6IG1vZGVsLmdldE9wdGlvbnMoKS5pbnNlcnRTcGFjZXMgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGVkaXRzID8gZWRpdHMubWFwKHRleHRFZGl0VG9Nb25hY28pIDogbnVsbDtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJDb2RlQWN0aW9uUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVDb2RlQWN0aW9uczogYXN5bmMgKG1vZGVsLCByYW5nZSwgY29udGV4dCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZW1wdHkgPSB7IGFjdGlvbnM6IFtdLCBkaXNwb3NlKCkgeyAvKiBub3RoaW5nIHRvIGRpc3Bvc2UgKi8gfSB9O1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIGVtcHR5O1xuICAgICAgICAgICAgY29uc3QgZGlhZ25vc3RpY3MgPSAoY29udGV4dC5tYXJrZXJzID8/IFtdKS5tYXAobWFya2VyVG9Mc3BEaWFnbm9zdGljKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogQXJyYXk8Q29kZUFjdGlvbiB8IENvbW1hbmQ+IHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvY29kZUFjdGlvbicsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgIHJhbmdlOiAgICAgICAgbW9uYWNvUmFuZ2VUb0xzcChyYW5nZSksXG4gICAgICAgICAgICAgICAgY29udGV4dDogICAgICB7IGRpYWdub3N0aWNzLCBvbmx5OiBjb250ZXh0Lm9ubHkgPyBbY29udGV4dC5vbmx5XSA6IHVuZGVmaW5lZCB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdD8ubGVuZ3RoKSByZXR1cm4gZW1wdHk7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGFjdGlvbnM6IHJlc3VsdC5tYXAobHNwQ29kZUFjdGlvblRvTW9uYWNvKSxcbiAgICAgICAgICAgICAgICBkaXNwb3NlKCkgeyAvKiBub3RoaW5nIHRvIGRpc3Bvc2UgKi8gfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgfSwge1xuICAgICAgICBwcm92aWRlZENvZGVBY3Rpb25LaW5kczogWydxdWlja2ZpeCcsICdyZWZhY3RvcicsICdyZWZhY3Rvci5leHRyYWN0JywgJ3JlZmFjdG9yLmlubGluZScsXG4gICAgICAgICAgICAncmVmYWN0b3IucmV3cml0ZScsICdzb3VyY2UnLCAnc291cmNlLm9yZ2FuaXplSW1wb3J0cyddLFxuICAgIH0pO1xuXG4gICAgLy8gLS0tIE5hdmlnYXRpb24gJiBzdHJ1Y3R1cmUgKFBhY2sgMSkgLS0tXG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVySW1wbGVtZW50YXRpb25Qcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZUltcGxlbWVudGF0aW9uOiAobW9kZWwsIHBvc2l0aW9uKSA9PiByZXF1ZXN0TG9jYXRpb25zKCd0ZXh0RG9jdW1lbnQvaW1wbGVtZW50YXRpb24nLCBtb2RlbCwgcG9zaXRpb24pLFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlclR5cGVEZWZpbml0aW9uUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVUeXBlRGVmaW5pdGlvbjogKG1vZGVsLCBwb3NpdGlvbikgPT4gcmVxdWVzdExvY2F0aW9ucygndGV4dERvY3VtZW50L3R5cGVEZWZpbml0aW9uJywgbW9kZWwsIHBvc2l0aW9uKSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJEb2N1bWVudEhpZ2hsaWdodFByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlRG9jdW1lbnRIaWdobGlnaHRzOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55W10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9kb2N1bWVudEhpZ2hsaWdodCcsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQubWFwKGggPT4gKHsgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28oaC5yYW5nZSksIGtpbmQ6IGgua2luZCA/IGgua2luZCAtIDEgOiB1bmRlZmluZWQgfSkpO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckRvY3VtZW50U3ltYm9sUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVEb2N1bWVudFN5bWJvbHM6IGFzeW5jIChtb2RlbCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IGFueVtdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvZG9jdW1lbnRTeW1ib2wnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCA/IG1hcERvY3VtZW50U3ltYm9scyhyZXN1bHQpIDogbnVsbDtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJGb2xkaW5nUmFuZ2VQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZUZvbGRpbmdSYW5nZXM6IGFzeW5jIChtb2RlbCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IGFueVtdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvZm9sZGluZ1JhbmdlJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQubWFwKHIgPT4gKHsgc3RhcnQ6IHIuc3RhcnRMaW5lICsgMSwgZW5kOiByLmVuZExpbmUgKyAxLCBraW5kOiBmb2xkaW5nS2luZChyLmtpbmQpIH0pKTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJTZWxlY3Rpb25SYW5nZVByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlU2VsZWN0aW9uUmFuZ2VzOiBhc3luYyAobW9kZWwsIHBvc2l0aW9ucykgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IGFueVtdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvc2VsZWN0aW9uUmFuZ2UnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbnM6ICAgIHBvc2l0aW9ucy5tYXAocCA9PiAoeyBsaW5lOiBwLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHAuY29sdW1uIC0gMSB9KSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQubWFwKGZsYXR0ZW5TZWxlY3Rpb25SYW5nZSk7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyRG9jdW1lbnRSYW5nZUZvcm1hdHRpbmdFZGl0UHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVEb2N1bWVudFJhbmdlRm9ybWF0dGluZ0VkaXRzOiBhc3luYyAobW9kZWwsIHJhbmdlKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGVkaXRzOiBUZXh0RWRpdFtdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvcmFuZ2VGb3JtYXR0aW5nJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICAgICAgcmFuZ2U6ICAgICAgICBtb25hY29SYW5nZVRvTHNwKHJhbmdlKSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiAgICAgIHsgdGFiU2l6ZTogbW9kZWwuZ2V0T3B0aW9ucygpLnRhYlNpemUsIGluc2VydFNwYWNlczogbW9kZWwuZ2V0T3B0aW9ucygpLmluc2VydFNwYWNlcyB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gZWRpdHMgPyBlZGl0cy5tYXAodGV4dEVkaXRUb01vbmFjbykgOiBudWxsO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gLS0tIElubGF5IGhpbnRzICsgc2VtYW50aWMgaGlnaGxpZ2h0aW5nIChQYWNrIDIpIC0tLVxuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlcklubGF5SGludHNQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZUlubGF5SGludHM6IGFzeW5jIChtb2RlbCwgcmFuZ2UpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBhbnlbXSB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L2lubGF5SGludCcsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgIHJhbmdlOiAgICAgICAgbW9uYWNvUmFuZ2VUb0xzcChyYW5nZSksXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgaGludHM6IHJlc3VsdC5tYXAoaCA9PiAoe1xuICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogICAgIHsgbGluZU51bWJlcjogaC5wb3NpdGlvbi5saW5lICsgMSwgY29sdW1uOiBoLnBvc2l0aW9uLmNoYXJhY3RlciArIDEgfSxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICAgICAgICB0eXBlb2YgaC5sYWJlbCA9PT0gJ3N0cmluZycgPyBoLmxhYmVsIDogKGgubGFiZWwgPz8gW10pLm1hcCgocDogYW55KSA9PiAoeyBsYWJlbDogcC52YWx1ZSB9KSksXG4gICAgICAgICAgICAgICAgICAgIGtpbmQ6ICAgICAgICAgaC5raW5kLFxuICAgICAgICAgICAgICAgICAgICBwYWRkaW5nTGVmdDogIGgucGFkZGluZ0xlZnQsXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmdSaWdodDogaC5wYWRkaW5nUmlnaHQsXG4gICAgICAgICAgICAgICAgICAgIHRvb2x0aXA6ICAgICAgaC50b29sdGlwID8gbWFya3VwVG9TdHJpbmcoaC50b29sdGlwKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgZGlzcG9zZSgpIHsgLyogbm90aGluZyB0byBkaXNwb3NlICovIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckRvY3VtZW50U2VtYW50aWNUb2tlbnNQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgZ2V0TGVnZW5kOiAoKSA9PiBfc2VtYW50aWNUb2tlbnNMZWdlbmQgPz8geyB0b2tlblR5cGVzOiBbXSwgdG9rZW5Nb2RpZmllcnM6IFtdIH0sXG4gICAgICAgIHByb3ZpZGVEb2N1bWVudFNlbWFudGljVG9rZW5zOiBhc3luYyAobW9kZWwpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkgfHwgIV9zZW1hbnRpY1Rva2Vuc0xlZ2VuZCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IHsgZGF0YTogbnVtYmVyW107IHJlc3VsdElkPzogc3RyaW5nIH0gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9zZW1hbnRpY1Rva2Vucy9mdWxsJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0Py5kYXRhKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB7IGRhdGE6IG5ldyBVaW50MzJBcnJheShyZXN1bHQuZGF0YSksIHJlc3VsdElkOiByZXN1bHQucmVzdWx0SWQgfTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVsZWFzZURvY3VtZW50U2VtYW50aWNUb2tlbnM6ICgpID0+IHsgLyogbm90aGluZyB0byByZWxlYXNlICovIH0sXG4gICAgfSk7XG5cbiAgICAvLyAtLS0gQ29kZUxlbnMgKFBhY2sgMykgLS0tXG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyQ29kZUxlbnNQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZUNvZGVMZW5zZXM6IGFzeW5jIChtb2RlbCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIHsgbGVuc2VzOiBbXSwgZGlzcG9zZSgpIHsgLyogKi8gfSB9O1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBhbnlbXSB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L2NvZGVMZW5zJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGxlbnNlcyA9IChyZXN1bHQgPz8gW10pLm1hcCgobGVucywgaSkgPT4gKHtcbiAgICAgICAgICAgICAgICByYW5nZTogICAgbHNwUmFuZ2VUb01vbmFjbyhsZW5zLnJhbmdlKSxcbiAgICAgICAgICAgICAgICBpZDogICAgICAgU3RyaW5nKGkpLFxuICAgICAgICAgICAgICAgIGNvbW1hbmQ6ICBsZW5zLmNvbW1hbmQgPyBtYXBMZW5zQ29tbWFuZChsZW5zLmNvbW1hbmQpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIF9sc3A6ICAgICBsZW5zLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgcmV0dXJuIHsgbGVuc2VzLCBkaXNwb3NlKCkgeyAvKiAqLyB9IH07XG4gICAgICAgIH0sXG4gICAgICAgIHJlc29sdmVDb2RlTGVuczogYXN5bmMgKF9tb2RlbCwgY29kZUxlbnMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxzcCA9IChjb2RlTGVucyBhcyBhbnkpLl9sc3A7XG4gICAgICAgICAgICBpZiAoX2Nvbm4gJiYgbHNwICYmICFsc3AuY29tbWFuZCkge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkOiBhbnkgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgnY29kZUxlbnMvcmVzb2x2ZScsIGxzcCk7XG4gICAgICAgICAgICAgICAgICAgIGNvZGVMZW5zLmNvbW1hbmQgPSByZXNvbHZlZD8uY29tbWFuZCA/IG1hcExlbnNDb21tYW5kKHJlc29sdmVkLmNvbW1hbmQpIDogeyBpZDogTk9PUF9DT01NQU5ELCB0aXRsZTogJycgfTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICAgICAgY29kZUxlbnMuY29tbWFuZCA9IHsgaWQ6IE5PT1BfQ09NTUFORCwgdGl0bGU6ICcnIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGNvZGVMZW5zO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgLy8gLS0tIEphdmEga2V5d29yZCBjb21wbGV0aW9uIChQYWNrIDFiKTogYWx3YXlzLWF2YWlsYWJsZSwgcmFua2VkIGJlbG93IFNESy9MU1AgcmVzdWx0cyAtLS1cblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJDb21wbGV0aW9uSXRlbVByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlQ29tcGxldGlvbkl0ZW1zOiAobW9kZWwsIHBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3Qgd29yZCA9IG1vZGVsLmdldFdvcmRVbnRpbFBvc2l0aW9uKHBvc2l0aW9uKTtcbiAgICAgICAgICAgIGNvbnN0IHJhbmdlOiBtb25hY28uSVJhbmdlID0ge1xuICAgICAgICAgICAgICAgIHN0YXJ0TGluZU51bWJlcjogcG9zaXRpb24ubGluZU51bWJlciwgc3RhcnRDb2x1bW46IHdvcmQuc3RhcnRDb2x1bW4sXG4gICAgICAgICAgICAgICAgZW5kTGluZU51bWJlcjogICBwb3NpdGlvbi5saW5lTnVtYmVyLCBlbmRDb2x1bW46ICAgd29yZC5lbmRDb2x1bW4sXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBzdWdnZXN0aW9uczogSkFWQV9LRVlXT1JEUy5tYXAoa2V5d29yZCA9PiAoe1xuICAgICAgICAgICAgICAgICAgICBsYWJlbDogICAgICBrZXl3b3JkLFxuICAgICAgICAgICAgICAgICAgICBraW5kOiAgICAgICBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtS2luZC5LZXl3b3JkLFxuICAgICAgICAgICAgICAgICAgICBpbnNlcnRUZXh0OiBrZXl3b3JkLFxuICAgICAgICAgICAgICAgICAgICByYW5nZSxcbiAgICAgICAgICAgICAgICAgICAgc29ydFRleHQ6ICAgYDlfJHtrZXl3b3JkfWAsXG4gICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICB9KTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gSGVscGVyc1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5mdW5jdGlvbiBsc3BTZXZlcml0eShzZXZlcml0eTogRGlhZ25vc3RpY1NldmVyaXR5IHwgdW5kZWZpbmVkKTogbW9uYWNvLk1hcmtlclNldmVyaXR5IHtcbiAgICBzd2l0Y2ggKHNldmVyaXR5KSB7XG4gICAgICAgIGNhc2UgRGlhZ25vc3RpY1NldmVyaXR5LkVycm9yOiAgICAgICByZXR1cm4gbW9uYWNvLk1hcmtlclNldmVyaXR5LkVycm9yO1xuICAgICAgICBjYXNlIERpYWdub3N0aWNTZXZlcml0eS5XYXJuaW5nOiAgICAgcmV0dXJuIG1vbmFjby5NYXJrZXJTZXZlcml0eS5XYXJuaW5nO1xuICAgICAgICBjYXNlIERpYWdub3N0aWNTZXZlcml0eS5JbmZvcm1hdGlvbjogcmV0dXJuIG1vbmFjby5NYXJrZXJTZXZlcml0eS5JbmZvO1xuICAgICAgICBjYXNlIERpYWdub3N0aWNTZXZlcml0eS5IaW50OiAgICAgICAgcmV0dXJuIG1vbmFjby5NYXJrZXJTZXZlcml0eS5IaW50O1xuICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1vbmFjby5NYXJrZXJTZXZlcml0eS5FcnJvcjtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGxzcFJhbmdlVG9Nb25hY28ocjogeyBzdGFydDogeyBsaW5lOiBudW1iZXI7IGNoYXJhY3RlcjogbnVtYmVyIH07IGVuZDogeyBsaW5lOiBudW1iZXI7IGNoYXJhY3RlcjogbnVtYmVyIH0gfSk6IG1vbmFjby5JUmFuZ2Uge1xuICAgIHJldHVybiB7XG4gICAgICAgIHN0YXJ0TGluZU51bWJlcjogci5zdGFydC5saW5lICsgMSxcbiAgICAgICAgc3RhcnRDb2x1bW46ICAgICByLnN0YXJ0LmNoYXJhY3RlciArIDEsXG4gICAgICAgIGVuZExpbmVOdW1iZXI6ICAgci5lbmQubGluZSArIDEsXG4gICAgICAgIGVuZENvbHVtbjogICAgICAgci5lbmQuY2hhcmFjdGVyICsgMSxcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBtYXJrdXBUb1N0cmluZyhjOiBzdHJpbmcgfCBNYXJrdXBDb250ZW50KTogc3RyaW5nIHtcbiAgICByZXR1cm4gdHlwZW9mIGMgPT09ICdzdHJpbmcnID8gYyA6IGMudmFsdWU7XG59XG5cbmZ1bmN0aW9uIGxzcENvbXBsZXRpb25LaW5kKGtpbmQ6IENvbXBsZXRpb25JdGVtS2luZCB8IHVuZGVmaW5lZCk6IG1vbmFjby5sYW5ndWFnZXMuQ29tcGxldGlvbkl0ZW1LaW5kIHtcbiAgICBjb25zdCBLID0gbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbUtpbmQ7XG4gICAgc3dpdGNoIChraW5kKSB7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLlRleHQ6ICAgICAgICAgIHJldHVybiBLLlRleHQ7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLk1ldGhvZDogICAgICAgIHJldHVybiBLLk1ldGhvZDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuRnVuY3Rpb246ICAgICAgcmV0dXJuIEsuRnVuY3Rpb247XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLkNvbnN0cnVjdG9yOiAgIHJldHVybiBLLkNvbnN0cnVjdG9yO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5GaWVsZDogICAgICAgICByZXR1cm4gSy5GaWVsZDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuVmFyaWFibGU6ICAgICAgcmV0dXJuIEsuVmFyaWFibGU7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLkNsYXNzOiAgICAgICAgIHJldHVybiBLLkNsYXNzO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5JbnRlcmZhY2U6ICAgICByZXR1cm4gSy5JbnRlcmZhY2U7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLk1vZHVsZTogICAgICAgIHJldHVybiBLLk1vZHVsZTtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuUHJvcGVydHk6ICAgICAgcmV0dXJuIEsuUHJvcGVydHk7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLktleXdvcmQ6ICAgICAgIHJldHVybiBLLktleXdvcmQ7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLlNuaXBwZXQ6ICAgICAgIHJldHVybiBLLlNuaXBwZXQ7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLkNvbnN0YW50OiAgICAgIHJldHVybiBLLkNvbnN0YW50O1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5TdHJ1Y3Q6ICAgICAgICByZXR1cm4gSy5TdHJ1Y3Q7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLlR5cGVQYXJhbWV0ZXI6IHJldHVybiBLLlR5cGVQYXJhbWV0ZXI7XG4gICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBLLlRleHQ7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBsc3BDb21wbGV0aW9uVG9Nb25hY28oXG4gICAgaXRlbTogQ29tcGxldGlvbkl0ZW0sXG4gICAgbW9kZWw6IG1vbmFjby5lZGl0b3IuSVRleHRNb2RlbCxcbiAgICBwb3NpdGlvbjogbW9uYWNvLlBvc2l0aW9uLFxuKTogTW9uYWNvQ29tcGxldGlvbkl0ZW0ge1xuICAgIGNvbnN0IHdvcmQgPSBtb2RlbC5nZXRXb3JkVW50aWxQb3NpdGlvbihwb3NpdGlvbik7XG4gICAgbGV0IHJhbmdlOiBtb25hY28uSVJhbmdlID0ge1xuICAgICAgICBzdGFydExpbmVOdW1iZXI6IHBvc2l0aW9uLmxpbmVOdW1iZXIsXG4gICAgICAgIHN0YXJ0Q29sdW1uOiAgICAgd29yZC5zdGFydENvbHVtbixcbiAgICAgICAgZW5kTGluZU51bWJlcjogICBwb3NpdGlvbi5saW5lTnVtYmVyLFxuICAgICAgICBlbmRDb2x1bW46ICAgICAgIHdvcmQuZW5kQ29sdW1uLFxuICAgIH07XG4gICAgbGV0IGluc2VydFRleHQgPSBpdGVtLmluc2VydFRleHQgPz8gaXRlbS5sYWJlbDtcbiAgICBjb25zdCB0ZXh0RWRpdCA9IGl0ZW0udGV4dEVkaXQgYXMgeyByYW5nZT86IExzcFJhbmdlOyByZXBsYWNlPzogTHNwUmFuZ2U7IGluc2VydD86IExzcFJhbmdlOyBuZXdUZXh0Pzogc3RyaW5nIH0gfCB1bmRlZmluZWQ7XG4gICAgaWYgKHRleHRFZGl0KSB7XG4gICAgICAgIGNvbnN0IHIgPSB0ZXh0RWRpdC5yYW5nZSA/PyB0ZXh0RWRpdC5yZXBsYWNlID8/IHRleHRFZGl0Lmluc2VydDtcbiAgICAgICAgaWYgKHIpIHJhbmdlID0gbHNwUmFuZ2VUb01vbmFjbyhyKTtcbiAgICAgICAgaWYgKHR5cGVvZiB0ZXh0RWRpdC5uZXdUZXh0ID09PSAnc3RyaW5nJykgaW5zZXJ0VGV4dCA9IHRleHRFZGl0Lm5ld1RleHQ7XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdDogTW9uYWNvQ29tcGxldGlvbkl0ZW0gPSB7XG4gICAgICAgIGxhYmVsOiAgICAgICAgICAgaXRlbS5sYWJlbCxcbiAgICAgICAga2luZDogICAgICAgICAgICBsc3BDb21wbGV0aW9uS2luZChpdGVtLmtpbmQpLFxuICAgICAgICBkZXRhaWw6ICAgICAgICAgIGl0ZW0uZGV0YWlsLFxuICAgICAgICBkb2N1bWVudGF0aW9uOiAgIGl0ZW0uZG9jdW1lbnRhdGlvbiA/IHsgdmFsdWU6IG1hcmt1cFRvU3RyaW5nKGl0ZW0uZG9jdW1lbnRhdGlvbiksIGlzVHJ1c3RlZDogZmFsc2UgfSA6IHVuZGVmaW5lZCxcbiAgICAgICAgaW5zZXJ0VGV4dCxcbiAgICAgICAgaW5zZXJ0VGV4dFJ1bGVzOiBpdGVtLmluc2VydFRleHRGb3JtYXQgPT09IEluc2VydFRleHRGb3JtYXQuU25pcHBldFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IG1vbmFjby5sYW5ndWFnZXMuQ29tcGxldGlvbkl0ZW1JbnNlcnRUZXh0UnVsZS5JbnNlcnRBc1NuaXBwZXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB1bmRlZmluZWQsXG4gICAgICAgIHJhbmdlLFxuICAgICAgICBzb3J0VGV4dDogICAgICAgICAgICBzZGtQcmlvcml0aXNlZFNvcnRUZXh0KGl0ZW0pLFxuICAgICAgICBmaWx0ZXJUZXh0OiAgICAgICAgICBpdGVtLmZpbHRlclRleHQsXG4gICAgICAgIHByZXNlbGVjdDogICAgICAgICAgIGl0ZW0ucHJlc2VsZWN0LFxuICAgICAgICBjb21taXRDaGFyYWN0ZXJzOiAgICBpdGVtLmNvbW1pdENoYXJhY3RlcnMsXG4gICAgICAgIGFkZGl0aW9uYWxUZXh0RWRpdHM6IGl0ZW0uYWRkaXRpb25hbFRleHRFZGl0cz8ubWFwKHRleHRFZGl0VG9Nb25hY28pLFxuICAgIH07XG4gICAgcmVzdWx0Ll9sc3AgPSBpdGVtO1xuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogUmFua3MgRGlyaWdpYmxlIFNESyBzdWdnZXN0aW9ucyAoe0Bjb2RlIG9yZy5lY2xpcHNlLmRpcmlnaWJsZS5zZGsuKn0pIGFib3ZlIGV2ZXJ5dGhpbmcgZWxzZSBieVxuICogcHJlZml4aW5nIHRoZSBzZXJ2ZXIgc29ydFRleHQgd2l0aCBhIHByaW9yaXR5IGJ1Y2tldCwgcHJlc2VydmluZyB0aGUgc2VydmVyIG9yZGVyIHdpdGhpbiBlYWNoIGJ1Y2tldC5cbiAqL1xuZnVuY3Rpb24gc2RrUHJpb3JpdGlzZWRTb3J0VGV4dChpdGVtOiBDb21wbGV0aW9uSXRlbSk6IHN0cmluZyB7XG4gICAgY29uc3QgYmFzZSA9IGl0ZW0uc29ydFRleHQgPz8gKHR5cGVvZiBpdGVtLmxhYmVsID09PSAnc3RyaW5nJyA/IGl0ZW0ubGFiZWwgOiAnJyk7XG4gICAgY29uc3QgZGVzY3JpcHRpb24gPSAoaXRlbS5sYWJlbERldGFpbHMgJiYgdHlwZW9mIGl0ZW0ubGFiZWxEZXRhaWxzLmRlc2NyaXB0aW9uID09PSAnc3RyaW5nJylcbiAgICAgICAgPyBpdGVtLmxhYmVsRGV0YWlscy5kZXNjcmlwdGlvbiA6ICcnO1xuICAgIGNvbnN0IGhheXN0YWNrID0gYCR7aXRlbS5kZXRhaWwgPz8gJyd9ICR7ZGVzY3JpcHRpb259YDtcbiAgICByZXR1cm4gaGF5c3RhY2suaW5jbHVkZXMoJ29yZy5lY2xpcHNlLmRpcmlnaWJsZS5zZGsnKSA/IGAwXyR7YmFzZX1gIDogYDFfJHtiYXNlfWA7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIENvZGUgYWN0aW9ucywgY29tbWFuZHMsIHJlZmFjdG9yL2dlbmVyYXRlLCB3b3Jrc3BhY2UgZWRpdHNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIE1vbmFjbyBjb21tYW5kIGlkIHVzZWQgdG8gYXBwbHkgYSBkZWZlcnJlZCBMU1AgY29kZSBhY3Rpb24gd2hlbiB0aGUgdXNlciBzZWxlY3RzIGl0LiAqL1xuY29uc3QgQVBQTFlfQUNUSU9OX0NPTU1BTkQgPSAnZGlyaWdpYmxlLmphdmEuYXBwbHlDb2RlQWN0aW9uJztcblxuLyoqIFZpcnR1YWwgVVJJIHByZWZpeCBvZiBlZGl0b3IgbW9kZWxzOyBzdHJpcHBpbmcgaXQgeWllbGRzIHRoZSBJREUgd29ya3NwYWNlIHBhdGggKC93cy9wcm9qLy4uLikuICovXG5jb25zdCBWSVJUVUFMX0ZJTEVfUFJFRklYID0gJ2ZpbGU6Ly8vd29ya3NwYWNlJztcblxuLyoqIE1vbmFjbyBjb21tYW5kIGlkIHVzZWQgZm9yIGRpc3BsYXktb25seSBDb2RlTGVuc2VzIChlLmcuIGEgcmVmZXJlbmNlIGNvdW50IHdpdGggbm8gcmVzb2x2ZWQgYWN0aW9uKS4gKi9cbmNvbnN0IE5PT1BfQ09NTUFORCA9ICdkaXJpZ2libGUuamF2YS5ub29wTGVucyc7XG5cbi8qKiBKYXZhIFNFIGtleXdvcmRzL2xpdGVyYWxzIG9mZmVyZWQgYXMgbG93LXByaW9yaXR5IGNvbXBsZXRpb24gc28gdGhleSBhbHdheXMgYXBwZWFyIHdoaWxlIHR5cGluZy4gKi9cbmNvbnN0IEpBVkFfS0VZV09SRFMgPSBbJ2Fic3RyYWN0JywgJ2Fzc2VydCcsICdib29sZWFuJywgJ2JyZWFrJywgJ2J5dGUnLCAnY2FzZScsICdjYXRjaCcsICdjaGFyJywgJ2NsYXNzJyxcbiAgICAnY29uc3QnLCAnY29udGludWUnLCAnZGVmYXVsdCcsICdkbycsICdkb3VibGUnLCAnZWxzZScsICdlbnVtJywgJ2V4dGVuZHMnLCAnZmluYWwnLCAnZmluYWxseScsICdmbG9hdCcsXG4gICAgJ2ZvcicsICdnb3RvJywgJ2lmJywgJ2ltcGxlbWVudHMnLCAnaW1wb3J0JywgJ2luc3RhbmNlb2YnLCAnaW50JywgJ2ludGVyZmFjZScsICdsb25nJywgJ25hdGl2ZScsICduZXcnLFxuICAgICdwYWNrYWdlJywgJ3ByaXZhdGUnLCAncHJvdGVjdGVkJywgJ3B1YmxpYycsICdyZXR1cm4nLCAnc2hvcnQnLCAnc3RhdGljJywgJ3N0cmljdGZwJywgJ3N1cGVyJywgJ3N3aXRjaCcsXG4gICAgJ3N5bmNocm9uaXplZCcsICd0aGlzJywgJ3Rocm93JywgJ3Rocm93cycsICd0cmFuc2llbnQnLCAndHJ5JywgJ3ZvaWQnLCAndm9sYXRpbGUnLCAnd2hpbGUnLCAndmFyJyxcbiAgICAneWllbGQnLCAncmVjb3JkJywgJ3NlYWxlZCcsICdwZXJtaXRzJywgJ3RydWUnLCAnZmFsc2UnLCAnbnVsbCddO1xuXG4vKiogU2hhcmVkIGRlZmluaXRpb24tc3R5bGUgbG9jYXRpb24gcmVxdWVzdCB1c2VkIGJ5IGdvLXRvLWRlZmluaXRpb24vaW1wbGVtZW50YXRpb24vdHlwZS1kZWZpbml0aW9uLiAqL1xuYXN5bmMgZnVuY3Rpb24gcmVxdWVzdExvY2F0aW9ucyhtZXRob2Q6IHN0cmluZywgbW9kZWw6IG1vbmFjby5lZGl0b3IuSVRleHRNb2RlbCwgcG9zaXRpb246IG1vbmFjby5Qb3NpdGlvbikge1xuICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IHJlc3VsdDogTG9jYXRpb24gfCBMb2NhdGlvbltdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KG1ldGhvZCwge1xuICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICBwb3NpdGlvbjogICAgIHsgbGluZTogcG9zaXRpb24ubGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogcG9zaXRpb24uY29sdW1uIC0gMSB9LFxuICAgIH0pO1xuICAgIGlmICghcmVzdWx0KSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCBsb2NhdGlvbnMgPSBBcnJheS5pc0FycmF5KHJlc3VsdCkgPyByZXN1bHQgOiBbcmVzdWx0XTtcbiAgICByZXR1cm4gbG9jYXRpb25zLm1hcChsb2MgPT4gKHsgdXJpOiBtb25hY28uVXJpLnBhcnNlKGxvYy51cmkpLCByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhsb2MucmFuZ2UpIH0pKTtcbn1cblxuLyoqIFJlY3Vyc2l2ZWx5IG1hcHMgTFNQIGhpZXJhcmNoaWNhbCBEb2N1bWVudFN5bWJvbHMgdG8gTW9uYWNvJ3Mgc2hhcGUgKGtpbmRzIGFyZSAxLWJhc2VkIHZzIDAtYmFzZWQpLiAqL1xuZnVuY3Rpb24gbWFwRG9jdW1lbnRTeW1ib2xzKHN5bWJvbHM6IGFueVtdKTogbW9uYWNvLmxhbmd1YWdlcy5Eb2N1bWVudFN5bWJvbFtdIHtcbiAgICByZXR1cm4gKHN5bWJvbHMgPz8gW10pLm1hcChzID0+ICh7XG4gICAgICAgIG5hbWU6ICAgICAgICAgICBzLm5hbWUsXG4gICAgICAgIGRldGFpbDogICAgICAgICBzLmRldGFpbCA/PyAnJyxcbiAgICAgICAga2luZDogICAgICAgICAgIChzLmtpbmQgPz8gMSkgLSAxLFxuICAgICAgICB0YWdzOiAgICAgICAgICAgcy50YWdzID8/IFtdLFxuICAgICAgICByYW5nZTogICAgICAgICAgbHNwUmFuZ2VUb01vbmFjbyhzLnJhbmdlKSxcbiAgICAgICAgc2VsZWN0aW9uUmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28ocy5zZWxlY3Rpb25SYW5nZSA/PyBzLnJhbmdlKSxcbiAgICAgICAgY2hpbGRyZW46ICAgICAgIHMuY2hpbGRyZW4gPyBtYXBEb2N1bWVudFN5bWJvbHMocy5jaGlsZHJlbikgOiBbXSxcbiAgICB9KSk7XG59XG5cbmZ1bmN0aW9uIGZvbGRpbmdLaW5kKGtpbmQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IG1vbmFjby5sYW5ndWFnZXMuRm9sZGluZ1JhbmdlS2luZCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgRksgPSBtb25hY28ubGFuZ3VhZ2VzLkZvbGRpbmdSYW5nZUtpbmQ7XG4gICAgc3dpdGNoIChraW5kKSB7XG4gICAgICAgIGNhc2UgJ2NvbW1lbnQnOiByZXR1cm4gRksuQ29tbWVudDtcbiAgICAgICAgY2FzZSAnaW1wb3J0cyc6IHJldHVybiBGSy5JbXBvcnRzO1xuICAgICAgICBjYXNlICdyZWdpb24nOiAgcmV0dXJuIEZLLlJlZ2lvbjtcbiAgICAgICAgZGVmYXVsdDogICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxufVxuXG4vKiogRmxhdHRlbnMgYW4gTFNQIFNlbGVjdGlvblJhbmdlIHBhcmVudC1jaGFpbiBpbnRvIE1vbmFjbydzIGlubmVybW9zdC10by1vdXRlcm1vc3QgYXJyYXkuICovXG5mdW5jdGlvbiBmbGF0dGVuU2VsZWN0aW9uUmFuZ2Uoc2VsZWN0aW9uUmFuZ2U6IGFueSk6IG1vbmFjby5sYW5ndWFnZXMuU2VsZWN0aW9uUmFuZ2VbXSB7XG4gICAgY29uc3QgcmFuZ2VzOiBtb25hY28ubGFuZ3VhZ2VzLlNlbGVjdGlvblJhbmdlW10gPSBbXTtcbiAgICBsZXQgY3VycmVudCA9IHNlbGVjdGlvblJhbmdlO1xuICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICAgIHJhbmdlcy5wdXNoKHsgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28oY3VycmVudC5yYW5nZSkgfSk7XG4gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudDtcbiAgICB9XG4gICAgcmV0dXJuIHJhbmdlcztcbn1cblxuLyoqIE1hcHMgYSBKRFQuTFMgQ29kZUxlbnMgY29tbWFuZCB0byBhIE1vbmFjbyBjb21tYW5kLCB3aXJpbmcgdGhlIHJlZmVyZW5jZXMvaW1wbGVtZW50YXRpb25zIHBlZWsuICovXG5mdW5jdGlvbiBtYXBMZW5zQ29tbWFuZChjbWQ6IGFueSk6IG1vbmFjby5sYW5ndWFnZXMuQ29tbWFuZCB7XG4gICAgY29uc3QgYXJncyA9IGNtZC5hcmd1bWVudHMgPz8gW107XG4gICAgaWYgKChjbWQuY29tbWFuZCA9PT0gJ2phdmEuc2hvdy5yZWZlcmVuY2VzJyB8fCBjbWQuY29tbWFuZCA9PT0gJ2phdmEuc2hvdy5pbXBsZW1lbnRhdGlvbnMnKSAmJiBhcmdzLmxlbmd0aCA+PSAzKSB7XG4gICAgICAgIGNvbnN0IGxvY2F0aW9ucyA9IChhcmdzWzJdID8/IFtdKS5tYXAoKGw6IGFueSkgPT4gKHsgdXJpOiBtb25hY28uVXJpLnBhcnNlKGwudXJpKSwgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28obC5yYW5nZSkgfSkpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6ICAgICAgICAnZWRpdG9yLmFjdGlvbi5zaG93UmVmZXJlbmNlcycsXG4gICAgICAgICAgICB0aXRsZTogICAgIGNtZC50aXRsZSxcbiAgICAgICAgICAgIGFyZ3VtZW50czogW21vbmFjby5VcmkucGFyc2UoYXJnc1swXSksIHsgbGluZU51bWJlcjogYXJnc1sxXS5saW5lICsgMSwgY29sdW1uOiBhcmdzWzFdLmNoYXJhY3RlciArIDEgfSwgbG9jYXRpb25zXSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgaWQ6IE5PT1BfQ09NTUFORCwgdGl0bGU6IGNtZC50aXRsZSB9O1xufVxuXG50eXBlIExzcFJhbmdlID0geyBzdGFydDogeyBsaW5lOiBudW1iZXI7IGNoYXJhY3RlcjogbnVtYmVyIH07IGVuZDogeyBsaW5lOiBudW1iZXI7IGNoYXJhY3RlcjogbnVtYmVyIH0gfTtcblxuLyoqIE1vbmFjbyBjb21wbGV0aW9uIGl0ZW0gY2FycnlpbmcgdGhlIG9yaWdpbmF0aW5nIExTUCBpdGVtIHNvIHJlc29sdmUgY2FuIGZldGNoIGl0cyBpbXBvcnQgZWRpdHMuICovXG50eXBlIE1vbmFjb0NvbXBsZXRpb25JdGVtID0gbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbSAmIHsgX2xzcD86IENvbXBsZXRpb25JdGVtIH07XG5cbmZ1bmN0aW9uIHRleHRFZGl0VG9Nb25hY28oZWRpdDogVGV4dEVkaXQpOiBtb25hY28ubGFuZ3VhZ2VzLlRleHRFZGl0IHtcbiAgICByZXR1cm4geyByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhlZGl0LnJhbmdlKSwgdGV4dDogZWRpdC5uZXdUZXh0IH07XG59XG5cbmZ1bmN0aW9uIG1vbmFjb1JhbmdlVG9Mc3AocjogbW9uYWNvLklSYW5nZSk6IExzcFJhbmdlIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBzdGFydDogeyBsaW5lOiByLnN0YXJ0TGluZU51bWJlciAtIDEsIGNoYXJhY3Rlcjogci5zdGFydENvbHVtbiAtIDEgfSxcbiAgICAgICAgZW5kOiAgIHsgbGluZTogci5lbmRMaW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiByLmVuZENvbHVtbiAtIDEgfSxcbiAgICB9O1xufVxuXG5mdW5jdGlvbiBtb25hY29TZXZlcml0eVRvTHNwKHNldmVyaXR5OiBtb25hY28uTWFya2VyU2V2ZXJpdHkpOiBEaWFnbm9zdGljU2V2ZXJpdHkge1xuICAgIHN3aXRjaCAoc2V2ZXJpdHkpIHtcbiAgICAgICAgY2FzZSBtb25hY28uTWFya2VyU2V2ZXJpdHkuRXJyb3I6ICAgcmV0dXJuIERpYWdub3N0aWNTZXZlcml0eS5FcnJvcjtcbiAgICAgICAgY2FzZSBtb25hY28uTWFya2VyU2V2ZXJpdHkuV2FybmluZzogcmV0dXJuIERpYWdub3N0aWNTZXZlcml0eS5XYXJuaW5nO1xuICAgICAgICBjYXNlIG1vbmFjby5NYXJrZXJTZXZlcml0eS5JbmZvOiAgICByZXR1cm4gRGlhZ25vc3RpY1NldmVyaXR5LkluZm9ybWF0aW9uO1xuICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRGlhZ25vc3RpY1NldmVyaXR5LkhpbnQ7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBtYXJrZXJUb0xzcERpYWdub3N0aWMobTogbW9uYWNvLmVkaXRvci5JTWFya2VyRGF0YSk6IERpYWdub3N0aWMge1xuICAgIHJldHVybiB7XG4gICAgICAgIHJhbmdlOiAgICB7IHN0YXJ0OiB7IGxpbmU6IG0uc3RhcnRMaW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBtLnN0YXJ0Q29sdW1uIC0gMSB9LFxuICAgICAgICAgICAgICAgICAgICBlbmQ6ICAgeyBsaW5lOiBtLmVuZExpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IG0uZW5kQ29sdW1uIC0gMSB9IH0sXG4gICAgICAgIG1lc3NhZ2U6ICBtLm1lc3NhZ2UsXG4gICAgICAgIHNldmVyaXR5OiBtb25hY29TZXZlcml0eVRvTHNwKG0uc2V2ZXJpdHkpLFxuICAgICAgICBzb3VyY2U6ICAgbS5zb3VyY2UsXG4gICAgfSBhcyBEaWFnbm9zdGljO1xufVxuXG5mdW5jdGlvbiBsc3BDb2RlQWN0aW9uVG9Nb25hY28oYWN0aW9uOiBDb2RlQWN0aW9uIHwgQ29tbWFuZCk6IG1vbmFjby5sYW5ndWFnZXMuQ29kZUFjdGlvbiB7XG4gICAgY29uc3QgaXNDb21tYW5kID0gdHlwZW9mIChhY3Rpb24gYXMgQ29tbWFuZCkuY29tbWFuZCA9PT0gJ3N0cmluZyc7XG4gICAgY29uc3QgdGl0bGUgPSBhY3Rpb24udGl0bGVcbiAgICAgICAgPz8gKGlzQ29tbWFuZCA/IChhY3Rpb24gYXMgQ29tbWFuZCkuY29tbWFuZCA6IChhY3Rpb24gYXMgQ29kZUFjdGlvbikuY29tbWFuZD8udGl0bGUpXG4gICAgICAgID8/ICdBY3Rpb24nO1xuICAgIGNvbnN0IGtpbmQgPSBpc0NvbW1hbmQgPyAncXVpY2tmaXgnIDogKChhY3Rpb24gYXMgQ29kZUFjdGlvbikua2luZCA/PyAncXVpY2tmaXgnKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB0aXRsZSxcbiAgICAgICAga2luZCxcbiAgICAgICAgZGlhZ25vc3RpY3M6IFtdLFxuICAgICAgICBpc1ByZWZlcnJlZDogKGFjdGlvbiBhcyBDb2RlQWN0aW9uKS5pc1ByZWZlcnJlZCxcbiAgICAgICAgLy8gQXBwbHkgbGF6aWx5IHRocm91Z2ggb3VyIGNvbW1hbmQgc28gd2UgY2FuIHJlc29sdmUsIHJ1biBzZXJ2ZXIgY29tbWFuZHMgYW5kIGFwcGx5IGVkaXRzIHVuaWZvcm1seS5cbiAgICAgICAgY29tbWFuZDogeyBpZDogQVBQTFlfQUNUSU9OX0NPTU1BTkQsIHRpdGxlLCBhcmd1bWVudHM6IFthY3Rpb25dIH0sXG4gICAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gYXBwbHlDb2RlQWN0aW9uKGFjdGlvbjogQ29kZUFjdGlvbiB8IENvbW1hbmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIV9jb25uKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiAoYWN0aW9uIGFzIENvbW1hbmQpLmNvbW1hbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBhd2FpdCBydW5TZXJ2ZXJDb21tYW5kKGFjdGlvbiBhcyBDb21tYW5kKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzb2x2ZWQgPSBhY3Rpb24gYXMgQ29kZUFjdGlvbjtcbiAgICAgICAgaWYgKCFyZXNvbHZlZC5lZGl0ICYmIChyZXNvbHZlZCBhcyB7IGRhdGE/OiB1bmtub3duIH0pLmRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzb2x2ZWQgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgnY29kZUFjdGlvbi9yZXNvbHZlJywgcmVzb2x2ZWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXNvbHZlZC5lZGl0KSBhcHBseVdvcmtzcGFjZUVkaXQocmVzb2x2ZWQuZWRpdCk7XG4gICAgICAgIGlmIChyZXNvbHZlZC5jb21tYW5kKSBhd2FpdCBydW5TZXJ2ZXJDb21tYW5kKHJlc29sdmVkLmNvbW1hbmQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbamF2YS1sc3BdIGNvZGUgYWN0aW9uIGZhaWxlZDonLCAoZSBhcyBFcnJvcik/Lm1lc3NhZ2UgPz8gZSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBpc1dvcmtzcGFjZUVkaXQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBXb3Jrc3BhY2VFZGl0IHtcbiAgICByZXR1cm4gISF2YWx1ZSAmJiAoISEodmFsdWUgYXMgV29ya3NwYWNlRWRpdCkuY2hhbmdlcyB8fCAhISh2YWx1ZSBhcyBXb3Jrc3BhY2VFZGl0KS5kb2N1bWVudENoYW5nZXMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5TZXJ2ZXJDb21tYW5kKGNtZDogQ29tbWFuZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghX2Nvbm4gfHwgIWNtZD8uY29tbWFuZCkgcmV0dXJuO1xuICAgIGlmIChHRU5FUkFURVtjbWQuY29tbWFuZF0pIHtcbiAgICAgICAgYXdhaXQgcnVuR2VuZXJhdGUoY21kLmNvbW1hbmQsIGNtZC5hcmd1bWVudHMgPz8gW10pO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd3b3Jrc3BhY2UvZXhlY3V0ZUNvbW1hbmQnLCB7IGNvbW1hbmQ6IGNtZC5jb21tYW5kLCBhcmd1bWVudHM6IGNtZC5hcmd1bWVudHMgPz8gW10gfSk7XG4gICAgaWYgKGlzV29ya3NwYWNlRWRpdChyZXN1bHQpKSBhcHBseVdvcmtzcGFjZUVkaXQocmVzdWx0KTtcbn1cblxuaW50ZXJmYWNlIEdlbmVyYXRlU3BlYyB7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICBzdGF0dXM6IHN0cmluZztcbiAgICBnZW5lcmF0ZTogc3RyaW5nO1xuICAgIG1lbWJlcnM6IChzdGF0dXM6IGFueSkgPT4gQXJyYXk8eyBsYWJlbDogc3RyaW5nOyByZWY6IGFueSB9PjtcbiAgICBidWlsZEFyZ3M6IChwcm9tcHRBcmdzOiBhbnlbXSwgc3RhdHVzOiBhbnksIHNlbGVjdGVkOiBhbnlbXSkgPT4gYW55W107XG59XG5cbi8qKiBNZW1iZXItbmFtZWQgZmllbGRzIFx1MjE5MiBwaWNrZXIgbGFiZWxzLiAqL1xuZnVuY3Rpb24gZmllbGRMYWJlbChmOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSBmPy5uYW1lID8/IGY/LmZpZWxkTmFtZSA/PyAnJztcbiAgICBjb25zdCB0eXBlID0gZj8udHlwZSA/PyBmPy50eXBlTmFtZTtcbiAgICByZXR1cm4gdHlwZSA/IGAke25hbWV9OiAke3R5cGV9YCA6IGAke25hbWV9YDtcbn1cblxuLyoqXG4gKiBUaGUgSkRULkxTIHNvdXJjZS1nZW5lcmF0aW9uIGNvbW1hbmRzIChjb25zdHJ1Y3RvcnMsIGdldHRlcnMvc2V0dGVycywgdG9TdHJpbmcsIGhhc2hDb2RlL2VxdWFscykuXG4gKiBFYWNoIG1hcHMgdGhlIGNsaWVudCBcIipQcm9tcHRcIiBjb21tYW5kIHRvIHRoZSBzZXJ2ZXIgc3RhdHVzICsgZ2VuZXJhdGUgZGVsZWdhdGUgY29tbWFuZHM7IHRoZSBzdGF0dXNcbiAqIGNhbGwgeWllbGRzIHRoZSBjYW5kaWRhdGUgZmllbGRzIHNob3duIGluIHRoZSBtZW1iZXIgcGlja2VyLCB0aGUgZ2VuZXJhdGUgY2FsbCByZXR1cm5zIHRoZSBlZGl0LlxuICovXG5jb25zdCBHRU5FUkFURTogUmVjb3JkPHN0cmluZywgR2VuZXJhdGVTcGVjPiA9IHtcbiAgICAnamF2YS5hY3Rpb24uZ2VuZXJhdGVDb25zdHJ1Y3RvcnNQcm9tcHQnOiB7XG4gICAgICAgIGxhYmVsOiAnU2VsZWN0IGZpZWxkcyBhbmQgY29uc3RydWN0b3JzJyxcbiAgICAgICAgc3RhdHVzOiAnamF2YS5hY3Rpb24uY2hlY2tDb25zdHJ1Y3RvcnNTdGF0dXMnLFxuICAgICAgICBnZW5lcmF0ZTogJ2phdmEuYWN0aW9uLmdlbmVyYXRlQ29uc3RydWN0b3JzJyxcbiAgICAgICAgbWVtYmVyczogKHMpID0+IChzPy5maWVsZHMgPz8gW10pLm1hcCgoZjogYW55KSA9PiAoeyBsYWJlbDogZmllbGRMYWJlbChmKSwgcmVmOiBmIH0pKSxcbiAgICAgICAgYnVpbGRBcmdzOiAoYXJncywgcywgc2VsKSA9PiBbYXJnc1swXSwgeyBjb25zdHJ1Y3RvcnM6IHM/LmNvbnN0cnVjdG9ycyA/PyBbXSwgZmllbGRzOiBzZWwubWFwKG0gPT4gbS5yZWYpIH1dLFxuICAgIH0sXG4gICAgJ2phdmEuYWN0aW9uLmdlbmVyYXRlVG9TdHJpbmdQcm9tcHQnOiB7XG4gICAgICAgIGxhYmVsOiAnU2VsZWN0IGZpZWxkcyB0byBpbmNsdWRlIGluIHRvU3RyaW5nKCknLFxuICAgICAgICBzdGF0dXM6ICdqYXZhLmFjdGlvbi5jaGVja1RvU3RyaW5nU3RhdHVzJyxcbiAgICAgICAgZ2VuZXJhdGU6ICdqYXZhLmFjdGlvbi5nZW5lcmF0ZVRvU3RyaW5nJyxcbiAgICAgICAgbWVtYmVyczogKHMpID0+IChzPy5maWVsZHMgPz8gW10pLm1hcCgoZjogYW55KSA9PiAoeyBsYWJlbDogZmllbGRMYWJlbChmKSwgcmVmOiBmIH0pKSxcbiAgICAgICAgYnVpbGRBcmdzOiAoYXJncywgX3MsIHNlbCkgPT4gW2FyZ3NbMF0sIHNlbC5tYXAobSA9PiBtLnJlZildLFxuICAgIH0sXG4gICAgJ2phdmEuYWN0aW9uLmhhc2hDb2RlRXF1YWxzUHJvbXB0Jzoge1xuICAgICAgICBsYWJlbDogJ1NlbGVjdCBmaWVsZHMgZm9yIGhhc2hDb2RlKCkgYW5kIGVxdWFscygpJyxcbiAgICAgICAgc3RhdHVzOiAnamF2YS5hY3Rpb24uY2hlY2tIYXNoQ29kZUVxdWFsc1N0YXR1cycsXG4gICAgICAgIGdlbmVyYXRlOiAnamF2YS5hY3Rpb24uZ2VuZXJhdGVIYXNoQ29kZUVxdWFscycsXG4gICAgICAgIG1lbWJlcnM6IChzKSA9PiAocz8uZmllbGRzID8/IFtdKS5tYXAoKGY6IGFueSkgPT4gKHsgbGFiZWw6IGZpZWxkTGFiZWwoZiksIHJlZjogZiB9KSksXG4gICAgICAgIGJ1aWxkQXJnczogKGFyZ3MsIF9zLCBzZWwpID0+IFthcmdzWzBdLCBzZWwubWFwKG0gPT4gbS5yZWYpLCBmYWxzZV0sXG4gICAgfSxcbiAgICAnamF2YS5hY3Rpb24uZ2VuZXJhdGVBY2Nlc3NvcnNQcm9tcHQnOiB7XG4gICAgICAgIGxhYmVsOiAnU2VsZWN0IGZpZWxkcyB0byBnZW5lcmF0ZSBnZXR0ZXJzIGFuZCBzZXR0ZXJzJyxcbiAgICAgICAgc3RhdHVzOiAnamF2YS5hY3Rpb24uY2hlY2tBY2Nlc3NvcnNTdGF0dXMnLFxuICAgICAgICBnZW5lcmF0ZTogJ2phdmEuYWN0aW9uLmdlbmVyYXRlQWNjZXNzb3JzJyxcbiAgICAgICAgbWVtYmVyczogKHMpID0+IChzPy5hY2Nlc3NvcnMgPz8gcyA/PyBbXSkubWFwKChhOiBhbnkpID0+ICh7IGxhYmVsOiBmaWVsZExhYmVsKGEpLCByZWY6IGEgfSkpLFxuICAgICAgICBidWlsZEFyZ3M6IChhcmdzLCBfcywgc2VsKSA9PiBbYXJnc1swXSwgc2VsLm1hcChtID0+IG0ucmVmKV0sXG4gICAgfSxcbiAgICAnamF2YS5hY3Rpb24ub3ZlcnJpZGVNZXRob2RzUHJvbXB0Jzoge1xuICAgICAgICBsYWJlbDogJ1NlbGVjdCBtZXRob2RzIHRvIG92ZXJyaWRlIG9yIGltcGxlbWVudCcsXG4gICAgICAgIHN0YXR1czogJ2phdmEuYWN0aW9uLmxpc3RPdmVycmlkYWJsZU1ldGhvZHMnLFxuICAgICAgICBnZW5lcmF0ZTogJ2phdmEuYWN0aW9uLmFkZE92ZXJyaWRhYmxlTWV0aG9kcycsXG4gICAgICAgIG1lbWJlcnM6IChzKSA9PiAocz8ubWV0aG9kcyA/PyBbXSkubWFwKChtOiBhbnkpID0+ICh7XG4gICAgICAgICAgICBsYWJlbDogYCR7bS5uYW1lfSgkeyhtLnBhcmFtZXRlcnMgPz8gW10pLmpvaW4oJywgJyl9KSR7bS5kZWNsYXJpbmdDbGFzcyA/ICcgOiAnICsgbS5kZWNsYXJpbmdDbGFzcyA6ICcnfWAsXG4gICAgICAgICAgICByZWY6IG0sXG4gICAgICAgIH0pKSxcbiAgICAgICAgYnVpbGRBcmdzOiAoYXJncywgc3RhdHVzLCBzZWwpID0+IFthcmdzWzBdLCB7IG92ZXJyaWRhYmxlTWV0aG9kczogc2VsLm1hcChtID0+IG0ucmVmKSwgdHlwZTogc3RhdHVzPy50eXBlIH1dLFxuICAgIH0sXG59O1xuXG5hc3luYyBmdW5jdGlvbiBydW5HZW5lcmF0ZShwcm9tcHRJZDogc3RyaW5nLCBhcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghX2Nvbm4pIHJldHVybjtcbiAgICBjb25zdCBzcGVjID0gR0VORVJBVEVbcHJvbXB0SWRdO1xuICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd3b3Jrc3BhY2UvZXhlY3V0ZUNvbW1hbmQnLCB7IGNvbW1hbmQ6IHNwZWMuc3RhdHVzLCBhcmd1bWVudHM6IGFyZ3MgfSk7XG4gICAgaWYgKCFzdGF0dXMpIHJldHVybjtcbiAgICBjb25zdCBtZW1iZXJzID0gc3BlYy5tZW1iZXJzKHN0YXR1cyk7XG4gICAgbGV0IHNlbGVjdGVkID0gbWVtYmVycztcbiAgICBjb25zdCBwaWNrZXIgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLmphdmFMc3BNZW1iZXJQaWNrZXI7XG4gICAgaWYgKG1lbWJlcnMubGVuZ3RoICYmIHR5cGVvZiBwaWNrZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY29uc3QgY2hvc2VuOiBzdHJpbmdbXSB8IG51bGwgPSBhd2FpdCBwaWNrZXIoc3BlYy5sYWJlbCwgbWVtYmVycy5tYXAobSA9PiBtLmxhYmVsKSk7XG4gICAgICAgIGlmIChjaG9zZW4gPT09IG51bGwpIHJldHVybjsgLy8gdXNlciBjYW5jZWxsZWQgdGhlIGRpYWxvZ1xuICAgICAgICBzZWxlY3RlZCA9IG1lbWJlcnMuZmlsdGVyKG0gPT4gY2hvc2VuLmluY2x1ZGVzKG0ubGFiZWwpKTtcbiAgICB9XG4gICAgY29uc3QgZWRpdCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd3b3Jrc3BhY2UvZXhlY3V0ZUNvbW1hbmQnLCB7XG4gICAgICAgIGNvbW1hbmQ6IHNwZWMuZ2VuZXJhdGUsXG4gICAgICAgIGFyZ3VtZW50czogc3BlYy5idWlsZEFyZ3MoYXJncywgc3RhdHVzLCBzZWxlY3RlZCksXG4gICAgfSk7XG4gICAgaWYgKGlzV29ya3NwYWNlRWRpdChlZGl0KSkgYXBwbHlXb3Jrc3BhY2VFZGl0KGVkaXQpO1xufVxuXG4vKiogR3JvdXBzIGEgd29ya3NwYWNlIGVkaXQncyB0ZXh0IGVkaXRzIGJ5IGRvY3VtZW50IGFuZCBhcHBsaWVzIHRoZW0gaW4gcGxhY2UgdG8gb3BlbiBNb25hY28gbW9kZWxzLiAqL1xuZnVuY3Rpb24gYXBwbHlXb3Jrc3BhY2VFZGl0KGVkaXQ6IFdvcmtzcGFjZUVkaXQgfCBudWxsIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0KSByZXR1cm47XG4gICAgY29uc3QgYnlVcmk6IFJlY29yZDxzdHJpbmcsIFRleHRFZGl0W10+ID0ge307XG4gICAgaWYgKGVkaXQuY2hhbmdlcykge1xuICAgICAgICBmb3IgKGNvbnN0IHVyaSBpbiBlZGl0LmNoYW5nZXMpIGJ5VXJpW3VyaV0gPSAoYnlVcmlbdXJpXSA/PyBbXSkuY29uY2F0KGVkaXQuY2hhbmdlc1t1cmldKTtcbiAgICB9XG4gICAgaWYgKGVkaXQuZG9jdW1lbnRDaGFuZ2VzKSB7XG4gICAgICAgIGZvciAoY29uc3QgZGMgb2YgZWRpdC5kb2N1bWVudENoYW5nZXMgYXMgYW55W10pIHtcbiAgICAgICAgICAgIGlmIChkYz8udGV4dERvY3VtZW50Py51cmkgJiYgQXJyYXkuaXNBcnJheShkYy5lZGl0cykpIHtcbiAgICAgICAgICAgICAgICBieVVyaVtkYy50ZXh0RG9jdW1lbnQudXJpXSA9IChieVVyaVtkYy50ZXh0RG9jdW1lbnQudXJpXSA/PyBbXSkuY29uY2F0KGRjLmVkaXRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IHVyaSBpbiBieVVyaSkge1xuICAgICAgICBjb25zdCBtb2RlbCA9IG1vbmFjby5lZGl0b3IuZ2V0TW9kZWxzKCkuZmluZChtID0+IG0udXJpLnRvU3RyaW5nKCkgPT09IHVyaSk7XG4gICAgICAgIGlmICghbW9kZWwpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBvcHMgPSBieVVyaVt1cmldLm1hcChlID0+ICh7IHJhbmdlOiBsc3BSYW5nZVRvTW9uYWNvKGUucmFuZ2UpLCB0ZXh0OiBlLm5ld1RleHQsIGZvcmNlTW92ZU1hcmtlcnM6IHRydWUgfSkpO1xuICAgICAgICBtb2RlbC5wdXNoRWRpdE9wZXJhdGlvbnMoW10sIG9wcywgKCkgPT4gbnVsbCk7XG4gICAgfVxufVxuXG4vKiogQ29udmVydHMgYW4gTFNQIHdvcmtzcGFjZSBlZGl0IGludG8gdGhlIE1vbmFjbyBzaGFwZSByZXR1cm5lZCBieSB0aGUgcmVuYW1lIHByb3ZpZGVyLiAqL1xuZnVuY3Rpb24gd29ya3NwYWNlRWRpdFRvTW9uYWNvKGVkaXQ6IFdvcmtzcGFjZUVkaXQgfCBudWxsKTogbW9uYWNvLmxhbmd1YWdlcy5Xb3Jrc3BhY2VFZGl0IHtcbiAgICBjb25zdCBlZGl0czogYW55W10gPSBbXTtcbiAgICBjb25zdCBwdXNoID0gKHVyaTogc3RyaW5nLCBsaXN0OiBUZXh0RWRpdFtdKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgZSBvZiBsaXN0KSB7XG4gICAgICAgICAgICBlZGl0cy5wdXNoKHsgcmVzb3VyY2U6IG1vbmFjby5VcmkucGFyc2UodXJpKSwgdGV4dEVkaXQ6IHsgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28oZS5yYW5nZSksIHRleHQ6IGUubmV3VGV4dCB9LCB2ZXJzaW9uSWQ6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgaWYgKGVkaXQ/LmNoYW5nZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCB1cmkgaW4gZWRpdC5jaGFuZ2VzKSBwdXNoKHVyaSwgZWRpdC5jaGFuZ2VzW3VyaV0pO1xuICAgIH1cbiAgICBpZiAoZWRpdD8uZG9jdW1lbnRDaGFuZ2VzKSB7XG4gICAgICAgIGZvciAoY29uc3QgZGMgb2YgZWRpdC5kb2N1bWVudENoYW5nZXMgYXMgYW55W10pIHtcbiAgICAgICAgICAgIGlmIChkYz8udGV4dERvY3VtZW50Py51cmkgJiYgQXJyYXkuaXNBcnJheShkYy5lZGl0cykpIHB1c2goZGMudGV4dERvY3VtZW50LnVyaSwgZGMuZWRpdHMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGVkaXRzIH07XG59XG5cbi8qKiBNYXBzIGEgdmlydHVhbCBlZGl0b3IgVVJJIGJhY2sgdG8gdGhlIElERSB3b3Jrc3BhY2UgcGF0aCAoe0Bjb2RlIC93cy9wcm9qLy4uLn0pLiAqL1xuZnVuY3Rpb24gdXJpVG9Xb3Jrc3BhY2VQYXRoKHVyaTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCF1cmkuc3RhcnRzV2l0aChWSVJUVUFMX0ZJTEVfUFJFRklYKSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh1cmkuc3Vic3RyaW5nKFZJUlRVQUxfRklMRV9QUkVGSVgubGVuZ3RoKSk7XG59XG5cbi8qKiBSZWFkcyBhIHdvcmtzcGFjZSBmaWxlJ3MgY3VycmVudCB0ZXh0IG92ZXIgdGhlIElERSBSRVNUIEFQSS4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZldGNoV29ya3NwYWNlRmlsZVRleHQoaWRlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvc2VydmljZXMvaWRlL3dvcmtzcGFjZXMnICsgaWRlUGF0aCwgeyBoZWFkZXJzOiB7ICdYLVJlcXVlc3RlZC1XaXRoJzogJ0ZldGNoJyB9IH0pO1xuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgcmVhZCAke2lkZVBhdGh9IChIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfSlgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTtcbn1cblxuLyoqIEFwcGxpZXMgTFNQIHRleHQgZWRpdHMgdG8gYSBzdHJpbmcuIE9mZnNldHMgYXJlIHJlc29sdmVkIGFnYWluc3QgdGhlIG9yaWdpbmFsIHRleHQgYW5kIGVkaXRzIGFyZVxuICogIGFwcGxpZWQgZnJvbSB0aGUgZW5kIGJhY2t3YXJkcywgc28gZWFybGllciBvZmZzZXRzIHN0YXkgdmFsaWQuICovXG5mdW5jdGlvbiBhcHBseUVkaXRzVG9UZXh0KHRleHQ6IHN0cmluZywgZWRpdHM6IFRleHRFZGl0W10pOiBzdHJpbmcge1xuICAgIGNvbnN0IGxpbmVTdGFydHMgPSBbMF07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICh0ZXh0LmNoYXJDb2RlQXQoaSkgPT09IDEwIC8qIFxcbiAqLykgbGluZVN0YXJ0cy5wdXNoKGkgKyAxKTtcbiAgICB9XG4gICAgY29uc3Qgb2Zmc2V0ID0gKHA6IHsgbGluZTogbnVtYmVyOyBjaGFyYWN0ZXI6IG51bWJlciB9KSA9PiAobGluZVN0YXJ0c1twLmxpbmVdID8/IHRleHQubGVuZ3RoKSArIHAuY2hhcmFjdGVyO1xuICAgIGNvbnN0IG9yZGVyZWQgPSBlZGl0cy5zbGljZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IG9mZnNldChiLnJhbmdlLnN0YXJ0KSAtIG9mZnNldChhLnJhbmdlLnN0YXJ0KSk7XG4gICAgbGV0IHJlc3VsdCA9IHRleHQ7XG4gICAgZm9yIChjb25zdCBlIG9mIG9yZGVyZWQpIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnNsaWNlKDAsIG9mZnNldChlLnJhbmdlLnN0YXJ0KSkgKyBlLm5ld1RleHQgKyByZXN1bHQuc2xpY2Uob2Zmc2V0KGUucmFuZ2UuZW5kKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQXBwbGllcyBhIEpEVC5MUyByZW5hbWUge0BsaW5rIFdvcmtzcGFjZUVkaXR9IGFjcm9zcyB0aGUgd2hvbGUgd29ya3NwYWNlOiB0ZXh0IGVkaXRzIGluIGV2ZXJ5XG4gKiBhZmZlY3RlZCBmaWxlIHBsdXMgYW55IHtAY29kZSBSZW5hbWVGaWxlfSBvcGVyYXRpb24gKGEgcHVibGljLXR5cGUgcmVuYW1lIHJlbmFtZXMgaXRzIG93blxuICoge0Bjb2RlIC5qYXZhfSBmaWxlKS4gVGhlIGN1cnJlbnQgZmlsZSdzIGVkaXRzIGdvIHRocm91Z2ggdGhlIGxpdmUgTW9uYWNvIG1vZGVsOyB0aGUgcmVzdCBhcmUgcmVhZCxcbiAqIGVkaXRlZCBhbmQgd3JpdHRlbiBiYWNrIG92ZXIgUkVTVC4gUGVyc2lzdGVuY2UgKENTUkYtZ3VhcmRlZCB3cml0ZXMsIHRoZSB0YWIgc3dpdGNoIHdoZW4gdGhlIGN1cnJlbnRcbiAqIGZpbGUgaXMgcmVuYW1lZCwgYW5kIHJlbG9hZGluZyBvdGhlciBvcGVuIGVkaXRvcnMpIGlzIGRlbGVnYXRlZCB0byB0aGUgSURFIHZpYSBqYXZhTHNwUGVyc2lzdFJlbmFtZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYXBwbHlSZW5hbWVBY3Jvc3NXb3Jrc3BhY2UobW9kZWw6IG1vbmFjby5lZGl0b3IuSVRleHRNb2RlbCwgZWRpdDogV29ya3NwYWNlRWRpdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGN1cnJlbnRVcmkgPSBtb2RlbC51cmkudG9TdHJpbmcoKTtcbiAgICBjb25zdCB0ZXh0QnlVcmk6IFJlY29yZDxzdHJpbmcsIFRleHRFZGl0W10+ID0ge307XG4gICAgY29uc3QgcmVuYW1lQnlVcmk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgIGlmIChlZGl0LmNoYW5nZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCB1cmkgaW4gZWRpdC5jaGFuZ2VzKSB0ZXh0QnlVcmlbdXJpXSA9ICh0ZXh0QnlVcmlbdXJpXSA/PyBbXSkuY29uY2F0KGVkaXQuY2hhbmdlc1t1cmldKTtcbiAgICB9XG4gICAgaWYgKGVkaXQuZG9jdW1lbnRDaGFuZ2VzKSB7XG4gICAgICAgIGZvciAoY29uc3QgZGMgb2YgZWRpdC5kb2N1bWVudENoYW5nZXMgYXMgYW55W10pIHtcbiAgICAgICAgICAgIGlmIChkYz8ua2luZCA9PT0gJ3JlbmFtZScgJiYgZGMub2xkVXJpICYmIGRjLm5ld1VyaSkge1xuICAgICAgICAgICAgICAgIHJlbmFtZUJ5VXJpW2RjLm9sZFVyaV0gPSBkYy5uZXdVcmk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRjPy50ZXh0RG9jdW1lbnQ/LnVyaSAmJiBBcnJheS5pc0FycmF5KGRjLmVkaXRzKSkge1xuICAgICAgICAgICAgICAgIHRleHRCeVVyaVtkYy50ZXh0RG9jdW1lbnQudXJpXSA9ICh0ZXh0QnlVcmlbZGMudGV4dERvY3VtZW50LnVyaV0gPz8gW10pLmNvbmNhdChkYy5lZGl0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBwYXlsb2FkOiB7XG4gICAgICAgIGN1cnJlbnRQYXRoOiBzdHJpbmcgfCBudWxsO1xuICAgICAgICBjdXJyZW50Q29udGVudDogc3RyaW5nIHwgbnVsbDtcbiAgICAgICAgY3VycmVudE5ld1BhdGg6IHN0cmluZyB8IG51bGw7XG4gICAgICAgIHdyaXRlczogQXJyYXk8eyBwYXRoOiBzdHJpbmcgfCBudWxsOyBjb250ZW50OiBzdHJpbmcgfT47XG4gICAgICAgIHJlbmFtZXM6IEFycmF5PHsgb2xkUGF0aDogc3RyaW5nIHwgbnVsbDsgbmV3UGF0aDogc3RyaW5nIHwgbnVsbDsgY29udGVudDogc3RyaW5nIH0+O1xuICAgIH0gPSB7IGN1cnJlbnRQYXRoOiB1cmlUb1dvcmtzcGFjZVBhdGgoY3VycmVudFVyaSksIGN1cnJlbnRDb250ZW50OiBudWxsLCBjdXJyZW50TmV3UGF0aDogbnVsbCwgd3JpdGVzOiBbXSwgcmVuYW1lczogW10gfTtcblxuICAgIGNvbnN0IHVyaXMgPSBuZXcgU2V0PHN0cmluZz4oWy4uLk9iamVjdC5rZXlzKHRleHRCeVVyaSksIC4uLk9iamVjdC5rZXlzKHJlbmFtZUJ5VXJpKV0pO1xuICAgIGZvciAoY29uc3QgdXJpIG9mIHVyaXMpIHtcbiAgICAgICAgY29uc3QgZWRpdHMgPSB0ZXh0QnlVcmlbdXJpXSA/PyBbXTtcbiAgICAgICAgbGV0IGNvbnRlbnQ6IHN0cmluZztcbiAgICAgICAgaWYgKHVyaSA9PT0gY3VycmVudFVyaSkge1xuICAgICAgICAgICAgaWYgKGVkaXRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIG1vZGVsLnB1c2hFZGl0T3BlcmF0aW9ucyhbXSwgZWRpdHMubWFwKGUgPT4gKHsgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28oZS5yYW5nZSksIHRleHQ6IGUubmV3VGV4dCwgZm9yY2VNb3ZlTWFya2VyczogdHJ1ZSB9KSksICgpID0+IG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGVudCA9IG1vZGVsLmdldFZhbHVlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBhd2FpdCBmZXRjaFdvcmtzcGFjZUZpbGVUZXh0KHVyaVRvV29ya3NwYWNlUGF0aCh1cmkpID8/IHVyaSk7XG4gICAgICAgICAgICBjb250ZW50ID0gZWRpdHMubGVuZ3RoID8gYXBwbHlFZGl0c1RvVGV4dChzb3VyY2UsIGVkaXRzKSA6IHNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdVcmkgPSByZW5hbWVCeVVyaVt1cmldO1xuICAgICAgICBpZiAodXJpID09PSBjdXJyZW50VXJpKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmN1cnJlbnRDb250ZW50ID0gY29udGVudDtcbiAgICAgICAgICAgIHBheWxvYWQuY3VycmVudE5ld1BhdGggPSBuZXdVcmkgPyB1cmlUb1dvcmtzcGFjZVBhdGgobmV3VXJpKSA6IG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAobmV3VXJpKSB7XG4gICAgICAgICAgICBwYXlsb2FkLnJlbmFtZXMucHVzaCh7IG9sZFBhdGg6IHVyaVRvV29ya3NwYWNlUGF0aCh1cmkpLCBuZXdQYXRoOiB1cmlUb1dvcmtzcGFjZVBhdGgobmV3VXJpKSwgY29udGVudCB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBheWxvYWQud3JpdGVzLnB1c2goeyBwYXRoOiB1cmlUb1dvcmtzcGFjZVBhdGgodXJpKSwgY29udGVudCB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IChnbG9iYWxUaGlzIGFzIGFueSkuamF2YUxzcFBlcnNpc3RSZW5hbWUocGF5bG9hZCk7XG59XG5cbmZ1bmN0aW9uIGpkdGxzU2V0dGluZ3MoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgamF2YToge1xuICAgICAgICAgICAgaW1wb3J0OiB7XG4gICAgICAgICAgICAgICAgbWF2ZW46ICAgICAgeyBlbmFibGVkOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgZ3JhZGxlOiAgICAgeyBlbmFibGVkOiBmYWxzZSB9LFxuICAgICAgICAgICAgICAgIGV4Y2x1c2lvbnM6IFsnKiovbm9kZV9tb2R1bGVzLyoqJywgJyoqLy5tZXRhZGF0YS8qKicsICcqKi9hcmNoZXR5cGUtcmVzb3VyY2VzLyoqJ10sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYXV0b2J1aWxkOiB7IGVuYWJsZWQ6IHRydWUgfSxcbiAgICAgICAgICAgIGNvbXBsZXRpb246IHtcbiAgICAgICAgICAgICAgICBvdmVyd3JpdGU6ICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICBndWVzc01ldGhvZEFyZ3VtZW50czogZmFsc2UsXG4gICAgICAgICAgICAgICAgZmlsdGVyZWRUeXBlczogW1xuICAgICAgICAgICAgICAgICAgICAnY29tLnN1bi4qJywgJ3N1bi4qJywgJ2pkay4qJyxcbiAgICAgICAgICAgICAgICAgICAgJ29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC4qJyxcbiAgICAgICAgICAgICAgICAgICAgJ29yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuKicsXG4gICAgICAgICAgICAgICAgICAgICdvcmcuZWNsaXBzZS5vc2dpLmludGVybmFsLionLFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgaW1wb3J0T3JkZXI6IFsnamF2YScsICdqYXZheCcsICdvcmcnLCAnY29tJywgJyddLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNpZ25hdHVyZUhlbHA6ICB7IGVuYWJsZWQ6IHRydWUgfSxcbiAgICAgICAgICAgIGZvcm1hdDogICAgICAgICB7IGVuYWJsZWQ6IHRydWUgfSxcbiAgICAgICAgICAgIHNhdmVBY3Rpb25zOiAgICB7IG9yZ2FuaXplSW1wb3J0czogZmFsc2UgfSxcbiAgICAgICAgICAgIGlubGF5SGludHM6ICAgICB7IHBhcmFtZXRlck5hbWVzOiB7IGVuYWJsZWQ6ICdhbGwnIH0gfSxcbiAgICAgICAgICAgIHJlZmVyZW5jZXNDb2RlTGVuczogICAgIHsgZW5hYmxlZDogdHJ1ZSB9LFxuICAgICAgICAgICAgaW1wbGVtZW50YXRpb25zQ29kZUxlbnM6IHsgZW5hYmxlZDogdHJ1ZSB9LFxuICAgICAgICB9LFxuICAgIH07XG59XG4iLCAiLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgMjAyNCBUeXBlRm94IGFuZCBvdGhlcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMSUNFTlNFIGluIHRoZSBwYWNrYWdlIHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuaW1wb3J0IHsgRGlzcG9zYWJsZSB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcblxuZXhwb3J0IGNsYXNzIERpc3Bvc2FibGVDb2xsZWN0aW9uIGltcGxlbWVudHMgRGlzcG9zYWJsZSB7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGRpc3Bvc2FibGVzOiBEaXNwb3NhYmxlW10gPSBbXTtcblxuICAgIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgICAgIHdoaWxlICh0aGlzLmRpc3Bvc2FibGVzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgdGhpcy5kaXNwb3NhYmxlcy5wb3AoKSEuZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVzaChkaXNwb3NhYmxlOiBEaXNwb3NhYmxlKTogRGlzcG9zYWJsZSB7XG4gICAgICAgIGNvbnN0IGRpc3Bvc2FibGVzID0gdGhpcy5kaXNwb3NhYmxlcztcbiAgICAgICAgZGlzcG9zYWJsZXMucHVzaChkaXNwb3NhYmxlKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBkaXNwb3NhYmxlcy5pbmRleE9mKGRpc3Bvc2FibGUpO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgZGlzcG9zYWJsZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxufVxuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjQgVHlwZUZveCBhbmQgb3RoZXJzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTElDRU5TRSBpbiB0aGUgcGFja2FnZSByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbmltcG9ydCB7IERpc3Bvc2FibGUgfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG5pbXBvcnQgdHlwZSB7IElDb25uZWN0aW9uIH0gZnJvbSAnLi4vc2VydmVyL2Nvbm5lY3Rpb24uanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElXZWJTb2NrZXQgZXh0ZW5kcyBEaXNwb3NhYmxlIHtcbiAgICBzZW5kKGNvbnRlbnQ6IHN0cmluZyk6IHZvaWQ7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBvbk1lc3NhZ2UoY2I6IChkYXRhOiBhbnkpID0+IHZvaWQpOiB2b2lkO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgb25FcnJvcihjYjogKHJlYXNvbjogYW55KSA9PiB2b2lkKTogdm9pZDtcbiAgICBvbkNsb3NlKGNiOiAoY29kZTogbnVtYmVyLCByZWFzb246IHN0cmluZykgPT4gdm9pZCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVdlYlNvY2tldENvbm5lY3Rpb24gZXh0ZW5kcyBJQ29ubmVjdGlvbiB7XG4gICAgcmVhZG9ubHkgc29ja2V0OiBJV2ViU29ja2V0O1xufVxuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjQgVHlwZUZveCBhbmQgb3RoZXJzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTElDRU5TRSBpbiB0aGUgcGFja2FnZSByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbmltcG9ydCB7IERpc3Bvc2FibGUgfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG4vLyBUT0RPOiBVc2UgZW52aXJvbm1lbnQtc3BlY2lmaWMgaW1wb3J0cyAodnNjb2RlLWpzb25ycGMvYnJvd3NlciBvciB2c2NvZGUtanNvbnJwYy9ub2RlKVxuLy8gd2hlbiB1cGdyYWRpbmcgdG8gdnNjb2RlLWpzb25ycGNAOS54LngtbmV4dC5YIHdoaWNoIHN1cHBvcnRzIHByb3BlciBleHBvcnQgbWFwc1xuaW1wb3J0IHsgdHlwZSBEYXRhQ2FsbGJhY2ssIEFic3RyYWN0TWVzc2FnZVJlYWRlciwgTWVzc2FnZVJlYWRlciB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcbmltcG9ydCB0eXBlIHsgSVdlYlNvY2tldCB9IGZyb20gJy4vc29ja2V0LmpzJztcblxuZXhwb3J0IGNsYXNzIFdlYlNvY2tldE1lc3NhZ2VSZWFkZXIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VSZWFkZXIgaW1wbGVtZW50cyBNZXNzYWdlUmVhZGVyIHtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgc29ja2V0OiBJV2ViU29ja2V0O1xuICAgIHByb3RlY3RlZCBzdGF0ZTogJ2luaXRpYWwnIHwgJ2xpc3RlbmluZycgfCAnY2xvc2VkJyA9ICdpbml0aWFsJztcbiAgICBwcm90ZWN0ZWQgY2FsbGJhY2s6IERhdGFDYWxsYmFjayB8IHVuZGVmaW5lZDtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHByb3RlY3RlZCByZWFkb25seSBldmVudHM6IEFycmF5PHsgbWVzc2FnZT86IGFueSwgZXJyb3I/OiBhbnkgfT4gPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKHNvY2tldDogSVdlYlNvY2tldCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnNvY2tldCA9IHNvY2tldDtcbiAgICAgICAgdGhpcy5zb2NrZXQub25NZXNzYWdlKG1lc3NhZ2UgPT5cbiAgICAgICAgICAgIHRoaXMucmVhZE1lc3NhZ2UobWVzc2FnZSlcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zb2NrZXQub25FcnJvcihlcnJvciA9PlxuICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc29ja2V0Lm9uQ2xvc2UoKGNvZGUsIHJlYXNvbikgPT4ge1xuICAgICAgICAgICAgaWYgKGNvZGUgIT09IDEwMDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvcjogRXJyb3IgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICcnICsgY29kZSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYEVycm9yIGR1cmluZyBzb2NrZXQgcmVjb25uZWN0OiBjb2RlID0gJHtjb2RlfSwgcmVhc29uID0gJHtyZWFzb259YFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5maXJlQ2xvc2UoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbGlzdGVuKGNhbGxiYWNrOiBEYXRhQ2FsbGJhY2spOiBEaXNwb3NhYmxlIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09ICdpbml0aWFsJykge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9ICdsaXN0ZW5pbmcnO1xuICAgICAgICAgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgICAgICAgd2hpbGUgKHRoaXMuZXZlbnRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gdGhpcy5ldmVudHMucG9wKCkhO1xuICAgICAgICAgICAgICAgIGlmIChldmVudC5tZXNzYWdlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWFkTWVzc2FnZShldmVudC5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXZlbnQuZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZUNsb3NlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkaXNwb3NlOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2FsbGJhY2sgPT09IGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSAnaW5pdGlhbCc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsbGJhY2sgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIG92ZXJyaWRlIGRpc3Bvc2UoKSB7XG4gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9ICdpbml0aWFsJztcbiAgICAgICAgdGhpcy5jYWxsYmFjayA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5ldmVudHMuc3BsaWNlKDAsIHRoaXMuZXZlbnRzLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBwcm90ZWN0ZWQgcmVhZE1lc3NhZ2UobWVzc2FnZTogYW55KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09PSAnaW5pdGlhbCcpIHtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRzLnNwbGljZSgwLCAwLCB7IG1lc3NhZ2UgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZSA9PT0gJ2xpc3RlbmluZycpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjayEoZGF0YSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvcjogRXJyb3IgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICcnICsgNDAwLFxuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgRXJyb3IgZHVyaW5nIG1lc3NhZ2UgcGFyc2luZywgcmVhc29uID0gJHt0eXBlb2YgZXJyID09PSAnb2JqZWN0JyA/IChlcnIgYXMgYW55KS5tZXNzYWdlIDogJ3Vua25vd24nfWBcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIGZpcmVFcnJvcihlcnJvcjogYW55KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09PSAnaW5pdGlhbCcpIHtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRzLnNwbGljZSgwLCAwLCB7IGVycm9yIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUgPT09ICdsaXN0ZW5pbmcnKSB7XG4gICAgICAgICAgICBzdXBlci5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIGZpcmVDbG9zZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09ICdpbml0aWFsJykge1xuICAgICAgICAgICAgdGhpcy5ldmVudHMuc3BsaWNlKDAsIDAsIHt9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlID09PSAnbGlzdGVuaW5nJykge1xuICAgICAgICAgICAgc3VwZXIuZmlyZUNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGF0ZSA9ICdjbG9zZWQnO1xuICAgIH1cbn1cbiIsICIvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSAyMDI0IFR5cGVGb3ggYW5kIG90aGVycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExJQ0VOU0UgaW4gdGhlIHBhY2thZ2Ugcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5pbXBvcnQgeyBNZXNzYWdlIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuaW1wb3J0IHsgQWJzdHJhY3RNZXNzYWdlV3JpdGVyLCBNZXNzYWdlV3JpdGVyIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuaW1wb3J0IHR5cGUgeyBJV2ViU29ja2V0IH0gZnJvbSAnLi9zb2NrZXQuanMnO1xuXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0TWVzc2FnZVdyaXRlciBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVdyaXRlciBpbXBsZW1lbnRzIE1lc3NhZ2VXcml0ZXIge1xuICAgIHByb3RlY3RlZCBlcnJvckNvdW50ID0gMDtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgc29ja2V0OiBJV2ViU29ja2V0O1xuXG4gICAgY29uc3RydWN0b3Ioc29ja2V0OiBJV2ViU29ja2V0KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuc29ja2V0ID0gc29ja2V0O1xuICAgIH1cblxuICAgIGVuZCgpOiB2b2lkIHtcbiAgICB9XG5cbiAgICBhc3luYyB3cml0ZShtc2c6IE1lc3NhZ2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShtc2cpO1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChjb250ZW50KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5lcnJvckNvdW50Kys7XG4gICAgICAgICAgICB0aGlzLmZpcmVFcnJvcihlLCBtc2csIHRoaXMuZXJyb3JDb3VudCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgMjAyNCBUeXBlRm94IGFuZCBvdGhlcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMSUNFTlNFIGluIHRoZSBwYWNrYWdlIHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuaW1wb3J0IHR5cGUgeyBNZXNzYWdlQ29ubmVjdGlvbiwgTG9nZ2VyIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuaW1wb3J0IHsgY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24gfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG5pbXBvcnQgdHlwZSB7IElXZWJTb2NrZXQgfSBmcm9tICcuL3NvY2tldC5qcyc7XG5pbXBvcnQgeyBXZWJTb2NrZXRNZXNzYWdlUmVhZGVyIH0gZnJvbSAnLi9yZWFkZXIuanMnO1xuaW1wb3J0IHsgV2ViU29ja2V0TWVzc2FnZVdyaXRlciB9IGZyb20gJy4vd3JpdGVyLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdlYlNvY2tldENvbm5lY3Rpb24oc29ja2V0OiBJV2ViU29ja2V0LCBsb2dnZXI6IExvZ2dlcik6IE1lc3NhZ2VDb25uZWN0aW9uIHtcbiAgICBjb25zdCBtZXNzYWdlUmVhZGVyID0gbmV3IFdlYlNvY2tldE1lc3NhZ2VSZWFkZXIoc29ja2V0KTtcbiAgICBjb25zdCBtZXNzYWdlV3JpdGVyID0gbmV3IFdlYlNvY2tldE1lc3NhZ2VXcml0ZXIoc29ja2V0KTtcbiAgICBjb25zdCBjb25uZWN0aW9uID0gY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24obWVzc2FnZVJlYWRlciwgbWVzc2FnZVdyaXRlciwgbG9nZ2VyKTtcbiAgICBjb25uZWN0aW9uLm9uQ2xvc2UoKCkgPT4gY29ubmVjdGlvbi5kaXNwb3NlKCkpO1xuICAgIHJldHVybiBjb25uZWN0aW9uO1xufVxuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjQgVHlwZUZveCBhbmQgb3RoZXJzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTElDRU5TRSBpbiB0aGUgcGFja2FnZSByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbmltcG9ydCB0eXBlIHsgTWVzc2FnZUNvbm5lY3Rpb24sIExvZ2dlciB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcbmltcG9ydCB7IGNyZWF0ZVdlYlNvY2tldENvbm5lY3Rpb24gfSBmcm9tICcuL3NvY2tldC9jb25uZWN0aW9uLmpzJztcbmltcG9ydCB0eXBlIHsgSVdlYlNvY2tldCB9IGZyb20gJy4vc29ja2V0L3NvY2tldC5qcyc7XG5pbXBvcnQgeyBDb25zb2xlTG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gbGlzdGVuKG9wdGlvbnM6IHtcbiAgICB3ZWJTb2NrZXQ6IFdlYlNvY2tldDtcbiAgICBsb2dnZXI/OiBMb2dnZXI7XG4gICAgb25Db25uZWN0aW9uOiAoY29ubmVjdGlvbjogTWVzc2FnZUNvbm5lY3Rpb24pID0+IHZvaWQ7XG59KSB7XG4gICAgY29uc3QgeyB3ZWJTb2NrZXQsIG9uQ29ubmVjdGlvbiB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBsb2dnZXIgPSBvcHRpb25zLmxvZ2dlciB8fCBuZXcgQ29uc29sZUxvZ2dlcigpO1xuICAgIHdlYlNvY2tldC5vbm9wZW4gPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNvY2tldCA9IHRvU29ja2V0KHdlYlNvY2tldCk7XG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBjcmVhdGVXZWJTb2NrZXRDb25uZWN0aW9uKHNvY2tldCwgbG9nZ2VyKTtcbiAgICAgICAgb25Db25uZWN0aW9uKGNvbm5lY3Rpb24pO1xuICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1NvY2tldCh3ZWJTb2NrZXQ6IFdlYlNvY2tldCk6IElXZWJTb2NrZXQge1xuICAgIHJldHVybiB7XG4gICAgICAgIHNlbmQ6IGNvbnRlbnQgPT4gd2ViU29ja2V0LnNlbmQoY29udGVudCksXG4gICAgICAgIG9uTWVzc2FnZTogY2IgPT4ge1xuICAgICAgICAgICAgd2ViU29ja2V0Lm9ubWVzc2FnZSA9IGV2ZW50ID0+IGNiKGV2ZW50LmRhdGEpO1xuICAgICAgICB9LFxuICAgICAgICBvbkVycm9yOiBjYiA9PiB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgd2ViU29ja2V0Lm9uZXJyb3IgPSAoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3QuaGFzT3duKGV2ZW50LCAnbWVzc2FnZScpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNiKGV2ZW50Lm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIG9uQ2xvc2U6IGNiID0+IHtcbiAgICAgICAgICAgIHdlYlNvY2tldC5vbmNsb3NlID0gZXZlbnQgPT4gY2IoZXZlbnQuY29kZSwgZXZlbnQucmVhc29uKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGlzcG9zZTogKCkgPT4gd2ViU29ja2V0LmNsb3NlKClcbiAgICB9O1xufVxuIiwgIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAyNiBFY2xpcHNlIERpcmlnaWJsZSBjb250cmlidXRvcnNcbiAqXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGVcbiAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYyLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcbiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYyMC5odG1sXG4gKlxuICogU1BEWC1GaWxlQ29weXJpZ2h0VGV4dDogRWNsaXBzZSBEaXJpZ2libGUgY29udHJpYnV0b3JzIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wXG4gKi9cblxuLyoqXG4gKiBMYXp5IFByb3h5IHNoaW0gZm9yIE1vbmFjbyBFZGl0b3IgbG9hZGVkIHZpYSBBTUQuXG4gKlxuICogZWRpdG9yLmpzIHNldHMgZ2xvYmFsVGhpcy5tb25hY28gaW5zaWRlIHRoZSBBTUQgcmVxdWlyZSgpIGNhbGxiYWNrLCBiZWZvcmUgYW55XG4gKiBKYXZhTHNwQ2xpZW50TGliLmNvbm5lY3QoKSBjYWxsLiBBbGwgcHJvcGVydHkgYWNjZXNzZXMgZ28gdGhyb3VnaCBQcm94eS5nZXQoKSB0cmFwc1xuICogc28gdGhleSByZXNvbHZlIGFnYWluc3QgdGhlIGxpdmUgd2luZG93Lm1vbmFjbyBhdCBjYWxsIHRpbWUsIG5vdCBhdCBidW5kbGUgbG9hZCB0aW1lLlxuICpcbiAqIFR5cGVTY3JpcHQgcmVzb2x2ZXMgdHlwZXMgZnJvbSB0aGUgcmVhbCBtb25hY28tZWRpdG9yIGRldkRlcGVuZGVuY3k7IGVzYnVpbGQgcmVwbGFjZXNcbiAqIHRoZSBcIm1vbmFjby1lZGl0b3JcIiBpbXBvcnQgd2l0aCB0aGlzIGZpbGUgYXQgYnVuZGxlIHRpbWUgdmlhIHRoZSBhbGlhcyBvcHRpb24uXG4gKi9cblxudHlwZSBNID0gdHlwZW9mIGltcG9ydCgnbW9uYWNvLWVkaXRvcicpO1xuXG5mdW5jdGlvbiBtKCk6IE0ge1xuICAgIHJldHVybiAoZ2xvYmFsVGhpcyBhcyBhbnkpLm1vbmFjbyBhcyBNO1xufVxuXG5mdW5jdGlvbiBuczxUIGV4dGVuZHMgb2JqZWN0PihnZXR0ZXI6ICgpID0+IFQpOiBUIHtcbiAgICByZXR1cm4gbmV3IFByb3h5KHt9IGFzIFQsIHtcbiAgICAgICAgZ2V0OiAoXywgaykgPT4gKGdldHRlcigpIGFzIGFueSlbayBhcyBzdHJpbmddLFxuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBjbHM8VD4oZ2V0dGVyOiAoKSA9PiBUKTogVCB7XG4gICAgcmV0dXJuIG5ldyBQcm94eShmdW5jdGlvbiAoKSB7fSBhcyBhbnksIHtcbiAgICAgICAgY29uc3RydWN0OiAoXywgYXJncykgPT4gbmV3IChnZXR0ZXIoKSBhcyBhbnkpKC4uLmFyZ3MpLFxuICAgICAgICBnZXQ6ICAgICAgIChfLCBrKSAgICA9PiAoZ2V0dGVyKCkgYXMgYW55KVtrIGFzIHN0cmluZ10sXG4gICAgfSkgYXMgVDtcbn1cblxuZXhwb3J0IGNvbnN0IGVkaXRvciAgICAgICAgID0gbnMoKCkgPT4gbSgpLmVkaXRvcik7XG5leHBvcnQgY29uc3QgbGFuZ3VhZ2VzICAgICAgPSBucygoKSA9PiBtKCkubGFuZ3VhZ2VzKTtcbmV4cG9ydCBjb25zdCBNYXJrZXJTZXZlcml0eSA9IG5zKCgpID0+IG0oKS5NYXJrZXJTZXZlcml0eSk7XG5leHBvcnQgY29uc3QgTWFya2VyVGFnICAgICAgPSBucygoKSA9PiAobSgpIGFzIGFueSkuTWFya2VyVGFnKTtcbmV4cG9ydCBjb25zdCBVcmkgICAgICAgICAgICA9IGNscygoKSA9PiBtKCkuVXJpKTtcbmV4cG9ydCBjb25zdCBSYW5nZSAgICAgICAgICA9IGNscygoKSA9PiBtKCkuUmFuZ2UpO1xuZXhwb3J0IGNvbnN0IFBvc2l0aW9uICAgICAgID0gY2xzKCgpID0+IG0oKS5Qb3NpdGlvbik7XG5leHBvcnQgY29uc3QgU2VsZWN0aW9uICAgICAgPSBjbHMoKCkgPT4gbSgpLlNlbGVjdGlvbik7XG5leHBvcnQgY29uc3QgS2V5Q29kZSAgICAgICAgPSBucygoKSA9PiBtKCkuS2V5Q29kZSk7XG5leHBvcnQgY29uc3QgS2V5TW9kICAgICAgICAgPSBucygoKSA9PiBtKCkuS2V5TW9kKTtcbiIsICIvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4ndXNlIHN0cmljdCc7XG5leHBvcnQgdmFyIERvY3VtZW50VXJpO1xuKGZ1bmN0aW9uIChEb2N1bWVudFVyaSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnO1xuICAgIH1cbiAgICBEb2N1bWVudFVyaS5pcyA9IGlzO1xufSkoRG9jdW1lbnRVcmkgfHwgKERvY3VtZW50VXJpID0ge30pKTtcbmV4cG9ydCB2YXIgVVJJO1xuKGZ1bmN0aW9uIChVUkkpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJztcbiAgICB9XG4gICAgVVJJLmlzID0gaXM7XG59KShVUkkgfHwgKFVSSSA9IHt9KSk7XG5leHBvcnQgdmFyIGludGVnZXI7XG4oZnVuY3Rpb24gKGludGVnZXIpIHtcbiAgICBpbnRlZ2VyLk1JTl9WQUxVRSA9IC0yMTQ3NDgzNjQ4O1xuICAgIGludGVnZXIuTUFYX1ZBTFVFID0gMjE0NzQ4MzY0NztcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBpbnRlZ2VyLk1JTl9WQUxVRSA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSBpbnRlZ2VyLk1BWF9WQUxVRTtcbiAgICB9XG4gICAgaW50ZWdlci5pcyA9IGlzO1xufSkoaW50ZWdlciB8fCAoaW50ZWdlciA9IHt9KSk7XG5leHBvcnQgdmFyIHVpbnRlZ2VyO1xuKGZ1bmN0aW9uICh1aW50ZWdlcikge1xuICAgIHVpbnRlZ2VyLk1JTl9WQUxVRSA9IDA7XG4gICAgdWludGVnZXIuTUFYX1ZBTFVFID0gMjE0NzQ4MzY0NztcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiB1aW50ZWdlci5NSU5fVkFMVUUgPD0gdmFsdWUgJiYgdmFsdWUgPD0gdWludGVnZXIuTUFYX1ZBTFVFO1xuICAgIH1cbiAgICB1aW50ZWdlci5pcyA9IGlzO1xufSkodWludGVnZXIgfHwgKHVpbnRlZ2VyID0ge30pKTtcbi8qKlxuICogVGhlIFBvc2l0aW9uIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIFBvc2l0aW9ufSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBQb3NpdGlvbjtcbihmdW5jdGlvbiAoUG9zaXRpb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFBvc2l0aW9uIGxpdGVyYWwgZnJvbSB0aGUgZ2l2ZW4gbGluZSBhbmQgY2hhcmFjdGVyLlxuICAgICAqIEBwYXJhbSBsaW5lIFRoZSBwb3NpdGlvbidzIGxpbmUuXG4gICAgICogQHBhcmFtIGNoYXJhY3RlciBUaGUgcG9zaXRpb24ncyBjaGFyYWN0ZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGxpbmUsIGNoYXJhY3Rlcikge1xuICAgICAgICBpZiAobGluZSA9PT0gTnVtYmVyLk1BWF9WQUxVRSkge1xuICAgICAgICAgICAgbGluZSA9IHVpbnRlZ2VyLk1BWF9WQUxVRTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhcmFjdGVyID09PSBOdW1iZXIuTUFYX1ZBTFVFKSB7XG4gICAgICAgICAgICBjaGFyYWN0ZXIgPSB1aW50ZWdlci5NQVhfVkFMVUU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgbGluZSwgY2hhcmFjdGVyIH07XG4gICAgfVxuICAgIFBvc2l0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIFBvc2l0aW9ufSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS5saW5lKSAmJiBJcy51aW50ZWdlcihjYW5kaWRhdGUuY2hhcmFjdGVyKTtcbiAgICB9XG4gICAgUG9zaXRpb24uaXMgPSBpcztcbn0pKFBvc2l0aW9uIHx8IChQb3NpdGlvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBSYW5nZSBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBSYW5nZX0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgUmFuZ2U7XG4oZnVuY3Rpb24gKFJhbmdlKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKG9uZSwgdHdvLCB0aHJlZSwgZm91cikge1xuICAgICAgICBpZiAoSXMudWludGVnZXIob25lKSAmJiBJcy51aW50ZWdlcih0d28pICYmIElzLnVpbnRlZ2VyKHRocmVlKSAmJiBJcy51aW50ZWdlcihmb3VyKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IFBvc2l0aW9uLmNyZWF0ZShvbmUsIHR3byksIGVuZDogUG9zaXRpb24uY3JlYXRlKHRocmVlLCBmb3VyKSB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKFBvc2l0aW9uLmlzKG9uZSkgJiYgUG9zaXRpb24uaXModHdvKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IG9uZSwgZW5kOiB0d28gfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmFuZ2UjY3JlYXRlIGNhbGxlZCB3aXRoIGludmFsaWQgYXJndW1lbnRzWyR7b25lfSwgJHt0d299LCAke3RocmVlfSwgJHtmb3VyfV1gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBSYW5nZS5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBSYW5nZX0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBQb3NpdGlvbi5pcyhjYW5kaWRhdGUuc3RhcnQpICYmIFBvc2l0aW9uLmlzKGNhbmRpZGF0ZS5lbmQpO1xuICAgIH1cbiAgICBSYW5nZS5pcyA9IGlzO1xufSkoUmFuZ2UgfHwgKFJhbmdlID0ge30pKTtcbi8qKlxuICogVGhlIExvY2F0aW9uIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIExvY2F0aW9ufSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBMb2NhdGlvbjtcbihmdW5jdGlvbiAoTG9jYXRpb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgTG9jYXRpb24gbGl0ZXJhbC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSBsb2NhdGlvbidzIHVyaS5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIGxvY2F0aW9uJ3MgcmFuZ2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHVyaSwgcmFuZ2UpIHtcbiAgICAgICAgcmV0dXJuIHsgdXJpLCByYW5nZSB9O1xuICAgIH1cbiAgICBMb2NhdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBMb2NhdGlvbn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIChJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSkgfHwgSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS51cmkpKTtcbiAgICB9XG4gICAgTG9jYXRpb24uaXMgPSBpcztcbn0pKExvY2F0aW9uIHx8IChMb2NhdGlvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBMb2NhdGlvbkxpbmsgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgTG9jYXRpb25MaW5rfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBMb2NhdGlvbkxpbms7XG4oZnVuY3Rpb24gKExvY2F0aW9uTGluaykge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBMb2NhdGlvbkxpbmsgbGl0ZXJhbC5cbiAgICAgKiBAcGFyYW0gdGFyZ2V0VXJpIFRoZSBkZWZpbml0aW9uJ3MgdXJpLlxuICAgICAqIEBwYXJhbSB0YXJnZXRSYW5nZSBUaGUgZnVsbCByYW5nZSBvZiB0aGUgZGVmaW5pdGlvbi5cbiAgICAgKiBAcGFyYW0gdGFyZ2V0U2VsZWN0aW9uUmFuZ2UgVGhlIHNwYW4gb2YgdGhlIHN5bWJvbCBkZWZpbml0aW9uIGF0IHRoZSB0YXJnZXQuXG4gICAgICogQHBhcmFtIG9yaWdpblNlbGVjdGlvblJhbmdlIFRoZSBzcGFuIG9mIHRoZSBzeW1ib2wgYmVpbmcgZGVmaW5lZCBpbiB0aGUgb3JpZ2luYXRpbmcgc291cmNlIGZpbGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHRhcmdldFVyaSwgdGFyZ2V0UmFuZ2UsIHRhcmdldFNlbGVjdGlvblJhbmdlLCBvcmlnaW5TZWxlY3Rpb25SYW5nZSkge1xuICAgICAgICByZXR1cm4geyB0YXJnZXRVcmksIHRhcmdldFJhbmdlLCB0YXJnZXRTZWxlY3Rpb25SYW5nZSwgb3JpZ2luU2VsZWN0aW9uUmFuZ2UgfTtcbiAgICB9XG4gICAgTG9jYXRpb25MaW5rLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIExvY2F0aW9uTGlua30gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUudGFyZ2V0UmFuZ2UpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudGFyZ2V0VXJpKVxuICAgICAgICAgICAgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnRhcmdldFNlbGVjdGlvblJhbmdlKVxuICAgICAgICAgICAgJiYgKFJhbmdlLmlzKGNhbmRpZGF0ZS5vcmlnaW5TZWxlY3Rpb25SYW5nZSkgfHwgSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5vcmlnaW5TZWxlY3Rpb25SYW5nZSkpO1xuICAgIH1cbiAgICBMb2NhdGlvbkxpbmsuaXMgPSBpcztcbn0pKExvY2F0aW9uTGluayB8fCAoTG9jYXRpb25MaW5rID0ge30pKTtcbi8qKlxuICogVGhlIENvbG9yIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIENvbG9yfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBDb2xvcjtcbihmdW5jdGlvbiAoQ29sb3IpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENvbG9yIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZWQsXG4gICAgICAgICAgICBncmVlbixcbiAgICAgICAgICAgIGJsdWUsXG4gICAgICAgICAgICBhbHBoYSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgQ29sb3IuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgQ29sb3J9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBJcy5udW1iZXJSYW5nZShjYW5kaWRhdGUucmVkLCAwLCAxKVxuICAgICAgICAgICAgJiYgSXMubnVtYmVyUmFuZ2UoY2FuZGlkYXRlLmdyZWVuLCAwLCAxKVxuICAgICAgICAgICAgJiYgSXMubnVtYmVyUmFuZ2UoY2FuZGlkYXRlLmJsdWUsIDAsIDEpXG4gICAgICAgICAgICAmJiBJcy5udW1iZXJSYW5nZShjYW5kaWRhdGUuYWxwaGEsIDAsIDEpO1xuICAgIH1cbiAgICBDb2xvci5pcyA9IGlzO1xufSkoQ29sb3IgfHwgKENvbG9yID0ge30pKTtcbi8qKlxuICogVGhlIENvbG9ySW5mb3JtYXRpb24gbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgQ29sb3JJbmZvcm1hdGlvbn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgQ29sb3JJbmZvcm1hdGlvbjtcbihmdW5jdGlvbiAoQ29sb3JJbmZvcm1hdGlvbikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ29sb3JJbmZvcm1hdGlvbiBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgY29sb3IpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJhbmdlLFxuICAgICAgICAgICAgY29sb3IsXG4gICAgICAgIH07XG4gICAgfVxuICAgIENvbG9ySW5mb3JtYXRpb24uY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgQ29sb3JJbmZvcm1hdGlvbn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgQ29sb3IuaXMoY2FuZGlkYXRlLmNvbG9yKTtcbiAgICB9XG4gICAgQ29sb3JJbmZvcm1hdGlvbi5pcyA9IGlzO1xufSkoQ29sb3JJbmZvcm1hdGlvbiB8fCAoQ29sb3JJbmZvcm1hdGlvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb2xvciBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBDb2xvclByZXNlbnRhdGlvbn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgQ29sb3JQcmVzZW50YXRpb247XG4oZnVuY3Rpb24gKENvbG9yUHJlc2VudGF0aW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDb2xvckluZm9ybWF0aW9uIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGxhYmVsLCB0ZXh0RWRpdCwgYWRkaXRpb25hbFRleHRFZGl0cykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICB0ZXh0RWRpdCxcbiAgICAgICAgICAgIGFkZGl0aW9uYWxUZXh0RWRpdHMsXG4gICAgICAgIH07XG4gICAgfVxuICAgIENvbG9yUHJlc2VudGF0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIENvbG9ySW5mb3JtYXRpb259IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLmxhYmVsKVxuICAgICAgICAgICAgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUudGV4dEVkaXQpIHx8IFRleHRFZGl0LmlzKGNhbmRpZGF0ZSkpXG4gICAgICAgICAgICAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5hZGRpdGlvbmFsVGV4dEVkaXRzKSB8fCBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS5hZGRpdGlvbmFsVGV4dEVkaXRzLCBUZXh0RWRpdC5pcykpO1xuICAgIH1cbiAgICBDb2xvclByZXNlbnRhdGlvbi5pcyA9IGlzO1xufSkoQ29sb3JQcmVzZW50YXRpb24gfHwgKENvbG9yUHJlc2VudGF0aW9uID0ge30pKTtcbi8qKlxuICogQSBzZXQgb2YgcHJlZGVmaW5lZCByYW5nZSBraW5kcy5cbiAqL1xuZXhwb3J0IHZhciBGb2xkaW5nUmFuZ2VLaW5kO1xuKGZ1bmN0aW9uIChGb2xkaW5nUmFuZ2VLaW5kKSB7XG4gICAgLyoqXG4gICAgICogRm9sZGluZyByYW5nZSBmb3IgYSBjb21tZW50XG4gICAgICovXG4gICAgRm9sZGluZ1JhbmdlS2luZC5Db21tZW50ID0gJ2NvbW1lbnQnO1xuICAgIC8qKlxuICAgICAqIEZvbGRpbmcgcmFuZ2UgZm9yIGFuIGltcG9ydCBvciBpbmNsdWRlXG4gICAgICovXG4gICAgRm9sZGluZ1JhbmdlS2luZC5JbXBvcnRzID0gJ2ltcG9ydHMnO1xuICAgIC8qKlxuICAgICAqIEZvbGRpbmcgcmFuZ2UgZm9yIGEgcmVnaW9uIChlLmcuIGAjcmVnaW9uYClcbiAgICAgKi9cbiAgICBGb2xkaW5nUmFuZ2VLaW5kLlJlZ2lvbiA9ICdyZWdpb24nO1xufSkoRm9sZGluZ1JhbmdlS2luZCB8fCAoRm9sZGluZ1JhbmdlS2luZCA9IHt9KSk7XG4vKipcbiAqIFRoZSBmb2xkaW5nIHJhbmdlIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIEZvbGRpbmdSYW5nZX0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgRm9sZGluZ1JhbmdlO1xuKGZ1bmN0aW9uIChGb2xkaW5nUmFuZ2UpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IEZvbGRpbmdSYW5nZSBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShzdGFydExpbmUsIGVuZExpbmUsIHN0YXJ0Q2hhcmFjdGVyLCBlbmRDaGFyYWN0ZXIsIGtpbmQsIGNvbGxhcHNlZFRleHQpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgc3RhcnRMaW5lLFxuICAgICAgICAgICAgZW5kTGluZVxuICAgICAgICB9O1xuICAgICAgICBpZiAoSXMuZGVmaW5lZChzdGFydENoYXJhY3RlcikpIHtcbiAgICAgICAgICAgIHJlc3VsdC5zdGFydENoYXJhY3RlciA9IHN0YXJ0Q2hhcmFjdGVyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKGVuZENoYXJhY3RlcikpIHtcbiAgICAgICAgICAgIHJlc3VsdC5lbmRDaGFyYWN0ZXIgPSBlbmRDaGFyYWN0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzLmRlZmluZWQoa2luZCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5raW5kID0ga2luZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXMuZGVmaW5lZChjb2xsYXBzZWRUZXh0KSkge1xuICAgICAgICAgICAgcmVzdWx0LmNvbGxhcHNlZFRleHQgPSBjb2xsYXBzZWRUZXh0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIEZvbGRpbmdSYW5nZS5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBGb2xkaW5nUmFuZ2V9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBJcy51aW50ZWdlcihjYW5kaWRhdGUuc3RhcnRMaW5lKSAmJiBJcy51aW50ZWdlcihjYW5kaWRhdGUuc3RhcnRMaW5lKVxuICAgICAgICAgICAgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUuc3RhcnRDaGFyYWN0ZXIpIHx8IElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS5zdGFydENoYXJhY3RlcikpXG4gICAgICAgICAgICAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5lbmRDaGFyYWN0ZXIpIHx8IElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS5lbmRDaGFyYWN0ZXIpKVxuICAgICAgICAgICAgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUua2luZCkgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS5raW5kKSk7XG4gICAgfVxuICAgIEZvbGRpbmdSYW5nZS5pcyA9IGlzO1xufSkoRm9sZGluZ1JhbmdlIHx8IChGb2xkaW5nUmFuZ2UgPSB7fSkpO1xuLyoqXG4gKiBUaGUgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbiBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9ufSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uO1xuKGZ1bmN0aW9uIChEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGxvY2F0aW9uLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgICAgIG1lc3NhZ2VcbiAgICAgICAgfTtcbiAgICB9XG4gICAgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9ufSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIExvY2F0aW9uLmlzKGNhbmRpZGF0ZS5sb2NhdGlvbikgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5tZXNzYWdlKTtcbiAgICB9XG4gICAgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbi5pcyA9IGlzO1xufSkoRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbiB8fCAoRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBkaWFnbm9zdGljJ3Mgc2V2ZXJpdHkuXG4gKi9cbmV4cG9ydCB2YXIgRGlhZ25vc3RpY1NldmVyaXR5O1xuKGZ1bmN0aW9uIChEaWFnbm9zdGljU2V2ZXJpdHkpIHtcbiAgICAvKipcbiAgICAgKiBSZXBvcnRzIGFuIGVycm9yLlxuICAgICAqL1xuICAgIERpYWdub3N0aWNTZXZlcml0eS5FcnJvciA9IDE7XG4gICAgLyoqXG4gICAgICogUmVwb3J0cyBhIHdhcm5pbmcuXG4gICAgICovXG4gICAgRGlhZ25vc3RpY1NldmVyaXR5Lldhcm5pbmcgPSAyO1xuICAgIC8qKlxuICAgICAqIFJlcG9ydHMgYW4gaW5mb3JtYXRpb24uXG4gICAgICovXG4gICAgRGlhZ25vc3RpY1NldmVyaXR5LkluZm9ybWF0aW9uID0gMztcbiAgICAvKipcbiAgICAgKiBSZXBvcnRzIGEgaGludC5cbiAgICAgKi9cbiAgICBEaWFnbm9zdGljU2V2ZXJpdHkuSGludCA9IDQ7XG59KShEaWFnbm9zdGljU2V2ZXJpdHkgfHwgKERpYWdub3N0aWNTZXZlcml0eSA9IHt9KSk7XG4vKipcbiAqIFRoZSBkaWFnbm9zdGljIHRhZ3MuXG4gKlxuICogQHNpbmNlIDMuMTUuMFxuICovXG5leHBvcnQgdmFyIERpYWdub3N0aWNUYWc7XG4oZnVuY3Rpb24gKERpYWdub3N0aWNUYWcpIHtcbiAgICAvKipcbiAgICAgKiBVbnVzZWQgb3IgdW5uZWNlc3NhcnkgY29kZS5cbiAgICAgKlxuICAgICAqIENsaWVudHMgYXJlIGFsbG93ZWQgdG8gcmVuZGVyIGRpYWdub3N0aWNzIHdpdGggdGhpcyB0YWcgZmFkZWQgb3V0IGluc3RlYWQgb2YgaGF2aW5nXG4gICAgICogYW4gZXJyb3Igc3F1aWdnbGUuXG4gICAgICovXG4gICAgRGlhZ25vc3RpY1RhZy5Vbm5lY2Vzc2FyeSA9IDE7XG4gICAgLyoqXG4gICAgICogRGVwcmVjYXRlZCBvciBvYnNvbGV0ZSBjb2RlLlxuICAgICAqXG4gICAgICogQ2xpZW50cyBhcmUgYWxsb3dlZCB0byByZW5kZXJlZCBkaWFnbm9zdGljcyB3aXRoIHRoaXMgdGFnIHN0cmlrZSB0aHJvdWdoLlxuICAgICAqL1xuICAgIERpYWdub3N0aWNUYWcuRGVwcmVjYXRlZCA9IDI7XG59KShEaWFnbm9zdGljVGFnIHx8IChEaWFnbm9zdGljVGFnID0ge30pKTtcbi8qKlxuICogVGhlIENvZGVEZXNjcmlwdGlvbiBuYW1lc3BhY2UgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCBkZXNjcmlwdGlvbnMgZm9yIGRpYWdub3N0aWMgY29kZXMuXG4gKlxuICogQHNpbmNlIDMuMTYuMFxuICovXG5leHBvcnQgdmFyIENvZGVEZXNjcmlwdGlvbjtcbihmdW5jdGlvbiAoQ29kZURlc2NyaXB0aW9uKSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5ocmVmKTtcbiAgICB9XG4gICAgQ29kZURlc2NyaXB0aW9uLmlzID0gaXM7XG59KShDb2RlRGVzY3JpcHRpb24gfHwgKENvZGVEZXNjcmlwdGlvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBEaWFnbm9zdGljIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIERpYWdub3N0aWN9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIERpYWdub3N0aWM7XG4oZnVuY3Rpb24gKERpYWdub3N0aWMpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IERpYWdub3N0aWMgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIG1lc3NhZ2UsIHNldmVyaXR5LCBjb2RlLCBzb3VyY2UsIHJlbGF0ZWRJbmZvcm1hdGlvbikge1xuICAgICAgICBsZXQgcmVzdWx0ID0geyByYW5nZSwgbWVzc2FnZSB9O1xuICAgICAgICBpZiAoSXMuZGVmaW5lZChzZXZlcml0eSkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5zZXZlcml0eSA9IHNldmVyaXR5O1xuICAgICAgICB9XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKGNvZGUpKSB7XG4gICAgICAgICAgICByZXN1bHQuY29kZSA9IGNvZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzLmRlZmluZWQoc291cmNlKSkge1xuICAgICAgICAgICAgcmVzdWx0LnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXMuZGVmaW5lZChyZWxhdGVkSW5mb3JtYXRpb24pKSB7XG4gICAgICAgICAgICByZXN1bHQucmVsYXRlZEluZm9ybWF0aW9uID0gcmVsYXRlZEluZm9ybWF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIERpYWdub3N0aWMuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgRGlhZ25vc3RpY30gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpXG4gICAgICAgICAgICAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpXG4gICAgICAgICAgICAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLm1lc3NhZ2UpXG4gICAgICAgICAgICAmJiAoSXMubnVtYmVyKGNhbmRpZGF0ZS5zZXZlcml0eSkgfHwgSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5zZXZlcml0eSkpXG4gICAgICAgICAgICAmJiAoSXMuaW50ZWdlcihjYW5kaWRhdGUuY29kZSkgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS5jb2RlKSB8fCBJcy51bmRlZmluZWQoY2FuZGlkYXRlLmNvZGUpKVxuICAgICAgICAgICAgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUuY29kZURlc2NyaXB0aW9uKSB8fCAoSXMuc3RyaW5nKChfYSA9IGNhbmRpZGF0ZS5jb2RlRGVzY3JpcHRpb24pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5ocmVmKSkpXG4gICAgICAgICAgICAmJiAoSXMuc3RyaW5nKGNhbmRpZGF0ZS5zb3VyY2UpIHx8IElzLnVuZGVmaW5lZChjYW5kaWRhdGUuc291cmNlKSlcbiAgICAgICAgICAgICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLnJlbGF0ZWRJbmZvcm1hdGlvbikgfHwgSXMudHlwZWRBcnJheShjYW5kaWRhdGUucmVsYXRlZEluZm9ybWF0aW9uLCBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uLmlzKSk7XG4gICAgfVxuICAgIERpYWdub3N0aWMuaXMgPSBpcztcbn0pKERpYWdub3N0aWMgfHwgKERpYWdub3N0aWMgPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29tbWFuZCBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBDb21tYW5kfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBDb21tYW5kO1xuKGZ1bmN0aW9uIChDb21tYW5kKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDb21tYW5kIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHRpdGxlLCBjb21tYW5kLCAuLi5hcmdzKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IHRpdGxlLCBjb21tYW5kIH07XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKGFyZ3MpICYmIGFyZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmVzdWx0LmFyZ3VtZW50cyA9IGFyZ3M7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgQ29tbWFuZC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBDb21tYW5kfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudGl0bGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUuY29tbWFuZCk7XG4gICAgfVxuICAgIENvbW1hbmQuaXMgPSBpcztcbn0pKENvbW1hbmQgfHwgKENvbW1hbmQgPSB7fSkpO1xuLyoqXG4gKiBUaGUgVGV4dEVkaXQgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgcmVwbGFjZSxcbiAqIGluc2VydCBhbmQgZGVsZXRlIGVkaXRzIG1vcmUgZWFzaWx5LlxuICovXG5leHBvcnQgdmFyIFRleHRFZGl0O1xuKGZ1bmN0aW9uIChUZXh0RWRpdCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSByZXBsYWNlIHRleHQgZWRpdC5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlIG9mIHRleHQgdG8gYmUgcmVwbGFjZWQuXG4gICAgICogQHBhcmFtIG5ld1RleHQgVGhlIG5ldyB0ZXh0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlcGxhY2UocmFuZ2UsIG5ld1RleHQpIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIG5ld1RleHQgfTtcbiAgICB9XG4gICAgVGV4dEVkaXQucmVwbGFjZSA9IHJlcGxhY2U7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnNlcnQgdGV4dCBlZGl0LlxuICAgICAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgcG9zaXRpb24gdG8gaW5zZXJ0IHRoZSB0ZXh0IGF0LlxuICAgICAqIEBwYXJhbSBuZXdUZXh0IFRoZSB0ZXh0IHRvIGJlIGluc2VydGVkLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluc2VydChwb3NpdGlvbiwgbmV3VGV4dCkge1xuICAgICAgICByZXR1cm4geyByYW5nZTogeyBzdGFydDogcG9zaXRpb24sIGVuZDogcG9zaXRpb24gfSwgbmV3VGV4dCB9O1xuICAgIH1cbiAgICBUZXh0RWRpdC5pbnNlcnQgPSBpbnNlcnQ7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGRlbGV0ZSB0ZXh0IGVkaXQuXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSBvZiB0ZXh0IHRvIGJlIGRlbGV0ZWQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZGVsKHJhbmdlKSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCBuZXdUZXh0OiAnJyB9O1xuICAgIH1cbiAgICBUZXh0RWRpdC5kZWwgPSBkZWw7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSlcbiAgICAgICAgICAgICYmIElzLnN0cmluZyhjYW5kaWRhdGUubmV3VGV4dClcbiAgICAgICAgICAgICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSk7XG4gICAgfVxuICAgIFRleHRFZGl0LmlzID0gaXM7XG59KShUZXh0RWRpdCB8fCAoVGV4dEVkaXQgPSB7fSkpO1xuZXhwb3J0IHZhciBDaGFuZ2VBbm5vdGF0aW9uO1xuKGZ1bmN0aW9uIChDaGFuZ2VBbm5vdGF0aW9uKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKGxhYmVsLCBuZWVkc0NvbmZpcm1hdGlvbiwgZGVzY3JpcHRpb24pIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0geyBsYWJlbCB9O1xuICAgICAgICBpZiAobmVlZHNDb25maXJtYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0Lm5lZWRzQ29uZmlybWF0aW9uID0gbmVlZHNDb25maXJtYXRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIENoYW5nZUFubm90YXRpb24uY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUubGFiZWwpICYmXG4gICAgICAgICAgICAoSXMuYm9vbGVhbihjYW5kaWRhdGUubmVlZHNDb25maXJtYXRpb24pIHx8IGNhbmRpZGF0ZS5uZWVkc0NvbmZpcm1hdGlvbiA9PT0gdW5kZWZpbmVkKSAmJlxuICAgICAgICAgICAgKElzLnN0cmluZyhjYW5kaWRhdGUuZGVzY3JpcHRpb24pIHx8IGNhbmRpZGF0ZS5kZXNjcmlwdGlvbiA9PT0gdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgQ2hhbmdlQW5ub3RhdGlvbi5pcyA9IGlzO1xufSkoQ2hhbmdlQW5ub3RhdGlvbiB8fCAoQ2hhbmdlQW5ub3RhdGlvbiA9IHt9KSk7XG5leHBvcnQgdmFyIENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyO1xuKGZ1bmN0aW9uIChDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuc3RyaW5nKGNhbmRpZGF0ZSk7XG4gICAgfVxuICAgIENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzID0gaXM7XG59KShDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllciB8fCAoQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIgPSB7fSkpO1xuZXhwb3J0IHZhciBBbm5vdGF0ZWRUZXh0RWRpdDtcbihmdW5jdGlvbiAoQW5ub3RhdGVkVGV4dEVkaXQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFubm90YXRlZCByZXBsYWNlIHRleHQgZWRpdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2Ugb2YgdGV4dCB0byBiZSByZXBsYWNlZC5cbiAgICAgKiBAcGFyYW0gbmV3VGV4dCBUaGUgbmV3IHRleHQuXG4gICAgICogQHBhcmFtIGFubm90YXRpb24gVGhlIGFubm90YXRpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVwbGFjZShyYW5nZSwgbmV3VGV4dCwgYW5ub3RhdGlvbikge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgbmV3VGV4dCwgYW5ub3RhdGlvbklkOiBhbm5vdGF0aW9uIH07XG4gICAgfVxuICAgIEFubm90YXRlZFRleHRFZGl0LnJlcGxhY2UgPSByZXBsYWNlO1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYW5ub3RhdGVkIGluc2VydCB0ZXh0IGVkaXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIHBvc2l0aW9uIHRvIGluc2VydCB0aGUgdGV4dCBhdC5cbiAgICAgKiBAcGFyYW0gbmV3VGV4dCBUaGUgdGV4dCB0byBiZSBpbnNlcnRlZC5cbiAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiBUaGUgYW5ub3RhdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbnNlcnQocG9zaXRpb24sIG5ld1RleHQsIGFubm90YXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2U6IHsgc3RhcnQ6IHBvc2l0aW9uLCBlbmQ6IHBvc2l0aW9uIH0sIG5ld1RleHQsIGFubm90YXRpb25JZDogYW5ub3RhdGlvbiB9O1xuICAgIH1cbiAgICBBbm5vdGF0ZWRUZXh0RWRpdC5pbnNlcnQgPSBpbnNlcnQ7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhbm5vdGF0ZWQgZGVsZXRlIHRleHQgZWRpdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2Ugb2YgdGV4dCB0byBiZSBkZWxldGVkLlxuICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIFRoZSBhbm5vdGF0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRlbChyYW5nZSwgYW5ub3RhdGlvbikge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgbmV3VGV4dDogJycsIGFubm90YXRpb25JZDogYW5ub3RhdGlvbiB9O1xuICAgIH1cbiAgICBBbm5vdGF0ZWRUZXh0RWRpdC5kZWwgPSBkZWw7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBUZXh0RWRpdC5pcyhjYW5kaWRhdGUpICYmIChDaGFuZ2VBbm5vdGF0aW9uLmlzKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQpIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQpKTtcbiAgICB9XG4gICAgQW5ub3RhdGVkVGV4dEVkaXQuaXMgPSBpcztcbn0pKEFubm90YXRlZFRleHRFZGl0IHx8IChBbm5vdGF0ZWRUZXh0RWRpdCA9IHt9KSk7XG4vKipcbiAqIFRoZSBUZXh0RG9jdW1lbnRFZGl0IG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlXG4gKiBhbiBlZGl0IHRoYXQgbWFuaXB1bGF0ZXMgYSB0ZXh0IGRvY3VtZW50LlxuICovXG5leHBvcnQgdmFyIFRleHREb2N1bWVudEVkaXQ7XG4oZnVuY3Rpb24gKFRleHREb2N1bWVudEVkaXQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGBUZXh0RG9jdW1lbnRFZGl0YFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh0ZXh0RG9jdW1lbnQsIGVkaXRzKSB7XG4gICAgICAgIHJldHVybiB7IHRleHREb2N1bWVudCwgZWRpdHMgfTtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50RWRpdC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpXG4gICAgICAgICAgICAmJiBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIuaXMoY2FuZGlkYXRlLnRleHREb2N1bWVudClcbiAgICAgICAgICAgICYmIEFycmF5LmlzQXJyYXkoY2FuZGlkYXRlLmVkaXRzKTtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50RWRpdC5pcyA9IGlzO1xufSkoVGV4dERvY3VtZW50RWRpdCB8fCAoVGV4dERvY3VtZW50RWRpdCA9IHt9KSk7XG5leHBvcnQgdmFyIENyZWF0ZUZpbGU7XG4oZnVuY3Rpb24gKENyZWF0ZUZpbGUpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUodXJpLCBvcHRpb25zLCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7XG4gICAgICAgICAgICBraW5kOiAnY3JlYXRlJyxcbiAgICAgICAgICAgIHVyaVxuICAgICAgICB9O1xuICAgICAgICBpZiAob3B0aW9ucyAhPT0gdW5kZWZpbmVkICYmIChvcHRpb25zLm92ZXJ3cml0ZSAhPT0gdW5kZWZpbmVkIHx8IG9wdGlvbnMuaWdub3JlSWZFeGlzdHMgIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgfVxuICAgICAgICBpZiAoYW5ub3RhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQuYW5ub3RhdGlvbklkID0gYW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBDcmVhdGVGaWxlLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgY2FuZGlkYXRlLmtpbmQgPT09ICdjcmVhdGUnICYmIElzLnN0cmluZyhjYW5kaWRhdGUudXJpKSAmJiAoY2FuZGlkYXRlLm9wdGlvbnMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgKChjYW5kaWRhdGUub3B0aW9ucy5vdmVyd3JpdGUgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5vcHRpb25zLm92ZXJ3cml0ZSkpICYmIChjYW5kaWRhdGUub3B0aW9ucy5pZ25vcmVJZkV4aXN0cyA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLm9wdGlvbnMuaWdub3JlSWZFeGlzdHMpKSkpICYmIChjYW5kaWRhdGUuYW5ub3RhdGlvbklkID09PSB1bmRlZmluZWQgfHwgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoY2FuZGlkYXRlLmFubm90YXRpb25JZCkpO1xuICAgIH1cbiAgICBDcmVhdGVGaWxlLmlzID0gaXM7XG59KShDcmVhdGVGaWxlIHx8IChDcmVhdGVGaWxlID0ge30pKTtcbmV4cG9ydCB2YXIgUmVuYW1lRmlsZTtcbihmdW5jdGlvbiAoUmVuYW1lRmlsZSkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShvbGRVcmksIG5ld1VyaSwgb3B0aW9ucywgYW5ub3RhdGlvbikge1xuICAgICAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgICAgICAga2luZDogJ3JlbmFtZScsXG4gICAgICAgICAgICBvbGRVcmksXG4gICAgICAgICAgICBuZXdVcmlcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKG9wdGlvbnMgIT09IHVuZGVmaW5lZCAmJiAob3B0aW9ucy5vdmVyd3JpdGUgIT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLmlnbm9yZUlmRXhpc3RzICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICByZXN1bHQub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFubm90YXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmFubm90YXRpb25JZCA9IGFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgUmVuYW1lRmlsZS5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIGNhbmRpZGF0ZS5raW5kID09PSAncmVuYW1lJyAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLm9sZFVyaSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5uZXdVcmkpICYmIChjYW5kaWRhdGUub3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAoKGNhbmRpZGF0ZS5vcHRpb25zLm92ZXJ3cml0ZSA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLm9wdGlvbnMub3ZlcndyaXRlKSkgJiYgKGNhbmRpZGF0ZS5vcHRpb25zLmlnbm9yZUlmRXhpc3RzID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUub3B0aW9ucy5pZ25vcmVJZkV4aXN0cykpKSkgJiYgKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQgPT09IHVuZGVmaW5lZCB8fCBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhjYW5kaWRhdGUuYW5ub3RhdGlvbklkKSk7XG4gICAgfVxuICAgIFJlbmFtZUZpbGUuaXMgPSBpcztcbn0pKFJlbmFtZUZpbGUgfHwgKFJlbmFtZUZpbGUgPSB7fSkpO1xuZXhwb3J0IHZhciBEZWxldGVGaWxlO1xuKGZ1bmN0aW9uIChEZWxldGVGaWxlKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKHVyaSwgb3B0aW9ucywgYW5ub3RhdGlvbikge1xuICAgICAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgICAgICAga2luZDogJ2RlbGV0ZScsXG4gICAgICAgICAgICB1cmlcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKG9wdGlvbnMgIT09IHVuZGVmaW5lZCAmJiAob3B0aW9ucy5yZWN1cnNpdmUgIT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLmlnbm9yZUlmTm90RXhpc3RzICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICByZXN1bHQub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFubm90YXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmFubm90YXRpb25JZCA9IGFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgRGVsZXRlRmlsZS5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIGNhbmRpZGF0ZS5raW5kID09PSAnZGVsZXRlJyAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSkgJiYgKGNhbmRpZGF0ZS5vcHRpb25zID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICgoY2FuZGlkYXRlLm9wdGlvbnMucmVjdXJzaXZlID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUub3B0aW9ucy5yZWN1cnNpdmUpKSAmJiAoY2FuZGlkYXRlLm9wdGlvbnMuaWdub3JlSWZOb3RFeGlzdHMgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5vcHRpb25zLmlnbm9yZUlmTm90RXhpc3RzKSkpKSAmJiAoY2FuZGlkYXRlLmFubm90YXRpb25JZCA9PT0gdW5kZWZpbmVkIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQpKTtcbiAgICB9XG4gICAgRGVsZXRlRmlsZS5pcyA9IGlzO1xufSkoRGVsZXRlRmlsZSB8fCAoRGVsZXRlRmlsZSA9IHt9KSk7XG5leHBvcnQgdmFyIFdvcmtzcGFjZUVkaXQ7XG4oZnVuY3Rpb24gKFdvcmtzcGFjZUVkaXQpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuY2hhbmdlcyAhPT0gdW5kZWZpbmVkIHx8IGNhbmRpZGF0ZS5kb2N1bWVudENoYW5nZXMgIT09IHVuZGVmaW5lZCkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuZG9jdW1lbnRDaGFuZ2VzID09PSB1bmRlZmluZWQgfHwgY2FuZGlkYXRlLmRvY3VtZW50Q2hhbmdlcy5ldmVyeSgoY2hhbmdlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKElzLnN0cmluZyhjaGFuZ2Uua2luZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZUZpbGUuaXMoY2hhbmdlKSB8fCBSZW5hbWVGaWxlLmlzKGNoYW5nZSkgfHwgRGVsZXRlRmlsZS5pcyhjaGFuZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRleHREb2N1bWVudEVkaXQuaXMoY2hhbmdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSk7XG4gICAgfVxuICAgIFdvcmtzcGFjZUVkaXQuaXMgPSBpcztcbn0pKFdvcmtzcGFjZUVkaXQgfHwgKFdvcmtzcGFjZUVkaXQgPSB7fSkpO1xuY2xhc3MgVGV4dEVkaXRDaGFuZ2VJbXBsIHtcbiAgICBjb25zdHJ1Y3RvcihlZGl0cywgY2hhbmdlQW5ub3RhdGlvbnMpIHtcbiAgICAgICAgdGhpcy5lZGl0cyA9IGVkaXRzO1xuICAgICAgICB0aGlzLmNoYW5nZUFubm90YXRpb25zID0gY2hhbmdlQW5ub3RhdGlvbnM7XG4gICAgfVxuICAgIGluc2VydChwb3NpdGlvbiwgbmV3VGV4dCwgYW5ub3RhdGlvbikge1xuICAgICAgICBsZXQgZWRpdDtcbiAgICAgICAgbGV0IGlkO1xuICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBlZGl0ID0gVGV4dEVkaXQuaW5zZXJ0KHBvc2l0aW9uLCBuZXdUZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhhbm5vdGF0aW9uKSkge1xuICAgICAgICAgICAgaWQgPSBhbm5vdGF0aW9uO1xuICAgICAgICAgICAgZWRpdCA9IEFubm90YXRlZFRleHRFZGl0Lmluc2VydChwb3NpdGlvbiwgbmV3VGV4dCwgYW5ub3RhdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFzc2VydENoYW5nZUFubm90YXRpb25zKHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgaWQgPSB0aGlzLmNoYW5nZUFubm90YXRpb25zLm1hbmFnZShhbm5vdGF0aW9uKTtcbiAgICAgICAgICAgIGVkaXQgPSBBbm5vdGF0ZWRUZXh0RWRpdC5pbnNlcnQocG9zaXRpb24sIG5ld1RleHQsIGlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVkaXRzLnB1c2goZWRpdCk7XG4gICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVwbGFjZShyYW5nZSwgbmV3VGV4dCwgYW5ub3RhdGlvbikge1xuICAgICAgICBsZXQgZWRpdDtcbiAgICAgICAgbGV0IGlkO1xuICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBlZGl0ID0gVGV4dEVkaXQucmVwbGFjZShyYW5nZSwgbmV3VGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoYW5ub3RhdGlvbikpIHtcbiAgICAgICAgICAgIGlkID0gYW5ub3RhdGlvbjtcbiAgICAgICAgICAgIGVkaXQgPSBBbm5vdGF0ZWRUZXh0RWRpdC5yZXBsYWNlKHJhbmdlLCBuZXdUZXh0LCBhbm5vdGF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYXNzZXJ0Q2hhbmdlQW5ub3RhdGlvbnModGhpcy5jaGFuZ2VBbm5vdGF0aW9ucyk7XG4gICAgICAgICAgICBpZCA9IHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMubWFuYWdlKGFubm90YXRpb24pO1xuICAgICAgICAgICAgZWRpdCA9IEFubm90YXRlZFRleHRFZGl0LnJlcGxhY2UocmFuZ2UsIG5ld1RleHQsIGlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVkaXRzLnB1c2goZWRpdCk7XG4gICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVsZXRlKHJhbmdlLCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIGxldCBlZGl0O1xuICAgICAgICBsZXQgaWQ7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGVkaXQgPSBUZXh0RWRpdC5kZWwocmFuZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGFubm90YXRpb24pKSB7XG4gICAgICAgICAgICBpZCA9IGFubm90YXRpb247XG4gICAgICAgICAgICBlZGl0ID0gQW5ub3RhdGVkVGV4dEVkaXQuZGVsKHJhbmdlLCBhbm5vdGF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYXNzZXJ0Q2hhbmdlQW5ub3RhdGlvbnModGhpcy5jaGFuZ2VBbm5vdGF0aW9ucyk7XG4gICAgICAgICAgICBpZCA9IHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMubWFuYWdlKGFubm90YXRpb24pO1xuICAgICAgICAgICAgZWRpdCA9IEFubm90YXRlZFRleHRFZGl0LmRlbChyYW5nZSwgaWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWRpdHMucHVzaChlZGl0KTtcbiAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhZGQoZWRpdCkge1xuICAgICAgICB0aGlzLmVkaXRzLnB1c2goZWRpdCk7XG4gICAgfVxuICAgIGFsbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdHM7XG4gICAgfVxuICAgIGNsZWFyKCkge1xuICAgICAgICB0aGlzLmVkaXRzLnNwbGljZSgwLCB0aGlzLmVkaXRzLmxlbmd0aCk7XG4gICAgfVxuICAgIGFzc2VydENoYW5nZUFubm90YXRpb25zKHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRleHQgZWRpdCBjaGFuZ2UgaXMgbm90IGNvbmZpZ3VyZWQgdG8gbWFuYWdlIGNoYW5nZSBhbm5vdGF0aW9ucy5gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogQSBoZWxwZXIgY2xhc3NcbiAqL1xuY2xhc3MgQ2hhbmdlQW5ub3RhdGlvbnMge1xuICAgIGNvbnN0cnVjdG9yKGFubm90YXRpb25zKSB7XG4gICAgICAgIHRoaXMuX2Fubm90YXRpb25zID0gYW5ub3RhdGlvbnMgPT09IHVuZGVmaW5lZCA/IE9iamVjdC5jcmVhdGUobnVsbCkgOiBhbm5vdGF0aW9ucztcbiAgICAgICAgdGhpcy5fY291bnRlciA9IDA7XG4gICAgICAgIHRoaXMuX3NpemUgPSAwO1xuICAgIH1cbiAgICBhbGwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hbm5vdGF0aW9ucztcbiAgICB9XG4gICAgZ2V0IHNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaXplO1xuICAgIH1cbiAgICBtYW5hZ2UoaWRPckFubm90YXRpb24sIGFubm90YXRpb24pIHtcbiAgICAgICAgbGV0IGlkO1xuICAgICAgICBpZiAoQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoaWRPckFubm90YXRpb24pKSB7XG4gICAgICAgICAgICBpZCA9IGlkT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWQgPSB0aGlzLm5leHRJZCgpO1xuICAgICAgICAgICAgYW5ub3RhdGlvbiA9IGlkT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9hbm5vdGF0aW9uc1tpZF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJZCAke2lkfSBpcyBhbHJlYWR5IGluIHVzZS5gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGFubm90YXRpb24gcHJvdmlkZWQgZm9yIGlkICR7aWR9YCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fYW5ub3RhdGlvbnNbaWRdID0gYW5ub3RhdGlvbjtcbiAgICAgICAgdGhpcy5fc2l6ZSsrO1xuICAgICAgICByZXR1cm4gaWQ7XG4gICAgfVxuICAgIG5leHRJZCgpIHtcbiAgICAgICAgdGhpcy5fY291bnRlcisrO1xuICAgICAgICByZXR1cm4gdGhpcy5fY291bnRlci50b1N0cmluZygpO1xuICAgIH1cbn1cbi8qKlxuICogQSB3b3Jrc3BhY2UgY2hhbmdlIGhlbHBzIGNvbnN0cnVjdGluZyBjaGFuZ2VzIHRvIGEgd29ya3NwYWNlLlxuICovXG5leHBvcnQgY2xhc3MgV29ya3NwYWNlQ2hhbmdlIHtcbiAgICBjb25zdHJ1Y3Rvcih3b3Jrc3BhY2VFZGl0KSB7XG4gICAgICAgIHRoaXMuX3RleHRFZGl0Q2hhbmdlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIGlmICh3b3Jrc3BhY2VFZGl0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQgPSB3b3Jrc3BhY2VFZGl0O1xuICAgICAgICAgICAgaWYgKHdvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMgPSBuZXcgQ2hhbmdlQW5ub3RhdGlvbnMod29ya3NwYWNlRWRpdC5jaGFuZ2VBbm5vdGF0aW9ucyk7XG4gICAgICAgICAgICAgICAgd29ya3NwYWNlRWRpdC5jaGFuZ2VBbm5vdGF0aW9ucyA9IHRoaXMuX2NoYW5nZUFubm90YXRpb25zLmFsbCgpO1xuICAgICAgICAgICAgICAgIHdvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzLmZvckVhY2goKGNoYW5nZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoVGV4dERvY3VtZW50RWRpdC5pcyhjaGFuZ2UpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0RWRpdENoYW5nZSA9IG5ldyBUZXh0RWRpdENoYW5nZUltcGwoY2hhbmdlLmVkaXRzLCB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXh0RWRpdENoYW5nZXNbY2hhbmdlLnRleHREb2N1bWVudC51cmldID0gdGV4dEVkaXRDaGFuZ2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHdvcmtzcGFjZUVkaXQuY2hhbmdlcykge1xuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHdvcmtzcGFjZUVkaXQuY2hhbmdlcykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHRFZGl0Q2hhbmdlID0gbmV3IFRleHRFZGl0Q2hhbmdlSW1wbCh3b3Jrc3BhY2VFZGl0LmNoYW5nZXNba2V5XSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RleHRFZGl0Q2hhbmdlc1trZXldID0gdGV4dEVkaXRDaGFuZ2U7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0ID0ge307XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdW5kZXJseWluZyB7QGxpbmsgV29ya3NwYWNlRWRpdH0gbGl0ZXJhbFxuICAgICAqIHVzZSB0byBiZSByZXR1cm5lZCBmcm9tIGEgd29ya3NwYWNlIGVkaXQgb3BlcmF0aW9uIGxpa2UgcmVuYW1lLlxuICAgICAqL1xuICAgIGdldCBlZGl0KCkge1xuICAgICAgICB0aGlzLmluaXREb2N1bWVudENoYW5nZXMoKTtcbiAgICAgICAgaWYgKHRoaXMuX2NoYW5nZUFubm90YXRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5zaXplID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VBbm5vdGF0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlQW5ub3RhdGlvbnMgPSB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5hbGwoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fd29ya3NwYWNlRWRpdDtcbiAgICB9XG4gICAgZ2V0VGV4dEVkaXRDaGFuZ2Uoa2V5KSB7XG4gICAgICAgIGlmIChPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIuaXMoa2V5KSkge1xuICAgICAgICAgICAgdGhpcy5pbml0RG9jdW1lbnRDaGFuZ2VzKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV29ya3NwYWNlIGVkaXQgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIGRvY3VtZW50IGNoYW5nZXMuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0ZXh0RG9jdW1lbnQgPSB7IHVyaToga2V5LnVyaSwgdmVyc2lvbjoga2V5LnZlcnNpb24gfTtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLl90ZXh0RWRpdENoYW5nZXNbdGV4dERvY3VtZW50LnVyaV07XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVkaXRzID0gW107XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dERvY3VtZW50RWRpdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dERvY3VtZW50LFxuICAgICAgICAgICAgICAgICAgICBlZGl0c1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMucHVzaCh0ZXh0RG9jdW1lbnRFZGl0KTtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgVGV4dEVkaXRDaGFuZ2VJbXBsKGVkaXRzLCB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGV4dEVkaXRDaGFuZ2VzW3RleHREb2N1bWVudC51cmldID0gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdENoYW5nZXMoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV29ya3NwYWNlIGVkaXQgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIG5vcm1hbCB0ZXh0IGVkaXQgY2hhbmdlcy4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLl90ZXh0RWRpdENoYW5nZXNba2V5XTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgbGV0IGVkaXRzID0gW107XG4gICAgICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VzW2tleV0gPSBlZGl0cztcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgVGV4dEVkaXRDaGFuZ2VJbXBsKGVkaXRzKTtcbiAgICAgICAgICAgICAgICB0aGlzLl90ZXh0RWRpdENoYW5nZXNba2V5XSA9IHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaW5pdERvY3VtZW50Q2hhbmdlcygpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzID09PSB1bmRlZmluZWQgJiYgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZUFubm90YXRpb25zID0gbmV3IENoYW5nZUFubm90YXRpb25zKCk7XG4gICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VBbm5vdGF0aW9ucyA9IHRoaXMuX2NoYW5nZUFubm90YXRpb25zLmFsbCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGluaXRDaGFuZ2VzKCkge1xuICAgICAgICBpZiAodGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMgPT09IHVuZGVmaW5lZCAmJiB0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjcmVhdGVGaWxlKHVyaSwgb3B0aW9uc09yQW5ub3RhdGlvbiwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLmluaXREb2N1bWVudENoYW5nZXMoKTtcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV29ya3NwYWNlIGVkaXQgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIGRvY3VtZW50IGNoYW5nZXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGFubm90YXRpb247XG4gICAgICAgIGlmIChDaGFuZ2VBbm5vdGF0aW9uLmlzKG9wdGlvbnNPckFubm90YXRpb24pIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKG9wdGlvbnNPckFubm90YXRpb24pKSB7XG4gICAgICAgICAgICBhbm5vdGF0aW9uID0gb3B0aW9uc09yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGxldCBvcGVyYXRpb247XG4gICAgICAgIGxldCBpZDtcbiAgICAgICAgaWYgKGFubm90YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3BlcmF0aW9uID0gQ3JlYXRlRmlsZS5jcmVhdGUodXJpLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlkID0gQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoYW5ub3RhdGlvbikgPyBhbm5vdGF0aW9uIDogdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMubWFuYWdlKGFubm90YXRpb24pO1xuICAgICAgICAgICAgb3BlcmF0aW9uID0gQ3JlYXRlRmlsZS5jcmVhdGUodXJpLCBvcHRpb25zLCBpZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMucHVzaChvcGVyYXRpb24pO1xuICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlbmFtZUZpbGUob2xkVXJpLCBuZXdVcmksIG9wdGlvbnNPckFubm90YXRpb24sIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5pbml0RG9jdW1lbnRDaGFuZ2VzKCk7XG4gICAgICAgIGlmICh0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dvcmtzcGFjZSBlZGl0IGlzIG5vdCBjb25maWd1cmVkIGZvciBkb2N1bWVudCBjaGFuZ2VzLicpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhbm5vdGF0aW9uO1xuICAgICAgICBpZiAoQ2hhbmdlQW5ub3RhdGlvbi5pcyhvcHRpb25zT3JBbm5vdGF0aW9uKSB8fCBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhvcHRpb25zT3JBbm5vdGF0aW9uKSkge1xuICAgICAgICAgICAgYW5ub3RhdGlvbiA9IG9wdGlvbnNPckFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvcHRpb25zID0gb3B0aW9uc09yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb3BlcmF0aW9uO1xuICAgICAgICBsZXQgaWQ7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wZXJhdGlvbiA9IFJlbmFtZUZpbGUuY3JlYXRlKG9sZFVyaSwgbmV3VXJpLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlkID0gQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoYW5ub3RhdGlvbikgPyBhbm5vdGF0aW9uIDogdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMubWFuYWdlKGFubm90YXRpb24pO1xuICAgICAgICAgICAgb3BlcmF0aW9uID0gUmVuYW1lRmlsZS5jcmVhdGUob2xkVXJpLCBuZXdVcmksIG9wdGlvbnMsIGlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcy5wdXNoKG9wZXJhdGlvbik7XG4gICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVsZXRlRmlsZSh1cmksIG9wdGlvbnNPckFubm90YXRpb24sIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5pbml0RG9jdW1lbnRDaGFuZ2VzKCk7XG4gICAgICAgIGlmICh0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dvcmtzcGFjZSBlZGl0IGlzIG5vdCBjb25maWd1cmVkIGZvciBkb2N1bWVudCBjaGFuZ2VzLicpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhbm5vdGF0aW9uO1xuICAgICAgICBpZiAoQ2hhbmdlQW5ub3RhdGlvbi5pcyhvcHRpb25zT3JBbm5vdGF0aW9uKSB8fCBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhvcHRpb25zT3JBbm5vdGF0aW9uKSkge1xuICAgICAgICAgICAgYW5ub3RhdGlvbiA9IG9wdGlvbnNPckFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvcHRpb25zID0gb3B0aW9uc09yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb3BlcmF0aW9uO1xuICAgICAgICBsZXQgaWQ7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wZXJhdGlvbiA9IERlbGV0ZUZpbGUuY3JlYXRlKHVyaSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZCA9IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGFubm90YXRpb24pID8gYW5ub3RhdGlvbiA6IHRoaXMuX2NoYW5nZUFubm90YXRpb25zLm1hbmFnZShhbm5vdGF0aW9uKTtcbiAgICAgICAgICAgIG9wZXJhdGlvbiA9IERlbGV0ZUZpbGUuY3JlYXRlKHVyaSwgb3B0aW9ucywgaWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzLnB1c2gob3BlcmF0aW9uKTtcbiAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogVGhlIFRleHREb2N1bWVudElkZW50aWZpZXIgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgVGV4dERvY3VtZW50SWRlbnRpZmllcn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgVGV4dERvY3VtZW50SWRlbnRpZmllcjtcbihmdW5jdGlvbiAoVGV4dERvY3VtZW50SWRlbnRpZmllcikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgVGV4dERvY3VtZW50SWRlbnRpZmllciBsaXRlcmFsLlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIGRvY3VtZW50J3MgdXJpLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmkpIHtcbiAgICAgICAgcmV0dXJuIHsgdXJpIH07XG4gICAgfVxuICAgIFRleHREb2N1bWVudElkZW50aWZpZXIuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgVGV4dERvY3VtZW50SWRlbnRpZmllcn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSk7XG4gICAgfVxuICAgIFRleHREb2N1bWVudElkZW50aWZpZXIuaXMgPSBpcztcbn0pKFRleHREb2N1bWVudElkZW50aWZpZXIgfHwgKFRleHREb2N1bWVudElkZW50aWZpZXIgPSB7fSkpO1xuLyoqXG4gKiBUaGUgVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyO1xuKGZ1bmN0aW9uIChWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIGxpdGVyYWwuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgZG9jdW1lbnQncyB1cmkuXG4gICAgICogQHBhcmFtIHZlcnNpb24gVGhlIGRvY3VtZW50J3MgdmVyc2lvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodXJpLCB2ZXJzaW9uKSB7XG4gICAgICAgIHJldHVybiB7IHVyaSwgdmVyc2lvbiB9O1xuICAgIH1cbiAgICBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXJ9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpICYmIElzLmludGVnZXIoY2FuZGlkYXRlLnZlcnNpb24pO1xuICAgIH1cbiAgICBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmlzID0gaXM7XG59KShWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIHx8IChWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyID0ge30pKTtcbi8qKlxuICogVGhlIE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXJ9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcjtcbihmdW5jdGlvbiAoT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIgbGl0ZXJhbC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSBkb2N1bWVudCdzIHVyaS5cbiAgICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgZG9jdW1lbnQncyB2ZXJzaW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmksIHZlcnNpb24pIHtcbiAgICAgICAgcmV0dXJuIHsgdXJpLCB2ZXJzaW9uIH07XG4gICAgfVxuICAgIE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllci5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXJ9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpICYmIChjYW5kaWRhdGUudmVyc2lvbiA9PT0gbnVsbCB8fCBJcy5pbnRlZ2VyKGNhbmRpZGF0ZS52ZXJzaW9uKSk7XG4gICAgfVxuICAgIE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllci5pcyA9IGlzO1xufSkoT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIHx8IChPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIgPSB7fSkpO1xuLyoqXG4gKiBUaGUgVGV4dERvY3VtZW50SXRlbSBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBUZXh0RG9jdW1lbnRJdGVtfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBUZXh0RG9jdW1lbnRJdGVtO1xuKGZ1bmN0aW9uIChUZXh0RG9jdW1lbnRJdGVtKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBUZXh0RG9jdW1lbnRJdGVtIGxpdGVyYWwuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgZG9jdW1lbnQncyB1cmkuXG4gICAgICogQHBhcmFtIGxhbmd1YWdlSWQgVGhlIGRvY3VtZW50J3MgbGFuZ3VhZ2UgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgZG9jdW1lbnQncyB2ZXJzaW9uIG51bWJlci5cbiAgICAgKiBAcGFyYW0gdGV4dCBUaGUgZG9jdW1lbnQncyB0ZXh0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmksIGxhbmd1YWdlSWQsIHZlcnNpb24sIHRleHQpIHtcbiAgICAgICAgcmV0dXJuIHsgdXJpLCBsYW5ndWFnZUlkLCB2ZXJzaW9uLCB0ZXh0IH07XG4gICAgfVxuICAgIFRleHREb2N1bWVudEl0ZW0uY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgVGV4dERvY3VtZW50SXRlbX0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5sYW5ndWFnZUlkKSAmJiBJcy5pbnRlZ2VyKGNhbmRpZGF0ZS52ZXJzaW9uKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnRleHQpO1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnRJdGVtLmlzID0gaXM7XG59KShUZXh0RG9jdW1lbnRJdGVtIHx8IChUZXh0RG9jdW1lbnRJdGVtID0ge30pKTtcbi8qKlxuICogRGVzY3JpYmVzIHRoZSBjb250ZW50IHR5cGUgdGhhdCBhIGNsaWVudCBzdXBwb3J0cyBpbiB2YXJpb3VzXG4gKiByZXN1bHQgbGl0ZXJhbHMgbGlrZSBgSG92ZXJgLCBgUGFyYW1ldGVySW5mb2Agb3IgYENvbXBsZXRpb25JdGVtYC5cbiAqXG4gKiBQbGVhc2Ugbm90ZSB0aGF0IGBNYXJrdXBLaW5kc2AgbXVzdCBub3Qgc3RhcnQgd2l0aCBhIGAkYC4gVGhpcyBraW5kc1xuICogYXJlIHJlc2VydmVkIGZvciBpbnRlcm5hbCB1c2FnZS5cbiAqL1xuZXhwb3J0IHZhciBNYXJrdXBLaW5kO1xuKGZ1bmN0aW9uIChNYXJrdXBLaW5kKSB7XG4gICAgLyoqXG4gICAgICogUGxhaW4gdGV4dCBpcyBzdXBwb3J0ZWQgYXMgYSBjb250ZW50IGZvcm1hdFxuICAgICAqL1xuICAgIE1hcmt1cEtpbmQuUGxhaW5UZXh0ID0gJ3BsYWludGV4dCc7XG4gICAgLyoqXG4gICAgICogTWFya2Rvd24gaXMgc3VwcG9ydGVkIGFzIGEgY29udGVudCBmb3JtYXRcbiAgICAgKi9cbiAgICBNYXJrdXBLaW5kLk1hcmtkb3duID0gJ21hcmtkb3duJztcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgaXMgYSB2YWx1ZSBvZiB0aGUge0BsaW5rIE1hcmt1cEtpbmR9IHR5cGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgPT09IE1hcmt1cEtpbmQuUGxhaW5UZXh0IHx8IGNhbmRpZGF0ZSA9PT0gTWFya3VwS2luZC5NYXJrZG93bjtcbiAgICB9XG4gICAgTWFya3VwS2luZC5pcyA9IGlzO1xufSkoTWFya3VwS2luZCB8fCAoTWFya3VwS2luZCA9IHt9KSk7XG5leHBvcnQgdmFyIE1hcmt1cENvbnRlbnQ7XG4oZnVuY3Rpb24gKE1hcmt1cENvbnRlbnQpIHtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgY29uZm9ybXMgdG8gdGhlIHtAbGluayBNYXJrdXBDb250ZW50fSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKHZhbHVlKSAmJiBNYXJrdXBLaW5kLmlzKGNhbmRpZGF0ZS5raW5kKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnZhbHVlKTtcbiAgICB9XG4gICAgTWFya3VwQ29udGVudC5pcyA9IGlzO1xufSkoTWFya3VwQ29udGVudCB8fCAoTWFya3VwQ29udGVudCA9IHt9KSk7XG4vKipcbiAqIFRoZSBraW5kIG9mIGEgY29tcGxldGlvbiBlbnRyeS5cbiAqL1xuZXhwb3J0IHZhciBDb21wbGV0aW9uSXRlbUtpbmQ7XG4oZnVuY3Rpb24gKENvbXBsZXRpb25JdGVtS2luZCkge1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5UZXh0ID0gMTtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuTWV0aG9kID0gMjtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuRnVuY3Rpb24gPSAzO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5Db25zdHJ1Y3RvciA9IDQ7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkZpZWxkID0gNTtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuVmFyaWFibGUgPSA2O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5DbGFzcyA9IDc7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkludGVyZmFjZSA9IDg7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLk1vZHVsZSA9IDk7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlByb3BlcnR5ID0gMTA7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlVuaXQgPSAxMTtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuVmFsdWUgPSAxMjtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuRW51bSA9IDEzO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5LZXl3b3JkID0gMTQ7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlNuaXBwZXQgPSAxNTtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuQ29sb3IgPSAxNjtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuRmlsZSA9IDE3O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5SZWZlcmVuY2UgPSAxODtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuRm9sZGVyID0gMTk7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkVudW1NZW1iZXIgPSAyMDtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuQ29uc3RhbnQgPSAyMTtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuU3RydWN0ID0gMjI7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkV2ZW50ID0gMjM7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLk9wZXJhdG9yID0gMjQ7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlR5cGVQYXJhbWV0ZXIgPSAyNTtcbn0pKENvbXBsZXRpb25JdGVtS2luZCB8fCAoQ29tcGxldGlvbkl0ZW1LaW5kID0ge30pKTtcbi8qKlxuICogRGVmaW5lcyB3aGV0aGVyIHRoZSBpbnNlcnQgdGV4dCBpbiBhIGNvbXBsZXRpb24gaXRlbSBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXNcbiAqIHBsYWluIHRleHQgb3IgYSBzbmlwcGV0LlxuICovXG5leHBvcnQgdmFyIEluc2VydFRleHRGb3JtYXQ7XG4oZnVuY3Rpb24gKEluc2VydFRleHRGb3JtYXQpIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpbWFyeSB0ZXh0IHRvIGJlIGluc2VydGVkIGlzIHRyZWF0ZWQgYXMgYSBwbGFpbiBzdHJpbmcuXG4gICAgICovXG4gICAgSW5zZXJ0VGV4dEZvcm1hdC5QbGFpblRleHQgPSAxO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcmltYXJ5IHRleHQgdG8gYmUgaW5zZXJ0ZWQgaXMgdHJlYXRlZCBhcyBhIHNuaXBwZXQuXG4gICAgICpcbiAgICAgKiBBIHNuaXBwZXQgY2FuIGRlZmluZSB0YWIgc3RvcHMgYW5kIHBsYWNlaG9sZGVycyB3aXRoIGAkMWAsIGAkMmBcbiAgICAgKiBhbmQgYCR7Mzpmb299YC4gYCQwYCBkZWZpbmVzIHRoZSBmaW5hbCB0YWIgc3RvcCwgaXQgZGVmYXVsdHMgdG9cbiAgICAgKiB0aGUgZW5kIG9mIHRoZSBzbmlwcGV0LiBQbGFjZWhvbGRlcnMgd2l0aCBlcXVhbCBpZGVudGlmaWVycyBhcmUgbGlua2VkLFxuICAgICAqIHRoYXQgaXMgdHlwaW5nIGluIG9uZSB3aWxsIHVwZGF0ZSBvdGhlcnMgdG9vLlxuICAgICAqXG4gICAgICogU2VlIGFsc286IGh0dHBzOi8vbWljcm9zb2Z0LmdpdGh1Yi5pby9sYW5ndWFnZS1zZXJ2ZXItcHJvdG9jb2wvc3BlY2lmaWNhdGlvbnMvc3BlY2lmaWNhdGlvbi1jdXJyZW50LyNzbmlwcGV0X3N5bnRheFxuICAgICAqL1xuICAgIEluc2VydFRleHRGb3JtYXQuU25pcHBldCA9IDI7XG59KShJbnNlcnRUZXh0Rm9ybWF0IHx8IChJbnNlcnRUZXh0Rm9ybWF0ID0ge30pKTtcbi8qKlxuICogQ29tcGxldGlvbiBpdGVtIHRhZ3MgYXJlIGV4dHJhIGFubm90YXRpb25zIHRoYXQgdHdlYWsgdGhlIHJlbmRlcmluZyBvZiBhIGNvbXBsZXRpb25cbiAqIGl0ZW0uXG4gKlxuICogQHNpbmNlIDMuMTUuMFxuICovXG5leHBvcnQgdmFyIENvbXBsZXRpb25JdGVtVGFnO1xuKGZ1bmN0aW9uIChDb21wbGV0aW9uSXRlbVRhZykge1xuICAgIC8qKlxuICAgICAqIFJlbmRlciBhIGNvbXBsZXRpb24gYXMgb2Jzb2xldGUsIHVzdWFsbHkgdXNpbmcgYSBzdHJpa2Utb3V0LlxuICAgICAqL1xuICAgIENvbXBsZXRpb25JdGVtVGFnLkRlcHJlY2F0ZWQgPSAxO1xufSkoQ29tcGxldGlvbkl0ZW1UYWcgfHwgKENvbXBsZXRpb25JdGVtVGFnID0ge30pKTtcbi8qKlxuICogVGhlIEluc2VydFJlcGxhY2VFZGl0IG5hbWVzcGFjZSBwcm92aWRlcyBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIGluc2VydCAvIHJlcGxhY2UgZWRpdHMuXG4gKlxuICogQHNpbmNlIDMuMTYuMFxuICovXG5leHBvcnQgdmFyIEluc2VydFJlcGxhY2VFZGl0O1xuKGZ1bmN0aW9uIChJbnNlcnRSZXBsYWNlRWRpdCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zZXJ0IC8gcmVwbGFjZSBlZGl0XG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKG5ld1RleHQsIGluc2VydCwgcmVwbGFjZSkge1xuICAgICAgICByZXR1cm4geyBuZXdUZXh0LCBpbnNlcnQsIHJlcGxhY2UgfTtcbiAgICB9XG4gICAgSW5zZXJ0UmVwbGFjZUVkaXQuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgSW5zZXJ0UmVwbGFjZUVkaXR9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLm5ld1RleHQpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5pbnNlcnQpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yZXBsYWNlKTtcbiAgICB9XG4gICAgSW5zZXJ0UmVwbGFjZUVkaXQuaXMgPSBpcztcbn0pKEluc2VydFJlcGxhY2VFZGl0IHx8IChJbnNlcnRSZXBsYWNlRWRpdCA9IHt9KSk7XG4vKipcbiAqIEhvdyB3aGl0ZXNwYWNlIGFuZCBpbmRlbnRhdGlvbiBpcyBoYW5kbGVkIGR1cmluZyBjb21wbGV0aW9uXG4gKiBpdGVtIGluc2VydGlvbi5cbiAqXG4gKiBAc2luY2UgMy4xNi4wXG4gKi9cbmV4cG9ydCB2YXIgSW5zZXJ0VGV4dE1vZGU7XG4oZnVuY3Rpb24gKEluc2VydFRleHRNb2RlKSB7XG4gICAgLyoqXG4gICAgICogVGhlIGluc2VydGlvbiBvciByZXBsYWNlIHN0cmluZ3MgaXMgdGFrZW4gYXMgaXQgaXMuIElmIHRoZVxuICAgICAqIHZhbHVlIGlzIG11bHRpIGxpbmUgdGhlIGxpbmVzIGJlbG93IHRoZSBjdXJzb3Igd2lsbCBiZVxuICAgICAqIGluc2VydGVkIHVzaW5nIHRoZSBpbmRlbnRhdGlvbiBkZWZpbmVkIGluIHRoZSBzdHJpbmcgdmFsdWUuXG4gICAgICogVGhlIGNsaWVudCB3aWxsIG5vdCBhcHBseSBhbnkga2luZCBvZiBhZGp1c3RtZW50cyB0byB0aGVcbiAgICAgKiBzdHJpbmcuXG4gICAgICovXG4gICAgSW5zZXJ0VGV4dE1vZGUuYXNJcyA9IDE7XG4gICAgLyoqXG4gICAgICogVGhlIGVkaXRvciBhZGp1c3RzIGxlYWRpbmcgd2hpdGVzcGFjZSBvZiBuZXcgbGluZXMgc28gdGhhdFxuICAgICAqIHRoZXkgbWF0Y2ggdGhlIGluZGVudGF0aW9uIHVwIHRvIHRoZSBjdXJzb3Igb2YgdGhlIGxpbmUgZm9yXG4gICAgICogd2hpY2ggdGhlIGl0ZW0gaXMgYWNjZXB0ZWQuXG4gICAgICpcbiAgICAgKiBDb25zaWRlciBhIGxpbmUgbGlrZSB0aGlzOiA8MnRhYnM+PGN1cnNvcj48M3RhYnM+Zm9vLiBBY2NlcHRpbmcgYVxuICAgICAqIG11bHRpIGxpbmUgY29tcGxldGlvbiBpdGVtIGlzIGluZGVudGVkIHVzaW5nIDIgdGFicyBhbmQgYWxsXG4gICAgICogZm9sbG93aW5nIGxpbmVzIGluc2VydGVkIHdpbGwgYmUgaW5kZW50ZWQgdXNpbmcgMiB0YWJzIGFzIHdlbGwuXG4gICAgICovXG4gICAgSW5zZXJ0VGV4dE1vZGUuYWRqdXN0SW5kZW50YXRpb24gPSAyO1xufSkoSW5zZXJ0VGV4dE1vZGUgfHwgKEluc2VydFRleHRNb2RlID0ge30pKTtcbmV4cG9ydCB2YXIgQ29tcGxldGlvbkl0ZW1MYWJlbERldGFpbHM7XG4oZnVuY3Rpb24gKENvbXBsZXRpb25JdGVtTGFiZWxEZXRhaWxzKSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgKElzLnN0cmluZyhjYW5kaWRhdGUuZGV0YWlsKSB8fCBjYW5kaWRhdGUuZGV0YWlsID09PSB1bmRlZmluZWQpICYmXG4gICAgICAgICAgICAoSXMuc3RyaW5nKGNhbmRpZGF0ZS5kZXNjcmlwdGlvbikgfHwgY2FuZGlkYXRlLmRlc2NyaXB0aW9uID09PSB1bmRlZmluZWQpO1xuICAgIH1cbiAgICBDb21wbGV0aW9uSXRlbUxhYmVsRGV0YWlscy5pcyA9IGlzO1xufSkoQ29tcGxldGlvbkl0ZW1MYWJlbERldGFpbHMgfHwgKENvbXBsZXRpb25JdGVtTGFiZWxEZXRhaWxzID0ge30pKTtcbi8qKlxuICogVGhlIENvbXBsZXRpb25JdGVtIG5hbWVzcGFjZSBwcm92aWRlcyBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoXG4gKiBjb21wbGV0aW9uIGl0ZW1zLlxuICovXG5leHBvcnQgdmFyIENvbXBsZXRpb25JdGVtO1xuKGZ1bmN0aW9uIChDb21wbGV0aW9uSXRlbSkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIGNvbXBsZXRpb24gaXRlbSBhbmQgc2VlZCBpdCB3aXRoIGEgbGFiZWwuXG4gICAgICogQHBhcmFtIGxhYmVsIFRoZSBjb21wbGV0aW9uIGl0ZW0ncyBsYWJlbFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShsYWJlbCkge1xuICAgICAgICByZXR1cm4geyBsYWJlbCB9O1xuICAgIH1cbiAgICBDb21wbGV0aW9uSXRlbS5jcmVhdGUgPSBjcmVhdGU7XG59KShDb21wbGV0aW9uSXRlbSB8fCAoQ29tcGxldGlvbkl0ZW0gPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29tcGxldGlvbkxpc3QgbmFtZXNwYWNlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGhcbiAqIGNvbXBsZXRpb24gbGlzdHMuXG4gKi9cbmV4cG9ydCB2YXIgQ29tcGxldGlvbkxpc3Q7XG4oZnVuY3Rpb24gKENvbXBsZXRpb25MaXN0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBjb21wbGV0aW9uIGxpc3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaXRlbXMgVGhlIGNvbXBsZXRpb24gaXRlbXMuXG4gICAgICogQHBhcmFtIGlzSW5jb21wbGV0ZSBUaGUgbGlzdCBpcyBub3QgY29tcGxldGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGl0ZW1zLCBpc0luY29tcGxldGUpIHtcbiAgICAgICAgcmV0dXJuIHsgaXRlbXM6IGl0ZW1zID8gaXRlbXMgOiBbXSwgaXNJbmNvbXBsZXRlOiAhIWlzSW5jb21wbGV0ZSB9O1xuICAgIH1cbiAgICBDb21wbGV0aW9uTGlzdC5jcmVhdGUgPSBjcmVhdGU7XG59KShDb21wbGV0aW9uTGlzdCB8fCAoQ29tcGxldGlvbkxpc3QgPSB7fSkpO1xuZXhwb3J0IHZhciBNYXJrZWRTdHJpbmc7XG4oZnVuY3Rpb24gKE1hcmtlZFN0cmluZykge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBtYXJrZWQgc3RyaW5nIGZyb20gcGxhaW4gdGV4dC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwbGFpblRleHQgVGhlIHBsYWluIHRleHQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZnJvbVBsYWluVGV4dChwbGFpblRleHQpIHtcbiAgICAgICAgcmV0dXJuIHBsYWluVGV4dC5yZXBsYWNlKC9bXFxcXGAqX3t9W1xcXSgpIytcXC0uIV0vZywgJ1xcXFwkJicpOyAvLyBlc2NhcGUgbWFya2Rvd24gc3ludGF4IHRva2VuczogaHR0cDovL2RhcmluZ2ZpcmViYWxsLm5ldC9wcm9qZWN0cy9tYXJrZG93bi9zeW50YXgjYmFja3NsYXNoXG4gICAgfVxuICAgIE1hcmtlZFN0cmluZy5mcm9tUGxhaW5UZXh0ID0gZnJvbVBsYWluVGV4dDtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgY29uZm9ybXMgdG8gdGhlIHtAbGluayBNYXJrZWRTdHJpbmd9IHR5cGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5zdHJpbmcoY2FuZGlkYXRlKSB8fCAoSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUubGFuZ3VhZ2UpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudmFsdWUpKTtcbiAgICB9XG4gICAgTWFya2VkU3RyaW5nLmlzID0gaXM7XG59KShNYXJrZWRTdHJpbmcgfHwgKE1hcmtlZFN0cmluZyA9IHt9KSk7XG5leHBvcnQgdmFyIEhvdmVyO1xuKGZ1bmN0aW9uIChIb3Zlcikge1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBjb25mb3JtcyB0byB0aGUge0BsaW5rIEhvdmVyfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gISFjYW5kaWRhdGUgJiYgSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIChNYXJrdXBDb250ZW50LmlzKGNhbmRpZGF0ZS5jb250ZW50cykgfHxcbiAgICAgICAgICAgIE1hcmtlZFN0cmluZy5pcyhjYW5kaWRhdGUuY29udGVudHMpIHx8XG4gICAgICAgICAgICBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS5jb250ZW50cywgTWFya2VkU3RyaW5nLmlzKSkgJiYgKHZhbHVlLnJhbmdlID09PSB1bmRlZmluZWQgfHwgUmFuZ2UuaXModmFsdWUucmFuZ2UpKTtcbiAgICB9XG4gICAgSG92ZXIuaXMgPSBpcztcbn0pKEhvdmVyIHx8IChIb3ZlciA9IHt9KSk7XG4vKipcbiAqIFRoZSBQYXJhbWV0ZXJJbmZvcm1hdGlvbiBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBQYXJhbWV0ZXJJbmZvcm1hdGlvbn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgUGFyYW1ldGVySW5mb3JtYXRpb247XG4oZnVuY3Rpb24gKFBhcmFtZXRlckluZm9ybWF0aW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBwYXJhbWV0ZXIgaW5mb3JtYXRpb24gbGl0ZXJhbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBsYWJlbCBBIGxhYmVsIHN0cmluZy5cbiAgICAgKiBAcGFyYW0gZG9jdW1lbnRhdGlvbiBBIGRvYyBzdHJpbmcuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGxhYmVsLCBkb2N1bWVudGF0aW9uKSB7XG4gICAgICAgIHJldHVybiBkb2N1bWVudGF0aW9uID8geyBsYWJlbCwgZG9jdW1lbnRhdGlvbiB9IDogeyBsYWJlbCB9O1xuICAgIH1cbiAgICBQYXJhbWV0ZXJJbmZvcm1hdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG59KShQYXJhbWV0ZXJJbmZvcm1hdGlvbiB8fCAoUGFyYW1ldGVySW5mb3JtYXRpb24gPSB7fSkpO1xuLyoqXG4gKiBUaGUgU2lnbmF0dXJlSW5mb3JtYXRpb24gbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgU2lnbmF0dXJlSW5mb3JtYXRpb259IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIFNpZ25hdHVyZUluZm9ybWF0aW9uO1xuKGZ1bmN0aW9uIChTaWduYXR1cmVJbmZvcm1hdGlvbikge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShsYWJlbCwgZG9jdW1lbnRhdGlvbiwgLi4ucGFyYW1ldGVycykge1xuICAgICAgICBsZXQgcmVzdWx0ID0geyBsYWJlbCB9O1xuICAgICAgICBpZiAoSXMuZGVmaW5lZChkb2N1bWVudGF0aW9uKSkge1xuICAgICAgICAgICAgcmVzdWx0LmRvY3VtZW50YXRpb24gPSBkb2N1bWVudGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKHBhcmFtZXRlcnMpKSB7XG4gICAgICAgICAgICByZXN1bHQucGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQucGFyYW1ldGVycyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIFNpZ25hdHVyZUluZm9ybWF0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKFNpZ25hdHVyZUluZm9ybWF0aW9uIHx8IChTaWduYXR1cmVJbmZvcm1hdGlvbiA9IHt9KSk7XG4vKipcbiAqIEEgZG9jdW1lbnQgaGlnaGxpZ2h0IGtpbmQuXG4gKi9cbmV4cG9ydCB2YXIgRG9jdW1lbnRIaWdobGlnaHRLaW5kO1xuKGZ1bmN0aW9uIChEb2N1bWVudEhpZ2hsaWdodEtpbmQpIHtcbiAgICAvKipcbiAgICAgKiBBIHRleHR1YWwgb2NjdXJyZW5jZS5cbiAgICAgKi9cbiAgICBEb2N1bWVudEhpZ2hsaWdodEtpbmQuVGV4dCA9IDE7XG4gICAgLyoqXG4gICAgICogUmVhZC1hY2Nlc3Mgb2YgYSBzeW1ib2wsIGxpa2UgcmVhZGluZyBhIHZhcmlhYmxlLlxuICAgICAqL1xuICAgIERvY3VtZW50SGlnaGxpZ2h0S2luZC5SZWFkID0gMjtcbiAgICAvKipcbiAgICAgKiBXcml0ZS1hY2Nlc3Mgb2YgYSBzeW1ib2wsIGxpa2Ugd3JpdGluZyB0byBhIHZhcmlhYmxlLlxuICAgICAqL1xuICAgIERvY3VtZW50SGlnaGxpZ2h0S2luZC5Xcml0ZSA9IDM7XG59KShEb2N1bWVudEhpZ2hsaWdodEtpbmQgfHwgKERvY3VtZW50SGlnaGxpZ2h0S2luZCA9IHt9KSk7XG4vKipcbiAqIERvY3VtZW50SGlnaGxpZ2h0IG5hbWVzcGFjZSB0byBwcm92aWRlIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgRG9jdW1lbnRIaWdobGlnaHR9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIERvY3VtZW50SGlnaGxpZ2h0O1xuKGZ1bmN0aW9uIChEb2N1bWVudEhpZ2hsaWdodCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIERvY3VtZW50SGlnaGxpZ2h0IG9iamVjdC5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlIHRoZSBoaWdobGlnaHQgYXBwbGllcyB0by5cbiAgICAgKiBAcGFyYW0ga2luZCBUaGUgaGlnaGxpZ2h0IGtpbmRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIGtpbmQpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHsgcmFuZ2UgfTtcbiAgICAgICAgaWYgKElzLm51bWJlcihraW5kKSkge1xuICAgICAgICAgICAgcmVzdWx0LmtpbmQgPSBraW5kO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIERvY3VtZW50SGlnaGxpZ2h0LmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKERvY3VtZW50SGlnaGxpZ2h0IHx8IChEb2N1bWVudEhpZ2hsaWdodCA9IHt9KSk7XG4vKipcbiAqIEEgc3ltYm9sIGtpbmQuXG4gKi9cbmV4cG9ydCB2YXIgU3ltYm9sS2luZDtcbihmdW5jdGlvbiAoU3ltYm9sS2luZCkge1xuICAgIFN5bWJvbEtpbmQuRmlsZSA9IDE7XG4gICAgU3ltYm9sS2luZC5Nb2R1bGUgPSAyO1xuICAgIFN5bWJvbEtpbmQuTmFtZXNwYWNlID0gMztcbiAgICBTeW1ib2xLaW5kLlBhY2thZ2UgPSA0O1xuICAgIFN5bWJvbEtpbmQuQ2xhc3MgPSA1O1xuICAgIFN5bWJvbEtpbmQuTWV0aG9kID0gNjtcbiAgICBTeW1ib2xLaW5kLlByb3BlcnR5ID0gNztcbiAgICBTeW1ib2xLaW5kLkZpZWxkID0gODtcbiAgICBTeW1ib2xLaW5kLkNvbnN0cnVjdG9yID0gOTtcbiAgICBTeW1ib2xLaW5kLkVudW0gPSAxMDtcbiAgICBTeW1ib2xLaW5kLkludGVyZmFjZSA9IDExO1xuICAgIFN5bWJvbEtpbmQuRnVuY3Rpb24gPSAxMjtcbiAgICBTeW1ib2xLaW5kLlZhcmlhYmxlID0gMTM7XG4gICAgU3ltYm9sS2luZC5Db25zdGFudCA9IDE0O1xuICAgIFN5bWJvbEtpbmQuU3RyaW5nID0gMTU7XG4gICAgU3ltYm9sS2luZC5OdW1iZXIgPSAxNjtcbiAgICBTeW1ib2xLaW5kLkJvb2xlYW4gPSAxNztcbiAgICBTeW1ib2xLaW5kLkFycmF5ID0gMTg7XG4gICAgU3ltYm9sS2luZC5PYmplY3QgPSAxOTtcbiAgICBTeW1ib2xLaW5kLktleSA9IDIwO1xuICAgIFN5bWJvbEtpbmQuTnVsbCA9IDIxO1xuICAgIFN5bWJvbEtpbmQuRW51bU1lbWJlciA9IDIyO1xuICAgIFN5bWJvbEtpbmQuU3RydWN0ID0gMjM7XG4gICAgU3ltYm9sS2luZC5FdmVudCA9IDI0O1xuICAgIFN5bWJvbEtpbmQuT3BlcmF0b3IgPSAyNTtcbiAgICBTeW1ib2xLaW5kLlR5cGVQYXJhbWV0ZXIgPSAyNjtcbn0pKFN5bWJvbEtpbmQgfHwgKFN5bWJvbEtpbmQgPSB7fSkpO1xuLyoqXG4gKiBTeW1ib2wgdGFncyBhcmUgZXh0cmEgYW5ub3RhdGlvbnMgdGhhdCB0d2VhayB0aGUgcmVuZGVyaW5nIG9mIGEgc3ltYm9sLlxuICpcbiAqIEBzaW5jZSAzLjE2XG4gKi9cbmV4cG9ydCB2YXIgU3ltYm9sVGFnO1xuKGZ1bmN0aW9uIChTeW1ib2xUYWcpIHtcbiAgICAvKipcbiAgICAgKiBSZW5kZXIgYSBzeW1ib2wgYXMgb2Jzb2xldGUsIHVzdWFsbHkgdXNpbmcgYSBzdHJpa2Utb3V0LlxuICAgICAqL1xuICAgIFN5bWJvbFRhZy5EZXByZWNhdGVkID0gMTtcbn0pKFN5bWJvbFRhZyB8fCAoU3ltYm9sVGFnID0ge30pKTtcbmV4cG9ydCB2YXIgU3ltYm9sSW5mb3JtYXRpb247XG4oZnVuY3Rpb24gKFN5bWJvbEluZm9ybWF0aW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBzeW1ib2wgaW5mb3JtYXRpb24gbGl0ZXJhbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIGtpbmQgVGhlIGtpbmQgb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlIG9mIHRoZSBsb2NhdGlvbiBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIHJlc291cmNlIG9mIHRoZSBsb2NhdGlvbiBvZiBzeW1ib2wuXG4gICAgICogQHBhcmFtIGNvbnRhaW5lck5hbWUgVGhlIG5hbWUgb2YgdGhlIHN5bWJvbCBjb250YWluaW5nIHRoZSBzeW1ib2wuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKG5hbWUsIGtpbmQsIHJhbmdlLCB1cmksIGNvbnRhaW5lck5hbWUpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBraW5kLFxuICAgICAgICAgICAgbG9jYXRpb246IHsgdXJpLCByYW5nZSB9XG4gICAgICAgIH07XG4gICAgICAgIGlmIChjb250YWluZXJOYW1lKSB7XG4gICAgICAgICAgICByZXN1bHQuY29udGFpbmVyTmFtZSA9IGNvbnRhaW5lck5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgU3ltYm9sSW5mb3JtYXRpb24uY3JlYXRlID0gY3JlYXRlO1xufSkoU3ltYm9sSW5mb3JtYXRpb24gfHwgKFN5bWJvbEluZm9ybWF0aW9uID0ge30pKTtcbmV4cG9ydCB2YXIgV29ya3NwYWNlU3ltYm9sO1xuKGZ1bmN0aW9uIChXb3Jrc3BhY2VTeW1ib2wpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgd29ya3NwYWNlIHN5bWJvbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIGtpbmQgVGhlIGtpbmQgb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSByZXNvdXJjZSBvZiB0aGUgbG9jYXRpb24gb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgQW4gb3B0aW9ucyByYW5nZSBvZiB0aGUgbG9jYXRpb24uXG4gICAgICogQHJldHVybnMgQSBXb3Jrc3BhY2VTeW1ib2wuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKG5hbWUsIGtpbmQsIHVyaSwgcmFuZ2UpIHtcbiAgICAgICAgcmV0dXJuIHJhbmdlICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8geyBuYW1lLCBraW5kLCBsb2NhdGlvbjogeyB1cmksIHJhbmdlIH0gfVxuICAgICAgICAgICAgOiB7IG5hbWUsIGtpbmQsIGxvY2F0aW9uOiB7IHVyaSB9IH07XG4gICAgfVxuICAgIFdvcmtzcGFjZVN5bWJvbC5jcmVhdGUgPSBjcmVhdGU7XG59KShXb3Jrc3BhY2VTeW1ib2wgfHwgKFdvcmtzcGFjZVN5bWJvbCA9IHt9KSk7XG5leHBvcnQgdmFyIERvY3VtZW50U3ltYm9sO1xuKGZ1bmN0aW9uIChEb2N1bWVudFN5bWJvbCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgc3ltYm9sIGluZm9ybWF0aW9uIGxpdGVyYWwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSBkZXRhaWwgVGhlIGRldGFpbCBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSBraW5kIFRoZSBraW5kIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSBzZWxlY3Rpb25SYW5nZSBUaGUgc2VsZWN0aW9uUmFuZ2Ugb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gY2hpbGRyZW4gQ2hpbGRyZW4gb2YgdGhlIHN5bWJvbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobmFtZSwgZGV0YWlsLCBraW5kLCByYW5nZSwgc2VsZWN0aW9uUmFuZ2UsIGNoaWxkcmVuKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgZGV0YWlsLFxuICAgICAgICAgICAga2luZCxcbiAgICAgICAgICAgIHJhbmdlLFxuICAgICAgICAgICAgc2VsZWN0aW9uUmFuZ2VcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGNoaWxkcmVuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIERvY3VtZW50U3ltYm9sLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIERvY3VtZW50U3ltYm9sfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmXG4gICAgICAgICAgICBJcy5zdHJpbmcoY2FuZGlkYXRlLm5hbWUpICYmIElzLm51bWJlcihjYW5kaWRhdGUua2luZCkgJiZcbiAgICAgICAgICAgIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnNlbGVjdGlvblJhbmdlKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5kZXRhaWwgPT09IHVuZGVmaW5lZCB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLmRldGFpbCkpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmRlcHJlY2F0ZWQgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5kZXByZWNhdGVkKSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuY2hpbGRyZW4gPT09IHVuZGVmaW5lZCB8fCBBcnJheS5pc0FycmF5KGNhbmRpZGF0ZS5jaGlsZHJlbikpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLnRhZ3MgPT09IHVuZGVmaW5lZCB8fCBBcnJheS5pc0FycmF5KGNhbmRpZGF0ZS50YWdzKSk7XG4gICAgfVxuICAgIERvY3VtZW50U3ltYm9sLmlzID0gaXM7XG59KShEb2N1bWVudFN5bWJvbCB8fCAoRG9jdW1lbnRTeW1ib2wgPSB7fSkpO1xuLyoqXG4gKiBBIHNldCBvZiBwcmVkZWZpbmVkIGNvZGUgYWN0aW9uIGtpbmRzXG4gKi9cbmV4cG9ydCB2YXIgQ29kZUFjdGlvbktpbmQ7XG4oZnVuY3Rpb24gKENvZGVBY3Rpb25LaW5kKSB7XG4gICAgLyoqXG4gICAgICogRW1wdHkga2luZC5cbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5FbXB0eSA9ICcnO1xuICAgIC8qKlxuICAgICAqIEJhc2Uga2luZCBmb3IgcXVpY2tmaXggYWN0aW9uczogJ3F1aWNrZml4J1xuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlF1aWNrRml4ID0gJ3F1aWNrZml4JztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIHJlZmFjdG9yaW5nIGFjdGlvbnM6ICdyZWZhY3RvcidcbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5SZWZhY3RvciA9ICdyZWZhY3Rvcic7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciByZWZhY3RvcmluZyBleHRyYWN0aW9uIGFjdGlvbnM6ICdyZWZhY3Rvci5leHRyYWN0J1xuICAgICAqXG4gICAgICogRXhhbXBsZSBleHRyYWN0IGFjdGlvbnM6XG4gICAgICpcbiAgICAgKiAtIEV4dHJhY3QgbWV0aG9kXG4gICAgICogLSBFeHRyYWN0IGZ1bmN0aW9uXG4gICAgICogLSBFeHRyYWN0IHZhcmlhYmxlXG4gICAgICogLSBFeHRyYWN0IGludGVyZmFjZSBmcm9tIGNsYXNzXG4gICAgICogLSAuLi5cbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5SZWZhY3RvckV4dHJhY3QgPSAncmVmYWN0b3IuZXh0cmFjdCc7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciByZWZhY3RvcmluZyBpbmxpbmUgYWN0aW9uczogJ3JlZmFjdG9yLmlubGluZSdcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgaW5saW5lIGFjdGlvbnM6XG4gICAgICpcbiAgICAgKiAtIElubGluZSBmdW5jdGlvblxuICAgICAqIC0gSW5saW5lIHZhcmlhYmxlXG4gICAgICogLSBJbmxpbmUgY29uc3RhbnRcbiAgICAgKiAtIC4uLlxuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlJlZmFjdG9ySW5saW5lID0gJ3JlZmFjdG9yLmlubGluZSc7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciByZWZhY3RvcmluZyByZXdyaXRlIGFjdGlvbnM6ICdyZWZhY3Rvci5yZXdyaXRlJ1xuICAgICAqXG4gICAgICogRXhhbXBsZSByZXdyaXRlIGFjdGlvbnM6XG4gICAgICpcbiAgICAgKiAtIENvbnZlcnQgSmF2YVNjcmlwdCBmdW5jdGlvbiB0byBjbGFzc1xuICAgICAqIC0gQWRkIG9yIHJlbW92ZSBwYXJhbWV0ZXJcbiAgICAgKiAtIEVuY2Fwc3VsYXRlIGZpZWxkXG4gICAgICogLSBNYWtlIG1ldGhvZCBzdGF0aWNcbiAgICAgKiAtIE1vdmUgbWV0aG9kIHRvIGJhc2UgY2xhc3NcbiAgICAgKiAtIC4uLlxuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlJlZmFjdG9yUmV3cml0ZSA9ICdyZWZhY3Rvci5yZXdyaXRlJztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIHNvdXJjZSBhY3Rpb25zOiBgc291cmNlYFxuICAgICAqXG4gICAgICogU291cmNlIGNvZGUgYWN0aW9ucyBhcHBseSB0byB0aGUgZW50aXJlIGZpbGUuXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuU291cmNlID0gJ3NvdXJjZSc7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciBhbiBvcmdhbml6ZSBpbXBvcnRzIHNvdXJjZSBhY3Rpb246IGBzb3VyY2Uub3JnYW5pemVJbXBvcnRzYFxuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlNvdXJjZU9yZ2FuaXplSW1wb3J0cyA9ICdzb3VyY2Uub3JnYW5pemVJbXBvcnRzJztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIGF1dG8tZml4IHNvdXJjZSBhY3Rpb25zOiBgc291cmNlLmZpeEFsbGAuXG4gICAgICpcbiAgICAgKiBGaXggYWxsIGFjdGlvbnMgYXV0b21hdGljYWxseSBmaXggZXJyb3JzIHRoYXQgaGF2ZSBhIGNsZWFyIGZpeCB0aGF0IGRvIG5vdCByZXF1aXJlIHVzZXIgaW5wdXQuXG4gICAgICogVGhleSBzaG91bGQgbm90IHN1cHByZXNzIGVycm9ycyBvciBwZXJmb3JtIHVuc2FmZSBmaXhlcyBzdWNoIGFzIGdlbmVyYXRpbmcgbmV3IHR5cGVzIG9yIGNsYXNzZXMuXG4gICAgICpcbiAgICAgKiBAc2luY2UgMy4xNS4wXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuU291cmNlRml4QWxsID0gJ3NvdXJjZS5maXhBbGwnO1xufSkoQ29kZUFjdGlvbktpbmQgfHwgKENvZGVBY3Rpb25LaW5kID0ge30pKTtcbi8qKlxuICogVGhlIHJlYXNvbiB3aHkgY29kZSBhY3Rpb25zIHdlcmUgcmVxdWVzdGVkLlxuICpcbiAqIEBzaW5jZSAzLjE3LjBcbiAqL1xuZXhwb3J0IHZhciBDb2RlQWN0aW9uVHJpZ2dlcktpbmQ7XG4oZnVuY3Rpb24gKENvZGVBY3Rpb25UcmlnZ2VyS2luZCkge1xuICAgIC8qKlxuICAgICAqIENvZGUgYWN0aW9ucyB3ZXJlIGV4cGxpY2l0bHkgcmVxdWVzdGVkIGJ5IHRoZSB1c2VyIG9yIGJ5IGFuIGV4dGVuc2lvbi5cbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uVHJpZ2dlcktpbmQuSW52b2tlZCA9IDE7XG4gICAgLyoqXG4gICAgICogQ29kZSBhY3Rpb25zIHdlcmUgcmVxdWVzdGVkIGF1dG9tYXRpY2FsbHkuXG4gICAgICpcbiAgICAgKiBUaGlzIHR5cGljYWxseSBoYXBwZW5zIHdoZW4gY3VycmVudCBzZWxlY3Rpb24gaW4gYSBmaWxlIGNoYW5nZXMsIGJ1dCBjYW5cbiAgICAgKiBhbHNvIGJlIHRyaWdnZXJlZCB3aGVuIGZpbGUgY29udGVudCBjaGFuZ2VzLlxuICAgICAqL1xuICAgIENvZGVBY3Rpb25UcmlnZ2VyS2luZC5BdXRvbWF0aWMgPSAyO1xufSkoQ29kZUFjdGlvblRyaWdnZXJLaW5kIHx8IChDb2RlQWN0aW9uVHJpZ2dlcktpbmQgPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29kZUFjdGlvbkNvbnRleHQgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgQ29kZUFjdGlvbkNvbnRleHR9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIENvZGVBY3Rpb25Db250ZXh0O1xuKGZ1bmN0aW9uIChDb2RlQWN0aW9uQ29udGV4dCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ29kZUFjdGlvbkNvbnRleHQgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUoZGlhZ25vc3RpY3MsIG9ubHksIHRyaWdnZXJLaW5kKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IGRpYWdub3N0aWNzIH07XG4gICAgICAgIGlmIChvbmx5ICE9PSB1bmRlZmluZWQgJiYgb25seSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmVzdWx0Lm9ubHkgPSBvbmx5O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmlnZ2VyS2luZCAhPT0gdW5kZWZpbmVkICYmIHRyaWdnZXJLaW5kICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXN1bHQudHJpZ2dlcktpbmQgPSB0cmlnZ2VyS2luZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBDb2RlQWN0aW9uQ29udGV4dC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBDb2RlQWN0aW9uQ29udGV4dH0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS5kaWFnbm9zdGljcywgRGlhZ25vc3RpYy5pcylcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUub25seSA9PT0gdW5kZWZpbmVkIHx8IElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLm9ubHksIElzLnN0cmluZykpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLnRyaWdnZXJLaW5kID09PSB1bmRlZmluZWQgfHwgY2FuZGlkYXRlLnRyaWdnZXJLaW5kID09PSBDb2RlQWN0aW9uVHJpZ2dlcktpbmQuSW52b2tlZCB8fCBjYW5kaWRhdGUudHJpZ2dlcktpbmQgPT09IENvZGVBY3Rpb25UcmlnZ2VyS2luZC5BdXRvbWF0aWMpO1xuICAgIH1cbiAgICBDb2RlQWN0aW9uQ29udGV4dC5pcyA9IGlzO1xufSkoQ29kZUFjdGlvbkNvbnRleHQgfHwgKENvZGVBY3Rpb25Db250ZXh0ID0ge30pKTtcbmV4cG9ydCB2YXIgQ29kZUFjdGlvbjtcbihmdW5jdGlvbiAoQ29kZUFjdGlvbikge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh0aXRsZSwga2luZE9yQ29tbWFuZE9yRWRpdCwga2luZCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0geyB0aXRsZSB9O1xuICAgICAgICBsZXQgY2hlY2tLaW5kID0gdHJ1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBraW5kT3JDb21tYW5kT3JFZGl0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY2hlY2tLaW5kID0gZmFsc2U7XG4gICAgICAgICAgICByZXN1bHQua2luZCA9IGtpbmRPckNvbW1hbmRPckVkaXQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoQ29tbWFuZC5pcyhraW5kT3JDb21tYW5kT3JFZGl0KSkge1xuICAgICAgICAgICAgcmVzdWx0LmNvbW1hbmQgPSBraW5kT3JDb21tYW5kT3JFZGl0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0LmVkaXQgPSBraW5kT3JDb21tYW5kT3JFZGl0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGVja0tpbmQgJiYga2luZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQua2luZCA9IGtpbmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgQ29kZUFjdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLnN0cmluZyhjYW5kaWRhdGUudGl0bGUpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmRpYWdub3N0aWNzID09PSB1bmRlZmluZWQgfHwgSXMudHlwZWRBcnJheShjYW5kaWRhdGUuZGlhZ25vc3RpY3MsIERpYWdub3N0aWMuaXMpKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5raW5kID09PSB1bmRlZmluZWQgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS5raW5kKSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuZWRpdCAhPT0gdW5kZWZpbmVkIHx8IGNhbmRpZGF0ZS5jb21tYW5kICE9PSB1bmRlZmluZWQpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmNvbW1hbmQgPT09IHVuZGVmaW5lZCB8fCBDb21tYW5kLmlzKGNhbmRpZGF0ZS5jb21tYW5kKSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuaXNQcmVmZXJyZWQgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5pc1ByZWZlcnJlZCkpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmVkaXQgPT09IHVuZGVmaW5lZCB8fCBXb3Jrc3BhY2VFZGl0LmlzKGNhbmRpZGF0ZS5lZGl0KSk7XG4gICAgfVxuICAgIENvZGVBY3Rpb24uaXMgPSBpcztcbn0pKENvZGVBY3Rpb24gfHwgKENvZGVBY3Rpb24gPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29kZUxlbnMgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgQ29kZUxlbnN9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIENvZGVMZW5zO1xuKGZ1bmN0aW9uIChDb2RlTGVucykge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ29kZUxlbnMgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIGRhdGEpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHsgcmFuZ2UgfTtcbiAgICAgICAgaWYgKElzLmRlZmluZWQoZGF0YSkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5kYXRhID0gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBDb2RlTGVucy5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBDb2RlTGVuc30gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLmNvbW1hbmQpIHx8IENvbW1hbmQuaXMoY2FuZGlkYXRlLmNvbW1hbmQpKTtcbiAgICB9XG4gICAgQ29kZUxlbnMuaXMgPSBpcztcbn0pKENvZGVMZW5zIHx8IChDb2RlTGVucyA9IHt9KSk7XG4vKipcbiAqIFRoZSBGb3JtYXR0aW5nT3B0aW9ucyBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBGb3JtYXR0aW5nT3B0aW9uc30gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgRm9ybWF0dGluZ09wdGlvbnM7XG4oZnVuY3Rpb24gKEZvcm1hdHRpbmdPcHRpb25zKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBGb3JtYXR0aW5nT3B0aW9ucyBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh0YWJTaXplLCBpbnNlcnRTcGFjZXMpIHtcbiAgICAgICAgcmV0dXJuIHsgdGFiU2l6ZSwgaW5zZXJ0U3BhY2VzIH07XG4gICAgfVxuICAgIEZvcm1hdHRpbmdPcHRpb25zLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIEZvcm1hdHRpbmdPcHRpb25zfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS50YWJTaXplKSAmJiBJcy5ib29sZWFuKGNhbmRpZGF0ZS5pbnNlcnRTcGFjZXMpO1xuICAgIH1cbiAgICBGb3JtYXR0aW5nT3B0aW9ucy5pcyA9IGlzO1xufSkoRm9ybWF0dGluZ09wdGlvbnMgfHwgKEZvcm1hdHRpbmdPcHRpb25zID0ge30pKTtcbi8qKlxuICogVGhlIERvY3VtZW50TGluayBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBEb2N1bWVudExpbmt9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIERvY3VtZW50TGluaztcbihmdW5jdGlvbiAoRG9jdW1lbnRMaW5rKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBEb2N1bWVudExpbmsgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIHRhcmdldCwgZGF0YSkge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgdGFyZ2V0LCBkYXRhIH07XG4gICAgfVxuICAgIERvY3VtZW50TGluay5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBEb2N1bWVudExpbmt9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS50YXJnZXQpIHx8IElzLnN0cmluZyhjYW5kaWRhdGUudGFyZ2V0KSk7XG4gICAgfVxuICAgIERvY3VtZW50TGluay5pcyA9IGlzO1xufSkoRG9jdW1lbnRMaW5rIHx8IChEb2N1bWVudExpbmsgPSB7fSkpO1xuLyoqXG4gKiBUaGUgU2VsZWN0aW9uUmFuZ2UgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbiB0byB3b3JrIHdpdGhcbiAqIFNlbGVjdGlvblJhbmdlIGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIFNlbGVjdGlvblJhbmdlO1xuKGZ1bmN0aW9uIChTZWxlY3Rpb25SYW5nZSkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgU2VsZWN0aW9uUmFuZ2VcbiAgICAgKiBAcGFyYW0gcmFuZ2UgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSBwYXJlbnQgYW4gb3B0aW9uYWwgcGFyZW50LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgcGFyZW50KSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCBwYXJlbnQgfTtcbiAgICB9XG4gICAgU2VsZWN0aW9uUmFuZ2UuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIChjYW5kaWRhdGUucGFyZW50ID09PSB1bmRlZmluZWQgfHwgU2VsZWN0aW9uUmFuZ2UuaXMoY2FuZGlkYXRlLnBhcmVudCkpO1xuICAgIH1cbiAgICBTZWxlY3Rpb25SYW5nZS5pcyA9IGlzO1xufSkoU2VsZWN0aW9uUmFuZ2UgfHwgKFNlbGVjdGlvblJhbmdlID0ge30pKTtcbi8qKlxuICogQSBzZXQgb2YgcHJlZGVmaW5lZCB0b2tlbiB0eXBlcy4gVGhpcyBzZXQgaXMgbm90IGZpeGVkXG4gKiBhbiBjbGllbnRzIGNhbiBzcGVjaWZ5IGFkZGl0aW9uYWwgdG9rZW4gdHlwZXMgdmlhIHRoZVxuICogY29ycmVzcG9uZGluZyBjbGllbnQgY2FwYWJpbGl0aWVzLlxuICpcbiAqIEBzaW5jZSAzLjE2LjBcbiAqL1xuZXhwb3J0IHZhciBTZW1hbnRpY1Rva2VuVHlwZXM7XG4oZnVuY3Rpb24gKFNlbWFudGljVG9rZW5UeXBlcykge1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcIm5hbWVzcGFjZVwiXSA9IFwibmFtZXNwYWNlXCI7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIGdlbmVyaWMgdHlwZS4gQWN0cyBhcyBhIGZhbGxiYWNrIGZvciB0eXBlcyB3aGljaCBjYW4ndCBiZSBtYXBwZWQgdG9cbiAgICAgKiBhIHNwZWNpZmljIHR5cGUgbGlrZSBjbGFzcyBvciBlbnVtLlxuICAgICAqL1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInR5cGVcIl0gPSBcInR5cGVcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJjbGFzc1wiXSA9IFwiY2xhc3NcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJlbnVtXCJdID0gXCJlbnVtXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wiaW50ZXJmYWNlXCJdID0gXCJpbnRlcmZhY2VcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJzdHJ1Y3RcIl0gPSBcInN0cnVjdFwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInR5cGVQYXJhbWV0ZXJcIl0gPSBcInR5cGVQYXJhbWV0ZXJcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJwYXJhbWV0ZXJcIl0gPSBcInBhcmFtZXRlclwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInZhcmlhYmxlXCJdID0gXCJ2YXJpYWJsZVwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInByb3BlcnR5XCJdID0gXCJwcm9wZXJ0eVwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImVudW1NZW1iZXJcIl0gPSBcImVudW1NZW1iZXJcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJldmVudFwiXSA9IFwiZXZlbnRcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJmdW5jdGlvblwiXSA9IFwiZnVuY3Rpb25cIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJtZXRob2RcIl0gPSBcIm1ldGhvZFwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcIm1hY3JvXCJdID0gXCJtYWNyb1wiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImtleXdvcmRcIl0gPSBcImtleXdvcmRcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJtb2RpZmllclwiXSA9IFwibW9kaWZpZXJcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJjb21tZW50XCJdID0gXCJjb21tZW50XCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wic3RyaW5nXCJdID0gXCJzdHJpbmdcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJudW1iZXJcIl0gPSBcIm51bWJlclwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInJlZ2V4cFwiXSA9IFwicmVnZXhwXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wib3BlcmF0b3JcIl0gPSBcIm9wZXJhdG9yXCI7XG4gICAgLyoqXG4gICAgICogQHNpbmNlIDMuMTcuMFxuICAgICAqL1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImRlY29yYXRvclwiXSA9IFwiZGVjb3JhdG9yXCI7XG59KShTZW1hbnRpY1Rva2VuVHlwZXMgfHwgKFNlbWFudGljVG9rZW5UeXBlcyA9IHt9KSk7XG4vKipcbiAqIEEgc2V0IG9mIHByZWRlZmluZWQgdG9rZW4gbW9kaWZpZXJzLiBUaGlzIHNldCBpcyBub3QgZml4ZWRcbiAqIGFuIGNsaWVudHMgY2FuIHNwZWNpZnkgYWRkaXRpb25hbCB0b2tlbiB0eXBlcyB2aWEgdGhlXG4gKiBjb3JyZXNwb25kaW5nIGNsaWVudCBjYXBhYmlsaXRpZXMuXG4gKlxuICogQHNpbmNlIDMuMTYuMFxuICovXG5leHBvcnQgdmFyIFNlbWFudGljVG9rZW5Nb2RpZmllcnM7XG4oZnVuY3Rpb24gKFNlbWFudGljVG9rZW5Nb2RpZmllcnMpIHtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wiZGVjbGFyYXRpb25cIl0gPSBcImRlY2xhcmF0aW9uXCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcImRlZmluaXRpb25cIl0gPSBcImRlZmluaXRpb25cIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wicmVhZG9ubHlcIl0gPSBcInJlYWRvbmx5XCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcInN0YXRpY1wiXSA9IFwic3RhdGljXCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcImRlcHJlY2F0ZWRcIl0gPSBcImRlcHJlY2F0ZWRcIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wiYWJzdHJhY3RcIl0gPSBcImFic3RyYWN0XCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcImFzeW5jXCJdID0gXCJhc3luY1wiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJtb2RpZmljYXRpb25cIl0gPSBcIm1vZGlmaWNhdGlvblwiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJkb2N1bWVudGF0aW9uXCJdID0gXCJkb2N1bWVudGF0aW9uXCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcImRlZmF1bHRMaWJyYXJ5XCJdID0gXCJkZWZhdWx0TGlicmFyeVwiO1xufSkoU2VtYW50aWNUb2tlbk1vZGlmaWVycyB8fCAoU2VtYW50aWNUb2tlbk1vZGlmaWVycyA9IHt9KSk7XG4vKipcbiAqIEBzaW5jZSAzLjE2LjBcbiAqL1xuZXhwb3J0IHZhciBTZW1hbnRpY1Rva2VucztcbihmdW5jdGlvbiAoU2VtYW50aWNUb2tlbnMpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiAoY2FuZGlkYXRlLnJlc3VsdElkID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIGNhbmRpZGF0ZS5yZXN1bHRJZCA9PT0gJ3N0cmluZycpICYmXG4gICAgICAgICAgICBBcnJheS5pc0FycmF5KGNhbmRpZGF0ZS5kYXRhKSAmJiAoY2FuZGlkYXRlLmRhdGEubGVuZ3RoID09PSAwIHx8IHR5cGVvZiBjYW5kaWRhdGUuZGF0YVswXSA9PT0gJ251bWJlcicpO1xuICAgIH1cbiAgICBTZW1hbnRpY1Rva2Vucy5pcyA9IGlzO1xufSkoU2VtYW50aWNUb2tlbnMgfHwgKFNlbWFudGljVG9rZW5zID0ge30pKTtcbi8qKlxuICogVGhlIElubGluZVZhbHVlVGV4dCBuYW1lc3BhY2UgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCBJbmxpbmVWYWx1ZVRleHRzLlxuICpcbiAqIEBzaW5jZSAzLjE3LjBcbiAqL1xuZXhwb3J0IHZhciBJbmxpbmVWYWx1ZVRleHQ7XG4oZnVuY3Rpb24gKElubGluZVZhbHVlVGV4dCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgSW5saW5lVmFsdWVUZXh0IGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCB0ZXh0KSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCB0ZXh0IH07XG4gICAgfVxuICAgIElubGluZVZhbHVlVGV4dC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgIT09IHVuZGVmaW5lZCAmJiBjYW5kaWRhdGUgIT09IG51bGwgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnRleHQpO1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZVRleHQuaXMgPSBpcztcbn0pKElubGluZVZhbHVlVGV4dCB8fCAoSW5saW5lVmFsdWVUZXh0ID0ge30pKTtcbi8qKlxuICogVGhlIElubGluZVZhbHVlVmFyaWFibGVMb29rdXAgbmFtZXNwYWNlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGggSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cHMuXG4gKlxuICogQHNpbmNlIDMuMTcuMFxuICovXG5leHBvcnQgdmFyIElubGluZVZhbHVlVmFyaWFibGVMb29rdXA7XG4oZnVuY3Rpb24gKElubGluZVZhbHVlVmFyaWFibGVMb29rdXApIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IElubGluZVZhbHVlVGV4dCBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgdmFyaWFibGVOYW1lLCBjYXNlU2Vuc2l0aXZlTG9va3VwKSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCB2YXJpYWJsZU5hbWUsIGNhc2VTZW5zaXRpdmVMb29rdXAgfTtcbiAgICB9XG4gICAgSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgIT09IHVuZGVmaW5lZCAmJiBjYW5kaWRhdGUgIT09IG51bGwgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiBJcy5ib29sZWFuKGNhbmRpZGF0ZS5jYXNlU2Vuc2l0aXZlTG9va3VwKVxuICAgICAgICAgICAgJiYgKElzLnN0cmluZyhjYW5kaWRhdGUudmFyaWFibGVOYW1lKSB8fCBjYW5kaWRhdGUudmFyaWFibGVOYW1lID09PSB1bmRlZmluZWQpO1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwLmlzID0gaXM7XG59KShJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwIHx8IChJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwID0ge30pKTtcbi8qKlxuICogVGhlIElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uIG5hbWVzcGFjZSBwcm92aWRlcyBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uLlxuICpcbiAqIEBzaW5jZSAzLjE3LjBcbiAqL1xuZXhwb3J0IHZhciBJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbjtcbihmdW5jdGlvbiAoSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCBleHByZXNzaW9uKSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCBleHByZXNzaW9uIH07XG4gICAgfVxuICAgIElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAhPT0gdW5kZWZpbmVkICYmIGNhbmRpZGF0ZSAhPT0gbnVsbCAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpXG4gICAgICAgICAgICAmJiAoSXMuc3RyaW5nKGNhbmRpZGF0ZS5leHByZXNzaW9uKSB8fCBjYW5kaWRhdGUuZXhwcmVzc2lvbiA9PT0gdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24uaXMgPSBpcztcbn0pKElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uIHx8IChJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBJbmxpbmVWYWx1ZUNvbnRleHQgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgSW5saW5lVmFsdWVDb250ZXh0fSBsaXRlcmFscy5cbiAqXG4gKiBAc2luY2UgMy4xNy4wXG4gKi9cbmV4cG9ydCB2YXIgSW5saW5lVmFsdWVDb250ZXh0O1xuKGZ1bmN0aW9uIChJbmxpbmVWYWx1ZUNvbnRleHQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IElubGluZVZhbHVlQ29udGV4dCBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShmcmFtZUlkLCBzdG9wcGVkTG9jYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHsgZnJhbWVJZCwgc3RvcHBlZExvY2F0aW9uIH07XG4gICAgfVxuICAgIElubGluZVZhbHVlQ29udGV4dC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBJbmxpbmVWYWx1ZUNvbnRleHR9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyh2YWx1ZS5zdG9wcGVkTG9jYXRpb24pO1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZUNvbnRleHQuaXMgPSBpcztcbn0pKElubGluZVZhbHVlQ29udGV4dCB8fCAoSW5saW5lVmFsdWVDb250ZXh0ID0ge30pKTtcbi8qKlxuICogSW5sYXkgaGludCBraW5kcy5cbiAqXG4gKiBAc2luY2UgMy4xNy4wXG4gKi9cbmV4cG9ydCB2YXIgSW5sYXlIaW50S2luZDtcbihmdW5jdGlvbiAoSW5sYXlIaW50S2luZCkge1xuICAgIC8qKlxuICAgICAqIEFuIGlubGF5IGhpbnQgdGhhdCBmb3IgYSB0eXBlIGFubm90YXRpb24uXG4gICAgICovXG4gICAgSW5sYXlIaW50S2luZC5UeXBlID0gMTtcbiAgICAvKipcbiAgICAgKiBBbiBpbmxheSBoaW50IHRoYXQgaXMgZm9yIGEgcGFyYW1ldGVyLlxuICAgICAqL1xuICAgIElubGF5SGludEtpbmQuUGFyYW1ldGVyID0gMjtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWUgPT09IDEgfHwgdmFsdWUgPT09IDI7XG4gICAgfVxuICAgIElubGF5SGludEtpbmQuaXMgPSBpcztcbn0pKElubGF5SGludEtpbmQgfHwgKElubGF5SGludEtpbmQgPSB7fSkpO1xuZXhwb3J0IHZhciBJbmxheUhpbnRMYWJlbFBhcnQ7XG4oZnVuY3Rpb24gKElubGF5SGludExhYmVsUGFydCkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh2YWx1ZSkge1xuICAgICAgICByZXR1cm4geyB2YWx1ZSB9O1xuICAgIH1cbiAgICBJbmxheUhpbnRMYWJlbFBhcnQuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLnRvb2x0aXAgPT09IHVuZGVmaW5lZCB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLnRvb2x0aXApIHx8IE1hcmt1cENvbnRlbnQuaXMoY2FuZGlkYXRlLnRvb2x0aXApKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS5sb2NhdGlvbiA9PT0gdW5kZWZpbmVkIHx8IExvY2F0aW9uLmlzKGNhbmRpZGF0ZS5sb2NhdGlvbikpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLmNvbW1hbmQgPT09IHVuZGVmaW5lZCB8fCBDb21tYW5kLmlzKGNhbmRpZGF0ZS5jb21tYW5kKSk7XG4gICAgfVxuICAgIElubGF5SGludExhYmVsUGFydC5pcyA9IGlzO1xufSkoSW5sYXlIaW50TGFiZWxQYXJ0IHx8IChJbmxheUhpbnRMYWJlbFBhcnQgPSB7fSkpO1xuZXhwb3J0IHZhciBJbmxheUhpbnQ7XG4oZnVuY3Rpb24gKElubGF5SGludCkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShwb3NpdGlvbiwgbGFiZWwsIGtpbmQpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0geyBwb3NpdGlvbiwgbGFiZWwgfTtcbiAgICAgICAgaWYgKGtpbmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmtpbmQgPSBraW5kO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIElubGF5SGludC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgUG9zaXRpb24uaXMoY2FuZGlkYXRlLnBvc2l0aW9uKVxuICAgICAgICAgICAgJiYgKElzLnN0cmluZyhjYW5kaWRhdGUubGFiZWwpIHx8IElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLmxhYmVsLCBJbmxheUhpbnRMYWJlbFBhcnQuaXMpKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS5raW5kID09PSB1bmRlZmluZWQgfHwgSW5sYXlIaW50S2luZC5pcyhjYW5kaWRhdGUua2luZCkpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLnRleHRFZGl0cyA9PT0gdW5kZWZpbmVkKSB8fCBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS50ZXh0RWRpdHMsIFRleHRFZGl0LmlzKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS50b29sdGlwID09PSB1bmRlZmluZWQgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS50b29sdGlwKSB8fCBNYXJrdXBDb250ZW50LmlzKGNhbmRpZGF0ZS50b29sdGlwKSlcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUucGFkZGluZ0xlZnQgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5wYWRkaW5nTGVmdCkpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLnBhZGRpbmdSaWdodCA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLnBhZGRpbmdSaWdodCkpO1xuICAgIH1cbiAgICBJbmxheUhpbnQuaXMgPSBpcztcbn0pKElubGF5SGludCB8fCAoSW5sYXlIaW50ID0ge30pKTtcbmV4cG9ydCB2YXIgU3RyaW5nVmFsdWU7XG4oZnVuY3Rpb24gKFN0cmluZ1ZhbHVlKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlU25pcHBldCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4geyBraW5kOiAnc25pcHBldCcsIHZhbHVlIH07XG4gICAgfVxuICAgIFN0cmluZ1ZhbHVlLmNyZWF0ZVNuaXBwZXQgPSBjcmVhdGVTbmlwcGV0O1xufSkoU3RyaW5nVmFsdWUgfHwgKFN0cmluZ1ZhbHVlID0ge30pKTtcbmV4cG9ydCB2YXIgSW5saW5lQ29tcGxldGlvbkl0ZW07XG4oZnVuY3Rpb24gKElubGluZUNvbXBsZXRpb25JdGVtKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKGluc2VydFRleHQsIGZpbHRlclRleHQsIHJhbmdlLCBjb21tYW5kKSB7XG4gICAgICAgIHJldHVybiB7IGluc2VydFRleHQsIGZpbHRlclRleHQsIHJhbmdlLCBjb21tYW5kIH07XG4gICAgfVxuICAgIElubGluZUNvbXBsZXRpb25JdGVtLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKElubGluZUNvbXBsZXRpb25JdGVtIHx8IChJbmxpbmVDb21wbGV0aW9uSXRlbSA9IHt9KSk7XG5leHBvcnQgdmFyIElubGluZUNvbXBsZXRpb25MaXN0O1xuKGZ1bmN0aW9uIChJbmxpbmVDb21wbGV0aW9uTGlzdCkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShpdGVtcykge1xuICAgICAgICByZXR1cm4geyBpdGVtcyB9O1xuICAgIH1cbiAgICBJbmxpbmVDb21wbGV0aW9uTGlzdC5jcmVhdGUgPSBjcmVhdGU7XG59KShJbmxpbmVDb21wbGV0aW9uTGlzdCB8fCAoSW5saW5lQ29tcGxldGlvbkxpc3QgPSB7fSkpO1xuLyoqXG4gKiBEZXNjcmliZXMgaG93IGFuIHtAbGluayBJbmxpbmVDb21wbGV0aW9uSXRlbVByb3ZpZGVyIGlubGluZSBjb21wbGV0aW9uIHByb3ZpZGVyfSB3YXMgdHJpZ2dlcmVkLlxuICpcbiAqIEBzaW5jZSAzLjE4LjBcbiAqIEBwcm9wb3NlZFxuICovXG5leHBvcnQgdmFyIElubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZDtcbihmdW5jdGlvbiAoSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kKSB7XG4gICAgLyoqXG4gICAgICogQ29tcGxldGlvbiB3YXMgdHJpZ2dlcmVkIGV4cGxpY2l0bHkgYnkgYSB1c2VyIGdlc3R1cmUuXG4gICAgICovXG4gICAgSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kLkludm9rZWQgPSAwO1xuICAgIC8qKlxuICAgICAqIENvbXBsZXRpb24gd2FzIHRyaWdnZXJlZCBhdXRvbWF0aWNhbGx5IHdoaWxlIGVkaXRpbmcuXG4gICAgICovXG4gICAgSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kLkF1dG9tYXRpYyA9IDE7XG59KShJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmQgfHwgKElubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZCA9IHt9KSk7XG5leHBvcnQgdmFyIFNlbGVjdGVkQ29tcGxldGlvbkluZm87XG4oZnVuY3Rpb24gKFNlbGVjdGVkQ29tcGxldGlvbkluZm8pIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIHRleHQpIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIHRleHQgfTtcbiAgICB9XG4gICAgU2VsZWN0ZWRDb21wbGV0aW9uSW5mby5jcmVhdGUgPSBjcmVhdGU7XG59KShTZWxlY3RlZENvbXBsZXRpb25JbmZvIHx8IChTZWxlY3RlZENvbXBsZXRpb25JbmZvID0ge30pKTtcbmV4cG9ydCB2YXIgSW5saW5lQ29tcGxldGlvbkNvbnRleHQ7XG4oZnVuY3Rpb24gKElubGluZUNvbXBsZXRpb25Db250ZXh0KSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKHRyaWdnZXJLaW5kLCBzZWxlY3RlZENvbXBsZXRpb25JbmZvKSB7XG4gICAgICAgIHJldHVybiB7IHRyaWdnZXJLaW5kLCBzZWxlY3RlZENvbXBsZXRpb25JbmZvIH07XG4gICAgfVxuICAgIElubGluZUNvbXBsZXRpb25Db250ZXh0LmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKElubGluZUNvbXBsZXRpb25Db250ZXh0IHx8IChJbmxpbmVDb21wbGV0aW9uQ29udGV4dCA9IHt9KSk7XG5leHBvcnQgdmFyIFdvcmtzcGFjZUZvbGRlcjtcbihmdW5jdGlvbiAoV29ya3NwYWNlRm9sZGVyKSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgVVJJLmlzKGNhbmRpZGF0ZS51cmkpICYmIElzLnN0cmluZyhjYW5kaWRhdGUubmFtZSk7XG4gICAgfVxuICAgIFdvcmtzcGFjZUZvbGRlci5pcyA9IGlzO1xufSkoV29ya3NwYWNlRm9sZGVyIHx8IChXb3Jrc3BhY2VGb2xkZXIgPSB7fSkpO1xuZXhwb3J0IGNvbnN0IEVPTCA9IFsnXFxuJywgJ1xcclxcbicsICdcXHInXTtcbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHRoZSB0ZXh0IGRvY3VtZW50IGZyb20gdGhlIG5ldyB2c2NvZGUtbGFuZ3VhZ2VzZXJ2ZXItdGV4dGRvY3VtZW50IHBhY2thZ2UuXG4gKi9cbmV4cG9ydCB2YXIgVGV4dERvY3VtZW50O1xuKGZ1bmN0aW9uIChUZXh0RG9jdW1lbnQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IElUZXh0RG9jdW1lbnQgbGl0ZXJhbCBmcm9tIHRoZSBnaXZlbiB1cmkgYW5kIGNvbnRlbnQuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgZG9jdW1lbnQncyB1cmkuXG4gICAgICogQHBhcmFtIGxhbmd1YWdlSWQgVGhlIGRvY3VtZW50J3MgbGFuZ3VhZ2UgSWQuXG4gICAgICogQHBhcmFtIHZlcnNpb24gVGhlIGRvY3VtZW50J3MgdmVyc2lvbi5cbiAgICAgKiBAcGFyYW0gY29udGVudCBUaGUgZG9jdW1lbnQncyBjb250ZW50LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmksIGxhbmd1YWdlSWQsIHZlcnNpb24sIGNvbnRlbnQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGdWxsVGV4dERvY3VtZW50KHVyaSwgbGFuZ3VhZ2VJZCwgdmVyc2lvbiwgY29udGVudCk7XG4gICAgfVxuICAgIFRleHREb2N1bWVudC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBJVGV4dERvY3VtZW50fSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudXJpKSAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5sYW5ndWFnZUlkKSB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLmxhbmd1YWdlSWQpKSAmJiBJcy51aW50ZWdlcihjYW5kaWRhdGUubGluZUNvdW50KVxuICAgICAgICAgICAgJiYgSXMuZnVuYyhjYW5kaWRhdGUuZ2V0VGV4dCkgJiYgSXMuZnVuYyhjYW5kaWRhdGUucG9zaXRpb25BdCkgJiYgSXMuZnVuYyhjYW5kaWRhdGUub2Zmc2V0QXQpID8gdHJ1ZSA6IGZhbHNlO1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnQuaXMgPSBpcztcbiAgICBmdW5jdGlvbiBhcHBseUVkaXRzKGRvY3VtZW50LCBlZGl0cykge1xuICAgICAgICBsZXQgdGV4dCA9IGRvY3VtZW50LmdldFRleHQoKTtcbiAgICAgICAgbGV0IHNvcnRlZEVkaXRzID0gbWVyZ2VTb3J0KGVkaXRzLCAoYSwgYikgPT4ge1xuICAgICAgICAgICAgbGV0IGRpZmYgPSBhLnJhbmdlLnN0YXJ0LmxpbmUgLSBiLnJhbmdlLnN0YXJ0LmxpbmU7XG4gICAgICAgICAgICBpZiAoZGlmZiA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhLnJhbmdlLnN0YXJ0LmNoYXJhY3RlciAtIGIucmFuZ2Uuc3RhcnQuY2hhcmFjdGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRpZmY7XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgbGFzdE1vZGlmaWVkT2Zmc2V0ID0gdGV4dC5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGkgPSBzb3J0ZWRFZGl0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgbGV0IGUgPSBzb3J0ZWRFZGl0c1tpXTtcbiAgICAgICAgICAgIGxldCBzdGFydE9mZnNldCA9IGRvY3VtZW50Lm9mZnNldEF0KGUucmFuZ2Uuc3RhcnQpO1xuICAgICAgICAgICAgbGV0IGVuZE9mZnNldCA9IGRvY3VtZW50Lm9mZnNldEF0KGUucmFuZ2UuZW5kKTtcbiAgICAgICAgICAgIGlmIChlbmRPZmZzZXQgPD0gbGFzdE1vZGlmaWVkT2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIHN0YXJ0T2Zmc2V0KSArIGUubmV3VGV4dCArIHRleHQuc3Vic3RyaW5nKGVuZE9mZnNldCwgdGV4dC5sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdPdmVybGFwcGluZyBlZGl0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsYXN0TW9kaWZpZWRPZmZzZXQgPSBzdGFydE9mZnNldDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50LmFwcGx5RWRpdHMgPSBhcHBseUVkaXRzO1xuICAgIGZ1bmN0aW9uIG1lcmdlU29ydChkYXRhLCBjb21wYXJlKSB7XG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCA8PSAxKSB7XG4gICAgICAgICAgICAvLyBzb3J0ZWRcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHAgPSAoZGF0YS5sZW5ndGggLyAyKSB8IDA7XG4gICAgICAgIGNvbnN0IGxlZnQgPSBkYXRhLnNsaWNlKDAsIHApO1xuICAgICAgICBjb25zdCByaWdodCA9IGRhdGEuc2xpY2UocCk7XG4gICAgICAgIG1lcmdlU29ydChsZWZ0LCBjb21wYXJlKTtcbiAgICAgICAgbWVyZ2VTb3J0KHJpZ2h0LCBjb21wYXJlKTtcbiAgICAgICAgbGV0IGxlZnRJZHggPSAwO1xuICAgICAgICBsZXQgcmlnaHRJZHggPSAwO1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIHdoaWxlIChsZWZ0SWR4IDwgbGVmdC5sZW5ndGggJiYgcmlnaHRJZHggPCByaWdodC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCByZXQgPSBjb21wYXJlKGxlZnRbbGVmdElkeF0sIHJpZ2h0W3JpZ2h0SWR4XSk7XG4gICAgICAgICAgICBpZiAocmV0IDw9IDApIHtcbiAgICAgICAgICAgICAgICAvLyBzbWFsbGVyX2VxdWFsIC0+IHRha2UgbGVmdCB0byBwcmVzZXJ2ZSBvcmRlclxuICAgICAgICAgICAgICAgIGRhdGFbaSsrXSA9IGxlZnRbbGVmdElkeCsrXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGdyZWF0ZXIgLT4gdGFrZSByaWdodFxuICAgICAgICAgICAgICAgIGRhdGFbaSsrXSA9IHJpZ2h0W3JpZ2h0SWR4KytdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChsZWZ0SWR4IDwgbGVmdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRhdGFbaSsrXSA9IGxlZnRbbGVmdElkeCsrXTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAocmlnaHRJZHggPCByaWdodC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRhdGFbaSsrXSA9IHJpZ2h0W3JpZ2h0SWR4KytdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbn0pKFRleHREb2N1bWVudCB8fCAoVGV4dERvY3VtZW50ID0ge30pKTtcbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHRoZSB0ZXh0IGRvY3VtZW50IGZyb20gdGhlIG5ldyB2c2NvZGUtbGFuZ3VhZ2VzZXJ2ZXItdGV4dGRvY3VtZW50IHBhY2thZ2UuXG4gKi9cbmNsYXNzIEZ1bGxUZXh0RG9jdW1lbnQge1xuICAgIGNvbnN0cnVjdG9yKHVyaSwgbGFuZ3VhZ2VJZCwgdmVyc2lvbiwgY29udGVudCkge1xuICAgICAgICB0aGlzLl91cmkgPSB1cmk7XG4gICAgICAgIHRoaXMuX2xhbmd1YWdlSWQgPSBsYW5ndWFnZUlkO1xuICAgICAgICB0aGlzLl92ZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgICAgdGhpcy5fY29udGVudCA9IGNvbnRlbnQ7XG4gICAgICAgIHRoaXMuX2xpbmVPZmZzZXRzID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBnZXQgdXJpKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdXJpO1xuICAgIH1cbiAgICBnZXQgbGFuZ3VhZ2VJZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhbmd1YWdlSWQ7XG4gICAgfVxuICAgIGdldCB2ZXJzaW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmVyc2lvbjtcbiAgICB9XG4gICAgZ2V0VGV4dChyYW5nZSkge1xuICAgICAgICBpZiAocmFuZ2UpIHtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IHRoaXMub2Zmc2V0QXQocmFuZ2Uuc3RhcnQpO1xuICAgICAgICAgICAgbGV0IGVuZCA9IHRoaXMub2Zmc2V0QXQocmFuZ2UuZW5kKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb250ZW50LnN1YnN0cmluZyhzdGFydCwgZW5kKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fY29udGVudDtcbiAgICB9XG4gICAgdXBkYXRlKGV2ZW50LCB2ZXJzaW9uKSB7XG4gICAgICAgIHRoaXMuX2NvbnRlbnQgPSBldmVudC50ZXh0O1xuICAgICAgICB0aGlzLl92ZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgICAgdGhpcy5fbGluZU9mZnNldHMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGdldExpbmVPZmZzZXRzKCkge1xuICAgICAgICBpZiAodGhpcy5fbGluZU9mZnNldHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbGV0IGxpbmVPZmZzZXRzID0gW107XG4gICAgICAgICAgICBsZXQgdGV4dCA9IHRoaXMuX2NvbnRlbnQ7XG4gICAgICAgICAgICBsZXQgaXNMaW5lU3RhcnQgPSB0cnVlO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzTGluZVN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgIGxpbmVPZmZzZXRzLnB1c2goaSk7XG4gICAgICAgICAgICAgICAgICAgIGlzTGluZVN0YXJ0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBjaCA9IHRleHQuY2hhckF0KGkpO1xuICAgICAgICAgICAgICAgIGlzTGluZVN0YXJ0ID0gKGNoID09PSAnXFxyJyB8fCBjaCA9PT0gJ1xcbicpO1xuICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ1xccicgJiYgaSArIDEgPCB0ZXh0Lmxlbmd0aCAmJiB0ZXh0LmNoYXJBdChpICsgMSkgPT09ICdcXG4nKSB7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNMaW5lU3RhcnQgJiYgdGV4dC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGluZU9mZnNldHMucHVzaCh0ZXh0Lmxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9saW5lT2Zmc2V0cyA9IGxpbmVPZmZzZXRzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9saW5lT2Zmc2V0cztcbiAgICB9XG4gICAgcG9zaXRpb25BdChvZmZzZXQpIHtcbiAgICAgICAgb2Zmc2V0ID0gTWF0aC5tYXgoTWF0aC5taW4ob2Zmc2V0LCB0aGlzLl9jb250ZW50Lmxlbmd0aCksIDApO1xuICAgICAgICBsZXQgbGluZU9mZnNldHMgPSB0aGlzLmdldExpbmVPZmZzZXRzKCk7XG4gICAgICAgIGxldCBsb3cgPSAwLCBoaWdoID0gbGluZU9mZnNldHMubGVuZ3RoO1xuICAgICAgICBpZiAoaGlnaCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFBvc2l0aW9uLmNyZWF0ZSgwLCBvZmZzZXQpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgICAgICAgICBsZXQgbWlkID0gTWF0aC5mbG9vcigobG93ICsgaGlnaCkgLyAyKTtcbiAgICAgICAgICAgIGlmIChsaW5lT2Zmc2V0c1ttaWRdID4gb2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgaGlnaCA9IG1pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvdyA9IG1pZCArIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gbG93IGlzIHRoZSBsZWFzdCB4IGZvciB3aGljaCB0aGUgbGluZSBvZmZzZXQgaXMgbGFyZ2VyIHRoYW4gdGhlIGN1cnJlbnQgb2Zmc2V0XG4gICAgICAgIC8vIG9yIGFycmF5Lmxlbmd0aCBpZiBubyBsaW5lIG9mZnNldCBpcyBsYXJnZXIgdGhhbiB0aGUgY3VycmVudCBvZmZzZXRcbiAgICAgICAgbGV0IGxpbmUgPSBsb3cgLSAxO1xuICAgICAgICByZXR1cm4gUG9zaXRpb24uY3JlYXRlKGxpbmUsIG9mZnNldCAtIGxpbmVPZmZzZXRzW2xpbmVdKTtcbiAgICB9XG4gICAgb2Zmc2V0QXQocG9zaXRpb24pIHtcbiAgICAgICAgbGV0IGxpbmVPZmZzZXRzID0gdGhpcy5nZXRMaW5lT2Zmc2V0cygpO1xuICAgICAgICBpZiAocG9zaXRpb24ubGluZSA+PSBsaW5lT2Zmc2V0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb250ZW50Lmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwb3NpdGlvbi5saW5lIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGxpbmVPZmZzZXQgPSBsaW5lT2Zmc2V0c1twb3NpdGlvbi5saW5lXTtcbiAgICAgICAgbGV0IG5leHRMaW5lT2Zmc2V0ID0gKHBvc2l0aW9uLmxpbmUgKyAxIDwgbGluZU9mZnNldHMubGVuZ3RoKSA/IGxpbmVPZmZzZXRzW3Bvc2l0aW9uLmxpbmUgKyAxXSA6IHRoaXMuX2NvbnRlbnQubGVuZ3RoO1xuICAgICAgICByZXR1cm4gTWF0aC5tYXgoTWF0aC5taW4obGluZU9mZnNldCArIHBvc2l0aW9uLmNoYXJhY3RlciwgbmV4dExpbmVPZmZzZXQpLCBsaW5lT2Zmc2V0KTtcbiAgICB9XG4gICAgZ2V0IGxpbmVDb3VudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TGluZU9mZnNldHMoKS5sZW5ndGg7XG4gICAgfVxufVxudmFyIElzO1xuKGZ1bmN0aW9uIChJcykge1xuICAgIGNvbnN0IHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbiAgICBmdW5jdGlvbiBkZWZpbmVkKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnO1xuICAgIH1cbiAgICBJcy5kZWZpbmVkID0gZGVmaW5lZDtcbiAgICBmdW5jdGlvbiB1bmRlZmluZWQodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCc7XG4gICAgfVxuICAgIElzLnVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBmdW5jdGlvbiBib29sZWFuKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gZmFsc2U7XG4gICAgfVxuICAgIElzLmJvb2xlYW4gPSBib29sZWFuO1xuICAgIGZ1bmN0aW9uIHN0cmluZyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IFN0cmluZ10nO1xuICAgIH1cbiAgICBJcy5zdHJpbmcgPSBzdHJpbmc7XG4gICAgZnVuY3Rpb24gbnVtYmVyKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgTnVtYmVyXSc7XG4gICAgfVxuICAgIElzLm51bWJlciA9IG51bWJlcjtcbiAgICBmdW5jdGlvbiBudW1iZXJSYW5nZSh2YWx1ZSwgbWluLCBtYXgpIHtcbiAgICAgICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBOdW1iZXJdJyAmJiBtaW4gPD0gdmFsdWUgJiYgdmFsdWUgPD0gbWF4O1xuICAgIH1cbiAgICBJcy5udW1iZXJSYW5nZSA9IG51bWJlclJhbmdlO1xuICAgIGZ1bmN0aW9uIGludGVnZXIodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBOdW1iZXJdJyAmJiAtMjE0NzQ4MzY0OCA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSAyMTQ3NDgzNjQ3O1xuICAgIH1cbiAgICBJcy5pbnRlZ2VyID0gaW50ZWdlcjtcbiAgICBmdW5jdGlvbiB1aW50ZWdlcih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IE51bWJlcl0nICYmIDAgPD0gdmFsdWUgJiYgdmFsdWUgPD0gMjE0NzQ4MzY0NztcbiAgICB9XG4gICAgSXMudWludGVnZXIgPSB1aW50ZWdlcjtcbiAgICBmdW5jdGlvbiBmdW5jKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbiAgICB9XG4gICAgSXMuZnVuYyA9IGZ1bmM7XG4gICAgZnVuY3Rpb24gb2JqZWN0TGl0ZXJhbCh2YWx1ZSkge1xuICAgICAgICAvLyBTdHJpY3RseSBzcGVha2luZyBjbGFzcyBpbnN0YW5jZXMgcGFzcyB0aGlzIGNoZWNrIGFzIHdlbGwuIFNpbmNlIHRoZSBMU1BcbiAgICAgICAgLy8gZG9lc24ndCB1c2UgY2xhc3NlcyB3ZSBpZ25vcmUgdGhpcyBmb3Igbm93LiBJZiB3ZSBkbyB3ZSBuZWVkIHRvIGFkZCBzb21ldGhpbmdcbiAgICAgICAgLy8gbGlrZSB0aGlzOiBgT2JqZWN0LmdldFByb3RvdHlwZU9mKE9iamVjdC5nZXRQcm90b3R5cGVPZih4KSkgPT09IG51bGxgXG4gICAgICAgIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnO1xuICAgIH1cbiAgICBJcy5vYmplY3RMaXRlcmFsID0gb2JqZWN0TGl0ZXJhbDtcbiAgICBmdW5jdGlvbiB0eXBlZEFycmF5KHZhbHVlLCBjaGVjaykge1xuICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUuZXZlcnkoY2hlY2spO1xuICAgIH1cbiAgICBJcy50eXBlZEFycmF5ID0gdHlwZWRBcnJheTtcbn0pKElzIHx8IChJcyA9IHt9KSk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFLQSxhQUFPLGVBQWUsU0FBUyxjQUFjLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDNUQsY0FBUSxjQUFjLFFBQVEsUUFBUSxRQUFRLE9BQU8sUUFBUSxRQUFRLFFBQVEsU0FBUyxRQUFRLFNBQVMsUUFBUSxVQUFVO0FBQ3pILGVBQVMsUUFBUSxPQUFPO0FBQ3BCLGVBQU8sVUFBVSxRQUFRLFVBQVU7QUFBQSxNQUN2QztBQUNBLGNBQVEsVUFBVTtBQUNsQixlQUFTLE9BQU8sT0FBTztBQUNuQixlQUFPLE9BQU8sVUFBVSxZQUFZLGlCQUFpQjtBQUFBLE1BQ3pEO0FB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LHNCQUFzQjtBQUFBLFVBQ3RCLGVBQWU7QUFBQSxZQUNYO0FBQUEsWUFBYTtBQUFBLFlBQVM7QUFBQSxZQUN0QjtBQUFBLFlBQ0E7QUFBQSxZQUNBO0FBQUEsVUFDSjtBQUFBLFVBQ0EsYUFBYSxDQUFDLFFBQVEsU0FBUyxPQUFPLE9BQU8sRUFBRTtBQUFBLFFBQ25EO0FBQUEsUUFDQSxlQUFnQixFQUFFLFNBQVMsS0FBSztBQUFBLFFBQ2hDLFFBQWdCLEVBQUUsU0FBUyxLQUFLO0FBQUEsUUFDaEMsYUFBZ0IsRUFBRSxpQkFBaUIsTUFBTTtBQUFBLFFBQ3pDLFlBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsU0FBUyxNQUFNLEVBQUU7QUFBQSxRQUNyRCxvQkFBd0IsRUFBRSxTQUFTLEtBQUs7QUFBQSxRQUN4Qyx5QkFBeUIsRUFBRSxTQUFTLEtBQUs7QUFBQSxNQUM3QztBQUFBLElBQ0o7QUFBQSxFQUNKOyIsCiAgIm5hbWVzIjogWyJFcnJvckNvZGVzIiwgIk1lc3NhZ2UiLCAiVG91Y2giLCAiRGlzcG9zYWJsZSIsICJSQUwiLCAiRXZlbnQiLCAiSXMiLCAiQ2FuY2VsbGF0aW9uVG9rZW4iLCAiQ2FuY2VsbGF0aW9uU3RhdGUiLCAiX2Nvbm4iLCAiSXMiLCAiTWVzc2FnZVJlYWRlciIsICJBYnN0cmFjdE1lc3NhZ2VSZWFkZXIiLCAiUmVzb2x2ZWRNZXNzYWdlUmVhZGVyT3B0aW9ucyIsICJJcyIsICJNZXNzYWdlV3JpdGVyIiwgIkFic3RyYWN0TWVzc2FnZVdyaXRlciIsICJSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zIiwgInJlc3VsdCIsICJJcyIsICJDYW5jZWxOb3RpZmljYXRpb24iLCAiUHJvZ3Jlc3NUb2tlbiIsICJQcm9ncmVzc05vdGlmaWNhdGlvbiIsICJTdGFyUmVxdWVzdEhhbmRsZXIiLCAiVHJhY2UiLCAiVHJhY2VWYWx1ZXMiLCAiVHJhY2VGb3JtYXQiLCAiU2V0VHJhY2VOb3RpZmljYXRpb24iLCAiTG9nVHJhY2VOb3RpZmljYXRpb24iLCAiQ29ubmVjdGlvbkVycm9ycyIsICJDb25uZWN0aW9uU3RyYXRlZ3kiLCAiSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5IiwgIlJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5IiwgIkNhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kiLCAiQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kiLCAiQ2FuY2VsbGF0aW9uU3RyYXRlZ3kiLCAiTWVzc2FnZVN0cmF0ZWd5IiwgIkNvbm5lY3Rpb25PcHRpb25zIiwgIkNvbm5lY3Rpb25TdGF0ZSIsICJjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiIsICJzdGFydFRpbWUiLCAiUklMIiwgIm0iLCAiZXhwb3J0cyIsICJjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiIsICJpbXBvcnRfdnNjb2RlX2pzb25ycGMiLCAiaW1wb3J0X3ZzY29kZV9qc29ucnBjIiwgImltcG9ydF92c2NvZGVfanNvbnJwYyIsICJpbXBvcnRfdnNjb2RlX2pzb25ycGMiLCAiRG9jdW1lbnRVcmkiLCAiVVJJIiwgImludGVnZXIiLCAidWludGVnZXIiLCAiUG9zaXRpb24iLCAiUmFuZ2UiLCAiTG9jYXRpb24iLCAiTG9jYXRpb25MaW5rIiwgIkNvbG9yIiwgIkNvbG9ySW5mb3JtYXRpb24iLCAiQ29sb3JQcmVzZW50YXRpb24iLCAiRm9sZGluZ1JhbmdlS2luZCIsICJGb2xkaW5nUmFuZ2UiLCAiRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbiIsICJsb2NhdGlvbiIsICJEaWFnbm9zdGljU2V2ZXJpdHkiLCAiRGlhZ25vc3RpY1RhZyIsICJDb2RlRGVzY3JpcHRpb24iLCAiRGlhZ25vc3RpYyIsICJDb21tYW5kIiwgIlRleHRFZGl0IiwgIkNoYW5nZUFubm90YXRpb24iLCAiQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIiLCAiQW5ub3RhdGVkVGV4dEVkaXQiLCAiVGV4dERvY3VtZW50RWRpdCIsICJDcmVhdGVGaWxlIiwgIlJlbmFtZUZpbGUiLCAiRGVsZXRlRmlsZSIsICJXb3Jrc3BhY2VFZGl0IiwgIlRleHREb2N1bWVudElkZW50aWZpZXIiLCAiVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciIsICJPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIiLCAiVGV4dERvY3VtZW50SXRlbSIsICJNYXJrdXBLaW5kIiwgIk1hcmt1cENvbnRlbnQiLCAiQ29tcGxldGlvbkl0ZW1LaW5kIiwgIkluc2VydFRleHRGb3JtYXQiLCAiQ29tcGxldGlvbkl0ZW1UYWciLCAiSW5zZXJ0UmVwbGFjZUVkaXQiLCAiUmFuZ2UiLCAiSW5zZXJ0VGV4dE1vZGUiLCAiQ29tcGxldGlvbkl0ZW1MYWJlbERldGFpbHMiLCAiQ29tcGxldGlvbkl0ZW0iLCAiQ29tcGxldGlvbkxpc3QiLCAiTWFya2VkU3RyaW5nIiwgIkhvdmVyIiwgIlBhcmFtZXRlckluZm9ybWF0aW9uIiwgIlNpZ25hdHVyZUluZm9ybWF0aW9uIiwgIkRvY3VtZW50SGlnaGxpZ2h0S2luZCIsICJEb2N1bWVudEhpZ2hsaWdodCIsICJTeW1ib2xLaW5kIiwgIlN5bWJvbFRhZyIsICJTeW1ib2xJbmZvcm1hdGlvbiIsICJXb3Jrc3BhY2VTeW1ib2wiLCAiRG9jdW1lbnRTeW1ib2wiLCAiQ29kZUFjdGlvbktpbmQiLCAiQ29kZUFjdGlvblRyaWdnZXJLaW5kIiwgIkNvZGVBY3Rpb25Db250ZXh0IiwgIkNvZGVBY3Rpb24iLCAiQ29kZUxlbnMiLCAiRm9ybWF0dGluZ09wdGlvbnMiLCAiRG9jdW1lbnRMaW5rIiwgIlNlbGVjdGlvblJhbmdlIiwgIlNlbWFudGljVG9rZW5UeXBlcyIsICJTZW1hbnRpY1Rva2VuTW9kaWZpZXJzIiwgIlNlbWFudGljVG9rZW5zIiwgIklubGluZVZhbHVlVGV4dCIsICJJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwIiwgIklubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uIiwgIklubGluZVZhbHVlQ29udGV4dCIsICJJbmxheUhpbnRLaW5kIiwgIklubGF5SGludExhYmVsUGFydCIsICJJbmxheUhpbnQiLCAiUG9zaXRpb24iLCAiU3RyaW5nVmFsdWUiLCAiSW5saW5lQ29tcGxldGlvbkl0ZW0iLCAiSW5saW5lQ29tcGxldGlvbkxpc3QiLCAiSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kIiwgIlNlbGVjdGVkQ29tcGxldGlvbkluZm8iLCAiSW5saW5lQ29tcGxldGlvbkNvbnRleHQiLCAiV29ya3NwYWNlRm9sZGVyIiwgIlRleHREb2N1bWVudCIsICJQb3NpdGlvbiIsICJJcyIsICJ1bmRlZmluZWQiLCAiaW50ZWdlciIsICJ1aW50ZWdlciIsICJtIl0KfQo= +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvY29tbW9uL2lzLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlcy5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vbGlua2VkTWFwLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9kaXNwb3NhYmxlLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9yYWwuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvY29tbW9uL2V2ZW50cy5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vY2FuY2VsbGF0aW9uLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9zaGFyZWRBcnJheUNhbmNlbGxhdGlvbi5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vc2VtYXBob3JlLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlUmVhZGVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlV3JpdGVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlQnVmZmVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9jb25uZWN0aW9uLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9hcGkuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvYnJvd3Nlci9yaWwuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvYnJvd3Nlci9tYWluLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvYnJvd3Nlci5qcyIsICJsc3AvamF2YS1sc3AtY2xpZW50LnRzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLXdzLWpzb25ycGMvc3JjL2Rpc3Bvc2FibGUudHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvc29ja2V0L3NvY2tldC50cyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS13cy1qc29ucnBjL3NyYy9zb2NrZXQvcmVhZGVyLnRzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLXdzLWpzb25ycGMvc3JjL3NvY2tldC93cml0ZXIudHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvc29ja2V0L2Nvbm5lY3Rpb24udHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvY29ubmVjdGlvbi50cyIsICJsc3AvbW9uYWNvLXNoaW0udHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtbGFuZ3VhZ2VzZXJ2ZXItdHlwZXMvbGliL2VzbS9tYWluLmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuc3RyaW5nQXJyYXkgPSBleHBvcnRzLmFycmF5ID0gZXhwb3J0cy5mdW5jID0gZXhwb3J0cy5lcnJvciA9IGV4cG9ydHMubnVtYmVyID0gZXhwb3J0cy5zdHJpbmcgPSBleHBvcnRzLmJvb2xlYW4gPSB2b2lkIDA7XG5mdW5jdGlvbiBib29sZWFuKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZTtcbn1cbmV4cG9ydHMuYm9vbGVhbiA9IGJvb2xlYW47XG5mdW5jdGlvbiBzdHJpbmcodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZztcbn1cbmV4cG9ydHMuc3RyaW5nID0gc3RyaW5nO1xuZnVuY3Rpb24gbnVtYmVyKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdmFsdWUgaW5zdGFuY2VvZiBOdW1iZXI7XG59XG5leHBvcnRzLm51bWJlciA9IG51bWJlcjtcbmZ1bmN0aW9uIGVycm9yKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgRXJyb3I7XG59XG5leHBvcnRzLmVycm9yID0gZXJyb3I7XG5mdW5jdGlvbiBmdW5jKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cbmV4cG9ydHMuZnVuYyA9IGZ1bmM7XG5mdW5jdGlvbiBhcnJheSh2YWx1ZSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cbmV4cG9ydHMuYXJyYXkgPSBhcnJheTtcbmZ1bmN0aW9uIHN0cmluZ0FycmF5KHZhbHVlKSB7XG4gICAgcmV0dXJuIGFycmF5KHZhbHVlKSAmJiB2YWx1ZS5ldmVyeShlbGVtID0+IHN0cmluZyhlbGVtKSk7XG59XG5leHBvcnRzLnN0cmluZ0FycmF5ID0gc3RyaW5nQXJyYXk7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLk1lc3NhZ2UgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU5ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlOCA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTcgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU2ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNSA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTQgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUzID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMiA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTEgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUwID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTkgPSBleHBvcnRzLlJlcXVlc3RUeXBlOCA9IGV4cG9ydHMuUmVxdWVzdFR5cGU3ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTYgPSBleHBvcnRzLlJlcXVlc3RUeXBlNSA9IGV4cG9ydHMuUmVxdWVzdFR5cGU0ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTMgPSBleHBvcnRzLlJlcXVlc3RUeXBlMiA9IGV4cG9ydHMuUmVxdWVzdFR5cGUxID0gZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IGV4cG9ydHMuUmVxdWVzdFR5cGUwID0gZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUgPSBleHBvcnRzLlBhcmFtZXRlclN0cnVjdHVyZXMgPSBleHBvcnRzLlJlc3BvbnNlRXJyb3IgPSBleHBvcnRzLkVycm9yQ29kZXMgPSB2b2lkIDA7XG5jb25zdCBpcyA9IHJlcXVpcmUoXCIuL2lzXCIpO1xuLyoqXG4gKiBQcmVkZWZpbmVkIGVycm9yIGNvZGVzLlxuICovXG52YXIgRXJyb3JDb2RlcztcbihmdW5jdGlvbiAoRXJyb3JDb2Rlcykge1xuICAgIC8vIERlZmluZWQgYnkgSlNPTiBSUENcbiAgICBFcnJvckNvZGVzLlBhcnNlRXJyb3IgPSAtMzI3MDA7XG4gICAgRXJyb3JDb2Rlcy5JbnZhbGlkUmVxdWVzdCA9IC0zMjYwMDtcbiAgICBFcnJvckNvZGVzLk1ldGhvZE5vdEZvdW5kID0gLTMyNjAxO1xuICAgIEVycm9yQ29kZXMuSW52YWxpZFBhcmFtcyA9IC0zMjYwMjtcbiAgICBFcnJvckNvZGVzLkludGVybmFsRXJyb3IgPSAtMzI2MDM7XG4gICAgLyoqXG4gICAgICogVGhpcyBpcyB0aGUgc3RhcnQgcmFuZ2Ugb2YgSlNPTiBSUEMgcmVzZXJ2ZWQgZXJyb3IgY29kZXMuXG4gICAgICogSXQgZG9lc24ndCBkZW5vdGUgYSByZWFsIGVycm9yIGNvZGUuIE5vIGFwcGxpY2F0aW9uIGVycm9yIGNvZGVzIHNob3VsZFxuICAgICAqIGJlIGRlZmluZWQgYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCByYW5nZS4gRm9yIGJhY2t3YXJkc1xuICAgICAqIGNvbXBhdGliaWxpdHkgdGhlIGBTZXJ2ZXJOb3RJbml0aWFsaXplZGAgYW5kIHRoZSBgVW5rbm93bkVycm9yQ29kZWBcbiAgICAgKiBhcmUgbGVmdCBpbiB0aGUgcmFuZ2UuXG4gICAgICpcbiAgICAgKiBAc2luY2UgMy4xNi4wXG4gICAgKi9cbiAgICBFcnJvckNvZGVzLmpzb25ycGNSZXNlcnZlZEVycm9yUmFuZ2VTdGFydCA9IC0zMjA5OTtcbiAgICAvKiogQGRlcHJlY2F0ZWQgdXNlICBqc29ucnBjUmVzZXJ2ZWRFcnJvclJhbmdlU3RhcnQgKi9cbiAgICBFcnJvckNvZGVzLnNlcnZlckVycm9yU3RhcnQgPSAtMzIwOTk7XG4gICAgLyoqXG4gICAgICogQW4gZXJyb3Igb2NjdXJyZWQgd2hlbiB3cml0ZSBhIG1lc3NhZ2UgdG8gdGhlIHRyYW5zcG9ydCBsYXllci5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLk1lc3NhZ2VXcml0ZUVycm9yID0gLTMyMDk5O1xuICAgIC8qKlxuICAgICAqIEFuIGVycm9yIG9jY3VycmVkIHdoZW4gcmVhZGluZyBhIG1lc3NhZ2UgZnJvbSB0aGUgdHJhbnNwb3J0IGxheWVyLlxuICAgICAqL1xuICAgIEVycm9yQ29kZXMuTWVzc2FnZVJlYWRFcnJvciA9IC0zMjA5ODtcbiAgICAvKipcbiAgICAgKiBUaGUgY29ubmVjdGlvbiBnb3QgZGlzcG9zZWQgb3IgbG9zdCBhbmQgYWxsIHBlbmRpbmcgcmVzcG9uc2VzIGdvdFxuICAgICAqIHJlamVjdGVkLlxuICAgICAqL1xuICAgIEVycm9yQ29kZXMuUGVuZGluZ1Jlc3BvbnNlUmVqZWN0ZWQgPSAtMzIwOTc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gaXMgaW5hY3RpdmUgYW5kIGEgdXNlIG9mIGl0IGZhaWxlZC5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLkNvbm5lY3Rpb25JbmFjdGl2ZSA9IC0zMjA5NjtcbiAgICAvKipcbiAgICAgKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBhIHNlcnZlciByZWNlaXZlZCBhIG5vdGlmaWNhdGlvbiBvclxuICAgICAqIHJlcXVlc3QgYmVmb3JlIHRoZSBzZXJ2ZXIgaGFzIHJlY2VpdmVkIHRoZSBgaW5pdGlhbGl6ZWAgcmVxdWVzdC5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLlNlcnZlck5vdEluaXRpYWxpemVkID0gLTMyMDAyO1xuICAgIEVycm9yQ29kZXMuVW5rbm93bkVycm9yQ29kZSA9IC0zMjAwMTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIHRoZSBlbmQgcmFuZ2Ugb2YgSlNPTiBSUEMgcmVzZXJ2ZWQgZXJyb3IgY29kZXMuXG4gICAgICogSXQgZG9lc24ndCBkZW5vdGUgYSByZWFsIGVycm9yIGNvZGUuXG4gICAgICpcbiAgICAgKiBAc2luY2UgMy4xNi4wXG4gICAgKi9cbiAgICBFcnJvckNvZGVzLmpzb25ycGNSZXNlcnZlZEVycm9yUmFuZ2VFbmQgPSAtMzIwMDA7XG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSAganNvbnJwY1Jlc2VydmVkRXJyb3JSYW5nZUVuZCAqL1xuICAgIEVycm9yQ29kZXMuc2VydmVyRXJyb3JFbmQgPSAtMzIwMDA7XG59KShFcnJvckNvZGVzIHx8IChleHBvcnRzLkVycm9yQ29kZXMgPSBFcnJvckNvZGVzID0ge30pKTtcbi8qKlxuICogQW4gZXJyb3Igb2JqZWN0IHJldHVybiBpbiBhIHJlc3BvbnNlIGluIGNhc2UgYSByZXF1ZXN0XG4gKiBoYXMgZmFpbGVkLlxuICovXG5jbGFzcyBSZXNwb25zZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNvZGUsIG1lc3NhZ2UsIGRhdGEpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuY29kZSA9IGlzLm51bWJlcihjb2RlKSA/IGNvZGUgOiBFcnJvckNvZGVzLlVua25vd25FcnJvckNvZGU7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBSZXNwb25zZUVycm9yLnByb3RvdHlwZSk7XG4gICAgfVxuICAgIHRvSnNvbigpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgY29kZTogdGhpcy5jb2RlLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLmRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmRhdGEgPSB0aGlzLmRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5leHBvcnRzLlJlc3BvbnNlRXJyb3IgPSBSZXNwb25zZUVycm9yO1xuY2xhc3MgUGFyYW1ldGVyU3RydWN0dXJlcyB7XG4gICAgY29uc3RydWN0b3Ioa2luZCkge1xuICAgICAgICB0aGlzLmtpbmQgPSBraW5kO1xuICAgIH1cbiAgICBzdGF0aWMgaXModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8gfHwgdmFsdWUgPT09IFBhcmFtZXRlclN0cnVjdHVyZXMuYnlOYW1lIHx8IHZhbHVlID09PSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5UG9zaXRpb247XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5raW5kO1xuICAgIH1cbn1cbmV4cG9ydHMuUGFyYW1ldGVyU3RydWN0dXJlcyA9IFBhcmFtZXRlclN0cnVjdHVyZXM7XG4vKipcbiAqIFRoZSBwYXJhbWV0ZXIgc3RydWN0dXJlIGlzIGF1dG9tYXRpY2FsbHkgaW5mZXJyZWQgb24gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzXG4gKiBhbmQgdGhlIHBhcmFtZXRlciB0eXBlIGluIGNhc2Ugb2YgYSBzaW5nbGUgcGFyYW0uXG4gKi9cblBhcmFtZXRlclN0cnVjdHVyZXMuYXV0byA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdhdXRvJyk7XG4vKipcbiAqIEZvcmNlcyBgYnlQb3NpdGlvbmAgcGFyYW1ldGVyIHN0cnVjdHVyZS4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGhhdmUgYSBzaW5nbGVcbiAqIHBhcmFtZXRlciB3aGljaCBoYXMgYSBsaXRlcmFsIHR5cGUuXG4gKi9cblBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbiA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdieVBvc2l0aW9uJyk7XG4vKipcbiAqIEZvcmNlcyBgYnlOYW1lYCBwYXJhbWV0ZXIgc3RydWN0dXJlLiBUaGlzIGlzIG9ubHkgdXNlZnVsIHdoZW4gaGF2aW5nIGEgc2luZ2xlXG4gKiBwYXJhbWV0ZXIuIFRoZSBsaWJyYXJ5IHdpbGwgcmVwb3J0IGVycm9ycyBpZiB1c2VkIHdpdGggYSBkaWZmZXJlbnQgbnVtYmVyIG9mXG4gKiBwYXJhbWV0ZXJzLlxuICovXG5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdieU5hbWUnKTtcbi8qKlxuICogQW4gYWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgYSBNZXNzYWdlVHlwZS5cbiAqL1xuY2xhc3MgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIG51bWJlck9mUGFyYW1zKSB7XG4gICAgICAgIHRoaXMubWV0aG9kID0gbWV0aG9kO1xuICAgICAgICB0aGlzLm51bWJlck9mUGFyYW1zID0gbnVtYmVyT2ZQYXJhbXM7XG4gICAgfVxuICAgIGdldCBwYXJhbWV0ZXJTdHJ1Y3R1cmVzKCkge1xuICAgICAgICByZXR1cm4gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvO1xuICAgIH1cbn1cbmV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlID0gQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlO1xuLyoqXG4gKiBDbGFzc2VzIHRvIHR5cGUgcmVxdWVzdCByZXNwb25zZSBwYWlyc1xuICovXG5jbGFzcyBSZXF1ZXN0VHlwZTAgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDApO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGUwID0gUmVxdWVzdFR5cGUwO1xuY2xhc3MgUmVxdWVzdFR5cGUgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCwgX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8pIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAxKTtcbiAgICAgICAgdGhpcy5fcGFyYW1ldGVyU3RydWN0dXJlcyA9IF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbiAgICBnZXQgcGFyYW1ldGVyU3RydWN0dXJlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXM7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IFJlcXVlc3RUeXBlO1xuY2xhc3MgUmVxdWVzdFR5cGUxIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMSk7XG4gICAgICAgIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBfcGFyYW1ldGVyU3RydWN0dXJlcztcbiAgICB9XG4gICAgZ2V0IHBhcmFtZXRlclN0cnVjdHVyZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGUxID0gUmVxdWVzdFR5cGUxO1xuY2xhc3MgUmVxdWVzdFR5cGUyIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAyKTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlMiA9IFJlcXVlc3RUeXBlMjtcbmNsYXNzIFJlcXVlc3RUeXBlMyBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMyk7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTMgPSBSZXF1ZXN0VHlwZTM7XG5jbGFzcyBSZXF1ZXN0VHlwZTQgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDQpO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGU0ID0gUmVxdWVzdFR5cGU0O1xuY2xhc3MgUmVxdWVzdFR5cGU1IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA1KTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlNSA9IFJlcXVlc3RUeXBlNTtcbmNsYXNzIFJlcXVlc3RUeXBlNiBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNik7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTYgPSBSZXF1ZXN0VHlwZTY7XG5jbGFzcyBSZXF1ZXN0VHlwZTcgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDcpO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGU3ID0gUmVxdWVzdFR5cGU3O1xuY2xhc3MgUmVxdWVzdFR5cGU4IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA4KTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlOCA9IFJlcXVlc3RUeXBlODtcbmNsYXNzIFJlcXVlc3RUeXBlOSBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgOSk7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTkgPSBSZXF1ZXN0VHlwZTk7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMSk7XG4gICAgICAgIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBfcGFyYW1ldGVyU3RydWN0dXJlcztcbiAgICB9XG4gICAgZ2V0IHBhcmFtZXRlclN0cnVjdHVyZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZSA9IE5vdGlmaWNhdGlvblR5cGU7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlMCBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMCk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMCA9IE5vdGlmaWNhdGlvblR5cGUwO1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTEgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCwgX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8pIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAxKTtcbiAgICAgICAgdGhpcy5fcGFyYW1ldGVyU3RydWN0dXJlcyA9IF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbiAgICBnZXQgcGFyYW1ldGVyU3RydWN0dXJlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXM7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMSA9IE5vdGlmaWNhdGlvblR5cGUxO1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDIpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTIgPSBOb3RpZmljYXRpb25UeXBlMjtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGUzIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAzKTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGUzID0gTm90aWZpY2F0aW9uVHlwZTM7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlNCBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNCk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNCA9IE5vdGlmaWNhdGlvblR5cGU0O1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTUgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDUpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTUgPSBOb3RpZmljYXRpb25UeXBlNTtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGU2IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA2KTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGU2ID0gTm90aWZpY2F0aW9uVHlwZTY7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlNyBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNyk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNyA9IE5vdGlmaWNhdGlvblR5cGU3O1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTggZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDgpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTggPSBOb3RpZmljYXRpb25UeXBlODtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGU5IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA5KTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGU5ID0gTm90aWZpY2F0aW9uVHlwZTk7XG52YXIgTWVzc2FnZTtcbihmdW5jdGlvbiAoTWVzc2FnZSkge1xuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoZSBnaXZlbiBtZXNzYWdlIGlzIGEgcmVxdWVzdCBtZXNzYWdlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gbWVzc2FnZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBpcy5zdHJpbmcoY2FuZGlkYXRlLm1ldGhvZCkgJiYgKGlzLnN0cmluZyhjYW5kaWRhdGUuaWQpIHx8IGlzLm51bWJlcihjYW5kaWRhdGUuaWQpKTtcbiAgICB9XG4gICAgTWVzc2FnZS5pc1JlcXVlc3QgPSBpc1JlcXVlc3Q7XG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhlIGdpdmVuIG1lc3NhZ2UgaXMgYSBub3RpZmljYXRpb24gbWVzc2FnZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTm90aWZpY2F0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gbWVzc2FnZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBpcy5zdHJpbmcoY2FuZGlkYXRlLm1ldGhvZCkgJiYgbWVzc2FnZS5pZCA9PT0gdm9pZCAwO1xuICAgIH1cbiAgICBNZXNzYWdlLmlzTm90aWZpY2F0aW9uID0gaXNOb3RpZmljYXRpb247XG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhlIGdpdmVuIG1lc3NhZ2UgaXMgYSByZXNwb25zZSBtZXNzYWdlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNSZXNwb25zZShtZXNzYWdlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IG1lc3NhZ2U7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgKGNhbmRpZGF0ZS5yZXN1bHQgIT09IHZvaWQgMCB8fCAhIWNhbmRpZGF0ZS5lcnJvcikgJiYgKGlzLnN0cmluZyhjYW5kaWRhdGUuaWQpIHx8IGlzLm51bWJlcihjYW5kaWRhdGUuaWQpIHx8IGNhbmRpZGF0ZS5pZCA9PT0gbnVsbCk7XG4gICAgfVxuICAgIE1lc3NhZ2UuaXNSZXNwb25zZSA9IGlzUmVzcG9uc2U7XG59KShNZXNzYWdlIHx8IChleHBvcnRzLk1lc3NhZ2UgPSBNZXNzYWdlID0ge30pKTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xudmFyIF9hO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5MUlVDYWNoZSA9IGV4cG9ydHMuTGlua2VkTWFwID0gZXhwb3J0cy5Ub3VjaCA9IHZvaWQgMDtcbnZhciBUb3VjaDtcbihmdW5jdGlvbiAoVG91Y2gpIHtcbiAgICBUb3VjaC5Ob25lID0gMDtcbiAgICBUb3VjaC5GaXJzdCA9IDE7XG4gICAgVG91Y2guQXNPbGQgPSBUb3VjaC5GaXJzdDtcbiAgICBUb3VjaC5MYXN0ID0gMjtcbiAgICBUb3VjaC5Bc05ldyA9IFRvdWNoLkxhc3Q7XG59KShUb3VjaCB8fCAoZXhwb3J0cy5Ub3VjaCA9IFRvdWNoID0ge30pKTtcbmNsYXNzIExpbmtlZE1hcCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXNbX2FdID0gJ0xpbmtlZE1hcCc7XG4gICAgICAgIHRoaXMuX21hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5faGVhZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fdGFpbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IDA7XG4gICAgICAgIHRoaXMuX3N0YXRlID0gMDtcbiAgICB9XG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuX21hcC5jbGVhcigpO1xuICAgICAgICB0aGlzLl9oZWFkID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl90YWlsID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9zaXplID0gMDtcbiAgICAgICAgdGhpcy5fc3RhdGUrKztcbiAgICB9XG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLl9oZWFkICYmICF0aGlzLl90YWlsO1xuICAgIH1cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpemU7XG4gICAgfVxuICAgIGdldCBmaXJzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlYWQ/LnZhbHVlO1xuICAgIH1cbiAgICBnZXQgbGFzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhaWw/LnZhbHVlO1xuICAgIH1cbiAgICBoYXMoa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXAuaGFzKGtleSk7XG4gICAgfVxuICAgIGdldChrZXksIHRvdWNoID0gVG91Y2guTm9uZSkge1xuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5fbWFwLmdldChrZXkpO1xuICAgICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRvdWNoICE9PSBUb3VjaC5Ob25lKSB7XG4gICAgICAgICAgICB0aGlzLnRvdWNoKGl0ZW0sIHRvdWNoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICB9XG4gICAgc2V0KGtleSwgdmFsdWUsIHRvdWNoID0gVG91Y2guTm9uZSkge1xuICAgICAgICBsZXQgaXRlbSA9IHRoaXMuX21hcC5nZXQoa2V5KTtcbiAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgIGl0ZW0udmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIGlmICh0b3VjaCAhPT0gVG91Y2guTm9uZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudG91Y2goaXRlbSwgdG91Y2gpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaXRlbSA9IHsga2V5LCB2YWx1ZSwgbmV4dDogdW5kZWZpbmVkLCBwcmV2aW91czogdW5kZWZpbmVkIH07XG4gICAgICAgICAgICBzd2l0Y2ggKHRvdWNoKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBUb3VjaC5Ob25lOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFRvdWNoLkZpcnN0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1GaXJzdChpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBUb3VjaC5MYXN0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX21hcC5zZXQoa2V5LCBpdGVtKTtcbiAgICAgICAgICAgIHRoaXMuX3NpemUrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGVsZXRlKGtleSkge1xuICAgICAgICByZXR1cm4gISF0aGlzLnJlbW92ZShrZXkpO1xuICAgIH1cbiAgICByZW1vdmUoa2V5KSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl9tYXAuZ2V0KGtleSk7XG4gICAgICAgIGlmICghaXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tYXAuZGVsZXRlKGtleSk7XG4gICAgICAgIHRoaXMucmVtb3ZlSXRlbShpdGVtKTtcbiAgICAgICAgdGhpcy5fc2l6ZS0tO1xuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICB9XG4gICAgc2hpZnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5faGVhZCAmJiAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2hlYWQgfHwgIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIHRoaXMuX21hcC5kZWxldGUoaXRlbS5rZXkpO1xuICAgICAgICB0aGlzLnJlbW92ZUl0ZW0oaXRlbSk7XG4gICAgICAgIHRoaXMuX3NpemUtLTtcbiAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7XG4gICAgfVxuICAgIGZvckVhY2goY2FsbGJhY2tmbiwgdGhpc0FyZykge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3N0YXRlO1xuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICAgICAgICBpZiAodGhpc0FyZykge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrZm4uYmluZCh0aGlzQXJnKShjdXJyZW50LnZhbHVlLCBjdXJyZW50LmtleSwgdGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFja2ZuKGN1cnJlbnQudmFsdWUsIGN1cnJlbnQua2V5LCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gc3RhdGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExpbmtlZE1hcCBnb3QgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAga2V5cygpIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9zdGF0ZTtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLl9oZWFkO1xuICAgICAgICBjb25zdCBpdGVyYXRvciA9IHtcbiAgICAgICAgICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fc3RhdGUgIT09IHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTGlua2VkTWFwIGdvdCBtb2RpZmllZCBkdXJpbmcgaXRlcmF0aW9uLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7IHZhbHVlOiBjdXJyZW50LmtleSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICB9XG4gICAgdmFsdWVzKCkge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3N0YXRlO1xuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIGNvbnN0IGl0ZXJhdG9yID0ge1xuICAgICAgICAgICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlcmF0b3I7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBMaW5rZWRNYXAgZ290IG1vZGlmaWVkIGR1cmluZyBpdGVyYXRpb24uYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHsgdmFsdWU6IGN1cnJlbnQudmFsdWUsIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gaXRlcmF0b3I7XG4gICAgfVxuICAgIGVudHJpZXMoKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5fc3RhdGU7XG4gICAgICAgIGxldCBjdXJyZW50ID0gdGhpcy5faGVhZDtcbiAgICAgICAgY29uc3QgaXRlcmF0b3IgPSB7XG4gICAgICAgICAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3N0YXRlICE9PSBzdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExpbmtlZE1hcCBnb3QgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geyB2YWx1ZTogW2N1cnJlbnQua2V5LCBjdXJyZW50LnZhbHVlXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICB9XG4gICAgWyhfYSA9IFN5bWJvbC50b1N0cmluZ1RhZywgU3ltYm9sLml0ZXJhdG9yKV0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMoKTtcbiAgICB9XG4gICAgdHJpbU9sZChuZXdTaXplKSB7XG4gICAgICAgIGlmIChuZXdTaXplID49IHRoaXMuc2l6ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuZXdTaXplID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLl9oZWFkO1xuICAgICAgICBsZXQgY3VycmVudFNpemUgPSB0aGlzLnNpemU7XG4gICAgICAgIHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnRTaXplID4gbmV3U2l6ZSkge1xuICAgICAgICAgICAgdGhpcy5fbWFwLmRlbGV0ZShjdXJyZW50LmtleSk7XG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0O1xuICAgICAgICAgICAgY3VycmVudFNpemUtLTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9oZWFkID0gY3VycmVudDtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IGN1cnJlbnRTaXplO1xuICAgICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICAgICAgY3VycmVudC5wcmV2aW91cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgIH1cbiAgICBhZGRJdGVtRmlyc3QoaXRlbSkge1xuICAgICAgICAvLyBGaXJzdCB0aW1lIEluc2VydFxuICAgICAgICBpZiAoIXRoaXMuX2hlYWQgJiYgIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRoaXMuX3RhaWwgPSBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCF0aGlzLl9oZWFkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbGlzdCcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdGhpcy5faGVhZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQucHJldmlvdXMgPSBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2hlYWQgPSBpdGVtO1xuICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgIH1cbiAgICBhZGRJdGVtTGFzdChpdGVtKSB7XG4gICAgICAgIC8vIEZpcnN0IHRpbWUgSW5zZXJ0XG4gICAgICAgIGlmICghdGhpcy5faGVhZCAmJiAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgdGhpcy5faGVhZCA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpdGVtLnByZXZpb3VzID0gdGhpcy5fdGFpbDtcbiAgICAgICAgICAgIHRoaXMuX3RhaWwubmV4dCA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW07XG4gICAgICAgIHRoaXMuX3N0YXRlKys7XG4gICAgfVxuICAgIHJlbW92ZUl0ZW0oaXRlbSkge1xuICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCAmJiBpdGVtID09PSB0aGlzLl90YWlsKSB7XG4gICAgICAgICAgICB0aGlzLl9oZWFkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpdGVtID09PSB0aGlzLl9oZWFkKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGNhbiBvbmx5IGhhcHBlbmVkIGlmIHNpemUgPT09IDEgd2hpY2ggaXMgaGFuZGxlXG4gICAgICAgICAgICAvLyBieSB0aGUgY2FzZSBhYm92ZS5cbiAgICAgICAgICAgIGlmICghaXRlbS5uZXh0KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxpc3QnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGl0ZW0ubmV4dC5wcmV2aW91cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQgPSBpdGVtLm5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXRlbSA9PT0gdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgLy8gVGhpcyBjYW4gb25seSBoYXBwZW5lZCBpZiBzaXplID09PSAxIHdoaWNoIGlzIGhhbmRsZVxuICAgICAgICAgICAgLy8gYnkgdGhlIGNhc2UgYWJvdmUuXG4gICAgICAgICAgICBpZiAoIWl0ZW0ucHJldmlvdXMpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbGlzdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbS5wcmV2aW91cy5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gaXRlbS5uZXh0O1xuICAgICAgICAgICAgY29uc3QgcHJldmlvdXMgPSBpdGVtLnByZXZpb3VzO1xuICAgICAgICAgICAgaWYgKCFuZXh0IHx8ICFwcmV2aW91cykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXh0LnByZXZpb3VzID0gcHJldmlvdXM7XG4gICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gbmV4dDtcbiAgICAgICAgfVxuICAgICAgICBpdGVtLm5leHQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGl0ZW0ucHJldmlvdXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX3N0YXRlKys7XG4gICAgfVxuICAgIHRvdWNoKGl0ZW0sIHRvdWNoKSB7XG4gICAgICAgIGlmICghdGhpcy5faGVhZCB8fCAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxpc3QnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHRvdWNoICE9PSBUb3VjaC5GaXJzdCAmJiB0b3VjaCAhPT0gVG91Y2guTGFzdCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG91Y2ggPT09IFRvdWNoLkZpcnN0KSB7XG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBpdGVtLm5leHQ7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgICAgICAvLyBVbmxpbmsgdGhlIGl0ZW1cbiAgICAgICAgICAgIGlmIChpdGVtID09PSB0aGlzLl90YWlsKSB7XG4gICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgbXVzdCBiZSBkZWZpbmVkIHNpbmNlIGl0ZW0gd2FzIG5vdCBoZWFkIGJ1dCBpcyB0YWlsXG4gICAgICAgICAgICAgICAgLy8gU28gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbiBpdGVtIGluIHRoZSBtYXBcbiAgICAgICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuX3RhaWwgPSBwcmV2aW91cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEJvdGggbmV4dCBhbmQgcHJldmlvdXMgYXJlIG5vdCB1bmRlZmluZWQgc2luY2UgaXRlbSB3YXMgbmVpdGhlciBoZWFkIG5vciB0YWlsLlxuICAgICAgICAgICAgICAgIG5leHQucHJldmlvdXMgPSBwcmV2aW91cztcbiAgICAgICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEluc2VydCB0aGUgbm9kZSBhdCBoZWFkXG4gICAgICAgICAgICBpdGVtLnByZXZpb3VzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdGhpcy5faGVhZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQucHJldmlvdXMgPSBpdGVtO1xuICAgICAgICAgICAgdGhpcy5faGVhZCA9IGl0ZW07XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRvdWNoID09PSBUb3VjaC5MYXN0KSB7XG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBpdGVtLm5leHQ7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgICAgICAvLyBVbmxpbmsgdGhlIGl0ZW0uXG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCkge1xuICAgICAgICAgICAgICAgIC8vIG5leHQgbXVzdCBiZSBkZWZpbmVkIHNpbmNlIGl0ZW0gd2FzIG5vdCB0YWlsIGJ1dCBpcyBoZWFkXG4gICAgICAgICAgICAgICAgLy8gU28gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbiBpdGVtIGluIHRoZSBtYXBcbiAgICAgICAgICAgICAgICBuZXh0LnByZXZpb3VzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuX2hlYWQgPSBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQm90aCBuZXh0IGFuZCBwcmV2aW91cyBhcmUgbm90IHVuZGVmaW5lZCBzaW5jZSBpdGVtIHdhcyBuZWl0aGVyIGhlYWQgbm9yIHRhaWwuXG4gICAgICAgICAgICAgICAgbmV4dC5wcmV2aW91cyA9IHByZXZpb3VzO1xuICAgICAgICAgICAgICAgIHByZXZpb3VzLm5leHQgPSBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaXRlbS5wcmV2aW91cyA9IHRoaXMuX3RhaWw7XG4gICAgICAgICAgICB0aGlzLl90YWlsLm5leHQgPSBpdGVtO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW07XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IFtdO1xuICAgICAgICB0aGlzLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGRhdGEucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGZyb21KU09OKGRhdGEpIHtcbiAgICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBkYXRhKSB7XG4gICAgICAgICAgICB0aGlzLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuTGlua2VkTWFwID0gTGlua2VkTWFwO1xuY2xhc3MgTFJVQ2FjaGUgZXh0ZW5kcyBMaW5rZWRNYXAge1xuICAgIGNvbnN0cnVjdG9yKGxpbWl0LCByYXRpbyA9IDEpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fbGltaXQgPSBsaW1pdDtcbiAgICAgICAgdGhpcy5fcmF0aW8gPSBNYXRoLm1pbihNYXRoLm1heCgwLCByYXRpbyksIDEpO1xuICAgIH1cbiAgICBnZXQgbGltaXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9saW1pdDtcbiAgICB9XG4gICAgc2V0IGxpbWl0KGxpbWl0KSB7XG4gICAgICAgIHRoaXMuX2xpbWl0ID0gbGltaXQ7XG4gICAgICAgIHRoaXMuY2hlY2tUcmltKCk7XG4gICAgfVxuICAgIGdldCByYXRpbygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JhdGlvO1xuICAgIH1cbiAgICBzZXQgcmF0aW8ocmF0aW8pIHtcbiAgICAgICAgdGhpcy5fcmF0aW8gPSBNYXRoLm1pbihNYXRoLm1heCgwLCByYXRpbyksIDEpO1xuICAgICAgICB0aGlzLmNoZWNrVHJpbSgpO1xuICAgIH1cbiAgICBnZXQoa2V5LCB0b3VjaCA9IFRvdWNoLkFzTmV3KSB7XG4gICAgICAgIHJldHVybiBzdXBlci5nZXQoa2V5LCB0b3VjaCk7XG4gICAgfVxuICAgIHBlZWsoa2V5KSB7XG4gICAgICAgIHJldHVybiBzdXBlci5nZXQoa2V5LCBUb3VjaC5Ob25lKTtcbiAgICB9XG4gICAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgc3VwZXIuc2V0KGtleSwgdmFsdWUsIFRvdWNoLkxhc3QpO1xuICAgICAgICB0aGlzLmNoZWNrVHJpbSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgY2hlY2tUcmltKCkge1xuICAgICAgICBpZiAodGhpcy5zaXplID4gdGhpcy5fbGltaXQpIHtcbiAgICAgICAgICAgIHRoaXMudHJpbU9sZChNYXRoLnJvdW5kKHRoaXMuX2xpbWl0ICogdGhpcy5fcmF0aW8pKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuTFJVQ2FjaGUgPSBMUlVDYWNoZTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5EaXNwb3NhYmxlID0gdm9pZCAwO1xudmFyIERpc3Bvc2FibGU7XG4oZnVuY3Rpb24gKERpc3Bvc2FibGUpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUoZnVuYykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGlzcG9zZTogZnVuY1xuICAgICAgICB9O1xuICAgIH1cbiAgICBEaXNwb3NhYmxlLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKERpc3Bvc2FibGUgfHwgKGV4cG9ydHMuRGlzcG9zYWJsZSA9IERpc3Bvc2FibGUgPSB7fSkpO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xubGV0IF9yYWw7XG5mdW5jdGlvbiBSQUwoKSB7XG4gICAgaWYgKF9yYWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHJ1bnRpbWUgYWJzdHJhY3Rpb24gbGF5ZXIgaW5zdGFsbGVkYCk7XG4gICAgfVxuICAgIHJldHVybiBfcmFsO1xufVxuKGZ1bmN0aW9uIChSQUwpIHtcbiAgICBmdW5jdGlvbiBpbnN0YWxsKHJhbCkge1xuICAgICAgICBpZiAocmFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gcnVudGltZSBhYnN0cmFjdGlvbiBsYXllciBwcm92aWRlZGApO1xuICAgICAgICB9XG4gICAgICAgIF9yYWwgPSByYWw7XG4gICAgfVxuICAgIFJBTC5pbnN0YWxsID0gaW5zdGFsbDtcbn0pKFJBTCB8fCAoUkFMID0ge30pKTtcbmV4cG9ydHMuZGVmYXVsdCA9IFJBTDtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuRW1pdHRlciA9IGV4cG9ydHMuRXZlbnQgPSB2b2lkIDA7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbnZhciBFdmVudDtcbihmdW5jdGlvbiAoRXZlbnQpIHtcbiAgICBjb25zdCBfZGlzcG9zYWJsZSA9IHsgZGlzcG9zZSgpIHsgfSB9O1xuICAgIEV2ZW50Lk5vbmUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBfZGlzcG9zYWJsZTsgfTtcbn0pKEV2ZW50IHx8IChleHBvcnRzLkV2ZW50ID0gRXZlbnQgPSB7fSkpO1xuY2xhc3MgQ2FsbGJhY2tMaXN0IHtcbiAgICBhZGQoY2FsbGJhY2ssIGNvbnRleHQgPSBudWxsLCBidWNrZXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fY29udGV4dHMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgICAgIHRoaXMuX2NvbnRleHRzLnB1c2goY29udGV4dCk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGJ1Y2tldCkpIHtcbiAgICAgICAgICAgIGJ1Y2tldC5wdXNoKHsgZGlzcG9zZTogKCkgPT4gdGhpcy5yZW1vdmUoY2FsbGJhY2ssIGNvbnRleHQpIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlbW92ZShjYWxsYmFjaywgY29udGV4dCA9IG51bGwpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZm91bmRDYWxsYmFja1dpdGhEaWZmZXJlbnRDb250ZXh0ID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLl9jYWxsYmFja3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jYWxsYmFja3NbaV0gPT09IGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NvbnRleHRzW2ldID09PSBjb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrICYgY29udGV4dCBtYXRjaCA9PiByZW1vdmUgaXRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29udGV4dHMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZENhbGxiYWNrV2l0aERpZmZlcmVudENvbnRleHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZm91bmRDYWxsYmFja1dpdGhEaWZmZXJlbnRDb250ZXh0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1doZW4gYWRkaW5nIGEgbGlzdGVuZXIgd2l0aCBhIGNvbnRleHQsIHlvdSBzaG91bGQgcmVtb3ZlIGl0IHdpdGggdGhlIHNhbWUgY29udGV4dCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGludm9rZSguLi5hcmdzKSB7XG4gICAgICAgIGlmICghdGhpcy5fY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmV0ID0gW10sIGNhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcy5zbGljZSgwKSwgY29udGV4dHMgPSB0aGlzLl9jb250ZXh0cy5zbGljZSgwKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXQucHVzaChjYWxsYmFja3NbaV0uYXBwbHkoY29udGV4dHNbaV0sIGFyZ3MpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS5jb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICAgIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5fY2FsbGJhY2tzIHx8IHRoaXMuX2NhbGxiYWNrcy5sZW5ndGggPT09IDA7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fY29udGV4dHMgPSB1bmRlZmluZWQ7XG4gICAgfVxufVxuY2xhc3MgRW1pdHRlciB7XG4gICAgY29uc3RydWN0b3IoX29wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IF9vcHRpb25zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGb3IgdGhlIHB1YmxpYyB0byBhbGxvdyB0byBzdWJzY3JpYmVcbiAgICAgKiB0byBldmVudHMgZnJvbSB0aGlzIEVtaXR0ZXJcbiAgICAgKi9cbiAgICBnZXQgZXZlbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fZXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50ID0gKGxpc3RlbmVyLCB0aGlzQXJncywgZGlzcG9zYWJsZXMpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2NhbGxiYWNrcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWxsYmFja3MgPSBuZXcgQ2FsbGJhY2tMaXN0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMub25GaXJzdExpc3RlbmVyQWRkICYmIHRoaXMuX2NhbGxiYWNrcy5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy5vbkZpcnN0TGlzdGVuZXJBZGQodGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5hZGQobGlzdGVuZXIsIHRoaXNBcmdzKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlzcG9zYWJsZSBpcyBkaXNwb3NlZCBhZnRlciBlbWl0dGVyIGlzIGRpc3Bvc2VkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5yZW1vdmUobGlzdGVuZXIsIHRoaXNBcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5kaXNwb3NlID0gRW1pdHRlci5fbm9vcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMub25MYXN0TGlzdGVuZXJSZW1vdmUgJiYgdGhpcy5fY2FsbGJhY2tzLmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29wdGlvbnMub25MYXN0TGlzdGVuZXJSZW1vdmUodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRpc3Bvc2FibGVzKSkge1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlcy5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9ldmVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVG8gYmUga2VwdCBwcml2YXRlIHRvIGZpcmUgYW4gZXZlbnQgdG9cbiAgICAgKiBzdWJzY3JpYmVyc1xuICAgICAqL1xuICAgIGZpcmUoZXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NhbGxiYWNrcykge1xuICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzLmludm9rZS5jYWxsKHRoaXMuX2NhbGxiYWNrcywgZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5kaXNwb3NlKCk7XG4gICAgICAgICAgICB0aGlzLl9jYWxsYmFja3MgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLkVtaXR0ZXIgPSBFbWl0dGVyO1xuRW1pdHRlci5fbm9vcCA9IGZ1bmN0aW9uICgpIHsgfTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uVG9rZW4gPSB2b2lkIDA7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbmNvbnN0IElzID0gcmVxdWlyZShcIi4vaXNcIik7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCIuL2V2ZW50c1wiKTtcbnZhciBDYW5jZWxsYXRpb25Ub2tlbjtcbihmdW5jdGlvbiAoQ2FuY2VsbGF0aW9uVG9rZW4pIHtcbiAgICBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGlzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkOiBmYWxzZSxcbiAgICAgICAgb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6IGV2ZW50c18xLkV2ZW50Lk5vbmVcbiAgICB9KTtcbiAgICBDYW5jZWxsYXRpb25Ub2tlbi5DYW5jZWxsZWQgPSBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6IHRydWUsXG4gICAgICAgIG9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkOiBldmVudHNfMS5FdmVudC5Ob25lXG4gICAgfSk7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgKGNhbmRpZGF0ZSA9PT0gQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZVxuICAgICAgICAgICAgfHwgY2FuZGlkYXRlID09PSBDYW5jZWxsYXRpb25Ub2tlbi5DYW5jZWxsZWRcbiAgICAgICAgICAgIHx8IChJcy5ib29sZWFuKGNhbmRpZGF0ZS5pc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkgJiYgISFjYW5kaWRhdGUub25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQpKTtcbiAgICB9XG4gICAgQ2FuY2VsbGF0aW9uVG9rZW4uaXMgPSBpcztcbn0pKENhbmNlbGxhdGlvblRva2VuIHx8IChleHBvcnRzLkNhbmNlbGxhdGlvblRva2VuID0gQ2FuY2VsbGF0aW9uVG9rZW4gPSB7fSkpO1xuY29uc3Qgc2hvcnRjdXRFdmVudCA9IE9iamVjdC5mcmVlemUoZnVuY3Rpb24gKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgY29uc3QgaGFuZGxlID0gKDAsIHJhbF8xLmRlZmF1bHQpKCkudGltZXIuc2V0VGltZW91dChjYWxsYmFjay5iaW5kKGNvbnRleHQpLCAwKTtcbiAgICByZXR1cm4geyBkaXNwb3NlKCkgeyBoYW5kbGUuZGlzcG9zZSgpOyB9IH07XG59KTtcbmNsYXNzIE11dGFibGVUb2tlbiB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX2lzQ2FuY2VsbGVkID0gZmFsc2U7XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9pc0NhbmNlbGxlZCkge1xuICAgICAgICAgICAgdGhpcy5faXNDYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2VtaXR0ZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmZpcmUodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0NhbmNlbGxlZDtcbiAgICB9XG4gICAgZ2V0IG9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKCkge1xuICAgICAgICBpZiAodGhpcy5faXNDYW5jZWxsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBzaG9ydGN1dEV2ZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5fZW1pdHRlcikge1xuICAgICAgICAgICAgdGhpcy5fZW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2VtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLl9lbWl0dGVyKSB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5jbGFzcyBDYW5jZWxsYXRpb25Ub2tlblNvdXJjZSB7XG4gICAgZ2V0IHRva2VuKCkge1xuICAgICAgICBpZiAoIXRoaXMuX3Rva2VuKSB7XG4gICAgICAgICAgICAvLyBiZSBsYXp5IGFuZCBjcmVhdGUgdGhlIHRva2VuIG9ubHkgd2hlblxuICAgICAgICAgICAgLy8gYWN0dWFsbHkgbmVlZGVkXG4gICAgICAgICAgICB0aGlzLl90b2tlbiA9IG5ldyBNdXRhYmxlVG9rZW4oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fdG9rZW47XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl90b2tlbikge1xuICAgICAgICAgICAgLy8gc2F2ZSBhbiBvYmplY3QgYnkgcmV0dXJuaW5nIHRoZSBkZWZhdWx0XG4gICAgICAgICAgICAvLyBjYW5jZWxsZWQgdG9rZW4gd2hlbiBjYW5jZWxsYXRpb24gaGFwcGVuc1xuICAgICAgICAgICAgLy8gYmVmb3JlIHNvbWVvbmUgYXNrcyBmb3IgdGhlIHRva2VuXG4gICAgICAgICAgICB0aGlzLl90b2tlbiA9IENhbmNlbGxhdGlvblRva2VuLkNhbmNlbGxlZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3Rva2VuLmNhbmNlbCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICghdGhpcy5fdG9rZW4pIHtcbiAgICAgICAgICAgIC8vIGVuc3VyZSB0byBpbml0aWFsaXplIHdpdGggYW4gZW1wdHkgdG9rZW4gaWYgd2UgaGFkIG5vbmVcbiAgICAgICAgICAgIHRoaXMuX3Rva2VuID0gQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLl90b2tlbiBpbnN0YW5jZW9mIE11dGFibGVUb2tlbikge1xuICAgICAgICAgICAgLy8gYWN0dWFsbHkgZGlzcG9zZVxuICAgICAgICAgICAgdGhpcy5fdG9rZW4uZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IENhbmNlbGxhdGlvblRva2VuU291cmNlO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3kgPSB2b2lkIDA7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbnZhciBDYW5jZWxsYXRpb25TdGF0ZTtcbihmdW5jdGlvbiAoQ2FuY2VsbGF0aW9uU3RhdGUpIHtcbiAgICBDYW5jZWxsYXRpb25TdGF0ZS5Db250aW51ZSA9IDA7XG4gICAgQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkID0gMTtcbn0pKENhbmNlbGxhdGlvblN0YXRlIHx8IChDYW5jZWxsYXRpb25TdGF0ZSA9IHt9KSk7XG5jbGFzcyBTaGFyZWRBcnJheVNlbmRlclN0cmF0ZWd5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5idWZmZXJzID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICBlbmFibGVDYW5jZWxsYXRpb24ocmVxdWVzdCkge1xuICAgICAgICBpZiAocmVxdWVzdC5pZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBTaGFyZWRBcnJheUJ1ZmZlcig0KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBJbnQzMkFycmF5KGJ1ZmZlciwgMCwgMSk7XG4gICAgICAgIGRhdGFbMF0gPSBDYW5jZWxsYXRpb25TdGF0ZS5Db250aW51ZTtcbiAgICAgICAgdGhpcy5idWZmZXJzLnNldChyZXF1ZXN0LmlkLCBidWZmZXIpO1xuICAgICAgICByZXF1ZXN0LiRjYW5jZWxsYXRpb25EYXRhID0gYnVmZmVyO1xuICAgIH1cbiAgICBhc3luYyBzZW5kQ2FuY2VsbGF0aW9uKF9jb25uLCBpZCkge1xuICAgICAgICBjb25zdCBidWZmZXIgPSB0aGlzLmJ1ZmZlcnMuZ2V0KGlkKTtcbiAgICAgICAgaWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBJbnQzMkFycmF5KGJ1ZmZlciwgMCwgMSk7XG4gICAgICAgIEF0b21pY3Muc3RvcmUoZGF0YSwgMCwgQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkKTtcbiAgICB9XG4gICAgY2xlYW51cChpZCkge1xuICAgICAgICB0aGlzLmJ1ZmZlcnMuZGVsZXRlKGlkKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy5idWZmZXJzLmNsZWFyKCk7XG4gICAgfVxufVxuZXhwb3J0cy5TaGFyZWRBcnJheVNlbmRlclN0cmF0ZWd5ID0gU2hhcmVkQXJyYXlTZW5kZXJTdHJhdGVneTtcbmNsYXNzIFNoYXJlZEFycmF5QnVmZmVyQ2FuY2VsbGF0aW9uVG9rZW4ge1xuICAgIGNvbnN0cnVjdG9yKGJ1ZmZlcikge1xuICAgICAgICB0aGlzLmRhdGEgPSBuZXcgSW50MzJBcnJheShidWZmZXIsIDAsIDEpO1xuICAgIH1cbiAgICBnZXQgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHJldHVybiBBdG9taWNzLmxvYWQodGhpcy5kYXRhLCAwKSA9PT0gQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkO1xuICAgIH1cbiAgICBnZXQgb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuY2VsbGF0aW9uIG92ZXIgU2hhcmVkQXJyYXlCdWZmZXIgZG9lc24ndCBzdXBwb3J0IGNhbmNlbGxhdGlvbiBldmVudHNgKTtcbiAgICB9XG59XG5jbGFzcyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuU291cmNlIHtcbiAgICBjb25zdHJ1Y3RvcihidWZmZXIpIHtcbiAgICAgICAgdGhpcy50b2tlbiA9IG5ldyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuKGJ1ZmZlcik7XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICB9XG59XG5jbGFzcyBTaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmtpbmQgPSAncmVxdWVzdCc7XG4gICAgfVxuICAgIGNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKHJlcXVlc3QpIHtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gcmVxdWVzdC4kY2FuY2VsbGF0aW9uRGF0YTtcbiAgICAgICAgaWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuU291cmNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuU291cmNlKGJ1ZmZlcik7XG4gICAgfVxufVxuZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBTaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3k7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNlbWFwaG9yZSA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY2xhc3MgU2VtYXBob3JlIHtcbiAgICBjb25zdHJ1Y3RvcihjYXBhY2l0eSA9IDEpIHtcbiAgICAgICAgaWYgKGNhcGFjaXR5IDw9IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FwYWNpdHkgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NhcGFjaXR5ID0gY2FwYWNpdHk7XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IDA7XG4gICAgICAgIHRoaXMuX3dhaXRpbmcgPSBbXTtcbiAgICB9XG4gICAgbG9jayh0aHVuaykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fd2FpdGluZy5wdXNoKHsgdGh1bmssIHJlc29sdmUsIHJlamVjdCB9KTtcbiAgICAgICAgICAgIHRoaXMucnVuTmV4dCgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0IGFjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTtcbiAgICB9XG4gICAgcnVuTmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dhaXRpbmcubGVuZ3RoID09PSAwIHx8IHRoaXMuX2FjdGl2ZSA9PT0gdGhpcy5fY2FwYWNpdHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS50aW1lci5zZXRJbW1lZGlhdGUoKCkgPT4gdGhpcy5kb1J1bk5leHQoKSk7XG4gICAgfVxuICAgIGRvUnVuTmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dhaXRpbmcubGVuZ3RoID09PSAwIHx8IHRoaXMuX2FjdGl2ZSA9PT0gdGhpcy5fY2FwYWNpdHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5fd2FpdGluZy5zaGlmdCgpO1xuICAgICAgICB0aGlzLl9hY3RpdmUrKztcbiAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZSA+IHRoaXMuX2NhcGFjaXR5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRvIG1hbnkgdGh1bmtzIGFjdGl2ZWApO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXh0LnRodW5rKCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC50aGVuKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5yZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5OZXh0KCk7XG4gICAgICAgICAgICAgICAgfSwgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5yZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5OZXh0KCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICBuZXh0LnJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1bk5leHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgIG5leHQucmVqZWN0KGVycik7XG4gICAgICAgICAgICB0aGlzLnJ1bk5leHQoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuU2VtYXBob3JlID0gU2VtYXBob3JlO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXIgPSBleHBvcnRzLkFic3RyYWN0TWVzc2FnZVJlYWRlciA9IGV4cG9ydHMuTWVzc2FnZVJlYWRlciA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IGV2ZW50c18xID0gcmVxdWlyZShcIi4vZXZlbnRzXCIpO1xuY29uc3Qgc2VtYXBob3JlXzEgPSByZXF1aXJlKFwiLi9zZW1hcGhvcmVcIik7XG52YXIgTWVzc2FnZVJlYWRlcjtcbihmdW5jdGlvbiAoTWVzc2FnZVJlYWRlcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5saXN0ZW4pICYmIElzLmZ1bmMoY2FuZGlkYXRlLmRpc3Bvc2UpICYmXG4gICAgICAgICAgICBJcy5mdW5jKGNhbmRpZGF0ZS5vbkVycm9yKSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5vbkNsb3NlKSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5vblBhcnRpYWxNZXNzYWdlKTtcbiAgICB9XG4gICAgTWVzc2FnZVJlYWRlci5pcyA9IGlzO1xufSkoTWVzc2FnZVJlYWRlciB8fCAoZXhwb3J0cy5NZXNzYWdlUmVhZGVyID0gTWVzc2FnZVJlYWRlciA9IHt9KSk7XG5jbGFzcyBBYnN0cmFjdE1lc3NhZ2VSZWFkZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZUVtaXR0ZXIgPSBuZXcgZXZlbnRzXzEuRW1pdHRlcigpO1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlci5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgZ2V0IG9uRXJyb3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVycm9yRW1pdHRlci5ldmVudDtcbiAgICB9XG4gICAgZmlyZUVycm9yKGVycm9yKSB7XG4gICAgICAgIHRoaXMuZXJyb3JFbWl0dGVyLmZpcmUodGhpcy5hc0Vycm9yKGVycm9yKSk7XG4gICAgfVxuICAgIGdldCBvbkNsb3NlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9zZUVtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGZpcmVDbG9zZSgpIHtcbiAgICAgICAgdGhpcy5jbG9zZUVtaXR0ZXIuZmlyZSh1bmRlZmluZWQpO1xuICAgIH1cbiAgICBnZXQgb25QYXJ0aWFsTWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFydGlhbE1lc3NhZ2VFbWl0dGVyLmV2ZW50O1xuICAgIH1cbiAgICBmaXJlUGFydGlhbE1lc3NhZ2UoaW5mbykge1xuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlRW1pdHRlci5maXJlKGluZm8pO1xuICAgIH1cbiAgICBhc0Vycm9yKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKGBSZWFkZXIgcmVjZWl2ZWQgZXJyb3IuIFJlYXNvbjogJHtJcy5zdHJpbmcoZXJyb3IubWVzc2FnZSkgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24nfWApO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VSZWFkZXIgPSBBYnN0cmFjdE1lc3NhZ2VSZWFkZXI7XG52YXIgUmVzb2x2ZWRNZXNzYWdlUmVhZGVyT3B0aW9ucztcbihmdW5jdGlvbiAoUmVzb2x2ZWRNZXNzYWdlUmVhZGVyT3B0aW9ucykge1xuICAgIGZ1bmN0aW9uIGZyb21PcHRpb25zKG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IGNoYXJzZXQ7XG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIGxldCBjb250ZW50RGVjb2RlcjtcbiAgICAgICAgY29uc3QgY29udGVudERlY29kZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICBsZXQgY29udGVudFR5cGVEZWNvZGVyO1xuICAgICAgICBjb25zdCBjb250ZW50VHlwZURlY29kZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY2hhcnNldCA9IG9wdGlvbnMgPz8gJ3V0Zi04JztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNoYXJzZXQgPSBvcHRpb25zLmNoYXJzZXQgPz8gJ3V0Zi04JztcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnREZWNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50RGVjb2RlciA9IG9wdGlvbnMuY29udGVudERlY29kZXI7XG4gICAgICAgICAgICAgICAgY29udGVudERlY29kZXJzLnNldChjb250ZW50RGVjb2Rlci5uYW1lLCBjb250ZW50RGVjb2Rlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5jb250ZW50RGVjb2RlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGVjb2RlciBvZiBvcHRpb25zLmNvbnRlbnREZWNvZGVycykge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50RGVjb2RlcnMuc2V0KGRlY29kZXIubmFtZSwgZGVjb2Rlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuY29udGVudFR5cGVEZWNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXIgPSBvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcjtcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXJzLnNldChjb250ZW50VHlwZURlY29kZXIubmFtZSwgY29udGVudFR5cGVEZWNvZGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGVjb2RlciBvZiBvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGVEZWNvZGVycy5zZXQoZGVjb2Rlci5uYW1lLCBkZWNvZGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnRlbnRUeXBlRGVjb2RlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXIgPSAoMCwgcmFsXzEuZGVmYXVsdCkoKS5hcHBsaWNhdGlvbkpzb24uZGVjb2RlcjtcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlRGVjb2RlcnMuc2V0KGNvbnRlbnRUeXBlRGVjb2Rlci5uYW1lLCBjb250ZW50VHlwZURlY29kZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGNoYXJzZXQsIGNvbnRlbnREZWNvZGVyLCBjb250ZW50RGVjb2RlcnMsIGNvbnRlbnRUeXBlRGVjb2RlciwgY29udGVudFR5cGVEZWNvZGVycyB9O1xuICAgIH1cbiAgICBSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zLmZyb21PcHRpb25zID0gZnJvbU9wdGlvbnM7XG59KShSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zIHx8IChSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zID0ge30pKTtcbmNsYXNzIFJlYWRhYmxlU3RyZWFtTWVzc2FnZVJlYWRlciBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVJlYWRlciB7XG4gICAgY29uc3RydWN0b3IocmVhZGFibGUsIG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZSA9IHJlYWRhYmxlO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zLmZyb21PcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmJ1ZmZlciA9ICgwLCByYWxfMS5kZWZhdWx0KSgpLm1lc3NhZ2VCdWZmZXIuY3JlYXRlKHRoaXMub3B0aW9ucy5jaGFyc2V0KTtcbiAgICAgICAgdGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0ID0gMTAwMDA7XG4gICAgICAgIHRoaXMubmV4dE1lc3NhZ2VMZW5ndGggPSAtMTtcbiAgICAgICAgdGhpcy5tZXNzYWdlVG9rZW4gPSAwO1xuICAgICAgICB0aGlzLnJlYWRTZW1hcGhvcmUgPSBuZXcgc2VtYXBob3JlXzEuU2VtYXBob3JlKDEpO1xuICAgIH1cbiAgICBzZXQgcGFydGlhbE1lc3NhZ2VUaW1lb3V0KHRpbWVvdXQpIHtcbiAgICAgICAgdGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0ID0gdGltZW91dDtcbiAgICB9XG4gICAgZ2V0IHBhcnRpYWxNZXNzYWdlVGltZW91dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dDtcbiAgICB9XG4gICAgbGlzdGVuKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMubmV4dE1lc3NhZ2VMZW5ndGggPSAtMTtcbiAgICAgICAgdGhpcy5tZXNzYWdlVG9rZW4gPSAwO1xuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlVGltZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5yZWFkYWJsZS5vbkRhdGEoKGRhdGEpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25EYXRhKGRhdGEpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZS5vbkVycm9yKChlcnJvcikgPT4gdGhpcy5maXJlRXJyb3IoZXJyb3IpKTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZS5vbkNsb3NlKCgpID0+IHRoaXMuZmlyZUNsb3NlKCkpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBvbkRhdGEoZGF0YSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5idWZmZXIuYXBwZW5kKGRhdGEpO1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IHRoaXMuYnVmZmVyLnRyeVJlYWRIZWFkZXJzKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50TGVuZ3RoID0gaGVhZGVycy5nZXQoJ2NvbnRlbnQtbGVuZ3RoJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY29udGVudExlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IobmV3IEVycm9yKGBIZWFkZXIgbXVzdCBwcm92aWRlIGEgQ29udGVudC1MZW5ndGggcHJvcGVydHkuXFxuJHtKU09OLnN0cmluZ2lmeShPYmplY3QuZnJvbUVudHJpZXMoaGVhZGVycykpfWApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsZW5ndGggPSBwYXJzZUludChjb250ZW50TGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKGxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKG5ldyBFcnJvcihgQ29udGVudC1MZW5ndGggdmFsdWUgbXVzdCBiZSBhIG51bWJlci4gR290ICR7Y29udGVudExlbmd0aH1gKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IHRoaXMuYnVmZmVyLnRyeVJlYWRCb2R5KHRoaXMubmV4dE1lc3NhZ2VMZW5ndGgpO1xuICAgICAgICAgICAgICAgIGlmIChib2R5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLyoqIFdlIGhhdmVuJ3QgcmVjZWl2ZWQgdGhlIGZ1bGwgbWVzc2FnZSB5ZXQuICovXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0UGFydGlhbE1lc3NhZ2VUaW1lcigpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJQYXJ0aWFsTWVzc2FnZVRpbWVyKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9IC0xO1xuICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHdlIGNvbnZlcnQgb25lIHJlY2VpdmVkIG1lc3NhZ2UgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAgICAgLy8gb3RoZXIuIE90aGVyd2lzZSBpdCBjb3VsZCBoYXBwZW4gdGhhdCBhIGRlY29kaW5nIG9mIGEgc2Vjb25kXG4gICAgICAgICAgICAgICAgLy8gc21hbGxlciBtZXNzYWdlIGZpbmlzaGVkIGJlZm9yZSB0aGUgZGVjb2Rpbmcgb2YgYSBmaXJzdCBsYXJnZXJcbiAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIGFuZCB0aGVuIHdlIHdvdWxkIGRlbGl2ZXIgdGhlIHNlY29uZCBtZXNzYWdlIGZpcnN0LlxuICAgICAgICAgICAgICAgIHRoaXMucmVhZFNlbWFwaG9yZS5sb2NrKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnl0ZXMgPSB0aGlzLm9wdGlvbnMuY29udGVudERlY29kZXIgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBhd2FpdCB0aGlzLm9wdGlvbnMuY29udGVudERlY29kZXIuZGVjb2RlKGJvZHkpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGJvZHk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBhd2FpdCB0aGlzLm9wdGlvbnMuY29udGVudFR5cGVEZWNvZGVyLmRlY29kZShieXRlcywgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjayhtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNsZWFyUGFydGlhbE1lc3NhZ2VUaW1lcigpIHtcbiAgICAgICAgaWYgKHRoaXMucGFydGlhbE1lc3NhZ2VUaW1lcikge1xuICAgICAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZVRpbWVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRoaXMucGFydGlhbE1lc3NhZ2VUaW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRQYXJ0aWFsTWVzc2FnZVRpbWVyKCkge1xuICAgICAgICB0aGlzLmNsZWFyUGFydGlhbE1lc3NhZ2VUaW1lcigpO1xuICAgICAgICBpZiAodGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0IDw9IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlVGltZXIgPSAoMCwgcmFsXzEuZGVmYXVsdCkoKS50aW1lci5zZXRUaW1lb3V0KCh0b2tlbiwgdGltZW91dCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZVRpbWVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRva2VuID09PSB0aGlzLm1lc3NhZ2VUb2tlbikge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZVBhcnRpYWxNZXNzYWdlKHsgbWVzc2FnZVRva2VuOiB0b2tlbiwgd2FpdGluZ1RpbWU6IHRpbWVvdXQgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRQYXJ0aWFsTWVzc2FnZVRpbWVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dCwgdGhpcy5tZXNzYWdlVG9rZW4sIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dCk7XG4gICAgfVxufVxuZXhwb3J0cy5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXIgPSBSZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLldyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLkFic3RyYWN0TWVzc2FnZVdyaXRlciA9IGV4cG9ydHMuTWVzc2FnZVdyaXRlciA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IHNlbWFwaG9yZV8xID0gcmVxdWlyZShcIi4vc2VtYXBob3JlXCIpO1xuY29uc3QgZXZlbnRzXzEgPSByZXF1aXJlKFwiLi9ldmVudHNcIik7XG5jb25zdCBDb250ZW50TGVuZ3RoID0gJ0NvbnRlbnQtTGVuZ3RoOiAnO1xuY29uc3QgQ1JMRiA9ICdcXHJcXG4nO1xudmFyIE1lc3NhZ2VXcml0ZXI7XG4oZnVuY3Rpb24gKE1lc3NhZ2VXcml0ZXIpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgSXMuZnVuYyhjYW5kaWRhdGUuZGlzcG9zZSkgJiYgSXMuZnVuYyhjYW5kaWRhdGUub25DbG9zZSkgJiZcbiAgICAgICAgICAgIElzLmZ1bmMoY2FuZGlkYXRlLm9uRXJyb3IpICYmIElzLmZ1bmMoY2FuZGlkYXRlLndyaXRlKTtcbiAgICB9XG4gICAgTWVzc2FnZVdyaXRlci5pcyA9IGlzO1xufSkoTWVzc2FnZVdyaXRlciB8fCAoZXhwb3J0cy5NZXNzYWdlV3JpdGVyID0gTWVzc2FnZVdyaXRlciA9IHt9KSk7XG5jbGFzcyBBYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy5lcnJvckVtaXR0ZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLmNsb3NlRW1pdHRlci5kaXNwb3NlKCk7XG4gICAgfVxuICAgIGdldCBvbkVycm9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lcnJvckVtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGZpcmVFcnJvcihlcnJvciwgbWVzc2FnZSwgY291bnQpIHtcbiAgICAgICAgdGhpcy5lcnJvckVtaXR0ZXIuZmlyZShbdGhpcy5hc0Vycm9yKGVycm9yKSwgbWVzc2FnZSwgY291bnRdKTtcbiAgICB9XG4gICAgZ2V0IG9uQ2xvc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb3NlRW1pdHRlci5ldmVudDtcbiAgICB9XG4gICAgZmlyZUNsb3NlKCkge1xuICAgICAgICB0aGlzLmNsb3NlRW1pdHRlci5maXJlKHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIGFzRXJyb3IoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoYFdyaXRlciByZWNlaXZlZCBlcnJvci4gUmVhc29uOiAke0lzLnN0cmluZyhlcnJvci5tZXNzYWdlKSA/IGVycm9yLm1lc3NhZ2UgOiAndW5rbm93bid9YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLkFic3RyYWN0TWVzc2FnZVdyaXRlciA9IEFic3RyYWN0TWVzc2FnZVdyaXRlcjtcbnZhciBSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zO1xuKGZ1bmN0aW9uIChSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zKSB7XG4gICAgZnVuY3Rpb24gZnJvbU9wdGlvbnMob3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHsgY2hhcnNldDogb3B0aW9ucyA/PyAndXRmLTgnLCBjb250ZW50VHlwZUVuY29kZXI6ICgwLCByYWxfMS5kZWZhdWx0KSgpLmFwcGxpY2F0aW9uSnNvbi5lbmNvZGVyIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4geyBjaGFyc2V0OiBvcHRpb25zLmNoYXJzZXQgPz8gJ3V0Zi04JywgY29udGVudEVuY29kZXI6IG9wdGlvbnMuY29udGVudEVuY29kZXIsIGNvbnRlbnRUeXBlRW5jb2Rlcjogb3B0aW9ucy5jb250ZW50VHlwZUVuY29kZXIgPz8gKDAsIHJhbF8xLmRlZmF1bHQpKCkuYXBwbGljYXRpb25Kc29uLmVuY29kZXIgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zLmZyb21PcHRpb25zID0gZnJvbU9wdGlvbnM7XG59KShSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zIHx8IChSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zID0ge30pKTtcbmNsYXNzIFdyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKHdyaXRhYmxlLCBvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMud3JpdGFibGUgPSB3cml0YWJsZTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gUmVzb2x2ZWRNZXNzYWdlV3JpdGVyT3B0aW9ucy5mcm9tT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50ID0gMDtcbiAgICAgICAgdGhpcy53cml0ZVNlbWFwaG9yZSA9IG5ldyBzZW1hcGhvcmVfMS5TZW1hcGhvcmUoMSk7XG4gICAgICAgIHRoaXMud3JpdGFibGUub25FcnJvcigoZXJyb3IpID0+IHRoaXMuZmlyZUVycm9yKGVycm9yKSk7XG4gICAgICAgIHRoaXMud3JpdGFibGUub25DbG9zZSgoKSA9PiB0aGlzLmZpcmVDbG9zZSgpKTtcbiAgICB9XG4gICAgYXN5bmMgd3JpdGUobXNnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndyaXRlU2VtYXBob3JlLmxvY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHRoaXMub3B0aW9ucy5jb250ZW50VHlwZUVuY29kZXIuZW5jb2RlKG1zZywgdGhpcy5vcHRpb25zKS50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNvbnRlbnRFbmNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jb250ZW50RW5jb2Rlci5lbmNvZGUoYnVmZmVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZC50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJzID0gW107XG4gICAgICAgICAgICAgICAgaGVhZGVycy5wdXNoKENvbnRlbnRMZW5ndGgsIGJ1ZmZlci5ieXRlTGVuZ3RoLnRvU3RyaW5nKCksIENSTEYpO1xuICAgICAgICAgICAgICAgIGhlYWRlcnMucHVzaChDUkxGKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kb1dyaXRlKG1zZywgaGVhZGVycywgYnVmZmVyKTtcbiAgICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgZG9Xcml0ZShtc2csIGhlYWRlcnMsIGRhdGEpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMud3JpdGFibGUud3JpdGUoaGVhZGVycy5qb2luKCcnKSwgJ2FzY2lpJyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy53cml0YWJsZS53cml0ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IsIG1zZyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZUVycm9yKGVycm9yLCBtc2cpIHtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50Kys7XG4gICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yLCBtc2csIHRoaXMuZXJyb3JDb3VudCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICAgICAgdGhpcy53cml0YWJsZS5lbmQoKTtcbiAgICB9XG59XG5leHBvcnRzLldyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgPSBXcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkFic3RyYWN0TWVzc2FnZUJ1ZmZlciA9IHZvaWQgMDtcbmNvbnN0IENSID0gMTM7XG5jb25zdCBMRiA9IDEwO1xuY29uc3QgQ1JMRiA9ICdcXHJcXG4nO1xuY2xhc3MgQWJzdHJhY3RNZXNzYWdlQnVmZmVyIHtcbiAgICBjb25zdHJ1Y3RvcihlbmNvZGluZyA9ICd1dGYtOCcpIHtcbiAgICAgICAgdGhpcy5fZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgICAgICAgdGhpcy5fY2h1bmtzID0gW107XG4gICAgICAgIHRoaXMuX3RvdGFsTGVuZ3RoID0gMDtcbiAgICB9XG4gICAgZ2V0IGVuY29kaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW5jb2Rpbmc7XG4gICAgfVxuICAgIGFwcGVuZChjaHVuaykge1xuICAgICAgICBjb25zdCB0b0FwcGVuZCA9IHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZycgPyB0aGlzLmZyb21TdHJpbmcoY2h1bmssIHRoaXMuX2VuY29kaW5nKSA6IGNodW5rO1xuICAgICAgICB0aGlzLl9jaHVua3MucHVzaCh0b0FwcGVuZCk7XG4gICAgICAgIHRoaXMuX3RvdGFsTGVuZ3RoICs9IHRvQXBwZW5kLmJ5dGVMZW5ndGg7XG4gICAgfVxuICAgIHRyeVJlYWRIZWFkZXJzKGxvd2VyQ2FzZUtleXMgPSBmYWxzZSkge1xuICAgICAgICBpZiAodGhpcy5fY2h1bmtzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3RhdGUgPSAwO1xuICAgICAgICBsZXQgY2h1bmtJbmRleCA9IDA7XG4gICAgICAgIGxldCBvZmZzZXQgPSAwO1xuICAgICAgICBsZXQgY2h1bmtCeXRlc1JlYWQgPSAwO1xuICAgICAgICByb3c6IHdoaWxlIChjaHVua0luZGV4IDwgdGhpcy5fY2h1bmtzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgY2h1bmsgPSB0aGlzLl9jaHVua3NbY2h1bmtJbmRleF07XG4gICAgICAgICAgICBvZmZzZXQgPSAwO1xuICAgICAgICAgICAgY29sdW1uOiB3aGlsZSAob2Zmc2V0IDwgY2h1bmsubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjaHVua1tvZmZzZXRdO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDUjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIExGOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gNDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHJvdztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjaHVua0J5dGVzUmVhZCArPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgY2h1bmtJbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZSAhPT0gNCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgYnVmZmVyIGNvbnRhaW5zIHRoZSB0d28gQ1JMRiBhdCB0aGUgZW5kLiBTbyB3ZSB3aWxsXG4gICAgICAgIC8vIGhhdmUgdHdvIGVtcHR5IGxpbmVzIGFmdGVyIHRoZSBzcGxpdCBhdCB0aGUgZW5kIGFzIHdlbGwuXG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuX3JlYWQoY2h1bmtCeXRlc1JlYWQgKyBvZmZzZXQpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwKCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLnRvU3RyaW5nKGJ1ZmZlciwgJ2FzY2lpJykuc3BsaXQoQ1JMRik7XG4gICAgICAgIGlmIChoZWFkZXJzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXJzLmxlbmd0aCAtIDI7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaGVhZGVyID0gaGVhZGVyc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gaGVhZGVyLmluZGV4T2YoJzonKTtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1lc3NhZ2UgaGVhZGVyIG11c3Qgc2VwYXJhdGUga2V5IGFuZCB2YWx1ZSB1c2luZyAnOidcXG4ke2hlYWRlcn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGhlYWRlci5zdWJzdHIoMCwgaW5kZXgpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBoZWFkZXIuc3Vic3RyKGluZGV4ICsgMSkudHJpbSgpO1xuICAgICAgICAgICAgcmVzdWx0LnNldChsb3dlckNhc2VLZXlzID8ga2V5LnRvTG93ZXJDYXNlKCkgOiBrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICB0cnlSZWFkQm9keShsZW5ndGgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3RvdGFsTGVuZ3RoIDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkKGxlbmd0aCk7XG4gICAgfVxuICAgIGdldCBudW1iZXJPZkJ5dGVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdG90YWxMZW5ndGg7XG4gICAgfVxuICAgIF9yZWFkKGJ5dGVDb3VudCkge1xuICAgICAgICBpZiAoYnl0ZUNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbXB0eUJ1ZmZlcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChieXRlQ291bnQgPiB0aGlzLl90b3RhbExlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVhZCBzbyBtYW55IGJ5dGVzIWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jaHVua3NbMF0uYnl0ZUxlbmd0aCA9PT0gYnl0ZUNvdW50KSB7XG4gICAgICAgICAgICAvLyBzdXBlciBmYXN0IHBhdGgsIHByZWNpc2VseSBmaXJzdCBjaHVuayBtdXN0IGJlIHJldHVybmVkXG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1swXTtcbiAgICAgICAgICAgIHRoaXMuX2NodW5rcy5zaGlmdCgpO1xuICAgICAgICAgICAgdGhpcy5fdG90YWxMZW5ndGggLT0gYnl0ZUNvdW50O1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXNOYXRpdmUoY2h1bmspO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jaHVua3NbMF0uYnl0ZUxlbmd0aCA+IGJ5dGVDb3VudCkge1xuICAgICAgICAgICAgLy8gZmFzdCBwYXRoLCB0aGUgcmVhZGluZyBpcyBlbnRpcmVseSB3aXRoaW4gdGhlIGZpcnN0IGNodW5rXG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1swXTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuYXNOYXRpdmUoY2h1bmssIGJ5dGVDb3VudCk7XG4gICAgICAgICAgICB0aGlzLl9jaHVua3NbMF0gPSBjaHVuay5zbGljZShieXRlQ291bnQpO1xuICAgICAgICAgICAgdGhpcy5fdG90YWxMZW5ndGggLT0gYnl0ZUNvdW50O1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmFsbG9jTmF0aXZlKGJ5dGVDb3VudCk7XG4gICAgICAgIGxldCByZXN1bHRPZmZzZXQgPSAwO1xuICAgICAgICBsZXQgY2h1bmtJbmRleCA9IDA7XG4gICAgICAgIHdoaWxlIChieXRlQ291bnQgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1tjaHVua0luZGV4XTtcbiAgICAgICAgICAgIGlmIChjaHVuay5ieXRlTGVuZ3RoID4gYnl0ZUNvdW50KSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBjaHVuayB3aWxsIHN1cnZpdmVcbiAgICAgICAgICAgICAgICBjb25zdCBjaHVua1BhcnQgPSBjaHVuay5zbGljZSgwLCBieXRlQ291bnQpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5zZXQoY2h1bmtQYXJ0LCByZXN1bHRPZmZzZXQpO1xuICAgICAgICAgICAgICAgIHJlc3VsdE9mZnNldCArPSBieXRlQ291bnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2h1bmtzW2NodW5rSW5kZXhdID0gY2h1bmsuc2xpY2UoYnl0ZUNvdW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLl90b3RhbExlbmd0aCAtPSBieXRlQ291bnQ7XG4gICAgICAgICAgICAgICAgYnl0ZUNvdW50IC09IGJ5dGVDb3VudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHRoaXMgY2h1bmsgd2lsbCBiZSBlbnRpcmVseSByZWFkXG4gICAgICAgICAgICAgICAgcmVzdWx0LnNldChjaHVuaywgcmVzdWx0T2Zmc2V0KTtcbiAgICAgICAgICAgICAgICByZXN1bHRPZmZzZXQgKz0gY2h1bmsuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgICAgICB0aGlzLl9jaHVua3Muc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl90b3RhbExlbmd0aCAtPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgICAgIGJ5dGVDb3VudCAtPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VCdWZmZXIgPSBBYnN0cmFjdE1lc3NhZ2VCdWZmZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uID0gZXhwb3J0cy5Db25uZWN0aW9uT3B0aW9ucyA9IGV4cG9ydHMuTWVzc2FnZVN0cmF0ZWd5ID0gZXhwb3J0cy5DYW5jZWxsYXRpb25TdHJhdGVneSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gZXhwb3J0cy5JZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IGV4cG9ydHMuQ29ubmVjdGlvbkVycm9yID0gZXhwb3J0cy5Db25uZWN0aW9uRXJyb3JzID0gZXhwb3J0cy5Mb2dUcmFjZU5vdGlmaWNhdGlvbiA9IGV4cG9ydHMuU2V0VHJhY2VOb3RpZmljYXRpb24gPSBleHBvcnRzLlRyYWNlRm9ybWF0ID0gZXhwb3J0cy5UcmFjZVZhbHVlcyA9IGV4cG9ydHMuVHJhY2UgPSBleHBvcnRzLk51bGxMb2dnZXIgPSBleHBvcnRzLlByb2dyZXNzVHlwZSA9IGV4cG9ydHMuUHJvZ3Jlc3NUb2tlbiA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IG1lc3NhZ2VzXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlc1wiKTtcbmNvbnN0IGxpbmtlZE1hcF8xID0gcmVxdWlyZShcIi4vbGlua2VkTWFwXCIpO1xuY29uc3QgZXZlbnRzXzEgPSByZXF1aXJlKFwiLi9ldmVudHNcIik7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbnZhciBDYW5jZWxOb3RpZmljYXRpb247XG4oZnVuY3Rpb24gKENhbmNlbE5vdGlmaWNhdGlvbikge1xuICAgIENhbmNlbE5vdGlmaWNhdGlvbi50eXBlID0gbmV3IG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZSgnJC9jYW5jZWxSZXF1ZXN0Jyk7XG59KShDYW5jZWxOb3RpZmljYXRpb24gfHwgKENhbmNlbE5vdGlmaWNhdGlvbiA9IHt9KSk7XG52YXIgUHJvZ3Jlc3NUb2tlbjtcbihmdW5jdGlvbiAoUHJvZ3Jlc3NUb2tlbikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG4gICAgfVxuICAgIFByb2dyZXNzVG9rZW4uaXMgPSBpcztcbn0pKFByb2dyZXNzVG9rZW4gfHwgKGV4cG9ydHMuUHJvZ3Jlc3NUb2tlbiA9IFByb2dyZXNzVG9rZW4gPSB7fSkpO1xudmFyIFByb2dyZXNzTm90aWZpY2F0aW9uO1xuKGZ1bmN0aW9uIChQcm9ncmVzc05vdGlmaWNhdGlvbikge1xuICAgIFByb2dyZXNzTm90aWZpY2F0aW9uLnR5cGUgPSBuZXcgbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlKCckL3Byb2dyZXNzJyk7XG59KShQcm9ncmVzc05vdGlmaWNhdGlvbiB8fCAoUHJvZ3Jlc3NOb3RpZmljYXRpb24gPSB7fSkpO1xuY2xhc3MgUHJvZ3Jlc3NUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICB9XG59XG5leHBvcnRzLlByb2dyZXNzVHlwZSA9IFByb2dyZXNzVHlwZTtcbnZhciBTdGFyUmVxdWVzdEhhbmRsZXI7XG4oZnVuY3Rpb24gKFN0YXJSZXF1ZXN0SGFuZGxlcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBJcy5mdW5jKHZhbHVlKTtcbiAgICB9XG4gICAgU3RhclJlcXVlc3RIYW5kbGVyLmlzID0gaXM7XG59KShTdGFyUmVxdWVzdEhhbmRsZXIgfHwgKFN0YXJSZXF1ZXN0SGFuZGxlciA9IHt9KSk7XG5leHBvcnRzLk51bGxMb2dnZXIgPSBPYmplY3QuZnJlZXplKHtcbiAgICBlcnJvcjogKCkgPT4geyB9LFxuICAgIHdhcm46ICgpID0+IHsgfSxcbiAgICBpbmZvOiAoKSA9PiB7IH0sXG4gICAgbG9nOiAoKSA9PiB7IH1cbn0pO1xudmFyIFRyYWNlO1xuKGZ1bmN0aW9uIChUcmFjZSkge1xuICAgIFRyYWNlW1RyYWNlW1wiT2ZmXCJdID0gMF0gPSBcIk9mZlwiO1xuICAgIFRyYWNlW1RyYWNlW1wiTWVzc2FnZXNcIl0gPSAxXSA9IFwiTWVzc2FnZXNcIjtcbiAgICBUcmFjZVtUcmFjZVtcIkNvbXBhY3RcIl0gPSAyXSA9IFwiQ29tcGFjdFwiO1xuICAgIFRyYWNlW1RyYWNlW1wiVmVyYm9zZVwiXSA9IDNdID0gXCJWZXJib3NlXCI7XG59KShUcmFjZSB8fCAoZXhwb3J0cy5UcmFjZSA9IFRyYWNlID0ge30pKTtcbnZhciBUcmFjZVZhbHVlcztcbihmdW5jdGlvbiAoVHJhY2VWYWx1ZXMpIHtcbiAgICAvKipcbiAgICAgKiBUdXJuIHRyYWNpbmcgb2ZmLlxuICAgICAqL1xuICAgIFRyYWNlVmFsdWVzLk9mZiA9ICdvZmYnO1xuICAgIC8qKlxuICAgICAqIFRyYWNlIG1lc3NhZ2VzIG9ubHkuXG4gICAgICovXG4gICAgVHJhY2VWYWx1ZXMuTWVzc2FnZXMgPSAnbWVzc2FnZXMnO1xuICAgIC8qKlxuICAgICAqIENvbXBhY3QgbWVzc2FnZSB0cmFjaW5nLlxuICAgICAqL1xuICAgIFRyYWNlVmFsdWVzLkNvbXBhY3QgPSAnY29tcGFjdCc7XG4gICAgLyoqXG4gICAgICogVmVyYm9zZSBtZXNzYWdlIHRyYWNpbmcuXG4gICAgICovXG4gICAgVHJhY2VWYWx1ZXMuVmVyYm9zZSA9ICd2ZXJib3NlJztcbn0pKFRyYWNlVmFsdWVzIHx8IChleHBvcnRzLlRyYWNlVmFsdWVzID0gVHJhY2VWYWx1ZXMgPSB7fSkpO1xuKGZ1bmN0aW9uIChUcmFjZSkge1xuICAgIGZ1bmN0aW9uIGZyb21TdHJpbmcodmFsdWUpIHtcbiAgICAgICAgaWYgKCFJcy5zdHJpbmcodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gVHJhY2UuT2ZmO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSAnb2ZmJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gVHJhY2UuT2ZmO1xuICAgICAgICAgICAgY2FzZSAnbWVzc2FnZXMnOlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5NZXNzYWdlcztcbiAgICAgICAgICAgIGNhc2UgJ2NvbXBhY3QnOlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5Db21wYWN0O1xuICAgICAgICAgICAgY2FzZSAndmVyYm9zZSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFRyYWNlLlZlcmJvc2U7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5PZmY7XG4gICAgICAgIH1cbiAgICB9XG4gICAgVHJhY2UuZnJvbVN0cmluZyA9IGZyb21TdHJpbmc7XG4gICAgZnVuY3Rpb24gdG9TdHJpbmcodmFsdWUpIHtcbiAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5PZmY6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdvZmYnO1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5NZXNzYWdlczpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ21lc3NhZ2VzJztcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuQ29tcGFjdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2NvbXBhY3QnO1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5WZXJib3NlOlxuICAgICAgICAgICAgICAgIHJldHVybiAndmVyYm9zZSc7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAnb2ZmJztcbiAgICAgICAgfVxuICAgIH1cbiAgICBUcmFjZS50b1N0cmluZyA9IHRvU3RyaW5nO1xufSkoVHJhY2UgfHwgKGV4cG9ydHMuVHJhY2UgPSBUcmFjZSA9IHt9KSk7XG52YXIgVHJhY2VGb3JtYXQ7XG4oZnVuY3Rpb24gKFRyYWNlRm9ybWF0KSB7XG4gICAgVHJhY2VGb3JtYXRbXCJUZXh0XCJdID0gXCJ0ZXh0XCI7XG4gICAgVHJhY2VGb3JtYXRbXCJKU09OXCJdID0gXCJqc29uXCI7XG59KShUcmFjZUZvcm1hdCB8fCAoZXhwb3J0cy5UcmFjZUZvcm1hdCA9IFRyYWNlRm9ybWF0ID0ge30pKTtcbihmdW5jdGlvbiAoVHJhY2VGb3JtYXQpIHtcbiAgICBmdW5jdGlvbiBmcm9tU3RyaW5nKHZhbHVlKSB7XG4gICAgICAgIGlmICghSXMuc3RyaW5nKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIFRyYWNlRm9ybWF0LlRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAodmFsdWUgPT09ICdqc29uJykge1xuICAgICAgICAgICAgcmV0dXJuIFRyYWNlRm9ybWF0LkpTT047XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gVHJhY2VGb3JtYXQuVGV4dDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBUcmFjZUZvcm1hdC5mcm9tU3RyaW5nID0gZnJvbVN0cmluZztcbn0pKFRyYWNlRm9ybWF0IHx8IChleHBvcnRzLlRyYWNlRm9ybWF0ID0gVHJhY2VGb3JtYXQgPSB7fSkpO1xudmFyIFNldFRyYWNlTm90aWZpY2F0aW9uO1xuKGZ1bmN0aW9uIChTZXRUcmFjZU5vdGlmaWNhdGlvbikge1xuICAgIFNldFRyYWNlTm90aWZpY2F0aW9uLnR5cGUgPSBuZXcgbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlKCckL3NldFRyYWNlJyk7XG59KShTZXRUcmFjZU5vdGlmaWNhdGlvbiB8fCAoZXhwb3J0cy5TZXRUcmFjZU5vdGlmaWNhdGlvbiA9IFNldFRyYWNlTm90aWZpY2F0aW9uID0ge30pKTtcbnZhciBMb2dUcmFjZU5vdGlmaWNhdGlvbjtcbihmdW5jdGlvbiAoTG9nVHJhY2VOb3RpZmljYXRpb24pIHtcbiAgICBMb2dUcmFjZU5vdGlmaWNhdGlvbi50eXBlID0gbmV3IG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZSgnJC9sb2dUcmFjZScpO1xufSkoTG9nVHJhY2VOb3RpZmljYXRpb24gfHwgKGV4cG9ydHMuTG9nVHJhY2VOb3RpZmljYXRpb24gPSBMb2dUcmFjZU5vdGlmaWNhdGlvbiA9IHt9KSk7XG52YXIgQ29ubmVjdGlvbkVycm9ycztcbihmdW5jdGlvbiAoQ29ubmVjdGlvbkVycm9ycykge1xuICAgIC8qKlxuICAgICAqIFRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZC5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uRXJyb3JzW0Nvbm5lY3Rpb25FcnJvcnNbXCJDbG9zZWRcIl0gPSAxXSA9IFwiQ2xvc2VkXCI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gZ290IGRpc3Bvc2VkLlxuICAgICAqL1xuICAgIENvbm5lY3Rpb25FcnJvcnNbQ29ubmVjdGlvbkVycm9yc1tcIkRpc3Bvc2VkXCJdID0gMl0gPSBcIkRpc3Bvc2VkXCI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBpbiBsaXN0ZW5pbmcgbW9kZS5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uRXJyb3JzW0Nvbm5lY3Rpb25FcnJvcnNbXCJBbHJlYWR5TGlzdGVuaW5nXCJdID0gM10gPSBcIkFscmVhZHlMaXN0ZW5pbmdcIjtcbn0pKENvbm5lY3Rpb25FcnJvcnMgfHwgKGV4cG9ydHMuQ29ubmVjdGlvbkVycm9ycyA9IENvbm5lY3Rpb25FcnJvcnMgPSB7fSkpO1xuY2xhc3MgQ29ubmVjdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNvZGUsIG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBDb25uZWN0aW9uRXJyb3IucHJvdG90eXBlKTtcbiAgICB9XG59XG5leHBvcnRzLkNvbm5lY3Rpb25FcnJvciA9IENvbm5lY3Rpb25FcnJvcjtcbnZhciBDb25uZWN0aW9uU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENvbm5lY3Rpb25TdHJhdGVneSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNhbmNlbFVuZGlzcGF0Y2hlZCk7XG4gICAgfVxuICAgIENvbm5lY3Rpb25TdHJhdGVneS5pcyA9IGlzO1xufSkoQ29ubmVjdGlvblN0cmF0ZWd5IHx8IChleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IENvbm5lY3Rpb25TdHJhdGVneSA9IHt9KSk7XG52YXIgSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5O1xuKGZ1bmN0aW9uIChJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiAoY2FuZGlkYXRlLmtpbmQgPT09IHVuZGVmaW5lZCB8fCBjYW5kaWRhdGUua2luZCA9PT0gJ2lkJykgJiYgSXMuZnVuYyhjYW5kaWRhdGUuY3JlYXRlQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UpICYmIChjYW5kaWRhdGUuZGlzcG9zZSA9PT0gdW5kZWZpbmVkIHx8IElzLmZ1bmMoY2FuZGlkYXRlLmRpc3Bvc2UpKTtcbiAgICB9XG4gICAgSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzID0gaXM7XG59KShJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgfHwgKGV4cG9ydHMuSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0ge30pKTtcbnZhciBSZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneTtcbihmdW5jdGlvbiAoUmVxdWVzdENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBjYW5kaWRhdGUua2luZCA9PT0gJ3JlcXVlc3QnICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKSAmJiAoY2FuZGlkYXRlLmRpc3Bvc2UgPT09IHVuZGVmaW5lZCB8fCBJcy5mdW5jKGNhbmRpZGF0ZS5kaXNwb3NlKSk7XG4gICAgfVxuICAgIFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzID0gaXM7XG59KShSZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSB8fCAoZXhwb3J0cy5SZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0ge30pKTtcbnZhciBDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5O1xuKGZ1bmN0aW9uIChDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5NZXNzYWdlID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKF8pIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgY2FuY2VsbGF0aW9uXzEuQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UoKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kuaXModmFsdWUpIHx8IFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKHZhbHVlKTtcbiAgICB9XG4gICAgQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5pcyA9IGlzO1xufSkoQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSB8fCAoZXhwb3J0cy5DYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IHt9KSk7XG52YXIgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENhbmNlbGxhdGlvblNlbmRlclN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kuTWVzc2FnZSA9IE9iamVjdC5mcmVlemUoe1xuICAgICAgICBzZW5kQ2FuY2VsbGF0aW9uKGNvbm4sIGlkKSB7XG4gICAgICAgICAgICByZXR1cm4gY29ubi5zZW5kTm90aWZpY2F0aW9uKENhbmNlbE5vdGlmaWNhdGlvbi50eXBlLCB7IGlkIH0pO1xuICAgICAgICB9LFxuICAgICAgICBjbGVhbnVwKF8pIHsgfVxuICAgIH0pO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLnNlbmRDYW5jZWxsYXRpb24pICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNsZWFudXApO1xuICAgIH1cbiAgICBDYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneS5pcyA9IGlzO1xufSkoQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgfHwgKGV4cG9ydHMuQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgPSBDYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneSA9IHt9KSk7XG52YXIgQ2FuY2VsbGF0aW9uU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENhbmNlbGxhdGlvblN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uU3RyYXRlZ3kuTWVzc2FnZSA9IE9iamVjdC5mcmVlemUoe1xuICAgICAgICByZWNlaXZlcjogQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5NZXNzYWdlLFxuICAgICAgICBzZW5kZXI6IENhbmNlbGxhdGlvblNlbmRlclN0cmF0ZWd5Lk1lc3NhZ2VcbiAgICB9KTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKGNhbmRpZGF0ZS5yZWNlaXZlcikgJiYgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kuaXMoY2FuZGlkYXRlLnNlbmRlcik7XG4gICAgfVxuICAgIENhbmNlbGxhdGlvblN0cmF0ZWd5LmlzID0gaXM7XG59KShDYW5jZWxsYXRpb25TdHJhdGVneSB8fCAoZXhwb3J0cy5DYW5jZWxsYXRpb25TdHJhdGVneSA9IENhbmNlbGxhdGlvblN0cmF0ZWd5ID0ge30pKTtcbnZhciBNZXNzYWdlU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKE1lc3NhZ2VTdHJhdGVneSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLmhhbmRsZU1lc3NhZ2UpO1xuICAgIH1cbiAgICBNZXNzYWdlU3RyYXRlZ3kuaXMgPSBpcztcbn0pKE1lc3NhZ2VTdHJhdGVneSB8fCAoZXhwb3J0cy5NZXNzYWdlU3RyYXRlZ3kgPSBNZXNzYWdlU3RyYXRlZ3kgPSB7fSkpO1xudmFyIENvbm5lY3Rpb25PcHRpb25zO1xuKGZ1bmN0aW9uIChDb25uZWN0aW9uT3B0aW9ucykge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIChDYW5jZWxsYXRpb25TdHJhdGVneS5pcyhjYW5kaWRhdGUuY2FuY2VsbGF0aW9uU3RyYXRlZ3kpIHx8IENvbm5lY3Rpb25TdHJhdGVneS5pcyhjYW5kaWRhdGUuY29ubmVjdGlvblN0cmF0ZWd5KSB8fCBNZXNzYWdlU3RyYXRlZ3kuaXMoY2FuZGlkYXRlLm1lc3NhZ2VTdHJhdGVneSkpO1xuICAgIH1cbiAgICBDb25uZWN0aW9uT3B0aW9ucy5pcyA9IGlzO1xufSkoQ29ubmVjdGlvbk9wdGlvbnMgfHwgKGV4cG9ydHMuQ29ubmVjdGlvbk9wdGlvbnMgPSBDb25uZWN0aW9uT3B0aW9ucyA9IHt9KSk7XG52YXIgQ29ubmVjdGlvblN0YXRlO1xuKGZ1bmN0aW9uIChDb25uZWN0aW9uU3RhdGUpIHtcbiAgICBDb25uZWN0aW9uU3RhdGVbQ29ubmVjdGlvblN0YXRlW1wiTmV3XCJdID0gMV0gPSBcIk5ld1wiO1xuICAgIENvbm5lY3Rpb25TdGF0ZVtDb25uZWN0aW9uU3RhdGVbXCJMaXN0ZW5pbmdcIl0gPSAyXSA9IFwiTGlzdGVuaW5nXCI7XG4gICAgQ29ubmVjdGlvblN0YXRlW0Nvbm5lY3Rpb25TdGF0ZVtcIkNsb3NlZFwiXSA9IDNdID0gXCJDbG9zZWRcIjtcbiAgICBDb25uZWN0aW9uU3RhdGVbQ29ubmVjdGlvblN0YXRlW1wiRGlzcG9zZWRcIl0gPSA0XSA9IFwiRGlzcG9zZWRcIjtcbn0pKENvbm5lY3Rpb25TdGF0ZSB8fCAoQ29ubmVjdGlvblN0YXRlID0ge30pKTtcbmZ1bmN0aW9uIGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uKG1lc3NhZ2VSZWFkZXIsIG1lc3NhZ2VXcml0ZXIsIF9sb2dnZXIsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBsb2dnZXIgPSBfbG9nZ2VyICE9PSB1bmRlZmluZWQgPyBfbG9nZ2VyIDogZXhwb3J0cy5OdWxsTG9nZ2VyO1xuICAgIGxldCBzZXF1ZW5jZU51bWJlciA9IDA7XG4gICAgbGV0IG5vdGlmaWNhdGlvblNlcXVlbmNlTnVtYmVyID0gMDtcbiAgICBsZXQgdW5rbm93blJlc3BvbnNlU2VxdWVuY2VOdW1iZXIgPSAwO1xuICAgIGNvbnN0IHZlcnNpb24gPSAnMi4wJztcbiAgICBsZXQgc3RhclJlcXVlc3RIYW5kbGVyID0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlcXVlc3RIYW5kbGVycyA9IG5ldyBNYXAoKTtcbiAgICBsZXQgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgY29uc3Qgbm90aWZpY2F0aW9uSGFuZGxlcnMgPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgcHJvZ3Jlc3NIYW5kbGVycyA9IG5ldyBNYXAoKTtcbiAgICBsZXQgdGltZXI7XG4gICAgbGV0IG1lc3NhZ2VRdWV1ZSA9IG5ldyBsaW5rZWRNYXBfMS5MaW5rZWRNYXAoKTtcbiAgICBsZXQgcmVzcG9uc2VQcm9taXNlcyA9IG5ldyBNYXAoKTtcbiAgICBsZXQga25vd25DYW5jZWxlZFJlcXVlc3RzID0gbmV3IFNldCgpO1xuICAgIGxldCByZXF1ZXN0VG9rZW5zID0gbmV3IE1hcCgpO1xuICAgIGxldCB0cmFjZSA9IFRyYWNlLk9mZjtcbiAgICBsZXQgdHJhY2VGb3JtYXQgPSBUcmFjZUZvcm1hdC5UZXh0O1xuICAgIGxldCB0cmFjZXI7XG4gICAgbGV0IHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLk5ldztcbiAgICBjb25zdCBlcnJvckVtaXR0ZXIgPSBuZXcgZXZlbnRzXzEuRW1pdHRlcigpO1xuICAgIGNvbnN0IGNsb3NlRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgdW5oYW5kbGVkTm90aWZpY2F0aW9uRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgdW5oYW5kbGVkUHJvZ3Jlc3NFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICBjb25zdCBkaXNwb3NlRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgY2FuY2VsbGF0aW9uU3RyYXRlZ3kgPSAob3B0aW9ucyAmJiBvcHRpb25zLmNhbmNlbGxhdGlvblN0cmF0ZWd5KSA/IG9wdGlvbnMuY2FuY2VsbGF0aW9uU3RyYXRlZ3kgOiBDYW5jZWxsYXRpb25TdHJhdGVneS5NZXNzYWdlO1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlcXVlc3RRdWV1ZUtleShpZCkge1xuICAgICAgICBpZiAoaWQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuJ3Qgc2VuZCByZXF1ZXN0cyB3aXRoIGlkIG51bGwgc2luY2UgdGhlIHJlc3BvbnNlIGNhbid0IGJlIGNvcnJlbGF0ZWQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdyZXEtJyArIGlkLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlc3BvbnNlUXVldWVLZXkoaWQpIHtcbiAgICAgICAgaWYgKGlkID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3Jlcy11bmtub3duLScgKyAoKyt1bmtub3duUmVzcG9uc2VTZXF1ZW5jZU51bWJlcikudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAncmVzLScgKyBpZC50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZU5vdGlmaWNhdGlvblF1ZXVlS2V5KCkge1xuICAgICAgICByZXR1cm4gJ25vdC0nICsgKCsrbm90aWZpY2F0aW9uU2VxdWVuY2VOdW1iZXIpLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFkZE1lc3NhZ2VUb1F1ZXVlKHF1ZXVlLCBtZXNzYWdlKSB7XG4gICAgICAgIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXF1ZXN0KG1lc3NhZ2UpKSB7XG4gICAgICAgICAgICBxdWV1ZS5zZXQoY3JlYXRlUmVxdWVzdFF1ZXVlS2V5KG1lc3NhZ2UuaWQpLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXNwb25zZShtZXNzYWdlKSkge1xuICAgICAgICAgICAgcXVldWUuc2V0KGNyZWF0ZVJlc3BvbnNlUXVldWVLZXkobWVzc2FnZS5pZCksIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcXVldWUuc2V0KGNyZWF0ZU5vdGlmaWNhdGlvblF1ZXVlS2V5KCksIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNhbmNlbFVuZGlzcGF0Y2hlZChfbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0xpc3RlbmluZygpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlID09PSBDb25uZWN0aW9uU3RhdGUuTGlzdGVuaW5nO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0Nsb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlID09PSBDb25uZWN0aW9uU3RhdGUuQ2xvc2VkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0Rpc3Bvc2VkKCkge1xuICAgICAgICByZXR1cm4gc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5EaXNwb3NlZDtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2xvc2VIYW5kbGVyKCkge1xuICAgICAgICBpZiAoc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5OZXcgfHwgc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5MaXN0ZW5pbmcpIHtcbiAgICAgICAgICAgIHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLkNsb3NlZDtcbiAgICAgICAgICAgIGNsb3NlRW1pdHRlci5maXJlKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlIGNvbm5lY3Rpb24gaXMgZGlzcG9zZWQgZG9uJ3Qgc2VudCBjbG9zZSBldmVudHMuXG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlYWRFcnJvckhhbmRsZXIoZXJyb3IpIHtcbiAgICAgICAgZXJyb3JFbWl0dGVyLmZpcmUoW2Vycm9yLCB1bmRlZmluZWQsIHVuZGVmaW5lZF0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiB3cml0ZUVycm9ySGFuZGxlcihkYXRhKSB7XG4gICAgICAgIGVycm9yRW1pdHRlci5maXJlKGRhdGEpO1xuICAgIH1cbiAgICBtZXNzYWdlUmVhZGVyLm9uQ2xvc2UoY2xvc2VIYW5kbGVyKTtcbiAgICBtZXNzYWdlUmVhZGVyLm9uRXJyb3IocmVhZEVycm9ySGFuZGxlcik7XG4gICAgbWVzc2FnZVdyaXRlci5vbkNsb3NlKGNsb3NlSGFuZGxlcik7XG4gICAgbWVzc2FnZVdyaXRlci5vbkVycm9yKHdyaXRlRXJyb3JIYW5kbGVyKTtcbiAgICBmdW5jdGlvbiB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCkge1xuICAgICAgICBpZiAodGltZXIgfHwgbWVzc2FnZVF1ZXVlLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aW1lciA9ICgwLCByYWxfMS5kZWZhdWx0KSgpLnRpbWVyLnNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICAgICAgICB0aW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHByb2Nlc3NNZXNzYWdlUXVldWUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGhhbmRsZU1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICBpZiAobWVzc2FnZXNfMS5NZXNzYWdlLmlzUmVxdWVzdChtZXNzYWdlKSkge1xuICAgICAgICAgICAgaGFuZGxlUmVxdWVzdChtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNOb3RpZmljYXRpb24obWVzc2FnZSkpIHtcbiAgICAgICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvbihtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXNwb25zZShtZXNzYWdlKSkge1xuICAgICAgICAgICAgaGFuZGxlUmVzcG9uc2UobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBoYW5kbGVJbnZhbGlkTWVzc2FnZShtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBwcm9jZXNzTWVzc2FnZVF1ZXVlKCkge1xuICAgICAgICBpZiAobWVzc2FnZVF1ZXVlLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXNzYWdlID0gbWVzc2FnZVF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlU3RyYXRlZ3kgPSBvcHRpb25zPy5tZXNzYWdlU3RyYXRlZ3k7XG4gICAgICAgICAgICBpZiAoTWVzc2FnZVN0cmF0ZWd5LmlzKG1lc3NhZ2VTdHJhdGVneSkpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlU3RyYXRlZ3kuaGFuZGxlTWVzc2FnZShtZXNzYWdlLCBoYW5kbGVNZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGhhbmRsZU1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgY2FsbGJhY2sgPSAobWVzc2FnZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2UgaGF2ZSByZWNlaXZlZCBhIGNhbmNlbGxhdGlvbiBtZXNzYWdlLiBDaGVjayBpZiB0aGUgbWVzc2FnZSBpcyBzdGlsbCBpbiB0aGUgcXVldWVcbiAgICAgICAgICAgIC8vIGFuZCBjYW5jZWwgaXQgaWYgYWxsb3dlZCB0byBkbyBzby5cbiAgICAgICAgICAgIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNOb3RpZmljYXRpb24obWVzc2FnZSkgJiYgbWVzc2FnZS5tZXRob2QgPT09IENhbmNlbE5vdGlmaWNhdGlvbi50eXBlLm1ldGhvZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbmNlbElkID0gbWVzc2FnZS5wYXJhbXMuaWQ7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gY3JlYXRlUmVxdWVzdFF1ZXVlS2V5KGNhbmNlbElkKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0b0NhbmNlbCA9IG1lc3NhZ2VRdWV1ZS5nZXQoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZXNfMS5NZXNzYWdlLmlzUmVxdWVzdCh0b0NhbmNlbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyYXRlZ3kgPSBvcHRpb25zPy5jb25uZWN0aW9uU3RyYXRlZ3k7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gKHN0cmF0ZWd5ICYmIHN0cmF0ZWd5LmNhbmNlbFVuZGlzcGF0Y2hlZCkgPyBzdHJhdGVneS5jYW5jZWxVbmRpc3BhdGNoZWQodG9DYW5jZWwsIGNhbmNlbFVuZGlzcGF0Y2hlZCkgOiBjYW5jZWxVbmRpc3BhdGNoZWQodG9DYW5jZWwpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgJiYgKHJlc3BvbnNlLmVycm9yICE9PSB1bmRlZmluZWQgfHwgcmVzcG9uc2UucmVzdWx0ICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUXVldWUuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLmRlbGV0ZShjYW5jZWxJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5pZCA9IHRvQ2FuY2VsLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VTZW5kaW5nUmVzcG9uc2UocmVzcG9uc2UsIG1lc3NhZ2UubWV0aG9kLCBEYXRlLm5vdygpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUocmVzcG9uc2UpLmNhdGNoKCgpID0+IGxvZ2dlci5lcnJvcihgU2VuZGluZyByZXNwb25zZSBmb3IgY2FuY2VsZWQgbWVzc2FnZSBmYWlsZWQuYCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGNhbmNlbGxhdGlvblRva2VuID0gcmVxdWVzdFRva2Vucy5nZXQoY2FuY2VsSWQpO1xuICAgICAgICAgICAgICAgIC8vIFRoZSByZXF1ZXN0IGlzIGFscmVhZHkgcnVubmluZy4gQ2FuY2VsIHRoZSB0b2tlblxuICAgICAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbmNlbGxhdGlvblRva2VuLmNhbmNlbCgpO1xuICAgICAgICAgICAgICAgICAgICB0cmFjZVJlY2VpdmVkTm90aWZpY2F0aW9uKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZW1lbWJlciB0aGUgY2FuY2VsIGJ1dCBzdGlsbCBxdWV1ZSB0aGUgbWVzc2FnZSB0b1xuICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbiB1cCBzdGF0ZSBpbiBwcm9jZXNzIG1lc3NhZ2UuXG4gICAgICAgICAgICAgICAgICAgIGtub3duQ2FuY2VsZWRSZXF1ZXN0cy5hZGQoY2FuY2VsSWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFkZE1lc3NhZ2VUb1F1ZXVlKG1lc3NhZ2VRdWV1ZSwgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGZ1bmN0aW9uIGhhbmRsZVJlcXVlc3QocmVxdWVzdE1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgLy8gd2UgcmV0dXJuIGhlcmUgc2lsZW50bHkgc2luY2Ugd2UgZmlyZWQgYW4gZXZlbnQgd2hlbiB0aGVcbiAgICAgICAgICAgIC8vIGNvbm5lY3Rpb24gZ290IGRpc3Bvc2VkLlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHJlcGx5KHJlc3VsdE9yRXJyb3IsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgaWQ6IHJlcXVlc3RNZXNzYWdlLmlkXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKHJlc3VsdE9yRXJyb3IgaW5zdGFuY2VvZiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlLmVycm9yID0gcmVzdWx0T3JFcnJvci50b0pzb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVzdWx0ID0gcmVzdWx0T3JFcnJvciA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHJlc3VsdE9yRXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cmFjZVNlbmRpbmdSZXNwb25zZShtZXNzYWdlLCBtZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICBtZXNzYWdlV3JpdGVyLndyaXRlKG1lc3NhZ2UpLmNhdGNoKCgpID0+IGxvZ2dlci5lcnJvcihgU2VuZGluZyByZXNwb25zZSBmYWlsZWQuYCkpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHJlcGx5RXJyb3IoZXJyb3IsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgaWQ6IHJlcXVlc3RNZXNzYWdlLmlkLFxuICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvci50b0pzb24oKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUobWVzc2FnZSkuY2F0Y2goKCkgPT4gbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlc3BvbnNlIGZhaWxlZC5gKSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gcmVwbHlTdWNjZXNzKHJlc3VsdCwgbWV0aG9kLCBzdGFydFRpbWUpIHtcbiAgICAgICAgICAgIC8vIFRoZSBKU09OIFJQQyBkZWZpbmVzIHRoYXQgYSByZXNwb25zZSBtdXN0IGVpdGhlciBoYXZlIGEgcmVzdWx0IG9yIGFuIGVycm9yXG4gICAgICAgICAgICAvLyBTbyB3ZSBjYW4ndCB0cmVhdCB1bmRlZmluZWQgYXMgYSB2YWxpZCByZXNwb25zZSByZXN1bHQuXG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgICAgICAgICAgICBqc29ucnBjOiB2ZXJzaW9uLFxuICAgICAgICAgICAgICAgIGlkOiByZXF1ZXN0TWVzc2FnZS5pZCxcbiAgICAgICAgICAgICAgICByZXN1bHQ6IHJlc3VsdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUobWVzc2FnZSkuY2F0Y2goKCkgPT4gbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlc3BvbnNlIGZhaWxlZC5gKSk7XG4gICAgICAgIH1cbiAgICAgICAgdHJhY2VSZWNlaXZlZFJlcXVlc3QocmVxdWVzdE1lc3NhZ2UpO1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gcmVxdWVzdEhhbmRsZXJzLmdldChyZXF1ZXN0TWVzc2FnZS5tZXRob2QpO1xuICAgICAgICBsZXQgdHlwZTtcbiAgICAgICAgbGV0IHJlcXVlc3RIYW5kbGVyO1xuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgdHlwZSA9IGVsZW1lbnQudHlwZTtcbiAgICAgICAgICAgIHJlcXVlc3RIYW5kbGVyID0gZWxlbWVudC5oYW5kbGVyO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIGlmIChyZXF1ZXN0SGFuZGxlciB8fCBzdGFyUmVxdWVzdEhhbmRsZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHRva2VuS2V5ID0gcmVxdWVzdE1lc3NhZ2UuaWQgPz8gU3RyaW5nKERhdGUubm93KCkpOyAvL1xuICAgICAgICAgICAgY29uc3QgY2FuY2VsbGF0aW9uU291cmNlID0gSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKGNhbmNlbGxhdGlvblN0cmF0ZWd5LnJlY2VpdmVyKVxuICAgICAgICAgICAgICAgID8gY2FuY2VsbGF0aW9uU3RyYXRlZ3kucmVjZWl2ZXIuY3JlYXRlQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UodG9rZW5LZXkpXG4gICAgICAgICAgICAgICAgOiBjYW5jZWxsYXRpb25TdHJhdGVneS5yZWNlaXZlci5jcmVhdGVDYW5jZWxsYXRpb25Ub2tlblNvdXJjZShyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICBpZiAocmVxdWVzdE1lc3NhZ2UuaWQgIT09IG51bGwgJiYga25vd25DYW5jZWxlZFJlcXVlc3RzLmhhcyhyZXF1ZXN0TWVzc2FnZS5pZCkpIHtcbiAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25Tb3VyY2UuY2FuY2VsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVxdWVzdE1lc3NhZ2UuaWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLnNldCh0b2tlbktleSwgY2FuY2VsbGF0aW9uU291cmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IGhhbmRsZXJSZXN1bHQ7XG4gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0TWVzc2FnZS5wYXJhbXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlLm51bWJlck9mUGFyYW1zICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1zLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyAke3R5cGUubnVtYmVyT2ZQYXJhbXN9IHBhcmFtcyBidXQgcmVjZWl2ZWQgbm9uZS5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJSZXN1bHQgPSByZXF1ZXN0SGFuZGxlcihjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVxdWVzdE1lc3NhZ2UucGFyYW1zKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlLnBhcmFtZXRlclN0cnVjdHVyZXMgPT09IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseUVycm9yKG5ldyBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IobWVzc2FnZXNfMS5FcnJvckNvZGVzLkludmFsaWRQYXJhbXMsIGBSZXF1ZXN0ICR7cmVxdWVzdE1lc3NhZ2UubWV0aG9kfSBkZWZpbmVzIHBhcmFtZXRlcnMgYnkgbmFtZSBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBwb3NpdGlvbmApLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlclJlc3VsdCA9IHJlcXVlc3RIYW5kbGVyKC4uLnJlcXVlc3RNZXNzYWdlLnBhcmFtcywgY2FuY2VsbGF0aW9uU291cmNlLnRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS5wYXJhbWV0ZXJTdHJ1Y3R1cmVzID09PSBtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW52YWxpZFBhcmFtcywgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGRlZmluZXMgcGFyYW1ldGVycyBieSBwb3NpdGlvbiBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBuYW1lYCksIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gcmVxdWVzdEhhbmRsZXIocmVxdWVzdE1lc3NhZ2UucGFyYW1zLCBjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0YXJSZXF1ZXN0SGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gc3RhclJlcXVlc3RIYW5kbGVyKHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgcmVxdWVzdE1lc3NhZ2UucGFyYW1zLCBjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBwcm9taXNlID0gaGFuZGxlclJlc3VsdDtcbiAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZXJSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFRva2Vucy5kZWxldGUodG9rZW5LZXkpO1xuICAgICAgICAgICAgICAgICAgICByZXBseVN1Y2Nlc3MoaGFuZGxlclJlc3VsdCwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwcm9taXNlLnRoZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS50aGVuKChyZXN1bHRPckVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLmRlbGV0ZSh0b2tlbktleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXBseShyZXN1bHRPckVycm9yLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IoZXJyb3IsIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVycm9yICYmIElzLnN0cmluZyhlcnJvci5tZXNzYWdlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGZhaWxlZCB3aXRoIG1lc3NhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZmFpbGVkIHVuZXhwZWN0ZWRseSB3aXRob3V0IHByb3ZpZGluZyBhbnkgZGV0YWlscy5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHkoaGFuZGxlclJlc3VsdCwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHkoZXJyb3IsIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZXJyb3IgJiYgSXMuc3RyaW5nKGVycm9yLm1lc3NhZ2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGZhaWxlZCB3aXRoIG1lc3NhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZmFpbGVkIHVuZXhwZWN0ZWRseSB3aXRob3V0IHByb3ZpZGluZyBhbnkgZGV0YWlscy5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuTWV0aG9kTm90Rm91bmQsIGBVbmhhbmRsZWQgbWV0aG9kICR7cmVxdWVzdE1lc3NhZ2UubWV0aG9kfWApLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlUmVzcG9uc2UocmVzcG9uc2VNZXNzYWdlKSB7XG4gICAgICAgIGlmIChpc0Rpc3Bvc2VkKCkpIHtcbiAgICAgICAgICAgIC8vIFNlZSBoYW5kbGUgcmVxdWVzdC5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzcG9uc2VNZXNzYWdlLmlkID09PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VNZXNzYWdlLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBSZWNlaXZlZCByZXNwb25zZSBtZXNzYWdlIHdpdGhvdXQgaWQ6IEVycm9yIGlzOiBcXG4ke0pTT04uc3RyaW5naWZ5KHJlc3BvbnNlTWVzc2FnZS5lcnJvciwgdW5kZWZpbmVkLCA0KX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgUmVjZWl2ZWQgcmVzcG9uc2UgbWVzc2FnZSB3aXRob3V0IGlkLiBObyBmdXJ0aGVyIGVycm9yIGluZm9ybWF0aW9uIHByb3ZpZGVkLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gcmVzcG9uc2VNZXNzYWdlLmlkO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VQcm9taXNlID0gcmVzcG9uc2VQcm9taXNlcy5nZXQoa2V5KTtcbiAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWRSZXNwb25zZShyZXNwb25zZU1lc3NhZ2UsIHJlc3BvbnNlUHJvbWlzZSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VQcm9taXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2VzLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZU1lc3NhZ2UuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gcmVzcG9uc2VNZXNzYWdlLmVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlLnJlamVjdChuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKGVycm9yLmNvZGUsIGVycm9yLm1lc3NhZ2UsIGVycm9yLmRhdGEpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXNwb25zZU1lc3NhZ2UucmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlTWVzc2FnZS5yZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgbmV2ZXIgaGFwcGVuLicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IubWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBSZXNwb25zZSBoYW5kbGVyICcke3Jlc3BvbnNlUHJvbWlzZS5tZXRob2R9JyBmYWlsZWQgd2l0aCBtZXNzYWdlOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYFJlc3BvbnNlIGhhbmRsZXIgJyR7cmVzcG9uc2VQcm9taXNlLm1ldGhvZH0nIGZhaWxlZCB1bmV4cGVjdGVkbHkuYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlTm90aWZpY2F0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgLy8gU2VlIGhhbmRsZSByZXF1ZXN0LlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0eXBlID0gdW5kZWZpbmVkO1xuICAgICAgICBsZXQgbm90aWZpY2F0aW9uSGFuZGxlcjtcbiAgICAgICAgaWYgKG1lc3NhZ2UubWV0aG9kID09PSBDYW5jZWxOb3RpZmljYXRpb24udHlwZS5tZXRob2QpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhbmNlbElkID0gbWVzc2FnZS5wYXJhbXMuaWQ7XG4gICAgICAgICAgICBrbm93bkNhbmNlbGVkUmVxdWVzdHMuZGVsZXRlKGNhbmNlbElkKTtcbiAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWROb3RpZmljYXRpb24obWVzc2FnZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gbm90aWZpY2F0aW9uSGFuZGxlcnMuZ2V0KG1lc3NhZ2UubWV0aG9kKTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uSGFuZGxlciA9IGVsZW1lbnQuaGFuZGxlcjtcbiAgICAgICAgICAgICAgICB0eXBlID0gZWxlbWVudC50eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChub3RpZmljYXRpb25IYW5kbGVyIHx8IHN0YXJOb3RpZmljYXRpb25IYW5kbGVyKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWROb3RpZmljYXRpb24obWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgaWYgKG5vdGlmaWNhdGlvbkhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UucGFyYW1zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5udW1iZXJPZlBhcmFtcyAhPT0gMCAmJiB0eXBlLnBhcmFtZXRlclN0cnVjdHVyZXMgIT09IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBOb3RpZmljYXRpb24gJHttZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyAke3R5cGUubnVtYmVyT2ZQYXJhbXN9IHBhcmFtcyBidXQgcmVjZWl2ZWQgbm9uZS5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShtZXNzYWdlLnBhcmFtcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGFyZSBKU09OLVJQQyBsaWJyYXJpZXMgdGhhdCBzZW5kIHByb2dyZXNzIG1lc3NhZ2UgYXMgcG9zaXRpb25hbCBwYXJhbXMgYWx0aG91Z2hcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpZmllZCBhcyBuYW1lZC4gU28gY29udmVydCB0aGVtIGlmIHRoaXMgaXMgdGhlIGNhc2UuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBtZXNzYWdlLnBhcmFtcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLm1ldGhvZCA9PT0gUHJvZ3Jlc3NOb3RpZmljYXRpb24udHlwZS5tZXRob2QgJiYgcGFyYW1zLmxlbmd0aCA9PT0gMiAmJiBQcm9ncmVzc1Rva2VuLmlzKHBhcmFtc1swXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKHsgdG9rZW46IHBhcmFtc1swXSwgdmFsdWU6IHBhcmFtc1sxXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUucGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBOb3RpZmljYXRpb24gJHttZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyBwYXJhbWV0ZXJzIGJ5IG5hbWUgYnV0IHJlY2VpdmVkIHBhcmFtZXRlcnMgYnkgcG9zaXRpb25gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5udW1iZXJPZlBhcmFtcyAhPT0gbWVzc2FnZS5wYXJhbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYE5vdGlmaWNhdGlvbiAke21lc3NhZ2UubWV0aG9kfSBkZWZpbmVzICR7dHlwZS5udW1iZXJPZlBhcmFtc30gcGFyYW1zIGJ1dCByZWNlaXZlZCAke3BhcmFtcy5sZW5ndGh9IGFyZ3VtZW50c2ApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXIoLi4ucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS5wYXJhbWV0ZXJTdHJ1Y3R1cmVzID09PSBtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgTm90aWZpY2F0aW9uICR7bWVzc2FnZS5tZXRob2R9IGRlZmluZXMgcGFyYW1ldGVycyBieSBwb3NpdGlvbiBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBuYW1lYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKG1lc3NhZ2UucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGFyTm90aWZpY2F0aW9uSGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICBzdGFyTm90aWZpY2F0aW9uSGFuZGxlcihtZXNzYWdlLm1ldGhvZCwgbWVzc2FnZS5wYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvci5tZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgTm90aWZpY2F0aW9uIGhhbmRsZXIgJyR7bWVzc2FnZS5tZXRob2R9JyBmYWlsZWQgd2l0aCBtZXNzYWdlOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYE5vdGlmaWNhdGlvbiBoYW5kbGVyICcke21lc3NhZ2UubWV0aG9kfScgZmFpbGVkIHVuZXhwZWN0ZWRseS5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1bmhhbmRsZWROb3RpZmljYXRpb25FbWl0dGVyLmZpcmUobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlSW52YWxpZE1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignUmVjZWl2ZWQgZW1wdHkgbWVzc2FnZS4nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsb2dnZXIuZXJyb3IoYFJlY2VpdmVkIG1lc3NhZ2Ugd2hpY2ggaXMgbmVpdGhlciBhIHJlc3BvbnNlIG5vciBhIG5vdGlmaWNhdGlvbiBtZXNzYWdlOlxcbiR7SlNPTi5zdHJpbmdpZnkobWVzc2FnZSwgbnVsbCwgNCl9YCk7XG4gICAgICAgIC8vIFRlc3Qgd2hldGhlciB3ZSBmaW5kIGFuIGlkIHRvIHJlamVjdCB0aGUgcHJvbWlzZVxuICAgICAgICBjb25zdCByZXNwb25zZU1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICBpZiAoSXMuc3RyaW5nKHJlc3BvbnNlTWVzc2FnZS5pZCkgfHwgSXMubnVtYmVyKHJlc3BvbnNlTWVzc2FnZS5pZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHJlc3BvbnNlTWVzc2FnZS5pZDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxlciA9IHJlc3BvbnNlUHJvbWlzZXMuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VIYW5kbGVyLnJlamVjdChuZXcgRXJyb3IoJ1RoZSByZWNlaXZlZCByZXNwb25zZSBoYXMgbmVpdGhlciBhIHJlc3VsdCBub3IgYW4gZXJyb3IgcHJvcGVydHkuJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0cmluZ2lmeVRyYWNlKHBhcmFtcykge1xuICAgICAgICBpZiAocGFyYW1zID09PSB1bmRlZmluZWQgfHwgcGFyYW1zID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAodHJhY2UpIHtcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuVmVyYm9zZTpcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGFyYW1zLCBudWxsLCA0KTtcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuQ29tcGFjdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGFyYW1zKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVNlbmRpbmdSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFjZUZvcm1hdCA9PT0gVHJhY2VGb3JtYXQuVGV4dCkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSAmJiBtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBgUGFyYW1zOiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucGFyYW1zKX1cXG5cXG5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJhY2VyLmxvZyhgU2VuZGluZyByZXF1ZXN0ICcke21lc3NhZ2UubWV0aG9kfSAtICgke21lc3NhZ2UuaWR9KScuYCwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb2dMU1BNZXNzYWdlKCdzZW5kLXJlcXVlc3QnLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVNlbmRpbmdOb3RpZmljYXRpb24obWVzc2FnZSkge1xuICAgICAgICBpZiAodHJhY2UgPT09IFRyYWNlLk9mZiB8fCAhdHJhY2VyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYWNlRm9ybWF0ID09PSBUcmFjZUZvcm1hdC5UZXh0KSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdCkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0gYFBhcmFtczogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLnBhcmFtcyl9XFxuXFxuYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSAnTm8gcGFyYW1ldGVycyBwcm92aWRlZC5cXG5cXG4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFNlbmRpbmcgbm90aWZpY2F0aW9uICcke21lc3NhZ2UubWV0aG9kfScuYCwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb2dMU1BNZXNzYWdlKCdzZW5kLW5vdGlmaWNhdGlvbicsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhY2VGb3JtYXQgPT09IFRyYWNlRm9ybWF0LlRleHQpIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZXJyb3IgJiYgbWVzc2FnZS5lcnJvci5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgRXJyb3IgZGF0YTogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLmVycm9yLmRhdGEpfVxcblxcbmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgUmVzdWx0OiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucmVzdWx0KX1cXG5cXG5gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UuZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9ICdObyByZXN1bHQgcmV0dXJuZWQuXFxuXFxuJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFNlbmRpbmcgcmVzcG9uc2UgJyR7bWV0aG9kfSAtICgke21lc3NhZ2UuaWR9KScuIFByb2Nlc3NpbmcgcmVxdWVzdCB0b29rICR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1tc2AsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgnc2VuZC1yZXNwb25zZScsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYWNlUmVjZWl2ZWRSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFjZUZvcm1hdCA9PT0gVHJhY2VGb3JtYXQuVGV4dCkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSAmJiBtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBgUGFyYW1zOiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucGFyYW1zKX1cXG5cXG5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJhY2VyLmxvZyhgUmVjZWl2ZWQgcmVxdWVzdCAnJHttZXNzYWdlLm1ldGhvZH0gLSAoJHttZXNzYWdlLmlkfSknLmAsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1yZXF1ZXN0JywgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdHJhY2VSZWNlaXZlZE5vdGlmaWNhdGlvbihtZXNzYWdlKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIgfHwgbWVzc2FnZS5tZXRob2QgPT09IExvZ1RyYWNlTm90aWZpY2F0aW9uLnR5cGUubWV0aG9kKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYWNlRm9ybWF0ID09PSBUcmFjZUZvcm1hdC5UZXh0KSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdCkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0gYFBhcmFtczogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLnBhcmFtcyl9XFxuXFxuYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSAnTm8gcGFyYW1ldGVycyBwcm92aWRlZC5cXG5cXG4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFJlY2VpdmVkIG5vdGlmaWNhdGlvbiAnJHttZXNzYWdlLm1ldGhvZH0nLmAsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1ub3RpZmljYXRpb24nLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVJlY2VpdmVkUmVzcG9uc2UobWVzc2FnZSwgcmVzcG9uc2VQcm9taXNlKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhY2VGb3JtYXQgPT09IFRyYWNlRm9ybWF0LlRleHQpIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZXJyb3IgJiYgbWVzc2FnZS5lcnJvci5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgRXJyb3IgZGF0YTogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLmVycm9yLmRhdGEpfVxcblxcbmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgUmVzdWx0OiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucmVzdWx0KX1cXG5cXG5gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UuZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9ICdObyByZXN1bHQgcmV0dXJuZWQuXFxuXFxuJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXNwb25zZVByb21pc2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IG1lc3NhZ2UuZXJyb3IgPyBgIFJlcXVlc3QgZmFpbGVkOiAke21lc3NhZ2UuZXJyb3IubWVzc2FnZX0gKCR7bWVzc2FnZS5lcnJvci5jb2RlfSkuYCA6ICcnO1xuICAgICAgICAgICAgICAgIHRyYWNlci5sb2coYFJlY2VpdmVkIHJlc3BvbnNlICcke3Jlc3BvbnNlUHJvbWlzZS5tZXRob2R9IC0gKCR7bWVzc2FnZS5pZH0pJyBpbiAke0RhdGUubm93KCkgLSByZXNwb25zZVByb21pc2UudGltZXJTdGFydH1tcy4ke2Vycm9yfWAsIGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJhY2VyLmxvZyhgUmVjZWl2ZWQgcmVzcG9uc2UgJHttZXNzYWdlLmlkfSB3aXRob3V0IGFjdGl2ZSByZXNwb25zZSBwcm9taXNlLmAsIGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1yZXNwb25zZScsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGxvZ0xTUE1lc3NhZ2UodHlwZSwgbWVzc2FnZSkge1xuICAgICAgICBpZiAoIXRyYWNlciB8fCB0cmFjZSA9PT0gVHJhY2UuT2ZmKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbHNwTWVzc2FnZSA9IHtcbiAgICAgICAgICAgIGlzTFNQTWVzc2FnZTogdHJ1ZSxcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpXG4gICAgICAgIH07XG4gICAgICAgIHRyYWNlci5sb2cobHNwTWVzc2FnZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRocm93SWZDbG9zZWRPckRpc3Bvc2VkKCkge1xuICAgICAgICBpZiAoaXNDbG9zZWQoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IENvbm5lY3Rpb25FcnJvcihDb25uZWN0aW9uRXJyb3JzLkNsb3NlZCwgJ0Nvbm5lY3Rpb24gaXMgY2xvc2VkLicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0Rpc3Bvc2VkKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb25uZWN0aW9uRXJyb3IoQ29ubmVjdGlvbkVycm9ycy5EaXNwb3NlZCwgJ0Nvbm5lY3Rpb24gaXMgZGlzcG9zZWQuJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdGhyb3dJZkxpc3RlbmluZygpIHtcbiAgICAgICAgaWYgKGlzTGlzdGVuaW5nKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb25uZWN0aW9uRXJyb3IoQ29ubmVjdGlvbkVycm9ycy5BbHJlYWR5TGlzdGVuaW5nLCAnQ29ubmVjdGlvbiBpcyBhbHJlYWR5IGxpc3RlbmluZycpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRocm93SWZOb3RMaXN0ZW5pbmcoKSB7XG4gICAgICAgIGlmICghaXNMaXN0ZW5pbmcoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYWxsIGxpc3RlbigpIGZpcnN0LicpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVuZGVmaW5lZFRvTnVsbChwYXJhbSkge1xuICAgICAgICBpZiAocGFyYW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyYW07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gbnVsbFRvVW5kZWZpbmVkKHBhcmFtKSB7XG4gICAgICAgIGlmIChwYXJhbSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJhbTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBpc05hbWVkUGFyYW0ocGFyYW0pIHtcbiAgICAgICAgcmV0dXJuIHBhcmFtICE9PSB1bmRlZmluZWQgJiYgcGFyYW0gIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkocGFyYW0pICYmIHR5cGVvZiBwYXJhbSA9PT0gJ29iamVjdCc7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXB1dGVTaW5nbGVQYXJhbShwYXJhbWV0ZXJTdHJ1Y3R1cmVzLCBwYXJhbSkge1xuICAgICAgICBzd2l0Y2ggKHBhcmFtZXRlclN0cnVjdHVyZXMpIHtcbiAgICAgICAgICAgIGNhc2UgbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG86XG4gICAgICAgICAgICAgICAgaWYgKGlzTmFtZWRQYXJhbShwYXJhbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxUb1VuZGVmaW5lZChwYXJhbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3VuZGVmaW5lZFRvTnVsbChwYXJhbSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZTpcbiAgICAgICAgICAgICAgICBpZiAoIWlzTmFtZWRQYXJhbShwYXJhbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWNlaXZlZCBwYXJhbWV0ZXJzIGJ5IG5hbWUgYnV0IHBhcmFtIGlzIG5vdCBhbiBvYmplY3QgbGl0ZXJhbC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGxUb1VuZGVmaW5lZChwYXJhbSk7XG4gICAgICAgICAgICBjYXNlIG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieVBvc2l0aW9uOlxuICAgICAgICAgICAgICAgIHJldHVybiBbdW5kZWZpbmVkVG9OdWxsKHBhcmFtKV07XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBwYXJhbWV0ZXIgc3RydWN0dXJlICR7cGFyYW1ldGVyU3RydWN0dXJlcy50b1N0cmluZygpfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXB1dGVNZXNzYWdlUGFyYW1zKHR5cGUsIHBhcmFtcykge1xuICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICBjb25zdCBudW1iZXJPZlBhcmFtcyA9IHR5cGUubnVtYmVyT2ZQYXJhbXM7XG4gICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gY29tcHV0ZVNpbmdsZVBhcmFtKHR5cGUucGFyYW1ldGVyU3RydWN0dXJlcywgcGFyYW1zWzBdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoICYmIGkgPCBudW1iZXJPZlBhcmFtczsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHVuZGVmaW5lZFRvTnVsbChwYXJhbXNbaV0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPCBudW1iZXJPZlBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gcGFyYW1zLmxlbmd0aDsgaSA8IG51bWJlck9mUGFyYW1zOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB7XG4gICAgICAgIHNlbmROb3RpZmljYXRpb246ICh0eXBlLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlUGFyYW1zO1xuICAgICAgICAgICAgaWYgKElzLnN0cmluZyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICAgIGxldCBwYXJhbVN0YXJ0ID0gMDtcbiAgICAgICAgICAgICAgICBsZXQgcGFyYW1ldGVyU3RydWN0dXJlcyA9IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvO1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuaXMoZmlyc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtU3RhcnQgPSAxO1xuICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gZmlyc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBwYXJhbUVuZCA9IGFyZ3MubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gcGFyYW1FbmQgLSBwYXJhbVN0YXJ0O1xuICAgICAgICAgICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zID0gY29tcHV0ZVNpbmdsZVBhcmFtKHBhcmFtZXRlclN0cnVjdHVyZXMsIGFyZ3NbcGFyYW1TdGFydF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjZWl2ZWQgJHtudW1iZXJPZlBhcmFtc30gcGFyYW1ldGVycyBmb3IgJ2J5IE5hbWUnIG5vdGlmaWNhdGlvbiBwYXJhbWV0ZXIgc3RydWN0dXJlLmApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IGFyZ3Muc2xpY2UocGFyYW1TdGFydCwgcGFyYW1FbmQpLm1hcCh2YWx1ZSA9PiB1bmRlZmluZWRUb051bGwodmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IGFyZ3M7XG4gICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZS5tZXRob2Q7XG4gICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IGNvbXB1dGVNZXNzYWdlUGFyYW1zKHR5cGUsIHBhcmFtcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBub3RpZmljYXRpb25NZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBtZXNzYWdlUGFyYW1zXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdHJhY2VTZW5kaW5nTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbk1lc3NhZ2UpO1xuICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2VXcml0ZXIud3JpdGUobm90aWZpY2F0aW9uTWVzc2FnZSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBTZW5kaW5nIG5vdGlmaWNhdGlvbiBmYWlsZWQuYCk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25Ob3RpZmljYXRpb246ICh0eXBlLCBoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGlmIChJcy5mdW5jKHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB0eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaGFuZGxlcikge1xuICAgICAgICAgICAgICAgIGlmIChJcy5zdHJpbmcodHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZTtcbiAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uSGFuZGxlcnMuc2V0KHR5cGUsIHsgdHlwZTogdW5kZWZpbmVkLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZS5tZXRob2Q7XG4gICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXJzLnNldCh0eXBlLm1ldGhvZCwgeyB0eXBlLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXJzLmRlbGV0ZShtZXRob2QpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBvblByb2dyZXNzOiAoX3R5cGUsIHRva2VuLCBoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgICBpZiAocHJvZ3Jlc3NIYW5kbGVycy5oYXModG9rZW4pKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm9ncmVzcyBoYW5kbGVyIGZvciB0b2tlbiAke3Rva2VufSBhbHJlYWR5IHJlZ2lzdGVyZWRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByb2dyZXNzSGFuZGxlcnMuc2V0KHRva2VuLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc0hhbmRsZXJzLmRlbGV0ZSh0b2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgc2VuZFByb2dyZXNzOiAoX3R5cGUsIHRva2VuLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGF3YWl0IGJ1dCBzaW1wbGUgcmV0dXJuIHRvIGVuc3VyZSB0aGF0IHdlIGRvbid0IGhhdmUgYW5vdGhlclxuICAgICAgICAgICAgLy8gYXN5bmMgc2NoZWR1bGluZy4gT3RoZXJ3aXNlIG9uZSBzZW5kIGNvdWxkIG92ZXJ0YWtlIGFub3RoZXIgc2VuZC5cbiAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLnNlbmROb3RpZmljYXRpb24oUHJvZ3Jlc3NOb3RpZmljYXRpb24udHlwZSwgeyB0b2tlbiwgdmFsdWUgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uVW5oYW5kbGVkUHJvZ3Jlc3M6IHVuaGFuZGxlZFByb2dyZXNzRW1pdHRlci5ldmVudCxcbiAgICAgICAgc2VuZFJlcXVlc3Q6ICh0eXBlLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgdGhyb3dJZk5vdExpc3RlbmluZygpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlUGFyYW1zO1xuICAgICAgICAgICAgbGV0IHRva2VuID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKElzLnN0cmluZyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3QgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgbGV0IHBhcmFtU3RhcnQgPSAwO1xuICAgICAgICAgICAgICAgIGxldCBwYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG87XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5pcyhmaXJzdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1TdGFydCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlclN0cnVjdHVyZXMgPSBmaXJzdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHBhcmFtRW5kID0gYXJncy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuLmlzKGxhc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtRW5kID0gcGFyYW1FbmQgLSAxO1xuICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IGxhc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gcGFyYW1FbmQgLSBwYXJhbVN0YXJ0O1xuICAgICAgICAgICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zID0gY29tcHV0ZVNpbmdsZVBhcmFtKHBhcmFtZXRlclN0cnVjdHVyZXMsIGFyZ3NbcGFyYW1TdGFydF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjZWl2ZWQgJHtudW1iZXJPZlBhcmFtc30gcGFyYW1ldGVycyBmb3IgJ2J5IE5hbWUnIHJlcXVlc3QgcGFyYW1ldGVyIHN0cnVjdHVyZS5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMgPSBhcmdzLnNsaWNlKHBhcmFtU3RhcnQsIHBhcmFtRW5kKS5tYXAodmFsdWUgPT4gdW5kZWZpbmVkVG9OdWxsKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBhcmdzO1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGUubWV0aG9kO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMgPSBjb21wdXRlTWVzc2FnZVBhcmFtcyh0eXBlLCBwYXJhbXMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gdHlwZS5udW1iZXJPZlBhcmFtcztcbiAgICAgICAgICAgICAgICB0b2tlbiA9IGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuLmlzKHBhcmFtc1tudW1iZXJPZlBhcmFtc10pID8gcGFyYW1zW251bWJlck9mUGFyYW1zXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGlkID0gc2VxdWVuY2VOdW1iZXIrKztcbiAgICAgICAgICAgIGxldCBkaXNwb3NhYmxlO1xuICAgICAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgICAgICAgZGlzcG9zYWJsZSA9IHRva2VuLm9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcCA9IGNhbmNlbGxhdGlvblN0cmF0ZWd5LnNlbmRlci5zZW5kQ2FuY2VsbGF0aW9uKGNvbm5lY3Rpb24sIGlkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhgUmVjZWl2ZWQgbm8gcHJvbWlzZSBmcm9tIGNhbmNlbGxhdGlvbiBzdHJhdGVneSB3aGVuIGNhbmNlbGxpbmcgaWQgJHtpZH1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIubG9nKGBTZW5kaW5nIGNhbmNlbGxhdGlvbiBtZXNzYWdlcyBmb3IgaWQgJHtpZH0gZmFpbGVkYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdE1lc3NhZ2UgPSB7XG4gICAgICAgICAgICAgICAganNvbnJwYzogdmVyc2lvbixcbiAgICAgICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBtZXNzYWdlUGFyYW1zXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdHJhY2VTZW5kaW5nUmVxdWVzdChyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNhbmNlbGxhdGlvblN0cmF0ZWd5LnNlbmRlci5lbmFibGVDYW5jZWxsYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25TdHJhdGVneS5zZW5kZXIuZW5hYmxlQ2FuY2VsbGF0aW9uKHJlcXVlc3RNZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZVdpdGhDbGVhbnVwID0gKHIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyKTtcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uU3RyYXRlZ3kuc2VuZGVyLmNsZWFudXAoaWQpO1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlPy5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWplY3RXaXRoQ2xlYW51cCA9IChyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChyKTtcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uU3RyYXRlZ3kuc2VuZGVyLmNsZWFudXAoaWQpO1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlPy5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZVByb21pc2UgPSB7IG1ldGhvZDogbWV0aG9kLCB0aW1lclN0YXJ0OiBEYXRlLm5vdygpLCByZXNvbHZlOiByZXNvbHZlV2l0aENsZWFudXAsIHJlamVjdDogcmVqZWN0V2l0aENsZWFudXAgfTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2VzLnNldChpZCwgcmVzcG9uc2VQcm9taXNlKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbWVzc2FnZVdyaXRlci53cml0ZShyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAvLyBXcml0aW5nIHRoZSBtZXNzYWdlIGZhaWxlZC4gU28gd2UgbmVlZCB0byBkZWxldGUgaXQgZnJvbSB0aGUgcmVzcG9uc2UgcHJvbWlzZXMgYW5kXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlamVjdCBpdC5cbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlcy5kZWxldGUoaWQpO1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2UucmVqZWN0KG5ldyBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IobWVzc2FnZXNfMS5FcnJvckNvZGVzLk1lc3NhZ2VXcml0ZUVycm9yLCBlcnJvci5tZXNzYWdlID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIHJlYXNvbicpKTtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlcXVlc3QgZmFpbGVkLmApO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25SZXF1ZXN0OiAodHlwZSwgaGFuZGxlcikgPT4ge1xuICAgICAgICAgICAgdGhyb3dJZkNsb3NlZE9yRGlzcG9zZWQoKTtcbiAgICAgICAgICAgIGxldCBtZXRob2QgPSBudWxsO1xuICAgICAgICAgICAgaWYgKFN0YXJSZXF1ZXN0SGFuZGxlci5pcyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBzdGFyUmVxdWVzdEhhbmRsZXIgPSB0eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoSXMuc3RyaW5nKHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgbWV0aG9kID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoaGFuZGxlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RIYW5kbGVycy5zZXQodHlwZSwgeyBoYW5kbGVyOiBoYW5kbGVyLCB0eXBlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSB0eXBlLm1ldGhvZDtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEhhbmRsZXJzLnNldCh0eXBlLm1ldGhvZCwgeyB0eXBlLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SGFuZGxlcnMuZGVsZXRlKG1ldGhvZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFyUmVxdWVzdEhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBoYXNQZW5kaW5nUmVzcG9uc2U6ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZVByb21pc2VzLnNpemUgPiAwO1xuICAgICAgICB9LFxuICAgICAgICB0cmFjZTogYXN5bmMgKF92YWx1ZSwgX3RyYWNlciwgc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBsZXQgX3NlbmROb3RpZmljYXRpb24gPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBfdHJhY2VGb3JtYXQgPSBUcmFjZUZvcm1hdC5UZXh0O1xuICAgICAgICAgICAgaWYgKHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKElzLmJvb2xlYW4oc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zKSkge1xuICAgICAgICAgICAgICAgICAgICBfc2VuZE5vdGlmaWNhdGlvbiA9IHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF9zZW5kTm90aWZpY2F0aW9uID0gc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zLnNlbmROb3RpZmljYXRpb24gfHwgZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIF90cmFjZUZvcm1hdCA9IHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucy50cmFjZUZvcm1hdCB8fCBUcmFjZUZvcm1hdC5UZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlID0gX3ZhbHVlO1xuICAgICAgICAgICAgdHJhY2VGb3JtYXQgPSBfdHJhY2VGb3JtYXQ7XG4gICAgICAgICAgICBpZiAodHJhY2UgPT09IFRyYWNlLk9mZikge1xuICAgICAgICAgICAgICAgIHRyYWNlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRyYWNlciA9IF90cmFjZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoX3NlbmROb3RpZmljYXRpb24gJiYgIWlzQ2xvc2VkKCkgJiYgIWlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGNvbm5lY3Rpb24uc2VuZE5vdGlmaWNhdGlvbihTZXRUcmFjZU5vdGlmaWNhdGlvbi50eXBlLCB7IHZhbHVlOiBUcmFjZS50b1N0cmluZyhfdmFsdWUpIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBvbkVycm9yOiBlcnJvckVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIG9uQ2xvc2U6IGNsb3NlRW1pdHRlci5ldmVudCxcbiAgICAgICAgb25VbmhhbmRsZWROb3RpZmljYXRpb246IHVuaGFuZGxlZE5vdGlmaWNhdGlvbkVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIG9uRGlzcG9zZTogZGlzcG9zZUVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIGVuZDogKCkgPT4ge1xuICAgICAgICAgICAgbWVzc2FnZVdyaXRlci5lbmQoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLkRpc3Bvc2VkO1xuICAgICAgICAgICAgZGlzcG9zZUVtaXR0ZXIuZmlyZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5QZW5kaW5nUmVzcG9uc2VSZWplY3RlZCwgJ1BlbmRpbmcgcmVzcG9uc2UgcmVqZWN0ZWQgc2luY2UgY29ubmVjdGlvbiBnb3QgZGlzcG9zZWQnKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvbWlzZSBvZiByZXNwb25zZVByb21pc2VzLnZhbHVlcygpKSB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBrbm93bkNhbmNlbGVkUmVxdWVzdHMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICBtZXNzYWdlUXVldWUgPSBuZXcgbGlua2VkTWFwXzEuTGlua2VkTWFwKCk7XG4gICAgICAgICAgICAvLyBUZXN0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgaWYgKElzLmZ1bmMobWVzc2FnZVdyaXRlci5kaXNwb3NlKSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKElzLmZ1bmMobWVzc2FnZVJlYWRlci5kaXNwb3NlKSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VSZWFkZXIuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBsaXN0ZW46ICgpID0+IHtcbiAgICAgICAgICAgIHRocm93SWZDbG9zZWRPckRpc3Bvc2VkKCk7XG4gICAgICAgICAgICB0aHJvd0lmTGlzdGVuaW5nKCk7XG4gICAgICAgICAgICBzdGF0ZSA9IENvbm5lY3Rpb25TdGF0ZS5MaXN0ZW5pbmc7XG4gICAgICAgICAgICBtZXNzYWdlUmVhZGVyLmxpc3RlbihjYWxsYmFjayk7XG4gICAgICAgIH0sXG4gICAgICAgIGluc3BlY3Q6ICgpID0+IHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS5jb25zb2xlLmxvZygnaW5zcGVjdCcpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25uZWN0aW9uLm9uTm90aWZpY2F0aW9uKExvZ1RyYWNlTm90aWZpY2F0aW9uLnR5cGUsIChwYXJhbXMpID0+IHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZlcmJvc2UgPSB0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdDtcbiAgICAgICAgdHJhY2VyLmxvZyhwYXJhbXMubWVzc2FnZSwgdmVyYm9zZSA/IHBhcmFtcy52ZXJib3NlIDogdW5kZWZpbmVkKTtcbiAgICB9KTtcbiAgICBjb25uZWN0aW9uLm9uTm90aWZpY2F0aW9uKFByb2dyZXNzTm90aWZpY2F0aW9uLnR5cGUsIChwYXJhbXMpID0+IHtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IHByb2dyZXNzSGFuZGxlcnMuZ2V0KHBhcmFtcy50b2tlbik7XG4gICAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICAgICBoYW5kbGVyKHBhcmFtcy52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1bmhhbmRsZWRQcm9ncmVzc0VtaXR0ZXIuZmlyZShwYXJhbXMpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbm5lY3Rpb247XG59XG5leHBvcnRzLmNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uID0gY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb247XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vdHlwaW5ncy90aGVuYWJsZS5kLnRzXCIgLz5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUHJvZ3Jlc3NUeXBlID0gZXhwb3J0cy5Qcm9ncmVzc1Rva2VuID0gZXhwb3J0cy5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiA9IGV4cG9ydHMuTnVsbExvZ2dlciA9IGV4cG9ydHMuQ29ubmVjdGlvbk9wdGlvbnMgPSBleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IGV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlQnVmZmVyID0gZXhwb3J0cy5Xcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyID0gZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLk1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLlJlYWRhYmxlU3RyZWFtTWVzc2FnZVJlYWRlciA9IGV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlUmVhZGVyID0gZXhwb3J0cy5NZXNzYWdlUmVhZGVyID0gZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblRva2VuID0gZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IGV4cG9ydHMuRW1pdHRlciA9IGV4cG9ydHMuRXZlbnQgPSBleHBvcnRzLkRpc3Bvc2FibGUgPSBleHBvcnRzLkxSVUNhY2hlID0gZXhwb3J0cy5Ub3VjaCA9IGV4cG9ydHMuTGlua2VkTWFwID0gZXhwb3J0cy5QYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlOSA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTggPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU3ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNiA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTUgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU0ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMyA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTIgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUxID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMCA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZSA9IGV4cG9ydHMuRXJyb3JDb2RlcyA9IGV4cG9ydHMuUmVzcG9uc2VFcnJvciA9IGV4cG9ydHMuUmVxdWVzdFR5cGU5ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTggPSBleHBvcnRzLlJlcXVlc3RUeXBlNyA9IGV4cG9ydHMuUmVxdWVzdFR5cGU2ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTUgPSBleHBvcnRzLlJlcXVlc3RUeXBlNCA9IGV4cG9ydHMuUmVxdWVzdFR5cGUzID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTIgPSBleHBvcnRzLlJlcXVlc3RUeXBlMSA9IGV4cG9ydHMuUmVxdWVzdFR5cGUwID0gZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IGV4cG9ydHMuTWVzc2FnZSA9IGV4cG9ydHMuUkFMID0gdm9pZCAwO1xuZXhwb3J0cy5NZXNzYWdlU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblN0cmF0ZWd5ID0gZXhwb3J0cy5DYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IGV4cG9ydHMuQ29ubmVjdGlvbkVycm9yID0gZXhwb3J0cy5Db25uZWN0aW9uRXJyb3JzID0gZXhwb3J0cy5Mb2dUcmFjZU5vdGlmaWNhdGlvbiA9IGV4cG9ydHMuU2V0VHJhY2VOb3RpZmljYXRpb24gPSBleHBvcnRzLlRyYWNlRm9ybWF0ID0gZXhwb3J0cy5UcmFjZVZhbHVlcyA9IGV4cG9ydHMuVHJhY2UgPSB2b2lkIDA7XG5jb25zdCBtZXNzYWdlc18xID0gcmVxdWlyZShcIi4vbWVzc2FnZXNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNZXNzYWdlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk1lc3NhZ2U7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlMFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTA7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTFcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGUxOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGUyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlMjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlM1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGU0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGU1XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlNTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlNlwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTY7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTdcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGU3OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGU4XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlODsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlOVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTk7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXNwb25zZUVycm9yXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3I7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJFcnJvckNvZGVzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLkVycm9yQ29kZXM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlMFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlMDsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGUxXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGUxOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZTJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlM1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlMzsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGU0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZTVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlNlwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlNjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGU3XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU3OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZThcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTg7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlOVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlOTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlBhcmFtZXRlclN0cnVjdHVyZXNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlczsgfSB9KTtcbmNvbnN0IGxpbmtlZE1hcF8xID0gcmVxdWlyZShcIi4vbGlua2VkTWFwXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTGlua2VkTWFwXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBsaW5rZWRNYXBfMS5MaW5rZWRNYXA7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJMUlVDYWNoZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbGlua2VkTWFwXzEuTFJVQ2FjaGU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJUb3VjaFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbGlua2VkTWFwXzEuVG91Y2g7IH0gfSk7XG5jb25zdCBkaXNwb3NhYmxlXzEgPSByZXF1aXJlKFwiLi9kaXNwb3NhYmxlXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiRGlzcG9zYWJsZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZGlzcG9zYWJsZV8xLkRpc3Bvc2FibGU7IH0gfSk7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCIuL2V2ZW50c1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkV2ZW50XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBldmVudHNfMS5FdmVudDsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkVtaXR0ZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGV2ZW50c18xLkVtaXR0ZXI7IH0gfSk7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblRva2VuU291cmNlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjYW5jZWxsYXRpb25fMS5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblRva2VuXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjYW5jZWxsYXRpb25fMS5DYW5jZWxsYXRpb25Ub2tlbjsgfSB9KTtcbmNvbnN0IHNoYXJlZEFycmF5Q2FuY2VsbGF0aW9uXzEgPSByZXF1aXJlKFwiLi9zaGFyZWRBcnJheUNhbmNlbGxhdGlvblwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHNoYXJlZEFycmF5Q2FuY2VsbGF0aW9uXzEuU2hhcmVkQXJyYXlTZW5kZXJTdHJhdGVneTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlNoYXJlZEFycmF5UmVjZWl2ZXJTdHJhdGVneVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gc2hhcmVkQXJyYXlDYW5jZWxsYXRpb25fMS5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3k7IH0gfSk7XG5jb25zdCBtZXNzYWdlUmVhZGVyXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlUmVhZGVyXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTWVzc2FnZVJlYWRlclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZVJlYWRlcl8xLk1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VSZWFkZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VSZWFkZXJfMS5BYnN0cmFjdE1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VSZWFkZXJfMS5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5jb25zdCBtZXNzYWdlV3JpdGVyXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlV3JpdGVyXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTWVzc2FnZVdyaXRlclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZVdyaXRlcl8xLk1lc3NhZ2VXcml0ZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VXcml0ZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VXcml0ZXJfMS5BYnN0cmFjdE1lc3NhZ2VXcml0ZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJXcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlV3JpdGVyXzEuV3JpdGVhYmxlU3RyZWFtTWVzc2FnZVdyaXRlcjsgfSB9KTtcbmNvbnN0IG1lc3NhZ2VCdWZmZXJfMSA9IHJlcXVpcmUoXCIuL21lc3NhZ2VCdWZmZXJcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VCdWZmZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VCdWZmZXJfMS5BYnN0cmFjdE1lc3NhZ2VCdWZmZXI7IH0gfSk7XG5jb25zdCBjb25uZWN0aW9uXzEgPSByZXF1aXJlKFwiLi9jb25uZWN0aW9uXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29ubmVjdGlvblN0cmF0ZWd5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ29ubmVjdGlvblN0cmF0ZWd5OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29ubmVjdGlvbk9wdGlvbnNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5Db25uZWN0aW9uT3B0aW9uczsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk51bGxMb2dnZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5OdWxsTG9nZ2VyOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb25cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlByb2dyZXNzVG9rZW5cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5Qcm9ncmVzc1Rva2VuOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUHJvZ3Jlc3NUeXBlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuUHJvZ3Jlc3NUeXBlOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiVHJhY2VcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5UcmFjZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlRyYWNlVmFsdWVzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuVHJhY2VWYWx1ZXM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJUcmFjZUZvcm1hdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29ubmVjdGlvbl8xLlRyYWNlRm9ybWF0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiU2V0VHJhY2VOb3RpZmljYXRpb25cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5TZXRUcmFjZU5vdGlmaWNhdGlvbjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkxvZ1RyYWNlTm90aWZpY2F0aW9uXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuTG9nVHJhY2VOb3RpZmljYXRpb247IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJDb25uZWN0aW9uRXJyb3JzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ29ubmVjdGlvbkVycm9yczsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNvbm5lY3Rpb25FcnJvclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29ubmVjdGlvbl8xLkNvbm5lY3Rpb25FcnJvcjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5DYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5DYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblN0cmF0ZWd5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ2FuY2VsbGF0aW9uU3RyYXRlZ3k7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNZXNzYWdlU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5NZXNzYWdlU3RyYXRlZ3k7IH0gfSk7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbmV4cG9ydHMuUkFMID0gcmFsXzEuZGVmYXVsdDtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGFwaV8xID0gcmVxdWlyZShcIi4uL2NvbW1vbi9hcGlcIik7XG5jbGFzcyBNZXNzYWdlQnVmZmVyIGV4dGVuZHMgYXBpXzEuQWJzdHJhY3RNZXNzYWdlQnVmZmVyIHtcbiAgICBjb25zdHJ1Y3RvcihlbmNvZGluZyA9ICd1dGYtOCcpIHtcbiAgICAgICAgc3VwZXIoZW5jb2RpbmcpO1xuICAgICAgICB0aGlzLmFzY2lpRGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcignYXNjaWknKTtcbiAgICB9XG4gICAgZW1wdHlCdWZmZXIoKSB7XG4gICAgICAgIHJldHVybiBNZXNzYWdlQnVmZmVyLmVtcHR5QnVmZmVyO1xuICAgIH1cbiAgICBmcm9tU3RyaW5nKHZhbHVlLCBfZW5jb2RpbmcpIHtcbiAgICAgICAgcmV0dXJuIChuZXcgVGV4dEVuY29kZXIoKSkuZW5jb2RlKHZhbHVlKTtcbiAgICB9XG4gICAgdG9TdHJpbmcodmFsdWUsIGVuY29kaW5nKSB7XG4gICAgICAgIGlmIChlbmNvZGluZyA9PT0gJ2FzY2lpJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXNjaWlEZWNvZGVyLmRlY29kZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gKG5ldyBUZXh0RGVjb2RlcihlbmNvZGluZykpLmRlY29kZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXNOYXRpdmUoYnVmZmVyLCBsZW5ndGgpIHtcbiAgICAgICAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlci5zbGljZSgwLCBsZW5ndGgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFsbG9jTmF0aXZlKGxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTtcbiAgICB9XG59XG5NZXNzYWdlQnVmZmVyLmVtcHR5QnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMCk7XG5jbGFzcyBSZWFkYWJsZVN0cmVhbVdyYXBwZXIge1xuICAgIGNvbnN0cnVjdG9yKHNvY2tldCkge1xuICAgICAgICB0aGlzLnNvY2tldCA9IHNvY2tldDtcbiAgICAgICAgdGhpcy5fb25EYXRhID0gbmV3IGFwaV8xLkVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5fbWVzc2FnZUxpc3RlbmVyID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBibG9iID0gZXZlbnQuZGF0YTtcbiAgICAgICAgICAgIGJsb2IuYXJyYXlCdWZmZXIoKS50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkRhdGEuZmlyZShuZXcgVWludDhBcnJheShidWZmZXIpKTtcbiAgICAgICAgICAgIH0sICgpID0+IHtcbiAgICAgICAgICAgICAgICAoMCwgYXBpXzEuUkFMKSgpLmNvbnNvbGUuZXJyb3IoYENvbnZlcnRpbmcgYmxvYiB0byBhcnJheSBidWZmZXIgZmFpbGVkLmApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLl9tZXNzYWdlTGlzdGVuZXIpO1xuICAgIH1cbiAgICBvbkNsb3NlKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2Nsb3NlJywgbGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gYXBpXzEuRGlzcG9zYWJsZS5jcmVhdGUoKCkgPT4gdGhpcy5zb2NrZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xvc2UnLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkVycm9yKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgbGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gYXBpXzEuRGlzcG9zYWJsZS5jcmVhdGUoKCkgPT4gdGhpcy5zb2NrZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkVuZChsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKCdlbmQnLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdlbmQnLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkRhdGEobGlzdGVuZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uRGF0YS5ldmVudChsaXN0ZW5lcik7XG4gICAgfVxufVxuY2xhc3MgV3JpdGFibGVTdHJlYW1XcmFwcGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihzb2NrZXQpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7XG4gICAgfVxuICAgIG9uQ2xvc2UobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignY2xvc2UnLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbG9zZScsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIG9uRXJyb3IobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIG9uRW5kKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2VuZCcsIGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIGFwaV8xLkRpc3Bvc2FibGUuY3JlYXRlKCgpID0+IHRoaXMuc29ja2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2VuZCcsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIHdyaXRlKGRhdGEsIGVuY29kaW5nKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkICYmIGVuY29kaW5nICE9PSAndXRmLTgnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbiBhIEJyb3dzZXIgZW52aXJvbm1lbnRzIG9ubHkgdXRmLTggdGV4dCBlbmNvZGluZyBpcyBzdXBwb3J0ZWQuIEJ1dCBnb3QgZW5jb2Rpbmc6ICR7ZW5jb2Rpbmd9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKTtcbiAgICB9XG59XG5jb25zdCBfdGV4dEVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbmNvbnN0IF9yaWwgPSBPYmplY3QuZnJlZXplKHtcbiAgICBtZXNzYWdlQnVmZmVyOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgY3JlYXRlOiAoZW5jb2RpbmcpID0+IG5ldyBNZXNzYWdlQnVmZmVyKGVuY29kaW5nKVxuICAgIH0pLFxuICAgIGFwcGxpY2F0aW9uSnNvbjogT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGVuY29kZXI6IE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgbmFtZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgZW5jb2RlOiAobXNnLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2hhcnNldCAhPT0gJ3V0Zi04Jykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluIGEgQnJvd3NlciBlbnZpcm9ubWVudHMgb25seSB1dGYtOCB0ZXh0IGVuY29kaW5nIGlzIHN1cHBvcnRlZC4gQnV0IGdvdCBlbmNvZGluZzogJHtvcHRpb25zLmNoYXJzZXR9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoX3RleHRFbmNvZGVyLmVuY29kZShKU09OLnN0cmluZ2lmeShtc2csIHVuZGVmaW5lZCwgMCkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIGRlY29kZXI6IE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgbmFtZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgZGVjb2RlOiAoYnVmZmVyLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCEoYnVmZmVyIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbiBhIEJyb3dzZXIgZW52aXJvbm1lbnRzIG9ubHkgVWludDhBcnJheXMgYXJlIHN1cHBvcnRlZC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShKU09OLnBhcnNlKG5ldyBUZXh0RGVjb2RlcihvcHRpb25zLmNoYXJzZXQpLmRlY29kZShidWZmZXIpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfSksXG4gICAgc3RyZWFtOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgYXNSZWFkYWJsZVN0cmVhbTogKHNvY2tldCkgPT4gbmV3IFJlYWRhYmxlU3RyZWFtV3JhcHBlcihzb2NrZXQpLFxuICAgICAgICBhc1dyaXRhYmxlU3RyZWFtOiAoc29ja2V0KSA9PiBuZXcgV3JpdGFibGVTdHJlYW1XcmFwcGVyKHNvY2tldClcbiAgICB9KSxcbiAgICBjb25zb2xlOiBjb25zb2xlLFxuICAgIHRpbWVyOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgc2V0VGltZW91dChjYWxsYmFjaywgbXMsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHNldFRpbWVvdXQoY2FsbGJhY2ssIG1zLCAuLi5hcmdzKTtcbiAgICAgICAgICAgIHJldHVybiB7IGRpc3Bvc2U6ICgpID0+IGNsZWFyVGltZW91dChoYW5kbGUpIH07XG4gICAgICAgIH0sXG4gICAgICAgIHNldEltbWVkaWF0ZShjYWxsYmFjaywgLi4uYXJncykge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gc2V0VGltZW91dChjYWxsYmFjaywgMCwgLi4uYXJncyk7XG4gICAgICAgICAgICByZXR1cm4geyBkaXNwb3NlOiAoKSA9PiBjbGVhclRpbWVvdXQoaGFuZGxlKSB9O1xuICAgICAgICB9LFxuICAgICAgICBzZXRJbnRlcnZhbChjYWxsYmFjaywgbXMsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHNldEludGVydmFsKGNhbGxiYWNrLCBtcywgLi4uYXJncyk7XG4gICAgICAgICAgICByZXR1cm4geyBkaXNwb3NlOiAoKSA9PiBjbGVhckludGVydmFsKGhhbmRsZSkgfTtcbiAgICAgICAgfSxcbiAgICB9KVxufSk7XG5mdW5jdGlvbiBSSUwoKSB7XG4gICAgcmV0dXJuIF9yaWw7XG59XG4oZnVuY3Rpb24gKFJJTCkge1xuICAgIGZ1bmN0aW9uIGluc3RhbGwoKSB7XG4gICAgICAgIGFwaV8xLlJBTC5pbnN0YWxsKF9yaWwpO1xuICAgIH1cbiAgICBSSUwuaW5zdGFsbCA9IGluc3RhbGw7XG59KShSSUwgfHwgKFJJTCA9IHt9KSk7XG5leHBvcnRzLmRlZmF1bHQgPSBSSUw7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24gPSBleHBvcnRzLkJyb3dzZXJNZXNzYWdlV3JpdGVyID0gZXhwb3J0cy5Ccm93c2VyTWVzc2FnZVJlYWRlciA9IHZvaWQgMDtcbmNvbnN0IHJpbF8xID0gcmVxdWlyZShcIi4vcmlsXCIpO1xuLy8gSW5zdGFsbCB0aGUgYnJvd3NlciBydW50aW1lIGFic3RyYWN0LlxucmlsXzEuZGVmYXVsdC5pbnN0YWxsKCk7XG5jb25zdCBhcGlfMSA9IHJlcXVpcmUoXCIuLi9jb21tb24vYXBpXCIpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuLi9jb21tb24vYXBpXCIpLCBleHBvcnRzKTtcbmNsYXNzIEJyb3dzZXJNZXNzYWdlUmVhZGVyIGV4dGVuZHMgYXBpXzEuQWJzdHJhY3RNZXNzYWdlUmVhZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihwb3J0KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX29uRGF0YSA9IG5ldyBhcGlfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuX21lc3NhZ2VMaXN0ZW5lciA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fb25EYXRhLmZpcmUoZXZlbnQuZGF0YSk7XG4gICAgICAgIH07XG4gICAgICAgIHBvcnQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoZXZlbnQpID0+IHRoaXMuZmlyZUVycm9yKGV2ZW50KSk7XG4gICAgICAgIHBvcnQub25tZXNzYWdlID0gdGhpcy5fbWVzc2FnZUxpc3RlbmVyO1xuICAgIH1cbiAgICBsaXN0ZW4oY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uRGF0YS5ldmVudChjYWxsYmFjayk7XG4gICAgfVxufVxuZXhwb3J0cy5Ccm93c2VyTWVzc2FnZVJlYWRlciA9IEJyb3dzZXJNZXNzYWdlUmVhZGVyO1xuY2xhc3MgQnJvd3Nlck1lc3NhZ2VXcml0ZXIgZXh0ZW5kcyBhcGlfMS5BYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKHBvcnQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50ID0gMDtcbiAgICAgICAgcG9ydC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIChldmVudCkgPT4gdGhpcy5maXJlRXJyb3IoZXZlbnQpKTtcbiAgICB9XG4gICAgd3JpdGUobXNnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnBvcnQucG9zdE1lc3NhZ2UobXNnKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IsIG1zZyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZUVycm9yKGVycm9yLCBtc2cpIHtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50Kys7XG4gICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yLCBtc2csIHRoaXMuZXJyb3JDb3VudCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICB9XG59XG5leHBvcnRzLkJyb3dzZXJNZXNzYWdlV3JpdGVyID0gQnJvd3Nlck1lc3NhZ2VXcml0ZXI7XG5mdW5jdGlvbiBjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbihyZWFkZXIsIHdyaXRlciwgbG9nZ2VyLCBvcHRpb25zKSB7XG4gICAgaWYgKGxvZ2dlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxvZ2dlciA9IGFwaV8xLk51bGxMb2dnZXI7XG4gICAgfVxuICAgIGlmIChhcGlfMS5Db25uZWN0aW9uU3RyYXRlZ3kuaXMob3B0aW9ucykpIHtcbiAgICAgICAgb3B0aW9ucyA9IHsgY29ubmVjdGlvblN0cmF0ZWd5OiBvcHRpb25zIH07XG4gICAgfVxuICAgIHJldHVybiAoMCwgYXBpXzEuY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24pKHJlYWRlciwgd3JpdGVyLCBsb2dnZXIsIG9wdGlvbnMpO1xufVxuZXhwb3J0cy5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiA9IGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uO1xuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL2Jyb3dzZXIvbWFpbicpOyIsICIvKlxuICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMjYgRWNsaXBzZSBEaXJpZ2libGUgY29udHJpYnV0b3JzXG4gKlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlXG4gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2Mi4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG4gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MjAuaHRtbFxuICpcbiAqIFNQRFgtRmlsZUNvcHlyaWdodFRleHQ6IEVjbGlwc2UgRGlyaWdpYmxlIGNvbnRyaWJ1dG9ycyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbi8qKlxuICogSmF2YSBMU1AgY2xpZW50IGJ1bmRsZS5cbiAqXG4gKiBVc2VzIHZzY29kZS13cy1qc29ucnBjIGZvciB0eXBlZCBKU09OLVJQQyBvdmVyIFdlYlNvY2tldCBhbmQgcmVnaXN0ZXJzIE1vbmFjb1xuICogcHJvdmlkZXJzIHRoYXQgZGVsZWdhdGUgdG8gSkRULkxTLiBFeHBvc2VkIGFzIGdsb2JhbCBKYXZhTHNwQ2xpZW50TGliIHNvIHRoYXRcbiAqIGVkaXRvci5qcyBjYW4gY2FsbCBKYXZhTHNwQ2xpZW50TGliLmNvbm5lY3QocmVzb3VyY2VQYXRoKS5cbiAqXG4gKiBPbmUgSkRULkxTIHByb2Nlc3MgY292ZXJzIHRoZSBlbnRpcmUgd29ya3NwYWNlLCBzbyBhIHNpbmdsZSBXZWJTb2NrZXQgY29ubmVjdGlvblxuICogaXMgc2hhcmVkIGFjcm9zcyBhbGwgSmF2YSBmaWxlcyBvcGVuIGluIHRoZSBzYW1lIGJyb3dzZXIgcGFnZS4gVGhlIGNvbm5lY3Rpb24gaXNcbiAqIGVzdGFibGlzaGVkIG9uIHRoZSBmaXJzdCBjb25uZWN0KCkgY2FsbCBhbmQgcmV1c2VkIGZvciBhbGwgc3Vic2VxdWVudCBjYWxscy5cbiAqXG4gKiBlZGl0b3IuanMgc2V0cyB3aW5kb3cubW9uYWNvIGJlZm9yZSBjYWxsaW5nIGNvbm5lY3QoKSwgc28gdGhlIG1vbmFjby1zaGltJ3MgbGF6eVxuICogUHJveGllcyByZXNvbHZlIGNvcnJlY3RseSBhdCBjYWxsIHRpbWUuXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24sIE1lc3NhZ2VDb25uZWN0aW9uIH0gZnJvbSAndnNjb2RlLWpzb25ycGMvYnJvd3Nlcic7XG5pbXBvcnQgeyB0b1NvY2tldCwgV2ViU29ja2V0TWVzc2FnZVJlYWRlciwgV2ViU29ja2V0TWVzc2FnZVdyaXRlciB9IGZyb20gJ3ZzY29kZS13cy1qc29ucnBjJztcbmltcG9ydCAqIGFzIG1vbmFjbyBmcm9tICdtb25hY28tZWRpdG9yJztcbmltcG9ydCB7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLFxuICAgIERpYWdub3N0aWNTZXZlcml0eSxcbiAgICBJbnNlcnRUZXh0Rm9ybWF0LFxuICAgIE1hcmt1cENvbnRlbnQsXG4gICAgTWFya3VwS2luZCxcbiAgICB0eXBlIENvZGVBY3Rpb24sXG4gICAgdHlwZSBDb21tYW5kLFxuICAgIHR5cGUgQ29tcGxldGlvbkl0ZW0sXG4gICAgdHlwZSBDb21wbGV0aW9uTGlzdCxcbiAgICB0eXBlIERpYWdub3N0aWMsXG4gICAgdHlwZSBIb3ZlcixcbiAgICB0eXBlIExvY2F0aW9uLFxuICAgIHR5cGUgUGFyYW1ldGVySW5mb3JtYXRpb24sXG4gICAgdHlwZSBTaWduYXR1cmVIZWxwLFxuICAgIHR5cGUgU2lnbmF0dXJlSW5mb3JtYXRpb24sXG4gICAgdHlwZSBUZXh0RWRpdCxcbiAgICB0eXBlIFdvcmtzcGFjZUVkaXQsXG59IGZyb20gJ3ZzY29kZS1sYW5ndWFnZXNlcnZlci10eXBlcyc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNpbmdsZXRvbiBzdGF0ZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogU2hhcmVkIGNvbm5lY3Rpb24gXHUyMDE0IG9uZSBwZXIgYnJvd3NlciBwYWdlLCBjb3ZlcmluZyBhbGwgcHJvamVjdHMgaW4gdGhlIHdvcmtzcGFjZS4gKi9cbmxldCBfY29ubjogTWVzc2FnZUNvbm5lY3Rpb24gfCBudWxsID0gbnVsbDtcblxuLyoqXG4gKiBWaXJ0dWFsIHdvcmtzcGFjZSByb290IFVSSSwgZS5nLiB7QGNvZGUgZmlsZTovLy93b3Jrc3BhY2Uvd29ya3NwYWNlL30uXG4gKiBTZXQgb25jZSBvbiBmaXJzdCBjb25uZWN0KCk7IHVzZWQgdG8gc2NvcGUgTW9uYWNvIHByb3ZpZGVycyB0byB3b3Jrc3BhY2UgZmlsZXMuXG4gKi9cbmxldCBfd29ya3NwYWNlUm9vdCA9ICcnO1xuXG4vKiogVVJJcyBmb3Igd2hpY2ggdGV4dERvY3VtZW50L2RpZE9wZW4gaGFzIGFscmVhZHkgYmVlbiBzZW50LiAqL1xuY29uc3QgX29wZW5GaWxlczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cbi8qKiBQZW5kaW5nIGRlYm91bmNlZCBkaWRDaGFuZ2UgdGltZXJzIHBlciBmaWxlIFVSSSwgc28gYSBjaGFuZ2UgY2FuIGJlIGZsdXNoZWQgYmVmb3JlIGNvbXBsZXRpb24uICovXG5jb25zdCBfY2hhbmdlVGltZXJzOiBNYXA8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0Pj4gPSBuZXcgTWFwKCk7XG5cbmxldCBfcHJvdmlkZXJzUmVnaXN0ZXJlZCA9IGZhbHNlO1xuXG4vKiogU2VtYW50aWMtdG9rZW4gbGVnZW5kIHJlcG9ydGVkIGJ5IEpEVC5MUyBpbiB0aGUgaW5pdGlhbGl6ZSByZXN1bHQ7IG5lZWRlZCB0byBkZWNvZGUgdG9rZW4gZGF0YS4gKi9cbmxldCBfc2VtYW50aWNUb2tlbnNMZWdlbmQ6IHsgdG9rZW5UeXBlczogc3RyaW5nW107IHRva2VuTW9kaWZpZXJzOiBzdHJpbmdbXSB9IHwgbnVsbCA9IG51bGw7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFB1YmxpYyBBUElcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIENhbGxlZCBieSBlZGl0b3IuanMgd2hlbiBhIEphdmEgZmlsZSBpcyBvcGVuZWQuIFNhZmUgdG8gY2FsbCBtdWx0aXBsZSB0aW1lcy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb25uZWN0KHJlc291cmNlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFydHMgPSByZXNvdXJjZVBhdGgucmVwbGFjZSgvXlxcLy8sICcnKS5zcGxpdCgnLycpO1xuICAgIGNvbnN0IHdvcmtzcGFjZSA9IHBhcnRzWzBdO1xuICAgIGNvbnN0IHByb2plY3QgICA9IHBhcnRzWzFdO1xuICAgIGNvbnN0IGZpbGVVcmkgPSBgZmlsZTovLy93b3Jrc3BhY2UvJHt3b3Jrc3BhY2V9LyR7cHJvamVjdH0vJHtwYXJ0cy5zbGljZSgyKS5qb2luKCcvJyl9YDtcblxuICAgIGlmIChfY29ubikge1xuICAgICAgICAvLyBDb25uZWN0aW9uIGFscmVhZHkgZXN0YWJsaXNoZWQgXHUyMDE0IGp1c3Qgb3BlbiB0aGUgbmV3IGZpbGUuXG4gICAgICAgIG9wZW5GaWxlKGZpbGVVcmkpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgX3dvcmtzcGFjZVJvb3QgPSBgZmlsZTovLy93b3Jrc3BhY2UvJHt3b3Jrc3BhY2V9L2A7XG5cbiAgICBjb25zdCBwcm90byA9IGxvY2F0aW9uLnByb3RvY29sID09PSAnaHR0cHM6JyA/ICd3c3MnIDogJ3dzJztcbiAgICBjb25zdCB3c1VybCA9IGAke3Byb3RvfTovLyR7bG9jYXRpb24uaG9zdH0vd2Vic29ja2V0cy9pZGUvamF2YS1sc3BgXG4gICAgICAgICAgICAgICAgKyBgP3dvcmtzcGFjZT0ke2VuY29kZVVSSUNvbXBvbmVudCh3b3Jrc3BhY2UpfWA7XG5cbiAgICBjb25zdCB3cyA9IG5ldyBXZWJTb2NrZXQod3NVcmwpO1xuICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgd3Mub25vcGVuICA9ICgpID0+IHJlc29sdmUoKTtcbiAgICAgICAgd3Mub25lcnJvciA9ICgpID0+IHJlamVjdChuZXcgRXJyb3IoYFtqYXZhLWxzcF0gV2ViU29ja2V0IGNvbm5lY3QgZmFpbGVkOiAke3dzVXJsfWApKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHNvY2tldCA9IHRvU29ja2V0KHdzKTtcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgV2ViU29ja2V0TWVzc2FnZVJlYWRlcihzb2NrZXQpO1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBXZWJTb2NrZXRNZXNzYWdlV3JpdGVyKHNvY2tldCk7XG4gICAgX2Nvbm4gPSBjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbihyZWFkZXIsIHdyaXRlcik7XG5cbiAgICAvLyBEaWFnbm9zdGljcyBub3RpZmljYXRpb24gXHUyMTkyIE1vbmFjbyBtYXJrZXJzIChhcHBsaWVzIHRvIGFueSB3b3Jrc3BhY2UgZmlsZSlcbiAgICBfY29ubi5vbk5vdGlmaWNhdGlvbigndGV4dERvY3VtZW50L3B1Ymxpc2hEaWFnbm9zdGljcycsIChwYXJhbXM6IHsgdXJpOiBzdHJpbmc7IGRpYWdub3N0aWNzOiBEaWFnbm9zdGljW10gfSkgPT4ge1xuICAgICAgICBjb25zdCBtb2RlbCA9IG1vbmFjby5lZGl0b3IuZ2V0TW9kZWxzKCkuZmluZChtID0+IG0udXJpLnRvU3RyaW5nKCkgPT09IHBhcmFtcy51cmkpO1xuICAgICAgICBpZiAoIW1vZGVsKSByZXR1cm47XG4gICAgICAgIG1vbmFjby5lZGl0b3Iuc2V0TW9kZWxNYXJrZXJzKG1vZGVsLCAnamF2YS1sc3AnLCBwYXJhbXMuZGlhZ25vc3RpY3MubWFwKGQgPT4gKHtcbiAgICAgICAgICAgIHNldmVyaXR5OiAgICAgICAgbHNwU2V2ZXJpdHkoZC5zZXZlcml0eSksXG4gICAgICAgICAgICBtZXNzYWdlOiAgICAgICAgIGQubWVzc2FnZSxcbiAgICAgICAgICAgIHNvdXJjZTogICAgICAgICAgZC5zb3VyY2UgPz8gJ2phdmEnLFxuICAgICAgICAgICAgc3RhcnRMaW5lTnVtYmVyOiBkLnJhbmdlLnN0YXJ0LmxpbmUgKyAxLFxuICAgICAgICAgICAgc3RhcnRDb2x1bW46ICAgICBkLnJhbmdlLnN0YXJ0LmNoYXJhY3RlciArIDEsXG4gICAgICAgICAgICBlbmRMaW5lTnVtYmVyOiAgIGQucmFuZ2UuZW5kLmxpbmUgKyAxLFxuICAgICAgICAgICAgZW5kQ29sdW1uOiAgICAgICBkLnJhbmdlLmVuZC5jaGFyYWN0ZXIgKyAxLFxuICAgICAgICB9KSkpO1xuICAgIH0pO1xuXG4gICAgLy8gU2VydmVyIC0+IGNsaWVudCByZXF1ZXN0cyB0aGF0IGRyaXZlIHJlZmFjdG9yIC8gZ2VuZXJhdGUgcmVzdWx0cyBhbmQgZHluYW1pYyByZWdpc3RyYXRpb24uXG4gICAgX2Nvbm4ub25SZXF1ZXN0KCd3b3Jrc3BhY2UvYXBwbHlFZGl0JywgKHBhcmFtczogeyBlZGl0OiBXb3Jrc3BhY2VFZGl0IH0pID0+IHtcbiAgICAgICAgYXBwbHlXb3Jrc3BhY2VFZGl0KHBhcmFtcy5lZGl0KTtcbiAgICAgICAgcmV0dXJuIHsgYXBwbGllZDogdHJ1ZSB9O1xuICAgIH0pO1xuICAgIF9jb25uLm9uUmVxdWVzdCgnd29ya3NwYWNlL2NvbmZpZ3VyYXRpb24nLCAocGFyYW1zOiB7IGl0ZW1zOiBBcnJheTx7IHNlY3Rpb24/OiBzdHJpbmcgfT4gfSkgPT5cbiAgICAgICAgKHBhcmFtcy5pdGVtcyA/PyBbXSkubWFwKCgpID0+IGpkdGxzU2V0dGluZ3MoKS5qYXZhKSk7XG4gICAgX2Nvbm4ub25SZXF1ZXN0KCdjbGllbnQvcmVnaXN0ZXJDYXBhYmlsaXR5JywgKCkgPT4gbnVsbCk7XG4gICAgX2Nvbm4ub25SZXF1ZXN0KCdjbGllbnQvdW5yZWdpc3RlckNhcGFiaWxpdHknLCAoKSA9PiBudWxsKTtcbiAgICBfY29ubi5vblJlcXVlc3QoJ3dpbmRvdy9zaG93TWVzc2FnZVJlcXVlc3QnLCAoKSA9PiBudWxsKTtcbiAgICBfY29ubi5vblJlcXVlc3QoJ3dpbmRvdy93b3JrRG9uZVByb2dyZXNzL2NyZWF0ZScsICgpID0+IG51bGwpO1xuICAgIF9jb25uLm9uTm90aWZpY2F0aW9uKCd3aW5kb3cvbG9nTWVzc2FnZScsIChwOiB7IG1lc3NhZ2U6IHN0cmluZyB9KSA9PiBjb25zb2xlLmRlYnVnKCdbamF2YS1sc3BdJywgcD8ubWVzc2FnZSkpO1xuICAgIF9jb25uLm9uTm90aWZpY2F0aW9uKCd3aW5kb3cvc2hvd01lc3NhZ2UnLCAocDogeyBtZXNzYWdlOiBzdHJpbmcgfSkgPT4gY29uc29sZS5pbmZvKCdbamF2YS1sc3BdJywgcD8ubWVzc2FnZSkpO1xuICAgIC8vIEpEVC5MUyBsYW5ndWFnZS1zdGF0dXMgLyBwcm9ncmVzcyBub3RpZmljYXRpb25zIFx1MjAxNCBhY2tub3dsZWRnZWQgc2lsZW50bHkuXG4gICAgX2Nvbm4ub25Ob3RpZmljYXRpb24oJ2xhbmd1YWdlL3N0YXR1cycsICgpID0+IHsgLyogaW5kZXhpbmcvcmVhZHkgc3RhdHVzLCBpZ25vcmVkICovIH0pO1xuICAgIF9jb25uLm9uTm90aWZpY2F0aW9uKCdsYW5ndWFnZS9wcm9ncmVzc1JlcG9ydCcsICgpID0+IHsgLyogYnVpbGQgcHJvZ3Jlc3MsIGlnbm9yZWQgKi8gfSk7XG5cbiAgICBfY29ubi5saXN0ZW4oKTtcblxuICAgIGNvbnN0IHJvb3RVcmkgPSBfd29ya3NwYWNlUm9vdDtcbiAgICBjb25zdCBpbml0UmVzdWx0OiBhbnkgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgnaW5pdGlhbGl6ZScsIHtcbiAgICAgICAgcHJvY2Vzc0lkOiBudWxsLFxuICAgICAgICByb290VXJpLFxuICAgICAgICBpbml0aWFsaXphdGlvbk9wdGlvbnM6IHtcbiAgICAgICAgICAgIHNldHRpbmdzOiBqZHRsc1NldHRpbmdzKCksXG4gICAgICAgICAgICBleHRlbmRlZENsaWVudENhcGFiaWxpdGllczoge1xuICAgICAgICAgICAgICAgIHByb2dyZXNzUmVwb3J0UHJvdmlkZXI6ICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgY2xhc3NGaWxlQ29udGVudHNTdXBwb3J0OiAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgIHJlc29sdmVBZGRpdGlvbmFsVGV4dEVkaXRzU3VwcG9ydDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBhZHZhbmNlZEdlbmVyYXRlQWNjZXNzb3JzU3VwcG9ydDogIHRydWUsXG4gICAgICAgICAgICAgICAgZ2VuZXJhdGVUb1N0cmluZ1Byb21wdFN1cHBvcnQ6ICAgICB0cnVlLFxuICAgICAgICAgICAgICAgIGdlbmVyYXRlQ29uc3RydWN0b3JzUHJvbXB0U3VwcG9ydDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBnZW5lcmF0ZURlbGVnYXRlTWV0aG9kc1Byb21wdFN1cHBvcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgaGFzaENvZGVFcXVhbHNQcm9tcHRTdXBwb3J0OiAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgIGFkdmFuY2VkT3JnYW5pemVJbXBvcnRzU3VwcG9ydDogICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICBpbmZlclNlbGVjdGlvblN1cHBvcnQ6ICAgICAgICAgICAgIFsnZXh0cmFjdE1ldGhvZCcsICdleHRyYWN0VmFyaWFibGUnLCAnZXh0cmFjdEZpZWxkJ10sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB3b3Jrc3BhY2VGb2xkZXJzOiBbeyB1cmk6IHJvb3RVcmksIG5hbWU6IHdvcmtzcGFjZSB9XSxcbiAgICAgICAgY2FwYWJpbGl0aWVzOiB7XG4gICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHtcbiAgICAgICAgICAgICAgICBzeW5jaHJvbml6YXRpb246IHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSwgd2lsbFNhdmU6IGZhbHNlLCBkaWRTYXZlOiB0cnVlLCB3aWxsU2F2ZVdhaXRVbnRpbDogZmFsc2UgfSxcbiAgICAgICAgICAgICAgICBjb21wbGV0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgIGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25JdGVtOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzbmlwcGV0U3VwcG9ydDogICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudGF0aW9uRm9ybWF0OiAgIFsnbWFya2Rvd24nLCAncGxhaW50ZXh0J10sXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGVkU3VwcG9ydDogICAgIHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21taXRDaGFyYWN0ZXJzU3VwcG9ydDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVTdXBwb3J0OiAgICAgICAgeyBwcm9wZXJ0aWVzOiBbJ2RvY3VtZW50YXRpb24nLCAnZGV0YWlsJywgJ2FkZGl0aW9uYWxUZXh0RWRpdHMnXSB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0U3VwcG9ydDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGhvdmVyOiAgICAgICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUsIGNvbnRlbnRGb3JtYXQ6IFsnbWFya2Rvd24nLCAncGxhaW50ZXh0J10gfSxcbiAgICAgICAgICAgICAgICBzaWduYXR1cmVIZWxwOiAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLCBzaWduYXR1cmVJbmZvcm1hdGlvbjogeyBkb2N1bWVudGF0aW9uRm9ybWF0OiBbJ21hcmtkb3duJywgJ3BsYWludGV4dCddLCBwYXJhbWV0ZXJJbmZvcm1hdGlvbjogeyBsYWJlbE9mZnNldFN1cHBvcnQ6IHRydWUgfSB9IH0sXG4gICAgICAgICAgICAgICAgZGVmaW5pdGlvbjogICAgIHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIHJlZmVyZW5jZXM6ICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbjogeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgdHlwZURlZmluaXRpb246IHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIGRvY3VtZW50SGlnaGxpZ2h0OiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICBkb2N1bWVudFN5bWJvbDogeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLCBoaWVyYXJjaGljYWxEb2N1bWVudFN5bWJvbFN1cHBvcnQ6IHRydWUgfSxcbiAgICAgICAgICAgICAgICBmb2xkaW5nUmFuZ2U6ICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLCBsaW5lRm9sZGluZ09ubHk6IGZhbHNlIH0sXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uUmFuZ2U6IHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIGNvZGVMZW5zOiAgICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICBpbmxheUhpbnQ6ICAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLCByZXNvbHZlU3VwcG9ydDogeyBwcm9wZXJ0aWVzOiBbJ2xhYmVsJ10gfSB9LFxuICAgICAgICAgICAgICAgIHNlbWFudGljVG9rZW5zOiB7XG4gICAgICAgICAgICAgICAgICAgIGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RzOiAgICAgICAgeyByYW5nZTogZmFsc2UsIGZ1bGw6IHsgZGVsdGE6IGZhbHNlIH0gfSxcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5UeXBlczogICAgICBbJ25hbWVzcGFjZScsICd0eXBlJywgJ2NsYXNzJywgJ2VudW0nLCAnaW50ZXJmYWNlJywgJ3N0cnVjdCcsICd0eXBlUGFyYW1ldGVyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdwYXJhbWV0ZXInLCAndmFyaWFibGUnLCAncHJvcGVydHknLCAnZW51bU1lbWJlcicsICdldmVudCcsICdmdW5jdGlvbicsICdtZXRob2QnLCAnbWFjcm8nLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2tleXdvcmQnLCAnbW9kaWZpZXInLCAnY29tbWVudCcsICdzdHJpbmcnLCAnbnVtYmVyJywgJ3JlZ2V4cCcsICdvcGVyYXRvcicsICdkZWNvcmF0b3InXSxcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5Nb2RpZmllcnM6ICBbJ2RlY2xhcmF0aW9uJywgJ2RlZmluaXRpb24nLCAncmVhZG9ubHknLCAnc3RhdGljJywgJ2RlcHJlY2F0ZWQnLCAnYWJzdHJhY3QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2FzeW5jJywgJ21vZGlmaWNhdGlvbicsICdkb2N1bWVudGF0aW9uJywgJ2RlZmF1bHRMaWJyYXJ5J10sXG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdHM6ICAgICAgICAgWydyZWxhdGl2ZSddLFxuICAgICAgICAgICAgICAgICAgICBvdmVybGFwcGluZ1Rva2VuU3VwcG9ydDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIG11bHRpbGluZVRva2VuU3VwcG9ydDogICBmYWxzZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGZvcm1hdHRpbmc6ICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICByYW5nZUZvcm1hdHRpbmc6IHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIHJlbmFtZTogICAgICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUsIHByZXBhcmVTdXBwb3J0OiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgY29kZUFjdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjb2RlQWN0aW9uTGl0ZXJhbFN1cHBvcnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVBY3Rpb25LaW5kOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTZXQ6IFsncXVpY2tmaXgnLCAncmVmYWN0b3InLCAncmVmYWN0b3IuZXh0cmFjdCcsICdyZWZhY3Rvci5pbmxpbmUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVmYWN0b3IucmV3cml0ZScsICdzb3VyY2UnLCAnc291cmNlLm9yZ2FuaXplSW1wb3J0cyddLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgaXNQcmVmZXJyZWRTdXBwb3J0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBkYXRhU3VwcG9ydDogICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmVTdXBwb3J0OiAgICAgeyBwcm9wZXJ0aWVzOiBbJ2VkaXQnXSB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcHVibGlzaERpYWdub3N0aWNzOiB7IHJlbGF0ZWRJbmZvcm1hdGlvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdvcmtzcGFjZToge1xuICAgICAgICAgICAgICAgIGFwcGx5RWRpdDogICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbjogICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICBleGVjdXRlQ29tbWFuZDogICAgICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICBkaWRDaGFuZ2VDb25maWd1cmF0aW9uOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICB3b3Jrc3BhY2VFZGl0OiAgICAgICAgICB7IGRvY3VtZW50Q2hhbmdlczogdHJ1ZSwgcmVzb3VyY2VPcGVyYXRpb25zOiBbJ2NyZWF0ZScsICdyZW5hbWUnLCAnZGVsZXRlJ10gfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBfc2VtYW50aWNUb2tlbnNMZWdlbmQgPSBpbml0UmVzdWx0Py5jYXBhYmlsaXRpZXM/LnNlbWFudGljVG9rZW5zUHJvdmlkZXI/LmxlZ2VuZCA/PyBudWxsO1xuXG4gICAgX2Nvbm4uc2VuZE5vdGlmaWNhdGlvbignaW5pdGlhbGl6ZWQnLCB7fSk7XG4gICAgX2Nvbm4uc2VuZE5vdGlmaWNhdGlvbignd29ya3NwYWNlL2RpZENoYW5nZUNvbmZpZ3VyYXRpb24nLCB7IHNldHRpbmdzOiBqZHRsc1NldHRpbmdzKCkgfSk7XG5cbiAgICBvcGVuRmlsZShmaWxlVXJpKTtcblxuICAgIGlmICghX3Byb3ZpZGVyc1JlZ2lzdGVyZWQpIHtcbiAgICAgICAgX3Byb3ZpZGVyc1JlZ2lzdGVyZWQgPSB0cnVlO1xuICAgICAgICByZWdpc3RlclByb3ZpZGVycygpO1xuICAgIH1cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRmlsZSBsaWZlY3ljbGVcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBTZW5kcyB0ZXh0RG9jdW1lbnQvZGlkT3BlbiBmb3IgdGhlIGdpdmVuIFVSSSAoaWYgbm90IGFscmVhZHkgc2VudCkgYW5kIHJlZ2lzdGVycyBhIGRlYm91bmNlZFxuICogdGV4dERvY3VtZW50L2RpZENoYW5nZSBsaXN0ZW5lciBvbiB0aGUgY29ycmVzcG9uZGluZyBNb25hY28gbW9kZWwuXG4gKi9cbmZ1bmN0aW9uIG9wZW5GaWxlKGZpbGVVcmk6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChfb3BlbkZpbGVzLmhhcyhmaWxlVXJpKSB8fCAhX2Nvbm4pIHJldHVybjtcbiAgICBfb3BlbkZpbGVzLmFkZChmaWxlVXJpKTtcblxuICAgIGNvbnN0IG1vZGVsID0gbW9uYWNvLmVkaXRvci5nZXRNb2RlbHMoKS5maW5kKG0gPT4gbS51cmkudG9TdHJpbmcoKSA9PT0gZmlsZVVyaSk7XG4gICAgX2Nvbm4uc2VuZE5vdGlmaWNhdGlvbigndGV4dERvY3VtZW50L2RpZE9wZW4nLCB7XG4gICAgICAgIHRleHREb2N1bWVudDoge1xuICAgICAgICAgICAgdXJpOiAgICAgICAgZmlsZVVyaSxcbiAgICAgICAgICAgIGxhbmd1YWdlSWQ6ICdqYXZhJyxcbiAgICAgICAgICAgIHZlcnNpb246ICAgIDEsXG4gICAgICAgICAgICB0ZXh0OiAgICAgICBtb2RlbD8uZ2V0VmFsdWUoKSA/PyAnJyxcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIGlmIChtb2RlbCkge1xuICAgICAgICBtb2RlbC5vbkRpZENoYW5nZUNvbnRlbnQoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBfY2hhbmdlVGltZXJzLmdldChmaWxlVXJpKTtcbiAgICAgICAgICAgIGlmIChleGlzdGluZykgY2xlYXJUaW1lb3V0KGV4aXN0aW5nKTtcbiAgICAgICAgICAgIF9jaGFuZ2VUaW1lcnMuc2V0KGZpbGVVcmksIHNldFRpbWVvdXQoKCkgPT4gc2VuZERpZENoYW5nZShmaWxlVXJpKSwgNDAwKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuLyoqIFNlbmRzIHRoZSBjdXJyZW50IG1vZGVsIGNvbnRlbnQgYXMgYSBkaWRDaGFuZ2UgYW5kIGNsZWFycyBhbnkgcGVuZGluZyBkZWJvdW5jZSBmb3IgdGhlIGZpbGUuICovXG5mdW5jdGlvbiBzZW5kRGlkQ2hhbmdlKGZpbGVVcmk6IHN0cmluZyk6IHZvaWQge1xuICAgIF9jaGFuZ2VUaW1lcnMuZGVsZXRlKGZpbGVVcmkpO1xuICAgIGNvbnN0IG1vZGVsID0gbW9uYWNvLmVkaXRvci5nZXRNb2RlbChtb25hY28uVXJpLnBhcnNlKGZpbGVVcmkpKTtcbiAgICBpZiAoX2Nvbm4gJiYgbW9kZWwpIHtcbiAgICAgICAgX2Nvbm4uc2VuZE5vdGlmaWNhdGlvbigndGV4dERvY3VtZW50L2RpZENoYW5nZScsIHtcbiAgICAgICAgICAgIHRleHREb2N1bWVudDogICB7IHVyaTogZmlsZVVyaSwgdmVyc2lvbjogbW9kZWwuZ2V0VmVyc2lvbklkKCkgfSxcbiAgICAgICAgICAgIGNvbnRlbnRDaGFuZ2VzOiBbeyB0ZXh0OiBtb2RlbC5nZXRWYWx1ZSgpIH1dLFxuICAgICAgICB9KTtcbiAgICB9XG59XG5cbi8qKlxuICogRmx1c2hlcyBhIHBlbmRpbmcgZGVib3VuY2VkIGNoYW5nZSBpbW1lZGlhdGVseS4gQ2FsbGVkIGJlZm9yZSBhIGNvbXBsZXRpb24gcmVxdWVzdCBzbyBKRFQuTFMgc2VlcyB0aGVcbiAqIGp1c3QtdHlwZWQgdGV4dCBvbiB0aGUgZmlyc3QgQ3RybCtTcGFjZSwgaW5zdGVhZCBvZiBjb21wbGV0aW5nIGFnYWluc3Qgc3RhbGUgY29udGVudCAodGhlIGRlYm91bmNlXG4gKiBvdGhlcndpc2UgZGVsYXlzIHRoZSBjaGFuZ2UgYnkgdXAgdG8gNDAwbXMgXHUyMDE0IHRoZSBjYXVzZSBvZiBcImZpcnN0IEN0cmwrU3BhY2Ugc2hvd3Mgbm90aGluZ1wiKS5cbiAqL1xuZnVuY3Rpb24gZmx1c2hQZW5kaW5nQ2hhbmdlKGZpbGVVcmk6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChfY2hhbmdlVGltZXJzLmhhcyhmaWxlVXJpKSkge1xuICAgICAgICBjbGVhclRpbWVvdXQoX2NoYW5nZVRpbWVycy5nZXQoZmlsZVVyaSkhKTtcbiAgICAgICAgc2VuZERpZENoYW5nZShmaWxlVXJpKTtcbiAgICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFdvcmtzcGFjZSBmaWxlIHByZWRpY2F0ZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFJldHVybnMge0Bjb2RlIHRydWV9IHdoZW4gdGhlIGdpdmVuIG1vZGVsIFVSSSBiZWxvbmdzIHRvIHRoZSBjdXJyZW50bHkgY29ubmVjdGVkIHdvcmtzcGFjZS4gVXNlZFxuICogYnkgTW9uYWNvIHByb3ZpZGVycyB0byBza2lwIG5vbi1KYXZhLXdvcmtzcGFjZSBtb2RlbHMgd2l0aG91dCBhbiBleGFjdC1VUkkgY29tcGFyaXNvbi5cbiAqL1xuZnVuY3Rpb24gaXNXb3Jrc3BhY2VGaWxlKHVyaTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIF93b3Jrc3BhY2VSb290ICE9PSAnJyAmJiB1cmkuc3RhcnRzV2l0aChfd29ya3NwYWNlUm9vdCk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIE1vbmFjbyBwcm92aWRlciByZWdpc3RyYXRpb25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gcmVnaXN0ZXJQcm92aWRlcnMoKTogdm9pZCB7XG5cbiAgICBtb25hY28uZWRpdG9yLnJlZ2lzdGVyQ29tbWFuZChBUFBMWV9BQ1RJT05fQ09NTUFORCwgKF9hY2Nlc3NvcjogdW5rbm93biwgYWN0aW9uOiBDb2RlQWN0aW9uIHwgQ29tbWFuZCkgPT4ge1xuICAgICAgICBhcHBseUNvZGVBY3Rpb24oYWN0aW9uKTtcbiAgICB9KTtcbiAgICBtb25hY28uZWRpdG9yLnJlZ2lzdGVyQ29tbWFuZChOT09QX0NPTU1BTkQsICgpID0+IHsgLyogZGlzcGxheS1vbmx5IENvZGVMZW5zICovIH0pO1xuXG4gICAgLy8gQ3Jvc3MtZmlsZSBuYXZpZ2F0aW9uOiB0aGlzIHNpbmdsZS1maWxlIGVkaXRvciBoYXMgbm8gbW9kZWwgZm9yIG90aGVyIHdvcmtzcGFjZSBmaWxlcywgc28gR28gdG9cbiAgICAvLyBEZWZpbml0aW9uIC8gRmluZCBSZWZlcmVuY2VzIHRvIGFub3RoZXIgZmlsZSB3b3VsZCBzaWxlbnRseSBkbyBub3RoaW5nLiBIYW5kIHRob3NlIG9mZiB0byB0aGUgSURFXG4gICAgLy8gdG8gb3BlbiB0aGUgdGFyZ2V0IGZpbGUgKGFuZCByZXZlYWwgdGhlIGxpbmUpLiBTYW1lLWZpbGUgdGFyZ2V0cyBmYWxsIHRocm91Z2ggdG8gTW9uYWNvLlxuICAgIG1vbmFjby5lZGl0b3IucmVnaXN0ZXJFZGl0b3JPcGVuZXIoe1xuICAgICAgICBvcGVuQ29kZUVkaXRvcjogKHNvdXJjZSwgcmVzb3VyY2UsIHNlbGVjdGlvbk9yUG9zaXRpb24pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHVyaSA9IHJlc291cmNlLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBpZiAoIWlzV29ya3NwYWNlRmlsZSh1cmkpIHx8ICF1cmkuc3RhcnRzV2l0aChWSVJUVUFMX0ZJTEVfUFJFRklYKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudE1vZGVsID0gc291cmNlLmdldE1vZGVsKCk7XG4gICAgICAgICAgICBpZiAoY3VycmVudE1vZGVsICYmIGN1cnJlbnRNb2RlbC51cmkudG9TdHJpbmcoKSA9PT0gdXJpKSByZXR1cm4gZmFsc2U7IC8vIHNhbWUgZmlsZSBcdTIwMTQgbGV0IE1vbmFjbyBqdW1wXG4gICAgICAgICAgICBjb25zdCBvcGVuZXIgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLmphdmFMc3BPcGVuRmlsZTtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3BlbmVyICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBwb3MgPSBzZWxlY3Rpb25PclBvc2l0aW9uIGFzIHsgc3RhcnRMaW5lTnVtYmVyPzogbnVtYmVyOyBsaW5lTnVtYmVyPzogbnVtYmVyOyBzdGFydENvbHVtbj86IG51bWJlcjsgY29sdW1uPzogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBsaW5lID0gcG9zID8gKHBvcy5zdGFydExpbmVOdW1iZXIgPz8gcG9zLmxpbmVOdW1iZXIpIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgY29sdW1uID0gcG9zID8gKHBvcy5zdGFydENvbHVtbiA/PyBwb3MuY29sdW1uKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIG9wZW5lcih1cmkuc3Vic3RyaW5nKFZJUlRVQUxfRklMRV9QUkVGSVgubGVuZ3RoKSwgbGluZSwgY29sdW1uKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckNvbXBsZXRpb25JdGVtUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHRyaWdnZXJDaGFyYWN0ZXJzOiBbJy4nLCAnQCcsICc8J10sXG4gICAgICAgIHByb3ZpZGVDb21wbGV0aW9uSXRlbXM6IGFzeW5jIChtb2RlbCwgcG9zaXRpb24sIGNvbnRleHQpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgZmlsZVVyaSA9IG1vZGVsLnVyaS50b1N0cmluZygpO1xuICAgICAgICAgICAgLy8gTWFrZSBzdXJlIEpEVC5MUyBoYXMgdGhlIGp1c3QtdHlwZWQgdGV4dCBiZWZvcmUgY29tcGxldGluZyAoc2VlIGZsdXNoUGVuZGluZ0NoYW5nZSkuXG4gICAgICAgICAgICBmbHVzaFBlbmRpbmdDaGFuZ2UoZmlsZVVyaSk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IENvbXBsZXRpb25MaXN0IHwgQ29tcGxldGlvbkl0ZW1bXSB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L2NvbXBsZXRpb24nLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogZmlsZVVyaSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICAgICAgLy8gTW9uYWNvIHRyaWdnZXIga2luZHMgYXJlIDAtYmFzZWQgKEludm9rZS9UcmlnZ2VyQ2hhcmFjdGVyL0ZvckluY29tcGxldGUpOyBMU1AgaXMgMS1iYXNlZC5cbiAgICAgICAgICAgICAgICBjb250ZXh0OiAgICAgIHsgdHJpZ2dlcktpbmQ6IChjb250ZXh0LnRyaWdnZXJLaW5kID8/IDApICsgMSwgdHJpZ2dlckNoYXJhY3RlcjogY29udGV4dC50cmlnZ2VyQ2hhcmFjdGVyIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gQXJyYXkuaXNBcnJheShyZXN1bHQpID8gcmVzdWx0IDogKHJlc3VsdD8uaXRlbXMgPz8gW10pO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBzdWdnZXN0aW9uczogaXRlbXMubWFwKGl0ZW0gPT4gbHNwQ29tcGxldGlvblRvTW9uYWNvKGl0ZW0sIG1vZGVsLCBwb3NpdGlvbikpLFxuICAgICAgICAgICAgICAgIC8vIEpEVC5MUyByZXR1cm5zIGEgdHJ1bmNhdGVkIGxpc3Qgb24gdGhlIGZpcnN0IGtleXN0cm9rZXM7IHByb3BhZ2F0aW5nIFwiaW5jb21wbGV0ZVwiIG1ha2VzXG4gICAgICAgICAgICAgICAgLy8gTW9uYWNvIHJlLXF1ZXJ5IGFzIHRoZSB1c2VyIHR5cGVzIGluc3RlYWQgb2YgY2FjaGluZyB0aGUgZmlyc3QgKG9mdGVuIGVtcHR5KSByZXN1bHQuXG4gICAgICAgICAgICAgICAgaW5jb21wbGV0ZTogIEFycmF5LmlzQXJyYXkocmVzdWx0KSA/IGZhbHNlIDogISFyZXN1bHQ/LmlzSW5jb21wbGV0ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8vIFJlc29sdmUgZG9jdW1lbnRhdGlvbiBhbmQsIGNydWNpYWxseSwgdGhlIGF1dG8taW1wb3J0IGFkZGl0aW9uYWxUZXh0RWRpdHMgd2hpY2ggSkRULkxTIG9ubHlcbiAgICAgICAgLy8gYXR0YWNoZXMgb24gcmVzb2x2ZSBcdTIwMTQgc2VsZWN0aW5nIGEgdHlwZSB0aGVuIGluc2VydHMgaXRzIGltcG9ydCBzdGF0ZW1lbnQuXG4gICAgICAgIHJlc29sdmVDb21wbGV0aW9uSXRlbTogYXN5bmMgKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxzcCA9IChpdGVtIGFzIE1vbmFjb0NvbXBsZXRpb25JdGVtKS5fbHNwO1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhbHNwKSByZXR1cm4gaXRlbTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWQ6IENvbXBsZXRpb25JdGVtID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ2NvbXBsZXRpb25JdGVtL3Jlc29sdmUnLCBsc3ApO1xuICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZC5kb2N1bWVudGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uZG9jdW1lbnRhdGlvbiA9IHsgdmFsdWU6IG1hcmt1cFRvU3RyaW5nKHJlc29sdmVkLmRvY3VtZW50YXRpb24pLCBpc1RydXN0ZWQ6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZC5kZXRhaWwpIGl0ZW0uZGV0YWlsID0gcmVzb2x2ZWQuZGV0YWlsO1xuICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZC5hZGRpdGlvbmFsVGV4dEVkaXRzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5hZGRpdGlvbmFsVGV4dEVkaXRzID0gcmVzb2x2ZWQuYWRkaXRpb25hbFRleHRFZGl0cy5tYXAodGV4dEVkaXRUb01vbmFjbyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoJ1tqYXZhLWxzcF0gY29tcGxldGlvbiByZXNvbHZlIGZhaWxlZDonLCAoZSBhcyBFcnJvcik/Lm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVySG92ZXJQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZUhvdmVyOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVVcmkgPSBtb2RlbC51cmkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogSG92ZXIgfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9ob3ZlcicsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBmaWxlVXJpIH0sXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQ/LmNvbnRlbnRzKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRzID0gQXJyYXkuaXNBcnJheShyZXN1bHQuY29udGVudHMpID8gcmVzdWx0LmNvbnRlbnRzIDogW3Jlc3VsdC5jb250ZW50c107XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGNvbnRlbnRzOiBjb250ZW50cy5tYXAoYyA9PiAoe1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdHlwZW9mIGMgPT09ICdzdHJpbmcnID8gYyA6IChjIGFzIE1hcmt1cENvbnRlbnQpLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBpc1RydXN0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgICByYW5nZTogcmVzdWx0LnJhbmdlID8gbHNwUmFuZ2VUb01vbmFjbyhyZXN1bHQucmFuZ2UpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJTaWduYXR1cmVIZWxwUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHNpZ25hdHVyZUhlbHBUcmlnZ2VyQ2hhcmFjdGVyczogWycoJywgJywnXSxcbiAgICAgICAgcHJvdmlkZVNpZ25hdHVyZUhlbHA6IGFzeW5jIChtb2RlbCwgcG9zaXRpb24pID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgZmlsZVVyaSA9IG1vZGVsLnVyaS50b1N0cmluZygpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBTaWduYXR1cmVIZWxwIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvc2lnbmF0dXJlSGVscCcsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBmaWxlVXJpIH0sXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVzOiByZXN1bHQuc2lnbmF0dXJlcy5tYXAoKHNpZzogU2lnbmF0dXJlSW5mb3JtYXRpb24pID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogICAgICAgICBzaWcubGFiZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudGF0aW9uOiBzaWcuZG9jdW1lbnRhdGlvbiA/IG1hcmt1cFRvU3RyaW5nKHNpZy5kb2N1bWVudGF0aW9uKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6ICAgIChzaWcucGFyYW1ldGVycyA/PyBbXSkubWFwKChwOiBQYXJhbWV0ZXJJbmZvcm1hdGlvbikgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogICAgICAgICBwLmxhYmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50YXRpb246IHAuZG9jdW1lbnRhdGlvbiA/IG1hcmt1cFRvU3RyaW5nKHAuZG9jdW1lbnRhdGlvbikgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlU2lnbmF0dXJlOiByZXN1bHQuYWN0aXZlU2lnbmF0dXJlID8/IDAsXG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZVBhcmFtZXRlcjogcmVzdWx0LmFjdGl2ZVBhcmFtZXRlciA/PyAwLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge30sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckRlZmluaXRpb25Qcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZURlZmluaXRpb246IGFzeW5jIChtb2RlbCwgcG9zaXRpb24pID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgZmlsZVVyaSA9IG1vZGVsLnVyaS50b1N0cmluZygpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBMb2NhdGlvbiB8IExvY2F0aW9uW10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9kZWZpbml0aW9uJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IGZpbGVVcmkgfSxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogICAgIHsgbGluZTogcG9zaXRpb24ubGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogcG9zaXRpb24uY29sdW1uIC0gMSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBsb2NhdGlvbnMgPSAoQXJyYXkuaXNBcnJheShyZXN1bHQpID8gcmVzdWx0IDogW3Jlc3VsdF0pLm1hcChsb2MgPT4gKHtcbiAgICAgICAgICAgICAgICB1cmk6ICAgbW9uYWNvLlVyaS5wYXJzZShsb2MudXJpKSxcbiAgICAgICAgICAgICAgICByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhsb2MucmFuZ2UpLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgYXdhaXQgZW5zdXJlTW9kZWxzRm9yTG9jYXRpb25zKGxvY2F0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gbG9jYXRpb25zO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlclJlZmVyZW5jZVByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlUmVmZXJlbmNlczogYXN5bmMgKG1vZGVsLCBwb3NpdGlvbiwgY29udGV4dCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IExvY2F0aW9uW10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9yZWZlcmVuY2VzJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgICAgICBjb250ZXh0OiAgICAgIHsgaW5jbHVkZURlY2xhcmF0aW9uOiBjb250ZXh0LmluY2x1ZGVEZWNsYXJhdGlvbiB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBsb2NhdGlvbnMgPSByZXN1bHQubWFwKGxvYyA9PiAoeyB1cmk6IG1vbmFjby5VcmkucGFyc2UobG9jLnVyaSksIHJhbmdlOiBsc3BSYW5nZVRvTW9uYWNvKGxvYy5yYW5nZSkgfSkpO1xuICAgICAgICAgICAgLy8gVGhlIHJlZmVyZW5jZXMgcGVlayBjYW4gb25seSBzaG93IGEgY29kZSBwcmV2aWV3IGZvciBmaWxlcyBpdCBoYXMgYSBtb2RlbCBmb3I7IGNyZWF0ZVxuICAgICAgICAgICAgLy8gaW4tbWVtb3J5IG1vZGVscyBmb3IgdGhlIHJlZmVyZW5jZWQgKHBvc3NpYmx5IHVub3BlbmVkKSBmaWxlcyBzbyBwcmV2aWV3cyByZW5kZXIuXG4gICAgICAgICAgICBhd2FpdCBlbnN1cmVNb2RlbHNGb3JMb2NhdGlvbnMobG9jYXRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbnM7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyUmVuYW1lUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVSZW5hbWVFZGl0czogYXN5bmMgKG1vZGVsLCBwb3NpdGlvbiwgbmV3TmFtZSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIHsgZWRpdHM6IFtdIH07XG4gICAgICAgICAgICBjb25zdCBlZGl0OiBXb3Jrc3BhY2VFZGl0IHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvcmVuYW1lJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgICAgICBuZXdOYW1lLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIWVkaXQpIHJldHVybiB7IGVkaXRzOiBbXSB9O1xuICAgICAgICAgICAgLy8gQSBKRFQuTFMgcmVuYW1lIGNhbiBzcGFuIG1hbnkgZmlsZXMgYW5kIGV2ZW4gcmVuYW1lIHRoZSB0eXBlJ3Mgb3duIC5qYXZhIGZpbGUuIE1vbmFjbydzXG4gICAgICAgICAgICAvLyBzaW5nbGUtZmlsZSBlZGl0b3Igd291bGQgZHJvcCBldmVyeXRoaW5nIGJ1dCB0aGUgY3VycmVudCBtb2RlbCwgc28gYXBwbHkgdGhlIHdob2xlIGVkaXRcbiAgICAgICAgICAgIC8vIHRocm91Z2ggdGhlIHdvcmtzcGFjZSBvdXJzZWx2ZXMgd2hlbiB0aGUgSURFIHBlcnNpc3RlbmNlIGhvb2sgaXMgYXZhaWxhYmxlLlxuICAgICAgICAgICAgaWYgKHR5cGVvZiAoZ2xvYmFsVGhpcyBhcyBhbnkpLmphdmFMc3BQZXJzaXN0UmVuYW1lID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgYXBwbHlSZW5hbWVBY3Jvc3NXb3Jrc3BhY2UobW9kZWwsIGVkaXQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBlZGl0czogW10gfTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tqYXZhLWxzcF0gY3Jvc3MtZmlsZSByZW5hbWUgZmFpbGVkLCBhcHBseWluZyB0byB0aGUgY3VycmVudCBmaWxlIG9ubHk6JywgZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB3b3Jrc3BhY2VFZGl0VG9Nb25hY28oZWRpdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHdvcmtzcGFjZUVkaXRUb01vbmFjbyhlZGl0KTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVzb2x2ZVJlbmFtZUxvY2F0aW9uOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0OiB7IHJhbmdlOiBMc3BSYW5nZTsgcGxhY2Vob2xkZXI/OiBzdHJpbmcgfSB8IExzcFJhbmdlIHwgbnVsbCA9XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvcHJlcGFyZVJlbmFtZScsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogICAgIHsgbGluZTogcG9zaXRpb24ubGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogcG9zaXRpb24uY29sdW1uIC0gMSB9LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSAncmFuZ2UnIGluIHJlc3VsdCA/IHJlc3VsdC5yYW5nZSA6IHJlc3VsdDtcbiAgICAgICAgICAgICAgICBjb25zdCBwbGFjZWhvbGRlciA9ICdwbGFjZWhvbGRlcicgaW4gcmVzdWx0ICYmIHJlc3VsdC5wbGFjZWhvbGRlclxuICAgICAgICAgICAgICAgICAgICA/IHJlc3VsdC5wbGFjZWhvbGRlclxuICAgICAgICAgICAgICAgICAgICA6IG1vZGVsLmdldFdvcmRBdFBvc2l0aW9uKHBvc2l0aW9uKT8ud29yZCA/PyAnJztcbiAgICAgICAgICAgICAgICByZXR1cm4geyByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhyYW5nZSksIHRleHQ6IHBsYWNlaG9sZGVyIH07XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICBjb25zdCB3b3JkID0gbW9kZWwuZ2V0V29yZEF0UG9zaXRpb24ocG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIHJldHVybiB3b3JkID8ge1xuICAgICAgICAgICAgICAgICAgICByYW5nZTogeyBzdGFydExpbmVOdW1iZXI6IHBvc2l0aW9uLmxpbmVOdW1iZXIsIHN0YXJ0Q29sdW1uOiB3b3JkLnN0YXJ0Q29sdW1uLCBlbmRMaW5lTnVtYmVyOiBwb3NpdGlvbi5saW5lTnVtYmVyLCBlbmRDb2x1bW46IHdvcmQuZW5kQ29sdW1uIH0sXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IHdvcmQud29yZCxcbiAgICAgICAgICAgICAgICB9IDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIFJlZ2lzdGVyaW5nIHRoaXMgcHJvdmlkZXIgYWxzbyBlbmFibGVzIGVkaXRvci5qcydzIGV4aXN0aW5nIGZvcm1hdC1vbi1zYXZlIHBhdGggZm9yIEphdmE6IHRoZVxuICAgIC8vIHNoYXJlZCBTYXZlIGFjdGlvbiBydW5zIGVkaXRvci5hY3Rpb24uZm9ybWF0RG9jdW1lbnQgd2hlbiBhdXRvLWZvcm1hdHRpbmcgaXMgb24gKHRoZSBzYW1lXG4gICAgLy8gbWVjaGFuaXNtIGFuZCBnbG9iYWwgdG9nZ2xlIHVzZWQgZm9yIFR5cGVTY3JpcHQpLlxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJEb2N1bWVudEZvcm1hdHRpbmdFZGl0UHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVEb2N1bWVudEZvcm1hdHRpbmdFZGl0czogYXN5bmMgKG1vZGVsKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGVkaXRzOiBUZXh0RWRpdFtdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvZm9ybWF0dGluZycsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6ICAgICAgeyB0YWJTaXplOiBtb2RlbC5nZXRPcHRpb25zKCkudGFiU2l6ZSwgaW5zZXJ0U3BhY2VzOiBtb2RlbC5nZXRPcHRpb25zKCkuaW5zZXJ0U3BhY2VzIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBlZGl0cyA/IGVkaXRzLm1hcCh0ZXh0RWRpdFRvTW9uYWNvKSA6IG51bGw7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyQ29kZUFjdGlvblByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlQ29kZUFjdGlvbnM6IGFzeW5jIChtb2RlbCwgcmFuZ2UsIGNvbnRleHQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVtcHR5ID0geyBhY3Rpb25zOiBbXSwgZGlzcG9zZSgpIHsgLyogbm90aGluZyB0byBkaXNwb3NlICovIH0gfTtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBlbXB0eTtcbiAgICAgICAgICAgIGNvbnN0IGRpYWdub3N0aWNzID0gKGNvbnRleHQubWFya2VycyA/PyBbXSkubWFwKG1hcmtlclRvTHNwRGlhZ25vc3RpYyk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IEFycmF5PENvZGVBY3Rpb24gfCBDb21tYW5kPiB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L2NvZGVBY3Rpb24nLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgICAgICByYW5nZTogICAgICAgIG1vbmFjb1JhbmdlVG9Mc3AocmFuZ2UpLFxuICAgICAgICAgICAgICAgIGNvbnRleHQ6ICAgICAgeyBkaWFnbm9zdGljcywgb25seTogY29udGV4dC5vbmx5ID8gW2NvbnRleHQub25seV0gOiB1bmRlZmluZWQgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQ/Lmxlbmd0aCkgcmV0dXJuIGVtcHR5O1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBhY3Rpb25zOiByZXN1bHQubWFwKGxzcENvZGVBY3Rpb25Ub01vbmFjbyksXG4gICAgICAgICAgICAgICAgZGlzcG9zZSgpIHsgLyogbm90aGluZyB0byBkaXNwb3NlICovIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgIH0sIHtcbiAgICAgICAgcHJvdmlkZWRDb2RlQWN0aW9uS2luZHM6IFsncXVpY2tmaXgnLCAncmVmYWN0b3InLCAncmVmYWN0b3IuZXh0cmFjdCcsICdyZWZhY3Rvci5pbmxpbmUnLFxuICAgICAgICAgICAgJ3JlZmFjdG9yLnJld3JpdGUnLCAnc291cmNlJywgJ3NvdXJjZS5vcmdhbml6ZUltcG9ydHMnXSxcbiAgICB9KTtcblxuICAgIC8vIC0tLSBOYXZpZ2F0aW9uICYgc3RydWN0dXJlIChQYWNrIDEpIC0tLVxuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckltcGxlbWVudGF0aW9uUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVJbXBsZW1lbnRhdGlvbjogKG1vZGVsLCBwb3NpdGlvbikgPT4gcmVxdWVzdExvY2F0aW9ucygndGV4dERvY3VtZW50L2ltcGxlbWVudGF0aW9uJywgbW9kZWwsIHBvc2l0aW9uKSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJUeXBlRGVmaW5pdGlvblByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlVHlwZURlZmluaXRpb246IChtb2RlbCwgcG9zaXRpb24pID0+IHJlcXVlc3RMb2NhdGlvbnMoJ3RleHREb2N1bWVudC90eXBlRGVmaW5pdGlvbicsIG1vZGVsLCBwb3NpdGlvbiksXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyRG9jdW1lbnRIaWdobGlnaHRQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZURvY3VtZW50SGlnaGxpZ2h0czogYXN5bmMgKG1vZGVsLCBwb3NpdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IGFueVtdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvZG9jdW1lbnRIaWdobGlnaHQnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogICAgIHsgbGluZTogcG9zaXRpb24ubGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogcG9zaXRpb24uY29sdW1uIC0gMSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0Lm1hcChoID0+ICh7IHJhbmdlOiBsc3BSYW5nZVRvTW9uYWNvKGgucmFuZ2UpLCBraW5kOiBoLmtpbmQgPyBoLmtpbmQgLSAxIDogdW5kZWZpbmVkIH0pKTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJEb2N1bWVudFN5bWJvbFByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlRG9jdW1lbnRTeW1ib2xzOiBhc3luYyAobW9kZWwpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBhbnlbXSB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L2RvY3VtZW50U3ltYm9sJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQgPyBtYXBEb2N1bWVudFN5bWJvbHMocmVzdWx0KSA6IG51bGw7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyRm9sZGluZ1JhbmdlUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVGb2xkaW5nUmFuZ2VzOiBhc3luYyAobW9kZWwpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBhbnlbXSB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L2ZvbGRpbmdSYW5nZScsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0Lm1hcChyID0+ICh7IHN0YXJ0OiByLnN0YXJ0TGluZSArIDEsIGVuZDogci5lbmRMaW5lICsgMSwga2luZDogZm9sZGluZ0tpbmQoci5raW5kKSB9KSk7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyU2VsZWN0aW9uUmFuZ2VQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZVNlbGVjdGlvblJhbmdlczogYXN5bmMgKG1vZGVsLCBwb3NpdGlvbnMpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBhbnlbXSB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L3NlbGVjdGlvblJhbmdlJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICAgICAgcG9zaXRpb25zOiAgICBwb3NpdGlvbnMubWFwKHAgPT4gKHsgbGluZTogcC5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwLmNvbHVtbiAtIDEgfSkpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0Lm1hcChmbGF0dGVuU2VsZWN0aW9uUmFuZ2UpO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckRvY3VtZW50UmFuZ2VGb3JtYXR0aW5nRWRpdFByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlRG9jdW1lbnRSYW5nZUZvcm1hdHRpbmdFZGl0czogYXN5bmMgKG1vZGVsLCByYW5nZSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBlZGl0czogVGV4dEVkaXRbXSB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L3JhbmdlRm9ybWF0dGluZycsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgIHJhbmdlOiAgICAgICAgbW9uYWNvUmFuZ2VUb0xzcChyYW5nZSksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogICAgICB7IHRhYlNpemU6IG1vZGVsLmdldE9wdGlvbnMoKS50YWJTaXplLCBpbnNlcnRTcGFjZXM6IG1vZGVsLmdldE9wdGlvbnMoKS5pbnNlcnRTcGFjZXMgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGVkaXRzID8gZWRpdHMubWFwKHRleHRFZGl0VG9Nb25hY28pIDogbnVsbDtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIC0tLSBJbmxheSBoaW50cyArIHNlbWFudGljIGhpZ2hsaWdodGluZyAoUGFjayAyKSAtLS1cblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJJbmxheUhpbnRzUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVJbmxheUhpbnRzOiBhc3luYyAobW9kZWwsIHJhbmdlKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55W10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9pbmxheUhpbnQnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgICAgICByYW5nZTogICAgICAgIG1vbmFjb1JhbmdlVG9Mc3AocmFuZ2UpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGhpbnRzOiByZXN1bHQubWFwKGggPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmVOdW1iZXI6IGgucG9zaXRpb24ubGluZSArIDEsIGNvbHVtbjogaC5wb3NpdGlvbi5jaGFyYWN0ZXIgKyAxIH0sXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAgICAgICAgdHlwZW9mIGgubGFiZWwgPT09ICdzdHJpbmcnID8gaC5sYWJlbCA6IChoLmxhYmVsID8/IFtdKS5tYXAoKHA6IGFueSkgPT4gKHsgbGFiZWw6IHAudmFsdWUgfSkpLFxuICAgICAgICAgICAgICAgICAgICBraW5kOiAgICAgICAgIGgua2luZCxcbiAgICAgICAgICAgICAgICAgICAgcGFkZGluZ0xlZnQ6ICBoLnBhZGRpbmdMZWZ0LFxuICAgICAgICAgICAgICAgICAgICBwYWRkaW5nUmlnaHQ6IGgucGFkZGluZ1JpZ2h0LFxuICAgICAgICAgICAgICAgICAgICB0b29sdGlwOiAgICAgIGgudG9vbHRpcCA/IG1hcmt1cFRvU3RyaW5nKGgudG9vbHRpcCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgIGRpc3Bvc2UoKSB7IC8qIG5vdGhpbmcgdG8gZGlzcG9zZSAqLyB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJEb2N1bWVudFNlbWFudGljVG9rZW5zUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIGdldExlZ2VuZDogKCkgPT4gX3NlbWFudGljVG9rZW5zTGVnZW5kID8/IHsgdG9rZW5UeXBlczogW10sIHRva2VuTW9kaWZpZXJzOiBbXSB9LFxuICAgICAgICBwcm92aWRlRG9jdW1lbnRTZW1hbnRpY1Rva2VuczogYXN5bmMgKG1vZGVsKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpIHx8ICFfc2VtYW50aWNUb2tlbnNMZWdlbmQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiB7IGRhdGE6IG51bWJlcltdOyByZXN1bHRJZD86IHN0cmluZyB9IHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvc2VtYW50aWNUb2tlbnMvZnVsbCcsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdD8uZGF0YSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICByZXR1cm4geyBkYXRhOiBuZXcgVWludDMyQXJyYXkocmVzdWx0LmRhdGEpLCByZXN1bHRJZDogcmVzdWx0LnJlc3VsdElkIH07XG4gICAgICAgIH0sXG4gICAgICAgIHJlbGVhc2VEb2N1bWVudFNlbWFudGljVG9rZW5zOiAoKSA9PiB7IC8qIG5vdGhpbmcgdG8gcmVsZWFzZSAqLyB9LFxuICAgIH0pO1xuXG4gICAgLy8gLS0tIENvZGVMZW5zIChQYWNrIDMpIC0tLVxuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckNvZGVMZW5zUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVDb2RlTGVuc2VzOiBhc3luYyAobW9kZWwpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiB7IGxlbnNlczogW10sIGRpc3Bvc2UoKSB7IC8qICovIH0gfTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55W10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9jb2RlTGVucycsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBsZW5zZXMgPSAocmVzdWx0ID8/IFtdKS5tYXAoKGxlbnMsIGkpID0+ICh7XG4gICAgICAgICAgICAgICAgcmFuZ2U6ICAgIGxzcFJhbmdlVG9Nb25hY28obGVucy5yYW5nZSksXG4gICAgICAgICAgICAgICAgaWQ6ICAgICAgIFN0cmluZyhpKSxcbiAgICAgICAgICAgICAgICBjb21tYW5kOiAgbGVucy5jb21tYW5kID8gbWFwTGVuc0NvbW1hbmQobGVucy5jb21tYW5kKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBfbHNwOiAgICAgbGVucyxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIHJldHVybiB7IGxlbnNlcywgZGlzcG9zZSgpIHsgLyogKi8gfSB9O1xuICAgICAgICB9LFxuICAgICAgICByZXNvbHZlQ29kZUxlbnM6IGFzeW5jIChfbW9kZWwsIGNvZGVMZW5zKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsc3AgPSAoY29kZUxlbnMgYXMgYW55KS5fbHNwO1xuICAgICAgICAgICAgaWYgKF9jb25uICYmIGxzcCAmJiAhbHNwLmNvbW1hbmQpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZDogYW55ID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ2NvZGVMZW5zL3Jlc29sdmUnLCBsc3ApO1xuICAgICAgICAgICAgICAgICAgICBjb2RlTGVucy5jb21tYW5kID0gcmVzb2x2ZWQ/LmNvbW1hbmQgPyBtYXBMZW5zQ29tbWFuZChyZXNvbHZlZC5jb21tYW5kKSA6IHsgaWQ6IE5PT1BfQ09NTUFORCwgdGl0bGU6ICcnIH07XG4gICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGVMZW5zLmNvbW1hbmQgPSB7IGlkOiBOT09QX0NPTU1BTkQsIHRpdGxlOiAnJyB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb2RlTGVucztcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIC0tLSBKYXZhIGtleXdvcmQgY29tcGxldGlvbiAoUGFjayAxYik6IGFsd2F5cy1hdmFpbGFibGUsIHJhbmtlZCBiZWxvdyBTREsvTFNQIHJlc3VsdHMgLS0tXG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyQ29tcGxldGlvbkl0ZW1Qcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZUNvbXBsZXRpb25JdGVtczogKG1vZGVsLCBwb3NpdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKCFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHdvcmQgPSBtb2RlbC5nZXRXb3JkVW50aWxQb3NpdGlvbihwb3NpdGlvbik7XG4gICAgICAgICAgICBjb25zdCByYW5nZTogbW9uYWNvLklSYW5nZSA9IHtcbiAgICAgICAgICAgICAgICBzdGFydExpbmVOdW1iZXI6IHBvc2l0aW9uLmxpbmVOdW1iZXIsIHN0YXJ0Q29sdW1uOiB3b3JkLnN0YXJ0Q29sdW1uLFxuICAgICAgICAgICAgICAgIGVuZExpbmVOdW1iZXI6ICAgcG9zaXRpb24ubGluZU51bWJlciwgZW5kQ29sdW1uOiAgIHdvcmQuZW5kQ29sdW1uLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3VnZ2VzdGlvbnM6IEpBVkFfS0VZV09SRFMubWFwKGtleXdvcmQgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICAgICAga2V5d29yZCxcbiAgICAgICAgICAgICAgICAgICAga2luZDogICAgICAgbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbUtpbmQuS2V5d29yZCxcbiAgICAgICAgICAgICAgICAgICAgaW5zZXJ0VGV4dDoga2V5d29yZCxcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2UsXG4gICAgICAgICAgICAgICAgICAgIHNvcnRUZXh0OiAgIGA5XyR7a2V5d29yZH1gLFxuICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgfSk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEhlbHBlcnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gbHNwU2V2ZXJpdHkoc2V2ZXJpdHk6IERpYWdub3N0aWNTZXZlcml0eSB8IHVuZGVmaW5lZCk6IG1vbmFjby5NYXJrZXJTZXZlcml0eSB7XG4gICAgc3dpdGNoIChzZXZlcml0eSkge1xuICAgICAgICBjYXNlIERpYWdub3N0aWNTZXZlcml0eS5FcnJvcjogICAgICAgcmV0dXJuIG1vbmFjby5NYXJrZXJTZXZlcml0eS5FcnJvcjtcbiAgICAgICAgY2FzZSBEaWFnbm9zdGljU2V2ZXJpdHkuV2FybmluZzogICAgIHJldHVybiBtb25hY28uTWFya2VyU2V2ZXJpdHkuV2FybmluZztcbiAgICAgICAgY2FzZSBEaWFnbm9zdGljU2V2ZXJpdHkuSW5mb3JtYXRpb246IHJldHVybiBtb25hY28uTWFya2VyU2V2ZXJpdHkuSW5mbztcbiAgICAgICAgY2FzZSBEaWFnbm9zdGljU2V2ZXJpdHkuSGludDogICAgICAgIHJldHVybiBtb25hY28uTWFya2VyU2V2ZXJpdHkuSGludDtcbiAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtb25hY28uTWFya2VyU2V2ZXJpdHkuRXJyb3I7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBsc3BSYW5nZVRvTW9uYWNvKHI6IHsgc3RhcnQ6IHsgbGluZTogbnVtYmVyOyBjaGFyYWN0ZXI6IG51bWJlciB9OyBlbmQ6IHsgbGluZTogbnVtYmVyOyBjaGFyYWN0ZXI6IG51bWJlciB9IH0pOiBtb25hY28uSVJhbmdlIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBzdGFydExpbmVOdW1iZXI6IHIuc3RhcnQubGluZSArIDEsXG4gICAgICAgIHN0YXJ0Q29sdW1uOiAgICAgci5zdGFydC5jaGFyYWN0ZXIgKyAxLFxuICAgICAgICBlbmRMaW5lTnVtYmVyOiAgIHIuZW5kLmxpbmUgKyAxLFxuICAgICAgICBlbmRDb2x1bW46ICAgICAgIHIuZW5kLmNoYXJhY3RlciArIDEsXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gbWFya3VwVG9TdHJpbmcoYzogc3RyaW5nIHwgTWFya3VwQ29udGVudCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHR5cGVvZiBjID09PSAnc3RyaW5nJyA/IGMgOiBjLnZhbHVlO1xufVxuXG5mdW5jdGlvbiBsc3BDb21wbGV0aW9uS2luZChraW5kOiBDb21wbGV0aW9uSXRlbUtpbmQgfCB1bmRlZmluZWQpOiBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtS2luZCB7XG4gICAgY29uc3QgSyA9IG1vbmFjby5sYW5ndWFnZXMuQ29tcGxldGlvbkl0ZW1LaW5kO1xuICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5UZXh0OiAgICAgICAgICByZXR1cm4gSy5UZXh0O1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5NZXRob2Q6ICAgICAgICByZXR1cm4gSy5NZXRob2Q7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLkZ1bmN0aW9uOiAgICAgIHJldHVybiBLLkZ1bmN0aW9uO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5Db25zdHJ1Y3RvcjogICByZXR1cm4gSy5Db25zdHJ1Y3RvcjtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuRmllbGQ6ICAgICAgICAgcmV0dXJuIEsuRmllbGQ7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLlZhcmlhYmxlOiAgICAgIHJldHVybiBLLlZhcmlhYmxlO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5DbGFzczogICAgICAgICByZXR1cm4gSy5DbGFzcztcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuSW50ZXJmYWNlOiAgICAgcmV0dXJuIEsuSW50ZXJmYWNlO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5Nb2R1bGU6ICAgICAgICByZXR1cm4gSy5Nb2R1bGU7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLlByb3BlcnR5OiAgICAgIHJldHVybiBLLlByb3BlcnR5O1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5LZXl3b3JkOiAgICAgICByZXR1cm4gSy5LZXl3b3JkO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5TbmlwcGV0OiAgICAgICByZXR1cm4gSy5TbmlwcGV0O1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5Db25zdGFudDogICAgICByZXR1cm4gSy5Db25zdGFudDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuU3RydWN0OiAgICAgICAgcmV0dXJuIEsuU3RydWN0O1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5UeXBlUGFyYW1ldGVyOiByZXR1cm4gSy5UeXBlUGFyYW1ldGVyO1xuICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSy5UZXh0O1xuICAgIH1cbn1cblxuZnVuY3Rpb24gbHNwQ29tcGxldGlvblRvTW9uYWNvKFxuICAgIGl0ZW06IENvbXBsZXRpb25JdGVtLFxuICAgIG1vZGVsOiBtb25hY28uZWRpdG9yLklUZXh0TW9kZWwsXG4gICAgcG9zaXRpb246IG1vbmFjby5Qb3NpdGlvbixcbik6IE1vbmFjb0NvbXBsZXRpb25JdGVtIHtcbiAgICBjb25zdCB3b3JkID0gbW9kZWwuZ2V0V29yZFVudGlsUG9zaXRpb24ocG9zaXRpb24pO1xuICAgIGxldCByYW5nZTogbW9uYWNvLklSYW5nZSA9IHtcbiAgICAgICAgc3RhcnRMaW5lTnVtYmVyOiBwb3NpdGlvbi5saW5lTnVtYmVyLFxuICAgICAgICBzdGFydENvbHVtbjogICAgIHdvcmQuc3RhcnRDb2x1bW4sXG4gICAgICAgIGVuZExpbmVOdW1iZXI6ICAgcG9zaXRpb24ubGluZU51bWJlcixcbiAgICAgICAgZW5kQ29sdW1uOiAgICAgICB3b3JkLmVuZENvbHVtbixcbiAgICB9O1xuICAgIGxldCBpbnNlcnRUZXh0ID0gaXRlbS5pbnNlcnRUZXh0ID8/IGl0ZW0ubGFiZWw7XG4gICAgY29uc3QgdGV4dEVkaXQgPSBpdGVtLnRleHRFZGl0IGFzIHsgcmFuZ2U/OiBMc3BSYW5nZTsgcmVwbGFjZT86IExzcFJhbmdlOyBpbnNlcnQ/OiBMc3BSYW5nZTsgbmV3VGV4dD86IHN0cmluZyB9IHwgdW5kZWZpbmVkO1xuICAgIGlmICh0ZXh0RWRpdCkge1xuICAgICAgICBjb25zdCByID0gdGV4dEVkaXQucmFuZ2UgPz8gdGV4dEVkaXQucmVwbGFjZSA/PyB0ZXh0RWRpdC5pbnNlcnQ7XG4gICAgICAgIGlmIChyKSByYW5nZSA9IGxzcFJhbmdlVG9Nb25hY28ocik7XG4gICAgICAgIGlmICh0eXBlb2YgdGV4dEVkaXQubmV3VGV4dCA9PT0gJ3N0cmluZycpIGluc2VydFRleHQgPSB0ZXh0RWRpdC5uZXdUZXh0O1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQ6IE1vbmFjb0NvbXBsZXRpb25JdGVtID0ge1xuICAgICAgICBsYWJlbDogICAgICAgICAgIGl0ZW0ubGFiZWwsXG4gICAgICAgIGtpbmQ6ICAgICAgICAgICAgbHNwQ29tcGxldGlvbktpbmQoaXRlbS5raW5kKSxcbiAgICAgICAgZGV0YWlsOiAgICAgICAgICBpdGVtLmRldGFpbCxcbiAgICAgICAgZG9jdW1lbnRhdGlvbjogICBpdGVtLmRvY3VtZW50YXRpb24gPyB7IHZhbHVlOiBtYXJrdXBUb1N0cmluZyhpdGVtLmRvY3VtZW50YXRpb24pLCBpc1RydXN0ZWQ6IGZhbHNlIH0gOiB1bmRlZmluZWQsXG4gICAgICAgIGluc2VydFRleHQsXG4gICAgICAgIGluc2VydFRleHRSdWxlczogaXRlbS5pbnNlcnRUZXh0Rm9ybWF0ID09PSBJbnNlcnRUZXh0Rm9ybWF0LlNuaXBwZXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtSW5zZXJ0VGV4dFJ1bGUuSW5zZXJ0QXNTbmlwcGV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICByYW5nZSxcbiAgICAgICAgc29ydFRleHQ6ICAgICAgICAgICAgc2RrUHJpb3JpdGlzZWRTb3J0VGV4dChpdGVtKSxcbiAgICAgICAgZmlsdGVyVGV4dDogICAgICAgICAgaXRlbS5maWx0ZXJUZXh0LFxuICAgICAgICBwcmVzZWxlY3Q6ICAgICAgICAgICBpdGVtLnByZXNlbGVjdCxcbiAgICAgICAgY29tbWl0Q2hhcmFjdGVyczogICAgaXRlbS5jb21taXRDaGFyYWN0ZXJzLFxuICAgICAgICBhZGRpdGlvbmFsVGV4dEVkaXRzOiBpdGVtLmFkZGl0aW9uYWxUZXh0RWRpdHM/Lm1hcCh0ZXh0RWRpdFRvTW9uYWNvKSxcbiAgICB9O1xuICAgIHJlc3VsdC5fbHNwID0gaXRlbTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFJhbmtzIERpcmlnaWJsZSBTREsgc3VnZ2VzdGlvbnMgKHtAY29kZSBvcmcuZWNsaXBzZS5kaXJpZ2libGUuc2RrLip9KSBhYm92ZSBldmVyeXRoaW5nIGVsc2UgYnlcbiAqIHByZWZpeGluZyB0aGUgc2VydmVyIHNvcnRUZXh0IHdpdGggYSBwcmlvcml0eSBidWNrZXQsIHByZXNlcnZpbmcgdGhlIHNlcnZlciBvcmRlciB3aXRoaW4gZWFjaCBidWNrZXQuXG4gKi9cbmZ1bmN0aW9uIHNka1ByaW9yaXRpc2VkU29ydFRleHQoaXRlbTogQ29tcGxldGlvbkl0ZW0pOiBzdHJpbmcge1xuICAgIGNvbnN0IGJhc2UgPSBpdGVtLnNvcnRUZXh0ID8/ICh0eXBlb2YgaXRlbS5sYWJlbCA9PT0gJ3N0cmluZycgPyBpdGVtLmxhYmVsIDogJycpO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gKGl0ZW0ubGFiZWxEZXRhaWxzICYmIHR5cGVvZiBpdGVtLmxhYmVsRGV0YWlscy5kZXNjcmlwdGlvbiA9PT0gJ3N0cmluZycpXG4gICAgICAgID8gaXRlbS5sYWJlbERldGFpbHMuZGVzY3JpcHRpb24gOiAnJztcbiAgICBjb25zdCBoYXlzdGFjayA9IGAke2l0ZW0uZGV0YWlsID8/ICcnfSAke2Rlc2NyaXB0aW9ufWA7XG4gICAgcmV0dXJuIGhheXN0YWNrLmluY2x1ZGVzKCdvcmcuZWNsaXBzZS5kaXJpZ2libGUuc2RrJykgPyBgMF8ke2Jhc2V9YCA6IGAxXyR7YmFzZX1gO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDb2RlIGFjdGlvbnMsIGNvbW1hbmRzLCByZWZhY3Rvci9nZW5lcmF0ZSwgd29ya3NwYWNlIGVkaXRzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBNb25hY28gY29tbWFuZCBpZCB1c2VkIHRvIGFwcGx5IGEgZGVmZXJyZWQgTFNQIGNvZGUgYWN0aW9uIHdoZW4gdGhlIHVzZXIgc2VsZWN0cyBpdC4gKi9cbmNvbnN0IEFQUExZX0FDVElPTl9DT01NQU5EID0gJ2RpcmlnaWJsZS5qYXZhLmFwcGx5Q29kZUFjdGlvbic7XG5cbi8qKiBWaXJ0dWFsIFVSSSBwcmVmaXggb2YgZWRpdG9yIG1vZGVsczsgc3RyaXBwaW5nIGl0IHlpZWxkcyB0aGUgSURFIHdvcmtzcGFjZSBwYXRoICgvd3MvcHJvai8uLi4pLiAqL1xuY29uc3QgVklSVFVBTF9GSUxFX1BSRUZJWCA9ICdmaWxlOi8vL3dvcmtzcGFjZSc7XG5cbi8qKiBNb25hY28gY29tbWFuZCBpZCB1c2VkIGZvciBkaXNwbGF5LW9ubHkgQ29kZUxlbnNlcyAoZS5nLiBhIHJlZmVyZW5jZSBjb3VudCB3aXRoIG5vIHJlc29sdmVkIGFjdGlvbikuICovXG5jb25zdCBOT09QX0NPTU1BTkQgPSAnZGlyaWdpYmxlLmphdmEubm9vcExlbnMnO1xuXG4vKiogSmF2YSBTRSBrZXl3b3Jkcy9saXRlcmFscyBvZmZlcmVkIGFzIGxvdy1wcmlvcml0eSBjb21wbGV0aW9uIHNvIHRoZXkgYWx3YXlzIGFwcGVhciB3aGlsZSB0eXBpbmcuICovXG5jb25zdCBKQVZBX0tFWVdPUkRTID0gWydhYnN0cmFjdCcsICdhc3NlcnQnLCAnYm9vbGVhbicsICdicmVhaycsICdieXRlJywgJ2Nhc2UnLCAnY2F0Y2gnLCAnY2hhcicsICdjbGFzcycsXG4gICAgJ2NvbnN0JywgJ2NvbnRpbnVlJywgJ2RlZmF1bHQnLCAnZG8nLCAnZG91YmxlJywgJ2Vsc2UnLCAnZW51bScsICdleHRlbmRzJywgJ2ZpbmFsJywgJ2ZpbmFsbHknLCAnZmxvYXQnLFxuICAgICdmb3InLCAnZ290bycsICdpZicsICdpbXBsZW1lbnRzJywgJ2ltcG9ydCcsICdpbnN0YW5jZW9mJywgJ2ludCcsICdpbnRlcmZhY2UnLCAnbG9uZycsICduYXRpdmUnLCAnbmV3JyxcbiAgICAncGFja2FnZScsICdwcml2YXRlJywgJ3Byb3RlY3RlZCcsICdwdWJsaWMnLCAncmV0dXJuJywgJ3Nob3J0JywgJ3N0YXRpYycsICdzdHJpY3RmcCcsICdzdXBlcicsICdzd2l0Y2gnLFxuICAgICdzeW5jaHJvbml6ZWQnLCAndGhpcycsICd0aHJvdycsICd0aHJvd3MnLCAndHJhbnNpZW50JywgJ3RyeScsICd2b2lkJywgJ3ZvbGF0aWxlJywgJ3doaWxlJywgJ3ZhcicsXG4gICAgJ3lpZWxkJywgJ3JlY29yZCcsICdzZWFsZWQnLCAncGVybWl0cycsICd0cnVlJywgJ2ZhbHNlJywgJ251bGwnXTtcblxuLyoqIFNoYXJlZCBkZWZpbml0aW9uLXN0eWxlIGxvY2F0aW9uIHJlcXVlc3QgdXNlZCBieSBnby10by1kZWZpbml0aW9uL2ltcGxlbWVudGF0aW9uL3R5cGUtZGVmaW5pdGlvbi4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RMb2NhdGlvbnMobWV0aG9kOiBzdHJpbmcsIG1vZGVsOiBtb25hY28uZWRpdG9yLklUZXh0TW9kZWwsIHBvc2l0aW9uOiBtb25hY28uUG9zaXRpb24pIHtcbiAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCByZXN1bHQ6IExvY2F0aW9uIHwgTG9jYXRpb25bXSB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdChtZXRob2QsIHtcbiAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICB9KTtcbiAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgbG9jYXRpb25zID0gKEFycmF5LmlzQXJyYXkocmVzdWx0KSA/IHJlc3VsdCA6IFtyZXN1bHRdKS5tYXAobG9jID0+ICh7IHVyaTogbW9uYWNvLlVyaS5wYXJzZShsb2MudXJpKSwgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28obG9jLnJhbmdlKSB9KSk7XG4gICAgYXdhaXQgZW5zdXJlTW9kZWxzRm9yTG9jYXRpb25zKGxvY2F0aW9ucyk7XG4gICAgcmV0dXJuIGxvY2F0aW9ucztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGluLW1lbW9yeSBNb25hY28gbW9kZWxzIGZvciB0aGUgd29ya3NwYWNlIGZpbGVzIHJlZmVyZW5jZWQgYnkgdGhlIGdpdmVuIGxvY2F0aW9ucyAoZmV0Y2hlZFxuICogb3ZlciBSRVNUKSBzbyB0aGUgcmVmZXJlbmNlcyAvIHBlZWsgd2lkZ2V0cyBjYW4gcmVuZGVyIGEgY29kZSBwcmV2aWV3IFx1MjAxNCBNb25hY28gY2FuIG9ubHkgcHJldmlldyBmaWxlc1xuICogaXQgaGFzIGEgbW9kZWwgZm9yLCBhbmQgdGhpcyBzaW5nbGUtZmlsZSBlZGl0b3Igb3RoZXJ3aXNlIGhhcyBub25lIGZvciBvdGhlciBmaWxlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZW5zdXJlTW9kZWxzRm9yTG9jYXRpb25zKGxvY2F0aW9uczogQXJyYXk8eyB1cmk6IG1vbmFjby5VcmkgfT4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwobG9jYXRpb25zLm1hcChhc3luYyAoeyB1cmkgfSkgPT4ge1xuICAgICAgICBjb25zdCB1cmlTdHIgPSB1cmkudG9TdHJpbmcoKTtcbiAgICAgICAgaWYgKHNlZW4uaGFzKHVyaVN0cikgfHwgIXVyaVN0ci5zdGFydHNXaXRoKFZJUlRVQUxfRklMRV9QUkVGSVgpIHx8IG1vbmFjby5lZGl0b3IuZ2V0TW9kZWwodXJpKSkgcmV0dXJuO1xuICAgICAgICBzZWVuLmFkZCh1cmlTdHIpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgdGV4dCA9IGF3YWl0IGZldGNoV29ya3NwYWNlRmlsZVRleHQodXJpVG9Xb3Jrc3BhY2VQYXRoKHVyaVN0cikgPz8gdXJpU3RyKTtcbiAgICAgICAgICAgIGlmICghbW9uYWNvLmVkaXRvci5nZXRNb2RlbCh1cmkpKSBtb25hY28uZWRpdG9yLmNyZWF0ZU1vZGVsKHRleHQsICdqYXZhJywgdXJpKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBwcmV2aWV3IGp1c3Qgd29uJ3QgcmVuZGVyIGZvciB0aGlzIG9uZVxuICAgICAgICB9XG4gICAgfSkpO1xufVxuXG4vKiogUmVjdXJzaXZlbHkgbWFwcyBMU1AgaGllcmFyY2hpY2FsIERvY3VtZW50U3ltYm9scyB0byBNb25hY28ncyBzaGFwZSAoa2luZHMgYXJlIDEtYmFzZWQgdnMgMC1iYXNlZCkuICovXG5mdW5jdGlvbiBtYXBEb2N1bWVudFN5bWJvbHMoc3ltYm9sczogYW55W10pOiBtb25hY28ubGFuZ3VhZ2VzLkRvY3VtZW50U3ltYm9sW10ge1xuICAgIHJldHVybiAoc3ltYm9scyA/PyBbXSkubWFwKHMgPT4gKHtcbiAgICAgICAgbmFtZTogICAgICAgICAgIHMubmFtZSxcbiAgICAgICAgZGV0YWlsOiAgICAgICAgIHMuZGV0YWlsID8/ICcnLFxuICAgICAgICBraW5kOiAgICAgICAgICAgKHMua2luZCA/PyAxKSAtIDEsXG4gICAgICAgIHRhZ3M6ICAgICAgICAgICBzLnRhZ3MgPz8gW10sXG4gICAgICAgIHJhbmdlOiAgICAgICAgICBsc3BSYW5nZVRvTW9uYWNvKHMucmFuZ2UpLFxuICAgICAgICBzZWxlY3Rpb25SYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhzLnNlbGVjdGlvblJhbmdlID8/IHMucmFuZ2UpLFxuICAgICAgICBjaGlsZHJlbjogICAgICAgcy5jaGlsZHJlbiA/IG1hcERvY3VtZW50U3ltYm9scyhzLmNoaWxkcmVuKSA6IFtdLFxuICAgIH0pKTtcbn1cblxuZnVuY3Rpb24gZm9sZGluZ0tpbmQoa2luZDogc3RyaW5nIHwgdW5kZWZpbmVkKTogbW9uYWNvLmxhbmd1YWdlcy5Gb2xkaW5nUmFuZ2VLaW5kIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBGSyA9IG1vbmFjby5sYW5ndWFnZXMuRm9sZGluZ1JhbmdlS2luZDtcbiAgICBzd2l0Y2ggKGtpbmQpIHtcbiAgICAgICAgY2FzZSAnY29tbWVudCc6IHJldHVybiBGSy5Db21tZW50O1xuICAgICAgICBjYXNlICdpbXBvcnRzJzogcmV0dXJuIEZLLkltcG9ydHM7XG4gICAgICAgIGNhc2UgJ3JlZ2lvbic6ICByZXR1cm4gRksuUmVnaW9uO1xuICAgICAgICBkZWZhdWx0OiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG59XG5cbi8qKiBGbGF0dGVucyBhbiBMU1AgU2VsZWN0aW9uUmFuZ2UgcGFyZW50LWNoYWluIGludG8gTW9uYWNvJ3MgaW5uZXJtb3N0LXRvLW91dGVybW9zdCBhcnJheS4gKi9cbmZ1bmN0aW9uIGZsYXR0ZW5TZWxlY3Rpb25SYW5nZShzZWxlY3Rpb25SYW5nZTogYW55KTogbW9uYWNvLmxhbmd1YWdlcy5TZWxlY3Rpb25SYW5nZVtdIHtcbiAgICBjb25zdCByYW5nZXM6IG1vbmFjby5sYW5ndWFnZXMuU2VsZWN0aW9uUmFuZ2VbXSA9IFtdO1xuICAgIGxldCBjdXJyZW50ID0gc2VsZWN0aW9uUmFuZ2U7XG4gICAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICAgICAgcmFuZ2VzLnB1c2goeyByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhjdXJyZW50LnJhbmdlKSB9KTtcbiAgICAgICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50O1xuICAgIH1cbiAgICByZXR1cm4gcmFuZ2VzO1xufVxuXG4vKiogTWFwcyBhIEpEVC5MUyBDb2RlTGVucyBjb21tYW5kIHRvIGEgTW9uYWNvIGNvbW1hbmQsIHdpcmluZyB0aGUgcmVmZXJlbmNlcy9pbXBsZW1lbnRhdGlvbnMgcGVlay4gKi9cbmZ1bmN0aW9uIG1hcExlbnNDb21tYW5kKGNtZDogYW55KTogbW9uYWNvLmxhbmd1YWdlcy5Db21tYW5kIHtcbiAgICBjb25zdCBhcmdzID0gY21kLmFyZ3VtZW50cyA/PyBbXTtcbiAgICBpZiAoKGNtZC5jb21tYW5kID09PSAnamF2YS5zaG93LnJlZmVyZW5jZXMnIHx8IGNtZC5jb21tYW5kID09PSAnamF2YS5zaG93LmltcGxlbWVudGF0aW9ucycpICYmIGFyZ3MubGVuZ3RoID49IDMpIHtcbiAgICAgICAgY29uc3QgbG9jYXRpb25zID0gKGFyZ3NbMl0gPz8gW10pLm1hcCgobDogYW55KSA9PiAoeyB1cmk6IG1vbmFjby5VcmkucGFyc2UobC51cmkpLCByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhsLnJhbmdlKSB9KSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZDogICAgICAgICdlZGl0b3IuYWN0aW9uLnNob3dSZWZlcmVuY2VzJyxcbiAgICAgICAgICAgIHRpdGxlOiAgICAgY21kLnRpdGxlLFxuICAgICAgICAgICAgYXJndW1lbnRzOiBbbW9uYWNvLlVyaS5wYXJzZShhcmdzWzBdKSwgeyBsaW5lTnVtYmVyOiBhcmdzWzFdLmxpbmUgKyAxLCBjb2x1bW46IGFyZ3NbMV0uY2hhcmFjdGVyICsgMSB9LCBsb2NhdGlvbnNdLFxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4geyBpZDogTk9PUF9DT01NQU5ELCB0aXRsZTogY21kLnRpdGxlIH07XG59XG5cbnR5cGUgTHNwUmFuZ2UgPSB7IHN0YXJ0OiB7IGxpbmU6IG51bWJlcjsgY2hhcmFjdGVyOiBudW1iZXIgfTsgZW5kOiB7IGxpbmU6IG51bWJlcjsgY2hhcmFjdGVyOiBudW1iZXIgfSB9O1xuXG4vKiogTW9uYWNvIGNvbXBsZXRpb24gaXRlbSBjYXJyeWluZyB0aGUgb3JpZ2luYXRpbmcgTFNQIGl0ZW0gc28gcmVzb2x2ZSBjYW4gZmV0Y2ggaXRzIGltcG9ydCBlZGl0cy4gKi9cbnR5cGUgTW9uYWNvQ29tcGxldGlvbkl0ZW0gPSBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtICYgeyBfbHNwPzogQ29tcGxldGlvbkl0ZW0gfTtcblxuZnVuY3Rpb24gdGV4dEVkaXRUb01vbmFjbyhlZGl0OiBUZXh0RWRpdCk6IG1vbmFjby5sYW5ndWFnZXMuVGV4dEVkaXQge1xuICAgIHJldHVybiB7IHJhbmdlOiBsc3BSYW5nZVRvTW9uYWNvKGVkaXQucmFuZ2UpLCB0ZXh0OiBlZGl0Lm5ld1RleHQgfTtcbn1cblxuZnVuY3Rpb24gbW9uYWNvUmFuZ2VUb0xzcChyOiBtb25hY28uSVJhbmdlKTogTHNwUmFuZ2Uge1xuICAgIHJldHVybiB7XG4gICAgICAgIHN0YXJ0OiB7IGxpbmU6IHIuc3RhcnRMaW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiByLnN0YXJ0Q29sdW1uIC0gMSB9LFxuICAgICAgICBlbmQ6ICAgeyBsaW5lOiByLmVuZExpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHIuZW5kQ29sdW1uIC0gMSB9LFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIG1vbmFjb1NldmVyaXR5VG9Mc3Aoc2V2ZXJpdHk6IG1vbmFjby5NYXJrZXJTZXZlcml0eSk6IERpYWdub3N0aWNTZXZlcml0eSB7XG4gICAgc3dpdGNoIChzZXZlcml0eSkge1xuICAgICAgICBjYXNlIG1vbmFjby5NYXJrZXJTZXZlcml0eS5FcnJvcjogICByZXR1cm4gRGlhZ25vc3RpY1NldmVyaXR5LkVycm9yO1xuICAgICAgICBjYXNlIG1vbmFjby5NYXJrZXJTZXZlcml0eS5XYXJuaW5nOiByZXR1cm4gRGlhZ25vc3RpY1NldmVyaXR5Lldhcm5pbmc7XG4gICAgICAgIGNhc2UgbW9uYWNvLk1hcmtlclNldmVyaXR5LkluZm86ICAgIHJldHVybiBEaWFnbm9zdGljU2V2ZXJpdHkuSW5mb3JtYXRpb247XG4gICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBEaWFnbm9zdGljU2V2ZXJpdHkuSGludDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIG1hcmtlclRvTHNwRGlhZ25vc3RpYyhtOiBtb25hY28uZWRpdG9yLklNYXJrZXJEYXRhKTogRGlhZ25vc3RpYyB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcmFuZ2U6ICAgIHsgc3RhcnQ6IHsgbGluZTogbS5zdGFydExpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IG0uc3RhcnRDb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICAgICAgICAgIGVuZDogICB7IGxpbmU6IG0uZW5kTGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogbS5lbmRDb2x1bW4gLSAxIH0gfSxcbiAgICAgICAgbWVzc2FnZTogIG0ubWVzc2FnZSxcbiAgICAgICAgc2V2ZXJpdHk6IG1vbmFjb1NldmVyaXR5VG9Mc3AobS5zZXZlcml0eSksXG4gICAgICAgIHNvdXJjZTogICBtLnNvdXJjZSxcbiAgICB9IGFzIERpYWdub3N0aWM7XG59XG5cbmZ1bmN0aW9uIGxzcENvZGVBY3Rpb25Ub01vbmFjbyhhY3Rpb246IENvZGVBY3Rpb24gfCBDb21tYW5kKTogbW9uYWNvLmxhbmd1YWdlcy5Db2RlQWN0aW9uIHtcbiAgICBjb25zdCBpc0NvbW1hbmQgPSB0eXBlb2YgKGFjdGlvbiBhcyBDb21tYW5kKS5jb21tYW5kID09PSAnc3RyaW5nJztcbiAgICBjb25zdCB0aXRsZSA9IGFjdGlvbi50aXRsZVxuICAgICAgICA/PyAoaXNDb21tYW5kID8gKGFjdGlvbiBhcyBDb21tYW5kKS5jb21tYW5kIDogKGFjdGlvbiBhcyBDb2RlQWN0aW9uKS5jb21tYW5kPy50aXRsZSlcbiAgICAgICAgPz8gJ0FjdGlvbic7XG4gICAgY29uc3Qga2luZCA9IGlzQ29tbWFuZCA/ICdxdWlja2ZpeCcgOiAoKGFjdGlvbiBhcyBDb2RlQWN0aW9uKS5raW5kID8/ICdxdWlja2ZpeCcpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHRpdGxlLFxuICAgICAgICBraW5kLFxuICAgICAgICBkaWFnbm9zdGljczogW10sXG4gICAgICAgIGlzUHJlZmVycmVkOiAoYWN0aW9uIGFzIENvZGVBY3Rpb24pLmlzUHJlZmVycmVkLFxuICAgICAgICAvLyBBcHBseSBsYXppbHkgdGhyb3VnaCBvdXIgY29tbWFuZCBzbyB3ZSBjYW4gcmVzb2x2ZSwgcnVuIHNlcnZlciBjb21tYW5kcyBhbmQgYXBwbHkgZWRpdHMgdW5pZm9ybWx5LlxuICAgICAgICBjb21tYW5kOiB7IGlkOiBBUFBMWV9BQ1RJT05fQ09NTUFORCwgdGl0bGUsIGFyZ3VtZW50czogW2FjdGlvbl0gfSxcbiAgICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBhcHBseUNvZGVBY3Rpb24oYWN0aW9uOiBDb2RlQWN0aW9uIHwgQ29tbWFuZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghX2Nvbm4pIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIChhY3Rpb24gYXMgQ29tbWFuZCkuY29tbWFuZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGF3YWl0IHJ1blNlcnZlckNvbW1hbmQoYWN0aW9uIGFzIENvbW1hbmQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXNvbHZlZCA9IGFjdGlvbiBhcyBDb2RlQWN0aW9uO1xuICAgICAgICBpZiAoIXJlc29sdmVkLmVkaXQgJiYgKHJlc29sdmVkIGFzIHsgZGF0YT86IHVua25vd24gfSkuZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXNvbHZlZCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCdjb2RlQWN0aW9uL3Jlc29sdmUnLCByZXNvbHZlZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc29sdmVkLmVkaXQpIGFwcGx5V29ya3NwYWNlRWRpdChyZXNvbHZlZC5lZGl0KTtcbiAgICAgICAgaWYgKHJlc29sdmVkLmNvbW1hbmQpIGF3YWl0IHJ1blNlcnZlckNvbW1hbmQocmVzb2x2ZWQuY29tbWFuZCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tqYXZhLWxzcF0gY29kZSBhY3Rpb24gZmFpbGVkOicsIChlIGFzIEVycm9yKT8ubWVzc2FnZSA/PyBlKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGlzV29ya3NwYWNlRWRpdCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFdvcmtzcGFjZUVkaXQge1xuICAgIHJldHVybiAhIXZhbHVlICYmICghISh2YWx1ZSBhcyBXb3Jrc3BhY2VFZGl0KS5jaGFuZ2VzIHx8ICEhKHZhbHVlIGFzIFdvcmtzcGFjZUVkaXQpLmRvY3VtZW50Q2hhbmdlcyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1blNlcnZlckNvbW1hbmQoY21kOiBDb21tYW5kKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFfY29ubiB8fCAhY21kPy5jb21tYW5kKSByZXR1cm47XG4gICAgaWYgKEdFTkVSQVRFW2NtZC5jb21tYW5kXSkge1xuICAgICAgICBhd2FpdCBydW5HZW5lcmF0ZShjbWQuY29tbWFuZCwgY21kLmFyZ3VtZW50cyA/PyBbXSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3dvcmtzcGFjZS9leGVjdXRlQ29tbWFuZCcsIHsgY29tbWFuZDogY21kLmNvbW1hbmQsIGFyZ3VtZW50czogY21kLmFyZ3VtZW50cyA/PyBbXSB9KTtcbiAgICBpZiAoaXNXb3Jrc3BhY2VFZGl0KHJlc3VsdCkpIGFwcGx5V29ya3NwYWNlRWRpdChyZXN1bHQpO1xufVxuXG5pbnRlcmZhY2UgR2VuZXJhdGVTcGVjIHtcbiAgICBsYWJlbDogc3RyaW5nO1xuICAgIHN0YXR1czogc3RyaW5nO1xuICAgIGdlbmVyYXRlOiBzdHJpbmc7XG4gICAgbWVtYmVyczogKHN0YXR1czogYW55KSA9PiBBcnJheTx7IGxhYmVsOiBzdHJpbmc7IHJlZjogYW55IH0+O1xuICAgIGJ1aWxkQXJnczogKHByb21wdEFyZ3M6IGFueVtdLCBzdGF0dXM6IGFueSwgc2VsZWN0ZWQ6IGFueVtdKSA9PiBhbnlbXTtcbn1cblxuLyoqIE1lbWJlci1uYW1lZCBmaWVsZHMgXHUyMTkyIHBpY2tlciBsYWJlbHMuICovXG5mdW5jdGlvbiBmaWVsZExhYmVsKGY6IGFueSk6IHN0cmluZyB7XG4gICAgY29uc3QgbmFtZSA9IGY/Lm5hbWUgPz8gZj8uZmllbGROYW1lID8/ICcnO1xuICAgIGNvbnN0IHR5cGUgPSBmPy50eXBlID8/IGY/LnR5cGVOYW1lO1xuICAgIHJldHVybiB0eXBlID8gYCR7bmFtZX06ICR7dHlwZX1gIDogYCR7bmFtZX1gO1xufVxuXG4vKipcbiAqIFRoZSBKRFQuTFMgc291cmNlLWdlbmVyYXRpb24gY29tbWFuZHMgKGNvbnN0cnVjdG9ycywgZ2V0dGVycy9zZXR0ZXJzLCB0b1N0cmluZywgaGFzaENvZGUvZXF1YWxzKS5cbiAqIEVhY2ggbWFwcyB0aGUgY2xpZW50IFwiKlByb21wdFwiIGNvbW1hbmQgdG8gdGhlIHNlcnZlciBzdGF0dXMgKyBnZW5lcmF0ZSBkZWxlZ2F0ZSBjb21tYW5kczsgdGhlIHN0YXR1c1xuICogY2FsbCB5aWVsZHMgdGhlIGNhbmRpZGF0ZSBmaWVsZHMgc2hvd24gaW4gdGhlIG1lbWJlciBwaWNrZXIsIHRoZSBnZW5lcmF0ZSBjYWxsIHJldHVybnMgdGhlIGVkaXQuXG4gKi9cbmNvbnN0IEdFTkVSQVRFOiBSZWNvcmQ8c3RyaW5nLCBHZW5lcmF0ZVNwZWM+ID0ge1xuICAgICdqYXZhLmFjdGlvbi5nZW5lcmF0ZUNvbnN0cnVjdG9yc1Byb21wdCc6IHtcbiAgICAgICAgbGFiZWw6ICdTZWxlY3QgZmllbGRzIGFuZCBjb25zdHJ1Y3RvcnMnLFxuICAgICAgICBzdGF0dXM6ICdqYXZhLmFjdGlvbi5jaGVja0NvbnN0cnVjdG9yc1N0YXR1cycsXG4gICAgICAgIGdlbmVyYXRlOiAnamF2YS5hY3Rpb24uZ2VuZXJhdGVDb25zdHJ1Y3RvcnMnLFxuICAgICAgICBtZW1iZXJzOiAocykgPT4gKHM/LmZpZWxkcyA/PyBbXSkubWFwKChmOiBhbnkpID0+ICh7IGxhYmVsOiBmaWVsZExhYmVsKGYpLCByZWY6IGYgfSkpLFxuICAgICAgICBidWlsZEFyZ3M6IChhcmdzLCBzLCBzZWwpID0+IFthcmdzWzBdLCB7IGNvbnN0cnVjdG9yczogcz8uY29uc3RydWN0b3JzID8/IFtdLCBmaWVsZHM6IHNlbC5tYXAobSA9PiBtLnJlZikgfV0sXG4gICAgfSxcbiAgICAnamF2YS5hY3Rpb24uZ2VuZXJhdGVUb1N0cmluZ1Byb21wdCc6IHtcbiAgICAgICAgbGFiZWw6ICdTZWxlY3QgZmllbGRzIHRvIGluY2x1ZGUgaW4gdG9TdHJpbmcoKScsXG4gICAgICAgIHN0YXR1czogJ2phdmEuYWN0aW9uLmNoZWNrVG9TdHJpbmdTdGF0dXMnLFxuICAgICAgICBnZW5lcmF0ZTogJ2phdmEuYWN0aW9uLmdlbmVyYXRlVG9TdHJpbmcnLFxuICAgICAgICBtZW1iZXJzOiAocykgPT4gKHM/LmZpZWxkcyA/PyBbXSkubWFwKChmOiBhbnkpID0+ICh7IGxhYmVsOiBmaWVsZExhYmVsKGYpLCByZWY6IGYgfSkpLFxuICAgICAgICBidWlsZEFyZ3M6IChhcmdzLCBfcywgc2VsKSA9PiBbYXJnc1swXSwgc2VsLm1hcChtID0+IG0ucmVmKV0sXG4gICAgfSxcbiAgICAnamF2YS5hY3Rpb24uaGFzaENvZGVFcXVhbHNQcm9tcHQnOiB7XG4gICAgICAgIGxhYmVsOiAnU2VsZWN0IGZpZWxkcyBmb3IgaGFzaENvZGUoKSBhbmQgZXF1YWxzKCknLFxuICAgICAgICBzdGF0dXM6ICdqYXZhLmFjdGlvbi5jaGVja0hhc2hDb2RlRXF1YWxzU3RhdHVzJyxcbiAgICAgICAgZ2VuZXJhdGU6ICdqYXZhLmFjdGlvbi5nZW5lcmF0ZUhhc2hDb2RlRXF1YWxzJyxcbiAgICAgICAgbWVtYmVyczogKHMpID0+IChzPy5maWVsZHMgPz8gW10pLm1hcCgoZjogYW55KSA9PiAoeyBsYWJlbDogZmllbGRMYWJlbChmKSwgcmVmOiBmIH0pKSxcbiAgICAgICAgYnVpbGRBcmdzOiAoYXJncywgX3MsIHNlbCkgPT4gW2FyZ3NbMF0sIHNlbC5tYXAobSA9PiBtLnJlZiksIGZhbHNlXSxcbiAgICB9LFxuICAgICdqYXZhLmFjdGlvbi5nZW5lcmF0ZUFjY2Vzc29yc1Byb21wdCc6IHtcbiAgICAgICAgbGFiZWw6ICdTZWxlY3QgZmllbGRzIHRvIGdlbmVyYXRlIGdldHRlcnMgYW5kIHNldHRlcnMnLFxuICAgICAgICBzdGF0dXM6ICdqYXZhLmFjdGlvbi5jaGVja0FjY2Vzc29yc1N0YXR1cycsXG4gICAgICAgIGdlbmVyYXRlOiAnamF2YS5hY3Rpb24uZ2VuZXJhdGVBY2Nlc3NvcnMnLFxuICAgICAgICBtZW1iZXJzOiAocykgPT4gKHM/LmFjY2Vzc29ycyA/PyBzID8/IFtdKS5tYXAoKGE6IGFueSkgPT4gKHsgbGFiZWw6IGZpZWxkTGFiZWwoYSksIHJlZjogYSB9KSksXG4gICAgICAgIGJ1aWxkQXJnczogKGFyZ3MsIF9zLCBzZWwpID0+IFthcmdzWzBdLCBzZWwubWFwKG0gPT4gbS5yZWYpXSxcbiAgICB9LFxuICAgICdqYXZhLmFjdGlvbi5vdmVycmlkZU1ldGhvZHNQcm9tcHQnOiB7XG4gICAgICAgIGxhYmVsOiAnU2VsZWN0IG1ldGhvZHMgdG8gb3ZlcnJpZGUgb3IgaW1wbGVtZW50JyxcbiAgICAgICAgc3RhdHVzOiAnamF2YS5hY3Rpb24ubGlzdE92ZXJyaWRhYmxlTWV0aG9kcycsXG4gICAgICAgIGdlbmVyYXRlOiAnamF2YS5hY3Rpb24uYWRkT3ZlcnJpZGFibGVNZXRob2RzJyxcbiAgICAgICAgbWVtYmVyczogKHMpID0+IChzPy5tZXRob2RzID8/IFtdKS5tYXAoKG06IGFueSkgPT4gKHtcbiAgICAgICAgICAgIGxhYmVsOiBgJHttLm5hbWV9KCR7KG0ucGFyYW1ldGVycyA/PyBbXSkuam9pbignLCAnKX0pJHttLmRlY2xhcmluZ0NsYXNzID8gJyA6ICcgKyBtLmRlY2xhcmluZ0NsYXNzIDogJyd9YCxcbiAgICAgICAgICAgIHJlZjogbSxcbiAgICAgICAgfSkpLFxuICAgICAgICBidWlsZEFyZ3M6IChhcmdzLCBzdGF0dXMsIHNlbCkgPT4gW2FyZ3NbMF0sIHsgb3ZlcnJpZGFibGVNZXRob2RzOiBzZWwubWFwKG0gPT4gbS5yZWYpLCB0eXBlOiBzdGF0dXM/LnR5cGUgfV0sXG4gICAgfSxcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1bkdlbmVyYXRlKHByb21wdElkOiBzdHJpbmcsIGFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFfY29ubikgcmV0dXJuO1xuICAgIGNvbnN0IHNwZWMgPSBHRU5FUkFURVtwcm9tcHRJZF07XG4gICAgY29uc3Qgc3RhdHVzID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3dvcmtzcGFjZS9leGVjdXRlQ29tbWFuZCcsIHsgY29tbWFuZDogc3BlYy5zdGF0dXMsIGFyZ3VtZW50czogYXJncyB9KTtcbiAgICBpZiAoIXN0YXR1cykgcmV0dXJuO1xuICAgIGNvbnN0IG1lbWJlcnMgPSBzcGVjLm1lbWJlcnMoc3RhdHVzKTtcbiAgICBsZXQgc2VsZWN0ZWQgPSBtZW1iZXJzO1xuICAgIGNvbnN0IHBpY2tlciA9IChnbG9iYWxUaGlzIGFzIGFueSkuamF2YUxzcE1lbWJlclBpY2tlcjtcbiAgICBpZiAobWVtYmVycy5sZW5ndGggJiYgdHlwZW9mIHBpY2tlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjb25zdCBjaG9zZW46IHN0cmluZ1tdIHwgbnVsbCA9IGF3YWl0IHBpY2tlcihzcGVjLmxhYmVsLCBtZW1iZXJzLm1hcChtID0+IG0ubGFiZWwpKTtcbiAgICAgICAgaWYgKGNob3NlbiA9PT0gbnVsbCkgcmV0dXJuOyAvLyB1c2VyIGNhbmNlbGxlZCB0aGUgZGlhbG9nXG4gICAgICAgIHNlbGVjdGVkID0gbWVtYmVycy5maWx0ZXIobSA9PiBjaG9zZW4uaW5jbHVkZXMobS5sYWJlbCkpO1xuICAgIH1cbiAgICBjb25zdCBlZGl0ID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3dvcmtzcGFjZS9leGVjdXRlQ29tbWFuZCcsIHtcbiAgICAgICAgY29tbWFuZDogc3BlYy5nZW5lcmF0ZSxcbiAgICAgICAgYXJndW1lbnRzOiBzcGVjLmJ1aWxkQXJncyhhcmdzLCBzdGF0dXMsIHNlbGVjdGVkKSxcbiAgICB9KTtcbiAgICBpZiAoaXNXb3Jrc3BhY2VFZGl0KGVkaXQpKSBhcHBseVdvcmtzcGFjZUVkaXQoZWRpdCk7XG59XG5cbi8qKiBHcm91cHMgYSB3b3Jrc3BhY2UgZWRpdCdzIHRleHQgZWRpdHMgYnkgZG9jdW1lbnQgYW5kIGFwcGxpZXMgdGhlbSBpbiBwbGFjZSB0byBvcGVuIE1vbmFjbyBtb2RlbHMuICovXG5mdW5jdGlvbiBhcHBseVdvcmtzcGFjZUVkaXQoZWRpdDogV29ya3NwYWNlRWRpdCB8IG51bGwgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBpZiAoIWVkaXQpIHJldHVybjtcbiAgICBjb25zdCBieVVyaTogUmVjb3JkPHN0cmluZywgVGV4dEVkaXRbXT4gPSB7fTtcbiAgICBpZiAoZWRpdC5jaGFuZ2VzKSB7XG4gICAgICAgIGZvciAoY29uc3QgdXJpIGluIGVkaXQuY2hhbmdlcykgYnlVcmlbdXJpXSA9IChieVVyaVt1cmldID8/IFtdKS5jb25jYXQoZWRpdC5jaGFuZ2VzW3VyaV0pO1xuICAgIH1cbiAgICBpZiAoZWRpdC5kb2N1bWVudENoYW5nZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBkYyBvZiBlZGl0LmRvY3VtZW50Q2hhbmdlcyBhcyBhbnlbXSkge1xuICAgICAgICAgICAgaWYgKGRjPy50ZXh0RG9jdW1lbnQ/LnVyaSAmJiBBcnJheS5pc0FycmF5KGRjLmVkaXRzKSkge1xuICAgICAgICAgICAgICAgIGJ5VXJpW2RjLnRleHREb2N1bWVudC51cmldID0gKGJ5VXJpW2RjLnRleHREb2N1bWVudC51cmldID8/IFtdKS5jb25jYXQoZGMuZWRpdHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgdXJpIGluIGJ5VXJpKSB7XG4gICAgICAgIGNvbnN0IG1vZGVsID0gbW9uYWNvLmVkaXRvci5nZXRNb2RlbHMoKS5maW5kKG0gPT4gbS51cmkudG9TdHJpbmcoKSA9PT0gdXJpKTtcbiAgICAgICAgaWYgKCFtb2RlbCkgY29udGludWU7XG4gICAgICAgIGNvbnN0IG9wcyA9IGJ5VXJpW3VyaV0ubWFwKGUgPT4gKHsgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28oZS5yYW5nZSksIHRleHQ6IGUubmV3VGV4dCwgZm9yY2VNb3ZlTWFya2VyczogdHJ1ZSB9KSk7XG4gICAgICAgIG1vZGVsLnB1c2hFZGl0T3BlcmF0aW9ucyhbXSwgb3BzLCAoKSA9PiBudWxsKTtcbiAgICB9XG59XG5cbi8qKiBDb252ZXJ0cyBhbiBMU1Agd29ya3NwYWNlIGVkaXQgaW50byB0aGUgTW9uYWNvIHNoYXBlIHJldHVybmVkIGJ5IHRoZSByZW5hbWUgcHJvdmlkZXIuICovXG5mdW5jdGlvbiB3b3Jrc3BhY2VFZGl0VG9Nb25hY28oZWRpdDogV29ya3NwYWNlRWRpdCB8IG51bGwpOiBtb25hY28ubGFuZ3VhZ2VzLldvcmtzcGFjZUVkaXQge1xuICAgIGNvbnN0IGVkaXRzOiBhbnlbXSA9IFtdO1xuICAgIGNvbnN0IHB1c2ggPSAodXJpOiBzdHJpbmcsIGxpc3Q6IFRleHRFZGl0W10pID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBlIG9mIGxpc3QpIHtcbiAgICAgICAgICAgIGVkaXRzLnB1c2goeyByZXNvdXJjZTogbW9uYWNvLlVyaS5wYXJzZSh1cmkpLCB0ZXh0RWRpdDogeyByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhlLnJhbmdlKSwgdGV4dDogZS5uZXdUZXh0IH0sIHZlcnNpb25JZDogdW5kZWZpbmVkIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBpZiAoZWRpdD8uY2hhbmdlcykge1xuICAgICAgICBmb3IgKGNvbnN0IHVyaSBpbiBlZGl0LmNoYW5nZXMpIHB1c2godXJpLCBlZGl0LmNoYW5nZXNbdXJpXSk7XG4gICAgfVxuICAgIGlmIChlZGl0Py5kb2N1bWVudENoYW5nZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBkYyBvZiBlZGl0LmRvY3VtZW50Q2hhbmdlcyBhcyBhbnlbXSkge1xuICAgICAgICAgICAgaWYgKGRjPy50ZXh0RG9jdW1lbnQ/LnVyaSAmJiBBcnJheS5pc0FycmF5KGRjLmVkaXRzKSkgcHVzaChkYy50ZXh0RG9jdW1lbnQudXJpLCBkYy5lZGl0cyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgZWRpdHMgfTtcbn1cblxuLyoqIE1hcHMgYSB2aXJ0dWFsIGVkaXRvciBVUkkgYmFjayB0byB0aGUgSURFIHdvcmtzcGFjZSBwYXRoICh7QGNvZGUgL3dzL3Byb2ovLi4ufSkuICovXG5mdW5jdGlvbiB1cmlUb1dvcmtzcGFjZVBhdGgodXJpOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoIXVyaS5zdGFydHNXaXRoKFZJUlRVQUxfRklMRV9QUkVGSVgpKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHVyaS5zdWJzdHJpbmcoVklSVFVBTF9GSUxFX1BSRUZJWC5sZW5ndGgpKTtcbn1cblxuLyoqIFJlYWRzIGEgd29ya3NwYWNlIGZpbGUncyBjdXJyZW50IHRleHQgb3ZlciB0aGUgSURFIFJFU1QgQVBJLiAqL1xuYXN5bmMgZnVuY3Rpb24gZmV0Y2hXb3Jrc3BhY2VGaWxlVGV4dChpZGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9zZXJ2aWNlcy9pZGUvd29ya3NwYWNlcycgKyBpZGVQYXRoLCB7IGhlYWRlcnM6IHsgJ1gtUmVxdWVzdGVkLVdpdGgnOiAnRmV0Y2gnIH0gfSk7XG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCByZWFkICR7aWRlUGF0aH0gKEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9KWApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzcG9uc2UudGV4dCgpO1xufVxuXG4vKiogQXBwbGllcyBMU1AgdGV4dCBlZGl0cyB0byBhIHN0cmluZy4gT2Zmc2V0cyBhcmUgcmVzb2x2ZWQgYWdhaW5zdCB0aGUgb3JpZ2luYWwgdGV4dCBhbmQgZWRpdHMgYXJlXG4gKiAgYXBwbGllZCBmcm9tIHRoZSBlbmQgYmFja3dhcmRzLCBzbyBlYXJsaWVyIG9mZnNldHMgc3RheSB2YWxpZC4gKi9cbmZ1bmN0aW9uIGFwcGx5RWRpdHNUb1RleHQodGV4dDogc3RyaW5nLCBlZGl0czogVGV4dEVkaXRbXSk6IHN0cmluZyB7XG4gICAgY29uc3QgbGluZVN0YXJ0cyA9IFswXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHRleHQuY2hhckNvZGVBdChpKSA9PT0gMTAgLyogXFxuICovKSBsaW5lU3RhcnRzLnB1c2goaSArIDEpO1xuICAgIH1cbiAgICBjb25zdCBvZmZzZXQgPSAocDogeyBsaW5lOiBudW1iZXI7IGNoYXJhY3RlcjogbnVtYmVyIH0pID0+IChsaW5lU3RhcnRzW3AubGluZV0gPz8gdGV4dC5sZW5ndGgpICsgcC5jaGFyYWN0ZXI7XG4gICAgY29uc3Qgb3JkZXJlZCA9IGVkaXRzLnNsaWNlKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gb2Zmc2V0KGIucmFuZ2Uuc3RhcnQpIC0gb2Zmc2V0KGEucmFuZ2Uuc3RhcnQpKTtcbiAgICBsZXQgcmVzdWx0ID0gdGV4dDtcbiAgICBmb3IgKGNvbnN0IGUgb2Ygb3JkZXJlZCkge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQuc2xpY2UoMCwgb2Zmc2V0KGUucmFuZ2Uuc3RhcnQpKSArIGUubmV3VGV4dCArIHJlc3VsdC5zbGljZShvZmZzZXQoZS5yYW5nZS5lbmQpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBBcHBsaWVzIGEgSkRULkxTIHJlbmFtZSB7QGxpbmsgV29ya3NwYWNlRWRpdH0gYWNyb3NzIHRoZSB3aG9sZSB3b3Jrc3BhY2U6IHRleHQgZWRpdHMgaW4gZXZlcnlcbiAqIGFmZmVjdGVkIGZpbGUgcGx1cyBhbnkge0Bjb2RlIFJlbmFtZUZpbGV9IG9wZXJhdGlvbiAoYSBwdWJsaWMtdHlwZSByZW5hbWUgcmVuYW1lcyBpdHMgb3duXG4gKiB7QGNvZGUgLmphdmF9IGZpbGUpLiBUaGUgY3VycmVudCBmaWxlJ3MgZWRpdHMgZ28gdGhyb3VnaCB0aGUgbGl2ZSBNb25hY28gbW9kZWw7IHRoZSByZXN0IGFyZSByZWFkLFxuICogZWRpdGVkIGFuZCB3cml0dGVuIGJhY2sgb3ZlciBSRVNULiBQZXJzaXN0ZW5jZSAoQ1NSRi1ndWFyZGVkIHdyaXRlcywgdGhlIHRhYiBzd2l0Y2ggd2hlbiB0aGUgY3VycmVudFxuICogZmlsZSBpcyByZW5hbWVkLCBhbmQgcmVsb2FkaW5nIG90aGVyIG9wZW4gZWRpdG9ycykgaXMgZGVsZWdhdGVkIHRvIHRoZSBJREUgdmlhIGphdmFMc3BQZXJzaXN0UmVuYW1lLlxuICovXG5hc3luYyBmdW5jdGlvbiBhcHBseVJlbmFtZUFjcm9zc1dvcmtzcGFjZShtb2RlbDogbW9uYWNvLmVkaXRvci5JVGV4dE1vZGVsLCBlZGl0OiBXb3Jrc3BhY2VFZGl0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY3VycmVudFVyaSA9IG1vZGVsLnVyaS50b1N0cmluZygpO1xuICAgIGNvbnN0IHRleHRCeVVyaTogUmVjb3JkPHN0cmluZywgVGV4dEVkaXRbXT4gPSB7fTtcbiAgICBjb25zdCByZW5hbWVCeVVyaTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gICAgaWYgKGVkaXQuY2hhbmdlcykge1xuICAgICAgICBmb3IgKGNvbnN0IHVyaSBpbiBlZGl0LmNoYW5nZXMpIHRleHRCeVVyaVt1cmldID0gKHRleHRCeVVyaVt1cmldID8/IFtdKS5jb25jYXQoZWRpdC5jaGFuZ2VzW3VyaV0pO1xuICAgIH1cbiAgICBpZiAoZWRpdC5kb2N1bWVudENoYW5nZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBkYyBvZiBlZGl0LmRvY3VtZW50Q2hhbmdlcyBhcyBhbnlbXSkge1xuICAgICAgICAgICAgaWYgKGRjPy5raW5kID09PSAncmVuYW1lJyAmJiBkYy5vbGRVcmkgJiYgZGMubmV3VXJpKSB7XG4gICAgICAgICAgICAgICAgcmVuYW1lQnlVcmlbZGMub2xkVXJpXSA9IGRjLm5ld1VyaTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGM/LnRleHREb2N1bWVudD8udXJpICYmIEFycmF5LmlzQXJyYXkoZGMuZWRpdHMpKSB7XG4gICAgICAgICAgICAgICAgdGV4dEJ5VXJpW2RjLnRleHREb2N1bWVudC51cmldID0gKHRleHRCeVVyaVtkYy50ZXh0RG9jdW1lbnQudXJpXSA/PyBbXSkuY29uY2F0KGRjLmVkaXRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHBheWxvYWQ6IHtcbiAgICAgICAgY3VycmVudFBhdGg6IHN0cmluZyB8IG51bGw7XG4gICAgICAgIGN1cnJlbnRDb250ZW50OiBzdHJpbmcgfCBudWxsO1xuICAgICAgICBjdXJyZW50TmV3UGF0aDogc3RyaW5nIHwgbnVsbDtcbiAgICAgICAgd3JpdGVzOiBBcnJheTx7IHBhdGg6IHN0cmluZyB8IG51bGw7IGNvbnRlbnQ6IHN0cmluZyB9PjtcbiAgICAgICAgcmVuYW1lczogQXJyYXk8eyBvbGRQYXRoOiBzdHJpbmcgfCBudWxsOyBuZXdQYXRoOiBzdHJpbmcgfCBudWxsOyBjb250ZW50OiBzdHJpbmcgfT47XG4gICAgfSA9IHsgY3VycmVudFBhdGg6IHVyaVRvV29ya3NwYWNlUGF0aChjdXJyZW50VXJpKSwgY3VycmVudENvbnRlbnQ6IG51bGwsIGN1cnJlbnROZXdQYXRoOiBudWxsLCB3cml0ZXM6IFtdLCByZW5hbWVzOiBbXSB9O1xuXG4gICAgY29uc3QgdXJpcyA9IG5ldyBTZXQ8c3RyaW5nPihbLi4uT2JqZWN0LmtleXModGV4dEJ5VXJpKSwgLi4uT2JqZWN0LmtleXMocmVuYW1lQnlVcmkpXSk7XG4gICAgZm9yIChjb25zdCB1cmkgb2YgdXJpcykge1xuICAgICAgICBjb25zdCBlZGl0cyA9IHRleHRCeVVyaVt1cmldID8/IFtdO1xuICAgICAgICBsZXQgY29udGVudDogc3RyaW5nO1xuICAgICAgICBpZiAodXJpID09PSBjdXJyZW50VXJpKSB7XG4gICAgICAgICAgICBpZiAoZWRpdHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbW9kZWwucHVzaEVkaXRPcGVyYXRpb25zKFtdLCBlZGl0cy5tYXAoZSA9PiAoeyByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhlLnJhbmdlKSwgdGV4dDogZS5uZXdUZXh0LCBmb3JjZU1vdmVNYXJrZXJzOiB0cnVlIH0pKSwgKCkgPT4gbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250ZW50ID0gbW9kZWwuZ2V0VmFsdWUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IGF3YWl0IGZldGNoV29ya3NwYWNlRmlsZVRleHQodXJpVG9Xb3Jrc3BhY2VQYXRoKHVyaSkgPz8gdXJpKTtcbiAgICAgICAgICAgIGNvbnRlbnQgPSBlZGl0cy5sZW5ndGggPyBhcHBseUVkaXRzVG9UZXh0KHNvdXJjZSwgZWRpdHMpIDogc291cmNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld1VyaSA9IHJlbmFtZUJ5VXJpW3VyaV07XG4gICAgICAgIGlmICh1cmkgPT09IGN1cnJlbnRVcmkpIHtcbiAgICAgICAgICAgIHBheWxvYWQuY3VycmVudENvbnRlbnQgPSBjb250ZW50O1xuICAgICAgICAgICAgcGF5bG9hZC5jdXJyZW50TmV3UGF0aCA9IG5ld1VyaSA/IHVyaVRvV29ya3NwYWNlUGF0aChuZXdVcmkpIDogbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmIChuZXdVcmkpIHtcbiAgICAgICAgICAgIHBheWxvYWQucmVuYW1lcy5wdXNoKHsgb2xkUGF0aDogdXJpVG9Xb3Jrc3BhY2VQYXRoKHVyaSksIG5ld1BhdGg6IHVyaVRvV29ya3NwYWNlUGF0aChuZXdVcmkpLCBjb250ZW50IH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGF5bG9hZC53cml0ZXMucHVzaCh7IHBhdGg6IHVyaVRvV29ya3NwYWNlUGF0aCh1cmkpLCBjb250ZW50IH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgKGdsb2JhbFRoaXMgYXMgYW55KS5qYXZhTHNwUGVyc2lzdFJlbmFtZShwYXlsb2FkKTtcbn1cblxuZnVuY3Rpb24gamR0bHNTZXR0aW5ncygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBqYXZhOiB7XG4gICAgICAgICAgICBpbXBvcnQ6IHtcbiAgICAgICAgICAgICAgICBtYXZlbjogICAgICB7IGVuYWJsZWQ6IHRydWUgfSxcbiAgICAgICAgICAgICAgICBncmFkbGU6ICAgICB7IGVuYWJsZWQ6IGZhbHNlIH0sXG4gICAgICAgICAgICAgICAgZXhjbHVzaW9uczogWycqKi9ub2RlX21vZHVsZXMvKionLCAnKiovLm1ldGFkYXRhLyoqJywgJyoqL2FyY2hldHlwZS1yZXNvdXJjZXMvKionXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhdXRvYnVpbGQ6IHsgZW5hYmxlZDogdHJ1ZSB9LFxuICAgICAgICAgICAgY29tcGxldGlvbjoge1xuICAgICAgICAgICAgICAgIG92ZXJ3cml0ZTogICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgIGd1ZXNzTWV0aG9kQXJndW1lbnRzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBmaWx0ZXJlZFR5cGVzOiBbXG4gICAgICAgICAgICAgICAgICAgICdjb20uc3VuLionLCAnc3VuLionLCAnamRrLionLFxuICAgICAgICAgICAgICAgICAgICAnb3JnLmVjbGlwc2UuamR0LmludGVybmFsLionLFxuICAgICAgICAgICAgICAgICAgICAnb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC4qJyxcbiAgICAgICAgICAgICAgICAgICAgJ29yZy5lY2xpcHNlLm9zZ2kuaW50ZXJuYWwuKicsXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBpbXBvcnRPcmRlcjogWydqYXZhJywgJ2phdmF4JywgJ29yZycsICdjb20nLCAnJ10sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2lnbmF0dXJlSGVscDogIHsgZW5hYmxlZDogdHJ1ZSB9LFxuICAgICAgICAgICAgZm9ybWF0OiAgICAgICAgIHsgZW5hYmxlZDogdHJ1ZSB9LFxuICAgICAgICAgICAgc2F2ZUFjdGlvbnM6ICAgIHsgb3JnYW5pemVJbXBvcnRzOiBmYWxzZSB9LFxuICAgICAgICAgICAgaW5sYXlIaW50czogICAgIHsgcGFyYW1ldGVyTmFtZXM6IHsgZW5hYmxlZDogJ2FsbCcgfSB9LFxuICAgICAgICAgICAgcmVmZXJlbmNlc0NvZGVMZW5zOiAgICAgeyBlbmFibGVkOiB0cnVlIH0sXG4gICAgICAgICAgICBpbXBsZW1lbnRhdGlvbnNDb2RlTGVuczogeyBlbmFibGVkOiB0cnVlIH0sXG4gICAgICAgIH0sXG4gICAgfTtcbn1cbiIsICIvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSAyMDI0IFR5cGVGb3ggYW5kIG90aGVycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExJQ0VOU0UgaW4gdGhlIHBhY2thZ2Ugcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5pbXBvcnQgeyBEaXNwb3NhYmxlIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuXG5leHBvcnQgY2xhc3MgRGlzcG9zYWJsZUNvbGxlY3Rpb24gaW1wbGVtZW50cyBEaXNwb3NhYmxlIHtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGlzcG9zYWJsZXM6IERpc3Bvc2FibGVbXSA9IFtdO1xuXG4gICAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICAgICAgd2hpbGUgKHRoaXMuZGlzcG9zYWJsZXMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmRpc3Bvc2FibGVzLnBvcCgpIS5kaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdXNoKGRpc3Bvc2FibGU6IERpc3Bvc2FibGUpOiBEaXNwb3NhYmxlIHtcbiAgICAgICAgY29uc3QgZGlzcG9zYWJsZXMgPSB0aGlzLmRpc3Bvc2FibGVzO1xuICAgICAgICBkaXNwb3NhYmxlcy5wdXNoKGRpc3Bvc2FibGUpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IGRpc3Bvc2FibGVzLmluZGV4T2YoZGlzcG9zYWJsZSk7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG59XG4iLCAiLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgMjAyNCBUeXBlRm94IGFuZCBvdGhlcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMSUNFTlNFIGluIHRoZSBwYWNrYWdlIHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuaW1wb3J0IHsgRGlzcG9zYWJsZSB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcbmltcG9ydCB0eXBlIHsgSUNvbm5lY3Rpb24gfSBmcm9tICcuLi9zZXJ2ZXIvY29ubmVjdGlvbi5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVdlYlNvY2tldCBleHRlbmRzIERpc3Bvc2FibGUge1xuICAgIHNlbmQoY29udGVudDogc3RyaW5nKTogdm9pZDtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIG9uTWVzc2FnZShjYjogKGRhdGE6IGFueSkgPT4gdm9pZCk6IHZvaWQ7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBvbkVycm9yKGNiOiAocmVhc29uOiBhbnkpID0+IHZvaWQpOiB2b2lkO1xuICAgIG9uQ2xvc2UoY2I6IChjb2RlOiBudW1iZXIsIHJlYXNvbjogc3RyaW5nKSA9PiB2b2lkKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJV2ViU29ja2V0Q29ubmVjdGlvbiBleHRlbmRzIElDb25uZWN0aW9uIHtcbiAgICByZWFkb25seSBzb2NrZXQ6IElXZWJTb2NrZXQ7XG59XG4iLCAiLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgMjAyNCBUeXBlRm94IGFuZCBvdGhlcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMSUNFTlNFIGluIHRoZSBwYWNrYWdlIHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuaW1wb3J0IHsgRGlzcG9zYWJsZSB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcbi8vIFRPRE86IFVzZSBlbnZpcm9ubWVudC1zcGVjaWZpYyBpbXBvcnRzICh2c2NvZGUtanNvbnJwYy9icm93c2VyIG9yIHZzY29kZS1qc29ucnBjL25vZGUpXG4vLyB3aGVuIHVwZ3JhZGluZyB0byB2c2NvZGUtanNvbnJwY0A5LngueC1uZXh0Llggd2hpY2ggc3VwcG9ydHMgcHJvcGVyIGV4cG9ydCBtYXBzXG5pbXBvcnQgeyB0eXBlIERhdGFDYWxsYmFjaywgQWJzdHJhY3RNZXNzYWdlUmVhZGVyLCBNZXNzYWdlUmVhZGVyIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuaW1wb3J0IHR5cGUgeyBJV2ViU29ja2V0IH0gZnJvbSAnLi9zb2NrZXQuanMnO1xuXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0TWVzc2FnZVJlYWRlciBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVJlYWRlciBpbXBsZW1lbnRzIE1lc3NhZ2VSZWFkZXIge1xuICAgIHByb3RlY3RlZCByZWFkb25seSBzb2NrZXQ6IElXZWJTb2NrZXQ7XG4gICAgcHJvdGVjdGVkIHN0YXRlOiAnaW5pdGlhbCcgfCAnbGlzdGVuaW5nJyB8ICdjbG9zZWQnID0gJ2luaXRpYWwnO1xuICAgIHByb3RlY3RlZCBjYWxsYmFjazogRGF0YUNhbGxiYWNrIHwgdW5kZWZpbmVkO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGV2ZW50czogQXJyYXk8eyBtZXNzYWdlPzogYW55LCBlcnJvcj86IGFueSB9PiA9IFtdO1xuXG4gICAgY29uc3RydWN0b3Ioc29ja2V0OiBJV2ViU29ja2V0KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuc29ja2V0ID0gc29ja2V0O1xuICAgICAgICB0aGlzLnNvY2tldC5vbk1lc3NhZ2UobWVzc2FnZSA9PlxuICAgICAgICAgICAgdGhpcy5yZWFkTWVzc2FnZShtZXNzYWdlKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLnNvY2tldC5vbkVycm9yKGVycm9yID0+XG4gICAgICAgICAgICB0aGlzLmZpcmVFcnJvcihlcnJvcilcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zb2NrZXQub25DbG9zZSgoY29kZSwgcmVhc29uKSA9PiB7XG4gICAgICAgICAgICBpZiAoY29kZSAhPT0gMTAwMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yOiBFcnJvciA9IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJycgKyBjb2RlLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgRXJyb3IgZHVyaW5nIHNvY2tldCByZWNvbm5lY3Q6IGNvZGUgPSAke2NvZGV9LCByZWFzb24gPSAke3JlYXNvbn1gXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmVFcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmZpcmVDbG9zZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBsaXN0ZW4oY2FsbGJhY2s6IERhdGFDYWxsYmFjayk6IERpc3Bvc2FibGUge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gJ2luaXRpYWwnKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gJ2xpc3RlbmluZyc7XG4gICAgICAgICAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgICAgICAgICB3aGlsZSAodGhpcy5ldmVudHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnQgPSB0aGlzLmV2ZW50cy5wb3AoKSE7XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50Lm1lc3NhZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlYWRNZXNzYWdlKGV2ZW50Lm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuZXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmVFcnJvcihldmVudC5lcnJvcik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlQ2xvc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jYWxsYmFjayA9PT0gY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9ICdpbml0aWFsJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjayA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgZGlzcG9zZSgpIHtcbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLnN0YXRlID0gJ2luaXRpYWwnO1xuICAgICAgICB0aGlzLmNhbGxiYWNrID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmV2ZW50cy5zcGxpY2UoMCwgdGhpcy5ldmVudHMubGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHByb3RlY3RlZCByZWFkTWVzc2FnZShtZXNzYWdlOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09ICdpbml0aWFsJykge1xuICAgICAgICAgICAgdGhpcy5ldmVudHMuc3BsaWNlKDAsIDAsIHsgbWVzc2FnZSB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlID09PSAnbGlzdGVuaW5nJykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNhbGxiYWNrIShkYXRhKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yOiBFcnJvciA9IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJycgKyA0MDAsXG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBFcnJvciBkdXJpbmcgbWVzc2FnZSBwYXJzaW5nLCByZWFzb24gPSAke3R5cGVvZiBlcnIgPT09ICdvYmplY3QnID8gKGVyciBhcyBhbnkpLm1lc3NhZ2UgOiAndW5rbm93bid9YFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZmlyZUVycm9yKGVycm9yOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09ICdpbml0aWFsJykge1xuICAgICAgICAgICAgdGhpcy5ldmVudHMuc3BsaWNlKDAsIDAsIHsgZXJyb3IgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZSA9PT0gJ2xpc3RlbmluZycpIHtcbiAgICAgICAgICAgIHN1cGVyLmZpcmVFcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZmlyZUNsb3NlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gJ2luaXRpYWwnKSB7XG4gICAgICAgICAgICB0aGlzLmV2ZW50cy5zcGxpY2UoMCwgMCwge30pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUgPT09ICdsaXN0ZW5pbmcnKSB7XG4gICAgICAgICAgICBzdXBlci5maXJlQ2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0YXRlID0gJ2Nsb3NlZCc7XG4gICAgfVxufVxuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjQgVHlwZUZveCBhbmQgb3RoZXJzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTElDRU5TRSBpbiB0aGUgcGFja2FnZSByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbmltcG9ydCB7IE1lc3NhZ2UgfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG5pbXBvcnQgeyBBYnN0cmFjdE1lc3NhZ2VXcml0ZXIsIE1lc3NhZ2VXcml0ZXIgfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG5pbXBvcnQgdHlwZSB7IElXZWJTb2NrZXQgfSBmcm9tICcuL3NvY2tldC5qcyc7XG5cbmV4cG9ydCBjbGFzcyBXZWJTb2NrZXRNZXNzYWdlV3JpdGVyIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlV3JpdGVyIGltcGxlbWVudHMgTWVzc2FnZVdyaXRlciB7XG4gICAgcHJvdGVjdGVkIGVycm9yQ291bnQgPSAwO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBzb2NrZXQ6IElXZWJTb2NrZXQ7XG5cbiAgICBjb25zdHJ1Y3Rvcihzb2NrZXQ6IElXZWJTb2NrZXQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7XG4gICAgfVxuXG4gICAgZW5kKCk6IHZvaWQge1xuICAgIH1cblxuICAgIGFzeW5jIHdyaXRlKG1zZzogTWVzc2FnZSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgY29udGVudCA9IEpTT04uc3RyaW5naWZ5KG1zZyk7XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKGNvbnRlbnQpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmVycm9yQ291bnQrKztcbiAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGUsIG1zZywgdGhpcy5lcnJvckNvdW50KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICIvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSAyMDI0IFR5cGVGb3ggYW5kIG90aGVycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExJQ0VOU0UgaW4gdGhlIHBhY2thZ2Ugcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5pbXBvcnQgdHlwZSB7IE1lc3NhZ2VDb25uZWN0aW9uLCBMb2dnZXIgfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG5pbXBvcnQgeyBjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcbmltcG9ydCB0eXBlIHsgSVdlYlNvY2tldCB9IGZyb20gJy4vc29ja2V0LmpzJztcbmltcG9ydCB7IFdlYlNvY2tldE1lc3NhZ2VSZWFkZXIgfSBmcm9tICcuL3JlYWRlci5qcyc7XG5pbXBvcnQgeyBXZWJTb2NrZXRNZXNzYWdlV3JpdGVyIH0gZnJvbSAnLi93cml0ZXIuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlV2ViU29ja2V0Q29ubmVjdGlvbihzb2NrZXQ6IElXZWJTb2NrZXQsIGxvZ2dlcjogTG9nZ2VyKTogTWVzc2FnZUNvbm5lY3Rpb24ge1xuICAgIGNvbnN0IG1lc3NhZ2VSZWFkZXIgPSBuZXcgV2ViU29ja2V0TWVzc2FnZVJlYWRlcihzb2NrZXQpO1xuICAgIGNvbnN0IG1lc3NhZ2VXcml0ZXIgPSBuZXcgV2ViU29ja2V0TWVzc2FnZVdyaXRlcihzb2NrZXQpO1xuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbihtZXNzYWdlUmVhZGVyLCBtZXNzYWdlV3JpdGVyLCBsb2dnZXIpO1xuICAgIGNvbm5lY3Rpb24ub25DbG9zZSgoKSA9PiBjb25uZWN0aW9uLmRpc3Bvc2UoKSk7XG4gICAgcmV0dXJuIGNvbm5lY3Rpb247XG59XG4iLCAiLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgMjAyNCBUeXBlRm94IGFuZCBvdGhlcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMSUNFTlNFIGluIHRoZSBwYWNrYWdlIHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuaW1wb3J0IHR5cGUgeyBNZXNzYWdlQ29ubmVjdGlvbiwgTG9nZ2VyIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuaW1wb3J0IHsgY3JlYXRlV2ViU29ja2V0Q29ubmVjdGlvbiB9IGZyb20gJy4vc29ja2V0L2Nvbm5lY3Rpb24uanMnO1xuaW1wb3J0IHR5cGUgeyBJV2ViU29ja2V0IH0gZnJvbSAnLi9zb2NrZXQvc29ja2V0LmpzJztcbmltcG9ydCB7IENvbnNvbGVMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBsaXN0ZW4ob3B0aW9uczoge1xuICAgIHdlYlNvY2tldDogV2ViU29ja2V0O1xuICAgIGxvZ2dlcj86IExvZ2dlcjtcbiAgICBvbkNvbm5lY3Rpb246IChjb25uZWN0aW9uOiBNZXNzYWdlQ29ubmVjdGlvbikgPT4gdm9pZDtcbn0pIHtcbiAgICBjb25zdCB7IHdlYlNvY2tldCwgb25Db25uZWN0aW9uIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IGxvZ2dlciA9IG9wdGlvbnMubG9nZ2VyIHx8IG5ldyBDb25zb2xlTG9nZ2VyKCk7XG4gICAgd2ViU29ja2V0Lm9ub3BlbiA9ICgpID0+IHtcbiAgICAgICAgY29uc3Qgc29ja2V0ID0gdG9Tb2NrZXQod2ViU29ja2V0KTtcbiAgICAgICAgY29uc3QgY29ubmVjdGlvbiA9IGNyZWF0ZVdlYlNvY2tldENvbm5lY3Rpb24oc29ja2V0LCBsb2dnZXIpO1xuICAgICAgICBvbkNvbm5lY3Rpb24oY29ubmVjdGlvbik7XG4gICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvU29ja2V0KHdlYlNvY2tldDogV2ViU29ja2V0KTogSVdlYlNvY2tldCB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc2VuZDogY29udGVudCA9PiB3ZWJTb2NrZXQuc2VuZChjb250ZW50KSxcbiAgICAgICAgb25NZXNzYWdlOiBjYiA9PiB7XG4gICAgICAgICAgICB3ZWJTb2NrZXQub25tZXNzYWdlID0gZXZlbnQgPT4gY2IoZXZlbnQuZGF0YSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uRXJyb3I6IGNiID0+IHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICB3ZWJTb2NrZXQub25lcnJvciA9IChldmVudDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5oYXNPd24oZXZlbnQsICdtZXNzYWdlJykpIHtcbiAgICAgICAgICAgICAgICAgICAgY2IoZXZlbnQubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgb25DbG9zZTogY2IgPT4ge1xuICAgICAgICAgICAgd2ViU29ja2V0Lm9uY2xvc2UgPSBldmVudCA9PiBjYihldmVudC5jb2RlLCBldmVudC5yZWFzb24pO1xuICAgICAgICB9LFxuICAgICAgICBkaXNwb3NlOiAoKSA9PiB3ZWJTb2NrZXQuY2xvc2UoKVxuICAgIH07XG59XG4iLCAiLypcbiAqIENvcHlyaWdodCAoYykgMjAxMC0yMDI2IEVjbGlwc2UgRGlyaWdpYmxlIGNvbnRyaWJ1dG9yc1xuICpcbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZVxuICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjIuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjIwLmh0bWxcbiAqXG4gKiBTUERYLUZpbGVDb3B5cmlnaHRUZXh0OiBFY2xpcHNlIERpcmlnaWJsZSBjb250cmlidXRvcnMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjBcbiAqL1xuXG4vKipcbiAqIExhenkgUHJveHkgc2hpbSBmb3IgTW9uYWNvIEVkaXRvciBsb2FkZWQgdmlhIEFNRC5cbiAqXG4gKiBlZGl0b3IuanMgc2V0cyBnbG9iYWxUaGlzLm1vbmFjbyBpbnNpZGUgdGhlIEFNRCByZXF1aXJlKCkgY2FsbGJhY2ssIGJlZm9yZSBhbnlcbiAqIEphdmFMc3BDbGllbnRMaWIuY29ubmVjdCgpIGNhbGwuIEFsbCBwcm9wZXJ0eSBhY2Nlc3NlcyBnbyB0aHJvdWdoIFByb3h5LmdldCgpIHRyYXBzXG4gKiBzbyB0aGV5IHJlc29sdmUgYWdhaW5zdCB0aGUgbGl2ZSB3aW5kb3cubW9uYWNvIGF0IGNhbGwgdGltZSwgbm90IGF0IGJ1bmRsZSBsb2FkIHRpbWUuXG4gKlxuICogVHlwZVNjcmlwdCByZXNvbHZlcyB0eXBlcyBmcm9tIHRoZSByZWFsIG1vbmFjby1lZGl0b3IgZGV2RGVwZW5kZW5jeTsgZXNidWlsZCByZXBsYWNlc1xuICogdGhlIFwibW9uYWNvLWVkaXRvclwiIGltcG9ydCB3aXRoIHRoaXMgZmlsZSBhdCBidW5kbGUgdGltZSB2aWEgdGhlIGFsaWFzIG9wdGlvbi5cbiAqL1xuXG50eXBlIE0gPSB0eXBlb2YgaW1wb3J0KCdtb25hY28tZWRpdG9yJyk7XG5cbmZ1bmN0aW9uIG0oKTogTSB7XG4gICAgcmV0dXJuIChnbG9iYWxUaGlzIGFzIGFueSkubW9uYWNvIGFzIE07XG59XG5cbmZ1bmN0aW9uIG5zPFQgZXh0ZW5kcyBvYmplY3Q+KGdldHRlcjogKCkgPT4gVCk6IFQge1xuICAgIHJldHVybiBuZXcgUHJveHkoe30gYXMgVCwge1xuICAgICAgICBnZXQ6IChfLCBrKSA9PiAoZ2V0dGVyKCkgYXMgYW55KVtrIGFzIHN0cmluZ10sXG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGNsczxUPihnZXR0ZXI6ICgpID0+IFQpOiBUIHtcbiAgICByZXR1cm4gbmV3IFByb3h5KGZ1bmN0aW9uICgpIHt9IGFzIGFueSwge1xuICAgICAgICBjb25zdHJ1Y3Q6IChfLCBhcmdzKSA9PiBuZXcgKGdldHRlcigpIGFzIGFueSkoLi4uYXJncyksXG4gICAgICAgIGdldDogICAgICAgKF8sIGspICAgID0+IChnZXR0ZXIoKSBhcyBhbnkpW2sgYXMgc3RyaW5nXSxcbiAgICB9KSBhcyBUO1xufVxuXG5leHBvcnQgY29uc3QgZWRpdG9yICAgICAgICAgPSBucygoKSA9PiBtKCkuZWRpdG9yKTtcbmV4cG9ydCBjb25zdCBsYW5ndWFnZXMgICAgICA9IG5zKCgpID0+IG0oKS5sYW5ndWFnZXMpO1xuZXhwb3J0IGNvbnN0IE1hcmtlclNldmVyaXR5ID0gbnMoKCkgPT4gbSgpLk1hcmtlclNldmVyaXR5KTtcbmV4cG9ydCBjb25zdCBNYXJrZXJUYWcgICAgICA9IG5zKCgpID0+IChtKCkgYXMgYW55KS5NYXJrZXJUYWcpO1xuZXhwb3J0IGNvbnN0IFVyaSAgICAgICAgICAgID0gY2xzKCgpID0+IG0oKS5VcmkpO1xuZXhwb3J0IGNvbnN0IFJhbmdlICAgICAgICAgID0gY2xzKCgpID0+IG0oKS5SYW5nZSk7XG5leHBvcnQgY29uc3QgUG9zaXRpb24gICAgICAgPSBjbHMoKCkgPT4gbSgpLlBvc2l0aW9uKTtcbmV4cG9ydCBjb25zdCBTZWxlY3Rpb24gICAgICA9IGNscygoKSA9PiBtKCkuU2VsZWN0aW9uKTtcbmV4cG9ydCBjb25zdCBLZXlDb2RlICAgICAgICA9IG5zKCgpID0+IG0oKS5LZXlDb2RlKTtcbmV4cG9ydCBjb25zdCBLZXlNb2QgICAgICAgICA9IG5zKCgpID0+IG0oKS5LZXlNb2QpO1xuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbid1c2Ugc3RyaWN0JztcbmV4cG9ydCB2YXIgRG9jdW1lbnRVcmk7XG4oZnVuY3Rpb24gKERvY3VtZW50VXJpKSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZyc7XG4gICAgfVxuICAgIERvY3VtZW50VXJpLmlzID0gaXM7XG59KShEb2N1bWVudFVyaSB8fCAoRG9jdW1lbnRVcmkgPSB7fSkpO1xuZXhwb3J0IHZhciBVUkk7XG4oZnVuY3Rpb24gKFVSSSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnO1xuICAgIH1cbiAgICBVUkkuaXMgPSBpcztcbn0pKFVSSSB8fCAoVVJJID0ge30pKTtcbmV4cG9ydCB2YXIgaW50ZWdlcjtcbihmdW5jdGlvbiAoaW50ZWdlcikge1xuICAgIGludGVnZXIuTUlOX1ZBTFVFID0gLTIxNDc0ODM2NDg7XG4gICAgaW50ZWdlci5NQVhfVkFMVUUgPSAyMTQ3NDgzNjQ3O1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIGludGVnZXIuTUlOX1ZBTFVFIDw9IHZhbHVlICYmIHZhbHVlIDw9IGludGVnZXIuTUFYX1ZBTFVFO1xuICAgIH1cbiAgICBpbnRlZ2VyLmlzID0gaXM7XG59KShpbnRlZ2VyIHx8IChpbnRlZ2VyID0ge30pKTtcbmV4cG9ydCB2YXIgdWludGVnZXI7XG4oZnVuY3Rpb24gKHVpbnRlZ2VyKSB7XG4gICAgdWludGVnZXIuTUlOX1ZBTFVFID0gMDtcbiAgICB1aW50ZWdlci5NQVhfVkFMVUUgPSAyMTQ3NDgzNjQ3O1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIHVpbnRlZ2VyLk1JTl9WQUxVRSA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSB1aW50ZWdlci5NQVhfVkFMVUU7XG4gICAgfVxuICAgIHVpbnRlZ2VyLmlzID0gaXM7XG59KSh1aW50ZWdlciB8fCAodWludGVnZXIgPSB7fSkpO1xuLyoqXG4gKiBUaGUgUG9zaXRpb24gbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgUG9zaXRpb259IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIFBvc2l0aW9uO1xuKGZ1bmN0aW9uIChQb3NpdGlvbikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgUG9zaXRpb24gbGl0ZXJhbCBmcm9tIHRoZSBnaXZlbiBsaW5lIGFuZCBjaGFyYWN0ZXIuXG4gICAgICogQHBhcmFtIGxpbmUgVGhlIHBvc2l0aW9uJ3MgbGluZS5cbiAgICAgKiBAcGFyYW0gY2hhcmFjdGVyIFRoZSBwb3NpdGlvbidzIGNoYXJhY3Rlci5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobGluZSwgY2hhcmFjdGVyKSB7XG4gICAgICAgIGlmIChsaW5lID09PSBOdW1iZXIuTUFYX1ZBTFVFKSB7XG4gICAgICAgICAgICBsaW5lID0gdWludGVnZXIuTUFYX1ZBTFVFO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFyYWN0ZXIgPT09IE51bWJlci5NQVhfVkFMVUUpIHtcbiAgICAgICAgICAgIGNoYXJhY3RlciA9IHVpbnRlZ2VyLk1BWF9WQUxVRTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBsaW5lLCBjaGFyYWN0ZXIgfTtcbiAgICB9XG4gICAgUG9zaXRpb24uY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgUG9zaXRpb259IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgSXMudWludGVnZXIoY2FuZGlkYXRlLmxpbmUpICYmIElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS5jaGFyYWN0ZXIpO1xuICAgIH1cbiAgICBQb3NpdGlvbi5pcyA9IGlzO1xufSkoUG9zaXRpb24gfHwgKFBvc2l0aW9uID0ge30pKTtcbi8qKlxuICogVGhlIFJhbmdlIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIFJhbmdlfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBSYW5nZTtcbihmdW5jdGlvbiAoUmFuZ2UpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUob25lLCB0d28sIHRocmVlLCBmb3VyKSB7XG4gICAgICAgIGlmIChJcy51aW50ZWdlcihvbmUpICYmIElzLnVpbnRlZ2VyKHR3bykgJiYgSXMudWludGVnZXIodGhyZWUpICYmIElzLnVpbnRlZ2VyKGZvdXIpKSB7XG4gICAgICAgICAgICByZXR1cm4geyBzdGFydDogUG9zaXRpb24uY3JlYXRlKG9uZSwgdHdvKSwgZW5kOiBQb3NpdGlvbi5jcmVhdGUodGhyZWUsIGZvdXIpIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoUG9zaXRpb24uaXMob25lKSAmJiBQb3NpdGlvbi5pcyh0d28pKSB7XG4gICAgICAgICAgICByZXR1cm4geyBzdGFydDogb25lLCBlbmQ6IHR3byB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSYW5nZSNjcmVhdGUgY2FsbGVkIHdpdGggaW52YWxpZCBhcmd1bWVudHNbJHtvbmV9LCAke3R3b30sICR7dGhyZWV9LCAke2ZvdXJ9XWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIFJhbmdlLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIFJhbmdlfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIFBvc2l0aW9uLmlzKGNhbmRpZGF0ZS5zdGFydCkgJiYgUG9zaXRpb24uaXMoY2FuZGlkYXRlLmVuZCk7XG4gICAgfVxuICAgIFJhbmdlLmlzID0gaXM7XG59KShSYW5nZSB8fCAoUmFuZ2UgPSB7fSkpO1xuLyoqXG4gKiBUaGUgTG9jYXRpb24gbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgTG9jYXRpb259IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIExvY2F0aW9uO1xuKGZ1bmN0aW9uIChMb2NhdGlvbikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBMb2NhdGlvbiBsaXRlcmFsLlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIGxvY2F0aW9uJ3MgdXJpLlxuICAgICAqIEBwYXJhbSByYW5nZSBUaGUgbG9jYXRpb24ncyByYW5nZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodXJpLCByYW5nZSkge1xuICAgICAgICByZXR1cm4geyB1cmksIHJhbmdlIH07XG4gICAgfVxuICAgIExvY2F0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIExvY2F0aW9ufSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgKElzLnN0cmluZyhjYW5kaWRhdGUudXJpKSB8fCBJcy51bmRlZmluZWQoY2FuZGlkYXRlLnVyaSkpO1xuICAgIH1cbiAgICBMb2NhdGlvbi5pcyA9IGlzO1xufSkoTG9jYXRpb24gfHwgKExvY2F0aW9uID0ge30pKTtcbi8qKlxuICogVGhlIExvY2F0aW9uTGluayBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBMb2NhdGlvbkxpbmt9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIExvY2F0aW9uTGluaztcbihmdW5jdGlvbiAoTG9jYXRpb25MaW5rKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIExvY2F0aW9uTGluayBsaXRlcmFsLlxuICAgICAqIEBwYXJhbSB0YXJnZXRVcmkgVGhlIGRlZmluaXRpb24ncyB1cmkuXG4gICAgICogQHBhcmFtIHRhcmdldFJhbmdlIFRoZSBmdWxsIHJhbmdlIG9mIHRoZSBkZWZpbml0aW9uLlxuICAgICAqIEBwYXJhbSB0YXJnZXRTZWxlY3Rpb25SYW5nZSBUaGUgc3BhbiBvZiB0aGUgc3ltYm9sIGRlZmluaXRpb24gYXQgdGhlIHRhcmdldC5cbiAgICAgKiBAcGFyYW0gb3JpZ2luU2VsZWN0aW9uUmFuZ2UgVGhlIHNwYW4gb2YgdGhlIHN5bWJvbCBiZWluZyBkZWZpbmVkIGluIHRoZSBvcmlnaW5hdGluZyBzb3VyY2UgZmlsZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodGFyZ2V0VXJpLCB0YXJnZXRSYW5nZSwgdGFyZ2V0U2VsZWN0aW9uUmFuZ2UsIG9yaWdpblNlbGVjdGlvblJhbmdlKSB7XG4gICAgICAgIHJldHVybiB7IHRhcmdldFVyaSwgdGFyZ2V0UmFuZ2UsIHRhcmdldFNlbGVjdGlvblJhbmdlLCBvcmlnaW5TZWxlY3Rpb25SYW5nZSB9O1xuICAgIH1cbiAgICBMb2NhdGlvbkxpbmsuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgTG9jYXRpb25MaW5rfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS50YXJnZXRSYW5nZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS50YXJnZXRVcmkpXG4gICAgICAgICAgICAmJiBSYW5nZS5pcyhjYW5kaWRhdGUudGFyZ2V0U2VsZWN0aW9uUmFuZ2UpXG4gICAgICAgICAgICAmJiAoUmFuZ2UuaXMoY2FuZGlkYXRlLm9yaWdpblNlbGVjdGlvblJhbmdlKSB8fCBJcy51bmRlZmluZWQoY2FuZGlkYXRlLm9yaWdpblNlbGVjdGlvblJhbmdlKSk7XG4gICAgfVxuICAgIExvY2F0aW9uTGluay5pcyA9IGlzO1xufSkoTG9jYXRpb25MaW5rIHx8IChMb2NhdGlvbkxpbmsgPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29sb3IgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgQ29sb3J9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIENvbG9yO1xuKGZ1bmN0aW9uIChDb2xvcikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ29sb3IgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJlZCxcbiAgICAgICAgICAgIGdyZWVuLFxuICAgICAgICAgICAgYmx1ZSxcbiAgICAgICAgICAgIGFscGhhLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBDb2xvci5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBDb2xvcn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIElzLm51bWJlclJhbmdlKGNhbmRpZGF0ZS5yZWQsIDAsIDEpXG4gICAgICAgICAgICAmJiBJcy5udW1iZXJSYW5nZShjYW5kaWRhdGUuZ3JlZW4sIDAsIDEpXG4gICAgICAgICAgICAmJiBJcy5udW1iZXJSYW5nZShjYW5kaWRhdGUuYmx1ZSwgMCwgMSlcbiAgICAgICAgICAgICYmIElzLm51bWJlclJhbmdlKGNhbmRpZGF0ZS5hbHBoYSwgMCwgMSk7XG4gICAgfVxuICAgIENvbG9yLmlzID0gaXM7XG59KShDb2xvciB8fCAoQ29sb3IgPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29sb3JJbmZvcm1hdGlvbiBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBDb2xvckluZm9ybWF0aW9ufSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBDb2xvckluZm9ybWF0aW9uO1xuKGZ1bmN0aW9uIChDb2xvckluZm9ybWF0aW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDb2xvckluZm9ybWF0aW9uIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCBjb2xvcikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmFuZ2UsXG4gICAgICAgICAgICBjb2xvcixcbiAgICAgICAgfTtcbiAgICB9XG4gICAgQ29sb3JJbmZvcm1hdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBDb2xvckluZm9ybWF0aW9ufSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiBDb2xvci5pcyhjYW5kaWRhdGUuY29sb3IpO1xuICAgIH1cbiAgICBDb2xvckluZm9ybWF0aW9uLmlzID0gaXM7XG59KShDb2xvckluZm9ybWF0aW9uIHx8IChDb2xvckluZm9ybWF0aW9uID0ge30pKTtcbi8qKlxuICogVGhlIENvbG9yIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIENvbG9yUHJlc2VudGF0aW9ufSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBDb2xvclByZXNlbnRhdGlvbjtcbihmdW5jdGlvbiAoQ29sb3JQcmVzZW50YXRpb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENvbG9ySW5mb3JtYXRpb24gbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobGFiZWwsIHRleHRFZGl0LCBhZGRpdGlvbmFsVGV4dEVkaXRzKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICAgIHRleHRFZGl0LFxuICAgICAgICAgICAgYWRkaXRpb25hbFRleHRFZGl0cyxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgQ29sb3JQcmVzZW50YXRpb24uY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgQ29sb3JJbmZvcm1hdGlvbn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUubGFiZWwpXG4gICAgICAgICAgICAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS50ZXh0RWRpdCkgfHwgVGV4dEVkaXQuaXMoY2FuZGlkYXRlKSlcbiAgICAgICAgICAgICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLmFkZGl0aW9uYWxUZXh0RWRpdHMpIHx8IElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLmFkZGl0aW9uYWxUZXh0RWRpdHMsIFRleHRFZGl0LmlzKSk7XG4gICAgfVxuICAgIENvbG9yUHJlc2VudGF0aW9uLmlzID0gaXM7XG59KShDb2xvclByZXNlbnRhdGlvbiB8fCAoQ29sb3JQcmVzZW50YXRpb24gPSB7fSkpO1xuLyoqXG4gKiBBIHNldCBvZiBwcmVkZWZpbmVkIHJhbmdlIGtpbmRzLlxuICovXG5leHBvcnQgdmFyIEZvbGRpbmdSYW5nZUtpbmQ7XG4oZnVuY3Rpb24gKEZvbGRpbmdSYW5nZUtpbmQpIHtcbiAgICAvKipcbiAgICAgKiBGb2xkaW5nIHJhbmdlIGZvciBhIGNvbW1lbnRcbiAgICAgKi9cbiAgICBGb2xkaW5nUmFuZ2VLaW5kLkNvbW1lbnQgPSAnY29tbWVudCc7XG4gICAgLyoqXG4gICAgICogRm9sZGluZyByYW5nZSBmb3IgYW4gaW1wb3J0IG9yIGluY2x1ZGVcbiAgICAgKi9cbiAgICBGb2xkaW5nUmFuZ2VLaW5kLkltcG9ydHMgPSAnaW1wb3J0cyc7XG4gICAgLyoqXG4gICAgICogRm9sZGluZyByYW5nZSBmb3IgYSByZWdpb24gKGUuZy4gYCNyZWdpb25gKVxuICAgICAqL1xuICAgIEZvbGRpbmdSYW5nZUtpbmQuUmVnaW9uID0gJ3JlZ2lvbic7XG59KShGb2xkaW5nUmFuZ2VLaW5kIHx8IChGb2xkaW5nUmFuZ2VLaW5kID0ge30pKTtcbi8qKlxuICogVGhlIGZvbGRpbmcgcmFuZ2UgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgRm9sZGluZ1JhbmdlfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBGb2xkaW5nUmFuZ2U7XG4oZnVuY3Rpb24gKEZvbGRpbmdSYW5nZSkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgRm9sZGluZ1JhbmdlIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHN0YXJ0TGluZSwgZW5kTGluZSwgc3RhcnRDaGFyYWN0ZXIsIGVuZENoYXJhY3Rlciwga2luZCwgY29sbGFwc2VkVGV4dCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICBzdGFydExpbmUsXG4gICAgICAgICAgICBlbmRMaW5lXG4gICAgICAgIH07XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKHN0YXJ0Q2hhcmFjdGVyKSkge1xuICAgICAgICAgICAgcmVzdWx0LnN0YXJ0Q2hhcmFjdGVyID0gc3RhcnRDaGFyYWN0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzLmRlZmluZWQoZW5kQ2hhcmFjdGVyKSkge1xuICAgICAgICAgICAgcmVzdWx0LmVuZENoYXJhY3RlciA9IGVuZENoYXJhY3RlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXMuZGVmaW5lZChraW5kKSkge1xuICAgICAgICAgICAgcmVzdWx0LmtpbmQgPSBraW5kO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKGNvbGxhcHNlZFRleHQpKSB7XG4gICAgICAgICAgICByZXN1bHQuY29sbGFwc2VkVGV4dCA9IGNvbGxhcHNlZFRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgRm9sZGluZ1JhbmdlLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIEZvbGRpbmdSYW5nZX0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS5zdGFydExpbmUpICYmIElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS5zdGFydExpbmUpXG4gICAgICAgICAgICAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5zdGFydENoYXJhY3RlcikgfHwgSXMudWludGVnZXIoY2FuZGlkYXRlLnN0YXJ0Q2hhcmFjdGVyKSlcbiAgICAgICAgICAgICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLmVuZENoYXJhY3RlcikgfHwgSXMudWludGVnZXIoY2FuZGlkYXRlLmVuZENoYXJhY3RlcikpXG4gICAgICAgICAgICAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5raW5kKSB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLmtpbmQpKTtcbiAgICB9XG4gICAgRm9sZGluZ1JhbmdlLmlzID0gaXM7XG59KShGb2xkaW5nUmFuZ2UgfHwgKEZvbGRpbmdSYW5nZSA9IHt9KSk7XG4vKipcbiAqIFRoZSBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb259IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb247XG4oZnVuY3Rpb24gKERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24gbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobG9jYXRpb24sIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxvY2F0aW9uLFxuICAgICAgICAgICAgbWVzc2FnZVxuICAgICAgICB9O1xuICAgIH1cbiAgICBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb259IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgTG9jYXRpb24uaXMoY2FuZGlkYXRlLmxvY2F0aW9uKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLm1lc3NhZ2UpO1xuICAgIH1cbiAgICBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uLmlzID0gaXM7XG59KShEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uIHx8IChEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uID0ge30pKTtcbi8qKlxuICogVGhlIGRpYWdub3N0aWMncyBzZXZlcml0eS5cbiAqL1xuZXhwb3J0IHZhciBEaWFnbm9zdGljU2V2ZXJpdHk7XG4oZnVuY3Rpb24gKERpYWdub3N0aWNTZXZlcml0eSkge1xuICAgIC8qKlxuICAgICAqIFJlcG9ydHMgYW4gZXJyb3IuXG4gICAgICovXG4gICAgRGlhZ25vc3RpY1NldmVyaXR5LkVycm9yID0gMTtcbiAgICAvKipcbiAgICAgKiBSZXBvcnRzIGEgd2FybmluZy5cbiAgICAgKi9cbiAgICBEaWFnbm9zdGljU2V2ZXJpdHkuV2FybmluZyA9IDI7XG4gICAgLyoqXG4gICAgICogUmVwb3J0cyBhbiBpbmZvcm1hdGlvbi5cbiAgICAgKi9cbiAgICBEaWFnbm9zdGljU2V2ZXJpdHkuSW5mb3JtYXRpb24gPSAzO1xuICAgIC8qKlxuICAgICAqIFJlcG9ydHMgYSBoaW50LlxuICAgICAqL1xuICAgIERpYWdub3N0aWNTZXZlcml0eS5IaW50ID0gNDtcbn0pKERpYWdub3N0aWNTZXZlcml0eSB8fCAoRGlhZ25vc3RpY1NldmVyaXR5ID0ge30pKTtcbi8qKlxuICogVGhlIGRpYWdub3N0aWMgdGFncy5cbiAqXG4gKiBAc2luY2UgMy4xNS4wXG4gKi9cbmV4cG9ydCB2YXIgRGlhZ25vc3RpY1RhZztcbihmdW5jdGlvbiAoRGlhZ25vc3RpY1RhZykge1xuICAgIC8qKlxuICAgICAqIFVudXNlZCBvciB1bm5lY2Vzc2FyeSBjb2RlLlxuICAgICAqXG4gICAgICogQ2xpZW50cyBhcmUgYWxsb3dlZCB0byByZW5kZXIgZGlhZ25vc3RpY3Mgd2l0aCB0aGlzIHRhZyBmYWRlZCBvdXQgaW5zdGVhZCBvZiBoYXZpbmdcbiAgICAgKiBhbiBlcnJvciBzcXVpZ2dsZS5cbiAgICAgKi9cbiAgICBEaWFnbm9zdGljVGFnLlVubmVjZXNzYXJ5ID0gMTtcbiAgICAvKipcbiAgICAgKiBEZXByZWNhdGVkIG9yIG9ic29sZXRlIGNvZGUuXG4gICAgICpcbiAgICAgKiBDbGllbnRzIGFyZSBhbGxvd2VkIHRvIHJlbmRlcmVkIGRpYWdub3N0aWNzIHdpdGggdGhpcyB0YWcgc3RyaWtlIHRocm91Z2guXG4gICAgICovXG4gICAgRGlhZ25vc3RpY1RhZy5EZXByZWNhdGVkID0gMjtcbn0pKERpYWdub3N0aWNUYWcgfHwgKERpYWdub3N0aWNUYWcgPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29kZURlc2NyaXB0aW9uIG5hbWVzcGFjZSBwcm92aWRlcyBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIGRlc2NyaXB0aW9ucyBmb3IgZGlhZ25vc3RpYyBjb2Rlcy5cbiAqXG4gKiBAc2luY2UgMy4xNi4wXG4gKi9cbmV4cG9ydCB2YXIgQ29kZURlc2NyaXB0aW9uO1xuKGZ1bmN0aW9uIChDb2RlRGVzY3JpcHRpb24pIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLmhyZWYpO1xuICAgIH1cbiAgICBDb2RlRGVzY3JpcHRpb24uaXMgPSBpcztcbn0pKENvZGVEZXNjcmlwdGlvbiB8fCAoQ29kZURlc2NyaXB0aW9uID0ge30pKTtcbi8qKlxuICogVGhlIERpYWdub3N0aWMgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgRGlhZ25vc3RpY30gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgRGlhZ25vc3RpYztcbihmdW5jdGlvbiAoRGlhZ25vc3RpYykge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgRGlhZ25vc3RpYyBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgbWVzc2FnZSwgc2V2ZXJpdHksIGNvZGUsIHNvdXJjZSwgcmVsYXRlZEluZm9ybWF0aW9uKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IHJhbmdlLCBtZXNzYWdlIH07XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKHNldmVyaXR5KSkge1xuICAgICAgICAgICAgcmVzdWx0LnNldmVyaXR5ID0gc2V2ZXJpdHk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzLmRlZmluZWQoY29kZSkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5jb2RlID0gY29kZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXMuZGVmaW5lZChzb3VyY2UpKSB7XG4gICAgICAgICAgICByZXN1bHQuc291cmNlID0gc291cmNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKHJlbGF0ZWRJbmZvcm1hdGlvbikpIHtcbiAgICAgICAgICAgIHJlc3VsdC5yZWxhdGVkSW5mb3JtYXRpb24gPSByZWxhdGVkSW5mb3JtYXRpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgRGlhZ25vc3RpYy5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBEaWFnbm9zdGljfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSlcbiAgICAgICAgICAgICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSlcbiAgICAgICAgICAgICYmIElzLnN0cmluZyhjYW5kaWRhdGUubWVzc2FnZSlcbiAgICAgICAgICAgICYmIChJcy5udW1iZXIoY2FuZGlkYXRlLnNldmVyaXR5KSB8fCBJcy51bmRlZmluZWQoY2FuZGlkYXRlLnNldmVyaXR5KSlcbiAgICAgICAgICAgICYmIChJcy5pbnRlZ2VyKGNhbmRpZGF0ZS5jb2RlKSB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLmNvZGUpIHx8IElzLnVuZGVmaW5lZChjYW5kaWRhdGUuY29kZSkpXG4gICAgICAgICAgICAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5jb2RlRGVzY3JpcHRpb24pIHx8IChJcy5zdHJpbmcoKF9hID0gY2FuZGlkYXRlLmNvZGVEZXNjcmlwdGlvbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmhyZWYpKSlcbiAgICAgICAgICAgICYmIChJcy5zdHJpbmcoY2FuZGlkYXRlLnNvdXJjZSkgfHwgSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5zb3VyY2UpKVxuICAgICAgICAgICAgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUucmVsYXRlZEluZm9ybWF0aW9uKSB8fCBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS5yZWxhdGVkSW5mb3JtYXRpb24sIERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24uaXMpKTtcbiAgICB9XG4gICAgRGlhZ25vc3RpYy5pcyA9IGlzO1xufSkoRGlhZ25vc3RpYyB8fCAoRGlhZ25vc3RpYyA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb21tYW5kIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIENvbW1hbmR9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIENvbW1hbmQ7XG4oZnVuY3Rpb24gKENvbW1hbmQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENvbW1hbmQgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodGl0bGUsIGNvbW1hbmQsIC4uLmFyZ3MpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHsgdGl0bGUsIGNvbW1hbmQgfTtcbiAgICAgICAgaWYgKElzLmRlZmluZWQoYXJncykgJiYgYXJncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXN1bHQuYXJndW1lbnRzID0gYXJncztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBDb21tYW5kLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIENvbW1hbmR9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS50aXRsZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5jb21tYW5kKTtcbiAgICB9XG4gICAgQ29tbWFuZC5pcyA9IGlzO1xufSkoQ29tbWFuZCB8fCAoQ29tbWFuZCA9IHt9KSk7XG4vKipcbiAqIFRoZSBUZXh0RWRpdCBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSByZXBsYWNlLFxuICogaW5zZXJ0IGFuZCBkZWxldGUgZWRpdHMgbW9yZSBlYXNpbHkuXG4gKi9cbmV4cG9ydCB2YXIgVGV4dEVkaXQ7XG4oZnVuY3Rpb24gKFRleHRFZGl0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHJlcGxhY2UgdGV4dCBlZGl0LlxuICAgICAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2Ugb2YgdGV4dCB0byBiZSByZXBsYWNlZC5cbiAgICAgKiBAcGFyYW0gbmV3VGV4dCBUaGUgbmV3IHRleHQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVwbGFjZShyYW5nZSwgbmV3VGV4dCkge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgbmV3VGV4dCB9O1xuICAgIH1cbiAgICBUZXh0RWRpdC5yZXBsYWNlID0gcmVwbGFjZTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc2VydCB0ZXh0IGVkaXQuXG4gICAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBwb3NpdGlvbiB0byBpbnNlcnQgdGhlIHRleHQgYXQuXG4gICAgICogQHBhcmFtIG5ld1RleHQgVGhlIHRleHQgdG8gYmUgaW5zZXJ0ZWQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5zZXJ0KHBvc2l0aW9uLCBuZXdUZXh0KSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlOiB7IHN0YXJ0OiBwb3NpdGlvbiwgZW5kOiBwb3NpdGlvbiB9LCBuZXdUZXh0IH07XG4gICAgfVxuICAgIFRleHRFZGl0Lmluc2VydCA9IGluc2VydDtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZGVsZXRlIHRleHQgZWRpdC5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlIG9mIHRleHQgdG8gYmUgZGVsZXRlZC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkZWwocmFuZ2UpIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIG5ld1RleHQ6ICcnIH07XG4gICAgfVxuICAgIFRleHRFZGl0LmRlbCA9IGRlbDtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKVxuICAgICAgICAgICAgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5uZXdUZXh0KVxuICAgICAgICAgICAgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKTtcbiAgICB9XG4gICAgVGV4dEVkaXQuaXMgPSBpcztcbn0pKFRleHRFZGl0IHx8IChUZXh0RWRpdCA9IHt9KSk7XG5leHBvcnQgdmFyIENoYW5nZUFubm90YXRpb247XG4oZnVuY3Rpb24gKENoYW5nZUFubm90YXRpb24pIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUobGFiZWwsIG5lZWRzQ29uZmlybWF0aW9uLCBkZXNjcmlwdGlvbikge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB7IGxhYmVsIH07XG4gICAgICAgIGlmIChuZWVkc0NvbmZpcm1hdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQubmVlZHNDb25maXJtYXRpb24gPSBuZWVkc0NvbmZpcm1hdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVzY3JpcHRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgQ2hhbmdlQW5ub3RhdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5sYWJlbCkgJiZcbiAgICAgICAgICAgIChJcy5ib29sZWFuKGNhbmRpZGF0ZS5uZWVkc0NvbmZpcm1hdGlvbikgfHwgY2FuZGlkYXRlLm5lZWRzQ29uZmlybWF0aW9uID09PSB1bmRlZmluZWQpICYmXG4gICAgICAgICAgICAoSXMuc3RyaW5nKGNhbmRpZGF0ZS5kZXNjcmlwdGlvbikgfHwgY2FuZGlkYXRlLmRlc2NyaXB0aW9uID09PSB1bmRlZmluZWQpO1xuICAgIH1cbiAgICBDaGFuZ2VBbm5vdGF0aW9uLmlzID0gaXM7XG59KShDaGFuZ2VBbm5vdGF0aW9uIHx8IChDaGFuZ2VBbm5vdGF0aW9uID0ge30pKTtcbmV4cG9ydCB2YXIgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXI7XG4oZnVuY3Rpb24gKENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyKSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5zdHJpbmcoY2FuZGlkYXRlKTtcbiAgICB9XG4gICAgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMgPSBpcztcbn0pKENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyIHx8IChDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllciA9IHt9KSk7XG5leHBvcnQgdmFyIEFubm90YXRlZFRleHRFZGl0O1xuKGZ1bmN0aW9uIChBbm5vdGF0ZWRUZXh0RWRpdCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYW5ub3RhdGVkIHJlcGxhY2UgdGV4dCBlZGl0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSBvZiB0ZXh0IHRvIGJlIHJlcGxhY2VkLlxuICAgICAqIEBwYXJhbSBuZXdUZXh0IFRoZSBuZXcgdGV4dC5cbiAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiBUaGUgYW5ub3RhdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXBsYWNlKHJhbmdlLCBuZXdUZXh0LCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCBuZXdUZXh0LCBhbm5vdGF0aW9uSWQ6IGFubm90YXRpb24gfTtcbiAgICB9XG4gICAgQW5ub3RhdGVkVGV4dEVkaXQucmVwbGFjZSA9IHJlcGxhY2U7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhbm5vdGF0ZWQgaW5zZXJ0IHRleHQgZWRpdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgcG9zaXRpb24gdG8gaW5zZXJ0IHRoZSB0ZXh0IGF0LlxuICAgICAqIEBwYXJhbSBuZXdUZXh0IFRoZSB0ZXh0IHRvIGJlIGluc2VydGVkLlxuICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIFRoZSBhbm5vdGF0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluc2VydChwb3NpdGlvbiwgbmV3VGV4dCwgYW5ub3RhdGlvbikge1xuICAgICAgICByZXR1cm4geyByYW5nZTogeyBzdGFydDogcG9zaXRpb24sIGVuZDogcG9zaXRpb24gfSwgbmV3VGV4dCwgYW5ub3RhdGlvbklkOiBhbm5vdGF0aW9uIH07XG4gICAgfVxuICAgIEFubm90YXRlZFRleHRFZGl0Lmluc2VydCA9IGluc2VydDtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFubm90YXRlZCBkZWxldGUgdGV4dCBlZGl0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSBvZiB0ZXh0IHRvIGJlIGRlbGV0ZWQuXG4gICAgICogQHBhcmFtIGFubm90YXRpb24gVGhlIGFubm90YXRpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gZGVsKHJhbmdlLCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCBuZXdUZXh0OiAnJywgYW5ub3RhdGlvbklkOiBhbm5vdGF0aW9uIH07XG4gICAgfVxuICAgIEFubm90YXRlZFRleHRFZGl0LmRlbCA9IGRlbDtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIFRleHRFZGl0LmlzKGNhbmRpZGF0ZSkgJiYgKENoYW5nZUFubm90YXRpb24uaXMoY2FuZGlkYXRlLmFubm90YXRpb25JZCkgfHwgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoY2FuZGlkYXRlLmFubm90YXRpb25JZCkpO1xuICAgIH1cbiAgICBBbm5vdGF0ZWRUZXh0RWRpdC5pcyA9IGlzO1xufSkoQW5ub3RhdGVkVGV4dEVkaXQgfHwgKEFubm90YXRlZFRleHRFZGl0ID0ge30pKTtcbi8qKlxuICogVGhlIFRleHREb2N1bWVudEVkaXQgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGVcbiAqIGFuIGVkaXQgdGhhdCBtYW5pcHVsYXRlcyBhIHRleHQgZG9jdW1lbnQuXG4gKi9cbmV4cG9ydCB2YXIgVGV4dERvY3VtZW50RWRpdDtcbihmdW5jdGlvbiAoVGV4dERvY3VtZW50RWRpdCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgYFRleHREb2N1bWVudEVkaXRgXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHRleHREb2N1bWVudCwgZWRpdHMpIHtcbiAgICAgICAgcmV0dXJuIHsgdGV4dERvY3VtZW50LCBlZGl0cyB9O1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnRFZGl0LmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSlcbiAgICAgICAgICAgICYmIE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllci5pcyhjYW5kaWRhdGUudGV4dERvY3VtZW50KVxuICAgICAgICAgICAgJiYgQXJyYXkuaXNBcnJheShjYW5kaWRhdGUuZWRpdHMpO1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnRFZGl0LmlzID0gaXM7XG59KShUZXh0RG9jdW1lbnRFZGl0IHx8IChUZXh0RG9jdW1lbnRFZGl0ID0ge30pKTtcbmV4cG9ydCB2YXIgQ3JlYXRlRmlsZTtcbihmdW5jdGlvbiAoQ3JlYXRlRmlsZSkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmksIG9wdGlvbnMsIGFubm90YXRpb24pIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIGtpbmQ6ICdjcmVhdGUnLFxuICAgICAgICAgICAgdXJpXG4gICAgICAgIH07XG4gICAgICAgIGlmIChvcHRpb25zICE9PSB1bmRlZmluZWQgJiYgKG9wdGlvbnMub3ZlcndyaXRlICE9PSB1bmRlZmluZWQgfHwgb3B0aW9ucy5pZ25vcmVJZkV4aXN0cyAhPT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgcmVzdWx0Lm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbm5vdGF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5hbm5vdGF0aW9uSWQgPSBhbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIENyZWF0ZUZpbGUuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBjYW5kaWRhdGUua2luZCA9PT0gJ2NyZWF0ZScgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpICYmIChjYW5kaWRhdGUub3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAoKGNhbmRpZGF0ZS5vcHRpb25zLm92ZXJ3cml0ZSA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLm9wdGlvbnMub3ZlcndyaXRlKSkgJiYgKGNhbmRpZGF0ZS5vcHRpb25zLmlnbm9yZUlmRXhpc3RzID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUub3B0aW9ucy5pZ25vcmVJZkV4aXN0cykpKSkgJiYgKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQgPT09IHVuZGVmaW5lZCB8fCBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhjYW5kaWRhdGUuYW5ub3RhdGlvbklkKSk7XG4gICAgfVxuICAgIENyZWF0ZUZpbGUuaXMgPSBpcztcbn0pKENyZWF0ZUZpbGUgfHwgKENyZWF0ZUZpbGUgPSB7fSkpO1xuZXhwb3J0IHZhciBSZW5hbWVGaWxlO1xuKGZ1bmN0aW9uIChSZW5hbWVGaWxlKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKG9sZFVyaSwgbmV3VXJpLCBvcHRpb25zLCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7XG4gICAgICAgICAgICBraW5kOiAncmVuYW1lJyxcbiAgICAgICAgICAgIG9sZFVyaSxcbiAgICAgICAgICAgIG5ld1VyaVxuICAgICAgICB9O1xuICAgICAgICBpZiAob3B0aW9ucyAhPT0gdW5kZWZpbmVkICYmIChvcHRpb25zLm92ZXJ3cml0ZSAhPT0gdW5kZWZpbmVkIHx8IG9wdGlvbnMuaWdub3JlSWZFeGlzdHMgIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgfVxuICAgICAgICBpZiAoYW5ub3RhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQuYW5ub3RhdGlvbklkID0gYW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBSZW5hbWVGaWxlLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgY2FuZGlkYXRlLmtpbmQgPT09ICdyZW5hbWUnICYmIElzLnN0cmluZyhjYW5kaWRhdGUub2xkVXJpKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLm5ld1VyaSkgJiYgKGNhbmRpZGF0ZS5vcHRpb25zID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICgoY2FuZGlkYXRlLm9wdGlvbnMub3ZlcndyaXRlID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUub3B0aW9ucy5vdmVyd3JpdGUpKSAmJiAoY2FuZGlkYXRlLm9wdGlvbnMuaWdub3JlSWZFeGlzdHMgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5vcHRpb25zLmlnbm9yZUlmRXhpc3RzKSkpKSAmJiAoY2FuZGlkYXRlLmFubm90YXRpb25JZCA9PT0gdW5kZWZpbmVkIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQpKTtcbiAgICB9XG4gICAgUmVuYW1lRmlsZS5pcyA9IGlzO1xufSkoUmVuYW1lRmlsZSB8fCAoUmVuYW1lRmlsZSA9IHt9KSk7XG5leHBvcnQgdmFyIERlbGV0ZUZpbGU7XG4oZnVuY3Rpb24gKERlbGV0ZUZpbGUpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUodXJpLCBvcHRpb25zLCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7XG4gICAgICAgICAgICBraW5kOiAnZGVsZXRlJyxcbiAgICAgICAgICAgIHVyaVxuICAgICAgICB9O1xuICAgICAgICBpZiAob3B0aW9ucyAhPT0gdW5kZWZpbmVkICYmIChvcHRpb25zLnJlY3Vyc2l2ZSAhPT0gdW5kZWZpbmVkIHx8IG9wdGlvbnMuaWdub3JlSWZOb3RFeGlzdHMgIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgfVxuICAgICAgICBpZiAoYW5ub3RhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQuYW5ub3RhdGlvbklkID0gYW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBEZWxldGVGaWxlLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgY2FuZGlkYXRlLmtpbmQgPT09ICdkZWxldGUnICYmIElzLnN0cmluZyhjYW5kaWRhdGUudXJpKSAmJiAoY2FuZGlkYXRlLm9wdGlvbnMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgKChjYW5kaWRhdGUub3B0aW9ucy5yZWN1cnNpdmUgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5vcHRpb25zLnJlY3Vyc2l2ZSkpICYmIChjYW5kaWRhdGUub3B0aW9ucy5pZ25vcmVJZk5vdEV4aXN0cyA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLm9wdGlvbnMuaWdub3JlSWZOb3RFeGlzdHMpKSkpICYmIChjYW5kaWRhdGUuYW5ub3RhdGlvbklkID09PSB1bmRlZmluZWQgfHwgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoY2FuZGlkYXRlLmFubm90YXRpb25JZCkpO1xuICAgIH1cbiAgICBEZWxldGVGaWxlLmlzID0gaXM7XG59KShEZWxldGVGaWxlIHx8IChEZWxldGVGaWxlID0ge30pKTtcbmV4cG9ydCB2YXIgV29ya3NwYWNlRWRpdDtcbihmdW5jdGlvbiAoV29ya3NwYWNlRWRpdCkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5jaGFuZ2VzICE9PSB1bmRlZmluZWQgfHwgY2FuZGlkYXRlLmRvY3VtZW50Q2hhbmdlcyAhPT0gdW5kZWZpbmVkKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5kb2N1bWVudENoYW5nZXMgPT09IHVuZGVmaW5lZCB8fCBjYW5kaWRhdGUuZG9jdW1lbnRDaGFuZ2VzLmV2ZXJ5KChjaGFuZ2UpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoSXMuc3RyaW5nKGNoYW5nZS5raW5kKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlRmlsZS5pcyhjaGFuZ2UpIHx8IFJlbmFtZUZpbGUuaXMoY2hhbmdlKSB8fCBEZWxldGVGaWxlLmlzKGNoYW5nZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gVGV4dERvY3VtZW50RWRpdC5pcyhjaGFuZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKTtcbiAgICB9XG4gICAgV29ya3NwYWNlRWRpdC5pcyA9IGlzO1xufSkoV29ya3NwYWNlRWRpdCB8fCAoV29ya3NwYWNlRWRpdCA9IHt9KSk7XG5jbGFzcyBUZXh0RWRpdENoYW5nZUltcGwge1xuICAgIGNvbnN0cnVjdG9yKGVkaXRzLCBjaGFuZ2VBbm5vdGF0aW9ucykge1xuICAgICAgICB0aGlzLmVkaXRzID0gZWRpdHM7XG4gICAgICAgIHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMgPSBjaGFuZ2VBbm5vdGF0aW9ucztcbiAgICB9XG4gICAgaW5zZXJ0KHBvc2l0aW9uLCBuZXdUZXh0LCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIGxldCBlZGl0O1xuICAgICAgICBsZXQgaWQ7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGVkaXQgPSBUZXh0RWRpdC5pbnNlcnQocG9zaXRpb24sIG5ld1RleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGFubm90YXRpb24pKSB7XG4gICAgICAgICAgICBpZCA9IGFubm90YXRpb247XG4gICAgICAgICAgICBlZGl0ID0gQW5ub3RhdGVkVGV4dEVkaXQuaW5zZXJ0KHBvc2l0aW9uLCBuZXdUZXh0LCBhbm5vdGF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYXNzZXJ0Q2hhbmdlQW5ub3RhdGlvbnModGhpcy5jaGFuZ2VBbm5vdGF0aW9ucyk7XG4gICAgICAgICAgICBpZCA9IHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMubWFuYWdlKGFubm90YXRpb24pO1xuICAgICAgICAgICAgZWRpdCA9IEFubm90YXRlZFRleHRFZGl0Lmluc2VydChwb3NpdGlvbiwgbmV3VGV4dCwgaWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWRpdHMucHVzaChlZGl0KTtcbiAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXBsYWNlKHJhbmdlLCBuZXdUZXh0LCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIGxldCBlZGl0O1xuICAgICAgICBsZXQgaWQ7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGVkaXQgPSBUZXh0RWRpdC5yZXBsYWNlKHJhbmdlLCBuZXdUZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhhbm5vdGF0aW9uKSkge1xuICAgICAgICAgICAgaWQgPSBhbm5vdGF0aW9uO1xuICAgICAgICAgICAgZWRpdCA9IEFubm90YXRlZFRleHRFZGl0LnJlcGxhY2UocmFuZ2UsIG5ld1RleHQsIGFubm90YXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hc3NlcnRDaGFuZ2VBbm5vdGF0aW9ucyh0aGlzLmNoYW5nZUFubm90YXRpb25zKTtcbiAgICAgICAgICAgIGlkID0gdGhpcy5jaGFuZ2VBbm5vdGF0aW9ucy5tYW5hZ2UoYW5ub3RhdGlvbik7XG4gICAgICAgICAgICBlZGl0ID0gQW5ub3RhdGVkVGV4dEVkaXQucmVwbGFjZShyYW5nZSwgbmV3VGV4dCwgaWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWRpdHMucHVzaChlZGl0KTtcbiAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkZWxldGUocmFuZ2UsIGFubm90YXRpb24pIHtcbiAgICAgICAgbGV0IGVkaXQ7XG4gICAgICAgIGxldCBpZDtcbiAgICAgICAgaWYgKGFubm90YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZWRpdCA9IFRleHRFZGl0LmRlbChyYW5nZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoYW5ub3RhdGlvbikpIHtcbiAgICAgICAgICAgIGlkID0gYW5ub3RhdGlvbjtcbiAgICAgICAgICAgIGVkaXQgPSBBbm5vdGF0ZWRUZXh0RWRpdC5kZWwocmFuZ2UsIGFubm90YXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hc3NlcnRDaGFuZ2VBbm5vdGF0aW9ucyh0aGlzLmNoYW5nZUFubm90YXRpb25zKTtcbiAgICAgICAgICAgIGlkID0gdGhpcy5jaGFuZ2VBbm5vdGF0aW9ucy5tYW5hZ2UoYW5ub3RhdGlvbik7XG4gICAgICAgICAgICBlZGl0ID0gQW5ub3RhdGVkVGV4dEVkaXQuZGVsKHJhbmdlLCBpZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lZGl0cy5wdXNoKGVkaXQpO1xuICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFkZChlZGl0KSB7XG4gICAgICAgIHRoaXMuZWRpdHMucHVzaChlZGl0KTtcbiAgICB9XG4gICAgYWxsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0cztcbiAgICB9XG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuZWRpdHMuc3BsaWNlKDAsIHRoaXMuZWRpdHMubGVuZ3RoKTtcbiAgICB9XG4gICAgYXNzZXJ0Q2hhbmdlQW5ub3RhdGlvbnModmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGV4dCBlZGl0IGNoYW5nZSBpcyBub3QgY29uZmlndXJlZCB0byBtYW5hZ2UgY2hhbmdlIGFubm90YXRpb25zLmApO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBBIGhlbHBlciBjbGFzc1xuICovXG5jbGFzcyBDaGFuZ2VBbm5vdGF0aW9ucyB7XG4gICAgY29uc3RydWN0b3IoYW5ub3RhdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9ucyA9PT0gdW5kZWZpbmVkID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IGFubm90YXRpb25zO1xuICAgICAgICB0aGlzLl9jb3VudGVyID0gMDtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IDA7XG4gICAgfVxuICAgIGFsbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Fubm90YXRpb25zO1xuICAgIH1cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpemU7XG4gICAgfVxuICAgIG1hbmFnZShpZE9yQW5ub3RhdGlvbiwgYW5ub3RhdGlvbikge1xuICAgICAgICBsZXQgaWQ7XG4gICAgICAgIGlmIChDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhpZE9yQW5ub3RhdGlvbikpIHtcbiAgICAgICAgICAgIGlkID0gaWRPckFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZCA9IHRoaXMubmV4dElkKCk7XG4gICAgICAgICAgICBhbm5vdGF0aW9uID0gaWRPckFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2Fubm90YXRpb25zW2lkXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYElkICR7aWR9IGlzIGFscmVhZHkgaW4gdXNlLmApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbm5vdGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gYW5ub3RhdGlvbiBwcm92aWRlZCBmb3IgaWQgJHtpZH1gKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9hbm5vdGF0aW9uc1tpZF0gPSBhbm5vdGF0aW9uO1xuICAgICAgICB0aGlzLl9zaXplKys7XG4gICAgICAgIHJldHVybiBpZDtcbiAgICB9XG4gICAgbmV4dElkKCkge1xuICAgICAgICB0aGlzLl9jb3VudGVyKys7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb3VudGVyLnRvU3RyaW5nKCk7XG4gICAgfVxufVxuLyoqXG4gKiBBIHdvcmtzcGFjZSBjaGFuZ2UgaGVscHMgY29uc3RydWN0aW5nIGNoYW5nZXMgdG8gYSB3b3Jrc3BhY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBXb3Jrc3BhY2VDaGFuZ2Uge1xuICAgIGNvbnN0cnVjdG9yKHdvcmtzcGFjZUVkaXQpIHtcbiAgICAgICAgdGhpcy5fdGV4dEVkaXRDaGFuZ2VzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgaWYgKHdvcmtzcGFjZUVkaXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdCA9IHdvcmtzcGFjZUVkaXQ7XG4gICAgICAgICAgICBpZiAod29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucyA9IG5ldyBDaGFuZ2VBbm5vdGF0aW9ucyh3b3Jrc3BhY2VFZGl0LmNoYW5nZUFubm90YXRpb25zKTtcbiAgICAgICAgICAgICAgICB3b3Jrc3BhY2VFZGl0LmNoYW5nZUFubm90YXRpb25zID0gdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMuYWxsKCk7XG4gICAgICAgICAgICAgICAgd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMuZm9yRWFjaCgoY2hhbmdlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChUZXh0RG9jdW1lbnRFZGl0LmlzKGNoYW5nZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHRFZGl0Q2hhbmdlID0gbmV3IFRleHRFZGl0Q2hhbmdlSW1wbChjaGFuZ2UuZWRpdHMsIHRoaXMuX2NoYW5nZUFubm90YXRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RleHRFZGl0Q2hhbmdlc1tjaGFuZ2UudGV4dERvY3VtZW50LnVyaV0gPSB0ZXh0RWRpdENoYW5nZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAod29ya3NwYWNlRWRpdC5jaGFuZ2VzKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMod29ya3NwYWNlRWRpdC5jaGFuZ2VzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dEVkaXRDaGFuZ2UgPSBuZXcgVGV4dEVkaXRDaGFuZ2VJbXBsKHdvcmtzcGFjZUVkaXQuY2hhbmdlc1trZXldKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGV4dEVkaXRDaGFuZ2VzW2tleV0gPSB0ZXh0RWRpdENoYW5nZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQgPSB7fTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIHtAbGluayBXb3Jrc3BhY2VFZGl0fSBsaXRlcmFsXG4gICAgICogdXNlIHRvIGJlIHJldHVybmVkIGZyb20gYSB3b3Jrc3BhY2UgZWRpdCBvcGVyYXRpb24gbGlrZSByZW5hbWUuXG4gICAgICovXG4gICAgZ2V0IGVkaXQoKSB7XG4gICAgICAgIHRoaXMuaW5pdERvY3VtZW50Q2hhbmdlcygpO1xuICAgICAgICBpZiAodGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2NoYW5nZUFubm90YXRpb25zLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZUFubm90YXRpb25zID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VBbm5vdGF0aW9ucyA9IHRoaXMuX2NoYW5nZUFubm90YXRpb25zLmFsbCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl93b3Jrc3BhY2VFZGl0O1xuICAgIH1cbiAgICBnZXRUZXh0RWRpdENoYW5nZShrZXkpIHtcbiAgICAgICAgaWYgKE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllci5pcyhrZXkpKSB7XG4gICAgICAgICAgICB0aGlzLmluaXREb2N1bWVudENoYW5nZXMoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXb3Jrc3BhY2UgZWRpdCBpcyBub3QgY29uZmlndXJlZCBmb3IgZG9jdW1lbnQgY2hhbmdlcy4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHRleHREb2N1bWVudCA9IHsgdXJpOiBrZXkudXJpLCB2ZXJzaW9uOiBrZXkudmVyc2lvbiB9O1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuX3RleHRFZGl0Q2hhbmdlc1t0ZXh0RG9jdW1lbnQudXJpXTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWRpdHMgPSBbXTtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0RG9jdW1lbnRFZGl0ID0ge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIGVkaXRzXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcy5wdXNoKHRleHREb2N1bWVudEVkaXQpO1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBUZXh0RWRpdENoYW5nZUltcGwoZWRpdHMsIHRoaXMuX2NoYW5nZUFubm90YXRpb25zKTtcbiAgICAgICAgICAgICAgICB0aGlzLl90ZXh0RWRpdENoYW5nZXNbdGV4dERvY3VtZW50LnVyaV0gPSByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pbml0Q2hhbmdlcygpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXb3Jrc3BhY2UgZWRpdCBpcyBub3QgY29uZmlndXJlZCBmb3Igbm9ybWFsIHRleHQgZWRpdCBjaGFuZ2VzLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuX3RleHRFZGl0Q2hhbmdlc1trZXldO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBsZXQgZWRpdHMgPSBbXTtcbiAgICAgICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZXNba2V5XSA9IGVkaXRzO1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBUZXh0RWRpdENoYW5nZUltcGwoZWRpdHMpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3RleHRFZGl0Q2hhbmdlc1trZXldID0gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpbml0RG9jdW1lbnRDaGFuZ2VzKCkge1xuICAgICAgICBpZiAodGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMgPT09IHVuZGVmaW5lZCAmJiB0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMgPSBuZXcgQ2hhbmdlQW5ub3RhdGlvbnMoKTtcbiAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzID0gW107XG4gICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZUFubm90YXRpb25zID0gdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMuYWxsKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaW5pdENoYW5nZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcyA9PT0gdW5kZWZpbmVkICYmIHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNyZWF0ZUZpbGUodXJpLCBvcHRpb25zT3JBbm5vdGF0aW9uLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuaW5pdERvY3VtZW50Q2hhbmdlcygpO1xuICAgICAgICBpZiAodGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXb3Jrc3BhY2UgZWRpdCBpcyBub3QgY29uZmlndXJlZCBmb3IgZG9jdW1lbnQgY2hhbmdlcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYW5ub3RhdGlvbjtcbiAgICAgICAgaWYgKENoYW5nZUFubm90YXRpb24uaXMob3B0aW9uc09yQW5ub3RhdGlvbikgfHwgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMob3B0aW9uc09yQW5ub3RhdGlvbikpIHtcbiAgICAgICAgICAgIGFubm90YXRpb24gPSBvcHRpb25zT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnNPckFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG9wZXJhdGlvbjtcbiAgICAgICAgbGV0IGlkO1xuICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcGVyYXRpb24gPSBDcmVhdGVGaWxlLmNyZWF0ZSh1cmksIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWQgPSBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhhbm5vdGF0aW9uKSA/IGFubm90YXRpb24gOiB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5tYW5hZ2UoYW5ub3RhdGlvbik7XG4gICAgICAgICAgICBvcGVyYXRpb24gPSBDcmVhdGVGaWxlLmNyZWF0ZSh1cmksIG9wdGlvbnMsIGlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcy5wdXNoKG9wZXJhdGlvbik7XG4gICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVuYW1lRmlsZShvbGRVcmksIG5ld1VyaSwgb3B0aW9uc09yQW5ub3RhdGlvbiwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLmluaXREb2N1bWVudENoYW5nZXMoKTtcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV29ya3NwYWNlIGVkaXQgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIGRvY3VtZW50IGNoYW5nZXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGFubm90YXRpb247XG4gICAgICAgIGlmIChDaGFuZ2VBbm5vdGF0aW9uLmlzKG9wdGlvbnNPckFubm90YXRpb24pIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKG9wdGlvbnNPckFubm90YXRpb24pKSB7XG4gICAgICAgICAgICBhbm5vdGF0aW9uID0gb3B0aW9uc09yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGxldCBvcGVyYXRpb247XG4gICAgICAgIGxldCBpZDtcbiAgICAgICAgaWYgKGFubm90YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3BlcmF0aW9uID0gUmVuYW1lRmlsZS5jcmVhdGUob2xkVXJpLCBuZXdVcmksIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWQgPSBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhhbm5vdGF0aW9uKSA/IGFubm90YXRpb24gOiB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5tYW5hZ2UoYW5ub3RhdGlvbik7XG4gICAgICAgICAgICBvcGVyYXRpb24gPSBSZW5hbWVGaWxlLmNyZWF0ZShvbGRVcmksIG5ld1VyaSwgb3B0aW9ucywgaWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzLnB1c2gob3BlcmF0aW9uKTtcbiAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkZWxldGVGaWxlKHVyaSwgb3B0aW9uc09yQW5ub3RhdGlvbiwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLmluaXREb2N1bWVudENoYW5nZXMoKTtcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV29ya3NwYWNlIGVkaXQgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIGRvY3VtZW50IGNoYW5nZXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGFubm90YXRpb247XG4gICAgICAgIGlmIChDaGFuZ2VBbm5vdGF0aW9uLmlzKG9wdGlvbnNPckFubm90YXRpb24pIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKG9wdGlvbnNPckFubm90YXRpb24pKSB7XG4gICAgICAgICAgICBhbm5vdGF0aW9uID0gb3B0aW9uc09yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGxldCBvcGVyYXRpb247XG4gICAgICAgIGxldCBpZDtcbiAgICAgICAgaWYgKGFubm90YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3BlcmF0aW9uID0gRGVsZXRlRmlsZS5jcmVhdGUodXJpLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlkID0gQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoYW5ub3RhdGlvbikgPyBhbm5vdGF0aW9uIDogdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMubWFuYWdlKGFubm90YXRpb24pO1xuICAgICAgICAgICAgb3BlcmF0aW9uID0gRGVsZXRlRmlsZS5jcmVhdGUodXJpLCBvcHRpb25zLCBpZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMucHVzaChvcGVyYXRpb24pO1xuICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBUaGUgVGV4dERvY3VtZW50SWRlbnRpZmllciBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBUZXh0RG9jdW1lbnRJZGVudGlmaWVyfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBUZXh0RG9jdW1lbnRJZGVudGlmaWVyO1xuKGZ1bmN0aW9uIChUZXh0RG9jdW1lbnRJZGVudGlmaWVyKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBUZXh0RG9jdW1lbnRJZGVudGlmaWVyIGxpdGVyYWwuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgZG9jdW1lbnQncyB1cmkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHVyaSkge1xuICAgICAgICByZXR1cm4geyB1cmkgfTtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50SWRlbnRpZmllci5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBUZXh0RG9jdW1lbnRJZGVudGlmaWVyfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudXJpKTtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50SWRlbnRpZmllci5pcyA9IGlzO1xufSkoVGV4dERvY3VtZW50SWRlbnRpZmllciB8fCAoVGV4dERvY3VtZW50SWRlbnRpZmllciA9IHt9KSk7XG4vKipcbiAqIFRoZSBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXJ9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXI7XG4oZnVuY3Rpb24gKFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIgbGl0ZXJhbC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSBkb2N1bWVudCdzIHVyaS5cbiAgICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgZG9jdW1lbnQncyB2ZXJzaW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmksIHZlcnNpb24pIHtcbiAgICAgICAgcmV0dXJuIHsgdXJpLCB2ZXJzaW9uIH07XG4gICAgfVxuICAgIFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSkgJiYgSXMuaW50ZWdlcihjYW5kaWRhdGUudmVyc2lvbik7XG4gICAgfVxuICAgIFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIuaXMgPSBpcztcbn0pKFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIgfHwgKFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIgPSB7fSkpO1xuLyoqXG4gKiBUaGUgT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyO1xuKGZ1bmN0aW9uIChPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciBsaXRlcmFsLlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIGRvY3VtZW50J3MgdXJpLlxuICAgICAqIEBwYXJhbSB2ZXJzaW9uIFRoZSBkb2N1bWVudCdzIHZlcnNpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHVyaSwgdmVyc2lvbikge1xuICAgICAgICByZXR1cm4geyB1cmksIHZlcnNpb24gfTtcbiAgICB9XG4gICAgT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSkgJiYgKGNhbmRpZGF0ZS52ZXJzaW9uID09PSBudWxsIHx8IElzLmludGVnZXIoY2FuZGlkYXRlLnZlcnNpb24pKTtcbiAgICB9XG4gICAgT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmlzID0gaXM7XG59KShPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIgfHwgKE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciA9IHt9KSk7XG4vKipcbiAqIFRoZSBUZXh0RG9jdW1lbnRJdGVtIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIFRleHREb2N1bWVudEl0ZW19IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIFRleHREb2N1bWVudEl0ZW07XG4oZnVuY3Rpb24gKFRleHREb2N1bWVudEl0ZW0pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFRleHREb2N1bWVudEl0ZW0gbGl0ZXJhbC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSBkb2N1bWVudCdzIHVyaS5cbiAgICAgKiBAcGFyYW0gbGFuZ3VhZ2VJZCBUaGUgZG9jdW1lbnQncyBsYW5ndWFnZSBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB2ZXJzaW9uIFRoZSBkb2N1bWVudCdzIHZlcnNpb24gbnVtYmVyLlxuICAgICAqIEBwYXJhbSB0ZXh0IFRoZSBkb2N1bWVudCdzIHRleHQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHVyaSwgbGFuZ3VhZ2VJZCwgdmVyc2lvbiwgdGV4dCkge1xuICAgICAgICByZXR1cm4geyB1cmksIGxhbmd1YWdlSWQsIHZlcnNpb24sIHRleHQgfTtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50SXRlbS5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBUZXh0RG9jdW1lbnRJdGVtfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudXJpKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLmxhbmd1YWdlSWQpICYmIElzLmludGVnZXIoY2FuZGlkYXRlLnZlcnNpb24pICYmIElzLnN0cmluZyhjYW5kaWRhdGUudGV4dCk7XG4gICAgfVxuICAgIFRleHREb2N1bWVudEl0ZW0uaXMgPSBpcztcbn0pKFRleHREb2N1bWVudEl0ZW0gfHwgKFRleHREb2N1bWVudEl0ZW0gPSB7fSkpO1xuLyoqXG4gKiBEZXNjcmliZXMgdGhlIGNvbnRlbnQgdHlwZSB0aGF0IGEgY2xpZW50IHN1cHBvcnRzIGluIHZhcmlvdXNcbiAqIHJlc3VsdCBsaXRlcmFscyBsaWtlIGBIb3ZlcmAsIGBQYXJhbWV0ZXJJbmZvYCBvciBgQ29tcGxldGlvbkl0ZW1gLlxuICpcbiAqIFBsZWFzZSBub3RlIHRoYXQgYE1hcmt1cEtpbmRzYCBtdXN0IG5vdCBzdGFydCB3aXRoIGEgYCRgLiBUaGlzIGtpbmRzXG4gKiBhcmUgcmVzZXJ2ZWQgZm9yIGludGVybmFsIHVzYWdlLlxuICovXG5leHBvcnQgdmFyIE1hcmt1cEtpbmQ7XG4oZnVuY3Rpb24gKE1hcmt1cEtpbmQpIHtcbiAgICAvKipcbiAgICAgKiBQbGFpbiB0ZXh0IGlzIHN1cHBvcnRlZCBhcyBhIGNvbnRlbnQgZm9ybWF0XG4gICAgICovXG4gICAgTWFya3VwS2luZC5QbGFpblRleHQgPSAncGxhaW50ZXh0JztcbiAgICAvKipcbiAgICAgKiBNYXJrZG93biBpcyBzdXBwb3J0ZWQgYXMgYSBjb250ZW50IGZvcm1hdFxuICAgICAqL1xuICAgIE1hcmt1cEtpbmQuTWFya2Rvd24gPSAnbWFya2Rvd24nO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBpcyBhIHZhbHVlIG9mIHRoZSB7QGxpbmsgTWFya3VwS2luZH0gdHlwZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSA9PT0gTWFya3VwS2luZC5QbGFpblRleHQgfHwgY2FuZGlkYXRlID09PSBNYXJrdXBLaW5kLk1hcmtkb3duO1xuICAgIH1cbiAgICBNYXJrdXBLaW5kLmlzID0gaXM7XG59KShNYXJrdXBLaW5kIHx8IChNYXJrdXBLaW5kID0ge30pKTtcbmV4cG9ydCB2YXIgTWFya3VwQ29udGVudDtcbihmdW5jdGlvbiAoTWFya3VwQ29udGVudCkge1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBjb25mb3JtcyB0byB0aGUge0BsaW5rIE1hcmt1cENvbnRlbnR9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwodmFsdWUpICYmIE1hcmt1cEtpbmQuaXMoY2FuZGlkYXRlLmtpbmQpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudmFsdWUpO1xuICAgIH1cbiAgICBNYXJrdXBDb250ZW50LmlzID0gaXM7XG59KShNYXJrdXBDb250ZW50IHx8IChNYXJrdXBDb250ZW50ID0ge30pKTtcbi8qKlxuICogVGhlIGtpbmQgb2YgYSBjb21wbGV0aW9uIGVudHJ5LlxuICovXG5leHBvcnQgdmFyIENvbXBsZXRpb25JdGVtS2luZDtcbihmdW5jdGlvbiAoQ29tcGxldGlvbkl0ZW1LaW5kKSB7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlRleHQgPSAxO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5NZXRob2QgPSAyO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5GdW5jdGlvbiA9IDM7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkNvbnN0cnVjdG9yID0gNDtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuRmllbGQgPSA1O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5WYXJpYWJsZSA9IDY7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkNsYXNzID0gNztcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuSW50ZXJmYWNlID0gODtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuTW9kdWxlID0gOTtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuUHJvcGVydHkgPSAxMDtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuVW5pdCA9IDExO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5WYWx1ZSA9IDEyO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5FbnVtID0gMTM7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLktleXdvcmQgPSAxNDtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuU25pcHBldCA9IDE1O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5Db2xvciA9IDE2O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5GaWxlID0gMTc7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlJlZmVyZW5jZSA9IDE4O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5Gb2xkZXIgPSAxOTtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuRW51bU1lbWJlciA9IDIwO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5Db25zdGFudCA9IDIxO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5TdHJ1Y3QgPSAyMjtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuRXZlbnQgPSAyMztcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuT3BlcmF0b3IgPSAyNDtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuVHlwZVBhcmFtZXRlciA9IDI1O1xufSkoQ29tcGxldGlvbkl0ZW1LaW5kIHx8IChDb21wbGV0aW9uSXRlbUtpbmQgPSB7fSkpO1xuLyoqXG4gKiBEZWZpbmVzIHdoZXRoZXIgdGhlIGluc2VydCB0ZXh0IGluIGEgY29tcGxldGlvbiBpdGVtIHNob3VsZCBiZSBpbnRlcnByZXRlZCBhc1xuICogcGxhaW4gdGV4dCBvciBhIHNuaXBwZXQuXG4gKi9cbmV4cG9ydCB2YXIgSW5zZXJ0VGV4dEZvcm1hdDtcbihmdW5jdGlvbiAoSW5zZXJ0VGV4dEZvcm1hdCkge1xuICAgIC8qKlxuICAgICAqIFRoZSBwcmltYXJ5IHRleHQgdG8gYmUgaW5zZXJ0ZWQgaXMgdHJlYXRlZCBhcyBhIHBsYWluIHN0cmluZy5cbiAgICAgKi9cbiAgICBJbnNlcnRUZXh0Rm9ybWF0LlBsYWluVGV4dCA9IDE7XG4gICAgLyoqXG4gICAgICogVGhlIHByaW1hcnkgdGV4dCB0byBiZSBpbnNlcnRlZCBpcyB0cmVhdGVkIGFzIGEgc25pcHBldC5cbiAgICAgKlxuICAgICAqIEEgc25pcHBldCBjYW4gZGVmaW5lIHRhYiBzdG9wcyBhbmQgcGxhY2Vob2xkZXJzIHdpdGggYCQxYCwgYCQyYFxuICAgICAqIGFuZCBgJHszOmZvb31gLiBgJDBgIGRlZmluZXMgdGhlIGZpbmFsIHRhYiBzdG9wLCBpdCBkZWZhdWx0cyB0b1xuICAgICAqIHRoZSBlbmQgb2YgdGhlIHNuaXBwZXQuIFBsYWNlaG9sZGVycyB3aXRoIGVxdWFsIGlkZW50aWZpZXJzIGFyZSBsaW5rZWQsXG4gICAgICogdGhhdCBpcyB0eXBpbmcgaW4gb25lIHdpbGwgdXBkYXRlIG90aGVycyB0b28uXG4gICAgICpcbiAgICAgKiBTZWUgYWxzbzogaHR0cHM6Ly9taWNyb3NvZnQuZ2l0aHViLmlvL2xhbmd1YWdlLXNlcnZlci1wcm90b2NvbC9zcGVjaWZpY2F0aW9ucy9zcGVjaWZpY2F0aW9uLWN1cnJlbnQvI3NuaXBwZXRfc3ludGF4XG4gICAgICovXG4gICAgSW5zZXJ0VGV4dEZvcm1hdC5TbmlwcGV0ID0gMjtcbn0pKEluc2VydFRleHRGb3JtYXQgfHwgKEluc2VydFRleHRGb3JtYXQgPSB7fSkpO1xuLyoqXG4gKiBDb21wbGV0aW9uIGl0ZW0gdGFncyBhcmUgZXh0cmEgYW5ub3RhdGlvbnMgdGhhdCB0d2VhayB0aGUgcmVuZGVyaW5nIG9mIGEgY29tcGxldGlvblxuICogaXRlbS5cbiAqXG4gKiBAc2luY2UgMy4xNS4wXG4gKi9cbmV4cG9ydCB2YXIgQ29tcGxldGlvbkl0ZW1UYWc7XG4oZnVuY3Rpb24gKENvbXBsZXRpb25JdGVtVGFnKSB7XG4gICAgLyoqXG4gICAgICogUmVuZGVyIGEgY29tcGxldGlvbiBhcyBvYnNvbGV0ZSwgdXN1YWxseSB1c2luZyBhIHN0cmlrZS1vdXQuXG4gICAgICovXG4gICAgQ29tcGxldGlvbkl0ZW1UYWcuRGVwcmVjYXRlZCA9IDE7XG59KShDb21wbGV0aW9uSXRlbVRhZyB8fCAoQ29tcGxldGlvbkl0ZW1UYWcgPSB7fSkpO1xuLyoqXG4gKiBUaGUgSW5zZXJ0UmVwbGFjZUVkaXQgbmFtZXNwYWNlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGggaW5zZXJ0IC8gcmVwbGFjZSBlZGl0cy5cbiAqXG4gKiBAc2luY2UgMy4xNi4wXG4gKi9cbmV4cG9ydCB2YXIgSW5zZXJ0UmVwbGFjZUVkaXQ7XG4oZnVuY3Rpb24gKEluc2VydFJlcGxhY2VFZGl0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBpbnNlcnQgLyByZXBsYWNlIGVkaXRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobmV3VGV4dCwgaW5zZXJ0LCByZXBsYWNlKSB7XG4gICAgICAgIHJldHVybiB7IG5ld1RleHQsIGluc2VydCwgcmVwbGFjZSB9O1xuICAgIH1cbiAgICBJbnNlcnRSZXBsYWNlRWRpdC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBJbnNlcnRSZXBsYWNlRWRpdH0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLnN0cmluZyhjYW5kaWRhdGUubmV3VGV4dCkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLmluc2VydCkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJlcGxhY2UpO1xuICAgIH1cbiAgICBJbnNlcnRSZXBsYWNlRWRpdC5pcyA9IGlzO1xufSkoSW5zZXJ0UmVwbGFjZUVkaXQgfHwgKEluc2VydFJlcGxhY2VFZGl0ID0ge30pKTtcbi8qKlxuICogSG93IHdoaXRlc3BhY2UgYW5kIGluZGVudGF0aW9uIGlzIGhhbmRsZWQgZHVyaW5nIGNvbXBsZXRpb25cbiAqIGl0ZW0gaW5zZXJ0aW9uLlxuICpcbiAqIEBzaW5jZSAzLjE2LjBcbiAqL1xuZXhwb3J0IHZhciBJbnNlcnRUZXh0TW9kZTtcbihmdW5jdGlvbiAoSW5zZXJ0VGV4dE1vZGUpIHtcbiAgICAvKipcbiAgICAgKiBUaGUgaW5zZXJ0aW9uIG9yIHJlcGxhY2Ugc3RyaW5ncyBpcyB0YWtlbiBhcyBpdCBpcy4gSWYgdGhlXG4gICAgICogdmFsdWUgaXMgbXVsdGkgbGluZSB0aGUgbGluZXMgYmVsb3cgdGhlIGN1cnNvciB3aWxsIGJlXG4gICAgICogaW5zZXJ0ZWQgdXNpbmcgdGhlIGluZGVudGF0aW9uIGRlZmluZWQgaW4gdGhlIHN0cmluZyB2YWx1ZS5cbiAgICAgKiBUaGUgY2xpZW50IHdpbGwgbm90IGFwcGx5IGFueSBraW5kIG9mIGFkanVzdG1lbnRzIHRvIHRoZVxuICAgICAqIHN0cmluZy5cbiAgICAgKi9cbiAgICBJbnNlcnRUZXh0TW9kZS5hc0lzID0gMTtcbiAgICAvKipcbiAgICAgKiBUaGUgZWRpdG9yIGFkanVzdHMgbGVhZGluZyB3aGl0ZXNwYWNlIG9mIG5ldyBsaW5lcyBzbyB0aGF0XG4gICAgICogdGhleSBtYXRjaCB0aGUgaW5kZW50YXRpb24gdXAgdG8gdGhlIGN1cnNvciBvZiB0aGUgbGluZSBmb3JcbiAgICAgKiB3aGljaCB0aGUgaXRlbSBpcyBhY2NlcHRlZC5cbiAgICAgKlxuICAgICAqIENvbnNpZGVyIGEgbGluZSBsaWtlIHRoaXM6IDwydGFicz48Y3Vyc29yPjwzdGFicz5mb28uIEFjY2VwdGluZyBhXG4gICAgICogbXVsdGkgbGluZSBjb21wbGV0aW9uIGl0ZW0gaXMgaW5kZW50ZWQgdXNpbmcgMiB0YWJzIGFuZCBhbGxcbiAgICAgKiBmb2xsb3dpbmcgbGluZXMgaW5zZXJ0ZWQgd2lsbCBiZSBpbmRlbnRlZCB1c2luZyAyIHRhYnMgYXMgd2VsbC5cbiAgICAgKi9cbiAgICBJbnNlcnRUZXh0TW9kZS5hZGp1c3RJbmRlbnRhdGlvbiA9IDI7XG59KShJbnNlcnRUZXh0TW9kZSB8fCAoSW5zZXJ0VGV4dE1vZGUgPSB7fSkpO1xuZXhwb3J0IHZhciBDb21wbGV0aW9uSXRlbUxhYmVsRGV0YWlscztcbihmdW5jdGlvbiAoQ29tcGxldGlvbkl0ZW1MYWJlbERldGFpbHMpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiAoSXMuc3RyaW5nKGNhbmRpZGF0ZS5kZXRhaWwpIHx8IGNhbmRpZGF0ZS5kZXRhaWwgPT09IHVuZGVmaW5lZCkgJiZcbiAgICAgICAgICAgIChJcy5zdHJpbmcoY2FuZGlkYXRlLmRlc2NyaXB0aW9uKSB8fCBjYW5kaWRhdGUuZGVzY3JpcHRpb24gPT09IHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIENvbXBsZXRpb25JdGVtTGFiZWxEZXRhaWxzLmlzID0gaXM7XG59KShDb21wbGV0aW9uSXRlbUxhYmVsRGV0YWlscyB8fCAoQ29tcGxldGlvbkl0ZW1MYWJlbERldGFpbHMgPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29tcGxldGlvbkl0ZW0gbmFtZXNwYWNlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGhcbiAqIGNvbXBsZXRpb24gaXRlbXMuXG4gKi9cbmV4cG9ydCB2YXIgQ29tcGxldGlvbkl0ZW07XG4oZnVuY3Rpb24gKENvbXBsZXRpb25JdGVtKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgY29tcGxldGlvbiBpdGVtIGFuZCBzZWVkIGl0IHdpdGggYSBsYWJlbC5cbiAgICAgKiBAcGFyYW0gbGFiZWwgVGhlIGNvbXBsZXRpb24gaXRlbSdzIGxhYmVsXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGxhYmVsKSB7XG4gICAgICAgIHJldHVybiB7IGxhYmVsIH07XG4gICAgfVxuICAgIENvbXBsZXRpb25JdGVtLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKENvbXBsZXRpb25JdGVtIHx8IChDb21wbGV0aW9uSXRlbSA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb21wbGV0aW9uTGlzdCBuYW1lc3BhY2UgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aFxuICogY29tcGxldGlvbiBsaXN0cy5cbiAqL1xuZXhwb3J0IHZhciBDb21wbGV0aW9uTGlzdDtcbihmdW5jdGlvbiAoQ29tcGxldGlvbkxpc3QpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGNvbXBsZXRpb24gbGlzdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpdGVtcyBUaGUgY29tcGxldGlvbiBpdGVtcy5cbiAgICAgKiBAcGFyYW0gaXNJbmNvbXBsZXRlIFRoZSBsaXN0IGlzIG5vdCBjb21wbGV0ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUoaXRlbXMsIGlzSW5jb21wbGV0ZSkge1xuICAgICAgICByZXR1cm4geyBpdGVtczogaXRlbXMgPyBpdGVtcyA6IFtdLCBpc0luY29tcGxldGU6ICEhaXNJbmNvbXBsZXRlIH07XG4gICAgfVxuICAgIENvbXBsZXRpb25MaXN0LmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKENvbXBsZXRpb25MaXN0IHx8IChDb21wbGV0aW9uTGlzdCA9IHt9KSk7XG5leHBvcnQgdmFyIE1hcmtlZFN0cmluZztcbihmdW5jdGlvbiAoTWFya2VkU3RyaW5nKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG1hcmtlZCBzdHJpbmcgZnJvbSBwbGFpbiB0ZXh0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHBsYWluVGV4dCBUaGUgcGxhaW4gdGV4dC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmcm9tUGxhaW5UZXh0KHBsYWluVGV4dCkge1xuICAgICAgICByZXR1cm4gcGxhaW5UZXh0LnJlcGxhY2UoL1tcXFxcYCpfe31bXFxdKCkjK1xcLS4hXS9nLCAnXFxcXCQmJyk7IC8vIGVzY2FwZSBtYXJrZG93biBzeW50YXggdG9rZW5zOiBodHRwOi8vZGFyaW5nZmlyZWJhbGwubmV0L3Byb2plY3RzL21hcmtkb3duL3N5bnRheCNiYWNrc2xhc2hcbiAgICB9XG4gICAgTWFya2VkU3RyaW5nLmZyb21QbGFpblRleHQgPSBmcm9tUGxhaW5UZXh0O1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBjb25mb3JtcyB0byB0aGUge0BsaW5rIE1hcmtlZFN0cmluZ30gdHlwZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLnN0cmluZyhjYW5kaWRhdGUpIHx8IChJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5sYW5ndWFnZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS52YWx1ZSkpO1xuICAgIH1cbiAgICBNYXJrZWRTdHJpbmcuaXMgPSBpcztcbn0pKE1hcmtlZFN0cmluZyB8fCAoTWFya2VkU3RyaW5nID0ge30pKTtcbmV4cG9ydCB2YXIgSG92ZXI7XG4oZnVuY3Rpb24gKEhvdmVyKSB7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgSG92ZXJ9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiAhIWNhbmRpZGF0ZSAmJiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgKE1hcmt1cENvbnRlbnQuaXMoY2FuZGlkYXRlLmNvbnRlbnRzKSB8fFxuICAgICAgICAgICAgTWFya2VkU3RyaW5nLmlzKGNhbmRpZGF0ZS5jb250ZW50cykgfHxcbiAgICAgICAgICAgIElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLmNvbnRlbnRzLCBNYXJrZWRTdHJpbmcuaXMpKSAmJiAodmFsdWUucmFuZ2UgPT09IHVuZGVmaW5lZCB8fCBSYW5nZS5pcyh2YWx1ZS5yYW5nZSkpO1xuICAgIH1cbiAgICBIb3Zlci5pcyA9IGlzO1xufSkoSG92ZXIgfHwgKEhvdmVyID0ge30pKTtcbi8qKlxuICogVGhlIFBhcmFtZXRlckluZm9ybWF0aW9uIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIFBhcmFtZXRlckluZm9ybWF0aW9ufSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBQYXJhbWV0ZXJJbmZvcm1hdGlvbjtcbihmdW5jdGlvbiAoUGFyYW1ldGVySW5mb3JtYXRpb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHBhcmFtZXRlciBpbmZvcm1hdGlvbiBsaXRlcmFsLlxuICAgICAqXG4gICAgICogQHBhcmFtIGxhYmVsIEEgbGFiZWwgc3RyaW5nLlxuICAgICAqIEBwYXJhbSBkb2N1bWVudGF0aW9uIEEgZG9jIHN0cmluZy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobGFiZWwsIGRvY3VtZW50YXRpb24pIHtcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50YXRpb24gPyB7IGxhYmVsLCBkb2N1bWVudGF0aW9uIH0gOiB7IGxhYmVsIH07XG4gICAgfVxuICAgIFBhcmFtZXRlckluZm9ybWF0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKFBhcmFtZXRlckluZm9ybWF0aW9uIHx8IChQYXJhbWV0ZXJJbmZvcm1hdGlvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBTaWduYXR1cmVJbmZvcm1hdGlvbiBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBTaWduYXR1cmVJbmZvcm1hdGlvbn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgU2lnbmF0dXJlSW5mb3JtYXRpb247XG4oZnVuY3Rpb24gKFNpZ25hdHVyZUluZm9ybWF0aW9uKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKGxhYmVsLCBkb2N1bWVudGF0aW9uLCAuLi5wYXJhbWV0ZXJzKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IGxhYmVsIH07XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKGRvY3VtZW50YXRpb24pKSB7XG4gICAgICAgICAgICByZXN1bHQuZG9jdW1lbnRhdGlvbiA9IGRvY3VtZW50YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzLmRlZmluZWQocGFyYW1ldGVycykpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wYXJhbWV0ZXJzID0gcGFyYW1ldGVycztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdC5wYXJhbWV0ZXJzID0gW107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgU2lnbmF0dXJlSW5mb3JtYXRpb24uY3JlYXRlID0gY3JlYXRlO1xufSkoU2lnbmF0dXJlSW5mb3JtYXRpb24gfHwgKFNpZ25hdHVyZUluZm9ybWF0aW9uID0ge30pKTtcbi8qKlxuICogQSBkb2N1bWVudCBoaWdobGlnaHQga2luZC5cbiAqL1xuZXhwb3J0IHZhciBEb2N1bWVudEhpZ2hsaWdodEtpbmQ7XG4oZnVuY3Rpb24gKERvY3VtZW50SGlnaGxpZ2h0S2luZCkge1xuICAgIC8qKlxuICAgICAqIEEgdGV4dHVhbCBvY2N1cnJlbmNlLlxuICAgICAqL1xuICAgIERvY3VtZW50SGlnaGxpZ2h0S2luZC5UZXh0ID0gMTtcbiAgICAvKipcbiAgICAgKiBSZWFkLWFjY2VzcyBvZiBhIHN5bWJvbCwgbGlrZSByZWFkaW5nIGEgdmFyaWFibGUuXG4gICAgICovXG4gICAgRG9jdW1lbnRIaWdobGlnaHRLaW5kLlJlYWQgPSAyO1xuICAgIC8qKlxuICAgICAqIFdyaXRlLWFjY2VzcyBvZiBhIHN5bWJvbCwgbGlrZSB3cml0aW5nIHRvIGEgdmFyaWFibGUuXG4gICAgICovXG4gICAgRG9jdW1lbnRIaWdobGlnaHRLaW5kLldyaXRlID0gMztcbn0pKERvY3VtZW50SGlnaGxpZ2h0S2luZCB8fCAoRG9jdW1lbnRIaWdobGlnaHRLaW5kID0ge30pKTtcbi8qKlxuICogRG9jdW1lbnRIaWdobGlnaHQgbmFtZXNwYWNlIHRvIHByb3ZpZGUgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBEb2N1bWVudEhpZ2hsaWdodH0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgRG9jdW1lbnRIaWdobGlnaHQ7XG4oZnVuY3Rpb24gKERvY3VtZW50SGlnaGxpZ2h0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgRG9jdW1lbnRIaWdobGlnaHQgb2JqZWN0LlxuICAgICAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2UgdGhlIGhpZ2hsaWdodCBhcHBsaWVzIHRvLlxuICAgICAqIEBwYXJhbSBraW5kIFRoZSBoaWdobGlnaHQga2luZFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwga2luZCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0geyByYW5nZSB9O1xuICAgICAgICBpZiAoSXMubnVtYmVyKGtpbmQpKSB7XG4gICAgICAgICAgICByZXN1bHQua2luZCA9IGtpbmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgRG9jdW1lbnRIaWdobGlnaHQuY3JlYXRlID0gY3JlYXRlO1xufSkoRG9jdW1lbnRIaWdobGlnaHQgfHwgKERvY3VtZW50SGlnaGxpZ2h0ID0ge30pKTtcbi8qKlxuICogQSBzeW1ib2wga2luZC5cbiAqL1xuZXhwb3J0IHZhciBTeW1ib2xLaW5kO1xuKGZ1bmN0aW9uIChTeW1ib2xLaW5kKSB7XG4gICAgU3ltYm9sS2luZC5GaWxlID0gMTtcbiAgICBTeW1ib2xLaW5kLk1vZHVsZSA9IDI7XG4gICAgU3ltYm9sS2luZC5OYW1lc3BhY2UgPSAzO1xuICAgIFN5bWJvbEtpbmQuUGFja2FnZSA9IDQ7XG4gICAgU3ltYm9sS2luZC5DbGFzcyA9IDU7XG4gICAgU3ltYm9sS2luZC5NZXRob2QgPSA2O1xuICAgIFN5bWJvbEtpbmQuUHJvcGVydHkgPSA3O1xuICAgIFN5bWJvbEtpbmQuRmllbGQgPSA4O1xuICAgIFN5bWJvbEtpbmQuQ29uc3RydWN0b3IgPSA5O1xuICAgIFN5bWJvbEtpbmQuRW51bSA9IDEwO1xuICAgIFN5bWJvbEtpbmQuSW50ZXJmYWNlID0gMTE7XG4gICAgU3ltYm9sS2luZC5GdW5jdGlvbiA9IDEyO1xuICAgIFN5bWJvbEtpbmQuVmFyaWFibGUgPSAxMztcbiAgICBTeW1ib2xLaW5kLkNvbnN0YW50ID0gMTQ7XG4gICAgU3ltYm9sS2luZC5TdHJpbmcgPSAxNTtcbiAgICBTeW1ib2xLaW5kLk51bWJlciA9IDE2O1xuICAgIFN5bWJvbEtpbmQuQm9vbGVhbiA9IDE3O1xuICAgIFN5bWJvbEtpbmQuQXJyYXkgPSAxODtcbiAgICBTeW1ib2xLaW5kLk9iamVjdCA9IDE5O1xuICAgIFN5bWJvbEtpbmQuS2V5ID0gMjA7XG4gICAgU3ltYm9sS2luZC5OdWxsID0gMjE7XG4gICAgU3ltYm9sS2luZC5FbnVtTWVtYmVyID0gMjI7XG4gICAgU3ltYm9sS2luZC5TdHJ1Y3QgPSAyMztcbiAgICBTeW1ib2xLaW5kLkV2ZW50ID0gMjQ7XG4gICAgU3ltYm9sS2luZC5PcGVyYXRvciA9IDI1O1xuICAgIFN5bWJvbEtpbmQuVHlwZVBhcmFtZXRlciA9IDI2O1xufSkoU3ltYm9sS2luZCB8fCAoU3ltYm9sS2luZCA9IHt9KSk7XG4vKipcbiAqIFN5bWJvbCB0YWdzIGFyZSBleHRyYSBhbm5vdGF0aW9ucyB0aGF0IHR3ZWFrIHRoZSByZW5kZXJpbmcgb2YgYSBzeW1ib2wuXG4gKlxuICogQHNpbmNlIDMuMTZcbiAqL1xuZXhwb3J0IHZhciBTeW1ib2xUYWc7XG4oZnVuY3Rpb24gKFN5bWJvbFRhZykge1xuICAgIC8qKlxuICAgICAqIFJlbmRlciBhIHN5bWJvbCBhcyBvYnNvbGV0ZSwgdXN1YWxseSB1c2luZyBhIHN0cmlrZS1vdXQuXG4gICAgICovXG4gICAgU3ltYm9sVGFnLkRlcHJlY2F0ZWQgPSAxO1xufSkoU3ltYm9sVGFnIHx8IChTeW1ib2xUYWcgPSB7fSkpO1xuZXhwb3J0IHZhciBTeW1ib2xJbmZvcm1hdGlvbjtcbihmdW5jdGlvbiAoU3ltYm9sSW5mb3JtYXRpb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHN5bWJvbCBpbmZvcm1hdGlvbiBsaXRlcmFsLlxuICAgICAqXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0ga2luZCBUaGUga2luZCBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2Ugb2YgdGhlIGxvY2F0aW9uIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgcmVzb3VyY2Ugb2YgdGhlIGxvY2F0aW9uIG9mIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gY29udGFpbmVyTmFtZSBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sIGNvbnRhaW5pbmcgdGhlIHN5bWJvbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobmFtZSwga2luZCwgcmFuZ2UsIHVyaSwgY29udGFpbmVyTmFtZSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGtpbmQsXG4gICAgICAgICAgICBsb2NhdGlvbjogeyB1cmksIHJhbmdlIH1cbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGNvbnRhaW5lck5hbWUpIHtcbiAgICAgICAgICAgIHJlc3VsdC5jb250YWluZXJOYW1lID0gY29udGFpbmVyTmFtZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBTeW1ib2xJbmZvcm1hdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG59KShTeW1ib2xJbmZvcm1hdGlvbiB8fCAoU3ltYm9sSW5mb3JtYXRpb24gPSB7fSkpO1xuZXhwb3J0IHZhciBXb3Jrc3BhY2VTeW1ib2w7XG4oZnVuY3Rpb24gKFdvcmtzcGFjZVN5bWJvbCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyB3b3Jrc3BhY2Ugc3ltYm9sLlxuICAgICAqXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0ga2luZCBUaGUga2luZCBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIHJlc291cmNlIG9mIHRoZSBsb2NhdGlvbiBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSByYW5nZSBBbiBvcHRpb25zIHJhbmdlIG9mIHRoZSBsb2NhdGlvbi5cbiAgICAgKiBAcmV0dXJucyBBIFdvcmtzcGFjZVN5bWJvbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobmFtZSwga2luZCwgdXJpLCByYW5nZSkge1xuICAgICAgICByZXR1cm4gcmFuZ2UgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyB7IG5hbWUsIGtpbmQsIGxvY2F0aW9uOiB7IHVyaSwgcmFuZ2UgfSB9XG4gICAgICAgICAgICA6IHsgbmFtZSwga2luZCwgbG9jYXRpb246IHsgdXJpIH0gfTtcbiAgICB9XG4gICAgV29ya3NwYWNlU3ltYm9sLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKFdvcmtzcGFjZVN5bWJvbCB8fCAoV29ya3NwYWNlU3ltYm9sID0ge30pKTtcbmV4cG9ydCB2YXIgRG9jdW1lbnRTeW1ib2w7XG4oZnVuY3Rpb24gKERvY3VtZW50U3ltYm9sKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBzeW1ib2wgaW5mb3JtYXRpb24gbGl0ZXJhbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIGRldGFpbCBUaGUgZGV0YWlsIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIGtpbmQgVGhlIGtpbmQgb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIHNlbGVjdGlvblJhbmdlIFRoZSBzZWxlY3Rpb25SYW5nZSBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSBjaGlsZHJlbiBDaGlsZHJlbiBvZiB0aGUgc3ltYm9sLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShuYW1lLCBkZXRhaWwsIGtpbmQsIHJhbmdlLCBzZWxlY3Rpb25SYW5nZSwgY2hpbGRyZW4pIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBkZXRhaWwsXG4gICAgICAgICAgICBraW5kLFxuICAgICAgICAgICAgcmFuZ2UsXG4gICAgICAgICAgICBzZWxlY3Rpb25SYW5nZVxuICAgICAgICB9O1xuICAgICAgICBpZiAoY2hpbGRyZW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmNoaWxkcmVuID0gY2hpbGRyZW47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgRG9jdW1lbnRTeW1ib2wuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgRG9jdW1lbnRTeW1ib2x9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiZcbiAgICAgICAgICAgIElzLnN0cmluZyhjYW5kaWRhdGUubmFtZSkgJiYgSXMubnVtYmVyKGNhbmRpZGF0ZS5raW5kKSAmJlxuICAgICAgICAgICAgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUuc2VsZWN0aW9uUmFuZ2UpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmRldGFpbCA9PT0gdW5kZWZpbmVkIHx8IElzLnN0cmluZyhjYW5kaWRhdGUuZGV0YWlsKSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuZGVwcmVjYXRlZCA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLmRlcHJlY2F0ZWQpKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5jaGlsZHJlbiA9PT0gdW5kZWZpbmVkIHx8IEFycmF5LmlzQXJyYXkoY2FuZGlkYXRlLmNoaWxkcmVuKSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUudGFncyA9PT0gdW5kZWZpbmVkIHx8IEFycmF5LmlzQXJyYXkoY2FuZGlkYXRlLnRhZ3MpKTtcbiAgICB9XG4gICAgRG9jdW1lbnRTeW1ib2wuaXMgPSBpcztcbn0pKERvY3VtZW50U3ltYm9sIHx8IChEb2N1bWVudFN5bWJvbCA9IHt9KSk7XG4vKipcbiAqIEEgc2V0IG9mIHByZWRlZmluZWQgY29kZSBhY3Rpb24ga2luZHNcbiAqL1xuZXhwb3J0IHZhciBDb2RlQWN0aW9uS2luZDtcbihmdW5jdGlvbiAoQ29kZUFjdGlvbktpbmQpIHtcbiAgICAvKipcbiAgICAgKiBFbXB0eSBraW5kLlxuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLkVtcHR5ID0gJyc7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciBxdWlja2ZpeCBhY3Rpb25zOiAncXVpY2tmaXgnXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuUXVpY2tGaXggPSAncXVpY2tmaXgnO1xuICAgIC8qKlxuICAgICAqIEJhc2Uga2luZCBmb3IgcmVmYWN0b3JpbmcgYWN0aW9uczogJ3JlZmFjdG9yJ1xuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlJlZmFjdG9yID0gJ3JlZmFjdG9yJztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIHJlZmFjdG9yaW5nIGV4dHJhY3Rpb24gYWN0aW9uczogJ3JlZmFjdG9yLmV4dHJhY3QnXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIGV4dHJhY3QgYWN0aW9uczpcbiAgICAgKlxuICAgICAqIC0gRXh0cmFjdCBtZXRob2RcbiAgICAgKiAtIEV4dHJhY3QgZnVuY3Rpb25cbiAgICAgKiAtIEV4dHJhY3QgdmFyaWFibGVcbiAgICAgKiAtIEV4dHJhY3QgaW50ZXJmYWNlIGZyb20gY2xhc3NcbiAgICAgKiAtIC4uLlxuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlJlZmFjdG9yRXh0cmFjdCA9ICdyZWZhY3Rvci5leHRyYWN0JztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIHJlZmFjdG9yaW5nIGlubGluZSBhY3Rpb25zOiAncmVmYWN0b3IuaW5saW5lJ1xuICAgICAqXG4gICAgICogRXhhbXBsZSBpbmxpbmUgYWN0aW9uczpcbiAgICAgKlxuICAgICAqIC0gSW5saW5lIGZ1bmN0aW9uXG4gICAgICogLSBJbmxpbmUgdmFyaWFibGVcbiAgICAgKiAtIElubGluZSBjb25zdGFudFxuICAgICAqIC0gLi4uXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuUmVmYWN0b3JJbmxpbmUgPSAncmVmYWN0b3IuaW5saW5lJztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIHJlZmFjdG9yaW5nIHJld3JpdGUgYWN0aW9uczogJ3JlZmFjdG9yLnJld3JpdGUnXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIHJld3JpdGUgYWN0aW9uczpcbiAgICAgKlxuICAgICAqIC0gQ29udmVydCBKYXZhU2NyaXB0IGZ1bmN0aW9uIHRvIGNsYXNzXG4gICAgICogLSBBZGQgb3IgcmVtb3ZlIHBhcmFtZXRlclxuICAgICAqIC0gRW5jYXBzdWxhdGUgZmllbGRcbiAgICAgKiAtIE1ha2UgbWV0aG9kIHN0YXRpY1xuICAgICAqIC0gTW92ZSBtZXRob2QgdG8gYmFzZSBjbGFzc1xuICAgICAqIC0gLi4uXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuUmVmYWN0b3JSZXdyaXRlID0gJ3JlZmFjdG9yLnJld3JpdGUnO1xuICAgIC8qKlxuICAgICAqIEJhc2Uga2luZCBmb3Igc291cmNlIGFjdGlvbnM6IGBzb3VyY2VgXG4gICAgICpcbiAgICAgKiBTb3VyY2UgY29kZSBhY3Rpb25zIGFwcGx5IHRvIHRoZSBlbnRpcmUgZmlsZS5cbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5Tb3VyY2UgPSAnc291cmNlJztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIGFuIG9yZ2FuaXplIGltcG9ydHMgc291cmNlIGFjdGlvbjogYHNvdXJjZS5vcmdhbml6ZUltcG9ydHNgXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuU291cmNlT3JnYW5pemVJbXBvcnRzID0gJ3NvdXJjZS5vcmdhbml6ZUltcG9ydHMnO1xuICAgIC8qKlxuICAgICAqIEJhc2Uga2luZCBmb3IgYXV0by1maXggc291cmNlIGFjdGlvbnM6IGBzb3VyY2UuZml4QWxsYC5cbiAgICAgKlxuICAgICAqIEZpeCBhbGwgYWN0aW9ucyBhdXRvbWF0aWNhbGx5IGZpeCBlcnJvcnMgdGhhdCBoYXZlIGEgY2xlYXIgZml4IHRoYXQgZG8gbm90IHJlcXVpcmUgdXNlciBpbnB1dC5cbiAgICAgKiBUaGV5IHNob3VsZCBub3Qgc3VwcHJlc3MgZXJyb3JzIG9yIHBlcmZvcm0gdW5zYWZlIGZpeGVzIHN1Y2ggYXMgZ2VuZXJhdGluZyBuZXcgdHlwZXMgb3IgY2xhc3Nlcy5cbiAgICAgKlxuICAgICAqIEBzaW5jZSAzLjE1LjBcbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5Tb3VyY2VGaXhBbGwgPSAnc291cmNlLmZpeEFsbCc7XG59KShDb2RlQWN0aW9uS2luZCB8fCAoQ29kZUFjdGlvbktpbmQgPSB7fSkpO1xuLyoqXG4gKiBUaGUgcmVhc29uIHdoeSBjb2RlIGFjdGlvbnMgd2VyZSByZXF1ZXN0ZWQuXG4gKlxuICogQHNpbmNlIDMuMTcuMFxuICovXG5leHBvcnQgdmFyIENvZGVBY3Rpb25UcmlnZ2VyS2luZDtcbihmdW5jdGlvbiAoQ29kZUFjdGlvblRyaWdnZXJLaW5kKSB7XG4gICAgLyoqXG4gICAgICogQ29kZSBhY3Rpb25zIHdlcmUgZXhwbGljaXRseSByZXF1ZXN0ZWQgYnkgdGhlIHVzZXIgb3IgYnkgYW4gZXh0ZW5zaW9uLlxuICAgICAqL1xuICAgIENvZGVBY3Rpb25UcmlnZ2VyS2luZC5JbnZva2VkID0gMTtcbiAgICAvKipcbiAgICAgKiBDb2RlIGFjdGlvbnMgd2VyZSByZXF1ZXN0ZWQgYXV0b21hdGljYWxseS5cbiAgICAgKlxuICAgICAqIFRoaXMgdHlwaWNhbGx5IGhhcHBlbnMgd2hlbiBjdXJyZW50IHNlbGVjdGlvbiBpbiBhIGZpbGUgY2hhbmdlcywgYnV0IGNhblxuICAgICAqIGFsc28gYmUgdHJpZ2dlcmVkIHdoZW4gZmlsZSBjb250ZW50IGNoYW5nZXMuXG4gICAgICovXG4gICAgQ29kZUFjdGlvblRyaWdnZXJLaW5kLkF1dG9tYXRpYyA9IDI7XG59KShDb2RlQWN0aW9uVHJpZ2dlcktpbmQgfHwgKENvZGVBY3Rpb25UcmlnZ2VyS2luZCA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb2RlQWN0aW9uQ29udGV4dCBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBDb2RlQWN0aW9uQ29udGV4dH0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgQ29kZUFjdGlvbkNvbnRleHQ7XG4oZnVuY3Rpb24gKENvZGVBY3Rpb25Db250ZXh0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDb2RlQWN0aW9uQ29udGV4dCBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShkaWFnbm9zdGljcywgb25seSwgdHJpZ2dlcktpbmQpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHsgZGlhZ25vc3RpY3MgfTtcbiAgICAgICAgaWYgKG9ubHkgIT09IHVuZGVmaW5lZCAmJiBvbmx5ICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXN1bHQub25seSA9IG9ubHk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyaWdnZXJLaW5kICE9PSB1bmRlZmluZWQgJiYgdHJpZ2dlcktpbmQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJlc3VsdC50cmlnZ2VyS2luZCA9IHRyaWdnZXJLaW5kO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIENvZGVBY3Rpb25Db250ZXh0LmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIENvZGVBY3Rpb25Db250ZXh0fSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLmRpYWdub3N0aWNzLCBEaWFnbm9zdGljLmlzKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS5vbmx5ID09PSB1bmRlZmluZWQgfHwgSXMudHlwZWRBcnJheShjYW5kaWRhdGUub25seSwgSXMuc3RyaW5nKSlcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUudHJpZ2dlcktpbmQgPT09IHVuZGVmaW5lZCB8fCBjYW5kaWRhdGUudHJpZ2dlcktpbmQgPT09IENvZGVBY3Rpb25UcmlnZ2VyS2luZC5JbnZva2VkIHx8IGNhbmRpZGF0ZS50cmlnZ2VyS2luZCA9PT0gQ29kZUFjdGlvblRyaWdnZXJLaW5kLkF1dG9tYXRpYyk7XG4gICAgfVxuICAgIENvZGVBY3Rpb25Db250ZXh0LmlzID0gaXM7XG59KShDb2RlQWN0aW9uQ29udGV4dCB8fCAoQ29kZUFjdGlvbkNvbnRleHQgPSB7fSkpO1xuZXhwb3J0IHZhciBDb2RlQWN0aW9uO1xuKGZ1bmN0aW9uIChDb2RlQWN0aW9uKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKHRpdGxlLCBraW5kT3JDb21tYW5kT3JFZGl0LCBraW5kKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IHRpdGxlIH07XG4gICAgICAgIGxldCBjaGVja0tpbmQgPSB0cnVlO1xuICAgICAgICBpZiAodHlwZW9mIGtpbmRPckNvbW1hbmRPckVkaXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjaGVja0tpbmQgPSBmYWxzZTtcbiAgICAgICAgICAgIHJlc3VsdC5raW5kID0ga2luZE9yQ29tbWFuZE9yRWRpdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChDb21tYW5kLmlzKGtpbmRPckNvbW1hbmRPckVkaXQpKSB7XG4gICAgICAgICAgICByZXN1bHQuY29tbWFuZCA9IGtpbmRPckNvbW1hbmRPckVkaXQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQuZWRpdCA9IGtpbmRPckNvbW1hbmRPckVkaXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoZWNrS2luZCAmJiBraW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5raW5kID0ga2luZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBDb2RlQWN0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS50aXRsZSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuZGlhZ25vc3RpY3MgPT09IHVuZGVmaW5lZCB8fCBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS5kaWFnbm9zdGljcywgRGlhZ25vc3RpYy5pcykpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmtpbmQgPT09IHVuZGVmaW5lZCB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLmtpbmQpKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5lZGl0ICE9PSB1bmRlZmluZWQgfHwgY2FuZGlkYXRlLmNvbW1hbmQgIT09IHVuZGVmaW5lZCkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuY29tbWFuZCA9PT0gdW5kZWZpbmVkIHx8IENvbW1hbmQuaXMoY2FuZGlkYXRlLmNvbW1hbmQpKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5pc1ByZWZlcnJlZCA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLmlzUHJlZmVycmVkKSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuZWRpdCA9PT0gdW5kZWZpbmVkIHx8IFdvcmtzcGFjZUVkaXQuaXMoY2FuZGlkYXRlLmVkaXQpKTtcbiAgICB9XG4gICAgQ29kZUFjdGlvbi5pcyA9IGlzO1xufSkoQ29kZUFjdGlvbiB8fCAoQ29kZUFjdGlvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb2RlTGVucyBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBDb2RlTGVuc30gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgQ29kZUxlbnM7XG4oZnVuY3Rpb24gKENvZGVMZW5zKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDb2RlTGVucyBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgZGF0YSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0geyByYW5nZSB9O1xuICAgICAgICBpZiAoSXMuZGVmaW5lZChkYXRhKSkge1xuICAgICAgICAgICAgcmVzdWx0LmRhdGEgPSBkYXRhO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIENvZGVMZW5zLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIENvZGVMZW5zfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUuY29tbWFuZCkgfHwgQ29tbWFuZC5pcyhjYW5kaWRhdGUuY29tbWFuZCkpO1xuICAgIH1cbiAgICBDb2RlTGVucy5pcyA9IGlzO1xufSkoQ29kZUxlbnMgfHwgKENvZGVMZW5zID0ge30pKTtcbi8qKlxuICogVGhlIEZvcm1hdHRpbmdPcHRpb25zIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIEZvcm1hdHRpbmdPcHRpb25zfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBGb3JtYXR0aW5nT3B0aW9ucztcbihmdW5jdGlvbiAoRm9ybWF0dGluZ09wdGlvbnMpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IEZvcm1hdHRpbmdPcHRpb25zIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHRhYlNpemUsIGluc2VydFNwYWNlcykge1xuICAgICAgICByZXR1cm4geyB0YWJTaXplLCBpbnNlcnRTcGFjZXMgfTtcbiAgICB9XG4gICAgRm9ybWF0dGluZ09wdGlvbnMuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgRm9ybWF0dGluZ09wdGlvbnN9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMudWludGVnZXIoY2FuZGlkYXRlLnRhYlNpemUpICYmIElzLmJvb2xlYW4oY2FuZGlkYXRlLmluc2VydFNwYWNlcyk7XG4gICAgfVxuICAgIEZvcm1hdHRpbmdPcHRpb25zLmlzID0gaXM7XG59KShGb3JtYXR0aW5nT3B0aW9ucyB8fCAoRm9ybWF0dGluZ09wdGlvbnMgPSB7fSkpO1xuLyoqXG4gKiBUaGUgRG9jdW1lbnRMaW5rIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIERvY3VtZW50TGlua30gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgRG9jdW1lbnRMaW5rO1xuKGZ1bmN0aW9uIChEb2N1bWVudExpbmspIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IERvY3VtZW50TGluayBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgdGFyZ2V0LCBkYXRhKSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCB0YXJnZXQsIGRhdGEgfTtcbiAgICB9XG4gICAgRG9jdW1lbnRMaW5rLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIERvY3VtZW50TGlua30gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLnRhcmdldCkgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS50YXJnZXQpKTtcbiAgICB9XG4gICAgRG9jdW1lbnRMaW5rLmlzID0gaXM7XG59KShEb2N1bWVudExpbmsgfHwgKERvY3VtZW50TGluayA9IHt9KSk7XG4vKipcbiAqIFRoZSBTZWxlY3Rpb25SYW5nZSBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9uIHRvIHdvcmsgd2l0aFxuICogU2VsZWN0aW9uUmFuZ2UgbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgU2VsZWN0aW9uUmFuZ2U7XG4oZnVuY3Rpb24gKFNlbGVjdGlvblJhbmdlKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBTZWxlY3Rpb25SYW5nZVxuICAgICAqIEBwYXJhbSByYW5nZSB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHBhcmVudCBhbiBvcHRpb25hbCBwYXJlbnQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCBwYXJlbnQpIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIHBhcmVudCB9O1xuICAgIH1cbiAgICBTZWxlY3Rpb25SYW5nZS5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgKGNhbmRpZGF0ZS5wYXJlbnQgPT09IHVuZGVmaW5lZCB8fCBTZWxlY3Rpb25SYW5nZS5pcyhjYW5kaWRhdGUucGFyZW50KSk7XG4gICAgfVxuICAgIFNlbGVjdGlvblJhbmdlLmlzID0gaXM7XG59KShTZWxlY3Rpb25SYW5nZSB8fCAoU2VsZWN0aW9uUmFuZ2UgPSB7fSkpO1xuLyoqXG4gKiBBIHNldCBvZiBwcmVkZWZpbmVkIHRva2VuIHR5cGVzLiBUaGlzIHNldCBpcyBub3QgZml4ZWRcbiAqIGFuIGNsaWVudHMgY2FuIHNwZWNpZnkgYWRkaXRpb25hbCB0b2tlbiB0eXBlcyB2aWEgdGhlXG4gKiBjb3JyZXNwb25kaW5nIGNsaWVudCBjYXBhYmlsaXRpZXMuXG4gKlxuICogQHNpbmNlIDMuMTYuMFxuICovXG5leHBvcnQgdmFyIFNlbWFudGljVG9rZW5UeXBlcztcbihmdW5jdGlvbiAoU2VtYW50aWNUb2tlblR5cGVzKSB7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wibmFtZXNwYWNlXCJdID0gXCJuYW1lc3BhY2VcIjtcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgZ2VuZXJpYyB0eXBlLiBBY3RzIGFzIGEgZmFsbGJhY2sgZm9yIHR5cGVzIHdoaWNoIGNhbid0IGJlIG1hcHBlZCB0b1xuICAgICAqIGEgc3BlY2lmaWMgdHlwZSBsaWtlIGNsYXNzIG9yIGVudW0uXG4gICAgICovXG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1widHlwZVwiXSA9IFwidHlwZVwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImNsYXNzXCJdID0gXCJjbGFzc1wiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImVudW1cIl0gPSBcImVudW1cIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJpbnRlcmZhY2VcIl0gPSBcImludGVyZmFjZVwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInN0cnVjdFwiXSA9IFwic3RydWN0XCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1widHlwZVBhcmFtZXRlclwiXSA9IFwidHlwZVBhcmFtZXRlclwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInBhcmFtZXRlclwiXSA9IFwicGFyYW1ldGVyXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1widmFyaWFibGVcIl0gPSBcInZhcmlhYmxlXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wicHJvcGVydHlcIl0gPSBcInByb3BlcnR5XCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wiZW51bU1lbWJlclwiXSA9IFwiZW51bU1lbWJlclwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImV2ZW50XCJdID0gXCJldmVudFwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImZ1bmN0aW9uXCJdID0gXCJmdW5jdGlvblwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcIm1ldGhvZFwiXSA9IFwibWV0aG9kXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wibWFjcm9cIl0gPSBcIm1hY3JvXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wia2V5d29yZFwiXSA9IFwia2V5d29yZFwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcIm1vZGlmaWVyXCJdID0gXCJtb2RpZmllclwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImNvbW1lbnRcIl0gPSBcImNvbW1lbnRcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJzdHJpbmdcIl0gPSBcInN0cmluZ1wiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcIm51bWJlclwiXSA9IFwibnVtYmVyXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wicmVnZXhwXCJdID0gXCJyZWdleHBcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJvcGVyYXRvclwiXSA9IFwib3BlcmF0b3JcIjtcbiAgICAvKipcbiAgICAgKiBAc2luY2UgMy4xNy4wXG4gICAgICovXG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wiZGVjb3JhdG9yXCJdID0gXCJkZWNvcmF0b3JcIjtcbn0pKFNlbWFudGljVG9rZW5UeXBlcyB8fCAoU2VtYW50aWNUb2tlblR5cGVzID0ge30pKTtcbi8qKlxuICogQSBzZXQgb2YgcHJlZGVmaW5lZCB0b2tlbiBtb2RpZmllcnMuIFRoaXMgc2V0IGlzIG5vdCBmaXhlZFxuICogYW4gY2xpZW50cyBjYW4gc3BlY2lmeSBhZGRpdGlvbmFsIHRva2VuIHR5cGVzIHZpYSB0aGVcbiAqIGNvcnJlc3BvbmRpbmcgY2xpZW50IGNhcGFiaWxpdGllcy5cbiAqXG4gKiBAc2luY2UgMy4xNi4wXG4gKi9cbmV4cG9ydCB2YXIgU2VtYW50aWNUb2tlbk1vZGlmaWVycztcbihmdW5jdGlvbiAoU2VtYW50aWNUb2tlbk1vZGlmaWVycykge1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJkZWNsYXJhdGlvblwiXSA9IFwiZGVjbGFyYXRpb25cIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wiZGVmaW5pdGlvblwiXSA9IFwiZGVmaW5pdGlvblwiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJyZWFkb25seVwiXSA9IFwicmVhZG9ubHlcIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wic3RhdGljXCJdID0gXCJzdGF0aWNcIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wiZGVwcmVjYXRlZFwiXSA9IFwiZGVwcmVjYXRlZFwiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJhYnN0cmFjdFwiXSA9IFwiYWJzdHJhY3RcIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wiYXN5bmNcIl0gPSBcImFzeW5jXCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcIm1vZGlmaWNhdGlvblwiXSA9IFwibW9kaWZpY2F0aW9uXCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcImRvY3VtZW50YXRpb25cIl0gPSBcImRvY3VtZW50YXRpb25cIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wiZGVmYXVsdExpYnJhcnlcIl0gPSBcImRlZmF1bHRMaWJyYXJ5XCI7XG59KShTZW1hbnRpY1Rva2VuTW9kaWZpZXJzIHx8IChTZW1hbnRpY1Rva2VuTW9kaWZpZXJzID0ge30pKTtcbi8qKlxuICogQHNpbmNlIDMuMTYuMFxuICovXG5leHBvcnQgdmFyIFNlbWFudGljVG9rZW5zO1xuKGZ1bmN0aW9uIChTZW1hbnRpY1Rva2Vucykge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIChjYW5kaWRhdGUucmVzdWx0SWQgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgY2FuZGlkYXRlLnJlc3VsdElkID09PSAnc3RyaW5nJykgJiZcbiAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoY2FuZGlkYXRlLmRhdGEpICYmIChjYW5kaWRhdGUuZGF0YS5sZW5ndGggPT09IDAgfHwgdHlwZW9mIGNhbmRpZGF0ZS5kYXRhWzBdID09PSAnbnVtYmVyJyk7XG4gICAgfVxuICAgIFNlbWFudGljVG9rZW5zLmlzID0gaXM7XG59KShTZW1hbnRpY1Rva2VucyB8fCAoU2VtYW50aWNUb2tlbnMgPSB7fSkpO1xuLyoqXG4gKiBUaGUgSW5saW5lVmFsdWVUZXh0IG5hbWVzcGFjZSBwcm92aWRlcyBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIElubGluZVZhbHVlVGV4dHMuXG4gKlxuICogQHNpbmNlIDMuMTcuMFxuICovXG5leHBvcnQgdmFyIElubGluZVZhbHVlVGV4dDtcbihmdW5jdGlvbiAoSW5saW5lVmFsdWVUZXh0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBJbmxpbmVWYWx1ZVRleHQgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIHRleHQpIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIHRleHQgfTtcbiAgICB9XG4gICAgSW5saW5lVmFsdWVUZXh0LmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAhPT0gdW5kZWZpbmVkICYmIGNhbmRpZGF0ZSAhPT0gbnVsbCAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudGV4dCk7XG4gICAgfVxuICAgIElubGluZVZhbHVlVGV4dC5pcyA9IGlzO1xufSkoSW5saW5lVmFsdWVUZXh0IHx8IChJbmxpbmVWYWx1ZVRleHQgPSB7fSkpO1xuLyoqXG4gKiBUaGUgSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cCBuYW1lc3BhY2UgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCBJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3Vwcy5cbiAqXG4gKiBAc2luY2UgMy4xNy4wXG4gKi9cbmV4cG9ydCB2YXIgSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cDtcbihmdW5jdGlvbiAoSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgSW5saW5lVmFsdWVUZXh0IGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCB2YXJpYWJsZU5hbWUsIGNhc2VTZW5zaXRpdmVMb29rdXApIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIHZhcmlhYmxlTmFtZSwgY2FzZVNlbnNpdGl2ZUxvb2t1cCB9O1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAhPT0gdW5kZWZpbmVkICYmIGNhbmRpZGF0ZSAhPT0gbnVsbCAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIElzLmJvb2xlYW4oY2FuZGlkYXRlLmNhc2VTZW5zaXRpdmVMb29rdXApXG4gICAgICAgICAgICAmJiAoSXMuc3RyaW5nKGNhbmRpZGF0ZS52YXJpYWJsZU5hbWUpIHx8IGNhbmRpZGF0ZS52YXJpYWJsZU5hbWUgPT09IHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIElubGluZVZhbHVlVmFyaWFibGVMb29rdXAuaXMgPSBpcztcbn0pKElubGluZVZhbHVlVmFyaWFibGVMb29rdXAgfHwgKElubGluZVZhbHVlVmFyaWFibGVMb29rdXAgPSB7fSkpO1xuLyoqXG4gKiBUaGUgSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24gbmFtZXNwYWNlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGggSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24uXG4gKlxuICogQHNpbmNlIDMuMTcuMFxuICovXG5leHBvcnQgdmFyIElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uO1xuKGZ1bmN0aW9uIChJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24gbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIGV4cHJlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIGV4cHJlc3Npb24gfTtcbiAgICB9XG4gICAgSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24uY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICE9PSB1bmRlZmluZWQgJiYgY2FuZGlkYXRlICE9PSBudWxsICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSlcbiAgICAgICAgICAgICYmIChJcy5zdHJpbmcoY2FuZGlkYXRlLmV4cHJlc3Npb24pIHx8IGNhbmRpZGF0ZS5leHByZXNzaW9uID09PSB1bmRlZmluZWQpO1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbi5pcyA9IGlzO1xufSkoSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24gfHwgKElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uID0ge30pKTtcbi8qKlxuICogVGhlIElubGluZVZhbHVlQ29udGV4dCBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBJbmxpbmVWYWx1ZUNvbnRleHR9IGxpdGVyYWxzLlxuICpcbiAqIEBzaW5jZSAzLjE3LjBcbiAqL1xuZXhwb3J0IHZhciBJbmxpbmVWYWx1ZUNvbnRleHQ7XG4oZnVuY3Rpb24gKElubGluZVZhbHVlQ29udGV4dCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgSW5saW5lVmFsdWVDb250ZXh0IGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGZyYW1lSWQsIHN0b3BwZWRMb2NhdGlvbikge1xuICAgICAgICByZXR1cm4geyBmcmFtZUlkLCBzdG9wcGVkTG9jYXRpb24gfTtcbiAgICB9XG4gICAgSW5saW5lVmFsdWVDb250ZXh0LmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIElubGluZVZhbHVlQ29udGV4dH0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIFJhbmdlLmlzKHZhbHVlLnN0b3BwZWRMb2NhdGlvbik7XG4gICAgfVxuICAgIElubGluZVZhbHVlQ29udGV4dC5pcyA9IGlzO1xufSkoSW5saW5lVmFsdWVDb250ZXh0IHx8IChJbmxpbmVWYWx1ZUNvbnRleHQgPSB7fSkpO1xuLyoqXG4gKiBJbmxheSBoaW50IGtpbmRzLlxuICpcbiAqIEBzaW5jZSAzLjE3LjBcbiAqL1xuZXhwb3J0IHZhciBJbmxheUhpbnRLaW5kO1xuKGZ1bmN0aW9uIChJbmxheUhpbnRLaW5kKSB7XG4gICAgLyoqXG4gICAgICogQW4gaW5sYXkgaGludCB0aGF0IGZvciBhIHR5cGUgYW5ub3RhdGlvbi5cbiAgICAgKi9cbiAgICBJbmxheUhpbnRLaW5kLlR5cGUgPSAxO1xuICAgIC8qKlxuICAgICAqIEFuIGlubGF5IGhpbnQgdGhhdCBpcyBmb3IgYSBwYXJhbWV0ZXIuXG4gICAgICovXG4gICAgSW5sYXlIaW50S2luZC5QYXJhbWV0ZXIgPSAyO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gMSB8fCB2YWx1ZSA9PT0gMjtcbiAgICB9XG4gICAgSW5sYXlIaW50S2luZC5pcyA9IGlzO1xufSkoSW5sYXlIaW50S2luZCB8fCAoSW5sYXlIaW50S2luZCA9IHt9KSk7XG5leHBvcnQgdmFyIElubGF5SGludExhYmVsUGFydDtcbihmdW5jdGlvbiAoSW5sYXlIaW50TGFiZWxQYXJ0KSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB7IHZhbHVlIH07XG4gICAgfVxuICAgIElubGF5SGludExhYmVsUGFydC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSlcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUudG9vbHRpcCA9PT0gdW5kZWZpbmVkIHx8IElzLnN0cmluZyhjYW5kaWRhdGUudG9vbHRpcCkgfHwgTWFya3VwQ29udGVudC5pcyhjYW5kaWRhdGUudG9vbHRpcCkpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLmxvY2F0aW9uID09PSB1bmRlZmluZWQgfHwgTG9jYXRpb24uaXMoY2FuZGlkYXRlLmxvY2F0aW9uKSlcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUuY29tbWFuZCA9PT0gdW5kZWZpbmVkIHx8IENvbW1hbmQuaXMoY2FuZGlkYXRlLmNvbW1hbmQpKTtcbiAgICB9XG4gICAgSW5sYXlIaW50TGFiZWxQYXJ0LmlzID0gaXM7XG59KShJbmxheUhpbnRMYWJlbFBhcnQgfHwgKElubGF5SGludExhYmVsUGFydCA9IHt9KSk7XG5leHBvcnQgdmFyIElubGF5SGludDtcbihmdW5jdGlvbiAoSW5sYXlIaW50KSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKHBvc2l0aW9uLCBsYWJlbCwga2luZCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB7IHBvc2l0aW9uLCBsYWJlbCB9O1xuICAgICAgICBpZiAoa2luZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQua2luZCA9IGtpbmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgSW5sYXlIaW50LmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBQb3NpdGlvbi5pcyhjYW5kaWRhdGUucG9zaXRpb24pXG4gICAgICAgICAgICAmJiAoSXMuc3RyaW5nKGNhbmRpZGF0ZS5sYWJlbCkgfHwgSXMudHlwZWRBcnJheShjYW5kaWRhdGUubGFiZWwsIElubGF5SGludExhYmVsUGFydC5pcykpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLmtpbmQgPT09IHVuZGVmaW5lZCB8fCBJbmxheUhpbnRLaW5kLmlzKGNhbmRpZGF0ZS5raW5kKSlcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUudGV4dEVkaXRzID09PSB1bmRlZmluZWQpIHx8IElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLnRleHRFZGl0cywgVGV4dEVkaXQuaXMpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLnRvb2x0aXAgPT09IHVuZGVmaW5lZCB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLnRvb2x0aXApIHx8IE1hcmt1cENvbnRlbnQuaXMoY2FuZGlkYXRlLnRvb2x0aXApKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS5wYWRkaW5nTGVmdCA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLnBhZGRpbmdMZWZ0KSlcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUucGFkZGluZ1JpZ2h0ID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUucGFkZGluZ1JpZ2h0KSk7XG4gICAgfVxuICAgIElubGF5SGludC5pcyA9IGlzO1xufSkoSW5sYXlIaW50IHx8IChJbmxheUhpbnQgPSB7fSkpO1xuZXhwb3J0IHZhciBTdHJpbmdWYWx1ZTtcbihmdW5jdGlvbiAoU3RyaW5nVmFsdWUpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGVTbmlwcGV0KHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB7IGtpbmQ6ICdzbmlwcGV0JywgdmFsdWUgfTtcbiAgICB9XG4gICAgU3RyaW5nVmFsdWUuY3JlYXRlU25pcHBldCA9IGNyZWF0ZVNuaXBwZXQ7XG59KShTdHJpbmdWYWx1ZSB8fCAoU3RyaW5nVmFsdWUgPSB7fSkpO1xuZXhwb3J0IHZhciBJbmxpbmVDb21wbGV0aW9uSXRlbTtcbihmdW5jdGlvbiAoSW5saW5lQ29tcGxldGlvbkl0ZW0pIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUoaW5zZXJ0VGV4dCwgZmlsdGVyVGV4dCwgcmFuZ2UsIGNvbW1hbmQpIHtcbiAgICAgICAgcmV0dXJuIHsgaW5zZXJ0VGV4dCwgZmlsdGVyVGV4dCwgcmFuZ2UsIGNvbW1hbmQgfTtcbiAgICB9XG4gICAgSW5saW5lQ29tcGxldGlvbkl0ZW0uY3JlYXRlID0gY3JlYXRlO1xufSkoSW5saW5lQ29tcGxldGlvbkl0ZW0gfHwgKElubGluZUNvbXBsZXRpb25JdGVtID0ge30pKTtcbmV4cG9ydCB2YXIgSW5saW5lQ29tcGxldGlvbkxpc3Q7XG4oZnVuY3Rpb24gKElubGluZUNvbXBsZXRpb25MaXN0KSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKGl0ZW1zKSB7XG4gICAgICAgIHJldHVybiB7IGl0ZW1zIH07XG4gICAgfVxuICAgIElubGluZUNvbXBsZXRpb25MaXN0LmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKElubGluZUNvbXBsZXRpb25MaXN0IHx8IChJbmxpbmVDb21wbGV0aW9uTGlzdCA9IHt9KSk7XG4vKipcbiAqIERlc2NyaWJlcyBob3cgYW4ge0BsaW5rIElubGluZUNvbXBsZXRpb25JdGVtUHJvdmlkZXIgaW5saW5lIGNvbXBsZXRpb24gcHJvdmlkZXJ9IHdhcyB0cmlnZ2VyZWQuXG4gKlxuICogQHNpbmNlIDMuMTguMFxuICogQHByb3Bvc2VkXG4gKi9cbmV4cG9ydCB2YXIgSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kO1xuKGZ1bmN0aW9uIChJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmQpIHtcbiAgICAvKipcbiAgICAgKiBDb21wbGV0aW9uIHdhcyB0cmlnZ2VyZWQgZXhwbGljaXRseSBieSBhIHVzZXIgZ2VzdHVyZS5cbiAgICAgKi9cbiAgICBJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmQuSW52b2tlZCA9IDA7XG4gICAgLyoqXG4gICAgICogQ29tcGxldGlvbiB3YXMgdHJpZ2dlcmVkIGF1dG9tYXRpY2FsbHkgd2hpbGUgZWRpdGluZy5cbiAgICAgKi9cbiAgICBJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmQuQXV0b21hdGljID0gMTtcbn0pKElubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZCB8fCAoSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kID0ge30pKTtcbmV4cG9ydCB2YXIgU2VsZWN0ZWRDb21wbGV0aW9uSW5mbztcbihmdW5jdGlvbiAoU2VsZWN0ZWRDb21wbGV0aW9uSW5mbykge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgdGV4dCkge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgdGV4dCB9O1xuICAgIH1cbiAgICBTZWxlY3RlZENvbXBsZXRpb25JbmZvLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKFNlbGVjdGVkQ29tcGxldGlvbkluZm8gfHwgKFNlbGVjdGVkQ29tcGxldGlvbkluZm8gPSB7fSkpO1xuZXhwb3J0IHZhciBJbmxpbmVDb21wbGV0aW9uQ29udGV4dDtcbihmdW5jdGlvbiAoSW5saW5lQ29tcGxldGlvbkNvbnRleHQpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUodHJpZ2dlcktpbmQsIHNlbGVjdGVkQ29tcGxldGlvbkluZm8pIHtcbiAgICAgICAgcmV0dXJuIHsgdHJpZ2dlcktpbmQsIHNlbGVjdGVkQ29tcGxldGlvbkluZm8gfTtcbiAgICB9XG4gICAgSW5saW5lQ29tcGxldGlvbkNvbnRleHQuY3JlYXRlID0gY3JlYXRlO1xufSkoSW5saW5lQ29tcGxldGlvbkNvbnRleHQgfHwgKElubGluZUNvbXBsZXRpb25Db250ZXh0ID0ge30pKTtcbmV4cG9ydCB2YXIgV29ya3NwYWNlRm9sZGVyO1xuKGZ1bmN0aW9uIChXb3Jrc3BhY2VGb2xkZXIpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBVUkkuaXMoY2FuZGlkYXRlLnVyaSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5uYW1lKTtcbiAgICB9XG4gICAgV29ya3NwYWNlRm9sZGVyLmlzID0gaXM7XG59KShXb3Jrc3BhY2VGb2xkZXIgfHwgKFdvcmtzcGFjZUZvbGRlciA9IHt9KSk7XG5leHBvcnQgY29uc3QgRU9MID0gWydcXG4nLCAnXFxyXFxuJywgJ1xcciddO1xuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgdGhlIHRleHQgZG9jdW1lbnQgZnJvbSB0aGUgbmV3IHZzY29kZS1sYW5ndWFnZXNlcnZlci10ZXh0ZG9jdW1lbnQgcGFja2FnZS5cbiAqL1xuZXhwb3J0IHZhciBUZXh0RG9jdW1lbnQ7XG4oZnVuY3Rpb24gKFRleHREb2N1bWVudCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgSVRleHREb2N1bWVudCBsaXRlcmFsIGZyb20gdGhlIGdpdmVuIHVyaSBhbmQgY29udGVudC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSBkb2N1bWVudCdzIHVyaS5cbiAgICAgKiBAcGFyYW0gbGFuZ3VhZ2VJZCBUaGUgZG9jdW1lbnQncyBsYW5ndWFnZSBJZC5cbiAgICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgZG9jdW1lbnQncyB2ZXJzaW9uLlxuICAgICAqIEBwYXJhbSBjb250ZW50IFRoZSBkb2N1bWVudCdzIGNvbnRlbnQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHVyaSwgbGFuZ3VhZ2VJZCwgdmVyc2lvbiwgY29udGVudCkge1xuICAgICAgICByZXR1cm4gbmV3IEZ1bGxUZXh0RG9jdW1lbnQodXJpLCBsYW5ndWFnZUlkLCB2ZXJzaW9uLCBjb250ZW50KTtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50LmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIElUZXh0RG9jdW1lbnR9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLmxhbmd1YWdlSWQpIHx8IElzLnN0cmluZyhjYW5kaWRhdGUubGFuZ3VhZ2VJZCkpICYmIElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS5saW5lQ291bnQpXG4gICAgICAgICAgICAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5nZXRUZXh0KSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5wb3NpdGlvbkF0KSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5vZmZzZXRBdCkgPyB0cnVlIDogZmFsc2U7XG4gICAgfVxuICAgIFRleHREb2N1bWVudC5pcyA9IGlzO1xuICAgIGZ1bmN0aW9uIGFwcGx5RWRpdHMoZG9jdW1lbnQsIGVkaXRzKSB7XG4gICAgICAgIGxldCB0ZXh0ID0gZG9jdW1lbnQuZ2V0VGV4dCgpO1xuICAgICAgICBsZXQgc29ydGVkRWRpdHMgPSBtZXJnZVNvcnQoZWRpdHMsIChhLCBiKSA9PiB7XG4gICAgICAgICAgICBsZXQgZGlmZiA9IGEucmFuZ2Uuc3RhcnQubGluZSAtIGIucmFuZ2Uuc3RhcnQubGluZTtcbiAgICAgICAgICAgIGlmIChkaWZmID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEucmFuZ2Uuc3RhcnQuY2hhcmFjdGVyIC0gYi5yYW5nZS5zdGFydC5jaGFyYWN0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZGlmZjtcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBsYXN0TW9kaWZpZWRPZmZzZXQgPSB0ZXh0Lmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaSA9IHNvcnRlZEVkaXRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBsZXQgZSA9IHNvcnRlZEVkaXRzW2ldO1xuICAgICAgICAgICAgbGV0IHN0YXJ0T2Zmc2V0ID0gZG9jdW1lbnQub2Zmc2V0QXQoZS5yYW5nZS5zdGFydCk7XG4gICAgICAgICAgICBsZXQgZW5kT2Zmc2V0ID0gZG9jdW1lbnQub2Zmc2V0QXQoZS5yYW5nZS5lbmQpO1xuICAgICAgICAgICAgaWYgKGVuZE9mZnNldCA8PSBsYXN0TW9kaWZpZWRPZmZzZXQpIHtcbiAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMCwgc3RhcnRPZmZzZXQpICsgZS5uZXdUZXh0ICsgdGV4dC5zdWJzdHJpbmcoZW5kT2Zmc2V0LCB0ZXh0Lmxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ092ZXJsYXBwaW5nIGVkaXQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxhc3RNb2RpZmllZE9mZnNldCA9IHN0YXJ0T2Zmc2V0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnQuYXBwbHlFZGl0cyA9IGFwcGx5RWRpdHM7XG4gICAgZnVuY3Rpb24gbWVyZ2VTb3J0KGRhdGEsIGNvbXBhcmUpIHtcbiAgICAgICAgaWYgKGRhdGEubGVuZ3RoIDw9IDEpIHtcbiAgICAgICAgICAgIC8vIHNvcnRlZFxuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcCA9IChkYXRhLmxlbmd0aCAvIDIpIHwgMDtcbiAgICAgICAgY29uc3QgbGVmdCA9IGRhdGEuc2xpY2UoMCwgcCk7XG4gICAgICAgIGNvbnN0IHJpZ2h0ID0gZGF0YS5zbGljZShwKTtcbiAgICAgICAgbWVyZ2VTb3J0KGxlZnQsIGNvbXBhcmUpO1xuICAgICAgICBtZXJnZVNvcnQocmlnaHQsIGNvbXBhcmUpO1xuICAgICAgICBsZXQgbGVmdElkeCA9IDA7XG4gICAgICAgIGxldCByaWdodElkeCA9IDA7XG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgd2hpbGUgKGxlZnRJZHggPCBsZWZ0Lmxlbmd0aCAmJiByaWdodElkeCA8IHJpZ2h0Lmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IHJldCA9IGNvbXBhcmUobGVmdFtsZWZ0SWR4XSwgcmlnaHRbcmlnaHRJZHhdKTtcbiAgICAgICAgICAgIGlmIChyZXQgPD0gMCkge1xuICAgICAgICAgICAgICAgIC8vIHNtYWxsZXJfZXF1YWwgLT4gdGFrZSBsZWZ0IHRvIHByZXNlcnZlIG9yZGVyXG4gICAgICAgICAgICAgICAgZGF0YVtpKytdID0gbGVmdFtsZWZ0SWR4KytdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gZ3JlYXRlciAtPiB0YWtlIHJpZ2h0XG4gICAgICAgICAgICAgICAgZGF0YVtpKytdID0gcmlnaHRbcmlnaHRJZHgrK107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKGxlZnRJZHggPCBsZWZ0Lmxlbmd0aCkge1xuICAgICAgICAgICAgZGF0YVtpKytdID0gbGVmdFtsZWZ0SWR4KytdO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChyaWdodElkeCA8IHJpZ2h0Lmxlbmd0aCkge1xuICAgICAgICAgICAgZGF0YVtpKytdID0gcmlnaHRbcmlnaHRJZHgrK107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxufSkoVGV4dERvY3VtZW50IHx8IChUZXh0RG9jdW1lbnQgPSB7fSkpO1xuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgdGhlIHRleHQgZG9jdW1lbnQgZnJvbSB0aGUgbmV3IHZzY29kZS1sYW5ndWFnZXNlcnZlci10ZXh0ZG9jdW1lbnQgcGFja2FnZS5cbiAqL1xuY2xhc3MgRnVsbFRleHREb2N1bWVudCB7XG4gICAgY29uc3RydWN0b3IodXJpLCBsYW5ndWFnZUlkLCB2ZXJzaW9uLCBjb250ZW50KSB7XG4gICAgICAgIHRoaXMuX3VyaSA9IHVyaTtcbiAgICAgICAgdGhpcy5fbGFuZ3VhZ2VJZCA9IGxhbmd1YWdlSWQ7XG4gICAgICAgIHRoaXMuX3ZlcnNpb24gPSB2ZXJzaW9uO1xuICAgICAgICB0aGlzLl9jb250ZW50ID0gY29udGVudDtcbiAgICAgICAgdGhpcy5fbGluZU9mZnNldHMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGdldCB1cmkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl91cmk7XG4gICAgfVxuICAgIGdldCBsYW5ndWFnZUlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGFuZ3VhZ2VJZDtcbiAgICB9XG4gICAgZ2V0IHZlcnNpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92ZXJzaW9uO1xuICAgIH1cbiAgICBnZXRUZXh0KHJhbmdlKSB7XG4gICAgICAgIGlmIChyYW5nZSkge1xuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5vZmZzZXRBdChyYW5nZS5zdGFydCk7XG4gICAgICAgICAgICBsZXQgZW5kID0gdGhpcy5vZmZzZXRBdChyYW5nZS5lbmQpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRlbnQuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9jb250ZW50O1xuICAgIH1cbiAgICB1cGRhdGUoZXZlbnQsIHZlcnNpb24pIHtcbiAgICAgICAgdGhpcy5fY29udGVudCA9IGV2ZW50LnRleHQ7XG4gICAgICAgIHRoaXMuX3ZlcnNpb24gPSB2ZXJzaW9uO1xuICAgICAgICB0aGlzLl9saW5lT2Zmc2V0cyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZ2V0TGluZU9mZnNldHMoKSB7XG4gICAgICAgIGlmICh0aGlzLl9saW5lT2Zmc2V0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsZXQgbGluZU9mZnNldHMgPSBbXTtcbiAgICAgICAgICAgIGxldCB0ZXh0ID0gdGhpcy5fY29udGVudDtcbiAgICAgICAgICAgIGxldCBpc0xpbmVTdGFydCA9IHRydWU7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNMaW5lU3RhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGluZU9mZnNldHMucHVzaChpKTtcbiAgICAgICAgICAgICAgICAgICAgaXNMaW5lU3RhcnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGNoID0gdGV4dC5jaGFyQXQoaSk7XG4gICAgICAgICAgICAgICAgaXNMaW5lU3RhcnQgPSAoY2ggPT09ICdcXHInIHx8IGNoID09PSAnXFxuJyk7XG4gICAgICAgICAgICAgICAgaWYgKGNoID09PSAnXFxyJyAmJiBpICsgMSA8IHRleHQubGVuZ3RoICYmIHRleHQuY2hhckF0KGkgKyAxKSA9PT0gJ1xcbicpIHtcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc0xpbmVTdGFydCAmJiB0ZXh0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsaW5lT2Zmc2V0cy5wdXNoKHRleHQubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2xpbmVPZmZzZXRzID0gbGluZU9mZnNldHM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2xpbmVPZmZzZXRzO1xuICAgIH1cbiAgICBwb3NpdGlvbkF0KG9mZnNldCkge1xuICAgICAgICBvZmZzZXQgPSBNYXRoLm1heChNYXRoLm1pbihvZmZzZXQsIHRoaXMuX2NvbnRlbnQubGVuZ3RoKSwgMCk7XG4gICAgICAgIGxldCBsaW5lT2Zmc2V0cyA9IHRoaXMuZ2V0TGluZU9mZnNldHMoKTtcbiAgICAgICAgbGV0IGxvdyA9IDAsIGhpZ2ggPSBsaW5lT2Zmc2V0cy5sZW5ndGg7XG4gICAgICAgIGlmIChoaWdoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUG9zaXRpb24uY3JlYXRlKDAsIG9mZnNldCk7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKGxvdyA8IGhpZ2gpIHtcbiAgICAgICAgICAgIGxldCBtaWQgPSBNYXRoLmZsb29yKChsb3cgKyBoaWdoKSAvIDIpO1xuICAgICAgICAgICAgaWYgKGxpbmVPZmZzZXRzW21pZF0gPiBvZmZzZXQpIHtcbiAgICAgICAgICAgICAgICBoaWdoID0gbWlkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbG93ID0gbWlkICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBsb3cgaXMgdGhlIGxlYXN0IHggZm9yIHdoaWNoIHRoZSBsaW5lIG9mZnNldCBpcyBsYXJnZXIgdGhhbiB0aGUgY3VycmVudCBvZmZzZXRcbiAgICAgICAgLy8gb3IgYXJyYXkubGVuZ3RoIGlmIG5vIGxpbmUgb2Zmc2V0IGlzIGxhcmdlciB0aGFuIHRoZSBjdXJyZW50IG9mZnNldFxuICAgICAgICBsZXQgbGluZSA9IGxvdyAtIDE7XG4gICAgICAgIHJldHVybiBQb3NpdGlvbi5jcmVhdGUobGluZSwgb2Zmc2V0IC0gbGluZU9mZnNldHNbbGluZV0pO1xuICAgIH1cbiAgICBvZmZzZXRBdChwb3NpdGlvbikge1xuICAgICAgICBsZXQgbGluZU9mZnNldHMgPSB0aGlzLmdldExpbmVPZmZzZXRzKCk7XG4gICAgICAgIGlmIChwb3NpdGlvbi5saW5lID49IGxpbmVPZmZzZXRzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRlbnQubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBvc2l0aW9uLmxpbmUgPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbGluZU9mZnNldCA9IGxpbmVPZmZzZXRzW3Bvc2l0aW9uLmxpbmVdO1xuICAgICAgICBsZXQgbmV4dExpbmVPZmZzZXQgPSAocG9zaXRpb24ubGluZSArIDEgPCBsaW5lT2Zmc2V0cy5sZW5ndGgpID8gbGluZU9mZnNldHNbcG9zaXRpb24ubGluZSArIDFdIDogdGhpcy5fY29udGVudC5sZW5ndGg7XG4gICAgICAgIHJldHVybiBNYXRoLm1heChNYXRoLm1pbihsaW5lT2Zmc2V0ICsgcG9zaXRpb24uY2hhcmFjdGVyLCBuZXh0TGluZU9mZnNldCksIGxpbmVPZmZzZXQpO1xuICAgIH1cbiAgICBnZXQgbGluZUNvdW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRMaW5lT2Zmc2V0cygpLmxlbmd0aDtcbiAgICB9XG59XG52YXIgSXM7XG4oZnVuY3Rpb24gKElzKSB7XG4gICAgY29uc3QgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuICAgIGZ1bmN0aW9uIGRlZmluZWQodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCc7XG4gICAgfVxuICAgIElzLmRlZmluZWQgPSBkZWZpbmVkO1xuICAgIGZ1bmN0aW9uIHVuZGVmaW5lZCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJztcbiAgICB9XG4gICAgSXMudW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGZ1bmN0aW9uIGJvb2xlYW4odmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZTtcbiAgICB9XG4gICAgSXMuYm9vbGVhbiA9IGJvb2xlYW47XG4gICAgZnVuY3Rpb24gc3RyaW5nKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgU3RyaW5nXSc7XG4gICAgfVxuICAgIElzLnN0cmluZyA9IHN0cmluZztcbiAgICBmdW5jdGlvbiBudW1iZXIodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBOdW1iZXJdJztcbiAgICB9XG4gICAgSXMubnVtYmVyID0gbnVtYmVyO1xuICAgIGZ1bmN0aW9uIG51bWJlclJhbmdlKHZhbHVlLCBtaW4sIG1heCkge1xuICAgICAgICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IE51bWJlcl0nICYmIG1pbiA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSBtYXg7XG4gICAgfVxuICAgIElzLm51bWJlclJhbmdlID0gbnVtYmVyUmFuZ2U7XG4gICAgZnVuY3Rpb24gaW50ZWdlcih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IE51bWJlcl0nICYmIC0yMTQ3NDgzNjQ4IDw9IHZhbHVlICYmIHZhbHVlIDw9IDIxNDc0ODM2NDc7XG4gICAgfVxuICAgIElzLmludGVnZXIgPSBpbnRlZ2VyO1xuICAgIGZ1bmN0aW9uIHVpbnRlZ2VyKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgTnVtYmVyXScgJiYgMCA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSAyMTQ3NDgzNjQ3O1xuICAgIH1cbiAgICBJcy51aW50ZWdlciA9IHVpbnRlZ2VyO1xuICAgIGZ1bmN0aW9uIGZ1bmModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xuICAgIH1cbiAgICBJcy5mdW5jID0gZnVuYztcbiAgICBmdW5jdGlvbiBvYmplY3RMaXRlcmFsKHZhbHVlKSB7XG4gICAgICAgIC8vIFN0cmljdGx5IHNwZWFraW5nIGNsYXNzIGluc3RhbmNlcyBwYXNzIHRoaXMgY2hlY2sgYXMgd2VsbC4gU2luY2UgdGhlIExTUFxuICAgICAgICAvLyBkb2Vzbid0IHVzZSBjbGFzc2VzIHdlIGlnbm9yZSB0aGlzIGZvciBub3cuIElmIHdlIGRvIHdlIG5lZWQgdG8gYWRkIHNvbWV0aGluZ1xuICAgICAgICAvLyBsaWtlIHRoaXM6IGBPYmplY3QuZ2V0UHJvdG90eXBlT2YoT2JqZWN0LmdldFByb3RvdHlwZU9mKHgpKSA9PT0gbnVsbGBcbiAgICAgICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCc7XG4gICAgfVxuICAgIElzLm9iamVjdExpdGVyYWwgPSBvYmplY3RMaXRlcmFsO1xuICAgIGZ1bmN0aW9uIHR5cGVkQXJyYXkodmFsdWUsIGNoZWNrKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5ldmVyeShjaGVjayk7XG4gICAgfVxuICAgIElzLnR5cGVkQXJyYXkgPSB0eXBlZEFycmF5O1xufSkoSXMgfHwgKElzID0ge30pKTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUtBLGFBQU8sZUFBZSxTQUFTLGNBQWMsRUFBRSxPQUFPLEtBQUssQ0FBQztBQUM1RCxjQUFRLGNBQWMsUUFBUSxRQUFRLFFBQVEsT0FBTyxRQUFRLFFBQVEsUUFBUSxTQUFTLFFBQVEsU0FBUyxRQUFRLFVBQVU7QUFDekgsZUFBUyxRQUFRLE9BQU87QUFDcEIsZUFBTyxVQUFVLFFBQVEsVUFBVTtBQUFBLE1BQ3ZDO0FBQ0EsY0FBUSxVQUFVO0FBQ2xCLGVBQVMsT0FBTyxPQUFPO0FBQ25CLGVBQU8sT0FBTyxVQUFVLFlBQVksaUJBQWlCO0FBQUEsTUFDekQ7QUFDQSxjQUFRLFNBQVM7QUFDakIsZUFBUyxPQUFPLE9BQU87QUFDbkIsZUFBTyxPQUFPLFVBQVUsWUFBWSxpQkFBaUI7QUFBQSxNQUN6RDtBQUNBLGNBQVEsU0FBUztBQUNqQixlQUFTLE1BQU0sT0FBTztBQUNsQixlQUFPLGlCQUFpQjtBQUFBLE1BQzVCO0FBQ0EsY0FBUSxRQUFR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QUNoQyxhQUFnQixFQUFFLGlCQUFpQixNQUFNO0FBQUEsUUFDekMsWUFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxTQUFTLE1BQU0sRUFBRTtBQUFBLFFBQ3JELG9CQUF3QixFQUFFLFNBQVMsS0FBSztBQUFBLFFBQ3hDLHlCQUF5QixFQUFFLFNBQVMsS0FBSztBQUFBLE1BQzdDO0FBQUEsSUFDSjtBQUFBLEVBQ0o7IiwKICAibmFtZXMiOiBbIkVycm9yQ29kZXMiLCAiTWVzc2FnZSIsICJUb3VjaCIsICJEaXNwb3NhYmxlIiwgIlJBTCIsICJFdmVudCIsICJJcyIsICJDYW5jZWxsYXRpb25Ub2tlbiIsICJDYW5jZWxsYXRpb25TdGF0ZSIsICJfY29ubiIsICJJcyIsICJNZXNzYWdlUmVhZGVyIiwgIkFic3RyYWN0TWVzc2FnZVJlYWRlciIsICJSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zIiwgIklzIiwgIk1lc3NhZ2VXcml0ZXIiLCAiQWJzdHJhY3RNZXNzYWdlV3JpdGVyIiwgIlJlc29sdmVkTWVzc2FnZVdyaXRlck9wdGlvbnMiLCAicmVzdWx0IiwgIklzIiwgIkNhbmNlbE5vdGlmaWNhdGlvbiIsICJQcm9ncmVzc1Rva2VuIiwgIlByb2dyZXNzTm90aWZpY2F0aW9uIiwgIlN0YXJSZXF1ZXN0SGFuZGxlciIsICJUcmFjZSIsICJUcmFjZVZhbHVlcyIsICJUcmFjZUZvcm1hdCIsICJTZXRUcmFjZU5vdGlmaWNhdGlvbiIsICJMb2dUcmFjZU5vdGlmaWNhdGlvbiIsICJDb25uZWN0aW9uRXJyb3JzIiwgIkNvbm5lY3Rpb25TdHJhdGVneSIsICJJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kiLCAiUmVxdWVzdENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kiLCAiQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSIsICJDYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneSIsICJDYW5jZWxsYXRpb25TdHJhdGVneSIsICJNZXNzYWdlU3RyYXRlZ3kiLCAiQ29ubmVjdGlvbk9wdGlvbnMiLCAiQ29ubmVjdGlvblN0YXRlIiwgImNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uIiwgInN0YXJ0VGltZSIsICJSSUwiLCAibSIsICJleHBvcnRzIiwgImNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uIiwgImltcG9ydF92c2NvZGVfanNvbnJwYyIsICJpbXBvcnRfdnNjb2RlX2pzb25ycGMiLCAiaW1wb3J0X3ZzY29kZV9qc29ucnBjIiwgImltcG9ydF92c2NvZGVfanNvbnJwYyIsICJEb2N1bWVudFVyaSIsICJVUkkiLCAiaW50ZWdlciIsICJ1aW50ZWdlciIsICJQb3NpdGlvbiIsICJSYW5nZSIsICJMb2NhdGlvbiIsICJMb2NhdGlvbkxpbmsiLCAiQ29sb3IiLCAiQ29sb3JJbmZvcm1hdGlvbiIsICJDb2xvclByZXNlbnRhdGlvbiIsICJGb2xkaW5nUmFuZ2VLaW5kIiwgIkZvbGRpbmdSYW5nZSIsICJEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uIiwgImxvY2F0aW9uIiwgIkRpYWdub3N0aWNTZXZlcml0eSIsICJEaWFnbm9zdGljVGFnIiwgIkNvZGVEZXNjcmlwdGlvbiIsICJEaWFnbm9zdGljIiwgIkNvbW1hbmQiLCAiVGV4dEVkaXQiLCAiQ2hhbmdlQW5ub3RhdGlvbiIsICJDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllciIsICJBbm5vdGF0ZWRUZXh0RWRpdCIsICJUZXh0RG9jdW1lbnRFZGl0IiwgIkNyZWF0ZUZpbGUiLCAiUmVuYW1lRmlsZSIsICJEZWxldGVGaWxlIiwgIldvcmtzcGFjZUVkaXQiLCAiVGV4dERvY3VtZW50SWRlbnRpZmllciIsICJWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIiwgIk9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciIsICJUZXh0RG9jdW1lbnRJdGVtIiwgIk1hcmt1cEtpbmQiLCAiTWFya3VwQ29udGVudCIsICJDb21wbGV0aW9uSXRlbUtpbmQiLCAiSW5zZXJ0VGV4dEZvcm1hdCIsICJDb21wbGV0aW9uSXRlbVRhZyIsICJJbnNlcnRSZXBsYWNlRWRpdCIsICJSYW5nZSIsICJJbnNlcnRUZXh0TW9kZSIsICJDb21wbGV0aW9uSXRlbUxhYmVsRGV0YWlscyIsICJDb21wbGV0aW9uSXRlbSIsICJDb21wbGV0aW9uTGlzdCIsICJNYXJrZWRTdHJpbmciLCAiSG92ZXIiLCAiUGFyYW1ldGVySW5mb3JtYXRpb24iLCAiU2lnbmF0dXJlSW5mb3JtYXRpb24iLCAiRG9jdW1lbnRIaWdobGlnaHRLaW5kIiwgIkRvY3VtZW50SGlnaGxpZ2h0IiwgIlN5bWJvbEtpbmQiLCAiU3ltYm9sVGFnIiwgIlN5bWJvbEluZm9ybWF0aW9uIiwgIldvcmtzcGFjZVN5bWJvbCIsICJEb2N1bWVudFN5bWJvbCIsICJDb2RlQWN0aW9uS2luZCIsICJDb2RlQWN0aW9uVHJpZ2dlcktpbmQiLCAiQ29kZUFjdGlvbkNvbnRleHQiLCAiQ29kZUFjdGlvbiIsICJDb2RlTGVucyIsICJGb3JtYXR0aW5nT3B0aW9ucyIsICJEb2N1bWVudExpbmsiLCAiU2VsZWN0aW9uUmFuZ2UiLCAiU2VtYW50aWNUb2tlblR5cGVzIiwgIlNlbWFudGljVG9rZW5Nb2RpZmllcnMiLCAiU2VtYW50aWNUb2tlbnMiLCAiSW5saW5lVmFsdWVUZXh0IiwgIklubGluZVZhbHVlVmFyaWFibGVMb29rdXAiLCAiSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24iLCAiSW5saW5lVmFsdWVDb250ZXh0IiwgIklubGF5SGludEtpbmQiLCAiSW5sYXlIaW50TGFiZWxQYXJ0IiwgIklubGF5SGludCIsICJQb3NpdGlvbiIsICJTdHJpbmdWYWx1ZSIsICJJbmxpbmVDb21wbGV0aW9uSXRlbSIsICJJbmxpbmVDb21wbGV0aW9uTGlzdCIsICJJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmQiLCAiU2VsZWN0ZWRDb21wbGV0aW9uSW5mbyIsICJJbmxpbmVDb21wbGV0aW9uQ29udGV4dCIsICJXb3Jrc3BhY2VGb2xkZXIiLCAiVGV4dERvY3VtZW50IiwgIlBvc2l0aW9uIiwgIklzIiwgInVuZGVmaW5lZCIsICJpbnRlZ2VyIiwgInVpbnRlZ2VyIiwgIm0iXQp9Cg== diff --git a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/lsp/java-lsp-client.ts b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/lsp/java-lsp-client.ts index bc7b14e94cb..dfea30b7485 100644 --- a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/lsp/java-lsp-client.ts +++ b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/lsp/java-lsp-client.ts @@ -62,6 +62,9 @@ let _workspaceRoot = ''; /** URIs for which textDocument/didOpen has already been sent. */ const _openFiles: Set = new Set(); +/** Pending debounced didChange timers per file URI, so a change can be flushed before completion. */ +const _changeTimers: Map> = new Map(); + let _providersRegistered = false; /** Semantic-token legend reported by JDT.LS in the initialize result; needed to decode token data. */ @@ -256,19 +259,38 @@ function openFile(fileUri: string): void { }); if (model) { - let timer: ReturnType; model.onDidChangeContent(() => { - clearTimeout(timer); - timer = setTimeout(() => { - _conn?.sendNotification('textDocument/didChange', { - textDocument: { uri: fileUri, version: model.getVersionId() }, - contentChanges: [{ text: model.getValue() }], - }); - }, 400); + const existing = _changeTimers.get(fileUri); + if (existing) clearTimeout(existing); + _changeTimers.set(fileUri, setTimeout(() => sendDidChange(fileUri), 400)); + }); + } +} + +/** Sends the current model content as a didChange and clears any pending debounce for the file. */ +function sendDidChange(fileUri: string): void { + _changeTimers.delete(fileUri); + const model = monaco.editor.getModel(monaco.Uri.parse(fileUri)); + if (_conn && model) { + _conn.sendNotification('textDocument/didChange', { + textDocument: { uri: fileUri, version: model.getVersionId() }, + contentChanges: [{ text: model.getValue() }], }); } } +/** + * Flushes a pending debounced change immediately. Called before a completion request so JDT.LS sees the + * just-typed text on the first Ctrl+Space, instead of completing against stale content (the debounce + * otherwise delays the change by up to 400ms — the cause of "first Ctrl+Space shows nothing"). + */ +function flushPendingChange(fileUri: string): void { + if (_changeTimers.has(fileUri)) { + clearTimeout(_changeTimers.get(fileUri)!); + sendDidChange(fileUri); + } +} + // ------------------------------------------------------------------------- // Workspace file predicate // ------------------------------------------------------------------------- @@ -316,6 +338,8 @@ function registerProviders(): void { provideCompletionItems: async (model, position, context) => { if (!_conn || !isWorkspaceFile(model.uri.toString())) return null; const fileUri = model.uri.toString(); + // Make sure JDT.LS has the just-typed text before completing (see flushPendingChange). + flushPendingChange(fileUri); const result: CompletionList | CompletionItem[] | null = await _conn.sendRequest('textDocument/completion', { textDocument: { uri: fileUri }, position: { line: position.lineNumber - 1, character: position.column - 1 }, @@ -408,11 +432,12 @@ function registerProviders(): void { position: { line: position.lineNumber - 1, character: position.column - 1 }, }); if (!result) return null; - const locations = Array.isArray(result) ? result : [result]; - return locations.map(loc => ({ + const locations = (Array.isArray(result) ? result : [result]).map(loc => ({ uri: monaco.Uri.parse(loc.uri), range: lspRangeToMonaco(loc.range), })); + await ensureModelsForLocations(locations); + return locations; }, }); @@ -425,7 +450,11 @@ function registerProviders(): void { context: { includeDeclaration: context.includeDeclaration }, }); if (!result) return null; - return result.map(loc => ({ uri: monaco.Uri.parse(loc.uri), range: lspRangeToMonaco(loc.range) })); + const locations = result.map(loc => ({ uri: monaco.Uri.parse(loc.uri), range: lspRangeToMonaco(loc.range) })); + // The references peek can only show a code preview for files it has a model for; create + // in-memory models for the referenced (possibly unopened) files so previews render. + await ensureModelsForLocations(locations); + return locations; }, }); @@ -797,8 +826,29 @@ async function requestLocations(method: string, model: monaco.editor.ITextModel, position: { line: position.lineNumber - 1, character: position.column - 1 }, }); if (!result) return null; - const locations = Array.isArray(result) ? result : [result]; - return locations.map(loc => ({ uri: monaco.Uri.parse(loc.uri), range: lspRangeToMonaco(loc.range) })); + const locations = (Array.isArray(result) ? result : [result]).map(loc => ({ uri: monaco.Uri.parse(loc.uri), range: lspRangeToMonaco(loc.range) })); + await ensureModelsForLocations(locations); + return locations; +} + +/** + * Creates in-memory Monaco models for the workspace files referenced by the given locations (fetched + * over REST) so the references / peek widgets can render a code preview — Monaco can only preview files + * it has a model for, and this single-file editor otherwise has none for other files. + */ +async function ensureModelsForLocations(locations: Array<{ uri: monaco.Uri }>): Promise { + const seen = new Set(); + await Promise.all(locations.map(async ({ uri }) => { + const uriStr = uri.toString(); + if (seen.has(uriStr) || !uriStr.startsWith(VIRTUAL_FILE_PREFIX) || monaco.editor.getModel(uri)) return; + seen.add(uriStr); + try { + const text = await fetchWorkspaceFileText(uriToWorkspacePath(uriStr) ?? uriStr); + if (!monaco.editor.getModel(uri)) monaco.editor.createModel(text, 'java', uri); + } catch { + // preview just won't render for this one + } + })); } /** Recursively maps LSP hierarchical DocumentSymbols to Monaco's shape (kinds are 1-based vs 0-based). */ From 29175bc4e05c10a855d3e489e8b1d0cb394643a0 Mon Sep 17 00:00:00 2001 From: Iliyan Velichkov Date: Tue, 23 Jun 2026 15:54:23 +0300 Subject: [PATCH 08/14] fix(editor): make Java quick-fixes & source actions work; refresh tree after rename MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Root cause of "no quick-fixes / no Implement Methods / Generate toString does nothing": - We advertised the *PromptSupport extended capabilities, so JDT.LS returned source actions (generate toString/constructors/accessors, override/implement, organize imports) as client-side "java.action.*Prompt" commands that the vscode-java extension implements but we don't — and the server commands we tried to call (checkToStringStatus/generateToString/…) don't exist on JDT.LS. Dropping those flags makes JDT.LS return the same actions as resolvable WorkspaceEdits (all members), which applyCodeAction resolves and applies directly. - Code-action requests sent diagnostics reconstructed from Monaco markers, which lose the LSP code/data JDT.LS matches quick-fixes against. We now keep the original published diagnostics per file and send the ones overlapping the request range, so "Add unimplemented methods", "Create field", etc. appear. Also: the Projects view ignored file rename/move events, so after a class rename the tree still showed the old file. It now reloads on platform.files.renamed/moved. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../editor-monaco/js/java-lsp-client.js | 45 ++++++----------- .../editor-monaco/js/lsp/java-lsp-client.ts | 48 +++++++++---------- .../dirigible/view-projects/js/projects.js | 10 ++++ 3 files changed, 47 insertions(+), 56 deletions(-) diff --git a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/java-lsp-client.js b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/java-lsp-client.js index 00a6b6bc17c..8d7627d7458 100644 --- a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/java-lsp-client.js +++ b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/java-lsp-client.js @@ -4472,6 +4472,7 @@ ${JSON.stringify(message, null, 4)}`); var _workspaceRoot = ""; var _openFiles = /* @__PURE__ */ new Set(); var _changeTimers = /* @__PURE__ */ new Map(); + var _diagnostics = /* @__PURE__ */ new Map(); var _providersRegistered = false; var _semanticTokensLegend = null; async function connect(resourcePath) { @@ -4496,6 +4497,7 @@ ${JSON.stringify(message, null, 4)}`); const writer = new WebSocketMessageWriter(socket); _conn = (0, import_browser.createMessageConnection)(reader, writer); _conn.onNotification("textDocument/publishDiagnostics", (params) => { + _diagnostics.set(params.uri, params.diagnostics ?? []); const model = editor.getModels().find((m2) => m2.uri.toString() === params.uri); if (!model) return; editor.setModelMarkers(model, "java-lsp", params.diagnostics.map((d) => ({ @@ -4534,12 +4536,11 @@ ${JSON.stringify(message, null, 4)}`); progressReportProvider: false, classFileContentsSupport: true, resolveAdditionalTextEditsSupport: true, - advancedGenerateAccessorsSupport: true, - generateToStringPromptSupport: true, - generateConstructorsPromptSupport: true, - generateDelegateMethodsPromptSupport: true, - hashCodeEqualsPromptSupport: true, - advancedOrganizeImportsSupport: true, + // Do NOT advertise the *PromptSupport flags: those make JDT.LS return source actions + // (generate toString/constructors/accessors, override/implement, organize imports) as + // client-side "*Prompt" commands the vscode-java extension implements but we don't. + // With them off, JDT.LS returns the same actions as resolvable WorkspaceEdits operating + // on all members, which applyCodeAction resolves and applies directly. inferSelectionSupport: ["extractMethod", "extractVariable", "extractField"] } }, @@ -4889,10 +4890,11 @@ ${JSON.stringify(message, null, 4)}`); const empty = { actions: [], dispose() { } }; if (!_conn || !isWorkspaceFile(model.uri.toString())) return empty; - const diagnostics = (context.markers ?? []).map(markerToLspDiagnostic); + const lspRange = monacoRangeToLsp(range); + const diagnostics = (_diagnostics.get(model.uri.toString()) ?? []).filter((d) => rangesOverlap(d.range, lspRange)); const result = await _conn.sendRequest("textDocument/codeAction", { textDocument: { uri: model.uri.toString() }, - range: monacoRangeToLsp(range), + range: lspRange, context: { diagnostics, only: context.only ? [context.only] : void 0 } }); if (!result?.length) return empty; @@ -5298,28 +5300,9 @@ ${JSON.stringify(message, null, 4)}`); end: { line: r.endLineNumber - 1, character: r.endColumn - 1 } }; } - function monacoSeverityToLsp(severity) { - switch (severity) { - case MarkerSeverity.Error: - return DiagnosticSeverity.Error; - case MarkerSeverity.Warning: - return DiagnosticSeverity.Warning; - case MarkerSeverity.Info: - return DiagnosticSeverity.Information; - default: - return DiagnosticSeverity.Hint; - } - } - function markerToLspDiagnostic(m2) { - return { - range: { - start: { line: m2.startLineNumber - 1, character: m2.startColumn - 1 }, - end: { line: m2.endLineNumber - 1, character: m2.endColumn - 1 } - }, - message: m2.message, - severity: monacoSeverityToLsp(m2.severity), - source: m2.source - }; + function rangesOverlap(a, b) { + const notAfter = (p, q) => p.line < q.line || p.line === q.line && p.character <= q.character; + return notAfter(a.start, b.end) && notAfter(b.start, a.end); } function lspCodeActionToMonaco(action) { const isCommand = typeof action.command === "string"; @@ -5563,4 +5546,4 @@ ${JSON.stringify(message, null, 4)}`); } return __toCommonJS(java_lsp_client_exports); })(); -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvY29tbW9uL2lzLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlcy5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vbGlua2VkTWFwLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9kaXNwb3NhYmxlLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9yYWwuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvY29tbW9uL2V2ZW50cy5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vY2FuY2VsbGF0aW9uLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9zaGFyZWRBcnJheUNhbmNlbGxhdGlvbi5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vc2VtYXBob3JlLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlUmVhZGVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlV3JpdGVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlQnVmZmVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9jb25uZWN0aW9uLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9hcGkuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvYnJvd3Nlci9yaWwuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvYnJvd3Nlci9tYWluLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvYnJvd3Nlci5qcyIsICJsc3AvamF2YS1sc3AtY2xpZW50LnRzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLXdzLWpzb25ycGMvc3JjL2Rpc3Bvc2FibGUudHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvc29ja2V0L3NvY2tldC50cyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS13cy1qc29ucnBjL3NyYy9zb2NrZXQvcmVhZGVyLnRzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLXdzLWpzb25ycGMvc3JjL3NvY2tldC93cml0ZXIudHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvc29ja2V0L2Nvbm5lY3Rpb24udHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvY29ubmVjdGlvbi50cyIsICJsc3AvbW9uYWNvLXNoaW0udHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtbGFuZ3VhZ2VzZXJ2ZXItdHlwZXMvbGliL2VzbS9tYWluLmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuc3RyaW5nQXJyYXkgPSBleHBvcnRzLmFycmF5ID0gZXhwb3J0cy5mdW5jID0gZXhwb3J0cy5lcnJvciA9IGV4cG9ydHMubnVtYmVyID0gZXhwb3J0cy5zdHJpbmcgPSBleHBvcnRzLmJvb2xlYW4gPSB2b2lkIDA7XG5mdW5jdGlvbiBib29sZWFuKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZTtcbn1cbmV4cG9ydHMuYm9vbGVhbiA9IGJvb2xlYW47XG5mdW5jdGlvbiBzdHJpbmcodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZztcbn1cbmV4cG9ydHMuc3RyaW5nID0gc3RyaW5nO1xuZnVuY3Rpb24gbnVtYmVyKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdmFsdWUgaW5zdGFuY2VvZiBOdW1iZXI7XG59XG5leHBvcnRzLm51bWJlciA9IG51bWJlcjtcbmZ1bmN0aW9uIGVycm9yKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgRXJyb3I7XG59XG5leHBvcnRzLmVycm9yID0gZXJyb3I7XG5mdW5jdGlvbiBmdW5jKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cbmV4cG9ydHMuZnVuYyA9IGZ1bmM7XG5mdW5jdGlvbiBhcnJheSh2YWx1ZSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cbmV4cG9ydHMuYXJyYXkgPSBhcnJheTtcbmZ1bmN0aW9uIHN0cmluZ0FycmF5KHZhbHVlKSB7XG4gICAgcmV0dXJuIGFycmF5KHZhbHVlKSAmJiB2YWx1ZS5ldmVyeShlbGVtID0+IHN0cmluZyhlbGVtKSk7XG59XG5leHBvcnRzLnN0cmluZ0FycmF5ID0gc3RyaW5nQXJyYXk7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLk1lc3NhZ2UgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU5ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlOCA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTcgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU2ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNSA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTQgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUzID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMiA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTEgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUwID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTkgPSBleHBvcnRzLlJlcXVlc3RUeXBlOCA9IGV4cG9ydHMuUmVxdWVzdFR5cGU3ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTYgPSBleHBvcnRzLlJlcXVlc3RUeXBlNSA9IGV4cG9ydHMuUmVxdWVzdFR5cGU0ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTMgPSBleHBvcnRzLlJlcXVlc3RUeXBlMiA9IGV4cG9ydHMuUmVxdWVzdFR5cGUxID0gZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IGV4cG9ydHMuUmVxdWVzdFR5cGUwID0gZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUgPSBleHBvcnRzLlBhcmFtZXRlclN0cnVjdHVyZXMgPSBleHBvcnRzLlJlc3BvbnNlRXJyb3IgPSBleHBvcnRzLkVycm9yQ29kZXMgPSB2b2lkIDA7XG5jb25zdCBpcyA9IHJlcXVpcmUoXCIuL2lzXCIpO1xuLyoqXG4gKiBQcmVkZWZpbmVkIGVycm9yIGNvZGVzLlxuICovXG52YXIgRXJyb3JDb2RlcztcbihmdW5jdGlvbiAoRXJyb3JDb2Rlcykge1xuICAgIC8vIERlZmluZWQgYnkgSlNPTiBSUENcbiAgICBFcnJvckNvZGVzLlBhcnNlRXJyb3IgPSAtMzI3MDA7XG4gICAgRXJyb3JDb2Rlcy5JbnZhbGlkUmVxdWVzdCA9IC0zMjYwMDtcbiAgICBFcnJvckNvZGVzLk1ldGhvZE5vdEZvdW5kID0gLTMyNjAxO1xuICAgIEVycm9yQ29kZXMuSW52YWxpZFBhcmFtcyA9IC0zMjYwMjtcbiAgICBFcnJvckNvZGVzLkludGVybmFsRXJyb3IgPSAtMzI2MDM7XG4gICAgLyoqXG4gICAgICogVGhpcyBpcyB0aGUgc3RhcnQgcmFuZ2Ugb2YgSlNPTiBSUEMgcmVzZXJ2ZWQgZXJyb3IgY29kZXMuXG4gICAgICogSXQgZG9lc24ndCBkZW5vdGUgYSByZWFsIGVycm9yIGNvZGUuIE5vIGFwcGxpY2F0aW9uIGVycm9yIGNvZGVzIHNob3VsZFxuICAgICAqIGJlIGRlZmluZWQgYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCByYW5nZS4gRm9yIGJhY2t3YXJkc1xuICAgICAqIGNvbXBhdGliaWxpdHkgdGhlIGBTZXJ2ZXJOb3RJbml0aWFsaXplZGAgYW5kIHRoZSBgVW5rbm93bkVycm9yQ29kZWBcbiAgICAgKiBhcmUgbGVmdCBpbiB0aGUgcmFuZ2UuXG4gICAgICpcbiAgICAgKiBAc2luY2UgMy4xNi4wXG4gICAgKi9cbiAgICBFcnJvckNvZGVzLmpzb25ycGNSZXNlcnZlZEVycm9yUmFuZ2VTdGFydCA9IC0zMjA5OTtcbiAgICAvKiogQGRlcHJlY2F0ZWQgdXNlICBqc29ucnBjUmVzZXJ2ZWRFcnJvclJhbmdlU3RhcnQgKi9cbiAgICBFcnJvckNvZGVzLnNlcnZlckVycm9yU3RhcnQgPSAtMzIwOTk7XG4gICAgLyoqXG4gICAgICogQW4gZXJyb3Igb2NjdXJyZWQgd2hlbiB3cml0ZSBhIG1lc3NhZ2UgdG8gdGhlIHRyYW5zcG9ydCBsYXllci5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLk1lc3NhZ2VXcml0ZUVycm9yID0gLTMyMDk5O1xuICAgIC8qKlxuICAgICAqIEFuIGVycm9yIG9jY3VycmVkIHdoZW4gcmVhZGluZyBhIG1lc3NhZ2UgZnJvbSB0aGUgdHJhbnNwb3J0IGxheWVyLlxuICAgICAqL1xuICAgIEVycm9yQ29kZXMuTWVzc2FnZVJlYWRFcnJvciA9IC0zMjA5ODtcbiAgICAvKipcbiAgICAgKiBUaGUgY29ubmVjdGlvbiBnb3QgZGlzcG9zZWQgb3IgbG9zdCBhbmQgYWxsIHBlbmRpbmcgcmVzcG9uc2VzIGdvdFxuICAgICAqIHJlamVjdGVkLlxuICAgICAqL1xuICAgIEVycm9yQ29kZXMuUGVuZGluZ1Jlc3BvbnNlUmVqZWN0ZWQgPSAtMzIwOTc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gaXMgaW5hY3RpdmUgYW5kIGEgdXNlIG9mIGl0IGZhaWxlZC5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLkNvbm5lY3Rpb25JbmFjdGl2ZSA9IC0zMjA5NjtcbiAgICAvKipcbiAgICAgKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBhIHNlcnZlciByZWNlaXZlZCBhIG5vdGlmaWNhdGlvbiBvclxuICAgICAqIHJlcXVlc3QgYmVmb3JlIHRoZSBzZXJ2ZXIgaGFzIHJlY2VpdmVkIHRoZSBgaW5pdGlhbGl6ZWAgcmVxdWVzdC5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLlNlcnZlck5vdEluaXRpYWxpemVkID0gLTMyMDAyO1xuICAgIEVycm9yQ29kZXMuVW5rbm93bkVycm9yQ29kZSA9IC0zMjAwMTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIHRoZSBlbmQgcmFuZ2Ugb2YgSlNPTiBSUEMgcmVzZXJ2ZWQgZXJyb3IgY29kZXMuXG4gICAgICogSXQgZG9lc24ndCBkZW5vdGUgYSByZWFsIGVycm9yIGNvZGUuXG4gICAgICpcbiAgICAgKiBAc2luY2UgMy4xNi4wXG4gICAgKi9cbiAgICBFcnJvckNvZGVzLmpzb25ycGNSZXNlcnZlZEVycm9yUmFuZ2VFbmQgPSAtMzIwMDA7XG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSAganNvbnJwY1Jlc2VydmVkRXJyb3JSYW5nZUVuZCAqL1xuICAgIEVycm9yQ29kZXMuc2VydmVyRXJyb3JFbmQgPSAtMzIwMDA7XG59KShFcnJvckNvZGVzIHx8IChleHBvcnRzLkVycm9yQ29kZXMgPSBFcnJvckNvZGVzID0ge30pKTtcbi8qKlxuICogQW4gZXJyb3Igb2JqZWN0IHJldHVybiBpbiBhIHJlc3BvbnNlIGluIGNhc2UgYSByZXF1ZXN0XG4gKiBoYXMgZmFpbGVkLlxuICovXG5jbGFzcyBSZXNwb25zZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNvZGUsIG1lc3NhZ2UsIGRhdGEpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuY29kZSA9IGlzLm51bWJlcihjb2RlKSA/IGNvZGUgOiBFcnJvckNvZGVzLlVua25vd25FcnJvckNvZGU7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBSZXNwb25zZUVycm9yLnByb3RvdHlwZSk7XG4gICAgfVxuICAgIHRvSnNvbigpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgY29kZTogdGhpcy5jb2RlLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLmRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmRhdGEgPSB0aGlzLmRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5leHBvcnRzLlJlc3BvbnNlRXJyb3IgPSBSZXNwb25zZUVycm9yO1xuY2xhc3MgUGFyYW1ldGVyU3RydWN0dXJlcyB7XG4gICAgY29uc3RydWN0b3Ioa2luZCkge1xuICAgICAgICB0aGlzLmtpbmQgPSBraW5kO1xuICAgIH1cbiAgICBzdGF0aWMgaXModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8gfHwgdmFsdWUgPT09IFBhcmFtZXRlclN0cnVjdHVyZXMuYnlOYW1lIHx8IHZhbHVlID09PSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5UG9zaXRpb247XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5raW5kO1xuICAgIH1cbn1cbmV4cG9ydHMuUGFyYW1ldGVyU3RydWN0dXJlcyA9IFBhcmFtZXRlclN0cnVjdHVyZXM7XG4vKipcbiAqIFRoZSBwYXJhbWV0ZXIgc3RydWN0dXJlIGlzIGF1dG9tYXRpY2FsbHkgaW5mZXJyZWQgb24gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzXG4gKiBhbmQgdGhlIHBhcmFtZXRlciB0eXBlIGluIGNhc2Ugb2YgYSBzaW5nbGUgcGFyYW0uXG4gKi9cblBhcmFtZXRlclN0cnVjdHVyZXMuYXV0byA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdhdXRvJyk7XG4vKipcbiAqIEZvcmNlcyBgYnlQb3NpdGlvbmAgcGFyYW1ldGVyIHN0cnVjdHVyZS4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGhhdmUgYSBzaW5nbGVcbiAqIHBhcmFtZXRlciB3aGljaCBoYXMgYSBsaXRlcmFsIHR5cGUuXG4gKi9cblBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbiA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdieVBvc2l0aW9uJyk7XG4vKipcbiAqIEZvcmNlcyBgYnlOYW1lYCBwYXJhbWV0ZXIgc3RydWN0dXJlLiBUaGlzIGlzIG9ubHkgdXNlZnVsIHdoZW4gaGF2aW5nIGEgc2luZ2xlXG4gKiBwYXJhbWV0ZXIuIFRoZSBsaWJyYXJ5IHdpbGwgcmVwb3J0IGVycm9ycyBpZiB1c2VkIHdpdGggYSBkaWZmZXJlbnQgbnVtYmVyIG9mXG4gKiBwYXJhbWV0ZXJzLlxuICovXG5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdieU5hbWUnKTtcbi8qKlxuICogQW4gYWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgYSBNZXNzYWdlVHlwZS5cbiAqL1xuY2xhc3MgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIG51bWJlck9mUGFyYW1zKSB7XG4gICAgICAgIHRoaXMubWV0aG9kID0gbWV0aG9kO1xuICAgICAgICB0aGlzLm51bWJlck9mUGFyYW1zID0gbnVtYmVyT2ZQYXJhbXM7XG4gICAgfVxuICAgIGdldCBwYXJhbWV0ZXJTdHJ1Y3R1cmVzKCkge1xuICAgICAgICByZXR1cm4gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvO1xuICAgIH1cbn1cbmV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlID0gQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlO1xuLyoqXG4gKiBDbGFzc2VzIHRvIHR5cGUgcmVxdWVzdCByZXNwb25zZSBwYWlyc1xuICovXG5jbGFzcyBSZXF1ZXN0VHlwZTAgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDApO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGUwID0gUmVxdWVzdFR5cGUwO1xuY2xhc3MgUmVxdWVzdFR5cGUgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCwgX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8pIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAxKTtcbiAgICAgICAgdGhpcy5fcGFyYW1ldGVyU3RydWN0dXJlcyA9IF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbiAgICBnZXQgcGFyYW1ldGVyU3RydWN0dXJlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXM7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IFJlcXVlc3RUeXBlO1xuY2xhc3MgUmVxdWVzdFR5cGUxIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMSk7XG4gICAgICAgIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBfcGFyYW1ldGVyU3RydWN0dXJlcztcbiAgICB9XG4gICAgZ2V0IHBhcmFtZXRlclN0cnVjdHVyZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGUxID0gUmVxdWVzdFR5cGUxO1xuY2xhc3MgUmVxdWVzdFR5cGUyIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAyKTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlMiA9IFJlcXVlc3RUeXBlMjtcbmNsYXNzIFJlcXVlc3RUeXBlMyBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMyk7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTMgPSBSZXF1ZXN0VHlwZTM7XG5jbGFzcyBSZXF1ZXN0VHlwZTQgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDQpO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGU0ID0gUmVxdWVzdFR5cGU0O1xuY2xhc3MgUmVxdWVzdFR5cGU1IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA1KTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlNSA9IFJlcXVlc3RUeXBlNTtcbmNsYXNzIFJlcXVlc3RUeXBlNiBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNik7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTYgPSBSZXF1ZXN0VHlwZTY7XG5jbGFzcyBSZXF1ZXN0VHlwZTcgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDcpO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGU3ID0gUmVxdWVzdFR5cGU3O1xuY2xhc3MgUmVxdWVzdFR5cGU4IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA4KTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlOCA9IFJlcXVlc3RUeXBlODtcbmNsYXNzIFJlcXVlc3RUeXBlOSBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgOSk7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTkgPSBSZXF1ZXN0VHlwZTk7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMSk7XG4gICAgICAgIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBfcGFyYW1ldGVyU3RydWN0dXJlcztcbiAgICB9XG4gICAgZ2V0IHBhcmFtZXRlclN0cnVjdHVyZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZSA9IE5vdGlmaWNhdGlvblR5cGU7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlMCBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMCk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMCA9IE5vdGlmaWNhdGlvblR5cGUwO1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTEgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCwgX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8pIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAxKTtcbiAgICAgICAgdGhpcy5fcGFyYW1ldGVyU3RydWN0dXJlcyA9IF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbiAgICBnZXQgcGFyYW1ldGVyU3RydWN0dXJlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXM7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMSA9IE5vdGlmaWNhdGlvblR5cGUxO1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDIpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTIgPSBOb3RpZmljYXRpb25UeXBlMjtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGUzIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAzKTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGUzID0gTm90aWZpY2F0aW9uVHlwZTM7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlNCBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNCk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNCA9IE5vdGlmaWNhdGlvblR5cGU0O1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTUgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDUpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTUgPSBOb3RpZmljYXRpb25UeXBlNTtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGU2IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA2KTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGU2ID0gTm90aWZpY2F0aW9uVHlwZTY7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlNyBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNyk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNyA9IE5vdGlmaWNhdGlvblR5cGU3O1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTggZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDgpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTggPSBOb3RpZmljYXRpb25UeXBlODtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGU5IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA5KTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGU5ID0gTm90aWZpY2F0aW9uVHlwZTk7XG52YXIgTWVzc2FnZTtcbihmdW5jdGlvbiAoTWVzc2FnZSkge1xuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoZSBnaXZlbiBtZXNzYWdlIGlzIGEgcmVxdWVzdCBtZXNzYWdlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gbWVzc2FnZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBpcy5zdHJpbmcoY2FuZGlkYXRlLm1ldGhvZCkgJiYgKGlzLnN0cmluZyhjYW5kaWRhdGUuaWQpIHx8IGlzLm51bWJlcihjYW5kaWRhdGUuaWQpKTtcbiAgICB9XG4gICAgTWVzc2FnZS5pc1JlcXVlc3QgPSBpc1JlcXVlc3Q7XG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhlIGdpdmVuIG1lc3NhZ2UgaXMgYSBub3RpZmljYXRpb24gbWVzc2FnZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTm90aWZpY2F0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gbWVzc2FnZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBpcy5zdHJpbmcoY2FuZGlkYXRlLm1ldGhvZCkgJiYgbWVzc2FnZS5pZCA9PT0gdm9pZCAwO1xuICAgIH1cbiAgICBNZXNzYWdlLmlzTm90aWZpY2F0aW9uID0gaXNOb3RpZmljYXRpb247XG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhlIGdpdmVuIG1lc3NhZ2UgaXMgYSByZXNwb25zZSBtZXNzYWdlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNSZXNwb25zZShtZXNzYWdlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IG1lc3NhZ2U7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgKGNhbmRpZGF0ZS5yZXN1bHQgIT09IHZvaWQgMCB8fCAhIWNhbmRpZGF0ZS5lcnJvcikgJiYgKGlzLnN0cmluZyhjYW5kaWRhdGUuaWQpIHx8IGlzLm51bWJlcihjYW5kaWRhdGUuaWQpIHx8IGNhbmRpZGF0ZS5pZCA9PT0gbnVsbCk7XG4gICAgfVxuICAgIE1lc3NhZ2UuaXNSZXNwb25zZSA9IGlzUmVzcG9uc2U7XG59KShNZXNzYWdlIHx8IChleHBvcnRzLk1lc3NhZ2UgPSBNZXNzYWdlID0ge30pKTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xudmFyIF9hO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5MUlVDYWNoZSA9IGV4cG9ydHMuTGlua2VkTWFwID0gZXhwb3J0cy5Ub3VjaCA9IHZvaWQgMDtcbnZhciBUb3VjaDtcbihmdW5jdGlvbiAoVG91Y2gpIHtcbiAgICBUb3VjaC5Ob25lID0gMDtcbiAgICBUb3VjaC5GaXJzdCA9IDE7XG4gICAgVG91Y2guQXNPbGQgPSBUb3VjaC5GaXJzdDtcbiAgICBUb3VjaC5MYXN0ID0gMjtcbiAgICBUb3VjaC5Bc05ldyA9IFRvdWNoLkxhc3Q7XG59KShUb3VjaCB8fCAoZXhwb3J0cy5Ub3VjaCA9IFRvdWNoID0ge30pKTtcbmNsYXNzIExpbmtlZE1hcCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXNbX2FdID0gJ0xpbmtlZE1hcCc7XG4gICAgICAgIHRoaXMuX21hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5faGVhZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fdGFpbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IDA7XG4gICAgICAgIHRoaXMuX3N0YXRlID0gMDtcbiAgICB9XG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuX21hcC5jbGVhcigpO1xuICAgICAgICB0aGlzLl9oZWFkID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl90YWlsID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9zaXplID0gMDtcbiAgICAgICAgdGhpcy5fc3RhdGUrKztcbiAgICB9XG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLl9oZWFkICYmICF0aGlzLl90YWlsO1xuICAgIH1cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpemU7XG4gICAgfVxuICAgIGdldCBmaXJzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlYWQ/LnZhbHVlO1xuICAgIH1cbiAgICBnZXQgbGFzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhaWw/LnZhbHVlO1xuICAgIH1cbiAgICBoYXMoa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXAuaGFzKGtleSk7XG4gICAgfVxuICAgIGdldChrZXksIHRvdWNoID0gVG91Y2guTm9uZSkge1xuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5fbWFwLmdldChrZXkpO1xuICAgICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRvdWNoICE9PSBUb3VjaC5Ob25lKSB7XG4gICAgICAgICAgICB0aGlzLnRvdWNoKGl0ZW0sIHRvdWNoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICB9XG4gICAgc2V0KGtleSwgdmFsdWUsIHRvdWNoID0gVG91Y2guTm9uZSkge1xuICAgICAgICBsZXQgaXRlbSA9IHRoaXMuX21hcC5nZXQoa2V5KTtcbiAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgIGl0ZW0udmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIGlmICh0b3VjaCAhPT0gVG91Y2guTm9uZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudG91Y2goaXRlbSwgdG91Y2gpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaXRlbSA9IHsga2V5LCB2YWx1ZSwgbmV4dDogdW5kZWZpbmVkLCBwcmV2aW91czogdW5kZWZpbmVkIH07XG4gICAgICAgICAgICBzd2l0Y2ggKHRvdWNoKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBUb3VjaC5Ob25lOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFRvdWNoLkZpcnN0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1GaXJzdChpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBUb3VjaC5MYXN0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX21hcC5zZXQoa2V5LCBpdGVtKTtcbiAgICAgICAgICAgIHRoaXMuX3NpemUrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGVsZXRlKGtleSkge1xuICAgICAgICByZXR1cm4gISF0aGlzLnJlbW92ZShrZXkpO1xuICAgIH1cbiAgICByZW1vdmUoa2V5KSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl9tYXAuZ2V0KGtleSk7XG4gICAgICAgIGlmICghaXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tYXAuZGVsZXRlKGtleSk7XG4gICAgICAgIHRoaXMucmVtb3ZlSXRlbShpdGVtKTtcbiAgICAgICAgdGhpcy5fc2l6ZS0tO1xuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICB9XG4gICAgc2hpZnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5faGVhZCAmJiAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2hlYWQgfHwgIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIHRoaXMuX21hcC5kZWxldGUoaXRlbS5rZXkpO1xuICAgICAgICB0aGlzLnJlbW92ZUl0ZW0oaXRlbSk7XG4gICAgICAgIHRoaXMuX3NpemUtLTtcbiAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7XG4gICAgfVxuICAgIGZvckVhY2goY2FsbGJhY2tmbiwgdGhpc0FyZykge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3N0YXRlO1xuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICAgICAgICBpZiAodGhpc0FyZykge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrZm4uYmluZCh0aGlzQXJnKShjdXJyZW50LnZhbHVlLCBjdXJyZW50LmtleSwgdGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFja2ZuKGN1cnJlbnQudmFsdWUsIGN1cnJlbnQua2V5LCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gc3RhdGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExpbmtlZE1hcCBnb3QgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAga2V5cygpIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9zdGF0ZTtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLl9oZWFkO1xuICAgICAgICBjb25zdCBpdGVyYXRvciA9IHtcbiAgICAgICAgICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fc3RhdGUgIT09IHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTGlua2VkTWFwIGdvdCBtb2RpZmllZCBkdXJpbmcgaXRlcmF0aW9uLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7IHZhbHVlOiBjdXJyZW50LmtleSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICB9XG4gICAgdmFsdWVzKCkge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3N0YXRlO1xuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIGNvbnN0IGl0ZXJhdG9yID0ge1xuICAgICAgICAgICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlcmF0b3I7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBMaW5rZWRNYXAgZ290IG1vZGlmaWVkIGR1cmluZyBpdGVyYXRpb24uYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHsgdmFsdWU6IGN1cnJlbnQudmFsdWUsIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gaXRlcmF0b3I7XG4gICAgfVxuICAgIGVudHJpZXMoKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5fc3RhdGU7XG4gICAgICAgIGxldCBjdXJyZW50ID0gdGhpcy5faGVhZDtcbiAgICAgICAgY29uc3QgaXRlcmF0b3IgPSB7XG4gICAgICAgICAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3N0YXRlICE9PSBzdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExpbmtlZE1hcCBnb3QgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geyB2YWx1ZTogW2N1cnJlbnQua2V5LCBjdXJyZW50LnZhbHVlXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICB9XG4gICAgWyhfYSA9IFN5bWJvbC50b1N0cmluZ1RhZywgU3ltYm9sLml0ZXJhdG9yKV0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMoKTtcbiAgICB9XG4gICAgdHJpbU9sZChuZXdTaXplKSB7XG4gICAgICAgIGlmIChuZXdTaXplID49IHRoaXMuc2l6ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuZXdTaXplID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLl9oZWFkO1xuICAgICAgICBsZXQgY3VycmVudFNpemUgPSB0aGlzLnNpemU7XG4gICAgICAgIHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnRTaXplID4gbmV3U2l6ZSkge1xuICAgICAgICAgICAgdGhpcy5fbWFwLmRlbGV0ZShjdXJyZW50LmtleSk7XG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0O1xuICAgICAgICAgICAgY3VycmVudFNpemUtLTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9oZWFkID0gY3VycmVudDtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IGN1cnJlbnRTaXplO1xuICAgICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICAgICAgY3VycmVudC5wcmV2aW91cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgIH1cbiAgICBhZGRJdGVtRmlyc3QoaXRlbSkge1xuICAgICAgICAvLyBGaXJzdCB0aW1lIEluc2VydFxuICAgICAgICBpZiAoIXRoaXMuX2hlYWQgJiYgIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRoaXMuX3RhaWwgPSBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCF0aGlzLl9oZWFkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbGlzdCcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdGhpcy5faGVhZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQucHJldmlvdXMgPSBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2hlYWQgPSBpdGVtO1xuICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgIH1cbiAgICBhZGRJdGVtTGFzdChpdGVtKSB7XG4gICAgICAgIC8vIEZpcnN0IHRpbWUgSW5zZXJ0XG4gICAgICAgIGlmICghdGhpcy5faGVhZCAmJiAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgdGhpcy5faGVhZCA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpdGVtLnByZXZpb3VzID0gdGhpcy5fdGFpbDtcbiAgICAgICAgICAgIHRoaXMuX3RhaWwubmV4dCA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW07XG4gICAgICAgIHRoaXMuX3N0YXRlKys7XG4gICAgfVxuICAgIHJlbW92ZUl0ZW0oaXRlbSkge1xuICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCAmJiBpdGVtID09PSB0aGlzLl90YWlsKSB7XG4gICAgICAgICAgICB0aGlzLl9oZWFkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpdGVtID09PSB0aGlzLl9oZWFkKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGNhbiBvbmx5IGhhcHBlbmVkIGlmIHNpemUgPT09IDEgd2hpY2ggaXMgaGFuZGxlXG4gICAgICAgICAgICAvLyBieSB0aGUgY2FzZSBhYm92ZS5cbiAgICAgICAgICAgIGlmICghaXRlbS5uZXh0KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxpc3QnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGl0ZW0ubmV4dC5wcmV2aW91cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQgPSBpdGVtLm5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXRlbSA9PT0gdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgLy8gVGhpcyBjYW4gb25seSBoYXBwZW5lZCBpZiBzaXplID09PSAxIHdoaWNoIGlzIGhhbmRsZVxuICAgICAgICAgICAgLy8gYnkgdGhlIGNhc2UgYWJvdmUuXG4gICAgICAgICAgICBpZiAoIWl0ZW0ucHJldmlvdXMpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbGlzdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbS5wcmV2aW91cy5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gaXRlbS5uZXh0O1xuICAgICAgICAgICAgY29uc3QgcHJldmlvdXMgPSBpdGVtLnByZXZpb3VzO1xuICAgICAgICAgICAgaWYgKCFuZXh0IHx8ICFwcmV2aW91cykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXh0LnByZXZpb3VzID0gcHJldmlvdXM7XG4gICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gbmV4dDtcbiAgICAgICAgfVxuICAgICAgICBpdGVtLm5leHQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGl0ZW0ucHJldmlvdXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX3N0YXRlKys7XG4gICAgfVxuICAgIHRvdWNoKGl0ZW0sIHRvdWNoKSB7XG4gICAgICAgIGlmICghdGhpcy5faGVhZCB8fCAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxpc3QnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHRvdWNoICE9PSBUb3VjaC5GaXJzdCAmJiB0b3VjaCAhPT0gVG91Y2guTGFzdCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG91Y2ggPT09IFRvdWNoLkZpcnN0KSB7XG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBpdGVtLm5leHQ7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgICAgICAvLyBVbmxpbmsgdGhlIGl0ZW1cbiAgICAgICAgICAgIGlmIChpdGVtID09PSB0aGlzLl90YWlsKSB7XG4gICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgbXVzdCBiZSBkZWZpbmVkIHNpbmNlIGl0ZW0gd2FzIG5vdCBoZWFkIGJ1dCBpcyB0YWlsXG4gICAgICAgICAgICAgICAgLy8gU28gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbiBpdGVtIGluIHRoZSBtYXBcbiAgICAgICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuX3RhaWwgPSBwcmV2aW91cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEJvdGggbmV4dCBhbmQgcHJldmlvdXMgYXJlIG5vdCB1bmRlZmluZWQgc2luY2UgaXRlbSB3YXMgbmVpdGhlciBoZWFkIG5vciB0YWlsLlxuICAgICAgICAgICAgICAgIG5leHQucHJldmlvdXMgPSBwcmV2aW91cztcbiAgICAgICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEluc2VydCB0aGUgbm9kZSBhdCBoZWFkXG4gICAgICAgICAgICBpdGVtLnByZXZpb3VzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdGhpcy5faGVhZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQucHJldmlvdXMgPSBpdGVtO1xuICAgICAgICAgICAgdGhpcy5faGVhZCA9IGl0ZW07XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRvdWNoID09PSBUb3VjaC5MYXN0KSB7XG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBpdGVtLm5leHQ7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgICAgICAvLyBVbmxpbmsgdGhlIGl0ZW0uXG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCkge1xuICAgICAgICAgICAgICAgIC8vIG5leHQgbXVzdCBiZSBkZWZpbmVkIHNpbmNlIGl0ZW0gd2FzIG5vdCB0YWlsIGJ1dCBpcyBoZWFkXG4gICAgICAgICAgICAgICAgLy8gU28gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbiBpdGVtIGluIHRoZSBtYXBcbiAgICAgICAgICAgICAgICBuZXh0LnByZXZpb3VzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuX2hlYWQgPSBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQm90aCBuZXh0IGFuZCBwcmV2aW91cyBhcmUgbm90IHVuZGVmaW5lZCBzaW5jZSBpdGVtIHdhcyBuZWl0aGVyIGhlYWQgbm9yIHRhaWwuXG4gICAgICAgICAgICAgICAgbmV4dC5wcmV2aW91cyA9IHByZXZpb3VzO1xuICAgICAgICAgICAgICAgIHByZXZpb3VzLm5leHQgPSBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaXRlbS5wcmV2aW91cyA9IHRoaXMuX3RhaWw7XG4gICAgICAgICAgICB0aGlzLl90YWlsLm5leHQgPSBpdGVtO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW07XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IFtdO1xuICAgICAgICB0aGlzLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGRhdGEucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGZyb21KU09OKGRhdGEpIHtcbiAgICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBkYXRhKSB7XG4gICAgICAgICAgICB0aGlzLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuTGlua2VkTWFwID0gTGlua2VkTWFwO1xuY2xhc3MgTFJVQ2FjaGUgZXh0ZW5kcyBMaW5rZWRNYXAge1xuICAgIGNvbnN0cnVjdG9yKGxpbWl0LCByYXRpbyA9IDEpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fbGltaXQgPSBsaW1pdDtcbiAgICAgICAgdGhpcy5fcmF0aW8gPSBNYXRoLm1pbihNYXRoLm1heCgwLCByYXRpbyksIDEpO1xuICAgIH1cbiAgICBnZXQgbGltaXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9saW1pdDtcbiAgICB9XG4gICAgc2V0IGxpbWl0KGxpbWl0KSB7XG4gICAgICAgIHRoaXMuX2xpbWl0ID0gbGltaXQ7XG4gICAgICAgIHRoaXMuY2hlY2tUcmltKCk7XG4gICAgfVxuICAgIGdldCByYXRpbygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JhdGlvO1xuICAgIH1cbiAgICBzZXQgcmF0aW8ocmF0aW8pIHtcbiAgICAgICAgdGhpcy5fcmF0aW8gPSBNYXRoLm1pbihNYXRoLm1heCgwLCByYXRpbyksIDEpO1xuICAgICAgICB0aGlzLmNoZWNrVHJpbSgpO1xuICAgIH1cbiAgICBnZXQoa2V5LCB0b3VjaCA9IFRvdWNoLkFzTmV3KSB7XG4gICAgICAgIHJldHVybiBzdXBlci5nZXQoa2V5LCB0b3VjaCk7XG4gICAgfVxuICAgIHBlZWsoa2V5KSB7XG4gICAgICAgIHJldHVybiBzdXBlci5nZXQoa2V5LCBUb3VjaC5Ob25lKTtcbiAgICB9XG4gICAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgc3VwZXIuc2V0KGtleSwgdmFsdWUsIFRvdWNoLkxhc3QpO1xuICAgICAgICB0aGlzLmNoZWNrVHJpbSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgY2hlY2tUcmltKCkge1xuICAgICAgICBpZiAodGhpcy5zaXplID4gdGhpcy5fbGltaXQpIHtcbiAgICAgICAgICAgIHRoaXMudHJpbU9sZChNYXRoLnJvdW5kKHRoaXMuX2xpbWl0ICogdGhpcy5fcmF0aW8pKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuTFJVQ2FjaGUgPSBMUlVDYWNoZTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5EaXNwb3NhYmxlID0gdm9pZCAwO1xudmFyIERpc3Bvc2FibGU7XG4oZnVuY3Rpb24gKERpc3Bvc2FibGUpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUoZnVuYykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGlzcG9zZTogZnVuY1xuICAgICAgICB9O1xuICAgIH1cbiAgICBEaXNwb3NhYmxlLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKERpc3Bvc2FibGUgfHwgKGV4cG9ydHMuRGlzcG9zYWJsZSA9IERpc3Bvc2FibGUgPSB7fSkpO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xubGV0IF9yYWw7XG5mdW5jdGlvbiBSQUwoKSB7XG4gICAgaWYgKF9yYWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHJ1bnRpbWUgYWJzdHJhY3Rpb24gbGF5ZXIgaW5zdGFsbGVkYCk7XG4gICAgfVxuICAgIHJldHVybiBfcmFsO1xufVxuKGZ1bmN0aW9uIChSQUwpIHtcbiAgICBmdW5jdGlvbiBpbnN0YWxsKHJhbCkge1xuICAgICAgICBpZiAocmFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gcnVudGltZSBhYnN0cmFjdGlvbiBsYXllciBwcm92aWRlZGApO1xuICAgICAgICB9XG4gICAgICAgIF9yYWwgPSByYWw7XG4gICAgfVxuICAgIFJBTC5pbnN0YWxsID0gaW5zdGFsbDtcbn0pKFJBTCB8fCAoUkFMID0ge30pKTtcbmV4cG9ydHMuZGVmYXVsdCA9IFJBTDtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuRW1pdHRlciA9IGV4cG9ydHMuRXZlbnQgPSB2b2lkIDA7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbnZhciBFdmVudDtcbihmdW5jdGlvbiAoRXZlbnQpIHtcbiAgICBjb25zdCBfZGlzcG9zYWJsZSA9IHsgZGlzcG9zZSgpIHsgfSB9O1xuICAgIEV2ZW50Lk5vbmUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBfZGlzcG9zYWJsZTsgfTtcbn0pKEV2ZW50IHx8IChleHBvcnRzLkV2ZW50ID0gRXZlbnQgPSB7fSkpO1xuY2xhc3MgQ2FsbGJhY2tMaXN0IHtcbiAgICBhZGQoY2FsbGJhY2ssIGNvbnRleHQgPSBudWxsLCBidWNrZXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fY29udGV4dHMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgICAgIHRoaXMuX2NvbnRleHRzLnB1c2goY29udGV4dCk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGJ1Y2tldCkpIHtcbiAgICAgICAgICAgIGJ1Y2tldC5wdXNoKHsgZGlzcG9zZTogKCkgPT4gdGhpcy5yZW1vdmUoY2FsbGJhY2ssIGNvbnRleHQpIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlbW92ZShjYWxsYmFjaywgY29udGV4dCA9IG51bGwpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZm91bmRDYWxsYmFja1dpdGhEaWZmZXJlbnRDb250ZXh0ID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLl9jYWxsYmFja3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jYWxsYmFja3NbaV0gPT09IGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NvbnRleHRzW2ldID09PSBjb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrICYgY29udGV4dCBtYXRjaCA9PiByZW1vdmUgaXRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29udGV4dHMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZENhbGxiYWNrV2l0aERpZmZlcmVudENvbnRleHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZm91bmRDYWxsYmFja1dpdGhEaWZmZXJlbnRDb250ZXh0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1doZW4gYWRkaW5nIGEgbGlzdGVuZXIgd2l0aCBhIGNvbnRleHQsIHlvdSBzaG91bGQgcmVtb3ZlIGl0IHdpdGggdGhlIHNhbWUgY29udGV4dCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGludm9rZSguLi5hcmdzKSB7XG4gICAgICAgIGlmICghdGhpcy5fY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmV0ID0gW10sIGNhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcy5zbGljZSgwKSwgY29udGV4dHMgPSB0aGlzLl9jb250ZXh0cy5zbGljZSgwKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXQucHVzaChjYWxsYmFja3NbaV0uYXBwbHkoY29udGV4dHNbaV0sIGFyZ3MpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS5jb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICAgIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5fY2FsbGJhY2tzIHx8IHRoaXMuX2NhbGxiYWNrcy5sZW5ndGggPT09IDA7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fY29udGV4dHMgPSB1bmRlZmluZWQ7XG4gICAgfVxufVxuY2xhc3MgRW1pdHRlciB7XG4gICAgY29uc3RydWN0b3IoX29wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IF9vcHRpb25zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGb3IgdGhlIHB1YmxpYyB0byBhbGxvdyB0byBzdWJzY3JpYmVcbiAgICAgKiB0byBldmVudHMgZnJvbSB0aGlzIEVtaXR0ZXJcbiAgICAgKi9cbiAgICBnZXQgZXZlbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fZXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50ID0gKGxpc3RlbmVyLCB0aGlzQXJncywgZGlzcG9zYWJsZXMpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2NhbGxiYWNrcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWxsYmFja3MgPSBuZXcgQ2FsbGJhY2tMaXN0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMub25GaXJzdExpc3RlbmVyQWRkICYmIHRoaXMuX2NhbGxiYWNrcy5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy5vbkZpcnN0TGlzdGVuZXJBZGQodGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5hZGQobGlzdGVuZXIsIHRoaXNBcmdzKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlzcG9zYWJsZSBpcyBkaXNwb3NlZCBhZnRlciBlbWl0dGVyIGlzIGRpc3Bvc2VkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5yZW1vdmUobGlzdGVuZXIsIHRoaXNBcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5kaXNwb3NlID0gRW1pdHRlci5fbm9vcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMub25MYXN0TGlzdGVuZXJSZW1vdmUgJiYgdGhpcy5fY2FsbGJhY2tzLmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29wdGlvbnMub25MYXN0TGlzdGVuZXJSZW1vdmUodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRpc3Bvc2FibGVzKSkge1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlcy5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9ldmVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVG8gYmUga2VwdCBwcml2YXRlIHRvIGZpcmUgYW4gZXZlbnQgdG9cbiAgICAgKiBzdWJzY3JpYmVyc1xuICAgICAqL1xuICAgIGZpcmUoZXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NhbGxiYWNrcykge1xuICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzLmludm9rZS5jYWxsKHRoaXMuX2NhbGxiYWNrcywgZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5kaXNwb3NlKCk7XG4gICAgICAgICAgICB0aGlzLl9jYWxsYmFja3MgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLkVtaXR0ZXIgPSBFbWl0dGVyO1xuRW1pdHRlci5fbm9vcCA9IGZ1bmN0aW9uICgpIHsgfTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uVG9rZW4gPSB2b2lkIDA7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbmNvbnN0IElzID0gcmVxdWlyZShcIi4vaXNcIik7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCIuL2V2ZW50c1wiKTtcbnZhciBDYW5jZWxsYXRpb25Ub2tlbjtcbihmdW5jdGlvbiAoQ2FuY2VsbGF0aW9uVG9rZW4pIHtcbiAgICBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGlzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkOiBmYWxzZSxcbiAgICAgICAgb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6IGV2ZW50c18xLkV2ZW50Lk5vbmVcbiAgICB9KTtcbiAgICBDYW5jZWxsYXRpb25Ub2tlbi5DYW5jZWxsZWQgPSBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6IHRydWUsXG4gICAgICAgIG9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkOiBldmVudHNfMS5FdmVudC5Ob25lXG4gICAgfSk7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgKGNhbmRpZGF0ZSA9PT0gQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZVxuICAgICAgICAgICAgfHwgY2FuZGlkYXRlID09PSBDYW5jZWxsYXRpb25Ub2tlbi5DYW5jZWxsZWRcbiAgICAgICAgICAgIHx8IChJcy5ib29sZWFuKGNhbmRpZGF0ZS5pc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkgJiYgISFjYW5kaWRhdGUub25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQpKTtcbiAgICB9XG4gICAgQ2FuY2VsbGF0aW9uVG9rZW4uaXMgPSBpcztcbn0pKENhbmNlbGxhdGlvblRva2VuIHx8IChleHBvcnRzLkNhbmNlbGxhdGlvblRva2VuID0gQ2FuY2VsbGF0aW9uVG9rZW4gPSB7fSkpO1xuY29uc3Qgc2hvcnRjdXRFdmVudCA9IE9iamVjdC5mcmVlemUoZnVuY3Rpb24gKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgY29uc3QgaGFuZGxlID0gKDAsIHJhbF8xLmRlZmF1bHQpKCkudGltZXIuc2V0VGltZW91dChjYWxsYmFjay5iaW5kKGNvbnRleHQpLCAwKTtcbiAgICByZXR1cm4geyBkaXNwb3NlKCkgeyBoYW5kbGUuZGlzcG9zZSgpOyB9IH07XG59KTtcbmNsYXNzIE11dGFibGVUb2tlbiB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX2lzQ2FuY2VsbGVkID0gZmFsc2U7XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9pc0NhbmNlbGxlZCkge1xuICAgICAgICAgICAgdGhpcy5faXNDYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2VtaXR0ZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmZpcmUodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0NhbmNlbGxlZDtcbiAgICB9XG4gICAgZ2V0IG9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKCkge1xuICAgICAgICBpZiAodGhpcy5faXNDYW5jZWxsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBzaG9ydGN1dEV2ZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5fZW1pdHRlcikge1xuICAgICAgICAgICAgdGhpcy5fZW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2VtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLl9lbWl0dGVyKSB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5jbGFzcyBDYW5jZWxsYXRpb25Ub2tlblNvdXJjZSB7XG4gICAgZ2V0IHRva2VuKCkge1xuICAgICAgICBpZiAoIXRoaXMuX3Rva2VuKSB7XG4gICAgICAgICAgICAvLyBiZSBsYXp5IGFuZCBjcmVhdGUgdGhlIHRva2VuIG9ubHkgd2hlblxuICAgICAgICAgICAgLy8gYWN0dWFsbHkgbmVlZGVkXG4gICAgICAgICAgICB0aGlzLl90b2tlbiA9IG5ldyBNdXRhYmxlVG9rZW4oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fdG9rZW47XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl90b2tlbikge1xuICAgICAgICAgICAgLy8gc2F2ZSBhbiBvYmplY3QgYnkgcmV0dXJuaW5nIHRoZSBkZWZhdWx0XG4gICAgICAgICAgICAvLyBjYW5jZWxsZWQgdG9rZW4gd2hlbiBjYW5jZWxsYXRpb24gaGFwcGVuc1xuICAgICAgICAgICAgLy8gYmVmb3JlIHNvbWVvbmUgYXNrcyBmb3IgdGhlIHRva2VuXG4gICAgICAgICAgICB0aGlzLl90b2tlbiA9IENhbmNlbGxhdGlvblRva2VuLkNhbmNlbGxlZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3Rva2VuLmNhbmNlbCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICghdGhpcy5fdG9rZW4pIHtcbiAgICAgICAgICAgIC8vIGVuc3VyZSB0byBpbml0aWFsaXplIHdpdGggYW4gZW1wdHkgdG9rZW4gaWYgd2UgaGFkIG5vbmVcbiAgICAgICAgICAgIHRoaXMuX3Rva2VuID0gQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLl90b2tlbiBpbnN0YW5jZW9mIE11dGFibGVUb2tlbikge1xuICAgICAgICAgICAgLy8gYWN0dWFsbHkgZGlzcG9zZVxuICAgICAgICAgICAgdGhpcy5fdG9rZW4uZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IENhbmNlbGxhdGlvblRva2VuU291cmNlO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3kgPSB2b2lkIDA7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbnZhciBDYW5jZWxsYXRpb25TdGF0ZTtcbihmdW5jdGlvbiAoQ2FuY2VsbGF0aW9uU3RhdGUpIHtcbiAgICBDYW5jZWxsYXRpb25TdGF0ZS5Db250aW51ZSA9IDA7XG4gICAgQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkID0gMTtcbn0pKENhbmNlbGxhdGlvblN0YXRlIHx8IChDYW5jZWxsYXRpb25TdGF0ZSA9IHt9KSk7XG5jbGFzcyBTaGFyZWRBcnJheVNlbmRlclN0cmF0ZWd5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5idWZmZXJzID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICBlbmFibGVDYW5jZWxsYXRpb24ocmVxdWVzdCkge1xuICAgICAgICBpZiAocmVxdWVzdC5pZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBTaGFyZWRBcnJheUJ1ZmZlcig0KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBJbnQzMkFycmF5KGJ1ZmZlciwgMCwgMSk7XG4gICAgICAgIGRhdGFbMF0gPSBDYW5jZWxsYXRpb25TdGF0ZS5Db250aW51ZTtcbiAgICAgICAgdGhpcy5idWZmZXJzLnNldChyZXF1ZXN0LmlkLCBidWZmZXIpO1xuICAgICAgICByZXF1ZXN0LiRjYW5jZWxsYXRpb25EYXRhID0gYnVmZmVyO1xuICAgIH1cbiAgICBhc3luYyBzZW5kQ2FuY2VsbGF0aW9uKF9jb25uLCBpZCkge1xuICAgICAgICBjb25zdCBidWZmZXIgPSB0aGlzLmJ1ZmZlcnMuZ2V0KGlkKTtcbiAgICAgICAgaWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBJbnQzMkFycmF5KGJ1ZmZlciwgMCwgMSk7XG4gICAgICAgIEF0b21pY3Muc3RvcmUoZGF0YSwgMCwgQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkKTtcbiAgICB9XG4gICAgY2xlYW51cChpZCkge1xuICAgICAgICB0aGlzLmJ1ZmZlcnMuZGVsZXRlKGlkKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy5idWZmZXJzLmNsZWFyKCk7XG4gICAgfVxufVxuZXhwb3J0cy5TaGFyZWRBcnJheVNlbmRlclN0cmF0ZWd5ID0gU2hhcmVkQXJyYXlTZW5kZXJTdHJhdGVneTtcbmNsYXNzIFNoYXJlZEFycmF5QnVmZmVyQ2FuY2VsbGF0aW9uVG9rZW4ge1xuICAgIGNvbnN0cnVjdG9yKGJ1ZmZlcikge1xuICAgICAgICB0aGlzLmRhdGEgPSBuZXcgSW50MzJBcnJheShidWZmZXIsIDAsIDEpO1xuICAgIH1cbiAgICBnZXQgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHJldHVybiBBdG9taWNzLmxvYWQodGhpcy5kYXRhLCAwKSA9PT0gQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkO1xuICAgIH1cbiAgICBnZXQgb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuY2VsbGF0aW9uIG92ZXIgU2hhcmVkQXJyYXlCdWZmZXIgZG9lc24ndCBzdXBwb3J0IGNhbmNlbGxhdGlvbiBldmVudHNgKTtcbiAgICB9XG59XG5jbGFzcyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuU291cmNlIHtcbiAgICBjb25zdHJ1Y3RvcihidWZmZXIpIHtcbiAgICAgICAgdGhpcy50b2tlbiA9IG5ldyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuKGJ1ZmZlcik7XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICB9XG59XG5jbGFzcyBTaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmtpbmQgPSAncmVxdWVzdCc7XG4gICAgfVxuICAgIGNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKHJlcXVlc3QpIHtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gcmVxdWVzdC4kY2FuY2VsbGF0aW9uRGF0YTtcbiAgICAgICAgaWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuU291cmNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuU291cmNlKGJ1ZmZlcik7XG4gICAgfVxufVxuZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBTaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3k7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNlbWFwaG9yZSA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY2xhc3MgU2VtYXBob3JlIHtcbiAgICBjb25zdHJ1Y3RvcihjYXBhY2l0eSA9IDEpIHtcbiAgICAgICAgaWYgKGNhcGFjaXR5IDw9IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FwYWNpdHkgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NhcGFjaXR5ID0gY2FwYWNpdHk7XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IDA7XG4gICAgICAgIHRoaXMuX3dhaXRpbmcgPSBbXTtcbiAgICB9XG4gICAgbG9jayh0aHVuaykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fd2FpdGluZy5wdXNoKHsgdGh1bmssIHJlc29sdmUsIHJlamVjdCB9KTtcbiAgICAgICAgICAgIHRoaXMucnVuTmV4dCgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0IGFjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTtcbiAgICB9XG4gICAgcnVuTmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dhaXRpbmcubGVuZ3RoID09PSAwIHx8IHRoaXMuX2FjdGl2ZSA9PT0gdGhpcy5fY2FwYWNpdHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS50aW1lci5zZXRJbW1lZGlhdGUoKCkgPT4gdGhpcy5kb1J1bk5leHQoKSk7XG4gICAgfVxuICAgIGRvUnVuTmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dhaXRpbmcubGVuZ3RoID09PSAwIHx8IHRoaXMuX2FjdGl2ZSA9PT0gdGhpcy5fY2FwYWNpdHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5fd2FpdGluZy5zaGlmdCgpO1xuICAgICAgICB0aGlzLl9hY3RpdmUrKztcbiAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZSA+IHRoaXMuX2NhcGFjaXR5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRvIG1hbnkgdGh1bmtzIGFjdGl2ZWApO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXh0LnRodW5rKCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC50aGVuKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5yZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5OZXh0KCk7XG4gICAgICAgICAgICAgICAgfSwgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5yZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5OZXh0KCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICBuZXh0LnJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1bk5leHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgIG5leHQucmVqZWN0KGVycik7XG4gICAgICAgICAgICB0aGlzLnJ1bk5leHQoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuU2VtYXBob3JlID0gU2VtYXBob3JlO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXIgPSBleHBvcnRzLkFic3RyYWN0TWVzc2FnZVJlYWRlciA9IGV4cG9ydHMuTWVzc2FnZVJlYWRlciA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IGV2ZW50c18xID0gcmVxdWlyZShcIi4vZXZlbnRzXCIpO1xuY29uc3Qgc2VtYXBob3JlXzEgPSByZXF1aXJlKFwiLi9zZW1hcGhvcmVcIik7XG52YXIgTWVzc2FnZVJlYWRlcjtcbihmdW5jdGlvbiAoTWVzc2FnZVJlYWRlcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5saXN0ZW4pICYmIElzLmZ1bmMoY2FuZGlkYXRlLmRpc3Bvc2UpICYmXG4gICAgICAgICAgICBJcy5mdW5jKGNhbmRpZGF0ZS5vbkVycm9yKSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5vbkNsb3NlKSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5vblBhcnRpYWxNZXNzYWdlKTtcbiAgICB9XG4gICAgTWVzc2FnZVJlYWRlci5pcyA9IGlzO1xufSkoTWVzc2FnZVJlYWRlciB8fCAoZXhwb3J0cy5NZXNzYWdlUmVhZGVyID0gTWVzc2FnZVJlYWRlciA9IHt9KSk7XG5jbGFzcyBBYnN0cmFjdE1lc3NhZ2VSZWFkZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZUVtaXR0ZXIgPSBuZXcgZXZlbnRzXzEuRW1pdHRlcigpO1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlci5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgZ2V0IG9uRXJyb3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVycm9yRW1pdHRlci5ldmVudDtcbiAgICB9XG4gICAgZmlyZUVycm9yKGVycm9yKSB7XG4gICAgICAgIHRoaXMuZXJyb3JFbWl0dGVyLmZpcmUodGhpcy5hc0Vycm9yKGVycm9yKSk7XG4gICAgfVxuICAgIGdldCBvbkNsb3NlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9zZUVtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGZpcmVDbG9zZSgpIHtcbiAgICAgICAgdGhpcy5jbG9zZUVtaXR0ZXIuZmlyZSh1bmRlZmluZWQpO1xuICAgIH1cbiAgICBnZXQgb25QYXJ0aWFsTWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFydGlhbE1lc3NhZ2VFbWl0dGVyLmV2ZW50O1xuICAgIH1cbiAgICBmaXJlUGFydGlhbE1lc3NhZ2UoaW5mbykge1xuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlRW1pdHRlci5maXJlKGluZm8pO1xuICAgIH1cbiAgICBhc0Vycm9yKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKGBSZWFkZXIgcmVjZWl2ZWQgZXJyb3IuIFJlYXNvbjogJHtJcy5zdHJpbmcoZXJyb3IubWVzc2FnZSkgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24nfWApO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VSZWFkZXIgPSBBYnN0cmFjdE1lc3NhZ2VSZWFkZXI7XG52YXIgUmVzb2x2ZWRNZXNzYWdlUmVhZGVyT3B0aW9ucztcbihmdW5jdGlvbiAoUmVzb2x2ZWRNZXNzYWdlUmVhZGVyT3B0aW9ucykge1xuICAgIGZ1bmN0aW9uIGZyb21PcHRpb25zKG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IGNoYXJzZXQ7XG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIGxldCBjb250ZW50RGVjb2RlcjtcbiAgICAgICAgY29uc3QgY29udGVudERlY29kZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICBsZXQgY29udGVudFR5cGVEZWNvZGVyO1xuICAgICAgICBjb25zdCBjb250ZW50VHlwZURlY29kZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY2hhcnNldCA9IG9wdGlvbnMgPz8gJ3V0Zi04JztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNoYXJzZXQgPSBvcHRpb25zLmNoYXJzZXQgPz8gJ3V0Zi04JztcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnREZWNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50RGVjb2RlciA9IG9wdGlvbnMuY29udGVudERlY29kZXI7XG4gICAgICAgICAgICAgICAgY29udGVudERlY29kZXJzLnNldChjb250ZW50RGVjb2Rlci5uYW1lLCBjb250ZW50RGVjb2Rlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5jb250ZW50RGVjb2RlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGVjb2RlciBvZiBvcHRpb25zLmNvbnRlbnREZWNvZGVycykge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50RGVjb2RlcnMuc2V0KGRlY29kZXIubmFtZSwgZGVjb2Rlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuY29udGVudFR5cGVEZWNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXIgPSBvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcjtcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXJzLnNldChjb250ZW50VHlwZURlY29kZXIubmFtZSwgY29udGVudFR5cGVEZWNvZGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGVjb2RlciBvZiBvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGVEZWNvZGVycy5zZXQoZGVjb2Rlci5uYW1lLCBkZWNvZGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnRlbnRUeXBlRGVjb2RlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXIgPSAoMCwgcmFsXzEuZGVmYXVsdCkoKS5hcHBsaWNhdGlvbkpzb24uZGVjb2RlcjtcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlRGVjb2RlcnMuc2V0KGNvbnRlbnRUeXBlRGVjb2Rlci5uYW1lLCBjb250ZW50VHlwZURlY29kZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGNoYXJzZXQsIGNvbnRlbnREZWNvZGVyLCBjb250ZW50RGVjb2RlcnMsIGNvbnRlbnRUeXBlRGVjb2RlciwgY29udGVudFR5cGVEZWNvZGVycyB9O1xuICAgIH1cbiAgICBSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zLmZyb21PcHRpb25zID0gZnJvbU9wdGlvbnM7XG59KShSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zIHx8IChSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zID0ge30pKTtcbmNsYXNzIFJlYWRhYmxlU3RyZWFtTWVzc2FnZVJlYWRlciBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVJlYWRlciB7XG4gICAgY29uc3RydWN0b3IocmVhZGFibGUsIG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZSA9IHJlYWRhYmxlO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zLmZyb21PcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmJ1ZmZlciA9ICgwLCByYWxfMS5kZWZhdWx0KSgpLm1lc3NhZ2VCdWZmZXIuY3JlYXRlKHRoaXMub3B0aW9ucy5jaGFyc2V0KTtcbiAgICAgICAgdGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0ID0gMTAwMDA7XG4gICAgICAgIHRoaXMubmV4dE1lc3NhZ2VMZW5ndGggPSAtMTtcbiAgICAgICAgdGhpcy5tZXNzYWdlVG9rZW4gPSAwO1xuICAgICAgICB0aGlzLnJlYWRTZW1hcGhvcmUgPSBuZXcgc2VtYXBob3JlXzEuU2VtYXBob3JlKDEpO1xuICAgIH1cbiAgICBzZXQgcGFydGlhbE1lc3NhZ2VUaW1lb3V0KHRpbWVvdXQpIHtcbiAgICAgICAgdGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0ID0gdGltZW91dDtcbiAgICB9XG4gICAgZ2V0IHBhcnRpYWxNZXNzYWdlVGltZW91dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dDtcbiAgICB9XG4gICAgbGlzdGVuKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMubmV4dE1lc3NhZ2VMZW5ndGggPSAtMTtcbiAgICAgICAgdGhpcy5tZXNzYWdlVG9rZW4gPSAwO1xuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlVGltZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5yZWFkYWJsZS5vbkRhdGEoKGRhdGEpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25EYXRhKGRhdGEpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZS5vbkVycm9yKChlcnJvcikgPT4gdGhpcy5maXJlRXJyb3IoZXJyb3IpKTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZS5vbkNsb3NlKCgpID0+IHRoaXMuZmlyZUNsb3NlKCkpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBvbkRhdGEoZGF0YSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5idWZmZXIuYXBwZW5kKGRhdGEpO1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IHRoaXMuYnVmZmVyLnRyeVJlYWRIZWFkZXJzKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50TGVuZ3RoID0gaGVhZGVycy5nZXQoJ2NvbnRlbnQtbGVuZ3RoJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY29udGVudExlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IobmV3IEVycm9yKGBIZWFkZXIgbXVzdCBwcm92aWRlIGEgQ29udGVudC1MZW5ndGggcHJvcGVydHkuXFxuJHtKU09OLnN0cmluZ2lmeShPYmplY3QuZnJvbUVudHJpZXMoaGVhZGVycykpfWApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsZW5ndGggPSBwYXJzZUludChjb250ZW50TGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKGxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKG5ldyBFcnJvcihgQ29udGVudC1MZW5ndGggdmFsdWUgbXVzdCBiZSBhIG51bWJlci4gR290ICR7Y29udGVudExlbmd0aH1gKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IHRoaXMuYnVmZmVyLnRyeVJlYWRCb2R5KHRoaXMubmV4dE1lc3NhZ2VMZW5ndGgpO1xuICAgICAgICAgICAgICAgIGlmIChib2R5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLyoqIFdlIGhhdmVuJ3QgcmVjZWl2ZWQgdGhlIGZ1bGwgbWVzc2FnZSB5ZXQuICovXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0UGFydGlhbE1lc3NhZ2VUaW1lcigpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJQYXJ0aWFsTWVzc2FnZVRpbWVyKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9IC0xO1xuICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHdlIGNvbnZlcnQgb25lIHJlY2VpdmVkIG1lc3NhZ2UgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAgICAgLy8gb3RoZXIuIE90aGVyd2lzZSBpdCBjb3VsZCBoYXBwZW4gdGhhdCBhIGRlY29kaW5nIG9mIGEgc2Vjb25kXG4gICAgICAgICAgICAgICAgLy8gc21hbGxlciBtZXNzYWdlIGZpbmlzaGVkIGJlZm9yZSB0aGUgZGVjb2Rpbmcgb2YgYSBmaXJzdCBsYXJnZXJcbiAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIGFuZCB0aGVuIHdlIHdvdWxkIGRlbGl2ZXIgdGhlIHNlY29uZCBtZXNzYWdlIGZpcnN0LlxuICAgICAgICAgICAgICAgIHRoaXMucmVhZFNlbWFwaG9yZS5sb2NrKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnl0ZXMgPSB0aGlzLm9wdGlvbnMuY29udGVudERlY29kZXIgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBhd2FpdCB0aGlzLm9wdGlvbnMuY29udGVudERlY29kZXIuZGVjb2RlKGJvZHkpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGJvZHk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBhd2FpdCB0aGlzLm9wdGlvbnMuY29udGVudFR5cGVEZWNvZGVyLmRlY29kZShieXRlcywgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjayhtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNsZWFyUGFydGlhbE1lc3NhZ2VUaW1lcigpIHtcbiAgICAgICAgaWYgKHRoaXMucGFydGlhbE1lc3NhZ2VUaW1lcikge1xuICAgICAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZVRpbWVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRoaXMucGFydGlhbE1lc3NhZ2VUaW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRQYXJ0aWFsTWVzc2FnZVRpbWVyKCkge1xuICAgICAgICB0aGlzLmNsZWFyUGFydGlhbE1lc3NhZ2VUaW1lcigpO1xuICAgICAgICBpZiAodGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0IDw9IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlVGltZXIgPSAoMCwgcmFsXzEuZGVmYXVsdCkoKS50aW1lci5zZXRUaW1lb3V0KCh0b2tlbiwgdGltZW91dCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZVRpbWVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRva2VuID09PSB0aGlzLm1lc3NhZ2VUb2tlbikge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZVBhcnRpYWxNZXNzYWdlKHsgbWVzc2FnZVRva2VuOiB0b2tlbiwgd2FpdGluZ1RpbWU6IHRpbWVvdXQgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRQYXJ0aWFsTWVzc2FnZVRpbWVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dCwgdGhpcy5tZXNzYWdlVG9rZW4sIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dCk7XG4gICAgfVxufVxuZXhwb3J0cy5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXIgPSBSZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLldyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLkFic3RyYWN0TWVzc2FnZVdyaXRlciA9IGV4cG9ydHMuTWVzc2FnZVdyaXRlciA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IHNlbWFwaG9yZV8xID0gcmVxdWlyZShcIi4vc2VtYXBob3JlXCIpO1xuY29uc3QgZXZlbnRzXzEgPSByZXF1aXJlKFwiLi9ldmVudHNcIik7XG5jb25zdCBDb250ZW50TGVuZ3RoID0gJ0NvbnRlbnQtTGVuZ3RoOiAnO1xuY29uc3QgQ1JMRiA9ICdcXHJcXG4nO1xudmFyIE1lc3NhZ2VXcml0ZXI7XG4oZnVuY3Rpb24gKE1lc3NhZ2VXcml0ZXIpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgSXMuZnVuYyhjYW5kaWRhdGUuZGlzcG9zZSkgJiYgSXMuZnVuYyhjYW5kaWRhdGUub25DbG9zZSkgJiZcbiAgICAgICAgICAgIElzLmZ1bmMoY2FuZGlkYXRlLm9uRXJyb3IpICYmIElzLmZ1bmMoY2FuZGlkYXRlLndyaXRlKTtcbiAgICB9XG4gICAgTWVzc2FnZVdyaXRlci5pcyA9IGlzO1xufSkoTWVzc2FnZVdyaXRlciB8fCAoZXhwb3J0cy5NZXNzYWdlV3JpdGVyID0gTWVzc2FnZVdyaXRlciA9IHt9KSk7XG5jbGFzcyBBYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy5lcnJvckVtaXR0ZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLmNsb3NlRW1pdHRlci5kaXNwb3NlKCk7XG4gICAgfVxuICAgIGdldCBvbkVycm9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lcnJvckVtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGZpcmVFcnJvcihlcnJvciwgbWVzc2FnZSwgY291bnQpIHtcbiAgICAgICAgdGhpcy5lcnJvckVtaXR0ZXIuZmlyZShbdGhpcy5hc0Vycm9yKGVycm9yKSwgbWVzc2FnZSwgY291bnRdKTtcbiAgICB9XG4gICAgZ2V0IG9uQ2xvc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb3NlRW1pdHRlci5ldmVudDtcbiAgICB9XG4gICAgZmlyZUNsb3NlKCkge1xuICAgICAgICB0aGlzLmNsb3NlRW1pdHRlci5maXJlKHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIGFzRXJyb3IoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoYFdyaXRlciByZWNlaXZlZCBlcnJvci4gUmVhc29uOiAke0lzLnN0cmluZyhlcnJvci5tZXNzYWdlKSA/IGVycm9yLm1lc3NhZ2UgOiAndW5rbm93bid9YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLkFic3RyYWN0TWVzc2FnZVdyaXRlciA9IEFic3RyYWN0TWVzc2FnZVdyaXRlcjtcbnZhciBSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zO1xuKGZ1bmN0aW9uIChSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zKSB7XG4gICAgZnVuY3Rpb24gZnJvbU9wdGlvbnMob3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHsgY2hhcnNldDogb3B0aW9ucyA/PyAndXRmLTgnLCBjb250ZW50VHlwZUVuY29kZXI6ICgwLCByYWxfMS5kZWZhdWx0KSgpLmFwcGxpY2F0aW9uSnNvbi5lbmNvZGVyIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4geyBjaGFyc2V0OiBvcHRpb25zLmNoYXJzZXQgPz8gJ3V0Zi04JywgY29udGVudEVuY29kZXI6IG9wdGlvbnMuY29udGVudEVuY29kZXIsIGNvbnRlbnRUeXBlRW5jb2Rlcjogb3B0aW9ucy5jb250ZW50VHlwZUVuY29kZXIgPz8gKDAsIHJhbF8xLmRlZmF1bHQpKCkuYXBwbGljYXRpb25Kc29uLmVuY29kZXIgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zLmZyb21PcHRpb25zID0gZnJvbU9wdGlvbnM7XG59KShSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zIHx8IChSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zID0ge30pKTtcbmNsYXNzIFdyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKHdyaXRhYmxlLCBvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMud3JpdGFibGUgPSB3cml0YWJsZTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gUmVzb2x2ZWRNZXNzYWdlV3JpdGVyT3B0aW9ucy5mcm9tT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50ID0gMDtcbiAgICAgICAgdGhpcy53cml0ZVNlbWFwaG9yZSA9IG5ldyBzZW1hcGhvcmVfMS5TZW1hcGhvcmUoMSk7XG4gICAgICAgIHRoaXMud3JpdGFibGUub25FcnJvcigoZXJyb3IpID0+IHRoaXMuZmlyZUVycm9yKGVycm9yKSk7XG4gICAgICAgIHRoaXMud3JpdGFibGUub25DbG9zZSgoKSA9PiB0aGlzLmZpcmVDbG9zZSgpKTtcbiAgICB9XG4gICAgYXN5bmMgd3JpdGUobXNnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndyaXRlU2VtYXBob3JlLmxvY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHRoaXMub3B0aW9ucy5jb250ZW50VHlwZUVuY29kZXIuZW5jb2RlKG1zZywgdGhpcy5vcHRpb25zKS50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNvbnRlbnRFbmNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jb250ZW50RW5jb2Rlci5lbmNvZGUoYnVmZmVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZC50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJzID0gW107XG4gICAgICAgICAgICAgICAgaGVhZGVycy5wdXNoKENvbnRlbnRMZW5ndGgsIGJ1ZmZlci5ieXRlTGVuZ3RoLnRvU3RyaW5nKCksIENSTEYpO1xuICAgICAgICAgICAgICAgIGhlYWRlcnMucHVzaChDUkxGKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kb1dyaXRlKG1zZywgaGVhZGVycywgYnVmZmVyKTtcbiAgICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgZG9Xcml0ZShtc2csIGhlYWRlcnMsIGRhdGEpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMud3JpdGFibGUud3JpdGUoaGVhZGVycy5qb2luKCcnKSwgJ2FzY2lpJyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy53cml0YWJsZS53cml0ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IsIG1zZyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZUVycm9yKGVycm9yLCBtc2cpIHtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50Kys7XG4gICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yLCBtc2csIHRoaXMuZXJyb3JDb3VudCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICAgICAgdGhpcy53cml0YWJsZS5lbmQoKTtcbiAgICB9XG59XG5leHBvcnRzLldyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgPSBXcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkFic3RyYWN0TWVzc2FnZUJ1ZmZlciA9IHZvaWQgMDtcbmNvbnN0IENSID0gMTM7XG5jb25zdCBMRiA9IDEwO1xuY29uc3QgQ1JMRiA9ICdcXHJcXG4nO1xuY2xhc3MgQWJzdHJhY3RNZXNzYWdlQnVmZmVyIHtcbiAgICBjb25zdHJ1Y3RvcihlbmNvZGluZyA9ICd1dGYtOCcpIHtcbiAgICAgICAgdGhpcy5fZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgICAgICAgdGhpcy5fY2h1bmtzID0gW107XG4gICAgICAgIHRoaXMuX3RvdGFsTGVuZ3RoID0gMDtcbiAgICB9XG4gICAgZ2V0IGVuY29kaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW5jb2Rpbmc7XG4gICAgfVxuICAgIGFwcGVuZChjaHVuaykge1xuICAgICAgICBjb25zdCB0b0FwcGVuZCA9IHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZycgPyB0aGlzLmZyb21TdHJpbmcoY2h1bmssIHRoaXMuX2VuY29kaW5nKSA6IGNodW5rO1xuICAgICAgICB0aGlzLl9jaHVua3MucHVzaCh0b0FwcGVuZCk7XG4gICAgICAgIHRoaXMuX3RvdGFsTGVuZ3RoICs9IHRvQXBwZW5kLmJ5dGVMZW5ndGg7XG4gICAgfVxuICAgIHRyeVJlYWRIZWFkZXJzKGxvd2VyQ2FzZUtleXMgPSBmYWxzZSkge1xuICAgICAgICBpZiAodGhpcy5fY2h1bmtzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3RhdGUgPSAwO1xuICAgICAgICBsZXQgY2h1bmtJbmRleCA9IDA7XG4gICAgICAgIGxldCBvZmZzZXQgPSAwO1xuICAgICAgICBsZXQgY2h1bmtCeXRlc1JlYWQgPSAwO1xuICAgICAgICByb3c6IHdoaWxlIChjaHVua0luZGV4IDwgdGhpcy5fY2h1bmtzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgY2h1bmsgPSB0aGlzLl9jaHVua3NbY2h1bmtJbmRleF07XG4gICAgICAgICAgICBvZmZzZXQgPSAwO1xuICAgICAgICAgICAgY29sdW1uOiB3aGlsZSAob2Zmc2V0IDwgY2h1bmsubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjaHVua1tvZmZzZXRdO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDUjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIExGOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gNDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHJvdztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjaHVua0J5dGVzUmVhZCArPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgY2h1bmtJbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZSAhPT0gNCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgYnVmZmVyIGNvbnRhaW5zIHRoZSB0d28gQ1JMRiBhdCB0aGUgZW5kLiBTbyB3ZSB3aWxsXG4gICAgICAgIC8vIGhhdmUgdHdvIGVtcHR5IGxpbmVzIGFmdGVyIHRoZSBzcGxpdCBhdCB0aGUgZW5kIGFzIHdlbGwuXG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuX3JlYWQoY2h1bmtCeXRlc1JlYWQgKyBvZmZzZXQpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwKCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLnRvU3RyaW5nKGJ1ZmZlciwgJ2FzY2lpJykuc3BsaXQoQ1JMRik7XG4gICAgICAgIGlmIChoZWFkZXJzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXJzLmxlbmd0aCAtIDI7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaGVhZGVyID0gaGVhZGVyc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gaGVhZGVyLmluZGV4T2YoJzonKTtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1lc3NhZ2UgaGVhZGVyIG11c3Qgc2VwYXJhdGUga2V5IGFuZCB2YWx1ZSB1c2luZyAnOidcXG4ke2hlYWRlcn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGhlYWRlci5zdWJzdHIoMCwgaW5kZXgpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBoZWFkZXIuc3Vic3RyKGluZGV4ICsgMSkudHJpbSgpO1xuICAgICAgICAgICAgcmVzdWx0LnNldChsb3dlckNhc2VLZXlzID8ga2V5LnRvTG93ZXJDYXNlKCkgOiBrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICB0cnlSZWFkQm9keShsZW5ndGgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3RvdGFsTGVuZ3RoIDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkKGxlbmd0aCk7XG4gICAgfVxuICAgIGdldCBudW1iZXJPZkJ5dGVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdG90YWxMZW5ndGg7XG4gICAgfVxuICAgIF9yZWFkKGJ5dGVDb3VudCkge1xuICAgICAgICBpZiAoYnl0ZUNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbXB0eUJ1ZmZlcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChieXRlQ291bnQgPiB0aGlzLl90b3RhbExlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVhZCBzbyBtYW55IGJ5dGVzIWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jaHVua3NbMF0uYnl0ZUxlbmd0aCA9PT0gYnl0ZUNvdW50KSB7XG4gICAgICAgICAgICAvLyBzdXBlciBmYXN0IHBhdGgsIHByZWNpc2VseSBmaXJzdCBjaHVuayBtdXN0IGJlIHJldHVybmVkXG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1swXTtcbiAgICAgICAgICAgIHRoaXMuX2NodW5rcy5zaGlmdCgpO1xuICAgICAgICAgICAgdGhpcy5fdG90YWxMZW5ndGggLT0gYnl0ZUNvdW50O1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXNOYXRpdmUoY2h1bmspO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jaHVua3NbMF0uYnl0ZUxlbmd0aCA+IGJ5dGVDb3VudCkge1xuICAgICAgICAgICAgLy8gZmFzdCBwYXRoLCB0aGUgcmVhZGluZyBpcyBlbnRpcmVseSB3aXRoaW4gdGhlIGZpcnN0IGNodW5rXG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1swXTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuYXNOYXRpdmUoY2h1bmssIGJ5dGVDb3VudCk7XG4gICAgICAgICAgICB0aGlzLl9jaHVua3NbMF0gPSBjaHVuay5zbGljZShieXRlQ291bnQpO1xuICAgICAgICAgICAgdGhpcy5fdG90YWxMZW5ndGggLT0gYnl0ZUNvdW50O1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmFsbG9jTmF0aXZlKGJ5dGVDb3VudCk7XG4gICAgICAgIGxldCByZXN1bHRPZmZzZXQgPSAwO1xuICAgICAgICBsZXQgY2h1bmtJbmRleCA9IDA7XG4gICAgICAgIHdoaWxlIChieXRlQ291bnQgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1tjaHVua0luZGV4XTtcbiAgICAgICAgICAgIGlmIChjaHVuay5ieXRlTGVuZ3RoID4gYnl0ZUNvdW50KSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBjaHVuayB3aWxsIHN1cnZpdmVcbiAgICAgICAgICAgICAgICBjb25zdCBjaHVua1BhcnQgPSBjaHVuay5zbGljZSgwLCBieXRlQ291bnQpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5zZXQoY2h1bmtQYXJ0LCByZXN1bHRPZmZzZXQpO1xuICAgICAgICAgICAgICAgIHJlc3VsdE9mZnNldCArPSBieXRlQ291bnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2h1bmtzW2NodW5rSW5kZXhdID0gY2h1bmsuc2xpY2UoYnl0ZUNvdW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLl90b3RhbExlbmd0aCAtPSBieXRlQ291bnQ7XG4gICAgICAgICAgICAgICAgYnl0ZUNvdW50IC09IGJ5dGVDb3VudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHRoaXMgY2h1bmsgd2lsbCBiZSBlbnRpcmVseSByZWFkXG4gICAgICAgICAgICAgICAgcmVzdWx0LnNldChjaHVuaywgcmVzdWx0T2Zmc2V0KTtcbiAgICAgICAgICAgICAgICByZXN1bHRPZmZzZXQgKz0gY2h1bmsuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgICAgICB0aGlzLl9jaHVua3Muc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl90b3RhbExlbmd0aCAtPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgICAgIGJ5dGVDb3VudCAtPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VCdWZmZXIgPSBBYnN0cmFjdE1lc3NhZ2VCdWZmZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uID0gZXhwb3J0cy5Db25uZWN0aW9uT3B0aW9ucyA9IGV4cG9ydHMuTWVzc2FnZVN0cmF0ZWd5ID0gZXhwb3J0cy5DYW5jZWxsYXRpb25TdHJhdGVneSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gZXhwb3J0cy5JZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IGV4cG9ydHMuQ29ubmVjdGlvbkVycm9yID0gZXhwb3J0cy5Db25uZWN0aW9uRXJyb3JzID0gZXhwb3J0cy5Mb2dUcmFjZU5vdGlmaWNhdGlvbiA9IGV4cG9ydHMuU2V0VHJhY2VOb3RpZmljYXRpb24gPSBleHBvcnRzLlRyYWNlRm9ybWF0ID0gZXhwb3J0cy5UcmFjZVZhbHVlcyA9IGV4cG9ydHMuVHJhY2UgPSBleHBvcnRzLk51bGxMb2dnZXIgPSBleHBvcnRzLlByb2dyZXNzVHlwZSA9IGV4cG9ydHMuUHJvZ3Jlc3NUb2tlbiA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IG1lc3NhZ2VzXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlc1wiKTtcbmNvbnN0IGxpbmtlZE1hcF8xID0gcmVxdWlyZShcIi4vbGlua2VkTWFwXCIpO1xuY29uc3QgZXZlbnRzXzEgPSByZXF1aXJlKFwiLi9ldmVudHNcIik7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbnZhciBDYW5jZWxOb3RpZmljYXRpb247XG4oZnVuY3Rpb24gKENhbmNlbE5vdGlmaWNhdGlvbikge1xuICAgIENhbmNlbE5vdGlmaWNhdGlvbi50eXBlID0gbmV3IG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZSgnJC9jYW5jZWxSZXF1ZXN0Jyk7XG59KShDYW5jZWxOb3RpZmljYXRpb24gfHwgKENhbmNlbE5vdGlmaWNhdGlvbiA9IHt9KSk7XG52YXIgUHJvZ3Jlc3NUb2tlbjtcbihmdW5jdGlvbiAoUHJvZ3Jlc3NUb2tlbikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG4gICAgfVxuICAgIFByb2dyZXNzVG9rZW4uaXMgPSBpcztcbn0pKFByb2dyZXNzVG9rZW4gfHwgKGV4cG9ydHMuUHJvZ3Jlc3NUb2tlbiA9IFByb2dyZXNzVG9rZW4gPSB7fSkpO1xudmFyIFByb2dyZXNzTm90aWZpY2F0aW9uO1xuKGZ1bmN0aW9uIChQcm9ncmVzc05vdGlmaWNhdGlvbikge1xuICAgIFByb2dyZXNzTm90aWZpY2F0aW9uLnR5cGUgPSBuZXcgbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlKCckL3Byb2dyZXNzJyk7XG59KShQcm9ncmVzc05vdGlmaWNhdGlvbiB8fCAoUHJvZ3Jlc3NOb3RpZmljYXRpb24gPSB7fSkpO1xuY2xhc3MgUHJvZ3Jlc3NUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICB9XG59XG5leHBvcnRzLlByb2dyZXNzVHlwZSA9IFByb2dyZXNzVHlwZTtcbnZhciBTdGFyUmVxdWVzdEhhbmRsZXI7XG4oZnVuY3Rpb24gKFN0YXJSZXF1ZXN0SGFuZGxlcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBJcy5mdW5jKHZhbHVlKTtcbiAgICB9XG4gICAgU3RhclJlcXVlc3RIYW5kbGVyLmlzID0gaXM7XG59KShTdGFyUmVxdWVzdEhhbmRsZXIgfHwgKFN0YXJSZXF1ZXN0SGFuZGxlciA9IHt9KSk7XG5leHBvcnRzLk51bGxMb2dnZXIgPSBPYmplY3QuZnJlZXplKHtcbiAgICBlcnJvcjogKCkgPT4geyB9LFxuICAgIHdhcm46ICgpID0+IHsgfSxcbiAgICBpbmZvOiAoKSA9PiB7IH0sXG4gICAgbG9nOiAoKSA9PiB7IH1cbn0pO1xudmFyIFRyYWNlO1xuKGZ1bmN0aW9uIChUcmFjZSkge1xuICAgIFRyYWNlW1RyYWNlW1wiT2ZmXCJdID0gMF0gPSBcIk9mZlwiO1xuICAgIFRyYWNlW1RyYWNlW1wiTWVzc2FnZXNcIl0gPSAxXSA9IFwiTWVzc2FnZXNcIjtcbiAgICBUcmFjZVtUcmFjZVtcIkNvbXBhY3RcIl0gPSAyXSA9IFwiQ29tcGFjdFwiO1xuICAgIFRyYWNlW1RyYWNlW1wiVmVyYm9zZVwiXSA9IDNdID0gXCJWZXJib3NlXCI7XG59KShUcmFjZSB8fCAoZXhwb3J0cy5UcmFjZSA9IFRyYWNlID0ge30pKTtcbnZhciBUcmFjZVZhbHVlcztcbihmdW5jdGlvbiAoVHJhY2VWYWx1ZXMpIHtcbiAgICAvKipcbiAgICAgKiBUdXJuIHRyYWNpbmcgb2ZmLlxuICAgICAqL1xuICAgIFRyYWNlVmFsdWVzLk9mZiA9ICdvZmYnO1xuICAgIC8qKlxuICAgICAqIFRyYWNlIG1lc3NhZ2VzIG9ubHkuXG4gICAgICovXG4gICAgVHJhY2VWYWx1ZXMuTWVzc2FnZXMgPSAnbWVzc2FnZXMnO1xuICAgIC8qKlxuICAgICAqIENvbXBhY3QgbWVzc2FnZSB0cmFjaW5nLlxuICAgICAqL1xuICAgIFRyYWNlVmFsdWVzLkNvbXBhY3QgPSAnY29tcGFjdCc7XG4gICAgLyoqXG4gICAgICogVmVyYm9zZSBtZXNzYWdlIHRyYWNpbmcuXG4gICAgICovXG4gICAgVHJhY2VWYWx1ZXMuVmVyYm9zZSA9ICd2ZXJib3NlJztcbn0pKFRyYWNlVmFsdWVzIHx8IChleHBvcnRzLlRyYWNlVmFsdWVzID0gVHJhY2VWYWx1ZXMgPSB7fSkpO1xuKGZ1bmN0aW9uIChUcmFjZSkge1xuICAgIGZ1bmN0aW9uIGZyb21TdHJpbmcodmFsdWUpIHtcbiAgICAgICAgaWYgKCFJcy5zdHJpbmcodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gVHJhY2UuT2ZmO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSAnb2ZmJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gVHJhY2UuT2ZmO1xuICAgICAgICAgICAgY2FzZSAnbWVzc2FnZXMnOlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5NZXNzYWdlcztcbiAgICAgICAgICAgIGNhc2UgJ2NvbXBhY3QnOlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5Db21wYWN0O1xuICAgICAgICAgICAgY2FzZSAndmVyYm9zZSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFRyYWNlLlZlcmJvc2U7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5PZmY7XG4gICAgICAgIH1cbiAgICB9XG4gICAgVHJhY2UuZnJvbVN0cmluZyA9IGZyb21TdHJpbmc7XG4gICAgZnVuY3Rpb24gdG9TdHJpbmcodmFsdWUpIHtcbiAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5PZmY6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdvZmYnO1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5NZXNzYWdlczpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ21lc3NhZ2VzJztcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuQ29tcGFjdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2NvbXBhY3QnO1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5WZXJib3NlOlxuICAgICAgICAgICAgICAgIHJldHVybiAndmVyYm9zZSc7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAnb2ZmJztcbiAgICAgICAgfVxuICAgIH1cbiAgICBUcmFjZS50b1N0cmluZyA9IHRvU3RyaW5nO1xufSkoVHJhY2UgfHwgKGV4cG9ydHMuVHJhY2UgPSBUcmFjZSA9IHt9KSk7XG52YXIgVHJhY2VGb3JtYXQ7XG4oZnVuY3Rpb24gKFRyYWNlRm9ybWF0KSB7XG4gICAgVHJhY2VGb3JtYXRbXCJUZXh0XCJdID0gXCJ0ZXh0XCI7XG4gICAgVHJhY2VGb3JtYXRbXCJKU09OXCJdID0gXCJqc29uXCI7XG59KShUcmFjZUZvcm1hdCB8fCAoZXhwb3J0cy5UcmFjZUZvcm1hdCA9IFRyYWNlRm9ybWF0ID0ge30pKTtcbihmdW5jdGlvbiAoVHJhY2VGb3JtYXQpIHtcbiAgICBmdW5jdGlvbiBmcm9tU3RyaW5nKHZhbHVlKSB7XG4gICAgICAgIGlmICghSXMuc3RyaW5nKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIFRyYWNlRm9ybWF0LlRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAodmFsdWUgPT09ICdqc29uJykge1xuICAgICAgICAgICAgcmV0dXJuIFRyYWNlRm9ybWF0LkpTT047XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gVHJhY2VGb3JtYXQuVGV4dDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBUcmFjZUZvcm1hdC5mcm9tU3RyaW5nID0gZnJvbVN0cmluZztcbn0pKFRyYWNlRm9ybWF0IHx8IChleHBvcnRzLlRyYWNlRm9ybWF0ID0gVHJhY2VGb3JtYXQgPSB7fSkpO1xudmFyIFNldFRyYWNlTm90aWZpY2F0aW9uO1xuKGZ1bmN0aW9uIChTZXRUcmFjZU5vdGlmaWNhdGlvbikge1xuICAgIFNldFRyYWNlTm90aWZpY2F0aW9uLnR5cGUgPSBuZXcgbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlKCckL3NldFRyYWNlJyk7XG59KShTZXRUcmFjZU5vdGlmaWNhdGlvbiB8fCAoZXhwb3J0cy5TZXRUcmFjZU5vdGlmaWNhdGlvbiA9IFNldFRyYWNlTm90aWZpY2F0aW9uID0ge30pKTtcbnZhciBMb2dUcmFjZU5vdGlmaWNhdGlvbjtcbihmdW5jdGlvbiAoTG9nVHJhY2VOb3RpZmljYXRpb24pIHtcbiAgICBMb2dUcmFjZU5vdGlmaWNhdGlvbi50eXBlID0gbmV3IG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZSgnJC9sb2dUcmFjZScpO1xufSkoTG9nVHJhY2VOb3RpZmljYXRpb24gfHwgKGV4cG9ydHMuTG9nVHJhY2VOb3RpZmljYXRpb24gPSBMb2dUcmFjZU5vdGlmaWNhdGlvbiA9IHt9KSk7XG52YXIgQ29ubmVjdGlvbkVycm9ycztcbihmdW5jdGlvbiAoQ29ubmVjdGlvbkVycm9ycykge1xuICAgIC8qKlxuICAgICAqIFRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZC5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uRXJyb3JzW0Nvbm5lY3Rpb25FcnJvcnNbXCJDbG9zZWRcIl0gPSAxXSA9IFwiQ2xvc2VkXCI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gZ290IGRpc3Bvc2VkLlxuICAgICAqL1xuICAgIENvbm5lY3Rpb25FcnJvcnNbQ29ubmVjdGlvbkVycm9yc1tcIkRpc3Bvc2VkXCJdID0gMl0gPSBcIkRpc3Bvc2VkXCI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBpbiBsaXN0ZW5pbmcgbW9kZS5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uRXJyb3JzW0Nvbm5lY3Rpb25FcnJvcnNbXCJBbHJlYWR5TGlzdGVuaW5nXCJdID0gM10gPSBcIkFscmVhZHlMaXN0ZW5pbmdcIjtcbn0pKENvbm5lY3Rpb25FcnJvcnMgfHwgKGV4cG9ydHMuQ29ubmVjdGlvbkVycm9ycyA9IENvbm5lY3Rpb25FcnJvcnMgPSB7fSkpO1xuY2xhc3MgQ29ubmVjdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNvZGUsIG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBDb25uZWN0aW9uRXJyb3IucHJvdG90eXBlKTtcbiAgICB9XG59XG5leHBvcnRzLkNvbm5lY3Rpb25FcnJvciA9IENvbm5lY3Rpb25FcnJvcjtcbnZhciBDb25uZWN0aW9uU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENvbm5lY3Rpb25TdHJhdGVneSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNhbmNlbFVuZGlzcGF0Y2hlZCk7XG4gICAgfVxuICAgIENvbm5lY3Rpb25TdHJhdGVneS5pcyA9IGlzO1xufSkoQ29ubmVjdGlvblN0cmF0ZWd5IHx8IChleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IENvbm5lY3Rpb25TdHJhdGVneSA9IHt9KSk7XG52YXIgSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5O1xuKGZ1bmN0aW9uIChJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiAoY2FuZGlkYXRlLmtpbmQgPT09IHVuZGVmaW5lZCB8fCBjYW5kaWRhdGUua2luZCA9PT0gJ2lkJykgJiYgSXMuZnVuYyhjYW5kaWRhdGUuY3JlYXRlQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UpICYmIChjYW5kaWRhdGUuZGlzcG9zZSA9PT0gdW5kZWZpbmVkIHx8IElzLmZ1bmMoY2FuZGlkYXRlLmRpc3Bvc2UpKTtcbiAgICB9XG4gICAgSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzID0gaXM7XG59KShJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgfHwgKGV4cG9ydHMuSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0ge30pKTtcbnZhciBSZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneTtcbihmdW5jdGlvbiAoUmVxdWVzdENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBjYW5kaWRhdGUua2luZCA9PT0gJ3JlcXVlc3QnICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKSAmJiAoY2FuZGlkYXRlLmRpc3Bvc2UgPT09IHVuZGVmaW5lZCB8fCBJcy5mdW5jKGNhbmRpZGF0ZS5kaXNwb3NlKSk7XG4gICAgfVxuICAgIFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzID0gaXM7XG59KShSZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSB8fCAoZXhwb3J0cy5SZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0ge30pKTtcbnZhciBDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5O1xuKGZ1bmN0aW9uIChDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5NZXNzYWdlID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKF8pIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgY2FuY2VsbGF0aW9uXzEuQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UoKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kuaXModmFsdWUpIHx8IFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKHZhbHVlKTtcbiAgICB9XG4gICAgQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5pcyA9IGlzO1xufSkoQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSB8fCAoZXhwb3J0cy5DYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IHt9KSk7XG52YXIgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENhbmNlbGxhdGlvblNlbmRlclN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kuTWVzc2FnZSA9IE9iamVjdC5mcmVlemUoe1xuICAgICAgICBzZW5kQ2FuY2VsbGF0aW9uKGNvbm4sIGlkKSB7XG4gICAgICAgICAgICByZXR1cm4gY29ubi5zZW5kTm90aWZpY2F0aW9uKENhbmNlbE5vdGlmaWNhdGlvbi50eXBlLCB7IGlkIH0pO1xuICAgICAgICB9LFxuICAgICAgICBjbGVhbnVwKF8pIHsgfVxuICAgIH0pO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLnNlbmRDYW5jZWxsYXRpb24pICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNsZWFudXApO1xuICAgIH1cbiAgICBDYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneS5pcyA9IGlzO1xufSkoQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgfHwgKGV4cG9ydHMuQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgPSBDYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneSA9IHt9KSk7XG52YXIgQ2FuY2VsbGF0aW9uU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENhbmNlbGxhdGlvblN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uU3RyYXRlZ3kuTWVzc2FnZSA9IE9iamVjdC5mcmVlemUoe1xuICAgICAgICByZWNlaXZlcjogQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5NZXNzYWdlLFxuICAgICAgICBzZW5kZXI6IENhbmNlbGxhdGlvblNlbmRlclN0cmF0ZWd5Lk1lc3NhZ2VcbiAgICB9KTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKGNhbmRpZGF0ZS5yZWNlaXZlcikgJiYgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kuaXMoY2FuZGlkYXRlLnNlbmRlcik7XG4gICAgfVxuICAgIENhbmNlbGxhdGlvblN0cmF0ZWd5LmlzID0gaXM7XG59KShDYW5jZWxsYXRpb25TdHJhdGVneSB8fCAoZXhwb3J0cy5DYW5jZWxsYXRpb25TdHJhdGVneSA9IENhbmNlbGxhdGlvblN0cmF0ZWd5ID0ge30pKTtcbnZhciBNZXNzYWdlU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKE1lc3NhZ2VTdHJhdGVneSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLmhhbmRsZU1lc3NhZ2UpO1xuICAgIH1cbiAgICBNZXNzYWdlU3RyYXRlZ3kuaXMgPSBpcztcbn0pKE1lc3NhZ2VTdHJhdGVneSB8fCAoZXhwb3J0cy5NZXNzYWdlU3RyYXRlZ3kgPSBNZXNzYWdlU3RyYXRlZ3kgPSB7fSkpO1xudmFyIENvbm5lY3Rpb25PcHRpb25zO1xuKGZ1bmN0aW9uIChDb25uZWN0aW9uT3B0aW9ucykge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIChDYW5jZWxsYXRpb25TdHJhdGVneS5pcyhjYW5kaWRhdGUuY2FuY2VsbGF0aW9uU3RyYXRlZ3kpIHx8IENvbm5lY3Rpb25TdHJhdGVneS5pcyhjYW5kaWRhdGUuY29ubmVjdGlvblN0cmF0ZWd5KSB8fCBNZXNzYWdlU3RyYXRlZ3kuaXMoY2FuZGlkYXRlLm1lc3NhZ2VTdHJhdGVneSkpO1xuICAgIH1cbiAgICBDb25uZWN0aW9uT3B0aW9ucy5pcyA9IGlzO1xufSkoQ29ubmVjdGlvbk9wdGlvbnMgfHwgKGV4cG9ydHMuQ29ubmVjdGlvbk9wdGlvbnMgPSBDb25uZWN0aW9uT3B0aW9ucyA9IHt9KSk7XG52YXIgQ29ubmVjdGlvblN0YXRlO1xuKGZ1bmN0aW9uIChDb25uZWN0aW9uU3RhdGUpIHtcbiAgICBDb25uZWN0aW9uU3RhdGVbQ29ubmVjdGlvblN0YXRlW1wiTmV3XCJdID0gMV0gPSBcIk5ld1wiO1xuICAgIENvbm5lY3Rpb25TdGF0ZVtDb25uZWN0aW9uU3RhdGVbXCJMaXN0ZW5pbmdcIl0gPSAyXSA9IFwiTGlzdGVuaW5nXCI7XG4gICAgQ29ubmVjdGlvblN0YXRlW0Nvbm5lY3Rpb25TdGF0ZVtcIkNsb3NlZFwiXSA9IDNdID0gXCJDbG9zZWRcIjtcbiAgICBDb25uZWN0aW9uU3RhdGVbQ29ubmVjdGlvblN0YXRlW1wiRGlzcG9zZWRcIl0gPSA0XSA9IFwiRGlzcG9zZWRcIjtcbn0pKENvbm5lY3Rpb25TdGF0ZSB8fCAoQ29ubmVjdGlvblN0YXRlID0ge30pKTtcbmZ1bmN0aW9uIGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uKG1lc3NhZ2VSZWFkZXIsIG1lc3NhZ2VXcml0ZXIsIF9sb2dnZXIsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBsb2dnZXIgPSBfbG9nZ2VyICE9PSB1bmRlZmluZWQgPyBfbG9nZ2VyIDogZXhwb3J0cy5OdWxsTG9nZ2VyO1xuICAgIGxldCBzZXF1ZW5jZU51bWJlciA9IDA7XG4gICAgbGV0IG5vdGlmaWNhdGlvblNlcXVlbmNlTnVtYmVyID0gMDtcbiAgICBsZXQgdW5rbm93blJlc3BvbnNlU2VxdWVuY2VOdW1iZXIgPSAwO1xuICAgIGNvbnN0IHZlcnNpb24gPSAnMi4wJztcbiAgICBsZXQgc3RhclJlcXVlc3RIYW5kbGVyID0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlcXVlc3RIYW5kbGVycyA9IG5ldyBNYXAoKTtcbiAgICBsZXQgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgY29uc3Qgbm90aWZpY2F0aW9uSGFuZGxlcnMgPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgcHJvZ3Jlc3NIYW5kbGVycyA9IG5ldyBNYXAoKTtcbiAgICBsZXQgdGltZXI7XG4gICAgbGV0IG1lc3NhZ2VRdWV1ZSA9IG5ldyBsaW5rZWRNYXBfMS5MaW5rZWRNYXAoKTtcbiAgICBsZXQgcmVzcG9uc2VQcm9taXNlcyA9IG5ldyBNYXAoKTtcbiAgICBsZXQga25vd25DYW5jZWxlZFJlcXVlc3RzID0gbmV3IFNldCgpO1xuICAgIGxldCByZXF1ZXN0VG9rZW5zID0gbmV3IE1hcCgpO1xuICAgIGxldCB0cmFjZSA9IFRyYWNlLk9mZjtcbiAgICBsZXQgdHJhY2VGb3JtYXQgPSBUcmFjZUZvcm1hdC5UZXh0O1xuICAgIGxldCB0cmFjZXI7XG4gICAgbGV0IHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLk5ldztcbiAgICBjb25zdCBlcnJvckVtaXR0ZXIgPSBuZXcgZXZlbnRzXzEuRW1pdHRlcigpO1xuICAgIGNvbnN0IGNsb3NlRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgdW5oYW5kbGVkTm90aWZpY2F0aW9uRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgdW5oYW5kbGVkUHJvZ3Jlc3NFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICBjb25zdCBkaXNwb3NlRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgY2FuY2VsbGF0aW9uU3RyYXRlZ3kgPSAob3B0aW9ucyAmJiBvcHRpb25zLmNhbmNlbGxhdGlvblN0cmF0ZWd5KSA/IG9wdGlvbnMuY2FuY2VsbGF0aW9uU3RyYXRlZ3kgOiBDYW5jZWxsYXRpb25TdHJhdGVneS5NZXNzYWdlO1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlcXVlc3RRdWV1ZUtleShpZCkge1xuICAgICAgICBpZiAoaWQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuJ3Qgc2VuZCByZXF1ZXN0cyB3aXRoIGlkIG51bGwgc2luY2UgdGhlIHJlc3BvbnNlIGNhbid0IGJlIGNvcnJlbGF0ZWQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdyZXEtJyArIGlkLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlc3BvbnNlUXVldWVLZXkoaWQpIHtcbiAgICAgICAgaWYgKGlkID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3Jlcy11bmtub3duLScgKyAoKyt1bmtub3duUmVzcG9uc2VTZXF1ZW5jZU51bWJlcikudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAncmVzLScgKyBpZC50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZU5vdGlmaWNhdGlvblF1ZXVlS2V5KCkge1xuICAgICAgICByZXR1cm4gJ25vdC0nICsgKCsrbm90aWZpY2F0aW9uU2VxdWVuY2VOdW1iZXIpLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFkZE1lc3NhZ2VUb1F1ZXVlKHF1ZXVlLCBtZXNzYWdlKSB7XG4gICAgICAgIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXF1ZXN0KG1lc3NhZ2UpKSB7XG4gICAgICAgICAgICBxdWV1ZS5zZXQoY3JlYXRlUmVxdWVzdFF1ZXVlS2V5KG1lc3NhZ2UuaWQpLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXNwb25zZShtZXNzYWdlKSkge1xuICAgICAgICAgICAgcXVldWUuc2V0KGNyZWF0ZVJlc3BvbnNlUXVldWVLZXkobWVzc2FnZS5pZCksIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcXVldWUuc2V0KGNyZWF0ZU5vdGlmaWNhdGlvblF1ZXVlS2V5KCksIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNhbmNlbFVuZGlzcGF0Y2hlZChfbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0xpc3RlbmluZygpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlID09PSBDb25uZWN0aW9uU3RhdGUuTGlzdGVuaW5nO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0Nsb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlID09PSBDb25uZWN0aW9uU3RhdGUuQ2xvc2VkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0Rpc3Bvc2VkKCkge1xuICAgICAgICByZXR1cm4gc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5EaXNwb3NlZDtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2xvc2VIYW5kbGVyKCkge1xuICAgICAgICBpZiAoc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5OZXcgfHwgc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5MaXN0ZW5pbmcpIHtcbiAgICAgICAgICAgIHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLkNsb3NlZDtcbiAgICAgICAgICAgIGNsb3NlRW1pdHRlci5maXJlKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlIGNvbm5lY3Rpb24gaXMgZGlzcG9zZWQgZG9uJ3Qgc2VudCBjbG9zZSBldmVudHMuXG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlYWRFcnJvckhhbmRsZXIoZXJyb3IpIHtcbiAgICAgICAgZXJyb3JFbWl0dGVyLmZpcmUoW2Vycm9yLCB1bmRlZmluZWQsIHVuZGVmaW5lZF0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiB3cml0ZUVycm9ySGFuZGxlcihkYXRhKSB7XG4gICAgICAgIGVycm9yRW1pdHRlci5maXJlKGRhdGEpO1xuICAgIH1cbiAgICBtZXNzYWdlUmVhZGVyLm9uQ2xvc2UoY2xvc2VIYW5kbGVyKTtcbiAgICBtZXNzYWdlUmVhZGVyLm9uRXJyb3IocmVhZEVycm9ySGFuZGxlcik7XG4gICAgbWVzc2FnZVdyaXRlci5vbkNsb3NlKGNsb3NlSGFuZGxlcik7XG4gICAgbWVzc2FnZVdyaXRlci5vbkVycm9yKHdyaXRlRXJyb3JIYW5kbGVyKTtcbiAgICBmdW5jdGlvbiB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCkge1xuICAgICAgICBpZiAodGltZXIgfHwgbWVzc2FnZVF1ZXVlLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aW1lciA9ICgwLCByYWxfMS5kZWZhdWx0KSgpLnRpbWVyLnNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICAgICAgICB0aW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHByb2Nlc3NNZXNzYWdlUXVldWUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGhhbmRsZU1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICBpZiAobWVzc2FnZXNfMS5NZXNzYWdlLmlzUmVxdWVzdChtZXNzYWdlKSkge1xuICAgICAgICAgICAgaGFuZGxlUmVxdWVzdChtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNOb3RpZmljYXRpb24obWVzc2FnZSkpIHtcbiAgICAgICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvbihtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXNwb25zZShtZXNzYWdlKSkge1xuICAgICAgICAgICAgaGFuZGxlUmVzcG9uc2UobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBoYW5kbGVJbnZhbGlkTWVzc2FnZShtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBwcm9jZXNzTWVzc2FnZVF1ZXVlKCkge1xuICAgICAgICBpZiAobWVzc2FnZVF1ZXVlLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXNzYWdlID0gbWVzc2FnZVF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlU3RyYXRlZ3kgPSBvcHRpb25zPy5tZXNzYWdlU3RyYXRlZ3k7XG4gICAgICAgICAgICBpZiAoTWVzc2FnZVN0cmF0ZWd5LmlzKG1lc3NhZ2VTdHJhdGVneSkpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlU3RyYXRlZ3kuaGFuZGxlTWVzc2FnZShtZXNzYWdlLCBoYW5kbGVNZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGhhbmRsZU1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgY2FsbGJhY2sgPSAobWVzc2FnZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2UgaGF2ZSByZWNlaXZlZCBhIGNhbmNlbGxhdGlvbiBtZXNzYWdlLiBDaGVjayBpZiB0aGUgbWVzc2FnZSBpcyBzdGlsbCBpbiB0aGUgcXVldWVcbiAgICAgICAgICAgIC8vIGFuZCBjYW5jZWwgaXQgaWYgYWxsb3dlZCB0byBkbyBzby5cbiAgICAgICAgICAgIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNOb3RpZmljYXRpb24obWVzc2FnZSkgJiYgbWVzc2FnZS5tZXRob2QgPT09IENhbmNlbE5vdGlmaWNhdGlvbi50eXBlLm1ldGhvZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbmNlbElkID0gbWVzc2FnZS5wYXJhbXMuaWQ7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gY3JlYXRlUmVxdWVzdFF1ZXVlS2V5KGNhbmNlbElkKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0b0NhbmNlbCA9IG1lc3NhZ2VRdWV1ZS5nZXQoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZXNfMS5NZXNzYWdlLmlzUmVxdWVzdCh0b0NhbmNlbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyYXRlZ3kgPSBvcHRpb25zPy5jb25uZWN0aW9uU3RyYXRlZ3k7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gKHN0cmF0ZWd5ICYmIHN0cmF0ZWd5LmNhbmNlbFVuZGlzcGF0Y2hlZCkgPyBzdHJhdGVneS5jYW5jZWxVbmRpc3BhdGNoZWQodG9DYW5jZWwsIGNhbmNlbFVuZGlzcGF0Y2hlZCkgOiBjYW5jZWxVbmRpc3BhdGNoZWQodG9DYW5jZWwpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgJiYgKHJlc3BvbnNlLmVycm9yICE9PSB1bmRlZmluZWQgfHwgcmVzcG9uc2UucmVzdWx0ICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUXVldWUuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLmRlbGV0ZShjYW5jZWxJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5pZCA9IHRvQ2FuY2VsLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VTZW5kaW5nUmVzcG9uc2UocmVzcG9uc2UsIG1lc3NhZ2UubWV0aG9kLCBEYXRlLm5vdygpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUocmVzcG9uc2UpLmNhdGNoKCgpID0+IGxvZ2dlci5lcnJvcihgU2VuZGluZyByZXNwb25zZSBmb3IgY2FuY2VsZWQgbWVzc2FnZSBmYWlsZWQuYCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGNhbmNlbGxhdGlvblRva2VuID0gcmVxdWVzdFRva2Vucy5nZXQoY2FuY2VsSWQpO1xuICAgICAgICAgICAgICAgIC8vIFRoZSByZXF1ZXN0IGlzIGFscmVhZHkgcnVubmluZy4gQ2FuY2VsIHRoZSB0b2tlblxuICAgICAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbmNlbGxhdGlvblRva2VuLmNhbmNlbCgpO1xuICAgICAgICAgICAgICAgICAgICB0cmFjZVJlY2VpdmVkTm90aWZpY2F0aW9uKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZW1lbWJlciB0aGUgY2FuY2VsIGJ1dCBzdGlsbCBxdWV1ZSB0aGUgbWVzc2FnZSB0b1xuICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbiB1cCBzdGF0ZSBpbiBwcm9jZXNzIG1lc3NhZ2UuXG4gICAgICAgICAgICAgICAgICAgIGtub3duQ2FuY2VsZWRSZXF1ZXN0cy5hZGQoY2FuY2VsSWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFkZE1lc3NhZ2VUb1F1ZXVlKG1lc3NhZ2VRdWV1ZSwgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGZ1bmN0aW9uIGhhbmRsZVJlcXVlc3QocmVxdWVzdE1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgLy8gd2UgcmV0dXJuIGhlcmUgc2lsZW50bHkgc2luY2Ugd2UgZmlyZWQgYW4gZXZlbnQgd2hlbiB0aGVcbiAgICAgICAgICAgIC8vIGNvbm5lY3Rpb24gZ290IGRpc3Bvc2VkLlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHJlcGx5KHJlc3VsdE9yRXJyb3IsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgaWQ6IHJlcXVlc3RNZXNzYWdlLmlkXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKHJlc3VsdE9yRXJyb3IgaW5zdGFuY2VvZiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlLmVycm9yID0gcmVzdWx0T3JFcnJvci50b0pzb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVzdWx0ID0gcmVzdWx0T3JFcnJvciA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHJlc3VsdE9yRXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cmFjZVNlbmRpbmdSZXNwb25zZShtZXNzYWdlLCBtZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICBtZXNzYWdlV3JpdGVyLndyaXRlKG1lc3NhZ2UpLmNhdGNoKCgpID0+IGxvZ2dlci5lcnJvcihgU2VuZGluZyByZXNwb25zZSBmYWlsZWQuYCkpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHJlcGx5RXJyb3IoZXJyb3IsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgaWQ6IHJlcXVlc3RNZXNzYWdlLmlkLFxuICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvci50b0pzb24oKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUobWVzc2FnZSkuY2F0Y2goKCkgPT4gbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlc3BvbnNlIGZhaWxlZC5gKSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gcmVwbHlTdWNjZXNzKHJlc3VsdCwgbWV0aG9kLCBzdGFydFRpbWUpIHtcbiAgICAgICAgICAgIC8vIFRoZSBKU09OIFJQQyBkZWZpbmVzIHRoYXQgYSByZXNwb25zZSBtdXN0IGVpdGhlciBoYXZlIGEgcmVzdWx0IG9yIGFuIGVycm9yXG4gICAgICAgICAgICAvLyBTbyB3ZSBjYW4ndCB0cmVhdCB1bmRlZmluZWQgYXMgYSB2YWxpZCByZXNwb25zZSByZXN1bHQuXG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgICAgICAgICAgICBqc29ucnBjOiB2ZXJzaW9uLFxuICAgICAgICAgICAgICAgIGlkOiByZXF1ZXN0TWVzc2FnZS5pZCxcbiAgICAgICAgICAgICAgICByZXN1bHQ6IHJlc3VsdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUobWVzc2FnZSkuY2F0Y2goKCkgPT4gbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlc3BvbnNlIGZhaWxlZC5gKSk7XG4gICAgICAgIH1cbiAgICAgICAgdHJhY2VSZWNlaXZlZFJlcXVlc3QocmVxdWVzdE1lc3NhZ2UpO1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gcmVxdWVzdEhhbmRsZXJzLmdldChyZXF1ZXN0TWVzc2FnZS5tZXRob2QpO1xuICAgICAgICBsZXQgdHlwZTtcbiAgICAgICAgbGV0IHJlcXVlc3RIYW5kbGVyO1xuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgdHlwZSA9IGVsZW1lbnQudHlwZTtcbiAgICAgICAgICAgIHJlcXVlc3RIYW5kbGVyID0gZWxlbWVudC5oYW5kbGVyO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIGlmIChyZXF1ZXN0SGFuZGxlciB8fCBzdGFyUmVxdWVzdEhhbmRsZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHRva2VuS2V5ID0gcmVxdWVzdE1lc3NhZ2UuaWQgPz8gU3RyaW5nKERhdGUubm93KCkpOyAvL1xuICAgICAgICAgICAgY29uc3QgY2FuY2VsbGF0aW9uU291cmNlID0gSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKGNhbmNlbGxhdGlvblN0cmF0ZWd5LnJlY2VpdmVyKVxuICAgICAgICAgICAgICAgID8gY2FuY2VsbGF0aW9uU3RyYXRlZ3kucmVjZWl2ZXIuY3JlYXRlQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UodG9rZW5LZXkpXG4gICAgICAgICAgICAgICAgOiBjYW5jZWxsYXRpb25TdHJhdGVneS5yZWNlaXZlci5jcmVhdGVDYW5jZWxsYXRpb25Ub2tlblNvdXJjZShyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICBpZiAocmVxdWVzdE1lc3NhZ2UuaWQgIT09IG51bGwgJiYga25vd25DYW5jZWxlZFJlcXVlc3RzLmhhcyhyZXF1ZXN0TWVzc2FnZS5pZCkpIHtcbiAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25Tb3VyY2UuY2FuY2VsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVxdWVzdE1lc3NhZ2UuaWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLnNldCh0b2tlbktleSwgY2FuY2VsbGF0aW9uU291cmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IGhhbmRsZXJSZXN1bHQ7XG4gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0TWVzc2FnZS5wYXJhbXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlLm51bWJlck9mUGFyYW1zICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1zLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyAke3R5cGUubnVtYmVyT2ZQYXJhbXN9IHBhcmFtcyBidXQgcmVjZWl2ZWQgbm9uZS5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJSZXN1bHQgPSByZXF1ZXN0SGFuZGxlcihjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVxdWVzdE1lc3NhZ2UucGFyYW1zKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlLnBhcmFtZXRlclN0cnVjdHVyZXMgPT09IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseUVycm9yKG5ldyBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IobWVzc2FnZXNfMS5FcnJvckNvZGVzLkludmFsaWRQYXJhbXMsIGBSZXF1ZXN0ICR7cmVxdWVzdE1lc3NhZ2UubWV0aG9kfSBkZWZpbmVzIHBhcmFtZXRlcnMgYnkgbmFtZSBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBwb3NpdGlvbmApLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlclJlc3VsdCA9IHJlcXVlc3RIYW5kbGVyKC4uLnJlcXVlc3RNZXNzYWdlLnBhcmFtcywgY2FuY2VsbGF0aW9uU291cmNlLnRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS5wYXJhbWV0ZXJTdHJ1Y3R1cmVzID09PSBtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW52YWxpZFBhcmFtcywgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGRlZmluZXMgcGFyYW1ldGVycyBieSBwb3NpdGlvbiBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBuYW1lYCksIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gcmVxdWVzdEhhbmRsZXIocmVxdWVzdE1lc3NhZ2UucGFyYW1zLCBjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0YXJSZXF1ZXN0SGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gc3RhclJlcXVlc3RIYW5kbGVyKHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgcmVxdWVzdE1lc3NhZ2UucGFyYW1zLCBjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBwcm9taXNlID0gaGFuZGxlclJlc3VsdDtcbiAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZXJSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFRva2Vucy5kZWxldGUodG9rZW5LZXkpO1xuICAgICAgICAgICAgICAgICAgICByZXBseVN1Y2Nlc3MoaGFuZGxlclJlc3VsdCwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwcm9taXNlLnRoZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS50aGVuKChyZXN1bHRPckVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLmRlbGV0ZSh0b2tlbktleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXBseShyZXN1bHRPckVycm9yLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IoZXJyb3IsIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVycm9yICYmIElzLnN0cmluZyhlcnJvci5tZXNzYWdlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGZhaWxlZCB3aXRoIG1lc3NhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZmFpbGVkIHVuZXhwZWN0ZWRseSB3aXRob3V0IHByb3ZpZGluZyBhbnkgZGV0YWlscy5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHkoaGFuZGxlclJlc3VsdCwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHkoZXJyb3IsIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZXJyb3IgJiYgSXMuc3RyaW5nKGVycm9yLm1lc3NhZ2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGZhaWxlZCB3aXRoIG1lc3NhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZmFpbGVkIHVuZXhwZWN0ZWRseSB3aXRob3V0IHByb3ZpZGluZyBhbnkgZGV0YWlscy5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuTWV0aG9kTm90Rm91bmQsIGBVbmhhbmRsZWQgbWV0aG9kICR7cmVxdWVzdE1lc3NhZ2UubWV0aG9kfWApLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlUmVzcG9uc2UocmVzcG9uc2VNZXNzYWdlKSB7XG4gICAgICAgIGlmIChpc0Rpc3Bvc2VkKCkpIHtcbiAgICAgICAgICAgIC8vIFNlZSBoYW5kbGUgcmVxdWVzdC5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzcG9uc2VNZXNzYWdlLmlkID09PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VNZXNzYWdlLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBSZWNlaXZlZCByZXNwb25zZSBtZXNzYWdlIHdpdGhvdXQgaWQ6IEVycm9yIGlzOiBcXG4ke0pTT04uc3RyaW5naWZ5KHJlc3BvbnNlTWVzc2FnZS5lcnJvciwgdW5kZWZpbmVkLCA0KX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgUmVjZWl2ZWQgcmVzcG9uc2UgbWVzc2FnZSB3aXRob3V0IGlkLiBObyBmdXJ0aGVyIGVycm9yIGluZm9ybWF0aW9uIHByb3ZpZGVkLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gcmVzcG9uc2VNZXNzYWdlLmlkO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VQcm9taXNlID0gcmVzcG9uc2VQcm9taXNlcy5nZXQoa2V5KTtcbiAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWRSZXNwb25zZShyZXNwb25zZU1lc3NhZ2UsIHJlc3BvbnNlUHJvbWlzZSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VQcm9taXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2VzLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZU1lc3NhZ2UuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gcmVzcG9uc2VNZXNzYWdlLmVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlLnJlamVjdChuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKGVycm9yLmNvZGUsIGVycm9yLm1lc3NhZ2UsIGVycm9yLmRhdGEpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXNwb25zZU1lc3NhZ2UucmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlTWVzc2FnZS5yZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgbmV2ZXIgaGFwcGVuLicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IubWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBSZXNwb25zZSBoYW5kbGVyICcke3Jlc3BvbnNlUHJvbWlzZS5tZXRob2R9JyBmYWlsZWQgd2l0aCBtZXNzYWdlOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYFJlc3BvbnNlIGhhbmRsZXIgJyR7cmVzcG9uc2VQcm9taXNlLm1ldGhvZH0nIGZhaWxlZCB1bmV4cGVjdGVkbHkuYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlTm90aWZpY2F0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgLy8gU2VlIGhhbmRsZSByZXF1ZXN0LlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0eXBlID0gdW5kZWZpbmVkO1xuICAgICAgICBsZXQgbm90aWZpY2F0aW9uSGFuZGxlcjtcbiAgICAgICAgaWYgKG1lc3NhZ2UubWV0aG9kID09PSBDYW5jZWxOb3RpZmljYXRpb24udHlwZS5tZXRob2QpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhbmNlbElkID0gbWVzc2FnZS5wYXJhbXMuaWQ7XG4gICAgICAgICAgICBrbm93bkNhbmNlbGVkUmVxdWVzdHMuZGVsZXRlKGNhbmNlbElkKTtcbiAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWROb3RpZmljYXRpb24obWVzc2FnZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gbm90aWZpY2F0aW9uSGFuZGxlcnMuZ2V0KG1lc3NhZ2UubWV0aG9kKTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uSGFuZGxlciA9IGVsZW1lbnQuaGFuZGxlcjtcbiAgICAgICAgICAgICAgICB0eXBlID0gZWxlbWVudC50eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChub3RpZmljYXRpb25IYW5kbGVyIHx8IHN0YXJOb3RpZmljYXRpb25IYW5kbGVyKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWROb3RpZmljYXRpb24obWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgaWYgKG5vdGlmaWNhdGlvbkhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UucGFyYW1zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5udW1iZXJPZlBhcmFtcyAhPT0gMCAmJiB0eXBlLnBhcmFtZXRlclN0cnVjdHVyZXMgIT09IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBOb3RpZmljYXRpb24gJHttZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyAke3R5cGUubnVtYmVyT2ZQYXJhbXN9IHBhcmFtcyBidXQgcmVjZWl2ZWQgbm9uZS5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShtZXNzYWdlLnBhcmFtcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGFyZSBKU09OLVJQQyBsaWJyYXJpZXMgdGhhdCBzZW5kIHByb2dyZXNzIG1lc3NhZ2UgYXMgcG9zaXRpb25hbCBwYXJhbXMgYWx0aG91Z2hcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpZmllZCBhcyBuYW1lZC4gU28gY29udmVydCB0aGVtIGlmIHRoaXMgaXMgdGhlIGNhc2UuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBtZXNzYWdlLnBhcmFtcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLm1ldGhvZCA9PT0gUHJvZ3Jlc3NOb3RpZmljYXRpb24udHlwZS5tZXRob2QgJiYgcGFyYW1zLmxlbmd0aCA9PT0gMiAmJiBQcm9ncmVzc1Rva2VuLmlzKHBhcmFtc1swXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKHsgdG9rZW46IHBhcmFtc1swXSwgdmFsdWU6IHBhcmFtc1sxXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUucGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBOb3RpZmljYXRpb24gJHttZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyBwYXJhbWV0ZXJzIGJ5IG5hbWUgYnV0IHJlY2VpdmVkIHBhcmFtZXRlcnMgYnkgcG9zaXRpb25gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5udW1iZXJPZlBhcmFtcyAhPT0gbWVzc2FnZS5wYXJhbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYE5vdGlmaWNhdGlvbiAke21lc3NhZ2UubWV0aG9kfSBkZWZpbmVzICR7dHlwZS5udW1iZXJPZlBhcmFtc30gcGFyYW1zIGJ1dCByZWNlaXZlZCAke3BhcmFtcy5sZW5ndGh9IGFyZ3VtZW50c2ApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXIoLi4ucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS5wYXJhbWV0ZXJTdHJ1Y3R1cmVzID09PSBtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgTm90aWZpY2F0aW9uICR7bWVzc2FnZS5tZXRob2R9IGRlZmluZXMgcGFyYW1ldGVycyBieSBwb3NpdGlvbiBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBuYW1lYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKG1lc3NhZ2UucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGFyTm90aWZpY2F0aW9uSGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICBzdGFyTm90aWZpY2F0aW9uSGFuZGxlcihtZXNzYWdlLm1ldGhvZCwgbWVzc2FnZS5wYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvci5tZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgTm90aWZpY2F0aW9uIGhhbmRsZXIgJyR7bWVzc2FnZS5tZXRob2R9JyBmYWlsZWQgd2l0aCBtZXNzYWdlOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYE5vdGlmaWNhdGlvbiBoYW5kbGVyICcke21lc3NhZ2UubWV0aG9kfScgZmFpbGVkIHVuZXhwZWN0ZWRseS5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1bmhhbmRsZWROb3RpZmljYXRpb25FbWl0dGVyLmZpcmUobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlSW52YWxpZE1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignUmVjZWl2ZWQgZW1wdHkgbWVzc2FnZS4nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsb2dnZXIuZXJyb3IoYFJlY2VpdmVkIG1lc3NhZ2Ugd2hpY2ggaXMgbmVpdGhlciBhIHJlc3BvbnNlIG5vciBhIG5vdGlmaWNhdGlvbiBtZXNzYWdlOlxcbiR7SlNPTi5zdHJpbmdpZnkobWVzc2FnZSwgbnVsbCwgNCl9YCk7XG4gICAgICAgIC8vIFRlc3Qgd2hldGhlciB3ZSBmaW5kIGFuIGlkIHRvIHJlamVjdCB0aGUgcHJvbWlzZVxuICAgICAgICBjb25zdCByZXNwb25zZU1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICBpZiAoSXMuc3RyaW5nKHJlc3BvbnNlTWVzc2FnZS5pZCkgfHwgSXMubnVtYmVyKHJlc3BvbnNlTWVzc2FnZS5pZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHJlc3BvbnNlTWVzc2FnZS5pZDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxlciA9IHJlc3BvbnNlUHJvbWlzZXMuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VIYW5kbGVyLnJlamVjdChuZXcgRXJyb3IoJ1RoZSByZWNlaXZlZCByZXNwb25zZSBoYXMgbmVpdGhlciBhIHJlc3VsdCBub3IgYW4gZXJyb3IgcHJvcGVydHkuJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0cmluZ2lmeVRyYWNlKHBhcmFtcykge1xuICAgICAgICBpZiAocGFyYW1zID09PSB1bmRlZmluZWQgfHwgcGFyYW1zID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAodHJhY2UpIHtcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuVmVyYm9zZTpcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGFyYW1zLCBudWxsLCA0KTtcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuQ29tcGFjdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGFyYW1zKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVNlbmRpbmdSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFjZUZvcm1hdCA9PT0gVHJhY2VGb3JtYXQuVGV4dCkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSAmJiBtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBgUGFyYW1zOiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucGFyYW1zKX1cXG5cXG5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJhY2VyLmxvZyhgU2VuZGluZyByZXF1ZXN0ICcke21lc3NhZ2UubWV0aG9kfSAtICgke21lc3NhZ2UuaWR9KScuYCwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb2dMU1BNZXNzYWdlKCdzZW5kLXJlcXVlc3QnLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVNlbmRpbmdOb3RpZmljYXRpb24obWVzc2FnZSkge1xuICAgICAgICBpZiAodHJhY2UgPT09IFRyYWNlLk9mZiB8fCAhdHJhY2VyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYWNlRm9ybWF0ID09PSBUcmFjZUZvcm1hdC5UZXh0KSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdCkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0gYFBhcmFtczogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLnBhcmFtcyl9XFxuXFxuYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSAnTm8gcGFyYW1ldGVycyBwcm92aWRlZC5cXG5cXG4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFNlbmRpbmcgbm90aWZpY2F0aW9uICcke21lc3NhZ2UubWV0aG9kfScuYCwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb2dMU1BNZXNzYWdlKCdzZW5kLW5vdGlmaWNhdGlvbicsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhY2VGb3JtYXQgPT09IFRyYWNlRm9ybWF0LlRleHQpIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZXJyb3IgJiYgbWVzc2FnZS5lcnJvci5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgRXJyb3IgZGF0YTogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLmVycm9yLmRhdGEpfVxcblxcbmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgUmVzdWx0OiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucmVzdWx0KX1cXG5cXG5gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UuZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9ICdObyByZXN1bHQgcmV0dXJuZWQuXFxuXFxuJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFNlbmRpbmcgcmVzcG9uc2UgJyR7bWV0aG9kfSAtICgke21lc3NhZ2UuaWR9KScuIFByb2Nlc3NpbmcgcmVxdWVzdCB0b29rICR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1tc2AsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgnc2VuZC1yZXNwb25zZScsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYWNlUmVjZWl2ZWRSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFjZUZvcm1hdCA9PT0gVHJhY2VGb3JtYXQuVGV4dCkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSAmJiBtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBgUGFyYW1zOiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucGFyYW1zKX1cXG5cXG5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJhY2VyLmxvZyhgUmVjZWl2ZWQgcmVxdWVzdCAnJHttZXNzYWdlLm1ldGhvZH0gLSAoJHttZXNzYWdlLmlkfSknLmAsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1yZXF1ZXN0JywgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdHJhY2VSZWNlaXZlZE5vdGlmaWNhdGlvbihtZXNzYWdlKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIgfHwgbWVzc2FnZS5tZXRob2QgPT09IExvZ1RyYWNlTm90aWZpY2F0aW9uLnR5cGUubWV0aG9kKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYWNlRm9ybWF0ID09PSBUcmFjZUZvcm1hdC5UZXh0KSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdCkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0gYFBhcmFtczogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLnBhcmFtcyl9XFxuXFxuYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSAnTm8gcGFyYW1ldGVycyBwcm92aWRlZC5cXG5cXG4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFJlY2VpdmVkIG5vdGlmaWNhdGlvbiAnJHttZXNzYWdlLm1ldGhvZH0nLmAsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1ub3RpZmljYXRpb24nLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVJlY2VpdmVkUmVzcG9uc2UobWVzc2FnZSwgcmVzcG9uc2VQcm9taXNlKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhY2VGb3JtYXQgPT09IFRyYWNlRm9ybWF0LlRleHQpIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZXJyb3IgJiYgbWVzc2FnZS5lcnJvci5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgRXJyb3IgZGF0YTogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLmVycm9yLmRhdGEpfVxcblxcbmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgUmVzdWx0OiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucmVzdWx0KX1cXG5cXG5gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UuZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9ICdObyByZXN1bHQgcmV0dXJuZWQuXFxuXFxuJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXNwb25zZVByb21pc2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IG1lc3NhZ2UuZXJyb3IgPyBgIFJlcXVlc3QgZmFpbGVkOiAke21lc3NhZ2UuZXJyb3IubWVzc2FnZX0gKCR7bWVzc2FnZS5lcnJvci5jb2RlfSkuYCA6ICcnO1xuICAgICAgICAgICAgICAgIHRyYWNlci5sb2coYFJlY2VpdmVkIHJlc3BvbnNlICcke3Jlc3BvbnNlUHJvbWlzZS5tZXRob2R9IC0gKCR7bWVzc2FnZS5pZH0pJyBpbiAke0RhdGUubm93KCkgLSByZXNwb25zZVByb21pc2UudGltZXJTdGFydH1tcy4ke2Vycm9yfWAsIGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJhY2VyLmxvZyhgUmVjZWl2ZWQgcmVzcG9uc2UgJHttZXNzYWdlLmlkfSB3aXRob3V0IGFjdGl2ZSByZXNwb25zZSBwcm9taXNlLmAsIGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1yZXNwb25zZScsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGxvZ0xTUE1lc3NhZ2UodHlwZSwgbWVzc2FnZSkge1xuICAgICAgICBpZiAoIXRyYWNlciB8fCB0cmFjZSA9PT0gVHJhY2UuT2ZmKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbHNwTWVzc2FnZSA9IHtcbiAgICAgICAgICAgIGlzTFNQTWVzc2FnZTogdHJ1ZSxcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpXG4gICAgICAgIH07XG4gICAgICAgIHRyYWNlci5sb2cobHNwTWVzc2FnZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRocm93SWZDbG9zZWRPckRpc3Bvc2VkKCkge1xuICAgICAgICBpZiAoaXNDbG9zZWQoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IENvbm5lY3Rpb25FcnJvcihDb25uZWN0aW9uRXJyb3JzLkNsb3NlZCwgJ0Nvbm5lY3Rpb24gaXMgY2xvc2VkLicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0Rpc3Bvc2VkKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb25uZWN0aW9uRXJyb3IoQ29ubmVjdGlvbkVycm9ycy5EaXNwb3NlZCwgJ0Nvbm5lY3Rpb24gaXMgZGlzcG9zZWQuJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdGhyb3dJZkxpc3RlbmluZygpIHtcbiAgICAgICAgaWYgKGlzTGlzdGVuaW5nKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb25uZWN0aW9uRXJyb3IoQ29ubmVjdGlvbkVycm9ycy5BbHJlYWR5TGlzdGVuaW5nLCAnQ29ubmVjdGlvbiBpcyBhbHJlYWR5IGxpc3RlbmluZycpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRocm93SWZOb3RMaXN0ZW5pbmcoKSB7XG4gICAgICAgIGlmICghaXNMaXN0ZW5pbmcoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYWxsIGxpc3RlbigpIGZpcnN0LicpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVuZGVmaW5lZFRvTnVsbChwYXJhbSkge1xuICAgICAgICBpZiAocGFyYW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyYW07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gbnVsbFRvVW5kZWZpbmVkKHBhcmFtKSB7XG4gICAgICAgIGlmIChwYXJhbSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJhbTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBpc05hbWVkUGFyYW0ocGFyYW0pIHtcbiAgICAgICAgcmV0dXJuIHBhcmFtICE9PSB1bmRlZmluZWQgJiYgcGFyYW0gIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkocGFyYW0pICYmIHR5cGVvZiBwYXJhbSA9PT0gJ29iamVjdCc7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXB1dGVTaW5nbGVQYXJhbShwYXJhbWV0ZXJTdHJ1Y3R1cmVzLCBwYXJhbSkge1xuICAgICAgICBzd2l0Y2ggKHBhcmFtZXRlclN0cnVjdHVyZXMpIHtcbiAgICAgICAgICAgIGNhc2UgbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG86XG4gICAgICAgICAgICAgICAgaWYgKGlzTmFtZWRQYXJhbShwYXJhbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxUb1VuZGVmaW5lZChwYXJhbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3VuZGVmaW5lZFRvTnVsbChwYXJhbSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZTpcbiAgICAgICAgICAgICAgICBpZiAoIWlzTmFtZWRQYXJhbShwYXJhbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWNlaXZlZCBwYXJhbWV0ZXJzIGJ5IG5hbWUgYnV0IHBhcmFtIGlzIG5vdCBhbiBvYmplY3QgbGl0ZXJhbC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGxUb1VuZGVmaW5lZChwYXJhbSk7XG4gICAgICAgICAgICBjYXNlIG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieVBvc2l0aW9uOlxuICAgICAgICAgICAgICAgIHJldHVybiBbdW5kZWZpbmVkVG9OdWxsKHBhcmFtKV07XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBwYXJhbWV0ZXIgc3RydWN0dXJlICR7cGFyYW1ldGVyU3RydWN0dXJlcy50b1N0cmluZygpfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXB1dGVNZXNzYWdlUGFyYW1zKHR5cGUsIHBhcmFtcykge1xuICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICBjb25zdCBudW1iZXJPZlBhcmFtcyA9IHR5cGUubnVtYmVyT2ZQYXJhbXM7XG4gICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gY29tcHV0ZVNpbmdsZVBhcmFtKHR5cGUucGFyYW1ldGVyU3RydWN0dXJlcywgcGFyYW1zWzBdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoICYmIGkgPCBudW1iZXJPZlBhcmFtczsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHVuZGVmaW5lZFRvTnVsbChwYXJhbXNbaV0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPCBudW1iZXJPZlBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gcGFyYW1zLmxlbmd0aDsgaSA8IG51bWJlck9mUGFyYW1zOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB7XG4gICAgICAgIHNlbmROb3RpZmljYXRpb246ICh0eXBlLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlUGFyYW1zO1xuICAgICAgICAgICAgaWYgKElzLnN0cmluZyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICAgIGxldCBwYXJhbVN0YXJ0ID0gMDtcbiAgICAgICAgICAgICAgICBsZXQgcGFyYW1ldGVyU3RydWN0dXJlcyA9IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvO1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuaXMoZmlyc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtU3RhcnQgPSAxO1xuICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gZmlyc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBwYXJhbUVuZCA9IGFyZ3MubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gcGFyYW1FbmQgLSBwYXJhbVN0YXJ0O1xuICAgICAgICAgICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zID0gY29tcHV0ZVNpbmdsZVBhcmFtKHBhcmFtZXRlclN0cnVjdHVyZXMsIGFyZ3NbcGFyYW1TdGFydF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjZWl2ZWQgJHtudW1iZXJPZlBhcmFtc30gcGFyYW1ldGVycyBmb3IgJ2J5IE5hbWUnIG5vdGlmaWNhdGlvbiBwYXJhbWV0ZXIgc3RydWN0dXJlLmApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IGFyZ3Muc2xpY2UocGFyYW1TdGFydCwgcGFyYW1FbmQpLm1hcCh2YWx1ZSA9PiB1bmRlZmluZWRUb051bGwodmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IGFyZ3M7XG4gICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZS5tZXRob2Q7XG4gICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IGNvbXB1dGVNZXNzYWdlUGFyYW1zKHR5cGUsIHBhcmFtcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBub3RpZmljYXRpb25NZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBtZXNzYWdlUGFyYW1zXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdHJhY2VTZW5kaW5nTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbk1lc3NhZ2UpO1xuICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2VXcml0ZXIud3JpdGUobm90aWZpY2F0aW9uTWVzc2FnZSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBTZW5kaW5nIG5vdGlmaWNhdGlvbiBmYWlsZWQuYCk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25Ob3RpZmljYXRpb246ICh0eXBlLCBoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGlmIChJcy5mdW5jKHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB0eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaGFuZGxlcikge1xuICAgICAgICAgICAgICAgIGlmIChJcy5zdHJpbmcodHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZTtcbiAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uSGFuZGxlcnMuc2V0KHR5cGUsIHsgdHlwZTogdW5kZWZpbmVkLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZS5tZXRob2Q7XG4gICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXJzLnNldCh0eXBlLm1ldGhvZCwgeyB0eXBlLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXJzLmRlbGV0ZShtZXRob2QpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBvblByb2dyZXNzOiAoX3R5cGUsIHRva2VuLCBoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgICBpZiAocHJvZ3Jlc3NIYW5kbGVycy5oYXModG9rZW4pKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm9ncmVzcyBoYW5kbGVyIGZvciB0b2tlbiAke3Rva2VufSBhbHJlYWR5IHJlZ2lzdGVyZWRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByb2dyZXNzSGFuZGxlcnMuc2V0KHRva2VuLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc0hhbmRsZXJzLmRlbGV0ZSh0b2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgc2VuZFByb2dyZXNzOiAoX3R5cGUsIHRva2VuLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGF3YWl0IGJ1dCBzaW1wbGUgcmV0dXJuIHRvIGVuc3VyZSB0aGF0IHdlIGRvbid0IGhhdmUgYW5vdGhlclxuICAgICAgICAgICAgLy8gYXN5bmMgc2NoZWR1bGluZy4gT3RoZXJ3aXNlIG9uZSBzZW5kIGNvdWxkIG92ZXJ0YWtlIGFub3RoZXIgc2VuZC5cbiAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLnNlbmROb3RpZmljYXRpb24oUHJvZ3Jlc3NOb3RpZmljYXRpb24udHlwZSwgeyB0b2tlbiwgdmFsdWUgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uVW5oYW5kbGVkUHJvZ3Jlc3M6IHVuaGFuZGxlZFByb2dyZXNzRW1pdHRlci5ldmVudCxcbiAgICAgICAgc2VuZFJlcXVlc3Q6ICh0eXBlLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgdGhyb3dJZk5vdExpc3RlbmluZygpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlUGFyYW1zO1xuICAgICAgICAgICAgbGV0IHRva2VuID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKElzLnN0cmluZyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3QgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgbGV0IHBhcmFtU3RhcnQgPSAwO1xuICAgICAgICAgICAgICAgIGxldCBwYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG87XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5pcyhmaXJzdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1TdGFydCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlclN0cnVjdHVyZXMgPSBmaXJzdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHBhcmFtRW5kID0gYXJncy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuLmlzKGxhc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtRW5kID0gcGFyYW1FbmQgLSAxO1xuICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IGxhc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gcGFyYW1FbmQgLSBwYXJhbVN0YXJ0O1xuICAgICAgICAgICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zID0gY29tcHV0ZVNpbmdsZVBhcmFtKHBhcmFtZXRlclN0cnVjdHVyZXMsIGFyZ3NbcGFyYW1TdGFydF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjZWl2ZWQgJHtudW1iZXJPZlBhcmFtc30gcGFyYW1ldGVycyBmb3IgJ2J5IE5hbWUnIHJlcXVlc3QgcGFyYW1ldGVyIHN0cnVjdHVyZS5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMgPSBhcmdzLnNsaWNlKHBhcmFtU3RhcnQsIHBhcmFtRW5kKS5tYXAodmFsdWUgPT4gdW5kZWZpbmVkVG9OdWxsKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBhcmdzO1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGUubWV0aG9kO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMgPSBjb21wdXRlTWVzc2FnZVBhcmFtcyh0eXBlLCBwYXJhbXMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gdHlwZS5udW1iZXJPZlBhcmFtcztcbiAgICAgICAgICAgICAgICB0b2tlbiA9IGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuLmlzKHBhcmFtc1tudW1iZXJPZlBhcmFtc10pID8gcGFyYW1zW251bWJlck9mUGFyYW1zXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGlkID0gc2VxdWVuY2VOdW1iZXIrKztcbiAgICAgICAgICAgIGxldCBkaXNwb3NhYmxlO1xuICAgICAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgICAgICAgZGlzcG9zYWJsZSA9IHRva2VuLm9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcCA9IGNhbmNlbGxhdGlvblN0cmF0ZWd5LnNlbmRlci5zZW5kQ2FuY2VsbGF0aW9uKGNvbm5lY3Rpb24sIGlkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhgUmVjZWl2ZWQgbm8gcHJvbWlzZSBmcm9tIGNhbmNlbGxhdGlvbiBzdHJhdGVneSB3aGVuIGNhbmNlbGxpbmcgaWQgJHtpZH1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIubG9nKGBTZW5kaW5nIGNhbmNlbGxhdGlvbiBtZXNzYWdlcyBmb3IgaWQgJHtpZH0gZmFpbGVkYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdE1lc3NhZ2UgPSB7XG4gICAgICAgICAgICAgICAganNvbnJwYzogdmVyc2lvbixcbiAgICAgICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBtZXNzYWdlUGFyYW1zXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdHJhY2VTZW5kaW5nUmVxdWVzdChyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNhbmNlbGxhdGlvblN0cmF0ZWd5LnNlbmRlci5lbmFibGVDYW5jZWxsYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25TdHJhdGVneS5zZW5kZXIuZW5hYmxlQ2FuY2VsbGF0aW9uKHJlcXVlc3RNZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZVdpdGhDbGVhbnVwID0gKHIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyKTtcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uU3RyYXRlZ3kuc2VuZGVyLmNsZWFudXAoaWQpO1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlPy5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWplY3RXaXRoQ2xlYW51cCA9IChyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChyKTtcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uU3RyYXRlZ3kuc2VuZGVyLmNsZWFudXAoaWQpO1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlPy5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZVByb21pc2UgPSB7IG1ldGhvZDogbWV0aG9kLCB0aW1lclN0YXJ0OiBEYXRlLm5vdygpLCByZXNvbHZlOiByZXNvbHZlV2l0aENsZWFudXAsIHJlamVjdDogcmVqZWN0V2l0aENsZWFudXAgfTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2VzLnNldChpZCwgcmVzcG9uc2VQcm9taXNlKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbWVzc2FnZVdyaXRlci53cml0ZShyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAvLyBXcml0aW5nIHRoZSBtZXNzYWdlIGZhaWxlZC4gU28gd2UgbmVlZCB0byBkZWxldGUgaXQgZnJvbSB0aGUgcmVzcG9uc2UgcHJvbWlzZXMgYW5kXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlamVjdCBpdC5cbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlcy5kZWxldGUoaWQpO1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2UucmVqZWN0KG5ldyBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IobWVzc2FnZXNfMS5FcnJvckNvZGVzLk1lc3NhZ2VXcml0ZUVycm9yLCBlcnJvci5tZXNzYWdlID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIHJlYXNvbicpKTtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlcXVlc3QgZmFpbGVkLmApO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25SZXF1ZXN0OiAodHlwZSwgaGFuZGxlcikgPT4ge1xuICAgICAgICAgICAgdGhyb3dJZkNsb3NlZE9yRGlzcG9zZWQoKTtcbiAgICAgICAgICAgIGxldCBtZXRob2QgPSBudWxsO1xuICAgICAgICAgICAgaWYgKFN0YXJSZXF1ZXN0SGFuZGxlci5pcyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBzdGFyUmVxdWVzdEhhbmRsZXIgPSB0eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoSXMuc3RyaW5nKHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgbWV0aG9kID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoaGFuZGxlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RIYW5kbGVycy5zZXQodHlwZSwgeyBoYW5kbGVyOiBoYW5kbGVyLCB0eXBlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSB0eXBlLm1ldGhvZDtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEhhbmRsZXJzLnNldCh0eXBlLm1ldGhvZCwgeyB0eXBlLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SGFuZGxlcnMuZGVsZXRlKG1ldGhvZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFyUmVxdWVzdEhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBoYXNQZW5kaW5nUmVzcG9uc2U6ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZVByb21pc2VzLnNpemUgPiAwO1xuICAgICAgICB9LFxuICAgICAgICB0cmFjZTogYXN5bmMgKF92YWx1ZSwgX3RyYWNlciwgc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBsZXQgX3NlbmROb3RpZmljYXRpb24gPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBfdHJhY2VGb3JtYXQgPSBUcmFjZUZvcm1hdC5UZXh0O1xuICAgICAgICAgICAgaWYgKHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKElzLmJvb2xlYW4oc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zKSkge1xuICAgICAgICAgICAgICAgICAgICBfc2VuZE5vdGlmaWNhdGlvbiA9IHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF9zZW5kTm90aWZpY2F0aW9uID0gc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zLnNlbmROb3RpZmljYXRpb24gfHwgZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIF90cmFjZUZvcm1hdCA9IHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucy50cmFjZUZvcm1hdCB8fCBUcmFjZUZvcm1hdC5UZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlID0gX3ZhbHVlO1xuICAgICAgICAgICAgdHJhY2VGb3JtYXQgPSBfdHJhY2VGb3JtYXQ7XG4gICAgICAgICAgICBpZiAodHJhY2UgPT09IFRyYWNlLk9mZikge1xuICAgICAgICAgICAgICAgIHRyYWNlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRyYWNlciA9IF90cmFjZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoX3NlbmROb3RpZmljYXRpb24gJiYgIWlzQ2xvc2VkKCkgJiYgIWlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGNvbm5lY3Rpb24uc2VuZE5vdGlmaWNhdGlvbihTZXRUcmFjZU5vdGlmaWNhdGlvbi50eXBlLCB7IHZhbHVlOiBUcmFjZS50b1N0cmluZyhfdmFsdWUpIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBvbkVycm9yOiBlcnJvckVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIG9uQ2xvc2U6IGNsb3NlRW1pdHRlci5ldmVudCxcbiAgICAgICAgb25VbmhhbmRsZWROb3RpZmljYXRpb246IHVuaGFuZGxlZE5vdGlmaWNhdGlvbkVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIG9uRGlzcG9zZTogZGlzcG9zZUVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIGVuZDogKCkgPT4ge1xuICAgICAgICAgICAgbWVzc2FnZVdyaXRlci5lbmQoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLkRpc3Bvc2VkO1xuICAgICAgICAgICAgZGlzcG9zZUVtaXR0ZXIuZmlyZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5QZW5kaW5nUmVzcG9uc2VSZWplY3RlZCwgJ1BlbmRpbmcgcmVzcG9uc2UgcmVqZWN0ZWQgc2luY2UgY29ubmVjdGlvbiBnb3QgZGlzcG9zZWQnKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvbWlzZSBvZiByZXNwb25zZVByb21pc2VzLnZhbHVlcygpKSB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBrbm93bkNhbmNlbGVkUmVxdWVzdHMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICBtZXNzYWdlUXVldWUgPSBuZXcgbGlua2VkTWFwXzEuTGlua2VkTWFwKCk7XG4gICAgICAgICAgICAvLyBUZXN0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgaWYgKElzLmZ1bmMobWVzc2FnZVdyaXRlci5kaXNwb3NlKSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKElzLmZ1bmMobWVzc2FnZVJlYWRlci5kaXNwb3NlKSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VSZWFkZXIuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBsaXN0ZW46ICgpID0+IHtcbiAgICAgICAgICAgIHRocm93SWZDbG9zZWRPckRpc3Bvc2VkKCk7XG4gICAgICAgICAgICB0aHJvd0lmTGlzdGVuaW5nKCk7XG4gICAgICAgICAgICBzdGF0ZSA9IENvbm5lY3Rpb25TdGF0ZS5MaXN0ZW5pbmc7XG4gICAgICAgICAgICBtZXNzYWdlUmVhZGVyLmxpc3RlbihjYWxsYmFjayk7XG4gICAgICAgIH0sXG4gICAgICAgIGluc3BlY3Q6ICgpID0+IHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS5jb25zb2xlLmxvZygnaW5zcGVjdCcpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25uZWN0aW9uLm9uTm90aWZpY2F0aW9uKExvZ1RyYWNlTm90aWZpY2F0aW9uLnR5cGUsIChwYXJhbXMpID0+IHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZlcmJvc2UgPSB0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdDtcbiAgICAgICAgdHJhY2VyLmxvZyhwYXJhbXMubWVzc2FnZSwgdmVyYm9zZSA/IHBhcmFtcy52ZXJib3NlIDogdW5kZWZpbmVkKTtcbiAgICB9KTtcbiAgICBjb25uZWN0aW9uLm9uTm90aWZpY2F0aW9uKFByb2dyZXNzTm90aWZpY2F0aW9uLnR5cGUsIChwYXJhbXMpID0+IHtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IHByb2dyZXNzSGFuZGxlcnMuZ2V0KHBhcmFtcy50b2tlbik7XG4gICAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICAgICBoYW5kbGVyKHBhcmFtcy52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1bmhhbmRsZWRQcm9ncmVzc0VtaXR0ZXIuZmlyZShwYXJhbXMpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbm5lY3Rpb247XG59XG5leHBvcnRzLmNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uID0gY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb247XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vdHlwaW5ncy90aGVuYWJsZS5kLnRzXCIgLz5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUHJvZ3Jlc3NUeXBlID0gZXhwb3J0cy5Qcm9ncmVzc1Rva2VuID0gZXhwb3J0cy5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiA9IGV4cG9ydHMuTnVsbExvZ2dlciA9IGV4cG9ydHMuQ29ubmVjdGlvbk9wdGlvbnMgPSBleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IGV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlQnVmZmVyID0gZXhwb3J0cy5Xcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyID0gZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLk1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLlJlYWRhYmxlU3RyZWFtTWVzc2FnZVJlYWRlciA9IGV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlUmVhZGVyID0gZXhwb3J0cy5NZXNzYWdlUmVhZGVyID0gZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblRva2VuID0gZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IGV4cG9ydHMuRW1pdHRlciA9IGV4cG9ydHMuRXZlbnQgPSBleHBvcnRzLkRpc3Bvc2FibGUgPSBleHBvcnRzLkxSVUNhY2hlID0gZXhwb3J0cy5Ub3VjaCA9IGV4cG9ydHMuTGlua2VkTWFwID0gZXhwb3J0cy5QYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlOSA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTggPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU3ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNiA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTUgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU0ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMyA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTIgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUxID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMCA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZSA9IGV4cG9ydHMuRXJyb3JDb2RlcyA9IGV4cG9ydHMuUmVzcG9uc2VFcnJvciA9IGV4cG9ydHMuUmVxdWVzdFR5cGU5ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTggPSBleHBvcnRzLlJlcXVlc3RUeXBlNyA9IGV4cG9ydHMuUmVxdWVzdFR5cGU2ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTUgPSBleHBvcnRzLlJlcXVlc3RUeXBlNCA9IGV4cG9ydHMuUmVxdWVzdFR5cGUzID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTIgPSBleHBvcnRzLlJlcXVlc3RUeXBlMSA9IGV4cG9ydHMuUmVxdWVzdFR5cGUwID0gZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IGV4cG9ydHMuTWVzc2FnZSA9IGV4cG9ydHMuUkFMID0gdm9pZCAwO1xuZXhwb3J0cy5NZXNzYWdlU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblN0cmF0ZWd5ID0gZXhwb3J0cy5DYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IGV4cG9ydHMuQ29ubmVjdGlvbkVycm9yID0gZXhwb3J0cy5Db25uZWN0aW9uRXJyb3JzID0gZXhwb3J0cy5Mb2dUcmFjZU5vdGlmaWNhdGlvbiA9IGV4cG9ydHMuU2V0VHJhY2VOb3RpZmljYXRpb24gPSBleHBvcnRzLlRyYWNlRm9ybWF0ID0gZXhwb3J0cy5UcmFjZVZhbHVlcyA9IGV4cG9ydHMuVHJhY2UgPSB2b2lkIDA7XG5jb25zdCBtZXNzYWdlc18xID0gcmVxdWlyZShcIi4vbWVzc2FnZXNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNZXNzYWdlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk1lc3NhZ2U7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlMFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTA7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTFcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGUxOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGUyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlMjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlM1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGU0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGU1XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlNTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlNlwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTY7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTdcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGU3OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGU4XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlODsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlOVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTk7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXNwb25zZUVycm9yXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3I7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJFcnJvckNvZGVzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLkVycm9yQ29kZXM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlMFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlMDsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGUxXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGUxOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZTJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlM1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlMzsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGU0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZTVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlNlwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlNjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGU3XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU3OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZThcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTg7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlOVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlOTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlBhcmFtZXRlclN0cnVjdHVyZXNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlczsgfSB9KTtcbmNvbnN0IGxpbmtlZE1hcF8xID0gcmVxdWlyZShcIi4vbGlua2VkTWFwXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTGlua2VkTWFwXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBsaW5rZWRNYXBfMS5MaW5rZWRNYXA7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJMUlVDYWNoZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbGlua2VkTWFwXzEuTFJVQ2FjaGU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJUb3VjaFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbGlua2VkTWFwXzEuVG91Y2g7IH0gfSk7XG5jb25zdCBkaXNwb3NhYmxlXzEgPSByZXF1aXJlKFwiLi9kaXNwb3NhYmxlXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiRGlzcG9zYWJsZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZGlzcG9zYWJsZV8xLkRpc3Bvc2FibGU7IH0gfSk7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCIuL2V2ZW50c1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkV2ZW50XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBldmVudHNfMS5FdmVudDsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkVtaXR0ZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGV2ZW50c18xLkVtaXR0ZXI7IH0gfSk7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblRva2VuU291cmNlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjYW5jZWxsYXRpb25fMS5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblRva2VuXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjYW5jZWxsYXRpb25fMS5DYW5jZWxsYXRpb25Ub2tlbjsgfSB9KTtcbmNvbnN0IHNoYXJlZEFycmF5Q2FuY2VsbGF0aW9uXzEgPSByZXF1aXJlKFwiLi9zaGFyZWRBcnJheUNhbmNlbGxhdGlvblwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHNoYXJlZEFycmF5Q2FuY2VsbGF0aW9uXzEuU2hhcmVkQXJyYXlTZW5kZXJTdHJhdGVneTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlNoYXJlZEFycmF5UmVjZWl2ZXJTdHJhdGVneVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gc2hhcmVkQXJyYXlDYW5jZWxsYXRpb25fMS5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3k7IH0gfSk7XG5jb25zdCBtZXNzYWdlUmVhZGVyXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlUmVhZGVyXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTWVzc2FnZVJlYWRlclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZVJlYWRlcl8xLk1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VSZWFkZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VSZWFkZXJfMS5BYnN0cmFjdE1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VSZWFkZXJfMS5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5jb25zdCBtZXNzYWdlV3JpdGVyXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlV3JpdGVyXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTWVzc2FnZVdyaXRlclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZVdyaXRlcl8xLk1lc3NhZ2VXcml0ZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VXcml0ZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VXcml0ZXJfMS5BYnN0cmFjdE1lc3NhZ2VXcml0ZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJXcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlV3JpdGVyXzEuV3JpdGVhYmxlU3RyZWFtTWVzc2FnZVdyaXRlcjsgfSB9KTtcbmNvbnN0IG1lc3NhZ2VCdWZmZXJfMSA9IHJlcXVpcmUoXCIuL21lc3NhZ2VCdWZmZXJcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VCdWZmZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VCdWZmZXJfMS5BYnN0cmFjdE1lc3NhZ2VCdWZmZXI7IH0gfSk7XG5jb25zdCBjb25uZWN0aW9uXzEgPSByZXF1aXJlKFwiLi9jb25uZWN0aW9uXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29ubmVjdGlvblN0cmF0ZWd5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ29ubmVjdGlvblN0cmF0ZWd5OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29ubmVjdGlvbk9wdGlvbnNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5Db25uZWN0aW9uT3B0aW9uczsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk51bGxMb2dnZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5OdWxsTG9nZ2VyOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb25cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlByb2dyZXNzVG9rZW5cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5Qcm9ncmVzc1Rva2VuOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUHJvZ3Jlc3NUeXBlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuUHJvZ3Jlc3NUeXBlOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiVHJhY2VcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5UcmFjZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlRyYWNlVmFsdWVzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuVHJhY2VWYWx1ZXM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJUcmFjZUZvcm1hdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29ubmVjdGlvbl8xLlRyYWNlRm9ybWF0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiU2V0VHJhY2VOb3RpZmljYXRpb25cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5TZXRUcmFjZU5vdGlmaWNhdGlvbjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkxvZ1RyYWNlTm90aWZpY2F0aW9uXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuTG9nVHJhY2VOb3RpZmljYXRpb247IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJDb25uZWN0aW9uRXJyb3JzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ29ubmVjdGlvbkVycm9yczsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNvbm5lY3Rpb25FcnJvclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29ubmVjdGlvbl8xLkNvbm5lY3Rpb25FcnJvcjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5DYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5DYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblN0cmF0ZWd5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ2FuY2VsbGF0aW9uU3RyYXRlZ3k7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNZXNzYWdlU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5NZXNzYWdlU3RyYXRlZ3k7IH0gfSk7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbmV4cG9ydHMuUkFMID0gcmFsXzEuZGVmYXVsdDtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGFwaV8xID0gcmVxdWlyZShcIi4uL2NvbW1vbi9hcGlcIik7XG5jbGFzcyBNZXNzYWdlQnVmZmVyIGV4dGVuZHMgYXBpXzEuQWJzdHJhY3RNZXNzYWdlQnVmZmVyIHtcbiAgICBjb25zdHJ1Y3RvcihlbmNvZGluZyA9ICd1dGYtOCcpIHtcbiAgICAgICAgc3VwZXIoZW5jb2RpbmcpO1xuICAgICAgICB0aGlzLmFzY2lpRGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcignYXNjaWknKTtcbiAgICB9XG4gICAgZW1wdHlCdWZmZXIoKSB7XG4gICAgICAgIHJldHVybiBNZXNzYWdlQnVmZmVyLmVtcHR5QnVmZmVyO1xuICAgIH1cbiAgICBmcm9tU3RyaW5nKHZhbHVlLCBfZW5jb2RpbmcpIHtcbiAgICAgICAgcmV0dXJuIChuZXcgVGV4dEVuY29kZXIoKSkuZW5jb2RlKHZhbHVlKTtcbiAgICB9XG4gICAgdG9TdHJpbmcodmFsdWUsIGVuY29kaW5nKSB7XG4gICAgICAgIGlmIChlbmNvZGluZyA9PT0gJ2FzY2lpJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXNjaWlEZWNvZGVyLmRlY29kZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gKG5ldyBUZXh0RGVjb2RlcihlbmNvZGluZykpLmRlY29kZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXNOYXRpdmUoYnVmZmVyLCBsZW5ndGgpIHtcbiAgICAgICAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlci5zbGljZSgwLCBsZW5ndGgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFsbG9jTmF0aXZlKGxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTtcbiAgICB9XG59XG5NZXNzYWdlQnVmZmVyLmVtcHR5QnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMCk7XG5jbGFzcyBSZWFkYWJsZVN0cmVhbVdyYXBwZXIge1xuICAgIGNvbnN0cnVjdG9yKHNvY2tldCkge1xuICAgICAgICB0aGlzLnNvY2tldCA9IHNvY2tldDtcbiAgICAgICAgdGhpcy5fb25EYXRhID0gbmV3IGFwaV8xLkVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5fbWVzc2FnZUxpc3RlbmVyID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBibG9iID0gZXZlbnQuZGF0YTtcbiAgICAgICAgICAgIGJsb2IuYXJyYXlCdWZmZXIoKS50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkRhdGEuZmlyZShuZXcgVWludDhBcnJheShidWZmZXIpKTtcbiAgICAgICAgICAgIH0sICgpID0+IHtcbiAgICAgICAgICAgICAgICAoMCwgYXBpXzEuUkFMKSgpLmNvbnNvbGUuZXJyb3IoYENvbnZlcnRpbmcgYmxvYiB0byBhcnJheSBidWZmZXIgZmFpbGVkLmApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLl9tZXNzYWdlTGlzdGVuZXIpO1xuICAgIH1cbiAgICBvbkNsb3NlKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2Nsb3NlJywgbGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gYXBpXzEuRGlzcG9zYWJsZS5jcmVhdGUoKCkgPT4gdGhpcy5zb2NrZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xvc2UnLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkVycm9yKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgbGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gYXBpXzEuRGlzcG9zYWJsZS5jcmVhdGUoKCkgPT4gdGhpcy5zb2NrZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkVuZChsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKCdlbmQnLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdlbmQnLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkRhdGEobGlzdGVuZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uRGF0YS5ldmVudChsaXN0ZW5lcik7XG4gICAgfVxufVxuY2xhc3MgV3JpdGFibGVTdHJlYW1XcmFwcGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihzb2NrZXQpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7XG4gICAgfVxuICAgIG9uQ2xvc2UobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignY2xvc2UnLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbG9zZScsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIG9uRXJyb3IobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIG9uRW5kKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2VuZCcsIGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIGFwaV8xLkRpc3Bvc2FibGUuY3JlYXRlKCgpID0+IHRoaXMuc29ja2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2VuZCcsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIHdyaXRlKGRhdGEsIGVuY29kaW5nKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkICYmIGVuY29kaW5nICE9PSAndXRmLTgnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbiBhIEJyb3dzZXIgZW52aXJvbm1lbnRzIG9ubHkgdXRmLTggdGV4dCBlbmNvZGluZyBpcyBzdXBwb3J0ZWQuIEJ1dCBnb3QgZW5jb2Rpbmc6ICR7ZW5jb2Rpbmd9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKTtcbiAgICB9XG59XG5jb25zdCBfdGV4dEVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbmNvbnN0IF9yaWwgPSBPYmplY3QuZnJlZXplKHtcbiAgICBtZXNzYWdlQnVmZmVyOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgY3JlYXRlOiAoZW5jb2RpbmcpID0+IG5ldyBNZXNzYWdlQnVmZmVyKGVuY29kaW5nKVxuICAgIH0pLFxuICAgIGFwcGxpY2F0aW9uSnNvbjogT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGVuY29kZXI6IE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgbmFtZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgZW5jb2RlOiAobXNnLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2hhcnNldCAhPT0gJ3V0Zi04Jykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluIGEgQnJvd3NlciBlbnZpcm9ubWVudHMgb25seSB1dGYtOCB0ZXh0IGVuY29kaW5nIGlzIHN1cHBvcnRlZC4gQnV0IGdvdCBlbmNvZGluZzogJHtvcHRpb25zLmNoYXJzZXR9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoX3RleHRFbmNvZGVyLmVuY29kZShKU09OLnN0cmluZ2lmeShtc2csIHVuZGVmaW5lZCwgMCkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIGRlY29kZXI6IE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgbmFtZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgZGVjb2RlOiAoYnVmZmVyLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCEoYnVmZmVyIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbiBhIEJyb3dzZXIgZW52aXJvbm1lbnRzIG9ubHkgVWludDhBcnJheXMgYXJlIHN1cHBvcnRlZC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShKU09OLnBhcnNlKG5ldyBUZXh0RGVjb2RlcihvcHRpb25zLmNoYXJzZXQpLmRlY29kZShidWZmZXIpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfSksXG4gICAgc3RyZWFtOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgYXNSZWFkYWJsZVN0cmVhbTogKHNvY2tldCkgPT4gbmV3IFJlYWRhYmxlU3RyZWFtV3JhcHBlcihzb2NrZXQpLFxuICAgICAgICBhc1dyaXRhYmxlU3RyZWFtOiAoc29ja2V0KSA9PiBuZXcgV3JpdGFibGVTdHJlYW1XcmFwcGVyKHNvY2tldClcbiAgICB9KSxcbiAgICBjb25zb2xlOiBjb25zb2xlLFxuICAgIHRpbWVyOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgc2V0VGltZW91dChjYWxsYmFjaywgbXMsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHNldFRpbWVvdXQoY2FsbGJhY2ssIG1zLCAuLi5hcmdzKTtcbiAgICAgICAgICAgIHJldHVybiB7IGRpc3Bvc2U6ICgpID0+IGNsZWFyVGltZW91dChoYW5kbGUpIH07XG4gICAgICAgIH0sXG4gICAgICAgIHNldEltbWVkaWF0ZShjYWxsYmFjaywgLi4uYXJncykge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gc2V0VGltZW91dChjYWxsYmFjaywgMCwgLi4uYXJncyk7XG4gICAgICAgICAgICByZXR1cm4geyBkaXNwb3NlOiAoKSA9PiBjbGVhclRpbWVvdXQoaGFuZGxlKSB9O1xuICAgICAgICB9LFxuICAgICAgICBzZXRJbnRlcnZhbChjYWxsYmFjaywgbXMsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHNldEludGVydmFsKGNhbGxiYWNrLCBtcywgLi4uYXJncyk7XG4gICAgICAgICAgICByZXR1cm4geyBkaXNwb3NlOiAoKSA9PiBjbGVhckludGVydmFsKGhhbmRsZSkgfTtcbiAgICAgICAgfSxcbiAgICB9KVxufSk7XG5mdW5jdGlvbiBSSUwoKSB7XG4gICAgcmV0dXJuIF9yaWw7XG59XG4oZnVuY3Rpb24gKFJJTCkge1xuICAgIGZ1bmN0aW9uIGluc3RhbGwoKSB7XG4gICAgICAgIGFwaV8xLlJBTC5pbnN0YWxsKF9yaWwpO1xuICAgIH1cbiAgICBSSUwuaW5zdGFsbCA9IGluc3RhbGw7XG59KShSSUwgfHwgKFJJTCA9IHt9KSk7XG5leHBvcnRzLmRlZmF1bHQgPSBSSUw7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24gPSBleHBvcnRzLkJyb3dzZXJNZXNzYWdlV3JpdGVyID0gZXhwb3J0cy5Ccm93c2VyTWVzc2FnZVJlYWRlciA9IHZvaWQgMDtcbmNvbnN0IHJpbF8xID0gcmVxdWlyZShcIi4vcmlsXCIpO1xuLy8gSW5zdGFsbCB0aGUgYnJvd3NlciBydW50aW1lIGFic3RyYWN0LlxucmlsXzEuZGVmYXVsdC5pbnN0YWxsKCk7XG5jb25zdCBhcGlfMSA9IHJlcXVpcmUoXCIuLi9jb21tb24vYXBpXCIpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuLi9jb21tb24vYXBpXCIpLCBleHBvcnRzKTtcbmNsYXNzIEJyb3dzZXJNZXNzYWdlUmVhZGVyIGV4dGVuZHMgYXBpXzEuQWJzdHJhY3RNZXNzYWdlUmVhZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihwb3J0KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX29uRGF0YSA9IG5ldyBhcGlfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuX21lc3NhZ2VMaXN0ZW5lciA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fb25EYXRhLmZpcmUoZXZlbnQuZGF0YSk7XG4gICAgICAgIH07XG4gICAgICAgIHBvcnQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoZXZlbnQpID0+IHRoaXMuZmlyZUVycm9yKGV2ZW50KSk7XG4gICAgICAgIHBvcnQub25tZXNzYWdlID0gdGhpcy5fbWVzc2FnZUxpc3RlbmVyO1xuICAgIH1cbiAgICBsaXN0ZW4oY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uRGF0YS5ldmVudChjYWxsYmFjayk7XG4gICAgfVxufVxuZXhwb3J0cy5Ccm93c2VyTWVzc2FnZVJlYWRlciA9IEJyb3dzZXJNZXNzYWdlUmVhZGVyO1xuY2xhc3MgQnJvd3Nlck1lc3NhZ2VXcml0ZXIgZXh0ZW5kcyBhcGlfMS5BYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKHBvcnQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50ID0gMDtcbiAgICAgICAgcG9ydC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIChldmVudCkgPT4gdGhpcy5maXJlRXJyb3IoZXZlbnQpKTtcbiAgICB9XG4gICAgd3JpdGUobXNnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnBvcnQucG9zdE1lc3NhZ2UobXNnKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IsIG1zZyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZUVycm9yKGVycm9yLCBtc2cpIHtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50Kys7XG4gICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yLCBtc2csIHRoaXMuZXJyb3JDb3VudCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICB9XG59XG5leHBvcnRzLkJyb3dzZXJNZXNzYWdlV3JpdGVyID0gQnJvd3Nlck1lc3NhZ2VXcml0ZXI7XG5mdW5jdGlvbiBjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbihyZWFkZXIsIHdyaXRlciwgbG9nZ2VyLCBvcHRpb25zKSB7XG4gICAgaWYgKGxvZ2dlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxvZ2dlciA9IGFwaV8xLk51bGxMb2dnZXI7XG4gICAgfVxuICAgIGlmIChhcGlfMS5Db25uZWN0aW9uU3RyYXRlZ3kuaXMob3B0aW9ucykpIHtcbiAgICAgICAgb3B0aW9ucyA9IHsgY29ubmVjdGlvblN0cmF0ZWd5OiBvcHRpb25zIH07XG4gICAgfVxuICAgIHJldHVybiAoMCwgYXBpXzEuY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24pKHJlYWRlciwgd3JpdGVyLCBsb2dnZXIsIG9wdGlvbnMpO1xufVxuZXhwb3J0cy5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiA9IGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uO1xuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL2Jyb3dzZXIvbWFpbicpOyIsICIvKlxuICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMjYgRWNsaXBzZSBEaXJpZ2libGUgY29udHJpYnV0b3JzXG4gKlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlXG4gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2Mi4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG4gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MjAuaHRtbFxuICpcbiAqIFNQRFgtRmlsZUNvcHlyaWdodFRleHQ6IEVjbGlwc2UgRGlyaWdpYmxlIGNvbnRyaWJ1dG9ycyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbi8qKlxuICogSmF2YSBMU1AgY2xpZW50IGJ1bmRsZS5cbiAqXG4gKiBVc2VzIHZzY29kZS13cy1qc29ucnBjIGZvciB0eXBlZCBKU09OLVJQQyBvdmVyIFdlYlNvY2tldCBhbmQgcmVnaXN0ZXJzIE1vbmFjb1xuICogcHJvdmlkZXJzIHRoYXQgZGVsZWdhdGUgdG8gSkRULkxTLiBFeHBvc2VkIGFzIGdsb2JhbCBKYXZhTHNwQ2xpZW50TGliIHNvIHRoYXRcbiAqIGVkaXRvci5qcyBjYW4gY2FsbCBKYXZhTHNwQ2xpZW50TGliLmNvbm5lY3QocmVzb3VyY2VQYXRoKS5cbiAqXG4gKiBPbmUgSkRULkxTIHByb2Nlc3MgY292ZXJzIHRoZSBlbnRpcmUgd29ya3NwYWNlLCBzbyBhIHNpbmdsZSBXZWJTb2NrZXQgY29ubmVjdGlvblxuICogaXMgc2hhcmVkIGFjcm9zcyBhbGwgSmF2YSBmaWxlcyBvcGVuIGluIHRoZSBzYW1lIGJyb3dzZXIgcGFnZS4gVGhlIGNvbm5lY3Rpb24gaXNcbiAqIGVzdGFibGlzaGVkIG9uIHRoZSBmaXJzdCBjb25uZWN0KCkgY2FsbCBhbmQgcmV1c2VkIGZvciBhbGwgc3Vic2VxdWVudCBjYWxscy5cbiAqXG4gKiBlZGl0b3IuanMgc2V0cyB3aW5kb3cubW9uYWNvIGJlZm9yZSBjYWxsaW5nIGNvbm5lY3QoKSwgc28gdGhlIG1vbmFjby1zaGltJ3MgbGF6eVxuICogUHJveGllcyByZXNvbHZlIGNvcnJlY3RseSBhdCBjYWxsIHRpbWUuXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24sIE1lc3NhZ2VDb25uZWN0aW9uIH0gZnJvbSAndnNjb2RlLWpzb25ycGMvYnJvd3Nlcic7XG5pbXBvcnQgeyB0b1NvY2tldCwgV2ViU29ja2V0TWVzc2FnZVJlYWRlciwgV2ViU29ja2V0TWVzc2FnZVdyaXRlciB9IGZyb20gJ3ZzY29kZS13cy1qc29ucnBjJztcbmltcG9ydCAqIGFzIG1vbmFjbyBmcm9tICdtb25hY28tZWRpdG9yJztcbmltcG9ydCB7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLFxuICAgIERpYWdub3N0aWNTZXZlcml0eSxcbiAgICBJbnNlcnRUZXh0Rm9ybWF0LFxuICAgIE1hcmt1cENvbnRlbnQsXG4gICAgTWFya3VwS2luZCxcbiAgICB0eXBlIENvZGVBY3Rpb24sXG4gICAgdHlwZSBDb21tYW5kLFxuICAgIHR5cGUgQ29tcGxldGlvbkl0ZW0sXG4gICAgdHlwZSBDb21wbGV0aW9uTGlzdCxcbiAgICB0eXBlIERpYWdub3N0aWMsXG4gICAgdHlwZSBIb3ZlcixcbiAgICB0eXBlIExvY2F0aW9uLFxuICAgIHR5cGUgUGFyYW1ldGVySW5mb3JtYXRpb24sXG4gICAgdHlwZSBTaWduYXR1cmVIZWxwLFxuICAgIHR5cGUgU2lnbmF0dXJlSW5mb3JtYXRpb24sXG4gICAgdHlwZSBUZXh0RWRpdCxcbiAgICB0eXBlIFdvcmtzcGFjZUVkaXQsXG59IGZyb20gJ3ZzY29kZS1sYW5ndWFnZXNlcnZlci10eXBlcyc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNpbmdsZXRvbiBzdGF0ZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogU2hhcmVkIGNvbm5lY3Rpb24gXHUyMDE0IG9uZSBwZXIgYnJvd3NlciBwYWdlLCBjb3ZlcmluZyBhbGwgcHJvamVjdHMgaW4gdGhlIHdvcmtzcGFjZS4gKi9cbmxldCBfY29ubjogTWVzc2FnZUNvbm5lY3Rpb24gfCBudWxsID0gbnVsbDtcblxuLyoqXG4gKiBWaXJ0dWFsIHdvcmtzcGFjZSByb290IFVSSSwgZS5nLiB7QGNvZGUgZmlsZTovLy93b3Jrc3BhY2Uvd29ya3NwYWNlL30uXG4gKiBTZXQgb25jZSBvbiBmaXJzdCBjb25uZWN0KCk7IHVzZWQgdG8gc2NvcGUgTW9uYWNvIHByb3ZpZGVycyB0byB3b3Jrc3BhY2UgZmlsZXMuXG4gKi9cbmxldCBfd29ya3NwYWNlUm9vdCA9ICcnO1xuXG4vKiogVVJJcyBmb3Igd2hpY2ggdGV4dERvY3VtZW50L2RpZE9wZW4gaGFzIGFscmVhZHkgYmVlbiBzZW50LiAqL1xuY29uc3QgX29wZW5GaWxlczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cbi8qKiBQZW5kaW5nIGRlYm91bmNlZCBkaWRDaGFuZ2UgdGltZXJzIHBlciBmaWxlIFVSSSwgc28gYSBjaGFuZ2UgY2FuIGJlIGZsdXNoZWQgYmVmb3JlIGNvbXBsZXRpb24uICovXG5jb25zdCBfY2hhbmdlVGltZXJzOiBNYXA8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0Pj4gPSBuZXcgTWFwKCk7XG5cbmxldCBfcHJvdmlkZXJzUmVnaXN0ZXJlZCA9IGZhbHNlO1xuXG4vKiogU2VtYW50aWMtdG9rZW4gbGVnZW5kIHJlcG9ydGVkIGJ5IEpEVC5MUyBpbiB0aGUgaW5pdGlhbGl6ZSByZXN1bHQ7IG5lZWRlZCB0byBkZWNvZGUgdG9rZW4gZGF0YS4gKi9cbmxldCBfc2VtYW50aWNUb2tlbnNMZWdlbmQ6IHsgdG9rZW5UeXBlczogc3RyaW5nW107IHRva2VuTW9kaWZpZXJzOiBzdHJpbmdbXSB9IHwgbnVsbCA9IG51bGw7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFB1YmxpYyBBUElcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIENhbGxlZCBieSBlZGl0b3IuanMgd2hlbiBhIEphdmEgZmlsZSBpcyBvcGVuZWQuIFNhZmUgdG8gY2FsbCBtdWx0aXBsZSB0aW1lcy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb25uZWN0KHJlc291cmNlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFydHMgPSByZXNvdXJjZVBhdGgucmVwbGFjZSgvXlxcLy8sICcnKS5zcGxpdCgnLycpO1xuICAgIGNvbnN0IHdvcmtzcGFjZSA9IHBhcnRzWzBdO1xuICAgIGNvbnN0IHByb2plY3QgICA9IHBhcnRzWzFdO1xuICAgIGNvbnN0IGZpbGVVcmkgPSBgZmlsZTovLy93b3Jrc3BhY2UvJHt3b3Jrc3BhY2V9LyR7cHJvamVjdH0vJHtwYXJ0cy5zbGljZSgyKS5qb2luKCcvJyl9YDtcblxuICAgIGlmIChfY29ubikge1xuICAgICAgICAvLyBDb25uZWN0aW9uIGFscmVhZHkgZXN0YWJsaXNoZWQgXHUyMDE0IGp1c3Qgb3BlbiB0aGUgbmV3IGZpbGUuXG4gICAgICAgIG9wZW5GaWxlKGZpbGVVcmkpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgX3dvcmtzcGFjZVJvb3QgPSBgZmlsZTovLy93b3Jrc3BhY2UvJHt3b3Jrc3BhY2V9L2A7XG5cbiAgICBjb25zdCBwcm90byA9IGxvY2F0aW9uLnByb3RvY29sID09PSAnaHR0cHM6JyA/ICd3c3MnIDogJ3dzJztcbiAgICBjb25zdCB3c1VybCA9IGAke3Byb3RvfTovLyR7bG9jYXRpb24uaG9zdH0vd2Vic29ja2V0cy9pZGUvamF2YS1sc3BgXG4gICAgICAgICAgICAgICAgKyBgP3dvcmtzcGFjZT0ke2VuY29kZVVSSUNvbXBvbmVudCh3b3Jrc3BhY2UpfWA7XG5cbiAgICBjb25zdCB3cyA9IG5ldyBXZWJTb2NrZXQod3NVcmwpO1xuICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgd3Mub25vcGVuICA9ICgpID0+IHJlc29sdmUoKTtcbiAgICAgICAgd3Mub25lcnJvciA9ICgpID0+IHJlamVjdChuZXcgRXJyb3IoYFtqYXZhLWxzcF0gV2ViU29ja2V0IGNvbm5lY3QgZmFpbGVkOiAke3dzVXJsfWApKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHNvY2tldCA9IHRvU29ja2V0KHdzKTtcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgV2ViU29ja2V0TWVzc2FnZVJlYWRlcihzb2NrZXQpO1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBXZWJTb2NrZXRNZXNzYWdlV3JpdGVyKHNvY2tldCk7XG4gICAgX2Nvbm4gPSBjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbihyZWFkZXIsIHdyaXRlcik7XG5cbiAgICAvLyBEaWFnbm9zdGljcyBub3RpZmljYXRpb24gXHUyMTkyIE1vbmFjbyBtYXJrZXJzIChhcHBsaWVzIHRvIGFueSB3b3Jrc3BhY2UgZmlsZSlcbiAgICBfY29ubi5vbk5vdGlmaWNhdGlvbigndGV4dERvY3VtZW50L3B1Ymxpc2hEaWFnbm9zdGljcycsIChwYXJhbXM6IHsgdXJpOiBzdHJpbmc7IGRpYWdub3N0aWNzOiBEaWFnbm9zdGljW10gfSkgPT4ge1xuICAgICAgICBjb25zdCBtb2RlbCA9IG1vbmFjby5lZGl0b3IuZ2V0TW9kZWxzKCkuZmluZChtID0+IG0udXJpLnRvU3RyaW5nKCkgPT09IHBhcmFtcy51cmkpO1xuICAgICAgICBpZiAoIW1vZGVsKSByZXR1cm47XG4gICAgICAgIG1vbmFjby5lZGl0b3Iuc2V0TW9kZWxNYXJrZXJzKG1vZGVsLCAnamF2YS1sc3AnLCBwYXJhbXMuZGlhZ25vc3RpY3MubWFwKGQgPT4gKHtcbiAgICAgICAgICAgIHNldmVyaXR5OiAgICAgICAgbHNwU2V2ZXJpdHkoZC5zZXZlcml0eSksXG4gICAgICAgICAgICBtZXNzYWdlOiAgICAgICAgIGQubWVzc2FnZSxcbiAgICAgICAgICAgIHNvdXJjZTogICAgICAgICAgZC5zb3VyY2UgPz8gJ2phdmEnLFxuICAgICAgICAgICAgc3RhcnRMaW5lTnVtYmVyOiBkLnJhbmdlLnN0YXJ0LmxpbmUgKyAxLFxuICAgICAgICAgICAgc3RhcnRDb2x1bW46ICAgICBkLnJhbmdlLnN0YXJ0LmNoYXJhY3RlciArIDEsXG4gICAgICAgICAgICBlbmRMaW5lTnVtYmVyOiAgIGQucmFuZ2UuZW5kLmxpbmUgKyAxLFxuICAgICAgICAgICAgZW5kQ29sdW1uOiAgICAgICBkLnJhbmdlLmVuZC5jaGFyYWN0ZXIgKyAxLFxuICAgICAgICB9KSkpO1xuICAgIH0pO1xuXG4gICAgLy8gU2VydmVyIC0+IGNsaWVudCByZXF1ZXN0cyB0aGF0IGRyaXZlIHJlZmFjdG9yIC8gZ2VuZXJhdGUgcmVzdWx0cyBhbmQgZHluYW1pYyByZWdpc3RyYXRpb24uXG4gICAgX2Nvbm4ub25SZXF1ZXN0KCd3b3Jrc3BhY2UvYXBwbHlFZGl0JywgKHBhcmFtczogeyBlZGl0OiBXb3Jrc3BhY2VFZGl0IH0pID0+IHtcbiAgICAgICAgYXBwbHlXb3Jrc3BhY2VFZGl0KHBhcmFtcy5lZGl0KTtcbiAgICAgICAgcmV0dXJuIHsgYXBwbGllZDogdHJ1ZSB9O1xuICAgIH0pO1xuICAgIF9jb25uLm9uUmVxdWVzdCgnd29ya3NwYWNlL2NvbmZpZ3VyYXRpb24nLCAocGFyYW1zOiB7IGl0ZW1zOiBBcnJheTx7IHNlY3Rpb24/OiBzdHJpbmcgfT4gfSkgPT5cbiAgICAgICAgKHBhcmFtcy5pdGVtcyA/PyBbXSkubWFwKCgpID0+IGpkdGxzU2V0dGluZ3MoKS5qYXZhKSk7XG4gICAgX2Nvbm4ub25SZXF1ZXN0KCdjbGllbnQvcmVnaXN0ZXJDYXBhYmlsaXR5JywgKCkgPT4gbnVsbCk7XG4gICAgX2Nvbm4ub25SZXF1ZXN0KCdjbGllbnQvdW5yZWdpc3RlckNhcGFiaWxpdHknLCAoKSA9PiBudWxsKTtcbiAgICBfY29ubi5vblJlcXVlc3QoJ3dpbmRvdy9zaG93TWVzc2FnZVJlcXVlc3QnLCAoKSA9PiBudWxsKTtcbiAgICBfY29ubi5vblJlcXVlc3QoJ3dpbmRvdy93b3JrRG9uZVByb2dyZXNzL2NyZWF0ZScsICgpID0+IG51bGwpO1xuICAgIF9jb25uLm9uTm90aWZpY2F0aW9uKCd3aW5kb3cvbG9nTWVzc2FnZScsIChwOiB7IG1lc3NhZ2U6IHN0cmluZyB9KSA9PiBjb25zb2xlLmRlYnVnKCdbamF2YS1sc3BdJywgcD8ubWVzc2FnZSkpO1xuICAgIF9jb25uLm9uTm90aWZpY2F0aW9uKCd3aW5kb3cvc2hvd01lc3NhZ2UnLCAocDogeyBtZXNzYWdlOiBzdHJpbmcgfSkgPT4gY29uc29sZS5pbmZvKCdbamF2YS1sc3BdJywgcD8ubWVzc2FnZSkpO1xuICAgIC8vIEpEVC5MUyBsYW5ndWFnZS1zdGF0dXMgLyBwcm9ncmVzcyBub3RpZmljYXRpb25zIFx1MjAxNCBhY2tub3dsZWRnZWQgc2lsZW50bHkuXG4gICAgX2Nvbm4ub25Ob3RpZmljYXRpb24oJ2xhbmd1YWdlL3N0YXR1cycsICgpID0+IHsgLyogaW5kZXhpbmcvcmVhZHkgc3RhdHVzLCBpZ25vcmVkICovIH0pO1xuICAgIF9jb25uLm9uTm90aWZpY2F0aW9uKCdsYW5ndWFnZS9wcm9ncmVzc1JlcG9ydCcsICgpID0+IHsgLyogYnVpbGQgcHJvZ3Jlc3MsIGlnbm9yZWQgKi8gfSk7XG5cbiAgICBfY29ubi5saXN0ZW4oKTtcblxuICAgIGNvbnN0IHJvb3RVcmkgPSBfd29ya3NwYWNlUm9vdDtcbiAgICBjb25zdCBpbml0UmVzdWx0OiBhbnkgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgnaW5pdGlhbGl6ZScsIHtcbiAgICAgICAgcHJvY2Vzc0lkOiBudWxsLFxuICAgICAgICByb290VXJpLFxuICAgICAgICBpbml0aWFsaXphdGlvbk9wdGlvbnM6IHtcbiAgICAgICAgICAgIHNldHRpbmdzOiBqZHRsc1NldHRpbmdzKCksXG4gICAgICAgICAgICBleHRlbmRlZENsaWVudENhcGFiaWxpdGllczoge1xuICAgICAgICAgICAgICAgIHByb2dyZXNzUmVwb3J0UHJvdmlkZXI6ICAgICAgICAgICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgY2xhc3NGaWxlQ29udGVudHNTdXBwb3J0OiAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgIHJlc29sdmVBZGRpdGlvbmFsVGV4dEVkaXRzU3VwcG9ydDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBhZHZhbmNlZEdlbmVyYXRlQWNjZXNzb3JzU3VwcG9ydDogIHRydWUsXG4gICAgICAgICAgICAgICAgZ2VuZXJhdGVUb1N0cmluZ1Byb21wdFN1cHBvcnQ6ICAgICB0cnVlLFxuICAgICAgICAgICAgICAgIGdlbmVyYXRlQ29uc3RydWN0b3JzUHJvbXB0U3VwcG9ydDogdHJ1ZSxcbiAgICAgICAgICAgICAgICBnZW5lcmF0ZURlbGVnYXRlTWV0aG9kc1Byb21wdFN1cHBvcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgaGFzaENvZGVFcXVhbHNQcm9tcHRTdXBwb3J0OiAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgIGFkdmFuY2VkT3JnYW5pemVJbXBvcnRzU3VwcG9ydDogICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICBpbmZlclNlbGVjdGlvblN1cHBvcnQ6ICAgICAgICAgICAgIFsnZXh0cmFjdE1ldGhvZCcsICdleHRyYWN0VmFyaWFibGUnLCAnZXh0cmFjdEZpZWxkJ10sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgICB3b3Jrc3BhY2VGb2xkZXJzOiBbeyB1cmk6IHJvb3RVcmksIG5hbWU6IHdvcmtzcGFjZSB9XSxcbiAgICAgICAgY2FwYWJpbGl0aWVzOiB7XG4gICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHtcbiAgICAgICAgICAgICAgICBzeW5jaHJvbml6YXRpb246IHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSwgd2lsbFNhdmU6IGZhbHNlLCBkaWRTYXZlOiB0cnVlLCB3aWxsU2F2ZVdhaXRVbnRpbDogZmFsc2UgfSxcbiAgICAgICAgICAgICAgICBjb21wbGV0aW9uOiB7XG4gICAgICAgICAgICAgICAgICAgIGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIGNvbXBsZXRpb25JdGVtOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzbmlwcGV0U3VwcG9ydDogICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudGF0aW9uRm9ybWF0OiAgIFsnbWFya2Rvd24nLCAncGxhaW50ZXh0J10sXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXByZWNhdGVkU3VwcG9ydDogICAgIHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb21taXRDaGFyYWN0ZXJzU3VwcG9ydDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmVTdXBwb3J0OiAgICAgICAgeyBwcm9wZXJ0aWVzOiBbJ2RvY3VtZW50YXRpb24nLCAnZGV0YWlsJywgJ2FkZGl0aW9uYWxUZXh0RWRpdHMnXSB9LFxuICAgICAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0U3VwcG9ydDogdHJ1ZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGhvdmVyOiAgICAgICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUsIGNvbnRlbnRGb3JtYXQ6IFsnbWFya2Rvd24nLCAncGxhaW50ZXh0J10gfSxcbiAgICAgICAgICAgICAgICBzaWduYXR1cmVIZWxwOiAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLCBzaWduYXR1cmVJbmZvcm1hdGlvbjogeyBkb2N1bWVudGF0aW9uRm9ybWF0OiBbJ21hcmtkb3duJywgJ3BsYWludGV4dCddLCBwYXJhbWV0ZXJJbmZvcm1hdGlvbjogeyBsYWJlbE9mZnNldFN1cHBvcnQ6IHRydWUgfSB9IH0sXG4gICAgICAgICAgICAgICAgZGVmaW5pdGlvbjogICAgIHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIHJlZmVyZW5jZXM6ICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbjogeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgdHlwZURlZmluaXRpb246IHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIGRvY3VtZW50SGlnaGxpZ2h0OiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICBkb2N1bWVudFN5bWJvbDogeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLCBoaWVyYXJjaGljYWxEb2N1bWVudFN5bWJvbFN1cHBvcnQ6IHRydWUgfSxcbiAgICAgICAgICAgICAgICBmb2xkaW5nUmFuZ2U6ICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLCBsaW5lRm9sZGluZ09ubHk6IGZhbHNlIH0sXG4gICAgICAgICAgICAgICAgc2VsZWN0aW9uUmFuZ2U6IHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIGNvZGVMZW5zOiAgICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICBpbmxheUhpbnQ6ICAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLCByZXNvbHZlU3VwcG9ydDogeyBwcm9wZXJ0aWVzOiBbJ2xhYmVsJ10gfSB9LFxuICAgICAgICAgICAgICAgIHNlbWFudGljVG9rZW5zOiB7XG4gICAgICAgICAgICAgICAgICAgIGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RzOiAgICAgICAgeyByYW5nZTogZmFsc2UsIGZ1bGw6IHsgZGVsdGE6IGZhbHNlIH0gfSxcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5UeXBlczogICAgICBbJ25hbWVzcGFjZScsICd0eXBlJywgJ2NsYXNzJywgJ2VudW0nLCAnaW50ZXJmYWNlJywgJ3N0cnVjdCcsICd0eXBlUGFyYW1ldGVyJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdwYXJhbWV0ZXInLCAndmFyaWFibGUnLCAncHJvcGVydHknLCAnZW51bU1lbWJlcicsICdldmVudCcsICdmdW5jdGlvbicsICdtZXRob2QnLCAnbWFjcm8nLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2tleXdvcmQnLCAnbW9kaWZpZXInLCAnY29tbWVudCcsICdzdHJpbmcnLCAnbnVtYmVyJywgJ3JlZ2V4cCcsICdvcGVyYXRvcicsICdkZWNvcmF0b3InXSxcbiAgICAgICAgICAgICAgICAgICAgdG9rZW5Nb2RpZmllcnM6ICBbJ2RlY2xhcmF0aW9uJywgJ2RlZmluaXRpb24nLCAncmVhZG9ubHknLCAnc3RhdGljJywgJ2RlcHJlY2F0ZWQnLCAnYWJzdHJhY3QnLFxuICAgICAgICAgICAgICAgICAgICAgICAgJ2FzeW5jJywgJ21vZGlmaWNhdGlvbicsICdkb2N1bWVudGF0aW9uJywgJ2RlZmF1bHRMaWJyYXJ5J10sXG4gICAgICAgICAgICAgICAgICAgIGZvcm1hdHM6ICAgICAgICAgWydyZWxhdGl2ZSddLFxuICAgICAgICAgICAgICAgICAgICBvdmVybGFwcGluZ1Rva2VuU3VwcG9ydDogZmFsc2UsXG4gICAgICAgICAgICAgICAgICAgIG11bHRpbGluZVRva2VuU3VwcG9ydDogICBmYWxzZSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGZvcm1hdHRpbmc6ICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICByYW5nZUZvcm1hdHRpbmc6IHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIHJlbmFtZTogICAgICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUsIHByZXBhcmVTdXBwb3J0OiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgY29kZUFjdGlvbjoge1xuICAgICAgICAgICAgICAgICAgICBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjb2RlQWN0aW9uTGl0ZXJhbFN1cHBvcnQ6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvZGVBY3Rpb25LaW5kOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVTZXQ6IFsncXVpY2tmaXgnLCAncmVmYWN0b3InLCAncmVmYWN0b3IuZXh0cmFjdCcsICdyZWZhY3Rvci5pbmxpbmUnLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAncmVmYWN0b3IucmV3cml0ZScsICdzb3VyY2UnLCAnc291cmNlLm9yZ2FuaXplSW1wb3J0cyddLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgaXNQcmVmZXJyZWRTdXBwb3J0OiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBkYXRhU3VwcG9ydDogICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmVTdXBwb3J0OiAgICAgeyBwcm9wZXJ0aWVzOiBbJ2VkaXQnXSB9LFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgcHVibGlzaERpYWdub3N0aWNzOiB7IHJlbGF0ZWRJbmZvcm1hdGlvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHdvcmtzcGFjZToge1xuICAgICAgICAgICAgICAgIGFwcGx5RWRpdDogICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgY29uZmlndXJhdGlvbjogICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICBleGVjdXRlQ29tbWFuZDogICAgICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICBkaWRDaGFuZ2VDb25maWd1cmF0aW9uOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICB3b3Jrc3BhY2VFZGl0OiAgICAgICAgICB7IGRvY3VtZW50Q2hhbmdlczogdHJ1ZSwgcmVzb3VyY2VPcGVyYXRpb25zOiBbJ2NyZWF0ZScsICdyZW5hbWUnLCAnZGVsZXRlJ10gfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBfc2VtYW50aWNUb2tlbnNMZWdlbmQgPSBpbml0UmVzdWx0Py5jYXBhYmlsaXRpZXM/LnNlbWFudGljVG9rZW5zUHJvdmlkZXI/LmxlZ2VuZCA/PyBudWxsO1xuXG4gICAgX2Nvbm4uc2VuZE5vdGlmaWNhdGlvbignaW5pdGlhbGl6ZWQnLCB7fSk7XG4gICAgX2Nvbm4uc2VuZE5vdGlmaWNhdGlvbignd29ya3NwYWNlL2RpZENoYW5nZUNvbmZpZ3VyYXRpb24nLCB7IHNldHRpbmdzOiBqZHRsc1NldHRpbmdzKCkgfSk7XG5cbiAgICBvcGVuRmlsZShmaWxlVXJpKTtcblxuICAgIGlmICghX3Byb3ZpZGVyc1JlZ2lzdGVyZWQpIHtcbiAgICAgICAgX3Byb3ZpZGVyc1JlZ2lzdGVyZWQgPSB0cnVlO1xuICAgICAgICByZWdpc3RlclByb3ZpZGVycygpO1xuICAgIH1cbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gRmlsZSBsaWZlY3ljbGVcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBTZW5kcyB0ZXh0RG9jdW1lbnQvZGlkT3BlbiBmb3IgdGhlIGdpdmVuIFVSSSAoaWYgbm90IGFscmVhZHkgc2VudCkgYW5kIHJlZ2lzdGVycyBhIGRlYm91bmNlZFxuICogdGV4dERvY3VtZW50L2RpZENoYW5nZSBsaXN0ZW5lciBvbiB0aGUgY29ycmVzcG9uZGluZyBNb25hY28gbW9kZWwuXG4gKi9cbmZ1bmN0aW9uIG9wZW5GaWxlKGZpbGVVcmk6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChfb3BlbkZpbGVzLmhhcyhmaWxlVXJpKSB8fCAhX2Nvbm4pIHJldHVybjtcbiAgICBfb3BlbkZpbGVzLmFkZChmaWxlVXJpKTtcblxuICAgIGNvbnN0IG1vZGVsID0gbW9uYWNvLmVkaXRvci5nZXRNb2RlbHMoKS5maW5kKG0gPT4gbS51cmkudG9TdHJpbmcoKSA9PT0gZmlsZVVyaSk7XG4gICAgX2Nvbm4uc2VuZE5vdGlmaWNhdGlvbigndGV4dERvY3VtZW50L2RpZE9wZW4nLCB7XG4gICAgICAgIHRleHREb2N1bWVudDoge1xuICAgICAgICAgICAgdXJpOiAgICAgICAgZmlsZVVyaSxcbiAgICAgICAgICAgIGxhbmd1YWdlSWQ6ICdqYXZhJyxcbiAgICAgICAgICAgIHZlcnNpb246ICAgIDEsXG4gICAgICAgICAgICB0ZXh0OiAgICAgICBtb2RlbD8uZ2V0VmFsdWUoKSA/PyAnJyxcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIGlmIChtb2RlbCkge1xuICAgICAgICBtb2RlbC5vbkRpZENoYW5nZUNvbnRlbnQoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBfY2hhbmdlVGltZXJzLmdldChmaWxlVXJpKTtcbiAgICAgICAgICAgIGlmIChleGlzdGluZykgY2xlYXJUaW1lb3V0KGV4aXN0aW5nKTtcbiAgICAgICAgICAgIF9jaGFuZ2VUaW1lcnMuc2V0KGZpbGVVcmksIHNldFRpbWVvdXQoKCkgPT4gc2VuZERpZENoYW5nZShmaWxlVXJpKSwgNDAwKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuLyoqIFNlbmRzIHRoZSBjdXJyZW50IG1vZGVsIGNvbnRlbnQgYXMgYSBkaWRDaGFuZ2UgYW5kIGNsZWFycyBhbnkgcGVuZGluZyBkZWJvdW5jZSBmb3IgdGhlIGZpbGUuICovXG5mdW5jdGlvbiBzZW5kRGlkQ2hhbmdlKGZpbGVVcmk6IHN0cmluZyk6IHZvaWQge1xuICAgIF9jaGFuZ2VUaW1lcnMuZGVsZXRlKGZpbGVVcmkpO1xuICAgIGNvbnN0IG1vZGVsID0gbW9uYWNvLmVkaXRvci5nZXRNb2RlbChtb25hY28uVXJpLnBhcnNlKGZpbGVVcmkpKTtcbiAgICBpZiAoX2Nvbm4gJiYgbW9kZWwpIHtcbiAgICAgICAgX2Nvbm4uc2VuZE5vdGlmaWNhdGlvbigndGV4dERvY3VtZW50L2RpZENoYW5nZScsIHtcbiAgICAgICAgICAgIHRleHREb2N1bWVudDogICB7IHVyaTogZmlsZVVyaSwgdmVyc2lvbjogbW9kZWwuZ2V0VmVyc2lvbklkKCkgfSxcbiAgICAgICAgICAgIGNvbnRlbnRDaGFuZ2VzOiBbeyB0ZXh0OiBtb2RlbC5nZXRWYWx1ZSgpIH1dLFxuICAgICAgICB9KTtcbiAgICB9XG59XG5cbi8qKlxuICogRmx1c2hlcyBhIHBlbmRpbmcgZGVib3VuY2VkIGNoYW5nZSBpbW1lZGlhdGVseS4gQ2FsbGVkIGJlZm9yZSBhIGNvbXBsZXRpb24gcmVxdWVzdCBzbyBKRFQuTFMgc2VlcyB0aGVcbiAqIGp1c3QtdHlwZWQgdGV4dCBvbiB0aGUgZmlyc3QgQ3RybCtTcGFjZSwgaW5zdGVhZCBvZiBjb21wbGV0aW5nIGFnYWluc3Qgc3RhbGUgY29udGVudCAodGhlIGRlYm91bmNlXG4gKiBvdGhlcndpc2UgZGVsYXlzIHRoZSBjaGFuZ2UgYnkgdXAgdG8gNDAwbXMgXHUyMDE0IHRoZSBjYXVzZSBvZiBcImZpcnN0IEN0cmwrU3BhY2Ugc2hvd3Mgbm90aGluZ1wiKS5cbiAqL1xuZnVuY3Rpb24gZmx1c2hQZW5kaW5nQ2hhbmdlKGZpbGVVcmk6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChfY2hhbmdlVGltZXJzLmhhcyhmaWxlVXJpKSkge1xuICAgICAgICBjbGVhclRpbWVvdXQoX2NoYW5nZVRpbWVycy5nZXQoZmlsZVVyaSkhKTtcbiAgICAgICAgc2VuZERpZENoYW5nZShmaWxlVXJpKTtcbiAgICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFdvcmtzcGFjZSBmaWxlIHByZWRpY2F0ZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFJldHVybnMge0Bjb2RlIHRydWV9IHdoZW4gdGhlIGdpdmVuIG1vZGVsIFVSSSBiZWxvbmdzIHRvIHRoZSBjdXJyZW50bHkgY29ubmVjdGVkIHdvcmtzcGFjZS4gVXNlZFxuICogYnkgTW9uYWNvIHByb3ZpZGVycyB0byBza2lwIG5vbi1KYXZhLXdvcmtzcGFjZSBtb2RlbHMgd2l0aG91dCBhbiBleGFjdC1VUkkgY29tcGFyaXNvbi5cbiAqL1xuZnVuY3Rpb24gaXNXb3Jrc3BhY2VGaWxlKHVyaTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIF93b3Jrc3BhY2VSb290ICE9PSAnJyAmJiB1cmkuc3RhcnRzV2l0aChfd29ya3NwYWNlUm9vdCk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIE1vbmFjbyBwcm92aWRlciByZWdpc3RyYXRpb25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gcmVnaXN0ZXJQcm92aWRlcnMoKTogdm9pZCB7XG5cbiAgICBtb25hY28uZWRpdG9yLnJlZ2lzdGVyQ29tbWFuZChBUFBMWV9BQ1RJT05fQ09NTUFORCwgKF9hY2Nlc3NvcjogdW5rbm93biwgYWN0aW9uOiBDb2RlQWN0aW9uIHwgQ29tbWFuZCkgPT4ge1xuICAgICAgICBhcHBseUNvZGVBY3Rpb24oYWN0aW9uKTtcbiAgICB9KTtcbiAgICBtb25hY28uZWRpdG9yLnJlZ2lzdGVyQ29tbWFuZChOT09QX0NPTU1BTkQsICgpID0+IHsgLyogZGlzcGxheS1vbmx5IENvZGVMZW5zICovIH0pO1xuXG4gICAgLy8gQ3Jvc3MtZmlsZSBuYXZpZ2F0aW9uOiB0aGlzIHNpbmdsZS1maWxlIGVkaXRvciBoYXMgbm8gbW9kZWwgZm9yIG90aGVyIHdvcmtzcGFjZSBmaWxlcywgc28gR28gdG9cbiAgICAvLyBEZWZpbml0aW9uIC8gRmluZCBSZWZlcmVuY2VzIHRvIGFub3RoZXIgZmlsZSB3b3VsZCBzaWxlbnRseSBkbyBub3RoaW5nLiBIYW5kIHRob3NlIG9mZiB0byB0aGUgSURFXG4gICAgLy8gdG8gb3BlbiB0aGUgdGFyZ2V0IGZpbGUgKGFuZCByZXZlYWwgdGhlIGxpbmUpLiBTYW1lLWZpbGUgdGFyZ2V0cyBmYWxsIHRocm91Z2ggdG8gTW9uYWNvLlxuICAgIG1vbmFjby5lZGl0b3IucmVnaXN0ZXJFZGl0b3JPcGVuZXIoe1xuICAgICAgICBvcGVuQ29kZUVkaXRvcjogKHNvdXJjZSwgcmVzb3VyY2UsIHNlbGVjdGlvbk9yUG9zaXRpb24pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHVyaSA9IHJlc291cmNlLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBpZiAoIWlzV29ya3NwYWNlRmlsZSh1cmkpIHx8ICF1cmkuc3RhcnRzV2l0aChWSVJUVUFMX0ZJTEVfUFJFRklYKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudE1vZGVsID0gc291cmNlLmdldE1vZGVsKCk7XG4gICAgICAgICAgICBpZiAoY3VycmVudE1vZGVsICYmIGN1cnJlbnRNb2RlbC51cmkudG9TdHJpbmcoKSA9PT0gdXJpKSByZXR1cm4gZmFsc2U7IC8vIHNhbWUgZmlsZSBcdTIwMTQgbGV0IE1vbmFjbyBqdW1wXG4gICAgICAgICAgICBjb25zdCBvcGVuZXIgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLmphdmFMc3BPcGVuRmlsZTtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3BlbmVyICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBwb3MgPSBzZWxlY3Rpb25PclBvc2l0aW9uIGFzIHsgc3RhcnRMaW5lTnVtYmVyPzogbnVtYmVyOyBsaW5lTnVtYmVyPzogbnVtYmVyOyBzdGFydENvbHVtbj86IG51bWJlcjsgY29sdW1uPzogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBsaW5lID0gcG9zID8gKHBvcy5zdGFydExpbmVOdW1iZXIgPz8gcG9zLmxpbmVOdW1iZXIpIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgY29sdW1uID0gcG9zID8gKHBvcy5zdGFydENvbHVtbiA/PyBwb3MuY29sdW1uKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIG9wZW5lcih1cmkuc3Vic3RyaW5nKFZJUlRVQUxfRklMRV9QUkVGSVgubGVuZ3RoKSwgbGluZSwgY29sdW1uKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckNvbXBsZXRpb25JdGVtUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHRyaWdnZXJDaGFyYWN0ZXJzOiBbJy4nLCAnQCcsICc8J10sXG4gICAgICAgIHByb3ZpZGVDb21wbGV0aW9uSXRlbXM6IGFzeW5jIChtb2RlbCwgcG9zaXRpb24sIGNvbnRleHQpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgZmlsZVVyaSA9IG1vZGVsLnVyaS50b1N0cmluZygpO1xuICAgICAgICAgICAgLy8gTWFrZSBzdXJlIEpEVC5MUyBoYXMgdGhlIGp1c3QtdHlwZWQgdGV4dCBiZWZvcmUgY29tcGxldGluZyAoc2VlIGZsdXNoUGVuZGluZ0NoYW5nZSkuXG4gICAgICAgICAgICBmbHVzaFBlbmRpbmdDaGFuZ2UoZmlsZVVyaSk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IENvbXBsZXRpb25MaXN0IHwgQ29tcGxldGlvbkl0ZW1bXSB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L2NvbXBsZXRpb24nLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogZmlsZVVyaSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICAgICAgLy8gTW9uYWNvIHRyaWdnZXIga2luZHMgYXJlIDAtYmFzZWQgKEludm9rZS9UcmlnZ2VyQ2hhcmFjdGVyL0ZvckluY29tcGxldGUpOyBMU1AgaXMgMS1iYXNlZC5cbiAgICAgICAgICAgICAgICBjb250ZXh0OiAgICAgIHsgdHJpZ2dlcktpbmQ6IChjb250ZXh0LnRyaWdnZXJLaW5kID8/IDApICsgMSwgdHJpZ2dlckNoYXJhY3RlcjogY29udGV4dC50cmlnZ2VyQ2hhcmFjdGVyIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gQXJyYXkuaXNBcnJheShyZXN1bHQpID8gcmVzdWx0IDogKHJlc3VsdD8uaXRlbXMgPz8gW10pO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBzdWdnZXN0aW9uczogaXRlbXMubWFwKGl0ZW0gPT4gbHNwQ29tcGxldGlvblRvTW9uYWNvKGl0ZW0sIG1vZGVsLCBwb3NpdGlvbikpLFxuICAgICAgICAgICAgICAgIC8vIEpEVC5MUyByZXR1cm5zIGEgdHJ1bmNhdGVkIGxpc3Qgb24gdGhlIGZpcnN0IGtleXN0cm9rZXM7IHByb3BhZ2F0aW5nIFwiaW5jb21wbGV0ZVwiIG1ha2VzXG4gICAgICAgICAgICAgICAgLy8gTW9uYWNvIHJlLXF1ZXJ5IGFzIHRoZSB1c2VyIHR5cGVzIGluc3RlYWQgb2YgY2FjaGluZyB0aGUgZmlyc3QgKG9mdGVuIGVtcHR5KSByZXN1bHQuXG4gICAgICAgICAgICAgICAgaW5jb21wbGV0ZTogIEFycmF5LmlzQXJyYXkocmVzdWx0KSA/IGZhbHNlIDogISFyZXN1bHQ/LmlzSW5jb21wbGV0ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8vIFJlc29sdmUgZG9jdW1lbnRhdGlvbiBhbmQsIGNydWNpYWxseSwgdGhlIGF1dG8taW1wb3J0IGFkZGl0aW9uYWxUZXh0RWRpdHMgd2hpY2ggSkRULkxTIG9ubHlcbiAgICAgICAgLy8gYXR0YWNoZXMgb24gcmVzb2x2ZSBcdTIwMTQgc2VsZWN0aW5nIGEgdHlwZSB0aGVuIGluc2VydHMgaXRzIGltcG9ydCBzdGF0ZW1lbnQuXG4gICAgICAgIHJlc29sdmVDb21wbGV0aW9uSXRlbTogYXN5bmMgKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxzcCA9IChpdGVtIGFzIE1vbmFjb0NvbXBsZXRpb25JdGVtKS5fbHNwO1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhbHNwKSByZXR1cm4gaXRlbTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWQ6IENvbXBsZXRpb25JdGVtID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ2NvbXBsZXRpb25JdGVtL3Jlc29sdmUnLCBsc3ApO1xuICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZC5kb2N1bWVudGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uZG9jdW1lbnRhdGlvbiA9IHsgdmFsdWU6IG1hcmt1cFRvU3RyaW5nKHJlc29sdmVkLmRvY3VtZW50YXRpb24pLCBpc1RydXN0ZWQ6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZC5kZXRhaWwpIGl0ZW0uZGV0YWlsID0gcmVzb2x2ZWQuZGV0YWlsO1xuICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZC5hZGRpdGlvbmFsVGV4dEVkaXRzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5hZGRpdGlvbmFsVGV4dEVkaXRzID0gcmVzb2x2ZWQuYWRkaXRpb25hbFRleHRFZGl0cy5tYXAodGV4dEVkaXRUb01vbmFjbyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoJ1tqYXZhLWxzcF0gY29tcGxldGlvbiByZXNvbHZlIGZhaWxlZDonLCAoZSBhcyBFcnJvcik/Lm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVySG92ZXJQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZUhvdmVyOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVVcmkgPSBtb2RlbC51cmkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogSG92ZXIgfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9ob3ZlcicsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBmaWxlVXJpIH0sXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQ/LmNvbnRlbnRzKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRzID0gQXJyYXkuaXNBcnJheShyZXN1bHQuY29udGVudHMpID8gcmVzdWx0LmNvbnRlbnRzIDogW3Jlc3VsdC5jb250ZW50c107XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGNvbnRlbnRzOiBjb250ZW50cy5tYXAoYyA9PiAoe1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdHlwZW9mIGMgPT09ICdzdHJpbmcnID8gYyA6IChjIGFzIE1hcmt1cENvbnRlbnQpLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBpc1RydXN0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgICByYW5nZTogcmVzdWx0LnJhbmdlID8gbHNwUmFuZ2VUb01vbmFjbyhyZXN1bHQucmFuZ2UpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJTaWduYXR1cmVIZWxwUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHNpZ25hdHVyZUhlbHBUcmlnZ2VyQ2hhcmFjdGVyczogWycoJywgJywnXSxcbiAgICAgICAgcHJvdmlkZVNpZ25hdHVyZUhlbHA6IGFzeW5jIChtb2RlbCwgcG9zaXRpb24pID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgZmlsZVVyaSA9IG1vZGVsLnVyaS50b1N0cmluZygpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBTaWduYXR1cmVIZWxwIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvc2lnbmF0dXJlSGVscCcsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBmaWxlVXJpIH0sXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVzOiByZXN1bHQuc2lnbmF0dXJlcy5tYXAoKHNpZzogU2lnbmF0dXJlSW5mb3JtYXRpb24pID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogICAgICAgICBzaWcubGFiZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudGF0aW9uOiBzaWcuZG9jdW1lbnRhdGlvbiA/IG1hcmt1cFRvU3RyaW5nKHNpZy5kb2N1bWVudGF0aW9uKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6ICAgIChzaWcucGFyYW1ldGVycyA/PyBbXSkubWFwKChwOiBQYXJhbWV0ZXJJbmZvcm1hdGlvbikgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogICAgICAgICBwLmxhYmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50YXRpb246IHAuZG9jdW1lbnRhdGlvbiA/IG1hcmt1cFRvU3RyaW5nKHAuZG9jdW1lbnRhdGlvbikgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlU2lnbmF0dXJlOiByZXN1bHQuYWN0aXZlU2lnbmF0dXJlID8/IDAsXG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZVBhcmFtZXRlcjogcmVzdWx0LmFjdGl2ZVBhcmFtZXRlciA/PyAwLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge30sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckRlZmluaXRpb25Qcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZURlZmluaXRpb246IGFzeW5jIChtb2RlbCwgcG9zaXRpb24pID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgZmlsZVVyaSA9IG1vZGVsLnVyaS50b1N0cmluZygpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBMb2NhdGlvbiB8IExvY2F0aW9uW10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9kZWZpbml0aW9uJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IGZpbGVVcmkgfSxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogICAgIHsgbGluZTogcG9zaXRpb24ubGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogcG9zaXRpb24uY29sdW1uIC0gMSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBsb2NhdGlvbnMgPSAoQXJyYXkuaXNBcnJheShyZXN1bHQpID8gcmVzdWx0IDogW3Jlc3VsdF0pLm1hcChsb2MgPT4gKHtcbiAgICAgICAgICAgICAgICB1cmk6ICAgbW9uYWNvLlVyaS5wYXJzZShsb2MudXJpKSxcbiAgICAgICAgICAgICAgICByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhsb2MucmFuZ2UpLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgYXdhaXQgZW5zdXJlTW9kZWxzRm9yTG9jYXRpb25zKGxvY2F0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gbG9jYXRpb25zO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlclJlZmVyZW5jZVByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlUmVmZXJlbmNlczogYXN5bmMgKG1vZGVsLCBwb3NpdGlvbiwgY29udGV4dCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IExvY2F0aW9uW10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9yZWZlcmVuY2VzJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgICAgICBjb250ZXh0OiAgICAgIHsgaW5jbHVkZURlY2xhcmF0aW9uOiBjb250ZXh0LmluY2x1ZGVEZWNsYXJhdGlvbiB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBsb2NhdGlvbnMgPSByZXN1bHQubWFwKGxvYyA9PiAoeyB1cmk6IG1vbmFjby5VcmkucGFyc2UobG9jLnVyaSksIHJhbmdlOiBsc3BSYW5nZVRvTW9uYWNvKGxvYy5yYW5nZSkgfSkpO1xuICAgICAgICAgICAgLy8gVGhlIHJlZmVyZW5jZXMgcGVlayBjYW4gb25seSBzaG93IGEgY29kZSBwcmV2aWV3IGZvciBmaWxlcyBpdCBoYXMgYSBtb2RlbCBmb3I7IGNyZWF0ZVxuICAgICAgICAgICAgLy8gaW4tbWVtb3J5IG1vZGVscyBmb3IgdGhlIHJlZmVyZW5jZWQgKHBvc3NpYmx5IHVub3BlbmVkKSBmaWxlcyBzbyBwcmV2aWV3cyByZW5kZXIuXG4gICAgICAgICAgICBhd2FpdCBlbnN1cmVNb2RlbHNGb3JMb2NhdGlvbnMobG9jYXRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbnM7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyUmVuYW1lUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVSZW5hbWVFZGl0czogYXN5bmMgKG1vZGVsLCBwb3NpdGlvbiwgbmV3TmFtZSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIHsgZWRpdHM6IFtdIH07XG4gICAgICAgICAgICBjb25zdCBlZGl0OiBXb3Jrc3BhY2VFZGl0IHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvcmVuYW1lJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgICAgICBuZXdOYW1lLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIWVkaXQpIHJldHVybiB7IGVkaXRzOiBbXSB9O1xuICAgICAgICAgICAgLy8gQSBKRFQuTFMgcmVuYW1lIGNhbiBzcGFuIG1hbnkgZmlsZXMgYW5kIGV2ZW4gcmVuYW1lIHRoZSB0eXBlJ3Mgb3duIC5qYXZhIGZpbGUuIE1vbmFjbydzXG4gICAgICAgICAgICAvLyBzaW5nbGUtZmlsZSBlZGl0b3Igd291bGQgZHJvcCBldmVyeXRoaW5nIGJ1dCB0aGUgY3VycmVudCBtb2RlbCwgc28gYXBwbHkgdGhlIHdob2xlIGVkaXRcbiAgICAgICAgICAgIC8vIHRocm91Z2ggdGhlIHdvcmtzcGFjZSBvdXJzZWx2ZXMgd2hlbiB0aGUgSURFIHBlcnNpc3RlbmNlIGhvb2sgaXMgYXZhaWxhYmxlLlxuICAgICAgICAgICAgaWYgKHR5cGVvZiAoZ2xvYmFsVGhpcyBhcyBhbnkpLmphdmFMc3BQZXJzaXN0UmVuYW1lID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgYXBwbHlSZW5hbWVBY3Jvc3NXb3Jrc3BhY2UobW9kZWwsIGVkaXQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBlZGl0czogW10gfTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tqYXZhLWxzcF0gY3Jvc3MtZmlsZSByZW5hbWUgZmFpbGVkLCBhcHBseWluZyB0byB0aGUgY3VycmVudCBmaWxlIG9ubHk6JywgZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB3b3Jrc3BhY2VFZGl0VG9Nb25hY28oZWRpdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHdvcmtzcGFjZUVkaXRUb01vbmFjbyhlZGl0KTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVzb2x2ZVJlbmFtZUxvY2F0aW9uOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0OiB7IHJhbmdlOiBMc3BSYW5nZTsgcGxhY2Vob2xkZXI/OiBzdHJpbmcgfSB8IExzcFJhbmdlIHwgbnVsbCA9XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvcHJlcGFyZVJlbmFtZScsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogICAgIHsgbGluZTogcG9zaXRpb24ubGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogcG9zaXRpb24uY29sdW1uIC0gMSB9LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSAncmFuZ2UnIGluIHJlc3VsdCA/IHJlc3VsdC5yYW5nZSA6IHJlc3VsdDtcbiAgICAgICAgICAgICAgICBjb25zdCBwbGFjZWhvbGRlciA9ICdwbGFjZWhvbGRlcicgaW4gcmVzdWx0ICYmIHJlc3VsdC5wbGFjZWhvbGRlclxuICAgICAgICAgICAgICAgICAgICA/IHJlc3VsdC5wbGFjZWhvbGRlclxuICAgICAgICAgICAgICAgICAgICA6IG1vZGVsLmdldFdvcmRBdFBvc2l0aW9uKHBvc2l0aW9uKT8ud29yZCA/PyAnJztcbiAgICAgICAgICAgICAgICByZXR1cm4geyByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhyYW5nZSksIHRleHQ6IHBsYWNlaG9sZGVyIH07XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICBjb25zdCB3b3JkID0gbW9kZWwuZ2V0V29yZEF0UG9zaXRpb24ocG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIHJldHVybiB3b3JkID8ge1xuICAgICAgICAgICAgICAgICAgICByYW5nZTogeyBzdGFydExpbmVOdW1iZXI6IHBvc2l0aW9uLmxpbmVOdW1iZXIsIHN0YXJ0Q29sdW1uOiB3b3JkLnN0YXJ0Q29sdW1uLCBlbmRMaW5lTnVtYmVyOiBwb3NpdGlvbi5saW5lTnVtYmVyLCBlbmRDb2x1bW46IHdvcmQuZW5kQ29sdW1uIH0sXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IHdvcmQud29yZCxcbiAgICAgICAgICAgICAgICB9IDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIFJlZ2lzdGVyaW5nIHRoaXMgcHJvdmlkZXIgYWxzbyBlbmFibGVzIGVkaXRvci5qcydzIGV4aXN0aW5nIGZvcm1hdC1vbi1zYXZlIHBhdGggZm9yIEphdmE6IHRoZVxuICAgIC8vIHNoYXJlZCBTYXZlIGFjdGlvbiBydW5zIGVkaXRvci5hY3Rpb24uZm9ybWF0RG9jdW1lbnQgd2hlbiBhdXRvLWZvcm1hdHRpbmcgaXMgb24gKHRoZSBzYW1lXG4gICAgLy8gbWVjaGFuaXNtIGFuZCBnbG9iYWwgdG9nZ2xlIHVzZWQgZm9yIFR5cGVTY3JpcHQpLlxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJEb2N1bWVudEZvcm1hdHRpbmdFZGl0UHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVEb2N1bWVudEZvcm1hdHRpbmdFZGl0czogYXN5bmMgKG1vZGVsKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGVkaXRzOiBUZXh0RWRpdFtdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvZm9ybWF0dGluZycsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6ICAgICAgeyB0YWJTaXplOiBtb2RlbC5nZXRPcHRpb25zKCkudGFiU2l6ZSwgaW5zZXJ0U3BhY2VzOiBtb2RlbC5nZXRPcHRpb25zKCkuaW5zZXJ0U3BhY2VzIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBlZGl0cyA/IGVkaXRzLm1hcCh0ZXh0RWRpdFRvTW9uYWNvKSA6IG51bGw7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyQ29kZUFjdGlvblByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlQ29kZUFjdGlvbnM6IGFzeW5jIChtb2RlbCwgcmFuZ2UsIGNvbnRleHQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVtcHR5ID0geyBhY3Rpb25zOiBbXSwgZGlzcG9zZSgpIHsgLyogbm90aGluZyB0byBkaXNwb3NlICovIH0gfTtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBlbXB0eTtcbiAgICAgICAgICAgIGNvbnN0IGRpYWdub3N0aWNzID0gKGNvbnRleHQubWFya2VycyA/PyBbXSkubWFwKG1hcmtlclRvTHNwRGlhZ25vc3RpYyk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IEFycmF5PENvZGVBY3Rpb24gfCBDb21tYW5kPiB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L2NvZGVBY3Rpb24nLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgICAgICByYW5nZTogICAgICAgIG1vbmFjb1JhbmdlVG9Mc3AocmFuZ2UpLFxuICAgICAgICAgICAgICAgIGNvbnRleHQ6ICAgICAgeyBkaWFnbm9zdGljcywgb25seTogY29udGV4dC5vbmx5ID8gW2NvbnRleHQub25seV0gOiB1bmRlZmluZWQgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQ/Lmxlbmd0aCkgcmV0dXJuIGVtcHR5O1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBhY3Rpb25zOiByZXN1bHQubWFwKGxzcENvZGVBY3Rpb25Ub01vbmFjbyksXG4gICAgICAgICAgICAgICAgZGlzcG9zZSgpIHsgLyogbm90aGluZyB0byBkaXNwb3NlICovIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgIH0sIHtcbiAgICAgICAgcHJvdmlkZWRDb2RlQWN0aW9uS2luZHM6IFsncXVpY2tmaXgnLCAncmVmYWN0b3InLCAncmVmYWN0b3IuZXh0cmFjdCcsICdyZWZhY3Rvci5pbmxpbmUnLFxuICAgICAgICAgICAgJ3JlZmFjdG9yLnJld3JpdGUnLCAnc291cmNlJywgJ3NvdXJjZS5vcmdhbml6ZUltcG9ydHMnXSxcbiAgICB9KTtcblxuICAgIC8vIC0tLSBOYXZpZ2F0aW9uICYgc3RydWN0dXJlIChQYWNrIDEpIC0tLVxuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckltcGxlbWVudGF0aW9uUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVJbXBsZW1lbnRhdGlvbjogKG1vZGVsLCBwb3NpdGlvbikgPT4gcmVxdWVzdExvY2F0aW9ucygndGV4dERvY3VtZW50L2ltcGxlbWVudGF0aW9uJywgbW9kZWwsIHBvc2l0aW9uKSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJUeXBlRGVmaW5pdGlvblByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlVHlwZURlZmluaXRpb246IChtb2RlbCwgcG9zaXRpb24pID0+IHJlcXVlc3RMb2NhdGlvbnMoJ3RleHREb2N1bWVudC90eXBlRGVmaW5pdGlvbicsIG1vZGVsLCBwb3NpdGlvbiksXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyRG9jdW1lbnRIaWdobGlnaHRQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZURvY3VtZW50SGlnaGxpZ2h0czogYXN5bmMgKG1vZGVsLCBwb3NpdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IGFueVtdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvZG9jdW1lbnRIaWdobGlnaHQnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogICAgIHsgbGluZTogcG9zaXRpb24ubGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogcG9zaXRpb24uY29sdW1uIC0gMSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0Lm1hcChoID0+ICh7IHJhbmdlOiBsc3BSYW5nZVRvTW9uYWNvKGgucmFuZ2UpLCBraW5kOiBoLmtpbmQgPyBoLmtpbmQgLSAxIDogdW5kZWZpbmVkIH0pKTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJEb2N1bWVudFN5bWJvbFByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlRG9jdW1lbnRTeW1ib2xzOiBhc3luYyAobW9kZWwpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBhbnlbXSB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L2RvY3VtZW50U3ltYm9sJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQgPyBtYXBEb2N1bWVudFN5bWJvbHMocmVzdWx0KSA6IG51bGw7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyRm9sZGluZ1JhbmdlUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVGb2xkaW5nUmFuZ2VzOiBhc3luYyAobW9kZWwpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBhbnlbXSB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L2ZvbGRpbmdSYW5nZScsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0Lm1hcChyID0+ICh7IHN0YXJ0OiByLnN0YXJ0TGluZSArIDEsIGVuZDogci5lbmRMaW5lICsgMSwga2luZDogZm9sZGluZ0tpbmQoci5raW5kKSB9KSk7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyU2VsZWN0aW9uUmFuZ2VQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZVNlbGVjdGlvblJhbmdlczogYXN5bmMgKG1vZGVsLCBwb3NpdGlvbnMpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBhbnlbXSB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L3NlbGVjdGlvblJhbmdlJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICAgICAgcG9zaXRpb25zOiAgICBwb3NpdGlvbnMubWFwKHAgPT4gKHsgbGluZTogcC5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwLmNvbHVtbiAtIDEgfSkpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0Lm1hcChmbGF0dGVuU2VsZWN0aW9uUmFuZ2UpO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckRvY3VtZW50UmFuZ2VGb3JtYXR0aW5nRWRpdFByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlRG9jdW1lbnRSYW5nZUZvcm1hdHRpbmdFZGl0czogYXN5bmMgKG1vZGVsLCByYW5nZSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBlZGl0czogVGV4dEVkaXRbXSB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L3JhbmdlRm9ybWF0dGluZycsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgIHJhbmdlOiAgICAgICAgbW9uYWNvUmFuZ2VUb0xzcChyYW5nZSksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogICAgICB7IHRhYlNpemU6IG1vZGVsLmdldE9wdGlvbnMoKS50YWJTaXplLCBpbnNlcnRTcGFjZXM6IG1vZGVsLmdldE9wdGlvbnMoKS5pbnNlcnRTcGFjZXMgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGVkaXRzID8gZWRpdHMubWFwKHRleHRFZGl0VG9Nb25hY28pIDogbnVsbDtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIC0tLSBJbmxheSBoaW50cyArIHNlbWFudGljIGhpZ2hsaWdodGluZyAoUGFjayAyKSAtLS1cblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJJbmxheUhpbnRzUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVJbmxheUhpbnRzOiBhc3luYyAobW9kZWwsIHJhbmdlKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55W10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9pbmxheUhpbnQnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgICAgICByYW5nZTogICAgICAgIG1vbmFjb1JhbmdlVG9Mc3AocmFuZ2UpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGhpbnRzOiByZXN1bHQubWFwKGggPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmVOdW1iZXI6IGgucG9zaXRpb24ubGluZSArIDEsIGNvbHVtbjogaC5wb3NpdGlvbi5jaGFyYWN0ZXIgKyAxIH0sXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAgICAgICAgdHlwZW9mIGgubGFiZWwgPT09ICdzdHJpbmcnID8gaC5sYWJlbCA6IChoLmxhYmVsID8/IFtdKS5tYXAoKHA6IGFueSkgPT4gKHsgbGFiZWw6IHAudmFsdWUgfSkpLFxuICAgICAgICAgICAgICAgICAgICBraW5kOiAgICAgICAgIGgua2luZCxcbiAgICAgICAgICAgICAgICAgICAgcGFkZGluZ0xlZnQ6ICBoLnBhZGRpbmdMZWZ0LFxuICAgICAgICAgICAgICAgICAgICBwYWRkaW5nUmlnaHQ6IGgucGFkZGluZ1JpZ2h0LFxuICAgICAgICAgICAgICAgICAgICB0b29sdGlwOiAgICAgIGgudG9vbHRpcCA/IG1hcmt1cFRvU3RyaW5nKGgudG9vbHRpcCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgIGRpc3Bvc2UoKSB7IC8qIG5vdGhpbmcgdG8gZGlzcG9zZSAqLyB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJEb2N1bWVudFNlbWFudGljVG9rZW5zUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIGdldExlZ2VuZDogKCkgPT4gX3NlbWFudGljVG9rZW5zTGVnZW5kID8/IHsgdG9rZW5UeXBlczogW10sIHRva2VuTW9kaWZpZXJzOiBbXSB9LFxuICAgICAgICBwcm92aWRlRG9jdW1lbnRTZW1hbnRpY1Rva2VuczogYXN5bmMgKG1vZGVsKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpIHx8ICFfc2VtYW50aWNUb2tlbnNMZWdlbmQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiB7IGRhdGE6IG51bWJlcltdOyByZXN1bHRJZD86IHN0cmluZyB9IHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvc2VtYW50aWNUb2tlbnMvZnVsbCcsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdD8uZGF0YSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICByZXR1cm4geyBkYXRhOiBuZXcgVWludDMyQXJyYXkocmVzdWx0LmRhdGEpLCByZXN1bHRJZDogcmVzdWx0LnJlc3VsdElkIH07XG4gICAgICAgIH0sXG4gICAgICAgIHJlbGVhc2VEb2N1bWVudFNlbWFudGljVG9rZW5zOiAoKSA9PiB7IC8qIG5vdGhpbmcgdG8gcmVsZWFzZSAqLyB9LFxuICAgIH0pO1xuXG4gICAgLy8gLS0tIENvZGVMZW5zIChQYWNrIDMpIC0tLVxuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckNvZGVMZW5zUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVDb2RlTGVuc2VzOiBhc3luYyAobW9kZWwpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiB7IGxlbnNlczogW10sIGRpc3Bvc2UoKSB7IC8qICovIH0gfTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55W10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9jb2RlTGVucycsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBsZW5zZXMgPSAocmVzdWx0ID8/IFtdKS5tYXAoKGxlbnMsIGkpID0+ICh7XG4gICAgICAgICAgICAgICAgcmFuZ2U6ICAgIGxzcFJhbmdlVG9Nb25hY28obGVucy5yYW5nZSksXG4gICAgICAgICAgICAgICAgaWQ6ICAgICAgIFN0cmluZyhpKSxcbiAgICAgICAgICAgICAgICBjb21tYW5kOiAgbGVucy5jb21tYW5kID8gbWFwTGVuc0NvbW1hbmQobGVucy5jb21tYW5kKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBfbHNwOiAgICAgbGVucyxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIHJldHVybiB7IGxlbnNlcywgZGlzcG9zZSgpIHsgLyogKi8gfSB9O1xuICAgICAgICB9LFxuICAgICAgICByZXNvbHZlQ29kZUxlbnM6IGFzeW5jIChfbW9kZWwsIGNvZGVMZW5zKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsc3AgPSAoY29kZUxlbnMgYXMgYW55KS5fbHNwO1xuICAgICAgICAgICAgaWYgKF9jb25uICYmIGxzcCAmJiAhbHNwLmNvbW1hbmQpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZDogYW55ID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ2NvZGVMZW5zL3Jlc29sdmUnLCBsc3ApO1xuICAgICAgICAgICAgICAgICAgICBjb2RlTGVucy5jb21tYW5kID0gcmVzb2x2ZWQ/LmNvbW1hbmQgPyBtYXBMZW5zQ29tbWFuZChyZXNvbHZlZC5jb21tYW5kKSA6IHsgaWQ6IE5PT1BfQ09NTUFORCwgdGl0bGU6ICcnIH07XG4gICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGVMZW5zLmNvbW1hbmQgPSB7IGlkOiBOT09QX0NPTU1BTkQsIHRpdGxlOiAnJyB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb2RlTGVucztcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIC0tLSBKYXZhIGtleXdvcmQgY29tcGxldGlvbiAoUGFjayAxYik6IGFsd2F5cy1hdmFpbGFibGUsIHJhbmtlZCBiZWxvdyBTREsvTFNQIHJlc3VsdHMgLS0tXG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyQ29tcGxldGlvbkl0ZW1Qcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZUNvbXBsZXRpb25JdGVtczogKG1vZGVsLCBwb3NpdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKCFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHdvcmQgPSBtb2RlbC5nZXRXb3JkVW50aWxQb3NpdGlvbihwb3NpdGlvbik7XG4gICAgICAgICAgICBjb25zdCByYW5nZTogbW9uYWNvLklSYW5nZSA9IHtcbiAgICAgICAgICAgICAgICBzdGFydExpbmVOdW1iZXI6IHBvc2l0aW9uLmxpbmVOdW1iZXIsIHN0YXJ0Q29sdW1uOiB3b3JkLnN0YXJ0Q29sdW1uLFxuICAgICAgICAgICAgICAgIGVuZExpbmVOdW1iZXI6ICAgcG9zaXRpb24ubGluZU51bWJlciwgZW5kQ29sdW1uOiAgIHdvcmQuZW5kQ29sdW1uLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3VnZ2VzdGlvbnM6IEpBVkFfS0VZV09SRFMubWFwKGtleXdvcmQgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICAgICAga2V5d29yZCxcbiAgICAgICAgICAgICAgICAgICAga2luZDogICAgICAgbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbUtpbmQuS2V5d29yZCxcbiAgICAgICAgICAgICAgICAgICAgaW5zZXJ0VGV4dDoga2V5d29yZCxcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2UsXG4gICAgICAgICAgICAgICAgICAgIHNvcnRUZXh0OiAgIGA5XyR7a2V5d29yZH1gLFxuICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgfSk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEhlbHBlcnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gbHNwU2V2ZXJpdHkoc2V2ZXJpdHk6IERpYWdub3N0aWNTZXZlcml0eSB8IHVuZGVmaW5lZCk6IG1vbmFjby5NYXJrZXJTZXZlcml0eSB7XG4gICAgc3dpdGNoIChzZXZlcml0eSkge1xuICAgICAgICBjYXNlIERpYWdub3N0aWNTZXZlcml0eS5FcnJvcjogICAgICAgcmV0dXJuIG1vbmFjby5NYXJrZXJTZXZlcml0eS5FcnJvcjtcbiAgICAgICAgY2FzZSBEaWFnbm9zdGljU2V2ZXJpdHkuV2FybmluZzogICAgIHJldHVybiBtb25hY28uTWFya2VyU2V2ZXJpdHkuV2FybmluZztcbiAgICAgICAgY2FzZSBEaWFnbm9zdGljU2V2ZXJpdHkuSW5mb3JtYXRpb246IHJldHVybiBtb25hY28uTWFya2VyU2V2ZXJpdHkuSW5mbztcbiAgICAgICAgY2FzZSBEaWFnbm9zdGljU2V2ZXJpdHkuSGludDogICAgICAgIHJldHVybiBtb25hY28uTWFya2VyU2V2ZXJpdHkuSGludDtcbiAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtb25hY28uTWFya2VyU2V2ZXJpdHkuRXJyb3I7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBsc3BSYW5nZVRvTW9uYWNvKHI6IHsgc3RhcnQ6IHsgbGluZTogbnVtYmVyOyBjaGFyYWN0ZXI6IG51bWJlciB9OyBlbmQ6IHsgbGluZTogbnVtYmVyOyBjaGFyYWN0ZXI6IG51bWJlciB9IH0pOiBtb25hY28uSVJhbmdlIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBzdGFydExpbmVOdW1iZXI6IHIuc3RhcnQubGluZSArIDEsXG4gICAgICAgIHN0YXJ0Q29sdW1uOiAgICAgci5zdGFydC5jaGFyYWN0ZXIgKyAxLFxuICAgICAgICBlbmRMaW5lTnVtYmVyOiAgIHIuZW5kLmxpbmUgKyAxLFxuICAgICAgICBlbmRDb2x1bW46ICAgICAgIHIuZW5kLmNoYXJhY3RlciArIDEsXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gbWFya3VwVG9TdHJpbmcoYzogc3RyaW5nIHwgTWFya3VwQ29udGVudCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHR5cGVvZiBjID09PSAnc3RyaW5nJyA/IGMgOiBjLnZhbHVlO1xufVxuXG5mdW5jdGlvbiBsc3BDb21wbGV0aW9uS2luZChraW5kOiBDb21wbGV0aW9uSXRlbUtpbmQgfCB1bmRlZmluZWQpOiBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtS2luZCB7XG4gICAgY29uc3QgSyA9IG1vbmFjby5sYW5ndWFnZXMuQ29tcGxldGlvbkl0ZW1LaW5kO1xuICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5UZXh0OiAgICAgICAgICByZXR1cm4gSy5UZXh0O1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5NZXRob2Q6ICAgICAgICByZXR1cm4gSy5NZXRob2Q7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLkZ1bmN0aW9uOiAgICAgIHJldHVybiBLLkZ1bmN0aW9uO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5Db25zdHJ1Y3RvcjogICByZXR1cm4gSy5Db25zdHJ1Y3RvcjtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuRmllbGQ6ICAgICAgICAgcmV0dXJuIEsuRmllbGQ7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLlZhcmlhYmxlOiAgICAgIHJldHVybiBLLlZhcmlhYmxlO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5DbGFzczogICAgICAgICByZXR1cm4gSy5DbGFzcztcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuSW50ZXJmYWNlOiAgICAgcmV0dXJuIEsuSW50ZXJmYWNlO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5Nb2R1bGU6ICAgICAgICByZXR1cm4gSy5Nb2R1bGU7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLlByb3BlcnR5OiAgICAgIHJldHVybiBLLlByb3BlcnR5O1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5LZXl3b3JkOiAgICAgICByZXR1cm4gSy5LZXl3b3JkO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5TbmlwcGV0OiAgICAgICByZXR1cm4gSy5TbmlwcGV0O1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5Db25zdGFudDogICAgICByZXR1cm4gSy5Db25zdGFudDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuU3RydWN0OiAgICAgICAgcmV0dXJuIEsuU3RydWN0O1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5UeXBlUGFyYW1ldGVyOiByZXR1cm4gSy5UeXBlUGFyYW1ldGVyO1xuICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSy5UZXh0O1xuICAgIH1cbn1cblxuZnVuY3Rpb24gbHNwQ29tcGxldGlvblRvTW9uYWNvKFxuICAgIGl0ZW06IENvbXBsZXRpb25JdGVtLFxuICAgIG1vZGVsOiBtb25hY28uZWRpdG9yLklUZXh0TW9kZWwsXG4gICAgcG9zaXRpb246IG1vbmFjby5Qb3NpdGlvbixcbik6IE1vbmFjb0NvbXBsZXRpb25JdGVtIHtcbiAgICBjb25zdCB3b3JkID0gbW9kZWwuZ2V0V29yZFVudGlsUG9zaXRpb24ocG9zaXRpb24pO1xuICAgIGxldCByYW5nZTogbW9uYWNvLklSYW5nZSA9IHtcbiAgICAgICAgc3RhcnRMaW5lTnVtYmVyOiBwb3NpdGlvbi5saW5lTnVtYmVyLFxuICAgICAgICBzdGFydENvbHVtbjogICAgIHdvcmQuc3RhcnRDb2x1bW4sXG4gICAgICAgIGVuZExpbmVOdW1iZXI6ICAgcG9zaXRpb24ubGluZU51bWJlcixcbiAgICAgICAgZW5kQ29sdW1uOiAgICAgICB3b3JkLmVuZENvbHVtbixcbiAgICB9O1xuICAgIGxldCBpbnNlcnRUZXh0ID0gaXRlbS5pbnNlcnRUZXh0ID8/IGl0ZW0ubGFiZWw7XG4gICAgY29uc3QgdGV4dEVkaXQgPSBpdGVtLnRleHRFZGl0IGFzIHsgcmFuZ2U/OiBMc3BSYW5nZTsgcmVwbGFjZT86IExzcFJhbmdlOyBpbnNlcnQ/OiBMc3BSYW5nZTsgbmV3VGV4dD86IHN0cmluZyB9IHwgdW5kZWZpbmVkO1xuICAgIGlmICh0ZXh0RWRpdCkge1xuICAgICAgICBjb25zdCByID0gdGV4dEVkaXQucmFuZ2UgPz8gdGV4dEVkaXQucmVwbGFjZSA/PyB0ZXh0RWRpdC5pbnNlcnQ7XG4gICAgICAgIGlmIChyKSByYW5nZSA9IGxzcFJhbmdlVG9Nb25hY28ocik7XG4gICAgICAgIGlmICh0eXBlb2YgdGV4dEVkaXQubmV3VGV4dCA9PT0gJ3N0cmluZycpIGluc2VydFRleHQgPSB0ZXh0RWRpdC5uZXdUZXh0O1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQ6IE1vbmFjb0NvbXBsZXRpb25JdGVtID0ge1xuICAgICAgICBsYWJlbDogICAgICAgICAgIGl0ZW0ubGFiZWwsXG4gICAgICAgIGtpbmQ6ICAgICAgICAgICAgbHNwQ29tcGxldGlvbktpbmQoaXRlbS5raW5kKSxcbiAgICAgICAgZGV0YWlsOiAgICAgICAgICBpdGVtLmRldGFpbCxcbiAgICAgICAgZG9jdW1lbnRhdGlvbjogICBpdGVtLmRvY3VtZW50YXRpb24gPyB7IHZhbHVlOiBtYXJrdXBUb1N0cmluZyhpdGVtLmRvY3VtZW50YXRpb24pLCBpc1RydXN0ZWQ6IGZhbHNlIH0gOiB1bmRlZmluZWQsXG4gICAgICAgIGluc2VydFRleHQsXG4gICAgICAgIGluc2VydFRleHRSdWxlczogaXRlbS5pbnNlcnRUZXh0Rm9ybWF0ID09PSBJbnNlcnRUZXh0Rm9ybWF0LlNuaXBwZXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtSW5zZXJ0VGV4dFJ1bGUuSW5zZXJ0QXNTbmlwcGV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICByYW5nZSxcbiAgICAgICAgc29ydFRleHQ6ICAgICAgICAgICAgc2RrUHJpb3JpdGlzZWRTb3J0VGV4dChpdGVtKSxcbiAgICAgICAgZmlsdGVyVGV4dDogICAgICAgICAgaXRlbS5maWx0ZXJUZXh0LFxuICAgICAgICBwcmVzZWxlY3Q6ICAgICAgICAgICBpdGVtLnByZXNlbGVjdCxcbiAgICAgICAgY29tbWl0Q2hhcmFjdGVyczogICAgaXRlbS5jb21taXRDaGFyYWN0ZXJzLFxuICAgICAgICBhZGRpdGlvbmFsVGV4dEVkaXRzOiBpdGVtLmFkZGl0aW9uYWxUZXh0RWRpdHM/Lm1hcCh0ZXh0RWRpdFRvTW9uYWNvKSxcbiAgICB9O1xuICAgIHJlc3VsdC5fbHNwID0gaXRlbTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFJhbmtzIERpcmlnaWJsZSBTREsgc3VnZ2VzdGlvbnMgKHtAY29kZSBvcmcuZWNsaXBzZS5kaXJpZ2libGUuc2RrLip9KSBhYm92ZSBldmVyeXRoaW5nIGVsc2UgYnlcbiAqIHByZWZpeGluZyB0aGUgc2VydmVyIHNvcnRUZXh0IHdpdGggYSBwcmlvcml0eSBidWNrZXQsIHByZXNlcnZpbmcgdGhlIHNlcnZlciBvcmRlciB3aXRoaW4gZWFjaCBidWNrZXQuXG4gKi9cbmZ1bmN0aW9uIHNka1ByaW9yaXRpc2VkU29ydFRleHQoaXRlbTogQ29tcGxldGlvbkl0ZW0pOiBzdHJpbmcge1xuICAgIGNvbnN0IGJhc2UgPSBpdGVtLnNvcnRUZXh0ID8/ICh0eXBlb2YgaXRlbS5sYWJlbCA9PT0gJ3N0cmluZycgPyBpdGVtLmxhYmVsIDogJycpO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gKGl0ZW0ubGFiZWxEZXRhaWxzICYmIHR5cGVvZiBpdGVtLmxhYmVsRGV0YWlscy5kZXNjcmlwdGlvbiA9PT0gJ3N0cmluZycpXG4gICAgICAgID8gaXRlbS5sYWJlbERldGFpbHMuZGVzY3JpcHRpb24gOiAnJztcbiAgICBjb25zdCBoYXlzdGFjayA9IGAke2l0ZW0uZGV0YWlsID8/ICcnfSAke2Rlc2NyaXB0aW9ufWA7XG4gICAgcmV0dXJuIGhheXN0YWNrLmluY2x1ZGVzKCdvcmcuZWNsaXBzZS5kaXJpZ2libGUuc2RrJykgPyBgMF8ke2Jhc2V9YCA6IGAxXyR7YmFzZX1gO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDb2RlIGFjdGlvbnMsIGNvbW1hbmRzLCByZWZhY3Rvci9nZW5lcmF0ZSwgd29ya3NwYWNlIGVkaXRzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBNb25hY28gY29tbWFuZCBpZCB1c2VkIHRvIGFwcGx5IGEgZGVmZXJyZWQgTFNQIGNvZGUgYWN0aW9uIHdoZW4gdGhlIHVzZXIgc2VsZWN0cyBpdC4gKi9cbmNvbnN0IEFQUExZX0FDVElPTl9DT01NQU5EID0gJ2RpcmlnaWJsZS5qYXZhLmFwcGx5Q29kZUFjdGlvbic7XG5cbi8qKiBWaXJ0dWFsIFVSSSBwcmVmaXggb2YgZWRpdG9yIG1vZGVsczsgc3RyaXBwaW5nIGl0IHlpZWxkcyB0aGUgSURFIHdvcmtzcGFjZSBwYXRoICgvd3MvcHJvai8uLi4pLiAqL1xuY29uc3QgVklSVFVBTF9GSUxFX1BSRUZJWCA9ICdmaWxlOi8vL3dvcmtzcGFjZSc7XG5cbi8qKiBNb25hY28gY29tbWFuZCBpZCB1c2VkIGZvciBkaXNwbGF5LW9ubHkgQ29kZUxlbnNlcyAoZS5nLiBhIHJlZmVyZW5jZSBjb3VudCB3aXRoIG5vIHJlc29sdmVkIGFjdGlvbikuICovXG5jb25zdCBOT09QX0NPTU1BTkQgPSAnZGlyaWdpYmxlLmphdmEubm9vcExlbnMnO1xuXG4vKiogSmF2YSBTRSBrZXl3b3Jkcy9saXRlcmFscyBvZmZlcmVkIGFzIGxvdy1wcmlvcml0eSBjb21wbGV0aW9uIHNvIHRoZXkgYWx3YXlzIGFwcGVhciB3aGlsZSB0eXBpbmcuICovXG5jb25zdCBKQVZBX0tFWVdPUkRTID0gWydhYnN0cmFjdCcsICdhc3NlcnQnLCAnYm9vbGVhbicsICdicmVhaycsICdieXRlJywgJ2Nhc2UnLCAnY2F0Y2gnLCAnY2hhcicsICdjbGFzcycsXG4gICAgJ2NvbnN0JywgJ2NvbnRpbnVlJywgJ2RlZmF1bHQnLCAnZG8nLCAnZG91YmxlJywgJ2Vsc2UnLCAnZW51bScsICdleHRlbmRzJywgJ2ZpbmFsJywgJ2ZpbmFsbHknLCAnZmxvYXQnLFxuICAgICdmb3InLCAnZ290bycsICdpZicsICdpbXBsZW1lbnRzJywgJ2ltcG9ydCcsICdpbnN0YW5jZW9mJywgJ2ludCcsICdpbnRlcmZhY2UnLCAnbG9uZycsICduYXRpdmUnLCAnbmV3JyxcbiAgICAncGFja2FnZScsICdwcml2YXRlJywgJ3Byb3RlY3RlZCcsICdwdWJsaWMnLCAncmV0dXJuJywgJ3Nob3J0JywgJ3N0YXRpYycsICdzdHJpY3RmcCcsICdzdXBlcicsICdzd2l0Y2gnLFxuICAgICdzeW5jaHJvbml6ZWQnLCAndGhpcycsICd0aHJvdycsICd0aHJvd3MnLCAndHJhbnNpZW50JywgJ3RyeScsICd2b2lkJywgJ3ZvbGF0aWxlJywgJ3doaWxlJywgJ3ZhcicsXG4gICAgJ3lpZWxkJywgJ3JlY29yZCcsICdzZWFsZWQnLCAncGVybWl0cycsICd0cnVlJywgJ2ZhbHNlJywgJ251bGwnXTtcblxuLyoqIFNoYXJlZCBkZWZpbml0aW9uLXN0eWxlIGxvY2F0aW9uIHJlcXVlc3QgdXNlZCBieSBnby10by1kZWZpbml0aW9uL2ltcGxlbWVudGF0aW9uL3R5cGUtZGVmaW5pdGlvbi4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RMb2NhdGlvbnMobWV0aG9kOiBzdHJpbmcsIG1vZGVsOiBtb25hY28uZWRpdG9yLklUZXh0TW9kZWwsIHBvc2l0aW9uOiBtb25hY28uUG9zaXRpb24pIHtcbiAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCByZXN1bHQ6IExvY2F0aW9uIHwgTG9jYXRpb25bXSB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdChtZXRob2QsIHtcbiAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICB9KTtcbiAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgbG9jYXRpb25zID0gKEFycmF5LmlzQXJyYXkocmVzdWx0KSA/IHJlc3VsdCA6IFtyZXN1bHRdKS5tYXAobG9jID0+ICh7IHVyaTogbW9uYWNvLlVyaS5wYXJzZShsb2MudXJpKSwgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28obG9jLnJhbmdlKSB9KSk7XG4gICAgYXdhaXQgZW5zdXJlTW9kZWxzRm9yTG9jYXRpb25zKGxvY2F0aW9ucyk7XG4gICAgcmV0dXJuIGxvY2F0aW9ucztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGluLW1lbW9yeSBNb25hY28gbW9kZWxzIGZvciB0aGUgd29ya3NwYWNlIGZpbGVzIHJlZmVyZW5jZWQgYnkgdGhlIGdpdmVuIGxvY2F0aW9ucyAoZmV0Y2hlZFxuICogb3ZlciBSRVNUKSBzbyB0aGUgcmVmZXJlbmNlcyAvIHBlZWsgd2lkZ2V0cyBjYW4gcmVuZGVyIGEgY29kZSBwcmV2aWV3IFx1MjAxNCBNb25hY28gY2FuIG9ubHkgcHJldmlldyBmaWxlc1xuICogaXQgaGFzIGEgbW9kZWwgZm9yLCBhbmQgdGhpcyBzaW5nbGUtZmlsZSBlZGl0b3Igb3RoZXJ3aXNlIGhhcyBub25lIGZvciBvdGhlciBmaWxlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZW5zdXJlTW9kZWxzRm9yTG9jYXRpb25zKGxvY2F0aW9uczogQXJyYXk8eyB1cmk6IG1vbmFjby5VcmkgfT4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwobG9jYXRpb25zLm1hcChhc3luYyAoeyB1cmkgfSkgPT4ge1xuICAgICAgICBjb25zdCB1cmlTdHIgPSB1cmkudG9TdHJpbmcoKTtcbiAgICAgICAgaWYgKHNlZW4uaGFzKHVyaVN0cikgfHwgIXVyaVN0ci5zdGFydHNXaXRoKFZJUlRVQUxfRklMRV9QUkVGSVgpIHx8IG1vbmFjby5lZGl0b3IuZ2V0TW9kZWwodXJpKSkgcmV0dXJuO1xuICAgICAgICBzZWVuLmFkZCh1cmlTdHIpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgdGV4dCA9IGF3YWl0IGZldGNoV29ya3NwYWNlRmlsZVRleHQodXJpVG9Xb3Jrc3BhY2VQYXRoKHVyaVN0cikgPz8gdXJpU3RyKTtcbiAgICAgICAgICAgIGlmICghbW9uYWNvLmVkaXRvci5nZXRNb2RlbCh1cmkpKSBtb25hY28uZWRpdG9yLmNyZWF0ZU1vZGVsKHRleHQsICdqYXZhJywgdXJpKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBwcmV2aWV3IGp1c3Qgd29uJ3QgcmVuZGVyIGZvciB0aGlzIG9uZVxuICAgICAgICB9XG4gICAgfSkpO1xufVxuXG4vKiogUmVjdXJzaXZlbHkgbWFwcyBMU1AgaGllcmFyY2hpY2FsIERvY3VtZW50U3ltYm9scyB0byBNb25hY28ncyBzaGFwZSAoa2luZHMgYXJlIDEtYmFzZWQgdnMgMC1iYXNlZCkuICovXG5mdW5jdGlvbiBtYXBEb2N1bWVudFN5bWJvbHMoc3ltYm9sczogYW55W10pOiBtb25hY28ubGFuZ3VhZ2VzLkRvY3VtZW50U3ltYm9sW10ge1xuICAgIHJldHVybiAoc3ltYm9scyA/PyBbXSkubWFwKHMgPT4gKHtcbiAgICAgICAgbmFtZTogICAgICAgICAgIHMubmFtZSxcbiAgICAgICAgZGV0YWlsOiAgICAgICAgIHMuZGV0YWlsID8/ICcnLFxuICAgICAgICBraW5kOiAgICAgICAgICAgKHMua2luZCA/PyAxKSAtIDEsXG4gICAgICAgIHRhZ3M6ICAgICAgICAgICBzLnRhZ3MgPz8gW10sXG4gICAgICAgIHJhbmdlOiAgICAgICAgICBsc3BSYW5nZVRvTW9uYWNvKHMucmFuZ2UpLFxuICAgICAgICBzZWxlY3Rpb25SYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhzLnNlbGVjdGlvblJhbmdlID8/IHMucmFuZ2UpLFxuICAgICAgICBjaGlsZHJlbjogICAgICAgcy5jaGlsZHJlbiA/IG1hcERvY3VtZW50U3ltYm9scyhzLmNoaWxkcmVuKSA6IFtdLFxuICAgIH0pKTtcbn1cblxuZnVuY3Rpb24gZm9sZGluZ0tpbmQoa2luZDogc3RyaW5nIHwgdW5kZWZpbmVkKTogbW9uYWNvLmxhbmd1YWdlcy5Gb2xkaW5nUmFuZ2VLaW5kIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBGSyA9IG1vbmFjby5sYW5ndWFnZXMuRm9sZGluZ1JhbmdlS2luZDtcbiAgICBzd2l0Y2ggKGtpbmQpIHtcbiAgICAgICAgY2FzZSAnY29tbWVudCc6IHJldHVybiBGSy5Db21tZW50O1xuICAgICAgICBjYXNlICdpbXBvcnRzJzogcmV0dXJuIEZLLkltcG9ydHM7XG4gICAgICAgIGNhc2UgJ3JlZ2lvbic6ICByZXR1cm4gRksuUmVnaW9uO1xuICAgICAgICBkZWZhdWx0OiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG59XG5cbi8qKiBGbGF0dGVucyBhbiBMU1AgU2VsZWN0aW9uUmFuZ2UgcGFyZW50LWNoYWluIGludG8gTW9uYWNvJ3MgaW5uZXJtb3N0LXRvLW91dGVybW9zdCBhcnJheS4gKi9cbmZ1bmN0aW9uIGZsYXR0ZW5TZWxlY3Rpb25SYW5nZShzZWxlY3Rpb25SYW5nZTogYW55KTogbW9uYWNvLmxhbmd1YWdlcy5TZWxlY3Rpb25SYW5nZVtdIHtcbiAgICBjb25zdCByYW5nZXM6IG1vbmFjby5sYW5ndWFnZXMuU2VsZWN0aW9uUmFuZ2VbXSA9IFtdO1xuICAgIGxldCBjdXJyZW50ID0gc2VsZWN0aW9uUmFuZ2U7XG4gICAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICAgICAgcmFuZ2VzLnB1c2goeyByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhjdXJyZW50LnJhbmdlKSB9KTtcbiAgICAgICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50O1xuICAgIH1cbiAgICByZXR1cm4gcmFuZ2VzO1xufVxuXG4vKiogTWFwcyBhIEpEVC5MUyBDb2RlTGVucyBjb21tYW5kIHRvIGEgTW9uYWNvIGNvbW1hbmQsIHdpcmluZyB0aGUgcmVmZXJlbmNlcy9pbXBsZW1lbnRhdGlvbnMgcGVlay4gKi9cbmZ1bmN0aW9uIG1hcExlbnNDb21tYW5kKGNtZDogYW55KTogbW9uYWNvLmxhbmd1YWdlcy5Db21tYW5kIHtcbiAgICBjb25zdCBhcmdzID0gY21kLmFyZ3VtZW50cyA/PyBbXTtcbiAgICBpZiAoKGNtZC5jb21tYW5kID09PSAnamF2YS5zaG93LnJlZmVyZW5jZXMnIHx8IGNtZC5jb21tYW5kID09PSAnamF2YS5zaG93LmltcGxlbWVudGF0aW9ucycpICYmIGFyZ3MubGVuZ3RoID49IDMpIHtcbiAgICAgICAgY29uc3QgbG9jYXRpb25zID0gKGFyZ3NbMl0gPz8gW10pLm1hcCgobDogYW55KSA9PiAoeyB1cmk6IG1vbmFjby5VcmkucGFyc2UobC51cmkpLCByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhsLnJhbmdlKSB9KSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZDogICAgICAgICdlZGl0b3IuYWN0aW9uLnNob3dSZWZlcmVuY2VzJyxcbiAgICAgICAgICAgIHRpdGxlOiAgICAgY21kLnRpdGxlLFxuICAgICAgICAgICAgYXJndW1lbnRzOiBbbW9uYWNvLlVyaS5wYXJzZShhcmdzWzBdKSwgeyBsaW5lTnVtYmVyOiBhcmdzWzFdLmxpbmUgKyAxLCBjb2x1bW46IGFyZ3NbMV0uY2hhcmFjdGVyICsgMSB9LCBsb2NhdGlvbnNdLFxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4geyBpZDogTk9PUF9DT01NQU5ELCB0aXRsZTogY21kLnRpdGxlIH07XG59XG5cbnR5cGUgTHNwUmFuZ2UgPSB7IHN0YXJ0OiB7IGxpbmU6IG51bWJlcjsgY2hhcmFjdGVyOiBudW1iZXIgfTsgZW5kOiB7IGxpbmU6IG51bWJlcjsgY2hhcmFjdGVyOiBudW1iZXIgfSB9O1xuXG4vKiogTW9uYWNvIGNvbXBsZXRpb24gaXRlbSBjYXJyeWluZyB0aGUgb3JpZ2luYXRpbmcgTFNQIGl0ZW0gc28gcmVzb2x2ZSBjYW4gZmV0Y2ggaXRzIGltcG9ydCBlZGl0cy4gKi9cbnR5cGUgTW9uYWNvQ29tcGxldGlvbkl0ZW0gPSBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtICYgeyBfbHNwPzogQ29tcGxldGlvbkl0ZW0gfTtcblxuZnVuY3Rpb24gdGV4dEVkaXRUb01vbmFjbyhlZGl0OiBUZXh0RWRpdCk6IG1vbmFjby5sYW5ndWFnZXMuVGV4dEVkaXQge1xuICAgIHJldHVybiB7IHJhbmdlOiBsc3BSYW5nZVRvTW9uYWNvKGVkaXQucmFuZ2UpLCB0ZXh0OiBlZGl0Lm5ld1RleHQgfTtcbn1cblxuZnVuY3Rpb24gbW9uYWNvUmFuZ2VUb0xzcChyOiBtb25hY28uSVJhbmdlKTogTHNwUmFuZ2Uge1xuICAgIHJldHVybiB7XG4gICAgICAgIHN0YXJ0OiB7IGxpbmU6IHIuc3RhcnRMaW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiByLnN0YXJ0Q29sdW1uIC0gMSB9LFxuICAgICAgICBlbmQ6ICAgeyBsaW5lOiByLmVuZExpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHIuZW5kQ29sdW1uIC0gMSB9LFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIG1vbmFjb1NldmVyaXR5VG9Mc3Aoc2V2ZXJpdHk6IG1vbmFjby5NYXJrZXJTZXZlcml0eSk6IERpYWdub3N0aWNTZXZlcml0eSB7XG4gICAgc3dpdGNoIChzZXZlcml0eSkge1xuICAgICAgICBjYXNlIG1vbmFjby5NYXJrZXJTZXZlcml0eS5FcnJvcjogICByZXR1cm4gRGlhZ25vc3RpY1NldmVyaXR5LkVycm9yO1xuICAgICAgICBjYXNlIG1vbmFjby5NYXJrZXJTZXZlcml0eS5XYXJuaW5nOiByZXR1cm4gRGlhZ25vc3RpY1NldmVyaXR5Lldhcm5pbmc7XG4gICAgICAgIGNhc2UgbW9uYWNvLk1hcmtlclNldmVyaXR5LkluZm86ICAgIHJldHVybiBEaWFnbm9zdGljU2V2ZXJpdHkuSW5mb3JtYXRpb247XG4gICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBEaWFnbm9zdGljU2V2ZXJpdHkuSGludDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIG1hcmtlclRvTHNwRGlhZ25vc3RpYyhtOiBtb25hY28uZWRpdG9yLklNYXJrZXJEYXRhKTogRGlhZ25vc3RpYyB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgcmFuZ2U6ICAgIHsgc3RhcnQ6IHsgbGluZTogbS5zdGFydExpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IG0uc3RhcnRDb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICAgICAgICAgIGVuZDogICB7IGxpbmU6IG0uZW5kTGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogbS5lbmRDb2x1bW4gLSAxIH0gfSxcbiAgICAgICAgbWVzc2FnZTogIG0ubWVzc2FnZSxcbiAgICAgICAgc2V2ZXJpdHk6IG1vbmFjb1NldmVyaXR5VG9Mc3AobS5zZXZlcml0eSksXG4gICAgICAgIHNvdXJjZTogICBtLnNvdXJjZSxcbiAgICB9IGFzIERpYWdub3N0aWM7XG59XG5cbmZ1bmN0aW9uIGxzcENvZGVBY3Rpb25Ub01vbmFjbyhhY3Rpb246IENvZGVBY3Rpb24gfCBDb21tYW5kKTogbW9uYWNvLmxhbmd1YWdlcy5Db2RlQWN0aW9uIHtcbiAgICBjb25zdCBpc0NvbW1hbmQgPSB0eXBlb2YgKGFjdGlvbiBhcyBDb21tYW5kKS5jb21tYW5kID09PSAnc3RyaW5nJztcbiAgICBjb25zdCB0aXRsZSA9IGFjdGlvbi50aXRsZVxuICAgICAgICA/PyAoaXNDb21tYW5kID8gKGFjdGlvbiBhcyBDb21tYW5kKS5jb21tYW5kIDogKGFjdGlvbiBhcyBDb2RlQWN0aW9uKS5jb21tYW5kPy50aXRsZSlcbiAgICAgICAgPz8gJ0FjdGlvbic7XG4gICAgY29uc3Qga2luZCA9IGlzQ29tbWFuZCA/ICdxdWlja2ZpeCcgOiAoKGFjdGlvbiBhcyBDb2RlQWN0aW9uKS5raW5kID8/ICdxdWlja2ZpeCcpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHRpdGxlLFxuICAgICAgICBraW5kLFxuICAgICAgICBkaWFnbm9zdGljczogW10sXG4gICAgICAgIGlzUHJlZmVycmVkOiAoYWN0aW9uIGFzIENvZGVBY3Rpb24pLmlzUHJlZmVycmVkLFxuICAgICAgICAvLyBBcHBseSBsYXppbHkgdGhyb3VnaCBvdXIgY29tbWFuZCBzbyB3ZSBjYW4gcmVzb2x2ZSwgcnVuIHNlcnZlciBjb21tYW5kcyBhbmQgYXBwbHkgZWRpdHMgdW5pZm9ybWx5LlxuICAgICAgICBjb21tYW5kOiB7IGlkOiBBUFBMWV9BQ1RJT05fQ09NTUFORCwgdGl0bGUsIGFyZ3VtZW50czogW2FjdGlvbl0gfSxcbiAgICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBhcHBseUNvZGVBY3Rpb24oYWN0aW9uOiBDb2RlQWN0aW9uIHwgQ29tbWFuZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghX2Nvbm4pIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIChhY3Rpb24gYXMgQ29tbWFuZCkuY29tbWFuZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGF3YWl0IHJ1blNlcnZlckNvbW1hbmQoYWN0aW9uIGFzIENvbW1hbmQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXNvbHZlZCA9IGFjdGlvbiBhcyBDb2RlQWN0aW9uO1xuICAgICAgICBpZiAoIXJlc29sdmVkLmVkaXQgJiYgKHJlc29sdmVkIGFzIHsgZGF0YT86IHVua25vd24gfSkuZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXNvbHZlZCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCdjb2RlQWN0aW9uL3Jlc29sdmUnLCByZXNvbHZlZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc29sdmVkLmVkaXQpIGFwcGx5V29ya3NwYWNlRWRpdChyZXNvbHZlZC5lZGl0KTtcbiAgICAgICAgaWYgKHJlc29sdmVkLmNvbW1hbmQpIGF3YWl0IHJ1blNlcnZlckNvbW1hbmQocmVzb2x2ZWQuY29tbWFuZCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tqYXZhLWxzcF0gY29kZSBhY3Rpb24gZmFpbGVkOicsIChlIGFzIEVycm9yKT8ubWVzc2FnZSA/PyBlKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGlzV29ya3NwYWNlRWRpdCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFdvcmtzcGFjZUVkaXQge1xuICAgIHJldHVybiAhIXZhbHVlICYmICghISh2YWx1ZSBhcyBXb3Jrc3BhY2VFZGl0KS5jaGFuZ2VzIHx8ICEhKHZhbHVlIGFzIFdvcmtzcGFjZUVkaXQpLmRvY3VtZW50Q2hhbmdlcyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1blNlcnZlckNvbW1hbmQoY21kOiBDb21tYW5kKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFfY29ubiB8fCAhY21kPy5jb21tYW5kKSByZXR1cm47XG4gICAgaWYgKEdFTkVSQVRFW2NtZC5jb21tYW5kXSkge1xuICAgICAgICBhd2FpdCBydW5HZW5lcmF0ZShjbWQuY29tbWFuZCwgY21kLmFyZ3VtZW50cyA/PyBbXSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3dvcmtzcGFjZS9leGVjdXRlQ29tbWFuZCcsIHsgY29tbWFuZDogY21kLmNvbW1hbmQsIGFyZ3VtZW50czogY21kLmFyZ3VtZW50cyA/PyBbXSB9KTtcbiAgICBpZiAoaXNXb3Jrc3BhY2VFZGl0KHJlc3VsdCkpIGFwcGx5V29ya3NwYWNlRWRpdChyZXN1bHQpO1xufVxuXG5pbnRlcmZhY2UgR2VuZXJhdGVTcGVjIHtcbiAgICBsYWJlbDogc3RyaW5nO1xuICAgIHN0YXR1czogc3RyaW5nO1xuICAgIGdlbmVyYXRlOiBzdHJpbmc7XG4gICAgbWVtYmVyczogKHN0YXR1czogYW55KSA9PiBBcnJheTx7IGxhYmVsOiBzdHJpbmc7IHJlZjogYW55IH0+O1xuICAgIGJ1aWxkQXJnczogKHByb21wdEFyZ3M6IGFueVtdLCBzdGF0dXM6IGFueSwgc2VsZWN0ZWQ6IGFueVtdKSA9PiBhbnlbXTtcbn1cblxuLyoqIE1lbWJlci1uYW1lZCBmaWVsZHMgXHUyMTkyIHBpY2tlciBsYWJlbHMuICovXG5mdW5jdGlvbiBmaWVsZExhYmVsKGY6IGFueSk6IHN0cmluZyB7XG4gICAgY29uc3QgbmFtZSA9IGY/Lm5hbWUgPz8gZj8uZmllbGROYW1lID8/ICcnO1xuICAgIGNvbnN0IHR5cGUgPSBmPy50eXBlID8/IGY/LnR5cGVOYW1lO1xuICAgIHJldHVybiB0eXBlID8gYCR7bmFtZX06ICR7dHlwZX1gIDogYCR7bmFtZX1gO1xufVxuXG4vKipcbiAqIFRoZSBKRFQuTFMgc291cmNlLWdlbmVyYXRpb24gY29tbWFuZHMgKGNvbnN0cnVjdG9ycywgZ2V0dGVycy9zZXR0ZXJzLCB0b1N0cmluZywgaGFzaENvZGUvZXF1YWxzKS5cbiAqIEVhY2ggbWFwcyB0aGUgY2xpZW50IFwiKlByb21wdFwiIGNvbW1hbmQgdG8gdGhlIHNlcnZlciBzdGF0dXMgKyBnZW5lcmF0ZSBkZWxlZ2F0ZSBjb21tYW5kczsgdGhlIHN0YXR1c1xuICogY2FsbCB5aWVsZHMgdGhlIGNhbmRpZGF0ZSBmaWVsZHMgc2hvd24gaW4gdGhlIG1lbWJlciBwaWNrZXIsIHRoZSBnZW5lcmF0ZSBjYWxsIHJldHVybnMgdGhlIGVkaXQuXG4gKi9cbmNvbnN0IEdFTkVSQVRFOiBSZWNvcmQ8c3RyaW5nLCBHZW5lcmF0ZVNwZWM+ID0ge1xuICAgICdqYXZhLmFjdGlvbi5nZW5lcmF0ZUNvbnN0cnVjdG9yc1Byb21wdCc6IHtcbiAgICAgICAgbGFiZWw6ICdTZWxlY3QgZmllbGRzIGFuZCBjb25zdHJ1Y3RvcnMnLFxuICAgICAgICBzdGF0dXM6ICdqYXZhLmFjdGlvbi5jaGVja0NvbnN0cnVjdG9yc1N0YXR1cycsXG4gICAgICAgIGdlbmVyYXRlOiAnamF2YS5hY3Rpb24uZ2VuZXJhdGVDb25zdHJ1Y3RvcnMnLFxuICAgICAgICBtZW1iZXJzOiAocykgPT4gKHM/LmZpZWxkcyA/PyBbXSkubWFwKChmOiBhbnkpID0+ICh7IGxhYmVsOiBmaWVsZExhYmVsKGYpLCByZWY6IGYgfSkpLFxuICAgICAgICBidWlsZEFyZ3M6IChhcmdzLCBzLCBzZWwpID0+IFthcmdzWzBdLCB7IGNvbnN0cnVjdG9yczogcz8uY29uc3RydWN0b3JzID8/IFtdLCBmaWVsZHM6IHNlbC5tYXAobSA9PiBtLnJlZikgfV0sXG4gICAgfSxcbiAgICAnamF2YS5hY3Rpb24uZ2VuZXJhdGVUb1N0cmluZ1Byb21wdCc6IHtcbiAgICAgICAgbGFiZWw6ICdTZWxlY3QgZmllbGRzIHRvIGluY2x1ZGUgaW4gdG9TdHJpbmcoKScsXG4gICAgICAgIHN0YXR1czogJ2phdmEuYWN0aW9uLmNoZWNrVG9TdHJpbmdTdGF0dXMnLFxuICAgICAgICBnZW5lcmF0ZTogJ2phdmEuYWN0aW9uLmdlbmVyYXRlVG9TdHJpbmcnLFxuICAgICAgICBtZW1iZXJzOiAocykgPT4gKHM/LmZpZWxkcyA/PyBbXSkubWFwKChmOiBhbnkpID0+ICh7IGxhYmVsOiBmaWVsZExhYmVsKGYpLCByZWY6IGYgfSkpLFxuICAgICAgICBidWlsZEFyZ3M6IChhcmdzLCBfcywgc2VsKSA9PiBbYXJnc1swXSwgc2VsLm1hcChtID0+IG0ucmVmKV0sXG4gICAgfSxcbiAgICAnamF2YS5hY3Rpb24uaGFzaENvZGVFcXVhbHNQcm9tcHQnOiB7XG4gICAgICAgIGxhYmVsOiAnU2VsZWN0IGZpZWxkcyBmb3IgaGFzaENvZGUoKSBhbmQgZXF1YWxzKCknLFxuICAgICAgICBzdGF0dXM6ICdqYXZhLmFjdGlvbi5jaGVja0hhc2hDb2RlRXF1YWxzU3RhdHVzJyxcbiAgICAgICAgZ2VuZXJhdGU6ICdqYXZhLmFjdGlvbi5nZW5lcmF0ZUhhc2hDb2RlRXF1YWxzJyxcbiAgICAgICAgbWVtYmVyczogKHMpID0+IChzPy5maWVsZHMgPz8gW10pLm1hcCgoZjogYW55KSA9PiAoeyBsYWJlbDogZmllbGRMYWJlbChmKSwgcmVmOiBmIH0pKSxcbiAgICAgICAgYnVpbGRBcmdzOiAoYXJncywgX3MsIHNlbCkgPT4gW2FyZ3NbMF0sIHNlbC5tYXAobSA9PiBtLnJlZiksIGZhbHNlXSxcbiAgICB9LFxuICAgICdqYXZhLmFjdGlvbi5nZW5lcmF0ZUFjY2Vzc29yc1Byb21wdCc6IHtcbiAgICAgICAgbGFiZWw6ICdTZWxlY3QgZmllbGRzIHRvIGdlbmVyYXRlIGdldHRlcnMgYW5kIHNldHRlcnMnLFxuICAgICAgICBzdGF0dXM6ICdqYXZhLmFjdGlvbi5jaGVja0FjY2Vzc29yc1N0YXR1cycsXG4gICAgICAgIGdlbmVyYXRlOiAnamF2YS5hY3Rpb24uZ2VuZXJhdGVBY2Nlc3NvcnMnLFxuICAgICAgICBtZW1iZXJzOiAocykgPT4gKHM/LmFjY2Vzc29ycyA/PyBzID8/IFtdKS5tYXAoKGE6IGFueSkgPT4gKHsgbGFiZWw6IGZpZWxkTGFiZWwoYSksIHJlZjogYSB9KSksXG4gICAgICAgIGJ1aWxkQXJnczogKGFyZ3MsIF9zLCBzZWwpID0+IFthcmdzWzBdLCBzZWwubWFwKG0gPT4gbS5yZWYpXSxcbiAgICB9LFxuICAgICdqYXZhLmFjdGlvbi5vdmVycmlkZU1ldGhvZHNQcm9tcHQnOiB7XG4gICAgICAgIGxhYmVsOiAnU2VsZWN0IG1ldGhvZHMgdG8gb3ZlcnJpZGUgb3IgaW1wbGVtZW50JyxcbiAgICAgICAgc3RhdHVzOiAnamF2YS5hY3Rpb24ubGlzdE92ZXJyaWRhYmxlTWV0aG9kcycsXG4gICAgICAgIGdlbmVyYXRlOiAnamF2YS5hY3Rpb24uYWRkT3ZlcnJpZGFibGVNZXRob2RzJyxcbiAgICAgICAgbWVtYmVyczogKHMpID0+IChzPy5tZXRob2RzID8/IFtdKS5tYXAoKG06IGFueSkgPT4gKHtcbiAgICAgICAgICAgIGxhYmVsOiBgJHttLm5hbWV9KCR7KG0ucGFyYW1ldGVycyA/PyBbXSkuam9pbignLCAnKX0pJHttLmRlY2xhcmluZ0NsYXNzID8gJyA6ICcgKyBtLmRlY2xhcmluZ0NsYXNzIDogJyd9YCxcbiAgICAgICAgICAgIHJlZjogbSxcbiAgICAgICAgfSkpLFxuICAgICAgICBidWlsZEFyZ3M6IChhcmdzLCBzdGF0dXMsIHNlbCkgPT4gW2FyZ3NbMF0sIHsgb3ZlcnJpZGFibGVNZXRob2RzOiBzZWwubWFwKG0gPT4gbS5yZWYpLCB0eXBlOiBzdGF0dXM/LnR5cGUgfV0sXG4gICAgfSxcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1bkdlbmVyYXRlKHByb21wdElkOiBzdHJpbmcsIGFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFfY29ubikgcmV0dXJuO1xuICAgIGNvbnN0IHNwZWMgPSBHRU5FUkFURVtwcm9tcHRJZF07XG4gICAgY29uc3Qgc3RhdHVzID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3dvcmtzcGFjZS9leGVjdXRlQ29tbWFuZCcsIHsgY29tbWFuZDogc3BlYy5zdGF0dXMsIGFyZ3VtZW50czogYXJncyB9KTtcbiAgICBpZiAoIXN0YXR1cykgcmV0dXJuO1xuICAgIGNvbnN0IG1lbWJlcnMgPSBzcGVjLm1lbWJlcnMoc3RhdHVzKTtcbiAgICBsZXQgc2VsZWN0ZWQgPSBtZW1iZXJzO1xuICAgIGNvbnN0IHBpY2tlciA9IChnbG9iYWxUaGlzIGFzIGFueSkuamF2YUxzcE1lbWJlclBpY2tlcjtcbiAgICBpZiAobWVtYmVycy5sZW5ndGggJiYgdHlwZW9mIHBpY2tlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjb25zdCBjaG9zZW46IHN0cmluZ1tdIHwgbnVsbCA9IGF3YWl0IHBpY2tlcihzcGVjLmxhYmVsLCBtZW1iZXJzLm1hcChtID0+IG0ubGFiZWwpKTtcbiAgICAgICAgaWYgKGNob3NlbiA9PT0gbnVsbCkgcmV0dXJuOyAvLyB1c2VyIGNhbmNlbGxlZCB0aGUgZGlhbG9nXG4gICAgICAgIHNlbGVjdGVkID0gbWVtYmVycy5maWx0ZXIobSA9PiBjaG9zZW4uaW5jbHVkZXMobS5sYWJlbCkpO1xuICAgIH1cbiAgICBjb25zdCBlZGl0ID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3dvcmtzcGFjZS9leGVjdXRlQ29tbWFuZCcsIHtcbiAgICAgICAgY29tbWFuZDogc3BlYy5nZW5lcmF0ZSxcbiAgICAgICAgYXJndW1lbnRzOiBzcGVjLmJ1aWxkQXJncyhhcmdzLCBzdGF0dXMsIHNlbGVjdGVkKSxcbiAgICB9KTtcbiAgICBpZiAoaXNXb3Jrc3BhY2VFZGl0KGVkaXQpKSBhcHBseVdvcmtzcGFjZUVkaXQoZWRpdCk7XG59XG5cbi8qKiBHcm91cHMgYSB3b3Jrc3BhY2UgZWRpdCdzIHRleHQgZWRpdHMgYnkgZG9jdW1lbnQgYW5kIGFwcGxpZXMgdGhlbSBpbiBwbGFjZSB0byBvcGVuIE1vbmFjbyBtb2RlbHMuICovXG5mdW5jdGlvbiBhcHBseVdvcmtzcGFjZUVkaXQoZWRpdDogV29ya3NwYWNlRWRpdCB8IG51bGwgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBpZiAoIWVkaXQpIHJldHVybjtcbiAgICBjb25zdCBieVVyaTogUmVjb3JkPHN0cmluZywgVGV4dEVkaXRbXT4gPSB7fTtcbiAgICBpZiAoZWRpdC5jaGFuZ2VzKSB7XG4gICAgICAgIGZvciAoY29uc3QgdXJpIGluIGVkaXQuY2hhbmdlcykgYnlVcmlbdXJpXSA9IChieVVyaVt1cmldID8/IFtdKS5jb25jYXQoZWRpdC5jaGFuZ2VzW3VyaV0pO1xuICAgIH1cbiAgICBpZiAoZWRpdC5kb2N1bWVudENoYW5nZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBkYyBvZiBlZGl0LmRvY3VtZW50Q2hhbmdlcyBhcyBhbnlbXSkge1xuICAgICAgICAgICAgaWYgKGRjPy50ZXh0RG9jdW1lbnQ/LnVyaSAmJiBBcnJheS5pc0FycmF5KGRjLmVkaXRzKSkge1xuICAgICAgICAgICAgICAgIGJ5VXJpW2RjLnRleHREb2N1bWVudC51cmldID0gKGJ5VXJpW2RjLnRleHREb2N1bWVudC51cmldID8/IFtdKS5jb25jYXQoZGMuZWRpdHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgdXJpIGluIGJ5VXJpKSB7XG4gICAgICAgIGNvbnN0IG1vZGVsID0gbW9uYWNvLmVkaXRvci5nZXRNb2RlbHMoKS5maW5kKG0gPT4gbS51cmkudG9TdHJpbmcoKSA9PT0gdXJpKTtcbiAgICAgICAgaWYgKCFtb2RlbCkgY29udGludWU7XG4gICAgICAgIGNvbnN0IG9wcyA9IGJ5VXJpW3VyaV0ubWFwKGUgPT4gKHsgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28oZS5yYW5nZSksIHRleHQ6IGUubmV3VGV4dCwgZm9yY2VNb3ZlTWFya2VyczogdHJ1ZSB9KSk7XG4gICAgICAgIG1vZGVsLnB1c2hFZGl0T3BlcmF0aW9ucyhbXSwgb3BzLCAoKSA9PiBudWxsKTtcbiAgICB9XG59XG5cbi8qKiBDb252ZXJ0cyBhbiBMU1Agd29ya3NwYWNlIGVkaXQgaW50byB0aGUgTW9uYWNvIHNoYXBlIHJldHVybmVkIGJ5IHRoZSByZW5hbWUgcHJvdmlkZXIuICovXG5mdW5jdGlvbiB3b3Jrc3BhY2VFZGl0VG9Nb25hY28oZWRpdDogV29ya3NwYWNlRWRpdCB8IG51bGwpOiBtb25hY28ubGFuZ3VhZ2VzLldvcmtzcGFjZUVkaXQge1xuICAgIGNvbnN0IGVkaXRzOiBhbnlbXSA9IFtdO1xuICAgIGNvbnN0IHB1c2ggPSAodXJpOiBzdHJpbmcsIGxpc3Q6IFRleHRFZGl0W10pID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBlIG9mIGxpc3QpIHtcbiAgICAgICAgICAgIGVkaXRzLnB1c2goeyByZXNvdXJjZTogbW9uYWNvLlVyaS5wYXJzZSh1cmkpLCB0ZXh0RWRpdDogeyByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhlLnJhbmdlKSwgdGV4dDogZS5uZXdUZXh0IH0sIHZlcnNpb25JZDogdW5kZWZpbmVkIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBpZiAoZWRpdD8uY2hhbmdlcykge1xuICAgICAgICBmb3IgKGNvbnN0IHVyaSBpbiBlZGl0LmNoYW5nZXMpIHB1c2godXJpLCBlZGl0LmNoYW5nZXNbdXJpXSk7XG4gICAgfVxuICAgIGlmIChlZGl0Py5kb2N1bWVudENoYW5nZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBkYyBvZiBlZGl0LmRvY3VtZW50Q2hhbmdlcyBhcyBhbnlbXSkge1xuICAgICAgICAgICAgaWYgKGRjPy50ZXh0RG9jdW1lbnQ/LnVyaSAmJiBBcnJheS5pc0FycmF5KGRjLmVkaXRzKSkgcHVzaChkYy50ZXh0RG9jdW1lbnQudXJpLCBkYy5lZGl0cyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgZWRpdHMgfTtcbn1cblxuLyoqIE1hcHMgYSB2aXJ0dWFsIGVkaXRvciBVUkkgYmFjayB0byB0aGUgSURFIHdvcmtzcGFjZSBwYXRoICh7QGNvZGUgL3dzL3Byb2ovLi4ufSkuICovXG5mdW5jdGlvbiB1cmlUb1dvcmtzcGFjZVBhdGgodXJpOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoIXVyaS5zdGFydHNXaXRoKFZJUlRVQUxfRklMRV9QUkVGSVgpKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHVyaS5zdWJzdHJpbmcoVklSVFVBTF9GSUxFX1BSRUZJWC5sZW5ndGgpKTtcbn1cblxuLyoqIFJlYWRzIGEgd29ya3NwYWNlIGZpbGUncyBjdXJyZW50IHRleHQgb3ZlciB0aGUgSURFIFJFU1QgQVBJLiAqL1xuYXN5bmMgZnVuY3Rpb24gZmV0Y2hXb3Jrc3BhY2VGaWxlVGV4dChpZGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9zZXJ2aWNlcy9pZGUvd29ya3NwYWNlcycgKyBpZGVQYXRoLCB7IGhlYWRlcnM6IHsgJ1gtUmVxdWVzdGVkLVdpdGgnOiAnRmV0Y2gnIH0gfSk7XG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCByZWFkICR7aWRlUGF0aH0gKEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9KWApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzcG9uc2UudGV4dCgpO1xufVxuXG4vKiogQXBwbGllcyBMU1AgdGV4dCBlZGl0cyB0byBhIHN0cmluZy4gT2Zmc2V0cyBhcmUgcmVzb2x2ZWQgYWdhaW5zdCB0aGUgb3JpZ2luYWwgdGV4dCBhbmQgZWRpdHMgYXJlXG4gKiAgYXBwbGllZCBmcm9tIHRoZSBlbmQgYmFja3dhcmRzLCBzbyBlYXJsaWVyIG9mZnNldHMgc3RheSB2YWxpZC4gKi9cbmZ1bmN0aW9uIGFwcGx5RWRpdHNUb1RleHQodGV4dDogc3RyaW5nLCBlZGl0czogVGV4dEVkaXRbXSk6IHN0cmluZyB7XG4gICAgY29uc3QgbGluZVN0YXJ0cyA9IFswXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHRleHQuY2hhckNvZGVBdChpKSA9PT0gMTAgLyogXFxuICovKSBsaW5lU3RhcnRzLnB1c2goaSArIDEpO1xuICAgIH1cbiAgICBjb25zdCBvZmZzZXQgPSAocDogeyBsaW5lOiBudW1iZXI7IGNoYXJhY3RlcjogbnVtYmVyIH0pID0+IChsaW5lU3RhcnRzW3AubGluZV0gPz8gdGV4dC5sZW5ndGgpICsgcC5jaGFyYWN0ZXI7XG4gICAgY29uc3Qgb3JkZXJlZCA9IGVkaXRzLnNsaWNlKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gb2Zmc2V0KGIucmFuZ2Uuc3RhcnQpIC0gb2Zmc2V0KGEucmFuZ2Uuc3RhcnQpKTtcbiAgICBsZXQgcmVzdWx0ID0gdGV4dDtcbiAgICBmb3IgKGNvbnN0IGUgb2Ygb3JkZXJlZCkge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQuc2xpY2UoMCwgb2Zmc2V0KGUucmFuZ2Uuc3RhcnQpKSArIGUubmV3VGV4dCArIHJlc3VsdC5zbGljZShvZmZzZXQoZS5yYW5nZS5lbmQpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBBcHBsaWVzIGEgSkRULkxTIHJlbmFtZSB7QGxpbmsgV29ya3NwYWNlRWRpdH0gYWNyb3NzIHRoZSB3aG9sZSB3b3Jrc3BhY2U6IHRleHQgZWRpdHMgaW4gZXZlcnlcbiAqIGFmZmVjdGVkIGZpbGUgcGx1cyBhbnkge0Bjb2RlIFJlbmFtZUZpbGV9IG9wZXJhdGlvbiAoYSBwdWJsaWMtdHlwZSByZW5hbWUgcmVuYW1lcyBpdHMgb3duXG4gKiB7QGNvZGUgLmphdmF9IGZpbGUpLiBUaGUgY3VycmVudCBmaWxlJ3MgZWRpdHMgZ28gdGhyb3VnaCB0aGUgbGl2ZSBNb25hY28gbW9kZWw7IHRoZSByZXN0IGFyZSByZWFkLFxuICogZWRpdGVkIGFuZCB3cml0dGVuIGJhY2sgb3ZlciBSRVNULiBQZXJzaXN0ZW5jZSAoQ1NSRi1ndWFyZGVkIHdyaXRlcywgdGhlIHRhYiBzd2l0Y2ggd2hlbiB0aGUgY3VycmVudFxuICogZmlsZSBpcyByZW5hbWVkLCBhbmQgcmVsb2FkaW5nIG90aGVyIG9wZW4gZWRpdG9ycykgaXMgZGVsZWdhdGVkIHRvIHRoZSBJREUgdmlhIGphdmFMc3BQZXJzaXN0UmVuYW1lLlxuICovXG5hc3luYyBmdW5jdGlvbiBhcHBseVJlbmFtZUFjcm9zc1dvcmtzcGFjZShtb2RlbDogbW9uYWNvLmVkaXRvci5JVGV4dE1vZGVsLCBlZGl0OiBXb3Jrc3BhY2VFZGl0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY3VycmVudFVyaSA9IG1vZGVsLnVyaS50b1N0cmluZygpO1xuICAgIGNvbnN0IHRleHRCeVVyaTogUmVjb3JkPHN0cmluZywgVGV4dEVkaXRbXT4gPSB7fTtcbiAgICBjb25zdCByZW5hbWVCeVVyaTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gICAgaWYgKGVkaXQuY2hhbmdlcykge1xuICAgICAgICBmb3IgKGNvbnN0IHVyaSBpbiBlZGl0LmNoYW5nZXMpIHRleHRCeVVyaVt1cmldID0gKHRleHRCeVVyaVt1cmldID8/IFtdKS5jb25jYXQoZWRpdC5jaGFuZ2VzW3VyaV0pO1xuICAgIH1cbiAgICBpZiAoZWRpdC5kb2N1bWVudENoYW5nZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBkYyBvZiBlZGl0LmRvY3VtZW50Q2hhbmdlcyBhcyBhbnlbXSkge1xuICAgICAgICAgICAgaWYgKGRjPy5raW5kID09PSAncmVuYW1lJyAmJiBkYy5vbGRVcmkgJiYgZGMubmV3VXJpKSB7XG4gICAgICAgICAgICAgICAgcmVuYW1lQnlVcmlbZGMub2xkVXJpXSA9IGRjLm5ld1VyaTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGM/LnRleHREb2N1bWVudD8udXJpICYmIEFycmF5LmlzQXJyYXkoZGMuZWRpdHMpKSB7XG4gICAgICAgICAgICAgICAgdGV4dEJ5VXJpW2RjLnRleHREb2N1bWVudC51cmldID0gKHRleHRCeVVyaVtkYy50ZXh0RG9jdW1lbnQudXJpXSA/PyBbXSkuY29uY2F0KGRjLmVkaXRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNvbnN0IHBheWxvYWQ6IHtcbiAgICAgICAgY3VycmVudFBhdGg6IHN0cmluZyB8IG51bGw7XG4gICAgICAgIGN1cnJlbnRDb250ZW50OiBzdHJpbmcgfCBudWxsO1xuICAgICAgICBjdXJyZW50TmV3UGF0aDogc3RyaW5nIHwgbnVsbDtcbiAgICAgICAgd3JpdGVzOiBBcnJheTx7IHBhdGg6IHN0cmluZyB8IG51bGw7IGNvbnRlbnQ6IHN0cmluZyB9PjtcbiAgICAgICAgcmVuYW1lczogQXJyYXk8eyBvbGRQYXRoOiBzdHJpbmcgfCBudWxsOyBuZXdQYXRoOiBzdHJpbmcgfCBudWxsOyBjb250ZW50OiBzdHJpbmcgfT47XG4gICAgfSA9IHsgY3VycmVudFBhdGg6IHVyaVRvV29ya3NwYWNlUGF0aChjdXJyZW50VXJpKSwgY3VycmVudENvbnRlbnQ6IG51bGwsIGN1cnJlbnROZXdQYXRoOiBudWxsLCB3cml0ZXM6IFtdLCByZW5hbWVzOiBbXSB9O1xuXG4gICAgY29uc3QgdXJpcyA9IG5ldyBTZXQ8c3RyaW5nPihbLi4uT2JqZWN0LmtleXModGV4dEJ5VXJpKSwgLi4uT2JqZWN0LmtleXMocmVuYW1lQnlVcmkpXSk7XG4gICAgZm9yIChjb25zdCB1cmkgb2YgdXJpcykge1xuICAgICAgICBjb25zdCBlZGl0cyA9IHRleHRCeVVyaVt1cmldID8/IFtdO1xuICAgICAgICBsZXQgY29udGVudDogc3RyaW5nO1xuICAgICAgICBpZiAodXJpID09PSBjdXJyZW50VXJpKSB7XG4gICAgICAgICAgICBpZiAoZWRpdHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbW9kZWwucHVzaEVkaXRPcGVyYXRpb25zKFtdLCBlZGl0cy5tYXAoZSA9PiAoeyByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhlLnJhbmdlKSwgdGV4dDogZS5uZXdUZXh0LCBmb3JjZU1vdmVNYXJrZXJzOiB0cnVlIH0pKSwgKCkgPT4gbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250ZW50ID0gbW9kZWwuZ2V0VmFsdWUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IGF3YWl0IGZldGNoV29ya3NwYWNlRmlsZVRleHQodXJpVG9Xb3Jrc3BhY2VQYXRoKHVyaSkgPz8gdXJpKTtcbiAgICAgICAgICAgIGNvbnRlbnQgPSBlZGl0cy5sZW5ndGggPyBhcHBseUVkaXRzVG9UZXh0KHNvdXJjZSwgZWRpdHMpIDogc291cmNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld1VyaSA9IHJlbmFtZUJ5VXJpW3VyaV07XG4gICAgICAgIGlmICh1cmkgPT09IGN1cnJlbnRVcmkpIHtcbiAgICAgICAgICAgIHBheWxvYWQuY3VycmVudENvbnRlbnQgPSBjb250ZW50O1xuICAgICAgICAgICAgcGF5bG9hZC5jdXJyZW50TmV3UGF0aCA9IG5ld1VyaSA/IHVyaVRvV29ya3NwYWNlUGF0aChuZXdVcmkpIDogbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmIChuZXdVcmkpIHtcbiAgICAgICAgICAgIHBheWxvYWQucmVuYW1lcy5wdXNoKHsgb2xkUGF0aDogdXJpVG9Xb3Jrc3BhY2VQYXRoKHVyaSksIG5ld1BhdGg6IHVyaVRvV29ya3NwYWNlUGF0aChuZXdVcmkpLCBjb250ZW50IH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGF5bG9hZC53cml0ZXMucHVzaCh7IHBhdGg6IHVyaVRvV29ya3NwYWNlUGF0aCh1cmkpLCBjb250ZW50IH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgKGdsb2JhbFRoaXMgYXMgYW55KS5qYXZhTHNwUGVyc2lzdFJlbmFtZShwYXlsb2FkKTtcbn1cblxuZnVuY3Rpb24gamR0bHNTZXR0aW5ncygpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBqYXZhOiB7XG4gICAgICAgICAgICBpbXBvcnQ6IHtcbiAgICAgICAgICAgICAgICBtYXZlbjogICAgICB7IGVuYWJsZWQ6IHRydWUgfSxcbiAgICAgICAgICAgICAgICBncmFkbGU6ICAgICB7IGVuYWJsZWQ6IGZhbHNlIH0sXG4gICAgICAgICAgICAgICAgZXhjbHVzaW9uczogWycqKi9ub2RlX21vZHVsZXMvKionLCAnKiovLm1ldGFkYXRhLyoqJywgJyoqL2FyY2hldHlwZS1yZXNvdXJjZXMvKionXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBhdXRvYnVpbGQ6IHsgZW5hYmxlZDogdHJ1ZSB9LFxuICAgICAgICAgICAgY29tcGxldGlvbjoge1xuICAgICAgICAgICAgICAgIG92ZXJ3cml0ZTogICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgIGd1ZXNzTWV0aG9kQXJndW1lbnRzOiBmYWxzZSxcbiAgICAgICAgICAgICAgICBmaWx0ZXJlZFR5cGVzOiBbXG4gICAgICAgICAgICAgICAgICAgICdjb20uc3VuLionLCAnc3VuLionLCAnamRrLionLFxuICAgICAgICAgICAgICAgICAgICAnb3JnLmVjbGlwc2UuamR0LmludGVybmFsLionLFxuICAgICAgICAgICAgICAgICAgICAnb3JnLmVjbGlwc2UuY29yZS5pbnRlcm5hbC4qJyxcbiAgICAgICAgICAgICAgICAgICAgJ29yZy5lY2xpcHNlLm9zZ2kuaW50ZXJuYWwuKicsXG4gICAgICAgICAgICAgICAgXSxcbiAgICAgICAgICAgICAgICBpbXBvcnRPcmRlcjogWydqYXZhJywgJ2phdmF4JywgJ29yZycsICdjb20nLCAnJ10sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgc2lnbmF0dXJlSGVscDogIHsgZW5hYmxlZDogdHJ1ZSB9LFxuICAgICAgICAgICAgZm9ybWF0OiAgICAgICAgIHsgZW5hYmxlZDogdHJ1ZSB9LFxuICAgICAgICAgICAgc2F2ZUFjdGlvbnM6ICAgIHsgb3JnYW5pemVJbXBvcnRzOiBmYWxzZSB9LFxuICAgICAgICAgICAgaW5sYXlIaW50czogICAgIHsgcGFyYW1ldGVyTmFtZXM6IHsgZW5hYmxlZDogJ2FsbCcgfSB9LFxuICAgICAgICAgICAgcmVmZXJlbmNlc0NvZGVMZW5zOiAgICAgeyBlbmFibGVkOiB0cnVlIH0sXG4gICAgICAgICAgICBpbXBsZW1lbnRhdGlvbnNDb2RlTGVuczogeyBlbmFibGVkOiB0cnVlIH0sXG4gICAgICAgIH0sXG4gICAgfTtcbn1cbiIsICIvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSAyMDI0IFR5cGVGb3ggYW5kIG90aGVycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExJQ0VOU0UgaW4gdGhlIHBhY2thZ2Ugcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5pbXBvcnQgeyBEaXNwb3NhYmxlIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuXG5leHBvcnQgY2xhc3MgRGlzcG9zYWJsZUNvbGxlY3Rpb24gaW1wbGVtZW50cyBEaXNwb3NhYmxlIHtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZGlzcG9zYWJsZXM6IERpc3Bvc2FibGVbXSA9IFtdO1xuXG4gICAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICAgICAgd2hpbGUgKHRoaXMuZGlzcG9zYWJsZXMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmRpc3Bvc2FibGVzLnBvcCgpIS5kaXNwb3NlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwdXNoKGRpc3Bvc2FibGU6IERpc3Bvc2FibGUpOiBEaXNwb3NhYmxlIHtcbiAgICAgICAgY29uc3QgZGlzcG9zYWJsZXMgPSB0aGlzLmRpc3Bvc2FibGVzO1xuICAgICAgICBkaXNwb3NhYmxlcy5wdXNoKGRpc3Bvc2FibGUpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGlzcG9zZSgpOiB2b2lkIHtcbiAgICAgICAgICAgICAgICBjb25zdCBpbmRleCA9IGRpc3Bvc2FibGVzLmluZGV4T2YoZGlzcG9zYWJsZSk7XG4gICAgICAgICAgICAgICAgaWYgKGluZGV4ICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlcy5zcGxpY2UoaW5kZXgsIDEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG59XG4iLCAiLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgMjAyNCBUeXBlRm94IGFuZCBvdGhlcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMSUNFTlNFIGluIHRoZSBwYWNrYWdlIHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuaW1wb3J0IHsgRGlzcG9zYWJsZSB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcbmltcG9ydCB0eXBlIHsgSUNvbm5lY3Rpb24gfSBmcm9tICcuLi9zZXJ2ZXIvY29ubmVjdGlvbi5qcyc7XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVdlYlNvY2tldCBleHRlbmRzIERpc3Bvc2FibGUge1xuICAgIHNlbmQoY29udGVudDogc3RyaW5nKTogdm9pZDtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIG9uTWVzc2FnZShjYjogKGRhdGE6IGFueSkgPT4gdm9pZCk6IHZvaWQ7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBvbkVycm9yKGNiOiAocmVhc29uOiBhbnkpID0+IHZvaWQpOiB2b2lkO1xuICAgIG9uQ2xvc2UoY2I6IChjb2RlOiBudW1iZXIsIHJlYXNvbjogc3RyaW5nKSA9PiB2b2lkKTogdm9pZDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBJV2ViU29ja2V0Q29ubmVjdGlvbiBleHRlbmRzIElDb25uZWN0aW9uIHtcbiAgICByZWFkb25seSBzb2NrZXQ6IElXZWJTb2NrZXQ7XG59XG4iLCAiLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgMjAyNCBUeXBlRm94IGFuZCBvdGhlcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMSUNFTlNFIGluIHRoZSBwYWNrYWdlIHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuaW1wb3J0IHsgRGlzcG9zYWJsZSB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcbi8vIFRPRE86IFVzZSBlbnZpcm9ubWVudC1zcGVjaWZpYyBpbXBvcnRzICh2c2NvZGUtanNvbnJwYy9icm93c2VyIG9yIHZzY29kZS1qc29ucnBjL25vZGUpXG4vLyB3aGVuIHVwZ3JhZGluZyB0byB2c2NvZGUtanNvbnJwY0A5LngueC1uZXh0Llggd2hpY2ggc3VwcG9ydHMgcHJvcGVyIGV4cG9ydCBtYXBzXG5pbXBvcnQgeyB0eXBlIERhdGFDYWxsYmFjaywgQWJzdHJhY3RNZXNzYWdlUmVhZGVyLCBNZXNzYWdlUmVhZGVyIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuaW1wb3J0IHR5cGUgeyBJV2ViU29ja2V0IH0gZnJvbSAnLi9zb2NrZXQuanMnO1xuXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0TWVzc2FnZVJlYWRlciBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVJlYWRlciBpbXBsZW1lbnRzIE1lc3NhZ2VSZWFkZXIge1xuICAgIHByb3RlY3RlZCByZWFkb25seSBzb2NrZXQ6IElXZWJTb2NrZXQ7XG4gICAgcHJvdGVjdGVkIHN0YXRlOiAnaW5pdGlhbCcgfCAnbGlzdGVuaW5nJyB8ICdjbG9zZWQnID0gJ2luaXRpYWwnO1xuICAgIHByb3RlY3RlZCBjYWxsYmFjazogRGF0YUNhbGxiYWNrIHwgdW5kZWZpbmVkO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGV2ZW50czogQXJyYXk8eyBtZXNzYWdlPzogYW55LCBlcnJvcj86IGFueSB9PiA9IFtdO1xuXG4gICAgY29uc3RydWN0b3Ioc29ja2V0OiBJV2ViU29ja2V0KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuc29ja2V0ID0gc29ja2V0O1xuICAgICAgICB0aGlzLnNvY2tldC5vbk1lc3NhZ2UobWVzc2FnZSA9PlxuICAgICAgICAgICAgdGhpcy5yZWFkTWVzc2FnZShtZXNzYWdlKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLnNvY2tldC5vbkVycm9yKGVycm9yID0+XG4gICAgICAgICAgICB0aGlzLmZpcmVFcnJvcihlcnJvcilcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zb2NrZXQub25DbG9zZSgoY29kZSwgcmVhc29uKSA9PiB7XG4gICAgICAgICAgICBpZiAoY29kZSAhPT0gMTAwMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yOiBFcnJvciA9IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJycgKyBjb2RlLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgRXJyb3IgZHVyaW5nIHNvY2tldCByZWNvbm5lY3Q6IGNvZGUgPSAke2NvZGV9LCByZWFzb24gPSAke3JlYXNvbn1gXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmVFcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmZpcmVDbG9zZSgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBsaXN0ZW4oY2FsbGJhY2s6IERhdGFDYWxsYmFjayk6IERpc3Bvc2FibGUge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gJ2luaXRpYWwnKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gJ2xpc3RlbmluZyc7XG4gICAgICAgICAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7XG4gICAgICAgICAgICB3aGlsZSAodGhpcy5ldmVudHMubGVuZ3RoICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXZlbnQgPSB0aGlzLmV2ZW50cy5wb3AoKSE7XG4gICAgICAgICAgICAgICAgaWYgKGV2ZW50Lm1lc3NhZ2UgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJlYWRNZXNzYWdlKGV2ZW50Lm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZXZlbnQuZXJyb3IgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmVFcnJvcihldmVudC5lcnJvcik7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlQ2xvc2UoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5jYWxsYmFjayA9PT0gY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9ICdpbml0aWFsJztcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjayA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgb3ZlcnJpZGUgZGlzcG9zZSgpIHtcbiAgICAgICAgc3VwZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLnN0YXRlID0gJ2luaXRpYWwnO1xuICAgICAgICB0aGlzLmNhbGxiYWNrID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLmV2ZW50cy5zcGxpY2UoMCwgdGhpcy5ldmVudHMubGVuZ3RoKTtcbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHByb3RlY3RlZCByZWFkTWVzc2FnZShtZXNzYWdlOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09ICdpbml0aWFsJykge1xuICAgICAgICAgICAgdGhpcy5ldmVudHMuc3BsaWNlKDAsIDAsIHsgbWVzc2FnZSB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlID09PSAnbGlzdGVuaW5nJykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBjb25zdCBkYXRhID0gSlNPTi5wYXJzZShtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmNhbGxiYWNrIShkYXRhKTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yOiBFcnJvciA9IHtcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogJycgKyA0MDAsXG4gICAgICAgICAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBFcnJvciBkdXJpbmcgbWVzc2FnZSBwYXJzaW5nLCByZWFzb24gPSAke3R5cGVvZiBlcnIgPT09ICdvYmplY3QnID8gKGVyciBhcyBhbnkpLm1lc3NhZ2UgOiAndW5rbm93bid9YFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZmlyZUVycm9yKGVycm9yOiBhbnkpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09ICdpbml0aWFsJykge1xuICAgICAgICAgICAgdGhpcy5ldmVudHMuc3BsaWNlKDAsIDAsIHsgZXJyb3IgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZSA9PT0gJ2xpc3RlbmluZycpIHtcbiAgICAgICAgICAgIHN1cGVyLmZpcmVFcnJvcihlcnJvcik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgZmlyZUNsb3NlKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gJ2luaXRpYWwnKSB7XG4gICAgICAgICAgICB0aGlzLmV2ZW50cy5zcGxpY2UoMCwgMCwge30pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUgPT09ICdsaXN0ZW5pbmcnKSB7XG4gICAgICAgICAgICBzdXBlci5maXJlQ2xvc2UoKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnN0YXRlID0gJ2Nsb3NlZCc7XG4gICAgfVxufVxuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjQgVHlwZUZveCBhbmQgb3RoZXJzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTElDRU5TRSBpbiB0aGUgcGFja2FnZSByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbmltcG9ydCB7IE1lc3NhZ2UgfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG5pbXBvcnQgeyBBYnN0cmFjdE1lc3NhZ2VXcml0ZXIsIE1lc3NhZ2VXcml0ZXIgfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG5pbXBvcnQgdHlwZSB7IElXZWJTb2NrZXQgfSBmcm9tICcuL3NvY2tldC5qcyc7XG5cbmV4cG9ydCBjbGFzcyBXZWJTb2NrZXRNZXNzYWdlV3JpdGVyIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlV3JpdGVyIGltcGxlbWVudHMgTWVzc2FnZVdyaXRlciB7XG4gICAgcHJvdGVjdGVkIGVycm9yQ291bnQgPSAwO1xuICAgIHByb3RlY3RlZCByZWFkb25seSBzb2NrZXQ6IElXZWJTb2NrZXQ7XG5cbiAgICBjb25zdHJ1Y3Rvcihzb2NrZXQ6IElXZWJTb2NrZXQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7XG4gICAgfVxuXG4gICAgZW5kKCk6IHZvaWQge1xuICAgIH1cblxuICAgIGFzeW5jIHdyaXRlKG1zZzogTWVzc2FnZSk6IFByb21pc2U8dm9pZD4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgY29udGVudCA9IEpTT04uc3RyaW5naWZ5KG1zZyk7XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKGNvbnRlbnQpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB0aGlzLmVycm9yQ291bnQrKztcbiAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGUsIG1zZywgdGhpcy5lcnJvckNvdW50KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsICIvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSAyMDI0IFR5cGVGb3ggYW5kIG90aGVycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExJQ0VOU0UgaW4gdGhlIHBhY2thZ2Ugcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5pbXBvcnQgdHlwZSB7IE1lc3NhZ2VDb25uZWN0aW9uLCBMb2dnZXIgfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG5pbXBvcnQgeyBjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcbmltcG9ydCB0eXBlIHsgSVdlYlNvY2tldCB9IGZyb20gJy4vc29ja2V0LmpzJztcbmltcG9ydCB7IFdlYlNvY2tldE1lc3NhZ2VSZWFkZXIgfSBmcm9tICcuL3JlYWRlci5qcyc7XG5pbXBvcnQgeyBXZWJTb2NrZXRNZXNzYWdlV3JpdGVyIH0gZnJvbSAnLi93cml0ZXIuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlV2ViU29ja2V0Q29ubmVjdGlvbihzb2NrZXQ6IElXZWJTb2NrZXQsIGxvZ2dlcjogTG9nZ2VyKTogTWVzc2FnZUNvbm5lY3Rpb24ge1xuICAgIGNvbnN0IG1lc3NhZ2VSZWFkZXIgPSBuZXcgV2ViU29ja2V0TWVzc2FnZVJlYWRlcihzb2NrZXQpO1xuICAgIGNvbnN0IG1lc3NhZ2VXcml0ZXIgPSBuZXcgV2ViU29ja2V0TWVzc2FnZVdyaXRlcihzb2NrZXQpO1xuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbihtZXNzYWdlUmVhZGVyLCBtZXNzYWdlV3JpdGVyLCBsb2dnZXIpO1xuICAgIGNvbm5lY3Rpb24ub25DbG9zZSgoKSA9PiBjb25uZWN0aW9uLmRpc3Bvc2UoKSk7XG4gICAgcmV0dXJuIGNvbm5lY3Rpb247XG59XG4iLCAiLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgMjAyNCBUeXBlRm94IGFuZCBvdGhlcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMSUNFTlNFIGluIHRoZSBwYWNrYWdlIHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuaW1wb3J0IHR5cGUgeyBNZXNzYWdlQ29ubmVjdGlvbiwgTG9nZ2VyIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuaW1wb3J0IHsgY3JlYXRlV2ViU29ja2V0Q29ubmVjdGlvbiB9IGZyb20gJy4vc29ja2V0L2Nvbm5lY3Rpb24uanMnO1xuaW1wb3J0IHR5cGUgeyBJV2ViU29ja2V0IH0gZnJvbSAnLi9zb2NrZXQvc29ja2V0LmpzJztcbmltcG9ydCB7IENvbnNvbGVMb2dnZXIgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBsaXN0ZW4ob3B0aW9uczoge1xuICAgIHdlYlNvY2tldDogV2ViU29ja2V0O1xuICAgIGxvZ2dlcj86IExvZ2dlcjtcbiAgICBvbkNvbm5lY3Rpb246IChjb25uZWN0aW9uOiBNZXNzYWdlQ29ubmVjdGlvbikgPT4gdm9pZDtcbn0pIHtcbiAgICBjb25zdCB7IHdlYlNvY2tldCwgb25Db25uZWN0aW9uIH0gPSBvcHRpb25zO1xuICAgIGNvbnN0IGxvZ2dlciA9IG9wdGlvbnMubG9nZ2VyIHx8IG5ldyBDb25zb2xlTG9nZ2VyKCk7XG4gICAgd2ViU29ja2V0Lm9ub3BlbiA9ICgpID0+IHtcbiAgICAgICAgY29uc3Qgc29ja2V0ID0gdG9Tb2NrZXQod2ViU29ja2V0KTtcbiAgICAgICAgY29uc3QgY29ubmVjdGlvbiA9IGNyZWF0ZVdlYlNvY2tldENvbm5lY3Rpb24oc29ja2V0LCBsb2dnZXIpO1xuICAgICAgICBvbkNvbm5lY3Rpb24oY29ubmVjdGlvbik7XG4gICAgfTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHRvU29ja2V0KHdlYlNvY2tldDogV2ViU29ja2V0KTogSVdlYlNvY2tldCB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc2VuZDogY29udGVudCA9PiB3ZWJTb2NrZXQuc2VuZChjb250ZW50KSxcbiAgICAgICAgb25NZXNzYWdlOiBjYiA9PiB7XG4gICAgICAgICAgICB3ZWJTb2NrZXQub25tZXNzYWdlID0gZXZlbnQgPT4gY2IoZXZlbnQuZGF0YSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uRXJyb3I6IGNiID0+IHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgICAgICAgICB3ZWJTb2NrZXQub25lcnJvciA9IChldmVudDogYW55KSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5oYXNPd24oZXZlbnQsICdtZXNzYWdlJykpIHtcbiAgICAgICAgICAgICAgICAgICAgY2IoZXZlbnQubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgb25DbG9zZTogY2IgPT4ge1xuICAgICAgICAgICAgd2ViU29ja2V0Lm9uY2xvc2UgPSBldmVudCA9PiBjYihldmVudC5jb2RlLCBldmVudC5yZWFzb24pO1xuICAgICAgICB9LFxuICAgICAgICBkaXNwb3NlOiAoKSA9PiB3ZWJTb2NrZXQuY2xvc2UoKVxuICAgIH07XG59XG4iLCAiLypcbiAqIENvcHlyaWdodCAoYykgMjAxMC0yMDI2IEVjbGlwc2UgRGlyaWdpYmxlIGNvbnRyaWJ1dG9yc1xuICpcbiAqIEFsbCByaWdodHMgcmVzZXJ2ZWQuIFRoaXMgcHJvZ3JhbSBhbmQgdGhlIGFjY29tcGFueWluZyBtYXRlcmlhbHMgYXJlIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZVxuICogdGVybXMgb2YgdGhlIEVjbGlwc2UgUHVibGljIExpY2Vuc2UgdjIuMCB3aGljaCBhY2NvbXBhbmllcyB0aGlzIGRpc3RyaWJ1dGlvbiwgYW5kIGlzIGF2YWlsYWJsZSBhdFxuICogaHR0cDovL3d3dy5lY2xpcHNlLm9yZy9sZWdhbC9lcGwtdjIwLmh0bWxcbiAqXG4gKiBTUERYLUZpbGVDb3B5cmlnaHRUZXh0OiBFY2xpcHNlIERpcmlnaWJsZSBjb250cmlidXRvcnMgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEVQTC0yLjBcbiAqL1xuXG4vKipcbiAqIExhenkgUHJveHkgc2hpbSBmb3IgTW9uYWNvIEVkaXRvciBsb2FkZWQgdmlhIEFNRC5cbiAqXG4gKiBlZGl0b3IuanMgc2V0cyBnbG9iYWxUaGlzLm1vbmFjbyBpbnNpZGUgdGhlIEFNRCByZXF1aXJlKCkgY2FsbGJhY2ssIGJlZm9yZSBhbnlcbiAqIEphdmFMc3BDbGllbnRMaWIuY29ubmVjdCgpIGNhbGwuIEFsbCBwcm9wZXJ0eSBhY2Nlc3NlcyBnbyB0aHJvdWdoIFByb3h5LmdldCgpIHRyYXBzXG4gKiBzbyB0aGV5IHJlc29sdmUgYWdhaW5zdCB0aGUgbGl2ZSB3aW5kb3cubW9uYWNvIGF0IGNhbGwgdGltZSwgbm90IGF0IGJ1bmRsZSBsb2FkIHRpbWUuXG4gKlxuICogVHlwZVNjcmlwdCByZXNvbHZlcyB0eXBlcyBmcm9tIHRoZSByZWFsIG1vbmFjby1lZGl0b3IgZGV2RGVwZW5kZW5jeTsgZXNidWlsZCByZXBsYWNlc1xuICogdGhlIFwibW9uYWNvLWVkaXRvclwiIGltcG9ydCB3aXRoIHRoaXMgZmlsZSBhdCBidW5kbGUgdGltZSB2aWEgdGhlIGFsaWFzIG9wdGlvbi5cbiAqL1xuXG50eXBlIE0gPSB0eXBlb2YgaW1wb3J0KCdtb25hY28tZWRpdG9yJyk7XG5cbmZ1bmN0aW9uIG0oKTogTSB7XG4gICAgcmV0dXJuIChnbG9iYWxUaGlzIGFzIGFueSkubW9uYWNvIGFzIE07XG59XG5cbmZ1bmN0aW9uIG5zPFQgZXh0ZW5kcyBvYmplY3Q+KGdldHRlcjogKCkgPT4gVCk6IFQge1xuICAgIHJldHVybiBuZXcgUHJveHkoe30gYXMgVCwge1xuICAgICAgICBnZXQ6IChfLCBrKSA9PiAoZ2V0dGVyKCkgYXMgYW55KVtrIGFzIHN0cmluZ10sXG4gICAgfSk7XG59XG5cbmZ1bmN0aW9uIGNsczxUPihnZXR0ZXI6ICgpID0+IFQpOiBUIHtcbiAgICByZXR1cm4gbmV3IFByb3h5KGZ1bmN0aW9uICgpIHt9IGFzIGFueSwge1xuICAgICAgICBjb25zdHJ1Y3Q6IChfLCBhcmdzKSA9PiBuZXcgKGdldHRlcigpIGFzIGFueSkoLi4uYXJncyksXG4gICAgICAgIGdldDogICAgICAgKF8sIGspICAgID0+IChnZXR0ZXIoKSBhcyBhbnkpW2sgYXMgc3RyaW5nXSxcbiAgICB9KSBhcyBUO1xufVxuXG5leHBvcnQgY29uc3QgZWRpdG9yICAgICAgICAgPSBucygoKSA9PiBtKCkuZWRpdG9yKTtcbmV4cG9ydCBjb25zdCBsYW5ndWFnZXMgICAgICA9IG5zKCgpID0+IG0oKS5sYW5ndWFnZXMpO1xuZXhwb3J0IGNvbnN0IE1hcmtlclNldmVyaXR5ID0gbnMoKCkgPT4gbSgpLk1hcmtlclNldmVyaXR5KTtcbmV4cG9ydCBjb25zdCBNYXJrZXJUYWcgICAgICA9IG5zKCgpID0+IChtKCkgYXMgYW55KS5NYXJrZXJUYWcpO1xuZXhwb3J0IGNvbnN0IFVyaSAgICAgICAgICAgID0gY2xzKCgpID0+IG0oKS5VcmkpO1xuZXhwb3J0IGNvbnN0IFJhbmdlICAgICAgICAgID0gY2xzKCgpID0+IG0oKS5SYW5nZSk7XG5leHBvcnQgY29uc3QgUG9zaXRpb24gICAgICAgPSBjbHMoKCkgPT4gbSgpLlBvc2l0aW9uKTtcbmV4cG9ydCBjb25zdCBTZWxlY3Rpb24gICAgICA9IGNscygoKSA9PiBtKCkuU2VsZWN0aW9uKTtcbmV4cG9ydCBjb25zdCBLZXlDb2RlICAgICAgICA9IG5zKCgpID0+IG0oKS5LZXlDb2RlKTtcbmV4cG9ydCBjb25zdCBLZXlNb2QgICAgICAgICA9IG5zKCgpID0+IG0oKS5LZXlNb2QpO1xuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbid1c2Ugc3RyaWN0JztcbmV4cG9ydCB2YXIgRG9jdW1lbnRVcmk7XG4oZnVuY3Rpb24gKERvY3VtZW50VXJpKSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZyc7XG4gICAgfVxuICAgIERvY3VtZW50VXJpLmlzID0gaXM7XG59KShEb2N1bWVudFVyaSB8fCAoRG9jdW1lbnRVcmkgPSB7fSkpO1xuZXhwb3J0IHZhciBVUkk7XG4oZnVuY3Rpb24gKFVSSSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnO1xuICAgIH1cbiAgICBVUkkuaXMgPSBpcztcbn0pKFVSSSB8fCAoVVJJID0ge30pKTtcbmV4cG9ydCB2YXIgaW50ZWdlcjtcbihmdW5jdGlvbiAoaW50ZWdlcikge1xuICAgIGludGVnZXIuTUlOX1ZBTFVFID0gLTIxNDc0ODM2NDg7XG4gICAgaW50ZWdlci5NQVhfVkFMVUUgPSAyMTQ3NDgzNjQ3O1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIGludGVnZXIuTUlOX1ZBTFVFIDw9IHZhbHVlICYmIHZhbHVlIDw9IGludGVnZXIuTUFYX1ZBTFVFO1xuICAgIH1cbiAgICBpbnRlZ2VyLmlzID0gaXM7XG59KShpbnRlZ2VyIHx8IChpbnRlZ2VyID0ge30pKTtcbmV4cG9ydCB2YXIgdWludGVnZXI7XG4oZnVuY3Rpb24gKHVpbnRlZ2VyKSB7XG4gICAgdWludGVnZXIuTUlOX1ZBTFVFID0gMDtcbiAgICB1aW50ZWdlci5NQVhfVkFMVUUgPSAyMTQ3NDgzNjQ3O1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInICYmIHVpbnRlZ2VyLk1JTl9WQUxVRSA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSB1aW50ZWdlci5NQVhfVkFMVUU7XG4gICAgfVxuICAgIHVpbnRlZ2VyLmlzID0gaXM7XG59KSh1aW50ZWdlciB8fCAodWludGVnZXIgPSB7fSkpO1xuLyoqXG4gKiBUaGUgUG9zaXRpb24gbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgUG9zaXRpb259IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIFBvc2l0aW9uO1xuKGZ1bmN0aW9uIChQb3NpdGlvbikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgUG9zaXRpb24gbGl0ZXJhbCBmcm9tIHRoZSBnaXZlbiBsaW5lIGFuZCBjaGFyYWN0ZXIuXG4gICAgICogQHBhcmFtIGxpbmUgVGhlIHBvc2l0aW9uJ3MgbGluZS5cbiAgICAgKiBAcGFyYW0gY2hhcmFjdGVyIFRoZSBwb3NpdGlvbidzIGNoYXJhY3Rlci5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobGluZSwgY2hhcmFjdGVyKSB7XG4gICAgICAgIGlmIChsaW5lID09PSBOdW1iZXIuTUFYX1ZBTFVFKSB7XG4gICAgICAgICAgICBsaW5lID0gdWludGVnZXIuTUFYX1ZBTFVFO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFyYWN0ZXIgPT09IE51bWJlci5NQVhfVkFMVUUpIHtcbiAgICAgICAgICAgIGNoYXJhY3RlciA9IHVpbnRlZ2VyLk1BWF9WQUxVRTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyBsaW5lLCBjaGFyYWN0ZXIgfTtcbiAgICB9XG4gICAgUG9zaXRpb24uY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgUG9zaXRpb259IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgSXMudWludGVnZXIoY2FuZGlkYXRlLmxpbmUpICYmIElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS5jaGFyYWN0ZXIpO1xuICAgIH1cbiAgICBQb3NpdGlvbi5pcyA9IGlzO1xufSkoUG9zaXRpb24gfHwgKFBvc2l0aW9uID0ge30pKTtcbi8qKlxuICogVGhlIFJhbmdlIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIFJhbmdlfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBSYW5nZTtcbihmdW5jdGlvbiAoUmFuZ2UpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUob25lLCB0d28sIHRocmVlLCBmb3VyKSB7XG4gICAgICAgIGlmIChJcy51aW50ZWdlcihvbmUpICYmIElzLnVpbnRlZ2VyKHR3bykgJiYgSXMudWludGVnZXIodGhyZWUpICYmIElzLnVpbnRlZ2VyKGZvdXIpKSB7XG4gICAgICAgICAgICByZXR1cm4geyBzdGFydDogUG9zaXRpb24uY3JlYXRlKG9uZSwgdHdvKSwgZW5kOiBQb3NpdGlvbi5jcmVhdGUodGhyZWUsIGZvdXIpIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoUG9zaXRpb24uaXMob25lKSAmJiBQb3NpdGlvbi5pcyh0d28pKSB7XG4gICAgICAgICAgICByZXR1cm4geyBzdGFydDogb25lLCBlbmQ6IHR3byB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSYW5nZSNjcmVhdGUgY2FsbGVkIHdpdGggaW52YWxpZCBhcmd1bWVudHNbJHtvbmV9LCAke3R3b30sICR7dGhyZWV9LCAke2ZvdXJ9XWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIFJhbmdlLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIFJhbmdlfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIFBvc2l0aW9uLmlzKGNhbmRpZGF0ZS5zdGFydCkgJiYgUG9zaXRpb24uaXMoY2FuZGlkYXRlLmVuZCk7XG4gICAgfVxuICAgIFJhbmdlLmlzID0gaXM7XG59KShSYW5nZSB8fCAoUmFuZ2UgPSB7fSkpO1xuLyoqXG4gKiBUaGUgTG9jYXRpb24gbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgTG9jYXRpb259IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIExvY2F0aW9uO1xuKGZ1bmN0aW9uIChMb2NhdGlvbikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBMb2NhdGlvbiBsaXRlcmFsLlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIGxvY2F0aW9uJ3MgdXJpLlxuICAgICAqIEBwYXJhbSByYW5nZSBUaGUgbG9jYXRpb24ncyByYW5nZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodXJpLCByYW5nZSkge1xuICAgICAgICByZXR1cm4geyB1cmksIHJhbmdlIH07XG4gICAgfVxuICAgIExvY2F0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIExvY2F0aW9ufSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgKElzLnN0cmluZyhjYW5kaWRhdGUudXJpKSB8fCBJcy51bmRlZmluZWQoY2FuZGlkYXRlLnVyaSkpO1xuICAgIH1cbiAgICBMb2NhdGlvbi5pcyA9IGlzO1xufSkoTG9jYXRpb24gfHwgKExvY2F0aW9uID0ge30pKTtcbi8qKlxuICogVGhlIExvY2F0aW9uTGluayBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBMb2NhdGlvbkxpbmt9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIExvY2F0aW9uTGluaztcbihmdW5jdGlvbiAoTG9jYXRpb25MaW5rKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIExvY2F0aW9uTGluayBsaXRlcmFsLlxuICAgICAqIEBwYXJhbSB0YXJnZXRVcmkgVGhlIGRlZmluaXRpb24ncyB1cmkuXG4gICAgICogQHBhcmFtIHRhcmdldFJhbmdlIFRoZSBmdWxsIHJhbmdlIG9mIHRoZSBkZWZpbml0aW9uLlxuICAgICAqIEBwYXJhbSB0YXJnZXRTZWxlY3Rpb25SYW5nZSBUaGUgc3BhbiBvZiB0aGUgc3ltYm9sIGRlZmluaXRpb24gYXQgdGhlIHRhcmdldC5cbiAgICAgKiBAcGFyYW0gb3JpZ2luU2VsZWN0aW9uUmFuZ2UgVGhlIHNwYW4gb2YgdGhlIHN5bWJvbCBiZWluZyBkZWZpbmVkIGluIHRoZSBvcmlnaW5hdGluZyBzb3VyY2UgZmlsZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodGFyZ2V0VXJpLCB0YXJnZXRSYW5nZSwgdGFyZ2V0U2VsZWN0aW9uUmFuZ2UsIG9yaWdpblNlbGVjdGlvblJhbmdlKSB7XG4gICAgICAgIHJldHVybiB7IHRhcmdldFVyaSwgdGFyZ2V0UmFuZ2UsIHRhcmdldFNlbGVjdGlvblJhbmdlLCBvcmlnaW5TZWxlY3Rpb25SYW5nZSB9O1xuICAgIH1cbiAgICBMb2NhdGlvbkxpbmsuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgTG9jYXRpb25MaW5rfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS50YXJnZXRSYW5nZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS50YXJnZXRVcmkpXG4gICAgICAgICAgICAmJiBSYW5nZS5pcyhjYW5kaWRhdGUudGFyZ2V0U2VsZWN0aW9uUmFuZ2UpXG4gICAgICAgICAgICAmJiAoUmFuZ2UuaXMoY2FuZGlkYXRlLm9yaWdpblNlbGVjdGlvblJhbmdlKSB8fCBJcy51bmRlZmluZWQoY2FuZGlkYXRlLm9yaWdpblNlbGVjdGlvblJhbmdlKSk7XG4gICAgfVxuICAgIExvY2F0aW9uTGluay5pcyA9IGlzO1xufSkoTG9jYXRpb25MaW5rIHx8IChMb2NhdGlvbkxpbmsgPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29sb3IgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgQ29sb3J9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIENvbG9yO1xuKGZ1bmN0aW9uIChDb2xvcikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ29sb3IgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmVkLCBncmVlbiwgYmx1ZSwgYWxwaGEpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJlZCxcbiAgICAgICAgICAgIGdyZWVuLFxuICAgICAgICAgICAgYmx1ZSxcbiAgICAgICAgICAgIGFscGhhLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBDb2xvci5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBDb2xvcn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIElzLm51bWJlclJhbmdlKGNhbmRpZGF0ZS5yZWQsIDAsIDEpXG4gICAgICAgICAgICAmJiBJcy5udW1iZXJSYW5nZShjYW5kaWRhdGUuZ3JlZW4sIDAsIDEpXG4gICAgICAgICAgICAmJiBJcy5udW1iZXJSYW5nZShjYW5kaWRhdGUuYmx1ZSwgMCwgMSlcbiAgICAgICAgICAgICYmIElzLm51bWJlclJhbmdlKGNhbmRpZGF0ZS5hbHBoYSwgMCwgMSk7XG4gICAgfVxuICAgIENvbG9yLmlzID0gaXM7XG59KShDb2xvciB8fCAoQ29sb3IgPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29sb3JJbmZvcm1hdGlvbiBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBDb2xvckluZm9ybWF0aW9ufSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBDb2xvckluZm9ybWF0aW9uO1xuKGZ1bmN0aW9uIChDb2xvckluZm9ybWF0aW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDb2xvckluZm9ybWF0aW9uIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCBjb2xvcikge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmFuZ2UsXG4gICAgICAgICAgICBjb2xvcixcbiAgICAgICAgfTtcbiAgICB9XG4gICAgQ29sb3JJbmZvcm1hdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBDb2xvckluZm9ybWF0aW9ufSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiBDb2xvci5pcyhjYW5kaWRhdGUuY29sb3IpO1xuICAgIH1cbiAgICBDb2xvckluZm9ybWF0aW9uLmlzID0gaXM7XG59KShDb2xvckluZm9ybWF0aW9uIHx8IChDb2xvckluZm9ybWF0aW9uID0ge30pKTtcbi8qKlxuICogVGhlIENvbG9yIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIENvbG9yUHJlc2VudGF0aW9ufSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBDb2xvclByZXNlbnRhdGlvbjtcbihmdW5jdGlvbiAoQ29sb3JQcmVzZW50YXRpb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENvbG9ySW5mb3JtYXRpb24gbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobGFiZWwsIHRleHRFZGl0LCBhZGRpdGlvbmFsVGV4dEVkaXRzKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsYWJlbCxcbiAgICAgICAgICAgIHRleHRFZGl0LFxuICAgICAgICAgICAgYWRkaXRpb25hbFRleHRFZGl0cyxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgQ29sb3JQcmVzZW50YXRpb24uY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgQ29sb3JJbmZvcm1hdGlvbn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUubGFiZWwpXG4gICAgICAgICAgICAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS50ZXh0RWRpdCkgfHwgVGV4dEVkaXQuaXMoY2FuZGlkYXRlKSlcbiAgICAgICAgICAgICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLmFkZGl0aW9uYWxUZXh0RWRpdHMpIHx8IElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLmFkZGl0aW9uYWxUZXh0RWRpdHMsIFRleHRFZGl0LmlzKSk7XG4gICAgfVxuICAgIENvbG9yUHJlc2VudGF0aW9uLmlzID0gaXM7XG59KShDb2xvclByZXNlbnRhdGlvbiB8fCAoQ29sb3JQcmVzZW50YXRpb24gPSB7fSkpO1xuLyoqXG4gKiBBIHNldCBvZiBwcmVkZWZpbmVkIHJhbmdlIGtpbmRzLlxuICovXG5leHBvcnQgdmFyIEZvbGRpbmdSYW5nZUtpbmQ7XG4oZnVuY3Rpb24gKEZvbGRpbmdSYW5nZUtpbmQpIHtcbiAgICAvKipcbiAgICAgKiBGb2xkaW5nIHJhbmdlIGZvciBhIGNvbW1lbnRcbiAgICAgKi9cbiAgICBGb2xkaW5nUmFuZ2VLaW5kLkNvbW1lbnQgPSAnY29tbWVudCc7XG4gICAgLyoqXG4gICAgICogRm9sZGluZyByYW5nZSBmb3IgYW4gaW1wb3J0IG9yIGluY2x1ZGVcbiAgICAgKi9cbiAgICBGb2xkaW5nUmFuZ2VLaW5kLkltcG9ydHMgPSAnaW1wb3J0cyc7XG4gICAgLyoqXG4gICAgICogRm9sZGluZyByYW5nZSBmb3IgYSByZWdpb24gKGUuZy4gYCNyZWdpb25gKVxuICAgICAqL1xuICAgIEZvbGRpbmdSYW5nZUtpbmQuUmVnaW9uID0gJ3JlZ2lvbic7XG59KShGb2xkaW5nUmFuZ2VLaW5kIHx8IChGb2xkaW5nUmFuZ2VLaW5kID0ge30pKTtcbi8qKlxuICogVGhlIGZvbGRpbmcgcmFuZ2UgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgRm9sZGluZ1JhbmdlfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBGb2xkaW5nUmFuZ2U7XG4oZnVuY3Rpb24gKEZvbGRpbmdSYW5nZSkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgRm9sZGluZ1JhbmdlIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHN0YXJ0TGluZSwgZW5kTGluZSwgc3RhcnRDaGFyYWN0ZXIsIGVuZENoYXJhY3Rlciwga2luZCwgY29sbGFwc2VkVGV4dCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICBzdGFydExpbmUsXG4gICAgICAgICAgICBlbmRMaW5lXG4gICAgICAgIH07XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKHN0YXJ0Q2hhcmFjdGVyKSkge1xuICAgICAgICAgICAgcmVzdWx0LnN0YXJ0Q2hhcmFjdGVyID0gc3RhcnRDaGFyYWN0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzLmRlZmluZWQoZW5kQ2hhcmFjdGVyKSkge1xuICAgICAgICAgICAgcmVzdWx0LmVuZENoYXJhY3RlciA9IGVuZENoYXJhY3RlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXMuZGVmaW5lZChraW5kKSkge1xuICAgICAgICAgICAgcmVzdWx0LmtpbmQgPSBraW5kO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKGNvbGxhcHNlZFRleHQpKSB7XG4gICAgICAgICAgICByZXN1bHQuY29sbGFwc2VkVGV4dCA9IGNvbGxhcHNlZFRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgRm9sZGluZ1JhbmdlLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIEZvbGRpbmdSYW5nZX0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS5zdGFydExpbmUpICYmIElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS5zdGFydExpbmUpXG4gICAgICAgICAgICAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5zdGFydENoYXJhY3RlcikgfHwgSXMudWludGVnZXIoY2FuZGlkYXRlLnN0YXJ0Q2hhcmFjdGVyKSlcbiAgICAgICAgICAgICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLmVuZENoYXJhY3RlcikgfHwgSXMudWludGVnZXIoY2FuZGlkYXRlLmVuZENoYXJhY3RlcikpXG4gICAgICAgICAgICAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5raW5kKSB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLmtpbmQpKTtcbiAgICB9XG4gICAgRm9sZGluZ1JhbmdlLmlzID0gaXM7XG59KShGb2xkaW5nUmFuZ2UgfHwgKEZvbGRpbmdSYW5nZSA9IHt9KSk7XG4vKipcbiAqIFRoZSBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb259IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb247XG4oZnVuY3Rpb24gKERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24gbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobG9jYXRpb24sIG1lc3NhZ2UpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxvY2F0aW9uLFxuICAgICAgICAgICAgbWVzc2FnZVxuICAgICAgICB9O1xuICAgIH1cbiAgICBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb259IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgTG9jYXRpb24uaXMoY2FuZGlkYXRlLmxvY2F0aW9uKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLm1lc3NhZ2UpO1xuICAgIH1cbiAgICBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uLmlzID0gaXM7XG59KShEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uIHx8IChEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uID0ge30pKTtcbi8qKlxuICogVGhlIGRpYWdub3N0aWMncyBzZXZlcml0eS5cbiAqL1xuZXhwb3J0IHZhciBEaWFnbm9zdGljU2V2ZXJpdHk7XG4oZnVuY3Rpb24gKERpYWdub3N0aWNTZXZlcml0eSkge1xuICAgIC8qKlxuICAgICAqIFJlcG9ydHMgYW4gZXJyb3IuXG4gICAgICovXG4gICAgRGlhZ25vc3RpY1NldmVyaXR5LkVycm9yID0gMTtcbiAgICAvKipcbiAgICAgKiBSZXBvcnRzIGEgd2FybmluZy5cbiAgICAgKi9cbiAgICBEaWFnbm9zdGljU2V2ZXJpdHkuV2FybmluZyA9IDI7XG4gICAgLyoqXG4gICAgICogUmVwb3J0cyBhbiBpbmZvcm1hdGlvbi5cbiAgICAgKi9cbiAgICBEaWFnbm9zdGljU2V2ZXJpdHkuSW5mb3JtYXRpb24gPSAzO1xuICAgIC8qKlxuICAgICAqIFJlcG9ydHMgYSBoaW50LlxuICAgICAqL1xuICAgIERpYWdub3N0aWNTZXZlcml0eS5IaW50ID0gNDtcbn0pKERpYWdub3N0aWNTZXZlcml0eSB8fCAoRGlhZ25vc3RpY1NldmVyaXR5ID0ge30pKTtcbi8qKlxuICogVGhlIGRpYWdub3N0aWMgdGFncy5cbiAqXG4gKiBAc2luY2UgMy4xNS4wXG4gKi9cbmV4cG9ydCB2YXIgRGlhZ25vc3RpY1RhZztcbihmdW5jdGlvbiAoRGlhZ25vc3RpY1RhZykge1xuICAgIC8qKlxuICAgICAqIFVudXNlZCBvciB1bm5lY2Vzc2FyeSBjb2RlLlxuICAgICAqXG4gICAgICogQ2xpZW50cyBhcmUgYWxsb3dlZCB0byByZW5kZXIgZGlhZ25vc3RpY3Mgd2l0aCB0aGlzIHRhZyBmYWRlZCBvdXQgaW5zdGVhZCBvZiBoYXZpbmdcbiAgICAgKiBhbiBlcnJvciBzcXVpZ2dsZS5cbiAgICAgKi9cbiAgICBEaWFnbm9zdGljVGFnLlVubmVjZXNzYXJ5ID0gMTtcbiAgICAvKipcbiAgICAgKiBEZXByZWNhdGVkIG9yIG9ic29sZXRlIGNvZGUuXG4gICAgICpcbiAgICAgKiBDbGllbnRzIGFyZSBhbGxvd2VkIHRvIHJlbmRlcmVkIGRpYWdub3N0aWNzIHdpdGggdGhpcyB0YWcgc3RyaWtlIHRocm91Z2guXG4gICAgICovXG4gICAgRGlhZ25vc3RpY1RhZy5EZXByZWNhdGVkID0gMjtcbn0pKERpYWdub3N0aWNUYWcgfHwgKERpYWdub3N0aWNUYWcgPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29kZURlc2NyaXB0aW9uIG5hbWVzcGFjZSBwcm92aWRlcyBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIGRlc2NyaXB0aW9ucyBmb3IgZGlhZ25vc3RpYyBjb2Rlcy5cbiAqXG4gKiBAc2luY2UgMy4xNi4wXG4gKi9cbmV4cG9ydCB2YXIgQ29kZURlc2NyaXB0aW9uO1xuKGZ1bmN0aW9uIChDb2RlRGVzY3JpcHRpb24pIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLmhyZWYpO1xuICAgIH1cbiAgICBDb2RlRGVzY3JpcHRpb24uaXMgPSBpcztcbn0pKENvZGVEZXNjcmlwdGlvbiB8fCAoQ29kZURlc2NyaXB0aW9uID0ge30pKTtcbi8qKlxuICogVGhlIERpYWdub3N0aWMgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgRGlhZ25vc3RpY30gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgRGlhZ25vc3RpYztcbihmdW5jdGlvbiAoRGlhZ25vc3RpYykge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgRGlhZ25vc3RpYyBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgbWVzc2FnZSwgc2V2ZXJpdHksIGNvZGUsIHNvdXJjZSwgcmVsYXRlZEluZm9ybWF0aW9uKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IHJhbmdlLCBtZXNzYWdlIH07XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKHNldmVyaXR5KSkge1xuICAgICAgICAgICAgcmVzdWx0LnNldmVyaXR5ID0gc2V2ZXJpdHk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzLmRlZmluZWQoY29kZSkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5jb2RlID0gY29kZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXMuZGVmaW5lZChzb3VyY2UpKSB7XG4gICAgICAgICAgICByZXN1bHQuc291cmNlID0gc291cmNlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKHJlbGF0ZWRJbmZvcm1hdGlvbikpIHtcbiAgICAgICAgICAgIHJlc3VsdC5yZWxhdGVkSW5mb3JtYXRpb24gPSByZWxhdGVkSW5mb3JtYXRpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgRGlhZ25vc3RpYy5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBEaWFnbm9zdGljfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgdmFyIF9hO1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSlcbiAgICAgICAgICAgICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSlcbiAgICAgICAgICAgICYmIElzLnN0cmluZyhjYW5kaWRhdGUubWVzc2FnZSlcbiAgICAgICAgICAgICYmIChJcy5udW1iZXIoY2FuZGlkYXRlLnNldmVyaXR5KSB8fCBJcy51bmRlZmluZWQoY2FuZGlkYXRlLnNldmVyaXR5KSlcbiAgICAgICAgICAgICYmIChJcy5pbnRlZ2VyKGNhbmRpZGF0ZS5jb2RlKSB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLmNvZGUpIHx8IElzLnVuZGVmaW5lZChjYW5kaWRhdGUuY29kZSkpXG4gICAgICAgICAgICAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5jb2RlRGVzY3JpcHRpb24pIHx8IChJcy5zdHJpbmcoKF9hID0gY2FuZGlkYXRlLmNvZGVEZXNjcmlwdGlvbikgPT09IG51bGwgfHwgX2EgPT09IHZvaWQgMCA/IHZvaWQgMCA6IF9hLmhyZWYpKSlcbiAgICAgICAgICAgICYmIChJcy5zdHJpbmcoY2FuZGlkYXRlLnNvdXJjZSkgfHwgSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5zb3VyY2UpKVxuICAgICAgICAgICAgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUucmVsYXRlZEluZm9ybWF0aW9uKSB8fCBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS5yZWxhdGVkSW5mb3JtYXRpb24sIERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24uaXMpKTtcbiAgICB9XG4gICAgRGlhZ25vc3RpYy5pcyA9IGlzO1xufSkoRGlhZ25vc3RpYyB8fCAoRGlhZ25vc3RpYyA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb21tYW5kIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIENvbW1hbmR9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIENvbW1hbmQ7XG4oZnVuY3Rpb24gKENvbW1hbmQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENvbW1hbmQgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodGl0bGUsIGNvbW1hbmQsIC4uLmFyZ3MpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHsgdGl0bGUsIGNvbW1hbmQgfTtcbiAgICAgICAgaWYgKElzLmRlZmluZWQoYXJncykgJiYgYXJncy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICByZXN1bHQuYXJndW1lbnRzID0gYXJncztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBDb21tYW5kLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIENvbW1hbmR9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS50aXRsZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5jb21tYW5kKTtcbiAgICB9XG4gICAgQ29tbWFuZC5pcyA9IGlzO1xufSkoQ29tbWFuZCB8fCAoQ29tbWFuZCA9IHt9KSk7XG4vKipcbiAqIFRoZSBUZXh0RWRpdCBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZSByZXBsYWNlLFxuICogaW5zZXJ0IGFuZCBkZWxldGUgZWRpdHMgbW9yZSBlYXNpbHkuXG4gKi9cbmV4cG9ydCB2YXIgVGV4dEVkaXQ7XG4oZnVuY3Rpb24gKFRleHRFZGl0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIHJlcGxhY2UgdGV4dCBlZGl0LlxuICAgICAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2Ugb2YgdGV4dCB0byBiZSByZXBsYWNlZC5cbiAgICAgKiBAcGFyYW0gbmV3VGV4dCBUaGUgbmV3IHRleHQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVwbGFjZShyYW5nZSwgbmV3VGV4dCkge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgbmV3VGV4dCB9O1xuICAgIH1cbiAgICBUZXh0RWRpdC5yZXBsYWNlID0gcmVwbGFjZTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGluc2VydCB0ZXh0IGVkaXQuXG4gICAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBwb3NpdGlvbiB0byBpbnNlcnQgdGhlIHRleHQgYXQuXG4gICAgICogQHBhcmFtIG5ld1RleHQgVGhlIHRleHQgdG8gYmUgaW5zZXJ0ZWQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5zZXJ0KHBvc2l0aW9uLCBuZXdUZXh0KSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlOiB7IHN0YXJ0OiBwb3NpdGlvbiwgZW5kOiBwb3NpdGlvbiB9LCBuZXdUZXh0IH07XG4gICAgfVxuICAgIFRleHRFZGl0Lmluc2VydCA9IGluc2VydDtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgZGVsZXRlIHRleHQgZWRpdC5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlIG9mIHRleHQgdG8gYmUgZGVsZXRlZC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkZWwocmFuZ2UpIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIG5ld1RleHQ6ICcnIH07XG4gICAgfVxuICAgIFRleHRFZGl0LmRlbCA9IGRlbDtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKVxuICAgICAgICAgICAgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5uZXdUZXh0KVxuICAgICAgICAgICAgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKTtcbiAgICB9XG4gICAgVGV4dEVkaXQuaXMgPSBpcztcbn0pKFRleHRFZGl0IHx8IChUZXh0RWRpdCA9IHt9KSk7XG5leHBvcnQgdmFyIENoYW5nZUFubm90YXRpb247XG4oZnVuY3Rpb24gKENoYW5nZUFubm90YXRpb24pIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUobGFiZWwsIG5lZWRzQ29uZmlybWF0aW9uLCBkZXNjcmlwdGlvbikge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB7IGxhYmVsIH07XG4gICAgICAgIGlmIChuZWVkc0NvbmZpcm1hdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQubmVlZHNDb25maXJtYXRpb24gPSBuZWVkc0NvbmZpcm1hdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGVzY3JpcHRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmRlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgQ2hhbmdlQW5ub3RhdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5sYWJlbCkgJiZcbiAgICAgICAgICAgIChJcy5ib29sZWFuKGNhbmRpZGF0ZS5uZWVkc0NvbmZpcm1hdGlvbikgfHwgY2FuZGlkYXRlLm5lZWRzQ29uZmlybWF0aW9uID09PSB1bmRlZmluZWQpICYmXG4gICAgICAgICAgICAoSXMuc3RyaW5nKGNhbmRpZGF0ZS5kZXNjcmlwdGlvbikgfHwgY2FuZGlkYXRlLmRlc2NyaXB0aW9uID09PSB1bmRlZmluZWQpO1xuICAgIH1cbiAgICBDaGFuZ2VBbm5vdGF0aW9uLmlzID0gaXM7XG59KShDaGFuZ2VBbm5vdGF0aW9uIHx8IChDaGFuZ2VBbm5vdGF0aW9uID0ge30pKTtcbmV4cG9ydCB2YXIgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXI7XG4oZnVuY3Rpb24gKENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyKSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5zdHJpbmcoY2FuZGlkYXRlKTtcbiAgICB9XG4gICAgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMgPSBpcztcbn0pKENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyIHx8IChDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllciA9IHt9KSk7XG5leHBvcnQgdmFyIEFubm90YXRlZFRleHRFZGl0O1xuKGZ1bmN0aW9uIChBbm5vdGF0ZWRUZXh0RWRpdCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYW5ub3RhdGVkIHJlcGxhY2UgdGV4dCBlZGl0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSBvZiB0ZXh0IHRvIGJlIHJlcGxhY2VkLlxuICAgICAqIEBwYXJhbSBuZXdUZXh0IFRoZSBuZXcgdGV4dC5cbiAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiBUaGUgYW5ub3RhdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXBsYWNlKHJhbmdlLCBuZXdUZXh0LCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCBuZXdUZXh0LCBhbm5vdGF0aW9uSWQ6IGFubm90YXRpb24gfTtcbiAgICB9XG4gICAgQW5ub3RhdGVkVGV4dEVkaXQucmVwbGFjZSA9IHJlcGxhY2U7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhbm5vdGF0ZWQgaW5zZXJ0IHRleHQgZWRpdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgcG9zaXRpb24gdG8gaW5zZXJ0IHRoZSB0ZXh0IGF0LlxuICAgICAqIEBwYXJhbSBuZXdUZXh0IFRoZSB0ZXh0IHRvIGJlIGluc2VydGVkLlxuICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIFRoZSBhbm5vdGF0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluc2VydChwb3NpdGlvbiwgbmV3VGV4dCwgYW5ub3RhdGlvbikge1xuICAgICAgICByZXR1cm4geyByYW5nZTogeyBzdGFydDogcG9zaXRpb24sIGVuZDogcG9zaXRpb24gfSwgbmV3VGV4dCwgYW5ub3RhdGlvbklkOiBhbm5vdGF0aW9uIH07XG4gICAgfVxuICAgIEFubm90YXRlZFRleHRFZGl0Lmluc2VydCA9IGluc2VydDtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFubm90YXRlZCBkZWxldGUgdGV4dCBlZGl0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSBvZiB0ZXh0IHRvIGJlIGRlbGV0ZWQuXG4gICAgICogQHBhcmFtIGFubm90YXRpb24gVGhlIGFubm90YXRpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gZGVsKHJhbmdlLCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCBuZXdUZXh0OiAnJywgYW5ub3RhdGlvbklkOiBhbm5vdGF0aW9uIH07XG4gICAgfVxuICAgIEFubm90YXRlZFRleHRFZGl0LmRlbCA9IGRlbDtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIFRleHRFZGl0LmlzKGNhbmRpZGF0ZSkgJiYgKENoYW5nZUFubm90YXRpb24uaXMoY2FuZGlkYXRlLmFubm90YXRpb25JZCkgfHwgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoY2FuZGlkYXRlLmFubm90YXRpb25JZCkpO1xuICAgIH1cbiAgICBBbm5vdGF0ZWRUZXh0RWRpdC5pcyA9IGlzO1xufSkoQW5ub3RhdGVkVGV4dEVkaXQgfHwgKEFubm90YXRlZFRleHRFZGl0ID0ge30pKTtcbi8qKlxuICogVGhlIFRleHREb2N1bWVudEVkaXQgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGVcbiAqIGFuIGVkaXQgdGhhdCBtYW5pcHVsYXRlcyBhIHRleHQgZG9jdW1lbnQuXG4gKi9cbmV4cG9ydCB2YXIgVGV4dERvY3VtZW50RWRpdDtcbihmdW5jdGlvbiAoVGV4dERvY3VtZW50RWRpdCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgYFRleHREb2N1bWVudEVkaXRgXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHRleHREb2N1bWVudCwgZWRpdHMpIHtcbiAgICAgICAgcmV0dXJuIHsgdGV4dERvY3VtZW50LCBlZGl0cyB9O1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnRFZGl0LmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSlcbiAgICAgICAgICAgICYmIE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllci5pcyhjYW5kaWRhdGUudGV4dERvY3VtZW50KVxuICAgICAgICAgICAgJiYgQXJyYXkuaXNBcnJheShjYW5kaWRhdGUuZWRpdHMpO1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnRFZGl0LmlzID0gaXM7XG59KShUZXh0RG9jdW1lbnRFZGl0IHx8IChUZXh0RG9jdW1lbnRFZGl0ID0ge30pKTtcbmV4cG9ydCB2YXIgQ3JlYXRlRmlsZTtcbihmdW5jdGlvbiAoQ3JlYXRlRmlsZSkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmksIG9wdGlvbnMsIGFubm90YXRpb24pIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIGtpbmQ6ICdjcmVhdGUnLFxuICAgICAgICAgICAgdXJpXG4gICAgICAgIH07XG4gICAgICAgIGlmIChvcHRpb25zICE9PSB1bmRlZmluZWQgJiYgKG9wdGlvbnMub3ZlcndyaXRlICE9PSB1bmRlZmluZWQgfHwgb3B0aW9ucy5pZ25vcmVJZkV4aXN0cyAhPT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgcmVzdWx0Lm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbm5vdGF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5hbm5vdGF0aW9uSWQgPSBhbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIENyZWF0ZUZpbGUuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBjYW5kaWRhdGUua2luZCA9PT0gJ2NyZWF0ZScgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpICYmIChjYW5kaWRhdGUub3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAoKGNhbmRpZGF0ZS5vcHRpb25zLm92ZXJ3cml0ZSA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLm9wdGlvbnMub3ZlcndyaXRlKSkgJiYgKGNhbmRpZGF0ZS5vcHRpb25zLmlnbm9yZUlmRXhpc3RzID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUub3B0aW9ucy5pZ25vcmVJZkV4aXN0cykpKSkgJiYgKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQgPT09IHVuZGVmaW5lZCB8fCBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhjYW5kaWRhdGUuYW5ub3RhdGlvbklkKSk7XG4gICAgfVxuICAgIENyZWF0ZUZpbGUuaXMgPSBpcztcbn0pKENyZWF0ZUZpbGUgfHwgKENyZWF0ZUZpbGUgPSB7fSkpO1xuZXhwb3J0IHZhciBSZW5hbWVGaWxlO1xuKGZ1bmN0aW9uIChSZW5hbWVGaWxlKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKG9sZFVyaSwgbmV3VXJpLCBvcHRpb25zLCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7XG4gICAgICAgICAgICBraW5kOiAncmVuYW1lJyxcbiAgICAgICAgICAgIG9sZFVyaSxcbiAgICAgICAgICAgIG5ld1VyaVxuICAgICAgICB9O1xuICAgICAgICBpZiAob3B0aW9ucyAhPT0gdW5kZWZpbmVkICYmIChvcHRpb25zLm92ZXJ3cml0ZSAhPT0gdW5kZWZpbmVkIHx8IG9wdGlvbnMuaWdub3JlSWZFeGlzdHMgIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgfVxuICAgICAgICBpZiAoYW5ub3RhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQuYW5ub3RhdGlvbklkID0gYW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBSZW5hbWVGaWxlLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgY2FuZGlkYXRlLmtpbmQgPT09ICdyZW5hbWUnICYmIElzLnN0cmluZyhjYW5kaWRhdGUub2xkVXJpKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLm5ld1VyaSkgJiYgKGNhbmRpZGF0ZS5vcHRpb25zID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICgoY2FuZGlkYXRlLm9wdGlvbnMub3ZlcndyaXRlID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUub3B0aW9ucy5vdmVyd3JpdGUpKSAmJiAoY2FuZGlkYXRlLm9wdGlvbnMuaWdub3JlSWZFeGlzdHMgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5vcHRpb25zLmlnbm9yZUlmRXhpc3RzKSkpKSAmJiAoY2FuZGlkYXRlLmFubm90YXRpb25JZCA9PT0gdW5kZWZpbmVkIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQpKTtcbiAgICB9XG4gICAgUmVuYW1lRmlsZS5pcyA9IGlzO1xufSkoUmVuYW1lRmlsZSB8fCAoUmVuYW1lRmlsZSA9IHt9KSk7XG5leHBvcnQgdmFyIERlbGV0ZUZpbGU7XG4oZnVuY3Rpb24gKERlbGV0ZUZpbGUpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUodXJpLCBvcHRpb25zLCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7XG4gICAgICAgICAgICBraW5kOiAnZGVsZXRlJyxcbiAgICAgICAgICAgIHVyaVxuICAgICAgICB9O1xuICAgICAgICBpZiAob3B0aW9ucyAhPT0gdW5kZWZpbmVkICYmIChvcHRpb25zLnJlY3Vyc2l2ZSAhPT0gdW5kZWZpbmVkIHx8IG9wdGlvbnMuaWdub3JlSWZOb3RFeGlzdHMgIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgfVxuICAgICAgICBpZiAoYW5ub3RhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQuYW5ub3RhdGlvbklkID0gYW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBEZWxldGVGaWxlLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgY2FuZGlkYXRlLmtpbmQgPT09ICdkZWxldGUnICYmIElzLnN0cmluZyhjYW5kaWRhdGUudXJpKSAmJiAoY2FuZGlkYXRlLm9wdGlvbnMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgKChjYW5kaWRhdGUub3B0aW9ucy5yZWN1cnNpdmUgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5vcHRpb25zLnJlY3Vyc2l2ZSkpICYmIChjYW5kaWRhdGUub3B0aW9ucy5pZ25vcmVJZk5vdEV4aXN0cyA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLm9wdGlvbnMuaWdub3JlSWZOb3RFeGlzdHMpKSkpICYmIChjYW5kaWRhdGUuYW5ub3RhdGlvbklkID09PSB1bmRlZmluZWQgfHwgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoY2FuZGlkYXRlLmFubm90YXRpb25JZCkpO1xuICAgIH1cbiAgICBEZWxldGVGaWxlLmlzID0gaXM7XG59KShEZWxldGVGaWxlIHx8IChEZWxldGVGaWxlID0ge30pKTtcbmV4cG9ydCB2YXIgV29ya3NwYWNlRWRpdDtcbihmdW5jdGlvbiAoV29ya3NwYWNlRWRpdCkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5jaGFuZ2VzICE9PSB1bmRlZmluZWQgfHwgY2FuZGlkYXRlLmRvY3VtZW50Q2hhbmdlcyAhPT0gdW5kZWZpbmVkKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5kb2N1bWVudENoYW5nZXMgPT09IHVuZGVmaW5lZCB8fCBjYW5kaWRhdGUuZG9jdW1lbnRDaGFuZ2VzLmV2ZXJ5KChjaGFuZ2UpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoSXMuc3RyaW5nKGNoYW5nZS5raW5kKSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ3JlYXRlRmlsZS5pcyhjaGFuZ2UpIHx8IFJlbmFtZUZpbGUuaXMoY2hhbmdlKSB8fCBEZWxldGVGaWxlLmlzKGNoYW5nZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gVGV4dERvY3VtZW50RWRpdC5pcyhjaGFuZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pKTtcbiAgICB9XG4gICAgV29ya3NwYWNlRWRpdC5pcyA9IGlzO1xufSkoV29ya3NwYWNlRWRpdCB8fCAoV29ya3NwYWNlRWRpdCA9IHt9KSk7XG5jbGFzcyBUZXh0RWRpdENoYW5nZUltcGwge1xuICAgIGNvbnN0cnVjdG9yKGVkaXRzLCBjaGFuZ2VBbm5vdGF0aW9ucykge1xuICAgICAgICB0aGlzLmVkaXRzID0gZWRpdHM7XG4gICAgICAgIHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMgPSBjaGFuZ2VBbm5vdGF0aW9ucztcbiAgICB9XG4gICAgaW5zZXJ0KHBvc2l0aW9uLCBuZXdUZXh0LCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIGxldCBlZGl0O1xuICAgICAgICBsZXQgaWQ7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGVkaXQgPSBUZXh0RWRpdC5pbnNlcnQocG9zaXRpb24sIG5ld1RleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGFubm90YXRpb24pKSB7XG4gICAgICAgICAgICBpZCA9IGFubm90YXRpb247XG4gICAgICAgICAgICBlZGl0ID0gQW5ub3RhdGVkVGV4dEVkaXQuaW5zZXJ0KHBvc2l0aW9uLCBuZXdUZXh0LCBhbm5vdGF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYXNzZXJ0Q2hhbmdlQW5ub3RhdGlvbnModGhpcy5jaGFuZ2VBbm5vdGF0aW9ucyk7XG4gICAgICAgICAgICBpZCA9IHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMubWFuYWdlKGFubm90YXRpb24pO1xuICAgICAgICAgICAgZWRpdCA9IEFubm90YXRlZFRleHRFZGl0Lmluc2VydChwb3NpdGlvbiwgbmV3VGV4dCwgaWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWRpdHMucHVzaChlZGl0KTtcbiAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXBsYWNlKHJhbmdlLCBuZXdUZXh0LCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIGxldCBlZGl0O1xuICAgICAgICBsZXQgaWQ7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGVkaXQgPSBUZXh0RWRpdC5yZXBsYWNlKHJhbmdlLCBuZXdUZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhhbm5vdGF0aW9uKSkge1xuICAgICAgICAgICAgaWQgPSBhbm5vdGF0aW9uO1xuICAgICAgICAgICAgZWRpdCA9IEFubm90YXRlZFRleHRFZGl0LnJlcGxhY2UocmFuZ2UsIG5ld1RleHQsIGFubm90YXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hc3NlcnRDaGFuZ2VBbm5vdGF0aW9ucyh0aGlzLmNoYW5nZUFubm90YXRpb25zKTtcbiAgICAgICAgICAgIGlkID0gdGhpcy5jaGFuZ2VBbm5vdGF0aW9ucy5tYW5hZ2UoYW5ub3RhdGlvbik7XG4gICAgICAgICAgICBlZGl0ID0gQW5ub3RhdGVkVGV4dEVkaXQucmVwbGFjZShyYW5nZSwgbmV3VGV4dCwgaWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWRpdHMucHVzaChlZGl0KTtcbiAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkZWxldGUocmFuZ2UsIGFubm90YXRpb24pIHtcbiAgICAgICAgbGV0IGVkaXQ7XG4gICAgICAgIGxldCBpZDtcbiAgICAgICAgaWYgKGFubm90YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZWRpdCA9IFRleHRFZGl0LmRlbChyYW5nZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoYW5ub3RhdGlvbikpIHtcbiAgICAgICAgICAgIGlkID0gYW5ub3RhdGlvbjtcbiAgICAgICAgICAgIGVkaXQgPSBBbm5vdGF0ZWRUZXh0RWRpdC5kZWwocmFuZ2UsIGFubm90YXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hc3NlcnRDaGFuZ2VBbm5vdGF0aW9ucyh0aGlzLmNoYW5nZUFubm90YXRpb25zKTtcbiAgICAgICAgICAgIGlkID0gdGhpcy5jaGFuZ2VBbm5vdGF0aW9ucy5tYW5hZ2UoYW5ub3RhdGlvbik7XG4gICAgICAgICAgICBlZGl0ID0gQW5ub3RhdGVkVGV4dEVkaXQuZGVsKHJhbmdlLCBpZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lZGl0cy5wdXNoKGVkaXQpO1xuICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFkZChlZGl0KSB7XG4gICAgICAgIHRoaXMuZWRpdHMucHVzaChlZGl0KTtcbiAgICB9XG4gICAgYWxsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lZGl0cztcbiAgICB9XG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuZWRpdHMuc3BsaWNlKDAsIHRoaXMuZWRpdHMubGVuZ3RoKTtcbiAgICB9XG4gICAgYXNzZXJ0Q2hhbmdlQW5ub3RhdGlvbnModmFsdWUpIHtcbiAgICAgICAgaWYgKHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVGV4dCBlZGl0IGNoYW5nZSBpcyBub3QgY29uZmlndXJlZCB0byBtYW5hZ2UgY2hhbmdlIGFubm90YXRpb25zLmApO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBBIGhlbHBlciBjbGFzc1xuICovXG5jbGFzcyBDaGFuZ2VBbm5vdGF0aW9ucyB7XG4gICAgY29uc3RydWN0b3IoYW5ub3RhdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fYW5ub3RhdGlvbnMgPSBhbm5vdGF0aW9ucyA9PT0gdW5kZWZpbmVkID8gT2JqZWN0LmNyZWF0ZShudWxsKSA6IGFubm90YXRpb25zO1xuICAgICAgICB0aGlzLl9jb3VudGVyID0gMDtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IDA7XG4gICAgfVxuICAgIGFsbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2Fubm90YXRpb25zO1xuICAgIH1cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpemU7XG4gICAgfVxuICAgIG1hbmFnZShpZE9yQW5ub3RhdGlvbiwgYW5ub3RhdGlvbikge1xuICAgICAgICBsZXQgaWQ7XG4gICAgICAgIGlmIChDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhpZE9yQW5ub3RhdGlvbikpIHtcbiAgICAgICAgICAgIGlkID0gaWRPckFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZCA9IHRoaXMubmV4dElkKCk7XG4gICAgICAgICAgICBhbm5vdGF0aW9uID0gaWRPckFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuX2Fubm90YXRpb25zW2lkXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYElkICR7aWR9IGlzIGFscmVhZHkgaW4gdXNlLmApO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbm5vdGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gYW5ub3RhdGlvbiBwcm92aWRlZCBmb3IgaWQgJHtpZH1gKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9hbm5vdGF0aW9uc1tpZF0gPSBhbm5vdGF0aW9uO1xuICAgICAgICB0aGlzLl9zaXplKys7XG4gICAgICAgIHJldHVybiBpZDtcbiAgICB9XG4gICAgbmV4dElkKCkge1xuICAgICAgICB0aGlzLl9jb3VudGVyKys7XG4gICAgICAgIHJldHVybiB0aGlzLl9jb3VudGVyLnRvU3RyaW5nKCk7XG4gICAgfVxufVxuLyoqXG4gKiBBIHdvcmtzcGFjZSBjaGFuZ2UgaGVscHMgY29uc3RydWN0aW5nIGNoYW5nZXMgdG8gYSB3b3Jrc3BhY2UuXG4gKi9cbmV4cG9ydCBjbGFzcyBXb3Jrc3BhY2VDaGFuZ2Uge1xuICAgIGNvbnN0cnVjdG9yKHdvcmtzcGFjZUVkaXQpIHtcbiAgICAgICAgdGhpcy5fdGV4dEVkaXRDaGFuZ2VzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgaWYgKHdvcmtzcGFjZUVkaXQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdCA9IHdvcmtzcGFjZUVkaXQ7XG4gICAgICAgICAgICBpZiAod29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucyA9IG5ldyBDaGFuZ2VBbm5vdGF0aW9ucyh3b3Jrc3BhY2VFZGl0LmNoYW5nZUFubm90YXRpb25zKTtcbiAgICAgICAgICAgICAgICB3b3Jrc3BhY2VFZGl0LmNoYW5nZUFubm90YXRpb25zID0gdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMuYWxsKCk7XG4gICAgICAgICAgICAgICAgd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMuZm9yRWFjaCgoY2hhbmdlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChUZXh0RG9jdW1lbnRFZGl0LmlzKGNoYW5nZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHRFZGl0Q2hhbmdlID0gbmV3IFRleHRFZGl0Q2hhbmdlSW1wbChjaGFuZ2UuZWRpdHMsIHRoaXMuX2NoYW5nZUFubm90YXRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX3RleHRFZGl0Q2hhbmdlc1tjaGFuZ2UudGV4dERvY3VtZW50LnVyaV0gPSB0ZXh0RWRpdENoYW5nZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAod29ya3NwYWNlRWRpdC5jaGFuZ2VzKSB7XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXMod29ya3NwYWNlRWRpdC5jaGFuZ2VzKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dEVkaXRDaGFuZ2UgPSBuZXcgVGV4dEVkaXRDaGFuZ2VJbXBsKHdvcmtzcGFjZUVkaXQuY2hhbmdlc1trZXldKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGV4dEVkaXRDaGFuZ2VzW2tleV0gPSB0ZXh0RWRpdENoYW5nZTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQgPSB7fTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRoZSB1bmRlcmx5aW5nIHtAbGluayBXb3Jrc3BhY2VFZGl0fSBsaXRlcmFsXG4gICAgICogdXNlIHRvIGJlIHJldHVybmVkIGZyb20gYSB3b3Jrc3BhY2UgZWRpdCBvcGVyYXRpb24gbGlrZSByZW5hbWUuXG4gICAgICovXG4gICAgZ2V0IGVkaXQoKSB7XG4gICAgICAgIHRoaXMuaW5pdERvY3VtZW50Q2hhbmdlcygpO1xuICAgICAgICBpZiAodGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgaWYgKHRoaXMuX2NoYW5nZUFubm90YXRpb25zLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZUFubm90YXRpb25zID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VBbm5vdGF0aW9ucyA9IHRoaXMuX2NoYW5nZUFubm90YXRpb25zLmFsbCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl93b3Jrc3BhY2VFZGl0O1xuICAgIH1cbiAgICBnZXRUZXh0RWRpdENoYW5nZShrZXkpIHtcbiAgICAgICAgaWYgKE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllci5pcyhrZXkpKSB7XG4gICAgICAgICAgICB0aGlzLmluaXREb2N1bWVudENoYW5nZXMoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXb3Jrc3BhY2UgZWRpdCBpcyBub3QgY29uZmlndXJlZCBmb3IgZG9jdW1lbnQgY2hhbmdlcy4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IHRleHREb2N1bWVudCA9IHsgdXJpOiBrZXkudXJpLCB2ZXJzaW9uOiBrZXkudmVyc2lvbiB9O1xuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuX3RleHRFZGl0Q2hhbmdlc1t0ZXh0RG9jdW1lbnQudXJpXTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZWRpdHMgPSBbXTtcbiAgICAgICAgICAgICAgICBjb25zdCB0ZXh0RG9jdW1lbnRFZGl0ID0ge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQsXG4gICAgICAgICAgICAgICAgICAgIGVkaXRzXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcy5wdXNoKHRleHREb2N1bWVudEVkaXQpO1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBUZXh0RWRpdENoYW5nZUltcGwoZWRpdHMsIHRoaXMuX2NoYW5nZUFubm90YXRpb25zKTtcbiAgICAgICAgICAgICAgICB0aGlzLl90ZXh0RWRpdENoYW5nZXNbdGV4dERvY3VtZW50LnVyaV0gPSByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5pbml0Q2hhbmdlcygpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXb3Jrc3BhY2UgZWRpdCBpcyBub3QgY29uZmlndXJlZCBmb3Igbm9ybWFsIHRleHQgZWRpdCBjaGFuZ2VzLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGV0IHJlc3VsdCA9IHRoaXMuX3RleHRFZGl0Q2hhbmdlc1trZXldO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBsZXQgZWRpdHMgPSBbXTtcbiAgICAgICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZXNba2V5XSA9IGVkaXRzO1xuICAgICAgICAgICAgICAgIHJlc3VsdCA9IG5ldyBUZXh0RWRpdENoYW5nZUltcGwoZWRpdHMpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3RleHRFZGl0Q2hhbmdlc1trZXldID0gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpbml0RG9jdW1lbnRDaGFuZ2VzKCkge1xuICAgICAgICBpZiAodGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMgPT09IHVuZGVmaW5lZCAmJiB0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMgPSBuZXcgQ2hhbmdlQW5ub3RhdGlvbnMoKTtcbiAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzID0gW107XG4gICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZUFubm90YXRpb25zID0gdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMuYWxsKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaW5pdENoYW5nZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcyA9PT0gdW5kZWZpbmVkICYmIHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNyZWF0ZUZpbGUodXJpLCBvcHRpb25zT3JBbm5vdGF0aW9uLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuaW5pdERvY3VtZW50Q2hhbmdlcygpO1xuICAgICAgICBpZiAodGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXb3Jrc3BhY2UgZWRpdCBpcyBub3QgY29uZmlndXJlZCBmb3IgZG9jdW1lbnQgY2hhbmdlcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYW5ub3RhdGlvbjtcbiAgICAgICAgaWYgKENoYW5nZUFubm90YXRpb24uaXMob3B0aW9uc09yQW5ub3RhdGlvbikgfHwgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMob3B0aW9uc09yQW5ub3RhdGlvbikpIHtcbiAgICAgICAgICAgIGFubm90YXRpb24gPSBvcHRpb25zT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnNPckFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG9wZXJhdGlvbjtcbiAgICAgICAgbGV0IGlkO1xuICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcGVyYXRpb24gPSBDcmVhdGVGaWxlLmNyZWF0ZSh1cmksIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWQgPSBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhhbm5vdGF0aW9uKSA/IGFubm90YXRpb24gOiB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5tYW5hZ2UoYW5ub3RhdGlvbik7XG4gICAgICAgICAgICBvcGVyYXRpb24gPSBDcmVhdGVGaWxlLmNyZWF0ZSh1cmksIG9wdGlvbnMsIGlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcy5wdXNoKG9wZXJhdGlvbik7XG4gICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVuYW1lRmlsZShvbGRVcmksIG5ld1VyaSwgb3B0aW9uc09yQW5ub3RhdGlvbiwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLmluaXREb2N1bWVudENoYW5nZXMoKTtcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV29ya3NwYWNlIGVkaXQgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIGRvY3VtZW50IGNoYW5nZXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGFubm90YXRpb247XG4gICAgICAgIGlmIChDaGFuZ2VBbm5vdGF0aW9uLmlzKG9wdGlvbnNPckFubm90YXRpb24pIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKG9wdGlvbnNPckFubm90YXRpb24pKSB7XG4gICAgICAgICAgICBhbm5vdGF0aW9uID0gb3B0aW9uc09yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGxldCBvcGVyYXRpb247XG4gICAgICAgIGxldCBpZDtcbiAgICAgICAgaWYgKGFubm90YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3BlcmF0aW9uID0gUmVuYW1lRmlsZS5jcmVhdGUob2xkVXJpLCBuZXdVcmksIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWQgPSBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhhbm5vdGF0aW9uKSA/IGFubm90YXRpb24gOiB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5tYW5hZ2UoYW5ub3RhdGlvbik7XG4gICAgICAgICAgICBvcGVyYXRpb24gPSBSZW5hbWVGaWxlLmNyZWF0ZShvbGRVcmksIG5ld1VyaSwgb3B0aW9ucywgaWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzLnB1c2gob3BlcmF0aW9uKTtcbiAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBkZWxldGVGaWxlKHVyaSwgb3B0aW9uc09yQW5ub3RhdGlvbiwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLmluaXREb2N1bWVudENoYW5nZXMoKTtcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV29ya3NwYWNlIGVkaXQgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIGRvY3VtZW50IGNoYW5nZXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGFubm90YXRpb247XG4gICAgICAgIGlmIChDaGFuZ2VBbm5vdGF0aW9uLmlzKG9wdGlvbnNPckFubm90YXRpb24pIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKG9wdGlvbnNPckFubm90YXRpb24pKSB7XG4gICAgICAgICAgICBhbm5vdGF0aW9uID0gb3B0aW9uc09yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGxldCBvcGVyYXRpb247XG4gICAgICAgIGxldCBpZDtcbiAgICAgICAgaWYgKGFubm90YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3BlcmF0aW9uID0gRGVsZXRlRmlsZS5jcmVhdGUodXJpLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlkID0gQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoYW5ub3RhdGlvbikgPyBhbm5vdGF0aW9uIDogdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMubWFuYWdlKGFubm90YXRpb24pO1xuICAgICAgICAgICAgb3BlcmF0aW9uID0gRGVsZXRlRmlsZS5jcmVhdGUodXJpLCBvcHRpb25zLCBpZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMucHVzaChvcGVyYXRpb24pO1xuICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9XG4gICAgfVxufVxuLyoqXG4gKiBUaGUgVGV4dERvY3VtZW50SWRlbnRpZmllciBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBUZXh0RG9jdW1lbnRJZGVudGlmaWVyfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBUZXh0RG9jdW1lbnRJZGVudGlmaWVyO1xuKGZ1bmN0aW9uIChUZXh0RG9jdW1lbnRJZGVudGlmaWVyKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBUZXh0RG9jdW1lbnRJZGVudGlmaWVyIGxpdGVyYWwuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgZG9jdW1lbnQncyB1cmkuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHVyaSkge1xuICAgICAgICByZXR1cm4geyB1cmkgfTtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50SWRlbnRpZmllci5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBUZXh0RG9jdW1lbnRJZGVudGlmaWVyfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudXJpKTtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50SWRlbnRpZmllci5pcyA9IGlzO1xufSkoVGV4dERvY3VtZW50SWRlbnRpZmllciB8fCAoVGV4dERvY3VtZW50SWRlbnRpZmllciA9IHt9KSk7XG4vKipcbiAqIFRoZSBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXJ9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXI7XG4oZnVuY3Rpb24gKFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIgbGl0ZXJhbC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSBkb2N1bWVudCdzIHVyaS5cbiAgICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgZG9jdW1lbnQncyB2ZXJzaW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmksIHZlcnNpb24pIHtcbiAgICAgICAgcmV0dXJuIHsgdXJpLCB2ZXJzaW9uIH07XG4gICAgfVxuICAgIFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSkgJiYgSXMuaW50ZWdlcihjYW5kaWRhdGUudmVyc2lvbik7XG4gICAgfVxuICAgIFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIuaXMgPSBpcztcbn0pKFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIgfHwgKFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIgPSB7fSkpO1xuLyoqXG4gKiBUaGUgT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyO1xuKGZ1bmN0aW9uIChPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciBsaXRlcmFsLlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIGRvY3VtZW50J3MgdXJpLlxuICAgICAqIEBwYXJhbSB2ZXJzaW9uIFRoZSBkb2N1bWVudCdzIHZlcnNpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHVyaSwgdmVyc2lvbikge1xuICAgICAgICByZXR1cm4geyB1cmksIHZlcnNpb24gfTtcbiAgICB9XG4gICAgT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSkgJiYgKGNhbmRpZGF0ZS52ZXJzaW9uID09PSBudWxsIHx8IElzLmludGVnZXIoY2FuZGlkYXRlLnZlcnNpb24pKTtcbiAgICB9XG4gICAgT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmlzID0gaXM7XG59KShPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIgfHwgKE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciA9IHt9KSk7XG4vKipcbiAqIFRoZSBUZXh0RG9jdW1lbnRJdGVtIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIFRleHREb2N1bWVudEl0ZW19IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIFRleHREb2N1bWVudEl0ZW07XG4oZnVuY3Rpb24gKFRleHREb2N1bWVudEl0ZW0pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFRleHREb2N1bWVudEl0ZW0gbGl0ZXJhbC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSBkb2N1bWVudCdzIHVyaS5cbiAgICAgKiBAcGFyYW0gbGFuZ3VhZ2VJZCBUaGUgZG9jdW1lbnQncyBsYW5ndWFnZSBpZGVudGlmaWVyLlxuICAgICAqIEBwYXJhbSB2ZXJzaW9uIFRoZSBkb2N1bWVudCdzIHZlcnNpb24gbnVtYmVyLlxuICAgICAqIEBwYXJhbSB0ZXh0IFRoZSBkb2N1bWVudCdzIHRleHQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHVyaSwgbGFuZ3VhZ2VJZCwgdmVyc2lvbiwgdGV4dCkge1xuICAgICAgICByZXR1cm4geyB1cmksIGxhbmd1YWdlSWQsIHZlcnNpb24sIHRleHQgfTtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50SXRlbS5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBUZXh0RG9jdW1lbnRJdGVtfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudXJpKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLmxhbmd1YWdlSWQpICYmIElzLmludGVnZXIoY2FuZGlkYXRlLnZlcnNpb24pICYmIElzLnN0cmluZyhjYW5kaWRhdGUudGV4dCk7XG4gICAgfVxuICAgIFRleHREb2N1bWVudEl0ZW0uaXMgPSBpcztcbn0pKFRleHREb2N1bWVudEl0ZW0gfHwgKFRleHREb2N1bWVudEl0ZW0gPSB7fSkpO1xuLyoqXG4gKiBEZXNjcmliZXMgdGhlIGNvbnRlbnQgdHlwZSB0aGF0IGEgY2xpZW50IHN1cHBvcnRzIGluIHZhcmlvdXNcbiAqIHJlc3VsdCBsaXRlcmFscyBsaWtlIGBIb3ZlcmAsIGBQYXJhbWV0ZXJJbmZvYCBvciBgQ29tcGxldGlvbkl0ZW1gLlxuICpcbiAqIFBsZWFzZSBub3RlIHRoYXQgYE1hcmt1cEtpbmRzYCBtdXN0IG5vdCBzdGFydCB3aXRoIGEgYCRgLiBUaGlzIGtpbmRzXG4gKiBhcmUgcmVzZXJ2ZWQgZm9yIGludGVybmFsIHVzYWdlLlxuICovXG5leHBvcnQgdmFyIE1hcmt1cEtpbmQ7XG4oZnVuY3Rpb24gKE1hcmt1cEtpbmQpIHtcbiAgICAvKipcbiAgICAgKiBQbGFpbiB0ZXh0IGlzIHN1cHBvcnRlZCBhcyBhIGNvbnRlbnQgZm9ybWF0XG4gICAgICovXG4gICAgTWFya3VwS2luZC5QbGFpblRleHQgPSAncGxhaW50ZXh0JztcbiAgICAvKipcbiAgICAgKiBNYXJrZG93biBpcyBzdXBwb3J0ZWQgYXMgYSBjb250ZW50IGZvcm1hdFxuICAgICAqL1xuICAgIE1hcmt1cEtpbmQuTWFya2Rvd24gPSAnbWFya2Rvd24nO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBpcyBhIHZhbHVlIG9mIHRoZSB7QGxpbmsgTWFya3VwS2luZH0gdHlwZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSA9PT0gTWFya3VwS2luZC5QbGFpblRleHQgfHwgY2FuZGlkYXRlID09PSBNYXJrdXBLaW5kLk1hcmtkb3duO1xuICAgIH1cbiAgICBNYXJrdXBLaW5kLmlzID0gaXM7XG59KShNYXJrdXBLaW5kIHx8IChNYXJrdXBLaW5kID0ge30pKTtcbmV4cG9ydCB2YXIgTWFya3VwQ29udGVudDtcbihmdW5jdGlvbiAoTWFya3VwQ29udGVudCkge1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBjb25mb3JtcyB0byB0aGUge0BsaW5rIE1hcmt1cENvbnRlbnR9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwodmFsdWUpICYmIE1hcmt1cEtpbmQuaXMoY2FuZGlkYXRlLmtpbmQpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudmFsdWUpO1xuICAgIH1cbiAgICBNYXJrdXBDb250ZW50LmlzID0gaXM7XG59KShNYXJrdXBDb250ZW50IHx8IChNYXJrdXBDb250ZW50ID0ge30pKTtcbi8qKlxuICogVGhlIGtpbmQgb2YgYSBjb21wbGV0aW9uIGVudHJ5LlxuICovXG5leHBvcnQgdmFyIENvbXBsZXRpb25JdGVtS2luZDtcbihmdW5jdGlvbiAoQ29tcGxldGlvbkl0ZW1LaW5kKSB7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlRleHQgPSAxO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5NZXRob2QgPSAyO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5GdW5jdGlvbiA9IDM7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkNvbnN0cnVjdG9yID0gNDtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuRmllbGQgPSA1O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5WYXJpYWJsZSA9IDY7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkNsYXNzID0gNztcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuSW50ZXJmYWNlID0gODtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuTW9kdWxlID0gOTtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuUHJvcGVydHkgPSAxMDtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuVW5pdCA9IDExO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5WYWx1ZSA9IDEyO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5FbnVtID0gMTM7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLktleXdvcmQgPSAxNDtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuU25pcHBldCA9IDE1O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5Db2xvciA9IDE2O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5GaWxlID0gMTc7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlJlZmVyZW5jZSA9IDE4O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5Gb2xkZXIgPSAxOTtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuRW51bU1lbWJlciA9IDIwO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5Db25zdGFudCA9IDIxO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5TdHJ1Y3QgPSAyMjtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuRXZlbnQgPSAyMztcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuT3BlcmF0b3IgPSAyNDtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuVHlwZVBhcmFtZXRlciA9IDI1O1xufSkoQ29tcGxldGlvbkl0ZW1LaW5kIHx8IChDb21wbGV0aW9uSXRlbUtpbmQgPSB7fSkpO1xuLyoqXG4gKiBEZWZpbmVzIHdoZXRoZXIgdGhlIGluc2VydCB0ZXh0IGluIGEgY29tcGxldGlvbiBpdGVtIHNob3VsZCBiZSBpbnRlcnByZXRlZCBhc1xuICogcGxhaW4gdGV4dCBvciBhIHNuaXBwZXQuXG4gKi9cbmV4cG9ydCB2YXIgSW5zZXJ0VGV4dEZvcm1hdDtcbihmdW5jdGlvbiAoSW5zZXJ0VGV4dEZvcm1hdCkge1xuICAgIC8qKlxuICAgICAqIFRoZSBwcmltYXJ5IHRleHQgdG8gYmUgaW5zZXJ0ZWQgaXMgdHJlYXRlZCBhcyBhIHBsYWluIHN0cmluZy5cbiAgICAgKi9cbiAgICBJbnNlcnRUZXh0Rm9ybWF0LlBsYWluVGV4dCA9IDE7XG4gICAgLyoqXG4gICAgICogVGhlIHByaW1hcnkgdGV4dCB0byBiZSBpbnNlcnRlZCBpcyB0cmVhdGVkIGFzIGEgc25pcHBldC5cbiAgICAgKlxuICAgICAqIEEgc25pcHBldCBjYW4gZGVmaW5lIHRhYiBzdG9wcyBhbmQgcGxhY2Vob2xkZXJzIHdpdGggYCQxYCwgYCQyYFxuICAgICAqIGFuZCBgJHszOmZvb31gLiBgJDBgIGRlZmluZXMgdGhlIGZpbmFsIHRhYiBzdG9wLCBpdCBkZWZhdWx0cyB0b1xuICAgICAqIHRoZSBlbmQgb2YgdGhlIHNuaXBwZXQuIFBsYWNlaG9sZGVycyB3aXRoIGVxdWFsIGlkZW50aWZpZXJzIGFyZSBsaW5rZWQsXG4gICAgICogdGhhdCBpcyB0eXBpbmcgaW4gb25lIHdpbGwgdXBkYXRlIG90aGVycyB0b28uXG4gICAgICpcbiAgICAgKiBTZWUgYWxzbzogaHR0cHM6Ly9taWNyb3NvZnQuZ2l0aHViLmlvL2xhbmd1YWdlLXNlcnZlci1wcm90b2NvbC9zcGVjaWZpY2F0aW9ucy9zcGVjaWZpY2F0aW9uLWN1cnJlbnQvI3NuaXBwZXRfc3ludGF4XG4gICAgICovXG4gICAgSW5zZXJ0VGV4dEZvcm1hdC5TbmlwcGV0ID0gMjtcbn0pKEluc2VydFRleHRGb3JtYXQgfHwgKEluc2VydFRleHRGb3JtYXQgPSB7fSkpO1xuLyoqXG4gKiBDb21wbGV0aW9uIGl0ZW0gdGFncyBhcmUgZXh0cmEgYW5ub3RhdGlvbnMgdGhhdCB0d2VhayB0aGUgcmVuZGVyaW5nIG9mIGEgY29tcGxldGlvblxuICogaXRlbS5cbiAqXG4gKiBAc2luY2UgMy4xNS4wXG4gKi9cbmV4cG9ydCB2YXIgQ29tcGxldGlvbkl0ZW1UYWc7XG4oZnVuY3Rpb24gKENvbXBsZXRpb25JdGVtVGFnKSB7XG4gICAgLyoqXG4gICAgICogUmVuZGVyIGEgY29tcGxldGlvbiBhcyBvYnNvbGV0ZSwgdXN1YWxseSB1c2luZyBhIHN0cmlrZS1vdXQuXG4gICAgICovXG4gICAgQ29tcGxldGlvbkl0ZW1UYWcuRGVwcmVjYXRlZCA9IDE7XG59KShDb21wbGV0aW9uSXRlbVRhZyB8fCAoQ29tcGxldGlvbkl0ZW1UYWcgPSB7fSkpO1xuLyoqXG4gKiBUaGUgSW5zZXJ0UmVwbGFjZUVkaXQgbmFtZXNwYWNlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGggaW5zZXJ0IC8gcmVwbGFjZSBlZGl0cy5cbiAqXG4gKiBAc2luY2UgMy4xNi4wXG4gKi9cbmV4cG9ydCB2YXIgSW5zZXJ0UmVwbGFjZUVkaXQ7XG4oZnVuY3Rpb24gKEluc2VydFJlcGxhY2VFZGl0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBpbnNlcnQgLyByZXBsYWNlIGVkaXRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobmV3VGV4dCwgaW5zZXJ0LCByZXBsYWNlKSB7XG4gICAgICAgIHJldHVybiB7IG5ld1RleHQsIGluc2VydCwgcmVwbGFjZSB9O1xuICAgIH1cbiAgICBJbnNlcnRSZXBsYWNlRWRpdC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBJbnNlcnRSZXBsYWNlRWRpdH0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLnN0cmluZyhjYW5kaWRhdGUubmV3VGV4dCkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLmluc2VydCkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJlcGxhY2UpO1xuICAgIH1cbiAgICBJbnNlcnRSZXBsYWNlRWRpdC5pcyA9IGlzO1xufSkoSW5zZXJ0UmVwbGFjZUVkaXQgfHwgKEluc2VydFJlcGxhY2VFZGl0ID0ge30pKTtcbi8qKlxuICogSG93IHdoaXRlc3BhY2UgYW5kIGluZGVudGF0aW9uIGlzIGhhbmRsZWQgZHVyaW5nIGNvbXBsZXRpb25cbiAqIGl0ZW0gaW5zZXJ0aW9uLlxuICpcbiAqIEBzaW5jZSAzLjE2LjBcbiAqL1xuZXhwb3J0IHZhciBJbnNlcnRUZXh0TW9kZTtcbihmdW5jdGlvbiAoSW5zZXJ0VGV4dE1vZGUpIHtcbiAgICAvKipcbiAgICAgKiBUaGUgaW5zZXJ0aW9uIG9yIHJlcGxhY2Ugc3RyaW5ncyBpcyB0YWtlbiBhcyBpdCBpcy4gSWYgdGhlXG4gICAgICogdmFsdWUgaXMgbXVsdGkgbGluZSB0aGUgbGluZXMgYmVsb3cgdGhlIGN1cnNvciB3aWxsIGJlXG4gICAgICogaW5zZXJ0ZWQgdXNpbmcgdGhlIGluZGVudGF0aW9uIGRlZmluZWQgaW4gdGhlIHN0cmluZyB2YWx1ZS5cbiAgICAgKiBUaGUgY2xpZW50IHdpbGwgbm90IGFwcGx5IGFueSBraW5kIG9mIGFkanVzdG1lbnRzIHRvIHRoZVxuICAgICAqIHN0cmluZy5cbiAgICAgKi9cbiAgICBJbnNlcnRUZXh0TW9kZS5hc0lzID0gMTtcbiAgICAvKipcbiAgICAgKiBUaGUgZWRpdG9yIGFkanVzdHMgbGVhZGluZyB3aGl0ZXNwYWNlIG9mIG5ldyBsaW5lcyBzbyB0aGF0XG4gICAgICogdGhleSBtYXRjaCB0aGUgaW5kZW50YXRpb24gdXAgdG8gdGhlIGN1cnNvciBvZiB0aGUgbGluZSBmb3JcbiAgICAgKiB3aGljaCB0aGUgaXRlbSBpcyBhY2NlcHRlZC5cbiAgICAgKlxuICAgICAqIENvbnNpZGVyIGEgbGluZSBsaWtlIHRoaXM6IDwydGFicz48Y3Vyc29yPjwzdGFicz5mb28uIEFjY2VwdGluZyBhXG4gICAgICogbXVsdGkgbGluZSBjb21wbGV0aW9uIGl0ZW0gaXMgaW5kZW50ZWQgdXNpbmcgMiB0YWJzIGFuZCBhbGxcbiAgICAgKiBmb2xsb3dpbmcgbGluZXMgaW5zZXJ0ZWQgd2lsbCBiZSBpbmRlbnRlZCB1c2luZyAyIHRhYnMgYXMgd2VsbC5cbiAgICAgKi9cbiAgICBJbnNlcnRUZXh0TW9kZS5hZGp1c3RJbmRlbnRhdGlvbiA9IDI7XG59KShJbnNlcnRUZXh0TW9kZSB8fCAoSW5zZXJ0VGV4dE1vZGUgPSB7fSkpO1xuZXhwb3J0IHZhciBDb21wbGV0aW9uSXRlbUxhYmVsRGV0YWlscztcbihmdW5jdGlvbiAoQ29tcGxldGlvbkl0ZW1MYWJlbERldGFpbHMpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiAoSXMuc3RyaW5nKGNhbmRpZGF0ZS5kZXRhaWwpIHx8IGNhbmRpZGF0ZS5kZXRhaWwgPT09IHVuZGVmaW5lZCkgJiZcbiAgICAgICAgICAgIChJcy5zdHJpbmcoY2FuZGlkYXRlLmRlc2NyaXB0aW9uKSB8fCBjYW5kaWRhdGUuZGVzY3JpcHRpb24gPT09IHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIENvbXBsZXRpb25JdGVtTGFiZWxEZXRhaWxzLmlzID0gaXM7XG59KShDb21wbGV0aW9uSXRlbUxhYmVsRGV0YWlscyB8fCAoQ29tcGxldGlvbkl0ZW1MYWJlbERldGFpbHMgPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29tcGxldGlvbkl0ZW0gbmFtZXNwYWNlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGhcbiAqIGNvbXBsZXRpb24gaXRlbXMuXG4gKi9cbmV4cG9ydCB2YXIgQ29tcGxldGlvbkl0ZW07XG4oZnVuY3Rpb24gKENvbXBsZXRpb25JdGVtKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgY29tcGxldGlvbiBpdGVtIGFuZCBzZWVkIGl0IHdpdGggYSBsYWJlbC5cbiAgICAgKiBAcGFyYW0gbGFiZWwgVGhlIGNvbXBsZXRpb24gaXRlbSdzIGxhYmVsXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGxhYmVsKSB7XG4gICAgICAgIHJldHVybiB7IGxhYmVsIH07XG4gICAgfVxuICAgIENvbXBsZXRpb25JdGVtLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKENvbXBsZXRpb25JdGVtIHx8IChDb21wbGV0aW9uSXRlbSA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb21wbGV0aW9uTGlzdCBuYW1lc3BhY2UgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aFxuICogY29tcGxldGlvbiBsaXN0cy5cbiAqL1xuZXhwb3J0IHZhciBDb21wbGV0aW9uTGlzdDtcbihmdW5jdGlvbiAoQ29tcGxldGlvbkxpc3QpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGNvbXBsZXRpb24gbGlzdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBpdGVtcyBUaGUgY29tcGxldGlvbiBpdGVtcy5cbiAgICAgKiBAcGFyYW0gaXNJbmNvbXBsZXRlIFRoZSBsaXN0IGlzIG5vdCBjb21wbGV0ZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUoaXRlbXMsIGlzSW5jb21wbGV0ZSkge1xuICAgICAgICByZXR1cm4geyBpdGVtczogaXRlbXMgPyBpdGVtcyA6IFtdLCBpc0luY29tcGxldGU6ICEhaXNJbmNvbXBsZXRlIH07XG4gICAgfVxuICAgIENvbXBsZXRpb25MaXN0LmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKENvbXBsZXRpb25MaXN0IHx8IChDb21wbGV0aW9uTGlzdCA9IHt9KSk7XG5leHBvcnQgdmFyIE1hcmtlZFN0cmluZztcbihmdW5jdGlvbiAoTWFya2VkU3RyaW5nKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG1hcmtlZCBzdHJpbmcgZnJvbSBwbGFpbiB0ZXh0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHBsYWluVGV4dCBUaGUgcGxhaW4gdGV4dC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBmcm9tUGxhaW5UZXh0KHBsYWluVGV4dCkge1xuICAgICAgICByZXR1cm4gcGxhaW5UZXh0LnJlcGxhY2UoL1tcXFxcYCpfe31bXFxdKCkjK1xcLS4hXS9nLCAnXFxcXCQmJyk7IC8vIGVzY2FwZSBtYXJrZG93biBzeW50YXggdG9rZW5zOiBodHRwOi8vZGFyaW5nZmlyZWJhbGwubmV0L3Byb2plY3RzL21hcmtkb3duL3N5bnRheCNiYWNrc2xhc2hcbiAgICB9XG4gICAgTWFya2VkU3RyaW5nLmZyb21QbGFpblRleHQgPSBmcm9tUGxhaW5UZXh0O1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBjb25mb3JtcyB0byB0aGUge0BsaW5rIE1hcmtlZFN0cmluZ30gdHlwZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLnN0cmluZyhjYW5kaWRhdGUpIHx8IChJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5sYW5ndWFnZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS52YWx1ZSkpO1xuICAgIH1cbiAgICBNYXJrZWRTdHJpbmcuaXMgPSBpcztcbn0pKE1hcmtlZFN0cmluZyB8fCAoTWFya2VkU3RyaW5nID0ge30pKTtcbmV4cG9ydCB2YXIgSG92ZXI7XG4oZnVuY3Rpb24gKEhvdmVyKSB7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgSG92ZXJ9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiAhIWNhbmRpZGF0ZSAmJiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgKE1hcmt1cENvbnRlbnQuaXMoY2FuZGlkYXRlLmNvbnRlbnRzKSB8fFxuICAgICAgICAgICAgTWFya2VkU3RyaW5nLmlzKGNhbmRpZGF0ZS5jb250ZW50cykgfHxcbiAgICAgICAgICAgIElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLmNvbnRlbnRzLCBNYXJrZWRTdHJpbmcuaXMpKSAmJiAodmFsdWUucmFuZ2UgPT09IHVuZGVmaW5lZCB8fCBSYW5nZS5pcyh2YWx1ZS5yYW5nZSkpO1xuICAgIH1cbiAgICBIb3Zlci5pcyA9IGlzO1xufSkoSG92ZXIgfHwgKEhvdmVyID0ge30pKTtcbi8qKlxuICogVGhlIFBhcmFtZXRlckluZm9ybWF0aW9uIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIFBhcmFtZXRlckluZm9ybWF0aW9ufSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBQYXJhbWV0ZXJJbmZvcm1hdGlvbjtcbihmdW5jdGlvbiAoUGFyYW1ldGVySW5mb3JtYXRpb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHBhcmFtZXRlciBpbmZvcm1hdGlvbiBsaXRlcmFsLlxuICAgICAqXG4gICAgICogQHBhcmFtIGxhYmVsIEEgbGFiZWwgc3RyaW5nLlxuICAgICAqIEBwYXJhbSBkb2N1bWVudGF0aW9uIEEgZG9jIHN0cmluZy5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobGFiZWwsIGRvY3VtZW50YXRpb24pIHtcbiAgICAgICAgcmV0dXJuIGRvY3VtZW50YXRpb24gPyB7IGxhYmVsLCBkb2N1bWVudGF0aW9uIH0gOiB7IGxhYmVsIH07XG4gICAgfVxuICAgIFBhcmFtZXRlckluZm9ybWF0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKFBhcmFtZXRlckluZm9ybWF0aW9uIHx8IChQYXJhbWV0ZXJJbmZvcm1hdGlvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBTaWduYXR1cmVJbmZvcm1hdGlvbiBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBTaWduYXR1cmVJbmZvcm1hdGlvbn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgU2lnbmF0dXJlSW5mb3JtYXRpb247XG4oZnVuY3Rpb24gKFNpZ25hdHVyZUluZm9ybWF0aW9uKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKGxhYmVsLCBkb2N1bWVudGF0aW9uLCAuLi5wYXJhbWV0ZXJzKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IGxhYmVsIH07XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKGRvY3VtZW50YXRpb24pKSB7XG4gICAgICAgICAgICByZXN1bHQuZG9jdW1lbnRhdGlvbiA9IGRvY3VtZW50YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzLmRlZmluZWQocGFyYW1ldGVycykpIHtcbiAgICAgICAgICAgIHJlc3VsdC5wYXJhbWV0ZXJzID0gcGFyYW1ldGVycztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdC5wYXJhbWV0ZXJzID0gW107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgU2lnbmF0dXJlSW5mb3JtYXRpb24uY3JlYXRlID0gY3JlYXRlO1xufSkoU2lnbmF0dXJlSW5mb3JtYXRpb24gfHwgKFNpZ25hdHVyZUluZm9ybWF0aW9uID0ge30pKTtcbi8qKlxuICogQSBkb2N1bWVudCBoaWdobGlnaHQga2luZC5cbiAqL1xuZXhwb3J0IHZhciBEb2N1bWVudEhpZ2hsaWdodEtpbmQ7XG4oZnVuY3Rpb24gKERvY3VtZW50SGlnaGxpZ2h0S2luZCkge1xuICAgIC8qKlxuICAgICAqIEEgdGV4dHVhbCBvY2N1cnJlbmNlLlxuICAgICAqL1xuICAgIERvY3VtZW50SGlnaGxpZ2h0S2luZC5UZXh0ID0gMTtcbiAgICAvKipcbiAgICAgKiBSZWFkLWFjY2VzcyBvZiBhIHN5bWJvbCwgbGlrZSByZWFkaW5nIGEgdmFyaWFibGUuXG4gICAgICovXG4gICAgRG9jdW1lbnRIaWdobGlnaHRLaW5kLlJlYWQgPSAyO1xuICAgIC8qKlxuICAgICAqIFdyaXRlLWFjY2VzcyBvZiBhIHN5bWJvbCwgbGlrZSB3cml0aW5nIHRvIGEgdmFyaWFibGUuXG4gICAgICovXG4gICAgRG9jdW1lbnRIaWdobGlnaHRLaW5kLldyaXRlID0gMztcbn0pKERvY3VtZW50SGlnaGxpZ2h0S2luZCB8fCAoRG9jdW1lbnRIaWdobGlnaHRLaW5kID0ge30pKTtcbi8qKlxuICogRG9jdW1lbnRIaWdobGlnaHQgbmFtZXNwYWNlIHRvIHByb3ZpZGUgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBEb2N1bWVudEhpZ2hsaWdodH0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgRG9jdW1lbnRIaWdobGlnaHQ7XG4oZnVuY3Rpb24gKERvY3VtZW50SGlnaGxpZ2h0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgRG9jdW1lbnRIaWdobGlnaHQgb2JqZWN0LlxuICAgICAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2UgdGhlIGhpZ2hsaWdodCBhcHBsaWVzIHRvLlxuICAgICAqIEBwYXJhbSBraW5kIFRoZSBoaWdobGlnaHQga2luZFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwga2luZCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0geyByYW5nZSB9O1xuICAgICAgICBpZiAoSXMubnVtYmVyKGtpbmQpKSB7XG4gICAgICAgICAgICByZXN1bHQua2luZCA9IGtpbmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgRG9jdW1lbnRIaWdobGlnaHQuY3JlYXRlID0gY3JlYXRlO1xufSkoRG9jdW1lbnRIaWdobGlnaHQgfHwgKERvY3VtZW50SGlnaGxpZ2h0ID0ge30pKTtcbi8qKlxuICogQSBzeW1ib2wga2luZC5cbiAqL1xuZXhwb3J0IHZhciBTeW1ib2xLaW5kO1xuKGZ1bmN0aW9uIChTeW1ib2xLaW5kKSB7XG4gICAgU3ltYm9sS2luZC5GaWxlID0gMTtcbiAgICBTeW1ib2xLaW5kLk1vZHVsZSA9IDI7XG4gICAgU3ltYm9sS2luZC5OYW1lc3BhY2UgPSAzO1xuICAgIFN5bWJvbEtpbmQuUGFja2FnZSA9IDQ7XG4gICAgU3ltYm9sS2luZC5DbGFzcyA9IDU7XG4gICAgU3ltYm9sS2luZC5NZXRob2QgPSA2O1xuICAgIFN5bWJvbEtpbmQuUHJvcGVydHkgPSA3O1xuICAgIFN5bWJvbEtpbmQuRmllbGQgPSA4O1xuICAgIFN5bWJvbEtpbmQuQ29uc3RydWN0b3IgPSA5O1xuICAgIFN5bWJvbEtpbmQuRW51bSA9IDEwO1xuICAgIFN5bWJvbEtpbmQuSW50ZXJmYWNlID0gMTE7XG4gICAgU3ltYm9sS2luZC5GdW5jdGlvbiA9IDEyO1xuICAgIFN5bWJvbEtpbmQuVmFyaWFibGUgPSAxMztcbiAgICBTeW1ib2xLaW5kLkNvbnN0YW50ID0gMTQ7XG4gICAgU3ltYm9sS2luZC5TdHJpbmcgPSAxNTtcbiAgICBTeW1ib2xLaW5kLk51bWJlciA9IDE2O1xuICAgIFN5bWJvbEtpbmQuQm9vbGVhbiA9IDE3O1xuICAgIFN5bWJvbEtpbmQuQXJyYXkgPSAxODtcbiAgICBTeW1ib2xLaW5kLk9iamVjdCA9IDE5O1xuICAgIFN5bWJvbEtpbmQuS2V5ID0gMjA7XG4gICAgU3ltYm9sS2luZC5OdWxsID0gMjE7XG4gICAgU3ltYm9sS2luZC5FbnVtTWVtYmVyID0gMjI7XG4gICAgU3ltYm9sS2luZC5TdHJ1Y3QgPSAyMztcbiAgICBTeW1ib2xLaW5kLkV2ZW50ID0gMjQ7XG4gICAgU3ltYm9sS2luZC5PcGVyYXRvciA9IDI1O1xuICAgIFN5bWJvbEtpbmQuVHlwZVBhcmFtZXRlciA9IDI2O1xufSkoU3ltYm9sS2luZCB8fCAoU3ltYm9sS2luZCA9IHt9KSk7XG4vKipcbiAqIFN5bWJvbCB0YWdzIGFyZSBleHRyYSBhbm5vdGF0aW9ucyB0aGF0IHR3ZWFrIHRoZSByZW5kZXJpbmcgb2YgYSBzeW1ib2wuXG4gKlxuICogQHNpbmNlIDMuMTZcbiAqL1xuZXhwb3J0IHZhciBTeW1ib2xUYWc7XG4oZnVuY3Rpb24gKFN5bWJvbFRhZykge1xuICAgIC8qKlxuICAgICAqIFJlbmRlciBhIHN5bWJvbCBhcyBvYnNvbGV0ZSwgdXN1YWxseSB1c2luZyBhIHN0cmlrZS1vdXQuXG4gICAgICovXG4gICAgU3ltYm9sVGFnLkRlcHJlY2F0ZWQgPSAxO1xufSkoU3ltYm9sVGFnIHx8IChTeW1ib2xUYWcgPSB7fSkpO1xuZXhwb3J0IHZhciBTeW1ib2xJbmZvcm1hdGlvbjtcbihmdW5jdGlvbiAoU3ltYm9sSW5mb3JtYXRpb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHN5bWJvbCBpbmZvcm1hdGlvbiBsaXRlcmFsLlxuICAgICAqXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0ga2luZCBUaGUga2luZCBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2Ugb2YgdGhlIGxvY2F0aW9uIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgcmVzb3VyY2Ugb2YgdGhlIGxvY2F0aW9uIG9mIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gY29udGFpbmVyTmFtZSBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sIGNvbnRhaW5pbmcgdGhlIHN5bWJvbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobmFtZSwga2luZCwgcmFuZ2UsIHVyaSwgY29udGFpbmVyTmFtZSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGtpbmQsXG4gICAgICAgICAgICBsb2NhdGlvbjogeyB1cmksIHJhbmdlIH1cbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGNvbnRhaW5lck5hbWUpIHtcbiAgICAgICAgICAgIHJlc3VsdC5jb250YWluZXJOYW1lID0gY29udGFpbmVyTmFtZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBTeW1ib2xJbmZvcm1hdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG59KShTeW1ib2xJbmZvcm1hdGlvbiB8fCAoU3ltYm9sSW5mb3JtYXRpb24gPSB7fSkpO1xuZXhwb3J0IHZhciBXb3Jrc3BhY2VTeW1ib2w7XG4oZnVuY3Rpb24gKFdvcmtzcGFjZVN5bWJvbCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIG5ldyB3b3Jrc3BhY2Ugc3ltYm9sLlxuICAgICAqXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0ga2luZCBUaGUga2luZCBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIHJlc291cmNlIG9mIHRoZSBsb2NhdGlvbiBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSByYW5nZSBBbiBvcHRpb25zIHJhbmdlIG9mIHRoZSBsb2NhdGlvbi5cbiAgICAgKiBAcmV0dXJucyBBIFdvcmtzcGFjZVN5bWJvbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobmFtZSwga2luZCwgdXJpLCByYW5nZSkge1xuICAgICAgICByZXR1cm4gcmFuZ2UgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgPyB7IG5hbWUsIGtpbmQsIGxvY2F0aW9uOiB7IHVyaSwgcmFuZ2UgfSB9XG4gICAgICAgICAgICA6IHsgbmFtZSwga2luZCwgbG9jYXRpb246IHsgdXJpIH0gfTtcbiAgICB9XG4gICAgV29ya3NwYWNlU3ltYm9sLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKFdvcmtzcGFjZVN5bWJvbCB8fCAoV29ya3NwYWNlU3ltYm9sID0ge30pKTtcbmV4cG9ydCB2YXIgRG9jdW1lbnRTeW1ib2w7XG4oZnVuY3Rpb24gKERvY3VtZW50U3ltYm9sKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBzeW1ib2wgaW5mb3JtYXRpb24gbGl0ZXJhbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIGRldGFpbCBUaGUgZGV0YWlsIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIGtpbmQgVGhlIGtpbmQgb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIHNlbGVjdGlvblJhbmdlIFRoZSBzZWxlY3Rpb25SYW5nZSBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSBjaGlsZHJlbiBDaGlsZHJlbiBvZiB0aGUgc3ltYm9sLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShuYW1lLCBkZXRhaWwsIGtpbmQsIHJhbmdlLCBzZWxlY3Rpb25SYW5nZSwgY2hpbGRyZW4pIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBkZXRhaWwsXG4gICAgICAgICAgICBraW5kLFxuICAgICAgICAgICAgcmFuZ2UsXG4gICAgICAgICAgICBzZWxlY3Rpb25SYW5nZVxuICAgICAgICB9O1xuICAgICAgICBpZiAoY2hpbGRyZW4gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmNoaWxkcmVuID0gY2hpbGRyZW47XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgRG9jdW1lbnRTeW1ib2wuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgRG9jdW1lbnRTeW1ib2x9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiZcbiAgICAgICAgICAgIElzLnN0cmluZyhjYW5kaWRhdGUubmFtZSkgJiYgSXMubnVtYmVyKGNhbmRpZGF0ZS5raW5kKSAmJlxuICAgICAgICAgICAgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUuc2VsZWN0aW9uUmFuZ2UpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmRldGFpbCA9PT0gdW5kZWZpbmVkIHx8IElzLnN0cmluZyhjYW5kaWRhdGUuZGV0YWlsKSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuZGVwcmVjYXRlZCA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLmRlcHJlY2F0ZWQpKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5jaGlsZHJlbiA9PT0gdW5kZWZpbmVkIHx8IEFycmF5LmlzQXJyYXkoY2FuZGlkYXRlLmNoaWxkcmVuKSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUudGFncyA9PT0gdW5kZWZpbmVkIHx8IEFycmF5LmlzQXJyYXkoY2FuZGlkYXRlLnRhZ3MpKTtcbiAgICB9XG4gICAgRG9jdW1lbnRTeW1ib2wuaXMgPSBpcztcbn0pKERvY3VtZW50U3ltYm9sIHx8IChEb2N1bWVudFN5bWJvbCA9IHt9KSk7XG4vKipcbiAqIEEgc2V0IG9mIHByZWRlZmluZWQgY29kZSBhY3Rpb24ga2luZHNcbiAqL1xuZXhwb3J0IHZhciBDb2RlQWN0aW9uS2luZDtcbihmdW5jdGlvbiAoQ29kZUFjdGlvbktpbmQpIHtcbiAgICAvKipcbiAgICAgKiBFbXB0eSBraW5kLlxuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLkVtcHR5ID0gJyc7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciBxdWlja2ZpeCBhY3Rpb25zOiAncXVpY2tmaXgnXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuUXVpY2tGaXggPSAncXVpY2tmaXgnO1xuICAgIC8qKlxuICAgICAqIEJhc2Uga2luZCBmb3IgcmVmYWN0b3JpbmcgYWN0aW9uczogJ3JlZmFjdG9yJ1xuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlJlZmFjdG9yID0gJ3JlZmFjdG9yJztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIHJlZmFjdG9yaW5nIGV4dHJhY3Rpb24gYWN0aW9uczogJ3JlZmFjdG9yLmV4dHJhY3QnXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIGV4dHJhY3QgYWN0aW9uczpcbiAgICAgKlxuICAgICAqIC0gRXh0cmFjdCBtZXRob2RcbiAgICAgKiAtIEV4dHJhY3QgZnVuY3Rpb25cbiAgICAgKiAtIEV4dHJhY3QgdmFyaWFibGVcbiAgICAgKiAtIEV4dHJhY3QgaW50ZXJmYWNlIGZyb20gY2xhc3NcbiAgICAgKiAtIC4uLlxuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlJlZmFjdG9yRXh0cmFjdCA9ICdyZWZhY3Rvci5leHRyYWN0JztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIHJlZmFjdG9yaW5nIGlubGluZSBhY3Rpb25zOiAncmVmYWN0b3IuaW5saW5lJ1xuICAgICAqXG4gICAgICogRXhhbXBsZSBpbmxpbmUgYWN0aW9uczpcbiAgICAgKlxuICAgICAqIC0gSW5saW5lIGZ1bmN0aW9uXG4gICAgICogLSBJbmxpbmUgdmFyaWFibGVcbiAgICAgKiAtIElubGluZSBjb25zdGFudFxuICAgICAqIC0gLi4uXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuUmVmYWN0b3JJbmxpbmUgPSAncmVmYWN0b3IuaW5saW5lJztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIHJlZmFjdG9yaW5nIHJld3JpdGUgYWN0aW9uczogJ3JlZmFjdG9yLnJld3JpdGUnXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIHJld3JpdGUgYWN0aW9uczpcbiAgICAgKlxuICAgICAqIC0gQ29udmVydCBKYXZhU2NyaXB0IGZ1bmN0aW9uIHRvIGNsYXNzXG4gICAgICogLSBBZGQgb3IgcmVtb3ZlIHBhcmFtZXRlclxuICAgICAqIC0gRW5jYXBzdWxhdGUgZmllbGRcbiAgICAgKiAtIE1ha2UgbWV0aG9kIHN0YXRpY1xuICAgICAqIC0gTW92ZSBtZXRob2QgdG8gYmFzZSBjbGFzc1xuICAgICAqIC0gLi4uXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuUmVmYWN0b3JSZXdyaXRlID0gJ3JlZmFjdG9yLnJld3JpdGUnO1xuICAgIC8qKlxuICAgICAqIEJhc2Uga2luZCBmb3Igc291cmNlIGFjdGlvbnM6IGBzb3VyY2VgXG4gICAgICpcbiAgICAgKiBTb3VyY2UgY29kZSBhY3Rpb25zIGFwcGx5IHRvIHRoZSBlbnRpcmUgZmlsZS5cbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5Tb3VyY2UgPSAnc291cmNlJztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIGFuIG9yZ2FuaXplIGltcG9ydHMgc291cmNlIGFjdGlvbjogYHNvdXJjZS5vcmdhbml6ZUltcG9ydHNgXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuU291cmNlT3JnYW5pemVJbXBvcnRzID0gJ3NvdXJjZS5vcmdhbml6ZUltcG9ydHMnO1xuICAgIC8qKlxuICAgICAqIEJhc2Uga2luZCBmb3IgYXV0by1maXggc291cmNlIGFjdGlvbnM6IGBzb3VyY2UuZml4QWxsYC5cbiAgICAgKlxuICAgICAqIEZpeCBhbGwgYWN0aW9ucyBhdXRvbWF0aWNhbGx5IGZpeCBlcnJvcnMgdGhhdCBoYXZlIGEgY2xlYXIgZml4IHRoYXQgZG8gbm90IHJlcXVpcmUgdXNlciBpbnB1dC5cbiAgICAgKiBUaGV5IHNob3VsZCBub3Qgc3VwcHJlc3MgZXJyb3JzIG9yIHBlcmZvcm0gdW5zYWZlIGZpeGVzIHN1Y2ggYXMgZ2VuZXJhdGluZyBuZXcgdHlwZXMgb3IgY2xhc3Nlcy5cbiAgICAgKlxuICAgICAqIEBzaW5jZSAzLjE1LjBcbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5Tb3VyY2VGaXhBbGwgPSAnc291cmNlLmZpeEFsbCc7XG59KShDb2RlQWN0aW9uS2luZCB8fCAoQ29kZUFjdGlvbktpbmQgPSB7fSkpO1xuLyoqXG4gKiBUaGUgcmVhc29uIHdoeSBjb2RlIGFjdGlvbnMgd2VyZSByZXF1ZXN0ZWQuXG4gKlxuICogQHNpbmNlIDMuMTcuMFxuICovXG5leHBvcnQgdmFyIENvZGVBY3Rpb25UcmlnZ2VyS2luZDtcbihmdW5jdGlvbiAoQ29kZUFjdGlvblRyaWdnZXJLaW5kKSB7XG4gICAgLyoqXG4gICAgICogQ29kZSBhY3Rpb25zIHdlcmUgZXhwbGljaXRseSByZXF1ZXN0ZWQgYnkgdGhlIHVzZXIgb3IgYnkgYW4gZXh0ZW5zaW9uLlxuICAgICAqL1xuICAgIENvZGVBY3Rpb25UcmlnZ2VyS2luZC5JbnZva2VkID0gMTtcbiAgICAvKipcbiAgICAgKiBDb2RlIGFjdGlvbnMgd2VyZSByZXF1ZXN0ZWQgYXV0b21hdGljYWxseS5cbiAgICAgKlxuICAgICAqIFRoaXMgdHlwaWNhbGx5IGhhcHBlbnMgd2hlbiBjdXJyZW50IHNlbGVjdGlvbiBpbiBhIGZpbGUgY2hhbmdlcywgYnV0IGNhblxuICAgICAqIGFsc28gYmUgdHJpZ2dlcmVkIHdoZW4gZmlsZSBjb250ZW50IGNoYW5nZXMuXG4gICAgICovXG4gICAgQ29kZUFjdGlvblRyaWdnZXJLaW5kLkF1dG9tYXRpYyA9IDI7XG59KShDb2RlQWN0aW9uVHJpZ2dlcktpbmQgfHwgKENvZGVBY3Rpb25UcmlnZ2VyS2luZCA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb2RlQWN0aW9uQ29udGV4dCBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBDb2RlQWN0aW9uQ29udGV4dH0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgQ29kZUFjdGlvbkNvbnRleHQ7XG4oZnVuY3Rpb24gKENvZGVBY3Rpb25Db250ZXh0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDb2RlQWN0aW9uQ29udGV4dCBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShkaWFnbm9zdGljcywgb25seSwgdHJpZ2dlcktpbmQpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHsgZGlhZ25vc3RpY3MgfTtcbiAgICAgICAgaWYgKG9ubHkgIT09IHVuZGVmaW5lZCAmJiBvbmx5ICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXN1bHQub25seSA9IG9ubHk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyaWdnZXJLaW5kICE9PSB1bmRlZmluZWQgJiYgdHJpZ2dlcktpbmQgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJlc3VsdC50cmlnZ2VyS2luZCA9IHRyaWdnZXJLaW5kO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIENvZGVBY3Rpb25Db250ZXh0LmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIENvZGVBY3Rpb25Db250ZXh0fSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLmRpYWdub3N0aWNzLCBEaWFnbm9zdGljLmlzKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS5vbmx5ID09PSB1bmRlZmluZWQgfHwgSXMudHlwZWRBcnJheShjYW5kaWRhdGUub25seSwgSXMuc3RyaW5nKSlcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUudHJpZ2dlcktpbmQgPT09IHVuZGVmaW5lZCB8fCBjYW5kaWRhdGUudHJpZ2dlcktpbmQgPT09IENvZGVBY3Rpb25UcmlnZ2VyS2luZC5JbnZva2VkIHx8IGNhbmRpZGF0ZS50cmlnZ2VyS2luZCA9PT0gQ29kZUFjdGlvblRyaWdnZXJLaW5kLkF1dG9tYXRpYyk7XG4gICAgfVxuICAgIENvZGVBY3Rpb25Db250ZXh0LmlzID0gaXM7XG59KShDb2RlQWN0aW9uQ29udGV4dCB8fCAoQ29kZUFjdGlvbkNvbnRleHQgPSB7fSkpO1xuZXhwb3J0IHZhciBDb2RlQWN0aW9uO1xuKGZ1bmN0aW9uIChDb2RlQWN0aW9uKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKHRpdGxlLCBraW5kT3JDb21tYW5kT3JFZGl0LCBraW5kKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IHRpdGxlIH07XG4gICAgICAgIGxldCBjaGVja0tpbmQgPSB0cnVlO1xuICAgICAgICBpZiAodHlwZW9mIGtpbmRPckNvbW1hbmRPckVkaXQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBjaGVja0tpbmQgPSBmYWxzZTtcbiAgICAgICAgICAgIHJlc3VsdC5raW5kID0ga2luZE9yQ29tbWFuZE9yRWRpdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChDb21tYW5kLmlzKGtpbmRPckNvbW1hbmRPckVkaXQpKSB7XG4gICAgICAgICAgICByZXN1bHQuY29tbWFuZCA9IGtpbmRPckNvbW1hbmRPckVkaXQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQuZWRpdCA9IGtpbmRPckNvbW1hbmRPckVkaXQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoZWNrS2luZCAmJiBraW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5raW5kID0ga2luZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBDb2RlQWN0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS50aXRsZSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuZGlhZ25vc3RpY3MgPT09IHVuZGVmaW5lZCB8fCBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS5kaWFnbm9zdGljcywgRGlhZ25vc3RpYy5pcykpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmtpbmQgPT09IHVuZGVmaW5lZCB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLmtpbmQpKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5lZGl0ICE9PSB1bmRlZmluZWQgfHwgY2FuZGlkYXRlLmNvbW1hbmQgIT09IHVuZGVmaW5lZCkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuY29tbWFuZCA9PT0gdW5kZWZpbmVkIHx8IENvbW1hbmQuaXMoY2FuZGlkYXRlLmNvbW1hbmQpKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5pc1ByZWZlcnJlZCA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLmlzUHJlZmVycmVkKSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuZWRpdCA9PT0gdW5kZWZpbmVkIHx8IFdvcmtzcGFjZUVkaXQuaXMoY2FuZGlkYXRlLmVkaXQpKTtcbiAgICB9XG4gICAgQ29kZUFjdGlvbi5pcyA9IGlzO1xufSkoQ29kZUFjdGlvbiB8fCAoQ29kZUFjdGlvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb2RlTGVucyBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBDb2RlTGVuc30gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgQ29kZUxlbnM7XG4oZnVuY3Rpb24gKENvZGVMZW5zKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDb2RlTGVucyBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgZGF0YSkge1xuICAgICAgICBsZXQgcmVzdWx0ID0geyByYW5nZSB9O1xuICAgICAgICBpZiAoSXMuZGVmaW5lZChkYXRhKSkge1xuICAgICAgICAgICAgcmVzdWx0LmRhdGEgPSBkYXRhO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIENvZGVMZW5zLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIENvZGVMZW5zfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUuY29tbWFuZCkgfHwgQ29tbWFuZC5pcyhjYW5kaWRhdGUuY29tbWFuZCkpO1xuICAgIH1cbiAgICBDb2RlTGVucy5pcyA9IGlzO1xufSkoQ29kZUxlbnMgfHwgKENvZGVMZW5zID0ge30pKTtcbi8qKlxuICogVGhlIEZvcm1hdHRpbmdPcHRpb25zIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIEZvcm1hdHRpbmdPcHRpb25zfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBGb3JtYXR0aW5nT3B0aW9ucztcbihmdW5jdGlvbiAoRm9ybWF0dGluZ09wdGlvbnMpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IEZvcm1hdHRpbmdPcHRpb25zIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHRhYlNpemUsIGluc2VydFNwYWNlcykge1xuICAgICAgICByZXR1cm4geyB0YWJTaXplLCBpbnNlcnRTcGFjZXMgfTtcbiAgICB9XG4gICAgRm9ybWF0dGluZ09wdGlvbnMuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgRm9ybWF0dGluZ09wdGlvbnN9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMudWludGVnZXIoY2FuZGlkYXRlLnRhYlNpemUpICYmIElzLmJvb2xlYW4oY2FuZGlkYXRlLmluc2VydFNwYWNlcyk7XG4gICAgfVxuICAgIEZvcm1hdHRpbmdPcHRpb25zLmlzID0gaXM7XG59KShGb3JtYXR0aW5nT3B0aW9ucyB8fCAoRm9ybWF0dGluZ09wdGlvbnMgPSB7fSkpO1xuLyoqXG4gKiBUaGUgRG9jdW1lbnRMaW5rIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIERvY3VtZW50TGlua30gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgRG9jdW1lbnRMaW5rO1xuKGZ1bmN0aW9uIChEb2N1bWVudExpbmspIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IERvY3VtZW50TGluayBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgdGFyZ2V0LCBkYXRhKSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCB0YXJnZXQsIGRhdGEgfTtcbiAgICB9XG4gICAgRG9jdW1lbnRMaW5rLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIERvY3VtZW50TGlua30gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLnRhcmdldCkgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS50YXJnZXQpKTtcbiAgICB9XG4gICAgRG9jdW1lbnRMaW5rLmlzID0gaXM7XG59KShEb2N1bWVudExpbmsgfHwgKERvY3VtZW50TGluayA9IHt9KSk7XG4vKipcbiAqIFRoZSBTZWxlY3Rpb25SYW5nZSBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9uIHRvIHdvcmsgd2l0aFxuICogU2VsZWN0aW9uUmFuZ2UgbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgU2VsZWN0aW9uUmFuZ2U7XG4oZnVuY3Rpb24gKFNlbGVjdGlvblJhbmdlKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBTZWxlY3Rpb25SYW5nZVxuICAgICAqIEBwYXJhbSByYW5nZSB0aGUgcmFuZ2UuXG4gICAgICogQHBhcmFtIHBhcmVudCBhbiBvcHRpb25hbCBwYXJlbnQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCBwYXJlbnQpIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIHBhcmVudCB9O1xuICAgIH1cbiAgICBTZWxlY3Rpb25SYW5nZS5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgKGNhbmRpZGF0ZS5wYXJlbnQgPT09IHVuZGVmaW5lZCB8fCBTZWxlY3Rpb25SYW5nZS5pcyhjYW5kaWRhdGUucGFyZW50KSk7XG4gICAgfVxuICAgIFNlbGVjdGlvblJhbmdlLmlzID0gaXM7XG59KShTZWxlY3Rpb25SYW5nZSB8fCAoU2VsZWN0aW9uUmFuZ2UgPSB7fSkpO1xuLyoqXG4gKiBBIHNldCBvZiBwcmVkZWZpbmVkIHRva2VuIHR5cGVzLiBUaGlzIHNldCBpcyBub3QgZml4ZWRcbiAqIGFuIGNsaWVudHMgY2FuIHNwZWNpZnkgYWRkaXRpb25hbCB0b2tlbiB0eXBlcyB2aWEgdGhlXG4gKiBjb3JyZXNwb25kaW5nIGNsaWVudCBjYXBhYmlsaXRpZXMuXG4gKlxuICogQHNpbmNlIDMuMTYuMFxuICovXG5leHBvcnQgdmFyIFNlbWFudGljVG9rZW5UeXBlcztcbihmdW5jdGlvbiAoU2VtYW50aWNUb2tlblR5cGVzKSB7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wibmFtZXNwYWNlXCJdID0gXCJuYW1lc3BhY2VcIjtcbiAgICAvKipcbiAgICAgKiBSZXByZXNlbnRzIGEgZ2VuZXJpYyB0eXBlLiBBY3RzIGFzIGEgZmFsbGJhY2sgZm9yIHR5cGVzIHdoaWNoIGNhbid0IGJlIG1hcHBlZCB0b1xuICAgICAqIGEgc3BlY2lmaWMgdHlwZSBsaWtlIGNsYXNzIG9yIGVudW0uXG4gICAgICovXG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1widHlwZVwiXSA9IFwidHlwZVwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImNsYXNzXCJdID0gXCJjbGFzc1wiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImVudW1cIl0gPSBcImVudW1cIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJpbnRlcmZhY2VcIl0gPSBcImludGVyZmFjZVwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInN0cnVjdFwiXSA9IFwic3RydWN0XCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1widHlwZVBhcmFtZXRlclwiXSA9IFwidHlwZVBhcmFtZXRlclwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInBhcmFtZXRlclwiXSA9IFwicGFyYW1ldGVyXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1widmFyaWFibGVcIl0gPSBcInZhcmlhYmxlXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wicHJvcGVydHlcIl0gPSBcInByb3BlcnR5XCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wiZW51bU1lbWJlclwiXSA9IFwiZW51bU1lbWJlclwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImV2ZW50XCJdID0gXCJldmVudFwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImZ1bmN0aW9uXCJdID0gXCJmdW5jdGlvblwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcIm1ldGhvZFwiXSA9IFwibWV0aG9kXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wibWFjcm9cIl0gPSBcIm1hY3JvXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wia2V5d29yZFwiXSA9IFwia2V5d29yZFwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcIm1vZGlmaWVyXCJdID0gXCJtb2RpZmllclwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImNvbW1lbnRcIl0gPSBcImNvbW1lbnRcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJzdHJpbmdcIl0gPSBcInN0cmluZ1wiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcIm51bWJlclwiXSA9IFwibnVtYmVyXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wicmVnZXhwXCJdID0gXCJyZWdleHBcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJvcGVyYXRvclwiXSA9IFwib3BlcmF0b3JcIjtcbiAgICAvKipcbiAgICAgKiBAc2luY2UgMy4xNy4wXG4gICAgICovXG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wiZGVjb3JhdG9yXCJdID0gXCJkZWNvcmF0b3JcIjtcbn0pKFNlbWFudGljVG9rZW5UeXBlcyB8fCAoU2VtYW50aWNUb2tlblR5cGVzID0ge30pKTtcbi8qKlxuICogQSBzZXQgb2YgcHJlZGVmaW5lZCB0b2tlbiBtb2RpZmllcnMuIFRoaXMgc2V0IGlzIG5vdCBmaXhlZFxuICogYW4gY2xpZW50cyBjYW4gc3BlY2lmeSBhZGRpdGlvbmFsIHRva2VuIHR5cGVzIHZpYSB0aGVcbiAqIGNvcnJlc3BvbmRpbmcgY2xpZW50IGNhcGFiaWxpdGllcy5cbiAqXG4gKiBAc2luY2UgMy4xNi4wXG4gKi9cbmV4cG9ydCB2YXIgU2VtYW50aWNUb2tlbk1vZGlmaWVycztcbihmdW5jdGlvbiAoU2VtYW50aWNUb2tlbk1vZGlmaWVycykge1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJkZWNsYXJhdGlvblwiXSA9IFwiZGVjbGFyYXRpb25cIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wiZGVmaW5pdGlvblwiXSA9IFwiZGVmaW5pdGlvblwiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJyZWFkb25seVwiXSA9IFwicmVhZG9ubHlcIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wic3RhdGljXCJdID0gXCJzdGF0aWNcIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wiZGVwcmVjYXRlZFwiXSA9IFwiZGVwcmVjYXRlZFwiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJhYnN0cmFjdFwiXSA9IFwiYWJzdHJhY3RcIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wiYXN5bmNcIl0gPSBcImFzeW5jXCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcIm1vZGlmaWNhdGlvblwiXSA9IFwibW9kaWZpY2F0aW9uXCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcImRvY3VtZW50YXRpb25cIl0gPSBcImRvY3VtZW50YXRpb25cIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wiZGVmYXVsdExpYnJhcnlcIl0gPSBcImRlZmF1bHRMaWJyYXJ5XCI7XG59KShTZW1hbnRpY1Rva2VuTW9kaWZpZXJzIHx8IChTZW1hbnRpY1Rva2VuTW9kaWZpZXJzID0ge30pKTtcbi8qKlxuICogQHNpbmNlIDMuMTYuMFxuICovXG5leHBvcnQgdmFyIFNlbWFudGljVG9rZW5zO1xuKGZ1bmN0aW9uIChTZW1hbnRpY1Rva2Vucykge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIChjYW5kaWRhdGUucmVzdWx0SWQgPT09IHVuZGVmaW5lZCB8fCB0eXBlb2YgY2FuZGlkYXRlLnJlc3VsdElkID09PSAnc3RyaW5nJykgJiZcbiAgICAgICAgICAgIEFycmF5LmlzQXJyYXkoY2FuZGlkYXRlLmRhdGEpICYmIChjYW5kaWRhdGUuZGF0YS5sZW5ndGggPT09IDAgfHwgdHlwZW9mIGNhbmRpZGF0ZS5kYXRhWzBdID09PSAnbnVtYmVyJyk7XG4gICAgfVxuICAgIFNlbWFudGljVG9rZW5zLmlzID0gaXM7XG59KShTZW1hbnRpY1Rva2VucyB8fCAoU2VtYW50aWNUb2tlbnMgPSB7fSkpO1xuLyoqXG4gKiBUaGUgSW5saW5lVmFsdWVUZXh0IG5hbWVzcGFjZSBwcm92aWRlcyBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIElubGluZVZhbHVlVGV4dHMuXG4gKlxuICogQHNpbmNlIDMuMTcuMFxuICovXG5leHBvcnQgdmFyIElubGluZVZhbHVlVGV4dDtcbihmdW5jdGlvbiAoSW5saW5lVmFsdWVUZXh0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBJbmxpbmVWYWx1ZVRleHQgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIHRleHQpIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIHRleHQgfTtcbiAgICB9XG4gICAgSW5saW5lVmFsdWVUZXh0LmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAhPT0gdW5kZWZpbmVkICYmIGNhbmRpZGF0ZSAhPT0gbnVsbCAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudGV4dCk7XG4gICAgfVxuICAgIElubGluZVZhbHVlVGV4dC5pcyA9IGlzO1xufSkoSW5saW5lVmFsdWVUZXh0IHx8IChJbmxpbmVWYWx1ZVRleHQgPSB7fSkpO1xuLyoqXG4gKiBUaGUgSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cCBuYW1lc3BhY2UgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCBJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3Vwcy5cbiAqXG4gKiBAc2luY2UgMy4xNy4wXG4gKi9cbmV4cG9ydCB2YXIgSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cDtcbihmdW5jdGlvbiAoSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgSW5saW5lVmFsdWVUZXh0IGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCB2YXJpYWJsZU5hbWUsIGNhc2VTZW5zaXRpdmVMb29rdXApIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIHZhcmlhYmxlTmFtZSwgY2FzZVNlbnNpdGl2ZUxvb2t1cCB9O1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAhPT0gdW5kZWZpbmVkICYmIGNhbmRpZGF0ZSAhPT0gbnVsbCAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIElzLmJvb2xlYW4oY2FuZGlkYXRlLmNhc2VTZW5zaXRpdmVMb29rdXApXG4gICAgICAgICAgICAmJiAoSXMuc3RyaW5nKGNhbmRpZGF0ZS52YXJpYWJsZU5hbWUpIHx8IGNhbmRpZGF0ZS52YXJpYWJsZU5hbWUgPT09IHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIElubGluZVZhbHVlVmFyaWFibGVMb29rdXAuaXMgPSBpcztcbn0pKElubGluZVZhbHVlVmFyaWFibGVMb29rdXAgfHwgKElubGluZVZhbHVlVmFyaWFibGVMb29rdXAgPSB7fSkpO1xuLyoqXG4gKiBUaGUgSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24gbmFtZXNwYWNlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGggSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24uXG4gKlxuICogQHNpbmNlIDMuMTcuMFxuICovXG5leHBvcnQgdmFyIElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uO1xuKGZ1bmN0aW9uIChJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24gbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIGV4cHJlc3Npb24pIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIGV4cHJlc3Npb24gfTtcbiAgICB9XG4gICAgSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24uY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICE9PSB1bmRlZmluZWQgJiYgY2FuZGlkYXRlICE9PSBudWxsICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSlcbiAgICAgICAgICAgICYmIChJcy5zdHJpbmcoY2FuZGlkYXRlLmV4cHJlc3Npb24pIHx8IGNhbmRpZGF0ZS5leHByZXNzaW9uID09PSB1bmRlZmluZWQpO1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbi5pcyA9IGlzO1xufSkoSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24gfHwgKElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uID0ge30pKTtcbi8qKlxuICogVGhlIElubGluZVZhbHVlQ29udGV4dCBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBJbmxpbmVWYWx1ZUNvbnRleHR9IGxpdGVyYWxzLlxuICpcbiAqIEBzaW5jZSAzLjE3LjBcbiAqL1xuZXhwb3J0IHZhciBJbmxpbmVWYWx1ZUNvbnRleHQ7XG4oZnVuY3Rpb24gKElubGluZVZhbHVlQ29udGV4dCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgSW5saW5lVmFsdWVDb250ZXh0IGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGZyYW1lSWQsIHN0b3BwZWRMb2NhdGlvbikge1xuICAgICAgICByZXR1cm4geyBmcmFtZUlkLCBzdG9wcGVkTG9jYXRpb24gfTtcbiAgICB9XG4gICAgSW5saW5lVmFsdWVDb250ZXh0LmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIElubGluZVZhbHVlQ29udGV4dH0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIFJhbmdlLmlzKHZhbHVlLnN0b3BwZWRMb2NhdGlvbik7XG4gICAgfVxuICAgIElubGluZVZhbHVlQ29udGV4dC5pcyA9IGlzO1xufSkoSW5saW5lVmFsdWVDb250ZXh0IHx8IChJbmxpbmVWYWx1ZUNvbnRleHQgPSB7fSkpO1xuLyoqXG4gKiBJbmxheSBoaW50IGtpbmRzLlxuICpcbiAqIEBzaW5jZSAzLjE3LjBcbiAqL1xuZXhwb3J0IHZhciBJbmxheUhpbnRLaW5kO1xuKGZ1bmN0aW9uIChJbmxheUhpbnRLaW5kKSB7XG4gICAgLyoqXG4gICAgICogQW4gaW5sYXkgaGludCB0aGF0IGZvciBhIHR5cGUgYW5ub3RhdGlvbi5cbiAgICAgKi9cbiAgICBJbmxheUhpbnRLaW5kLlR5cGUgPSAxO1xuICAgIC8qKlxuICAgICAqIEFuIGlubGF5IGhpbnQgdGhhdCBpcyBmb3IgYSBwYXJhbWV0ZXIuXG4gICAgICovXG4gICAgSW5sYXlIaW50S2luZC5QYXJhbWV0ZXIgPSAyO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gMSB8fCB2YWx1ZSA9PT0gMjtcbiAgICB9XG4gICAgSW5sYXlIaW50S2luZC5pcyA9IGlzO1xufSkoSW5sYXlIaW50S2luZCB8fCAoSW5sYXlIaW50S2luZCA9IHt9KSk7XG5leHBvcnQgdmFyIElubGF5SGludExhYmVsUGFydDtcbihmdW5jdGlvbiAoSW5sYXlIaW50TGFiZWxQYXJ0KSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB7IHZhbHVlIH07XG4gICAgfVxuICAgIElubGF5SGludExhYmVsUGFydC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSlcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUudG9vbHRpcCA9PT0gdW5kZWZpbmVkIHx8IElzLnN0cmluZyhjYW5kaWRhdGUudG9vbHRpcCkgfHwgTWFya3VwQ29udGVudC5pcyhjYW5kaWRhdGUudG9vbHRpcCkpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLmxvY2F0aW9uID09PSB1bmRlZmluZWQgfHwgTG9jYXRpb24uaXMoY2FuZGlkYXRlLmxvY2F0aW9uKSlcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUuY29tbWFuZCA9PT0gdW5kZWZpbmVkIHx8IENvbW1hbmQuaXMoY2FuZGlkYXRlLmNvbW1hbmQpKTtcbiAgICB9XG4gICAgSW5sYXlIaW50TGFiZWxQYXJ0LmlzID0gaXM7XG59KShJbmxheUhpbnRMYWJlbFBhcnQgfHwgKElubGF5SGludExhYmVsUGFydCA9IHt9KSk7XG5leHBvcnQgdmFyIElubGF5SGludDtcbihmdW5jdGlvbiAoSW5sYXlIaW50KSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKHBvc2l0aW9uLCBsYWJlbCwga2luZCkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSB7IHBvc2l0aW9uLCBsYWJlbCB9O1xuICAgICAgICBpZiAoa2luZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQua2luZCA9IGtpbmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgSW5sYXlIaW50LmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBQb3NpdGlvbi5pcyhjYW5kaWRhdGUucG9zaXRpb24pXG4gICAgICAgICAgICAmJiAoSXMuc3RyaW5nKGNhbmRpZGF0ZS5sYWJlbCkgfHwgSXMudHlwZWRBcnJheShjYW5kaWRhdGUubGFiZWwsIElubGF5SGludExhYmVsUGFydC5pcykpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLmtpbmQgPT09IHVuZGVmaW5lZCB8fCBJbmxheUhpbnRLaW5kLmlzKGNhbmRpZGF0ZS5raW5kKSlcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUudGV4dEVkaXRzID09PSB1bmRlZmluZWQpIHx8IElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLnRleHRFZGl0cywgVGV4dEVkaXQuaXMpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLnRvb2x0aXAgPT09IHVuZGVmaW5lZCB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLnRvb2x0aXApIHx8IE1hcmt1cENvbnRlbnQuaXMoY2FuZGlkYXRlLnRvb2x0aXApKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS5wYWRkaW5nTGVmdCA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLnBhZGRpbmdMZWZ0KSlcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUucGFkZGluZ1JpZ2h0ID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUucGFkZGluZ1JpZ2h0KSk7XG4gICAgfVxuICAgIElubGF5SGludC5pcyA9IGlzO1xufSkoSW5sYXlIaW50IHx8IChJbmxheUhpbnQgPSB7fSkpO1xuZXhwb3J0IHZhciBTdHJpbmdWYWx1ZTtcbihmdW5jdGlvbiAoU3RyaW5nVmFsdWUpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGVTbmlwcGV0KHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB7IGtpbmQ6ICdzbmlwcGV0JywgdmFsdWUgfTtcbiAgICB9XG4gICAgU3RyaW5nVmFsdWUuY3JlYXRlU25pcHBldCA9IGNyZWF0ZVNuaXBwZXQ7XG59KShTdHJpbmdWYWx1ZSB8fCAoU3RyaW5nVmFsdWUgPSB7fSkpO1xuZXhwb3J0IHZhciBJbmxpbmVDb21wbGV0aW9uSXRlbTtcbihmdW5jdGlvbiAoSW5saW5lQ29tcGxldGlvbkl0ZW0pIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUoaW5zZXJ0VGV4dCwgZmlsdGVyVGV4dCwgcmFuZ2UsIGNvbW1hbmQpIHtcbiAgICAgICAgcmV0dXJuIHsgaW5zZXJ0VGV4dCwgZmlsdGVyVGV4dCwgcmFuZ2UsIGNvbW1hbmQgfTtcbiAgICB9XG4gICAgSW5saW5lQ29tcGxldGlvbkl0ZW0uY3JlYXRlID0gY3JlYXRlO1xufSkoSW5saW5lQ29tcGxldGlvbkl0ZW0gfHwgKElubGluZUNvbXBsZXRpb25JdGVtID0ge30pKTtcbmV4cG9ydCB2YXIgSW5saW5lQ29tcGxldGlvbkxpc3Q7XG4oZnVuY3Rpb24gKElubGluZUNvbXBsZXRpb25MaXN0KSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKGl0ZW1zKSB7XG4gICAgICAgIHJldHVybiB7IGl0ZW1zIH07XG4gICAgfVxuICAgIElubGluZUNvbXBsZXRpb25MaXN0LmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKElubGluZUNvbXBsZXRpb25MaXN0IHx8IChJbmxpbmVDb21wbGV0aW9uTGlzdCA9IHt9KSk7XG4vKipcbiAqIERlc2NyaWJlcyBob3cgYW4ge0BsaW5rIElubGluZUNvbXBsZXRpb25JdGVtUHJvdmlkZXIgaW5saW5lIGNvbXBsZXRpb24gcHJvdmlkZXJ9IHdhcyB0cmlnZ2VyZWQuXG4gKlxuICogQHNpbmNlIDMuMTguMFxuICogQHByb3Bvc2VkXG4gKi9cbmV4cG9ydCB2YXIgSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kO1xuKGZ1bmN0aW9uIChJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmQpIHtcbiAgICAvKipcbiAgICAgKiBDb21wbGV0aW9uIHdhcyB0cmlnZ2VyZWQgZXhwbGljaXRseSBieSBhIHVzZXIgZ2VzdHVyZS5cbiAgICAgKi9cbiAgICBJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmQuSW52b2tlZCA9IDA7XG4gICAgLyoqXG4gICAgICogQ29tcGxldGlvbiB3YXMgdHJpZ2dlcmVkIGF1dG9tYXRpY2FsbHkgd2hpbGUgZWRpdGluZy5cbiAgICAgKi9cbiAgICBJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmQuQXV0b21hdGljID0gMTtcbn0pKElubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZCB8fCAoSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kID0ge30pKTtcbmV4cG9ydCB2YXIgU2VsZWN0ZWRDb21wbGV0aW9uSW5mbztcbihmdW5jdGlvbiAoU2VsZWN0ZWRDb21wbGV0aW9uSW5mbykge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgdGV4dCkge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgdGV4dCB9O1xuICAgIH1cbiAgICBTZWxlY3RlZENvbXBsZXRpb25JbmZvLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKFNlbGVjdGVkQ29tcGxldGlvbkluZm8gfHwgKFNlbGVjdGVkQ29tcGxldGlvbkluZm8gPSB7fSkpO1xuZXhwb3J0IHZhciBJbmxpbmVDb21wbGV0aW9uQ29udGV4dDtcbihmdW5jdGlvbiAoSW5saW5lQ29tcGxldGlvbkNvbnRleHQpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUodHJpZ2dlcktpbmQsIHNlbGVjdGVkQ29tcGxldGlvbkluZm8pIHtcbiAgICAgICAgcmV0dXJuIHsgdHJpZ2dlcktpbmQsIHNlbGVjdGVkQ29tcGxldGlvbkluZm8gfTtcbiAgICB9XG4gICAgSW5saW5lQ29tcGxldGlvbkNvbnRleHQuY3JlYXRlID0gY3JlYXRlO1xufSkoSW5saW5lQ29tcGxldGlvbkNvbnRleHQgfHwgKElubGluZUNvbXBsZXRpb25Db250ZXh0ID0ge30pKTtcbmV4cG9ydCB2YXIgV29ya3NwYWNlRm9sZGVyO1xuKGZ1bmN0aW9uIChXb3Jrc3BhY2VGb2xkZXIpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBVUkkuaXMoY2FuZGlkYXRlLnVyaSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5uYW1lKTtcbiAgICB9XG4gICAgV29ya3NwYWNlRm9sZGVyLmlzID0gaXM7XG59KShXb3Jrc3BhY2VGb2xkZXIgfHwgKFdvcmtzcGFjZUZvbGRlciA9IHt9KSk7XG5leHBvcnQgY29uc3QgRU9MID0gWydcXG4nLCAnXFxyXFxuJywgJ1xcciddO1xuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgdGhlIHRleHQgZG9jdW1lbnQgZnJvbSB0aGUgbmV3IHZzY29kZS1sYW5ndWFnZXNlcnZlci10ZXh0ZG9jdW1lbnQgcGFja2FnZS5cbiAqL1xuZXhwb3J0IHZhciBUZXh0RG9jdW1lbnQ7XG4oZnVuY3Rpb24gKFRleHREb2N1bWVudCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgSVRleHREb2N1bWVudCBsaXRlcmFsIGZyb20gdGhlIGdpdmVuIHVyaSBhbmQgY29udGVudC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSBkb2N1bWVudCdzIHVyaS5cbiAgICAgKiBAcGFyYW0gbGFuZ3VhZ2VJZCBUaGUgZG9jdW1lbnQncyBsYW5ndWFnZSBJZC5cbiAgICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgZG9jdW1lbnQncyB2ZXJzaW9uLlxuICAgICAqIEBwYXJhbSBjb250ZW50IFRoZSBkb2N1bWVudCdzIGNvbnRlbnQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHVyaSwgbGFuZ3VhZ2VJZCwgdmVyc2lvbiwgY29udGVudCkge1xuICAgICAgICByZXR1cm4gbmV3IEZ1bGxUZXh0RG9jdW1lbnQodXJpLCBsYW5ndWFnZUlkLCB2ZXJzaW9uLCBjb250ZW50KTtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50LmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIElUZXh0RG9jdW1lbnR9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLmxhbmd1YWdlSWQpIHx8IElzLnN0cmluZyhjYW5kaWRhdGUubGFuZ3VhZ2VJZCkpICYmIElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS5saW5lQ291bnQpXG4gICAgICAgICAgICAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5nZXRUZXh0KSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5wb3NpdGlvbkF0KSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5vZmZzZXRBdCkgPyB0cnVlIDogZmFsc2U7XG4gICAgfVxuICAgIFRleHREb2N1bWVudC5pcyA9IGlzO1xuICAgIGZ1bmN0aW9uIGFwcGx5RWRpdHMoZG9jdW1lbnQsIGVkaXRzKSB7XG4gICAgICAgIGxldCB0ZXh0ID0gZG9jdW1lbnQuZ2V0VGV4dCgpO1xuICAgICAgICBsZXQgc29ydGVkRWRpdHMgPSBtZXJnZVNvcnQoZWRpdHMsIChhLCBiKSA9PiB7XG4gICAgICAgICAgICBsZXQgZGlmZiA9IGEucmFuZ2Uuc3RhcnQubGluZSAtIGIucmFuZ2Uuc3RhcnQubGluZTtcbiAgICAgICAgICAgIGlmIChkaWZmID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGEucmFuZ2Uuc3RhcnQuY2hhcmFjdGVyIC0gYi5yYW5nZS5zdGFydC5jaGFyYWN0ZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZGlmZjtcbiAgICAgICAgfSk7XG4gICAgICAgIGxldCBsYXN0TW9kaWZpZWRPZmZzZXQgPSB0ZXh0Lmxlbmd0aDtcbiAgICAgICAgZm9yIChsZXQgaSA9IHNvcnRlZEVkaXRzLmxlbmd0aCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICBsZXQgZSA9IHNvcnRlZEVkaXRzW2ldO1xuICAgICAgICAgICAgbGV0IHN0YXJ0T2Zmc2V0ID0gZG9jdW1lbnQub2Zmc2V0QXQoZS5yYW5nZS5zdGFydCk7XG4gICAgICAgICAgICBsZXQgZW5kT2Zmc2V0ID0gZG9jdW1lbnQub2Zmc2V0QXQoZS5yYW5nZS5lbmQpO1xuICAgICAgICAgICAgaWYgKGVuZE9mZnNldCA8PSBsYXN0TW9kaWZpZWRPZmZzZXQpIHtcbiAgICAgICAgICAgICAgICB0ZXh0ID0gdGV4dC5zdWJzdHJpbmcoMCwgc3RhcnRPZmZzZXQpICsgZS5uZXdUZXh0ICsgdGV4dC5zdWJzdHJpbmcoZW5kT2Zmc2V0LCB0ZXh0Lmxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ092ZXJsYXBwaW5nIGVkaXQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxhc3RNb2RpZmllZE9mZnNldCA9IHN0YXJ0T2Zmc2V0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnQuYXBwbHlFZGl0cyA9IGFwcGx5RWRpdHM7XG4gICAgZnVuY3Rpb24gbWVyZ2VTb3J0KGRhdGEsIGNvbXBhcmUpIHtcbiAgICAgICAgaWYgKGRhdGEubGVuZ3RoIDw9IDEpIHtcbiAgICAgICAgICAgIC8vIHNvcnRlZFxuICAgICAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcCA9IChkYXRhLmxlbmd0aCAvIDIpIHwgMDtcbiAgICAgICAgY29uc3QgbGVmdCA9IGRhdGEuc2xpY2UoMCwgcCk7XG4gICAgICAgIGNvbnN0IHJpZ2h0ID0gZGF0YS5zbGljZShwKTtcbiAgICAgICAgbWVyZ2VTb3J0KGxlZnQsIGNvbXBhcmUpO1xuICAgICAgICBtZXJnZVNvcnQocmlnaHQsIGNvbXBhcmUpO1xuICAgICAgICBsZXQgbGVmdElkeCA9IDA7XG4gICAgICAgIGxldCByaWdodElkeCA9IDA7XG4gICAgICAgIGxldCBpID0gMDtcbiAgICAgICAgd2hpbGUgKGxlZnRJZHggPCBsZWZ0Lmxlbmd0aCAmJiByaWdodElkeCA8IHJpZ2h0Lmxlbmd0aCkge1xuICAgICAgICAgICAgbGV0IHJldCA9IGNvbXBhcmUobGVmdFtsZWZ0SWR4XSwgcmlnaHRbcmlnaHRJZHhdKTtcbiAgICAgICAgICAgIGlmIChyZXQgPD0gMCkge1xuICAgICAgICAgICAgICAgIC8vIHNtYWxsZXJfZXF1YWwgLT4gdGFrZSBsZWZ0IHRvIHByZXNlcnZlIG9yZGVyXG4gICAgICAgICAgICAgICAgZGF0YVtpKytdID0gbGVmdFtsZWZ0SWR4KytdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gZ3JlYXRlciAtPiB0YWtlIHJpZ2h0XG4gICAgICAgICAgICAgICAgZGF0YVtpKytdID0gcmlnaHRbcmlnaHRJZHgrK107XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKGxlZnRJZHggPCBsZWZ0Lmxlbmd0aCkge1xuICAgICAgICAgICAgZGF0YVtpKytdID0gbGVmdFtsZWZ0SWR4KytdO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChyaWdodElkeCA8IHJpZ2h0Lmxlbmd0aCkge1xuICAgICAgICAgICAgZGF0YVtpKytdID0gcmlnaHRbcmlnaHRJZHgrK107XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxufSkoVGV4dERvY3VtZW50IHx8IChUZXh0RG9jdW1lbnQgPSB7fSkpO1xuLyoqXG4gKiBAZGVwcmVjYXRlZCBVc2UgdGhlIHRleHQgZG9jdW1lbnQgZnJvbSB0aGUgbmV3IHZzY29kZS1sYW5ndWFnZXNlcnZlci10ZXh0ZG9jdW1lbnQgcGFja2FnZS5cbiAqL1xuY2xhc3MgRnVsbFRleHREb2N1bWVudCB7XG4gICAgY29uc3RydWN0b3IodXJpLCBsYW5ndWFnZUlkLCB2ZXJzaW9uLCBjb250ZW50KSB7XG4gICAgICAgIHRoaXMuX3VyaSA9IHVyaTtcbiAgICAgICAgdGhpcy5fbGFuZ3VhZ2VJZCA9IGxhbmd1YWdlSWQ7XG4gICAgICAgIHRoaXMuX3ZlcnNpb24gPSB2ZXJzaW9uO1xuICAgICAgICB0aGlzLl9jb250ZW50ID0gY29udGVudDtcbiAgICAgICAgdGhpcy5fbGluZU9mZnNldHMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGdldCB1cmkoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl91cmk7XG4gICAgfVxuICAgIGdldCBsYW5ndWFnZUlkKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fbGFuZ3VhZ2VJZDtcbiAgICB9XG4gICAgZ2V0IHZlcnNpb24oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl92ZXJzaW9uO1xuICAgIH1cbiAgICBnZXRUZXh0KHJhbmdlKSB7XG4gICAgICAgIGlmIChyYW5nZSkge1xuICAgICAgICAgICAgbGV0IHN0YXJ0ID0gdGhpcy5vZmZzZXRBdChyYW5nZS5zdGFydCk7XG4gICAgICAgICAgICBsZXQgZW5kID0gdGhpcy5vZmZzZXRBdChyYW5nZS5lbmQpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRlbnQuc3Vic3RyaW5nKHN0YXJ0LCBlbmQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9jb250ZW50O1xuICAgIH1cbiAgICB1cGRhdGUoZXZlbnQsIHZlcnNpb24pIHtcbiAgICAgICAgdGhpcy5fY29udGVudCA9IGV2ZW50LnRleHQ7XG4gICAgICAgIHRoaXMuX3ZlcnNpb24gPSB2ZXJzaW9uO1xuICAgICAgICB0aGlzLl9saW5lT2Zmc2V0cyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZ2V0TGluZU9mZnNldHMoKSB7XG4gICAgICAgIGlmICh0aGlzLl9saW5lT2Zmc2V0cyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsZXQgbGluZU9mZnNldHMgPSBbXTtcbiAgICAgICAgICAgIGxldCB0ZXh0ID0gdGhpcy5fY29udGVudDtcbiAgICAgICAgICAgIGxldCBpc0xpbmVTdGFydCA9IHRydWU7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoaXNMaW5lU3RhcnQpIHtcbiAgICAgICAgICAgICAgICAgICAgbGluZU9mZnNldHMucHVzaChpKTtcbiAgICAgICAgICAgICAgICAgICAgaXNMaW5lU3RhcnQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IGNoID0gdGV4dC5jaGFyQXQoaSk7XG4gICAgICAgICAgICAgICAgaXNMaW5lU3RhcnQgPSAoY2ggPT09ICdcXHInIHx8IGNoID09PSAnXFxuJyk7XG4gICAgICAgICAgICAgICAgaWYgKGNoID09PSAnXFxyJyAmJiBpICsgMSA8IHRleHQubGVuZ3RoICYmIHRleHQuY2hhckF0KGkgKyAxKSA9PT0gJ1xcbicpIHtcbiAgICAgICAgICAgICAgICAgICAgaSsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpc0xpbmVTdGFydCAmJiB0ZXh0Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBsaW5lT2Zmc2V0cy5wdXNoKHRleHQubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX2xpbmVPZmZzZXRzID0gbGluZU9mZnNldHM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2xpbmVPZmZzZXRzO1xuICAgIH1cbiAgICBwb3NpdGlvbkF0KG9mZnNldCkge1xuICAgICAgICBvZmZzZXQgPSBNYXRoLm1heChNYXRoLm1pbihvZmZzZXQsIHRoaXMuX2NvbnRlbnQubGVuZ3RoKSwgMCk7XG4gICAgICAgIGxldCBsaW5lT2Zmc2V0cyA9IHRoaXMuZ2V0TGluZU9mZnNldHMoKTtcbiAgICAgICAgbGV0IGxvdyA9IDAsIGhpZ2ggPSBsaW5lT2Zmc2V0cy5sZW5ndGg7XG4gICAgICAgIGlmIChoaWdoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUG9zaXRpb24uY3JlYXRlKDAsIG9mZnNldCk7XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKGxvdyA8IGhpZ2gpIHtcbiAgICAgICAgICAgIGxldCBtaWQgPSBNYXRoLmZsb29yKChsb3cgKyBoaWdoKSAvIDIpO1xuICAgICAgICAgICAgaWYgKGxpbmVPZmZzZXRzW21pZF0gPiBvZmZzZXQpIHtcbiAgICAgICAgICAgICAgICBoaWdoID0gbWlkO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbG93ID0gbWlkICsgMTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBsb3cgaXMgdGhlIGxlYXN0IHggZm9yIHdoaWNoIHRoZSBsaW5lIG9mZnNldCBpcyBsYXJnZXIgdGhhbiB0aGUgY3VycmVudCBvZmZzZXRcbiAgICAgICAgLy8gb3IgYXJyYXkubGVuZ3RoIGlmIG5vIGxpbmUgb2Zmc2V0IGlzIGxhcmdlciB0aGFuIHRoZSBjdXJyZW50IG9mZnNldFxuICAgICAgICBsZXQgbGluZSA9IGxvdyAtIDE7XG4gICAgICAgIHJldHVybiBQb3NpdGlvbi5jcmVhdGUobGluZSwgb2Zmc2V0IC0gbGluZU9mZnNldHNbbGluZV0pO1xuICAgIH1cbiAgICBvZmZzZXRBdChwb3NpdGlvbikge1xuICAgICAgICBsZXQgbGluZU9mZnNldHMgPSB0aGlzLmdldExpbmVPZmZzZXRzKCk7XG4gICAgICAgIGlmIChwb3NpdGlvbi5saW5lID49IGxpbmVPZmZzZXRzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRlbnQubGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHBvc2l0aW9uLmxpbmUgPCAwKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgbGluZU9mZnNldCA9IGxpbmVPZmZzZXRzW3Bvc2l0aW9uLmxpbmVdO1xuICAgICAgICBsZXQgbmV4dExpbmVPZmZzZXQgPSAocG9zaXRpb24ubGluZSArIDEgPCBsaW5lT2Zmc2V0cy5sZW5ndGgpID8gbGluZU9mZnNldHNbcG9zaXRpb24ubGluZSArIDFdIDogdGhpcy5fY29udGVudC5sZW5ndGg7XG4gICAgICAgIHJldHVybiBNYXRoLm1heChNYXRoLm1pbihsaW5lT2Zmc2V0ICsgcG9zaXRpb24uY2hhcmFjdGVyLCBuZXh0TGluZU9mZnNldCksIGxpbmVPZmZzZXQpO1xuICAgIH1cbiAgICBnZXQgbGluZUNvdW50KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRMaW5lT2Zmc2V0cygpLmxlbmd0aDtcbiAgICB9XG59XG52YXIgSXM7XG4oZnVuY3Rpb24gKElzKSB7XG4gICAgY29uc3QgdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuICAgIGZ1bmN0aW9uIGRlZmluZWQodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSAhPT0gJ3VuZGVmaW5lZCc7XG4gICAgfVxuICAgIElzLmRlZmluZWQgPSBkZWZpbmVkO1xuICAgIGZ1bmN0aW9uIHVuZGVmaW5lZCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAndW5kZWZpbmVkJztcbiAgICB9XG4gICAgSXMudW5kZWZpbmVkID0gdW5kZWZpbmVkO1xuICAgIGZ1bmN0aW9uIGJvb2xlYW4odmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZTtcbiAgICB9XG4gICAgSXMuYm9vbGVhbiA9IGJvb2xlYW47XG4gICAgZnVuY3Rpb24gc3RyaW5nKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgU3RyaW5nXSc7XG4gICAgfVxuICAgIElzLnN0cmluZyA9IHN0cmluZztcbiAgICBmdW5jdGlvbiBudW1iZXIodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBOdW1iZXJdJztcbiAgICB9XG4gICAgSXMubnVtYmVyID0gbnVtYmVyO1xuICAgIGZ1bmN0aW9uIG51bWJlclJhbmdlKHZhbHVlLCBtaW4sIG1heCkge1xuICAgICAgICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IE51bWJlcl0nICYmIG1pbiA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSBtYXg7XG4gICAgfVxuICAgIElzLm51bWJlclJhbmdlID0gbnVtYmVyUmFuZ2U7XG4gICAgZnVuY3Rpb24gaW50ZWdlcih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IE51bWJlcl0nICYmIC0yMTQ3NDgzNjQ4IDw9IHZhbHVlICYmIHZhbHVlIDw9IDIxNDc0ODM2NDc7XG4gICAgfVxuICAgIElzLmludGVnZXIgPSBpbnRlZ2VyO1xuICAgIGZ1bmN0aW9uIHVpbnRlZ2VyKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgTnVtYmVyXScgJiYgMCA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSAyMTQ3NDgzNjQ3O1xuICAgIH1cbiAgICBJcy51aW50ZWdlciA9IHVpbnRlZ2VyO1xuICAgIGZ1bmN0aW9uIGZ1bmModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBGdW5jdGlvbl0nO1xuICAgIH1cbiAgICBJcy5mdW5jID0gZnVuYztcbiAgICBmdW5jdGlvbiBvYmplY3RMaXRlcmFsKHZhbHVlKSB7XG4gICAgICAgIC8vIFN0cmljdGx5IHNwZWFraW5nIGNsYXNzIGluc3RhbmNlcyBwYXNzIHRoaXMgY2hlY2sgYXMgd2VsbC4gU2luY2UgdGhlIExTUFxuICAgICAgICAvLyBkb2Vzbid0IHVzZSBjbGFzc2VzIHdlIGlnbm9yZSB0aGlzIGZvciBub3cuIElmIHdlIGRvIHdlIG5lZWQgdG8gYWRkIHNvbWV0aGluZ1xuICAgICAgICAvLyBsaWtlIHRoaXM6IGBPYmplY3QuZ2V0UHJvdG90eXBlT2YoT2JqZWN0LmdldFByb3RvdHlwZU9mKHgpKSA9PT0gbnVsbGBcbiAgICAgICAgcmV0dXJuIHZhbHVlICE9PSBudWxsICYmIHR5cGVvZiB2YWx1ZSA9PT0gJ29iamVjdCc7XG4gICAgfVxuICAgIElzLm9iamVjdExpdGVyYWwgPSBvYmplY3RMaXRlcmFsO1xuICAgIGZ1bmN0aW9uIHR5cGVkQXJyYXkodmFsdWUsIGNoZWNrKSB7XG4gICAgICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKSAmJiB2YWx1ZS5ldmVyeShjaGVjayk7XG4gICAgfVxuICAgIElzLnR5cGVkQXJyYXkgPSB0eXBlZEFycmF5O1xufSkoSXMgfHwgKElzID0ge30pKTtcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQUFBO0FBQUE7QUFBQTtBQUtBLGFBQU8sZUFBZSxTQUFTLGNBQWMsRUFBRSxPQUFPLEtBQUssQ0FBQztBQUM1RCxjQUFRLGNBQWMsUUFBUSxRQUFRLFFBQVEsT0FBTyxRQUFRLFFBQVEsUUFBUSxTQUFTLFFBQVEsU0FBUyxRQUFRLFVBQVU7QUFDekgsZUFBUyxRQUFRLE9BQU87QUFDcEIsZUFBTyxVQUFVLFFBQVEsVUFBVTtBQUFBLE1BQ3ZDO0FBQ0EsY0FBUSxVQUFVO0FBQ2xCLGVBQVMsT0FBTyxPQUFPO0FBQ25CLGVBQU8sT0FBTyxVQUFVLFlBQVksaUJBQWlCO0FBQUEsTUFDekQ7QUFDQSxjQUFRLFNBQVM7QUFDakIsZUFBUyxPQUFPLE9BQU87QUFDbkIsZUFBTyxPQUFPLFVBQVUsWUFBWSxpQkFBaUI7QUFBQSxNQUN6RDtBQUNBLGNBQVEsU0FBUztBQUNqQixlQUFTLE1BQU0sT0FBTztBQUNsQixlQUFPLGlCQUFpQjtBQUFBLE1BQzVCO0FBQ0EsY0FBUSxRQUFR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QUNoQyxhQUFnQixFQUFFLGlCQUFpQixNQUFNO0FBQUEsUUFDekMsWUFBZ0IsRUFBRSxnQkFBZ0IsRUFBRSxTQUFTLE1BQU0sRUFBRTtBQUFBLFFBQ3JELG9CQUF3QixFQUFFLFNBQVMsS0FBSztBQUFBLFFBQ3hDLHlCQUF5QixFQUFFLFNBQVMsS0FBSztBQUFBLE1BQzdDO0FBQUEsSUFDSjtBQUFBLEVBQ0o7IiwKICAibmFtZXMiOiBbIkVycm9yQ29kZXMiLCAiTWVzc2FnZSIsICJUb3VjaCIsICJEaXNwb3NhYmxlIiwgIlJBTCIsICJFdmVudCIsICJJcyIsICJDYW5jZWxsYXRpb25Ub2tlbiIsICJDYW5jZWxsYXRpb25TdGF0ZSIsICJfY29ubiIsICJJcyIsICJNZXNzYWdlUmVhZGVyIiwgIkFic3RyYWN0TWVzc2FnZVJlYWRlciIsICJSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zIiwgIklzIiwgIk1lc3NhZ2VXcml0ZXIiLCAiQWJzdHJhY3RNZXNzYWdlV3JpdGVyIiwgIlJlc29sdmVkTWVzc2FnZVdyaXRlck9wdGlvbnMiLCAicmVzdWx0IiwgIklzIiwgIkNhbmNlbE5vdGlmaWNhdGlvbiIsICJQcm9ncmVzc1Rva2VuIiwgIlByb2dyZXNzTm90aWZpY2F0aW9uIiwgIlN0YXJSZXF1ZXN0SGFuZGxlciIsICJUcmFjZSIsICJUcmFjZVZhbHVlcyIsICJUcmFjZUZvcm1hdCIsICJTZXRUcmFjZU5vdGlmaWNhdGlvbiIsICJMb2dUcmFjZU5vdGlmaWNhdGlvbiIsICJDb25uZWN0aW9uRXJyb3JzIiwgIkNvbm5lY3Rpb25TdHJhdGVneSIsICJJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kiLCAiUmVxdWVzdENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kiLCAiQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSIsICJDYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneSIsICJDYW5jZWxsYXRpb25TdHJhdGVneSIsICJNZXNzYWdlU3RyYXRlZ3kiLCAiQ29ubmVjdGlvbk9wdGlvbnMiLCAiQ29ubmVjdGlvblN0YXRlIiwgImNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uIiwgInN0YXJ0VGltZSIsICJSSUwiLCAibSIsICJleHBvcnRzIiwgImNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uIiwgImltcG9ydF92c2NvZGVfanNvbnJwYyIsICJpbXBvcnRfdnNjb2RlX2pzb25ycGMiLCAiaW1wb3J0X3ZzY29kZV9qc29ucnBjIiwgImltcG9ydF92c2NvZGVfanNvbnJwYyIsICJEb2N1bWVudFVyaSIsICJVUkkiLCAiaW50ZWdlciIsICJ1aW50ZWdlciIsICJQb3NpdGlvbiIsICJSYW5nZSIsICJMb2NhdGlvbiIsICJMb2NhdGlvbkxpbmsiLCAiQ29sb3IiLCAiQ29sb3JJbmZvcm1hdGlvbiIsICJDb2xvclByZXNlbnRhdGlvbiIsICJGb2xkaW5nUmFuZ2VLaW5kIiwgIkZvbGRpbmdSYW5nZSIsICJEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uIiwgImxvY2F0aW9uIiwgIkRpYWdub3N0aWNTZXZlcml0eSIsICJEaWFnbm9zdGljVGFnIiwgIkNvZGVEZXNjcmlwdGlvbiIsICJEaWFnbm9zdGljIiwgIkNvbW1hbmQiLCAiVGV4dEVkaXQiLCAiQ2hhbmdlQW5ub3RhdGlvbiIsICJDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllciIsICJBbm5vdGF0ZWRUZXh0RWRpdCIsICJUZXh0RG9jdW1lbnRFZGl0IiwgIkNyZWF0ZUZpbGUiLCAiUmVuYW1lRmlsZSIsICJEZWxldGVGaWxlIiwgIldvcmtzcGFjZUVkaXQiLCAiVGV4dERvY3VtZW50SWRlbnRpZmllciIsICJWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIiwgIk9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciIsICJUZXh0RG9jdW1lbnRJdGVtIiwgIk1hcmt1cEtpbmQiLCAiTWFya3VwQ29udGVudCIsICJDb21wbGV0aW9uSXRlbUtpbmQiLCAiSW5zZXJ0VGV4dEZvcm1hdCIsICJDb21wbGV0aW9uSXRlbVRhZyIsICJJbnNlcnRSZXBsYWNlRWRpdCIsICJSYW5nZSIsICJJbnNlcnRUZXh0TW9kZSIsICJDb21wbGV0aW9uSXRlbUxhYmVsRGV0YWlscyIsICJDb21wbGV0aW9uSXRlbSIsICJDb21wbGV0aW9uTGlzdCIsICJNYXJrZWRTdHJpbmciLCAiSG92ZXIiLCAiUGFyYW1ldGVySW5mb3JtYXRpb24iLCAiU2lnbmF0dXJlSW5mb3JtYXRpb24iLCAiRG9jdW1lbnRIaWdobGlnaHRLaW5kIiwgIkRvY3VtZW50SGlnaGxpZ2h0IiwgIlN5bWJvbEtpbmQiLCAiU3ltYm9sVGFnIiwgIlN5bWJvbEluZm9ybWF0aW9uIiwgIldvcmtzcGFjZVN5bWJvbCIsICJEb2N1bWVudFN5bWJvbCIsICJDb2RlQWN0aW9uS2luZCIsICJDb2RlQWN0aW9uVHJpZ2dlcktpbmQiLCAiQ29kZUFjdGlvbkNvbnRleHQiLCAiQ29kZUFjdGlvbiIsICJDb2RlTGVucyIsICJGb3JtYXR0aW5nT3B0aW9ucyIsICJEb2N1bWVudExpbmsiLCAiU2VsZWN0aW9uUmFuZ2UiLCAiU2VtYW50aWNUb2tlblR5cGVzIiwgIlNlbWFudGljVG9rZW5Nb2RpZmllcnMiLCAiU2VtYW50aWNUb2tlbnMiLCAiSW5saW5lVmFsdWVUZXh0IiwgIklubGluZVZhbHVlVmFyaWFibGVMb29rdXAiLCAiSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24iLCAiSW5saW5lVmFsdWVDb250ZXh0IiwgIklubGF5SGludEtpbmQiLCAiSW5sYXlIaW50TGFiZWxQYXJ0IiwgIklubGF5SGludCIsICJQb3NpdGlvbiIsICJTdHJpbmdWYWx1ZSIsICJJbmxpbmVDb21wbGV0aW9uSXRlbSIsICJJbmxpbmVDb21wbGV0aW9uTGlzdCIsICJJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmQiLCAiU2VsZWN0ZWRDb21wbGV0aW9uSW5mbyIsICJJbmxpbmVDb21wbGV0aW9uQ29udGV4dCIsICJXb3Jrc3BhY2VGb2xkZXIiLCAiVGV4dERvY3VtZW50IiwgIlBvc2l0aW9uIiwgIklzIiwgInVuZGVmaW5lZCIsICJpbnRlZ2VyIiwgInVpbnRlZ2VyIiwgIm0iXQp9Cg== +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvY29tbW9uL2lzLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlcy5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vbGlua2VkTWFwLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9kaXNwb3NhYmxlLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9yYWwuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvY29tbW9uL2V2ZW50cy5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vY2FuY2VsbGF0aW9uLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9zaGFyZWRBcnJheUNhbmNlbGxhdGlvbi5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vc2VtYXBob3JlLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlUmVhZGVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlV3JpdGVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlQnVmZmVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9jb25uZWN0aW9uLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9hcGkuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvYnJvd3Nlci9yaWwuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvYnJvd3Nlci9tYWluLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvYnJvd3Nlci5qcyIsICJsc3AvamF2YS1sc3AtY2xpZW50LnRzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLXdzLWpzb25ycGMvc3JjL2Rpc3Bvc2FibGUudHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvc29ja2V0L3NvY2tldC50cyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS13cy1qc29ucnBjL3NyYy9zb2NrZXQvcmVhZGVyLnRzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLXdzLWpzb25ycGMvc3JjL3NvY2tldC93cml0ZXIudHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvc29ja2V0L2Nvbm5lY3Rpb24udHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvY29ubmVjdGlvbi50cyIsICJsc3AvbW9uYWNvLXNoaW0udHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtbGFuZ3VhZ2VzZXJ2ZXItdHlwZXMvbGliL2VzbS9tYWluLmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuc3RyaW5nQXJyYXkgPSBleHBvcnRzLmFycmF5ID0gZXhwb3J0cy5mdW5jID0gZXhwb3J0cy5lcnJvciA9IGV4cG9ydHMubnVtYmVyID0gZXhwb3J0cy5zdHJpbmcgPSBleHBvcnRzLmJvb2xlYW4gPSB2b2lkIDA7XG5mdW5jdGlvbiBib29sZWFuKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZTtcbn1cbmV4cG9ydHMuYm9vbGVhbiA9IGJvb2xlYW47XG5mdW5jdGlvbiBzdHJpbmcodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZztcbn1cbmV4cG9ydHMuc3RyaW5nID0gc3RyaW5nO1xuZnVuY3Rpb24gbnVtYmVyKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdmFsdWUgaW5zdGFuY2VvZiBOdW1iZXI7XG59XG5leHBvcnRzLm51bWJlciA9IG51bWJlcjtcbmZ1bmN0aW9uIGVycm9yKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgRXJyb3I7XG59XG5leHBvcnRzLmVycm9yID0gZXJyb3I7XG5mdW5jdGlvbiBmdW5jKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cbmV4cG9ydHMuZnVuYyA9IGZ1bmM7XG5mdW5jdGlvbiBhcnJheSh2YWx1ZSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cbmV4cG9ydHMuYXJyYXkgPSBhcnJheTtcbmZ1bmN0aW9uIHN0cmluZ0FycmF5KHZhbHVlKSB7XG4gICAgcmV0dXJuIGFycmF5KHZhbHVlKSAmJiB2YWx1ZS5ldmVyeShlbGVtID0+IHN0cmluZyhlbGVtKSk7XG59XG5leHBvcnRzLnN0cmluZ0FycmF5ID0gc3RyaW5nQXJyYXk7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLk1lc3NhZ2UgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU5ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlOCA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTcgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU2ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNSA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTQgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUzID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMiA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTEgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUwID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTkgPSBleHBvcnRzLlJlcXVlc3RUeXBlOCA9IGV4cG9ydHMuUmVxdWVzdFR5cGU3ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTYgPSBleHBvcnRzLlJlcXVlc3RUeXBlNSA9IGV4cG9ydHMuUmVxdWVzdFR5cGU0ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTMgPSBleHBvcnRzLlJlcXVlc3RUeXBlMiA9IGV4cG9ydHMuUmVxdWVzdFR5cGUxID0gZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IGV4cG9ydHMuUmVxdWVzdFR5cGUwID0gZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUgPSBleHBvcnRzLlBhcmFtZXRlclN0cnVjdHVyZXMgPSBleHBvcnRzLlJlc3BvbnNlRXJyb3IgPSBleHBvcnRzLkVycm9yQ29kZXMgPSB2b2lkIDA7XG5jb25zdCBpcyA9IHJlcXVpcmUoXCIuL2lzXCIpO1xuLyoqXG4gKiBQcmVkZWZpbmVkIGVycm9yIGNvZGVzLlxuICovXG52YXIgRXJyb3JDb2RlcztcbihmdW5jdGlvbiAoRXJyb3JDb2Rlcykge1xuICAgIC8vIERlZmluZWQgYnkgSlNPTiBSUENcbiAgICBFcnJvckNvZGVzLlBhcnNlRXJyb3IgPSAtMzI3MDA7XG4gICAgRXJyb3JDb2Rlcy5JbnZhbGlkUmVxdWVzdCA9IC0zMjYwMDtcbiAgICBFcnJvckNvZGVzLk1ldGhvZE5vdEZvdW5kID0gLTMyNjAxO1xuICAgIEVycm9yQ29kZXMuSW52YWxpZFBhcmFtcyA9IC0zMjYwMjtcbiAgICBFcnJvckNvZGVzLkludGVybmFsRXJyb3IgPSAtMzI2MDM7XG4gICAgLyoqXG4gICAgICogVGhpcyBpcyB0aGUgc3RhcnQgcmFuZ2Ugb2YgSlNPTiBSUEMgcmVzZXJ2ZWQgZXJyb3IgY29kZXMuXG4gICAgICogSXQgZG9lc24ndCBkZW5vdGUgYSByZWFsIGVycm9yIGNvZGUuIE5vIGFwcGxpY2F0aW9uIGVycm9yIGNvZGVzIHNob3VsZFxuICAgICAqIGJlIGRlZmluZWQgYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCByYW5nZS4gRm9yIGJhY2t3YXJkc1xuICAgICAqIGNvbXBhdGliaWxpdHkgdGhlIGBTZXJ2ZXJOb3RJbml0aWFsaXplZGAgYW5kIHRoZSBgVW5rbm93bkVycm9yQ29kZWBcbiAgICAgKiBhcmUgbGVmdCBpbiB0aGUgcmFuZ2UuXG4gICAgICpcbiAgICAgKiBAc2luY2UgMy4xNi4wXG4gICAgKi9cbiAgICBFcnJvckNvZGVzLmpzb25ycGNSZXNlcnZlZEVycm9yUmFuZ2VTdGFydCA9IC0zMjA5OTtcbiAgICAvKiogQGRlcHJlY2F0ZWQgdXNlICBqc29ucnBjUmVzZXJ2ZWRFcnJvclJhbmdlU3RhcnQgKi9cbiAgICBFcnJvckNvZGVzLnNlcnZlckVycm9yU3RhcnQgPSAtMzIwOTk7XG4gICAgLyoqXG4gICAgICogQW4gZXJyb3Igb2NjdXJyZWQgd2hlbiB3cml0ZSBhIG1lc3NhZ2UgdG8gdGhlIHRyYW5zcG9ydCBsYXllci5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLk1lc3NhZ2VXcml0ZUVycm9yID0gLTMyMDk5O1xuICAgIC8qKlxuICAgICAqIEFuIGVycm9yIG9jY3VycmVkIHdoZW4gcmVhZGluZyBhIG1lc3NhZ2UgZnJvbSB0aGUgdHJhbnNwb3J0IGxheWVyLlxuICAgICAqL1xuICAgIEVycm9yQ29kZXMuTWVzc2FnZVJlYWRFcnJvciA9IC0zMjA5ODtcbiAgICAvKipcbiAgICAgKiBUaGUgY29ubmVjdGlvbiBnb3QgZGlzcG9zZWQgb3IgbG9zdCBhbmQgYWxsIHBlbmRpbmcgcmVzcG9uc2VzIGdvdFxuICAgICAqIHJlamVjdGVkLlxuICAgICAqL1xuICAgIEVycm9yQ29kZXMuUGVuZGluZ1Jlc3BvbnNlUmVqZWN0ZWQgPSAtMzIwOTc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gaXMgaW5hY3RpdmUgYW5kIGEgdXNlIG9mIGl0IGZhaWxlZC5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLkNvbm5lY3Rpb25JbmFjdGl2ZSA9IC0zMjA5NjtcbiAgICAvKipcbiAgICAgKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBhIHNlcnZlciByZWNlaXZlZCBhIG5vdGlmaWNhdGlvbiBvclxuICAgICAqIHJlcXVlc3QgYmVmb3JlIHRoZSBzZXJ2ZXIgaGFzIHJlY2VpdmVkIHRoZSBgaW5pdGlhbGl6ZWAgcmVxdWVzdC5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLlNlcnZlck5vdEluaXRpYWxpemVkID0gLTMyMDAyO1xuICAgIEVycm9yQ29kZXMuVW5rbm93bkVycm9yQ29kZSA9IC0zMjAwMTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIHRoZSBlbmQgcmFuZ2Ugb2YgSlNPTiBSUEMgcmVzZXJ2ZWQgZXJyb3IgY29kZXMuXG4gICAgICogSXQgZG9lc24ndCBkZW5vdGUgYSByZWFsIGVycm9yIGNvZGUuXG4gICAgICpcbiAgICAgKiBAc2luY2UgMy4xNi4wXG4gICAgKi9cbiAgICBFcnJvckNvZGVzLmpzb25ycGNSZXNlcnZlZEVycm9yUmFuZ2VFbmQgPSAtMzIwMDA7XG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSAganNvbnJwY1Jlc2VydmVkRXJyb3JSYW5nZUVuZCAqL1xuICAgIEVycm9yQ29kZXMuc2VydmVyRXJyb3JFbmQgPSAtMzIwMDA7XG59KShFcnJvckNvZGVzIHx8IChleHBvcnRzLkVycm9yQ29kZXMgPSBFcnJvckNvZGVzID0ge30pKTtcbi8qKlxuICogQW4gZXJyb3Igb2JqZWN0IHJldHVybiBpbiBhIHJlc3BvbnNlIGluIGNhc2UgYSByZXF1ZXN0XG4gKiBoYXMgZmFpbGVkLlxuICovXG5jbGFzcyBSZXNwb25zZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNvZGUsIG1lc3NhZ2UsIGRhdGEpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuY29kZSA9IGlzLm51bWJlcihjb2RlKSA/IGNvZGUgOiBFcnJvckNvZGVzLlVua25vd25FcnJvckNvZGU7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBSZXNwb25zZUVycm9yLnByb3RvdHlwZSk7XG4gICAgfVxuICAgIHRvSnNvbigpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgY29kZTogdGhpcy5jb2RlLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLmRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmRhdGEgPSB0aGlzLmRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5leHBvcnRzLlJlc3BvbnNlRXJyb3IgPSBSZXNwb25zZUVycm9yO1xuY2xhc3MgUGFyYW1ldGVyU3RydWN0dXJlcyB7XG4gICAgY29uc3RydWN0b3Ioa2luZCkge1xuICAgICAgICB0aGlzLmtpbmQgPSBraW5kO1xuICAgIH1cbiAgICBzdGF0aWMgaXModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8gfHwgdmFsdWUgPT09IFBhcmFtZXRlclN0cnVjdHVyZXMuYnlOYW1lIHx8IHZhbHVlID09PSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5UG9zaXRpb247XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5raW5kO1xuICAgIH1cbn1cbmV4cG9ydHMuUGFyYW1ldGVyU3RydWN0dXJlcyA9IFBhcmFtZXRlclN0cnVjdHVyZXM7XG4vKipcbiAqIFRoZSBwYXJhbWV0ZXIgc3RydWN0dXJlIGlzIGF1dG9tYXRpY2FsbHkgaW5mZXJyZWQgb24gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzXG4gKiBhbmQgdGhlIHBhcmFtZXRlciB0eXBlIGluIGNhc2Ugb2YgYSBzaW5nbGUgcGFyYW0uXG4gKi9cblBhcmFtZXRlclN0cnVjdHVyZXMuYXV0byA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdhdXRvJyk7XG4vKipcbiAqIEZvcmNlcyBgYnlQb3NpdGlvbmAgcGFyYW1ldGVyIHN0cnVjdHVyZS4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGhhdmUgYSBzaW5nbGVcbiAqIHBhcmFtZXRlciB3aGljaCBoYXMgYSBsaXRlcmFsIHR5cGUuXG4gKi9cblBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbiA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdieVBvc2l0aW9uJyk7XG4vKipcbiAqIEZvcmNlcyBgYnlOYW1lYCBwYXJhbWV0ZXIgc3RydWN0dXJlLiBUaGlzIGlzIG9ubHkgdXNlZnVsIHdoZW4gaGF2aW5nIGEgc2luZ2xlXG4gKiBwYXJhbWV0ZXIuIFRoZSBsaWJyYXJ5IHdpbGwgcmVwb3J0IGVycm9ycyBpZiB1c2VkIHdpdGggYSBkaWZmZXJlbnQgbnVtYmVyIG9mXG4gKiBwYXJhbWV0ZXJzLlxuICovXG5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdieU5hbWUnKTtcbi8qKlxuICogQW4gYWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgYSBNZXNzYWdlVHlwZS5cbiAqL1xuY2xhc3MgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIG51bWJlck9mUGFyYW1zKSB7XG4gICAgICAgIHRoaXMubWV0aG9kID0gbWV0aG9kO1xuICAgICAgICB0aGlzLm51bWJlck9mUGFyYW1zID0gbnVtYmVyT2ZQYXJhbXM7XG4gICAgfVxuICAgIGdldCBwYXJhbWV0ZXJTdHJ1Y3R1cmVzKCkge1xuICAgICAgICByZXR1cm4gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvO1xuICAgIH1cbn1cbmV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlID0gQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlO1xuLyoqXG4gKiBDbGFzc2VzIHRvIHR5cGUgcmVxdWVzdCByZXNwb25zZSBwYWlyc1xuICovXG5jbGFzcyBSZXF1ZXN0VHlwZTAgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDApO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGUwID0gUmVxdWVzdFR5cGUwO1xuY2xhc3MgUmVxdWVzdFR5cGUgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCwgX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8pIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAxKTtcbiAgICAgICAgdGhpcy5fcGFyYW1ldGVyU3RydWN0dXJlcyA9IF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbiAgICBnZXQgcGFyYW1ldGVyU3RydWN0dXJlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXM7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IFJlcXVlc3RUeXBlO1xuY2xhc3MgUmVxdWVzdFR5cGUxIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMSk7XG4gICAgICAgIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBfcGFyYW1ldGVyU3RydWN0dXJlcztcbiAgICB9XG4gICAgZ2V0IHBhcmFtZXRlclN0cnVjdHVyZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGUxID0gUmVxdWVzdFR5cGUxO1xuY2xhc3MgUmVxdWVzdFR5cGUyIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAyKTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlMiA9IFJlcXVlc3RUeXBlMjtcbmNsYXNzIFJlcXVlc3RUeXBlMyBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMyk7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTMgPSBSZXF1ZXN0VHlwZTM7XG5jbGFzcyBSZXF1ZXN0VHlwZTQgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDQpO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGU0ID0gUmVxdWVzdFR5cGU0O1xuY2xhc3MgUmVxdWVzdFR5cGU1IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA1KTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlNSA9IFJlcXVlc3RUeXBlNTtcbmNsYXNzIFJlcXVlc3RUeXBlNiBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNik7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTYgPSBSZXF1ZXN0VHlwZTY7XG5jbGFzcyBSZXF1ZXN0VHlwZTcgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDcpO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGU3ID0gUmVxdWVzdFR5cGU3O1xuY2xhc3MgUmVxdWVzdFR5cGU4IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA4KTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlOCA9IFJlcXVlc3RUeXBlODtcbmNsYXNzIFJlcXVlc3RUeXBlOSBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgOSk7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTkgPSBSZXF1ZXN0VHlwZTk7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMSk7XG4gICAgICAgIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBfcGFyYW1ldGVyU3RydWN0dXJlcztcbiAgICB9XG4gICAgZ2V0IHBhcmFtZXRlclN0cnVjdHVyZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZSA9IE5vdGlmaWNhdGlvblR5cGU7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlMCBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMCk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMCA9IE5vdGlmaWNhdGlvblR5cGUwO1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTEgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCwgX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8pIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAxKTtcbiAgICAgICAgdGhpcy5fcGFyYW1ldGVyU3RydWN0dXJlcyA9IF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbiAgICBnZXQgcGFyYW1ldGVyU3RydWN0dXJlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXM7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMSA9IE5vdGlmaWNhdGlvblR5cGUxO1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDIpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTIgPSBOb3RpZmljYXRpb25UeXBlMjtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGUzIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAzKTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGUzID0gTm90aWZpY2F0aW9uVHlwZTM7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlNCBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNCk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNCA9IE5vdGlmaWNhdGlvblR5cGU0O1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTUgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDUpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTUgPSBOb3RpZmljYXRpb25UeXBlNTtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGU2IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA2KTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGU2ID0gTm90aWZpY2F0aW9uVHlwZTY7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlNyBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNyk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNyA9IE5vdGlmaWNhdGlvblR5cGU3O1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTggZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDgpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTggPSBOb3RpZmljYXRpb25UeXBlODtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGU5IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA5KTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGU5ID0gTm90aWZpY2F0aW9uVHlwZTk7XG52YXIgTWVzc2FnZTtcbihmdW5jdGlvbiAoTWVzc2FnZSkge1xuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoZSBnaXZlbiBtZXNzYWdlIGlzIGEgcmVxdWVzdCBtZXNzYWdlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gbWVzc2FnZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBpcy5zdHJpbmcoY2FuZGlkYXRlLm1ldGhvZCkgJiYgKGlzLnN0cmluZyhjYW5kaWRhdGUuaWQpIHx8IGlzLm51bWJlcihjYW5kaWRhdGUuaWQpKTtcbiAgICB9XG4gICAgTWVzc2FnZS5pc1JlcXVlc3QgPSBpc1JlcXVlc3Q7XG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhlIGdpdmVuIG1lc3NhZ2UgaXMgYSBub3RpZmljYXRpb24gbWVzc2FnZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTm90aWZpY2F0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gbWVzc2FnZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBpcy5zdHJpbmcoY2FuZGlkYXRlLm1ldGhvZCkgJiYgbWVzc2FnZS5pZCA9PT0gdm9pZCAwO1xuICAgIH1cbiAgICBNZXNzYWdlLmlzTm90aWZpY2F0aW9uID0gaXNOb3RpZmljYXRpb247XG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhlIGdpdmVuIG1lc3NhZ2UgaXMgYSByZXNwb25zZSBtZXNzYWdlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNSZXNwb25zZShtZXNzYWdlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IG1lc3NhZ2U7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgKGNhbmRpZGF0ZS5yZXN1bHQgIT09IHZvaWQgMCB8fCAhIWNhbmRpZGF0ZS5lcnJvcikgJiYgKGlzLnN0cmluZyhjYW5kaWRhdGUuaWQpIHx8IGlzLm51bWJlcihjYW5kaWRhdGUuaWQpIHx8IGNhbmRpZGF0ZS5pZCA9PT0gbnVsbCk7XG4gICAgfVxuICAgIE1lc3NhZ2UuaXNSZXNwb25zZSA9IGlzUmVzcG9uc2U7XG59KShNZXNzYWdlIHx8IChleHBvcnRzLk1lc3NhZ2UgPSBNZXNzYWdlID0ge30pKTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xudmFyIF9hO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5MUlVDYWNoZSA9IGV4cG9ydHMuTGlua2VkTWFwID0gZXhwb3J0cy5Ub3VjaCA9IHZvaWQgMDtcbnZhciBUb3VjaDtcbihmdW5jdGlvbiAoVG91Y2gpIHtcbiAgICBUb3VjaC5Ob25lID0gMDtcbiAgICBUb3VjaC5GaXJzdCA9IDE7XG4gICAgVG91Y2guQXNPbGQgPSBUb3VjaC5GaXJzdDtcbiAgICBUb3VjaC5MYXN0ID0gMjtcbiAgICBUb3VjaC5Bc05ldyA9IFRvdWNoLkxhc3Q7XG59KShUb3VjaCB8fCAoZXhwb3J0cy5Ub3VjaCA9IFRvdWNoID0ge30pKTtcbmNsYXNzIExpbmtlZE1hcCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXNbX2FdID0gJ0xpbmtlZE1hcCc7XG4gICAgICAgIHRoaXMuX21hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5faGVhZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fdGFpbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IDA7XG4gICAgICAgIHRoaXMuX3N0YXRlID0gMDtcbiAgICB9XG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuX21hcC5jbGVhcigpO1xuICAgICAgICB0aGlzLl9oZWFkID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl90YWlsID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9zaXplID0gMDtcbiAgICAgICAgdGhpcy5fc3RhdGUrKztcbiAgICB9XG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLl9oZWFkICYmICF0aGlzLl90YWlsO1xuICAgIH1cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpemU7XG4gICAgfVxuICAgIGdldCBmaXJzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlYWQ/LnZhbHVlO1xuICAgIH1cbiAgICBnZXQgbGFzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhaWw/LnZhbHVlO1xuICAgIH1cbiAgICBoYXMoa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXAuaGFzKGtleSk7XG4gICAgfVxuICAgIGdldChrZXksIHRvdWNoID0gVG91Y2guTm9uZSkge1xuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5fbWFwLmdldChrZXkpO1xuICAgICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRvdWNoICE9PSBUb3VjaC5Ob25lKSB7XG4gICAgICAgICAgICB0aGlzLnRvdWNoKGl0ZW0sIHRvdWNoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICB9XG4gICAgc2V0KGtleSwgdmFsdWUsIHRvdWNoID0gVG91Y2guTm9uZSkge1xuICAgICAgICBsZXQgaXRlbSA9IHRoaXMuX21hcC5nZXQoa2V5KTtcbiAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgIGl0ZW0udmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIGlmICh0b3VjaCAhPT0gVG91Y2guTm9uZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudG91Y2goaXRlbSwgdG91Y2gpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaXRlbSA9IHsga2V5LCB2YWx1ZSwgbmV4dDogdW5kZWZpbmVkLCBwcmV2aW91czogdW5kZWZpbmVkIH07XG4gICAgICAgICAgICBzd2l0Y2ggKHRvdWNoKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBUb3VjaC5Ob25lOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFRvdWNoLkZpcnN0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1GaXJzdChpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBUb3VjaC5MYXN0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX21hcC5zZXQoa2V5LCBpdGVtKTtcbiAgICAgICAgICAgIHRoaXMuX3NpemUrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGVsZXRlKGtleSkge1xuICAgICAgICByZXR1cm4gISF0aGlzLnJlbW92ZShrZXkpO1xuICAgIH1cbiAgICByZW1vdmUoa2V5KSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl9tYXAuZ2V0KGtleSk7XG4gICAgICAgIGlmICghaXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tYXAuZGVsZXRlKGtleSk7XG4gICAgICAgIHRoaXMucmVtb3ZlSXRlbShpdGVtKTtcbiAgICAgICAgdGhpcy5fc2l6ZS0tO1xuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICB9XG4gICAgc2hpZnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5faGVhZCAmJiAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2hlYWQgfHwgIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIHRoaXMuX21hcC5kZWxldGUoaXRlbS5rZXkpO1xuICAgICAgICB0aGlzLnJlbW92ZUl0ZW0oaXRlbSk7XG4gICAgICAgIHRoaXMuX3NpemUtLTtcbiAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7XG4gICAgfVxuICAgIGZvckVhY2goY2FsbGJhY2tmbiwgdGhpc0FyZykge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3N0YXRlO1xuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICAgICAgICBpZiAodGhpc0FyZykge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrZm4uYmluZCh0aGlzQXJnKShjdXJyZW50LnZhbHVlLCBjdXJyZW50LmtleSwgdGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFja2ZuKGN1cnJlbnQudmFsdWUsIGN1cnJlbnQua2V5LCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gc3RhdGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExpbmtlZE1hcCBnb3QgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAga2V5cygpIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9zdGF0ZTtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLl9oZWFkO1xuICAgICAgICBjb25zdCBpdGVyYXRvciA9IHtcbiAgICAgICAgICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fc3RhdGUgIT09IHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTGlua2VkTWFwIGdvdCBtb2RpZmllZCBkdXJpbmcgaXRlcmF0aW9uLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7IHZhbHVlOiBjdXJyZW50LmtleSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICB9XG4gICAgdmFsdWVzKCkge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3N0YXRlO1xuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIGNvbnN0IGl0ZXJhdG9yID0ge1xuICAgICAgICAgICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlcmF0b3I7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBMaW5rZWRNYXAgZ290IG1vZGlmaWVkIGR1cmluZyBpdGVyYXRpb24uYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHsgdmFsdWU6IGN1cnJlbnQudmFsdWUsIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gaXRlcmF0b3I7XG4gICAgfVxuICAgIGVudHJpZXMoKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5fc3RhdGU7XG4gICAgICAgIGxldCBjdXJyZW50ID0gdGhpcy5faGVhZDtcbiAgICAgICAgY29uc3QgaXRlcmF0b3IgPSB7XG4gICAgICAgICAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3N0YXRlICE9PSBzdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExpbmtlZE1hcCBnb3QgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geyB2YWx1ZTogW2N1cnJlbnQua2V5LCBjdXJyZW50LnZhbHVlXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICB9XG4gICAgWyhfYSA9IFN5bWJvbC50b1N0cmluZ1RhZywgU3ltYm9sLml0ZXJhdG9yKV0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMoKTtcbiAgICB9XG4gICAgdHJpbU9sZChuZXdTaXplKSB7XG4gICAgICAgIGlmIChuZXdTaXplID49IHRoaXMuc2l6ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuZXdTaXplID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLl9oZWFkO1xuICAgICAgICBsZXQgY3VycmVudFNpemUgPSB0aGlzLnNpemU7XG4gICAgICAgIHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnRTaXplID4gbmV3U2l6ZSkge1xuICAgICAgICAgICAgdGhpcy5fbWFwLmRlbGV0ZShjdXJyZW50LmtleSk7XG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0O1xuICAgICAgICAgICAgY3VycmVudFNpemUtLTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9oZWFkID0gY3VycmVudDtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IGN1cnJlbnRTaXplO1xuICAgICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICAgICAgY3VycmVudC5wcmV2aW91cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgIH1cbiAgICBhZGRJdGVtRmlyc3QoaXRlbSkge1xuICAgICAgICAvLyBGaXJzdCB0aW1lIEluc2VydFxuICAgICAgICBpZiAoIXRoaXMuX2hlYWQgJiYgIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRoaXMuX3RhaWwgPSBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCF0aGlzLl9oZWFkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbGlzdCcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdGhpcy5faGVhZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQucHJldmlvdXMgPSBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2hlYWQgPSBpdGVtO1xuICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgIH1cbiAgICBhZGRJdGVtTGFzdChpdGVtKSB7XG4gICAgICAgIC8vIEZpcnN0IHRpbWUgSW5zZXJ0XG4gICAgICAgIGlmICghdGhpcy5faGVhZCAmJiAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgdGhpcy5faGVhZCA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpdGVtLnByZXZpb3VzID0gdGhpcy5fdGFpbDtcbiAgICAgICAgICAgIHRoaXMuX3RhaWwubmV4dCA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW07XG4gICAgICAgIHRoaXMuX3N0YXRlKys7XG4gICAgfVxuICAgIHJlbW92ZUl0ZW0oaXRlbSkge1xuICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCAmJiBpdGVtID09PSB0aGlzLl90YWlsKSB7XG4gICAgICAgICAgICB0aGlzLl9oZWFkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpdGVtID09PSB0aGlzLl9oZWFkKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGNhbiBvbmx5IGhhcHBlbmVkIGlmIHNpemUgPT09IDEgd2hpY2ggaXMgaGFuZGxlXG4gICAgICAgICAgICAvLyBieSB0aGUgY2FzZSBhYm92ZS5cbiAgICAgICAgICAgIGlmICghaXRlbS5uZXh0KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxpc3QnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGl0ZW0ubmV4dC5wcmV2aW91cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQgPSBpdGVtLm5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXRlbSA9PT0gdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgLy8gVGhpcyBjYW4gb25seSBoYXBwZW5lZCBpZiBzaXplID09PSAxIHdoaWNoIGlzIGhhbmRsZVxuICAgICAgICAgICAgLy8gYnkgdGhlIGNhc2UgYWJvdmUuXG4gICAgICAgICAgICBpZiAoIWl0ZW0ucHJldmlvdXMpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbGlzdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbS5wcmV2aW91cy5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gaXRlbS5uZXh0O1xuICAgICAgICAgICAgY29uc3QgcHJldmlvdXMgPSBpdGVtLnByZXZpb3VzO1xuICAgICAgICAgICAgaWYgKCFuZXh0IHx8ICFwcmV2aW91cykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXh0LnByZXZpb3VzID0gcHJldmlvdXM7XG4gICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gbmV4dDtcbiAgICAgICAgfVxuICAgICAgICBpdGVtLm5leHQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGl0ZW0ucHJldmlvdXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX3N0YXRlKys7XG4gICAgfVxuICAgIHRvdWNoKGl0ZW0sIHRvdWNoKSB7XG4gICAgICAgIGlmICghdGhpcy5faGVhZCB8fCAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxpc3QnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHRvdWNoICE9PSBUb3VjaC5GaXJzdCAmJiB0b3VjaCAhPT0gVG91Y2guTGFzdCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG91Y2ggPT09IFRvdWNoLkZpcnN0KSB7XG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBpdGVtLm5leHQ7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgICAgICAvLyBVbmxpbmsgdGhlIGl0ZW1cbiAgICAgICAgICAgIGlmIChpdGVtID09PSB0aGlzLl90YWlsKSB7XG4gICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgbXVzdCBiZSBkZWZpbmVkIHNpbmNlIGl0ZW0gd2FzIG5vdCBoZWFkIGJ1dCBpcyB0YWlsXG4gICAgICAgICAgICAgICAgLy8gU28gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbiBpdGVtIGluIHRoZSBtYXBcbiAgICAgICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuX3RhaWwgPSBwcmV2aW91cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEJvdGggbmV4dCBhbmQgcHJldmlvdXMgYXJlIG5vdCB1bmRlZmluZWQgc2luY2UgaXRlbSB3YXMgbmVpdGhlciBoZWFkIG5vciB0YWlsLlxuICAgICAgICAgICAgICAgIG5leHQucHJldmlvdXMgPSBwcmV2aW91cztcbiAgICAgICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEluc2VydCB0aGUgbm9kZSBhdCBoZWFkXG4gICAgICAgICAgICBpdGVtLnByZXZpb3VzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdGhpcy5faGVhZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQucHJldmlvdXMgPSBpdGVtO1xuICAgICAgICAgICAgdGhpcy5faGVhZCA9IGl0ZW07XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRvdWNoID09PSBUb3VjaC5MYXN0KSB7XG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBpdGVtLm5leHQ7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgICAgICAvLyBVbmxpbmsgdGhlIGl0ZW0uXG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCkge1xuICAgICAgICAgICAgICAgIC8vIG5leHQgbXVzdCBiZSBkZWZpbmVkIHNpbmNlIGl0ZW0gd2FzIG5vdCB0YWlsIGJ1dCBpcyBoZWFkXG4gICAgICAgICAgICAgICAgLy8gU28gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbiBpdGVtIGluIHRoZSBtYXBcbiAgICAgICAgICAgICAgICBuZXh0LnByZXZpb3VzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuX2hlYWQgPSBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQm90aCBuZXh0IGFuZCBwcmV2aW91cyBhcmUgbm90IHVuZGVmaW5lZCBzaW5jZSBpdGVtIHdhcyBuZWl0aGVyIGhlYWQgbm9yIHRhaWwuXG4gICAgICAgICAgICAgICAgbmV4dC5wcmV2aW91cyA9IHByZXZpb3VzO1xuICAgICAgICAgICAgICAgIHByZXZpb3VzLm5leHQgPSBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaXRlbS5wcmV2aW91cyA9IHRoaXMuX3RhaWw7XG4gICAgICAgICAgICB0aGlzLl90YWlsLm5leHQgPSBpdGVtO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW07XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IFtdO1xuICAgICAgICB0aGlzLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGRhdGEucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGZyb21KU09OKGRhdGEpIHtcbiAgICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBkYXRhKSB7XG4gICAgICAgICAgICB0aGlzLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuTGlua2VkTWFwID0gTGlua2VkTWFwO1xuY2xhc3MgTFJVQ2FjaGUgZXh0ZW5kcyBMaW5rZWRNYXAge1xuICAgIGNvbnN0cnVjdG9yKGxpbWl0LCByYXRpbyA9IDEpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fbGltaXQgPSBsaW1pdDtcbiAgICAgICAgdGhpcy5fcmF0aW8gPSBNYXRoLm1pbihNYXRoLm1heCgwLCByYXRpbyksIDEpO1xuICAgIH1cbiAgICBnZXQgbGltaXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9saW1pdDtcbiAgICB9XG4gICAgc2V0IGxpbWl0KGxpbWl0KSB7XG4gICAgICAgIHRoaXMuX2xpbWl0ID0gbGltaXQ7XG4gICAgICAgIHRoaXMuY2hlY2tUcmltKCk7XG4gICAgfVxuICAgIGdldCByYXRpbygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JhdGlvO1xuICAgIH1cbiAgICBzZXQgcmF0aW8ocmF0aW8pIHtcbiAgICAgICAgdGhpcy5fcmF0aW8gPSBNYXRoLm1pbihNYXRoLm1heCgwLCByYXRpbyksIDEpO1xuICAgICAgICB0aGlzLmNoZWNrVHJpbSgpO1xuICAgIH1cbiAgICBnZXQoa2V5LCB0b3VjaCA9IFRvdWNoLkFzTmV3KSB7XG4gICAgICAgIHJldHVybiBzdXBlci5nZXQoa2V5LCB0b3VjaCk7XG4gICAgfVxuICAgIHBlZWsoa2V5KSB7XG4gICAgICAgIHJldHVybiBzdXBlci5nZXQoa2V5LCBUb3VjaC5Ob25lKTtcbiAgICB9XG4gICAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgc3VwZXIuc2V0KGtleSwgdmFsdWUsIFRvdWNoLkxhc3QpO1xuICAgICAgICB0aGlzLmNoZWNrVHJpbSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgY2hlY2tUcmltKCkge1xuICAgICAgICBpZiAodGhpcy5zaXplID4gdGhpcy5fbGltaXQpIHtcbiAgICAgICAgICAgIHRoaXMudHJpbU9sZChNYXRoLnJvdW5kKHRoaXMuX2xpbWl0ICogdGhpcy5fcmF0aW8pKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuTFJVQ2FjaGUgPSBMUlVDYWNoZTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5EaXNwb3NhYmxlID0gdm9pZCAwO1xudmFyIERpc3Bvc2FibGU7XG4oZnVuY3Rpb24gKERpc3Bvc2FibGUpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUoZnVuYykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGlzcG9zZTogZnVuY1xuICAgICAgICB9O1xuICAgIH1cbiAgICBEaXNwb3NhYmxlLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKERpc3Bvc2FibGUgfHwgKGV4cG9ydHMuRGlzcG9zYWJsZSA9IERpc3Bvc2FibGUgPSB7fSkpO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xubGV0IF9yYWw7XG5mdW5jdGlvbiBSQUwoKSB7XG4gICAgaWYgKF9yYWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHJ1bnRpbWUgYWJzdHJhY3Rpb24gbGF5ZXIgaW5zdGFsbGVkYCk7XG4gICAgfVxuICAgIHJldHVybiBfcmFsO1xufVxuKGZ1bmN0aW9uIChSQUwpIHtcbiAgICBmdW5jdGlvbiBpbnN0YWxsKHJhbCkge1xuICAgICAgICBpZiAocmFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gcnVudGltZSBhYnN0cmFjdGlvbiBsYXllciBwcm92aWRlZGApO1xuICAgICAgICB9XG4gICAgICAgIF9yYWwgPSByYWw7XG4gICAgfVxuICAgIFJBTC5pbnN0YWxsID0gaW5zdGFsbDtcbn0pKFJBTCB8fCAoUkFMID0ge30pKTtcbmV4cG9ydHMuZGVmYXVsdCA9IFJBTDtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuRW1pdHRlciA9IGV4cG9ydHMuRXZlbnQgPSB2b2lkIDA7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbnZhciBFdmVudDtcbihmdW5jdGlvbiAoRXZlbnQpIHtcbiAgICBjb25zdCBfZGlzcG9zYWJsZSA9IHsgZGlzcG9zZSgpIHsgfSB9O1xuICAgIEV2ZW50Lk5vbmUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBfZGlzcG9zYWJsZTsgfTtcbn0pKEV2ZW50IHx8IChleHBvcnRzLkV2ZW50ID0gRXZlbnQgPSB7fSkpO1xuY2xhc3MgQ2FsbGJhY2tMaXN0IHtcbiAgICBhZGQoY2FsbGJhY2ssIGNvbnRleHQgPSBudWxsLCBidWNrZXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fY29udGV4dHMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgICAgIHRoaXMuX2NvbnRleHRzLnB1c2goY29udGV4dCk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGJ1Y2tldCkpIHtcbiAgICAgICAgICAgIGJ1Y2tldC5wdXNoKHsgZGlzcG9zZTogKCkgPT4gdGhpcy5yZW1vdmUoY2FsbGJhY2ssIGNvbnRleHQpIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlbW92ZShjYWxsYmFjaywgY29udGV4dCA9IG51bGwpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZm91bmRDYWxsYmFja1dpdGhEaWZmZXJlbnRDb250ZXh0ID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLl9jYWxsYmFja3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jYWxsYmFja3NbaV0gPT09IGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NvbnRleHRzW2ldID09PSBjb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrICYgY29udGV4dCBtYXRjaCA9PiByZW1vdmUgaXRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29udGV4dHMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZENhbGxiYWNrV2l0aERpZmZlcmVudENvbnRleHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZm91bmRDYWxsYmFja1dpdGhEaWZmZXJlbnRDb250ZXh0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1doZW4gYWRkaW5nIGEgbGlzdGVuZXIgd2l0aCBhIGNvbnRleHQsIHlvdSBzaG91bGQgcmVtb3ZlIGl0IHdpdGggdGhlIHNhbWUgY29udGV4dCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGludm9rZSguLi5hcmdzKSB7XG4gICAgICAgIGlmICghdGhpcy5fY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmV0ID0gW10sIGNhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcy5zbGljZSgwKSwgY29udGV4dHMgPSB0aGlzLl9jb250ZXh0cy5zbGljZSgwKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXQucHVzaChjYWxsYmFja3NbaV0uYXBwbHkoY29udGV4dHNbaV0sIGFyZ3MpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS5jb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICAgIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5fY2FsbGJhY2tzIHx8IHRoaXMuX2NhbGxiYWNrcy5sZW5ndGggPT09IDA7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fY29udGV4dHMgPSB1bmRlZmluZWQ7XG4gICAgfVxufVxuY2xhc3MgRW1pdHRlciB7XG4gICAgY29uc3RydWN0b3IoX29wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IF9vcHRpb25zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGb3IgdGhlIHB1YmxpYyB0byBhbGxvdyB0byBzdWJzY3JpYmVcbiAgICAgKiB0byBldmVudHMgZnJvbSB0aGlzIEVtaXR0ZXJcbiAgICAgKi9cbiAgICBnZXQgZXZlbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fZXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50ID0gKGxpc3RlbmVyLCB0aGlzQXJncywgZGlzcG9zYWJsZXMpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2NhbGxiYWNrcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWxsYmFja3MgPSBuZXcgQ2FsbGJhY2tMaXN0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMub25GaXJzdExpc3RlbmVyQWRkICYmIHRoaXMuX2NhbGxiYWNrcy5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy5vbkZpcnN0TGlzdGVuZXJBZGQodGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5hZGQobGlzdGVuZXIsIHRoaXNBcmdzKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlzcG9zYWJsZSBpcyBkaXNwb3NlZCBhZnRlciBlbWl0dGVyIGlzIGRpc3Bvc2VkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5yZW1vdmUobGlzdGVuZXIsIHRoaXNBcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5kaXNwb3NlID0gRW1pdHRlci5fbm9vcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMub25MYXN0TGlzdGVuZXJSZW1vdmUgJiYgdGhpcy5fY2FsbGJhY2tzLmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29wdGlvbnMub25MYXN0TGlzdGVuZXJSZW1vdmUodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRpc3Bvc2FibGVzKSkge1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlcy5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9ldmVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVG8gYmUga2VwdCBwcml2YXRlIHRvIGZpcmUgYW4gZXZlbnQgdG9cbiAgICAgKiBzdWJzY3JpYmVyc1xuICAgICAqL1xuICAgIGZpcmUoZXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NhbGxiYWNrcykge1xuICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzLmludm9rZS5jYWxsKHRoaXMuX2NhbGxiYWNrcywgZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5kaXNwb3NlKCk7XG4gICAgICAgICAgICB0aGlzLl9jYWxsYmFja3MgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLkVtaXR0ZXIgPSBFbWl0dGVyO1xuRW1pdHRlci5fbm9vcCA9IGZ1bmN0aW9uICgpIHsgfTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uVG9rZW4gPSB2b2lkIDA7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbmNvbnN0IElzID0gcmVxdWlyZShcIi4vaXNcIik7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCIuL2V2ZW50c1wiKTtcbnZhciBDYW5jZWxsYXRpb25Ub2tlbjtcbihmdW5jdGlvbiAoQ2FuY2VsbGF0aW9uVG9rZW4pIHtcbiAgICBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGlzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkOiBmYWxzZSxcbiAgICAgICAgb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6IGV2ZW50c18xLkV2ZW50Lk5vbmVcbiAgICB9KTtcbiAgICBDYW5jZWxsYXRpb25Ub2tlbi5DYW5jZWxsZWQgPSBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6IHRydWUsXG4gICAgICAgIG9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkOiBldmVudHNfMS5FdmVudC5Ob25lXG4gICAgfSk7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgKGNhbmRpZGF0ZSA9PT0gQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZVxuICAgICAgICAgICAgfHwgY2FuZGlkYXRlID09PSBDYW5jZWxsYXRpb25Ub2tlbi5DYW5jZWxsZWRcbiAgICAgICAgICAgIHx8IChJcy5ib29sZWFuKGNhbmRpZGF0ZS5pc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkgJiYgISFjYW5kaWRhdGUub25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQpKTtcbiAgICB9XG4gICAgQ2FuY2VsbGF0aW9uVG9rZW4uaXMgPSBpcztcbn0pKENhbmNlbGxhdGlvblRva2VuIHx8IChleHBvcnRzLkNhbmNlbGxhdGlvblRva2VuID0gQ2FuY2VsbGF0aW9uVG9rZW4gPSB7fSkpO1xuY29uc3Qgc2hvcnRjdXRFdmVudCA9IE9iamVjdC5mcmVlemUoZnVuY3Rpb24gKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgY29uc3QgaGFuZGxlID0gKDAsIHJhbF8xLmRlZmF1bHQpKCkudGltZXIuc2V0VGltZW91dChjYWxsYmFjay5iaW5kKGNvbnRleHQpLCAwKTtcbiAgICByZXR1cm4geyBkaXNwb3NlKCkgeyBoYW5kbGUuZGlzcG9zZSgpOyB9IH07XG59KTtcbmNsYXNzIE11dGFibGVUb2tlbiB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX2lzQ2FuY2VsbGVkID0gZmFsc2U7XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9pc0NhbmNlbGxlZCkge1xuICAgICAgICAgICAgdGhpcy5faXNDYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2VtaXR0ZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmZpcmUodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0NhbmNlbGxlZDtcbiAgICB9XG4gICAgZ2V0IG9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKCkge1xuICAgICAgICBpZiAodGhpcy5faXNDYW5jZWxsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBzaG9ydGN1dEV2ZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5fZW1pdHRlcikge1xuICAgICAgICAgICAgdGhpcy5fZW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2VtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLl9lbWl0dGVyKSB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5jbGFzcyBDYW5jZWxsYXRpb25Ub2tlblNvdXJjZSB7XG4gICAgZ2V0IHRva2VuKCkge1xuICAgICAgICBpZiAoIXRoaXMuX3Rva2VuKSB7XG4gICAgICAgICAgICAvLyBiZSBsYXp5IGFuZCBjcmVhdGUgdGhlIHRva2VuIG9ubHkgd2hlblxuICAgICAgICAgICAgLy8gYWN0dWFsbHkgbmVlZGVkXG4gICAgICAgICAgICB0aGlzLl90b2tlbiA9IG5ldyBNdXRhYmxlVG9rZW4oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fdG9rZW47XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl90b2tlbikge1xuICAgICAgICAgICAgLy8gc2F2ZSBhbiBvYmplY3QgYnkgcmV0dXJuaW5nIHRoZSBkZWZhdWx0XG4gICAgICAgICAgICAvLyBjYW5jZWxsZWQgdG9rZW4gd2hlbiBjYW5jZWxsYXRpb24gaGFwcGVuc1xuICAgICAgICAgICAgLy8gYmVmb3JlIHNvbWVvbmUgYXNrcyBmb3IgdGhlIHRva2VuXG4gICAgICAgICAgICB0aGlzLl90b2tlbiA9IENhbmNlbGxhdGlvblRva2VuLkNhbmNlbGxlZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3Rva2VuLmNhbmNlbCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICghdGhpcy5fdG9rZW4pIHtcbiAgICAgICAgICAgIC8vIGVuc3VyZSB0byBpbml0aWFsaXplIHdpdGggYW4gZW1wdHkgdG9rZW4gaWYgd2UgaGFkIG5vbmVcbiAgICAgICAgICAgIHRoaXMuX3Rva2VuID0gQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLl90b2tlbiBpbnN0YW5jZW9mIE11dGFibGVUb2tlbikge1xuICAgICAgICAgICAgLy8gYWN0dWFsbHkgZGlzcG9zZVxuICAgICAgICAgICAgdGhpcy5fdG9rZW4uZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IENhbmNlbGxhdGlvblRva2VuU291cmNlO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3kgPSB2b2lkIDA7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbnZhciBDYW5jZWxsYXRpb25TdGF0ZTtcbihmdW5jdGlvbiAoQ2FuY2VsbGF0aW9uU3RhdGUpIHtcbiAgICBDYW5jZWxsYXRpb25TdGF0ZS5Db250aW51ZSA9IDA7XG4gICAgQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkID0gMTtcbn0pKENhbmNlbGxhdGlvblN0YXRlIHx8IChDYW5jZWxsYXRpb25TdGF0ZSA9IHt9KSk7XG5jbGFzcyBTaGFyZWRBcnJheVNlbmRlclN0cmF0ZWd5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5idWZmZXJzID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICBlbmFibGVDYW5jZWxsYXRpb24ocmVxdWVzdCkge1xuICAgICAgICBpZiAocmVxdWVzdC5pZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBTaGFyZWRBcnJheUJ1ZmZlcig0KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBJbnQzMkFycmF5KGJ1ZmZlciwgMCwgMSk7XG4gICAgICAgIGRhdGFbMF0gPSBDYW5jZWxsYXRpb25TdGF0ZS5Db250aW51ZTtcbiAgICAgICAgdGhpcy5idWZmZXJzLnNldChyZXF1ZXN0LmlkLCBidWZmZXIpO1xuICAgICAgICByZXF1ZXN0LiRjYW5jZWxsYXRpb25EYXRhID0gYnVmZmVyO1xuICAgIH1cbiAgICBhc3luYyBzZW5kQ2FuY2VsbGF0aW9uKF9jb25uLCBpZCkge1xuICAgICAgICBjb25zdCBidWZmZXIgPSB0aGlzLmJ1ZmZlcnMuZ2V0KGlkKTtcbiAgICAgICAgaWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBJbnQzMkFycmF5KGJ1ZmZlciwgMCwgMSk7XG4gICAgICAgIEF0b21pY3Muc3RvcmUoZGF0YSwgMCwgQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkKTtcbiAgICB9XG4gICAgY2xlYW51cChpZCkge1xuICAgICAgICB0aGlzLmJ1ZmZlcnMuZGVsZXRlKGlkKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy5idWZmZXJzLmNsZWFyKCk7XG4gICAgfVxufVxuZXhwb3J0cy5TaGFyZWRBcnJheVNlbmRlclN0cmF0ZWd5ID0gU2hhcmVkQXJyYXlTZW5kZXJTdHJhdGVneTtcbmNsYXNzIFNoYXJlZEFycmF5QnVmZmVyQ2FuY2VsbGF0aW9uVG9rZW4ge1xuICAgIGNvbnN0cnVjdG9yKGJ1ZmZlcikge1xuICAgICAgICB0aGlzLmRhdGEgPSBuZXcgSW50MzJBcnJheShidWZmZXIsIDAsIDEpO1xuICAgIH1cbiAgICBnZXQgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHJldHVybiBBdG9taWNzLmxvYWQodGhpcy5kYXRhLCAwKSA9PT0gQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkO1xuICAgIH1cbiAgICBnZXQgb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuY2VsbGF0aW9uIG92ZXIgU2hhcmVkQXJyYXlCdWZmZXIgZG9lc24ndCBzdXBwb3J0IGNhbmNlbGxhdGlvbiBldmVudHNgKTtcbiAgICB9XG59XG5jbGFzcyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuU291cmNlIHtcbiAgICBjb25zdHJ1Y3RvcihidWZmZXIpIHtcbiAgICAgICAgdGhpcy50b2tlbiA9IG5ldyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuKGJ1ZmZlcik7XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICB9XG59XG5jbGFzcyBTaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmtpbmQgPSAncmVxdWVzdCc7XG4gICAgfVxuICAgIGNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKHJlcXVlc3QpIHtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gcmVxdWVzdC4kY2FuY2VsbGF0aW9uRGF0YTtcbiAgICAgICAgaWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuU291cmNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuU291cmNlKGJ1ZmZlcik7XG4gICAgfVxufVxuZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBTaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3k7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNlbWFwaG9yZSA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY2xhc3MgU2VtYXBob3JlIHtcbiAgICBjb25zdHJ1Y3RvcihjYXBhY2l0eSA9IDEpIHtcbiAgICAgICAgaWYgKGNhcGFjaXR5IDw9IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FwYWNpdHkgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NhcGFjaXR5ID0gY2FwYWNpdHk7XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IDA7XG4gICAgICAgIHRoaXMuX3dhaXRpbmcgPSBbXTtcbiAgICB9XG4gICAgbG9jayh0aHVuaykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fd2FpdGluZy5wdXNoKHsgdGh1bmssIHJlc29sdmUsIHJlamVjdCB9KTtcbiAgICAgICAgICAgIHRoaXMucnVuTmV4dCgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0IGFjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTtcbiAgICB9XG4gICAgcnVuTmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dhaXRpbmcubGVuZ3RoID09PSAwIHx8IHRoaXMuX2FjdGl2ZSA9PT0gdGhpcy5fY2FwYWNpdHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS50aW1lci5zZXRJbW1lZGlhdGUoKCkgPT4gdGhpcy5kb1J1bk5leHQoKSk7XG4gICAgfVxuICAgIGRvUnVuTmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dhaXRpbmcubGVuZ3RoID09PSAwIHx8IHRoaXMuX2FjdGl2ZSA9PT0gdGhpcy5fY2FwYWNpdHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5fd2FpdGluZy5zaGlmdCgpO1xuICAgICAgICB0aGlzLl9hY3RpdmUrKztcbiAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZSA+IHRoaXMuX2NhcGFjaXR5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRvIG1hbnkgdGh1bmtzIGFjdGl2ZWApO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXh0LnRodW5rKCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC50aGVuKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5yZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5OZXh0KCk7XG4gICAgICAgICAgICAgICAgfSwgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5yZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5OZXh0KCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICBuZXh0LnJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1bk5leHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgIG5leHQucmVqZWN0KGVycik7XG4gICAgICAgICAgICB0aGlzLnJ1bk5leHQoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuU2VtYXBob3JlID0gU2VtYXBob3JlO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXIgPSBleHBvcnRzLkFic3RyYWN0TWVzc2FnZVJlYWRlciA9IGV4cG9ydHMuTWVzc2FnZVJlYWRlciA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IGV2ZW50c18xID0gcmVxdWlyZShcIi4vZXZlbnRzXCIpO1xuY29uc3Qgc2VtYXBob3JlXzEgPSByZXF1aXJlKFwiLi9zZW1hcGhvcmVcIik7XG52YXIgTWVzc2FnZVJlYWRlcjtcbihmdW5jdGlvbiAoTWVzc2FnZVJlYWRlcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5saXN0ZW4pICYmIElzLmZ1bmMoY2FuZGlkYXRlLmRpc3Bvc2UpICYmXG4gICAgICAgICAgICBJcy5mdW5jKGNhbmRpZGF0ZS5vbkVycm9yKSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5vbkNsb3NlKSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5vblBhcnRpYWxNZXNzYWdlKTtcbiAgICB9XG4gICAgTWVzc2FnZVJlYWRlci5pcyA9IGlzO1xufSkoTWVzc2FnZVJlYWRlciB8fCAoZXhwb3J0cy5NZXNzYWdlUmVhZGVyID0gTWVzc2FnZVJlYWRlciA9IHt9KSk7XG5jbGFzcyBBYnN0cmFjdE1lc3NhZ2VSZWFkZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZUVtaXR0ZXIgPSBuZXcgZXZlbnRzXzEuRW1pdHRlcigpO1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlci5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgZ2V0IG9uRXJyb3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVycm9yRW1pdHRlci5ldmVudDtcbiAgICB9XG4gICAgZmlyZUVycm9yKGVycm9yKSB7XG4gICAgICAgIHRoaXMuZXJyb3JFbWl0dGVyLmZpcmUodGhpcy5hc0Vycm9yKGVycm9yKSk7XG4gICAgfVxuICAgIGdldCBvbkNsb3NlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9zZUVtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGZpcmVDbG9zZSgpIHtcbiAgICAgICAgdGhpcy5jbG9zZUVtaXR0ZXIuZmlyZSh1bmRlZmluZWQpO1xuICAgIH1cbiAgICBnZXQgb25QYXJ0aWFsTWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFydGlhbE1lc3NhZ2VFbWl0dGVyLmV2ZW50O1xuICAgIH1cbiAgICBmaXJlUGFydGlhbE1lc3NhZ2UoaW5mbykge1xuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlRW1pdHRlci5maXJlKGluZm8pO1xuICAgIH1cbiAgICBhc0Vycm9yKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKGBSZWFkZXIgcmVjZWl2ZWQgZXJyb3IuIFJlYXNvbjogJHtJcy5zdHJpbmcoZXJyb3IubWVzc2FnZSkgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24nfWApO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VSZWFkZXIgPSBBYnN0cmFjdE1lc3NhZ2VSZWFkZXI7XG52YXIgUmVzb2x2ZWRNZXNzYWdlUmVhZGVyT3B0aW9ucztcbihmdW5jdGlvbiAoUmVzb2x2ZWRNZXNzYWdlUmVhZGVyT3B0aW9ucykge1xuICAgIGZ1bmN0aW9uIGZyb21PcHRpb25zKG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IGNoYXJzZXQ7XG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIGxldCBjb250ZW50RGVjb2RlcjtcbiAgICAgICAgY29uc3QgY29udGVudERlY29kZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICBsZXQgY29udGVudFR5cGVEZWNvZGVyO1xuICAgICAgICBjb25zdCBjb250ZW50VHlwZURlY29kZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY2hhcnNldCA9IG9wdGlvbnMgPz8gJ3V0Zi04JztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNoYXJzZXQgPSBvcHRpb25zLmNoYXJzZXQgPz8gJ3V0Zi04JztcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnREZWNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50RGVjb2RlciA9IG9wdGlvbnMuY29udGVudERlY29kZXI7XG4gICAgICAgICAgICAgICAgY29udGVudERlY29kZXJzLnNldChjb250ZW50RGVjb2Rlci5uYW1lLCBjb250ZW50RGVjb2Rlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5jb250ZW50RGVjb2RlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGVjb2RlciBvZiBvcHRpb25zLmNvbnRlbnREZWNvZGVycykge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50RGVjb2RlcnMuc2V0KGRlY29kZXIubmFtZSwgZGVjb2Rlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuY29udGVudFR5cGVEZWNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXIgPSBvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcjtcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXJzLnNldChjb250ZW50VHlwZURlY29kZXIubmFtZSwgY29udGVudFR5cGVEZWNvZGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGVjb2RlciBvZiBvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGVEZWNvZGVycy5zZXQoZGVjb2Rlci5uYW1lLCBkZWNvZGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnRlbnRUeXBlRGVjb2RlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXIgPSAoMCwgcmFsXzEuZGVmYXVsdCkoKS5hcHBsaWNhdGlvbkpzb24uZGVjb2RlcjtcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlRGVjb2RlcnMuc2V0KGNvbnRlbnRUeXBlRGVjb2Rlci5uYW1lLCBjb250ZW50VHlwZURlY29kZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGNoYXJzZXQsIGNvbnRlbnREZWNvZGVyLCBjb250ZW50RGVjb2RlcnMsIGNvbnRlbnRUeXBlRGVjb2RlciwgY29udGVudFR5cGVEZWNvZGVycyB9O1xuICAgIH1cbiAgICBSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zLmZyb21PcHRpb25zID0gZnJvbU9wdGlvbnM7XG59KShSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zIHx8IChSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zID0ge30pKTtcbmNsYXNzIFJlYWRhYmxlU3RyZWFtTWVzc2FnZVJlYWRlciBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVJlYWRlciB7XG4gICAgY29uc3RydWN0b3IocmVhZGFibGUsIG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZSA9IHJlYWRhYmxlO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zLmZyb21PcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmJ1ZmZlciA9ICgwLCByYWxfMS5kZWZhdWx0KSgpLm1lc3NhZ2VCdWZmZXIuY3JlYXRlKHRoaXMub3B0aW9ucy5jaGFyc2V0KTtcbiAgICAgICAgdGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0ID0gMTAwMDA7XG4gICAgICAgIHRoaXMubmV4dE1lc3NhZ2VMZW5ndGggPSAtMTtcbiAgICAgICAgdGhpcy5tZXNzYWdlVG9rZW4gPSAwO1xuICAgICAgICB0aGlzLnJlYWRTZW1hcGhvcmUgPSBuZXcgc2VtYXBob3JlXzEuU2VtYXBob3JlKDEpO1xuICAgIH1cbiAgICBzZXQgcGFydGlhbE1lc3NhZ2VUaW1lb3V0KHRpbWVvdXQpIHtcbiAgICAgICAgdGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0ID0gdGltZW91dDtcbiAgICB9XG4gICAgZ2V0IHBhcnRpYWxNZXNzYWdlVGltZW91dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dDtcbiAgICB9XG4gICAgbGlzdGVuKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMubmV4dE1lc3NhZ2VMZW5ndGggPSAtMTtcbiAgICAgICAgdGhpcy5tZXNzYWdlVG9rZW4gPSAwO1xuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlVGltZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5yZWFkYWJsZS5vbkRhdGEoKGRhdGEpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25EYXRhKGRhdGEpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZS5vbkVycm9yKChlcnJvcikgPT4gdGhpcy5maXJlRXJyb3IoZXJyb3IpKTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZS5vbkNsb3NlKCgpID0+IHRoaXMuZmlyZUNsb3NlKCkpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBvbkRhdGEoZGF0YSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5idWZmZXIuYXBwZW5kKGRhdGEpO1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IHRoaXMuYnVmZmVyLnRyeVJlYWRIZWFkZXJzKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50TGVuZ3RoID0gaGVhZGVycy5nZXQoJ2NvbnRlbnQtbGVuZ3RoJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY29udGVudExlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IobmV3IEVycm9yKGBIZWFkZXIgbXVzdCBwcm92aWRlIGEgQ29udGVudC1MZW5ndGggcHJvcGVydHkuXFxuJHtKU09OLnN0cmluZ2lmeShPYmplY3QuZnJvbUVudHJpZXMoaGVhZGVycykpfWApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsZW5ndGggPSBwYXJzZUludChjb250ZW50TGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKGxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKG5ldyBFcnJvcihgQ29udGVudC1MZW5ndGggdmFsdWUgbXVzdCBiZSBhIG51bWJlci4gR290ICR7Y29udGVudExlbmd0aH1gKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IHRoaXMuYnVmZmVyLnRyeVJlYWRCb2R5KHRoaXMubmV4dE1lc3NhZ2VMZW5ndGgpO1xuICAgICAgICAgICAgICAgIGlmIChib2R5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLyoqIFdlIGhhdmVuJ3QgcmVjZWl2ZWQgdGhlIGZ1bGwgbWVzc2FnZSB5ZXQuICovXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0UGFydGlhbE1lc3NhZ2VUaW1lcigpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJQYXJ0aWFsTWVzc2FnZVRpbWVyKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9IC0xO1xuICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHdlIGNvbnZlcnQgb25lIHJlY2VpdmVkIG1lc3NhZ2UgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAgICAgLy8gb3RoZXIuIE90aGVyd2lzZSBpdCBjb3VsZCBoYXBwZW4gdGhhdCBhIGRlY29kaW5nIG9mIGEgc2Vjb25kXG4gICAgICAgICAgICAgICAgLy8gc21hbGxlciBtZXNzYWdlIGZpbmlzaGVkIGJlZm9yZSB0aGUgZGVjb2Rpbmcgb2YgYSBmaXJzdCBsYXJnZXJcbiAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIGFuZCB0aGVuIHdlIHdvdWxkIGRlbGl2ZXIgdGhlIHNlY29uZCBtZXNzYWdlIGZpcnN0LlxuICAgICAgICAgICAgICAgIHRoaXMucmVhZFNlbWFwaG9yZS5sb2NrKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnl0ZXMgPSB0aGlzLm9wdGlvbnMuY29udGVudERlY29kZXIgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBhd2FpdCB0aGlzLm9wdGlvbnMuY29udGVudERlY29kZXIuZGVjb2RlKGJvZHkpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGJvZHk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBhd2FpdCB0aGlzLm9wdGlvbnMuY29udGVudFR5cGVEZWNvZGVyLmRlY29kZShieXRlcywgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjayhtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNsZWFyUGFydGlhbE1lc3NhZ2VUaW1lcigpIHtcbiAgICAgICAgaWYgKHRoaXMucGFydGlhbE1lc3NhZ2VUaW1lcikge1xuICAgICAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZVRpbWVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRoaXMucGFydGlhbE1lc3NhZ2VUaW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRQYXJ0aWFsTWVzc2FnZVRpbWVyKCkge1xuICAgICAgICB0aGlzLmNsZWFyUGFydGlhbE1lc3NhZ2VUaW1lcigpO1xuICAgICAgICBpZiAodGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0IDw9IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlVGltZXIgPSAoMCwgcmFsXzEuZGVmYXVsdCkoKS50aW1lci5zZXRUaW1lb3V0KCh0b2tlbiwgdGltZW91dCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZVRpbWVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRva2VuID09PSB0aGlzLm1lc3NhZ2VUb2tlbikge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZVBhcnRpYWxNZXNzYWdlKHsgbWVzc2FnZVRva2VuOiB0b2tlbiwgd2FpdGluZ1RpbWU6IHRpbWVvdXQgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRQYXJ0aWFsTWVzc2FnZVRpbWVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dCwgdGhpcy5tZXNzYWdlVG9rZW4sIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dCk7XG4gICAgfVxufVxuZXhwb3J0cy5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXIgPSBSZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLldyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLkFic3RyYWN0TWVzc2FnZVdyaXRlciA9IGV4cG9ydHMuTWVzc2FnZVdyaXRlciA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IHNlbWFwaG9yZV8xID0gcmVxdWlyZShcIi4vc2VtYXBob3JlXCIpO1xuY29uc3QgZXZlbnRzXzEgPSByZXF1aXJlKFwiLi9ldmVudHNcIik7XG5jb25zdCBDb250ZW50TGVuZ3RoID0gJ0NvbnRlbnQtTGVuZ3RoOiAnO1xuY29uc3QgQ1JMRiA9ICdcXHJcXG4nO1xudmFyIE1lc3NhZ2VXcml0ZXI7XG4oZnVuY3Rpb24gKE1lc3NhZ2VXcml0ZXIpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgSXMuZnVuYyhjYW5kaWRhdGUuZGlzcG9zZSkgJiYgSXMuZnVuYyhjYW5kaWRhdGUub25DbG9zZSkgJiZcbiAgICAgICAgICAgIElzLmZ1bmMoY2FuZGlkYXRlLm9uRXJyb3IpICYmIElzLmZ1bmMoY2FuZGlkYXRlLndyaXRlKTtcbiAgICB9XG4gICAgTWVzc2FnZVdyaXRlci5pcyA9IGlzO1xufSkoTWVzc2FnZVdyaXRlciB8fCAoZXhwb3J0cy5NZXNzYWdlV3JpdGVyID0gTWVzc2FnZVdyaXRlciA9IHt9KSk7XG5jbGFzcyBBYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy5lcnJvckVtaXR0ZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLmNsb3NlRW1pdHRlci5kaXNwb3NlKCk7XG4gICAgfVxuICAgIGdldCBvbkVycm9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lcnJvckVtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGZpcmVFcnJvcihlcnJvciwgbWVzc2FnZSwgY291bnQpIHtcbiAgICAgICAgdGhpcy5lcnJvckVtaXR0ZXIuZmlyZShbdGhpcy5hc0Vycm9yKGVycm9yKSwgbWVzc2FnZSwgY291bnRdKTtcbiAgICB9XG4gICAgZ2V0IG9uQ2xvc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb3NlRW1pdHRlci5ldmVudDtcbiAgICB9XG4gICAgZmlyZUNsb3NlKCkge1xuICAgICAgICB0aGlzLmNsb3NlRW1pdHRlci5maXJlKHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIGFzRXJyb3IoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoYFdyaXRlciByZWNlaXZlZCBlcnJvci4gUmVhc29uOiAke0lzLnN0cmluZyhlcnJvci5tZXNzYWdlKSA/IGVycm9yLm1lc3NhZ2UgOiAndW5rbm93bid9YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLkFic3RyYWN0TWVzc2FnZVdyaXRlciA9IEFic3RyYWN0TWVzc2FnZVdyaXRlcjtcbnZhciBSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zO1xuKGZ1bmN0aW9uIChSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zKSB7XG4gICAgZnVuY3Rpb24gZnJvbU9wdGlvbnMob3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHsgY2hhcnNldDogb3B0aW9ucyA/PyAndXRmLTgnLCBjb250ZW50VHlwZUVuY29kZXI6ICgwLCByYWxfMS5kZWZhdWx0KSgpLmFwcGxpY2F0aW9uSnNvbi5lbmNvZGVyIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4geyBjaGFyc2V0OiBvcHRpb25zLmNoYXJzZXQgPz8gJ3V0Zi04JywgY29udGVudEVuY29kZXI6IG9wdGlvbnMuY29udGVudEVuY29kZXIsIGNvbnRlbnRUeXBlRW5jb2Rlcjogb3B0aW9ucy5jb250ZW50VHlwZUVuY29kZXIgPz8gKDAsIHJhbF8xLmRlZmF1bHQpKCkuYXBwbGljYXRpb25Kc29uLmVuY29kZXIgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zLmZyb21PcHRpb25zID0gZnJvbU9wdGlvbnM7XG59KShSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zIHx8IChSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zID0ge30pKTtcbmNsYXNzIFdyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKHdyaXRhYmxlLCBvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMud3JpdGFibGUgPSB3cml0YWJsZTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gUmVzb2x2ZWRNZXNzYWdlV3JpdGVyT3B0aW9ucy5mcm9tT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50ID0gMDtcbiAgICAgICAgdGhpcy53cml0ZVNlbWFwaG9yZSA9IG5ldyBzZW1hcGhvcmVfMS5TZW1hcGhvcmUoMSk7XG4gICAgICAgIHRoaXMud3JpdGFibGUub25FcnJvcigoZXJyb3IpID0+IHRoaXMuZmlyZUVycm9yKGVycm9yKSk7XG4gICAgICAgIHRoaXMud3JpdGFibGUub25DbG9zZSgoKSA9PiB0aGlzLmZpcmVDbG9zZSgpKTtcbiAgICB9XG4gICAgYXN5bmMgd3JpdGUobXNnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndyaXRlU2VtYXBob3JlLmxvY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHRoaXMub3B0aW9ucy5jb250ZW50VHlwZUVuY29kZXIuZW5jb2RlKG1zZywgdGhpcy5vcHRpb25zKS50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNvbnRlbnRFbmNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jb250ZW50RW5jb2Rlci5lbmNvZGUoYnVmZmVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZC50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJzID0gW107XG4gICAgICAgICAgICAgICAgaGVhZGVycy5wdXNoKENvbnRlbnRMZW5ndGgsIGJ1ZmZlci5ieXRlTGVuZ3RoLnRvU3RyaW5nKCksIENSTEYpO1xuICAgICAgICAgICAgICAgIGhlYWRlcnMucHVzaChDUkxGKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kb1dyaXRlKG1zZywgaGVhZGVycywgYnVmZmVyKTtcbiAgICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgZG9Xcml0ZShtc2csIGhlYWRlcnMsIGRhdGEpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMud3JpdGFibGUud3JpdGUoaGVhZGVycy5qb2luKCcnKSwgJ2FzY2lpJyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy53cml0YWJsZS53cml0ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IsIG1zZyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZUVycm9yKGVycm9yLCBtc2cpIHtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50Kys7XG4gICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yLCBtc2csIHRoaXMuZXJyb3JDb3VudCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICAgICAgdGhpcy53cml0YWJsZS5lbmQoKTtcbiAgICB9XG59XG5leHBvcnRzLldyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgPSBXcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkFic3RyYWN0TWVzc2FnZUJ1ZmZlciA9IHZvaWQgMDtcbmNvbnN0IENSID0gMTM7XG5jb25zdCBMRiA9IDEwO1xuY29uc3QgQ1JMRiA9ICdcXHJcXG4nO1xuY2xhc3MgQWJzdHJhY3RNZXNzYWdlQnVmZmVyIHtcbiAgICBjb25zdHJ1Y3RvcihlbmNvZGluZyA9ICd1dGYtOCcpIHtcbiAgICAgICAgdGhpcy5fZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgICAgICAgdGhpcy5fY2h1bmtzID0gW107XG4gICAgICAgIHRoaXMuX3RvdGFsTGVuZ3RoID0gMDtcbiAgICB9XG4gICAgZ2V0IGVuY29kaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW5jb2Rpbmc7XG4gICAgfVxuICAgIGFwcGVuZChjaHVuaykge1xuICAgICAgICBjb25zdCB0b0FwcGVuZCA9IHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZycgPyB0aGlzLmZyb21TdHJpbmcoY2h1bmssIHRoaXMuX2VuY29kaW5nKSA6IGNodW5rO1xuICAgICAgICB0aGlzLl9jaHVua3MucHVzaCh0b0FwcGVuZCk7XG4gICAgICAgIHRoaXMuX3RvdGFsTGVuZ3RoICs9IHRvQXBwZW5kLmJ5dGVMZW5ndGg7XG4gICAgfVxuICAgIHRyeVJlYWRIZWFkZXJzKGxvd2VyQ2FzZUtleXMgPSBmYWxzZSkge1xuICAgICAgICBpZiAodGhpcy5fY2h1bmtzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3RhdGUgPSAwO1xuICAgICAgICBsZXQgY2h1bmtJbmRleCA9IDA7XG4gICAgICAgIGxldCBvZmZzZXQgPSAwO1xuICAgICAgICBsZXQgY2h1bmtCeXRlc1JlYWQgPSAwO1xuICAgICAgICByb3c6IHdoaWxlIChjaHVua0luZGV4IDwgdGhpcy5fY2h1bmtzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgY2h1bmsgPSB0aGlzLl9jaHVua3NbY2h1bmtJbmRleF07XG4gICAgICAgICAgICBvZmZzZXQgPSAwO1xuICAgICAgICAgICAgY29sdW1uOiB3aGlsZSAob2Zmc2V0IDwgY2h1bmsubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjaHVua1tvZmZzZXRdO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDUjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIExGOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gNDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHJvdztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjaHVua0J5dGVzUmVhZCArPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgY2h1bmtJbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZSAhPT0gNCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgYnVmZmVyIGNvbnRhaW5zIHRoZSB0d28gQ1JMRiBhdCB0aGUgZW5kLiBTbyB3ZSB3aWxsXG4gICAgICAgIC8vIGhhdmUgdHdvIGVtcHR5IGxpbmVzIGFmdGVyIHRoZSBzcGxpdCBhdCB0aGUgZW5kIGFzIHdlbGwuXG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuX3JlYWQoY2h1bmtCeXRlc1JlYWQgKyBvZmZzZXQpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwKCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLnRvU3RyaW5nKGJ1ZmZlciwgJ2FzY2lpJykuc3BsaXQoQ1JMRik7XG4gICAgICAgIGlmIChoZWFkZXJzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXJzLmxlbmd0aCAtIDI7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaGVhZGVyID0gaGVhZGVyc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gaGVhZGVyLmluZGV4T2YoJzonKTtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1lc3NhZ2UgaGVhZGVyIG11c3Qgc2VwYXJhdGUga2V5IGFuZCB2YWx1ZSB1c2luZyAnOidcXG4ke2hlYWRlcn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGhlYWRlci5zdWJzdHIoMCwgaW5kZXgpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBoZWFkZXIuc3Vic3RyKGluZGV4ICsgMSkudHJpbSgpO1xuICAgICAgICAgICAgcmVzdWx0LnNldChsb3dlckNhc2VLZXlzID8ga2V5LnRvTG93ZXJDYXNlKCkgOiBrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICB0cnlSZWFkQm9keShsZW5ndGgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3RvdGFsTGVuZ3RoIDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkKGxlbmd0aCk7XG4gICAgfVxuICAgIGdldCBudW1iZXJPZkJ5dGVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdG90YWxMZW5ndGg7XG4gICAgfVxuICAgIF9yZWFkKGJ5dGVDb3VudCkge1xuICAgICAgICBpZiAoYnl0ZUNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbXB0eUJ1ZmZlcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChieXRlQ291bnQgPiB0aGlzLl90b3RhbExlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVhZCBzbyBtYW55IGJ5dGVzIWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jaHVua3NbMF0uYnl0ZUxlbmd0aCA9PT0gYnl0ZUNvdW50KSB7XG4gICAgICAgICAgICAvLyBzdXBlciBmYXN0IHBhdGgsIHByZWNpc2VseSBmaXJzdCBjaHVuayBtdXN0IGJlIHJldHVybmVkXG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1swXTtcbiAgICAgICAgICAgIHRoaXMuX2NodW5rcy5zaGlmdCgpO1xuICAgICAgICAgICAgdGhpcy5fdG90YWxMZW5ndGggLT0gYnl0ZUNvdW50O1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXNOYXRpdmUoY2h1bmspO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jaHVua3NbMF0uYnl0ZUxlbmd0aCA+IGJ5dGVDb3VudCkge1xuICAgICAgICAgICAgLy8gZmFzdCBwYXRoLCB0aGUgcmVhZGluZyBpcyBlbnRpcmVseSB3aXRoaW4gdGhlIGZpcnN0IGNodW5rXG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1swXTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuYXNOYXRpdmUoY2h1bmssIGJ5dGVDb3VudCk7XG4gICAgICAgICAgICB0aGlzLl9jaHVua3NbMF0gPSBjaHVuay5zbGljZShieXRlQ291bnQpO1xuICAgICAgICAgICAgdGhpcy5fdG90YWxMZW5ndGggLT0gYnl0ZUNvdW50O1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmFsbG9jTmF0aXZlKGJ5dGVDb3VudCk7XG4gICAgICAgIGxldCByZXN1bHRPZmZzZXQgPSAwO1xuICAgICAgICBsZXQgY2h1bmtJbmRleCA9IDA7XG4gICAgICAgIHdoaWxlIChieXRlQ291bnQgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1tjaHVua0luZGV4XTtcbiAgICAgICAgICAgIGlmIChjaHVuay5ieXRlTGVuZ3RoID4gYnl0ZUNvdW50KSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBjaHVuayB3aWxsIHN1cnZpdmVcbiAgICAgICAgICAgICAgICBjb25zdCBjaHVua1BhcnQgPSBjaHVuay5zbGljZSgwLCBieXRlQ291bnQpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5zZXQoY2h1bmtQYXJ0LCByZXN1bHRPZmZzZXQpO1xuICAgICAgICAgICAgICAgIHJlc3VsdE9mZnNldCArPSBieXRlQ291bnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2h1bmtzW2NodW5rSW5kZXhdID0gY2h1bmsuc2xpY2UoYnl0ZUNvdW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLl90b3RhbExlbmd0aCAtPSBieXRlQ291bnQ7XG4gICAgICAgICAgICAgICAgYnl0ZUNvdW50IC09IGJ5dGVDb3VudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHRoaXMgY2h1bmsgd2lsbCBiZSBlbnRpcmVseSByZWFkXG4gICAgICAgICAgICAgICAgcmVzdWx0LnNldChjaHVuaywgcmVzdWx0T2Zmc2V0KTtcbiAgICAgICAgICAgICAgICByZXN1bHRPZmZzZXQgKz0gY2h1bmsuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgICAgICB0aGlzLl9jaHVua3Muc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl90b3RhbExlbmd0aCAtPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgICAgIGJ5dGVDb3VudCAtPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VCdWZmZXIgPSBBYnN0cmFjdE1lc3NhZ2VCdWZmZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uID0gZXhwb3J0cy5Db25uZWN0aW9uT3B0aW9ucyA9IGV4cG9ydHMuTWVzc2FnZVN0cmF0ZWd5ID0gZXhwb3J0cy5DYW5jZWxsYXRpb25TdHJhdGVneSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gZXhwb3J0cy5JZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IGV4cG9ydHMuQ29ubmVjdGlvbkVycm9yID0gZXhwb3J0cy5Db25uZWN0aW9uRXJyb3JzID0gZXhwb3J0cy5Mb2dUcmFjZU5vdGlmaWNhdGlvbiA9IGV4cG9ydHMuU2V0VHJhY2VOb3RpZmljYXRpb24gPSBleHBvcnRzLlRyYWNlRm9ybWF0ID0gZXhwb3J0cy5UcmFjZVZhbHVlcyA9IGV4cG9ydHMuVHJhY2UgPSBleHBvcnRzLk51bGxMb2dnZXIgPSBleHBvcnRzLlByb2dyZXNzVHlwZSA9IGV4cG9ydHMuUHJvZ3Jlc3NUb2tlbiA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IG1lc3NhZ2VzXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlc1wiKTtcbmNvbnN0IGxpbmtlZE1hcF8xID0gcmVxdWlyZShcIi4vbGlua2VkTWFwXCIpO1xuY29uc3QgZXZlbnRzXzEgPSByZXF1aXJlKFwiLi9ldmVudHNcIik7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbnZhciBDYW5jZWxOb3RpZmljYXRpb247XG4oZnVuY3Rpb24gKENhbmNlbE5vdGlmaWNhdGlvbikge1xuICAgIENhbmNlbE5vdGlmaWNhdGlvbi50eXBlID0gbmV3IG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZSgnJC9jYW5jZWxSZXF1ZXN0Jyk7XG59KShDYW5jZWxOb3RpZmljYXRpb24gfHwgKENhbmNlbE5vdGlmaWNhdGlvbiA9IHt9KSk7XG52YXIgUHJvZ3Jlc3NUb2tlbjtcbihmdW5jdGlvbiAoUHJvZ3Jlc3NUb2tlbikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG4gICAgfVxuICAgIFByb2dyZXNzVG9rZW4uaXMgPSBpcztcbn0pKFByb2dyZXNzVG9rZW4gfHwgKGV4cG9ydHMuUHJvZ3Jlc3NUb2tlbiA9IFByb2dyZXNzVG9rZW4gPSB7fSkpO1xudmFyIFByb2dyZXNzTm90aWZpY2F0aW9uO1xuKGZ1bmN0aW9uIChQcm9ncmVzc05vdGlmaWNhdGlvbikge1xuICAgIFByb2dyZXNzTm90aWZpY2F0aW9uLnR5cGUgPSBuZXcgbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlKCckL3Byb2dyZXNzJyk7XG59KShQcm9ncmVzc05vdGlmaWNhdGlvbiB8fCAoUHJvZ3Jlc3NOb3RpZmljYXRpb24gPSB7fSkpO1xuY2xhc3MgUHJvZ3Jlc3NUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICB9XG59XG5leHBvcnRzLlByb2dyZXNzVHlwZSA9IFByb2dyZXNzVHlwZTtcbnZhciBTdGFyUmVxdWVzdEhhbmRsZXI7XG4oZnVuY3Rpb24gKFN0YXJSZXF1ZXN0SGFuZGxlcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBJcy5mdW5jKHZhbHVlKTtcbiAgICB9XG4gICAgU3RhclJlcXVlc3RIYW5kbGVyLmlzID0gaXM7XG59KShTdGFyUmVxdWVzdEhhbmRsZXIgfHwgKFN0YXJSZXF1ZXN0SGFuZGxlciA9IHt9KSk7XG5leHBvcnRzLk51bGxMb2dnZXIgPSBPYmplY3QuZnJlZXplKHtcbiAgICBlcnJvcjogKCkgPT4geyB9LFxuICAgIHdhcm46ICgpID0+IHsgfSxcbiAgICBpbmZvOiAoKSA9PiB7IH0sXG4gICAgbG9nOiAoKSA9PiB7IH1cbn0pO1xudmFyIFRyYWNlO1xuKGZ1bmN0aW9uIChUcmFjZSkge1xuICAgIFRyYWNlW1RyYWNlW1wiT2ZmXCJdID0gMF0gPSBcIk9mZlwiO1xuICAgIFRyYWNlW1RyYWNlW1wiTWVzc2FnZXNcIl0gPSAxXSA9IFwiTWVzc2FnZXNcIjtcbiAgICBUcmFjZVtUcmFjZVtcIkNvbXBhY3RcIl0gPSAyXSA9IFwiQ29tcGFjdFwiO1xuICAgIFRyYWNlW1RyYWNlW1wiVmVyYm9zZVwiXSA9IDNdID0gXCJWZXJib3NlXCI7XG59KShUcmFjZSB8fCAoZXhwb3J0cy5UcmFjZSA9IFRyYWNlID0ge30pKTtcbnZhciBUcmFjZVZhbHVlcztcbihmdW5jdGlvbiAoVHJhY2VWYWx1ZXMpIHtcbiAgICAvKipcbiAgICAgKiBUdXJuIHRyYWNpbmcgb2ZmLlxuICAgICAqL1xuICAgIFRyYWNlVmFsdWVzLk9mZiA9ICdvZmYnO1xuICAgIC8qKlxuICAgICAqIFRyYWNlIG1lc3NhZ2VzIG9ubHkuXG4gICAgICovXG4gICAgVHJhY2VWYWx1ZXMuTWVzc2FnZXMgPSAnbWVzc2FnZXMnO1xuICAgIC8qKlxuICAgICAqIENvbXBhY3QgbWVzc2FnZSB0cmFjaW5nLlxuICAgICAqL1xuICAgIFRyYWNlVmFsdWVzLkNvbXBhY3QgPSAnY29tcGFjdCc7XG4gICAgLyoqXG4gICAgICogVmVyYm9zZSBtZXNzYWdlIHRyYWNpbmcuXG4gICAgICovXG4gICAgVHJhY2VWYWx1ZXMuVmVyYm9zZSA9ICd2ZXJib3NlJztcbn0pKFRyYWNlVmFsdWVzIHx8IChleHBvcnRzLlRyYWNlVmFsdWVzID0gVHJhY2VWYWx1ZXMgPSB7fSkpO1xuKGZ1bmN0aW9uIChUcmFjZSkge1xuICAgIGZ1bmN0aW9uIGZyb21TdHJpbmcodmFsdWUpIHtcbiAgICAgICAgaWYgKCFJcy5zdHJpbmcodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gVHJhY2UuT2ZmO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSAnb2ZmJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gVHJhY2UuT2ZmO1xuICAgICAgICAgICAgY2FzZSAnbWVzc2FnZXMnOlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5NZXNzYWdlcztcbiAgICAgICAgICAgIGNhc2UgJ2NvbXBhY3QnOlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5Db21wYWN0O1xuICAgICAgICAgICAgY2FzZSAndmVyYm9zZSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFRyYWNlLlZlcmJvc2U7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5PZmY7XG4gICAgICAgIH1cbiAgICB9XG4gICAgVHJhY2UuZnJvbVN0cmluZyA9IGZyb21TdHJpbmc7XG4gICAgZnVuY3Rpb24gdG9TdHJpbmcodmFsdWUpIHtcbiAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5PZmY6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdvZmYnO1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5NZXNzYWdlczpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ21lc3NhZ2VzJztcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuQ29tcGFjdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2NvbXBhY3QnO1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5WZXJib3NlOlxuICAgICAgICAgICAgICAgIHJldHVybiAndmVyYm9zZSc7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAnb2ZmJztcbiAgICAgICAgfVxuICAgIH1cbiAgICBUcmFjZS50b1N0cmluZyA9IHRvU3RyaW5nO1xufSkoVHJhY2UgfHwgKGV4cG9ydHMuVHJhY2UgPSBUcmFjZSA9IHt9KSk7XG52YXIgVHJhY2VGb3JtYXQ7XG4oZnVuY3Rpb24gKFRyYWNlRm9ybWF0KSB7XG4gICAgVHJhY2VGb3JtYXRbXCJUZXh0XCJdID0gXCJ0ZXh0XCI7XG4gICAgVHJhY2VGb3JtYXRbXCJKU09OXCJdID0gXCJqc29uXCI7XG59KShUcmFjZUZvcm1hdCB8fCAoZXhwb3J0cy5UcmFjZUZvcm1hdCA9IFRyYWNlRm9ybWF0ID0ge30pKTtcbihmdW5jdGlvbiAoVHJhY2VGb3JtYXQpIHtcbiAgICBmdW5jdGlvbiBmcm9tU3RyaW5nKHZhbHVlKSB7XG4gICAgICAgIGlmICghSXMuc3RyaW5nKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIFRyYWNlRm9ybWF0LlRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAodmFsdWUgPT09ICdqc29uJykge1xuICAgICAgICAgICAgcmV0dXJuIFRyYWNlRm9ybWF0LkpTT047XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gVHJhY2VGb3JtYXQuVGV4dDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBUcmFjZUZvcm1hdC5mcm9tU3RyaW5nID0gZnJvbVN0cmluZztcbn0pKFRyYWNlRm9ybWF0IHx8IChleHBvcnRzLlRyYWNlRm9ybWF0ID0gVHJhY2VGb3JtYXQgPSB7fSkpO1xudmFyIFNldFRyYWNlTm90aWZpY2F0aW9uO1xuKGZ1bmN0aW9uIChTZXRUcmFjZU5vdGlmaWNhdGlvbikge1xuICAgIFNldFRyYWNlTm90aWZpY2F0aW9uLnR5cGUgPSBuZXcgbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlKCckL3NldFRyYWNlJyk7XG59KShTZXRUcmFjZU5vdGlmaWNhdGlvbiB8fCAoZXhwb3J0cy5TZXRUcmFjZU5vdGlmaWNhdGlvbiA9IFNldFRyYWNlTm90aWZpY2F0aW9uID0ge30pKTtcbnZhciBMb2dUcmFjZU5vdGlmaWNhdGlvbjtcbihmdW5jdGlvbiAoTG9nVHJhY2VOb3RpZmljYXRpb24pIHtcbiAgICBMb2dUcmFjZU5vdGlmaWNhdGlvbi50eXBlID0gbmV3IG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZSgnJC9sb2dUcmFjZScpO1xufSkoTG9nVHJhY2VOb3RpZmljYXRpb24gfHwgKGV4cG9ydHMuTG9nVHJhY2VOb3RpZmljYXRpb24gPSBMb2dUcmFjZU5vdGlmaWNhdGlvbiA9IHt9KSk7XG52YXIgQ29ubmVjdGlvbkVycm9ycztcbihmdW5jdGlvbiAoQ29ubmVjdGlvbkVycm9ycykge1xuICAgIC8qKlxuICAgICAqIFRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZC5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uRXJyb3JzW0Nvbm5lY3Rpb25FcnJvcnNbXCJDbG9zZWRcIl0gPSAxXSA9IFwiQ2xvc2VkXCI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gZ290IGRpc3Bvc2VkLlxuICAgICAqL1xuICAgIENvbm5lY3Rpb25FcnJvcnNbQ29ubmVjdGlvbkVycm9yc1tcIkRpc3Bvc2VkXCJdID0gMl0gPSBcIkRpc3Bvc2VkXCI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBpbiBsaXN0ZW5pbmcgbW9kZS5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uRXJyb3JzW0Nvbm5lY3Rpb25FcnJvcnNbXCJBbHJlYWR5TGlzdGVuaW5nXCJdID0gM10gPSBcIkFscmVhZHlMaXN0ZW5pbmdcIjtcbn0pKENvbm5lY3Rpb25FcnJvcnMgfHwgKGV4cG9ydHMuQ29ubmVjdGlvbkVycm9ycyA9IENvbm5lY3Rpb25FcnJvcnMgPSB7fSkpO1xuY2xhc3MgQ29ubmVjdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNvZGUsIG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBDb25uZWN0aW9uRXJyb3IucHJvdG90eXBlKTtcbiAgICB9XG59XG5leHBvcnRzLkNvbm5lY3Rpb25FcnJvciA9IENvbm5lY3Rpb25FcnJvcjtcbnZhciBDb25uZWN0aW9uU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENvbm5lY3Rpb25TdHJhdGVneSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNhbmNlbFVuZGlzcGF0Y2hlZCk7XG4gICAgfVxuICAgIENvbm5lY3Rpb25TdHJhdGVneS5pcyA9IGlzO1xufSkoQ29ubmVjdGlvblN0cmF0ZWd5IHx8IChleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IENvbm5lY3Rpb25TdHJhdGVneSA9IHt9KSk7XG52YXIgSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5O1xuKGZ1bmN0aW9uIChJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiAoY2FuZGlkYXRlLmtpbmQgPT09IHVuZGVmaW5lZCB8fCBjYW5kaWRhdGUua2luZCA9PT0gJ2lkJykgJiYgSXMuZnVuYyhjYW5kaWRhdGUuY3JlYXRlQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UpICYmIChjYW5kaWRhdGUuZGlzcG9zZSA9PT0gdW5kZWZpbmVkIHx8IElzLmZ1bmMoY2FuZGlkYXRlLmRpc3Bvc2UpKTtcbiAgICB9XG4gICAgSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzID0gaXM7XG59KShJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgfHwgKGV4cG9ydHMuSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0ge30pKTtcbnZhciBSZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneTtcbihmdW5jdGlvbiAoUmVxdWVzdENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBjYW5kaWRhdGUua2luZCA9PT0gJ3JlcXVlc3QnICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKSAmJiAoY2FuZGlkYXRlLmRpc3Bvc2UgPT09IHVuZGVmaW5lZCB8fCBJcy5mdW5jKGNhbmRpZGF0ZS5kaXNwb3NlKSk7XG4gICAgfVxuICAgIFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzID0gaXM7XG59KShSZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSB8fCAoZXhwb3J0cy5SZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0ge30pKTtcbnZhciBDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5O1xuKGZ1bmN0aW9uIChDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5NZXNzYWdlID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKF8pIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgY2FuY2VsbGF0aW9uXzEuQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UoKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kuaXModmFsdWUpIHx8IFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKHZhbHVlKTtcbiAgICB9XG4gICAgQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5pcyA9IGlzO1xufSkoQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSB8fCAoZXhwb3J0cy5DYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IHt9KSk7XG52YXIgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENhbmNlbGxhdGlvblNlbmRlclN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kuTWVzc2FnZSA9IE9iamVjdC5mcmVlemUoe1xuICAgICAgICBzZW5kQ2FuY2VsbGF0aW9uKGNvbm4sIGlkKSB7XG4gICAgICAgICAgICByZXR1cm4gY29ubi5zZW5kTm90aWZpY2F0aW9uKENhbmNlbE5vdGlmaWNhdGlvbi50eXBlLCB7IGlkIH0pO1xuICAgICAgICB9LFxuICAgICAgICBjbGVhbnVwKF8pIHsgfVxuICAgIH0pO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLnNlbmRDYW5jZWxsYXRpb24pICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNsZWFudXApO1xuICAgIH1cbiAgICBDYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneS5pcyA9IGlzO1xufSkoQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgfHwgKGV4cG9ydHMuQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgPSBDYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneSA9IHt9KSk7XG52YXIgQ2FuY2VsbGF0aW9uU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENhbmNlbGxhdGlvblN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uU3RyYXRlZ3kuTWVzc2FnZSA9IE9iamVjdC5mcmVlemUoe1xuICAgICAgICByZWNlaXZlcjogQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5NZXNzYWdlLFxuICAgICAgICBzZW5kZXI6IENhbmNlbGxhdGlvblNlbmRlclN0cmF0ZWd5Lk1lc3NhZ2VcbiAgICB9KTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKGNhbmRpZGF0ZS5yZWNlaXZlcikgJiYgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kuaXMoY2FuZGlkYXRlLnNlbmRlcik7XG4gICAgfVxuICAgIENhbmNlbGxhdGlvblN0cmF0ZWd5LmlzID0gaXM7XG59KShDYW5jZWxsYXRpb25TdHJhdGVneSB8fCAoZXhwb3J0cy5DYW5jZWxsYXRpb25TdHJhdGVneSA9IENhbmNlbGxhdGlvblN0cmF0ZWd5ID0ge30pKTtcbnZhciBNZXNzYWdlU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKE1lc3NhZ2VTdHJhdGVneSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLmhhbmRsZU1lc3NhZ2UpO1xuICAgIH1cbiAgICBNZXNzYWdlU3RyYXRlZ3kuaXMgPSBpcztcbn0pKE1lc3NhZ2VTdHJhdGVneSB8fCAoZXhwb3J0cy5NZXNzYWdlU3RyYXRlZ3kgPSBNZXNzYWdlU3RyYXRlZ3kgPSB7fSkpO1xudmFyIENvbm5lY3Rpb25PcHRpb25zO1xuKGZ1bmN0aW9uIChDb25uZWN0aW9uT3B0aW9ucykge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIChDYW5jZWxsYXRpb25TdHJhdGVneS5pcyhjYW5kaWRhdGUuY2FuY2VsbGF0aW9uU3RyYXRlZ3kpIHx8IENvbm5lY3Rpb25TdHJhdGVneS5pcyhjYW5kaWRhdGUuY29ubmVjdGlvblN0cmF0ZWd5KSB8fCBNZXNzYWdlU3RyYXRlZ3kuaXMoY2FuZGlkYXRlLm1lc3NhZ2VTdHJhdGVneSkpO1xuICAgIH1cbiAgICBDb25uZWN0aW9uT3B0aW9ucy5pcyA9IGlzO1xufSkoQ29ubmVjdGlvbk9wdGlvbnMgfHwgKGV4cG9ydHMuQ29ubmVjdGlvbk9wdGlvbnMgPSBDb25uZWN0aW9uT3B0aW9ucyA9IHt9KSk7XG52YXIgQ29ubmVjdGlvblN0YXRlO1xuKGZ1bmN0aW9uIChDb25uZWN0aW9uU3RhdGUpIHtcbiAgICBDb25uZWN0aW9uU3RhdGVbQ29ubmVjdGlvblN0YXRlW1wiTmV3XCJdID0gMV0gPSBcIk5ld1wiO1xuICAgIENvbm5lY3Rpb25TdGF0ZVtDb25uZWN0aW9uU3RhdGVbXCJMaXN0ZW5pbmdcIl0gPSAyXSA9IFwiTGlzdGVuaW5nXCI7XG4gICAgQ29ubmVjdGlvblN0YXRlW0Nvbm5lY3Rpb25TdGF0ZVtcIkNsb3NlZFwiXSA9IDNdID0gXCJDbG9zZWRcIjtcbiAgICBDb25uZWN0aW9uU3RhdGVbQ29ubmVjdGlvblN0YXRlW1wiRGlzcG9zZWRcIl0gPSA0XSA9IFwiRGlzcG9zZWRcIjtcbn0pKENvbm5lY3Rpb25TdGF0ZSB8fCAoQ29ubmVjdGlvblN0YXRlID0ge30pKTtcbmZ1bmN0aW9uIGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uKG1lc3NhZ2VSZWFkZXIsIG1lc3NhZ2VXcml0ZXIsIF9sb2dnZXIsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBsb2dnZXIgPSBfbG9nZ2VyICE9PSB1bmRlZmluZWQgPyBfbG9nZ2VyIDogZXhwb3J0cy5OdWxsTG9nZ2VyO1xuICAgIGxldCBzZXF1ZW5jZU51bWJlciA9IDA7XG4gICAgbGV0IG5vdGlmaWNhdGlvblNlcXVlbmNlTnVtYmVyID0gMDtcbiAgICBsZXQgdW5rbm93blJlc3BvbnNlU2VxdWVuY2VOdW1iZXIgPSAwO1xuICAgIGNvbnN0IHZlcnNpb24gPSAnMi4wJztcbiAgICBsZXQgc3RhclJlcXVlc3RIYW5kbGVyID0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlcXVlc3RIYW5kbGVycyA9IG5ldyBNYXAoKTtcbiAgICBsZXQgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgY29uc3Qgbm90aWZpY2F0aW9uSGFuZGxlcnMgPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgcHJvZ3Jlc3NIYW5kbGVycyA9IG5ldyBNYXAoKTtcbiAgICBsZXQgdGltZXI7XG4gICAgbGV0IG1lc3NhZ2VRdWV1ZSA9IG5ldyBsaW5rZWRNYXBfMS5MaW5rZWRNYXAoKTtcbiAgICBsZXQgcmVzcG9uc2VQcm9taXNlcyA9IG5ldyBNYXAoKTtcbiAgICBsZXQga25vd25DYW5jZWxlZFJlcXVlc3RzID0gbmV3IFNldCgpO1xuICAgIGxldCByZXF1ZXN0VG9rZW5zID0gbmV3IE1hcCgpO1xuICAgIGxldCB0cmFjZSA9IFRyYWNlLk9mZjtcbiAgICBsZXQgdHJhY2VGb3JtYXQgPSBUcmFjZUZvcm1hdC5UZXh0O1xuICAgIGxldCB0cmFjZXI7XG4gICAgbGV0IHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLk5ldztcbiAgICBjb25zdCBlcnJvckVtaXR0ZXIgPSBuZXcgZXZlbnRzXzEuRW1pdHRlcigpO1xuICAgIGNvbnN0IGNsb3NlRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgdW5oYW5kbGVkTm90aWZpY2F0aW9uRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgdW5oYW5kbGVkUHJvZ3Jlc3NFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICBjb25zdCBkaXNwb3NlRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgY2FuY2VsbGF0aW9uU3RyYXRlZ3kgPSAob3B0aW9ucyAmJiBvcHRpb25zLmNhbmNlbGxhdGlvblN0cmF0ZWd5KSA/IG9wdGlvbnMuY2FuY2VsbGF0aW9uU3RyYXRlZ3kgOiBDYW5jZWxsYXRpb25TdHJhdGVneS5NZXNzYWdlO1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlcXVlc3RRdWV1ZUtleShpZCkge1xuICAgICAgICBpZiAoaWQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuJ3Qgc2VuZCByZXF1ZXN0cyB3aXRoIGlkIG51bGwgc2luY2UgdGhlIHJlc3BvbnNlIGNhbid0IGJlIGNvcnJlbGF0ZWQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdyZXEtJyArIGlkLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlc3BvbnNlUXVldWVLZXkoaWQpIHtcbiAgICAgICAgaWYgKGlkID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3Jlcy11bmtub3duLScgKyAoKyt1bmtub3duUmVzcG9uc2VTZXF1ZW5jZU51bWJlcikudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAncmVzLScgKyBpZC50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZU5vdGlmaWNhdGlvblF1ZXVlS2V5KCkge1xuICAgICAgICByZXR1cm4gJ25vdC0nICsgKCsrbm90aWZpY2F0aW9uU2VxdWVuY2VOdW1iZXIpLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFkZE1lc3NhZ2VUb1F1ZXVlKHF1ZXVlLCBtZXNzYWdlKSB7XG4gICAgICAgIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXF1ZXN0KG1lc3NhZ2UpKSB7XG4gICAgICAgICAgICBxdWV1ZS5zZXQoY3JlYXRlUmVxdWVzdFF1ZXVlS2V5KG1lc3NhZ2UuaWQpLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXNwb25zZShtZXNzYWdlKSkge1xuICAgICAgICAgICAgcXVldWUuc2V0KGNyZWF0ZVJlc3BvbnNlUXVldWVLZXkobWVzc2FnZS5pZCksIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcXVldWUuc2V0KGNyZWF0ZU5vdGlmaWNhdGlvblF1ZXVlS2V5KCksIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNhbmNlbFVuZGlzcGF0Y2hlZChfbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0xpc3RlbmluZygpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlID09PSBDb25uZWN0aW9uU3RhdGUuTGlzdGVuaW5nO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0Nsb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlID09PSBDb25uZWN0aW9uU3RhdGUuQ2xvc2VkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0Rpc3Bvc2VkKCkge1xuICAgICAgICByZXR1cm4gc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5EaXNwb3NlZDtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2xvc2VIYW5kbGVyKCkge1xuICAgICAgICBpZiAoc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5OZXcgfHwgc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5MaXN0ZW5pbmcpIHtcbiAgICAgICAgICAgIHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLkNsb3NlZDtcbiAgICAgICAgICAgIGNsb3NlRW1pdHRlci5maXJlKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlIGNvbm5lY3Rpb24gaXMgZGlzcG9zZWQgZG9uJ3Qgc2VudCBjbG9zZSBldmVudHMuXG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlYWRFcnJvckhhbmRsZXIoZXJyb3IpIHtcbiAgICAgICAgZXJyb3JFbWl0dGVyLmZpcmUoW2Vycm9yLCB1bmRlZmluZWQsIHVuZGVmaW5lZF0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiB3cml0ZUVycm9ySGFuZGxlcihkYXRhKSB7XG4gICAgICAgIGVycm9yRW1pdHRlci5maXJlKGRhdGEpO1xuICAgIH1cbiAgICBtZXNzYWdlUmVhZGVyLm9uQ2xvc2UoY2xvc2VIYW5kbGVyKTtcbiAgICBtZXNzYWdlUmVhZGVyLm9uRXJyb3IocmVhZEVycm9ySGFuZGxlcik7XG4gICAgbWVzc2FnZVdyaXRlci5vbkNsb3NlKGNsb3NlSGFuZGxlcik7XG4gICAgbWVzc2FnZVdyaXRlci5vbkVycm9yKHdyaXRlRXJyb3JIYW5kbGVyKTtcbiAgICBmdW5jdGlvbiB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCkge1xuICAgICAgICBpZiAodGltZXIgfHwgbWVzc2FnZVF1ZXVlLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aW1lciA9ICgwLCByYWxfMS5kZWZhdWx0KSgpLnRpbWVyLnNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICAgICAgICB0aW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHByb2Nlc3NNZXNzYWdlUXVldWUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGhhbmRsZU1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICBpZiAobWVzc2FnZXNfMS5NZXNzYWdlLmlzUmVxdWVzdChtZXNzYWdlKSkge1xuICAgICAgICAgICAgaGFuZGxlUmVxdWVzdChtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNOb3RpZmljYXRpb24obWVzc2FnZSkpIHtcbiAgICAgICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvbihtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXNwb25zZShtZXNzYWdlKSkge1xuICAgICAgICAgICAgaGFuZGxlUmVzcG9uc2UobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBoYW5kbGVJbnZhbGlkTWVzc2FnZShtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBwcm9jZXNzTWVzc2FnZVF1ZXVlKCkge1xuICAgICAgICBpZiAobWVzc2FnZVF1ZXVlLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXNzYWdlID0gbWVzc2FnZVF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlU3RyYXRlZ3kgPSBvcHRpb25zPy5tZXNzYWdlU3RyYXRlZ3k7XG4gICAgICAgICAgICBpZiAoTWVzc2FnZVN0cmF0ZWd5LmlzKG1lc3NhZ2VTdHJhdGVneSkpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlU3RyYXRlZ3kuaGFuZGxlTWVzc2FnZShtZXNzYWdlLCBoYW5kbGVNZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGhhbmRsZU1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgY2FsbGJhY2sgPSAobWVzc2FnZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2UgaGF2ZSByZWNlaXZlZCBhIGNhbmNlbGxhdGlvbiBtZXNzYWdlLiBDaGVjayBpZiB0aGUgbWVzc2FnZSBpcyBzdGlsbCBpbiB0aGUgcXVldWVcbiAgICAgICAgICAgIC8vIGFuZCBjYW5jZWwgaXQgaWYgYWxsb3dlZCB0byBkbyBzby5cbiAgICAgICAgICAgIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNOb3RpZmljYXRpb24obWVzc2FnZSkgJiYgbWVzc2FnZS5tZXRob2QgPT09IENhbmNlbE5vdGlmaWNhdGlvbi50eXBlLm1ldGhvZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbmNlbElkID0gbWVzc2FnZS5wYXJhbXMuaWQ7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gY3JlYXRlUmVxdWVzdFF1ZXVlS2V5KGNhbmNlbElkKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0b0NhbmNlbCA9IG1lc3NhZ2VRdWV1ZS5nZXQoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZXNfMS5NZXNzYWdlLmlzUmVxdWVzdCh0b0NhbmNlbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyYXRlZ3kgPSBvcHRpb25zPy5jb25uZWN0aW9uU3RyYXRlZ3k7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gKHN0cmF0ZWd5ICYmIHN0cmF0ZWd5LmNhbmNlbFVuZGlzcGF0Y2hlZCkgPyBzdHJhdGVneS5jYW5jZWxVbmRpc3BhdGNoZWQodG9DYW5jZWwsIGNhbmNlbFVuZGlzcGF0Y2hlZCkgOiBjYW5jZWxVbmRpc3BhdGNoZWQodG9DYW5jZWwpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgJiYgKHJlc3BvbnNlLmVycm9yICE9PSB1bmRlZmluZWQgfHwgcmVzcG9uc2UucmVzdWx0ICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUXVldWUuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLmRlbGV0ZShjYW5jZWxJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5pZCA9IHRvQ2FuY2VsLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VTZW5kaW5nUmVzcG9uc2UocmVzcG9uc2UsIG1lc3NhZ2UubWV0aG9kLCBEYXRlLm5vdygpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUocmVzcG9uc2UpLmNhdGNoKCgpID0+IGxvZ2dlci5lcnJvcihgU2VuZGluZyByZXNwb25zZSBmb3IgY2FuY2VsZWQgbWVzc2FnZSBmYWlsZWQuYCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGNhbmNlbGxhdGlvblRva2VuID0gcmVxdWVzdFRva2Vucy5nZXQoY2FuY2VsSWQpO1xuICAgICAgICAgICAgICAgIC8vIFRoZSByZXF1ZXN0IGlzIGFscmVhZHkgcnVubmluZy4gQ2FuY2VsIHRoZSB0b2tlblxuICAgICAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbmNlbGxhdGlvblRva2VuLmNhbmNlbCgpO1xuICAgICAgICAgICAgICAgICAgICB0cmFjZVJlY2VpdmVkTm90aWZpY2F0aW9uKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZW1lbWJlciB0aGUgY2FuY2VsIGJ1dCBzdGlsbCBxdWV1ZSB0aGUgbWVzc2FnZSB0b1xuICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbiB1cCBzdGF0ZSBpbiBwcm9jZXNzIG1lc3NhZ2UuXG4gICAgICAgICAgICAgICAgICAgIGtub3duQ2FuY2VsZWRSZXF1ZXN0cy5hZGQoY2FuY2VsSWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFkZE1lc3NhZ2VUb1F1ZXVlKG1lc3NhZ2VRdWV1ZSwgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGZ1bmN0aW9uIGhhbmRsZVJlcXVlc3QocmVxdWVzdE1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgLy8gd2UgcmV0dXJuIGhlcmUgc2lsZW50bHkgc2luY2Ugd2UgZmlyZWQgYW4gZXZlbnQgd2hlbiB0aGVcbiAgICAgICAgICAgIC8vIGNvbm5lY3Rpb24gZ290IGRpc3Bvc2VkLlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHJlcGx5KHJlc3VsdE9yRXJyb3IsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgaWQ6IHJlcXVlc3RNZXNzYWdlLmlkXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKHJlc3VsdE9yRXJyb3IgaW5zdGFuY2VvZiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlLmVycm9yID0gcmVzdWx0T3JFcnJvci50b0pzb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVzdWx0ID0gcmVzdWx0T3JFcnJvciA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHJlc3VsdE9yRXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cmFjZVNlbmRpbmdSZXNwb25zZShtZXNzYWdlLCBtZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICBtZXNzYWdlV3JpdGVyLndyaXRlKG1lc3NhZ2UpLmNhdGNoKCgpID0+IGxvZ2dlci5lcnJvcihgU2VuZGluZyByZXNwb25zZSBmYWlsZWQuYCkpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHJlcGx5RXJyb3IoZXJyb3IsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgaWQ6IHJlcXVlc3RNZXNzYWdlLmlkLFxuICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvci50b0pzb24oKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUobWVzc2FnZSkuY2F0Y2goKCkgPT4gbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlc3BvbnNlIGZhaWxlZC5gKSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gcmVwbHlTdWNjZXNzKHJlc3VsdCwgbWV0aG9kLCBzdGFydFRpbWUpIHtcbiAgICAgICAgICAgIC8vIFRoZSBKU09OIFJQQyBkZWZpbmVzIHRoYXQgYSByZXNwb25zZSBtdXN0IGVpdGhlciBoYXZlIGEgcmVzdWx0IG9yIGFuIGVycm9yXG4gICAgICAgICAgICAvLyBTbyB3ZSBjYW4ndCB0cmVhdCB1bmRlZmluZWQgYXMgYSB2YWxpZCByZXNwb25zZSByZXN1bHQuXG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgICAgICAgICAgICBqc29ucnBjOiB2ZXJzaW9uLFxuICAgICAgICAgICAgICAgIGlkOiByZXF1ZXN0TWVzc2FnZS5pZCxcbiAgICAgICAgICAgICAgICByZXN1bHQ6IHJlc3VsdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUobWVzc2FnZSkuY2F0Y2goKCkgPT4gbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlc3BvbnNlIGZhaWxlZC5gKSk7XG4gICAgICAgIH1cbiAgICAgICAgdHJhY2VSZWNlaXZlZFJlcXVlc3QocmVxdWVzdE1lc3NhZ2UpO1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gcmVxdWVzdEhhbmRsZXJzLmdldChyZXF1ZXN0TWVzc2FnZS5tZXRob2QpO1xuICAgICAgICBsZXQgdHlwZTtcbiAgICAgICAgbGV0IHJlcXVlc3RIYW5kbGVyO1xuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgdHlwZSA9IGVsZW1lbnQudHlwZTtcbiAgICAgICAgICAgIHJlcXVlc3RIYW5kbGVyID0gZWxlbWVudC5oYW5kbGVyO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIGlmIChyZXF1ZXN0SGFuZGxlciB8fCBzdGFyUmVxdWVzdEhhbmRsZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHRva2VuS2V5ID0gcmVxdWVzdE1lc3NhZ2UuaWQgPz8gU3RyaW5nKERhdGUubm93KCkpOyAvL1xuICAgICAgICAgICAgY29uc3QgY2FuY2VsbGF0aW9uU291cmNlID0gSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKGNhbmNlbGxhdGlvblN0cmF0ZWd5LnJlY2VpdmVyKVxuICAgICAgICAgICAgICAgID8gY2FuY2VsbGF0aW9uU3RyYXRlZ3kucmVjZWl2ZXIuY3JlYXRlQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UodG9rZW5LZXkpXG4gICAgICAgICAgICAgICAgOiBjYW5jZWxsYXRpb25TdHJhdGVneS5yZWNlaXZlci5jcmVhdGVDYW5jZWxsYXRpb25Ub2tlblNvdXJjZShyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICBpZiAocmVxdWVzdE1lc3NhZ2UuaWQgIT09IG51bGwgJiYga25vd25DYW5jZWxlZFJlcXVlc3RzLmhhcyhyZXF1ZXN0TWVzc2FnZS5pZCkpIHtcbiAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25Tb3VyY2UuY2FuY2VsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVxdWVzdE1lc3NhZ2UuaWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLnNldCh0b2tlbktleSwgY2FuY2VsbGF0aW9uU291cmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IGhhbmRsZXJSZXN1bHQ7XG4gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0TWVzc2FnZS5wYXJhbXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlLm51bWJlck9mUGFyYW1zICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1zLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyAke3R5cGUubnVtYmVyT2ZQYXJhbXN9IHBhcmFtcyBidXQgcmVjZWl2ZWQgbm9uZS5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJSZXN1bHQgPSByZXF1ZXN0SGFuZGxlcihjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVxdWVzdE1lc3NhZ2UucGFyYW1zKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlLnBhcmFtZXRlclN0cnVjdHVyZXMgPT09IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseUVycm9yKG5ldyBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IobWVzc2FnZXNfMS5FcnJvckNvZGVzLkludmFsaWRQYXJhbXMsIGBSZXF1ZXN0ICR7cmVxdWVzdE1lc3NhZ2UubWV0aG9kfSBkZWZpbmVzIHBhcmFtZXRlcnMgYnkgbmFtZSBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBwb3NpdGlvbmApLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlclJlc3VsdCA9IHJlcXVlc3RIYW5kbGVyKC4uLnJlcXVlc3RNZXNzYWdlLnBhcmFtcywgY2FuY2VsbGF0aW9uU291cmNlLnRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS5wYXJhbWV0ZXJTdHJ1Y3R1cmVzID09PSBtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW52YWxpZFBhcmFtcywgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGRlZmluZXMgcGFyYW1ldGVycyBieSBwb3NpdGlvbiBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBuYW1lYCksIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gcmVxdWVzdEhhbmRsZXIocmVxdWVzdE1lc3NhZ2UucGFyYW1zLCBjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0YXJSZXF1ZXN0SGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gc3RhclJlcXVlc3RIYW5kbGVyKHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgcmVxdWVzdE1lc3NhZ2UucGFyYW1zLCBjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBwcm9taXNlID0gaGFuZGxlclJlc3VsdDtcbiAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZXJSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFRva2Vucy5kZWxldGUodG9rZW5LZXkpO1xuICAgICAgICAgICAgICAgICAgICByZXBseVN1Y2Nlc3MoaGFuZGxlclJlc3VsdCwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwcm9taXNlLnRoZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS50aGVuKChyZXN1bHRPckVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLmRlbGV0ZSh0b2tlbktleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXBseShyZXN1bHRPckVycm9yLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IoZXJyb3IsIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVycm9yICYmIElzLnN0cmluZyhlcnJvci5tZXNzYWdlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGZhaWxlZCB3aXRoIG1lc3NhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZmFpbGVkIHVuZXhwZWN0ZWRseSB3aXRob3V0IHByb3ZpZGluZyBhbnkgZGV0YWlscy5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHkoaGFuZGxlclJlc3VsdCwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHkoZXJyb3IsIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZXJyb3IgJiYgSXMuc3RyaW5nKGVycm9yLm1lc3NhZ2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGZhaWxlZCB3aXRoIG1lc3NhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZmFpbGVkIHVuZXhwZWN0ZWRseSB3aXRob3V0IHByb3ZpZGluZyBhbnkgZGV0YWlscy5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuTWV0aG9kTm90Rm91bmQsIGBVbmhhbmRsZWQgbWV0aG9kICR7cmVxdWVzdE1lc3NhZ2UubWV0aG9kfWApLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlUmVzcG9uc2UocmVzcG9uc2VNZXNzYWdlKSB7XG4gICAgICAgIGlmIChpc0Rpc3Bvc2VkKCkpIHtcbiAgICAgICAgICAgIC8vIFNlZSBoYW5kbGUgcmVxdWVzdC5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzcG9uc2VNZXNzYWdlLmlkID09PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VNZXNzYWdlLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBSZWNlaXZlZCByZXNwb25zZSBtZXNzYWdlIHdpdGhvdXQgaWQ6IEVycm9yIGlzOiBcXG4ke0pTT04uc3RyaW5naWZ5KHJlc3BvbnNlTWVzc2FnZS5lcnJvciwgdW5kZWZpbmVkLCA0KX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgUmVjZWl2ZWQgcmVzcG9uc2UgbWVzc2FnZSB3aXRob3V0IGlkLiBObyBmdXJ0aGVyIGVycm9yIGluZm9ybWF0aW9uIHByb3ZpZGVkLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gcmVzcG9uc2VNZXNzYWdlLmlkO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VQcm9taXNlID0gcmVzcG9uc2VQcm9taXNlcy5nZXQoa2V5KTtcbiAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWRSZXNwb25zZShyZXNwb25zZU1lc3NhZ2UsIHJlc3BvbnNlUHJvbWlzZSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VQcm9taXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2VzLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZU1lc3NhZ2UuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gcmVzcG9uc2VNZXNzYWdlLmVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlLnJlamVjdChuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKGVycm9yLmNvZGUsIGVycm9yLm1lc3NhZ2UsIGVycm9yLmRhdGEpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXNwb25zZU1lc3NhZ2UucmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlTWVzc2FnZS5yZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgbmV2ZXIgaGFwcGVuLicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IubWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBSZXNwb25zZSBoYW5kbGVyICcke3Jlc3BvbnNlUHJvbWlzZS5tZXRob2R9JyBmYWlsZWQgd2l0aCBtZXNzYWdlOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYFJlc3BvbnNlIGhhbmRsZXIgJyR7cmVzcG9uc2VQcm9taXNlLm1ldGhvZH0nIGZhaWxlZCB1bmV4cGVjdGVkbHkuYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlTm90aWZpY2F0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgLy8gU2VlIGhhbmRsZSByZXF1ZXN0LlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0eXBlID0gdW5kZWZpbmVkO1xuICAgICAgICBsZXQgbm90aWZpY2F0aW9uSGFuZGxlcjtcbiAgICAgICAgaWYgKG1lc3NhZ2UubWV0aG9kID09PSBDYW5jZWxOb3RpZmljYXRpb24udHlwZS5tZXRob2QpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhbmNlbElkID0gbWVzc2FnZS5wYXJhbXMuaWQ7XG4gICAgICAgICAgICBrbm93bkNhbmNlbGVkUmVxdWVzdHMuZGVsZXRlKGNhbmNlbElkKTtcbiAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWROb3RpZmljYXRpb24obWVzc2FnZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gbm90aWZpY2F0aW9uSGFuZGxlcnMuZ2V0KG1lc3NhZ2UubWV0aG9kKTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uSGFuZGxlciA9IGVsZW1lbnQuaGFuZGxlcjtcbiAgICAgICAgICAgICAgICB0eXBlID0gZWxlbWVudC50eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChub3RpZmljYXRpb25IYW5kbGVyIHx8IHN0YXJOb3RpZmljYXRpb25IYW5kbGVyKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWROb3RpZmljYXRpb24obWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgaWYgKG5vdGlmaWNhdGlvbkhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UucGFyYW1zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5udW1iZXJPZlBhcmFtcyAhPT0gMCAmJiB0eXBlLnBhcmFtZXRlclN0cnVjdHVyZXMgIT09IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBOb3RpZmljYXRpb24gJHttZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyAke3R5cGUubnVtYmVyT2ZQYXJhbXN9IHBhcmFtcyBidXQgcmVjZWl2ZWQgbm9uZS5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShtZXNzYWdlLnBhcmFtcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGFyZSBKU09OLVJQQyBsaWJyYXJpZXMgdGhhdCBzZW5kIHByb2dyZXNzIG1lc3NhZ2UgYXMgcG9zaXRpb25hbCBwYXJhbXMgYWx0aG91Z2hcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpZmllZCBhcyBuYW1lZC4gU28gY29udmVydCB0aGVtIGlmIHRoaXMgaXMgdGhlIGNhc2UuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBtZXNzYWdlLnBhcmFtcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLm1ldGhvZCA9PT0gUHJvZ3Jlc3NOb3RpZmljYXRpb24udHlwZS5tZXRob2QgJiYgcGFyYW1zLmxlbmd0aCA9PT0gMiAmJiBQcm9ncmVzc1Rva2VuLmlzKHBhcmFtc1swXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKHsgdG9rZW46IHBhcmFtc1swXSwgdmFsdWU6IHBhcmFtc1sxXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUucGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBOb3RpZmljYXRpb24gJHttZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyBwYXJhbWV0ZXJzIGJ5IG5hbWUgYnV0IHJlY2VpdmVkIHBhcmFtZXRlcnMgYnkgcG9zaXRpb25gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5udW1iZXJPZlBhcmFtcyAhPT0gbWVzc2FnZS5wYXJhbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYE5vdGlmaWNhdGlvbiAke21lc3NhZ2UubWV0aG9kfSBkZWZpbmVzICR7dHlwZS5udW1iZXJPZlBhcmFtc30gcGFyYW1zIGJ1dCByZWNlaXZlZCAke3BhcmFtcy5sZW5ndGh9IGFyZ3VtZW50c2ApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXIoLi4ucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS5wYXJhbWV0ZXJTdHJ1Y3R1cmVzID09PSBtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgTm90aWZpY2F0aW9uICR7bWVzc2FnZS5tZXRob2R9IGRlZmluZXMgcGFyYW1ldGVycyBieSBwb3NpdGlvbiBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBuYW1lYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKG1lc3NhZ2UucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGFyTm90aWZpY2F0aW9uSGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICBzdGFyTm90aWZpY2F0aW9uSGFuZGxlcihtZXNzYWdlLm1ldGhvZCwgbWVzc2FnZS5wYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvci5tZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgTm90aWZpY2F0aW9uIGhhbmRsZXIgJyR7bWVzc2FnZS5tZXRob2R9JyBmYWlsZWQgd2l0aCBtZXNzYWdlOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYE5vdGlmaWNhdGlvbiBoYW5kbGVyICcke21lc3NhZ2UubWV0aG9kfScgZmFpbGVkIHVuZXhwZWN0ZWRseS5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1bmhhbmRsZWROb3RpZmljYXRpb25FbWl0dGVyLmZpcmUobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlSW52YWxpZE1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignUmVjZWl2ZWQgZW1wdHkgbWVzc2FnZS4nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsb2dnZXIuZXJyb3IoYFJlY2VpdmVkIG1lc3NhZ2Ugd2hpY2ggaXMgbmVpdGhlciBhIHJlc3BvbnNlIG5vciBhIG5vdGlmaWNhdGlvbiBtZXNzYWdlOlxcbiR7SlNPTi5zdHJpbmdpZnkobWVzc2FnZSwgbnVsbCwgNCl9YCk7XG4gICAgICAgIC8vIFRlc3Qgd2hldGhlciB3ZSBmaW5kIGFuIGlkIHRvIHJlamVjdCB0aGUgcHJvbWlzZVxuICAgICAgICBjb25zdCByZXNwb25zZU1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICBpZiAoSXMuc3RyaW5nKHJlc3BvbnNlTWVzc2FnZS5pZCkgfHwgSXMubnVtYmVyKHJlc3BvbnNlTWVzc2FnZS5pZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHJlc3BvbnNlTWVzc2FnZS5pZDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxlciA9IHJlc3BvbnNlUHJvbWlzZXMuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VIYW5kbGVyLnJlamVjdChuZXcgRXJyb3IoJ1RoZSByZWNlaXZlZCByZXNwb25zZSBoYXMgbmVpdGhlciBhIHJlc3VsdCBub3IgYW4gZXJyb3IgcHJvcGVydHkuJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0cmluZ2lmeVRyYWNlKHBhcmFtcykge1xuICAgICAgICBpZiAocGFyYW1zID09PSB1bmRlZmluZWQgfHwgcGFyYW1zID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAodHJhY2UpIHtcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuVmVyYm9zZTpcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGFyYW1zLCBudWxsLCA0KTtcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuQ29tcGFjdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGFyYW1zKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVNlbmRpbmdSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFjZUZvcm1hdCA9PT0gVHJhY2VGb3JtYXQuVGV4dCkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSAmJiBtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBgUGFyYW1zOiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucGFyYW1zKX1cXG5cXG5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJhY2VyLmxvZyhgU2VuZGluZyByZXF1ZXN0ICcke21lc3NhZ2UubWV0aG9kfSAtICgke21lc3NhZ2UuaWR9KScuYCwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb2dMU1BNZXNzYWdlKCdzZW5kLXJlcXVlc3QnLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVNlbmRpbmdOb3RpZmljYXRpb24obWVzc2FnZSkge1xuICAgICAgICBpZiAodHJhY2UgPT09IFRyYWNlLk9mZiB8fCAhdHJhY2VyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYWNlRm9ybWF0ID09PSBUcmFjZUZvcm1hdC5UZXh0KSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdCkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0gYFBhcmFtczogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLnBhcmFtcyl9XFxuXFxuYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSAnTm8gcGFyYW1ldGVycyBwcm92aWRlZC5cXG5cXG4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFNlbmRpbmcgbm90aWZpY2F0aW9uICcke21lc3NhZ2UubWV0aG9kfScuYCwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb2dMU1BNZXNzYWdlKCdzZW5kLW5vdGlmaWNhdGlvbicsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhY2VGb3JtYXQgPT09IFRyYWNlRm9ybWF0LlRleHQpIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZXJyb3IgJiYgbWVzc2FnZS5lcnJvci5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgRXJyb3IgZGF0YTogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLmVycm9yLmRhdGEpfVxcblxcbmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgUmVzdWx0OiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucmVzdWx0KX1cXG5cXG5gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UuZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9ICdObyByZXN1bHQgcmV0dXJuZWQuXFxuXFxuJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFNlbmRpbmcgcmVzcG9uc2UgJyR7bWV0aG9kfSAtICgke21lc3NhZ2UuaWR9KScuIFByb2Nlc3NpbmcgcmVxdWVzdCB0b29rICR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1tc2AsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgnc2VuZC1yZXNwb25zZScsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYWNlUmVjZWl2ZWRSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFjZUZvcm1hdCA9PT0gVHJhY2VGb3JtYXQuVGV4dCkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSAmJiBtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBgUGFyYW1zOiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucGFyYW1zKX1cXG5cXG5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJhY2VyLmxvZyhgUmVjZWl2ZWQgcmVxdWVzdCAnJHttZXNzYWdlLm1ldGhvZH0gLSAoJHttZXNzYWdlLmlkfSknLmAsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1yZXF1ZXN0JywgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdHJhY2VSZWNlaXZlZE5vdGlmaWNhdGlvbihtZXNzYWdlKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIgfHwgbWVzc2FnZS5tZXRob2QgPT09IExvZ1RyYWNlTm90aWZpY2F0aW9uLnR5cGUubWV0aG9kKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYWNlRm9ybWF0ID09PSBUcmFjZUZvcm1hdC5UZXh0KSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdCkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0gYFBhcmFtczogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLnBhcmFtcyl9XFxuXFxuYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSAnTm8gcGFyYW1ldGVycyBwcm92aWRlZC5cXG5cXG4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFJlY2VpdmVkIG5vdGlmaWNhdGlvbiAnJHttZXNzYWdlLm1ldGhvZH0nLmAsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1ub3RpZmljYXRpb24nLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVJlY2VpdmVkUmVzcG9uc2UobWVzc2FnZSwgcmVzcG9uc2VQcm9taXNlKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhY2VGb3JtYXQgPT09IFRyYWNlRm9ybWF0LlRleHQpIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZXJyb3IgJiYgbWVzc2FnZS5lcnJvci5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgRXJyb3IgZGF0YTogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLmVycm9yLmRhdGEpfVxcblxcbmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgUmVzdWx0OiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucmVzdWx0KX1cXG5cXG5gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UuZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9ICdObyByZXN1bHQgcmV0dXJuZWQuXFxuXFxuJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXNwb25zZVByb21pc2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IG1lc3NhZ2UuZXJyb3IgPyBgIFJlcXVlc3QgZmFpbGVkOiAke21lc3NhZ2UuZXJyb3IubWVzc2FnZX0gKCR7bWVzc2FnZS5lcnJvci5jb2RlfSkuYCA6ICcnO1xuICAgICAgICAgICAgICAgIHRyYWNlci5sb2coYFJlY2VpdmVkIHJlc3BvbnNlICcke3Jlc3BvbnNlUHJvbWlzZS5tZXRob2R9IC0gKCR7bWVzc2FnZS5pZH0pJyBpbiAke0RhdGUubm93KCkgLSByZXNwb25zZVByb21pc2UudGltZXJTdGFydH1tcy4ke2Vycm9yfWAsIGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJhY2VyLmxvZyhgUmVjZWl2ZWQgcmVzcG9uc2UgJHttZXNzYWdlLmlkfSB3aXRob3V0IGFjdGl2ZSByZXNwb25zZSBwcm9taXNlLmAsIGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1yZXNwb25zZScsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGxvZ0xTUE1lc3NhZ2UodHlwZSwgbWVzc2FnZSkge1xuICAgICAgICBpZiAoIXRyYWNlciB8fCB0cmFjZSA9PT0gVHJhY2UuT2ZmKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbHNwTWVzc2FnZSA9IHtcbiAgICAgICAgICAgIGlzTFNQTWVzc2FnZTogdHJ1ZSxcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpXG4gICAgICAgIH07XG4gICAgICAgIHRyYWNlci5sb2cobHNwTWVzc2FnZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRocm93SWZDbG9zZWRPckRpc3Bvc2VkKCkge1xuICAgICAgICBpZiAoaXNDbG9zZWQoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IENvbm5lY3Rpb25FcnJvcihDb25uZWN0aW9uRXJyb3JzLkNsb3NlZCwgJ0Nvbm5lY3Rpb24gaXMgY2xvc2VkLicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0Rpc3Bvc2VkKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb25uZWN0aW9uRXJyb3IoQ29ubmVjdGlvbkVycm9ycy5EaXNwb3NlZCwgJ0Nvbm5lY3Rpb24gaXMgZGlzcG9zZWQuJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdGhyb3dJZkxpc3RlbmluZygpIHtcbiAgICAgICAgaWYgKGlzTGlzdGVuaW5nKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb25uZWN0aW9uRXJyb3IoQ29ubmVjdGlvbkVycm9ycy5BbHJlYWR5TGlzdGVuaW5nLCAnQ29ubmVjdGlvbiBpcyBhbHJlYWR5IGxpc3RlbmluZycpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRocm93SWZOb3RMaXN0ZW5pbmcoKSB7XG4gICAgICAgIGlmICghaXNMaXN0ZW5pbmcoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYWxsIGxpc3RlbigpIGZpcnN0LicpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVuZGVmaW5lZFRvTnVsbChwYXJhbSkge1xuICAgICAgICBpZiAocGFyYW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyYW07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gbnVsbFRvVW5kZWZpbmVkKHBhcmFtKSB7XG4gICAgICAgIGlmIChwYXJhbSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJhbTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBpc05hbWVkUGFyYW0ocGFyYW0pIHtcbiAgICAgICAgcmV0dXJuIHBhcmFtICE9PSB1bmRlZmluZWQgJiYgcGFyYW0gIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkocGFyYW0pICYmIHR5cGVvZiBwYXJhbSA9PT0gJ29iamVjdCc7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXB1dGVTaW5nbGVQYXJhbShwYXJhbWV0ZXJTdHJ1Y3R1cmVzLCBwYXJhbSkge1xuICAgICAgICBzd2l0Y2ggKHBhcmFtZXRlclN0cnVjdHVyZXMpIHtcbiAgICAgICAgICAgIGNhc2UgbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG86XG4gICAgICAgICAgICAgICAgaWYgKGlzTmFtZWRQYXJhbShwYXJhbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxUb1VuZGVmaW5lZChwYXJhbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3VuZGVmaW5lZFRvTnVsbChwYXJhbSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZTpcbiAgICAgICAgICAgICAgICBpZiAoIWlzTmFtZWRQYXJhbShwYXJhbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWNlaXZlZCBwYXJhbWV0ZXJzIGJ5IG5hbWUgYnV0IHBhcmFtIGlzIG5vdCBhbiBvYmplY3QgbGl0ZXJhbC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGxUb1VuZGVmaW5lZChwYXJhbSk7XG4gICAgICAgICAgICBjYXNlIG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieVBvc2l0aW9uOlxuICAgICAgICAgICAgICAgIHJldHVybiBbdW5kZWZpbmVkVG9OdWxsKHBhcmFtKV07XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBwYXJhbWV0ZXIgc3RydWN0dXJlICR7cGFyYW1ldGVyU3RydWN0dXJlcy50b1N0cmluZygpfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXB1dGVNZXNzYWdlUGFyYW1zKHR5cGUsIHBhcmFtcykge1xuICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICBjb25zdCBudW1iZXJPZlBhcmFtcyA9IHR5cGUubnVtYmVyT2ZQYXJhbXM7XG4gICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gY29tcHV0ZVNpbmdsZVBhcmFtKHR5cGUucGFyYW1ldGVyU3RydWN0dXJlcywgcGFyYW1zWzBdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoICYmIGkgPCBudW1iZXJPZlBhcmFtczsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHVuZGVmaW5lZFRvTnVsbChwYXJhbXNbaV0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPCBudW1iZXJPZlBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gcGFyYW1zLmxlbmd0aDsgaSA8IG51bWJlck9mUGFyYW1zOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB7XG4gICAgICAgIHNlbmROb3RpZmljYXRpb246ICh0eXBlLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlUGFyYW1zO1xuICAgICAgICAgICAgaWYgKElzLnN0cmluZyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICAgIGxldCBwYXJhbVN0YXJ0ID0gMDtcbiAgICAgICAgICAgICAgICBsZXQgcGFyYW1ldGVyU3RydWN0dXJlcyA9IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvO1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuaXMoZmlyc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtU3RhcnQgPSAxO1xuICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gZmlyc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBwYXJhbUVuZCA9IGFyZ3MubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gcGFyYW1FbmQgLSBwYXJhbVN0YXJ0O1xuICAgICAgICAgICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zID0gY29tcHV0ZVNpbmdsZVBhcmFtKHBhcmFtZXRlclN0cnVjdHVyZXMsIGFyZ3NbcGFyYW1TdGFydF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjZWl2ZWQgJHtudW1iZXJPZlBhcmFtc30gcGFyYW1ldGVycyBmb3IgJ2J5IE5hbWUnIG5vdGlmaWNhdGlvbiBwYXJhbWV0ZXIgc3RydWN0dXJlLmApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IGFyZ3Muc2xpY2UocGFyYW1TdGFydCwgcGFyYW1FbmQpLm1hcCh2YWx1ZSA9PiB1bmRlZmluZWRUb051bGwodmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IGFyZ3M7XG4gICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZS5tZXRob2Q7XG4gICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IGNvbXB1dGVNZXNzYWdlUGFyYW1zKHR5cGUsIHBhcmFtcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBub3RpZmljYXRpb25NZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBtZXNzYWdlUGFyYW1zXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdHJhY2VTZW5kaW5nTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbk1lc3NhZ2UpO1xuICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2VXcml0ZXIud3JpdGUobm90aWZpY2F0aW9uTWVzc2FnZSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBTZW5kaW5nIG5vdGlmaWNhdGlvbiBmYWlsZWQuYCk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25Ob3RpZmljYXRpb246ICh0eXBlLCBoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGlmIChJcy5mdW5jKHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB0eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaGFuZGxlcikge1xuICAgICAgICAgICAgICAgIGlmIChJcy5zdHJpbmcodHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZTtcbiAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uSGFuZGxlcnMuc2V0KHR5cGUsIHsgdHlwZTogdW5kZWZpbmVkLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZS5tZXRob2Q7XG4gICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXJzLnNldCh0eXBlLm1ldGhvZCwgeyB0eXBlLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXJzLmRlbGV0ZShtZXRob2QpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBvblByb2dyZXNzOiAoX3R5cGUsIHRva2VuLCBoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgICBpZiAocHJvZ3Jlc3NIYW5kbGVycy5oYXModG9rZW4pKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm9ncmVzcyBoYW5kbGVyIGZvciB0b2tlbiAke3Rva2VufSBhbHJlYWR5IHJlZ2lzdGVyZWRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByb2dyZXNzSGFuZGxlcnMuc2V0KHRva2VuLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc0hhbmRsZXJzLmRlbGV0ZSh0b2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgc2VuZFByb2dyZXNzOiAoX3R5cGUsIHRva2VuLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGF3YWl0IGJ1dCBzaW1wbGUgcmV0dXJuIHRvIGVuc3VyZSB0aGF0IHdlIGRvbid0IGhhdmUgYW5vdGhlclxuICAgICAgICAgICAgLy8gYXN5bmMgc2NoZWR1bGluZy4gT3RoZXJ3aXNlIG9uZSBzZW5kIGNvdWxkIG92ZXJ0YWtlIGFub3RoZXIgc2VuZC5cbiAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLnNlbmROb3RpZmljYXRpb24oUHJvZ3Jlc3NOb3RpZmljYXRpb24udHlwZSwgeyB0b2tlbiwgdmFsdWUgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uVW5oYW5kbGVkUHJvZ3Jlc3M6IHVuaGFuZGxlZFByb2dyZXNzRW1pdHRlci5ldmVudCxcbiAgICAgICAgc2VuZFJlcXVlc3Q6ICh0eXBlLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgdGhyb3dJZk5vdExpc3RlbmluZygpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlUGFyYW1zO1xuICAgICAgICAgICAgbGV0IHRva2VuID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKElzLnN0cmluZyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3QgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgbGV0IHBhcmFtU3RhcnQgPSAwO1xuICAgICAgICAgICAgICAgIGxldCBwYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG87XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5pcyhmaXJzdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1TdGFydCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlclN0cnVjdHVyZXMgPSBmaXJzdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHBhcmFtRW5kID0gYXJncy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuLmlzKGxhc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtRW5kID0gcGFyYW1FbmQgLSAxO1xuICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IGxhc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gcGFyYW1FbmQgLSBwYXJhbVN0YXJ0O1xuICAgICAgICAgICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zID0gY29tcHV0ZVNpbmdsZVBhcmFtKHBhcmFtZXRlclN0cnVjdHVyZXMsIGFyZ3NbcGFyYW1TdGFydF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjZWl2ZWQgJHtudW1iZXJPZlBhcmFtc30gcGFyYW1ldGVycyBmb3IgJ2J5IE5hbWUnIHJlcXVlc3QgcGFyYW1ldGVyIHN0cnVjdHVyZS5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMgPSBhcmdzLnNsaWNlKHBhcmFtU3RhcnQsIHBhcmFtRW5kKS5tYXAodmFsdWUgPT4gdW5kZWZpbmVkVG9OdWxsKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBhcmdzO1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGUubWV0aG9kO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMgPSBjb21wdXRlTWVzc2FnZVBhcmFtcyh0eXBlLCBwYXJhbXMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gdHlwZS5udW1iZXJPZlBhcmFtcztcbiAgICAgICAgICAgICAgICB0b2tlbiA9IGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuLmlzKHBhcmFtc1tudW1iZXJPZlBhcmFtc10pID8gcGFyYW1zW251bWJlck9mUGFyYW1zXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGlkID0gc2VxdWVuY2VOdW1iZXIrKztcbiAgICAgICAgICAgIGxldCBkaXNwb3NhYmxlO1xuICAgICAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgICAgICAgZGlzcG9zYWJsZSA9IHRva2VuLm9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcCA9IGNhbmNlbGxhdGlvblN0cmF0ZWd5LnNlbmRlci5zZW5kQ2FuY2VsbGF0aW9uKGNvbm5lY3Rpb24sIGlkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhgUmVjZWl2ZWQgbm8gcHJvbWlzZSBmcm9tIGNhbmNlbGxhdGlvbiBzdHJhdGVneSB3aGVuIGNhbmNlbGxpbmcgaWQgJHtpZH1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIubG9nKGBTZW5kaW5nIGNhbmNlbGxhdGlvbiBtZXNzYWdlcyBmb3IgaWQgJHtpZH0gZmFpbGVkYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdE1lc3NhZ2UgPSB7XG4gICAgICAgICAgICAgICAganNvbnJwYzogdmVyc2lvbixcbiAgICAgICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBtZXNzYWdlUGFyYW1zXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdHJhY2VTZW5kaW5nUmVxdWVzdChyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNhbmNlbGxhdGlvblN0cmF0ZWd5LnNlbmRlci5lbmFibGVDYW5jZWxsYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25TdHJhdGVneS5zZW5kZXIuZW5hYmxlQ2FuY2VsbGF0aW9uKHJlcXVlc3RNZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZVdpdGhDbGVhbnVwID0gKHIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyKTtcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uU3RyYXRlZ3kuc2VuZGVyLmNsZWFudXAoaWQpO1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlPy5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWplY3RXaXRoQ2xlYW51cCA9IChyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChyKTtcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uU3RyYXRlZ3kuc2VuZGVyLmNsZWFudXAoaWQpO1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlPy5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZVByb21pc2UgPSB7IG1ldGhvZDogbWV0aG9kLCB0aW1lclN0YXJ0OiBEYXRlLm5vdygpLCByZXNvbHZlOiByZXNvbHZlV2l0aENsZWFudXAsIHJlamVjdDogcmVqZWN0V2l0aENsZWFudXAgfTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2VzLnNldChpZCwgcmVzcG9uc2VQcm9taXNlKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbWVzc2FnZVdyaXRlci53cml0ZShyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAvLyBXcml0aW5nIHRoZSBtZXNzYWdlIGZhaWxlZC4gU28gd2UgbmVlZCB0byBkZWxldGUgaXQgZnJvbSB0aGUgcmVzcG9uc2UgcHJvbWlzZXMgYW5kXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlamVjdCBpdC5cbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlcy5kZWxldGUoaWQpO1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2UucmVqZWN0KG5ldyBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IobWVzc2FnZXNfMS5FcnJvckNvZGVzLk1lc3NhZ2VXcml0ZUVycm9yLCBlcnJvci5tZXNzYWdlID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIHJlYXNvbicpKTtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlcXVlc3QgZmFpbGVkLmApO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25SZXF1ZXN0OiAodHlwZSwgaGFuZGxlcikgPT4ge1xuICAgICAgICAgICAgdGhyb3dJZkNsb3NlZE9yRGlzcG9zZWQoKTtcbiAgICAgICAgICAgIGxldCBtZXRob2QgPSBudWxsO1xuICAgICAgICAgICAgaWYgKFN0YXJSZXF1ZXN0SGFuZGxlci5pcyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBzdGFyUmVxdWVzdEhhbmRsZXIgPSB0eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoSXMuc3RyaW5nKHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgbWV0aG9kID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoaGFuZGxlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RIYW5kbGVycy5zZXQodHlwZSwgeyBoYW5kbGVyOiBoYW5kbGVyLCB0eXBlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSB0eXBlLm1ldGhvZDtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEhhbmRsZXJzLnNldCh0eXBlLm1ldGhvZCwgeyB0eXBlLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SGFuZGxlcnMuZGVsZXRlKG1ldGhvZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFyUmVxdWVzdEhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBoYXNQZW5kaW5nUmVzcG9uc2U6ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZVByb21pc2VzLnNpemUgPiAwO1xuICAgICAgICB9LFxuICAgICAgICB0cmFjZTogYXN5bmMgKF92YWx1ZSwgX3RyYWNlciwgc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBsZXQgX3NlbmROb3RpZmljYXRpb24gPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBfdHJhY2VGb3JtYXQgPSBUcmFjZUZvcm1hdC5UZXh0O1xuICAgICAgICAgICAgaWYgKHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKElzLmJvb2xlYW4oc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zKSkge1xuICAgICAgICAgICAgICAgICAgICBfc2VuZE5vdGlmaWNhdGlvbiA9IHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF9zZW5kTm90aWZpY2F0aW9uID0gc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zLnNlbmROb3RpZmljYXRpb24gfHwgZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIF90cmFjZUZvcm1hdCA9IHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucy50cmFjZUZvcm1hdCB8fCBUcmFjZUZvcm1hdC5UZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlID0gX3ZhbHVlO1xuICAgICAgICAgICAgdHJhY2VGb3JtYXQgPSBfdHJhY2VGb3JtYXQ7XG4gICAgICAgICAgICBpZiAodHJhY2UgPT09IFRyYWNlLk9mZikge1xuICAgICAgICAgICAgICAgIHRyYWNlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRyYWNlciA9IF90cmFjZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoX3NlbmROb3RpZmljYXRpb24gJiYgIWlzQ2xvc2VkKCkgJiYgIWlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGNvbm5lY3Rpb24uc2VuZE5vdGlmaWNhdGlvbihTZXRUcmFjZU5vdGlmaWNhdGlvbi50eXBlLCB7IHZhbHVlOiBUcmFjZS50b1N0cmluZyhfdmFsdWUpIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBvbkVycm9yOiBlcnJvckVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIG9uQ2xvc2U6IGNsb3NlRW1pdHRlci5ldmVudCxcbiAgICAgICAgb25VbmhhbmRsZWROb3RpZmljYXRpb246IHVuaGFuZGxlZE5vdGlmaWNhdGlvbkVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIG9uRGlzcG9zZTogZGlzcG9zZUVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIGVuZDogKCkgPT4ge1xuICAgICAgICAgICAgbWVzc2FnZVdyaXRlci5lbmQoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLkRpc3Bvc2VkO1xuICAgICAgICAgICAgZGlzcG9zZUVtaXR0ZXIuZmlyZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5QZW5kaW5nUmVzcG9uc2VSZWplY3RlZCwgJ1BlbmRpbmcgcmVzcG9uc2UgcmVqZWN0ZWQgc2luY2UgY29ubmVjdGlvbiBnb3QgZGlzcG9zZWQnKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvbWlzZSBvZiByZXNwb25zZVByb21pc2VzLnZhbHVlcygpKSB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBrbm93bkNhbmNlbGVkUmVxdWVzdHMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICBtZXNzYWdlUXVldWUgPSBuZXcgbGlua2VkTWFwXzEuTGlua2VkTWFwKCk7XG4gICAgICAgICAgICAvLyBUZXN0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgaWYgKElzLmZ1bmMobWVzc2FnZVdyaXRlci5kaXNwb3NlKSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKElzLmZ1bmMobWVzc2FnZVJlYWRlci5kaXNwb3NlKSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VSZWFkZXIuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBsaXN0ZW46ICgpID0+IHtcbiAgICAgICAgICAgIHRocm93SWZDbG9zZWRPckRpc3Bvc2VkKCk7XG4gICAgICAgICAgICB0aHJvd0lmTGlzdGVuaW5nKCk7XG4gICAgICAgICAgICBzdGF0ZSA9IENvbm5lY3Rpb25TdGF0ZS5MaXN0ZW5pbmc7XG4gICAgICAgICAgICBtZXNzYWdlUmVhZGVyLmxpc3RlbihjYWxsYmFjayk7XG4gICAgICAgIH0sXG4gICAgICAgIGluc3BlY3Q6ICgpID0+IHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS5jb25zb2xlLmxvZygnaW5zcGVjdCcpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25uZWN0aW9uLm9uTm90aWZpY2F0aW9uKExvZ1RyYWNlTm90aWZpY2F0aW9uLnR5cGUsIChwYXJhbXMpID0+IHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZlcmJvc2UgPSB0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdDtcbiAgICAgICAgdHJhY2VyLmxvZyhwYXJhbXMubWVzc2FnZSwgdmVyYm9zZSA/IHBhcmFtcy52ZXJib3NlIDogdW5kZWZpbmVkKTtcbiAgICB9KTtcbiAgICBjb25uZWN0aW9uLm9uTm90aWZpY2F0aW9uKFByb2dyZXNzTm90aWZpY2F0aW9uLnR5cGUsIChwYXJhbXMpID0+IHtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IHByb2dyZXNzSGFuZGxlcnMuZ2V0KHBhcmFtcy50b2tlbik7XG4gICAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICAgICBoYW5kbGVyKHBhcmFtcy52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1bmhhbmRsZWRQcm9ncmVzc0VtaXR0ZXIuZmlyZShwYXJhbXMpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbm5lY3Rpb247XG59XG5leHBvcnRzLmNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uID0gY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb247XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vdHlwaW5ncy90aGVuYWJsZS5kLnRzXCIgLz5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUHJvZ3Jlc3NUeXBlID0gZXhwb3J0cy5Qcm9ncmVzc1Rva2VuID0gZXhwb3J0cy5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiA9IGV4cG9ydHMuTnVsbExvZ2dlciA9IGV4cG9ydHMuQ29ubmVjdGlvbk9wdGlvbnMgPSBleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IGV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlQnVmZmVyID0gZXhwb3J0cy5Xcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyID0gZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLk1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLlJlYWRhYmxlU3RyZWFtTWVzc2FnZVJlYWRlciA9IGV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlUmVhZGVyID0gZXhwb3J0cy5NZXNzYWdlUmVhZGVyID0gZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblRva2VuID0gZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IGV4cG9ydHMuRW1pdHRlciA9IGV4cG9ydHMuRXZlbnQgPSBleHBvcnRzLkRpc3Bvc2FibGUgPSBleHBvcnRzLkxSVUNhY2hlID0gZXhwb3J0cy5Ub3VjaCA9IGV4cG9ydHMuTGlua2VkTWFwID0gZXhwb3J0cy5QYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlOSA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTggPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU3ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNiA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTUgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU0ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMyA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTIgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUxID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMCA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZSA9IGV4cG9ydHMuRXJyb3JDb2RlcyA9IGV4cG9ydHMuUmVzcG9uc2VFcnJvciA9IGV4cG9ydHMuUmVxdWVzdFR5cGU5ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTggPSBleHBvcnRzLlJlcXVlc3RUeXBlNyA9IGV4cG9ydHMuUmVxdWVzdFR5cGU2ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTUgPSBleHBvcnRzLlJlcXVlc3RUeXBlNCA9IGV4cG9ydHMuUmVxdWVzdFR5cGUzID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTIgPSBleHBvcnRzLlJlcXVlc3RUeXBlMSA9IGV4cG9ydHMuUmVxdWVzdFR5cGUwID0gZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IGV4cG9ydHMuTWVzc2FnZSA9IGV4cG9ydHMuUkFMID0gdm9pZCAwO1xuZXhwb3J0cy5NZXNzYWdlU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblN0cmF0ZWd5ID0gZXhwb3J0cy5DYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IGV4cG9ydHMuQ29ubmVjdGlvbkVycm9yID0gZXhwb3J0cy5Db25uZWN0aW9uRXJyb3JzID0gZXhwb3J0cy5Mb2dUcmFjZU5vdGlmaWNhdGlvbiA9IGV4cG9ydHMuU2V0VHJhY2VOb3RpZmljYXRpb24gPSBleHBvcnRzLlRyYWNlRm9ybWF0ID0gZXhwb3J0cy5UcmFjZVZhbHVlcyA9IGV4cG9ydHMuVHJhY2UgPSB2b2lkIDA7XG5jb25zdCBtZXNzYWdlc18xID0gcmVxdWlyZShcIi4vbWVzc2FnZXNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNZXNzYWdlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk1lc3NhZ2U7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlMFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTA7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTFcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGUxOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGUyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlMjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlM1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGU0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGU1XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlNTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlNlwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTY7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTdcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGU3OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGU4XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlODsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlOVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTk7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXNwb25zZUVycm9yXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3I7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJFcnJvckNvZGVzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLkVycm9yQ29kZXM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlMFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlMDsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGUxXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGUxOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZTJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlM1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlMzsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGU0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZTVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlNlwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlNjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGU3XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU3OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZThcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTg7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlOVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlOTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlBhcmFtZXRlclN0cnVjdHVyZXNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlczsgfSB9KTtcbmNvbnN0IGxpbmtlZE1hcF8xID0gcmVxdWlyZShcIi4vbGlua2VkTWFwXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTGlua2VkTWFwXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBsaW5rZWRNYXBfMS5MaW5rZWRNYXA7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJMUlVDYWNoZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbGlua2VkTWFwXzEuTFJVQ2FjaGU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJUb3VjaFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbGlua2VkTWFwXzEuVG91Y2g7IH0gfSk7XG5jb25zdCBkaXNwb3NhYmxlXzEgPSByZXF1aXJlKFwiLi9kaXNwb3NhYmxlXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiRGlzcG9zYWJsZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZGlzcG9zYWJsZV8xLkRpc3Bvc2FibGU7IH0gfSk7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCIuL2V2ZW50c1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkV2ZW50XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBldmVudHNfMS5FdmVudDsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkVtaXR0ZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGV2ZW50c18xLkVtaXR0ZXI7IH0gfSk7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblRva2VuU291cmNlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjYW5jZWxsYXRpb25fMS5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblRva2VuXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjYW5jZWxsYXRpb25fMS5DYW5jZWxsYXRpb25Ub2tlbjsgfSB9KTtcbmNvbnN0IHNoYXJlZEFycmF5Q2FuY2VsbGF0aW9uXzEgPSByZXF1aXJlKFwiLi9zaGFyZWRBcnJheUNhbmNlbGxhdGlvblwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHNoYXJlZEFycmF5Q2FuY2VsbGF0aW9uXzEuU2hhcmVkQXJyYXlTZW5kZXJTdHJhdGVneTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlNoYXJlZEFycmF5UmVjZWl2ZXJTdHJhdGVneVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gc2hhcmVkQXJyYXlDYW5jZWxsYXRpb25fMS5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3k7IH0gfSk7XG5jb25zdCBtZXNzYWdlUmVhZGVyXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlUmVhZGVyXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTWVzc2FnZVJlYWRlclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZVJlYWRlcl8xLk1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VSZWFkZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VSZWFkZXJfMS5BYnN0cmFjdE1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VSZWFkZXJfMS5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5jb25zdCBtZXNzYWdlV3JpdGVyXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlV3JpdGVyXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTWVzc2FnZVdyaXRlclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZVdyaXRlcl8xLk1lc3NhZ2VXcml0ZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VXcml0ZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VXcml0ZXJfMS5BYnN0cmFjdE1lc3NhZ2VXcml0ZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJXcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlV3JpdGVyXzEuV3JpdGVhYmxlU3RyZWFtTWVzc2FnZVdyaXRlcjsgfSB9KTtcbmNvbnN0IG1lc3NhZ2VCdWZmZXJfMSA9IHJlcXVpcmUoXCIuL21lc3NhZ2VCdWZmZXJcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VCdWZmZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VCdWZmZXJfMS5BYnN0cmFjdE1lc3NhZ2VCdWZmZXI7IH0gfSk7XG5jb25zdCBjb25uZWN0aW9uXzEgPSByZXF1aXJlKFwiLi9jb25uZWN0aW9uXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29ubmVjdGlvblN0cmF0ZWd5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ29ubmVjdGlvblN0cmF0ZWd5OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29ubmVjdGlvbk9wdGlvbnNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5Db25uZWN0aW9uT3B0aW9uczsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk51bGxMb2dnZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5OdWxsTG9nZ2VyOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb25cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlByb2dyZXNzVG9rZW5cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5Qcm9ncmVzc1Rva2VuOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUHJvZ3Jlc3NUeXBlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuUHJvZ3Jlc3NUeXBlOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiVHJhY2VcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5UcmFjZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlRyYWNlVmFsdWVzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuVHJhY2VWYWx1ZXM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJUcmFjZUZvcm1hdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29ubmVjdGlvbl8xLlRyYWNlRm9ybWF0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiU2V0VHJhY2VOb3RpZmljYXRpb25cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5TZXRUcmFjZU5vdGlmaWNhdGlvbjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkxvZ1RyYWNlTm90aWZpY2F0aW9uXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuTG9nVHJhY2VOb3RpZmljYXRpb247IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJDb25uZWN0aW9uRXJyb3JzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ29ubmVjdGlvbkVycm9yczsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNvbm5lY3Rpb25FcnJvclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29ubmVjdGlvbl8xLkNvbm5lY3Rpb25FcnJvcjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5DYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5DYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblN0cmF0ZWd5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ2FuY2VsbGF0aW9uU3RyYXRlZ3k7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNZXNzYWdlU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5NZXNzYWdlU3RyYXRlZ3k7IH0gfSk7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbmV4cG9ydHMuUkFMID0gcmFsXzEuZGVmYXVsdDtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGFwaV8xID0gcmVxdWlyZShcIi4uL2NvbW1vbi9hcGlcIik7XG5jbGFzcyBNZXNzYWdlQnVmZmVyIGV4dGVuZHMgYXBpXzEuQWJzdHJhY3RNZXNzYWdlQnVmZmVyIHtcbiAgICBjb25zdHJ1Y3RvcihlbmNvZGluZyA9ICd1dGYtOCcpIHtcbiAgICAgICAgc3VwZXIoZW5jb2RpbmcpO1xuICAgICAgICB0aGlzLmFzY2lpRGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcignYXNjaWknKTtcbiAgICB9XG4gICAgZW1wdHlCdWZmZXIoKSB7XG4gICAgICAgIHJldHVybiBNZXNzYWdlQnVmZmVyLmVtcHR5QnVmZmVyO1xuICAgIH1cbiAgICBmcm9tU3RyaW5nKHZhbHVlLCBfZW5jb2RpbmcpIHtcbiAgICAgICAgcmV0dXJuIChuZXcgVGV4dEVuY29kZXIoKSkuZW5jb2RlKHZhbHVlKTtcbiAgICB9XG4gICAgdG9TdHJpbmcodmFsdWUsIGVuY29kaW5nKSB7XG4gICAgICAgIGlmIChlbmNvZGluZyA9PT0gJ2FzY2lpJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXNjaWlEZWNvZGVyLmRlY29kZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gKG5ldyBUZXh0RGVjb2RlcihlbmNvZGluZykpLmRlY29kZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXNOYXRpdmUoYnVmZmVyLCBsZW5ndGgpIHtcbiAgICAgICAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlci5zbGljZSgwLCBsZW5ndGgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFsbG9jTmF0aXZlKGxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTtcbiAgICB9XG59XG5NZXNzYWdlQnVmZmVyLmVtcHR5QnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMCk7XG5jbGFzcyBSZWFkYWJsZVN0cmVhbVdyYXBwZXIge1xuICAgIGNvbnN0cnVjdG9yKHNvY2tldCkge1xuICAgICAgICB0aGlzLnNvY2tldCA9IHNvY2tldDtcbiAgICAgICAgdGhpcy5fb25EYXRhID0gbmV3IGFwaV8xLkVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5fbWVzc2FnZUxpc3RlbmVyID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBibG9iID0gZXZlbnQuZGF0YTtcbiAgICAgICAgICAgIGJsb2IuYXJyYXlCdWZmZXIoKS50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkRhdGEuZmlyZShuZXcgVWludDhBcnJheShidWZmZXIpKTtcbiAgICAgICAgICAgIH0sICgpID0+IHtcbiAgICAgICAgICAgICAgICAoMCwgYXBpXzEuUkFMKSgpLmNvbnNvbGUuZXJyb3IoYENvbnZlcnRpbmcgYmxvYiB0byBhcnJheSBidWZmZXIgZmFpbGVkLmApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLl9tZXNzYWdlTGlzdGVuZXIpO1xuICAgIH1cbiAgICBvbkNsb3NlKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2Nsb3NlJywgbGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gYXBpXzEuRGlzcG9zYWJsZS5jcmVhdGUoKCkgPT4gdGhpcy5zb2NrZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xvc2UnLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkVycm9yKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgbGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gYXBpXzEuRGlzcG9zYWJsZS5jcmVhdGUoKCkgPT4gdGhpcy5zb2NrZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkVuZChsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKCdlbmQnLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdlbmQnLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkRhdGEobGlzdGVuZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uRGF0YS5ldmVudChsaXN0ZW5lcik7XG4gICAgfVxufVxuY2xhc3MgV3JpdGFibGVTdHJlYW1XcmFwcGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihzb2NrZXQpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7XG4gICAgfVxuICAgIG9uQ2xvc2UobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignY2xvc2UnLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbG9zZScsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIG9uRXJyb3IobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIG9uRW5kKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2VuZCcsIGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIGFwaV8xLkRpc3Bvc2FibGUuY3JlYXRlKCgpID0+IHRoaXMuc29ja2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2VuZCcsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIHdyaXRlKGRhdGEsIGVuY29kaW5nKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkICYmIGVuY29kaW5nICE9PSAndXRmLTgnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbiBhIEJyb3dzZXIgZW52aXJvbm1lbnRzIG9ubHkgdXRmLTggdGV4dCBlbmNvZGluZyBpcyBzdXBwb3J0ZWQuIEJ1dCBnb3QgZW5jb2Rpbmc6ICR7ZW5jb2Rpbmd9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKTtcbiAgICB9XG59XG5jb25zdCBfdGV4dEVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbmNvbnN0IF9yaWwgPSBPYmplY3QuZnJlZXplKHtcbiAgICBtZXNzYWdlQnVmZmVyOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgY3JlYXRlOiAoZW5jb2RpbmcpID0+IG5ldyBNZXNzYWdlQnVmZmVyKGVuY29kaW5nKVxuICAgIH0pLFxuICAgIGFwcGxpY2F0aW9uSnNvbjogT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGVuY29kZXI6IE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgbmFtZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgZW5jb2RlOiAobXNnLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2hhcnNldCAhPT0gJ3V0Zi04Jykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluIGEgQnJvd3NlciBlbnZpcm9ubWVudHMgb25seSB1dGYtOCB0ZXh0IGVuY29kaW5nIGlzIHN1cHBvcnRlZC4gQnV0IGdvdCBlbmNvZGluZzogJHtvcHRpb25zLmNoYXJzZXR9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoX3RleHRFbmNvZGVyLmVuY29kZShKU09OLnN0cmluZ2lmeShtc2csIHVuZGVmaW5lZCwgMCkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIGRlY29kZXI6IE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgbmFtZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgZGVjb2RlOiAoYnVmZmVyLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCEoYnVmZmVyIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbiBhIEJyb3dzZXIgZW52aXJvbm1lbnRzIG9ubHkgVWludDhBcnJheXMgYXJlIHN1cHBvcnRlZC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShKU09OLnBhcnNlKG5ldyBUZXh0RGVjb2RlcihvcHRpb25zLmNoYXJzZXQpLmRlY29kZShidWZmZXIpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfSksXG4gICAgc3RyZWFtOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgYXNSZWFkYWJsZVN0cmVhbTogKHNvY2tldCkgPT4gbmV3IFJlYWRhYmxlU3RyZWFtV3JhcHBlcihzb2NrZXQpLFxuICAgICAgICBhc1dyaXRhYmxlU3RyZWFtOiAoc29ja2V0KSA9PiBuZXcgV3JpdGFibGVTdHJlYW1XcmFwcGVyKHNvY2tldClcbiAgICB9KSxcbiAgICBjb25zb2xlOiBjb25zb2xlLFxuICAgIHRpbWVyOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgc2V0VGltZW91dChjYWxsYmFjaywgbXMsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHNldFRpbWVvdXQoY2FsbGJhY2ssIG1zLCAuLi5hcmdzKTtcbiAgICAgICAgICAgIHJldHVybiB7IGRpc3Bvc2U6ICgpID0+IGNsZWFyVGltZW91dChoYW5kbGUpIH07XG4gICAgICAgIH0sXG4gICAgICAgIHNldEltbWVkaWF0ZShjYWxsYmFjaywgLi4uYXJncykge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gc2V0VGltZW91dChjYWxsYmFjaywgMCwgLi4uYXJncyk7XG4gICAgICAgICAgICByZXR1cm4geyBkaXNwb3NlOiAoKSA9PiBjbGVhclRpbWVvdXQoaGFuZGxlKSB9O1xuICAgICAgICB9LFxuICAgICAgICBzZXRJbnRlcnZhbChjYWxsYmFjaywgbXMsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHNldEludGVydmFsKGNhbGxiYWNrLCBtcywgLi4uYXJncyk7XG4gICAgICAgICAgICByZXR1cm4geyBkaXNwb3NlOiAoKSA9PiBjbGVhckludGVydmFsKGhhbmRsZSkgfTtcbiAgICAgICAgfSxcbiAgICB9KVxufSk7XG5mdW5jdGlvbiBSSUwoKSB7XG4gICAgcmV0dXJuIF9yaWw7XG59XG4oZnVuY3Rpb24gKFJJTCkge1xuICAgIGZ1bmN0aW9uIGluc3RhbGwoKSB7XG4gICAgICAgIGFwaV8xLlJBTC5pbnN0YWxsKF9yaWwpO1xuICAgIH1cbiAgICBSSUwuaW5zdGFsbCA9IGluc3RhbGw7XG59KShSSUwgfHwgKFJJTCA9IHt9KSk7XG5leHBvcnRzLmRlZmF1bHQgPSBSSUw7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24gPSBleHBvcnRzLkJyb3dzZXJNZXNzYWdlV3JpdGVyID0gZXhwb3J0cy5Ccm93c2VyTWVzc2FnZVJlYWRlciA9IHZvaWQgMDtcbmNvbnN0IHJpbF8xID0gcmVxdWlyZShcIi4vcmlsXCIpO1xuLy8gSW5zdGFsbCB0aGUgYnJvd3NlciBydW50aW1lIGFic3RyYWN0LlxucmlsXzEuZGVmYXVsdC5pbnN0YWxsKCk7XG5jb25zdCBhcGlfMSA9IHJlcXVpcmUoXCIuLi9jb21tb24vYXBpXCIpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuLi9jb21tb24vYXBpXCIpLCBleHBvcnRzKTtcbmNsYXNzIEJyb3dzZXJNZXNzYWdlUmVhZGVyIGV4dGVuZHMgYXBpXzEuQWJzdHJhY3RNZXNzYWdlUmVhZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihwb3J0KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX29uRGF0YSA9IG5ldyBhcGlfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuX21lc3NhZ2VMaXN0ZW5lciA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fb25EYXRhLmZpcmUoZXZlbnQuZGF0YSk7XG4gICAgICAgIH07XG4gICAgICAgIHBvcnQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoZXZlbnQpID0+IHRoaXMuZmlyZUVycm9yKGV2ZW50KSk7XG4gICAgICAgIHBvcnQub25tZXNzYWdlID0gdGhpcy5fbWVzc2FnZUxpc3RlbmVyO1xuICAgIH1cbiAgICBsaXN0ZW4oY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uRGF0YS5ldmVudChjYWxsYmFjayk7XG4gICAgfVxufVxuZXhwb3J0cy5Ccm93c2VyTWVzc2FnZVJlYWRlciA9IEJyb3dzZXJNZXNzYWdlUmVhZGVyO1xuY2xhc3MgQnJvd3Nlck1lc3NhZ2VXcml0ZXIgZXh0ZW5kcyBhcGlfMS5BYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKHBvcnQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50ID0gMDtcbiAgICAgICAgcG9ydC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIChldmVudCkgPT4gdGhpcy5maXJlRXJyb3IoZXZlbnQpKTtcbiAgICB9XG4gICAgd3JpdGUobXNnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnBvcnQucG9zdE1lc3NhZ2UobXNnKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IsIG1zZyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZUVycm9yKGVycm9yLCBtc2cpIHtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50Kys7XG4gICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yLCBtc2csIHRoaXMuZXJyb3JDb3VudCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICB9XG59XG5leHBvcnRzLkJyb3dzZXJNZXNzYWdlV3JpdGVyID0gQnJvd3Nlck1lc3NhZ2VXcml0ZXI7XG5mdW5jdGlvbiBjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbihyZWFkZXIsIHdyaXRlciwgbG9nZ2VyLCBvcHRpb25zKSB7XG4gICAgaWYgKGxvZ2dlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxvZ2dlciA9IGFwaV8xLk51bGxMb2dnZXI7XG4gICAgfVxuICAgIGlmIChhcGlfMS5Db25uZWN0aW9uU3RyYXRlZ3kuaXMob3B0aW9ucykpIHtcbiAgICAgICAgb3B0aW9ucyA9IHsgY29ubmVjdGlvblN0cmF0ZWd5OiBvcHRpb25zIH07XG4gICAgfVxuICAgIHJldHVybiAoMCwgYXBpXzEuY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24pKHJlYWRlciwgd3JpdGVyLCBsb2dnZXIsIG9wdGlvbnMpO1xufVxuZXhwb3J0cy5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiA9IGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uO1xuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL2Jyb3dzZXIvbWFpbicpOyIsICIvKlxuICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMjYgRWNsaXBzZSBEaXJpZ2libGUgY29udHJpYnV0b3JzXG4gKlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlXG4gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2Mi4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG4gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MjAuaHRtbFxuICpcbiAqIFNQRFgtRmlsZUNvcHlyaWdodFRleHQ6IEVjbGlwc2UgRGlyaWdpYmxlIGNvbnRyaWJ1dG9ycyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbi8qKlxuICogSmF2YSBMU1AgY2xpZW50IGJ1bmRsZS5cbiAqXG4gKiBVc2VzIHZzY29kZS13cy1qc29ucnBjIGZvciB0eXBlZCBKU09OLVJQQyBvdmVyIFdlYlNvY2tldCBhbmQgcmVnaXN0ZXJzIE1vbmFjb1xuICogcHJvdmlkZXJzIHRoYXQgZGVsZWdhdGUgdG8gSkRULkxTLiBFeHBvc2VkIGFzIGdsb2JhbCBKYXZhTHNwQ2xpZW50TGliIHNvIHRoYXRcbiAqIGVkaXRvci5qcyBjYW4gY2FsbCBKYXZhTHNwQ2xpZW50TGliLmNvbm5lY3QocmVzb3VyY2VQYXRoKS5cbiAqXG4gKiBPbmUgSkRULkxTIHByb2Nlc3MgY292ZXJzIHRoZSBlbnRpcmUgd29ya3NwYWNlLCBzbyBhIHNpbmdsZSBXZWJTb2NrZXQgY29ubmVjdGlvblxuICogaXMgc2hhcmVkIGFjcm9zcyBhbGwgSmF2YSBmaWxlcyBvcGVuIGluIHRoZSBzYW1lIGJyb3dzZXIgcGFnZS4gVGhlIGNvbm5lY3Rpb24gaXNcbiAqIGVzdGFibGlzaGVkIG9uIHRoZSBmaXJzdCBjb25uZWN0KCkgY2FsbCBhbmQgcmV1c2VkIGZvciBhbGwgc3Vic2VxdWVudCBjYWxscy5cbiAqXG4gKiBlZGl0b3IuanMgc2V0cyB3aW5kb3cubW9uYWNvIGJlZm9yZSBjYWxsaW5nIGNvbm5lY3QoKSwgc28gdGhlIG1vbmFjby1zaGltJ3MgbGF6eVxuICogUHJveGllcyByZXNvbHZlIGNvcnJlY3RseSBhdCBjYWxsIHRpbWUuXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24sIE1lc3NhZ2VDb25uZWN0aW9uIH0gZnJvbSAndnNjb2RlLWpzb25ycGMvYnJvd3Nlcic7XG5pbXBvcnQgeyB0b1NvY2tldCwgV2ViU29ja2V0TWVzc2FnZVJlYWRlciwgV2ViU29ja2V0TWVzc2FnZVdyaXRlciB9IGZyb20gJ3ZzY29kZS13cy1qc29ucnBjJztcbmltcG9ydCAqIGFzIG1vbmFjbyBmcm9tICdtb25hY28tZWRpdG9yJztcbmltcG9ydCB7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLFxuICAgIERpYWdub3N0aWNTZXZlcml0eSxcbiAgICBJbnNlcnRUZXh0Rm9ybWF0LFxuICAgIE1hcmt1cENvbnRlbnQsXG4gICAgTWFya3VwS2luZCxcbiAgICB0eXBlIENvZGVBY3Rpb24sXG4gICAgdHlwZSBDb21tYW5kLFxuICAgIHR5cGUgQ29tcGxldGlvbkl0ZW0sXG4gICAgdHlwZSBDb21wbGV0aW9uTGlzdCxcbiAgICB0eXBlIERpYWdub3N0aWMsXG4gICAgdHlwZSBIb3ZlcixcbiAgICB0eXBlIExvY2F0aW9uLFxuICAgIHR5cGUgUGFyYW1ldGVySW5mb3JtYXRpb24sXG4gICAgdHlwZSBTaWduYXR1cmVIZWxwLFxuICAgIHR5cGUgU2lnbmF0dXJlSW5mb3JtYXRpb24sXG4gICAgdHlwZSBUZXh0RWRpdCxcbiAgICB0eXBlIFdvcmtzcGFjZUVkaXQsXG59IGZyb20gJ3ZzY29kZS1sYW5ndWFnZXNlcnZlci10eXBlcyc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNpbmdsZXRvbiBzdGF0ZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogU2hhcmVkIGNvbm5lY3Rpb24gXHUyMDE0IG9uZSBwZXIgYnJvd3NlciBwYWdlLCBjb3ZlcmluZyBhbGwgcHJvamVjdHMgaW4gdGhlIHdvcmtzcGFjZS4gKi9cbmxldCBfY29ubjogTWVzc2FnZUNvbm5lY3Rpb24gfCBudWxsID0gbnVsbDtcblxuLyoqXG4gKiBWaXJ0dWFsIHdvcmtzcGFjZSByb290IFVSSSwgZS5nLiB7QGNvZGUgZmlsZTovLy93b3Jrc3BhY2Uvd29ya3NwYWNlL30uXG4gKiBTZXQgb25jZSBvbiBmaXJzdCBjb25uZWN0KCk7IHVzZWQgdG8gc2NvcGUgTW9uYWNvIHByb3ZpZGVycyB0byB3b3Jrc3BhY2UgZmlsZXMuXG4gKi9cbmxldCBfd29ya3NwYWNlUm9vdCA9ICcnO1xuXG4vKiogVVJJcyBmb3Igd2hpY2ggdGV4dERvY3VtZW50L2RpZE9wZW4gaGFzIGFscmVhZHkgYmVlbiBzZW50LiAqL1xuY29uc3QgX29wZW5GaWxlczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cbi8qKiBQZW5kaW5nIGRlYm91bmNlZCBkaWRDaGFuZ2UgdGltZXJzIHBlciBmaWxlIFVSSSwgc28gYSBjaGFuZ2UgY2FuIGJlIGZsdXNoZWQgYmVmb3JlIGNvbXBsZXRpb24uICovXG5jb25zdCBfY2hhbmdlVGltZXJzOiBNYXA8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0Pj4gPSBuZXcgTWFwKCk7XG5cbi8qKlxuICogTGFzdCBkaWFnbm9zdGljcyBwdWJsaXNoZWQgcGVyIGZpbGUgVVJJLCBrZXB0IHZlcmJhdGltICh3aXRoIHRoZWlyIExTUCBjb2RlL2RhdGEpLiBDb2RlLWFjdGlvblxuICogcmVxdWVzdHMgbXVzdCBzZW5kIHRoZXNlIFx1MjAxNCBKRFQuTFMgbWF0Y2hlcyBxdWljay1maXhlcyBieSB0aGUgZGlhZ25vc3RpYydzIGNvZGUvZGF0YSwgd2hpY2ggTW9uYWNvJ3NcbiAqIElNYXJrZXJEYXRhIGNhbm5vdCByb3VuZC10cmlwLCBzbyByZWNvbnN0cnVjdGluZyBkaWFnbm9zdGljcyBmcm9tIG1hcmtlcnMgeWllbGRzIG5vIHF1aWNrLWZpeGVzLlxuICovXG5jb25zdCBfZGlhZ25vc3RpY3M6IE1hcDxzdHJpbmcsIERpYWdub3N0aWNbXT4gPSBuZXcgTWFwKCk7XG5cbmxldCBfcHJvdmlkZXJzUmVnaXN0ZXJlZCA9IGZhbHNlO1xuXG4vKiogU2VtYW50aWMtdG9rZW4gbGVnZW5kIHJlcG9ydGVkIGJ5IEpEVC5MUyBpbiB0aGUgaW5pdGlhbGl6ZSByZXN1bHQ7IG5lZWRlZCB0byBkZWNvZGUgdG9rZW4gZGF0YS4gKi9cbmxldCBfc2VtYW50aWNUb2tlbnNMZWdlbmQ6IHsgdG9rZW5UeXBlczogc3RyaW5nW107IHRva2VuTW9kaWZpZXJzOiBzdHJpbmdbXSB9IHwgbnVsbCA9IG51bGw7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFB1YmxpYyBBUElcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIENhbGxlZCBieSBlZGl0b3IuanMgd2hlbiBhIEphdmEgZmlsZSBpcyBvcGVuZWQuIFNhZmUgdG8gY2FsbCBtdWx0aXBsZSB0aW1lcy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb25uZWN0KHJlc291cmNlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFydHMgPSByZXNvdXJjZVBhdGgucmVwbGFjZSgvXlxcLy8sICcnKS5zcGxpdCgnLycpO1xuICAgIGNvbnN0IHdvcmtzcGFjZSA9IHBhcnRzWzBdO1xuICAgIGNvbnN0IHByb2plY3QgICA9IHBhcnRzWzFdO1xuICAgIGNvbnN0IGZpbGVVcmkgPSBgZmlsZTovLy93b3Jrc3BhY2UvJHt3b3Jrc3BhY2V9LyR7cHJvamVjdH0vJHtwYXJ0cy5zbGljZSgyKS5qb2luKCcvJyl9YDtcblxuICAgIGlmIChfY29ubikge1xuICAgICAgICAvLyBDb25uZWN0aW9uIGFscmVhZHkgZXN0YWJsaXNoZWQgXHUyMDE0IGp1c3Qgb3BlbiB0aGUgbmV3IGZpbGUuXG4gICAgICAgIG9wZW5GaWxlKGZpbGVVcmkpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgX3dvcmtzcGFjZVJvb3QgPSBgZmlsZTovLy93b3Jrc3BhY2UvJHt3b3Jrc3BhY2V9L2A7XG5cbiAgICBjb25zdCBwcm90byA9IGxvY2F0aW9uLnByb3RvY29sID09PSAnaHR0cHM6JyA/ICd3c3MnIDogJ3dzJztcbiAgICBjb25zdCB3c1VybCA9IGAke3Byb3RvfTovLyR7bG9jYXRpb24uaG9zdH0vd2Vic29ja2V0cy9pZGUvamF2YS1sc3BgXG4gICAgICAgICAgICAgICAgKyBgP3dvcmtzcGFjZT0ke2VuY29kZVVSSUNvbXBvbmVudCh3b3Jrc3BhY2UpfWA7XG5cbiAgICBjb25zdCB3cyA9IG5ldyBXZWJTb2NrZXQod3NVcmwpO1xuICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgd3Mub25vcGVuICA9ICgpID0+IHJlc29sdmUoKTtcbiAgICAgICAgd3Mub25lcnJvciA9ICgpID0+IHJlamVjdChuZXcgRXJyb3IoYFtqYXZhLWxzcF0gV2ViU29ja2V0IGNvbm5lY3QgZmFpbGVkOiAke3dzVXJsfWApKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHNvY2tldCA9IHRvU29ja2V0KHdzKTtcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgV2ViU29ja2V0TWVzc2FnZVJlYWRlcihzb2NrZXQpO1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBXZWJTb2NrZXRNZXNzYWdlV3JpdGVyKHNvY2tldCk7XG4gICAgX2Nvbm4gPSBjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbihyZWFkZXIsIHdyaXRlcik7XG5cbiAgICAvLyBEaWFnbm9zdGljcyBub3RpZmljYXRpb24gXHUyMTkyIE1vbmFjbyBtYXJrZXJzIChhcHBsaWVzIHRvIGFueSB3b3Jrc3BhY2UgZmlsZSlcbiAgICBfY29ubi5vbk5vdGlmaWNhdGlvbigndGV4dERvY3VtZW50L3B1Ymxpc2hEaWFnbm9zdGljcycsIChwYXJhbXM6IHsgdXJpOiBzdHJpbmc7IGRpYWdub3N0aWNzOiBEaWFnbm9zdGljW10gfSkgPT4ge1xuICAgICAgICBfZGlhZ25vc3RpY3Muc2V0KHBhcmFtcy51cmksIHBhcmFtcy5kaWFnbm9zdGljcyA/PyBbXSk7XG4gICAgICAgIGNvbnN0IG1vZGVsID0gbW9uYWNvLmVkaXRvci5nZXRNb2RlbHMoKS5maW5kKG0gPT4gbS51cmkudG9TdHJpbmcoKSA9PT0gcGFyYW1zLnVyaSk7XG4gICAgICAgIGlmICghbW9kZWwpIHJldHVybjtcbiAgICAgICAgbW9uYWNvLmVkaXRvci5zZXRNb2RlbE1hcmtlcnMobW9kZWwsICdqYXZhLWxzcCcsIHBhcmFtcy5kaWFnbm9zdGljcy5tYXAoZCA9PiAoe1xuICAgICAgICAgICAgc2V2ZXJpdHk6ICAgICAgICBsc3BTZXZlcml0eShkLnNldmVyaXR5KSxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICAgICAgICAgZC5tZXNzYWdlLFxuICAgICAgICAgICAgc291cmNlOiAgICAgICAgICBkLnNvdXJjZSA/PyAnamF2YScsXG4gICAgICAgICAgICBzdGFydExpbmVOdW1iZXI6IGQucmFuZ2Uuc3RhcnQubGluZSArIDEsXG4gICAgICAgICAgICBzdGFydENvbHVtbjogICAgIGQucmFuZ2Uuc3RhcnQuY2hhcmFjdGVyICsgMSxcbiAgICAgICAgICAgIGVuZExpbmVOdW1iZXI6ICAgZC5yYW5nZS5lbmQubGluZSArIDEsXG4gICAgICAgICAgICBlbmRDb2x1bW46ICAgICAgIGQucmFuZ2UuZW5kLmNoYXJhY3RlciArIDEsXG4gICAgICAgIH0pKSk7XG4gICAgfSk7XG5cbiAgICAvLyBTZXJ2ZXIgLT4gY2xpZW50IHJlcXVlc3RzIHRoYXQgZHJpdmUgcmVmYWN0b3IgLyBnZW5lcmF0ZSByZXN1bHRzIGFuZCBkeW5hbWljIHJlZ2lzdHJhdGlvbi5cbiAgICBfY29ubi5vblJlcXVlc3QoJ3dvcmtzcGFjZS9hcHBseUVkaXQnLCAocGFyYW1zOiB7IGVkaXQ6IFdvcmtzcGFjZUVkaXQgfSkgPT4ge1xuICAgICAgICBhcHBseVdvcmtzcGFjZUVkaXQocGFyYW1zLmVkaXQpO1xuICAgICAgICByZXR1cm4geyBhcHBsaWVkOiB0cnVlIH07XG4gICAgfSk7XG4gICAgX2Nvbm4ub25SZXF1ZXN0KCd3b3Jrc3BhY2UvY29uZmlndXJhdGlvbicsIChwYXJhbXM6IHsgaXRlbXM6IEFycmF5PHsgc2VjdGlvbj86IHN0cmluZyB9PiB9KSA9PlxuICAgICAgICAocGFyYW1zLml0ZW1zID8/IFtdKS5tYXAoKCkgPT4gamR0bHNTZXR0aW5ncygpLmphdmEpKTtcbiAgICBfY29ubi5vblJlcXVlc3QoJ2NsaWVudC9yZWdpc3RlckNhcGFiaWxpdHknLCAoKSA9PiBudWxsKTtcbiAgICBfY29ubi5vblJlcXVlc3QoJ2NsaWVudC91bnJlZ2lzdGVyQ2FwYWJpbGl0eScsICgpID0+IG51bGwpO1xuICAgIF9jb25uLm9uUmVxdWVzdCgnd2luZG93L3Nob3dNZXNzYWdlUmVxdWVzdCcsICgpID0+IG51bGwpO1xuICAgIF9jb25uLm9uUmVxdWVzdCgnd2luZG93L3dvcmtEb25lUHJvZ3Jlc3MvY3JlYXRlJywgKCkgPT4gbnVsbCk7XG4gICAgX2Nvbm4ub25Ob3RpZmljYXRpb24oJ3dpbmRvdy9sb2dNZXNzYWdlJywgKHA6IHsgbWVzc2FnZTogc3RyaW5nIH0pID0+IGNvbnNvbGUuZGVidWcoJ1tqYXZhLWxzcF0nLCBwPy5tZXNzYWdlKSk7XG4gICAgX2Nvbm4ub25Ob3RpZmljYXRpb24oJ3dpbmRvdy9zaG93TWVzc2FnZScsIChwOiB7IG1lc3NhZ2U6IHN0cmluZyB9KSA9PiBjb25zb2xlLmluZm8oJ1tqYXZhLWxzcF0nLCBwPy5tZXNzYWdlKSk7XG4gICAgLy8gSkRULkxTIGxhbmd1YWdlLXN0YXR1cyAvIHByb2dyZXNzIG5vdGlmaWNhdGlvbnMgXHUyMDE0IGFja25vd2xlZGdlZCBzaWxlbnRseS5cbiAgICBfY29ubi5vbk5vdGlmaWNhdGlvbignbGFuZ3VhZ2Uvc3RhdHVzJywgKCkgPT4geyAvKiBpbmRleGluZy9yZWFkeSBzdGF0dXMsIGlnbm9yZWQgKi8gfSk7XG4gICAgX2Nvbm4ub25Ob3RpZmljYXRpb24oJ2xhbmd1YWdlL3Byb2dyZXNzUmVwb3J0JywgKCkgPT4geyAvKiBidWlsZCBwcm9ncmVzcywgaWdub3JlZCAqLyB9KTtcblxuICAgIF9jb25uLmxpc3RlbigpO1xuXG4gICAgY29uc3Qgcm9vdFVyaSA9IF93b3Jrc3BhY2VSb290O1xuICAgIGNvbnN0IGluaXRSZXN1bHQ6IGFueSA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCdpbml0aWFsaXplJywge1xuICAgICAgICBwcm9jZXNzSWQ6IG51bGwsXG4gICAgICAgIHJvb3RVcmksXG4gICAgICAgIGluaXRpYWxpemF0aW9uT3B0aW9uczoge1xuICAgICAgICAgICAgc2V0dGluZ3M6IGpkdGxzU2V0dGluZ3MoKSxcbiAgICAgICAgICAgIGV4dGVuZGVkQ2xpZW50Q2FwYWJpbGl0aWVzOiB7XG4gICAgICAgICAgICAgICAgcHJvZ3Jlc3NSZXBvcnRQcm92aWRlcjogICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICAgICBjbGFzc0ZpbGVDb250ZW50c1N1cHBvcnQ6ICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgcmVzb2x2ZUFkZGl0aW9uYWxUZXh0RWRpdHNTdXBwb3J0OiB0cnVlLFxuICAgICAgICAgICAgICAgIC8vIERvIE5PVCBhZHZlcnRpc2UgdGhlICpQcm9tcHRTdXBwb3J0IGZsYWdzOiB0aG9zZSBtYWtlIEpEVC5MUyByZXR1cm4gc291cmNlIGFjdGlvbnNcbiAgICAgICAgICAgICAgICAvLyAoZ2VuZXJhdGUgdG9TdHJpbmcvY29uc3RydWN0b3JzL2FjY2Vzc29ycywgb3ZlcnJpZGUvaW1wbGVtZW50LCBvcmdhbml6ZSBpbXBvcnRzKSBhc1xuICAgICAgICAgICAgICAgIC8vIGNsaWVudC1zaWRlIFwiKlByb21wdFwiIGNvbW1hbmRzIHRoZSB2c2NvZGUtamF2YSBleHRlbnNpb24gaW1wbGVtZW50cyBidXQgd2UgZG9uJ3QuXG4gICAgICAgICAgICAgICAgLy8gV2l0aCB0aGVtIG9mZiwgSkRULkxTIHJldHVybnMgdGhlIHNhbWUgYWN0aW9ucyBhcyByZXNvbHZhYmxlIFdvcmtzcGFjZUVkaXRzIG9wZXJhdGluZ1xuICAgICAgICAgICAgICAgIC8vIG9uIGFsbCBtZW1iZXJzLCB3aGljaCBhcHBseUNvZGVBY3Rpb24gcmVzb2x2ZXMgYW5kIGFwcGxpZXMgZGlyZWN0bHkuXG4gICAgICAgICAgICAgICAgaW5mZXJTZWxlY3Rpb25TdXBwb3J0OiAgICAgICAgICAgICBbJ2V4dHJhY3RNZXRob2QnLCAnZXh0cmFjdFZhcmlhYmxlJywgJ2V4dHJhY3RGaWVsZCddLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgd29ya3NwYWNlRm9sZGVyczogW3sgdXJpOiByb290VXJpLCBuYW1lOiB3b3Jrc3BhY2UgfV0sXG4gICAgICAgIGNhcGFiaWxpdGllczoge1xuICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7XG4gICAgICAgICAgICAgICAgc3luY2hyb25pemF0aW9uOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUsIHdpbGxTYXZlOiBmYWxzZSwgZGlkU2F2ZTogdHJ1ZSwgd2lsbFNhdmVXYWl0VW50aWw6IGZhbHNlIH0sXG4gICAgICAgICAgICAgICAgY29tcGxldGlvbjoge1xuICAgICAgICAgICAgICAgICAgICBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uSXRlbToge1xuICAgICAgICAgICAgICAgICAgICAgICAgc25pcHBldFN1cHBvcnQ6ICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRhdGlvbkZvcm1hdDogICBbJ21hcmtkb3duJywgJ3BsYWludGV4dCddLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRlZFN1cHBvcnQ6ICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWl0Q2hhcmFjdGVyc1N1cHBvcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlU3VwcG9ydDogICAgICAgIHsgcHJvcGVydGllczogWydkb2N1bWVudGF0aW9uJywgJ2RldGFpbCcsICdhZGRpdGlvbmFsVGV4dEVkaXRzJ10gfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dFN1cHBvcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBob3ZlcjogICAgICAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLCBjb250ZW50Rm9ybWF0OiBbJ21hcmtkb3duJywgJ3BsYWludGV4dCddIH0sXG4gICAgICAgICAgICAgICAgc2lnbmF0dXJlSGVscDogIHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSwgc2lnbmF0dXJlSW5mb3JtYXRpb246IHsgZG9jdW1lbnRhdGlvbkZvcm1hdDogWydtYXJrZG93bicsICdwbGFpbnRleHQnXSwgcGFyYW1ldGVySW5mb3JtYXRpb246IHsgbGFiZWxPZmZzZXRTdXBwb3J0OiB0cnVlIH0gfSB9LFxuICAgICAgICAgICAgICAgIGRlZmluaXRpb246ICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VzOiAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb246IHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIHR5cGVEZWZpbml0aW9uOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICBkb2N1bWVudEhpZ2hsaWdodDogeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgZG9jdW1lbnRTeW1ib2w6IHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSwgaGllcmFyY2hpY2FsRG9jdW1lbnRTeW1ib2xTdXBwb3J0OiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgZm9sZGluZ1JhbmdlOiAgIHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSwgbGluZUZvbGRpbmdPbmx5OiBmYWxzZSB9LFxuICAgICAgICAgICAgICAgIHNlbGVjdGlvblJhbmdlOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICBjb2RlTGVuczogICAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgaW5sYXlIaW50OiAgICAgIHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSwgcmVzb2x2ZVN1cHBvcnQ6IHsgcHJvcGVydGllczogWydsYWJlbCddIH0gfSxcbiAgICAgICAgICAgICAgICBzZW1hbnRpY1Rva2Vuczoge1xuICAgICAgICAgICAgICAgICAgICBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0czogICAgICAgIHsgcmFuZ2U6IGZhbHNlLCBmdWxsOiB7IGRlbHRhOiBmYWxzZSB9IH0sXG4gICAgICAgICAgICAgICAgICAgIHRva2VuVHlwZXM6ICAgICAgWyduYW1lc3BhY2UnLCAndHlwZScsICdjbGFzcycsICdlbnVtJywgJ2ludGVyZmFjZScsICdzdHJ1Y3QnLCAndHlwZVBhcmFtZXRlcicsXG4gICAgICAgICAgICAgICAgICAgICAgICAncGFyYW1ldGVyJywgJ3ZhcmlhYmxlJywgJ3Byb3BlcnR5JywgJ2VudW1NZW1iZXInLCAnZXZlbnQnLCAnZnVuY3Rpb24nLCAnbWV0aG9kJywgJ21hY3JvJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdrZXl3b3JkJywgJ21vZGlmaWVyJywgJ2NvbW1lbnQnLCAnc3RyaW5nJywgJ251bWJlcicsICdyZWdleHAnLCAnb3BlcmF0b3InLCAnZGVjb3JhdG9yJ10sXG4gICAgICAgICAgICAgICAgICAgIHRva2VuTW9kaWZpZXJzOiAgWydkZWNsYXJhdGlvbicsICdkZWZpbml0aW9uJywgJ3JlYWRvbmx5JywgJ3N0YXRpYycsICdkZXByZWNhdGVkJywgJ2Fic3RyYWN0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdhc3luYycsICdtb2RpZmljYXRpb24nLCAnZG9jdW1lbnRhdGlvbicsICdkZWZhdWx0TGlicmFyeSddLFxuICAgICAgICAgICAgICAgICAgICBmb3JtYXRzOiAgICAgICAgIFsncmVsYXRpdmUnXSxcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxhcHBpbmdUb2tlblN1cHBvcnQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBtdWx0aWxpbmVUb2tlblN1cHBvcnQ6ICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBmb3JtYXR0aW5nOiAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgcmFuZ2VGb3JtYXR0aW5nOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICByZW5hbWU6ICAgICAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLCBwcmVwYXJlU3VwcG9ydDogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIGNvZGVBY3Rpb246IHtcbiAgICAgICAgICAgICAgICAgICAgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgY29kZUFjdGlvbkxpdGVyYWxTdXBwb3J0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlQWN0aW9uS2luZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU2V0OiBbJ3F1aWNrZml4JywgJ3JlZmFjdG9yJywgJ3JlZmFjdG9yLmV4dHJhY3QnLCAncmVmYWN0b3IuaW5saW5lJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlZmFjdG9yLnJld3JpdGUnLCAnc291cmNlJywgJ3NvdXJjZS5vcmdhbml6ZUltcG9ydHMnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGlzUHJlZmVycmVkU3VwcG9ydDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgZGF0YVN1cHBvcnQ6ICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlU3VwcG9ydDogICAgIHsgcHJvcGVydGllczogWydlZGl0J10gfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHB1Ymxpc2hEaWFnbm9zdGljczogeyByZWxhdGVkSW5mb3JtYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3b3Jrc3BhY2U6IHtcbiAgICAgICAgICAgICAgICBhcHBseUVkaXQ6ICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb246ICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgZXhlY3V0ZUNvbW1hbmQ6ICAgICAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgZGlkQ2hhbmdlQ29uZmlndXJhdGlvbjogeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgd29ya3NwYWNlRWRpdDogICAgICAgICAgeyBkb2N1bWVudENoYW5nZXM6IHRydWUsIHJlc291cmNlT3BlcmF0aW9uczogWydjcmVhdGUnLCAncmVuYW1lJywgJ2RlbGV0ZSddIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgX3NlbWFudGljVG9rZW5zTGVnZW5kID0gaW5pdFJlc3VsdD8uY2FwYWJpbGl0aWVzPy5zZW1hbnRpY1Rva2Vuc1Byb3ZpZGVyPy5sZWdlbmQgPz8gbnVsbDtcblxuICAgIF9jb25uLnNlbmROb3RpZmljYXRpb24oJ2luaXRpYWxpemVkJywge30pO1xuICAgIF9jb25uLnNlbmROb3RpZmljYXRpb24oJ3dvcmtzcGFjZS9kaWRDaGFuZ2VDb25maWd1cmF0aW9uJywgeyBzZXR0aW5nczogamR0bHNTZXR0aW5ncygpIH0pO1xuXG4gICAgb3BlbkZpbGUoZmlsZVVyaSk7XG5cbiAgICBpZiAoIV9wcm92aWRlcnNSZWdpc3RlcmVkKSB7XG4gICAgICAgIF9wcm92aWRlcnNSZWdpc3RlcmVkID0gdHJ1ZTtcbiAgICAgICAgcmVnaXN0ZXJQcm92aWRlcnMoKTtcbiAgICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEZpbGUgbGlmZWN5Y2xlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogU2VuZHMgdGV4dERvY3VtZW50L2RpZE9wZW4gZm9yIHRoZSBnaXZlbiBVUkkgKGlmIG5vdCBhbHJlYWR5IHNlbnQpIGFuZCByZWdpc3RlcnMgYSBkZWJvdW5jZWRcbiAqIHRleHREb2N1bWVudC9kaWRDaGFuZ2UgbGlzdGVuZXIgb24gdGhlIGNvcnJlc3BvbmRpbmcgTW9uYWNvIG1vZGVsLlxuICovXG5mdW5jdGlvbiBvcGVuRmlsZShmaWxlVXJpOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoX29wZW5GaWxlcy5oYXMoZmlsZVVyaSkgfHwgIV9jb25uKSByZXR1cm47XG4gICAgX29wZW5GaWxlcy5hZGQoZmlsZVVyaSk7XG5cbiAgICBjb25zdCBtb2RlbCA9IG1vbmFjby5lZGl0b3IuZ2V0TW9kZWxzKCkuZmluZChtID0+IG0udXJpLnRvU3RyaW5nKCkgPT09IGZpbGVVcmkpO1xuICAgIF9jb25uLnNlbmROb3RpZmljYXRpb24oJ3RleHREb2N1bWVudC9kaWRPcGVuJywge1xuICAgICAgICB0ZXh0RG9jdW1lbnQ6IHtcbiAgICAgICAgICAgIHVyaTogICAgICAgIGZpbGVVcmksXG4gICAgICAgICAgICBsYW5ndWFnZUlkOiAnamF2YScsXG4gICAgICAgICAgICB2ZXJzaW9uOiAgICAxLFxuICAgICAgICAgICAgdGV4dDogICAgICAgbW9kZWw/LmdldFZhbHVlKCkgPz8gJycsXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBpZiAobW9kZWwpIHtcbiAgICAgICAgbW9kZWwub25EaWRDaGFuZ2VDb250ZW50KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gX2NoYW5nZVRpbWVycy5nZXQoZmlsZVVyaSk7XG4gICAgICAgICAgICBpZiAoZXhpc3RpbmcpIGNsZWFyVGltZW91dChleGlzdGluZyk7XG4gICAgICAgICAgICBfY2hhbmdlVGltZXJzLnNldChmaWxlVXJpLCBzZXRUaW1lb3V0KCgpID0+IHNlbmREaWRDaGFuZ2UoZmlsZVVyaSksIDQwMCkpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbi8qKiBTZW5kcyB0aGUgY3VycmVudCBtb2RlbCBjb250ZW50IGFzIGEgZGlkQ2hhbmdlIGFuZCBjbGVhcnMgYW55IHBlbmRpbmcgZGVib3VuY2UgZm9yIHRoZSBmaWxlLiAqL1xuZnVuY3Rpb24gc2VuZERpZENoYW5nZShmaWxlVXJpOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBfY2hhbmdlVGltZXJzLmRlbGV0ZShmaWxlVXJpKTtcbiAgICBjb25zdCBtb2RlbCA9IG1vbmFjby5lZGl0b3IuZ2V0TW9kZWwobW9uYWNvLlVyaS5wYXJzZShmaWxlVXJpKSk7XG4gICAgaWYgKF9jb25uICYmIG1vZGVsKSB7XG4gICAgICAgIF9jb25uLnNlbmROb3RpZmljYXRpb24oJ3RleHREb2N1bWVudC9kaWRDaGFuZ2UnLCB7XG4gICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6ICAgeyB1cmk6IGZpbGVVcmksIHZlcnNpb246IG1vZGVsLmdldFZlcnNpb25JZCgpIH0sXG4gICAgICAgICAgICBjb250ZW50Q2hhbmdlczogW3sgdGV4dDogbW9kZWwuZ2V0VmFsdWUoKSB9XSxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEZsdXNoZXMgYSBwZW5kaW5nIGRlYm91bmNlZCBjaGFuZ2UgaW1tZWRpYXRlbHkuIENhbGxlZCBiZWZvcmUgYSBjb21wbGV0aW9uIHJlcXVlc3Qgc28gSkRULkxTIHNlZXMgdGhlXG4gKiBqdXN0LXR5cGVkIHRleHQgb24gdGhlIGZpcnN0IEN0cmwrU3BhY2UsIGluc3RlYWQgb2YgY29tcGxldGluZyBhZ2FpbnN0IHN0YWxlIGNvbnRlbnQgKHRoZSBkZWJvdW5jZVxuICogb3RoZXJ3aXNlIGRlbGF5cyB0aGUgY2hhbmdlIGJ5IHVwIHRvIDQwMG1zIFx1MjAxNCB0aGUgY2F1c2Ugb2YgXCJmaXJzdCBDdHJsK1NwYWNlIHNob3dzIG5vdGhpbmdcIikuXG4gKi9cbmZ1bmN0aW9uIGZsdXNoUGVuZGluZ0NoYW5nZShmaWxlVXJpOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoX2NoYW5nZVRpbWVycy5oYXMoZmlsZVVyaSkpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KF9jaGFuZ2VUaW1lcnMuZ2V0KGZpbGVVcmkpISk7XG4gICAgICAgIHNlbmREaWRDaGFuZ2UoZmlsZVVyaSk7XG4gICAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBXb3Jrc3BhY2UgZmlsZSBwcmVkaWNhdGVcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBSZXR1cm5zIHtAY29kZSB0cnVlfSB3aGVuIHRoZSBnaXZlbiBtb2RlbCBVUkkgYmVsb25ncyB0byB0aGUgY3VycmVudGx5IGNvbm5lY3RlZCB3b3Jrc3BhY2UuIFVzZWRcbiAqIGJ5IE1vbmFjbyBwcm92aWRlcnMgdG8gc2tpcCBub24tSmF2YS13b3Jrc3BhY2UgbW9kZWxzIHdpdGhvdXQgYW4gZXhhY3QtVVJJIGNvbXBhcmlzb24uXG4gKi9cbmZ1bmN0aW9uIGlzV29ya3NwYWNlRmlsZSh1cmk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBfd29ya3NwYWNlUm9vdCAhPT0gJycgJiYgdXJpLnN0YXJ0c1dpdGgoX3dvcmtzcGFjZVJvb3QpO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBNb25hY28gcHJvdmlkZXIgcmVnaXN0cmF0aW9uXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIHJlZ2lzdGVyUHJvdmlkZXJzKCk6IHZvaWQge1xuXG4gICAgbW9uYWNvLmVkaXRvci5yZWdpc3RlckNvbW1hbmQoQVBQTFlfQUNUSU9OX0NPTU1BTkQsIChfYWNjZXNzb3I6IHVua25vd24sIGFjdGlvbjogQ29kZUFjdGlvbiB8IENvbW1hbmQpID0+IHtcbiAgICAgICAgYXBwbHlDb2RlQWN0aW9uKGFjdGlvbik7XG4gICAgfSk7XG4gICAgbW9uYWNvLmVkaXRvci5yZWdpc3RlckNvbW1hbmQoTk9PUF9DT01NQU5ELCAoKSA9PiB7IC8qIGRpc3BsYXktb25seSBDb2RlTGVucyAqLyB9KTtcblxuICAgIC8vIENyb3NzLWZpbGUgbmF2aWdhdGlvbjogdGhpcyBzaW5nbGUtZmlsZSBlZGl0b3IgaGFzIG5vIG1vZGVsIGZvciBvdGhlciB3b3Jrc3BhY2UgZmlsZXMsIHNvIEdvIHRvXG4gICAgLy8gRGVmaW5pdGlvbiAvIEZpbmQgUmVmZXJlbmNlcyB0byBhbm90aGVyIGZpbGUgd291bGQgc2lsZW50bHkgZG8gbm90aGluZy4gSGFuZCB0aG9zZSBvZmYgdG8gdGhlIElERVxuICAgIC8vIHRvIG9wZW4gdGhlIHRhcmdldCBmaWxlIChhbmQgcmV2ZWFsIHRoZSBsaW5lKS4gU2FtZS1maWxlIHRhcmdldHMgZmFsbCB0aHJvdWdoIHRvIE1vbmFjby5cbiAgICBtb25hY28uZWRpdG9yLnJlZ2lzdGVyRWRpdG9yT3BlbmVyKHtcbiAgICAgICAgb3BlbkNvZGVFZGl0b3I6IChzb3VyY2UsIHJlc291cmNlLCBzZWxlY3Rpb25PclBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB1cmkgPSByZXNvdXJjZS50b1N0cmluZygpO1xuICAgICAgICAgICAgaWYgKCFpc1dvcmtzcGFjZUZpbGUodXJpKSB8fCAhdXJpLnN0YXJ0c1dpdGgoVklSVFVBTF9GSUxFX1BSRUZJWCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRNb2RlbCA9IHNvdXJjZS5nZXRNb2RlbCgpO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRNb2RlbCAmJiBjdXJyZW50TW9kZWwudXJpLnRvU3RyaW5nKCkgPT09IHVyaSkgcmV0dXJuIGZhbHNlOyAvLyBzYW1lIGZpbGUgXHUyMDE0IGxldCBNb25hY28ganVtcFxuICAgICAgICAgICAgY29uc3Qgb3BlbmVyID0gKGdsb2JhbFRoaXMgYXMgYW55KS5qYXZhTHNwT3BlbkZpbGU7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wZW5lciAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgcG9zID0gc2VsZWN0aW9uT3JQb3NpdGlvbiBhcyB7IHN0YXJ0TGluZU51bWJlcj86IG51bWJlcjsgbGluZU51bWJlcj86IG51bWJlcjsgc3RhcnRDb2x1bW4/OiBudW1iZXI7IGNvbHVtbj86IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgbGluZSA9IHBvcyA/IChwb3Muc3RhcnRMaW5lTnVtYmVyID8/IHBvcy5saW5lTnVtYmVyKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHBvcyA/IChwb3Muc3RhcnRDb2x1bW4gPz8gcG9zLmNvbHVtbikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBvcGVuZXIodXJpLnN1YnN0cmluZyhWSVJUVUFMX0ZJTEVfUFJFRklYLmxlbmd0aCksIGxpbmUsIGNvbHVtbik7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJDb21wbGV0aW9uSXRlbVByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICB0cmlnZ2VyQ2hhcmFjdGVyczogWycuJywgJ0AnLCAnPCddLFxuICAgICAgICBwcm92aWRlQ29tcGxldGlvbkl0ZW1zOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uLCBjb250ZXh0KSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVVcmkgPSBtb2RlbC51cmkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBKRFQuTFMgaGFzIHRoZSBqdXN0LXR5cGVkIHRleHQgYmVmb3JlIGNvbXBsZXRpbmcgKHNlZSBmbHVzaFBlbmRpbmdDaGFuZ2UpLlxuICAgICAgICAgICAgZmx1c2hQZW5kaW5nQ2hhbmdlKGZpbGVVcmkpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBDb21wbGV0aW9uTGlzdCB8IENvbXBsZXRpb25JdGVtW10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9jb21wbGV0aW9uJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IGZpbGVVcmkgfSxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogICAgIHsgbGluZTogcG9zaXRpb24ubGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogcG9zaXRpb24uY29sdW1uIC0gMSB9LFxuICAgICAgICAgICAgICAgIC8vIE1vbmFjbyB0cmlnZ2VyIGtpbmRzIGFyZSAwLWJhc2VkIChJbnZva2UvVHJpZ2dlckNoYXJhY3Rlci9Gb3JJbmNvbXBsZXRlKTsgTFNQIGlzIDEtYmFzZWQuXG4gICAgICAgICAgICAgICAgY29udGV4dDogICAgICB7IHRyaWdnZXJLaW5kOiAoY29udGV4dC50cmlnZ2VyS2luZCA/PyAwKSArIDEsIHRyaWdnZXJDaGFyYWN0ZXI6IGNvbnRleHQudHJpZ2dlckNoYXJhY3RlciB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBpdGVtcyA9IEFycmF5LmlzQXJyYXkocmVzdWx0KSA/IHJlc3VsdCA6IChyZXN1bHQ/Lml0ZW1zID8/IFtdKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3VnZ2VzdGlvbnM6IGl0ZW1zLm1hcChpdGVtID0+IGxzcENvbXBsZXRpb25Ub01vbmFjbyhpdGVtLCBtb2RlbCwgcG9zaXRpb24pKSxcbiAgICAgICAgICAgICAgICAvLyBKRFQuTFMgcmV0dXJucyBhIHRydW5jYXRlZCBsaXN0IG9uIHRoZSBmaXJzdCBrZXlzdHJva2VzOyBwcm9wYWdhdGluZyBcImluY29tcGxldGVcIiBtYWtlc1xuICAgICAgICAgICAgICAgIC8vIE1vbmFjbyByZS1xdWVyeSBhcyB0aGUgdXNlciB0eXBlcyBpbnN0ZWFkIG9mIGNhY2hpbmcgdGhlIGZpcnN0IChvZnRlbiBlbXB0eSkgcmVzdWx0LlxuICAgICAgICAgICAgICAgIGluY29tcGxldGU6ICBBcnJheS5pc0FycmF5KHJlc3VsdCkgPyBmYWxzZSA6ICEhcmVzdWx0Py5pc0luY29tcGxldGUsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvLyBSZXNvbHZlIGRvY3VtZW50YXRpb24gYW5kLCBjcnVjaWFsbHksIHRoZSBhdXRvLWltcG9ydCBhZGRpdGlvbmFsVGV4dEVkaXRzIHdoaWNoIEpEVC5MUyBvbmx5XG4gICAgICAgIC8vIGF0dGFjaGVzIG9uIHJlc29sdmUgXHUyMDE0IHNlbGVjdGluZyBhIHR5cGUgdGhlbiBpbnNlcnRzIGl0cyBpbXBvcnQgc3RhdGVtZW50LlxuICAgICAgICByZXNvbHZlQ29tcGxldGlvbkl0ZW06IGFzeW5jIChpdGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsc3AgPSAoaXRlbSBhcyBNb25hY29Db21wbGV0aW9uSXRlbSkuX2xzcDtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWxzcCkgcmV0dXJuIGl0ZW07XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkOiBDb21wbGV0aW9uSXRlbSA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCdjb21wbGV0aW9uSXRlbS9yZXNvbHZlJywgbHNwKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQuZG9jdW1lbnRhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBpdGVtLmRvY3VtZW50YXRpb24gPSB7IHZhbHVlOiBtYXJrdXBUb1N0cmluZyhyZXNvbHZlZC5kb2N1bWVudGF0aW9uKSwgaXNUcnVzdGVkOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQuZGV0YWlsKSBpdGVtLmRldGFpbCA9IHJlc29sdmVkLmRldGFpbDtcbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQuYWRkaXRpb25hbFRleHRFZGl0cz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uYWRkaXRpb25hbFRleHRFZGl0cyA9IHJlc29sdmVkLmFkZGl0aW9uYWxUZXh0RWRpdHMubWFwKHRleHRFZGl0VG9Nb25hY28pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKCdbamF2YS1sc3BdIGNvbXBsZXRpb24gcmVzb2x2ZSBmYWlsZWQ6JywgKGUgYXMgRXJyb3IpPy5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckhvdmVyUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVIb3ZlcjogYXN5bmMgKG1vZGVsLCBwb3NpdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBmaWxlVXJpID0gbW9kZWwudXJpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IEhvdmVyIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvaG92ZXInLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogZmlsZVVyaSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0Py5jb250ZW50cykgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50cyA9IEFycmF5LmlzQXJyYXkocmVzdWx0LmNvbnRlbnRzKSA/IHJlc3VsdC5jb250ZW50cyA6IFtyZXN1bHQuY29udGVudHNdO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjb250ZW50czogY29udGVudHMubWFwKGMgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHR5cGVvZiBjID09PSAnc3RyaW5nJyA/IGMgOiAoYyBhcyBNYXJrdXBDb250ZW50KS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgaXNUcnVzdGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgcmFuZ2U6IHJlc3VsdC5yYW5nZSA/IGxzcFJhbmdlVG9Nb25hY28ocmVzdWx0LnJhbmdlKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyU2lnbmF0dXJlSGVscFByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBzaWduYXR1cmVIZWxwVHJpZ2dlckNoYXJhY3RlcnM6IFsnKCcsICcsJ10sXG4gICAgICAgIHByb3ZpZGVTaWduYXR1cmVIZWxwOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVVcmkgPSBtb2RlbC51cmkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogU2lnbmF0dXJlSGVscCB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L3NpZ25hdHVyZUhlbHAnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogZmlsZVVyaSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlczogcmVzdWx0LnNpZ25hdHVyZXMubWFwKChzaWc6IFNpZ25hdHVyZUluZm9ybWF0aW9uKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICAgICAgICAgc2lnLmxhYmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRhdGlvbjogc2lnLmRvY3VtZW50YXRpb24gPyBtYXJrdXBUb1N0cmluZyhzaWcuZG9jdW1lbnRhdGlvbikgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiAgICAoc2lnLnBhcmFtZXRlcnMgPz8gW10pLm1hcCgocDogUGFyYW1ldGVySW5mb3JtYXRpb24pID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICAgICAgICAgcC5sYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudGF0aW9uOiBwLmRvY3VtZW50YXRpb24gPyBtYXJrdXBUb1N0cmluZyhwLmRvY3VtZW50YXRpb24pIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZVNpZ25hdHVyZTogcmVzdWx0LmFjdGl2ZVNpZ25hdHVyZSA/PyAwLFxuICAgICAgICAgICAgICAgICAgICBhY3RpdmVQYXJhbWV0ZXI6IHJlc3VsdC5hY3RpdmVQYXJhbWV0ZXIgPz8gMCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGRpc3Bvc2U6ICgpID0+IHt9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJEZWZpbml0aW9uUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVEZWZpbml0aW9uOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVVcmkgPSBtb2RlbC51cmkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogTG9jYXRpb24gfCBMb2NhdGlvbltdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvZGVmaW5pdGlvbicsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBmaWxlVXJpIH0sXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgbG9jYXRpb25zID0gKEFycmF5LmlzQXJyYXkocmVzdWx0KSA/IHJlc3VsdCA6IFtyZXN1bHRdKS5tYXAobG9jID0+ICh7XG4gICAgICAgICAgICAgICAgdXJpOiAgIG1vbmFjby5VcmkucGFyc2UobG9jLnVyaSksXG4gICAgICAgICAgICAgICAgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28obG9jLnJhbmdlKSxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIGF3YWl0IGVuc3VyZU1vZGVsc0ZvckxvY2F0aW9ucyhsb2NhdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGxvY2F0aW9ucztcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJSZWZlcmVuY2VQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZVJlZmVyZW5jZXM6IGFzeW5jIChtb2RlbCwgcG9zaXRpb24sIGNvbnRleHQpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBMb2NhdGlvbltdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvcmVmZXJlbmNlcycsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICAgICAgY29udGV4dDogICAgICB7IGluY2x1ZGVEZWNsYXJhdGlvbjogY29udGV4dC5pbmNsdWRlRGVjbGFyYXRpb24gfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgbG9jYXRpb25zID0gcmVzdWx0Lm1hcChsb2MgPT4gKHsgdXJpOiBtb25hY28uVXJpLnBhcnNlKGxvYy51cmkpLCByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhsb2MucmFuZ2UpIH0pKTtcbiAgICAgICAgICAgIC8vIFRoZSByZWZlcmVuY2VzIHBlZWsgY2FuIG9ubHkgc2hvdyBhIGNvZGUgcHJldmlldyBmb3IgZmlsZXMgaXQgaGFzIGEgbW9kZWwgZm9yOyBjcmVhdGVcbiAgICAgICAgICAgIC8vIGluLW1lbW9yeSBtb2RlbHMgZm9yIHRoZSByZWZlcmVuY2VkIChwb3NzaWJseSB1bm9wZW5lZCkgZmlsZXMgc28gcHJldmlld3MgcmVuZGVyLlxuICAgICAgICAgICAgYXdhaXQgZW5zdXJlTW9kZWxzRm9yTG9jYXRpb25zKGxvY2F0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gbG9jYXRpb25zO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlclJlbmFtZVByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlUmVuYW1lRWRpdHM6IGFzeW5jIChtb2RlbCwgcG9zaXRpb24sIG5ld05hbWUpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiB7IGVkaXRzOiBbXSB9O1xuICAgICAgICAgICAgY29uc3QgZWRpdDogV29ya3NwYWNlRWRpdCB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L3JlbmFtZScsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICAgICAgbmV3TmFtZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFlZGl0KSByZXR1cm4geyBlZGl0czogW10gfTtcbiAgICAgICAgICAgIC8vIEEgSkRULkxTIHJlbmFtZSBjYW4gc3BhbiBtYW55IGZpbGVzIGFuZCBldmVuIHJlbmFtZSB0aGUgdHlwZSdzIG93biAuamF2YSBmaWxlLiBNb25hY28nc1xuICAgICAgICAgICAgLy8gc2luZ2xlLWZpbGUgZWRpdG9yIHdvdWxkIGRyb3AgZXZlcnl0aGluZyBidXQgdGhlIGN1cnJlbnQgbW9kZWwsIHNvIGFwcGx5IHRoZSB3aG9sZSBlZGl0XG4gICAgICAgICAgICAvLyB0aHJvdWdoIHRoZSB3b3Jrc3BhY2Ugb3Vyc2VsdmVzIHdoZW4gdGhlIElERSBwZXJzaXN0ZW5jZSBob29rIGlzIGF2YWlsYWJsZS5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgKGdsb2JhbFRoaXMgYXMgYW55KS5qYXZhTHNwUGVyc2lzdFJlbmFtZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGFwcGx5UmVuYW1lQWNyb3NzV29ya3NwYWNlKG1vZGVsLCBlZGl0KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZWRpdHM6IFtdIH07XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbamF2YS1sc3BdIGNyb3NzLWZpbGUgcmVuYW1lIGZhaWxlZCwgYXBwbHlpbmcgdG8gdGhlIGN1cnJlbnQgZmlsZSBvbmx5OicsIGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gd29ya3NwYWNlRWRpdFRvTW9uYWNvKGVkaXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB3b3Jrc3BhY2VFZGl0VG9Nb25hY28oZWRpdCk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlc29sdmVSZW5hbWVMb2NhdGlvbjogYXN5bmMgKG1vZGVsLCBwb3NpdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogeyByYW5nZTogTHNwUmFuZ2U7IHBsYWNlaG9sZGVyPzogc3RyaW5nIH0gfCBMc3BSYW5nZSB8IG51bGwgPVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L3ByZXBhcmVSZW5hbWUnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gJ3JhbmdlJyBpbiByZXN1bHQgPyByZXN1bHQucmFuZ2UgOiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSAncGxhY2Vob2xkZXInIGluIHJlc3VsdCAmJiByZXN1bHQucGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICAgICAgPyByZXN1bHQucGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICAgICAgOiBtb2RlbC5nZXRXb3JkQXRQb3NpdGlvbihwb3NpdGlvbik/LndvcmQgPz8gJyc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28ocmFuZ2UpLCB0ZXh0OiBwbGFjZWhvbGRlciB9O1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgY29uc3Qgd29yZCA9IG1vZGVsLmdldFdvcmRBdFBvc2l0aW9uKHBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gd29yZCA/IHtcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2U6IHsgc3RhcnRMaW5lTnVtYmVyOiBwb3NpdGlvbi5saW5lTnVtYmVyLCBzdGFydENvbHVtbjogd29yZC5zdGFydENvbHVtbiwgZW5kTGluZU51bWJlcjogcG9zaXRpb24ubGluZU51bWJlciwgZW5kQ29sdW1uOiB3b3JkLmVuZENvbHVtbiB9LFxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiB3b3JkLndvcmQsXG4gICAgICAgICAgICAgICAgfSA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBSZWdpc3RlcmluZyB0aGlzIHByb3ZpZGVyIGFsc28gZW5hYmxlcyBlZGl0b3IuanMncyBleGlzdGluZyBmb3JtYXQtb24tc2F2ZSBwYXRoIGZvciBKYXZhOiB0aGVcbiAgICAvLyBzaGFyZWQgU2F2ZSBhY3Rpb24gcnVucyBlZGl0b3IuYWN0aW9uLmZvcm1hdERvY3VtZW50IHdoZW4gYXV0by1mb3JtYXR0aW5nIGlzIG9uICh0aGUgc2FtZVxuICAgIC8vIG1lY2hhbmlzbSBhbmQgZ2xvYmFsIHRvZ2dsZSB1c2VkIGZvciBUeXBlU2NyaXB0KS5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyRG9jdW1lbnRGb3JtYXR0aW5nRWRpdFByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlRG9jdW1lbnRGb3JtYXR0aW5nRWRpdHM6IGFzeW5jIChtb2RlbCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBlZGl0czogVGV4dEVkaXRbXSB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L2Zvcm1hdHRpbmcnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiAgICAgIHsgdGFiU2l6ZTogbW9kZWwuZ2V0T3B0aW9ucygpLnRhYlNpemUsIGluc2VydFNwYWNlczogbW9kZWwuZ2V0T3B0aW9ucygpLmluc2VydFNwYWNlcyB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gZWRpdHMgPyBlZGl0cy5tYXAodGV4dEVkaXRUb01vbmFjbykgOiBudWxsO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckNvZGVBY3Rpb25Qcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZUNvZGVBY3Rpb25zOiBhc3luYyAobW9kZWwsIHJhbmdlLCBjb250ZXh0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbXB0eSA9IHsgYWN0aW9uczogW10sIGRpc3Bvc2UoKSB7IC8qIG5vdGhpbmcgdG8gZGlzcG9zZSAqLyB9IH07XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gZW1wdHk7XG4gICAgICAgICAgICAvLyBTZW5kIHRoZSBvcmlnaW5hbCBMU1AgZGlhZ25vc3RpY3MgdGhhdCBvdmVybGFwIHRoZSByYW5nZSAodGhleSBjYXJyeSB0aGUgY29kZS9kYXRhIEpEVC5MU1xuICAgICAgICAgICAgLy8gbmVlZHMgdG8gY29tcHV0ZSBxdWljay1maXhlcyksIG5vdCBvbmVzIHJlY29uc3RydWN0ZWQgZnJvbSBNb25hY28gbWFya2Vycy5cbiAgICAgICAgICAgIGNvbnN0IGxzcFJhbmdlID0gbW9uYWNvUmFuZ2VUb0xzcChyYW5nZSk7XG4gICAgICAgICAgICBjb25zdCBkaWFnbm9zdGljcyA9IChfZGlhZ25vc3RpY3MuZ2V0KG1vZGVsLnVyaS50b1N0cmluZygpKSA/PyBbXSkuZmlsdGVyKGQgPT4gcmFuZ2VzT3ZlcmxhcChkLnJhbmdlLCBsc3BSYW5nZSkpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBBcnJheTxDb2RlQWN0aW9uIHwgQ29tbWFuZD4gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9jb2RlQWN0aW9uJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICAgICAgcmFuZ2U6ICAgICAgICBsc3BSYW5nZSxcbiAgICAgICAgICAgICAgICBjb250ZXh0OiAgICAgIHsgZGlhZ25vc3RpY3MsIG9ubHk6IGNvbnRleHQub25seSA/IFtjb250ZXh0Lm9ubHldIDogdW5kZWZpbmVkIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0Py5sZW5ndGgpIHJldHVybiBlbXB0eTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgYWN0aW9uczogcmVzdWx0Lm1hcChsc3BDb2RlQWN0aW9uVG9Nb25hY28pLFxuICAgICAgICAgICAgICAgIGRpc3Bvc2UoKSB7IC8qIG5vdGhpbmcgdG8gZGlzcG9zZSAqLyB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICB9LCB7XG4gICAgICAgIHByb3ZpZGVkQ29kZUFjdGlvbktpbmRzOiBbJ3F1aWNrZml4JywgJ3JlZmFjdG9yJywgJ3JlZmFjdG9yLmV4dHJhY3QnLCAncmVmYWN0b3IuaW5saW5lJyxcbiAgICAgICAgICAgICdyZWZhY3Rvci5yZXdyaXRlJywgJ3NvdXJjZScsICdzb3VyY2Uub3JnYW5pemVJbXBvcnRzJ10sXG4gICAgfSk7XG5cbiAgICAvLyAtLS0gTmF2aWdhdGlvbiAmIHN0cnVjdHVyZSAoUGFjayAxKSAtLS1cblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJJbXBsZW1lbnRhdGlvblByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlSW1wbGVtZW50YXRpb246IChtb2RlbCwgcG9zaXRpb24pID0+IHJlcXVlc3RMb2NhdGlvbnMoJ3RleHREb2N1bWVudC9pbXBsZW1lbnRhdGlvbicsIG1vZGVsLCBwb3NpdGlvbiksXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyVHlwZURlZmluaXRpb25Qcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZVR5cGVEZWZpbml0aW9uOiAobW9kZWwsIHBvc2l0aW9uKSA9PiByZXF1ZXN0TG9jYXRpb25zKCd0ZXh0RG9jdW1lbnQvdHlwZURlZmluaXRpb24nLCBtb2RlbCwgcG9zaXRpb24pLFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckRvY3VtZW50SGlnaGxpZ2h0UHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVEb2N1bWVudEhpZ2hsaWdodHM6IGFzeW5jIChtb2RlbCwgcG9zaXRpb24pID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBhbnlbXSB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L2RvY3VtZW50SGlnaGxpZ2h0Jywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5tYXAoaCA9PiAoeyByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhoLnJhbmdlKSwga2luZDogaC5raW5kID8gaC5raW5kIC0gMSA6IHVuZGVmaW5lZCB9KSk7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyRG9jdW1lbnRTeW1ib2xQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZURvY3VtZW50U3ltYm9sczogYXN5bmMgKG1vZGVsKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55W10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9kb2N1bWVudFN5bWJvbCcsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0ID8gbWFwRG9jdW1lbnRTeW1ib2xzKHJlc3VsdCkgOiBudWxsO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckZvbGRpbmdSYW5nZVByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlRm9sZGluZ1JhbmdlczogYXN5bmMgKG1vZGVsKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55W10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9mb2xkaW5nUmFuZ2UnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5tYXAociA9PiAoeyBzdGFydDogci5zdGFydExpbmUgKyAxLCBlbmQ6IHIuZW5kTGluZSArIDEsIGtpbmQ6IGZvbGRpbmdLaW5kKHIua2luZCkgfSkpO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlclNlbGVjdGlvblJhbmdlUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVTZWxlY3Rpb25SYW5nZXM6IGFzeW5jIChtb2RlbCwgcG9zaXRpb25zKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55W10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9zZWxlY3Rpb25SYW5nZScsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uczogICAgcG9zaXRpb25zLm1hcChwID0+ICh7IGxpbmU6IHAubGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogcC5jb2x1bW4gLSAxIH0pKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5tYXAoZmxhdHRlblNlbGVjdGlvblJhbmdlKTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJEb2N1bWVudFJhbmdlRm9ybWF0dGluZ0VkaXRQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZURvY3VtZW50UmFuZ2VGb3JtYXR0aW5nRWRpdHM6IGFzeW5jIChtb2RlbCwgcmFuZ2UpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgZWRpdHM6IFRleHRFZGl0W10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9yYW5nZUZvcm1hdHRpbmcnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgICAgICByYW5nZTogICAgICAgIG1vbmFjb1JhbmdlVG9Mc3AocmFuZ2UpLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6ICAgICAgeyB0YWJTaXplOiBtb2RlbC5nZXRPcHRpb25zKCkudGFiU2l6ZSwgaW5zZXJ0U3BhY2VzOiBtb2RlbC5nZXRPcHRpb25zKCkuaW5zZXJ0U3BhY2VzIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBlZGl0cyA/IGVkaXRzLm1hcCh0ZXh0RWRpdFRvTW9uYWNvKSA6IG51bGw7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyAtLS0gSW5sYXkgaGludHMgKyBzZW1hbnRpYyBoaWdobGlnaHRpbmcgKFBhY2sgMikgLS0tXG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVySW5sYXlIaW50c1Byb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlSW5sYXlIaW50czogYXN5bmMgKG1vZGVsLCByYW5nZSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IGFueVtdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvaW5sYXlIaW50Jywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICAgICAgcmFuZ2U6ICAgICAgICBtb25hY29SYW5nZVRvTHNwKHJhbmdlKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBoaW50czogcmVzdWx0Lm1hcChoID0+ICh7XG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lTnVtYmVyOiBoLnBvc2l0aW9uLmxpbmUgKyAxLCBjb2x1bW46IGgucG9zaXRpb24uY2hhcmFjdGVyICsgMSB9LFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogICAgICAgIHR5cGVvZiBoLmxhYmVsID09PSAnc3RyaW5nJyA/IGgubGFiZWwgOiAoaC5sYWJlbCA/PyBbXSkubWFwKChwOiBhbnkpID0+ICh7IGxhYmVsOiBwLnZhbHVlIH0pKSxcbiAgICAgICAgICAgICAgICAgICAga2luZDogICAgICAgICBoLmtpbmQsXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmdMZWZ0OiAgaC5wYWRkaW5nTGVmdCxcbiAgICAgICAgICAgICAgICAgICAgcGFkZGluZ1JpZ2h0OiBoLnBhZGRpbmdSaWdodCxcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcDogICAgICBoLnRvb2x0aXAgPyBtYXJrdXBUb1N0cmluZyhoLnRvb2x0aXApIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgICBkaXNwb3NlKCkgeyAvKiBub3RoaW5nIHRvIGRpc3Bvc2UgKi8gfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyRG9jdW1lbnRTZW1hbnRpY1Rva2Vuc1Byb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBnZXRMZWdlbmQ6ICgpID0+IF9zZW1hbnRpY1Rva2Vuc0xlZ2VuZCA/PyB7IHRva2VuVHlwZXM6IFtdLCB0b2tlbk1vZGlmaWVyczogW10gfSxcbiAgICAgICAgcHJvdmlkZURvY3VtZW50U2VtYW50aWNUb2tlbnM6IGFzeW5jIChtb2RlbCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSB8fCAhX3NlbWFudGljVG9rZW5zTGVnZW5kKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogeyBkYXRhOiBudW1iZXJbXTsgcmVzdWx0SWQ/OiBzdHJpbmcgfSB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L3NlbWFudGljVG9rZW5zL2Z1bGwnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQ/LmRhdGEpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogbmV3IFVpbnQzMkFycmF5KHJlc3VsdC5kYXRhKSwgcmVzdWx0SWQ6IHJlc3VsdC5yZXN1bHRJZCB9O1xuICAgICAgICB9LFxuICAgICAgICByZWxlYXNlRG9jdW1lbnRTZW1hbnRpY1Rva2VuczogKCkgPT4geyAvKiBub3RoaW5nIHRvIHJlbGVhc2UgKi8gfSxcbiAgICB9KTtcblxuICAgIC8vIC0tLSBDb2RlTGVucyAoUGFjayAzKSAtLS1cblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJDb2RlTGVuc1Byb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlQ29kZUxlbnNlczogYXN5bmMgKG1vZGVsKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4geyBsZW5zZXM6IFtdLCBkaXNwb3NlKCkgeyAvKiAqLyB9IH07XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IGFueVtdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvY29kZUxlbnMnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgbGVuc2VzID0gKHJlc3VsdCA/PyBbXSkubWFwKChsZW5zLCBpKSA9PiAoe1xuICAgICAgICAgICAgICAgIHJhbmdlOiAgICBsc3BSYW5nZVRvTW9uYWNvKGxlbnMucmFuZ2UpLFxuICAgICAgICAgICAgICAgIGlkOiAgICAgICBTdHJpbmcoaSksXG4gICAgICAgICAgICAgICAgY29tbWFuZDogIGxlbnMuY29tbWFuZCA/IG1hcExlbnNDb21tYW5kKGxlbnMuY29tbWFuZCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgX2xzcDogICAgIGxlbnMsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICByZXR1cm4geyBsZW5zZXMsIGRpc3Bvc2UoKSB7IC8qICovIH0gfTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVzb2x2ZUNvZGVMZW5zOiBhc3luYyAoX21vZGVsLCBjb2RlTGVucykgPT4ge1xuICAgICAgICAgICAgY29uc3QgbHNwID0gKGNvZGVMZW5zIGFzIGFueSkuX2xzcDtcbiAgICAgICAgICAgIGlmIChfY29ubiAmJiBsc3AgJiYgIWxzcC5jb21tYW5kKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWQ6IGFueSA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCdjb2RlTGVucy9yZXNvbHZlJywgbHNwKTtcbiAgICAgICAgICAgICAgICAgICAgY29kZUxlbnMuY29tbWFuZCA9IHJlc29sdmVkPy5jb21tYW5kID8gbWFwTGVuc0NvbW1hbmQocmVzb2x2ZWQuY29tbWFuZCkgOiB7IGlkOiBOT09QX0NPTU1BTkQsIHRpdGxlOiAnJyB9O1xuICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICBjb2RlTGVucy5jb21tYW5kID0geyBpZDogTk9PUF9DT01NQU5ELCB0aXRsZTogJycgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29kZUxlbnM7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyAtLS0gSmF2YSBrZXl3b3JkIGNvbXBsZXRpb24gKFBhY2sgMWIpOiBhbHdheXMtYXZhaWxhYmxlLCByYW5rZWQgYmVsb3cgU0RLL0xTUCByZXN1bHRzIC0tLVxuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckNvbXBsZXRpb25JdGVtUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVDb21wbGV0aW9uSXRlbXM6IChtb2RlbCwgcG9zaXRpb24pID0+IHtcbiAgICAgICAgICAgIGlmICghaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCB3b3JkID0gbW9kZWwuZ2V0V29yZFVudGlsUG9zaXRpb24ocG9zaXRpb24pO1xuICAgICAgICAgICAgY29uc3QgcmFuZ2U6IG1vbmFjby5JUmFuZ2UgPSB7XG4gICAgICAgICAgICAgICAgc3RhcnRMaW5lTnVtYmVyOiBwb3NpdGlvbi5saW5lTnVtYmVyLCBzdGFydENvbHVtbjogd29yZC5zdGFydENvbHVtbixcbiAgICAgICAgICAgICAgICBlbmRMaW5lTnVtYmVyOiAgIHBvc2l0aW9uLmxpbmVOdW1iZXIsIGVuZENvbHVtbjogICB3b3JkLmVuZENvbHVtbixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb25zOiBKQVZBX0tFWVdPUkRTLm1hcChrZXl3b3JkID0+ICh7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAgICAgIGtleXdvcmQsXG4gICAgICAgICAgICAgICAgICAgIGtpbmQ6ICAgICAgIG1vbmFjby5sYW5ndWFnZXMuQ29tcGxldGlvbkl0ZW1LaW5kLktleXdvcmQsXG4gICAgICAgICAgICAgICAgICAgIGluc2VydFRleHQ6IGtleXdvcmQsXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlLFxuICAgICAgICAgICAgICAgICAgICBzb3J0VGV4dDogICBgOV8ke2tleXdvcmR9YCxcbiAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgIH0pO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBIZWxwZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIGxzcFNldmVyaXR5KHNldmVyaXR5OiBEaWFnbm9zdGljU2V2ZXJpdHkgfCB1bmRlZmluZWQpOiBtb25hY28uTWFya2VyU2V2ZXJpdHkge1xuICAgIHN3aXRjaCAoc2V2ZXJpdHkpIHtcbiAgICAgICAgY2FzZSBEaWFnbm9zdGljU2V2ZXJpdHkuRXJyb3I6ICAgICAgIHJldHVybiBtb25hY28uTWFya2VyU2V2ZXJpdHkuRXJyb3I7XG4gICAgICAgIGNhc2UgRGlhZ25vc3RpY1NldmVyaXR5Lldhcm5pbmc6ICAgICByZXR1cm4gbW9uYWNvLk1hcmtlclNldmVyaXR5Lldhcm5pbmc7XG4gICAgICAgIGNhc2UgRGlhZ25vc3RpY1NldmVyaXR5LkluZm9ybWF0aW9uOiByZXR1cm4gbW9uYWNvLk1hcmtlclNldmVyaXR5LkluZm87XG4gICAgICAgIGNhc2UgRGlhZ25vc3RpY1NldmVyaXR5LkhpbnQ6ICAgICAgICByZXR1cm4gbW9uYWNvLk1hcmtlclNldmVyaXR5LkhpbnQ7XG4gICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9uYWNvLk1hcmtlclNldmVyaXR5LkVycm9yO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gbHNwUmFuZ2VUb01vbmFjbyhyOiB7IHN0YXJ0OiB7IGxpbmU6IG51bWJlcjsgY2hhcmFjdGVyOiBudW1iZXIgfTsgZW5kOiB7IGxpbmU6IG51bWJlcjsgY2hhcmFjdGVyOiBudW1iZXIgfSB9KTogbW9uYWNvLklSYW5nZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnRMaW5lTnVtYmVyOiByLnN0YXJ0LmxpbmUgKyAxLFxuICAgICAgICBzdGFydENvbHVtbjogICAgIHIuc3RhcnQuY2hhcmFjdGVyICsgMSxcbiAgICAgICAgZW5kTGluZU51bWJlcjogICByLmVuZC5saW5lICsgMSxcbiAgICAgICAgZW5kQ29sdW1uOiAgICAgICByLmVuZC5jaGFyYWN0ZXIgKyAxLFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIG1hcmt1cFRvU3RyaW5nKGM6IHN0cmluZyB8IE1hcmt1cENvbnRlbnQpOiBzdHJpbmcge1xuICAgIHJldHVybiB0eXBlb2YgYyA9PT0gJ3N0cmluZycgPyBjIDogYy52YWx1ZTtcbn1cblxuZnVuY3Rpb24gbHNwQ29tcGxldGlvbktpbmQoa2luZDogQ29tcGxldGlvbkl0ZW1LaW5kIHwgdW5kZWZpbmVkKTogbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbUtpbmQge1xuICAgIGNvbnN0IEsgPSBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtS2luZDtcbiAgICBzd2l0Y2ggKGtpbmQpIHtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuVGV4dDogICAgICAgICAgcmV0dXJuIEsuVGV4dDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuTWV0aG9kOiAgICAgICAgcmV0dXJuIEsuTWV0aG9kO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5GdW5jdGlvbjogICAgICByZXR1cm4gSy5GdW5jdGlvbjtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuQ29uc3RydWN0b3I6ICAgcmV0dXJuIEsuQ29uc3RydWN0b3I7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLkZpZWxkOiAgICAgICAgIHJldHVybiBLLkZpZWxkO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5WYXJpYWJsZTogICAgICByZXR1cm4gSy5WYXJpYWJsZTtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuQ2xhc3M6ICAgICAgICAgcmV0dXJuIEsuQ2xhc3M7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLkludGVyZmFjZTogICAgIHJldHVybiBLLkludGVyZmFjZTtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuTW9kdWxlOiAgICAgICAgcmV0dXJuIEsuTW9kdWxlO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5Qcm9wZXJ0eTogICAgICByZXR1cm4gSy5Qcm9wZXJ0eTtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuS2V5d29yZDogICAgICAgcmV0dXJuIEsuS2V5d29yZDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuU25pcHBldDogICAgICAgcmV0dXJuIEsuU25pcHBldDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuQ29uc3RhbnQ6ICAgICAgcmV0dXJuIEsuQ29uc3RhbnQ7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLlN0cnVjdDogICAgICAgIHJldHVybiBLLlN0cnVjdDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuVHlwZVBhcmFtZXRlcjogcmV0dXJuIEsuVHlwZVBhcmFtZXRlcjtcbiAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEsuVGV4dDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGxzcENvbXBsZXRpb25Ub01vbmFjbyhcbiAgICBpdGVtOiBDb21wbGV0aW9uSXRlbSxcbiAgICBtb2RlbDogbW9uYWNvLmVkaXRvci5JVGV4dE1vZGVsLFxuICAgIHBvc2l0aW9uOiBtb25hY28uUG9zaXRpb24sXG4pOiBNb25hY29Db21wbGV0aW9uSXRlbSB7XG4gICAgY29uc3Qgd29yZCA9IG1vZGVsLmdldFdvcmRVbnRpbFBvc2l0aW9uKHBvc2l0aW9uKTtcbiAgICBsZXQgcmFuZ2U6IG1vbmFjby5JUmFuZ2UgPSB7XG4gICAgICAgIHN0YXJ0TGluZU51bWJlcjogcG9zaXRpb24ubGluZU51bWJlcixcbiAgICAgICAgc3RhcnRDb2x1bW46ICAgICB3b3JkLnN0YXJ0Q29sdW1uLFxuICAgICAgICBlbmRMaW5lTnVtYmVyOiAgIHBvc2l0aW9uLmxpbmVOdW1iZXIsXG4gICAgICAgIGVuZENvbHVtbjogICAgICAgd29yZC5lbmRDb2x1bW4sXG4gICAgfTtcbiAgICBsZXQgaW5zZXJ0VGV4dCA9IGl0ZW0uaW5zZXJ0VGV4dCA/PyBpdGVtLmxhYmVsO1xuICAgIGNvbnN0IHRleHRFZGl0ID0gaXRlbS50ZXh0RWRpdCBhcyB7IHJhbmdlPzogTHNwUmFuZ2U7IHJlcGxhY2U/OiBMc3BSYW5nZTsgaW5zZXJ0PzogTHNwUmFuZ2U7IG5ld1RleHQ/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcbiAgICBpZiAodGV4dEVkaXQpIHtcbiAgICAgICAgY29uc3QgciA9IHRleHRFZGl0LnJhbmdlID8/IHRleHRFZGl0LnJlcGxhY2UgPz8gdGV4dEVkaXQuaW5zZXJ0O1xuICAgICAgICBpZiAocikgcmFuZ2UgPSBsc3BSYW5nZVRvTW9uYWNvKHIpO1xuICAgICAgICBpZiAodHlwZW9mIHRleHRFZGl0Lm5ld1RleHQgPT09ICdzdHJpbmcnKSBpbnNlcnRUZXh0ID0gdGV4dEVkaXQubmV3VGV4dDtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0OiBNb25hY29Db21wbGV0aW9uSXRlbSA9IHtcbiAgICAgICAgbGFiZWw6ICAgICAgICAgICBpdGVtLmxhYmVsLFxuICAgICAgICBraW5kOiAgICAgICAgICAgIGxzcENvbXBsZXRpb25LaW5kKGl0ZW0ua2luZCksXG4gICAgICAgIGRldGFpbDogICAgICAgICAgaXRlbS5kZXRhaWwsXG4gICAgICAgIGRvY3VtZW50YXRpb246ICAgaXRlbS5kb2N1bWVudGF0aW9uID8geyB2YWx1ZTogbWFya3VwVG9TdHJpbmcoaXRlbS5kb2N1bWVudGF0aW9uKSwgaXNUcnVzdGVkOiBmYWxzZSB9IDogdW5kZWZpbmVkLFxuICAgICAgICBpbnNlcnRUZXh0LFxuICAgICAgICBpbnNlcnRUZXh0UnVsZXM6IGl0ZW0uaW5zZXJ0VGV4dEZvcm1hdCA9PT0gSW5zZXJ0VGV4dEZvcm1hdC5TbmlwcGV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbUluc2VydFRleHRSdWxlLkluc2VydEFzU25pcHBldFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgcmFuZ2UsXG4gICAgICAgIHNvcnRUZXh0OiAgICAgICAgICAgIHNka1ByaW9yaXRpc2VkU29ydFRleHQoaXRlbSksXG4gICAgICAgIGZpbHRlclRleHQ6ICAgICAgICAgIGl0ZW0uZmlsdGVyVGV4dCxcbiAgICAgICAgcHJlc2VsZWN0OiAgICAgICAgICAgaXRlbS5wcmVzZWxlY3QsXG4gICAgICAgIGNvbW1pdENoYXJhY3RlcnM6ICAgIGl0ZW0uY29tbWl0Q2hhcmFjdGVycyxcbiAgICAgICAgYWRkaXRpb25hbFRleHRFZGl0czogaXRlbS5hZGRpdGlvbmFsVGV4dEVkaXRzPy5tYXAodGV4dEVkaXRUb01vbmFjbyksXG4gICAgfTtcbiAgICByZXN1bHQuX2xzcCA9IGl0ZW07XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBSYW5rcyBEaXJpZ2libGUgU0RLIHN1Z2dlc3Rpb25zICh7QGNvZGUgb3JnLmVjbGlwc2UuZGlyaWdpYmxlLnNkay4qfSkgYWJvdmUgZXZlcnl0aGluZyBlbHNlIGJ5XG4gKiBwcmVmaXhpbmcgdGhlIHNlcnZlciBzb3J0VGV4dCB3aXRoIGEgcHJpb3JpdHkgYnVja2V0LCBwcmVzZXJ2aW5nIHRoZSBzZXJ2ZXIgb3JkZXIgd2l0aGluIGVhY2ggYnVja2V0LlxuICovXG5mdW5jdGlvbiBzZGtQcmlvcml0aXNlZFNvcnRUZXh0KGl0ZW06IENvbXBsZXRpb25JdGVtKTogc3RyaW5nIHtcbiAgICBjb25zdCBiYXNlID0gaXRlbS5zb3J0VGV4dCA/PyAodHlwZW9mIGl0ZW0ubGFiZWwgPT09ICdzdHJpbmcnID8gaXRlbS5sYWJlbCA6ICcnKTtcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IChpdGVtLmxhYmVsRGV0YWlscyAmJiB0eXBlb2YgaXRlbS5sYWJlbERldGFpbHMuZGVzY3JpcHRpb24gPT09ICdzdHJpbmcnKVxuICAgICAgICA/IGl0ZW0ubGFiZWxEZXRhaWxzLmRlc2NyaXB0aW9uIDogJyc7XG4gICAgY29uc3QgaGF5c3RhY2sgPSBgJHtpdGVtLmRldGFpbCA/PyAnJ30gJHtkZXNjcmlwdGlvbn1gO1xuICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcygnb3JnLmVjbGlwc2UuZGlyaWdpYmxlLnNkaycpID8gYDBfJHtiYXNlfWAgOiBgMV8ke2Jhc2V9YDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ29kZSBhY3Rpb25zLCBjb21tYW5kcywgcmVmYWN0b3IvZ2VuZXJhdGUsIHdvcmtzcGFjZSBlZGl0c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogTW9uYWNvIGNvbW1hbmQgaWQgdXNlZCB0byBhcHBseSBhIGRlZmVycmVkIExTUCBjb2RlIGFjdGlvbiB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgaXQuICovXG5jb25zdCBBUFBMWV9BQ1RJT05fQ09NTUFORCA9ICdkaXJpZ2libGUuamF2YS5hcHBseUNvZGVBY3Rpb24nO1xuXG4vKiogVmlydHVhbCBVUkkgcHJlZml4IG9mIGVkaXRvciBtb2RlbHM7IHN0cmlwcGluZyBpdCB5aWVsZHMgdGhlIElERSB3b3Jrc3BhY2UgcGF0aCAoL3dzL3Byb2ovLi4uKS4gKi9cbmNvbnN0IFZJUlRVQUxfRklMRV9QUkVGSVggPSAnZmlsZTovLy93b3Jrc3BhY2UnO1xuXG4vKiogTW9uYWNvIGNvbW1hbmQgaWQgdXNlZCBmb3IgZGlzcGxheS1vbmx5IENvZGVMZW5zZXMgKGUuZy4gYSByZWZlcmVuY2UgY291bnQgd2l0aCBubyByZXNvbHZlZCBhY3Rpb24pLiAqL1xuY29uc3QgTk9PUF9DT01NQU5EID0gJ2RpcmlnaWJsZS5qYXZhLm5vb3BMZW5zJztcblxuLyoqIEphdmEgU0Uga2V5d29yZHMvbGl0ZXJhbHMgb2ZmZXJlZCBhcyBsb3ctcHJpb3JpdHkgY29tcGxldGlvbiBzbyB0aGV5IGFsd2F5cyBhcHBlYXIgd2hpbGUgdHlwaW5nLiAqL1xuY29uc3QgSkFWQV9LRVlXT1JEUyA9IFsnYWJzdHJhY3QnLCAnYXNzZXJ0JywgJ2Jvb2xlYW4nLCAnYnJlYWsnLCAnYnl0ZScsICdjYXNlJywgJ2NhdGNoJywgJ2NoYXInLCAnY2xhc3MnLFxuICAgICdjb25zdCcsICdjb250aW51ZScsICdkZWZhdWx0JywgJ2RvJywgJ2RvdWJsZScsICdlbHNlJywgJ2VudW0nLCAnZXh0ZW5kcycsICdmaW5hbCcsICdmaW5hbGx5JywgJ2Zsb2F0JyxcbiAgICAnZm9yJywgJ2dvdG8nLCAnaWYnLCAnaW1wbGVtZW50cycsICdpbXBvcnQnLCAnaW5zdGFuY2VvZicsICdpbnQnLCAnaW50ZXJmYWNlJywgJ2xvbmcnLCAnbmF0aXZlJywgJ25ldycsXG4gICAgJ3BhY2thZ2UnLCAncHJpdmF0ZScsICdwcm90ZWN0ZWQnLCAncHVibGljJywgJ3JldHVybicsICdzaG9ydCcsICdzdGF0aWMnLCAnc3RyaWN0ZnAnLCAnc3VwZXInLCAnc3dpdGNoJyxcbiAgICAnc3luY2hyb25pemVkJywgJ3RoaXMnLCAndGhyb3cnLCAndGhyb3dzJywgJ3RyYW5zaWVudCcsICd0cnknLCAndm9pZCcsICd2b2xhdGlsZScsICd3aGlsZScsICd2YXInLFxuICAgICd5aWVsZCcsICdyZWNvcmQnLCAnc2VhbGVkJywgJ3Blcm1pdHMnLCAndHJ1ZScsICdmYWxzZScsICdudWxsJ107XG5cbi8qKiBTaGFyZWQgZGVmaW5pdGlvbi1zdHlsZSBsb2NhdGlvbiByZXF1ZXN0IHVzZWQgYnkgZ28tdG8tZGVmaW5pdGlvbi9pbXBsZW1lbnRhdGlvbi90eXBlLWRlZmluaXRpb24uICovXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0TG9jYXRpb25zKG1ldGhvZDogc3RyaW5nLCBtb2RlbDogbW9uYWNvLmVkaXRvci5JVGV4dE1vZGVsLCBwb3NpdGlvbjogbW9uYWNvLlBvc2l0aW9uKSB7XG4gICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgcmVzdWx0OiBMb2NhdGlvbiB8IExvY2F0aW9uW10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QobWV0aG9kLCB7XG4gICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgfSk7XG4gICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGxvY2F0aW9ucyA9IChBcnJheS5pc0FycmF5KHJlc3VsdCkgPyByZXN1bHQgOiBbcmVzdWx0XSkubWFwKGxvYyA9PiAoeyB1cmk6IG1vbmFjby5VcmkucGFyc2UobG9jLnVyaSksIHJhbmdlOiBsc3BSYW5nZVRvTW9uYWNvKGxvYy5yYW5nZSkgfSkpO1xuICAgIGF3YWl0IGVuc3VyZU1vZGVsc0ZvckxvY2F0aW9ucyhsb2NhdGlvbnMpO1xuICAgIHJldHVybiBsb2NhdGlvbnM7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBpbi1tZW1vcnkgTW9uYWNvIG1vZGVscyBmb3IgdGhlIHdvcmtzcGFjZSBmaWxlcyByZWZlcmVuY2VkIGJ5IHRoZSBnaXZlbiBsb2NhdGlvbnMgKGZldGNoZWRcbiAqIG92ZXIgUkVTVCkgc28gdGhlIHJlZmVyZW5jZXMgLyBwZWVrIHdpZGdldHMgY2FuIHJlbmRlciBhIGNvZGUgcHJldmlldyBcdTIwMTQgTW9uYWNvIGNhbiBvbmx5IHByZXZpZXcgZmlsZXNcbiAqIGl0IGhhcyBhIG1vZGVsIGZvciwgYW5kIHRoaXMgc2luZ2xlLWZpbGUgZWRpdG9yIG90aGVyd2lzZSBoYXMgbm9uZSBmb3Igb3RoZXIgZmlsZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGVuc3VyZU1vZGVsc0ZvckxvY2F0aW9ucyhsb2NhdGlvbnM6IEFycmF5PHsgdXJpOiBtb25hY28uVXJpIH0+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKGxvY2F0aW9ucy5tYXAoYXN5bmMgKHsgdXJpIH0pID0+IHtcbiAgICAgICAgY29uc3QgdXJpU3RyID0gdXJpLnRvU3RyaW5nKCk7XG4gICAgICAgIGlmIChzZWVuLmhhcyh1cmlTdHIpIHx8ICF1cmlTdHIuc3RhcnRzV2l0aChWSVJUVUFMX0ZJTEVfUFJFRklYKSB8fCBtb25hY28uZWRpdG9yLmdldE1vZGVsKHVyaSkpIHJldHVybjtcbiAgICAgICAgc2Vlbi5hZGQodXJpU3RyKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCBmZXRjaFdvcmtzcGFjZUZpbGVUZXh0KHVyaVRvV29ya3NwYWNlUGF0aCh1cmlTdHIpID8/IHVyaVN0cik7XG4gICAgICAgICAgICBpZiAoIW1vbmFjby5lZGl0b3IuZ2V0TW9kZWwodXJpKSkgbW9uYWNvLmVkaXRvci5jcmVhdGVNb2RlbCh0ZXh0LCAnamF2YScsIHVyaSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gcHJldmlldyBqdXN0IHdvbid0IHJlbmRlciBmb3IgdGhpcyBvbmVcbiAgICAgICAgfVxuICAgIH0pKTtcbn1cblxuLyoqIFJlY3Vyc2l2ZWx5IG1hcHMgTFNQIGhpZXJhcmNoaWNhbCBEb2N1bWVudFN5bWJvbHMgdG8gTW9uYWNvJ3Mgc2hhcGUgKGtpbmRzIGFyZSAxLWJhc2VkIHZzIDAtYmFzZWQpLiAqL1xuZnVuY3Rpb24gbWFwRG9jdW1lbnRTeW1ib2xzKHN5bWJvbHM6IGFueVtdKTogbW9uYWNvLmxhbmd1YWdlcy5Eb2N1bWVudFN5bWJvbFtdIHtcbiAgICByZXR1cm4gKHN5bWJvbHMgPz8gW10pLm1hcChzID0+ICh7XG4gICAgICAgIG5hbWU6ICAgICAgICAgICBzLm5hbWUsXG4gICAgICAgIGRldGFpbDogICAgICAgICBzLmRldGFpbCA/PyAnJyxcbiAgICAgICAga2luZDogICAgICAgICAgIChzLmtpbmQgPz8gMSkgLSAxLFxuICAgICAgICB0YWdzOiAgICAgICAgICAgcy50YWdzID8/IFtdLFxuICAgICAgICByYW5nZTogICAgICAgICAgbHNwUmFuZ2VUb01vbmFjbyhzLnJhbmdlKSxcbiAgICAgICAgc2VsZWN0aW9uUmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28ocy5zZWxlY3Rpb25SYW5nZSA/PyBzLnJhbmdlKSxcbiAgICAgICAgY2hpbGRyZW46ICAgICAgIHMuY2hpbGRyZW4gPyBtYXBEb2N1bWVudFN5bWJvbHMocy5jaGlsZHJlbikgOiBbXSxcbiAgICB9KSk7XG59XG5cbmZ1bmN0aW9uIGZvbGRpbmdLaW5kKGtpbmQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IG1vbmFjby5sYW5ndWFnZXMuRm9sZGluZ1JhbmdlS2luZCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgRksgPSBtb25hY28ubGFuZ3VhZ2VzLkZvbGRpbmdSYW5nZUtpbmQ7XG4gICAgc3dpdGNoIChraW5kKSB7XG4gICAgICAgIGNhc2UgJ2NvbW1lbnQnOiByZXR1cm4gRksuQ29tbWVudDtcbiAgICAgICAgY2FzZSAnaW1wb3J0cyc6IHJldHVybiBGSy5JbXBvcnRzO1xuICAgICAgICBjYXNlICdyZWdpb24nOiAgcmV0dXJuIEZLLlJlZ2lvbjtcbiAgICAgICAgZGVmYXVsdDogICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxufVxuXG4vKiogRmxhdHRlbnMgYW4gTFNQIFNlbGVjdGlvblJhbmdlIHBhcmVudC1jaGFpbiBpbnRvIE1vbmFjbydzIGlubmVybW9zdC10by1vdXRlcm1vc3QgYXJyYXkuICovXG5mdW5jdGlvbiBmbGF0dGVuU2VsZWN0aW9uUmFuZ2Uoc2VsZWN0aW9uUmFuZ2U6IGFueSk6IG1vbmFjby5sYW5ndWFnZXMuU2VsZWN0aW9uUmFuZ2VbXSB7XG4gICAgY29uc3QgcmFuZ2VzOiBtb25hY28ubGFuZ3VhZ2VzLlNlbGVjdGlvblJhbmdlW10gPSBbXTtcbiAgICBsZXQgY3VycmVudCA9IHNlbGVjdGlvblJhbmdlO1xuICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICAgIHJhbmdlcy5wdXNoKHsgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28oY3VycmVudC5yYW5nZSkgfSk7XG4gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudDtcbiAgICB9XG4gICAgcmV0dXJuIHJhbmdlcztcbn1cblxuLyoqIE1hcHMgYSBKRFQuTFMgQ29kZUxlbnMgY29tbWFuZCB0byBhIE1vbmFjbyBjb21tYW5kLCB3aXJpbmcgdGhlIHJlZmVyZW5jZXMvaW1wbGVtZW50YXRpb25zIHBlZWsuICovXG5mdW5jdGlvbiBtYXBMZW5zQ29tbWFuZChjbWQ6IGFueSk6IG1vbmFjby5sYW5ndWFnZXMuQ29tbWFuZCB7XG4gICAgY29uc3QgYXJncyA9IGNtZC5hcmd1bWVudHMgPz8gW107XG4gICAgaWYgKChjbWQuY29tbWFuZCA9PT0gJ2phdmEuc2hvdy5yZWZlcmVuY2VzJyB8fCBjbWQuY29tbWFuZCA9PT0gJ2phdmEuc2hvdy5pbXBsZW1lbnRhdGlvbnMnKSAmJiBhcmdzLmxlbmd0aCA+PSAzKSB7XG4gICAgICAgIGNvbnN0IGxvY2F0aW9ucyA9IChhcmdzWzJdID8/IFtdKS5tYXAoKGw6IGFueSkgPT4gKHsgdXJpOiBtb25hY28uVXJpLnBhcnNlKGwudXJpKSwgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28obC5yYW5nZSkgfSkpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6ICAgICAgICAnZWRpdG9yLmFjdGlvbi5zaG93UmVmZXJlbmNlcycsXG4gICAgICAgICAgICB0aXRsZTogICAgIGNtZC50aXRsZSxcbiAgICAgICAgICAgIGFyZ3VtZW50czogW21vbmFjby5VcmkucGFyc2UoYXJnc1swXSksIHsgbGluZU51bWJlcjogYXJnc1sxXS5saW5lICsgMSwgY29sdW1uOiBhcmdzWzFdLmNoYXJhY3RlciArIDEgfSwgbG9jYXRpb25zXSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgaWQ6IE5PT1BfQ09NTUFORCwgdGl0bGU6IGNtZC50aXRsZSB9O1xufVxuXG50eXBlIExzcFJhbmdlID0geyBzdGFydDogeyBsaW5lOiBudW1iZXI7IGNoYXJhY3RlcjogbnVtYmVyIH07IGVuZDogeyBsaW5lOiBudW1iZXI7IGNoYXJhY3RlcjogbnVtYmVyIH0gfTtcblxuLyoqIE1vbmFjbyBjb21wbGV0aW9uIGl0ZW0gY2FycnlpbmcgdGhlIG9yaWdpbmF0aW5nIExTUCBpdGVtIHNvIHJlc29sdmUgY2FuIGZldGNoIGl0cyBpbXBvcnQgZWRpdHMuICovXG50eXBlIE1vbmFjb0NvbXBsZXRpb25JdGVtID0gbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbSAmIHsgX2xzcD86IENvbXBsZXRpb25JdGVtIH07XG5cbmZ1bmN0aW9uIHRleHRFZGl0VG9Nb25hY28oZWRpdDogVGV4dEVkaXQpOiBtb25hY28ubGFuZ3VhZ2VzLlRleHRFZGl0IHtcbiAgICByZXR1cm4geyByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhlZGl0LnJhbmdlKSwgdGV4dDogZWRpdC5uZXdUZXh0IH07XG59XG5cbmZ1bmN0aW9uIG1vbmFjb1JhbmdlVG9Mc3AocjogbW9uYWNvLklSYW5nZSk6IExzcFJhbmdlIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBzdGFydDogeyBsaW5lOiByLnN0YXJ0TGluZU51bWJlciAtIDEsIGNoYXJhY3Rlcjogci5zdGFydENvbHVtbiAtIDEgfSxcbiAgICAgICAgZW5kOiAgIHsgbGluZTogci5lbmRMaW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiByLmVuZENvbHVtbiAtIDEgfSxcbiAgICB9O1xufVxuXG4vKiogVHJ1ZSB3aGVuIHR3byBMU1AgcmFuZ2VzIGludGVyc2VjdCAodXNlZCB0byBwaWNrIHRoZSBkaWFnbm9zdGljcyByZWxldmFudCB0byBhIGNvZGUtYWN0aW9uIHJlcXVlc3QpLiAqL1xuZnVuY3Rpb24gcmFuZ2VzT3ZlcmxhcChhOiBMc3BSYW5nZSwgYjogTHNwUmFuZ2UpOiBib29sZWFuIHtcbiAgICBjb25zdCBub3RBZnRlciA9IChwOiB7IGxpbmU6IG51bWJlcjsgY2hhcmFjdGVyOiBudW1iZXIgfSwgcTogeyBsaW5lOiBudW1iZXI7IGNoYXJhY3RlcjogbnVtYmVyIH0pID0+XG4gICAgICAgIHAubGluZSA8IHEubGluZSB8fCAocC5saW5lID09PSBxLmxpbmUgJiYgcC5jaGFyYWN0ZXIgPD0gcS5jaGFyYWN0ZXIpO1xuICAgIHJldHVybiBub3RBZnRlcihhLnN0YXJ0LCBiLmVuZCkgJiYgbm90QWZ0ZXIoYi5zdGFydCwgYS5lbmQpO1xufVxuXG5mdW5jdGlvbiBsc3BDb2RlQWN0aW9uVG9Nb25hY28oYWN0aW9uOiBDb2RlQWN0aW9uIHwgQ29tbWFuZCk6IG1vbmFjby5sYW5ndWFnZXMuQ29kZUFjdGlvbiB7XG4gICAgY29uc3QgaXNDb21tYW5kID0gdHlwZW9mIChhY3Rpb24gYXMgQ29tbWFuZCkuY29tbWFuZCA9PT0gJ3N0cmluZyc7XG4gICAgY29uc3QgdGl0bGUgPSBhY3Rpb24udGl0bGVcbiAgICAgICAgPz8gKGlzQ29tbWFuZCA/IChhY3Rpb24gYXMgQ29tbWFuZCkuY29tbWFuZCA6IChhY3Rpb24gYXMgQ29kZUFjdGlvbikuY29tbWFuZD8udGl0bGUpXG4gICAgICAgID8/ICdBY3Rpb24nO1xuICAgIGNvbnN0IGtpbmQgPSBpc0NvbW1hbmQgPyAncXVpY2tmaXgnIDogKChhY3Rpb24gYXMgQ29kZUFjdGlvbikua2luZCA/PyAncXVpY2tmaXgnKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB0aXRsZSxcbiAgICAgICAga2luZCxcbiAgICAgICAgZGlhZ25vc3RpY3M6IFtdLFxuICAgICAgICBpc1ByZWZlcnJlZDogKGFjdGlvbiBhcyBDb2RlQWN0aW9uKS5pc1ByZWZlcnJlZCxcbiAgICAgICAgLy8gQXBwbHkgbGF6aWx5IHRocm91Z2ggb3VyIGNvbW1hbmQgc28gd2UgY2FuIHJlc29sdmUsIHJ1biBzZXJ2ZXIgY29tbWFuZHMgYW5kIGFwcGx5IGVkaXRzIHVuaWZvcm1seS5cbiAgICAgICAgY29tbWFuZDogeyBpZDogQVBQTFlfQUNUSU9OX0NPTU1BTkQsIHRpdGxlLCBhcmd1bWVudHM6IFthY3Rpb25dIH0sXG4gICAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gYXBwbHlDb2RlQWN0aW9uKGFjdGlvbjogQ29kZUFjdGlvbiB8IENvbW1hbmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIV9jb25uKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiAoYWN0aW9uIGFzIENvbW1hbmQpLmNvbW1hbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBhd2FpdCBydW5TZXJ2ZXJDb21tYW5kKGFjdGlvbiBhcyBDb21tYW5kKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzb2x2ZWQgPSBhY3Rpb24gYXMgQ29kZUFjdGlvbjtcbiAgICAgICAgaWYgKCFyZXNvbHZlZC5lZGl0ICYmIChyZXNvbHZlZCBhcyB7IGRhdGE/OiB1bmtub3duIH0pLmRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzb2x2ZWQgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgnY29kZUFjdGlvbi9yZXNvbHZlJywgcmVzb2x2ZWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXNvbHZlZC5lZGl0KSBhcHBseVdvcmtzcGFjZUVkaXQocmVzb2x2ZWQuZWRpdCk7XG4gICAgICAgIGlmIChyZXNvbHZlZC5jb21tYW5kKSBhd2FpdCBydW5TZXJ2ZXJDb21tYW5kKHJlc29sdmVkLmNvbW1hbmQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbamF2YS1sc3BdIGNvZGUgYWN0aW9uIGZhaWxlZDonLCAoZSBhcyBFcnJvcik/Lm1lc3NhZ2UgPz8gZSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBpc1dvcmtzcGFjZUVkaXQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBXb3Jrc3BhY2VFZGl0IHtcbiAgICByZXR1cm4gISF2YWx1ZSAmJiAoISEodmFsdWUgYXMgV29ya3NwYWNlRWRpdCkuY2hhbmdlcyB8fCAhISh2YWx1ZSBhcyBXb3Jrc3BhY2VFZGl0KS5kb2N1bWVudENoYW5nZXMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5TZXJ2ZXJDb21tYW5kKGNtZDogQ29tbWFuZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghX2Nvbm4gfHwgIWNtZD8uY29tbWFuZCkgcmV0dXJuO1xuICAgIGlmIChHRU5FUkFURVtjbWQuY29tbWFuZF0pIHtcbiAgICAgICAgYXdhaXQgcnVuR2VuZXJhdGUoY21kLmNvbW1hbmQsIGNtZC5hcmd1bWVudHMgPz8gW10pO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd3b3Jrc3BhY2UvZXhlY3V0ZUNvbW1hbmQnLCB7IGNvbW1hbmQ6IGNtZC5jb21tYW5kLCBhcmd1bWVudHM6IGNtZC5hcmd1bWVudHMgPz8gW10gfSk7XG4gICAgaWYgKGlzV29ya3NwYWNlRWRpdChyZXN1bHQpKSBhcHBseVdvcmtzcGFjZUVkaXQocmVzdWx0KTtcbn1cblxuaW50ZXJmYWNlIEdlbmVyYXRlU3BlYyB7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICBzdGF0dXM6IHN0cmluZztcbiAgICBnZW5lcmF0ZTogc3RyaW5nO1xuICAgIG1lbWJlcnM6IChzdGF0dXM6IGFueSkgPT4gQXJyYXk8eyBsYWJlbDogc3RyaW5nOyByZWY6IGFueSB9PjtcbiAgICBidWlsZEFyZ3M6IChwcm9tcHRBcmdzOiBhbnlbXSwgc3RhdHVzOiBhbnksIHNlbGVjdGVkOiBhbnlbXSkgPT4gYW55W107XG59XG5cbi8qKiBNZW1iZXItbmFtZWQgZmllbGRzIFx1MjE5MiBwaWNrZXIgbGFiZWxzLiAqL1xuZnVuY3Rpb24gZmllbGRMYWJlbChmOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSBmPy5uYW1lID8/IGY/LmZpZWxkTmFtZSA/PyAnJztcbiAgICBjb25zdCB0eXBlID0gZj8udHlwZSA/PyBmPy50eXBlTmFtZTtcbiAgICByZXR1cm4gdHlwZSA/IGAke25hbWV9OiAke3R5cGV9YCA6IGAke25hbWV9YDtcbn1cblxuLyoqXG4gKiBUaGUgSkRULkxTIHNvdXJjZS1nZW5lcmF0aW9uIGNvbW1hbmRzIChjb25zdHJ1Y3RvcnMsIGdldHRlcnMvc2V0dGVycywgdG9TdHJpbmcsIGhhc2hDb2RlL2VxdWFscykuXG4gKiBFYWNoIG1hcHMgdGhlIGNsaWVudCBcIipQcm9tcHRcIiBjb21tYW5kIHRvIHRoZSBzZXJ2ZXIgc3RhdHVzICsgZ2VuZXJhdGUgZGVsZWdhdGUgY29tbWFuZHM7IHRoZSBzdGF0dXNcbiAqIGNhbGwgeWllbGRzIHRoZSBjYW5kaWRhdGUgZmllbGRzIHNob3duIGluIHRoZSBtZW1iZXIgcGlja2VyLCB0aGUgZ2VuZXJhdGUgY2FsbCByZXR1cm5zIHRoZSBlZGl0LlxuICovXG5jb25zdCBHRU5FUkFURTogUmVjb3JkPHN0cmluZywgR2VuZXJhdGVTcGVjPiA9IHtcbiAgICAnamF2YS5hY3Rpb24uZ2VuZXJhdGVDb25zdHJ1Y3RvcnNQcm9tcHQnOiB7XG4gICAgICAgIGxhYmVsOiAnU2VsZWN0IGZpZWxkcyBhbmQgY29uc3RydWN0b3JzJyxcbiAgICAgICAgc3RhdHVzOiAnamF2YS5hY3Rpb24uY2hlY2tDb25zdHJ1Y3RvcnNTdGF0dXMnLFxuICAgICAgICBnZW5lcmF0ZTogJ2phdmEuYWN0aW9uLmdlbmVyYXRlQ29uc3RydWN0b3JzJyxcbiAgICAgICAgbWVtYmVyczogKHMpID0+IChzPy5maWVsZHMgPz8gW10pLm1hcCgoZjogYW55KSA9PiAoeyBsYWJlbDogZmllbGRMYWJlbChmKSwgcmVmOiBmIH0pKSxcbiAgICAgICAgYnVpbGRBcmdzOiAoYXJncywgcywgc2VsKSA9PiBbYXJnc1swXSwgeyBjb25zdHJ1Y3RvcnM6IHM/LmNvbnN0cnVjdG9ycyA/PyBbXSwgZmllbGRzOiBzZWwubWFwKG0gPT4gbS5yZWYpIH1dLFxuICAgIH0sXG4gICAgJ2phdmEuYWN0aW9uLmdlbmVyYXRlVG9TdHJpbmdQcm9tcHQnOiB7XG4gICAgICAgIGxhYmVsOiAnU2VsZWN0IGZpZWxkcyB0byBpbmNsdWRlIGluIHRvU3RyaW5nKCknLFxuICAgICAgICBzdGF0dXM6ICdqYXZhLmFjdGlvbi5jaGVja1RvU3RyaW5nU3RhdHVzJyxcbiAgICAgICAgZ2VuZXJhdGU6ICdqYXZhLmFjdGlvbi5nZW5lcmF0ZVRvU3RyaW5nJyxcbiAgICAgICAgbWVtYmVyczogKHMpID0+IChzPy5maWVsZHMgPz8gW10pLm1hcCgoZjogYW55KSA9PiAoeyBsYWJlbDogZmllbGRMYWJlbChmKSwgcmVmOiBmIH0pKSxcbiAgICAgICAgYnVpbGRBcmdzOiAoYXJncywgX3MsIHNlbCkgPT4gW2FyZ3NbMF0sIHNlbC5tYXAobSA9PiBtLnJlZildLFxuICAgIH0sXG4gICAgJ2phdmEuYWN0aW9uLmhhc2hDb2RlRXF1YWxzUHJvbXB0Jzoge1xuICAgICAgICBsYWJlbDogJ1NlbGVjdCBmaWVsZHMgZm9yIGhhc2hDb2RlKCkgYW5kIGVxdWFscygpJyxcbiAgICAgICAgc3RhdHVzOiAnamF2YS5hY3Rpb24uY2hlY2tIYXNoQ29kZUVxdWFsc1N0YXR1cycsXG4gICAgICAgIGdlbmVyYXRlOiAnamF2YS5hY3Rpb24uZ2VuZXJhdGVIYXNoQ29kZUVxdWFscycsXG4gICAgICAgIG1lbWJlcnM6IChzKSA9PiAocz8uZmllbGRzID8/IFtdKS5tYXAoKGY6IGFueSkgPT4gKHsgbGFiZWw6IGZpZWxkTGFiZWwoZiksIHJlZjogZiB9KSksXG4gICAgICAgIGJ1aWxkQXJnczogKGFyZ3MsIF9zLCBzZWwpID0+IFthcmdzWzBdLCBzZWwubWFwKG0gPT4gbS5yZWYpLCBmYWxzZV0sXG4gICAgfSxcbiAgICAnamF2YS5hY3Rpb24uZ2VuZXJhdGVBY2Nlc3NvcnNQcm9tcHQnOiB7XG4gICAgICAgIGxhYmVsOiAnU2VsZWN0IGZpZWxkcyB0byBnZW5lcmF0ZSBnZXR0ZXJzIGFuZCBzZXR0ZXJzJyxcbiAgICAgICAgc3RhdHVzOiAnamF2YS5hY3Rpb24uY2hlY2tBY2Nlc3NvcnNTdGF0dXMnLFxuICAgICAgICBnZW5lcmF0ZTogJ2phdmEuYWN0aW9uLmdlbmVyYXRlQWNjZXNzb3JzJyxcbiAgICAgICAgbWVtYmVyczogKHMpID0+IChzPy5hY2Nlc3NvcnMgPz8gcyA/PyBbXSkubWFwKChhOiBhbnkpID0+ICh7IGxhYmVsOiBmaWVsZExhYmVsKGEpLCByZWY6IGEgfSkpLFxuICAgICAgICBidWlsZEFyZ3M6IChhcmdzLCBfcywgc2VsKSA9PiBbYXJnc1swXSwgc2VsLm1hcChtID0+IG0ucmVmKV0sXG4gICAgfSxcbiAgICAnamF2YS5hY3Rpb24ub3ZlcnJpZGVNZXRob2RzUHJvbXB0Jzoge1xuICAgICAgICBsYWJlbDogJ1NlbGVjdCBtZXRob2RzIHRvIG92ZXJyaWRlIG9yIGltcGxlbWVudCcsXG4gICAgICAgIHN0YXR1czogJ2phdmEuYWN0aW9uLmxpc3RPdmVycmlkYWJsZU1ldGhvZHMnLFxuICAgICAgICBnZW5lcmF0ZTogJ2phdmEuYWN0aW9uLmFkZE92ZXJyaWRhYmxlTWV0aG9kcycsXG4gICAgICAgIG1lbWJlcnM6IChzKSA9PiAocz8ubWV0aG9kcyA/PyBbXSkubWFwKChtOiBhbnkpID0+ICh7XG4gICAgICAgICAgICBsYWJlbDogYCR7bS5uYW1lfSgkeyhtLnBhcmFtZXRlcnMgPz8gW10pLmpvaW4oJywgJyl9KSR7bS5kZWNsYXJpbmdDbGFzcyA/ICcgOiAnICsgbS5kZWNsYXJpbmdDbGFzcyA6ICcnfWAsXG4gICAgICAgICAgICByZWY6IG0sXG4gICAgICAgIH0pKSxcbiAgICAgICAgYnVpbGRBcmdzOiAoYXJncywgc3RhdHVzLCBzZWwpID0+IFthcmdzWzBdLCB7IG92ZXJyaWRhYmxlTWV0aG9kczogc2VsLm1hcChtID0+IG0ucmVmKSwgdHlwZTogc3RhdHVzPy50eXBlIH1dLFxuICAgIH0sXG59O1xuXG5hc3luYyBmdW5jdGlvbiBydW5HZW5lcmF0ZShwcm9tcHRJZDogc3RyaW5nLCBhcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghX2Nvbm4pIHJldHVybjtcbiAgICBjb25zdCBzcGVjID0gR0VORVJBVEVbcHJvbXB0SWRdO1xuICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd3b3Jrc3BhY2UvZXhlY3V0ZUNvbW1hbmQnLCB7IGNvbW1hbmQ6IHNwZWMuc3RhdHVzLCBhcmd1bWVudHM6IGFyZ3MgfSk7XG4gICAgaWYgKCFzdGF0dXMpIHJldHVybjtcbiAgICBjb25zdCBtZW1iZXJzID0gc3BlYy5tZW1iZXJzKHN0YXR1cyk7XG4gICAgbGV0IHNlbGVjdGVkID0gbWVtYmVycztcbiAgICBjb25zdCBwaWNrZXIgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLmphdmFMc3BNZW1iZXJQaWNrZXI7XG4gICAgaWYgKG1lbWJlcnMubGVuZ3RoICYmIHR5cGVvZiBwaWNrZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY29uc3QgY2hvc2VuOiBzdHJpbmdbXSB8IG51bGwgPSBhd2FpdCBwaWNrZXIoc3BlYy5sYWJlbCwgbWVtYmVycy5tYXAobSA9PiBtLmxhYmVsKSk7XG4gICAgICAgIGlmIChjaG9zZW4gPT09IG51bGwpIHJldHVybjsgLy8gdXNlciBjYW5jZWxsZWQgdGhlIGRpYWxvZ1xuICAgICAgICBzZWxlY3RlZCA9IG1lbWJlcnMuZmlsdGVyKG0gPT4gY2hvc2VuLmluY2x1ZGVzKG0ubGFiZWwpKTtcbiAgICB9XG4gICAgY29uc3QgZWRpdCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd3b3Jrc3BhY2UvZXhlY3V0ZUNvbW1hbmQnLCB7XG4gICAgICAgIGNvbW1hbmQ6IHNwZWMuZ2VuZXJhdGUsXG4gICAgICAgIGFyZ3VtZW50czogc3BlYy5idWlsZEFyZ3MoYXJncywgc3RhdHVzLCBzZWxlY3RlZCksXG4gICAgfSk7XG4gICAgaWYgKGlzV29ya3NwYWNlRWRpdChlZGl0KSkgYXBwbHlXb3Jrc3BhY2VFZGl0KGVkaXQpO1xufVxuXG4vKiogR3JvdXBzIGEgd29ya3NwYWNlIGVkaXQncyB0ZXh0IGVkaXRzIGJ5IGRvY3VtZW50IGFuZCBhcHBsaWVzIHRoZW0gaW4gcGxhY2UgdG8gb3BlbiBNb25hY28gbW9kZWxzLiAqL1xuZnVuY3Rpb24gYXBwbHlXb3Jrc3BhY2VFZGl0KGVkaXQ6IFdvcmtzcGFjZUVkaXQgfCBudWxsIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0KSByZXR1cm47XG4gICAgY29uc3QgYnlVcmk6IFJlY29yZDxzdHJpbmcsIFRleHRFZGl0W10+ID0ge307XG4gICAgaWYgKGVkaXQuY2hhbmdlcykge1xuICAgICAgICBmb3IgKGNvbnN0IHVyaSBpbiBlZGl0LmNoYW5nZXMpIGJ5VXJpW3VyaV0gPSAoYnlVcmlbdXJpXSA/PyBbXSkuY29uY2F0KGVkaXQuY2hhbmdlc1t1cmldKTtcbiAgICB9XG4gICAgaWYgKGVkaXQuZG9jdW1lbnRDaGFuZ2VzKSB7XG4gICAgICAgIGZvciAoY29uc3QgZGMgb2YgZWRpdC5kb2N1bWVudENoYW5nZXMgYXMgYW55W10pIHtcbiAgICAgICAgICAgIGlmIChkYz8udGV4dERvY3VtZW50Py51cmkgJiYgQXJyYXkuaXNBcnJheShkYy5lZGl0cykpIHtcbiAgICAgICAgICAgICAgICBieVVyaVtkYy50ZXh0RG9jdW1lbnQudXJpXSA9IChieVVyaVtkYy50ZXh0RG9jdW1lbnQudXJpXSA/PyBbXSkuY29uY2F0KGRjLmVkaXRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IHVyaSBpbiBieVVyaSkge1xuICAgICAgICBjb25zdCBtb2RlbCA9IG1vbmFjby5lZGl0b3IuZ2V0TW9kZWxzKCkuZmluZChtID0+IG0udXJpLnRvU3RyaW5nKCkgPT09IHVyaSk7XG4gICAgICAgIGlmICghbW9kZWwpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBvcHMgPSBieVVyaVt1cmldLm1hcChlID0+ICh7IHJhbmdlOiBsc3BSYW5nZVRvTW9uYWNvKGUucmFuZ2UpLCB0ZXh0OiBlLm5ld1RleHQsIGZvcmNlTW92ZU1hcmtlcnM6IHRydWUgfSkpO1xuICAgICAgICBtb2RlbC5wdXNoRWRpdE9wZXJhdGlvbnMoW10sIG9wcywgKCkgPT4gbnVsbCk7XG4gICAgfVxufVxuXG4vKiogQ29udmVydHMgYW4gTFNQIHdvcmtzcGFjZSBlZGl0IGludG8gdGhlIE1vbmFjbyBzaGFwZSByZXR1cm5lZCBieSB0aGUgcmVuYW1lIHByb3ZpZGVyLiAqL1xuZnVuY3Rpb24gd29ya3NwYWNlRWRpdFRvTW9uYWNvKGVkaXQ6IFdvcmtzcGFjZUVkaXQgfCBudWxsKTogbW9uYWNvLmxhbmd1YWdlcy5Xb3Jrc3BhY2VFZGl0IHtcbiAgICBjb25zdCBlZGl0czogYW55W10gPSBbXTtcbiAgICBjb25zdCBwdXNoID0gKHVyaTogc3RyaW5nLCBsaXN0OiBUZXh0RWRpdFtdKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgZSBvZiBsaXN0KSB7XG4gICAgICAgICAgICBlZGl0cy5wdXNoKHsgcmVzb3VyY2U6IG1vbmFjby5VcmkucGFyc2UodXJpKSwgdGV4dEVkaXQ6IHsgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28oZS5yYW5nZSksIHRleHQ6IGUubmV3VGV4dCB9LCB2ZXJzaW9uSWQ6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgaWYgKGVkaXQ/LmNoYW5nZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCB1cmkgaW4gZWRpdC5jaGFuZ2VzKSBwdXNoKHVyaSwgZWRpdC5jaGFuZ2VzW3VyaV0pO1xuICAgIH1cbiAgICBpZiAoZWRpdD8uZG9jdW1lbnRDaGFuZ2VzKSB7XG4gICAgICAgIGZvciAoY29uc3QgZGMgb2YgZWRpdC5kb2N1bWVudENoYW5nZXMgYXMgYW55W10pIHtcbiAgICAgICAgICAgIGlmIChkYz8udGV4dERvY3VtZW50Py51cmkgJiYgQXJyYXkuaXNBcnJheShkYy5lZGl0cykpIHB1c2goZGMudGV4dERvY3VtZW50LnVyaSwgZGMuZWRpdHMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGVkaXRzIH07XG59XG5cbi8qKiBNYXBzIGEgdmlydHVhbCBlZGl0b3IgVVJJIGJhY2sgdG8gdGhlIElERSB3b3Jrc3BhY2UgcGF0aCAoe0Bjb2RlIC93cy9wcm9qLy4uLn0pLiAqL1xuZnVuY3Rpb24gdXJpVG9Xb3Jrc3BhY2VQYXRoKHVyaTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCF1cmkuc3RhcnRzV2l0aChWSVJUVUFMX0ZJTEVfUFJFRklYKSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh1cmkuc3Vic3RyaW5nKFZJUlRVQUxfRklMRV9QUkVGSVgubGVuZ3RoKSk7XG59XG5cbi8qKiBSZWFkcyBhIHdvcmtzcGFjZSBmaWxlJ3MgY3VycmVudCB0ZXh0IG92ZXIgdGhlIElERSBSRVNUIEFQSS4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZldGNoV29ya3NwYWNlRmlsZVRleHQoaWRlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvc2VydmljZXMvaWRlL3dvcmtzcGFjZXMnICsgaWRlUGF0aCwgeyBoZWFkZXJzOiB7ICdYLVJlcXVlc3RlZC1XaXRoJzogJ0ZldGNoJyB9IH0pO1xuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgcmVhZCAke2lkZVBhdGh9IChIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfSlgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTtcbn1cblxuLyoqIEFwcGxpZXMgTFNQIHRleHQgZWRpdHMgdG8gYSBzdHJpbmcuIE9mZnNldHMgYXJlIHJlc29sdmVkIGFnYWluc3QgdGhlIG9yaWdpbmFsIHRleHQgYW5kIGVkaXRzIGFyZVxuICogIGFwcGxpZWQgZnJvbSB0aGUgZW5kIGJhY2t3YXJkcywgc28gZWFybGllciBvZmZzZXRzIHN0YXkgdmFsaWQuICovXG5mdW5jdGlvbiBhcHBseUVkaXRzVG9UZXh0KHRleHQ6IHN0cmluZywgZWRpdHM6IFRleHRFZGl0W10pOiBzdHJpbmcge1xuICAgIGNvbnN0IGxpbmVTdGFydHMgPSBbMF07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICh0ZXh0LmNoYXJDb2RlQXQoaSkgPT09IDEwIC8qIFxcbiAqLykgbGluZVN0YXJ0cy5wdXNoKGkgKyAxKTtcbiAgICB9XG4gICAgY29uc3Qgb2Zmc2V0ID0gKHA6IHsgbGluZTogbnVtYmVyOyBjaGFyYWN0ZXI6IG51bWJlciB9KSA9PiAobGluZVN0YXJ0c1twLmxpbmVdID8/IHRleHQubGVuZ3RoKSArIHAuY2hhcmFjdGVyO1xuICAgIGNvbnN0IG9yZGVyZWQgPSBlZGl0cy5zbGljZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IG9mZnNldChiLnJhbmdlLnN0YXJ0KSAtIG9mZnNldChhLnJhbmdlLnN0YXJ0KSk7XG4gICAgbGV0IHJlc3VsdCA9IHRleHQ7XG4gICAgZm9yIChjb25zdCBlIG9mIG9yZGVyZWQpIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnNsaWNlKDAsIG9mZnNldChlLnJhbmdlLnN0YXJ0KSkgKyBlLm5ld1RleHQgKyByZXN1bHQuc2xpY2Uob2Zmc2V0KGUucmFuZ2UuZW5kKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQXBwbGllcyBhIEpEVC5MUyByZW5hbWUge0BsaW5rIFdvcmtzcGFjZUVkaXR9IGFjcm9zcyB0aGUgd2hvbGUgd29ya3NwYWNlOiB0ZXh0IGVkaXRzIGluIGV2ZXJ5XG4gKiBhZmZlY3RlZCBmaWxlIHBsdXMgYW55IHtAY29kZSBSZW5hbWVGaWxlfSBvcGVyYXRpb24gKGEgcHVibGljLXR5cGUgcmVuYW1lIHJlbmFtZXMgaXRzIG93blxuICoge0Bjb2RlIC5qYXZhfSBmaWxlKS4gVGhlIGN1cnJlbnQgZmlsZSdzIGVkaXRzIGdvIHRocm91Z2ggdGhlIGxpdmUgTW9uYWNvIG1vZGVsOyB0aGUgcmVzdCBhcmUgcmVhZCxcbiAqIGVkaXRlZCBhbmQgd3JpdHRlbiBiYWNrIG92ZXIgUkVTVC4gUGVyc2lzdGVuY2UgKENTUkYtZ3VhcmRlZCB3cml0ZXMsIHRoZSB0YWIgc3dpdGNoIHdoZW4gdGhlIGN1cnJlbnRcbiAqIGZpbGUgaXMgcmVuYW1lZCwgYW5kIHJlbG9hZGluZyBvdGhlciBvcGVuIGVkaXRvcnMpIGlzIGRlbGVnYXRlZCB0byB0aGUgSURFIHZpYSBqYXZhTHNwUGVyc2lzdFJlbmFtZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYXBwbHlSZW5hbWVBY3Jvc3NXb3Jrc3BhY2UobW9kZWw6IG1vbmFjby5lZGl0b3IuSVRleHRNb2RlbCwgZWRpdDogV29ya3NwYWNlRWRpdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGN1cnJlbnRVcmkgPSBtb2RlbC51cmkudG9TdHJpbmcoKTtcbiAgICBjb25zdCB0ZXh0QnlVcmk6IFJlY29yZDxzdHJpbmcsIFRleHRFZGl0W10+ID0ge307XG4gICAgY29uc3QgcmVuYW1lQnlVcmk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgIGlmIChlZGl0LmNoYW5nZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCB1cmkgaW4gZWRpdC5jaGFuZ2VzKSB0ZXh0QnlVcmlbdXJpXSA9ICh0ZXh0QnlVcmlbdXJpXSA/PyBbXSkuY29uY2F0KGVkaXQuY2hhbmdlc1t1cmldKTtcbiAgICB9XG4gICAgaWYgKGVkaXQuZG9jdW1lbnRDaGFuZ2VzKSB7XG4gICAgICAgIGZvciAoY29uc3QgZGMgb2YgZWRpdC5kb2N1bWVudENoYW5nZXMgYXMgYW55W10pIHtcbiAgICAgICAgICAgIGlmIChkYz8ua2luZCA9PT0gJ3JlbmFtZScgJiYgZGMub2xkVXJpICYmIGRjLm5ld1VyaSkge1xuICAgICAgICAgICAgICAgIHJlbmFtZUJ5VXJpW2RjLm9sZFVyaV0gPSBkYy5uZXdVcmk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRjPy50ZXh0RG9jdW1lbnQ/LnVyaSAmJiBBcnJheS5pc0FycmF5KGRjLmVkaXRzKSkge1xuICAgICAgICAgICAgICAgIHRleHRCeVVyaVtkYy50ZXh0RG9jdW1lbnQudXJpXSA9ICh0ZXh0QnlVcmlbZGMudGV4dERvY3VtZW50LnVyaV0gPz8gW10pLmNvbmNhdChkYy5lZGl0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBwYXlsb2FkOiB7XG4gICAgICAgIGN1cnJlbnRQYXRoOiBzdHJpbmcgfCBudWxsO1xuICAgICAgICBjdXJyZW50Q29udGVudDogc3RyaW5nIHwgbnVsbDtcbiAgICAgICAgY3VycmVudE5ld1BhdGg6IHN0cmluZyB8IG51bGw7XG4gICAgICAgIHdyaXRlczogQXJyYXk8eyBwYXRoOiBzdHJpbmcgfCBudWxsOyBjb250ZW50OiBzdHJpbmcgfT47XG4gICAgICAgIHJlbmFtZXM6IEFycmF5PHsgb2xkUGF0aDogc3RyaW5nIHwgbnVsbDsgbmV3UGF0aDogc3RyaW5nIHwgbnVsbDsgY29udGVudDogc3RyaW5nIH0+O1xuICAgIH0gPSB7IGN1cnJlbnRQYXRoOiB1cmlUb1dvcmtzcGFjZVBhdGgoY3VycmVudFVyaSksIGN1cnJlbnRDb250ZW50OiBudWxsLCBjdXJyZW50TmV3UGF0aDogbnVsbCwgd3JpdGVzOiBbXSwgcmVuYW1lczogW10gfTtcblxuICAgIGNvbnN0IHVyaXMgPSBuZXcgU2V0PHN0cmluZz4oWy4uLk9iamVjdC5rZXlzKHRleHRCeVVyaSksIC4uLk9iamVjdC5rZXlzKHJlbmFtZUJ5VXJpKV0pO1xuICAgIGZvciAoY29uc3QgdXJpIG9mIHVyaXMpIHtcbiAgICAgICAgY29uc3QgZWRpdHMgPSB0ZXh0QnlVcmlbdXJpXSA/PyBbXTtcbiAgICAgICAgbGV0IGNvbnRlbnQ6IHN0cmluZztcbiAgICAgICAgaWYgKHVyaSA9PT0gY3VycmVudFVyaSkge1xuICAgICAgICAgICAgaWYgKGVkaXRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIG1vZGVsLnB1c2hFZGl0T3BlcmF0aW9ucyhbXSwgZWRpdHMubWFwKGUgPT4gKHsgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28oZS5yYW5nZSksIHRleHQ6IGUubmV3VGV4dCwgZm9yY2VNb3ZlTWFya2VyczogdHJ1ZSB9KSksICgpID0+IG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGVudCA9IG1vZGVsLmdldFZhbHVlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBhd2FpdCBmZXRjaFdvcmtzcGFjZUZpbGVUZXh0KHVyaVRvV29ya3NwYWNlUGF0aCh1cmkpID8/IHVyaSk7XG4gICAgICAgICAgICBjb250ZW50ID0gZWRpdHMubGVuZ3RoID8gYXBwbHlFZGl0c1RvVGV4dChzb3VyY2UsIGVkaXRzKSA6IHNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdVcmkgPSByZW5hbWVCeVVyaVt1cmldO1xuICAgICAgICBpZiAodXJpID09PSBjdXJyZW50VXJpKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmN1cnJlbnRDb250ZW50ID0gY29udGVudDtcbiAgICAgICAgICAgIHBheWxvYWQuY3VycmVudE5ld1BhdGggPSBuZXdVcmkgPyB1cmlUb1dvcmtzcGFjZVBhdGgobmV3VXJpKSA6IG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAobmV3VXJpKSB7XG4gICAgICAgICAgICBwYXlsb2FkLnJlbmFtZXMucHVzaCh7IG9sZFBhdGg6IHVyaVRvV29ya3NwYWNlUGF0aCh1cmkpLCBuZXdQYXRoOiB1cmlUb1dvcmtzcGFjZVBhdGgobmV3VXJpKSwgY29udGVudCB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBheWxvYWQud3JpdGVzLnB1c2goeyBwYXRoOiB1cmlUb1dvcmtzcGFjZVBhdGgodXJpKSwgY29udGVudCB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IChnbG9iYWxUaGlzIGFzIGFueSkuamF2YUxzcFBlcnNpc3RSZW5hbWUocGF5bG9hZCk7XG59XG5cbmZ1bmN0aW9uIGpkdGxzU2V0dGluZ3MoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgamF2YToge1xuICAgICAgICAgICAgaW1wb3J0OiB7XG4gICAgICAgICAgICAgICAgbWF2ZW46ICAgICAgeyBlbmFibGVkOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgZ3JhZGxlOiAgICAgeyBlbmFibGVkOiBmYWxzZSB9LFxuICAgICAgICAgICAgICAgIGV4Y2x1c2lvbnM6IFsnKiovbm9kZV9tb2R1bGVzLyoqJywgJyoqLy5tZXRhZGF0YS8qKicsICcqKi9hcmNoZXR5cGUtcmVzb3VyY2VzLyoqJ10sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYXV0b2J1aWxkOiB7IGVuYWJsZWQ6IHRydWUgfSxcbiAgICAgICAgICAgIGNvbXBsZXRpb246IHtcbiAgICAgICAgICAgICAgICBvdmVyd3JpdGU6ICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICBndWVzc01ldGhvZEFyZ3VtZW50czogZmFsc2UsXG4gICAgICAgICAgICAgICAgZmlsdGVyZWRUeXBlczogW1xuICAgICAgICAgICAgICAgICAgICAnY29tLnN1bi4qJywgJ3N1bi4qJywgJ2pkay4qJyxcbiAgICAgICAgICAgICAgICAgICAgJ29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC4qJyxcbiAgICAgICAgICAgICAgICAgICAgJ29yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuKicsXG4gICAgICAgICAgICAgICAgICAgICdvcmcuZWNsaXBzZS5vc2dpLmludGVybmFsLionLFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgaW1wb3J0T3JkZXI6IFsnamF2YScsICdqYXZheCcsICdvcmcnLCAnY29tJywgJyddLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNpZ25hdHVyZUhlbHA6ICB7IGVuYWJsZWQ6IHRydWUgfSxcbiAgICAgICAgICAgIGZvcm1hdDogICAgICAgICB7IGVuYWJsZWQ6IHRydWUgfSxcbiAgICAgICAgICAgIHNhdmVBY3Rpb25zOiAgICB7IG9yZ2FuaXplSW1wb3J0czogZmFsc2UgfSxcbiAgICAgICAgICAgIGlubGF5SGludHM6ICAgICB7IHBhcmFtZXRlck5hbWVzOiB7IGVuYWJsZWQ6ICdhbGwnIH0gfSxcbiAgICAgICAgICAgIHJlZmVyZW5jZXNDb2RlTGVuczogICAgIHsgZW5hYmxlZDogdHJ1ZSB9LFxuICAgICAgICAgICAgaW1wbGVtZW50YXRpb25zQ29kZUxlbnM6IHsgZW5hYmxlZDogdHJ1ZSB9LFxuICAgICAgICB9LFxuICAgIH07XG59XG4iLCAiLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgMjAyNCBUeXBlRm94IGFuZCBvdGhlcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMSUNFTlNFIGluIHRoZSBwYWNrYWdlIHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuaW1wb3J0IHsgRGlzcG9zYWJsZSB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcblxuZXhwb3J0IGNsYXNzIERpc3Bvc2FibGVDb2xsZWN0aW9uIGltcGxlbWVudHMgRGlzcG9zYWJsZSB7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGRpc3Bvc2FibGVzOiBEaXNwb3NhYmxlW10gPSBbXTtcblxuICAgIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgICAgIHdoaWxlICh0aGlzLmRpc3Bvc2FibGVzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgdGhpcy5kaXNwb3NhYmxlcy5wb3AoKSEuZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVzaChkaXNwb3NhYmxlOiBEaXNwb3NhYmxlKTogRGlzcG9zYWJsZSB7XG4gICAgICAgIGNvbnN0IGRpc3Bvc2FibGVzID0gdGhpcy5kaXNwb3NhYmxlcztcbiAgICAgICAgZGlzcG9zYWJsZXMucHVzaChkaXNwb3NhYmxlKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBkaXNwb3NhYmxlcy5pbmRleE9mKGRpc3Bvc2FibGUpO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgZGlzcG9zYWJsZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxufVxuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjQgVHlwZUZveCBhbmQgb3RoZXJzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTElDRU5TRSBpbiB0aGUgcGFja2FnZSByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbmltcG9ydCB7IERpc3Bvc2FibGUgfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG5pbXBvcnQgdHlwZSB7IElDb25uZWN0aW9uIH0gZnJvbSAnLi4vc2VydmVyL2Nvbm5lY3Rpb24uanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElXZWJTb2NrZXQgZXh0ZW5kcyBEaXNwb3NhYmxlIHtcbiAgICBzZW5kKGNvbnRlbnQ6IHN0cmluZyk6IHZvaWQ7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBvbk1lc3NhZ2UoY2I6IChkYXRhOiBhbnkpID0+IHZvaWQpOiB2b2lkO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgb25FcnJvcihjYjogKHJlYXNvbjogYW55KSA9PiB2b2lkKTogdm9pZDtcbiAgICBvbkNsb3NlKGNiOiAoY29kZTogbnVtYmVyLCByZWFzb246IHN0cmluZykgPT4gdm9pZCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVdlYlNvY2tldENvbm5lY3Rpb24gZXh0ZW5kcyBJQ29ubmVjdGlvbiB7XG4gICAgcmVhZG9ubHkgc29ja2V0OiBJV2ViU29ja2V0O1xufVxuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjQgVHlwZUZveCBhbmQgb3RoZXJzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTElDRU5TRSBpbiB0aGUgcGFja2FnZSByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbmltcG9ydCB7IERpc3Bvc2FibGUgfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG4vLyBUT0RPOiBVc2UgZW52aXJvbm1lbnQtc3BlY2lmaWMgaW1wb3J0cyAodnNjb2RlLWpzb25ycGMvYnJvd3NlciBvciB2c2NvZGUtanNvbnJwYy9ub2RlKVxuLy8gd2hlbiB1cGdyYWRpbmcgdG8gdnNjb2RlLWpzb25ycGNAOS54LngtbmV4dC5YIHdoaWNoIHN1cHBvcnRzIHByb3BlciBleHBvcnQgbWFwc1xuaW1wb3J0IHsgdHlwZSBEYXRhQ2FsbGJhY2ssIEFic3RyYWN0TWVzc2FnZVJlYWRlciwgTWVzc2FnZVJlYWRlciB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcbmltcG9ydCB0eXBlIHsgSVdlYlNvY2tldCB9IGZyb20gJy4vc29ja2V0LmpzJztcblxuZXhwb3J0IGNsYXNzIFdlYlNvY2tldE1lc3NhZ2VSZWFkZXIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VSZWFkZXIgaW1wbGVtZW50cyBNZXNzYWdlUmVhZGVyIHtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgc29ja2V0OiBJV2ViU29ja2V0O1xuICAgIHByb3RlY3RlZCBzdGF0ZTogJ2luaXRpYWwnIHwgJ2xpc3RlbmluZycgfCAnY2xvc2VkJyA9ICdpbml0aWFsJztcbiAgICBwcm90ZWN0ZWQgY2FsbGJhY2s6IERhdGFDYWxsYmFjayB8IHVuZGVmaW5lZDtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHByb3RlY3RlZCByZWFkb25seSBldmVudHM6IEFycmF5PHsgbWVzc2FnZT86IGFueSwgZXJyb3I/OiBhbnkgfT4gPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKHNvY2tldDogSVdlYlNvY2tldCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnNvY2tldCA9IHNvY2tldDtcbiAgICAgICAgdGhpcy5zb2NrZXQub25NZXNzYWdlKG1lc3NhZ2UgPT5cbiAgICAgICAgICAgIHRoaXMucmVhZE1lc3NhZ2UobWVzc2FnZSlcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zb2NrZXQub25FcnJvcihlcnJvciA9PlxuICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc29ja2V0Lm9uQ2xvc2UoKGNvZGUsIHJlYXNvbikgPT4ge1xuICAgICAgICAgICAgaWYgKGNvZGUgIT09IDEwMDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvcjogRXJyb3IgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICcnICsgY29kZSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYEVycm9yIGR1cmluZyBzb2NrZXQgcmVjb25uZWN0OiBjb2RlID0gJHtjb2RlfSwgcmVhc29uID0gJHtyZWFzb259YFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5maXJlQ2xvc2UoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbGlzdGVuKGNhbGxiYWNrOiBEYXRhQ2FsbGJhY2spOiBEaXNwb3NhYmxlIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09ICdpbml0aWFsJykge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9ICdsaXN0ZW5pbmcnO1xuICAgICAgICAgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgICAgICAgd2hpbGUgKHRoaXMuZXZlbnRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gdGhpcy5ldmVudHMucG9wKCkhO1xuICAgICAgICAgICAgICAgIGlmIChldmVudC5tZXNzYWdlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWFkTWVzc2FnZShldmVudC5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXZlbnQuZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZUNsb3NlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkaXNwb3NlOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2FsbGJhY2sgPT09IGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSAnaW5pdGlhbCc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsbGJhY2sgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIG92ZXJyaWRlIGRpc3Bvc2UoKSB7XG4gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9ICdpbml0aWFsJztcbiAgICAgICAgdGhpcy5jYWxsYmFjayA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5ldmVudHMuc3BsaWNlKDAsIHRoaXMuZXZlbnRzLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBwcm90ZWN0ZWQgcmVhZE1lc3NhZ2UobWVzc2FnZTogYW55KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09PSAnaW5pdGlhbCcpIHtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRzLnNwbGljZSgwLCAwLCB7IG1lc3NhZ2UgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZSA9PT0gJ2xpc3RlbmluZycpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjayEoZGF0YSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvcjogRXJyb3IgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICcnICsgNDAwLFxuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgRXJyb3IgZHVyaW5nIG1lc3NhZ2UgcGFyc2luZywgcmVhc29uID0gJHt0eXBlb2YgZXJyID09PSAnb2JqZWN0JyA/IChlcnIgYXMgYW55KS5tZXNzYWdlIDogJ3Vua25vd24nfWBcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIGZpcmVFcnJvcihlcnJvcjogYW55KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09PSAnaW5pdGlhbCcpIHtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRzLnNwbGljZSgwLCAwLCB7IGVycm9yIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUgPT09ICdsaXN0ZW5pbmcnKSB7XG4gICAgICAgICAgICBzdXBlci5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIGZpcmVDbG9zZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09ICdpbml0aWFsJykge1xuICAgICAgICAgICAgdGhpcy5ldmVudHMuc3BsaWNlKDAsIDAsIHt9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlID09PSAnbGlzdGVuaW5nJykge1xuICAgICAgICAgICAgc3VwZXIuZmlyZUNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGF0ZSA9ICdjbG9zZWQnO1xuICAgIH1cbn1cbiIsICIvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSAyMDI0IFR5cGVGb3ggYW5kIG90aGVycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExJQ0VOU0UgaW4gdGhlIHBhY2thZ2Ugcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5pbXBvcnQgeyBNZXNzYWdlIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuaW1wb3J0IHsgQWJzdHJhY3RNZXNzYWdlV3JpdGVyLCBNZXNzYWdlV3JpdGVyIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuaW1wb3J0IHR5cGUgeyBJV2ViU29ja2V0IH0gZnJvbSAnLi9zb2NrZXQuanMnO1xuXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0TWVzc2FnZVdyaXRlciBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVdyaXRlciBpbXBsZW1lbnRzIE1lc3NhZ2VXcml0ZXIge1xuICAgIHByb3RlY3RlZCBlcnJvckNvdW50ID0gMDtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgc29ja2V0OiBJV2ViU29ja2V0O1xuXG4gICAgY29uc3RydWN0b3Ioc29ja2V0OiBJV2ViU29ja2V0KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuc29ja2V0ID0gc29ja2V0O1xuICAgIH1cblxuICAgIGVuZCgpOiB2b2lkIHtcbiAgICB9XG5cbiAgICBhc3luYyB3cml0ZShtc2c6IE1lc3NhZ2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShtc2cpO1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChjb250ZW50KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5lcnJvckNvdW50Kys7XG4gICAgICAgICAgICB0aGlzLmZpcmVFcnJvcihlLCBtc2csIHRoaXMuZXJyb3JDb3VudCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgMjAyNCBUeXBlRm94IGFuZCBvdGhlcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMSUNFTlNFIGluIHRoZSBwYWNrYWdlIHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuaW1wb3J0IHR5cGUgeyBNZXNzYWdlQ29ubmVjdGlvbiwgTG9nZ2VyIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuaW1wb3J0IHsgY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24gfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG5pbXBvcnQgdHlwZSB7IElXZWJTb2NrZXQgfSBmcm9tICcuL3NvY2tldC5qcyc7XG5pbXBvcnQgeyBXZWJTb2NrZXRNZXNzYWdlUmVhZGVyIH0gZnJvbSAnLi9yZWFkZXIuanMnO1xuaW1wb3J0IHsgV2ViU29ja2V0TWVzc2FnZVdyaXRlciB9IGZyb20gJy4vd3JpdGVyLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdlYlNvY2tldENvbm5lY3Rpb24oc29ja2V0OiBJV2ViU29ja2V0LCBsb2dnZXI6IExvZ2dlcik6IE1lc3NhZ2VDb25uZWN0aW9uIHtcbiAgICBjb25zdCBtZXNzYWdlUmVhZGVyID0gbmV3IFdlYlNvY2tldE1lc3NhZ2VSZWFkZXIoc29ja2V0KTtcbiAgICBjb25zdCBtZXNzYWdlV3JpdGVyID0gbmV3IFdlYlNvY2tldE1lc3NhZ2VXcml0ZXIoc29ja2V0KTtcbiAgICBjb25zdCBjb25uZWN0aW9uID0gY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24obWVzc2FnZVJlYWRlciwgbWVzc2FnZVdyaXRlciwgbG9nZ2VyKTtcbiAgICBjb25uZWN0aW9uLm9uQ2xvc2UoKCkgPT4gY29ubmVjdGlvbi5kaXNwb3NlKCkpO1xuICAgIHJldHVybiBjb25uZWN0aW9uO1xufVxuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjQgVHlwZUZveCBhbmQgb3RoZXJzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTElDRU5TRSBpbiB0aGUgcGFja2FnZSByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbmltcG9ydCB0eXBlIHsgTWVzc2FnZUNvbm5lY3Rpb24sIExvZ2dlciB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcbmltcG9ydCB7IGNyZWF0ZVdlYlNvY2tldENvbm5lY3Rpb24gfSBmcm9tICcuL3NvY2tldC9jb25uZWN0aW9uLmpzJztcbmltcG9ydCB0eXBlIHsgSVdlYlNvY2tldCB9IGZyb20gJy4vc29ja2V0L3NvY2tldC5qcyc7XG5pbXBvcnQgeyBDb25zb2xlTG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gbGlzdGVuKG9wdGlvbnM6IHtcbiAgICB3ZWJTb2NrZXQ6IFdlYlNvY2tldDtcbiAgICBsb2dnZXI/OiBMb2dnZXI7XG4gICAgb25Db25uZWN0aW9uOiAoY29ubmVjdGlvbjogTWVzc2FnZUNvbm5lY3Rpb24pID0+IHZvaWQ7XG59KSB7XG4gICAgY29uc3QgeyB3ZWJTb2NrZXQsIG9uQ29ubmVjdGlvbiB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBsb2dnZXIgPSBvcHRpb25zLmxvZ2dlciB8fCBuZXcgQ29uc29sZUxvZ2dlcigpO1xuICAgIHdlYlNvY2tldC5vbm9wZW4gPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNvY2tldCA9IHRvU29ja2V0KHdlYlNvY2tldCk7XG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBjcmVhdGVXZWJTb2NrZXRDb25uZWN0aW9uKHNvY2tldCwgbG9nZ2VyKTtcbiAgICAgICAgb25Db25uZWN0aW9uKGNvbm5lY3Rpb24pO1xuICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1NvY2tldCh3ZWJTb2NrZXQ6IFdlYlNvY2tldCk6IElXZWJTb2NrZXQge1xuICAgIHJldHVybiB7XG4gICAgICAgIHNlbmQ6IGNvbnRlbnQgPT4gd2ViU29ja2V0LnNlbmQoY29udGVudCksXG4gICAgICAgIG9uTWVzc2FnZTogY2IgPT4ge1xuICAgICAgICAgICAgd2ViU29ja2V0Lm9ubWVzc2FnZSA9IGV2ZW50ID0+IGNiKGV2ZW50LmRhdGEpO1xuICAgICAgICB9LFxuICAgICAgICBvbkVycm9yOiBjYiA9PiB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgd2ViU29ja2V0Lm9uZXJyb3IgPSAoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3QuaGFzT3duKGV2ZW50LCAnbWVzc2FnZScpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNiKGV2ZW50Lm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIG9uQ2xvc2U6IGNiID0+IHtcbiAgICAgICAgICAgIHdlYlNvY2tldC5vbmNsb3NlID0gZXZlbnQgPT4gY2IoZXZlbnQuY29kZSwgZXZlbnQucmVhc29uKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGlzcG9zZTogKCkgPT4gd2ViU29ja2V0LmNsb3NlKClcbiAgICB9O1xufVxuIiwgIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAyNiBFY2xpcHNlIERpcmlnaWJsZSBjb250cmlidXRvcnNcbiAqXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGVcbiAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYyLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcbiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYyMC5odG1sXG4gKlxuICogU1BEWC1GaWxlQ29weXJpZ2h0VGV4dDogRWNsaXBzZSBEaXJpZ2libGUgY29udHJpYnV0b3JzIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wXG4gKi9cblxuLyoqXG4gKiBMYXp5IFByb3h5IHNoaW0gZm9yIE1vbmFjbyBFZGl0b3IgbG9hZGVkIHZpYSBBTUQuXG4gKlxuICogZWRpdG9yLmpzIHNldHMgZ2xvYmFsVGhpcy5tb25hY28gaW5zaWRlIHRoZSBBTUQgcmVxdWlyZSgpIGNhbGxiYWNrLCBiZWZvcmUgYW55XG4gKiBKYXZhTHNwQ2xpZW50TGliLmNvbm5lY3QoKSBjYWxsLiBBbGwgcHJvcGVydHkgYWNjZXNzZXMgZ28gdGhyb3VnaCBQcm94eS5nZXQoKSB0cmFwc1xuICogc28gdGhleSByZXNvbHZlIGFnYWluc3QgdGhlIGxpdmUgd2luZG93Lm1vbmFjbyBhdCBjYWxsIHRpbWUsIG5vdCBhdCBidW5kbGUgbG9hZCB0aW1lLlxuICpcbiAqIFR5cGVTY3JpcHQgcmVzb2x2ZXMgdHlwZXMgZnJvbSB0aGUgcmVhbCBtb25hY28tZWRpdG9yIGRldkRlcGVuZGVuY3k7IGVzYnVpbGQgcmVwbGFjZXNcbiAqIHRoZSBcIm1vbmFjby1lZGl0b3JcIiBpbXBvcnQgd2l0aCB0aGlzIGZpbGUgYXQgYnVuZGxlIHRpbWUgdmlhIHRoZSBhbGlhcyBvcHRpb24uXG4gKi9cblxudHlwZSBNID0gdHlwZW9mIGltcG9ydCgnbW9uYWNvLWVkaXRvcicpO1xuXG5mdW5jdGlvbiBtKCk6IE0ge1xuICAgIHJldHVybiAoZ2xvYmFsVGhpcyBhcyBhbnkpLm1vbmFjbyBhcyBNO1xufVxuXG5mdW5jdGlvbiBuczxUIGV4dGVuZHMgb2JqZWN0PihnZXR0ZXI6ICgpID0+IFQpOiBUIHtcbiAgICByZXR1cm4gbmV3IFByb3h5KHt9IGFzIFQsIHtcbiAgICAgICAgZ2V0OiAoXywgaykgPT4gKGdldHRlcigpIGFzIGFueSlbayBhcyBzdHJpbmddLFxuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBjbHM8VD4oZ2V0dGVyOiAoKSA9PiBUKTogVCB7XG4gICAgcmV0dXJuIG5ldyBQcm94eShmdW5jdGlvbiAoKSB7fSBhcyBhbnksIHtcbiAgICAgICAgY29uc3RydWN0OiAoXywgYXJncykgPT4gbmV3IChnZXR0ZXIoKSBhcyBhbnkpKC4uLmFyZ3MpLFxuICAgICAgICBnZXQ6ICAgICAgIChfLCBrKSAgICA9PiAoZ2V0dGVyKCkgYXMgYW55KVtrIGFzIHN0cmluZ10sXG4gICAgfSkgYXMgVDtcbn1cblxuZXhwb3J0IGNvbnN0IGVkaXRvciAgICAgICAgID0gbnMoKCkgPT4gbSgpLmVkaXRvcik7XG5leHBvcnQgY29uc3QgbGFuZ3VhZ2VzICAgICAgPSBucygoKSA9PiBtKCkubGFuZ3VhZ2VzKTtcbmV4cG9ydCBjb25zdCBNYXJrZXJTZXZlcml0eSA9IG5zKCgpID0+IG0oKS5NYXJrZXJTZXZlcml0eSk7XG5leHBvcnQgY29uc3QgTWFya2VyVGFnICAgICAgPSBucygoKSA9PiAobSgpIGFzIGFueSkuTWFya2VyVGFnKTtcbmV4cG9ydCBjb25zdCBVcmkgICAgICAgICAgICA9IGNscygoKSA9PiBtKCkuVXJpKTtcbmV4cG9ydCBjb25zdCBSYW5nZSAgICAgICAgICA9IGNscygoKSA9PiBtKCkuUmFuZ2UpO1xuZXhwb3J0IGNvbnN0IFBvc2l0aW9uICAgICAgID0gY2xzKCgpID0+IG0oKS5Qb3NpdGlvbik7XG5leHBvcnQgY29uc3QgU2VsZWN0aW9uICAgICAgPSBjbHMoKCkgPT4gbSgpLlNlbGVjdGlvbik7XG5leHBvcnQgY29uc3QgS2V5Q29kZSAgICAgICAgPSBucygoKSA9PiBtKCkuS2V5Q29kZSk7XG5leHBvcnQgY29uc3QgS2V5TW9kICAgICAgICAgPSBucygoKSA9PiBtKCkuS2V5TW9kKTtcbiIsICIvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4ndXNlIHN0cmljdCc7XG5leHBvcnQgdmFyIERvY3VtZW50VXJpO1xuKGZ1bmN0aW9uIChEb2N1bWVudFVyaSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnO1xuICAgIH1cbiAgICBEb2N1bWVudFVyaS5pcyA9IGlzO1xufSkoRG9jdW1lbnRVcmkgfHwgKERvY3VtZW50VXJpID0ge30pKTtcbmV4cG9ydCB2YXIgVVJJO1xuKGZ1bmN0aW9uIChVUkkpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJztcbiAgICB9XG4gICAgVVJJLmlzID0gaXM7XG59KShVUkkgfHwgKFVSSSA9IHt9KSk7XG5leHBvcnQgdmFyIGludGVnZXI7XG4oZnVuY3Rpb24gKGludGVnZXIpIHtcbiAgICBpbnRlZ2VyLk1JTl9WQUxVRSA9IC0yMTQ3NDgzNjQ4O1xuICAgIGludGVnZXIuTUFYX1ZBTFVFID0gMjE0NzQ4MzY0NztcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBpbnRlZ2VyLk1JTl9WQUxVRSA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSBpbnRlZ2VyLk1BWF9WQUxVRTtcbiAgICB9XG4gICAgaW50ZWdlci5pcyA9IGlzO1xufSkoaW50ZWdlciB8fCAoaW50ZWdlciA9IHt9KSk7XG5leHBvcnQgdmFyIHVpbnRlZ2VyO1xuKGZ1bmN0aW9uICh1aW50ZWdlcikge1xuICAgIHVpbnRlZ2VyLk1JTl9WQUxVRSA9IDA7XG4gICAgdWludGVnZXIuTUFYX1ZBTFVFID0gMjE0NzQ4MzY0NztcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiB1aW50ZWdlci5NSU5fVkFMVUUgPD0gdmFsdWUgJiYgdmFsdWUgPD0gdWludGVnZXIuTUFYX1ZBTFVFO1xuICAgIH1cbiAgICB1aW50ZWdlci5pcyA9IGlzO1xufSkodWludGVnZXIgfHwgKHVpbnRlZ2VyID0ge30pKTtcbi8qKlxuICogVGhlIFBvc2l0aW9uIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIFBvc2l0aW9ufSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBQb3NpdGlvbjtcbihmdW5jdGlvbiAoUG9zaXRpb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFBvc2l0aW9uIGxpdGVyYWwgZnJvbSB0aGUgZ2l2ZW4gbGluZSBhbmQgY2hhcmFjdGVyLlxuICAgICAqIEBwYXJhbSBsaW5lIFRoZSBwb3NpdGlvbidzIGxpbmUuXG4gICAgICogQHBhcmFtIGNoYXJhY3RlciBUaGUgcG9zaXRpb24ncyBjaGFyYWN0ZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGxpbmUsIGNoYXJhY3Rlcikge1xuICAgICAgICBpZiAobGluZSA9PT0gTnVtYmVyLk1BWF9WQUxVRSkge1xuICAgICAgICAgICAgbGluZSA9IHVpbnRlZ2VyLk1BWF9WQUxVRTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhcmFjdGVyID09PSBOdW1iZXIuTUFYX1ZBTFVFKSB7XG4gICAgICAgICAgICBjaGFyYWN0ZXIgPSB1aW50ZWdlci5NQVhfVkFMVUU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgbGluZSwgY2hhcmFjdGVyIH07XG4gICAgfVxuICAgIFBvc2l0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIFBvc2l0aW9ufSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS5saW5lKSAmJiBJcy51aW50ZWdlcihjYW5kaWRhdGUuY2hhcmFjdGVyKTtcbiAgICB9XG4gICAgUG9zaXRpb24uaXMgPSBpcztcbn0pKFBvc2l0aW9uIHx8IChQb3NpdGlvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBSYW5nZSBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBSYW5nZX0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgUmFuZ2U7XG4oZnVuY3Rpb24gKFJhbmdlKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKG9uZSwgdHdvLCB0aHJlZSwgZm91cikge1xuICAgICAgICBpZiAoSXMudWludGVnZXIob25lKSAmJiBJcy51aW50ZWdlcih0d28pICYmIElzLnVpbnRlZ2VyKHRocmVlKSAmJiBJcy51aW50ZWdlcihmb3VyKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IFBvc2l0aW9uLmNyZWF0ZShvbmUsIHR3byksIGVuZDogUG9zaXRpb24uY3JlYXRlKHRocmVlLCBmb3VyKSB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKFBvc2l0aW9uLmlzKG9uZSkgJiYgUG9zaXRpb24uaXModHdvKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IG9uZSwgZW5kOiB0d28gfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmFuZ2UjY3JlYXRlIGNhbGxlZCB3aXRoIGludmFsaWQgYXJndW1lbnRzWyR7b25lfSwgJHt0d299LCAke3RocmVlfSwgJHtmb3VyfV1gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBSYW5nZS5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBSYW5nZX0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBQb3NpdGlvbi5pcyhjYW5kaWRhdGUuc3RhcnQpICYmIFBvc2l0aW9uLmlzKGNhbmRpZGF0ZS5lbmQpO1xuICAgIH1cbiAgICBSYW5nZS5pcyA9IGlzO1xufSkoUmFuZ2UgfHwgKFJhbmdlID0ge30pKTtcbi8qKlxuICogVGhlIExvY2F0aW9uIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIExvY2F0aW9ufSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBMb2NhdGlvbjtcbihmdW5jdGlvbiAoTG9jYXRpb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgTG9jYXRpb24gbGl0ZXJhbC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSBsb2NhdGlvbidzIHVyaS5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIGxvY2F0aW9uJ3MgcmFuZ2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHVyaSwgcmFuZ2UpIHtcbiAgICAgICAgcmV0dXJuIHsgdXJpLCByYW5nZSB9O1xuICAgIH1cbiAgICBMb2NhdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBMb2NhdGlvbn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIChJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSkgfHwgSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS51cmkpKTtcbiAgICB9XG4gICAgTG9jYXRpb24uaXMgPSBpcztcbn0pKExvY2F0aW9uIHx8IChMb2NhdGlvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBMb2NhdGlvbkxpbmsgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgTG9jYXRpb25MaW5rfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBMb2NhdGlvbkxpbms7XG4oZnVuY3Rpb24gKExvY2F0aW9uTGluaykge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBMb2NhdGlvbkxpbmsgbGl0ZXJhbC5cbiAgICAgKiBAcGFyYW0gdGFyZ2V0VXJpIFRoZSBkZWZpbml0aW9uJ3MgdXJpLlxuICAgICAqIEBwYXJhbSB0YXJnZXRSYW5nZSBUaGUgZnVsbCByYW5nZSBvZiB0aGUgZGVmaW5pdGlvbi5cbiAgICAgKiBAcGFyYW0gdGFyZ2V0U2VsZWN0aW9uUmFuZ2UgVGhlIHNwYW4gb2YgdGhlIHN5bWJvbCBkZWZpbml0aW9uIGF0IHRoZSB0YXJnZXQuXG4gICAgICogQHBhcmFtIG9yaWdpblNlbGVjdGlvblJhbmdlIFRoZSBzcGFuIG9mIHRoZSBzeW1ib2wgYmVpbmcgZGVmaW5lZCBpbiB0aGUgb3JpZ2luYXRpbmcgc291cmNlIGZpbGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHRhcmdldFVyaSwgdGFyZ2V0UmFuZ2UsIHRhcmdldFNlbGVjdGlvblJhbmdlLCBvcmlnaW5TZWxlY3Rpb25SYW5nZSkge1xuICAgICAgICByZXR1cm4geyB0YXJnZXRVcmksIHRhcmdldFJhbmdlLCB0YXJnZXRTZWxlY3Rpb25SYW5nZSwgb3JpZ2luU2VsZWN0aW9uUmFuZ2UgfTtcbiAgICB9XG4gICAgTG9jYXRpb25MaW5rLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIExvY2F0aW9uTGlua30gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUudGFyZ2V0UmFuZ2UpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudGFyZ2V0VXJpKVxuICAgICAgICAgICAgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnRhcmdldFNlbGVjdGlvblJhbmdlKVxuICAgICAgICAgICAgJiYgKFJhbmdlLmlzKGNhbmRpZGF0ZS5vcmlnaW5TZWxlY3Rpb25SYW5nZSkgfHwgSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5vcmlnaW5TZWxlY3Rpb25SYW5nZSkpO1xuICAgIH1cbiAgICBMb2NhdGlvbkxpbmsuaXMgPSBpcztcbn0pKExvY2F0aW9uTGluayB8fCAoTG9jYXRpb25MaW5rID0ge30pKTtcbi8qKlxuICogVGhlIENvbG9yIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIENvbG9yfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBDb2xvcjtcbihmdW5jdGlvbiAoQ29sb3IpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENvbG9yIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZWQsXG4gICAgICAgICAgICBncmVlbixcbiAgICAgICAgICAgIGJsdWUsXG4gICAgICAgICAgICBhbHBoYSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgQ29sb3IuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgQ29sb3J9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBJcy5udW1iZXJSYW5nZShjYW5kaWRhdGUucmVkLCAwLCAxKVxuICAgICAgICAgICAgJiYgSXMubnVtYmVyUmFuZ2UoY2FuZGlkYXRlLmdyZWVuLCAwLCAxKVxuICAgICAgICAgICAgJiYgSXMubnVtYmVyUmFuZ2UoY2FuZGlkYXRlLmJsdWUsIDAsIDEpXG4gICAgICAgICAgICAmJiBJcy5udW1iZXJSYW5nZShjYW5kaWRhdGUuYWxwaGEsIDAsIDEpO1xuICAgIH1cbiAgICBDb2xvci5pcyA9IGlzO1xufSkoQ29sb3IgfHwgKENvbG9yID0ge30pKTtcbi8qKlxuICogVGhlIENvbG9ySW5mb3JtYXRpb24gbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgQ29sb3JJbmZvcm1hdGlvbn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgQ29sb3JJbmZvcm1hdGlvbjtcbihmdW5jdGlvbiAoQ29sb3JJbmZvcm1hdGlvbikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ29sb3JJbmZvcm1hdGlvbiBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgY29sb3IpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJhbmdlLFxuICAgICAgICAgICAgY29sb3IsXG4gICAgICAgIH07XG4gICAgfVxuICAgIENvbG9ySW5mb3JtYXRpb24uY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgQ29sb3JJbmZvcm1hdGlvbn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgQ29sb3IuaXMoY2FuZGlkYXRlLmNvbG9yKTtcbiAgICB9XG4gICAgQ29sb3JJbmZvcm1hdGlvbi5pcyA9IGlzO1xufSkoQ29sb3JJbmZvcm1hdGlvbiB8fCAoQ29sb3JJbmZvcm1hdGlvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb2xvciBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBDb2xvclByZXNlbnRhdGlvbn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgQ29sb3JQcmVzZW50YXRpb247XG4oZnVuY3Rpb24gKENvbG9yUHJlc2VudGF0aW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDb2xvckluZm9ybWF0aW9uIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGxhYmVsLCB0ZXh0RWRpdCwgYWRkaXRpb25hbFRleHRFZGl0cykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICB0ZXh0RWRpdCxcbiAgICAgICAgICAgIGFkZGl0aW9uYWxUZXh0RWRpdHMsXG4gICAgICAgIH07XG4gICAgfVxuICAgIENvbG9yUHJlc2VudGF0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIENvbG9ySW5mb3JtYXRpb259IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLmxhYmVsKVxuICAgICAgICAgICAgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUudGV4dEVkaXQpIHx8IFRleHRFZGl0LmlzKGNhbmRpZGF0ZSkpXG4gICAgICAgICAgICAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5hZGRpdGlvbmFsVGV4dEVkaXRzKSB8fCBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS5hZGRpdGlvbmFsVGV4dEVkaXRzLCBUZXh0RWRpdC5pcykpO1xuICAgIH1cbiAgICBDb2xvclByZXNlbnRhdGlvbi5pcyA9IGlzO1xufSkoQ29sb3JQcmVzZW50YXRpb24gfHwgKENvbG9yUHJlc2VudGF0aW9uID0ge30pKTtcbi8qKlxuICogQSBzZXQgb2YgcHJlZGVmaW5lZCByYW5nZSBraW5kcy5cbiAqL1xuZXhwb3J0IHZhciBGb2xkaW5nUmFuZ2VLaW5kO1xuKGZ1bmN0aW9uIChGb2xkaW5nUmFuZ2VLaW5kKSB7XG4gICAgLyoqXG4gICAgICogRm9sZGluZyByYW5nZSBmb3IgYSBjb21tZW50XG4gICAgICovXG4gICAgRm9sZGluZ1JhbmdlS2luZC5Db21tZW50ID0gJ2NvbW1lbnQnO1xuICAgIC8qKlxuICAgICAqIEZvbGRpbmcgcmFuZ2UgZm9yIGFuIGltcG9ydCBvciBpbmNsdWRlXG4gICAgICovXG4gICAgRm9sZGluZ1JhbmdlS2luZC5JbXBvcnRzID0gJ2ltcG9ydHMnO1xuICAgIC8qKlxuICAgICAqIEZvbGRpbmcgcmFuZ2UgZm9yIGEgcmVnaW9uIChlLmcuIGAjcmVnaW9uYClcbiAgICAgKi9cbiAgICBGb2xkaW5nUmFuZ2VLaW5kLlJlZ2lvbiA9ICdyZWdpb24nO1xufSkoRm9sZGluZ1JhbmdlS2luZCB8fCAoRm9sZGluZ1JhbmdlS2luZCA9IHt9KSk7XG4vKipcbiAqIFRoZSBmb2xkaW5nIHJhbmdlIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIEZvbGRpbmdSYW5nZX0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgRm9sZGluZ1JhbmdlO1xuKGZ1bmN0aW9uIChGb2xkaW5nUmFuZ2UpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IEZvbGRpbmdSYW5nZSBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShzdGFydExpbmUsIGVuZExpbmUsIHN0YXJ0Q2hhcmFjdGVyLCBlbmRDaGFyYWN0ZXIsIGtpbmQsIGNvbGxhcHNlZFRleHQpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgc3RhcnRMaW5lLFxuICAgICAgICAgICAgZW5kTGluZVxuICAgICAgICB9O1xuICAgICAgICBpZiAoSXMuZGVmaW5lZChzdGFydENoYXJhY3RlcikpIHtcbiAgICAgICAgICAgIHJlc3VsdC5zdGFydENoYXJhY3RlciA9IHN0YXJ0Q2hhcmFjdGVyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKGVuZENoYXJhY3RlcikpIHtcbiAgICAgICAgICAgIHJlc3VsdC5lbmRDaGFyYWN0ZXIgPSBlbmRDaGFyYWN0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzLmRlZmluZWQoa2luZCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5raW5kID0ga2luZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXMuZGVmaW5lZChjb2xsYXBzZWRUZXh0KSkge1xuICAgICAgICAgICAgcmVzdWx0LmNvbGxhcHNlZFRleHQgPSBjb2xsYXBzZWRUZXh0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIEZvbGRpbmdSYW5nZS5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBGb2xkaW5nUmFuZ2V9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBJcy51aW50ZWdlcihjYW5kaWRhdGUuc3RhcnRMaW5lKSAmJiBJcy51aW50ZWdlcihjYW5kaWRhdGUuc3RhcnRMaW5lKVxuICAgICAgICAgICAgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUuc3RhcnRDaGFyYWN0ZXIpIHx8IElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS5zdGFydENoYXJhY3RlcikpXG4gICAgICAgICAgICAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5lbmRDaGFyYWN0ZXIpIHx8IElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS5lbmRDaGFyYWN0ZXIpKVxuICAgICAgICAgICAgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUua2luZCkgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS5raW5kKSk7XG4gICAgfVxuICAgIEZvbGRpbmdSYW5nZS5pcyA9IGlzO1xufSkoRm9sZGluZ1JhbmdlIHx8IChGb2xkaW5nUmFuZ2UgPSB7fSkpO1xuLyoqXG4gKiBUaGUgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbiBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9ufSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uO1xuKGZ1bmN0aW9uIChEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGxvY2F0aW9uLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgICAgIG1lc3NhZ2VcbiAgICAgICAgfTtcbiAgICB9XG4gICAgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9ufSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIExvY2F0aW9uLmlzKGNhbmRpZGF0ZS5sb2NhdGlvbikgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5tZXNzYWdlKTtcbiAgICB9XG4gICAgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbi5pcyA9IGlzO1xufSkoRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbiB8fCAoRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBkaWFnbm9zdGljJ3Mgc2V2ZXJpdHkuXG4gKi9cbmV4cG9ydCB2YXIgRGlhZ25vc3RpY1NldmVyaXR5O1xuKGZ1bmN0aW9uIChEaWFnbm9zdGljU2V2ZXJpdHkpIHtcbiAgICAvKipcbiAgICAgKiBSZXBvcnRzIGFuIGVycm9yLlxuICAgICAqL1xuICAgIERpYWdub3N0aWNTZXZlcml0eS5FcnJvciA9IDE7XG4gICAgLyoqXG4gICAgICogUmVwb3J0cyBhIHdhcm5pbmcuXG4gICAgICovXG4gICAgRGlhZ25vc3RpY1NldmVyaXR5Lldhcm5pbmcgPSAyO1xuICAgIC8qKlxuICAgICAqIFJlcG9ydHMgYW4gaW5mb3JtYXRpb24uXG4gICAgICovXG4gICAgRGlhZ25vc3RpY1NldmVyaXR5LkluZm9ybWF0aW9uID0gMztcbiAgICAvKipcbiAgICAgKiBSZXBvcnRzIGEgaGludC5cbiAgICAgKi9cbiAgICBEaWFnbm9zdGljU2V2ZXJpdHkuSGludCA9IDQ7XG59KShEaWFnbm9zdGljU2V2ZXJpdHkgfHwgKERpYWdub3N0aWNTZXZlcml0eSA9IHt9KSk7XG4vKipcbiAqIFRoZSBkaWFnbm9zdGljIHRhZ3MuXG4gKlxuICogQHNpbmNlIDMuMTUuMFxuICovXG5leHBvcnQgdmFyIERpYWdub3N0aWNUYWc7XG4oZnVuY3Rpb24gKERpYWdub3N0aWNUYWcpIHtcbiAgICAvKipcbiAgICAgKiBVbnVzZWQgb3IgdW5uZWNlc3NhcnkgY29kZS5cbiAgICAgKlxuICAgICAqIENsaWVudHMgYXJlIGFsbG93ZWQgdG8gcmVuZGVyIGRpYWdub3N0aWNzIHdpdGggdGhpcyB0YWcgZmFkZWQgb3V0IGluc3RlYWQgb2YgaGF2aW5nXG4gICAgICogYW4gZXJyb3Igc3F1aWdnbGUuXG4gICAgICovXG4gICAgRGlhZ25vc3RpY1RhZy5Vbm5lY2Vzc2FyeSA9IDE7XG4gICAgLyoqXG4gICAgICogRGVwcmVjYXRlZCBvciBvYnNvbGV0ZSBjb2RlLlxuICAgICAqXG4gICAgICogQ2xpZW50cyBhcmUgYWxsb3dlZCB0byByZW5kZXJlZCBkaWFnbm9zdGljcyB3aXRoIHRoaXMgdGFnIHN0cmlrZSB0aHJvdWdoLlxuICAgICAqL1xuICAgIERpYWdub3N0aWNUYWcuRGVwcmVjYXRlZCA9IDI7XG59KShEaWFnbm9zdGljVGFnIHx8IChEaWFnbm9zdGljVGFnID0ge30pKTtcbi8qKlxuICogVGhlIENvZGVEZXNjcmlwdGlvbiBuYW1lc3BhY2UgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCBkZXNjcmlwdGlvbnMgZm9yIGRpYWdub3N0aWMgY29kZXMuXG4gKlxuICogQHNpbmNlIDMuMTYuMFxuICovXG5leHBvcnQgdmFyIENvZGVEZXNjcmlwdGlvbjtcbihmdW5jdGlvbiAoQ29kZURlc2NyaXB0aW9uKSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5ocmVmKTtcbiAgICB9XG4gICAgQ29kZURlc2NyaXB0aW9uLmlzID0gaXM7XG59KShDb2RlRGVzY3JpcHRpb24gfHwgKENvZGVEZXNjcmlwdGlvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBEaWFnbm9zdGljIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIERpYWdub3N0aWN9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIERpYWdub3N0aWM7XG4oZnVuY3Rpb24gKERpYWdub3N0aWMpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IERpYWdub3N0aWMgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIG1lc3NhZ2UsIHNldmVyaXR5LCBjb2RlLCBzb3VyY2UsIHJlbGF0ZWRJbmZvcm1hdGlvbikge1xuICAgICAgICBsZXQgcmVzdWx0ID0geyByYW5nZSwgbWVzc2FnZSB9O1xuICAgICAgICBpZiAoSXMuZGVmaW5lZChzZXZlcml0eSkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5zZXZlcml0eSA9IHNldmVyaXR5O1xuICAgICAgICB9XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKGNvZGUpKSB7XG4gICAgICAgICAgICByZXN1bHQuY29kZSA9IGNvZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzLmRlZmluZWQoc291cmNlKSkge1xuICAgICAgICAgICAgcmVzdWx0LnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXMuZGVmaW5lZChyZWxhdGVkSW5mb3JtYXRpb24pKSB7XG4gICAgICAgICAgICByZXN1bHQucmVsYXRlZEluZm9ybWF0aW9uID0gcmVsYXRlZEluZm9ybWF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIERpYWdub3N0aWMuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgRGlhZ25vc3RpY30gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpXG4gICAgICAgICAgICAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpXG4gICAgICAgICAgICAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLm1lc3NhZ2UpXG4gICAgICAgICAgICAmJiAoSXMubnVtYmVyKGNhbmRpZGF0ZS5zZXZlcml0eSkgfHwgSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5zZXZlcml0eSkpXG4gICAgICAgICAgICAmJiAoSXMuaW50ZWdlcihjYW5kaWRhdGUuY29kZSkgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS5jb2RlKSB8fCBJcy51bmRlZmluZWQoY2FuZGlkYXRlLmNvZGUpKVxuICAgICAgICAgICAgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUuY29kZURlc2NyaXB0aW9uKSB8fCAoSXMuc3RyaW5nKChfYSA9IGNhbmRpZGF0ZS5jb2RlRGVzY3JpcHRpb24pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5ocmVmKSkpXG4gICAgICAgICAgICAmJiAoSXMuc3RyaW5nKGNhbmRpZGF0ZS5zb3VyY2UpIHx8IElzLnVuZGVmaW5lZChjYW5kaWRhdGUuc291cmNlKSlcbiAgICAgICAgICAgICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLnJlbGF0ZWRJbmZvcm1hdGlvbikgfHwgSXMudHlwZWRBcnJheShjYW5kaWRhdGUucmVsYXRlZEluZm9ybWF0aW9uLCBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uLmlzKSk7XG4gICAgfVxuICAgIERpYWdub3N0aWMuaXMgPSBpcztcbn0pKERpYWdub3N0aWMgfHwgKERpYWdub3N0aWMgPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29tbWFuZCBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBDb21tYW5kfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBDb21tYW5kO1xuKGZ1bmN0aW9uIChDb21tYW5kKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDb21tYW5kIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHRpdGxlLCBjb21tYW5kLCAuLi5hcmdzKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IHRpdGxlLCBjb21tYW5kIH07XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKGFyZ3MpICYmIGFyZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmVzdWx0LmFyZ3VtZW50cyA9IGFyZ3M7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgQ29tbWFuZC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBDb21tYW5kfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudGl0bGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUuY29tbWFuZCk7XG4gICAgfVxuICAgIENvbW1hbmQuaXMgPSBpcztcbn0pKENvbW1hbmQgfHwgKENvbW1hbmQgPSB7fSkpO1xuLyoqXG4gKiBUaGUgVGV4dEVkaXQgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgcmVwbGFjZSxcbiAqIGluc2VydCBhbmQgZGVsZXRlIGVkaXRzIG1vcmUgZWFzaWx5LlxuICovXG5leHBvcnQgdmFyIFRleHRFZGl0O1xuKGZ1bmN0aW9uIChUZXh0RWRpdCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSByZXBsYWNlIHRleHQgZWRpdC5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlIG9mIHRleHQgdG8gYmUgcmVwbGFjZWQuXG4gICAgICogQHBhcmFtIG5ld1RleHQgVGhlIG5ldyB0ZXh0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlcGxhY2UocmFuZ2UsIG5ld1RleHQpIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIG5ld1RleHQgfTtcbiAgICB9XG4gICAgVGV4dEVkaXQucmVwbGFjZSA9IHJlcGxhY2U7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnNlcnQgdGV4dCBlZGl0LlxuICAgICAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgcG9zaXRpb24gdG8gaW5zZXJ0IHRoZSB0ZXh0IGF0LlxuICAgICAqIEBwYXJhbSBuZXdUZXh0IFRoZSB0ZXh0IHRvIGJlIGluc2VydGVkLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluc2VydChwb3NpdGlvbiwgbmV3VGV4dCkge1xuICAgICAgICByZXR1cm4geyByYW5nZTogeyBzdGFydDogcG9zaXRpb24sIGVuZDogcG9zaXRpb24gfSwgbmV3VGV4dCB9O1xuICAgIH1cbiAgICBUZXh0RWRpdC5pbnNlcnQgPSBpbnNlcnQ7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGRlbGV0ZSB0ZXh0IGVkaXQuXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSBvZiB0ZXh0IHRvIGJlIGRlbGV0ZWQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZGVsKHJhbmdlKSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCBuZXdUZXh0OiAnJyB9O1xuICAgIH1cbiAgICBUZXh0RWRpdC5kZWwgPSBkZWw7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSlcbiAgICAgICAgICAgICYmIElzLnN0cmluZyhjYW5kaWRhdGUubmV3VGV4dClcbiAgICAgICAgICAgICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSk7XG4gICAgfVxuICAgIFRleHRFZGl0LmlzID0gaXM7XG59KShUZXh0RWRpdCB8fCAoVGV4dEVkaXQgPSB7fSkpO1xuZXhwb3J0IHZhciBDaGFuZ2VBbm5vdGF0aW9uO1xuKGZ1bmN0aW9uIChDaGFuZ2VBbm5vdGF0aW9uKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKGxhYmVsLCBuZWVkc0NvbmZpcm1hdGlvbiwgZGVzY3JpcHRpb24pIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0geyBsYWJlbCB9O1xuICAgICAgICBpZiAobmVlZHNDb25maXJtYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0Lm5lZWRzQ29uZmlybWF0aW9uID0gbmVlZHNDb25maXJtYXRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIENoYW5nZUFubm90YXRpb24uY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUubGFiZWwpICYmXG4gICAgICAgICAgICAoSXMuYm9vbGVhbihjYW5kaWRhdGUubmVlZHNDb25maXJtYXRpb24pIHx8IGNhbmRpZGF0ZS5uZWVkc0NvbmZpcm1hdGlvbiA9PT0gdW5kZWZpbmVkKSAmJlxuICAgICAgICAgICAgKElzLnN0cmluZyhjYW5kaWRhdGUuZGVzY3JpcHRpb24pIHx8IGNhbmRpZGF0ZS5kZXNjcmlwdGlvbiA9PT0gdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgQ2hhbmdlQW5ub3RhdGlvbi5pcyA9IGlzO1xufSkoQ2hhbmdlQW5ub3RhdGlvbiB8fCAoQ2hhbmdlQW5ub3RhdGlvbiA9IHt9KSk7XG5leHBvcnQgdmFyIENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyO1xuKGZ1bmN0aW9uIChDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuc3RyaW5nKGNhbmRpZGF0ZSk7XG4gICAgfVxuICAgIENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzID0gaXM7XG59KShDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllciB8fCAoQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIgPSB7fSkpO1xuZXhwb3J0IHZhciBBbm5vdGF0ZWRUZXh0RWRpdDtcbihmdW5jdGlvbiAoQW5ub3RhdGVkVGV4dEVkaXQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFubm90YXRlZCByZXBsYWNlIHRleHQgZWRpdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2Ugb2YgdGV4dCB0byBiZSByZXBsYWNlZC5cbiAgICAgKiBAcGFyYW0gbmV3VGV4dCBUaGUgbmV3IHRleHQuXG4gICAgICogQHBhcmFtIGFubm90YXRpb24gVGhlIGFubm90YXRpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVwbGFjZShyYW5nZSwgbmV3VGV4dCwgYW5ub3RhdGlvbikge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgbmV3VGV4dCwgYW5ub3RhdGlvbklkOiBhbm5vdGF0aW9uIH07XG4gICAgfVxuICAgIEFubm90YXRlZFRleHRFZGl0LnJlcGxhY2UgPSByZXBsYWNlO1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYW5ub3RhdGVkIGluc2VydCB0ZXh0IGVkaXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIHBvc2l0aW9uIHRvIGluc2VydCB0aGUgdGV4dCBhdC5cbiAgICAgKiBAcGFyYW0gbmV3VGV4dCBUaGUgdGV4dCB0byBiZSBpbnNlcnRlZC5cbiAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiBUaGUgYW5ub3RhdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbnNlcnQocG9zaXRpb24sIG5ld1RleHQsIGFubm90YXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2U6IHsgc3RhcnQ6IHBvc2l0aW9uLCBlbmQ6IHBvc2l0aW9uIH0sIG5ld1RleHQsIGFubm90YXRpb25JZDogYW5ub3RhdGlvbiB9O1xuICAgIH1cbiAgICBBbm5vdGF0ZWRUZXh0RWRpdC5pbnNlcnQgPSBpbnNlcnQ7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhbm5vdGF0ZWQgZGVsZXRlIHRleHQgZWRpdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2Ugb2YgdGV4dCB0byBiZSBkZWxldGVkLlxuICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIFRoZSBhbm5vdGF0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRlbChyYW5nZSwgYW5ub3RhdGlvbikge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgbmV3VGV4dDogJycsIGFubm90YXRpb25JZDogYW5ub3RhdGlvbiB9O1xuICAgIH1cbiAgICBBbm5vdGF0ZWRUZXh0RWRpdC5kZWwgPSBkZWw7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBUZXh0RWRpdC5pcyhjYW5kaWRhdGUpICYmIChDaGFuZ2VBbm5vdGF0aW9uLmlzKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQpIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQpKTtcbiAgICB9XG4gICAgQW5ub3RhdGVkVGV4dEVkaXQuaXMgPSBpcztcbn0pKEFubm90YXRlZFRleHRFZGl0IHx8IChBbm5vdGF0ZWRUZXh0RWRpdCA9IHt9KSk7XG4vKipcbiAqIFRoZSBUZXh0RG9jdW1lbnRFZGl0IG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlXG4gKiBhbiBlZGl0IHRoYXQgbWFuaXB1bGF0ZXMgYSB0ZXh0IGRvY3VtZW50LlxuICovXG5leHBvcnQgdmFyIFRleHREb2N1bWVudEVkaXQ7XG4oZnVuY3Rpb24gKFRleHREb2N1bWVudEVkaXQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGBUZXh0RG9jdW1lbnRFZGl0YFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh0ZXh0RG9jdW1lbnQsIGVkaXRzKSB7XG4gICAgICAgIHJldHVybiB7IHRleHREb2N1bWVudCwgZWRpdHMgfTtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50RWRpdC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpXG4gICAgICAgICAgICAmJiBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIuaXMoY2FuZGlkYXRlLnRleHREb2N1bWVudClcbiAgICAgICAgICAgICYmIEFycmF5LmlzQXJyYXkoY2FuZGlkYXRlLmVkaXRzKTtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50RWRpdC5pcyA9IGlzO1xufSkoVGV4dERvY3VtZW50RWRpdCB8fCAoVGV4dERvY3VtZW50RWRpdCA9IHt9KSk7XG5leHBvcnQgdmFyIENyZWF0ZUZpbGU7XG4oZnVuY3Rpb24gKENyZWF0ZUZpbGUpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUodXJpLCBvcHRpb25zLCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7XG4gICAgICAgICAgICBraW5kOiAnY3JlYXRlJyxcbiAgICAgICAgICAgIHVyaVxuICAgICAgICB9O1xuICAgICAgICBpZiAob3B0aW9ucyAhPT0gdW5kZWZpbmVkICYmIChvcHRpb25zLm92ZXJ3cml0ZSAhPT0gdW5kZWZpbmVkIHx8IG9wdGlvbnMuaWdub3JlSWZFeGlzdHMgIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgfVxuICAgICAgICBpZiAoYW5ub3RhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQuYW5ub3RhdGlvbklkID0gYW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBDcmVhdGVGaWxlLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgY2FuZGlkYXRlLmtpbmQgPT09ICdjcmVhdGUnICYmIElzLnN0cmluZyhjYW5kaWRhdGUudXJpKSAmJiAoY2FuZGlkYXRlLm9wdGlvbnMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgKChjYW5kaWRhdGUub3B0aW9ucy5vdmVyd3JpdGUgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5vcHRpb25zLm92ZXJ3cml0ZSkpICYmIChjYW5kaWRhdGUub3B0aW9ucy5pZ25vcmVJZkV4aXN0cyA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLm9wdGlvbnMuaWdub3JlSWZFeGlzdHMpKSkpICYmIChjYW5kaWRhdGUuYW5ub3RhdGlvbklkID09PSB1bmRlZmluZWQgfHwgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoY2FuZGlkYXRlLmFubm90YXRpb25JZCkpO1xuICAgIH1cbiAgICBDcmVhdGVGaWxlLmlzID0gaXM7XG59KShDcmVhdGVGaWxlIHx8IChDcmVhdGVGaWxlID0ge30pKTtcbmV4cG9ydCB2YXIgUmVuYW1lRmlsZTtcbihmdW5jdGlvbiAoUmVuYW1lRmlsZSkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShvbGRVcmksIG5ld1VyaSwgb3B0aW9ucywgYW5ub3RhdGlvbikge1xuICAgICAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgICAgICAga2luZDogJ3JlbmFtZScsXG4gICAgICAgICAgICBvbGRVcmksXG4gICAgICAgICAgICBuZXdVcmlcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKG9wdGlvbnMgIT09IHVuZGVmaW5lZCAmJiAob3B0aW9ucy5vdmVyd3JpdGUgIT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLmlnbm9yZUlmRXhpc3RzICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICByZXN1bHQub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFubm90YXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmFubm90YXRpb25JZCA9IGFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgUmVuYW1lRmlsZS5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIGNhbmRpZGF0ZS5raW5kID09PSAncmVuYW1lJyAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLm9sZFVyaSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5uZXdVcmkpICYmIChjYW5kaWRhdGUub3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAoKGNhbmRpZGF0ZS5vcHRpb25zLm92ZXJ3cml0ZSA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLm9wdGlvbnMub3ZlcndyaXRlKSkgJiYgKGNhbmRpZGF0ZS5vcHRpb25zLmlnbm9yZUlmRXhpc3RzID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUub3B0aW9ucy5pZ25vcmVJZkV4aXN0cykpKSkgJiYgKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQgPT09IHVuZGVmaW5lZCB8fCBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhjYW5kaWRhdGUuYW5ub3RhdGlvbklkKSk7XG4gICAgfVxuICAgIFJlbmFtZUZpbGUuaXMgPSBpcztcbn0pKFJlbmFtZUZpbGUgfHwgKFJlbmFtZUZpbGUgPSB7fSkpO1xuZXhwb3J0IHZhciBEZWxldGVGaWxlO1xuKGZ1bmN0aW9uIChEZWxldGVGaWxlKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKHVyaSwgb3B0aW9ucywgYW5ub3RhdGlvbikge1xuICAgICAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgICAgICAga2luZDogJ2RlbGV0ZScsXG4gICAgICAgICAgICB1cmlcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKG9wdGlvbnMgIT09IHVuZGVmaW5lZCAmJiAob3B0aW9ucy5yZWN1cnNpdmUgIT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLmlnbm9yZUlmTm90RXhpc3RzICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICByZXN1bHQub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFubm90YXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmFubm90YXRpb25JZCA9IGFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgRGVsZXRlRmlsZS5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIGNhbmRpZGF0ZS5raW5kID09PSAnZGVsZXRlJyAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSkgJiYgKGNhbmRpZGF0ZS5vcHRpb25zID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICgoY2FuZGlkYXRlLm9wdGlvbnMucmVjdXJzaXZlID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUub3B0aW9ucy5yZWN1cnNpdmUpKSAmJiAoY2FuZGlkYXRlLm9wdGlvbnMuaWdub3JlSWZOb3RFeGlzdHMgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5vcHRpb25zLmlnbm9yZUlmTm90RXhpc3RzKSkpKSAmJiAoY2FuZGlkYXRlLmFubm90YXRpb25JZCA9PT0gdW5kZWZpbmVkIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQpKTtcbiAgICB9XG4gICAgRGVsZXRlRmlsZS5pcyA9IGlzO1xufSkoRGVsZXRlRmlsZSB8fCAoRGVsZXRlRmlsZSA9IHt9KSk7XG5leHBvcnQgdmFyIFdvcmtzcGFjZUVkaXQ7XG4oZnVuY3Rpb24gKFdvcmtzcGFjZUVkaXQpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuY2hhbmdlcyAhPT0gdW5kZWZpbmVkIHx8IGNhbmRpZGF0ZS5kb2N1bWVudENoYW5nZXMgIT09IHVuZGVmaW5lZCkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuZG9jdW1lbnRDaGFuZ2VzID09PSB1bmRlZmluZWQgfHwgY2FuZGlkYXRlLmRvY3VtZW50Q2hhbmdlcy5ldmVyeSgoY2hhbmdlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKElzLnN0cmluZyhjaGFuZ2Uua2luZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZUZpbGUuaXMoY2hhbmdlKSB8fCBSZW5hbWVGaWxlLmlzKGNoYW5nZSkgfHwgRGVsZXRlRmlsZS5pcyhjaGFuZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRleHREb2N1bWVudEVkaXQuaXMoY2hhbmdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSk7XG4gICAgfVxuICAgIFdvcmtzcGFjZUVkaXQuaXMgPSBpcztcbn0pKFdvcmtzcGFjZUVkaXQgfHwgKFdvcmtzcGFjZUVkaXQgPSB7fSkpO1xuY2xhc3MgVGV4dEVkaXRDaGFuZ2VJbXBsIHtcbiAgICBjb25zdHJ1Y3RvcihlZGl0cywgY2hhbmdlQW5ub3RhdGlvbnMpIHtcbiAgICAgICAgdGhpcy5lZGl0cyA9IGVkaXRzO1xuICAgICAgICB0aGlzLmNoYW5nZUFubm90YXRpb25zID0gY2hhbmdlQW5ub3RhdGlvbnM7XG4gICAgfVxuICAgIGluc2VydChwb3NpdGlvbiwgbmV3VGV4dCwgYW5ub3RhdGlvbikge1xuICAgICAgICBsZXQgZWRpdDtcbiAgICAgICAgbGV0IGlkO1xuICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBlZGl0ID0gVGV4dEVkaXQuaW5zZXJ0KHBvc2l0aW9uLCBuZXdUZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhhbm5vdGF0aW9uKSkge1xuICAgICAgICAgICAgaWQgPSBhbm5vdGF0aW9uO1xuICAgICAgICAgICAgZWRpdCA9IEFubm90YXRlZFRleHRFZGl0Lmluc2VydChwb3NpdGlvbiwgbmV3VGV4dCwgYW5ub3RhdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFzc2VydENoYW5nZUFubm90YXRpb25zKHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgaWQgPSB0aGlzLmNoYW5nZUFubm90YXRpb25zLm1hbmFnZShhbm5vdGF0aW9uKTtcbiAgICAgICAgICAgIGVkaXQgPSBBbm5vdGF0ZWRUZXh0RWRpdC5pbnNlcnQocG9zaXRpb24sIG5ld1RleHQsIGlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVkaXRzLnB1c2goZWRpdCk7XG4gICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVwbGFjZShyYW5nZSwgbmV3VGV4dCwgYW5ub3RhdGlvbikge1xuICAgICAgICBsZXQgZWRpdDtcbiAgICAgICAgbGV0IGlkO1xuICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBlZGl0ID0gVGV4dEVkaXQucmVwbGFjZShyYW5nZSwgbmV3VGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoYW5ub3RhdGlvbikpIHtcbiAgICAgICAgICAgIGlkID0gYW5ub3RhdGlvbjtcbiAgICAgICAgICAgIGVkaXQgPSBBbm5vdGF0ZWRUZXh0RWRpdC5yZXBsYWNlKHJhbmdlLCBuZXdUZXh0LCBhbm5vdGF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYXNzZXJ0Q2hhbmdlQW5ub3RhdGlvbnModGhpcy5jaGFuZ2VBbm5vdGF0aW9ucyk7XG4gICAgICAgICAgICBpZCA9IHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMubWFuYWdlKGFubm90YXRpb24pO1xuICAgICAgICAgICAgZWRpdCA9IEFubm90YXRlZFRleHRFZGl0LnJlcGxhY2UocmFuZ2UsIG5ld1RleHQsIGlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVkaXRzLnB1c2goZWRpdCk7XG4gICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVsZXRlKHJhbmdlLCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIGxldCBlZGl0O1xuICAgICAgICBsZXQgaWQ7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGVkaXQgPSBUZXh0RWRpdC5kZWwocmFuZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGFubm90YXRpb24pKSB7XG4gICAgICAgICAgICBpZCA9IGFubm90YXRpb247XG4gICAgICAgICAgICBlZGl0ID0gQW5ub3RhdGVkVGV4dEVkaXQuZGVsKHJhbmdlLCBhbm5vdGF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYXNzZXJ0Q2hhbmdlQW5ub3RhdGlvbnModGhpcy5jaGFuZ2VBbm5vdGF0aW9ucyk7XG4gICAgICAgICAgICBpZCA9IHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMubWFuYWdlKGFubm90YXRpb24pO1xuICAgICAgICAgICAgZWRpdCA9IEFubm90YXRlZFRleHRFZGl0LmRlbChyYW5nZSwgaWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWRpdHMucHVzaChlZGl0KTtcbiAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhZGQoZWRpdCkge1xuICAgICAgICB0aGlzLmVkaXRzLnB1c2goZWRpdCk7XG4gICAgfVxuICAgIGFsbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdHM7XG4gICAgfVxuICAgIGNsZWFyKCkge1xuICAgICAgICB0aGlzLmVkaXRzLnNwbGljZSgwLCB0aGlzLmVkaXRzLmxlbmd0aCk7XG4gICAgfVxuICAgIGFzc2VydENoYW5nZUFubm90YXRpb25zKHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRleHQgZWRpdCBjaGFuZ2UgaXMgbm90IGNvbmZpZ3VyZWQgdG8gbWFuYWdlIGNoYW5nZSBhbm5vdGF0aW9ucy5gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogQSBoZWxwZXIgY2xhc3NcbiAqL1xuY2xhc3MgQ2hhbmdlQW5ub3RhdGlvbnMge1xuICAgIGNvbnN0cnVjdG9yKGFubm90YXRpb25zKSB7XG4gICAgICAgIHRoaXMuX2Fubm90YXRpb25zID0gYW5ub3RhdGlvbnMgPT09IHVuZGVmaW5lZCA/IE9iamVjdC5jcmVhdGUobnVsbCkgOiBhbm5vdGF0aW9ucztcbiAgICAgICAgdGhpcy5fY291bnRlciA9IDA7XG4gICAgICAgIHRoaXMuX3NpemUgPSAwO1xuICAgIH1cbiAgICBhbGwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hbm5vdGF0aW9ucztcbiAgICB9XG4gICAgZ2V0IHNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaXplO1xuICAgIH1cbiAgICBtYW5hZ2UoaWRPckFubm90YXRpb24sIGFubm90YXRpb24pIHtcbiAgICAgICAgbGV0IGlkO1xuICAgICAgICBpZiAoQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoaWRPckFubm90YXRpb24pKSB7XG4gICAgICAgICAgICBpZCA9IGlkT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWQgPSB0aGlzLm5leHRJZCgpO1xuICAgICAgICAgICAgYW5ub3RhdGlvbiA9IGlkT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9hbm5vdGF0aW9uc1tpZF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJZCAke2lkfSBpcyBhbHJlYWR5IGluIHVzZS5gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGFubm90YXRpb24gcHJvdmlkZWQgZm9yIGlkICR7aWR9YCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fYW5ub3RhdGlvbnNbaWRdID0gYW5ub3RhdGlvbjtcbiAgICAgICAgdGhpcy5fc2l6ZSsrO1xuICAgICAgICByZXR1cm4gaWQ7XG4gICAgfVxuICAgIG5leHRJZCgpIHtcbiAgICAgICAgdGhpcy5fY291bnRlcisrO1xuICAgICAgICByZXR1cm4gdGhpcy5fY291bnRlci50b1N0cmluZygpO1xuICAgIH1cbn1cbi8qKlxuICogQSB3b3Jrc3BhY2UgY2hhbmdlIGhlbHBzIGNvbnN0cnVjdGluZyBjaGFuZ2VzIHRvIGEgd29ya3NwYWNlLlxuICovXG5leHBvcnQgY2xhc3MgV29ya3NwYWNlQ2hhbmdlIHtcbiAgICBjb25zdHJ1Y3Rvcih3b3Jrc3BhY2VFZGl0KSB7XG4gICAgICAgIHRoaXMuX3RleHRFZGl0Q2hhbmdlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIGlmICh3b3Jrc3BhY2VFZGl0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQgPSB3b3Jrc3BhY2VFZGl0O1xuICAgICAgICAgICAgaWYgKHdvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMgPSBuZXcgQ2hhbmdlQW5ub3RhdGlvbnMod29ya3NwYWNlRWRpdC5jaGFuZ2VBbm5vdGF0aW9ucyk7XG4gICAgICAgICAgICAgICAgd29ya3NwYWNlRWRpdC5jaGFuZ2VBbm5vdGF0aW9ucyA9IHRoaXMuX2NoYW5nZUFubm90YXRpb25zLmFsbCgpO1xuICAgICAgICAgICAgICAgIHdvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzLmZvckVhY2goKGNoYW5nZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoVGV4dERvY3VtZW50RWRpdC5pcyhjaGFuZ2UpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0RWRpdENoYW5nZSA9IG5ldyBUZXh0RWRpdENoYW5nZUltcGwoY2hhbmdlLmVkaXRzLCB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXh0RWRpdENoYW5nZXNbY2hhbmdlLnRleHREb2N1bWVudC51cmldID0gdGV4dEVkaXRDaGFuZ2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHdvcmtzcGFjZUVkaXQuY2hhbmdlcykge1xuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHdvcmtzcGFjZUVkaXQuY2hhbmdlcykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHRFZGl0Q2hhbmdlID0gbmV3IFRleHRFZGl0Q2hhbmdlSW1wbCh3b3Jrc3BhY2VFZGl0LmNoYW5nZXNba2V5XSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RleHRFZGl0Q2hhbmdlc1trZXldID0gdGV4dEVkaXRDaGFuZ2U7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0ID0ge307XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdW5kZXJseWluZyB7QGxpbmsgV29ya3NwYWNlRWRpdH0gbGl0ZXJhbFxuICAgICAqIHVzZSB0byBiZSByZXR1cm5lZCBmcm9tIGEgd29ya3NwYWNlIGVkaXQgb3BlcmF0aW9uIGxpa2UgcmVuYW1lLlxuICAgICAqL1xuICAgIGdldCBlZGl0KCkge1xuICAgICAgICB0aGlzLmluaXREb2N1bWVudENoYW5nZXMoKTtcbiAgICAgICAgaWYgKHRoaXMuX2NoYW5nZUFubm90YXRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5zaXplID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VBbm5vdGF0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlQW5ub3RhdGlvbnMgPSB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5hbGwoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fd29ya3NwYWNlRWRpdDtcbiAgICB9XG4gICAgZ2V0VGV4dEVkaXRDaGFuZ2Uoa2V5KSB7XG4gICAgICAgIGlmIChPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIuaXMoa2V5KSkge1xuICAgICAgICAgICAgdGhpcy5pbml0RG9jdW1lbnRDaGFuZ2VzKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV29ya3NwYWNlIGVkaXQgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIGRvY3VtZW50IGNoYW5nZXMuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0ZXh0RG9jdW1lbnQgPSB7IHVyaToga2V5LnVyaSwgdmVyc2lvbjoga2V5LnZlcnNpb24gfTtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLl90ZXh0RWRpdENoYW5nZXNbdGV4dERvY3VtZW50LnVyaV07XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVkaXRzID0gW107XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dERvY3VtZW50RWRpdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dERvY3VtZW50LFxuICAgICAgICAgICAgICAgICAgICBlZGl0c1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMucHVzaCh0ZXh0RG9jdW1lbnRFZGl0KTtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgVGV4dEVkaXRDaGFuZ2VJbXBsKGVkaXRzLCB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGV4dEVkaXRDaGFuZ2VzW3RleHREb2N1bWVudC51cmldID0gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdENoYW5nZXMoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV29ya3NwYWNlIGVkaXQgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIG5vcm1hbCB0ZXh0IGVkaXQgY2hhbmdlcy4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLl90ZXh0RWRpdENoYW5nZXNba2V5XTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgbGV0IGVkaXRzID0gW107XG4gICAgICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VzW2tleV0gPSBlZGl0cztcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgVGV4dEVkaXRDaGFuZ2VJbXBsKGVkaXRzKTtcbiAgICAgICAgICAgICAgICB0aGlzLl90ZXh0RWRpdENoYW5nZXNba2V5XSA9IHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaW5pdERvY3VtZW50Q2hhbmdlcygpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzID09PSB1bmRlZmluZWQgJiYgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZUFubm90YXRpb25zID0gbmV3IENoYW5nZUFubm90YXRpb25zKCk7XG4gICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VBbm5vdGF0aW9ucyA9IHRoaXMuX2NoYW5nZUFubm90YXRpb25zLmFsbCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGluaXRDaGFuZ2VzKCkge1xuICAgICAgICBpZiAodGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMgPT09IHVuZGVmaW5lZCAmJiB0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjcmVhdGVGaWxlKHVyaSwgb3B0aW9uc09yQW5ub3RhdGlvbiwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLmluaXREb2N1bWVudENoYW5nZXMoKTtcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV29ya3NwYWNlIGVkaXQgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIGRvY3VtZW50IGNoYW5nZXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGFubm90YXRpb247XG4gICAgICAgIGlmIChDaGFuZ2VBbm5vdGF0aW9uLmlzKG9wdGlvbnNPckFubm90YXRpb24pIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKG9wdGlvbnNPckFubm90YXRpb24pKSB7XG4gICAgICAgICAgICBhbm5vdGF0aW9uID0gb3B0aW9uc09yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGxldCBvcGVyYXRpb247XG4gICAgICAgIGxldCBpZDtcbiAgICAgICAgaWYgKGFubm90YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3BlcmF0aW9uID0gQ3JlYXRlRmlsZS5jcmVhdGUodXJpLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlkID0gQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoYW5ub3RhdGlvbikgPyBhbm5vdGF0aW9uIDogdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMubWFuYWdlKGFubm90YXRpb24pO1xuICAgICAgICAgICAgb3BlcmF0aW9uID0gQ3JlYXRlRmlsZS5jcmVhdGUodXJpLCBvcHRpb25zLCBpZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMucHVzaChvcGVyYXRpb24pO1xuICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlbmFtZUZpbGUob2xkVXJpLCBuZXdVcmksIG9wdGlvbnNPckFubm90YXRpb24sIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5pbml0RG9jdW1lbnRDaGFuZ2VzKCk7XG4gICAgICAgIGlmICh0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dvcmtzcGFjZSBlZGl0IGlzIG5vdCBjb25maWd1cmVkIGZvciBkb2N1bWVudCBjaGFuZ2VzLicpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhbm5vdGF0aW9uO1xuICAgICAgICBpZiAoQ2hhbmdlQW5ub3RhdGlvbi5pcyhvcHRpb25zT3JBbm5vdGF0aW9uKSB8fCBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhvcHRpb25zT3JBbm5vdGF0aW9uKSkge1xuICAgICAgICAgICAgYW5ub3RhdGlvbiA9IG9wdGlvbnNPckFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvcHRpb25zID0gb3B0aW9uc09yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb3BlcmF0aW9uO1xuICAgICAgICBsZXQgaWQ7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wZXJhdGlvbiA9IFJlbmFtZUZpbGUuY3JlYXRlKG9sZFVyaSwgbmV3VXJpLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlkID0gQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoYW5ub3RhdGlvbikgPyBhbm5vdGF0aW9uIDogdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMubWFuYWdlKGFubm90YXRpb24pO1xuICAgICAgICAgICAgb3BlcmF0aW9uID0gUmVuYW1lRmlsZS5jcmVhdGUob2xkVXJpLCBuZXdVcmksIG9wdGlvbnMsIGlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcy5wdXNoKG9wZXJhdGlvbik7XG4gICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVsZXRlRmlsZSh1cmksIG9wdGlvbnNPckFubm90YXRpb24sIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5pbml0RG9jdW1lbnRDaGFuZ2VzKCk7XG4gICAgICAgIGlmICh0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dvcmtzcGFjZSBlZGl0IGlzIG5vdCBjb25maWd1cmVkIGZvciBkb2N1bWVudCBjaGFuZ2VzLicpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhbm5vdGF0aW9uO1xuICAgICAgICBpZiAoQ2hhbmdlQW5ub3RhdGlvbi5pcyhvcHRpb25zT3JBbm5vdGF0aW9uKSB8fCBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhvcHRpb25zT3JBbm5vdGF0aW9uKSkge1xuICAgICAgICAgICAgYW5ub3RhdGlvbiA9IG9wdGlvbnNPckFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvcHRpb25zID0gb3B0aW9uc09yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb3BlcmF0aW9uO1xuICAgICAgICBsZXQgaWQ7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wZXJhdGlvbiA9IERlbGV0ZUZpbGUuY3JlYXRlKHVyaSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZCA9IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGFubm90YXRpb24pID8gYW5ub3RhdGlvbiA6IHRoaXMuX2NoYW5nZUFubm90YXRpb25zLm1hbmFnZShhbm5vdGF0aW9uKTtcbiAgICAgICAgICAgIG9wZXJhdGlvbiA9IERlbGV0ZUZpbGUuY3JlYXRlKHVyaSwgb3B0aW9ucywgaWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzLnB1c2gob3BlcmF0aW9uKTtcbiAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogVGhlIFRleHREb2N1bWVudElkZW50aWZpZXIgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgVGV4dERvY3VtZW50SWRlbnRpZmllcn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgVGV4dERvY3VtZW50SWRlbnRpZmllcjtcbihmdW5jdGlvbiAoVGV4dERvY3VtZW50SWRlbnRpZmllcikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgVGV4dERvY3VtZW50SWRlbnRpZmllciBsaXRlcmFsLlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIGRvY3VtZW50J3MgdXJpLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmkpIHtcbiAgICAgICAgcmV0dXJuIHsgdXJpIH07XG4gICAgfVxuICAgIFRleHREb2N1bWVudElkZW50aWZpZXIuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgVGV4dERvY3VtZW50SWRlbnRpZmllcn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSk7XG4gICAgfVxuICAgIFRleHREb2N1bWVudElkZW50aWZpZXIuaXMgPSBpcztcbn0pKFRleHREb2N1bWVudElkZW50aWZpZXIgfHwgKFRleHREb2N1bWVudElkZW50aWZpZXIgPSB7fSkpO1xuLyoqXG4gKiBUaGUgVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyO1xuKGZ1bmN0aW9uIChWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIGxpdGVyYWwuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgZG9jdW1lbnQncyB1cmkuXG4gICAgICogQHBhcmFtIHZlcnNpb24gVGhlIGRvY3VtZW50J3MgdmVyc2lvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodXJpLCB2ZXJzaW9uKSB7XG4gICAgICAgIHJldHVybiB7IHVyaSwgdmVyc2lvbiB9O1xuICAgIH1cbiAgICBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXJ9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpICYmIElzLmludGVnZXIoY2FuZGlkYXRlLnZlcnNpb24pO1xuICAgIH1cbiAgICBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmlzID0gaXM7XG59KShWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIHx8IChWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyID0ge30pKTtcbi8qKlxuICogVGhlIE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXJ9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcjtcbihmdW5jdGlvbiAoT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIgbGl0ZXJhbC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSBkb2N1bWVudCdzIHVyaS5cbiAgICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgZG9jdW1lbnQncyB2ZXJzaW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmksIHZlcnNpb24pIHtcbiAgICAgICAgcmV0dXJuIHsgdXJpLCB2ZXJzaW9uIH07XG4gICAgfVxuICAgIE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllci5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXJ9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpICYmIChjYW5kaWRhdGUudmVyc2lvbiA9PT0gbnVsbCB8fCBJcy5pbnRlZ2VyKGNhbmRpZGF0ZS52ZXJzaW9uKSk7XG4gICAgfVxuICAgIE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllci5pcyA9IGlzO1xufSkoT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIHx8IChPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIgPSB7fSkpO1xuLyoqXG4gKiBUaGUgVGV4dERvY3VtZW50SXRlbSBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBUZXh0RG9jdW1lbnRJdGVtfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBUZXh0RG9jdW1lbnRJdGVtO1xuKGZ1bmN0aW9uIChUZXh0RG9jdW1lbnRJdGVtKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBUZXh0RG9jdW1lbnRJdGVtIGxpdGVyYWwuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgZG9jdW1lbnQncyB1cmkuXG4gICAgICogQHBhcmFtIGxhbmd1YWdlSWQgVGhlIGRvY3VtZW50J3MgbGFuZ3VhZ2UgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgZG9jdW1lbnQncyB2ZXJzaW9uIG51bWJlci5cbiAgICAgKiBAcGFyYW0gdGV4dCBUaGUgZG9jdW1lbnQncyB0ZXh0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmksIGxhbmd1YWdlSWQsIHZlcnNpb24sIHRleHQpIHtcbiAgICAgICAgcmV0dXJuIHsgdXJpLCBsYW5ndWFnZUlkLCB2ZXJzaW9uLCB0ZXh0IH07XG4gICAgfVxuICAgIFRleHREb2N1bWVudEl0ZW0uY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgVGV4dERvY3VtZW50SXRlbX0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5sYW5ndWFnZUlkKSAmJiBJcy5pbnRlZ2VyKGNhbmRpZGF0ZS52ZXJzaW9uKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnRleHQpO1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnRJdGVtLmlzID0gaXM7XG59KShUZXh0RG9jdW1lbnRJdGVtIHx8IChUZXh0RG9jdW1lbnRJdGVtID0ge30pKTtcbi8qKlxuICogRGVzY3JpYmVzIHRoZSBjb250ZW50IHR5cGUgdGhhdCBhIGNsaWVudCBzdXBwb3J0cyBpbiB2YXJpb3VzXG4gKiByZXN1bHQgbGl0ZXJhbHMgbGlrZSBgSG92ZXJgLCBgUGFyYW1ldGVySW5mb2Agb3IgYENvbXBsZXRpb25JdGVtYC5cbiAqXG4gKiBQbGVhc2Ugbm90ZSB0aGF0IGBNYXJrdXBLaW5kc2AgbXVzdCBub3Qgc3RhcnQgd2l0aCBhIGAkYC4gVGhpcyBraW5kc1xuICogYXJlIHJlc2VydmVkIGZvciBpbnRlcm5hbCB1c2FnZS5cbiAqL1xuZXhwb3J0IHZhciBNYXJrdXBLaW5kO1xuKGZ1bmN0aW9uIChNYXJrdXBLaW5kKSB7XG4gICAgLyoqXG4gICAgICogUGxhaW4gdGV4dCBpcyBzdXBwb3J0ZWQgYXMgYSBjb250ZW50IGZvcm1hdFxuICAgICAqL1xuICAgIE1hcmt1cEtpbmQuUGxhaW5UZXh0ID0gJ3BsYWludGV4dCc7XG4gICAgLyoqXG4gICAgICogTWFya2Rvd24gaXMgc3VwcG9ydGVkIGFzIGEgY29udGVudCBmb3JtYXRcbiAgICAgKi9cbiAgICBNYXJrdXBLaW5kLk1hcmtkb3duID0gJ21hcmtkb3duJztcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgaXMgYSB2YWx1ZSBvZiB0aGUge0BsaW5rIE1hcmt1cEtpbmR9IHR5cGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgPT09IE1hcmt1cEtpbmQuUGxhaW5UZXh0IHx8IGNhbmRpZGF0ZSA9PT0gTWFya3VwS2luZC5NYXJrZG93bjtcbiAgICB9XG4gICAgTWFya3VwS2luZC5pcyA9IGlzO1xufSkoTWFya3VwS2luZCB8fCAoTWFya3VwS2luZCA9IHt9KSk7XG5leHBvcnQgdmFyIE1hcmt1cENvbnRlbnQ7XG4oZnVuY3Rpb24gKE1hcmt1cENvbnRlbnQpIHtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgY29uZm9ybXMgdG8gdGhlIHtAbGluayBNYXJrdXBDb250ZW50fSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKHZhbHVlKSAmJiBNYXJrdXBLaW5kLmlzKGNhbmRpZGF0ZS5raW5kKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnZhbHVlKTtcbiAgICB9XG4gICAgTWFya3VwQ29udGVudC5pcyA9IGlzO1xufSkoTWFya3VwQ29udGVudCB8fCAoTWFya3VwQ29udGVudCA9IHt9KSk7XG4vKipcbiAqIFRoZSBraW5kIG9mIGEgY29tcGxldGlvbiBlbnRyeS5cbiAqL1xuZXhwb3J0IHZhciBDb21wbGV0aW9uSXRlbUtpbmQ7XG4oZnVuY3Rpb24gKENvbXBsZXRpb25JdGVtS2luZCkge1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5UZXh0ID0gMTtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuTWV0aG9kID0gMjtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuRnVuY3Rpb24gPSAzO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5Db25zdHJ1Y3RvciA9IDQ7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkZpZWxkID0gNTtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuVmFyaWFibGUgPSA2O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5DbGFzcyA9IDc7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkludGVyZmFjZSA9IDg7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLk1vZHVsZSA9IDk7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlByb3BlcnR5ID0gMTA7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlVuaXQgPSAxMTtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuVmFsdWUgPSAxMjtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuRW51bSA9IDEzO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5LZXl3b3JkID0gMTQ7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlNuaXBwZXQgPSAxNTtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuQ29sb3IgPSAxNjtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuRmlsZSA9IDE3O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5SZWZlcmVuY2UgPSAxODtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuRm9sZGVyID0gMTk7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkVudW1NZW1iZXIgPSAyMDtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuQ29uc3RhbnQgPSAyMTtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuU3RydWN0ID0gMjI7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkV2ZW50ID0gMjM7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLk9wZXJhdG9yID0gMjQ7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlR5cGVQYXJhbWV0ZXIgPSAyNTtcbn0pKENvbXBsZXRpb25JdGVtS2luZCB8fCAoQ29tcGxldGlvbkl0ZW1LaW5kID0ge30pKTtcbi8qKlxuICogRGVmaW5lcyB3aGV0aGVyIHRoZSBpbnNlcnQgdGV4dCBpbiBhIGNvbXBsZXRpb24gaXRlbSBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXNcbiAqIHBsYWluIHRleHQgb3IgYSBzbmlwcGV0LlxuICovXG5leHBvcnQgdmFyIEluc2VydFRleHRGb3JtYXQ7XG4oZnVuY3Rpb24gKEluc2VydFRleHRGb3JtYXQpIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpbWFyeSB0ZXh0IHRvIGJlIGluc2VydGVkIGlzIHRyZWF0ZWQgYXMgYSBwbGFpbiBzdHJpbmcuXG4gICAgICovXG4gICAgSW5zZXJ0VGV4dEZvcm1hdC5QbGFpblRleHQgPSAxO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcmltYXJ5IHRleHQgdG8gYmUgaW5zZXJ0ZWQgaXMgdHJlYXRlZCBhcyBhIHNuaXBwZXQuXG4gICAgICpcbiAgICAgKiBBIHNuaXBwZXQgY2FuIGRlZmluZSB0YWIgc3RvcHMgYW5kIHBsYWNlaG9sZGVycyB3aXRoIGAkMWAsIGAkMmBcbiAgICAgKiBhbmQgYCR7Mzpmb299YC4gYCQwYCBkZWZpbmVzIHRoZSBmaW5hbCB0YWIgc3RvcCwgaXQgZGVmYXVsdHMgdG9cbiAgICAgKiB0aGUgZW5kIG9mIHRoZSBzbmlwcGV0LiBQbGFjZWhvbGRlcnMgd2l0aCBlcXVhbCBpZGVudGlmaWVycyBhcmUgbGlua2VkLFxuICAgICAqIHRoYXQgaXMgdHlwaW5nIGluIG9uZSB3aWxsIHVwZGF0ZSBvdGhlcnMgdG9vLlxuICAgICAqXG4gICAgICogU2VlIGFsc286IGh0dHBzOi8vbWljcm9zb2Z0LmdpdGh1Yi5pby9sYW5ndWFnZS1zZXJ2ZXItcHJvdG9jb2wvc3BlY2lmaWNhdGlvbnMvc3BlY2lmaWNhdGlvbi1jdXJyZW50LyNzbmlwcGV0X3N5bnRheFxuICAgICAqL1xuICAgIEluc2VydFRleHRGb3JtYXQuU25pcHBldCA9IDI7XG59KShJbnNlcnRUZXh0Rm9ybWF0IHx8IChJbnNlcnRUZXh0Rm9ybWF0ID0ge30pKTtcbi8qKlxuICogQ29tcGxldGlvbiBpdGVtIHRhZ3MgYXJlIGV4dHJhIGFubm90YXRpb25zIHRoYXQgdHdlYWsgdGhlIHJlbmRlcmluZyBvZiBhIGNvbXBsZXRpb25cbiAqIGl0ZW0uXG4gKlxuICogQHNpbmNlIDMuMTUuMFxuICovXG5leHBvcnQgdmFyIENvbXBsZXRpb25JdGVtVGFnO1xuKGZ1bmN0aW9uIChDb21wbGV0aW9uSXRlbVRhZykge1xuICAgIC8qKlxuICAgICAqIFJlbmRlciBhIGNvbXBsZXRpb24gYXMgb2Jzb2xldGUsIHVzdWFsbHkgdXNpbmcgYSBzdHJpa2Utb3V0LlxuICAgICAqL1xuICAgIENvbXBsZXRpb25JdGVtVGFnLkRlcHJlY2F0ZWQgPSAxO1xufSkoQ29tcGxldGlvbkl0ZW1UYWcgfHwgKENvbXBsZXRpb25JdGVtVGFnID0ge30pKTtcbi8qKlxuICogVGhlIEluc2VydFJlcGxhY2VFZGl0IG5hbWVzcGFjZSBwcm92aWRlcyBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIGluc2VydCAvIHJlcGxhY2UgZWRpdHMuXG4gKlxuICogQHNpbmNlIDMuMTYuMFxuICovXG5leHBvcnQgdmFyIEluc2VydFJlcGxhY2VFZGl0O1xuKGZ1bmN0aW9uIChJbnNlcnRSZXBsYWNlRWRpdCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zZXJ0IC8gcmVwbGFjZSBlZGl0XG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKG5ld1RleHQsIGluc2VydCwgcmVwbGFjZSkge1xuICAgICAgICByZXR1cm4geyBuZXdUZXh0LCBpbnNlcnQsIHJlcGxhY2UgfTtcbiAgICB9XG4gICAgSW5zZXJ0UmVwbGFjZUVkaXQuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgSW5zZXJ0UmVwbGFjZUVkaXR9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLm5ld1RleHQpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5pbnNlcnQpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yZXBsYWNlKTtcbiAgICB9XG4gICAgSW5zZXJ0UmVwbGFjZUVkaXQuaXMgPSBpcztcbn0pKEluc2VydFJlcGxhY2VFZGl0IHx8IChJbnNlcnRSZXBsYWNlRWRpdCA9IHt9KSk7XG4vKipcbiAqIEhvdyB3aGl0ZXNwYWNlIGFuZCBpbmRlbnRhdGlvbiBpcyBoYW5kbGVkIGR1cmluZyBjb21wbGV0aW9uXG4gKiBpdGVtIGluc2VydGlvbi5cbiAqXG4gKiBAc2luY2UgMy4xNi4wXG4gKi9cbmV4cG9ydCB2YXIgSW5zZXJ0VGV4dE1vZGU7XG4oZnVuY3Rpb24gKEluc2VydFRleHRNb2RlKSB7XG4gICAgLyoqXG4gICAgICogVGhlIGluc2VydGlvbiBvciByZXBsYWNlIHN0cmluZ3MgaXMgdGFrZW4gYXMgaXQgaXMuIElmIHRoZVxuICAgICAqIHZhbHVlIGlzIG11bHRpIGxpbmUgdGhlIGxpbmVzIGJlbG93IHRoZSBjdXJzb3Igd2lsbCBiZVxuICAgICAqIGluc2VydGVkIHVzaW5nIHRoZSBpbmRlbnRhdGlvbiBkZWZpbmVkIGluIHRoZSBzdHJpbmcgdmFsdWUuXG4gICAgICogVGhlIGNsaWVudCB3aWxsIG5vdCBhcHBseSBhbnkga2luZCBvZiBhZGp1c3RtZW50cyB0byB0aGVcbiAgICAgKiBzdHJpbmcuXG4gICAgICovXG4gICAgSW5zZXJ0VGV4dE1vZGUuYXNJcyA9IDE7XG4gICAgLyoqXG4gICAgICogVGhlIGVkaXRvciBhZGp1c3RzIGxlYWRpbmcgd2hpdGVzcGFjZSBvZiBuZXcgbGluZXMgc28gdGhhdFxuICAgICAqIHRoZXkgbWF0Y2ggdGhlIGluZGVudGF0aW9uIHVwIHRvIHRoZSBjdXJzb3Igb2YgdGhlIGxpbmUgZm9yXG4gICAgICogd2hpY2ggdGhlIGl0ZW0gaXMgYWNjZXB0ZWQuXG4gICAgICpcbiAgICAgKiBDb25zaWRlciBhIGxpbmUgbGlrZSB0aGlzOiA8MnRhYnM+PGN1cnNvcj48M3RhYnM+Zm9vLiBBY2NlcHRpbmcgYVxuICAgICAqIG11bHRpIGxpbmUgY29tcGxldGlvbiBpdGVtIGlzIGluZGVudGVkIHVzaW5nIDIgdGFicyBhbmQgYWxsXG4gICAgICogZm9sbG93aW5nIGxpbmVzIGluc2VydGVkIHdpbGwgYmUgaW5kZW50ZWQgdXNpbmcgMiB0YWJzIGFzIHdlbGwuXG4gICAgICovXG4gICAgSW5zZXJ0VGV4dE1vZGUuYWRqdXN0SW5kZW50YXRpb24gPSAyO1xufSkoSW5zZXJ0VGV4dE1vZGUgfHwgKEluc2VydFRleHRNb2RlID0ge30pKTtcbmV4cG9ydCB2YXIgQ29tcGxldGlvbkl0ZW1MYWJlbERldGFpbHM7XG4oZnVuY3Rpb24gKENvbXBsZXRpb25JdGVtTGFiZWxEZXRhaWxzKSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgKElzLnN0cmluZyhjYW5kaWRhdGUuZGV0YWlsKSB8fCBjYW5kaWRhdGUuZGV0YWlsID09PSB1bmRlZmluZWQpICYmXG4gICAgICAgICAgICAoSXMuc3RyaW5nKGNhbmRpZGF0ZS5kZXNjcmlwdGlvbikgfHwgY2FuZGlkYXRlLmRlc2NyaXB0aW9uID09PSB1bmRlZmluZWQpO1xuICAgIH1cbiAgICBDb21wbGV0aW9uSXRlbUxhYmVsRGV0YWlscy5pcyA9IGlzO1xufSkoQ29tcGxldGlvbkl0ZW1MYWJlbERldGFpbHMgfHwgKENvbXBsZXRpb25JdGVtTGFiZWxEZXRhaWxzID0ge30pKTtcbi8qKlxuICogVGhlIENvbXBsZXRpb25JdGVtIG5hbWVzcGFjZSBwcm92aWRlcyBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoXG4gKiBjb21wbGV0aW9uIGl0ZW1zLlxuICovXG5leHBvcnQgdmFyIENvbXBsZXRpb25JdGVtO1xuKGZ1bmN0aW9uIChDb21wbGV0aW9uSXRlbSkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIGNvbXBsZXRpb24gaXRlbSBhbmQgc2VlZCBpdCB3aXRoIGEgbGFiZWwuXG4gICAgICogQHBhcmFtIGxhYmVsIFRoZSBjb21wbGV0aW9uIGl0ZW0ncyBsYWJlbFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShsYWJlbCkge1xuICAgICAgICByZXR1cm4geyBsYWJlbCB9O1xuICAgIH1cbiAgICBDb21wbGV0aW9uSXRlbS5jcmVhdGUgPSBjcmVhdGU7XG59KShDb21wbGV0aW9uSXRlbSB8fCAoQ29tcGxldGlvbkl0ZW0gPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29tcGxldGlvbkxpc3QgbmFtZXNwYWNlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGhcbiAqIGNvbXBsZXRpb24gbGlzdHMuXG4gKi9cbmV4cG9ydCB2YXIgQ29tcGxldGlvbkxpc3Q7XG4oZnVuY3Rpb24gKENvbXBsZXRpb25MaXN0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBjb21wbGV0aW9uIGxpc3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaXRlbXMgVGhlIGNvbXBsZXRpb24gaXRlbXMuXG4gICAgICogQHBhcmFtIGlzSW5jb21wbGV0ZSBUaGUgbGlzdCBpcyBub3QgY29tcGxldGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGl0ZW1zLCBpc0luY29tcGxldGUpIHtcbiAgICAgICAgcmV0dXJuIHsgaXRlbXM6IGl0ZW1zID8gaXRlbXMgOiBbXSwgaXNJbmNvbXBsZXRlOiAhIWlzSW5jb21wbGV0ZSB9O1xuICAgIH1cbiAgICBDb21wbGV0aW9uTGlzdC5jcmVhdGUgPSBjcmVhdGU7XG59KShDb21wbGV0aW9uTGlzdCB8fCAoQ29tcGxldGlvbkxpc3QgPSB7fSkpO1xuZXhwb3J0IHZhciBNYXJrZWRTdHJpbmc7XG4oZnVuY3Rpb24gKE1hcmtlZFN0cmluZykge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBtYXJrZWQgc3RyaW5nIGZyb20gcGxhaW4gdGV4dC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwbGFpblRleHQgVGhlIHBsYWluIHRleHQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZnJvbVBsYWluVGV4dChwbGFpblRleHQpIHtcbiAgICAgICAgcmV0dXJuIHBsYWluVGV4dC5yZXBsYWNlKC9bXFxcXGAqX3t9W1xcXSgpIytcXC0uIV0vZywgJ1xcXFwkJicpOyAvLyBlc2NhcGUgbWFya2Rvd24gc3ludGF4IHRva2VuczogaHR0cDovL2RhcmluZ2ZpcmViYWxsLm5ldC9wcm9qZWN0cy9tYXJrZG93bi9zeW50YXgjYmFja3NsYXNoXG4gICAgfVxuICAgIE1hcmtlZFN0cmluZy5mcm9tUGxhaW5UZXh0ID0gZnJvbVBsYWluVGV4dDtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgY29uZm9ybXMgdG8gdGhlIHtAbGluayBNYXJrZWRTdHJpbmd9IHR5cGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5zdHJpbmcoY2FuZGlkYXRlKSB8fCAoSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUubGFuZ3VhZ2UpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudmFsdWUpKTtcbiAgICB9XG4gICAgTWFya2VkU3RyaW5nLmlzID0gaXM7XG59KShNYXJrZWRTdHJpbmcgfHwgKE1hcmtlZFN0cmluZyA9IHt9KSk7XG5leHBvcnQgdmFyIEhvdmVyO1xuKGZ1bmN0aW9uIChIb3Zlcikge1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBjb25mb3JtcyB0byB0aGUge0BsaW5rIEhvdmVyfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gISFjYW5kaWRhdGUgJiYgSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIChNYXJrdXBDb250ZW50LmlzKGNhbmRpZGF0ZS5jb250ZW50cykgfHxcbiAgICAgICAgICAgIE1hcmtlZFN0cmluZy5pcyhjYW5kaWRhdGUuY29udGVudHMpIHx8XG4gICAgICAgICAgICBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS5jb250ZW50cywgTWFya2VkU3RyaW5nLmlzKSkgJiYgKHZhbHVlLnJhbmdlID09PSB1bmRlZmluZWQgfHwgUmFuZ2UuaXModmFsdWUucmFuZ2UpKTtcbiAgICB9XG4gICAgSG92ZXIuaXMgPSBpcztcbn0pKEhvdmVyIHx8IChIb3ZlciA9IHt9KSk7XG4vKipcbiAqIFRoZSBQYXJhbWV0ZXJJbmZvcm1hdGlvbiBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBQYXJhbWV0ZXJJbmZvcm1hdGlvbn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgUGFyYW1ldGVySW5mb3JtYXRpb247XG4oZnVuY3Rpb24gKFBhcmFtZXRlckluZm9ybWF0aW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBwYXJhbWV0ZXIgaW5mb3JtYXRpb24gbGl0ZXJhbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBsYWJlbCBBIGxhYmVsIHN0cmluZy5cbiAgICAgKiBAcGFyYW0gZG9jdW1lbnRhdGlvbiBBIGRvYyBzdHJpbmcuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGxhYmVsLCBkb2N1bWVudGF0aW9uKSB7XG4gICAgICAgIHJldHVybiBkb2N1bWVudGF0aW9uID8geyBsYWJlbCwgZG9jdW1lbnRhdGlvbiB9IDogeyBsYWJlbCB9O1xuICAgIH1cbiAgICBQYXJhbWV0ZXJJbmZvcm1hdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG59KShQYXJhbWV0ZXJJbmZvcm1hdGlvbiB8fCAoUGFyYW1ldGVySW5mb3JtYXRpb24gPSB7fSkpO1xuLyoqXG4gKiBUaGUgU2lnbmF0dXJlSW5mb3JtYXRpb24gbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgU2lnbmF0dXJlSW5mb3JtYXRpb259IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIFNpZ25hdHVyZUluZm9ybWF0aW9uO1xuKGZ1bmN0aW9uIChTaWduYXR1cmVJbmZvcm1hdGlvbikge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShsYWJlbCwgZG9jdW1lbnRhdGlvbiwgLi4ucGFyYW1ldGVycykge1xuICAgICAgICBsZXQgcmVzdWx0ID0geyBsYWJlbCB9O1xuICAgICAgICBpZiAoSXMuZGVmaW5lZChkb2N1bWVudGF0aW9uKSkge1xuICAgICAgICAgICAgcmVzdWx0LmRvY3VtZW50YXRpb24gPSBkb2N1bWVudGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKHBhcmFtZXRlcnMpKSB7XG4gICAgICAgICAgICByZXN1bHQucGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQucGFyYW1ldGVycyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIFNpZ25hdHVyZUluZm9ybWF0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKFNpZ25hdHVyZUluZm9ybWF0aW9uIHx8IChTaWduYXR1cmVJbmZvcm1hdGlvbiA9IHt9KSk7XG4vKipcbiAqIEEgZG9jdW1lbnQgaGlnaGxpZ2h0IGtpbmQuXG4gKi9cbmV4cG9ydCB2YXIgRG9jdW1lbnRIaWdobGlnaHRLaW5kO1xuKGZ1bmN0aW9uIChEb2N1bWVudEhpZ2hsaWdodEtpbmQpIHtcbiAgICAvKipcbiAgICAgKiBBIHRleHR1YWwgb2NjdXJyZW5jZS5cbiAgICAgKi9cbiAgICBEb2N1bWVudEhpZ2hsaWdodEtpbmQuVGV4dCA9IDE7XG4gICAgLyoqXG4gICAgICogUmVhZC1hY2Nlc3Mgb2YgYSBzeW1ib2wsIGxpa2UgcmVhZGluZyBhIHZhcmlhYmxlLlxuICAgICAqL1xuICAgIERvY3VtZW50SGlnaGxpZ2h0S2luZC5SZWFkID0gMjtcbiAgICAvKipcbiAgICAgKiBXcml0ZS1hY2Nlc3Mgb2YgYSBzeW1ib2wsIGxpa2Ugd3JpdGluZyB0byBhIHZhcmlhYmxlLlxuICAgICAqL1xuICAgIERvY3VtZW50SGlnaGxpZ2h0S2luZC5Xcml0ZSA9IDM7XG59KShEb2N1bWVudEhpZ2hsaWdodEtpbmQgfHwgKERvY3VtZW50SGlnaGxpZ2h0S2luZCA9IHt9KSk7XG4vKipcbiAqIERvY3VtZW50SGlnaGxpZ2h0IG5hbWVzcGFjZSB0byBwcm92aWRlIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgRG9jdW1lbnRIaWdobGlnaHR9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIERvY3VtZW50SGlnaGxpZ2h0O1xuKGZ1bmN0aW9uIChEb2N1bWVudEhpZ2hsaWdodCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIERvY3VtZW50SGlnaGxpZ2h0IG9iamVjdC5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlIHRoZSBoaWdobGlnaHQgYXBwbGllcyB0by5cbiAgICAgKiBAcGFyYW0ga2luZCBUaGUgaGlnaGxpZ2h0IGtpbmRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIGtpbmQpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHsgcmFuZ2UgfTtcbiAgICAgICAgaWYgKElzLm51bWJlcihraW5kKSkge1xuICAgICAgICAgICAgcmVzdWx0LmtpbmQgPSBraW5kO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIERvY3VtZW50SGlnaGxpZ2h0LmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKERvY3VtZW50SGlnaGxpZ2h0IHx8IChEb2N1bWVudEhpZ2hsaWdodCA9IHt9KSk7XG4vKipcbiAqIEEgc3ltYm9sIGtpbmQuXG4gKi9cbmV4cG9ydCB2YXIgU3ltYm9sS2luZDtcbihmdW5jdGlvbiAoU3ltYm9sS2luZCkge1xuICAgIFN5bWJvbEtpbmQuRmlsZSA9IDE7XG4gICAgU3ltYm9sS2luZC5Nb2R1bGUgPSAyO1xuICAgIFN5bWJvbEtpbmQuTmFtZXNwYWNlID0gMztcbiAgICBTeW1ib2xLaW5kLlBhY2thZ2UgPSA0O1xuICAgIFN5bWJvbEtpbmQuQ2xhc3MgPSA1O1xuICAgIFN5bWJvbEtpbmQuTWV0aG9kID0gNjtcbiAgICBTeW1ib2xLaW5kLlByb3BlcnR5ID0gNztcbiAgICBTeW1ib2xLaW5kLkZpZWxkID0gODtcbiAgICBTeW1ib2xLaW5kLkNvbnN0cnVjdG9yID0gOTtcbiAgICBTeW1ib2xLaW5kLkVudW0gPSAxMDtcbiAgICBTeW1ib2xLaW5kLkludGVyZmFjZSA9IDExO1xuICAgIFN5bWJvbEtpbmQuRnVuY3Rpb24gPSAxMjtcbiAgICBTeW1ib2xLaW5kLlZhcmlhYmxlID0gMTM7XG4gICAgU3ltYm9sS2luZC5Db25zdGFudCA9IDE0O1xuICAgIFN5bWJvbEtpbmQuU3RyaW5nID0gMTU7XG4gICAgU3ltYm9sS2luZC5OdW1iZXIgPSAxNjtcbiAgICBTeW1ib2xLaW5kLkJvb2xlYW4gPSAxNztcbiAgICBTeW1ib2xLaW5kLkFycmF5ID0gMTg7XG4gICAgU3ltYm9sS2luZC5PYmplY3QgPSAxOTtcbiAgICBTeW1ib2xLaW5kLktleSA9IDIwO1xuICAgIFN5bWJvbEtpbmQuTnVsbCA9IDIxO1xuICAgIFN5bWJvbEtpbmQuRW51bU1lbWJlciA9IDIyO1xuICAgIFN5bWJvbEtpbmQuU3RydWN0ID0gMjM7XG4gICAgU3ltYm9sS2luZC5FdmVudCA9IDI0O1xuICAgIFN5bWJvbEtpbmQuT3BlcmF0b3IgPSAyNTtcbiAgICBTeW1ib2xLaW5kLlR5cGVQYXJhbWV0ZXIgPSAyNjtcbn0pKFN5bWJvbEtpbmQgfHwgKFN5bWJvbEtpbmQgPSB7fSkpO1xuLyoqXG4gKiBTeW1ib2wgdGFncyBhcmUgZXh0cmEgYW5ub3RhdGlvbnMgdGhhdCB0d2VhayB0aGUgcmVuZGVyaW5nIG9mIGEgc3ltYm9sLlxuICpcbiAqIEBzaW5jZSAzLjE2XG4gKi9cbmV4cG9ydCB2YXIgU3ltYm9sVGFnO1xuKGZ1bmN0aW9uIChTeW1ib2xUYWcpIHtcbiAgICAvKipcbiAgICAgKiBSZW5kZXIgYSBzeW1ib2wgYXMgb2Jzb2xldGUsIHVzdWFsbHkgdXNpbmcgYSBzdHJpa2Utb3V0LlxuICAgICAqL1xuICAgIFN5bWJvbFRhZy5EZXByZWNhdGVkID0gMTtcbn0pKFN5bWJvbFRhZyB8fCAoU3ltYm9sVGFnID0ge30pKTtcbmV4cG9ydCB2YXIgU3ltYm9sSW5mb3JtYXRpb247XG4oZnVuY3Rpb24gKFN5bWJvbEluZm9ybWF0aW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBzeW1ib2wgaW5mb3JtYXRpb24gbGl0ZXJhbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIGtpbmQgVGhlIGtpbmQgb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlIG9mIHRoZSBsb2NhdGlvbiBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIHJlc291cmNlIG9mIHRoZSBsb2NhdGlvbiBvZiBzeW1ib2wuXG4gICAgICogQHBhcmFtIGNvbnRhaW5lck5hbWUgVGhlIG5hbWUgb2YgdGhlIHN5bWJvbCBjb250YWluaW5nIHRoZSBzeW1ib2wuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKG5hbWUsIGtpbmQsIHJhbmdlLCB1cmksIGNvbnRhaW5lck5hbWUpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBraW5kLFxuICAgICAgICAgICAgbG9jYXRpb246IHsgdXJpLCByYW5nZSB9XG4gICAgICAgIH07XG4gICAgICAgIGlmIChjb250YWluZXJOYW1lKSB7XG4gICAgICAgICAgICByZXN1bHQuY29udGFpbmVyTmFtZSA9IGNvbnRhaW5lck5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgU3ltYm9sSW5mb3JtYXRpb24uY3JlYXRlID0gY3JlYXRlO1xufSkoU3ltYm9sSW5mb3JtYXRpb24gfHwgKFN5bWJvbEluZm9ybWF0aW9uID0ge30pKTtcbmV4cG9ydCB2YXIgV29ya3NwYWNlU3ltYm9sO1xuKGZ1bmN0aW9uIChXb3Jrc3BhY2VTeW1ib2wpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgd29ya3NwYWNlIHN5bWJvbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIGtpbmQgVGhlIGtpbmQgb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSByZXNvdXJjZSBvZiB0aGUgbG9jYXRpb24gb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgQW4gb3B0aW9ucyByYW5nZSBvZiB0aGUgbG9jYXRpb24uXG4gICAgICogQHJldHVybnMgQSBXb3Jrc3BhY2VTeW1ib2wuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKG5hbWUsIGtpbmQsIHVyaSwgcmFuZ2UpIHtcbiAgICAgICAgcmV0dXJuIHJhbmdlICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8geyBuYW1lLCBraW5kLCBsb2NhdGlvbjogeyB1cmksIHJhbmdlIH0gfVxuICAgICAgICAgICAgOiB7IG5hbWUsIGtpbmQsIGxvY2F0aW9uOiB7IHVyaSB9IH07XG4gICAgfVxuICAgIFdvcmtzcGFjZVN5bWJvbC5jcmVhdGUgPSBjcmVhdGU7XG59KShXb3Jrc3BhY2VTeW1ib2wgfHwgKFdvcmtzcGFjZVN5bWJvbCA9IHt9KSk7XG5leHBvcnQgdmFyIERvY3VtZW50U3ltYm9sO1xuKGZ1bmN0aW9uIChEb2N1bWVudFN5bWJvbCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgc3ltYm9sIGluZm9ybWF0aW9uIGxpdGVyYWwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSBkZXRhaWwgVGhlIGRldGFpbCBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSBraW5kIFRoZSBraW5kIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSBzZWxlY3Rpb25SYW5nZSBUaGUgc2VsZWN0aW9uUmFuZ2Ugb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gY2hpbGRyZW4gQ2hpbGRyZW4gb2YgdGhlIHN5bWJvbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobmFtZSwgZGV0YWlsLCBraW5kLCByYW5nZSwgc2VsZWN0aW9uUmFuZ2UsIGNoaWxkcmVuKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgZGV0YWlsLFxuICAgICAgICAgICAga2luZCxcbiAgICAgICAgICAgIHJhbmdlLFxuICAgICAgICAgICAgc2VsZWN0aW9uUmFuZ2VcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGNoaWxkcmVuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIERvY3VtZW50U3ltYm9sLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIERvY3VtZW50U3ltYm9sfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmXG4gICAgICAgICAgICBJcy5zdHJpbmcoY2FuZGlkYXRlLm5hbWUpICYmIElzLm51bWJlcihjYW5kaWRhdGUua2luZCkgJiZcbiAgICAgICAgICAgIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnNlbGVjdGlvblJhbmdlKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5kZXRhaWwgPT09IHVuZGVmaW5lZCB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLmRldGFpbCkpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmRlcHJlY2F0ZWQgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5kZXByZWNhdGVkKSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuY2hpbGRyZW4gPT09IHVuZGVmaW5lZCB8fCBBcnJheS5pc0FycmF5KGNhbmRpZGF0ZS5jaGlsZHJlbikpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLnRhZ3MgPT09IHVuZGVmaW5lZCB8fCBBcnJheS5pc0FycmF5KGNhbmRpZGF0ZS50YWdzKSk7XG4gICAgfVxuICAgIERvY3VtZW50U3ltYm9sLmlzID0gaXM7XG59KShEb2N1bWVudFN5bWJvbCB8fCAoRG9jdW1lbnRTeW1ib2wgPSB7fSkpO1xuLyoqXG4gKiBBIHNldCBvZiBwcmVkZWZpbmVkIGNvZGUgYWN0aW9uIGtpbmRzXG4gKi9cbmV4cG9ydCB2YXIgQ29kZUFjdGlvbktpbmQ7XG4oZnVuY3Rpb24gKENvZGVBY3Rpb25LaW5kKSB7XG4gICAgLyoqXG4gICAgICogRW1wdHkga2luZC5cbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5FbXB0eSA9ICcnO1xuICAgIC8qKlxuICAgICAqIEJhc2Uga2luZCBmb3IgcXVpY2tmaXggYWN0aW9uczogJ3F1aWNrZml4J1xuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlF1aWNrRml4ID0gJ3F1aWNrZml4JztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIHJlZmFjdG9yaW5nIGFjdGlvbnM6ICdyZWZhY3RvcidcbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5SZWZhY3RvciA9ICdyZWZhY3Rvcic7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciByZWZhY3RvcmluZyBleHRyYWN0aW9uIGFjdGlvbnM6ICdyZWZhY3Rvci5leHRyYWN0J1xuICAgICAqXG4gICAgICogRXhhbXBsZSBleHRyYWN0IGFjdGlvbnM6XG4gICAgICpcbiAgICAgKiAtIEV4dHJhY3QgbWV0aG9kXG4gICAgICogLSBFeHRyYWN0IGZ1bmN0aW9uXG4gICAgICogLSBFeHRyYWN0IHZhcmlhYmxlXG4gICAgICogLSBFeHRyYWN0IGludGVyZmFjZSBmcm9tIGNsYXNzXG4gICAgICogLSAuLi5cbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5SZWZhY3RvckV4dHJhY3QgPSAncmVmYWN0b3IuZXh0cmFjdCc7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciByZWZhY3RvcmluZyBpbmxpbmUgYWN0aW9uczogJ3JlZmFjdG9yLmlubGluZSdcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgaW5saW5lIGFjdGlvbnM6XG4gICAgICpcbiAgICAgKiAtIElubGluZSBmdW5jdGlvblxuICAgICAqIC0gSW5saW5lIHZhcmlhYmxlXG4gICAgICogLSBJbmxpbmUgY29uc3RhbnRcbiAgICAgKiAtIC4uLlxuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlJlZmFjdG9ySW5saW5lID0gJ3JlZmFjdG9yLmlubGluZSc7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciByZWZhY3RvcmluZyByZXdyaXRlIGFjdGlvbnM6ICdyZWZhY3Rvci5yZXdyaXRlJ1xuICAgICAqXG4gICAgICogRXhhbXBsZSByZXdyaXRlIGFjdGlvbnM6XG4gICAgICpcbiAgICAgKiAtIENvbnZlcnQgSmF2YVNjcmlwdCBmdW5jdGlvbiB0byBjbGFzc1xuICAgICAqIC0gQWRkIG9yIHJlbW92ZSBwYXJhbWV0ZXJcbiAgICAgKiAtIEVuY2Fwc3VsYXRlIGZpZWxkXG4gICAgICogLSBNYWtlIG1ldGhvZCBzdGF0aWNcbiAgICAgKiAtIE1vdmUgbWV0aG9kIHRvIGJhc2UgY2xhc3NcbiAgICAgKiAtIC4uLlxuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlJlZmFjdG9yUmV3cml0ZSA9ICdyZWZhY3Rvci5yZXdyaXRlJztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIHNvdXJjZSBhY3Rpb25zOiBgc291cmNlYFxuICAgICAqXG4gICAgICogU291cmNlIGNvZGUgYWN0aW9ucyBhcHBseSB0byB0aGUgZW50aXJlIGZpbGUuXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuU291cmNlID0gJ3NvdXJjZSc7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciBhbiBvcmdhbml6ZSBpbXBvcnRzIHNvdXJjZSBhY3Rpb246IGBzb3VyY2Uub3JnYW5pemVJbXBvcnRzYFxuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlNvdXJjZU9yZ2FuaXplSW1wb3J0cyA9ICdzb3VyY2Uub3JnYW5pemVJbXBvcnRzJztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIGF1dG8tZml4IHNvdXJjZSBhY3Rpb25zOiBgc291cmNlLmZpeEFsbGAuXG4gICAgICpcbiAgICAgKiBGaXggYWxsIGFjdGlvbnMgYXV0b21hdGljYWxseSBmaXggZXJyb3JzIHRoYXQgaGF2ZSBhIGNsZWFyIGZpeCB0aGF0IGRvIG5vdCByZXF1aXJlIHVzZXIgaW5wdXQuXG4gICAgICogVGhleSBzaG91bGQgbm90IHN1cHByZXNzIGVycm9ycyBvciBwZXJmb3JtIHVuc2FmZSBmaXhlcyBzdWNoIGFzIGdlbmVyYXRpbmcgbmV3IHR5cGVzIG9yIGNsYXNzZXMuXG4gICAgICpcbiAgICAgKiBAc2luY2UgMy4xNS4wXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuU291cmNlRml4QWxsID0gJ3NvdXJjZS5maXhBbGwnO1xufSkoQ29kZUFjdGlvbktpbmQgfHwgKENvZGVBY3Rpb25LaW5kID0ge30pKTtcbi8qKlxuICogVGhlIHJlYXNvbiB3aHkgY29kZSBhY3Rpb25zIHdlcmUgcmVxdWVzdGVkLlxuICpcbiAqIEBzaW5jZSAzLjE3LjBcbiAqL1xuZXhwb3J0IHZhciBDb2RlQWN0aW9uVHJpZ2dlcktpbmQ7XG4oZnVuY3Rpb24gKENvZGVBY3Rpb25UcmlnZ2VyS2luZCkge1xuICAgIC8qKlxuICAgICAqIENvZGUgYWN0aW9ucyB3ZXJlIGV4cGxpY2l0bHkgcmVxdWVzdGVkIGJ5IHRoZSB1c2VyIG9yIGJ5IGFuIGV4dGVuc2lvbi5cbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uVHJpZ2dlcktpbmQuSW52b2tlZCA9IDE7XG4gICAgLyoqXG4gICAgICogQ29kZSBhY3Rpb25zIHdlcmUgcmVxdWVzdGVkIGF1dG9tYXRpY2FsbHkuXG4gICAgICpcbiAgICAgKiBUaGlzIHR5cGljYWxseSBoYXBwZW5zIHdoZW4gY3VycmVudCBzZWxlY3Rpb24gaW4gYSBmaWxlIGNoYW5nZXMsIGJ1dCBjYW5cbiAgICAgKiBhbHNvIGJlIHRyaWdnZXJlZCB3aGVuIGZpbGUgY29udGVudCBjaGFuZ2VzLlxuICAgICAqL1xuICAgIENvZGVBY3Rpb25UcmlnZ2VyS2luZC5BdXRvbWF0aWMgPSAyO1xufSkoQ29kZUFjdGlvblRyaWdnZXJLaW5kIHx8IChDb2RlQWN0aW9uVHJpZ2dlcktpbmQgPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29kZUFjdGlvbkNvbnRleHQgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgQ29kZUFjdGlvbkNvbnRleHR9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIENvZGVBY3Rpb25Db250ZXh0O1xuKGZ1bmN0aW9uIChDb2RlQWN0aW9uQ29udGV4dCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ29kZUFjdGlvbkNvbnRleHQgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUoZGlhZ25vc3RpY3MsIG9ubHksIHRyaWdnZXJLaW5kKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IGRpYWdub3N0aWNzIH07XG4gICAgICAgIGlmIChvbmx5ICE9PSB1bmRlZmluZWQgJiYgb25seSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmVzdWx0Lm9ubHkgPSBvbmx5O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmlnZ2VyS2luZCAhPT0gdW5kZWZpbmVkICYmIHRyaWdnZXJLaW5kICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXN1bHQudHJpZ2dlcktpbmQgPSB0cmlnZ2VyS2luZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBDb2RlQWN0aW9uQ29udGV4dC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBDb2RlQWN0aW9uQ29udGV4dH0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS5kaWFnbm9zdGljcywgRGlhZ25vc3RpYy5pcylcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUub25seSA9PT0gdW5kZWZpbmVkIHx8IElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLm9ubHksIElzLnN0cmluZykpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLnRyaWdnZXJLaW5kID09PSB1bmRlZmluZWQgfHwgY2FuZGlkYXRlLnRyaWdnZXJLaW5kID09PSBDb2RlQWN0aW9uVHJpZ2dlcktpbmQuSW52b2tlZCB8fCBjYW5kaWRhdGUudHJpZ2dlcktpbmQgPT09IENvZGVBY3Rpb25UcmlnZ2VyS2luZC5BdXRvbWF0aWMpO1xuICAgIH1cbiAgICBDb2RlQWN0aW9uQ29udGV4dC5pcyA9IGlzO1xufSkoQ29kZUFjdGlvbkNvbnRleHQgfHwgKENvZGVBY3Rpb25Db250ZXh0ID0ge30pKTtcbmV4cG9ydCB2YXIgQ29kZUFjdGlvbjtcbihmdW5jdGlvbiAoQ29kZUFjdGlvbikge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh0aXRsZSwga2luZE9yQ29tbWFuZE9yRWRpdCwga2luZCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0geyB0aXRsZSB9O1xuICAgICAgICBsZXQgY2hlY2tLaW5kID0gdHJ1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBraW5kT3JDb21tYW5kT3JFZGl0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY2hlY2tLaW5kID0gZmFsc2U7XG4gICAgICAgICAgICByZXN1bHQua2luZCA9IGtpbmRPckNvbW1hbmRPckVkaXQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoQ29tbWFuZC5pcyhraW5kT3JDb21tYW5kT3JFZGl0KSkge1xuICAgICAgICAgICAgcmVzdWx0LmNvbW1hbmQgPSBraW5kT3JDb21tYW5kT3JFZGl0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0LmVkaXQgPSBraW5kT3JDb21tYW5kT3JFZGl0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGVja0tpbmQgJiYga2luZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQua2luZCA9IGtpbmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgQ29kZUFjdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLnN0cmluZyhjYW5kaWRhdGUudGl0bGUpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmRpYWdub3N0aWNzID09PSB1bmRlZmluZWQgfHwgSXMudHlwZWRBcnJheShjYW5kaWRhdGUuZGlhZ25vc3RpY3MsIERpYWdub3N0aWMuaXMpKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5raW5kID09PSB1bmRlZmluZWQgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS5raW5kKSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuZWRpdCAhPT0gdW5kZWZpbmVkIHx8IGNhbmRpZGF0ZS5jb21tYW5kICE9PSB1bmRlZmluZWQpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmNvbW1hbmQgPT09IHVuZGVmaW5lZCB8fCBDb21tYW5kLmlzKGNhbmRpZGF0ZS5jb21tYW5kKSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuaXNQcmVmZXJyZWQgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5pc1ByZWZlcnJlZCkpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmVkaXQgPT09IHVuZGVmaW5lZCB8fCBXb3Jrc3BhY2VFZGl0LmlzKGNhbmRpZGF0ZS5lZGl0KSk7XG4gICAgfVxuICAgIENvZGVBY3Rpb24uaXMgPSBpcztcbn0pKENvZGVBY3Rpb24gfHwgKENvZGVBY3Rpb24gPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29kZUxlbnMgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgQ29kZUxlbnN9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIENvZGVMZW5zO1xuKGZ1bmN0aW9uIChDb2RlTGVucykge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ29kZUxlbnMgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIGRhdGEpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHsgcmFuZ2UgfTtcbiAgICAgICAgaWYgKElzLmRlZmluZWQoZGF0YSkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5kYXRhID0gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBDb2RlTGVucy5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBDb2RlTGVuc30gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLmNvbW1hbmQpIHx8IENvbW1hbmQuaXMoY2FuZGlkYXRlLmNvbW1hbmQpKTtcbiAgICB9XG4gICAgQ29kZUxlbnMuaXMgPSBpcztcbn0pKENvZGVMZW5zIHx8IChDb2RlTGVucyA9IHt9KSk7XG4vKipcbiAqIFRoZSBGb3JtYXR0aW5nT3B0aW9ucyBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBGb3JtYXR0aW5nT3B0aW9uc30gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgRm9ybWF0dGluZ09wdGlvbnM7XG4oZnVuY3Rpb24gKEZvcm1hdHRpbmdPcHRpb25zKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBGb3JtYXR0aW5nT3B0aW9ucyBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh0YWJTaXplLCBpbnNlcnRTcGFjZXMpIHtcbiAgICAgICAgcmV0dXJuIHsgdGFiU2l6ZSwgaW5zZXJ0U3BhY2VzIH07XG4gICAgfVxuICAgIEZvcm1hdHRpbmdPcHRpb25zLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIEZvcm1hdHRpbmdPcHRpb25zfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS50YWJTaXplKSAmJiBJcy5ib29sZWFuKGNhbmRpZGF0ZS5pbnNlcnRTcGFjZXMpO1xuICAgIH1cbiAgICBGb3JtYXR0aW5nT3B0aW9ucy5pcyA9IGlzO1xufSkoRm9ybWF0dGluZ09wdGlvbnMgfHwgKEZvcm1hdHRpbmdPcHRpb25zID0ge30pKTtcbi8qKlxuICogVGhlIERvY3VtZW50TGluayBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBEb2N1bWVudExpbmt9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIERvY3VtZW50TGluaztcbihmdW5jdGlvbiAoRG9jdW1lbnRMaW5rKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBEb2N1bWVudExpbmsgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIHRhcmdldCwgZGF0YSkge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgdGFyZ2V0LCBkYXRhIH07XG4gICAgfVxuICAgIERvY3VtZW50TGluay5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBEb2N1bWVudExpbmt9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS50YXJnZXQpIHx8IElzLnN0cmluZyhjYW5kaWRhdGUudGFyZ2V0KSk7XG4gICAgfVxuICAgIERvY3VtZW50TGluay5pcyA9IGlzO1xufSkoRG9jdW1lbnRMaW5rIHx8IChEb2N1bWVudExpbmsgPSB7fSkpO1xuLyoqXG4gKiBUaGUgU2VsZWN0aW9uUmFuZ2UgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbiB0byB3b3JrIHdpdGhcbiAqIFNlbGVjdGlvblJhbmdlIGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIFNlbGVjdGlvblJhbmdlO1xuKGZ1bmN0aW9uIChTZWxlY3Rpb25SYW5nZSkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgU2VsZWN0aW9uUmFuZ2VcbiAgICAgKiBAcGFyYW0gcmFuZ2UgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSBwYXJlbnQgYW4gb3B0aW9uYWwgcGFyZW50LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgcGFyZW50KSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCBwYXJlbnQgfTtcbiAgICB9XG4gICAgU2VsZWN0aW9uUmFuZ2UuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIChjYW5kaWRhdGUucGFyZW50ID09PSB1bmRlZmluZWQgfHwgU2VsZWN0aW9uUmFuZ2UuaXMoY2FuZGlkYXRlLnBhcmVudCkpO1xuICAgIH1cbiAgICBTZWxlY3Rpb25SYW5nZS5pcyA9IGlzO1xufSkoU2VsZWN0aW9uUmFuZ2UgfHwgKFNlbGVjdGlvblJhbmdlID0ge30pKTtcbi8qKlxuICogQSBzZXQgb2YgcHJlZGVmaW5lZCB0b2tlbiB0eXBlcy4gVGhpcyBzZXQgaXMgbm90IGZpeGVkXG4gKiBhbiBjbGllbnRzIGNhbiBzcGVjaWZ5IGFkZGl0aW9uYWwgdG9rZW4gdHlwZXMgdmlhIHRoZVxuICogY29ycmVzcG9uZGluZyBjbGllbnQgY2FwYWJpbGl0aWVzLlxuICpcbiAqIEBzaW5jZSAzLjE2LjBcbiAqL1xuZXhwb3J0IHZhciBTZW1hbnRpY1Rva2VuVHlwZXM7XG4oZnVuY3Rpb24gKFNlbWFudGljVG9rZW5UeXBlcykge1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcIm5hbWVzcGFjZVwiXSA9IFwibmFtZXNwYWNlXCI7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIGdlbmVyaWMgdHlwZS4gQWN0cyBhcyBhIGZhbGxiYWNrIGZvciB0eXBlcyB3aGljaCBjYW4ndCBiZSBtYXBwZWQgdG9cbiAgICAgKiBhIHNwZWNpZmljIHR5cGUgbGlrZSBjbGFzcyBvciBlbnVtLlxuICAgICAqL1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInR5cGVcIl0gPSBcInR5cGVcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJjbGFzc1wiXSA9IFwiY2xhc3NcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJlbnVtXCJdID0gXCJlbnVtXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wiaW50ZXJmYWNlXCJdID0gXCJpbnRlcmZhY2VcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJzdHJ1Y3RcIl0gPSBcInN0cnVjdFwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInR5cGVQYXJhbWV0ZXJcIl0gPSBcInR5cGVQYXJhbWV0ZXJcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJwYXJhbWV0ZXJcIl0gPSBcInBhcmFtZXRlclwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInZhcmlhYmxlXCJdID0gXCJ2YXJpYWJsZVwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInByb3BlcnR5XCJdID0gXCJwcm9wZXJ0eVwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImVudW1NZW1iZXJcIl0gPSBcImVudW1NZW1iZXJcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJldmVudFwiXSA9IFwiZXZlbnRcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJmdW5jdGlvblwiXSA9IFwiZnVuY3Rpb25cIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJtZXRob2RcIl0gPSBcIm1ldGhvZFwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcIm1hY3JvXCJdID0gXCJtYWNyb1wiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImtleXdvcmRcIl0gPSBcImtleXdvcmRcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJtb2RpZmllclwiXSA9IFwibW9kaWZpZXJcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJjb21tZW50XCJdID0gXCJjb21tZW50XCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wic3RyaW5nXCJdID0gXCJzdHJpbmdcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJudW1iZXJcIl0gPSBcIm51bWJlclwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInJlZ2V4cFwiXSA9IFwicmVnZXhwXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wib3BlcmF0b3JcIl0gPSBcIm9wZXJhdG9yXCI7XG4gICAgLyoqXG4gICAgICogQHNpbmNlIDMuMTcuMFxuICAgICAqL1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImRlY29yYXRvclwiXSA9IFwiZGVjb3JhdG9yXCI7XG59KShTZW1hbnRpY1Rva2VuVHlwZXMgfHwgKFNlbWFudGljVG9rZW5UeXBlcyA9IHt9KSk7XG4vKipcbiAqIEEgc2V0IG9mIHByZWRlZmluZWQgdG9rZW4gbW9kaWZpZXJzLiBUaGlzIHNldCBpcyBub3QgZml4ZWRcbiAqIGFuIGNsaWVudHMgY2FuIHNwZWNpZnkgYWRkaXRpb25hbCB0b2tlbiB0eXBlcyB2aWEgdGhlXG4gKiBjb3JyZXNwb25kaW5nIGNsaWVudCBjYXBhYmlsaXRpZXMuXG4gKlxuICogQHNpbmNlIDMuMTYuMFxuICovXG5leHBvcnQgdmFyIFNlbWFudGljVG9rZW5Nb2RpZmllcnM7XG4oZnVuY3Rpb24gKFNlbWFudGljVG9rZW5Nb2RpZmllcnMpIHtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wiZGVjbGFyYXRpb25cIl0gPSBcImRlY2xhcmF0aW9uXCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcImRlZmluaXRpb25cIl0gPSBcImRlZmluaXRpb25cIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wicmVhZG9ubHlcIl0gPSBcInJlYWRvbmx5XCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcInN0YXRpY1wiXSA9IFwic3RhdGljXCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcImRlcHJlY2F0ZWRcIl0gPSBcImRlcHJlY2F0ZWRcIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wiYWJzdHJhY3RcIl0gPSBcImFic3RyYWN0XCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcImFzeW5jXCJdID0gXCJhc3luY1wiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJtb2RpZmljYXRpb25cIl0gPSBcIm1vZGlmaWNhdGlvblwiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJkb2N1bWVudGF0aW9uXCJdID0gXCJkb2N1bWVudGF0aW9uXCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcImRlZmF1bHRMaWJyYXJ5XCJdID0gXCJkZWZhdWx0TGlicmFyeVwiO1xufSkoU2VtYW50aWNUb2tlbk1vZGlmaWVycyB8fCAoU2VtYW50aWNUb2tlbk1vZGlmaWVycyA9IHt9KSk7XG4vKipcbiAqIEBzaW5jZSAzLjE2LjBcbiAqL1xuZXhwb3J0IHZhciBTZW1hbnRpY1Rva2VucztcbihmdW5jdGlvbiAoU2VtYW50aWNUb2tlbnMpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiAoY2FuZGlkYXRlLnJlc3VsdElkID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIGNhbmRpZGF0ZS5yZXN1bHRJZCA9PT0gJ3N0cmluZycpICYmXG4gICAgICAgICAgICBBcnJheS5pc0FycmF5KGNhbmRpZGF0ZS5kYXRhKSAmJiAoY2FuZGlkYXRlLmRhdGEubGVuZ3RoID09PSAwIHx8IHR5cGVvZiBjYW5kaWRhdGUuZGF0YVswXSA9PT0gJ251bWJlcicpO1xuICAgIH1cbiAgICBTZW1hbnRpY1Rva2Vucy5pcyA9IGlzO1xufSkoU2VtYW50aWNUb2tlbnMgfHwgKFNlbWFudGljVG9rZW5zID0ge30pKTtcbi8qKlxuICogVGhlIElubGluZVZhbHVlVGV4dCBuYW1lc3BhY2UgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCBJbmxpbmVWYWx1ZVRleHRzLlxuICpcbiAqIEBzaW5jZSAzLjE3LjBcbiAqL1xuZXhwb3J0IHZhciBJbmxpbmVWYWx1ZVRleHQ7XG4oZnVuY3Rpb24gKElubGluZVZhbHVlVGV4dCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgSW5saW5lVmFsdWVUZXh0IGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCB0ZXh0KSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCB0ZXh0IH07XG4gICAgfVxuICAgIElubGluZVZhbHVlVGV4dC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgIT09IHVuZGVmaW5lZCAmJiBjYW5kaWRhdGUgIT09IG51bGwgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnRleHQpO1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZVRleHQuaXMgPSBpcztcbn0pKElubGluZVZhbHVlVGV4dCB8fCAoSW5saW5lVmFsdWVUZXh0ID0ge30pKTtcbi8qKlxuICogVGhlIElubGluZVZhbHVlVmFyaWFibGVMb29rdXAgbmFtZXNwYWNlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGggSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cHMuXG4gKlxuICogQHNpbmNlIDMuMTcuMFxuICovXG5leHBvcnQgdmFyIElubGluZVZhbHVlVmFyaWFibGVMb29rdXA7XG4oZnVuY3Rpb24gKElubGluZVZhbHVlVmFyaWFibGVMb29rdXApIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IElubGluZVZhbHVlVGV4dCBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgdmFyaWFibGVOYW1lLCBjYXNlU2Vuc2l0aXZlTG9va3VwKSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCB2YXJpYWJsZU5hbWUsIGNhc2VTZW5zaXRpdmVMb29rdXAgfTtcbiAgICB9XG4gICAgSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgIT09IHVuZGVmaW5lZCAmJiBjYW5kaWRhdGUgIT09IG51bGwgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiBJcy5ib29sZWFuKGNhbmRpZGF0ZS5jYXNlU2Vuc2l0aXZlTG9va3VwKVxuICAgICAgICAgICAgJiYgKElzLnN0cmluZyhjYW5kaWRhdGUudmFyaWFibGVOYW1lKSB8fCBjYW5kaWRhdGUudmFyaWFibGVOYW1lID09PSB1bmRlZmluZWQpO1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwLmlzID0gaXM7XG59KShJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwIHx8IChJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwID0ge30pKTtcbi8qKlxuICogVGhlIElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uIG5hbWVzcGFjZSBwcm92aWRlcyBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uLlxuICpcbiAqIEBzaW5jZSAzLjE3LjBcbiAqL1xuZXhwb3J0IHZhciBJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbjtcbihmdW5jdGlvbiAoSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCBleHByZXNzaW9uKSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCBleHByZXNzaW9uIH07XG4gICAgfVxuICAgIElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAhPT0gdW5kZWZpbmVkICYmIGNhbmRpZGF0ZSAhPT0gbnVsbCAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpXG4gICAgICAgICAgICAmJiAoSXMuc3RyaW5nKGNhbmRpZGF0ZS5leHByZXNzaW9uKSB8fCBjYW5kaWRhdGUuZXhwcmVzc2lvbiA9PT0gdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24uaXMgPSBpcztcbn0pKElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uIHx8IChJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBJbmxpbmVWYWx1ZUNvbnRleHQgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgSW5saW5lVmFsdWVDb250ZXh0fSBsaXRlcmFscy5cbiAqXG4gKiBAc2luY2UgMy4xNy4wXG4gKi9cbmV4cG9ydCB2YXIgSW5saW5lVmFsdWVDb250ZXh0O1xuKGZ1bmN0aW9uIChJbmxpbmVWYWx1ZUNvbnRleHQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IElubGluZVZhbHVlQ29udGV4dCBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShmcmFtZUlkLCBzdG9wcGVkTG9jYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHsgZnJhbWVJZCwgc3RvcHBlZExvY2F0aW9uIH07XG4gICAgfVxuICAgIElubGluZVZhbHVlQ29udGV4dC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBJbmxpbmVWYWx1ZUNvbnRleHR9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyh2YWx1ZS5zdG9wcGVkTG9jYXRpb24pO1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZUNvbnRleHQuaXMgPSBpcztcbn0pKElubGluZVZhbHVlQ29udGV4dCB8fCAoSW5saW5lVmFsdWVDb250ZXh0ID0ge30pKTtcbi8qKlxuICogSW5sYXkgaGludCBraW5kcy5cbiAqXG4gKiBAc2luY2UgMy4xNy4wXG4gKi9cbmV4cG9ydCB2YXIgSW5sYXlIaW50S2luZDtcbihmdW5jdGlvbiAoSW5sYXlIaW50S2luZCkge1xuICAgIC8qKlxuICAgICAqIEFuIGlubGF5IGhpbnQgdGhhdCBmb3IgYSB0eXBlIGFubm90YXRpb24uXG4gICAgICovXG4gICAgSW5sYXlIaW50S2luZC5UeXBlID0gMTtcbiAgICAvKipcbiAgICAgKiBBbiBpbmxheSBoaW50IHRoYXQgaXMgZm9yIGEgcGFyYW1ldGVyLlxuICAgICAqL1xuICAgIElubGF5SGludEtpbmQuUGFyYW1ldGVyID0gMjtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWUgPT09IDEgfHwgdmFsdWUgPT09IDI7XG4gICAgfVxuICAgIElubGF5SGludEtpbmQuaXMgPSBpcztcbn0pKElubGF5SGludEtpbmQgfHwgKElubGF5SGludEtpbmQgPSB7fSkpO1xuZXhwb3J0IHZhciBJbmxheUhpbnRMYWJlbFBhcnQ7XG4oZnVuY3Rpb24gKElubGF5SGludExhYmVsUGFydCkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh2YWx1ZSkge1xuICAgICAgICByZXR1cm4geyB2YWx1ZSB9O1xuICAgIH1cbiAgICBJbmxheUhpbnRMYWJlbFBhcnQuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLnRvb2x0aXAgPT09IHVuZGVmaW5lZCB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLnRvb2x0aXApIHx8IE1hcmt1cENvbnRlbnQuaXMoY2FuZGlkYXRlLnRvb2x0aXApKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS5sb2NhdGlvbiA9PT0gdW5kZWZpbmVkIHx8IExvY2F0aW9uLmlzKGNhbmRpZGF0ZS5sb2NhdGlvbikpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLmNvbW1hbmQgPT09IHVuZGVmaW5lZCB8fCBDb21tYW5kLmlzKGNhbmRpZGF0ZS5jb21tYW5kKSk7XG4gICAgfVxuICAgIElubGF5SGludExhYmVsUGFydC5pcyA9IGlzO1xufSkoSW5sYXlIaW50TGFiZWxQYXJ0IHx8IChJbmxheUhpbnRMYWJlbFBhcnQgPSB7fSkpO1xuZXhwb3J0IHZhciBJbmxheUhpbnQ7XG4oZnVuY3Rpb24gKElubGF5SGludCkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShwb3NpdGlvbiwgbGFiZWwsIGtpbmQpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0geyBwb3NpdGlvbiwgbGFiZWwgfTtcbiAgICAgICAgaWYgKGtpbmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmtpbmQgPSBraW5kO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIElubGF5SGludC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgUG9zaXRpb24uaXMoY2FuZGlkYXRlLnBvc2l0aW9uKVxuICAgICAgICAgICAgJiYgKElzLnN0cmluZyhjYW5kaWRhdGUubGFiZWwpIHx8IElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLmxhYmVsLCBJbmxheUhpbnRMYWJlbFBhcnQuaXMpKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS5raW5kID09PSB1bmRlZmluZWQgfHwgSW5sYXlIaW50S2luZC5pcyhjYW5kaWRhdGUua2luZCkpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLnRleHRFZGl0cyA9PT0gdW5kZWZpbmVkKSB8fCBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS50ZXh0RWRpdHMsIFRleHRFZGl0LmlzKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS50b29sdGlwID09PSB1bmRlZmluZWQgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS50b29sdGlwKSB8fCBNYXJrdXBDb250ZW50LmlzKGNhbmRpZGF0ZS50b29sdGlwKSlcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUucGFkZGluZ0xlZnQgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5wYWRkaW5nTGVmdCkpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLnBhZGRpbmdSaWdodCA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLnBhZGRpbmdSaWdodCkpO1xuICAgIH1cbiAgICBJbmxheUhpbnQuaXMgPSBpcztcbn0pKElubGF5SGludCB8fCAoSW5sYXlIaW50ID0ge30pKTtcbmV4cG9ydCB2YXIgU3RyaW5nVmFsdWU7XG4oZnVuY3Rpb24gKFN0cmluZ1ZhbHVlKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlU25pcHBldCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4geyBraW5kOiAnc25pcHBldCcsIHZhbHVlIH07XG4gICAgfVxuICAgIFN0cmluZ1ZhbHVlLmNyZWF0ZVNuaXBwZXQgPSBjcmVhdGVTbmlwcGV0O1xufSkoU3RyaW5nVmFsdWUgfHwgKFN0cmluZ1ZhbHVlID0ge30pKTtcbmV4cG9ydCB2YXIgSW5saW5lQ29tcGxldGlvbkl0ZW07XG4oZnVuY3Rpb24gKElubGluZUNvbXBsZXRpb25JdGVtKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKGluc2VydFRleHQsIGZpbHRlclRleHQsIHJhbmdlLCBjb21tYW5kKSB7XG4gICAgICAgIHJldHVybiB7IGluc2VydFRleHQsIGZpbHRlclRleHQsIHJhbmdlLCBjb21tYW5kIH07XG4gICAgfVxuICAgIElubGluZUNvbXBsZXRpb25JdGVtLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKElubGluZUNvbXBsZXRpb25JdGVtIHx8IChJbmxpbmVDb21wbGV0aW9uSXRlbSA9IHt9KSk7XG5leHBvcnQgdmFyIElubGluZUNvbXBsZXRpb25MaXN0O1xuKGZ1bmN0aW9uIChJbmxpbmVDb21wbGV0aW9uTGlzdCkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShpdGVtcykge1xuICAgICAgICByZXR1cm4geyBpdGVtcyB9O1xuICAgIH1cbiAgICBJbmxpbmVDb21wbGV0aW9uTGlzdC5jcmVhdGUgPSBjcmVhdGU7XG59KShJbmxpbmVDb21wbGV0aW9uTGlzdCB8fCAoSW5saW5lQ29tcGxldGlvbkxpc3QgPSB7fSkpO1xuLyoqXG4gKiBEZXNjcmliZXMgaG93IGFuIHtAbGluayBJbmxpbmVDb21wbGV0aW9uSXRlbVByb3ZpZGVyIGlubGluZSBjb21wbGV0aW9uIHByb3ZpZGVyfSB3YXMgdHJpZ2dlcmVkLlxuICpcbiAqIEBzaW5jZSAzLjE4LjBcbiAqIEBwcm9wb3NlZFxuICovXG5leHBvcnQgdmFyIElubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZDtcbihmdW5jdGlvbiAoSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kKSB7XG4gICAgLyoqXG4gICAgICogQ29tcGxldGlvbiB3YXMgdHJpZ2dlcmVkIGV4cGxpY2l0bHkgYnkgYSB1c2VyIGdlc3R1cmUuXG4gICAgICovXG4gICAgSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kLkludm9rZWQgPSAwO1xuICAgIC8qKlxuICAgICAqIENvbXBsZXRpb24gd2FzIHRyaWdnZXJlZCBhdXRvbWF0aWNhbGx5IHdoaWxlIGVkaXRpbmcuXG4gICAgICovXG4gICAgSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kLkF1dG9tYXRpYyA9IDE7XG59KShJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmQgfHwgKElubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZCA9IHt9KSk7XG5leHBvcnQgdmFyIFNlbGVjdGVkQ29tcGxldGlvbkluZm87XG4oZnVuY3Rpb24gKFNlbGVjdGVkQ29tcGxldGlvbkluZm8pIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIHRleHQpIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIHRleHQgfTtcbiAgICB9XG4gICAgU2VsZWN0ZWRDb21wbGV0aW9uSW5mby5jcmVhdGUgPSBjcmVhdGU7XG59KShTZWxlY3RlZENvbXBsZXRpb25JbmZvIHx8IChTZWxlY3RlZENvbXBsZXRpb25JbmZvID0ge30pKTtcbmV4cG9ydCB2YXIgSW5saW5lQ29tcGxldGlvbkNvbnRleHQ7XG4oZnVuY3Rpb24gKElubGluZUNvbXBsZXRpb25Db250ZXh0KSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKHRyaWdnZXJLaW5kLCBzZWxlY3RlZENvbXBsZXRpb25JbmZvKSB7XG4gICAgICAgIHJldHVybiB7IHRyaWdnZXJLaW5kLCBzZWxlY3RlZENvbXBsZXRpb25JbmZvIH07XG4gICAgfVxuICAgIElubGluZUNvbXBsZXRpb25Db250ZXh0LmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKElubGluZUNvbXBsZXRpb25Db250ZXh0IHx8IChJbmxpbmVDb21wbGV0aW9uQ29udGV4dCA9IHt9KSk7XG5leHBvcnQgdmFyIFdvcmtzcGFjZUZvbGRlcjtcbihmdW5jdGlvbiAoV29ya3NwYWNlRm9sZGVyKSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgVVJJLmlzKGNhbmRpZGF0ZS51cmkpICYmIElzLnN0cmluZyhjYW5kaWRhdGUubmFtZSk7XG4gICAgfVxuICAgIFdvcmtzcGFjZUZvbGRlci5pcyA9IGlzO1xufSkoV29ya3NwYWNlRm9sZGVyIHx8IChXb3Jrc3BhY2VGb2xkZXIgPSB7fSkpO1xuZXhwb3J0IGNvbnN0IEVPTCA9IFsnXFxuJywgJ1xcclxcbicsICdcXHInXTtcbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHRoZSB0ZXh0IGRvY3VtZW50IGZyb20gdGhlIG5ldyB2c2NvZGUtbGFuZ3VhZ2VzZXJ2ZXItdGV4dGRvY3VtZW50IHBhY2thZ2UuXG4gKi9cbmV4cG9ydCB2YXIgVGV4dERvY3VtZW50O1xuKGZ1bmN0aW9uIChUZXh0RG9jdW1lbnQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IElUZXh0RG9jdW1lbnQgbGl0ZXJhbCBmcm9tIHRoZSBnaXZlbiB1cmkgYW5kIGNvbnRlbnQuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgZG9jdW1lbnQncyB1cmkuXG4gICAgICogQHBhcmFtIGxhbmd1YWdlSWQgVGhlIGRvY3VtZW50J3MgbGFuZ3VhZ2UgSWQuXG4gICAgICogQHBhcmFtIHZlcnNpb24gVGhlIGRvY3VtZW50J3MgdmVyc2lvbi5cbiAgICAgKiBAcGFyYW0gY29udGVudCBUaGUgZG9jdW1lbnQncyBjb250ZW50LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmksIGxhbmd1YWdlSWQsIHZlcnNpb24sIGNvbnRlbnQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGdWxsVGV4dERvY3VtZW50KHVyaSwgbGFuZ3VhZ2VJZCwgdmVyc2lvbiwgY29udGVudCk7XG4gICAgfVxuICAgIFRleHREb2N1bWVudC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBJVGV4dERvY3VtZW50fSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudXJpKSAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5sYW5ndWFnZUlkKSB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLmxhbmd1YWdlSWQpKSAmJiBJcy51aW50ZWdlcihjYW5kaWRhdGUubGluZUNvdW50KVxuICAgICAgICAgICAgJiYgSXMuZnVuYyhjYW5kaWRhdGUuZ2V0VGV4dCkgJiYgSXMuZnVuYyhjYW5kaWRhdGUucG9zaXRpb25BdCkgJiYgSXMuZnVuYyhjYW5kaWRhdGUub2Zmc2V0QXQpID8gdHJ1ZSA6IGZhbHNlO1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnQuaXMgPSBpcztcbiAgICBmdW5jdGlvbiBhcHBseUVkaXRzKGRvY3VtZW50LCBlZGl0cykge1xuICAgICAgICBsZXQgdGV4dCA9IGRvY3VtZW50LmdldFRleHQoKTtcbiAgICAgICAgbGV0IHNvcnRlZEVkaXRzID0gbWVyZ2VTb3J0KGVkaXRzLCAoYSwgYikgPT4ge1xuICAgICAgICAgICAgbGV0IGRpZmYgPSBhLnJhbmdlLnN0YXJ0LmxpbmUgLSBiLnJhbmdlLnN0YXJ0LmxpbmU7XG4gICAgICAgICAgICBpZiAoZGlmZiA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhLnJhbmdlLnN0YXJ0LmNoYXJhY3RlciAtIGIucmFuZ2Uuc3RhcnQuY2hhcmFjdGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRpZmY7XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgbGFzdE1vZGlmaWVkT2Zmc2V0ID0gdGV4dC5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGkgPSBzb3J0ZWRFZGl0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgbGV0IGUgPSBzb3J0ZWRFZGl0c1tpXTtcbiAgICAgICAgICAgIGxldCBzdGFydE9mZnNldCA9IGRvY3VtZW50Lm9mZnNldEF0KGUucmFuZ2Uuc3RhcnQpO1xuICAgICAgICAgICAgbGV0IGVuZE9mZnNldCA9IGRvY3VtZW50Lm9mZnNldEF0KGUucmFuZ2UuZW5kKTtcbiAgICAgICAgICAgIGlmIChlbmRPZmZzZXQgPD0gbGFzdE1vZGlmaWVkT2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIHN0YXJ0T2Zmc2V0KSArIGUubmV3VGV4dCArIHRleHQuc3Vic3RyaW5nKGVuZE9mZnNldCwgdGV4dC5sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdPdmVybGFwcGluZyBlZGl0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsYXN0TW9kaWZpZWRPZmZzZXQgPSBzdGFydE9mZnNldDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50LmFwcGx5RWRpdHMgPSBhcHBseUVkaXRzO1xuICAgIGZ1bmN0aW9uIG1lcmdlU29ydChkYXRhLCBjb21wYXJlKSB7XG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCA8PSAxKSB7XG4gICAgICAgICAgICAvLyBzb3J0ZWRcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHAgPSAoZGF0YS5sZW5ndGggLyAyKSB8IDA7XG4gICAgICAgIGNvbnN0IGxlZnQgPSBkYXRhLnNsaWNlKDAsIHApO1xuICAgICAgICBjb25zdCByaWdodCA9IGRhdGEuc2xpY2UocCk7XG4gICAgICAgIG1lcmdlU29ydChsZWZ0LCBjb21wYXJlKTtcbiAgICAgICAgbWVyZ2VTb3J0KHJpZ2h0LCBjb21wYXJlKTtcbiAgICAgICAgbGV0IGxlZnRJZHggPSAwO1xuICAgICAgICBsZXQgcmlnaHRJZHggPSAwO1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIHdoaWxlIChsZWZ0SWR4IDwgbGVmdC5sZW5ndGggJiYgcmlnaHRJZHggPCByaWdodC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCByZXQgPSBjb21wYXJlKGxlZnRbbGVmdElkeF0sIHJpZ2h0W3JpZ2h0SWR4XSk7XG4gICAgICAgICAgICBpZiAocmV0IDw9IDApIHtcbiAgICAgICAgICAgICAgICAvLyBzbWFsbGVyX2VxdWFsIC0+IHRha2UgbGVmdCB0byBwcmVzZXJ2ZSBvcmRlclxuICAgICAgICAgICAgICAgIGRhdGFbaSsrXSA9IGxlZnRbbGVmdElkeCsrXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGdyZWF0ZXIgLT4gdGFrZSByaWdodFxuICAgICAgICAgICAgICAgIGRhdGFbaSsrXSA9IHJpZ2h0W3JpZ2h0SWR4KytdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChsZWZ0SWR4IDwgbGVmdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRhdGFbaSsrXSA9IGxlZnRbbGVmdElkeCsrXTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAocmlnaHRJZHggPCByaWdodC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRhdGFbaSsrXSA9IHJpZ2h0W3JpZ2h0SWR4KytdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbn0pKFRleHREb2N1bWVudCB8fCAoVGV4dERvY3VtZW50ID0ge30pKTtcbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHRoZSB0ZXh0IGRvY3VtZW50IGZyb20gdGhlIG5ldyB2c2NvZGUtbGFuZ3VhZ2VzZXJ2ZXItdGV4dGRvY3VtZW50IHBhY2thZ2UuXG4gKi9cbmNsYXNzIEZ1bGxUZXh0RG9jdW1lbnQge1xuICAgIGNvbnN0cnVjdG9yKHVyaSwgbGFuZ3VhZ2VJZCwgdmVyc2lvbiwgY29udGVudCkge1xuICAgICAgICB0aGlzLl91cmkgPSB1cmk7XG4gICAgICAgIHRoaXMuX2xhbmd1YWdlSWQgPSBsYW5ndWFnZUlkO1xuICAgICAgICB0aGlzLl92ZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgICAgdGhpcy5fY29udGVudCA9IGNvbnRlbnQ7XG4gICAgICAgIHRoaXMuX2xpbmVPZmZzZXRzID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBnZXQgdXJpKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdXJpO1xuICAgIH1cbiAgICBnZXQgbGFuZ3VhZ2VJZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhbmd1YWdlSWQ7XG4gICAgfVxuICAgIGdldCB2ZXJzaW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmVyc2lvbjtcbiAgICB9XG4gICAgZ2V0VGV4dChyYW5nZSkge1xuICAgICAgICBpZiAocmFuZ2UpIHtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IHRoaXMub2Zmc2V0QXQocmFuZ2Uuc3RhcnQpO1xuICAgICAgICAgICAgbGV0IGVuZCA9IHRoaXMub2Zmc2V0QXQocmFuZ2UuZW5kKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb250ZW50LnN1YnN0cmluZyhzdGFydCwgZW5kKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fY29udGVudDtcbiAgICB9XG4gICAgdXBkYXRlKGV2ZW50LCB2ZXJzaW9uKSB7XG4gICAgICAgIHRoaXMuX2NvbnRlbnQgPSBldmVudC50ZXh0O1xuICAgICAgICB0aGlzLl92ZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgICAgdGhpcy5fbGluZU9mZnNldHMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGdldExpbmVPZmZzZXRzKCkge1xuICAgICAgICBpZiAodGhpcy5fbGluZU9mZnNldHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbGV0IGxpbmVPZmZzZXRzID0gW107XG4gICAgICAgICAgICBsZXQgdGV4dCA9IHRoaXMuX2NvbnRlbnQ7XG4gICAgICAgICAgICBsZXQgaXNMaW5lU3RhcnQgPSB0cnVlO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzTGluZVN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgIGxpbmVPZmZzZXRzLnB1c2goaSk7XG4gICAgICAgICAgICAgICAgICAgIGlzTGluZVN0YXJ0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBjaCA9IHRleHQuY2hhckF0KGkpO1xuICAgICAgICAgICAgICAgIGlzTGluZVN0YXJ0ID0gKGNoID09PSAnXFxyJyB8fCBjaCA9PT0gJ1xcbicpO1xuICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ1xccicgJiYgaSArIDEgPCB0ZXh0Lmxlbmd0aCAmJiB0ZXh0LmNoYXJBdChpICsgMSkgPT09ICdcXG4nKSB7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNMaW5lU3RhcnQgJiYgdGV4dC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGluZU9mZnNldHMucHVzaCh0ZXh0Lmxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9saW5lT2Zmc2V0cyA9IGxpbmVPZmZzZXRzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9saW5lT2Zmc2V0cztcbiAgICB9XG4gICAgcG9zaXRpb25BdChvZmZzZXQpIHtcbiAgICAgICAgb2Zmc2V0ID0gTWF0aC5tYXgoTWF0aC5taW4ob2Zmc2V0LCB0aGlzLl9jb250ZW50Lmxlbmd0aCksIDApO1xuICAgICAgICBsZXQgbGluZU9mZnNldHMgPSB0aGlzLmdldExpbmVPZmZzZXRzKCk7XG4gICAgICAgIGxldCBsb3cgPSAwLCBoaWdoID0gbGluZU9mZnNldHMubGVuZ3RoO1xuICAgICAgICBpZiAoaGlnaCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFBvc2l0aW9uLmNyZWF0ZSgwLCBvZmZzZXQpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgICAgICAgICBsZXQgbWlkID0gTWF0aC5mbG9vcigobG93ICsgaGlnaCkgLyAyKTtcbiAgICAgICAgICAgIGlmIChsaW5lT2Zmc2V0c1ttaWRdID4gb2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgaGlnaCA9IG1pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvdyA9IG1pZCArIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gbG93IGlzIHRoZSBsZWFzdCB4IGZvciB3aGljaCB0aGUgbGluZSBvZmZzZXQgaXMgbGFyZ2VyIHRoYW4gdGhlIGN1cnJlbnQgb2Zmc2V0XG4gICAgICAgIC8vIG9yIGFycmF5Lmxlbmd0aCBpZiBubyBsaW5lIG9mZnNldCBpcyBsYXJnZXIgdGhhbiB0aGUgY3VycmVudCBvZmZzZXRcbiAgICAgICAgbGV0IGxpbmUgPSBsb3cgLSAxO1xuICAgICAgICByZXR1cm4gUG9zaXRpb24uY3JlYXRlKGxpbmUsIG9mZnNldCAtIGxpbmVPZmZzZXRzW2xpbmVdKTtcbiAgICB9XG4gICAgb2Zmc2V0QXQocG9zaXRpb24pIHtcbiAgICAgICAgbGV0IGxpbmVPZmZzZXRzID0gdGhpcy5nZXRMaW5lT2Zmc2V0cygpO1xuICAgICAgICBpZiAocG9zaXRpb24ubGluZSA+PSBsaW5lT2Zmc2V0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb250ZW50Lmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwb3NpdGlvbi5saW5lIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGxpbmVPZmZzZXQgPSBsaW5lT2Zmc2V0c1twb3NpdGlvbi5saW5lXTtcbiAgICAgICAgbGV0IG5leHRMaW5lT2Zmc2V0ID0gKHBvc2l0aW9uLmxpbmUgKyAxIDwgbGluZU9mZnNldHMubGVuZ3RoKSA/IGxpbmVPZmZzZXRzW3Bvc2l0aW9uLmxpbmUgKyAxXSA6IHRoaXMuX2NvbnRlbnQubGVuZ3RoO1xuICAgICAgICByZXR1cm4gTWF0aC5tYXgoTWF0aC5taW4obGluZU9mZnNldCArIHBvc2l0aW9uLmNoYXJhY3RlciwgbmV4dExpbmVPZmZzZXQpLCBsaW5lT2Zmc2V0KTtcbiAgICB9XG4gICAgZ2V0IGxpbmVDb3VudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TGluZU9mZnNldHMoKS5sZW5ndGg7XG4gICAgfVxufVxudmFyIElzO1xuKGZ1bmN0aW9uIChJcykge1xuICAgIGNvbnN0IHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbiAgICBmdW5jdGlvbiBkZWZpbmVkKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnO1xuICAgIH1cbiAgICBJcy5kZWZpbmVkID0gZGVmaW5lZDtcbiAgICBmdW5jdGlvbiB1bmRlZmluZWQodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCc7XG4gICAgfVxuICAgIElzLnVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBmdW5jdGlvbiBib29sZWFuKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gZmFsc2U7XG4gICAgfVxuICAgIElzLmJvb2xlYW4gPSBib29sZWFuO1xuICAgIGZ1bmN0aW9uIHN0cmluZyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IFN0cmluZ10nO1xuICAgIH1cbiAgICBJcy5zdHJpbmcgPSBzdHJpbmc7XG4gICAgZnVuY3Rpb24gbnVtYmVyKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgTnVtYmVyXSc7XG4gICAgfVxuICAgIElzLm51bWJlciA9IG51bWJlcjtcbiAgICBmdW5jdGlvbiBudW1iZXJSYW5nZSh2YWx1ZSwgbWluLCBtYXgpIHtcbiAgICAgICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBOdW1iZXJdJyAmJiBtaW4gPD0gdmFsdWUgJiYgdmFsdWUgPD0gbWF4O1xuICAgIH1cbiAgICBJcy5udW1iZXJSYW5nZSA9IG51bWJlclJhbmdlO1xuICAgIGZ1bmN0aW9uIGludGVnZXIodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBOdW1iZXJdJyAmJiAtMjE0NzQ4MzY0OCA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSAyMTQ3NDgzNjQ3O1xuICAgIH1cbiAgICBJcy5pbnRlZ2VyID0gaW50ZWdlcjtcbiAgICBmdW5jdGlvbiB1aW50ZWdlcih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IE51bWJlcl0nICYmIDAgPD0gdmFsdWUgJiYgdmFsdWUgPD0gMjE0NzQ4MzY0NztcbiAgICB9XG4gICAgSXMudWludGVnZXIgPSB1aW50ZWdlcjtcbiAgICBmdW5jdGlvbiBmdW5jKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbiAgICB9XG4gICAgSXMuZnVuYyA9IGZ1bmM7XG4gICAgZnVuY3Rpb24gb2JqZWN0TGl0ZXJhbCh2YWx1ZSkge1xuICAgICAgICAvLyBTdHJpY3RseSBzcGVha2luZyBjbGFzcyBpbnN0YW5jZXMgcGFzcyB0aGlzIGNoZWNrIGFzIHdlbGwuIFNpbmNlIHRoZSBMU1BcbiAgICAgICAgLy8gZG9lc24ndCB1c2UgY2xhc3NlcyB3ZSBpZ25vcmUgdGhpcyBmb3Igbm93LiBJZiB3ZSBkbyB3ZSBuZWVkIHRvIGFkZCBzb21ldGhpbmdcbiAgICAgICAgLy8gbGlrZSB0aGlzOiBgT2JqZWN0LmdldFByb3RvdHlwZU9mKE9iamVjdC5nZXRQcm90b3R5cGVPZih4KSkgPT09IG51bGxgXG4gICAgICAgIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnO1xuICAgIH1cbiAgICBJcy5vYmplY3RMaXRlcmFsID0gb2JqZWN0TGl0ZXJhbDtcbiAgICBmdW5jdGlvbiB0eXBlZEFycmF5KHZhbHVlLCBjaGVjaykge1xuICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUuZXZlcnkoY2hlY2spO1xuICAgIH1cbiAgICBJcy50eXBlZEFycmF5ID0gdHlwZWRBcnJheTtcbn0pKElzIHx8IChJcyA9IHt9KSk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7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QjtBQUFBLFVBQ3RCLGVBQWU7QUFBQSxZQUNYO0FBQUEsWUFBYTtBQUFBLFlBQVM7QUFBQSxZQUN0QjtBQUFBLFlBQ0E7QUFBQSxZQUNBO0FBQUEsVUFDSjtBQUFBLFVBQ0EsYUFBYSxDQUFDLFFBQVEsU0FBUyxPQUFPLE9BQU8sRUFBRTtBQUFBLFFBQ25EO0FBQUEsUUFDQSxlQUFnQixFQUFFLFNBQVMsS0FBSztBQUFBLFFBQ2hDLFFBQWdCLEVBQUUsU0FBUyxLQUFLO0FBQUEsUUFDaEMsYUFBZ0IsRUFBRSxpQkFBaUIsTUFBTTtBQUFBLFFBQ3pDLFlBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsU0FBUyxNQUFNLEVBQUU7QUFBQSxRQUNyRCxvQkFBd0IsRUFBRSxTQUFTLEtBQUs7QUFBQSxRQUN4Qyx5QkFBeUIsRUFBRSxTQUFTLEtBQUs7QUFBQSxNQUM3QztBQUFBLElBQ0o7QUFBQSxFQUNKOyIsCiAgIm5hbWVzIjogWyJFcnJvckNvZGVzIiwgIk1lc3NhZ2UiLCAiVG91Y2giLCAiRGlzcG9zYWJsZSIsICJSQUwiLCAiRXZlbnQiLCAiSXMiLCAiQ2FuY2VsbGF0aW9uVG9rZW4iLCAiQ2FuY2VsbGF0aW9uU3RhdGUiLCAiX2Nvbm4iLCAiSXMiLCAiTWVzc2FnZVJlYWRlciIsICJBYnN0cmFjdE1lc3NhZ2VSZWFkZXIiLCAiUmVzb2x2ZWRNZXNzYWdlUmVhZGVyT3B0aW9ucyIsICJJcyIsICJNZXNzYWdlV3JpdGVyIiwgIkFic3RyYWN0TWVzc2FnZVdyaXRlciIsICJSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zIiwgInJlc3VsdCIsICJJcyIsICJDYW5jZWxOb3RpZmljYXRpb24iLCAiUHJvZ3Jlc3NUb2tlbiIsICJQcm9ncmVzc05vdGlmaWNhdGlvbiIsICJTdGFyUmVxdWVzdEhhbmRsZXIiLCAiVHJhY2UiLCAiVHJhY2VWYWx1ZXMiLCAiVHJhY2VGb3JtYXQiLCAiU2V0VHJhY2VOb3RpZmljYXRpb24iLCAiTG9nVHJhY2VOb3RpZmljYXRpb24iLCAiQ29ubmVjdGlvbkVycm9ycyIsICJDb25uZWN0aW9uU3RyYXRlZ3kiLCAiSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5IiwgIlJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5IiwgIkNhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kiLCAiQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kiLCAiQ2FuY2VsbGF0aW9uU3RyYXRlZ3kiLCAiTWVzc2FnZVN0cmF0ZWd5IiwgIkNvbm5lY3Rpb25PcHRpb25zIiwgIkNvbm5lY3Rpb25TdGF0ZSIsICJjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiIsICJzdGFydFRpbWUiLCAiUklMIiwgIm0iLCAiZXhwb3J0cyIsICJjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiIsICJpbXBvcnRfdnNjb2RlX2pzb25ycGMiLCAiaW1wb3J0X3ZzY29kZV9qc29ucnBjIiwgImltcG9ydF92c2NvZGVfanNvbnJwYyIsICJpbXBvcnRfdnNjb2RlX2pzb25ycGMiLCAiRG9jdW1lbnRVcmkiLCAiVVJJIiwgImludGVnZXIiLCAidWludGVnZXIiLCAiUG9zaXRpb24iLCAiUmFuZ2UiLCAiTG9jYXRpb24iLCAiTG9jYXRpb25MaW5rIiwgIkNvbG9yIiwgIkNvbG9ySW5mb3JtYXRpb24iLCAiQ29sb3JQcmVzZW50YXRpb24iLCAiRm9sZGluZ1JhbmdlS2luZCIsICJGb2xkaW5nUmFuZ2UiLCAiRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbiIsICJsb2NhdGlvbiIsICJEaWFnbm9zdGljU2V2ZXJpdHkiLCAiRGlhZ25vc3RpY1RhZyIsICJDb2RlRGVzY3JpcHRpb24iLCAiRGlhZ25vc3RpYyIsICJDb21tYW5kIiwgIlRleHRFZGl0IiwgIkNoYW5nZUFubm90YXRpb24iLCAiQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIiLCAiQW5ub3RhdGVkVGV4dEVkaXQiLCAiVGV4dERvY3VtZW50RWRpdCIsICJDcmVhdGVGaWxlIiwgIlJlbmFtZUZpbGUiLCAiRGVsZXRlRmlsZSIsICJXb3Jrc3BhY2VFZGl0IiwgIlRleHREb2N1bWVudElkZW50aWZpZXIiLCAiVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciIsICJPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIiLCAiVGV4dERvY3VtZW50SXRlbSIsICJNYXJrdXBLaW5kIiwgIk1hcmt1cENvbnRlbnQiLCAiQ29tcGxldGlvbkl0ZW1LaW5kIiwgIkluc2VydFRleHRGb3JtYXQiLCAiQ29tcGxldGlvbkl0ZW1UYWciLCAiSW5zZXJ0UmVwbGFjZUVkaXQiLCAiUmFuZ2UiLCAiSW5zZXJ0VGV4dE1vZGUiLCAiQ29tcGxldGlvbkl0ZW1MYWJlbERldGFpbHMiLCAiQ29tcGxldGlvbkl0ZW0iLCAiQ29tcGxldGlvbkxpc3QiLCAiTWFya2VkU3RyaW5nIiwgIkhvdmVyIiwgIlBhcmFtZXRlckluZm9ybWF0aW9uIiwgIlNpZ25hdHVyZUluZm9ybWF0aW9uIiwgIkRvY3VtZW50SGlnaGxpZ2h0S2luZCIsICJEb2N1bWVudEhpZ2hsaWdodCIsICJTeW1ib2xLaW5kIiwgIlN5bWJvbFRhZyIsICJTeW1ib2xJbmZvcm1hdGlvbiIsICJXb3Jrc3BhY2VTeW1ib2wiLCAiRG9jdW1lbnRTeW1ib2wiLCAiQ29kZUFjdGlvbktpbmQiLCAiQ29kZUFjdGlvblRyaWdnZXJLaW5kIiwgIkNvZGVBY3Rpb25Db250ZXh0IiwgIkNvZGVBY3Rpb24iLCAiQ29kZUxlbnMiLCAiRm9ybWF0dGluZ09wdGlvbnMiLCAiRG9jdW1lbnRMaW5rIiwgIlNlbGVjdGlvblJhbmdlIiwgIlNlbWFudGljVG9rZW5UeXBlcyIsICJTZW1hbnRpY1Rva2VuTW9kaWZpZXJzIiwgIlNlbWFudGljVG9rZW5zIiwgIklubGluZVZhbHVlVGV4dCIsICJJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwIiwgIklubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uIiwgIklubGluZVZhbHVlQ29udGV4dCIsICJJbmxheUhpbnRLaW5kIiwgIklubGF5SGludExhYmVsUGFydCIsICJJbmxheUhpbnQiLCAiUG9zaXRpb24iLCAiU3RyaW5nVmFsdWUiLCAiSW5saW5lQ29tcGxldGlvbkl0ZW0iLCAiSW5saW5lQ29tcGxldGlvbkxpc3QiLCAiSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kIiwgIlNlbGVjdGVkQ29tcGxldGlvbkluZm8iLCAiSW5saW5lQ29tcGxldGlvbkNvbnRleHQiLCAiV29ya3NwYWNlRm9sZGVyIiwgIlRleHREb2N1bWVudCIsICJQb3NpdGlvbiIsICJJcyIsICJ1bmRlZmluZWQiLCAiaW50ZWdlciIsICJ1aW50ZWdlciIsICJtIl0KfQo= diff --git a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/lsp/java-lsp-client.ts b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/lsp/java-lsp-client.ts index dfea30b7485..e3826037c7d 100644 --- a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/lsp/java-lsp-client.ts +++ b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/lsp/java-lsp-client.ts @@ -65,6 +65,13 @@ const _openFiles: Set = new Set(); /** Pending debounced didChange timers per file URI, so a change can be flushed before completion. */ const _changeTimers: Map> = new Map(); +/** + * Last diagnostics published per file URI, kept verbatim (with their LSP code/data). Code-action + * requests must send these — JDT.LS matches quick-fixes by the diagnostic's code/data, which Monaco's + * IMarkerData cannot round-trip, so reconstructing diagnostics from markers yields no quick-fixes. + */ +const _diagnostics: Map = new Map(); + let _providersRegistered = false; /** Semantic-token legend reported by JDT.LS in the initialize result; needed to decode token data. */ @@ -106,6 +113,7 @@ export async function connect(resourcePath: string): Promise { // Diagnostics notification → Monaco markers (applies to any workspace file) _conn.onNotification('textDocument/publishDiagnostics', (params: { uri: string; diagnostics: Diagnostic[] }) => { + _diagnostics.set(params.uri, params.diagnostics ?? []); const model = monaco.editor.getModels().find(m => m.uri.toString() === params.uri); if (!model) return; monaco.editor.setModelMarkers(model, 'java-lsp', params.diagnostics.map(d => ({ @@ -148,12 +156,11 @@ export async function connect(resourcePath: string): Promise { progressReportProvider: false, classFileContentsSupport: true, resolveAdditionalTextEditsSupport: true, - advancedGenerateAccessorsSupport: true, - generateToStringPromptSupport: true, - generateConstructorsPromptSupport: true, - generateDelegateMethodsPromptSupport: true, - hashCodeEqualsPromptSupport: true, - advancedOrganizeImportsSupport: true, + // Do NOT advertise the *PromptSupport flags: those make JDT.LS return source actions + // (generate toString/constructors/accessors, override/implement, organize imports) as + // client-side "*Prompt" commands the vscode-java extension implements but we don't. + // With them off, JDT.LS returns the same actions as resolvable WorkspaceEdits operating + // on all members, which applyCodeAction resolves and applies directly. inferSelectionSupport: ['extractMethod', 'extractVariable', 'extractField'], }, }, @@ -523,10 +530,13 @@ function registerProviders(): void { provideCodeActions: async (model, range, context) => { const empty = { actions: [], dispose() { /* nothing to dispose */ } }; if (!_conn || !isWorkspaceFile(model.uri.toString())) return empty; - const diagnostics = (context.markers ?? []).map(markerToLspDiagnostic); + // Send the original LSP diagnostics that overlap the range (they carry the code/data JDT.LS + // needs to compute quick-fixes), not ones reconstructed from Monaco markers. + const lspRange = monacoRangeToLsp(range); + const diagnostics = (_diagnostics.get(model.uri.toString()) ?? []).filter(d => rangesOverlap(d.range, lspRange)); const result: Array | null = await _conn.sendRequest('textDocument/codeAction', { textDocument: { uri: model.uri.toString() }, - range: monacoRangeToLsp(range), + range: lspRange, context: { diagnostics, only: context.only ? [context.only] : undefined }, }); if (!result?.length) return empty; @@ -915,23 +925,11 @@ function monacoRangeToLsp(r: monaco.IRange): LspRange { }; } -function monacoSeverityToLsp(severity: monaco.MarkerSeverity): DiagnosticSeverity { - switch (severity) { - case monaco.MarkerSeverity.Error: return DiagnosticSeverity.Error; - case monaco.MarkerSeverity.Warning: return DiagnosticSeverity.Warning; - case monaco.MarkerSeverity.Info: return DiagnosticSeverity.Information; - default: return DiagnosticSeverity.Hint; - } -} - -function markerToLspDiagnostic(m: monaco.editor.IMarkerData): Diagnostic { - return { - range: { start: { line: m.startLineNumber - 1, character: m.startColumn - 1 }, - end: { line: m.endLineNumber - 1, character: m.endColumn - 1 } }, - message: m.message, - severity: monacoSeverityToLsp(m.severity), - source: m.source, - } as Diagnostic; +/** True when two LSP ranges intersect (used to pick the diagnostics relevant to a code-action request). */ +function rangesOverlap(a: LspRange, b: LspRange): boolean { + const notAfter = (p: { line: number; character: number }, q: { line: number; character: number }) => + p.line < q.line || (p.line === q.line && p.character <= q.character); + return notAfter(a.start, b.end) && notAfter(b.start, a.end); } function lspCodeActionToMonaco(action: CodeAction | Command): monaco.languages.CodeAction { diff --git a/components/ui/view-projects/src/main/resources/META-INF/dirigible/view-projects/js/projects.js b/components/ui/view-projects/src/main/resources/META-INF/dirigible/view-projects/js/projects.js index 39fcb4569e1..de2e5d9c665 100644 --- a/components/ui/view-projects/src/main/resources/META-INF/dirigible/view-projects/js/projects.js +++ b/components/ui/view-projects/src/main/resources/META-INF/dirigible/view-projects/js/projects.js @@ -2173,6 +2173,16 @@ projectsView.controller('ProjectsViewController', ( } }); + // A Java refactor (e.g. renaming a class via F2) renames files on disk; refresh the tree so the + // renamed file shows up instead of the stale one. + Workspace.onFileRenamed(() => { + $scope.$evalAsync(() => { $scope.reloadWorkspace(); }); + }); + + Workspace.onFileMoved(() => { + $scope.$evalAsync(() => { $scope.reloadWorkspace(); }); + }); + Workspace.onWorkspaceChanged((changed) => { if (changed.workspace === $scope.selectedWorkspace) { if (changed.params && changed.params.projectsViewId) { From f4c9858de9dff1115d053ef182ecbdba28dd426d Mon Sep 17 00:00:00 2001 From: Iliyan Velichkov Date: Tue, 23 Jun 2026 16:16:01 +0300 Subject: [PATCH 09/14] fix(editor): correct & sync Java type rename (stale error, old name in completion) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Renaming a public type (F2) had two defects: - When JDT.LS ordered the RenameFile before the text edit, the edit was keyed by the new URI; we wrote the old content (old type name) into the new file, producing "The public type X must be defined in its own file". Edits are now re-attributed to the on-disk (old) URI before applying, so the new file gets the new type name. - After renaming on disk we never told JDT.LS, so it kept validating stale state until a page refresh and kept suggesting the old type name in completion. We now send textDocument/didClose for the renamed-away file and workspace/didChangeWatchedFiles (Deleted old / Created new / Changed edited) so the server re-indexes immediately — clearing the stale diagnostic and dropping the old name from completion. This also removes the exception/fallback path that made the first Enter occasionally apply only the in-editor edit without renaming the file. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../editor-monaco/js/java-lsp-client.js | 50 +++++++++++++++---- .../editor-monaco/js/lsp/java-lsp-client.ts | 44 ++++++++++++---- 2 files changed, 75 insertions(+), 19 deletions(-) diff --git a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/java-lsp-client.js b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/java-lsp-client.js index 8d7627d7458..ffb4052ddbf 100644 --- a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/java-lsp-client.js +++ b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/java-lsp-client.js @@ -5487,31 +5487,61 @@ ${JSON.stringify(message, null, 4)}`); } } } + const newToOld = {}; + for (const oldUri in renameByUri) newToOld[renameByUri[oldUri]] = oldUri; + const editsByOld = {}; + for (const uri in textByUri) { + const onDiskUri = newToOld[uri] ?? uri; + editsByOld[onDiskUri] = (editsByOld[onDiskUri] ?? []).concat(textByUri[uri]); + } const payload = { currentPath: uriToWorkspacePath(currentUri), currentContent: null, currentNewPath: null, writes: [], renames: [] }; - const uris = /* @__PURE__ */ new Set([...Object.keys(textByUri), ...Object.keys(renameByUri)]); - for (const uri of uris) { - const edits = textByUri[uri] ?? []; + const watchedChanges = []; + const oldUris = /* @__PURE__ */ new Set([...Object.keys(editsByOld), ...Object.keys(renameByUri)]); + for (const oldUri of oldUris) { + const edits = editsByOld[oldUri] ?? []; let content; - if (uri === currentUri) { + if (oldUri === currentUri) { if (edits.length) { model.pushEditOperations([], edits.map((e) => ({ range: lspRangeToMonaco(e.range), text: e.newText, forceMoveMarkers: true })), () => null); } content = model.getValue(); } else { - const source = await fetchWorkspaceFileText(uriToWorkspacePath(uri) ?? uri); + const source = await fetchWorkspaceFileText(uriToWorkspacePath(oldUri) ?? oldUri); content = edits.length ? applyEditsToText(source, edits) : source; } - const newUri = renameByUri[uri]; - if (uri === currentUri) { + const newUri = renameByUri[oldUri]; + if (oldUri === currentUri) { payload.currentContent = content; payload.currentNewPath = newUri ? uriToWorkspacePath(newUri) : null; } else if (newUri) { - payload.renames.push({ oldPath: uriToWorkspacePath(uri), newPath: uriToWorkspacePath(newUri), content }); + payload.renames.push({ oldPath: uriToWorkspacePath(oldUri), newPath: uriToWorkspacePath(newUri), content }); + } else { + payload.writes.push({ path: uriToWorkspacePath(oldUri), content }); + } + if (newUri) { + watchedChanges.push({ + uri: oldUri, + type: 3 + /* Deleted */ + }, { + uri: newUri, + type: 1 + /* Created */ + }); + _openFiles.delete(oldUri); + _conn?.sendNotification("textDocument/didClose", { textDocument: { uri: oldUri } }); } else { - payload.writes.push({ path: uriToWorkspacePath(uri), content }); + watchedChanges.push({ + uri: oldUri, + type: 2 + /* Changed */ + }); } } await globalThis.javaLspPersistRename(payload); + if (_conn && watchedChanges.length) { + _conn.sendNotification("workspace/didChangeWatchedFiles", { changes: watchedChanges }); + } } function jdtlsSettings() { return { @@ -5546,4 +5576,4 @@ ${JSON.stringify(message, null, 4)}`); } return __toCommonJS(java_lsp_client_exports); })(); -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvY29tbW9uL2lzLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlcy5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vbGlua2VkTWFwLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9kaXNwb3NhYmxlLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9yYWwuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvY29tbW9uL2V2ZW50cy5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vY2FuY2VsbGF0aW9uLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9zaGFyZWRBcnJheUNhbmNlbGxhdGlvbi5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vc2VtYXBob3JlLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlUmVhZGVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlV3JpdGVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlQnVmZmVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9jb25uZWN0aW9uLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9hcGkuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvYnJvd3Nlci9yaWwuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvYnJvd3Nlci9tYWluLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvYnJvd3Nlci5qcyIsICJsc3AvamF2YS1sc3AtY2xpZW50LnRzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLXdzLWpzb25ycGMvc3JjL2Rpc3Bvc2FibGUudHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvc29ja2V0L3NvY2tldC50cyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS13cy1qc29ucnBjL3NyYy9zb2NrZXQvcmVhZGVyLnRzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLXdzLWpzb25ycGMvc3JjL3NvY2tldC93cml0ZXIudHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvc29ja2V0L2Nvbm5lY3Rpb24udHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvY29ubmVjdGlvbi50cyIsICJsc3AvbW9uYWNvLXNoaW0udHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtbGFuZ3VhZ2VzZXJ2ZXItdHlwZXMvbGliL2VzbS9tYWluLmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuc3RyaW5nQXJyYXkgPSBleHBvcnRzLmFycmF5ID0gZXhwb3J0cy5mdW5jID0gZXhwb3J0cy5lcnJvciA9IGV4cG9ydHMubnVtYmVyID0gZXhwb3J0cy5zdHJpbmcgPSBleHBvcnRzLmJvb2xlYW4gPSB2b2lkIDA7XG5mdW5jdGlvbiBib29sZWFuKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZTtcbn1cbmV4cG9ydHMuYm9vbGVhbiA9IGJvb2xlYW47XG5mdW5jdGlvbiBzdHJpbmcodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZztcbn1cbmV4cG9ydHMuc3RyaW5nID0gc3RyaW5nO1xuZnVuY3Rpb24gbnVtYmVyKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdmFsdWUgaW5zdGFuY2VvZiBOdW1iZXI7XG59XG5leHBvcnRzLm51bWJlciA9IG51bWJlcjtcbmZ1bmN0aW9uIGVycm9yKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgRXJyb3I7XG59XG5leHBvcnRzLmVycm9yID0gZXJyb3I7XG5mdW5jdGlvbiBmdW5jKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cbmV4cG9ydHMuZnVuYyA9IGZ1bmM7XG5mdW5jdGlvbiBhcnJheSh2YWx1ZSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cbmV4cG9ydHMuYXJyYXkgPSBhcnJheTtcbmZ1bmN0aW9uIHN0cmluZ0FycmF5KHZhbHVlKSB7XG4gICAgcmV0dXJuIGFycmF5KHZhbHVlKSAmJiB2YWx1ZS5ldmVyeShlbGVtID0+IHN0cmluZyhlbGVtKSk7XG59XG5leHBvcnRzLnN0cmluZ0FycmF5ID0gc3RyaW5nQXJyYXk7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLk1lc3NhZ2UgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU5ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlOCA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTcgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU2ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNSA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTQgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUzID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMiA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTEgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUwID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTkgPSBleHBvcnRzLlJlcXVlc3RUeXBlOCA9IGV4cG9ydHMuUmVxdWVzdFR5cGU3ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTYgPSBleHBvcnRzLlJlcXVlc3RUeXBlNSA9IGV4cG9ydHMuUmVxdWVzdFR5cGU0ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTMgPSBleHBvcnRzLlJlcXVlc3RUeXBlMiA9IGV4cG9ydHMuUmVxdWVzdFR5cGUxID0gZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IGV4cG9ydHMuUmVxdWVzdFR5cGUwID0gZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUgPSBleHBvcnRzLlBhcmFtZXRlclN0cnVjdHVyZXMgPSBleHBvcnRzLlJlc3BvbnNlRXJyb3IgPSBleHBvcnRzLkVycm9yQ29kZXMgPSB2b2lkIDA7XG5jb25zdCBpcyA9IHJlcXVpcmUoXCIuL2lzXCIpO1xuLyoqXG4gKiBQcmVkZWZpbmVkIGVycm9yIGNvZGVzLlxuICovXG52YXIgRXJyb3JDb2RlcztcbihmdW5jdGlvbiAoRXJyb3JDb2Rlcykge1xuICAgIC8vIERlZmluZWQgYnkgSlNPTiBSUENcbiAgICBFcnJvckNvZGVzLlBhcnNlRXJyb3IgPSAtMzI3MDA7XG4gICAgRXJyb3JDb2Rlcy5JbnZhbGlkUmVxdWVzdCA9IC0zMjYwMDtcbiAgICBFcnJvckNvZGVzLk1ldGhvZE5vdEZvdW5kID0gLTMyNjAxO1xuICAgIEVycm9yQ29kZXMuSW52YWxpZFBhcmFtcyA9IC0zMjYwMjtcbiAgICBFcnJvckNvZGVzLkludGVybmFsRXJyb3IgPSAtMzI2MDM7XG4gICAgLyoqXG4gICAgICogVGhpcyBpcyB0aGUgc3RhcnQgcmFuZ2Ugb2YgSlNPTiBSUEMgcmVzZXJ2ZWQgZXJyb3IgY29kZXMuXG4gICAgICogSXQgZG9lc24ndCBkZW5vdGUgYSByZWFsIGVycm9yIGNvZGUuIE5vIGFwcGxpY2F0aW9uIGVycm9yIGNvZGVzIHNob3VsZFxuICAgICAqIGJlIGRlZmluZWQgYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCByYW5nZS4gRm9yIGJhY2t3YXJkc1xuICAgICAqIGNvbXBhdGliaWxpdHkgdGhlIGBTZXJ2ZXJOb3RJbml0aWFsaXplZGAgYW5kIHRoZSBgVW5rbm93bkVycm9yQ29kZWBcbiAgICAgKiBhcmUgbGVmdCBpbiB0aGUgcmFuZ2UuXG4gICAgICpcbiAgICAgKiBAc2luY2UgMy4xNi4wXG4gICAgKi9cbiAgICBFcnJvckNvZGVzLmpzb25ycGNSZXNlcnZlZEVycm9yUmFuZ2VTdGFydCA9IC0zMjA5OTtcbiAgICAvKiogQGRlcHJlY2F0ZWQgdXNlICBqc29ucnBjUmVzZXJ2ZWRFcnJvclJhbmdlU3RhcnQgKi9cbiAgICBFcnJvckNvZGVzLnNlcnZlckVycm9yU3RhcnQgPSAtMzIwOTk7XG4gICAgLyoqXG4gICAgICogQW4gZXJyb3Igb2NjdXJyZWQgd2hlbiB3cml0ZSBhIG1lc3NhZ2UgdG8gdGhlIHRyYW5zcG9ydCBsYXllci5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLk1lc3NhZ2VXcml0ZUVycm9yID0gLTMyMDk5O1xuICAgIC8qKlxuICAgICAqIEFuIGVycm9yIG9jY3VycmVkIHdoZW4gcmVhZGluZyBhIG1lc3NhZ2UgZnJvbSB0aGUgdHJhbnNwb3J0IGxheWVyLlxuICAgICAqL1xuICAgIEVycm9yQ29kZXMuTWVzc2FnZVJlYWRFcnJvciA9IC0zMjA5ODtcbiAgICAvKipcbiAgICAgKiBUaGUgY29ubmVjdGlvbiBnb3QgZGlzcG9zZWQgb3IgbG9zdCBhbmQgYWxsIHBlbmRpbmcgcmVzcG9uc2VzIGdvdFxuICAgICAqIHJlamVjdGVkLlxuICAgICAqL1xuICAgIEVycm9yQ29kZXMuUGVuZGluZ1Jlc3BvbnNlUmVqZWN0ZWQgPSAtMzIwOTc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gaXMgaW5hY3RpdmUgYW5kIGEgdXNlIG9mIGl0IGZhaWxlZC5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLkNvbm5lY3Rpb25JbmFjdGl2ZSA9IC0zMjA5NjtcbiAgICAvKipcbiAgICAgKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBhIHNlcnZlciByZWNlaXZlZCBhIG5vdGlmaWNhdGlvbiBvclxuICAgICAqIHJlcXVlc3QgYmVmb3JlIHRoZSBzZXJ2ZXIgaGFzIHJlY2VpdmVkIHRoZSBgaW5pdGlhbGl6ZWAgcmVxdWVzdC5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLlNlcnZlck5vdEluaXRpYWxpemVkID0gLTMyMDAyO1xuICAgIEVycm9yQ29kZXMuVW5rbm93bkVycm9yQ29kZSA9IC0zMjAwMTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIHRoZSBlbmQgcmFuZ2Ugb2YgSlNPTiBSUEMgcmVzZXJ2ZWQgZXJyb3IgY29kZXMuXG4gICAgICogSXQgZG9lc24ndCBkZW5vdGUgYSByZWFsIGVycm9yIGNvZGUuXG4gICAgICpcbiAgICAgKiBAc2luY2UgMy4xNi4wXG4gICAgKi9cbiAgICBFcnJvckNvZGVzLmpzb25ycGNSZXNlcnZlZEVycm9yUmFuZ2VFbmQgPSAtMzIwMDA7XG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSAganNvbnJwY1Jlc2VydmVkRXJyb3JSYW5nZUVuZCAqL1xuICAgIEVycm9yQ29kZXMuc2VydmVyRXJyb3JFbmQgPSAtMzIwMDA7XG59KShFcnJvckNvZGVzIHx8IChleHBvcnRzLkVycm9yQ29kZXMgPSBFcnJvckNvZGVzID0ge30pKTtcbi8qKlxuICogQW4gZXJyb3Igb2JqZWN0IHJldHVybiBpbiBhIHJlc3BvbnNlIGluIGNhc2UgYSByZXF1ZXN0XG4gKiBoYXMgZmFpbGVkLlxuICovXG5jbGFzcyBSZXNwb25zZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNvZGUsIG1lc3NhZ2UsIGRhdGEpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuY29kZSA9IGlzLm51bWJlcihjb2RlKSA/IGNvZGUgOiBFcnJvckNvZGVzLlVua25vd25FcnJvckNvZGU7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBSZXNwb25zZUVycm9yLnByb3RvdHlwZSk7XG4gICAgfVxuICAgIHRvSnNvbigpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgY29kZTogdGhpcy5jb2RlLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLmRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmRhdGEgPSB0aGlzLmRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5leHBvcnRzLlJlc3BvbnNlRXJyb3IgPSBSZXNwb25zZUVycm9yO1xuY2xhc3MgUGFyYW1ldGVyU3RydWN0dXJlcyB7XG4gICAgY29uc3RydWN0b3Ioa2luZCkge1xuICAgICAgICB0aGlzLmtpbmQgPSBraW5kO1xuICAgIH1cbiAgICBzdGF0aWMgaXModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8gfHwgdmFsdWUgPT09IFBhcmFtZXRlclN0cnVjdHVyZXMuYnlOYW1lIHx8IHZhbHVlID09PSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5UG9zaXRpb247XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5raW5kO1xuICAgIH1cbn1cbmV4cG9ydHMuUGFyYW1ldGVyU3RydWN0dXJlcyA9IFBhcmFtZXRlclN0cnVjdHVyZXM7XG4vKipcbiAqIFRoZSBwYXJhbWV0ZXIgc3RydWN0dXJlIGlzIGF1dG9tYXRpY2FsbHkgaW5mZXJyZWQgb24gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzXG4gKiBhbmQgdGhlIHBhcmFtZXRlciB0eXBlIGluIGNhc2Ugb2YgYSBzaW5nbGUgcGFyYW0uXG4gKi9cblBhcmFtZXRlclN0cnVjdHVyZXMuYXV0byA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdhdXRvJyk7XG4vKipcbiAqIEZvcmNlcyBgYnlQb3NpdGlvbmAgcGFyYW1ldGVyIHN0cnVjdHVyZS4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGhhdmUgYSBzaW5nbGVcbiAqIHBhcmFtZXRlciB3aGljaCBoYXMgYSBsaXRlcmFsIHR5cGUuXG4gKi9cblBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbiA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdieVBvc2l0aW9uJyk7XG4vKipcbiAqIEZvcmNlcyBgYnlOYW1lYCBwYXJhbWV0ZXIgc3RydWN0dXJlLiBUaGlzIGlzIG9ubHkgdXNlZnVsIHdoZW4gaGF2aW5nIGEgc2luZ2xlXG4gKiBwYXJhbWV0ZXIuIFRoZSBsaWJyYXJ5IHdpbGwgcmVwb3J0IGVycm9ycyBpZiB1c2VkIHdpdGggYSBkaWZmZXJlbnQgbnVtYmVyIG9mXG4gKiBwYXJhbWV0ZXJzLlxuICovXG5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdieU5hbWUnKTtcbi8qKlxuICogQW4gYWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgYSBNZXNzYWdlVHlwZS5cbiAqL1xuY2xhc3MgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIG51bWJlck9mUGFyYW1zKSB7XG4gICAgICAgIHRoaXMubWV0aG9kID0gbWV0aG9kO1xuICAgICAgICB0aGlzLm51bWJlck9mUGFyYW1zID0gbnVtYmVyT2ZQYXJhbXM7XG4gICAgfVxuICAgIGdldCBwYXJhbWV0ZXJTdHJ1Y3R1cmVzKCkge1xuICAgICAgICByZXR1cm4gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvO1xuICAgIH1cbn1cbmV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlID0gQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlO1xuLyoqXG4gKiBDbGFzc2VzIHRvIHR5cGUgcmVxdWVzdCByZXNwb25zZSBwYWlyc1xuICovXG5jbGFzcyBSZXF1ZXN0VHlwZTAgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDApO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGUwID0gUmVxdWVzdFR5cGUwO1xuY2xhc3MgUmVxdWVzdFR5cGUgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCwgX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8pIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAxKTtcbiAgICAgICAgdGhpcy5fcGFyYW1ldGVyU3RydWN0dXJlcyA9IF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbiAgICBnZXQgcGFyYW1ldGVyU3RydWN0dXJlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXM7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IFJlcXVlc3RUeXBlO1xuY2xhc3MgUmVxdWVzdFR5cGUxIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMSk7XG4gICAgICAgIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBfcGFyYW1ldGVyU3RydWN0dXJlcztcbiAgICB9XG4gICAgZ2V0IHBhcmFtZXRlclN0cnVjdHVyZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGUxID0gUmVxdWVzdFR5cGUxO1xuY2xhc3MgUmVxdWVzdFR5cGUyIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAyKTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlMiA9IFJlcXVlc3RUeXBlMjtcbmNsYXNzIFJlcXVlc3RUeXBlMyBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMyk7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTMgPSBSZXF1ZXN0VHlwZTM7XG5jbGFzcyBSZXF1ZXN0VHlwZTQgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDQpO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGU0ID0gUmVxdWVzdFR5cGU0O1xuY2xhc3MgUmVxdWVzdFR5cGU1IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA1KTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlNSA9IFJlcXVlc3RUeXBlNTtcbmNsYXNzIFJlcXVlc3RUeXBlNiBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNik7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTYgPSBSZXF1ZXN0VHlwZTY7XG5jbGFzcyBSZXF1ZXN0VHlwZTcgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDcpO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGU3ID0gUmVxdWVzdFR5cGU3O1xuY2xhc3MgUmVxdWVzdFR5cGU4IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA4KTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlOCA9IFJlcXVlc3RUeXBlODtcbmNsYXNzIFJlcXVlc3RUeXBlOSBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgOSk7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTkgPSBSZXF1ZXN0VHlwZTk7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMSk7XG4gICAgICAgIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBfcGFyYW1ldGVyU3RydWN0dXJlcztcbiAgICB9XG4gICAgZ2V0IHBhcmFtZXRlclN0cnVjdHVyZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZSA9IE5vdGlmaWNhdGlvblR5cGU7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlMCBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMCk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMCA9IE5vdGlmaWNhdGlvblR5cGUwO1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTEgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCwgX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8pIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAxKTtcbiAgICAgICAgdGhpcy5fcGFyYW1ldGVyU3RydWN0dXJlcyA9IF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbiAgICBnZXQgcGFyYW1ldGVyU3RydWN0dXJlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXM7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMSA9IE5vdGlmaWNhdGlvblR5cGUxO1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDIpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTIgPSBOb3RpZmljYXRpb25UeXBlMjtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGUzIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAzKTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGUzID0gTm90aWZpY2F0aW9uVHlwZTM7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlNCBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNCk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNCA9IE5vdGlmaWNhdGlvblR5cGU0O1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTUgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDUpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTUgPSBOb3RpZmljYXRpb25UeXBlNTtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGU2IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA2KTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGU2ID0gTm90aWZpY2F0aW9uVHlwZTY7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlNyBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNyk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNyA9IE5vdGlmaWNhdGlvblR5cGU3O1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTggZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDgpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTggPSBOb3RpZmljYXRpb25UeXBlODtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGU5IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA5KTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGU5ID0gTm90aWZpY2F0aW9uVHlwZTk7XG52YXIgTWVzc2FnZTtcbihmdW5jdGlvbiAoTWVzc2FnZSkge1xuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoZSBnaXZlbiBtZXNzYWdlIGlzIGEgcmVxdWVzdCBtZXNzYWdlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gbWVzc2FnZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBpcy5zdHJpbmcoY2FuZGlkYXRlLm1ldGhvZCkgJiYgKGlzLnN0cmluZyhjYW5kaWRhdGUuaWQpIHx8IGlzLm51bWJlcihjYW5kaWRhdGUuaWQpKTtcbiAgICB9XG4gICAgTWVzc2FnZS5pc1JlcXVlc3QgPSBpc1JlcXVlc3Q7XG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhlIGdpdmVuIG1lc3NhZ2UgaXMgYSBub3RpZmljYXRpb24gbWVzc2FnZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTm90aWZpY2F0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gbWVzc2FnZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBpcy5zdHJpbmcoY2FuZGlkYXRlLm1ldGhvZCkgJiYgbWVzc2FnZS5pZCA9PT0gdm9pZCAwO1xuICAgIH1cbiAgICBNZXNzYWdlLmlzTm90aWZpY2F0aW9uID0gaXNOb3RpZmljYXRpb247XG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhlIGdpdmVuIG1lc3NhZ2UgaXMgYSByZXNwb25zZSBtZXNzYWdlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNSZXNwb25zZShtZXNzYWdlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IG1lc3NhZ2U7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgKGNhbmRpZGF0ZS5yZXN1bHQgIT09IHZvaWQgMCB8fCAhIWNhbmRpZGF0ZS5lcnJvcikgJiYgKGlzLnN0cmluZyhjYW5kaWRhdGUuaWQpIHx8IGlzLm51bWJlcihjYW5kaWRhdGUuaWQpIHx8IGNhbmRpZGF0ZS5pZCA9PT0gbnVsbCk7XG4gICAgfVxuICAgIE1lc3NhZ2UuaXNSZXNwb25zZSA9IGlzUmVzcG9uc2U7XG59KShNZXNzYWdlIHx8IChleHBvcnRzLk1lc3NhZ2UgPSBNZXNzYWdlID0ge30pKTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xudmFyIF9hO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5MUlVDYWNoZSA9IGV4cG9ydHMuTGlua2VkTWFwID0gZXhwb3J0cy5Ub3VjaCA9IHZvaWQgMDtcbnZhciBUb3VjaDtcbihmdW5jdGlvbiAoVG91Y2gpIHtcbiAgICBUb3VjaC5Ob25lID0gMDtcbiAgICBUb3VjaC5GaXJzdCA9IDE7XG4gICAgVG91Y2guQXNPbGQgPSBUb3VjaC5GaXJzdDtcbiAgICBUb3VjaC5MYXN0ID0gMjtcbiAgICBUb3VjaC5Bc05ldyA9IFRvdWNoLkxhc3Q7XG59KShUb3VjaCB8fCAoZXhwb3J0cy5Ub3VjaCA9IFRvdWNoID0ge30pKTtcbmNsYXNzIExpbmtlZE1hcCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXNbX2FdID0gJ0xpbmtlZE1hcCc7XG4gICAgICAgIHRoaXMuX21hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5faGVhZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fdGFpbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IDA7XG4gICAgICAgIHRoaXMuX3N0YXRlID0gMDtcbiAgICB9XG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuX21hcC5jbGVhcigpO1xuICAgICAgICB0aGlzLl9oZWFkID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl90YWlsID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9zaXplID0gMDtcbiAgICAgICAgdGhpcy5fc3RhdGUrKztcbiAgICB9XG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLl9oZWFkICYmICF0aGlzLl90YWlsO1xuICAgIH1cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpemU7XG4gICAgfVxuICAgIGdldCBmaXJzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlYWQ/LnZhbHVlO1xuICAgIH1cbiAgICBnZXQgbGFzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhaWw/LnZhbHVlO1xuICAgIH1cbiAgICBoYXMoa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXAuaGFzKGtleSk7XG4gICAgfVxuICAgIGdldChrZXksIHRvdWNoID0gVG91Y2guTm9uZSkge1xuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5fbWFwLmdldChrZXkpO1xuICAgICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRvdWNoICE9PSBUb3VjaC5Ob25lKSB7XG4gICAgICAgICAgICB0aGlzLnRvdWNoKGl0ZW0sIHRvdWNoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICB9XG4gICAgc2V0KGtleSwgdmFsdWUsIHRvdWNoID0gVG91Y2guTm9uZSkge1xuICAgICAgICBsZXQgaXRlbSA9IHRoaXMuX21hcC5nZXQoa2V5KTtcbiAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgIGl0ZW0udmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIGlmICh0b3VjaCAhPT0gVG91Y2guTm9uZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudG91Y2goaXRlbSwgdG91Y2gpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaXRlbSA9IHsga2V5LCB2YWx1ZSwgbmV4dDogdW5kZWZpbmVkLCBwcmV2aW91czogdW5kZWZpbmVkIH07XG4gICAgICAgICAgICBzd2l0Y2ggKHRvdWNoKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBUb3VjaC5Ob25lOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFRvdWNoLkZpcnN0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1GaXJzdChpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBUb3VjaC5MYXN0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX21hcC5zZXQoa2V5LCBpdGVtKTtcbiAgICAgICAgICAgIHRoaXMuX3NpemUrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGVsZXRlKGtleSkge1xuICAgICAgICByZXR1cm4gISF0aGlzLnJlbW92ZShrZXkpO1xuICAgIH1cbiAgICByZW1vdmUoa2V5KSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl9tYXAuZ2V0KGtleSk7XG4gICAgICAgIGlmICghaXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tYXAuZGVsZXRlKGtleSk7XG4gICAgICAgIHRoaXMucmVtb3ZlSXRlbShpdGVtKTtcbiAgICAgICAgdGhpcy5fc2l6ZS0tO1xuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICB9XG4gICAgc2hpZnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5faGVhZCAmJiAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2hlYWQgfHwgIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIHRoaXMuX21hcC5kZWxldGUoaXRlbS5rZXkpO1xuICAgICAgICB0aGlzLnJlbW92ZUl0ZW0oaXRlbSk7XG4gICAgICAgIHRoaXMuX3NpemUtLTtcbiAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7XG4gICAgfVxuICAgIGZvckVhY2goY2FsbGJhY2tmbiwgdGhpc0FyZykge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3N0YXRlO1xuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICAgICAgICBpZiAodGhpc0FyZykge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrZm4uYmluZCh0aGlzQXJnKShjdXJyZW50LnZhbHVlLCBjdXJyZW50LmtleSwgdGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFja2ZuKGN1cnJlbnQudmFsdWUsIGN1cnJlbnQua2V5LCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gc3RhdGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExpbmtlZE1hcCBnb3QgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAga2V5cygpIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9zdGF0ZTtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLl9oZWFkO1xuICAgICAgICBjb25zdCBpdGVyYXRvciA9IHtcbiAgICAgICAgICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fc3RhdGUgIT09IHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTGlua2VkTWFwIGdvdCBtb2RpZmllZCBkdXJpbmcgaXRlcmF0aW9uLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7IHZhbHVlOiBjdXJyZW50LmtleSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICB9XG4gICAgdmFsdWVzKCkge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3N0YXRlO1xuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIGNvbnN0IGl0ZXJhdG9yID0ge1xuICAgICAgICAgICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlcmF0b3I7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBMaW5rZWRNYXAgZ290IG1vZGlmaWVkIGR1cmluZyBpdGVyYXRpb24uYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHsgdmFsdWU6IGN1cnJlbnQudmFsdWUsIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gaXRlcmF0b3I7XG4gICAgfVxuICAgIGVudHJpZXMoKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5fc3RhdGU7XG4gICAgICAgIGxldCBjdXJyZW50ID0gdGhpcy5faGVhZDtcbiAgICAgICAgY29uc3QgaXRlcmF0b3IgPSB7XG4gICAgICAgICAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3N0YXRlICE9PSBzdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExpbmtlZE1hcCBnb3QgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geyB2YWx1ZTogW2N1cnJlbnQua2V5LCBjdXJyZW50LnZhbHVlXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICB9XG4gICAgWyhfYSA9IFN5bWJvbC50b1N0cmluZ1RhZywgU3ltYm9sLml0ZXJhdG9yKV0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMoKTtcbiAgICB9XG4gICAgdHJpbU9sZChuZXdTaXplKSB7XG4gICAgICAgIGlmIChuZXdTaXplID49IHRoaXMuc2l6ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuZXdTaXplID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLl9oZWFkO1xuICAgICAgICBsZXQgY3VycmVudFNpemUgPSB0aGlzLnNpemU7XG4gICAgICAgIHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnRTaXplID4gbmV3U2l6ZSkge1xuICAgICAgICAgICAgdGhpcy5fbWFwLmRlbGV0ZShjdXJyZW50LmtleSk7XG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0O1xuICAgICAgICAgICAgY3VycmVudFNpemUtLTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9oZWFkID0gY3VycmVudDtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IGN1cnJlbnRTaXplO1xuICAgICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICAgICAgY3VycmVudC5wcmV2aW91cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgIH1cbiAgICBhZGRJdGVtRmlyc3QoaXRlbSkge1xuICAgICAgICAvLyBGaXJzdCB0aW1lIEluc2VydFxuICAgICAgICBpZiAoIXRoaXMuX2hlYWQgJiYgIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRoaXMuX3RhaWwgPSBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCF0aGlzLl9oZWFkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbGlzdCcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdGhpcy5faGVhZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQucHJldmlvdXMgPSBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2hlYWQgPSBpdGVtO1xuICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgIH1cbiAgICBhZGRJdGVtTGFzdChpdGVtKSB7XG4gICAgICAgIC8vIEZpcnN0IHRpbWUgSW5zZXJ0XG4gICAgICAgIGlmICghdGhpcy5faGVhZCAmJiAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgdGhpcy5faGVhZCA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpdGVtLnByZXZpb3VzID0gdGhpcy5fdGFpbDtcbiAgICAgICAgICAgIHRoaXMuX3RhaWwubmV4dCA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW07XG4gICAgICAgIHRoaXMuX3N0YXRlKys7XG4gICAgfVxuICAgIHJlbW92ZUl0ZW0oaXRlbSkge1xuICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCAmJiBpdGVtID09PSB0aGlzLl90YWlsKSB7XG4gICAgICAgICAgICB0aGlzLl9oZWFkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpdGVtID09PSB0aGlzLl9oZWFkKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGNhbiBvbmx5IGhhcHBlbmVkIGlmIHNpemUgPT09IDEgd2hpY2ggaXMgaGFuZGxlXG4gICAgICAgICAgICAvLyBieSB0aGUgY2FzZSBhYm92ZS5cbiAgICAgICAgICAgIGlmICghaXRlbS5uZXh0KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxpc3QnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGl0ZW0ubmV4dC5wcmV2aW91cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQgPSBpdGVtLm5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXRlbSA9PT0gdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgLy8gVGhpcyBjYW4gb25seSBoYXBwZW5lZCBpZiBzaXplID09PSAxIHdoaWNoIGlzIGhhbmRsZVxuICAgICAgICAgICAgLy8gYnkgdGhlIGNhc2UgYWJvdmUuXG4gICAgICAgICAgICBpZiAoIWl0ZW0ucHJldmlvdXMpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbGlzdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbS5wcmV2aW91cy5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gaXRlbS5uZXh0O1xuICAgICAgICAgICAgY29uc3QgcHJldmlvdXMgPSBpdGVtLnByZXZpb3VzO1xuICAgICAgICAgICAgaWYgKCFuZXh0IHx8ICFwcmV2aW91cykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXh0LnByZXZpb3VzID0gcHJldmlvdXM7XG4gICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gbmV4dDtcbiAgICAgICAgfVxuICAgICAgICBpdGVtLm5leHQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGl0ZW0ucHJldmlvdXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX3N0YXRlKys7XG4gICAgfVxuICAgIHRvdWNoKGl0ZW0sIHRvdWNoKSB7XG4gICAgICAgIGlmICghdGhpcy5faGVhZCB8fCAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxpc3QnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHRvdWNoICE9PSBUb3VjaC5GaXJzdCAmJiB0b3VjaCAhPT0gVG91Y2guTGFzdCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG91Y2ggPT09IFRvdWNoLkZpcnN0KSB7XG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBpdGVtLm5leHQ7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgICAgICAvLyBVbmxpbmsgdGhlIGl0ZW1cbiAgICAgICAgICAgIGlmIChpdGVtID09PSB0aGlzLl90YWlsKSB7XG4gICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgbXVzdCBiZSBkZWZpbmVkIHNpbmNlIGl0ZW0gd2FzIG5vdCBoZWFkIGJ1dCBpcyB0YWlsXG4gICAgICAgICAgICAgICAgLy8gU28gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbiBpdGVtIGluIHRoZSBtYXBcbiAgICAgICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuX3RhaWwgPSBwcmV2aW91cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEJvdGggbmV4dCBhbmQgcHJldmlvdXMgYXJlIG5vdCB1bmRlZmluZWQgc2luY2UgaXRlbSB3YXMgbmVpdGhlciBoZWFkIG5vciB0YWlsLlxuICAgICAgICAgICAgICAgIG5leHQucHJldmlvdXMgPSBwcmV2aW91cztcbiAgICAgICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEluc2VydCB0aGUgbm9kZSBhdCBoZWFkXG4gICAgICAgICAgICBpdGVtLnByZXZpb3VzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdGhpcy5faGVhZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQucHJldmlvdXMgPSBpdGVtO1xuICAgICAgICAgICAgdGhpcy5faGVhZCA9IGl0ZW07XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRvdWNoID09PSBUb3VjaC5MYXN0KSB7XG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBpdGVtLm5leHQ7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgICAgICAvLyBVbmxpbmsgdGhlIGl0ZW0uXG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCkge1xuICAgICAgICAgICAgICAgIC8vIG5leHQgbXVzdCBiZSBkZWZpbmVkIHNpbmNlIGl0ZW0gd2FzIG5vdCB0YWlsIGJ1dCBpcyBoZWFkXG4gICAgICAgICAgICAgICAgLy8gU28gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbiBpdGVtIGluIHRoZSBtYXBcbiAgICAgICAgICAgICAgICBuZXh0LnByZXZpb3VzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuX2hlYWQgPSBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQm90aCBuZXh0IGFuZCBwcmV2aW91cyBhcmUgbm90IHVuZGVmaW5lZCBzaW5jZSBpdGVtIHdhcyBuZWl0aGVyIGhlYWQgbm9yIHRhaWwuXG4gICAgICAgICAgICAgICAgbmV4dC5wcmV2aW91cyA9IHByZXZpb3VzO1xuICAgICAgICAgICAgICAgIHByZXZpb3VzLm5leHQgPSBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaXRlbS5wcmV2aW91cyA9IHRoaXMuX3RhaWw7XG4gICAgICAgICAgICB0aGlzLl90YWlsLm5leHQgPSBpdGVtO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW07XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IFtdO1xuICAgICAgICB0aGlzLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGRhdGEucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGZyb21KU09OKGRhdGEpIHtcbiAgICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBkYXRhKSB7XG4gICAgICAgICAgICB0aGlzLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuTGlua2VkTWFwID0gTGlua2VkTWFwO1xuY2xhc3MgTFJVQ2FjaGUgZXh0ZW5kcyBMaW5rZWRNYXAge1xuICAgIGNvbnN0cnVjdG9yKGxpbWl0LCByYXRpbyA9IDEpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fbGltaXQgPSBsaW1pdDtcbiAgICAgICAgdGhpcy5fcmF0aW8gPSBNYXRoLm1pbihNYXRoLm1heCgwLCByYXRpbyksIDEpO1xuICAgIH1cbiAgICBnZXQgbGltaXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9saW1pdDtcbiAgICB9XG4gICAgc2V0IGxpbWl0KGxpbWl0KSB7XG4gICAgICAgIHRoaXMuX2xpbWl0ID0gbGltaXQ7XG4gICAgICAgIHRoaXMuY2hlY2tUcmltKCk7XG4gICAgfVxuICAgIGdldCByYXRpbygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JhdGlvO1xuICAgIH1cbiAgICBzZXQgcmF0aW8ocmF0aW8pIHtcbiAgICAgICAgdGhpcy5fcmF0aW8gPSBNYXRoLm1pbihNYXRoLm1heCgwLCByYXRpbyksIDEpO1xuICAgICAgICB0aGlzLmNoZWNrVHJpbSgpO1xuICAgIH1cbiAgICBnZXQoa2V5LCB0b3VjaCA9IFRvdWNoLkFzTmV3KSB7XG4gICAgICAgIHJldHVybiBzdXBlci5nZXQoa2V5LCB0b3VjaCk7XG4gICAgfVxuICAgIHBlZWsoa2V5KSB7XG4gICAgICAgIHJldHVybiBzdXBlci5nZXQoa2V5LCBUb3VjaC5Ob25lKTtcbiAgICB9XG4gICAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgc3VwZXIuc2V0KGtleSwgdmFsdWUsIFRvdWNoLkxhc3QpO1xuICAgICAgICB0aGlzLmNoZWNrVHJpbSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgY2hlY2tUcmltKCkge1xuICAgICAgICBpZiAodGhpcy5zaXplID4gdGhpcy5fbGltaXQpIHtcbiAgICAgICAgICAgIHRoaXMudHJpbU9sZChNYXRoLnJvdW5kKHRoaXMuX2xpbWl0ICogdGhpcy5fcmF0aW8pKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuTFJVQ2FjaGUgPSBMUlVDYWNoZTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5EaXNwb3NhYmxlID0gdm9pZCAwO1xudmFyIERpc3Bvc2FibGU7XG4oZnVuY3Rpb24gKERpc3Bvc2FibGUpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUoZnVuYykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGlzcG9zZTogZnVuY1xuICAgICAgICB9O1xuICAgIH1cbiAgICBEaXNwb3NhYmxlLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKERpc3Bvc2FibGUgfHwgKGV4cG9ydHMuRGlzcG9zYWJsZSA9IERpc3Bvc2FibGUgPSB7fSkpO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xubGV0IF9yYWw7XG5mdW5jdGlvbiBSQUwoKSB7XG4gICAgaWYgKF9yYWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHJ1bnRpbWUgYWJzdHJhY3Rpb24gbGF5ZXIgaW5zdGFsbGVkYCk7XG4gICAgfVxuICAgIHJldHVybiBfcmFsO1xufVxuKGZ1bmN0aW9uIChSQUwpIHtcbiAgICBmdW5jdGlvbiBpbnN0YWxsKHJhbCkge1xuICAgICAgICBpZiAocmFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gcnVudGltZSBhYnN0cmFjdGlvbiBsYXllciBwcm92aWRlZGApO1xuICAgICAgICB9XG4gICAgICAgIF9yYWwgPSByYWw7XG4gICAgfVxuICAgIFJBTC5pbnN0YWxsID0gaW5zdGFsbDtcbn0pKFJBTCB8fCAoUkFMID0ge30pKTtcbmV4cG9ydHMuZGVmYXVsdCA9IFJBTDtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuRW1pdHRlciA9IGV4cG9ydHMuRXZlbnQgPSB2b2lkIDA7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbnZhciBFdmVudDtcbihmdW5jdGlvbiAoRXZlbnQpIHtcbiAgICBjb25zdCBfZGlzcG9zYWJsZSA9IHsgZGlzcG9zZSgpIHsgfSB9O1xuICAgIEV2ZW50Lk5vbmUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBfZGlzcG9zYWJsZTsgfTtcbn0pKEV2ZW50IHx8IChleHBvcnRzLkV2ZW50ID0gRXZlbnQgPSB7fSkpO1xuY2xhc3MgQ2FsbGJhY2tMaXN0IHtcbiAgICBhZGQoY2FsbGJhY2ssIGNvbnRleHQgPSBudWxsLCBidWNrZXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fY29udGV4dHMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgICAgIHRoaXMuX2NvbnRleHRzLnB1c2goY29udGV4dCk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGJ1Y2tldCkpIHtcbiAgICAgICAgICAgIGJ1Y2tldC5wdXNoKHsgZGlzcG9zZTogKCkgPT4gdGhpcy5yZW1vdmUoY2FsbGJhY2ssIGNvbnRleHQpIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlbW92ZShjYWxsYmFjaywgY29udGV4dCA9IG51bGwpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZm91bmRDYWxsYmFja1dpdGhEaWZmZXJlbnRDb250ZXh0ID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLl9jYWxsYmFja3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jYWxsYmFja3NbaV0gPT09IGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NvbnRleHRzW2ldID09PSBjb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrICYgY29udGV4dCBtYXRjaCA9PiByZW1vdmUgaXRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29udGV4dHMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZENhbGxiYWNrV2l0aERpZmZlcmVudENvbnRleHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZm91bmRDYWxsYmFja1dpdGhEaWZmZXJlbnRDb250ZXh0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1doZW4gYWRkaW5nIGEgbGlzdGVuZXIgd2l0aCBhIGNvbnRleHQsIHlvdSBzaG91bGQgcmVtb3ZlIGl0IHdpdGggdGhlIHNhbWUgY29udGV4dCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGludm9rZSguLi5hcmdzKSB7XG4gICAgICAgIGlmICghdGhpcy5fY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmV0ID0gW10sIGNhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcy5zbGljZSgwKSwgY29udGV4dHMgPSB0aGlzLl9jb250ZXh0cy5zbGljZSgwKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXQucHVzaChjYWxsYmFja3NbaV0uYXBwbHkoY29udGV4dHNbaV0sIGFyZ3MpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS5jb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICAgIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5fY2FsbGJhY2tzIHx8IHRoaXMuX2NhbGxiYWNrcy5sZW5ndGggPT09IDA7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fY29udGV4dHMgPSB1bmRlZmluZWQ7XG4gICAgfVxufVxuY2xhc3MgRW1pdHRlciB7XG4gICAgY29uc3RydWN0b3IoX29wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IF9vcHRpb25zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGb3IgdGhlIHB1YmxpYyB0byBhbGxvdyB0byBzdWJzY3JpYmVcbiAgICAgKiB0byBldmVudHMgZnJvbSB0aGlzIEVtaXR0ZXJcbiAgICAgKi9cbiAgICBnZXQgZXZlbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fZXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50ID0gKGxpc3RlbmVyLCB0aGlzQXJncywgZGlzcG9zYWJsZXMpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2NhbGxiYWNrcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWxsYmFja3MgPSBuZXcgQ2FsbGJhY2tMaXN0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMub25GaXJzdExpc3RlbmVyQWRkICYmIHRoaXMuX2NhbGxiYWNrcy5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy5vbkZpcnN0TGlzdGVuZXJBZGQodGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5hZGQobGlzdGVuZXIsIHRoaXNBcmdzKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlzcG9zYWJsZSBpcyBkaXNwb3NlZCBhZnRlciBlbWl0dGVyIGlzIGRpc3Bvc2VkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5yZW1vdmUobGlzdGVuZXIsIHRoaXNBcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5kaXNwb3NlID0gRW1pdHRlci5fbm9vcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMub25MYXN0TGlzdGVuZXJSZW1vdmUgJiYgdGhpcy5fY2FsbGJhY2tzLmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29wdGlvbnMub25MYXN0TGlzdGVuZXJSZW1vdmUodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRpc3Bvc2FibGVzKSkge1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlcy5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9ldmVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVG8gYmUga2VwdCBwcml2YXRlIHRvIGZpcmUgYW4gZXZlbnQgdG9cbiAgICAgKiBzdWJzY3JpYmVyc1xuICAgICAqL1xuICAgIGZpcmUoZXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NhbGxiYWNrcykge1xuICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzLmludm9rZS5jYWxsKHRoaXMuX2NhbGxiYWNrcywgZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5kaXNwb3NlKCk7XG4gICAgICAgICAgICB0aGlzLl9jYWxsYmFja3MgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLkVtaXR0ZXIgPSBFbWl0dGVyO1xuRW1pdHRlci5fbm9vcCA9IGZ1bmN0aW9uICgpIHsgfTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uVG9rZW4gPSB2b2lkIDA7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbmNvbnN0IElzID0gcmVxdWlyZShcIi4vaXNcIik7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCIuL2V2ZW50c1wiKTtcbnZhciBDYW5jZWxsYXRpb25Ub2tlbjtcbihmdW5jdGlvbiAoQ2FuY2VsbGF0aW9uVG9rZW4pIHtcbiAgICBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGlzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkOiBmYWxzZSxcbiAgICAgICAgb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6IGV2ZW50c18xLkV2ZW50Lk5vbmVcbiAgICB9KTtcbiAgICBDYW5jZWxsYXRpb25Ub2tlbi5DYW5jZWxsZWQgPSBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6IHRydWUsXG4gICAgICAgIG9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkOiBldmVudHNfMS5FdmVudC5Ob25lXG4gICAgfSk7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgKGNhbmRpZGF0ZSA9PT0gQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZVxuICAgICAgICAgICAgfHwgY2FuZGlkYXRlID09PSBDYW5jZWxsYXRpb25Ub2tlbi5DYW5jZWxsZWRcbiAgICAgICAgICAgIHx8IChJcy5ib29sZWFuKGNhbmRpZGF0ZS5pc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkgJiYgISFjYW5kaWRhdGUub25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQpKTtcbiAgICB9XG4gICAgQ2FuY2VsbGF0aW9uVG9rZW4uaXMgPSBpcztcbn0pKENhbmNlbGxhdGlvblRva2VuIHx8IChleHBvcnRzLkNhbmNlbGxhdGlvblRva2VuID0gQ2FuY2VsbGF0aW9uVG9rZW4gPSB7fSkpO1xuY29uc3Qgc2hvcnRjdXRFdmVudCA9IE9iamVjdC5mcmVlemUoZnVuY3Rpb24gKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgY29uc3QgaGFuZGxlID0gKDAsIHJhbF8xLmRlZmF1bHQpKCkudGltZXIuc2V0VGltZW91dChjYWxsYmFjay5iaW5kKGNvbnRleHQpLCAwKTtcbiAgICByZXR1cm4geyBkaXNwb3NlKCkgeyBoYW5kbGUuZGlzcG9zZSgpOyB9IH07XG59KTtcbmNsYXNzIE11dGFibGVUb2tlbiB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX2lzQ2FuY2VsbGVkID0gZmFsc2U7XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9pc0NhbmNlbGxlZCkge1xuICAgICAgICAgICAgdGhpcy5faXNDYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2VtaXR0ZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmZpcmUodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0NhbmNlbGxlZDtcbiAgICB9XG4gICAgZ2V0IG9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKCkge1xuICAgICAgICBpZiAodGhpcy5faXNDYW5jZWxsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBzaG9ydGN1dEV2ZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5fZW1pdHRlcikge1xuICAgICAgICAgICAgdGhpcy5fZW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2VtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLl9lbWl0dGVyKSB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5jbGFzcyBDYW5jZWxsYXRpb25Ub2tlblNvdXJjZSB7XG4gICAgZ2V0IHRva2VuKCkge1xuICAgICAgICBpZiAoIXRoaXMuX3Rva2VuKSB7XG4gICAgICAgICAgICAvLyBiZSBsYXp5IGFuZCBjcmVhdGUgdGhlIHRva2VuIG9ubHkgd2hlblxuICAgICAgICAgICAgLy8gYWN0dWFsbHkgbmVlZGVkXG4gICAgICAgICAgICB0aGlzLl90b2tlbiA9IG5ldyBNdXRhYmxlVG9rZW4oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fdG9rZW47XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl90b2tlbikge1xuICAgICAgICAgICAgLy8gc2F2ZSBhbiBvYmplY3QgYnkgcmV0dXJuaW5nIHRoZSBkZWZhdWx0XG4gICAgICAgICAgICAvLyBjYW5jZWxsZWQgdG9rZW4gd2hlbiBjYW5jZWxsYXRpb24gaGFwcGVuc1xuICAgICAgICAgICAgLy8gYmVmb3JlIHNvbWVvbmUgYXNrcyBmb3IgdGhlIHRva2VuXG4gICAgICAgICAgICB0aGlzLl90b2tlbiA9IENhbmNlbGxhdGlvblRva2VuLkNhbmNlbGxlZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3Rva2VuLmNhbmNlbCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICghdGhpcy5fdG9rZW4pIHtcbiAgICAgICAgICAgIC8vIGVuc3VyZSB0byBpbml0aWFsaXplIHdpdGggYW4gZW1wdHkgdG9rZW4gaWYgd2UgaGFkIG5vbmVcbiAgICAgICAgICAgIHRoaXMuX3Rva2VuID0gQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLl90b2tlbiBpbnN0YW5jZW9mIE11dGFibGVUb2tlbikge1xuICAgICAgICAgICAgLy8gYWN0dWFsbHkgZGlzcG9zZVxuICAgICAgICAgICAgdGhpcy5fdG9rZW4uZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IENhbmNlbGxhdGlvblRva2VuU291cmNlO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3kgPSB2b2lkIDA7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbnZhciBDYW5jZWxsYXRpb25TdGF0ZTtcbihmdW5jdGlvbiAoQ2FuY2VsbGF0aW9uU3RhdGUpIHtcbiAgICBDYW5jZWxsYXRpb25TdGF0ZS5Db250aW51ZSA9IDA7XG4gICAgQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkID0gMTtcbn0pKENhbmNlbGxhdGlvblN0YXRlIHx8IChDYW5jZWxsYXRpb25TdGF0ZSA9IHt9KSk7XG5jbGFzcyBTaGFyZWRBcnJheVNlbmRlclN0cmF0ZWd5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5idWZmZXJzID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICBlbmFibGVDYW5jZWxsYXRpb24ocmVxdWVzdCkge1xuICAgICAgICBpZiAocmVxdWVzdC5pZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBTaGFyZWRBcnJheUJ1ZmZlcig0KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBJbnQzMkFycmF5KGJ1ZmZlciwgMCwgMSk7XG4gICAgICAgIGRhdGFbMF0gPSBDYW5jZWxsYXRpb25TdGF0ZS5Db250aW51ZTtcbiAgICAgICAgdGhpcy5idWZmZXJzLnNldChyZXF1ZXN0LmlkLCBidWZmZXIpO1xuICAgICAgICByZXF1ZXN0LiRjYW5jZWxsYXRpb25EYXRhID0gYnVmZmVyO1xuICAgIH1cbiAgICBhc3luYyBzZW5kQ2FuY2VsbGF0aW9uKF9jb25uLCBpZCkge1xuICAgICAgICBjb25zdCBidWZmZXIgPSB0aGlzLmJ1ZmZlcnMuZ2V0KGlkKTtcbiAgICAgICAgaWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBJbnQzMkFycmF5KGJ1ZmZlciwgMCwgMSk7XG4gICAgICAgIEF0b21pY3Muc3RvcmUoZGF0YSwgMCwgQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkKTtcbiAgICB9XG4gICAgY2xlYW51cChpZCkge1xuICAgICAgICB0aGlzLmJ1ZmZlcnMuZGVsZXRlKGlkKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy5idWZmZXJzLmNsZWFyKCk7XG4gICAgfVxufVxuZXhwb3J0cy5TaGFyZWRBcnJheVNlbmRlclN0cmF0ZWd5ID0gU2hhcmVkQXJyYXlTZW5kZXJTdHJhdGVneTtcbmNsYXNzIFNoYXJlZEFycmF5QnVmZmVyQ2FuY2VsbGF0aW9uVG9rZW4ge1xuICAgIGNvbnN0cnVjdG9yKGJ1ZmZlcikge1xuICAgICAgICB0aGlzLmRhdGEgPSBuZXcgSW50MzJBcnJheShidWZmZXIsIDAsIDEpO1xuICAgIH1cbiAgICBnZXQgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHJldHVybiBBdG9taWNzLmxvYWQodGhpcy5kYXRhLCAwKSA9PT0gQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkO1xuICAgIH1cbiAgICBnZXQgb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuY2VsbGF0aW9uIG92ZXIgU2hhcmVkQXJyYXlCdWZmZXIgZG9lc24ndCBzdXBwb3J0IGNhbmNlbGxhdGlvbiBldmVudHNgKTtcbiAgICB9XG59XG5jbGFzcyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuU291cmNlIHtcbiAgICBjb25zdHJ1Y3RvcihidWZmZXIpIHtcbiAgICAgICAgdGhpcy50b2tlbiA9IG5ldyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuKGJ1ZmZlcik7XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICB9XG59XG5jbGFzcyBTaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmtpbmQgPSAncmVxdWVzdCc7XG4gICAgfVxuICAgIGNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKHJlcXVlc3QpIHtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gcmVxdWVzdC4kY2FuY2VsbGF0aW9uRGF0YTtcbiAgICAgICAgaWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuU291cmNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuU291cmNlKGJ1ZmZlcik7XG4gICAgfVxufVxuZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBTaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3k7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNlbWFwaG9yZSA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY2xhc3MgU2VtYXBob3JlIHtcbiAgICBjb25zdHJ1Y3RvcihjYXBhY2l0eSA9IDEpIHtcbiAgICAgICAgaWYgKGNhcGFjaXR5IDw9IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FwYWNpdHkgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NhcGFjaXR5ID0gY2FwYWNpdHk7XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IDA7XG4gICAgICAgIHRoaXMuX3dhaXRpbmcgPSBbXTtcbiAgICB9XG4gICAgbG9jayh0aHVuaykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fd2FpdGluZy5wdXNoKHsgdGh1bmssIHJlc29sdmUsIHJlamVjdCB9KTtcbiAgICAgICAgICAgIHRoaXMucnVuTmV4dCgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0IGFjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTtcbiAgICB9XG4gICAgcnVuTmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dhaXRpbmcubGVuZ3RoID09PSAwIHx8IHRoaXMuX2FjdGl2ZSA9PT0gdGhpcy5fY2FwYWNpdHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS50aW1lci5zZXRJbW1lZGlhdGUoKCkgPT4gdGhpcy5kb1J1bk5leHQoKSk7XG4gICAgfVxuICAgIGRvUnVuTmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dhaXRpbmcubGVuZ3RoID09PSAwIHx8IHRoaXMuX2FjdGl2ZSA9PT0gdGhpcy5fY2FwYWNpdHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5fd2FpdGluZy5zaGlmdCgpO1xuICAgICAgICB0aGlzLl9hY3RpdmUrKztcbiAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZSA+IHRoaXMuX2NhcGFjaXR5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRvIG1hbnkgdGh1bmtzIGFjdGl2ZWApO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXh0LnRodW5rKCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC50aGVuKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5yZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5OZXh0KCk7XG4gICAgICAgICAgICAgICAgfSwgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5yZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5OZXh0KCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICBuZXh0LnJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1bk5leHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgIG5leHQucmVqZWN0KGVycik7XG4gICAgICAgICAgICB0aGlzLnJ1bk5leHQoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuU2VtYXBob3JlID0gU2VtYXBob3JlO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXIgPSBleHBvcnRzLkFic3RyYWN0TWVzc2FnZVJlYWRlciA9IGV4cG9ydHMuTWVzc2FnZVJlYWRlciA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IGV2ZW50c18xID0gcmVxdWlyZShcIi4vZXZlbnRzXCIpO1xuY29uc3Qgc2VtYXBob3JlXzEgPSByZXF1aXJlKFwiLi9zZW1hcGhvcmVcIik7XG52YXIgTWVzc2FnZVJlYWRlcjtcbihmdW5jdGlvbiAoTWVzc2FnZVJlYWRlcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5saXN0ZW4pICYmIElzLmZ1bmMoY2FuZGlkYXRlLmRpc3Bvc2UpICYmXG4gICAgICAgICAgICBJcy5mdW5jKGNhbmRpZGF0ZS5vbkVycm9yKSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5vbkNsb3NlKSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5vblBhcnRpYWxNZXNzYWdlKTtcbiAgICB9XG4gICAgTWVzc2FnZVJlYWRlci5pcyA9IGlzO1xufSkoTWVzc2FnZVJlYWRlciB8fCAoZXhwb3J0cy5NZXNzYWdlUmVhZGVyID0gTWVzc2FnZVJlYWRlciA9IHt9KSk7XG5jbGFzcyBBYnN0cmFjdE1lc3NhZ2VSZWFkZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZUVtaXR0ZXIgPSBuZXcgZXZlbnRzXzEuRW1pdHRlcigpO1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlci5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgZ2V0IG9uRXJyb3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVycm9yRW1pdHRlci5ldmVudDtcbiAgICB9XG4gICAgZmlyZUVycm9yKGVycm9yKSB7XG4gICAgICAgIHRoaXMuZXJyb3JFbWl0dGVyLmZpcmUodGhpcy5hc0Vycm9yKGVycm9yKSk7XG4gICAgfVxuICAgIGdldCBvbkNsb3NlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9zZUVtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGZpcmVDbG9zZSgpIHtcbiAgICAgICAgdGhpcy5jbG9zZUVtaXR0ZXIuZmlyZSh1bmRlZmluZWQpO1xuICAgIH1cbiAgICBnZXQgb25QYXJ0aWFsTWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFydGlhbE1lc3NhZ2VFbWl0dGVyLmV2ZW50O1xuICAgIH1cbiAgICBmaXJlUGFydGlhbE1lc3NhZ2UoaW5mbykge1xuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlRW1pdHRlci5maXJlKGluZm8pO1xuICAgIH1cbiAgICBhc0Vycm9yKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKGBSZWFkZXIgcmVjZWl2ZWQgZXJyb3IuIFJlYXNvbjogJHtJcy5zdHJpbmcoZXJyb3IubWVzc2FnZSkgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24nfWApO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VSZWFkZXIgPSBBYnN0cmFjdE1lc3NhZ2VSZWFkZXI7XG52YXIgUmVzb2x2ZWRNZXNzYWdlUmVhZGVyT3B0aW9ucztcbihmdW5jdGlvbiAoUmVzb2x2ZWRNZXNzYWdlUmVhZGVyT3B0aW9ucykge1xuICAgIGZ1bmN0aW9uIGZyb21PcHRpb25zKG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IGNoYXJzZXQ7XG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIGxldCBjb250ZW50RGVjb2RlcjtcbiAgICAgICAgY29uc3QgY29udGVudERlY29kZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICBsZXQgY29udGVudFR5cGVEZWNvZGVyO1xuICAgICAgICBjb25zdCBjb250ZW50VHlwZURlY29kZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY2hhcnNldCA9IG9wdGlvbnMgPz8gJ3V0Zi04JztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNoYXJzZXQgPSBvcHRpb25zLmNoYXJzZXQgPz8gJ3V0Zi04JztcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnREZWNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50RGVjb2RlciA9IG9wdGlvbnMuY29udGVudERlY29kZXI7XG4gICAgICAgICAgICAgICAgY29udGVudERlY29kZXJzLnNldChjb250ZW50RGVjb2Rlci5uYW1lLCBjb250ZW50RGVjb2Rlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5jb250ZW50RGVjb2RlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGVjb2RlciBvZiBvcHRpb25zLmNvbnRlbnREZWNvZGVycykge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50RGVjb2RlcnMuc2V0KGRlY29kZXIubmFtZSwgZGVjb2Rlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuY29udGVudFR5cGVEZWNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXIgPSBvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcjtcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXJzLnNldChjb250ZW50VHlwZURlY29kZXIubmFtZSwgY29udGVudFR5cGVEZWNvZGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGVjb2RlciBvZiBvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGVEZWNvZGVycy5zZXQoZGVjb2Rlci5uYW1lLCBkZWNvZGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnRlbnRUeXBlRGVjb2RlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXIgPSAoMCwgcmFsXzEuZGVmYXVsdCkoKS5hcHBsaWNhdGlvbkpzb24uZGVjb2RlcjtcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlRGVjb2RlcnMuc2V0KGNvbnRlbnRUeXBlRGVjb2Rlci5uYW1lLCBjb250ZW50VHlwZURlY29kZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGNoYXJzZXQsIGNvbnRlbnREZWNvZGVyLCBjb250ZW50RGVjb2RlcnMsIGNvbnRlbnRUeXBlRGVjb2RlciwgY29udGVudFR5cGVEZWNvZGVycyB9O1xuICAgIH1cbiAgICBSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zLmZyb21PcHRpb25zID0gZnJvbU9wdGlvbnM7XG59KShSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zIHx8IChSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zID0ge30pKTtcbmNsYXNzIFJlYWRhYmxlU3RyZWFtTWVzc2FnZVJlYWRlciBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVJlYWRlciB7XG4gICAgY29uc3RydWN0b3IocmVhZGFibGUsIG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZSA9IHJlYWRhYmxlO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zLmZyb21PcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmJ1ZmZlciA9ICgwLCByYWxfMS5kZWZhdWx0KSgpLm1lc3NhZ2VCdWZmZXIuY3JlYXRlKHRoaXMub3B0aW9ucy5jaGFyc2V0KTtcbiAgICAgICAgdGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0ID0gMTAwMDA7XG4gICAgICAgIHRoaXMubmV4dE1lc3NhZ2VMZW5ndGggPSAtMTtcbiAgICAgICAgdGhpcy5tZXNzYWdlVG9rZW4gPSAwO1xuICAgICAgICB0aGlzLnJlYWRTZW1hcGhvcmUgPSBuZXcgc2VtYXBob3JlXzEuU2VtYXBob3JlKDEpO1xuICAgIH1cbiAgICBzZXQgcGFydGlhbE1lc3NhZ2VUaW1lb3V0KHRpbWVvdXQpIHtcbiAgICAgICAgdGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0ID0gdGltZW91dDtcbiAgICB9XG4gICAgZ2V0IHBhcnRpYWxNZXNzYWdlVGltZW91dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dDtcbiAgICB9XG4gICAgbGlzdGVuKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMubmV4dE1lc3NhZ2VMZW5ndGggPSAtMTtcbiAgICAgICAgdGhpcy5tZXNzYWdlVG9rZW4gPSAwO1xuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlVGltZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5yZWFkYWJsZS5vbkRhdGEoKGRhdGEpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25EYXRhKGRhdGEpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZS5vbkVycm9yKChlcnJvcikgPT4gdGhpcy5maXJlRXJyb3IoZXJyb3IpKTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZS5vbkNsb3NlKCgpID0+IHRoaXMuZmlyZUNsb3NlKCkpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBvbkRhdGEoZGF0YSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5idWZmZXIuYXBwZW5kKGRhdGEpO1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IHRoaXMuYnVmZmVyLnRyeVJlYWRIZWFkZXJzKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50TGVuZ3RoID0gaGVhZGVycy5nZXQoJ2NvbnRlbnQtbGVuZ3RoJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY29udGVudExlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IobmV3IEVycm9yKGBIZWFkZXIgbXVzdCBwcm92aWRlIGEgQ29udGVudC1MZW5ndGggcHJvcGVydHkuXFxuJHtKU09OLnN0cmluZ2lmeShPYmplY3QuZnJvbUVudHJpZXMoaGVhZGVycykpfWApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsZW5ndGggPSBwYXJzZUludChjb250ZW50TGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKGxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKG5ldyBFcnJvcihgQ29udGVudC1MZW5ndGggdmFsdWUgbXVzdCBiZSBhIG51bWJlci4gR290ICR7Y29udGVudExlbmd0aH1gKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IHRoaXMuYnVmZmVyLnRyeVJlYWRCb2R5KHRoaXMubmV4dE1lc3NhZ2VMZW5ndGgpO1xuICAgICAgICAgICAgICAgIGlmIChib2R5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLyoqIFdlIGhhdmVuJ3QgcmVjZWl2ZWQgdGhlIGZ1bGwgbWVzc2FnZSB5ZXQuICovXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0UGFydGlhbE1lc3NhZ2VUaW1lcigpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJQYXJ0aWFsTWVzc2FnZVRpbWVyKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9IC0xO1xuICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHdlIGNvbnZlcnQgb25lIHJlY2VpdmVkIG1lc3NhZ2UgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAgICAgLy8gb3RoZXIuIE90aGVyd2lzZSBpdCBjb3VsZCBoYXBwZW4gdGhhdCBhIGRlY29kaW5nIG9mIGEgc2Vjb25kXG4gICAgICAgICAgICAgICAgLy8gc21hbGxlciBtZXNzYWdlIGZpbmlzaGVkIGJlZm9yZSB0aGUgZGVjb2Rpbmcgb2YgYSBmaXJzdCBsYXJnZXJcbiAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIGFuZCB0aGVuIHdlIHdvdWxkIGRlbGl2ZXIgdGhlIHNlY29uZCBtZXNzYWdlIGZpcnN0LlxuICAgICAgICAgICAgICAgIHRoaXMucmVhZFNlbWFwaG9yZS5sb2NrKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnl0ZXMgPSB0aGlzLm9wdGlvbnMuY29udGVudERlY29kZXIgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBhd2FpdCB0aGlzLm9wdGlvbnMuY29udGVudERlY29kZXIuZGVjb2RlKGJvZHkpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGJvZHk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBhd2FpdCB0aGlzLm9wdGlvbnMuY29udGVudFR5cGVEZWNvZGVyLmRlY29kZShieXRlcywgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjayhtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNsZWFyUGFydGlhbE1lc3NhZ2VUaW1lcigpIHtcbiAgICAgICAgaWYgKHRoaXMucGFydGlhbE1lc3NhZ2VUaW1lcikge1xuICAgICAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZVRpbWVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRoaXMucGFydGlhbE1lc3NhZ2VUaW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRQYXJ0aWFsTWVzc2FnZVRpbWVyKCkge1xuICAgICAgICB0aGlzLmNsZWFyUGFydGlhbE1lc3NhZ2VUaW1lcigpO1xuICAgICAgICBpZiAodGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0IDw9IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlVGltZXIgPSAoMCwgcmFsXzEuZGVmYXVsdCkoKS50aW1lci5zZXRUaW1lb3V0KCh0b2tlbiwgdGltZW91dCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZVRpbWVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRva2VuID09PSB0aGlzLm1lc3NhZ2VUb2tlbikge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZVBhcnRpYWxNZXNzYWdlKHsgbWVzc2FnZVRva2VuOiB0b2tlbiwgd2FpdGluZ1RpbWU6IHRpbWVvdXQgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRQYXJ0aWFsTWVzc2FnZVRpbWVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dCwgdGhpcy5tZXNzYWdlVG9rZW4sIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dCk7XG4gICAgfVxufVxuZXhwb3J0cy5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXIgPSBSZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLldyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLkFic3RyYWN0TWVzc2FnZVdyaXRlciA9IGV4cG9ydHMuTWVzc2FnZVdyaXRlciA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IHNlbWFwaG9yZV8xID0gcmVxdWlyZShcIi4vc2VtYXBob3JlXCIpO1xuY29uc3QgZXZlbnRzXzEgPSByZXF1aXJlKFwiLi9ldmVudHNcIik7XG5jb25zdCBDb250ZW50TGVuZ3RoID0gJ0NvbnRlbnQtTGVuZ3RoOiAnO1xuY29uc3QgQ1JMRiA9ICdcXHJcXG4nO1xudmFyIE1lc3NhZ2VXcml0ZXI7XG4oZnVuY3Rpb24gKE1lc3NhZ2VXcml0ZXIpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgSXMuZnVuYyhjYW5kaWRhdGUuZGlzcG9zZSkgJiYgSXMuZnVuYyhjYW5kaWRhdGUub25DbG9zZSkgJiZcbiAgICAgICAgICAgIElzLmZ1bmMoY2FuZGlkYXRlLm9uRXJyb3IpICYmIElzLmZ1bmMoY2FuZGlkYXRlLndyaXRlKTtcbiAgICB9XG4gICAgTWVzc2FnZVdyaXRlci5pcyA9IGlzO1xufSkoTWVzc2FnZVdyaXRlciB8fCAoZXhwb3J0cy5NZXNzYWdlV3JpdGVyID0gTWVzc2FnZVdyaXRlciA9IHt9KSk7XG5jbGFzcyBBYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy5lcnJvckVtaXR0ZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLmNsb3NlRW1pdHRlci5kaXNwb3NlKCk7XG4gICAgfVxuICAgIGdldCBvbkVycm9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lcnJvckVtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGZpcmVFcnJvcihlcnJvciwgbWVzc2FnZSwgY291bnQpIHtcbiAgICAgICAgdGhpcy5lcnJvckVtaXR0ZXIuZmlyZShbdGhpcy5hc0Vycm9yKGVycm9yKSwgbWVzc2FnZSwgY291bnRdKTtcbiAgICB9XG4gICAgZ2V0IG9uQ2xvc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb3NlRW1pdHRlci5ldmVudDtcbiAgICB9XG4gICAgZmlyZUNsb3NlKCkge1xuICAgICAgICB0aGlzLmNsb3NlRW1pdHRlci5maXJlKHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIGFzRXJyb3IoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoYFdyaXRlciByZWNlaXZlZCBlcnJvci4gUmVhc29uOiAke0lzLnN0cmluZyhlcnJvci5tZXNzYWdlKSA/IGVycm9yLm1lc3NhZ2UgOiAndW5rbm93bid9YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLkFic3RyYWN0TWVzc2FnZVdyaXRlciA9IEFic3RyYWN0TWVzc2FnZVdyaXRlcjtcbnZhciBSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zO1xuKGZ1bmN0aW9uIChSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zKSB7XG4gICAgZnVuY3Rpb24gZnJvbU9wdGlvbnMob3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHsgY2hhcnNldDogb3B0aW9ucyA/PyAndXRmLTgnLCBjb250ZW50VHlwZUVuY29kZXI6ICgwLCByYWxfMS5kZWZhdWx0KSgpLmFwcGxpY2F0aW9uSnNvbi5lbmNvZGVyIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4geyBjaGFyc2V0OiBvcHRpb25zLmNoYXJzZXQgPz8gJ3V0Zi04JywgY29udGVudEVuY29kZXI6IG9wdGlvbnMuY29udGVudEVuY29kZXIsIGNvbnRlbnRUeXBlRW5jb2Rlcjogb3B0aW9ucy5jb250ZW50VHlwZUVuY29kZXIgPz8gKDAsIHJhbF8xLmRlZmF1bHQpKCkuYXBwbGljYXRpb25Kc29uLmVuY29kZXIgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zLmZyb21PcHRpb25zID0gZnJvbU9wdGlvbnM7XG59KShSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zIHx8IChSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zID0ge30pKTtcbmNsYXNzIFdyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKHdyaXRhYmxlLCBvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMud3JpdGFibGUgPSB3cml0YWJsZTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gUmVzb2x2ZWRNZXNzYWdlV3JpdGVyT3B0aW9ucy5mcm9tT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50ID0gMDtcbiAgICAgICAgdGhpcy53cml0ZVNlbWFwaG9yZSA9IG5ldyBzZW1hcGhvcmVfMS5TZW1hcGhvcmUoMSk7XG4gICAgICAgIHRoaXMud3JpdGFibGUub25FcnJvcigoZXJyb3IpID0+IHRoaXMuZmlyZUVycm9yKGVycm9yKSk7XG4gICAgICAgIHRoaXMud3JpdGFibGUub25DbG9zZSgoKSA9PiB0aGlzLmZpcmVDbG9zZSgpKTtcbiAgICB9XG4gICAgYXN5bmMgd3JpdGUobXNnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndyaXRlU2VtYXBob3JlLmxvY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHRoaXMub3B0aW9ucy5jb250ZW50VHlwZUVuY29kZXIuZW5jb2RlKG1zZywgdGhpcy5vcHRpb25zKS50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNvbnRlbnRFbmNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jb250ZW50RW5jb2Rlci5lbmNvZGUoYnVmZmVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZC50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJzID0gW107XG4gICAgICAgICAgICAgICAgaGVhZGVycy5wdXNoKENvbnRlbnRMZW5ndGgsIGJ1ZmZlci5ieXRlTGVuZ3RoLnRvU3RyaW5nKCksIENSTEYpO1xuICAgICAgICAgICAgICAgIGhlYWRlcnMucHVzaChDUkxGKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kb1dyaXRlKG1zZywgaGVhZGVycywgYnVmZmVyKTtcbiAgICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgZG9Xcml0ZShtc2csIGhlYWRlcnMsIGRhdGEpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMud3JpdGFibGUud3JpdGUoaGVhZGVycy5qb2luKCcnKSwgJ2FzY2lpJyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy53cml0YWJsZS53cml0ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IsIG1zZyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZUVycm9yKGVycm9yLCBtc2cpIHtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50Kys7XG4gICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yLCBtc2csIHRoaXMuZXJyb3JDb3VudCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICAgICAgdGhpcy53cml0YWJsZS5lbmQoKTtcbiAgICB9XG59XG5leHBvcnRzLldyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgPSBXcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkFic3RyYWN0TWVzc2FnZUJ1ZmZlciA9IHZvaWQgMDtcbmNvbnN0IENSID0gMTM7XG5jb25zdCBMRiA9IDEwO1xuY29uc3QgQ1JMRiA9ICdcXHJcXG4nO1xuY2xhc3MgQWJzdHJhY3RNZXNzYWdlQnVmZmVyIHtcbiAgICBjb25zdHJ1Y3RvcihlbmNvZGluZyA9ICd1dGYtOCcpIHtcbiAgICAgICAgdGhpcy5fZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgICAgICAgdGhpcy5fY2h1bmtzID0gW107XG4gICAgICAgIHRoaXMuX3RvdGFsTGVuZ3RoID0gMDtcbiAgICB9XG4gICAgZ2V0IGVuY29kaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW5jb2Rpbmc7XG4gICAgfVxuICAgIGFwcGVuZChjaHVuaykge1xuICAgICAgICBjb25zdCB0b0FwcGVuZCA9IHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZycgPyB0aGlzLmZyb21TdHJpbmcoY2h1bmssIHRoaXMuX2VuY29kaW5nKSA6IGNodW5rO1xuICAgICAgICB0aGlzLl9jaHVua3MucHVzaCh0b0FwcGVuZCk7XG4gICAgICAgIHRoaXMuX3RvdGFsTGVuZ3RoICs9IHRvQXBwZW5kLmJ5dGVMZW5ndGg7XG4gICAgfVxuICAgIHRyeVJlYWRIZWFkZXJzKGxvd2VyQ2FzZUtleXMgPSBmYWxzZSkge1xuICAgICAgICBpZiAodGhpcy5fY2h1bmtzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3RhdGUgPSAwO1xuICAgICAgICBsZXQgY2h1bmtJbmRleCA9IDA7XG4gICAgICAgIGxldCBvZmZzZXQgPSAwO1xuICAgICAgICBsZXQgY2h1bmtCeXRlc1JlYWQgPSAwO1xuICAgICAgICByb3c6IHdoaWxlIChjaHVua0luZGV4IDwgdGhpcy5fY2h1bmtzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgY2h1bmsgPSB0aGlzLl9jaHVua3NbY2h1bmtJbmRleF07XG4gICAgICAgICAgICBvZmZzZXQgPSAwO1xuICAgICAgICAgICAgY29sdW1uOiB3aGlsZSAob2Zmc2V0IDwgY2h1bmsubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjaHVua1tvZmZzZXRdO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDUjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIExGOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gNDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHJvdztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjaHVua0J5dGVzUmVhZCArPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgY2h1bmtJbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZSAhPT0gNCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgYnVmZmVyIGNvbnRhaW5zIHRoZSB0d28gQ1JMRiBhdCB0aGUgZW5kLiBTbyB3ZSB3aWxsXG4gICAgICAgIC8vIGhhdmUgdHdvIGVtcHR5IGxpbmVzIGFmdGVyIHRoZSBzcGxpdCBhdCB0aGUgZW5kIGFzIHdlbGwuXG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuX3JlYWQoY2h1bmtCeXRlc1JlYWQgKyBvZmZzZXQpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwKCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLnRvU3RyaW5nKGJ1ZmZlciwgJ2FzY2lpJykuc3BsaXQoQ1JMRik7XG4gICAgICAgIGlmIChoZWFkZXJzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXJzLmxlbmd0aCAtIDI7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaGVhZGVyID0gaGVhZGVyc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gaGVhZGVyLmluZGV4T2YoJzonKTtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1lc3NhZ2UgaGVhZGVyIG11c3Qgc2VwYXJhdGUga2V5IGFuZCB2YWx1ZSB1c2luZyAnOidcXG4ke2hlYWRlcn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGhlYWRlci5zdWJzdHIoMCwgaW5kZXgpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBoZWFkZXIuc3Vic3RyKGluZGV4ICsgMSkudHJpbSgpO1xuICAgICAgICAgICAgcmVzdWx0LnNldChsb3dlckNhc2VLZXlzID8ga2V5LnRvTG93ZXJDYXNlKCkgOiBrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICB0cnlSZWFkQm9keShsZW5ndGgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3RvdGFsTGVuZ3RoIDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkKGxlbmd0aCk7XG4gICAgfVxuICAgIGdldCBudW1iZXJPZkJ5dGVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdG90YWxMZW5ndGg7XG4gICAgfVxuICAgIF9yZWFkKGJ5dGVDb3VudCkge1xuICAgICAgICBpZiAoYnl0ZUNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbXB0eUJ1ZmZlcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChieXRlQ291bnQgPiB0aGlzLl90b3RhbExlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVhZCBzbyBtYW55IGJ5dGVzIWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jaHVua3NbMF0uYnl0ZUxlbmd0aCA9PT0gYnl0ZUNvdW50KSB7XG4gICAgICAgICAgICAvLyBzdXBlciBmYXN0IHBhdGgsIHByZWNpc2VseSBmaXJzdCBjaHVuayBtdXN0IGJlIHJldHVybmVkXG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1swXTtcbiAgICAgICAgICAgIHRoaXMuX2NodW5rcy5zaGlmdCgpO1xuICAgICAgICAgICAgdGhpcy5fdG90YWxMZW5ndGggLT0gYnl0ZUNvdW50O1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXNOYXRpdmUoY2h1bmspO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jaHVua3NbMF0uYnl0ZUxlbmd0aCA+IGJ5dGVDb3VudCkge1xuICAgICAgICAgICAgLy8gZmFzdCBwYXRoLCB0aGUgcmVhZGluZyBpcyBlbnRpcmVseSB3aXRoaW4gdGhlIGZpcnN0IGNodW5rXG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1swXTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuYXNOYXRpdmUoY2h1bmssIGJ5dGVDb3VudCk7XG4gICAgICAgICAgICB0aGlzLl9jaHVua3NbMF0gPSBjaHVuay5zbGljZShieXRlQ291bnQpO1xuICAgICAgICAgICAgdGhpcy5fdG90YWxMZW5ndGggLT0gYnl0ZUNvdW50O1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmFsbG9jTmF0aXZlKGJ5dGVDb3VudCk7XG4gICAgICAgIGxldCByZXN1bHRPZmZzZXQgPSAwO1xuICAgICAgICBsZXQgY2h1bmtJbmRleCA9IDA7XG4gICAgICAgIHdoaWxlIChieXRlQ291bnQgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1tjaHVua0luZGV4XTtcbiAgICAgICAgICAgIGlmIChjaHVuay5ieXRlTGVuZ3RoID4gYnl0ZUNvdW50KSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBjaHVuayB3aWxsIHN1cnZpdmVcbiAgICAgICAgICAgICAgICBjb25zdCBjaHVua1BhcnQgPSBjaHVuay5zbGljZSgwLCBieXRlQ291bnQpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5zZXQoY2h1bmtQYXJ0LCByZXN1bHRPZmZzZXQpO1xuICAgICAgICAgICAgICAgIHJlc3VsdE9mZnNldCArPSBieXRlQ291bnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2h1bmtzW2NodW5rSW5kZXhdID0gY2h1bmsuc2xpY2UoYnl0ZUNvdW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLl90b3RhbExlbmd0aCAtPSBieXRlQ291bnQ7XG4gICAgICAgICAgICAgICAgYnl0ZUNvdW50IC09IGJ5dGVDb3VudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHRoaXMgY2h1bmsgd2lsbCBiZSBlbnRpcmVseSByZWFkXG4gICAgICAgICAgICAgICAgcmVzdWx0LnNldChjaHVuaywgcmVzdWx0T2Zmc2V0KTtcbiAgICAgICAgICAgICAgICByZXN1bHRPZmZzZXQgKz0gY2h1bmsuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgICAgICB0aGlzLl9jaHVua3Muc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl90b3RhbExlbmd0aCAtPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgICAgIGJ5dGVDb3VudCAtPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VCdWZmZXIgPSBBYnN0cmFjdE1lc3NhZ2VCdWZmZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uID0gZXhwb3J0cy5Db25uZWN0aW9uT3B0aW9ucyA9IGV4cG9ydHMuTWVzc2FnZVN0cmF0ZWd5ID0gZXhwb3J0cy5DYW5jZWxsYXRpb25TdHJhdGVneSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gZXhwb3J0cy5JZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IGV4cG9ydHMuQ29ubmVjdGlvbkVycm9yID0gZXhwb3J0cy5Db25uZWN0aW9uRXJyb3JzID0gZXhwb3J0cy5Mb2dUcmFjZU5vdGlmaWNhdGlvbiA9IGV4cG9ydHMuU2V0VHJhY2VOb3RpZmljYXRpb24gPSBleHBvcnRzLlRyYWNlRm9ybWF0ID0gZXhwb3J0cy5UcmFjZVZhbHVlcyA9IGV4cG9ydHMuVHJhY2UgPSBleHBvcnRzLk51bGxMb2dnZXIgPSBleHBvcnRzLlByb2dyZXNzVHlwZSA9IGV4cG9ydHMuUHJvZ3Jlc3NUb2tlbiA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IG1lc3NhZ2VzXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlc1wiKTtcbmNvbnN0IGxpbmtlZE1hcF8xID0gcmVxdWlyZShcIi4vbGlua2VkTWFwXCIpO1xuY29uc3QgZXZlbnRzXzEgPSByZXF1aXJlKFwiLi9ldmVudHNcIik7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbnZhciBDYW5jZWxOb3RpZmljYXRpb247XG4oZnVuY3Rpb24gKENhbmNlbE5vdGlmaWNhdGlvbikge1xuICAgIENhbmNlbE5vdGlmaWNhdGlvbi50eXBlID0gbmV3IG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZSgnJC9jYW5jZWxSZXF1ZXN0Jyk7XG59KShDYW5jZWxOb3RpZmljYXRpb24gfHwgKENhbmNlbE5vdGlmaWNhdGlvbiA9IHt9KSk7XG52YXIgUHJvZ3Jlc3NUb2tlbjtcbihmdW5jdGlvbiAoUHJvZ3Jlc3NUb2tlbikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG4gICAgfVxuICAgIFByb2dyZXNzVG9rZW4uaXMgPSBpcztcbn0pKFByb2dyZXNzVG9rZW4gfHwgKGV4cG9ydHMuUHJvZ3Jlc3NUb2tlbiA9IFByb2dyZXNzVG9rZW4gPSB7fSkpO1xudmFyIFByb2dyZXNzTm90aWZpY2F0aW9uO1xuKGZ1bmN0aW9uIChQcm9ncmVzc05vdGlmaWNhdGlvbikge1xuICAgIFByb2dyZXNzTm90aWZpY2F0aW9uLnR5cGUgPSBuZXcgbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlKCckL3Byb2dyZXNzJyk7XG59KShQcm9ncmVzc05vdGlmaWNhdGlvbiB8fCAoUHJvZ3Jlc3NOb3RpZmljYXRpb24gPSB7fSkpO1xuY2xhc3MgUHJvZ3Jlc3NUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICB9XG59XG5leHBvcnRzLlByb2dyZXNzVHlwZSA9IFByb2dyZXNzVHlwZTtcbnZhciBTdGFyUmVxdWVzdEhhbmRsZXI7XG4oZnVuY3Rpb24gKFN0YXJSZXF1ZXN0SGFuZGxlcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBJcy5mdW5jKHZhbHVlKTtcbiAgICB9XG4gICAgU3RhclJlcXVlc3RIYW5kbGVyLmlzID0gaXM7XG59KShTdGFyUmVxdWVzdEhhbmRsZXIgfHwgKFN0YXJSZXF1ZXN0SGFuZGxlciA9IHt9KSk7XG5leHBvcnRzLk51bGxMb2dnZXIgPSBPYmplY3QuZnJlZXplKHtcbiAgICBlcnJvcjogKCkgPT4geyB9LFxuICAgIHdhcm46ICgpID0+IHsgfSxcbiAgICBpbmZvOiAoKSA9PiB7IH0sXG4gICAgbG9nOiAoKSA9PiB7IH1cbn0pO1xudmFyIFRyYWNlO1xuKGZ1bmN0aW9uIChUcmFjZSkge1xuICAgIFRyYWNlW1RyYWNlW1wiT2ZmXCJdID0gMF0gPSBcIk9mZlwiO1xuICAgIFRyYWNlW1RyYWNlW1wiTWVzc2FnZXNcIl0gPSAxXSA9IFwiTWVzc2FnZXNcIjtcbiAgICBUcmFjZVtUcmFjZVtcIkNvbXBhY3RcIl0gPSAyXSA9IFwiQ29tcGFjdFwiO1xuICAgIFRyYWNlW1RyYWNlW1wiVmVyYm9zZVwiXSA9IDNdID0gXCJWZXJib3NlXCI7XG59KShUcmFjZSB8fCAoZXhwb3J0cy5UcmFjZSA9IFRyYWNlID0ge30pKTtcbnZhciBUcmFjZVZhbHVlcztcbihmdW5jdGlvbiAoVHJhY2VWYWx1ZXMpIHtcbiAgICAvKipcbiAgICAgKiBUdXJuIHRyYWNpbmcgb2ZmLlxuICAgICAqL1xuICAgIFRyYWNlVmFsdWVzLk9mZiA9ICdvZmYnO1xuICAgIC8qKlxuICAgICAqIFRyYWNlIG1lc3NhZ2VzIG9ubHkuXG4gICAgICovXG4gICAgVHJhY2VWYWx1ZXMuTWVzc2FnZXMgPSAnbWVzc2FnZXMnO1xuICAgIC8qKlxuICAgICAqIENvbXBhY3QgbWVzc2FnZSB0cmFjaW5nLlxuICAgICAqL1xuICAgIFRyYWNlVmFsdWVzLkNvbXBhY3QgPSAnY29tcGFjdCc7XG4gICAgLyoqXG4gICAgICogVmVyYm9zZSBtZXNzYWdlIHRyYWNpbmcuXG4gICAgICovXG4gICAgVHJhY2VWYWx1ZXMuVmVyYm9zZSA9ICd2ZXJib3NlJztcbn0pKFRyYWNlVmFsdWVzIHx8IChleHBvcnRzLlRyYWNlVmFsdWVzID0gVHJhY2VWYWx1ZXMgPSB7fSkpO1xuKGZ1bmN0aW9uIChUcmFjZSkge1xuICAgIGZ1bmN0aW9uIGZyb21TdHJpbmcodmFsdWUpIHtcbiAgICAgICAgaWYgKCFJcy5zdHJpbmcodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gVHJhY2UuT2ZmO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSAnb2ZmJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gVHJhY2UuT2ZmO1xuICAgICAgICAgICAgY2FzZSAnbWVzc2FnZXMnOlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5NZXNzYWdlcztcbiAgICAgICAgICAgIGNhc2UgJ2NvbXBhY3QnOlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5Db21wYWN0O1xuICAgICAgICAgICAgY2FzZSAndmVyYm9zZSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFRyYWNlLlZlcmJvc2U7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5PZmY7XG4gICAgICAgIH1cbiAgICB9XG4gICAgVHJhY2UuZnJvbVN0cmluZyA9IGZyb21TdHJpbmc7XG4gICAgZnVuY3Rpb24gdG9TdHJpbmcodmFsdWUpIHtcbiAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5PZmY6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdvZmYnO1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5NZXNzYWdlczpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ21lc3NhZ2VzJztcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuQ29tcGFjdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2NvbXBhY3QnO1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5WZXJib3NlOlxuICAgICAgICAgICAgICAgIHJldHVybiAndmVyYm9zZSc7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAnb2ZmJztcbiAgICAgICAgfVxuICAgIH1cbiAgICBUcmFjZS50b1N0cmluZyA9IHRvU3RyaW5nO1xufSkoVHJhY2UgfHwgKGV4cG9ydHMuVHJhY2UgPSBUcmFjZSA9IHt9KSk7XG52YXIgVHJhY2VGb3JtYXQ7XG4oZnVuY3Rpb24gKFRyYWNlRm9ybWF0KSB7XG4gICAgVHJhY2VGb3JtYXRbXCJUZXh0XCJdID0gXCJ0ZXh0XCI7XG4gICAgVHJhY2VGb3JtYXRbXCJKU09OXCJdID0gXCJqc29uXCI7XG59KShUcmFjZUZvcm1hdCB8fCAoZXhwb3J0cy5UcmFjZUZvcm1hdCA9IFRyYWNlRm9ybWF0ID0ge30pKTtcbihmdW5jdGlvbiAoVHJhY2VGb3JtYXQpIHtcbiAgICBmdW5jdGlvbiBmcm9tU3RyaW5nKHZhbHVlKSB7XG4gICAgICAgIGlmICghSXMuc3RyaW5nKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIFRyYWNlRm9ybWF0LlRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAodmFsdWUgPT09ICdqc29uJykge1xuICAgICAgICAgICAgcmV0dXJuIFRyYWNlRm9ybWF0LkpTT047XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gVHJhY2VGb3JtYXQuVGV4dDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBUcmFjZUZvcm1hdC5mcm9tU3RyaW5nID0gZnJvbVN0cmluZztcbn0pKFRyYWNlRm9ybWF0IHx8IChleHBvcnRzLlRyYWNlRm9ybWF0ID0gVHJhY2VGb3JtYXQgPSB7fSkpO1xudmFyIFNldFRyYWNlTm90aWZpY2F0aW9uO1xuKGZ1bmN0aW9uIChTZXRUcmFjZU5vdGlmaWNhdGlvbikge1xuICAgIFNldFRyYWNlTm90aWZpY2F0aW9uLnR5cGUgPSBuZXcgbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlKCckL3NldFRyYWNlJyk7XG59KShTZXRUcmFjZU5vdGlmaWNhdGlvbiB8fCAoZXhwb3J0cy5TZXRUcmFjZU5vdGlmaWNhdGlvbiA9IFNldFRyYWNlTm90aWZpY2F0aW9uID0ge30pKTtcbnZhciBMb2dUcmFjZU5vdGlmaWNhdGlvbjtcbihmdW5jdGlvbiAoTG9nVHJhY2VOb3RpZmljYXRpb24pIHtcbiAgICBMb2dUcmFjZU5vdGlmaWNhdGlvbi50eXBlID0gbmV3IG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZSgnJC9sb2dUcmFjZScpO1xufSkoTG9nVHJhY2VOb3RpZmljYXRpb24gfHwgKGV4cG9ydHMuTG9nVHJhY2VOb3RpZmljYXRpb24gPSBMb2dUcmFjZU5vdGlmaWNhdGlvbiA9IHt9KSk7XG52YXIgQ29ubmVjdGlvbkVycm9ycztcbihmdW5jdGlvbiAoQ29ubmVjdGlvbkVycm9ycykge1xuICAgIC8qKlxuICAgICAqIFRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZC5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uRXJyb3JzW0Nvbm5lY3Rpb25FcnJvcnNbXCJDbG9zZWRcIl0gPSAxXSA9IFwiQ2xvc2VkXCI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gZ290IGRpc3Bvc2VkLlxuICAgICAqL1xuICAgIENvbm5lY3Rpb25FcnJvcnNbQ29ubmVjdGlvbkVycm9yc1tcIkRpc3Bvc2VkXCJdID0gMl0gPSBcIkRpc3Bvc2VkXCI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBpbiBsaXN0ZW5pbmcgbW9kZS5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uRXJyb3JzW0Nvbm5lY3Rpb25FcnJvcnNbXCJBbHJlYWR5TGlzdGVuaW5nXCJdID0gM10gPSBcIkFscmVhZHlMaXN0ZW5pbmdcIjtcbn0pKENvbm5lY3Rpb25FcnJvcnMgfHwgKGV4cG9ydHMuQ29ubmVjdGlvbkVycm9ycyA9IENvbm5lY3Rpb25FcnJvcnMgPSB7fSkpO1xuY2xhc3MgQ29ubmVjdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNvZGUsIG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBDb25uZWN0aW9uRXJyb3IucHJvdG90eXBlKTtcbiAgICB9XG59XG5leHBvcnRzLkNvbm5lY3Rpb25FcnJvciA9IENvbm5lY3Rpb25FcnJvcjtcbnZhciBDb25uZWN0aW9uU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENvbm5lY3Rpb25TdHJhdGVneSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNhbmNlbFVuZGlzcGF0Y2hlZCk7XG4gICAgfVxuICAgIENvbm5lY3Rpb25TdHJhdGVneS5pcyA9IGlzO1xufSkoQ29ubmVjdGlvblN0cmF0ZWd5IHx8IChleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IENvbm5lY3Rpb25TdHJhdGVneSA9IHt9KSk7XG52YXIgSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5O1xuKGZ1bmN0aW9uIChJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiAoY2FuZGlkYXRlLmtpbmQgPT09IHVuZGVmaW5lZCB8fCBjYW5kaWRhdGUua2luZCA9PT0gJ2lkJykgJiYgSXMuZnVuYyhjYW5kaWRhdGUuY3JlYXRlQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UpICYmIChjYW5kaWRhdGUuZGlzcG9zZSA9PT0gdW5kZWZpbmVkIHx8IElzLmZ1bmMoY2FuZGlkYXRlLmRpc3Bvc2UpKTtcbiAgICB9XG4gICAgSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzID0gaXM7XG59KShJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgfHwgKGV4cG9ydHMuSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0ge30pKTtcbnZhciBSZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneTtcbihmdW5jdGlvbiAoUmVxdWVzdENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBjYW5kaWRhdGUua2luZCA9PT0gJ3JlcXVlc3QnICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKSAmJiAoY2FuZGlkYXRlLmRpc3Bvc2UgPT09IHVuZGVmaW5lZCB8fCBJcy5mdW5jKGNhbmRpZGF0ZS5kaXNwb3NlKSk7XG4gICAgfVxuICAgIFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzID0gaXM7XG59KShSZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSB8fCAoZXhwb3J0cy5SZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0ge30pKTtcbnZhciBDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5O1xuKGZ1bmN0aW9uIChDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5NZXNzYWdlID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKF8pIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgY2FuY2VsbGF0aW9uXzEuQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UoKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kuaXModmFsdWUpIHx8IFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKHZhbHVlKTtcbiAgICB9XG4gICAgQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5pcyA9IGlzO1xufSkoQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSB8fCAoZXhwb3J0cy5DYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IHt9KSk7XG52YXIgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENhbmNlbGxhdGlvblNlbmRlclN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kuTWVzc2FnZSA9IE9iamVjdC5mcmVlemUoe1xuICAgICAgICBzZW5kQ2FuY2VsbGF0aW9uKGNvbm4sIGlkKSB7XG4gICAgICAgICAgICByZXR1cm4gY29ubi5zZW5kTm90aWZpY2F0aW9uKENhbmNlbE5vdGlmaWNhdGlvbi50eXBlLCB7IGlkIH0pO1xuICAgICAgICB9LFxuICAgICAgICBjbGVhbnVwKF8pIHsgfVxuICAgIH0pO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLnNlbmRDYW5jZWxsYXRpb24pICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNsZWFudXApO1xuICAgIH1cbiAgICBDYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneS5pcyA9IGlzO1xufSkoQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgfHwgKGV4cG9ydHMuQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgPSBDYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneSA9IHt9KSk7XG52YXIgQ2FuY2VsbGF0aW9uU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENhbmNlbGxhdGlvblN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uU3RyYXRlZ3kuTWVzc2FnZSA9IE9iamVjdC5mcmVlemUoe1xuICAgICAgICByZWNlaXZlcjogQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5NZXNzYWdlLFxuICAgICAgICBzZW5kZXI6IENhbmNlbGxhdGlvblNlbmRlclN0cmF0ZWd5Lk1lc3NhZ2VcbiAgICB9KTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKGNhbmRpZGF0ZS5yZWNlaXZlcikgJiYgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kuaXMoY2FuZGlkYXRlLnNlbmRlcik7XG4gICAgfVxuICAgIENhbmNlbGxhdGlvblN0cmF0ZWd5LmlzID0gaXM7XG59KShDYW5jZWxsYXRpb25TdHJhdGVneSB8fCAoZXhwb3J0cy5DYW5jZWxsYXRpb25TdHJhdGVneSA9IENhbmNlbGxhdGlvblN0cmF0ZWd5ID0ge30pKTtcbnZhciBNZXNzYWdlU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKE1lc3NhZ2VTdHJhdGVneSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLmhhbmRsZU1lc3NhZ2UpO1xuICAgIH1cbiAgICBNZXNzYWdlU3RyYXRlZ3kuaXMgPSBpcztcbn0pKE1lc3NhZ2VTdHJhdGVneSB8fCAoZXhwb3J0cy5NZXNzYWdlU3RyYXRlZ3kgPSBNZXNzYWdlU3RyYXRlZ3kgPSB7fSkpO1xudmFyIENvbm5lY3Rpb25PcHRpb25zO1xuKGZ1bmN0aW9uIChDb25uZWN0aW9uT3B0aW9ucykge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIChDYW5jZWxsYXRpb25TdHJhdGVneS5pcyhjYW5kaWRhdGUuY2FuY2VsbGF0aW9uU3RyYXRlZ3kpIHx8IENvbm5lY3Rpb25TdHJhdGVneS5pcyhjYW5kaWRhdGUuY29ubmVjdGlvblN0cmF0ZWd5KSB8fCBNZXNzYWdlU3RyYXRlZ3kuaXMoY2FuZGlkYXRlLm1lc3NhZ2VTdHJhdGVneSkpO1xuICAgIH1cbiAgICBDb25uZWN0aW9uT3B0aW9ucy5pcyA9IGlzO1xufSkoQ29ubmVjdGlvbk9wdGlvbnMgfHwgKGV4cG9ydHMuQ29ubmVjdGlvbk9wdGlvbnMgPSBDb25uZWN0aW9uT3B0aW9ucyA9IHt9KSk7XG52YXIgQ29ubmVjdGlvblN0YXRlO1xuKGZ1bmN0aW9uIChDb25uZWN0aW9uU3RhdGUpIHtcbiAgICBDb25uZWN0aW9uU3RhdGVbQ29ubmVjdGlvblN0YXRlW1wiTmV3XCJdID0gMV0gPSBcIk5ld1wiO1xuICAgIENvbm5lY3Rpb25TdGF0ZVtDb25uZWN0aW9uU3RhdGVbXCJMaXN0ZW5pbmdcIl0gPSAyXSA9IFwiTGlzdGVuaW5nXCI7XG4gICAgQ29ubmVjdGlvblN0YXRlW0Nvbm5lY3Rpb25TdGF0ZVtcIkNsb3NlZFwiXSA9IDNdID0gXCJDbG9zZWRcIjtcbiAgICBDb25uZWN0aW9uU3RhdGVbQ29ubmVjdGlvblN0YXRlW1wiRGlzcG9zZWRcIl0gPSA0XSA9IFwiRGlzcG9zZWRcIjtcbn0pKENvbm5lY3Rpb25TdGF0ZSB8fCAoQ29ubmVjdGlvblN0YXRlID0ge30pKTtcbmZ1bmN0aW9uIGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uKG1lc3NhZ2VSZWFkZXIsIG1lc3NhZ2VXcml0ZXIsIF9sb2dnZXIsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBsb2dnZXIgPSBfbG9nZ2VyICE9PSB1bmRlZmluZWQgPyBfbG9nZ2VyIDogZXhwb3J0cy5OdWxsTG9nZ2VyO1xuICAgIGxldCBzZXF1ZW5jZU51bWJlciA9IDA7XG4gICAgbGV0IG5vdGlmaWNhdGlvblNlcXVlbmNlTnVtYmVyID0gMDtcbiAgICBsZXQgdW5rbm93blJlc3BvbnNlU2VxdWVuY2VOdW1iZXIgPSAwO1xuICAgIGNvbnN0IHZlcnNpb24gPSAnMi4wJztcbiAgICBsZXQgc3RhclJlcXVlc3RIYW5kbGVyID0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlcXVlc3RIYW5kbGVycyA9IG5ldyBNYXAoKTtcbiAgICBsZXQgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgY29uc3Qgbm90aWZpY2F0aW9uSGFuZGxlcnMgPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgcHJvZ3Jlc3NIYW5kbGVycyA9IG5ldyBNYXAoKTtcbiAgICBsZXQgdGltZXI7XG4gICAgbGV0IG1lc3NhZ2VRdWV1ZSA9IG5ldyBsaW5rZWRNYXBfMS5MaW5rZWRNYXAoKTtcbiAgICBsZXQgcmVzcG9uc2VQcm9taXNlcyA9IG5ldyBNYXAoKTtcbiAgICBsZXQga25vd25DYW5jZWxlZFJlcXVlc3RzID0gbmV3IFNldCgpO1xuICAgIGxldCByZXF1ZXN0VG9rZW5zID0gbmV3IE1hcCgpO1xuICAgIGxldCB0cmFjZSA9IFRyYWNlLk9mZjtcbiAgICBsZXQgdHJhY2VGb3JtYXQgPSBUcmFjZUZvcm1hdC5UZXh0O1xuICAgIGxldCB0cmFjZXI7XG4gICAgbGV0IHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLk5ldztcbiAgICBjb25zdCBlcnJvckVtaXR0ZXIgPSBuZXcgZXZlbnRzXzEuRW1pdHRlcigpO1xuICAgIGNvbnN0IGNsb3NlRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgdW5oYW5kbGVkTm90aWZpY2F0aW9uRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgdW5oYW5kbGVkUHJvZ3Jlc3NFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICBjb25zdCBkaXNwb3NlRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgY2FuY2VsbGF0aW9uU3RyYXRlZ3kgPSAob3B0aW9ucyAmJiBvcHRpb25zLmNhbmNlbGxhdGlvblN0cmF0ZWd5KSA/IG9wdGlvbnMuY2FuY2VsbGF0aW9uU3RyYXRlZ3kgOiBDYW5jZWxsYXRpb25TdHJhdGVneS5NZXNzYWdlO1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlcXVlc3RRdWV1ZUtleShpZCkge1xuICAgICAgICBpZiAoaWQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuJ3Qgc2VuZCByZXF1ZXN0cyB3aXRoIGlkIG51bGwgc2luY2UgdGhlIHJlc3BvbnNlIGNhbid0IGJlIGNvcnJlbGF0ZWQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdyZXEtJyArIGlkLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlc3BvbnNlUXVldWVLZXkoaWQpIHtcbiAgICAgICAgaWYgKGlkID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3Jlcy11bmtub3duLScgKyAoKyt1bmtub3duUmVzcG9uc2VTZXF1ZW5jZU51bWJlcikudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAncmVzLScgKyBpZC50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZU5vdGlmaWNhdGlvblF1ZXVlS2V5KCkge1xuICAgICAgICByZXR1cm4gJ25vdC0nICsgKCsrbm90aWZpY2F0aW9uU2VxdWVuY2VOdW1iZXIpLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFkZE1lc3NhZ2VUb1F1ZXVlKHF1ZXVlLCBtZXNzYWdlKSB7XG4gICAgICAgIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXF1ZXN0KG1lc3NhZ2UpKSB7XG4gICAgICAgICAgICBxdWV1ZS5zZXQoY3JlYXRlUmVxdWVzdFF1ZXVlS2V5KG1lc3NhZ2UuaWQpLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXNwb25zZShtZXNzYWdlKSkge1xuICAgICAgICAgICAgcXVldWUuc2V0KGNyZWF0ZVJlc3BvbnNlUXVldWVLZXkobWVzc2FnZS5pZCksIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcXVldWUuc2V0KGNyZWF0ZU5vdGlmaWNhdGlvblF1ZXVlS2V5KCksIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNhbmNlbFVuZGlzcGF0Y2hlZChfbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0xpc3RlbmluZygpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlID09PSBDb25uZWN0aW9uU3RhdGUuTGlzdGVuaW5nO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0Nsb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlID09PSBDb25uZWN0aW9uU3RhdGUuQ2xvc2VkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0Rpc3Bvc2VkKCkge1xuICAgICAgICByZXR1cm4gc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5EaXNwb3NlZDtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2xvc2VIYW5kbGVyKCkge1xuICAgICAgICBpZiAoc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5OZXcgfHwgc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5MaXN0ZW5pbmcpIHtcbiAgICAgICAgICAgIHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLkNsb3NlZDtcbiAgICAgICAgICAgIGNsb3NlRW1pdHRlci5maXJlKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlIGNvbm5lY3Rpb24gaXMgZGlzcG9zZWQgZG9uJ3Qgc2VudCBjbG9zZSBldmVudHMuXG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlYWRFcnJvckhhbmRsZXIoZXJyb3IpIHtcbiAgICAgICAgZXJyb3JFbWl0dGVyLmZpcmUoW2Vycm9yLCB1bmRlZmluZWQsIHVuZGVmaW5lZF0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiB3cml0ZUVycm9ySGFuZGxlcihkYXRhKSB7XG4gICAgICAgIGVycm9yRW1pdHRlci5maXJlKGRhdGEpO1xuICAgIH1cbiAgICBtZXNzYWdlUmVhZGVyLm9uQ2xvc2UoY2xvc2VIYW5kbGVyKTtcbiAgICBtZXNzYWdlUmVhZGVyLm9uRXJyb3IocmVhZEVycm9ySGFuZGxlcik7XG4gICAgbWVzc2FnZVdyaXRlci5vbkNsb3NlKGNsb3NlSGFuZGxlcik7XG4gICAgbWVzc2FnZVdyaXRlci5vbkVycm9yKHdyaXRlRXJyb3JIYW5kbGVyKTtcbiAgICBmdW5jdGlvbiB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCkge1xuICAgICAgICBpZiAodGltZXIgfHwgbWVzc2FnZVF1ZXVlLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aW1lciA9ICgwLCByYWxfMS5kZWZhdWx0KSgpLnRpbWVyLnNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICAgICAgICB0aW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHByb2Nlc3NNZXNzYWdlUXVldWUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGhhbmRsZU1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICBpZiAobWVzc2FnZXNfMS5NZXNzYWdlLmlzUmVxdWVzdChtZXNzYWdlKSkge1xuICAgICAgICAgICAgaGFuZGxlUmVxdWVzdChtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNOb3RpZmljYXRpb24obWVzc2FnZSkpIHtcbiAgICAgICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvbihtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXNwb25zZShtZXNzYWdlKSkge1xuICAgICAgICAgICAgaGFuZGxlUmVzcG9uc2UobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBoYW5kbGVJbnZhbGlkTWVzc2FnZShtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBwcm9jZXNzTWVzc2FnZVF1ZXVlKCkge1xuICAgICAgICBpZiAobWVzc2FnZVF1ZXVlLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXNzYWdlID0gbWVzc2FnZVF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlU3RyYXRlZ3kgPSBvcHRpb25zPy5tZXNzYWdlU3RyYXRlZ3k7XG4gICAgICAgICAgICBpZiAoTWVzc2FnZVN0cmF0ZWd5LmlzKG1lc3NhZ2VTdHJhdGVneSkpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlU3RyYXRlZ3kuaGFuZGxlTWVzc2FnZShtZXNzYWdlLCBoYW5kbGVNZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGhhbmRsZU1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgY2FsbGJhY2sgPSAobWVzc2FnZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2UgaGF2ZSByZWNlaXZlZCBhIGNhbmNlbGxhdGlvbiBtZXNzYWdlLiBDaGVjayBpZiB0aGUgbWVzc2FnZSBpcyBzdGlsbCBpbiB0aGUgcXVldWVcbiAgICAgICAgICAgIC8vIGFuZCBjYW5jZWwgaXQgaWYgYWxsb3dlZCB0byBkbyBzby5cbiAgICAgICAgICAgIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNOb3RpZmljYXRpb24obWVzc2FnZSkgJiYgbWVzc2FnZS5tZXRob2QgPT09IENhbmNlbE5vdGlmaWNhdGlvbi50eXBlLm1ldGhvZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbmNlbElkID0gbWVzc2FnZS5wYXJhbXMuaWQ7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gY3JlYXRlUmVxdWVzdFF1ZXVlS2V5KGNhbmNlbElkKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0b0NhbmNlbCA9IG1lc3NhZ2VRdWV1ZS5nZXQoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZXNfMS5NZXNzYWdlLmlzUmVxdWVzdCh0b0NhbmNlbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyYXRlZ3kgPSBvcHRpb25zPy5jb25uZWN0aW9uU3RyYXRlZ3k7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gKHN0cmF0ZWd5ICYmIHN0cmF0ZWd5LmNhbmNlbFVuZGlzcGF0Y2hlZCkgPyBzdHJhdGVneS5jYW5jZWxVbmRpc3BhdGNoZWQodG9DYW5jZWwsIGNhbmNlbFVuZGlzcGF0Y2hlZCkgOiBjYW5jZWxVbmRpc3BhdGNoZWQodG9DYW5jZWwpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgJiYgKHJlc3BvbnNlLmVycm9yICE9PSB1bmRlZmluZWQgfHwgcmVzcG9uc2UucmVzdWx0ICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUXVldWUuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLmRlbGV0ZShjYW5jZWxJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5pZCA9IHRvQ2FuY2VsLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VTZW5kaW5nUmVzcG9uc2UocmVzcG9uc2UsIG1lc3NhZ2UubWV0aG9kLCBEYXRlLm5vdygpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUocmVzcG9uc2UpLmNhdGNoKCgpID0+IGxvZ2dlci5lcnJvcihgU2VuZGluZyByZXNwb25zZSBmb3IgY2FuY2VsZWQgbWVzc2FnZSBmYWlsZWQuYCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGNhbmNlbGxhdGlvblRva2VuID0gcmVxdWVzdFRva2Vucy5nZXQoY2FuY2VsSWQpO1xuICAgICAgICAgICAgICAgIC8vIFRoZSByZXF1ZXN0IGlzIGFscmVhZHkgcnVubmluZy4gQ2FuY2VsIHRoZSB0b2tlblxuICAgICAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbmNlbGxhdGlvblRva2VuLmNhbmNlbCgpO1xuICAgICAgICAgICAgICAgICAgICB0cmFjZVJlY2VpdmVkTm90aWZpY2F0aW9uKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZW1lbWJlciB0aGUgY2FuY2VsIGJ1dCBzdGlsbCBxdWV1ZSB0aGUgbWVzc2FnZSB0b1xuICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbiB1cCBzdGF0ZSBpbiBwcm9jZXNzIG1lc3NhZ2UuXG4gICAgICAgICAgICAgICAgICAgIGtub3duQ2FuY2VsZWRSZXF1ZXN0cy5hZGQoY2FuY2VsSWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFkZE1lc3NhZ2VUb1F1ZXVlKG1lc3NhZ2VRdWV1ZSwgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGZ1bmN0aW9uIGhhbmRsZVJlcXVlc3QocmVxdWVzdE1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgLy8gd2UgcmV0dXJuIGhlcmUgc2lsZW50bHkgc2luY2Ugd2UgZmlyZWQgYW4gZXZlbnQgd2hlbiB0aGVcbiAgICAgICAgICAgIC8vIGNvbm5lY3Rpb24gZ290IGRpc3Bvc2VkLlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHJlcGx5KHJlc3VsdE9yRXJyb3IsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgaWQ6IHJlcXVlc3RNZXNzYWdlLmlkXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKHJlc3VsdE9yRXJyb3IgaW5zdGFuY2VvZiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlLmVycm9yID0gcmVzdWx0T3JFcnJvci50b0pzb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVzdWx0ID0gcmVzdWx0T3JFcnJvciA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHJlc3VsdE9yRXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cmFjZVNlbmRpbmdSZXNwb25zZShtZXNzYWdlLCBtZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICBtZXNzYWdlV3JpdGVyLndyaXRlKG1lc3NhZ2UpLmNhdGNoKCgpID0+IGxvZ2dlci5lcnJvcihgU2VuZGluZyByZXNwb25zZSBmYWlsZWQuYCkpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHJlcGx5RXJyb3IoZXJyb3IsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgaWQ6IHJlcXVlc3RNZXNzYWdlLmlkLFxuICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvci50b0pzb24oKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUobWVzc2FnZSkuY2F0Y2goKCkgPT4gbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlc3BvbnNlIGZhaWxlZC5gKSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gcmVwbHlTdWNjZXNzKHJlc3VsdCwgbWV0aG9kLCBzdGFydFRpbWUpIHtcbiAgICAgICAgICAgIC8vIFRoZSBKU09OIFJQQyBkZWZpbmVzIHRoYXQgYSByZXNwb25zZSBtdXN0IGVpdGhlciBoYXZlIGEgcmVzdWx0IG9yIGFuIGVycm9yXG4gICAgICAgICAgICAvLyBTbyB3ZSBjYW4ndCB0cmVhdCB1bmRlZmluZWQgYXMgYSB2YWxpZCByZXNwb25zZSByZXN1bHQuXG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgICAgICAgICAgICBqc29ucnBjOiB2ZXJzaW9uLFxuICAgICAgICAgICAgICAgIGlkOiByZXF1ZXN0TWVzc2FnZS5pZCxcbiAgICAgICAgICAgICAgICByZXN1bHQ6IHJlc3VsdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUobWVzc2FnZSkuY2F0Y2goKCkgPT4gbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlc3BvbnNlIGZhaWxlZC5gKSk7XG4gICAgICAgIH1cbiAgICAgICAgdHJhY2VSZWNlaXZlZFJlcXVlc3QocmVxdWVzdE1lc3NhZ2UpO1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gcmVxdWVzdEhhbmRsZXJzLmdldChyZXF1ZXN0TWVzc2FnZS5tZXRob2QpO1xuICAgICAgICBsZXQgdHlwZTtcbiAgICAgICAgbGV0IHJlcXVlc3RIYW5kbGVyO1xuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgdHlwZSA9IGVsZW1lbnQudHlwZTtcbiAgICAgICAgICAgIHJlcXVlc3RIYW5kbGVyID0gZWxlbWVudC5oYW5kbGVyO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIGlmIChyZXF1ZXN0SGFuZGxlciB8fCBzdGFyUmVxdWVzdEhhbmRsZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHRva2VuS2V5ID0gcmVxdWVzdE1lc3NhZ2UuaWQgPz8gU3RyaW5nKERhdGUubm93KCkpOyAvL1xuICAgICAgICAgICAgY29uc3QgY2FuY2VsbGF0aW9uU291cmNlID0gSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKGNhbmNlbGxhdGlvblN0cmF0ZWd5LnJlY2VpdmVyKVxuICAgICAgICAgICAgICAgID8gY2FuY2VsbGF0aW9uU3RyYXRlZ3kucmVjZWl2ZXIuY3JlYXRlQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UodG9rZW5LZXkpXG4gICAgICAgICAgICAgICAgOiBjYW5jZWxsYXRpb25TdHJhdGVneS5yZWNlaXZlci5jcmVhdGVDYW5jZWxsYXRpb25Ub2tlblNvdXJjZShyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICBpZiAocmVxdWVzdE1lc3NhZ2UuaWQgIT09IG51bGwgJiYga25vd25DYW5jZWxlZFJlcXVlc3RzLmhhcyhyZXF1ZXN0TWVzc2FnZS5pZCkpIHtcbiAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25Tb3VyY2UuY2FuY2VsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVxdWVzdE1lc3NhZ2UuaWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLnNldCh0b2tlbktleSwgY2FuY2VsbGF0aW9uU291cmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IGhhbmRsZXJSZXN1bHQ7XG4gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0TWVzc2FnZS5wYXJhbXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlLm51bWJlck9mUGFyYW1zICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1zLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyAke3R5cGUubnVtYmVyT2ZQYXJhbXN9IHBhcmFtcyBidXQgcmVjZWl2ZWQgbm9uZS5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJSZXN1bHQgPSByZXF1ZXN0SGFuZGxlcihjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVxdWVzdE1lc3NhZ2UucGFyYW1zKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlLnBhcmFtZXRlclN0cnVjdHVyZXMgPT09IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseUVycm9yKG5ldyBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IobWVzc2FnZXNfMS5FcnJvckNvZGVzLkludmFsaWRQYXJhbXMsIGBSZXF1ZXN0ICR7cmVxdWVzdE1lc3NhZ2UubWV0aG9kfSBkZWZpbmVzIHBhcmFtZXRlcnMgYnkgbmFtZSBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBwb3NpdGlvbmApLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlclJlc3VsdCA9IHJlcXVlc3RIYW5kbGVyKC4uLnJlcXVlc3RNZXNzYWdlLnBhcmFtcywgY2FuY2VsbGF0aW9uU291cmNlLnRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS5wYXJhbWV0ZXJTdHJ1Y3R1cmVzID09PSBtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW52YWxpZFBhcmFtcywgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGRlZmluZXMgcGFyYW1ldGVycyBieSBwb3NpdGlvbiBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBuYW1lYCksIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gcmVxdWVzdEhhbmRsZXIocmVxdWVzdE1lc3NhZ2UucGFyYW1zLCBjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0YXJSZXF1ZXN0SGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gc3RhclJlcXVlc3RIYW5kbGVyKHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgcmVxdWVzdE1lc3NhZ2UucGFyYW1zLCBjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBwcm9taXNlID0gaGFuZGxlclJlc3VsdDtcbiAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZXJSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFRva2Vucy5kZWxldGUodG9rZW5LZXkpO1xuICAgICAgICAgICAgICAgICAgICByZXBseVN1Y2Nlc3MoaGFuZGxlclJlc3VsdCwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwcm9taXNlLnRoZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS50aGVuKChyZXN1bHRPckVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLmRlbGV0ZSh0b2tlbktleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXBseShyZXN1bHRPckVycm9yLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IoZXJyb3IsIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVycm9yICYmIElzLnN0cmluZyhlcnJvci5tZXNzYWdlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGZhaWxlZCB3aXRoIG1lc3NhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZmFpbGVkIHVuZXhwZWN0ZWRseSB3aXRob3V0IHByb3ZpZGluZyBhbnkgZGV0YWlscy5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHkoaGFuZGxlclJlc3VsdCwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHkoZXJyb3IsIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZXJyb3IgJiYgSXMuc3RyaW5nKGVycm9yLm1lc3NhZ2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGZhaWxlZCB3aXRoIG1lc3NhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZmFpbGVkIHVuZXhwZWN0ZWRseSB3aXRob3V0IHByb3ZpZGluZyBhbnkgZGV0YWlscy5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuTWV0aG9kTm90Rm91bmQsIGBVbmhhbmRsZWQgbWV0aG9kICR7cmVxdWVzdE1lc3NhZ2UubWV0aG9kfWApLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlUmVzcG9uc2UocmVzcG9uc2VNZXNzYWdlKSB7XG4gICAgICAgIGlmIChpc0Rpc3Bvc2VkKCkpIHtcbiAgICAgICAgICAgIC8vIFNlZSBoYW5kbGUgcmVxdWVzdC5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzcG9uc2VNZXNzYWdlLmlkID09PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VNZXNzYWdlLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBSZWNlaXZlZCByZXNwb25zZSBtZXNzYWdlIHdpdGhvdXQgaWQ6IEVycm9yIGlzOiBcXG4ke0pTT04uc3RyaW5naWZ5KHJlc3BvbnNlTWVzc2FnZS5lcnJvciwgdW5kZWZpbmVkLCA0KX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgUmVjZWl2ZWQgcmVzcG9uc2UgbWVzc2FnZSB3aXRob3V0IGlkLiBObyBmdXJ0aGVyIGVycm9yIGluZm9ybWF0aW9uIHByb3ZpZGVkLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gcmVzcG9uc2VNZXNzYWdlLmlkO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VQcm9taXNlID0gcmVzcG9uc2VQcm9taXNlcy5nZXQoa2V5KTtcbiAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWRSZXNwb25zZShyZXNwb25zZU1lc3NhZ2UsIHJlc3BvbnNlUHJvbWlzZSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VQcm9taXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2VzLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZU1lc3NhZ2UuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gcmVzcG9uc2VNZXNzYWdlLmVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlLnJlamVjdChuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKGVycm9yLmNvZGUsIGVycm9yLm1lc3NhZ2UsIGVycm9yLmRhdGEpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXNwb25zZU1lc3NhZ2UucmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlTWVzc2FnZS5yZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgbmV2ZXIgaGFwcGVuLicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IubWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBSZXNwb25zZSBoYW5kbGVyICcke3Jlc3BvbnNlUHJvbWlzZS5tZXRob2R9JyBmYWlsZWQgd2l0aCBtZXNzYWdlOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYFJlc3BvbnNlIGhhbmRsZXIgJyR7cmVzcG9uc2VQcm9taXNlLm1ldGhvZH0nIGZhaWxlZCB1bmV4cGVjdGVkbHkuYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlTm90aWZpY2F0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgLy8gU2VlIGhhbmRsZSByZXF1ZXN0LlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0eXBlID0gdW5kZWZpbmVkO1xuICAgICAgICBsZXQgbm90aWZpY2F0aW9uSGFuZGxlcjtcbiAgICAgICAgaWYgKG1lc3NhZ2UubWV0aG9kID09PSBDYW5jZWxOb3RpZmljYXRpb24udHlwZS5tZXRob2QpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhbmNlbElkID0gbWVzc2FnZS5wYXJhbXMuaWQ7XG4gICAgICAgICAgICBrbm93bkNhbmNlbGVkUmVxdWVzdHMuZGVsZXRlKGNhbmNlbElkKTtcbiAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWROb3RpZmljYXRpb24obWVzc2FnZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gbm90aWZpY2F0aW9uSGFuZGxlcnMuZ2V0KG1lc3NhZ2UubWV0aG9kKTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uSGFuZGxlciA9IGVsZW1lbnQuaGFuZGxlcjtcbiAgICAgICAgICAgICAgICB0eXBlID0gZWxlbWVudC50eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChub3RpZmljYXRpb25IYW5kbGVyIHx8IHN0YXJOb3RpZmljYXRpb25IYW5kbGVyKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWROb3RpZmljYXRpb24obWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgaWYgKG5vdGlmaWNhdGlvbkhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UucGFyYW1zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5udW1iZXJPZlBhcmFtcyAhPT0gMCAmJiB0eXBlLnBhcmFtZXRlclN0cnVjdHVyZXMgIT09IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBOb3RpZmljYXRpb24gJHttZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyAke3R5cGUubnVtYmVyT2ZQYXJhbXN9IHBhcmFtcyBidXQgcmVjZWl2ZWQgbm9uZS5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShtZXNzYWdlLnBhcmFtcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGFyZSBKU09OLVJQQyBsaWJyYXJpZXMgdGhhdCBzZW5kIHByb2dyZXNzIG1lc3NhZ2UgYXMgcG9zaXRpb25hbCBwYXJhbXMgYWx0aG91Z2hcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpZmllZCBhcyBuYW1lZC4gU28gY29udmVydCB0aGVtIGlmIHRoaXMgaXMgdGhlIGNhc2UuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBtZXNzYWdlLnBhcmFtcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLm1ldGhvZCA9PT0gUHJvZ3Jlc3NOb3RpZmljYXRpb24udHlwZS5tZXRob2QgJiYgcGFyYW1zLmxlbmd0aCA9PT0gMiAmJiBQcm9ncmVzc1Rva2VuLmlzKHBhcmFtc1swXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKHsgdG9rZW46IHBhcmFtc1swXSwgdmFsdWU6IHBhcmFtc1sxXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUucGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBOb3RpZmljYXRpb24gJHttZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyBwYXJhbWV0ZXJzIGJ5IG5hbWUgYnV0IHJlY2VpdmVkIHBhcmFtZXRlcnMgYnkgcG9zaXRpb25gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5udW1iZXJPZlBhcmFtcyAhPT0gbWVzc2FnZS5wYXJhbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYE5vdGlmaWNhdGlvbiAke21lc3NhZ2UubWV0aG9kfSBkZWZpbmVzICR7dHlwZS5udW1iZXJPZlBhcmFtc30gcGFyYW1zIGJ1dCByZWNlaXZlZCAke3BhcmFtcy5sZW5ndGh9IGFyZ3VtZW50c2ApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXIoLi4ucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS5wYXJhbWV0ZXJTdHJ1Y3R1cmVzID09PSBtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgTm90aWZpY2F0aW9uICR7bWVzc2FnZS5tZXRob2R9IGRlZmluZXMgcGFyYW1ldGVycyBieSBwb3NpdGlvbiBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBuYW1lYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKG1lc3NhZ2UucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGFyTm90aWZpY2F0aW9uSGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICBzdGFyTm90aWZpY2F0aW9uSGFuZGxlcihtZXNzYWdlLm1ldGhvZCwgbWVzc2FnZS5wYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvci5tZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgTm90aWZpY2F0aW9uIGhhbmRsZXIgJyR7bWVzc2FnZS5tZXRob2R9JyBmYWlsZWQgd2l0aCBtZXNzYWdlOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYE5vdGlmaWNhdGlvbiBoYW5kbGVyICcke21lc3NhZ2UubWV0aG9kfScgZmFpbGVkIHVuZXhwZWN0ZWRseS5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1bmhhbmRsZWROb3RpZmljYXRpb25FbWl0dGVyLmZpcmUobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlSW52YWxpZE1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignUmVjZWl2ZWQgZW1wdHkgbWVzc2FnZS4nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsb2dnZXIuZXJyb3IoYFJlY2VpdmVkIG1lc3NhZ2Ugd2hpY2ggaXMgbmVpdGhlciBhIHJlc3BvbnNlIG5vciBhIG5vdGlmaWNhdGlvbiBtZXNzYWdlOlxcbiR7SlNPTi5zdHJpbmdpZnkobWVzc2FnZSwgbnVsbCwgNCl9YCk7XG4gICAgICAgIC8vIFRlc3Qgd2hldGhlciB3ZSBmaW5kIGFuIGlkIHRvIHJlamVjdCB0aGUgcHJvbWlzZVxuICAgICAgICBjb25zdCByZXNwb25zZU1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICBpZiAoSXMuc3RyaW5nKHJlc3BvbnNlTWVzc2FnZS5pZCkgfHwgSXMubnVtYmVyKHJlc3BvbnNlTWVzc2FnZS5pZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHJlc3BvbnNlTWVzc2FnZS5pZDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxlciA9IHJlc3BvbnNlUHJvbWlzZXMuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VIYW5kbGVyLnJlamVjdChuZXcgRXJyb3IoJ1RoZSByZWNlaXZlZCByZXNwb25zZSBoYXMgbmVpdGhlciBhIHJlc3VsdCBub3IgYW4gZXJyb3IgcHJvcGVydHkuJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0cmluZ2lmeVRyYWNlKHBhcmFtcykge1xuICAgICAgICBpZiAocGFyYW1zID09PSB1bmRlZmluZWQgfHwgcGFyYW1zID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAodHJhY2UpIHtcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuVmVyYm9zZTpcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGFyYW1zLCBudWxsLCA0KTtcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuQ29tcGFjdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGFyYW1zKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVNlbmRpbmdSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFjZUZvcm1hdCA9PT0gVHJhY2VGb3JtYXQuVGV4dCkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSAmJiBtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBgUGFyYW1zOiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucGFyYW1zKX1cXG5cXG5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJhY2VyLmxvZyhgU2VuZGluZyByZXF1ZXN0ICcke21lc3NhZ2UubWV0aG9kfSAtICgke21lc3NhZ2UuaWR9KScuYCwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb2dMU1BNZXNzYWdlKCdzZW5kLXJlcXVlc3QnLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVNlbmRpbmdOb3RpZmljYXRpb24obWVzc2FnZSkge1xuICAgICAgICBpZiAodHJhY2UgPT09IFRyYWNlLk9mZiB8fCAhdHJhY2VyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYWNlRm9ybWF0ID09PSBUcmFjZUZvcm1hdC5UZXh0KSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdCkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0gYFBhcmFtczogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLnBhcmFtcyl9XFxuXFxuYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSAnTm8gcGFyYW1ldGVycyBwcm92aWRlZC5cXG5cXG4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFNlbmRpbmcgbm90aWZpY2F0aW9uICcke21lc3NhZ2UubWV0aG9kfScuYCwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb2dMU1BNZXNzYWdlKCdzZW5kLW5vdGlmaWNhdGlvbicsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhY2VGb3JtYXQgPT09IFRyYWNlRm9ybWF0LlRleHQpIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZXJyb3IgJiYgbWVzc2FnZS5lcnJvci5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgRXJyb3IgZGF0YTogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLmVycm9yLmRhdGEpfVxcblxcbmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgUmVzdWx0OiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucmVzdWx0KX1cXG5cXG5gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UuZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9ICdObyByZXN1bHQgcmV0dXJuZWQuXFxuXFxuJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFNlbmRpbmcgcmVzcG9uc2UgJyR7bWV0aG9kfSAtICgke21lc3NhZ2UuaWR9KScuIFByb2Nlc3NpbmcgcmVxdWVzdCB0b29rICR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1tc2AsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgnc2VuZC1yZXNwb25zZScsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYWNlUmVjZWl2ZWRSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFjZUZvcm1hdCA9PT0gVHJhY2VGb3JtYXQuVGV4dCkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSAmJiBtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBgUGFyYW1zOiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucGFyYW1zKX1cXG5cXG5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJhY2VyLmxvZyhgUmVjZWl2ZWQgcmVxdWVzdCAnJHttZXNzYWdlLm1ldGhvZH0gLSAoJHttZXNzYWdlLmlkfSknLmAsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1yZXF1ZXN0JywgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdHJhY2VSZWNlaXZlZE5vdGlmaWNhdGlvbihtZXNzYWdlKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIgfHwgbWVzc2FnZS5tZXRob2QgPT09IExvZ1RyYWNlTm90aWZpY2F0aW9uLnR5cGUubWV0aG9kKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYWNlRm9ybWF0ID09PSBUcmFjZUZvcm1hdC5UZXh0KSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdCkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0gYFBhcmFtczogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLnBhcmFtcyl9XFxuXFxuYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSAnTm8gcGFyYW1ldGVycyBwcm92aWRlZC5cXG5cXG4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFJlY2VpdmVkIG5vdGlmaWNhdGlvbiAnJHttZXNzYWdlLm1ldGhvZH0nLmAsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1ub3RpZmljYXRpb24nLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVJlY2VpdmVkUmVzcG9uc2UobWVzc2FnZSwgcmVzcG9uc2VQcm9taXNlKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhY2VGb3JtYXQgPT09IFRyYWNlRm9ybWF0LlRleHQpIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZXJyb3IgJiYgbWVzc2FnZS5lcnJvci5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgRXJyb3IgZGF0YTogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLmVycm9yLmRhdGEpfVxcblxcbmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgUmVzdWx0OiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucmVzdWx0KX1cXG5cXG5gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UuZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9ICdObyByZXN1bHQgcmV0dXJuZWQuXFxuXFxuJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXNwb25zZVByb21pc2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IG1lc3NhZ2UuZXJyb3IgPyBgIFJlcXVlc3QgZmFpbGVkOiAke21lc3NhZ2UuZXJyb3IubWVzc2FnZX0gKCR7bWVzc2FnZS5lcnJvci5jb2RlfSkuYCA6ICcnO1xuICAgICAgICAgICAgICAgIHRyYWNlci5sb2coYFJlY2VpdmVkIHJlc3BvbnNlICcke3Jlc3BvbnNlUHJvbWlzZS5tZXRob2R9IC0gKCR7bWVzc2FnZS5pZH0pJyBpbiAke0RhdGUubm93KCkgLSByZXNwb25zZVByb21pc2UudGltZXJTdGFydH1tcy4ke2Vycm9yfWAsIGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJhY2VyLmxvZyhgUmVjZWl2ZWQgcmVzcG9uc2UgJHttZXNzYWdlLmlkfSB3aXRob3V0IGFjdGl2ZSByZXNwb25zZSBwcm9taXNlLmAsIGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1yZXNwb25zZScsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGxvZ0xTUE1lc3NhZ2UodHlwZSwgbWVzc2FnZSkge1xuICAgICAgICBpZiAoIXRyYWNlciB8fCB0cmFjZSA9PT0gVHJhY2UuT2ZmKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbHNwTWVzc2FnZSA9IHtcbiAgICAgICAgICAgIGlzTFNQTWVzc2FnZTogdHJ1ZSxcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpXG4gICAgICAgIH07XG4gICAgICAgIHRyYWNlci5sb2cobHNwTWVzc2FnZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRocm93SWZDbG9zZWRPckRpc3Bvc2VkKCkge1xuICAgICAgICBpZiAoaXNDbG9zZWQoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IENvbm5lY3Rpb25FcnJvcihDb25uZWN0aW9uRXJyb3JzLkNsb3NlZCwgJ0Nvbm5lY3Rpb24gaXMgY2xvc2VkLicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0Rpc3Bvc2VkKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb25uZWN0aW9uRXJyb3IoQ29ubmVjdGlvbkVycm9ycy5EaXNwb3NlZCwgJ0Nvbm5lY3Rpb24gaXMgZGlzcG9zZWQuJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdGhyb3dJZkxpc3RlbmluZygpIHtcbiAgICAgICAgaWYgKGlzTGlzdGVuaW5nKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb25uZWN0aW9uRXJyb3IoQ29ubmVjdGlvbkVycm9ycy5BbHJlYWR5TGlzdGVuaW5nLCAnQ29ubmVjdGlvbiBpcyBhbHJlYWR5IGxpc3RlbmluZycpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRocm93SWZOb3RMaXN0ZW5pbmcoKSB7XG4gICAgICAgIGlmICghaXNMaXN0ZW5pbmcoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYWxsIGxpc3RlbigpIGZpcnN0LicpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVuZGVmaW5lZFRvTnVsbChwYXJhbSkge1xuICAgICAgICBpZiAocGFyYW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyYW07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gbnVsbFRvVW5kZWZpbmVkKHBhcmFtKSB7XG4gICAgICAgIGlmIChwYXJhbSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJhbTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBpc05hbWVkUGFyYW0ocGFyYW0pIHtcbiAgICAgICAgcmV0dXJuIHBhcmFtICE9PSB1bmRlZmluZWQgJiYgcGFyYW0gIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkocGFyYW0pICYmIHR5cGVvZiBwYXJhbSA9PT0gJ29iamVjdCc7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXB1dGVTaW5nbGVQYXJhbShwYXJhbWV0ZXJTdHJ1Y3R1cmVzLCBwYXJhbSkge1xuICAgICAgICBzd2l0Y2ggKHBhcmFtZXRlclN0cnVjdHVyZXMpIHtcbiAgICAgICAgICAgIGNhc2UgbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG86XG4gICAgICAgICAgICAgICAgaWYgKGlzTmFtZWRQYXJhbShwYXJhbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxUb1VuZGVmaW5lZChwYXJhbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3VuZGVmaW5lZFRvTnVsbChwYXJhbSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZTpcbiAgICAgICAgICAgICAgICBpZiAoIWlzTmFtZWRQYXJhbShwYXJhbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWNlaXZlZCBwYXJhbWV0ZXJzIGJ5IG5hbWUgYnV0IHBhcmFtIGlzIG5vdCBhbiBvYmplY3QgbGl0ZXJhbC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGxUb1VuZGVmaW5lZChwYXJhbSk7XG4gICAgICAgICAgICBjYXNlIG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieVBvc2l0aW9uOlxuICAgICAgICAgICAgICAgIHJldHVybiBbdW5kZWZpbmVkVG9OdWxsKHBhcmFtKV07XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBwYXJhbWV0ZXIgc3RydWN0dXJlICR7cGFyYW1ldGVyU3RydWN0dXJlcy50b1N0cmluZygpfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXB1dGVNZXNzYWdlUGFyYW1zKHR5cGUsIHBhcmFtcykge1xuICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICBjb25zdCBudW1iZXJPZlBhcmFtcyA9IHR5cGUubnVtYmVyT2ZQYXJhbXM7XG4gICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gY29tcHV0ZVNpbmdsZVBhcmFtKHR5cGUucGFyYW1ldGVyU3RydWN0dXJlcywgcGFyYW1zWzBdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoICYmIGkgPCBudW1iZXJPZlBhcmFtczsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHVuZGVmaW5lZFRvTnVsbChwYXJhbXNbaV0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPCBudW1iZXJPZlBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gcGFyYW1zLmxlbmd0aDsgaSA8IG51bWJlck9mUGFyYW1zOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB7XG4gICAgICAgIHNlbmROb3RpZmljYXRpb246ICh0eXBlLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlUGFyYW1zO1xuICAgICAgICAgICAgaWYgKElzLnN0cmluZyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICAgIGxldCBwYXJhbVN0YXJ0ID0gMDtcbiAgICAgICAgICAgICAgICBsZXQgcGFyYW1ldGVyU3RydWN0dXJlcyA9IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvO1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuaXMoZmlyc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtU3RhcnQgPSAxO1xuICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gZmlyc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBwYXJhbUVuZCA9IGFyZ3MubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gcGFyYW1FbmQgLSBwYXJhbVN0YXJ0O1xuICAgICAgICAgICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zID0gY29tcHV0ZVNpbmdsZVBhcmFtKHBhcmFtZXRlclN0cnVjdHVyZXMsIGFyZ3NbcGFyYW1TdGFydF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjZWl2ZWQgJHtudW1iZXJPZlBhcmFtc30gcGFyYW1ldGVycyBmb3IgJ2J5IE5hbWUnIG5vdGlmaWNhdGlvbiBwYXJhbWV0ZXIgc3RydWN0dXJlLmApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IGFyZ3Muc2xpY2UocGFyYW1TdGFydCwgcGFyYW1FbmQpLm1hcCh2YWx1ZSA9PiB1bmRlZmluZWRUb051bGwodmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IGFyZ3M7XG4gICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZS5tZXRob2Q7XG4gICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IGNvbXB1dGVNZXNzYWdlUGFyYW1zKHR5cGUsIHBhcmFtcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBub3RpZmljYXRpb25NZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBtZXNzYWdlUGFyYW1zXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdHJhY2VTZW5kaW5nTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbk1lc3NhZ2UpO1xuICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2VXcml0ZXIud3JpdGUobm90aWZpY2F0aW9uTWVzc2FnZSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBTZW5kaW5nIG5vdGlmaWNhdGlvbiBmYWlsZWQuYCk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25Ob3RpZmljYXRpb246ICh0eXBlLCBoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGlmIChJcy5mdW5jKHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB0eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaGFuZGxlcikge1xuICAgICAgICAgICAgICAgIGlmIChJcy5zdHJpbmcodHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZTtcbiAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uSGFuZGxlcnMuc2V0KHR5cGUsIHsgdHlwZTogdW5kZWZpbmVkLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZS5tZXRob2Q7XG4gICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXJzLnNldCh0eXBlLm1ldGhvZCwgeyB0eXBlLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXJzLmRlbGV0ZShtZXRob2QpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBvblByb2dyZXNzOiAoX3R5cGUsIHRva2VuLCBoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgICBpZiAocHJvZ3Jlc3NIYW5kbGVycy5oYXModG9rZW4pKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm9ncmVzcyBoYW5kbGVyIGZvciB0b2tlbiAke3Rva2VufSBhbHJlYWR5IHJlZ2lzdGVyZWRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByb2dyZXNzSGFuZGxlcnMuc2V0KHRva2VuLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc0hhbmRsZXJzLmRlbGV0ZSh0b2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgc2VuZFByb2dyZXNzOiAoX3R5cGUsIHRva2VuLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGF3YWl0IGJ1dCBzaW1wbGUgcmV0dXJuIHRvIGVuc3VyZSB0aGF0IHdlIGRvbid0IGhhdmUgYW5vdGhlclxuICAgICAgICAgICAgLy8gYXN5bmMgc2NoZWR1bGluZy4gT3RoZXJ3aXNlIG9uZSBzZW5kIGNvdWxkIG92ZXJ0YWtlIGFub3RoZXIgc2VuZC5cbiAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLnNlbmROb3RpZmljYXRpb24oUHJvZ3Jlc3NOb3RpZmljYXRpb24udHlwZSwgeyB0b2tlbiwgdmFsdWUgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uVW5oYW5kbGVkUHJvZ3Jlc3M6IHVuaGFuZGxlZFByb2dyZXNzRW1pdHRlci5ldmVudCxcbiAgICAgICAgc2VuZFJlcXVlc3Q6ICh0eXBlLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgdGhyb3dJZk5vdExpc3RlbmluZygpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlUGFyYW1zO1xuICAgICAgICAgICAgbGV0IHRva2VuID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKElzLnN0cmluZyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3QgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgbGV0IHBhcmFtU3RhcnQgPSAwO1xuICAgICAgICAgICAgICAgIGxldCBwYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG87XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5pcyhmaXJzdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1TdGFydCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlclN0cnVjdHVyZXMgPSBmaXJzdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHBhcmFtRW5kID0gYXJncy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuLmlzKGxhc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtRW5kID0gcGFyYW1FbmQgLSAxO1xuICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IGxhc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gcGFyYW1FbmQgLSBwYXJhbVN0YXJ0O1xuICAgICAgICAgICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zID0gY29tcHV0ZVNpbmdsZVBhcmFtKHBhcmFtZXRlclN0cnVjdHVyZXMsIGFyZ3NbcGFyYW1TdGFydF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjZWl2ZWQgJHtudW1iZXJPZlBhcmFtc30gcGFyYW1ldGVycyBmb3IgJ2J5IE5hbWUnIHJlcXVlc3QgcGFyYW1ldGVyIHN0cnVjdHVyZS5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMgPSBhcmdzLnNsaWNlKHBhcmFtU3RhcnQsIHBhcmFtRW5kKS5tYXAodmFsdWUgPT4gdW5kZWZpbmVkVG9OdWxsKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBhcmdzO1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGUubWV0aG9kO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMgPSBjb21wdXRlTWVzc2FnZVBhcmFtcyh0eXBlLCBwYXJhbXMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gdHlwZS5udW1iZXJPZlBhcmFtcztcbiAgICAgICAgICAgICAgICB0b2tlbiA9IGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuLmlzKHBhcmFtc1tudW1iZXJPZlBhcmFtc10pID8gcGFyYW1zW251bWJlck9mUGFyYW1zXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGlkID0gc2VxdWVuY2VOdW1iZXIrKztcbiAgICAgICAgICAgIGxldCBkaXNwb3NhYmxlO1xuICAgICAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgICAgICAgZGlzcG9zYWJsZSA9IHRva2VuLm9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcCA9IGNhbmNlbGxhdGlvblN0cmF0ZWd5LnNlbmRlci5zZW5kQ2FuY2VsbGF0aW9uKGNvbm5lY3Rpb24sIGlkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhgUmVjZWl2ZWQgbm8gcHJvbWlzZSBmcm9tIGNhbmNlbGxhdGlvbiBzdHJhdGVneSB3aGVuIGNhbmNlbGxpbmcgaWQgJHtpZH1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIubG9nKGBTZW5kaW5nIGNhbmNlbGxhdGlvbiBtZXNzYWdlcyBmb3IgaWQgJHtpZH0gZmFpbGVkYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdE1lc3NhZ2UgPSB7XG4gICAgICAgICAgICAgICAganNvbnJwYzogdmVyc2lvbixcbiAgICAgICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBtZXNzYWdlUGFyYW1zXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdHJhY2VTZW5kaW5nUmVxdWVzdChyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNhbmNlbGxhdGlvblN0cmF0ZWd5LnNlbmRlci5lbmFibGVDYW5jZWxsYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25TdHJhdGVneS5zZW5kZXIuZW5hYmxlQ2FuY2VsbGF0aW9uKHJlcXVlc3RNZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZVdpdGhDbGVhbnVwID0gKHIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyKTtcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uU3RyYXRlZ3kuc2VuZGVyLmNsZWFudXAoaWQpO1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlPy5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWplY3RXaXRoQ2xlYW51cCA9IChyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChyKTtcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uU3RyYXRlZ3kuc2VuZGVyLmNsZWFudXAoaWQpO1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlPy5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZVByb21pc2UgPSB7IG1ldGhvZDogbWV0aG9kLCB0aW1lclN0YXJ0OiBEYXRlLm5vdygpLCByZXNvbHZlOiByZXNvbHZlV2l0aENsZWFudXAsIHJlamVjdDogcmVqZWN0V2l0aENsZWFudXAgfTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2VzLnNldChpZCwgcmVzcG9uc2VQcm9taXNlKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbWVzc2FnZVdyaXRlci53cml0ZShyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAvLyBXcml0aW5nIHRoZSBtZXNzYWdlIGZhaWxlZC4gU28gd2UgbmVlZCB0byBkZWxldGUgaXQgZnJvbSB0aGUgcmVzcG9uc2UgcHJvbWlzZXMgYW5kXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlamVjdCBpdC5cbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlcy5kZWxldGUoaWQpO1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2UucmVqZWN0KG5ldyBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IobWVzc2FnZXNfMS5FcnJvckNvZGVzLk1lc3NhZ2VXcml0ZUVycm9yLCBlcnJvci5tZXNzYWdlID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIHJlYXNvbicpKTtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlcXVlc3QgZmFpbGVkLmApO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25SZXF1ZXN0OiAodHlwZSwgaGFuZGxlcikgPT4ge1xuICAgICAgICAgICAgdGhyb3dJZkNsb3NlZE9yRGlzcG9zZWQoKTtcbiAgICAgICAgICAgIGxldCBtZXRob2QgPSBudWxsO1xuICAgICAgICAgICAgaWYgKFN0YXJSZXF1ZXN0SGFuZGxlci5pcyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBzdGFyUmVxdWVzdEhhbmRsZXIgPSB0eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoSXMuc3RyaW5nKHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgbWV0aG9kID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoaGFuZGxlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RIYW5kbGVycy5zZXQodHlwZSwgeyBoYW5kbGVyOiBoYW5kbGVyLCB0eXBlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSB0eXBlLm1ldGhvZDtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEhhbmRsZXJzLnNldCh0eXBlLm1ldGhvZCwgeyB0eXBlLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SGFuZGxlcnMuZGVsZXRlKG1ldGhvZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFyUmVxdWVzdEhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBoYXNQZW5kaW5nUmVzcG9uc2U6ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZVByb21pc2VzLnNpemUgPiAwO1xuICAgICAgICB9LFxuICAgICAgICB0cmFjZTogYXN5bmMgKF92YWx1ZSwgX3RyYWNlciwgc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBsZXQgX3NlbmROb3RpZmljYXRpb24gPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBfdHJhY2VGb3JtYXQgPSBUcmFjZUZvcm1hdC5UZXh0O1xuICAgICAgICAgICAgaWYgKHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKElzLmJvb2xlYW4oc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zKSkge1xuICAgICAgICAgICAgICAgICAgICBfc2VuZE5vdGlmaWNhdGlvbiA9IHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF9zZW5kTm90aWZpY2F0aW9uID0gc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zLnNlbmROb3RpZmljYXRpb24gfHwgZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIF90cmFjZUZvcm1hdCA9IHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucy50cmFjZUZvcm1hdCB8fCBUcmFjZUZvcm1hdC5UZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlID0gX3ZhbHVlO1xuICAgICAgICAgICAgdHJhY2VGb3JtYXQgPSBfdHJhY2VGb3JtYXQ7XG4gICAgICAgICAgICBpZiAodHJhY2UgPT09IFRyYWNlLk9mZikge1xuICAgICAgICAgICAgICAgIHRyYWNlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRyYWNlciA9IF90cmFjZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoX3NlbmROb3RpZmljYXRpb24gJiYgIWlzQ2xvc2VkKCkgJiYgIWlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGNvbm5lY3Rpb24uc2VuZE5vdGlmaWNhdGlvbihTZXRUcmFjZU5vdGlmaWNhdGlvbi50eXBlLCB7IHZhbHVlOiBUcmFjZS50b1N0cmluZyhfdmFsdWUpIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBvbkVycm9yOiBlcnJvckVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIG9uQ2xvc2U6IGNsb3NlRW1pdHRlci5ldmVudCxcbiAgICAgICAgb25VbmhhbmRsZWROb3RpZmljYXRpb246IHVuaGFuZGxlZE5vdGlmaWNhdGlvbkVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIG9uRGlzcG9zZTogZGlzcG9zZUVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIGVuZDogKCkgPT4ge1xuICAgICAgICAgICAgbWVzc2FnZVdyaXRlci5lbmQoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLkRpc3Bvc2VkO1xuICAgICAgICAgICAgZGlzcG9zZUVtaXR0ZXIuZmlyZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5QZW5kaW5nUmVzcG9uc2VSZWplY3RlZCwgJ1BlbmRpbmcgcmVzcG9uc2UgcmVqZWN0ZWQgc2luY2UgY29ubmVjdGlvbiBnb3QgZGlzcG9zZWQnKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvbWlzZSBvZiByZXNwb25zZVByb21pc2VzLnZhbHVlcygpKSB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBrbm93bkNhbmNlbGVkUmVxdWVzdHMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICBtZXNzYWdlUXVldWUgPSBuZXcgbGlua2VkTWFwXzEuTGlua2VkTWFwKCk7XG4gICAgICAgICAgICAvLyBUZXN0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgaWYgKElzLmZ1bmMobWVzc2FnZVdyaXRlci5kaXNwb3NlKSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKElzLmZ1bmMobWVzc2FnZVJlYWRlci5kaXNwb3NlKSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VSZWFkZXIuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBsaXN0ZW46ICgpID0+IHtcbiAgICAgICAgICAgIHRocm93SWZDbG9zZWRPckRpc3Bvc2VkKCk7XG4gICAgICAgICAgICB0aHJvd0lmTGlzdGVuaW5nKCk7XG4gICAgICAgICAgICBzdGF0ZSA9IENvbm5lY3Rpb25TdGF0ZS5MaXN0ZW5pbmc7XG4gICAgICAgICAgICBtZXNzYWdlUmVhZGVyLmxpc3RlbihjYWxsYmFjayk7XG4gICAgICAgIH0sXG4gICAgICAgIGluc3BlY3Q6ICgpID0+IHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS5jb25zb2xlLmxvZygnaW5zcGVjdCcpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25uZWN0aW9uLm9uTm90aWZpY2F0aW9uKExvZ1RyYWNlTm90aWZpY2F0aW9uLnR5cGUsIChwYXJhbXMpID0+IHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZlcmJvc2UgPSB0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdDtcbiAgICAgICAgdHJhY2VyLmxvZyhwYXJhbXMubWVzc2FnZSwgdmVyYm9zZSA/IHBhcmFtcy52ZXJib3NlIDogdW5kZWZpbmVkKTtcbiAgICB9KTtcbiAgICBjb25uZWN0aW9uLm9uTm90aWZpY2F0aW9uKFByb2dyZXNzTm90aWZpY2F0aW9uLnR5cGUsIChwYXJhbXMpID0+IHtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IHByb2dyZXNzSGFuZGxlcnMuZ2V0KHBhcmFtcy50b2tlbik7XG4gICAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICAgICBoYW5kbGVyKHBhcmFtcy52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1bmhhbmRsZWRQcm9ncmVzc0VtaXR0ZXIuZmlyZShwYXJhbXMpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbm5lY3Rpb247XG59XG5leHBvcnRzLmNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uID0gY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb247XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vdHlwaW5ncy90aGVuYWJsZS5kLnRzXCIgLz5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUHJvZ3Jlc3NUeXBlID0gZXhwb3J0cy5Qcm9ncmVzc1Rva2VuID0gZXhwb3J0cy5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiA9IGV4cG9ydHMuTnVsbExvZ2dlciA9IGV4cG9ydHMuQ29ubmVjdGlvbk9wdGlvbnMgPSBleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IGV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlQnVmZmVyID0gZXhwb3J0cy5Xcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyID0gZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLk1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLlJlYWRhYmxlU3RyZWFtTWVzc2FnZVJlYWRlciA9IGV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlUmVhZGVyID0gZXhwb3J0cy5NZXNzYWdlUmVhZGVyID0gZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblRva2VuID0gZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IGV4cG9ydHMuRW1pdHRlciA9IGV4cG9ydHMuRXZlbnQgPSBleHBvcnRzLkRpc3Bvc2FibGUgPSBleHBvcnRzLkxSVUNhY2hlID0gZXhwb3J0cy5Ub3VjaCA9IGV4cG9ydHMuTGlua2VkTWFwID0gZXhwb3J0cy5QYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlOSA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTggPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU3ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNiA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTUgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU0ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMyA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTIgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUxID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMCA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZSA9IGV4cG9ydHMuRXJyb3JDb2RlcyA9IGV4cG9ydHMuUmVzcG9uc2VFcnJvciA9IGV4cG9ydHMuUmVxdWVzdFR5cGU5ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTggPSBleHBvcnRzLlJlcXVlc3RUeXBlNyA9IGV4cG9ydHMuUmVxdWVzdFR5cGU2ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTUgPSBleHBvcnRzLlJlcXVlc3RUeXBlNCA9IGV4cG9ydHMuUmVxdWVzdFR5cGUzID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTIgPSBleHBvcnRzLlJlcXVlc3RUeXBlMSA9IGV4cG9ydHMuUmVxdWVzdFR5cGUwID0gZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IGV4cG9ydHMuTWVzc2FnZSA9IGV4cG9ydHMuUkFMID0gdm9pZCAwO1xuZXhwb3J0cy5NZXNzYWdlU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblN0cmF0ZWd5ID0gZXhwb3J0cy5DYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IGV4cG9ydHMuQ29ubmVjdGlvbkVycm9yID0gZXhwb3J0cy5Db25uZWN0aW9uRXJyb3JzID0gZXhwb3J0cy5Mb2dUcmFjZU5vdGlmaWNhdGlvbiA9IGV4cG9ydHMuU2V0VHJhY2VOb3RpZmljYXRpb24gPSBleHBvcnRzLlRyYWNlRm9ybWF0ID0gZXhwb3J0cy5UcmFjZVZhbHVlcyA9IGV4cG9ydHMuVHJhY2UgPSB2b2lkIDA7XG5jb25zdCBtZXNzYWdlc18xID0gcmVxdWlyZShcIi4vbWVzc2FnZXNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNZXNzYWdlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk1lc3NhZ2U7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlMFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTA7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTFcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGUxOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGUyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlMjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlM1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGU0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGU1XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlNTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlNlwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTY7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTdcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGU3OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGU4XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlODsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlOVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTk7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXNwb25zZUVycm9yXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3I7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJFcnJvckNvZGVzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLkVycm9yQ29kZXM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlMFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlMDsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGUxXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGUxOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZTJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlM1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlMzsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGU0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZTVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlNlwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlNjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGU3XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU3OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZThcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTg7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlOVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlOTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlBhcmFtZXRlclN0cnVjdHVyZXNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlczsgfSB9KTtcbmNvbnN0IGxpbmtlZE1hcF8xID0gcmVxdWlyZShcIi4vbGlua2VkTWFwXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTGlua2VkTWFwXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBsaW5rZWRNYXBfMS5MaW5rZWRNYXA7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJMUlVDYWNoZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbGlua2VkTWFwXzEuTFJVQ2FjaGU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJUb3VjaFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbGlua2VkTWFwXzEuVG91Y2g7IH0gfSk7XG5jb25zdCBkaXNwb3NhYmxlXzEgPSByZXF1aXJlKFwiLi9kaXNwb3NhYmxlXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiRGlzcG9zYWJsZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZGlzcG9zYWJsZV8xLkRpc3Bvc2FibGU7IH0gfSk7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCIuL2V2ZW50c1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkV2ZW50XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBldmVudHNfMS5FdmVudDsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkVtaXR0ZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGV2ZW50c18xLkVtaXR0ZXI7IH0gfSk7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblRva2VuU291cmNlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjYW5jZWxsYXRpb25fMS5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblRva2VuXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjYW5jZWxsYXRpb25fMS5DYW5jZWxsYXRpb25Ub2tlbjsgfSB9KTtcbmNvbnN0IHNoYXJlZEFycmF5Q2FuY2VsbGF0aW9uXzEgPSByZXF1aXJlKFwiLi9zaGFyZWRBcnJheUNhbmNlbGxhdGlvblwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHNoYXJlZEFycmF5Q2FuY2VsbGF0aW9uXzEuU2hhcmVkQXJyYXlTZW5kZXJTdHJhdGVneTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlNoYXJlZEFycmF5UmVjZWl2ZXJTdHJhdGVneVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gc2hhcmVkQXJyYXlDYW5jZWxsYXRpb25fMS5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3k7IH0gfSk7XG5jb25zdCBtZXNzYWdlUmVhZGVyXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlUmVhZGVyXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTWVzc2FnZVJlYWRlclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZVJlYWRlcl8xLk1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VSZWFkZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VSZWFkZXJfMS5BYnN0cmFjdE1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VSZWFkZXJfMS5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5jb25zdCBtZXNzYWdlV3JpdGVyXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlV3JpdGVyXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTWVzc2FnZVdyaXRlclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZVdyaXRlcl8xLk1lc3NhZ2VXcml0ZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VXcml0ZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VXcml0ZXJfMS5BYnN0cmFjdE1lc3NhZ2VXcml0ZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJXcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlV3JpdGVyXzEuV3JpdGVhYmxlU3RyZWFtTWVzc2FnZVdyaXRlcjsgfSB9KTtcbmNvbnN0IG1lc3NhZ2VCdWZmZXJfMSA9IHJlcXVpcmUoXCIuL21lc3NhZ2VCdWZmZXJcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VCdWZmZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VCdWZmZXJfMS5BYnN0cmFjdE1lc3NhZ2VCdWZmZXI7IH0gfSk7XG5jb25zdCBjb25uZWN0aW9uXzEgPSByZXF1aXJlKFwiLi9jb25uZWN0aW9uXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29ubmVjdGlvblN0cmF0ZWd5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ29ubmVjdGlvblN0cmF0ZWd5OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29ubmVjdGlvbk9wdGlvbnNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5Db25uZWN0aW9uT3B0aW9uczsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk51bGxMb2dnZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5OdWxsTG9nZ2VyOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb25cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlByb2dyZXNzVG9rZW5cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5Qcm9ncmVzc1Rva2VuOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUHJvZ3Jlc3NUeXBlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuUHJvZ3Jlc3NUeXBlOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiVHJhY2VcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5UcmFjZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlRyYWNlVmFsdWVzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuVHJhY2VWYWx1ZXM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJUcmFjZUZvcm1hdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29ubmVjdGlvbl8xLlRyYWNlRm9ybWF0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiU2V0VHJhY2VOb3RpZmljYXRpb25cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5TZXRUcmFjZU5vdGlmaWNhdGlvbjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkxvZ1RyYWNlTm90aWZpY2F0aW9uXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuTG9nVHJhY2VOb3RpZmljYXRpb247IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJDb25uZWN0aW9uRXJyb3JzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ29ubmVjdGlvbkVycm9yczsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNvbm5lY3Rpb25FcnJvclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29ubmVjdGlvbl8xLkNvbm5lY3Rpb25FcnJvcjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5DYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5DYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblN0cmF0ZWd5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ2FuY2VsbGF0aW9uU3RyYXRlZ3k7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNZXNzYWdlU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5NZXNzYWdlU3RyYXRlZ3k7IH0gfSk7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbmV4cG9ydHMuUkFMID0gcmFsXzEuZGVmYXVsdDtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGFwaV8xID0gcmVxdWlyZShcIi4uL2NvbW1vbi9hcGlcIik7XG5jbGFzcyBNZXNzYWdlQnVmZmVyIGV4dGVuZHMgYXBpXzEuQWJzdHJhY3RNZXNzYWdlQnVmZmVyIHtcbiAgICBjb25zdHJ1Y3RvcihlbmNvZGluZyA9ICd1dGYtOCcpIHtcbiAgICAgICAgc3VwZXIoZW5jb2RpbmcpO1xuICAgICAgICB0aGlzLmFzY2lpRGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcignYXNjaWknKTtcbiAgICB9XG4gICAgZW1wdHlCdWZmZXIoKSB7XG4gICAgICAgIHJldHVybiBNZXNzYWdlQnVmZmVyLmVtcHR5QnVmZmVyO1xuICAgIH1cbiAgICBmcm9tU3RyaW5nKHZhbHVlLCBfZW5jb2RpbmcpIHtcbiAgICAgICAgcmV0dXJuIChuZXcgVGV4dEVuY29kZXIoKSkuZW5jb2RlKHZhbHVlKTtcbiAgICB9XG4gICAgdG9TdHJpbmcodmFsdWUsIGVuY29kaW5nKSB7XG4gICAgICAgIGlmIChlbmNvZGluZyA9PT0gJ2FzY2lpJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXNjaWlEZWNvZGVyLmRlY29kZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gKG5ldyBUZXh0RGVjb2RlcihlbmNvZGluZykpLmRlY29kZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXNOYXRpdmUoYnVmZmVyLCBsZW5ndGgpIHtcbiAgICAgICAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlci5zbGljZSgwLCBsZW5ndGgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFsbG9jTmF0aXZlKGxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTtcbiAgICB9XG59XG5NZXNzYWdlQnVmZmVyLmVtcHR5QnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMCk7XG5jbGFzcyBSZWFkYWJsZVN0cmVhbVdyYXBwZXIge1xuICAgIGNvbnN0cnVjdG9yKHNvY2tldCkge1xuICAgICAgICB0aGlzLnNvY2tldCA9IHNvY2tldDtcbiAgICAgICAgdGhpcy5fb25EYXRhID0gbmV3IGFwaV8xLkVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5fbWVzc2FnZUxpc3RlbmVyID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBibG9iID0gZXZlbnQuZGF0YTtcbiAgICAgICAgICAgIGJsb2IuYXJyYXlCdWZmZXIoKS50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkRhdGEuZmlyZShuZXcgVWludDhBcnJheShidWZmZXIpKTtcbiAgICAgICAgICAgIH0sICgpID0+IHtcbiAgICAgICAgICAgICAgICAoMCwgYXBpXzEuUkFMKSgpLmNvbnNvbGUuZXJyb3IoYENvbnZlcnRpbmcgYmxvYiB0byBhcnJheSBidWZmZXIgZmFpbGVkLmApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLl9tZXNzYWdlTGlzdGVuZXIpO1xuICAgIH1cbiAgICBvbkNsb3NlKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2Nsb3NlJywgbGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gYXBpXzEuRGlzcG9zYWJsZS5jcmVhdGUoKCkgPT4gdGhpcy5zb2NrZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xvc2UnLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkVycm9yKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgbGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gYXBpXzEuRGlzcG9zYWJsZS5jcmVhdGUoKCkgPT4gdGhpcy5zb2NrZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkVuZChsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKCdlbmQnLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdlbmQnLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkRhdGEobGlzdGVuZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uRGF0YS5ldmVudChsaXN0ZW5lcik7XG4gICAgfVxufVxuY2xhc3MgV3JpdGFibGVTdHJlYW1XcmFwcGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihzb2NrZXQpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7XG4gICAgfVxuICAgIG9uQ2xvc2UobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignY2xvc2UnLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbG9zZScsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIG9uRXJyb3IobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIG9uRW5kKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2VuZCcsIGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIGFwaV8xLkRpc3Bvc2FibGUuY3JlYXRlKCgpID0+IHRoaXMuc29ja2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2VuZCcsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIHdyaXRlKGRhdGEsIGVuY29kaW5nKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkICYmIGVuY29kaW5nICE9PSAndXRmLTgnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbiBhIEJyb3dzZXIgZW52aXJvbm1lbnRzIG9ubHkgdXRmLTggdGV4dCBlbmNvZGluZyBpcyBzdXBwb3J0ZWQuIEJ1dCBnb3QgZW5jb2Rpbmc6ICR7ZW5jb2Rpbmd9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKTtcbiAgICB9XG59XG5jb25zdCBfdGV4dEVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbmNvbnN0IF9yaWwgPSBPYmplY3QuZnJlZXplKHtcbiAgICBtZXNzYWdlQnVmZmVyOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgY3JlYXRlOiAoZW5jb2RpbmcpID0+IG5ldyBNZXNzYWdlQnVmZmVyKGVuY29kaW5nKVxuICAgIH0pLFxuICAgIGFwcGxpY2F0aW9uSnNvbjogT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGVuY29kZXI6IE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgbmFtZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgZW5jb2RlOiAobXNnLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2hhcnNldCAhPT0gJ3V0Zi04Jykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluIGEgQnJvd3NlciBlbnZpcm9ubWVudHMgb25seSB1dGYtOCB0ZXh0IGVuY29kaW5nIGlzIHN1cHBvcnRlZC4gQnV0IGdvdCBlbmNvZGluZzogJHtvcHRpb25zLmNoYXJzZXR9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoX3RleHRFbmNvZGVyLmVuY29kZShKU09OLnN0cmluZ2lmeShtc2csIHVuZGVmaW5lZCwgMCkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIGRlY29kZXI6IE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgbmFtZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgZGVjb2RlOiAoYnVmZmVyLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCEoYnVmZmVyIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbiBhIEJyb3dzZXIgZW52aXJvbm1lbnRzIG9ubHkgVWludDhBcnJheXMgYXJlIHN1cHBvcnRlZC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShKU09OLnBhcnNlKG5ldyBUZXh0RGVjb2RlcihvcHRpb25zLmNoYXJzZXQpLmRlY29kZShidWZmZXIpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfSksXG4gICAgc3RyZWFtOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgYXNSZWFkYWJsZVN0cmVhbTogKHNvY2tldCkgPT4gbmV3IFJlYWRhYmxlU3RyZWFtV3JhcHBlcihzb2NrZXQpLFxuICAgICAgICBhc1dyaXRhYmxlU3RyZWFtOiAoc29ja2V0KSA9PiBuZXcgV3JpdGFibGVTdHJlYW1XcmFwcGVyKHNvY2tldClcbiAgICB9KSxcbiAgICBjb25zb2xlOiBjb25zb2xlLFxuICAgIHRpbWVyOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgc2V0VGltZW91dChjYWxsYmFjaywgbXMsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHNldFRpbWVvdXQoY2FsbGJhY2ssIG1zLCAuLi5hcmdzKTtcbiAgICAgICAgICAgIHJldHVybiB7IGRpc3Bvc2U6ICgpID0+IGNsZWFyVGltZW91dChoYW5kbGUpIH07XG4gICAgICAgIH0sXG4gICAgICAgIHNldEltbWVkaWF0ZShjYWxsYmFjaywgLi4uYXJncykge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gc2V0VGltZW91dChjYWxsYmFjaywgMCwgLi4uYXJncyk7XG4gICAgICAgICAgICByZXR1cm4geyBkaXNwb3NlOiAoKSA9PiBjbGVhclRpbWVvdXQoaGFuZGxlKSB9O1xuICAgICAgICB9LFxuICAgICAgICBzZXRJbnRlcnZhbChjYWxsYmFjaywgbXMsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHNldEludGVydmFsKGNhbGxiYWNrLCBtcywgLi4uYXJncyk7XG4gICAgICAgICAgICByZXR1cm4geyBkaXNwb3NlOiAoKSA9PiBjbGVhckludGVydmFsKGhhbmRsZSkgfTtcbiAgICAgICAgfSxcbiAgICB9KVxufSk7XG5mdW5jdGlvbiBSSUwoKSB7XG4gICAgcmV0dXJuIF9yaWw7XG59XG4oZnVuY3Rpb24gKFJJTCkge1xuICAgIGZ1bmN0aW9uIGluc3RhbGwoKSB7XG4gICAgICAgIGFwaV8xLlJBTC5pbnN0YWxsKF9yaWwpO1xuICAgIH1cbiAgICBSSUwuaW5zdGFsbCA9IGluc3RhbGw7XG59KShSSUwgfHwgKFJJTCA9IHt9KSk7XG5leHBvcnRzLmRlZmF1bHQgPSBSSUw7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24gPSBleHBvcnRzLkJyb3dzZXJNZXNzYWdlV3JpdGVyID0gZXhwb3J0cy5Ccm93c2VyTWVzc2FnZVJlYWRlciA9IHZvaWQgMDtcbmNvbnN0IHJpbF8xID0gcmVxdWlyZShcIi4vcmlsXCIpO1xuLy8gSW5zdGFsbCB0aGUgYnJvd3NlciBydW50aW1lIGFic3RyYWN0LlxucmlsXzEuZGVmYXVsdC5pbnN0YWxsKCk7XG5jb25zdCBhcGlfMSA9IHJlcXVpcmUoXCIuLi9jb21tb24vYXBpXCIpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuLi9jb21tb24vYXBpXCIpLCBleHBvcnRzKTtcbmNsYXNzIEJyb3dzZXJNZXNzYWdlUmVhZGVyIGV4dGVuZHMgYXBpXzEuQWJzdHJhY3RNZXNzYWdlUmVhZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihwb3J0KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX29uRGF0YSA9IG5ldyBhcGlfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuX21lc3NhZ2VMaXN0ZW5lciA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fb25EYXRhLmZpcmUoZXZlbnQuZGF0YSk7XG4gICAgICAgIH07XG4gICAgICAgIHBvcnQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoZXZlbnQpID0+IHRoaXMuZmlyZUVycm9yKGV2ZW50KSk7XG4gICAgICAgIHBvcnQub25tZXNzYWdlID0gdGhpcy5fbWVzc2FnZUxpc3RlbmVyO1xuICAgIH1cbiAgICBsaXN0ZW4oY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uRGF0YS5ldmVudChjYWxsYmFjayk7XG4gICAgfVxufVxuZXhwb3J0cy5Ccm93c2VyTWVzc2FnZVJlYWRlciA9IEJyb3dzZXJNZXNzYWdlUmVhZGVyO1xuY2xhc3MgQnJvd3Nlck1lc3NhZ2VXcml0ZXIgZXh0ZW5kcyBhcGlfMS5BYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKHBvcnQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50ID0gMDtcbiAgICAgICAgcG9ydC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIChldmVudCkgPT4gdGhpcy5maXJlRXJyb3IoZXZlbnQpKTtcbiAgICB9XG4gICAgd3JpdGUobXNnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnBvcnQucG9zdE1lc3NhZ2UobXNnKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IsIG1zZyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZUVycm9yKGVycm9yLCBtc2cpIHtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50Kys7XG4gICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yLCBtc2csIHRoaXMuZXJyb3JDb3VudCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICB9XG59XG5leHBvcnRzLkJyb3dzZXJNZXNzYWdlV3JpdGVyID0gQnJvd3Nlck1lc3NhZ2VXcml0ZXI7XG5mdW5jdGlvbiBjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbihyZWFkZXIsIHdyaXRlciwgbG9nZ2VyLCBvcHRpb25zKSB7XG4gICAgaWYgKGxvZ2dlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxvZ2dlciA9IGFwaV8xLk51bGxMb2dnZXI7XG4gICAgfVxuICAgIGlmIChhcGlfMS5Db25uZWN0aW9uU3RyYXRlZ3kuaXMob3B0aW9ucykpIHtcbiAgICAgICAgb3B0aW9ucyA9IHsgY29ubmVjdGlvblN0cmF0ZWd5OiBvcHRpb25zIH07XG4gICAgfVxuICAgIHJldHVybiAoMCwgYXBpXzEuY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24pKHJlYWRlciwgd3JpdGVyLCBsb2dnZXIsIG9wdGlvbnMpO1xufVxuZXhwb3J0cy5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiA9IGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uO1xuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL2Jyb3dzZXIvbWFpbicpOyIsICIvKlxuICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMjYgRWNsaXBzZSBEaXJpZ2libGUgY29udHJpYnV0b3JzXG4gKlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlXG4gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2Mi4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG4gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MjAuaHRtbFxuICpcbiAqIFNQRFgtRmlsZUNvcHlyaWdodFRleHQ6IEVjbGlwc2UgRGlyaWdpYmxlIGNvbnRyaWJ1dG9ycyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbi8qKlxuICogSmF2YSBMU1AgY2xpZW50IGJ1bmRsZS5cbiAqXG4gKiBVc2VzIHZzY29kZS13cy1qc29ucnBjIGZvciB0eXBlZCBKU09OLVJQQyBvdmVyIFdlYlNvY2tldCBhbmQgcmVnaXN0ZXJzIE1vbmFjb1xuICogcHJvdmlkZXJzIHRoYXQgZGVsZWdhdGUgdG8gSkRULkxTLiBFeHBvc2VkIGFzIGdsb2JhbCBKYXZhTHNwQ2xpZW50TGliIHNvIHRoYXRcbiAqIGVkaXRvci5qcyBjYW4gY2FsbCBKYXZhTHNwQ2xpZW50TGliLmNvbm5lY3QocmVzb3VyY2VQYXRoKS5cbiAqXG4gKiBPbmUgSkRULkxTIHByb2Nlc3MgY292ZXJzIHRoZSBlbnRpcmUgd29ya3NwYWNlLCBzbyBhIHNpbmdsZSBXZWJTb2NrZXQgY29ubmVjdGlvblxuICogaXMgc2hhcmVkIGFjcm9zcyBhbGwgSmF2YSBmaWxlcyBvcGVuIGluIHRoZSBzYW1lIGJyb3dzZXIgcGFnZS4gVGhlIGNvbm5lY3Rpb24gaXNcbiAqIGVzdGFibGlzaGVkIG9uIHRoZSBmaXJzdCBjb25uZWN0KCkgY2FsbCBhbmQgcmV1c2VkIGZvciBhbGwgc3Vic2VxdWVudCBjYWxscy5cbiAqXG4gKiBlZGl0b3IuanMgc2V0cyB3aW5kb3cubW9uYWNvIGJlZm9yZSBjYWxsaW5nIGNvbm5lY3QoKSwgc28gdGhlIG1vbmFjby1zaGltJ3MgbGF6eVxuICogUHJveGllcyByZXNvbHZlIGNvcnJlY3RseSBhdCBjYWxsIHRpbWUuXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24sIE1lc3NhZ2VDb25uZWN0aW9uIH0gZnJvbSAndnNjb2RlLWpzb25ycGMvYnJvd3Nlcic7XG5pbXBvcnQgeyB0b1NvY2tldCwgV2ViU29ja2V0TWVzc2FnZVJlYWRlciwgV2ViU29ja2V0TWVzc2FnZVdyaXRlciB9IGZyb20gJ3ZzY29kZS13cy1qc29ucnBjJztcbmltcG9ydCAqIGFzIG1vbmFjbyBmcm9tICdtb25hY28tZWRpdG9yJztcbmltcG9ydCB7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLFxuICAgIERpYWdub3N0aWNTZXZlcml0eSxcbiAgICBJbnNlcnRUZXh0Rm9ybWF0LFxuICAgIE1hcmt1cENvbnRlbnQsXG4gICAgTWFya3VwS2luZCxcbiAgICB0eXBlIENvZGVBY3Rpb24sXG4gICAgdHlwZSBDb21tYW5kLFxuICAgIHR5cGUgQ29tcGxldGlvbkl0ZW0sXG4gICAgdHlwZSBDb21wbGV0aW9uTGlzdCxcbiAgICB0eXBlIERpYWdub3N0aWMsXG4gICAgdHlwZSBIb3ZlcixcbiAgICB0eXBlIExvY2F0aW9uLFxuICAgIHR5cGUgUGFyYW1ldGVySW5mb3JtYXRpb24sXG4gICAgdHlwZSBTaWduYXR1cmVIZWxwLFxuICAgIHR5cGUgU2lnbmF0dXJlSW5mb3JtYXRpb24sXG4gICAgdHlwZSBUZXh0RWRpdCxcbiAgICB0eXBlIFdvcmtzcGFjZUVkaXQsXG59IGZyb20gJ3ZzY29kZS1sYW5ndWFnZXNlcnZlci10eXBlcyc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNpbmdsZXRvbiBzdGF0ZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogU2hhcmVkIGNvbm5lY3Rpb24gXHUyMDE0IG9uZSBwZXIgYnJvd3NlciBwYWdlLCBjb3ZlcmluZyBhbGwgcHJvamVjdHMgaW4gdGhlIHdvcmtzcGFjZS4gKi9cbmxldCBfY29ubjogTWVzc2FnZUNvbm5lY3Rpb24gfCBudWxsID0gbnVsbDtcblxuLyoqXG4gKiBWaXJ0dWFsIHdvcmtzcGFjZSByb290IFVSSSwgZS5nLiB7QGNvZGUgZmlsZTovLy93b3Jrc3BhY2Uvd29ya3NwYWNlL30uXG4gKiBTZXQgb25jZSBvbiBmaXJzdCBjb25uZWN0KCk7IHVzZWQgdG8gc2NvcGUgTW9uYWNvIHByb3ZpZGVycyB0byB3b3Jrc3BhY2UgZmlsZXMuXG4gKi9cbmxldCBfd29ya3NwYWNlUm9vdCA9ICcnO1xuXG4vKiogVVJJcyBmb3Igd2hpY2ggdGV4dERvY3VtZW50L2RpZE9wZW4gaGFzIGFscmVhZHkgYmVlbiBzZW50LiAqL1xuY29uc3QgX29wZW5GaWxlczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cbi8qKiBQZW5kaW5nIGRlYm91bmNlZCBkaWRDaGFuZ2UgdGltZXJzIHBlciBmaWxlIFVSSSwgc28gYSBjaGFuZ2UgY2FuIGJlIGZsdXNoZWQgYmVmb3JlIGNvbXBsZXRpb24uICovXG5jb25zdCBfY2hhbmdlVGltZXJzOiBNYXA8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0Pj4gPSBuZXcgTWFwKCk7XG5cbi8qKlxuICogTGFzdCBkaWFnbm9zdGljcyBwdWJsaXNoZWQgcGVyIGZpbGUgVVJJLCBrZXB0IHZlcmJhdGltICh3aXRoIHRoZWlyIExTUCBjb2RlL2RhdGEpLiBDb2RlLWFjdGlvblxuICogcmVxdWVzdHMgbXVzdCBzZW5kIHRoZXNlIFx1MjAxNCBKRFQuTFMgbWF0Y2hlcyBxdWljay1maXhlcyBieSB0aGUgZGlhZ25vc3RpYydzIGNvZGUvZGF0YSwgd2hpY2ggTW9uYWNvJ3NcbiAqIElNYXJrZXJEYXRhIGNhbm5vdCByb3VuZC10cmlwLCBzbyByZWNvbnN0cnVjdGluZyBkaWFnbm9zdGljcyBmcm9tIG1hcmtlcnMgeWllbGRzIG5vIHF1aWNrLWZpeGVzLlxuICovXG5jb25zdCBfZGlhZ25vc3RpY3M6IE1hcDxzdHJpbmcsIERpYWdub3N0aWNbXT4gPSBuZXcgTWFwKCk7XG5cbmxldCBfcHJvdmlkZXJzUmVnaXN0ZXJlZCA9IGZhbHNlO1xuXG4vKiogU2VtYW50aWMtdG9rZW4gbGVnZW5kIHJlcG9ydGVkIGJ5IEpEVC5MUyBpbiB0aGUgaW5pdGlhbGl6ZSByZXN1bHQ7IG5lZWRlZCB0byBkZWNvZGUgdG9rZW4gZGF0YS4gKi9cbmxldCBfc2VtYW50aWNUb2tlbnNMZWdlbmQ6IHsgdG9rZW5UeXBlczogc3RyaW5nW107IHRva2VuTW9kaWZpZXJzOiBzdHJpbmdbXSB9IHwgbnVsbCA9IG51bGw7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFB1YmxpYyBBUElcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIENhbGxlZCBieSBlZGl0b3IuanMgd2hlbiBhIEphdmEgZmlsZSBpcyBvcGVuZWQuIFNhZmUgdG8gY2FsbCBtdWx0aXBsZSB0aW1lcy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb25uZWN0KHJlc291cmNlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFydHMgPSByZXNvdXJjZVBhdGgucmVwbGFjZSgvXlxcLy8sICcnKS5zcGxpdCgnLycpO1xuICAgIGNvbnN0IHdvcmtzcGFjZSA9IHBhcnRzWzBdO1xuICAgIGNvbnN0IHByb2plY3QgICA9IHBhcnRzWzFdO1xuICAgIGNvbnN0IGZpbGVVcmkgPSBgZmlsZTovLy93b3Jrc3BhY2UvJHt3b3Jrc3BhY2V9LyR7cHJvamVjdH0vJHtwYXJ0cy5zbGljZSgyKS5qb2luKCcvJyl9YDtcblxuICAgIGlmIChfY29ubikge1xuICAgICAgICAvLyBDb25uZWN0aW9uIGFscmVhZHkgZXN0YWJsaXNoZWQgXHUyMDE0IGp1c3Qgb3BlbiB0aGUgbmV3IGZpbGUuXG4gICAgICAgIG9wZW5GaWxlKGZpbGVVcmkpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgX3dvcmtzcGFjZVJvb3QgPSBgZmlsZTovLy93b3Jrc3BhY2UvJHt3b3Jrc3BhY2V9L2A7XG5cbiAgICBjb25zdCBwcm90byA9IGxvY2F0aW9uLnByb3RvY29sID09PSAnaHR0cHM6JyA/ICd3c3MnIDogJ3dzJztcbiAgICBjb25zdCB3c1VybCA9IGAke3Byb3RvfTovLyR7bG9jYXRpb24uaG9zdH0vd2Vic29ja2V0cy9pZGUvamF2YS1sc3BgXG4gICAgICAgICAgICAgICAgKyBgP3dvcmtzcGFjZT0ke2VuY29kZVVSSUNvbXBvbmVudCh3b3Jrc3BhY2UpfWA7XG5cbiAgICBjb25zdCB3cyA9IG5ldyBXZWJTb2NrZXQod3NVcmwpO1xuICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgd3Mub25vcGVuICA9ICgpID0+IHJlc29sdmUoKTtcbiAgICAgICAgd3Mub25lcnJvciA9ICgpID0+IHJlamVjdChuZXcgRXJyb3IoYFtqYXZhLWxzcF0gV2ViU29ja2V0IGNvbm5lY3QgZmFpbGVkOiAke3dzVXJsfWApKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHNvY2tldCA9IHRvU29ja2V0KHdzKTtcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgV2ViU29ja2V0TWVzc2FnZVJlYWRlcihzb2NrZXQpO1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBXZWJTb2NrZXRNZXNzYWdlV3JpdGVyKHNvY2tldCk7XG4gICAgX2Nvbm4gPSBjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbihyZWFkZXIsIHdyaXRlcik7XG5cbiAgICAvLyBEaWFnbm9zdGljcyBub3RpZmljYXRpb24gXHUyMTkyIE1vbmFjbyBtYXJrZXJzIChhcHBsaWVzIHRvIGFueSB3b3Jrc3BhY2UgZmlsZSlcbiAgICBfY29ubi5vbk5vdGlmaWNhdGlvbigndGV4dERvY3VtZW50L3B1Ymxpc2hEaWFnbm9zdGljcycsIChwYXJhbXM6IHsgdXJpOiBzdHJpbmc7IGRpYWdub3N0aWNzOiBEaWFnbm9zdGljW10gfSkgPT4ge1xuICAgICAgICBfZGlhZ25vc3RpY3Muc2V0KHBhcmFtcy51cmksIHBhcmFtcy5kaWFnbm9zdGljcyA/PyBbXSk7XG4gICAgICAgIGNvbnN0IG1vZGVsID0gbW9uYWNvLmVkaXRvci5nZXRNb2RlbHMoKS5maW5kKG0gPT4gbS51cmkudG9TdHJpbmcoKSA9PT0gcGFyYW1zLnVyaSk7XG4gICAgICAgIGlmICghbW9kZWwpIHJldHVybjtcbiAgICAgICAgbW9uYWNvLmVkaXRvci5zZXRNb2RlbE1hcmtlcnMobW9kZWwsICdqYXZhLWxzcCcsIHBhcmFtcy5kaWFnbm9zdGljcy5tYXAoZCA9PiAoe1xuICAgICAgICAgICAgc2V2ZXJpdHk6ICAgICAgICBsc3BTZXZlcml0eShkLnNldmVyaXR5KSxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICAgICAgICAgZC5tZXNzYWdlLFxuICAgICAgICAgICAgc291cmNlOiAgICAgICAgICBkLnNvdXJjZSA/PyAnamF2YScsXG4gICAgICAgICAgICBzdGFydExpbmVOdW1iZXI6IGQucmFuZ2Uuc3RhcnQubGluZSArIDEsXG4gICAgICAgICAgICBzdGFydENvbHVtbjogICAgIGQucmFuZ2Uuc3RhcnQuY2hhcmFjdGVyICsgMSxcbiAgICAgICAgICAgIGVuZExpbmVOdW1iZXI6ICAgZC5yYW5nZS5lbmQubGluZSArIDEsXG4gICAgICAgICAgICBlbmRDb2x1bW46ICAgICAgIGQucmFuZ2UuZW5kLmNoYXJhY3RlciArIDEsXG4gICAgICAgIH0pKSk7XG4gICAgfSk7XG5cbiAgICAvLyBTZXJ2ZXIgLT4gY2xpZW50IHJlcXVlc3RzIHRoYXQgZHJpdmUgcmVmYWN0b3IgLyBnZW5lcmF0ZSByZXN1bHRzIGFuZCBkeW5hbWljIHJlZ2lzdHJhdGlvbi5cbiAgICBfY29ubi5vblJlcXVlc3QoJ3dvcmtzcGFjZS9hcHBseUVkaXQnLCAocGFyYW1zOiB7IGVkaXQ6IFdvcmtzcGFjZUVkaXQgfSkgPT4ge1xuICAgICAgICBhcHBseVdvcmtzcGFjZUVkaXQocGFyYW1zLmVkaXQpO1xuICAgICAgICByZXR1cm4geyBhcHBsaWVkOiB0cnVlIH07XG4gICAgfSk7XG4gICAgX2Nvbm4ub25SZXF1ZXN0KCd3b3Jrc3BhY2UvY29uZmlndXJhdGlvbicsIChwYXJhbXM6IHsgaXRlbXM6IEFycmF5PHsgc2VjdGlvbj86IHN0cmluZyB9PiB9KSA9PlxuICAgICAgICAocGFyYW1zLml0ZW1zID8/IFtdKS5tYXAoKCkgPT4gamR0bHNTZXR0aW5ncygpLmphdmEpKTtcbiAgICBfY29ubi5vblJlcXVlc3QoJ2NsaWVudC9yZWdpc3RlckNhcGFiaWxpdHknLCAoKSA9PiBudWxsKTtcbiAgICBfY29ubi5vblJlcXVlc3QoJ2NsaWVudC91bnJlZ2lzdGVyQ2FwYWJpbGl0eScsICgpID0+IG51bGwpO1xuICAgIF9jb25uLm9uUmVxdWVzdCgnd2luZG93L3Nob3dNZXNzYWdlUmVxdWVzdCcsICgpID0+IG51bGwpO1xuICAgIF9jb25uLm9uUmVxdWVzdCgnd2luZG93L3dvcmtEb25lUHJvZ3Jlc3MvY3JlYXRlJywgKCkgPT4gbnVsbCk7XG4gICAgX2Nvbm4ub25Ob3RpZmljYXRpb24oJ3dpbmRvdy9sb2dNZXNzYWdlJywgKHA6IHsgbWVzc2FnZTogc3RyaW5nIH0pID0+IGNvbnNvbGUuZGVidWcoJ1tqYXZhLWxzcF0nLCBwPy5tZXNzYWdlKSk7XG4gICAgX2Nvbm4ub25Ob3RpZmljYXRpb24oJ3dpbmRvdy9zaG93TWVzc2FnZScsIChwOiB7IG1lc3NhZ2U6IHN0cmluZyB9KSA9PiBjb25zb2xlLmluZm8oJ1tqYXZhLWxzcF0nLCBwPy5tZXNzYWdlKSk7XG4gICAgLy8gSkRULkxTIGxhbmd1YWdlLXN0YXR1cyAvIHByb2dyZXNzIG5vdGlmaWNhdGlvbnMgXHUyMDE0IGFja25vd2xlZGdlZCBzaWxlbnRseS5cbiAgICBfY29ubi5vbk5vdGlmaWNhdGlvbignbGFuZ3VhZ2Uvc3RhdHVzJywgKCkgPT4geyAvKiBpbmRleGluZy9yZWFkeSBzdGF0dXMsIGlnbm9yZWQgKi8gfSk7XG4gICAgX2Nvbm4ub25Ob3RpZmljYXRpb24oJ2xhbmd1YWdlL3Byb2dyZXNzUmVwb3J0JywgKCkgPT4geyAvKiBidWlsZCBwcm9ncmVzcywgaWdub3JlZCAqLyB9KTtcblxuICAgIF9jb25uLmxpc3RlbigpO1xuXG4gICAgY29uc3Qgcm9vdFVyaSA9IF93b3Jrc3BhY2VSb290O1xuICAgIGNvbnN0IGluaXRSZXN1bHQ6IGFueSA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCdpbml0aWFsaXplJywge1xuICAgICAgICBwcm9jZXNzSWQ6IG51bGwsXG4gICAgICAgIHJvb3RVcmksXG4gICAgICAgIGluaXRpYWxpemF0aW9uT3B0aW9uczoge1xuICAgICAgICAgICAgc2V0dGluZ3M6IGpkdGxzU2V0dGluZ3MoKSxcbiAgICAgICAgICAgIGV4dGVuZGVkQ2xpZW50Q2FwYWJpbGl0aWVzOiB7XG4gICAgICAgICAgICAgICAgcHJvZ3Jlc3NSZXBvcnRQcm92aWRlcjogICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICAgICBjbGFzc0ZpbGVDb250ZW50c1N1cHBvcnQ6ICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgcmVzb2x2ZUFkZGl0aW9uYWxUZXh0RWRpdHNTdXBwb3J0OiB0cnVlLFxuICAgICAgICAgICAgICAgIC8vIERvIE5PVCBhZHZlcnRpc2UgdGhlICpQcm9tcHRTdXBwb3J0IGZsYWdzOiB0aG9zZSBtYWtlIEpEVC5MUyByZXR1cm4gc291cmNlIGFjdGlvbnNcbiAgICAgICAgICAgICAgICAvLyAoZ2VuZXJhdGUgdG9TdHJpbmcvY29uc3RydWN0b3JzL2FjY2Vzc29ycywgb3ZlcnJpZGUvaW1wbGVtZW50LCBvcmdhbml6ZSBpbXBvcnRzKSBhc1xuICAgICAgICAgICAgICAgIC8vIGNsaWVudC1zaWRlIFwiKlByb21wdFwiIGNvbW1hbmRzIHRoZSB2c2NvZGUtamF2YSBleHRlbnNpb24gaW1wbGVtZW50cyBidXQgd2UgZG9uJ3QuXG4gICAgICAgICAgICAgICAgLy8gV2l0aCB0aGVtIG9mZiwgSkRULkxTIHJldHVybnMgdGhlIHNhbWUgYWN0aW9ucyBhcyByZXNvbHZhYmxlIFdvcmtzcGFjZUVkaXRzIG9wZXJhdGluZ1xuICAgICAgICAgICAgICAgIC8vIG9uIGFsbCBtZW1iZXJzLCB3aGljaCBhcHBseUNvZGVBY3Rpb24gcmVzb2x2ZXMgYW5kIGFwcGxpZXMgZGlyZWN0bHkuXG4gICAgICAgICAgICAgICAgaW5mZXJTZWxlY3Rpb25TdXBwb3J0OiAgICAgICAgICAgICBbJ2V4dHJhY3RNZXRob2QnLCAnZXh0cmFjdFZhcmlhYmxlJywgJ2V4dHJhY3RGaWVsZCddLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgd29ya3NwYWNlRm9sZGVyczogW3sgdXJpOiByb290VXJpLCBuYW1lOiB3b3Jrc3BhY2UgfV0sXG4gICAgICAgIGNhcGFiaWxpdGllczoge1xuICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7XG4gICAgICAgICAgICAgICAgc3luY2hyb25pemF0aW9uOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUsIHdpbGxTYXZlOiBmYWxzZSwgZGlkU2F2ZTogdHJ1ZSwgd2lsbFNhdmVXYWl0VW50aWw6IGZhbHNlIH0sXG4gICAgICAgICAgICAgICAgY29tcGxldGlvbjoge1xuICAgICAgICAgICAgICAgICAgICBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uSXRlbToge1xuICAgICAgICAgICAgICAgICAgICAgICAgc25pcHBldFN1cHBvcnQ6ICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRhdGlvbkZvcm1hdDogICBbJ21hcmtkb3duJywgJ3BsYWludGV4dCddLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRlZFN1cHBvcnQ6ICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWl0Q2hhcmFjdGVyc1N1cHBvcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlU3VwcG9ydDogICAgICAgIHsgcHJvcGVydGllczogWydkb2N1bWVudGF0aW9uJywgJ2RldGFpbCcsICdhZGRpdGlvbmFsVGV4dEVkaXRzJ10gfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dFN1cHBvcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBob3ZlcjogICAgICAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLCBjb250ZW50Rm9ybWF0OiBbJ21hcmtkb3duJywgJ3BsYWludGV4dCddIH0sXG4gICAgICAgICAgICAgICAgc2lnbmF0dXJlSGVscDogIHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSwgc2lnbmF0dXJlSW5mb3JtYXRpb246IHsgZG9jdW1lbnRhdGlvbkZvcm1hdDogWydtYXJrZG93bicsICdwbGFpbnRleHQnXSwgcGFyYW1ldGVySW5mb3JtYXRpb246IHsgbGFiZWxPZmZzZXRTdXBwb3J0OiB0cnVlIH0gfSB9LFxuICAgICAgICAgICAgICAgIGRlZmluaXRpb246ICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VzOiAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb246IHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIHR5cGVEZWZpbml0aW9uOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICBkb2N1bWVudEhpZ2hsaWdodDogeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgZG9jdW1lbnRTeW1ib2w6IHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSwgaGllcmFyY2hpY2FsRG9jdW1lbnRTeW1ib2xTdXBwb3J0OiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgZm9sZGluZ1JhbmdlOiAgIHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSwgbGluZUZvbGRpbmdPbmx5OiBmYWxzZSB9LFxuICAgICAgICAgICAgICAgIHNlbGVjdGlvblJhbmdlOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICBjb2RlTGVuczogICAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgaW5sYXlIaW50OiAgICAgIHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSwgcmVzb2x2ZVN1cHBvcnQ6IHsgcHJvcGVydGllczogWydsYWJlbCddIH0gfSxcbiAgICAgICAgICAgICAgICBzZW1hbnRpY1Rva2Vuczoge1xuICAgICAgICAgICAgICAgICAgICBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0czogICAgICAgIHsgcmFuZ2U6IGZhbHNlLCBmdWxsOiB7IGRlbHRhOiBmYWxzZSB9IH0sXG4gICAgICAgICAgICAgICAgICAgIHRva2VuVHlwZXM6ICAgICAgWyduYW1lc3BhY2UnLCAndHlwZScsICdjbGFzcycsICdlbnVtJywgJ2ludGVyZmFjZScsICdzdHJ1Y3QnLCAndHlwZVBhcmFtZXRlcicsXG4gICAgICAgICAgICAgICAgICAgICAgICAncGFyYW1ldGVyJywgJ3ZhcmlhYmxlJywgJ3Byb3BlcnR5JywgJ2VudW1NZW1iZXInLCAnZXZlbnQnLCAnZnVuY3Rpb24nLCAnbWV0aG9kJywgJ21hY3JvJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdrZXl3b3JkJywgJ21vZGlmaWVyJywgJ2NvbW1lbnQnLCAnc3RyaW5nJywgJ251bWJlcicsICdyZWdleHAnLCAnb3BlcmF0b3InLCAnZGVjb3JhdG9yJ10sXG4gICAgICAgICAgICAgICAgICAgIHRva2VuTW9kaWZpZXJzOiAgWydkZWNsYXJhdGlvbicsICdkZWZpbml0aW9uJywgJ3JlYWRvbmx5JywgJ3N0YXRpYycsICdkZXByZWNhdGVkJywgJ2Fic3RyYWN0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdhc3luYycsICdtb2RpZmljYXRpb24nLCAnZG9jdW1lbnRhdGlvbicsICdkZWZhdWx0TGlicmFyeSddLFxuICAgICAgICAgICAgICAgICAgICBmb3JtYXRzOiAgICAgICAgIFsncmVsYXRpdmUnXSxcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxhcHBpbmdUb2tlblN1cHBvcnQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBtdWx0aWxpbmVUb2tlblN1cHBvcnQ6ICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBmb3JtYXR0aW5nOiAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgcmFuZ2VGb3JtYXR0aW5nOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICByZW5hbWU6ICAgICAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLCBwcmVwYXJlU3VwcG9ydDogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIGNvZGVBY3Rpb246IHtcbiAgICAgICAgICAgICAgICAgICAgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgY29kZUFjdGlvbkxpdGVyYWxTdXBwb3J0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlQWN0aW9uS2luZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU2V0OiBbJ3F1aWNrZml4JywgJ3JlZmFjdG9yJywgJ3JlZmFjdG9yLmV4dHJhY3QnLCAncmVmYWN0b3IuaW5saW5lJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlZmFjdG9yLnJld3JpdGUnLCAnc291cmNlJywgJ3NvdXJjZS5vcmdhbml6ZUltcG9ydHMnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGlzUHJlZmVycmVkU3VwcG9ydDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgZGF0YVN1cHBvcnQ6ICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlU3VwcG9ydDogICAgIHsgcHJvcGVydGllczogWydlZGl0J10gfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHB1Ymxpc2hEaWFnbm9zdGljczogeyByZWxhdGVkSW5mb3JtYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3b3Jrc3BhY2U6IHtcbiAgICAgICAgICAgICAgICBhcHBseUVkaXQ6ICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb246ICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgZXhlY3V0ZUNvbW1hbmQ6ICAgICAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgZGlkQ2hhbmdlQ29uZmlndXJhdGlvbjogeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgd29ya3NwYWNlRWRpdDogICAgICAgICAgeyBkb2N1bWVudENoYW5nZXM6IHRydWUsIHJlc291cmNlT3BlcmF0aW9uczogWydjcmVhdGUnLCAncmVuYW1lJywgJ2RlbGV0ZSddIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgX3NlbWFudGljVG9rZW5zTGVnZW5kID0gaW5pdFJlc3VsdD8uY2FwYWJpbGl0aWVzPy5zZW1hbnRpY1Rva2Vuc1Byb3ZpZGVyPy5sZWdlbmQgPz8gbnVsbDtcblxuICAgIF9jb25uLnNlbmROb3RpZmljYXRpb24oJ2luaXRpYWxpemVkJywge30pO1xuICAgIF9jb25uLnNlbmROb3RpZmljYXRpb24oJ3dvcmtzcGFjZS9kaWRDaGFuZ2VDb25maWd1cmF0aW9uJywgeyBzZXR0aW5nczogamR0bHNTZXR0aW5ncygpIH0pO1xuXG4gICAgb3BlbkZpbGUoZmlsZVVyaSk7XG5cbiAgICBpZiAoIV9wcm92aWRlcnNSZWdpc3RlcmVkKSB7XG4gICAgICAgIF9wcm92aWRlcnNSZWdpc3RlcmVkID0gdHJ1ZTtcbiAgICAgICAgcmVnaXN0ZXJQcm92aWRlcnMoKTtcbiAgICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEZpbGUgbGlmZWN5Y2xlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogU2VuZHMgdGV4dERvY3VtZW50L2RpZE9wZW4gZm9yIHRoZSBnaXZlbiBVUkkgKGlmIG5vdCBhbHJlYWR5IHNlbnQpIGFuZCByZWdpc3RlcnMgYSBkZWJvdW5jZWRcbiAqIHRleHREb2N1bWVudC9kaWRDaGFuZ2UgbGlzdGVuZXIgb24gdGhlIGNvcnJlc3BvbmRpbmcgTW9uYWNvIG1vZGVsLlxuICovXG5mdW5jdGlvbiBvcGVuRmlsZShmaWxlVXJpOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoX29wZW5GaWxlcy5oYXMoZmlsZVVyaSkgfHwgIV9jb25uKSByZXR1cm47XG4gICAgX29wZW5GaWxlcy5hZGQoZmlsZVVyaSk7XG5cbiAgICBjb25zdCBtb2RlbCA9IG1vbmFjby5lZGl0b3IuZ2V0TW9kZWxzKCkuZmluZChtID0+IG0udXJpLnRvU3RyaW5nKCkgPT09IGZpbGVVcmkpO1xuICAgIF9jb25uLnNlbmROb3RpZmljYXRpb24oJ3RleHREb2N1bWVudC9kaWRPcGVuJywge1xuICAgICAgICB0ZXh0RG9jdW1lbnQ6IHtcbiAgICAgICAgICAgIHVyaTogICAgICAgIGZpbGVVcmksXG4gICAgICAgICAgICBsYW5ndWFnZUlkOiAnamF2YScsXG4gICAgICAgICAgICB2ZXJzaW9uOiAgICAxLFxuICAgICAgICAgICAgdGV4dDogICAgICAgbW9kZWw/LmdldFZhbHVlKCkgPz8gJycsXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBpZiAobW9kZWwpIHtcbiAgICAgICAgbW9kZWwub25EaWRDaGFuZ2VDb250ZW50KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gX2NoYW5nZVRpbWVycy5nZXQoZmlsZVVyaSk7XG4gICAgICAgICAgICBpZiAoZXhpc3RpbmcpIGNsZWFyVGltZW91dChleGlzdGluZyk7XG4gICAgICAgICAgICBfY2hhbmdlVGltZXJzLnNldChmaWxlVXJpLCBzZXRUaW1lb3V0KCgpID0+IHNlbmREaWRDaGFuZ2UoZmlsZVVyaSksIDQwMCkpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbi8qKiBTZW5kcyB0aGUgY3VycmVudCBtb2RlbCBjb250ZW50IGFzIGEgZGlkQ2hhbmdlIGFuZCBjbGVhcnMgYW55IHBlbmRpbmcgZGVib3VuY2UgZm9yIHRoZSBmaWxlLiAqL1xuZnVuY3Rpb24gc2VuZERpZENoYW5nZShmaWxlVXJpOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBfY2hhbmdlVGltZXJzLmRlbGV0ZShmaWxlVXJpKTtcbiAgICBjb25zdCBtb2RlbCA9IG1vbmFjby5lZGl0b3IuZ2V0TW9kZWwobW9uYWNvLlVyaS5wYXJzZShmaWxlVXJpKSk7XG4gICAgaWYgKF9jb25uICYmIG1vZGVsKSB7XG4gICAgICAgIF9jb25uLnNlbmROb3RpZmljYXRpb24oJ3RleHREb2N1bWVudC9kaWRDaGFuZ2UnLCB7XG4gICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6ICAgeyB1cmk6IGZpbGVVcmksIHZlcnNpb246IG1vZGVsLmdldFZlcnNpb25JZCgpIH0sXG4gICAgICAgICAgICBjb250ZW50Q2hhbmdlczogW3sgdGV4dDogbW9kZWwuZ2V0VmFsdWUoKSB9XSxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEZsdXNoZXMgYSBwZW5kaW5nIGRlYm91bmNlZCBjaGFuZ2UgaW1tZWRpYXRlbHkuIENhbGxlZCBiZWZvcmUgYSBjb21wbGV0aW9uIHJlcXVlc3Qgc28gSkRULkxTIHNlZXMgdGhlXG4gKiBqdXN0LXR5cGVkIHRleHQgb24gdGhlIGZpcnN0IEN0cmwrU3BhY2UsIGluc3RlYWQgb2YgY29tcGxldGluZyBhZ2FpbnN0IHN0YWxlIGNvbnRlbnQgKHRoZSBkZWJvdW5jZVxuICogb3RoZXJ3aXNlIGRlbGF5cyB0aGUgY2hhbmdlIGJ5IHVwIHRvIDQwMG1zIFx1MjAxNCB0aGUgY2F1c2Ugb2YgXCJmaXJzdCBDdHJsK1NwYWNlIHNob3dzIG5vdGhpbmdcIikuXG4gKi9cbmZ1bmN0aW9uIGZsdXNoUGVuZGluZ0NoYW5nZShmaWxlVXJpOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoX2NoYW5nZVRpbWVycy5oYXMoZmlsZVVyaSkpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KF9jaGFuZ2VUaW1lcnMuZ2V0KGZpbGVVcmkpISk7XG4gICAgICAgIHNlbmREaWRDaGFuZ2UoZmlsZVVyaSk7XG4gICAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBXb3Jrc3BhY2UgZmlsZSBwcmVkaWNhdGVcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBSZXR1cm5zIHtAY29kZSB0cnVlfSB3aGVuIHRoZSBnaXZlbiBtb2RlbCBVUkkgYmVsb25ncyB0byB0aGUgY3VycmVudGx5IGNvbm5lY3RlZCB3b3Jrc3BhY2UuIFVzZWRcbiAqIGJ5IE1vbmFjbyBwcm92aWRlcnMgdG8gc2tpcCBub24tSmF2YS13b3Jrc3BhY2UgbW9kZWxzIHdpdGhvdXQgYW4gZXhhY3QtVVJJIGNvbXBhcmlzb24uXG4gKi9cbmZ1bmN0aW9uIGlzV29ya3NwYWNlRmlsZSh1cmk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBfd29ya3NwYWNlUm9vdCAhPT0gJycgJiYgdXJpLnN0YXJ0c1dpdGgoX3dvcmtzcGFjZVJvb3QpO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBNb25hY28gcHJvdmlkZXIgcmVnaXN0cmF0aW9uXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIHJlZ2lzdGVyUHJvdmlkZXJzKCk6IHZvaWQge1xuXG4gICAgbW9uYWNvLmVkaXRvci5yZWdpc3RlckNvbW1hbmQoQVBQTFlfQUNUSU9OX0NPTU1BTkQsIChfYWNjZXNzb3I6IHVua25vd24sIGFjdGlvbjogQ29kZUFjdGlvbiB8IENvbW1hbmQpID0+IHtcbiAgICAgICAgYXBwbHlDb2RlQWN0aW9uKGFjdGlvbik7XG4gICAgfSk7XG4gICAgbW9uYWNvLmVkaXRvci5yZWdpc3RlckNvbW1hbmQoTk9PUF9DT01NQU5ELCAoKSA9PiB7IC8qIGRpc3BsYXktb25seSBDb2RlTGVucyAqLyB9KTtcblxuICAgIC8vIENyb3NzLWZpbGUgbmF2aWdhdGlvbjogdGhpcyBzaW5nbGUtZmlsZSBlZGl0b3IgaGFzIG5vIG1vZGVsIGZvciBvdGhlciB3b3Jrc3BhY2UgZmlsZXMsIHNvIEdvIHRvXG4gICAgLy8gRGVmaW5pdGlvbiAvIEZpbmQgUmVmZXJlbmNlcyB0byBhbm90aGVyIGZpbGUgd291bGQgc2lsZW50bHkgZG8gbm90aGluZy4gSGFuZCB0aG9zZSBvZmYgdG8gdGhlIElERVxuICAgIC8vIHRvIG9wZW4gdGhlIHRhcmdldCBmaWxlIChhbmQgcmV2ZWFsIHRoZSBsaW5lKS4gU2FtZS1maWxlIHRhcmdldHMgZmFsbCB0aHJvdWdoIHRvIE1vbmFjby5cbiAgICBtb25hY28uZWRpdG9yLnJlZ2lzdGVyRWRpdG9yT3BlbmVyKHtcbiAgICAgICAgb3BlbkNvZGVFZGl0b3I6IChzb3VyY2UsIHJlc291cmNlLCBzZWxlY3Rpb25PclBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB1cmkgPSByZXNvdXJjZS50b1N0cmluZygpO1xuICAgICAgICAgICAgaWYgKCFpc1dvcmtzcGFjZUZpbGUodXJpKSB8fCAhdXJpLnN0YXJ0c1dpdGgoVklSVFVBTF9GSUxFX1BSRUZJWCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRNb2RlbCA9IHNvdXJjZS5nZXRNb2RlbCgpO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRNb2RlbCAmJiBjdXJyZW50TW9kZWwudXJpLnRvU3RyaW5nKCkgPT09IHVyaSkgcmV0dXJuIGZhbHNlOyAvLyBzYW1lIGZpbGUgXHUyMDE0IGxldCBNb25hY28ganVtcFxuICAgICAgICAgICAgY29uc3Qgb3BlbmVyID0gKGdsb2JhbFRoaXMgYXMgYW55KS5qYXZhTHNwT3BlbkZpbGU7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wZW5lciAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgcG9zID0gc2VsZWN0aW9uT3JQb3NpdGlvbiBhcyB7IHN0YXJ0TGluZU51bWJlcj86IG51bWJlcjsgbGluZU51bWJlcj86IG51bWJlcjsgc3RhcnRDb2x1bW4/OiBudW1iZXI7IGNvbHVtbj86IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgbGluZSA9IHBvcyA/IChwb3Muc3RhcnRMaW5lTnVtYmVyID8/IHBvcy5saW5lTnVtYmVyKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHBvcyA/IChwb3Muc3RhcnRDb2x1bW4gPz8gcG9zLmNvbHVtbikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBvcGVuZXIodXJpLnN1YnN0cmluZyhWSVJUVUFMX0ZJTEVfUFJFRklYLmxlbmd0aCksIGxpbmUsIGNvbHVtbik7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJDb21wbGV0aW9uSXRlbVByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICB0cmlnZ2VyQ2hhcmFjdGVyczogWycuJywgJ0AnLCAnPCddLFxuICAgICAgICBwcm92aWRlQ29tcGxldGlvbkl0ZW1zOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uLCBjb250ZXh0KSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVVcmkgPSBtb2RlbC51cmkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBKRFQuTFMgaGFzIHRoZSBqdXN0LXR5cGVkIHRleHQgYmVmb3JlIGNvbXBsZXRpbmcgKHNlZSBmbHVzaFBlbmRpbmdDaGFuZ2UpLlxuICAgICAgICAgICAgZmx1c2hQZW5kaW5nQ2hhbmdlKGZpbGVVcmkpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBDb21wbGV0aW9uTGlzdCB8IENvbXBsZXRpb25JdGVtW10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9jb21wbGV0aW9uJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IGZpbGVVcmkgfSxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogICAgIHsgbGluZTogcG9zaXRpb24ubGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogcG9zaXRpb24uY29sdW1uIC0gMSB9LFxuICAgICAgICAgICAgICAgIC8vIE1vbmFjbyB0cmlnZ2VyIGtpbmRzIGFyZSAwLWJhc2VkIChJbnZva2UvVHJpZ2dlckNoYXJhY3Rlci9Gb3JJbmNvbXBsZXRlKTsgTFNQIGlzIDEtYmFzZWQuXG4gICAgICAgICAgICAgICAgY29udGV4dDogICAgICB7IHRyaWdnZXJLaW5kOiAoY29udGV4dC50cmlnZ2VyS2luZCA/PyAwKSArIDEsIHRyaWdnZXJDaGFyYWN0ZXI6IGNvbnRleHQudHJpZ2dlckNoYXJhY3RlciB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBpdGVtcyA9IEFycmF5LmlzQXJyYXkocmVzdWx0KSA/IHJlc3VsdCA6IChyZXN1bHQ/Lml0ZW1zID8/IFtdKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3VnZ2VzdGlvbnM6IGl0ZW1zLm1hcChpdGVtID0+IGxzcENvbXBsZXRpb25Ub01vbmFjbyhpdGVtLCBtb2RlbCwgcG9zaXRpb24pKSxcbiAgICAgICAgICAgICAgICAvLyBKRFQuTFMgcmV0dXJucyBhIHRydW5jYXRlZCBsaXN0IG9uIHRoZSBmaXJzdCBrZXlzdHJva2VzOyBwcm9wYWdhdGluZyBcImluY29tcGxldGVcIiBtYWtlc1xuICAgICAgICAgICAgICAgIC8vIE1vbmFjbyByZS1xdWVyeSBhcyB0aGUgdXNlciB0eXBlcyBpbnN0ZWFkIG9mIGNhY2hpbmcgdGhlIGZpcnN0IChvZnRlbiBlbXB0eSkgcmVzdWx0LlxuICAgICAgICAgICAgICAgIGluY29tcGxldGU6ICBBcnJheS5pc0FycmF5KHJlc3VsdCkgPyBmYWxzZSA6ICEhcmVzdWx0Py5pc0luY29tcGxldGUsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvLyBSZXNvbHZlIGRvY3VtZW50YXRpb24gYW5kLCBjcnVjaWFsbHksIHRoZSBhdXRvLWltcG9ydCBhZGRpdGlvbmFsVGV4dEVkaXRzIHdoaWNoIEpEVC5MUyBvbmx5XG4gICAgICAgIC8vIGF0dGFjaGVzIG9uIHJlc29sdmUgXHUyMDE0IHNlbGVjdGluZyBhIHR5cGUgdGhlbiBpbnNlcnRzIGl0cyBpbXBvcnQgc3RhdGVtZW50LlxuICAgICAgICByZXNvbHZlQ29tcGxldGlvbkl0ZW06IGFzeW5jIChpdGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsc3AgPSAoaXRlbSBhcyBNb25hY29Db21wbGV0aW9uSXRlbSkuX2xzcDtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWxzcCkgcmV0dXJuIGl0ZW07XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkOiBDb21wbGV0aW9uSXRlbSA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCdjb21wbGV0aW9uSXRlbS9yZXNvbHZlJywgbHNwKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQuZG9jdW1lbnRhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBpdGVtLmRvY3VtZW50YXRpb24gPSB7IHZhbHVlOiBtYXJrdXBUb1N0cmluZyhyZXNvbHZlZC5kb2N1bWVudGF0aW9uKSwgaXNUcnVzdGVkOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQuZGV0YWlsKSBpdGVtLmRldGFpbCA9IHJlc29sdmVkLmRldGFpbDtcbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQuYWRkaXRpb25hbFRleHRFZGl0cz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uYWRkaXRpb25hbFRleHRFZGl0cyA9IHJlc29sdmVkLmFkZGl0aW9uYWxUZXh0RWRpdHMubWFwKHRleHRFZGl0VG9Nb25hY28pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKCdbamF2YS1sc3BdIGNvbXBsZXRpb24gcmVzb2x2ZSBmYWlsZWQ6JywgKGUgYXMgRXJyb3IpPy5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckhvdmVyUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVIb3ZlcjogYXN5bmMgKG1vZGVsLCBwb3NpdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBmaWxlVXJpID0gbW9kZWwudXJpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IEhvdmVyIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvaG92ZXInLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogZmlsZVVyaSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0Py5jb250ZW50cykgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50cyA9IEFycmF5LmlzQXJyYXkocmVzdWx0LmNvbnRlbnRzKSA/IHJlc3VsdC5jb250ZW50cyA6IFtyZXN1bHQuY29udGVudHNdO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjb250ZW50czogY29udGVudHMubWFwKGMgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHR5cGVvZiBjID09PSAnc3RyaW5nJyA/IGMgOiAoYyBhcyBNYXJrdXBDb250ZW50KS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgaXNUcnVzdGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgcmFuZ2U6IHJlc3VsdC5yYW5nZSA/IGxzcFJhbmdlVG9Nb25hY28ocmVzdWx0LnJhbmdlKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyU2lnbmF0dXJlSGVscFByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBzaWduYXR1cmVIZWxwVHJpZ2dlckNoYXJhY3RlcnM6IFsnKCcsICcsJ10sXG4gICAgICAgIHByb3ZpZGVTaWduYXR1cmVIZWxwOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVVcmkgPSBtb2RlbC51cmkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogU2lnbmF0dXJlSGVscCB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L3NpZ25hdHVyZUhlbHAnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogZmlsZVVyaSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlczogcmVzdWx0LnNpZ25hdHVyZXMubWFwKChzaWc6IFNpZ25hdHVyZUluZm9ybWF0aW9uKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICAgICAgICAgc2lnLmxhYmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRhdGlvbjogc2lnLmRvY3VtZW50YXRpb24gPyBtYXJrdXBUb1N0cmluZyhzaWcuZG9jdW1lbnRhdGlvbikgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiAgICAoc2lnLnBhcmFtZXRlcnMgPz8gW10pLm1hcCgocDogUGFyYW1ldGVySW5mb3JtYXRpb24pID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICAgICAgICAgcC5sYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudGF0aW9uOiBwLmRvY3VtZW50YXRpb24gPyBtYXJrdXBUb1N0cmluZyhwLmRvY3VtZW50YXRpb24pIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZVNpZ25hdHVyZTogcmVzdWx0LmFjdGl2ZVNpZ25hdHVyZSA/PyAwLFxuICAgICAgICAgICAgICAgICAgICBhY3RpdmVQYXJhbWV0ZXI6IHJlc3VsdC5hY3RpdmVQYXJhbWV0ZXIgPz8gMCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGRpc3Bvc2U6ICgpID0+IHt9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJEZWZpbml0aW9uUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVEZWZpbml0aW9uOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVVcmkgPSBtb2RlbC51cmkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogTG9jYXRpb24gfCBMb2NhdGlvbltdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvZGVmaW5pdGlvbicsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBmaWxlVXJpIH0sXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgbG9jYXRpb25zID0gKEFycmF5LmlzQXJyYXkocmVzdWx0KSA/IHJlc3VsdCA6IFtyZXN1bHRdKS5tYXAobG9jID0+ICh7XG4gICAgICAgICAgICAgICAgdXJpOiAgIG1vbmFjby5VcmkucGFyc2UobG9jLnVyaSksXG4gICAgICAgICAgICAgICAgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28obG9jLnJhbmdlKSxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIGF3YWl0IGVuc3VyZU1vZGVsc0ZvckxvY2F0aW9ucyhsb2NhdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGxvY2F0aW9ucztcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJSZWZlcmVuY2VQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZVJlZmVyZW5jZXM6IGFzeW5jIChtb2RlbCwgcG9zaXRpb24sIGNvbnRleHQpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBMb2NhdGlvbltdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvcmVmZXJlbmNlcycsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICAgICAgY29udGV4dDogICAgICB7IGluY2x1ZGVEZWNsYXJhdGlvbjogY29udGV4dC5pbmNsdWRlRGVjbGFyYXRpb24gfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgbG9jYXRpb25zID0gcmVzdWx0Lm1hcChsb2MgPT4gKHsgdXJpOiBtb25hY28uVXJpLnBhcnNlKGxvYy51cmkpLCByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhsb2MucmFuZ2UpIH0pKTtcbiAgICAgICAgICAgIC8vIFRoZSByZWZlcmVuY2VzIHBlZWsgY2FuIG9ubHkgc2hvdyBhIGNvZGUgcHJldmlldyBmb3IgZmlsZXMgaXQgaGFzIGEgbW9kZWwgZm9yOyBjcmVhdGVcbiAgICAgICAgICAgIC8vIGluLW1lbW9yeSBtb2RlbHMgZm9yIHRoZSByZWZlcmVuY2VkIChwb3NzaWJseSB1bm9wZW5lZCkgZmlsZXMgc28gcHJldmlld3MgcmVuZGVyLlxuICAgICAgICAgICAgYXdhaXQgZW5zdXJlTW9kZWxzRm9yTG9jYXRpb25zKGxvY2F0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gbG9jYXRpb25zO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlclJlbmFtZVByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlUmVuYW1lRWRpdHM6IGFzeW5jIChtb2RlbCwgcG9zaXRpb24sIG5ld05hbWUpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiB7IGVkaXRzOiBbXSB9O1xuICAgICAgICAgICAgY29uc3QgZWRpdDogV29ya3NwYWNlRWRpdCB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L3JlbmFtZScsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICAgICAgbmV3TmFtZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFlZGl0KSByZXR1cm4geyBlZGl0czogW10gfTtcbiAgICAgICAgICAgIC8vIEEgSkRULkxTIHJlbmFtZSBjYW4gc3BhbiBtYW55IGZpbGVzIGFuZCBldmVuIHJlbmFtZSB0aGUgdHlwZSdzIG93biAuamF2YSBmaWxlLiBNb25hY28nc1xuICAgICAgICAgICAgLy8gc2luZ2xlLWZpbGUgZWRpdG9yIHdvdWxkIGRyb3AgZXZlcnl0aGluZyBidXQgdGhlIGN1cnJlbnQgbW9kZWwsIHNvIGFwcGx5IHRoZSB3aG9sZSBlZGl0XG4gICAgICAgICAgICAvLyB0aHJvdWdoIHRoZSB3b3Jrc3BhY2Ugb3Vyc2VsdmVzIHdoZW4gdGhlIElERSBwZXJzaXN0ZW5jZSBob29rIGlzIGF2YWlsYWJsZS5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgKGdsb2JhbFRoaXMgYXMgYW55KS5qYXZhTHNwUGVyc2lzdFJlbmFtZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGFwcGx5UmVuYW1lQWNyb3NzV29ya3NwYWNlKG1vZGVsLCBlZGl0KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZWRpdHM6IFtdIH07XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbamF2YS1sc3BdIGNyb3NzLWZpbGUgcmVuYW1lIGZhaWxlZCwgYXBwbHlpbmcgdG8gdGhlIGN1cnJlbnQgZmlsZSBvbmx5OicsIGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gd29ya3NwYWNlRWRpdFRvTW9uYWNvKGVkaXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB3b3Jrc3BhY2VFZGl0VG9Nb25hY28oZWRpdCk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlc29sdmVSZW5hbWVMb2NhdGlvbjogYXN5bmMgKG1vZGVsLCBwb3NpdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogeyByYW5nZTogTHNwUmFuZ2U7IHBsYWNlaG9sZGVyPzogc3RyaW5nIH0gfCBMc3BSYW5nZSB8IG51bGwgPVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L3ByZXBhcmVSZW5hbWUnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gJ3JhbmdlJyBpbiByZXN1bHQgPyByZXN1bHQucmFuZ2UgOiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSAncGxhY2Vob2xkZXInIGluIHJlc3VsdCAmJiByZXN1bHQucGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICAgICAgPyByZXN1bHQucGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICAgICAgOiBtb2RlbC5nZXRXb3JkQXRQb3NpdGlvbihwb3NpdGlvbik/LndvcmQgPz8gJyc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28ocmFuZ2UpLCB0ZXh0OiBwbGFjZWhvbGRlciB9O1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgY29uc3Qgd29yZCA9IG1vZGVsLmdldFdvcmRBdFBvc2l0aW9uKHBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gd29yZCA/IHtcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2U6IHsgc3RhcnRMaW5lTnVtYmVyOiBwb3NpdGlvbi5saW5lTnVtYmVyLCBzdGFydENvbHVtbjogd29yZC5zdGFydENvbHVtbiwgZW5kTGluZU51bWJlcjogcG9zaXRpb24ubGluZU51bWJlciwgZW5kQ29sdW1uOiB3b3JkLmVuZENvbHVtbiB9LFxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiB3b3JkLndvcmQsXG4gICAgICAgICAgICAgICAgfSA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBSZWdpc3RlcmluZyB0aGlzIHByb3ZpZGVyIGFsc28gZW5hYmxlcyBlZGl0b3IuanMncyBleGlzdGluZyBmb3JtYXQtb24tc2F2ZSBwYXRoIGZvciBKYXZhOiB0aGVcbiAgICAvLyBzaGFyZWQgU2F2ZSBhY3Rpb24gcnVucyBlZGl0b3IuYWN0aW9uLmZvcm1hdERvY3VtZW50IHdoZW4gYXV0by1mb3JtYXR0aW5nIGlzIG9uICh0aGUgc2FtZVxuICAgIC8vIG1lY2hhbmlzbSBhbmQgZ2xvYmFsIHRvZ2dsZSB1c2VkIGZvciBUeXBlU2NyaXB0KS5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyRG9jdW1lbnRGb3JtYXR0aW5nRWRpdFByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlRG9jdW1lbnRGb3JtYXR0aW5nRWRpdHM6IGFzeW5jIChtb2RlbCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBlZGl0czogVGV4dEVkaXRbXSB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L2Zvcm1hdHRpbmcnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiAgICAgIHsgdGFiU2l6ZTogbW9kZWwuZ2V0T3B0aW9ucygpLnRhYlNpemUsIGluc2VydFNwYWNlczogbW9kZWwuZ2V0T3B0aW9ucygpLmluc2VydFNwYWNlcyB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gZWRpdHMgPyBlZGl0cy5tYXAodGV4dEVkaXRUb01vbmFjbykgOiBudWxsO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckNvZGVBY3Rpb25Qcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZUNvZGVBY3Rpb25zOiBhc3luYyAobW9kZWwsIHJhbmdlLCBjb250ZXh0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbXB0eSA9IHsgYWN0aW9uczogW10sIGRpc3Bvc2UoKSB7IC8qIG5vdGhpbmcgdG8gZGlzcG9zZSAqLyB9IH07XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gZW1wdHk7XG4gICAgICAgICAgICAvLyBTZW5kIHRoZSBvcmlnaW5hbCBMU1AgZGlhZ25vc3RpY3MgdGhhdCBvdmVybGFwIHRoZSByYW5nZSAodGhleSBjYXJyeSB0aGUgY29kZS9kYXRhIEpEVC5MU1xuICAgICAgICAgICAgLy8gbmVlZHMgdG8gY29tcHV0ZSBxdWljay1maXhlcyksIG5vdCBvbmVzIHJlY29uc3RydWN0ZWQgZnJvbSBNb25hY28gbWFya2Vycy5cbiAgICAgICAgICAgIGNvbnN0IGxzcFJhbmdlID0gbW9uYWNvUmFuZ2VUb0xzcChyYW5nZSk7XG4gICAgICAgICAgICBjb25zdCBkaWFnbm9zdGljcyA9IChfZGlhZ25vc3RpY3MuZ2V0KG1vZGVsLnVyaS50b1N0cmluZygpKSA/PyBbXSkuZmlsdGVyKGQgPT4gcmFuZ2VzT3ZlcmxhcChkLnJhbmdlLCBsc3BSYW5nZSkpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBBcnJheTxDb2RlQWN0aW9uIHwgQ29tbWFuZD4gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9jb2RlQWN0aW9uJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICAgICAgcmFuZ2U6ICAgICAgICBsc3BSYW5nZSxcbiAgICAgICAgICAgICAgICBjb250ZXh0OiAgICAgIHsgZGlhZ25vc3RpY3MsIG9ubHk6IGNvbnRleHQub25seSA/IFtjb250ZXh0Lm9ubHldIDogdW5kZWZpbmVkIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0Py5sZW5ndGgpIHJldHVybiBlbXB0eTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgYWN0aW9uczogcmVzdWx0Lm1hcChsc3BDb2RlQWN0aW9uVG9Nb25hY28pLFxuICAgICAgICAgICAgICAgIGRpc3Bvc2UoKSB7IC8qIG5vdGhpbmcgdG8gZGlzcG9zZSAqLyB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICB9LCB7XG4gICAgICAgIHByb3ZpZGVkQ29kZUFjdGlvbktpbmRzOiBbJ3F1aWNrZml4JywgJ3JlZmFjdG9yJywgJ3JlZmFjdG9yLmV4dHJhY3QnLCAncmVmYWN0b3IuaW5saW5lJyxcbiAgICAgICAgICAgICdyZWZhY3Rvci5yZXdyaXRlJywgJ3NvdXJjZScsICdzb3VyY2Uub3JnYW5pemVJbXBvcnRzJ10sXG4gICAgfSk7XG5cbiAgICAvLyAtLS0gTmF2aWdhdGlvbiAmIHN0cnVjdHVyZSAoUGFjayAxKSAtLS1cblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJJbXBsZW1lbnRhdGlvblByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlSW1wbGVtZW50YXRpb246IChtb2RlbCwgcG9zaXRpb24pID0+IHJlcXVlc3RMb2NhdGlvbnMoJ3RleHREb2N1bWVudC9pbXBsZW1lbnRhdGlvbicsIG1vZGVsLCBwb3NpdGlvbiksXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyVHlwZURlZmluaXRpb25Qcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZVR5cGVEZWZpbml0aW9uOiAobW9kZWwsIHBvc2l0aW9uKSA9PiByZXF1ZXN0TG9jYXRpb25zKCd0ZXh0RG9jdW1lbnQvdHlwZURlZmluaXRpb24nLCBtb2RlbCwgcG9zaXRpb24pLFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckRvY3VtZW50SGlnaGxpZ2h0UHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVEb2N1bWVudEhpZ2hsaWdodHM6IGFzeW5jIChtb2RlbCwgcG9zaXRpb24pID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBhbnlbXSB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L2RvY3VtZW50SGlnaGxpZ2h0Jywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5tYXAoaCA9PiAoeyByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhoLnJhbmdlKSwga2luZDogaC5raW5kID8gaC5raW5kIC0gMSA6IHVuZGVmaW5lZCB9KSk7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyRG9jdW1lbnRTeW1ib2xQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZURvY3VtZW50U3ltYm9sczogYXN5bmMgKG1vZGVsKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55W10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9kb2N1bWVudFN5bWJvbCcsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0ID8gbWFwRG9jdW1lbnRTeW1ib2xzKHJlc3VsdCkgOiBudWxsO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckZvbGRpbmdSYW5nZVByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlRm9sZGluZ1JhbmdlczogYXN5bmMgKG1vZGVsKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55W10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9mb2xkaW5nUmFuZ2UnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5tYXAociA9PiAoeyBzdGFydDogci5zdGFydExpbmUgKyAxLCBlbmQ6IHIuZW5kTGluZSArIDEsIGtpbmQ6IGZvbGRpbmdLaW5kKHIua2luZCkgfSkpO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlclNlbGVjdGlvblJhbmdlUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVTZWxlY3Rpb25SYW5nZXM6IGFzeW5jIChtb2RlbCwgcG9zaXRpb25zKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55W10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9zZWxlY3Rpb25SYW5nZScsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uczogICAgcG9zaXRpb25zLm1hcChwID0+ICh7IGxpbmU6IHAubGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogcC5jb2x1bW4gLSAxIH0pKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5tYXAoZmxhdHRlblNlbGVjdGlvblJhbmdlKTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJEb2N1bWVudFJhbmdlRm9ybWF0dGluZ0VkaXRQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZURvY3VtZW50UmFuZ2VGb3JtYXR0aW5nRWRpdHM6IGFzeW5jIChtb2RlbCwgcmFuZ2UpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgZWRpdHM6IFRleHRFZGl0W10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9yYW5nZUZvcm1hdHRpbmcnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgICAgICByYW5nZTogICAgICAgIG1vbmFjb1JhbmdlVG9Mc3AocmFuZ2UpLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6ICAgICAgeyB0YWJTaXplOiBtb2RlbC5nZXRPcHRpb25zKCkudGFiU2l6ZSwgaW5zZXJ0U3BhY2VzOiBtb2RlbC5nZXRPcHRpb25zKCkuaW5zZXJ0U3BhY2VzIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBlZGl0cyA/IGVkaXRzLm1hcCh0ZXh0RWRpdFRvTW9uYWNvKSA6IG51bGw7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyAtLS0gSW5sYXkgaGludHMgKyBzZW1hbnRpYyBoaWdobGlnaHRpbmcgKFBhY2sgMikgLS0tXG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVySW5sYXlIaW50c1Byb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlSW5sYXlIaW50czogYXN5bmMgKG1vZGVsLCByYW5nZSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IGFueVtdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvaW5sYXlIaW50Jywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICAgICAgcmFuZ2U6ICAgICAgICBtb25hY29SYW5nZVRvTHNwKHJhbmdlKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBoaW50czogcmVzdWx0Lm1hcChoID0+ICh7XG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lTnVtYmVyOiBoLnBvc2l0aW9uLmxpbmUgKyAxLCBjb2x1bW46IGgucG9zaXRpb24uY2hhcmFjdGVyICsgMSB9LFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogICAgICAgIHR5cGVvZiBoLmxhYmVsID09PSAnc3RyaW5nJyA/IGgubGFiZWwgOiAoaC5sYWJlbCA/PyBbXSkubWFwKChwOiBhbnkpID0+ICh7IGxhYmVsOiBwLnZhbHVlIH0pKSxcbiAgICAgICAgICAgICAgICAgICAga2luZDogICAgICAgICBoLmtpbmQsXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmdMZWZ0OiAgaC5wYWRkaW5nTGVmdCxcbiAgICAgICAgICAgICAgICAgICAgcGFkZGluZ1JpZ2h0OiBoLnBhZGRpbmdSaWdodCxcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcDogICAgICBoLnRvb2x0aXAgPyBtYXJrdXBUb1N0cmluZyhoLnRvb2x0aXApIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgICBkaXNwb3NlKCkgeyAvKiBub3RoaW5nIHRvIGRpc3Bvc2UgKi8gfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyRG9jdW1lbnRTZW1hbnRpY1Rva2Vuc1Byb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBnZXRMZWdlbmQ6ICgpID0+IF9zZW1hbnRpY1Rva2Vuc0xlZ2VuZCA/PyB7IHRva2VuVHlwZXM6IFtdLCB0b2tlbk1vZGlmaWVyczogW10gfSxcbiAgICAgICAgcHJvdmlkZURvY3VtZW50U2VtYW50aWNUb2tlbnM6IGFzeW5jIChtb2RlbCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSB8fCAhX3NlbWFudGljVG9rZW5zTGVnZW5kKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogeyBkYXRhOiBudW1iZXJbXTsgcmVzdWx0SWQ/OiBzdHJpbmcgfSB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L3NlbWFudGljVG9rZW5zL2Z1bGwnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQ/LmRhdGEpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogbmV3IFVpbnQzMkFycmF5KHJlc3VsdC5kYXRhKSwgcmVzdWx0SWQ6IHJlc3VsdC5yZXN1bHRJZCB9O1xuICAgICAgICB9LFxuICAgICAgICByZWxlYXNlRG9jdW1lbnRTZW1hbnRpY1Rva2VuczogKCkgPT4geyAvKiBub3RoaW5nIHRvIHJlbGVhc2UgKi8gfSxcbiAgICB9KTtcblxuICAgIC8vIC0tLSBDb2RlTGVucyAoUGFjayAzKSAtLS1cblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJDb2RlTGVuc1Byb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlQ29kZUxlbnNlczogYXN5bmMgKG1vZGVsKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4geyBsZW5zZXM6IFtdLCBkaXNwb3NlKCkgeyAvKiAqLyB9IH07XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IGFueVtdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvY29kZUxlbnMnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgbGVuc2VzID0gKHJlc3VsdCA/PyBbXSkubWFwKChsZW5zLCBpKSA9PiAoe1xuICAgICAgICAgICAgICAgIHJhbmdlOiAgICBsc3BSYW5nZVRvTW9uYWNvKGxlbnMucmFuZ2UpLFxuICAgICAgICAgICAgICAgIGlkOiAgICAgICBTdHJpbmcoaSksXG4gICAgICAgICAgICAgICAgY29tbWFuZDogIGxlbnMuY29tbWFuZCA/IG1hcExlbnNDb21tYW5kKGxlbnMuY29tbWFuZCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgX2xzcDogICAgIGxlbnMsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICByZXR1cm4geyBsZW5zZXMsIGRpc3Bvc2UoKSB7IC8qICovIH0gfTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVzb2x2ZUNvZGVMZW5zOiBhc3luYyAoX21vZGVsLCBjb2RlTGVucykgPT4ge1xuICAgICAgICAgICAgY29uc3QgbHNwID0gKGNvZGVMZW5zIGFzIGFueSkuX2xzcDtcbiAgICAgICAgICAgIGlmIChfY29ubiAmJiBsc3AgJiYgIWxzcC5jb21tYW5kKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWQ6IGFueSA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCdjb2RlTGVucy9yZXNvbHZlJywgbHNwKTtcbiAgICAgICAgICAgICAgICAgICAgY29kZUxlbnMuY29tbWFuZCA9IHJlc29sdmVkPy5jb21tYW5kID8gbWFwTGVuc0NvbW1hbmQocmVzb2x2ZWQuY29tbWFuZCkgOiB7IGlkOiBOT09QX0NPTU1BTkQsIHRpdGxlOiAnJyB9O1xuICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICBjb2RlTGVucy5jb21tYW5kID0geyBpZDogTk9PUF9DT01NQU5ELCB0aXRsZTogJycgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29kZUxlbnM7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyAtLS0gSmF2YSBrZXl3b3JkIGNvbXBsZXRpb24gKFBhY2sgMWIpOiBhbHdheXMtYXZhaWxhYmxlLCByYW5rZWQgYmVsb3cgU0RLL0xTUCByZXN1bHRzIC0tLVxuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckNvbXBsZXRpb25JdGVtUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVDb21wbGV0aW9uSXRlbXM6IChtb2RlbCwgcG9zaXRpb24pID0+IHtcbiAgICAgICAgICAgIGlmICghaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCB3b3JkID0gbW9kZWwuZ2V0V29yZFVudGlsUG9zaXRpb24ocG9zaXRpb24pO1xuICAgICAgICAgICAgY29uc3QgcmFuZ2U6IG1vbmFjby5JUmFuZ2UgPSB7XG4gICAgICAgICAgICAgICAgc3RhcnRMaW5lTnVtYmVyOiBwb3NpdGlvbi5saW5lTnVtYmVyLCBzdGFydENvbHVtbjogd29yZC5zdGFydENvbHVtbixcbiAgICAgICAgICAgICAgICBlbmRMaW5lTnVtYmVyOiAgIHBvc2l0aW9uLmxpbmVOdW1iZXIsIGVuZENvbHVtbjogICB3b3JkLmVuZENvbHVtbixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb25zOiBKQVZBX0tFWVdPUkRTLm1hcChrZXl3b3JkID0+ICh7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAgICAgIGtleXdvcmQsXG4gICAgICAgICAgICAgICAgICAgIGtpbmQ6ICAgICAgIG1vbmFjby5sYW5ndWFnZXMuQ29tcGxldGlvbkl0ZW1LaW5kLktleXdvcmQsXG4gICAgICAgICAgICAgICAgICAgIGluc2VydFRleHQ6IGtleXdvcmQsXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlLFxuICAgICAgICAgICAgICAgICAgICBzb3J0VGV4dDogICBgOV8ke2tleXdvcmR9YCxcbiAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgIH0pO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBIZWxwZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIGxzcFNldmVyaXR5KHNldmVyaXR5OiBEaWFnbm9zdGljU2V2ZXJpdHkgfCB1bmRlZmluZWQpOiBtb25hY28uTWFya2VyU2V2ZXJpdHkge1xuICAgIHN3aXRjaCAoc2V2ZXJpdHkpIHtcbiAgICAgICAgY2FzZSBEaWFnbm9zdGljU2V2ZXJpdHkuRXJyb3I6ICAgICAgIHJldHVybiBtb25hY28uTWFya2VyU2V2ZXJpdHkuRXJyb3I7XG4gICAgICAgIGNhc2UgRGlhZ25vc3RpY1NldmVyaXR5Lldhcm5pbmc6ICAgICByZXR1cm4gbW9uYWNvLk1hcmtlclNldmVyaXR5Lldhcm5pbmc7XG4gICAgICAgIGNhc2UgRGlhZ25vc3RpY1NldmVyaXR5LkluZm9ybWF0aW9uOiByZXR1cm4gbW9uYWNvLk1hcmtlclNldmVyaXR5LkluZm87XG4gICAgICAgIGNhc2UgRGlhZ25vc3RpY1NldmVyaXR5LkhpbnQ6ICAgICAgICByZXR1cm4gbW9uYWNvLk1hcmtlclNldmVyaXR5LkhpbnQ7XG4gICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9uYWNvLk1hcmtlclNldmVyaXR5LkVycm9yO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gbHNwUmFuZ2VUb01vbmFjbyhyOiB7IHN0YXJ0OiB7IGxpbmU6IG51bWJlcjsgY2hhcmFjdGVyOiBudW1iZXIgfTsgZW5kOiB7IGxpbmU6IG51bWJlcjsgY2hhcmFjdGVyOiBudW1iZXIgfSB9KTogbW9uYWNvLklSYW5nZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnRMaW5lTnVtYmVyOiByLnN0YXJ0LmxpbmUgKyAxLFxuICAgICAgICBzdGFydENvbHVtbjogICAgIHIuc3RhcnQuY2hhcmFjdGVyICsgMSxcbiAgICAgICAgZW5kTGluZU51bWJlcjogICByLmVuZC5saW5lICsgMSxcbiAgICAgICAgZW5kQ29sdW1uOiAgICAgICByLmVuZC5jaGFyYWN0ZXIgKyAxLFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIG1hcmt1cFRvU3RyaW5nKGM6IHN0cmluZyB8IE1hcmt1cENvbnRlbnQpOiBzdHJpbmcge1xuICAgIHJldHVybiB0eXBlb2YgYyA9PT0gJ3N0cmluZycgPyBjIDogYy52YWx1ZTtcbn1cblxuZnVuY3Rpb24gbHNwQ29tcGxldGlvbktpbmQoa2luZDogQ29tcGxldGlvbkl0ZW1LaW5kIHwgdW5kZWZpbmVkKTogbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbUtpbmQge1xuICAgIGNvbnN0IEsgPSBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtS2luZDtcbiAgICBzd2l0Y2ggKGtpbmQpIHtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuVGV4dDogICAgICAgICAgcmV0dXJuIEsuVGV4dDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuTWV0aG9kOiAgICAgICAgcmV0dXJuIEsuTWV0aG9kO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5GdW5jdGlvbjogICAgICByZXR1cm4gSy5GdW5jdGlvbjtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuQ29uc3RydWN0b3I6ICAgcmV0dXJuIEsuQ29uc3RydWN0b3I7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLkZpZWxkOiAgICAgICAgIHJldHVybiBLLkZpZWxkO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5WYXJpYWJsZTogICAgICByZXR1cm4gSy5WYXJpYWJsZTtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuQ2xhc3M6ICAgICAgICAgcmV0dXJuIEsuQ2xhc3M7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLkludGVyZmFjZTogICAgIHJldHVybiBLLkludGVyZmFjZTtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuTW9kdWxlOiAgICAgICAgcmV0dXJuIEsuTW9kdWxlO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5Qcm9wZXJ0eTogICAgICByZXR1cm4gSy5Qcm9wZXJ0eTtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuS2V5d29yZDogICAgICAgcmV0dXJuIEsuS2V5d29yZDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuU25pcHBldDogICAgICAgcmV0dXJuIEsuU25pcHBldDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuQ29uc3RhbnQ6ICAgICAgcmV0dXJuIEsuQ29uc3RhbnQ7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLlN0cnVjdDogICAgICAgIHJldHVybiBLLlN0cnVjdDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuVHlwZVBhcmFtZXRlcjogcmV0dXJuIEsuVHlwZVBhcmFtZXRlcjtcbiAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEsuVGV4dDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGxzcENvbXBsZXRpb25Ub01vbmFjbyhcbiAgICBpdGVtOiBDb21wbGV0aW9uSXRlbSxcbiAgICBtb2RlbDogbW9uYWNvLmVkaXRvci5JVGV4dE1vZGVsLFxuICAgIHBvc2l0aW9uOiBtb25hY28uUG9zaXRpb24sXG4pOiBNb25hY29Db21wbGV0aW9uSXRlbSB7XG4gICAgY29uc3Qgd29yZCA9IG1vZGVsLmdldFdvcmRVbnRpbFBvc2l0aW9uKHBvc2l0aW9uKTtcbiAgICBsZXQgcmFuZ2U6IG1vbmFjby5JUmFuZ2UgPSB7XG4gICAgICAgIHN0YXJ0TGluZU51bWJlcjogcG9zaXRpb24ubGluZU51bWJlcixcbiAgICAgICAgc3RhcnRDb2x1bW46ICAgICB3b3JkLnN0YXJ0Q29sdW1uLFxuICAgICAgICBlbmRMaW5lTnVtYmVyOiAgIHBvc2l0aW9uLmxpbmVOdW1iZXIsXG4gICAgICAgIGVuZENvbHVtbjogICAgICAgd29yZC5lbmRDb2x1bW4sXG4gICAgfTtcbiAgICBsZXQgaW5zZXJ0VGV4dCA9IGl0ZW0uaW5zZXJ0VGV4dCA/PyBpdGVtLmxhYmVsO1xuICAgIGNvbnN0IHRleHRFZGl0ID0gaXRlbS50ZXh0RWRpdCBhcyB7IHJhbmdlPzogTHNwUmFuZ2U7IHJlcGxhY2U/OiBMc3BSYW5nZTsgaW5zZXJ0PzogTHNwUmFuZ2U7IG5ld1RleHQ/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcbiAgICBpZiAodGV4dEVkaXQpIHtcbiAgICAgICAgY29uc3QgciA9IHRleHRFZGl0LnJhbmdlID8/IHRleHRFZGl0LnJlcGxhY2UgPz8gdGV4dEVkaXQuaW5zZXJ0O1xuICAgICAgICBpZiAocikgcmFuZ2UgPSBsc3BSYW5nZVRvTW9uYWNvKHIpO1xuICAgICAgICBpZiAodHlwZW9mIHRleHRFZGl0Lm5ld1RleHQgPT09ICdzdHJpbmcnKSBpbnNlcnRUZXh0ID0gdGV4dEVkaXQubmV3VGV4dDtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0OiBNb25hY29Db21wbGV0aW9uSXRlbSA9IHtcbiAgICAgICAgbGFiZWw6ICAgICAgICAgICBpdGVtLmxhYmVsLFxuICAgICAgICBraW5kOiAgICAgICAgICAgIGxzcENvbXBsZXRpb25LaW5kKGl0ZW0ua2luZCksXG4gICAgICAgIGRldGFpbDogICAgICAgICAgaXRlbS5kZXRhaWwsXG4gICAgICAgIGRvY3VtZW50YXRpb246ICAgaXRlbS5kb2N1bWVudGF0aW9uID8geyB2YWx1ZTogbWFya3VwVG9TdHJpbmcoaXRlbS5kb2N1bWVudGF0aW9uKSwgaXNUcnVzdGVkOiBmYWxzZSB9IDogdW5kZWZpbmVkLFxuICAgICAgICBpbnNlcnRUZXh0LFxuICAgICAgICBpbnNlcnRUZXh0UnVsZXM6IGl0ZW0uaW5zZXJ0VGV4dEZvcm1hdCA9PT0gSW5zZXJ0VGV4dEZvcm1hdC5TbmlwcGV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbUluc2VydFRleHRSdWxlLkluc2VydEFzU25pcHBldFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgcmFuZ2UsXG4gICAgICAgIHNvcnRUZXh0OiAgICAgICAgICAgIHNka1ByaW9yaXRpc2VkU29ydFRleHQoaXRlbSksXG4gICAgICAgIGZpbHRlclRleHQ6ICAgICAgICAgIGl0ZW0uZmlsdGVyVGV4dCxcbiAgICAgICAgcHJlc2VsZWN0OiAgICAgICAgICAgaXRlbS5wcmVzZWxlY3QsXG4gICAgICAgIGNvbW1pdENoYXJhY3RlcnM6ICAgIGl0ZW0uY29tbWl0Q2hhcmFjdGVycyxcbiAgICAgICAgYWRkaXRpb25hbFRleHRFZGl0czogaXRlbS5hZGRpdGlvbmFsVGV4dEVkaXRzPy5tYXAodGV4dEVkaXRUb01vbmFjbyksXG4gICAgfTtcbiAgICByZXN1bHQuX2xzcCA9IGl0ZW07XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBSYW5rcyBEaXJpZ2libGUgU0RLIHN1Z2dlc3Rpb25zICh7QGNvZGUgb3JnLmVjbGlwc2UuZGlyaWdpYmxlLnNkay4qfSkgYWJvdmUgZXZlcnl0aGluZyBlbHNlIGJ5XG4gKiBwcmVmaXhpbmcgdGhlIHNlcnZlciBzb3J0VGV4dCB3aXRoIGEgcHJpb3JpdHkgYnVja2V0LCBwcmVzZXJ2aW5nIHRoZSBzZXJ2ZXIgb3JkZXIgd2l0aGluIGVhY2ggYnVja2V0LlxuICovXG5mdW5jdGlvbiBzZGtQcmlvcml0aXNlZFNvcnRUZXh0KGl0ZW06IENvbXBsZXRpb25JdGVtKTogc3RyaW5nIHtcbiAgICBjb25zdCBiYXNlID0gaXRlbS5zb3J0VGV4dCA/PyAodHlwZW9mIGl0ZW0ubGFiZWwgPT09ICdzdHJpbmcnID8gaXRlbS5sYWJlbCA6ICcnKTtcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IChpdGVtLmxhYmVsRGV0YWlscyAmJiB0eXBlb2YgaXRlbS5sYWJlbERldGFpbHMuZGVzY3JpcHRpb24gPT09ICdzdHJpbmcnKVxuICAgICAgICA/IGl0ZW0ubGFiZWxEZXRhaWxzLmRlc2NyaXB0aW9uIDogJyc7XG4gICAgY29uc3QgaGF5c3RhY2sgPSBgJHtpdGVtLmRldGFpbCA/PyAnJ30gJHtkZXNjcmlwdGlvbn1gO1xuICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcygnb3JnLmVjbGlwc2UuZGlyaWdpYmxlLnNkaycpID8gYDBfJHtiYXNlfWAgOiBgMV8ke2Jhc2V9YDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ29kZSBhY3Rpb25zLCBjb21tYW5kcywgcmVmYWN0b3IvZ2VuZXJhdGUsIHdvcmtzcGFjZSBlZGl0c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogTW9uYWNvIGNvbW1hbmQgaWQgdXNlZCB0byBhcHBseSBhIGRlZmVycmVkIExTUCBjb2RlIGFjdGlvbiB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgaXQuICovXG5jb25zdCBBUFBMWV9BQ1RJT05fQ09NTUFORCA9ICdkaXJpZ2libGUuamF2YS5hcHBseUNvZGVBY3Rpb24nO1xuXG4vKiogVmlydHVhbCBVUkkgcHJlZml4IG9mIGVkaXRvciBtb2RlbHM7IHN0cmlwcGluZyBpdCB5aWVsZHMgdGhlIElERSB3b3Jrc3BhY2UgcGF0aCAoL3dzL3Byb2ovLi4uKS4gKi9cbmNvbnN0IFZJUlRVQUxfRklMRV9QUkVGSVggPSAnZmlsZTovLy93b3Jrc3BhY2UnO1xuXG4vKiogTW9uYWNvIGNvbW1hbmQgaWQgdXNlZCBmb3IgZGlzcGxheS1vbmx5IENvZGVMZW5zZXMgKGUuZy4gYSByZWZlcmVuY2UgY291bnQgd2l0aCBubyByZXNvbHZlZCBhY3Rpb24pLiAqL1xuY29uc3QgTk9PUF9DT01NQU5EID0gJ2RpcmlnaWJsZS5qYXZhLm5vb3BMZW5zJztcblxuLyoqIEphdmEgU0Uga2V5d29yZHMvbGl0ZXJhbHMgb2ZmZXJlZCBhcyBsb3ctcHJpb3JpdHkgY29tcGxldGlvbiBzbyB0aGV5IGFsd2F5cyBhcHBlYXIgd2hpbGUgdHlwaW5nLiAqL1xuY29uc3QgSkFWQV9LRVlXT1JEUyA9IFsnYWJzdHJhY3QnLCAnYXNzZXJ0JywgJ2Jvb2xlYW4nLCAnYnJlYWsnLCAnYnl0ZScsICdjYXNlJywgJ2NhdGNoJywgJ2NoYXInLCAnY2xhc3MnLFxuICAgICdjb25zdCcsICdjb250aW51ZScsICdkZWZhdWx0JywgJ2RvJywgJ2RvdWJsZScsICdlbHNlJywgJ2VudW0nLCAnZXh0ZW5kcycsICdmaW5hbCcsICdmaW5hbGx5JywgJ2Zsb2F0JyxcbiAgICAnZm9yJywgJ2dvdG8nLCAnaWYnLCAnaW1wbGVtZW50cycsICdpbXBvcnQnLCAnaW5zdGFuY2VvZicsICdpbnQnLCAnaW50ZXJmYWNlJywgJ2xvbmcnLCAnbmF0aXZlJywgJ25ldycsXG4gICAgJ3BhY2thZ2UnLCAncHJpdmF0ZScsICdwcm90ZWN0ZWQnLCAncHVibGljJywgJ3JldHVybicsICdzaG9ydCcsICdzdGF0aWMnLCAnc3RyaWN0ZnAnLCAnc3VwZXInLCAnc3dpdGNoJyxcbiAgICAnc3luY2hyb25pemVkJywgJ3RoaXMnLCAndGhyb3cnLCAndGhyb3dzJywgJ3RyYW5zaWVudCcsICd0cnknLCAndm9pZCcsICd2b2xhdGlsZScsICd3aGlsZScsICd2YXInLFxuICAgICd5aWVsZCcsICdyZWNvcmQnLCAnc2VhbGVkJywgJ3Blcm1pdHMnLCAndHJ1ZScsICdmYWxzZScsICdudWxsJ107XG5cbi8qKiBTaGFyZWQgZGVmaW5pdGlvbi1zdHlsZSBsb2NhdGlvbiByZXF1ZXN0IHVzZWQgYnkgZ28tdG8tZGVmaW5pdGlvbi9pbXBsZW1lbnRhdGlvbi90eXBlLWRlZmluaXRpb24uICovXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0TG9jYXRpb25zKG1ldGhvZDogc3RyaW5nLCBtb2RlbDogbW9uYWNvLmVkaXRvci5JVGV4dE1vZGVsLCBwb3NpdGlvbjogbW9uYWNvLlBvc2l0aW9uKSB7XG4gICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgcmVzdWx0OiBMb2NhdGlvbiB8IExvY2F0aW9uW10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QobWV0aG9kLCB7XG4gICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgfSk7XG4gICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGxvY2F0aW9ucyA9IChBcnJheS5pc0FycmF5KHJlc3VsdCkgPyByZXN1bHQgOiBbcmVzdWx0XSkubWFwKGxvYyA9PiAoeyB1cmk6IG1vbmFjby5VcmkucGFyc2UobG9jLnVyaSksIHJhbmdlOiBsc3BSYW5nZVRvTW9uYWNvKGxvYy5yYW5nZSkgfSkpO1xuICAgIGF3YWl0IGVuc3VyZU1vZGVsc0ZvckxvY2F0aW9ucyhsb2NhdGlvbnMpO1xuICAgIHJldHVybiBsb2NhdGlvbnM7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBpbi1tZW1vcnkgTW9uYWNvIG1vZGVscyBmb3IgdGhlIHdvcmtzcGFjZSBmaWxlcyByZWZlcmVuY2VkIGJ5IHRoZSBnaXZlbiBsb2NhdGlvbnMgKGZldGNoZWRcbiAqIG92ZXIgUkVTVCkgc28gdGhlIHJlZmVyZW5jZXMgLyBwZWVrIHdpZGdldHMgY2FuIHJlbmRlciBhIGNvZGUgcHJldmlldyBcdTIwMTQgTW9uYWNvIGNhbiBvbmx5IHByZXZpZXcgZmlsZXNcbiAqIGl0IGhhcyBhIG1vZGVsIGZvciwgYW5kIHRoaXMgc2luZ2xlLWZpbGUgZWRpdG9yIG90aGVyd2lzZSBoYXMgbm9uZSBmb3Igb3RoZXIgZmlsZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGVuc3VyZU1vZGVsc0ZvckxvY2F0aW9ucyhsb2NhdGlvbnM6IEFycmF5PHsgdXJpOiBtb25hY28uVXJpIH0+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKGxvY2F0aW9ucy5tYXAoYXN5bmMgKHsgdXJpIH0pID0+IHtcbiAgICAgICAgY29uc3QgdXJpU3RyID0gdXJpLnRvU3RyaW5nKCk7XG4gICAgICAgIGlmIChzZWVuLmhhcyh1cmlTdHIpIHx8ICF1cmlTdHIuc3RhcnRzV2l0aChWSVJUVUFMX0ZJTEVfUFJFRklYKSB8fCBtb25hY28uZWRpdG9yLmdldE1vZGVsKHVyaSkpIHJldHVybjtcbiAgICAgICAgc2Vlbi5hZGQodXJpU3RyKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCBmZXRjaFdvcmtzcGFjZUZpbGVUZXh0KHVyaVRvV29ya3NwYWNlUGF0aCh1cmlTdHIpID8/IHVyaVN0cik7XG4gICAgICAgICAgICBpZiAoIW1vbmFjby5lZGl0b3IuZ2V0TW9kZWwodXJpKSkgbW9uYWNvLmVkaXRvci5jcmVhdGVNb2RlbCh0ZXh0LCAnamF2YScsIHVyaSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gcHJldmlldyBqdXN0IHdvbid0IHJlbmRlciBmb3IgdGhpcyBvbmVcbiAgICAgICAgfVxuICAgIH0pKTtcbn1cblxuLyoqIFJlY3Vyc2l2ZWx5IG1hcHMgTFNQIGhpZXJhcmNoaWNhbCBEb2N1bWVudFN5bWJvbHMgdG8gTW9uYWNvJ3Mgc2hhcGUgKGtpbmRzIGFyZSAxLWJhc2VkIHZzIDAtYmFzZWQpLiAqL1xuZnVuY3Rpb24gbWFwRG9jdW1lbnRTeW1ib2xzKHN5bWJvbHM6IGFueVtdKTogbW9uYWNvLmxhbmd1YWdlcy5Eb2N1bWVudFN5bWJvbFtdIHtcbiAgICByZXR1cm4gKHN5bWJvbHMgPz8gW10pLm1hcChzID0+ICh7XG4gICAgICAgIG5hbWU6ICAgICAgICAgICBzLm5hbWUsXG4gICAgICAgIGRldGFpbDogICAgICAgICBzLmRldGFpbCA/PyAnJyxcbiAgICAgICAga2luZDogICAgICAgICAgIChzLmtpbmQgPz8gMSkgLSAxLFxuICAgICAgICB0YWdzOiAgICAgICAgICAgcy50YWdzID8/IFtdLFxuICAgICAgICByYW5nZTogICAgICAgICAgbHNwUmFuZ2VUb01vbmFjbyhzLnJhbmdlKSxcbiAgICAgICAgc2VsZWN0aW9uUmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28ocy5zZWxlY3Rpb25SYW5nZSA/PyBzLnJhbmdlKSxcbiAgICAgICAgY2hpbGRyZW46ICAgICAgIHMuY2hpbGRyZW4gPyBtYXBEb2N1bWVudFN5bWJvbHMocy5jaGlsZHJlbikgOiBbXSxcbiAgICB9KSk7XG59XG5cbmZ1bmN0aW9uIGZvbGRpbmdLaW5kKGtpbmQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IG1vbmFjby5sYW5ndWFnZXMuRm9sZGluZ1JhbmdlS2luZCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgRksgPSBtb25hY28ubGFuZ3VhZ2VzLkZvbGRpbmdSYW5nZUtpbmQ7XG4gICAgc3dpdGNoIChraW5kKSB7XG4gICAgICAgIGNhc2UgJ2NvbW1lbnQnOiByZXR1cm4gRksuQ29tbWVudDtcbiAgICAgICAgY2FzZSAnaW1wb3J0cyc6IHJldHVybiBGSy5JbXBvcnRzO1xuICAgICAgICBjYXNlICdyZWdpb24nOiAgcmV0dXJuIEZLLlJlZ2lvbjtcbiAgICAgICAgZGVmYXVsdDogICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxufVxuXG4vKiogRmxhdHRlbnMgYW4gTFNQIFNlbGVjdGlvblJhbmdlIHBhcmVudC1jaGFpbiBpbnRvIE1vbmFjbydzIGlubmVybW9zdC10by1vdXRlcm1vc3QgYXJyYXkuICovXG5mdW5jdGlvbiBmbGF0dGVuU2VsZWN0aW9uUmFuZ2Uoc2VsZWN0aW9uUmFuZ2U6IGFueSk6IG1vbmFjby5sYW5ndWFnZXMuU2VsZWN0aW9uUmFuZ2VbXSB7XG4gICAgY29uc3QgcmFuZ2VzOiBtb25hY28ubGFuZ3VhZ2VzLlNlbGVjdGlvblJhbmdlW10gPSBbXTtcbiAgICBsZXQgY3VycmVudCA9IHNlbGVjdGlvblJhbmdlO1xuICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICAgIHJhbmdlcy5wdXNoKHsgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28oY3VycmVudC5yYW5nZSkgfSk7XG4gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudDtcbiAgICB9XG4gICAgcmV0dXJuIHJhbmdlcztcbn1cblxuLyoqIE1hcHMgYSBKRFQuTFMgQ29kZUxlbnMgY29tbWFuZCB0byBhIE1vbmFjbyBjb21tYW5kLCB3aXJpbmcgdGhlIHJlZmVyZW5jZXMvaW1wbGVtZW50YXRpb25zIHBlZWsuICovXG5mdW5jdGlvbiBtYXBMZW5zQ29tbWFuZChjbWQ6IGFueSk6IG1vbmFjby5sYW5ndWFnZXMuQ29tbWFuZCB7XG4gICAgY29uc3QgYXJncyA9IGNtZC5hcmd1bWVudHMgPz8gW107XG4gICAgaWYgKChjbWQuY29tbWFuZCA9PT0gJ2phdmEuc2hvdy5yZWZlcmVuY2VzJyB8fCBjbWQuY29tbWFuZCA9PT0gJ2phdmEuc2hvdy5pbXBsZW1lbnRhdGlvbnMnKSAmJiBhcmdzLmxlbmd0aCA+PSAzKSB7XG4gICAgICAgIGNvbnN0IGxvY2F0aW9ucyA9IChhcmdzWzJdID8/IFtdKS5tYXAoKGw6IGFueSkgPT4gKHsgdXJpOiBtb25hY28uVXJpLnBhcnNlKGwudXJpKSwgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28obC5yYW5nZSkgfSkpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6ICAgICAgICAnZWRpdG9yLmFjdGlvbi5zaG93UmVmZXJlbmNlcycsXG4gICAgICAgICAgICB0aXRsZTogICAgIGNtZC50aXRsZSxcbiAgICAgICAgICAgIGFyZ3VtZW50czogW21vbmFjby5VcmkucGFyc2UoYXJnc1swXSksIHsgbGluZU51bWJlcjogYXJnc1sxXS5saW5lICsgMSwgY29sdW1uOiBhcmdzWzFdLmNoYXJhY3RlciArIDEgfSwgbG9jYXRpb25zXSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgaWQ6IE5PT1BfQ09NTUFORCwgdGl0bGU6IGNtZC50aXRsZSB9O1xufVxuXG50eXBlIExzcFJhbmdlID0geyBzdGFydDogeyBsaW5lOiBudW1iZXI7IGNoYXJhY3RlcjogbnVtYmVyIH07IGVuZDogeyBsaW5lOiBudW1iZXI7IGNoYXJhY3RlcjogbnVtYmVyIH0gfTtcblxuLyoqIE1vbmFjbyBjb21wbGV0aW9uIGl0ZW0gY2FycnlpbmcgdGhlIG9yaWdpbmF0aW5nIExTUCBpdGVtIHNvIHJlc29sdmUgY2FuIGZldGNoIGl0cyBpbXBvcnQgZWRpdHMuICovXG50eXBlIE1vbmFjb0NvbXBsZXRpb25JdGVtID0gbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbSAmIHsgX2xzcD86IENvbXBsZXRpb25JdGVtIH07XG5cbmZ1bmN0aW9uIHRleHRFZGl0VG9Nb25hY28oZWRpdDogVGV4dEVkaXQpOiBtb25hY28ubGFuZ3VhZ2VzLlRleHRFZGl0IHtcbiAgICByZXR1cm4geyByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhlZGl0LnJhbmdlKSwgdGV4dDogZWRpdC5uZXdUZXh0IH07XG59XG5cbmZ1bmN0aW9uIG1vbmFjb1JhbmdlVG9Mc3AocjogbW9uYWNvLklSYW5nZSk6IExzcFJhbmdlIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBzdGFydDogeyBsaW5lOiByLnN0YXJ0TGluZU51bWJlciAtIDEsIGNoYXJhY3Rlcjogci5zdGFydENvbHVtbiAtIDEgfSxcbiAgICAgICAgZW5kOiAgIHsgbGluZTogci5lbmRMaW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiByLmVuZENvbHVtbiAtIDEgfSxcbiAgICB9O1xufVxuXG4vKiogVHJ1ZSB3aGVuIHR3byBMU1AgcmFuZ2VzIGludGVyc2VjdCAodXNlZCB0byBwaWNrIHRoZSBkaWFnbm9zdGljcyByZWxldmFudCB0byBhIGNvZGUtYWN0aW9uIHJlcXVlc3QpLiAqL1xuZnVuY3Rpb24gcmFuZ2VzT3ZlcmxhcChhOiBMc3BSYW5nZSwgYjogTHNwUmFuZ2UpOiBib29sZWFuIHtcbiAgICBjb25zdCBub3RBZnRlciA9IChwOiB7IGxpbmU6IG51bWJlcjsgY2hhcmFjdGVyOiBudW1iZXIgfSwgcTogeyBsaW5lOiBudW1iZXI7IGNoYXJhY3RlcjogbnVtYmVyIH0pID0+XG4gICAgICAgIHAubGluZSA8IHEubGluZSB8fCAocC5saW5lID09PSBxLmxpbmUgJiYgcC5jaGFyYWN0ZXIgPD0gcS5jaGFyYWN0ZXIpO1xuICAgIHJldHVybiBub3RBZnRlcihhLnN0YXJ0LCBiLmVuZCkgJiYgbm90QWZ0ZXIoYi5zdGFydCwgYS5lbmQpO1xufVxuXG5mdW5jdGlvbiBsc3BDb2RlQWN0aW9uVG9Nb25hY28oYWN0aW9uOiBDb2RlQWN0aW9uIHwgQ29tbWFuZCk6IG1vbmFjby5sYW5ndWFnZXMuQ29kZUFjdGlvbiB7XG4gICAgY29uc3QgaXNDb21tYW5kID0gdHlwZW9mIChhY3Rpb24gYXMgQ29tbWFuZCkuY29tbWFuZCA9PT0gJ3N0cmluZyc7XG4gICAgY29uc3QgdGl0bGUgPSBhY3Rpb24udGl0bGVcbiAgICAgICAgPz8gKGlzQ29tbWFuZCA/IChhY3Rpb24gYXMgQ29tbWFuZCkuY29tbWFuZCA6IChhY3Rpb24gYXMgQ29kZUFjdGlvbikuY29tbWFuZD8udGl0bGUpXG4gICAgICAgID8/ICdBY3Rpb24nO1xuICAgIGNvbnN0IGtpbmQgPSBpc0NvbW1hbmQgPyAncXVpY2tmaXgnIDogKChhY3Rpb24gYXMgQ29kZUFjdGlvbikua2luZCA/PyAncXVpY2tmaXgnKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB0aXRsZSxcbiAgICAgICAga2luZCxcbiAgICAgICAgZGlhZ25vc3RpY3M6IFtdLFxuICAgICAgICBpc1ByZWZlcnJlZDogKGFjdGlvbiBhcyBDb2RlQWN0aW9uKS5pc1ByZWZlcnJlZCxcbiAgICAgICAgLy8gQXBwbHkgbGF6aWx5IHRocm91Z2ggb3VyIGNvbW1hbmQgc28gd2UgY2FuIHJlc29sdmUsIHJ1biBzZXJ2ZXIgY29tbWFuZHMgYW5kIGFwcGx5IGVkaXRzIHVuaWZvcm1seS5cbiAgICAgICAgY29tbWFuZDogeyBpZDogQVBQTFlfQUNUSU9OX0NPTU1BTkQsIHRpdGxlLCBhcmd1bWVudHM6IFthY3Rpb25dIH0sXG4gICAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gYXBwbHlDb2RlQWN0aW9uKGFjdGlvbjogQ29kZUFjdGlvbiB8IENvbW1hbmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIV9jb25uKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiAoYWN0aW9uIGFzIENvbW1hbmQpLmNvbW1hbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBhd2FpdCBydW5TZXJ2ZXJDb21tYW5kKGFjdGlvbiBhcyBDb21tYW5kKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzb2x2ZWQgPSBhY3Rpb24gYXMgQ29kZUFjdGlvbjtcbiAgICAgICAgaWYgKCFyZXNvbHZlZC5lZGl0ICYmIChyZXNvbHZlZCBhcyB7IGRhdGE/OiB1bmtub3duIH0pLmRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzb2x2ZWQgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgnY29kZUFjdGlvbi9yZXNvbHZlJywgcmVzb2x2ZWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXNvbHZlZC5lZGl0KSBhcHBseVdvcmtzcGFjZUVkaXQocmVzb2x2ZWQuZWRpdCk7XG4gICAgICAgIGlmIChyZXNvbHZlZC5jb21tYW5kKSBhd2FpdCBydW5TZXJ2ZXJDb21tYW5kKHJlc29sdmVkLmNvbW1hbmQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbamF2YS1sc3BdIGNvZGUgYWN0aW9uIGZhaWxlZDonLCAoZSBhcyBFcnJvcik/Lm1lc3NhZ2UgPz8gZSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBpc1dvcmtzcGFjZUVkaXQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBXb3Jrc3BhY2VFZGl0IHtcbiAgICByZXR1cm4gISF2YWx1ZSAmJiAoISEodmFsdWUgYXMgV29ya3NwYWNlRWRpdCkuY2hhbmdlcyB8fCAhISh2YWx1ZSBhcyBXb3Jrc3BhY2VFZGl0KS5kb2N1bWVudENoYW5nZXMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5TZXJ2ZXJDb21tYW5kKGNtZDogQ29tbWFuZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghX2Nvbm4gfHwgIWNtZD8uY29tbWFuZCkgcmV0dXJuO1xuICAgIGlmIChHRU5FUkFURVtjbWQuY29tbWFuZF0pIHtcbiAgICAgICAgYXdhaXQgcnVuR2VuZXJhdGUoY21kLmNvbW1hbmQsIGNtZC5hcmd1bWVudHMgPz8gW10pO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd3b3Jrc3BhY2UvZXhlY3V0ZUNvbW1hbmQnLCB7IGNvbW1hbmQ6IGNtZC5jb21tYW5kLCBhcmd1bWVudHM6IGNtZC5hcmd1bWVudHMgPz8gW10gfSk7XG4gICAgaWYgKGlzV29ya3NwYWNlRWRpdChyZXN1bHQpKSBhcHBseVdvcmtzcGFjZUVkaXQocmVzdWx0KTtcbn1cblxuaW50ZXJmYWNlIEdlbmVyYXRlU3BlYyB7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICBzdGF0dXM6IHN0cmluZztcbiAgICBnZW5lcmF0ZTogc3RyaW5nO1xuICAgIG1lbWJlcnM6IChzdGF0dXM6IGFueSkgPT4gQXJyYXk8eyBsYWJlbDogc3RyaW5nOyByZWY6IGFueSB9PjtcbiAgICBidWlsZEFyZ3M6IChwcm9tcHRBcmdzOiBhbnlbXSwgc3RhdHVzOiBhbnksIHNlbGVjdGVkOiBhbnlbXSkgPT4gYW55W107XG59XG5cbi8qKiBNZW1iZXItbmFtZWQgZmllbGRzIFx1MjE5MiBwaWNrZXIgbGFiZWxzLiAqL1xuZnVuY3Rpb24gZmllbGRMYWJlbChmOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSBmPy5uYW1lID8/IGY/LmZpZWxkTmFtZSA/PyAnJztcbiAgICBjb25zdCB0eXBlID0gZj8udHlwZSA/PyBmPy50eXBlTmFtZTtcbiAgICByZXR1cm4gdHlwZSA/IGAke25hbWV9OiAke3R5cGV9YCA6IGAke25hbWV9YDtcbn1cblxuLyoqXG4gKiBUaGUgSkRULkxTIHNvdXJjZS1nZW5lcmF0aW9uIGNvbW1hbmRzIChjb25zdHJ1Y3RvcnMsIGdldHRlcnMvc2V0dGVycywgdG9TdHJpbmcsIGhhc2hDb2RlL2VxdWFscykuXG4gKiBFYWNoIG1hcHMgdGhlIGNsaWVudCBcIipQcm9tcHRcIiBjb21tYW5kIHRvIHRoZSBzZXJ2ZXIgc3RhdHVzICsgZ2VuZXJhdGUgZGVsZWdhdGUgY29tbWFuZHM7IHRoZSBzdGF0dXNcbiAqIGNhbGwgeWllbGRzIHRoZSBjYW5kaWRhdGUgZmllbGRzIHNob3duIGluIHRoZSBtZW1iZXIgcGlja2VyLCB0aGUgZ2VuZXJhdGUgY2FsbCByZXR1cm5zIHRoZSBlZGl0LlxuICovXG5jb25zdCBHRU5FUkFURTogUmVjb3JkPHN0cmluZywgR2VuZXJhdGVTcGVjPiA9IHtcbiAgICAnamF2YS5hY3Rpb24uZ2VuZXJhdGVDb25zdHJ1Y3RvcnNQcm9tcHQnOiB7XG4gICAgICAgIGxhYmVsOiAnU2VsZWN0IGZpZWxkcyBhbmQgY29uc3RydWN0b3JzJyxcbiAgICAgICAgc3RhdHVzOiAnamF2YS5hY3Rpb24uY2hlY2tDb25zdHJ1Y3RvcnNTdGF0dXMnLFxuICAgICAgICBnZW5lcmF0ZTogJ2phdmEuYWN0aW9uLmdlbmVyYXRlQ29uc3RydWN0b3JzJyxcbiAgICAgICAgbWVtYmVyczogKHMpID0+IChzPy5maWVsZHMgPz8gW10pLm1hcCgoZjogYW55KSA9PiAoeyBsYWJlbDogZmllbGRMYWJlbChmKSwgcmVmOiBmIH0pKSxcbiAgICAgICAgYnVpbGRBcmdzOiAoYXJncywgcywgc2VsKSA9PiBbYXJnc1swXSwgeyBjb25zdHJ1Y3RvcnM6IHM/LmNvbnN0cnVjdG9ycyA/PyBbXSwgZmllbGRzOiBzZWwubWFwKG0gPT4gbS5yZWYpIH1dLFxuICAgIH0sXG4gICAgJ2phdmEuYWN0aW9uLmdlbmVyYXRlVG9TdHJpbmdQcm9tcHQnOiB7XG4gICAgICAgIGxhYmVsOiAnU2VsZWN0IGZpZWxkcyB0byBpbmNsdWRlIGluIHRvU3RyaW5nKCknLFxuICAgICAgICBzdGF0dXM6ICdqYXZhLmFjdGlvbi5jaGVja1RvU3RyaW5nU3RhdHVzJyxcbiAgICAgICAgZ2VuZXJhdGU6ICdqYXZhLmFjdGlvbi5nZW5lcmF0ZVRvU3RyaW5nJyxcbiAgICAgICAgbWVtYmVyczogKHMpID0+IChzPy5maWVsZHMgPz8gW10pLm1hcCgoZjogYW55KSA9PiAoeyBsYWJlbDogZmllbGRMYWJlbChmKSwgcmVmOiBmIH0pKSxcbiAgICAgICAgYnVpbGRBcmdzOiAoYXJncywgX3MsIHNlbCkgPT4gW2FyZ3NbMF0sIHNlbC5tYXAobSA9PiBtLnJlZildLFxuICAgIH0sXG4gICAgJ2phdmEuYWN0aW9uLmhhc2hDb2RlRXF1YWxzUHJvbXB0Jzoge1xuICAgICAgICBsYWJlbDogJ1NlbGVjdCBmaWVsZHMgZm9yIGhhc2hDb2RlKCkgYW5kIGVxdWFscygpJyxcbiAgICAgICAgc3RhdHVzOiAnamF2YS5hY3Rpb24uY2hlY2tIYXNoQ29kZUVxdWFsc1N0YXR1cycsXG4gICAgICAgIGdlbmVyYXRlOiAnamF2YS5hY3Rpb24uZ2VuZXJhdGVIYXNoQ29kZUVxdWFscycsXG4gICAgICAgIG1lbWJlcnM6IChzKSA9PiAocz8uZmllbGRzID8/IFtdKS5tYXAoKGY6IGFueSkgPT4gKHsgbGFiZWw6IGZpZWxkTGFiZWwoZiksIHJlZjogZiB9KSksXG4gICAgICAgIGJ1aWxkQXJnczogKGFyZ3MsIF9zLCBzZWwpID0+IFthcmdzWzBdLCBzZWwubWFwKG0gPT4gbS5yZWYpLCBmYWxzZV0sXG4gICAgfSxcbiAgICAnamF2YS5hY3Rpb24uZ2VuZXJhdGVBY2Nlc3NvcnNQcm9tcHQnOiB7XG4gICAgICAgIGxhYmVsOiAnU2VsZWN0IGZpZWxkcyB0byBnZW5lcmF0ZSBnZXR0ZXJzIGFuZCBzZXR0ZXJzJyxcbiAgICAgICAgc3RhdHVzOiAnamF2YS5hY3Rpb24uY2hlY2tBY2Nlc3NvcnNTdGF0dXMnLFxuICAgICAgICBnZW5lcmF0ZTogJ2phdmEuYWN0aW9uLmdlbmVyYXRlQWNjZXNzb3JzJyxcbiAgICAgICAgbWVtYmVyczogKHMpID0+IChzPy5hY2Nlc3NvcnMgPz8gcyA/PyBbXSkubWFwKChhOiBhbnkpID0+ICh7IGxhYmVsOiBmaWVsZExhYmVsKGEpLCByZWY6IGEgfSkpLFxuICAgICAgICBidWlsZEFyZ3M6IChhcmdzLCBfcywgc2VsKSA9PiBbYXJnc1swXSwgc2VsLm1hcChtID0+IG0ucmVmKV0sXG4gICAgfSxcbiAgICAnamF2YS5hY3Rpb24ub3ZlcnJpZGVNZXRob2RzUHJvbXB0Jzoge1xuICAgICAgICBsYWJlbDogJ1NlbGVjdCBtZXRob2RzIHRvIG92ZXJyaWRlIG9yIGltcGxlbWVudCcsXG4gICAgICAgIHN0YXR1czogJ2phdmEuYWN0aW9uLmxpc3RPdmVycmlkYWJsZU1ldGhvZHMnLFxuICAgICAgICBnZW5lcmF0ZTogJ2phdmEuYWN0aW9uLmFkZE92ZXJyaWRhYmxlTWV0aG9kcycsXG4gICAgICAgIG1lbWJlcnM6IChzKSA9PiAocz8ubWV0aG9kcyA/PyBbXSkubWFwKChtOiBhbnkpID0+ICh7XG4gICAgICAgICAgICBsYWJlbDogYCR7bS5uYW1lfSgkeyhtLnBhcmFtZXRlcnMgPz8gW10pLmpvaW4oJywgJyl9KSR7bS5kZWNsYXJpbmdDbGFzcyA/ICcgOiAnICsgbS5kZWNsYXJpbmdDbGFzcyA6ICcnfWAsXG4gICAgICAgICAgICByZWY6IG0sXG4gICAgICAgIH0pKSxcbiAgICAgICAgYnVpbGRBcmdzOiAoYXJncywgc3RhdHVzLCBzZWwpID0+IFthcmdzWzBdLCB7IG92ZXJyaWRhYmxlTWV0aG9kczogc2VsLm1hcChtID0+IG0ucmVmKSwgdHlwZTogc3RhdHVzPy50eXBlIH1dLFxuICAgIH0sXG59O1xuXG5hc3luYyBmdW5jdGlvbiBydW5HZW5lcmF0ZShwcm9tcHRJZDogc3RyaW5nLCBhcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghX2Nvbm4pIHJldHVybjtcbiAgICBjb25zdCBzcGVjID0gR0VORVJBVEVbcHJvbXB0SWRdO1xuICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd3b3Jrc3BhY2UvZXhlY3V0ZUNvbW1hbmQnLCB7IGNvbW1hbmQ6IHNwZWMuc3RhdHVzLCBhcmd1bWVudHM6IGFyZ3MgfSk7XG4gICAgaWYgKCFzdGF0dXMpIHJldHVybjtcbiAgICBjb25zdCBtZW1iZXJzID0gc3BlYy5tZW1iZXJzKHN0YXR1cyk7XG4gICAgbGV0IHNlbGVjdGVkID0gbWVtYmVycztcbiAgICBjb25zdCBwaWNrZXIgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLmphdmFMc3BNZW1iZXJQaWNrZXI7XG4gICAgaWYgKG1lbWJlcnMubGVuZ3RoICYmIHR5cGVvZiBwaWNrZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY29uc3QgY2hvc2VuOiBzdHJpbmdbXSB8IG51bGwgPSBhd2FpdCBwaWNrZXIoc3BlYy5sYWJlbCwgbWVtYmVycy5tYXAobSA9PiBtLmxhYmVsKSk7XG4gICAgICAgIGlmIChjaG9zZW4gPT09IG51bGwpIHJldHVybjsgLy8gdXNlciBjYW5jZWxsZWQgdGhlIGRpYWxvZ1xuICAgICAgICBzZWxlY3RlZCA9IG1lbWJlcnMuZmlsdGVyKG0gPT4gY2hvc2VuLmluY2x1ZGVzKG0ubGFiZWwpKTtcbiAgICB9XG4gICAgY29uc3QgZWRpdCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd3b3Jrc3BhY2UvZXhlY3V0ZUNvbW1hbmQnLCB7XG4gICAgICAgIGNvbW1hbmQ6IHNwZWMuZ2VuZXJhdGUsXG4gICAgICAgIGFyZ3VtZW50czogc3BlYy5idWlsZEFyZ3MoYXJncywgc3RhdHVzLCBzZWxlY3RlZCksXG4gICAgfSk7XG4gICAgaWYgKGlzV29ya3NwYWNlRWRpdChlZGl0KSkgYXBwbHlXb3Jrc3BhY2VFZGl0KGVkaXQpO1xufVxuXG4vKiogR3JvdXBzIGEgd29ya3NwYWNlIGVkaXQncyB0ZXh0IGVkaXRzIGJ5IGRvY3VtZW50IGFuZCBhcHBsaWVzIHRoZW0gaW4gcGxhY2UgdG8gb3BlbiBNb25hY28gbW9kZWxzLiAqL1xuZnVuY3Rpb24gYXBwbHlXb3Jrc3BhY2VFZGl0KGVkaXQ6IFdvcmtzcGFjZUVkaXQgfCBudWxsIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0KSByZXR1cm47XG4gICAgY29uc3QgYnlVcmk6IFJlY29yZDxzdHJpbmcsIFRleHRFZGl0W10+ID0ge307XG4gICAgaWYgKGVkaXQuY2hhbmdlcykge1xuICAgICAgICBmb3IgKGNvbnN0IHVyaSBpbiBlZGl0LmNoYW5nZXMpIGJ5VXJpW3VyaV0gPSAoYnlVcmlbdXJpXSA/PyBbXSkuY29uY2F0KGVkaXQuY2hhbmdlc1t1cmldKTtcbiAgICB9XG4gICAgaWYgKGVkaXQuZG9jdW1lbnRDaGFuZ2VzKSB7XG4gICAgICAgIGZvciAoY29uc3QgZGMgb2YgZWRpdC5kb2N1bWVudENoYW5nZXMgYXMgYW55W10pIHtcbiAgICAgICAgICAgIGlmIChkYz8udGV4dERvY3VtZW50Py51cmkgJiYgQXJyYXkuaXNBcnJheShkYy5lZGl0cykpIHtcbiAgICAgICAgICAgICAgICBieVVyaVtkYy50ZXh0RG9jdW1lbnQudXJpXSA9IChieVVyaVtkYy50ZXh0RG9jdW1lbnQudXJpXSA/PyBbXSkuY29uY2F0KGRjLmVkaXRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IHVyaSBpbiBieVVyaSkge1xuICAgICAgICBjb25zdCBtb2RlbCA9IG1vbmFjby5lZGl0b3IuZ2V0TW9kZWxzKCkuZmluZChtID0+IG0udXJpLnRvU3RyaW5nKCkgPT09IHVyaSk7XG4gICAgICAgIGlmICghbW9kZWwpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBvcHMgPSBieVVyaVt1cmldLm1hcChlID0+ICh7IHJhbmdlOiBsc3BSYW5nZVRvTW9uYWNvKGUucmFuZ2UpLCB0ZXh0OiBlLm5ld1RleHQsIGZvcmNlTW92ZU1hcmtlcnM6IHRydWUgfSkpO1xuICAgICAgICBtb2RlbC5wdXNoRWRpdE9wZXJhdGlvbnMoW10sIG9wcywgKCkgPT4gbnVsbCk7XG4gICAgfVxufVxuXG4vKiogQ29udmVydHMgYW4gTFNQIHdvcmtzcGFjZSBlZGl0IGludG8gdGhlIE1vbmFjbyBzaGFwZSByZXR1cm5lZCBieSB0aGUgcmVuYW1lIHByb3ZpZGVyLiAqL1xuZnVuY3Rpb24gd29ya3NwYWNlRWRpdFRvTW9uYWNvKGVkaXQ6IFdvcmtzcGFjZUVkaXQgfCBudWxsKTogbW9uYWNvLmxhbmd1YWdlcy5Xb3Jrc3BhY2VFZGl0IHtcbiAgICBjb25zdCBlZGl0czogYW55W10gPSBbXTtcbiAgICBjb25zdCBwdXNoID0gKHVyaTogc3RyaW5nLCBsaXN0OiBUZXh0RWRpdFtdKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgZSBvZiBsaXN0KSB7XG4gICAgICAgICAgICBlZGl0cy5wdXNoKHsgcmVzb3VyY2U6IG1vbmFjby5VcmkucGFyc2UodXJpKSwgdGV4dEVkaXQ6IHsgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28oZS5yYW5nZSksIHRleHQ6IGUubmV3VGV4dCB9LCB2ZXJzaW9uSWQ6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgaWYgKGVkaXQ/LmNoYW5nZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCB1cmkgaW4gZWRpdC5jaGFuZ2VzKSBwdXNoKHVyaSwgZWRpdC5jaGFuZ2VzW3VyaV0pO1xuICAgIH1cbiAgICBpZiAoZWRpdD8uZG9jdW1lbnRDaGFuZ2VzKSB7XG4gICAgICAgIGZvciAoY29uc3QgZGMgb2YgZWRpdC5kb2N1bWVudENoYW5nZXMgYXMgYW55W10pIHtcbiAgICAgICAgICAgIGlmIChkYz8udGV4dERvY3VtZW50Py51cmkgJiYgQXJyYXkuaXNBcnJheShkYy5lZGl0cykpIHB1c2goZGMudGV4dERvY3VtZW50LnVyaSwgZGMuZWRpdHMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGVkaXRzIH07XG59XG5cbi8qKiBNYXBzIGEgdmlydHVhbCBlZGl0b3IgVVJJIGJhY2sgdG8gdGhlIElERSB3b3Jrc3BhY2UgcGF0aCAoe0Bjb2RlIC93cy9wcm9qLy4uLn0pLiAqL1xuZnVuY3Rpb24gdXJpVG9Xb3Jrc3BhY2VQYXRoKHVyaTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCF1cmkuc3RhcnRzV2l0aChWSVJUVUFMX0ZJTEVfUFJFRklYKSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh1cmkuc3Vic3RyaW5nKFZJUlRVQUxfRklMRV9QUkVGSVgubGVuZ3RoKSk7XG59XG5cbi8qKiBSZWFkcyBhIHdvcmtzcGFjZSBmaWxlJ3MgY3VycmVudCB0ZXh0IG92ZXIgdGhlIElERSBSRVNUIEFQSS4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZldGNoV29ya3NwYWNlRmlsZVRleHQoaWRlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvc2VydmljZXMvaWRlL3dvcmtzcGFjZXMnICsgaWRlUGF0aCwgeyBoZWFkZXJzOiB7ICdYLVJlcXVlc3RlZC1XaXRoJzogJ0ZldGNoJyB9IH0pO1xuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgcmVhZCAke2lkZVBhdGh9IChIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfSlgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTtcbn1cblxuLyoqIEFwcGxpZXMgTFNQIHRleHQgZWRpdHMgdG8gYSBzdHJpbmcuIE9mZnNldHMgYXJlIHJlc29sdmVkIGFnYWluc3QgdGhlIG9yaWdpbmFsIHRleHQgYW5kIGVkaXRzIGFyZVxuICogIGFwcGxpZWQgZnJvbSB0aGUgZW5kIGJhY2t3YXJkcywgc28gZWFybGllciBvZmZzZXRzIHN0YXkgdmFsaWQuICovXG5mdW5jdGlvbiBhcHBseUVkaXRzVG9UZXh0KHRleHQ6IHN0cmluZywgZWRpdHM6IFRleHRFZGl0W10pOiBzdHJpbmcge1xuICAgIGNvbnN0IGxpbmVTdGFydHMgPSBbMF07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICh0ZXh0LmNoYXJDb2RlQXQoaSkgPT09IDEwIC8qIFxcbiAqLykgbGluZVN0YXJ0cy5wdXNoKGkgKyAxKTtcbiAgICB9XG4gICAgY29uc3Qgb2Zmc2V0ID0gKHA6IHsgbGluZTogbnVtYmVyOyBjaGFyYWN0ZXI6IG51bWJlciB9KSA9PiAobGluZVN0YXJ0c1twLmxpbmVdID8/IHRleHQubGVuZ3RoKSArIHAuY2hhcmFjdGVyO1xuICAgIGNvbnN0IG9yZGVyZWQgPSBlZGl0cy5zbGljZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IG9mZnNldChiLnJhbmdlLnN0YXJ0KSAtIG9mZnNldChhLnJhbmdlLnN0YXJ0KSk7XG4gICAgbGV0IHJlc3VsdCA9IHRleHQ7XG4gICAgZm9yIChjb25zdCBlIG9mIG9yZGVyZWQpIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnNsaWNlKDAsIG9mZnNldChlLnJhbmdlLnN0YXJ0KSkgKyBlLm5ld1RleHQgKyByZXN1bHQuc2xpY2Uob2Zmc2V0KGUucmFuZ2UuZW5kKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQXBwbGllcyBhIEpEVC5MUyByZW5hbWUge0BsaW5rIFdvcmtzcGFjZUVkaXR9IGFjcm9zcyB0aGUgd2hvbGUgd29ya3NwYWNlOiB0ZXh0IGVkaXRzIGluIGV2ZXJ5XG4gKiBhZmZlY3RlZCBmaWxlIHBsdXMgYW55IHtAY29kZSBSZW5hbWVGaWxlfSBvcGVyYXRpb24gKGEgcHVibGljLXR5cGUgcmVuYW1lIHJlbmFtZXMgaXRzIG93blxuICoge0Bjb2RlIC5qYXZhfSBmaWxlKS4gVGhlIGN1cnJlbnQgZmlsZSdzIGVkaXRzIGdvIHRocm91Z2ggdGhlIGxpdmUgTW9uYWNvIG1vZGVsOyB0aGUgcmVzdCBhcmUgcmVhZCxcbiAqIGVkaXRlZCBhbmQgd3JpdHRlbiBiYWNrIG92ZXIgUkVTVC4gUGVyc2lzdGVuY2UgKENTUkYtZ3VhcmRlZCB3cml0ZXMsIHRoZSB0YWIgc3dpdGNoIHdoZW4gdGhlIGN1cnJlbnRcbiAqIGZpbGUgaXMgcmVuYW1lZCwgYW5kIHJlbG9hZGluZyBvdGhlciBvcGVuIGVkaXRvcnMpIGlzIGRlbGVnYXRlZCB0byB0aGUgSURFIHZpYSBqYXZhTHNwUGVyc2lzdFJlbmFtZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYXBwbHlSZW5hbWVBY3Jvc3NXb3Jrc3BhY2UobW9kZWw6IG1vbmFjby5lZGl0b3IuSVRleHRNb2RlbCwgZWRpdDogV29ya3NwYWNlRWRpdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGN1cnJlbnRVcmkgPSBtb2RlbC51cmkudG9TdHJpbmcoKTtcbiAgICBjb25zdCB0ZXh0QnlVcmk6IFJlY29yZDxzdHJpbmcsIFRleHRFZGl0W10+ID0ge307XG4gICAgY29uc3QgcmVuYW1lQnlVcmk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgIGlmIChlZGl0LmNoYW5nZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCB1cmkgaW4gZWRpdC5jaGFuZ2VzKSB0ZXh0QnlVcmlbdXJpXSA9ICh0ZXh0QnlVcmlbdXJpXSA/PyBbXSkuY29uY2F0KGVkaXQuY2hhbmdlc1t1cmldKTtcbiAgICB9XG4gICAgaWYgKGVkaXQuZG9jdW1lbnRDaGFuZ2VzKSB7XG4gICAgICAgIGZvciAoY29uc3QgZGMgb2YgZWRpdC5kb2N1bWVudENoYW5nZXMgYXMgYW55W10pIHtcbiAgICAgICAgICAgIGlmIChkYz8ua2luZCA9PT0gJ3JlbmFtZScgJiYgZGMub2xkVXJpICYmIGRjLm5ld1VyaSkge1xuICAgICAgICAgICAgICAgIHJlbmFtZUJ5VXJpW2RjLm9sZFVyaV0gPSBkYy5uZXdVcmk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRjPy50ZXh0RG9jdW1lbnQ/LnVyaSAmJiBBcnJheS5pc0FycmF5KGRjLmVkaXRzKSkge1xuICAgICAgICAgICAgICAgIHRleHRCeVVyaVtkYy50ZXh0RG9jdW1lbnQudXJpXSA9ICh0ZXh0QnlVcmlbZGMudGV4dERvY3VtZW50LnVyaV0gPz8gW10pLmNvbmNhdChkYy5lZGl0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjb25zdCBwYXlsb2FkOiB7XG4gICAgICAgIGN1cnJlbnRQYXRoOiBzdHJpbmcgfCBudWxsO1xuICAgICAgICBjdXJyZW50Q29udGVudDogc3RyaW5nIHwgbnVsbDtcbiAgICAgICAgY3VycmVudE5ld1BhdGg6IHN0cmluZyB8IG51bGw7XG4gICAgICAgIHdyaXRlczogQXJyYXk8eyBwYXRoOiBzdHJpbmcgfCBudWxsOyBjb250ZW50OiBzdHJpbmcgfT47XG4gICAgICAgIHJlbmFtZXM6IEFycmF5PHsgb2xkUGF0aDogc3RyaW5nIHwgbnVsbDsgbmV3UGF0aDogc3RyaW5nIHwgbnVsbDsgY29udGVudDogc3RyaW5nIH0+O1xuICAgIH0gPSB7IGN1cnJlbnRQYXRoOiB1cmlUb1dvcmtzcGFjZVBhdGgoY3VycmVudFVyaSksIGN1cnJlbnRDb250ZW50OiBudWxsLCBjdXJyZW50TmV3UGF0aDogbnVsbCwgd3JpdGVzOiBbXSwgcmVuYW1lczogW10gfTtcblxuICAgIGNvbnN0IHVyaXMgPSBuZXcgU2V0PHN0cmluZz4oWy4uLk9iamVjdC5rZXlzKHRleHRCeVVyaSksIC4uLk9iamVjdC5rZXlzKHJlbmFtZUJ5VXJpKV0pO1xuICAgIGZvciAoY29uc3QgdXJpIG9mIHVyaXMpIHtcbiAgICAgICAgY29uc3QgZWRpdHMgPSB0ZXh0QnlVcmlbdXJpXSA/PyBbXTtcbiAgICAgICAgbGV0IGNvbnRlbnQ6IHN0cmluZztcbiAgICAgICAgaWYgKHVyaSA9PT0gY3VycmVudFVyaSkge1xuICAgICAgICAgICAgaWYgKGVkaXRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIG1vZGVsLnB1c2hFZGl0T3BlcmF0aW9ucyhbXSwgZWRpdHMubWFwKGUgPT4gKHsgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28oZS5yYW5nZSksIHRleHQ6IGUubmV3VGV4dCwgZm9yY2VNb3ZlTWFya2VyczogdHJ1ZSB9KSksICgpID0+IG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGVudCA9IG1vZGVsLmdldFZhbHVlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBhd2FpdCBmZXRjaFdvcmtzcGFjZUZpbGVUZXh0KHVyaVRvV29ya3NwYWNlUGF0aCh1cmkpID8/IHVyaSk7XG4gICAgICAgICAgICBjb250ZW50ID0gZWRpdHMubGVuZ3RoID8gYXBwbHlFZGl0c1RvVGV4dChzb3VyY2UsIGVkaXRzKSA6IHNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdVcmkgPSByZW5hbWVCeVVyaVt1cmldO1xuICAgICAgICBpZiAodXJpID09PSBjdXJyZW50VXJpKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmN1cnJlbnRDb250ZW50ID0gY29udGVudDtcbiAgICAgICAgICAgIHBheWxvYWQuY3VycmVudE5ld1BhdGggPSBuZXdVcmkgPyB1cmlUb1dvcmtzcGFjZVBhdGgobmV3VXJpKSA6IG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAobmV3VXJpKSB7XG4gICAgICAgICAgICBwYXlsb2FkLnJlbmFtZXMucHVzaCh7IG9sZFBhdGg6IHVyaVRvV29ya3NwYWNlUGF0aCh1cmkpLCBuZXdQYXRoOiB1cmlUb1dvcmtzcGFjZVBhdGgobmV3VXJpKSwgY29udGVudCB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBheWxvYWQud3JpdGVzLnB1c2goeyBwYXRoOiB1cmlUb1dvcmtzcGFjZVBhdGgodXJpKSwgY29udGVudCB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IChnbG9iYWxUaGlzIGFzIGFueSkuamF2YUxzcFBlcnNpc3RSZW5hbWUocGF5bG9hZCk7XG59XG5cbmZ1bmN0aW9uIGpkdGxzU2V0dGluZ3MoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgamF2YToge1xuICAgICAgICAgICAgaW1wb3J0OiB7XG4gICAgICAgICAgICAgICAgbWF2ZW46ICAgICAgeyBlbmFibGVkOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgZ3JhZGxlOiAgICAgeyBlbmFibGVkOiBmYWxzZSB9LFxuICAgICAgICAgICAgICAgIGV4Y2x1c2lvbnM6IFsnKiovbm9kZV9tb2R1bGVzLyoqJywgJyoqLy5tZXRhZGF0YS8qKicsICcqKi9hcmNoZXR5cGUtcmVzb3VyY2VzLyoqJ10sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYXV0b2J1aWxkOiB7IGVuYWJsZWQ6IHRydWUgfSxcbiAgICAgICAgICAgIGNvbXBsZXRpb246IHtcbiAgICAgICAgICAgICAgICBvdmVyd3JpdGU6ICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICBndWVzc01ldGhvZEFyZ3VtZW50czogZmFsc2UsXG4gICAgICAgICAgICAgICAgZmlsdGVyZWRUeXBlczogW1xuICAgICAgICAgICAgICAgICAgICAnY29tLnN1bi4qJywgJ3N1bi4qJywgJ2pkay4qJyxcbiAgICAgICAgICAgICAgICAgICAgJ29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC4qJyxcbiAgICAgICAgICAgICAgICAgICAgJ29yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuKicsXG4gICAgICAgICAgICAgICAgICAgICdvcmcuZWNsaXBzZS5vc2dpLmludGVybmFsLionLFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgaW1wb3J0T3JkZXI6IFsnamF2YScsICdqYXZheCcsICdvcmcnLCAnY29tJywgJyddLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNpZ25hdHVyZUhlbHA6ICB7IGVuYWJsZWQ6IHRydWUgfSxcbiAgICAgICAgICAgIGZvcm1hdDogICAgICAgICB7IGVuYWJsZWQ6IHRydWUgfSxcbiAgICAgICAgICAgIHNhdmVBY3Rpb25zOiAgICB7IG9yZ2FuaXplSW1wb3J0czogZmFsc2UgfSxcbiAgICAgICAgICAgIGlubGF5SGludHM6ICAgICB7IHBhcmFtZXRlck5hbWVzOiB7IGVuYWJsZWQ6ICdhbGwnIH0gfSxcbiAgICAgICAgICAgIHJlZmVyZW5jZXNDb2RlTGVuczogICAgIHsgZW5hYmxlZDogdHJ1ZSB9LFxuICAgICAgICAgICAgaW1wbGVtZW50YXRpb25zQ29kZUxlbnM6IHsgZW5hYmxlZDogdHJ1ZSB9LFxuICAgICAgICB9LFxuICAgIH07XG59XG4iLCAiLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgMjAyNCBUeXBlRm94IGFuZCBvdGhlcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMSUNFTlNFIGluIHRoZSBwYWNrYWdlIHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuaW1wb3J0IHsgRGlzcG9zYWJsZSB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcblxuZXhwb3J0IGNsYXNzIERpc3Bvc2FibGVDb2xsZWN0aW9uIGltcGxlbWVudHMgRGlzcG9zYWJsZSB7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGRpc3Bvc2FibGVzOiBEaXNwb3NhYmxlW10gPSBbXTtcblxuICAgIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgICAgIHdoaWxlICh0aGlzLmRpc3Bvc2FibGVzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgdGhpcy5kaXNwb3NhYmxlcy5wb3AoKSEuZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVzaChkaXNwb3NhYmxlOiBEaXNwb3NhYmxlKTogRGlzcG9zYWJsZSB7XG4gICAgICAgIGNvbnN0IGRpc3Bvc2FibGVzID0gdGhpcy5kaXNwb3NhYmxlcztcbiAgICAgICAgZGlzcG9zYWJsZXMucHVzaChkaXNwb3NhYmxlKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBkaXNwb3NhYmxlcy5pbmRleE9mKGRpc3Bvc2FibGUpO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgZGlzcG9zYWJsZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxufVxuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjQgVHlwZUZveCBhbmQgb3RoZXJzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTElDRU5TRSBpbiB0aGUgcGFja2FnZSByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbmltcG9ydCB7IERpc3Bvc2FibGUgfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG5pbXBvcnQgdHlwZSB7IElDb25uZWN0aW9uIH0gZnJvbSAnLi4vc2VydmVyL2Nvbm5lY3Rpb24uanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElXZWJTb2NrZXQgZXh0ZW5kcyBEaXNwb3NhYmxlIHtcbiAgICBzZW5kKGNvbnRlbnQ6IHN0cmluZyk6IHZvaWQ7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBvbk1lc3NhZ2UoY2I6IChkYXRhOiBhbnkpID0+IHZvaWQpOiB2b2lkO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgb25FcnJvcihjYjogKHJlYXNvbjogYW55KSA9PiB2b2lkKTogdm9pZDtcbiAgICBvbkNsb3NlKGNiOiAoY29kZTogbnVtYmVyLCByZWFzb246IHN0cmluZykgPT4gdm9pZCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVdlYlNvY2tldENvbm5lY3Rpb24gZXh0ZW5kcyBJQ29ubmVjdGlvbiB7XG4gICAgcmVhZG9ubHkgc29ja2V0OiBJV2ViU29ja2V0O1xufVxuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjQgVHlwZUZveCBhbmQgb3RoZXJzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTElDRU5TRSBpbiB0aGUgcGFja2FnZSByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbmltcG9ydCB7IERpc3Bvc2FibGUgfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG4vLyBUT0RPOiBVc2UgZW52aXJvbm1lbnQtc3BlY2lmaWMgaW1wb3J0cyAodnNjb2RlLWpzb25ycGMvYnJvd3NlciBvciB2c2NvZGUtanNvbnJwYy9ub2RlKVxuLy8gd2hlbiB1cGdyYWRpbmcgdG8gdnNjb2RlLWpzb25ycGNAOS54LngtbmV4dC5YIHdoaWNoIHN1cHBvcnRzIHByb3BlciBleHBvcnQgbWFwc1xuaW1wb3J0IHsgdHlwZSBEYXRhQ2FsbGJhY2ssIEFic3RyYWN0TWVzc2FnZVJlYWRlciwgTWVzc2FnZVJlYWRlciB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcbmltcG9ydCB0eXBlIHsgSVdlYlNvY2tldCB9IGZyb20gJy4vc29ja2V0LmpzJztcblxuZXhwb3J0IGNsYXNzIFdlYlNvY2tldE1lc3NhZ2VSZWFkZXIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VSZWFkZXIgaW1wbGVtZW50cyBNZXNzYWdlUmVhZGVyIHtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgc29ja2V0OiBJV2ViU29ja2V0O1xuICAgIHByb3RlY3RlZCBzdGF0ZTogJ2luaXRpYWwnIHwgJ2xpc3RlbmluZycgfCAnY2xvc2VkJyA9ICdpbml0aWFsJztcbiAgICBwcm90ZWN0ZWQgY2FsbGJhY2s6IERhdGFDYWxsYmFjayB8IHVuZGVmaW5lZDtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHByb3RlY3RlZCByZWFkb25seSBldmVudHM6IEFycmF5PHsgbWVzc2FnZT86IGFueSwgZXJyb3I/OiBhbnkgfT4gPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKHNvY2tldDogSVdlYlNvY2tldCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnNvY2tldCA9IHNvY2tldDtcbiAgICAgICAgdGhpcy5zb2NrZXQub25NZXNzYWdlKG1lc3NhZ2UgPT5cbiAgICAgICAgICAgIHRoaXMucmVhZE1lc3NhZ2UobWVzc2FnZSlcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zb2NrZXQub25FcnJvcihlcnJvciA9PlxuICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc29ja2V0Lm9uQ2xvc2UoKGNvZGUsIHJlYXNvbikgPT4ge1xuICAgICAgICAgICAgaWYgKGNvZGUgIT09IDEwMDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvcjogRXJyb3IgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICcnICsgY29kZSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYEVycm9yIGR1cmluZyBzb2NrZXQgcmVjb25uZWN0OiBjb2RlID0gJHtjb2RlfSwgcmVhc29uID0gJHtyZWFzb259YFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5maXJlQ2xvc2UoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbGlzdGVuKGNhbGxiYWNrOiBEYXRhQ2FsbGJhY2spOiBEaXNwb3NhYmxlIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09ICdpbml0aWFsJykge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9ICdsaXN0ZW5pbmcnO1xuICAgICAgICAgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgICAgICAgd2hpbGUgKHRoaXMuZXZlbnRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gdGhpcy5ldmVudHMucG9wKCkhO1xuICAgICAgICAgICAgICAgIGlmIChldmVudC5tZXNzYWdlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWFkTWVzc2FnZShldmVudC5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXZlbnQuZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZUNsb3NlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkaXNwb3NlOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2FsbGJhY2sgPT09IGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSAnaW5pdGlhbCc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsbGJhY2sgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIG92ZXJyaWRlIGRpc3Bvc2UoKSB7XG4gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9ICdpbml0aWFsJztcbiAgICAgICAgdGhpcy5jYWxsYmFjayA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5ldmVudHMuc3BsaWNlKDAsIHRoaXMuZXZlbnRzLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBwcm90ZWN0ZWQgcmVhZE1lc3NhZ2UobWVzc2FnZTogYW55KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09PSAnaW5pdGlhbCcpIHtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRzLnNwbGljZSgwLCAwLCB7IG1lc3NhZ2UgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZSA9PT0gJ2xpc3RlbmluZycpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjayEoZGF0YSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvcjogRXJyb3IgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICcnICsgNDAwLFxuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgRXJyb3IgZHVyaW5nIG1lc3NhZ2UgcGFyc2luZywgcmVhc29uID0gJHt0eXBlb2YgZXJyID09PSAnb2JqZWN0JyA/IChlcnIgYXMgYW55KS5tZXNzYWdlIDogJ3Vua25vd24nfWBcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIGZpcmVFcnJvcihlcnJvcjogYW55KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09PSAnaW5pdGlhbCcpIHtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRzLnNwbGljZSgwLCAwLCB7IGVycm9yIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUgPT09ICdsaXN0ZW5pbmcnKSB7XG4gICAgICAgICAgICBzdXBlci5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIGZpcmVDbG9zZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09ICdpbml0aWFsJykge1xuICAgICAgICAgICAgdGhpcy5ldmVudHMuc3BsaWNlKDAsIDAsIHt9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlID09PSAnbGlzdGVuaW5nJykge1xuICAgICAgICAgICAgc3VwZXIuZmlyZUNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGF0ZSA9ICdjbG9zZWQnO1xuICAgIH1cbn1cbiIsICIvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSAyMDI0IFR5cGVGb3ggYW5kIG90aGVycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExJQ0VOU0UgaW4gdGhlIHBhY2thZ2Ugcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5pbXBvcnQgeyBNZXNzYWdlIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuaW1wb3J0IHsgQWJzdHJhY3RNZXNzYWdlV3JpdGVyLCBNZXNzYWdlV3JpdGVyIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuaW1wb3J0IHR5cGUgeyBJV2ViU29ja2V0IH0gZnJvbSAnLi9zb2NrZXQuanMnO1xuXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0TWVzc2FnZVdyaXRlciBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVdyaXRlciBpbXBsZW1lbnRzIE1lc3NhZ2VXcml0ZXIge1xuICAgIHByb3RlY3RlZCBlcnJvckNvdW50ID0gMDtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgc29ja2V0OiBJV2ViU29ja2V0O1xuXG4gICAgY29uc3RydWN0b3Ioc29ja2V0OiBJV2ViU29ja2V0KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuc29ja2V0ID0gc29ja2V0O1xuICAgIH1cblxuICAgIGVuZCgpOiB2b2lkIHtcbiAgICB9XG5cbiAgICBhc3luYyB3cml0ZShtc2c6IE1lc3NhZ2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShtc2cpO1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChjb250ZW50KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5lcnJvckNvdW50Kys7XG4gICAgICAgICAgICB0aGlzLmZpcmVFcnJvcihlLCBtc2csIHRoaXMuZXJyb3JDb3VudCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgMjAyNCBUeXBlRm94IGFuZCBvdGhlcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMSUNFTlNFIGluIHRoZSBwYWNrYWdlIHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuaW1wb3J0IHR5cGUgeyBNZXNzYWdlQ29ubmVjdGlvbiwgTG9nZ2VyIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuaW1wb3J0IHsgY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24gfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG5pbXBvcnQgdHlwZSB7IElXZWJTb2NrZXQgfSBmcm9tICcuL3NvY2tldC5qcyc7XG5pbXBvcnQgeyBXZWJTb2NrZXRNZXNzYWdlUmVhZGVyIH0gZnJvbSAnLi9yZWFkZXIuanMnO1xuaW1wb3J0IHsgV2ViU29ja2V0TWVzc2FnZVdyaXRlciB9IGZyb20gJy4vd3JpdGVyLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdlYlNvY2tldENvbm5lY3Rpb24oc29ja2V0OiBJV2ViU29ja2V0LCBsb2dnZXI6IExvZ2dlcik6IE1lc3NhZ2VDb25uZWN0aW9uIHtcbiAgICBjb25zdCBtZXNzYWdlUmVhZGVyID0gbmV3IFdlYlNvY2tldE1lc3NhZ2VSZWFkZXIoc29ja2V0KTtcbiAgICBjb25zdCBtZXNzYWdlV3JpdGVyID0gbmV3IFdlYlNvY2tldE1lc3NhZ2VXcml0ZXIoc29ja2V0KTtcbiAgICBjb25zdCBjb25uZWN0aW9uID0gY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24obWVzc2FnZVJlYWRlciwgbWVzc2FnZVdyaXRlciwgbG9nZ2VyKTtcbiAgICBjb25uZWN0aW9uLm9uQ2xvc2UoKCkgPT4gY29ubmVjdGlvbi5kaXNwb3NlKCkpO1xuICAgIHJldHVybiBjb25uZWN0aW9uO1xufVxuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjQgVHlwZUZveCBhbmQgb3RoZXJzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTElDRU5TRSBpbiB0aGUgcGFja2FnZSByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbmltcG9ydCB0eXBlIHsgTWVzc2FnZUNvbm5lY3Rpb24sIExvZ2dlciB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcbmltcG9ydCB7IGNyZWF0ZVdlYlNvY2tldENvbm5lY3Rpb24gfSBmcm9tICcuL3NvY2tldC9jb25uZWN0aW9uLmpzJztcbmltcG9ydCB0eXBlIHsgSVdlYlNvY2tldCB9IGZyb20gJy4vc29ja2V0L3NvY2tldC5qcyc7XG5pbXBvcnQgeyBDb25zb2xlTG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gbGlzdGVuKG9wdGlvbnM6IHtcbiAgICB3ZWJTb2NrZXQ6IFdlYlNvY2tldDtcbiAgICBsb2dnZXI/OiBMb2dnZXI7XG4gICAgb25Db25uZWN0aW9uOiAoY29ubmVjdGlvbjogTWVzc2FnZUNvbm5lY3Rpb24pID0+IHZvaWQ7XG59KSB7XG4gICAgY29uc3QgeyB3ZWJTb2NrZXQsIG9uQ29ubmVjdGlvbiB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBsb2dnZXIgPSBvcHRpb25zLmxvZ2dlciB8fCBuZXcgQ29uc29sZUxvZ2dlcigpO1xuICAgIHdlYlNvY2tldC5vbm9wZW4gPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNvY2tldCA9IHRvU29ja2V0KHdlYlNvY2tldCk7XG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBjcmVhdGVXZWJTb2NrZXRDb25uZWN0aW9uKHNvY2tldCwgbG9nZ2VyKTtcbiAgICAgICAgb25Db25uZWN0aW9uKGNvbm5lY3Rpb24pO1xuICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1NvY2tldCh3ZWJTb2NrZXQ6IFdlYlNvY2tldCk6IElXZWJTb2NrZXQge1xuICAgIHJldHVybiB7XG4gICAgICAgIHNlbmQ6IGNvbnRlbnQgPT4gd2ViU29ja2V0LnNlbmQoY29udGVudCksXG4gICAgICAgIG9uTWVzc2FnZTogY2IgPT4ge1xuICAgICAgICAgICAgd2ViU29ja2V0Lm9ubWVzc2FnZSA9IGV2ZW50ID0+IGNiKGV2ZW50LmRhdGEpO1xuICAgICAgICB9LFxuICAgICAgICBvbkVycm9yOiBjYiA9PiB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgd2ViU29ja2V0Lm9uZXJyb3IgPSAoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3QuaGFzT3duKGV2ZW50LCAnbWVzc2FnZScpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNiKGV2ZW50Lm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIG9uQ2xvc2U6IGNiID0+IHtcbiAgICAgICAgICAgIHdlYlNvY2tldC5vbmNsb3NlID0gZXZlbnQgPT4gY2IoZXZlbnQuY29kZSwgZXZlbnQucmVhc29uKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGlzcG9zZTogKCkgPT4gd2ViU29ja2V0LmNsb3NlKClcbiAgICB9O1xufVxuIiwgIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAyNiBFY2xpcHNlIERpcmlnaWJsZSBjb250cmlidXRvcnNcbiAqXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGVcbiAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYyLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcbiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYyMC5odG1sXG4gKlxuICogU1BEWC1GaWxlQ29weXJpZ2h0VGV4dDogRWNsaXBzZSBEaXJpZ2libGUgY29udHJpYnV0b3JzIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wXG4gKi9cblxuLyoqXG4gKiBMYXp5IFByb3h5IHNoaW0gZm9yIE1vbmFjbyBFZGl0b3IgbG9hZGVkIHZpYSBBTUQuXG4gKlxuICogZWRpdG9yLmpzIHNldHMgZ2xvYmFsVGhpcy5tb25hY28gaW5zaWRlIHRoZSBBTUQgcmVxdWlyZSgpIGNhbGxiYWNrLCBiZWZvcmUgYW55XG4gKiBKYXZhTHNwQ2xpZW50TGliLmNvbm5lY3QoKSBjYWxsLiBBbGwgcHJvcGVydHkgYWNjZXNzZXMgZ28gdGhyb3VnaCBQcm94eS5nZXQoKSB0cmFwc1xuICogc28gdGhleSByZXNvbHZlIGFnYWluc3QgdGhlIGxpdmUgd2luZG93Lm1vbmFjbyBhdCBjYWxsIHRpbWUsIG5vdCBhdCBidW5kbGUgbG9hZCB0aW1lLlxuICpcbiAqIFR5cGVTY3JpcHQgcmVzb2x2ZXMgdHlwZXMgZnJvbSB0aGUgcmVhbCBtb25hY28tZWRpdG9yIGRldkRlcGVuZGVuY3k7IGVzYnVpbGQgcmVwbGFjZXNcbiAqIHRoZSBcIm1vbmFjby1lZGl0b3JcIiBpbXBvcnQgd2l0aCB0aGlzIGZpbGUgYXQgYnVuZGxlIHRpbWUgdmlhIHRoZSBhbGlhcyBvcHRpb24uXG4gKi9cblxudHlwZSBNID0gdHlwZW9mIGltcG9ydCgnbW9uYWNvLWVkaXRvcicpO1xuXG5mdW5jdGlvbiBtKCk6IE0ge1xuICAgIHJldHVybiAoZ2xvYmFsVGhpcyBhcyBhbnkpLm1vbmFjbyBhcyBNO1xufVxuXG5mdW5jdGlvbiBuczxUIGV4dGVuZHMgb2JqZWN0PihnZXR0ZXI6ICgpID0+IFQpOiBUIHtcbiAgICByZXR1cm4gbmV3IFByb3h5KHt9IGFzIFQsIHtcbiAgICAgICAgZ2V0OiAoXywgaykgPT4gKGdldHRlcigpIGFzIGFueSlbayBhcyBzdHJpbmddLFxuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBjbHM8VD4oZ2V0dGVyOiAoKSA9PiBUKTogVCB7XG4gICAgcmV0dXJuIG5ldyBQcm94eShmdW5jdGlvbiAoKSB7fSBhcyBhbnksIHtcbiAgICAgICAgY29uc3RydWN0OiAoXywgYXJncykgPT4gbmV3IChnZXR0ZXIoKSBhcyBhbnkpKC4uLmFyZ3MpLFxuICAgICAgICBnZXQ6ICAgICAgIChfLCBrKSAgICA9PiAoZ2V0dGVyKCkgYXMgYW55KVtrIGFzIHN0cmluZ10sXG4gICAgfSkgYXMgVDtcbn1cblxuZXhwb3J0IGNvbnN0IGVkaXRvciAgICAgICAgID0gbnMoKCkgPT4gbSgpLmVkaXRvcik7XG5leHBvcnQgY29uc3QgbGFuZ3VhZ2VzICAgICAgPSBucygoKSA9PiBtKCkubGFuZ3VhZ2VzKTtcbmV4cG9ydCBjb25zdCBNYXJrZXJTZXZlcml0eSA9IG5zKCgpID0+IG0oKS5NYXJrZXJTZXZlcml0eSk7XG5leHBvcnQgY29uc3QgTWFya2VyVGFnICAgICAgPSBucygoKSA9PiAobSgpIGFzIGFueSkuTWFya2VyVGFnKTtcbmV4cG9ydCBjb25zdCBVcmkgICAgICAgICAgICA9IGNscygoKSA9PiBtKCkuVXJpKTtcbmV4cG9ydCBjb25zdCBSYW5nZSAgICAgICAgICA9IGNscygoKSA9PiBtKCkuUmFuZ2UpO1xuZXhwb3J0IGNvbnN0IFBvc2l0aW9uICAgICAgID0gY2xzKCgpID0+IG0oKS5Qb3NpdGlvbik7XG5leHBvcnQgY29uc3QgU2VsZWN0aW9uICAgICAgPSBjbHMoKCkgPT4gbSgpLlNlbGVjdGlvbik7XG5leHBvcnQgY29uc3QgS2V5Q29kZSAgICAgICAgPSBucygoKSA9PiBtKCkuS2V5Q29kZSk7XG5leHBvcnQgY29uc3QgS2V5TW9kICAgICAgICAgPSBucygoKSA9PiBtKCkuS2V5TW9kKTtcbiIsICIvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4ndXNlIHN0cmljdCc7XG5leHBvcnQgdmFyIERvY3VtZW50VXJpO1xuKGZ1bmN0aW9uIChEb2N1bWVudFVyaSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnO1xuICAgIH1cbiAgICBEb2N1bWVudFVyaS5pcyA9IGlzO1xufSkoRG9jdW1lbnRVcmkgfHwgKERvY3VtZW50VXJpID0ge30pKTtcbmV4cG9ydCB2YXIgVVJJO1xuKGZ1bmN0aW9uIChVUkkpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJztcbiAgICB9XG4gICAgVVJJLmlzID0gaXM7XG59KShVUkkgfHwgKFVSSSA9IHt9KSk7XG5leHBvcnQgdmFyIGludGVnZXI7XG4oZnVuY3Rpb24gKGludGVnZXIpIHtcbiAgICBpbnRlZ2VyLk1JTl9WQUxVRSA9IC0yMTQ3NDgzNjQ4O1xuICAgIGludGVnZXIuTUFYX1ZBTFVFID0gMjE0NzQ4MzY0NztcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBpbnRlZ2VyLk1JTl9WQUxVRSA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSBpbnRlZ2VyLk1BWF9WQUxVRTtcbiAgICB9XG4gICAgaW50ZWdlci5pcyA9IGlzO1xufSkoaW50ZWdlciB8fCAoaW50ZWdlciA9IHt9KSk7XG5leHBvcnQgdmFyIHVpbnRlZ2VyO1xuKGZ1bmN0aW9uICh1aW50ZWdlcikge1xuICAgIHVpbnRlZ2VyLk1JTl9WQUxVRSA9IDA7XG4gICAgdWludGVnZXIuTUFYX1ZBTFVFID0gMjE0NzQ4MzY0NztcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiB1aW50ZWdlci5NSU5fVkFMVUUgPD0gdmFsdWUgJiYgdmFsdWUgPD0gdWludGVnZXIuTUFYX1ZBTFVFO1xuICAgIH1cbiAgICB1aW50ZWdlci5pcyA9IGlzO1xufSkodWludGVnZXIgfHwgKHVpbnRlZ2VyID0ge30pKTtcbi8qKlxuICogVGhlIFBvc2l0aW9uIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIFBvc2l0aW9ufSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBQb3NpdGlvbjtcbihmdW5jdGlvbiAoUG9zaXRpb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFBvc2l0aW9uIGxpdGVyYWwgZnJvbSB0aGUgZ2l2ZW4gbGluZSBhbmQgY2hhcmFjdGVyLlxuICAgICAqIEBwYXJhbSBsaW5lIFRoZSBwb3NpdGlvbidzIGxpbmUuXG4gICAgICogQHBhcmFtIGNoYXJhY3RlciBUaGUgcG9zaXRpb24ncyBjaGFyYWN0ZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGxpbmUsIGNoYXJhY3Rlcikge1xuICAgICAgICBpZiAobGluZSA9PT0gTnVtYmVyLk1BWF9WQUxVRSkge1xuICAgICAgICAgICAgbGluZSA9IHVpbnRlZ2VyLk1BWF9WQUxVRTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhcmFjdGVyID09PSBOdW1iZXIuTUFYX1ZBTFVFKSB7XG4gICAgICAgICAgICBjaGFyYWN0ZXIgPSB1aW50ZWdlci5NQVhfVkFMVUU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgbGluZSwgY2hhcmFjdGVyIH07XG4gICAgfVxuICAgIFBvc2l0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIFBvc2l0aW9ufSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS5saW5lKSAmJiBJcy51aW50ZWdlcihjYW5kaWRhdGUuY2hhcmFjdGVyKTtcbiAgICB9XG4gICAgUG9zaXRpb24uaXMgPSBpcztcbn0pKFBvc2l0aW9uIHx8IChQb3NpdGlvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBSYW5nZSBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBSYW5nZX0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgUmFuZ2U7XG4oZnVuY3Rpb24gKFJhbmdlKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKG9uZSwgdHdvLCB0aHJlZSwgZm91cikge1xuICAgICAgICBpZiAoSXMudWludGVnZXIob25lKSAmJiBJcy51aW50ZWdlcih0d28pICYmIElzLnVpbnRlZ2VyKHRocmVlKSAmJiBJcy51aW50ZWdlcihmb3VyKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IFBvc2l0aW9uLmNyZWF0ZShvbmUsIHR3byksIGVuZDogUG9zaXRpb24uY3JlYXRlKHRocmVlLCBmb3VyKSB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKFBvc2l0aW9uLmlzKG9uZSkgJiYgUG9zaXRpb24uaXModHdvKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IG9uZSwgZW5kOiB0d28gfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmFuZ2UjY3JlYXRlIGNhbGxlZCB3aXRoIGludmFsaWQgYXJndW1lbnRzWyR7b25lfSwgJHt0d299LCAke3RocmVlfSwgJHtmb3VyfV1gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBSYW5nZS5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBSYW5nZX0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBQb3NpdGlvbi5pcyhjYW5kaWRhdGUuc3RhcnQpICYmIFBvc2l0aW9uLmlzKGNhbmRpZGF0ZS5lbmQpO1xuICAgIH1cbiAgICBSYW5nZS5pcyA9IGlzO1xufSkoUmFuZ2UgfHwgKFJhbmdlID0ge30pKTtcbi8qKlxuICogVGhlIExvY2F0aW9uIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIExvY2F0aW9ufSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBMb2NhdGlvbjtcbihmdW5jdGlvbiAoTG9jYXRpb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgTG9jYXRpb24gbGl0ZXJhbC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSBsb2NhdGlvbidzIHVyaS5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIGxvY2F0aW9uJ3MgcmFuZ2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHVyaSwgcmFuZ2UpIHtcbiAgICAgICAgcmV0dXJuIHsgdXJpLCByYW5nZSB9O1xuICAgIH1cbiAgICBMb2NhdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBMb2NhdGlvbn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIChJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSkgfHwgSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS51cmkpKTtcbiAgICB9XG4gICAgTG9jYXRpb24uaXMgPSBpcztcbn0pKExvY2F0aW9uIHx8IChMb2NhdGlvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBMb2NhdGlvbkxpbmsgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgTG9jYXRpb25MaW5rfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBMb2NhdGlvbkxpbms7XG4oZnVuY3Rpb24gKExvY2F0aW9uTGluaykge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBMb2NhdGlvbkxpbmsgbGl0ZXJhbC5cbiAgICAgKiBAcGFyYW0gdGFyZ2V0VXJpIFRoZSBkZWZpbml0aW9uJ3MgdXJpLlxuICAgICAqIEBwYXJhbSB0YXJnZXRSYW5nZSBUaGUgZnVsbCByYW5nZSBvZiB0aGUgZGVmaW5pdGlvbi5cbiAgICAgKiBAcGFyYW0gdGFyZ2V0U2VsZWN0aW9uUmFuZ2UgVGhlIHNwYW4gb2YgdGhlIHN5bWJvbCBkZWZpbml0aW9uIGF0IHRoZSB0YXJnZXQuXG4gICAgICogQHBhcmFtIG9yaWdpblNlbGVjdGlvblJhbmdlIFRoZSBzcGFuIG9mIHRoZSBzeW1ib2wgYmVpbmcgZGVmaW5lZCBpbiB0aGUgb3JpZ2luYXRpbmcgc291cmNlIGZpbGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHRhcmdldFVyaSwgdGFyZ2V0UmFuZ2UsIHRhcmdldFNlbGVjdGlvblJhbmdlLCBvcmlnaW5TZWxlY3Rpb25SYW5nZSkge1xuICAgICAgICByZXR1cm4geyB0YXJnZXRVcmksIHRhcmdldFJhbmdlLCB0YXJnZXRTZWxlY3Rpb25SYW5nZSwgb3JpZ2luU2VsZWN0aW9uUmFuZ2UgfTtcbiAgICB9XG4gICAgTG9jYXRpb25MaW5rLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIExvY2F0aW9uTGlua30gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUudGFyZ2V0UmFuZ2UpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudGFyZ2V0VXJpKVxuICAgICAgICAgICAgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnRhcmdldFNlbGVjdGlvblJhbmdlKVxuICAgICAgICAgICAgJiYgKFJhbmdlLmlzKGNhbmRpZGF0ZS5vcmlnaW5TZWxlY3Rpb25SYW5nZSkgfHwgSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5vcmlnaW5TZWxlY3Rpb25SYW5nZSkpO1xuICAgIH1cbiAgICBMb2NhdGlvbkxpbmsuaXMgPSBpcztcbn0pKExvY2F0aW9uTGluayB8fCAoTG9jYXRpb25MaW5rID0ge30pKTtcbi8qKlxuICogVGhlIENvbG9yIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIENvbG9yfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBDb2xvcjtcbihmdW5jdGlvbiAoQ29sb3IpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENvbG9yIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZWQsXG4gICAgICAgICAgICBncmVlbixcbiAgICAgICAgICAgIGJsdWUsXG4gICAgICAgICAgICBhbHBoYSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgQ29sb3IuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgQ29sb3J9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBJcy5udW1iZXJSYW5nZShjYW5kaWRhdGUucmVkLCAwLCAxKVxuICAgICAgICAgICAgJiYgSXMubnVtYmVyUmFuZ2UoY2FuZGlkYXRlLmdyZWVuLCAwLCAxKVxuICAgICAgICAgICAgJiYgSXMubnVtYmVyUmFuZ2UoY2FuZGlkYXRlLmJsdWUsIDAsIDEpXG4gICAgICAgICAgICAmJiBJcy5udW1iZXJSYW5nZShjYW5kaWRhdGUuYWxwaGEsIDAsIDEpO1xuICAgIH1cbiAgICBDb2xvci5pcyA9IGlzO1xufSkoQ29sb3IgfHwgKENvbG9yID0ge30pKTtcbi8qKlxuICogVGhlIENvbG9ySW5mb3JtYXRpb24gbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgQ29sb3JJbmZvcm1hdGlvbn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgQ29sb3JJbmZvcm1hdGlvbjtcbihmdW5jdGlvbiAoQ29sb3JJbmZvcm1hdGlvbikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ29sb3JJbmZvcm1hdGlvbiBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgY29sb3IpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJhbmdlLFxuICAgICAgICAgICAgY29sb3IsXG4gICAgICAgIH07XG4gICAgfVxuICAgIENvbG9ySW5mb3JtYXRpb24uY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgQ29sb3JJbmZvcm1hdGlvbn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgQ29sb3IuaXMoY2FuZGlkYXRlLmNvbG9yKTtcbiAgICB9XG4gICAgQ29sb3JJbmZvcm1hdGlvbi5pcyA9IGlzO1xufSkoQ29sb3JJbmZvcm1hdGlvbiB8fCAoQ29sb3JJbmZvcm1hdGlvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb2xvciBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBDb2xvclByZXNlbnRhdGlvbn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgQ29sb3JQcmVzZW50YXRpb247XG4oZnVuY3Rpb24gKENvbG9yUHJlc2VudGF0aW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDb2xvckluZm9ybWF0aW9uIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGxhYmVsLCB0ZXh0RWRpdCwgYWRkaXRpb25hbFRleHRFZGl0cykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICB0ZXh0RWRpdCxcbiAgICAgICAgICAgIGFkZGl0aW9uYWxUZXh0RWRpdHMsXG4gICAgICAgIH07XG4gICAgfVxuICAgIENvbG9yUHJlc2VudGF0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIENvbG9ySW5mb3JtYXRpb259IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLmxhYmVsKVxuICAgICAgICAgICAgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUudGV4dEVkaXQpIHx8IFRleHRFZGl0LmlzKGNhbmRpZGF0ZSkpXG4gICAgICAgICAgICAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5hZGRpdGlvbmFsVGV4dEVkaXRzKSB8fCBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS5hZGRpdGlvbmFsVGV4dEVkaXRzLCBUZXh0RWRpdC5pcykpO1xuICAgIH1cbiAgICBDb2xvclByZXNlbnRhdGlvbi5pcyA9IGlzO1xufSkoQ29sb3JQcmVzZW50YXRpb24gfHwgKENvbG9yUHJlc2VudGF0aW9uID0ge30pKTtcbi8qKlxuICogQSBzZXQgb2YgcHJlZGVmaW5lZCByYW5nZSBraW5kcy5cbiAqL1xuZXhwb3J0IHZhciBGb2xkaW5nUmFuZ2VLaW5kO1xuKGZ1bmN0aW9uIChGb2xkaW5nUmFuZ2VLaW5kKSB7XG4gICAgLyoqXG4gICAgICogRm9sZGluZyByYW5nZSBmb3IgYSBjb21tZW50XG4gICAgICovXG4gICAgRm9sZGluZ1JhbmdlS2luZC5Db21tZW50ID0gJ2NvbW1lbnQnO1xuICAgIC8qKlxuICAgICAqIEZvbGRpbmcgcmFuZ2UgZm9yIGFuIGltcG9ydCBvciBpbmNsdWRlXG4gICAgICovXG4gICAgRm9sZGluZ1JhbmdlS2luZC5JbXBvcnRzID0gJ2ltcG9ydHMnO1xuICAgIC8qKlxuICAgICAqIEZvbGRpbmcgcmFuZ2UgZm9yIGEgcmVnaW9uIChlLmcuIGAjcmVnaW9uYClcbiAgICAgKi9cbiAgICBGb2xkaW5nUmFuZ2VLaW5kLlJlZ2lvbiA9ICdyZWdpb24nO1xufSkoRm9sZGluZ1JhbmdlS2luZCB8fCAoRm9sZGluZ1JhbmdlS2luZCA9IHt9KSk7XG4vKipcbiAqIFRoZSBmb2xkaW5nIHJhbmdlIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIEZvbGRpbmdSYW5nZX0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgRm9sZGluZ1JhbmdlO1xuKGZ1bmN0aW9uIChGb2xkaW5nUmFuZ2UpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IEZvbGRpbmdSYW5nZSBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShzdGFydExpbmUsIGVuZExpbmUsIHN0YXJ0Q2hhcmFjdGVyLCBlbmRDaGFyYWN0ZXIsIGtpbmQsIGNvbGxhcHNlZFRleHQpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgc3RhcnRMaW5lLFxuICAgICAgICAgICAgZW5kTGluZVxuICAgICAgICB9O1xuICAgICAgICBpZiAoSXMuZGVmaW5lZChzdGFydENoYXJhY3RlcikpIHtcbiAgICAgICAgICAgIHJlc3VsdC5zdGFydENoYXJhY3RlciA9IHN0YXJ0Q2hhcmFjdGVyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKGVuZENoYXJhY3RlcikpIHtcbiAgICAgICAgICAgIHJlc3VsdC5lbmRDaGFyYWN0ZXIgPSBlbmRDaGFyYWN0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzLmRlZmluZWQoa2luZCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5raW5kID0ga2luZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXMuZGVmaW5lZChjb2xsYXBzZWRUZXh0KSkge1xuICAgICAgICAgICAgcmVzdWx0LmNvbGxhcHNlZFRleHQgPSBjb2xsYXBzZWRUZXh0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIEZvbGRpbmdSYW5nZS5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBGb2xkaW5nUmFuZ2V9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBJcy51aW50ZWdlcihjYW5kaWRhdGUuc3RhcnRMaW5lKSAmJiBJcy51aW50ZWdlcihjYW5kaWRhdGUuc3RhcnRMaW5lKVxuICAgICAgICAgICAgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUuc3RhcnRDaGFyYWN0ZXIpIHx8IElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS5zdGFydENoYXJhY3RlcikpXG4gICAgICAgICAgICAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5lbmRDaGFyYWN0ZXIpIHx8IElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS5lbmRDaGFyYWN0ZXIpKVxuICAgICAgICAgICAgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUua2luZCkgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS5raW5kKSk7XG4gICAgfVxuICAgIEZvbGRpbmdSYW5nZS5pcyA9IGlzO1xufSkoRm9sZGluZ1JhbmdlIHx8IChGb2xkaW5nUmFuZ2UgPSB7fSkpO1xuLyoqXG4gKiBUaGUgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbiBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9ufSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uO1xuKGZ1bmN0aW9uIChEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGxvY2F0aW9uLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgICAgIG1lc3NhZ2VcbiAgICAgICAgfTtcbiAgICB9XG4gICAgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9ufSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIExvY2F0aW9uLmlzKGNhbmRpZGF0ZS5sb2NhdGlvbikgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5tZXNzYWdlKTtcbiAgICB9XG4gICAgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbi5pcyA9IGlzO1xufSkoRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbiB8fCAoRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBkaWFnbm9zdGljJ3Mgc2V2ZXJpdHkuXG4gKi9cbmV4cG9ydCB2YXIgRGlhZ25vc3RpY1NldmVyaXR5O1xuKGZ1bmN0aW9uIChEaWFnbm9zdGljU2V2ZXJpdHkpIHtcbiAgICAvKipcbiAgICAgKiBSZXBvcnRzIGFuIGVycm9yLlxuICAgICAqL1xuICAgIERpYWdub3N0aWNTZXZlcml0eS5FcnJvciA9IDE7XG4gICAgLyoqXG4gICAgICogUmVwb3J0cyBhIHdhcm5pbmcuXG4gICAgICovXG4gICAgRGlhZ25vc3RpY1NldmVyaXR5Lldhcm5pbmcgPSAyO1xuICAgIC8qKlxuICAgICAqIFJlcG9ydHMgYW4gaW5mb3JtYXRpb24uXG4gICAgICovXG4gICAgRGlhZ25vc3RpY1NldmVyaXR5LkluZm9ybWF0aW9uID0gMztcbiAgICAvKipcbiAgICAgKiBSZXBvcnRzIGEgaGludC5cbiAgICAgKi9cbiAgICBEaWFnbm9zdGljU2V2ZXJpdHkuSGludCA9IDQ7XG59KShEaWFnbm9zdGljU2V2ZXJpdHkgfHwgKERpYWdub3N0aWNTZXZlcml0eSA9IHt9KSk7XG4vKipcbiAqIFRoZSBkaWFnbm9zdGljIHRhZ3MuXG4gKlxuICogQHNpbmNlIDMuMTUuMFxuICovXG5leHBvcnQgdmFyIERpYWdub3N0aWNUYWc7XG4oZnVuY3Rpb24gKERpYWdub3N0aWNUYWcpIHtcbiAgICAvKipcbiAgICAgKiBVbnVzZWQgb3IgdW5uZWNlc3NhcnkgY29kZS5cbiAgICAgKlxuICAgICAqIENsaWVudHMgYXJlIGFsbG93ZWQgdG8gcmVuZGVyIGRpYWdub3N0aWNzIHdpdGggdGhpcyB0YWcgZmFkZWQgb3V0IGluc3RlYWQgb2YgaGF2aW5nXG4gICAgICogYW4gZXJyb3Igc3F1aWdnbGUuXG4gICAgICovXG4gICAgRGlhZ25vc3RpY1RhZy5Vbm5lY2Vzc2FyeSA9IDE7XG4gICAgLyoqXG4gICAgICogRGVwcmVjYXRlZCBvciBvYnNvbGV0ZSBjb2RlLlxuICAgICAqXG4gICAgICogQ2xpZW50cyBhcmUgYWxsb3dlZCB0byByZW5kZXJlZCBkaWFnbm9zdGljcyB3aXRoIHRoaXMgdGFnIHN0cmlrZSB0aHJvdWdoLlxuICAgICAqL1xuICAgIERpYWdub3N0aWNUYWcuRGVwcmVjYXRlZCA9IDI7XG59KShEaWFnbm9zdGljVGFnIHx8IChEaWFnbm9zdGljVGFnID0ge30pKTtcbi8qKlxuICogVGhlIENvZGVEZXNjcmlwdGlvbiBuYW1lc3BhY2UgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCBkZXNjcmlwdGlvbnMgZm9yIGRpYWdub3N0aWMgY29kZXMuXG4gKlxuICogQHNpbmNlIDMuMTYuMFxuICovXG5leHBvcnQgdmFyIENvZGVEZXNjcmlwdGlvbjtcbihmdW5jdGlvbiAoQ29kZURlc2NyaXB0aW9uKSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5ocmVmKTtcbiAgICB9XG4gICAgQ29kZURlc2NyaXB0aW9uLmlzID0gaXM7XG59KShDb2RlRGVzY3JpcHRpb24gfHwgKENvZGVEZXNjcmlwdGlvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBEaWFnbm9zdGljIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIERpYWdub3N0aWN9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIERpYWdub3N0aWM7XG4oZnVuY3Rpb24gKERpYWdub3N0aWMpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IERpYWdub3N0aWMgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIG1lc3NhZ2UsIHNldmVyaXR5LCBjb2RlLCBzb3VyY2UsIHJlbGF0ZWRJbmZvcm1hdGlvbikge1xuICAgICAgICBsZXQgcmVzdWx0ID0geyByYW5nZSwgbWVzc2FnZSB9O1xuICAgICAgICBpZiAoSXMuZGVmaW5lZChzZXZlcml0eSkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5zZXZlcml0eSA9IHNldmVyaXR5O1xuICAgICAgICB9XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKGNvZGUpKSB7XG4gICAgICAgICAgICByZXN1bHQuY29kZSA9IGNvZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzLmRlZmluZWQoc291cmNlKSkge1xuICAgICAgICAgICAgcmVzdWx0LnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXMuZGVmaW5lZChyZWxhdGVkSW5mb3JtYXRpb24pKSB7XG4gICAgICAgICAgICByZXN1bHQucmVsYXRlZEluZm9ybWF0aW9uID0gcmVsYXRlZEluZm9ybWF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIERpYWdub3N0aWMuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgRGlhZ25vc3RpY30gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpXG4gICAgICAgICAgICAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpXG4gICAgICAgICAgICAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLm1lc3NhZ2UpXG4gICAgICAgICAgICAmJiAoSXMubnVtYmVyKGNhbmRpZGF0ZS5zZXZlcml0eSkgfHwgSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5zZXZlcml0eSkpXG4gICAgICAgICAgICAmJiAoSXMuaW50ZWdlcihjYW5kaWRhdGUuY29kZSkgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS5jb2RlKSB8fCBJcy51bmRlZmluZWQoY2FuZGlkYXRlLmNvZGUpKVxuICAgICAgICAgICAgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUuY29kZURlc2NyaXB0aW9uKSB8fCAoSXMuc3RyaW5nKChfYSA9IGNhbmRpZGF0ZS5jb2RlRGVzY3JpcHRpb24pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5ocmVmKSkpXG4gICAgICAgICAgICAmJiAoSXMuc3RyaW5nKGNhbmRpZGF0ZS5zb3VyY2UpIHx8IElzLnVuZGVmaW5lZChjYW5kaWRhdGUuc291cmNlKSlcbiAgICAgICAgICAgICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLnJlbGF0ZWRJbmZvcm1hdGlvbikgfHwgSXMudHlwZWRBcnJheShjYW5kaWRhdGUucmVsYXRlZEluZm9ybWF0aW9uLCBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uLmlzKSk7XG4gICAgfVxuICAgIERpYWdub3N0aWMuaXMgPSBpcztcbn0pKERpYWdub3N0aWMgfHwgKERpYWdub3N0aWMgPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29tbWFuZCBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBDb21tYW5kfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBDb21tYW5kO1xuKGZ1bmN0aW9uIChDb21tYW5kKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDb21tYW5kIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHRpdGxlLCBjb21tYW5kLCAuLi5hcmdzKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IHRpdGxlLCBjb21tYW5kIH07XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKGFyZ3MpICYmIGFyZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmVzdWx0LmFyZ3VtZW50cyA9IGFyZ3M7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgQ29tbWFuZC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBDb21tYW5kfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudGl0bGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUuY29tbWFuZCk7XG4gICAgfVxuICAgIENvbW1hbmQuaXMgPSBpcztcbn0pKENvbW1hbmQgfHwgKENvbW1hbmQgPSB7fSkpO1xuLyoqXG4gKiBUaGUgVGV4dEVkaXQgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgcmVwbGFjZSxcbiAqIGluc2VydCBhbmQgZGVsZXRlIGVkaXRzIG1vcmUgZWFzaWx5LlxuICovXG5leHBvcnQgdmFyIFRleHRFZGl0O1xuKGZ1bmN0aW9uIChUZXh0RWRpdCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSByZXBsYWNlIHRleHQgZWRpdC5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlIG9mIHRleHQgdG8gYmUgcmVwbGFjZWQuXG4gICAgICogQHBhcmFtIG5ld1RleHQgVGhlIG5ldyB0ZXh0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlcGxhY2UocmFuZ2UsIG5ld1RleHQpIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIG5ld1RleHQgfTtcbiAgICB9XG4gICAgVGV4dEVkaXQucmVwbGFjZSA9IHJlcGxhY2U7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnNlcnQgdGV4dCBlZGl0LlxuICAgICAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgcG9zaXRpb24gdG8gaW5zZXJ0IHRoZSB0ZXh0IGF0LlxuICAgICAqIEBwYXJhbSBuZXdUZXh0IFRoZSB0ZXh0IHRvIGJlIGluc2VydGVkLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluc2VydChwb3NpdGlvbiwgbmV3VGV4dCkge1xuICAgICAgICByZXR1cm4geyByYW5nZTogeyBzdGFydDogcG9zaXRpb24sIGVuZDogcG9zaXRpb24gfSwgbmV3VGV4dCB9O1xuICAgIH1cbiAgICBUZXh0RWRpdC5pbnNlcnQgPSBpbnNlcnQ7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGRlbGV0ZSB0ZXh0IGVkaXQuXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSBvZiB0ZXh0IHRvIGJlIGRlbGV0ZWQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZGVsKHJhbmdlKSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCBuZXdUZXh0OiAnJyB9O1xuICAgIH1cbiAgICBUZXh0RWRpdC5kZWwgPSBkZWw7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSlcbiAgICAgICAgICAgICYmIElzLnN0cmluZyhjYW5kaWRhdGUubmV3VGV4dClcbiAgICAgICAgICAgICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSk7XG4gICAgfVxuICAgIFRleHRFZGl0LmlzID0gaXM7XG59KShUZXh0RWRpdCB8fCAoVGV4dEVkaXQgPSB7fSkpO1xuZXhwb3J0IHZhciBDaGFuZ2VBbm5vdGF0aW9uO1xuKGZ1bmN0aW9uIChDaGFuZ2VBbm5vdGF0aW9uKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKGxhYmVsLCBuZWVkc0NvbmZpcm1hdGlvbiwgZGVzY3JpcHRpb24pIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0geyBsYWJlbCB9O1xuICAgICAgICBpZiAobmVlZHNDb25maXJtYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0Lm5lZWRzQ29uZmlybWF0aW9uID0gbmVlZHNDb25maXJtYXRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIENoYW5nZUFubm90YXRpb24uY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUubGFiZWwpICYmXG4gICAgICAgICAgICAoSXMuYm9vbGVhbihjYW5kaWRhdGUubmVlZHNDb25maXJtYXRpb24pIHx8IGNhbmRpZGF0ZS5uZWVkc0NvbmZpcm1hdGlvbiA9PT0gdW5kZWZpbmVkKSAmJlxuICAgICAgICAgICAgKElzLnN0cmluZyhjYW5kaWRhdGUuZGVzY3JpcHRpb24pIHx8IGNhbmRpZGF0ZS5kZXNjcmlwdGlvbiA9PT0gdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgQ2hhbmdlQW5ub3RhdGlvbi5pcyA9IGlzO1xufSkoQ2hhbmdlQW5ub3RhdGlvbiB8fCAoQ2hhbmdlQW5ub3RhdGlvbiA9IHt9KSk7XG5leHBvcnQgdmFyIENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyO1xuKGZ1bmN0aW9uIChDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuc3RyaW5nKGNhbmRpZGF0ZSk7XG4gICAgfVxuICAgIENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzID0gaXM7XG59KShDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllciB8fCAoQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIgPSB7fSkpO1xuZXhwb3J0IHZhciBBbm5vdGF0ZWRUZXh0RWRpdDtcbihmdW5jdGlvbiAoQW5ub3RhdGVkVGV4dEVkaXQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFubm90YXRlZCByZXBsYWNlIHRleHQgZWRpdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2Ugb2YgdGV4dCB0byBiZSByZXBsYWNlZC5cbiAgICAgKiBAcGFyYW0gbmV3VGV4dCBUaGUgbmV3IHRleHQuXG4gICAgICogQHBhcmFtIGFubm90YXRpb24gVGhlIGFubm90YXRpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVwbGFjZShyYW5nZSwgbmV3VGV4dCwgYW5ub3RhdGlvbikge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgbmV3VGV4dCwgYW5ub3RhdGlvbklkOiBhbm5vdGF0aW9uIH07XG4gICAgfVxuICAgIEFubm90YXRlZFRleHRFZGl0LnJlcGxhY2UgPSByZXBsYWNlO1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYW5ub3RhdGVkIGluc2VydCB0ZXh0IGVkaXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIHBvc2l0aW9uIHRvIGluc2VydCB0aGUgdGV4dCBhdC5cbiAgICAgKiBAcGFyYW0gbmV3VGV4dCBUaGUgdGV4dCB0byBiZSBpbnNlcnRlZC5cbiAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiBUaGUgYW5ub3RhdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbnNlcnQocG9zaXRpb24sIG5ld1RleHQsIGFubm90YXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2U6IHsgc3RhcnQ6IHBvc2l0aW9uLCBlbmQ6IHBvc2l0aW9uIH0sIG5ld1RleHQsIGFubm90YXRpb25JZDogYW5ub3RhdGlvbiB9O1xuICAgIH1cbiAgICBBbm5vdGF0ZWRUZXh0RWRpdC5pbnNlcnQgPSBpbnNlcnQ7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhbm5vdGF0ZWQgZGVsZXRlIHRleHQgZWRpdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2Ugb2YgdGV4dCB0byBiZSBkZWxldGVkLlxuICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIFRoZSBhbm5vdGF0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRlbChyYW5nZSwgYW5ub3RhdGlvbikge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgbmV3VGV4dDogJycsIGFubm90YXRpb25JZDogYW5ub3RhdGlvbiB9O1xuICAgIH1cbiAgICBBbm5vdGF0ZWRUZXh0RWRpdC5kZWwgPSBkZWw7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBUZXh0RWRpdC5pcyhjYW5kaWRhdGUpICYmIChDaGFuZ2VBbm5vdGF0aW9uLmlzKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQpIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQpKTtcbiAgICB9XG4gICAgQW5ub3RhdGVkVGV4dEVkaXQuaXMgPSBpcztcbn0pKEFubm90YXRlZFRleHRFZGl0IHx8IChBbm5vdGF0ZWRUZXh0RWRpdCA9IHt9KSk7XG4vKipcbiAqIFRoZSBUZXh0RG9jdW1lbnRFZGl0IG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlXG4gKiBhbiBlZGl0IHRoYXQgbWFuaXB1bGF0ZXMgYSB0ZXh0IGRvY3VtZW50LlxuICovXG5leHBvcnQgdmFyIFRleHREb2N1bWVudEVkaXQ7XG4oZnVuY3Rpb24gKFRleHREb2N1bWVudEVkaXQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGBUZXh0RG9jdW1lbnRFZGl0YFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh0ZXh0RG9jdW1lbnQsIGVkaXRzKSB7XG4gICAgICAgIHJldHVybiB7IHRleHREb2N1bWVudCwgZWRpdHMgfTtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50RWRpdC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpXG4gICAgICAgICAgICAmJiBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIuaXMoY2FuZGlkYXRlLnRleHREb2N1bWVudClcbiAgICAgICAgICAgICYmIEFycmF5LmlzQXJyYXkoY2FuZGlkYXRlLmVkaXRzKTtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50RWRpdC5pcyA9IGlzO1xufSkoVGV4dERvY3VtZW50RWRpdCB8fCAoVGV4dERvY3VtZW50RWRpdCA9IHt9KSk7XG5leHBvcnQgdmFyIENyZWF0ZUZpbGU7XG4oZnVuY3Rpb24gKENyZWF0ZUZpbGUpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUodXJpLCBvcHRpb25zLCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7XG4gICAgICAgICAgICBraW5kOiAnY3JlYXRlJyxcbiAgICAgICAgICAgIHVyaVxuICAgICAgICB9O1xuICAgICAgICBpZiAob3B0aW9ucyAhPT0gdW5kZWZpbmVkICYmIChvcHRpb25zLm92ZXJ3cml0ZSAhPT0gdW5kZWZpbmVkIHx8IG9wdGlvbnMuaWdub3JlSWZFeGlzdHMgIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgfVxuICAgICAgICBpZiAoYW5ub3RhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQuYW5ub3RhdGlvbklkID0gYW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBDcmVhdGVGaWxlLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgY2FuZGlkYXRlLmtpbmQgPT09ICdjcmVhdGUnICYmIElzLnN0cmluZyhjYW5kaWRhdGUudXJpKSAmJiAoY2FuZGlkYXRlLm9wdGlvbnMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgKChjYW5kaWRhdGUub3B0aW9ucy5vdmVyd3JpdGUgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5vcHRpb25zLm92ZXJ3cml0ZSkpICYmIChjYW5kaWRhdGUub3B0aW9ucy5pZ25vcmVJZkV4aXN0cyA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLm9wdGlvbnMuaWdub3JlSWZFeGlzdHMpKSkpICYmIChjYW5kaWRhdGUuYW5ub3RhdGlvbklkID09PSB1bmRlZmluZWQgfHwgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoY2FuZGlkYXRlLmFubm90YXRpb25JZCkpO1xuICAgIH1cbiAgICBDcmVhdGVGaWxlLmlzID0gaXM7XG59KShDcmVhdGVGaWxlIHx8IChDcmVhdGVGaWxlID0ge30pKTtcbmV4cG9ydCB2YXIgUmVuYW1lRmlsZTtcbihmdW5jdGlvbiAoUmVuYW1lRmlsZSkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShvbGRVcmksIG5ld1VyaSwgb3B0aW9ucywgYW5ub3RhdGlvbikge1xuICAgICAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgICAgICAga2luZDogJ3JlbmFtZScsXG4gICAgICAgICAgICBvbGRVcmksXG4gICAgICAgICAgICBuZXdVcmlcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKG9wdGlvbnMgIT09IHVuZGVmaW5lZCAmJiAob3B0aW9ucy5vdmVyd3JpdGUgIT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLmlnbm9yZUlmRXhpc3RzICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICByZXN1bHQub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFubm90YXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmFubm90YXRpb25JZCA9IGFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgUmVuYW1lRmlsZS5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIGNhbmRpZGF0ZS5raW5kID09PSAncmVuYW1lJyAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLm9sZFVyaSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5uZXdVcmkpICYmIChjYW5kaWRhdGUub3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAoKGNhbmRpZGF0ZS5vcHRpb25zLm92ZXJ3cml0ZSA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLm9wdGlvbnMub3ZlcndyaXRlKSkgJiYgKGNhbmRpZGF0ZS5vcHRpb25zLmlnbm9yZUlmRXhpc3RzID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUub3B0aW9ucy5pZ25vcmVJZkV4aXN0cykpKSkgJiYgKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQgPT09IHVuZGVmaW5lZCB8fCBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhjYW5kaWRhdGUuYW5ub3RhdGlvbklkKSk7XG4gICAgfVxuICAgIFJlbmFtZUZpbGUuaXMgPSBpcztcbn0pKFJlbmFtZUZpbGUgfHwgKFJlbmFtZUZpbGUgPSB7fSkpO1xuZXhwb3J0IHZhciBEZWxldGVGaWxlO1xuKGZ1bmN0aW9uIChEZWxldGVGaWxlKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKHVyaSwgb3B0aW9ucywgYW5ub3RhdGlvbikge1xuICAgICAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgICAgICAga2luZDogJ2RlbGV0ZScsXG4gICAgICAgICAgICB1cmlcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKG9wdGlvbnMgIT09IHVuZGVmaW5lZCAmJiAob3B0aW9ucy5yZWN1cnNpdmUgIT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLmlnbm9yZUlmTm90RXhpc3RzICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICByZXN1bHQub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFubm90YXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmFubm90YXRpb25JZCA9IGFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgRGVsZXRlRmlsZS5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIGNhbmRpZGF0ZS5raW5kID09PSAnZGVsZXRlJyAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSkgJiYgKGNhbmRpZGF0ZS5vcHRpb25zID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICgoY2FuZGlkYXRlLm9wdGlvbnMucmVjdXJzaXZlID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUub3B0aW9ucy5yZWN1cnNpdmUpKSAmJiAoY2FuZGlkYXRlLm9wdGlvbnMuaWdub3JlSWZOb3RFeGlzdHMgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5vcHRpb25zLmlnbm9yZUlmTm90RXhpc3RzKSkpKSAmJiAoY2FuZGlkYXRlLmFubm90YXRpb25JZCA9PT0gdW5kZWZpbmVkIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQpKTtcbiAgICB9XG4gICAgRGVsZXRlRmlsZS5pcyA9IGlzO1xufSkoRGVsZXRlRmlsZSB8fCAoRGVsZXRlRmlsZSA9IHt9KSk7XG5leHBvcnQgdmFyIFdvcmtzcGFjZUVkaXQ7XG4oZnVuY3Rpb24gKFdvcmtzcGFjZUVkaXQpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuY2hhbmdlcyAhPT0gdW5kZWZpbmVkIHx8IGNhbmRpZGF0ZS5kb2N1bWVudENoYW5nZXMgIT09IHVuZGVmaW5lZCkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuZG9jdW1lbnRDaGFuZ2VzID09PSB1bmRlZmluZWQgfHwgY2FuZGlkYXRlLmRvY3VtZW50Q2hhbmdlcy5ldmVyeSgoY2hhbmdlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKElzLnN0cmluZyhjaGFuZ2Uua2luZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZUZpbGUuaXMoY2hhbmdlKSB8fCBSZW5hbWVGaWxlLmlzKGNoYW5nZSkgfHwgRGVsZXRlRmlsZS5pcyhjaGFuZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRleHREb2N1bWVudEVkaXQuaXMoY2hhbmdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSk7XG4gICAgfVxuICAgIFdvcmtzcGFjZUVkaXQuaXMgPSBpcztcbn0pKFdvcmtzcGFjZUVkaXQgfHwgKFdvcmtzcGFjZUVkaXQgPSB7fSkpO1xuY2xhc3MgVGV4dEVkaXRDaGFuZ2VJbXBsIHtcbiAgICBjb25zdHJ1Y3RvcihlZGl0cywgY2hhbmdlQW5ub3RhdGlvbnMpIHtcbiAgICAgICAgdGhpcy5lZGl0cyA9IGVkaXRzO1xuICAgICAgICB0aGlzLmNoYW5nZUFubm90YXRpb25zID0gY2hhbmdlQW5ub3RhdGlvbnM7XG4gICAgfVxuICAgIGluc2VydChwb3NpdGlvbiwgbmV3VGV4dCwgYW5ub3RhdGlvbikge1xuICAgICAgICBsZXQgZWRpdDtcbiAgICAgICAgbGV0IGlkO1xuICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBlZGl0ID0gVGV4dEVkaXQuaW5zZXJ0KHBvc2l0aW9uLCBuZXdUZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhhbm5vdGF0aW9uKSkge1xuICAgICAgICAgICAgaWQgPSBhbm5vdGF0aW9uO1xuICAgICAgICAgICAgZWRpdCA9IEFubm90YXRlZFRleHRFZGl0Lmluc2VydChwb3NpdGlvbiwgbmV3VGV4dCwgYW5ub3RhdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFzc2VydENoYW5nZUFubm90YXRpb25zKHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgaWQgPSB0aGlzLmNoYW5nZUFubm90YXRpb25zLm1hbmFnZShhbm5vdGF0aW9uKTtcbiAgICAgICAgICAgIGVkaXQgPSBBbm5vdGF0ZWRUZXh0RWRpdC5pbnNlcnQocG9zaXRpb24sIG5ld1RleHQsIGlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVkaXRzLnB1c2goZWRpdCk7XG4gICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVwbGFjZShyYW5nZSwgbmV3VGV4dCwgYW5ub3RhdGlvbikge1xuICAgICAgICBsZXQgZWRpdDtcbiAgICAgICAgbGV0IGlkO1xuICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBlZGl0ID0gVGV4dEVkaXQucmVwbGFjZShyYW5nZSwgbmV3VGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoYW5ub3RhdGlvbikpIHtcbiAgICAgICAgICAgIGlkID0gYW5ub3RhdGlvbjtcbiAgICAgICAgICAgIGVkaXQgPSBBbm5vdGF0ZWRUZXh0RWRpdC5yZXBsYWNlKHJhbmdlLCBuZXdUZXh0LCBhbm5vdGF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYXNzZXJ0Q2hhbmdlQW5ub3RhdGlvbnModGhpcy5jaGFuZ2VBbm5vdGF0aW9ucyk7XG4gICAgICAgICAgICBpZCA9IHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMubWFuYWdlKGFubm90YXRpb24pO1xuICAgICAgICAgICAgZWRpdCA9IEFubm90YXRlZFRleHRFZGl0LnJlcGxhY2UocmFuZ2UsIG5ld1RleHQsIGlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVkaXRzLnB1c2goZWRpdCk7XG4gICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVsZXRlKHJhbmdlLCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIGxldCBlZGl0O1xuICAgICAgICBsZXQgaWQ7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGVkaXQgPSBUZXh0RWRpdC5kZWwocmFuZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGFubm90YXRpb24pKSB7XG4gICAgICAgICAgICBpZCA9IGFubm90YXRpb247XG4gICAgICAgICAgICBlZGl0ID0gQW5ub3RhdGVkVGV4dEVkaXQuZGVsKHJhbmdlLCBhbm5vdGF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYXNzZXJ0Q2hhbmdlQW5ub3RhdGlvbnModGhpcy5jaGFuZ2VBbm5vdGF0aW9ucyk7XG4gICAgICAgICAgICBpZCA9IHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMubWFuYWdlKGFubm90YXRpb24pO1xuICAgICAgICAgICAgZWRpdCA9IEFubm90YXRlZFRleHRFZGl0LmRlbChyYW5nZSwgaWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWRpdHMucHVzaChlZGl0KTtcbiAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhZGQoZWRpdCkge1xuICAgICAgICB0aGlzLmVkaXRzLnB1c2goZWRpdCk7XG4gICAgfVxuICAgIGFsbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdHM7XG4gICAgfVxuICAgIGNsZWFyKCkge1xuICAgICAgICB0aGlzLmVkaXRzLnNwbGljZSgwLCB0aGlzLmVkaXRzLmxlbmd0aCk7XG4gICAgfVxuICAgIGFzc2VydENoYW5nZUFubm90YXRpb25zKHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRleHQgZWRpdCBjaGFuZ2UgaXMgbm90IGNvbmZpZ3VyZWQgdG8gbWFuYWdlIGNoYW5nZSBhbm5vdGF0aW9ucy5gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogQSBoZWxwZXIgY2xhc3NcbiAqL1xuY2xhc3MgQ2hhbmdlQW5ub3RhdGlvbnMge1xuICAgIGNvbnN0cnVjdG9yKGFubm90YXRpb25zKSB7XG4gICAgICAgIHRoaXMuX2Fubm90YXRpb25zID0gYW5ub3RhdGlvbnMgPT09IHVuZGVmaW5lZCA/IE9iamVjdC5jcmVhdGUobnVsbCkgOiBhbm5vdGF0aW9ucztcbiAgICAgICAgdGhpcy5fY291bnRlciA9IDA7XG4gICAgICAgIHRoaXMuX3NpemUgPSAwO1xuICAgIH1cbiAgICBhbGwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hbm5vdGF0aW9ucztcbiAgICB9XG4gICAgZ2V0IHNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaXplO1xuICAgIH1cbiAgICBtYW5hZ2UoaWRPckFubm90YXRpb24sIGFubm90YXRpb24pIHtcbiAgICAgICAgbGV0IGlkO1xuICAgICAgICBpZiAoQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoaWRPckFubm90YXRpb24pKSB7XG4gICAgICAgICAgICBpZCA9IGlkT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWQgPSB0aGlzLm5leHRJZCgpO1xuICAgICAgICAgICAgYW5ub3RhdGlvbiA9IGlkT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9hbm5vdGF0aW9uc1tpZF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJZCAke2lkfSBpcyBhbHJlYWR5IGluIHVzZS5gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGFubm90YXRpb24gcHJvdmlkZWQgZm9yIGlkICR7aWR9YCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fYW5ub3RhdGlvbnNbaWRdID0gYW5ub3RhdGlvbjtcbiAgICAgICAgdGhpcy5fc2l6ZSsrO1xuICAgICAgICByZXR1cm4gaWQ7XG4gICAgfVxuICAgIG5leHRJZCgpIHtcbiAgICAgICAgdGhpcy5fY291bnRlcisrO1xuICAgICAgICByZXR1cm4gdGhpcy5fY291bnRlci50b1N0cmluZygpO1xuICAgIH1cbn1cbi8qKlxuICogQSB3b3Jrc3BhY2UgY2hhbmdlIGhlbHBzIGNvbnN0cnVjdGluZyBjaGFuZ2VzIHRvIGEgd29ya3NwYWNlLlxuICovXG5leHBvcnQgY2xhc3MgV29ya3NwYWNlQ2hhbmdlIHtcbiAgICBjb25zdHJ1Y3Rvcih3b3Jrc3BhY2VFZGl0KSB7XG4gICAgICAgIHRoaXMuX3RleHRFZGl0Q2hhbmdlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIGlmICh3b3Jrc3BhY2VFZGl0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQgPSB3b3Jrc3BhY2VFZGl0O1xuICAgICAgICAgICAgaWYgKHdvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMgPSBuZXcgQ2hhbmdlQW5ub3RhdGlvbnMod29ya3NwYWNlRWRpdC5jaGFuZ2VBbm5vdGF0aW9ucyk7XG4gICAgICAgICAgICAgICAgd29ya3NwYWNlRWRpdC5jaGFuZ2VBbm5vdGF0aW9ucyA9IHRoaXMuX2NoYW5nZUFubm90YXRpb25zLmFsbCgpO1xuICAgICAgICAgICAgICAgIHdvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzLmZvckVhY2goKGNoYW5nZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoVGV4dERvY3VtZW50RWRpdC5pcyhjaGFuZ2UpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0RWRpdENoYW5nZSA9IG5ldyBUZXh0RWRpdENoYW5nZUltcGwoY2hhbmdlLmVkaXRzLCB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXh0RWRpdENoYW5nZXNbY2hhbmdlLnRleHREb2N1bWVudC51cmldID0gdGV4dEVkaXRDaGFuZ2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHdvcmtzcGFjZUVkaXQuY2hhbmdlcykge1xuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHdvcmtzcGFjZUVkaXQuY2hhbmdlcykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHRFZGl0Q2hhbmdlID0gbmV3IFRleHRFZGl0Q2hhbmdlSW1wbCh3b3Jrc3BhY2VFZGl0LmNoYW5nZXNba2V5XSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RleHRFZGl0Q2hhbmdlc1trZXldID0gdGV4dEVkaXRDaGFuZ2U7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0ID0ge307XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdW5kZXJseWluZyB7QGxpbmsgV29ya3NwYWNlRWRpdH0gbGl0ZXJhbFxuICAgICAqIHVzZSB0byBiZSByZXR1cm5lZCBmcm9tIGEgd29ya3NwYWNlIGVkaXQgb3BlcmF0aW9uIGxpa2UgcmVuYW1lLlxuICAgICAqL1xuICAgIGdldCBlZGl0KCkge1xuICAgICAgICB0aGlzLmluaXREb2N1bWVudENoYW5nZXMoKTtcbiAgICAgICAgaWYgKHRoaXMuX2NoYW5nZUFubm90YXRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5zaXplID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VBbm5vdGF0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlQW5ub3RhdGlvbnMgPSB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5hbGwoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fd29ya3NwYWNlRWRpdDtcbiAgICB9XG4gICAgZ2V0VGV4dEVkaXRDaGFuZ2Uoa2V5KSB7XG4gICAgICAgIGlmIChPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIuaXMoa2V5KSkge1xuICAgICAgICAgICAgdGhpcy5pbml0RG9jdW1lbnRDaGFuZ2VzKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV29ya3NwYWNlIGVkaXQgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIGRvY3VtZW50IGNoYW5nZXMuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0ZXh0RG9jdW1lbnQgPSB7IHVyaToga2V5LnVyaSwgdmVyc2lvbjoga2V5LnZlcnNpb24gfTtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLl90ZXh0RWRpdENoYW5nZXNbdGV4dERvY3VtZW50LnVyaV07XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVkaXRzID0gW107XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dERvY3VtZW50RWRpdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dERvY3VtZW50LFxuICAgICAgICAgICAgICAgICAgICBlZGl0c1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMucHVzaCh0ZXh0RG9jdW1lbnRFZGl0KTtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgVGV4dEVkaXRDaGFuZ2VJbXBsKGVkaXRzLCB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGV4dEVkaXRDaGFuZ2VzW3RleHREb2N1bWVudC51cmldID0gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdENoYW5nZXMoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV29ya3NwYWNlIGVkaXQgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIG5vcm1hbCB0ZXh0IGVkaXQgY2hhbmdlcy4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLl90ZXh0RWRpdENoYW5nZXNba2V5XTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgbGV0IGVkaXRzID0gW107XG4gICAgICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VzW2tleV0gPSBlZGl0cztcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgVGV4dEVkaXRDaGFuZ2VJbXBsKGVkaXRzKTtcbiAgICAgICAgICAgICAgICB0aGlzLl90ZXh0RWRpdENoYW5nZXNba2V5XSA9IHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaW5pdERvY3VtZW50Q2hhbmdlcygpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzID09PSB1bmRlZmluZWQgJiYgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZUFubm90YXRpb25zID0gbmV3IENoYW5nZUFubm90YXRpb25zKCk7XG4gICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VBbm5vdGF0aW9ucyA9IHRoaXMuX2NoYW5nZUFubm90YXRpb25zLmFsbCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGluaXRDaGFuZ2VzKCkge1xuICAgICAgICBpZiAodGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMgPT09IHVuZGVmaW5lZCAmJiB0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjcmVhdGVGaWxlKHVyaSwgb3B0aW9uc09yQW5ub3RhdGlvbiwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLmluaXREb2N1bWVudENoYW5nZXMoKTtcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV29ya3NwYWNlIGVkaXQgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIGRvY3VtZW50IGNoYW5nZXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGFubm90YXRpb247XG4gICAgICAgIGlmIChDaGFuZ2VBbm5vdGF0aW9uLmlzKG9wdGlvbnNPckFubm90YXRpb24pIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKG9wdGlvbnNPckFubm90YXRpb24pKSB7XG4gICAgICAgICAgICBhbm5vdGF0aW9uID0gb3B0aW9uc09yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGxldCBvcGVyYXRpb247XG4gICAgICAgIGxldCBpZDtcbiAgICAgICAgaWYgKGFubm90YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3BlcmF0aW9uID0gQ3JlYXRlRmlsZS5jcmVhdGUodXJpLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlkID0gQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoYW5ub3RhdGlvbikgPyBhbm5vdGF0aW9uIDogdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMubWFuYWdlKGFubm90YXRpb24pO1xuICAgICAgICAgICAgb3BlcmF0aW9uID0gQ3JlYXRlRmlsZS5jcmVhdGUodXJpLCBvcHRpb25zLCBpZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMucHVzaChvcGVyYXRpb24pO1xuICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlbmFtZUZpbGUob2xkVXJpLCBuZXdVcmksIG9wdGlvbnNPckFubm90YXRpb24sIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5pbml0RG9jdW1lbnRDaGFuZ2VzKCk7XG4gICAgICAgIGlmICh0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dvcmtzcGFjZSBlZGl0IGlzIG5vdCBjb25maWd1cmVkIGZvciBkb2N1bWVudCBjaGFuZ2VzLicpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhbm5vdGF0aW9uO1xuICAgICAgICBpZiAoQ2hhbmdlQW5ub3RhdGlvbi5pcyhvcHRpb25zT3JBbm5vdGF0aW9uKSB8fCBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhvcHRpb25zT3JBbm5vdGF0aW9uKSkge1xuICAgICAgICAgICAgYW5ub3RhdGlvbiA9IG9wdGlvbnNPckFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvcHRpb25zID0gb3B0aW9uc09yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb3BlcmF0aW9uO1xuICAgICAgICBsZXQgaWQ7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wZXJhdGlvbiA9IFJlbmFtZUZpbGUuY3JlYXRlKG9sZFVyaSwgbmV3VXJpLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlkID0gQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoYW5ub3RhdGlvbikgPyBhbm5vdGF0aW9uIDogdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMubWFuYWdlKGFubm90YXRpb24pO1xuICAgICAgICAgICAgb3BlcmF0aW9uID0gUmVuYW1lRmlsZS5jcmVhdGUob2xkVXJpLCBuZXdVcmksIG9wdGlvbnMsIGlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcy5wdXNoKG9wZXJhdGlvbik7XG4gICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVsZXRlRmlsZSh1cmksIG9wdGlvbnNPckFubm90YXRpb24sIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5pbml0RG9jdW1lbnRDaGFuZ2VzKCk7XG4gICAgICAgIGlmICh0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dvcmtzcGFjZSBlZGl0IGlzIG5vdCBjb25maWd1cmVkIGZvciBkb2N1bWVudCBjaGFuZ2VzLicpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhbm5vdGF0aW9uO1xuICAgICAgICBpZiAoQ2hhbmdlQW5ub3RhdGlvbi5pcyhvcHRpb25zT3JBbm5vdGF0aW9uKSB8fCBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhvcHRpb25zT3JBbm5vdGF0aW9uKSkge1xuICAgICAgICAgICAgYW5ub3RhdGlvbiA9IG9wdGlvbnNPckFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvcHRpb25zID0gb3B0aW9uc09yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb3BlcmF0aW9uO1xuICAgICAgICBsZXQgaWQ7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wZXJhdGlvbiA9IERlbGV0ZUZpbGUuY3JlYXRlKHVyaSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZCA9IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGFubm90YXRpb24pID8gYW5ub3RhdGlvbiA6IHRoaXMuX2NoYW5nZUFubm90YXRpb25zLm1hbmFnZShhbm5vdGF0aW9uKTtcbiAgICAgICAgICAgIG9wZXJhdGlvbiA9IERlbGV0ZUZpbGUuY3JlYXRlKHVyaSwgb3B0aW9ucywgaWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzLnB1c2gob3BlcmF0aW9uKTtcbiAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogVGhlIFRleHREb2N1bWVudElkZW50aWZpZXIgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgVGV4dERvY3VtZW50SWRlbnRpZmllcn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgVGV4dERvY3VtZW50SWRlbnRpZmllcjtcbihmdW5jdGlvbiAoVGV4dERvY3VtZW50SWRlbnRpZmllcikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgVGV4dERvY3VtZW50SWRlbnRpZmllciBsaXRlcmFsLlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIGRvY3VtZW50J3MgdXJpLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmkpIHtcbiAgICAgICAgcmV0dXJuIHsgdXJpIH07XG4gICAgfVxuICAgIFRleHREb2N1bWVudElkZW50aWZpZXIuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgVGV4dERvY3VtZW50SWRlbnRpZmllcn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSk7XG4gICAgfVxuICAgIFRleHREb2N1bWVudElkZW50aWZpZXIuaXMgPSBpcztcbn0pKFRleHREb2N1bWVudElkZW50aWZpZXIgfHwgKFRleHREb2N1bWVudElkZW50aWZpZXIgPSB7fSkpO1xuLyoqXG4gKiBUaGUgVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyO1xuKGZ1bmN0aW9uIChWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIGxpdGVyYWwuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgZG9jdW1lbnQncyB1cmkuXG4gICAgICogQHBhcmFtIHZlcnNpb24gVGhlIGRvY3VtZW50J3MgdmVyc2lvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodXJpLCB2ZXJzaW9uKSB7XG4gICAgICAgIHJldHVybiB7IHVyaSwgdmVyc2lvbiB9O1xuICAgIH1cbiAgICBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXJ9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpICYmIElzLmludGVnZXIoY2FuZGlkYXRlLnZlcnNpb24pO1xuICAgIH1cbiAgICBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmlzID0gaXM7XG59KShWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIHx8IChWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyID0ge30pKTtcbi8qKlxuICogVGhlIE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXJ9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcjtcbihmdW5jdGlvbiAoT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIgbGl0ZXJhbC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSBkb2N1bWVudCdzIHVyaS5cbiAgICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgZG9jdW1lbnQncyB2ZXJzaW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmksIHZlcnNpb24pIHtcbiAgICAgICAgcmV0dXJuIHsgdXJpLCB2ZXJzaW9uIH07XG4gICAgfVxuICAgIE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllci5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXJ9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpICYmIChjYW5kaWRhdGUudmVyc2lvbiA9PT0gbnVsbCB8fCBJcy5pbnRlZ2VyKGNhbmRpZGF0ZS52ZXJzaW9uKSk7XG4gICAgfVxuICAgIE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllci5pcyA9IGlzO1xufSkoT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIHx8IChPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIgPSB7fSkpO1xuLyoqXG4gKiBUaGUgVGV4dERvY3VtZW50SXRlbSBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBUZXh0RG9jdW1lbnRJdGVtfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBUZXh0RG9jdW1lbnRJdGVtO1xuKGZ1bmN0aW9uIChUZXh0RG9jdW1lbnRJdGVtKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBUZXh0RG9jdW1lbnRJdGVtIGxpdGVyYWwuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgZG9jdW1lbnQncyB1cmkuXG4gICAgICogQHBhcmFtIGxhbmd1YWdlSWQgVGhlIGRvY3VtZW50J3MgbGFuZ3VhZ2UgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgZG9jdW1lbnQncyB2ZXJzaW9uIG51bWJlci5cbiAgICAgKiBAcGFyYW0gdGV4dCBUaGUgZG9jdW1lbnQncyB0ZXh0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmksIGxhbmd1YWdlSWQsIHZlcnNpb24sIHRleHQpIHtcbiAgICAgICAgcmV0dXJuIHsgdXJpLCBsYW5ndWFnZUlkLCB2ZXJzaW9uLCB0ZXh0IH07XG4gICAgfVxuICAgIFRleHREb2N1bWVudEl0ZW0uY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgVGV4dERvY3VtZW50SXRlbX0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5sYW5ndWFnZUlkKSAmJiBJcy5pbnRlZ2VyKGNhbmRpZGF0ZS52ZXJzaW9uKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnRleHQpO1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnRJdGVtLmlzID0gaXM7XG59KShUZXh0RG9jdW1lbnRJdGVtIHx8IChUZXh0RG9jdW1lbnRJdGVtID0ge30pKTtcbi8qKlxuICogRGVzY3JpYmVzIHRoZSBjb250ZW50IHR5cGUgdGhhdCBhIGNsaWVudCBzdXBwb3J0cyBpbiB2YXJpb3VzXG4gKiByZXN1bHQgbGl0ZXJhbHMgbGlrZSBgSG92ZXJgLCBgUGFyYW1ldGVySW5mb2Agb3IgYENvbXBsZXRpb25JdGVtYC5cbiAqXG4gKiBQbGVhc2Ugbm90ZSB0aGF0IGBNYXJrdXBLaW5kc2AgbXVzdCBub3Qgc3RhcnQgd2l0aCBhIGAkYC4gVGhpcyBraW5kc1xuICogYXJlIHJlc2VydmVkIGZvciBpbnRlcm5hbCB1c2FnZS5cbiAqL1xuZXhwb3J0IHZhciBNYXJrdXBLaW5kO1xuKGZ1bmN0aW9uIChNYXJrdXBLaW5kKSB7XG4gICAgLyoqXG4gICAgICogUGxhaW4gdGV4dCBpcyBzdXBwb3J0ZWQgYXMgYSBjb250ZW50IGZvcm1hdFxuICAgICAqL1xuICAgIE1hcmt1cEtpbmQuUGxhaW5UZXh0ID0gJ3BsYWludGV4dCc7XG4gICAgLyoqXG4gICAgICogTWFya2Rvd24gaXMgc3VwcG9ydGVkIGFzIGEgY29udGVudCBmb3JtYXRcbiAgICAgKi9cbiAgICBNYXJrdXBLaW5kLk1hcmtkb3duID0gJ21hcmtkb3duJztcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgaXMgYSB2YWx1ZSBvZiB0aGUge0BsaW5rIE1hcmt1cEtpbmR9IHR5cGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgPT09IE1hcmt1cEtpbmQuUGxhaW5UZXh0IHx8IGNhbmRpZGF0ZSA9PT0gTWFya3VwS2luZC5NYXJrZG93bjtcbiAgICB9XG4gICAgTWFya3VwS2luZC5pcyA9IGlzO1xufSkoTWFya3VwS2luZCB8fCAoTWFya3VwS2luZCA9IHt9KSk7XG5leHBvcnQgdmFyIE1hcmt1cENvbnRlbnQ7XG4oZnVuY3Rpb24gKE1hcmt1cENvbnRlbnQpIHtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgY29uZm9ybXMgdG8gdGhlIHtAbGluayBNYXJrdXBDb250ZW50fSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKHZhbHVlKSAmJiBNYXJrdXBLaW5kLmlzKGNhbmRpZGF0ZS5raW5kKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnZhbHVlKTtcbiAgICB9XG4gICAgTWFya3VwQ29udGVudC5pcyA9IGlzO1xufSkoTWFya3VwQ29udGVudCB8fCAoTWFya3VwQ29udGVudCA9IHt9KSk7XG4vKipcbiAqIFRoZSBraW5kIG9mIGEgY29tcGxldGlvbiBlbnRyeS5cbiAqL1xuZXhwb3J0IHZhciBDb21wbGV0aW9uSXRlbUtpbmQ7XG4oZnVuY3Rpb24gKENvbXBsZXRpb25JdGVtS2luZCkge1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5UZXh0ID0gMTtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuTWV0aG9kID0gMjtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuRnVuY3Rpb24gPSAzO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5Db25zdHJ1Y3RvciA9IDQ7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkZpZWxkID0gNTtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuVmFyaWFibGUgPSA2O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5DbGFzcyA9IDc7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkludGVyZmFjZSA9IDg7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLk1vZHVsZSA9IDk7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlByb3BlcnR5ID0gMTA7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlVuaXQgPSAxMTtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuVmFsdWUgPSAxMjtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuRW51bSA9IDEzO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5LZXl3b3JkID0gMTQ7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlNuaXBwZXQgPSAxNTtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuQ29sb3IgPSAxNjtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuRmlsZSA9IDE3O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5SZWZlcmVuY2UgPSAxODtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuRm9sZGVyID0gMTk7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkVudW1NZW1iZXIgPSAyMDtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuQ29uc3RhbnQgPSAyMTtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuU3RydWN0ID0gMjI7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkV2ZW50ID0gMjM7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLk9wZXJhdG9yID0gMjQ7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlR5cGVQYXJhbWV0ZXIgPSAyNTtcbn0pKENvbXBsZXRpb25JdGVtS2luZCB8fCAoQ29tcGxldGlvbkl0ZW1LaW5kID0ge30pKTtcbi8qKlxuICogRGVmaW5lcyB3aGV0aGVyIHRoZSBpbnNlcnQgdGV4dCBpbiBhIGNvbXBsZXRpb24gaXRlbSBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXNcbiAqIHBsYWluIHRleHQgb3IgYSBzbmlwcGV0LlxuICovXG5leHBvcnQgdmFyIEluc2VydFRleHRGb3JtYXQ7XG4oZnVuY3Rpb24gKEluc2VydFRleHRGb3JtYXQpIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpbWFyeSB0ZXh0IHRvIGJlIGluc2VydGVkIGlzIHRyZWF0ZWQgYXMgYSBwbGFpbiBzdHJpbmcuXG4gICAgICovXG4gICAgSW5zZXJ0VGV4dEZvcm1hdC5QbGFpblRleHQgPSAxO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcmltYXJ5IHRleHQgdG8gYmUgaW5zZXJ0ZWQgaXMgdHJlYXRlZCBhcyBhIHNuaXBwZXQuXG4gICAgICpcbiAgICAgKiBBIHNuaXBwZXQgY2FuIGRlZmluZSB0YWIgc3RvcHMgYW5kIHBsYWNlaG9sZGVycyB3aXRoIGAkMWAsIGAkMmBcbiAgICAgKiBhbmQgYCR7Mzpmb299YC4gYCQwYCBkZWZpbmVzIHRoZSBmaW5hbCB0YWIgc3RvcCwgaXQgZGVmYXVsdHMgdG9cbiAgICAgKiB0aGUgZW5kIG9mIHRoZSBzbmlwcGV0LiBQbGFjZWhvbGRlcnMgd2l0aCBlcXVhbCBpZGVudGlmaWVycyBhcmUgbGlua2VkLFxuICAgICAqIHRoYXQgaXMgdHlwaW5nIGluIG9uZSB3aWxsIHVwZGF0ZSBvdGhlcnMgdG9vLlxuICAgICAqXG4gICAgICogU2VlIGFsc286IGh0dHBzOi8vbWljcm9zb2Z0LmdpdGh1Yi5pby9sYW5ndWFnZS1zZXJ2ZXItcHJvdG9jb2wvc3BlY2lmaWNhdGlvbnMvc3BlY2lmaWNhdGlvbi1jdXJyZW50LyNzbmlwcGV0X3N5bnRheFxuICAgICAqL1xuICAgIEluc2VydFRleHRGb3JtYXQuU25pcHBldCA9IDI7XG59KShJbnNlcnRUZXh0Rm9ybWF0IHx8IChJbnNlcnRUZXh0Rm9ybWF0ID0ge30pKTtcbi8qKlxuICogQ29tcGxldGlvbiBpdGVtIHRhZ3MgYXJlIGV4dHJhIGFubm90YXRpb25zIHRoYXQgdHdlYWsgdGhlIHJlbmRlcmluZyBvZiBhIGNvbXBsZXRpb25cbiAqIGl0ZW0uXG4gKlxuICogQHNpbmNlIDMuMTUuMFxuICovXG5leHBvcnQgdmFyIENvbXBsZXRpb25JdGVtVGFnO1xuKGZ1bmN0aW9uIChDb21wbGV0aW9uSXRlbVRhZykge1xuICAgIC8qKlxuICAgICAqIFJlbmRlciBhIGNvbXBsZXRpb24gYXMgb2Jzb2xldGUsIHVzdWFsbHkgdXNpbmcgYSBzdHJpa2Utb3V0LlxuICAgICAqL1xuICAgIENvbXBsZXRpb25JdGVtVGFnLkRlcHJlY2F0ZWQgPSAxO1xufSkoQ29tcGxldGlvbkl0ZW1UYWcgfHwgKENvbXBsZXRpb25JdGVtVGFnID0ge30pKTtcbi8qKlxuICogVGhlIEluc2VydFJlcGxhY2VFZGl0IG5hbWVzcGFjZSBwcm92aWRlcyBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIGluc2VydCAvIHJlcGxhY2UgZWRpdHMuXG4gKlxuICogQHNpbmNlIDMuMTYuMFxuICovXG5leHBvcnQgdmFyIEluc2VydFJlcGxhY2VFZGl0O1xuKGZ1bmN0aW9uIChJbnNlcnRSZXBsYWNlRWRpdCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zZXJ0IC8gcmVwbGFjZSBlZGl0XG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKG5ld1RleHQsIGluc2VydCwgcmVwbGFjZSkge1xuICAgICAgICByZXR1cm4geyBuZXdUZXh0LCBpbnNlcnQsIHJlcGxhY2UgfTtcbiAgICB9XG4gICAgSW5zZXJ0UmVwbGFjZUVkaXQuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgSW5zZXJ0UmVwbGFjZUVkaXR9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLm5ld1RleHQpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5pbnNlcnQpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yZXBsYWNlKTtcbiAgICB9XG4gICAgSW5zZXJ0UmVwbGFjZUVkaXQuaXMgPSBpcztcbn0pKEluc2VydFJlcGxhY2VFZGl0IHx8IChJbnNlcnRSZXBsYWNlRWRpdCA9IHt9KSk7XG4vKipcbiAqIEhvdyB3aGl0ZXNwYWNlIGFuZCBpbmRlbnRhdGlvbiBpcyBoYW5kbGVkIGR1cmluZyBjb21wbGV0aW9uXG4gKiBpdGVtIGluc2VydGlvbi5cbiAqXG4gKiBAc2luY2UgMy4xNi4wXG4gKi9cbmV4cG9ydCB2YXIgSW5zZXJ0VGV4dE1vZGU7XG4oZnVuY3Rpb24gKEluc2VydFRleHRNb2RlKSB7XG4gICAgLyoqXG4gICAgICogVGhlIGluc2VydGlvbiBvciByZXBsYWNlIHN0cmluZ3MgaXMgdGFrZW4gYXMgaXQgaXMuIElmIHRoZVxuICAgICAqIHZhbHVlIGlzIG11bHRpIGxpbmUgdGhlIGxpbmVzIGJlbG93IHRoZSBjdXJzb3Igd2lsbCBiZVxuICAgICAqIGluc2VydGVkIHVzaW5nIHRoZSBpbmRlbnRhdGlvbiBkZWZpbmVkIGluIHRoZSBzdHJpbmcgdmFsdWUuXG4gICAgICogVGhlIGNsaWVudCB3aWxsIG5vdCBhcHBseSBhbnkga2luZCBvZiBhZGp1c3RtZW50cyB0byB0aGVcbiAgICAgKiBzdHJpbmcuXG4gICAgICovXG4gICAgSW5zZXJ0VGV4dE1vZGUuYXNJcyA9IDE7XG4gICAgLyoqXG4gICAgICogVGhlIGVkaXRvciBhZGp1c3RzIGxlYWRpbmcgd2hpdGVzcGFjZSBvZiBuZXcgbGluZXMgc28gdGhhdFxuICAgICAqIHRoZXkgbWF0Y2ggdGhlIGluZGVudGF0aW9uIHVwIHRvIHRoZSBjdXJzb3Igb2YgdGhlIGxpbmUgZm9yXG4gICAgICogd2hpY2ggdGhlIGl0ZW0gaXMgYWNjZXB0ZWQuXG4gICAgICpcbiAgICAgKiBDb25zaWRlciBhIGxpbmUgbGlrZSB0aGlzOiA8MnRhYnM+PGN1cnNvcj48M3RhYnM+Zm9vLiBBY2NlcHRpbmcgYVxuICAgICAqIG11bHRpIGxpbmUgY29tcGxldGlvbiBpdGVtIGlzIGluZGVudGVkIHVzaW5nIDIgdGFicyBhbmQgYWxsXG4gICAgICogZm9sbG93aW5nIGxpbmVzIGluc2VydGVkIHdpbGwgYmUgaW5kZW50ZWQgdXNpbmcgMiB0YWJzIGFzIHdlbGwuXG4gICAgICovXG4gICAgSW5zZXJ0VGV4dE1vZGUuYWRqdXN0SW5kZW50YXRpb24gPSAyO1xufSkoSW5zZXJ0VGV4dE1vZGUgfHwgKEluc2VydFRleHRNb2RlID0ge30pKTtcbmV4cG9ydCB2YXIgQ29tcGxldGlvbkl0ZW1MYWJlbERldGFpbHM7XG4oZnVuY3Rpb24gKENvbXBsZXRpb25JdGVtTGFiZWxEZXRhaWxzKSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgKElzLnN0cmluZyhjYW5kaWRhdGUuZGV0YWlsKSB8fCBjYW5kaWRhdGUuZGV0YWlsID09PSB1bmRlZmluZWQpICYmXG4gICAgICAgICAgICAoSXMuc3RyaW5nKGNhbmRpZGF0ZS5kZXNjcmlwdGlvbikgfHwgY2FuZGlkYXRlLmRlc2NyaXB0aW9uID09PSB1bmRlZmluZWQpO1xuICAgIH1cbiAgICBDb21wbGV0aW9uSXRlbUxhYmVsRGV0YWlscy5pcyA9IGlzO1xufSkoQ29tcGxldGlvbkl0ZW1MYWJlbERldGFpbHMgfHwgKENvbXBsZXRpb25JdGVtTGFiZWxEZXRhaWxzID0ge30pKTtcbi8qKlxuICogVGhlIENvbXBsZXRpb25JdGVtIG5hbWVzcGFjZSBwcm92aWRlcyBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoXG4gKiBjb21wbGV0aW9uIGl0ZW1zLlxuICovXG5leHBvcnQgdmFyIENvbXBsZXRpb25JdGVtO1xuKGZ1bmN0aW9uIChDb21wbGV0aW9uSXRlbSkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIGNvbXBsZXRpb24gaXRlbSBhbmQgc2VlZCBpdCB3aXRoIGEgbGFiZWwuXG4gICAgICogQHBhcmFtIGxhYmVsIFRoZSBjb21wbGV0aW9uIGl0ZW0ncyBsYWJlbFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShsYWJlbCkge1xuICAgICAgICByZXR1cm4geyBsYWJlbCB9O1xuICAgIH1cbiAgICBDb21wbGV0aW9uSXRlbS5jcmVhdGUgPSBjcmVhdGU7XG59KShDb21wbGV0aW9uSXRlbSB8fCAoQ29tcGxldGlvbkl0ZW0gPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29tcGxldGlvbkxpc3QgbmFtZXNwYWNlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGhcbiAqIGNvbXBsZXRpb24gbGlzdHMuXG4gKi9cbmV4cG9ydCB2YXIgQ29tcGxldGlvbkxpc3Q7XG4oZnVuY3Rpb24gKENvbXBsZXRpb25MaXN0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBjb21wbGV0aW9uIGxpc3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaXRlbXMgVGhlIGNvbXBsZXRpb24gaXRlbXMuXG4gICAgICogQHBhcmFtIGlzSW5jb21wbGV0ZSBUaGUgbGlzdCBpcyBub3QgY29tcGxldGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGl0ZW1zLCBpc0luY29tcGxldGUpIHtcbiAgICAgICAgcmV0dXJuIHsgaXRlbXM6IGl0ZW1zID8gaXRlbXMgOiBbXSwgaXNJbmNvbXBsZXRlOiAhIWlzSW5jb21wbGV0ZSB9O1xuICAgIH1cbiAgICBDb21wbGV0aW9uTGlzdC5jcmVhdGUgPSBjcmVhdGU7XG59KShDb21wbGV0aW9uTGlzdCB8fCAoQ29tcGxldGlvbkxpc3QgPSB7fSkpO1xuZXhwb3J0IHZhciBNYXJrZWRTdHJpbmc7XG4oZnVuY3Rpb24gKE1hcmtlZFN0cmluZykge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBtYXJrZWQgc3RyaW5nIGZyb20gcGxhaW4gdGV4dC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwbGFpblRleHQgVGhlIHBsYWluIHRleHQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZnJvbVBsYWluVGV4dChwbGFpblRleHQpIHtcbiAgICAgICAgcmV0dXJuIHBsYWluVGV4dC5yZXBsYWNlKC9bXFxcXGAqX3t9W1xcXSgpIytcXC0uIV0vZywgJ1xcXFwkJicpOyAvLyBlc2NhcGUgbWFya2Rvd24gc3ludGF4IHRva2VuczogaHR0cDovL2RhcmluZ2ZpcmViYWxsLm5ldC9wcm9qZWN0cy9tYXJrZG93bi9zeW50YXgjYmFja3NsYXNoXG4gICAgfVxuICAgIE1hcmtlZFN0cmluZy5mcm9tUGxhaW5UZXh0ID0gZnJvbVBsYWluVGV4dDtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgY29uZm9ybXMgdG8gdGhlIHtAbGluayBNYXJrZWRTdHJpbmd9IHR5cGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5zdHJpbmcoY2FuZGlkYXRlKSB8fCAoSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUubGFuZ3VhZ2UpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudmFsdWUpKTtcbiAgICB9XG4gICAgTWFya2VkU3RyaW5nLmlzID0gaXM7XG59KShNYXJrZWRTdHJpbmcgfHwgKE1hcmtlZFN0cmluZyA9IHt9KSk7XG5leHBvcnQgdmFyIEhvdmVyO1xuKGZ1bmN0aW9uIChIb3Zlcikge1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBjb25mb3JtcyB0byB0aGUge0BsaW5rIEhvdmVyfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gISFjYW5kaWRhdGUgJiYgSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIChNYXJrdXBDb250ZW50LmlzKGNhbmRpZGF0ZS5jb250ZW50cykgfHxcbiAgICAgICAgICAgIE1hcmtlZFN0cmluZy5pcyhjYW5kaWRhdGUuY29udGVudHMpIHx8XG4gICAgICAgICAgICBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS5jb250ZW50cywgTWFya2VkU3RyaW5nLmlzKSkgJiYgKHZhbHVlLnJhbmdlID09PSB1bmRlZmluZWQgfHwgUmFuZ2UuaXModmFsdWUucmFuZ2UpKTtcbiAgICB9XG4gICAgSG92ZXIuaXMgPSBpcztcbn0pKEhvdmVyIHx8IChIb3ZlciA9IHt9KSk7XG4vKipcbiAqIFRoZSBQYXJhbWV0ZXJJbmZvcm1hdGlvbiBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBQYXJhbWV0ZXJJbmZvcm1hdGlvbn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgUGFyYW1ldGVySW5mb3JtYXRpb247XG4oZnVuY3Rpb24gKFBhcmFtZXRlckluZm9ybWF0aW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBwYXJhbWV0ZXIgaW5mb3JtYXRpb24gbGl0ZXJhbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBsYWJlbCBBIGxhYmVsIHN0cmluZy5cbiAgICAgKiBAcGFyYW0gZG9jdW1lbnRhdGlvbiBBIGRvYyBzdHJpbmcuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGxhYmVsLCBkb2N1bWVudGF0aW9uKSB7XG4gICAgICAgIHJldHVybiBkb2N1bWVudGF0aW9uID8geyBsYWJlbCwgZG9jdW1lbnRhdGlvbiB9IDogeyBsYWJlbCB9O1xuICAgIH1cbiAgICBQYXJhbWV0ZXJJbmZvcm1hdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG59KShQYXJhbWV0ZXJJbmZvcm1hdGlvbiB8fCAoUGFyYW1ldGVySW5mb3JtYXRpb24gPSB7fSkpO1xuLyoqXG4gKiBUaGUgU2lnbmF0dXJlSW5mb3JtYXRpb24gbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgU2lnbmF0dXJlSW5mb3JtYXRpb259IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIFNpZ25hdHVyZUluZm9ybWF0aW9uO1xuKGZ1bmN0aW9uIChTaWduYXR1cmVJbmZvcm1hdGlvbikge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShsYWJlbCwgZG9jdW1lbnRhdGlvbiwgLi4ucGFyYW1ldGVycykge1xuICAgICAgICBsZXQgcmVzdWx0ID0geyBsYWJlbCB9O1xuICAgICAgICBpZiAoSXMuZGVmaW5lZChkb2N1bWVudGF0aW9uKSkge1xuICAgICAgICAgICAgcmVzdWx0LmRvY3VtZW50YXRpb24gPSBkb2N1bWVudGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKHBhcmFtZXRlcnMpKSB7XG4gICAgICAgICAgICByZXN1bHQucGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQucGFyYW1ldGVycyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIFNpZ25hdHVyZUluZm9ybWF0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKFNpZ25hdHVyZUluZm9ybWF0aW9uIHx8IChTaWduYXR1cmVJbmZvcm1hdGlvbiA9IHt9KSk7XG4vKipcbiAqIEEgZG9jdW1lbnQgaGlnaGxpZ2h0IGtpbmQuXG4gKi9cbmV4cG9ydCB2YXIgRG9jdW1lbnRIaWdobGlnaHRLaW5kO1xuKGZ1bmN0aW9uIChEb2N1bWVudEhpZ2hsaWdodEtpbmQpIHtcbiAgICAvKipcbiAgICAgKiBBIHRleHR1YWwgb2NjdXJyZW5jZS5cbiAgICAgKi9cbiAgICBEb2N1bWVudEhpZ2hsaWdodEtpbmQuVGV4dCA9IDE7XG4gICAgLyoqXG4gICAgICogUmVhZC1hY2Nlc3Mgb2YgYSBzeW1ib2wsIGxpa2UgcmVhZGluZyBhIHZhcmlhYmxlLlxuICAgICAqL1xuICAgIERvY3VtZW50SGlnaGxpZ2h0S2luZC5SZWFkID0gMjtcbiAgICAvKipcbiAgICAgKiBXcml0ZS1hY2Nlc3Mgb2YgYSBzeW1ib2wsIGxpa2Ugd3JpdGluZyB0byBhIHZhcmlhYmxlLlxuICAgICAqL1xuICAgIERvY3VtZW50SGlnaGxpZ2h0S2luZC5Xcml0ZSA9IDM7XG59KShEb2N1bWVudEhpZ2hsaWdodEtpbmQgfHwgKERvY3VtZW50SGlnaGxpZ2h0S2luZCA9IHt9KSk7XG4vKipcbiAqIERvY3VtZW50SGlnaGxpZ2h0IG5hbWVzcGFjZSB0byBwcm92aWRlIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgRG9jdW1lbnRIaWdobGlnaHR9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIERvY3VtZW50SGlnaGxpZ2h0O1xuKGZ1bmN0aW9uIChEb2N1bWVudEhpZ2hsaWdodCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIERvY3VtZW50SGlnaGxpZ2h0IG9iamVjdC5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlIHRoZSBoaWdobGlnaHQgYXBwbGllcyB0by5cbiAgICAgKiBAcGFyYW0ga2luZCBUaGUgaGlnaGxpZ2h0IGtpbmRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIGtpbmQpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHsgcmFuZ2UgfTtcbiAgICAgICAgaWYgKElzLm51bWJlcihraW5kKSkge1xuICAgICAgICAgICAgcmVzdWx0LmtpbmQgPSBraW5kO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIERvY3VtZW50SGlnaGxpZ2h0LmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKERvY3VtZW50SGlnaGxpZ2h0IHx8IChEb2N1bWVudEhpZ2hsaWdodCA9IHt9KSk7XG4vKipcbiAqIEEgc3ltYm9sIGtpbmQuXG4gKi9cbmV4cG9ydCB2YXIgU3ltYm9sS2luZDtcbihmdW5jdGlvbiAoU3ltYm9sS2luZCkge1xuICAgIFN5bWJvbEtpbmQuRmlsZSA9IDE7XG4gICAgU3ltYm9sS2luZC5Nb2R1bGUgPSAyO1xuICAgIFN5bWJvbEtpbmQuTmFtZXNwYWNlID0gMztcbiAgICBTeW1ib2xLaW5kLlBhY2thZ2UgPSA0O1xuICAgIFN5bWJvbEtpbmQuQ2xhc3MgPSA1O1xuICAgIFN5bWJvbEtpbmQuTWV0aG9kID0gNjtcbiAgICBTeW1ib2xLaW5kLlByb3BlcnR5ID0gNztcbiAgICBTeW1ib2xLaW5kLkZpZWxkID0gODtcbiAgICBTeW1ib2xLaW5kLkNvbnN0cnVjdG9yID0gOTtcbiAgICBTeW1ib2xLaW5kLkVudW0gPSAxMDtcbiAgICBTeW1ib2xLaW5kLkludGVyZmFjZSA9IDExO1xuICAgIFN5bWJvbEtpbmQuRnVuY3Rpb24gPSAxMjtcbiAgICBTeW1ib2xLaW5kLlZhcmlhYmxlID0gMTM7XG4gICAgU3ltYm9sS2luZC5Db25zdGFudCA9IDE0O1xuICAgIFN5bWJvbEtpbmQuU3RyaW5nID0gMTU7XG4gICAgU3ltYm9sS2luZC5OdW1iZXIgPSAxNjtcbiAgICBTeW1ib2xLaW5kLkJvb2xlYW4gPSAxNztcbiAgICBTeW1ib2xLaW5kLkFycmF5ID0gMTg7XG4gICAgU3ltYm9sS2luZC5PYmplY3QgPSAxOTtcbiAgICBTeW1ib2xLaW5kLktleSA9IDIwO1xuICAgIFN5bWJvbEtpbmQuTnVsbCA9IDIxO1xuICAgIFN5bWJvbEtpbmQuRW51bU1lbWJlciA9IDIyO1xuICAgIFN5bWJvbEtpbmQuU3RydWN0ID0gMjM7XG4gICAgU3ltYm9sS2luZC5FdmVudCA9IDI0O1xuICAgIFN5bWJvbEtpbmQuT3BlcmF0b3IgPSAyNTtcbiAgICBTeW1ib2xLaW5kLlR5cGVQYXJhbWV0ZXIgPSAyNjtcbn0pKFN5bWJvbEtpbmQgfHwgKFN5bWJvbEtpbmQgPSB7fSkpO1xuLyoqXG4gKiBTeW1ib2wgdGFncyBhcmUgZXh0cmEgYW5ub3RhdGlvbnMgdGhhdCB0d2VhayB0aGUgcmVuZGVyaW5nIG9mIGEgc3ltYm9sLlxuICpcbiAqIEBzaW5jZSAzLjE2XG4gKi9cbmV4cG9ydCB2YXIgU3ltYm9sVGFnO1xuKGZ1bmN0aW9uIChTeW1ib2xUYWcpIHtcbiAgICAvKipcbiAgICAgKiBSZW5kZXIgYSBzeW1ib2wgYXMgb2Jzb2xldGUsIHVzdWFsbHkgdXNpbmcgYSBzdHJpa2Utb3V0LlxuICAgICAqL1xuICAgIFN5bWJvbFRhZy5EZXByZWNhdGVkID0gMTtcbn0pKFN5bWJvbFRhZyB8fCAoU3ltYm9sVGFnID0ge30pKTtcbmV4cG9ydCB2YXIgU3ltYm9sSW5mb3JtYXRpb247XG4oZnVuY3Rpb24gKFN5bWJvbEluZm9ybWF0aW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBzeW1ib2wgaW5mb3JtYXRpb24gbGl0ZXJhbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIGtpbmQgVGhlIGtpbmQgb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlIG9mIHRoZSBsb2NhdGlvbiBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIHJlc291cmNlIG9mIHRoZSBsb2NhdGlvbiBvZiBzeW1ib2wuXG4gICAgICogQHBhcmFtIGNvbnRhaW5lck5hbWUgVGhlIG5hbWUgb2YgdGhlIHN5bWJvbCBjb250YWluaW5nIHRoZSBzeW1ib2wuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKG5hbWUsIGtpbmQsIHJhbmdlLCB1cmksIGNvbnRhaW5lck5hbWUpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBraW5kLFxuICAgICAgICAgICAgbG9jYXRpb246IHsgdXJpLCByYW5nZSB9XG4gICAgICAgIH07XG4gICAgICAgIGlmIChjb250YWluZXJOYW1lKSB7XG4gICAgICAgICAgICByZXN1bHQuY29udGFpbmVyTmFtZSA9IGNvbnRhaW5lck5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgU3ltYm9sSW5mb3JtYXRpb24uY3JlYXRlID0gY3JlYXRlO1xufSkoU3ltYm9sSW5mb3JtYXRpb24gfHwgKFN5bWJvbEluZm9ybWF0aW9uID0ge30pKTtcbmV4cG9ydCB2YXIgV29ya3NwYWNlU3ltYm9sO1xuKGZ1bmN0aW9uIChXb3Jrc3BhY2VTeW1ib2wpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgd29ya3NwYWNlIHN5bWJvbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIGtpbmQgVGhlIGtpbmQgb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSByZXNvdXJjZSBvZiB0aGUgbG9jYXRpb24gb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgQW4gb3B0aW9ucyByYW5nZSBvZiB0aGUgbG9jYXRpb24uXG4gICAgICogQHJldHVybnMgQSBXb3Jrc3BhY2VTeW1ib2wuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKG5hbWUsIGtpbmQsIHVyaSwgcmFuZ2UpIHtcbiAgICAgICAgcmV0dXJuIHJhbmdlICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8geyBuYW1lLCBraW5kLCBsb2NhdGlvbjogeyB1cmksIHJhbmdlIH0gfVxuICAgICAgICAgICAgOiB7IG5hbWUsIGtpbmQsIGxvY2F0aW9uOiB7IHVyaSB9IH07XG4gICAgfVxuICAgIFdvcmtzcGFjZVN5bWJvbC5jcmVhdGUgPSBjcmVhdGU7XG59KShXb3Jrc3BhY2VTeW1ib2wgfHwgKFdvcmtzcGFjZVN5bWJvbCA9IHt9KSk7XG5leHBvcnQgdmFyIERvY3VtZW50U3ltYm9sO1xuKGZ1bmN0aW9uIChEb2N1bWVudFN5bWJvbCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgc3ltYm9sIGluZm9ybWF0aW9uIGxpdGVyYWwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSBkZXRhaWwgVGhlIGRldGFpbCBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSBraW5kIFRoZSBraW5kIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSBzZWxlY3Rpb25SYW5nZSBUaGUgc2VsZWN0aW9uUmFuZ2Ugb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gY2hpbGRyZW4gQ2hpbGRyZW4gb2YgdGhlIHN5bWJvbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobmFtZSwgZGV0YWlsLCBraW5kLCByYW5nZSwgc2VsZWN0aW9uUmFuZ2UsIGNoaWxkcmVuKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgZGV0YWlsLFxuICAgICAgICAgICAga2luZCxcbiAgICAgICAgICAgIHJhbmdlLFxuICAgICAgICAgICAgc2VsZWN0aW9uUmFuZ2VcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGNoaWxkcmVuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIERvY3VtZW50U3ltYm9sLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIERvY3VtZW50U3ltYm9sfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmXG4gICAgICAgICAgICBJcy5zdHJpbmcoY2FuZGlkYXRlLm5hbWUpICYmIElzLm51bWJlcihjYW5kaWRhdGUua2luZCkgJiZcbiAgICAgICAgICAgIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnNlbGVjdGlvblJhbmdlKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5kZXRhaWwgPT09IHVuZGVmaW5lZCB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLmRldGFpbCkpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmRlcHJlY2F0ZWQgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5kZXByZWNhdGVkKSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuY2hpbGRyZW4gPT09IHVuZGVmaW5lZCB8fCBBcnJheS5pc0FycmF5KGNhbmRpZGF0ZS5jaGlsZHJlbikpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLnRhZ3MgPT09IHVuZGVmaW5lZCB8fCBBcnJheS5pc0FycmF5KGNhbmRpZGF0ZS50YWdzKSk7XG4gICAgfVxuICAgIERvY3VtZW50U3ltYm9sLmlzID0gaXM7XG59KShEb2N1bWVudFN5bWJvbCB8fCAoRG9jdW1lbnRTeW1ib2wgPSB7fSkpO1xuLyoqXG4gKiBBIHNldCBvZiBwcmVkZWZpbmVkIGNvZGUgYWN0aW9uIGtpbmRzXG4gKi9cbmV4cG9ydCB2YXIgQ29kZUFjdGlvbktpbmQ7XG4oZnVuY3Rpb24gKENvZGVBY3Rpb25LaW5kKSB7XG4gICAgLyoqXG4gICAgICogRW1wdHkga2luZC5cbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5FbXB0eSA9ICcnO1xuICAgIC8qKlxuICAgICAqIEJhc2Uga2luZCBmb3IgcXVpY2tmaXggYWN0aW9uczogJ3F1aWNrZml4J1xuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlF1aWNrRml4ID0gJ3F1aWNrZml4JztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIHJlZmFjdG9yaW5nIGFjdGlvbnM6ICdyZWZhY3RvcidcbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5SZWZhY3RvciA9ICdyZWZhY3Rvcic7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciByZWZhY3RvcmluZyBleHRyYWN0aW9uIGFjdGlvbnM6ICdyZWZhY3Rvci5leHRyYWN0J1xuICAgICAqXG4gICAgICogRXhhbXBsZSBleHRyYWN0IGFjdGlvbnM6XG4gICAgICpcbiAgICAgKiAtIEV4dHJhY3QgbWV0aG9kXG4gICAgICogLSBFeHRyYWN0IGZ1bmN0aW9uXG4gICAgICogLSBFeHRyYWN0IHZhcmlhYmxlXG4gICAgICogLSBFeHRyYWN0IGludGVyZmFjZSBmcm9tIGNsYXNzXG4gICAgICogLSAuLi5cbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5SZWZhY3RvckV4dHJhY3QgPSAncmVmYWN0b3IuZXh0cmFjdCc7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciByZWZhY3RvcmluZyBpbmxpbmUgYWN0aW9uczogJ3JlZmFjdG9yLmlubGluZSdcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgaW5saW5lIGFjdGlvbnM6XG4gICAgICpcbiAgICAgKiAtIElubGluZSBmdW5jdGlvblxuICAgICAqIC0gSW5saW5lIHZhcmlhYmxlXG4gICAgICogLSBJbmxpbmUgY29uc3RhbnRcbiAgICAgKiAtIC4uLlxuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlJlZmFjdG9ySW5saW5lID0gJ3JlZmFjdG9yLmlubGluZSc7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciByZWZhY3RvcmluZyByZXdyaXRlIGFjdGlvbnM6ICdyZWZhY3Rvci5yZXdyaXRlJ1xuICAgICAqXG4gICAgICogRXhhbXBsZSByZXdyaXRlIGFjdGlvbnM6XG4gICAgICpcbiAgICAgKiAtIENvbnZlcnQgSmF2YVNjcmlwdCBmdW5jdGlvbiB0byBjbGFzc1xuICAgICAqIC0gQWRkIG9yIHJlbW92ZSBwYXJhbWV0ZXJcbiAgICAgKiAtIEVuY2Fwc3VsYXRlIGZpZWxkXG4gICAgICogLSBNYWtlIG1ldGhvZCBzdGF0aWNcbiAgICAgKiAtIE1vdmUgbWV0aG9kIHRvIGJhc2UgY2xhc3NcbiAgICAgKiAtIC4uLlxuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlJlZmFjdG9yUmV3cml0ZSA9ICdyZWZhY3Rvci5yZXdyaXRlJztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIHNvdXJjZSBhY3Rpb25zOiBgc291cmNlYFxuICAgICAqXG4gICAgICogU291cmNlIGNvZGUgYWN0aW9ucyBhcHBseSB0byB0aGUgZW50aXJlIGZpbGUuXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuU291cmNlID0gJ3NvdXJjZSc7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciBhbiBvcmdhbml6ZSBpbXBvcnRzIHNvdXJjZSBhY3Rpb246IGBzb3VyY2Uub3JnYW5pemVJbXBvcnRzYFxuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlNvdXJjZU9yZ2FuaXplSW1wb3J0cyA9ICdzb3VyY2Uub3JnYW5pemVJbXBvcnRzJztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIGF1dG8tZml4IHNvdXJjZSBhY3Rpb25zOiBgc291cmNlLmZpeEFsbGAuXG4gICAgICpcbiAgICAgKiBGaXggYWxsIGFjdGlvbnMgYXV0b21hdGljYWxseSBmaXggZXJyb3JzIHRoYXQgaGF2ZSBhIGNsZWFyIGZpeCB0aGF0IGRvIG5vdCByZXF1aXJlIHVzZXIgaW5wdXQuXG4gICAgICogVGhleSBzaG91bGQgbm90IHN1cHByZXNzIGVycm9ycyBvciBwZXJmb3JtIHVuc2FmZSBmaXhlcyBzdWNoIGFzIGdlbmVyYXRpbmcgbmV3IHR5cGVzIG9yIGNsYXNzZXMuXG4gICAgICpcbiAgICAgKiBAc2luY2UgMy4xNS4wXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuU291cmNlRml4QWxsID0gJ3NvdXJjZS5maXhBbGwnO1xufSkoQ29kZUFjdGlvbktpbmQgfHwgKENvZGVBY3Rpb25LaW5kID0ge30pKTtcbi8qKlxuICogVGhlIHJlYXNvbiB3aHkgY29kZSBhY3Rpb25zIHdlcmUgcmVxdWVzdGVkLlxuICpcbiAqIEBzaW5jZSAzLjE3LjBcbiAqL1xuZXhwb3J0IHZhciBDb2RlQWN0aW9uVHJpZ2dlcktpbmQ7XG4oZnVuY3Rpb24gKENvZGVBY3Rpb25UcmlnZ2VyS2luZCkge1xuICAgIC8qKlxuICAgICAqIENvZGUgYWN0aW9ucyB3ZXJlIGV4cGxpY2l0bHkgcmVxdWVzdGVkIGJ5IHRoZSB1c2VyIG9yIGJ5IGFuIGV4dGVuc2lvbi5cbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uVHJpZ2dlcktpbmQuSW52b2tlZCA9IDE7XG4gICAgLyoqXG4gICAgICogQ29kZSBhY3Rpb25zIHdlcmUgcmVxdWVzdGVkIGF1dG9tYXRpY2FsbHkuXG4gICAgICpcbiAgICAgKiBUaGlzIHR5cGljYWxseSBoYXBwZW5zIHdoZW4gY3VycmVudCBzZWxlY3Rpb24gaW4gYSBmaWxlIGNoYW5nZXMsIGJ1dCBjYW5cbiAgICAgKiBhbHNvIGJlIHRyaWdnZXJlZCB3aGVuIGZpbGUgY29udGVudCBjaGFuZ2VzLlxuICAgICAqL1xuICAgIENvZGVBY3Rpb25UcmlnZ2VyS2luZC5BdXRvbWF0aWMgPSAyO1xufSkoQ29kZUFjdGlvblRyaWdnZXJLaW5kIHx8IChDb2RlQWN0aW9uVHJpZ2dlcktpbmQgPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29kZUFjdGlvbkNvbnRleHQgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgQ29kZUFjdGlvbkNvbnRleHR9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIENvZGVBY3Rpb25Db250ZXh0O1xuKGZ1bmN0aW9uIChDb2RlQWN0aW9uQ29udGV4dCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ29kZUFjdGlvbkNvbnRleHQgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUoZGlhZ25vc3RpY3MsIG9ubHksIHRyaWdnZXJLaW5kKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IGRpYWdub3N0aWNzIH07XG4gICAgICAgIGlmIChvbmx5ICE9PSB1bmRlZmluZWQgJiYgb25seSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmVzdWx0Lm9ubHkgPSBvbmx5O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmlnZ2VyS2luZCAhPT0gdW5kZWZpbmVkICYmIHRyaWdnZXJLaW5kICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXN1bHQudHJpZ2dlcktpbmQgPSB0cmlnZ2VyS2luZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBDb2RlQWN0aW9uQ29udGV4dC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBDb2RlQWN0aW9uQ29udGV4dH0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS5kaWFnbm9zdGljcywgRGlhZ25vc3RpYy5pcylcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUub25seSA9PT0gdW5kZWZpbmVkIHx8IElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLm9ubHksIElzLnN0cmluZykpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLnRyaWdnZXJLaW5kID09PSB1bmRlZmluZWQgfHwgY2FuZGlkYXRlLnRyaWdnZXJLaW5kID09PSBDb2RlQWN0aW9uVHJpZ2dlcktpbmQuSW52b2tlZCB8fCBjYW5kaWRhdGUudHJpZ2dlcktpbmQgPT09IENvZGVBY3Rpb25UcmlnZ2VyS2luZC5BdXRvbWF0aWMpO1xuICAgIH1cbiAgICBDb2RlQWN0aW9uQ29udGV4dC5pcyA9IGlzO1xufSkoQ29kZUFjdGlvbkNvbnRleHQgfHwgKENvZGVBY3Rpb25Db250ZXh0ID0ge30pKTtcbmV4cG9ydCB2YXIgQ29kZUFjdGlvbjtcbihmdW5jdGlvbiAoQ29kZUFjdGlvbikge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh0aXRsZSwga2luZE9yQ29tbWFuZE9yRWRpdCwga2luZCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0geyB0aXRsZSB9O1xuICAgICAgICBsZXQgY2hlY2tLaW5kID0gdHJ1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBraW5kT3JDb21tYW5kT3JFZGl0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY2hlY2tLaW5kID0gZmFsc2U7XG4gICAgICAgICAgICByZXN1bHQua2luZCA9IGtpbmRPckNvbW1hbmRPckVkaXQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoQ29tbWFuZC5pcyhraW5kT3JDb21tYW5kT3JFZGl0KSkge1xuICAgICAgICAgICAgcmVzdWx0LmNvbW1hbmQgPSBraW5kT3JDb21tYW5kT3JFZGl0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0LmVkaXQgPSBraW5kT3JDb21tYW5kT3JFZGl0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGVja0tpbmQgJiYga2luZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQua2luZCA9IGtpbmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgQ29kZUFjdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLnN0cmluZyhjYW5kaWRhdGUudGl0bGUpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmRpYWdub3N0aWNzID09PSB1bmRlZmluZWQgfHwgSXMudHlwZWRBcnJheShjYW5kaWRhdGUuZGlhZ25vc3RpY3MsIERpYWdub3N0aWMuaXMpKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5raW5kID09PSB1bmRlZmluZWQgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS5raW5kKSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuZWRpdCAhPT0gdW5kZWZpbmVkIHx8IGNhbmRpZGF0ZS5jb21tYW5kICE9PSB1bmRlZmluZWQpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmNvbW1hbmQgPT09IHVuZGVmaW5lZCB8fCBDb21tYW5kLmlzKGNhbmRpZGF0ZS5jb21tYW5kKSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuaXNQcmVmZXJyZWQgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5pc1ByZWZlcnJlZCkpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmVkaXQgPT09IHVuZGVmaW5lZCB8fCBXb3Jrc3BhY2VFZGl0LmlzKGNhbmRpZGF0ZS5lZGl0KSk7XG4gICAgfVxuICAgIENvZGVBY3Rpb24uaXMgPSBpcztcbn0pKENvZGVBY3Rpb24gfHwgKENvZGVBY3Rpb24gPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29kZUxlbnMgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgQ29kZUxlbnN9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIENvZGVMZW5zO1xuKGZ1bmN0aW9uIChDb2RlTGVucykge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ29kZUxlbnMgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIGRhdGEpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHsgcmFuZ2UgfTtcbiAgICAgICAgaWYgKElzLmRlZmluZWQoZGF0YSkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5kYXRhID0gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBDb2RlTGVucy5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBDb2RlTGVuc30gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLmNvbW1hbmQpIHx8IENvbW1hbmQuaXMoY2FuZGlkYXRlLmNvbW1hbmQpKTtcbiAgICB9XG4gICAgQ29kZUxlbnMuaXMgPSBpcztcbn0pKENvZGVMZW5zIHx8IChDb2RlTGVucyA9IHt9KSk7XG4vKipcbiAqIFRoZSBGb3JtYXR0aW5nT3B0aW9ucyBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBGb3JtYXR0aW5nT3B0aW9uc30gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgRm9ybWF0dGluZ09wdGlvbnM7XG4oZnVuY3Rpb24gKEZvcm1hdHRpbmdPcHRpb25zKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBGb3JtYXR0aW5nT3B0aW9ucyBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh0YWJTaXplLCBpbnNlcnRTcGFjZXMpIHtcbiAgICAgICAgcmV0dXJuIHsgdGFiU2l6ZSwgaW5zZXJ0U3BhY2VzIH07XG4gICAgfVxuICAgIEZvcm1hdHRpbmdPcHRpb25zLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIEZvcm1hdHRpbmdPcHRpb25zfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS50YWJTaXplKSAmJiBJcy5ib29sZWFuKGNhbmRpZGF0ZS5pbnNlcnRTcGFjZXMpO1xuICAgIH1cbiAgICBGb3JtYXR0aW5nT3B0aW9ucy5pcyA9IGlzO1xufSkoRm9ybWF0dGluZ09wdGlvbnMgfHwgKEZvcm1hdHRpbmdPcHRpb25zID0ge30pKTtcbi8qKlxuICogVGhlIERvY3VtZW50TGluayBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBEb2N1bWVudExpbmt9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIERvY3VtZW50TGluaztcbihmdW5jdGlvbiAoRG9jdW1lbnRMaW5rKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBEb2N1bWVudExpbmsgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIHRhcmdldCwgZGF0YSkge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgdGFyZ2V0LCBkYXRhIH07XG4gICAgfVxuICAgIERvY3VtZW50TGluay5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBEb2N1bWVudExpbmt9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS50YXJnZXQpIHx8IElzLnN0cmluZyhjYW5kaWRhdGUudGFyZ2V0KSk7XG4gICAgfVxuICAgIERvY3VtZW50TGluay5pcyA9IGlzO1xufSkoRG9jdW1lbnRMaW5rIHx8IChEb2N1bWVudExpbmsgPSB7fSkpO1xuLyoqXG4gKiBUaGUgU2VsZWN0aW9uUmFuZ2UgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbiB0byB3b3JrIHdpdGhcbiAqIFNlbGVjdGlvblJhbmdlIGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIFNlbGVjdGlvblJhbmdlO1xuKGZ1bmN0aW9uIChTZWxlY3Rpb25SYW5nZSkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgU2VsZWN0aW9uUmFuZ2VcbiAgICAgKiBAcGFyYW0gcmFuZ2UgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSBwYXJlbnQgYW4gb3B0aW9uYWwgcGFyZW50LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgcGFyZW50KSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCBwYXJlbnQgfTtcbiAgICB9XG4gICAgU2VsZWN0aW9uUmFuZ2UuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIChjYW5kaWRhdGUucGFyZW50ID09PSB1bmRlZmluZWQgfHwgU2VsZWN0aW9uUmFuZ2UuaXMoY2FuZGlkYXRlLnBhcmVudCkpO1xuICAgIH1cbiAgICBTZWxlY3Rpb25SYW5nZS5pcyA9IGlzO1xufSkoU2VsZWN0aW9uUmFuZ2UgfHwgKFNlbGVjdGlvblJhbmdlID0ge30pKTtcbi8qKlxuICogQSBzZXQgb2YgcHJlZGVmaW5lZCB0b2tlbiB0eXBlcy4gVGhpcyBzZXQgaXMgbm90IGZpeGVkXG4gKiBhbiBjbGllbnRzIGNhbiBzcGVjaWZ5IGFkZGl0aW9uYWwgdG9rZW4gdHlwZXMgdmlhIHRoZVxuICogY29ycmVzcG9uZGluZyBjbGllbnQgY2FwYWJpbGl0aWVzLlxuICpcbiAqIEBzaW5jZSAzLjE2LjBcbiAqL1xuZXhwb3J0IHZhciBTZW1hbnRpY1Rva2VuVHlwZXM7XG4oZnVuY3Rpb24gKFNlbWFudGljVG9rZW5UeXBlcykge1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcIm5hbWVzcGFjZVwiXSA9IFwibmFtZXNwYWNlXCI7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIGdlbmVyaWMgdHlwZS4gQWN0cyBhcyBhIGZhbGxiYWNrIGZvciB0eXBlcyB3aGljaCBjYW4ndCBiZSBtYXBwZWQgdG9cbiAgICAgKiBhIHNwZWNpZmljIHR5cGUgbGlrZSBjbGFzcyBvciBlbnVtLlxuICAgICAqL1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInR5cGVcIl0gPSBcInR5cGVcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJjbGFzc1wiXSA9IFwiY2xhc3NcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJlbnVtXCJdID0gXCJlbnVtXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wiaW50ZXJmYWNlXCJdID0gXCJpbnRlcmZhY2VcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJzdHJ1Y3RcIl0gPSBcInN0cnVjdFwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInR5cGVQYXJhbWV0ZXJcIl0gPSBcInR5cGVQYXJhbWV0ZXJcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJwYXJhbWV0ZXJcIl0gPSBcInBhcmFtZXRlclwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInZhcmlhYmxlXCJdID0gXCJ2YXJpYWJsZVwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInByb3BlcnR5XCJdID0gXCJwcm9wZXJ0eVwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImVudW1NZW1iZXJcIl0gPSBcImVudW1NZW1iZXJcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJldmVudFwiXSA9IFwiZXZlbnRcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJmdW5jdGlvblwiXSA9IFwiZnVuY3Rpb25cIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJtZXRob2RcIl0gPSBcIm1ldGhvZFwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcIm1hY3JvXCJdID0gXCJtYWNyb1wiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImtleXdvcmRcIl0gPSBcImtleXdvcmRcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJtb2RpZmllclwiXSA9IFwibW9kaWZpZXJcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJjb21tZW50XCJdID0gXCJjb21tZW50XCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wic3RyaW5nXCJdID0gXCJzdHJpbmdcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJudW1iZXJcIl0gPSBcIm51bWJlclwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInJlZ2V4cFwiXSA9IFwicmVnZXhwXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wib3BlcmF0b3JcIl0gPSBcIm9wZXJhdG9yXCI7XG4gICAgLyoqXG4gICAgICogQHNpbmNlIDMuMTcuMFxuICAgICAqL1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImRlY29yYXRvclwiXSA9IFwiZGVjb3JhdG9yXCI7XG59KShTZW1hbnRpY1Rva2VuVHlwZXMgfHwgKFNlbWFudGljVG9rZW5UeXBlcyA9IHt9KSk7XG4vKipcbiAqIEEgc2V0IG9mIHByZWRlZmluZWQgdG9rZW4gbW9kaWZpZXJzLiBUaGlzIHNldCBpcyBub3QgZml4ZWRcbiAqIGFuIGNsaWVudHMgY2FuIHNwZWNpZnkgYWRkaXRpb25hbCB0b2tlbiB0eXBlcyB2aWEgdGhlXG4gKiBjb3JyZXNwb25kaW5nIGNsaWVudCBjYXBhYmlsaXRpZXMuXG4gKlxuICogQHNpbmNlIDMuMTYuMFxuICovXG5leHBvcnQgdmFyIFNlbWFudGljVG9rZW5Nb2RpZmllcnM7XG4oZnVuY3Rpb24gKFNlbWFudGljVG9rZW5Nb2RpZmllcnMpIHtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wiZGVjbGFyYXRpb25cIl0gPSBcImRlY2xhcmF0aW9uXCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcImRlZmluaXRpb25cIl0gPSBcImRlZmluaXRpb25cIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wicmVhZG9ubHlcIl0gPSBcInJlYWRvbmx5XCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcInN0YXRpY1wiXSA9IFwic3RhdGljXCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcImRlcHJlY2F0ZWRcIl0gPSBcImRlcHJlY2F0ZWRcIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wiYWJzdHJhY3RcIl0gPSBcImFic3RyYWN0XCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcImFzeW5jXCJdID0gXCJhc3luY1wiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJtb2RpZmljYXRpb25cIl0gPSBcIm1vZGlmaWNhdGlvblwiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJkb2N1bWVudGF0aW9uXCJdID0gXCJkb2N1bWVudGF0aW9uXCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcImRlZmF1bHRMaWJyYXJ5XCJdID0gXCJkZWZhdWx0TGlicmFyeVwiO1xufSkoU2VtYW50aWNUb2tlbk1vZGlmaWVycyB8fCAoU2VtYW50aWNUb2tlbk1vZGlmaWVycyA9IHt9KSk7XG4vKipcbiAqIEBzaW5jZSAzLjE2LjBcbiAqL1xuZXhwb3J0IHZhciBTZW1hbnRpY1Rva2VucztcbihmdW5jdGlvbiAoU2VtYW50aWNUb2tlbnMpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiAoY2FuZGlkYXRlLnJlc3VsdElkID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIGNhbmRpZGF0ZS5yZXN1bHRJZCA9PT0gJ3N0cmluZycpICYmXG4gICAgICAgICAgICBBcnJheS5pc0FycmF5KGNhbmRpZGF0ZS5kYXRhKSAmJiAoY2FuZGlkYXRlLmRhdGEubGVuZ3RoID09PSAwIHx8IHR5cGVvZiBjYW5kaWRhdGUuZGF0YVswXSA9PT0gJ251bWJlcicpO1xuICAgIH1cbiAgICBTZW1hbnRpY1Rva2Vucy5pcyA9IGlzO1xufSkoU2VtYW50aWNUb2tlbnMgfHwgKFNlbWFudGljVG9rZW5zID0ge30pKTtcbi8qKlxuICogVGhlIElubGluZVZhbHVlVGV4dCBuYW1lc3BhY2UgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCBJbmxpbmVWYWx1ZVRleHRzLlxuICpcbiAqIEBzaW5jZSAzLjE3LjBcbiAqL1xuZXhwb3J0IHZhciBJbmxpbmVWYWx1ZVRleHQ7XG4oZnVuY3Rpb24gKElubGluZVZhbHVlVGV4dCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgSW5saW5lVmFsdWVUZXh0IGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCB0ZXh0KSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCB0ZXh0IH07XG4gICAgfVxuICAgIElubGluZVZhbHVlVGV4dC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgIT09IHVuZGVmaW5lZCAmJiBjYW5kaWRhdGUgIT09IG51bGwgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnRleHQpO1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZVRleHQuaXMgPSBpcztcbn0pKElubGluZVZhbHVlVGV4dCB8fCAoSW5saW5lVmFsdWVUZXh0ID0ge30pKTtcbi8qKlxuICogVGhlIElubGluZVZhbHVlVmFyaWFibGVMb29rdXAgbmFtZXNwYWNlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGggSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cHMuXG4gKlxuICogQHNpbmNlIDMuMTcuMFxuICovXG5leHBvcnQgdmFyIElubGluZVZhbHVlVmFyaWFibGVMb29rdXA7XG4oZnVuY3Rpb24gKElubGluZVZhbHVlVmFyaWFibGVMb29rdXApIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IElubGluZVZhbHVlVGV4dCBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgdmFyaWFibGVOYW1lLCBjYXNlU2Vuc2l0aXZlTG9va3VwKSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCB2YXJpYWJsZU5hbWUsIGNhc2VTZW5zaXRpdmVMb29rdXAgfTtcbiAgICB9XG4gICAgSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgIT09IHVuZGVmaW5lZCAmJiBjYW5kaWRhdGUgIT09IG51bGwgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiBJcy5ib29sZWFuKGNhbmRpZGF0ZS5jYXNlU2Vuc2l0aXZlTG9va3VwKVxuICAgICAgICAgICAgJiYgKElzLnN0cmluZyhjYW5kaWRhdGUudmFyaWFibGVOYW1lKSB8fCBjYW5kaWRhdGUudmFyaWFibGVOYW1lID09PSB1bmRlZmluZWQpO1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwLmlzID0gaXM7XG59KShJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwIHx8IChJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwID0ge30pKTtcbi8qKlxuICogVGhlIElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uIG5hbWVzcGFjZSBwcm92aWRlcyBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uLlxuICpcbiAqIEBzaW5jZSAzLjE3LjBcbiAqL1xuZXhwb3J0IHZhciBJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbjtcbihmdW5jdGlvbiAoSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCBleHByZXNzaW9uKSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCBleHByZXNzaW9uIH07XG4gICAgfVxuICAgIElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAhPT0gdW5kZWZpbmVkICYmIGNhbmRpZGF0ZSAhPT0gbnVsbCAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpXG4gICAgICAgICAgICAmJiAoSXMuc3RyaW5nKGNhbmRpZGF0ZS5leHByZXNzaW9uKSB8fCBjYW5kaWRhdGUuZXhwcmVzc2lvbiA9PT0gdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24uaXMgPSBpcztcbn0pKElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uIHx8IChJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBJbmxpbmVWYWx1ZUNvbnRleHQgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgSW5saW5lVmFsdWVDb250ZXh0fSBsaXRlcmFscy5cbiAqXG4gKiBAc2luY2UgMy4xNy4wXG4gKi9cbmV4cG9ydCB2YXIgSW5saW5lVmFsdWVDb250ZXh0O1xuKGZ1bmN0aW9uIChJbmxpbmVWYWx1ZUNvbnRleHQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IElubGluZVZhbHVlQ29udGV4dCBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShmcmFtZUlkLCBzdG9wcGVkTG9jYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHsgZnJhbWVJZCwgc3RvcHBlZExvY2F0aW9uIH07XG4gICAgfVxuICAgIElubGluZVZhbHVlQ29udGV4dC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBJbmxpbmVWYWx1ZUNvbnRleHR9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyh2YWx1ZS5zdG9wcGVkTG9jYXRpb24pO1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZUNvbnRleHQuaXMgPSBpcztcbn0pKElubGluZVZhbHVlQ29udGV4dCB8fCAoSW5saW5lVmFsdWVDb250ZXh0ID0ge30pKTtcbi8qKlxuICogSW5sYXkgaGludCBraW5kcy5cbiAqXG4gKiBAc2luY2UgMy4xNy4wXG4gKi9cbmV4cG9ydCB2YXIgSW5sYXlIaW50S2luZDtcbihmdW5jdGlvbiAoSW5sYXlIaW50S2luZCkge1xuICAgIC8qKlxuICAgICAqIEFuIGlubGF5IGhpbnQgdGhhdCBmb3IgYSB0eXBlIGFubm90YXRpb24uXG4gICAgICovXG4gICAgSW5sYXlIaW50S2luZC5UeXBlID0gMTtcbiAgICAvKipcbiAgICAgKiBBbiBpbmxheSBoaW50IHRoYXQgaXMgZm9yIGEgcGFyYW1ldGVyLlxuICAgICAqL1xuICAgIElubGF5SGludEtpbmQuUGFyYW1ldGVyID0gMjtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWUgPT09IDEgfHwgdmFsdWUgPT09IDI7XG4gICAgfVxuICAgIElubGF5SGludEtpbmQuaXMgPSBpcztcbn0pKElubGF5SGludEtpbmQgfHwgKElubGF5SGludEtpbmQgPSB7fSkpO1xuZXhwb3J0IHZhciBJbmxheUhpbnRMYWJlbFBhcnQ7XG4oZnVuY3Rpb24gKElubGF5SGludExhYmVsUGFydCkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh2YWx1ZSkge1xuICAgICAgICByZXR1cm4geyB2YWx1ZSB9O1xuICAgIH1cbiAgICBJbmxheUhpbnRMYWJlbFBhcnQuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLnRvb2x0aXAgPT09IHVuZGVmaW5lZCB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLnRvb2x0aXApIHx8IE1hcmt1cENvbnRlbnQuaXMoY2FuZGlkYXRlLnRvb2x0aXApKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS5sb2NhdGlvbiA9PT0gdW5kZWZpbmVkIHx8IExvY2F0aW9uLmlzKGNhbmRpZGF0ZS5sb2NhdGlvbikpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLmNvbW1hbmQgPT09IHVuZGVmaW5lZCB8fCBDb21tYW5kLmlzKGNhbmRpZGF0ZS5jb21tYW5kKSk7XG4gICAgfVxuICAgIElubGF5SGludExhYmVsUGFydC5pcyA9IGlzO1xufSkoSW5sYXlIaW50TGFiZWxQYXJ0IHx8IChJbmxheUhpbnRMYWJlbFBhcnQgPSB7fSkpO1xuZXhwb3J0IHZhciBJbmxheUhpbnQ7XG4oZnVuY3Rpb24gKElubGF5SGludCkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShwb3NpdGlvbiwgbGFiZWwsIGtpbmQpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0geyBwb3NpdGlvbiwgbGFiZWwgfTtcbiAgICAgICAgaWYgKGtpbmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmtpbmQgPSBraW5kO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIElubGF5SGludC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgUG9zaXRpb24uaXMoY2FuZGlkYXRlLnBvc2l0aW9uKVxuICAgICAgICAgICAgJiYgKElzLnN0cmluZyhjYW5kaWRhdGUubGFiZWwpIHx8IElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLmxhYmVsLCBJbmxheUhpbnRMYWJlbFBhcnQuaXMpKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS5raW5kID09PSB1bmRlZmluZWQgfHwgSW5sYXlIaW50S2luZC5pcyhjYW5kaWRhdGUua2luZCkpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLnRleHRFZGl0cyA9PT0gdW5kZWZpbmVkKSB8fCBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS50ZXh0RWRpdHMsIFRleHRFZGl0LmlzKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS50b29sdGlwID09PSB1bmRlZmluZWQgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS50b29sdGlwKSB8fCBNYXJrdXBDb250ZW50LmlzKGNhbmRpZGF0ZS50b29sdGlwKSlcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUucGFkZGluZ0xlZnQgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5wYWRkaW5nTGVmdCkpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLnBhZGRpbmdSaWdodCA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLnBhZGRpbmdSaWdodCkpO1xuICAgIH1cbiAgICBJbmxheUhpbnQuaXMgPSBpcztcbn0pKElubGF5SGludCB8fCAoSW5sYXlIaW50ID0ge30pKTtcbmV4cG9ydCB2YXIgU3RyaW5nVmFsdWU7XG4oZnVuY3Rpb24gKFN0cmluZ1ZhbHVlKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlU25pcHBldCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4geyBraW5kOiAnc25pcHBldCcsIHZhbHVlIH07XG4gICAgfVxuICAgIFN0cmluZ1ZhbHVlLmNyZWF0ZVNuaXBwZXQgPSBjcmVhdGVTbmlwcGV0O1xufSkoU3RyaW5nVmFsdWUgfHwgKFN0cmluZ1ZhbHVlID0ge30pKTtcbmV4cG9ydCB2YXIgSW5saW5lQ29tcGxldGlvbkl0ZW07XG4oZnVuY3Rpb24gKElubGluZUNvbXBsZXRpb25JdGVtKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKGluc2VydFRleHQsIGZpbHRlclRleHQsIHJhbmdlLCBjb21tYW5kKSB7XG4gICAgICAgIHJldHVybiB7IGluc2VydFRleHQsIGZpbHRlclRleHQsIHJhbmdlLCBjb21tYW5kIH07XG4gICAgfVxuICAgIElubGluZUNvbXBsZXRpb25JdGVtLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKElubGluZUNvbXBsZXRpb25JdGVtIHx8IChJbmxpbmVDb21wbGV0aW9uSXRlbSA9IHt9KSk7XG5leHBvcnQgdmFyIElubGluZUNvbXBsZXRpb25MaXN0O1xuKGZ1bmN0aW9uIChJbmxpbmVDb21wbGV0aW9uTGlzdCkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShpdGVtcykge1xuICAgICAgICByZXR1cm4geyBpdGVtcyB9O1xuICAgIH1cbiAgICBJbmxpbmVDb21wbGV0aW9uTGlzdC5jcmVhdGUgPSBjcmVhdGU7XG59KShJbmxpbmVDb21wbGV0aW9uTGlzdCB8fCAoSW5saW5lQ29tcGxldGlvbkxpc3QgPSB7fSkpO1xuLyoqXG4gKiBEZXNjcmliZXMgaG93IGFuIHtAbGluayBJbmxpbmVDb21wbGV0aW9uSXRlbVByb3ZpZGVyIGlubGluZSBjb21wbGV0aW9uIHByb3ZpZGVyfSB3YXMgdHJpZ2dlcmVkLlxuICpcbiAqIEBzaW5jZSAzLjE4LjBcbiAqIEBwcm9wb3NlZFxuICovXG5leHBvcnQgdmFyIElubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZDtcbihmdW5jdGlvbiAoSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kKSB7XG4gICAgLyoqXG4gICAgICogQ29tcGxldGlvbiB3YXMgdHJpZ2dlcmVkIGV4cGxpY2l0bHkgYnkgYSB1c2VyIGdlc3R1cmUuXG4gICAgICovXG4gICAgSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kLkludm9rZWQgPSAwO1xuICAgIC8qKlxuICAgICAqIENvbXBsZXRpb24gd2FzIHRyaWdnZXJlZCBhdXRvbWF0aWNhbGx5IHdoaWxlIGVkaXRpbmcuXG4gICAgICovXG4gICAgSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kLkF1dG9tYXRpYyA9IDE7XG59KShJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmQgfHwgKElubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZCA9IHt9KSk7XG5leHBvcnQgdmFyIFNlbGVjdGVkQ29tcGxldGlvbkluZm87XG4oZnVuY3Rpb24gKFNlbGVjdGVkQ29tcGxldGlvbkluZm8pIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIHRleHQpIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIHRleHQgfTtcbiAgICB9XG4gICAgU2VsZWN0ZWRDb21wbGV0aW9uSW5mby5jcmVhdGUgPSBjcmVhdGU7XG59KShTZWxlY3RlZENvbXBsZXRpb25JbmZvIHx8IChTZWxlY3RlZENvbXBsZXRpb25JbmZvID0ge30pKTtcbmV4cG9ydCB2YXIgSW5saW5lQ29tcGxldGlvbkNvbnRleHQ7XG4oZnVuY3Rpb24gKElubGluZUNvbXBsZXRpb25Db250ZXh0KSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKHRyaWdnZXJLaW5kLCBzZWxlY3RlZENvbXBsZXRpb25JbmZvKSB7XG4gICAgICAgIHJldHVybiB7IHRyaWdnZXJLaW5kLCBzZWxlY3RlZENvbXBsZXRpb25JbmZvIH07XG4gICAgfVxuICAgIElubGluZUNvbXBsZXRpb25Db250ZXh0LmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKElubGluZUNvbXBsZXRpb25Db250ZXh0IHx8IChJbmxpbmVDb21wbGV0aW9uQ29udGV4dCA9IHt9KSk7XG5leHBvcnQgdmFyIFdvcmtzcGFjZUZvbGRlcjtcbihmdW5jdGlvbiAoV29ya3NwYWNlRm9sZGVyKSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgVVJJLmlzKGNhbmRpZGF0ZS51cmkpICYmIElzLnN0cmluZyhjYW5kaWRhdGUubmFtZSk7XG4gICAgfVxuICAgIFdvcmtzcGFjZUZvbGRlci5pcyA9IGlzO1xufSkoV29ya3NwYWNlRm9sZGVyIHx8IChXb3Jrc3BhY2VGb2xkZXIgPSB7fSkpO1xuZXhwb3J0IGNvbnN0IEVPTCA9IFsnXFxuJywgJ1xcclxcbicsICdcXHInXTtcbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHRoZSB0ZXh0IGRvY3VtZW50IGZyb20gdGhlIG5ldyB2c2NvZGUtbGFuZ3VhZ2VzZXJ2ZXItdGV4dGRvY3VtZW50IHBhY2thZ2UuXG4gKi9cbmV4cG9ydCB2YXIgVGV4dERvY3VtZW50O1xuKGZ1bmN0aW9uIChUZXh0RG9jdW1lbnQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IElUZXh0RG9jdW1lbnQgbGl0ZXJhbCBmcm9tIHRoZSBnaXZlbiB1cmkgYW5kIGNvbnRlbnQuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgZG9jdW1lbnQncyB1cmkuXG4gICAgICogQHBhcmFtIGxhbmd1YWdlSWQgVGhlIGRvY3VtZW50J3MgbGFuZ3VhZ2UgSWQuXG4gICAgICogQHBhcmFtIHZlcnNpb24gVGhlIGRvY3VtZW50J3MgdmVyc2lvbi5cbiAgICAgKiBAcGFyYW0gY29udGVudCBUaGUgZG9jdW1lbnQncyBjb250ZW50LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmksIGxhbmd1YWdlSWQsIHZlcnNpb24sIGNvbnRlbnQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGdWxsVGV4dERvY3VtZW50KHVyaSwgbGFuZ3VhZ2VJZCwgdmVyc2lvbiwgY29udGVudCk7XG4gICAgfVxuICAgIFRleHREb2N1bWVudC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBJVGV4dERvY3VtZW50fSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudXJpKSAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5sYW5ndWFnZUlkKSB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLmxhbmd1YWdlSWQpKSAmJiBJcy51aW50ZWdlcihjYW5kaWRhdGUubGluZUNvdW50KVxuICAgICAgICAgICAgJiYgSXMuZnVuYyhjYW5kaWRhdGUuZ2V0VGV4dCkgJiYgSXMuZnVuYyhjYW5kaWRhdGUucG9zaXRpb25BdCkgJiYgSXMuZnVuYyhjYW5kaWRhdGUub2Zmc2V0QXQpID8gdHJ1ZSA6IGZhbHNlO1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnQuaXMgPSBpcztcbiAgICBmdW5jdGlvbiBhcHBseUVkaXRzKGRvY3VtZW50LCBlZGl0cykge1xuICAgICAgICBsZXQgdGV4dCA9IGRvY3VtZW50LmdldFRleHQoKTtcbiAgICAgICAgbGV0IHNvcnRlZEVkaXRzID0gbWVyZ2VTb3J0KGVkaXRzLCAoYSwgYikgPT4ge1xuICAgICAgICAgICAgbGV0IGRpZmYgPSBhLnJhbmdlLnN0YXJ0LmxpbmUgLSBiLnJhbmdlLnN0YXJ0LmxpbmU7XG4gICAgICAgICAgICBpZiAoZGlmZiA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhLnJhbmdlLnN0YXJ0LmNoYXJhY3RlciAtIGIucmFuZ2Uuc3RhcnQuY2hhcmFjdGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRpZmY7XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgbGFzdE1vZGlmaWVkT2Zmc2V0ID0gdGV4dC5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGkgPSBzb3J0ZWRFZGl0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgbGV0IGUgPSBzb3J0ZWRFZGl0c1tpXTtcbiAgICAgICAgICAgIGxldCBzdGFydE9mZnNldCA9IGRvY3VtZW50Lm9mZnNldEF0KGUucmFuZ2Uuc3RhcnQpO1xuICAgICAgICAgICAgbGV0IGVuZE9mZnNldCA9IGRvY3VtZW50Lm9mZnNldEF0KGUucmFuZ2UuZW5kKTtcbiAgICAgICAgICAgIGlmIChlbmRPZmZzZXQgPD0gbGFzdE1vZGlmaWVkT2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIHN0YXJ0T2Zmc2V0KSArIGUubmV3VGV4dCArIHRleHQuc3Vic3RyaW5nKGVuZE9mZnNldCwgdGV4dC5sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdPdmVybGFwcGluZyBlZGl0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsYXN0TW9kaWZpZWRPZmZzZXQgPSBzdGFydE9mZnNldDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50LmFwcGx5RWRpdHMgPSBhcHBseUVkaXRzO1xuICAgIGZ1bmN0aW9uIG1lcmdlU29ydChkYXRhLCBjb21wYXJlKSB7XG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCA8PSAxKSB7XG4gICAgICAgICAgICAvLyBzb3J0ZWRcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHAgPSAoZGF0YS5sZW5ndGggLyAyKSB8IDA7XG4gICAgICAgIGNvbnN0IGxlZnQgPSBkYXRhLnNsaWNlKDAsIHApO1xuICAgICAgICBjb25zdCByaWdodCA9IGRhdGEuc2xpY2UocCk7XG4gICAgICAgIG1lcmdlU29ydChsZWZ0LCBjb21wYXJlKTtcbiAgICAgICAgbWVyZ2VTb3J0KHJpZ2h0LCBjb21wYXJlKTtcbiAgICAgICAgbGV0IGxlZnRJZHggPSAwO1xuICAgICAgICBsZXQgcmlnaHRJZHggPSAwO1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIHdoaWxlIChsZWZ0SWR4IDwgbGVmdC5sZW5ndGggJiYgcmlnaHRJZHggPCByaWdodC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCByZXQgPSBjb21wYXJlKGxlZnRbbGVmdElkeF0sIHJpZ2h0W3JpZ2h0SWR4XSk7XG4gICAgICAgICAgICBpZiAocmV0IDw9IDApIHtcbiAgICAgICAgICAgICAgICAvLyBzbWFsbGVyX2VxdWFsIC0+IHRha2UgbGVmdCB0byBwcmVzZXJ2ZSBvcmRlclxuICAgICAgICAgICAgICAgIGRhdGFbaSsrXSA9IGxlZnRbbGVmdElkeCsrXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGdyZWF0ZXIgLT4gdGFrZSByaWdodFxuICAgICAgICAgICAgICAgIGRhdGFbaSsrXSA9IHJpZ2h0W3JpZ2h0SWR4KytdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChsZWZ0SWR4IDwgbGVmdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRhdGFbaSsrXSA9IGxlZnRbbGVmdElkeCsrXTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAocmlnaHRJZHggPCByaWdodC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRhdGFbaSsrXSA9IHJpZ2h0W3JpZ2h0SWR4KytdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbn0pKFRleHREb2N1bWVudCB8fCAoVGV4dERvY3VtZW50ID0ge30pKTtcbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHRoZSB0ZXh0IGRvY3VtZW50IGZyb20gdGhlIG5ldyB2c2NvZGUtbGFuZ3VhZ2VzZXJ2ZXItdGV4dGRvY3VtZW50IHBhY2thZ2UuXG4gKi9cbmNsYXNzIEZ1bGxUZXh0RG9jdW1lbnQge1xuICAgIGNvbnN0cnVjdG9yKHVyaSwgbGFuZ3VhZ2VJZCwgdmVyc2lvbiwgY29udGVudCkge1xuICAgICAgICB0aGlzLl91cmkgPSB1cmk7XG4gICAgICAgIHRoaXMuX2xhbmd1YWdlSWQgPSBsYW5ndWFnZUlkO1xuICAgICAgICB0aGlzLl92ZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgICAgdGhpcy5fY29udGVudCA9IGNvbnRlbnQ7XG4gICAgICAgIHRoaXMuX2xpbmVPZmZzZXRzID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBnZXQgdXJpKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdXJpO1xuICAgIH1cbiAgICBnZXQgbGFuZ3VhZ2VJZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhbmd1YWdlSWQ7XG4gICAgfVxuICAgIGdldCB2ZXJzaW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmVyc2lvbjtcbiAgICB9XG4gICAgZ2V0VGV4dChyYW5nZSkge1xuICAgICAgICBpZiAocmFuZ2UpIHtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IHRoaXMub2Zmc2V0QXQocmFuZ2Uuc3RhcnQpO1xuICAgICAgICAgICAgbGV0IGVuZCA9IHRoaXMub2Zmc2V0QXQocmFuZ2UuZW5kKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb250ZW50LnN1YnN0cmluZyhzdGFydCwgZW5kKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fY29udGVudDtcbiAgICB9XG4gICAgdXBkYXRlKGV2ZW50LCB2ZXJzaW9uKSB7XG4gICAgICAgIHRoaXMuX2NvbnRlbnQgPSBldmVudC50ZXh0O1xuICAgICAgICB0aGlzLl92ZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgICAgdGhpcy5fbGluZU9mZnNldHMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGdldExpbmVPZmZzZXRzKCkge1xuICAgICAgICBpZiAodGhpcy5fbGluZU9mZnNldHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbGV0IGxpbmVPZmZzZXRzID0gW107XG4gICAgICAgICAgICBsZXQgdGV4dCA9IHRoaXMuX2NvbnRlbnQ7XG4gICAgICAgICAgICBsZXQgaXNMaW5lU3RhcnQgPSB0cnVlO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzTGluZVN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgIGxpbmVPZmZzZXRzLnB1c2goaSk7XG4gICAgICAgICAgICAgICAgICAgIGlzTGluZVN0YXJ0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBjaCA9IHRleHQuY2hhckF0KGkpO1xuICAgICAgICAgICAgICAgIGlzTGluZVN0YXJ0ID0gKGNoID09PSAnXFxyJyB8fCBjaCA9PT0gJ1xcbicpO1xuICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ1xccicgJiYgaSArIDEgPCB0ZXh0Lmxlbmd0aCAmJiB0ZXh0LmNoYXJBdChpICsgMSkgPT09ICdcXG4nKSB7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNMaW5lU3RhcnQgJiYgdGV4dC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGluZU9mZnNldHMucHVzaCh0ZXh0Lmxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9saW5lT2Zmc2V0cyA9IGxpbmVPZmZzZXRzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9saW5lT2Zmc2V0cztcbiAgICB9XG4gICAgcG9zaXRpb25BdChvZmZzZXQpIHtcbiAgICAgICAgb2Zmc2V0ID0gTWF0aC5tYXgoTWF0aC5taW4ob2Zmc2V0LCB0aGlzLl9jb250ZW50Lmxlbmd0aCksIDApO1xuICAgICAgICBsZXQgbGluZU9mZnNldHMgPSB0aGlzLmdldExpbmVPZmZzZXRzKCk7XG4gICAgICAgIGxldCBsb3cgPSAwLCBoaWdoID0gbGluZU9mZnNldHMubGVuZ3RoO1xuICAgICAgICBpZiAoaGlnaCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFBvc2l0aW9uLmNyZWF0ZSgwLCBvZmZzZXQpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgICAgICAgICBsZXQgbWlkID0gTWF0aC5mbG9vcigobG93ICsgaGlnaCkgLyAyKTtcbiAgICAgICAgICAgIGlmIChsaW5lT2Zmc2V0c1ttaWRdID4gb2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgaGlnaCA9IG1pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvdyA9IG1pZCArIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gbG93IGlzIHRoZSBsZWFzdCB4IGZvciB3aGljaCB0aGUgbGluZSBvZmZzZXQgaXMgbGFyZ2VyIHRoYW4gdGhlIGN1cnJlbnQgb2Zmc2V0XG4gICAgICAgIC8vIG9yIGFycmF5Lmxlbmd0aCBpZiBubyBsaW5lIG9mZnNldCBpcyBsYXJnZXIgdGhhbiB0aGUgY3VycmVudCBvZmZzZXRcbiAgICAgICAgbGV0IGxpbmUgPSBsb3cgLSAxO1xuICAgICAgICByZXR1cm4gUG9zaXRpb24uY3JlYXRlKGxpbmUsIG9mZnNldCAtIGxpbmVPZmZzZXRzW2xpbmVdKTtcbiAgICB9XG4gICAgb2Zmc2V0QXQocG9zaXRpb24pIHtcbiAgICAgICAgbGV0IGxpbmVPZmZzZXRzID0gdGhpcy5nZXRMaW5lT2Zmc2V0cygpO1xuICAgICAgICBpZiAocG9zaXRpb24ubGluZSA+PSBsaW5lT2Zmc2V0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb250ZW50Lmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwb3NpdGlvbi5saW5lIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGxpbmVPZmZzZXQgPSBsaW5lT2Zmc2V0c1twb3NpdGlvbi5saW5lXTtcbiAgICAgICAgbGV0IG5leHRMaW5lT2Zmc2V0ID0gKHBvc2l0aW9uLmxpbmUgKyAxIDwgbGluZU9mZnNldHMubGVuZ3RoKSA/IGxpbmVPZmZzZXRzW3Bvc2l0aW9uLmxpbmUgKyAxXSA6IHRoaXMuX2NvbnRlbnQubGVuZ3RoO1xuICAgICAgICByZXR1cm4gTWF0aC5tYXgoTWF0aC5taW4obGluZU9mZnNldCArIHBvc2l0aW9uLmNoYXJhY3RlciwgbmV4dExpbmVPZmZzZXQpLCBsaW5lT2Zmc2V0KTtcbiAgICB9XG4gICAgZ2V0IGxpbmVDb3VudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TGluZU9mZnNldHMoKS5sZW5ndGg7XG4gICAgfVxufVxudmFyIElzO1xuKGZ1bmN0aW9uIChJcykge1xuICAgIGNvbnN0IHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbiAgICBmdW5jdGlvbiBkZWZpbmVkKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnO1xuICAgIH1cbiAgICBJcy5kZWZpbmVkID0gZGVmaW5lZDtcbiAgICBmdW5jdGlvbiB1bmRlZmluZWQodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCc7XG4gICAgfVxuICAgIElzLnVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBmdW5jdGlvbiBib29sZWFuKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gZmFsc2U7XG4gICAgfVxuICAgIElzLmJvb2xlYW4gPSBib29sZWFuO1xuICAgIGZ1bmN0aW9uIHN0cmluZyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IFN0cmluZ10nO1xuICAgIH1cbiAgICBJcy5zdHJpbmcgPSBzdHJpbmc7XG4gICAgZnVuY3Rpb24gbnVtYmVyKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgTnVtYmVyXSc7XG4gICAgfVxuICAgIElzLm51bWJlciA9IG51bWJlcjtcbiAgICBmdW5jdGlvbiBudW1iZXJSYW5nZSh2YWx1ZSwgbWluLCBtYXgpIHtcbiAgICAgICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBOdW1iZXJdJyAmJiBtaW4gPD0gdmFsdWUgJiYgdmFsdWUgPD0gbWF4O1xuICAgIH1cbiAgICBJcy5udW1iZXJSYW5nZSA9IG51bWJlclJhbmdlO1xuICAgIGZ1bmN0aW9uIGludGVnZXIodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBOdW1iZXJdJyAmJiAtMjE0NzQ4MzY0OCA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSAyMTQ3NDgzNjQ3O1xuICAgIH1cbiAgICBJcy5pbnRlZ2VyID0gaW50ZWdlcjtcbiAgICBmdW5jdGlvbiB1aW50ZWdlcih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IE51bWJlcl0nICYmIDAgPD0gdmFsdWUgJiYgdmFsdWUgPD0gMjE0NzQ4MzY0NztcbiAgICB9XG4gICAgSXMudWludGVnZXIgPSB1aW50ZWdlcjtcbiAgICBmdW5jdGlvbiBmdW5jKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbiAgICB9XG4gICAgSXMuZnVuYyA9IGZ1bmM7XG4gICAgZnVuY3Rpb24gb2JqZWN0TGl0ZXJhbCh2YWx1ZSkge1xuICAgICAgICAvLyBTdHJpY3RseSBzcGVha2luZyBjbGFzcyBpbnN0YW5jZXMgcGFzcyB0aGlzIGNoZWNrIGFzIHdlbGwuIFNpbmNlIHRoZSBMU1BcbiAgICAgICAgLy8gZG9lc24ndCB1c2UgY2xhc3NlcyB3ZSBpZ25vcmUgdGhpcyBmb3Igbm93LiBJZiB3ZSBkbyB3ZSBuZWVkIHRvIGFkZCBzb21ldGhpbmdcbiAgICAgICAgLy8gbGlrZSB0aGlzOiBgT2JqZWN0LmdldFByb3RvdHlwZU9mKE9iamVjdC5nZXRQcm90b3R5cGVPZih4KSkgPT09IG51bGxgXG4gICAgICAgIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnO1xuICAgIH1cbiAgICBJcy5vYmplY3RMaXRlcmFsID0gb2JqZWN0TGl0ZXJhbDtcbiAgICBmdW5jdGlvbiB0eXBlZEFycmF5KHZhbHVlLCBjaGVjaykge1xuICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUuZXZlcnkoY2hlY2spO1xuICAgIH1cbiAgICBJcy50eXBlZEFycmF5ID0gdHlwZWRBcnJheTtcbn0pKElzIHx8IChJcyA9IHt9KSk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7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QjtBQUFBLFVBQ3RCLGVBQWU7QUFBQSxZQUNYO0FBQUEsWUFBYTtBQUFBLFlBQVM7QUFBQSxZQUN0QjtBQUFBLFlBQ0E7QUFBQSxZQUNBO0FBQUEsVUFDSjtBQUFBLFVBQ0EsYUFBYSxDQUFDLFFBQVEsU0FBUyxPQUFPLE9BQU8sRUFBRTtBQUFBLFFBQ25EO0FBQUEsUUFDQSxlQUFnQixFQUFFLFNBQVMsS0FBSztBQUFBLFFBQ2hDLFFBQWdCLEVBQUUsU0FBUyxLQUFLO0FBQUEsUUFDaEMsYUFBZ0IsRUFBRSxpQkFBaUIsTUFBTTtBQUFBLFFBQ3pDLFlBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsU0FBUyxNQUFNLEVBQUU7QUFBQSxRQUNyRCxvQkFBd0IsRUFBRSxTQUFTLEtBQUs7QUFBQSxRQUN4Qyx5QkFBeUIsRUFBRSxTQUFTLEtBQUs7QUFBQSxNQUM3QztBQUFBLElBQ0o7QUFBQSxFQUNKOyIsCiAgIm5hbWVzIjogWyJFcnJvckNvZGVzIiwgIk1lc3NhZ2UiLCAiVG91Y2giLCAiRGlzcG9zYWJsZSIsICJSQUwiLCAiRXZlbnQiLCAiSXMiLCAiQ2FuY2VsbGF0aW9uVG9rZW4iLCAiQ2FuY2VsbGF0aW9uU3RhdGUiLCAiX2Nvbm4iLCAiSXMiLCAiTWVzc2FnZVJlYWRlciIsICJBYnN0cmFjdE1lc3NhZ2VSZWFkZXIiLCAiUmVzb2x2ZWRNZXNzYWdlUmVhZGVyT3B0aW9ucyIsICJJcyIsICJNZXNzYWdlV3JpdGVyIiwgIkFic3RyYWN0TWVzc2FnZVdyaXRlciIsICJSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zIiwgInJlc3VsdCIsICJJcyIsICJDYW5jZWxOb3RpZmljYXRpb24iLCAiUHJvZ3Jlc3NUb2tlbiIsICJQcm9ncmVzc05vdGlmaWNhdGlvbiIsICJTdGFyUmVxdWVzdEhhbmRsZXIiLCAiVHJhY2UiLCAiVHJhY2VWYWx1ZXMiLCAiVHJhY2VGb3JtYXQiLCAiU2V0VHJhY2VOb3RpZmljYXRpb24iLCAiTG9nVHJhY2VOb3RpZmljYXRpb24iLCAiQ29ubmVjdGlvbkVycm9ycyIsICJDb25uZWN0aW9uU3RyYXRlZ3kiLCAiSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5IiwgIlJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5IiwgIkNhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kiLCAiQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kiLCAiQ2FuY2VsbGF0aW9uU3RyYXRlZ3kiLCAiTWVzc2FnZVN0cmF0ZWd5IiwgIkNvbm5lY3Rpb25PcHRpb25zIiwgIkNvbm5lY3Rpb25TdGF0ZSIsICJjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiIsICJzdGFydFRpbWUiLCAiUklMIiwgIm0iLCAiZXhwb3J0cyIsICJjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiIsICJpbXBvcnRfdnNjb2RlX2pzb25ycGMiLCAiaW1wb3J0X3ZzY29kZV9qc29ucnBjIiwgImltcG9ydF92c2NvZGVfanNvbnJwYyIsICJpbXBvcnRfdnNjb2RlX2pzb25ycGMiLCAiRG9jdW1lbnRVcmkiLCAiVVJJIiwgImludGVnZXIiLCAidWludGVnZXIiLCAiUG9zaXRpb24iLCAiUmFuZ2UiLCAiTG9jYXRpb24iLCAiTG9jYXRpb25MaW5rIiwgIkNvbG9yIiwgIkNvbG9ySW5mb3JtYXRpb24iLCAiQ29sb3JQcmVzZW50YXRpb24iLCAiRm9sZGluZ1JhbmdlS2luZCIsICJGb2xkaW5nUmFuZ2UiLCAiRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbiIsICJsb2NhdGlvbiIsICJEaWFnbm9zdGljU2V2ZXJpdHkiLCAiRGlhZ25vc3RpY1RhZyIsICJDb2RlRGVzY3JpcHRpb24iLCAiRGlhZ25vc3RpYyIsICJDb21tYW5kIiwgIlRleHRFZGl0IiwgIkNoYW5nZUFubm90YXRpb24iLCAiQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIiLCAiQW5ub3RhdGVkVGV4dEVkaXQiLCAiVGV4dERvY3VtZW50RWRpdCIsICJDcmVhdGVGaWxlIiwgIlJlbmFtZUZpbGUiLCAiRGVsZXRlRmlsZSIsICJXb3Jrc3BhY2VFZGl0IiwgIlRleHREb2N1bWVudElkZW50aWZpZXIiLCAiVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciIsICJPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIiLCAiVGV4dERvY3VtZW50SXRlbSIsICJNYXJrdXBLaW5kIiwgIk1hcmt1cENvbnRlbnQiLCAiQ29tcGxldGlvbkl0ZW1LaW5kIiwgIkluc2VydFRleHRGb3JtYXQiLCAiQ29tcGxldGlvbkl0ZW1UYWciLCAiSW5zZXJ0UmVwbGFjZUVkaXQiLCAiUmFuZ2UiLCAiSW5zZXJ0VGV4dE1vZGUiLCAiQ29tcGxldGlvbkl0ZW1MYWJlbERldGFpbHMiLCAiQ29tcGxldGlvbkl0ZW0iLCAiQ29tcGxldGlvbkxpc3QiLCAiTWFya2VkU3RyaW5nIiwgIkhvdmVyIiwgIlBhcmFtZXRlckluZm9ybWF0aW9uIiwgIlNpZ25hdHVyZUluZm9ybWF0aW9uIiwgIkRvY3VtZW50SGlnaGxpZ2h0S2luZCIsICJEb2N1bWVudEhpZ2hsaWdodCIsICJTeW1ib2xLaW5kIiwgIlN5bWJvbFRhZyIsICJTeW1ib2xJbmZvcm1hdGlvbiIsICJXb3Jrc3BhY2VTeW1ib2wiLCAiRG9jdW1lbnRTeW1ib2wiLCAiQ29kZUFjdGlvbktpbmQiLCAiQ29kZUFjdGlvblRyaWdnZXJLaW5kIiwgIkNvZGVBY3Rpb25Db250ZXh0IiwgIkNvZGVBY3Rpb24iLCAiQ29kZUxlbnMiLCAiRm9ybWF0dGluZ09wdGlvbnMiLCAiRG9jdW1lbnRMaW5rIiwgIlNlbGVjdGlvblJhbmdlIiwgIlNlbWFudGljVG9rZW5UeXBlcyIsICJTZW1hbnRpY1Rva2VuTW9kaWZpZXJzIiwgIlNlbWFudGljVG9rZW5zIiwgIklubGluZVZhbHVlVGV4dCIsICJJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwIiwgIklubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uIiwgIklubGluZVZhbHVlQ29udGV4dCIsICJJbmxheUhpbnRLaW5kIiwgIklubGF5SGludExhYmVsUGFydCIsICJJbmxheUhpbnQiLCAiUG9zaXRpb24iLCAiU3RyaW5nVmFsdWUiLCAiSW5saW5lQ29tcGxldGlvbkl0ZW0iLCAiSW5saW5lQ29tcGxldGlvbkxpc3QiLCAiSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kIiwgIlNlbGVjdGVkQ29tcGxldGlvbkluZm8iLCAiSW5saW5lQ29tcGxldGlvbkNvbnRleHQiLCAiV29ya3NwYWNlRm9sZGVyIiwgIlRleHREb2N1bWVudCIsICJQb3NpdGlvbiIsICJJcyIsICJ1bmRlZmluZWQiLCAiaW50ZWdlciIsICJ1aW50ZWdlciIsICJtIl0KfQo= +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvY29tbW9uL2lzLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlcy5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vbGlua2VkTWFwLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9kaXNwb3NhYmxlLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9yYWwuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvY29tbW9uL2V2ZW50cy5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vY2FuY2VsbGF0aW9uLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9zaGFyZWRBcnJheUNhbmNlbGxhdGlvbi5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vc2VtYXBob3JlLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlUmVhZGVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlV3JpdGVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlQnVmZmVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9jb25uZWN0aW9uLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9hcGkuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvYnJvd3Nlci9yaWwuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvYnJvd3Nlci9tYWluLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvYnJvd3Nlci5qcyIsICJsc3AvamF2YS1sc3AtY2xpZW50LnRzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLXdzLWpzb25ycGMvc3JjL2Rpc3Bvc2FibGUudHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvc29ja2V0L3NvY2tldC50cyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS13cy1qc29ucnBjL3NyYy9zb2NrZXQvcmVhZGVyLnRzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLXdzLWpzb25ycGMvc3JjL3NvY2tldC93cml0ZXIudHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvc29ja2V0L2Nvbm5lY3Rpb24udHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvY29ubmVjdGlvbi50cyIsICJsc3AvbW9uYWNvLXNoaW0udHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtbGFuZ3VhZ2VzZXJ2ZXItdHlwZXMvbGliL2VzbS9tYWluLmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuc3RyaW5nQXJyYXkgPSBleHBvcnRzLmFycmF5ID0gZXhwb3J0cy5mdW5jID0gZXhwb3J0cy5lcnJvciA9IGV4cG9ydHMubnVtYmVyID0gZXhwb3J0cy5zdHJpbmcgPSBleHBvcnRzLmJvb2xlYW4gPSB2b2lkIDA7XG5mdW5jdGlvbiBib29sZWFuKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZTtcbn1cbmV4cG9ydHMuYm9vbGVhbiA9IGJvb2xlYW47XG5mdW5jdGlvbiBzdHJpbmcodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZztcbn1cbmV4cG9ydHMuc3RyaW5nID0gc3RyaW5nO1xuZnVuY3Rpb24gbnVtYmVyKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdmFsdWUgaW5zdGFuY2VvZiBOdW1iZXI7XG59XG5leHBvcnRzLm51bWJlciA9IG51bWJlcjtcbmZ1bmN0aW9uIGVycm9yKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgRXJyb3I7XG59XG5leHBvcnRzLmVycm9yID0gZXJyb3I7XG5mdW5jdGlvbiBmdW5jKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cbmV4cG9ydHMuZnVuYyA9IGZ1bmM7XG5mdW5jdGlvbiBhcnJheSh2YWx1ZSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cbmV4cG9ydHMuYXJyYXkgPSBhcnJheTtcbmZ1bmN0aW9uIHN0cmluZ0FycmF5KHZhbHVlKSB7XG4gICAgcmV0dXJuIGFycmF5KHZhbHVlKSAmJiB2YWx1ZS5ldmVyeShlbGVtID0+IHN0cmluZyhlbGVtKSk7XG59XG5leHBvcnRzLnN0cmluZ0FycmF5ID0gc3RyaW5nQXJyYXk7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLk1lc3NhZ2UgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU5ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlOCA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTcgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU2ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNSA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTQgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUzID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMiA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTEgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUwID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTkgPSBleHBvcnRzLlJlcXVlc3RUeXBlOCA9IGV4cG9ydHMuUmVxdWVzdFR5cGU3ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTYgPSBleHBvcnRzLlJlcXVlc3RUeXBlNSA9IGV4cG9ydHMuUmVxdWVzdFR5cGU0ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTMgPSBleHBvcnRzLlJlcXVlc3RUeXBlMiA9IGV4cG9ydHMuUmVxdWVzdFR5cGUxID0gZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IGV4cG9ydHMuUmVxdWVzdFR5cGUwID0gZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUgPSBleHBvcnRzLlBhcmFtZXRlclN0cnVjdHVyZXMgPSBleHBvcnRzLlJlc3BvbnNlRXJyb3IgPSBleHBvcnRzLkVycm9yQ29kZXMgPSB2b2lkIDA7XG5jb25zdCBpcyA9IHJlcXVpcmUoXCIuL2lzXCIpO1xuLyoqXG4gKiBQcmVkZWZpbmVkIGVycm9yIGNvZGVzLlxuICovXG52YXIgRXJyb3JDb2RlcztcbihmdW5jdGlvbiAoRXJyb3JDb2Rlcykge1xuICAgIC8vIERlZmluZWQgYnkgSlNPTiBSUENcbiAgICBFcnJvckNvZGVzLlBhcnNlRXJyb3IgPSAtMzI3MDA7XG4gICAgRXJyb3JDb2Rlcy5JbnZhbGlkUmVxdWVzdCA9IC0zMjYwMDtcbiAgICBFcnJvckNvZGVzLk1ldGhvZE5vdEZvdW5kID0gLTMyNjAxO1xuICAgIEVycm9yQ29kZXMuSW52YWxpZFBhcmFtcyA9IC0zMjYwMjtcbiAgICBFcnJvckNvZGVzLkludGVybmFsRXJyb3IgPSAtMzI2MDM7XG4gICAgLyoqXG4gICAgICogVGhpcyBpcyB0aGUgc3RhcnQgcmFuZ2Ugb2YgSlNPTiBSUEMgcmVzZXJ2ZWQgZXJyb3IgY29kZXMuXG4gICAgICogSXQgZG9lc24ndCBkZW5vdGUgYSByZWFsIGVycm9yIGNvZGUuIE5vIGFwcGxpY2F0aW9uIGVycm9yIGNvZGVzIHNob3VsZFxuICAgICAqIGJlIGRlZmluZWQgYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCByYW5nZS4gRm9yIGJhY2t3YXJkc1xuICAgICAqIGNvbXBhdGliaWxpdHkgdGhlIGBTZXJ2ZXJOb3RJbml0aWFsaXplZGAgYW5kIHRoZSBgVW5rbm93bkVycm9yQ29kZWBcbiAgICAgKiBhcmUgbGVmdCBpbiB0aGUgcmFuZ2UuXG4gICAgICpcbiAgICAgKiBAc2luY2UgMy4xNi4wXG4gICAgKi9cbiAgICBFcnJvckNvZGVzLmpzb25ycGNSZXNlcnZlZEVycm9yUmFuZ2VTdGFydCA9IC0zMjA5OTtcbiAgICAvKiogQGRlcHJlY2F0ZWQgdXNlICBqc29ucnBjUmVzZXJ2ZWRFcnJvclJhbmdlU3RhcnQgKi9cbiAgICBFcnJvckNvZGVzLnNlcnZlckVycm9yU3RhcnQgPSAtMzIwOTk7XG4gICAgLyoqXG4gICAgICogQW4gZXJyb3Igb2NjdXJyZWQgd2hlbiB3cml0ZSBhIG1lc3NhZ2UgdG8gdGhlIHRyYW5zcG9ydCBsYXllci5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLk1lc3NhZ2VXcml0ZUVycm9yID0gLTMyMDk5O1xuICAgIC8qKlxuICAgICAqIEFuIGVycm9yIG9jY3VycmVkIHdoZW4gcmVhZGluZyBhIG1lc3NhZ2UgZnJvbSB0aGUgdHJhbnNwb3J0IGxheWVyLlxuICAgICAqL1xuICAgIEVycm9yQ29kZXMuTWVzc2FnZVJlYWRFcnJvciA9IC0zMjA5ODtcbiAgICAvKipcbiAgICAgKiBUaGUgY29ubmVjdGlvbiBnb3QgZGlzcG9zZWQgb3IgbG9zdCBhbmQgYWxsIHBlbmRpbmcgcmVzcG9uc2VzIGdvdFxuICAgICAqIHJlamVjdGVkLlxuICAgICAqL1xuICAgIEVycm9yQ29kZXMuUGVuZGluZ1Jlc3BvbnNlUmVqZWN0ZWQgPSAtMzIwOTc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gaXMgaW5hY3RpdmUgYW5kIGEgdXNlIG9mIGl0IGZhaWxlZC5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLkNvbm5lY3Rpb25JbmFjdGl2ZSA9IC0zMjA5NjtcbiAgICAvKipcbiAgICAgKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBhIHNlcnZlciByZWNlaXZlZCBhIG5vdGlmaWNhdGlvbiBvclxuICAgICAqIHJlcXVlc3QgYmVmb3JlIHRoZSBzZXJ2ZXIgaGFzIHJlY2VpdmVkIHRoZSBgaW5pdGlhbGl6ZWAgcmVxdWVzdC5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLlNlcnZlck5vdEluaXRpYWxpemVkID0gLTMyMDAyO1xuICAgIEVycm9yQ29kZXMuVW5rbm93bkVycm9yQ29kZSA9IC0zMjAwMTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIHRoZSBlbmQgcmFuZ2Ugb2YgSlNPTiBSUEMgcmVzZXJ2ZWQgZXJyb3IgY29kZXMuXG4gICAgICogSXQgZG9lc24ndCBkZW5vdGUgYSByZWFsIGVycm9yIGNvZGUuXG4gICAgICpcbiAgICAgKiBAc2luY2UgMy4xNi4wXG4gICAgKi9cbiAgICBFcnJvckNvZGVzLmpzb25ycGNSZXNlcnZlZEVycm9yUmFuZ2VFbmQgPSAtMzIwMDA7XG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSAganNvbnJwY1Jlc2VydmVkRXJyb3JSYW5nZUVuZCAqL1xuICAgIEVycm9yQ29kZXMuc2VydmVyRXJyb3JFbmQgPSAtMzIwMDA7XG59KShFcnJvckNvZGVzIHx8IChleHBvcnRzLkVycm9yQ29kZXMgPSBFcnJvckNvZGVzID0ge30pKTtcbi8qKlxuICogQW4gZXJyb3Igb2JqZWN0IHJldHVybiBpbiBhIHJlc3BvbnNlIGluIGNhc2UgYSByZXF1ZXN0XG4gKiBoYXMgZmFpbGVkLlxuICovXG5jbGFzcyBSZXNwb25zZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNvZGUsIG1lc3NhZ2UsIGRhdGEpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuY29kZSA9IGlzLm51bWJlcihjb2RlKSA/IGNvZGUgOiBFcnJvckNvZGVzLlVua25vd25FcnJvckNvZGU7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBSZXNwb25zZUVycm9yLnByb3RvdHlwZSk7XG4gICAgfVxuICAgIHRvSnNvbigpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgY29kZTogdGhpcy5jb2RlLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLmRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmRhdGEgPSB0aGlzLmRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5leHBvcnRzLlJlc3BvbnNlRXJyb3IgPSBSZXNwb25zZUVycm9yO1xuY2xhc3MgUGFyYW1ldGVyU3RydWN0dXJlcyB7XG4gICAgY29uc3RydWN0b3Ioa2luZCkge1xuICAgICAgICB0aGlzLmtpbmQgPSBraW5kO1xuICAgIH1cbiAgICBzdGF0aWMgaXModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8gfHwgdmFsdWUgPT09IFBhcmFtZXRlclN0cnVjdHVyZXMuYnlOYW1lIHx8IHZhbHVlID09PSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5UG9zaXRpb247XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5raW5kO1xuICAgIH1cbn1cbmV4cG9ydHMuUGFyYW1ldGVyU3RydWN0dXJlcyA9IFBhcmFtZXRlclN0cnVjdHVyZXM7XG4vKipcbiAqIFRoZSBwYXJhbWV0ZXIgc3RydWN0dXJlIGlzIGF1dG9tYXRpY2FsbHkgaW5mZXJyZWQgb24gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzXG4gKiBhbmQgdGhlIHBhcmFtZXRlciB0eXBlIGluIGNhc2Ugb2YgYSBzaW5nbGUgcGFyYW0uXG4gKi9cblBhcmFtZXRlclN0cnVjdHVyZXMuYXV0byA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdhdXRvJyk7XG4vKipcbiAqIEZvcmNlcyBgYnlQb3NpdGlvbmAgcGFyYW1ldGVyIHN0cnVjdHVyZS4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGhhdmUgYSBzaW5nbGVcbiAqIHBhcmFtZXRlciB3aGljaCBoYXMgYSBsaXRlcmFsIHR5cGUuXG4gKi9cblBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbiA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdieVBvc2l0aW9uJyk7XG4vKipcbiAqIEZvcmNlcyBgYnlOYW1lYCBwYXJhbWV0ZXIgc3RydWN0dXJlLiBUaGlzIGlzIG9ubHkgdXNlZnVsIHdoZW4gaGF2aW5nIGEgc2luZ2xlXG4gKiBwYXJhbWV0ZXIuIFRoZSBsaWJyYXJ5IHdpbGwgcmVwb3J0IGVycm9ycyBpZiB1c2VkIHdpdGggYSBkaWZmZXJlbnQgbnVtYmVyIG9mXG4gKiBwYXJhbWV0ZXJzLlxuICovXG5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdieU5hbWUnKTtcbi8qKlxuICogQW4gYWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgYSBNZXNzYWdlVHlwZS5cbiAqL1xuY2xhc3MgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIG51bWJlck9mUGFyYW1zKSB7XG4gICAgICAgIHRoaXMubWV0aG9kID0gbWV0aG9kO1xuICAgICAgICB0aGlzLm51bWJlck9mUGFyYW1zID0gbnVtYmVyT2ZQYXJhbXM7XG4gICAgfVxuICAgIGdldCBwYXJhbWV0ZXJTdHJ1Y3R1cmVzKCkge1xuICAgICAgICByZXR1cm4gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvO1xuICAgIH1cbn1cbmV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlID0gQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlO1xuLyoqXG4gKiBDbGFzc2VzIHRvIHR5cGUgcmVxdWVzdCByZXNwb25zZSBwYWlyc1xuICovXG5jbGFzcyBSZXF1ZXN0VHlwZTAgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDApO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGUwID0gUmVxdWVzdFR5cGUwO1xuY2xhc3MgUmVxdWVzdFR5cGUgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCwgX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8pIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAxKTtcbiAgICAgICAgdGhpcy5fcGFyYW1ldGVyU3RydWN0dXJlcyA9IF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbiAgICBnZXQgcGFyYW1ldGVyU3RydWN0dXJlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXM7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IFJlcXVlc3RUeXBlO1xuY2xhc3MgUmVxdWVzdFR5cGUxIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMSk7XG4gICAgICAgIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBfcGFyYW1ldGVyU3RydWN0dXJlcztcbiAgICB9XG4gICAgZ2V0IHBhcmFtZXRlclN0cnVjdHVyZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGUxID0gUmVxdWVzdFR5cGUxO1xuY2xhc3MgUmVxdWVzdFR5cGUyIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAyKTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlMiA9IFJlcXVlc3RUeXBlMjtcbmNsYXNzIFJlcXVlc3RUeXBlMyBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMyk7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTMgPSBSZXF1ZXN0VHlwZTM7XG5jbGFzcyBSZXF1ZXN0VHlwZTQgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDQpO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGU0ID0gUmVxdWVzdFR5cGU0O1xuY2xhc3MgUmVxdWVzdFR5cGU1IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA1KTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlNSA9IFJlcXVlc3RUeXBlNTtcbmNsYXNzIFJlcXVlc3RUeXBlNiBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNik7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTYgPSBSZXF1ZXN0VHlwZTY7XG5jbGFzcyBSZXF1ZXN0VHlwZTcgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDcpO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGU3ID0gUmVxdWVzdFR5cGU3O1xuY2xhc3MgUmVxdWVzdFR5cGU4IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA4KTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlOCA9IFJlcXVlc3RUeXBlODtcbmNsYXNzIFJlcXVlc3RUeXBlOSBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgOSk7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTkgPSBSZXF1ZXN0VHlwZTk7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMSk7XG4gICAgICAgIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBfcGFyYW1ldGVyU3RydWN0dXJlcztcbiAgICB9XG4gICAgZ2V0IHBhcmFtZXRlclN0cnVjdHVyZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZSA9IE5vdGlmaWNhdGlvblR5cGU7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlMCBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMCk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMCA9IE5vdGlmaWNhdGlvblR5cGUwO1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTEgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCwgX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8pIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAxKTtcbiAgICAgICAgdGhpcy5fcGFyYW1ldGVyU3RydWN0dXJlcyA9IF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbiAgICBnZXQgcGFyYW1ldGVyU3RydWN0dXJlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXM7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMSA9IE5vdGlmaWNhdGlvblR5cGUxO1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDIpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTIgPSBOb3RpZmljYXRpb25UeXBlMjtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGUzIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAzKTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGUzID0gTm90aWZpY2F0aW9uVHlwZTM7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlNCBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNCk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNCA9IE5vdGlmaWNhdGlvblR5cGU0O1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTUgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDUpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTUgPSBOb3RpZmljYXRpb25UeXBlNTtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGU2IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA2KTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGU2ID0gTm90aWZpY2F0aW9uVHlwZTY7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlNyBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNyk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNyA9IE5vdGlmaWNhdGlvblR5cGU3O1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTggZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDgpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTggPSBOb3RpZmljYXRpb25UeXBlODtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGU5IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA5KTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGU5ID0gTm90aWZpY2F0aW9uVHlwZTk7XG52YXIgTWVzc2FnZTtcbihmdW5jdGlvbiAoTWVzc2FnZSkge1xuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoZSBnaXZlbiBtZXNzYWdlIGlzIGEgcmVxdWVzdCBtZXNzYWdlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gbWVzc2FnZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBpcy5zdHJpbmcoY2FuZGlkYXRlLm1ldGhvZCkgJiYgKGlzLnN0cmluZyhjYW5kaWRhdGUuaWQpIHx8IGlzLm51bWJlcihjYW5kaWRhdGUuaWQpKTtcbiAgICB9XG4gICAgTWVzc2FnZS5pc1JlcXVlc3QgPSBpc1JlcXVlc3Q7XG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhlIGdpdmVuIG1lc3NhZ2UgaXMgYSBub3RpZmljYXRpb24gbWVzc2FnZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTm90aWZpY2F0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gbWVzc2FnZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBpcy5zdHJpbmcoY2FuZGlkYXRlLm1ldGhvZCkgJiYgbWVzc2FnZS5pZCA9PT0gdm9pZCAwO1xuICAgIH1cbiAgICBNZXNzYWdlLmlzTm90aWZpY2F0aW9uID0gaXNOb3RpZmljYXRpb247XG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhlIGdpdmVuIG1lc3NhZ2UgaXMgYSByZXNwb25zZSBtZXNzYWdlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNSZXNwb25zZShtZXNzYWdlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IG1lc3NhZ2U7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgKGNhbmRpZGF0ZS5yZXN1bHQgIT09IHZvaWQgMCB8fCAhIWNhbmRpZGF0ZS5lcnJvcikgJiYgKGlzLnN0cmluZyhjYW5kaWRhdGUuaWQpIHx8IGlzLm51bWJlcihjYW5kaWRhdGUuaWQpIHx8IGNhbmRpZGF0ZS5pZCA9PT0gbnVsbCk7XG4gICAgfVxuICAgIE1lc3NhZ2UuaXNSZXNwb25zZSA9IGlzUmVzcG9uc2U7XG59KShNZXNzYWdlIHx8IChleHBvcnRzLk1lc3NhZ2UgPSBNZXNzYWdlID0ge30pKTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xudmFyIF9hO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5MUlVDYWNoZSA9IGV4cG9ydHMuTGlua2VkTWFwID0gZXhwb3J0cy5Ub3VjaCA9IHZvaWQgMDtcbnZhciBUb3VjaDtcbihmdW5jdGlvbiAoVG91Y2gpIHtcbiAgICBUb3VjaC5Ob25lID0gMDtcbiAgICBUb3VjaC5GaXJzdCA9IDE7XG4gICAgVG91Y2guQXNPbGQgPSBUb3VjaC5GaXJzdDtcbiAgICBUb3VjaC5MYXN0ID0gMjtcbiAgICBUb3VjaC5Bc05ldyA9IFRvdWNoLkxhc3Q7XG59KShUb3VjaCB8fCAoZXhwb3J0cy5Ub3VjaCA9IFRvdWNoID0ge30pKTtcbmNsYXNzIExpbmtlZE1hcCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXNbX2FdID0gJ0xpbmtlZE1hcCc7XG4gICAgICAgIHRoaXMuX21hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5faGVhZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fdGFpbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IDA7XG4gICAgICAgIHRoaXMuX3N0YXRlID0gMDtcbiAgICB9XG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuX21hcC5jbGVhcigpO1xuICAgICAgICB0aGlzLl9oZWFkID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl90YWlsID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9zaXplID0gMDtcbiAgICAgICAgdGhpcy5fc3RhdGUrKztcbiAgICB9XG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLl9oZWFkICYmICF0aGlzLl90YWlsO1xuICAgIH1cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpemU7XG4gICAgfVxuICAgIGdldCBmaXJzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlYWQ/LnZhbHVlO1xuICAgIH1cbiAgICBnZXQgbGFzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhaWw/LnZhbHVlO1xuICAgIH1cbiAgICBoYXMoa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXAuaGFzKGtleSk7XG4gICAgfVxuICAgIGdldChrZXksIHRvdWNoID0gVG91Y2guTm9uZSkge1xuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5fbWFwLmdldChrZXkpO1xuICAgICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRvdWNoICE9PSBUb3VjaC5Ob25lKSB7XG4gICAgICAgICAgICB0aGlzLnRvdWNoKGl0ZW0sIHRvdWNoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICB9XG4gICAgc2V0KGtleSwgdmFsdWUsIHRvdWNoID0gVG91Y2guTm9uZSkge1xuICAgICAgICBsZXQgaXRlbSA9IHRoaXMuX21hcC5nZXQoa2V5KTtcbiAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgIGl0ZW0udmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIGlmICh0b3VjaCAhPT0gVG91Y2guTm9uZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudG91Y2goaXRlbSwgdG91Y2gpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaXRlbSA9IHsga2V5LCB2YWx1ZSwgbmV4dDogdW5kZWZpbmVkLCBwcmV2aW91czogdW5kZWZpbmVkIH07XG4gICAgICAgICAgICBzd2l0Y2ggKHRvdWNoKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBUb3VjaC5Ob25lOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFRvdWNoLkZpcnN0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1GaXJzdChpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBUb3VjaC5MYXN0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX21hcC5zZXQoa2V5LCBpdGVtKTtcbiAgICAgICAgICAgIHRoaXMuX3NpemUrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGVsZXRlKGtleSkge1xuICAgICAgICByZXR1cm4gISF0aGlzLnJlbW92ZShrZXkpO1xuICAgIH1cbiAgICByZW1vdmUoa2V5KSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl9tYXAuZ2V0KGtleSk7XG4gICAgICAgIGlmICghaXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tYXAuZGVsZXRlKGtleSk7XG4gICAgICAgIHRoaXMucmVtb3ZlSXRlbShpdGVtKTtcbiAgICAgICAgdGhpcy5fc2l6ZS0tO1xuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICB9XG4gICAgc2hpZnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5faGVhZCAmJiAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2hlYWQgfHwgIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIHRoaXMuX21hcC5kZWxldGUoaXRlbS5rZXkpO1xuICAgICAgICB0aGlzLnJlbW92ZUl0ZW0oaXRlbSk7XG4gICAgICAgIHRoaXMuX3NpemUtLTtcbiAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7XG4gICAgfVxuICAgIGZvckVhY2goY2FsbGJhY2tmbiwgdGhpc0FyZykge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3N0YXRlO1xuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICAgICAgICBpZiAodGhpc0FyZykge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrZm4uYmluZCh0aGlzQXJnKShjdXJyZW50LnZhbHVlLCBjdXJyZW50LmtleSwgdGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFja2ZuKGN1cnJlbnQudmFsdWUsIGN1cnJlbnQua2V5LCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gc3RhdGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExpbmtlZE1hcCBnb3QgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAga2V5cygpIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9zdGF0ZTtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLl9oZWFkO1xuICAgICAgICBjb25zdCBpdGVyYXRvciA9IHtcbiAgICAgICAgICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fc3RhdGUgIT09IHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTGlua2VkTWFwIGdvdCBtb2RpZmllZCBkdXJpbmcgaXRlcmF0aW9uLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7IHZhbHVlOiBjdXJyZW50LmtleSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICB9XG4gICAgdmFsdWVzKCkge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3N0YXRlO1xuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIGNvbnN0IGl0ZXJhdG9yID0ge1xuICAgICAgICAgICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlcmF0b3I7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBMaW5rZWRNYXAgZ290IG1vZGlmaWVkIGR1cmluZyBpdGVyYXRpb24uYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHsgdmFsdWU6IGN1cnJlbnQudmFsdWUsIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gaXRlcmF0b3I7XG4gICAgfVxuICAgIGVudHJpZXMoKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5fc3RhdGU7XG4gICAgICAgIGxldCBjdXJyZW50ID0gdGhpcy5faGVhZDtcbiAgICAgICAgY29uc3QgaXRlcmF0b3IgPSB7XG4gICAgICAgICAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3N0YXRlICE9PSBzdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExpbmtlZE1hcCBnb3QgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geyB2YWx1ZTogW2N1cnJlbnQua2V5LCBjdXJyZW50LnZhbHVlXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICB9XG4gICAgWyhfYSA9IFN5bWJvbC50b1N0cmluZ1RhZywgU3ltYm9sLml0ZXJhdG9yKV0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMoKTtcbiAgICB9XG4gICAgdHJpbU9sZChuZXdTaXplKSB7XG4gICAgICAgIGlmIChuZXdTaXplID49IHRoaXMuc2l6ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuZXdTaXplID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLl9oZWFkO1xuICAgICAgICBsZXQgY3VycmVudFNpemUgPSB0aGlzLnNpemU7XG4gICAgICAgIHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnRTaXplID4gbmV3U2l6ZSkge1xuICAgICAgICAgICAgdGhpcy5fbWFwLmRlbGV0ZShjdXJyZW50LmtleSk7XG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0O1xuICAgICAgICAgICAgY3VycmVudFNpemUtLTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9oZWFkID0gY3VycmVudDtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IGN1cnJlbnRTaXplO1xuICAgICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICAgICAgY3VycmVudC5wcmV2aW91cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgIH1cbiAgICBhZGRJdGVtRmlyc3QoaXRlbSkge1xuICAgICAgICAvLyBGaXJzdCB0aW1lIEluc2VydFxuICAgICAgICBpZiAoIXRoaXMuX2hlYWQgJiYgIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRoaXMuX3RhaWwgPSBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCF0aGlzLl9oZWFkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbGlzdCcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdGhpcy5faGVhZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQucHJldmlvdXMgPSBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2hlYWQgPSBpdGVtO1xuICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgIH1cbiAgICBhZGRJdGVtTGFzdChpdGVtKSB7XG4gICAgICAgIC8vIEZpcnN0IHRpbWUgSW5zZXJ0XG4gICAgICAgIGlmICghdGhpcy5faGVhZCAmJiAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgdGhpcy5faGVhZCA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpdGVtLnByZXZpb3VzID0gdGhpcy5fdGFpbDtcbiAgICAgICAgICAgIHRoaXMuX3RhaWwubmV4dCA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW07XG4gICAgICAgIHRoaXMuX3N0YXRlKys7XG4gICAgfVxuICAgIHJlbW92ZUl0ZW0oaXRlbSkge1xuICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCAmJiBpdGVtID09PSB0aGlzLl90YWlsKSB7XG4gICAgICAgICAgICB0aGlzLl9oZWFkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpdGVtID09PSB0aGlzLl9oZWFkKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGNhbiBvbmx5IGhhcHBlbmVkIGlmIHNpemUgPT09IDEgd2hpY2ggaXMgaGFuZGxlXG4gICAgICAgICAgICAvLyBieSB0aGUgY2FzZSBhYm92ZS5cbiAgICAgICAgICAgIGlmICghaXRlbS5uZXh0KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxpc3QnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGl0ZW0ubmV4dC5wcmV2aW91cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQgPSBpdGVtLm5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXRlbSA9PT0gdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgLy8gVGhpcyBjYW4gb25seSBoYXBwZW5lZCBpZiBzaXplID09PSAxIHdoaWNoIGlzIGhhbmRsZVxuICAgICAgICAgICAgLy8gYnkgdGhlIGNhc2UgYWJvdmUuXG4gICAgICAgICAgICBpZiAoIWl0ZW0ucHJldmlvdXMpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbGlzdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbS5wcmV2aW91cy5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gaXRlbS5uZXh0O1xuICAgICAgICAgICAgY29uc3QgcHJldmlvdXMgPSBpdGVtLnByZXZpb3VzO1xuICAgICAgICAgICAgaWYgKCFuZXh0IHx8ICFwcmV2aW91cykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXh0LnByZXZpb3VzID0gcHJldmlvdXM7XG4gICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gbmV4dDtcbiAgICAgICAgfVxuICAgICAgICBpdGVtLm5leHQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGl0ZW0ucHJldmlvdXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX3N0YXRlKys7XG4gICAgfVxuICAgIHRvdWNoKGl0ZW0sIHRvdWNoKSB7XG4gICAgICAgIGlmICghdGhpcy5faGVhZCB8fCAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxpc3QnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHRvdWNoICE9PSBUb3VjaC5GaXJzdCAmJiB0b3VjaCAhPT0gVG91Y2guTGFzdCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG91Y2ggPT09IFRvdWNoLkZpcnN0KSB7XG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBpdGVtLm5leHQ7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgICAgICAvLyBVbmxpbmsgdGhlIGl0ZW1cbiAgICAgICAgICAgIGlmIChpdGVtID09PSB0aGlzLl90YWlsKSB7XG4gICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgbXVzdCBiZSBkZWZpbmVkIHNpbmNlIGl0ZW0gd2FzIG5vdCBoZWFkIGJ1dCBpcyB0YWlsXG4gICAgICAgICAgICAgICAgLy8gU28gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbiBpdGVtIGluIHRoZSBtYXBcbiAgICAgICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuX3RhaWwgPSBwcmV2aW91cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEJvdGggbmV4dCBhbmQgcHJldmlvdXMgYXJlIG5vdCB1bmRlZmluZWQgc2luY2UgaXRlbSB3YXMgbmVpdGhlciBoZWFkIG5vciB0YWlsLlxuICAgICAgICAgICAgICAgIG5leHQucHJldmlvdXMgPSBwcmV2aW91cztcbiAgICAgICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEluc2VydCB0aGUgbm9kZSBhdCBoZWFkXG4gICAgICAgICAgICBpdGVtLnByZXZpb3VzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdGhpcy5faGVhZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQucHJldmlvdXMgPSBpdGVtO1xuICAgICAgICAgICAgdGhpcy5faGVhZCA9IGl0ZW07XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRvdWNoID09PSBUb3VjaC5MYXN0KSB7XG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBpdGVtLm5leHQ7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgICAgICAvLyBVbmxpbmsgdGhlIGl0ZW0uXG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCkge1xuICAgICAgICAgICAgICAgIC8vIG5leHQgbXVzdCBiZSBkZWZpbmVkIHNpbmNlIGl0ZW0gd2FzIG5vdCB0YWlsIGJ1dCBpcyBoZWFkXG4gICAgICAgICAgICAgICAgLy8gU28gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbiBpdGVtIGluIHRoZSBtYXBcbiAgICAgICAgICAgICAgICBuZXh0LnByZXZpb3VzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuX2hlYWQgPSBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQm90aCBuZXh0IGFuZCBwcmV2aW91cyBhcmUgbm90IHVuZGVmaW5lZCBzaW5jZSBpdGVtIHdhcyBuZWl0aGVyIGhlYWQgbm9yIHRhaWwuXG4gICAgICAgICAgICAgICAgbmV4dC5wcmV2aW91cyA9IHByZXZpb3VzO1xuICAgICAgICAgICAgICAgIHByZXZpb3VzLm5leHQgPSBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaXRlbS5wcmV2aW91cyA9IHRoaXMuX3RhaWw7XG4gICAgICAgICAgICB0aGlzLl90YWlsLm5leHQgPSBpdGVtO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW07XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IFtdO1xuICAgICAgICB0aGlzLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGRhdGEucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGZyb21KU09OKGRhdGEpIHtcbiAgICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBkYXRhKSB7XG4gICAgICAgICAgICB0aGlzLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuTGlua2VkTWFwID0gTGlua2VkTWFwO1xuY2xhc3MgTFJVQ2FjaGUgZXh0ZW5kcyBMaW5rZWRNYXAge1xuICAgIGNvbnN0cnVjdG9yKGxpbWl0LCByYXRpbyA9IDEpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fbGltaXQgPSBsaW1pdDtcbiAgICAgICAgdGhpcy5fcmF0aW8gPSBNYXRoLm1pbihNYXRoLm1heCgwLCByYXRpbyksIDEpO1xuICAgIH1cbiAgICBnZXQgbGltaXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9saW1pdDtcbiAgICB9XG4gICAgc2V0IGxpbWl0KGxpbWl0KSB7XG4gICAgICAgIHRoaXMuX2xpbWl0ID0gbGltaXQ7XG4gICAgICAgIHRoaXMuY2hlY2tUcmltKCk7XG4gICAgfVxuICAgIGdldCByYXRpbygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JhdGlvO1xuICAgIH1cbiAgICBzZXQgcmF0aW8ocmF0aW8pIHtcbiAgICAgICAgdGhpcy5fcmF0aW8gPSBNYXRoLm1pbihNYXRoLm1heCgwLCByYXRpbyksIDEpO1xuICAgICAgICB0aGlzLmNoZWNrVHJpbSgpO1xuICAgIH1cbiAgICBnZXQoa2V5LCB0b3VjaCA9IFRvdWNoLkFzTmV3KSB7XG4gICAgICAgIHJldHVybiBzdXBlci5nZXQoa2V5LCB0b3VjaCk7XG4gICAgfVxuICAgIHBlZWsoa2V5KSB7XG4gICAgICAgIHJldHVybiBzdXBlci5nZXQoa2V5LCBUb3VjaC5Ob25lKTtcbiAgICB9XG4gICAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgc3VwZXIuc2V0KGtleSwgdmFsdWUsIFRvdWNoLkxhc3QpO1xuICAgICAgICB0aGlzLmNoZWNrVHJpbSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgY2hlY2tUcmltKCkge1xuICAgICAgICBpZiAodGhpcy5zaXplID4gdGhpcy5fbGltaXQpIHtcbiAgICAgICAgICAgIHRoaXMudHJpbU9sZChNYXRoLnJvdW5kKHRoaXMuX2xpbWl0ICogdGhpcy5fcmF0aW8pKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuTFJVQ2FjaGUgPSBMUlVDYWNoZTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5EaXNwb3NhYmxlID0gdm9pZCAwO1xudmFyIERpc3Bvc2FibGU7XG4oZnVuY3Rpb24gKERpc3Bvc2FibGUpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUoZnVuYykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGlzcG9zZTogZnVuY1xuICAgICAgICB9O1xuICAgIH1cbiAgICBEaXNwb3NhYmxlLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKERpc3Bvc2FibGUgfHwgKGV4cG9ydHMuRGlzcG9zYWJsZSA9IERpc3Bvc2FibGUgPSB7fSkpO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xubGV0IF9yYWw7XG5mdW5jdGlvbiBSQUwoKSB7XG4gICAgaWYgKF9yYWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHJ1bnRpbWUgYWJzdHJhY3Rpb24gbGF5ZXIgaW5zdGFsbGVkYCk7XG4gICAgfVxuICAgIHJldHVybiBfcmFsO1xufVxuKGZ1bmN0aW9uIChSQUwpIHtcbiAgICBmdW5jdGlvbiBpbnN0YWxsKHJhbCkge1xuICAgICAgICBpZiAocmFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gcnVudGltZSBhYnN0cmFjdGlvbiBsYXllciBwcm92aWRlZGApO1xuICAgICAgICB9XG4gICAgICAgIF9yYWwgPSByYWw7XG4gICAgfVxuICAgIFJBTC5pbnN0YWxsID0gaW5zdGFsbDtcbn0pKFJBTCB8fCAoUkFMID0ge30pKTtcbmV4cG9ydHMuZGVmYXVsdCA9IFJBTDtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuRW1pdHRlciA9IGV4cG9ydHMuRXZlbnQgPSB2b2lkIDA7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbnZhciBFdmVudDtcbihmdW5jdGlvbiAoRXZlbnQpIHtcbiAgICBjb25zdCBfZGlzcG9zYWJsZSA9IHsgZGlzcG9zZSgpIHsgfSB9O1xuICAgIEV2ZW50Lk5vbmUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBfZGlzcG9zYWJsZTsgfTtcbn0pKEV2ZW50IHx8IChleHBvcnRzLkV2ZW50ID0gRXZlbnQgPSB7fSkpO1xuY2xhc3MgQ2FsbGJhY2tMaXN0IHtcbiAgICBhZGQoY2FsbGJhY2ssIGNvbnRleHQgPSBudWxsLCBidWNrZXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fY29udGV4dHMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgICAgIHRoaXMuX2NvbnRleHRzLnB1c2goY29udGV4dCk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGJ1Y2tldCkpIHtcbiAgICAgICAgICAgIGJ1Y2tldC5wdXNoKHsgZGlzcG9zZTogKCkgPT4gdGhpcy5yZW1vdmUoY2FsbGJhY2ssIGNvbnRleHQpIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlbW92ZShjYWxsYmFjaywgY29udGV4dCA9IG51bGwpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZm91bmRDYWxsYmFja1dpdGhEaWZmZXJlbnRDb250ZXh0ID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLl9jYWxsYmFja3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jYWxsYmFja3NbaV0gPT09IGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NvbnRleHRzW2ldID09PSBjb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrICYgY29udGV4dCBtYXRjaCA9PiByZW1vdmUgaXRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29udGV4dHMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZENhbGxiYWNrV2l0aERpZmZlcmVudENvbnRleHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZm91bmRDYWxsYmFja1dpdGhEaWZmZXJlbnRDb250ZXh0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1doZW4gYWRkaW5nIGEgbGlzdGVuZXIgd2l0aCBhIGNvbnRleHQsIHlvdSBzaG91bGQgcmVtb3ZlIGl0IHdpdGggdGhlIHNhbWUgY29udGV4dCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGludm9rZSguLi5hcmdzKSB7XG4gICAgICAgIGlmICghdGhpcy5fY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmV0ID0gW10sIGNhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcy5zbGljZSgwKSwgY29udGV4dHMgPSB0aGlzLl9jb250ZXh0cy5zbGljZSgwKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXQucHVzaChjYWxsYmFja3NbaV0uYXBwbHkoY29udGV4dHNbaV0sIGFyZ3MpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS5jb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICAgIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5fY2FsbGJhY2tzIHx8IHRoaXMuX2NhbGxiYWNrcy5sZW5ndGggPT09IDA7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fY29udGV4dHMgPSB1bmRlZmluZWQ7XG4gICAgfVxufVxuY2xhc3MgRW1pdHRlciB7XG4gICAgY29uc3RydWN0b3IoX29wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IF9vcHRpb25zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGb3IgdGhlIHB1YmxpYyB0byBhbGxvdyB0byBzdWJzY3JpYmVcbiAgICAgKiB0byBldmVudHMgZnJvbSB0aGlzIEVtaXR0ZXJcbiAgICAgKi9cbiAgICBnZXQgZXZlbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fZXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50ID0gKGxpc3RlbmVyLCB0aGlzQXJncywgZGlzcG9zYWJsZXMpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2NhbGxiYWNrcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWxsYmFja3MgPSBuZXcgQ2FsbGJhY2tMaXN0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMub25GaXJzdExpc3RlbmVyQWRkICYmIHRoaXMuX2NhbGxiYWNrcy5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy5vbkZpcnN0TGlzdGVuZXJBZGQodGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5hZGQobGlzdGVuZXIsIHRoaXNBcmdzKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlzcG9zYWJsZSBpcyBkaXNwb3NlZCBhZnRlciBlbWl0dGVyIGlzIGRpc3Bvc2VkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5yZW1vdmUobGlzdGVuZXIsIHRoaXNBcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5kaXNwb3NlID0gRW1pdHRlci5fbm9vcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMub25MYXN0TGlzdGVuZXJSZW1vdmUgJiYgdGhpcy5fY2FsbGJhY2tzLmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29wdGlvbnMub25MYXN0TGlzdGVuZXJSZW1vdmUodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRpc3Bvc2FibGVzKSkge1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlcy5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9ldmVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVG8gYmUga2VwdCBwcml2YXRlIHRvIGZpcmUgYW4gZXZlbnQgdG9cbiAgICAgKiBzdWJzY3JpYmVyc1xuICAgICAqL1xuICAgIGZpcmUoZXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NhbGxiYWNrcykge1xuICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzLmludm9rZS5jYWxsKHRoaXMuX2NhbGxiYWNrcywgZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5kaXNwb3NlKCk7XG4gICAgICAgICAgICB0aGlzLl9jYWxsYmFja3MgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLkVtaXR0ZXIgPSBFbWl0dGVyO1xuRW1pdHRlci5fbm9vcCA9IGZ1bmN0aW9uICgpIHsgfTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uVG9rZW4gPSB2b2lkIDA7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbmNvbnN0IElzID0gcmVxdWlyZShcIi4vaXNcIik7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCIuL2V2ZW50c1wiKTtcbnZhciBDYW5jZWxsYXRpb25Ub2tlbjtcbihmdW5jdGlvbiAoQ2FuY2VsbGF0aW9uVG9rZW4pIHtcbiAgICBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGlzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkOiBmYWxzZSxcbiAgICAgICAgb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6IGV2ZW50c18xLkV2ZW50Lk5vbmVcbiAgICB9KTtcbiAgICBDYW5jZWxsYXRpb25Ub2tlbi5DYW5jZWxsZWQgPSBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6IHRydWUsXG4gICAgICAgIG9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkOiBldmVudHNfMS5FdmVudC5Ob25lXG4gICAgfSk7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgKGNhbmRpZGF0ZSA9PT0gQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZVxuICAgICAgICAgICAgfHwgY2FuZGlkYXRlID09PSBDYW5jZWxsYXRpb25Ub2tlbi5DYW5jZWxsZWRcbiAgICAgICAgICAgIHx8IChJcy5ib29sZWFuKGNhbmRpZGF0ZS5pc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkgJiYgISFjYW5kaWRhdGUub25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQpKTtcbiAgICB9XG4gICAgQ2FuY2VsbGF0aW9uVG9rZW4uaXMgPSBpcztcbn0pKENhbmNlbGxhdGlvblRva2VuIHx8IChleHBvcnRzLkNhbmNlbGxhdGlvblRva2VuID0gQ2FuY2VsbGF0aW9uVG9rZW4gPSB7fSkpO1xuY29uc3Qgc2hvcnRjdXRFdmVudCA9IE9iamVjdC5mcmVlemUoZnVuY3Rpb24gKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgY29uc3QgaGFuZGxlID0gKDAsIHJhbF8xLmRlZmF1bHQpKCkudGltZXIuc2V0VGltZW91dChjYWxsYmFjay5iaW5kKGNvbnRleHQpLCAwKTtcbiAgICByZXR1cm4geyBkaXNwb3NlKCkgeyBoYW5kbGUuZGlzcG9zZSgpOyB9IH07XG59KTtcbmNsYXNzIE11dGFibGVUb2tlbiB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX2lzQ2FuY2VsbGVkID0gZmFsc2U7XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9pc0NhbmNlbGxlZCkge1xuICAgICAgICAgICAgdGhpcy5faXNDYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2VtaXR0ZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmZpcmUodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0NhbmNlbGxlZDtcbiAgICB9XG4gICAgZ2V0IG9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKCkge1xuICAgICAgICBpZiAodGhpcy5faXNDYW5jZWxsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBzaG9ydGN1dEV2ZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5fZW1pdHRlcikge1xuICAgICAgICAgICAgdGhpcy5fZW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2VtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLl9lbWl0dGVyKSB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5jbGFzcyBDYW5jZWxsYXRpb25Ub2tlblNvdXJjZSB7XG4gICAgZ2V0IHRva2VuKCkge1xuICAgICAgICBpZiAoIXRoaXMuX3Rva2VuKSB7XG4gICAgICAgICAgICAvLyBiZSBsYXp5IGFuZCBjcmVhdGUgdGhlIHRva2VuIG9ubHkgd2hlblxuICAgICAgICAgICAgLy8gYWN0dWFsbHkgbmVlZGVkXG4gICAgICAgICAgICB0aGlzLl90b2tlbiA9IG5ldyBNdXRhYmxlVG9rZW4oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fdG9rZW47XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl90b2tlbikge1xuICAgICAgICAgICAgLy8gc2F2ZSBhbiBvYmplY3QgYnkgcmV0dXJuaW5nIHRoZSBkZWZhdWx0XG4gICAgICAgICAgICAvLyBjYW5jZWxsZWQgdG9rZW4gd2hlbiBjYW5jZWxsYXRpb24gaGFwcGVuc1xuICAgICAgICAgICAgLy8gYmVmb3JlIHNvbWVvbmUgYXNrcyBmb3IgdGhlIHRva2VuXG4gICAgICAgICAgICB0aGlzLl90b2tlbiA9IENhbmNlbGxhdGlvblRva2VuLkNhbmNlbGxlZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3Rva2VuLmNhbmNlbCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICghdGhpcy5fdG9rZW4pIHtcbiAgICAgICAgICAgIC8vIGVuc3VyZSB0byBpbml0aWFsaXplIHdpdGggYW4gZW1wdHkgdG9rZW4gaWYgd2UgaGFkIG5vbmVcbiAgICAgICAgICAgIHRoaXMuX3Rva2VuID0gQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLl90b2tlbiBpbnN0YW5jZW9mIE11dGFibGVUb2tlbikge1xuICAgICAgICAgICAgLy8gYWN0dWFsbHkgZGlzcG9zZVxuICAgICAgICAgICAgdGhpcy5fdG9rZW4uZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IENhbmNlbGxhdGlvblRva2VuU291cmNlO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3kgPSB2b2lkIDA7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbnZhciBDYW5jZWxsYXRpb25TdGF0ZTtcbihmdW5jdGlvbiAoQ2FuY2VsbGF0aW9uU3RhdGUpIHtcbiAgICBDYW5jZWxsYXRpb25TdGF0ZS5Db250aW51ZSA9IDA7XG4gICAgQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkID0gMTtcbn0pKENhbmNlbGxhdGlvblN0YXRlIHx8IChDYW5jZWxsYXRpb25TdGF0ZSA9IHt9KSk7XG5jbGFzcyBTaGFyZWRBcnJheVNlbmRlclN0cmF0ZWd5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5idWZmZXJzID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICBlbmFibGVDYW5jZWxsYXRpb24ocmVxdWVzdCkge1xuICAgICAgICBpZiAocmVxdWVzdC5pZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBTaGFyZWRBcnJheUJ1ZmZlcig0KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBJbnQzMkFycmF5KGJ1ZmZlciwgMCwgMSk7XG4gICAgICAgIGRhdGFbMF0gPSBDYW5jZWxsYXRpb25TdGF0ZS5Db250aW51ZTtcbiAgICAgICAgdGhpcy5idWZmZXJzLnNldChyZXF1ZXN0LmlkLCBidWZmZXIpO1xuICAgICAgICByZXF1ZXN0LiRjYW5jZWxsYXRpb25EYXRhID0gYnVmZmVyO1xuICAgIH1cbiAgICBhc3luYyBzZW5kQ2FuY2VsbGF0aW9uKF9jb25uLCBpZCkge1xuICAgICAgICBjb25zdCBidWZmZXIgPSB0aGlzLmJ1ZmZlcnMuZ2V0KGlkKTtcbiAgICAgICAgaWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBJbnQzMkFycmF5KGJ1ZmZlciwgMCwgMSk7XG4gICAgICAgIEF0b21pY3Muc3RvcmUoZGF0YSwgMCwgQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkKTtcbiAgICB9XG4gICAgY2xlYW51cChpZCkge1xuICAgICAgICB0aGlzLmJ1ZmZlcnMuZGVsZXRlKGlkKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy5idWZmZXJzLmNsZWFyKCk7XG4gICAgfVxufVxuZXhwb3J0cy5TaGFyZWRBcnJheVNlbmRlclN0cmF0ZWd5ID0gU2hhcmVkQXJyYXlTZW5kZXJTdHJhdGVneTtcbmNsYXNzIFNoYXJlZEFycmF5QnVmZmVyQ2FuY2VsbGF0aW9uVG9rZW4ge1xuICAgIGNvbnN0cnVjdG9yKGJ1ZmZlcikge1xuICAgICAgICB0aGlzLmRhdGEgPSBuZXcgSW50MzJBcnJheShidWZmZXIsIDAsIDEpO1xuICAgIH1cbiAgICBnZXQgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHJldHVybiBBdG9taWNzLmxvYWQodGhpcy5kYXRhLCAwKSA9PT0gQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkO1xuICAgIH1cbiAgICBnZXQgb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuY2VsbGF0aW9uIG92ZXIgU2hhcmVkQXJyYXlCdWZmZXIgZG9lc24ndCBzdXBwb3J0IGNhbmNlbGxhdGlvbiBldmVudHNgKTtcbiAgICB9XG59XG5jbGFzcyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuU291cmNlIHtcbiAgICBjb25zdHJ1Y3RvcihidWZmZXIpIHtcbiAgICAgICAgdGhpcy50b2tlbiA9IG5ldyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuKGJ1ZmZlcik7XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICB9XG59XG5jbGFzcyBTaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmtpbmQgPSAncmVxdWVzdCc7XG4gICAgfVxuICAgIGNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKHJlcXVlc3QpIHtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gcmVxdWVzdC4kY2FuY2VsbGF0aW9uRGF0YTtcbiAgICAgICAgaWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuU291cmNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuU291cmNlKGJ1ZmZlcik7XG4gICAgfVxufVxuZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBTaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3k7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNlbWFwaG9yZSA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY2xhc3MgU2VtYXBob3JlIHtcbiAgICBjb25zdHJ1Y3RvcihjYXBhY2l0eSA9IDEpIHtcbiAgICAgICAgaWYgKGNhcGFjaXR5IDw9IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FwYWNpdHkgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NhcGFjaXR5ID0gY2FwYWNpdHk7XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IDA7XG4gICAgICAgIHRoaXMuX3dhaXRpbmcgPSBbXTtcbiAgICB9XG4gICAgbG9jayh0aHVuaykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fd2FpdGluZy5wdXNoKHsgdGh1bmssIHJlc29sdmUsIHJlamVjdCB9KTtcbiAgICAgICAgICAgIHRoaXMucnVuTmV4dCgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0IGFjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTtcbiAgICB9XG4gICAgcnVuTmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dhaXRpbmcubGVuZ3RoID09PSAwIHx8IHRoaXMuX2FjdGl2ZSA9PT0gdGhpcy5fY2FwYWNpdHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS50aW1lci5zZXRJbW1lZGlhdGUoKCkgPT4gdGhpcy5kb1J1bk5leHQoKSk7XG4gICAgfVxuICAgIGRvUnVuTmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dhaXRpbmcubGVuZ3RoID09PSAwIHx8IHRoaXMuX2FjdGl2ZSA9PT0gdGhpcy5fY2FwYWNpdHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5fd2FpdGluZy5zaGlmdCgpO1xuICAgICAgICB0aGlzLl9hY3RpdmUrKztcbiAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZSA+IHRoaXMuX2NhcGFjaXR5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRvIG1hbnkgdGh1bmtzIGFjdGl2ZWApO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXh0LnRodW5rKCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC50aGVuKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5yZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5OZXh0KCk7XG4gICAgICAgICAgICAgICAgfSwgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5yZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5OZXh0KCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICBuZXh0LnJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1bk5leHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgIG5leHQucmVqZWN0KGVycik7XG4gICAgICAgICAgICB0aGlzLnJ1bk5leHQoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuU2VtYXBob3JlID0gU2VtYXBob3JlO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXIgPSBleHBvcnRzLkFic3RyYWN0TWVzc2FnZVJlYWRlciA9IGV4cG9ydHMuTWVzc2FnZVJlYWRlciA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IGV2ZW50c18xID0gcmVxdWlyZShcIi4vZXZlbnRzXCIpO1xuY29uc3Qgc2VtYXBob3JlXzEgPSByZXF1aXJlKFwiLi9zZW1hcGhvcmVcIik7XG52YXIgTWVzc2FnZVJlYWRlcjtcbihmdW5jdGlvbiAoTWVzc2FnZVJlYWRlcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5saXN0ZW4pICYmIElzLmZ1bmMoY2FuZGlkYXRlLmRpc3Bvc2UpICYmXG4gICAgICAgICAgICBJcy5mdW5jKGNhbmRpZGF0ZS5vbkVycm9yKSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5vbkNsb3NlKSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5vblBhcnRpYWxNZXNzYWdlKTtcbiAgICB9XG4gICAgTWVzc2FnZVJlYWRlci5pcyA9IGlzO1xufSkoTWVzc2FnZVJlYWRlciB8fCAoZXhwb3J0cy5NZXNzYWdlUmVhZGVyID0gTWVzc2FnZVJlYWRlciA9IHt9KSk7XG5jbGFzcyBBYnN0cmFjdE1lc3NhZ2VSZWFkZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZUVtaXR0ZXIgPSBuZXcgZXZlbnRzXzEuRW1pdHRlcigpO1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlci5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgZ2V0IG9uRXJyb3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVycm9yRW1pdHRlci5ldmVudDtcbiAgICB9XG4gICAgZmlyZUVycm9yKGVycm9yKSB7XG4gICAgICAgIHRoaXMuZXJyb3JFbWl0dGVyLmZpcmUodGhpcy5hc0Vycm9yKGVycm9yKSk7XG4gICAgfVxuICAgIGdldCBvbkNsb3NlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9zZUVtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGZpcmVDbG9zZSgpIHtcbiAgICAgICAgdGhpcy5jbG9zZUVtaXR0ZXIuZmlyZSh1bmRlZmluZWQpO1xuICAgIH1cbiAgICBnZXQgb25QYXJ0aWFsTWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFydGlhbE1lc3NhZ2VFbWl0dGVyLmV2ZW50O1xuICAgIH1cbiAgICBmaXJlUGFydGlhbE1lc3NhZ2UoaW5mbykge1xuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlRW1pdHRlci5maXJlKGluZm8pO1xuICAgIH1cbiAgICBhc0Vycm9yKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKGBSZWFkZXIgcmVjZWl2ZWQgZXJyb3IuIFJlYXNvbjogJHtJcy5zdHJpbmcoZXJyb3IubWVzc2FnZSkgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24nfWApO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VSZWFkZXIgPSBBYnN0cmFjdE1lc3NhZ2VSZWFkZXI7XG52YXIgUmVzb2x2ZWRNZXNzYWdlUmVhZGVyT3B0aW9ucztcbihmdW5jdGlvbiAoUmVzb2x2ZWRNZXNzYWdlUmVhZGVyT3B0aW9ucykge1xuICAgIGZ1bmN0aW9uIGZyb21PcHRpb25zKG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IGNoYXJzZXQ7XG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIGxldCBjb250ZW50RGVjb2RlcjtcbiAgICAgICAgY29uc3QgY29udGVudERlY29kZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICBsZXQgY29udGVudFR5cGVEZWNvZGVyO1xuICAgICAgICBjb25zdCBjb250ZW50VHlwZURlY29kZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY2hhcnNldCA9IG9wdGlvbnMgPz8gJ3V0Zi04JztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNoYXJzZXQgPSBvcHRpb25zLmNoYXJzZXQgPz8gJ3V0Zi04JztcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnREZWNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50RGVjb2RlciA9IG9wdGlvbnMuY29udGVudERlY29kZXI7XG4gICAgICAgICAgICAgICAgY29udGVudERlY29kZXJzLnNldChjb250ZW50RGVjb2Rlci5uYW1lLCBjb250ZW50RGVjb2Rlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5jb250ZW50RGVjb2RlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGVjb2RlciBvZiBvcHRpb25zLmNvbnRlbnREZWNvZGVycykge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50RGVjb2RlcnMuc2V0KGRlY29kZXIubmFtZSwgZGVjb2Rlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuY29udGVudFR5cGVEZWNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXIgPSBvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcjtcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXJzLnNldChjb250ZW50VHlwZURlY29kZXIubmFtZSwgY29udGVudFR5cGVEZWNvZGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGVjb2RlciBvZiBvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGVEZWNvZGVycy5zZXQoZGVjb2Rlci5uYW1lLCBkZWNvZGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnRlbnRUeXBlRGVjb2RlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXIgPSAoMCwgcmFsXzEuZGVmYXVsdCkoKS5hcHBsaWNhdGlvbkpzb24uZGVjb2RlcjtcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlRGVjb2RlcnMuc2V0KGNvbnRlbnRUeXBlRGVjb2Rlci5uYW1lLCBjb250ZW50VHlwZURlY29kZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGNoYXJzZXQsIGNvbnRlbnREZWNvZGVyLCBjb250ZW50RGVjb2RlcnMsIGNvbnRlbnRUeXBlRGVjb2RlciwgY29udGVudFR5cGVEZWNvZGVycyB9O1xuICAgIH1cbiAgICBSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zLmZyb21PcHRpb25zID0gZnJvbU9wdGlvbnM7XG59KShSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zIHx8IChSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zID0ge30pKTtcbmNsYXNzIFJlYWRhYmxlU3RyZWFtTWVzc2FnZVJlYWRlciBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVJlYWRlciB7XG4gICAgY29uc3RydWN0b3IocmVhZGFibGUsIG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZSA9IHJlYWRhYmxlO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zLmZyb21PcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmJ1ZmZlciA9ICgwLCByYWxfMS5kZWZhdWx0KSgpLm1lc3NhZ2VCdWZmZXIuY3JlYXRlKHRoaXMub3B0aW9ucy5jaGFyc2V0KTtcbiAgICAgICAgdGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0ID0gMTAwMDA7XG4gICAgICAgIHRoaXMubmV4dE1lc3NhZ2VMZW5ndGggPSAtMTtcbiAgICAgICAgdGhpcy5tZXNzYWdlVG9rZW4gPSAwO1xuICAgICAgICB0aGlzLnJlYWRTZW1hcGhvcmUgPSBuZXcgc2VtYXBob3JlXzEuU2VtYXBob3JlKDEpO1xuICAgIH1cbiAgICBzZXQgcGFydGlhbE1lc3NhZ2VUaW1lb3V0KHRpbWVvdXQpIHtcbiAgICAgICAgdGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0ID0gdGltZW91dDtcbiAgICB9XG4gICAgZ2V0IHBhcnRpYWxNZXNzYWdlVGltZW91dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dDtcbiAgICB9XG4gICAgbGlzdGVuKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMubmV4dE1lc3NhZ2VMZW5ndGggPSAtMTtcbiAgICAgICAgdGhpcy5tZXNzYWdlVG9rZW4gPSAwO1xuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlVGltZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5yZWFkYWJsZS5vbkRhdGEoKGRhdGEpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25EYXRhKGRhdGEpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZS5vbkVycm9yKChlcnJvcikgPT4gdGhpcy5maXJlRXJyb3IoZXJyb3IpKTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZS5vbkNsb3NlKCgpID0+IHRoaXMuZmlyZUNsb3NlKCkpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBvbkRhdGEoZGF0YSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5idWZmZXIuYXBwZW5kKGRhdGEpO1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IHRoaXMuYnVmZmVyLnRyeVJlYWRIZWFkZXJzKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50TGVuZ3RoID0gaGVhZGVycy5nZXQoJ2NvbnRlbnQtbGVuZ3RoJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY29udGVudExlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IobmV3IEVycm9yKGBIZWFkZXIgbXVzdCBwcm92aWRlIGEgQ29udGVudC1MZW5ndGggcHJvcGVydHkuXFxuJHtKU09OLnN0cmluZ2lmeShPYmplY3QuZnJvbUVudHJpZXMoaGVhZGVycykpfWApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsZW5ndGggPSBwYXJzZUludChjb250ZW50TGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKGxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKG5ldyBFcnJvcihgQ29udGVudC1MZW5ndGggdmFsdWUgbXVzdCBiZSBhIG51bWJlci4gR290ICR7Y29udGVudExlbmd0aH1gKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IHRoaXMuYnVmZmVyLnRyeVJlYWRCb2R5KHRoaXMubmV4dE1lc3NhZ2VMZW5ndGgpO1xuICAgICAgICAgICAgICAgIGlmIChib2R5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLyoqIFdlIGhhdmVuJ3QgcmVjZWl2ZWQgdGhlIGZ1bGwgbWVzc2FnZSB5ZXQuICovXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0UGFydGlhbE1lc3NhZ2VUaW1lcigpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJQYXJ0aWFsTWVzc2FnZVRpbWVyKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9IC0xO1xuICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHdlIGNvbnZlcnQgb25lIHJlY2VpdmVkIG1lc3NhZ2UgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAgICAgLy8gb3RoZXIuIE90aGVyd2lzZSBpdCBjb3VsZCBoYXBwZW4gdGhhdCBhIGRlY29kaW5nIG9mIGEgc2Vjb25kXG4gICAgICAgICAgICAgICAgLy8gc21hbGxlciBtZXNzYWdlIGZpbmlzaGVkIGJlZm9yZSB0aGUgZGVjb2Rpbmcgb2YgYSBmaXJzdCBsYXJnZXJcbiAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIGFuZCB0aGVuIHdlIHdvdWxkIGRlbGl2ZXIgdGhlIHNlY29uZCBtZXNzYWdlIGZpcnN0LlxuICAgICAgICAgICAgICAgIHRoaXMucmVhZFNlbWFwaG9yZS5sb2NrKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnl0ZXMgPSB0aGlzLm9wdGlvbnMuY29udGVudERlY29kZXIgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBhd2FpdCB0aGlzLm9wdGlvbnMuY29udGVudERlY29kZXIuZGVjb2RlKGJvZHkpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGJvZHk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBhd2FpdCB0aGlzLm9wdGlvbnMuY29udGVudFR5cGVEZWNvZGVyLmRlY29kZShieXRlcywgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjayhtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNsZWFyUGFydGlhbE1lc3NhZ2VUaW1lcigpIHtcbiAgICAgICAgaWYgKHRoaXMucGFydGlhbE1lc3NhZ2VUaW1lcikge1xuICAgICAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZVRpbWVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRoaXMucGFydGlhbE1lc3NhZ2VUaW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRQYXJ0aWFsTWVzc2FnZVRpbWVyKCkge1xuICAgICAgICB0aGlzLmNsZWFyUGFydGlhbE1lc3NhZ2VUaW1lcigpO1xuICAgICAgICBpZiAodGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0IDw9IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlVGltZXIgPSAoMCwgcmFsXzEuZGVmYXVsdCkoKS50aW1lci5zZXRUaW1lb3V0KCh0b2tlbiwgdGltZW91dCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZVRpbWVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRva2VuID09PSB0aGlzLm1lc3NhZ2VUb2tlbikge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZVBhcnRpYWxNZXNzYWdlKHsgbWVzc2FnZVRva2VuOiB0b2tlbiwgd2FpdGluZ1RpbWU6IHRpbWVvdXQgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRQYXJ0aWFsTWVzc2FnZVRpbWVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dCwgdGhpcy5tZXNzYWdlVG9rZW4sIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dCk7XG4gICAgfVxufVxuZXhwb3J0cy5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXIgPSBSZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLldyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLkFic3RyYWN0TWVzc2FnZVdyaXRlciA9IGV4cG9ydHMuTWVzc2FnZVdyaXRlciA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IHNlbWFwaG9yZV8xID0gcmVxdWlyZShcIi4vc2VtYXBob3JlXCIpO1xuY29uc3QgZXZlbnRzXzEgPSByZXF1aXJlKFwiLi9ldmVudHNcIik7XG5jb25zdCBDb250ZW50TGVuZ3RoID0gJ0NvbnRlbnQtTGVuZ3RoOiAnO1xuY29uc3QgQ1JMRiA9ICdcXHJcXG4nO1xudmFyIE1lc3NhZ2VXcml0ZXI7XG4oZnVuY3Rpb24gKE1lc3NhZ2VXcml0ZXIpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgSXMuZnVuYyhjYW5kaWRhdGUuZGlzcG9zZSkgJiYgSXMuZnVuYyhjYW5kaWRhdGUub25DbG9zZSkgJiZcbiAgICAgICAgICAgIElzLmZ1bmMoY2FuZGlkYXRlLm9uRXJyb3IpICYmIElzLmZ1bmMoY2FuZGlkYXRlLndyaXRlKTtcbiAgICB9XG4gICAgTWVzc2FnZVdyaXRlci5pcyA9IGlzO1xufSkoTWVzc2FnZVdyaXRlciB8fCAoZXhwb3J0cy5NZXNzYWdlV3JpdGVyID0gTWVzc2FnZVdyaXRlciA9IHt9KSk7XG5jbGFzcyBBYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy5lcnJvckVtaXR0ZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLmNsb3NlRW1pdHRlci5kaXNwb3NlKCk7XG4gICAgfVxuICAgIGdldCBvbkVycm9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lcnJvckVtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGZpcmVFcnJvcihlcnJvciwgbWVzc2FnZSwgY291bnQpIHtcbiAgICAgICAgdGhpcy5lcnJvckVtaXR0ZXIuZmlyZShbdGhpcy5hc0Vycm9yKGVycm9yKSwgbWVzc2FnZSwgY291bnRdKTtcbiAgICB9XG4gICAgZ2V0IG9uQ2xvc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb3NlRW1pdHRlci5ldmVudDtcbiAgICB9XG4gICAgZmlyZUNsb3NlKCkge1xuICAgICAgICB0aGlzLmNsb3NlRW1pdHRlci5maXJlKHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIGFzRXJyb3IoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoYFdyaXRlciByZWNlaXZlZCBlcnJvci4gUmVhc29uOiAke0lzLnN0cmluZyhlcnJvci5tZXNzYWdlKSA/IGVycm9yLm1lc3NhZ2UgOiAndW5rbm93bid9YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLkFic3RyYWN0TWVzc2FnZVdyaXRlciA9IEFic3RyYWN0TWVzc2FnZVdyaXRlcjtcbnZhciBSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zO1xuKGZ1bmN0aW9uIChSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zKSB7XG4gICAgZnVuY3Rpb24gZnJvbU9wdGlvbnMob3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHsgY2hhcnNldDogb3B0aW9ucyA/PyAndXRmLTgnLCBjb250ZW50VHlwZUVuY29kZXI6ICgwLCByYWxfMS5kZWZhdWx0KSgpLmFwcGxpY2F0aW9uSnNvbi5lbmNvZGVyIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4geyBjaGFyc2V0OiBvcHRpb25zLmNoYXJzZXQgPz8gJ3V0Zi04JywgY29udGVudEVuY29kZXI6IG9wdGlvbnMuY29udGVudEVuY29kZXIsIGNvbnRlbnRUeXBlRW5jb2Rlcjogb3B0aW9ucy5jb250ZW50VHlwZUVuY29kZXIgPz8gKDAsIHJhbF8xLmRlZmF1bHQpKCkuYXBwbGljYXRpb25Kc29uLmVuY29kZXIgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zLmZyb21PcHRpb25zID0gZnJvbU9wdGlvbnM7XG59KShSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zIHx8IChSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zID0ge30pKTtcbmNsYXNzIFdyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKHdyaXRhYmxlLCBvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMud3JpdGFibGUgPSB3cml0YWJsZTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gUmVzb2x2ZWRNZXNzYWdlV3JpdGVyT3B0aW9ucy5mcm9tT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50ID0gMDtcbiAgICAgICAgdGhpcy53cml0ZVNlbWFwaG9yZSA9IG5ldyBzZW1hcGhvcmVfMS5TZW1hcGhvcmUoMSk7XG4gICAgICAgIHRoaXMud3JpdGFibGUub25FcnJvcigoZXJyb3IpID0+IHRoaXMuZmlyZUVycm9yKGVycm9yKSk7XG4gICAgICAgIHRoaXMud3JpdGFibGUub25DbG9zZSgoKSA9PiB0aGlzLmZpcmVDbG9zZSgpKTtcbiAgICB9XG4gICAgYXN5bmMgd3JpdGUobXNnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndyaXRlU2VtYXBob3JlLmxvY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHRoaXMub3B0aW9ucy5jb250ZW50VHlwZUVuY29kZXIuZW5jb2RlKG1zZywgdGhpcy5vcHRpb25zKS50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNvbnRlbnRFbmNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jb250ZW50RW5jb2Rlci5lbmNvZGUoYnVmZmVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZC50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJzID0gW107XG4gICAgICAgICAgICAgICAgaGVhZGVycy5wdXNoKENvbnRlbnRMZW5ndGgsIGJ1ZmZlci5ieXRlTGVuZ3RoLnRvU3RyaW5nKCksIENSTEYpO1xuICAgICAgICAgICAgICAgIGhlYWRlcnMucHVzaChDUkxGKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kb1dyaXRlKG1zZywgaGVhZGVycywgYnVmZmVyKTtcbiAgICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgZG9Xcml0ZShtc2csIGhlYWRlcnMsIGRhdGEpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMud3JpdGFibGUud3JpdGUoaGVhZGVycy5qb2luKCcnKSwgJ2FzY2lpJyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy53cml0YWJsZS53cml0ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IsIG1zZyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZUVycm9yKGVycm9yLCBtc2cpIHtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50Kys7XG4gICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yLCBtc2csIHRoaXMuZXJyb3JDb3VudCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICAgICAgdGhpcy53cml0YWJsZS5lbmQoKTtcbiAgICB9XG59XG5leHBvcnRzLldyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgPSBXcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkFic3RyYWN0TWVzc2FnZUJ1ZmZlciA9IHZvaWQgMDtcbmNvbnN0IENSID0gMTM7XG5jb25zdCBMRiA9IDEwO1xuY29uc3QgQ1JMRiA9ICdcXHJcXG4nO1xuY2xhc3MgQWJzdHJhY3RNZXNzYWdlQnVmZmVyIHtcbiAgICBjb25zdHJ1Y3RvcihlbmNvZGluZyA9ICd1dGYtOCcpIHtcbiAgICAgICAgdGhpcy5fZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgICAgICAgdGhpcy5fY2h1bmtzID0gW107XG4gICAgICAgIHRoaXMuX3RvdGFsTGVuZ3RoID0gMDtcbiAgICB9XG4gICAgZ2V0IGVuY29kaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW5jb2Rpbmc7XG4gICAgfVxuICAgIGFwcGVuZChjaHVuaykge1xuICAgICAgICBjb25zdCB0b0FwcGVuZCA9IHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZycgPyB0aGlzLmZyb21TdHJpbmcoY2h1bmssIHRoaXMuX2VuY29kaW5nKSA6IGNodW5rO1xuICAgICAgICB0aGlzLl9jaHVua3MucHVzaCh0b0FwcGVuZCk7XG4gICAgICAgIHRoaXMuX3RvdGFsTGVuZ3RoICs9IHRvQXBwZW5kLmJ5dGVMZW5ndGg7XG4gICAgfVxuICAgIHRyeVJlYWRIZWFkZXJzKGxvd2VyQ2FzZUtleXMgPSBmYWxzZSkge1xuICAgICAgICBpZiAodGhpcy5fY2h1bmtzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3RhdGUgPSAwO1xuICAgICAgICBsZXQgY2h1bmtJbmRleCA9IDA7XG4gICAgICAgIGxldCBvZmZzZXQgPSAwO1xuICAgICAgICBsZXQgY2h1bmtCeXRlc1JlYWQgPSAwO1xuICAgICAgICByb3c6IHdoaWxlIChjaHVua0luZGV4IDwgdGhpcy5fY2h1bmtzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgY2h1bmsgPSB0aGlzLl9jaHVua3NbY2h1bmtJbmRleF07XG4gICAgICAgICAgICBvZmZzZXQgPSAwO1xuICAgICAgICAgICAgY29sdW1uOiB3aGlsZSAob2Zmc2V0IDwgY2h1bmsubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjaHVua1tvZmZzZXRdO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDUjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIExGOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gNDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHJvdztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjaHVua0J5dGVzUmVhZCArPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgY2h1bmtJbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZSAhPT0gNCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgYnVmZmVyIGNvbnRhaW5zIHRoZSB0d28gQ1JMRiBhdCB0aGUgZW5kLiBTbyB3ZSB3aWxsXG4gICAgICAgIC8vIGhhdmUgdHdvIGVtcHR5IGxpbmVzIGFmdGVyIHRoZSBzcGxpdCBhdCB0aGUgZW5kIGFzIHdlbGwuXG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuX3JlYWQoY2h1bmtCeXRlc1JlYWQgKyBvZmZzZXQpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwKCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLnRvU3RyaW5nKGJ1ZmZlciwgJ2FzY2lpJykuc3BsaXQoQ1JMRik7XG4gICAgICAgIGlmIChoZWFkZXJzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXJzLmxlbmd0aCAtIDI7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaGVhZGVyID0gaGVhZGVyc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gaGVhZGVyLmluZGV4T2YoJzonKTtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1lc3NhZ2UgaGVhZGVyIG11c3Qgc2VwYXJhdGUga2V5IGFuZCB2YWx1ZSB1c2luZyAnOidcXG4ke2hlYWRlcn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGhlYWRlci5zdWJzdHIoMCwgaW5kZXgpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBoZWFkZXIuc3Vic3RyKGluZGV4ICsgMSkudHJpbSgpO1xuICAgICAgICAgICAgcmVzdWx0LnNldChsb3dlckNhc2VLZXlzID8ga2V5LnRvTG93ZXJDYXNlKCkgOiBrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICB0cnlSZWFkQm9keShsZW5ndGgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3RvdGFsTGVuZ3RoIDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkKGxlbmd0aCk7XG4gICAgfVxuICAgIGdldCBudW1iZXJPZkJ5dGVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdG90YWxMZW5ndGg7XG4gICAgfVxuICAgIF9yZWFkKGJ5dGVDb3VudCkge1xuICAgICAgICBpZiAoYnl0ZUNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbXB0eUJ1ZmZlcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChieXRlQ291bnQgPiB0aGlzLl90b3RhbExlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVhZCBzbyBtYW55IGJ5dGVzIWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jaHVua3NbMF0uYnl0ZUxlbmd0aCA9PT0gYnl0ZUNvdW50KSB7XG4gICAgICAgICAgICAvLyBzdXBlciBmYXN0IHBhdGgsIHByZWNpc2VseSBmaXJzdCBjaHVuayBtdXN0IGJlIHJldHVybmVkXG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1swXTtcbiAgICAgICAgICAgIHRoaXMuX2NodW5rcy5zaGlmdCgpO1xuICAgICAgICAgICAgdGhpcy5fdG90YWxMZW5ndGggLT0gYnl0ZUNvdW50O1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXNOYXRpdmUoY2h1bmspO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jaHVua3NbMF0uYnl0ZUxlbmd0aCA+IGJ5dGVDb3VudCkge1xuICAgICAgICAgICAgLy8gZmFzdCBwYXRoLCB0aGUgcmVhZGluZyBpcyBlbnRpcmVseSB3aXRoaW4gdGhlIGZpcnN0IGNodW5rXG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1swXTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuYXNOYXRpdmUoY2h1bmssIGJ5dGVDb3VudCk7XG4gICAgICAgICAgICB0aGlzLl9jaHVua3NbMF0gPSBjaHVuay5zbGljZShieXRlQ291bnQpO1xuICAgICAgICAgICAgdGhpcy5fdG90YWxMZW5ndGggLT0gYnl0ZUNvdW50O1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmFsbG9jTmF0aXZlKGJ5dGVDb3VudCk7XG4gICAgICAgIGxldCByZXN1bHRPZmZzZXQgPSAwO1xuICAgICAgICBsZXQgY2h1bmtJbmRleCA9IDA7XG4gICAgICAgIHdoaWxlIChieXRlQ291bnQgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1tjaHVua0luZGV4XTtcbiAgICAgICAgICAgIGlmIChjaHVuay5ieXRlTGVuZ3RoID4gYnl0ZUNvdW50KSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBjaHVuayB3aWxsIHN1cnZpdmVcbiAgICAgICAgICAgICAgICBjb25zdCBjaHVua1BhcnQgPSBjaHVuay5zbGljZSgwLCBieXRlQ291bnQpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5zZXQoY2h1bmtQYXJ0LCByZXN1bHRPZmZzZXQpO1xuICAgICAgICAgICAgICAgIHJlc3VsdE9mZnNldCArPSBieXRlQ291bnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2h1bmtzW2NodW5rSW5kZXhdID0gY2h1bmsuc2xpY2UoYnl0ZUNvdW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLl90b3RhbExlbmd0aCAtPSBieXRlQ291bnQ7XG4gICAgICAgICAgICAgICAgYnl0ZUNvdW50IC09IGJ5dGVDb3VudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHRoaXMgY2h1bmsgd2lsbCBiZSBlbnRpcmVseSByZWFkXG4gICAgICAgICAgICAgICAgcmVzdWx0LnNldChjaHVuaywgcmVzdWx0T2Zmc2V0KTtcbiAgICAgICAgICAgICAgICByZXN1bHRPZmZzZXQgKz0gY2h1bmsuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgICAgICB0aGlzLl9jaHVua3Muc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl90b3RhbExlbmd0aCAtPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgICAgIGJ5dGVDb3VudCAtPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VCdWZmZXIgPSBBYnN0cmFjdE1lc3NhZ2VCdWZmZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uID0gZXhwb3J0cy5Db25uZWN0aW9uT3B0aW9ucyA9IGV4cG9ydHMuTWVzc2FnZVN0cmF0ZWd5ID0gZXhwb3J0cy5DYW5jZWxsYXRpb25TdHJhdGVneSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gZXhwb3J0cy5JZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IGV4cG9ydHMuQ29ubmVjdGlvbkVycm9yID0gZXhwb3J0cy5Db25uZWN0aW9uRXJyb3JzID0gZXhwb3J0cy5Mb2dUcmFjZU5vdGlmaWNhdGlvbiA9IGV4cG9ydHMuU2V0VHJhY2VOb3RpZmljYXRpb24gPSBleHBvcnRzLlRyYWNlRm9ybWF0ID0gZXhwb3J0cy5UcmFjZVZhbHVlcyA9IGV4cG9ydHMuVHJhY2UgPSBleHBvcnRzLk51bGxMb2dnZXIgPSBleHBvcnRzLlByb2dyZXNzVHlwZSA9IGV4cG9ydHMuUHJvZ3Jlc3NUb2tlbiA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IG1lc3NhZ2VzXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlc1wiKTtcbmNvbnN0IGxpbmtlZE1hcF8xID0gcmVxdWlyZShcIi4vbGlua2VkTWFwXCIpO1xuY29uc3QgZXZlbnRzXzEgPSByZXF1aXJlKFwiLi9ldmVudHNcIik7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbnZhciBDYW5jZWxOb3RpZmljYXRpb247XG4oZnVuY3Rpb24gKENhbmNlbE5vdGlmaWNhdGlvbikge1xuICAgIENhbmNlbE5vdGlmaWNhdGlvbi50eXBlID0gbmV3IG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZSgnJC9jYW5jZWxSZXF1ZXN0Jyk7XG59KShDYW5jZWxOb3RpZmljYXRpb24gfHwgKENhbmNlbE5vdGlmaWNhdGlvbiA9IHt9KSk7XG52YXIgUHJvZ3Jlc3NUb2tlbjtcbihmdW5jdGlvbiAoUHJvZ3Jlc3NUb2tlbikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG4gICAgfVxuICAgIFByb2dyZXNzVG9rZW4uaXMgPSBpcztcbn0pKFByb2dyZXNzVG9rZW4gfHwgKGV4cG9ydHMuUHJvZ3Jlc3NUb2tlbiA9IFByb2dyZXNzVG9rZW4gPSB7fSkpO1xudmFyIFByb2dyZXNzTm90aWZpY2F0aW9uO1xuKGZ1bmN0aW9uIChQcm9ncmVzc05vdGlmaWNhdGlvbikge1xuICAgIFByb2dyZXNzTm90aWZpY2F0aW9uLnR5cGUgPSBuZXcgbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlKCckL3Byb2dyZXNzJyk7XG59KShQcm9ncmVzc05vdGlmaWNhdGlvbiB8fCAoUHJvZ3Jlc3NOb3RpZmljYXRpb24gPSB7fSkpO1xuY2xhc3MgUHJvZ3Jlc3NUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICB9XG59XG5leHBvcnRzLlByb2dyZXNzVHlwZSA9IFByb2dyZXNzVHlwZTtcbnZhciBTdGFyUmVxdWVzdEhhbmRsZXI7XG4oZnVuY3Rpb24gKFN0YXJSZXF1ZXN0SGFuZGxlcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBJcy5mdW5jKHZhbHVlKTtcbiAgICB9XG4gICAgU3RhclJlcXVlc3RIYW5kbGVyLmlzID0gaXM7XG59KShTdGFyUmVxdWVzdEhhbmRsZXIgfHwgKFN0YXJSZXF1ZXN0SGFuZGxlciA9IHt9KSk7XG5leHBvcnRzLk51bGxMb2dnZXIgPSBPYmplY3QuZnJlZXplKHtcbiAgICBlcnJvcjogKCkgPT4geyB9LFxuICAgIHdhcm46ICgpID0+IHsgfSxcbiAgICBpbmZvOiAoKSA9PiB7IH0sXG4gICAgbG9nOiAoKSA9PiB7IH1cbn0pO1xudmFyIFRyYWNlO1xuKGZ1bmN0aW9uIChUcmFjZSkge1xuICAgIFRyYWNlW1RyYWNlW1wiT2ZmXCJdID0gMF0gPSBcIk9mZlwiO1xuICAgIFRyYWNlW1RyYWNlW1wiTWVzc2FnZXNcIl0gPSAxXSA9IFwiTWVzc2FnZXNcIjtcbiAgICBUcmFjZVtUcmFjZVtcIkNvbXBhY3RcIl0gPSAyXSA9IFwiQ29tcGFjdFwiO1xuICAgIFRyYWNlW1RyYWNlW1wiVmVyYm9zZVwiXSA9IDNdID0gXCJWZXJib3NlXCI7XG59KShUcmFjZSB8fCAoZXhwb3J0cy5UcmFjZSA9IFRyYWNlID0ge30pKTtcbnZhciBUcmFjZVZhbHVlcztcbihmdW5jdGlvbiAoVHJhY2VWYWx1ZXMpIHtcbiAgICAvKipcbiAgICAgKiBUdXJuIHRyYWNpbmcgb2ZmLlxuICAgICAqL1xuICAgIFRyYWNlVmFsdWVzLk9mZiA9ICdvZmYnO1xuICAgIC8qKlxuICAgICAqIFRyYWNlIG1lc3NhZ2VzIG9ubHkuXG4gICAgICovXG4gICAgVHJhY2VWYWx1ZXMuTWVzc2FnZXMgPSAnbWVzc2FnZXMnO1xuICAgIC8qKlxuICAgICAqIENvbXBhY3QgbWVzc2FnZSB0cmFjaW5nLlxuICAgICAqL1xuICAgIFRyYWNlVmFsdWVzLkNvbXBhY3QgPSAnY29tcGFjdCc7XG4gICAgLyoqXG4gICAgICogVmVyYm9zZSBtZXNzYWdlIHRyYWNpbmcuXG4gICAgICovXG4gICAgVHJhY2VWYWx1ZXMuVmVyYm9zZSA9ICd2ZXJib3NlJztcbn0pKFRyYWNlVmFsdWVzIHx8IChleHBvcnRzLlRyYWNlVmFsdWVzID0gVHJhY2VWYWx1ZXMgPSB7fSkpO1xuKGZ1bmN0aW9uIChUcmFjZSkge1xuICAgIGZ1bmN0aW9uIGZyb21TdHJpbmcodmFsdWUpIHtcbiAgICAgICAgaWYgKCFJcy5zdHJpbmcodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gVHJhY2UuT2ZmO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSAnb2ZmJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gVHJhY2UuT2ZmO1xuICAgICAgICAgICAgY2FzZSAnbWVzc2FnZXMnOlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5NZXNzYWdlcztcbiAgICAgICAgICAgIGNhc2UgJ2NvbXBhY3QnOlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5Db21wYWN0O1xuICAgICAgICAgICAgY2FzZSAndmVyYm9zZSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFRyYWNlLlZlcmJvc2U7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5PZmY7XG4gICAgICAgIH1cbiAgICB9XG4gICAgVHJhY2UuZnJvbVN0cmluZyA9IGZyb21TdHJpbmc7XG4gICAgZnVuY3Rpb24gdG9TdHJpbmcodmFsdWUpIHtcbiAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5PZmY6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdvZmYnO1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5NZXNzYWdlczpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ21lc3NhZ2VzJztcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuQ29tcGFjdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2NvbXBhY3QnO1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5WZXJib3NlOlxuICAgICAgICAgICAgICAgIHJldHVybiAndmVyYm9zZSc7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAnb2ZmJztcbiAgICAgICAgfVxuICAgIH1cbiAgICBUcmFjZS50b1N0cmluZyA9IHRvU3RyaW5nO1xufSkoVHJhY2UgfHwgKGV4cG9ydHMuVHJhY2UgPSBUcmFjZSA9IHt9KSk7XG52YXIgVHJhY2VGb3JtYXQ7XG4oZnVuY3Rpb24gKFRyYWNlRm9ybWF0KSB7XG4gICAgVHJhY2VGb3JtYXRbXCJUZXh0XCJdID0gXCJ0ZXh0XCI7XG4gICAgVHJhY2VGb3JtYXRbXCJKU09OXCJdID0gXCJqc29uXCI7XG59KShUcmFjZUZvcm1hdCB8fCAoZXhwb3J0cy5UcmFjZUZvcm1hdCA9IFRyYWNlRm9ybWF0ID0ge30pKTtcbihmdW5jdGlvbiAoVHJhY2VGb3JtYXQpIHtcbiAgICBmdW5jdGlvbiBmcm9tU3RyaW5nKHZhbHVlKSB7XG4gICAgICAgIGlmICghSXMuc3RyaW5nKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIFRyYWNlRm9ybWF0LlRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAodmFsdWUgPT09ICdqc29uJykge1xuICAgICAgICAgICAgcmV0dXJuIFRyYWNlRm9ybWF0LkpTT047XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gVHJhY2VGb3JtYXQuVGV4dDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBUcmFjZUZvcm1hdC5mcm9tU3RyaW5nID0gZnJvbVN0cmluZztcbn0pKFRyYWNlRm9ybWF0IHx8IChleHBvcnRzLlRyYWNlRm9ybWF0ID0gVHJhY2VGb3JtYXQgPSB7fSkpO1xudmFyIFNldFRyYWNlTm90aWZpY2F0aW9uO1xuKGZ1bmN0aW9uIChTZXRUcmFjZU5vdGlmaWNhdGlvbikge1xuICAgIFNldFRyYWNlTm90aWZpY2F0aW9uLnR5cGUgPSBuZXcgbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlKCckL3NldFRyYWNlJyk7XG59KShTZXRUcmFjZU5vdGlmaWNhdGlvbiB8fCAoZXhwb3J0cy5TZXRUcmFjZU5vdGlmaWNhdGlvbiA9IFNldFRyYWNlTm90aWZpY2F0aW9uID0ge30pKTtcbnZhciBMb2dUcmFjZU5vdGlmaWNhdGlvbjtcbihmdW5jdGlvbiAoTG9nVHJhY2VOb3RpZmljYXRpb24pIHtcbiAgICBMb2dUcmFjZU5vdGlmaWNhdGlvbi50eXBlID0gbmV3IG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZSgnJC9sb2dUcmFjZScpO1xufSkoTG9nVHJhY2VOb3RpZmljYXRpb24gfHwgKGV4cG9ydHMuTG9nVHJhY2VOb3RpZmljYXRpb24gPSBMb2dUcmFjZU5vdGlmaWNhdGlvbiA9IHt9KSk7XG52YXIgQ29ubmVjdGlvbkVycm9ycztcbihmdW5jdGlvbiAoQ29ubmVjdGlvbkVycm9ycykge1xuICAgIC8qKlxuICAgICAqIFRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZC5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uRXJyb3JzW0Nvbm5lY3Rpb25FcnJvcnNbXCJDbG9zZWRcIl0gPSAxXSA9IFwiQ2xvc2VkXCI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gZ290IGRpc3Bvc2VkLlxuICAgICAqL1xuICAgIENvbm5lY3Rpb25FcnJvcnNbQ29ubmVjdGlvbkVycm9yc1tcIkRpc3Bvc2VkXCJdID0gMl0gPSBcIkRpc3Bvc2VkXCI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBpbiBsaXN0ZW5pbmcgbW9kZS5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uRXJyb3JzW0Nvbm5lY3Rpb25FcnJvcnNbXCJBbHJlYWR5TGlzdGVuaW5nXCJdID0gM10gPSBcIkFscmVhZHlMaXN0ZW5pbmdcIjtcbn0pKENvbm5lY3Rpb25FcnJvcnMgfHwgKGV4cG9ydHMuQ29ubmVjdGlvbkVycm9ycyA9IENvbm5lY3Rpb25FcnJvcnMgPSB7fSkpO1xuY2xhc3MgQ29ubmVjdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNvZGUsIG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBDb25uZWN0aW9uRXJyb3IucHJvdG90eXBlKTtcbiAgICB9XG59XG5leHBvcnRzLkNvbm5lY3Rpb25FcnJvciA9IENvbm5lY3Rpb25FcnJvcjtcbnZhciBDb25uZWN0aW9uU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENvbm5lY3Rpb25TdHJhdGVneSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNhbmNlbFVuZGlzcGF0Y2hlZCk7XG4gICAgfVxuICAgIENvbm5lY3Rpb25TdHJhdGVneS5pcyA9IGlzO1xufSkoQ29ubmVjdGlvblN0cmF0ZWd5IHx8IChleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IENvbm5lY3Rpb25TdHJhdGVneSA9IHt9KSk7XG52YXIgSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5O1xuKGZ1bmN0aW9uIChJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiAoY2FuZGlkYXRlLmtpbmQgPT09IHVuZGVmaW5lZCB8fCBjYW5kaWRhdGUua2luZCA9PT0gJ2lkJykgJiYgSXMuZnVuYyhjYW5kaWRhdGUuY3JlYXRlQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UpICYmIChjYW5kaWRhdGUuZGlzcG9zZSA9PT0gdW5kZWZpbmVkIHx8IElzLmZ1bmMoY2FuZGlkYXRlLmRpc3Bvc2UpKTtcbiAgICB9XG4gICAgSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzID0gaXM7XG59KShJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgfHwgKGV4cG9ydHMuSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0ge30pKTtcbnZhciBSZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneTtcbihmdW5jdGlvbiAoUmVxdWVzdENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBjYW5kaWRhdGUua2luZCA9PT0gJ3JlcXVlc3QnICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKSAmJiAoY2FuZGlkYXRlLmRpc3Bvc2UgPT09IHVuZGVmaW5lZCB8fCBJcy5mdW5jKGNhbmRpZGF0ZS5kaXNwb3NlKSk7XG4gICAgfVxuICAgIFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzID0gaXM7XG59KShSZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSB8fCAoZXhwb3J0cy5SZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0ge30pKTtcbnZhciBDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5O1xuKGZ1bmN0aW9uIChDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5NZXNzYWdlID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKF8pIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgY2FuY2VsbGF0aW9uXzEuQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UoKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kuaXModmFsdWUpIHx8IFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKHZhbHVlKTtcbiAgICB9XG4gICAgQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5pcyA9IGlzO1xufSkoQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSB8fCAoZXhwb3J0cy5DYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IHt9KSk7XG52YXIgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENhbmNlbGxhdGlvblNlbmRlclN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kuTWVzc2FnZSA9IE9iamVjdC5mcmVlemUoe1xuICAgICAgICBzZW5kQ2FuY2VsbGF0aW9uKGNvbm4sIGlkKSB7XG4gICAgICAgICAgICByZXR1cm4gY29ubi5zZW5kTm90aWZpY2F0aW9uKENhbmNlbE5vdGlmaWNhdGlvbi50eXBlLCB7IGlkIH0pO1xuICAgICAgICB9LFxuICAgICAgICBjbGVhbnVwKF8pIHsgfVxuICAgIH0pO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLnNlbmRDYW5jZWxsYXRpb24pICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNsZWFudXApO1xuICAgIH1cbiAgICBDYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneS5pcyA9IGlzO1xufSkoQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgfHwgKGV4cG9ydHMuQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgPSBDYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneSA9IHt9KSk7XG52YXIgQ2FuY2VsbGF0aW9uU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENhbmNlbGxhdGlvblN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uU3RyYXRlZ3kuTWVzc2FnZSA9IE9iamVjdC5mcmVlemUoe1xuICAgICAgICByZWNlaXZlcjogQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5NZXNzYWdlLFxuICAgICAgICBzZW5kZXI6IENhbmNlbGxhdGlvblNlbmRlclN0cmF0ZWd5Lk1lc3NhZ2VcbiAgICB9KTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKGNhbmRpZGF0ZS5yZWNlaXZlcikgJiYgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kuaXMoY2FuZGlkYXRlLnNlbmRlcik7XG4gICAgfVxuICAgIENhbmNlbGxhdGlvblN0cmF0ZWd5LmlzID0gaXM7XG59KShDYW5jZWxsYXRpb25TdHJhdGVneSB8fCAoZXhwb3J0cy5DYW5jZWxsYXRpb25TdHJhdGVneSA9IENhbmNlbGxhdGlvblN0cmF0ZWd5ID0ge30pKTtcbnZhciBNZXNzYWdlU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKE1lc3NhZ2VTdHJhdGVneSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLmhhbmRsZU1lc3NhZ2UpO1xuICAgIH1cbiAgICBNZXNzYWdlU3RyYXRlZ3kuaXMgPSBpcztcbn0pKE1lc3NhZ2VTdHJhdGVneSB8fCAoZXhwb3J0cy5NZXNzYWdlU3RyYXRlZ3kgPSBNZXNzYWdlU3RyYXRlZ3kgPSB7fSkpO1xudmFyIENvbm5lY3Rpb25PcHRpb25zO1xuKGZ1bmN0aW9uIChDb25uZWN0aW9uT3B0aW9ucykge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIChDYW5jZWxsYXRpb25TdHJhdGVneS5pcyhjYW5kaWRhdGUuY2FuY2VsbGF0aW9uU3RyYXRlZ3kpIHx8IENvbm5lY3Rpb25TdHJhdGVneS5pcyhjYW5kaWRhdGUuY29ubmVjdGlvblN0cmF0ZWd5KSB8fCBNZXNzYWdlU3RyYXRlZ3kuaXMoY2FuZGlkYXRlLm1lc3NhZ2VTdHJhdGVneSkpO1xuICAgIH1cbiAgICBDb25uZWN0aW9uT3B0aW9ucy5pcyA9IGlzO1xufSkoQ29ubmVjdGlvbk9wdGlvbnMgfHwgKGV4cG9ydHMuQ29ubmVjdGlvbk9wdGlvbnMgPSBDb25uZWN0aW9uT3B0aW9ucyA9IHt9KSk7XG52YXIgQ29ubmVjdGlvblN0YXRlO1xuKGZ1bmN0aW9uIChDb25uZWN0aW9uU3RhdGUpIHtcbiAgICBDb25uZWN0aW9uU3RhdGVbQ29ubmVjdGlvblN0YXRlW1wiTmV3XCJdID0gMV0gPSBcIk5ld1wiO1xuICAgIENvbm5lY3Rpb25TdGF0ZVtDb25uZWN0aW9uU3RhdGVbXCJMaXN0ZW5pbmdcIl0gPSAyXSA9IFwiTGlzdGVuaW5nXCI7XG4gICAgQ29ubmVjdGlvblN0YXRlW0Nvbm5lY3Rpb25TdGF0ZVtcIkNsb3NlZFwiXSA9IDNdID0gXCJDbG9zZWRcIjtcbiAgICBDb25uZWN0aW9uU3RhdGVbQ29ubmVjdGlvblN0YXRlW1wiRGlzcG9zZWRcIl0gPSA0XSA9IFwiRGlzcG9zZWRcIjtcbn0pKENvbm5lY3Rpb25TdGF0ZSB8fCAoQ29ubmVjdGlvblN0YXRlID0ge30pKTtcbmZ1bmN0aW9uIGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uKG1lc3NhZ2VSZWFkZXIsIG1lc3NhZ2VXcml0ZXIsIF9sb2dnZXIsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBsb2dnZXIgPSBfbG9nZ2VyICE9PSB1bmRlZmluZWQgPyBfbG9nZ2VyIDogZXhwb3J0cy5OdWxsTG9nZ2VyO1xuICAgIGxldCBzZXF1ZW5jZU51bWJlciA9IDA7XG4gICAgbGV0IG5vdGlmaWNhdGlvblNlcXVlbmNlTnVtYmVyID0gMDtcbiAgICBsZXQgdW5rbm93blJlc3BvbnNlU2VxdWVuY2VOdW1iZXIgPSAwO1xuICAgIGNvbnN0IHZlcnNpb24gPSAnMi4wJztcbiAgICBsZXQgc3RhclJlcXVlc3RIYW5kbGVyID0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlcXVlc3RIYW5kbGVycyA9IG5ldyBNYXAoKTtcbiAgICBsZXQgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgY29uc3Qgbm90aWZpY2F0aW9uSGFuZGxlcnMgPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgcHJvZ3Jlc3NIYW5kbGVycyA9IG5ldyBNYXAoKTtcbiAgICBsZXQgdGltZXI7XG4gICAgbGV0IG1lc3NhZ2VRdWV1ZSA9IG5ldyBsaW5rZWRNYXBfMS5MaW5rZWRNYXAoKTtcbiAgICBsZXQgcmVzcG9uc2VQcm9taXNlcyA9IG5ldyBNYXAoKTtcbiAgICBsZXQga25vd25DYW5jZWxlZFJlcXVlc3RzID0gbmV3IFNldCgpO1xuICAgIGxldCByZXF1ZXN0VG9rZW5zID0gbmV3IE1hcCgpO1xuICAgIGxldCB0cmFjZSA9IFRyYWNlLk9mZjtcbiAgICBsZXQgdHJhY2VGb3JtYXQgPSBUcmFjZUZvcm1hdC5UZXh0O1xuICAgIGxldCB0cmFjZXI7XG4gICAgbGV0IHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLk5ldztcbiAgICBjb25zdCBlcnJvckVtaXR0ZXIgPSBuZXcgZXZlbnRzXzEuRW1pdHRlcigpO1xuICAgIGNvbnN0IGNsb3NlRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgdW5oYW5kbGVkTm90aWZpY2F0aW9uRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgdW5oYW5kbGVkUHJvZ3Jlc3NFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICBjb25zdCBkaXNwb3NlRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgY2FuY2VsbGF0aW9uU3RyYXRlZ3kgPSAob3B0aW9ucyAmJiBvcHRpb25zLmNhbmNlbGxhdGlvblN0cmF0ZWd5KSA/IG9wdGlvbnMuY2FuY2VsbGF0aW9uU3RyYXRlZ3kgOiBDYW5jZWxsYXRpb25TdHJhdGVneS5NZXNzYWdlO1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlcXVlc3RRdWV1ZUtleShpZCkge1xuICAgICAgICBpZiAoaWQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuJ3Qgc2VuZCByZXF1ZXN0cyB3aXRoIGlkIG51bGwgc2luY2UgdGhlIHJlc3BvbnNlIGNhbid0IGJlIGNvcnJlbGF0ZWQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdyZXEtJyArIGlkLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlc3BvbnNlUXVldWVLZXkoaWQpIHtcbiAgICAgICAgaWYgKGlkID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3Jlcy11bmtub3duLScgKyAoKyt1bmtub3duUmVzcG9uc2VTZXF1ZW5jZU51bWJlcikudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAncmVzLScgKyBpZC50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZU5vdGlmaWNhdGlvblF1ZXVlS2V5KCkge1xuICAgICAgICByZXR1cm4gJ25vdC0nICsgKCsrbm90aWZpY2F0aW9uU2VxdWVuY2VOdW1iZXIpLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFkZE1lc3NhZ2VUb1F1ZXVlKHF1ZXVlLCBtZXNzYWdlKSB7XG4gICAgICAgIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXF1ZXN0KG1lc3NhZ2UpKSB7XG4gICAgICAgICAgICBxdWV1ZS5zZXQoY3JlYXRlUmVxdWVzdFF1ZXVlS2V5KG1lc3NhZ2UuaWQpLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXNwb25zZShtZXNzYWdlKSkge1xuICAgICAgICAgICAgcXVldWUuc2V0KGNyZWF0ZVJlc3BvbnNlUXVldWVLZXkobWVzc2FnZS5pZCksIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcXVldWUuc2V0KGNyZWF0ZU5vdGlmaWNhdGlvblF1ZXVlS2V5KCksIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNhbmNlbFVuZGlzcGF0Y2hlZChfbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0xpc3RlbmluZygpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlID09PSBDb25uZWN0aW9uU3RhdGUuTGlzdGVuaW5nO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0Nsb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlID09PSBDb25uZWN0aW9uU3RhdGUuQ2xvc2VkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0Rpc3Bvc2VkKCkge1xuICAgICAgICByZXR1cm4gc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5EaXNwb3NlZDtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2xvc2VIYW5kbGVyKCkge1xuICAgICAgICBpZiAoc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5OZXcgfHwgc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5MaXN0ZW5pbmcpIHtcbiAgICAgICAgICAgIHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLkNsb3NlZDtcbiAgICAgICAgICAgIGNsb3NlRW1pdHRlci5maXJlKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlIGNvbm5lY3Rpb24gaXMgZGlzcG9zZWQgZG9uJ3Qgc2VudCBjbG9zZSBldmVudHMuXG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlYWRFcnJvckhhbmRsZXIoZXJyb3IpIHtcbiAgICAgICAgZXJyb3JFbWl0dGVyLmZpcmUoW2Vycm9yLCB1bmRlZmluZWQsIHVuZGVmaW5lZF0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiB3cml0ZUVycm9ySGFuZGxlcihkYXRhKSB7XG4gICAgICAgIGVycm9yRW1pdHRlci5maXJlKGRhdGEpO1xuICAgIH1cbiAgICBtZXNzYWdlUmVhZGVyLm9uQ2xvc2UoY2xvc2VIYW5kbGVyKTtcbiAgICBtZXNzYWdlUmVhZGVyLm9uRXJyb3IocmVhZEVycm9ySGFuZGxlcik7XG4gICAgbWVzc2FnZVdyaXRlci5vbkNsb3NlKGNsb3NlSGFuZGxlcik7XG4gICAgbWVzc2FnZVdyaXRlci5vbkVycm9yKHdyaXRlRXJyb3JIYW5kbGVyKTtcbiAgICBmdW5jdGlvbiB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCkge1xuICAgICAgICBpZiAodGltZXIgfHwgbWVzc2FnZVF1ZXVlLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aW1lciA9ICgwLCByYWxfMS5kZWZhdWx0KSgpLnRpbWVyLnNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICAgICAgICB0aW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHByb2Nlc3NNZXNzYWdlUXVldWUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGhhbmRsZU1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICBpZiAobWVzc2FnZXNfMS5NZXNzYWdlLmlzUmVxdWVzdChtZXNzYWdlKSkge1xuICAgICAgICAgICAgaGFuZGxlUmVxdWVzdChtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNOb3RpZmljYXRpb24obWVzc2FnZSkpIHtcbiAgICAgICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvbihtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXNwb25zZShtZXNzYWdlKSkge1xuICAgICAgICAgICAgaGFuZGxlUmVzcG9uc2UobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBoYW5kbGVJbnZhbGlkTWVzc2FnZShtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBwcm9jZXNzTWVzc2FnZVF1ZXVlKCkge1xuICAgICAgICBpZiAobWVzc2FnZVF1ZXVlLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXNzYWdlID0gbWVzc2FnZVF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlU3RyYXRlZ3kgPSBvcHRpb25zPy5tZXNzYWdlU3RyYXRlZ3k7XG4gICAgICAgICAgICBpZiAoTWVzc2FnZVN0cmF0ZWd5LmlzKG1lc3NhZ2VTdHJhdGVneSkpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlU3RyYXRlZ3kuaGFuZGxlTWVzc2FnZShtZXNzYWdlLCBoYW5kbGVNZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGhhbmRsZU1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgY2FsbGJhY2sgPSAobWVzc2FnZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2UgaGF2ZSByZWNlaXZlZCBhIGNhbmNlbGxhdGlvbiBtZXNzYWdlLiBDaGVjayBpZiB0aGUgbWVzc2FnZSBpcyBzdGlsbCBpbiB0aGUgcXVldWVcbiAgICAgICAgICAgIC8vIGFuZCBjYW5jZWwgaXQgaWYgYWxsb3dlZCB0byBkbyBzby5cbiAgICAgICAgICAgIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNOb3RpZmljYXRpb24obWVzc2FnZSkgJiYgbWVzc2FnZS5tZXRob2QgPT09IENhbmNlbE5vdGlmaWNhdGlvbi50eXBlLm1ldGhvZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbmNlbElkID0gbWVzc2FnZS5wYXJhbXMuaWQ7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gY3JlYXRlUmVxdWVzdFF1ZXVlS2V5KGNhbmNlbElkKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0b0NhbmNlbCA9IG1lc3NhZ2VRdWV1ZS5nZXQoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZXNfMS5NZXNzYWdlLmlzUmVxdWVzdCh0b0NhbmNlbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyYXRlZ3kgPSBvcHRpb25zPy5jb25uZWN0aW9uU3RyYXRlZ3k7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gKHN0cmF0ZWd5ICYmIHN0cmF0ZWd5LmNhbmNlbFVuZGlzcGF0Y2hlZCkgPyBzdHJhdGVneS5jYW5jZWxVbmRpc3BhdGNoZWQodG9DYW5jZWwsIGNhbmNlbFVuZGlzcGF0Y2hlZCkgOiBjYW5jZWxVbmRpc3BhdGNoZWQodG9DYW5jZWwpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgJiYgKHJlc3BvbnNlLmVycm9yICE9PSB1bmRlZmluZWQgfHwgcmVzcG9uc2UucmVzdWx0ICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUXVldWUuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLmRlbGV0ZShjYW5jZWxJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5pZCA9IHRvQ2FuY2VsLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VTZW5kaW5nUmVzcG9uc2UocmVzcG9uc2UsIG1lc3NhZ2UubWV0aG9kLCBEYXRlLm5vdygpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUocmVzcG9uc2UpLmNhdGNoKCgpID0+IGxvZ2dlci5lcnJvcihgU2VuZGluZyByZXNwb25zZSBmb3IgY2FuY2VsZWQgbWVzc2FnZSBmYWlsZWQuYCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGNhbmNlbGxhdGlvblRva2VuID0gcmVxdWVzdFRva2Vucy5nZXQoY2FuY2VsSWQpO1xuICAgICAgICAgICAgICAgIC8vIFRoZSByZXF1ZXN0IGlzIGFscmVhZHkgcnVubmluZy4gQ2FuY2VsIHRoZSB0b2tlblxuICAgICAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbmNlbGxhdGlvblRva2VuLmNhbmNlbCgpO1xuICAgICAgICAgICAgICAgICAgICB0cmFjZVJlY2VpdmVkTm90aWZpY2F0aW9uKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZW1lbWJlciB0aGUgY2FuY2VsIGJ1dCBzdGlsbCBxdWV1ZSB0aGUgbWVzc2FnZSB0b1xuICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbiB1cCBzdGF0ZSBpbiBwcm9jZXNzIG1lc3NhZ2UuXG4gICAgICAgICAgICAgICAgICAgIGtub3duQ2FuY2VsZWRSZXF1ZXN0cy5hZGQoY2FuY2VsSWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFkZE1lc3NhZ2VUb1F1ZXVlKG1lc3NhZ2VRdWV1ZSwgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGZ1bmN0aW9uIGhhbmRsZVJlcXVlc3QocmVxdWVzdE1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgLy8gd2UgcmV0dXJuIGhlcmUgc2lsZW50bHkgc2luY2Ugd2UgZmlyZWQgYW4gZXZlbnQgd2hlbiB0aGVcbiAgICAgICAgICAgIC8vIGNvbm5lY3Rpb24gZ290IGRpc3Bvc2VkLlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHJlcGx5KHJlc3VsdE9yRXJyb3IsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgaWQ6IHJlcXVlc3RNZXNzYWdlLmlkXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKHJlc3VsdE9yRXJyb3IgaW5zdGFuY2VvZiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlLmVycm9yID0gcmVzdWx0T3JFcnJvci50b0pzb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVzdWx0ID0gcmVzdWx0T3JFcnJvciA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHJlc3VsdE9yRXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cmFjZVNlbmRpbmdSZXNwb25zZShtZXNzYWdlLCBtZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICBtZXNzYWdlV3JpdGVyLndyaXRlKG1lc3NhZ2UpLmNhdGNoKCgpID0+IGxvZ2dlci5lcnJvcihgU2VuZGluZyByZXNwb25zZSBmYWlsZWQuYCkpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHJlcGx5RXJyb3IoZXJyb3IsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgaWQ6IHJlcXVlc3RNZXNzYWdlLmlkLFxuICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvci50b0pzb24oKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUobWVzc2FnZSkuY2F0Y2goKCkgPT4gbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlc3BvbnNlIGZhaWxlZC5gKSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gcmVwbHlTdWNjZXNzKHJlc3VsdCwgbWV0aG9kLCBzdGFydFRpbWUpIHtcbiAgICAgICAgICAgIC8vIFRoZSBKU09OIFJQQyBkZWZpbmVzIHRoYXQgYSByZXNwb25zZSBtdXN0IGVpdGhlciBoYXZlIGEgcmVzdWx0IG9yIGFuIGVycm9yXG4gICAgICAgICAgICAvLyBTbyB3ZSBjYW4ndCB0cmVhdCB1bmRlZmluZWQgYXMgYSB2YWxpZCByZXNwb25zZSByZXN1bHQuXG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgICAgICAgICAgICBqc29ucnBjOiB2ZXJzaW9uLFxuICAgICAgICAgICAgICAgIGlkOiByZXF1ZXN0TWVzc2FnZS5pZCxcbiAgICAgICAgICAgICAgICByZXN1bHQ6IHJlc3VsdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUobWVzc2FnZSkuY2F0Y2goKCkgPT4gbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlc3BvbnNlIGZhaWxlZC5gKSk7XG4gICAgICAgIH1cbiAgICAgICAgdHJhY2VSZWNlaXZlZFJlcXVlc3QocmVxdWVzdE1lc3NhZ2UpO1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gcmVxdWVzdEhhbmRsZXJzLmdldChyZXF1ZXN0TWVzc2FnZS5tZXRob2QpO1xuICAgICAgICBsZXQgdHlwZTtcbiAgICAgICAgbGV0IHJlcXVlc3RIYW5kbGVyO1xuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgdHlwZSA9IGVsZW1lbnQudHlwZTtcbiAgICAgICAgICAgIHJlcXVlc3RIYW5kbGVyID0gZWxlbWVudC5oYW5kbGVyO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIGlmIChyZXF1ZXN0SGFuZGxlciB8fCBzdGFyUmVxdWVzdEhhbmRsZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHRva2VuS2V5ID0gcmVxdWVzdE1lc3NhZ2UuaWQgPz8gU3RyaW5nKERhdGUubm93KCkpOyAvL1xuICAgICAgICAgICAgY29uc3QgY2FuY2VsbGF0aW9uU291cmNlID0gSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKGNhbmNlbGxhdGlvblN0cmF0ZWd5LnJlY2VpdmVyKVxuICAgICAgICAgICAgICAgID8gY2FuY2VsbGF0aW9uU3RyYXRlZ3kucmVjZWl2ZXIuY3JlYXRlQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UodG9rZW5LZXkpXG4gICAgICAgICAgICAgICAgOiBjYW5jZWxsYXRpb25TdHJhdGVneS5yZWNlaXZlci5jcmVhdGVDYW5jZWxsYXRpb25Ub2tlblNvdXJjZShyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICBpZiAocmVxdWVzdE1lc3NhZ2UuaWQgIT09IG51bGwgJiYga25vd25DYW5jZWxlZFJlcXVlc3RzLmhhcyhyZXF1ZXN0TWVzc2FnZS5pZCkpIHtcbiAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25Tb3VyY2UuY2FuY2VsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVxdWVzdE1lc3NhZ2UuaWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLnNldCh0b2tlbktleSwgY2FuY2VsbGF0aW9uU291cmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IGhhbmRsZXJSZXN1bHQ7XG4gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0TWVzc2FnZS5wYXJhbXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlLm51bWJlck9mUGFyYW1zICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1zLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyAke3R5cGUubnVtYmVyT2ZQYXJhbXN9IHBhcmFtcyBidXQgcmVjZWl2ZWQgbm9uZS5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJSZXN1bHQgPSByZXF1ZXN0SGFuZGxlcihjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVxdWVzdE1lc3NhZ2UucGFyYW1zKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlLnBhcmFtZXRlclN0cnVjdHVyZXMgPT09IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseUVycm9yKG5ldyBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IobWVzc2FnZXNfMS5FcnJvckNvZGVzLkludmFsaWRQYXJhbXMsIGBSZXF1ZXN0ICR7cmVxdWVzdE1lc3NhZ2UubWV0aG9kfSBkZWZpbmVzIHBhcmFtZXRlcnMgYnkgbmFtZSBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBwb3NpdGlvbmApLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlclJlc3VsdCA9IHJlcXVlc3RIYW5kbGVyKC4uLnJlcXVlc3RNZXNzYWdlLnBhcmFtcywgY2FuY2VsbGF0aW9uU291cmNlLnRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS5wYXJhbWV0ZXJTdHJ1Y3R1cmVzID09PSBtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW52YWxpZFBhcmFtcywgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGRlZmluZXMgcGFyYW1ldGVycyBieSBwb3NpdGlvbiBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBuYW1lYCksIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gcmVxdWVzdEhhbmRsZXIocmVxdWVzdE1lc3NhZ2UucGFyYW1zLCBjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0YXJSZXF1ZXN0SGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gc3RhclJlcXVlc3RIYW5kbGVyKHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgcmVxdWVzdE1lc3NhZ2UucGFyYW1zLCBjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBwcm9taXNlID0gaGFuZGxlclJlc3VsdDtcbiAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZXJSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFRva2Vucy5kZWxldGUodG9rZW5LZXkpO1xuICAgICAgICAgICAgICAgICAgICByZXBseVN1Y2Nlc3MoaGFuZGxlclJlc3VsdCwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwcm9taXNlLnRoZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS50aGVuKChyZXN1bHRPckVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLmRlbGV0ZSh0b2tlbktleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXBseShyZXN1bHRPckVycm9yLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IoZXJyb3IsIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVycm9yICYmIElzLnN0cmluZyhlcnJvci5tZXNzYWdlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGZhaWxlZCB3aXRoIG1lc3NhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZmFpbGVkIHVuZXhwZWN0ZWRseSB3aXRob3V0IHByb3ZpZGluZyBhbnkgZGV0YWlscy5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHkoaGFuZGxlclJlc3VsdCwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHkoZXJyb3IsIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZXJyb3IgJiYgSXMuc3RyaW5nKGVycm9yLm1lc3NhZ2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGZhaWxlZCB3aXRoIG1lc3NhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZmFpbGVkIHVuZXhwZWN0ZWRseSB3aXRob3V0IHByb3ZpZGluZyBhbnkgZGV0YWlscy5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuTWV0aG9kTm90Rm91bmQsIGBVbmhhbmRsZWQgbWV0aG9kICR7cmVxdWVzdE1lc3NhZ2UubWV0aG9kfWApLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlUmVzcG9uc2UocmVzcG9uc2VNZXNzYWdlKSB7XG4gICAgICAgIGlmIChpc0Rpc3Bvc2VkKCkpIHtcbiAgICAgICAgICAgIC8vIFNlZSBoYW5kbGUgcmVxdWVzdC5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzcG9uc2VNZXNzYWdlLmlkID09PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VNZXNzYWdlLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBSZWNlaXZlZCByZXNwb25zZSBtZXNzYWdlIHdpdGhvdXQgaWQ6IEVycm9yIGlzOiBcXG4ke0pTT04uc3RyaW5naWZ5KHJlc3BvbnNlTWVzc2FnZS5lcnJvciwgdW5kZWZpbmVkLCA0KX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgUmVjZWl2ZWQgcmVzcG9uc2UgbWVzc2FnZSB3aXRob3V0IGlkLiBObyBmdXJ0aGVyIGVycm9yIGluZm9ybWF0aW9uIHByb3ZpZGVkLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gcmVzcG9uc2VNZXNzYWdlLmlkO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VQcm9taXNlID0gcmVzcG9uc2VQcm9taXNlcy5nZXQoa2V5KTtcbiAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWRSZXNwb25zZShyZXNwb25zZU1lc3NhZ2UsIHJlc3BvbnNlUHJvbWlzZSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VQcm9taXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2VzLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZU1lc3NhZ2UuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gcmVzcG9uc2VNZXNzYWdlLmVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlLnJlamVjdChuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKGVycm9yLmNvZGUsIGVycm9yLm1lc3NhZ2UsIGVycm9yLmRhdGEpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXNwb25zZU1lc3NhZ2UucmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlTWVzc2FnZS5yZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgbmV2ZXIgaGFwcGVuLicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IubWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBSZXNwb25zZSBoYW5kbGVyICcke3Jlc3BvbnNlUHJvbWlzZS5tZXRob2R9JyBmYWlsZWQgd2l0aCBtZXNzYWdlOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYFJlc3BvbnNlIGhhbmRsZXIgJyR7cmVzcG9uc2VQcm9taXNlLm1ldGhvZH0nIGZhaWxlZCB1bmV4cGVjdGVkbHkuYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlTm90aWZpY2F0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgLy8gU2VlIGhhbmRsZSByZXF1ZXN0LlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0eXBlID0gdW5kZWZpbmVkO1xuICAgICAgICBsZXQgbm90aWZpY2F0aW9uSGFuZGxlcjtcbiAgICAgICAgaWYgKG1lc3NhZ2UubWV0aG9kID09PSBDYW5jZWxOb3RpZmljYXRpb24udHlwZS5tZXRob2QpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhbmNlbElkID0gbWVzc2FnZS5wYXJhbXMuaWQ7XG4gICAgICAgICAgICBrbm93bkNhbmNlbGVkUmVxdWVzdHMuZGVsZXRlKGNhbmNlbElkKTtcbiAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWROb3RpZmljYXRpb24obWVzc2FnZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gbm90aWZpY2F0aW9uSGFuZGxlcnMuZ2V0KG1lc3NhZ2UubWV0aG9kKTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uSGFuZGxlciA9IGVsZW1lbnQuaGFuZGxlcjtcbiAgICAgICAgICAgICAgICB0eXBlID0gZWxlbWVudC50eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChub3RpZmljYXRpb25IYW5kbGVyIHx8IHN0YXJOb3RpZmljYXRpb25IYW5kbGVyKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWROb3RpZmljYXRpb24obWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgaWYgKG5vdGlmaWNhdGlvbkhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UucGFyYW1zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5udW1iZXJPZlBhcmFtcyAhPT0gMCAmJiB0eXBlLnBhcmFtZXRlclN0cnVjdHVyZXMgIT09IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBOb3RpZmljYXRpb24gJHttZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyAke3R5cGUubnVtYmVyT2ZQYXJhbXN9IHBhcmFtcyBidXQgcmVjZWl2ZWQgbm9uZS5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShtZXNzYWdlLnBhcmFtcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGFyZSBKU09OLVJQQyBsaWJyYXJpZXMgdGhhdCBzZW5kIHByb2dyZXNzIG1lc3NhZ2UgYXMgcG9zaXRpb25hbCBwYXJhbXMgYWx0aG91Z2hcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpZmllZCBhcyBuYW1lZC4gU28gY29udmVydCB0aGVtIGlmIHRoaXMgaXMgdGhlIGNhc2UuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBtZXNzYWdlLnBhcmFtcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLm1ldGhvZCA9PT0gUHJvZ3Jlc3NOb3RpZmljYXRpb24udHlwZS5tZXRob2QgJiYgcGFyYW1zLmxlbmd0aCA9PT0gMiAmJiBQcm9ncmVzc1Rva2VuLmlzKHBhcmFtc1swXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKHsgdG9rZW46IHBhcmFtc1swXSwgdmFsdWU6IHBhcmFtc1sxXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUucGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBOb3RpZmljYXRpb24gJHttZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyBwYXJhbWV0ZXJzIGJ5IG5hbWUgYnV0IHJlY2VpdmVkIHBhcmFtZXRlcnMgYnkgcG9zaXRpb25gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5udW1iZXJPZlBhcmFtcyAhPT0gbWVzc2FnZS5wYXJhbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYE5vdGlmaWNhdGlvbiAke21lc3NhZ2UubWV0aG9kfSBkZWZpbmVzICR7dHlwZS5udW1iZXJPZlBhcmFtc30gcGFyYW1zIGJ1dCByZWNlaXZlZCAke3BhcmFtcy5sZW5ndGh9IGFyZ3VtZW50c2ApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXIoLi4ucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS5wYXJhbWV0ZXJTdHJ1Y3R1cmVzID09PSBtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgTm90aWZpY2F0aW9uICR7bWVzc2FnZS5tZXRob2R9IGRlZmluZXMgcGFyYW1ldGVycyBieSBwb3NpdGlvbiBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBuYW1lYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKG1lc3NhZ2UucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGFyTm90aWZpY2F0aW9uSGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICBzdGFyTm90aWZpY2F0aW9uSGFuZGxlcihtZXNzYWdlLm1ldGhvZCwgbWVzc2FnZS5wYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvci5tZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgTm90aWZpY2F0aW9uIGhhbmRsZXIgJyR7bWVzc2FnZS5tZXRob2R9JyBmYWlsZWQgd2l0aCBtZXNzYWdlOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYE5vdGlmaWNhdGlvbiBoYW5kbGVyICcke21lc3NhZ2UubWV0aG9kfScgZmFpbGVkIHVuZXhwZWN0ZWRseS5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1bmhhbmRsZWROb3RpZmljYXRpb25FbWl0dGVyLmZpcmUobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlSW52YWxpZE1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignUmVjZWl2ZWQgZW1wdHkgbWVzc2FnZS4nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsb2dnZXIuZXJyb3IoYFJlY2VpdmVkIG1lc3NhZ2Ugd2hpY2ggaXMgbmVpdGhlciBhIHJlc3BvbnNlIG5vciBhIG5vdGlmaWNhdGlvbiBtZXNzYWdlOlxcbiR7SlNPTi5zdHJpbmdpZnkobWVzc2FnZSwgbnVsbCwgNCl9YCk7XG4gICAgICAgIC8vIFRlc3Qgd2hldGhlciB3ZSBmaW5kIGFuIGlkIHRvIHJlamVjdCB0aGUgcHJvbWlzZVxuICAgICAgICBjb25zdCByZXNwb25zZU1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICBpZiAoSXMuc3RyaW5nKHJlc3BvbnNlTWVzc2FnZS5pZCkgfHwgSXMubnVtYmVyKHJlc3BvbnNlTWVzc2FnZS5pZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHJlc3BvbnNlTWVzc2FnZS5pZDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxlciA9IHJlc3BvbnNlUHJvbWlzZXMuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VIYW5kbGVyLnJlamVjdChuZXcgRXJyb3IoJ1RoZSByZWNlaXZlZCByZXNwb25zZSBoYXMgbmVpdGhlciBhIHJlc3VsdCBub3IgYW4gZXJyb3IgcHJvcGVydHkuJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0cmluZ2lmeVRyYWNlKHBhcmFtcykge1xuICAgICAgICBpZiAocGFyYW1zID09PSB1bmRlZmluZWQgfHwgcGFyYW1zID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAodHJhY2UpIHtcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuVmVyYm9zZTpcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGFyYW1zLCBudWxsLCA0KTtcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuQ29tcGFjdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGFyYW1zKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVNlbmRpbmdSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFjZUZvcm1hdCA9PT0gVHJhY2VGb3JtYXQuVGV4dCkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSAmJiBtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBgUGFyYW1zOiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucGFyYW1zKX1cXG5cXG5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJhY2VyLmxvZyhgU2VuZGluZyByZXF1ZXN0ICcke21lc3NhZ2UubWV0aG9kfSAtICgke21lc3NhZ2UuaWR9KScuYCwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb2dMU1BNZXNzYWdlKCdzZW5kLXJlcXVlc3QnLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVNlbmRpbmdOb3RpZmljYXRpb24obWVzc2FnZSkge1xuICAgICAgICBpZiAodHJhY2UgPT09IFRyYWNlLk9mZiB8fCAhdHJhY2VyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYWNlRm9ybWF0ID09PSBUcmFjZUZvcm1hdC5UZXh0KSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdCkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0gYFBhcmFtczogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLnBhcmFtcyl9XFxuXFxuYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSAnTm8gcGFyYW1ldGVycyBwcm92aWRlZC5cXG5cXG4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFNlbmRpbmcgbm90aWZpY2F0aW9uICcke21lc3NhZ2UubWV0aG9kfScuYCwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb2dMU1BNZXNzYWdlKCdzZW5kLW5vdGlmaWNhdGlvbicsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhY2VGb3JtYXQgPT09IFRyYWNlRm9ybWF0LlRleHQpIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZXJyb3IgJiYgbWVzc2FnZS5lcnJvci5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgRXJyb3IgZGF0YTogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLmVycm9yLmRhdGEpfVxcblxcbmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgUmVzdWx0OiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucmVzdWx0KX1cXG5cXG5gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UuZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9ICdObyByZXN1bHQgcmV0dXJuZWQuXFxuXFxuJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFNlbmRpbmcgcmVzcG9uc2UgJyR7bWV0aG9kfSAtICgke21lc3NhZ2UuaWR9KScuIFByb2Nlc3NpbmcgcmVxdWVzdCB0b29rICR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1tc2AsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgnc2VuZC1yZXNwb25zZScsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYWNlUmVjZWl2ZWRSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFjZUZvcm1hdCA9PT0gVHJhY2VGb3JtYXQuVGV4dCkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSAmJiBtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBgUGFyYW1zOiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucGFyYW1zKX1cXG5cXG5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJhY2VyLmxvZyhgUmVjZWl2ZWQgcmVxdWVzdCAnJHttZXNzYWdlLm1ldGhvZH0gLSAoJHttZXNzYWdlLmlkfSknLmAsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1yZXF1ZXN0JywgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdHJhY2VSZWNlaXZlZE5vdGlmaWNhdGlvbihtZXNzYWdlKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIgfHwgbWVzc2FnZS5tZXRob2QgPT09IExvZ1RyYWNlTm90aWZpY2F0aW9uLnR5cGUubWV0aG9kKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYWNlRm9ybWF0ID09PSBUcmFjZUZvcm1hdC5UZXh0KSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdCkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0gYFBhcmFtczogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLnBhcmFtcyl9XFxuXFxuYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSAnTm8gcGFyYW1ldGVycyBwcm92aWRlZC5cXG5cXG4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFJlY2VpdmVkIG5vdGlmaWNhdGlvbiAnJHttZXNzYWdlLm1ldGhvZH0nLmAsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1ub3RpZmljYXRpb24nLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVJlY2VpdmVkUmVzcG9uc2UobWVzc2FnZSwgcmVzcG9uc2VQcm9taXNlKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhY2VGb3JtYXQgPT09IFRyYWNlRm9ybWF0LlRleHQpIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZXJyb3IgJiYgbWVzc2FnZS5lcnJvci5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgRXJyb3IgZGF0YTogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLmVycm9yLmRhdGEpfVxcblxcbmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgUmVzdWx0OiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucmVzdWx0KX1cXG5cXG5gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UuZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9ICdObyByZXN1bHQgcmV0dXJuZWQuXFxuXFxuJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXNwb25zZVByb21pc2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IG1lc3NhZ2UuZXJyb3IgPyBgIFJlcXVlc3QgZmFpbGVkOiAke21lc3NhZ2UuZXJyb3IubWVzc2FnZX0gKCR7bWVzc2FnZS5lcnJvci5jb2RlfSkuYCA6ICcnO1xuICAgICAgICAgICAgICAgIHRyYWNlci5sb2coYFJlY2VpdmVkIHJlc3BvbnNlICcke3Jlc3BvbnNlUHJvbWlzZS5tZXRob2R9IC0gKCR7bWVzc2FnZS5pZH0pJyBpbiAke0RhdGUubm93KCkgLSByZXNwb25zZVByb21pc2UudGltZXJTdGFydH1tcy4ke2Vycm9yfWAsIGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJhY2VyLmxvZyhgUmVjZWl2ZWQgcmVzcG9uc2UgJHttZXNzYWdlLmlkfSB3aXRob3V0IGFjdGl2ZSByZXNwb25zZSBwcm9taXNlLmAsIGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1yZXNwb25zZScsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGxvZ0xTUE1lc3NhZ2UodHlwZSwgbWVzc2FnZSkge1xuICAgICAgICBpZiAoIXRyYWNlciB8fCB0cmFjZSA9PT0gVHJhY2UuT2ZmKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbHNwTWVzc2FnZSA9IHtcbiAgICAgICAgICAgIGlzTFNQTWVzc2FnZTogdHJ1ZSxcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpXG4gICAgICAgIH07XG4gICAgICAgIHRyYWNlci5sb2cobHNwTWVzc2FnZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRocm93SWZDbG9zZWRPckRpc3Bvc2VkKCkge1xuICAgICAgICBpZiAoaXNDbG9zZWQoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IENvbm5lY3Rpb25FcnJvcihDb25uZWN0aW9uRXJyb3JzLkNsb3NlZCwgJ0Nvbm5lY3Rpb24gaXMgY2xvc2VkLicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0Rpc3Bvc2VkKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb25uZWN0aW9uRXJyb3IoQ29ubmVjdGlvbkVycm9ycy5EaXNwb3NlZCwgJ0Nvbm5lY3Rpb24gaXMgZGlzcG9zZWQuJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdGhyb3dJZkxpc3RlbmluZygpIHtcbiAgICAgICAgaWYgKGlzTGlzdGVuaW5nKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb25uZWN0aW9uRXJyb3IoQ29ubmVjdGlvbkVycm9ycy5BbHJlYWR5TGlzdGVuaW5nLCAnQ29ubmVjdGlvbiBpcyBhbHJlYWR5IGxpc3RlbmluZycpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRocm93SWZOb3RMaXN0ZW5pbmcoKSB7XG4gICAgICAgIGlmICghaXNMaXN0ZW5pbmcoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYWxsIGxpc3RlbigpIGZpcnN0LicpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVuZGVmaW5lZFRvTnVsbChwYXJhbSkge1xuICAgICAgICBpZiAocGFyYW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyYW07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gbnVsbFRvVW5kZWZpbmVkKHBhcmFtKSB7XG4gICAgICAgIGlmIChwYXJhbSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJhbTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBpc05hbWVkUGFyYW0ocGFyYW0pIHtcbiAgICAgICAgcmV0dXJuIHBhcmFtICE9PSB1bmRlZmluZWQgJiYgcGFyYW0gIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkocGFyYW0pICYmIHR5cGVvZiBwYXJhbSA9PT0gJ29iamVjdCc7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXB1dGVTaW5nbGVQYXJhbShwYXJhbWV0ZXJTdHJ1Y3R1cmVzLCBwYXJhbSkge1xuICAgICAgICBzd2l0Y2ggKHBhcmFtZXRlclN0cnVjdHVyZXMpIHtcbiAgICAgICAgICAgIGNhc2UgbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG86XG4gICAgICAgICAgICAgICAgaWYgKGlzTmFtZWRQYXJhbShwYXJhbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxUb1VuZGVmaW5lZChwYXJhbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3VuZGVmaW5lZFRvTnVsbChwYXJhbSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZTpcbiAgICAgICAgICAgICAgICBpZiAoIWlzTmFtZWRQYXJhbShwYXJhbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWNlaXZlZCBwYXJhbWV0ZXJzIGJ5IG5hbWUgYnV0IHBhcmFtIGlzIG5vdCBhbiBvYmplY3QgbGl0ZXJhbC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGxUb1VuZGVmaW5lZChwYXJhbSk7XG4gICAgICAgICAgICBjYXNlIG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieVBvc2l0aW9uOlxuICAgICAgICAgICAgICAgIHJldHVybiBbdW5kZWZpbmVkVG9OdWxsKHBhcmFtKV07XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBwYXJhbWV0ZXIgc3RydWN0dXJlICR7cGFyYW1ldGVyU3RydWN0dXJlcy50b1N0cmluZygpfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXB1dGVNZXNzYWdlUGFyYW1zKHR5cGUsIHBhcmFtcykge1xuICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICBjb25zdCBudW1iZXJPZlBhcmFtcyA9IHR5cGUubnVtYmVyT2ZQYXJhbXM7XG4gICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gY29tcHV0ZVNpbmdsZVBhcmFtKHR5cGUucGFyYW1ldGVyU3RydWN0dXJlcywgcGFyYW1zWzBdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoICYmIGkgPCBudW1iZXJPZlBhcmFtczsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHVuZGVmaW5lZFRvTnVsbChwYXJhbXNbaV0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPCBudW1iZXJPZlBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gcGFyYW1zLmxlbmd0aDsgaSA8IG51bWJlck9mUGFyYW1zOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB7XG4gICAgICAgIHNlbmROb3RpZmljYXRpb246ICh0eXBlLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlUGFyYW1zO1xuICAgICAgICAgICAgaWYgKElzLnN0cmluZyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICAgIGxldCBwYXJhbVN0YXJ0ID0gMDtcbiAgICAgICAgICAgICAgICBsZXQgcGFyYW1ldGVyU3RydWN0dXJlcyA9IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvO1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuaXMoZmlyc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtU3RhcnQgPSAxO1xuICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gZmlyc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBwYXJhbUVuZCA9IGFyZ3MubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gcGFyYW1FbmQgLSBwYXJhbVN0YXJ0O1xuICAgICAgICAgICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zID0gY29tcHV0ZVNpbmdsZVBhcmFtKHBhcmFtZXRlclN0cnVjdHVyZXMsIGFyZ3NbcGFyYW1TdGFydF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjZWl2ZWQgJHtudW1iZXJPZlBhcmFtc30gcGFyYW1ldGVycyBmb3IgJ2J5IE5hbWUnIG5vdGlmaWNhdGlvbiBwYXJhbWV0ZXIgc3RydWN0dXJlLmApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IGFyZ3Muc2xpY2UocGFyYW1TdGFydCwgcGFyYW1FbmQpLm1hcCh2YWx1ZSA9PiB1bmRlZmluZWRUb051bGwodmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IGFyZ3M7XG4gICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZS5tZXRob2Q7XG4gICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IGNvbXB1dGVNZXNzYWdlUGFyYW1zKHR5cGUsIHBhcmFtcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBub3RpZmljYXRpb25NZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBtZXNzYWdlUGFyYW1zXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdHJhY2VTZW5kaW5nTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbk1lc3NhZ2UpO1xuICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2VXcml0ZXIud3JpdGUobm90aWZpY2F0aW9uTWVzc2FnZSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBTZW5kaW5nIG5vdGlmaWNhdGlvbiBmYWlsZWQuYCk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25Ob3RpZmljYXRpb246ICh0eXBlLCBoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGlmIChJcy5mdW5jKHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB0eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaGFuZGxlcikge1xuICAgICAgICAgICAgICAgIGlmIChJcy5zdHJpbmcodHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZTtcbiAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uSGFuZGxlcnMuc2V0KHR5cGUsIHsgdHlwZTogdW5kZWZpbmVkLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZS5tZXRob2Q7XG4gICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXJzLnNldCh0eXBlLm1ldGhvZCwgeyB0eXBlLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXJzLmRlbGV0ZShtZXRob2QpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBvblByb2dyZXNzOiAoX3R5cGUsIHRva2VuLCBoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgICBpZiAocHJvZ3Jlc3NIYW5kbGVycy5oYXModG9rZW4pKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm9ncmVzcyBoYW5kbGVyIGZvciB0b2tlbiAke3Rva2VufSBhbHJlYWR5IHJlZ2lzdGVyZWRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByb2dyZXNzSGFuZGxlcnMuc2V0KHRva2VuLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc0hhbmRsZXJzLmRlbGV0ZSh0b2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgc2VuZFByb2dyZXNzOiAoX3R5cGUsIHRva2VuLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGF3YWl0IGJ1dCBzaW1wbGUgcmV0dXJuIHRvIGVuc3VyZSB0aGF0IHdlIGRvbid0IGhhdmUgYW5vdGhlclxuICAgICAgICAgICAgLy8gYXN5bmMgc2NoZWR1bGluZy4gT3RoZXJ3aXNlIG9uZSBzZW5kIGNvdWxkIG92ZXJ0YWtlIGFub3RoZXIgc2VuZC5cbiAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLnNlbmROb3RpZmljYXRpb24oUHJvZ3Jlc3NOb3RpZmljYXRpb24udHlwZSwgeyB0b2tlbiwgdmFsdWUgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uVW5oYW5kbGVkUHJvZ3Jlc3M6IHVuaGFuZGxlZFByb2dyZXNzRW1pdHRlci5ldmVudCxcbiAgICAgICAgc2VuZFJlcXVlc3Q6ICh0eXBlLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgdGhyb3dJZk5vdExpc3RlbmluZygpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlUGFyYW1zO1xuICAgICAgICAgICAgbGV0IHRva2VuID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKElzLnN0cmluZyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3QgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgbGV0IHBhcmFtU3RhcnQgPSAwO1xuICAgICAgICAgICAgICAgIGxldCBwYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG87XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5pcyhmaXJzdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1TdGFydCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlclN0cnVjdHVyZXMgPSBmaXJzdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHBhcmFtRW5kID0gYXJncy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuLmlzKGxhc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtRW5kID0gcGFyYW1FbmQgLSAxO1xuICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IGxhc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gcGFyYW1FbmQgLSBwYXJhbVN0YXJ0O1xuICAgICAgICAgICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zID0gY29tcHV0ZVNpbmdsZVBhcmFtKHBhcmFtZXRlclN0cnVjdHVyZXMsIGFyZ3NbcGFyYW1TdGFydF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjZWl2ZWQgJHtudW1iZXJPZlBhcmFtc30gcGFyYW1ldGVycyBmb3IgJ2J5IE5hbWUnIHJlcXVlc3QgcGFyYW1ldGVyIHN0cnVjdHVyZS5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMgPSBhcmdzLnNsaWNlKHBhcmFtU3RhcnQsIHBhcmFtRW5kKS5tYXAodmFsdWUgPT4gdW5kZWZpbmVkVG9OdWxsKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBhcmdzO1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGUubWV0aG9kO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMgPSBjb21wdXRlTWVzc2FnZVBhcmFtcyh0eXBlLCBwYXJhbXMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gdHlwZS5udW1iZXJPZlBhcmFtcztcbiAgICAgICAgICAgICAgICB0b2tlbiA9IGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuLmlzKHBhcmFtc1tudW1iZXJPZlBhcmFtc10pID8gcGFyYW1zW251bWJlck9mUGFyYW1zXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGlkID0gc2VxdWVuY2VOdW1iZXIrKztcbiAgICAgICAgICAgIGxldCBkaXNwb3NhYmxlO1xuICAgICAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgICAgICAgZGlzcG9zYWJsZSA9IHRva2VuLm9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcCA9IGNhbmNlbGxhdGlvblN0cmF0ZWd5LnNlbmRlci5zZW5kQ2FuY2VsbGF0aW9uKGNvbm5lY3Rpb24sIGlkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhgUmVjZWl2ZWQgbm8gcHJvbWlzZSBmcm9tIGNhbmNlbGxhdGlvbiBzdHJhdGVneSB3aGVuIGNhbmNlbGxpbmcgaWQgJHtpZH1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIubG9nKGBTZW5kaW5nIGNhbmNlbGxhdGlvbiBtZXNzYWdlcyBmb3IgaWQgJHtpZH0gZmFpbGVkYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdE1lc3NhZ2UgPSB7XG4gICAgICAgICAgICAgICAganNvbnJwYzogdmVyc2lvbixcbiAgICAgICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBtZXNzYWdlUGFyYW1zXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdHJhY2VTZW5kaW5nUmVxdWVzdChyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNhbmNlbGxhdGlvblN0cmF0ZWd5LnNlbmRlci5lbmFibGVDYW5jZWxsYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25TdHJhdGVneS5zZW5kZXIuZW5hYmxlQ2FuY2VsbGF0aW9uKHJlcXVlc3RNZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZVdpdGhDbGVhbnVwID0gKHIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyKTtcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uU3RyYXRlZ3kuc2VuZGVyLmNsZWFudXAoaWQpO1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlPy5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWplY3RXaXRoQ2xlYW51cCA9IChyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChyKTtcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uU3RyYXRlZ3kuc2VuZGVyLmNsZWFudXAoaWQpO1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlPy5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZVByb21pc2UgPSB7IG1ldGhvZDogbWV0aG9kLCB0aW1lclN0YXJ0OiBEYXRlLm5vdygpLCByZXNvbHZlOiByZXNvbHZlV2l0aENsZWFudXAsIHJlamVjdDogcmVqZWN0V2l0aENsZWFudXAgfTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2VzLnNldChpZCwgcmVzcG9uc2VQcm9taXNlKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbWVzc2FnZVdyaXRlci53cml0ZShyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAvLyBXcml0aW5nIHRoZSBtZXNzYWdlIGZhaWxlZC4gU28gd2UgbmVlZCB0byBkZWxldGUgaXQgZnJvbSB0aGUgcmVzcG9uc2UgcHJvbWlzZXMgYW5kXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlamVjdCBpdC5cbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlcy5kZWxldGUoaWQpO1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2UucmVqZWN0KG5ldyBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IobWVzc2FnZXNfMS5FcnJvckNvZGVzLk1lc3NhZ2VXcml0ZUVycm9yLCBlcnJvci5tZXNzYWdlID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIHJlYXNvbicpKTtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlcXVlc3QgZmFpbGVkLmApO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25SZXF1ZXN0OiAodHlwZSwgaGFuZGxlcikgPT4ge1xuICAgICAgICAgICAgdGhyb3dJZkNsb3NlZE9yRGlzcG9zZWQoKTtcbiAgICAgICAgICAgIGxldCBtZXRob2QgPSBudWxsO1xuICAgICAgICAgICAgaWYgKFN0YXJSZXF1ZXN0SGFuZGxlci5pcyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBzdGFyUmVxdWVzdEhhbmRsZXIgPSB0eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoSXMuc3RyaW5nKHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgbWV0aG9kID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoaGFuZGxlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RIYW5kbGVycy5zZXQodHlwZSwgeyBoYW5kbGVyOiBoYW5kbGVyLCB0eXBlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSB0eXBlLm1ldGhvZDtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEhhbmRsZXJzLnNldCh0eXBlLm1ldGhvZCwgeyB0eXBlLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SGFuZGxlcnMuZGVsZXRlKG1ldGhvZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFyUmVxdWVzdEhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBoYXNQZW5kaW5nUmVzcG9uc2U6ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZVByb21pc2VzLnNpemUgPiAwO1xuICAgICAgICB9LFxuICAgICAgICB0cmFjZTogYXN5bmMgKF92YWx1ZSwgX3RyYWNlciwgc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBsZXQgX3NlbmROb3RpZmljYXRpb24gPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBfdHJhY2VGb3JtYXQgPSBUcmFjZUZvcm1hdC5UZXh0O1xuICAgICAgICAgICAgaWYgKHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKElzLmJvb2xlYW4oc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zKSkge1xuICAgICAgICAgICAgICAgICAgICBfc2VuZE5vdGlmaWNhdGlvbiA9IHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF9zZW5kTm90aWZpY2F0aW9uID0gc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zLnNlbmROb3RpZmljYXRpb24gfHwgZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIF90cmFjZUZvcm1hdCA9IHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucy50cmFjZUZvcm1hdCB8fCBUcmFjZUZvcm1hdC5UZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlID0gX3ZhbHVlO1xuICAgICAgICAgICAgdHJhY2VGb3JtYXQgPSBfdHJhY2VGb3JtYXQ7XG4gICAgICAgICAgICBpZiAodHJhY2UgPT09IFRyYWNlLk9mZikge1xuICAgICAgICAgICAgICAgIHRyYWNlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRyYWNlciA9IF90cmFjZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoX3NlbmROb3RpZmljYXRpb24gJiYgIWlzQ2xvc2VkKCkgJiYgIWlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGNvbm5lY3Rpb24uc2VuZE5vdGlmaWNhdGlvbihTZXRUcmFjZU5vdGlmaWNhdGlvbi50eXBlLCB7IHZhbHVlOiBUcmFjZS50b1N0cmluZyhfdmFsdWUpIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBvbkVycm9yOiBlcnJvckVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIG9uQ2xvc2U6IGNsb3NlRW1pdHRlci5ldmVudCxcbiAgICAgICAgb25VbmhhbmRsZWROb3RpZmljYXRpb246IHVuaGFuZGxlZE5vdGlmaWNhdGlvbkVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIG9uRGlzcG9zZTogZGlzcG9zZUVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIGVuZDogKCkgPT4ge1xuICAgICAgICAgICAgbWVzc2FnZVdyaXRlci5lbmQoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLkRpc3Bvc2VkO1xuICAgICAgICAgICAgZGlzcG9zZUVtaXR0ZXIuZmlyZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5QZW5kaW5nUmVzcG9uc2VSZWplY3RlZCwgJ1BlbmRpbmcgcmVzcG9uc2UgcmVqZWN0ZWQgc2luY2UgY29ubmVjdGlvbiBnb3QgZGlzcG9zZWQnKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvbWlzZSBvZiByZXNwb25zZVByb21pc2VzLnZhbHVlcygpKSB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBrbm93bkNhbmNlbGVkUmVxdWVzdHMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICBtZXNzYWdlUXVldWUgPSBuZXcgbGlua2VkTWFwXzEuTGlua2VkTWFwKCk7XG4gICAgICAgICAgICAvLyBUZXN0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgaWYgKElzLmZ1bmMobWVzc2FnZVdyaXRlci5kaXNwb3NlKSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKElzLmZ1bmMobWVzc2FnZVJlYWRlci5kaXNwb3NlKSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VSZWFkZXIuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBsaXN0ZW46ICgpID0+IHtcbiAgICAgICAgICAgIHRocm93SWZDbG9zZWRPckRpc3Bvc2VkKCk7XG4gICAgICAgICAgICB0aHJvd0lmTGlzdGVuaW5nKCk7XG4gICAgICAgICAgICBzdGF0ZSA9IENvbm5lY3Rpb25TdGF0ZS5MaXN0ZW5pbmc7XG4gICAgICAgICAgICBtZXNzYWdlUmVhZGVyLmxpc3RlbihjYWxsYmFjayk7XG4gICAgICAgIH0sXG4gICAgICAgIGluc3BlY3Q6ICgpID0+IHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS5jb25zb2xlLmxvZygnaW5zcGVjdCcpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25uZWN0aW9uLm9uTm90aWZpY2F0aW9uKExvZ1RyYWNlTm90aWZpY2F0aW9uLnR5cGUsIChwYXJhbXMpID0+IHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZlcmJvc2UgPSB0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdDtcbiAgICAgICAgdHJhY2VyLmxvZyhwYXJhbXMubWVzc2FnZSwgdmVyYm9zZSA/IHBhcmFtcy52ZXJib3NlIDogdW5kZWZpbmVkKTtcbiAgICB9KTtcbiAgICBjb25uZWN0aW9uLm9uTm90aWZpY2F0aW9uKFByb2dyZXNzTm90aWZpY2F0aW9uLnR5cGUsIChwYXJhbXMpID0+IHtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IHByb2dyZXNzSGFuZGxlcnMuZ2V0KHBhcmFtcy50b2tlbik7XG4gICAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICAgICBoYW5kbGVyKHBhcmFtcy52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1bmhhbmRsZWRQcm9ncmVzc0VtaXR0ZXIuZmlyZShwYXJhbXMpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbm5lY3Rpb247XG59XG5leHBvcnRzLmNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uID0gY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb247XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vdHlwaW5ncy90aGVuYWJsZS5kLnRzXCIgLz5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUHJvZ3Jlc3NUeXBlID0gZXhwb3J0cy5Qcm9ncmVzc1Rva2VuID0gZXhwb3J0cy5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiA9IGV4cG9ydHMuTnVsbExvZ2dlciA9IGV4cG9ydHMuQ29ubmVjdGlvbk9wdGlvbnMgPSBleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IGV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlQnVmZmVyID0gZXhwb3J0cy5Xcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyID0gZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLk1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLlJlYWRhYmxlU3RyZWFtTWVzc2FnZVJlYWRlciA9IGV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlUmVhZGVyID0gZXhwb3J0cy5NZXNzYWdlUmVhZGVyID0gZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblRva2VuID0gZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IGV4cG9ydHMuRW1pdHRlciA9IGV4cG9ydHMuRXZlbnQgPSBleHBvcnRzLkRpc3Bvc2FibGUgPSBleHBvcnRzLkxSVUNhY2hlID0gZXhwb3J0cy5Ub3VjaCA9IGV4cG9ydHMuTGlua2VkTWFwID0gZXhwb3J0cy5QYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlOSA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTggPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU3ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNiA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTUgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU0ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMyA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTIgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUxID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMCA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZSA9IGV4cG9ydHMuRXJyb3JDb2RlcyA9IGV4cG9ydHMuUmVzcG9uc2VFcnJvciA9IGV4cG9ydHMuUmVxdWVzdFR5cGU5ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTggPSBleHBvcnRzLlJlcXVlc3RUeXBlNyA9IGV4cG9ydHMuUmVxdWVzdFR5cGU2ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTUgPSBleHBvcnRzLlJlcXVlc3RUeXBlNCA9IGV4cG9ydHMuUmVxdWVzdFR5cGUzID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTIgPSBleHBvcnRzLlJlcXVlc3RUeXBlMSA9IGV4cG9ydHMuUmVxdWVzdFR5cGUwID0gZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IGV4cG9ydHMuTWVzc2FnZSA9IGV4cG9ydHMuUkFMID0gdm9pZCAwO1xuZXhwb3J0cy5NZXNzYWdlU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblN0cmF0ZWd5ID0gZXhwb3J0cy5DYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IGV4cG9ydHMuQ29ubmVjdGlvbkVycm9yID0gZXhwb3J0cy5Db25uZWN0aW9uRXJyb3JzID0gZXhwb3J0cy5Mb2dUcmFjZU5vdGlmaWNhdGlvbiA9IGV4cG9ydHMuU2V0VHJhY2VOb3RpZmljYXRpb24gPSBleHBvcnRzLlRyYWNlRm9ybWF0ID0gZXhwb3J0cy5UcmFjZVZhbHVlcyA9IGV4cG9ydHMuVHJhY2UgPSB2b2lkIDA7XG5jb25zdCBtZXNzYWdlc18xID0gcmVxdWlyZShcIi4vbWVzc2FnZXNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNZXNzYWdlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk1lc3NhZ2U7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlMFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTA7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTFcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGUxOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGUyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlMjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlM1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGU0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGU1XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlNTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlNlwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTY7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTdcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGU3OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGU4XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlODsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlOVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTk7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXNwb25zZUVycm9yXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3I7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJFcnJvckNvZGVzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLkVycm9yQ29kZXM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlMFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlMDsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGUxXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGUxOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZTJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlM1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlMzsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGU0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZTVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlNlwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlNjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGU3XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU3OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZThcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTg7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlOVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlOTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlBhcmFtZXRlclN0cnVjdHVyZXNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlczsgfSB9KTtcbmNvbnN0IGxpbmtlZE1hcF8xID0gcmVxdWlyZShcIi4vbGlua2VkTWFwXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTGlua2VkTWFwXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBsaW5rZWRNYXBfMS5MaW5rZWRNYXA7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJMUlVDYWNoZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbGlua2VkTWFwXzEuTFJVQ2FjaGU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJUb3VjaFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbGlua2VkTWFwXzEuVG91Y2g7IH0gfSk7XG5jb25zdCBkaXNwb3NhYmxlXzEgPSByZXF1aXJlKFwiLi9kaXNwb3NhYmxlXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiRGlzcG9zYWJsZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZGlzcG9zYWJsZV8xLkRpc3Bvc2FibGU7IH0gfSk7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCIuL2V2ZW50c1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkV2ZW50XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBldmVudHNfMS5FdmVudDsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkVtaXR0ZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGV2ZW50c18xLkVtaXR0ZXI7IH0gfSk7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblRva2VuU291cmNlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjYW5jZWxsYXRpb25fMS5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblRva2VuXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjYW5jZWxsYXRpb25fMS5DYW5jZWxsYXRpb25Ub2tlbjsgfSB9KTtcbmNvbnN0IHNoYXJlZEFycmF5Q2FuY2VsbGF0aW9uXzEgPSByZXF1aXJlKFwiLi9zaGFyZWRBcnJheUNhbmNlbGxhdGlvblwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHNoYXJlZEFycmF5Q2FuY2VsbGF0aW9uXzEuU2hhcmVkQXJyYXlTZW5kZXJTdHJhdGVneTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlNoYXJlZEFycmF5UmVjZWl2ZXJTdHJhdGVneVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gc2hhcmVkQXJyYXlDYW5jZWxsYXRpb25fMS5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3k7IH0gfSk7XG5jb25zdCBtZXNzYWdlUmVhZGVyXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlUmVhZGVyXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTWVzc2FnZVJlYWRlclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZVJlYWRlcl8xLk1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VSZWFkZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VSZWFkZXJfMS5BYnN0cmFjdE1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VSZWFkZXJfMS5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5jb25zdCBtZXNzYWdlV3JpdGVyXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlV3JpdGVyXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTWVzc2FnZVdyaXRlclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZVdyaXRlcl8xLk1lc3NhZ2VXcml0ZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VXcml0ZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VXcml0ZXJfMS5BYnN0cmFjdE1lc3NhZ2VXcml0ZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJXcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlV3JpdGVyXzEuV3JpdGVhYmxlU3RyZWFtTWVzc2FnZVdyaXRlcjsgfSB9KTtcbmNvbnN0IG1lc3NhZ2VCdWZmZXJfMSA9IHJlcXVpcmUoXCIuL21lc3NhZ2VCdWZmZXJcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VCdWZmZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VCdWZmZXJfMS5BYnN0cmFjdE1lc3NhZ2VCdWZmZXI7IH0gfSk7XG5jb25zdCBjb25uZWN0aW9uXzEgPSByZXF1aXJlKFwiLi9jb25uZWN0aW9uXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29ubmVjdGlvblN0cmF0ZWd5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ29ubmVjdGlvblN0cmF0ZWd5OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29ubmVjdGlvbk9wdGlvbnNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5Db25uZWN0aW9uT3B0aW9uczsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk51bGxMb2dnZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5OdWxsTG9nZ2VyOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb25cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlByb2dyZXNzVG9rZW5cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5Qcm9ncmVzc1Rva2VuOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUHJvZ3Jlc3NUeXBlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuUHJvZ3Jlc3NUeXBlOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiVHJhY2VcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5UcmFjZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlRyYWNlVmFsdWVzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuVHJhY2VWYWx1ZXM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJUcmFjZUZvcm1hdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29ubmVjdGlvbl8xLlRyYWNlRm9ybWF0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiU2V0VHJhY2VOb3RpZmljYXRpb25cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5TZXRUcmFjZU5vdGlmaWNhdGlvbjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkxvZ1RyYWNlTm90aWZpY2F0aW9uXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuTG9nVHJhY2VOb3RpZmljYXRpb247IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJDb25uZWN0aW9uRXJyb3JzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ29ubmVjdGlvbkVycm9yczsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNvbm5lY3Rpb25FcnJvclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29ubmVjdGlvbl8xLkNvbm5lY3Rpb25FcnJvcjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5DYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5DYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblN0cmF0ZWd5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ2FuY2VsbGF0aW9uU3RyYXRlZ3k7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNZXNzYWdlU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5NZXNzYWdlU3RyYXRlZ3k7IH0gfSk7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbmV4cG9ydHMuUkFMID0gcmFsXzEuZGVmYXVsdDtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGFwaV8xID0gcmVxdWlyZShcIi4uL2NvbW1vbi9hcGlcIik7XG5jbGFzcyBNZXNzYWdlQnVmZmVyIGV4dGVuZHMgYXBpXzEuQWJzdHJhY3RNZXNzYWdlQnVmZmVyIHtcbiAgICBjb25zdHJ1Y3RvcihlbmNvZGluZyA9ICd1dGYtOCcpIHtcbiAgICAgICAgc3VwZXIoZW5jb2RpbmcpO1xuICAgICAgICB0aGlzLmFzY2lpRGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcignYXNjaWknKTtcbiAgICB9XG4gICAgZW1wdHlCdWZmZXIoKSB7XG4gICAgICAgIHJldHVybiBNZXNzYWdlQnVmZmVyLmVtcHR5QnVmZmVyO1xuICAgIH1cbiAgICBmcm9tU3RyaW5nKHZhbHVlLCBfZW5jb2RpbmcpIHtcbiAgICAgICAgcmV0dXJuIChuZXcgVGV4dEVuY29kZXIoKSkuZW5jb2RlKHZhbHVlKTtcbiAgICB9XG4gICAgdG9TdHJpbmcodmFsdWUsIGVuY29kaW5nKSB7XG4gICAgICAgIGlmIChlbmNvZGluZyA9PT0gJ2FzY2lpJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXNjaWlEZWNvZGVyLmRlY29kZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gKG5ldyBUZXh0RGVjb2RlcihlbmNvZGluZykpLmRlY29kZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXNOYXRpdmUoYnVmZmVyLCBsZW5ndGgpIHtcbiAgICAgICAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlci5zbGljZSgwLCBsZW5ndGgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFsbG9jTmF0aXZlKGxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTtcbiAgICB9XG59XG5NZXNzYWdlQnVmZmVyLmVtcHR5QnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMCk7XG5jbGFzcyBSZWFkYWJsZVN0cmVhbVdyYXBwZXIge1xuICAgIGNvbnN0cnVjdG9yKHNvY2tldCkge1xuICAgICAgICB0aGlzLnNvY2tldCA9IHNvY2tldDtcbiAgICAgICAgdGhpcy5fb25EYXRhID0gbmV3IGFwaV8xLkVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5fbWVzc2FnZUxpc3RlbmVyID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBibG9iID0gZXZlbnQuZGF0YTtcbiAgICAgICAgICAgIGJsb2IuYXJyYXlCdWZmZXIoKS50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkRhdGEuZmlyZShuZXcgVWludDhBcnJheShidWZmZXIpKTtcbiAgICAgICAgICAgIH0sICgpID0+IHtcbiAgICAgICAgICAgICAgICAoMCwgYXBpXzEuUkFMKSgpLmNvbnNvbGUuZXJyb3IoYENvbnZlcnRpbmcgYmxvYiB0byBhcnJheSBidWZmZXIgZmFpbGVkLmApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLl9tZXNzYWdlTGlzdGVuZXIpO1xuICAgIH1cbiAgICBvbkNsb3NlKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2Nsb3NlJywgbGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gYXBpXzEuRGlzcG9zYWJsZS5jcmVhdGUoKCkgPT4gdGhpcy5zb2NrZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xvc2UnLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkVycm9yKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgbGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gYXBpXzEuRGlzcG9zYWJsZS5jcmVhdGUoKCkgPT4gdGhpcy5zb2NrZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkVuZChsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKCdlbmQnLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdlbmQnLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkRhdGEobGlzdGVuZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uRGF0YS5ldmVudChsaXN0ZW5lcik7XG4gICAgfVxufVxuY2xhc3MgV3JpdGFibGVTdHJlYW1XcmFwcGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihzb2NrZXQpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7XG4gICAgfVxuICAgIG9uQ2xvc2UobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignY2xvc2UnLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbG9zZScsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIG9uRXJyb3IobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIG9uRW5kKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2VuZCcsIGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIGFwaV8xLkRpc3Bvc2FibGUuY3JlYXRlKCgpID0+IHRoaXMuc29ja2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2VuZCcsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIHdyaXRlKGRhdGEsIGVuY29kaW5nKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkICYmIGVuY29kaW5nICE9PSAndXRmLTgnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbiBhIEJyb3dzZXIgZW52aXJvbm1lbnRzIG9ubHkgdXRmLTggdGV4dCBlbmNvZGluZyBpcyBzdXBwb3J0ZWQuIEJ1dCBnb3QgZW5jb2Rpbmc6ICR7ZW5jb2Rpbmd9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKTtcbiAgICB9XG59XG5jb25zdCBfdGV4dEVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbmNvbnN0IF9yaWwgPSBPYmplY3QuZnJlZXplKHtcbiAgICBtZXNzYWdlQnVmZmVyOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgY3JlYXRlOiAoZW5jb2RpbmcpID0+IG5ldyBNZXNzYWdlQnVmZmVyKGVuY29kaW5nKVxuICAgIH0pLFxuICAgIGFwcGxpY2F0aW9uSnNvbjogT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGVuY29kZXI6IE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgbmFtZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgZW5jb2RlOiAobXNnLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2hhcnNldCAhPT0gJ3V0Zi04Jykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluIGEgQnJvd3NlciBlbnZpcm9ubWVudHMgb25seSB1dGYtOCB0ZXh0IGVuY29kaW5nIGlzIHN1cHBvcnRlZC4gQnV0IGdvdCBlbmNvZGluZzogJHtvcHRpb25zLmNoYXJzZXR9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoX3RleHRFbmNvZGVyLmVuY29kZShKU09OLnN0cmluZ2lmeShtc2csIHVuZGVmaW5lZCwgMCkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIGRlY29kZXI6IE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgbmFtZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgZGVjb2RlOiAoYnVmZmVyLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCEoYnVmZmVyIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbiBhIEJyb3dzZXIgZW52aXJvbm1lbnRzIG9ubHkgVWludDhBcnJheXMgYXJlIHN1cHBvcnRlZC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShKU09OLnBhcnNlKG5ldyBUZXh0RGVjb2RlcihvcHRpb25zLmNoYXJzZXQpLmRlY29kZShidWZmZXIpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfSksXG4gICAgc3RyZWFtOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgYXNSZWFkYWJsZVN0cmVhbTogKHNvY2tldCkgPT4gbmV3IFJlYWRhYmxlU3RyZWFtV3JhcHBlcihzb2NrZXQpLFxuICAgICAgICBhc1dyaXRhYmxlU3RyZWFtOiAoc29ja2V0KSA9PiBuZXcgV3JpdGFibGVTdHJlYW1XcmFwcGVyKHNvY2tldClcbiAgICB9KSxcbiAgICBjb25zb2xlOiBjb25zb2xlLFxuICAgIHRpbWVyOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgc2V0VGltZW91dChjYWxsYmFjaywgbXMsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHNldFRpbWVvdXQoY2FsbGJhY2ssIG1zLCAuLi5hcmdzKTtcbiAgICAgICAgICAgIHJldHVybiB7IGRpc3Bvc2U6ICgpID0+IGNsZWFyVGltZW91dChoYW5kbGUpIH07XG4gICAgICAgIH0sXG4gICAgICAgIHNldEltbWVkaWF0ZShjYWxsYmFjaywgLi4uYXJncykge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gc2V0VGltZW91dChjYWxsYmFjaywgMCwgLi4uYXJncyk7XG4gICAgICAgICAgICByZXR1cm4geyBkaXNwb3NlOiAoKSA9PiBjbGVhclRpbWVvdXQoaGFuZGxlKSB9O1xuICAgICAgICB9LFxuICAgICAgICBzZXRJbnRlcnZhbChjYWxsYmFjaywgbXMsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHNldEludGVydmFsKGNhbGxiYWNrLCBtcywgLi4uYXJncyk7XG4gICAgICAgICAgICByZXR1cm4geyBkaXNwb3NlOiAoKSA9PiBjbGVhckludGVydmFsKGhhbmRsZSkgfTtcbiAgICAgICAgfSxcbiAgICB9KVxufSk7XG5mdW5jdGlvbiBSSUwoKSB7XG4gICAgcmV0dXJuIF9yaWw7XG59XG4oZnVuY3Rpb24gKFJJTCkge1xuICAgIGZ1bmN0aW9uIGluc3RhbGwoKSB7XG4gICAgICAgIGFwaV8xLlJBTC5pbnN0YWxsKF9yaWwpO1xuICAgIH1cbiAgICBSSUwuaW5zdGFsbCA9IGluc3RhbGw7XG59KShSSUwgfHwgKFJJTCA9IHt9KSk7XG5leHBvcnRzLmRlZmF1bHQgPSBSSUw7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24gPSBleHBvcnRzLkJyb3dzZXJNZXNzYWdlV3JpdGVyID0gZXhwb3J0cy5Ccm93c2VyTWVzc2FnZVJlYWRlciA9IHZvaWQgMDtcbmNvbnN0IHJpbF8xID0gcmVxdWlyZShcIi4vcmlsXCIpO1xuLy8gSW5zdGFsbCB0aGUgYnJvd3NlciBydW50aW1lIGFic3RyYWN0LlxucmlsXzEuZGVmYXVsdC5pbnN0YWxsKCk7XG5jb25zdCBhcGlfMSA9IHJlcXVpcmUoXCIuLi9jb21tb24vYXBpXCIpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuLi9jb21tb24vYXBpXCIpLCBleHBvcnRzKTtcbmNsYXNzIEJyb3dzZXJNZXNzYWdlUmVhZGVyIGV4dGVuZHMgYXBpXzEuQWJzdHJhY3RNZXNzYWdlUmVhZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihwb3J0KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX29uRGF0YSA9IG5ldyBhcGlfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuX21lc3NhZ2VMaXN0ZW5lciA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fb25EYXRhLmZpcmUoZXZlbnQuZGF0YSk7XG4gICAgICAgIH07XG4gICAgICAgIHBvcnQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoZXZlbnQpID0+IHRoaXMuZmlyZUVycm9yKGV2ZW50KSk7XG4gICAgICAgIHBvcnQub25tZXNzYWdlID0gdGhpcy5fbWVzc2FnZUxpc3RlbmVyO1xuICAgIH1cbiAgICBsaXN0ZW4oY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uRGF0YS5ldmVudChjYWxsYmFjayk7XG4gICAgfVxufVxuZXhwb3J0cy5Ccm93c2VyTWVzc2FnZVJlYWRlciA9IEJyb3dzZXJNZXNzYWdlUmVhZGVyO1xuY2xhc3MgQnJvd3Nlck1lc3NhZ2VXcml0ZXIgZXh0ZW5kcyBhcGlfMS5BYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKHBvcnQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50ID0gMDtcbiAgICAgICAgcG9ydC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIChldmVudCkgPT4gdGhpcy5maXJlRXJyb3IoZXZlbnQpKTtcbiAgICB9XG4gICAgd3JpdGUobXNnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnBvcnQucG9zdE1lc3NhZ2UobXNnKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IsIG1zZyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZUVycm9yKGVycm9yLCBtc2cpIHtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50Kys7XG4gICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yLCBtc2csIHRoaXMuZXJyb3JDb3VudCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICB9XG59XG5leHBvcnRzLkJyb3dzZXJNZXNzYWdlV3JpdGVyID0gQnJvd3Nlck1lc3NhZ2VXcml0ZXI7XG5mdW5jdGlvbiBjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbihyZWFkZXIsIHdyaXRlciwgbG9nZ2VyLCBvcHRpb25zKSB7XG4gICAgaWYgKGxvZ2dlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxvZ2dlciA9IGFwaV8xLk51bGxMb2dnZXI7XG4gICAgfVxuICAgIGlmIChhcGlfMS5Db25uZWN0aW9uU3RyYXRlZ3kuaXMob3B0aW9ucykpIHtcbiAgICAgICAgb3B0aW9ucyA9IHsgY29ubmVjdGlvblN0cmF0ZWd5OiBvcHRpb25zIH07XG4gICAgfVxuICAgIHJldHVybiAoMCwgYXBpXzEuY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24pKHJlYWRlciwgd3JpdGVyLCBsb2dnZXIsIG9wdGlvbnMpO1xufVxuZXhwb3J0cy5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiA9IGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uO1xuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL2Jyb3dzZXIvbWFpbicpOyIsICIvKlxuICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMjYgRWNsaXBzZSBEaXJpZ2libGUgY29udHJpYnV0b3JzXG4gKlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlXG4gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2Mi4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG4gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MjAuaHRtbFxuICpcbiAqIFNQRFgtRmlsZUNvcHlyaWdodFRleHQ6IEVjbGlwc2UgRGlyaWdpYmxlIGNvbnRyaWJ1dG9ycyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbi8qKlxuICogSmF2YSBMU1AgY2xpZW50IGJ1bmRsZS5cbiAqXG4gKiBVc2VzIHZzY29kZS13cy1qc29ucnBjIGZvciB0eXBlZCBKU09OLVJQQyBvdmVyIFdlYlNvY2tldCBhbmQgcmVnaXN0ZXJzIE1vbmFjb1xuICogcHJvdmlkZXJzIHRoYXQgZGVsZWdhdGUgdG8gSkRULkxTLiBFeHBvc2VkIGFzIGdsb2JhbCBKYXZhTHNwQ2xpZW50TGliIHNvIHRoYXRcbiAqIGVkaXRvci5qcyBjYW4gY2FsbCBKYXZhTHNwQ2xpZW50TGliLmNvbm5lY3QocmVzb3VyY2VQYXRoKS5cbiAqXG4gKiBPbmUgSkRULkxTIHByb2Nlc3MgY292ZXJzIHRoZSBlbnRpcmUgd29ya3NwYWNlLCBzbyBhIHNpbmdsZSBXZWJTb2NrZXQgY29ubmVjdGlvblxuICogaXMgc2hhcmVkIGFjcm9zcyBhbGwgSmF2YSBmaWxlcyBvcGVuIGluIHRoZSBzYW1lIGJyb3dzZXIgcGFnZS4gVGhlIGNvbm5lY3Rpb24gaXNcbiAqIGVzdGFibGlzaGVkIG9uIHRoZSBmaXJzdCBjb25uZWN0KCkgY2FsbCBhbmQgcmV1c2VkIGZvciBhbGwgc3Vic2VxdWVudCBjYWxscy5cbiAqXG4gKiBlZGl0b3IuanMgc2V0cyB3aW5kb3cubW9uYWNvIGJlZm9yZSBjYWxsaW5nIGNvbm5lY3QoKSwgc28gdGhlIG1vbmFjby1zaGltJ3MgbGF6eVxuICogUHJveGllcyByZXNvbHZlIGNvcnJlY3RseSBhdCBjYWxsIHRpbWUuXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24sIE1lc3NhZ2VDb25uZWN0aW9uIH0gZnJvbSAndnNjb2RlLWpzb25ycGMvYnJvd3Nlcic7XG5pbXBvcnQgeyB0b1NvY2tldCwgV2ViU29ja2V0TWVzc2FnZVJlYWRlciwgV2ViU29ja2V0TWVzc2FnZVdyaXRlciB9IGZyb20gJ3ZzY29kZS13cy1qc29ucnBjJztcbmltcG9ydCAqIGFzIG1vbmFjbyBmcm9tICdtb25hY28tZWRpdG9yJztcbmltcG9ydCB7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLFxuICAgIERpYWdub3N0aWNTZXZlcml0eSxcbiAgICBJbnNlcnRUZXh0Rm9ybWF0LFxuICAgIE1hcmt1cENvbnRlbnQsXG4gICAgTWFya3VwS2luZCxcbiAgICB0eXBlIENvZGVBY3Rpb24sXG4gICAgdHlwZSBDb21tYW5kLFxuICAgIHR5cGUgQ29tcGxldGlvbkl0ZW0sXG4gICAgdHlwZSBDb21wbGV0aW9uTGlzdCxcbiAgICB0eXBlIERpYWdub3N0aWMsXG4gICAgdHlwZSBIb3ZlcixcbiAgICB0eXBlIExvY2F0aW9uLFxuICAgIHR5cGUgUGFyYW1ldGVySW5mb3JtYXRpb24sXG4gICAgdHlwZSBTaWduYXR1cmVIZWxwLFxuICAgIHR5cGUgU2lnbmF0dXJlSW5mb3JtYXRpb24sXG4gICAgdHlwZSBUZXh0RWRpdCxcbiAgICB0eXBlIFdvcmtzcGFjZUVkaXQsXG59IGZyb20gJ3ZzY29kZS1sYW5ndWFnZXNlcnZlci10eXBlcyc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNpbmdsZXRvbiBzdGF0ZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogU2hhcmVkIGNvbm5lY3Rpb24gXHUyMDE0IG9uZSBwZXIgYnJvd3NlciBwYWdlLCBjb3ZlcmluZyBhbGwgcHJvamVjdHMgaW4gdGhlIHdvcmtzcGFjZS4gKi9cbmxldCBfY29ubjogTWVzc2FnZUNvbm5lY3Rpb24gfCBudWxsID0gbnVsbDtcblxuLyoqXG4gKiBWaXJ0dWFsIHdvcmtzcGFjZSByb290IFVSSSwgZS5nLiB7QGNvZGUgZmlsZTovLy93b3Jrc3BhY2Uvd29ya3NwYWNlL30uXG4gKiBTZXQgb25jZSBvbiBmaXJzdCBjb25uZWN0KCk7IHVzZWQgdG8gc2NvcGUgTW9uYWNvIHByb3ZpZGVycyB0byB3b3Jrc3BhY2UgZmlsZXMuXG4gKi9cbmxldCBfd29ya3NwYWNlUm9vdCA9ICcnO1xuXG4vKiogVVJJcyBmb3Igd2hpY2ggdGV4dERvY3VtZW50L2RpZE9wZW4gaGFzIGFscmVhZHkgYmVlbiBzZW50LiAqL1xuY29uc3QgX29wZW5GaWxlczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cbi8qKiBQZW5kaW5nIGRlYm91bmNlZCBkaWRDaGFuZ2UgdGltZXJzIHBlciBmaWxlIFVSSSwgc28gYSBjaGFuZ2UgY2FuIGJlIGZsdXNoZWQgYmVmb3JlIGNvbXBsZXRpb24uICovXG5jb25zdCBfY2hhbmdlVGltZXJzOiBNYXA8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0Pj4gPSBuZXcgTWFwKCk7XG5cbi8qKlxuICogTGFzdCBkaWFnbm9zdGljcyBwdWJsaXNoZWQgcGVyIGZpbGUgVVJJLCBrZXB0IHZlcmJhdGltICh3aXRoIHRoZWlyIExTUCBjb2RlL2RhdGEpLiBDb2RlLWFjdGlvblxuICogcmVxdWVzdHMgbXVzdCBzZW5kIHRoZXNlIFx1MjAxNCBKRFQuTFMgbWF0Y2hlcyBxdWljay1maXhlcyBieSB0aGUgZGlhZ25vc3RpYydzIGNvZGUvZGF0YSwgd2hpY2ggTW9uYWNvJ3NcbiAqIElNYXJrZXJEYXRhIGNhbm5vdCByb3VuZC10cmlwLCBzbyByZWNvbnN0cnVjdGluZyBkaWFnbm9zdGljcyBmcm9tIG1hcmtlcnMgeWllbGRzIG5vIHF1aWNrLWZpeGVzLlxuICovXG5jb25zdCBfZGlhZ25vc3RpY3M6IE1hcDxzdHJpbmcsIERpYWdub3N0aWNbXT4gPSBuZXcgTWFwKCk7XG5cbmxldCBfcHJvdmlkZXJzUmVnaXN0ZXJlZCA9IGZhbHNlO1xuXG4vKiogU2VtYW50aWMtdG9rZW4gbGVnZW5kIHJlcG9ydGVkIGJ5IEpEVC5MUyBpbiB0aGUgaW5pdGlhbGl6ZSByZXN1bHQ7IG5lZWRlZCB0byBkZWNvZGUgdG9rZW4gZGF0YS4gKi9cbmxldCBfc2VtYW50aWNUb2tlbnNMZWdlbmQ6IHsgdG9rZW5UeXBlczogc3RyaW5nW107IHRva2VuTW9kaWZpZXJzOiBzdHJpbmdbXSB9IHwgbnVsbCA9IG51bGw7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFB1YmxpYyBBUElcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIENhbGxlZCBieSBlZGl0b3IuanMgd2hlbiBhIEphdmEgZmlsZSBpcyBvcGVuZWQuIFNhZmUgdG8gY2FsbCBtdWx0aXBsZSB0aW1lcy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb25uZWN0KHJlc291cmNlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFydHMgPSByZXNvdXJjZVBhdGgucmVwbGFjZSgvXlxcLy8sICcnKS5zcGxpdCgnLycpO1xuICAgIGNvbnN0IHdvcmtzcGFjZSA9IHBhcnRzWzBdO1xuICAgIGNvbnN0IHByb2plY3QgICA9IHBhcnRzWzFdO1xuICAgIGNvbnN0IGZpbGVVcmkgPSBgZmlsZTovLy93b3Jrc3BhY2UvJHt3b3Jrc3BhY2V9LyR7cHJvamVjdH0vJHtwYXJ0cy5zbGljZSgyKS5qb2luKCcvJyl9YDtcblxuICAgIGlmIChfY29ubikge1xuICAgICAgICAvLyBDb25uZWN0aW9uIGFscmVhZHkgZXN0YWJsaXNoZWQgXHUyMDE0IGp1c3Qgb3BlbiB0aGUgbmV3IGZpbGUuXG4gICAgICAgIG9wZW5GaWxlKGZpbGVVcmkpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgX3dvcmtzcGFjZVJvb3QgPSBgZmlsZTovLy93b3Jrc3BhY2UvJHt3b3Jrc3BhY2V9L2A7XG5cbiAgICBjb25zdCBwcm90byA9IGxvY2F0aW9uLnByb3RvY29sID09PSAnaHR0cHM6JyA/ICd3c3MnIDogJ3dzJztcbiAgICBjb25zdCB3c1VybCA9IGAke3Byb3RvfTovLyR7bG9jYXRpb24uaG9zdH0vd2Vic29ja2V0cy9pZGUvamF2YS1sc3BgXG4gICAgICAgICAgICAgICAgKyBgP3dvcmtzcGFjZT0ke2VuY29kZVVSSUNvbXBvbmVudCh3b3Jrc3BhY2UpfWA7XG5cbiAgICBjb25zdCB3cyA9IG5ldyBXZWJTb2NrZXQod3NVcmwpO1xuICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgd3Mub25vcGVuICA9ICgpID0+IHJlc29sdmUoKTtcbiAgICAgICAgd3Mub25lcnJvciA9ICgpID0+IHJlamVjdChuZXcgRXJyb3IoYFtqYXZhLWxzcF0gV2ViU29ja2V0IGNvbm5lY3QgZmFpbGVkOiAke3dzVXJsfWApKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHNvY2tldCA9IHRvU29ja2V0KHdzKTtcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgV2ViU29ja2V0TWVzc2FnZVJlYWRlcihzb2NrZXQpO1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBXZWJTb2NrZXRNZXNzYWdlV3JpdGVyKHNvY2tldCk7XG4gICAgX2Nvbm4gPSBjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbihyZWFkZXIsIHdyaXRlcik7XG5cbiAgICAvLyBEaWFnbm9zdGljcyBub3RpZmljYXRpb24gXHUyMTkyIE1vbmFjbyBtYXJrZXJzIChhcHBsaWVzIHRvIGFueSB3b3Jrc3BhY2UgZmlsZSlcbiAgICBfY29ubi5vbk5vdGlmaWNhdGlvbigndGV4dERvY3VtZW50L3B1Ymxpc2hEaWFnbm9zdGljcycsIChwYXJhbXM6IHsgdXJpOiBzdHJpbmc7IGRpYWdub3N0aWNzOiBEaWFnbm9zdGljW10gfSkgPT4ge1xuICAgICAgICBfZGlhZ25vc3RpY3Muc2V0KHBhcmFtcy51cmksIHBhcmFtcy5kaWFnbm9zdGljcyA/PyBbXSk7XG4gICAgICAgIGNvbnN0IG1vZGVsID0gbW9uYWNvLmVkaXRvci5nZXRNb2RlbHMoKS5maW5kKG0gPT4gbS51cmkudG9TdHJpbmcoKSA9PT0gcGFyYW1zLnVyaSk7XG4gICAgICAgIGlmICghbW9kZWwpIHJldHVybjtcbiAgICAgICAgbW9uYWNvLmVkaXRvci5zZXRNb2RlbE1hcmtlcnMobW9kZWwsICdqYXZhLWxzcCcsIHBhcmFtcy5kaWFnbm9zdGljcy5tYXAoZCA9PiAoe1xuICAgICAgICAgICAgc2V2ZXJpdHk6ICAgICAgICBsc3BTZXZlcml0eShkLnNldmVyaXR5KSxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICAgICAgICAgZC5tZXNzYWdlLFxuICAgICAgICAgICAgc291cmNlOiAgICAgICAgICBkLnNvdXJjZSA/PyAnamF2YScsXG4gICAgICAgICAgICBzdGFydExpbmVOdW1iZXI6IGQucmFuZ2Uuc3RhcnQubGluZSArIDEsXG4gICAgICAgICAgICBzdGFydENvbHVtbjogICAgIGQucmFuZ2Uuc3RhcnQuY2hhcmFjdGVyICsgMSxcbiAgICAgICAgICAgIGVuZExpbmVOdW1iZXI6ICAgZC5yYW5nZS5lbmQubGluZSArIDEsXG4gICAgICAgICAgICBlbmRDb2x1bW46ICAgICAgIGQucmFuZ2UuZW5kLmNoYXJhY3RlciArIDEsXG4gICAgICAgIH0pKSk7XG4gICAgfSk7XG5cbiAgICAvLyBTZXJ2ZXIgLT4gY2xpZW50IHJlcXVlc3RzIHRoYXQgZHJpdmUgcmVmYWN0b3IgLyBnZW5lcmF0ZSByZXN1bHRzIGFuZCBkeW5hbWljIHJlZ2lzdHJhdGlvbi5cbiAgICBfY29ubi5vblJlcXVlc3QoJ3dvcmtzcGFjZS9hcHBseUVkaXQnLCAocGFyYW1zOiB7IGVkaXQ6IFdvcmtzcGFjZUVkaXQgfSkgPT4ge1xuICAgICAgICBhcHBseVdvcmtzcGFjZUVkaXQocGFyYW1zLmVkaXQpO1xuICAgICAgICByZXR1cm4geyBhcHBsaWVkOiB0cnVlIH07XG4gICAgfSk7XG4gICAgX2Nvbm4ub25SZXF1ZXN0KCd3b3Jrc3BhY2UvY29uZmlndXJhdGlvbicsIChwYXJhbXM6IHsgaXRlbXM6IEFycmF5PHsgc2VjdGlvbj86IHN0cmluZyB9PiB9KSA9PlxuICAgICAgICAocGFyYW1zLml0ZW1zID8/IFtdKS5tYXAoKCkgPT4gamR0bHNTZXR0aW5ncygpLmphdmEpKTtcbiAgICBfY29ubi5vblJlcXVlc3QoJ2NsaWVudC9yZWdpc3RlckNhcGFiaWxpdHknLCAoKSA9PiBudWxsKTtcbiAgICBfY29ubi5vblJlcXVlc3QoJ2NsaWVudC91bnJlZ2lzdGVyQ2FwYWJpbGl0eScsICgpID0+IG51bGwpO1xuICAgIF9jb25uLm9uUmVxdWVzdCgnd2luZG93L3Nob3dNZXNzYWdlUmVxdWVzdCcsICgpID0+IG51bGwpO1xuICAgIF9jb25uLm9uUmVxdWVzdCgnd2luZG93L3dvcmtEb25lUHJvZ3Jlc3MvY3JlYXRlJywgKCkgPT4gbnVsbCk7XG4gICAgX2Nvbm4ub25Ob3RpZmljYXRpb24oJ3dpbmRvdy9sb2dNZXNzYWdlJywgKHA6IHsgbWVzc2FnZTogc3RyaW5nIH0pID0+IGNvbnNvbGUuZGVidWcoJ1tqYXZhLWxzcF0nLCBwPy5tZXNzYWdlKSk7XG4gICAgX2Nvbm4ub25Ob3RpZmljYXRpb24oJ3dpbmRvdy9zaG93TWVzc2FnZScsIChwOiB7IG1lc3NhZ2U6IHN0cmluZyB9KSA9PiBjb25zb2xlLmluZm8oJ1tqYXZhLWxzcF0nLCBwPy5tZXNzYWdlKSk7XG4gICAgLy8gSkRULkxTIGxhbmd1YWdlLXN0YXR1cyAvIHByb2dyZXNzIG5vdGlmaWNhdGlvbnMgXHUyMDE0IGFja25vd2xlZGdlZCBzaWxlbnRseS5cbiAgICBfY29ubi5vbk5vdGlmaWNhdGlvbignbGFuZ3VhZ2Uvc3RhdHVzJywgKCkgPT4geyAvKiBpbmRleGluZy9yZWFkeSBzdGF0dXMsIGlnbm9yZWQgKi8gfSk7XG4gICAgX2Nvbm4ub25Ob3RpZmljYXRpb24oJ2xhbmd1YWdlL3Byb2dyZXNzUmVwb3J0JywgKCkgPT4geyAvKiBidWlsZCBwcm9ncmVzcywgaWdub3JlZCAqLyB9KTtcblxuICAgIF9jb25uLmxpc3RlbigpO1xuXG4gICAgY29uc3Qgcm9vdFVyaSA9IF93b3Jrc3BhY2VSb290O1xuICAgIGNvbnN0IGluaXRSZXN1bHQ6IGFueSA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCdpbml0aWFsaXplJywge1xuICAgICAgICBwcm9jZXNzSWQ6IG51bGwsXG4gICAgICAgIHJvb3RVcmksXG4gICAgICAgIGluaXRpYWxpemF0aW9uT3B0aW9uczoge1xuICAgICAgICAgICAgc2V0dGluZ3M6IGpkdGxzU2V0dGluZ3MoKSxcbiAgICAgICAgICAgIGV4dGVuZGVkQ2xpZW50Q2FwYWJpbGl0aWVzOiB7XG4gICAgICAgICAgICAgICAgcHJvZ3Jlc3NSZXBvcnRQcm92aWRlcjogICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICAgICBjbGFzc0ZpbGVDb250ZW50c1N1cHBvcnQ6ICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgcmVzb2x2ZUFkZGl0aW9uYWxUZXh0RWRpdHNTdXBwb3J0OiB0cnVlLFxuICAgICAgICAgICAgICAgIC8vIERvIE5PVCBhZHZlcnRpc2UgdGhlICpQcm9tcHRTdXBwb3J0IGZsYWdzOiB0aG9zZSBtYWtlIEpEVC5MUyByZXR1cm4gc291cmNlIGFjdGlvbnNcbiAgICAgICAgICAgICAgICAvLyAoZ2VuZXJhdGUgdG9TdHJpbmcvY29uc3RydWN0b3JzL2FjY2Vzc29ycywgb3ZlcnJpZGUvaW1wbGVtZW50LCBvcmdhbml6ZSBpbXBvcnRzKSBhc1xuICAgICAgICAgICAgICAgIC8vIGNsaWVudC1zaWRlIFwiKlByb21wdFwiIGNvbW1hbmRzIHRoZSB2c2NvZGUtamF2YSBleHRlbnNpb24gaW1wbGVtZW50cyBidXQgd2UgZG9uJ3QuXG4gICAgICAgICAgICAgICAgLy8gV2l0aCB0aGVtIG9mZiwgSkRULkxTIHJldHVybnMgdGhlIHNhbWUgYWN0aW9ucyBhcyByZXNvbHZhYmxlIFdvcmtzcGFjZUVkaXRzIG9wZXJhdGluZ1xuICAgICAgICAgICAgICAgIC8vIG9uIGFsbCBtZW1iZXJzLCB3aGljaCBhcHBseUNvZGVBY3Rpb24gcmVzb2x2ZXMgYW5kIGFwcGxpZXMgZGlyZWN0bHkuXG4gICAgICAgICAgICAgICAgaW5mZXJTZWxlY3Rpb25TdXBwb3J0OiAgICAgICAgICAgICBbJ2V4dHJhY3RNZXRob2QnLCAnZXh0cmFjdFZhcmlhYmxlJywgJ2V4dHJhY3RGaWVsZCddLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgd29ya3NwYWNlRm9sZGVyczogW3sgdXJpOiByb290VXJpLCBuYW1lOiB3b3Jrc3BhY2UgfV0sXG4gICAgICAgIGNhcGFiaWxpdGllczoge1xuICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7XG4gICAgICAgICAgICAgICAgc3luY2hyb25pemF0aW9uOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUsIHdpbGxTYXZlOiBmYWxzZSwgZGlkU2F2ZTogdHJ1ZSwgd2lsbFNhdmVXYWl0VW50aWw6IGZhbHNlIH0sXG4gICAgICAgICAgICAgICAgY29tcGxldGlvbjoge1xuICAgICAgICAgICAgICAgICAgICBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uSXRlbToge1xuICAgICAgICAgICAgICAgICAgICAgICAgc25pcHBldFN1cHBvcnQ6ICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRhdGlvbkZvcm1hdDogICBbJ21hcmtkb3duJywgJ3BsYWludGV4dCddLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRlZFN1cHBvcnQ6ICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWl0Q2hhcmFjdGVyc1N1cHBvcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlU3VwcG9ydDogICAgICAgIHsgcHJvcGVydGllczogWydkb2N1bWVudGF0aW9uJywgJ2RldGFpbCcsICdhZGRpdGlvbmFsVGV4dEVkaXRzJ10gfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dFN1cHBvcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBob3ZlcjogICAgICAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLCBjb250ZW50Rm9ybWF0OiBbJ21hcmtkb3duJywgJ3BsYWludGV4dCddIH0sXG4gICAgICAgICAgICAgICAgc2lnbmF0dXJlSGVscDogIHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSwgc2lnbmF0dXJlSW5mb3JtYXRpb246IHsgZG9jdW1lbnRhdGlvbkZvcm1hdDogWydtYXJrZG93bicsICdwbGFpbnRleHQnXSwgcGFyYW1ldGVySW5mb3JtYXRpb246IHsgbGFiZWxPZmZzZXRTdXBwb3J0OiB0cnVlIH0gfSB9LFxuICAgICAgICAgICAgICAgIGRlZmluaXRpb246ICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VzOiAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb246IHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIHR5cGVEZWZpbml0aW9uOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICBkb2N1bWVudEhpZ2hsaWdodDogeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgZG9jdW1lbnRTeW1ib2w6IHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSwgaGllcmFyY2hpY2FsRG9jdW1lbnRTeW1ib2xTdXBwb3J0OiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgZm9sZGluZ1JhbmdlOiAgIHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSwgbGluZUZvbGRpbmdPbmx5OiBmYWxzZSB9LFxuICAgICAgICAgICAgICAgIHNlbGVjdGlvblJhbmdlOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICBjb2RlTGVuczogICAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgaW5sYXlIaW50OiAgICAgIHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSwgcmVzb2x2ZVN1cHBvcnQ6IHsgcHJvcGVydGllczogWydsYWJlbCddIH0gfSxcbiAgICAgICAgICAgICAgICBzZW1hbnRpY1Rva2Vuczoge1xuICAgICAgICAgICAgICAgICAgICBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0czogICAgICAgIHsgcmFuZ2U6IGZhbHNlLCBmdWxsOiB7IGRlbHRhOiBmYWxzZSB9IH0sXG4gICAgICAgICAgICAgICAgICAgIHRva2VuVHlwZXM6ICAgICAgWyduYW1lc3BhY2UnLCAndHlwZScsICdjbGFzcycsICdlbnVtJywgJ2ludGVyZmFjZScsICdzdHJ1Y3QnLCAndHlwZVBhcmFtZXRlcicsXG4gICAgICAgICAgICAgICAgICAgICAgICAncGFyYW1ldGVyJywgJ3ZhcmlhYmxlJywgJ3Byb3BlcnR5JywgJ2VudW1NZW1iZXInLCAnZXZlbnQnLCAnZnVuY3Rpb24nLCAnbWV0aG9kJywgJ21hY3JvJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdrZXl3b3JkJywgJ21vZGlmaWVyJywgJ2NvbW1lbnQnLCAnc3RyaW5nJywgJ251bWJlcicsICdyZWdleHAnLCAnb3BlcmF0b3InLCAnZGVjb3JhdG9yJ10sXG4gICAgICAgICAgICAgICAgICAgIHRva2VuTW9kaWZpZXJzOiAgWydkZWNsYXJhdGlvbicsICdkZWZpbml0aW9uJywgJ3JlYWRvbmx5JywgJ3N0YXRpYycsICdkZXByZWNhdGVkJywgJ2Fic3RyYWN0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdhc3luYycsICdtb2RpZmljYXRpb24nLCAnZG9jdW1lbnRhdGlvbicsICdkZWZhdWx0TGlicmFyeSddLFxuICAgICAgICAgICAgICAgICAgICBmb3JtYXRzOiAgICAgICAgIFsncmVsYXRpdmUnXSxcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxhcHBpbmdUb2tlblN1cHBvcnQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBtdWx0aWxpbmVUb2tlblN1cHBvcnQ6ICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBmb3JtYXR0aW5nOiAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgcmFuZ2VGb3JtYXR0aW5nOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICByZW5hbWU6ICAgICAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLCBwcmVwYXJlU3VwcG9ydDogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIGNvZGVBY3Rpb246IHtcbiAgICAgICAgICAgICAgICAgICAgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgY29kZUFjdGlvbkxpdGVyYWxTdXBwb3J0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlQWN0aW9uS2luZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU2V0OiBbJ3F1aWNrZml4JywgJ3JlZmFjdG9yJywgJ3JlZmFjdG9yLmV4dHJhY3QnLCAncmVmYWN0b3IuaW5saW5lJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlZmFjdG9yLnJld3JpdGUnLCAnc291cmNlJywgJ3NvdXJjZS5vcmdhbml6ZUltcG9ydHMnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGlzUHJlZmVycmVkU3VwcG9ydDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgZGF0YVN1cHBvcnQ6ICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlU3VwcG9ydDogICAgIHsgcHJvcGVydGllczogWydlZGl0J10gfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHB1Ymxpc2hEaWFnbm9zdGljczogeyByZWxhdGVkSW5mb3JtYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3b3Jrc3BhY2U6IHtcbiAgICAgICAgICAgICAgICBhcHBseUVkaXQ6ICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb246ICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgZXhlY3V0ZUNvbW1hbmQ6ICAgICAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgZGlkQ2hhbmdlQ29uZmlndXJhdGlvbjogeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgd29ya3NwYWNlRWRpdDogICAgICAgICAgeyBkb2N1bWVudENoYW5nZXM6IHRydWUsIHJlc291cmNlT3BlcmF0aW9uczogWydjcmVhdGUnLCAncmVuYW1lJywgJ2RlbGV0ZSddIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgX3NlbWFudGljVG9rZW5zTGVnZW5kID0gaW5pdFJlc3VsdD8uY2FwYWJpbGl0aWVzPy5zZW1hbnRpY1Rva2Vuc1Byb3ZpZGVyPy5sZWdlbmQgPz8gbnVsbDtcblxuICAgIF9jb25uLnNlbmROb3RpZmljYXRpb24oJ2luaXRpYWxpemVkJywge30pO1xuICAgIF9jb25uLnNlbmROb3RpZmljYXRpb24oJ3dvcmtzcGFjZS9kaWRDaGFuZ2VDb25maWd1cmF0aW9uJywgeyBzZXR0aW5nczogamR0bHNTZXR0aW5ncygpIH0pO1xuXG4gICAgb3BlbkZpbGUoZmlsZVVyaSk7XG5cbiAgICBpZiAoIV9wcm92aWRlcnNSZWdpc3RlcmVkKSB7XG4gICAgICAgIF9wcm92aWRlcnNSZWdpc3RlcmVkID0gdHJ1ZTtcbiAgICAgICAgcmVnaXN0ZXJQcm92aWRlcnMoKTtcbiAgICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEZpbGUgbGlmZWN5Y2xlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogU2VuZHMgdGV4dERvY3VtZW50L2RpZE9wZW4gZm9yIHRoZSBnaXZlbiBVUkkgKGlmIG5vdCBhbHJlYWR5IHNlbnQpIGFuZCByZWdpc3RlcnMgYSBkZWJvdW5jZWRcbiAqIHRleHREb2N1bWVudC9kaWRDaGFuZ2UgbGlzdGVuZXIgb24gdGhlIGNvcnJlc3BvbmRpbmcgTW9uYWNvIG1vZGVsLlxuICovXG5mdW5jdGlvbiBvcGVuRmlsZShmaWxlVXJpOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoX29wZW5GaWxlcy5oYXMoZmlsZVVyaSkgfHwgIV9jb25uKSByZXR1cm47XG4gICAgX29wZW5GaWxlcy5hZGQoZmlsZVVyaSk7XG5cbiAgICBjb25zdCBtb2RlbCA9IG1vbmFjby5lZGl0b3IuZ2V0TW9kZWxzKCkuZmluZChtID0+IG0udXJpLnRvU3RyaW5nKCkgPT09IGZpbGVVcmkpO1xuICAgIF9jb25uLnNlbmROb3RpZmljYXRpb24oJ3RleHREb2N1bWVudC9kaWRPcGVuJywge1xuICAgICAgICB0ZXh0RG9jdW1lbnQ6IHtcbiAgICAgICAgICAgIHVyaTogICAgICAgIGZpbGVVcmksXG4gICAgICAgICAgICBsYW5ndWFnZUlkOiAnamF2YScsXG4gICAgICAgICAgICB2ZXJzaW9uOiAgICAxLFxuICAgICAgICAgICAgdGV4dDogICAgICAgbW9kZWw/LmdldFZhbHVlKCkgPz8gJycsXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBpZiAobW9kZWwpIHtcbiAgICAgICAgbW9kZWwub25EaWRDaGFuZ2VDb250ZW50KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gX2NoYW5nZVRpbWVycy5nZXQoZmlsZVVyaSk7XG4gICAgICAgICAgICBpZiAoZXhpc3RpbmcpIGNsZWFyVGltZW91dChleGlzdGluZyk7XG4gICAgICAgICAgICBfY2hhbmdlVGltZXJzLnNldChmaWxlVXJpLCBzZXRUaW1lb3V0KCgpID0+IHNlbmREaWRDaGFuZ2UoZmlsZVVyaSksIDQwMCkpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbi8qKiBTZW5kcyB0aGUgY3VycmVudCBtb2RlbCBjb250ZW50IGFzIGEgZGlkQ2hhbmdlIGFuZCBjbGVhcnMgYW55IHBlbmRpbmcgZGVib3VuY2UgZm9yIHRoZSBmaWxlLiAqL1xuZnVuY3Rpb24gc2VuZERpZENoYW5nZShmaWxlVXJpOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBfY2hhbmdlVGltZXJzLmRlbGV0ZShmaWxlVXJpKTtcbiAgICBjb25zdCBtb2RlbCA9IG1vbmFjby5lZGl0b3IuZ2V0TW9kZWwobW9uYWNvLlVyaS5wYXJzZShmaWxlVXJpKSk7XG4gICAgaWYgKF9jb25uICYmIG1vZGVsKSB7XG4gICAgICAgIF9jb25uLnNlbmROb3RpZmljYXRpb24oJ3RleHREb2N1bWVudC9kaWRDaGFuZ2UnLCB7XG4gICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6ICAgeyB1cmk6IGZpbGVVcmksIHZlcnNpb246IG1vZGVsLmdldFZlcnNpb25JZCgpIH0sXG4gICAgICAgICAgICBjb250ZW50Q2hhbmdlczogW3sgdGV4dDogbW9kZWwuZ2V0VmFsdWUoKSB9XSxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEZsdXNoZXMgYSBwZW5kaW5nIGRlYm91bmNlZCBjaGFuZ2UgaW1tZWRpYXRlbHkuIENhbGxlZCBiZWZvcmUgYSBjb21wbGV0aW9uIHJlcXVlc3Qgc28gSkRULkxTIHNlZXMgdGhlXG4gKiBqdXN0LXR5cGVkIHRleHQgb24gdGhlIGZpcnN0IEN0cmwrU3BhY2UsIGluc3RlYWQgb2YgY29tcGxldGluZyBhZ2FpbnN0IHN0YWxlIGNvbnRlbnQgKHRoZSBkZWJvdW5jZVxuICogb3RoZXJ3aXNlIGRlbGF5cyB0aGUgY2hhbmdlIGJ5IHVwIHRvIDQwMG1zIFx1MjAxNCB0aGUgY2F1c2Ugb2YgXCJmaXJzdCBDdHJsK1NwYWNlIHNob3dzIG5vdGhpbmdcIikuXG4gKi9cbmZ1bmN0aW9uIGZsdXNoUGVuZGluZ0NoYW5nZShmaWxlVXJpOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoX2NoYW5nZVRpbWVycy5oYXMoZmlsZVVyaSkpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KF9jaGFuZ2VUaW1lcnMuZ2V0KGZpbGVVcmkpISk7XG4gICAgICAgIHNlbmREaWRDaGFuZ2UoZmlsZVVyaSk7XG4gICAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBXb3Jrc3BhY2UgZmlsZSBwcmVkaWNhdGVcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBSZXR1cm5zIHtAY29kZSB0cnVlfSB3aGVuIHRoZSBnaXZlbiBtb2RlbCBVUkkgYmVsb25ncyB0byB0aGUgY3VycmVudGx5IGNvbm5lY3RlZCB3b3Jrc3BhY2UuIFVzZWRcbiAqIGJ5IE1vbmFjbyBwcm92aWRlcnMgdG8gc2tpcCBub24tSmF2YS13b3Jrc3BhY2UgbW9kZWxzIHdpdGhvdXQgYW4gZXhhY3QtVVJJIGNvbXBhcmlzb24uXG4gKi9cbmZ1bmN0aW9uIGlzV29ya3NwYWNlRmlsZSh1cmk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBfd29ya3NwYWNlUm9vdCAhPT0gJycgJiYgdXJpLnN0YXJ0c1dpdGgoX3dvcmtzcGFjZVJvb3QpO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBNb25hY28gcHJvdmlkZXIgcmVnaXN0cmF0aW9uXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIHJlZ2lzdGVyUHJvdmlkZXJzKCk6IHZvaWQge1xuXG4gICAgbW9uYWNvLmVkaXRvci5yZWdpc3RlckNvbW1hbmQoQVBQTFlfQUNUSU9OX0NPTU1BTkQsIChfYWNjZXNzb3I6IHVua25vd24sIGFjdGlvbjogQ29kZUFjdGlvbiB8IENvbW1hbmQpID0+IHtcbiAgICAgICAgYXBwbHlDb2RlQWN0aW9uKGFjdGlvbik7XG4gICAgfSk7XG4gICAgbW9uYWNvLmVkaXRvci5yZWdpc3RlckNvbW1hbmQoTk9PUF9DT01NQU5ELCAoKSA9PiB7IC8qIGRpc3BsYXktb25seSBDb2RlTGVucyAqLyB9KTtcblxuICAgIC8vIENyb3NzLWZpbGUgbmF2aWdhdGlvbjogdGhpcyBzaW5nbGUtZmlsZSBlZGl0b3IgaGFzIG5vIG1vZGVsIGZvciBvdGhlciB3b3Jrc3BhY2UgZmlsZXMsIHNvIEdvIHRvXG4gICAgLy8gRGVmaW5pdGlvbiAvIEZpbmQgUmVmZXJlbmNlcyB0byBhbm90aGVyIGZpbGUgd291bGQgc2lsZW50bHkgZG8gbm90aGluZy4gSGFuZCB0aG9zZSBvZmYgdG8gdGhlIElERVxuICAgIC8vIHRvIG9wZW4gdGhlIHRhcmdldCBmaWxlIChhbmQgcmV2ZWFsIHRoZSBsaW5lKS4gU2FtZS1maWxlIHRhcmdldHMgZmFsbCB0aHJvdWdoIHRvIE1vbmFjby5cbiAgICBtb25hY28uZWRpdG9yLnJlZ2lzdGVyRWRpdG9yT3BlbmVyKHtcbiAgICAgICAgb3BlbkNvZGVFZGl0b3I6IChzb3VyY2UsIHJlc291cmNlLCBzZWxlY3Rpb25PclBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB1cmkgPSByZXNvdXJjZS50b1N0cmluZygpO1xuICAgICAgICAgICAgaWYgKCFpc1dvcmtzcGFjZUZpbGUodXJpKSB8fCAhdXJpLnN0YXJ0c1dpdGgoVklSVFVBTF9GSUxFX1BSRUZJWCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRNb2RlbCA9IHNvdXJjZS5nZXRNb2RlbCgpO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRNb2RlbCAmJiBjdXJyZW50TW9kZWwudXJpLnRvU3RyaW5nKCkgPT09IHVyaSkgcmV0dXJuIGZhbHNlOyAvLyBzYW1lIGZpbGUgXHUyMDE0IGxldCBNb25hY28ganVtcFxuICAgICAgICAgICAgY29uc3Qgb3BlbmVyID0gKGdsb2JhbFRoaXMgYXMgYW55KS5qYXZhTHNwT3BlbkZpbGU7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wZW5lciAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgcG9zID0gc2VsZWN0aW9uT3JQb3NpdGlvbiBhcyB7IHN0YXJ0TGluZU51bWJlcj86IG51bWJlcjsgbGluZU51bWJlcj86IG51bWJlcjsgc3RhcnRDb2x1bW4/OiBudW1iZXI7IGNvbHVtbj86IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgbGluZSA9IHBvcyA/IChwb3Muc3RhcnRMaW5lTnVtYmVyID8/IHBvcy5saW5lTnVtYmVyKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHBvcyA/IChwb3Muc3RhcnRDb2x1bW4gPz8gcG9zLmNvbHVtbikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBvcGVuZXIodXJpLnN1YnN0cmluZyhWSVJUVUFMX0ZJTEVfUFJFRklYLmxlbmd0aCksIGxpbmUsIGNvbHVtbik7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJDb21wbGV0aW9uSXRlbVByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICB0cmlnZ2VyQ2hhcmFjdGVyczogWycuJywgJ0AnLCAnPCddLFxuICAgICAgICBwcm92aWRlQ29tcGxldGlvbkl0ZW1zOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uLCBjb250ZXh0KSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVVcmkgPSBtb2RlbC51cmkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBKRFQuTFMgaGFzIHRoZSBqdXN0LXR5cGVkIHRleHQgYmVmb3JlIGNvbXBsZXRpbmcgKHNlZSBmbHVzaFBlbmRpbmdDaGFuZ2UpLlxuICAgICAgICAgICAgZmx1c2hQZW5kaW5nQ2hhbmdlKGZpbGVVcmkpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBDb21wbGV0aW9uTGlzdCB8IENvbXBsZXRpb25JdGVtW10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9jb21wbGV0aW9uJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IGZpbGVVcmkgfSxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogICAgIHsgbGluZTogcG9zaXRpb24ubGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogcG9zaXRpb24uY29sdW1uIC0gMSB9LFxuICAgICAgICAgICAgICAgIC8vIE1vbmFjbyB0cmlnZ2VyIGtpbmRzIGFyZSAwLWJhc2VkIChJbnZva2UvVHJpZ2dlckNoYXJhY3Rlci9Gb3JJbmNvbXBsZXRlKTsgTFNQIGlzIDEtYmFzZWQuXG4gICAgICAgICAgICAgICAgY29udGV4dDogICAgICB7IHRyaWdnZXJLaW5kOiAoY29udGV4dC50cmlnZ2VyS2luZCA/PyAwKSArIDEsIHRyaWdnZXJDaGFyYWN0ZXI6IGNvbnRleHQudHJpZ2dlckNoYXJhY3RlciB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBpdGVtcyA9IEFycmF5LmlzQXJyYXkocmVzdWx0KSA/IHJlc3VsdCA6IChyZXN1bHQ/Lml0ZW1zID8/IFtdKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3VnZ2VzdGlvbnM6IGl0ZW1zLm1hcChpdGVtID0+IGxzcENvbXBsZXRpb25Ub01vbmFjbyhpdGVtLCBtb2RlbCwgcG9zaXRpb24pKSxcbiAgICAgICAgICAgICAgICAvLyBKRFQuTFMgcmV0dXJucyBhIHRydW5jYXRlZCBsaXN0IG9uIHRoZSBmaXJzdCBrZXlzdHJva2VzOyBwcm9wYWdhdGluZyBcImluY29tcGxldGVcIiBtYWtlc1xuICAgICAgICAgICAgICAgIC8vIE1vbmFjbyByZS1xdWVyeSBhcyB0aGUgdXNlciB0eXBlcyBpbnN0ZWFkIG9mIGNhY2hpbmcgdGhlIGZpcnN0IChvZnRlbiBlbXB0eSkgcmVzdWx0LlxuICAgICAgICAgICAgICAgIGluY29tcGxldGU6ICBBcnJheS5pc0FycmF5KHJlc3VsdCkgPyBmYWxzZSA6ICEhcmVzdWx0Py5pc0luY29tcGxldGUsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvLyBSZXNvbHZlIGRvY3VtZW50YXRpb24gYW5kLCBjcnVjaWFsbHksIHRoZSBhdXRvLWltcG9ydCBhZGRpdGlvbmFsVGV4dEVkaXRzIHdoaWNoIEpEVC5MUyBvbmx5XG4gICAgICAgIC8vIGF0dGFjaGVzIG9uIHJlc29sdmUgXHUyMDE0IHNlbGVjdGluZyBhIHR5cGUgdGhlbiBpbnNlcnRzIGl0cyBpbXBvcnQgc3RhdGVtZW50LlxuICAgICAgICByZXNvbHZlQ29tcGxldGlvbkl0ZW06IGFzeW5jIChpdGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsc3AgPSAoaXRlbSBhcyBNb25hY29Db21wbGV0aW9uSXRlbSkuX2xzcDtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWxzcCkgcmV0dXJuIGl0ZW07XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkOiBDb21wbGV0aW9uSXRlbSA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCdjb21wbGV0aW9uSXRlbS9yZXNvbHZlJywgbHNwKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQuZG9jdW1lbnRhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBpdGVtLmRvY3VtZW50YXRpb24gPSB7IHZhbHVlOiBtYXJrdXBUb1N0cmluZyhyZXNvbHZlZC5kb2N1bWVudGF0aW9uKSwgaXNUcnVzdGVkOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQuZGV0YWlsKSBpdGVtLmRldGFpbCA9IHJlc29sdmVkLmRldGFpbDtcbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQuYWRkaXRpb25hbFRleHRFZGl0cz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uYWRkaXRpb25hbFRleHRFZGl0cyA9IHJlc29sdmVkLmFkZGl0aW9uYWxUZXh0RWRpdHMubWFwKHRleHRFZGl0VG9Nb25hY28pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKCdbamF2YS1sc3BdIGNvbXBsZXRpb24gcmVzb2x2ZSBmYWlsZWQ6JywgKGUgYXMgRXJyb3IpPy5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckhvdmVyUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVIb3ZlcjogYXN5bmMgKG1vZGVsLCBwb3NpdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBmaWxlVXJpID0gbW9kZWwudXJpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IEhvdmVyIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvaG92ZXInLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogZmlsZVVyaSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0Py5jb250ZW50cykgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50cyA9IEFycmF5LmlzQXJyYXkocmVzdWx0LmNvbnRlbnRzKSA/IHJlc3VsdC5jb250ZW50cyA6IFtyZXN1bHQuY29udGVudHNdO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjb250ZW50czogY29udGVudHMubWFwKGMgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHR5cGVvZiBjID09PSAnc3RyaW5nJyA/IGMgOiAoYyBhcyBNYXJrdXBDb250ZW50KS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgaXNUcnVzdGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgcmFuZ2U6IHJlc3VsdC5yYW5nZSA/IGxzcFJhbmdlVG9Nb25hY28ocmVzdWx0LnJhbmdlKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyU2lnbmF0dXJlSGVscFByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBzaWduYXR1cmVIZWxwVHJpZ2dlckNoYXJhY3RlcnM6IFsnKCcsICcsJ10sXG4gICAgICAgIHByb3ZpZGVTaWduYXR1cmVIZWxwOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVVcmkgPSBtb2RlbC51cmkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogU2lnbmF0dXJlSGVscCB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L3NpZ25hdHVyZUhlbHAnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogZmlsZVVyaSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlczogcmVzdWx0LnNpZ25hdHVyZXMubWFwKChzaWc6IFNpZ25hdHVyZUluZm9ybWF0aW9uKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICAgICAgICAgc2lnLmxhYmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRhdGlvbjogc2lnLmRvY3VtZW50YXRpb24gPyBtYXJrdXBUb1N0cmluZyhzaWcuZG9jdW1lbnRhdGlvbikgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiAgICAoc2lnLnBhcmFtZXRlcnMgPz8gW10pLm1hcCgocDogUGFyYW1ldGVySW5mb3JtYXRpb24pID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICAgICAgICAgcC5sYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudGF0aW9uOiBwLmRvY3VtZW50YXRpb24gPyBtYXJrdXBUb1N0cmluZyhwLmRvY3VtZW50YXRpb24pIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZVNpZ25hdHVyZTogcmVzdWx0LmFjdGl2ZVNpZ25hdHVyZSA/PyAwLFxuICAgICAgICAgICAgICAgICAgICBhY3RpdmVQYXJhbWV0ZXI6IHJlc3VsdC5hY3RpdmVQYXJhbWV0ZXIgPz8gMCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGRpc3Bvc2U6ICgpID0+IHt9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJEZWZpbml0aW9uUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVEZWZpbml0aW9uOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVVcmkgPSBtb2RlbC51cmkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogTG9jYXRpb24gfCBMb2NhdGlvbltdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvZGVmaW5pdGlvbicsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBmaWxlVXJpIH0sXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgbG9jYXRpb25zID0gKEFycmF5LmlzQXJyYXkocmVzdWx0KSA/IHJlc3VsdCA6IFtyZXN1bHRdKS5tYXAobG9jID0+ICh7XG4gICAgICAgICAgICAgICAgdXJpOiAgIG1vbmFjby5VcmkucGFyc2UobG9jLnVyaSksXG4gICAgICAgICAgICAgICAgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28obG9jLnJhbmdlKSxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIGF3YWl0IGVuc3VyZU1vZGVsc0ZvckxvY2F0aW9ucyhsb2NhdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGxvY2F0aW9ucztcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJSZWZlcmVuY2VQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZVJlZmVyZW5jZXM6IGFzeW5jIChtb2RlbCwgcG9zaXRpb24sIGNvbnRleHQpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBMb2NhdGlvbltdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvcmVmZXJlbmNlcycsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICAgICAgY29udGV4dDogICAgICB7IGluY2x1ZGVEZWNsYXJhdGlvbjogY29udGV4dC5pbmNsdWRlRGVjbGFyYXRpb24gfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgbG9jYXRpb25zID0gcmVzdWx0Lm1hcChsb2MgPT4gKHsgdXJpOiBtb25hY28uVXJpLnBhcnNlKGxvYy51cmkpLCByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhsb2MucmFuZ2UpIH0pKTtcbiAgICAgICAgICAgIC8vIFRoZSByZWZlcmVuY2VzIHBlZWsgY2FuIG9ubHkgc2hvdyBhIGNvZGUgcHJldmlldyBmb3IgZmlsZXMgaXQgaGFzIGEgbW9kZWwgZm9yOyBjcmVhdGVcbiAgICAgICAgICAgIC8vIGluLW1lbW9yeSBtb2RlbHMgZm9yIHRoZSByZWZlcmVuY2VkIChwb3NzaWJseSB1bm9wZW5lZCkgZmlsZXMgc28gcHJldmlld3MgcmVuZGVyLlxuICAgICAgICAgICAgYXdhaXQgZW5zdXJlTW9kZWxzRm9yTG9jYXRpb25zKGxvY2F0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gbG9jYXRpb25zO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlclJlbmFtZVByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlUmVuYW1lRWRpdHM6IGFzeW5jIChtb2RlbCwgcG9zaXRpb24sIG5ld05hbWUpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiB7IGVkaXRzOiBbXSB9O1xuICAgICAgICAgICAgY29uc3QgZWRpdDogV29ya3NwYWNlRWRpdCB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L3JlbmFtZScsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICAgICAgbmV3TmFtZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFlZGl0KSByZXR1cm4geyBlZGl0czogW10gfTtcbiAgICAgICAgICAgIC8vIEEgSkRULkxTIHJlbmFtZSBjYW4gc3BhbiBtYW55IGZpbGVzIGFuZCBldmVuIHJlbmFtZSB0aGUgdHlwZSdzIG93biAuamF2YSBmaWxlLiBNb25hY28nc1xuICAgICAgICAgICAgLy8gc2luZ2xlLWZpbGUgZWRpdG9yIHdvdWxkIGRyb3AgZXZlcnl0aGluZyBidXQgdGhlIGN1cnJlbnQgbW9kZWwsIHNvIGFwcGx5IHRoZSB3aG9sZSBlZGl0XG4gICAgICAgICAgICAvLyB0aHJvdWdoIHRoZSB3b3Jrc3BhY2Ugb3Vyc2VsdmVzIHdoZW4gdGhlIElERSBwZXJzaXN0ZW5jZSBob29rIGlzIGF2YWlsYWJsZS5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgKGdsb2JhbFRoaXMgYXMgYW55KS5qYXZhTHNwUGVyc2lzdFJlbmFtZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGFwcGx5UmVuYW1lQWNyb3NzV29ya3NwYWNlKG1vZGVsLCBlZGl0KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZWRpdHM6IFtdIH07XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbamF2YS1sc3BdIGNyb3NzLWZpbGUgcmVuYW1lIGZhaWxlZCwgYXBwbHlpbmcgdG8gdGhlIGN1cnJlbnQgZmlsZSBvbmx5OicsIGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gd29ya3NwYWNlRWRpdFRvTW9uYWNvKGVkaXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB3b3Jrc3BhY2VFZGl0VG9Nb25hY28oZWRpdCk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlc29sdmVSZW5hbWVMb2NhdGlvbjogYXN5bmMgKG1vZGVsLCBwb3NpdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogeyByYW5nZTogTHNwUmFuZ2U7IHBsYWNlaG9sZGVyPzogc3RyaW5nIH0gfCBMc3BSYW5nZSB8IG51bGwgPVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L3ByZXBhcmVSZW5hbWUnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gJ3JhbmdlJyBpbiByZXN1bHQgPyByZXN1bHQucmFuZ2UgOiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSAncGxhY2Vob2xkZXInIGluIHJlc3VsdCAmJiByZXN1bHQucGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICAgICAgPyByZXN1bHQucGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICAgICAgOiBtb2RlbC5nZXRXb3JkQXRQb3NpdGlvbihwb3NpdGlvbik/LndvcmQgPz8gJyc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28ocmFuZ2UpLCB0ZXh0OiBwbGFjZWhvbGRlciB9O1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgY29uc3Qgd29yZCA9IG1vZGVsLmdldFdvcmRBdFBvc2l0aW9uKHBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gd29yZCA/IHtcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2U6IHsgc3RhcnRMaW5lTnVtYmVyOiBwb3NpdGlvbi5saW5lTnVtYmVyLCBzdGFydENvbHVtbjogd29yZC5zdGFydENvbHVtbiwgZW5kTGluZU51bWJlcjogcG9zaXRpb24ubGluZU51bWJlciwgZW5kQ29sdW1uOiB3b3JkLmVuZENvbHVtbiB9LFxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiB3b3JkLndvcmQsXG4gICAgICAgICAgICAgICAgfSA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBSZWdpc3RlcmluZyB0aGlzIHByb3ZpZGVyIGFsc28gZW5hYmxlcyBlZGl0b3IuanMncyBleGlzdGluZyBmb3JtYXQtb24tc2F2ZSBwYXRoIGZvciBKYXZhOiB0aGVcbiAgICAvLyBzaGFyZWQgU2F2ZSBhY3Rpb24gcnVucyBlZGl0b3IuYWN0aW9uLmZvcm1hdERvY3VtZW50IHdoZW4gYXV0by1mb3JtYXR0aW5nIGlzIG9uICh0aGUgc2FtZVxuICAgIC8vIG1lY2hhbmlzbSBhbmQgZ2xvYmFsIHRvZ2dsZSB1c2VkIGZvciBUeXBlU2NyaXB0KS5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyRG9jdW1lbnRGb3JtYXR0aW5nRWRpdFByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlRG9jdW1lbnRGb3JtYXR0aW5nRWRpdHM6IGFzeW5jIChtb2RlbCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBlZGl0czogVGV4dEVkaXRbXSB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L2Zvcm1hdHRpbmcnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiAgICAgIHsgdGFiU2l6ZTogbW9kZWwuZ2V0T3B0aW9ucygpLnRhYlNpemUsIGluc2VydFNwYWNlczogbW9kZWwuZ2V0T3B0aW9ucygpLmluc2VydFNwYWNlcyB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gZWRpdHMgPyBlZGl0cy5tYXAodGV4dEVkaXRUb01vbmFjbykgOiBudWxsO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckNvZGVBY3Rpb25Qcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZUNvZGVBY3Rpb25zOiBhc3luYyAobW9kZWwsIHJhbmdlLCBjb250ZXh0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbXB0eSA9IHsgYWN0aW9uczogW10sIGRpc3Bvc2UoKSB7IC8qIG5vdGhpbmcgdG8gZGlzcG9zZSAqLyB9IH07XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gZW1wdHk7XG4gICAgICAgICAgICAvLyBTZW5kIHRoZSBvcmlnaW5hbCBMU1AgZGlhZ25vc3RpY3MgdGhhdCBvdmVybGFwIHRoZSByYW5nZSAodGhleSBjYXJyeSB0aGUgY29kZS9kYXRhIEpEVC5MU1xuICAgICAgICAgICAgLy8gbmVlZHMgdG8gY29tcHV0ZSBxdWljay1maXhlcyksIG5vdCBvbmVzIHJlY29uc3RydWN0ZWQgZnJvbSBNb25hY28gbWFya2Vycy5cbiAgICAgICAgICAgIGNvbnN0IGxzcFJhbmdlID0gbW9uYWNvUmFuZ2VUb0xzcChyYW5nZSk7XG4gICAgICAgICAgICBjb25zdCBkaWFnbm9zdGljcyA9IChfZGlhZ25vc3RpY3MuZ2V0KG1vZGVsLnVyaS50b1N0cmluZygpKSA/PyBbXSkuZmlsdGVyKGQgPT4gcmFuZ2VzT3ZlcmxhcChkLnJhbmdlLCBsc3BSYW5nZSkpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBBcnJheTxDb2RlQWN0aW9uIHwgQ29tbWFuZD4gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9jb2RlQWN0aW9uJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICAgICAgcmFuZ2U6ICAgICAgICBsc3BSYW5nZSxcbiAgICAgICAgICAgICAgICBjb250ZXh0OiAgICAgIHsgZGlhZ25vc3RpY3MsIG9ubHk6IGNvbnRleHQub25seSA/IFtjb250ZXh0Lm9ubHldIDogdW5kZWZpbmVkIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0Py5sZW5ndGgpIHJldHVybiBlbXB0eTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgYWN0aW9uczogcmVzdWx0Lm1hcChsc3BDb2RlQWN0aW9uVG9Nb25hY28pLFxuICAgICAgICAgICAgICAgIGRpc3Bvc2UoKSB7IC8qIG5vdGhpbmcgdG8gZGlzcG9zZSAqLyB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICB9LCB7XG4gICAgICAgIHByb3ZpZGVkQ29kZUFjdGlvbktpbmRzOiBbJ3F1aWNrZml4JywgJ3JlZmFjdG9yJywgJ3JlZmFjdG9yLmV4dHJhY3QnLCAncmVmYWN0b3IuaW5saW5lJyxcbiAgICAgICAgICAgICdyZWZhY3Rvci5yZXdyaXRlJywgJ3NvdXJjZScsICdzb3VyY2Uub3JnYW5pemVJbXBvcnRzJ10sXG4gICAgfSk7XG5cbiAgICAvLyAtLS0gTmF2aWdhdGlvbiAmIHN0cnVjdHVyZSAoUGFjayAxKSAtLS1cblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJJbXBsZW1lbnRhdGlvblByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlSW1wbGVtZW50YXRpb246IChtb2RlbCwgcG9zaXRpb24pID0+IHJlcXVlc3RMb2NhdGlvbnMoJ3RleHREb2N1bWVudC9pbXBsZW1lbnRhdGlvbicsIG1vZGVsLCBwb3NpdGlvbiksXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyVHlwZURlZmluaXRpb25Qcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZVR5cGVEZWZpbml0aW9uOiAobW9kZWwsIHBvc2l0aW9uKSA9PiByZXF1ZXN0TG9jYXRpb25zKCd0ZXh0RG9jdW1lbnQvdHlwZURlZmluaXRpb24nLCBtb2RlbCwgcG9zaXRpb24pLFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckRvY3VtZW50SGlnaGxpZ2h0UHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVEb2N1bWVudEhpZ2hsaWdodHM6IGFzeW5jIChtb2RlbCwgcG9zaXRpb24pID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBhbnlbXSB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L2RvY3VtZW50SGlnaGxpZ2h0Jywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5tYXAoaCA9PiAoeyByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhoLnJhbmdlKSwga2luZDogaC5raW5kID8gaC5raW5kIC0gMSA6IHVuZGVmaW5lZCB9KSk7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyRG9jdW1lbnRTeW1ib2xQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZURvY3VtZW50U3ltYm9sczogYXN5bmMgKG1vZGVsKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55W10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9kb2N1bWVudFN5bWJvbCcsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0ID8gbWFwRG9jdW1lbnRTeW1ib2xzKHJlc3VsdCkgOiBudWxsO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckZvbGRpbmdSYW5nZVByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlRm9sZGluZ1JhbmdlczogYXN5bmMgKG1vZGVsKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55W10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9mb2xkaW5nUmFuZ2UnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5tYXAociA9PiAoeyBzdGFydDogci5zdGFydExpbmUgKyAxLCBlbmQ6IHIuZW5kTGluZSArIDEsIGtpbmQ6IGZvbGRpbmdLaW5kKHIua2luZCkgfSkpO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlclNlbGVjdGlvblJhbmdlUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVTZWxlY3Rpb25SYW5nZXM6IGFzeW5jIChtb2RlbCwgcG9zaXRpb25zKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55W10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9zZWxlY3Rpb25SYW5nZScsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uczogICAgcG9zaXRpb25zLm1hcChwID0+ICh7IGxpbmU6IHAubGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogcC5jb2x1bW4gLSAxIH0pKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5tYXAoZmxhdHRlblNlbGVjdGlvblJhbmdlKTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJEb2N1bWVudFJhbmdlRm9ybWF0dGluZ0VkaXRQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZURvY3VtZW50UmFuZ2VGb3JtYXR0aW5nRWRpdHM6IGFzeW5jIChtb2RlbCwgcmFuZ2UpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgZWRpdHM6IFRleHRFZGl0W10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9yYW5nZUZvcm1hdHRpbmcnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgICAgICByYW5nZTogICAgICAgIG1vbmFjb1JhbmdlVG9Mc3AocmFuZ2UpLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6ICAgICAgeyB0YWJTaXplOiBtb2RlbC5nZXRPcHRpb25zKCkudGFiU2l6ZSwgaW5zZXJ0U3BhY2VzOiBtb2RlbC5nZXRPcHRpb25zKCkuaW5zZXJ0U3BhY2VzIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBlZGl0cyA/IGVkaXRzLm1hcCh0ZXh0RWRpdFRvTW9uYWNvKSA6IG51bGw7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyAtLS0gSW5sYXkgaGludHMgKyBzZW1hbnRpYyBoaWdobGlnaHRpbmcgKFBhY2sgMikgLS0tXG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVySW5sYXlIaW50c1Byb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlSW5sYXlIaW50czogYXN5bmMgKG1vZGVsLCByYW5nZSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IGFueVtdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvaW5sYXlIaW50Jywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICAgICAgcmFuZ2U6ICAgICAgICBtb25hY29SYW5nZVRvTHNwKHJhbmdlKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBoaW50czogcmVzdWx0Lm1hcChoID0+ICh7XG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lTnVtYmVyOiBoLnBvc2l0aW9uLmxpbmUgKyAxLCBjb2x1bW46IGgucG9zaXRpb24uY2hhcmFjdGVyICsgMSB9LFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogICAgICAgIHR5cGVvZiBoLmxhYmVsID09PSAnc3RyaW5nJyA/IGgubGFiZWwgOiAoaC5sYWJlbCA/PyBbXSkubWFwKChwOiBhbnkpID0+ICh7IGxhYmVsOiBwLnZhbHVlIH0pKSxcbiAgICAgICAgICAgICAgICAgICAga2luZDogICAgICAgICBoLmtpbmQsXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmdMZWZ0OiAgaC5wYWRkaW5nTGVmdCxcbiAgICAgICAgICAgICAgICAgICAgcGFkZGluZ1JpZ2h0OiBoLnBhZGRpbmdSaWdodCxcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcDogICAgICBoLnRvb2x0aXAgPyBtYXJrdXBUb1N0cmluZyhoLnRvb2x0aXApIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgICBkaXNwb3NlKCkgeyAvKiBub3RoaW5nIHRvIGRpc3Bvc2UgKi8gfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyRG9jdW1lbnRTZW1hbnRpY1Rva2Vuc1Byb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBnZXRMZWdlbmQ6ICgpID0+IF9zZW1hbnRpY1Rva2Vuc0xlZ2VuZCA/PyB7IHRva2VuVHlwZXM6IFtdLCB0b2tlbk1vZGlmaWVyczogW10gfSxcbiAgICAgICAgcHJvdmlkZURvY3VtZW50U2VtYW50aWNUb2tlbnM6IGFzeW5jIChtb2RlbCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSB8fCAhX3NlbWFudGljVG9rZW5zTGVnZW5kKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogeyBkYXRhOiBudW1iZXJbXTsgcmVzdWx0SWQ/OiBzdHJpbmcgfSB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L3NlbWFudGljVG9rZW5zL2Z1bGwnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQ/LmRhdGEpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogbmV3IFVpbnQzMkFycmF5KHJlc3VsdC5kYXRhKSwgcmVzdWx0SWQ6IHJlc3VsdC5yZXN1bHRJZCB9O1xuICAgICAgICB9LFxuICAgICAgICByZWxlYXNlRG9jdW1lbnRTZW1hbnRpY1Rva2VuczogKCkgPT4geyAvKiBub3RoaW5nIHRvIHJlbGVhc2UgKi8gfSxcbiAgICB9KTtcblxuICAgIC8vIC0tLSBDb2RlTGVucyAoUGFjayAzKSAtLS1cblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJDb2RlTGVuc1Byb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlQ29kZUxlbnNlczogYXN5bmMgKG1vZGVsKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4geyBsZW5zZXM6IFtdLCBkaXNwb3NlKCkgeyAvKiAqLyB9IH07XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IGFueVtdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvY29kZUxlbnMnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgbGVuc2VzID0gKHJlc3VsdCA/PyBbXSkubWFwKChsZW5zLCBpKSA9PiAoe1xuICAgICAgICAgICAgICAgIHJhbmdlOiAgICBsc3BSYW5nZVRvTW9uYWNvKGxlbnMucmFuZ2UpLFxuICAgICAgICAgICAgICAgIGlkOiAgICAgICBTdHJpbmcoaSksXG4gICAgICAgICAgICAgICAgY29tbWFuZDogIGxlbnMuY29tbWFuZCA/IG1hcExlbnNDb21tYW5kKGxlbnMuY29tbWFuZCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgX2xzcDogICAgIGxlbnMsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICByZXR1cm4geyBsZW5zZXMsIGRpc3Bvc2UoKSB7IC8qICovIH0gfTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVzb2x2ZUNvZGVMZW5zOiBhc3luYyAoX21vZGVsLCBjb2RlTGVucykgPT4ge1xuICAgICAgICAgICAgY29uc3QgbHNwID0gKGNvZGVMZW5zIGFzIGFueSkuX2xzcDtcbiAgICAgICAgICAgIGlmIChfY29ubiAmJiBsc3AgJiYgIWxzcC5jb21tYW5kKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWQ6IGFueSA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCdjb2RlTGVucy9yZXNvbHZlJywgbHNwKTtcbiAgICAgICAgICAgICAgICAgICAgY29kZUxlbnMuY29tbWFuZCA9IHJlc29sdmVkPy5jb21tYW5kID8gbWFwTGVuc0NvbW1hbmQocmVzb2x2ZWQuY29tbWFuZCkgOiB7IGlkOiBOT09QX0NPTU1BTkQsIHRpdGxlOiAnJyB9O1xuICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICBjb2RlTGVucy5jb21tYW5kID0geyBpZDogTk9PUF9DT01NQU5ELCB0aXRsZTogJycgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29kZUxlbnM7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyAtLS0gSmF2YSBrZXl3b3JkIGNvbXBsZXRpb24gKFBhY2sgMWIpOiBhbHdheXMtYXZhaWxhYmxlLCByYW5rZWQgYmVsb3cgU0RLL0xTUCByZXN1bHRzIC0tLVxuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckNvbXBsZXRpb25JdGVtUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVDb21wbGV0aW9uSXRlbXM6IChtb2RlbCwgcG9zaXRpb24pID0+IHtcbiAgICAgICAgICAgIGlmICghaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCB3b3JkID0gbW9kZWwuZ2V0V29yZFVudGlsUG9zaXRpb24ocG9zaXRpb24pO1xuICAgICAgICAgICAgY29uc3QgcmFuZ2U6IG1vbmFjby5JUmFuZ2UgPSB7XG4gICAgICAgICAgICAgICAgc3RhcnRMaW5lTnVtYmVyOiBwb3NpdGlvbi5saW5lTnVtYmVyLCBzdGFydENvbHVtbjogd29yZC5zdGFydENvbHVtbixcbiAgICAgICAgICAgICAgICBlbmRMaW5lTnVtYmVyOiAgIHBvc2l0aW9uLmxpbmVOdW1iZXIsIGVuZENvbHVtbjogICB3b3JkLmVuZENvbHVtbixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb25zOiBKQVZBX0tFWVdPUkRTLm1hcChrZXl3b3JkID0+ICh7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAgICAgIGtleXdvcmQsXG4gICAgICAgICAgICAgICAgICAgIGtpbmQ6ICAgICAgIG1vbmFjby5sYW5ndWFnZXMuQ29tcGxldGlvbkl0ZW1LaW5kLktleXdvcmQsXG4gICAgICAgICAgICAgICAgICAgIGluc2VydFRleHQ6IGtleXdvcmQsXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlLFxuICAgICAgICAgICAgICAgICAgICBzb3J0VGV4dDogICBgOV8ke2tleXdvcmR9YCxcbiAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgIH0pO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBIZWxwZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIGxzcFNldmVyaXR5KHNldmVyaXR5OiBEaWFnbm9zdGljU2V2ZXJpdHkgfCB1bmRlZmluZWQpOiBtb25hY28uTWFya2VyU2V2ZXJpdHkge1xuICAgIHN3aXRjaCAoc2V2ZXJpdHkpIHtcbiAgICAgICAgY2FzZSBEaWFnbm9zdGljU2V2ZXJpdHkuRXJyb3I6ICAgICAgIHJldHVybiBtb25hY28uTWFya2VyU2V2ZXJpdHkuRXJyb3I7XG4gICAgICAgIGNhc2UgRGlhZ25vc3RpY1NldmVyaXR5Lldhcm5pbmc6ICAgICByZXR1cm4gbW9uYWNvLk1hcmtlclNldmVyaXR5Lldhcm5pbmc7XG4gICAgICAgIGNhc2UgRGlhZ25vc3RpY1NldmVyaXR5LkluZm9ybWF0aW9uOiByZXR1cm4gbW9uYWNvLk1hcmtlclNldmVyaXR5LkluZm87XG4gICAgICAgIGNhc2UgRGlhZ25vc3RpY1NldmVyaXR5LkhpbnQ6ICAgICAgICByZXR1cm4gbW9uYWNvLk1hcmtlclNldmVyaXR5LkhpbnQ7XG4gICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9uYWNvLk1hcmtlclNldmVyaXR5LkVycm9yO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gbHNwUmFuZ2VUb01vbmFjbyhyOiB7IHN0YXJ0OiB7IGxpbmU6IG51bWJlcjsgY2hhcmFjdGVyOiBudW1iZXIgfTsgZW5kOiB7IGxpbmU6IG51bWJlcjsgY2hhcmFjdGVyOiBudW1iZXIgfSB9KTogbW9uYWNvLklSYW5nZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnRMaW5lTnVtYmVyOiByLnN0YXJ0LmxpbmUgKyAxLFxuICAgICAgICBzdGFydENvbHVtbjogICAgIHIuc3RhcnQuY2hhcmFjdGVyICsgMSxcbiAgICAgICAgZW5kTGluZU51bWJlcjogICByLmVuZC5saW5lICsgMSxcbiAgICAgICAgZW5kQ29sdW1uOiAgICAgICByLmVuZC5jaGFyYWN0ZXIgKyAxLFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIG1hcmt1cFRvU3RyaW5nKGM6IHN0cmluZyB8IE1hcmt1cENvbnRlbnQpOiBzdHJpbmcge1xuICAgIHJldHVybiB0eXBlb2YgYyA9PT0gJ3N0cmluZycgPyBjIDogYy52YWx1ZTtcbn1cblxuZnVuY3Rpb24gbHNwQ29tcGxldGlvbktpbmQoa2luZDogQ29tcGxldGlvbkl0ZW1LaW5kIHwgdW5kZWZpbmVkKTogbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbUtpbmQge1xuICAgIGNvbnN0IEsgPSBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtS2luZDtcbiAgICBzd2l0Y2ggKGtpbmQpIHtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuVGV4dDogICAgICAgICAgcmV0dXJuIEsuVGV4dDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuTWV0aG9kOiAgICAgICAgcmV0dXJuIEsuTWV0aG9kO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5GdW5jdGlvbjogICAgICByZXR1cm4gSy5GdW5jdGlvbjtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuQ29uc3RydWN0b3I6ICAgcmV0dXJuIEsuQ29uc3RydWN0b3I7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLkZpZWxkOiAgICAgICAgIHJldHVybiBLLkZpZWxkO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5WYXJpYWJsZTogICAgICByZXR1cm4gSy5WYXJpYWJsZTtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuQ2xhc3M6ICAgICAgICAgcmV0dXJuIEsuQ2xhc3M7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLkludGVyZmFjZTogICAgIHJldHVybiBLLkludGVyZmFjZTtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuTW9kdWxlOiAgICAgICAgcmV0dXJuIEsuTW9kdWxlO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5Qcm9wZXJ0eTogICAgICByZXR1cm4gSy5Qcm9wZXJ0eTtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuS2V5d29yZDogICAgICAgcmV0dXJuIEsuS2V5d29yZDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuU25pcHBldDogICAgICAgcmV0dXJuIEsuU25pcHBldDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuQ29uc3RhbnQ6ICAgICAgcmV0dXJuIEsuQ29uc3RhbnQ7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLlN0cnVjdDogICAgICAgIHJldHVybiBLLlN0cnVjdDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuVHlwZVBhcmFtZXRlcjogcmV0dXJuIEsuVHlwZVBhcmFtZXRlcjtcbiAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEsuVGV4dDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGxzcENvbXBsZXRpb25Ub01vbmFjbyhcbiAgICBpdGVtOiBDb21wbGV0aW9uSXRlbSxcbiAgICBtb2RlbDogbW9uYWNvLmVkaXRvci5JVGV4dE1vZGVsLFxuICAgIHBvc2l0aW9uOiBtb25hY28uUG9zaXRpb24sXG4pOiBNb25hY29Db21wbGV0aW9uSXRlbSB7XG4gICAgY29uc3Qgd29yZCA9IG1vZGVsLmdldFdvcmRVbnRpbFBvc2l0aW9uKHBvc2l0aW9uKTtcbiAgICBsZXQgcmFuZ2U6IG1vbmFjby5JUmFuZ2UgPSB7XG4gICAgICAgIHN0YXJ0TGluZU51bWJlcjogcG9zaXRpb24ubGluZU51bWJlcixcbiAgICAgICAgc3RhcnRDb2x1bW46ICAgICB3b3JkLnN0YXJ0Q29sdW1uLFxuICAgICAgICBlbmRMaW5lTnVtYmVyOiAgIHBvc2l0aW9uLmxpbmVOdW1iZXIsXG4gICAgICAgIGVuZENvbHVtbjogICAgICAgd29yZC5lbmRDb2x1bW4sXG4gICAgfTtcbiAgICBsZXQgaW5zZXJ0VGV4dCA9IGl0ZW0uaW5zZXJ0VGV4dCA/PyBpdGVtLmxhYmVsO1xuICAgIGNvbnN0IHRleHRFZGl0ID0gaXRlbS50ZXh0RWRpdCBhcyB7IHJhbmdlPzogTHNwUmFuZ2U7IHJlcGxhY2U/OiBMc3BSYW5nZTsgaW5zZXJ0PzogTHNwUmFuZ2U7IG5ld1RleHQ/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcbiAgICBpZiAodGV4dEVkaXQpIHtcbiAgICAgICAgY29uc3QgciA9IHRleHRFZGl0LnJhbmdlID8/IHRleHRFZGl0LnJlcGxhY2UgPz8gdGV4dEVkaXQuaW5zZXJ0O1xuICAgICAgICBpZiAocikgcmFuZ2UgPSBsc3BSYW5nZVRvTW9uYWNvKHIpO1xuICAgICAgICBpZiAodHlwZW9mIHRleHRFZGl0Lm5ld1RleHQgPT09ICdzdHJpbmcnKSBpbnNlcnRUZXh0ID0gdGV4dEVkaXQubmV3VGV4dDtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0OiBNb25hY29Db21wbGV0aW9uSXRlbSA9IHtcbiAgICAgICAgbGFiZWw6ICAgICAgICAgICBpdGVtLmxhYmVsLFxuICAgICAgICBraW5kOiAgICAgICAgICAgIGxzcENvbXBsZXRpb25LaW5kKGl0ZW0ua2luZCksXG4gICAgICAgIGRldGFpbDogICAgICAgICAgaXRlbS5kZXRhaWwsXG4gICAgICAgIGRvY3VtZW50YXRpb246ICAgaXRlbS5kb2N1bWVudGF0aW9uID8geyB2YWx1ZTogbWFya3VwVG9TdHJpbmcoaXRlbS5kb2N1bWVudGF0aW9uKSwgaXNUcnVzdGVkOiBmYWxzZSB9IDogdW5kZWZpbmVkLFxuICAgICAgICBpbnNlcnRUZXh0LFxuICAgICAgICBpbnNlcnRUZXh0UnVsZXM6IGl0ZW0uaW5zZXJ0VGV4dEZvcm1hdCA9PT0gSW5zZXJ0VGV4dEZvcm1hdC5TbmlwcGV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbUluc2VydFRleHRSdWxlLkluc2VydEFzU25pcHBldFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgcmFuZ2UsXG4gICAgICAgIHNvcnRUZXh0OiAgICAgICAgICAgIHNka1ByaW9yaXRpc2VkU29ydFRleHQoaXRlbSksXG4gICAgICAgIGZpbHRlclRleHQ6ICAgICAgICAgIGl0ZW0uZmlsdGVyVGV4dCxcbiAgICAgICAgcHJlc2VsZWN0OiAgICAgICAgICAgaXRlbS5wcmVzZWxlY3QsXG4gICAgICAgIGNvbW1pdENoYXJhY3RlcnM6ICAgIGl0ZW0uY29tbWl0Q2hhcmFjdGVycyxcbiAgICAgICAgYWRkaXRpb25hbFRleHRFZGl0czogaXRlbS5hZGRpdGlvbmFsVGV4dEVkaXRzPy5tYXAodGV4dEVkaXRUb01vbmFjbyksXG4gICAgfTtcbiAgICByZXN1bHQuX2xzcCA9IGl0ZW07XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBSYW5rcyBEaXJpZ2libGUgU0RLIHN1Z2dlc3Rpb25zICh7QGNvZGUgb3JnLmVjbGlwc2UuZGlyaWdpYmxlLnNkay4qfSkgYWJvdmUgZXZlcnl0aGluZyBlbHNlIGJ5XG4gKiBwcmVmaXhpbmcgdGhlIHNlcnZlciBzb3J0VGV4dCB3aXRoIGEgcHJpb3JpdHkgYnVja2V0LCBwcmVzZXJ2aW5nIHRoZSBzZXJ2ZXIgb3JkZXIgd2l0aGluIGVhY2ggYnVja2V0LlxuICovXG5mdW5jdGlvbiBzZGtQcmlvcml0aXNlZFNvcnRUZXh0KGl0ZW06IENvbXBsZXRpb25JdGVtKTogc3RyaW5nIHtcbiAgICBjb25zdCBiYXNlID0gaXRlbS5zb3J0VGV4dCA/PyAodHlwZW9mIGl0ZW0ubGFiZWwgPT09ICdzdHJpbmcnID8gaXRlbS5sYWJlbCA6ICcnKTtcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IChpdGVtLmxhYmVsRGV0YWlscyAmJiB0eXBlb2YgaXRlbS5sYWJlbERldGFpbHMuZGVzY3JpcHRpb24gPT09ICdzdHJpbmcnKVxuICAgICAgICA/IGl0ZW0ubGFiZWxEZXRhaWxzLmRlc2NyaXB0aW9uIDogJyc7XG4gICAgY29uc3QgaGF5c3RhY2sgPSBgJHtpdGVtLmRldGFpbCA/PyAnJ30gJHtkZXNjcmlwdGlvbn1gO1xuICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcygnb3JnLmVjbGlwc2UuZGlyaWdpYmxlLnNkaycpID8gYDBfJHtiYXNlfWAgOiBgMV8ke2Jhc2V9YDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ29kZSBhY3Rpb25zLCBjb21tYW5kcywgcmVmYWN0b3IvZ2VuZXJhdGUsIHdvcmtzcGFjZSBlZGl0c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogTW9uYWNvIGNvbW1hbmQgaWQgdXNlZCB0byBhcHBseSBhIGRlZmVycmVkIExTUCBjb2RlIGFjdGlvbiB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgaXQuICovXG5jb25zdCBBUFBMWV9BQ1RJT05fQ09NTUFORCA9ICdkaXJpZ2libGUuamF2YS5hcHBseUNvZGVBY3Rpb24nO1xuXG4vKiogVmlydHVhbCBVUkkgcHJlZml4IG9mIGVkaXRvciBtb2RlbHM7IHN0cmlwcGluZyBpdCB5aWVsZHMgdGhlIElERSB3b3Jrc3BhY2UgcGF0aCAoL3dzL3Byb2ovLi4uKS4gKi9cbmNvbnN0IFZJUlRVQUxfRklMRV9QUkVGSVggPSAnZmlsZTovLy93b3Jrc3BhY2UnO1xuXG4vKiogTW9uYWNvIGNvbW1hbmQgaWQgdXNlZCBmb3IgZGlzcGxheS1vbmx5IENvZGVMZW5zZXMgKGUuZy4gYSByZWZlcmVuY2UgY291bnQgd2l0aCBubyByZXNvbHZlZCBhY3Rpb24pLiAqL1xuY29uc3QgTk9PUF9DT01NQU5EID0gJ2RpcmlnaWJsZS5qYXZhLm5vb3BMZW5zJztcblxuLyoqIEphdmEgU0Uga2V5d29yZHMvbGl0ZXJhbHMgb2ZmZXJlZCBhcyBsb3ctcHJpb3JpdHkgY29tcGxldGlvbiBzbyB0aGV5IGFsd2F5cyBhcHBlYXIgd2hpbGUgdHlwaW5nLiAqL1xuY29uc3QgSkFWQV9LRVlXT1JEUyA9IFsnYWJzdHJhY3QnLCAnYXNzZXJ0JywgJ2Jvb2xlYW4nLCAnYnJlYWsnLCAnYnl0ZScsICdjYXNlJywgJ2NhdGNoJywgJ2NoYXInLCAnY2xhc3MnLFxuICAgICdjb25zdCcsICdjb250aW51ZScsICdkZWZhdWx0JywgJ2RvJywgJ2RvdWJsZScsICdlbHNlJywgJ2VudW0nLCAnZXh0ZW5kcycsICdmaW5hbCcsICdmaW5hbGx5JywgJ2Zsb2F0JyxcbiAgICAnZm9yJywgJ2dvdG8nLCAnaWYnLCAnaW1wbGVtZW50cycsICdpbXBvcnQnLCAnaW5zdGFuY2VvZicsICdpbnQnLCAnaW50ZXJmYWNlJywgJ2xvbmcnLCAnbmF0aXZlJywgJ25ldycsXG4gICAgJ3BhY2thZ2UnLCAncHJpdmF0ZScsICdwcm90ZWN0ZWQnLCAncHVibGljJywgJ3JldHVybicsICdzaG9ydCcsICdzdGF0aWMnLCAnc3RyaWN0ZnAnLCAnc3VwZXInLCAnc3dpdGNoJyxcbiAgICAnc3luY2hyb25pemVkJywgJ3RoaXMnLCAndGhyb3cnLCAndGhyb3dzJywgJ3RyYW5zaWVudCcsICd0cnknLCAndm9pZCcsICd2b2xhdGlsZScsICd3aGlsZScsICd2YXInLFxuICAgICd5aWVsZCcsICdyZWNvcmQnLCAnc2VhbGVkJywgJ3Blcm1pdHMnLCAndHJ1ZScsICdmYWxzZScsICdudWxsJ107XG5cbi8qKiBTaGFyZWQgZGVmaW5pdGlvbi1zdHlsZSBsb2NhdGlvbiByZXF1ZXN0IHVzZWQgYnkgZ28tdG8tZGVmaW5pdGlvbi9pbXBsZW1lbnRhdGlvbi90eXBlLWRlZmluaXRpb24uICovXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0TG9jYXRpb25zKG1ldGhvZDogc3RyaW5nLCBtb2RlbDogbW9uYWNvLmVkaXRvci5JVGV4dE1vZGVsLCBwb3NpdGlvbjogbW9uYWNvLlBvc2l0aW9uKSB7XG4gICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgcmVzdWx0OiBMb2NhdGlvbiB8IExvY2F0aW9uW10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QobWV0aG9kLCB7XG4gICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgfSk7XG4gICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGxvY2F0aW9ucyA9IChBcnJheS5pc0FycmF5KHJlc3VsdCkgPyByZXN1bHQgOiBbcmVzdWx0XSkubWFwKGxvYyA9PiAoeyB1cmk6IG1vbmFjby5VcmkucGFyc2UobG9jLnVyaSksIHJhbmdlOiBsc3BSYW5nZVRvTW9uYWNvKGxvYy5yYW5nZSkgfSkpO1xuICAgIGF3YWl0IGVuc3VyZU1vZGVsc0ZvckxvY2F0aW9ucyhsb2NhdGlvbnMpO1xuICAgIHJldHVybiBsb2NhdGlvbnM7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBpbi1tZW1vcnkgTW9uYWNvIG1vZGVscyBmb3IgdGhlIHdvcmtzcGFjZSBmaWxlcyByZWZlcmVuY2VkIGJ5IHRoZSBnaXZlbiBsb2NhdGlvbnMgKGZldGNoZWRcbiAqIG92ZXIgUkVTVCkgc28gdGhlIHJlZmVyZW5jZXMgLyBwZWVrIHdpZGdldHMgY2FuIHJlbmRlciBhIGNvZGUgcHJldmlldyBcdTIwMTQgTW9uYWNvIGNhbiBvbmx5IHByZXZpZXcgZmlsZXNcbiAqIGl0IGhhcyBhIG1vZGVsIGZvciwgYW5kIHRoaXMgc2luZ2xlLWZpbGUgZWRpdG9yIG90aGVyd2lzZSBoYXMgbm9uZSBmb3Igb3RoZXIgZmlsZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGVuc3VyZU1vZGVsc0ZvckxvY2F0aW9ucyhsb2NhdGlvbnM6IEFycmF5PHsgdXJpOiBtb25hY28uVXJpIH0+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKGxvY2F0aW9ucy5tYXAoYXN5bmMgKHsgdXJpIH0pID0+IHtcbiAgICAgICAgY29uc3QgdXJpU3RyID0gdXJpLnRvU3RyaW5nKCk7XG4gICAgICAgIGlmIChzZWVuLmhhcyh1cmlTdHIpIHx8ICF1cmlTdHIuc3RhcnRzV2l0aChWSVJUVUFMX0ZJTEVfUFJFRklYKSB8fCBtb25hY28uZWRpdG9yLmdldE1vZGVsKHVyaSkpIHJldHVybjtcbiAgICAgICAgc2Vlbi5hZGQodXJpU3RyKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCBmZXRjaFdvcmtzcGFjZUZpbGVUZXh0KHVyaVRvV29ya3NwYWNlUGF0aCh1cmlTdHIpID8/IHVyaVN0cik7XG4gICAgICAgICAgICBpZiAoIW1vbmFjby5lZGl0b3IuZ2V0TW9kZWwodXJpKSkgbW9uYWNvLmVkaXRvci5jcmVhdGVNb2RlbCh0ZXh0LCAnamF2YScsIHVyaSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gcHJldmlldyBqdXN0IHdvbid0IHJlbmRlciBmb3IgdGhpcyBvbmVcbiAgICAgICAgfVxuICAgIH0pKTtcbn1cblxuLyoqIFJlY3Vyc2l2ZWx5IG1hcHMgTFNQIGhpZXJhcmNoaWNhbCBEb2N1bWVudFN5bWJvbHMgdG8gTW9uYWNvJ3Mgc2hhcGUgKGtpbmRzIGFyZSAxLWJhc2VkIHZzIDAtYmFzZWQpLiAqL1xuZnVuY3Rpb24gbWFwRG9jdW1lbnRTeW1ib2xzKHN5bWJvbHM6IGFueVtdKTogbW9uYWNvLmxhbmd1YWdlcy5Eb2N1bWVudFN5bWJvbFtdIHtcbiAgICByZXR1cm4gKHN5bWJvbHMgPz8gW10pLm1hcChzID0+ICh7XG4gICAgICAgIG5hbWU6ICAgICAgICAgICBzLm5hbWUsXG4gICAgICAgIGRldGFpbDogICAgICAgICBzLmRldGFpbCA/PyAnJyxcbiAgICAgICAga2luZDogICAgICAgICAgIChzLmtpbmQgPz8gMSkgLSAxLFxuICAgICAgICB0YWdzOiAgICAgICAgICAgcy50YWdzID8/IFtdLFxuICAgICAgICByYW5nZTogICAgICAgICAgbHNwUmFuZ2VUb01vbmFjbyhzLnJhbmdlKSxcbiAgICAgICAgc2VsZWN0aW9uUmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28ocy5zZWxlY3Rpb25SYW5nZSA/PyBzLnJhbmdlKSxcbiAgICAgICAgY2hpbGRyZW46ICAgICAgIHMuY2hpbGRyZW4gPyBtYXBEb2N1bWVudFN5bWJvbHMocy5jaGlsZHJlbikgOiBbXSxcbiAgICB9KSk7XG59XG5cbmZ1bmN0aW9uIGZvbGRpbmdLaW5kKGtpbmQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IG1vbmFjby5sYW5ndWFnZXMuRm9sZGluZ1JhbmdlS2luZCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgRksgPSBtb25hY28ubGFuZ3VhZ2VzLkZvbGRpbmdSYW5nZUtpbmQ7XG4gICAgc3dpdGNoIChraW5kKSB7XG4gICAgICAgIGNhc2UgJ2NvbW1lbnQnOiByZXR1cm4gRksuQ29tbWVudDtcbiAgICAgICAgY2FzZSAnaW1wb3J0cyc6IHJldHVybiBGSy5JbXBvcnRzO1xuICAgICAgICBjYXNlICdyZWdpb24nOiAgcmV0dXJuIEZLLlJlZ2lvbjtcbiAgICAgICAgZGVmYXVsdDogICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxufVxuXG4vKiogRmxhdHRlbnMgYW4gTFNQIFNlbGVjdGlvblJhbmdlIHBhcmVudC1jaGFpbiBpbnRvIE1vbmFjbydzIGlubmVybW9zdC10by1vdXRlcm1vc3QgYXJyYXkuICovXG5mdW5jdGlvbiBmbGF0dGVuU2VsZWN0aW9uUmFuZ2Uoc2VsZWN0aW9uUmFuZ2U6IGFueSk6IG1vbmFjby5sYW5ndWFnZXMuU2VsZWN0aW9uUmFuZ2VbXSB7XG4gICAgY29uc3QgcmFuZ2VzOiBtb25hY28ubGFuZ3VhZ2VzLlNlbGVjdGlvblJhbmdlW10gPSBbXTtcbiAgICBsZXQgY3VycmVudCA9IHNlbGVjdGlvblJhbmdlO1xuICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICAgIHJhbmdlcy5wdXNoKHsgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28oY3VycmVudC5yYW5nZSkgfSk7XG4gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudDtcbiAgICB9XG4gICAgcmV0dXJuIHJhbmdlcztcbn1cblxuLyoqIE1hcHMgYSBKRFQuTFMgQ29kZUxlbnMgY29tbWFuZCB0byBhIE1vbmFjbyBjb21tYW5kLCB3aXJpbmcgdGhlIHJlZmVyZW5jZXMvaW1wbGVtZW50YXRpb25zIHBlZWsuICovXG5mdW5jdGlvbiBtYXBMZW5zQ29tbWFuZChjbWQ6IGFueSk6IG1vbmFjby5sYW5ndWFnZXMuQ29tbWFuZCB7XG4gICAgY29uc3QgYXJncyA9IGNtZC5hcmd1bWVudHMgPz8gW107XG4gICAgaWYgKChjbWQuY29tbWFuZCA9PT0gJ2phdmEuc2hvdy5yZWZlcmVuY2VzJyB8fCBjbWQuY29tbWFuZCA9PT0gJ2phdmEuc2hvdy5pbXBsZW1lbnRhdGlvbnMnKSAmJiBhcmdzLmxlbmd0aCA+PSAzKSB7XG4gICAgICAgIGNvbnN0IGxvY2F0aW9ucyA9IChhcmdzWzJdID8/IFtdKS5tYXAoKGw6IGFueSkgPT4gKHsgdXJpOiBtb25hY28uVXJpLnBhcnNlKGwudXJpKSwgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28obC5yYW5nZSkgfSkpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6ICAgICAgICAnZWRpdG9yLmFjdGlvbi5zaG93UmVmZXJlbmNlcycsXG4gICAgICAgICAgICB0aXRsZTogICAgIGNtZC50aXRsZSxcbiAgICAgICAgICAgIGFyZ3VtZW50czogW21vbmFjby5VcmkucGFyc2UoYXJnc1swXSksIHsgbGluZU51bWJlcjogYXJnc1sxXS5saW5lICsgMSwgY29sdW1uOiBhcmdzWzFdLmNoYXJhY3RlciArIDEgfSwgbG9jYXRpb25zXSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgaWQ6IE5PT1BfQ09NTUFORCwgdGl0bGU6IGNtZC50aXRsZSB9O1xufVxuXG50eXBlIExzcFJhbmdlID0geyBzdGFydDogeyBsaW5lOiBudW1iZXI7IGNoYXJhY3RlcjogbnVtYmVyIH07IGVuZDogeyBsaW5lOiBudW1iZXI7IGNoYXJhY3RlcjogbnVtYmVyIH0gfTtcblxuLyoqIE1vbmFjbyBjb21wbGV0aW9uIGl0ZW0gY2FycnlpbmcgdGhlIG9yaWdpbmF0aW5nIExTUCBpdGVtIHNvIHJlc29sdmUgY2FuIGZldGNoIGl0cyBpbXBvcnQgZWRpdHMuICovXG50eXBlIE1vbmFjb0NvbXBsZXRpb25JdGVtID0gbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbSAmIHsgX2xzcD86IENvbXBsZXRpb25JdGVtIH07XG5cbmZ1bmN0aW9uIHRleHRFZGl0VG9Nb25hY28oZWRpdDogVGV4dEVkaXQpOiBtb25hY28ubGFuZ3VhZ2VzLlRleHRFZGl0IHtcbiAgICByZXR1cm4geyByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhlZGl0LnJhbmdlKSwgdGV4dDogZWRpdC5uZXdUZXh0IH07XG59XG5cbmZ1bmN0aW9uIG1vbmFjb1JhbmdlVG9Mc3AocjogbW9uYWNvLklSYW5nZSk6IExzcFJhbmdlIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBzdGFydDogeyBsaW5lOiByLnN0YXJ0TGluZU51bWJlciAtIDEsIGNoYXJhY3Rlcjogci5zdGFydENvbHVtbiAtIDEgfSxcbiAgICAgICAgZW5kOiAgIHsgbGluZTogci5lbmRMaW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiByLmVuZENvbHVtbiAtIDEgfSxcbiAgICB9O1xufVxuXG4vKiogVHJ1ZSB3aGVuIHR3byBMU1AgcmFuZ2VzIGludGVyc2VjdCAodXNlZCB0byBwaWNrIHRoZSBkaWFnbm9zdGljcyByZWxldmFudCB0byBhIGNvZGUtYWN0aW9uIHJlcXVlc3QpLiAqL1xuZnVuY3Rpb24gcmFuZ2VzT3ZlcmxhcChhOiBMc3BSYW5nZSwgYjogTHNwUmFuZ2UpOiBib29sZWFuIHtcbiAgICBjb25zdCBub3RBZnRlciA9IChwOiB7IGxpbmU6IG51bWJlcjsgY2hhcmFjdGVyOiBudW1iZXIgfSwgcTogeyBsaW5lOiBudW1iZXI7IGNoYXJhY3RlcjogbnVtYmVyIH0pID0+XG4gICAgICAgIHAubGluZSA8IHEubGluZSB8fCAocC5saW5lID09PSBxLmxpbmUgJiYgcC5jaGFyYWN0ZXIgPD0gcS5jaGFyYWN0ZXIpO1xuICAgIHJldHVybiBub3RBZnRlcihhLnN0YXJ0LCBiLmVuZCkgJiYgbm90QWZ0ZXIoYi5zdGFydCwgYS5lbmQpO1xufVxuXG5mdW5jdGlvbiBsc3BDb2RlQWN0aW9uVG9Nb25hY28oYWN0aW9uOiBDb2RlQWN0aW9uIHwgQ29tbWFuZCk6IG1vbmFjby5sYW5ndWFnZXMuQ29kZUFjdGlvbiB7XG4gICAgY29uc3QgaXNDb21tYW5kID0gdHlwZW9mIChhY3Rpb24gYXMgQ29tbWFuZCkuY29tbWFuZCA9PT0gJ3N0cmluZyc7XG4gICAgY29uc3QgdGl0bGUgPSBhY3Rpb24udGl0bGVcbiAgICAgICAgPz8gKGlzQ29tbWFuZCA/IChhY3Rpb24gYXMgQ29tbWFuZCkuY29tbWFuZCA6IChhY3Rpb24gYXMgQ29kZUFjdGlvbikuY29tbWFuZD8udGl0bGUpXG4gICAgICAgID8/ICdBY3Rpb24nO1xuICAgIGNvbnN0IGtpbmQgPSBpc0NvbW1hbmQgPyAncXVpY2tmaXgnIDogKChhY3Rpb24gYXMgQ29kZUFjdGlvbikua2luZCA/PyAncXVpY2tmaXgnKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB0aXRsZSxcbiAgICAgICAga2luZCxcbiAgICAgICAgZGlhZ25vc3RpY3M6IFtdLFxuICAgICAgICBpc1ByZWZlcnJlZDogKGFjdGlvbiBhcyBDb2RlQWN0aW9uKS5pc1ByZWZlcnJlZCxcbiAgICAgICAgLy8gQXBwbHkgbGF6aWx5IHRocm91Z2ggb3VyIGNvbW1hbmQgc28gd2UgY2FuIHJlc29sdmUsIHJ1biBzZXJ2ZXIgY29tbWFuZHMgYW5kIGFwcGx5IGVkaXRzIHVuaWZvcm1seS5cbiAgICAgICAgY29tbWFuZDogeyBpZDogQVBQTFlfQUNUSU9OX0NPTU1BTkQsIHRpdGxlLCBhcmd1bWVudHM6IFthY3Rpb25dIH0sXG4gICAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gYXBwbHlDb2RlQWN0aW9uKGFjdGlvbjogQ29kZUFjdGlvbiB8IENvbW1hbmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIV9jb25uKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiAoYWN0aW9uIGFzIENvbW1hbmQpLmNvbW1hbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBhd2FpdCBydW5TZXJ2ZXJDb21tYW5kKGFjdGlvbiBhcyBDb21tYW5kKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzb2x2ZWQgPSBhY3Rpb24gYXMgQ29kZUFjdGlvbjtcbiAgICAgICAgaWYgKCFyZXNvbHZlZC5lZGl0ICYmIChyZXNvbHZlZCBhcyB7IGRhdGE/OiB1bmtub3duIH0pLmRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzb2x2ZWQgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgnY29kZUFjdGlvbi9yZXNvbHZlJywgcmVzb2x2ZWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXNvbHZlZC5lZGl0KSBhcHBseVdvcmtzcGFjZUVkaXQocmVzb2x2ZWQuZWRpdCk7XG4gICAgICAgIGlmIChyZXNvbHZlZC5jb21tYW5kKSBhd2FpdCBydW5TZXJ2ZXJDb21tYW5kKHJlc29sdmVkLmNvbW1hbmQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbamF2YS1sc3BdIGNvZGUgYWN0aW9uIGZhaWxlZDonLCAoZSBhcyBFcnJvcik/Lm1lc3NhZ2UgPz8gZSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBpc1dvcmtzcGFjZUVkaXQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBXb3Jrc3BhY2VFZGl0IHtcbiAgICByZXR1cm4gISF2YWx1ZSAmJiAoISEodmFsdWUgYXMgV29ya3NwYWNlRWRpdCkuY2hhbmdlcyB8fCAhISh2YWx1ZSBhcyBXb3Jrc3BhY2VFZGl0KS5kb2N1bWVudENoYW5nZXMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5TZXJ2ZXJDb21tYW5kKGNtZDogQ29tbWFuZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghX2Nvbm4gfHwgIWNtZD8uY29tbWFuZCkgcmV0dXJuO1xuICAgIGlmIChHRU5FUkFURVtjbWQuY29tbWFuZF0pIHtcbiAgICAgICAgYXdhaXQgcnVuR2VuZXJhdGUoY21kLmNvbW1hbmQsIGNtZC5hcmd1bWVudHMgPz8gW10pO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd3b3Jrc3BhY2UvZXhlY3V0ZUNvbW1hbmQnLCB7IGNvbW1hbmQ6IGNtZC5jb21tYW5kLCBhcmd1bWVudHM6IGNtZC5hcmd1bWVudHMgPz8gW10gfSk7XG4gICAgaWYgKGlzV29ya3NwYWNlRWRpdChyZXN1bHQpKSBhcHBseVdvcmtzcGFjZUVkaXQocmVzdWx0KTtcbn1cblxuaW50ZXJmYWNlIEdlbmVyYXRlU3BlYyB7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICBzdGF0dXM6IHN0cmluZztcbiAgICBnZW5lcmF0ZTogc3RyaW5nO1xuICAgIG1lbWJlcnM6IChzdGF0dXM6IGFueSkgPT4gQXJyYXk8eyBsYWJlbDogc3RyaW5nOyByZWY6IGFueSB9PjtcbiAgICBidWlsZEFyZ3M6IChwcm9tcHRBcmdzOiBhbnlbXSwgc3RhdHVzOiBhbnksIHNlbGVjdGVkOiBhbnlbXSkgPT4gYW55W107XG59XG5cbi8qKiBNZW1iZXItbmFtZWQgZmllbGRzIFx1MjE5MiBwaWNrZXIgbGFiZWxzLiAqL1xuZnVuY3Rpb24gZmllbGRMYWJlbChmOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSBmPy5uYW1lID8/IGY/LmZpZWxkTmFtZSA/PyAnJztcbiAgICBjb25zdCB0eXBlID0gZj8udHlwZSA/PyBmPy50eXBlTmFtZTtcbiAgICByZXR1cm4gdHlwZSA/IGAke25hbWV9OiAke3R5cGV9YCA6IGAke25hbWV9YDtcbn1cblxuLyoqXG4gKiBUaGUgSkRULkxTIHNvdXJjZS1nZW5lcmF0aW9uIGNvbW1hbmRzIChjb25zdHJ1Y3RvcnMsIGdldHRlcnMvc2V0dGVycywgdG9TdHJpbmcsIGhhc2hDb2RlL2VxdWFscykuXG4gKiBFYWNoIG1hcHMgdGhlIGNsaWVudCBcIipQcm9tcHRcIiBjb21tYW5kIHRvIHRoZSBzZXJ2ZXIgc3RhdHVzICsgZ2VuZXJhdGUgZGVsZWdhdGUgY29tbWFuZHM7IHRoZSBzdGF0dXNcbiAqIGNhbGwgeWllbGRzIHRoZSBjYW5kaWRhdGUgZmllbGRzIHNob3duIGluIHRoZSBtZW1iZXIgcGlja2VyLCB0aGUgZ2VuZXJhdGUgY2FsbCByZXR1cm5zIHRoZSBlZGl0LlxuICovXG5jb25zdCBHRU5FUkFURTogUmVjb3JkPHN0cmluZywgR2VuZXJhdGVTcGVjPiA9IHtcbiAgICAnamF2YS5hY3Rpb24uZ2VuZXJhdGVDb25zdHJ1Y3RvcnNQcm9tcHQnOiB7XG4gICAgICAgIGxhYmVsOiAnU2VsZWN0IGZpZWxkcyBhbmQgY29uc3RydWN0b3JzJyxcbiAgICAgICAgc3RhdHVzOiAnamF2YS5hY3Rpb24uY2hlY2tDb25zdHJ1Y3RvcnNTdGF0dXMnLFxuICAgICAgICBnZW5lcmF0ZTogJ2phdmEuYWN0aW9uLmdlbmVyYXRlQ29uc3RydWN0b3JzJyxcbiAgICAgICAgbWVtYmVyczogKHMpID0+IChzPy5maWVsZHMgPz8gW10pLm1hcCgoZjogYW55KSA9PiAoeyBsYWJlbDogZmllbGRMYWJlbChmKSwgcmVmOiBmIH0pKSxcbiAgICAgICAgYnVpbGRBcmdzOiAoYXJncywgcywgc2VsKSA9PiBbYXJnc1swXSwgeyBjb25zdHJ1Y3RvcnM6IHM/LmNvbnN0cnVjdG9ycyA/PyBbXSwgZmllbGRzOiBzZWwubWFwKG0gPT4gbS5yZWYpIH1dLFxuICAgIH0sXG4gICAgJ2phdmEuYWN0aW9uLmdlbmVyYXRlVG9TdHJpbmdQcm9tcHQnOiB7XG4gICAgICAgIGxhYmVsOiAnU2VsZWN0IGZpZWxkcyB0byBpbmNsdWRlIGluIHRvU3RyaW5nKCknLFxuICAgICAgICBzdGF0dXM6ICdqYXZhLmFjdGlvbi5jaGVja1RvU3RyaW5nU3RhdHVzJyxcbiAgICAgICAgZ2VuZXJhdGU6ICdqYXZhLmFjdGlvbi5nZW5lcmF0ZVRvU3RyaW5nJyxcbiAgICAgICAgbWVtYmVyczogKHMpID0+IChzPy5maWVsZHMgPz8gW10pLm1hcCgoZjogYW55KSA9PiAoeyBsYWJlbDogZmllbGRMYWJlbChmKSwgcmVmOiBmIH0pKSxcbiAgICAgICAgYnVpbGRBcmdzOiAoYXJncywgX3MsIHNlbCkgPT4gW2FyZ3NbMF0sIHNlbC5tYXAobSA9PiBtLnJlZildLFxuICAgIH0sXG4gICAgJ2phdmEuYWN0aW9uLmhhc2hDb2RlRXF1YWxzUHJvbXB0Jzoge1xuICAgICAgICBsYWJlbDogJ1NlbGVjdCBmaWVsZHMgZm9yIGhhc2hDb2RlKCkgYW5kIGVxdWFscygpJyxcbiAgICAgICAgc3RhdHVzOiAnamF2YS5hY3Rpb24uY2hlY2tIYXNoQ29kZUVxdWFsc1N0YXR1cycsXG4gICAgICAgIGdlbmVyYXRlOiAnamF2YS5hY3Rpb24uZ2VuZXJhdGVIYXNoQ29kZUVxdWFscycsXG4gICAgICAgIG1lbWJlcnM6IChzKSA9PiAocz8uZmllbGRzID8/IFtdKS5tYXAoKGY6IGFueSkgPT4gKHsgbGFiZWw6IGZpZWxkTGFiZWwoZiksIHJlZjogZiB9KSksXG4gICAgICAgIGJ1aWxkQXJnczogKGFyZ3MsIF9zLCBzZWwpID0+IFthcmdzWzBdLCBzZWwubWFwKG0gPT4gbS5yZWYpLCBmYWxzZV0sXG4gICAgfSxcbiAgICAnamF2YS5hY3Rpb24uZ2VuZXJhdGVBY2Nlc3NvcnNQcm9tcHQnOiB7XG4gICAgICAgIGxhYmVsOiAnU2VsZWN0IGZpZWxkcyB0byBnZW5lcmF0ZSBnZXR0ZXJzIGFuZCBzZXR0ZXJzJyxcbiAgICAgICAgc3RhdHVzOiAnamF2YS5hY3Rpb24uY2hlY2tBY2Nlc3NvcnNTdGF0dXMnLFxuICAgICAgICBnZW5lcmF0ZTogJ2phdmEuYWN0aW9uLmdlbmVyYXRlQWNjZXNzb3JzJyxcbiAgICAgICAgbWVtYmVyczogKHMpID0+IChzPy5hY2Nlc3NvcnMgPz8gcyA/PyBbXSkubWFwKChhOiBhbnkpID0+ICh7IGxhYmVsOiBmaWVsZExhYmVsKGEpLCByZWY6IGEgfSkpLFxuICAgICAgICBidWlsZEFyZ3M6IChhcmdzLCBfcywgc2VsKSA9PiBbYXJnc1swXSwgc2VsLm1hcChtID0+IG0ucmVmKV0sXG4gICAgfSxcbiAgICAnamF2YS5hY3Rpb24ub3ZlcnJpZGVNZXRob2RzUHJvbXB0Jzoge1xuICAgICAgICBsYWJlbDogJ1NlbGVjdCBtZXRob2RzIHRvIG92ZXJyaWRlIG9yIGltcGxlbWVudCcsXG4gICAgICAgIHN0YXR1czogJ2phdmEuYWN0aW9uLmxpc3RPdmVycmlkYWJsZU1ldGhvZHMnLFxuICAgICAgICBnZW5lcmF0ZTogJ2phdmEuYWN0aW9uLmFkZE92ZXJyaWRhYmxlTWV0aG9kcycsXG4gICAgICAgIG1lbWJlcnM6IChzKSA9PiAocz8ubWV0aG9kcyA/PyBbXSkubWFwKChtOiBhbnkpID0+ICh7XG4gICAgICAgICAgICBsYWJlbDogYCR7bS5uYW1lfSgkeyhtLnBhcmFtZXRlcnMgPz8gW10pLmpvaW4oJywgJyl9KSR7bS5kZWNsYXJpbmdDbGFzcyA/ICcgOiAnICsgbS5kZWNsYXJpbmdDbGFzcyA6ICcnfWAsXG4gICAgICAgICAgICByZWY6IG0sXG4gICAgICAgIH0pKSxcbiAgICAgICAgYnVpbGRBcmdzOiAoYXJncywgc3RhdHVzLCBzZWwpID0+IFthcmdzWzBdLCB7IG92ZXJyaWRhYmxlTWV0aG9kczogc2VsLm1hcChtID0+IG0ucmVmKSwgdHlwZTogc3RhdHVzPy50eXBlIH1dLFxuICAgIH0sXG59O1xuXG5hc3luYyBmdW5jdGlvbiBydW5HZW5lcmF0ZShwcm9tcHRJZDogc3RyaW5nLCBhcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghX2Nvbm4pIHJldHVybjtcbiAgICBjb25zdCBzcGVjID0gR0VORVJBVEVbcHJvbXB0SWRdO1xuICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd3b3Jrc3BhY2UvZXhlY3V0ZUNvbW1hbmQnLCB7IGNvbW1hbmQ6IHNwZWMuc3RhdHVzLCBhcmd1bWVudHM6IGFyZ3MgfSk7XG4gICAgaWYgKCFzdGF0dXMpIHJldHVybjtcbiAgICBjb25zdCBtZW1iZXJzID0gc3BlYy5tZW1iZXJzKHN0YXR1cyk7XG4gICAgbGV0IHNlbGVjdGVkID0gbWVtYmVycztcbiAgICBjb25zdCBwaWNrZXIgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLmphdmFMc3BNZW1iZXJQaWNrZXI7XG4gICAgaWYgKG1lbWJlcnMubGVuZ3RoICYmIHR5cGVvZiBwaWNrZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY29uc3QgY2hvc2VuOiBzdHJpbmdbXSB8IG51bGwgPSBhd2FpdCBwaWNrZXIoc3BlYy5sYWJlbCwgbWVtYmVycy5tYXAobSA9PiBtLmxhYmVsKSk7XG4gICAgICAgIGlmIChjaG9zZW4gPT09IG51bGwpIHJldHVybjsgLy8gdXNlciBjYW5jZWxsZWQgdGhlIGRpYWxvZ1xuICAgICAgICBzZWxlY3RlZCA9IG1lbWJlcnMuZmlsdGVyKG0gPT4gY2hvc2VuLmluY2x1ZGVzKG0ubGFiZWwpKTtcbiAgICB9XG4gICAgY29uc3QgZWRpdCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd3b3Jrc3BhY2UvZXhlY3V0ZUNvbW1hbmQnLCB7XG4gICAgICAgIGNvbW1hbmQ6IHNwZWMuZ2VuZXJhdGUsXG4gICAgICAgIGFyZ3VtZW50czogc3BlYy5idWlsZEFyZ3MoYXJncywgc3RhdHVzLCBzZWxlY3RlZCksXG4gICAgfSk7XG4gICAgaWYgKGlzV29ya3NwYWNlRWRpdChlZGl0KSkgYXBwbHlXb3Jrc3BhY2VFZGl0KGVkaXQpO1xufVxuXG4vKiogR3JvdXBzIGEgd29ya3NwYWNlIGVkaXQncyB0ZXh0IGVkaXRzIGJ5IGRvY3VtZW50IGFuZCBhcHBsaWVzIHRoZW0gaW4gcGxhY2UgdG8gb3BlbiBNb25hY28gbW9kZWxzLiAqL1xuZnVuY3Rpb24gYXBwbHlXb3Jrc3BhY2VFZGl0KGVkaXQ6IFdvcmtzcGFjZUVkaXQgfCBudWxsIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0KSByZXR1cm47XG4gICAgY29uc3QgYnlVcmk6IFJlY29yZDxzdHJpbmcsIFRleHRFZGl0W10+ID0ge307XG4gICAgaWYgKGVkaXQuY2hhbmdlcykge1xuICAgICAgICBmb3IgKGNvbnN0IHVyaSBpbiBlZGl0LmNoYW5nZXMpIGJ5VXJpW3VyaV0gPSAoYnlVcmlbdXJpXSA/PyBbXSkuY29uY2F0KGVkaXQuY2hhbmdlc1t1cmldKTtcbiAgICB9XG4gICAgaWYgKGVkaXQuZG9jdW1lbnRDaGFuZ2VzKSB7XG4gICAgICAgIGZvciAoY29uc3QgZGMgb2YgZWRpdC5kb2N1bWVudENoYW5nZXMgYXMgYW55W10pIHtcbiAgICAgICAgICAgIGlmIChkYz8udGV4dERvY3VtZW50Py51cmkgJiYgQXJyYXkuaXNBcnJheShkYy5lZGl0cykpIHtcbiAgICAgICAgICAgICAgICBieVVyaVtkYy50ZXh0RG9jdW1lbnQudXJpXSA9IChieVVyaVtkYy50ZXh0RG9jdW1lbnQudXJpXSA/PyBbXSkuY29uY2F0KGRjLmVkaXRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IHVyaSBpbiBieVVyaSkge1xuICAgICAgICBjb25zdCBtb2RlbCA9IG1vbmFjby5lZGl0b3IuZ2V0TW9kZWxzKCkuZmluZChtID0+IG0udXJpLnRvU3RyaW5nKCkgPT09IHVyaSk7XG4gICAgICAgIGlmICghbW9kZWwpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBvcHMgPSBieVVyaVt1cmldLm1hcChlID0+ICh7IHJhbmdlOiBsc3BSYW5nZVRvTW9uYWNvKGUucmFuZ2UpLCB0ZXh0OiBlLm5ld1RleHQsIGZvcmNlTW92ZU1hcmtlcnM6IHRydWUgfSkpO1xuICAgICAgICBtb2RlbC5wdXNoRWRpdE9wZXJhdGlvbnMoW10sIG9wcywgKCkgPT4gbnVsbCk7XG4gICAgfVxufVxuXG4vKiogQ29udmVydHMgYW4gTFNQIHdvcmtzcGFjZSBlZGl0IGludG8gdGhlIE1vbmFjbyBzaGFwZSByZXR1cm5lZCBieSB0aGUgcmVuYW1lIHByb3ZpZGVyLiAqL1xuZnVuY3Rpb24gd29ya3NwYWNlRWRpdFRvTW9uYWNvKGVkaXQ6IFdvcmtzcGFjZUVkaXQgfCBudWxsKTogbW9uYWNvLmxhbmd1YWdlcy5Xb3Jrc3BhY2VFZGl0IHtcbiAgICBjb25zdCBlZGl0czogYW55W10gPSBbXTtcbiAgICBjb25zdCBwdXNoID0gKHVyaTogc3RyaW5nLCBsaXN0OiBUZXh0RWRpdFtdKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgZSBvZiBsaXN0KSB7XG4gICAgICAgICAgICBlZGl0cy5wdXNoKHsgcmVzb3VyY2U6IG1vbmFjby5VcmkucGFyc2UodXJpKSwgdGV4dEVkaXQ6IHsgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28oZS5yYW5nZSksIHRleHQ6IGUubmV3VGV4dCB9LCB2ZXJzaW9uSWQ6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgaWYgKGVkaXQ/LmNoYW5nZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCB1cmkgaW4gZWRpdC5jaGFuZ2VzKSBwdXNoKHVyaSwgZWRpdC5jaGFuZ2VzW3VyaV0pO1xuICAgIH1cbiAgICBpZiAoZWRpdD8uZG9jdW1lbnRDaGFuZ2VzKSB7XG4gICAgICAgIGZvciAoY29uc3QgZGMgb2YgZWRpdC5kb2N1bWVudENoYW5nZXMgYXMgYW55W10pIHtcbiAgICAgICAgICAgIGlmIChkYz8udGV4dERvY3VtZW50Py51cmkgJiYgQXJyYXkuaXNBcnJheShkYy5lZGl0cykpIHB1c2goZGMudGV4dERvY3VtZW50LnVyaSwgZGMuZWRpdHMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGVkaXRzIH07XG59XG5cbi8qKiBNYXBzIGEgdmlydHVhbCBlZGl0b3IgVVJJIGJhY2sgdG8gdGhlIElERSB3b3Jrc3BhY2UgcGF0aCAoe0Bjb2RlIC93cy9wcm9qLy4uLn0pLiAqL1xuZnVuY3Rpb24gdXJpVG9Xb3Jrc3BhY2VQYXRoKHVyaTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCF1cmkuc3RhcnRzV2l0aChWSVJUVUFMX0ZJTEVfUFJFRklYKSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh1cmkuc3Vic3RyaW5nKFZJUlRVQUxfRklMRV9QUkVGSVgubGVuZ3RoKSk7XG59XG5cbi8qKiBSZWFkcyBhIHdvcmtzcGFjZSBmaWxlJ3MgY3VycmVudCB0ZXh0IG92ZXIgdGhlIElERSBSRVNUIEFQSS4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZldGNoV29ya3NwYWNlRmlsZVRleHQoaWRlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvc2VydmljZXMvaWRlL3dvcmtzcGFjZXMnICsgaWRlUGF0aCwgeyBoZWFkZXJzOiB7ICdYLVJlcXVlc3RlZC1XaXRoJzogJ0ZldGNoJyB9IH0pO1xuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgcmVhZCAke2lkZVBhdGh9IChIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfSlgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTtcbn1cblxuLyoqIEFwcGxpZXMgTFNQIHRleHQgZWRpdHMgdG8gYSBzdHJpbmcuIE9mZnNldHMgYXJlIHJlc29sdmVkIGFnYWluc3QgdGhlIG9yaWdpbmFsIHRleHQgYW5kIGVkaXRzIGFyZVxuICogIGFwcGxpZWQgZnJvbSB0aGUgZW5kIGJhY2t3YXJkcywgc28gZWFybGllciBvZmZzZXRzIHN0YXkgdmFsaWQuICovXG5mdW5jdGlvbiBhcHBseUVkaXRzVG9UZXh0KHRleHQ6IHN0cmluZywgZWRpdHM6IFRleHRFZGl0W10pOiBzdHJpbmcge1xuICAgIGNvbnN0IGxpbmVTdGFydHMgPSBbMF07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICh0ZXh0LmNoYXJDb2RlQXQoaSkgPT09IDEwIC8qIFxcbiAqLykgbGluZVN0YXJ0cy5wdXNoKGkgKyAxKTtcbiAgICB9XG4gICAgY29uc3Qgb2Zmc2V0ID0gKHA6IHsgbGluZTogbnVtYmVyOyBjaGFyYWN0ZXI6IG51bWJlciB9KSA9PiAobGluZVN0YXJ0c1twLmxpbmVdID8/IHRleHQubGVuZ3RoKSArIHAuY2hhcmFjdGVyO1xuICAgIGNvbnN0IG9yZGVyZWQgPSBlZGl0cy5zbGljZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IG9mZnNldChiLnJhbmdlLnN0YXJ0KSAtIG9mZnNldChhLnJhbmdlLnN0YXJ0KSk7XG4gICAgbGV0IHJlc3VsdCA9IHRleHQ7XG4gICAgZm9yIChjb25zdCBlIG9mIG9yZGVyZWQpIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnNsaWNlKDAsIG9mZnNldChlLnJhbmdlLnN0YXJ0KSkgKyBlLm5ld1RleHQgKyByZXN1bHQuc2xpY2Uob2Zmc2V0KGUucmFuZ2UuZW5kKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQXBwbGllcyBhIEpEVC5MUyByZW5hbWUge0BsaW5rIFdvcmtzcGFjZUVkaXR9IGFjcm9zcyB0aGUgd2hvbGUgd29ya3NwYWNlOiB0ZXh0IGVkaXRzIGluIGV2ZXJ5XG4gKiBhZmZlY3RlZCBmaWxlIHBsdXMgYW55IHtAY29kZSBSZW5hbWVGaWxlfSBvcGVyYXRpb24gKGEgcHVibGljLXR5cGUgcmVuYW1lIHJlbmFtZXMgaXRzIG93blxuICoge0Bjb2RlIC5qYXZhfSBmaWxlKS4gVGhlIGN1cnJlbnQgZmlsZSdzIGVkaXRzIGdvIHRocm91Z2ggdGhlIGxpdmUgTW9uYWNvIG1vZGVsOyB0aGUgcmVzdCBhcmUgcmVhZCxcbiAqIGVkaXRlZCBhbmQgd3JpdHRlbiBiYWNrIG92ZXIgUkVTVC4gUGVyc2lzdGVuY2UgKENTUkYtZ3VhcmRlZCB3cml0ZXMsIHRoZSB0YWIgc3dpdGNoIHdoZW4gdGhlIGN1cnJlbnRcbiAqIGZpbGUgaXMgcmVuYW1lZCwgYW5kIHJlbG9hZGluZyBvdGhlciBvcGVuIGVkaXRvcnMpIGlzIGRlbGVnYXRlZCB0byB0aGUgSURFIHZpYSBqYXZhTHNwUGVyc2lzdFJlbmFtZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYXBwbHlSZW5hbWVBY3Jvc3NXb3Jrc3BhY2UobW9kZWw6IG1vbmFjby5lZGl0b3IuSVRleHRNb2RlbCwgZWRpdDogV29ya3NwYWNlRWRpdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGN1cnJlbnRVcmkgPSBtb2RlbC51cmkudG9TdHJpbmcoKTtcbiAgICBjb25zdCB0ZXh0QnlVcmk6IFJlY29yZDxzdHJpbmcsIFRleHRFZGl0W10+ID0ge307XG4gICAgY29uc3QgcmVuYW1lQnlVcmk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgIGlmIChlZGl0LmNoYW5nZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCB1cmkgaW4gZWRpdC5jaGFuZ2VzKSB0ZXh0QnlVcmlbdXJpXSA9ICh0ZXh0QnlVcmlbdXJpXSA/PyBbXSkuY29uY2F0KGVkaXQuY2hhbmdlc1t1cmldKTtcbiAgICB9XG4gICAgaWYgKGVkaXQuZG9jdW1lbnRDaGFuZ2VzKSB7XG4gICAgICAgIGZvciAoY29uc3QgZGMgb2YgZWRpdC5kb2N1bWVudENoYW5nZXMgYXMgYW55W10pIHtcbiAgICAgICAgICAgIGlmIChkYz8ua2luZCA9PT0gJ3JlbmFtZScgJiYgZGMub2xkVXJpICYmIGRjLm5ld1VyaSkge1xuICAgICAgICAgICAgICAgIHJlbmFtZUJ5VXJpW2RjLm9sZFVyaV0gPSBkYy5uZXdVcmk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRjPy50ZXh0RG9jdW1lbnQ/LnVyaSAmJiBBcnJheS5pc0FycmF5KGRjLmVkaXRzKSkge1xuICAgICAgICAgICAgICAgIHRleHRCeVVyaVtkYy50ZXh0RG9jdW1lbnQudXJpXSA9ICh0ZXh0QnlVcmlbZGMudGV4dERvY3VtZW50LnVyaV0gPz8gW10pLmNvbmNhdChkYy5lZGl0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBKRFQuTFMgbWF5IGtleSBhIGZpbGUncyB0ZXh0IGVkaXRzIGJ5IGl0cyBQT1NULXJlbmFtZSBVUkkgKGRvY3VtZW50Q2hhbmdlcyBhcmUgb3JkZXJlZCwgYW5kIHRoZVxuICAgIC8vIHJlbmFtZSBjYW4gcHJlY2VkZSB0aGUgZWRpdCkuIFJlLWF0dHJpYnV0ZSBldmVyeSBlZGl0IHRvIHRoZSBvbi1kaXNrIChvbGQpIFVSSSBzbyB0aGUgY29udGVudCBpc1xuICAgIC8vIGVkaXRlZCBjb3JyZWN0bHkgYmVmb3JlIHRoZSBmaWxlIGlzIHdyaXR0ZW4vcmVuYW1lZCBcdTIwMTQgb3RoZXJ3aXNlIHRoZSBuZXcgZmlsZSBrZWVwcyB0aGUgb2xkIHR5cGVcbiAgICAvLyBuYW1lIGFuZCB0cmlnZ2VycyBcIlRoZSBwdWJsaWMgdHlwZSBYIG11c3QgYmUgZGVmaW5lZCBpbiBpdHMgb3duIGZpbGVcIi5cbiAgICBjb25zdCBuZXdUb09sZDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgIGZvciAoY29uc3Qgb2xkVXJpIGluIHJlbmFtZUJ5VXJpKSBuZXdUb09sZFtyZW5hbWVCeVVyaVtvbGRVcmldXSA9IG9sZFVyaTtcbiAgICBjb25zdCBlZGl0c0J5T2xkOiBSZWNvcmQ8c3RyaW5nLCBUZXh0RWRpdFtdPiA9IHt9O1xuICAgIGZvciAoY29uc3QgdXJpIGluIHRleHRCeVVyaSkge1xuICAgICAgICBjb25zdCBvbkRpc2tVcmkgPSBuZXdUb09sZFt1cmldID8/IHVyaTtcbiAgICAgICAgZWRpdHNCeU9sZFtvbkRpc2tVcmldID0gKGVkaXRzQnlPbGRbb25EaXNrVXJpXSA/PyBbXSkuY29uY2F0KHRleHRCeVVyaVt1cmldKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXlsb2FkOiB7XG4gICAgICAgIGN1cnJlbnRQYXRoOiBzdHJpbmcgfCBudWxsO1xuICAgICAgICBjdXJyZW50Q29udGVudDogc3RyaW5nIHwgbnVsbDtcbiAgICAgICAgY3VycmVudE5ld1BhdGg6IHN0cmluZyB8IG51bGw7XG4gICAgICAgIHdyaXRlczogQXJyYXk8eyBwYXRoOiBzdHJpbmcgfCBudWxsOyBjb250ZW50OiBzdHJpbmcgfT47XG4gICAgICAgIHJlbmFtZXM6IEFycmF5PHsgb2xkUGF0aDogc3RyaW5nIHwgbnVsbDsgbmV3UGF0aDogc3RyaW5nIHwgbnVsbDsgY29udGVudDogc3RyaW5nIH0+O1xuICAgIH0gPSB7IGN1cnJlbnRQYXRoOiB1cmlUb1dvcmtzcGFjZVBhdGgoY3VycmVudFVyaSksIGN1cnJlbnRDb250ZW50OiBudWxsLCBjdXJyZW50TmV3UGF0aDogbnVsbCwgd3JpdGVzOiBbXSwgcmVuYW1lczogW10gfTtcblxuICAgIGNvbnN0IHdhdGNoZWRDaGFuZ2VzOiBBcnJheTx7IHVyaTogc3RyaW5nOyB0eXBlOiBudW1iZXIgfT4gPSBbXTtcbiAgICBjb25zdCBvbGRVcmlzID0gbmV3IFNldDxzdHJpbmc+KFsuLi5PYmplY3Qua2V5cyhlZGl0c0J5T2xkKSwgLi4uT2JqZWN0LmtleXMocmVuYW1lQnlVcmkpXSk7XG4gICAgZm9yIChjb25zdCBvbGRVcmkgb2Ygb2xkVXJpcykge1xuICAgICAgICBjb25zdCBlZGl0cyA9IGVkaXRzQnlPbGRbb2xkVXJpXSA/PyBbXTtcbiAgICAgICAgbGV0IGNvbnRlbnQ6IHN0cmluZztcbiAgICAgICAgaWYgKG9sZFVyaSA9PT0gY3VycmVudFVyaSkge1xuICAgICAgICAgICAgaWYgKGVkaXRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIG1vZGVsLnB1c2hFZGl0T3BlcmF0aW9ucyhbXSwgZWRpdHMubWFwKGUgPT4gKHsgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28oZS5yYW5nZSksIHRleHQ6IGUubmV3VGV4dCwgZm9yY2VNb3ZlTWFya2VyczogdHJ1ZSB9KSksICgpID0+IG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGVudCA9IG1vZGVsLmdldFZhbHVlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBhd2FpdCBmZXRjaFdvcmtzcGFjZUZpbGVUZXh0KHVyaVRvV29ya3NwYWNlUGF0aChvbGRVcmkpID8/IG9sZFVyaSk7XG4gICAgICAgICAgICBjb250ZW50ID0gZWRpdHMubGVuZ3RoID8gYXBwbHlFZGl0c1RvVGV4dChzb3VyY2UsIGVkaXRzKSA6IHNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdVcmkgPSByZW5hbWVCeVVyaVtvbGRVcmldO1xuICAgICAgICBpZiAob2xkVXJpID09PSBjdXJyZW50VXJpKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmN1cnJlbnRDb250ZW50ID0gY29udGVudDtcbiAgICAgICAgICAgIHBheWxvYWQuY3VycmVudE5ld1BhdGggPSBuZXdVcmkgPyB1cmlUb1dvcmtzcGFjZVBhdGgobmV3VXJpKSA6IG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAobmV3VXJpKSB7XG4gICAgICAgICAgICBwYXlsb2FkLnJlbmFtZXMucHVzaCh7IG9sZFBhdGg6IHVyaVRvV29ya3NwYWNlUGF0aChvbGRVcmkpLCBuZXdQYXRoOiB1cmlUb1dvcmtzcGFjZVBhdGgobmV3VXJpKSwgY29udGVudCB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBheWxvYWQud3JpdGVzLnB1c2goeyBwYXRoOiB1cmlUb1dvcmtzcGFjZVBhdGgob2xkVXJpKSwgY29udGVudCB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGaWxlLWNoYW5nZSBldmVudHMgZm9yIEpEVC5MUyBzbyBpdCByZS1zeW5jcyB3aXRob3V0IGEgcGFnZSByZWZyZXNoLlxuICAgICAgICBpZiAobmV3VXJpKSB7XG4gICAgICAgICAgICB3YXRjaGVkQ2hhbmdlcy5wdXNoKHsgdXJpOiBvbGRVcmksIHR5cGU6IDMgLyogRGVsZXRlZCAqLyB9LCB7IHVyaTogbmV3VXJpLCB0eXBlOiAxIC8qIENyZWF0ZWQgKi8gfSk7XG4gICAgICAgICAgICBfb3BlbkZpbGVzLmRlbGV0ZShvbGRVcmkpO1xuICAgICAgICAgICAgX2Nvbm4/LnNlbmROb3RpZmljYXRpb24oJ3RleHREb2N1bWVudC9kaWRDbG9zZScsIHsgdGV4dERvY3VtZW50OiB7IHVyaTogb2xkVXJpIH0gfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3YXRjaGVkQ2hhbmdlcy5wdXNoKHsgdXJpOiBvbGRVcmksIHR5cGU6IDIgLyogQ2hhbmdlZCAqLyB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IChnbG9iYWxUaGlzIGFzIGFueSkuamF2YUxzcFBlcnNpc3RSZW5hbWUocGF5bG9hZCk7XG5cbiAgICAvLyBJbmZvcm0gSkRULkxTIG9mIHRoZSBvbi1kaXNrIGNoYW5nZXMgc28gdGhlIHJlbmFtZWQgdHlwZSdzIGRpYWdub3N0aWNzIGNsZWFyIGltbWVkaWF0ZWx5LlxuICAgIGlmIChfY29ubiAmJiB3YXRjaGVkQ2hhbmdlcy5sZW5ndGgpIHtcbiAgICAgICAgX2Nvbm4uc2VuZE5vdGlmaWNhdGlvbignd29ya3NwYWNlL2RpZENoYW5nZVdhdGNoZWRGaWxlcycsIHsgY2hhbmdlczogd2F0Y2hlZENoYW5nZXMgfSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBqZHRsc1NldHRpbmdzKCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGphdmE6IHtcbiAgICAgICAgICAgIGltcG9ydDoge1xuICAgICAgICAgICAgICAgIG1hdmVuOiAgICAgIHsgZW5hYmxlZDogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIGdyYWRsZTogICAgIHsgZW5hYmxlZDogZmFsc2UgfSxcbiAgICAgICAgICAgICAgICBleGNsdXNpb25zOiBbJyoqL25vZGVfbW9kdWxlcy8qKicsICcqKi8ubWV0YWRhdGEvKionLCAnKiovYXJjaGV0eXBlLXJlc291cmNlcy8qKiddLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGF1dG9idWlsZDogeyBlbmFibGVkOiB0cnVlIH0sXG4gICAgICAgICAgICBjb21wbGV0aW9uOiB7XG4gICAgICAgICAgICAgICAgb3ZlcndyaXRlOiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgZ3Vlc3NNZXRob2RBcmd1bWVudHM6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGZpbHRlcmVkVHlwZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgJ2NvbS5zdW4uKicsICdzdW4uKicsICdqZGsuKicsXG4gICAgICAgICAgICAgICAgICAgICdvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuKicsXG4gICAgICAgICAgICAgICAgICAgICdvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLionLFxuICAgICAgICAgICAgICAgICAgICAnb3JnLmVjbGlwc2Uub3NnaS5pbnRlcm5hbC4qJyxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIGltcG9ydE9yZGVyOiBbJ2phdmEnLCAnamF2YXgnLCAnb3JnJywgJ2NvbScsICcnXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzaWduYXR1cmVIZWxwOiAgeyBlbmFibGVkOiB0cnVlIH0sXG4gICAgICAgICAgICBmb3JtYXQ6ICAgICAgICAgeyBlbmFibGVkOiB0cnVlIH0sXG4gICAgICAgICAgICBzYXZlQWN0aW9uczogICAgeyBvcmdhbml6ZUltcG9ydHM6IGZhbHNlIH0sXG4gICAgICAgICAgICBpbmxheUhpbnRzOiAgICAgeyBwYXJhbWV0ZXJOYW1lczogeyBlbmFibGVkOiAnYWxsJyB9IH0sXG4gICAgICAgICAgICByZWZlcmVuY2VzQ29kZUxlbnM6ICAgICB7IGVuYWJsZWQ6IHRydWUgfSxcbiAgICAgICAgICAgIGltcGxlbWVudGF0aW9uc0NvZGVMZW5zOiB7IGVuYWJsZWQ6IHRydWUgfSxcbiAgICAgICAgfSxcbiAgICB9O1xufVxuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjQgVHlwZUZveCBhbmQgb3RoZXJzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTElDRU5TRSBpbiB0aGUgcGFja2FnZSByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbmltcG9ydCB7IERpc3Bvc2FibGUgfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG5cbmV4cG9ydCBjbGFzcyBEaXNwb3NhYmxlQ29sbGVjdGlvbiBpbXBsZW1lbnRzIERpc3Bvc2FibGUge1xuICAgIHByb3RlY3RlZCByZWFkb25seSBkaXNwb3NhYmxlczogRGlzcG9zYWJsZVtdID0gW107XG5cbiAgICBkaXNwb3NlKCk6IHZvaWQge1xuICAgICAgICB3aGlsZSAodGhpcy5kaXNwb3NhYmxlcy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcG9zYWJsZXMucG9wKCkhLmRpc3Bvc2UoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1c2goZGlzcG9zYWJsZTogRGlzcG9zYWJsZSk6IERpc3Bvc2FibGUge1xuICAgICAgICBjb25zdCBkaXNwb3NhYmxlcyA9IHRoaXMuZGlzcG9zYWJsZXM7XG4gICAgICAgIGRpc3Bvc2FibGVzLnB1c2goZGlzcG9zYWJsZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkaXNwb3NlKCk6IHZvaWQge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gZGlzcG9zYWJsZXMuaW5kZXhPZihkaXNwb3NhYmxlKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3Bvc2FibGVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbn1cbiIsICIvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSAyMDI0IFR5cGVGb3ggYW5kIG90aGVycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExJQ0VOU0UgaW4gdGhlIHBhY2thZ2Ugcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5pbXBvcnQgeyBEaXNwb3NhYmxlIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuaW1wb3J0IHR5cGUgeyBJQ29ubmVjdGlvbiB9IGZyb20gJy4uL3NlcnZlci9jb25uZWN0aW9uLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBJV2ViU29ja2V0IGV4dGVuZHMgRGlzcG9zYWJsZSB7XG4gICAgc2VuZChjb250ZW50OiBzdHJpbmcpOiB2b2lkO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgb25NZXNzYWdlKGNiOiAoZGF0YTogYW55KSA9PiB2b2lkKTogdm9pZDtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIG9uRXJyb3IoY2I6IChyZWFzb246IGFueSkgPT4gdm9pZCk6IHZvaWQ7XG4gICAgb25DbG9zZShjYjogKGNvZGU6IG51bWJlciwgcmVhc29uOiBzdHJpbmcpID0+IHZvaWQpOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElXZWJTb2NrZXRDb25uZWN0aW9uIGV4dGVuZHMgSUNvbm5lY3Rpb24ge1xuICAgIHJlYWRvbmx5IHNvY2tldDogSVdlYlNvY2tldDtcbn1cbiIsICIvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSAyMDI0IFR5cGVGb3ggYW5kIG90aGVycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExJQ0VOU0UgaW4gdGhlIHBhY2thZ2Ugcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5pbXBvcnQgeyBEaXNwb3NhYmxlIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuLy8gVE9ETzogVXNlIGVudmlyb25tZW50LXNwZWNpZmljIGltcG9ydHMgKHZzY29kZS1qc29ucnBjL2Jyb3dzZXIgb3IgdnNjb2RlLWpzb25ycGMvbm9kZSlcbi8vIHdoZW4gdXBncmFkaW5nIHRvIHZzY29kZS1qc29ucnBjQDkueC54LW5leHQuWCB3aGljaCBzdXBwb3J0cyBwcm9wZXIgZXhwb3J0IG1hcHNcbmltcG9ydCB7IHR5cGUgRGF0YUNhbGxiYWNrLCBBYnN0cmFjdE1lc3NhZ2VSZWFkZXIsIE1lc3NhZ2VSZWFkZXIgfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG5pbXBvcnQgdHlwZSB7IElXZWJTb2NrZXQgfSBmcm9tICcuL3NvY2tldC5qcyc7XG5cbmV4cG9ydCBjbGFzcyBXZWJTb2NrZXRNZXNzYWdlUmVhZGVyIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlUmVhZGVyIGltcGxlbWVudHMgTWVzc2FnZVJlYWRlciB7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHNvY2tldDogSVdlYlNvY2tldDtcbiAgICBwcm90ZWN0ZWQgc3RhdGU6ICdpbml0aWFsJyB8ICdsaXN0ZW5pbmcnIHwgJ2Nsb3NlZCcgPSAnaW5pdGlhbCc7XG4gICAgcHJvdGVjdGVkIGNhbGxiYWNrOiBEYXRhQ2FsbGJhY2sgfCB1bmRlZmluZWQ7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZXZlbnRzOiBBcnJheTx7IG1lc3NhZ2U/OiBhbnksIGVycm9yPzogYW55IH0+ID0gW107XG5cbiAgICBjb25zdHJ1Y3Rvcihzb2NrZXQ6IElXZWJTb2NrZXQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7XG4gICAgICAgIHRoaXMuc29ja2V0Lm9uTWVzc2FnZShtZXNzYWdlID0+XG4gICAgICAgICAgICB0aGlzLnJlYWRNZXNzYWdlKG1lc3NhZ2UpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc29ja2V0Lm9uRXJyb3IoZXJyb3IgPT5cbiAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLnNvY2tldC5vbkNsb3NlKChjb2RlLCByZWFzb24pID0+IHtcbiAgICAgICAgICAgIGlmIChjb2RlICE9PSAxMDAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3I6IEVycm9yID0ge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnJyArIGNvZGUsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBFcnJvciBkdXJpbmcgc29ja2V0IHJlY29ubmVjdDogY29kZSA9ICR7Y29kZX0sIHJlYXNvbiA9ICR7cmVhc29ufWBcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZmlyZUNsb3NlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGxpc3RlbihjYWxsYmFjazogRGF0YUNhbGxiYWNrKTogRGlzcG9zYWJsZSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09PSAnaW5pdGlhbCcpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSAnbGlzdGVuaW5nJztcbiAgICAgICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgICAgICAgIHdoaWxlICh0aGlzLmV2ZW50cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBldmVudCA9IHRoaXMuZXZlbnRzLnBvcCgpITtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQubWVzc2FnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVhZE1lc3NhZ2UoZXZlbnQubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5lcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGV2ZW50LmVycm9yKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmVDbG9zZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhbGxiYWNrID09PSBjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gJ2luaXRpYWwnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbGxiYWNrID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBkaXNwb3NlKCkge1xuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSAnaW5pdGlhbCc7XG4gICAgICAgIHRoaXMuY2FsbGJhY2sgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuZXZlbnRzLnNwbGljZSgwLCB0aGlzLmV2ZW50cy5sZW5ndGgpO1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgcHJvdGVjdGVkIHJlYWRNZXNzYWdlKG1lc3NhZ2U6IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gJ2luaXRpYWwnKSB7XG4gICAgICAgICAgICB0aGlzLmV2ZW50cy5zcGxpY2UoMCwgMCwgeyBtZXNzYWdlIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUgPT09ICdsaXN0ZW5pbmcnKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2FsbGJhY2shKGRhdGEpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3I6IEVycm9yID0ge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnJyArIDQwMCxcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYEVycm9yIGR1cmluZyBtZXNzYWdlIHBhcnNpbmcsIHJlYXNvbiA9ICR7dHlwZW9mIGVyciA9PT0gJ29iamVjdCcgPyAoZXJyIGFzIGFueSkubWVzc2FnZSA6ICd1bmtub3duJ31gXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmVFcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBmaXJlRXJyb3IoZXJyb3I6IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gJ2luaXRpYWwnKSB7XG4gICAgICAgICAgICB0aGlzLmV2ZW50cy5zcGxpY2UoMCwgMCwgeyBlcnJvciB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlID09PSAnbGlzdGVuaW5nJykge1xuICAgICAgICAgICAgc3VwZXIuZmlyZUVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBmaXJlQ2xvc2UoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09PSAnaW5pdGlhbCcpIHtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRzLnNwbGljZSgwLCAwLCB7fSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZSA9PT0gJ2xpc3RlbmluZycpIHtcbiAgICAgICAgICAgIHN1cGVyLmZpcmVDbG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhdGUgPSAnY2xvc2VkJztcbiAgICB9XG59XG4iLCAiLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgMjAyNCBUeXBlRm94IGFuZCBvdGhlcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMSUNFTlNFIGluIHRoZSBwYWNrYWdlIHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuaW1wb3J0IHsgTWVzc2FnZSB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcbmltcG9ydCB7IEFic3RyYWN0TWVzc2FnZVdyaXRlciwgTWVzc2FnZVdyaXRlciB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcbmltcG9ydCB0eXBlIHsgSVdlYlNvY2tldCB9IGZyb20gJy4vc29ja2V0LmpzJztcblxuZXhwb3J0IGNsYXNzIFdlYlNvY2tldE1lc3NhZ2VXcml0ZXIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VXcml0ZXIgaW1wbGVtZW50cyBNZXNzYWdlV3JpdGVyIHtcbiAgICBwcm90ZWN0ZWQgZXJyb3JDb3VudCA9IDA7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHNvY2tldDogSVdlYlNvY2tldDtcblxuICAgIGNvbnN0cnVjdG9yKHNvY2tldDogSVdlYlNvY2tldCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnNvY2tldCA9IHNvY2tldDtcbiAgICB9XG5cbiAgICBlbmQoKTogdm9pZCB7XG4gICAgfVxuXG4gICAgYXN5bmMgd3JpdGUobXNnOiBNZXNzYWdlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobXNnKTtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0LnNlbmQoY29udGVudCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMuZXJyb3JDb3VudCsrO1xuICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZSwgbXNnLCB0aGlzLmVycm9yQ291bnQpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjQgVHlwZUZveCBhbmQgb3RoZXJzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTElDRU5TRSBpbiB0aGUgcGFja2FnZSByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbmltcG9ydCB0eXBlIHsgTWVzc2FnZUNvbm5lY3Rpb24sIExvZ2dlciB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcbmltcG9ydCB7IGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuaW1wb3J0IHR5cGUgeyBJV2ViU29ja2V0IH0gZnJvbSAnLi9zb2NrZXQuanMnO1xuaW1wb3J0IHsgV2ViU29ja2V0TWVzc2FnZVJlYWRlciB9IGZyb20gJy4vcmVhZGVyLmpzJztcbmltcG9ydCB7IFdlYlNvY2tldE1lc3NhZ2VXcml0ZXIgfSBmcm9tICcuL3dyaXRlci5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVXZWJTb2NrZXRDb25uZWN0aW9uKHNvY2tldDogSVdlYlNvY2tldCwgbG9nZ2VyOiBMb2dnZXIpOiBNZXNzYWdlQ29ubmVjdGlvbiB7XG4gICAgY29uc3QgbWVzc2FnZVJlYWRlciA9IG5ldyBXZWJTb2NrZXRNZXNzYWdlUmVhZGVyKHNvY2tldCk7XG4gICAgY29uc3QgbWVzc2FnZVdyaXRlciA9IG5ldyBXZWJTb2NrZXRNZXNzYWdlV3JpdGVyKHNvY2tldCk7XG4gICAgY29uc3QgY29ubmVjdGlvbiA9IGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uKG1lc3NhZ2VSZWFkZXIsIG1lc3NhZ2VXcml0ZXIsIGxvZ2dlcik7XG4gICAgY29ubmVjdGlvbi5vbkNsb3NlKCgpID0+IGNvbm5lY3Rpb24uZGlzcG9zZSgpKTtcbiAgICByZXR1cm4gY29ubmVjdGlvbjtcbn1cbiIsICIvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSAyMDI0IFR5cGVGb3ggYW5kIG90aGVycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExJQ0VOU0UgaW4gdGhlIHBhY2thZ2Ugcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5pbXBvcnQgdHlwZSB7IE1lc3NhZ2VDb25uZWN0aW9uLCBMb2dnZXIgfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG5pbXBvcnQgeyBjcmVhdGVXZWJTb2NrZXRDb25uZWN0aW9uIH0gZnJvbSAnLi9zb2NrZXQvY29ubmVjdGlvbi5qcyc7XG5pbXBvcnQgdHlwZSB7IElXZWJTb2NrZXQgfSBmcm9tICcuL3NvY2tldC9zb2NrZXQuanMnO1xuaW1wb3J0IHsgQ29uc29sZUxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGxpc3RlbihvcHRpb25zOiB7XG4gICAgd2ViU29ja2V0OiBXZWJTb2NrZXQ7XG4gICAgbG9nZ2VyPzogTG9nZ2VyO1xuICAgIG9uQ29ubmVjdGlvbjogKGNvbm5lY3Rpb246IE1lc3NhZ2VDb25uZWN0aW9uKSA9PiB2b2lkO1xufSkge1xuICAgIGNvbnN0IHsgd2ViU29ja2V0LCBvbkNvbm5lY3Rpb24gfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgbG9nZ2VyID0gb3B0aW9ucy5sb2dnZXIgfHwgbmV3IENvbnNvbGVMb2dnZXIoKTtcbiAgICB3ZWJTb2NrZXQub25vcGVuID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBzb2NrZXQgPSB0b1NvY2tldCh3ZWJTb2NrZXQpO1xuICAgICAgICBjb25zdCBjb25uZWN0aW9uID0gY3JlYXRlV2ViU29ja2V0Q29ubmVjdGlvbihzb2NrZXQsIGxvZ2dlcik7XG4gICAgICAgIG9uQ29ubmVjdGlvbihjb25uZWN0aW9uKTtcbiAgICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9Tb2NrZXQod2ViU29ja2V0OiBXZWJTb2NrZXQpOiBJV2ViU29ja2V0IHtcbiAgICByZXR1cm4ge1xuICAgICAgICBzZW5kOiBjb250ZW50ID0+IHdlYlNvY2tldC5zZW5kKGNvbnRlbnQpLFxuICAgICAgICBvbk1lc3NhZ2U6IGNiID0+IHtcbiAgICAgICAgICAgIHdlYlNvY2tldC5vbm1lc3NhZ2UgPSBldmVudCA9PiBjYihldmVudC5kYXRhKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25FcnJvcjogY2IgPT4ge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgIHdlYlNvY2tldC5vbmVycm9yID0gKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0Lmhhc093bihldmVudCwgJ21lc3NhZ2UnKSkge1xuICAgICAgICAgICAgICAgICAgICBjYihldmVudC5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBvbkNsb3NlOiBjYiA9PiB7XG4gICAgICAgICAgICB3ZWJTb2NrZXQub25jbG9zZSA9IGV2ZW50ID0+IGNiKGV2ZW50LmNvZGUsIGV2ZW50LnJlYXNvbik7XG4gICAgICAgIH0sXG4gICAgICAgIGRpc3Bvc2U6ICgpID0+IHdlYlNvY2tldC5jbG9zZSgpXG4gICAgfTtcbn1cbiIsICIvKlxuICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMjYgRWNsaXBzZSBEaXJpZ2libGUgY29udHJpYnV0b3JzXG4gKlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlXG4gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2Mi4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG4gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MjAuaHRtbFxuICpcbiAqIFNQRFgtRmlsZUNvcHlyaWdodFRleHQ6IEVjbGlwc2UgRGlyaWdpYmxlIGNvbnRyaWJ1dG9ycyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbi8qKlxuICogTGF6eSBQcm94eSBzaGltIGZvciBNb25hY28gRWRpdG9yIGxvYWRlZCB2aWEgQU1ELlxuICpcbiAqIGVkaXRvci5qcyBzZXRzIGdsb2JhbFRoaXMubW9uYWNvIGluc2lkZSB0aGUgQU1EIHJlcXVpcmUoKSBjYWxsYmFjaywgYmVmb3JlIGFueVxuICogSmF2YUxzcENsaWVudExpYi5jb25uZWN0KCkgY2FsbC4gQWxsIHByb3BlcnR5IGFjY2Vzc2VzIGdvIHRocm91Z2ggUHJveHkuZ2V0KCkgdHJhcHNcbiAqIHNvIHRoZXkgcmVzb2x2ZSBhZ2FpbnN0IHRoZSBsaXZlIHdpbmRvdy5tb25hY28gYXQgY2FsbCB0aW1lLCBub3QgYXQgYnVuZGxlIGxvYWQgdGltZS5cbiAqXG4gKiBUeXBlU2NyaXB0IHJlc29sdmVzIHR5cGVzIGZyb20gdGhlIHJlYWwgbW9uYWNvLWVkaXRvciBkZXZEZXBlbmRlbmN5OyBlc2J1aWxkIHJlcGxhY2VzXG4gKiB0aGUgXCJtb25hY28tZWRpdG9yXCIgaW1wb3J0IHdpdGggdGhpcyBmaWxlIGF0IGJ1bmRsZSB0aW1lIHZpYSB0aGUgYWxpYXMgb3B0aW9uLlxuICovXG5cbnR5cGUgTSA9IHR5cGVvZiBpbXBvcnQoJ21vbmFjby1lZGl0b3InKTtcblxuZnVuY3Rpb24gbSgpOiBNIHtcbiAgICByZXR1cm4gKGdsb2JhbFRoaXMgYXMgYW55KS5tb25hY28gYXMgTTtcbn1cblxuZnVuY3Rpb24gbnM8VCBleHRlbmRzIG9iamVjdD4oZ2V0dGVyOiAoKSA9PiBUKTogVCB7XG4gICAgcmV0dXJuIG5ldyBQcm94eSh7fSBhcyBULCB7XG4gICAgICAgIGdldDogKF8sIGspID0+IChnZXR0ZXIoKSBhcyBhbnkpW2sgYXMgc3RyaW5nXSxcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gY2xzPFQ+KGdldHRlcjogKCkgPT4gVCk6IFQge1xuICAgIHJldHVybiBuZXcgUHJveHkoZnVuY3Rpb24gKCkge30gYXMgYW55LCB7XG4gICAgICAgIGNvbnN0cnVjdDogKF8sIGFyZ3MpID0+IG5ldyAoZ2V0dGVyKCkgYXMgYW55KSguLi5hcmdzKSxcbiAgICAgICAgZ2V0OiAgICAgICAoXywgaykgICAgPT4gKGdldHRlcigpIGFzIGFueSlbayBhcyBzdHJpbmddLFxuICAgIH0pIGFzIFQ7XG59XG5cbmV4cG9ydCBjb25zdCBlZGl0b3IgICAgICAgICA9IG5zKCgpID0+IG0oKS5lZGl0b3IpO1xuZXhwb3J0IGNvbnN0IGxhbmd1YWdlcyAgICAgID0gbnMoKCkgPT4gbSgpLmxhbmd1YWdlcyk7XG5leHBvcnQgY29uc3QgTWFya2VyU2V2ZXJpdHkgPSBucygoKSA9PiBtKCkuTWFya2VyU2V2ZXJpdHkpO1xuZXhwb3J0IGNvbnN0IE1hcmtlclRhZyAgICAgID0gbnMoKCkgPT4gKG0oKSBhcyBhbnkpLk1hcmtlclRhZyk7XG5leHBvcnQgY29uc3QgVXJpICAgICAgICAgICAgPSBjbHMoKCkgPT4gbSgpLlVyaSk7XG5leHBvcnQgY29uc3QgUmFuZ2UgICAgICAgICAgPSBjbHMoKCkgPT4gbSgpLlJhbmdlKTtcbmV4cG9ydCBjb25zdCBQb3NpdGlvbiAgICAgICA9IGNscygoKSA9PiBtKCkuUG9zaXRpb24pO1xuZXhwb3J0IGNvbnN0IFNlbGVjdGlvbiAgICAgID0gY2xzKCgpID0+IG0oKS5TZWxlY3Rpb24pO1xuZXhwb3J0IGNvbnN0IEtleUNvZGUgICAgICAgID0gbnMoKCkgPT4gbSgpLktleUNvZGUpO1xuZXhwb3J0IGNvbnN0IEtleU1vZCAgICAgICAgID0gbnMoKCkgPT4gbSgpLktleU1vZCk7XG4iLCAiLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuJ3VzZSBzdHJpY3QnO1xuZXhwb3J0IHZhciBEb2N1bWVudFVyaTtcbihmdW5jdGlvbiAoRG9jdW1lbnRVcmkpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJztcbiAgICB9XG4gICAgRG9jdW1lbnRVcmkuaXMgPSBpcztcbn0pKERvY3VtZW50VXJpIHx8IChEb2N1bWVudFVyaSA9IHt9KSk7XG5leHBvcnQgdmFyIFVSSTtcbihmdW5jdGlvbiAoVVJJKSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZyc7XG4gICAgfVxuICAgIFVSSS5pcyA9IGlzO1xufSkoVVJJIHx8IChVUkkgPSB7fSkpO1xuZXhwb3J0IHZhciBpbnRlZ2VyO1xuKGZ1bmN0aW9uIChpbnRlZ2VyKSB7XG4gICAgaW50ZWdlci5NSU5fVkFMVUUgPSAtMjE0NzQ4MzY0ODtcbiAgICBpbnRlZ2VyLk1BWF9WQUxVRSA9IDIxNDc0ODM2NDc7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgaW50ZWdlci5NSU5fVkFMVUUgPD0gdmFsdWUgJiYgdmFsdWUgPD0gaW50ZWdlci5NQVhfVkFMVUU7XG4gICAgfVxuICAgIGludGVnZXIuaXMgPSBpcztcbn0pKGludGVnZXIgfHwgKGludGVnZXIgPSB7fSkpO1xuZXhwb3J0IHZhciB1aW50ZWdlcjtcbihmdW5jdGlvbiAodWludGVnZXIpIHtcbiAgICB1aW50ZWdlci5NSU5fVkFMVUUgPSAwO1xuICAgIHVpbnRlZ2VyLk1BWF9WQUxVRSA9IDIxNDc0ODM2NDc7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgdWludGVnZXIuTUlOX1ZBTFVFIDw9IHZhbHVlICYmIHZhbHVlIDw9IHVpbnRlZ2VyLk1BWF9WQUxVRTtcbiAgICB9XG4gICAgdWludGVnZXIuaXMgPSBpcztcbn0pKHVpbnRlZ2VyIHx8ICh1aW50ZWdlciA9IHt9KSk7XG4vKipcbiAqIFRoZSBQb3NpdGlvbiBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBQb3NpdGlvbn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgUG9zaXRpb247XG4oZnVuY3Rpb24gKFBvc2l0aW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBQb3NpdGlvbiBsaXRlcmFsIGZyb20gdGhlIGdpdmVuIGxpbmUgYW5kIGNoYXJhY3Rlci5cbiAgICAgKiBAcGFyYW0gbGluZSBUaGUgcG9zaXRpb24ncyBsaW5lLlxuICAgICAqIEBwYXJhbSBjaGFyYWN0ZXIgVGhlIHBvc2l0aW9uJ3MgY2hhcmFjdGVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShsaW5lLCBjaGFyYWN0ZXIpIHtcbiAgICAgICAgaWYgKGxpbmUgPT09IE51bWJlci5NQVhfVkFMVUUpIHtcbiAgICAgICAgICAgIGxpbmUgPSB1aW50ZWdlci5NQVhfVkFMVUU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYXJhY3RlciA9PT0gTnVtYmVyLk1BWF9WQUxVRSkge1xuICAgICAgICAgICAgY2hhcmFjdGVyID0gdWludGVnZXIuTUFYX1ZBTFVFO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGxpbmUsIGNoYXJhY3RlciB9O1xuICAgIH1cbiAgICBQb3NpdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBQb3NpdGlvbn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBJcy51aW50ZWdlcihjYW5kaWRhdGUubGluZSkgJiYgSXMudWludGVnZXIoY2FuZGlkYXRlLmNoYXJhY3Rlcik7XG4gICAgfVxuICAgIFBvc2l0aW9uLmlzID0gaXM7XG59KShQb3NpdGlvbiB8fCAoUG9zaXRpb24gPSB7fSkpO1xuLyoqXG4gKiBUaGUgUmFuZ2UgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgUmFuZ2V9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIFJhbmdlO1xuKGZ1bmN0aW9uIChSYW5nZSkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShvbmUsIHR3bywgdGhyZWUsIGZvdXIpIHtcbiAgICAgICAgaWYgKElzLnVpbnRlZ2VyKG9uZSkgJiYgSXMudWludGVnZXIodHdvKSAmJiBJcy51aW50ZWdlcih0aHJlZSkgJiYgSXMudWludGVnZXIoZm91cikpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHN0YXJ0OiBQb3NpdGlvbi5jcmVhdGUob25lLCB0d28pLCBlbmQ6IFBvc2l0aW9uLmNyZWF0ZSh0aHJlZSwgZm91cikgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChQb3NpdGlvbi5pcyhvbmUpICYmIFBvc2l0aW9uLmlzKHR3bykpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHN0YXJ0OiBvbmUsIGVuZDogdHdvIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJhbmdlI2NyZWF0ZSBjYWxsZWQgd2l0aCBpbnZhbGlkIGFyZ3VtZW50c1ske29uZX0sICR7dHdvfSwgJHt0aHJlZX0sICR7Zm91cn1dYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgUmFuZ2UuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgUmFuZ2V9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgUG9zaXRpb24uaXMoY2FuZGlkYXRlLnN0YXJ0KSAmJiBQb3NpdGlvbi5pcyhjYW5kaWRhdGUuZW5kKTtcbiAgICB9XG4gICAgUmFuZ2UuaXMgPSBpcztcbn0pKFJhbmdlIHx8IChSYW5nZSA9IHt9KSk7XG4vKipcbiAqIFRoZSBMb2NhdGlvbiBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBMb2NhdGlvbn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgTG9jYXRpb247XG4oZnVuY3Rpb24gKExvY2F0aW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIExvY2F0aW9uIGxpdGVyYWwuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgbG9jYXRpb24ncyB1cmkuXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSBsb2NhdGlvbidzIHJhbmdlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmksIHJhbmdlKSB7XG4gICAgICAgIHJldHVybiB7IHVyaSwgcmFuZ2UgfTtcbiAgICB9XG4gICAgTG9jYXRpb24uY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgTG9jYXRpb259IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiAoSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpIHx8IElzLnVuZGVmaW5lZChjYW5kaWRhdGUudXJpKSk7XG4gICAgfVxuICAgIExvY2F0aW9uLmlzID0gaXM7XG59KShMb2NhdGlvbiB8fCAoTG9jYXRpb24gPSB7fSkpO1xuLyoqXG4gKiBUaGUgTG9jYXRpb25MaW5rIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIExvY2F0aW9uTGlua30gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgTG9jYXRpb25MaW5rO1xuKGZ1bmN0aW9uIChMb2NhdGlvbkxpbmspIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgTG9jYXRpb25MaW5rIGxpdGVyYWwuXG4gICAgICogQHBhcmFtIHRhcmdldFVyaSBUaGUgZGVmaW5pdGlvbidzIHVyaS5cbiAgICAgKiBAcGFyYW0gdGFyZ2V0UmFuZ2UgVGhlIGZ1bGwgcmFuZ2Ugb2YgdGhlIGRlZmluaXRpb24uXG4gICAgICogQHBhcmFtIHRhcmdldFNlbGVjdGlvblJhbmdlIFRoZSBzcGFuIG9mIHRoZSBzeW1ib2wgZGVmaW5pdGlvbiBhdCB0aGUgdGFyZ2V0LlxuICAgICAqIEBwYXJhbSBvcmlnaW5TZWxlY3Rpb25SYW5nZSBUaGUgc3BhbiBvZiB0aGUgc3ltYm9sIGJlaW5nIGRlZmluZWQgaW4gdGhlIG9yaWdpbmF0aW5nIHNvdXJjZSBmaWxlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh0YXJnZXRVcmksIHRhcmdldFJhbmdlLCB0YXJnZXRTZWxlY3Rpb25SYW5nZSwgb3JpZ2luU2VsZWN0aW9uUmFuZ2UpIHtcbiAgICAgICAgcmV0dXJuIHsgdGFyZ2V0VXJpLCB0YXJnZXRSYW5nZSwgdGFyZ2V0U2VsZWN0aW9uUmFuZ2UsIG9yaWdpblNlbGVjdGlvblJhbmdlIH07XG4gICAgfVxuICAgIExvY2F0aW9uTGluay5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBMb2NhdGlvbkxpbmt9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnRhcmdldFJhbmdlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnRhcmdldFVyaSlcbiAgICAgICAgICAgICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS50YXJnZXRTZWxlY3Rpb25SYW5nZSlcbiAgICAgICAgICAgICYmIChSYW5nZS5pcyhjYW5kaWRhdGUub3JpZ2luU2VsZWN0aW9uUmFuZ2UpIHx8IElzLnVuZGVmaW5lZChjYW5kaWRhdGUub3JpZ2luU2VsZWN0aW9uUmFuZ2UpKTtcbiAgICB9XG4gICAgTG9jYXRpb25MaW5rLmlzID0gaXM7XG59KShMb2NhdGlvbkxpbmsgfHwgKExvY2F0aW9uTGluayA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb2xvciBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBDb2xvcn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgQ29sb3I7XG4oZnVuY3Rpb24gKENvbG9yKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDb2xvciBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmVkLFxuICAgICAgICAgICAgZ3JlZW4sXG4gICAgICAgICAgICBibHVlLFxuICAgICAgICAgICAgYWxwaGEsXG4gICAgICAgIH07XG4gICAgfVxuICAgIENvbG9yLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIENvbG9yfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgSXMubnVtYmVyUmFuZ2UoY2FuZGlkYXRlLnJlZCwgMCwgMSlcbiAgICAgICAgICAgICYmIElzLm51bWJlclJhbmdlKGNhbmRpZGF0ZS5ncmVlbiwgMCwgMSlcbiAgICAgICAgICAgICYmIElzLm51bWJlclJhbmdlKGNhbmRpZGF0ZS5ibHVlLCAwLCAxKVxuICAgICAgICAgICAgJiYgSXMubnVtYmVyUmFuZ2UoY2FuZGlkYXRlLmFscGhhLCAwLCAxKTtcbiAgICB9XG4gICAgQ29sb3IuaXMgPSBpcztcbn0pKENvbG9yIHx8IChDb2xvciA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb2xvckluZm9ybWF0aW9uIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIENvbG9ySW5mb3JtYXRpb259IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIENvbG9ySW5mb3JtYXRpb247XG4oZnVuY3Rpb24gKENvbG9ySW5mb3JtYXRpb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENvbG9ySW5mb3JtYXRpb24gbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIGNvbG9yKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByYW5nZSxcbiAgICAgICAgICAgIGNvbG9yLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBDb2xvckluZm9ybWF0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIENvbG9ySW5mb3JtYXRpb259IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIENvbG9yLmlzKGNhbmRpZGF0ZS5jb2xvcik7XG4gICAgfVxuICAgIENvbG9ySW5mb3JtYXRpb24uaXMgPSBpcztcbn0pKENvbG9ySW5mb3JtYXRpb24gfHwgKENvbG9ySW5mb3JtYXRpb24gPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29sb3IgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgQ29sb3JQcmVzZW50YXRpb259IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIENvbG9yUHJlc2VudGF0aW9uO1xuKGZ1bmN0aW9uIChDb2xvclByZXNlbnRhdGlvbikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ29sb3JJbmZvcm1hdGlvbiBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShsYWJlbCwgdGV4dEVkaXQsIGFkZGl0aW9uYWxUZXh0RWRpdHMpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgICAgdGV4dEVkaXQsXG4gICAgICAgICAgICBhZGRpdGlvbmFsVGV4dEVkaXRzLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBDb2xvclByZXNlbnRhdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBDb2xvckluZm9ybWF0aW9ufSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5sYWJlbClcbiAgICAgICAgICAgICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLnRleHRFZGl0KSB8fCBUZXh0RWRpdC5pcyhjYW5kaWRhdGUpKVxuICAgICAgICAgICAgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUuYWRkaXRpb25hbFRleHRFZGl0cykgfHwgSXMudHlwZWRBcnJheShjYW5kaWRhdGUuYWRkaXRpb25hbFRleHRFZGl0cywgVGV4dEVkaXQuaXMpKTtcbiAgICB9XG4gICAgQ29sb3JQcmVzZW50YXRpb24uaXMgPSBpcztcbn0pKENvbG9yUHJlc2VudGF0aW9uIHx8IChDb2xvclByZXNlbnRhdGlvbiA9IHt9KSk7XG4vKipcbiAqIEEgc2V0IG9mIHByZWRlZmluZWQgcmFuZ2Uga2luZHMuXG4gKi9cbmV4cG9ydCB2YXIgRm9sZGluZ1JhbmdlS2luZDtcbihmdW5jdGlvbiAoRm9sZGluZ1JhbmdlS2luZCkge1xuICAgIC8qKlxuICAgICAqIEZvbGRpbmcgcmFuZ2UgZm9yIGEgY29tbWVudFxuICAgICAqL1xuICAgIEZvbGRpbmdSYW5nZUtpbmQuQ29tbWVudCA9ICdjb21tZW50JztcbiAgICAvKipcbiAgICAgKiBGb2xkaW5nIHJhbmdlIGZvciBhbiBpbXBvcnQgb3IgaW5jbHVkZVxuICAgICAqL1xuICAgIEZvbGRpbmdSYW5nZUtpbmQuSW1wb3J0cyA9ICdpbXBvcnRzJztcbiAgICAvKipcbiAgICAgKiBGb2xkaW5nIHJhbmdlIGZvciBhIHJlZ2lvbiAoZS5nLiBgI3JlZ2lvbmApXG4gICAgICovXG4gICAgRm9sZGluZ1JhbmdlS2luZC5SZWdpb24gPSAncmVnaW9uJztcbn0pKEZvbGRpbmdSYW5nZUtpbmQgfHwgKEZvbGRpbmdSYW5nZUtpbmQgPSB7fSkpO1xuLyoqXG4gKiBUaGUgZm9sZGluZyByYW5nZSBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBGb2xkaW5nUmFuZ2V9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIEZvbGRpbmdSYW5nZTtcbihmdW5jdGlvbiAoRm9sZGluZ1JhbmdlKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBGb2xkaW5nUmFuZ2UgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUoc3RhcnRMaW5lLCBlbmRMaW5lLCBzdGFydENoYXJhY3RlciwgZW5kQ2hhcmFjdGVyLCBraW5kLCBjb2xsYXBzZWRUZXh0KSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIHN0YXJ0TGluZSxcbiAgICAgICAgICAgIGVuZExpbmVcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKElzLmRlZmluZWQoc3RhcnRDaGFyYWN0ZXIpKSB7XG4gICAgICAgICAgICByZXN1bHQuc3RhcnRDaGFyYWN0ZXIgPSBzdGFydENoYXJhY3RlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXMuZGVmaW5lZChlbmRDaGFyYWN0ZXIpKSB7XG4gICAgICAgICAgICByZXN1bHQuZW5kQ2hhcmFjdGVyID0gZW5kQ2hhcmFjdGVyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKGtpbmQpKSB7XG4gICAgICAgICAgICByZXN1bHQua2luZCA9IGtpbmQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzLmRlZmluZWQoY29sbGFwc2VkVGV4dCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5jb2xsYXBzZWRUZXh0ID0gY29sbGFwc2VkVGV4dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBGb2xkaW5nUmFuZ2UuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgRm9sZGluZ1JhbmdlfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgSXMudWludGVnZXIoY2FuZGlkYXRlLnN0YXJ0TGluZSkgJiYgSXMudWludGVnZXIoY2FuZGlkYXRlLnN0YXJ0TGluZSlcbiAgICAgICAgICAgICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLnN0YXJ0Q2hhcmFjdGVyKSB8fCBJcy51aW50ZWdlcihjYW5kaWRhdGUuc3RhcnRDaGFyYWN0ZXIpKVxuICAgICAgICAgICAgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUuZW5kQ2hhcmFjdGVyKSB8fCBJcy51aW50ZWdlcihjYW5kaWRhdGUuZW5kQ2hhcmFjdGVyKSlcbiAgICAgICAgICAgICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLmtpbmQpIHx8IElzLnN0cmluZyhjYW5kaWRhdGUua2luZCkpO1xuICAgIH1cbiAgICBGb2xkaW5nUmFuZ2UuaXMgPSBpcztcbn0pKEZvbGRpbmdSYW5nZSB8fCAoRm9sZGluZ1JhbmdlID0ge30pKTtcbi8qKlxuICogVGhlIERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24gbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbjtcbihmdW5jdGlvbiAoRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbiBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShsb2NhdGlvbiwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbG9jYXRpb24sXG4gICAgICAgICAgICBtZXNzYWdlXG4gICAgICAgIH07XG4gICAgfVxuICAgIERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24uY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBMb2NhdGlvbi5pcyhjYW5kaWRhdGUubG9jYXRpb24pICYmIElzLnN0cmluZyhjYW5kaWRhdGUubWVzc2FnZSk7XG4gICAgfVxuICAgIERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24uaXMgPSBpcztcbn0pKERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24gfHwgKERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24gPSB7fSkpO1xuLyoqXG4gKiBUaGUgZGlhZ25vc3RpYydzIHNldmVyaXR5LlxuICovXG5leHBvcnQgdmFyIERpYWdub3N0aWNTZXZlcml0eTtcbihmdW5jdGlvbiAoRGlhZ25vc3RpY1NldmVyaXR5KSB7XG4gICAgLyoqXG4gICAgICogUmVwb3J0cyBhbiBlcnJvci5cbiAgICAgKi9cbiAgICBEaWFnbm9zdGljU2V2ZXJpdHkuRXJyb3IgPSAxO1xuICAgIC8qKlxuICAgICAqIFJlcG9ydHMgYSB3YXJuaW5nLlxuICAgICAqL1xuICAgIERpYWdub3N0aWNTZXZlcml0eS5XYXJuaW5nID0gMjtcbiAgICAvKipcbiAgICAgKiBSZXBvcnRzIGFuIGluZm9ybWF0aW9uLlxuICAgICAqL1xuICAgIERpYWdub3N0aWNTZXZlcml0eS5JbmZvcm1hdGlvbiA9IDM7XG4gICAgLyoqXG4gICAgICogUmVwb3J0cyBhIGhpbnQuXG4gICAgICovXG4gICAgRGlhZ25vc3RpY1NldmVyaXR5LkhpbnQgPSA0O1xufSkoRGlhZ25vc3RpY1NldmVyaXR5IHx8IChEaWFnbm9zdGljU2V2ZXJpdHkgPSB7fSkpO1xuLyoqXG4gKiBUaGUgZGlhZ25vc3RpYyB0YWdzLlxuICpcbiAqIEBzaW5jZSAzLjE1LjBcbiAqL1xuZXhwb3J0IHZhciBEaWFnbm9zdGljVGFnO1xuKGZ1bmN0aW9uIChEaWFnbm9zdGljVGFnKSB7XG4gICAgLyoqXG4gICAgICogVW51c2VkIG9yIHVubmVjZXNzYXJ5IGNvZGUuXG4gICAgICpcbiAgICAgKiBDbGllbnRzIGFyZSBhbGxvd2VkIHRvIHJlbmRlciBkaWFnbm9zdGljcyB3aXRoIHRoaXMgdGFnIGZhZGVkIG91dCBpbnN0ZWFkIG9mIGhhdmluZ1xuICAgICAqIGFuIGVycm9yIHNxdWlnZ2xlLlxuICAgICAqL1xuICAgIERpYWdub3N0aWNUYWcuVW5uZWNlc3NhcnkgPSAxO1xuICAgIC8qKlxuICAgICAqIERlcHJlY2F0ZWQgb3Igb2Jzb2xldGUgY29kZS5cbiAgICAgKlxuICAgICAqIENsaWVudHMgYXJlIGFsbG93ZWQgdG8gcmVuZGVyZWQgZGlhZ25vc3RpY3Mgd2l0aCB0aGlzIHRhZyBzdHJpa2UgdGhyb3VnaC5cbiAgICAgKi9cbiAgICBEaWFnbm9zdGljVGFnLkRlcHJlY2F0ZWQgPSAyO1xufSkoRGlhZ25vc3RpY1RhZyB8fCAoRGlhZ25vc3RpY1RhZyA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb2RlRGVzY3JpcHRpb24gbmFtZXNwYWNlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGggZGVzY3JpcHRpb25zIGZvciBkaWFnbm9zdGljIGNvZGVzLlxuICpcbiAqIEBzaW5jZSAzLjE2LjBcbiAqL1xuZXhwb3J0IHZhciBDb2RlRGVzY3JpcHRpb247XG4oZnVuY3Rpb24gKENvZGVEZXNjcmlwdGlvbikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUuaHJlZik7XG4gICAgfVxuICAgIENvZGVEZXNjcmlwdGlvbi5pcyA9IGlzO1xufSkoQ29kZURlc2NyaXB0aW9uIHx8IChDb2RlRGVzY3JpcHRpb24gPSB7fSkpO1xuLyoqXG4gKiBUaGUgRGlhZ25vc3RpYyBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBEaWFnbm9zdGljfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBEaWFnbm9zdGljO1xuKGZ1bmN0aW9uIChEaWFnbm9zdGljKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBEaWFnbm9zdGljIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCBtZXNzYWdlLCBzZXZlcml0eSwgY29kZSwgc291cmNlLCByZWxhdGVkSW5mb3JtYXRpb24pIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHsgcmFuZ2UsIG1lc3NhZ2UgfTtcbiAgICAgICAgaWYgKElzLmRlZmluZWQoc2V2ZXJpdHkpKSB7XG4gICAgICAgICAgICByZXN1bHQuc2V2ZXJpdHkgPSBzZXZlcml0eTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXMuZGVmaW5lZChjb2RlKSkge1xuICAgICAgICAgICAgcmVzdWx0LmNvZGUgPSBjb2RlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKHNvdXJjZSkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzLmRlZmluZWQocmVsYXRlZEluZm9ybWF0aW9uKSkge1xuICAgICAgICAgICAgcmVzdWx0LnJlbGF0ZWRJbmZvcm1hdGlvbiA9IHJlbGF0ZWRJbmZvcm1hdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBEaWFnbm9zdGljLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIERpYWdub3N0aWN9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKVxuICAgICAgICAgICAgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKVxuICAgICAgICAgICAgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5tZXNzYWdlKVxuICAgICAgICAgICAgJiYgKElzLm51bWJlcihjYW5kaWRhdGUuc2V2ZXJpdHkpIHx8IElzLnVuZGVmaW5lZChjYW5kaWRhdGUuc2V2ZXJpdHkpKVxuICAgICAgICAgICAgJiYgKElzLmludGVnZXIoY2FuZGlkYXRlLmNvZGUpIHx8IElzLnN0cmluZyhjYW5kaWRhdGUuY29kZSkgfHwgSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5jb2RlKSlcbiAgICAgICAgICAgICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLmNvZGVEZXNjcmlwdGlvbikgfHwgKElzLnN0cmluZygoX2EgPSBjYW5kaWRhdGUuY29kZURlc2NyaXB0aW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaHJlZikpKVxuICAgICAgICAgICAgJiYgKElzLnN0cmluZyhjYW5kaWRhdGUuc291cmNlKSB8fCBJcy51bmRlZmluZWQoY2FuZGlkYXRlLnNvdXJjZSkpXG4gICAgICAgICAgICAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5yZWxhdGVkSW5mb3JtYXRpb24pIHx8IElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLnJlbGF0ZWRJbmZvcm1hdGlvbiwgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbi5pcykpO1xuICAgIH1cbiAgICBEaWFnbm9zdGljLmlzID0gaXM7XG59KShEaWFnbm9zdGljIHx8IChEaWFnbm9zdGljID0ge30pKTtcbi8qKlxuICogVGhlIENvbW1hbmQgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgQ29tbWFuZH0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgQ29tbWFuZDtcbihmdW5jdGlvbiAoQ29tbWFuZCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ29tbWFuZCBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh0aXRsZSwgY29tbWFuZCwgLi4uYXJncykge1xuICAgICAgICBsZXQgcmVzdWx0ID0geyB0aXRsZSwgY29tbWFuZCB9O1xuICAgICAgICBpZiAoSXMuZGVmaW5lZChhcmdzKSAmJiBhcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJlc3VsdC5hcmd1bWVudHMgPSBhcmdzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIENvbW1hbmQuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgQ29tbWFuZH0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnRpdGxlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLmNvbW1hbmQpO1xuICAgIH1cbiAgICBDb21tYW5kLmlzID0gaXM7XG59KShDb21tYW5kIHx8IChDb21tYW5kID0ge30pKTtcbi8qKlxuICogVGhlIFRleHRFZGl0IG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIHJlcGxhY2UsXG4gKiBpbnNlcnQgYW5kIGRlbGV0ZSBlZGl0cyBtb3JlIGVhc2lseS5cbiAqL1xuZXhwb3J0IHZhciBUZXh0RWRpdDtcbihmdW5jdGlvbiAoVGV4dEVkaXQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgcmVwbGFjZSB0ZXh0IGVkaXQuXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSBvZiB0ZXh0IHRvIGJlIHJlcGxhY2VkLlxuICAgICAqIEBwYXJhbSBuZXdUZXh0IFRoZSBuZXcgdGV4dC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXBsYWNlKHJhbmdlLCBuZXdUZXh0KSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCBuZXdUZXh0IH07XG4gICAgfVxuICAgIFRleHRFZGl0LnJlcGxhY2UgPSByZXBsYWNlO1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zZXJ0IHRleHQgZWRpdC5cbiAgICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIHBvc2l0aW9uIHRvIGluc2VydCB0aGUgdGV4dCBhdC5cbiAgICAgKiBAcGFyYW0gbmV3VGV4dCBUaGUgdGV4dCB0byBiZSBpbnNlcnRlZC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbnNlcnQocG9zaXRpb24sIG5ld1RleHQpIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2U6IHsgc3RhcnQ6IHBvc2l0aW9uLCBlbmQ6IHBvc2l0aW9uIH0sIG5ld1RleHQgfTtcbiAgICB9XG4gICAgVGV4dEVkaXQuaW5zZXJ0ID0gaW5zZXJ0O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBkZWxldGUgdGV4dCBlZGl0LlxuICAgICAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2Ugb2YgdGV4dCB0byBiZSBkZWxldGVkLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRlbChyYW5nZSkge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgbmV3VGV4dDogJycgfTtcbiAgICB9XG4gICAgVGV4dEVkaXQuZGVsID0gZGVsO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpXG4gICAgICAgICAgICAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLm5ld1RleHQpXG4gICAgICAgICAgICAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpO1xuICAgIH1cbiAgICBUZXh0RWRpdC5pcyA9IGlzO1xufSkoVGV4dEVkaXQgfHwgKFRleHRFZGl0ID0ge30pKTtcbmV4cG9ydCB2YXIgQ2hhbmdlQW5ub3RhdGlvbjtcbihmdW5jdGlvbiAoQ2hhbmdlQW5ub3RhdGlvbikge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShsYWJlbCwgbmVlZHNDb25maXJtYXRpb24sIGRlc2NyaXB0aW9uKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHsgbGFiZWwgfTtcbiAgICAgICAgaWYgKG5lZWRzQ29uZmlybWF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5uZWVkc0NvbmZpcm1hdGlvbiA9IG5lZWRzQ29uZmlybWF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZXNjcmlwdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBDaGFuZ2VBbm5vdGF0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLmxhYmVsKSAmJlxuICAgICAgICAgICAgKElzLmJvb2xlYW4oY2FuZGlkYXRlLm5lZWRzQ29uZmlybWF0aW9uKSB8fCBjYW5kaWRhdGUubmVlZHNDb25maXJtYXRpb24gPT09IHVuZGVmaW5lZCkgJiZcbiAgICAgICAgICAgIChJcy5zdHJpbmcoY2FuZGlkYXRlLmRlc2NyaXB0aW9uKSB8fCBjYW5kaWRhdGUuZGVzY3JpcHRpb24gPT09IHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIENoYW5nZUFubm90YXRpb24uaXMgPSBpcztcbn0pKENoYW5nZUFubm90YXRpb24gfHwgKENoYW5nZUFubm90YXRpb24gPSB7fSkpO1xuZXhwb3J0IHZhciBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllcjtcbihmdW5jdGlvbiAoQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLnN0cmluZyhjYW5kaWRhdGUpO1xuICAgIH1cbiAgICBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyA9IGlzO1xufSkoQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIgfHwgKENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyID0ge30pKTtcbmV4cG9ydCB2YXIgQW5ub3RhdGVkVGV4dEVkaXQ7XG4oZnVuY3Rpb24gKEFubm90YXRlZFRleHRFZGl0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhbm5vdGF0ZWQgcmVwbGFjZSB0ZXh0IGVkaXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlIG9mIHRleHQgdG8gYmUgcmVwbGFjZWQuXG4gICAgICogQHBhcmFtIG5ld1RleHQgVGhlIG5ldyB0ZXh0LlxuICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIFRoZSBhbm5vdGF0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlcGxhY2UocmFuZ2UsIG5ld1RleHQsIGFubm90YXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIG5ld1RleHQsIGFubm90YXRpb25JZDogYW5ub3RhdGlvbiB9O1xuICAgIH1cbiAgICBBbm5vdGF0ZWRUZXh0RWRpdC5yZXBsYWNlID0gcmVwbGFjZTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFubm90YXRlZCBpbnNlcnQgdGV4dCBlZGl0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBwb3NpdGlvbiB0byBpbnNlcnQgdGhlIHRleHQgYXQuXG4gICAgICogQHBhcmFtIG5ld1RleHQgVGhlIHRleHQgdG8gYmUgaW5zZXJ0ZWQuXG4gICAgICogQHBhcmFtIGFubm90YXRpb24gVGhlIGFubm90YXRpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5zZXJ0KHBvc2l0aW9uLCBuZXdUZXh0LCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlOiB7IHN0YXJ0OiBwb3NpdGlvbiwgZW5kOiBwb3NpdGlvbiB9LCBuZXdUZXh0LCBhbm5vdGF0aW9uSWQ6IGFubm90YXRpb24gfTtcbiAgICB9XG4gICAgQW5ub3RhdGVkVGV4dEVkaXQuaW5zZXJ0ID0gaW5zZXJ0O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYW5ub3RhdGVkIGRlbGV0ZSB0ZXh0IGVkaXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlIG9mIHRleHQgdG8gYmUgZGVsZXRlZC5cbiAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiBUaGUgYW5ub3RhdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkZWwocmFuZ2UsIGFubm90YXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIG5ld1RleHQ6ICcnLCBhbm5vdGF0aW9uSWQ6IGFubm90YXRpb24gfTtcbiAgICB9XG4gICAgQW5ub3RhdGVkVGV4dEVkaXQuZGVsID0gZGVsO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gVGV4dEVkaXQuaXMoY2FuZGlkYXRlKSAmJiAoQ2hhbmdlQW5ub3RhdGlvbi5pcyhjYW5kaWRhdGUuYW5ub3RhdGlvbklkKSB8fCBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhjYW5kaWRhdGUuYW5ub3RhdGlvbklkKSk7XG4gICAgfVxuICAgIEFubm90YXRlZFRleHRFZGl0LmlzID0gaXM7XG59KShBbm5vdGF0ZWRUZXh0RWRpdCB8fCAoQW5ub3RhdGVkVGV4dEVkaXQgPSB7fSkpO1xuLyoqXG4gKiBUaGUgVGV4dERvY3VtZW50RWRpdCBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZVxuICogYW4gZWRpdCB0aGF0IG1hbmlwdWxhdGVzIGEgdGV4dCBkb2N1bWVudC5cbiAqL1xuZXhwb3J0IHZhciBUZXh0RG9jdW1lbnRFZGl0O1xuKGZ1bmN0aW9uIChUZXh0RG9jdW1lbnRFZGl0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBgVGV4dERvY3VtZW50RWRpdGBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodGV4dERvY3VtZW50LCBlZGl0cykge1xuICAgICAgICByZXR1cm4geyB0ZXh0RG9jdW1lbnQsIGVkaXRzIH07XG4gICAgfVxuICAgIFRleHREb2N1bWVudEVkaXQuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKVxuICAgICAgICAgICAgJiYgT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmlzKGNhbmRpZGF0ZS50ZXh0RG9jdW1lbnQpXG4gICAgICAgICAgICAmJiBBcnJheS5pc0FycmF5KGNhbmRpZGF0ZS5lZGl0cyk7XG4gICAgfVxuICAgIFRleHREb2N1bWVudEVkaXQuaXMgPSBpcztcbn0pKFRleHREb2N1bWVudEVkaXQgfHwgKFRleHREb2N1bWVudEVkaXQgPSB7fSkpO1xuZXhwb3J0IHZhciBDcmVhdGVGaWxlO1xuKGZ1bmN0aW9uIChDcmVhdGVGaWxlKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKHVyaSwgb3B0aW9ucywgYW5ub3RhdGlvbikge1xuICAgICAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgICAgICAga2luZDogJ2NyZWF0ZScsXG4gICAgICAgICAgICB1cmlcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKG9wdGlvbnMgIT09IHVuZGVmaW5lZCAmJiAob3B0aW9ucy5vdmVyd3JpdGUgIT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLmlnbm9yZUlmRXhpc3RzICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICByZXN1bHQub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFubm90YXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmFubm90YXRpb25JZCA9IGFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgQ3JlYXRlRmlsZS5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIGNhbmRpZGF0ZS5raW5kID09PSAnY3JlYXRlJyAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSkgJiYgKGNhbmRpZGF0ZS5vcHRpb25zID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICgoY2FuZGlkYXRlLm9wdGlvbnMub3ZlcndyaXRlID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUub3B0aW9ucy5vdmVyd3JpdGUpKSAmJiAoY2FuZGlkYXRlLm9wdGlvbnMuaWdub3JlSWZFeGlzdHMgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5vcHRpb25zLmlnbm9yZUlmRXhpc3RzKSkpKSAmJiAoY2FuZGlkYXRlLmFubm90YXRpb25JZCA9PT0gdW5kZWZpbmVkIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQpKTtcbiAgICB9XG4gICAgQ3JlYXRlRmlsZS5pcyA9IGlzO1xufSkoQ3JlYXRlRmlsZSB8fCAoQ3JlYXRlRmlsZSA9IHt9KSk7XG5leHBvcnQgdmFyIFJlbmFtZUZpbGU7XG4oZnVuY3Rpb24gKFJlbmFtZUZpbGUpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUob2xkVXJpLCBuZXdVcmksIG9wdGlvbnMsIGFubm90YXRpb24pIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIGtpbmQ6ICdyZW5hbWUnLFxuICAgICAgICAgICAgb2xkVXJpLFxuICAgICAgICAgICAgbmV3VXJpXG4gICAgICAgIH07XG4gICAgICAgIGlmIChvcHRpb25zICE9PSB1bmRlZmluZWQgJiYgKG9wdGlvbnMub3ZlcndyaXRlICE9PSB1bmRlZmluZWQgfHwgb3B0aW9ucy5pZ25vcmVJZkV4aXN0cyAhPT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgcmVzdWx0Lm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbm5vdGF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5hbm5vdGF0aW9uSWQgPSBhbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIFJlbmFtZUZpbGUuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBjYW5kaWRhdGUua2luZCA9PT0gJ3JlbmFtZScgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5vbGRVcmkpICYmIElzLnN0cmluZyhjYW5kaWRhdGUubmV3VXJpKSAmJiAoY2FuZGlkYXRlLm9wdGlvbnMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgKChjYW5kaWRhdGUub3B0aW9ucy5vdmVyd3JpdGUgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5vcHRpb25zLm92ZXJ3cml0ZSkpICYmIChjYW5kaWRhdGUub3B0aW9ucy5pZ25vcmVJZkV4aXN0cyA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLm9wdGlvbnMuaWdub3JlSWZFeGlzdHMpKSkpICYmIChjYW5kaWRhdGUuYW5ub3RhdGlvbklkID09PSB1bmRlZmluZWQgfHwgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoY2FuZGlkYXRlLmFubm90YXRpb25JZCkpO1xuICAgIH1cbiAgICBSZW5hbWVGaWxlLmlzID0gaXM7XG59KShSZW5hbWVGaWxlIHx8IChSZW5hbWVGaWxlID0ge30pKTtcbmV4cG9ydCB2YXIgRGVsZXRlRmlsZTtcbihmdW5jdGlvbiAoRGVsZXRlRmlsZSkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmksIG9wdGlvbnMsIGFubm90YXRpb24pIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIGtpbmQ6ICdkZWxldGUnLFxuICAgICAgICAgICAgdXJpXG4gICAgICAgIH07XG4gICAgICAgIGlmIChvcHRpb25zICE9PSB1bmRlZmluZWQgJiYgKG9wdGlvbnMucmVjdXJzaXZlICE9PSB1bmRlZmluZWQgfHwgb3B0aW9ucy5pZ25vcmVJZk5vdEV4aXN0cyAhPT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgcmVzdWx0Lm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbm5vdGF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5hbm5vdGF0aW9uSWQgPSBhbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIERlbGV0ZUZpbGUuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBjYW5kaWRhdGUua2luZCA9PT0gJ2RlbGV0ZScgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpICYmIChjYW5kaWRhdGUub3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAoKGNhbmRpZGF0ZS5vcHRpb25zLnJlY3Vyc2l2ZSA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLm9wdGlvbnMucmVjdXJzaXZlKSkgJiYgKGNhbmRpZGF0ZS5vcHRpb25zLmlnbm9yZUlmTm90RXhpc3RzID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUub3B0aW9ucy5pZ25vcmVJZk5vdEV4aXN0cykpKSkgJiYgKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQgPT09IHVuZGVmaW5lZCB8fCBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhjYW5kaWRhdGUuYW5ub3RhdGlvbklkKSk7XG4gICAgfVxuICAgIERlbGV0ZUZpbGUuaXMgPSBpcztcbn0pKERlbGV0ZUZpbGUgfHwgKERlbGV0ZUZpbGUgPSB7fSkpO1xuZXhwb3J0IHZhciBXb3Jrc3BhY2VFZGl0O1xuKGZ1bmN0aW9uIChXb3Jrc3BhY2VFZGl0KSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmNoYW5nZXMgIT09IHVuZGVmaW5lZCB8fCBjYW5kaWRhdGUuZG9jdW1lbnRDaGFuZ2VzICE9PSB1bmRlZmluZWQpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmRvY3VtZW50Q2hhbmdlcyA9PT0gdW5kZWZpbmVkIHx8IGNhbmRpZGF0ZS5kb2N1bWVudENoYW5nZXMuZXZlcnkoKGNoYW5nZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChJcy5zdHJpbmcoY2hhbmdlLmtpbmQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVGaWxlLmlzKGNoYW5nZSkgfHwgUmVuYW1lRmlsZS5pcyhjaGFuZ2UpIHx8IERlbGV0ZUZpbGUuaXMoY2hhbmdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBUZXh0RG9jdW1lbnRFZGl0LmlzKGNoYW5nZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgIH1cbiAgICBXb3Jrc3BhY2VFZGl0LmlzID0gaXM7XG59KShXb3Jrc3BhY2VFZGl0IHx8IChXb3Jrc3BhY2VFZGl0ID0ge30pKTtcbmNsYXNzIFRleHRFZGl0Q2hhbmdlSW1wbCB7XG4gICAgY29uc3RydWN0b3IoZWRpdHMsIGNoYW5nZUFubm90YXRpb25zKSB7XG4gICAgICAgIHRoaXMuZWRpdHMgPSBlZGl0cztcbiAgICAgICAgdGhpcy5jaGFuZ2VBbm5vdGF0aW9ucyA9IGNoYW5nZUFubm90YXRpb25zO1xuICAgIH1cbiAgICBpbnNlcnQocG9zaXRpb24sIG5ld1RleHQsIGFubm90YXRpb24pIHtcbiAgICAgICAgbGV0IGVkaXQ7XG4gICAgICAgIGxldCBpZDtcbiAgICAgICAgaWYgKGFubm90YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZWRpdCA9IFRleHRFZGl0Lmluc2VydChwb3NpdGlvbiwgbmV3VGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoYW5ub3RhdGlvbikpIHtcbiAgICAgICAgICAgIGlkID0gYW5ub3RhdGlvbjtcbiAgICAgICAgICAgIGVkaXQgPSBBbm5vdGF0ZWRUZXh0RWRpdC5pbnNlcnQocG9zaXRpb24sIG5ld1RleHQsIGFubm90YXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hc3NlcnRDaGFuZ2VBbm5vdGF0aW9ucyh0aGlzLmNoYW5nZUFubm90YXRpb25zKTtcbiAgICAgICAgICAgIGlkID0gdGhpcy5jaGFuZ2VBbm5vdGF0aW9ucy5tYW5hZ2UoYW5ub3RhdGlvbik7XG4gICAgICAgICAgICBlZGl0ID0gQW5ub3RhdGVkVGV4dEVkaXQuaW5zZXJ0KHBvc2l0aW9uLCBuZXdUZXh0LCBpZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lZGl0cy5wdXNoKGVkaXQpO1xuICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlcGxhY2UocmFuZ2UsIG5ld1RleHQsIGFubm90YXRpb24pIHtcbiAgICAgICAgbGV0IGVkaXQ7XG4gICAgICAgIGxldCBpZDtcbiAgICAgICAgaWYgKGFubm90YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZWRpdCA9IFRleHRFZGl0LnJlcGxhY2UocmFuZ2UsIG5ld1RleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGFubm90YXRpb24pKSB7XG4gICAgICAgICAgICBpZCA9IGFubm90YXRpb247XG4gICAgICAgICAgICBlZGl0ID0gQW5ub3RhdGVkVGV4dEVkaXQucmVwbGFjZShyYW5nZSwgbmV3VGV4dCwgYW5ub3RhdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFzc2VydENoYW5nZUFubm90YXRpb25zKHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgaWQgPSB0aGlzLmNoYW5nZUFubm90YXRpb25zLm1hbmFnZShhbm5vdGF0aW9uKTtcbiAgICAgICAgICAgIGVkaXQgPSBBbm5vdGF0ZWRUZXh0RWRpdC5yZXBsYWNlKHJhbmdlLCBuZXdUZXh0LCBpZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lZGl0cy5wdXNoKGVkaXQpO1xuICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlbGV0ZShyYW5nZSwgYW5ub3RhdGlvbikge1xuICAgICAgICBsZXQgZWRpdDtcbiAgICAgICAgbGV0IGlkO1xuICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBlZGl0ID0gVGV4dEVkaXQuZGVsKHJhbmdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhhbm5vdGF0aW9uKSkge1xuICAgICAgICAgICAgaWQgPSBhbm5vdGF0aW9uO1xuICAgICAgICAgICAgZWRpdCA9IEFubm90YXRlZFRleHRFZGl0LmRlbChyYW5nZSwgYW5ub3RhdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFzc2VydENoYW5nZUFubm90YXRpb25zKHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgaWQgPSB0aGlzLmNoYW5nZUFubm90YXRpb25zLm1hbmFnZShhbm5vdGF0aW9uKTtcbiAgICAgICAgICAgIGVkaXQgPSBBbm5vdGF0ZWRUZXh0RWRpdC5kZWwocmFuZ2UsIGlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVkaXRzLnB1c2goZWRpdCk7XG4gICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYWRkKGVkaXQpIHtcbiAgICAgICAgdGhpcy5lZGl0cy5wdXNoKGVkaXQpO1xuICAgIH1cbiAgICBhbGwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRzO1xuICAgIH1cbiAgICBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5lZGl0cy5zcGxpY2UoMCwgdGhpcy5lZGl0cy5sZW5ndGgpO1xuICAgIH1cbiAgICBhc3NlcnRDaGFuZ2VBbm5vdGF0aW9ucyh2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUZXh0IGVkaXQgY2hhbmdlIGlzIG5vdCBjb25maWd1cmVkIHRvIG1hbmFnZSBjaGFuZ2UgYW5ub3RhdGlvbnMuYCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIEEgaGVscGVyIGNsYXNzXG4gKi9cbmNsYXNzIENoYW5nZUFubm90YXRpb25zIHtcbiAgICBjb25zdHJ1Y3Rvcihhbm5vdGF0aW9ucykge1xuICAgICAgICB0aGlzLl9hbm5vdGF0aW9ucyA9IGFubm90YXRpb25zID09PSB1bmRlZmluZWQgPyBPYmplY3QuY3JlYXRlKG51bGwpIDogYW5ub3RhdGlvbnM7XG4gICAgICAgIHRoaXMuX2NvdW50ZXIgPSAwO1xuICAgICAgICB0aGlzLl9zaXplID0gMDtcbiAgICB9XG4gICAgYWxsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYW5ub3RhdGlvbnM7XG4gICAgfVxuICAgIGdldCBzaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2l6ZTtcbiAgICB9XG4gICAgbWFuYWdlKGlkT3JBbm5vdGF0aW9uLCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIGxldCBpZDtcbiAgICAgICAgaWYgKENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGlkT3JBbm5vdGF0aW9uKSkge1xuICAgICAgICAgICAgaWQgPSBpZE9yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlkID0gdGhpcy5uZXh0SWQoKTtcbiAgICAgICAgICAgIGFubm90YXRpb24gPSBpZE9yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fYW5ub3RhdGlvbnNbaWRdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSWQgJHtpZH0gaXMgYWxyZWFkeSBpbiB1c2UuYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFubm90YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBhbm5vdGF0aW9uIHByb3ZpZGVkIGZvciBpZCAke2lkfWApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2Fubm90YXRpb25zW2lkXSA9IGFubm90YXRpb247XG4gICAgICAgIHRoaXMuX3NpemUrKztcbiAgICAgICAgcmV0dXJuIGlkO1xuICAgIH1cbiAgICBuZXh0SWQoKSB7XG4gICAgICAgIHRoaXMuX2NvdW50ZXIrKztcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvdW50ZXIudG9TdHJpbmcoKTtcbiAgICB9XG59XG4vKipcbiAqIEEgd29ya3NwYWNlIGNoYW5nZSBoZWxwcyBjb25zdHJ1Y3RpbmcgY2hhbmdlcyB0byBhIHdvcmtzcGFjZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFdvcmtzcGFjZUNoYW5nZSB7XG4gICAgY29uc3RydWN0b3Iod29ya3NwYWNlRWRpdCkge1xuICAgICAgICB0aGlzLl90ZXh0RWRpdENoYW5nZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBpZiAod29ya3NwYWNlRWRpdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0ID0gd29ya3NwYWNlRWRpdDtcbiAgICAgICAgICAgIGlmICh3b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZUFubm90YXRpb25zID0gbmV3IENoYW5nZUFubm90YXRpb25zKHdvcmtzcGFjZUVkaXQuY2hhbmdlQW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgICAgIHdvcmtzcGFjZUVkaXQuY2hhbmdlQW5ub3RhdGlvbnMgPSB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5hbGwoKTtcbiAgICAgICAgICAgICAgICB3b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcy5mb3JFYWNoKChjaGFuZ2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFRleHREb2N1bWVudEVkaXQuaXMoY2hhbmdlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dEVkaXRDaGFuZ2UgPSBuZXcgVGV4dEVkaXRDaGFuZ2VJbXBsKGNoYW5nZS5lZGl0cywgdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGV4dEVkaXRDaGFuZ2VzW2NoYW5nZS50ZXh0RG9jdW1lbnQudXJpXSA9IHRleHRFZGl0Q2hhbmdlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh3b3Jrc3BhY2VFZGl0LmNoYW5nZXMpIHtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyh3b3Jrc3BhY2VFZGl0LmNoYW5nZXMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0RWRpdENoYW5nZSA9IG5ldyBUZXh0RWRpdENoYW5nZUltcGwod29ya3NwYWNlRWRpdC5jaGFuZ2VzW2tleV0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXh0RWRpdENoYW5nZXNba2V5XSA9IHRleHRFZGl0Q2hhbmdlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdCA9IHt9O1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHVuZGVybHlpbmcge0BsaW5rIFdvcmtzcGFjZUVkaXR9IGxpdGVyYWxcbiAgICAgKiB1c2UgdG8gYmUgcmV0dXJuZWQgZnJvbSBhIHdvcmtzcGFjZSBlZGl0IG9wZXJhdGlvbiBsaWtlIHJlbmFtZS5cbiAgICAgKi9cbiAgICBnZXQgZWRpdCgpIHtcbiAgICAgICAgdGhpcy5pbml0RG9jdW1lbnRDaGFuZ2VzKCk7XG4gICAgICAgIGlmICh0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlQW5ub3RhdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZUFubm90YXRpb25zID0gdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMuYWxsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3dvcmtzcGFjZUVkaXQ7XG4gICAgfVxuICAgIGdldFRleHRFZGl0Q2hhbmdlKGtleSkge1xuICAgICAgICBpZiAoT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmlzKGtleSkpIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdERvY3VtZW50Q2hhbmdlcygpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dvcmtzcGFjZSBlZGl0IGlzIG5vdCBjb25maWd1cmVkIGZvciBkb2N1bWVudCBjaGFuZ2VzLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdGV4dERvY3VtZW50ID0geyB1cmk6IGtleS51cmksIHZlcnNpb246IGtleS52ZXJzaW9uIH07XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5fdGV4dEVkaXRDaGFuZ2VzW3RleHREb2N1bWVudC51cmldO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlZGl0cyA9IFtdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRleHREb2N1bWVudEVkaXQgPSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHREb2N1bWVudCxcbiAgICAgICAgICAgICAgICAgICAgZWRpdHNcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzLnB1c2godGV4dERvY3VtZW50RWRpdCk7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFRleHRFZGl0Q2hhbmdlSW1wbChlZGl0cywgdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3RleHRFZGl0Q2hhbmdlc1t0ZXh0RG9jdW1lbnQudXJpXSA9IHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmluaXRDaGFuZ2VzKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dvcmtzcGFjZSBlZGl0IGlzIG5vdCBjb25maWd1cmVkIGZvciBub3JtYWwgdGV4dCBlZGl0IGNoYW5nZXMuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5fdGV4dEVkaXRDaGFuZ2VzW2tleV07XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgICAgIGxldCBlZGl0cyA9IFtdO1xuICAgICAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlc1trZXldID0gZWRpdHM7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFRleHRFZGl0Q2hhbmdlSW1wbChlZGl0cyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGV4dEVkaXRDaGFuZ2VzW2tleV0gPSByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgfVxuICAgIGluaXREb2N1bWVudENoYW5nZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcyA9PT0gdW5kZWZpbmVkICYmIHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucyA9IG5ldyBDaGFuZ2VBbm5vdGF0aW9ucygpO1xuICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlQW5ub3RhdGlvbnMgPSB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5hbGwoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpbml0Q2hhbmdlcygpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzID09PSB1bmRlZmluZWQgJiYgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY3JlYXRlRmlsZSh1cmksIG9wdGlvbnNPckFubm90YXRpb24sIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5pbml0RG9jdW1lbnRDaGFuZ2VzKCk7XG4gICAgICAgIGlmICh0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dvcmtzcGFjZSBlZGl0IGlzIG5vdCBjb25maWd1cmVkIGZvciBkb2N1bWVudCBjaGFuZ2VzLicpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhbm5vdGF0aW9uO1xuICAgICAgICBpZiAoQ2hhbmdlQW5ub3RhdGlvbi5pcyhvcHRpb25zT3JBbm5vdGF0aW9uKSB8fCBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhvcHRpb25zT3JBbm5vdGF0aW9uKSkge1xuICAgICAgICAgICAgYW5ub3RhdGlvbiA9IG9wdGlvbnNPckFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvcHRpb25zID0gb3B0aW9uc09yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb3BlcmF0aW9uO1xuICAgICAgICBsZXQgaWQ7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wZXJhdGlvbiA9IENyZWF0ZUZpbGUuY3JlYXRlKHVyaSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZCA9IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGFubm90YXRpb24pID8gYW5ub3RhdGlvbiA6IHRoaXMuX2NoYW5nZUFubm90YXRpb25zLm1hbmFnZShhbm5vdGF0aW9uKTtcbiAgICAgICAgICAgIG9wZXJhdGlvbiA9IENyZWF0ZUZpbGUuY3JlYXRlKHVyaSwgb3B0aW9ucywgaWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzLnB1c2gob3BlcmF0aW9uKTtcbiAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZW5hbWVGaWxlKG9sZFVyaSwgbmV3VXJpLCBvcHRpb25zT3JBbm5vdGF0aW9uLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuaW5pdERvY3VtZW50Q2hhbmdlcygpO1xuICAgICAgICBpZiAodGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXb3Jrc3BhY2UgZWRpdCBpcyBub3QgY29uZmlndXJlZCBmb3IgZG9jdW1lbnQgY2hhbmdlcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYW5ub3RhdGlvbjtcbiAgICAgICAgaWYgKENoYW5nZUFubm90YXRpb24uaXMob3B0aW9uc09yQW5ub3RhdGlvbikgfHwgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMob3B0aW9uc09yQW5ub3RhdGlvbikpIHtcbiAgICAgICAgICAgIGFubm90YXRpb24gPSBvcHRpb25zT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnNPckFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG9wZXJhdGlvbjtcbiAgICAgICAgbGV0IGlkO1xuICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcGVyYXRpb24gPSBSZW5hbWVGaWxlLmNyZWF0ZShvbGRVcmksIG5ld1VyaSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZCA9IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGFubm90YXRpb24pID8gYW5ub3RhdGlvbiA6IHRoaXMuX2NoYW5nZUFubm90YXRpb25zLm1hbmFnZShhbm5vdGF0aW9uKTtcbiAgICAgICAgICAgIG9wZXJhdGlvbiA9IFJlbmFtZUZpbGUuY3JlYXRlKG9sZFVyaSwgbmV3VXJpLCBvcHRpb25zLCBpZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMucHVzaChvcGVyYXRpb24pO1xuICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlbGV0ZUZpbGUodXJpLCBvcHRpb25zT3JBbm5vdGF0aW9uLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuaW5pdERvY3VtZW50Q2hhbmdlcygpO1xuICAgICAgICBpZiAodGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXb3Jrc3BhY2UgZWRpdCBpcyBub3QgY29uZmlndXJlZCBmb3IgZG9jdW1lbnQgY2hhbmdlcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYW5ub3RhdGlvbjtcbiAgICAgICAgaWYgKENoYW5nZUFubm90YXRpb24uaXMob3B0aW9uc09yQW5ub3RhdGlvbikgfHwgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMob3B0aW9uc09yQW5ub3RhdGlvbikpIHtcbiAgICAgICAgICAgIGFubm90YXRpb24gPSBvcHRpb25zT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnNPckFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG9wZXJhdGlvbjtcbiAgICAgICAgbGV0IGlkO1xuICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcGVyYXRpb24gPSBEZWxldGVGaWxlLmNyZWF0ZSh1cmksIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWQgPSBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhhbm5vdGF0aW9uKSA/IGFubm90YXRpb24gOiB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5tYW5hZ2UoYW5ub3RhdGlvbik7XG4gICAgICAgICAgICBvcGVyYXRpb24gPSBEZWxldGVGaWxlLmNyZWF0ZSh1cmksIG9wdGlvbnMsIGlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcy5wdXNoKG9wZXJhdGlvbik7XG4gICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIFRoZSBUZXh0RG9jdW1lbnRJZGVudGlmaWVyIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIFRleHREb2N1bWVudElkZW50aWZpZXJ9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIFRleHREb2N1bWVudElkZW50aWZpZXI7XG4oZnVuY3Rpb24gKFRleHREb2N1bWVudElkZW50aWZpZXIpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFRleHREb2N1bWVudElkZW50aWZpZXIgbGl0ZXJhbC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSBkb2N1bWVudCdzIHVyaS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodXJpKSB7XG4gICAgICAgIHJldHVybiB7IHVyaSB9O1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIFRleHREb2N1bWVudElkZW50aWZpZXJ9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpO1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmlzID0gaXM7XG59KShUZXh0RG9jdW1lbnRJZGVudGlmaWVyIHx8IChUZXh0RG9jdW1lbnRJZGVudGlmaWVyID0ge30pKTtcbi8qKlxuICogVGhlIFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcjtcbihmdW5jdGlvbiAoVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciBsaXRlcmFsLlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIGRvY3VtZW50J3MgdXJpLlxuICAgICAqIEBwYXJhbSB2ZXJzaW9uIFRoZSBkb2N1bWVudCdzIHZlcnNpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHVyaSwgdmVyc2lvbikge1xuICAgICAgICByZXR1cm4geyB1cmksIHZlcnNpb24gfTtcbiAgICB9XG4gICAgVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllci5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudXJpKSAmJiBJcy5pbnRlZ2VyKGNhbmRpZGF0ZS52ZXJzaW9uKTtcbiAgICB9XG4gICAgVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllci5pcyA9IGlzO1xufSkoVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciB8fCAoVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciA9IHt9KSk7XG4vKipcbiAqIFRoZSBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXI7XG4oZnVuY3Rpb24gKE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIGxpdGVyYWwuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgZG9jdW1lbnQncyB1cmkuXG4gICAgICogQHBhcmFtIHZlcnNpb24gVGhlIGRvY3VtZW50J3MgdmVyc2lvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodXJpLCB2ZXJzaW9uKSB7XG4gICAgICAgIHJldHVybiB7IHVyaSwgdmVyc2lvbiB9O1xuICAgIH1cbiAgICBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudXJpKSAmJiAoY2FuZGlkYXRlLnZlcnNpb24gPT09IG51bGwgfHwgSXMuaW50ZWdlcihjYW5kaWRhdGUudmVyc2lvbikpO1xuICAgIH1cbiAgICBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIuaXMgPSBpcztcbn0pKE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciB8fCAoT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyID0ge30pKTtcbi8qKlxuICogVGhlIFRleHREb2N1bWVudEl0ZW0gbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgVGV4dERvY3VtZW50SXRlbX0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgVGV4dERvY3VtZW50SXRlbTtcbihmdW5jdGlvbiAoVGV4dERvY3VtZW50SXRlbSkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgVGV4dERvY3VtZW50SXRlbSBsaXRlcmFsLlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIGRvY3VtZW50J3MgdXJpLlxuICAgICAqIEBwYXJhbSBsYW5ndWFnZUlkIFRoZSBkb2N1bWVudCdzIGxhbmd1YWdlIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHZlcnNpb24gVGhlIGRvY3VtZW50J3MgdmVyc2lvbiBudW1iZXIuXG4gICAgICogQHBhcmFtIHRleHQgVGhlIGRvY3VtZW50J3MgdGV4dC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodXJpLCBsYW5ndWFnZUlkLCB2ZXJzaW9uLCB0ZXh0KSB7XG4gICAgICAgIHJldHVybiB7IHVyaSwgbGFuZ3VhZ2VJZCwgdmVyc2lvbiwgdGV4dCB9O1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnRJdGVtLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIFRleHREb2N1bWVudEl0ZW19IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpICYmIElzLnN0cmluZyhjYW5kaWRhdGUubGFuZ3VhZ2VJZCkgJiYgSXMuaW50ZWdlcihjYW5kaWRhdGUudmVyc2lvbikgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS50ZXh0KTtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50SXRlbS5pcyA9IGlzO1xufSkoVGV4dERvY3VtZW50SXRlbSB8fCAoVGV4dERvY3VtZW50SXRlbSA9IHt9KSk7XG4vKipcbiAqIERlc2NyaWJlcyB0aGUgY29udGVudCB0eXBlIHRoYXQgYSBjbGllbnQgc3VwcG9ydHMgaW4gdmFyaW91c1xuICogcmVzdWx0IGxpdGVyYWxzIGxpa2UgYEhvdmVyYCwgYFBhcmFtZXRlckluZm9gIG9yIGBDb21wbGV0aW9uSXRlbWAuXG4gKlxuICogUGxlYXNlIG5vdGUgdGhhdCBgTWFya3VwS2luZHNgIG11c3Qgbm90IHN0YXJ0IHdpdGggYSBgJGAuIFRoaXMga2luZHNcbiAqIGFyZSByZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNhZ2UuXG4gKi9cbmV4cG9ydCB2YXIgTWFya3VwS2luZDtcbihmdW5jdGlvbiAoTWFya3VwS2luZCkge1xuICAgIC8qKlxuICAgICAqIFBsYWluIHRleHQgaXMgc3VwcG9ydGVkIGFzIGEgY29udGVudCBmb3JtYXRcbiAgICAgKi9cbiAgICBNYXJrdXBLaW5kLlBsYWluVGV4dCA9ICdwbGFpbnRleHQnO1xuICAgIC8qKlxuICAgICAqIE1hcmtkb3duIGlzIHN1cHBvcnRlZCBhcyBhIGNvbnRlbnQgZm9ybWF0XG4gICAgICovXG4gICAgTWFya3VwS2luZC5NYXJrZG93biA9ICdtYXJrZG93bic7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIGlzIGEgdmFsdWUgb2YgdGhlIHtAbGluayBNYXJrdXBLaW5kfSB0eXBlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlID09PSBNYXJrdXBLaW5kLlBsYWluVGV4dCB8fCBjYW5kaWRhdGUgPT09IE1hcmt1cEtpbmQuTWFya2Rvd247XG4gICAgfVxuICAgIE1hcmt1cEtpbmQuaXMgPSBpcztcbn0pKE1hcmt1cEtpbmQgfHwgKE1hcmt1cEtpbmQgPSB7fSkpO1xuZXhwb3J0IHZhciBNYXJrdXBDb250ZW50O1xuKGZ1bmN0aW9uIChNYXJrdXBDb250ZW50KSB7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgTWFya3VwQ29udGVudH0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbCh2YWx1ZSkgJiYgTWFya3VwS2luZC5pcyhjYW5kaWRhdGUua2luZCkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS52YWx1ZSk7XG4gICAgfVxuICAgIE1hcmt1cENvbnRlbnQuaXMgPSBpcztcbn0pKE1hcmt1cENvbnRlbnQgfHwgKE1hcmt1cENvbnRlbnQgPSB7fSkpO1xuLyoqXG4gKiBUaGUga2luZCBvZiBhIGNvbXBsZXRpb24gZW50cnkuXG4gKi9cbmV4cG9ydCB2YXIgQ29tcGxldGlvbkl0ZW1LaW5kO1xuKGZ1bmN0aW9uIChDb21wbGV0aW9uSXRlbUtpbmQpIHtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuVGV4dCA9IDE7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLk1ldGhvZCA9IDI7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkZ1bmN0aW9uID0gMztcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuQ29uc3RydWN0b3IgPSA0O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5GaWVsZCA9IDU7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlZhcmlhYmxlID0gNjtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuQ2xhc3MgPSA3O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5JbnRlcmZhY2UgPSA4O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5Nb2R1bGUgPSA5O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5Qcm9wZXJ0eSA9IDEwO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5Vbml0ID0gMTE7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlZhbHVlID0gMTI7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkVudW0gPSAxMztcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuS2V5d29yZCA9IDE0O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5TbmlwcGV0ID0gMTU7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkNvbG9yID0gMTY7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkZpbGUgPSAxNztcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuUmVmZXJlbmNlID0gMTg7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkZvbGRlciA9IDE5O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5FbnVtTWVtYmVyID0gMjA7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkNvbnN0YW50ID0gMjE7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlN0cnVjdCA9IDIyO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5FdmVudCA9IDIzO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5PcGVyYXRvciA9IDI0O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5UeXBlUGFyYW1ldGVyID0gMjU7XG59KShDb21wbGV0aW9uSXRlbUtpbmQgfHwgKENvbXBsZXRpb25JdGVtS2luZCA9IHt9KSk7XG4vKipcbiAqIERlZmluZXMgd2hldGhlciB0aGUgaW5zZXJ0IHRleHQgaW4gYSBjb21wbGV0aW9uIGl0ZW0gc2hvdWxkIGJlIGludGVycHJldGVkIGFzXG4gKiBwbGFpbiB0ZXh0IG9yIGEgc25pcHBldC5cbiAqL1xuZXhwb3J0IHZhciBJbnNlcnRUZXh0Rm9ybWF0O1xuKGZ1bmN0aW9uIChJbnNlcnRUZXh0Rm9ybWF0KSB7XG4gICAgLyoqXG4gICAgICogVGhlIHByaW1hcnkgdGV4dCB0byBiZSBpbnNlcnRlZCBpcyB0cmVhdGVkIGFzIGEgcGxhaW4gc3RyaW5nLlxuICAgICAqL1xuICAgIEluc2VydFRleHRGb3JtYXQuUGxhaW5UZXh0ID0gMTtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpbWFyeSB0ZXh0IHRvIGJlIGluc2VydGVkIGlzIHRyZWF0ZWQgYXMgYSBzbmlwcGV0LlxuICAgICAqXG4gICAgICogQSBzbmlwcGV0IGNhbiBkZWZpbmUgdGFiIHN0b3BzIGFuZCBwbGFjZWhvbGRlcnMgd2l0aCBgJDFgLCBgJDJgXG4gICAgICogYW5kIGAkezM6Zm9vfWAuIGAkMGAgZGVmaW5lcyB0aGUgZmluYWwgdGFiIHN0b3AsIGl0IGRlZmF1bHRzIHRvXG4gICAgICogdGhlIGVuZCBvZiB0aGUgc25pcHBldC4gUGxhY2Vob2xkZXJzIHdpdGggZXF1YWwgaWRlbnRpZmllcnMgYXJlIGxpbmtlZCxcbiAgICAgKiB0aGF0IGlzIHR5cGluZyBpbiBvbmUgd2lsbCB1cGRhdGUgb3RoZXJzIHRvby5cbiAgICAgKlxuICAgICAqIFNlZSBhbHNvOiBodHRwczovL21pY3Jvc29mdC5naXRodWIuaW8vbGFuZ3VhZ2Utc2VydmVyLXByb3RvY29sL3NwZWNpZmljYXRpb25zL3NwZWNpZmljYXRpb24tY3VycmVudC8jc25pcHBldF9zeW50YXhcbiAgICAgKi9cbiAgICBJbnNlcnRUZXh0Rm9ybWF0LlNuaXBwZXQgPSAyO1xufSkoSW5zZXJ0VGV4dEZvcm1hdCB8fCAoSW5zZXJ0VGV4dEZvcm1hdCA9IHt9KSk7XG4vKipcbiAqIENvbXBsZXRpb24gaXRlbSB0YWdzIGFyZSBleHRyYSBhbm5vdGF0aW9ucyB0aGF0IHR3ZWFrIHRoZSByZW5kZXJpbmcgb2YgYSBjb21wbGV0aW9uXG4gKiBpdGVtLlxuICpcbiAqIEBzaW5jZSAzLjE1LjBcbiAqL1xuZXhwb3J0IHZhciBDb21wbGV0aW9uSXRlbVRhZztcbihmdW5jdGlvbiAoQ29tcGxldGlvbkl0ZW1UYWcpIHtcbiAgICAvKipcbiAgICAgKiBSZW5kZXIgYSBjb21wbGV0aW9uIGFzIG9ic29sZXRlLCB1c3VhbGx5IHVzaW5nIGEgc3RyaWtlLW91dC5cbiAgICAgKi9cbiAgICBDb21wbGV0aW9uSXRlbVRhZy5EZXByZWNhdGVkID0gMTtcbn0pKENvbXBsZXRpb25JdGVtVGFnIHx8IChDb21wbGV0aW9uSXRlbVRhZyA9IHt9KSk7XG4vKipcbiAqIFRoZSBJbnNlcnRSZXBsYWNlRWRpdCBuYW1lc3BhY2UgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCBpbnNlcnQgLyByZXBsYWNlIGVkaXRzLlxuICpcbiAqIEBzaW5jZSAzLjE2LjBcbiAqL1xuZXhwb3J0IHZhciBJbnNlcnRSZXBsYWNlRWRpdDtcbihmdW5jdGlvbiAoSW5zZXJ0UmVwbGFjZUVkaXQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGluc2VydCAvIHJlcGxhY2UgZWRpdFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShuZXdUZXh0LCBpbnNlcnQsIHJlcGxhY2UpIHtcbiAgICAgICAgcmV0dXJuIHsgbmV3VGV4dCwgaW5zZXJ0LCByZXBsYWNlIH07XG4gICAgfVxuICAgIEluc2VydFJlcGxhY2VFZGl0LmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIEluc2VydFJlcGxhY2VFZGl0fSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5uZXdUZXh0KSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUuaW5zZXJ0KSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmVwbGFjZSk7XG4gICAgfVxuICAgIEluc2VydFJlcGxhY2VFZGl0LmlzID0gaXM7XG59KShJbnNlcnRSZXBsYWNlRWRpdCB8fCAoSW5zZXJ0UmVwbGFjZUVkaXQgPSB7fSkpO1xuLyoqXG4gKiBIb3cgd2hpdGVzcGFjZSBhbmQgaW5kZW50YXRpb24gaXMgaGFuZGxlZCBkdXJpbmcgY29tcGxldGlvblxuICogaXRlbSBpbnNlcnRpb24uXG4gKlxuICogQHNpbmNlIDMuMTYuMFxuICovXG5leHBvcnQgdmFyIEluc2VydFRleHRNb2RlO1xuKGZ1bmN0aW9uIChJbnNlcnRUZXh0TW9kZSkge1xuICAgIC8qKlxuICAgICAqIFRoZSBpbnNlcnRpb24gb3IgcmVwbGFjZSBzdHJpbmdzIGlzIHRha2VuIGFzIGl0IGlzLiBJZiB0aGVcbiAgICAgKiB2YWx1ZSBpcyBtdWx0aSBsaW5lIHRoZSBsaW5lcyBiZWxvdyB0aGUgY3Vyc29yIHdpbGwgYmVcbiAgICAgKiBpbnNlcnRlZCB1c2luZyB0aGUgaW5kZW50YXRpb24gZGVmaW5lZCBpbiB0aGUgc3RyaW5nIHZhbHVlLlxuICAgICAqIFRoZSBjbGllbnQgd2lsbCBub3QgYXBwbHkgYW55IGtpbmQgb2YgYWRqdXN0bWVudHMgdG8gdGhlXG4gICAgICogc3RyaW5nLlxuICAgICAqL1xuICAgIEluc2VydFRleHRNb2RlLmFzSXMgPSAxO1xuICAgIC8qKlxuICAgICAqIFRoZSBlZGl0b3IgYWRqdXN0cyBsZWFkaW5nIHdoaXRlc3BhY2Ugb2YgbmV3IGxpbmVzIHNvIHRoYXRcbiAgICAgKiB0aGV5IG1hdGNoIHRoZSBpbmRlbnRhdGlvbiB1cCB0byB0aGUgY3Vyc29yIG9mIHRoZSBsaW5lIGZvclxuICAgICAqIHdoaWNoIHRoZSBpdGVtIGlzIGFjY2VwdGVkLlxuICAgICAqXG4gICAgICogQ29uc2lkZXIgYSBsaW5lIGxpa2UgdGhpczogPDJ0YWJzPjxjdXJzb3I+PDN0YWJzPmZvby4gQWNjZXB0aW5nIGFcbiAgICAgKiBtdWx0aSBsaW5lIGNvbXBsZXRpb24gaXRlbSBpcyBpbmRlbnRlZCB1c2luZyAyIHRhYnMgYW5kIGFsbFxuICAgICAqIGZvbGxvd2luZyBsaW5lcyBpbnNlcnRlZCB3aWxsIGJlIGluZGVudGVkIHVzaW5nIDIgdGFicyBhcyB3ZWxsLlxuICAgICAqL1xuICAgIEluc2VydFRleHRNb2RlLmFkanVzdEluZGVudGF0aW9uID0gMjtcbn0pKEluc2VydFRleHRNb2RlIHx8IChJbnNlcnRUZXh0TW9kZSA9IHt9KSk7XG5leHBvcnQgdmFyIENvbXBsZXRpb25JdGVtTGFiZWxEZXRhaWxzO1xuKGZ1bmN0aW9uIChDb21wbGV0aW9uSXRlbUxhYmVsRGV0YWlscykge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIChJcy5zdHJpbmcoY2FuZGlkYXRlLmRldGFpbCkgfHwgY2FuZGlkYXRlLmRldGFpbCA9PT0gdW5kZWZpbmVkKSAmJlxuICAgICAgICAgICAgKElzLnN0cmluZyhjYW5kaWRhdGUuZGVzY3JpcHRpb24pIHx8IGNhbmRpZGF0ZS5kZXNjcmlwdGlvbiA9PT0gdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgQ29tcGxldGlvbkl0ZW1MYWJlbERldGFpbHMuaXMgPSBpcztcbn0pKENvbXBsZXRpb25JdGVtTGFiZWxEZXRhaWxzIHx8IChDb21wbGV0aW9uSXRlbUxhYmVsRGV0YWlscyA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb21wbGV0aW9uSXRlbSBuYW1lc3BhY2UgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aFxuICogY29tcGxldGlvbiBpdGVtcy5cbiAqL1xuZXhwb3J0IHZhciBDb21wbGV0aW9uSXRlbTtcbihmdW5jdGlvbiAoQ29tcGxldGlvbkl0ZW0pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBjb21wbGV0aW9uIGl0ZW0gYW5kIHNlZWQgaXQgd2l0aCBhIGxhYmVsLlxuICAgICAqIEBwYXJhbSBsYWJlbCBUaGUgY29tcGxldGlvbiBpdGVtJ3MgbGFiZWxcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobGFiZWwpIHtcbiAgICAgICAgcmV0dXJuIHsgbGFiZWwgfTtcbiAgICB9XG4gICAgQ29tcGxldGlvbkl0ZW0uY3JlYXRlID0gY3JlYXRlO1xufSkoQ29tcGxldGlvbkl0ZW0gfHwgKENvbXBsZXRpb25JdGVtID0ge30pKTtcbi8qKlxuICogVGhlIENvbXBsZXRpb25MaXN0IG5hbWVzcGFjZSBwcm92aWRlcyBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoXG4gKiBjb21wbGV0aW9uIGxpc3RzLlxuICovXG5leHBvcnQgdmFyIENvbXBsZXRpb25MaXN0O1xuKGZ1bmN0aW9uIChDb21wbGV0aW9uTGlzdCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgY29tcGxldGlvbiBsaXN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIGl0ZW1zIFRoZSBjb21wbGV0aW9uIGl0ZW1zLlxuICAgICAqIEBwYXJhbSBpc0luY29tcGxldGUgVGhlIGxpc3QgaXMgbm90IGNvbXBsZXRlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShpdGVtcywgaXNJbmNvbXBsZXRlKSB7XG4gICAgICAgIHJldHVybiB7IGl0ZW1zOiBpdGVtcyA/IGl0ZW1zIDogW10sIGlzSW5jb21wbGV0ZTogISFpc0luY29tcGxldGUgfTtcbiAgICB9XG4gICAgQ29tcGxldGlvbkxpc3QuY3JlYXRlID0gY3JlYXRlO1xufSkoQ29tcGxldGlvbkxpc3QgfHwgKENvbXBsZXRpb25MaXN0ID0ge30pKTtcbmV4cG9ydCB2YXIgTWFya2VkU3RyaW5nO1xuKGZ1bmN0aW9uIChNYXJrZWRTdHJpbmcpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbWFya2VkIHN0cmluZyBmcm9tIHBsYWluIHRleHQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGxhaW5UZXh0IFRoZSBwbGFpbiB0ZXh0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZyb21QbGFpblRleHQocGxhaW5UZXh0KSB7XG4gICAgICAgIHJldHVybiBwbGFpblRleHQucmVwbGFjZSgvW1xcXFxgKl97fVtcXF0oKSMrXFwtLiFdL2csICdcXFxcJCYnKTsgLy8gZXNjYXBlIG1hcmtkb3duIHN5bnRheCB0b2tlbnM6IGh0dHA6Ly9kYXJpbmdmaXJlYmFsbC5uZXQvcHJvamVjdHMvbWFya2Rvd24vc3ludGF4I2JhY2tzbGFzaFxuICAgIH1cbiAgICBNYXJrZWRTdHJpbmcuZnJvbVBsYWluVGV4dCA9IGZyb21QbGFpblRleHQ7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgTWFya2VkU3RyaW5nfSB0eXBlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuc3RyaW5nKGNhbmRpZGF0ZSkgfHwgKElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLmxhbmd1YWdlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnZhbHVlKSk7XG4gICAgfVxuICAgIE1hcmtlZFN0cmluZy5pcyA9IGlzO1xufSkoTWFya2VkU3RyaW5nIHx8IChNYXJrZWRTdHJpbmcgPSB7fSkpO1xuZXhwb3J0IHZhciBIb3ZlcjtcbihmdW5jdGlvbiAoSG92ZXIpIHtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgY29uZm9ybXMgdG8gdGhlIHtAbGluayBIb3Zlcn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuICEhY2FuZGlkYXRlICYmIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiAoTWFya3VwQ29udGVudC5pcyhjYW5kaWRhdGUuY29udGVudHMpIHx8XG4gICAgICAgICAgICBNYXJrZWRTdHJpbmcuaXMoY2FuZGlkYXRlLmNvbnRlbnRzKSB8fFxuICAgICAgICAgICAgSXMudHlwZWRBcnJheShjYW5kaWRhdGUuY29udGVudHMsIE1hcmtlZFN0cmluZy5pcykpICYmICh2YWx1ZS5yYW5nZSA9PT0gdW5kZWZpbmVkIHx8IFJhbmdlLmlzKHZhbHVlLnJhbmdlKSk7XG4gICAgfVxuICAgIEhvdmVyLmlzID0gaXM7XG59KShIb3ZlciB8fCAoSG92ZXIgPSB7fSkpO1xuLyoqXG4gKiBUaGUgUGFyYW1ldGVySW5mb3JtYXRpb24gbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgUGFyYW1ldGVySW5mb3JtYXRpb259IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIFBhcmFtZXRlckluZm9ybWF0aW9uO1xuKGZ1bmN0aW9uIChQYXJhbWV0ZXJJbmZvcm1hdGlvbikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgcGFyYW1ldGVyIGluZm9ybWF0aW9uIGxpdGVyYWwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGFiZWwgQSBsYWJlbCBzdHJpbmcuXG4gICAgICogQHBhcmFtIGRvY3VtZW50YXRpb24gQSBkb2Mgc3RyaW5nLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShsYWJlbCwgZG9jdW1lbnRhdGlvbikge1xuICAgICAgICByZXR1cm4gZG9jdW1lbnRhdGlvbiA/IHsgbGFiZWwsIGRvY3VtZW50YXRpb24gfSA6IHsgbGFiZWwgfTtcbiAgICB9XG4gICAgUGFyYW1ldGVySW5mb3JtYXRpb24uY3JlYXRlID0gY3JlYXRlO1xufSkoUGFyYW1ldGVySW5mb3JtYXRpb24gfHwgKFBhcmFtZXRlckluZm9ybWF0aW9uID0ge30pKTtcbi8qKlxuICogVGhlIFNpZ25hdHVyZUluZm9ybWF0aW9uIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIFNpZ25hdHVyZUluZm9ybWF0aW9ufSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBTaWduYXR1cmVJbmZvcm1hdGlvbjtcbihmdW5jdGlvbiAoU2lnbmF0dXJlSW5mb3JtYXRpb24pIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUobGFiZWwsIGRvY3VtZW50YXRpb24sIC4uLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHsgbGFiZWwgfTtcbiAgICAgICAgaWYgKElzLmRlZmluZWQoZG9jdW1lbnRhdGlvbikpIHtcbiAgICAgICAgICAgIHJlc3VsdC5kb2N1bWVudGF0aW9uID0gZG9jdW1lbnRhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXMuZGVmaW5lZChwYXJhbWV0ZXJzKSkge1xuICAgICAgICAgICAgcmVzdWx0LnBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0LnBhcmFtZXRlcnMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBTaWduYXR1cmVJbmZvcm1hdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG59KShTaWduYXR1cmVJbmZvcm1hdGlvbiB8fCAoU2lnbmF0dXJlSW5mb3JtYXRpb24gPSB7fSkpO1xuLyoqXG4gKiBBIGRvY3VtZW50IGhpZ2hsaWdodCBraW5kLlxuICovXG5leHBvcnQgdmFyIERvY3VtZW50SGlnaGxpZ2h0S2luZDtcbihmdW5jdGlvbiAoRG9jdW1lbnRIaWdobGlnaHRLaW5kKSB7XG4gICAgLyoqXG4gICAgICogQSB0ZXh0dWFsIG9jY3VycmVuY2UuXG4gICAgICovXG4gICAgRG9jdW1lbnRIaWdobGlnaHRLaW5kLlRleHQgPSAxO1xuICAgIC8qKlxuICAgICAqIFJlYWQtYWNjZXNzIG9mIGEgc3ltYm9sLCBsaWtlIHJlYWRpbmcgYSB2YXJpYWJsZS5cbiAgICAgKi9cbiAgICBEb2N1bWVudEhpZ2hsaWdodEtpbmQuUmVhZCA9IDI7XG4gICAgLyoqXG4gICAgICogV3JpdGUtYWNjZXNzIG9mIGEgc3ltYm9sLCBsaWtlIHdyaXRpbmcgdG8gYSB2YXJpYWJsZS5cbiAgICAgKi9cbiAgICBEb2N1bWVudEhpZ2hsaWdodEtpbmQuV3JpdGUgPSAzO1xufSkoRG9jdW1lbnRIaWdobGlnaHRLaW5kIHx8IChEb2N1bWVudEhpZ2hsaWdodEtpbmQgPSB7fSkpO1xuLyoqXG4gKiBEb2N1bWVudEhpZ2hsaWdodCBuYW1lc3BhY2UgdG8gcHJvdmlkZSBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIERvY3VtZW50SGlnaGxpZ2h0fSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBEb2N1bWVudEhpZ2hsaWdodDtcbihmdW5jdGlvbiAoRG9jdW1lbnRIaWdobGlnaHQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBEb2N1bWVudEhpZ2hsaWdodCBvYmplY3QuXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSB0aGUgaGlnaGxpZ2h0IGFwcGxpZXMgdG8uXG4gICAgICogQHBhcmFtIGtpbmQgVGhlIGhpZ2hsaWdodCBraW5kXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCBraW5kKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IHJhbmdlIH07XG4gICAgICAgIGlmIChJcy5udW1iZXIoa2luZCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5raW5kID0ga2luZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBEb2N1bWVudEhpZ2hsaWdodC5jcmVhdGUgPSBjcmVhdGU7XG59KShEb2N1bWVudEhpZ2hsaWdodCB8fCAoRG9jdW1lbnRIaWdobGlnaHQgPSB7fSkpO1xuLyoqXG4gKiBBIHN5bWJvbCBraW5kLlxuICovXG5leHBvcnQgdmFyIFN5bWJvbEtpbmQ7XG4oZnVuY3Rpb24gKFN5bWJvbEtpbmQpIHtcbiAgICBTeW1ib2xLaW5kLkZpbGUgPSAxO1xuICAgIFN5bWJvbEtpbmQuTW9kdWxlID0gMjtcbiAgICBTeW1ib2xLaW5kLk5hbWVzcGFjZSA9IDM7XG4gICAgU3ltYm9sS2luZC5QYWNrYWdlID0gNDtcbiAgICBTeW1ib2xLaW5kLkNsYXNzID0gNTtcbiAgICBTeW1ib2xLaW5kLk1ldGhvZCA9IDY7XG4gICAgU3ltYm9sS2luZC5Qcm9wZXJ0eSA9IDc7XG4gICAgU3ltYm9sS2luZC5GaWVsZCA9IDg7XG4gICAgU3ltYm9sS2luZC5Db25zdHJ1Y3RvciA9IDk7XG4gICAgU3ltYm9sS2luZC5FbnVtID0gMTA7XG4gICAgU3ltYm9sS2luZC5JbnRlcmZhY2UgPSAxMTtcbiAgICBTeW1ib2xLaW5kLkZ1bmN0aW9uID0gMTI7XG4gICAgU3ltYm9sS2luZC5WYXJpYWJsZSA9IDEzO1xuICAgIFN5bWJvbEtpbmQuQ29uc3RhbnQgPSAxNDtcbiAgICBTeW1ib2xLaW5kLlN0cmluZyA9IDE1O1xuICAgIFN5bWJvbEtpbmQuTnVtYmVyID0gMTY7XG4gICAgU3ltYm9sS2luZC5Cb29sZWFuID0gMTc7XG4gICAgU3ltYm9sS2luZC5BcnJheSA9IDE4O1xuICAgIFN5bWJvbEtpbmQuT2JqZWN0ID0gMTk7XG4gICAgU3ltYm9sS2luZC5LZXkgPSAyMDtcbiAgICBTeW1ib2xLaW5kLk51bGwgPSAyMTtcbiAgICBTeW1ib2xLaW5kLkVudW1NZW1iZXIgPSAyMjtcbiAgICBTeW1ib2xLaW5kLlN0cnVjdCA9IDIzO1xuICAgIFN5bWJvbEtpbmQuRXZlbnQgPSAyNDtcbiAgICBTeW1ib2xLaW5kLk9wZXJhdG9yID0gMjU7XG4gICAgU3ltYm9sS2luZC5UeXBlUGFyYW1ldGVyID0gMjY7XG59KShTeW1ib2xLaW5kIHx8IChTeW1ib2xLaW5kID0ge30pKTtcbi8qKlxuICogU3ltYm9sIHRhZ3MgYXJlIGV4dHJhIGFubm90YXRpb25zIHRoYXQgdHdlYWsgdGhlIHJlbmRlcmluZyBvZiBhIHN5bWJvbC5cbiAqXG4gKiBAc2luY2UgMy4xNlxuICovXG5leHBvcnQgdmFyIFN5bWJvbFRhZztcbihmdW5jdGlvbiAoU3ltYm9sVGFnKSB7XG4gICAgLyoqXG4gICAgICogUmVuZGVyIGEgc3ltYm9sIGFzIG9ic29sZXRlLCB1c3VhbGx5IHVzaW5nIGEgc3RyaWtlLW91dC5cbiAgICAgKi9cbiAgICBTeW1ib2xUYWcuRGVwcmVjYXRlZCA9IDE7XG59KShTeW1ib2xUYWcgfHwgKFN5bWJvbFRhZyA9IHt9KSk7XG5leHBvcnQgdmFyIFN5bWJvbEluZm9ybWF0aW9uO1xuKGZ1bmN0aW9uIChTeW1ib2xJbmZvcm1hdGlvbikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgc3ltYm9sIGluZm9ybWF0aW9uIGxpdGVyYWwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSBraW5kIFRoZSBraW5kIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSBvZiB0aGUgbG9jYXRpb24gb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSByZXNvdXJjZSBvZiB0aGUgbG9jYXRpb24gb2Ygc3ltYm9sLlxuICAgICAqIEBwYXJhbSBjb250YWluZXJOYW1lIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgY29udGFpbmluZyB0aGUgc3ltYm9sLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShuYW1lLCBraW5kLCByYW5nZSwgdXJpLCBjb250YWluZXJOYW1lKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAga2luZCxcbiAgICAgICAgICAgIGxvY2F0aW9uOiB7IHVyaSwgcmFuZ2UgfVxuICAgICAgICB9O1xuICAgICAgICBpZiAoY29udGFpbmVyTmFtZSkge1xuICAgICAgICAgICAgcmVzdWx0LmNvbnRhaW5lck5hbWUgPSBjb250YWluZXJOYW1lO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIFN5bWJvbEluZm9ybWF0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKFN5bWJvbEluZm9ybWF0aW9uIHx8IChTeW1ib2xJbmZvcm1hdGlvbiA9IHt9KSk7XG5leHBvcnQgdmFyIFdvcmtzcGFjZVN5bWJvbDtcbihmdW5jdGlvbiAoV29ya3NwYWNlU3ltYm9sKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IHdvcmtzcGFjZSBzeW1ib2wuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSBraW5kIFRoZSBraW5kIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgcmVzb3VyY2Ugb2YgdGhlIGxvY2F0aW9uIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIHJhbmdlIEFuIG9wdGlvbnMgcmFuZ2Ugb2YgdGhlIGxvY2F0aW9uLlxuICAgICAqIEByZXR1cm5zIEEgV29ya3NwYWNlU3ltYm9sLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShuYW1lLCBraW5kLCB1cmksIHJhbmdlKSB7XG4gICAgICAgIHJldHVybiByYW5nZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IHsgbmFtZSwga2luZCwgbG9jYXRpb246IHsgdXJpLCByYW5nZSB9IH1cbiAgICAgICAgICAgIDogeyBuYW1lLCBraW5kLCBsb2NhdGlvbjogeyB1cmkgfSB9O1xuICAgIH1cbiAgICBXb3Jrc3BhY2VTeW1ib2wuY3JlYXRlID0gY3JlYXRlO1xufSkoV29ya3NwYWNlU3ltYm9sIHx8IChXb3Jrc3BhY2VTeW1ib2wgPSB7fSkpO1xuZXhwb3J0IHZhciBEb2N1bWVudFN5bWJvbDtcbihmdW5jdGlvbiAoRG9jdW1lbnRTeW1ib2wpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHN5bWJvbCBpbmZvcm1hdGlvbiBsaXRlcmFsLlxuICAgICAqXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gZGV0YWlsIFRoZSBkZXRhaWwgb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0ga2luZCBUaGUga2luZCBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2Ugb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gc2VsZWN0aW9uUmFuZ2UgVGhlIHNlbGVjdGlvblJhbmdlIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIGNoaWxkcmVuIENoaWxkcmVuIG9mIHRoZSBzeW1ib2wuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKG5hbWUsIGRldGFpbCwga2luZCwgcmFuZ2UsIHNlbGVjdGlvblJhbmdlLCBjaGlsZHJlbikge1xuICAgICAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGRldGFpbCxcbiAgICAgICAgICAgIGtpbmQsXG4gICAgICAgICAgICByYW5nZSxcbiAgICAgICAgICAgIHNlbGVjdGlvblJhbmdlXG4gICAgICAgIH07XG4gICAgICAgIGlmIChjaGlsZHJlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBEb2N1bWVudFN5bWJvbC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBEb2N1bWVudFN5bWJvbH0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJlxuICAgICAgICAgICAgSXMuc3RyaW5nKGNhbmRpZGF0ZS5uYW1lKSAmJiBJcy5udW1iZXIoY2FuZGlkYXRlLmtpbmQpICYmXG4gICAgICAgICAgICBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5zZWxlY3Rpb25SYW5nZSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuZGV0YWlsID09PSB1bmRlZmluZWQgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS5kZXRhaWwpKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5kZXByZWNhdGVkID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUuZGVwcmVjYXRlZCkpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmNoaWxkcmVuID09PSB1bmRlZmluZWQgfHwgQXJyYXkuaXNBcnJheShjYW5kaWRhdGUuY2hpbGRyZW4pKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS50YWdzID09PSB1bmRlZmluZWQgfHwgQXJyYXkuaXNBcnJheShjYW5kaWRhdGUudGFncykpO1xuICAgIH1cbiAgICBEb2N1bWVudFN5bWJvbC5pcyA9IGlzO1xufSkoRG9jdW1lbnRTeW1ib2wgfHwgKERvY3VtZW50U3ltYm9sID0ge30pKTtcbi8qKlxuICogQSBzZXQgb2YgcHJlZGVmaW5lZCBjb2RlIGFjdGlvbiBraW5kc1xuICovXG5leHBvcnQgdmFyIENvZGVBY3Rpb25LaW5kO1xuKGZ1bmN0aW9uIChDb2RlQWN0aW9uS2luZCkge1xuICAgIC8qKlxuICAgICAqIEVtcHR5IGtpbmQuXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuRW1wdHkgPSAnJztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIHF1aWNrZml4IGFjdGlvbnM6ICdxdWlja2ZpeCdcbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5RdWlja0ZpeCA9ICdxdWlja2ZpeCc7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciByZWZhY3RvcmluZyBhY3Rpb25zOiAncmVmYWN0b3InXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuUmVmYWN0b3IgPSAncmVmYWN0b3InO1xuICAgIC8qKlxuICAgICAqIEJhc2Uga2luZCBmb3IgcmVmYWN0b3JpbmcgZXh0cmFjdGlvbiBhY3Rpb25zOiAncmVmYWN0b3IuZXh0cmFjdCdcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgZXh0cmFjdCBhY3Rpb25zOlxuICAgICAqXG4gICAgICogLSBFeHRyYWN0IG1ldGhvZFxuICAgICAqIC0gRXh0cmFjdCBmdW5jdGlvblxuICAgICAqIC0gRXh0cmFjdCB2YXJpYWJsZVxuICAgICAqIC0gRXh0cmFjdCBpbnRlcmZhY2UgZnJvbSBjbGFzc1xuICAgICAqIC0gLi4uXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuUmVmYWN0b3JFeHRyYWN0ID0gJ3JlZmFjdG9yLmV4dHJhY3QnO1xuICAgIC8qKlxuICAgICAqIEJhc2Uga2luZCBmb3IgcmVmYWN0b3JpbmcgaW5saW5lIGFjdGlvbnM6ICdyZWZhY3Rvci5pbmxpbmUnXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIGlubGluZSBhY3Rpb25zOlxuICAgICAqXG4gICAgICogLSBJbmxpbmUgZnVuY3Rpb25cbiAgICAgKiAtIElubGluZSB2YXJpYWJsZVxuICAgICAqIC0gSW5saW5lIGNvbnN0YW50XG4gICAgICogLSAuLi5cbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5SZWZhY3RvcklubGluZSA9ICdyZWZhY3Rvci5pbmxpbmUnO1xuICAgIC8qKlxuICAgICAqIEJhc2Uga2luZCBmb3IgcmVmYWN0b3JpbmcgcmV3cml0ZSBhY3Rpb25zOiAncmVmYWN0b3IucmV3cml0ZSdcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgcmV3cml0ZSBhY3Rpb25zOlxuICAgICAqXG4gICAgICogLSBDb252ZXJ0IEphdmFTY3JpcHQgZnVuY3Rpb24gdG8gY2xhc3NcbiAgICAgKiAtIEFkZCBvciByZW1vdmUgcGFyYW1ldGVyXG4gICAgICogLSBFbmNhcHN1bGF0ZSBmaWVsZFxuICAgICAqIC0gTWFrZSBtZXRob2Qgc3RhdGljXG4gICAgICogLSBNb3ZlIG1ldGhvZCB0byBiYXNlIGNsYXNzXG4gICAgICogLSAuLi5cbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5SZWZhY3RvclJld3JpdGUgPSAncmVmYWN0b3IucmV3cml0ZSc7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciBzb3VyY2UgYWN0aW9uczogYHNvdXJjZWBcbiAgICAgKlxuICAgICAqIFNvdXJjZSBjb2RlIGFjdGlvbnMgYXBwbHkgdG8gdGhlIGVudGlyZSBmaWxlLlxuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlNvdXJjZSA9ICdzb3VyY2UnO1xuICAgIC8qKlxuICAgICAqIEJhc2Uga2luZCBmb3IgYW4gb3JnYW5pemUgaW1wb3J0cyBzb3VyY2UgYWN0aW9uOiBgc291cmNlLm9yZ2FuaXplSW1wb3J0c2BcbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5Tb3VyY2VPcmdhbml6ZUltcG9ydHMgPSAnc291cmNlLm9yZ2FuaXplSW1wb3J0cyc7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciBhdXRvLWZpeCBzb3VyY2UgYWN0aW9uczogYHNvdXJjZS5maXhBbGxgLlxuICAgICAqXG4gICAgICogRml4IGFsbCBhY3Rpb25zIGF1dG9tYXRpY2FsbHkgZml4IGVycm9ycyB0aGF0IGhhdmUgYSBjbGVhciBmaXggdGhhdCBkbyBub3QgcmVxdWlyZSB1c2VyIGlucHV0LlxuICAgICAqIFRoZXkgc2hvdWxkIG5vdCBzdXBwcmVzcyBlcnJvcnMgb3IgcGVyZm9ybSB1bnNhZmUgZml4ZXMgc3VjaCBhcyBnZW5lcmF0aW5nIG5ldyB0eXBlcyBvciBjbGFzc2VzLlxuICAgICAqXG4gICAgICogQHNpbmNlIDMuMTUuMFxuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlNvdXJjZUZpeEFsbCA9ICdzb3VyY2UuZml4QWxsJztcbn0pKENvZGVBY3Rpb25LaW5kIHx8IChDb2RlQWN0aW9uS2luZCA9IHt9KSk7XG4vKipcbiAqIFRoZSByZWFzb24gd2h5IGNvZGUgYWN0aW9ucyB3ZXJlIHJlcXVlc3RlZC5cbiAqXG4gKiBAc2luY2UgMy4xNy4wXG4gKi9cbmV4cG9ydCB2YXIgQ29kZUFjdGlvblRyaWdnZXJLaW5kO1xuKGZ1bmN0aW9uIChDb2RlQWN0aW9uVHJpZ2dlcktpbmQpIHtcbiAgICAvKipcbiAgICAgKiBDb2RlIGFjdGlvbnMgd2VyZSBleHBsaWNpdGx5IHJlcXVlc3RlZCBieSB0aGUgdXNlciBvciBieSBhbiBleHRlbnNpb24uXG4gICAgICovXG4gICAgQ29kZUFjdGlvblRyaWdnZXJLaW5kLkludm9rZWQgPSAxO1xuICAgIC8qKlxuICAgICAqIENvZGUgYWN0aW9ucyB3ZXJlIHJlcXVlc3RlZCBhdXRvbWF0aWNhbGx5LlxuICAgICAqXG4gICAgICogVGhpcyB0eXBpY2FsbHkgaGFwcGVucyB3aGVuIGN1cnJlbnQgc2VsZWN0aW9uIGluIGEgZmlsZSBjaGFuZ2VzLCBidXQgY2FuXG4gICAgICogYWxzbyBiZSB0cmlnZ2VyZWQgd2hlbiBmaWxlIGNvbnRlbnQgY2hhbmdlcy5cbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uVHJpZ2dlcktpbmQuQXV0b21hdGljID0gMjtcbn0pKENvZGVBY3Rpb25UcmlnZ2VyS2luZCB8fCAoQ29kZUFjdGlvblRyaWdnZXJLaW5kID0ge30pKTtcbi8qKlxuICogVGhlIENvZGVBY3Rpb25Db250ZXh0IG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIENvZGVBY3Rpb25Db250ZXh0fSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBDb2RlQWN0aW9uQ29udGV4dDtcbihmdW5jdGlvbiAoQ29kZUFjdGlvbkNvbnRleHQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENvZGVBY3Rpb25Db250ZXh0IGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGRpYWdub3N0aWNzLCBvbmx5LCB0cmlnZ2VyS2luZCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0geyBkaWFnbm9zdGljcyB9O1xuICAgICAgICBpZiAob25seSAhPT0gdW5kZWZpbmVkICYmIG9ubHkgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJlc3VsdC5vbmx5ID0gb25seTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJpZ2dlcktpbmQgIT09IHVuZGVmaW5lZCAmJiB0cmlnZ2VyS2luZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmVzdWx0LnRyaWdnZXJLaW5kID0gdHJpZ2dlcktpbmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgQ29kZUFjdGlvbkNvbnRleHQuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgQ29kZUFjdGlvbkNvbnRleHR9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMudHlwZWRBcnJheShjYW5kaWRhdGUuZGlhZ25vc3RpY3MsIERpYWdub3N0aWMuaXMpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLm9ubHkgPT09IHVuZGVmaW5lZCB8fCBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS5vbmx5LCBJcy5zdHJpbmcpKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS50cmlnZ2VyS2luZCA9PT0gdW5kZWZpbmVkIHx8IGNhbmRpZGF0ZS50cmlnZ2VyS2luZCA9PT0gQ29kZUFjdGlvblRyaWdnZXJLaW5kLkludm9rZWQgfHwgY2FuZGlkYXRlLnRyaWdnZXJLaW5kID09PSBDb2RlQWN0aW9uVHJpZ2dlcktpbmQuQXV0b21hdGljKTtcbiAgICB9XG4gICAgQ29kZUFjdGlvbkNvbnRleHQuaXMgPSBpcztcbn0pKENvZGVBY3Rpb25Db250ZXh0IHx8IChDb2RlQWN0aW9uQ29udGV4dCA9IHt9KSk7XG5leHBvcnQgdmFyIENvZGVBY3Rpb247XG4oZnVuY3Rpb24gKENvZGVBY3Rpb24pIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUodGl0bGUsIGtpbmRPckNvbW1hbmRPckVkaXQsIGtpbmQpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHsgdGl0bGUgfTtcbiAgICAgICAgbGV0IGNoZWNrS2luZCA9IHRydWU7XG4gICAgICAgIGlmICh0eXBlb2Yga2luZE9yQ29tbWFuZE9yRWRpdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNoZWNrS2luZCA9IGZhbHNlO1xuICAgICAgICAgICAgcmVzdWx0LmtpbmQgPSBraW5kT3JDb21tYW5kT3JFZGl0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKENvbW1hbmQuaXMoa2luZE9yQ29tbWFuZE9yRWRpdCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5jb21tYW5kID0ga2luZE9yQ29tbWFuZE9yRWRpdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdC5lZGl0ID0ga2luZE9yQ29tbWFuZE9yRWRpdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hlY2tLaW5kICYmIGtpbmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmtpbmQgPSBraW5kO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIENvZGVBY3Rpb24uY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnRpdGxlKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5kaWFnbm9zdGljcyA9PT0gdW5kZWZpbmVkIHx8IElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLmRpYWdub3N0aWNzLCBEaWFnbm9zdGljLmlzKSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUua2luZCA9PT0gdW5kZWZpbmVkIHx8IElzLnN0cmluZyhjYW5kaWRhdGUua2luZCkpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmVkaXQgIT09IHVuZGVmaW5lZCB8fCBjYW5kaWRhdGUuY29tbWFuZCAhPT0gdW5kZWZpbmVkKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5jb21tYW5kID09PSB1bmRlZmluZWQgfHwgQ29tbWFuZC5pcyhjYW5kaWRhdGUuY29tbWFuZCkpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmlzUHJlZmVycmVkID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUuaXNQcmVmZXJyZWQpKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5lZGl0ID09PSB1bmRlZmluZWQgfHwgV29ya3NwYWNlRWRpdC5pcyhjYW5kaWRhdGUuZWRpdCkpO1xuICAgIH1cbiAgICBDb2RlQWN0aW9uLmlzID0gaXM7XG59KShDb2RlQWN0aW9uIHx8IChDb2RlQWN0aW9uID0ge30pKTtcbi8qKlxuICogVGhlIENvZGVMZW5zIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIENvZGVMZW5zfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBDb2RlTGVucztcbihmdW5jdGlvbiAoQ29kZUxlbnMpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENvZGVMZW5zIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCBkYXRhKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IHJhbmdlIH07XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKGRhdGEpKSB7XG4gICAgICAgICAgICByZXN1bHQuZGF0YSA9IGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgQ29kZUxlbnMuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgQ29kZUxlbnN9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5jb21tYW5kKSB8fCBDb21tYW5kLmlzKGNhbmRpZGF0ZS5jb21tYW5kKSk7XG4gICAgfVxuICAgIENvZGVMZW5zLmlzID0gaXM7XG59KShDb2RlTGVucyB8fCAoQ29kZUxlbnMgPSB7fSkpO1xuLyoqXG4gKiBUaGUgRm9ybWF0dGluZ09wdGlvbnMgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgRm9ybWF0dGluZ09wdGlvbnN9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIEZvcm1hdHRpbmdPcHRpb25zO1xuKGZ1bmN0aW9uIChGb3JtYXR0aW5nT3B0aW9ucykge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgRm9ybWF0dGluZ09wdGlvbnMgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodGFiU2l6ZSwgaW5zZXJ0U3BhY2VzKSB7XG4gICAgICAgIHJldHVybiB7IHRhYlNpemUsIGluc2VydFNwYWNlcyB9O1xuICAgIH1cbiAgICBGb3JtYXR0aW5nT3B0aW9ucy5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBGb3JtYXR0aW5nT3B0aW9uc30gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy51aW50ZWdlcihjYW5kaWRhdGUudGFiU2l6ZSkgJiYgSXMuYm9vbGVhbihjYW5kaWRhdGUuaW5zZXJ0U3BhY2VzKTtcbiAgICB9XG4gICAgRm9ybWF0dGluZ09wdGlvbnMuaXMgPSBpcztcbn0pKEZvcm1hdHRpbmdPcHRpb25zIHx8IChGb3JtYXR0aW5nT3B0aW9ucyA9IHt9KSk7XG4vKipcbiAqIFRoZSBEb2N1bWVudExpbmsgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgRG9jdW1lbnRMaW5rfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBEb2N1bWVudExpbms7XG4oZnVuY3Rpb24gKERvY3VtZW50TGluaykge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgRG9jdW1lbnRMaW5rIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCB0YXJnZXQsIGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIHRhcmdldCwgZGF0YSB9O1xuICAgIH1cbiAgICBEb2N1bWVudExpbmsuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgRG9jdW1lbnRMaW5rfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUudGFyZ2V0KSB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLnRhcmdldCkpO1xuICAgIH1cbiAgICBEb2N1bWVudExpbmsuaXMgPSBpcztcbn0pKERvY3VtZW50TGluayB8fCAoRG9jdW1lbnRMaW5rID0ge30pKTtcbi8qKlxuICogVGhlIFNlbGVjdGlvblJhbmdlIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb24gdG8gd29yayB3aXRoXG4gKiBTZWxlY3Rpb25SYW5nZSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBTZWxlY3Rpb25SYW5nZTtcbihmdW5jdGlvbiAoU2VsZWN0aW9uUmFuZ2UpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFNlbGVjdGlvblJhbmdlXG4gICAgICogQHBhcmFtIHJhbmdlIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0gcGFyZW50IGFuIG9wdGlvbmFsIHBhcmVudC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIHBhcmVudCkge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgcGFyZW50IH07XG4gICAgfVxuICAgIFNlbGVjdGlvblJhbmdlLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiAoY2FuZGlkYXRlLnBhcmVudCA9PT0gdW5kZWZpbmVkIHx8IFNlbGVjdGlvblJhbmdlLmlzKGNhbmRpZGF0ZS5wYXJlbnQpKTtcbiAgICB9XG4gICAgU2VsZWN0aW9uUmFuZ2UuaXMgPSBpcztcbn0pKFNlbGVjdGlvblJhbmdlIHx8IChTZWxlY3Rpb25SYW5nZSA9IHt9KSk7XG4vKipcbiAqIEEgc2V0IG9mIHByZWRlZmluZWQgdG9rZW4gdHlwZXMuIFRoaXMgc2V0IGlzIG5vdCBmaXhlZFxuICogYW4gY2xpZW50cyBjYW4gc3BlY2lmeSBhZGRpdGlvbmFsIHRva2VuIHR5cGVzIHZpYSB0aGVcbiAqIGNvcnJlc3BvbmRpbmcgY2xpZW50IGNhcGFiaWxpdGllcy5cbiAqXG4gKiBAc2luY2UgMy4xNi4wXG4gKi9cbmV4cG9ydCB2YXIgU2VtYW50aWNUb2tlblR5cGVzO1xuKGZ1bmN0aW9uIChTZW1hbnRpY1Rva2VuVHlwZXMpIHtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJuYW1lc3BhY2VcIl0gPSBcIm5hbWVzcGFjZVwiO1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBnZW5lcmljIHR5cGUuIEFjdHMgYXMgYSBmYWxsYmFjayBmb3IgdHlwZXMgd2hpY2ggY2FuJ3QgYmUgbWFwcGVkIHRvXG4gICAgICogYSBzcGVjaWZpYyB0eXBlIGxpa2UgY2xhc3Mgb3IgZW51bS5cbiAgICAgKi9cbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJ0eXBlXCJdID0gXCJ0eXBlXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wiY2xhc3NcIl0gPSBcImNsYXNzXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wiZW51bVwiXSA9IFwiZW51bVwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImludGVyZmFjZVwiXSA9IFwiaW50ZXJmYWNlXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wic3RydWN0XCJdID0gXCJzdHJ1Y3RcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJ0eXBlUGFyYW1ldGVyXCJdID0gXCJ0eXBlUGFyYW1ldGVyXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wicGFyYW1ldGVyXCJdID0gXCJwYXJhbWV0ZXJcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJ2YXJpYWJsZVwiXSA9IFwidmFyaWFibGVcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJwcm9wZXJ0eVwiXSA9IFwicHJvcGVydHlcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJlbnVtTWVtYmVyXCJdID0gXCJlbnVtTWVtYmVyXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wiZXZlbnRcIl0gPSBcImV2ZW50XCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wiZnVuY3Rpb25cIl0gPSBcImZ1bmN0aW9uXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wibWV0aG9kXCJdID0gXCJtZXRob2RcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJtYWNyb1wiXSA9IFwibWFjcm9cIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJrZXl3b3JkXCJdID0gXCJrZXl3b3JkXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wibW9kaWZpZXJcIl0gPSBcIm1vZGlmaWVyXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wiY29tbWVudFwiXSA9IFwiY29tbWVudFwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInN0cmluZ1wiXSA9IFwic3RyaW5nXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wibnVtYmVyXCJdID0gXCJudW1iZXJcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJyZWdleHBcIl0gPSBcInJlZ2V4cFwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcIm9wZXJhdG9yXCJdID0gXCJvcGVyYXRvclwiO1xuICAgIC8qKlxuICAgICAqIEBzaW5jZSAzLjE3LjBcbiAgICAgKi9cbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJkZWNvcmF0b3JcIl0gPSBcImRlY29yYXRvclwiO1xufSkoU2VtYW50aWNUb2tlblR5cGVzIHx8IChTZW1hbnRpY1Rva2VuVHlwZXMgPSB7fSkpO1xuLyoqXG4gKiBBIHNldCBvZiBwcmVkZWZpbmVkIHRva2VuIG1vZGlmaWVycy4gVGhpcyBzZXQgaXMgbm90IGZpeGVkXG4gKiBhbiBjbGllbnRzIGNhbiBzcGVjaWZ5IGFkZGl0aW9uYWwgdG9rZW4gdHlwZXMgdmlhIHRoZVxuICogY29ycmVzcG9uZGluZyBjbGllbnQgY2FwYWJpbGl0aWVzLlxuICpcbiAqIEBzaW5jZSAzLjE2LjBcbiAqL1xuZXhwb3J0IHZhciBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzO1xuKGZ1bmN0aW9uIChTZW1hbnRpY1Rva2VuTW9kaWZpZXJzKSB7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcImRlY2xhcmF0aW9uXCJdID0gXCJkZWNsYXJhdGlvblwiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJkZWZpbml0aW9uXCJdID0gXCJkZWZpbml0aW9uXCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcInJlYWRvbmx5XCJdID0gXCJyZWFkb25seVwiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJzdGF0aWNcIl0gPSBcInN0YXRpY1wiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJkZXByZWNhdGVkXCJdID0gXCJkZXByZWNhdGVkXCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcImFic3RyYWN0XCJdID0gXCJhYnN0cmFjdFwiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJhc3luY1wiXSA9IFwiYXN5bmNcIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wibW9kaWZpY2F0aW9uXCJdID0gXCJtb2RpZmljYXRpb25cIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wiZG9jdW1lbnRhdGlvblwiXSA9IFwiZG9jdW1lbnRhdGlvblwiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJkZWZhdWx0TGlicmFyeVwiXSA9IFwiZGVmYXVsdExpYnJhcnlcIjtcbn0pKFNlbWFudGljVG9rZW5Nb2RpZmllcnMgfHwgKFNlbWFudGljVG9rZW5Nb2RpZmllcnMgPSB7fSkpO1xuLyoqXG4gKiBAc2luY2UgMy4xNi4wXG4gKi9cbmV4cG9ydCB2YXIgU2VtYW50aWNUb2tlbnM7XG4oZnVuY3Rpb24gKFNlbWFudGljVG9rZW5zKSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgKGNhbmRpZGF0ZS5yZXN1bHRJZCA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBjYW5kaWRhdGUucmVzdWx0SWQgPT09ICdzdHJpbmcnKSAmJlxuICAgICAgICAgICAgQXJyYXkuaXNBcnJheShjYW5kaWRhdGUuZGF0YSkgJiYgKGNhbmRpZGF0ZS5kYXRhLmxlbmd0aCA9PT0gMCB8fCB0eXBlb2YgY2FuZGlkYXRlLmRhdGFbMF0gPT09ICdudW1iZXInKTtcbiAgICB9XG4gICAgU2VtYW50aWNUb2tlbnMuaXMgPSBpcztcbn0pKFNlbWFudGljVG9rZW5zIHx8IChTZW1hbnRpY1Rva2VucyA9IHt9KSk7XG4vKipcbiAqIFRoZSBJbmxpbmVWYWx1ZVRleHQgbmFtZXNwYWNlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGggSW5saW5lVmFsdWVUZXh0cy5cbiAqXG4gKiBAc2luY2UgMy4xNy4wXG4gKi9cbmV4cG9ydCB2YXIgSW5saW5lVmFsdWVUZXh0O1xuKGZ1bmN0aW9uIChJbmxpbmVWYWx1ZVRleHQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IElubGluZVZhbHVlVGV4dCBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgdGV4dCkge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgdGV4dCB9O1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZVRleHQuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICE9PSB1bmRlZmluZWQgJiYgY2FuZGlkYXRlICE9PSBudWxsICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS50ZXh0KTtcbiAgICB9XG4gICAgSW5saW5lVmFsdWVUZXh0LmlzID0gaXM7XG59KShJbmxpbmVWYWx1ZVRleHQgfHwgKElubGluZVZhbHVlVGV4dCA9IHt9KSk7XG4vKipcbiAqIFRoZSBJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwIG5hbWVzcGFjZSBwcm92aWRlcyBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIElubGluZVZhbHVlVmFyaWFibGVMb29rdXBzLlxuICpcbiAqIEBzaW5jZSAzLjE3LjBcbiAqL1xuZXhwb3J0IHZhciBJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwO1xuKGZ1bmN0aW9uIChJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBJbmxpbmVWYWx1ZVRleHQgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIHZhcmlhYmxlTmFtZSwgY2FzZVNlbnNpdGl2ZUxvb2t1cCkge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgdmFyaWFibGVOYW1lLCBjYXNlU2Vuc2l0aXZlTG9va3VwIH07XG4gICAgfVxuICAgIElubGluZVZhbHVlVmFyaWFibGVMb29rdXAuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICE9PSB1bmRlZmluZWQgJiYgY2FuZGlkYXRlICE9PSBudWxsICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgSXMuYm9vbGVhbihjYW5kaWRhdGUuY2FzZVNlbnNpdGl2ZUxvb2t1cClcbiAgICAgICAgICAgICYmIChJcy5zdHJpbmcoY2FuZGlkYXRlLnZhcmlhYmxlTmFtZSkgfHwgY2FuZGlkYXRlLnZhcmlhYmxlTmFtZSA9PT0gdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cC5pcyA9IGlzO1xufSkoSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cCB8fCAoSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cCA9IHt9KSk7XG4vKipcbiAqIFRoZSBJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbiBuYW1lc3BhY2UgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCBJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbi5cbiAqXG4gKiBAc2luY2UgMy4xNy4wXG4gKi9cbmV4cG9ydCB2YXIgSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb247XG4oZnVuY3Rpb24gKElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbiBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgZXhwcmVzc2lvbikge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgZXhwcmVzc2lvbiB9O1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgIT09IHVuZGVmaW5lZCAmJiBjYW5kaWRhdGUgIT09IG51bGwgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKVxuICAgICAgICAgICAgJiYgKElzLnN0cmluZyhjYW5kaWRhdGUuZXhwcmVzc2lvbikgfHwgY2FuZGlkYXRlLmV4cHJlc3Npb24gPT09IHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uLmlzID0gaXM7XG59KShJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbiB8fCAoSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24gPSB7fSkpO1xuLyoqXG4gKiBUaGUgSW5saW5lVmFsdWVDb250ZXh0IG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIElubGluZVZhbHVlQ29udGV4dH0gbGl0ZXJhbHMuXG4gKlxuICogQHNpbmNlIDMuMTcuMFxuICovXG5leHBvcnQgdmFyIElubGluZVZhbHVlQ29udGV4dDtcbihmdW5jdGlvbiAoSW5saW5lVmFsdWVDb250ZXh0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBJbmxpbmVWYWx1ZUNvbnRleHQgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUoZnJhbWVJZCwgc3RvcHBlZExvY2F0aW9uKSB7XG4gICAgICAgIHJldHVybiB7IGZyYW1lSWQsIHN0b3BwZWRMb2NhdGlvbiB9O1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZUNvbnRleHQuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgSW5saW5lVmFsdWVDb250ZXh0fSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgUmFuZ2UuaXModmFsdWUuc3RvcHBlZExvY2F0aW9uKTtcbiAgICB9XG4gICAgSW5saW5lVmFsdWVDb250ZXh0LmlzID0gaXM7XG59KShJbmxpbmVWYWx1ZUNvbnRleHQgfHwgKElubGluZVZhbHVlQ29udGV4dCA9IHt9KSk7XG4vKipcbiAqIElubGF5IGhpbnQga2luZHMuXG4gKlxuICogQHNpbmNlIDMuMTcuMFxuICovXG5leHBvcnQgdmFyIElubGF5SGludEtpbmQ7XG4oZnVuY3Rpb24gKElubGF5SGludEtpbmQpIHtcbiAgICAvKipcbiAgICAgKiBBbiBpbmxheSBoaW50IHRoYXQgZm9yIGEgdHlwZSBhbm5vdGF0aW9uLlxuICAgICAqL1xuICAgIElubGF5SGludEtpbmQuVHlwZSA9IDE7XG4gICAgLyoqXG4gICAgICogQW4gaW5sYXkgaGludCB0aGF0IGlzIGZvciBhIHBhcmFtZXRlci5cbiAgICAgKi9cbiAgICBJbmxheUhpbnRLaW5kLlBhcmFtZXRlciA9IDI7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSAxIHx8IHZhbHVlID09PSAyO1xuICAgIH1cbiAgICBJbmxheUhpbnRLaW5kLmlzID0gaXM7XG59KShJbmxheUhpbnRLaW5kIHx8IChJbmxheUhpbnRLaW5kID0ge30pKTtcbmV4cG9ydCB2YXIgSW5sYXlIaW50TGFiZWxQYXJ0O1xuKGZ1bmN0aW9uIChJbmxheUhpbnRMYWJlbFBhcnQpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHsgdmFsdWUgfTtcbiAgICB9XG4gICAgSW5sYXlIaW50TGFiZWxQYXJ0LmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS50b29sdGlwID09PSB1bmRlZmluZWQgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS50b29sdGlwKSB8fCBNYXJrdXBDb250ZW50LmlzKGNhbmRpZGF0ZS50b29sdGlwKSlcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUubG9jYXRpb24gPT09IHVuZGVmaW5lZCB8fCBMb2NhdGlvbi5pcyhjYW5kaWRhdGUubG9jYXRpb24pKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS5jb21tYW5kID09PSB1bmRlZmluZWQgfHwgQ29tbWFuZC5pcyhjYW5kaWRhdGUuY29tbWFuZCkpO1xuICAgIH1cbiAgICBJbmxheUhpbnRMYWJlbFBhcnQuaXMgPSBpcztcbn0pKElubGF5SGludExhYmVsUGFydCB8fCAoSW5sYXlIaW50TGFiZWxQYXJ0ID0ge30pKTtcbmV4cG9ydCB2YXIgSW5sYXlIaW50O1xuKGZ1bmN0aW9uIChJbmxheUhpbnQpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUocG9zaXRpb24sIGxhYmVsLCBraW5kKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHsgcG9zaXRpb24sIGxhYmVsIH07XG4gICAgICAgIGlmIChraW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5raW5kID0ga2luZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBJbmxheUhpbnQuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIFBvc2l0aW9uLmlzKGNhbmRpZGF0ZS5wb3NpdGlvbilcbiAgICAgICAgICAgICYmIChJcy5zdHJpbmcoY2FuZGlkYXRlLmxhYmVsKSB8fCBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS5sYWJlbCwgSW5sYXlIaW50TGFiZWxQYXJ0LmlzKSlcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUua2luZCA9PT0gdW5kZWZpbmVkIHx8IElubGF5SGludEtpbmQuaXMoY2FuZGlkYXRlLmtpbmQpKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS50ZXh0RWRpdHMgPT09IHVuZGVmaW5lZCkgfHwgSXMudHlwZWRBcnJheShjYW5kaWRhdGUudGV4dEVkaXRzLCBUZXh0RWRpdC5pcylcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUudG9vbHRpcCA9PT0gdW5kZWZpbmVkIHx8IElzLnN0cmluZyhjYW5kaWRhdGUudG9vbHRpcCkgfHwgTWFya3VwQ29udGVudC5pcyhjYW5kaWRhdGUudG9vbHRpcCkpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLnBhZGRpbmdMZWZ0ID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUucGFkZGluZ0xlZnQpKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS5wYWRkaW5nUmlnaHQgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5wYWRkaW5nUmlnaHQpKTtcbiAgICB9XG4gICAgSW5sYXlIaW50LmlzID0gaXM7XG59KShJbmxheUhpbnQgfHwgKElubGF5SGludCA9IHt9KSk7XG5leHBvcnQgdmFyIFN0cmluZ1ZhbHVlO1xuKGZ1bmN0aW9uIChTdHJpbmdWYWx1ZSkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVNuaXBwZXQodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHsga2luZDogJ3NuaXBwZXQnLCB2YWx1ZSB9O1xuICAgIH1cbiAgICBTdHJpbmdWYWx1ZS5jcmVhdGVTbmlwcGV0ID0gY3JlYXRlU25pcHBldDtcbn0pKFN0cmluZ1ZhbHVlIHx8IChTdHJpbmdWYWx1ZSA9IHt9KSk7XG5leHBvcnQgdmFyIElubGluZUNvbXBsZXRpb25JdGVtO1xuKGZ1bmN0aW9uIChJbmxpbmVDb21wbGV0aW9uSXRlbSkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShpbnNlcnRUZXh0LCBmaWx0ZXJUZXh0LCByYW5nZSwgY29tbWFuZCkge1xuICAgICAgICByZXR1cm4geyBpbnNlcnRUZXh0LCBmaWx0ZXJUZXh0LCByYW5nZSwgY29tbWFuZCB9O1xuICAgIH1cbiAgICBJbmxpbmVDb21wbGV0aW9uSXRlbS5jcmVhdGUgPSBjcmVhdGU7XG59KShJbmxpbmVDb21wbGV0aW9uSXRlbSB8fCAoSW5saW5lQ29tcGxldGlvbkl0ZW0gPSB7fSkpO1xuZXhwb3J0IHZhciBJbmxpbmVDb21wbGV0aW9uTGlzdDtcbihmdW5jdGlvbiAoSW5saW5lQ29tcGxldGlvbkxpc3QpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUoaXRlbXMpIHtcbiAgICAgICAgcmV0dXJuIHsgaXRlbXMgfTtcbiAgICB9XG4gICAgSW5saW5lQ29tcGxldGlvbkxpc3QuY3JlYXRlID0gY3JlYXRlO1xufSkoSW5saW5lQ29tcGxldGlvbkxpc3QgfHwgKElubGluZUNvbXBsZXRpb25MaXN0ID0ge30pKTtcbi8qKlxuICogRGVzY3JpYmVzIGhvdyBhbiB7QGxpbmsgSW5saW5lQ29tcGxldGlvbkl0ZW1Qcm92aWRlciBpbmxpbmUgY29tcGxldGlvbiBwcm92aWRlcn0gd2FzIHRyaWdnZXJlZC5cbiAqXG4gKiBAc2luY2UgMy4xOC4wXG4gKiBAcHJvcG9zZWRcbiAqL1xuZXhwb3J0IHZhciBJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmQ7XG4oZnVuY3Rpb24gKElubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZCkge1xuICAgIC8qKlxuICAgICAqIENvbXBsZXRpb24gd2FzIHRyaWdnZXJlZCBleHBsaWNpdGx5IGJ5IGEgdXNlciBnZXN0dXJlLlxuICAgICAqL1xuICAgIElubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZC5JbnZva2VkID0gMDtcbiAgICAvKipcbiAgICAgKiBDb21wbGV0aW9uIHdhcyB0cmlnZ2VyZWQgYXV0b21hdGljYWxseSB3aGlsZSBlZGl0aW5nLlxuICAgICAqL1xuICAgIElubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZC5BdXRvbWF0aWMgPSAxO1xufSkoSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kIHx8IChJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmQgPSB7fSkpO1xuZXhwb3J0IHZhciBTZWxlY3RlZENvbXBsZXRpb25JbmZvO1xuKGZ1bmN0aW9uIChTZWxlY3RlZENvbXBsZXRpb25JbmZvKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCB0ZXh0KSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCB0ZXh0IH07XG4gICAgfVxuICAgIFNlbGVjdGVkQ29tcGxldGlvbkluZm8uY3JlYXRlID0gY3JlYXRlO1xufSkoU2VsZWN0ZWRDb21wbGV0aW9uSW5mbyB8fCAoU2VsZWN0ZWRDb21wbGV0aW9uSW5mbyA9IHt9KSk7XG5leHBvcnQgdmFyIElubGluZUNvbXBsZXRpb25Db250ZXh0O1xuKGZ1bmN0aW9uIChJbmxpbmVDb21wbGV0aW9uQ29udGV4dCkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh0cmlnZ2VyS2luZCwgc2VsZWN0ZWRDb21wbGV0aW9uSW5mbykge1xuICAgICAgICByZXR1cm4geyB0cmlnZ2VyS2luZCwgc2VsZWN0ZWRDb21wbGV0aW9uSW5mbyB9O1xuICAgIH1cbiAgICBJbmxpbmVDb21wbGV0aW9uQ29udGV4dC5jcmVhdGUgPSBjcmVhdGU7XG59KShJbmxpbmVDb21wbGV0aW9uQ29udGV4dCB8fCAoSW5saW5lQ29tcGxldGlvbkNvbnRleHQgPSB7fSkpO1xuZXhwb3J0IHZhciBXb3Jrc3BhY2VGb2xkZXI7XG4oZnVuY3Rpb24gKFdvcmtzcGFjZUZvbGRlcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIFVSSS5pcyhjYW5kaWRhdGUudXJpKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLm5hbWUpO1xuICAgIH1cbiAgICBXb3Jrc3BhY2VGb2xkZXIuaXMgPSBpcztcbn0pKFdvcmtzcGFjZUZvbGRlciB8fCAoV29ya3NwYWNlRm9sZGVyID0ge30pKTtcbmV4cG9ydCBjb25zdCBFT0wgPSBbJ1xcbicsICdcXHJcXG4nLCAnXFxyJ107XG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSB0aGUgdGV4dCBkb2N1bWVudCBmcm9tIHRoZSBuZXcgdnNjb2RlLWxhbmd1YWdlc2VydmVyLXRleHRkb2N1bWVudCBwYWNrYWdlLlxuICovXG5leHBvcnQgdmFyIFRleHREb2N1bWVudDtcbihmdW5jdGlvbiAoVGV4dERvY3VtZW50KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBJVGV4dERvY3VtZW50IGxpdGVyYWwgZnJvbSB0aGUgZ2l2ZW4gdXJpIGFuZCBjb250ZW50LlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIGRvY3VtZW50J3MgdXJpLlxuICAgICAqIEBwYXJhbSBsYW5ndWFnZUlkIFRoZSBkb2N1bWVudCdzIGxhbmd1YWdlIElkLlxuICAgICAqIEBwYXJhbSB2ZXJzaW9uIFRoZSBkb2N1bWVudCdzIHZlcnNpb24uXG4gICAgICogQHBhcmFtIGNvbnRlbnQgVGhlIGRvY3VtZW50J3MgY29udGVudC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodXJpLCBsYW5ndWFnZUlkLCB2ZXJzaW9uLCBjb250ZW50KSB7XG4gICAgICAgIHJldHVybiBuZXcgRnVsbFRleHREb2N1bWVudCh1cmksIGxhbmd1YWdlSWQsIHZlcnNpb24sIGNvbnRlbnQpO1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnQuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgSVRleHREb2N1bWVudH0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSkgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUubGFuZ3VhZ2VJZCkgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS5sYW5ndWFnZUlkKSkgJiYgSXMudWludGVnZXIoY2FuZGlkYXRlLmxpbmVDb3VudClcbiAgICAgICAgICAgICYmIElzLmZ1bmMoY2FuZGlkYXRlLmdldFRleHQpICYmIElzLmZ1bmMoY2FuZGlkYXRlLnBvc2l0aW9uQXQpICYmIElzLmZ1bmMoY2FuZGlkYXRlLm9mZnNldEF0KSA/IHRydWUgOiBmYWxzZTtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50LmlzID0gaXM7XG4gICAgZnVuY3Rpb24gYXBwbHlFZGl0cyhkb2N1bWVudCwgZWRpdHMpIHtcbiAgICAgICAgbGV0IHRleHQgPSBkb2N1bWVudC5nZXRUZXh0KCk7XG4gICAgICAgIGxldCBzb3J0ZWRFZGl0cyA9IG1lcmdlU29ydChlZGl0cywgKGEsIGIpID0+IHtcbiAgICAgICAgICAgIGxldCBkaWZmID0gYS5yYW5nZS5zdGFydC5saW5lIC0gYi5yYW5nZS5zdGFydC5saW5lO1xuICAgICAgICAgICAgaWYgKGRpZmYgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYS5yYW5nZS5zdGFydC5jaGFyYWN0ZXIgLSBiLnJhbmdlLnN0YXJ0LmNoYXJhY3RlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBkaWZmO1xuICAgICAgICB9KTtcbiAgICAgICAgbGV0IGxhc3RNb2RpZmllZE9mZnNldCA9IHRleHQubGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBpID0gc29ydGVkRWRpdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGxldCBlID0gc29ydGVkRWRpdHNbaV07XG4gICAgICAgICAgICBsZXQgc3RhcnRPZmZzZXQgPSBkb2N1bWVudC5vZmZzZXRBdChlLnJhbmdlLnN0YXJ0KTtcbiAgICAgICAgICAgIGxldCBlbmRPZmZzZXQgPSBkb2N1bWVudC5vZmZzZXRBdChlLnJhbmdlLmVuZCk7XG4gICAgICAgICAgICBpZiAoZW5kT2Zmc2V0IDw9IGxhc3RNb2RpZmllZE9mZnNldCkge1xuICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cmluZygwLCBzdGFydE9mZnNldCkgKyBlLm5ld1RleHQgKyB0ZXh0LnN1YnN0cmluZyhlbmRPZmZzZXQsIHRleHQubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignT3ZlcmxhcHBpbmcgZWRpdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkT2Zmc2V0ID0gc3RhcnRPZmZzZXQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuICAgIFRleHREb2N1bWVudC5hcHBseUVkaXRzID0gYXBwbHlFZGl0cztcbiAgICBmdW5jdGlvbiBtZXJnZVNvcnQoZGF0YSwgY29tcGFyZSkge1xuICAgICAgICBpZiAoZGF0YS5sZW5ndGggPD0gMSkge1xuICAgICAgICAgICAgLy8gc29ydGVkXG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwID0gKGRhdGEubGVuZ3RoIC8gMikgfCAwO1xuICAgICAgICBjb25zdCBsZWZ0ID0gZGF0YS5zbGljZSgwLCBwKTtcbiAgICAgICAgY29uc3QgcmlnaHQgPSBkYXRhLnNsaWNlKHApO1xuICAgICAgICBtZXJnZVNvcnQobGVmdCwgY29tcGFyZSk7XG4gICAgICAgIG1lcmdlU29ydChyaWdodCwgY29tcGFyZSk7XG4gICAgICAgIGxldCBsZWZ0SWR4ID0gMDtcbiAgICAgICAgbGV0IHJpZ2h0SWR4ID0gMDtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICB3aGlsZSAobGVmdElkeCA8IGxlZnQubGVuZ3RoICYmIHJpZ2h0SWR4IDwgcmlnaHQubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgcmV0ID0gY29tcGFyZShsZWZ0W2xlZnRJZHhdLCByaWdodFtyaWdodElkeF0pO1xuICAgICAgICAgICAgaWYgKHJldCA8PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gc21hbGxlcl9lcXVhbCAtPiB0YWtlIGxlZnQgdG8gcHJlc2VydmUgb3JkZXJcbiAgICAgICAgICAgICAgICBkYXRhW2krK10gPSBsZWZ0W2xlZnRJZHgrK107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBncmVhdGVyIC0+IHRha2UgcmlnaHRcbiAgICAgICAgICAgICAgICBkYXRhW2krK10gPSByaWdodFtyaWdodElkeCsrXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAobGVmdElkeCA8IGxlZnQubGVuZ3RoKSB7XG4gICAgICAgICAgICBkYXRhW2krK10gPSBsZWZ0W2xlZnRJZHgrK107XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKHJpZ2h0SWR4IDwgcmlnaHQubGVuZ3RoKSB7XG4gICAgICAgICAgICBkYXRhW2krK10gPSByaWdodFtyaWdodElkeCsrXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG59KShUZXh0RG9jdW1lbnQgfHwgKFRleHREb2N1bWVudCA9IHt9KSk7XG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSB0aGUgdGV4dCBkb2N1bWVudCBmcm9tIHRoZSBuZXcgdnNjb2RlLWxhbmd1YWdlc2VydmVyLXRleHRkb2N1bWVudCBwYWNrYWdlLlxuICovXG5jbGFzcyBGdWxsVGV4dERvY3VtZW50IHtcbiAgICBjb25zdHJ1Y3Rvcih1cmksIGxhbmd1YWdlSWQsIHZlcnNpb24sIGNvbnRlbnQpIHtcbiAgICAgICAgdGhpcy5fdXJpID0gdXJpO1xuICAgICAgICB0aGlzLl9sYW5ndWFnZUlkID0gbGFuZ3VhZ2VJZDtcbiAgICAgICAgdGhpcy5fdmVyc2lvbiA9IHZlcnNpb247XG4gICAgICAgIHRoaXMuX2NvbnRlbnQgPSBjb250ZW50O1xuICAgICAgICB0aGlzLl9saW5lT2Zmc2V0cyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZ2V0IHVyaSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VyaTtcbiAgICB9XG4gICAgZ2V0IGxhbmd1YWdlSWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sYW5ndWFnZUlkO1xuICAgIH1cbiAgICBnZXQgdmVyc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZlcnNpb247XG4gICAgfVxuICAgIGdldFRleHQocmFuZ2UpIHtcbiAgICAgICAgaWYgKHJhbmdlKSB7XG4gICAgICAgICAgICBsZXQgc3RhcnQgPSB0aGlzLm9mZnNldEF0KHJhbmdlLnN0YXJ0KTtcbiAgICAgICAgICAgIGxldCBlbmQgPSB0aGlzLm9mZnNldEF0KHJhbmdlLmVuZCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY29udGVudC5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRlbnQ7XG4gICAgfVxuICAgIHVwZGF0ZShldmVudCwgdmVyc2lvbikge1xuICAgICAgICB0aGlzLl9jb250ZW50ID0gZXZlbnQudGV4dDtcbiAgICAgICAgdGhpcy5fdmVyc2lvbiA9IHZlcnNpb247XG4gICAgICAgIHRoaXMuX2xpbmVPZmZzZXRzID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBnZXRMaW5lT2Zmc2V0cygpIHtcbiAgICAgICAgaWYgKHRoaXMuX2xpbmVPZmZzZXRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxldCBsaW5lT2Zmc2V0cyA9IFtdO1xuICAgICAgICAgICAgbGV0IHRleHQgPSB0aGlzLl9jb250ZW50O1xuICAgICAgICAgICAgbGV0IGlzTGluZVN0YXJ0ID0gdHJ1ZTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChpc0xpbmVTdGFydCkge1xuICAgICAgICAgICAgICAgICAgICBsaW5lT2Zmc2V0cy5wdXNoKGkpO1xuICAgICAgICAgICAgICAgICAgICBpc0xpbmVTdGFydCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgY2ggPSB0ZXh0LmNoYXJBdChpKTtcbiAgICAgICAgICAgICAgICBpc0xpbmVTdGFydCA9IChjaCA9PT0gJ1xccicgfHwgY2ggPT09ICdcXG4nKTtcbiAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICdcXHInICYmIGkgKyAxIDwgdGV4dC5sZW5ndGggJiYgdGV4dC5jaGFyQXQoaSArIDEpID09PSAnXFxuJykge1xuICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzTGluZVN0YXJ0ICYmIHRleHQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxpbmVPZmZzZXRzLnB1c2godGV4dC5sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fbGluZU9mZnNldHMgPSBsaW5lT2Zmc2V0cztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fbGluZU9mZnNldHM7XG4gICAgfVxuICAgIHBvc2l0aW9uQXQob2Zmc2V0KSB7XG4gICAgICAgIG9mZnNldCA9IE1hdGgubWF4KE1hdGgubWluKG9mZnNldCwgdGhpcy5fY29udGVudC5sZW5ndGgpLCAwKTtcbiAgICAgICAgbGV0IGxpbmVPZmZzZXRzID0gdGhpcy5nZXRMaW5lT2Zmc2V0cygpO1xuICAgICAgICBsZXQgbG93ID0gMCwgaGlnaCA9IGxpbmVPZmZzZXRzLmxlbmd0aDtcbiAgICAgICAgaWYgKGhpZ2ggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBQb3NpdGlvbi5jcmVhdGUoMCwgb2Zmc2V0KTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAobG93IDwgaGlnaCkge1xuICAgICAgICAgICAgbGV0IG1pZCA9IE1hdGguZmxvb3IoKGxvdyArIGhpZ2gpIC8gMik7XG4gICAgICAgICAgICBpZiAobGluZU9mZnNldHNbbWlkXSA+IG9mZnNldCkge1xuICAgICAgICAgICAgICAgIGhpZ2ggPSBtaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsb3cgPSBtaWQgKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGxvdyBpcyB0aGUgbGVhc3QgeCBmb3Igd2hpY2ggdGhlIGxpbmUgb2Zmc2V0IGlzIGxhcmdlciB0aGFuIHRoZSBjdXJyZW50IG9mZnNldFxuICAgICAgICAvLyBvciBhcnJheS5sZW5ndGggaWYgbm8gbGluZSBvZmZzZXQgaXMgbGFyZ2VyIHRoYW4gdGhlIGN1cnJlbnQgb2Zmc2V0XG4gICAgICAgIGxldCBsaW5lID0gbG93IC0gMTtcbiAgICAgICAgcmV0dXJuIFBvc2l0aW9uLmNyZWF0ZShsaW5lLCBvZmZzZXQgLSBsaW5lT2Zmc2V0c1tsaW5lXSk7XG4gICAgfVxuICAgIG9mZnNldEF0KHBvc2l0aW9uKSB7XG4gICAgICAgIGxldCBsaW5lT2Zmc2V0cyA9IHRoaXMuZ2V0TGluZU9mZnNldHMoKTtcbiAgICAgICAgaWYgKHBvc2l0aW9uLmxpbmUgPj0gbGluZU9mZnNldHMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY29udGVudC5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocG9zaXRpb24ubGluZSA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIGxldCBsaW5lT2Zmc2V0ID0gbGluZU9mZnNldHNbcG9zaXRpb24ubGluZV07XG4gICAgICAgIGxldCBuZXh0TGluZU9mZnNldCA9IChwb3NpdGlvbi5saW5lICsgMSA8IGxpbmVPZmZzZXRzLmxlbmd0aCkgPyBsaW5lT2Zmc2V0c1twb3NpdGlvbi5saW5lICsgMV0gOiB0aGlzLl9jb250ZW50Lmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KE1hdGgubWluKGxpbmVPZmZzZXQgKyBwb3NpdGlvbi5jaGFyYWN0ZXIsIG5leHRMaW5lT2Zmc2V0KSwgbGluZU9mZnNldCk7XG4gICAgfVxuICAgIGdldCBsaW5lQ291bnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldExpbmVPZmZzZXRzKCkubGVuZ3RoO1xuICAgIH1cbn1cbnZhciBJcztcbihmdW5jdGlvbiAoSXMpIHtcbiAgICBjb25zdCB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG4gICAgZnVuY3Rpb24gZGVmaW5lZCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJztcbiAgICB9XG4gICAgSXMuZGVmaW5lZCA9IGRlZmluZWQ7XG4gICAgZnVuY3Rpb24gdW5kZWZpbmVkKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnO1xuICAgIH1cbiAgICBJcy51bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgZnVuY3Rpb24gYm9vbGVhbih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWUgPT09IHRydWUgfHwgdmFsdWUgPT09IGZhbHNlO1xuICAgIH1cbiAgICBJcy5ib29sZWFuID0gYm9vbGVhbjtcbiAgICBmdW5jdGlvbiBzdHJpbmcodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBTdHJpbmddJztcbiAgICB9XG4gICAgSXMuc3RyaW5nID0gc3RyaW5nO1xuICAgIGZ1bmN0aW9uIG51bWJlcih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IE51bWJlcl0nO1xuICAgIH1cbiAgICBJcy5udW1iZXIgPSBudW1iZXI7XG4gICAgZnVuY3Rpb24gbnVtYmVyUmFuZ2UodmFsdWUsIG1pbiwgbWF4KSB7XG4gICAgICAgIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgTnVtYmVyXScgJiYgbWluIDw9IHZhbHVlICYmIHZhbHVlIDw9IG1heDtcbiAgICB9XG4gICAgSXMubnVtYmVyUmFuZ2UgPSBudW1iZXJSYW5nZTtcbiAgICBmdW5jdGlvbiBpbnRlZ2VyKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgTnVtYmVyXScgJiYgLTIxNDc0ODM2NDggPD0gdmFsdWUgJiYgdmFsdWUgPD0gMjE0NzQ4MzY0NztcbiAgICB9XG4gICAgSXMuaW50ZWdlciA9IGludGVnZXI7XG4gICAgZnVuY3Rpb24gdWludGVnZXIodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBOdW1iZXJdJyAmJiAwIDw9IHZhbHVlICYmIHZhbHVlIDw9IDIxNDc0ODM2NDc7XG4gICAgfVxuICAgIElzLnVpbnRlZ2VyID0gdWludGVnZXI7XG4gICAgZnVuY3Rpb24gZnVuYyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG4gICAgfVxuICAgIElzLmZ1bmMgPSBmdW5jO1xuICAgIGZ1bmN0aW9uIG9iamVjdExpdGVyYWwodmFsdWUpIHtcbiAgICAgICAgLy8gU3RyaWN0bHkgc3BlYWtpbmcgY2xhc3MgaW5zdGFuY2VzIHBhc3MgdGhpcyBjaGVjayBhcyB3ZWxsLiBTaW5jZSB0aGUgTFNQXG4gICAgICAgIC8vIGRvZXNuJ3QgdXNlIGNsYXNzZXMgd2UgaWdub3JlIHRoaXMgZm9yIG5vdy4gSWYgd2UgZG8gd2UgbmVlZCB0byBhZGQgc29tZXRoaW5nXG4gICAgICAgIC8vIGxpa2UgdGhpczogYE9iamVjdC5nZXRQcm90b3R5cGVPZihPYmplY3QuZ2V0UHJvdG90eXBlT2YoeCkpID09PSBudWxsYFxuICAgICAgICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JztcbiAgICB9XG4gICAgSXMub2JqZWN0TGl0ZXJhbCA9IG9iamVjdExpdGVyYWw7XG4gICAgZnVuY3Rpb24gdHlwZWRBcnJheSh2YWx1ZSwgY2hlY2spIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmV2ZXJ5KGNoZWNrKTtcbiAgICB9XG4gICAgSXMudHlwZWRBcnJheSA9IHR5cGVkQXJyYXk7XG59KShJcyB8fCAoSXMgPSB7fSkpO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBS0EsYUFBTyxlQUFlLFNBQVMsY0FBYyxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQzVELGNBQVEsY0FBYyxRQUFRLFFBQVEsUUFBUSxPQUFPLFFBQVEsUUFBUSxRQUFRLFNBQVMsUUFBUSxTQUFTLFFBQVEsVUFBVTtBQUN6SCxlQUFTLFFBQVEsT0FBTztBQUNwQixlQUFPLFVBQVUsUUFBUSxVQUFVO0FBQUEsTUFDdkM7QUFDQSxj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O0FBQUEsUUFBZ0IsQ0FBQztBQUFBLE1BQzlEO0FBQUEsSUFDSjtBQUVBLFVBQU8sV0FBbUIscUJBQXFCLE9BQU87QUFHdEQsUUFBSSxTQUFTLGVBQWUsUUFBUTtBQUNoQyxZQUFNLGlCQUFpQixtQ0FBbUMsRUFBRSxTQUFTLGVBQWUsQ0FBQztBQUFBLElBQ3pGO0FBQUEsRUFDSjtBQUVBLFdBQVMsZ0JBQWdCO0FBQ3JCLFdBQU87QUFBQSxNQUNILE1BQU07QUFBQSxRQUNGLFFBQVE7QUFBQSxVQUNKLE9BQVksRUFBRSxTQUFTLEtBQUs7QUFBQSxVQUM1QixRQUFZLEVBQUUsU0FBUyxNQUFNO0FBQUEsVUFDN0IsWUFBWSxDQUFDLHNCQUFzQixtQkFBbUIsMkJBQTJCO0FBQUEsUUFDckY7QUFBQSxRQUNBLFdBQVcsRUFBRSxTQUFTLEtBQUs7QUFBQSxRQUMzQixZQUFZO0FBQUEsVUFDUixXQUFzQjtBQUFBLFVBQ3RCLHNCQUFzQjtBQUFBLFVBQ3RCLGVBQWU7QUFBQSxZQUNYO0FBQUEsWUFBYTtBQUFBLFlBQVM7QUFBQSxZQUN0QjtBQUFBLFlBQ0E7QUFBQSxZQUNBO0FBQUEsVUFDSjtBQUFBLFVBQ0EsYUFBYSxDQUFDLFFBQVEsU0FBUyxPQUFPLE9BQU8sRUFBRTtBQUFBLFFBQ25EO0FBQUEsUUFDQSxlQUFnQixFQUFFLFNBQVMsS0FBSztBQUFBLFFBQ2hDLFFBQWdCLEVBQUUsU0FBUyxLQUFLO0FBQUEsUUFDaEMsYUFBZ0IsRUFBRSxpQkFBaUIsTUFBTTtBQUFBLFFBQ3pDLFlBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsU0FBUyxNQUFNLEVBQUU7QUFBQSxRQUNyRCxvQkFBd0IsRUFBRSxTQUFTLEtBQUs7QUFBQSxRQUN4Qyx5QkFBeUIsRUFBRSxTQUFTLEtBQUs7QUFBQSxNQUM3QztBQUFBLElBQ0o7QUFBQSxFQUNKOyIsCiAgIm5hbWVzIjogWyJFcnJvckNvZGVzIiwgIk1lc3NhZ2UiLCAiVG91Y2giLCAiRGlzcG9zYWJsZSIsICJSQUwiLCAiRXZlbnQiLCAiSXMiLCAiQ2FuY2VsbGF0aW9uVG9rZW4iLCAiQ2FuY2VsbGF0aW9uU3RhdGUiLCAiX2Nvbm4iLCAiSXMiLCAiTWVzc2FnZVJlYWRlciIsICJBYnN0cmFjdE1lc3NhZ2VSZWFkZXIiLCAiUmVzb2x2ZWRNZXNzYWdlUmVhZGVyT3B0aW9ucyIsICJJcyIsICJNZXNzYWdlV3JpdGVyIiwgIkFic3RyYWN0TWVzc2FnZVdyaXRlciIsICJSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zIiwgInJlc3VsdCIsICJJcyIsICJDYW5jZWxOb3RpZmljYXRpb24iLCAiUHJvZ3Jlc3NUb2tlbiIsICJQcm9ncmVzc05vdGlmaWNhdGlvbiIsICJTdGFyUmVxdWVzdEhhbmRsZXIiLCAiVHJhY2UiLCAiVHJhY2VWYWx1ZXMiLCAiVHJhY2VGb3JtYXQiLCAiU2V0VHJhY2VOb3RpZmljYXRpb24iLCAiTG9nVHJhY2VOb3RpZmljYXRpb24iLCAiQ29ubmVjdGlvbkVycm9ycyIsICJDb25uZWN0aW9uU3RyYXRlZ3kiLCAiSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5IiwgIlJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5IiwgIkNhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kiLCAiQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kiLCAiQ2FuY2VsbGF0aW9uU3RyYXRlZ3kiLCAiTWVzc2FnZVN0cmF0ZWd5IiwgIkNvbm5lY3Rpb25PcHRpb25zIiwgIkNvbm5lY3Rpb25TdGF0ZSIsICJjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiIsICJzdGFydFRpbWUiLCAiUklMIiwgIm0iLCAiZXhwb3J0cyIsICJjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiIsICJpbXBvcnRfdnNjb2RlX2pzb25ycGMiLCAiaW1wb3J0X3ZzY29kZV9qc29ucnBjIiwgImltcG9ydF92c2NvZGVfanNvbnJwYyIsICJpbXBvcnRfdnNjb2RlX2pzb25ycGMiLCAiRG9jdW1lbnRVcmkiLCAiVVJJIiwgImludGVnZXIiLCAidWludGVnZXIiLCAiUG9zaXRpb24iLCAiUmFuZ2UiLCAiTG9jYXRpb24iLCAiTG9jYXRpb25MaW5rIiwgIkNvbG9yIiwgIkNvbG9ySW5mb3JtYXRpb24iLCAiQ29sb3JQcmVzZW50YXRpb24iLCAiRm9sZGluZ1JhbmdlS2luZCIsICJGb2xkaW5nUmFuZ2UiLCAiRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbiIsICJsb2NhdGlvbiIsICJEaWFnbm9zdGljU2V2ZXJpdHkiLCAiRGlhZ25vc3RpY1RhZyIsICJDb2RlRGVzY3JpcHRpb24iLCAiRGlhZ25vc3RpYyIsICJDb21tYW5kIiwgIlRleHRFZGl0IiwgIkNoYW5nZUFubm90YXRpb24iLCAiQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIiLCAiQW5ub3RhdGVkVGV4dEVkaXQiLCAiVGV4dERvY3VtZW50RWRpdCIsICJDcmVhdGVGaWxlIiwgIlJlbmFtZUZpbGUiLCAiRGVsZXRlRmlsZSIsICJXb3Jrc3BhY2VFZGl0IiwgIlRleHREb2N1bWVudElkZW50aWZpZXIiLCAiVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciIsICJPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIiLCAiVGV4dERvY3VtZW50SXRlbSIsICJNYXJrdXBLaW5kIiwgIk1hcmt1cENvbnRlbnQiLCAiQ29tcGxldGlvbkl0ZW1LaW5kIiwgIkluc2VydFRleHRGb3JtYXQiLCAiQ29tcGxldGlvbkl0ZW1UYWciLCAiSW5zZXJ0UmVwbGFjZUVkaXQiLCAiUmFuZ2UiLCAiSW5zZXJ0VGV4dE1vZGUiLCAiQ29tcGxldGlvbkl0ZW1MYWJlbERldGFpbHMiLCAiQ29tcGxldGlvbkl0ZW0iLCAiQ29tcGxldGlvbkxpc3QiLCAiTWFya2VkU3RyaW5nIiwgIkhvdmVyIiwgIlBhcmFtZXRlckluZm9ybWF0aW9uIiwgIlNpZ25hdHVyZUluZm9ybWF0aW9uIiwgIkRvY3VtZW50SGlnaGxpZ2h0S2luZCIsICJEb2N1bWVudEhpZ2hsaWdodCIsICJTeW1ib2xLaW5kIiwgIlN5bWJvbFRhZyIsICJTeW1ib2xJbmZvcm1hdGlvbiIsICJXb3Jrc3BhY2VTeW1ib2wiLCAiRG9jdW1lbnRTeW1ib2wiLCAiQ29kZUFjdGlvbktpbmQiLCAiQ29kZUFjdGlvblRyaWdnZXJLaW5kIiwgIkNvZGVBY3Rpb25Db250ZXh0IiwgIkNvZGVBY3Rpb24iLCAiQ29kZUxlbnMiLCAiRm9ybWF0dGluZ09wdGlvbnMiLCAiRG9jdW1lbnRMaW5rIiwgIlNlbGVjdGlvblJhbmdlIiwgIlNlbWFudGljVG9rZW5UeXBlcyIsICJTZW1hbnRpY1Rva2VuTW9kaWZpZXJzIiwgIlNlbWFudGljVG9rZW5zIiwgIklubGluZVZhbHVlVGV4dCIsICJJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwIiwgIklubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uIiwgIklubGluZVZhbHVlQ29udGV4dCIsICJJbmxheUhpbnRLaW5kIiwgIklubGF5SGludExhYmVsUGFydCIsICJJbmxheUhpbnQiLCAiUG9zaXRpb24iLCAiU3RyaW5nVmFsdWUiLCAiSW5saW5lQ29tcGxldGlvbkl0ZW0iLCAiSW5saW5lQ29tcGxldGlvbkxpc3QiLCAiSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kIiwgIlNlbGVjdGVkQ29tcGxldGlvbkluZm8iLCAiSW5saW5lQ29tcGxldGlvbkNvbnRleHQiLCAiV29ya3NwYWNlRm9sZGVyIiwgIlRleHREb2N1bWVudCIsICJQb3NpdGlvbiIsICJJcyIsICJ1bmRlZmluZWQiLCAiaW50ZWdlciIsICJ1aW50ZWdlciIsICJtIl0KfQo= diff --git a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/lsp/java-lsp-client.ts b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/lsp/java-lsp-client.ts index e3826037c7d..01115c3e5ac 100644 --- a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/lsp/java-lsp-client.ts +++ b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/lsp/java-lsp-client.ts @@ -1159,6 +1159,18 @@ async function applyRenameAcrossWorkspace(model: monaco.editor.ITextModel, edit: } } + // JDT.LS may key a file's text edits by its POST-rename URI (documentChanges are ordered, and the + // rename can precede the edit). Re-attribute every edit to the on-disk (old) URI so the content is + // edited correctly before the file is written/renamed — otherwise the new file keeps the old type + // name and triggers "The public type X must be defined in its own file". + const newToOld: Record = {}; + for (const oldUri in renameByUri) newToOld[renameByUri[oldUri]] = oldUri; + const editsByOld: Record = {}; + for (const uri in textByUri) { + const onDiskUri = newToOld[uri] ?? uri; + editsByOld[onDiskUri] = (editsByOld[onDiskUri] ?? []).concat(textByUri[uri]); + } + const payload: { currentPath: string | null; currentContent: string | null; @@ -1167,31 +1179,45 @@ async function applyRenameAcrossWorkspace(model: monaco.editor.ITextModel, edit: renames: Array<{ oldPath: string | null; newPath: string | null; content: string }>; } = { currentPath: uriToWorkspacePath(currentUri), currentContent: null, currentNewPath: null, writes: [], renames: [] }; - const uris = new Set([...Object.keys(textByUri), ...Object.keys(renameByUri)]); - for (const uri of uris) { - const edits = textByUri[uri] ?? []; + const watchedChanges: Array<{ uri: string; type: number }> = []; + const oldUris = new Set([...Object.keys(editsByOld), ...Object.keys(renameByUri)]); + for (const oldUri of oldUris) { + const edits = editsByOld[oldUri] ?? []; let content: string; - if (uri === currentUri) { + if (oldUri === currentUri) { if (edits.length) { model.pushEditOperations([], edits.map(e => ({ range: lspRangeToMonaco(e.range), text: e.newText, forceMoveMarkers: true })), () => null); } content = model.getValue(); } else { - const source = await fetchWorkspaceFileText(uriToWorkspacePath(uri) ?? uri); + const source = await fetchWorkspaceFileText(uriToWorkspacePath(oldUri) ?? oldUri); content = edits.length ? applyEditsToText(source, edits) : source; } - const newUri = renameByUri[uri]; - if (uri === currentUri) { + const newUri = renameByUri[oldUri]; + if (oldUri === currentUri) { payload.currentContent = content; payload.currentNewPath = newUri ? uriToWorkspacePath(newUri) : null; } else if (newUri) { - payload.renames.push({ oldPath: uriToWorkspacePath(uri), newPath: uriToWorkspacePath(newUri), content }); + payload.renames.push({ oldPath: uriToWorkspacePath(oldUri), newPath: uriToWorkspacePath(newUri), content }); + } else { + payload.writes.push({ path: uriToWorkspacePath(oldUri), content }); + } + // File-change events for JDT.LS so it re-syncs without a page refresh. + if (newUri) { + watchedChanges.push({ uri: oldUri, type: 3 /* Deleted */ }, { uri: newUri, type: 1 /* Created */ }); + _openFiles.delete(oldUri); + _conn?.sendNotification('textDocument/didClose', { textDocument: { uri: oldUri } }); } else { - payload.writes.push({ path: uriToWorkspacePath(uri), content }); + watchedChanges.push({ uri: oldUri, type: 2 /* Changed */ }); } } await (globalThis as any).javaLspPersistRename(payload); + + // Inform JDT.LS of the on-disk changes so the renamed type's diagnostics clear immediately. + if (_conn && watchedChanges.length) { + _conn.sendNotification('workspace/didChangeWatchedFiles', { changes: watchedChanges }); + } } function jdtlsSettings() { From acca89e37e7abf33d753884c404b10250a3d759c Mon Sep 17 00:00:00 2001 From: Iliyan Velichkov Date: Tue, 23 Jun 2026 16:43:11 +0300 Subject: [PATCH 10/14] perf+ux(editor): cap completion results; reveal renamed file in the tree - Cap JDT.LS completion at maxResults=50 so import/type suggestions over the large platform classpath return faster. - On a Java file rename, the Projects view now renames the matching tree node in place and selects it (keeping it revealed) instead of doing a full collapse-reload, so the renamed file stays visible and highlighted; falls back to a reload if the node isn't loaded. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../editor-monaco/js/java-lsp-client.js | 4 +++- .../editor-monaco/js/lsp/java-lsp-client.ts | 2 ++ .../dirigible/view-projects/js/projects.js | 19 ++++++++++++++++--- 3 files changed, 21 insertions(+), 4 deletions(-) diff --git a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/java-lsp-client.js b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/java-lsp-client.js index ffb4052ddbf..fdf3c8ed72a 100644 --- a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/java-lsp-client.js +++ b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/java-lsp-client.js @@ -5555,6 +5555,8 @@ ${JSON.stringify(message, null, 4)}`); completion: { overwrite: true, guessMethodArguments: false, + // Cap results so import/type completion over the large platform classpath stays snappy. + maxResults: 50, filteredTypes: [ "com.sun.*", "sun.*", @@ -5576,4 +5578,4 @@ ${JSON.stringify(message, null, 4)}`); } return __toCommonJS(java_lsp_client_exports); })(); -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvY29tbW9uL2lzLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlcy5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vbGlua2VkTWFwLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9kaXNwb3NhYmxlLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9yYWwuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvY29tbW9uL2V2ZW50cy5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vY2FuY2VsbGF0aW9uLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9zaGFyZWRBcnJheUNhbmNlbGxhdGlvbi5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vc2VtYXBob3JlLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlUmVhZGVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlV3JpdGVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlQnVmZmVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9jb25uZWN0aW9uLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9hcGkuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvYnJvd3Nlci9yaWwuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvYnJvd3Nlci9tYWluLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvYnJvd3Nlci5qcyIsICJsc3AvamF2YS1sc3AtY2xpZW50LnRzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLXdzLWpzb25ycGMvc3JjL2Rpc3Bvc2FibGUudHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvc29ja2V0L3NvY2tldC50cyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS13cy1qc29ucnBjL3NyYy9zb2NrZXQvcmVhZGVyLnRzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLXdzLWpzb25ycGMvc3JjL3NvY2tldC93cml0ZXIudHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvc29ja2V0L2Nvbm5lY3Rpb24udHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvY29ubmVjdGlvbi50cyIsICJsc3AvbW9uYWNvLXNoaW0udHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtbGFuZ3VhZ2VzZXJ2ZXItdHlwZXMvbGliL2VzbS9tYWluLmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuc3RyaW5nQXJyYXkgPSBleHBvcnRzLmFycmF5ID0gZXhwb3J0cy5mdW5jID0gZXhwb3J0cy5lcnJvciA9IGV4cG9ydHMubnVtYmVyID0gZXhwb3J0cy5zdHJpbmcgPSBleHBvcnRzLmJvb2xlYW4gPSB2b2lkIDA7XG5mdW5jdGlvbiBib29sZWFuKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZTtcbn1cbmV4cG9ydHMuYm9vbGVhbiA9IGJvb2xlYW47XG5mdW5jdGlvbiBzdHJpbmcodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZztcbn1cbmV4cG9ydHMuc3RyaW5nID0gc3RyaW5nO1xuZnVuY3Rpb24gbnVtYmVyKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdmFsdWUgaW5zdGFuY2VvZiBOdW1iZXI7XG59XG5leHBvcnRzLm51bWJlciA9IG51bWJlcjtcbmZ1bmN0aW9uIGVycm9yKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgRXJyb3I7XG59XG5leHBvcnRzLmVycm9yID0gZXJyb3I7XG5mdW5jdGlvbiBmdW5jKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cbmV4cG9ydHMuZnVuYyA9IGZ1bmM7XG5mdW5jdGlvbiBhcnJheSh2YWx1ZSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cbmV4cG9ydHMuYXJyYXkgPSBhcnJheTtcbmZ1bmN0aW9uIHN0cmluZ0FycmF5KHZhbHVlKSB7XG4gICAgcmV0dXJuIGFycmF5KHZhbHVlKSAmJiB2YWx1ZS5ldmVyeShlbGVtID0+IHN0cmluZyhlbGVtKSk7XG59XG5leHBvcnRzLnN0cmluZ0FycmF5ID0gc3RyaW5nQXJyYXk7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLk1lc3NhZ2UgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU5ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlOCA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTcgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU2ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNSA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTQgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUzID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMiA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTEgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUwID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTkgPSBleHBvcnRzLlJlcXVlc3RUeXBlOCA9IGV4cG9ydHMuUmVxdWVzdFR5cGU3ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTYgPSBleHBvcnRzLlJlcXVlc3RUeXBlNSA9IGV4cG9ydHMuUmVxdWVzdFR5cGU0ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTMgPSBleHBvcnRzLlJlcXVlc3RUeXBlMiA9IGV4cG9ydHMuUmVxdWVzdFR5cGUxID0gZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IGV4cG9ydHMuUmVxdWVzdFR5cGUwID0gZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUgPSBleHBvcnRzLlBhcmFtZXRlclN0cnVjdHVyZXMgPSBleHBvcnRzLlJlc3BvbnNlRXJyb3IgPSBleHBvcnRzLkVycm9yQ29kZXMgPSB2b2lkIDA7XG5jb25zdCBpcyA9IHJlcXVpcmUoXCIuL2lzXCIpO1xuLyoqXG4gKiBQcmVkZWZpbmVkIGVycm9yIGNvZGVzLlxuICovXG52YXIgRXJyb3JDb2RlcztcbihmdW5jdGlvbiAoRXJyb3JDb2Rlcykge1xuICAgIC8vIERlZmluZWQgYnkgSlNPTiBSUENcbiAgICBFcnJvckNvZGVzLlBhcnNlRXJyb3IgPSAtMzI3MDA7XG4gICAgRXJyb3JDb2Rlcy5JbnZhbGlkUmVxdWVzdCA9IC0zMjYwMDtcbiAgICBFcnJvckNvZGVzLk1ldGhvZE5vdEZvdW5kID0gLTMyNjAxO1xuICAgIEVycm9yQ29kZXMuSW52YWxpZFBhcmFtcyA9IC0zMjYwMjtcbiAgICBFcnJvckNvZGVzLkludGVybmFsRXJyb3IgPSAtMzI2MDM7XG4gICAgLyoqXG4gICAgICogVGhpcyBpcyB0aGUgc3RhcnQgcmFuZ2Ugb2YgSlNPTiBSUEMgcmVzZXJ2ZWQgZXJyb3IgY29kZXMuXG4gICAgICogSXQgZG9lc24ndCBkZW5vdGUgYSByZWFsIGVycm9yIGNvZGUuIE5vIGFwcGxpY2F0aW9uIGVycm9yIGNvZGVzIHNob3VsZFxuICAgICAqIGJlIGRlZmluZWQgYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCByYW5nZS4gRm9yIGJhY2t3YXJkc1xuICAgICAqIGNvbXBhdGliaWxpdHkgdGhlIGBTZXJ2ZXJOb3RJbml0aWFsaXplZGAgYW5kIHRoZSBgVW5rbm93bkVycm9yQ29kZWBcbiAgICAgKiBhcmUgbGVmdCBpbiB0aGUgcmFuZ2UuXG4gICAgICpcbiAgICAgKiBAc2luY2UgMy4xNi4wXG4gICAgKi9cbiAgICBFcnJvckNvZGVzLmpzb25ycGNSZXNlcnZlZEVycm9yUmFuZ2VTdGFydCA9IC0zMjA5OTtcbiAgICAvKiogQGRlcHJlY2F0ZWQgdXNlICBqc29ucnBjUmVzZXJ2ZWRFcnJvclJhbmdlU3RhcnQgKi9cbiAgICBFcnJvckNvZGVzLnNlcnZlckVycm9yU3RhcnQgPSAtMzIwOTk7XG4gICAgLyoqXG4gICAgICogQW4gZXJyb3Igb2NjdXJyZWQgd2hlbiB3cml0ZSBhIG1lc3NhZ2UgdG8gdGhlIHRyYW5zcG9ydCBsYXllci5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLk1lc3NhZ2VXcml0ZUVycm9yID0gLTMyMDk5O1xuICAgIC8qKlxuICAgICAqIEFuIGVycm9yIG9jY3VycmVkIHdoZW4gcmVhZGluZyBhIG1lc3NhZ2UgZnJvbSB0aGUgdHJhbnNwb3J0IGxheWVyLlxuICAgICAqL1xuICAgIEVycm9yQ29kZXMuTWVzc2FnZVJlYWRFcnJvciA9IC0zMjA5ODtcbiAgICAvKipcbiAgICAgKiBUaGUgY29ubmVjdGlvbiBnb3QgZGlzcG9zZWQgb3IgbG9zdCBhbmQgYWxsIHBlbmRpbmcgcmVzcG9uc2VzIGdvdFxuICAgICAqIHJlamVjdGVkLlxuICAgICAqL1xuICAgIEVycm9yQ29kZXMuUGVuZGluZ1Jlc3BvbnNlUmVqZWN0ZWQgPSAtMzIwOTc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gaXMgaW5hY3RpdmUgYW5kIGEgdXNlIG9mIGl0IGZhaWxlZC5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLkNvbm5lY3Rpb25JbmFjdGl2ZSA9IC0zMjA5NjtcbiAgICAvKipcbiAgICAgKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBhIHNlcnZlciByZWNlaXZlZCBhIG5vdGlmaWNhdGlvbiBvclxuICAgICAqIHJlcXVlc3QgYmVmb3JlIHRoZSBzZXJ2ZXIgaGFzIHJlY2VpdmVkIHRoZSBgaW5pdGlhbGl6ZWAgcmVxdWVzdC5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLlNlcnZlck5vdEluaXRpYWxpemVkID0gLTMyMDAyO1xuICAgIEVycm9yQ29kZXMuVW5rbm93bkVycm9yQ29kZSA9IC0zMjAwMTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIHRoZSBlbmQgcmFuZ2Ugb2YgSlNPTiBSUEMgcmVzZXJ2ZWQgZXJyb3IgY29kZXMuXG4gICAgICogSXQgZG9lc24ndCBkZW5vdGUgYSByZWFsIGVycm9yIGNvZGUuXG4gICAgICpcbiAgICAgKiBAc2luY2UgMy4xNi4wXG4gICAgKi9cbiAgICBFcnJvckNvZGVzLmpzb25ycGNSZXNlcnZlZEVycm9yUmFuZ2VFbmQgPSAtMzIwMDA7XG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSAganNvbnJwY1Jlc2VydmVkRXJyb3JSYW5nZUVuZCAqL1xuICAgIEVycm9yQ29kZXMuc2VydmVyRXJyb3JFbmQgPSAtMzIwMDA7XG59KShFcnJvckNvZGVzIHx8IChleHBvcnRzLkVycm9yQ29kZXMgPSBFcnJvckNvZGVzID0ge30pKTtcbi8qKlxuICogQW4gZXJyb3Igb2JqZWN0IHJldHVybiBpbiBhIHJlc3BvbnNlIGluIGNhc2UgYSByZXF1ZXN0XG4gKiBoYXMgZmFpbGVkLlxuICovXG5jbGFzcyBSZXNwb25zZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNvZGUsIG1lc3NhZ2UsIGRhdGEpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuY29kZSA9IGlzLm51bWJlcihjb2RlKSA/IGNvZGUgOiBFcnJvckNvZGVzLlVua25vd25FcnJvckNvZGU7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBSZXNwb25zZUVycm9yLnByb3RvdHlwZSk7XG4gICAgfVxuICAgIHRvSnNvbigpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgY29kZTogdGhpcy5jb2RlLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLmRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmRhdGEgPSB0aGlzLmRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5leHBvcnRzLlJlc3BvbnNlRXJyb3IgPSBSZXNwb25zZUVycm9yO1xuY2xhc3MgUGFyYW1ldGVyU3RydWN0dXJlcyB7XG4gICAgY29uc3RydWN0b3Ioa2luZCkge1xuICAgICAgICB0aGlzLmtpbmQgPSBraW5kO1xuICAgIH1cbiAgICBzdGF0aWMgaXModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8gfHwgdmFsdWUgPT09IFBhcmFtZXRlclN0cnVjdHVyZXMuYnlOYW1lIHx8IHZhbHVlID09PSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5UG9zaXRpb247XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5raW5kO1xuICAgIH1cbn1cbmV4cG9ydHMuUGFyYW1ldGVyU3RydWN0dXJlcyA9IFBhcmFtZXRlclN0cnVjdHVyZXM7XG4vKipcbiAqIFRoZSBwYXJhbWV0ZXIgc3RydWN0dXJlIGlzIGF1dG9tYXRpY2FsbHkgaW5mZXJyZWQgb24gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzXG4gKiBhbmQgdGhlIHBhcmFtZXRlciB0eXBlIGluIGNhc2Ugb2YgYSBzaW5nbGUgcGFyYW0uXG4gKi9cblBhcmFtZXRlclN0cnVjdHVyZXMuYXV0byA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdhdXRvJyk7XG4vKipcbiAqIEZvcmNlcyBgYnlQb3NpdGlvbmAgcGFyYW1ldGVyIHN0cnVjdHVyZS4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGhhdmUgYSBzaW5nbGVcbiAqIHBhcmFtZXRlciB3aGljaCBoYXMgYSBsaXRlcmFsIHR5cGUuXG4gKi9cblBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbiA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdieVBvc2l0aW9uJyk7XG4vKipcbiAqIEZvcmNlcyBgYnlOYW1lYCBwYXJhbWV0ZXIgc3RydWN0dXJlLiBUaGlzIGlzIG9ubHkgdXNlZnVsIHdoZW4gaGF2aW5nIGEgc2luZ2xlXG4gKiBwYXJhbWV0ZXIuIFRoZSBsaWJyYXJ5IHdpbGwgcmVwb3J0IGVycm9ycyBpZiB1c2VkIHdpdGggYSBkaWZmZXJlbnQgbnVtYmVyIG9mXG4gKiBwYXJhbWV0ZXJzLlxuICovXG5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdieU5hbWUnKTtcbi8qKlxuICogQW4gYWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgYSBNZXNzYWdlVHlwZS5cbiAqL1xuY2xhc3MgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIG51bWJlck9mUGFyYW1zKSB7XG4gICAgICAgIHRoaXMubWV0aG9kID0gbWV0aG9kO1xuICAgICAgICB0aGlzLm51bWJlck9mUGFyYW1zID0gbnVtYmVyT2ZQYXJhbXM7XG4gICAgfVxuICAgIGdldCBwYXJhbWV0ZXJTdHJ1Y3R1cmVzKCkge1xuICAgICAgICByZXR1cm4gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvO1xuICAgIH1cbn1cbmV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlID0gQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlO1xuLyoqXG4gKiBDbGFzc2VzIHRvIHR5cGUgcmVxdWVzdCByZXNwb25zZSBwYWlyc1xuICovXG5jbGFzcyBSZXF1ZXN0VHlwZTAgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDApO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGUwID0gUmVxdWVzdFR5cGUwO1xuY2xhc3MgUmVxdWVzdFR5cGUgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCwgX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8pIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAxKTtcbiAgICAgICAgdGhpcy5fcGFyYW1ldGVyU3RydWN0dXJlcyA9IF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbiAgICBnZXQgcGFyYW1ldGVyU3RydWN0dXJlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXM7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IFJlcXVlc3RUeXBlO1xuY2xhc3MgUmVxdWVzdFR5cGUxIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMSk7XG4gICAgICAgIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBfcGFyYW1ldGVyU3RydWN0dXJlcztcbiAgICB9XG4gICAgZ2V0IHBhcmFtZXRlclN0cnVjdHVyZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGUxID0gUmVxdWVzdFR5cGUxO1xuY2xhc3MgUmVxdWVzdFR5cGUyIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAyKTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlMiA9IFJlcXVlc3RUeXBlMjtcbmNsYXNzIFJlcXVlc3RUeXBlMyBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMyk7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTMgPSBSZXF1ZXN0VHlwZTM7XG5jbGFzcyBSZXF1ZXN0VHlwZTQgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDQpO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGU0ID0gUmVxdWVzdFR5cGU0O1xuY2xhc3MgUmVxdWVzdFR5cGU1IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA1KTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlNSA9IFJlcXVlc3RUeXBlNTtcbmNsYXNzIFJlcXVlc3RUeXBlNiBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNik7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTYgPSBSZXF1ZXN0VHlwZTY7XG5jbGFzcyBSZXF1ZXN0VHlwZTcgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDcpO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGU3ID0gUmVxdWVzdFR5cGU3O1xuY2xhc3MgUmVxdWVzdFR5cGU4IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA4KTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlOCA9IFJlcXVlc3RUeXBlODtcbmNsYXNzIFJlcXVlc3RUeXBlOSBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgOSk7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTkgPSBSZXF1ZXN0VHlwZTk7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMSk7XG4gICAgICAgIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBfcGFyYW1ldGVyU3RydWN0dXJlcztcbiAgICB9XG4gICAgZ2V0IHBhcmFtZXRlclN0cnVjdHVyZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZSA9IE5vdGlmaWNhdGlvblR5cGU7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlMCBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMCk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMCA9IE5vdGlmaWNhdGlvblR5cGUwO1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTEgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCwgX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8pIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAxKTtcbiAgICAgICAgdGhpcy5fcGFyYW1ldGVyU3RydWN0dXJlcyA9IF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbiAgICBnZXQgcGFyYW1ldGVyU3RydWN0dXJlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXM7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMSA9IE5vdGlmaWNhdGlvblR5cGUxO1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDIpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTIgPSBOb3RpZmljYXRpb25UeXBlMjtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGUzIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAzKTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGUzID0gTm90aWZpY2F0aW9uVHlwZTM7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlNCBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNCk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNCA9IE5vdGlmaWNhdGlvblR5cGU0O1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTUgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDUpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTUgPSBOb3RpZmljYXRpb25UeXBlNTtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGU2IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA2KTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGU2ID0gTm90aWZpY2F0aW9uVHlwZTY7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlNyBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNyk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNyA9IE5vdGlmaWNhdGlvblR5cGU3O1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTggZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDgpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTggPSBOb3RpZmljYXRpb25UeXBlODtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGU5IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA5KTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGU5ID0gTm90aWZpY2F0aW9uVHlwZTk7XG52YXIgTWVzc2FnZTtcbihmdW5jdGlvbiAoTWVzc2FnZSkge1xuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoZSBnaXZlbiBtZXNzYWdlIGlzIGEgcmVxdWVzdCBtZXNzYWdlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gbWVzc2FnZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBpcy5zdHJpbmcoY2FuZGlkYXRlLm1ldGhvZCkgJiYgKGlzLnN0cmluZyhjYW5kaWRhdGUuaWQpIHx8IGlzLm51bWJlcihjYW5kaWRhdGUuaWQpKTtcbiAgICB9XG4gICAgTWVzc2FnZS5pc1JlcXVlc3QgPSBpc1JlcXVlc3Q7XG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhlIGdpdmVuIG1lc3NhZ2UgaXMgYSBub3RpZmljYXRpb24gbWVzc2FnZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTm90aWZpY2F0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gbWVzc2FnZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBpcy5zdHJpbmcoY2FuZGlkYXRlLm1ldGhvZCkgJiYgbWVzc2FnZS5pZCA9PT0gdm9pZCAwO1xuICAgIH1cbiAgICBNZXNzYWdlLmlzTm90aWZpY2F0aW9uID0gaXNOb3RpZmljYXRpb247XG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhlIGdpdmVuIG1lc3NhZ2UgaXMgYSByZXNwb25zZSBtZXNzYWdlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNSZXNwb25zZShtZXNzYWdlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IG1lc3NhZ2U7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgKGNhbmRpZGF0ZS5yZXN1bHQgIT09IHZvaWQgMCB8fCAhIWNhbmRpZGF0ZS5lcnJvcikgJiYgKGlzLnN0cmluZyhjYW5kaWRhdGUuaWQpIHx8IGlzLm51bWJlcihjYW5kaWRhdGUuaWQpIHx8IGNhbmRpZGF0ZS5pZCA9PT0gbnVsbCk7XG4gICAgfVxuICAgIE1lc3NhZ2UuaXNSZXNwb25zZSA9IGlzUmVzcG9uc2U7XG59KShNZXNzYWdlIHx8IChleHBvcnRzLk1lc3NhZ2UgPSBNZXNzYWdlID0ge30pKTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xudmFyIF9hO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5MUlVDYWNoZSA9IGV4cG9ydHMuTGlua2VkTWFwID0gZXhwb3J0cy5Ub3VjaCA9IHZvaWQgMDtcbnZhciBUb3VjaDtcbihmdW5jdGlvbiAoVG91Y2gpIHtcbiAgICBUb3VjaC5Ob25lID0gMDtcbiAgICBUb3VjaC5GaXJzdCA9IDE7XG4gICAgVG91Y2guQXNPbGQgPSBUb3VjaC5GaXJzdDtcbiAgICBUb3VjaC5MYXN0ID0gMjtcbiAgICBUb3VjaC5Bc05ldyA9IFRvdWNoLkxhc3Q7XG59KShUb3VjaCB8fCAoZXhwb3J0cy5Ub3VjaCA9IFRvdWNoID0ge30pKTtcbmNsYXNzIExpbmtlZE1hcCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXNbX2FdID0gJ0xpbmtlZE1hcCc7XG4gICAgICAgIHRoaXMuX21hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5faGVhZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fdGFpbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IDA7XG4gICAgICAgIHRoaXMuX3N0YXRlID0gMDtcbiAgICB9XG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuX21hcC5jbGVhcigpO1xuICAgICAgICB0aGlzLl9oZWFkID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl90YWlsID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9zaXplID0gMDtcbiAgICAgICAgdGhpcy5fc3RhdGUrKztcbiAgICB9XG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLl9oZWFkICYmICF0aGlzLl90YWlsO1xuICAgIH1cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpemU7XG4gICAgfVxuICAgIGdldCBmaXJzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlYWQ/LnZhbHVlO1xuICAgIH1cbiAgICBnZXQgbGFzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhaWw/LnZhbHVlO1xuICAgIH1cbiAgICBoYXMoa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXAuaGFzKGtleSk7XG4gICAgfVxuICAgIGdldChrZXksIHRvdWNoID0gVG91Y2guTm9uZSkge1xuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5fbWFwLmdldChrZXkpO1xuICAgICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRvdWNoICE9PSBUb3VjaC5Ob25lKSB7XG4gICAgICAgICAgICB0aGlzLnRvdWNoKGl0ZW0sIHRvdWNoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICB9XG4gICAgc2V0KGtleSwgdmFsdWUsIHRvdWNoID0gVG91Y2guTm9uZSkge1xuICAgICAgICBsZXQgaXRlbSA9IHRoaXMuX21hcC5nZXQoa2V5KTtcbiAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgIGl0ZW0udmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIGlmICh0b3VjaCAhPT0gVG91Y2guTm9uZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudG91Y2goaXRlbSwgdG91Y2gpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaXRlbSA9IHsga2V5LCB2YWx1ZSwgbmV4dDogdW5kZWZpbmVkLCBwcmV2aW91czogdW5kZWZpbmVkIH07XG4gICAgICAgICAgICBzd2l0Y2ggKHRvdWNoKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBUb3VjaC5Ob25lOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFRvdWNoLkZpcnN0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1GaXJzdChpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBUb3VjaC5MYXN0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX21hcC5zZXQoa2V5LCBpdGVtKTtcbiAgICAgICAgICAgIHRoaXMuX3NpemUrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGVsZXRlKGtleSkge1xuICAgICAgICByZXR1cm4gISF0aGlzLnJlbW92ZShrZXkpO1xuICAgIH1cbiAgICByZW1vdmUoa2V5KSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl9tYXAuZ2V0KGtleSk7XG4gICAgICAgIGlmICghaXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tYXAuZGVsZXRlKGtleSk7XG4gICAgICAgIHRoaXMucmVtb3ZlSXRlbShpdGVtKTtcbiAgICAgICAgdGhpcy5fc2l6ZS0tO1xuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICB9XG4gICAgc2hpZnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5faGVhZCAmJiAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2hlYWQgfHwgIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIHRoaXMuX21hcC5kZWxldGUoaXRlbS5rZXkpO1xuICAgICAgICB0aGlzLnJlbW92ZUl0ZW0oaXRlbSk7XG4gICAgICAgIHRoaXMuX3NpemUtLTtcbiAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7XG4gICAgfVxuICAgIGZvckVhY2goY2FsbGJhY2tmbiwgdGhpc0FyZykge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3N0YXRlO1xuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICAgICAgICBpZiAodGhpc0FyZykge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrZm4uYmluZCh0aGlzQXJnKShjdXJyZW50LnZhbHVlLCBjdXJyZW50LmtleSwgdGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFja2ZuKGN1cnJlbnQudmFsdWUsIGN1cnJlbnQua2V5LCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gc3RhdGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExpbmtlZE1hcCBnb3QgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAga2V5cygpIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9zdGF0ZTtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLl9oZWFkO1xuICAgICAgICBjb25zdCBpdGVyYXRvciA9IHtcbiAgICAgICAgICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fc3RhdGUgIT09IHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTGlua2VkTWFwIGdvdCBtb2RpZmllZCBkdXJpbmcgaXRlcmF0aW9uLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7IHZhbHVlOiBjdXJyZW50LmtleSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICB9XG4gICAgdmFsdWVzKCkge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3N0YXRlO1xuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIGNvbnN0IGl0ZXJhdG9yID0ge1xuICAgICAgICAgICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlcmF0b3I7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBMaW5rZWRNYXAgZ290IG1vZGlmaWVkIGR1cmluZyBpdGVyYXRpb24uYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHsgdmFsdWU6IGN1cnJlbnQudmFsdWUsIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gaXRlcmF0b3I7XG4gICAgfVxuICAgIGVudHJpZXMoKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5fc3RhdGU7XG4gICAgICAgIGxldCBjdXJyZW50ID0gdGhpcy5faGVhZDtcbiAgICAgICAgY29uc3QgaXRlcmF0b3IgPSB7XG4gICAgICAgICAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3N0YXRlICE9PSBzdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExpbmtlZE1hcCBnb3QgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geyB2YWx1ZTogW2N1cnJlbnQua2V5LCBjdXJyZW50LnZhbHVlXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICB9XG4gICAgWyhfYSA9IFN5bWJvbC50b1N0cmluZ1RhZywgU3ltYm9sLml0ZXJhdG9yKV0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMoKTtcbiAgICB9XG4gICAgdHJpbU9sZChuZXdTaXplKSB7XG4gICAgICAgIGlmIChuZXdTaXplID49IHRoaXMuc2l6ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuZXdTaXplID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLl9oZWFkO1xuICAgICAgICBsZXQgY3VycmVudFNpemUgPSB0aGlzLnNpemU7XG4gICAgICAgIHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnRTaXplID4gbmV3U2l6ZSkge1xuICAgICAgICAgICAgdGhpcy5fbWFwLmRlbGV0ZShjdXJyZW50LmtleSk7XG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0O1xuICAgICAgICAgICAgY3VycmVudFNpemUtLTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9oZWFkID0gY3VycmVudDtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IGN1cnJlbnRTaXplO1xuICAgICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICAgICAgY3VycmVudC5wcmV2aW91cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgIH1cbiAgICBhZGRJdGVtRmlyc3QoaXRlbSkge1xuICAgICAgICAvLyBGaXJzdCB0aW1lIEluc2VydFxuICAgICAgICBpZiAoIXRoaXMuX2hlYWQgJiYgIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRoaXMuX3RhaWwgPSBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCF0aGlzLl9oZWFkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbGlzdCcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdGhpcy5faGVhZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQucHJldmlvdXMgPSBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2hlYWQgPSBpdGVtO1xuICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgIH1cbiAgICBhZGRJdGVtTGFzdChpdGVtKSB7XG4gICAgICAgIC8vIEZpcnN0IHRpbWUgSW5zZXJ0XG4gICAgICAgIGlmICghdGhpcy5faGVhZCAmJiAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgdGhpcy5faGVhZCA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpdGVtLnByZXZpb3VzID0gdGhpcy5fdGFpbDtcbiAgICAgICAgICAgIHRoaXMuX3RhaWwubmV4dCA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW07XG4gICAgICAgIHRoaXMuX3N0YXRlKys7XG4gICAgfVxuICAgIHJlbW92ZUl0ZW0oaXRlbSkge1xuICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCAmJiBpdGVtID09PSB0aGlzLl90YWlsKSB7XG4gICAgICAgICAgICB0aGlzLl9oZWFkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpdGVtID09PSB0aGlzLl9oZWFkKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGNhbiBvbmx5IGhhcHBlbmVkIGlmIHNpemUgPT09IDEgd2hpY2ggaXMgaGFuZGxlXG4gICAgICAgICAgICAvLyBieSB0aGUgY2FzZSBhYm92ZS5cbiAgICAgICAgICAgIGlmICghaXRlbS5uZXh0KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxpc3QnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGl0ZW0ubmV4dC5wcmV2aW91cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQgPSBpdGVtLm5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXRlbSA9PT0gdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgLy8gVGhpcyBjYW4gb25seSBoYXBwZW5lZCBpZiBzaXplID09PSAxIHdoaWNoIGlzIGhhbmRsZVxuICAgICAgICAgICAgLy8gYnkgdGhlIGNhc2UgYWJvdmUuXG4gICAgICAgICAgICBpZiAoIWl0ZW0ucHJldmlvdXMpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbGlzdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbS5wcmV2aW91cy5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gaXRlbS5uZXh0O1xuICAgICAgICAgICAgY29uc3QgcHJldmlvdXMgPSBpdGVtLnByZXZpb3VzO1xuICAgICAgICAgICAgaWYgKCFuZXh0IHx8ICFwcmV2aW91cykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXh0LnByZXZpb3VzID0gcHJldmlvdXM7XG4gICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gbmV4dDtcbiAgICAgICAgfVxuICAgICAgICBpdGVtLm5leHQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGl0ZW0ucHJldmlvdXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX3N0YXRlKys7XG4gICAgfVxuICAgIHRvdWNoKGl0ZW0sIHRvdWNoKSB7XG4gICAgICAgIGlmICghdGhpcy5faGVhZCB8fCAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxpc3QnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHRvdWNoICE9PSBUb3VjaC5GaXJzdCAmJiB0b3VjaCAhPT0gVG91Y2guTGFzdCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG91Y2ggPT09IFRvdWNoLkZpcnN0KSB7XG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBpdGVtLm5leHQ7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgICAgICAvLyBVbmxpbmsgdGhlIGl0ZW1cbiAgICAgICAgICAgIGlmIChpdGVtID09PSB0aGlzLl90YWlsKSB7XG4gICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgbXVzdCBiZSBkZWZpbmVkIHNpbmNlIGl0ZW0gd2FzIG5vdCBoZWFkIGJ1dCBpcyB0YWlsXG4gICAgICAgICAgICAgICAgLy8gU28gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbiBpdGVtIGluIHRoZSBtYXBcbiAgICAgICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuX3RhaWwgPSBwcmV2aW91cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEJvdGggbmV4dCBhbmQgcHJldmlvdXMgYXJlIG5vdCB1bmRlZmluZWQgc2luY2UgaXRlbSB3YXMgbmVpdGhlciBoZWFkIG5vciB0YWlsLlxuICAgICAgICAgICAgICAgIG5leHQucHJldmlvdXMgPSBwcmV2aW91cztcbiAgICAgICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEluc2VydCB0aGUgbm9kZSBhdCBoZWFkXG4gICAgICAgICAgICBpdGVtLnByZXZpb3VzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdGhpcy5faGVhZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQucHJldmlvdXMgPSBpdGVtO1xuICAgICAgICAgICAgdGhpcy5faGVhZCA9IGl0ZW07XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRvdWNoID09PSBUb3VjaC5MYXN0KSB7XG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBpdGVtLm5leHQ7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgICAgICAvLyBVbmxpbmsgdGhlIGl0ZW0uXG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCkge1xuICAgICAgICAgICAgICAgIC8vIG5leHQgbXVzdCBiZSBkZWZpbmVkIHNpbmNlIGl0ZW0gd2FzIG5vdCB0YWlsIGJ1dCBpcyBoZWFkXG4gICAgICAgICAgICAgICAgLy8gU28gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbiBpdGVtIGluIHRoZSBtYXBcbiAgICAgICAgICAgICAgICBuZXh0LnByZXZpb3VzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuX2hlYWQgPSBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQm90aCBuZXh0IGFuZCBwcmV2aW91cyBhcmUgbm90IHVuZGVmaW5lZCBzaW5jZSBpdGVtIHdhcyBuZWl0aGVyIGhlYWQgbm9yIHRhaWwuXG4gICAgICAgICAgICAgICAgbmV4dC5wcmV2aW91cyA9IHByZXZpb3VzO1xuICAgICAgICAgICAgICAgIHByZXZpb3VzLm5leHQgPSBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaXRlbS5wcmV2aW91cyA9IHRoaXMuX3RhaWw7XG4gICAgICAgICAgICB0aGlzLl90YWlsLm5leHQgPSBpdGVtO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW07XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IFtdO1xuICAgICAgICB0aGlzLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGRhdGEucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGZyb21KU09OKGRhdGEpIHtcbiAgICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBkYXRhKSB7XG4gICAgICAgICAgICB0aGlzLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuTGlua2VkTWFwID0gTGlua2VkTWFwO1xuY2xhc3MgTFJVQ2FjaGUgZXh0ZW5kcyBMaW5rZWRNYXAge1xuICAgIGNvbnN0cnVjdG9yKGxpbWl0LCByYXRpbyA9IDEpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fbGltaXQgPSBsaW1pdDtcbiAgICAgICAgdGhpcy5fcmF0aW8gPSBNYXRoLm1pbihNYXRoLm1heCgwLCByYXRpbyksIDEpO1xuICAgIH1cbiAgICBnZXQgbGltaXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9saW1pdDtcbiAgICB9XG4gICAgc2V0IGxpbWl0KGxpbWl0KSB7XG4gICAgICAgIHRoaXMuX2xpbWl0ID0gbGltaXQ7XG4gICAgICAgIHRoaXMuY2hlY2tUcmltKCk7XG4gICAgfVxuICAgIGdldCByYXRpbygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JhdGlvO1xuICAgIH1cbiAgICBzZXQgcmF0aW8ocmF0aW8pIHtcbiAgICAgICAgdGhpcy5fcmF0aW8gPSBNYXRoLm1pbihNYXRoLm1heCgwLCByYXRpbyksIDEpO1xuICAgICAgICB0aGlzLmNoZWNrVHJpbSgpO1xuICAgIH1cbiAgICBnZXQoa2V5LCB0b3VjaCA9IFRvdWNoLkFzTmV3KSB7XG4gICAgICAgIHJldHVybiBzdXBlci5nZXQoa2V5LCB0b3VjaCk7XG4gICAgfVxuICAgIHBlZWsoa2V5KSB7XG4gICAgICAgIHJldHVybiBzdXBlci5nZXQoa2V5LCBUb3VjaC5Ob25lKTtcbiAgICB9XG4gICAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgc3VwZXIuc2V0KGtleSwgdmFsdWUsIFRvdWNoLkxhc3QpO1xuICAgICAgICB0aGlzLmNoZWNrVHJpbSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgY2hlY2tUcmltKCkge1xuICAgICAgICBpZiAodGhpcy5zaXplID4gdGhpcy5fbGltaXQpIHtcbiAgICAgICAgICAgIHRoaXMudHJpbU9sZChNYXRoLnJvdW5kKHRoaXMuX2xpbWl0ICogdGhpcy5fcmF0aW8pKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuTFJVQ2FjaGUgPSBMUlVDYWNoZTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5EaXNwb3NhYmxlID0gdm9pZCAwO1xudmFyIERpc3Bvc2FibGU7XG4oZnVuY3Rpb24gKERpc3Bvc2FibGUpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUoZnVuYykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGlzcG9zZTogZnVuY1xuICAgICAgICB9O1xuICAgIH1cbiAgICBEaXNwb3NhYmxlLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKERpc3Bvc2FibGUgfHwgKGV4cG9ydHMuRGlzcG9zYWJsZSA9IERpc3Bvc2FibGUgPSB7fSkpO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xubGV0IF9yYWw7XG5mdW5jdGlvbiBSQUwoKSB7XG4gICAgaWYgKF9yYWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHJ1bnRpbWUgYWJzdHJhY3Rpb24gbGF5ZXIgaW5zdGFsbGVkYCk7XG4gICAgfVxuICAgIHJldHVybiBfcmFsO1xufVxuKGZ1bmN0aW9uIChSQUwpIHtcbiAgICBmdW5jdGlvbiBpbnN0YWxsKHJhbCkge1xuICAgICAgICBpZiAocmFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gcnVudGltZSBhYnN0cmFjdGlvbiBsYXllciBwcm92aWRlZGApO1xuICAgICAgICB9XG4gICAgICAgIF9yYWwgPSByYWw7XG4gICAgfVxuICAgIFJBTC5pbnN0YWxsID0gaW5zdGFsbDtcbn0pKFJBTCB8fCAoUkFMID0ge30pKTtcbmV4cG9ydHMuZGVmYXVsdCA9IFJBTDtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuRW1pdHRlciA9IGV4cG9ydHMuRXZlbnQgPSB2b2lkIDA7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbnZhciBFdmVudDtcbihmdW5jdGlvbiAoRXZlbnQpIHtcbiAgICBjb25zdCBfZGlzcG9zYWJsZSA9IHsgZGlzcG9zZSgpIHsgfSB9O1xuICAgIEV2ZW50Lk5vbmUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBfZGlzcG9zYWJsZTsgfTtcbn0pKEV2ZW50IHx8IChleHBvcnRzLkV2ZW50ID0gRXZlbnQgPSB7fSkpO1xuY2xhc3MgQ2FsbGJhY2tMaXN0IHtcbiAgICBhZGQoY2FsbGJhY2ssIGNvbnRleHQgPSBudWxsLCBidWNrZXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fY29udGV4dHMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgICAgIHRoaXMuX2NvbnRleHRzLnB1c2goY29udGV4dCk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGJ1Y2tldCkpIHtcbiAgICAgICAgICAgIGJ1Y2tldC5wdXNoKHsgZGlzcG9zZTogKCkgPT4gdGhpcy5yZW1vdmUoY2FsbGJhY2ssIGNvbnRleHQpIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlbW92ZShjYWxsYmFjaywgY29udGV4dCA9IG51bGwpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZm91bmRDYWxsYmFja1dpdGhEaWZmZXJlbnRDb250ZXh0ID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLl9jYWxsYmFja3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jYWxsYmFja3NbaV0gPT09IGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NvbnRleHRzW2ldID09PSBjb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrICYgY29udGV4dCBtYXRjaCA9PiByZW1vdmUgaXRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29udGV4dHMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZENhbGxiYWNrV2l0aERpZmZlcmVudENvbnRleHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZm91bmRDYWxsYmFja1dpdGhEaWZmZXJlbnRDb250ZXh0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1doZW4gYWRkaW5nIGEgbGlzdGVuZXIgd2l0aCBhIGNvbnRleHQsIHlvdSBzaG91bGQgcmVtb3ZlIGl0IHdpdGggdGhlIHNhbWUgY29udGV4dCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGludm9rZSguLi5hcmdzKSB7XG4gICAgICAgIGlmICghdGhpcy5fY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmV0ID0gW10sIGNhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcy5zbGljZSgwKSwgY29udGV4dHMgPSB0aGlzLl9jb250ZXh0cy5zbGljZSgwKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXQucHVzaChjYWxsYmFja3NbaV0uYXBwbHkoY29udGV4dHNbaV0sIGFyZ3MpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS5jb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICAgIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5fY2FsbGJhY2tzIHx8IHRoaXMuX2NhbGxiYWNrcy5sZW5ndGggPT09IDA7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fY29udGV4dHMgPSB1bmRlZmluZWQ7XG4gICAgfVxufVxuY2xhc3MgRW1pdHRlciB7XG4gICAgY29uc3RydWN0b3IoX29wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IF9vcHRpb25zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGb3IgdGhlIHB1YmxpYyB0byBhbGxvdyB0byBzdWJzY3JpYmVcbiAgICAgKiB0byBldmVudHMgZnJvbSB0aGlzIEVtaXR0ZXJcbiAgICAgKi9cbiAgICBnZXQgZXZlbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fZXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50ID0gKGxpc3RlbmVyLCB0aGlzQXJncywgZGlzcG9zYWJsZXMpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2NhbGxiYWNrcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWxsYmFja3MgPSBuZXcgQ2FsbGJhY2tMaXN0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMub25GaXJzdExpc3RlbmVyQWRkICYmIHRoaXMuX2NhbGxiYWNrcy5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy5vbkZpcnN0TGlzdGVuZXJBZGQodGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5hZGQobGlzdGVuZXIsIHRoaXNBcmdzKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlzcG9zYWJsZSBpcyBkaXNwb3NlZCBhZnRlciBlbWl0dGVyIGlzIGRpc3Bvc2VkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5yZW1vdmUobGlzdGVuZXIsIHRoaXNBcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5kaXNwb3NlID0gRW1pdHRlci5fbm9vcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMub25MYXN0TGlzdGVuZXJSZW1vdmUgJiYgdGhpcy5fY2FsbGJhY2tzLmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29wdGlvbnMub25MYXN0TGlzdGVuZXJSZW1vdmUodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRpc3Bvc2FibGVzKSkge1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlcy5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9ldmVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVG8gYmUga2VwdCBwcml2YXRlIHRvIGZpcmUgYW4gZXZlbnQgdG9cbiAgICAgKiBzdWJzY3JpYmVyc1xuICAgICAqL1xuICAgIGZpcmUoZXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NhbGxiYWNrcykge1xuICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzLmludm9rZS5jYWxsKHRoaXMuX2NhbGxiYWNrcywgZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5kaXNwb3NlKCk7XG4gICAgICAgICAgICB0aGlzLl9jYWxsYmFja3MgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLkVtaXR0ZXIgPSBFbWl0dGVyO1xuRW1pdHRlci5fbm9vcCA9IGZ1bmN0aW9uICgpIHsgfTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uVG9rZW4gPSB2b2lkIDA7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbmNvbnN0IElzID0gcmVxdWlyZShcIi4vaXNcIik7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCIuL2V2ZW50c1wiKTtcbnZhciBDYW5jZWxsYXRpb25Ub2tlbjtcbihmdW5jdGlvbiAoQ2FuY2VsbGF0aW9uVG9rZW4pIHtcbiAgICBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGlzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkOiBmYWxzZSxcbiAgICAgICAgb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6IGV2ZW50c18xLkV2ZW50Lk5vbmVcbiAgICB9KTtcbiAgICBDYW5jZWxsYXRpb25Ub2tlbi5DYW5jZWxsZWQgPSBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6IHRydWUsXG4gICAgICAgIG9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkOiBldmVudHNfMS5FdmVudC5Ob25lXG4gICAgfSk7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgKGNhbmRpZGF0ZSA9PT0gQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZVxuICAgICAgICAgICAgfHwgY2FuZGlkYXRlID09PSBDYW5jZWxsYXRpb25Ub2tlbi5DYW5jZWxsZWRcbiAgICAgICAgICAgIHx8IChJcy5ib29sZWFuKGNhbmRpZGF0ZS5pc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkgJiYgISFjYW5kaWRhdGUub25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQpKTtcbiAgICB9XG4gICAgQ2FuY2VsbGF0aW9uVG9rZW4uaXMgPSBpcztcbn0pKENhbmNlbGxhdGlvblRva2VuIHx8IChleHBvcnRzLkNhbmNlbGxhdGlvblRva2VuID0gQ2FuY2VsbGF0aW9uVG9rZW4gPSB7fSkpO1xuY29uc3Qgc2hvcnRjdXRFdmVudCA9IE9iamVjdC5mcmVlemUoZnVuY3Rpb24gKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgY29uc3QgaGFuZGxlID0gKDAsIHJhbF8xLmRlZmF1bHQpKCkudGltZXIuc2V0VGltZW91dChjYWxsYmFjay5iaW5kKGNvbnRleHQpLCAwKTtcbiAgICByZXR1cm4geyBkaXNwb3NlKCkgeyBoYW5kbGUuZGlzcG9zZSgpOyB9IH07XG59KTtcbmNsYXNzIE11dGFibGVUb2tlbiB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX2lzQ2FuY2VsbGVkID0gZmFsc2U7XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9pc0NhbmNlbGxlZCkge1xuICAgICAgICAgICAgdGhpcy5faXNDYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2VtaXR0ZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmZpcmUodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0NhbmNlbGxlZDtcbiAgICB9XG4gICAgZ2V0IG9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKCkge1xuICAgICAgICBpZiAodGhpcy5faXNDYW5jZWxsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBzaG9ydGN1dEV2ZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5fZW1pdHRlcikge1xuICAgICAgICAgICAgdGhpcy5fZW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2VtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLl9lbWl0dGVyKSB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5jbGFzcyBDYW5jZWxsYXRpb25Ub2tlblNvdXJjZSB7XG4gICAgZ2V0IHRva2VuKCkge1xuICAgICAgICBpZiAoIXRoaXMuX3Rva2VuKSB7XG4gICAgICAgICAgICAvLyBiZSBsYXp5IGFuZCBjcmVhdGUgdGhlIHRva2VuIG9ubHkgd2hlblxuICAgICAgICAgICAgLy8gYWN0dWFsbHkgbmVlZGVkXG4gICAgICAgICAgICB0aGlzLl90b2tlbiA9IG5ldyBNdXRhYmxlVG9rZW4oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fdG9rZW47XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl90b2tlbikge1xuICAgICAgICAgICAgLy8gc2F2ZSBhbiBvYmplY3QgYnkgcmV0dXJuaW5nIHRoZSBkZWZhdWx0XG4gICAgICAgICAgICAvLyBjYW5jZWxsZWQgdG9rZW4gd2hlbiBjYW5jZWxsYXRpb24gaGFwcGVuc1xuICAgICAgICAgICAgLy8gYmVmb3JlIHNvbWVvbmUgYXNrcyBmb3IgdGhlIHRva2VuXG4gICAgICAgICAgICB0aGlzLl90b2tlbiA9IENhbmNlbGxhdGlvblRva2VuLkNhbmNlbGxlZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3Rva2VuLmNhbmNlbCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICghdGhpcy5fdG9rZW4pIHtcbiAgICAgICAgICAgIC8vIGVuc3VyZSB0byBpbml0aWFsaXplIHdpdGggYW4gZW1wdHkgdG9rZW4gaWYgd2UgaGFkIG5vbmVcbiAgICAgICAgICAgIHRoaXMuX3Rva2VuID0gQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLl90b2tlbiBpbnN0YW5jZW9mIE11dGFibGVUb2tlbikge1xuICAgICAgICAgICAgLy8gYWN0dWFsbHkgZGlzcG9zZVxuICAgICAgICAgICAgdGhpcy5fdG9rZW4uZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IENhbmNlbGxhdGlvblRva2VuU291cmNlO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3kgPSB2b2lkIDA7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbnZhciBDYW5jZWxsYXRpb25TdGF0ZTtcbihmdW5jdGlvbiAoQ2FuY2VsbGF0aW9uU3RhdGUpIHtcbiAgICBDYW5jZWxsYXRpb25TdGF0ZS5Db250aW51ZSA9IDA7XG4gICAgQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkID0gMTtcbn0pKENhbmNlbGxhdGlvblN0YXRlIHx8IChDYW5jZWxsYXRpb25TdGF0ZSA9IHt9KSk7XG5jbGFzcyBTaGFyZWRBcnJheVNlbmRlclN0cmF0ZWd5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5idWZmZXJzID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICBlbmFibGVDYW5jZWxsYXRpb24ocmVxdWVzdCkge1xuICAgICAgICBpZiAocmVxdWVzdC5pZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBTaGFyZWRBcnJheUJ1ZmZlcig0KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBJbnQzMkFycmF5KGJ1ZmZlciwgMCwgMSk7XG4gICAgICAgIGRhdGFbMF0gPSBDYW5jZWxsYXRpb25TdGF0ZS5Db250aW51ZTtcbiAgICAgICAgdGhpcy5idWZmZXJzLnNldChyZXF1ZXN0LmlkLCBidWZmZXIpO1xuICAgICAgICByZXF1ZXN0LiRjYW5jZWxsYXRpb25EYXRhID0gYnVmZmVyO1xuICAgIH1cbiAgICBhc3luYyBzZW5kQ2FuY2VsbGF0aW9uKF9jb25uLCBpZCkge1xuICAgICAgICBjb25zdCBidWZmZXIgPSB0aGlzLmJ1ZmZlcnMuZ2V0KGlkKTtcbiAgICAgICAgaWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBJbnQzMkFycmF5KGJ1ZmZlciwgMCwgMSk7XG4gICAgICAgIEF0b21pY3Muc3RvcmUoZGF0YSwgMCwgQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkKTtcbiAgICB9XG4gICAgY2xlYW51cChpZCkge1xuICAgICAgICB0aGlzLmJ1ZmZlcnMuZGVsZXRlKGlkKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy5idWZmZXJzLmNsZWFyKCk7XG4gICAgfVxufVxuZXhwb3J0cy5TaGFyZWRBcnJheVNlbmRlclN0cmF0ZWd5ID0gU2hhcmVkQXJyYXlTZW5kZXJTdHJhdGVneTtcbmNsYXNzIFNoYXJlZEFycmF5QnVmZmVyQ2FuY2VsbGF0aW9uVG9rZW4ge1xuICAgIGNvbnN0cnVjdG9yKGJ1ZmZlcikge1xuICAgICAgICB0aGlzLmRhdGEgPSBuZXcgSW50MzJBcnJheShidWZmZXIsIDAsIDEpO1xuICAgIH1cbiAgICBnZXQgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHJldHVybiBBdG9taWNzLmxvYWQodGhpcy5kYXRhLCAwKSA9PT0gQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkO1xuICAgIH1cbiAgICBnZXQgb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuY2VsbGF0aW9uIG92ZXIgU2hhcmVkQXJyYXlCdWZmZXIgZG9lc24ndCBzdXBwb3J0IGNhbmNlbGxhdGlvbiBldmVudHNgKTtcbiAgICB9XG59XG5jbGFzcyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuU291cmNlIHtcbiAgICBjb25zdHJ1Y3RvcihidWZmZXIpIHtcbiAgICAgICAgdGhpcy50b2tlbiA9IG5ldyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuKGJ1ZmZlcik7XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICB9XG59XG5jbGFzcyBTaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmtpbmQgPSAncmVxdWVzdCc7XG4gICAgfVxuICAgIGNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKHJlcXVlc3QpIHtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gcmVxdWVzdC4kY2FuY2VsbGF0aW9uRGF0YTtcbiAgICAgICAgaWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuU291cmNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuU291cmNlKGJ1ZmZlcik7XG4gICAgfVxufVxuZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBTaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3k7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNlbWFwaG9yZSA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY2xhc3MgU2VtYXBob3JlIHtcbiAgICBjb25zdHJ1Y3RvcihjYXBhY2l0eSA9IDEpIHtcbiAgICAgICAgaWYgKGNhcGFjaXR5IDw9IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FwYWNpdHkgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NhcGFjaXR5ID0gY2FwYWNpdHk7XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IDA7XG4gICAgICAgIHRoaXMuX3dhaXRpbmcgPSBbXTtcbiAgICB9XG4gICAgbG9jayh0aHVuaykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fd2FpdGluZy5wdXNoKHsgdGh1bmssIHJlc29sdmUsIHJlamVjdCB9KTtcbiAgICAgICAgICAgIHRoaXMucnVuTmV4dCgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0IGFjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTtcbiAgICB9XG4gICAgcnVuTmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dhaXRpbmcubGVuZ3RoID09PSAwIHx8IHRoaXMuX2FjdGl2ZSA9PT0gdGhpcy5fY2FwYWNpdHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS50aW1lci5zZXRJbW1lZGlhdGUoKCkgPT4gdGhpcy5kb1J1bk5leHQoKSk7XG4gICAgfVxuICAgIGRvUnVuTmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dhaXRpbmcubGVuZ3RoID09PSAwIHx8IHRoaXMuX2FjdGl2ZSA9PT0gdGhpcy5fY2FwYWNpdHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5fd2FpdGluZy5zaGlmdCgpO1xuICAgICAgICB0aGlzLl9hY3RpdmUrKztcbiAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZSA+IHRoaXMuX2NhcGFjaXR5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRvIG1hbnkgdGh1bmtzIGFjdGl2ZWApO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXh0LnRodW5rKCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC50aGVuKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5yZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5OZXh0KCk7XG4gICAgICAgICAgICAgICAgfSwgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5yZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5OZXh0KCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICBuZXh0LnJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1bk5leHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgIG5leHQucmVqZWN0KGVycik7XG4gICAgICAgICAgICB0aGlzLnJ1bk5leHQoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuU2VtYXBob3JlID0gU2VtYXBob3JlO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXIgPSBleHBvcnRzLkFic3RyYWN0TWVzc2FnZVJlYWRlciA9IGV4cG9ydHMuTWVzc2FnZVJlYWRlciA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IGV2ZW50c18xID0gcmVxdWlyZShcIi4vZXZlbnRzXCIpO1xuY29uc3Qgc2VtYXBob3JlXzEgPSByZXF1aXJlKFwiLi9zZW1hcGhvcmVcIik7XG52YXIgTWVzc2FnZVJlYWRlcjtcbihmdW5jdGlvbiAoTWVzc2FnZVJlYWRlcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5saXN0ZW4pICYmIElzLmZ1bmMoY2FuZGlkYXRlLmRpc3Bvc2UpICYmXG4gICAgICAgICAgICBJcy5mdW5jKGNhbmRpZGF0ZS5vbkVycm9yKSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5vbkNsb3NlKSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5vblBhcnRpYWxNZXNzYWdlKTtcbiAgICB9XG4gICAgTWVzc2FnZVJlYWRlci5pcyA9IGlzO1xufSkoTWVzc2FnZVJlYWRlciB8fCAoZXhwb3J0cy5NZXNzYWdlUmVhZGVyID0gTWVzc2FnZVJlYWRlciA9IHt9KSk7XG5jbGFzcyBBYnN0cmFjdE1lc3NhZ2VSZWFkZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZUVtaXR0ZXIgPSBuZXcgZXZlbnRzXzEuRW1pdHRlcigpO1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlci5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgZ2V0IG9uRXJyb3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVycm9yRW1pdHRlci5ldmVudDtcbiAgICB9XG4gICAgZmlyZUVycm9yKGVycm9yKSB7XG4gICAgICAgIHRoaXMuZXJyb3JFbWl0dGVyLmZpcmUodGhpcy5hc0Vycm9yKGVycm9yKSk7XG4gICAgfVxuICAgIGdldCBvbkNsb3NlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9zZUVtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGZpcmVDbG9zZSgpIHtcbiAgICAgICAgdGhpcy5jbG9zZUVtaXR0ZXIuZmlyZSh1bmRlZmluZWQpO1xuICAgIH1cbiAgICBnZXQgb25QYXJ0aWFsTWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFydGlhbE1lc3NhZ2VFbWl0dGVyLmV2ZW50O1xuICAgIH1cbiAgICBmaXJlUGFydGlhbE1lc3NhZ2UoaW5mbykge1xuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlRW1pdHRlci5maXJlKGluZm8pO1xuICAgIH1cbiAgICBhc0Vycm9yKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKGBSZWFkZXIgcmVjZWl2ZWQgZXJyb3IuIFJlYXNvbjogJHtJcy5zdHJpbmcoZXJyb3IubWVzc2FnZSkgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24nfWApO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VSZWFkZXIgPSBBYnN0cmFjdE1lc3NhZ2VSZWFkZXI7XG52YXIgUmVzb2x2ZWRNZXNzYWdlUmVhZGVyT3B0aW9ucztcbihmdW5jdGlvbiAoUmVzb2x2ZWRNZXNzYWdlUmVhZGVyT3B0aW9ucykge1xuICAgIGZ1bmN0aW9uIGZyb21PcHRpb25zKG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IGNoYXJzZXQ7XG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIGxldCBjb250ZW50RGVjb2RlcjtcbiAgICAgICAgY29uc3QgY29udGVudERlY29kZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICBsZXQgY29udGVudFR5cGVEZWNvZGVyO1xuICAgICAgICBjb25zdCBjb250ZW50VHlwZURlY29kZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY2hhcnNldCA9IG9wdGlvbnMgPz8gJ3V0Zi04JztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNoYXJzZXQgPSBvcHRpb25zLmNoYXJzZXQgPz8gJ3V0Zi04JztcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnREZWNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50RGVjb2RlciA9IG9wdGlvbnMuY29udGVudERlY29kZXI7XG4gICAgICAgICAgICAgICAgY29udGVudERlY29kZXJzLnNldChjb250ZW50RGVjb2Rlci5uYW1lLCBjb250ZW50RGVjb2Rlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5jb250ZW50RGVjb2RlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGVjb2RlciBvZiBvcHRpb25zLmNvbnRlbnREZWNvZGVycykge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50RGVjb2RlcnMuc2V0KGRlY29kZXIubmFtZSwgZGVjb2Rlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuY29udGVudFR5cGVEZWNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXIgPSBvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcjtcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXJzLnNldChjb250ZW50VHlwZURlY29kZXIubmFtZSwgY29udGVudFR5cGVEZWNvZGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGVjb2RlciBvZiBvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGVEZWNvZGVycy5zZXQoZGVjb2Rlci5uYW1lLCBkZWNvZGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnRlbnRUeXBlRGVjb2RlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXIgPSAoMCwgcmFsXzEuZGVmYXVsdCkoKS5hcHBsaWNhdGlvbkpzb24uZGVjb2RlcjtcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlRGVjb2RlcnMuc2V0KGNvbnRlbnRUeXBlRGVjb2Rlci5uYW1lLCBjb250ZW50VHlwZURlY29kZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGNoYXJzZXQsIGNvbnRlbnREZWNvZGVyLCBjb250ZW50RGVjb2RlcnMsIGNvbnRlbnRUeXBlRGVjb2RlciwgY29udGVudFR5cGVEZWNvZGVycyB9O1xuICAgIH1cbiAgICBSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zLmZyb21PcHRpb25zID0gZnJvbU9wdGlvbnM7XG59KShSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zIHx8IChSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zID0ge30pKTtcbmNsYXNzIFJlYWRhYmxlU3RyZWFtTWVzc2FnZVJlYWRlciBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVJlYWRlciB7XG4gICAgY29uc3RydWN0b3IocmVhZGFibGUsIG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZSA9IHJlYWRhYmxlO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zLmZyb21PcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmJ1ZmZlciA9ICgwLCByYWxfMS5kZWZhdWx0KSgpLm1lc3NhZ2VCdWZmZXIuY3JlYXRlKHRoaXMub3B0aW9ucy5jaGFyc2V0KTtcbiAgICAgICAgdGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0ID0gMTAwMDA7XG4gICAgICAgIHRoaXMubmV4dE1lc3NhZ2VMZW5ndGggPSAtMTtcbiAgICAgICAgdGhpcy5tZXNzYWdlVG9rZW4gPSAwO1xuICAgICAgICB0aGlzLnJlYWRTZW1hcGhvcmUgPSBuZXcgc2VtYXBob3JlXzEuU2VtYXBob3JlKDEpO1xuICAgIH1cbiAgICBzZXQgcGFydGlhbE1lc3NhZ2VUaW1lb3V0KHRpbWVvdXQpIHtcbiAgICAgICAgdGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0ID0gdGltZW91dDtcbiAgICB9XG4gICAgZ2V0IHBhcnRpYWxNZXNzYWdlVGltZW91dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dDtcbiAgICB9XG4gICAgbGlzdGVuKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMubmV4dE1lc3NhZ2VMZW5ndGggPSAtMTtcbiAgICAgICAgdGhpcy5tZXNzYWdlVG9rZW4gPSAwO1xuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlVGltZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5yZWFkYWJsZS5vbkRhdGEoKGRhdGEpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25EYXRhKGRhdGEpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZS5vbkVycm9yKChlcnJvcikgPT4gdGhpcy5maXJlRXJyb3IoZXJyb3IpKTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZS5vbkNsb3NlKCgpID0+IHRoaXMuZmlyZUNsb3NlKCkpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBvbkRhdGEoZGF0YSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5idWZmZXIuYXBwZW5kKGRhdGEpO1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IHRoaXMuYnVmZmVyLnRyeVJlYWRIZWFkZXJzKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50TGVuZ3RoID0gaGVhZGVycy5nZXQoJ2NvbnRlbnQtbGVuZ3RoJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY29udGVudExlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IobmV3IEVycm9yKGBIZWFkZXIgbXVzdCBwcm92aWRlIGEgQ29udGVudC1MZW5ndGggcHJvcGVydHkuXFxuJHtKU09OLnN0cmluZ2lmeShPYmplY3QuZnJvbUVudHJpZXMoaGVhZGVycykpfWApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsZW5ndGggPSBwYXJzZUludChjb250ZW50TGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKGxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKG5ldyBFcnJvcihgQ29udGVudC1MZW5ndGggdmFsdWUgbXVzdCBiZSBhIG51bWJlci4gR290ICR7Y29udGVudExlbmd0aH1gKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IHRoaXMuYnVmZmVyLnRyeVJlYWRCb2R5KHRoaXMubmV4dE1lc3NhZ2VMZW5ndGgpO1xuICAgICAgICAgICAgICAgIGlmIChib2R5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLyoqIFdlIGhhdmVuJ3QgcmVjZWl2ZWQgdGhlIGZ1bGwgbWVzc2FnZSB5ZXQuICovXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0UGFydGlhbE1lc3NhZ2VUaW1lcigpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJQYXJ0aWFsTWVzc2FnZVRpbWVyKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9IC0xO1xuICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHdlIGNvbnZlcnQgb25lIHJlY2VpdmVkIG1lc3NhZ2UgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAgICAgLy8gb3RoZXIuIE90aGVyd2lzZSBpdCBjb3VsZCBoYXBwZW4gdGhhdCBhIGRlY29kaW5nIG9mIGEgc2Vjb25kXG4gICAgICAgICAgICAgICAgLy8gc21hbGxlciBtZXNzYWdlIGZpbmlzaGVkIGJlZm9yZSB0aGUgZGVjb2Rpbmcgb2YgYSBmaXJzdCBsYXJnZXJcbiAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIGFuZCB0aGVuIHdlIHdvdWxkIGRlbGl2ZXIgdGhlIHNlY29uZCBtZXNzYWdlIGZpcnN0LlxuICAgICAgICAgICAgICAgIHRoaXMucmVhZFNlbWFwaG9yZS5sb2NrKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnl0ZXMgPSB0aGlzLm9wdGlvbnMuY29udGVudERlY29kZXIgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBhd2FpdCB0aGlzLm9wdGlvbnMuY29udGVudERlY29kZXIuZGVjb2RlKGJvZHkpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGJvZHk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBhd2FpdCB0aGlzLm9wdGlvbnMuY29udGVudFR5cGVEZWNvZGVyLmRlY29kZShieXRlcywgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjayhtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNsZWFyUGFydGlhbE1lc3NhZ2VUaW1lcigpIHtcbiAgICAgICAgaWYgKHRoaXMucGFydGlhbE1lc3NhZ2VUaW1lcikge1xuICAgICAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZVRpbWVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRoaXMucGFydGlhbE1lc3NhZ2VUaW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRQYXJ0aWFsTWVzc2FnZVRpbWVyKCkge1xuICAgICAgICB0aGlzLmNsZWFyUGFydGlhbE1lc3NhZ2VUaW1lcigpO1xuICAgICAgICBpZiAodGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0IDw9IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlVGltZXIgPSAoMCwgcmFsXzEuZGVmYXVsdCkoKS50aW1lci5zZXRUaW1lb3V0KCh0b2tlbiwgdGltZW91dCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZVRpbWVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRva2VuID09PSB0aGlzLm1lc3NhZ2VUb2tlbikge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZVBhcnRpYWxNZXNzYWdlKHsgbWVzc2FnZVRva2VuOiB0b2tlbiwgd2FpdGluZ1RpbWU6IHRpbWVvdXQgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRQYXJ0aWFsTWVzc2FnZVRpbWVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dCwgdGhpcy5tZXNzYWdlVG9rZW4sIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dCk7XG4gICAgfVxufVxuZXhwb3J0cy5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXIgPSBSZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLldyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLkFic3RyYWN0TWVzc2FnZVdyaXRlciA9IGV4cG9ydHMuTWVzc2FnZVdyaXRlciA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IHNlbWFwaG9yZV8xID0gcmVxdWlyZShcIi4vc2VtYXBob3JlXCIpO1xuY29uc3QgZXZlbnRzXzEgPSByZXF1aXJlKFwiLi9ldmVudHNcIik7XG5jb25zdCBDb250ZW50TGVuZ3RoID0gJ0NvbnRlbnQtTGVuZ3RoOiAnO1xuY29uc3QgQ1JMRiA9ICdcXHJcXG4nO1xudmFyIE1lc3NhZ2VXcml0ZXI7XG4oZnVuY3Rpb24gKE1lc3NhZ2VXcml0ZXIpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgSXMuZnVuYyhjYW5kaWRhdGUuZGlzcG9zZSkgJiYgSXMuZnVuYyhjYW5kaWRhdGUub25DbG9zZSkgJiZcbiAgICAgICAgICAgIElzLmZ1bmMoY2FuZGlkYXRlLm9uRXJyb3IpICYmIElzLmZ1bmMoY2FuZGlkYXRlLndyaXRlKTtcbiAgICB9XG4gICAgTWVzc2FnZVdyaXRlci5pcyA9IGlzO1xufSkoTWVzc2FnZVdyaXRlciB8fCAoZXhwb3J0cy5NZXNzYWdlV3JpdGVyID0gTWVzc2FnZVdyaXRlciA9IHt9KSk7XG5jbGFzcyBBYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy5lcnJvckVtaXR0ZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLmNsb3NlRW1pdHRlci5kaXNwb3NlKCk7XG4gICAgfVxuICAgIGdldCBvbkVycm9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lcnJvckVtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGZpcmVFcnJvcihlcnJvciwgbWVzc2FnZSwgY291bnQpIHtcbiAgICAgICAgdGhpcy5lcnJvckVtaXR0ZXIuZmlyZShbdGhpcy5hc0Vycm9yKGVycm9yKSwgbWVzc2FnZSwgY291bnRdKTtcbiAgICB9XG4gICAgZ2V0IG9uQ2xvc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb3NlRW1pdHRlci5ldmVudDtcbiAgICB9XG4gICAgZmlyZUNsb3NlKCkge1xuICAgICAgICB0aGlzLmNsb3NlRW1pdHRlci5maXJlKHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIGFzRXJyb3IoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoYFdyaXRlciByZWNlaXZlZCBlcnJvci4gUmVhc29uOiAke0lzLnN0cmluZyhlcnJvci5tZXNzYWdlKSA/IGVycm9yLm1lc3NhZ2UgOiAndW5rbm93bid9YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLkFic3RyYWN0TWVzc2FnZVdyaXRlciA9IEFic3RyYWN0TWVzc2FnZVdyaXRlcjtcbnZhciBSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zO1xuKGZ1bmN0aW9uIChSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zKSB7XG4gICAgZnVuY3Rpb24gZnJvbU9wdGlvbnMob3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHsgY2hhcnNldDogb3B0aW9ucyA/PyAndXRmLTgnLCBjb250ZW50VHlwZUVuY29kZXI6ICgwLCByYWxfMS5kZWZhdWx0KSgpLmFwcGxpY2F0aW9uSnNvbi5lbmNvZGVyIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4geyBjaGFyc2V0OiBvcHRpb25zLmNoYXJzZXQgPz8gJ3V0Zi04JywgY29udGVudEVuY29kZXI6IG9wdGlvbnMuY29udGVudEVuY29kZXIsIGNvbnRlbnRUeXBlRW5jb2Rlcjogb3B0aW9ucy5jb250ZW50VHlwZUVuY29kZXIgPz8gKDAsIHJhbF8xLmRlZmF1bHQpKCkuYXBwbGljYXRpb25Kc29uLmVuY29kZXIgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zLmZyb21PcHRpb25zID0gZnJvbU9wdGlvbnM7XG59KShSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zIHx8IChSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zID0ge30pKTtcbmNsYXNzIFdyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKHdyaXRhYmxlLCBvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMud3JpdGFibGUgPSB3cml0YWJsZTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gUmVzb2x2ZWRNZXNzYWdlV3JpdGVyT3B0aW9ucy5mcm9tT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50ID0gMDtcbiAgICAgICAgdGhpcy53cml0ZVNlbWFwaG9yZSA9IG5ldyBzZW1hcGhvcmVfMS5TZW1hcGhvcmUoMSk7XG4gICAgICAgIHRoaXMud3JpdGFibGUub25FcnJvcigoZXJyb3IpID0+IHRoaXMuZmlyZUVycm9yKGVycm9yKSk7XG4gICAgICAgIHRoaXMud3JpdGFibGUub25DbG9zZSgoKSA9PiB0aGlzLmZpcmVDbG9zZSgpKTtcbiAgICB9XG4gICAgYXN5bmMgd3JpdGUobXNnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndyaXRlU2VtYXBob3JlLmxvY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHRoaXMub3B0aW9ucy5jb250ZW50VHlwZUVuY29kZXIuZW5jb2RlKG1zZywgdGhpcy5vcHRpb25zKS50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNvbnRlbnRFbmNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jb250ZW50RW5jb2Rlci5lbmNvZGUoYnVmZmVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZC50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJzID0gW107XG4gICAgICAgICAgICAgICAgaGVhZGVycy5wdXNoKENvbnRlbnRMZW5ndGgsIGJ1ZmZlci5ieXRlTGVuZ3RoLnRvU3RyaW5nKCksIENSTEYpO1xuICAgICAgICAgICAgICAgIGhlYWRlcnMucHVzaChDUkxGKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kb1dyaXRlKG1zZywgaGVhZGVycywgYnVmZmVyKTtcbiAgICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgZG9Xcml0ZShtc2csIGhlYWRlcnMsIGRhdGEpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMud3JpdGFibGUud3JpdGUoaGVhZGVycy5qb2luKCcnKSwgJ2FzY2lpJyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy53cml0YWJsZS53cml0ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IsIG1zZyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZUVycm9yKGVycm9yLCBtc2cpIHtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50Kys7XG4gICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yLCBtc2csIHRoaXMuZXJyb3JDb3VudCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICAgICAgdGhpcy53cml0YWJsZS5lbmQoKTtcbiAgICB9XG59XG5leHBvcnRzLldyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgPSBXcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkFic3RyYWN0TWVzc2FnZUJ1ZmZlciA9IHZvaWQgMDtcbmNvbnN0IENSID0gMTM7XG5jb25zdCBMRiA9IDEwO1xuY29uc3QgQ1JMRiA9ICdcXHJcXG4nO1xuY2xhc3MgQWJzdHJhY3RNZXNzYWdlQnVmZmVyIHtcbiAgICBjb25zdHJ1Y3RvcihlbmNvZGluZyA9ICd1dGYtOCcpIHtcbiAgICAgICAgdGhpcy5fZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgICAgICAgdGhpcy5fY2h1bmtzID0gW107XG4gICAgICAgIHRoaXMuX3RvdGFsTGVuZ3RoID0gMDtcbiAgICB9XG4gICAgZ2V0IGVuY29kaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW5jb2Rpbmc7XG4gICAgfVxuICAgIGFwcGVuZChjaHVuaykge1xuICAgICAgICBjb25zdCB0b0FwcGVuZCA9IHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZycgPyB0aGlzLmZyb21TdHJpbmcoY2h1bmssIHRoaXMuX2VuY29kaW5nKSA6IGNodW5rO1xuICAgICAgICB0aGlzLl9jaHVua3MucHVzaCh0b0FwcGVuZCk7XG4gICAgICAgIHRoaXMuX3RvdGFsTGVuZ3RoICs9IHRvQXBwZW5kLmJ5dGVMZW5ndGg7XG4gICAgfVxuICAgIHRyeVJlYWRIZWFkZXJzKGxvd2VyQ2FzZUtleXMgPSBmYWxzZSkge1xuICAgICAgICBpZiAodGhpcy5fY2h1bmtzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3RhdGUgPSAwO1xuICAgICAgICBsZXQgY2h1bmtJbmRleCA9IDA7XG4gICAgICAgIGxldCBvZmZzZXQgPSAwO1xuICAgICAgICBsZXQgY2h1bmtCeXRlc1JlYWQgPSAwO1xuICAgICAgICByb3c6IHdoaWxlIChjaHVua0luZGV4IDwgdGhpcy5fY2h1bmtzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgY2h1bmsgPSB0aGlzLl9jaHVua3NbY2h1bmtJbmRleF07XG4gICAgICAgICAgICBvZmZzZXQgPSAwO1xuICAgICAgICAgICAgY29sdW1uOiB3aGlsZSAob2Zmc2V0IDwgY2h1bmsubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjaHVua1tvZmZzZXRdO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDUjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIExGOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gNDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHJvdztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjaHVua0J5dGVzUmVhZCArPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgY2h1bmtJbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZSAhPT0gNCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgYnVmZmVyIGNvbnRhaW5zIHRoZSB0d28gQ1JMRiBhdCB0aGUgZW5kLiBTbyB3ZSB3aWxsXG4gICAgICAgIC8vIGhhdmUgdHdvIGVtcHR5IGxpbmVzIGFmdGVyIHRoZSBzcGxpdCBhdCB0aGUgZW5kIGFzIHdlbGwuXG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuX3JlYWQoY2h1bmtCeXRlc1JlYWQgKyBvZmZzZXQpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwKCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLnRvU3RyaW5nKGJ1ZmZlciwgJ2FzY2lpJykuc3BsaXQoQ1JMRik7XG4gICAgICAgIGlmIChoZWFkZXJzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXJzLmxlbmd0aCAtIDI7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaGVhZGVyID0gaGVhZGVyc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gaGVhZGVyLmluZGV4T2YoJzonKTtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1lc3NhZ2UgaGVhZGVyIG11c3Qgc2VwYXJhdGUga2V5IGFuZCB2YWx1ZSB1c2luZyAnOidcXG4ke2hlYWRlcn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGhlYWRlci5zdWJzdHIoMCwgaW5kZXgpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBoZWFkZXIuc3Vic3RyKGluZGV4ICsgMSkudHJpbSgpO1xuICAgICAgICAgICAgcmVzdWx0LnNldChsb3dlckNhc2VLZXlzID8ga2V5LnRvTG93ZXJDYXNlKCkgOiBrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICB0cnlSZWFkQm9keShsZW5ndGgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3RvdGFsTGVuZ3RoIDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkKGxlbmd0aCk7XG4gICAgfVxuICAgIGdldCBudW1iZXJPZkJ5dGVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdG90YWxMZW5ndGg7XG4gICAgfVxuICAgIF9yZWFkKGJ5dGVDb3VudCkge1xuICAgICAgICBpZiAoYnl0ZUNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbXB0eUJ1ZmZlcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChieXRlQ291bnQgPiB0aGlzLl90b3RhbExlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVhZCBzbyBtYW55IGJ5dGVzIWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jaHVua3NbMF0uYnl0ZUxlbmd0aCA9PT0gYnl0ZUNvdW50KSB7XG4gICAgICAgICAgICAvLyBzdXBlciBmYXN0IHBhdGgsIHByZWNpc2VseSBmaXJzdCBjaHVuayBtdXN0IGJlIHJldHVybmVkXG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1swXTtcbiAgICAgICAgICAgIHRoaXMuX2NodW5rcy5zaGlmdCgpO1xuICAgICAgICAgICAgdGhpcy5fdG90YWxMZW5ndGggLT0gYnl0ZUNvdW50O1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXNOYXRpdmUoY2h1bmspO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jaHVua3NbMF0uYnl0ZUxlbmd0aCA+IGJ5dGVDb3VudCkge1xuICAgICAgICAgICAgLy8gZmFzdCBwYXRoLCB0aGUgcmVhZGluZyBpcyBlbnRpcmVseSB3aXRoaW4gdGhlIGZpcnN0IGNodW5rXG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1swXTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuYXNOYXRpdmUoY2h1bmssIGJ5dGVDb3VudCk7XG4gICAgICAgICAgICB0aGlzLl9jaHVua3NbMF0gPSBjaHVuay5zbGljZShieXRlQ291bnQpO1xuICAgICAgICAgICAgdGhpcy5fdG90YWxMZW5ndGggLT0gYnl0ZUNvdW50O1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmFsbG9jTmF0aXZlKGJ5dGVDb3VudCk7XG4gICAgICAgIGxldCByZXN1bHRPZmZzZXQgPSAwO1xuICAgICAgICBsZXQgY2h1bmtJbmRleCA9IDA7XG4gICAgICAgIHdoaWxlIChieXRlQ291bnQgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1tjaHVua0luZGV4XTtcbiAgICAgICAgICAgIGlmIChjaHVuay5ieXRlTGVuZ3RoID4gYnl0ZUNvdW50KSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBjaHVuayB3aWxsIHN1cnZpdmVcbiAgICAgICAgICAgICAgICBjb25zdCBjaHVua1BhcnQgPSBjaHVuay5zbGljZSgwLCBieXRlQ291bnQpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5zZXQoY2h1bmtQYXJ0LCByZXN1bHRPZmZzZXQpO1xuICAgICAgICAgICAgICAgIHJlc3VsdE9mZnNldCArPSBieXRlQ291bnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2h1bmtzW2NodW5rSW5kZXhdID0gY2h1bmsuc2xpY2UoYnl0ZUNvdW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLl90b3RhbExlbmd0aCAtPSBieXRlQ291bnQ7XG4gICAgICAgICAgICAgICAgYnl0ZUNvdW50IC09IGJ5dGVDb3VudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHRoaXMgY2h1bmsgd2lsbCBiZSBlbnRpcmVseSByZWFkXG4gICAgICAgICAgICAgICAgcmVzdWx0LnNldChjaHVuaywgcmVzdWx0T2Zmc2V0KTtcbiAgICAgICAgICAgICAgICByZXN1bHRPZmZzZXQgKz0gY2h1bmsuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgICAgICB0aGlzLl9jaHVua3Muc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl90b3RhbExlbmd0aCAtPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgICAgIGJ5dGVDb3VudCAtPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VCdWZmZXIgPSBBYnN0cmFjdE1lc3NhZ2VCdWZmZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uID0gZXhwb3J0cy5Db25uZWN0aW9uT3B0aW9ucyA9IGV4cG9ydHMuTWVzc2FnZVN0cmF0ZWd5ID0gZXhwb3J0cy5DYW5jZWxsYXRpb25TdHJhdGVneSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gZXhwb3J0cy5JZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IGV4cG9ydHMuQ29ubmVjdGlvbkVycm9yID0gZXhwb3J0cy5Db25uZWN0aW9uRXJyb3JzID0gZXhwb3J0cy5Mb2dUcmFjZU5vdGlmaWNhdGlvbiA9IGV4cG9ydHMuU2V0VHJhY2VOb3RpZmljYXRpb24gPSBleHBvcnRzLlRyYWNlRm9ybWF0ID0gZXhwb3J0cy5UcmFjZVZhbHVlcyA9IGV4cG9ydHMuVHJhY2UgPSBleHBvcnRzLk51bGxMb2dnZXIgPSBleHBvcnRzLlByb2dyZXNzVHlwZSA9IGV4cG9ydHMuUHJvZ3Jlc3NUb2tlbiA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IG1lc3NhZ2VzXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlc1wiKTtcbmNvbnN0IGxpbmtlZE1hcF8xID0gcmVxdWlyZShcIi4vbGlua2VkTWFwXCIpO1xuY29uc3QgZXZlbnRzXzEgPSByZXF1aXJlKFwiLi9ldmVudHNcIik7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbnZhciBDYW5jZWxOb3RpZmljYXRpb247XG4oZnVuY3Rpb24gKENhbmNlbE5vdGlmaWNhdGlvbikge1xuICAgIENhbmNlbE5vdGlmaWNhdGlvbi50eXBlID0gbmV3IG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZSgnJC9jYW5jZWxSZXF1ZXN0Jyk7XG59KShDYW5jZWxOb3RpZmljYXRpb24gfHwgKENhbmNlbE5vdGlmaWNhdGlvbiA9IHt9KSk7XG52YXIgUHJvZ3Jlc3NUb2tlbjtcbihmdW5jdGlvbiAoUHJvZ3Jlc3NUb2tlbikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG4gICAgfVxuICAgIFByb2dyZXNzVG9rZW4uaXMgPSBpcztcbn0pKFByb2dyZXNzVG9rZW4gfHwgKGV4cG9ydHMuUHJvZ3Jlc3NUb2tlbiA9IFByb2dyZXNzVG9rZW4gPSB7fSkpO1xudmFyIFByb2dyZXNzTm90aWZpY2F0aW9uO1xuKGZ1bmN0aW9uIChQcm9ncmVzc05vdGlmaWNhdGlvbikge1xuICAgIFByb2dyZXNzTm90aWZpY2F0aW9uLnR5cGUgPSBuZXcgbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlKCckL3Byb2dyZXNzJyk7XG59KShQcm9ncmVzc05vdGlmaWNhdGlvbiB8fCAoUHJvZ3Jlc3NOb3RpZmljYXRpb24gPSB7fSkpO1xuY2xhc3MgUHJvZ3Jlc3NUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICB9XG59XG5leHBvcnRzLlByb2dyZXNzVHlwZSA9IFByb2dyZXNzVHlwZTtcbnZhciBTdGFyUmVxdWVzdEhhbmRsZXI7XG4oZnVuY3Rpb24gKFN0YXJSZXF1ZXN0SGFuZGxlcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBJcy5mdW5jKHZhbHVlKTtcbiAgICB9XG4gICAgU3RhclJlcXVlc3RIYW5kbGVyLmlzID0gaXM7XG59KShTdGFyUmVxdWVzdEhhbmRsZXIgfHwgKFN0YXJSZXF1ZXN0SGFuZGxlciA9IHt9KSk7XG5leHBvcnRzLk51bGxMb2dnZXIgPSBPYmplY3QuZnJlZXplKHtcbiAgICBlcnJvcjogKCkgPT4geyB9LFxuICAgIHdhcm46ICgpID0+IHsgfSxcbiAgICBpbmZvOiAoKSA9PiB7IH0sXG4gICAgbG9nOiAoKSA9PiB7IH1cbn0pO1xudmFyIFRyYWNlO1xuKGZ1bmN0aW9uIChUcmFjZSkge1xuICAgIFRyYWNlW1RyYWNlW1wiT2ZmXCJdID0gMF0gPSBcIk9mZlwiO1xuICAgIFRyYWNlW1RyYWNlW1wiTWVzc2FnZXNcIl0gPSAxXSA9IFwiTWVzc2FnZXNcIjtcbiAgICBUcmFjZVtUcmFjZVtcIkNvbXBhY3RcIl0gPSAyXSA9IFwiQ29tcGFjdFwiO1xuICAgIFRyYWNlW1RyYWNlW1wiVmVyYm9zZVwiXSA9IDNdID0gXCJWZXJib3NlXCI7XG59KShUcmFjZSB8fCAoZXhwb3J0cy5UcmFjZSA9IFRyYWNlID0ge30pKTtcbnZhciBUcmFjZVZhbHVlcztcbihmdW5jdGlvbiAoVHJhY2VWYWx1ZXMpIHtcbiAgICAvKipcbiAgICAgKiBUdXJuIHRyYWNpbmcgb2ZmLlxuICAgICAqL1xuICAgIFRyYWNlVmFsdWVzLk9mZiA9ICdvZmYnO1xuICAgIC8qKlxuICAgICAqIFRyYWNlIG1lc3NhZ2VzIG9ubHkuXG4gICAgICovXG4gICAgVHJhY2VWYWx1ZXMuTWVzc2FnZXMgPSAnbWVzc2FnZXMnO1xuICAgIC8qKlxuICAgICAqIENvbXBhY3QgbWVzc2FnZSB0cmFjaW5nLlxuICAgICAqL1xuICAgIFRyYWNlVmFsdWVzLkNvbXBhY3QgPSAnY29tcGFjdCc7XG4gICAgLyoqXG4gICAgICogVmVyYm9zZSBtZXNzYWdlIHRyYWNpbmcuXG4gICAgICovXG4gICAgVHJhY2VWYWx1ZXMuVmVyYm9zZSA9ICd2ZXJib3NlJztcbn0pKFRyYWNlVmFsdWVzIHx8IChleHBvcnRzLlRyYWNlVmFsdWVzID0gVHJhY2VWYWx1ZXMgPSB7fSkpO1xuKGZ1bmN0aW9uIChUcmFjZSkge1xuICAgIGZ1bmN0aW9uIGZyb21TdHJpbmcodmFsdWUpIHtcbiAgICAgICAgaWYgKCFJcy5zdHJpbmcodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gVHJhY2UuT2ZmO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSAnb2ZmJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gVHJhY2UuT2ZmO1xuICAgICAgICAgICAgY2FzZSAnbWVzc2FnZXMnOlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5NZXNzYWdlcztcbiAgICAgICAgICAgIGNhc2UgJ2NvbXBhY3QnOlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5Db21wYWN0O1xuICAgICAgICAgICAgY2FzZSAndmVyYm9zZSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFRyYWNlLlZlcmJvc2U7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5PZmY7XG4gICAgICAgIH1cbiAgICB9XG4gICAgVHJhY2UuZnJvbVN0cmluZyA9IGZyb21TdHJpbmc7XG4gICAgZnVuY3Rpb24gdG9TdHJpbmcodmFsdWUpIHtcbiAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5PZmY6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdvZmYnO1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5NZXNzYWdlczpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ21lc3NhZ2VzJztcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuQ29tcGFjdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2NvbXBhY3QnO1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5WZXJib3NlOlxuICAgICAgICAgICAgICAgIHJldHVybiAndmVyYm9zZSc7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAnb2ZmJztcbiAgICAgICAgfVxuICAgIH1cbiAgICBUcmFjZS50b1N0cmluZyA9IHRvU3RyaW5nO1xufSkoVHJhY2UgfHwgKGV4cG9ydHMuVHJhY2UgPSBUcmFjZSA9IHt9KSk7XG52YXIgVHJhY2VGb3JtYXQ7XG4oZnVuY3Rpb24gKFRyYWNlRm9ybWF0KSB7XG4gICAgVHJhY2VGb3JtYXRbXCJUZXh0XCJdID0gXCJ0ZXh0XCI7XG4gICAgVHJhY2VGb3JtYXRbXCJKU09OXCJdID0gXCJqc29uXCI7XG59KShUcmFjZUZvcm1hdCB8fCAoZXhwb3J0cy5UcmFjZUZvcm1hdCA9IFRyYWNlRm9ybWF0ID0ge30pKTtcbihmdW5jdGlvbiAoVHJhY2VGb3JtYXQpIHtcbiAgICBmdW5jdGlvbiBmcm9tU3RyaW5nKHZhbHVlKSB7XG4gICAgICAgIGlmICghSXMuc3RyaW5nKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIFRyYWNlRm9ybWF0LlRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAodmFsdWUgPT09ICdqc29uJykge1xuICAgICAgICAgICAgcmV0dXJuIFRyYWNlRm9ybWF0LkpTT047XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gVHJhY2VGb3JtYXQuVGV4dDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBUcmFjZUZvcm1hdC5mcm9tU3RyaW5nID0gZnJvbVN0cmluZztcbn0pKFRyYWNlRm9ybWF0IHx8IChleHBvcnRzLlRyYWNlRm9ybWF0ID0gVHJhY2VGb3JtYXQgPSB7fSkpO1xudmFyIFNldFRyYWNlTm90aWZpY2F0aW9uO1xuKGZ1bmN0aW9uIChTZXRUcmFjZU5vdGlmaWNhdGlvbikge1xuICAgIFNldFRyYWNlTm90aWZpY2F0aW9uLnR5cGUgPSBuZXcgbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlKCckL3NldFRyYWNlJyk7XG59KShTZXRUcmFjZU5vdGlmaWNhdGlvbiB8fCAoZXhwb3J0cy5TZXRUcmFjZU5vdGlmaWNhdGlvbiA9IFNldFRyYWNlTm90aWZpY2F0aW9uID0ge30pKTtcbnZhciBMb2dUcmFjZU5vdGlmaWNhdGlvbjtcbihmdW5jdGlvbiAoTG9nVHJhY2VOb3RpZmljYXRpb24pIHtcbiAgICBMb2dUcmFjZU5vdGlmaWNhdGlvbi50eXBlID0gbmV3IG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZSgnJC9sb2dUcmFjZScpO1xufSkoTG9nVHJhY2VOb3RpZmljYXRpb24gfHwgKGV4cG9ydHMuTG9nVHJhY2VOb3RpZmljYXRpb24gPSBMb2dUcmFjZU5vdGlmaWNhdGlvbiA9IHt9KSk7XG52YXIgQ29ubmVjdGlvbkVycm9ycztcbihmdW5jdGlvbiAoQ29ubmVjdGlvbkVycm9ycykge1xuICAgIC8qKlxuICAgICAqIFRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZC5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uRXJyb3JzW0Nvbm5lY3Rpb25FcnJvcnNbXCJDbG9zZWRcIl0gPSAxXSA9IFwiQ2xvc2VkXCI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gZ290IGRpc3Bvc2VkLlxuICAgICAqL1xuICAgIENvbm5lY3Rpb25FcnJvcnNbQ29ubmVjdGlvbkVycm9yc1tcIkRpc3Bvc2VkXCJdID0gMl0gPSBcIkRpc3Bvc2VkXCI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBpbiBsaXN0ZW5pbmcgbW9kZS5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uRXJyb3JzW0Nvbm5lY3Rpb25FcnJvcnNbXCJBbHJlYWR5TGlzdGVuaW5nXCJdID0gM10gPSBcIkFscmVhZHlMaXN0ZW5pbmdcIjtcbn0pKENvbm5lY3Rpb25FcnJvcnMgfHwgKGV4cG9ydHMuQ29ubmVjdGlvbkVycm9ycyA9IENvbm5lY3Rpb25FcnJvcnMgPSB7fSkpO1xuY2xhc3MgQ29ubmVjdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNvZGUsIG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBDb25uZWN0aW9uRXJyb3IucHJvdG90eXBlKTtcbiAgICB9XG59XG5leHBvcnRzLkNvbm5lY3Rpb25FcnJvciA9IENvbm5lY3Rpb25FcnJvcjtcbnZhciBDb25uZWN0aW9uU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENvbm5lY3Rpb25TdHJhdGVneSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNhbmNlbFVuZGlzcGF0Y2hlZCk7XG4gICAgfVxuICAgIENvbm5lY3Rpb25TdHJhdGVneS5pcyA9IGlzO1xufSkoQ29ubmVjdGlvblN0cmF0ZWd5IHx8IChleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IENvbm5lY3Rpb25TdHJhdGVneSA9IHt9KSk7XG52YXIgSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5O1xuKGZ1bmN0aW9uIChJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiAoY2FuZGlkYXRlLmtpbmQgPT09IHVuZGVmaW5lZCB8fCBjYW5kaWRhdGUua2luZCA9PT0gJ2lkJykgJiYgSXMuZnVuYyhjYW5kaWRhdGUuY3JlYXRlQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UpICYmIChjYW5kaWRhdGUuZGlzcG9zZSA9PT0gdW5kZWZpbmVkIHx8IElzLmZ1bmMoY2FuZGlkYXRlLmRpc3Bvc2UpKTtcbiAgICB9XG4gICAgSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzID0gaXM7XG59KShJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgfHwgKGV4cG9ydHMuSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0ge30pKTtcbnZhciBSZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneTtcbihmdW5jdGlvbiAoUmVxdWVzdENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBjYW5kaWRhdGUua2luZCA9PT0gJ3JlcXVlc3QnICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKSAmJiAoY2FuZGlkYXRlLmRpc3Bvc2UgPT09IHVuZGVmaW5lZCB8fCBJcy5mdW5jKGNhbmRpZGF0ZS5kaXNwb3NlKSk7XG4gICAgfVxuICAgIFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzID0gaXM7XG59KShSZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSB8fCAoZXhwb3J0cy5SZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0ge30pKTtcbnZhciBDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5O1xuKGZ1bmN0aW9uIChDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5NZXNzYWdlID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKF8pIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgY2FuY2VsbGF0aW9uXzEuQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UoKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kuaXModmFsdWUpIHx8IFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKHZhbHVlKTtcbiAgICB9XG4gICAgQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5pcyA9IGlzO1xufSkoQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSB8fCAoZXhwb3J0cy5DYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IHt9KSk7XG52YXIgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENhbmNlbGxhdGlvblNlbmRlclN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kuTWVzc2FnZSA9IE9iamVjdC5mcmVlemUoe1xuICAgICAgICBzZW5kQ2FuY2VsbGF0aW9uKGNvbm4sIGlkKSB7XG4gICAgICAgICAgICByZXR1cm4gY29ubi5zZW5kTm90aWZpY2F0aW9uKENhbmNlbE5vdGlmaWNhdGlvbi50eXBlLCB7IGlkIH0pO1xuICAgICAgICB9LFxuICAgICAgICBjbGVhbnVwKF8pIHsgfVxuICAgIH0pO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLnNlbmRDYW5jZWxsYXRpb24pICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNsZWFudXApO1xuICAgIH1cbiAgICBDYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneS5pcyA9IGlzO1xufSkoQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgfHwgKGV4cG9ydHMuQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgPSBDYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneSA9IHt9KSk7XG52YXIgQ2FuY2VsbGF0aW9uU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENhbmNlbGxhdGlvblN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uU3RyYXRlZ3kuTWVzc2FnZSA9IE9iamVjdC5mcmVlemUoe1xuICAgICAgICByZWNlaXZlcjogQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5NZXNzYWdlLFxuICAgICAgICBzZW5kZXI6IENhbmNlbGxhdGlvblNlbmRlclN0cmF0ZWd5Lk1lc3NhZ2VcbiAgICB9KTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKGNhbmRpZGF0ZS5yZWNlaXZlcikgJiYgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kuaXMoY2FuZGlkYXRlLnNlbmRlcik7XG4gICAgfVxuICAgIENhbmNlbGxhdGlvblN0cmF0ZWd5LmlzID0gaXM7XG59KShDYW5jZWxsYXRpb25TdHJhdGVneSB8fCAoZXhwb3J0cy5DYW5jZWxsYXRpb25TdHJhdGVneSA9IENhbmNlbGxhdGlvblN0cmF0ZWd5ID0ge30pKTtcbnZhciBNZXNzYWdlU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKE1lc3NhZ2VTdHJhdGVneSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLmhhbmRsZU1lc3NhZ2UpO1xuICAgIH1cbiAgICBNZXNzYWdlU3RyYXRlZ3kuaXMgPSBpcztcbn0pKE1lc3NhZ2VTdHJhdGVneSB8fCAoZXhwb3J0cy5NZXNzYWdlU3RyYXRlZ3kgPSBNZXNzYWdlU3RyYXRlZ3kgPSB7fSkpO1xudmFyIENvbm5lY3Rpb25PcHRpb25zO1xuKGZ1bmN0aW9uIChDb25uZWN0aW9uT3B0aW9ucykge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIChDYW5jZWxsYXRpb25TdHJhdGVneS5pcyhjYW5kaWRhdGUuY2FuY2VsbGF0aW9uU3RyYXRlZ3kpIHx8IENvbm5lY3Rpb25TdHJhdGVneS5pcyhjYW5kaWRhdGUuY29ubmVjdGlvblN0cmF0ZWd5KSB8fCBNZXNzYWdlU3RyYXRlZ3kuaXMoY2FuZGlkYXRlLm1lc3NhZ2VTdHJhdGVneSkpO1xuICAgIH1cbiAgICBDb25uZWN0aW9uT3B0aW9ucy5pcyA9IGlzO1xufSkoQ29ubmVjdGlvbk9wdGlvbnMgfHwgKGV4cG9ydHMuQ29ubmVjdGlvbk9wdGlvbnMgPSBDb25uZWN0aW9uT3B0aW9ucyA9IHt9KSk7XG52YXIgQ29ubmVjdGlvblN0YXRlO1xuKGZ1bmN0aW9uIChDb25uZWN0aW9uU3RhdGUpIHtcbiAgICBDb25uZWN0aW9uU3RhdGVbQ29ubmVjdGlvblN0YXRlW1wiTmV3XCJdID0gMV0gPSBcIk5ld1wiO1xuICAgIENvbm5lY3Rpb25TdGF0ZVtDb25uZWN0aW9uU3RhdGVbXCJMaXN0ZW5pbmdcIl0gPSAyXSA9IFwiTGlzdGVuaW5nXCI7XG4gICAgQ29ubmVjdGlvblN0YXRlW0Nvbm5lY3Rpb25TdGF0ZVtcIkNsb3NlZFwiXSA9IDNdID0gXCJDbG9zZWRcIjtcbiAgICBDb25uZWN0aW9uU3RhdGVbQ29ubmVjdGlvblN0YXRlW1wiRGlzcG9zZWRcIl0gPSA0XSA9IFwiRGlzcG9zZWRcIjtcbn0pKENvbm5lY3Rpb25TdGF0ZSB8fCAoQ29ubmVjdGlvblN0YXRlID0ge30pKTtcbmZ1bmN0aW9uIGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uKG1lc3NhZ2VSZWFkZXIsIG1lc3NhZ2VXcml0ZXIsIF9sb2dnZXIsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBsb2dnZXIgPSBfbG9nZ2VyICE9PSB1bmRlZmluZWQgPyBfbG9nZ2VyIDogZXhwb3J0cy5OdWxsTG9nZ2VyO1xuICAgIGxldCBzZXF1ZW5jZU51bWJlciA9IDA7XG4gICAgbGV0IG5vdGlmaWNhdGlvblNlcXVlbmNlTnVtYmVyID0gMDtcbiAgICBsZXQgdW5rbm93blJlc3BvbnNlU2VxdWVuY2VOdW1iZXIgPSAwO1xuICAgIGNvbnN0IHZlcnNpb24gPSAnMi4wJztcbiAgICBsZXQgc3RhclJlcXVlc3RIYW5kbGVyID0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlcXVlc3RIYW5kbGVycyA9IG5ldyBNYXAoKTtcbiAgICBsZXQgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgY29uc3Qgbm90aWZpY2F0aW9uSGFuZGxlcnMgPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgcHJvZ3Jlc3NIYW5kbGVycyA9IG5ldyBNYXAoKTtcbiAgICBsZXQgdGltZXI7XG4gICAgbGV0IG1lc3NhZ2VRdWV1ZSA9IG5ldyBsaW5rZWRNYXBfMS5MaW5rZWRNYXAoKTtcbiAgICBsZXQgcmVzcG9uc2VQcm9taXNlcyA9IG5ldyBNYXAoKTtcbiAgICBsZXQga25vd25DYW5jZWxlZFJlcXVlc3RzID0gbmV3IFNldCgpO1xuICAgIGxldCByZXF1ZXN0VG9rZW5zID0gbmV3IE1hcCgpO1xuICAgIGxldCB0cmFjZSA9IFRyYWNlLk9mZjtcbiAgICBsZXQgdHJhY2VGb3JtYXQgPSBUcmFjZUZvcm1hdC5UZXh0O1xuICAgIGxldCB0cmFjZXI7XG4gICAgbGV0IHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLk5ldztcbiAgICBjb25zdCBlcnJvckVtaXR0ZXIgPSBuZXcgZXZlbnRzXzEuRW1pdHRlcigpO1xuICAgIGNvbnN0IGNsb3NlRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgdW5oYW5kbGVkTm90aWZpY2F0aW9uRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgdW5oYW5kbGVkUHJvZ3Jlc3NFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICBjb25zdCBkaXNwb3NlRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgY2FuY2VsbGF0aW9uU3RyYXRlZ3kgPSAob3B0aW9ucyAmJiBvcHRpb25zLmNhbmNlbGxhdGlvblN0cmF0ZWd5KSA/IG9wdGlvbnMuY2FuY2VsbGF0aW9uU3RyYXRlZ3kgOiBDYW5jZWxsYXRpb25TdHJhdGVneS5NZXNzYWdlO1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlcXVlc3RRdWV1ZUtleShpZCkge1xuICAgICAgICBpZiAoaWQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuJ3Qgc2VuZCByZXF1ZXN0cyB3aXRoIGlkIG51bGwgc2luY2UgdGhlIHJlc3BvbnNlIGNhbid0IGJlIGNvcnJlbGF0ZWQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdyZXEtJyArIGlkLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlc3BvbnNlUXVldWVLZXkoaWQpIHtcbiAgICAgICAgaWYgKGlkID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3Jlcy11bmtub3duLScgKyAoKyt1bmtub3duUmVzcG9uc2VTZXF1ZW5jZU51bWJlcikudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAncmVzLScgKyBpZC50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZU5vdGlmaWNhdGlvblF1ZXVlS2V5KCkge1xuICAgICAgICByZXR1cm4gJ25vdC0nICsgKCsrbm90aWZpY2F0aW9uU2VxdWVuY2VOdW1iZXIpLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFkZE1lc3NhZ2VUb1F1ZXVlKHF1ZXVlLCBtZXNzYWdlKSB7XG4gICAgICAgIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXF1ZXN0KG1lc3NhZ2UpKSB7XG4gICAgICAgICAgICBxdWV1ZS5zZXQoY3JlYXRlUmVxdWVzdFF1ZXVlS2V5KG1lc3NhZ2UuaWQpLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXNwb25zZShtZXNzYWdlKSkge1xuICAgICAgICAgICAgcXVldWUuc2V0KGNyZWF0ZVJlc3BvbnNlUXVldWVLZXkobWVzc2FnZS5pZCksIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcXVldWUuc2V0KGNyZWF0ZU5vdGlmaWNhdGlvblF1ZXVlS2V5KCksIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNhbmNlbFVuZGlzcGF0Y2hlZChfbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0xpc3RlbmluZygpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlID09PSBDb25uZWN0aW9uU3RhdGUuTGlzdGVuaW5nO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0Nsb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlID09PSBDb25uZWN0aW9uU3RhdGUuQ2xvc2VkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0Rpc3Bvc2VkKCkge1xuICAgICAgICByZXR1cm4gc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5EaXNwb3NlZDtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2xvc2VIYW5kbGVyKCkge1xuICAgICAgICBpZiAoc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5OZXcgfHwgc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5MaXN0ZW5pbmcpIHtcbiAgICAgICAgICAgIHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLkNsb3NlZDtcbiAgICAgICAgICAgIGNsb3NlRW1pdHRlci5maXJlKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlIGNvbm5lY3Rpb24gaXMgZGlzcG9zZWQgZG9uJ3Qgc2VudCBjbG9zZSBldmVudHMuXG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlYWRFcnJvckhhbmRsZXIoZXJyb3IpIHtcbiAgICAgICAgZXJyb3JFbWl0dGVyLmZpcmUoW2Vycm9yLCB1bmRlZmluZWQsIHVuZGVmaW5lZF0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiB3cml0ZUVycm9ySGFuZGxlcihkYXRhKSB7XG4gICAgICAgIGVycm9yRW1pdHRlci5maXJlKGRhdGEpO1xuICAgIH1cbiAgICBtZXNzYWdlUmVhZGVyLm9uQ2xvc2UoY2xvc2VIYW5kbGVyKTtcbiAgICBtZXNzYWdlUmVhZGVyLm9uRXJyb3IocmVhZEVycm9ySGFuZGxlcik7XG4gICAgbWVzc2FnZVdyaXRlci5vbkNsb3NlKGNsb3NlSGFuZGxlcik7XG4gICAgbWVzc2FnZVdyaXRlci5vbkVycm9yKHdyaXRlRXJyb3JIYW5kbGVyKTtcbiAgICBmdW5jdGlvbiB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCkge1xuICAgICAgICBpZiAodGltZXIgfHwgbWVzc2FnZVF1ZXVlLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aW1lciA9ICgwLCByYWxfMS5kZWZhdWx0KSgpLnRpbWVyLnNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICAgICAgICB0aW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHByb2Nlc3NNZXNzYWdlUXVldWUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGhhbmRsZU1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICBpZiAobWVzc2FnZXNfMS5NZXNzYWdlLmlzUmVxdWVzdChtZXNzYWdlKSkge1xuICAgICAgICAgICAgaGFuZGxlUmVxdWVzdChtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNOb3RpZmljYXRpb24obWVzc2FnZSkpIHtcbiAgICAgICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvbihtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXNwb25zZShtZXNzYWdlKSkge1xuICAgICAgICAgICAgaGFuZGxlUmVzcG9uc2UobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBoYW5kbGVJbnZhbGlkTWVzc2FnZShtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBwcm9jZXNzTWVzc2FnZVF1ZXVlKCkge1xuICAgICAgICBpZiAobWVzc2FnZVF1ZXVlLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXNzYWdlID0gbWVzc2FnZVF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlU3RyYXRlZ3kgPSBvcHRpb25zPy5tZXNzYWdlU3RyYXRlZ3k7XG4gICAgICAgICAgICBpZiAoTWVzc2FnZVN0cmF0ZWd5LmlzKG1lc3NhZ2VTdHJhdGVneSkpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlU3RyYXRlZ3kuaGFuZGxlTWVzc2FnZShtZXNzYWdlLCBoYW5kbGVNZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGhhbmRsZU1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgY2FsbGJhY2sgPSAobWVzc2FnZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2UgaGF2ZSByZWNlaXZlZCBhIGNhbmNlbGxhdGlvbiBtZXNzYWdlLiBDaGVjayBpZiB0aGUgbWVzc2FnZSBpcyBzdGlsbCBpbiB0aGUgcXVldWVcbiAgICAgICAgICAgIC8vIGFuZCBjYW5jZWwgaXQgaWYgYWxsb3dlZCB0byBkbyBzby5cbiAgICAgICAgICAgIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNOb3RpZmljYXRpb24obWVzc2FnZSkgJiYgbWVzc2FnZS5tZXRob2QgPT09IENhbmNlbE5vdGlmaWNhdGlvbi50eXBlLm1ldGhvZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbmNlbElkID0gbWVzc2FnZS5wYXJhbXMuaWQ7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gY3JlYXRlUmVxdWVzdFF1ZXVlS2V5KGNhbmNlbElkKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0b0NhbmNlbCA9IG1lc3NhZ2VRdWV1ZS5nZXQoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZXNfMS5NZXNzYWdlLmlzUmVxdWVzdCh0b0NhbmNlbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyYXRlZ3kgPSBvcHRpb25zPy5jb25uZWN0aW9uU3RyYXRlZ3k7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gKHN0cmF0ZWd5ICYmIHN0cmF0ZWd5LmNhbmNlbFVuZGlzcGF0Y2hlZCkgPyBzdHJhdGVneS5jYW5jZWxVbmRpc3BhdGNoZWQodG9DYW5jZWwsIGNhbmNlbFVuZGlzcGF0Y2hlZCkgOiBjYW5jZWxVbmRpc3BhdGNoZWQodG9DYW5jZWwpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgJiYgKHJlc3BvbnNlLmVycm9yICE9PSB1bmRlZmluZWQgfHwgcmVzcG9uc2UucmVzdWx0ICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUXVldWUuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLmRlbGV0ZShjYW5jZWxJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5pZCA9IHRvQ2FuY2VsLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VTZW5kaW5nUmVzcG9uc2UocmVzcG9uc2UsIG1lc3NhZ2UubWV0aG9kLCBEYXRlLm5vdygpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUocmVzcG9uc2UpLmNhdGNoKCgpID0+IGxvZ2dlci5lcnJvcihgU2VuZGluZyByZXNwb25zZSBmb3IgY2FuY2VsZWQgbWVzc2FnZSBmYWlsZWQuYCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGNhbmNlbGxhdGlvblRva2VuID0gcmVxdWVzdFRva2Vucy5nZXQoY2FuY2VsSWQpO1xuICAgICAgICAgICAgICAgIC8vIFRoZSByZXF1ZXN0IGlzIGFscmVhZHkgcnVubmluZy4gQ2FuY2VsIHRoZSB0b2tlblxuICAgICAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbmNlbGxhdGlvblRva2VuLmNhbmNlbCgpO1xuICAgICAgICAgICAgICAgICAgICB0cmFjZVJlY2VpdmVkTm90aWZpY2F0aW9uKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZW1lbWJlciB0aGUgY2FuY2VsIGJ1dCBzdGlsbCBxdWV1ZSB0aGUgbWVzc2FnZSB0b1xuICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbiB1cCBzdGF0ZSBpbiBwcm9jZXNzIG1lc3NhZ2UuXG4gICAgICAgICAgICAgICAgICAgIGtub3duQ2FuY2VsZWRSZXF1ZXN0cy5hZGQoY2FuY2VsSWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFkZE1lc3NhZ2VUb1F1ZXVlKG1lc3NhZ2VRdWV1ZSwgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGZ1bmN0aW9uIGhhbmRsZVJlcXVlc3QocmVxdWVzdE1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgLy8gd2UgcmV0dXJuIGhlcmUgc2lsZW50bHkgc2luY2Ugd2UgZmlyZWQgYW4gZXZlbnQgd2hlbiB0aGVcbiAgICAgICAgICAgIC8vIGNvbm5lY3Rpb24gZ290IGRpc3Bvc2VkLlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHJlcGx5KHJlc3VsdE9yRXJyb3IsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgaWQ6IHJlcXVlc3RNZXNzYWdlLmlkXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKHJlc3VsdE9yRXJyb3IgaW5zdGFuY2VvZiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlLmVycm9yID0gcmVzdWx0T3JFcnJvci50b0pzb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVzdWx0ID0gcmVzdWx0T3JFcnJvciA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHJlc3VsdE9yRXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cmFjZVNlbmRpbmdSZXNwb25zZShtZXNzYWdlLCBtZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICBtZXNzYWdlV3JpdGVyLndyaXRlKG1lc3NhZ2UpLmNhdGNoKCgpID0+IGxvZ2dlci5lcnJvcihgU2VuZGluZyByZXNwb25zZSBmYWlsZWQuYCkpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHJlcGx5RXJyb3IoZXJyb3IsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgaWQ6IHJlcXVlc3RNZXNzYWdlLmlkLFxuICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvci50b0pzb24oKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUobWVzc2FnZSkuY2F0Y2goKCkgPT4gbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlc3BvbnNlIGZhaWxlZC5gKSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gcmVwbHlTdWNjZXNzKHJlc3VsdCwgbWV0aG9kLCBzdGFydFRpbWUpIHtcbiAgICAgICAgICAgIC8vIFRoZSBKU09OIFJQQyBkZWZpbmVzIHRoYXQgYSByZXNwb25zZSBtdXN0IGVpdGhlciBoYXZlIGEgcmVzdWx0IG9yIGFuIGVycm9yXG4gICAgICAgICAgICAvLyBTbyB3ZSBjYW4ndCB0cmVhdCB1bmRlZmluZWQgYXMgYSB2YWxpZCByZXNwb25zZSByZXN1bHQuXG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgICAgICAgICAgICBqc29ucnBjOiB2ZXJzaW9uLFxuICAgICAgICAgICAgICAgIGlkOiByZXF1ZXN0TWVzc2FnZS5pZCxcbiAgICAgICAgICAgICAgICByZXN1bHQ6IHJlc3VsdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUobWVzc2FnZSkuY2F0Y2goKCkgPT4gbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlc3BvbnNlIGZhaWxlZC5gKSk7XG4gICAgICAgIH1cbiAgICAgICAgdHJhY2VSZWNlaXZlZFJlcXVlc3QocmVxdWVzdE1lc3NhZ2UpO1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gcmVxdWVzdEhhbmRsZXJzLmdldChyZXF1ZXN0TWVzc2FnZS5tZXRob2QpO1xuICAgICAgICBsZXQgdHlwZTtcbiAgICAgICAgbGV0IHJlcXVlc3RIYW5kbGVyO1xuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgdHlwZSA9IGVsZW1lbnQudHlwZTtcbiAgICAgICAgICAgIHJlcXVlc3RIYW5kbGVyID0gZWxlbWVudC5oYW5kbGVyO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIGlmIChyZXF1ZXN0SGFuZGxlciB8fCBzdGFyUmVxdWVzdEhhbmRsZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHRva2VuS2V5ID0gcmVxdWVzdE1lc3NhZ2UuaWQgPz8gU3RyaW5nKERhdGUubm93KCkpOyAvL1xuICAgICAgICAgICAgY29uc3QgY2FuY2VsbGF0aW9uU291cmNlID0gSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKGNhbmNlbGxhdGlvblN0cmF0ZWd5LnJlY2VpdmVyKVxuICAgICAgICAgICAgICAgID8gY2FuY2VsbGF0aW9uU3RyYXRlZ3kucmVjZWl2ZXIuY3JlYXRlQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UodG9rZW5LZXkpXG4gICAgICAgICAgICAgICAgOiBjYW5jZWxsYXRpb25TdHJhdGVneS5yZWNlaXZlci5jcmVhdGVDYW5jZWxsYXRpb25Ub2tlblNvdXJjZShyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICBpZiAocmVxdWVzdE1lc3NhZ2UuaWQgIT09IG51bGwgJiYga25vd25DYW5jZWxlZFJlcXVlc3RzLmhhcyhyZXF1ZXN0TWVzc2FnZS5pZCkpIHtcbiAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25Tb3VyY2UuY2FuY2VsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVxdWVzdE1lc3NhZ2UuaWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLnNldCh0b2tlbktleSwgY2FuY2VsbGF0aW9uU291cmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IGhhbmRsZXJSZXN1bHQ7XG4gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0TWVzc2FnZS5wYXJhbXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlLm51bWJlck9mUGFyYW1zICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1zLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyAke3R5cGUubnVtYmVyT2ZQYXJhbXN9IHBhcmFtcyBidXQgcmVjZWl2ZWQgbm9uZS5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJSZXN1bHQgPSByZXF1ZXN0SGFuZGxlcihjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVxdWVzdE1lc3NhZ2UucGFyYW1zKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlLnBhcmFtZXRlclN0cnVjdHVyZXMgPT09IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseUVycm9yKG5ldyBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IobWVzc2FnZXNfMS5FcnJvckNvZGVzLkludmFsaWRQYXJhbXMsIGBSZXF1ZXN0ICR7cmVxdWVzdE1lc3NhZ2UubWV0aG9kfSBkZWZpbmVzIHBhcmFtZXRlcnMgYnkgbmFtZSBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBwb3NpdGlvbmApLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlclJlc3VsdCA9IHJlcXVlc3RIYW5kbGVyKC4uLnJlcXVlc3RNZXNzYWdlLnBhcmFtcywgY2FuY2VsbGF0aW9uU291cmNlLnRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS5wYXJhbWV0ZXJTdHJ1Y3R1cmVzID09PSBtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW52YWxpZFBhcmFtcywgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGRlZmluZXMgcGFyYW1ldGVycyBieSBwb3NpdGlvbiBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBuYW1lYCksIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gcmVxdWVzdEhhbmRsZXIocmVxdWVzdE1lc3NhZ2UucGFyYW1zLCBjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0YXJSZXF1ZXN0SGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gc3RhclJlcXVlc3RIYW5kbGVyKHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgcmVxdWVzdE1lc3NhZ2UucGFyYW1zLCBjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBwcm9taXNlID0gaGFuZGxlclJlc3VsdDtcbiAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZXJSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFRva2Vucy5kZWxldGUodG9rZW5LZXkpO1xuICAgICAgICAgICAgICAgICAgICByZXBseVN1Y2Nlc3MoaGFuZGxlclJlc3VsdCwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwcm9taXNlLnRoZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS50aGVuKChyZXN1bHRPckVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLmRlbGV0ZSh0b2tlbktleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXBseShyZXN1bHRPckVycm9yLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IoZXJyb3IsIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVycm9yICYmIElzLnN0cmluZyhlcnJvci5tZXNzYWdlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGZhaWxlZCB3aXRoIG1lc3NhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZmFpbGVkIHVuZXhwZWN0ZWRseSB3aXRob3V0IHByb3ZpZGluZyBhbnkgZGV0YWlscy5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHkoaGFuZGxlclJlc3VsdCwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHkoZXJyb3IsIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZXJyb3IgJiYgSXMuc3RyaW5nKGVycm9yLm1lc3NhZ2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGZhaWxlZCB3aXRoIG1lc3NhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZmFpbGVkIHVuZXhwZWN0ZWRseSB3aXRob3V0IHByb3ZpZGluZyBhbnkgZGV0YWlscy5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuTWV0aG9kTm90Rm91bmQsIGBVbmhhbmRsZWQgbWV0aG9kICR7cmVxdWVzdE1lc3NhZ2UubWV0aG9kfWApLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlUmVzcG9uc2UocmVzcG9uc2VNZXNzYWdlKSB7XG4gICAgICAgIGlmIChpc0Rpc3Bvc2VkKCkpIHtcbiAgICAgICAgICAgIC8vIFNlZSBoYW5kbGUgcmVxdWVzdC5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzcG9uc2VNZXNzYWdlLmlkID09PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VNZXNzYWdlLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBSZWNlaXZlZCByZXNwb25zZSBtZXNzYWdlIHdpdGhvdXQgaWQ6IEVycm9yIGlzOiBcXG4ke0pTT04uc3RyaW5naWZ5KHJlc3BvbnNlTWVzc2FnZS5lcnJvciwgdW5kZWZpbmVkLCA0KX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgUmVjZWl2ZWQgcmVzcG9uc2UgbWVzc2FnZSB3aXRob3V0IGlkLiBObyBmdXJ0aGVyIGVycm9yIGluZm9ybWF0aW9uIHByb3ZpZGVkLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gcmVzcG9uc2VNZXNzYWdlLmlkO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VQcm9taXNlID0gcmVzcG9uc2VQcm9taXNlcy5nZXQoa2V5KTtcbiAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWRSZXNwb25zZShyZXNwb25zZU1lc3NhZ2UsIHJlc3BvbnNlUHJvbWlzZSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VQcm9taXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2VzLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZU1lc3NhZ2UuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gcmVzcG9uc2VNZXNzYWdlLmVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlLnJlamVjdChuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKGVycm9yLmNvZGUsIGVycm9yLm1lc3NhZ2UsIGVycm9yLmRhdGEpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXNwb25zZU1lc3NhZ2UucmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlTWVzc2FnZS5yZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgbmV2ZXIgaGFwcGVuLicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IubWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBSZXNwb25zZSBoYW5kbGVyICcke3Jlc3BvbnNlUHJvbWlzZS5tZXRob2R9JyBmYWlsZWQgd2l0aCBtZXNzYWdlOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYFJlc3BvbnNlIGhhbmRsZXIgJyR7cmVzcG9uc2VQcm9taXNlLm1ldGhvZH0nIGZhaWxlZCB1bmV4cGVjdGVkbHkuYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlTm90aWZpY2F0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgLy8gU2VlIGhhbmRsZSByZXF1ZXN0LlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0eXBlID0gdW5kZWZpbmVkO1xuICAgICAgICBsZXQgbm90aWZpY2F0aW9uSGFuZGxlcjtcbiAgICAgICAgaWYgKG1lc3NhZ2UubWV0aG9kID09PSBDYW5jZWxOb3RpZmljYXRpb24udHlwZS5tZXRob2QpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhbmNlbElkID0gbWVzc2FnZS5wYXJhbXMuaWQ7XG4gICAgICAgICAgICBrbm93bkNhbmNlbGVkUmVxdWVzdHMuZGVsZXRlKGNhbmNlbElkKTtcbiAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWROb3RpZmljYXRpb24obWVzc2FnZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gbm90aWZpY2F0aW9uSGFuZGxlcnMuZ2V0KG1lc3NhZ2UubWV0aG9kKTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uSGFuZGxlciA9IGVsZW1lbnQuaGFuZGxlcjtcbiAgICAgICAgICAgICAgICB0eXBlID0gZWxlbWVudC50eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChub3RpZmljYXRpb25IYW5kbGVyIHx8IHN0YXJOb3RpZmljYXRpb25IYW5kbGVyKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWROb3RpZmljYXRpb24obWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgaWYgKG5vdGlmaWNhdGlvbkhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UucGFyYW1zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5udW1iZXJPZlBhcmFtcyAhPT0gMCAmJiB0eXBlLnBhcmFtZXRlclN0cnVjdHVyZXMgIT09IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBOb3RpZmljYXRpb24gJHttZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyAke3R5cGUubnVtYmVyT2ZQYXJhbXN9IHBhcmFtcyBidXQgcmVjZWl2ZWQgbm9uZS5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShtZXNzYWdlLnBhcmFtcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGFyZSBKU09OLVJQQyBsaWJyYXJpZXMgdGhhdCBzZW5kIHByb2dyZXNzIG1lc3NhZ2UgYXMgcG9zaXRpb25hbCBwYXJhbXMgYWx0aG91Z2hcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpZmllZCBhcyBuYW1lZC4gU28gY29udmVydCB0aGVtIGlmIHRoaXMgaXMgdGhlIGNhc2UuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBtZXNzYWdlLnBhcmFtcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLm1ldGhvZCA9PT0gUHJvZ3Jlc3NOb3RpZmljYXRpb24udHlwZS5tZXRob2QgJiYgcGFyYW1zLmxlbmd0aCA9PT0gMiAmJiBQcm9ncmVzc1Rva2VuLmlzKHBhcmFtc1swXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKHsgdG9rZW46IHBhcmFtc1swXSwgdmFsdWU6IHBhcmFtc1sxXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUucGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBOb3RpZmljYXRpb24gJHttZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyBwYXJhbWV0ZXJzIGJ5IG5hbWUgYnV0IHJlY2VpdmVkIHBhcmFtZXRlcnMgYnkgcG9zaXRpb25gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5udW1iZXJPZlBhcmFtcyAhPT0gbWVzc2FnZS5wYXJhbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYE5vdGlmaWNhdGlvbiAke21lc3NhZ2UubWV0aG9kfSBkZWZpbmVzICR7dHlwZS5udW1iZXJPZlBhcmFtc30gcGFyYW1zIGJ1dCByZWNlaXZlZCAke3BhcmFtcy5sZW5ndGh9IGFyZ3VtZW50c2ApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXIoLi4ucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS5wYXJhbWV0ZXJTdHJ1Y3R1cmVzID09PSBtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgTm90aWZpY2F0aW9uICR7bWVzc2FnZS5tZXRob2R9IGRlZmluZXMgcGFyYW1ldGVycyBieSBwb3NpdGlvbiBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBuYW1lYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKG1lc3NhZ2UucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGFyTm90aWZpY2F0aW9uSGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICBzdGFyTm90aWZpY2F0aW9uSGFuZGxlcihtZXNzYWdlLm1ldGhvZCwgbWVzc2FnZS5wYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvci5tZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgTm90aWZpY2F0aW9uIGhhbmRsZXIgJyR7bWVzc2FnZS5tZXRob2R9JyBmYWlsZWQgd2l0aCBtZXNzYWdlOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYE5vdGlmaWNhdGlvbiBoYW5kbGVyICcke21lc3NhZ2UubWV0aG9kfScgZmFpbGVkIHVuZXhwZWN0ZWRseS5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1bmhhbmRsZWROb3RpZmljYXRpb25FbWl0dGVyLmZpcmUobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlSW52YWxpZE1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignUmVjZWl2ZWQgZW1wdHkgbWVzc2FnZS4nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsb2dnZXIuZXJyb3IoYFJlY2VpdmVkIG1lc3NhZ2Ugd2hpY2ggaXMgbmVpdGhlciBhIHJlc3BvbnNlIG5vciBhIG5vdGlmaWNhdGlvbiBtZXNzYWdlOlxcbiR7SlNPTi5zdHJpbmdpZnkobWVzc2FnZSwgbnVsbCwgNCl9YCk7XG4gICAgICAgIC8vIFRlc3Qgd2hldGhlciB3ZSBmaW5kIGFuIGlkIHRvIHJlamVjdCB0aGUgcHJvbWlzZVxuICAgICAgICBjb25zdCByZXNwb25zZU1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICBpZiAoSXMuc3RyaW5nKHJlc3BvbnNlTWVzc2FnZS5pZCkgfHwgSXMubnVtYmVyKHJlc3BvbnNlTWVzc2FnZS5pZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHJlc3BvbnNlTWVzc2FnZS5pZDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxlciA9IHJlc3BvbnNlUHJvbWlzZXMuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VIYW5kbGVyLnJlamVjdChuZXcgRXJyb3IoJ1RoZSByZWNlaXZlZCByZXNwb25zZSBoYXMgbmVpdGhlciBhIHJlc3VsdCBub3IgYW4gZXJyb3IgcHJvcGVydHkuJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0cmluZ2lmeVRyYWNlKHBhcmFtcykge1xuICAgICAgICBpZiAocGFyYW1zID09PSB1bmRlZmluZWQgfHwgcGFyYW1zID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAodHJhY2UpIHtcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuVmVyYm9zZTpcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGFyYW1zLCBudWxsLCA0KTtcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuQ29tcGFjdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGFyYW1zKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVNlbmRpbmdSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFjZUZvcm1hdCA9PT0gVHJhY2VGb3JtYXQuVGV4dCkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSAmJiBtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBgUGFyYW1zOiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucGFyYW1zKX1cXG5cXG5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJhY2VyLmxvZyhgU2VuZGluZyByZXF1ZXN0ICcke21lc3NhZ2UubWV0aG9kfSAtICgke21lc3NhZ2UuaWR9KScuYCwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb2dMU1BNZXNzYWdlKCdzZW5kLXJlcXVlc3QnLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVNlbmRpbmdOb3RpZmljYXRpb24obWVzc2FnZSkge1xuICAgICAgICBpZiAodHJhY2UgPT09IFRyYWNlLk9mZiB8fCAhdHJhY2VyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYWNlRm9ybWF0ID09PSBUcmFjZUZvcm1hdC5UZXh0KSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdCkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0gYFBhcmFtczogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLnBhcmFtcyl9XFxuXFxuYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSAnTm8gcGFyYW1ldGVycyBwcm92aWRlZC5cXG5cXG4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFNlbmRpbmcgbm90aWZpY2F0aW9uICcke21lc3NhZ2UubWV0aG9kfScuYCwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb2dMU1BNZXNzYWdlKCdzZW5kLW5vdGlmaWNhdGlvbicsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhY2VGb3JtYXQgPT09IFRyYWNlRm9ybWF0LlRleHQpIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZXJyb3IgJiYgbWVzc2FnZS5lcnJvci5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgRXJyb3IgZGF0YTogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLmVycm9yLmRhdGEpfVxcblxcbmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgUmVzdWx0OiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucmVzdWx0KX1cXG5cXG5gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UuZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9ICdObyByZXN1bHQgcmV0dXJuZWQuXFxuXFxuJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFNlbmRpbmcgcmVzcG9uc2UgJyR7bWV0aG9kfSAtICgke21lc3NhZ2UuaWR9KScuIFByb2Nlc3NpbmcgcmVxdWVzdCB0b29rICR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1tc2AsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgnc2VuZC1yZXNwb25zZScsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYWNlUmVjZWl2ZWRSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFjZUZvcm1hdCA9PT0gVHJhY2VGb3JtYXQuVGV4dCkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSAmJiBtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBgUGFyYW1zOiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucGFyYW1zKX1cXG5cXG5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJhY2VyLmxvZyhgUmVjZWl2ZWQgcmVxdWVzdCAnJHttZXNzYWdlLm1ldGhvZH0gLSAoJHttZXNzYWdlLmlkfSknLmAsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1yZXF1ZXN0JywgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdHJhY2VSZWNlaXZlZE5vdGlmaWNhdGlvbihtZXNzYWdlKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIgfHwgbWVzc2FnZS5tZXRob2QgPT09IExvZ1RyYWNlTm90aWZpY2F0aW9uLnR5cGUubWV0aG9kKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYWNlRm9ybWF0ID09PSBUcmFjZUZvcm1hdC5UZXh0KSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdCkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0gYFBhcmFtczogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLnBhcmFtcyl9XFxuXFxuYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSAnTm8gcGFyYW1ldGVycyBwcm92aWRlZC5cXG5cXG4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFJlY2VpdmVkIG5vdGlmaWNhdGlvbiAnJHttZXNzYWdlLm1ldGhvZH0nLmAsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1ub3RpZmljYXRpb24nLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVJlY2VpdmVkUmVzcG9uc2UobWVzc2FnZSwgcmVzcG9uc2VQcm9taXNlKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhY2VGb3JtYXQgPT09IFRyYWNlRm9ybWF0LlRleHQpIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZXJyb3IgJiYgbWVzc2FnZS5lcnJvci5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgRXJyb3IgZGF0YTogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLmVycm9yLmRhdGEpfVxcblxcbmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgUmVzdWx0OiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucmVzdWx0KX1cXG5cXG5gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UuZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9ICdObyByZXN1bHQgcmV0dXJuZWQuXFxuXFxuJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXNwb25zZVByb21pc2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IG1lc3NhZ2UuZXJyb3IgPyBgIFJlcXVlc3QgZmFpbGVkOiAke21lc3NhZ2UuZXJyb3IubWVzc2FnZX0gKCR7bWVzc2FnZS5lcnJvci5jb2RlfSkuYCA6ICcnO1xuICAgICAgICAgICAgICAgIHRyYWNlci5sb2coYFJlY2VpdmVkIHJlc3BvbnNlICcke3Jlc3BvbnNlUHJvbWlzZS5tZXRob2R9IC0gKCR7bWVzc2FnZS5pZH0pJyBpbiAke0RhdGUubm93KCkgLSByZXNwb25zZVByb21pc2UudGltZXJTdGFydH1tcy4ke2Vycm9yfWAsIGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJhY2VyLmxvZyhgUmVjZWl2ZWQgcmVzcG9uc2UgJHttZXNzYWdlLmlkfSB3aXRob3V0IGFjdGl2ZSByZXNwb25zZSBwcm9taXNlLmAsIGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1yZXNwb25zZScsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGxvZ0xTUE1lc3NhZ2UodHlwZSwgbWVzc2FnZSkge1xuICAgICAgICBpZiAoIXRyYWNlciB8fCB0cmFjZSA9PT0gVHJhY2UuT2ZmKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbHNwTWVzc2FnZSA9IHtcbiAgICAgICAgICAgIGlzTFNQTWVzc2FnZTogdHJ1ZSxcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpXG4gICAgICAgIH07XG4gICAgICAgIHRyYWNlci5sb2cobHNwTWVzc2FnZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRocm93SWZDbG9zZWRPckRpc3Bvc2VkKCkge1xuICAgICAgICBpZiAoaXNDbG9zZWQoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IENvbm5lY3Rpb25FcnJvcihDb25uZWN0aW9uRXJyb3JzLkNsb3NlZCwgJ0Nvbm5lY3Rpb24gaXMgY2xvc2VkLicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0Rpc3Bvc2VkKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb25uZWN0aW9uRXJyb3IoQ29ubmVjdGlvbkVycm9ycy5EaXNwb3NlZCwgJ0Nvbm5lY3Rpb24gaXMgZGlzcG9zZWQuJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdGhyb3dJZkxpc3RlbmluZygpIHtcbiAgICAgICAgaWYgKGlzTGlzdGVuaW5nKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb25uZWN0aW9uRXJyb3IoQ29ubmVjdGlvbkVycm9ycy5BbHJlYWR5TGlzdGVuaW5nLCAnQ29ubmVjdGlvbiBpcyBhbHJlYWR5IGxpc3RlbmluZycpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRocm93SWZOb3RMaXN0ZW5pbmcoKSB7XG4gICAgICAgIGlmICghaXNMaXN0ZW5pbmcoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYWxsIGxpc3RlbigpIGZpcnN0LicpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVuZGVmaW5lZFRvTnVsbChwYXJhbSkge1xuICAgICAgICBpZiAocGFyYW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyYW07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gbnVsbFRvVW5kZWZpbmVkKHBhcmFtKSB7XG4gICAgICAgIGlmIChwYXJhbSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJhbTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBpc05hbWVkUGFyYW0ocGFyYW0pIHtcbiAgICAgICAgcmV0dXJuIHBhcmFtICE9PSB1bmRlZmluZWQgJiYgcGFyYW0gIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkocGFyYW0pICYmIHR5cGVvZiBwYXJhbSA9PT0gJ29iamVjdCc7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXB1dGVTaW5nbGVQYXJhbShwYXJhbWV0ZXJTdHJ1Y3R1cmVzLCBwYXJhbSkge1xuICAgICAgICBzd2l0Y2ggKHBhcmFtZXRlclN0cnVjdHVyZXMpIHtcbiAgICAgICAgICAgIGNhc2UgbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG86XG4gICAgICAgICAgICAgICAgaWYgKGlzTmFtZWRQYXJhbShwYXJhbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxUb1VuZGVmaW5lZChwYXJhbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3VuZGVmaW5lZFRvTnVsbChwYXJhbSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZTpcbiAgICAgICAgICAgICAgICBpZiAoIWlzTmFtZWRQYXJhbShwYXJhbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWNlaXZlZCBwYXJhbWV0ZXJzIGJ5IG5hbWUgYnV0IHBhcmFtIGlzIG5vdCBhbiBvYmplY3QgbGl0ZXJhbC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGxUb1VuZGVmaW5lZChwYXJhbSk7XG4gICAgICAgICAgICBjYXNlIG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieVBvc2l0aW9uOlxuICAgICAgICAgICAgICAgIHJldHVybiBbdW5kZWZpbmVkVG9OdWxsKHBhcmFtKV07XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBwYXJhbWV0ZXIgc3RydWN0dXJlICR7cGFyYW1ldGVyU3RydWN0dXJlcy50b1N0cmluZygpfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXB1dGVNZXNzYWdlUGFyYW1zKHR5cGUsIHBhcmFtcykge1xuICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICBjb25zdCBudW1iZXJPZlBhcmFtcyA9IHR5cGUubnVtYmVyT2ZQYXJhbXM7XG4gICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gY29tcHV0ZVNpbmdsZVBhcmFtKHR5cGUucGFyYW1ldGVyU3RydWN0dXJlcywgcGFyYW1zWzBdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoICYmIGkgPCBudW1iZXJPZlBhcmFtczsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHVuZGVmaW5lZFRvTnVsbChwYXJhbXNbaV0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPCBudW1iZXJPZlBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gcGFyYW1zLmxlbmd0aDsgaSA8IG51bWJlck9mUGFyYW1zOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB7XG4gICAgICAgIHNlbmROb3RpZmljYXRpb246ICh0eXBlLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlUGFyYW1zO1xuICAgICAgICAgICAgaWYgKElzLnN0cmluZyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICAgIGxldCBwYXJhbVN0YXJ0ID0gMDtcbiAgICAgICAgICAgICAgICBsZXQgcGFyYW1ldGVyU3RydWN0dXJlcyA9IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvO1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuaXMoZmlyc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtU3RhcnQgPSAxO1xuICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gZmlyc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBwYXJhbUVuZCA9IGFyZ3MubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gcGFyYW1FbmQgLSBwYXJhbVN0YXJ0O1xuICAgICAgICAgICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zID0gY29tcHV0ZVNpbmdsZVBhcmFtKHBhcmFtZXRlclN0cnVjdHVyZXMsIGFyZ3NbcGFyYW1TdGFydF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjZWl2ZWQgJHtudW1iZXJPZlBhcmFtc30gcGFyYW1ldGVycyBmb3IgJ2J5IE5hbWUnIG5vdGlmaWNhdGlvbiBwYXJhbWV0ZXIgc3RydWN0dXJlLmApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IGFyZ3Muc2xpY2UocGFyYW1TdGFydCwgcGFyYW1FbmQpLm1hcCh2YWx1ZSA9PiB1bmRlZmluZWRUb051bGwodmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IGFyZ3M7XG4gICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZS5tZXRob2Q7XG4gICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IGNvbXB1dGVNZXNzYWdlUGFyYW1zKHR5cGUsIHBhcmFtcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBub3RpZmljYXRpb25NZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBtZXNzYWdlUGFyYW1zXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdHJhY2VTZW5kaW5nTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbk1lc3NhZ2UpO1xuICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2VXcml0ZXIud3JpdGUobm90aWZpY2F0aW9uTWVzc2FnZSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBTZW5kaW5nIG5vdGlmaWNhdGlvbiBmYWlsZWQuYCk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25Ob3RpZmljYXRpb246ICh0eXBlLCBoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGlmIChJcy5mdW5jKHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB0eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaGFuZGxlcikge1xuICAgICAgICAgICAgICAgIGlmIChJcy5zdHJpbmcodHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZTtcbiAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uSGFuZGxlcnMuc2V0KHR5cGUsIHsgdHlwZTogdW5kZWZpbmVkLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZS5tZXRob2Q7XG4gICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXJzLnNldCh0eXBlLm1ldGhvZCwgeyB0eXBlLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXJzLmRlbGV0ZShtZXRob2QpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBvblByb2dyZXNzOiAoX3R5cGUsIHRva2VuLCBoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgICBpZiAocHJvZ3Jlc3NIYW5kbGVycy5oYXModG9rZW4pKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm9ncmVzcyBoYW5kbGVyIGZvciB0b2tlbiAke3Rva2VufSBhbHJlYWR5IHJlZ2lzdGVyZWRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByb2dyZXNzSGFuZGxlcnMuc2V0KHRva2VuLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc0hhbmRsZXJzLmRlbGV0ZSh0b2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgc2VuZFByb2dyZXNzOiAoX3R5cGUsIHRva2VuLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGF3YWl0IGJ1dCBzaW1wbGUgcmV0dXJuIHRvIGVuc3VyZSB0aGF0IHdlIGRvbid0IGhhdmUgYW5vdGhlclxuICAgICAgICAgICAgLy8gYXN5bmMgc2NoZWR1bGluZy4gT3RoZXJ3aXNlIG9uZSBzZW5kIGNvdWxkIG92ZXJ0YWtlIGFub3RoZXIgc2VuZC5cbiAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLnNlbmROb3RpZmljYXRpb24oUHJvZ3Jlc3NOb3RpZmljYXRpb24udHlwZSwgeyB0b2tlbiwgdmFsdWUgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uVW5oYW5kbGVkUHJvZ3Jlc3M6IHVuaGFuZGxlZFByb2dyZXNzRW1pdHRlci5ldmVudCxcbiAgICAgICAgc2VuZFJlcXVlc3Q6ICh0eXBlLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgdGhyb3dJZk5vdExpc3RlbmluZygpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlUGFyYW1zO1xuICAgICAgICAgICAgbGV0IHRva2VuID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKElzLnN0cmluZyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3QgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgbGV0IHBhcmFtU3RhcnQgPSAwO1xuICAgICAgICAgICAgICAgIGxldCBwYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG87XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5pcyhmaXJzdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1TdGFydCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlclN0cnVjdHVyZXMgPSBmaXJzdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHBhcmFtRW5kID0gYXJncy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuLmlzKGxhc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtRW5kID0gcGFyYW1FbmQgLSAxO1xuICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IGxhc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gcGFyYW1FbmQgLSBwYXJhbVN0YXJ0O1xuICAgICAgICAgICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zID0gY29tcHV0ZVNpbmdsZVBhcmFtKHBhcmFtZXRlclN0cnVjdHVyZXMsIGFyZ3NbcGFyYW1TdGFydF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjZWl2ZWQgJHtudW1iZXJPZlBhcmFtc30gcGFyYW1ldGVycyBmb3IgJ2J5IE5hbWUnIHJlcXVlc3QgcGFyYW1ldGVyIHN0cnVjdHVyZS5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMgPSBhcmdzLnNsaWNlKHBhcmFtU3RhcnQsIHBhcmFtRW5kKS5tYXAodmFsdWUgPT4gdW5kZWZpbmVkVG9OdWxsKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBhcmdzO1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGUubWV0aG9kO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMgPSBjb21wdXRlTWVzc2FnZVBhcmFtcyh0eXBlLCBwYXJhbXMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gdHlwZS5udW1iZXJPZlBhcmFtcztcbiAgICAgICAgICAgICAgICB0b2tlbiA9IGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuLmlzKHBhcmFtc1tudW1iZXJPZlBhcmFtc10pID8gcGFyYW1zW251bWJlck9mUGFyYW1zXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGlkID0gc2VxdWVuY2VOdW1iZXIrKztcbiAgICAgICAgICAgIGxldCBkaXNwb3NhYmxlO1xuICAgICAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgICAgICAgZGlzcG9zYWJsZSA9IHRva2VuLm9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcCA9IGNhbmNlbGxhdGlvblN0cmF0ZWd5LnNlbmRlci5zZW5kQ2FuY2VsbGF0aW9uKGNvbm5lY3Rpb24sIGlkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhgUmVjZWl2ZWQgbm8gcHJvbWlzZSBmcm9tIGNhbmNlbGxhdGlvbiBzdHJhdGVneSB3aGVuIGNhbmNlbGxpbmcgaWQgJHtpZH1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIubG9nKGBTZW5kaW5nIGNhbmNlbGxhdGlvbiBtZXNzYWdlcyBmb3IgaWQgJHtpZH0gZmFpbGVkYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdE1lc3NhZ2UgPSB7XG4gICAgICAgICAgICAgICAganNvbnJwYzogdmVyc2lvbixcbiAgICAgICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBtZXNzYWdlUGFyYW1zXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdHJhY2VTZW5kaW5nUmVxdWVzdChyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNhbmNlbGxhdGlvblN0cmF0ZWd5LnNlbmRlci5lbmFibGVDYW5jZWxsYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25TdHJhdGVneS5zZW5kZXIuZW5hYmxlQ2FuY2VsbGF0aW9uKHJlcXVlc3RNZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZVdpdGhDbGVhbnVwID0gKHIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyKTtcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uU3RyYXRlZ3kuc2VuZGVyLmNsZWFudXAoaWQpO1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlPy5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWplY3RXaXRoQ2xlYW51cCA9IChyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChyKTtcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uU3RyYXRlZ3kuc2VuZGVyLmNsZWFudXAoaWQpO1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlPy5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZVByb21pc2UgPSB7IG1ldGhvZDogbWV0aG9kLCB0aW1lclN0YXJ0OiBEYXRlLm5vdygpLCByZXNvbHZlOiByZXNvbHZlV2l0aENsZWFudXAsIHJlamVjdDogcmVqZWN0V2l0aENsZWFudXAgfTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2VzLnNldChpZCwgcmVzcG9uc2VQcm9taXNlKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbWVzc2FnZVdyaXRlci53cml0ZShyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAvLyBXcml0aW5nIHRoZSBtZXNzYWdlIGZhaWxlZC4gU28gd2UgbmVlZCB0byBkZWxldGUgaXQgZnJvbSB0aGUgcmVzcG9uc2UgcHJvbWlzZXMgYW5kXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlamVjdCBpdC5cbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlcy5kZWxldGUoaWQpO1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2UucmVqZWN0KG5ldyBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IobWVzc2FnZXNfMS5FcnJvckNvZGVzLk1lc3NhZ2VXcml0ZUVycm9yLCBlcnJvci5tZXNzYWdlID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIHJlYXNvbicpKTtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlcXVlc3QgZmFpbGVkLmApO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25SZXF1ZXN0OiAodHlwZSwgaGFuZGxlcikgPT4ge1xuICAgICAgICAgICAgdGhyb3dJZkNsb3NlZE9yRGlzcG9zZWQoKTtcbiAgICAgICAgICAgIGxldCBtZXRob2QgPSBudWxsO1xuICAgICAgICAgICAgaWYgKFN0YXJSZXF1ZXN0SGFuZGxlci5pcyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBzdGFyUmVxdWVzdEhhbmRsZXIgPSB0eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoSXMuc3RyaW5nKHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgbWV0aG9kID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoaGFuZGxlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RIYW5kbGVycy5zZXQodHlwZSwgeyBoYW5kbGVyOiBoYW5kbGVyLCB0eXBlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSB0eXBlLm1ldGhvZDtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEhhbmRsZXJzLnNldCh0eXBlLm1ldGhvZCwgeyB0eXBlLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SGFuZGxlcnMuZGVsZXRlKG1ldGhvZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFyUmVxdWVzdEhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBoYXNQZW5kaW5nUmVzcG9uc2U6ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZVByb21pc2VzLnNpemUgPiAwO1xuICAgICAgICB9LFxuICAgICAgICB0cmFjZTogYXN5bmMgKF92YWx1ZSwgX3RyYWNlciwgc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBsZXQgX3NlbmROb3RpZmljYXRpb24gPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBfdHJhY2VGb3JtYXQgPSBUcmFjZUZvcm1hdC5UZXh0O1xuICAgICAgICAgICAgaWYgKHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKElzLmJvb2xlYW4oc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zKSkge1xuICAgICAgICAgICAgICAgICAgICBfc2VuZE5vdGlmaWNhdGlvbiA9IHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF9zZW5kTm90aWZpY2F0aW9uID0gc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zLnNlbmROb3RpZmljYXRpb24gfHwgZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIF90cmFjZUZvcm1hdCA9IHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucy50cmFjZUZvcm1hdCB8fCBUcmFjZUZvcm1hdC5UZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlID0gX3ZhbHVlO1xuICAgICAgICAgICAgdHJhY2VGb3JtYXQgPSBfdHJhY2VGb3JtYXQ7XG4gICAgICAgICAgICBpZiAodHJhY2UgPT09IFRyYWNlLk9mZikge1xuICAgICAgICAgICAgICAgIHRyYWNlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRyYWNlciA9IF90cmFjZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoX3NlbmROb3RpZmljYXRpb24gJiYgIWlzQ2xvc2VkKCkgJiYgIWlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGNvbm5lY3Rpb24uc2VuZE5vdGlmaWNhdGlvbihTZXRUcmFjZU5vdGlmaWNhdGlvbi50eXBlLCB7IHZhbHVlOiBUcmFjZS50b1N0cmluZyhfdmFsdWUpIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBvbkVycm9yOiBlcnJvckVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIG9uQ2xvc2U6IGNsb3NlRW1pdHRlci5ldmVudCxcbiAgICAgICAgb25VbmhhbmRsZWROb3RpZmljYXRpb246IHVuaGFuZGxlZE5vdGlmaWNhdGlvbkVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIG9uRGlzcG9zZTogZGlzcG9zZUVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIGVuZDogKCkgPT4ge1xuICAgICAgICAgICAgbWVzc2FnZVdyaXRlci5lbmQoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLkRpc3Bvc2VkO1xuICAgICAgICAgICAgZGlzcG9zZUVtaXR0ZXIuZmlyZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5QZW5kaW5nUmVzcG9uc2VSZWplY3RlZCwgJ1BlbmRpbmcgcmVzcG9uc2UgcmVqZWN0ZWQgc2luY2UgY29ubmVjdGlvbiBnb3QgZGlzcG9zZWQnKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvbWlzZSBvZiByZXNwb25zZVByb21pc2VzLnZhbHVlcygpKSB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBrbm93bkNhbmNlbGVkUmVxdWVzdHMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICBtZXNzYWdlUXVldWUgPSBuZXcgbGlua2VkTWFwXzEuTGlua2VkTWFwKCk7XG4gICAgICAgICAgICAvLyBUZXN0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgaWYgKElzLmZ1bmMobWVzc2FnZVdyaXRlci5kaXNwb3NlKSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKElzLmZ1bmMobWVzc2FnZVJlYWRlci5kaXNwb3NlKSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VSZWFkZXIuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBsaXN0ZW46ICgpID0+IHtcbiAgICAgICAgICAgIHRocm93SWZDbG9zZWRPckRpc3Bvc2VkKCk7XG4gICAgICAgICAgICB0aHJvd0lmTGlzdGVuaW5nKCk7XG4gICAgICAgICAgICBzdGF0ZSA9IENvbm5lY3Rpb25TdGF0ZS5MaXN0ZW5pbmc7XG4gICAgICAgICAgICBtZXNzYWdlUmVhZGVyLmxpc3RlbihjYWxsYmFjayk7XG4gICAgICAgIH0sXG4gICAgICAgIGluc3BlY3Q6ICgpID0+IHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS5jb25zb2xlLmxvZygnaW5zcGVjdCcpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25uZWN0aW9uLm9uTm90aWZpY2F0aW9uKExvZ1RyYWNlTm90aWZpY2F0aW9uLnR5cGUsIChwYXJhbXMpID0+IHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZlcmJvc2UgPSB0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdDtcbiAgICAgICAgdHJhY2VyLmxvZyhwYXJhbXMubWVzc2FnZSwgdmVyYm9zZSA/IHBhcmFtcy52ZXJib3NlIDogdW5kZWZpbmVkKTtcbiAgICB9KTtcbiAgICBjb25uZWN0aW9uLm9uTm90aWZpY2F0aW9uKFByb2dyZXNzTm90aWZpY2F0aW9uLnR5cGUsIChwYXJhbXMpID0+IHtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IHByb2dyZXNzSGFuZGxlcnMuZ2V0KHBhcmFtcy50b2tlbik7XG4gICAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICAgICBoYW5kbGVyKHBhcmFtcy52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1bmhhbmRsZWRQcm9ncmVzc0VtaXR0ZXIuZmlyZShwYXJhbXMpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbm5lY3Rpb247XG59XG5leHBvcnRzLmNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uID0gY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb247XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vdHlwaW5ncy90aGVuYWJsZS5kLnRzXCIgLz5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUHJvZ3Jlc3NUeXBlID0gZXhwb3J0cy5Qcm9ncmVzc1Rva2VuID0gZXhwb3J0cy5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiA9IGV4cG9ydHMuTnVsbExvZ2dlciA9IGV4cG9ydHMuQ29ubmVjdGlvbk9wdGlvbnMgPSBleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IGV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlQnVmZmVyID0gZXhwb3J0cy5Xcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyID0gZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLk1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLlJlYWRhYmxlU3RyZWFtTWVzc2FnZVJlYWRlciA9IGV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlUmVhZGVyID0gZXhwb3J0cy5NZXNzYWdlUmVhZGVyID0gZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblRva2VuID0gZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IGV4cG9ydHMuRW1pdHRlciA9IGV4cG9ydHMuRXZlbnQgPSBleHBvcnRzLkRpc3Bvc2FibGUgPSBleHBvcnRzLkxSVUNhY2hlID0gZXhwb3J0cy5Ub3VjaCA9IGV4cG9ydHMuTGlua2VkTWFwID0gZXhwb3J0cy5QYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlOSA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTggPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU3ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNiA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTUgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU0ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMyA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTIgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUxID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMCA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZSA9IGV4cG9ydHMuRXJyb3JDb2RlcyA9IGV4cG9ydHMuUmVzcG9uc2VFcnJvciA9IGV4cG9ydHMuUmVxdWVzdFR5cGU5ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTggPSBleHBvcnRzLlJlcXVlc3RUeXBlNyA9IGV4cG9ydHMuUmVxdWVzdFR5cGU2ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTUgPSBleHBvcnRzLlJlcXVlc3RUeXBlNCA9IGV4cG9ydHMuUmVxdWVzdFR5cGUzID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTIgPSBleHBvcnRzLlJlcXVlc3RUeXBlMSA9IGV4cG9ydHMuUmVxdWVzdFR5cGUwID0gZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IGV4cG9ydHMuTWVzc2FnZSA9IGV4cG9ydHMuUkFMID0gdm9pZCAwO1xuZXhwb3J0cy5NZXNzYWdlU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblN0cmF0ZWd5ID0gZXhwb3J0cy5DYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IGV4cG9ydHMuQ29ubmVjdGlvbkVycm9yID0gZXhwb3J0cy5Db25uZWN0aW9uRXJyb3JzID0gZXhwb3J0cy5Mb2dUcmFjZU5vdGlmaWNhdGlvbiA9IGV4cG9ydHMuU2V0VHJhY2VOb3RpZmljYXRpb24gPSBleHBvcnRzLlRyYWNlRm9ybWF0ID0gZXhwb3J0cy5UcmFjZVZhbHVlcyA9IGV4cG9ydHMuVHJhY2UgPSB2b2lkIDA7XG5jb25zdCBtZXNzYWdlc18xID0gcmVxdWlyZShcIi4vbWVzc2FnZXNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNZXNzYWdlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk1lc3NhZ2U7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlMFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTA7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTFcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGUxOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGUyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlMjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlM1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGU0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGU1XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlNTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlNlwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTY7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTdcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGU3OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGU4XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlODsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlOVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTk7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXNwb25zZUVycm9yXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3I7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJFcnJvckNvZGVzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLkVycm9yQ29kZXM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlMFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlMDsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGUxXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGUxOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZTJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlM1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlMzsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGU0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZTVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlNlwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlNjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGU3XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU3OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZThcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTg7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlOVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlOTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlBhcmFtZXRlclN0cnVjdHVyZXNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlczsgfSB9KTtcbmNvbnN0IGxpbmtlZE1hcF8xID0gcmVxdWlyZShcIi4vbGlua2VkTWFwXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTGlua2VkTWFwXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBsaW5rZWRNYXBfMS5MaW5rZWRNYXA7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJMUlVDYWNoZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbGlua2VkTWFwXzEuTFJVQ2FjaGU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJUb3VjaFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbGlua2VkTWFwXzEuVG91Y2g7IH0gfSk7XG5jb25zdCBkaXNwb3NhYmxlXzEgPSByZXF1aXJlKFwiLi9kaXNwb3NhYmxlXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiRGlzcG9zYWJsZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZGlzcG9zYWJsZV8xLkRpc3Bvc2FibGU7IH0gfSk7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCIuL2V2ZW50c1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkV2ZW50XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBldmVudHNfMS5FdmVudDsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkVtaXR0ZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGV2ZW50c18xLkVtaXR0ZXI7IH0gfSk7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblRva2VuU291cmNlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjYW5jZWxsYXRpb25fMS5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblRva2VuXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjYW5jZWxsYXRpb25fMS5DYW5jZWxsYXRpb25Ub2tlbjsgfSB9KTtcbmNvbnN0IHNoYXJlZEFycmF5Q2FuY2VsbGF0aW9uXzEgPSByZXF1aXJlKFwiLi9zaGFyZWRBcnJheUNhbmNlbGxhdGlvblwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHNoYXJlZEFycmF5Q2FuY2VsbGF0aW9uXzEuU2hhcmVkQXJyYXlTZW5kZXJTdHJhdGVneTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlNoYXJlZEFycmF5UmVjZWl2ZXJTdHJhdGVneVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gc2hhcmVkQXJyYXlDYW5jZWxsYXRpb25fMS5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3k7IH0gfSk7XG5jb25zdCBtZXNzYWdlUmVhZGVyXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlUmVhZGVyXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTWVzc2FnZVJlYWRlclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZVJlYWRlcl8xLk1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VSZWFkZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VSZWFkZXJfMS5BYnN0cmFjdE1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VSZWFkZXJfMS5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5jb25zdCBtZXNzYWdlV3JpdGVyXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlV3JpdGVyXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTWVzc2FnZVdyaXRlclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZVdyaXRlcl8xLk1lc3NhZ2VXcml0ZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VXcml0ZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VXcml0ZXJfMS5BYnN0cmFjdE1lc3NhZ2VXcml0ZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJXcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlV3JpdGVyXzEuV3JpdGVhYmxlU3RyZWFtTWVzc2FnZVdyaXRlcjsgfSB9KTtcbmNvbnN0IG1lc3NhZ2VCdWZmZXJfMSA9IHJlcXVpcmUoXCIuL21lc3NhZ2VCdWZmZXJcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VCdWZmZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VCdWZmZXJfMS5BYnN0cmFjdE1lc3NhZ2VCdWZmZXI7IH0gfSk7XG5jb25zdCBjb25uZWN0aW9uXzEgPSByZXF1aXJlKFwiLi9jb25uZWN0aW9uXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29ubmVjdGlvblN0cmF0ZWd5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ29ubmVjdGlvblN0cmF0ZWd5OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29ubmVjdGlvbk9wdGlvbnNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5Db25uZWN0aW9uT3B0aW9uczsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk51bGxMb2dnZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5OdWxsTG9nZ2VyOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb25cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlByb2dyZXNzVG9rZW5cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5Qcm9ncmVzc1Rva2VuOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUHJvZ3Jlc3NUeXBlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuUHJvZ3Jlc3NUeXBlOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiVHJhY2VcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5UcmFjZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlRyYWNlVmFsdWVzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuVHJhY2VWYWx1ZXM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJUcmFjZUZvcm1hdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29ubmVjdGlvbl8xLlRyYWNlRm9ybWF0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiU2V0VHJhY2VOb3RpZmljYXRpb25cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5TZXRUcmFjZU5vdGlmaWNhdGlvbjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkxvZ1RyYWNlTm90aWZpY2F0aW9uXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuTG9nVHJhY2VOb3RpZmljYXRpb247IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJDb25uZWN0aW9uRXJyb3JzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ29ubmVjdGlvbkVycm9yczsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNvbm5lY3Rpb25FcnJvclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29ubmVjdGlvbl8xLkNvbm5lY3Rpb25FcnJvcjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5DYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5DYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblN0cmF0ZWd5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ2FuY2VsbGF0aW9uU3RyYXRlZ3k7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNZXNzYWdlU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5NZXNzYWdlU3RyYXRlZ3k7IH0gfSk7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbmV4cG9ydHMuUkFMID0gcmFsXzEuZGVmYXVsdDtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGFwaV8xID0gcmVxdWlyZShcIi4uL2NvbW1vbi9hcGlcIik7XG5jbGFzcyBNZXNzYWdlQnVmZmVyIGV4dGVuZHMgYXBpXzEuQWJzdHJhY3RNZXNzYWdlQnVmZmVyIHtcbiAgICBjb25zdHJ1Y3RvcihlbmNvZGluZyA9ICd1dGYtOCcpIHtcbiAgICAgICAgc3VwZXIoZW5jb2RpbmcpO1xuICAgICAgICB0aGlzLmFzY2lpRGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcignYXNjaWknKTtcbiAgICB9XG4gICAgZW1wdHlCdWZmZXIoKSB7XG4gICAgICAgIHJldHVybiBNZXNzYWdlQnVmZmVyLmVtcHR5QnVmZmVyO1xuICAgIH1cbiAgICBmcm9tU3RyaW5nKHZhbHVlLCBfZW5jb2RpbmcpIHtcbiAgICAgICAgcmV0dXJuIChuZXcgVGV4dEVuY29kZXIoKSkuZW5jb2RlKHZhbHVlKTtcbiAgICB9XG4gICAgdG9TdHJpbmcodmFsdWUsIGVuY29kaW5nKSB7XG4gICAgICAgIGlmIChlbmNvZGluZyA9PT0gJ2FzY2lpJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXNjaWlEZWNvZGVyLmRlY29kZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gKG5ldyBUZXh0RGVjb2RlcihlbmNvZGluZykpLmRlY29kZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXNOYXRpdmUoYnVmZmVyLCBsZW5ndGgpIHtcbiAgICAgICAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlci5zbGljZSgwLCBsZW5ndGgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFsbG9jTmF0aXZlKGxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTtcbiAgICB9XG59XG5NZXNzYWdlQnVmZmVyLmVtcHR5QnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMCk7XG5jbGFzcyBSZWFkYWJsZVN0cmVhbVdyYXBwZXIge1xuICAgIGNvbnN0cnVjdG9yKHNvY2tldCkge1xuICAgICAgICB0aGlzLnNvY2tldCA9IHNvY2tldDtcbiAgICAgICAgdGhpcy5fb25EYXRhID0gbmV3IGFwaV8xLkVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5fbWVzc2FnZUxpc3RlbmVyID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBibG9iID0gZXZlbnQuZGF0YTtcbiAgICAgICAgICAgIGJsb2IuYXJyYXlCdWZmZXIoKS50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkRhdGEuZmlyZShuZXcgVWludDhBcnJheShidWZmZXIpKTtcbiAgICAgICAgICAgIH0sICgpID0+IHtcbiAgICAgICAgICAgICAgICAoMCwgYXBpXzEuUkFMKSgpLmNvbnNvbGUuZXJyb3IoYENvbnZlcnRpbmcgYmxvYiB0byBhcnJheSBidWZmZXIgZmFpbGVkLmApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLl9tZXNzYWdlTGlzdGVuZXIpO1xuICAgIH1cbiAgICBvbkNsb3NlKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2Nsb3NlJywgbGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gYXBpXzEuRGlzcG9zYWJsZS5jcmVhdGUoKCkgPT4gdGhpcy5zb2NrZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xvc2UnLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkVycm9yKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgbGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gYXBpXzEuRGlzcG9zYWJsZS5jcmVhdGUoKCkgPT4gdGhpcy5zb2NrZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkVuZChsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKCdlbmQnLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdlbmQnLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkRhdGEobGlzdGVuZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uRGF0YS5ldmVudChsaXN0ZW5lcik7XG4gICAgfVxufVxuY2xhc3MgV3JpdGFibGVTdHJlYW1XcmFwcGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihzb2NrZXQpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7XG4gICAgfVxuICAgIG9uQ2xvc2UobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignY2xvc2UnLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbG9zZScsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIG9uRXJyb3IobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIG9uRW5kKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2VuZCcsIGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIGFwaV8xLkRpc3Bvc2FibGUuY3JlYXRlKCgpID0+IHRoaXMuc29ja2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2VuZCcsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIHdyaXRlKGRhdGEsIGVuY29kaW5nKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkICYmIGVuY29kaW5nICE9PSAndXRmLTgnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbiBhIEJyb3dzZXIgZW52aXJvbm1lbnRzIG9ubHkgdXRmLTggdGV4dCBlbmNvZGluZyBpcyBzdXBwb3J0ZWQuIEJ1dCBnb3QgZW5jb2Rpbmc6ICR7ZW5jb2Rpbmd9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKTtcbiAgICB9XG59XG5jb25zdCBfdGV4dEVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbmNvbnN0IF9yaWwgPSBPYmplY3QuZnJlZXplKHtcbiAgICBtZXNzYWdlQnVmZmVyOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgY3JlYXRlOiAoZW5jb2RpbmcpID0+IG5ldyBNZXNzYWdlQnVmZmVyKGVuY29kaW5nKVxuICAgIH0pLFxuICAgIGFwcGxpY2F0aW9uSnNvbjogT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGVuY29kZXI6IE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgbmFtZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgZW5jb2RlOiAobXNnLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2hhcnNldCAhPT0gJ3V0Zi04Jykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluIGEgQnJvd3NlciBlbnZpcm9ubWVudHMgb25seSB1dGYtOCB0ZXh0IGVuY29kaW5nIGlzIHN1cHBvcnRlZC4gQnV0IGdvdCBlbmNvZGluZzogJHtvcHRpb25zLmNoYXJzZXR9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoX3RleHRFbmNvZGVyLmVuY29kZShKU09OLnN0cmluZ2lmeShtc2csIHVuZGVmaW5lZCwgMCkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIGRlY29kZXI6IE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgbmFtZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgZGVjb2RlOiAoYnVmZmVyLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCEoYnVmZmVyIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbiBhIEJyb3dzZXIgZW52aXJvbm1lbnRzIG9ubHkgVWludDhBcnJheXMgYXJlIHN1cHBvcnRlZC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShKU09OLnBhcnNlKG5ldyBUZXh0RGVjb2RlcihvcHRpb25zLmNoYXJzZXQpLmRlY29kZShidWZmZXIpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfSksXG4gICAgc3RyZWFtOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgYXNSZWFkYWJsZVN0cmVhbTogKHNvY2tldCkgPT4gbmV3IFJlYWRhYmxlU3RyZWFtV3JhcHBlcihzb2NrZXQpLFxuICAgICAgICBhc1dyaXRhYmxlU3RyZWFtOiAoc29ja2V0KSA9PiBuZXcgV3JpdGFibGVTdHJlYW1XcmFwcGVyKHNvY2tldClcbiAgICB9KSxcbiAgICBjb25zb2xlOiBjb25zb2xlLFxuICAgIHRpbWVyOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgc2V0VGltZW91dChjYWxsYmFjaywgbXMsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHNldFRpbWVvdXQoY2FsbGJhY2ssIG1zLCAuLi5hcmdzKTtcbiAgICAgICAgICAgIHJldHVybiB7IGRpc3Bvc2U6ICgpID0+IGNsZWFyVGltZW91dChoYW5kbGUpIH07XG4gICAgICAgIH0sXG4gICAgICAgIHNldEltbWVkaWF0ZShjYWxsYmFjaywgLi4uYXJncykge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gc2V0VGltZW91dChjYWxsYmFjaywgMCwgLi4uYXJncyk7XG4gICAgICAgICAgICByZXR1cm4geyBkaXNwb3NlOiAoKSA9PiBjbGVhclRpbWVvdXQoaGFuZGxlKSB9O1xuICAgICAgICB9LFxuICAgICAgICBzZXRJbnRlcnZhbChjYWxsYmFjaywgbXMsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHNldEludGVydmFsKGNhbGxiYWNrLCBtcywgLi4uYXJncyk7XG4gICAgICAgICAgICByZXR1cm4geyBkaXNwb3NlOiAoKSA9PiBjbGVhckludGVydmFsKGhhbmRsZSkgfTtcbiAgICAgICAgfSxcbiAgICB9KVxufSk7XG5mdW5jdGlvbiBSSUwoKSB7XG4gICAgcmV0dXJuIF9yaWw7XG59XG4oZnVuY3Rpb24gKFJJTCkge1xuICAgIGZ1bmN0aW9uIGluc3RhbGwoKSB7XG4gICAgICAgIGFwaV8xLlJBTC5pbnN0YWxsKF9yaWwpO1xuICAgIH1cbiAgICBSSUwuaW5zdGFsbCA9IGluc3RhbGw7XG59KShSSUwgfHwgKFJJTCA9IHt9KSk7XG5leHBvcnRzLmRlZmF1bHQgPSBSSUw7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24gPSBleHBvcnRzLkJyb3dzZXJNZXNzYWdlV3JpdGVyID0gZXhwb3J0cy5Ccm93c2VyTWVzc2FnZVJlYWRlciA9IHZvaWQgMDtcbmNvbnN0IHJpbF8xID0gcmVxdWlyZShcIi4vcmlsXCIpO1xuLy8gSW5zdGFsbCB0aGUgYnJvd3NlciBydW50aW1lIGFic3RyYWN0LlxucmlsXzEuZGVmYXVsdC5pbnN0YWxsKCk7XG5jb25zdCBhcGlfMSA9IHJlcXVpcmUoXCIuLi9jb21tb24vYXBpXCIpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuLi9jb21tb24vYXBpXCIpLCBleHBvcnRzKTtcbmNsYXNzIEJyb3dzZXJNZXNzYWdlUmVhZGVyIGV4dGVuZHMgYXBpXzEuQWJzdHJhY3RNZXNzYWdlUmVhZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihwb3J0KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX29uRGF0YSA9IG5ldyBhcGlfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuX21lc3NhZ2VMaXN0ZW5lciA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fb25EYXRhLmZpcmUoZXZlbnQuZGF0YSk7XG4gICAgICAgIH07XG4gICAgICAgIHBvcnQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoZXZlbnQpID0+IHRoaXMuZmlyZUVycm9yKGV2ZW50KSk7XG4gICAgICAgIHBvcnQub25tZXNzYWdlID0gdGhpcy5fbWVzc2FnZUxpc3RlbmVyO1xuICAgIH1cbiAgICBsaXN0ZW4oY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uRGF0YS5ldmVudChjYWxsYmFjayk7XG4gICAgfVxufVxuZXhwb3J0cy5Ccm93c2VyTWVzc2FnZVJlYWRlciA9IEJyb3dzZXJNZXNzYWdlUmVhZGVyO1xuY2xhc3MgQnJvd3Nlck1lc3NhZ2VXcml0ZXIgZXh0ZW5kcyBhcGlfMS5BYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKHBvcnQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50ID0gMDtcbiAgICAgICAgcG9ydC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIChldmVudCkgPT4gdGhpcy5maXJlRXJyb3IoZXZlbnQpKTtcbiAgICB9XG4gICAgd3JpdGUobXNnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnBvcnQucG9zdE1lc3NhZ2UobXNnKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IsIG1zZyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZUVycm9yKGVycm9yLCBtc2cpIHtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50Kys7XG4gICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yLCBtc2csIHRoaXMuZXJyb3JDb3VudCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICB9XG59XG5leHBvcnRzLkJyb3dzZXJNZXNzYWdlV3JpdGVyID0gQnJvd3Nlck1lc3NhZ2VXcml0ZXI7XG5mdW5jdGlvbiBjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbihyZWFkZXIsIHdyaXRlciwgbG9nZ2VyLCBvcHRpb25zKSB7XG4gICAgaWYgKGxvZ2dlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxvZ2dlciA9IGFwaV8xLk51bGxMb2dnZXI7XG4gICAgfVxuICAgIGlmIChhcGlfMS5Db25uZWN0aW9uU3RyYXRlZ3kuaXMob3B0aW9ucykpIHtcbiAgICAgICAgb3B0aW9ucyA9IHsgY29ubmVjdGlvblN0cmF0ZWd5OiBvcHRpb25zIH07XG4gICAgfVxuICAgIHJldHVybiAoMCwgYXBpXzEuY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24pKHJlYWRlciwgd3JpdGVyLCBsb2dnZXIsIG9wdGlvbnMpO1xufVxuZXhwb3J0cy5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiA9IGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uO1xuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL2Jyb3dzZXIvbWFpbicpOyIsICIvKlxuICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMjYgRWNsaXBzZSBEaXJpZ2libGUgY29udHJpYnV0b3JzXG4gKlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlXG4gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2Mi4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG4gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MjAuaHRtbFxuICpcbiAqIFNQRFgtRmlsZUNvcHlyaWdodFRleHQ6IEVjbGlwc2UgRGlyaWdpYmxlIGNvbnRyaWJ1dG9ycyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbi8qKlxuICogSmF2YSBMU1AgY2xpZW50IGJ1bmRsZS5cbiAqXG4gKiBVc2VzIHZzY29kZS13cy1qc29ucnBjIGZvciB0eXBlZCBKU09OLVJQQyBvdmVyIFdlYlNvY2tldCBhbmQgcmVnaXN0ZXJzIE1vbmFjb1xuICogcHJvdmlkZXJzIHRoYXQgZGVsZWdhdGUgdG8gSkRULkxTLiBFeHBvc2VkIGFzIGdsb2JhbCBKYXZhTHNwQ2xpZW50TGliIHNvIHRoYXRcbiAqIGVkaXRvci5qcyBjYW4gY2FsbCBKYXZhTHNwQ2xpZW50TGliLmNvbm5lY3QocmVzb3VyY2VQYXRoKS5cbiAqXG4gKiBPbmUgSkRULkxTIHByb2Nlc3MgY292ZXJzIHRoZSBlbnRpcmUgd29ya3NwYWNlLCBzbyBhIHNpbmdsZSBXZWJTb2NrZXQgY29ubmVjdGlvblxuICogaXMgc2hhcmVkIGFjcm9zcyBhbGwgSmF2YSBmaWxlcyBvcGVuIGluIHRoZSBzYW1lIGJyb3dzZXIgcGFnZS4gVGhlIGNvbm5lY3Rpb24gaXNcbiAqIGVzdGFibGlzaGVkIG9uIHRoZSBmaXJzdCBjb25uZWN0KCkgY2FsbCBhbmQgcmV1c2VkIGZvciBhbGwgc3Vic2VxdWVudCBjYWxscy5cbiAqXG4gKiBlZGl0b3IuanMgc2V0cyB3aW5kb3cubW9uYWNvIGJlZm9yZSBjYWxsaW5nIGNvbm5lY3QoKSwgc28gdGhlIG1vbmFjby1zaGltJ3MgbGF6eVxuICogUHJveGllcyByZXNvbHZlIGNvcnJlY3RseSBhdCBjYWxsIHRpbWUuXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24sIE1lc3NhZ2VDb25uZWN0aW9uIH0gZnJvbSAndnNjb2RlLWpzb25ycGMvYnJvd3Nlcic7XG5pbXBvcnQgeyB0b1NvY2tldCwgV2ViU29ja2V0TWVzc2FnZVJlYWRlciwgV2ViU29ja2V0TWVzc2FnZVdyaXRlciB9IGZyb20gJ3ZzY29kZS13cy1qc29ucnBjJztcbmltcG9ydCAqIGFzIG1vbmFjbyBmcm9tICdtb25hY28tZWRpdG9yJztcbmltcG9ydCB7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLFxuICAgIERpYWdub3N0aWNTZXZlcml0eSxcbiAgICBJbnNlcnRUZXh0Rm9ybWF0LFxuICAgIE1hcmt1cENvbnRlbnQsXG4gICAgTWFya3VwS2luZCxcbiAgICB0eXBlIENvZGVBY3Rpb24sXG4gICAgdHlwZSBDb21tYW5kLFxuICAgIHR5cGUgQ29tcGxldGlvbkl0ZW0sXG4gICAgdHlwZSBDb21wbGV0aW9uTGlzdCxcbiAgICB0eXBlIERpYWdub3N0aWMsXG4gICAgdHlwZSBIb3ZlcixcbiAgICB0eXBlIExvY2F0aW9uLFxuICAgIHR5cGUgUGFyYW1ldGVySW5mb3JtYXRpb24sXG4gICAgdHlwZSBTaWduYXR1cmVIZWxwLFxuICAgIHR5cGUgU2lnbmF0dXJlSW5mb3JtYXRpb24sXG4gICAgdHlwZSBUZXh0RWRpdCxcbiAgICB0eXBlIFdvcmtzcGFjZUVkaXQsXG59IGZyb20gJ3ZzY29kZS1sYW5ndWFnZXNlcnZlci10eXBlcyc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNpbmdsZXRvbiBzdGF0ZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogU2hhcmVkIGNvbm5lY3Rpb24gXHUyMDE0IG9uZSBwZXIgYnJvd3NlciBwYWdlLCBjb3ZlcmluZyBhbGwgcHJvamVjdHMgaW4gdGhlIHdvcmtzcGFjZS4gKi9cbmxldCBfY29ubjogTWVzc2FnZUNvbm5lY3Rpb24gfCBudWxsID0gbnVsbDtcblxuLyoqXG4gKiBWaXJ0dWFsIHdvcmtzcGFjZSByb290IFVSSSwgZS5nLiB7QGNvZGUgZmlsZTovLy93b3Jrc3BhY2Uvd29ya3NwYWNlL30uXG4gKiBTZXQgb25jZSBvbiBmaXJzdCBjb25uZWN0KCk7IHVzZWQgdG8gc2NvcGUgTW9uYWNvIHByb3ZpZGVycyB0byB3b3Jrc3BhY2UgZmlsZXMuXG4gKi9cbmxldCBfd29ya3NwYWNlUm9vdCA9ICcnO1xuXG4vKiogVVJJcyBmb3Igd2hpY2ggdGV4dERvY3VtZW50L2RpZE9wZW4gaGFzIGFscmVhZHkgYmVlbiBzZW50LiAqL1xuY29uc3QgX29wZW5GaWxlczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cbi8qKiBQZW5kaW5nIGRlYm91bmNlZCBkaWRDaGFuZ2UgdGltZXJzIHBlciBmaWxlIFVSSSwgc28gYSBjaGFuZ2UgY2FuIGJlIGZsdXNoZWQgYmVmb3JlIGNvbXBsZXRpb24uICovXG5jb25zdCBfY2hhbmdlVGltZXJzOiBNYXA8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0Pj4gPSBuZXcgTWFwKCk7XG5cbi8qKlxuICogTGFzdCBkaWFnbm9zdGljcyBwdWJsaXNoZWQgcGVyIGZpbGUgVVJJLCBrZXB0IHZlcmJhdGltICh3aXRoIHRoZWlyIExTUCBjb2RlL2RhdGEpLiBDb2RlLWFjdGlvblxuICogcmVxdWVzdHMgbXVzdCBzZW5kIHRoZXNlIFx1MjAxNCBKRFQuTFMgbWF0Y2hlcyBxdWljay1maXhlcyBieSB0aGUgZGlhZ25vc3RpYydzIGNvZGUvZGF0YSwgd2hpY2ggTW9uYWNvJ3NcbiAqIElNYXJrZXJEYXRhIGNhbm5vdCByb3VuZC10cmlwLCBzbyByZWNvbnN0cnVjdGluZyBkaWFnbm9zdGljcyBmcm9tIG1hcmtlcnMgeWllbGRzIG5vIHF1aWNrLWZpeGVzLlxuICovXG5jb25zdCBfZGlhZ25vc3RpY3M6IE1hcDxzdHJpbmcsIERpYWdub3N0aWNbXT4gPSBuZXcgTWFwKCk7XG5cbmxldCBfcHJvdmlkZXJzUmVnaXN0ZXJlZCA9IGZhbHNlO1xuXG4vKiogU2VtYW50aWMtdG9rZW4gbGVnZW5kIHJlcG9ydGVkIGJ5IEpEVC5MUyBpbiB0aGUgaW5pdGlhbGl6ZSByZXN1bHQ7IG5lZWRlZCB0byBkZWNvZGUgdG9rZW4gZGF0YS4gKi9cbmxldCBfc2VtYW50aWNUb2tlbnNMZWdlbmQ6IHsgdG9rZW5UeXBlczogc3RyaW5nW107IHRva2VuTW9kaWZpZXJzOiBzdHJpbmdbXSB9IHwgbnVsbCA9IG51bGw7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFB1YmxpYyBBUElcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIENhbGxlZCBieSBlZGl0b3IuanMgd2hlbiBhIEphdmEgZmlsZSBpcyBvcGVuZWQuIFNhZmUgdG8gY2FsbCBtdWx0aXBsZSB0aW1lcy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb25uZWN0KHJlc291cmNlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFydHMgPSByZXNvdXJjZVBhdGgucmVwbGFjZSgvXlxcLy8sICcnKS5zcGxpdCgnLycpO1xuICAgIGNvbnN0IHdvcmtzcGFjZSA9IHBhcnRzWzBdO1xuICAgIGNvbnN0IHByb2plY3QgICA9IHBhcnRzWzFdO1xuICAgIGNvbnN0IGZpbGVVcmkgPSBgZmlsZTovLy93b3Jrc3BhY2UvJHt3b3Jrc3BhY2V9LyR7cHJvamVjdH0vJHtwYXJ0cy5zbGljZSgyKS5qb2luKCcvJyl9YDtcblxuICAgIGlmIChfY29ubikge1xuICAgICAgICAvLyBDb25uZWN0aW9uIGFscmVhZHkgZXN0YWJsaXNoZWQgXHUyMDE0IGp1c3Qgb3BlbiB0aGUgbmV3IGZpbGUuXG4gICAgICAgIG9wZW5GaWxlKGZpbGVVcmkpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgX3dvcmtzcGFjZVJvb3QgPSBgZmlsZTovLy93b3Jrc3BhY2UvJHt3b3Jrc3BhY2V9L2A7XG5cbiAgICBjb25zdCBwcm90byA9IGxvY2F0aW9uLnByb3RvY29sID09PSAnaHR0cHM6JyA/ICd3c3MnIDogJ3dzJztcbiAgICBjb25zdCB3c1VybCA9IGAke3Byb3RvfTovLyR7bG9jYXRpb24uaG9zdH0vd2Vic29ja2V0cy9pZGUvamF2YS1sc3BgXG4gICAgICAgICAgICAgICAgKyBgP3dvcmtzcGFjZT0ke2VuY29kZVVSSUNvbXBvbmVudCh3b3Jrc3BhY2UpfWA7XG5cbiAgICBjb25zdCB3cyA9IG5ldyBXZWJTb2NrZXQod3NVcmwpO1xuICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgd3Mub25vcGVuICA9ICgpID0+IHJlc29sdmUoKTtcbiAgICAgICAgd3Mub25lcnJvciA9ICgpID0+IHJlamVjdChuZXcgRXJyb3IoYFtqYXZhLWxzcF0gV2ViU29ja2V0IGNvbm5lY3QgZmFpbGVkOiAke3dzVXJsfWApKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHNvY2tldCA9IHRvU29ja2V0KHdzKTtcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgV2ViU29ja2V0TWVzc2FnZVJlYWRlcihzb2NrZXQpO1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBXZWJTb2NrZXRNZXNzYWdlV3JpdGVyKHNvY2tldCk7XG4gICAgX2Nvbm4gPSBjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbihyZWFkZXIsIHdyaXRlcik7XG5cbiAgICAvLyBEaWFnbm9zdGljcyBub3RpZmljYXRpb24gXHUyMTkyIE1vbmFjbyBtYXJrZXJzIChhcHBsaWVzIHRvIGFueSB3b3Jrc3BhY2UgZmlsZSlcbiAgICBfY29ubi5vbk5vdGlmaWNhdGlvbigndGV4dERvY3VtZW50L3B1Ymxpc2hEaWFnbm9zdGljcycsIChwYXJhbXM6IHsgdXJpOiBzdHJpbmc7IGRpYWdub3N0aWNzOiBEaWFnbm9zdGljW10gfSkgPT4ge1xuICAgICAgICBfZGlhZ25vc3RpY3Muc2V0KHBhcmFtcy51cmksIHBhcmFtcy5kaWFnbm9zdGljcyA/PyBbXSk7XG4gICAgICAgIGNvbnN0IG1vZGVsID0gbW9uYWNvLmVkaXRvci5nZXRNb2RlbHMoKS5maW5kKG0gPT4gbS51cmkudG9TdHJpbmcoKSA9PT0gcGFyYW1zLnVyaSk7XG4gICAgICAgIGlmICghbW9kZWwpIHJldHVybjtcbiAgICAgICAgbW9uYWNvLmVkaXRvci5zZXRNb2RlbE1hcmtlcnMobW9kZWwsICdqYXZhLWxzcCcsIHBhcmFtcy5kaWFnbm9zdGljcy5tYXAoZCA9PiAoe1xuICAgICAgICAgICAgc2V2ZXJpdHk6ICAgICAgICBsc3BTZXZlcml0eShkLnNldmVyaXR5KSxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICAgICAgICAgZC5tZXNzYWdlLFxuICAgICAgICAgICAgc291cmNlOiAgICAgICAgICBkLnNvdXJjZSA/PyAnamF2YScsXG4gICAgICAgICAgICBzdGFydExpbmVOdW1iZXI6IGQucmFuZ2Uuc3RhcnQubGluZSArIDEsXG4gICAgICAgICAgICBzdGFydENvbHVtbjogICAgIGQucmFuZ2Uuc3RhcnQuY2hhcmFjdGVyICsgMSxcbiAgICAgICAgICAgIGVuZExpbmVOdW1iZXI6ICAgZC5yYW5nZS5lbmQubGluZSArIDEsXG4gICAgICAgICAgICBlbmRDb2x1bW46ICAgICAgIGQucmFuZ2UuZW5kLmNoYXJhY3RlciArIDEsXG4gICAgICAgIH0pKSk7XG4gICAgfSk7XG5cbiAgICAvLyBTZXJ2ZXIgLT4gY2xpZW50IHJlcXVlc3RzIHRoYXQgZHJpdmUgcmVmYWN0b3IgLyBnZW5lcmF0ZSByZXN1bHRzIGFuZCBkeW5hbWljIHJlZ2lzdHJhdGlvbi5cbiAgICBfY29ubi5vblJlcXVlc3QoJ3dvcmtzcGFjZS9hcHBseUVkaXQnLCAocGFyYW1zOiB7IGVkaXQ6IFdvcmtzcGFjZUVkaXQgfSkgPT4ge1xuICAgICAgICBhcHBseVdvcmtzcGFjZUVkaXQocGFyYW1zLmVkaXQpO1xuICAgICAgICByZXR1cm4geyBhcHBsaWVkOiB0cnVlIH07XG4gICAgfSk7XG4gICAgX2Nvbm4ub25SZXF1ZXN0KCd3b3Jrc3BhY2UvY29uZmlndXJhdGlvbicsIChwYXJhbXM6IHsgaXRlbXM6IEFycmF5PHsgc2VjdGlvbj86IHN0cmluZyB9PiB9KSA9PlxuICAgICAgICAocGFyYW1zLml0ZW1zID8/IFtdKS5tYXAoKCkgPT4gamR0bHNTZXR0aW5ncygpLmphdmEpKTtcbiAgICBfY29ubi5vblJlcXVlc3QoJ2NsaWVudC9yZWdpc3RlckNhcGFiaWxpdHknLCAoKSA9PiBudWxsKTtcbiAgICBfY29ubi5vblJlcXVlc3QoJ2NsaWVudC91bnJlZ2lzdGVyQ2FwYWJpbGl0eScsICgpID0+IG51bGwpO1xuICAgIF9jb25uLm9uUmVxdWVzdCgnd2luZG93L3Nob3dNZXNzYWdlUmVxdWVzdCcsICgpID0+IG51bGwpO1xuICAgIF9jb25uLm9uUmVxdWVzdCgnd2luZG93L3dvcmtEb25lUHJvZ3Jlc3MvY3JlYXRlJywgKCkgPT4gbnVsbCk7XG4gICAgX2Nvbm4ub25Ob3RpZmljYXRpb24oJ3dpbmRvdy9sb2dNZXNzYWdlJywgKHA6IHsgbWVzc2FnZTogc3RyaW5nIH0pID0+IGNvbnNvbGUuZGVidWcoJ1tqYXZhLWxzcF0nLCBwPy5tZXNzYWdlKSk7XG4gICAgX2Nvbm4ub25Ob3RpZmljYXRpb24oJ3dpbmRvdy9zaG93TWVzc2FnZScsIChwOiB7IG1lc3NhZ2U6IHN0cmluZyB9KSA9PiBjb25zb2xlLmluZm8oJ1tqYXZhLWxzcF0nLCBwPy5tZXNzYWdlKSk7XG4gICAgLy8gSkRULkxTIGxhbmd1YWdlLXN0YXR1cyAvIHByb2dyZXNzIG5vdGlmaWNhdGlvbnMgXHUyMDE0IGFja25vd2xlZGdlZCBzaWxlbnRseS5cbiAgICBfY29ubi5vbk5vdGlmaWNhdGlvbignbGFuZ3VhZ2Uvc3RhdHVzJywgKCkgPT4geyAvKiBpbmRleGluZy9yZWFkeSBzdGF0dXMsIGlnbm9yZWQgKi8gfSk7XG4gICAgX2Nvbm4ub25Ob3RpZmljYXRpb24oJ2xhbmd1YWdlL3Byb2dyZXNzUmVwb3J0JywgKCkgPT4geyAvKiBidWlsZCBwcm9ncmVzcywgaWdub3JlZCAqLyB9KTtcblxuICAgIF9jb25uLmxpc3RlbigpO1xuXG4gICAgY29uc3Qgcm9vdFVyaSA9IF93b3Jrc3BhY2VSb290O1xuICAgIGNvbnN0IGluaXRSZXN1bHQ6IGFueSA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCdpbml0aWFsaXplJywge1xuICAgICAgICBwcm9jZXNzSWQ6IG51bGwsXG4gICAgICAgIHJvb3RVcmksXG4gICAgICAgIGluaXRpYWxpemF0aW9uT3B0aW9uczoge1xuICAgICAgICAgICAgc2V0dGluZ3M6IGpkdGxzU2V0dGluZ3MoKSxcbiAgICAgICAgICAgIGV4dGVuZGVkQ2xpZW50Q2FwYWJpbGl0aWVzOiB7XG4gICAgICAgICAgICAgICAgcHJvZ3Jlc3NSZXBvcnRQcm92aWRlcjogICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICAgICBjbGFzc0ZpbGVDb250ZW50c1N1cHBvcnQ6ICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgcmVzb2x2ZUFkZGl0aW9uYWxUZXh0RWRpdHNTdXBwb3J0OiB0cnVlLFxuICAgICAgICAgICAgICAgIC8vIERvIE5PVCBhZHZlcnRpc2UgdGhlICpQcm9tcHRTdXBwb3J0IGZsYWdzOiB0aG9zZSBtYWtlIEpEVC5MUyByZXR1cm4gc291cmNlIGFjdGlvbnNcbiAgICAgICAgICAgICAgICAvLyAoZ2VuZXJhdGUgdG9TdHJpbmcvY29uc3RydWN0b3JzL2FjY2Vzc29ycywgb3ZlcnJpZGUvaW1wbGVtZW50LCBvcmdhbml6ZSBpbXBvcnRzKSBhc1xuICAgICAgICAgICAgICAgIC8vIGNsaWVudC1zaWRlIFwiKlByb21wdFwiIGNvbW1hbmRzIHRoZSB2c2NvZGUtamF2YSBleHRlbnNpb24gaW1wbGVtZW50cyBidXQgd2UgZG9uJ3QuXG4gICAgICAgICAgICAgICAgLy8gV2l0aCB0aGVtIG9mZiwgSkRULkxTIHJldHVybnMgdGhlIHNhbWUgYWN0aW9ucyBhcyByZXNvbHZhYmxlIFdvcmtzcGFjZUVkaXRzIG9wZXJhdGluZ1xuICAgICAgICAgICAgICAgIC8vIG9uIGFsbCBtZW1iZXJzLCB3aGljaCBhcHBseUNvZGVBY3Rpb24gcmVzb2x2ZXMgYW5kIGFwcGxpZXMgZGlyZWN0bHkuXG4gICAgICAgICAgICAgICAgaW5mZXJTZWxlY3Rpb25TdXBwb3J0OiAgICAgICAgICAgICBbJ2V4dHJhY3RNZXRob2QnLCAnZXh0cmFjdFZhcmlhYmxlJywgJ2V4dHJhY3RGaWVsZCddLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgd29ya3NwYWNlRm9sZGVyczogW3sgdXJpOiByb290VXJpLCBuYW1lOiB3b3Jrc3BhY2UgfV0sXG4gICAgICAgIGNhcGFiaWxpdGllczoge1xuICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7XG4gICAgICAgICAgICAgICAgc3luY2hyb25pemF0aW9uOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUsIHdpbGxTYXZlOiBmYWxzZSwgZGlkU2F2ZTogdHJ1ZSwgd2lsbFNhdmVXYWl0VW50aWw6IGZhbHNlIH0sXG4gICAgICAgICAgICAgICAgY29tcGxldGlvbjoge1xuICAgICAgICAgICAgICAgICAgICBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uSXRlbToge1xuICAgICAgICAgICAgICAgICAgICAgICAgc25pcHBldFN1cHBvcnQ6ICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRhdGlvbkZvcm1hdDogICBbJ21hcmtkb3duJywgJ3BsYWludGV4dCddLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRlZFN1cHBvcnQ6ICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWl0Q2hhcmFjdGVyc1N1cHBvcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlU3VwcG9ydDogICAgICAgIHsgcHJvcGVydGllczogWydkb2N1bWVudGF0aW9uJywgJ2RldGFpbCcsICdhZGRpdGlvbmFsVGV4dEVkaXRzJ10gfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dFN1cHBvcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBob3ZlcjogICAgICAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLCBjb250ZW50Rm9ybWF0OiBbJ21hcmtkb3duJywgJ3BsYWludGV4dCddIH0sXG4gICAgICAgICAgICAgICAgc2lnbmF0dXJlSGVscDogIHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSwgc2lnbmF0dXJlSW5mb3JtYXRpb246IHsgZG9jdW1lbnRhdGlvbkZvcm1hdDogWydtYXJrZG93bicsICdwbGFpbnRleHQnXSwgcGFyYW1ldGVySW5mb3JtYXRpb246IHsgbGFiZWxPZmZzZXRTdXBwb3J0OiB0cnVlIH0gfSB9LFxuICAgICAgICAgICAgICAgIGRlZmluaXRpb246ICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VzOiAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb246IHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIHR5cGVEZWZpbml0aW9uOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICBkb2N1bWVudEhpZ2hsaWdodDogeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgZG9jdW1lbnRTeW1ib2w6IHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSwgaGllcmFyY2hpY2FsRG9jdW1lbnRTeW1ib2xTdXBwb3J0OiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgZm9sZGluZ1JhbmdlOiAgIHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSwgbGluZUZvbGRpbmdPbmx5OiBmYWxzZSB9LFxuICAgICAgICAgICAgICAgIHNlbGVjdGlvblJhbmdlOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICBjb2RlTGVuczogICAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgaW5sYXlIaW50OiAgICAgIHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSwgcmVzb2x2ZVN1cHBvcnQ6IHsgcHJvcGVydGllczogWydsYWJlbCddIH0gfSxcbiAgICAgICAgICAgICAgICBzZW1hbnRpY1Rva2Vuczoge1xuICAgICAgICAgICAgICAgICAgICBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0czogICAgICAgIHsgcmFuZ2U6IGZhbHNlLCBmdWxsOiB7IGRlbHRhOiBmYWxzZSB9IH0sXG4gICAgICAgICAgICAgICAgICAgIHRva2VuVHlwZXM6ICAgICAgWyduYW1lc3BhY2UnLCAndHlwZScsICdjbGFzcycsICdlbnVtJywgJ2ludGVyZmFjZScsICdzdHJ1Y3QnLCAndHlwZVBhcmFtZXRlcicsXG4gICAgICAgICAgICAgICAgICAgICAgICAncGFyYW1ldGVyJywgJ3ZhcmlhYmxlJywgJ3Byb3BlcnR5JywgJ2VudW1NZW1iZXInLCAnZXZlbnQnLCAnZnVuY3Rpb24nLCAnbWV0aG9kJywgJ21hY3JvJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdrZXl3b3JkJywgJ21vZGlmaWVyJywgJ2NvbW1lbnQnLCAnc3RyaW5nJywgJ251bWJlcicsICdyZWdleHAnLCAnb3BlcmF0b3InLCAnZGVjb3JhdG9yJ10sXG4gICAgICAgICAgICAgICAgICAgIHRva2VuTW9kaWZpZXJzOiAgWydkZWNsYXJhdGlvbicsICdkZWZpbml0aW9uJywgJ3JlYWRvbmx5JywgJ3N0YXRpYycsICdkZXByZWNhdGVkJywgJ2Fic3RyYWN0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdhc3luYycsICdtb2RpZmljYXRpb24nLCAnZG9jdW1lbnRhdGlvbicsICdkZWZhdWx0TGlicmFyeSddLFxuICAgICAgICAgICAgICAgICAgICBmb3JtYXRzOiAgICAgICAgIFsncmVsYXRpdmUnXSxcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxhcHBpbmdUb2tlblN1cHBvcnQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBtdWx0aWxpbmVUb2tlblN1cHBvcnQ6ICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBmb3JtYXR0aW5nOiAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgcmFuZ2VGb3JtYXR0aW5nOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICByZW5hbWU6ICAgICAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLCBwcmVwYXJlU3VwcG9ydDogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIGNvZGVBY3Rpb246IHtcbiAgICAgICAgICAgICAgICAgICAgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgY29kZUFjdGlvbkxpdGVyYWxTdXBwb3J0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlQWN0aW9uS2luZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU2V0OiBbJ3F1aWNrZml4JywgJ3JlZmFjdG9yJywgJ3JlZmFjdG9yLmV4dHJhY3QnLCAncmVmYWN0b3IuaW5saW5lJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlZmFjdG9yLnJld3JpdGUnLCAnc291cmNlJywgJ3NvdXJjZS5vcmdhbml6ZUltcG9ydHMnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGlzUHJlZmVycmVkU3VwcG9ydDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgZGF0YVN1cHBvcnQ6ICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlU3VwcG9ydDogICAgIHsgcHJvcGVydGllczogWydlZGl0J10gfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHB1Ymxpc2hEaWFnbm9zdGljczogeyByZWxhdGVkSW5mb3JtYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3b3Jrc3BhY2U6IHtcbiAgICAgICAgICAgICAgICBhcHBseUVkaXQ6ICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb246ICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgZXhlY3V0ZUNvbW1hbmQ6ICAgICAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgZGlkQ2hhbmdlQ29uZmlndXJhdGlvbjogeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgd29ya3NwYWNlRWRpdDogICAgICAgICAgeyBkb2N1bWVudENoYW5nZXM6IHRydWUsIHJlc291cmNlT3BlcmF0aW9uczogWydjcmVhdGUnLCAncmVuYW1lJywgJ2RlbGV0ZSddIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgX3NlbWFudGljVG9rZW5zTGVnZW5kID0gaW5pdFJlc3VsdD8uY2FwYWJpbGl0aWVzPy5zZW1hbnRpY1Rva2Vuc1Byb3ZpZGVyPy5sZWdlbmQgPz8gbnVsbDtcblxuICAgIF9jb25uLnNlbmROb3RpZmljYXRpb24oJ2luaXRpYWxpemVkJywge30pO1xuICAgIF9jb25uLnNlbmROb3RpZmljYXRpb24oJ3dvcmtzcGFjZS9kaWRDaGFuZ2VDb25maWd1cmF0aW9uJywgeyBzZXR0aW5nczogamR0bHNTZXR0aW5ncygpIH0pO1xuXG4gICAgb3BlbkZpbGUoZmlsZVVyaSk7XG5cbiAgICBpZiAoIV9wcm92aWRlcnNSZWdpc3RlcmVkKSB7XG4gICAgICAgIF9wcm92aWRlcnNSZWdpc3RlcmVkID0gdHJ1ZTtcbiAgICAgICAgcmVnaXN0ZXJQcm92aWRlcnMoKTtcbiAgICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEZpbGUgbGlmZWN5Y2xlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogU2VuZHMgdGV4dERvY3VtZW50L2RpZE9wZW4gZm9yIHRoZSBnaXZlbiBVUkkgKGlmIG5vdCBhbHJlYWR5IHNlbnQpIGFuZCByZWdpc3RlcnMgYSBkZWJvdW5jZWRcbiAqIHRleHREb2N1bWVudC9kaWRDaGFuZ2UgbGlzdGVuZXIgb24gdGhlIGNvcnJlc3BvbmRpbmcgTW9uYWNvIG1vZGVsLlxuICovXG5mdW5jdGlvbiBvcGVuRmlsZShmaWxlVXJpOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoX29wZW5GaWxlcy5oYXMoZmlsZVVyaSkgfHwgIV9jb25uKSByZXR1cm47XG4gICAgX29wZW5GaWxlcy5hZGQoZmlsZVVyaSk7XG5cbiAgICBjb25zdCBtb2RlbCA9IG1vbmFjby5lZGl0b3IuZ2V0TW9kZWxzKCkuZmluZChtID0+IG0udXJpLnRvU3RyaW5nKCkgPT09IGZpbGVVcmkpO1xuICAgIF9jb25uLnNlbmROb3RpZmljYXRpb24oJ3RleHREb2N1bWVudC9kaWRPcGVuJywge1xuICAgICAgICB0ZXh0RG9jdW1lbnQ6IHtcbiAgICAgICAgICAgIHVyaTogICAgICAgIGZpbGVVcmksXG4gICAgICAgICAgICBsYW5ndWFnZUlkOiAnamF2YScsXG4gICAgICAgICAgICB2ZXJzaW9uOiAgICAxLFxuICAgICAgICAgICAgdGV4dDogICAgICAgbW9kZWw/LmdldFZhbHVlKCkgPz8gJycsXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBpZiAobW9kZWwpIHtcbiAgICAgICAgbW9kZWwub25EaWRDaGFuZ2VDb250ZW50KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gX2NoYW5nZVRpbWVycy5nZXQoZmlsZVVyaSk7XG4gICAgICAgICAgICBpZiAoZXhpc3RpbmcpIGNsZWFyVGltZW91dChleGlzdGluZyk7XG4gICAgICAgICAgICBfY2hhbmdlVGltZXJzLnNldChmaWxlVXJpLCBzZXRUaW1lb3V0KCgpID0+IHNlbmREaWRDaGFuZ2UoZmlsZVVyaSksIDQwMCkpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbi8qKiBTZW5kcyB0aGUgY3VycmVudCBtb2RlbCBjb250ZW50IGFzIGEgZGlkQ2hhbmdlIGFuZCBjbGVhcnMgYW55IHBlbmRpbmcgZGVib3VuY2UgZm9yIHRoZSBmaWxlLiAqL1xuZnVuY3Rpb24gc2VuZERpZENoYW5nZShmaWxlVXJpOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBfY2hhbmdlVGltZXJzLmRlbGV0ZShmaWxlVXJpKTtcbiAgICBjb25zdCBtb2RlbCA9IG1vbmFjby5lZGl0b3IuZ2V0TW9kZWwobW9uYWNvLlVyaS5wYXJzZShmaWxlVXJpKSk7XG4gICAgaWYgKF9jb25uICYmIG1vZGVsKSB7XG4gICAgICAgIF9jb25uLnNlbmROb3RpZmljYXRpb24oJ3RleHREb2N1bWVudC9kaWRDaGFuZ2UnLCB7XG4gICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6ICAgeyB1cmk6IGZpbGVVcmksIHZlcnNpb246IG1vZGVsLmdldFZlcnNpb25JZCgpIH0sXG4gICAgICAgICAgICBjb250ZW50Q2hhbmdlczogW3sgdGV4dDogbW9kZWwuZ2V0VmFsdWUoKSB9XSxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEZsdXNoZXMgYSBwZW5kaW5nIGRlYm91bmNlZCBjaGFuZ2UgaW1tZWRpYXRlbHkuIENhbGxlZCBiZWZvcmUgYSBjb21wbGV0aW9uIHJlcXVlc3Qgc28gSkRULkxTIHNlZXMgdGhlXG4gKiBqdXN0LXR5cGVkIHRleHQgb24gdGhlIGZpcnN0IEN0cmwrU3BhY2UsIGluc3RlYWQgb2YgY29tcGxldGluZyBhZ2FpbnN0IHN0YWxlIGNvbnRlbnQgKHRoZSBkZWJvdW5jZVxuICogb3RoZXJ3aXNlIGRlbGF5cyB0aGUgY2hhbmdlIGJ5IHVwIHRvIDQwMG1zIFx1MjAxNCB0aGUgY2F1c2Ugb2YgXCJmaXJzdCBDdHJsK1NwYWNlIHNob3dzIG5vdGhpbmdcIikuXG4gKi9cbmZ1bmN0aW9uIGZsdXNoUGVuZGluZ0NoYW5nZShmaWxlVXJpOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoX2NoYW5nZVRpbWVycy5oYXMoZmlsZVVyaSkpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KF9jaGFuZ2VUaW1lcnMuZ2V0KGZpbGVVcmkpISk7XG4gICAgICAgIHNlbmREaWRDaGFuZ2UoZmlsZVVyaSk7XG4gICAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBXb3Jrc3BhY2UgZmlsZSBwcmVkaWNhdGVcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBSZXR1cm5zIHtAY29kZSB0cnVlfSB3aGVuIHRoZSBnaXZlbiBtb2RlbCBVUkkgYmVsb25ncyB0byB0aGUgY3VycmVudGx5IGNvbm5lY3RlZCB3b3Jrc3BhY2UuIFVzZWRcbiAqIGJ5IE1vbmFjbyBwcm92aWRlcnMgdG8gc2tpcCBub24tSmF2YS13b3Jrc3BhY2UgbW9kZWxzIHdpdGhvdXQgYW4gZXhhY3QtVVJJIGNvbXBhcmlzb24uXG4gKi9cbmZ1bmN0aW9uIGlzV29ya3NwYWNlRmlsZSh1cmk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBfd29ya3NwYWNlUm9vdCAhPT0gJycgJiYgdXJpLnN0YXJ0c1dpdGgoX3dvcmtzcGFjZVJvb3QpO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBNb25hY28gcHJvdmlkZXIgcmVnaXN0cmF0aW9uXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIHJlZ2lzdGVyUHJvdmlkZXJzKCk6IHZvaWQge1xuXG4gICAgbW9uYWNvLmVkaXRvci5yZWdpc3RlckNvbW1hbmQoQVBQTFlfQUNUSU9OX0NPTU1BTkQsIChfYWNjZXNzb3I6IHVua25vd24sIGFjdGlvbjogQ29kZUFjdGlvbiB8IENvbW1hbmQpID0+IHtcbiAgICAgICAgYXBwbHlDb2RlQWN0aW9uKGFjdGlvbik7XG4gICAgfSk7XG4gICAgbW9uYWNvLmVkaXRvci5yZWdpc3RlckNvbW1hbmQoTk9PUF9DT01NQU5ELCAoKSA9PiB7IC8qIGRpc3BsYXktb25seSBDb2RlTGVucyAqLyB9KTtcblxuICAgIC8vIENyb3NzLWZpbGUgbmF2aWdhdGlvbjogdGhpcyBzaW5nbGUtZmlsZSBlZGl0b3IgaGFzIG5vIG1vZGVsIGZvciBvdGhlciB3b3Jrc3BhY2UgZmlsZXMsIHNvIEdvIHRvXG4gICAgLy8gRGVmaW5pdGlvbiAvIEZpbmQgUmVmZXJlbmNlcyB0byBhbm90aGVyIGZpbGUgd291bGQgc2lsZW50bHkgZG8gbm90aGluZy4gSGFuZCB0aG9zZSBvZmYgdG8gdGhlIElERVxuICAgIC8vIHRvIG9wZW4gdGhlIHRhcmdldCBmaWxlIChhbmQgcmV2ZWFsIHRoZSBsaW5lKS4gU2FtZS1maWxlIHRhcmdldHMgZmFsbCB0aHJvdWdoIHRvIE1vbmFjby5cbiAgICBtb25hY28uZWRpdG9yLnJlZ2lzdGVyRWRpdG9yT3BlbmVyKHtcbiAgICAgICAgb3BlbkNvZGVFZGl0b3I6IChzb3VyY2UsIHJlc291cmNlLCBzZWxlY3Rpb25PclBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB1cmkgPSByZXNvdXJjZS50b1N0cmluZygpO1xuICAgICAgICAgICAgaWYgKCFpc1dvcmtzcGFjZUZpbGUodXJpKSB8fCAhdXJpLnN0YXJ0c1dpdGgoVklSVFVBTF9GSUxFX1BSRUZJWCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRNb2RlbCA9IHNvdXJjZS5nZXRNb2RlbCgpO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRNb2RlbCAmJiBjdXJyZW50TW9kZWwudXJpLnRvU3RyaW5nKCkgPT09IHVyaSkgcmV0dXJuIGZhbHNlOyAvLyBzYW1lIGZpbGUgXHUyMDE0IGxldCBNb25hY28ganVtcFxuICAgICAgICAgICAgY29uc3Qgb3BlbmVyID0gKGdsb2JhbFRoaXMgYXMgYW55KS5qYXZhTHNwT3BlbkZpbGU7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wZW5lciAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgcG9zID0gc2VsZWN0aW9uT3JQb3NpdGlvbiBhcyB7IHN0YXJ0TGluZU51bWJlcj86IG51bWJlcjsgbGluZU51bWJlcj86IG51bWJlcjsgc3RhcnRDb2x1bW4/OiBudW1iZXI7IGNvbHVtbj86IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgbGluZSA9IHBvcyA/IChwb3Muc3RhcnRMaW5lTnVtYmVyID8/IHBvcy5saW5lTnVtYmVyKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHBvcyA/IChwb3Muc3RhcnRDb2x1bW4gPz8gcG9zLmNvbHVtbikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBvcGVuZXIodXJpLnN1YnN0cmluZyhWSVJUVUFMX0ZJTEVfUFJFRklYLmxlbmd0aCksIGxpbmUsIGNvbHVtbik7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJDb21wbGV0aW9uSXRlbVByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICB0cmlnZ2VyQ2hhcmFjdGVyczogWycuJywgJ0AnLCAnPCddLFxuICAgICAgICBwcm92aWRlQ29tcGxldGlvbkl0ZW1zOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uLCBjb250ZXh0KSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVVcmkgPSBtb2RlbC51cmkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBKRFQuTFMgaGFzIHRoZSBqdXN0LXR5cGVkIHRleHQgYmVmb3JlIGNvbXBsZXRpbmcgKHNlZSBmbHVzaFBlbmRpbmdDaGFuZ2UpLlxuICAgICAgICAgICAgZmx1c2hQZW5kaW5nQ2hhbmdlKGZpbGVVcmkpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBDb21wbGV0aW9uTGlzdCB8IENvbXBsZXRpb25JdGVtW10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9jb21wbGV0aW9uJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IGZpbGVVcmkgfSxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogICAgIHsgbGluZTogcG9zaXRpb24ubGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogcG9zaXRpb24uY29sdW1uIC0gMSB9LFxuICAgICAgICAgICAgICAgIC8vIE1vbmFjbyB0cmlnZ2VyIGtpbmRzIGFyZSAwLWJhc2VkIChJbnZva2UvVHJpZ2dlckNoYXJhY3Rlci9Gb3JJbmNvbXBsZXRlKTsgTFNQIGlzIDEtYmFzZWQuXG4gICAgICAgICAgICAgICAgY29udGV4dDogICAgICB7IHRyaWdnZXJLaW5kOiAoY29udGV4dC50cmlnZ2VyS2luZCA/PyAwKSArIDEsIHRyaWdnZXJDaGFyYWN0ZXI6IGNvbnRleHQudHJpZ2dlckNoYXJhY3RlciB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBpdGVtcyA9IEFycmF5LmlzQXJyYXkocmVzdWx0KSA/IHJlc3VsdCA6IChyZXN1bHQ/Lml0ZW1zID8/IFtdKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3VnZ2VzdGlvbnM6IGl0ZW1zLm1hcChpdGVtID0+IGxzcENvbXBsZXRpb25Ub01vbmFjbyhpdGVtLCBtb2RlbCwgcG9zaXRpb24pKSxcbiAgICAgICAgICAgICAgICAvLyBKRFQuTFMgcmV0dXJucyBhIHRydW5jYXRlZCBsaXN0IG9uIHRoZSBmaXJzdCBrZXlzdHJva2VzOyBwcm9wYWdhdGluZyBcImluY29tcGxldGVcIiBtYWtlc1xuICAgICAgICAgICAgICAgIC8vIE1vbmFjbyByZS1xdWVyeSBhcyB0aGUgdXNlciB0eXBlcyBpbnN0ZWFkIG9mIGNhY2hpbmcgdGhlIGZpcnN0IChvZnRlbiBlbXB0eSkgcmVzdWx0LlxuICAgICAgICAgICAgICAgIGluY29tcGxldGU6ICBBcnJheS5pc0FycmF5KHJlc3VsdCkgPyBmYWxzZSA6ICEhcmVzdWx0Py5pc0luY29tcGxldGUsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvLyBSZXNvbHZlIGRvY3VtZW50YXRpb24gYW5kLCBjcnVjaWFsbHksIHRoZSBhdXRvLWltcG9ydCBhZGRpdGlvbmFsVGV4dEVkaXRzIHdoaWNoIEpEVC5MUyBvbmx5XG4gICAgICAgIC8vIGF0dGFjaGVzIG9uIHJlc29sdmUgXHUyMDE0IHNlbGVjdGluZyBhIHR5cGUgdGhlbiBpbnNlcnRzIGl0cyBpbXBvcnQgc3RhdGVtZW50LlxuICAgICAgICByZXNvbHZlQ29tcGxldGlvbkl0ZW06IGFzeW5jIChpdGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsc3AgPSAoaXRlbSBhcyBNb25hY29Db21wbGV0aW9uSXRlbSkuX2xzcDtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWxzcCkgcmV0dXJuIGl0ZW07XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkOiBDb21wbGV0aW9uSXRlbSA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCdjb21wbGV0aW9uSXRlbS9yZXNvbHZlJywgbHNwKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQuZG9jdW1lbnRhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBpdGVtLmRvY3VtZW50YXRpb24gPSB7IHZhbHVlOiBtYXJrdXBUb1N0cmluZyhyZXNvbHZlZC5kb2N1bWVudGF0aW9uKSwgaXNUcnVzdGVkOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQuZGV0YWlsKSBpdGVtLmRldGFpbCA9IHJlc29sdmVkLmRldGFpbDtcbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQuYWRkaXRpb25hbFRleHRFZGl0cz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uYWRkaXRpb25hbFRleHRFZGl0cyA9IHJlc29sdmVkLmFkZGl0aW9uYWxUZXh0RWRpdHMubWFwKHRleHRFZGl0VG9Nb25hY28pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKCdbamF2YS1sc3BdIGNvbXBsZXRpb24gcmVzb2x2ZSBmYWlsZWQ6JywgKGUgYXMgRXJyb3IpPy5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckhvdmVyUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVIb3ZlcjogYXN5bmMgKG1vZGVsLCBwb3NpdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBmaWxlVXJpID0gbW9kZWwudXJpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IEhvdmVyIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvaG92ZXInLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogZmlsZVVyaSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0Py5jb250ZW50cykgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50cyA9IEFycmF5LmlzQXJyYXkocmVzdWx0LmNvbnRlbnRzKSA/IHJlc3VsdC5jb250ZW50cyA6IFtyZXN1bHQuY29udGVudHNdO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjb250ZW50czogY29udGVudHMubWFwKGMgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHR5cGVvZiBjID09PSAnc3RyaW5nJyA/IGMgOiAoYyBhcyBNYXJrdXBDb250ZW50KS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgaXNUcnVzdGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgcmFuZ2U6IHJlc3VsdC5yYW5nZSA/IGxzcFJhbmdlVG9Nb25hY28ocmVzdWx0LnJhbmdlKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyU2lnbmF0dXJlSGVscFByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBzaWduYXR1cmVIZWxwVHJpZ2dlckNoYXJhY3RlcnM6IFsnKCcsICcsJ10sXG4gICAgICAgIHByb3ZpZGVTaWduYXR1cmVIZWxwOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVVcmkgPSBtb2RlbC51cmkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogU2lnbmF0dXJlSGVscCB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L3NpZ25hdHVyZUhlbHAnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogZmlsZVVyaSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlczogcmVzdWx0LnNpZ25hdHVyZXMubWFwKChzaWc6IFNpZ25hdHVyZUluZm9ybWF0aW9uKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICAgICAgICAgc2lnLmxhYmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRhdGlvbjogc2lnLmRvY3VtZW50YXRpb24gPyBtYXJrdXBUb1N0cmluZyhzaWcuZG9jdW1lbnRhdGlvbikgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiAgICAoc2lnLnBhcmFtZXRlcnMgPz8gW10pLm1hcCgocDogUGFyYW1ldGVySW5mb3JtYXRpb24pID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICAgICAgICAgcC5sYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudGF0aW9uOiBwLmRvY3VtZW50YXRpb24gPyBtYXJrdXBUb1N0cmluZyhwLmRvY3VtZW50YXRpb24pIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZVNpZ25hdHVyZTogcmVzdWx0LmFjdGl2ZVNpZ25hdHVyZSA/PyAwLFxuICAgICAgICAgICAgICAgICAgICBhY3RpdmVQYXJhbWV0ZXI6IHJlc3VsdC5hY3RpdmVQYXJhbWV0ZXIgPz8gMCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGRpc3Bvc2U6ICgpID0+IHt9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJEZWZpbml0aW9uUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVEZWZpbml0aW9uOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVVcmkgPSBtb2RlbC51cmkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogTG9jYXRpb24gfCBMb2NhdGlvbltdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvZGVmaW5pdGlvbicsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBmaWxlVXJpIH0sXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgbG9jYXRpb25zID0gKEFycmF5LmlzQXJyYXkocmVzdWx0KSA/IHJlc3VsdCA6IFtyZXN1bHRdKS5tYXAobG9jID0+ICh7XG4gICAgICAgICAgICAgICAgdXJpOiAgIG1vbmFjby5VcmkucGFyc2UobG9jLnVyaSksXG4gICAgICAgICAgICAgICAgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28obG9jLnJhbmdlKSxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIGF3YWl0IGVuc3VyZU1vZGVsc0ZvckxvY2F0aW9ucyhsb2NhdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGxvY2F0aW9ucztcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJSZWZlcmVuY2VQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZVJlZmVyZW5jZXM6IGFzeW5jIChtb2RlbCwgcG9zaXRpb24sIGNvbnRleHQpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBMb2NhdGlvbltdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvcmVmZXJlbmNlcycsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICAgICAgY29udGV4dDogICAgICB7IGluY2x1ZGVEZWNsYXJhdGlvbjogY29udGV4dC5pbmNsdWRlRGVjbGFyYXRpb24gfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgbG9jYXRpb25zID0gcmVzdWx0Lm1hcChsb2MgPT4gKHsgdXJpOiBtb25hY28uVXJpLnBhcnNlKGxvYy51cmkpLCByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhsb2MucmFuZ2UpIH0pKTtcbiAgICAgICAgICAgIC8vIFRoZSByZWZlcmVuY2VzIHBlZWsgY2FuIG9ubHkgc2hvdyBhIGNvZGUgcHJldmlldyBmb3IgZmlsZXMgaXQgaGFzIGEgbW9kZWwgZm9yOyBjcmVhdGVcbiAgICAgICAgICAgIC8vIGluLW1lbW9yeSBtb2RlbHMgZm9yIHRoZSByZWZlcmVuY2VkIChwb3NzaWJseSB1bm9wZW5lZCkgZmlsZXMgc28gcHJldmlld3MgcmVuZGVyLlxuICAgICAgICAgICAgYXdhaXQgZW5zdXJlTW9kZWxzRm9yTG9jYXRpb25zKGxvY2F0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gbG9jYXRpb25zO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlclJlbmFtZVByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlUmVuYW1lRWRpdHM6IGFzeW5jIChtb2RlbCwgcG9zaXRpb24sIG5ld05hbWUpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiB7IGVkaXRzOiBbXSB9O1xuICAgICAgICAgICAgY29uc3QgZWRpdDogV29ya3NwYWNlRWRpdCB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L3JlbmFtZScsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICAgICAgbmV3TmFtZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFlZGl0KSByZXR1cm4geyBlZGl0czogW10gfTtcbiAgICAgICAgICAgIC8vIEEgSkRULkxTIHJlbmFtZSBjYW4gc3BhbiBtYW55IGZpbGVzIGFuZCBldmVuIHJlbmFtZSB0aGUgdHlwZSdzIG93biAuamF2YSBmaWxlLiBNb25hY28nc1xuICAgICAgICAgICAgLy8gc2luZ2xlLWZpbGUgZWRpdG9yIHdvdWxkIGRyb3AgZXZlcnl0aGluZyBidXQgdGhlIGN1cnJlbnQgbW9kZWwsIHNvIGFwcGx5IHRoZSB3aG9sZSBlZGl0XG4gICAgICAgICAgICAvLyB0aHJvdWdoIHRoZSB3b3Jrc3BhY2Ugb3Vyc2VsdmVzIHdoZW4gdGhlIElERSBwZXJzaXN0ZW5jZSBob29rIGlzIGF2YWlsYWJsZS5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgKGdsb2JhbFRoaXMgYXMgYW55KS5qYXZhTHNwUGVyc2lzdFJlbmFtZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGFwcGx5UmVuYW1lQWNyb3NzV29ya3NwYWNlKG1vZGVsLCBlZGl0KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZWRpdHM6IFtdIH07XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbamF2YS1sc3BdIGNyb3NzLWZpbGUgcmVuYW1lIGZhaWxlZCwgYXBwbHlpbmcgdG8gdGhlIGN1cnJlbnQgZmlsZSBvbmx5OicsIGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gd29ya3NwYWNlRWRpdFRvTW9uYWNvKGVkaXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB3b3Jrc3BhY2VFZGl0VG9Nb25hY28oZWRpdCk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlc29sdmVSZW5hbWVMb2NhdGlvbjogYXN5bmMgKG1vZGVsLCBwb3NpdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogeyByYW5nZTogTHNwUmFuZ2U7IHBsYWNlaG9sZGVyPzogc3RyaW5nIH0gfCBMc3BSYW5nZSB8IG51bGwgPVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L3ByZXBhcmVSZW5hbWUnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gJ3JhbmdlJyBpbiByZXN1bHQgPyByZXN1bHQucmFuZ2UgOiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSAncGxhY2Vob2xkZXInIGluIHJlc3VsdCAmJiByZXN1bHQucGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICAgICAgPyByZXN1bHQucGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICAgICAgOiBtb2RlbC5nZXRXb3JkQXRQb3NpdGlvbihwb3NpdGlvbik/LndvcmQgPz8gJyc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28ocmFuZ2UpLCB0ZXh0OiBwbGFjZWhvbGRlciB9O1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgY29uc3Qgd29yZCA9IG1vZGVsLmdldFdvcmRBdFBvc2l0aW9uKHBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gd29yZCA/IHtcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2U6IHsgc3RhcnRMaW5lTnVtYmVyOiBwb3NpdGlvbi5saW5lTnVtYmVyLCBzdGFydENvbHVtbjogd29yZC5zdGFydENvbHVtbiwgZW5kTGluZU51bWJlcjogcG9zaXRpb24ubGluZU51bWJlciwgZW5kQ29sdW1uOiB3b3JkLmVuZENvbHVtbiB9LFxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiB3b3JkLndvcmQsXG4gICAgICAgICAgICAgICAgfSA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBSZWdpc3RlcmluZyB0aGlzIHByb3ZpZGVyIGFsc28gZW5hYmxlcyBlZGl0b3IuanMncyBleGlzdGluZyBmb3JtYXQtb24tc2F2ZSBwYXRoIGZvciBKYXZhOiB0aGVcbiAgICAvLyBzaGFyZWQgU2F2ZSBhY3Rpb24gcnVucyBlZGl0b3IuYWN0aW9uLmZvcm1hdERvY3VtZW50IHdoZW4gYXV0by1mb3JtYXR0aW5nIGlzIG9uICh0aGUgc2FtZVxuICAgIC8vIG1lY2hhbmlzbSBhbmQgZ2xvYmFsIHRvZ2dsZSB1c2VkIGZvciBUeXBlU2NyaXB0KS5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyRG9jdW1lbnRGb3JtYXR0aW5nRWRpdFByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlRG9jdW1lbnRGb3JtYXR0aW5nRWRpdHM6IGFzeW5jIChtb2RlbCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBlZGl0czogVGV4dEVkaXRbXSB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L2Zvcm1hdHRpbmcnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiAgICAgIHsgdGFiU2l6ZTogbW9kZWwuZ2V0T3B0aW9ucygpLnRhYlNpemUsIGluc2VydFNwYWNlczogbW9kZWwuZ2V0T3B0aW9ucygpLmluc2VydFNwYWNlcyB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gZWRpdHMgPyBlZGl0cy5tYXAodGV4dEVkaXRUb01vbmFjbykgOiBudWxsO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckNvZGVBY3Rpb25Qcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZUNvZGVBY3Rpb25zOiBhc3luYyAobW9kZWwsIHJhbmdlLCBjb250ZXh0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbXB0eSA9IHsgYWN0aW9uczogW10sIGRpc3Bvc2UoKSB7IC8qIG5vdGhpbmcgdG8gZGlzcG9zZSAqLyB9IH07XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gZW1wdHk7XG4gICAgICAgICAgICAvLyBTZW5kIHRoZSBvcmlnaW5hbCBMU1AgZGlhZ25vc3RpY3MgdGhhdCBvdmVybGFwIHRoZSByYW5nZSAodGhleSBjYXJyeSB0aGUgY29kZS9kYXRhIEpEVC5MU1xuICAgICAgICAgICAgLy8gbmVlZHMgdG8gY29tcHV0ZSBxdWljay1maXhlcyksIG5vdCBvbmVzIHJlY29uc3RydWN0ZWQgZnJvbSBNb25hY28gbWFya2Vycy5cbiAgICAgICAgICAgIGNvbnN0IGxzcFJhbmdlID0gbW9uYWNvUmFuZ2VUb0xzcChyYW5nZSk7XG4gICAgICAgICAgICBjb25zdCBkaWFnbm9zdGljcyA9IChfZGlhZ25vc3RpY3MuZ2V0KG1vZGVsLnVyaS50b1N0cmluZygpKSA/PyBbXSkuZmlsdGVyKGQgPT4gcmFuZ2VzT3ZlcmxhcChkLnJhbmdlLCBsc3BSYW5nZSkpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBBcnJheTxDb2RlQWN0aW9uIHwgQ29tbWFuZD4gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9jb2RlQWN0aW9uJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICAgICAgcmFuZ2U6ICAgICAgICBsc3BSYW5nZSxcbiAgICAgICAgICAgICAgICBjb250ZXh0OiAgICAgIHsgZGlhZ25vc3RpY3MsIG9ubHk6IGNvbnRleHQub25seSA/IFtjb250ZXh0Lm9ubHldIDogdW5kZWZpbmVkIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0Py5sZW5ndGgpIHJldHVybiBlbXB0eTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgYWN0aW9uczogcmVzdWx0Lm1hcChsc3BDb2RlQWN0aW9uVG9Nb25hY28pLFxuICAgICAgICAgICAgICAgIGRpc3Bvc2UoKSB7IC8qIG5vdGhpbmcgdG8gZGlzcG9zZSAqLyB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICB9LCB7XG4gICAgICAgIHByb3ZpZGVkQ29kZUFjdGlvbktpbmRzOiBbJ3F1aWNrZml4JywgJ3JlZmFjdG9yJywgJ3JlZmFjdG9yLmV4dHJhY3QnLCAncmVmYWN0b3IuaW5saW5lJyxcbiAgICAgICAgICAgICdyZWZhY3Rvci5yZXdyaXRlJywgJ3NvdXJjZScsICdzb3VyY2Uub3JnYW5pemVJbXBvcnRzJ10sXG4gICAgfSk7XG5cbiAgICAvLyAtLS0gTmF2aWdhdGlvbiAmIHN0cnVjdHVyZSAoUGFjayAxKSAtLS1cblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJJbXBsZW1lbnRhdGlvblByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlSW1wbGVtZW50YXRpb246IChtb2RlbCwgcG9zaXRpb24pID0+IHJlcXVlc3RMb2NhdGlvbnMoJ3RleHREb2N1bWVudC9pbXBsZW1lbnRhdGlvbicsIG1vZGVsLCBwb3NpdGlvbiksXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyVHlwZURlZmluaXRpb25Qcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZVR5cGVEZWZpbml0aW9uOiAobW9kZWwsIHBvc2l0aW9uKSA9PiByZXF1ZXN0TG9jYXRpb25zKCd0ZXh0RG9jdW1lbnQvdHlwZURlZmluaXRpb24nLCBtb2RlbCwgcG9zaXRpb24pLFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckRvY3VtZW50SGlnaGxpZ2h0UHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVEb2N1bWVudEhpZ2hsaWdodHM6IGFzeW5jIChtb2RlbCwgcG9zaXRpb24pID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBhbnlbXSB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L2RvY3VtZW50SGlnaGxpZ2h0Jywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5tYXAoaCA9PiAoeyByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhoLnJhbmdlKSwga2luZDogaC5raW5kID8gaC5raW5kIC0gMSA6IHVuZGVmaW5lZCB9KSk7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyRG9jdW1lbnRTeW1ib2xQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZURvY3VtZW50U3ltYm9sczogYXN5bmMgKG1vZGVsKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55W10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9kb2N1bWVudFN5bWJvbCcsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0ID8gbWFwRG9jdW1lbnRTeW1ib2xzKHJlc3VsdCkgOiBudWxsO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckZvbGRpbmdSYW5nZVByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlRm9sZGluZ1JhbmdlczogYXN5bmMgKG1vZGVsKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55W10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9mb2xkaW5nUmFuZ2UnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5tYXAociA9PiAoeyBzdGFydDogci5zdGFydExpbmUgKyAxLCBlbmQ6IHIuZW5kTGluZSArIDEsIGtpbmQ6IGZvbGRpbmdLaW5kKHIua2luZCkgfSkpO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlclNlbGVjdGlvblJhbmdlUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVTZWxlY3Rpb25SYW5nZXM6IGFzeW5jIChtb2RlbCwgcG9zaXRpb25zKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55W10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9zZWxlY3Rpb25SYW5nZScsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uczogICAgcG9zaXRpb25zLm1hcChwID0+ICh7IGxpbmU6IHAubGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogcC5jb2x1bW4gLSAxIH0pKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5tYXAoZmxhdHRlblNlbGVjdGlvblJhbmdlKTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJEb2N1bWVudFJhbmdlRm9ybWF0dGluZ0VkaXRQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZURvY3VtZW50UmFuZ2VGb3JtYXR0aW5nRWRpdHM6IGFzeW5jIChtb2RlbCwgcmFuZ2UpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgZWRpdHM6IFRleHRFZGl0W10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9yYW5nZUZvcm1hdHRpbmcnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgICAgICByYW5nZTogICAgICAgIG1vbmFjb1JhbmdlVG9Mc3AocmFuZ2UpLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6ICAgICAgeyB0YWJTaXplOiBtb2RlbC5nZXRPcHRpb25zKCkudGFiU2l6ZSwgaW5zZXJ0U3BhY2VzOiBtb2RlbC5nZXRPcHRpb25zKCkuaW5zZXJ0U3BhY2VzIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBlZGl0cyA/IGVkaXRzLm1hcCh0ZXh0RWRpdFRvTW9uYWNvKSA6IG51bGw7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyAtLS0gSW5sYXkgaGludHMgKyBzZW1hbnRpYyBoaWdobGlnaHRpbmcgKFBhY2sgMikgLS0tXG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVySW5sYXlIaW50c1Byb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlSW5sYXlIaW50czogYXN5bmMgKG1vZGVsLCByYW5nZSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IGFueVtdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvaW5sYXlIaW50Jywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICAgICAgcmFuZ2U6ICAgICAgICBtb25hY29SYW5nZVRvTHNwKHJhbmdlKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBoaW50czogcmVzdWx0Lm1hcChoID0+ICh7XG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lTnVtYmVyOiBoLnBvc2l0aW9uLmxpbmUgKyAxLCBjb2x1bW46IGgucG9zaXRpb24uY2hhcmFjdGVyICsgMSB9LFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogICAgICAgIHR5cGVvZiBoLmxhYmVsID09PSAnc3RyaW5nJyA/IGgubGFiZWwgOiAoaC5sYWJlbCA/PyBbXSkubWFwKChwOiBhbnkpID0+ICh7IGxhYmVsOiBwLnZhbHVlIH0pKSxcbiAgICAgICAgICAgICAgICAgICAga2luZDogICAgICAgICBoLmtpbmQsXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmdMZWZ0OiAgaC5wYWRkaW5nTGVmdCxcbiAgICAgICAgICAgICAgICAgICAgcGFkZGluZ1JpZ2h0OiBoLnBhZGRpbmdSaWdodCxcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcDogICAgICBoLnRvb2x0aXAgPyBtYXJrdXBUb1N0cmluZyhoLnRvb2x0aXApIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgICBkaXNwb3NlKCkgeyAvKiBub3RoaW5nIHRvIGRpc3Bvc2UgKi8gfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyRG9jdW1lbnRTZW1hbnRpY1Rva2Vuc1Byb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBnZXRMZWdlbmQ6ICgpID0+IF9zZW1hbnRpY1Rva2Vuc0xlZ2VuZCA/PyB7IHRva2VuVHlwZXM6IFtdLCB0b2tlbk1vZGlmaWVyczogW10gfSxcbiAgICAgICAgcHJvdmlkZURvY3VtZW50U2VtYW50aWNUb2tlbnM6IGFzeW5jIChtb2RlbCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSB8fCAhX3NlbWFudGljVG9rZW5zTGVnZW5kKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogeyBkYXRhOiBudW1iZXJbXTsgcmVzdWx0SWQ/OiBzdHJpbmcgfSB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L3NlbWFudGljVG9rZW5zL2Z1bGwnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQ/LmRhdGEpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogbmV3IFVpbnQzMkFycmF5KHJlc3VsdC5kYXRhKSwgcmVzdWx0SWQ6IHJlc3VsdC5yZXN1bHRJZCB9O1xuICAgICAgICB9LFxuICAgICAgICByZWxlYXNlRG9jdW1lbnRTZW1hbnRpY1Rva2VuczogKCkgPT4geyAvKiBub3RoaW5nIHRvIHJlbGVhc2UgKi8gfSxcbiAgICB9KTtcblxuICAgIC8vIC0tLSBDb2RlTGVucyAoUGFjayAzKSAtLS1cblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJDb2RlTGVuc1Byb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlQ29kZUxlbnNlczogYXN5bmMgKG1vZGVsKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4geyBsZW5zZXM6IFtdLCBkaXNwb3NlKCkgeyAvKiAqLyB9IH07XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IGFueVtdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvY29kZUxlbnMnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgbGVuc2VzID0gKHJlc3VsdCA/PyBbXSkubWFwKChsZW5zLCBpKSA9PiAoe1xuICAgICAgICAgICAgICAgIHJhbmdlOiAgICBsc3BSYW5nZVRvTW9uYWNvKGxlbnMucmFuZ2UpLFxuICAgICAgICAgICAgICAgIGlkOiAgICAgICBTdHJpbmcoaSksXG4gICAgICAgICAgICAgICAgY29tbWFuZDogIGxlbnMuY29tbWFuZCA/IG1hcExlbnNDb21tYW5kKGxlbnMuY29tbWFuZCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgX2xzcDogICAgIGxlbnMsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICByZXR1cm4geyBsZW5zZXMsIGRpc3Bvc2UoKSB7IC8qICovIH0gfTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVzb2x2ZUNvZGVMZW5zOiBhc3luYyAoX21vZGVsLCBjb2RlTGVucykgPT4ge1xuICAgICAgICAgICAgY29uc3QgbHNwID0gKGNvZGVMZW5zIGFzIGFueSkuX2xzcDtcbiAgICAgICAgICAgIGlmIChfY29ubiAmJiBsc3AgJiYgIWxzcC5jb21tYW5kKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWQ6IGFueSA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCdjb2RlTGVucy9yZXNvbHZlJywgbHNwKTtcbiAgICAgICAgICAgICAgICAgICAgY29kZUxlbnMuY29tbWFuZCA9IHJlc29sdmVkPy5jb21tYW5kID8gbWFwTGVuc0NvbW1hbmQocmVzb2x2ZWQuY29tbWFuZCkgOiB7IGlkOiBOT09QX0NPTU1BTkQsIHRpdGxlOiAnJyB9O1xuICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICBjb2RlTGVucy5jb21tYW5kID0geyBpZDogTk9PUF9DT01NQU5ELCB0aXRsZTogJycgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29kZUxlbnM7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyAtLS0gSmF2YSBrZXl3b3JkIGNvbXBsZXRpb24gKFBhY2sgMWIpOiBhbHdheXMtYXZhaWxhYmxlLCByYW5rZWQgYmVsb3cgU0RLL0xTUCByZXN1bHRzIC0tLVxuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckNvbXBsZXRpb25JdGVtUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVDb21wbGV0aW9uSXRlbXM6IChtb2RlbCwgcG9zaXRpb24pID0+IHtcbiAgICAgICAgICAgIGlmICghaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCB3b3JkID0gbW9kZWwuZ2V0V29yZFVudGlsUG9zaXRpb24ocG9zaXRpb24pO1xuICAgICAgICAgICAgY29uc3QgcmFuZ2U6IG1vbmFjby5JUmFuZ2UgPSB7XG4gICAgICAgICAgICAgICAgc3RhcnRMaW5lTnVtYmVyOiBwb3NpdGlvbi5saW5lTnVtYmVyLCBzdGFydENvbHVtbjogd29yZC5zdGFydENvbHVtbixcbiAgICAgICAgICAgICAgICBlbmRMaW5lTnVtYmVyOiAgIHBvc2l0aW9uLmxpbmVOdW1iZXIsIGVuZENvbHVtbjogICB3b3JkLmVuZENvbHVtbixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb25zOiBKQVZBX0tFWVdPUkRTLm1hcChrZXl3b3JkID0+ICh7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAgICAgIGtleXdvcmQsXG4gICAgICAgICAgICAgICAgICAgIGtpbmQ6ICAgICAgIG1vbmFjby5sYW5ndWFnZXMuQ29tcGxldGlvbkl0ZW1LaW5kLktleXdvcmQsXG4gICAgICAgICAgICAgICAgICAgIGluc2VydFRleHQ6IGtleXdvcmQsXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlLFxuICAgICAgICAgICAgICAgICAgICBzb3J0VGV4dDogICBgOV8ke2tleXdvcmR9YCxcbiAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgIH0pO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBIZWxwZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIGxzcFNldmVyaXR5KHNldmVyaXR5OiBEaWFnbm9zdGljU2V2ZXJpdHkgfCB1bmRlZmluZWQpOiBtb25hY28uTWFya2VyU2V2ZXJpdHkge1xuICAgIHN3aXRjaCAoc2V2ZXJpdHkpIHtcbiAgICAgICAgY2FzZSBEaWFnbm9zdGljU2V2ZXJpdHkuRXJyb3I6ICAgICAgIHJldHVybiBtb25hY28uTWFya2VyU2V2ZXJpdHkuRXJyb3I7XG4gICAgICAgIGNhc2UgRGlhZ25vc3RpY1NldmVyaXR5Lldhcm5pbmc6ICAgICByZXR1cm4gbW9uYWNvLk1hcmtlclNldmVyaXR5Lldhcm5pbmc7XG4gICAgICAgIGNhc2UgRGlhZ25vc3RpY1NldmVyaXR5LkluZm9ybWF0aW9uOiByZXR1cm4gbW9uYWNvLk1hcmtlclNldmVyaXR5LkluZm87XG4gICAgICAgIGNhc2UgRGlhZ25vc3RpY1NldmVyaXR5LkhpbnQ6ICAgICAgICByZXR1cm4gbW9uYWNvLk1hcmtlclNldmVyaXR5LkhpbnQ7XG4gICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9uYWNvLk1hcmtlclNldmVyaXR5LkVycm9yO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gbHNwUmFuZ2VUb01vbmFjbyhyOiB7IHN0YXJ0OiB7IGxpbmU6IG51bWJlcjsgY2hhcmFjdGVyOiBudW1iZXIgfTsgZW5kOiB7IGxpbmU6IG51bWJlcjsgY2hhcmFjdGVyOiBudW1iZXIgfSB9KTogbW9uYWNvLklSYW5nZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnRMaW5lTnVtYmVyOiByLnN0YXJ0LmxpbmUgKyAxLFxuICAgICAgICBzdGFydENvbHVtbjogICAgIHIuc3RhcnQuY2hhcmFjdGVyICsgMSxcbiAgICAgICAgZW5kTGluZU51bWJlcjogICByLmVuZC5saW5lICsgMSxcbiAgICAgICAgZW5kQ29sdW1uOiAgICAgICByLmVuZC5jaGFyYWN0ZXIgKyAxLFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIG1hcmt1cFRvU3RyaW5nKGM6IHN0cmluZyB8IE1hcmt1cENvbnRlbnQpOiBzdHJpbmcge1xuICAgIHJldHVybiB0eXBlb2YgYyA9PT0gJ3N0cmluZycgPyBjIDogYy52YWx1ZTtcbn1cblxuZnVuY3Rpb24gbHNwQ29tcGxldGlvbktpbmQoa2luZDogQ29tcGxldGlvbkl0ZW1LaW5kIHwgdW5kZWZpbmVkKTogbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbUtpbmQge1xuICAgIGNvbnN0IEsgPSBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtS2luZDtcbiAgICBzd2l0Y2ggKGtpbmQpIHtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuVGV4dDogICAgICAgICAgcmV0dXJuIEsuVGV4dDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuTWV0aG9kOiAgICAgICAgcmV0dXJuIEsuTWV0aG9kO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5GdW5jdGlvbjogICAgICByZXR1cm4gSy5GdW5jdGlvbjtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuQ29uc3RydWN0b3I6ICAgcmV0dXJuIEsuQ29uc3RydWN0b3I7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLkZpZWxkOiAgICAgICAgIHJldHVybiBLLkZpZWxkO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5WYXJpYWJsZTogICAgICByZXR1cm4gSy5WYXJpYWJsZTtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuQ2xhc3M6ICAgICAgICAgcmV0dXJuIEsuQ2xhc3M7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLkludGVyZmFjZTogICAgIHJldHVybiBLLkludGVyZmFjZTtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuTW9kdWxlOiAgICAgICAgcmV0dXJuIEsuTW9kdWxlO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5Qcm9wZXJ0eTogICAgICByZXR1cm4gSy5Qcm9wZXJ0eTtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuS2V5d29yZDogICAgICAgcmV0dXJuIEsuS2V5d29yZDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuU25pcHBldDogICAgICAgcmV0dXJuIEsuU25pcHBldDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuQ29uc3RhbnQ6ICAgICAgcmV0dXJuIEsuQ29uc3RhbnQ7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLlN0cnVjdDogICAgICAgIHJldHVybiBLLlN0cnVjdDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuVHlwZVBhcmFtZXRlcjogcmV0dXJuIEsuVHlwZVBhcmFtZXRlcjtcbiAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEsuVGV4dDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGxzcENvbXBsZXRpb25Ub01vbmFjbyhcbiAgICBpdGVtOiBDb21wbGV0aW9uSXRlbSxcbiAgICBtb2RlbDogbW9uYWNvLmVkaXRvci5JVGV4dE1vZGVsLFxuICAgIHBvc2l0aW9uOiBtb25hY28uUG9zaXRpb24sXG4pOiBNb25hY29Db21wbGV0aW9uSXRlbSB7XG4gICAgY29uc3Qgd29yZCA9IG1vZGVsLmdldFdvcmRVbnRpbFBvc2l0aW9uKHBvc2l0aW9uKTtcbiAgICBsZXQgcmFuZ2U6IG1vbmFjby5JUmFuZ2UgPSB7XG4gICAgICAgIHN0YXJ0TGluZU51bWJlcjogcG9zaXRpb24ubGluZU51bWJlcixcbiAgICAgICAgc3RhcnRDb2x1bW46ICAgICB3b3JkLnN0YXJ0Q29sdW1uLFxuICAgICAgICBlbmRMaW5lTnVtYmVyOiAgIHBvc2l0aW9uLmxpbmVOdW1iZXIsXG4gICAgICAgIGVuZENvbHVtbjogICAgICAgd29yZC5lbmRDb2x1bW4sXG4gICAgfTtcbiAgICBsZXQgaW5zZXJ0VGV4dCA9IGl0ZW0uaW5zZXJ0VGV4dCA/PyBpdGVtLmxhYmVsO1xuICAgIGNvbnN0IHRleHRFZGl0ID0gaXRlbS50ZXh0RWRpdCBhcyB7IHJhbmdlPzogTHNwUmFuZ2U7IHJlcGxhY2U/OiBMc3BSYW5nZTsgaW5zZXJ0PzogTHNwUmFuZ2U7IG5ld1RleHQ/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcbiAgICBpZiAodGV4dEVkaXQpIHtcbiAgICAgICAgY29uc3QgciA9IHRleHRFZGl0LnJhbmdlID8/IHRleHRFZGl0LnJlcGxhY2UgPz8gdGV4dEVkaXQuaW5zZXJ0O1xuICAgICAgICBpZiAocikgcmFuZ2UgPSBsc3BSYW5nZVRvTW9uYWNvKHIpO1xuICAgICAgICBpZiAodHlwZW9mIHRleHRFZGl0Lm5ld1RleHQgPT09ICdzdHJpbmcnKSBpbnNlcnRUZXh0ID0gdGV4dEVkaXQubmV3VGV4dDtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0OiBNb25hY29Db21wbGV0aW9uSXRlbSA9IHtcbiAgICAgICAgbGFiZWw6ICAgICAgICAgICBpdGVtLmxhYmVsLFxuICAgICAgICBraW5kOiAgICAgICAgICAgIGxzcENvbXBsZXRpb25LaW5kKGl0ZW0ua2luZCksXG4gICAgICAgIGRldGFpbDogICAgICAgICAgaXRlbS5kZXRhaWwsXG4gICAgICAgIGRvY3VtZW50YXRpb246ICAgaXRlbS5kb2N1bWVudGF0aW9uID8geyB2YWx1ZTogbWFya3VwVG9TdHJpbmcoaXRlbS5kb2N1bWVudGF0aW9uKSwgaXNUcnVzdGVkOiBmYWxzZSB9IDogdW5kZWZpbmVkLFxuICAgICAgICBpbnNlcnRUZXh0LFxuICAgICAgICBpbnNlcnRUZXh0UnVsZXM6IGl0ZW0uaW5zZXJ0VGV4dEZvcm1hdCA9PT0gSW5zZXJ0VGV4dEZvcm1hdC5TbmlwcGV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbUluc2VydFRleHRSdWxlLkluc2VydEFzU25pcHBldFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgcmFuZ2UsXG4gICAgICAgIHNvcnRUZXh0OiAgICAgICAgICAgIHNka1ByaW9yaXRpc2VkU29ydFRleHQoaXRlbSksXG4gICAgICAgIGZpbHRlclRleHQ6ICAgICAgICAgIGl0ZW0uZmlsdGVyVGV4dCxcbiAgICAgICAgcHJlc2VsZWN0OiAgICAgICAgICAgaXRlbS5wcmVzZWxlY3QsXG4gICAgICAgIGNvbW1pdENoYXJhY3RlcnM6ICAgIGl0ZW0uY29tbWl0Q2hhcmFjdGVycyxcbiAgICAgICAgYWRkaXRpb25hbFRleHRFZGl0czogaXRlbS5hZGRpdGlvbmFsVGV4dEVkaXRzPy5tYXAodGV4dEVkaXRUb01vbmFjbyksXG4gICAgfTtcbiAgICByZXN1bHQuX2xzcCA9IGl0ZW07XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBSYW5rcyBEaXJpZ2libGUgU0RLIHN1Z2dlc3Rpb25zICh7QGNvZGUgb3JnLmVjbGlwc2UuZGlyaWdpYmxlLnNkay4qfSkgYWJvdmUgZXZlcnl0aGluZyBlbHNlIGJ5XG4gKiBwcmVmaXhpbmcgdGhlIHNlcnZlciBzb3J0VGV4dCB3aXRoIGEgcHJpb3JpdHkgYnVja2V0LCBwcmVzZXJ2aW5nIHRoZSBzZXJ2ZXIgb3JkZXIgd2l0aGluIGVhY2ggYnVja2V0LlxuICovXG5mdW5jdGlvbiBzZGtQcmlvcml0aXNlZFNvcnRUZXh0KGl0ZW06IENvbXBsZXRpb25JdGVtKTogc3RyaW5nIHtcbiAgICBjb25zdCBiYXNlID0gaXRlbS5zb3J0VGV4dCA/PyAodHlwZW9mIGl0ZW0ubGFiZWwgPT09ICdzdHJpbmcnID8gaXRlbS5sYWJlbCA6ICcnKTtcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IChpdGVtLmxhYmVsRGV0YWlscyAmJiB0eXBlb2YgaXRlbS5sYWJlbERldGFpbHMuZGVzY3JpcHRpb24gPT09ICdzdHJpbmcnKVxuICAgICAgICA/IGl0ZW0ubGFiZWxEZXRhaWxzLmRlc2NyaXB0aW9uIDogJyc7XG4gICAgY29uc3QgaGF5c3RhY2sgPSBgJHtpdGVtLmRldGFpbCA/PyAnJ30gJHtkZXNjcmlwdGlvbn1gO1xuICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcygnb3JnLmVjbGlwc2UuZGlyaWdpYmxlLnNkaycpID8gYDBfJHtiYXNlfWAgOiBgMV8ke2Jhc2V9YDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ29kZSBhY3Rpb25zLCBjb21tYW5kcywgcmVmYWN0b3IvZ2VuZXJhdGUsIHdvcmtzcGFjZSBlZGl0c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogTW9uYWNvIGNvbW1hbmQgaWQgdXNlZCB0byBhcHBseSBhIGRlZmVycmVkIExTUCBjb2RlIGFjdGlvbiB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgaXQuICovXG5jb25zdCBBUFBMWV9BQ1RJT05fQ09NTUFORCA9ICdkaXJpZ2libGUuamF2YS5hcHBseUNvZGVBY3Rpb24nO1xuXG4vKiogVmlydHVhbCBVUkkgcHJlZml4IG9mIGVkaXRvciBtb2RlbHM7IHN0cmlwcGluZyBpdCB5aWVsZHMgdGhlIElERSB3b3Jrc3BhY2UgcGF0aCAoL3dzL3Byb2ovLi4uKS4gKi9cbmNvbnN0IFZJUlRVQUxfRklMRV9QUkVGSVggPSAnZmlsZTovLy93b3Jrc3BhY2UnO1xuXG4vKiogTW9uYWNvIGNvbW1hbmQgaWQgdXNlZCBmb3IgZGlzcGxheS1vbmx5IENvZGVMZW5zZXMgKGUuZy4gYSByZWZlcmVuY2UgY291bnQgd2l0aCBubyByZXNvbHZlZCBhY3Rpb24pLiAqL1xuY29uc3QgTk9PUF9DT01NQU5EID0gJ2RpcmlnaWJsZS5qYXZhLm5vb3BMZW5zJztcblxuLyoqIEphdmEgU0Uga2V5d29yZHMvbGl0ZXJhbHMgb2ZmZXJlZCBhcyBsb3ctcHJpb3JpdHkgY29tcGxldGlvbiBzbyB0aGV5IGFsd2F5cyBhcHBlYXIgd2hpbGUgdHlwaW5nLiAqL1xuY29uc3QgSkFWQV9LRVlXT1JEUyA9IFsnYWJzdHJhY3QnLCAnYXNzZXJ0JywgJ2Jvb2xlYW4nLCAnYnJlYWsnLCAnYnl0ZScsICdjYXNlJywgJ2NhdGNoJywgJ2NoYXInLCAnY2xhc3MnLFxuICAgICdjb25zdCcsICdjb250aW51ZScsICdkZWZhdWx0JywgJ2RvJywgJ2RvdWJsZScsICdlbHNlJywgJ2VudW0nLCAnZXh0ZW5kcycsICdmaW5hbCcsICdmaW5hbGx5JywgJ2Zsb2F0JyxcbiAgICAnZm9yJywgJ2dvdG8nLCAnaWYnLCAnaW1wbGVtZW50cycsICdpbXBvcnQnLCAnaW5zdGFuY2VvZicsICdpbnQnLCAnaW50ZXJmYWNlJywgJ2xvbmcnLCAnbmF0aXZlJywgJ25ldycsXG4gICAgJ3BhY2thZ2UnLCAncHJpdmF0ZScsICdwcm90ZWN0ZWQnLCAncHVibGljJywgJ3JldHVybicsICdzaG9ydCcsICdzdGF0aWMnLCAnc3RyaWN0ZnAnLCAnc3VwZXInLCAnc3dpdGNoJyxcbiAgICAnc3luY2hyb25pemVkJywgJ3RoaXMnLCAndGhyb3cnLCAndGhyb3dzJywgJ3RyYW5zaWVudCcsICd0cnknLCAndm9pZCcsICd2b2xhdGlsZScsICd3aGlsZScsICd2YXInLFxuICAgICd5aWVsZCcsICdyZWNvcmQnLCAnc2VhbGVkJywgJ3Blcm1pdHMnLCAndHJ1ZScsICdmYWxzZScsICdudWxsJ107XG5cbi8qKiBTaGFyZWQgZGVmaW5pdGlvbi1zdHlsZSBsb2NhdGlvbiByZXF1ZXN0IHVzZWQgYnkgZ28tdG8tZGVmaW5pdGlvbi9pbXBsZW1lbnRhdGlvbi90eXBlLWRlZmluaXRpb24uICovXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0TG9jYXRpb25zKG1ldGhvZDogc3RyaW5nLCBtb2RlbDogbW9uYWNvLmVkaXRvci5JVGV4dE1vZGVsLCBwb3NpdGlvbjogbW9uYWNvLlBvc2l0aW9uKSB7XG4gICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgcmVzdWx0OiBMb2NhdGlvbiB8IExvY2F0aW9uW10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QobWV0aG9kLCB7XG4gICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgfSk7XG4gICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGxvY2F0aW9ucyA9IChBcnJheS5pc0FycmF5KHJlc3VsdCkgPyByZXN1bHQgOiBbcmVzdWx0XSkubWFwKGxvYyA9PiAoeyB1cmk6IG1vbmFjby5VcmkucGFyc2UobG9jLnVyaSksIHJhbmdlOiBsc3BSYW5nZVRvTW9uYWNvKGxvYy5yYW5nZSkgfSkpO1xuICAgIGF3YWl0IGVuc3VyZU1vZGVsc0ZvckxvY2F0aW9ucyhsb2NhdGlvbnMpO1xuICAgIHJldHVybiBsb2NhdGlvbnM7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBpbi1tZW1vcnkgTW9uYWNvIG1vZGVscyBmb3IgdGhlIHdvcmtzcGFjZSBmaWxlcyByZWZlcmVuY2VkIGJ5IHRoZSBnaXZlbiBsb2NhdGlvbnMgKGZldGNoZWRcbiAqIG92ZXIgUkVTVCkgc28gdGhlIHJlZmVyZW5jZXMgLyBwZWVrIHdpZGdldHMgY2FuIHJlbmRlciBhIGNvZGUgcHJldmlldyBcdTIwMTQgTW9uYWNvIGNhbiBvbmx5IHByZXZpZXcgZmlsZXNcbiAqIGl0IGhhcyBhIG1vZGVsIGZvciwgYW5kIHRoaXMgc2luZ2xlLWZpbGUgZWRpdG9yIG90aGVyd2lzZSBoYXMgbm9uZSBmb3Igb3RoZXIgZmlsZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGVuc3VyZU1vZGVsc0ZvckxvY2F0aW9ucyhsb2NhdGlvbnM6IEFycmF5PHsgdXJpOiBtb25hY28uVXJpIH0+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKGxvY2F0aW9ucy5tYXAoYXN5bmMgKHsgdXJpIH0pID0+IHtcbiAgICAgICAgY29uc3QgdXJpU3RyID0gdXJpLnRvU3RyaW5nKCk7XG4gICAgICAgIGlmIChzZWVuLmhhcyh1cmlTdHIpIHx8ICF1cmlTdHIuc3RhcnRzV2l0aChWSVJUVUFMX0ZJTEVfUFJFRklYKSB8fCBtb25hY28uZWRpdG9yLmdldE1vZGVsKHVyaSkpIHJldHVybjtcbiAgICAgICAgc2Vlbi5hZGQodXJpU3RyKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCBmZXRjaFdvcmtzcGFjZUZpbGVUZXh0KHVyaVRvV29ya3NwYWNlUGF0aCh1cmlTdHIpID8/IHVyaVN0cik7XG4gICAgICAgICAgICBpZiAoIW1vbmFjby5lZGl0b3IuZ2V0TW9kZWwodXJpKSkgbW9uYWNvLmVkaXRvci5jcmVhdGVNb2RlbCh0ZXh0LCAnamF2YScsIHVyaSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gcHJldmlldyBqdXN0IHdvbid0IHJlbmRlciBmb3IgdGhpcyBvbmVcbiAgICAgICAgfVxuICAgIH0pKTtcbn1cblxuLyoqIFJlY3Vyc2l2ZWx5IG1hcHMgTFNQIGhpZXJhcmNoaWNhbCBEb2N1bWVudFN5bWJvbHMgdG8gTW9uYWNvJ3Mgc2hhcGUgKGtpbmRzIGFyZSAxLWJhc2VkIHZzIDAtYmFzZWQpLiAqL1xuZnVuY3Rpb24gbWFwRG9jdW1lbnRTeW1ib2xzKHN5bWJvbHM6IGFueVtdKTogbW9uYWNvLmxhbmd1YWdlcy5Eb2N1bWVudFN5bWJvbFtdIHtcbiAgICByZXR1cm4gKHN5bWJvbHMgPz8gW10pLm1hcChzID0+ICh7XG4gICAgICAgIG5hbWU6ICAgICAgICAgICBzLm5hbWUsXG4gICAgICAgIGRldGFpbDogICAgICAgICBzLmRldGFpbCA/PyAnJyxcbiAgICAgICAga2luZDogICAgICAgICAgIChzLmtpbmQgPz8gMSkgLSAxLFxuICAgICAgICB0YWdzOiAgICAgICAgICAgcy50YWdzID8/IFtdLFxuICAgICAgICByYW5nZTogICAgICAgICAgbHNwUmFuZ2VUb01vbmFjbyhzLnJhbmdlKSxcbiAgICAgICAgc2VsZWN0aW9uUmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28ocy5zZWxlY3Rpb25SYW5nZSA/PyBzLnJhbmdlKSxcbiAgICAgICAgY2hpbGRyZW46ICAgICAgIHMuY2hpbGRyZW4gPyBtYXBEb2N1bWVudFN5bWJvbHMocy5jaGlsZHJlbikgOiBbXSxcbiAgICB9KSk7XG59XG5cbmZ1bmN0aW9uIGZvbGRpbmdLaW5kKGtpbmQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IG1vbmFjby5sYW5ndWFnZXMuRm9sZGluZ1JhbmdlS2luZCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgRksgPSBtb25hY28ubGFuZ3VhZ2VzLkZvbGRpbmdSYW5nZUtpbmQ7XG4gICAgc3dpdGNoIChraW5kKSB7XG4gICAgICAgIGNhc2UgJ2NvbW1lbnQnOiByZXR1cm4gRksuQ29tbWVudDtcbiAgICAgICAgY2FzZSAnaW1wb3J0cyc6IHJldHVybiBGSy5JbXBvcnRzO1xuICAgICAgICBjYXNlICdyZWdpb24nOiAgcmV0dXJuIEZLLlJlZ2lvbjtcbiAgICAgICAgZGVmYXVsdDogICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxufVxuXG4vKiogRmxhdHRlbnMgYW4gTFNQIFNlbGVjdGlvblJhbmdlIHBhcmVudC1jaGFpbiBpbnRvIE1vbmFjbydzIGlubmVybW9zdC10by1vdXRlcm1vc3QgYXJyYXkuICovXG5mdW5jdGlvbiBmbGF0dGVuU2VsZWN0aW9uUmFuZ2Uoc2VsZWN0aW9uUmFuZ2U6IGFueSk6IG1vbmFjby5sYW5ndWFnZXMuU2VsZWN0aW9uUmFuZ2VbXSB7XG4gICAgY29uc3QgcmFuZ2VzOiBtb25hY28ubGFuZ3VhZ2VzLlNlbGVjdGlvblJhbmdlW10gPSBbXTtcbiAgICBsZXQgY3VycmVudCA9IHNlbGVjdGlvblJhbmdlO1xuICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICAgIHJhbmdlcy5wdXNoKHsgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28oY3VycmVudC5yYW5nZSkgfSk7XG4gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudDtcbiAgICB9XG4gICAgcmV0dXJuIHJhbmdlcztcbn1cblxuLyoqIE1hcHMgYSBKRFQuTFMgQ29kZUxlbnMgY29tbWFuZCB0byBhIE1vbmFjbyBjb21tYW5kLCB3aXJpbmcgdGhlIHJlZmVyZW5jZXMvaW1wbGVtZW50YXRpb25zIHBlZWsuICovXG5mdW5jdGlvbiBtYXBMZW5zQ29tbWFuZChjbWQ6IGFueSk6IG1vbmFjby5sYW5ndWFnZXMuQ29tbWFuZCB7XG4gICAgY29uc3QgYXJncyA9IGNtZC5hcmd1bWVudHMgPz8gW107XG4gICAgaWYgKChjbWQuY29tbWFuZCA9PT0gJ2phdmEuc2hvdy5yZWZlcmVuY2VzJyB8fCBjbWQuY29tbWFuZCA9PT0gJ2phdmEuc2hvdy5pbXBsZW1lbnRhdGlvbnMnKSAmJiBhcmdzLmxlbmd0aCA+PSAzKSB7XG4gICAgICAgIGNvbnN0IGxvY2F0aW9ucyA9IChhcmdzWzJdID8/IFtdKS5tYXAoKGw6IGFueSkgPT4gKHsgdXJpOiBtb25hY28uVXJpLnBhcnNlKGwudXJpKSwgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28obC5yYW5nZSkgfSkpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6ICAgICAgICAnZWRpdG9yLmFjdGlvbi5zaG93UmVmZXJlbmNlcycsXG4gICAgICAgICAgICB0aXRsZTogICAgIGNtZC50aXRsZSxcbiAgICAgICAgICAgIGFyZ3VtZW50czogW21vbmFjby5VcmkucGFyc2UoYXJnc1swXSksIHsgbGluZU51bWJlcjogYXJnc1sxXS5saW5lICsgMSwgY29sdW1uOiBhcmdzWzFdLmNoYXJhY3RlciArIDEgfSwgbG9jYXRpb25zXSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgaWQ6IE5PT1BfQ09NTUFORCwgdGl0bGU6IGNtZC50aXRsZSB9O1xufVxuXG50eXBlIExzcFJhbmdlID0geyBzdGFydDogeyBsaW5lOiBudW1iZXI7IGNoYXJhY3RlcjogbnVtYmVyIH07IGVuZDogeyBsaW5lOiBudW1iZXI7IGNoYXJhY3RlcjogbnVtYmVyIH0gfTtcblxuLyoqIE1vbmFjbyBjb21wbGV0aW9uIGl0ZW0gY2FycnlpbmcgdGhlIG9yaWdpbmF0aW5nIExTUCBpdGVtIHNvIHJlc29sdmUgY2FuIGZldGNoIGl0cyBpbXBvcnQgZWRpdHMuICovXG50eXBlIE1vbmFjb0NvbXBsZXRpb25JdGVtID0gbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbSAmIHsgX2xzcD86IENvbXBsZXRpb25JdGVtIH07XG5cbmZ1bmN0aW9uIHRleHRFZGl0VG9Nb25hY28oZWRpdDogVGV4dEVkaXQpOiBtb25hY28ubGFuZ3VhZ2VzLlRleHRFZGl0IHtcbiAgICByZXR1cm4geyByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhlZGl0LnJhbmdlKSwgdGV4dDogZWRpdC5uZXdUZXh0IH07XG59XG5cbmZ1bmN0aW9uIG1vbmFjb1JhbmdlVG9Mc3AocjogbW9uYWNvLklSYW5nZSk6IExzcFJhbmdlIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBzdGFydDogeyBsaW5lOiByLnN0YXJ0TGluZU51bWJlciAtIDEsIGNoYXJhY3Rlcjogci5zdGFydENvbHVtbiAtIDEgfSxcbiAgICAgICAgZW5kOiAgIHsgbGluZTogci5lbmRMaW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiByLmVuZENvbHVtbiAtIDEgfSxcbiAgICB9O1xufVxuXG4vKiogVHJ1ZSB3aGVuIHR3byBMU1AgcmFuZ2VzIGludGVyc2VjdCAodXNlZCB0byBwaWNrIHRoZSBkaWFnbm9zdGljcyByZWxldmFudCB0byBhIGNvZGUtYWN0aW9uIHJlcXVlc3QpLiAqL1xuZnVuY3Rpb24gcmFuZ2VzT3ZlcmxhcChhOiBMc3BSYW5nZSwgYjogTHNwUmFuZ2UpOiBib29sZWFuIHtcbiAgICBjb25zdCBub3RBZnRlciA9IChwOiB7IGxpbmU6IG51bWJlcjsgY2hhcmFjdGVyOiBudW1iZXIgfSwgcTogeyBsaW5lOiBudW1iZXI7IGNoYXJhY3RlcjogbnVtYmVyIH0pID0+XG4gICAgICAgIHAubGluZSA8IHEubGluZSB8fCAocC5saW5lID09PSBxLmxpbmUgJiYgcC5jaGFyYWN0ZXIgPD0gcS5jaGFyYWN0ZXIpO1xuICAgIHJldHVybiBub3RBZnRlcihhLnN0YXJ0LCBiLmVuZCkgJiYgbm90QWZ0ZXIoYi5zdGFydCwgYS5lbmQpO1xufVxuXG5mdW5jdGlvbiBsc3BDb2RlQWN0aW9uVG9Nb25hY28oYWN0aW9uOiBDb2RlQWN0aW9uIHwgQ29tbWFuZCk6IG1vbmFjby5sYW5ndWFnZXMuQ29kZUFjdGlvbiB7XG4gICAgY29uc3QgaXNDb21tYW5kID0gdHlwZW9mIChhY3Rpb24gYXMgQ29tbWFuZCkuY29tbWFuZCA9PT0gJ3N0cmluZyc7XG4gICAgY29uc3QgdGl0bGUgPSBhY3Rpb24udGl0bGVcbiAgICAgICAgPz8gKGlzQ29tbWFuZCA/IChhY3Rpb24gYXMgQ29tbWFuZCkuY29tbWFuZCA6IChhY3Rpb24gYXMgQ29kZUFjdGlvbikuY29tbWFuZD8udGl0bGUpXG4gICAgICAgID8/ICdBY3Rpb24nO1xuICAgIGNvbnN0IGtpbmQgPSBpc0NvbW1hbmQgPyAncXVpY2tmaXgnIDogKChhY3Rpb24gYXMgQ29kZUFjdGlvbikua2luZCA/PyAncXVpY2tmaXgnKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB0aXRsZSxcbiAgICAgICAga2luZCxcbiAgICAgICAgZGlhZ25vc3RpY3M6IFtdLFxuICAgICAgICBpc1ByZWZlcnJlZDogKGFjdGlvbiBhcyBDb2RlQWN0aW9uKS5pc1ByZWZlcnJlZCxcbiAgICAgICAgLy8gQXBwbHkgbGF6aWx5IHRocm91Z2ggb3VyIGNvbW1hbmQgc28gd2UgY2FuIHJlc29sdmUsIHJ1biBzZXJ2ZXIgY29tbWFuZHMgYW5kIGFwcGx5IGVkaXRzIHVuaWZvcm1seS5cbiAgICAgICAgY29tbWFuZDogeyBpZDogQVBQTFlfQUNUSU9OX0NPTU1BTkQsIHRpdGxlLCBhcmd1bWVudHM6IFthY3Rpb25dIH0sXG4gICAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gYXBwbHlDb2RlQWN0aW9uKGFjdGlvbjogQ29kZUFjdGlvbiB8IENvbW1hbmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIV9jb25uKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiAoYWN0aW9uIGFzIENvbW1hbmQpLmNvbW1hbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBhd2FpdCBydW5TZXJ2ZXJDb21tYW5kKGFjdGlvbiBhcyBDb21tYW5kKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzb2x2ZWQgPSBhY3Rpb24gYXMgQ29kZUFjdGlvbjtcbiAgICAgICAgaWYgKCFyZXNvbHZlZC5lZGl0ICYmIChyZXNvbHZlZCBhcyB7IGRhdGE/OiB1bmtub3duIH0pLmRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzb2x2ZWQgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgnY29kZUFjdGlvbi9yZXNvbHZlJywgcmVzb2x2ZWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXNvbHZlZC5lZGl0KSBhcHBseVdvcmtzcGFjZUVkaXQocmVzb2x2ZWQuZWRpdCk7XG4gICAgICAgIGlmIChyZXNvbHZlZC5jb21tYW5kKSBhd2FpdCBydW5TZXJ2ZXJDb21tYW5kKHJlc29sdmVkLmNvbW1hbmQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbamF2YS1sc3BdIGNvZGUgYWN0aW9uIGZhaWxlZDonLCAoZSBhcyBFcnJvcik/Lm1lc3NhZ2UgPz8gZSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBpc1dvcmtzcGFjZUVkaXQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBXb3Jrc3BhY2VFZGl0IHtcbiAgICByZXR1cm4gISF2YWx1ZSAmJiAoISEodmFsdWUgYXMgV29ya3NwYWNlRWRpdCkuY2hhbmdlcyB8fCAhISh2YWx1ZSBhcyBXb3Jrc3BhY2VFZGl0KS5kb2N1bWVudENoYW5nZXMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5TZXJ2ZXJDb21tYW5kKGNtZDogQ29tbWFuZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghX2Nvbm4gfHwgIWNtZD8uY29tbWFuZCkgcmV0dXJuO1xuICAgIGlmIChHRU5FUkFURVtjbWQuY29tbWFuZF0pIHtcbiAgICAgICAgYXdhaXQgcnVuR2VuZXJhdGUoY21kLmNvbW1hbmQsIGNtZC5hcmd1bWVudHMgPz8gW10pO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd3b3Jrc3BhY2UvZXhlY3V0ZUNvbW1hbmQnLCB7IGNvbW1hbmQ6IGNtZC5jb21tYW5kLCBhcmd1bWVudHM6IGNtZC5hcmd1bWVudHMgPz8gW10gfSk7XG4gICAgaWYgKGlzV29ya3NwYWNlRWRpdChyZXN1bHQpKSBhcHBseVdvcmtzcGFjZUVkaXQocmVzdWx0KTtcbn1cblxuaW50ZXJmYWNlIEdlbmVyYXRlU3BlYyB7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICBzdGF0dXM6IHN0cmluZztcbiAgICBnZW5lcmF0ZTogc3RyaW5nO1xuICAgIG1lbWJlcnM6IChzdGF0dXM6IGFueSkgPT4gQXJyYXk8eyBsYWJlbDogc3RyaW5nOyByZWY6IGFueSB9PjtcbiAgICBidWlsZEFyZ3M6IChwcm9tcHRBcmdzOiBhbnlbXSwgc3RhdHVzOiBhbnksIHNlbGVjdGVkOiBhbnlbXSkgPT4gYW55W107XG59XG5cbi8qKiBNZW1iZXItbmFtZWQgZmllbGRzIFx1MjE5MiBwaWNrZXIgbGFiZWxzLiAqL1xuZnVuY3Rpb24gZmllbGRMYWJlbChmOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSBmPy5uYW1lID8/IGY/LmZpZWxkTmFtZSA/PyAnJztcbiAgICBjb25zdCB0eXBlID0gZj8udHlwZSA/PyBmPy50eXBlTmFtZTtcbiAgICByZXR1cm4gdHlwZSA/IGAke25hbWV9OiAke3R5cGV9YCA6IGAke25hbWV9YDtcbn1cblxuLyoqXG4gKiBUaGUgSkRULkxTIHNvdXJjZS1nZW5lcmF0aW9uIGNvbW1hbmRzIChjb25zdHJ1Y3RvcnMsIGdldHRlcnMvc2V0dGVycywgdG9TdHJpbmcsIGhhc2hDb2RlL2VxdWFscykuXG4gKiBFYWNoIG1hcHMgdGhlIGNsaWVudCBcIipQcm9tcHRcIiBjb21tYW5kIHRvIHRoZSBzZXJ2ZXIgc3RhdHVzICsgZ2VuZXJhdGUgZGVsZWdhdGUgY29tbWFuZHM7IHRoZSBzdGF0dXNcbiAqIGNhbGwgeWllbGRzIHRoZSBjYW5kaWRhdGUgZmllbGRzIHNob3duIGluIHRoZSBtZW1iZXIgcGlja2VyLCB0aGUgZ2VuZXJhdGUgY2FsbCByZXR1cm5zIHRoZSBlZGl0LlxuICovXG5jb25zdCBHRU5FUkFURTogUmVjb3JkPHN0cmluZywgR2VuZXJhdGVTcGVjPiA9IHtcbiAgICAnamF2YS5hY3Rpb24uZ2VuZXJhdGVDb25zdHJ1Y3RvcnNQcm9tcHQnOiB7XG4gICAgICAgIGxhYmVsOiAnU2VsZWN0IGZpZWxkcyBhbmQgY29uc3RydWN0b3JzJyxcbiAgICAgICAgc3RhdHVzOiAnamF2YS5hY3Rpb24uY2hlY2tDb25zdHJ1Y3RvcnNTdGF0dXMnLFxuICAgICAgICBnZW5lcmF0ZTogJ2phdmEuYWN0aW9uLmdlbmVyYXRlQ29uc3RydWN0b3JzJyxcbiAgICAgICAgbWVtYmVyczogKHMpID0+IChzPy5maWVsZHMgPz8gW10pLm1hcCgoZjogYW55KSA9PiAoeyBsYWJlbDogZmllbGRMYWJlbChmKSwgcmVmOiBmIH0pKSxcbiAgICAgICAgYnVpbGRBcmdzOiAoYXJncywgcywgc2VsKSA9PiBbYXJnc1swXSwgeyBjb25zdHJ1Y3RvcnM6IHM/LmNvbnN0cnVjdG9ycyA/PyBbXSwgZmllbGRzOiBzZWwubWFwKG0gPT4gbS5yZWYpIH1dLFxuICAgIH0sXG4gICAgJ2phdmEuYWN0aW9uLmdlbmVyYXRlVG9TdHJpbmdQcm9tcHQnOiB7XG4gICAgICAgIGxhYmVsOiAnU2VsZWN0IGZpZWxkcyB0byBpbmNsdWRlIGluIHRvU3RyaW5nKCknLFxuICAgICAgICBzdGF0dXM6ICdqYXZhLmFjdGlvbi5jaGVja1RvU3RyaW5nU3RhdHVzJyxcbiAgICAgICAgZ2VuZXJhdGU6ICdqYXZhLmFjdGlvbi5nZW5lcmF0ZVRvU3RyaW5nJyxcbiAgICAgICAgbWVtYmVyczogKHMpID0+IChzPy5maWVsZHMgPz8gW10pLm1hcCgoZjogYW55KSA9PiAoeyBsYWJlbDogZmllbGRMYWJlbChmKSwgcmVmOiBmIH0pKSxcbiAgICAgICAgYnVpbGRBcmdzOiAoYXJncywgX3MsIHNlbCkgPT4gW2FyZ3NbMF0sIHNlbC5tYXAobSA9PiBtLnJlZildLFxuICAgIH0sXG4gICAgJ2phdmEuYWN0aW9uLmhhc2hDb2RlRXF1YWxzUHJvbXB0Jzoge1xuICAgICAgICBsYWJlbDogJ1NlbGVjdCBmaWVsZHMgZm9yIGhhc2hDb2RlKCkgYW5kIGVxdWFscygpJyxcbiAgICAgICAgc3RhdHVzOiAnamF2YS5hY3Rpb24uY2hlY2tIYXNoQ29kZUVxdWFsc1N0YXR1cycsXG4gICAgICAgIGdlbmVyYXRlOiAnamF2YS5hY3Rpb24uZ2VuZXJhdGVIYXNoQ29kZUVxdWFscycsXG4gICAgICAgIG1lbWJlcnM6IChzKSA9PiAocz8uZmllbGRzID8/IFtdKS5tYXAoKGY6IGFueSkgPT4gKHsgbGFiZWw6IGZpZWxkTGFiZWwoZiksIHJlZjogZiB9KSksXG4gICAgICAgIGJ1aWxkQXJnczogKGFyZ3MsIF9zLCBzZWwpID0+IFthcmdzWzBdLCBzZWwubWFwKG0gPT4gbS5yZWYpLCBmYWxzZV0sXG4gICAgfSxcbiAgICAnamF2YS5hY3Rpb24uZ2VuZXJhdGVBY2Nlc3NvcnNQcm9tcHQnOiB7XG4gICAgICAgIGxhYmVsOiAnU2VsZWN0IGZpZWxkcyB0byBnZW5lcmF0ZSBnZXR0ZXJzIGFuZCBzZXR0ZXJzJyxcbiAgICAgICAgc3RhdHVzOiAnamF2YS5hY3Rpb24uY2hlY2tBY2Nlc3NvcnNTdGF0dXMnLFxuICAgICAgICBnZW5lcmF0ZTogJ2phdmEuYWN0aW9uLmdlbmVyYXRlQWNjZXNzb3JzJyxcbiAgICAgICAgbWVtYmVyczogKHMpID0+IChzPy5hY2Nlc3NvcnMgPz8gcyA/PyBbXSkubWFwKChhOiBhbnkpID0+ICh7IGxhYmVsOiBmaWVsZExhYmVsKGEpLCByZWY6IGEgfSkpLFxuICAgICAgICBidWlsZEFyZ3M6IChhcmdzLCBfcywgc2VsKSA9PiBbYXJnc1swXSwgc2VsLm1hcChtID0+IG0ucmVmKV0sXG4gICAgfSxcbiAgICAnamF2YS5hY3Rpb24ub3ZlcnJpZGVNZXRob2RzUHJvbXB0Jzoge1xuICAgICAgICBsYWJlbDogJ1NlbGVjdCBtZXRob2RzIHRvIG92ZXJyaWRlIG9yIGltcGxlbWVudCcsXG4gICAgICAgIHN0YXR1czogJ2phdmEuYWN0aW9uLmxpc3RPdmVycmlkYWJsZU1ldGhvZHMnLFxuICAgICAgICBnZW5lcmF0ZTogJ2phdmEuYWN0aW9uLmFkZE92ZXJyaWRhYmxlTWV0aG9kcycsXG4gICAgICAgIG1lbWJlcnM6IChzKSA9PiAocz8ubWV0aG9kcyA/PyBbXSkubWFwKChtOiBhbnkpID0+ICh7XG4gICAgICAgICAgICBsYWJlbDogYCR7bS5uYW1lfSgkeyhtLnBhcmFtZXRlcnMgPz8gW10pLmpvaW4oJywgJyl9KSR7bS5kZWNsYXJpbmdDbGFzcyA/ICcgOiAnICsgbS5kZWNsYXJpbmdDbGFzcyA6ICcnfWAsXG4gICAgICAgICAgICByZWY6IG0sXG4gICAgICAgIH0pKSxcbiAgICAgICAgYnVpbGRBcmdzOiAoYXJncywgc3RhdHVzLCBzZWwpID0+IFthcmdzWzBdLCB7IG92ZXJyaWRhYmxlTWV0aG9kczogc2VsLm1hcChtID0+IG0ucmVmKSwgdHlwZTogc3RhdHVzPy50eXBlIH1dLFxuICAgIH0sXG59O1xuXG5hc3luYyBmdW5jdGlvbiBydW5HZW5lcmF0ZShwcm9tcHRJZDogc3RyaW5nLCBhcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghX2Nvbm4pIHJldHVybjtcbiAgICBjb25zdCBzcGVjID0gR0VORVJBVEVbcHJvbXB0SWRdO1xuICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd3b3Jrc3BhY2UvZXhlY3V0ZUNvbW1hbmQnLCB7IGNvbW1hbmQ6IHNwZWMuc3RhdHVzLCBhcmd1bWVudHM6IGFyZ3MgfSk7XG4gICAgaWYgKCFzdGF0dXMpIHJldHVybjtcbiAgICBjb25zdCBtZW1iZXJzID0gc3BlYy5tZW1iZXJzKHN0YXR1cyk7XG4gICAgbGV0IHNlbGVjdGVkID0gbWVtYmVycztcbiAgICBjb25zdCBwaWNrZXIgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLmphdmFMc3BNZW1iZXJQaWNrZXI7XG4gICAgaWYgKG1lbWJlcnMubGVuZ3RoICYmIHR5cGVvZiBwaWNrZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY29uc3QgY2hvc2VuOiBzdHJpbmdbXSB8IG51bGwgPSBhd2FpdCBwaWNrZXIoc3BlYy5sYWJlbCwgbWVtYmVycy5tYXAobSA9PiBtLmxhYmVsKSk7XG4gICAgICAgIGlmIChjaG9zZW4gPT09IG51bGwpIHJldHVybjsgLy8gdXNlciBjYW5jZWxsZWQgdGhlIGRpYWxvZ1xuICAgICAgICBzZWxlY3RlZCA9IG1lbWJlcnMuZmlsdGVyKG0gPT4gY2hvc2VuLmluY2x1ZGVzKG0ubGFiZWwpKTtcbiAgICB9XG4gICAgY29uc3QgZWRpdCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd3b3Jrc3BhY2UvZXhlY3V0ZUNvbW1hbmQnLCB7XG4gICAgICAgIGNvbW1hbmQ6IHNwZWMuZ2VuZXJhdGUsXG4gICAgICAgIGFyZ3VtZW50czogc3BlYy5idWlsZEFyZ3MoYXJncywgc3RhdHVzLCBzZWxlY3RlZCksXG4gICAgfSk7XG4gICAgaWYgKGlzV29ya3NwYWNlRWRpdChlZGl0KSkgYXBwbHlXb3Jrc3BhY2VFZGl0KGVkaXQpO1xufVxuXG4vKiogR3JvdXBzIGEgd29ya3NwYWNlIGVkaXQncyB0ZXh0IGVkaXRzIGJ5IGRvY3VtZW50IGFuZCBhcHBsaWVzIHRoZW0gaW4gcGxhY2UgdG8gb3BlbiBNb25hY28gbW9kZWxzLiAqL1xuZnVuY3Rpb24gYXBwbHlXb3Jrc3BhY2VFZGl0KGVkaXQ6IFdvcmtzcGFjZUVkaXQgfCBudWxsIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0KSByZXR1cm47XG4gICAgY29uc3QgYnlVcmk6IFJlY29yZDxzdHJpbmcsIFRleHRFZGl0W10+ID0ge307XG4gICAgaWYgKGVkaXQuY2hhbmdlcykge1xuICAgICAgICBmb3IgKGNvbnN0IHVyaSBpbiBlZGl0LmNoYW5nZXMpIGJ5VXJpW3VyaV0gPSAoYnlVcmlbdXJpXSA/PyBbXSkuY29uY2F0KGVkaXQuY2hhbmdlc1t1cmldKTtcbiAgICB9XG4gICAgaWYgKGVkaXQuZG9jdW1lbnRDaGFuZ2VzKSB7XG4gICAgICAgIGZvciAoY29uc3QgZGMgb2YgZWRpdC5kb2N1bWVudENoYW5nZXMgYXMgYW55W10pIHtcbiAgICAgICAgICAgIGlmIChkYz8udGV4dERvY3VtZW50Py51cmkgJiYgQXJyYXkuaXNBcnJheShkYy5lZGl0cykpIHtcbiAgICAgICAgICAgICAgICBieVVyaVtkYy50ZXh0RG9jdW1lbnQudXJpXSA9IChieVVyaVtkYy50ZXh0RG9jdW1lbnQudXJpXSA/PyBbXSkuY29uY2F0KGRjLmVkaXRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IHVyaSBpbiBieVVyaSkge1xuICAgICAgICBjb25zdCBtb2RlbCA9IG1vbmFjby5lZGl0b3IuZ2V0TW9kZWxzKCkuZmluZChtID0+IG0udXJpLnRvU3RyaW5nKCkgPT09IHVyaSk7XG4gICAgICAgIGlmICghbW9kZWwpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBvcHMgPSBieVVyaVt1cmldLm1hcChlID0+ICh7IHJhbmdlOiBsc3BSYW5nZVRvTW9uYWNvKGUucmFuZ2UpLCB0ZXh0OiBlLm5ld1RleHQsIGZvcmNlTW92ZU1hcmtlcnM6IHRydWUgfSkpO1xuICAgICAgICBtb2RlbC5wdXNoRWRpdE9wZXJhdGlvbnMoW10sIG9wcywgKCkgPT4gbnVsbCk7XG4gICAgfVxufVxuXG4vKiogQ29udmVydHMgYW4gTFNQIHdvcmtzcGFjZSBlZGl0IGludG8gdGhlIE1vbmFjbyBzaGFwZSByZXR1cm5lZCBieSB0aGUgcmVuYW1lIHByb3ZpZGVyLiAqL1xuZnVuY3Rpb24gd29ya3NwYWNlRWRpdFRvTW9uYWNvKGVkaXQ6IFdvcmtzcGFjZUVkaXQgfCBudWxsKTogbW9uYWNvLmxhbmd1YWdlcy5Xb3Jrc3BhY2VFZGl0IHtcbiAgICBjb25zdCBlZGl0czogYW55W10gPSBbXTtcbiAgICBjb25zdCBwdXNoID0gKHVyaTogc3RyaW5nLCBsaXN0OiBUZXh0RWRpdFtdKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgZSBvZiBsaXN0KSB7XG4gICAgICAgICAgICBlZGl0cy5wdXNoKHsgcmVzb3VyY2U6IG1vbmFjby5VcmkucGFyc2UodXJpKSwgdGV4dEVkaXQ6IHsgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28oZS5yYW5nZSksIHRleHQ6IGUubmV3VGV4dCB9LCB2ZXJzaW9uSWQ6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgaWYgKGVkaXQ/LmNoYW5nZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCB1cmkgaW4gZWRpdC5jaGFuZ2VzKSBwdXNoKHVyaSwgZWRpdC5jaGFuZ2VzW3VyaV0pO1xuICAgIH1cbiAgICBpZiAoZWRpdD8uZG9jdW1lbnRDaGFuZ2VzKSB7XG4gICAgICAgIGZvciAoY29uc3QgZGMgb2YgZWRpdC5kb2N1bWVudENoYW5nZXMgYXMgYW55W10pIHtcbiAgICAgICAgICAgIGlmIChkYz8udGV4dERvY3VtZW50Py51cmkgJiYgQXJyYXkuaXNBcnJheShkYy5lZGl0cykpIHB1c2goZGMudGV4dERvY3VtZW50LnVyaSwgZGMuZWRpdHMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGVkaXRzIH07XG59XG5cbi8qKiBNYXBzIGEgdmlydHVhbCBlZGl0b3IgVVJJIGJhY2sgdG8gdGhlIElERSB3b3Jrc3BhY2UgcGF0aCAoe0Bjb2RlIC93cy9wcm9qLy4uLn0pLiAqL1xuZnVuY3Rpb24gdXJpVG9Xb3Jrc3BhY2VQYXRoKHVyaTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCF1cmkuc3RhcnRzV2l0aChWSVJUVUFMX0ZJTEVfUFJFRklYKSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh1cmkuc3Vic3RyaW5nKFZJUlRVQUxfRklMRV9QUkVGSVgubGVuZ3RoKSk7XG59XG5cbi8qKiBSZWFkcyBhIHdvcmtzcGFjZSBmaWxlJ3MgY3VycmVudCB0ZXh0IG92ZXIgdGhlIElERSBSRVNUIEFQSS4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZldGNoV29ya3NwYWNlRmlsZVRleHQoaWRlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvc2VydmljZXMvaWRlL3dvcmtzcGFjZXMnICsgaWRlUGF0aCwgeyBoZWFkZXJzOiB7ICdYLVJlcXVlc3RlZC1XaXRoJzogJ0ZldGNoJyB9IH0pO1xuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgcmVhZCAke2lkZVBhdGh9IChIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfSlgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTtcbn1cblxuLyoqIEFwcGxpZXMgTFNQIHRleHQgZWRpdHMgdG8gYSBzdHJpbmcuIE9mZnNldHMgYXJlIHJlc29sdmVkIGFnYWluc3QgdGhlIG9yaWdpbmFsIHRleHQgYW5kIGVkaXRzIGFyZVxuICogIGFwcGxpZWQgZnJvbSB0aGUgZW5kIGJhY2t3YXJkcywgc28gZWFybGllciBvZmZzZXRzIHN0YXkgdmFsaWQuICovXG5mdW5jdGlvbiBhcHBseUVkaXRzVG9UZXh0KHRleHQ6IHN0cmluZywgZWRpdHM6IFRleHRFZGl0W10pOiBzdHJpbmcge1xuICAgIGNvbnN0IGxpbmVTdGFydHMgPSBbMF07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICh0ZXh0LmNoYXJDb2RlQXQoaSkgPT09IDEwIC8qIFxcbiAqLykgbGluZVN0YXJ0cy5wdXNoKGkgKyAxKTtcbiAgICB9XG4gICAgY29uc3Qgb2Zmc2V0ID0gKHA6IHsgbGluZTogbnVtYmVyOyBjaGFyYWN0ZXI6IG51bWJlciB9KSA9PiAobGluZVN0YXJ0c1twLmxpbmVdID8/IHRleHQubGVuZ3RoKSArIHAuY2hhcmFjdGVyO1xuICAgIGNvbnN0IG9yZGVyZWQgPSBlZGl0cy5zbGljZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IG9mZnNldChiLnJhbmdlLnN0YXJ0KSAtIG9mZnNldChhLnJhbmdlLnN0YXJ0KSk7XG4gICAgbGV0IHJlc3VsdCA9IHRleHQ7XG4gICAgZm9yIChjb25zdCBlIG9mIG9yZGVyZWQpIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnNsaWNlKDAsIG9mZnNldChlLnJhbmdlLnN0YXJ0KSkgKyBlLm5ld1RleHQgKyByZXN1bHQuc2xpY2Uob2Zmc2V0KGUucmFuZ2UuZW5kKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQXBwbGllcyBhIEpEVC5MUyByZW5hbWUge0BsaW5rIFdvcmtzcGFjZUVkaXR9IGFjcm9zcyB0aGUgd2hvbGUgd29ya3NwYWNlOiB0ZXh0IGVkaXRzIGluIGV2ZXJ5XG4gKiBhZmZlY3RlZCBmaWxlIHBsdXMgYW55IHtAY29kZSBSZW5hbWVGaWxlfSBvcGVyYXRpb24gKGEgcHVibGljLXR5cGUgcmVuYW1lIHJlbmFtZXMgaXRzIG93blxuICoge0Bjb2RlIC5qYXZhfSBmaWxlKS4gVGhlIGN1cnJlbnQgZmlsZSdzIGVkaXRzIGdvIHRocm91Z2ggdGhlIGxpdmUgTW9uYWNvIG1vZGVsOyB0aGUgcmVzdCBhcmUgcmVhZCxcbiAqIGVkaXRlZCBhbmQgd3JpdHRlbiBiYWNrIG92ZXIgUkVTVC4gUGVyc2lzdGVuY2UgKENTUkYtZ3VhcmRlZCB3cml0ZXMsIHRoZSB0YWIgc3dpdGNoIHdoZW4gdGhlIGN1cnJlbnRcbiAqIGZpbGUgaXMgcmVuYW1lZCwgYW5kIHJlbG9hZGluZyBvdGhlciBvcGVuIGVkaXRvcnMpIGlzIGRlbGVnYXRlZCB0byB0aGUgSURFIHZpYSBqYXZhTHNwUGVyc2lzdFJlbmFtZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYXBwbHlSZW5hbWVBY3Jvc3NXb3Jrc3BhY2UobW9kZWw6IG1vbmFjby5lZGl0b3IuSVRleHRNb2RlbCwgZWRpdDogV29ya3NwYWNlRWRpdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGN1cnJlbnRVcmkgPSBtb2RlbC51cmkudG9TdHJpbmcoKTtcbiAgICBjb25zdCB0ZXh0QnlVcmk6IFJlY29yZDxzdHJpbmcsIFRleHRFZGl0W10+ID0ge307XG4gICAgY29uc3QgcmVuYW1lQnlVcmk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgIGlmIChlZGl0LmNoYW5nZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCB1cmkgaW4gZWRpdC5jaGFuZ2VzKSB0ZXh0QnlVcmlbdXJpXSA9ICh0ZXh0QnlVcmlbdXJpXSA/PyBbXSkuY29uY2F0KGVkaXQuY2hhbmdlc1t1cmldKTtcbiAgICB9XG4gICAgaWYgKGVkaXQuZG9jdW1lbnRDaGFuZ2VzKSB7XG4gICAgICAgIGZvciAoY29uc3QgZGMgb2YgZWRpdC5kb2N1bWVudENoYW5nZXMgYXMgYW55W10pIHtcbiAgICAgICAgICAgIGlmIChkYz8ua2luZCA9PT0gJ3JlbmFtZScgJiYgZGMub2xkVXJpICYmIGRjLm5ld1VyaSkge1xuICAgICAgICAgICAgICAgIHJlbmFtZUJ5VXJpW2RjLm9sZFVyaV0gPSBkYy5uZXdVcmk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRjPy50ZXh0RG9jdW1lbnQ/LnVyaSAmJiBBcnJheS5pc0FycmF5KGRjLmVkaXRzKSkge1xuICAgICAgICAgICAgICAgIHRleHRCeVVyaVtkYy50ZXh0RG9jdW1lbnQudXJpXSA9ICh0ZXh0QnlVcmlbZGMudGV4dERvY3VtZW50LnVyaV0gPz8gW10pLmNvbmNhdChkYy5lZGl0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBKRFQuTFMgbWF5IGtleSBhIGZpbGUncyB0ZXh0IGVkaXRzIGJ5IGl0cyBQT1NULXJlbmFtZSBVUkkgKGRvY3VtZW50Q2hhbmdlcyBhcmUgb3JkZXJlZCwgYW5kIHRoZVxuICAgIC8vIHJlbmFtZSBjYW4gcHJlY2VkZSB0aGUgZWRpdCkuIFJlLWF0dHJpYnV0ZSBldmVyeSBlZGl0IHRvIHRoZSBvbi1kaXNrIChvbGQpIFVSSSBzbyB0aGUgY29udGVudCBpc1xuICAgIC8vIGVkaXRlZCBjb3JyZWN0bHkgYmVmb3JlIHRoZSBmaWxlIGlzIHdyaXR0ZW4vcmVuYW1lZCBcdTIwMTQgb3RoZXJ3aXNlIHRoZSBuZXcgZmlsZSBrZWVwcyB0aGUgb2xkIHR5cGVcbiAgICAvLyBuYW1lIGFuZCB0cmlnZ2VycyBcIlRoZSBwdWJsaWMgdHlwZSBYIG11c3QgYmUgZGVmaW5lZCBpbiBpdHMgb3duIGZpbGVcIi5cbiAgICBjb25zdCBuZXdUb09sZDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgIGZvciAoY29uc3Qgb2xkVXJpIGluIHJlbmFtZUJ5VXJpKSBuZXdUb09sZFtyZW5hbWVCeVVyaVtvbGRVcmldXSA9IG9sZFVyaTtcbiAgICBjb25zdCBlZGl0c0J5T2xkOiBSZWNvcmQ8c3RyaW5nLCBUZXh0RWRpdFtdPiA9IHt9O1xuICAgIGZvciAoY29uc3QgdXJpIGluIHRleHRCeVVyaSkge1xuICAgICAgICBjb25zdCBvbkRpc2tVcmkgPSBuZXdUb09sZFt1cmldID8/IHVyaTtcbiAgICAgICAgZWRpdHNCeU9sZFtvbkRpc2tVcmldID0gKGVkaXRzQnlPbGRbb25EaXNrVXJpXSA/PyBbXSkuY29uY2F0KHRleHRCeVVyaVt1cmldKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXlsb2FkOiB7XG4gICAgICAgIGN1cnJlbnRQYXRoOiBzdHJpbmcgfCBudWxsO1xuICAgICAgICBjdXJyZW50Q29udGVudDogc3RyaW5nIHwgbnVsbDtcbiAgICAgICAgY3VycmVudE5ld1BhdGg6IHN0cmluZyB8IG51bGw7XG4gICAgICAgIHdyaXRlczogQXJyYXk8eyBwYXRoOiBzdHJpbmcgfCBudWxsOyBjb250ZW50OiBzdHJpbmcgfT47XG4gICAgICAgIHJlbmFtZXM6IEFycmF5PHsgb2xkUGF0aDogc3RyaW5nIHwgbnVsbDsgbmV3UGF0aDogc3RyaW5nIHwgbnVsbDsgY29udGVudDogc3RyaW5nIH0+O1xuICAgIH0gPSB7IGN1cnJlbnRQYXRoOiB1cmlUb1dvcmtzcGFjZVBhdGgoY3VycmVudFVyaSksIGN1cnJlbnRDb250ZW50OiBudWxsLCBjdXJyZW50TmV3UGF0aDogbnVsbCwgd3JpdGVzOiBbXSwgcmVuYW1lczogW10gfTtcblxuICAgIGNvbnN0IHdhdGNoZWRDaGFuZ2VzOiBBcnJheTx7IHVyaTogc3RyaW5nOyB0eXBlOiBudW1iZXIgfT4gPSBbXTtcbiAgICBjb25zdCBvbGRVcmlzID0gbmV3IFNldDxzdHJpbmc+KFsuLi5PYmplY3Qua2V5cyhlZGl0c0J5T2xkKSwgLi4uT2JqZWN0LmtleXMocmVuYW1lQnlVcmkpXSk7XG4gICAgZm9yIChjb25zdCBvbGRVcmkgb2Ygb2xkVXJpcykge1xuICAgICAgICBjb25zdCBlZGl0cyA9IGVkaXRzQnlPbGRbb2xkVXJpXSA/PyBbXTtcbiAgICAgICAgbGV0IGNvbnRlbnQ6IHN0cmluZztcbiAgICAgICAgaWYgKG9sZFVyaSA9PT0gY3VycmVudFVyaSkge1xuICAgICAgICAgICAgaWYgKGVkaXRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIG1vZGVsLnB1c2hFZGl0T3BlcmF0aW9ucyhbXSwgZWRpdHMubWFwKGUgPT4gKHsgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28oZS5yYW5nZSksIHRleHQ6IGUubmV3VGV4dCwgZm9yY2VNb3ZlTWFya2VyczogdHJ1ZSB9KSksICgpID0+IG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGVudCA9IG1vZGVsLmdldFZhbHVlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBhd2FpdCBmZXRjaFdvcmtzcGFjZUZpbGVUZXh0KHVyaVRvV29ya3NwYWNlUGF0aChvbGRVcmkpID8/IG9sZFVyaSk7XG4gICAgICAgICAgICBjb250ZW50ID0gZWRpdHMubGVuZ3RoID8gYXBwbHlFZGl0c1RvVGV4dChzb3VyY2UsIGVkaXRzKSA6IHNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdVcmkgPSByZW5hbWVCeVVyaVtvbGRVcmldO1xuICAgICAgICBpZiAob2xkVXJpID09PSBjdXJyZW50VXJpKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmN1cnJlbnRDb250ZW50ID0gY29udGVudDtcbiAgICAgICAgICAgIHBheWxvYWQuY3VycmVudE5ld1BhdGggPSBuZXdVcmkgPyB1cmlUb1dvcmtzcGFjZVBhdGgobmV3VXJpKSA6IG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAobmV3VXJpKSB7XG4gICAgICAgICAgICBwYXlsb2FkLnJlbmFtZXMucHVzaCh7IG9sZFBhdGg6IHVyaVRvV29ya3NwYWNlUGF0aChvbGRVcmkpLCBuZXdQYXRoOiB1cmlUb1dvcmtzcGFjZVBhdGgobmV3VXJpKSwgY29udGVudCB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBheWxvYWQud3JpdGVzLnB1c2goeyBwYXRoOiB1cmlUb1dvcmtzcGFjZVBhdGgob2xkVXJpKSwgY29udGVudCB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGaWxlLWNoYW5nZSBldmVudHMgZm9yIEpEVC5MUyBzbyBpdCByZS1zeW5jcyB3aXRob3V0IGEgcGFnZSByZWZyZXNoLlxuICAgICAgICBpZiAobmV3VXJpKSB7XG4gICAgICAgICAgICB3YXRjaGVkQ2hhbmdlcy5wdXNoKHsgdXJpOiBvbGRVcmksIHR5cGU6IDMgLyogRGVsZXRlZCAqLyB9LCB7IHVyaTogbmV3VXJpLCB0eXBlOiAxIC8qIENyZWF0ZWQgKi8gfSk7XG4gICAgICAgICAgICBfb3BlbkZpbGVzLmRlbGV0ZShvbGRVcmkpO1xuICAgICAgICAgICAgX2Nvbm4/LnNlbmROb3RpZmljYXRpb24oJ3RleHREb2N1bWVudC9kaWRDbG9zZScsIHsgdGV4dERvY3VtZW50OiB7IHVyaTogb2xkVXJpIH0gfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3YXRjaGVkQ2hhbmdlcy5wdXNoKHsgdXJpOiBvbGRVcmksIHR5cGU6IDIgLyogQ2hhbmdlZCAqLyB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IChnbG9iYWxUaGlzIGFzIGFueSkuamF2YUxzcFBlcnNpc3RSZW5hbWUocGF5bG9hZCk7XG5cbiAgICAvLyBJbmZvcm0gSkRULkxTIG9mIHRoZSBvbi1kaXNrIGNoYW5nZXMgc28gdGhlIHJlbmFtZWQgdHlwZSdzIGRpYWdub3N0aWNzIGNsZWFyIGltbWVkaWF0ZWx5LlxuICAgIGlmIChfY29ubiAmJiB3YXRjaGVkQ2hhbmdlcy5sZW5ndGgpIHtcbiAgICAgICAgX2Nvbm4uc2VuZE5vdGlmaWNhdGlvbignd29ya3NwYWNlL2RpZENoYW5nZVdhdGNoZWRGaWxlcycsIHsgY2hhbmdlczogd2F0Y2hlZENoYW5nZXMgfSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBqZHRsc1NldHRpbmdzKCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGphdmE6IHtcbiAgICAgICAgICAgIGltcG9ydDoge1xuICAgICAgICAgICAgICAgIG1hdmVuOiAgICAgIHsgZW5hYmxlZDogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIGdyYWRsZTogICAgIHsgZW5hYmxlZDogZmFsc2UgfSxcbiAgICAgICAgICAgICAgICBleGNsdXNpb25zOiBbJyoqL25vZGVfbW9kdWxlcy8qKicsICcqKi8ubWV0YWRhdGEvKionLCAnKiovYXJjaGV0eXBlLXJlc291cmNlcy8qKiddLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGF1dG9idWlsZDogeyBlbmFibGVkOiB0cnVlIH0sXG4gICAgICAgICAgICBjb21wbGV0aW9uOiB7XG4gICAgICAgICAgICAgICAgb3ZlcndyaXRlOiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgZ3Vlc3NNZXRob2RBcmd1bWVudHM6IGZhbHNlLFxuICAgICAgICAgICAgICAgIGZpbHRlcmVkVHlwZXM6IFtcbiAgICAgICAgICAgICAgICAgICAgJ2NvbS5zdW4uKicsICdzdW4uKicsICdqZGsuKicsXG4gICAgICAgICAgICAgICAgICAgICdvcmcuZWNsaXBzZS5qZHQuaW50ZXJuYWwuKicsXG4gICAgICAgICAgICAgICAgICAgICdvcmcuZWNsaXBzZS5jb3JlLmludGVybmFsLionLFxuICAgICAgICAgICAgICAgICAgICAnb3JnLmVjbGlwc2Uub3NnaS5pbnRlcm5hbC4qJyxcbiAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgICAgICAgIGltcG9ydE9yZGVyOiBbJ2phdmEnLCAnamF2YXgnLCAnb3JnJywgJ2NvbScsICcnXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBzaWduYXR1cmVIZWxwOiAgeyBlbmFibGVkOiB0cnVlIH0sXG4gICAgICAgICAgICBmb3JtYXQ6ICAgICAgICAgeyBlbmFibGVkOiB0cnVlIH0sXG4gICAgICAgICAgICBzYXZlQWN0aW9uczogICAgeyBvcmdhbml6ZUltcG9ydHM6IGZhbHNlIH0sXG4gICAgICAgICAgICBpbmxheUhpbnRzOiAgICAgeyBwYXJhbWV0ZXJOYW1lczogeyBlbmFibGVkOiAnYWxsJyB9IH0sXG4gICAgICAgICAgICByZWZlcmVuY2VzQ29kZUxlbnM6ICAgICB7IGVuYWJsZWQ6IHRydWUgfSxcbiAgICAgICAgICAgIGltcGxlbWVudGF0aW9uc0NvZGVMZW5zOiB7IGVuYWJsZWQ6IHRydWUgfSxcbiAgICAgICAgfSxcbiAgICB9O1xufVxuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjQgVHlwZUZveCBhbmQgb3RoZXJzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTElDRU5TRSBpbiB0aGUgcGFja2FnZSByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbmltcG9ydCB7IERpc3Bvc2FibGUgfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG5cbmV4cG9ydCBjbGFzcyBEaXNwb3NhYmxlQ29sbGVjdGlvbiBpbXBsZW1lbnRzIERpc3Bvc2FibGUge1xuICAgIHByb3RlY3RlZCByZWFkb25seSBkaXNwb3NhYmxlczogRGlzcG9zYWJsZVtdID0gW107XG5cbiAgICBkaXNwb3NlKCk6IHZvaWQge1xuICAgICAgICB3aGlsZSAodGhpcy5kaXNwb3NhYmxlcy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcG9zYWJsZXMucG9wKCkhLmRpc3Bvc2UoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1c2goZGlzcG9zYWJsZTogRGlzcG9zYWJsZSk6IERpc3Bvc2FibGUge1xuICAgICAgICBjb25zdCBkaXNwb3NhYmxlcyA9IHRoaXMuZGlzcG9zYWJsZXM7XG4gICAgICAgIGRpc3Bvc2FibGVzLnB1c2goZGlzcG9zYWJsZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkaXNwb3NlKCk6IHZvaWQge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gZGlzcG9zYWJsZXMuaW5kZXhPZihkaXNwb3NhYmxlKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3Bvc2FibGVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbn1cbiIsICIvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSAyMDI0IFR5cGVGb3ggYW5kIG90aGVycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExJQ0VOU0UgaW4gdGhlIHBhY2thZ2Ugcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5pbXBvcnQgeyBEaXNwb3NhYmxlIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuaW1wb3J0IHR5cGUgeyBJQ29ubmVjdGlvbiB9IGZyb20gJy4uL3NlcnZlci9jb25uZWN0aW9uLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBJV2ViU29ja2V0IGV4dGVuZHMgRGlzcG9zYWJsZSB7XG4gICAgc2VuZChjb250ZW50OiBzdHJpbmcpOiB2b2lkO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgb25NZXNzYWdlKGNiOiAoZGF0YTogYW55KSA9PiB2b2lkKTogdm9pZDtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIG9uRXJyb3IoY2I6IChyZWFzb246IGFueSkgPT4gdm9pZCk6IHZvaWQ7XG4gICAgb25DbG9zZShjYjogKGNvZGU6IG51bWJlciwgcmVhc29uOiBzdHJpbmcpID0+IHZvaWQpOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElXZWJTb2NrZXRDb25uZWN0aW9uIGV4dGVuZHMgSUNvbm5lY3Rpb24ge1xuICAgIHJlYWRvbmx5IHNvY2tldDogSVdlYlNvY2tldDtcbn1cbiIsICIvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSAyMDI0IFR5cGVGb3ggYW5kIG90aGVycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExJQ0VOU0UgaW4gdGhlIHBhY2thZ2Ugcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5pbXBvcnQgeyBEaXNwb3NhYmxlIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuLy8gVE9ETzogVXNlIGVudmlyb25tZW50LXNwZWNpZmljIGltcG9ydHMgKHZzY29kZS1qc29ucnBjL2Jyb3dzZXIgb3IgdnNjb2RlLWpzb25ycGMvbm9kZSlcbi8vIHdoZW4gdXBncmFkaW5nIHRvIHZzY29kZS1qc29ucnBjQDkueC54LW5leHQuWCB3aGljaCBzdXBwb3J0cyBwcm9wZXIgZXhwb3J0IG1hcHNcbmltcG9ydCB7IHR5cGUgRGF0YUNhbGxiYWNrLCBBYnN0cmFjdE1lc3NhZ2VSZWFkZXIsIE1lc3NhZ2VSZWFkZXIgfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG5pbXBvcnQgdHlwZSB7IElXZWJTb2NrZXQgfSBmcm9tICcuL3NvY2tldC5qcyc7XG5cbmV4cG9ydCBjbGFzcyBXZWJTb2NrZXRNZXNzYWdlUmVhZGVyIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlUmVhZGVyIGltcGxlbWVudHMgTWVzc2FnZVJlYWRlciB7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHNvY2tldDogSVdlYlNvY2tldDtcbiAgICBwcm90ZWN0ZWQgc3RhdGU6ICdpbml0aWFsJyB8ICdsaXN0ZW5pbmcnIHwgJ2Nsb3NlZCcgPSAnaW5pdGlhbCc7XG4gICAgcHJvdGVjdGVkIGNhbGxiYWNrOiBEYXRhQ2FsbGJhY2sgfCB1bmRlZmluZWQ7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZXZlbnRzOiBBcnJheTx7IG1lc3NhZ2U/OiBhbnksIGVycm9yPzogYW55IH0+ID0gW107XG5cbiAgICBjb25zdHJ1Y3Rvcihzb2NrZXQ6IElXZWJTb2NrZXQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7XG4gICAgICAgIHRoaXMuc29ja2V0Lm9uTWVzc2FnZShtZXNzYWdlID0+XG4gICAgICAgICAgICB0aGlzLnJlYWRNZXNzYWdlKG1lc3NhZ2UpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc29ja2V0Lm9uRXJyb3IoZXJyb3IgPT5cbiAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLnNvY2tldC5vbkNsb3NlKChjb2RlLCByZWFzb24pID0+IHtcbiAgICAgICAgICAgIGlmIChjb2RlICE9PSAxMDAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3I6IEVycm9yID0ge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnJyArIGNvZGUsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBFcnJvciBkdXJpbmcgc29ja2V0IHJlY29ubmVjdDogY29kZSA9ICR7Y29kZX0sIHJlYXNvbiA9ICR7cmVhc29ufWBcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZmlyZUNsb3NlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGxpc3RlbihjYWxsYmFjazogRGF0YUNhbGxiYWNrKTogRGlzcG9zYWJsZSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09PSAnaW5pdGlhbCcpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSAnbGlzdGVuaW5nJztcbiAgICAgICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgICAgICAgIHdoaWxlICh0aGlzLmV2ZW50cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBldmVudCA9IHRoaXMuZXZlbnRzLnBvcCgpITtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQubWVzc2FnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVhZE1lc3NhZ2UoZXZlbnQubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5lcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGV2ZW50LmVycm9yKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmVDbG9zZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhbGxiYWNrID09PSBjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gJ2luaXRpYWwnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbGxiYWNrID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBkaXNwb3NlKCkge1xuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSAnaW5pdGlhbCc7XG4gICAgICAgIHRoaXMuY2FsbGJhY2sgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuZXZlbnRzLnNwbGljZSgwLCB0aGlzLmV2ZW50cy5sZW5ndGgpO1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgcHJvdGVjdGVkIHJlYWRNZXNzYWdlKG1lc3NhZ2U6IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gJ2luaXRpYWwnKSB7XG4gICAgICAgICAgICB0aGlzLmV2ZW50cy5zcGxpY2UoMCwgMCwgeyBtZXNzYWdlIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUgPT09ICdsaXN0ZW5pbmcnKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2FsbGJhY2shKGRhdGEpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3I6IEVycm9yID0ge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnJyArIDQwMCxcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYEVycm9yIGR1cmluZyBtZXNzYWdlIHBhcnNpbmcsIHJlYXNvbiA9ICR7dHlwZW9mIGVyciA9PT0gJ29iamVjdCcgPyAoZXJyIGFzIGFueSkubWVzc2FnZSA6ICd1bmtub3duJ31gXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmVFcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBmaXJlRXJyb3IoZXJyb3I6IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gJ2luaXRpYWwnKSB7XG4gICAgICAgICAgICB0aGlzLmV2ZW50cy5zcGxpY2UoMCwgMCwgeyBlcnJvciB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlID09PSAnbGlzdGVuaW5nJykge1xuICAgICAgICAgICAgc3VwZXIuZmlyZUVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBmaXJlQ2xvc2UoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09PSAnaW5pdGlhbCcpIHtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRzLnNwbGljZSgwLCAwLCB7fSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZSA9PT0gJ2xpc3RlbmluZycpIHtcbiAgICAgICAgICAgIHN1cGVyLmZpcmVDbG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhdGUgPSAnY2xvc2VkJztcbiAgICB9XG59XG4iLCAiLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgMjAyNCBUeXBlRm94IGFuZCBvdGhlcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMSUNFTlNFIGluIHRoZSBwYWNrYWdlIHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuaW1wb3J0IHsgTWVzc2FnZSB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcbmltcG9ydCB7IEFic3RyYWN0TWVzc2FnZVdyaXRlciwgTWVzc2FnZVdyaXRlciB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcbmltcG9ydCB0eXBlIHsgSVdlYlNvY2tldCB9IGZyb20gJy4vc29ja2V0LmpzJztcblxuZXhwb3J0IGNsYXNzIFdlYlNvY2tldE1lc3NhZ2VXcml0ZXIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VXcml0ZXIgaW1wbGVtZW50cyBNZXNzYWdlV3JpdGVyIHtcbiAgICBwcm90ZWN0ZWQgZXJyb3JDb3VudCA9IDA7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHNvY2tldDogSVdlYlNvY2tldDtcblxuICAgIGNvbnN0cnVjdG9yKHNvY2tldDogSVdlYlNvY2tldCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnNvY2tldCA9IHNvY2tldDtcbiAgICB9XG5cbiAgICBlbmQoKTogdm9pZCB7XG4gICAgfVxuXG4gICAgYXN5bmMgd3JpdGUobXNnOiBNZXNzYWdlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobXNnKTtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0LnNlbmQoY29udGVudCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMuZXJyb3JDb3VudCsrO1xuICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZSwgbXNnLCB0aGlzLmVycm9yQ291bnQpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjQgVHlwZUZveCBhbmQgb3RoZXJzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTElDRU5TRSBpbiB0aGUgcGFja2FnZSByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbmltcG9ydCB0eXBlIHsgTWVzc2FnZUNvbm5lY3Rpb24sIExvZ2dlciB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcbmltcG9ydCB7IGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuaW1wb3J0IHR5cGUgeyBJV2ViU29ja2V0IH0gZnJvbSAnLi9zb2NrZXQuanMnO1xuaW1wb3J0IHsgV2ViU29ja2V0TWVzc2FnZVJlYWRlciB9IGZyb20gJy4vcmVhZGVyLmpzJztcbmltcG9ydCB7IFdlYlNvY2tldE1lc3NhZ2VXcml0ZXIgfSBmcm9tICcuL3dyaXRlci5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVXZWJTb2NrZXRDb25uZWN0aW9uKHNvY2tldDogSVdlYlNvY2tldCwgbG9nZ2VyOiBMb2dnZXIpOiBNZXNzYWdlQ29ubmVjdGlvbiB7XG4gICAgY29uc3QgbWVzc2FnZVJlYWRlciA9IG5ldyBXZWJTb2NrZXRNZXNzYWdlUmVhZGVyKHNvY2tldCk7XG4gICAgY29uc3QgbWVzc2FnZVdyaXRlciA9IG5ldyBXZWJTb2NrZXRNZXNzYWdlV3JpdGVyKHNvY2tldCk7XG4gICAgY29uc3QgY29ubmVjdGlvbiA9IGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uKG1lc3NhZ2VSZWFkZXIsIG1lc3NhZ2VXcml0ZXIsIGxvZ2dlcik7XG4gICAgY29ubmVjdGlvbi5vbkNsb3NlKCgpID0+IGNvbm5lY3Rpb24uZGlzcG9zZSgpKTtcbiAgICByZXR1cm4gY29ubmVjdGlvbjtcbn1cbiIsICIvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSAyMDI0IFR5cGVGb3ggYW5kIG90aGVycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExJQ0VOU0UgaW4gdGhlIHBhY2thZ2Ugcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5pbXBvcnQgdHlwZSB7IE1lc3NhZ2VDb25uZWN0aW9uLCBMb2dnZXIgfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG5pbXBvcnQgeyBjcmVhdGVXZWJTb2NrZXRDb25uZWN0aW9uIH0gZnJvbSAnLi9zb2NrZXQvY29ubmVjdGlvbi5qcyc7XG5pbXBvcnQgdHlwZSB7IElXZWJTb2NrZXQgfSBmcm9tICcuL3NvY2tldC9zb2NrZXQuanMnO1xuaW1wb3J0IHsgQ29uc29sZUxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGxpc3RlbihvcHRpb25zOiB7XG4gICAgd2ViU29ja2V0OiBXZWJTb2NrZXQ7XG4gICAgbG9nZ2VyPzogTG9nZ2VyO1xuICAgIG9uQ29ubmVjdGlvbjogKGNvbm5lY3Rpb246IE1lc3NhZ2VDb25uZWN0aW9uKSA9PiB2b2lkO1xufSkge1xuICAgIGNvbnN0IHsgd2ViU29ja2V0LCBvbkNvbm5lY3Rpb24gfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgbG9nZ2VyID0gb3B0aW9ucy5sb2dnZXIgfHwgbmV3IENvbnNvbGVMb2dnZXIoKTtcbiAgICB3ZWJTb2NrZXQub25vcGVuID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBzb2NrZXQgPSB0b1NvY2tldCh3ZWJTb2NrZXQpO1xuICAgICAgICBjb25zdCBjb25uZWN0aW9uID0gY3JlYXRlV2ViU29ja2V0Q29ubmVjdGlvbihzb2NrZXQsIGxvZ2dlcik7XG4gICAgICAgIG9uQ29ubmVjdGlvbihjb25uZWN0aW9uKTtcbiAgICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9Tb2NrZXQod2ViU29ja2V0OiBXZWJTb2NrZXQpOiBJV2ViU29ja2V0IHtcbiAgICByZXR1cm4ge1xuICAgICAgICBzZW5kOiBjb250ZW50ID0+IHdlYlNvY2tldC5zZW5kKGNvbnRlbnQpLFxuICAgICAgICBvbk1lc3NhZ2U6IGNiID0+IHtcbiAgICAgICAgICAgIHdlYlNvY2tldC5vbm1lc3NhZ2UgPSBldmVudCA9PiBjYihldmVudC5kYXRhKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25FcnJvcjogY2IgPT4ge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgIHdlYlNvY2tldC5vbmVycm9yID0gKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0Lmhhc093bihldmVudCwgJ21lc3NhZ2UnKSkge1xuICAgICAgICAgICAgICAgICAgICBjYihldmVudC5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBvbkNsb3NlOiBjYiA9PiB7XG4gICAgICAgICAgICB3ZWJTb2NrZXQub25jbG9zZSA9IGV2ZW50ID0+IGNiKGV2ZW50LmNvZGUsIGV2ZW50LnJlYXNvbik7XG4gICAgICAgIH0sXG4gICAgICAgIGRpc3Bvc2U6ICgpID0+IHdlYlNvY2tldC5jbG9zZSgpXG4gICAgfTtcbn1cbiIsICIvKlxuICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMjYgRWNsaXBzZSBEaXJpZ2libGUgY29udHJpYnV0b3JzXG4gKlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlXG4gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2Mi4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG4gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MjAuaHRtbFxuICpcbiAqIFNQRFgtRmlsZUNvcHlyaWdodFRleHQ6IEVjbGlwc2UgRGlyaWdpYmxlIGNvbnRyaWJ1dG9ycyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbi8qKlxuICogTGF6eSBQcm94eSBzaGltIGZvciBNb25hY28gRWRpdG9yIGxvYWRlZCB2aWEgQU1ELlxuICpcbiAqIGVkaXRvci5qcyBzZXRzIGdsb2JhbFRoaXMubW9uYWNvIGluc2lkZSB0aGUgQU1EIHJlcXVpcmUoKSBjYWxsYmFjaywgYmVmb3JlIGFueVxuICogSmF2YUxzcENsaWVudExpYi5jb25uZWN0KCkgY2FsbC4gQWxsIHByb3BlcnR5IGFjY2Vzc2VzIGdvIHRocm91Z2ggUHJveHkuZ2V0KCkgdHJhcHNcbiAqIHNvIHRoZXkgcmVzb2x2ZSBhZ2FpbnN0IHRoZSBsaXZlIHdpbmRvdy5tb25hY28gYXQgY2FsbCB0aW1lLCBub3QgYXQgYnVuZGxlIGxvYWQgdGltZS5cbiAqXG4gKiBUeXBlU2NyaXB0IHJlc29sdmVzIHR5cGVzIGZyb20gdGhlIHJlYWwgbW9uYWNvLWVkaXRvciBkZXZEZXBlbmRlbmN5OyBlc2J1aWxkIHJlcGxhY2VzXG4gKiB0aGUgXCJtb25hY28tZWRpdG9yXCIgaW1wb3J0IHdpdGggdGhpcyBmaWxlIGF0IGJ1bmRsZSB0aW1lIHZpYSB0aGUgYWxpYXMgb3B0aW9uLlxuICovXG5cbnR5cGUgTSA9IHR5cGVvZiBpbXBvcnQoJ21vbmFjby1lZGl0b3InKTtcblxuZnVuY3Rpb24gbSgpOiBNIHtcbiAgICByZXR1cm4gKGdsb2JhbFRoaXMgYXMgYW55KS5tb25hY28gYXMgTTtcbn1cblxuZnVuY3Rpb24gbnM8VCBleHRlbmRzIG9iamVjdD4oZ2V0dGVyOiAoKSA9PiBUKTogVCB7XG4gICAgcmV0dXJuIG5ldyBQcm94eSh7fSBhcyBULCB7XG4gICAgICAgIGdldDogKF8sIGspID0+IChnZXR0ZXIoKSBhcyBhbnkpW2sgYXMgc3RyaW5nXSxcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gY2xzPFQ+KGdldHRlcjogKCkgPT4gVCk6IFQge1xuICAgIHJldHVybiBuZXcgUHJveHkoZnVuY3Rpb24gKCkge30gYXMgYW55LCB7XG4gICAgICAgIGNvbnN0cnVjdDogKF8sIGFyZ3MpID0+IG5ldyAoZ2V0dGVyKCkgYXMgYW55KSguLi5hcmdzKSxcbiAgICAgICAgZ2V0OiAgICAgICAoXywgaykgICAgPT4gKGdldHRlcigpIGFzIGFueSlbayBhcyBzdHJpbmddLFxuICAgIH0pIGFzIFQ7XG59XG5cbmV4cG9ydCBjb25zdCBlZGl0b3IgICAgICAgICA9IG5zKCgpID0+IG0oKS5lZGl0b3IpO1xuZXhwb3J0IGNvbnN0IGxhbmd1YWdlcyAgICAgID0gbnMoKCkgPT4gbSgpLmxhbmd1YWdlcyk7XG5leHBvcnQgY29uc3QgTWFya2VyU2V2ZXJpdHkgPSBucygoKSA9PiBtKCkuTWFya2VyU2V2ZXJpdHkpO1xuZXhwb3J0IGNvbnN0IE1hcmtlclRhZyAgICAgID0gbnMoKCkgPT4gKG0oKSBhcyBhbnkpLk1hcmtlclRhZyk7XG5leHBvcnQgY29uc3QgVXJpICAgICAgICAgICAgPSBjbHMoKCkgPT4gbSgpLlVyaSk7XG5leHBvcnQgY29uc3QgUmFuZ2UgICAgICAgICAgPSBjbHMoKCkgPT4gbSgpLlJhbmdlKTtcbmV4cG9ydCBjb25zdCBQb3NpdGlvbiAgICAgICA9IGNscygoKSA9PiBtKCkuUG9zaXRpb24pO1xuZXhwb3J0IGNvbnN0IFNlbGVjdGlvbiAgICAgID0gY2xzKCgpID0+IG0oKS5TZWxlY3Rpb24pO1xuZXhwb3J0IGNvbnN0IEtleUNvZGUgICAgICAgID0gbnMoKCkgPT4gbSgpLktleUNvZGUpO1xuZXhwb3J0IGNvbnN0IEtleU1vZCAgICAgICAgID0gbnMoKCkgPT4gbSgpLktleU1vZCk7XG4iLCAiLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuJ3VzZSBzdHJpY3QnO1xuZXhwb3J0IHZhciBEb2N1bWVudFVyaTtcbihmdW5jdGlvbiAoRG9jdW1lbnRVcmkpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJztcbiAgICB9XG4gICAgRG9jdW1lbnRVcmkuaXMgPSBpcztcbn0pKERvY3VtZW50VXJpIHx8IChEb2N1bWVudFVyaSA9IHt9KSk7XG5leHBvcnQgdmFyIFVSSTtcbihmdW5jdGlvbiAoVVJJKSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZyc7XG4gICAgfVxuICAgIFVSSS5pcyA9IGlzO1xufSkoVVJJIHx8IChVUkkgPSB7fSkpO1xuZXhwb3J0IHZhciBpbnRlZ2VyO1xuKGZ1bmN0aW9uIChpbnRlZ2VyKSB7XG4gICAgaW50ZWdlci5NSU5fVkFMVUUgPSAtMjE0NzQ4MzY0ODtcbiAgICBpbnRlZ2VyLk1BWF9WQUxVRSA9IDIxNDc0ODM2NDc7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgaW50ZWdlci5NSU5fVkFMVUUgPD0gdmFsdWUgJiYgdmFsdWUgPD0gaW50ZWdlci5NQVhfVkFMVUU7XG4gICAgfVxuICAgIGludGVnZXIuaXMgPSBpcztcbn0pKGludGVnZXIgfHwgKGludGVnZXIgPSB7fSkpO1xuZXhwb3J0IHZhciB1aW50ZWdlcjtcbihmdW5jdGlvbiAodWludGVnZXIpIHtcbiAgICB1aW50ZWdlci5NSU5fVkFMVUUgPSAwO1xuICAgIHVpbnRlZ2VyLk1BWF9WQUxVRSA9IDIxNDc0ODM2NDc7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgdWludGVnZXIuTUlOX1ZBTFVFIDw9IHZhbHVlICYmIHZhbHVlIDw9IHVpbnRlZ2VyLk1BWF9WQUxVRTtcbiAgICB9XG4gICAgdWludGVnZXIuaXMgPSBpcztcbn0pKHVpbnRlZ2VyIHx8ICh1aW50ZWdlciA9IHt9KSk7XG4vKipcbiAqIFRoZSBQb3NpdGlvbiBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBQb3NpdGlvbn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgUG9zaXRpb247XG4oZnVuY3Rpb24gKFBvc2l0aW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBQb3NpdGlvbiBsaXRlcmFsIGZyb20gdGhlIGdpdmVuIGxpbmUgYW5kIGNoYXJhY3Rlci5cbiAgICAgKiBAcGFyYW0gbGluZSBUaGUgcG9zaXRpb24ncyBsaW5lLlxuICAgICAqIEBwYXJhbSBjaGFyYWN0ZXIgVGhlIHBvc2l0aW9uJ3MgY2hhcmFjdGVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShsaW5lLCBjaGFyYWN0ZXIpIHtcbiAgICAgICAgaWYgKGxpbmUgPT09IE51bWJlci5NQVhfVkFMVUUpIHtcbiAgICAgICAgICAgIGxpbmUgPSB1aW50ZWdlci5NQVhfVkFMVUU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYXJhY3RlciA9PT0gTnVtYmVyLk1BWF9WQUxVRSkge1xuICAgICAgICAgICAgY2hhcmFjdGVyID0gdWludGVnZXIuTUFYX1ZBTFVFO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGxpbmUsIGNoYXJhY3RlciB9O1xuICAgIH1cbiAgICBQb3NpdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBQb3NpdGlvbn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBJcy51aW50ZWdlcihjYW5kaWRhdGUubGluZSkgJiYgSXMudWludGVnZXIoY2FuZGlkYXRlLmNoYXJhY3Rlcik7XG4gICAgfVxuICAgIFBvc2l0aW9uLmlzID0gaXM7XG59KShQb3NpdGlvbiB8fCAoUG9zaXRpb24gPSB7fSkpO1xuLyoqXG4gKiBUaGUgUmFuZ2UgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgUmFuZ2V9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIFJhbmdlO1xuKGZ1bmN0aW9uIChSYW5nZSkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShvbmUsIHR3bywgdGhyZWUsIGZvdXIpIHtcbiAgICAgICAgaWYgKElzLnVpbnRlZ2VyKG9uZSkgJiYgSXMudWludGVnZXIodHdvKSAmJiBJcy51aW50ZWdlcih0aHJlZSkgJiYgSXMudWludGVnZXIoZm91cikpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHN0YXJ0OiBQb3NpdGlvbi5jcmVhdGUob25lLCB0d28pLCBlbmQ6IFBvc2l0aW9uLmNyZWF0ZSh0aHJlZSwgZm91cikgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChQb3NpdGlvbi5pcyhvbmUpICYmIFBvc2l0aW9uLmlzKHR3bykpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHN0YXJ0OiBvbmUsIGVuZDogdHdvIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJhbmdlI2NyZWF0ZSBjYWxsZWQgd2l0aCBpbnZhbGlkIGFyZ3VtZW50c1ske29uZX0sICR7dHdvfSwgJHt0aHJlZX0sICR7Zm91cn1dYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgUmFuZ2UuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgUmFuZ2V9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgUG9zaXRpb24uaXMoY2FuZGlkYXRlLnN0YXJ0KSAmJiBQb3NpdGlvbi5pcyhjYW5kaWRhdGUuZW5kKTtcbiAgICB9XG4gICAgUmFuZ2UuaXMgPSBpcztcbn0pKFJhbmdlIHx8IChSYW5nZSA9IHt9KSk7XG4vKipcbiAqIFRoZSBMb2NhdGlvbiBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBMb2NhdGlvbn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgTG9jYXRpb247XG4oZnVuY3Rpb24gKExvY2F0aW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIExvY2F0aW9uIGxpdGVyYWwuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgbG9jYXRpb24ncyB1cmkuXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSBsb2NhdGlvbidzIHJhbmdlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmksIHJhbmdlKSB7XG4gICAgICAgIHJldHVybiB7IHVyaSwgcmFuZ2UgfTtcbiAgICB9XG4gICAgTG9jYXRpb24uY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgTG9jYXRpb259IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiAoSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpIHx8IElzLnVuZGVmaW5lZChjYW5kaWRhdGUudXJpKSk7XG4gICAgfVxuICAgIExvY2F0aW9uLmlzID0gaXM7XG59KShMb2NhdGlvbiB8fCAoTG9jYXRpb24gPSB7fSkpO1xuLyoqXG4gKiBUaGUgTG9jYXRpb25MaW5rIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIExvY2F0aW9uTGlua30gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgTG9jYXRpb25MaW5rO1xuKGZ1bmN0aW9uIChMb2NhdGlvbkxpbmspIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgTG9jYXRpb25MaW5rIGxpdGVyYWwuXG4gICAgICogQHBhcmFtIHRhcmdldFVyaSBUaGUgZGVmaW5pdGlvbidzIHVyaS5cbiAgICAgKiBAcGFyYW0gdGFyZ2V0UmFuZ2UgVGhlIGZ1bGwgcmFuZ2Ugb2YgdGhlIGRlZmluaXRpb24uXG4gICAgICogQHBhcmFtIHRhcmdldFNlbGVjdGlvblJhbmdlIFRoZSBzcGFuIG9mIHRoZSBzeW1ib2wgZGVmaW5pdGlvbiBhdCB0aGUgdGFyZ2V0LlxuICAgICAqIEBwYXJhbSBvcmlnaW5TZWxlY3Rpb25SYW5nZSBUaGUgc3BhbiBvZiB0aGUgc3ltYm9sIGJlaW5nIGRlZmluZWQgaW4gdGhlIG9yaWdpbmF0aW5nIHNvdXJjZSBmaWxlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh0YXJnZXRVcmksIHRhcmdldFJhbmdlLCB0YXJnZXRTZWxlY3Rpb25SYW5nZSwgb3JpZ2luU2VsZWN0aW9uUmFuZ2UpIHtcbiAgICAgICAgcmV0dXJuIHsgdGFyZ2V0VXJpLCB0YXJnZXRSYW5nZSwgdGFyZ2V0U2VsZWN0aW9uUmFuZ2UsIG9yaWdpblNlbGVjdGlvblJhbmdlIH07XG4gICAgfVxuICAgIExvY2F0aW9uTGluay5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBMb2NhdGlvbkxpbmt9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnRhcmdldFJhbmdlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnRhcmdldFVyaSlcbiAgICAgICAgICAgICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS50YXJnZXRTZWxlY3Rpb25SYW5nZSlcbiAgICAgICAgICAgICYmIChSYW5nZS5pcyhjYW5kaWRhdGUub3JpZ2luU2VsZWN0aW9uUmFuZ2UpIHx8IElzLnVuZGVmaW5lZChjYW5kaWRhdGUub3JpZ2luU2VsZWN0aW9uUmFuZ2UpKTtcbiAgICB9XG4gICAgTG9jYXRpb25MaW5rLmlzID0gaXM7XG59KShMb2NhdGlvbkxpbmsgfHwgKExvY2F0aW9uTGluayA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb2xvciBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBDb2xvcn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgQ29sb3I7XG4oZnVuY3Rpb24gKENvbG9yKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDb2xvciBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmVkLFxuICAgICAgICAgICAgZ3JlZW4sXG4gICAgICAgICAgICBibHVlLFxuICAgICAgICAgICAgYWxwaGEsXG4gICAgICAgIH07XG4gICAgfVxuICAgIENvbG9yLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIENvbG9yfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgSXMubnVtYmVyUmFuZ2UoY2FuZGlkYXRlLnJlZCwgMCwgMSlcbiAgICAgICAgICAgICYmIElzLm51bWJlclJhbmdlKGNhbmRpZGF0ZS5ncmVlbiwgMCwgMSlcbiAgICAgICAgICAgICYmIElzLm51bWJlclJhbmdlKGNhbmRpZGF0ZS5ibHVlLCAwLCAxKVxuICAgICAgICAgICAgJiYgSXMubnVtYmVyUmFuZ2UoY2FuZGlkYXRlLmFscGhhLCAwLCAxKTtcbiAgICB9XG4gICAgQ29sb3IuaXMgPSBpcztcbn0pKENvbG9yIHx8IChDb2xvciA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb2xvckluZm9ybWF0aW9uIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIENvbG9ySW5mb3JtYXRpb259IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIENvbG9ySW5mb3JtYXRpb247XG4oZnVuY3Rpb24gKENvbG9ySW5mb3JtYXRpb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENvbG9ySW5mb3JtYXRpb24gbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIGNvbG9yKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByYW5nZSxcbiAgICAgICAgICAgIGNvbG9yLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBDb2xvckluZm9ybWF0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIENvbG9ySW5mb3JtYXRpb259IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIENvbG9yLmlzKGNhbmRpZGF0ZS5jb2xvcik7XG4gICAgfVxuICAgIENvbG9ySW5mb3JtYXRpb24uaXMgPSBpcztcbn0pKENvbG9ySW5mb3JtYXRpb24gfHwgKENvbG9ySW5mb3JtYXRpb24gPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29sb3IgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgQ29sb3JQcmVzZW50YXRpb259IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIENvbG9yUHJlc2VudGF0aW9uO1xuKGZ1bmN0aW9uIChDb2xvclByZXNlbnRhdGlvbikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ29sb3JJbmZvcm1hdGlvbiBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShsYWJlbCwgdGV4dEVkaXQsIGFkZGl0aW9uYWxUZXh0RWRpdHMpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgICAgdGV4dEVkaXQsXG4gICAgICAgICAgICBhZGRpdGlvbmFsVGV4dEVkaXRzLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBDb2xvclByZXNlbnRhdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBDb2xvckluZm9ybWF0aW9ufSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5sYWJlbClcbiAgICAgICAgICAgICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLnRleHRFZGl0KSB8fCBUZXh0RWRpdC5pcyhjYW5kaWRhdGUpKVxuICAgICAgICAgICAgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUuYWRkaXRpb25hbFRleHRFZGl0cykgfHwgSXMudHlwZWRBcnJheShjYW5kaWRhdGUuYWRkaXRpb25hbFRleHRFZGl0cywgVGV4dEVkaXQuaXMpKTtcbiAgICB9XG4gICAgQ29sb3JQcmVzZW50YXRpb24uaXMgPSBpcztcbn0pKENvbG9yUHJlc2VudGF0aW9uIHx8IChDb2xvclByZXNlbnRhdGlvbiA9IHt9KSk7XG4vKipcbiAqIEEgc2V0IG9mIHByZWRlZmluZWQgcmFuZ2Uga2luZHMuXG4gKi9cbmV4cG9ydCB2YXIgRm9sZGluZ1JhbmdlS2luZDtcbihmdW5jdGlvbiAoRm9sZGluZ1JhbmdlS2luZCkge1xuICAgIC8qKlxuICAgICAqIEZvbGRpbmcgcmFuZ2UgZm9yIGEgY29tbWVudFxuICAgICAqL1xuICAgIEZvbGRpbmdSYW5nZUtpbmQuQ29tbWVudCA9ICdjb21tZW50JztcbiAgICAvKipcbiAgICAgKiBGb2xkaW5nIHJhbmdlIGZvciBhbiBpbXBvcnQgb3IgaW5jbHVkZVxuICAgICAqL1xuICAgIEZvbGRpbmdSYW5nZUtpbmQuSW1wb3J0cyA9ICdpbXBvcnRzJztcbiAgICAvKipcbiAgICAgKiBGb2xkaW5nIHJhbmdlIGZvciBhIHJlZ2lvbiAoZS5nLiBgI3JlZ2lvbmApXG4gICAgICovXG4gICAgRm9sZGluZ1JhbmdlS2luZC5SZWdpb24gPSAncmVnaW9uJztcbn0pKEZvbGRpbmdSYW5nZUtpbmQgfHwgKEZvbGRpbmdSYW5nZUtpbmQgPSB7fSkpO1xuLyoqXG4gKiBUaGUgZm9sZGluZyByYW5nZSBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBGb2xkaW5nUmFuZ2V9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIEZvbGRpbmdSYW5nZTtcbihmdW5jdGlvbiAoRm9sZGluZ1JhbmdlKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBGb2xkaW5nUmFuZ2UgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUoc3RhcnRMaW5lLCBlbmRMaW5lLCBzdGFydENoYXJhY3RlciwgZW5kQ2hhcmFjdGVyLCBraW5kLCBjb2xsYXBzZWRUZXh0KSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIHN0YXJ0TGluZSxcbiAgICAgICAgICAgIGVuZExpbmVcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKElzLmRlZmluZWQoc3RhcnRDaGFyYWN0ZXIpKSB7XG4gICAgICAgICAgICByZXN1bHQuc3RhcnRDaGFyYWN0ZXIgPSBzdGFydENoYXJhY3RlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXMuZGVmaW5lZChlbmRDaGFyYWN0ZXIpKSB7XG4gICAgICAgICAgICByZXN1bHQuZW5kQ2hhcmFjdGVyID0gZW5kQ2hhcmFjdGVyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKGtpbmQpKSB7XG4gICAgICAgICAgICByZXN1bHQua2luZCA9IGtpbmQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzLmRlZmluZWQoY29sbGFwc2VkVGV4dCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5jb2xsYXBzZWRUZXh0ID0gY29sbGFwc2VkVGV4dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBGb2xkaW5nUmFuZ2UuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgRm9sZGluZ1JhbmdlfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgSXMudWludGVnZXIoY2FuZGlkYXRlLnN0YXJ0TGluZSkgJiYgSXMudWludGVnZXIoY2FuZGlkYXRlLnN0YXJ0TGluZSlcbiAgICAgICAgICAgICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLnN0YXJ0Q2hhcmFjdGVyKSB8fCBJcy51aW50ZWdlcihjYW5kaWRhdGUuc3RhcnRDaGFyYWN0ZXIpKVxuICAgICAgICAgICAgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUuZW5kQ2hhcmFjdGVyKSB8fCBJcy51aW50ZWdlcihjYW5kaWRhdGUuZW5kQ2hhcmFjdGVyKSlcbiAgICAgICAgICAgICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLmtpbmQpIHx8IElzLnN0cmluZyhjYW5kaWRhdGUua2luZCkpO1xuICAgIH1cbiAgICBGb2xkaW5nUmFuZ2UuaXMgPSBpcztcbn0pKEZvbGRpbmdSYW5nZSB8fCAoRm9sZGluZ1JhbmdlID0ge30pKTtcbi8qKlxuICogVGhlIERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24gbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbjtcbihmdW5jdGlvbiAoRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbiBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShsb2NhdGlvbiwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbG9jYXRpb24sXG4gICAgICAgICAgICBtZXNzYWdlXG4gICAgICAgIH07XG4gICAgfVxuICAgIERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24uY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBMb2NhdGlvbi5pcyhjYW5kaWRhdGUubG9jYXRpb24pICYmIElzLnN0cmluZyhjYW5kaWRhdGUubWVzc2FnZSk7XG4gICAgfVxuICAgIERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24uaXMgPSBpcztcbn0pKERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24gfHwgKERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24gPSB7fSkpO1xuLyoqXG4gKiBUaGUgZGlhZ25vc3RpYydzIHNldmVyaXR5LlxuICovXG5leHBvcnQgdmFyIERpYWdub3N0aWNTZXZlcml0eTtcbihmdW5jdGlvbiAoRGlhZ25vc3RpY1NldmVyaXR5KSB7XG4gICAgLyoqXG4gICAgICogUmVwb3J0cyBhbiBlcnJvci5cbiAgICAgKi9cbiAgICBEaWFnbm9zdGljU2V2ZXJpdHkuRXJyb3IgPSAxO1xuICAgIC8qKlxuICAgICAqIFJlcG9ydHMgYSB3YXJuaW5nLlxuICAgICAqL1xuICAgIERpYWdub3N0aWNTZXZlcml0eS5XYXJuaW5nID0gMjtcbiAgICAvKipcbiAgICAgKiBSZXBvcnRzIGFuIGluZm9ybWF0aW9uLlxuICAgICAqL1xuICAgIERpYWdub3N0aWNTZXZlcml0eS5JbmZvcm1hdGlvbiA9IDM7XG4gICAgLyoqXG4gICAgICogUmVwb3J0cyBhIGhpbnQuXG4gICAgICovXG4gICAgRGlhZ25vc3RpY1NldmVyaXR5LkhpbnQgPSA0O1xufSkoRGlhZ25vc3RpY1NldmVyaXR5IHx8IChEaWFnbm9zdGljU2V2ZXJpdHkgPSB7fSkpO1xuLyoqXG4gKiBUaGUgZGlhZ25vc3RpYyB0YWdzLlxuICpcbiAqIEBzaW5jZSAzLjE1LjBcbiAqL1xuZXhwb3J0IHZhciBEaWFnbm9zdGljVGFnO1xuKGZ1bmN0aW9uIChEaWFnbm9zdGljVGFnKSB7XG4gICAgLyoqXG4gICAgICogVW51c2VkIG9yIHVubmVjZXNzYXJ5IGNvZGUuXG4gICAgICpcbiAgICAgKiBDbGllbnRzIGFyZSBhbGxvd2VkIHRvIHJlbmRlciBkaWFnbm9zdGljcyB3aXRoIHRoaXMgdGFnIGZhZGVkIG91dCBpbnN0ZWFkIG9mIGhhdmluZ1xuICAgICAqIGFuIGVycm9yIHNxdWlnZ2xlLlxuICAgICAqL1xuICAgIERpYWdub3N0aWNUYWcuVW5uZWNlc3NhcnkgPSAxO1xuICAgIC8qKlxuICAgICAqIERlcHJlY2F0ZWQgb3Igb2Jzb2xldGUgY29kZS5cbiAgICAgKlxuICAgICAqIENsaWVudHMgYXJlIGFsbG93ZWQgdG8gcmVuZGVyZWQgZGlhZ25vc3RpY3Mgd2l0aCB0aGlzIHRhZyBzdHJpa2UgdGhyb3VnaC5cbiAgICAgKi9cbiAgICBEaWFnbm9zdGljVGFnLkRlcHJlY2F0ZWQgPSAyO1xufSkoRGlhZ25vc3RpY1RhZyB8fCAoRGlhZ25vc3RpY1RhZyA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb2RlRGVzY3JpcHRpb24gbmFtZXNwYWNlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGggZGVzY3JpcHRpb25zIGZvciBkaWFnbm9zdGljIGNvZGVzLlxuICpcbiAqIEBzaW5jZSAzLjE2LjBcbiAqL1xuZXhwb3J0IHZhciBDb2RlRGVzY3JpcHRpb247XG4oZnVuY3Rpb24gKENvZGVEZXNjcmlwdGlvbikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUuaHJlZik7XG4gICAgfVxuICAgIENvZGVEZXNjcmlwdGlvbi5pcyA9IGlzO1xufSkoQ29kZURlc2NyaXB0aW9uIHx8IChDb2RlRGVzY3JpcHRpb24gPSB7fSkpO1xuLyoqXG4gKiBUaGUgRGlhZ25vc3RpYyBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBEaWFnbm9zdGljfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBEaWFnbm9zdGljO1xuKGZ1bmN0aW9uIChEaWFnbm9zdGljKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBEaWFnbm9zdGljIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCBtZXNzYWdlLCBzZXZlcml0eSwgY29kZSwgc291cmNlLCByZWxhdGVkSW5mb3JtYXRpb24pIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHsgcmFuZ2UsIG1lc3NhZ2UgfTtcbiAgICAgICAgaWYgKElzLmRlZmluZWQoc2V2ZXJpdHkpKSB7XG4gICAgICAgICAgICByZXN1bHQuc2V2ZXJpdHkgPSBzZXZlcml0eTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXMuZGVmaW5lZChjb2RlKSkge1xuICAgICAgICAgICAgcmVzdWx0LmNvZGUgPSBjb2RlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKHNvdXJjZSkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzLmRlZmluZWQocmVsYXRlZEluZm9ybWF0aW9uKSkge1xuICAgICAgICAgICAgcmVzdWx0LnJlbGF0ZWRJbmZvcm1hdGlvbiA9IHJlbGF0ZWRJbmZvcm1hdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBEaWFnbm9zdGljLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIERpYWdub3N0aWN9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKVxuICAgICAgICAgICAgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKVxuICAgICAgICAgICAgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5tZXNzYWdlKVxuICAgICAgICAgICAgJiYgKElzLm51bWJlcihjYW5kaWRhdGUuc2V2ZXJpdHkpIHx8IElzLnVuZGVmaW5lZChjYW5kaWRhdGUuc2V2ZXJpdHkpKVxuICAgICAgICAgICAgJiYgKElzLmludGVnZXIoY2FuZGlkYXRlLmNvZGUpIHx8IElzLnN0cmluZyhjYW5kaWRhdGUuY29kZSkgfHwgSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5jb2RlKSlcbiAgICAgICAgICAgICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLmNvZGVEZXNjcmlwdGlvbikgfHwgKElzLnN0cmluZygoX2EgPSBjYW5kaWRhdGUuY29kZURlc2NyaXB0aW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaHJlZikpKVxuICAgICAgICAgICAgJiYgKElzLnN0cmluZyhjYW5kaWRhdGUuc291cmNlKSB8fCBJcy51bmRlZmluZWQoY2FuZGlkYXRlLnNvdXJjZSkpXG4gICAgICAgICAgICAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5yZWxhdGVkSW5mb3JtYXRpb24pIHx8IElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLnJlbGF0ZWRJbmZvcm1hdGlvbiwgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbi5pcykpO1xuICAgIH1cbiAgICBEaWFnbm9zdGljLmlzID0gaXM7XG59KShEaWFnbm9zdGljIHx8IChEaWFnbm9zdGljID0ge30pKTtcbi8qKlxuICogVGhlIENvbW1hbmQgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgQ29tbWFuZH0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgQ29tbWFuZDtcbihmdW5jdGlvbiAoQ29tbWFuZCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ29tbWFuZCBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh0aXRsZSwgY29tbWFuZCwgLi4uYXJncykge1xuICAgICAgICBsZXQgcmVzdWx0ID0geyB0aXRsZSwgY29tbWFuZCB9O1xuICAgICAgICBpZiAoSXMuZGVmaW5lZChhcmdzKSAmJiBhcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJlc3VsdC5hcmd1bWVudHMgPSBhcmdzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIENvbW1hbmQuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgQ29tbWFuZH0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnRpdGxlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLmNvbW1hbmQpO1xuICAgIH1cbiAgICBDb21tYW5kLmlzID0gaXM7XG59KShDb21tYW5kIHx8IChDb21tYW5kID0ge30pKTtcbi8qKlxuICogVGhlIFRleHRFZGl0IG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIHJlcGxhY2UsXG4gKiBpbnNlcnQgYW5kIGRlbGV0ZSBlZGl0cyBtb3JlIGVhc2lseS5cbiAqL1xuZXhwb3J0IHZhciBUZXh0RWRpdDtcbihmdW5jdGlvbiAoVGV4dEVkaXQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgcmVwbGFjZSB0ZXh0IGVkaXQuXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSBvZiB0ZXh0IHRvIGJlIHJlcGxhY2VkLlxuICAgICAqIEBwYXJhbSBuZXdUZXh0IFRoZSBuZXcgdGV4dC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXBsYWNlKHJhbmdlLCBuZXdUZXh0KSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCBuZXdUZXh0IH07XG4gICAgfVxuICAgIFRleHRFZGl0LnJlcGxhY2UgPSByZXBsYWNlO1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zZXJ0IHRleHQgZWRpdC5cbiAgICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIHBvc2l0aW9uIHRvIGluc2VydCB0aGUgdGV4dCBhdC5cbiAgICAgKiBAcGFyYW0gbmV3VGV4dCBUaGUgdGV4dCB0byBiZSBpbnNlcnRlZC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbnNlcnQocG9zaXRpb24sIG5ld1RleHQpIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2U6IHsgc3RhcnQ6IHBvc2l0aW9uLCBlbmQ6IHBvc2l0aW9uIH0sIG5ld1RleHQgfTtcbiAgICB9XG4gICAgVGV4dEVkaXQuaW5zZXJ0ID0gaW5zZXJ0O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBkZWxldGUgdGV4dCBlZGl0LlxuICAgICAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2Ugb2YgdGV4dCB0byBiZSBkZWxldGVkLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRlbChyYW5nZSkge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgbmV3VGV4dDogJycgfTtcbiAgICB9XG4gICAgVGV4dEVkaXQuZGVsID0gZGVsO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpXG4gICAgICAgICAgICAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLm5ld1RleHQpXG4gICAgICAgICAgICAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpO1xuICAgIH1cbiAgICBUZXh0RWRpdC5pcyA9IGlzO1xufSkoVGV4dEVkaXQgfHwgKFRleHRFZGl0ID0ge30pKTtcbmV4cG9ydCB2YXIgQ2hhbmdlQW5ub3RhdGlvbjtcbihmdW5jdGlvbiAoQ2hhbmdlQW5ub3RhdGlvbikge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShsYWJlbCwgbmVlZHNDb25maXJtYXRpb24sIGRlc2NyaXB0aW9uKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHsgbGFiZWwgfTtcbiAgICAgICAgaWYgKG5lZWRzQ29uZmlybWF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5uZWVkc0NvbmZpcm1hdGlvbiA9IG5lZWRzQ29uZmlybWF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZXNjcmlwdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBDaGFuZ2VBbm5vdGF0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLmxhYmVsKSAmJlxuICAgICAgICAgICAgKElzLmJvb2xlYW4oY2FuZGlkYXRlLm5lZWRzQ29uZmlybWF0aW9uKSB8fCBjYW5kaWRhdGUubmVlZHNDb25maXJtYXRpb24gPT09IHVuZGVmaW5lZCkgJiZcbiAgICAgICAgICAgIChJcy5zdHJpbmcoY2FuZGlkYXRlLmRlc2NyaXB0aW9uKSB8fCBjYW5kaWRhdGUuZGVzY3JpcHRpb24gPT09IHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIENoYW5nZUFubm90YXRpb24uaXMgPSBpcztcbn0pKENoYW5nZUFubm90YXRpb24gfHwgKENoYW5nZUFubm90YXRpb24gPSB7fSkpO1xuZXhwb3J0IHZhciBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllcjtcbihmdW5jdGlvbiAoQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLnN0cmluZyhjYW5kaWRhdGUpO1xuICAgIH1cbiAgICBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyA9IGlzO1xufSkoQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIgfHwgKENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyID0ge30pKTtcbmV4cG9ydCB2YXIgQW5ub3RhdGVkVGV4dEVkaXQ7XG4oZnVuY3Rpb24gKEFubm90YXRlZFRleHRFZGl0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhbm5vdGF0ZWQgcmVwbGFjZSB0ZXh0IGVkaXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlIG9mIHRleHQgdG8gYmUgcmVwbGFjZWQuXG4gICAgICogQHBhcmFtIG5ld1RleHQgVGhlIG5ldyB0ZXh0LlxuICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIFRoZSBhbm5vdGF0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlcGxhY2UocmFuZ2UsIG5ld1RleHQsIGFubm90YXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIG5ld1RleHQsIGFubm90YXRpb25JZDogYW5ub3RhdGlvbiB9O1xuICAgIH1cbiAgICBBbm5vdGF0ZWRUZXh0RWRpdC5yZXBsYWNlID0gcmVwbGFjZTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFubm90YXRlZCBpbnNlcnQgdGV4dCBlZGl0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBwb3NpdGlvbiB0byBpbnNlcnQgdGhlIHRleHQgYXQuXG4gICAgICogQHBhcmFtIG5ld1RleHQgVGhlIHRleHQgdG8gYmUgaW5zZXJ0ZWQuXG4gICAgICogQHBhcmFtIGFubm90YXRpb24gVGhlIGFubm90YXRpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5zZXJ0KHBvc2l0aW9uLCBuZXdUZXh0LCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlOiB7IHN0YXJ0OiBwb3NpdGlvbiwgZW5kOiBwb3NpdGlvbiB9LCBuZXdUZXh0LCBhbm5vdGF0aW9uSWQ6IGFubm90YXRpb24gfTtcbiAgICB9XG4gICAgQW5ub3RhdGVkVGV4dEVkaXQuaW5zZXJ0ID0gaW5zZXJ0O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYW5ub3RhdGVkIGRlbGV0ZSB0ZXh0IGVkaXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlIG9mIHRleHQgdG8gYmUgZGVsZXRlZC5cbiAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiBUaGUgYW5ub3RhdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkZWwocmFuZ2UsIGFubm90YXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIG5ld1RleHQ6ICcnLCBhbm5vdGF0aW9uSWQ6IGFubm90YXRpb24gfTtcbiAgICB9XG4gICAgQW5ub3RhdGVkVGV4dEVkaXQuZGVsID0gZGVsO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gVGV4dEVkaXQuaXMoY2FuZGlkYXRlKSAmJiAoQ2hhbmdlQW5ub3RhdGlvbi5pcyhjYW5kaWRhdGUuYW5ub3RhdGlvbklkKSB8fCBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhjYW5kaWRhdGUuYW5ub3RhdGlvbklkKSk7XG4gICAgfVxuICAgIEFubm90YXRlZFRleHRFZGl0LmlzID0gaXM7XG59KShBbm5vdGF0ZWRUZXh0RWRpdCB8fCAoQW5ub3RhdGVkVGV4dEVkaXQgPSB7fSkpO1xuLyoqXG4gKiBUaGUgVGV4dERvY3VtZW50RWRpdCBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZVxuICogYW4gZWRpdCB0aGF0IG1hbmlwdWxhdGVzIGEgdGV4dCBkb2N1bWVudC5cbiAqL1xuZXhwb3J0IHZhciBUZXh0RG9jdW1lbnRFZGl0O1xuKGZ1bmN0aW9uIChUZXh0RG9jdW1lbnRFZGl0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBgVGV4dERvY3VtZW50RWRpdGBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodGV4dERvY3VtZW50LCBlZGl0cykge1xuICAgICAgICByZXR1cm4geyB0ZXh0RG9jdW1lbnQsIGVkaXRzIH07XG4gICAgfVxuICAgIFRleHREb2N1bWVudEVkaXQuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKVxuICAgICAgICAgICAgJiYgT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmlzKGNhbmRpZGF0ZS50ZXh0RG9jdW1lbnQpXG4gICAgICAgICAgICAmJiBBcnJheS5pc0FycmF5KGNhbmRpZGF0ZS5lZGl0cyk7XG4gICAgfVxuICAgIFRleHREb2N1bWVudEVkaXQuaXMgPSBpcztcbn0pKFRleHREb2N1bWVudEVkaXQgfHwgKFRleHREb2N1bWVudEVkaXQgPSB7fSkpO1xuZXhwb3J0IHZhciBDcmVhdGVGaWxlO1xuKGZ1bmN0aW9uIChDcmVhdGVGaWxlKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKHVyaSwgb3B0aW9ucywgYW5ub3RhdGlvbikge1xuICAgICAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgICAgICAga2luZDogJ2NyZWF0ZScsXG4gICAgICAgICAgICB1cmlcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKG9wdGlvbnMgIT09IHVuZGVmaW5lZCAmJiAob3B0aW9ucy5vdmVyd3JpdGUgIT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLmlnbm9yZUlmRXhpc3RzICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICByZXN1bHQub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFubm90YXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmFubm90YXRpb25JZCA9IGFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgQ3JlYXRlRmlsZS5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIGNhbmRpZGF0ZS5raW5kID09PSAnY3JlYXRlJyAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSkgJiYgKGNhbmRpZGF0ZS5vcHRpb25zID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICgoY2FuZGlkYXRlLm9wdGlvbnMub3ZlcndyaXRlID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUub3B0aW9ucy5vdmVyd3JpdGUpKSAmJiAoY2FuZGlkYXRlLm9wdGlvbnMuaWdub3JlSWZFeGlzdHMgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5vcHRpb25zLmlnbm9yZUlmRXhpc3RzKSkpKSAmJiAoY2FuZGlkYXRlLmFubm90YXRpb25JZCA9PT0gdW5kZWZpbmVkIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQpKTtcbiAgICB9XG4gICAgQ3JlYXRlRmlsZS5pcyA9IGlzO1xufSkoQ3JlYXRlRmlsZSB8fCAoQ3JlYXRlRmlsZSA9IHt9KSk7XG5leHBvcnQgdmFyIFJlbmFtZUZpbGU7XG4oZnVuY3Rpb24gKFJlbmFtZUZpbGUpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUob2xkVXJpLCBuZXdVcmksIG9wdGlvbnMsIGFubm90YXRpb24pIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIGtpbmQ6ICdyZW5hbWUnLFxuICAgICAgICAgICAgb2xkVXJpLFxuICAgICAgICAgICAgbmV3VXJpXG4gICAgICAgIH07XG4gICAgICAgIGlmIChvcHRpb25zICE9PSB1bmRlZmluZWQgJiYgKG9wdGlvbnMub3ZlcndyaXRlICE9PSB1bmRlZmluZWQgfHwgb3B0aW9ucy5pZ25vcmVJZkV4aXN0cyAhPT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgcmVzdWx0Lm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbm5vdGF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5hbm5vdGF0aW9uSWQgPSBhbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIFJlbmFtZUZpbGUuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBjYW5kaWRhdGUua2luZCA9PT0gJ3JlbmFtZScgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5vbGRVcmkpICYmIElzLnN0cmluZyhjYW5kaWRhdGUubmV3VXJpKSAmJiAoY2FuZGlkYXRlLm9wdGlvbnMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgKChjYW5kaWRhdGUub3B0aW9ucy5vdmVyd3JpdGUgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5vcHRpb25zLm92ZXJ3cml0ZSkpICYmIChjYW5kaWRhdGUub3B0aW9ucy5pZ25vcmVJZkV4aXN0cyA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLm9wdGlvbnMuaWdub3JlSWZFeGlzdHMpKSkpICYmIChjYW5kaWRhdGUuYW5ub3RhdGlvbklkID09PSB1bmRlZmluZWQgfHwgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoY2FuZGlkYXRlLmFubm90YXRpb25JZCkpO1xuICAgIH1cbiAgICBSZW5hbWVGaWxlLmlzID0gaXM7XG59KShSZW5hbWVGaWxlIHx8IChSZW5hbWVGaWxlID0ge30pKTtcbmV4cG9ydCB2YXIgRGVsZXRlRmlsZTtcbihmdW5jdGlvbiAoRGVsZXRlRmlsZSkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmksIG9wdGlvbnMsIGFubm90YXRpb24pIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIGtpbmQ6ICdkZWxldGUnLFxuICAgICAgICAgICAgdXJpXG4gICAgICAgIH07XG4gICAgICAgIGlmIChvcHRpb25zICE9PSB1bmRlZmluZWQgJiYgKG9wdGlvbnMucmVjdXJzaXZlICE9PSB1bmRlZmluZWQgfHwgb3B0aW9ucy5pZ25vcmVJZk5vdEV4aXN0cyAhPT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgcmVzdWx0Lm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbm5vdGF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5hbm5vdGF0aW9uSWQgPSBhbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIERlbGV0ZUZpbGUuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBjYW5kaWRhdGUua2luZCA9PT0gJ2RlbGV0ZScgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpICYmIChjYW5kaWRhdGUub3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAoKGNhbmRpZGF0ZS5vcHRpb25zLnJlY3Vyc2l2ZSA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLm9wdGlvbnMucmVjdXJzaXZlKSkgJiYgKGNhbmRpZGF0ZS5vcHRpb25zLmlnbm9yZUlmTm90RXhpc3RzID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUub3B0aW9ucy5pZ25vcmVJZk5vdEV4aXN0cykpKSkgJiYgKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQgPT09IHVuZGVmaW5lZCB8fCBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhjYW5kaWRhdGUuYW5ub3RhdGlvbklkKSk7XG4gICAgfVxuICAgIERlbGV0ZUZpbGUuaXMgPSBpcztcbn0pKERlbGV0ZUZpbGUgfHwgKERlbGV0ZUZpbGUgPSB7fSkpO1xuZXhwb3J0IHZhciBXb3Jrc3BhY2VFZGl0O1xuKGZ1bmN0aW9uIChXb3Jrc3BhY2VFZGl0KSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmNoYW5nZXMgIT09IHVuZGVmaW5lZCB8fCBjYW5kaWRhdGUuZG9jdW1lbnRDaGFuZ2VzICE9PSB1bmRlZmluZWQpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmRvY3VtZW50Q2hhbmdlcyA9PT0gdW5kZWZpbmVkIHx8IGNhbmRpZGF0ZS5kb2N1bWVudENoYW5nZXMuZXZlcnkoKGNoYW5nZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChJcy5zdHJpbmcoY2hhbmdlLmtpbmQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVGaWxlLmlzKGNoYW5nZSkgfHwgUmVuYW1lRmlsZS5pcyhjaGFuZ2UpIHx8IERlbGV0ZUZpbGUuaXMoY2hhbmdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBUZXh0RG9jdW1lbnRFZGl0LmlzKGNoYW5nZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgIH1cbiAgICBXb3Jrc3BhY2VFZGl0LmlzID0gaXM7XG59KShXb3Jrc3BhY2VFZGl0IHx8IChXb3Jrc3BhY2VFZGl0ID0ge30pKTtcbmNsYXNzIFRleHRFZGl0Q2hhbmdlSW1wbCB7XG4gICAgY29uc3RydWN0b3IoZWRpdHMsIGNoYW5nZUFubm90YXRpb25zKSB7XG4gICAgICAgIHRoaXMuZWRpdHMgPSBlZGl0cztcbiAgICAgICAgdGhpcy5jaGFuZ2VBbm5vdGF0aW9ucyA9IGNoYW5nZUFubm90YXRpb25zO1xuICAgIH1cbiAgICBpbnNlcnQocG9zaXRpb24sIG5ld1RleHQsIGFubm90YXRpb24pIHtcbiAgICAgICAgbGV0IGVkaXQ7XG4gICAgICAgIGxldCBpZDtcbiAgICAgICAgaWYgKGFubm90YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZWRpdCA9IFRleHRFZGl0Lmluc2VydChwb3NpdGlvbiwgbmV3VGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoYW5ub3RhdGlvbikpIHtcbiAgICAgICAgICAgIGlkID0gYW5ub3RhdGlvbjtcbiAgICAgICAgICAgIGVkaXQgPSBBbm5vdGF0ZWRUZXh0RWRpdC5pbnNlcnQocG9zaXRpb24sIG5ld1RleHQsIGFubm90YXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hc3NlcnRDaGFuZ2VBbm5vdGF0aW9ucyh0aGlzLmNoYW5nZUFubm90YXRpb25zKTtcbiAgICAgICAgICAgIGlkID0gdGhpcy5jaGFuZ2VBbm5vdGF0aW9ucy5tYW5hZ2UoYW5ub3RhdGlvbik7XG4gICAgICAgICAgICBlZGl0ID0gQW5ub3RhdGVkVGV4dEVkaXQuaW5zZXJ0KHBvc2l0aW9uLCBuZXdUZXh0LCBpZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lZGl0cy5wdXNoKGVkaXQpO1xuICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlcGxhY2UocmFuZ2UsIG5ld1RleHQsIGFubm90YXRpb24pIHtcbiAgICAgICAgbGV0IGVkaXQ7XG4gICAgICAgIGxldCBpZDtcbiAgICAgICAgaWYgKGFubm90YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZWRpdCA9IFRleHRFZGl0LnJlcGxhY2UocmFuZ2UsIG5ld1RleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGFubm90YXRpb24pKSB7XG4gICAgICAgICAgICBpZCA9IGFubm90YXRpb247XG4gICAgICAgICAgICBlZGl0ID0gQW5ub3RhdGVkVGV4dEVkaXQucmVwbGFjZShyYW5nZSwgbmV3VGV4dCwgYW5ub3RhdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFzc2VydENoYW5nZUFubm90YXRpb25zKHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgaWQgPSB0aGlzLmNoYW5nZUFubm90YXRpb25zLm1hbmFnZShhbm5vdGF0aW9uKTtcbiAgICAgICAgICAgIGVkaXQgPSBBbm5vdGF0ZWRUZXh0RWRpdC5yZXBsYWNlKHJhbmdlLCBuZXdUZXh0LCBpZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lZGl0cy5wdXNoKGVkaXQpO1xuICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlbGV0ZShyYW5nZSwgYW5ub3RhdGlvbikge1xuICAgICAgICBsZXQgZWRpdDtcbiAgICAgICAgbGV0IGlkO1xuICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBlZGl0ID0gVGV4dEVkaXQuZGVsKHJhbmdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhhbm5vdGF0aW9uKSkge1xuICAgICAgICAgICAgaWQgPSBhbm5vdGF0aW9uO1xuICAgICAgICAgICAgZWRpdCA9IEFubm90YXRlZFRleHRFZGl0LmRlbChyYW5nZSwgYW5ub3RhdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFzc2VydENoYW5nZUFubm90YXRpb25zKHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgaWQgPSB0aGlzLmNoYW5nZUFubm90YXRpb25zLm1hbmFnZShhbm5vdGF0aW9uKTtcbiAgICAgICAgICAgIGVkaXQgPSBBbm5vdGF0ZWRUZXh0RWRpdC5kZWwocmFuZ2UsIGlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVkaXRzLnB1c2goZWRpdCk7XG4gICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYWRkKGVkaXQpIHtcbiAgICAgICAgdGhpcy5lZGl0cy5wdXNoKGVkaXQpO1xuICAgIH1cbiAgICBhbGwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRzO1xuICAgIH1cbiAgICBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5lZGl0cy5zcGxpY2UoMCwgdGhpcy5lZGl0cy5sZW5ndGgpO1xuICAgIH1cbiAgICBhc3NlcnRDaGFuZ2VBbm5vdGF0aW9ucyh2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUZXh0IGVkaXQgY2hhbmdlIGlzIG5vdCBjb25maWd1cmVkIHRvIG1hbmFnZSBjaGFuZ2UgYW5ub3RhdGlvbnMuYCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIEEgaGVscGVyIGNsYXNzXG4gKi9cbmNsYXNzIENoYW5nZUFubm90YXRpb25zIHtcbiAgICBjb25zdHJ1Y3Rvcihhbm5vdGF0aW9ucykge1xuICAgICAgICB0aGlzLl9hbm5vdGF0aW9ucyA9IGFubm90YXRpb25zID09PSB1bmRlZmluZWQgPyBPYmplY3QuY3JlYXRlKG51bGwpIDogYW5ub3RhdGlvbnM7XG4gICAgICAgIHRoaXMuX2NvdW50ZXIgPSAwO1xuICAgICAgICB0aGlzLl9zaXplID0gMDtcbiAgICB9XG4gICAgYWxsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYW5ub3RhdGlvbnM7XG4gICAgfVxuICAgIGdldCBzaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2l6ZTtcbiAgICB9XG4gICAgbWFuYWdlKGlkT3JBbm5vdGF0aW9uLCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIGxldCBpZDtcbiAgICAgICAgaWYgKENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGlkT3JBbm5vdGF0aW9uKSkge1xuICAgICAgICAgICAgaWQgPSBpZE9yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlkID0gdGhpcy5uZXh0SWQoKTtcbiAgICAgICAgICAgIGFubm90YXRpb24gPSBpZE9yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fYW5ub3RhdGlvbnNbaWRdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSWQgJHtpZH0gaXMgYWxyZWFkeSBpbiB1c2UuYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFubm90YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBhbm5vdGF0aW9uIHByb3ZpZGVkIGZvciBpZCAke2lkfWApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2Fubm90YXRpb25zW2lkXSA9IGFubm90YXRpb247XG4gICAgICAgIHRoaXMuX3NpemUrKztcbiAgICAgICAgcmV0dXJuIGlkO1xuICAgIH1cbiAgICBuZXh0SWQoKSB7XG4gICAgICAgIHRoaXMuX2NvdW50ZXIrKztcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvdW50ZXIudG9TdHJpbmcoKTtcbiAgICB9XG59XG4vKipcbiAqIEEgd29ya3NwYWNlIGNoYW5nZSBoZWxwcyBjb25zdHJ1Y3RpbmcgY2hhbmdlcyB0byBhIHdvcmtzcGFjZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFdvcmtzcGFjZUNoYW5nZSB7XG4gICAgY29uc3RydWN0b3Iod29ya3NwYWNlRWRpdCkge1xuICAgICAgICB0aGlzLl90ZXh0RWRpdENoYW5nZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBpZiAod29ya3NwYWNlRWRpdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0ID0gd29ya3NwYWNlRWRpdDtcbiAgICAgICAgICAgIGlmICh3b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZUFubm90YXRpb25zID0gbmV3IENoYW5nZUFubm90YXRpb25zKHdvcmtzcGFjZUVkaXQuY2hhbmdlQW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgICAgIHdvcmtzcGFjZUVkaXQuY2hhbmdlQW5ub3RhdGlvbnMgPSB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5hbGwoKTtcbiAgICAgICAgICAgICAgICB3b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcy5mb3JFYWNoKChjaGFuZ2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFRleHREb2N1bWVudEVkaXQuaXMoY2hhbmdlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dEVkaXRDaGFuZ2UgPSBuZXcgVGV4dEVkaXRDaGFuZ2VJbXBsKGNoYW5nZS5lZGl0cywgdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGV4dEVkaXRDaGFuZ2VzW2NoYW5nZS50ZXh0RG9jdW1lbnQudXJpXSA9IHRleHRFZGl0Q2hhbmdlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh3b3Jrc3BhY2VFZGl0LmNoYW5nZXMpIHtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyh3b3Jrc3BhY2VFZGl0LmNoYW5nZXMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0RWRpdENoYW5nZSA9IG5ldyBUZXh0RWRpdENoYW5nZUltcGwod29ya3NwYWNlRWRpdC5jaGFuZ2VzW2tleV0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXh0RWRpdENoYW5nZXNba2V5XSA9IHRleHRFZGl0Q2hhbmdlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdCA9IHt9O1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHVuZGVybHlpbmcge0BsaW5rIFdvcmtzcGFjZUVkaXR9IGxpdGVyYWxcbiAgICAgKiB1c2UgdG8gYmUgcmV0dXJuZWQgZnJvbSBhIHdvcmtzcGFjZSBlZGl0IG9wZXJhdGlvbiBsaWtlIHJlbmFtZS5cbiAgICAgKi9cbiAgICBnZXQgZWRpdCgpIHtcbiAgICAgICAgdGhpcy5pbml0RG9jdW1lbnRDaGFuZ2VzKCk7XG4gICAgICAgIGlmICh0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlQW5ub3RhdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZUFubm90YXRpb25zID0gdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMuYWxsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3dvcmtzcGFjZUVkaXQ7XG4gICAgfVxuICAgIGdldFRleHRFZGl0Q2hhbmdlKGtleSkge1xuICAgICAgICBpZiAoT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmlzKGtleSkpIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdERvY3VtZW50Q2hhbmdlcygpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dvcmtzcGFjZSBlZGl0IGlzIG5vdCBjb25maWd1cmVkIGZvciBkb2N1bWVudCBjaGFuZ2VzLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdGV4dERvY3VtZW50ID0geyB1cmk6IGtleS51cmksIHZlcnNpb246IGtleS52ZXJzaW9uIH07XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5fdGV4dEVkaXRDaGFuZ2VzW3RleHREb2N1bWVudC51cmldO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlZGl0cyA9IFtdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRleHREb2N1bWVudEVkaXQgPSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHREb2N1bWVudCxcbiAgICAgICAgICAgICAgICAgICAgZWRpdHNcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzLnB1c2godGV4dERvY3VtZW50RWRpdCk7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFRleHRFZGl0Q2hhbmdlSW1wbChlZGl0cywgdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3RleHRFZGl0Q2hhbmdlc1t0ZXh0RG9jdW1lbnQudXJpXSA9IHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmluaXRDaGFuZ2VzKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dvcmtzcGFjZSBlZGl0IGlzIG5vdCBjb25maWd1cmVkIGZvciBub3JtYWwgdGV4dCBlZGl0IGNoYW5nZXMuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5fdGV4dEVkaXRDaGFuZ2VzW2tleV07XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgICAgIGxldCBlZGl0cyA9IFtdO1xuICAgICAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlc1trZXldID0gZWRpdHM7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFRleHRFZGl0Q2hhbmdlSW1wbChlZGl0cyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGV4dEVkaXRDaGFuZ2VzW2tleV0gPSByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgfVxuICAgIGluaXREb2N1bWVudENoYW5nZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcyA9PT0gdW5kZWZpbmVkICYmIHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucyA9IG5ldyBDaGFuZ2VBbm5vdGF0aW9ucygpO1xuICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlQW5ub3RhdGlvbnMgPSB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5hbGwoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpbml0Q2hhbmdlcygpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzID09PSB1bmRlZmluZWQgJiYgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY3JlYXRlRmlsZSh1cmksIG9wdGlvbnNPckFubm90YXRpb24sIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5pbml0RG9jdW1lbnRDaGFuZ2VzKCk7XG4gICAgICAgIGlmICh0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dvcmtzcGFjZSBlZGl0IGlzIG5vdCBjb25maWd1cmVkIGZvciBkb2N1bWVudCBjaGFuZ2VzLicpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhbm5vdGF0aW9uO1xuICAgICAgICBpZiAoQ2hhbmdlQW5ub3RhdGlvbi5pcyhvcHRpb25zT3JBbm5vdGF0aW9uKSB8fCBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhvcHRpb25zT3JBbm5vdGF0aW9uKSkge1xuICAgICAgICAgICAgYW5ub3RhdGlvbiA9IG9wdGlvbnNPckFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvcHRpb25zID0gb3B0aW9uc09yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb3BlcmF0aW9uO1xuICAgICAgICBsZXQgaWQ7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wZXJhdGlvbiA9IENyZWF0ZUZpbGUuY3JlYXRlKHVyaSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZCA9IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGFubm90YXRpb24pID8gYW5ub3RhdGlvbiA6IHRoaXMuX2NoYW5nZUFubm90YXRpb25zLm1hbmFnZShhbm5vdGF0aW9uKTtcbiAgICAgICAgICAgIG9wZXJhdGlvbiA9IENyZWF0ZUZpbGUuY3JlYXRlKHVyaSwgb3B0aW9ucywgaWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzLnB1c2gob3BlcmF0aW9uKTtcbiAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZW5hbWVGaWxlKG9sZFVyaSwgbmV3VXJpLCBvcHRpb25zT3JBbm5vdGF0aW9uLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuaW5pdERvY3VtZW50Q2hhbmdlcygpO1xuICAgICAgICBpZiAodGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXb3Jrc3BhY2UgZWRpdCBpcyBub3QgY29uZmlndXJlZCBmb3IgZG9jdW1lbnQgY2hhbmdlcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYW5ub3RhdGlvbjtcbiAgICAgICAgaWYgKENoYW5nZUFubm90YXRpb24uaXMob3B0aW9uc09yQW5ub3RhdGlvbikgfHwgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMob3B0aW9uc09yQW5ub3RhdGlvbikpIHtcbiAgICAgICAgICAgIGFubm90YXRpb24gPSBvcHRpb25zT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnNPckFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG9wZXJhdGlvbjtcbiAgICAgICAgbGV0IGlkO1xuICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcGVyYXRpb24gPSBSZW5hbWVGaWxlLmNyZWF0ZShvbGRVcmksIG5ld1VyaSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZCA9IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGFubm90YXRpb24pID8gYW5ub3RhdGlvbiA6IHRoaXMuX2NoYW5nZUFubm90YXRpb25zLm1hbmFnZShhbm5vdGF0aW9uKTtcbiAgICAgICAgICAgIG9wZXJhdGlvbiA9IFJlbmFtZUZpbGUuY3JlYXRlKG9sZFVyaSwgbmV3VXJpLCBvcHRpb25zLCBpZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMucHVzaChvcGVyYXRpb24pO1xuICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlbGV0ZUZpbGUodXJpLCBvcHRpb25zT3JBbm5vdGF0aW9uLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuaW5pdERvY3VtZW50Q2hhbmdlcygpO1xuICAgICAgICBpZiAodGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXb3Jrc3BhY2UgZWRpdCBpcyBub3QgY29uZmlndXJlZCBmb3IgZG9jdW1lbnQgY2hhbmdlcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYW5ub3RhdGlvbjtcbiAgICAgICAgaWYgKENoYW5nZUFubm90YXRpb24uaXMob3B0aW9uc09yQW5ub3RhdGlvbikgfHwgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMob3B0aW9uc09yQW5ub3RhdGlvbikpIHtcbiAgICAgICAgICAgIGFubm90YXRpb24gPSBvcHRpb25zT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnNPckFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG9wZXJhdGlvbjtcbiAgICAgICAgbGV0IGlkO1xuICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcGVyYXRpb24gPSBEZWxldGVGaWxlLmNyZWF0ZSh1cmksIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWQgPSBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhhbm5vdGF0aW9uKSA/IGFubm90YXRpb24gOiB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5tYW5hZ2UoYW5ub3RhdGlvbik7XG4gICAgICAgICAgICBvcGVyYXRpb24gPSBEZWxldGVGaWxlLmNyZWF0ZSh1cmksIG9wdGlvbnMsIGlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcy5wdXNoKG9wZXJhdGlvbik7XG4gICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIFRoZSBUZXh0RG9jdW1lbnRJZGVudGlmaWVyIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIFRleHREb2N1bWVudElkZW50aWZpZXJ9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIFRleHREb2N1bWVudElkZW50aWZpZXI7XG4oZnVuY3Rpb24gKFRleHREb2N1bWVudElkZW50aWZpZXIpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFRleHREb2N1bWVudElkZW50aWZpZXIgbGl0ZXJhbC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSBkb2N1bWVudCdzIHVyaS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodXJpKSB7XG4gICAgICAgIHJldHVybiB7IHVyaSB9O1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIFRleHREb2N1bWVudElkZW50aWZpZXJ9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpO1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmlzID0gaXM7XG59KShUZXh0RG9jdW1lbnRJZGVudGlmaWVyIHx8IChUZXh0RG9jdW1lbnRJZGVudGlmaWVyID0ge30pKTtcbi8qKlxuICogVGhlIFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcjtcbihmdW5jdGlvbiAoVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciBsaXRlcmFsLlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIGRvY3VtZW50J3MgdXJpLlxuICAgICAqIEBwYXJhbSB2ZXJzaW9uIFRoZSBkb2N1bWVudCdzIHZlcnNpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHVyaSwgdmVyc2lvbikge1xuICAgICAgICByZXR1cm4geyB1cmksIHZlcnNpb24gfTtcbiAgICB9XG4gICAgVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllci5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudXJpKSAmJiBJcy5pbnRlZ2VyKGNhbmRpZGF0ZS52ZXJzaW9uKTtcbiAgICB9XG4gICAgVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllci5pcyA9IGlzO1xufSkoVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciB8fCAoVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciA9IHt9KSk7XG4vKipcbiAqIFRoZSBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXI7XG4oZnVuY3Rpb24gKE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIGxpdGVyYWwuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgZG9jdW1lbnQncyB1cmkuXG4gICAgICogQHBhcmFtIHZlcnNpb24gVGhlIGRvY3VtZW50J3MgdmVyc2lvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodXJpLCB2ZXJzaW9uKSB7XG4gICAgICAgIHJldHVybiB7IHVyaSwgdmVyc2lvbiB9O1xuICAgIH1cbiAgICBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudXJpKSAmJiAoY2FuZGlkYXRlLnZlcnNpb24gPT09IG51bGwgfHwgSXMuaW50ZWdlcihjYW5kaWRhdGUudmVyc2lvbikpO1xuICAgIH1cbiAgICBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIuaXMgPSBpcztcbn0pKE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciB8fCAoT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyID0ge30pKTtcbi8qKlxuICogVGhlIFRleHREb2N1bWVudEl0ZW0gbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgVGV4dERvY3VtZW50SXRlbX0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgVGV4dERvY3VtZW50SXRlbTtcbihmdW5jdGlvbiAoVGV4dERvY3VtZW50SXRlbSkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgVGV4dERvY3VtZW50SXRlbSBsaXRlcmFsLlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIGRvY3VtZW50J3MgdXJpLlxuICAgICAqIEBwYXJhbSBsYW5ndWFnZUlkIFRoZSBkb2N1bWVudCdzIGxhbmd1YWdlIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHZlcnNpb24gVGhlIGRvY3VtZW50J3MgdmVyc2lvbiBudW1iZXIuXG4gICAgICogQHBhcmFtIHRleHQgVGhlIGRvY3VtZW50J3MgdGV4dC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodXJpLCBsYW5ndWFnZUlkLCB2ZXJzaW9uLCB0ZXh0KSB7XG4gICAgICAgIHJldHVybiB7IHVyaSwgbGFuZ3VhZ2VJZCwgdmVyc2lvbiwgdGV4dCB9O1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnRJdGVtLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIFRleHREb2N1bWVudEl0ZW19IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpICYmIElzLnN0cmluZyhjYW5kaWRhdGUubGFuZ3VhZ2VJZCkgJiYgSXMuaW50ZWdlcihjYW5kaWRhdGUudmVyc2lvbikgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS50ZXh0KTtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50SXRlbS5pcyA9IGlzO1xufSkoVGV4dERvY3VtZW50SXRlbSB8fCAoVGV4dERvY3VtZW50SXRlbSA9IHt9KSk7XG4vKipcbiAqIERlc2NyaWJlcyB0aGUgY29udGVudCB0eXBlIHRoYXQgYSBjbGllbnQgc3VwcG9ydHMgaW4gdmFyaW91c1xuICogcmVzdWx0IGxpdGVyYWxzIGxpa2UgYEhvdmVyYCwgYFBhcmFtZXRlckluZm9gIG9yIGBDb21wbGV0aW9uSXRlbWAuXG4gKlxuICogUGxlYXNlIG5vdGUgdGhhdCBgTWFya3VwS2luZHNgIG11c3Qgbm90IHN0YXJ0IHdpdGggYSBgJGAuIFRoaXMga2luZHNcbiAqIGFyZSByZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNhZ2UuXG4gKi9cbmV4cG9ydCB2YXIgTWFya3VwS2luZDtcbihmdW5jdGlvbiAoTWFya3VwS2luZCkge1xuICAgIC8qKlxuICAgICAqIFBsYWluIHRleHQgaXMgc3VwcG9ydGVkIGFzIGEgY29udGVudCBmb3JtYXRcbiAgICAgKi9cbiAgICBNYXJrdXBLaW5kLlBsYWluVGV4dCA9ICdwbGFpbnRleHQnO1xuICAgIC8qKlxuICAgICAqIE1hcmtkb3duIGlzIHN1cHBvcnRlZCBhcyBhIGNvbnRlbnQgZm9ybWF0XG4gICAgICovXG4gICAgTWFya3VwS2luZC5NYXJrZG93biA9ICdtYXJrZG93bic7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIGlzIGEgdmFsdWUgb2YgdGhlIHtAbGluayBNYXJrdXBLaW5kfSB0eXBlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlID09PSBNYXJrdXBLaW5kLlBsYWluVGV4dCB8fCBjYW5kaWRhdGUgPT09IE1hcmt1cEtpbmQuTWFya2Rvd247XG4gICAgfVxuICAgIE1hcmt1cEtpbmQuaXMgPSBpcztcbn0pKE1hcmt1cEtpbmQgfHwgKE1hcmt1cEtpbmQgPSB7fSkpO1xuZXhwb3J0IHZhciBNYXJrdXBDb250ZW50O1xuKGZ1bmN0aW9uIChNYXJrdXBDb250ZW50KSB7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgTWFya3VwQ29udGVudH0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbCh2YWx1ZSkgJiYgTWFya3VwS2luZC5pcyhjYW5kaWRhdGUua2luZCkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS52YWx1ZSk7XG4gICAgfVxuICAgIE1hcmt1cENvbnRlbnQuaXMgPSBpcztcbn0pKE1hcmt1cENvbnRlbnQgfHwgKE1hcmt1cENvbnRlbnQgPSB7fSkpO1xuLyoqXG4gKiBUaGUga2luZCBvZiBhIGNvbXBsZXRpb24gZW50cnkuXG4gKi9cbmV4cG9ydCB2YXIgQ29tcGxldGlvbkl0ZW1LaW5kO1xuKGZ1bmN0aW9uIChDb21wbGV0aW9uSXRlbUtpbmQpIHtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuVGV4dCA9IDE7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLk1ldGhvZCA9IDI7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkZ1bmN0aW9uID0gMztcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuQ29uc3RydWN0b3IgPSA0O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5GaWVsZCA9IDU7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlZhcmlhYmxlID0gNjtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuQ2xhc3MgPSA3O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5JbnRlcmZhY2UgPSA4O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5Nb2R1bGUgPSA5O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5Qcm9wZXJ0eSA9IDEwO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5Vbml0ID0gMTE7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlZhbHVlID0gMTI7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkVudW0gPSAxMztcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuS2V5d29yZCA9IDE0O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5TbmlwcGV0ID0gMTU7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkNvbG9yID0gMTY7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkZpbGUgPSAxNztcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuUmVmZXJlbmNlID0gMTg7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkZvbGRlciA9IDE5O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5FbnVtTWVtYmVyID0gMjA7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkNvbnN0YW50ID0gMjE7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlN0cnVjdCA9IDIyO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5FdmVudCA9IDIzO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5PcGVyYXRvciA9IDI0O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5UeXBlUGFyYW1ldGVyID0gMjU7XG59KShDb21wbGV0aW9uSXRlbUtpbmQgfHwgKENvbXBsZXRpb25JdGVtS2luZCA9IHt9KSk7XG4vKipcbiAqIERlZmluZXMgd2hldGhlciB0aGUgaW5zZXJ0IHRleHQgaW4gYSBjb21wbGV0aW9uIGl0ZW0gc2hvdWxkIGJlIGludGVycHJldGVkIGFzXG4gKiBwbGFpbiB0ZXh0IG9yIGEgc25pcHBldC5cbiAqL1xuZXhwb3J0IHZhciBJbnNlcnRUZXh0Rm9ybWF0O1xuKGZ1bmN0aW9uIChJbnNlcnRUZXh0Rm9ybWF0KSB7XG4gICAgLyoqXG4gICAgICogVGhlIHByaW1hcnkgdGV4dCB0byBiZSBpbnNlcnRlZCBpcyB0cmVhdGVkIGFzIGEgcGxhaW4gc3RyaW5nLlxuICAgICAqL1xuICAgIEluc2VydFRleHRGb3JtYXQuUGxhaW5UZXh0ID0gMTtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpbWFyeSB0ZXh0IHRvIGJlIGluc2VydGVkIGlzIHRyZWF0ZWQgYXMgYSBzbmlwcGV0LlxuICAgICAqXG4gICAgICogQSBzbmlwcGV0IGNhbiBkZWZpbmUgdGFiIHN0b3BzIGFuZCBwbGFjZWhvbGRlcnMgd2l0aCBgJDFgLCBgJDJgXG4gICAgICogYW5kIGAkezM6Zm9vfWAuIGAkMGAgZGVmaW5lcyB0aGUgZmluYWwgdGFiIHN0b3AsIGl0IGRlZmF1bHRzIHRvXG4gICAgICogdGhlIGVuZCBvZiB0aGUgc25pcHBldC4gUGxhY2Vob2xkZXJzIHdpdGggZXF1YWwgaWRlbnRpZmllcnMgYXJlIGxpbmtlZCxcbiAgICAgKiB0aGF0IGlzIHR5cGluZyBpbiBvbmUgd2lsbCB1cGRhdGUgb3RoZXJzIHRvby5cbiAgICAgKlxuICAgICAqIFNlZSBhbHNvOiBodHRwczovL21pY3Jvc29mdC5naXRodWIuaW8vbGFuZ3VhZ2Utc2VydmVyLXByb3RvY29sL3NwZWNpZmljYXRpb25zL3NwZWNpZmljYXRpb24tY3VycmVudC8jc25pcHBldF9zeW50YXhcbiAgICAgKi9cbiAgICBJbnNlcnRUZXh0Rm9ybWF0LlNuaXBwZXQgPSAyO1xufSkoSW5zZXJ0VGV4dEZvcm1hdCB8fCAoSW5zZXJ0VGV4dEZvcm1hdCA9IHt9KSk7XG4vKipcbiAqIENvbXBsZXRpb24gaXRlbSB0YWdzIGFyZSBleHRyYSBhbm5vdGF0aW9ucyB0aGF0IHR3ZWFrIHRoZSByZW5kZXJpbmcgb2YgYSBjb21wbGV0aW9uXG4gKiBpdGVtLlxuICpcbiAqIEBzaW5jZSAzLjE1LjBcbiAqL1xuZXhwb3J0IHZhciBDb21wbGV0aW9uSXRlbVRhZztcbihmdW5jdGlvbiAoQ29tcGxldGlvbkl0ZW1UYWcpIHtcbiAgICAvKipcbiAgICAgKiBSZW5kZXIgYSBjb21wbGV0aW9uIGFzIG9ic29sZXRlLCB1c3VhbGx5IHVzaW5nIGEgc3RyaWtlLW91dC5cbiAgICAgKi9cbiAgICBDb21wbGV0aW9uSXRlbVRhZy5EZXByZWNhdGVkID0gMTtcbn0pKENvbXBsZXRpb25JdGVtVGFnIHx8IChDb21wbGV0aW9uSXRlbVRhZyA9IHt9KSk7XG4vKipcbiAqIFRoZSBJbnNlcnRSZXBsYWNlRWRpdCBuYW1lc3BhY2UgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCBpbnNlcnQgLyByZXBsYWNlIGVkaXRzLlxuICpcbiAqIEBzaW5jZSAzLjE2LjBcbiAqL1xuZXhwb3J0IHZhciBJbnNlcnRSZXBsYWNlRWRpdDtcbihmdW5jdGlvbiAoSW5zZXJ0UmVwbGFjZUVkaXQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGluc2VydCAvIHJlcGxhY2UgZWRpdFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShuZXdUZXh0LCBpbnNlcnQsIHJlcGxhY2UpIHtcbiAgICAgICAgcmV0dXJuIHsgbmV3VGV4dCwgaW5zZXJ0LCByZXBsYWNlIH07XG4gICAgfVxuICAgIEluc2VydFJlcGxhY2VFZGl0LmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIEluc2VydFJlcGxhY2VFZGl0fSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5uZXdUZXh0KSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUuaW5zZXJ0KSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmVwbGFjZSk7XG4gICAgfVxuICAgIEluc2VydFJlcGxhY2VFZGl0LmlzID0gaXM7XG59KShJbnNlcnRSZXBsYWNlRWRpdCB8fCAoSW5zZXJ0UmVwbGFjZUVkaXQgPSB7fSkpO1xuLyoqXG4gKiBIb3cgd2hpdGVzcGFjZSBhbmQgaW5kZW50YXRpb24gaXMgaGFuZGxlZCBkdXJpbmcgY29tcGxldGlvblxuICogaXRlbSBpbnNlcnRpb24uXG4gKlxuICogQHNpbmNlIDMuMTYuMFxuICovXG5leHBvcnQgdmFyIEluc2VydFRleHRNb2RlO1xuKGZ1bmN0aW9uIChJbnNlcnRUZXh0TW9kZSkge1xuICAgIC8qKlxuICAgICAqIFRoZSBpbnNlcnRpb24gb3IgcmVwbGFjZSBzdHJpbmdzIGlzIHRha2VuIGFzIGl0IGlzLiBJZiB0aGVcbiAgICAgKiB2YWx1ZSBpcyBtdWx0aSBsaW5lIHRoZSBsaW5lcyBiZWxvdyB0aGUgY3Vyc29yIHdpbGwgYmVcbiAgICAgKiBpbnNlcnRlZCB1c2luZyB0aGUgaW5kZW50YXRpb24gZGVmaW5lZCBpbiB0aGUgc3RyaW5nIHZhbHVlLlxuICAgICAqIFRoZSBjbGllbnQgd2lsbCBub3QgYXBwbHkgYW55IGtpbmQgb2YgYWRqdXN0bWVudHMgdG8gdGhlXG4gICAgICogc3RyaW5nLlxuICAgICAqL1xuICAgIEluc2VydFRleHRNb2RlLmFzSXMgPSAxO1xuICAgIC8qKlxuICAgICAqIFRoZSBlZGl0b3IgYWRqdXN0cyBsZWFkaW5nIHdoaXRlc3BhY2Ugb2YgbmV3IGxpbmVzIHNvIHRoYXRcbiAgICAgKiB0aGV5IG1hdGNoIHRoZSBpbmRlbnRhdGlvbiB1cCB0byB0aGUgY3Vyc29yIG9mIHRoZSBsaW5lIGZvclxuICAgICAqIHdoaWNoIHRoZSBpdGVtIGlzIGFjY2VwdGVkLlxuICAgICAqXG4gICAgICogQ29uc2lkZXIgYSBsaW5lIGxpa2UgdGhpczogPDJ0YWJzPjxjdXJzb3I+PDN0YWJzPmZvby4gQWNjZXB0aW5nIGFcbiAgICAgKiBtdWx0aSBsaW5lIGNvbXBsZXRpb24gaXRlbSBpcyBpbmRlbnRlZCB1c2luZyAyIHRhYnMgYW5kIGFsbFxuICAgICAqIGZvbGxvd2luZyBsaW5lcyBpbnNlcnRlZCB3aWxsIGJlIGluZGVudGVkIHVzaW5nIDIgdGFicyBhcyB3ZWxsLlxuICAgICAqL1xuICAgIEluc2VydFRleHRNb2RlLmFkanVzdEluZGVudGF0aW9uID0gMjtcbn0pKEluc2VydFRleHRNb2RlIHx8IChJbnNlcnRUZXh0TW9kZSA9IHt9KSk7XG5leHBvcnQgdmFyIENvbXBsZXRpb25JdGVtTGFiZWxEZXRhaWxzO1xuKGZ1bmN0aW9uIChDb21wbGV0aW9uSXRlbUxhYmVsRGV0YWlscykge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIChJcy5zdHJpbmcoY2FuZGlkYXRlLmRldGFpbCkgfHwgY2FuZGlkYXRlLmRldGFpbCA9PT0gdW5kZWZpbmVkKSAmJlxuICAgICAgICAgICAgKElzLnN0cmluZyhjYW5kaWRhdGUuZGVzY3JpcHRpb24pIHx8IGNhbmRpZGF0ZS5kZXNjcmlwdGlvbiA9PT0gdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgQ29tcGxldGlvbkl0ZW1MYWJlbERldGFpbHMuaXMgPSBpcztcbn0pKENvbXBsZXRpb25JdGVtTGFiZWxEZXRhaWxzIHx8IChDb21wbGV0aW9uSXRlbUxhYmVsRGV0YWlscyA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb21wbGV0aW9uSXRlbSBuYW1lc3BhY2UgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aFxuICogY29tcGxldGlvbiBpdGVtcy5cbiAqL1xuZXhwb3J0IHZhciBDb21wbGV0aW9uSXRlbTtcbihmdW5jdGlvbiAoQ29tcGxldGlvbkl0ZW0pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBjb21wbGV0aW9uIGl0ZW0gYW5kIHNlZWQgaXQgd2l0aCBhIGxhYmVsLlxuICAgICAqIEBwYXJhbSBsYWJlbCBUaGUgY29tcGxldGlvbiBpdGVtJ3MgbGFiZWxcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobGFiZWwpIHtcbiAgICAgICAgcmV0dXJuIHsgbGFiZWwgfTtcbiAgICB9XG4gICAgQ29tcGxldGlvbkl0ZW0uY3JlYXRlID0gY3JlYXRlO1xufSkoQ29tcGxldGlvbkl0ZW0gfHwgKENvbXBsZXRpb25JdGVtID0ge30pKTtcbi8qKlxuICogVGhlIENvbXBsZXRpb25MaXN0IG5hbWVzcGFjZSBwcm92aWRlcyBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoXG4gKiBjb21wbGV0aW9uIGxpc3RzLlxuICovXG5leHBvcnQgdmFyIENvbXBsZXRpb25MaXN0O1xuKGZ1bmN0aW9uIChDb21wbGV0aW9uTGlzdCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgY29tcGxldGlvbiBsaXN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIGl0ZW1zIFRoZSBjb21wbGV0aW9uIGl0ZW1zLlxuICAgICAqIEBwYXJhbSBpc0luY29tcGxldGUgVGhlIGxpc3QgaXMgbm90IGNvbXBsZXRlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShpdGVtcywgaXNJbmNvbXBsZXRlKSB7XG4gICAgICAgIHJldHVybiB7IGl0ZW1zOiBpdGVtcyA/IGl0ZW1zIDogW10sIGlzSW5jb21wbGV0ZTogISFpc0luY29tcGxldGUgfTtcbiAgICB9XG4gICAgQ29tcGxldGlvbkxpc3QuY3JlYXRlID0gY3JlYXRlO1xufSkoQ29tcGxldGlvbkxpc3QgfHwgKENvbXBsZXRpb25MaXN0ID0ge30pKTtcbmV4cG9ydCB2YXIgTWFya2VkU3RyaW5nO1xuKGZ1bmN0aW9uIChNYXJrZWRTdHJpbmcpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbWFya2VkIHN0cmluZyBmcm9tIHBsYWluIHRleHQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGxhaW5UZXh0IFRoZSBwbGFpbiB0ZXh0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZyb21QbGFpblRleHQocGxhaW5UZXh0KSB7XG4gICAgICAgIHJldHVybiBwbGFpblRleHQucmVwbGFjZSgvW1xcXFxgKl97fVtcXF0oKSMrXFwtLiFdL2csICdcXFxcJCYnKTsgLy8gZXNjYXBlIG1hcmtkb3duIHN5bnRheCB0b2tlbnM6IGh0dHA6Ly9kYXJpbmdmaXJlYmFsbC5uZXQvcHJvamVjdHMvbWFya2Rvd24vc3ludGF4I2JhY2tzbGFzaFxuICAgIH1cbiAgICBNYXJrZWRTdHJpbmcuZnJvbVBsYWluVGV4dCA9IGZyb21QbGFpblRleHQ7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgTWFya2VkU3RyaW5nfSB0eXBlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuc3RyaW5nKGNhbmRpZGF0ZSkgfHwgKElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLmxhbmd1YWdlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnZhbHVlKSk7XG4gICAgfVxuICAgIE1hcmtlZFN0cmluZy5pcyA9IGlzO1xufSkoTWFya2VkU3RyaW5nIHx8IChNYXJrZWRTdHJpbmcgPSB7fSkpO1xuZXhwb3J0IHZhciBIb3ZlcjtcbihmdW5jdGlvbiAoSG92ZXIpIHtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgY29uZm9ybXMgdG8gdGhlIHtAbGluayBIb3Zlcn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuICEhY2FuZGlkYXRlICYmIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiAoTWFya3VwQ29udGVudC5pcyhjYW5kaWRhdGUuY29udGVudHMpIHx8XG4gICAgICAgICAgICBNYXJrZWRTdHJpbmcuaXMoY2FuZGlkYXRlLmNvbnRlbnRzKSB8fFxuICAgICAgICAgICAgSXMudHlwZWRBcnJheShjYW5kaWRhdGUuY29udGVudHMsIE1hcmtlZFN0cmluZy5pcykpICYmICh2YWx1ZS5yYW5nZSA9PT0gdW5kZWZpbmVkIHx8IFJhbmdlLmlzKHZhbHVlLnJhbmdlKSk7XG4gICAgfVxuICAgIEhvdmVyLmlzID0gaXM7XG59KShIb3ZlciB8fCAoSG92ZXIgPSB7fSkpO1xuLyoqXG4gKiBUaGUgUGFyYW1ldGVySW5mb3JtYXRpb24gbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgUGFyYW1ldGVySW5mb3JtYXRpb259IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIFBhcmFtZXRlckluZm9ybWF0aW9uO1xuKGZ1bmN0aW9uIChQYXJhbWV0ZXJJbmZvcm1hdGlvbikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgcGFyYW1ldGVyIGluZm9ybWF0aW9uIGxpdGVyYWwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGFiZWwgQSBsYWJlbCBzdHJpbmcuXG4gICAgICogQHBhcmFtIGRvY3VtZW50YXRpb24gQSBkb2Mgc3RyaW5nLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShsYWJlbCwgZG9jdW1lbnRhdGlvbikge1xuICAgICAgICByZXR1cm4gZG9jdW1lbnRhdGlvbiA/IHsgbGFiZWwsIGRvY3VtZW50YXRpb24gfSA6IHsgbGFiZWwgfTtcbiAgICB9XG4gICAgUGFyYW1ldGVySW5mb3JtYXRpb24uY3JlYXRlID0gY3JlYXRlO1xufSkoUGFyYW1ldGVySW5mb3JtYXRpb24gfHwgKFBhcmFtZXRlckluZm9ybWF0aW9uID0ge30pKTtcbi8qKlxuICogVGhlIFNpZ25hdHVyZUluZm9ybWF0aW9uIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIFNpZ25hdHVyZUluZm9ybWF0aW9ufSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBTaWduYXR1cmVJbmZvcm1hdGlvbjtcbihmdW5jdGlvbiAoU2lnbmF0dXJlSW5mb3JtYXRpb24pIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUobGFiZWwsIGRvY3VtZW50YXRpb24sIC4uLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHsgbGFiZWwgfTtcbiAgICAgICAgaWYgKElzLmRlZmluZWQoZG9jdW1lbnRhdGlvbikpIHtcbiAgICAgICAgICAgIHJlc3VsdC5kb2N1bWVudGF0aW9uID0gZG9jdW1lbnRhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXMuZGVmaW5lZChwYXJhbWV0ZXJzKSkge1xuICAgICAgICAgICAgcmVzdWx0LnBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0LnBhcmFtZXRlcnMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBTaWduYXR1cmVJbmZvcm1hdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG59KShTaWduYXR1cmVJbmZvcm1hdGlvbiB8fCAoU2lnbmF0dXJlSW5mb3JtYXRpb24gPSB7fSkpO1xuLyoqXG4gKiBBIGRvY3VtZW50IGhpZ2hsaWdodCBraW5kLlxuICovXG5leHBvcnQgdmFyIERvY3VtZW50SGlnaGxpZ2h0S2luZDtcbihmdW5jdGlvbiAoRG9jdW1lbnRIaWdobGlnaHRLaW5kKSB7XG4gICAgLyoqXG4gICAgICogQSB0ZXh0dWFsIG9jY3VycmVuY2UuXG4gICAgICovXG4gICAgRG9jdW1lbnRIaWdobGlnaHRLaW5kLlRleHQgPSAxO1xuICAgIC8qKlxuICAgICAqIFJlYWQtYWNjZXNzIG9mIGEgc3ltYm9sLCBsaWtlIHJlYWRpbmcgYSB2YXJpYWJsZS5cbiAgICAgKi9cbiAgICBEb2N1bWVudEhpZ2hsaWdodEtpbmQuUmVhZCA9IDI7XG4gICAgLyoqXG4gICAgICogV3JpdGUtYWNjZXNzIG9mIGEgc3ltYm9sLCBsaWtlIHdyaXRpbmcgdG8gYSB2YXJpYWJsZS5cbiAgICAgKi9cbiAgICBEb2N1bWVudEhpZ2hsaWdodEtpbmQuV3JpdGUgPSAzO1xufSkoRG9jdW1lbnRIaWdobGlnaHRLaW5kIHx8IChEb2N1bWVudEhpZ2hsaWdodEtpbmQgPSB7fSkpO1xuLyoqXG4gKiBEb2N1bWVudEhpZ2hsaWdodCBuYW1lc3BhY2UgdG8gcHJvdmlkZSBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIERvY3VtZW50SGlnaGxpZ2h0fSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBEb2N1bWVudEhpZ2hsaWdodDtcbihmdW5jdGlvbiAoRG9jdW1lbnRIaWdobGlnaHQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBEb2N1bWVudEhpZ2hsaWdodCBvYmplY3QuXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSB0aGUgaGlnaGxpZ2h0IGFwcGxpZXMgdG8uXG4gICAgICogQHBhcmFtIGtpbmQgVGhlIGhpZ2hsaWdodCBraW5kXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCBraW5kKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IHJhbmdlIH07XG4gICAgICAgIGlmIChJcy5udW1iZXIoa2luZCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5raW5kID0ga2luZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBEb2N1bWVudEhpZ2hsaWdodC5jcmVhdGUgPSBjcmVhdGU7XG59KShEb2N1bWVudEhpZ2hsaWdodCB8fCAoRG9jdW1lbnRIaWdobGlnaHQgPSB7fSkpO1xuLyoqXG4gKiBBIHN5bWJvbCBraW5kLlxuICovXG5leHBvcnQgdmFyIFN5bWJvbEtpbmQ7XG4oZnVuY3Rpb24gKFN5bWJvbEtpbmQpIHtcbiAgICBTeW1ib2xLaW5kLkZpbGUgPSAxO1xuICAgIFN5bWJvbEtpbmQuTW9kdWxlID0gMjtcbiAgICBTeW1ib2xLaW5kLk5hbWVzcGFjZSA9IDM7XG4gICAgU3ltYm9sS2luZC5QYWNrYWdlID0gNDtcbiAgICBTeW1ib2xLaW5kLkNsYXNzID0gNTtcbiAgICBTeW1ib2xLaW5kLk1ldGhvZCA9IDY7XG4gICAgU3ltYm9sS2luZC5Qcm9wZXJ0eSA9IDc7XG4gICAgU3ltYm9sS2luZC5GaWVsZCA9IDg7XG4gICAgU3ltYm9sS2luZC5Db25zdHJ1Y3RvciA9IDk7XG4gICAgU3ltYm9sS2luZC5FbnVtID0gMTA7XG4gICAgU3ltYm9sS2luZC5JbnRlcmZhY2UgPSAxMTtcbiAgICBTeW1ib2xLaW5kLkZ1bmN0aW9uID0gMTI7XG4gICAgU3ltYm9sS2luZC5WYXJpYWJsZSA9IDEzO1xuICAgIFN5bWJvbEtpbmQuQ29uc3RhbnQgPSAxNDtcbiAgICBTeW1ib2xLaW5kLlN0cmluZyA9IDE1O1xuICAgIFN5bWJvbEtpbmQuTnVtYmVyID0gMTY7XG4gICAgU3ltYm9sS2luZC5Cb29sZWFuID0gMTc7XG4gICAgU3ltYm9sS2luZC5BcnJheSA9IDE4O1xuICAgIFN5bWJvbEtpbmQuT2JqZWN0ID0gMTk7XG4gICAgU3ltYm9sS2luZC5LZXkgPSAyMDtcbiAgICBTeW1ib2xLaW5kLk51bGwgPSAyMTtcbiAgICBTeW1ib2xLaW5kLkVudW1NZW1iZXIgPSAyMjtcbiAgICBTeW1ib2xLaW5kLlN0cnVjdCA9IDIzO1xuICAgIFN5bWJvbEtpbmQuRXZlbnQgPSAyNDtcbiAgICBTeW1ib2xLaW5kLk9wZXJhdG9yID0gMjU7XG4gICAgU3ltYm9sS2luZC5UeXBlUGFyYW1ldGVyID0gMjY7XG59KShTeW1ib2xLaW5kIHx8IChTeW1ib2xLaW5kID0ge30pKTtcbi8qKlxuICogU3ltYm9sIHRhZ3MgYXJlIGV4dHJhIGFubm90YXRpb25zIHRoYXQgdHdlYWsgdGhlIHJlbmRlcmluZyBvZiBhIHN5bWJvbC5cbiAqXG4gKiBAc2luY2UgMy4xNlxuICovXG5leHBvcnQgdmFyIFN5bWJvbFRhZztcbihmdW5jdGlvbiAoU3ltYm9sVGFnKSB7XG4gICAgLyoqXG4gICAgICogUmVuZGVyIGEgc3ltYm9sIGFzIG9ic29sZXRlLCB1c3VhbGx5IHVzaW5nIGEgc3RyaWtlLW91dC5cbiAgICAgKi9cbiAgICBTeW1ib2xUYWcuRGVwcmVjYXRlZCA9IDE7XG59KShTeW1ib2xUYWcgfHwgKFN5bWJvbFRhZyA9IHt9KSk7XG5leHBvcnQgdmFyIFN5bWJvbEluZm9ybWF0aW9uO1xuKGZ1bmN0aW9uIChTeW1ib2xJbmZvcm1hdGlvbikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgc3ltYm9sIGluZm9ybWF0aW9uIGxpdGVyYWwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSBraW5kIFRoZSBraW5kIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSBvZiB0aGUgbG9jYXRpb24gb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSByZXNvdXJjZSBvZiB0aGUgbG9jYXRpb24gb2Ygc3ltYm9sLlxuICAgICAqIEBwYXJhbSBjb250YWluZXJOYW1lIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgY29udGFpbmluZyB0aGUgc3ltYm9sLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShuYW1lLCBraW5kLCByYW5nZSwgdXJpLCBjb250YWluZXJOYW1lKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAga2luZCxcbiAgICAgICAgICAgIGxvY2F0aW9uOiB7IHVyaSwgcmFuZ2UgfVxuICAgICAgICB9O1xuICAgICAgICBpZiAoY29udGFpbmVyTmFtZSkge1xuICAgICAgICAgICAgcmVzdWx0LmNvbnRhaW5lck5hbWUgPSBjb250YWluZXJOYW1lO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIFN5bWJvbEluZm9ybWF0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKFN5bWJvbEluZm9ybWF0aW9uIHx8IChTeW1ib2xJbmZvcm1hdGlvbiA9IHt9KSk7XG5leHBvcnQgdmFyIFdvcmtzcGFjZVN5bWJvbDtcbihmdW5jdGlvbiAoV29ya3NwYWNlU3ltYm9sKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IHdvcmtzcGFjZSBzeW1ib2wuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSBraW5kIFRoZSBraW5kIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgcmVzb3VyY2Ugb2YgdGhlIGxvY2F0aW9uIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIHJhbmdlIEFuIG9wdGlvbnMgcmFuZ2Ugb2YgdGhlIGxvY2F0aW9uLlxuICAgICAqIEByZXR1cm5zIEEgV29ya3NwYWNlU3ltYm9sLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShuYW1lLCBraW5kLCB1cmksIHJhbmdlKSB7XG4gICAgICAgIHJldHVybiByYW5nZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IHsgbmFtZSwga2luZCwgbG9jYXRpb246IHsgdXJpLCByYW5nZSB9IH1cbiAgICAgICAgICAgIDogeyBuYW1lLCBraW5kLCBsb2NhdGlvbjogeyB1cmkgfSB9O1xuICAgIH1cbiAgICBXb3Jrc3BhY2VTeW1ib2wuY3JlYXRlID0gY3JlYXRlO1xufSkoV29ya3NwYWNlU3ltYm9sIHx8IChXb3Jrc3BhY2VTeW1ib2wgPSB7fSkpO1xuZXhwb3J0IHZhciBEb2N1bWVudFN5bWJvbDtcbihmdW5jdGlvbiAoRG9jdW1lbnRTeW1ib2wpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHN5bWJvbCBpbmZvcm1hdGlvbiBsaXRlcmFsLlxuICAgICAqXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gZGV0YWlsIFRoZSBkZXRhaWwgb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0ga2luZCBUaGUga2luZCBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2Ugb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gc2VsZWN0aW9uUmFuZ2UgVGhlIHNlbGVjdGlvblJhbmdlIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIGNoaWxkcmVuIENoaWxkcmVuIG9mIHRoZSBzeW1ib2wuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKG5hbWUsIGRldGFpbCwga2luZCwgcmFuZ2UsIHNlbGVjdGlvblJhbmdlLCBjaGlsZHJlbikge1xuICAgICAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGRldGFpbCxcbiAgICAgICAgICAgIGtpbmQsXG4gICAgICAgICAgICByYW5nZSxcbiAgICAgICAgICAgIHNlbGVjdGlvblJhbmdlXG4gICAgICAgIH07XG4gICAgICAgIGlmIChjaGlsZHJlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBEb2N1bWVudFN5bWJvbC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBEb2N1bWVudFN5bWJvbH0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJlxuICAgICAgICAgICAgSXMuc3RyaW5nKGNhbmRpZGF0ZS5uYW1lKSAmJiBJcy5udW1iZXIoY2FuZGlkYXRlLmtpbmQpICYmXG4gICAgICAgICAgICBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5zZWxlY3Rpb25SYW5nZSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuZGV0YWlsID09PSB1bmRlZmluZWQgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS5kZXRhaWwpKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5kZXByZWNhdGVkID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUuZGVwcmVjYXRlZCkpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmNoaWxkcmVuID09PSB1bmRlZmluZWQgfHwgQXJyYXkuaXNBcnJheShjYW5kaWRhdGUuY2hpbGRyZW4pKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS50YWdzID09PSB1bmRlZmluZWQgfHwgQXJyYXkuaXNBcnJheShjYW5kaWRhdGUudGFncykpO1xuICAgIH1cbiAgICBEb2N1bWVudFN5bWJvbC5pcyA9IGlzO1xufSkoRG9jdW1lbnRTeW1ib2wgfHwgKERvY3VtZW50U3ltYm9sID0ge30pKTtcbi8qKlxuICogQSBzZXQgb2YgcHJlZGVmaW5lZCBjb2RlIGFjdGlvbiBraW5kc1xuICovXG5leHBvcnQgdmFyIENvZGVBY3Rpb25LaW5kO1xuKGZ1bmN0aW9uIChDb2RlQWN0aW9uS2luZCkge1xuICAgIC8qKlxuICAgICAqIEVtcHR5IGtpbmQuXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuRW1wdHkgPSAnJztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIHF1aWNrZml4IGFjdGlvbnM6ICdxdWlja2ZpeCdcbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5RdWlja0ZpeCA9ICdxdWlja2ZpeCc7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciByZWZhY3RvcmluZyBhY3Rpb25zOiAncmVmYWN0b3InXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuUmVmYWN0b3IgPSAncmVmYWN0b3InO1xuICAgIC8qKlxuICAgICAqIEJhc2Uga2luZCBmb3IgcmVmYWN0b3JpbmcgZXh0cmFjdGlvbiBhY3Rpb25zOiAncmVmYWN0b3IuZXh0cmFjdCdcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgZXh0cmFjdCBhY3Rpb25zOlxuICAgICAqXG4gICAgICogLSBFeHRyYWN0IG1ldGhvZFxuICAgICAqIC0gRXh0cmFjdCBmdW5jdGlvblxuICAgICAqIC0gRXh0cmFjdCB2YXJpYWJsZVxuICAgICAqIC0gRXh0cmFjdCBpbnRlcmZhY2UgZnJvbSBjbGFzc1xuICAgICAqIC0gLi4uXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuUmVmYWN0b3JFeHRyYWN0ID0gJ3JlZmFjdG9yLmV4dHJhY3QnO1xuICAgIC8qKlxuICAgICAqIEJhc2Uga2luZCBmb3IgcmVmYWN0b3JpbmcgaW5saW5lIGFjdGlvbnM6ICdyZWZhY3Rvci5pbmxpbmUnXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIGlubGluZSBhY3Rpb25zOlxuICAgICAqXG4gICAgICogLSBJbmxpbmUgZnVuY3Rpb25cbiAgICAgKiAtIElubGluZSB2YXJpYWJsZVxuICAgICAqIC0gSW5saW5lIGNvbnN0YW50XG4gICAgICogLSAuLi5cbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5SZWZhY3RvcklubGluZSA9ICdyZWZhY3Rvci5pbmxpbmUnO1xuICAgIC8qKlxuICAgICAqIEJhc2Uga2luZCBmb3IgcmVmYWN0b3JpbmcgcmV3cml0ZSBhY3Rpb25zOiAncmVmYWN0b3IucmV3cml0ZSdcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgcmV3cml0ZSBhY3Rpb25zOlxuICAgICAqXG4gICAgICogLSBDb252ZXJ0IEphdmFTY3JpcHQgZnVuY3Rpb24gdG8gY2xhc3NcbiAgICAgKiAtIEFkZCBvciByZW1vdmUgcGFyYW1ldGVyXG4gICAgICogLSBFbmNhcHN1bGF0ZSBmaWVsZFxuICAgICAqIC0gTWFrZSBtZXRob2Qgc3RhdGljXG4gICAgICogLSBNb3ZlIG1ldGhvZCB0byBiYXNlIGNsYXNzXG4gICAgICogLSAuLi5cbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5SZWZhY3RvclJld3JpdGUgPSAncmVmYWN0b3IucmV3cml0ZSc7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciBzb3VyY2UgYWN0aW9uczogYHNvdXJjZWBcbiAgICAgKlxuICAgICAqIFNvdXJjZSBjb2RlIGFjdGlvbnMgYXBwbHkgdG8gdGhlIGVudGlyZSBmaWxlLlxuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlNvdXJjZSA9ICdzb3VyY2UnO1xuICAgIC8qKlxuICAgICAqIEJhc2Uga2luZCBmb3IgYW4gb3JnYW5pemUgaW1wb3J0cyBzb3VyY2UgYWN0aW9uOiBgc291cmNlLm9yZ2FuaXplSW1wb3J0c2BcbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5Tb3VyY2VPcmdhbml6ZUltcG9ydHMgPSAnc291cmNlLm9yZ2FuaXplSW1wb3J0cyc7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciBhdXRvLWZpeCBzb3VyY2UgYWN0aW9uczogYHNvdXJjZS5maXhBbGxgLlxuICAgICAqXG4gICAgICogRml4IGFsbCBhY3Rpb25zIGF1dG9tYXRpY2FsbHkgZml4IGVycm9ycyB0aGF0IGhhdmUgYSBjbGVhciBmaXggdGhhdCBkbyBub3QgcmVxdWlyZSB1c2VyIGlucHV0LlxuICAgICAqIFRoZXkgc2hvdWxkIG5vdCBzdXBwcmVzcyBlcnJvcnMgb3IgcGVyZm9ybSB1bnNhZmUgZml4ZXMgc3VjaCBhcyBnZW5lcmF0aW5nIG5ldyB0eXBlcyBvciBjbGFzc2VzLlxuICAgICAqXG4gICAgICogQHNpbmNlIDMuMTUuMFxuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlNvdXJjZUZpeEFsbCA9ICdzb3VyY2UuZml4QWxsJztcbn0pKENvZGVBY3Rpb25LaW5kIHx8IChDb2RlQWN0aW9uS2luZCA9IHt9KSk7XG4vKipcbiAqIFRoZSByZWFzb24gd2h5IGNvZGUgYWN0aW9ucyB3ZXJlIHJlcXVlc3RlZC5cbiAqXG4gKiBAc2luY2UgMy4xNy4wXG4gKi9cbmV4cG9ydCB2YXIgQ29kZUFjdGlvblRyaWdnZXJLaW5kO1xuKGZ1bmN0aW9uIChDb2RlQWN0aW9uVHJpZ2dlcktpbmQpIHtcbiAgICAvKipcbiAgICAgKiBDb2RlIGFjdGlvbnMgd2VyZSBleHBsaWNpdGx5IHJlcXVlc3RlZCBieSB0aGUgdXNlciBvciBieSBhbiBleHRlbnNpb24uXG4gICAgICovXG4gICAgQ29kZUFjdGlvblRyaWdnZXJLaW5kLkludm9rZWQgPSAxO1xuICAgIC8qKlxuICAgICAqIENvZGUgYWN0aW9ucyB3ZXJlIHJlcXVlc3RlZCBhdXRvbWF0aWNhbGx5LlxuICAgICAqXG4gICAgICogVGhpcyB0eXBpY2FsbHkgaGFwcGVucyB3aGVuIGN1cnJlbnQgc2VsZWN0aW9uIGluIGEgZmlsZSBjaGFuZ2VzLCBidXQgY2FuXG4gICAgICogYWxzbyBiZSB0cmlnZ2VyZWQgd2hlbiBmaWxlIGNvbnRlbnQgY2hhbmdlcy5cbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uVHJpZ2dlcktpbmQuQXV0b21hdGljID0gMjtcbn0pKENvZGVBY3Rpb25UcmlnZ2VyS2luZCB8fCAoQ29kZUFjdGlvblRyaWdnZXJLaW5kID0ge30pKTtcbi8qKlxuICogVGhlIENvZGVBY3Rpb25Db250ZXh0IG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIENvZGVBY3Rpb25Db250ZXh0fSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBDb2RlQWN0aW9uQ29udGV4dDtcbihmdW5jdGlvbiAoQ29kZUFjdGlvbkNvbnRleHQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENvZGVBY3Rpb25Db250ZXh0IGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGRpYWdub3N0aWNzLCBvbmx5LCB0cmlnZ2VyS2luZCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0geyBkaWFnbm9zdGljcyB9O1xuICAgICAgICBpZiAob25seSAhPT0gdW5kZWZpbmVkICYmIG9ubHkgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJlc3VsdC5vbmx5ID0gb25seTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJpZ2dlcktpbmQgIT09IHVuZGVmaW5lZCAmJiB0cmlnZ2VyS2luZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmVzdWx0LnRyaWdnZXJLaW5kID0gdHJpZ2dlcktpbmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgQ29kZUFjdGlvbkNvbnRleHQuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgQ29kZUFjdGlvbkNvbnRleHR9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMudHlwZWRBcnJheShjYW5kaWRhdGUuZGlhZ25vc3RpY3MsIERpYWdub3N0aWMuaXMpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLm9ubHkgPT09IHVuZGVmaW5lZCB8fCBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS5vbmx5LCBJcy5zdHJpbmcpKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS50cmlnZ2VyS2luZCA9PT0gdW5kZWZpbmVkIHx8IGNhbmRpZGF0ZS50cmlnZ2VyS2luZCA9PT0gQ29kZUFjdGlvblRyaWdnZXJLaW5kLkludm9rZWQgfHwgY2FuZGlkYXRlLnRyaWdnZXJLaW5kID09PSBDb2RlQWN0aW9uVHJpZ2dlcktpbmQuQXV0b21hdGljKTtcbiAgICB9XG4gICAgQ29kZUFjdGlvbkNvbnRleHQuaXMgPSBpcztcbn0pKENvZGVBY3Rpb25Db250ZXh0IHx8IChDb2RlQWN0aW9uQ29udGV4dCA9IHt9KSk7XG5leHBvcnQgdmFyIENvZGVBY3Rpb247XG4oZnVuY3Rpb24gKENvZGVBY3Rpb24pIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUodGl0bGUsIGtpbmRPckNvbW1hbmRPckVkaXQsIGtpbmQpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHsgdGl0bGUgfTtcbiAgICAgICAgbGV0IGNoZWNrS2luZCA9IHRydWU7XG4gICAgICAgIGlmICh0eXBlb2Yga2luZE9yQ29tbWFuZE9yRWRpdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNoZWNrS2luZCA9IGZhbHNlO1xuICAgICAgICAgICAgcmVzdWx0LmtpbmQgPSBraW5kT3JDb21tYW5kT3JFZGl0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKENvbW1hbmQuaXMoa2luZE9yQ29tbWFuZE9yRWRpdCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5jb21tYW5kID0ga2luZE9yQ29tbWFuZE9yRWRpdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdC5lZGl0ID0ga2luZE9yQ29tbWFuZE9yRWRpdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hlY2tLaW5kICYmIGtpbmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmtpbmQgPSBraW5kO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIENvZGVBY3Rpb24uY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnRpdGxlKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5kaWFnbm9zdGljcyA9PT0gdW5kZWZpbmVkIHx8IElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLmRpYWdub3N0aWNzLCBEaWFnbm9zdGljLmlzKSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUua2luZCA9PT0gdW5kZWZpbmVkIHx8IElzLnN0cmluZyhjYW5kaWRhdGUua2luZCkpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmVkaXQgIT09IHVuZGVmaW5lZCB8fCBjYW5kaWRhdGUuY29tbWFuZCAhPT0gdW5kZWZpbmVkKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5jb21tYW5kID09PSB1bmRlZmluZWQgfHwgQ29tbWFuZC5pcyhjYW5kaWRhdGUuY29tbWFuZCkpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmlzUHJlZmVycmVkID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUuaXNQcmVmZXJyZWQpKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5lZGl0ID09PSB1bmRlZmluZWQgfHwgV29ya3NwYWNlRWRpdC5pcyhjYW5kaWRhdGUuZWRpdCkpO1xuICAgIH1cbiAgICBDb2RlQWN0aW9uLmlzID0gaXM7XG59KShDb2RlQWN0aW9uIHx8IChDb2RlQWN0aW9uID0ge30pKTtcbi8qKlxuICogVGhlIENvZGVMZW5zIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIENvZGVMZW5zfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBDb2RlTGVucztcbihmdW5jdGlvbiAoQ29kZUxlbnMpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENvZGVMZW5zIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCBkYXRhKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IHJhbmdlIH07XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKGRhdGEpKSB7XG4gICAgICAgICAgICByZXN1bHQuZGF0YSA9IGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgQ29kZUxlbnMuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgQ29kZUxlbnN9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5jb21tYW5kKSB8fCBDb21tYW5kLmlzKGNhbmRpZGF0ZS5jb21tYW5kKSk7XG4gICAgfVxuICAgIENvZGVMZW5zLmlzID0gaXM7XG59KShDb2RlTGVucyB8fCAoQ29kZUxlbnMgPSB7fSkpO1xuLyoqXG4gKiBUaGUgRm9ybWF0dGluZ09wdGlvbnMgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgRm9ybWF0dGluZ09wdGlvbnN9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIEZvcm1hdHRpbmdPcHRpb25zO1xuKGZ1bmN0aW9uIChGb3JtYXR0aW5nT3B0aW9ucykge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgRm9ybWF0dGluZ09wdGlvbnMgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodGFiU2l6ZSwgaW5zZXJ0U3BhY2VzKSB7XG4gICAgICAgIHJldHVybiB7IHRhYlNpemUsIGluc2VydFNwYWNlcyB9O1xuICAgIH1cbiAgICBGb3JtYXR0aW5nT3B0aW9ucy5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBGb3JtYXR0aW5nT3B0aW9uc30gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy51aW50ZWdlcihjYW5kaWRhdGUudGFiU2l6ZSkgJiYgSXMuYm9vbGVhbihjYW5kaWRhdGUuaW5zZXJ0U3BhY2VzKTtcbiAgICB9XG4gICAgRm9ybWF0dGluZ09wdGlvbnMuaXMgPSBpcztcbn0pKEZvcm1hdHRpbmdPcHRpb25zIHx8IChGb3JtYXR0aW5nT3B0aW9ucyA9IHt9KSk7XG4vKipcbiAqIFRoZSBEb2N1bWVudExpbmsgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgRG9jdW1lbnRMaW5rfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBEb2N1bWVudExpbms7XG4oZnVuY3Rpb24gKERvY3VtZW50TGluaykge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgRG9jdW1lbnRMaW5rIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCB0YXJnZXQsIGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIHRhcmdldCwgZGF0YSB9O1xuICAgIH1cbiAgICBEb2N1bWVudExpbmsuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgRG9jdW1lbnRMaW5rfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUudGFyZ2V0KSB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLnRhcmdldCkpO1xuICAgIH1cbiAgICBEb2N1bWVudExpbmsuaXMgPSBpcztcbn0pKERvY3VtZW50TGluayB8fCAoRG9jdW1lbnRMaW5rID0ge30pKTtcbi8qKlxuICogVGhlIFNlbGVjdGlvblJhbmdlIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb24gdG8gd29yayB3aXRoXG4gKiBTZWxlY3Rpb25SYW5nZSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBTZWxlY3Rpb25SYW5nZTtcbihmdW5jdGlvbiAoU2VsZWN0aW9uUmFuZ2UpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFNlbGVjdGlvblJhbmdlXG4gICAgICogQHBhcmFtIHJhbmdlIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0gcGFyZW50IGFuIG9wdGlvbmFsIHBhcmVudC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIHBhcmVudCkge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgcGFyZW50IH07XG4gICAgfVxuICAgIFNlbGVjdGlvblJhbmdlLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiAoY2FuZGlkYXRlLnBhcmVudCA9PT0gdW5kZWZpbmVkIHx8IFNlbGVjdGlvblJhbmdlLmlzKGNhbmRpZGF0ZS5wYXJlbnQpKTtcbiAgICB9XG4gICAgU2VsZWN0aW9uUmFuZ2UuaXMgPSBpcztcbn0pKFNlbGVjdGlvblJhbmdlIHx8IChTZWxlY3Rpb25SYW5nZSA9IHt9KSk7XG4vKipcbiAqIEEgc2V0IG9mIHByZWRlZmluZWQgdG9rZW4gdHlwZXMuIFRoaXMgc2V0IGlzIG5vdCBmaXhlZFxuICogYW4gY2xpZW50cyBjYW4gc3BlY2lmeSBhZGRpdGlvbmFsIHRva2VuIHR5cGVzIHZpYSB0aGVcbiAqIGNvcnJlc3BvbmRpbmcgY2xpZW50IGNhcGFiaWxpdGllcy5cbiAqXG4gKiBAc2luY2UgMy4xNi4wXG4gKi9cbmV4cG9ydCB2YXIgU2VtYW50aWNUb2tlblR5cGVzO1xuKGZ1bmN0aW9uIChTZW1hbnRpY1Rva2VuVHlwZXMpIHtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJuYW1lc3BhY2VcIl0gPSBcIm5hbWVzcGFjZVwiO1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBnZW5lcmljIHR5cGUuIEFjdHMgYXMgYSBmYWxsYmFjayBmb3IgdHlwZXMgd2hpY2ggY2FuJ3QgYmUgbWFwcGVkIHRvXG4gICAgICogYSBzcGVjaWZpYyB0eXBlIGxpa2UgY2xhc3Mgb3IgZW51bS5cbiAgICAgKi9cbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJ0eXBlXCJdID0gXCJ0eXBlXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wiY2xhc3NcIl0gPSBcImNsYXNzXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wiZW51bVwiXSA9IFwiZW51bVwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImludGVyZmFjZVwiXSA9IFwiaW50ZXJmYWNlXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wic3RydWN0XCJdID0gXCJzdHJ1Y3RcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJ0eXBlUGFyYW1ldGVyXCJdID0gXCJ0eXBlUGFyYW1ldGVyXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wicGFyYW1ldGVyXCJdID0gXCJwYXJhbWV0ZXJcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJ2YXJpYWJsZVwiXSA9IFwidmFyaWFibGVcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJwcm9wZXJ0eVwiXSA9IFwicHJvcGVydHlcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJlbnVtTWVtYmVyXCJdID0gXCJlbnVtTWVtYmVyXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wiZXZlbnRcIl0gPSBcImV2ZW50XCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wiZnVuY3Rpb25cIl0gPSBcImZ1bmN0aW9uXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wibWV0aG9kXCJdID0gXCJtZXRob2RcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJtYWNyb1wiXSA9IFwibWFjcm9cIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJrZXl3b3JkXCJdID0gXCJrZXl3b3JkXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wibW9kaWZpZXJcIl0gPSBcIm1vZGlmaWVyXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wiY29tbWVudFwiXSA9IFwiY29tbWVudFwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInN0cmluZ1wiXSA9IFwic3RyaW5nXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wibnVtYmVyXCJdID0gXCJudW1iZXJcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJyZWdleHBcIl0gPSBcInJlZ2V4cFwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcIm9wZXJhdG9yXCJdID0gXCJvcGVyYXRvclwiO1xuICAgIC8qKlxuICAgICAqIEBzaW5jZSAzLjE3LjBcbiAgICAgKi9cbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJkZWNvcmF0b3JcIl0gPSBcImRlY29yYXRvclwiO1xufSkoU2VtYW50aWNUb2tlblR5cGVzIHx8IChTZW1hbnRpY1Rva2VuVHlwZXMgPSB7fSkpO1xuLyoqXG4gKiBBIHNldCBvZiBwcmVkZWZpbmVkIHRva2VuIG1vZGlmaWVycy4gVGhpcyBzZXQgaXMgbm90IGZpeGVkXG4gKiBhbiBjbGllbnRzIGNhbiBzcGVjaWZ5IGFkZGl0aW9uYWwgdG9rZW4gdHlwZXMgdmlhIHRoZVxuICogY29ycmVzcG9uZGluZyBjbGllbnQgY2FwYWJpbGl0aWVzLlxuICpcbiAqIEBzaW5jZSAzLjE2LjBcbiAqL1xuZXhwb3J0IHZhciBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzO1xuKGZ1bmN0aW9uIChTZW1hbnRpY1Rva2VuTW9kaWZpZXJzKSB7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcImRlY2xhcmF0aW9uXCJdID0gXCJkZWNsYXJhdGlvblwiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJkZWZpbml0aW9uXCJdID0gXCJkZWZpbml0aW9uXCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcInJlYWRvbmx5XCJdID0gXCJyZWFkb25seVwiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJzdGF0aWNcIl0gPSBcInN0YXRpY1wiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJkZXByZWNhdGVkXCJdID0gXCJkZXByZWNhdGVkXCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcImFic3RyYWN0XCJdID0gXCJhYnN0cmFjdFwiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJhc3luY1wiXSA9IFwiYXN5bmNcIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wibW9kaWZpY2F0aW9uXCJdID0gXCJtb2RpZmljYXRpb25cIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wiZG9jdW1lbnRhdGlvblwiXSA9IFwiZG9jdW1lbnRhdGlvblwiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJkZWZhdWx0TGlicmFyeVwiXSA9IFwiZGVmYXVsdExpYnJhcnlcIjtcbn0pKFNlbWFudGljVG9rZW5Nb2RpZmllcnMgfHwgKFNlbWFudGljVG9rZW5Nb2RpZmllcnMgPSB7fSkpO1xuLyoqXG4gKiBAc2luY2UgMy4xNi4wXG4gKi9cbmV4cG9ydCB2YXIgU2VtYW50aWNUb2tlbnM7XG4oZnVuY3Rpb24gKFNlbWFudGljVG9rZW5zKSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgKGNhbmRpZGF0ZS5yZXN1bHRJZCA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBjYW5kaWRhdGUucmVzdWx0SWQgPT09ICdzdHJpbmcnKSAmJlxuICAgICAgICAgICAgQXJyYXkuaXNBcnJheShjYW5kaWRhdGUuZGF0YSkgJiYgKGNhbmRpZGF0ZS5kYXRhLmxlbmd0aCA9PT0gMCB8fCB0eXBlb2YgY2FuZGlkYXRlLmRhdGFbMF0gPT09ICdudW1iZXInKTtcbiAgICB9XG4gICAgU2VtYW50aWNUb2tlbnMuaXMgPSBpcztcbn0pKFNlbWFudGljVG9rZW5zIHx8IChTZW1hbnRpY1Rva2VucyA9IHt9KSk7XG4vKipcbiAqIFRoZSBJbmxpbmVWYWx1ZVRleHQgbmFtZXNwYWNlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGggSW5saW5lVmFsdWVUZXh0cy5cbiAqXG4gKiBAc2luY2UgMy4xNy4wXG4gKi9cbmV4cG9ydCB2YXIgSW5saW5lVmFsdWVUZXh0O1xuKGZ1bmN0aW9uIChJbmxpbmVWYWx1ZVRleHQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IElubGluZVZhbHVlVGV4dCBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgdGV4dCkge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgdGV4dCB9O1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZVRleHQuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICE9PSB1bmRlZmluZWQgJiYgY2FuZGlkYXRlICE9PSBudWxsICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS50ZXh0KTtcbiAgICB9XG4gICAgSW5saW5lVmFsdWVUZXh0LmlzID0gaXM7XG59KShJbmxpbmVWYWx1ZVRleHQgfHwgKElubGluZVZhbHVlVGV4dCA9IHt9KSk7XG4vKipcbiAqIFRoZSBJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwIG5hbWVzcGFjZSBwcm92aWRlcyBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIElubGluZVZhbHVlVmFyaWFibGVMb29rdXBzLlxuICpcbiAqIEBzaW5jZSAzLjE3LjBcbiAqL1xuZXhwb3J0IHZhciBJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwO1xuKGZ1bmN0aW9uIChJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBJbmxpbmVWYWx1ZVRleHQgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIHZhcmlhYmxlTmFtZSwgY2FzZVNlbnNpdGl2ZUxvb2t1cCkge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgdmFyaWFibGVOYW1lLCBjYXNlU2Vuc2l0aXZlTG9va3VwIH07XG4gICAgfVxuICAgIElubGluZVZhbHVlVmFyaWFibGVMb29rdXAuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICE9PSB1bmRlZmluZWQgJiYgY2FuZGlkYXRlICE9PSBudWxsICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgSXMuYm9vbGVhbihjYW5kaWRhdGUuY2FzZVNlbnNpdGl2ZUxvb2t1cClcbiAgICAgICAgICAgICYmIChJcy5zdHJpbmcoY2FuZGlkYXRlLnZhcmlhYmxlTmFtZSkgfHwgY2FuZGlkYXRlLnZhcmlhYmxlTmFtZSA9PT0gdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cC5pcyA9IGlzO1xufSkoSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cCB8fCAoSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cCA9IHt9KSk7XG4vKipcbiAqIFRoZSBJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbiBuYW1lc3BhY2UgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCBJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbi5cbiAqXG4gKiBAc2luY2UgMy4xNy4wXG4gKi9cbmV4cG9ydCB2YXIgSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb247XG4oZnVuY3Rpb24gKElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbiBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgZXhwcmVzc2lvbikge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgZXhwcmVzc2lvbiB9O1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgIT09IHVuZGVmaW5lZCAmJiBjYW5kaWRhdGUgIT09IG51bGwgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKVxuICAgICAgICAgICAgJiYgKElzLnN0cmluZyhjYW5kaWRhdGUuZXhwcmVzc2lvbikgfHwgY2FuZGlkYXRlLmV4cHJlc3Npb24gPT09IHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uLmlzID0gaXM7XG59KShJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbiB8fCAoSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24gPSB7fSkpO1xuLyoqXG4gKiBUaGUgSW5saW5lVmFsdWVDb250ZXh0IG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIElubGluZVZhbHVlQ29udGV4dH0gbGl0ZXJhbHMuXG4gKlxuICogQHNpbmNlIDMuMTcuMFxuICovXG5leHBvcnQgdmFyIElubGluZVZhbHVlQ29udGV4dDtcbihmdW5jdGlvbiAoSW5saW5lVmFsdWVDb250ZXh0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBJbmxpbmVWYWx1ZUNvbnRleHQgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUoZnJhbWVJZCwgc3RvcHBlZExvY2F0aW9uKSB7XG4gICAgICAgIHJldHVybiB7IGZyYW1lSWQsIHN0b3BwZWRMb2NhdGlvbiB9O1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZUNvbnRleHQuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgSW5saW5lVmFsdWVDb250ZXh0fSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgUmFuZ2UuaXModmFsdWUuc3RvcHBlZExvY2F0aW9uKTtcbiAgICB9XG4gICAgSW5saW5lVmFsdWVDb250ZXh0LmlzID0gaXM7XG59KShJbmxpbmVWYWx1ZUNvbnRleHQgfHwgKElubGluZVZhbHVlQ29udGV4dCA9IHt9KSk7XG4vKipcbiAqIElubGF5IGhpbnQga2luZHMuXG4gKlxuICogQHNpbmNlIDMuMTcuMFxuICovXG5leHBvcnQgdmFyIElubGF5SGludEtpbmQ7XG4oZnVuY3Rpb24gKElubGF5SGludEtpbmQpIHtcbiAgICAvKipcbiAgICAgKiBBbiBpbmxheSBoaW50IHRoYXQgZm9yIGEgdHlwZSBhbm5vdGF0aW9uLlxuICAgICAqL1xuICAgIElubGF5SGludEtpbmQuVHlwZSA9IDE7XG4gICAgLyoqXG4gICAgICogQW4gaW5sYXkgaGludCB0aGF0IGlzIGZvciBhIHBhcmFtZXRlci5cbiAgICAgKi9cbiAgICBJbmxheUhpbnRLaW5kLlBhcmFtZXRlciA9IDI7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSAxIHx8IHZhbHVlID09PSAyO1xuICAgIH1cbiAgICBJbmxheUhpbnRLaW5kLmlzID0gaXM7XG59KShJbmxheUhpbnRLaW5kIHx8IChJbmxheUhpbnRLaW5kID0ge30pKTtcbmV4cG9ydCB2YXIgSW5sYXlIaW50TGFiZWxQYXJ0O1xuKGZ1bmN0aW9uIChJbmxheUhpbnRMYWJlbFBhcnQpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHsgdmFsdWUgfTtcbiAgICB9XG4gICAgSW5sYXlIaW50TGFiZWxQYXJ0LmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS50b29sdGlwID09PSB1bmRlZmluZWQgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS50b29sdGlwKSB8fCBNYXJrdXBDb250ZW50LmlzKGNhbmRpZGF0ZS50b29sdGlwKSlcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUubG9jYXRpb24gPT09IHVuZGVmaW5lZCB8fCBMb2NhdGlvbi5pcyhjYW5kaWRhdGUubG9jYXRpb24pKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS5jb21tYW5kID09PSB1bmRlZmluZWQgfHwgQ29tbWFuZC5pcyhjYW5kaWRhdGUuY29tbWFuZCkpO1xuICAgIH1cbiAgICBJbmxheUhpbnRMYWJlbFBhcnQuaXMgPSBpcztcbn0pKElubGF5SGludExhYmVsUGFydCB8fCAoSW5sYXlIaW50TGFiZWxQYXJ0ID0ge30pKTtcbmV4cG9ydCB2YXIgSW5sYXlIaW50O1xuKGZ1bmN0aW9uIChJbmxheUhpbnQpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUocG9zaXRpb24sIGxhYmVsLCBraW5kKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHsgcG9zaXRpb24sIGxhYmVsIH07XG4gICAgICAgIGlmIChraW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5raW5kID0ga2luZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBJbmxheUhpbnQuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIFBvc2l0aW9uLmlzKGNhbmRpZGF0ZS5wb3NpdGlvbilcbiAgICAgICAgICAgICYmIChJcy5zdHJpbmcoY2FuZGlkYXRlLmxhYmVsKSB8fCBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS5sYWJlbCwgSW5sYXlIaW50TGFiZWxQYXJ0LmlzKSlcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUua2luZCA9PT0gdW5kZWZpbmVkIHx8IElubGF5SGludEtpbmQuaXMoY2FuZGlkYXRlLmtpbmQpKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS50ZXh0RWRpdHMgPT09IHVuZGVmaW5lZCkgfHwgSXMudHlwZWRBcnJheShjYW5kaWRhdGUudGV4dEVkaXRzLCBUZXh0RWRpdC5pcylcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUudG9vbHRpcCA9PT0gdW5kZWZpbmVkIHx8IElzLnN0cmluZyhjYW5kaWRhdGUudG9vbHRpcCkgfHwgTWFya3VwQ29udGVudC5pcyhjYW5kaWRhdGUudG9vbHRpcCkpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLnBhZGRpbmdMZWZ0ID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUucGFkZGluZ0xlZnQpKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS5wYWRkaW5nUmlnaHQgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5wYWRkaW5nUmlnaHQpKTtcbiAgICB9XG4gICAgSW5sYXlIaW50LmlzID0gaXM7XG59KShJbmxheUhpbnQgfHwgKElubGF5SGludCA9IHt9KSk7XG5leHBvcnQgdmFyIFN0cmluZ1ZhbHVlO1xuKGZ1bmN0aW9uIChTdHJpbmdWYWx1ZSkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVNuaXBwZXQodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHsga2luZDogJ3NuaXBwZXQnLCB2YWx1ZSB9O1xuICAgIH1cbiAgICBTdHJpbmdWYWx1ZS5jcmVhdGVTbmlwcGV0ID0gY3JlYXRlU25pcHBldDtcbn0pKFN0cmluZ1ZhbHVlIHx8IChTdHJpbmdWYWx1ZSA9IHt9KSk7XG5leHBvcnQgdmFyIElubGluZUNvbXBsZXRpb25JdGVtO1xuKGZ1bmN0aW9uIChJbmxpbmVDb21wbGV0aW9uSXRlbSkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShpbnNlcnRUZXh0LCBmaWx0ZXJUZXh0LCByYW5nZSwgY29tbWFuZCkge1xuICAgICAgICByZXR1cm4geyBpbnNlcnRUZXh0LCBmaWx0ZXJUZXh0LCByYW5nZSwgY29tbWFuZCB9O1xuICAgIH1cbiAgICBJbmxpbmVDb21wbGV0aW9uSXRlbS5jcmVhdGUgPSBjcmVhdGU7XG59KShJbmxpbmVDb21wbGV0aW9uSXRlbSB8fCAoSW5saW5lQ29tcGxldGlvbkl0ZW0gPSB7fSkpO1xuZXhwb3J0IHZhciBJbmxpbmVDb21wbGV0aW9uTGlzdDtcbihmdW5jdGlvbiAoSW5saW5lQ29tcGxldGlvbkxpc3QpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUoaXRlbXMpIHtcbiAgICAgICAgcmV0dXJuIHsgaXRlbXMgfTtcbiAgICB9XG4gICAgSW5saW5lQ29tcGxldGlvbkxpc3QuY3JlYXRlID0gY3JlYXRlO1xufSkoSW5saW5lQ29tcGxldGlvbkxpc3QgfHwgKElubGluZUNvbXBsZXRpb25MaXN0ID0ge30pKTtcbi8qKlxuICogRGVzY3JpYmVzIGhvdyBhbiB7QGxpbmsgSW5saW5lQ29tcGxldGlvbkl0ZW1Qcm92aWRlciBpbmxpbmUgY29tcGxldGlvbiBwcm92aWRlcn0gd2FzIHRyaWdnZXJlZC5cbiAqXG4gKiBAc2luY2UgMy4xOC4wXG4gKiBAcHJvcG9zZWRcbiAqL1xuZXhwb3J0IHZhciBJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmQ7XG4oZnVuY3Rpb24gKElubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZCkge1xuICAgIC8qKlxuICAgICAqIENvbXBsZXRpb24gd2FzIHRyaWdnZXJlZCBleHBsaWNpdGx5IGJ5IGEgdXNlciBnZXN0dXJlLlxuICAgICAqL1xuICAgIElubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZC5JbnZva2VkID0gMDtcbiAgICAvKipcbiAgICAgKiBDb21wbGV0aW9uIHdhcyB0cmlnZ2VyZWQgYXV0b21hdGljYWxseSB3aGlsZSBlZGl0aW5nLlxuICAgICAqL1xuICAgIElubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZC5BdXRvbWF0aWMgPSAxO1xufSkoSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kIHx8IChJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmQgPSB7fSkpO1xuZXhwb3J0IHZhciBTZWxlY3RlZENvbXBsZXRpb25JbmZvO1xuKGZ1bmN0aW9uIChTZWxlY3RlZENvbXBsZXRpb25JbmZvKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCB0ZXh0KSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCB0ZXh0IH07XG4gICAgfVxuICAgIFNlbGVjdGVkQ29tcGxldGlvbkluZm8uY3JlYXRlID0gY3JlYXRlO1xufSkoU2VsZWN0ZWRDb21wbGV0aW9uSW5mbyB8fCAoU2VsZWN0ZWRDb21wbGV0aW9uSW5mbyA9IHt9KSk7XG5leHBvcnQgdmFyIElubGluZUNvbXBsZXRpb25Db250ZXh0O1xuKGZ1bmN0aW9uIChJbmxpbmVDb21wbGV0aW9uQ29udGV4dCkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh0cmlnZ2VyS2luZCwgc2VsZWN0ZWRDb21wbGV0aW9uSW5mbykge1xuICAgICAgICByZXR1cm4geyB0cmlnZ2VyS2luZCwgc2VsZWN0ZWRDb21wbGV0aW9uSW5mbyB9O1xuICAgIH1cbiAgICBJbmxpbmVDb21wbGV0aW9uQ29udGV4dC5jcmVhdGUgPSBjcmVhdGU7XG59KShJbmxpbmVDb21wbGV0aW9uQ29udGV4dCB8fCAoSW5saW5lQ29tcGxldGlvbkNvbnRleHQgPSB7fSkpO1xuZXhwb3J0IHZhciBXb3Jrc3BhY2VGb2xkZXI7XG4oZnVuY3Rpb24gKFdvcmtzcGFjZUZvbGRlcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIFVSSS5pcyhjYW5kaWRhdGUudXJpKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLm5hbWUpO1xuICAgIH1cbiAgICBXb3Jrc3BhY2VGb2xkZXIuaXMgPSBpcztcbn0pKFdvcmtzcGFjZUZvbGRlciB8fCAoV29ya3NwYWNlRm9sZGVyID0ge30pKTtcbmV4cG9ydCBjb25zdCBFT0wgPSBbJ1xcbicsICdcXHJcXG4nLCAnXFxyJ107XG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSB0aGUgdGV4dCBkb2N1bWVudCBmcm9tIHRoZSBuZXcgdnNjb2RlLWxhbmd1YWdlc2VydmVyLXRleHRkb2N1bWVudCBwYWNrYWdlLlxuICovXG5leHBvcnQgdmFyIFRleHREb2N1bWVudDtcbihmdW5jdGlvbiAoVGV4dERvY3VtZW50KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBJVGV4dERvY3VtZW50IGxpdGVyYWwgZnJvbSB0aGUgZ2l2ZW4gdXJpIGFuZCBjb250ZW50LlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIGRvY3VtZW50J3MgdXJpLlxuICAgICAqIEBwYXJhbSBsYW5ndWFnZUlkIFRoZSBkb2N1bWVudCdzIGxhbmd1YWdlIElkLlxuICAgICAqIEBwYXJhbSB2ZXJzaW9uIFRoZSBkb2N1bWVudCdzIHZlcnNpb24uXG4gICAgICogQHBhcmFtIGNvbnRlbnQgVGhlIGRvY3VtZW50J3MgY29udGVudC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodXJpLCBsYW5ndWFnZUlkLCB2ZXJzaW9uLCBjb250ZW50KSB7XG4gICAgICAgIHJldHVybiBuZXcgRnVsbFRleHREb2N1bWVudCh1cmksIGxhbmd1YWdlSWQsIHZlcnNpb24sIGNvbnRlbnQpO1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnQuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgSVRleHREb2N1bWVudH0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSkgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUubGFuZ3VhZ2VJZCkgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS5sYW5ndWFnZUlkKSkgJiYgSXMudWludGVnZXIoY2FuZGlkYXRlLmxpbmVDb3VudClcbiAgICAgICAgICAgICYmIElzLmZ1bmMoY2FuZGlkYXRlLmdldFRleHQpICYmIElzLmZ1bmMoY2FuZGlkYXRlLnBvc2l0aW9uQXQpICYmIElzLmZ1bmMoY2FuZGlkYXRlLm9mZnNldEF0KSA/IHRydWUgOiBmYWxzZTtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50LmlzID0gaXM7XG4gICAgZnVuY3Rpb24gYXBwbHlFZGl0cyhkb2N1bWVudCwgZWRpdHMpIHtcbiAgICAgICAgbGV0IHRleHQgPSBkb2N1bWVudC5nZXRUZXh0KCk7XG4gICAgICAgIGxldCBzb3J0ZWRFZGl0cyA9IG1lcmdlU29ydChlZGl0cywgKGEsIGIpID0+IHtcbiAgICAgICAgICAgIGxldCBkaWZmID0gYS5yYW5nZS5zdGFydC5saW5lIC0gYi5yYW5nZS5zdGFydC5saW5lO1xuICAgICAgICAgICAgaWYgKGRpZmYgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYS5yYW5nZS5zdGFydC5jaGFyYWN0ZXIgLSBiLnJhbmdlLnN0YXJ0LmNoYXJhY3RlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBkaWZmO1xuICAgICAgICB9KTtcbiAgICAgICAgbGV0IGxhc3RNb2RpZmllZE9mZnNldCA9IHRleHQubGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBpID0gc29ydGVkRWRpdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGxldCBlID0gc29ydGVkRWRpdHNbaV07XG4gICAgICAgICAgICBsZXQgc3RhcnRPZmZzZXQgPSBkb2N1bWVudC5vZmZzZXRBdChlLnJhbmdlLnN0YXJ0KTtcbiAgICAgICAgICAgIGxldCBlbmRPZmZzZXQgPSBkb2N1bWVudC5vZmZzZXRBdChlLnJhbmdlLmVuZCk7XG4gICAgICAgICAgICBpZiAoZW5kT2Zmc2V0IDw9IGxhc3RNb2RpZmllZE9mZnNldCkge1xuICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cmluZygwLCBzdGFydE9mZnNldCkgKyBlLm5ld1RleHQgKyB0ZXh0LnN1YnN0cmluZyhlbmRPZmZzZXQsIHRleHQubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignT3ZlcmxhcHBpbmcgZWRpdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkT2Zmc2V0ID0gc3RhcnRPZmZzZXQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuICAgIFRleHREb2N1bWVudC5hcHBseUVkaXRzID0gYXBwbHlFZGl0cztcbiAgICBmdW5jdGlvbiBtZXJnZVNvcnQoZGF0YSwgY29tcGFyZSkge1xuICAgICAgICBpZiAoZGF0YS5sZW5ndGggPD0gMSkge1xuICAgICAgICAgICAgLy8gc29ydGVkXG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwID0gKGRhdGEubGVuZ3RoIC8gMikgfCAwO1xuICAgICAgICBjb25zdCBsZWZ0ID0gZGF0YS5zbGljZSgwLCBwKTtcbiAgICAgICAgY29uc3QgcmlnaHQgPSBkYXRhLnNsaWNlKHApO1xuICAgICAgICBtZXJnZVNvcnQobGVmdCwgY29tcGFyZSk7XG4gICAgICAgIG1lcmdlU29ydChyaWdodCwgY29tcGFyZSk7XG4gICAgICAgIGxldCBsZWZ0SWR4ID0gMDtcbiAgICAgICAgbGV0IHJpZ2h0SWR4ID0gMDtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICB3aGlsZSAobGVmdElkeCA8IGxlZnQubGVuZ3RoICYmIHJpZ2h0SWR4IDwgcmlnaHQubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgcmV0ID0gY29tcGFyZShsZWZ0W2xlZnRJZHhdLCByaWdodFtyaWdodElkeF0pO1xuICAgICAgICAgICAgaWYgKHJldCA8PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gc21hbGxlcl9lcXVhbCAtPiB0YWtlIGxlZnQgdG8gcHJlc2VydmUgb3JkZXJcbiAgICAgICAgICAgICAgICBkYXRhW2krK10gPSBsZWZ0W2xlZnRJZHgrK107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBncmVhdGVyIC0+IHRha2UgcmlnaHRcbiAgICAgICAgICAgICAgICBkYXRhW2krK10gPSByaWdodFtyaWdodElkeCsrXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAobGVmdElkeCA8IGxlZnQubGVuZ3RoKSB7XG4gICAgICAgICAgICBkYXRhW2krK10gPSBsZWZ0W2xlZnRJZHgrK107XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKHJpZ2h0SWR4IDwgcmlnaHQubGVuZ3RoKSB7XG4gICAgICAgICAgICBkYXRhW2krK10gPSByaWdodFtyaWdodElkeCsrXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG59KShUZXh0RG9jdW1lbnQgfHwgKFRleHREb2N1bWVudCA9IHt9KSk7XG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSB0aGUgdGV4dCBkb2N1bWVudCBmcm9tIHRoZSBuZXcgdnNjb2RlLWxhbmd1YWdlc2VydmVyLXRleHRkb2N1bWVudCBwYWNrYWdlLlxuICovXG5jbGFzcyBGdWxsVGV4dERvY3VtZW50IHtcbiAgICBjb25zdHJ1Y3Rvcih1cmksIGxhbmd1YWdlSWQsIHZlcnNpb24sIGNvbnRlbnQpIHtcbiAgICAgICAgdGhpcy5fdXJpID0gdXJpO1xuICAgICAgICB0aGlzLl9sYW5ndWFnZUlkID0gbGFuZ3VhZ2VJZDtcbiAgICAgICAgdGhpcy5fdmVyc2lvbiA9IHZlcnNpb247XG4gICAgICAgIHRoaXMuX2NvbnRlbnQgPSBjb250ZW50O1xuICAgICAgICB0aGlzLl9saW5lT2Zmc2V0cyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZ2V0IHVyaSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VyaTtcbiAgICB9XG4gICAgZ2V0IGxhbmd1YWdlSWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sYW5ndWFnZUlkO1xuICAgIH1cbiAgICBnZXQgdmVyc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZlcnNpb247XG4gICAgfVxuICAgIGdldFRleHQocmFuZ2UpIHtcbiAgICAgICAgaWYgKHJhbmdlKSB7XG4gICAgICAgICAgICBsZXQgc3RhcnQgPSB0aGlzLm9mZnNldEF0KHJhbmdlLnN0YXJ0KTtcbiAgICAgICAgICAgIGxldCBlbmQgPSB0aGlzLm9mZnNldEF0KHJhbmdlLmVuZCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY29udGVudC5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRlbnQ7XG4gICAgfVxuICAgIHVwZGF0ZShldmVudCwgdmVyc2lvbikge1xuICAgICAgICB0aGlzLl9jb250ZW50ID0gZXZlbnQudGV4dDtcbiAgICAgICAgdGhpcy5fdmVyc2lvbiA9IHZlcnNpb247XG4gICAgICAgIHRoaXMuX2xpbmVPZmZzZXRzID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBnZXRMaW5lT2Zmc2V0cygpIHtcbiAgICAgICAgaWYgKHRoaXMuX2xpbmVPZmZzZXRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxldCBsaW5lT2Zmc2V0cyA9IFtdO1xuICAgICAgICAgICAgbGV0IHRleHQgPSB0aGlzLl9jb250ZW50O1xuICAgICAgICAgICAgbGV0IGlzTGluZVN0YXJ0ID0gdHJ1ZTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChpc0xpbmVTdGFydCkge1xuICAgICAgICAgICAgICAgICAgICBsaW5lT2Zmc2V0cy5wdXNoKGkpO1xuICAgICAgICAgICAgICAgICAgICBpc0xpbmVTdGFydCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgY2ggPSB0ZXh0LmNoYXJBdChpKTtcbiAgICAgICAgICAgICAgICBpc0xpbmVTdGFydCA9IChjaCA9PT0gJ1xccicgfHwgY2ggPT09ICdcXG4nKTtcbiAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICdcXHInICYmIGkgKyAxIDwgdGV4dC5sZW5ndGggJiYgdGV4dC5jaGFyQXQoaSArIDEpID09PSAnXFxuJykge1xuICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzTGluZVN0YXJ0ICYmIHRleHQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxpbmVPZmZzZXRzLnB1c2godGV4dC5sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fbGluZU9mZnNldHMgPSBsaW5lT2Zmc2V0cztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fbGluZU9mZnNldHM7XG4gICAgfVxuICAgIHBvc2l0aW9uQXQob2Zmc2V0KSB7XG4gICAgICAgIG9mZnNldCA9IE1hdGgubWF4KE1hdGgubWluKG9mZnNldCwgdGhpcy5fY29udGVudC5sZW5ndGgpLCAwKTtcbiAgICAgICAgbGV0IGxpbmVPZmZzZXRzID0gdGhpcy5nZXRMaW5lT2Zmc2V0cygpO1xuICAgICAgICBsZXQgbG93ID0gMCwgaGlnaCA9IGxpbmVPZmZzZXRzLmxlbmd0aDtcbiAgICAgICAgaWYgKGhpZ2ggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBQb3NpdGlvbi5jcmVhdGUoMCwgb2Zmc2V0KTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAobG93IDwgaGlnaCkge1xuICAgICAgICAgICAgbGV0IG1pZCA9IE1hdGguZmxvb3IoKGxvdyArIGhpZ2gpIC8gMik7XG4gICAgICAgICAgICBpZiAobGluZU9mZnNldHNbbWlkXSA+IG9mZnNldCkge1xuICAgICAgICAgICAgICAgIGhpZ2ggPSBtaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsb3cgPSBtaWQgKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGxvdyBpcyB0aGUgbGVhc3QgeCBmb3Igd2hpY2ggdGhlIGxpbmUgb2Zmc2V0IGlzIGxhcmdlciB0aGFuIHRoZSBjdXJyZW50IG9mZnNldFxuICAgICAgICAvLyBvciBhcnJheS5sZW5ndGggaWYgbm8gbGluZSBvZmZzZXQgaXMgbGFyZ2VyIHRoYW4gdGhlIGN1cnJlbnQgb2Zmc2V0XG4gICAgICAgIGxldCBsaW5lID0gbG93IC0gMTtcbiAgICAgICAgcmV0dXJuIFBvc2l0aW9uLmNyZWF0ZShsaW5lLCBvZmZzZXQgLSBsaW5lT2Zmc2V0c1tsaW5lXSk7XG4gICAgfVxuICAgIG9mZnNldEF0KHBvc2l0aW9uKSB7XG4gICAgICAgIGxldCBsaW5lT2Zmc2V0cyA9IHRoaXMuZ2V0TGluZU9mZnNldHMoKTtcbiAgICAgICAgaWYgKHBvc2l0aW9uLmxpbmUgPj0gbGluZU9mZnNldHMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY29udGVudC5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocG9zaXRpb24ubGluZSA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIGxldCBsaW5lT2Zmc2V0ID0gbGluZU9mZnNldHNbcG9zaXRpb24ubGluZV07XG4gICAgICAgIGxldCBuZXh0TGluZU9mZnNldCA9IChwb3NpdGlvbi5saW5lICsgMSA8IGxpbmVPZmZzZXRzLmxlbmd0aCkgPyBsaW5lT2Zmc2V0c1twb3NpdGlvbi5saW5lICsgMV0gOiB0aGlzLl9jb250ZW50Lmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KE1hdGgubWluKGxpbmVPZmZzZXQgKyBwb3NpdGlvbi5jaGFyYWN0ZXIsIG5leHRMaW5lT2Zmc2V0KSwgbGluZU9mZnNldCk7XG4gICAgfVxuICAgIGdldCBsaW5lQ291bnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldExpbmVPZmZzZXRzKCkubGVuZ3RoO1xuICAgIH1cbn1cbnZhciBJcztcbihmdW5jdGlvbiAoSXMpIHtcbiAgICBjb25zdCB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG4gICAgZnVuY3Rpb24gZGVmaW5lZCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJztcbiAgICB9XG4gICAgSXMuZGVmaW5lZCA9IGRlZmluZWQ7XG4gICAgZnVuY3Rpb24gdW5kZWZpbmVkKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnO1xuICAgIH1cbiAgICBJcy51bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgZnVuY3Rpb24gYm9vbGVhbih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWUgPT09IHRydWUgfHwgdmFsdWUgPT09IGZhbHNlO1xuICAgIH1cbiAgICBJcy5ib29sZWFuID0gYm9vbGVhbjtcbiAgICBmdW5jdGlvbiBzdHJpbmcodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBTdHJpbmddJztcbiAgICB9XG4gICAgSXMuc3RyaW5nID0gc3RyaW5nO1xuICAgIGZ1bmN0aW9uIG51bWJlcih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IE51bWJlcl0nO1xuICAgIH1cbiAgICBJcy5udW1iZXIgPSBudW1iZXI7XG4gICAgZnVuY3Rpb24gbnVtYmVyUmFuZ2UodmFsdWUsIG1pbiwgbWF4KSB7XG4gICAgICAgIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgTnVtYmVyXScgJiYgbWluIDw9IHZhbHVlICYmIHZhbHVlIDw9IG1heDtcbiAgICB9XG4gICAgSXMubnVtYmVyUmFuZ2UgPSBudW1iZXJSYW5nZTtcbiAgICBmdW5jdGlvbiBpbnRlZ2VyKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgTnVtYmVyXScgJiYgLTIxNDc0ODM2NDggPD0gdmFsdWUgJiYgdmFsdWUgPD0gMjE0NzQ4MzY0NztcbiAgICB9XG4gICAgSXMuaW50ZWdlciA9IGludGVnZXI7XG4gICAgZnVuY3Rpb24gdWludGVnZXIodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBOdW1iZXJdJyAmJiAwIDw9IHZhbHVlICYmIHZhbHVlIDw9IDIxNDc0ODM2NDc7XG4gICAgfVxuICAgIElzLnVpbnRlZ2VyID0gdWludGVnZXI7XG4gICAgZnVuY3Rpb24gZnVuYyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG4gICAgfVxuICAgIElzLmZ1bmMgPSBmdW5jO1xuICAgIGZ1bmN0aW9uIG9iamVjdExpdGVyYWwodmFsdWUpIHtcbiAgICAgICAgLy8gU3RyaWN0bHkgc3BlYWtpbmcgY2xhc3MgaW5zdGFuY2VzIHBhc3MgdGhpcyBjaGVjayBhcyB3ZWxsLiBTaW5jZSB0aGUgTFNQXG4gICAgICAgIC8vIGRvZXNuJ3QgdXNlIGNsYXNzZXMgd2UgaWdub3JlIHRoaXMgZm9yIG5vdy4gSWYgd2UgZG8gd2UgbmVlZCB0byBhZGQgc29tZXRoaW5nXG4gICAgICAgIC8vIGxpa2UgdGhpczogYE9iamVjdC5nZXRQcm90b3R5cGVPZihPYmplY3QuZ2V0UHJvdG90eXBlT2YoeCkpID09PSBudWxsYFxuICAgICAgICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JztcbiAgICB9XG4gICAgSXMub2JqZWN0TGl0ZXJhbCA9IG9iamVjdExpdGVyYWw7XG4gICAgZnVuY3Rpb24gdHlwZWRBcnJheSh2YWx1ZSwgY2hlY2spIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmV2ZXJ5KGNoZWNrKTtcbiAgICB9XG4gICAgSXMudHlwZWRBcnJheSA9IHR5cGVkQXJyYXk7XG59KShJcyB8fCAoSXMgPSB7fSkpO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBS0EsYUFBTyxlQUFlLFNBQVMsY0FBYyxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQzVELGNBQVEsY0FBYyxRQUFRLFFBQVEsUUFBUSxPQUFPLFFBQVEsUUFBUSxRQUFRLFNBQVMsUUFBUSxTQUFTLFFBQVEsVUFBVTtBQUN6SCxlQUFTLFFBQVEsT0FBTztBQUNwQixlQUFPLFVBQVUsUUFBUSxVQUFVO0FBQUEsTUFDdkM7QUFDQSxjQUFRLFVBQVU7QUFDbEIsZUFBUyxPQUFPLE9BQU87QUFDbkIsZUFBTyxPQUFPLFVBQVUsWUFBWSxpQkFBaUI7QUFBQSxNQUN6RDtBQUNBLGNBQVEsU0FBUztBQUNqQixlQUFTLE9BQU8sT0FBTztBQUNuQixlQUFPLE9BQU8sVUFBVSxZQUFZLGlCQUFpQjtBQUFBLE1BQ3pEO0FBQ0EsY0FBUSxTQUFTO0FBQ2pCLGVBQVMsTUFBTSxPQUFPO0FBQ2xCLGVBQU8saUJBQWlCO0FBQUEsTUFDNUI7QUFDQSxjQUFRLFFBQVE7QUFDaEIsZUFBUyxLQUFLLE9BQU87QUFDakIsZUFBTyxPQUFPLFVBQVU7QUFBQSxNQUM1QjtBQUNBLGNBQVEsT0FBTztBQUNmLGVBQVMsTUFBTSxPQUFPO0FBQ2xCLGVBQU8sTUFBTSxRQUFRLEtBQUs7QUFBQSxNQUM5QjtBQUNBLGNBQVEsUUFBUTtBQUNoQixlQUFTLFlBQVksT0FBTztBQUN4QixlQUFPLE1BQU0sS0FBSyxLQUFLLE1BQU0sTUFBTSxVQUFRLE9BQU8sSUFBSSxDQUFDO0FBQUEsTUFDM0Q7QUFDQSxjQUFRLGNBQWM7QUFBQTtBQUFBOzs7QUNsQ3RCO0FBQUE7QUFBQTtBQUtBLGFBQU8sZUFBZSxTQUFTLGNBQWMsRUFBRSxPQUFPLEtBQUssQ0FBQztBQUM1RCxjQUFRLFVBQVUsUUFBUSxvQkFBb0IsUUFBUSxvQkFBb0IsUUFBUSxvQkFBb0IsUUFBUSxvQkFBb0IsUUFBUSxvQkFBb0IsUUFBUSxvQkFBb0IsUUFBUSxvQkFBb0IsUUFBUSxvQkFBb0IsUUFBUSxvQkFBb0IsUUFBUSxvQkFBb0IsUUFBUSxtQkFBbUIsUUFBUSxlQUFlLFFBQVEsZUFBZSxRQUFRLGVBQWUsUUFBUSxlQUFlLFFBQVEsZUFBZSxRQUFRLGVBQWUsUUFBUSxlQUFlLFFBQVEsZUFBZSxRQUFRLGVBQWUsUUFBUSxjQUFjLFFBQVEsZUFBZSxRQUFRLDJCQUEyQixRQUFRLHNCQUFzQixRQUFRLGdCQUFnQixRQUFRLGFBQWE7QUFDL3FCLFVBQU0sS0FBSztBQUlYLFVBQUk7QUFDSixPQUFDLFNBQVVBLGFBQVk7QUFFbkIsUUFBQUEsWUFBVyxhQUFhO0FBQ3hCLFFBQUFBLFlBQVcsaUJBQWlCO0FBQzVCLFFBQUFBLFlBQVcsaUJBQWlCO0FBQzVCLFFBQUFBLFlBQVcsZ0JBQWdCO0FBQzNCLFFBQUFBLFlBQVcsZ0JBQWdCO0FBVTNCLFFBQUFBLFlBQVcsaUNBQWlDO0FBRTVDLFFBQUFBLFlBQVcsbUJBQW1CO0FBSTlCLFFBQUFBLFlBQVcsb0JBQW9CO0FBSS9CLFFBQUFBLFlBQVcsbUJBQW1CO0FBSzlCLFFBQUFBLFlBQVcsMEJBQTBCO0FBSXJDLFFBQUFBLFlBQVcscUJBQXFCO0FBS2hDLFFBQUFBLFlBQVcsdUJBQXVCO0FBQ2xDLFFBQUFBLFlBQVcsbUJBQW1CO0FBTzlCLFFBQUFBLFlBQVcsK0JBQStCO0FBRTFDLFFBQUFBLFlBQVcsaUJBQWlCO0FBQUEsTUFDaEMsR0FBRyxlQUFlLFFBQVEsYUFBYSxhQUFhLENBQUMsRUFBRTtBQUt2RCxVQUFNLGdCQUFOLE1BQU0sdUJBQXNCLE1BQU07QUFBQSxRQUM5QixZQUFZLE1BQU0sU0FBUyxNQUFNO0FBQzdCLGdCQUFNLE9BQU87QUFDYixlQUFLLE9BQU8sR0FBRyxPQUFPLElBQUksSUFBSSxPQUFPLFdBQVc7QUFDaEQsZUFBSyxPQUFPO0FBQ1osaUJBQU8sZUFBZSxNQUFNLGVBQWMsU0FBUztBQUFBLFFBQ3ZEO0FBQUEsUUFDQSxTQUFTO0FBQ0wsZ0JBQU0sU0FBUztBQUFBLFlBQ1gsTUFBTSxLQUFLO0FBQUEsWUFDWCxTQUFTLEtBQUs7QUFBQSxVQUNsQjtBQUNBLGNBQUksS0FBSyxTQUFTLFFBQVc7QUFDekIsbUJBQU8sT0FBTyxLQUFLO0FBQUEsVUFDdkI7QUFDQSxpQkFBTztBQUFBLFFBQ1g7QUFBQSxNQUNKO0FBQ0EsY0FBUSxnQkFBZ0I7QUFDeEIsVUFBTSxzQkFBTixNQUFNLHFCQUFvQjtBQUFBLFFBQ3RCLFlBQVksTUFBTTtBQUNkLGVBQUssT0FBTztBQUFBLFFBQ2hCO0FBQUEsUUFDQSxPQUFPLEdBQUcsT0FBTztBQUNiLGlCQUFPLFVBQVUscUJBQW9CLFFBQVEsVUFBVSxxQkFBb0IsVUFBVSxVQUFVLHFCQUFvQjtBQUFBLFFBQ3ZIO0FBQUEsUUFDQSxXQUFXO0FBQ1AsaUJBQU8sS0FBSztBQUFBLFFBQ2hCO0FBQUEsTUFDSjtBQUNBLGNBQVEsc0JBQXNCO0FBSzlCLDBCQUFvQixPQUFPLElBQUksb0JBQW9CLE1BQU07QUFLekQsMEJBQW9CLGFBQWEsSUFBSSxvQkFBb0IsWUFBWTtBQU1yRSwwQkFBb0IsU0FBUyxJQUFJLG9CQUFvQixRQUFRO0FBSTdELFVBQU0sMkJBQU4sTUFBK0I7QUFBQSxRQUMzQixZQUFZLFFBQVEsZ0JBQWdCO0FBQ2hDLGVBQUssU0FBUztBQUNkLGVBQUssaUJBQWlCO0FBQUEsUUFDMUI7QUFBQSxRQUNBLElBQUksc0JBQXNCO0FBQ3RCLGlCQUFPLG9CQUFvQjtBQUFBLFFBQy9CO0FBQUEsTUFDSjtBQUNBLGNBQVEsMkJBQTJCO0FBSW5DLFVBQU0sZUFBTixjQUEyQix5QkFBeUI7QUFBQSxRQUNoRCxZQUFZLFFBQVE7QUFDaEIsZ0JBQU0sUUFBUSxDQUFDO0FBQUEsUUFDbkI7QUFBQSxNQUNKO0FBQ0EsY0FBUSxlQUFlO0FBQ3ZCLFVBQU0sY0FBTixjQUEwQix5QkFBeUI7QUFBQSxRQUMvQyxZQUFZLFFBQVEsdUJBQXVCLG9CQUFvQixNQUFNO0FBQ2pFLGdCQUFNLFFBQVEsQ0FBQztBQUNmLGVBQUssdUJBQXVCO0FBQUEsUUFDaEM7QUFBQSxRQUNBLElBQUksc0JBQXNCO0FBQ3RCLGlCQUFPLEtBQUs7QUFBQSxRQUNoQjtBQUFBLE1BQ0o7QUFDQSxjQUFRLGNBQWM7QUFDdEIsVUFBTSxlQUFOLGNBQTJCLHlCQUF5QjtBQUFBLFFBQ2hELFlBQVksUUFBUSx1QkFBdUIsb0JBQW9CLE1BQU07QUFDakUsZ0JBQU0sUUFBUSxDQUFDO0FBQ2YsZUFBSyx1QkFBdUI7QUFBQSxRQUNoQztBQUFBLFFBQ0EsSUFBSSxzQkFBc0I7QUFDdEIsaUJBQU8sS0FBSztBQUFBLFFBQ2hCO0FBQUEsTUFDSjtBQUNBLGNBQVEsZUFBZTtBQUN2QixVQUFNLGVBQU4sY0FBMkIseUJBQXlCO0FBQUEsUUFDaEQsWUFBWSxRQUFRO0FBQ2hCLGdCQUFNLFFBQVEsQ0FBQztBQUFBLFFBQ25CO0FBQUEsTUFDSjtBQUNBLGNBQVEsZUFBZTtBQUN2QixVQUFNLGVBQU4sY0FBMkIseUJBQXlCO0FBQUEsUUFDaEQsWUFBWSxRQUFRO0FBQ2hCLGdCQUFNLFFBQVEsQ0FBQztBQUFBLFFBQ25CO0FBQUEsTUFDSjtBQUNBLGNBQVEsZUFBZTtBQUN2QixVQUFNLGVBQU4sY0FBMkIseUJBQXlCO0FBQUEsUUFDaEQsWUFBWSxRQUFRO0FBQ2hCLGdCQUFNLFFBQVEsQ0FBQztBQUFBLFFBQ25CO0FBQUEsTUFDSjtBQUNBLGNBQVEsZUFBZTtBQUN2QixVQUFNLGVBQU4sY0FBMkIseUJBQXlCO0FBQUEsUUFDaEQsWUFBWSxRQUFRO0FBQ2hCLGdCQUFNLFFBQVEsQ0FBQztBQUFBLFFBQ25CO0FBQUEsTUFDSjtBQUNBLGNBQVEsZUFBZTtBQUN2QixVQUFNLGVBQU4sY0FBMkIseUJBQXlCO0FBQUEsUUFDaEQsWUFBWSxRQUFRO0FBQ2hCLGdCQUFNLFFBQVEsQ0FBQztBQUFBLFFBQ25CO0FBQUEsTUFDSjtBQUNBLGNBQVEsZUFBZTtBQUN2QixVQUFNLGVBQU4sY0FBMkIseUJBQXlCO0FBQUEsUUFDaEQsWUFBWSxRQUFRO0FBQ2hCLGdCQUFNLFFBQVEsQ0FBQztBQUFBLFFBQ25CO0FBQUEsTUFDSjtBQUNBLGNBQVEsZUFBZTtBQUN2QixVQUFNLGVBQU4sY0FBMkIseUJBQXlCO0FBQUEsUUFDaEQsWUFBWSxRQUFRO0FBQ2hCLGdCQUFNLFFBQVEsQ0FBQztBQUFBLFFBQ25CO0FBQUEsTUFDSjtBQUNBLGNBQVEsZUFBZTtBQUN2QixVQUFNLGVBQU4sY0FBMkIseUJBQXlCO0FBQUEsUUFDaEQsWUFBWSxRQUFRO0FBQ2hCLGdCQUFNLFFBQVEsQ0FBQztBQUFBLFFBQ25CO0FBQUEsTUFDSjtBQUNBLGNBQVEsZUFBZTtBQUN2QixVQUFNLG1CQUFOLGNBQStCLHlCQUF5QjtBQUFBLFFBQ3BELFlBQVksUUFBUSx1QkFBdUIsb0JBQW9CLE1BQU07QUFDakUsZ0JBQU0sUUFBUSxDQUFDO0FBQ2YsZUFBSyx1QkFBdUI7QUFBQSxRQUNoQztBQUFBLFFBQ0EsSUFBSSxzQkFBc0I7QUFDdEIsaUJBQU8sS0FBSztBQUFBLFFBQ2hCO0FBQUEsTUFDSjtBQUNBLGNBQVEsbUJBQW1CO0FBQzNCLFVBQU0sb0JBQU4sY0FBZ0MseUJBQXlCO0FBQUEsUUFDckQsWUFBWSxRQUFRO0FBQ2hCLGdCQUFNLFFBQVEsQ0FBQztBQUFBLFFBQ25CO0FBQUEsTUFDSjtBQUNBLGNBQVEsb0JBQW9CO0FBQzVCLFVBQU0sb0JBQU4sY0FBZ0MseUJBQXlCO0FBQUEsUUFDckQsWUFBWSxRQUFRLHVCQUF1QixvQkFBb0IsTUFBTTtBQUNqRSxnQkFBTSxRQUFRLENBQUM7QUFDZixlQUFLLHVCQUF1QjtBQUFBLFFBQ2hDO0FBQUEsUUFDQSxJQUFJLHNCQUFzQjtBQUN0QixpQkFBTyxLQUFLO0FBQUEsUUFDaEI7QUFBQSxNQUNKO0FBQ0EsY0FBUSxvQkFBb0I7QUFDNUIsVUFBTSxvQkFBTixjQUFnQyx5QkFBeUI7QUFBQSxRQUNyRCxZQUFZLFFBQVE7QUFDaEIsZ0JBQU0sUUFBUSxDQUFDO0FBQUEsUUFDbkI7QUFBQSxNQUNKO0FBQ0EsY0FBUSxvQkFBb0I7QUFDNUIsVUFBTSxvQkFBTixjQUFnQyx5QkFBeUI7QUFBQSxRQUNyRCxZQUFZLFFBQVE7QUFDaEIsZ0JBQU0sUUFBUSxDQUFDO0FBQUEsUUFDbkI7QUFBQSxNQUNKO0FBQ0EsY0FBUSxvQkFBb0I7QUFDNUIsVUFBTSxvQkFBTixjQUFnQyx5QkFBeUI7QUFBQSxRQUNyRCxZQUFZLFFBQVE7QUFDaEIsZ0JBQU0sUUFBUSxDQUFDO0FBQUEsUUFDbkI7QUFBQSxNQUNKO0FBQ0EsY0FBUSxvQkFBb0I7QUFDNUIsVUFBTSxvQkFBTixjQUFnQyx5QkFBeUI7QUFBQSxRQUNyRCxZQUFZLFFBQVE7QUFDaEIsZ0JBQU0sUUFBUSxDQUFDO0FBQUEsUUFDbkI7QUFBQSxNQUNKO0FBQ0EsY0FBUSxvQkFBb0I7QUFDNUIsVUFBTSxvQkFBTixjQUFnQyx5QkFBeUI7QUFBQSxRQUNyRCxZQUFZLFFBQVE7QUFDaEIsZ0JBQU0sUUFBUSxDQUFDO0FBQUEsUUFDbkI7QUFBQSxNQUNKO0FBQ0EsY0FBUSxvQkFBb0I7QUFDNUIsVUFBTSxvQkFBTixjQUFnQyx5QkFBeUI7QUFBQSxRQUNyRCxZQUFZLFFBQVE7QUFDaEIsZ0JBQU0sUUFBUSxDQUFDO0FBQUEsUUFDbkI7QUFBQSxNQUNKO0FBQ0EsY0FBUSxvQkFBb0I7QUFDNUIsVUFBTSxvQkFBTixjQUFnQyx5QkFBeUI7QUFBQSxRQUNyRCxZQUFZLFFBQVE7QUFDaEIsZ0JBQU0sUUFBUSxDQUFDO0FBQUEsUUFDbkI7QUFBQSxNQUNKO0FBQ0EsY0FBUSxvQkFBb0I7QUFDNUIsVUFBTSxvQkFBTixjQUFnQyx5QkFBeUI7QUFBQSxRQUNyRCxZQUFZLFFBQVE7QUFDaEIsZ0JBQU0sUUFBUSxDQUFDO0FBQUEsUUFDbkI7QUFBQSxNQUNKO0FBQ0EsY0FBUSxvQkFBb0I7QUFDNUIsVUFBSUM7QUFDSixPQUFDLFNBQVVBLFVBQVM7QUFJaEIsaUJBQVMsVUFBVSxTQUFTO0FBQ3hCLGdCQUFNLFlBQVk7QUFDbEIsaUJBQU8sYUFBYSxHQUFHLE9BQU8sVUFBVSxNQUFNLE1BQU0sR0FBRyxPQUFPLFVBQVUsRUFBRSxLQUFLLEdBQUcsT0FBTyxVQUFVLEVBQUU7QUFBQSxRQUN6RztBQUNBLFFBQUFBLFNBQVEsWUFBWTtBQUlwQixpQkFBUyxlQUFlLFNBQVM7QUFDN0IsZ0JBQU0sWUFBWTtBQUNsQixpQkFBTyxhQUFhLEdBQUcsT0FBTyxVQUFVLE1BQU0sS0FBSyxRQUFRLE9BQU87QUFBQSxRQUN0RTtBQUNBLFFBQUFBLFNBQVEsaUJBQWlCO0FBSXpCLGlCQUFTLFdBQVcsU0FBUztBQUN6QixnQkFBTSxZQUFZO0FBQ2xCLGlCQUFPLGNBQWMsVUFBVSxXQUFXLFVBQVUsQ0FBQyxDQUFDLFVBQVUsV0FBVyxHQUFHLE9BQU8sVUFBVSxFQUFFLEtBQUssR0FBRyxPQUFPLFVBQVUsRUFBRSxLQUFLLFVBQVUsT0FBTztBQUFBLFFBQ3RKO0FBQ0EsUUFBQUEsU0FBUSxhQUFhO0FBQUEsTUFDekIsR0FBR0EsYUFBWSxRQUFRLFVBQVVBLFdBQVUsQ0FBQyxFQUFFO0FBQUE7QUFBQTs7O0FDalQ5QztBQUFBO0FBQUE7QUFLQSxVQUFJO0FBQ0osYUFBTyxlQUFlLFNBQVMsY0FBYyxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQzVELGNBQVEsV0FBVyxRQUFRLFlBQVksUUFBUSxRQUFRO0FBQ3ZELFVBQUk7QUFDSixPQUFDLFNBQVVDLFFBQU87QUFDZCxRQUFBQSxPQUFNLE9BQU87QUFDYixRQUFBQSxPQUFNLFFBQVE7QUFDZCxRQUFBQSxPQUFNLFFBQVFBLE9BQU07QUFDcEIsUUFBQUEsT0FBTSxPQUFPO0FBQ2IsUUFBQUEsT0FBTSxRQUFRQSxPQUFNO0FBQUEsTUFDeEIsR0FBRyxVQUFVLFFBQVEsUUFBUSxRQUFRLENBQUMsRUFBRTtBQUN4QyxVQUFNLFlBQU4sTUFBZ0I7QUFBQSxRQUNaLGNBQWM7QUFDVixlQUFLLEVBQUUsSUFBSTtBQUNYLGVBQUssT0FBTyxvQkFBSSxJQUFJO0FBQ3BCLGVBQUssUUFBUTtBQUNiLGVBQUssUUFBUTtBQUNiLGVBQUssUUFBUTtBQUNiLGVBQUssU0FBUztBQUFBLFFBQ2xCO0FBQUEsUUFDQSxRQUFRO0FBQ0osZUFBSyxLQUFLLE1BQU07QUFDaEIsZUFBSyxRQUFRO0FBQ2IsZUFBSyxRQUFRO0FBQ2IsZUFBSyxRQUFRO0FBQ2IsZUFBSztBQUFBLFFBQ1Q7QUFBQSxRQUNBLFVBQVU7QUFDTixpQkFBTyxDQUFDLEtBQUssU0FBUyxDQUFDLEtBQUs7QUFBQSxRQUNoQztBQUFBLFFBQ0EsSUFBSSxPQUFPO0FBQ1AsaUJBQU8sS0FBSztBQUFBLFFBQ2hCO0FBQUEsUUFDQSxJQUFJLFFBQVE7QUFDUixpQkFBTyxLQUFLLE9BQU87QUFBQSxRQUN2QjtBQUFBLFFBQ0EsSUFBSSxPQUFPO0FBQ1AsaUJBQU8sS0FBSyxPQUFPO0FBQUEsUUFDdkI7QUFBQSxRQUNBLElBQUksS0FBSztBQUNMLGlCQUFPLEtBQUssS0FBSyxJQUFJLEdBQUc7QUFBQSxRQUM1QjtBQUFBLFFBQ0EsSUFBSSxLQUFLLFFBQVEsTUFBTSxNQUFNO0FBQ3pCLGdCQUFNLE9BQU8sS0FBSyxLQUFLLElBQUksR0FBRztBQUM5QixjQUFJLENBQUMsTUFBTTtBQUNQLG1CQUFPO0FBQUEsVUFDWDtBQUNBLGNBQUksVUFBVSxNQUFNLE1BQU07QUFDdEIsaUJBQUssTUFBTSxNQUFNLEtBQUs7QUFBQSxVQUMxQjtBQUNBLGlCQUFPLEtBQUs7QUFBQSxRQUNoQjtBQUFBLFFBQ0EsSUFBSSxLQUFLLE9BQU8sUUFBUSxNQUFNLE1BQU07QUFDaEMsY0FBSSxPQUFPLEtBQUssS0FBSyxJQUFJLEdBQUc7QUFDNUIsY0FBSSxNQUFNO0FBQ04saUJBQUssUUFBUTtBQUNiLGdCQUFJLFVBQVUsTUFBTSxNQUFNO0FBQ3RCLG1CQUFLLE1BQU0sTUFBTSxLQUFLO0FBQUEsWUFDMUI7QUFBQSxVQUNKLE9BQ0s7QUFDRCxtQkFBTyxFQUFFLEtBQUssT0FBTyxNQUFNLFFBQVcsVUFBVSxPQUFVO0FBQzFELG9CQUFRLE9BQU87QUFBQSxjQUNYLEtBQUssTUFBTTtBQUNQLHFCQUFLLFlBQVksSUFBSTtBQUNyQjtBQUFBLGNBQ0osS0FBSyxNQUFNO0FBQ1AscUJBQUssYUFBYSxJQUFJO0FBQ3RCO0FBQUEsY0FDSixLQUFLLE1BQU07QUFDUCxxQkFBSyxZQUFZLElBQUk7QUFDckI7QUFBQSxjQUNKO0FBQ0kscUJBQUssWUFBWSxJQUFJO0FBQ3JCO0FBQUEsWUFDUjtBQUNBLGlCQUFLLEtBQUssSUFBSSxLQUFLLElBQUk7QUFDdkIsaUJBQUs7QUFBQSxVQUNUO0FBQ0EsaUJBQU87QUFBQSxRQUNYO0FBQUEsUUFDQSxPQUFPLEtBQUs7QUFDUixpQkFBTyxDQUFDLENBQUMsS0FBSyxPQUFPLEdBQUc7QUFBQSxRQUM1QjtBQUFBLFFBQ0EsT0FBTyxLQUFLO0FBQ1IsZ0JBQU0sT0FBTyxLQUFLLEtBQUssSUFBSSxHQUFHO0FBQzlCLGNBQUksQ0FBQyxNQUFNO0FBQ1AsbUJBQU87QUFBQSxVQUNYO0FBQ0EsZUFBSyxLQUFLLE9BQU8sR0FBRztBQUNwQixlQUFLLFdBQVcsSUFBSTtBQUNwQixlQUFLO0FBQ0wsaUJBQU8sS0FBSztBQUFBLFFBQ2hCO0FBQUEsUUFDQSxRQUFRO0FBQ0osY0FBSSxDQUFDLEtBQUssU0FBUyxDQUFDLEtBQUssT0FBTztBQUM1QixtQkFBTztBQUFBLFVBQ1g7QUFDQSxjQUFJLENBQUMsS0FBSyxTQUFTLENBQUMsS0FBSyxPQUFPO0FBQzVCLGtCQUFNLElBQUksTUFBTSxjQUFjO0FBQUEsVUFDbEM7QUFDQSxnQkFBTSxPQUFPLEtBQUs7QUFDbEIsZUFBSyxLQUFLLE9BQU8sS0FBSyxHQUFHO0FBQ3pCLGVBQUssV0FBVyxJQUFJO0FBQ3BCLGVBQUs7QUFDTCxpQkFBTyxLQUFLO0FBQUEsUUFDaEI7QUFBQSxRQUNBLFFBQVEsWUFBWSxTQUFTO0FBQ3pCLGdCQUFNLFFBQVEsS0FBSztBQUNuQixjQUFJLFVBQVUsS0FBSztBQUNuQixpQkFBTyxTQUFTO0FBQ1osZ0JBQUksU0FBUztBQUNULHlCQUFXLEtBQUssT0FBTyxFQUFFLFFBQVEsT0FBTyxRQUFRLEtBQUssSUFBSTtBQUFBLFlBQzdELE9BQ0s7QUFDRCx5QkFBVyxRQUFRLE9BQU8sUUFBUSxLQUFLLElBQUk7QUFBQSxZQUMvQztBQUNBLGdCQUFJLEtBQUssV0FBVyxPQUFPO0FBQ3ZCLG9CQUFNLElBQUksTUFBTSwwQ0FBMEM7QUFBQSxZQUM5RDtBQUNBLHNCQUFVLFFBQVE7QUFBQSxVQUN0QjtBQUFBLFFBQ0o7QUFBQSxRQUNBLE9BQU87QUFDSCxnQkFBTSxRQUFRLEtBQUs7QUFDbkIsY0FBSSxVQUFVLEtBQUs7QUFDbkIsZ0JBQU0sV0FBVztBQUFBLFlBQ2IsQ0FBQyxPQUFPLFFBQVEsR0FBRyxNQUFNO0FBQ3JCLHFCQUFPO0FBQUEsWUFDWDtBQUFBLFlBQ0EsTUFBTSxNQUFNO0FBQ1Isa0JBQUksS0FBSyxXQUFXLE9BQU87QUFDdkIsc0JBQU0sSUFBSSxNQUFNLDBDQUEwQztBQUFBLGNBQzlEO0FBQ0Esa0JBQUksU0FBUztBQUNULHNCQUFNLFNBQVMsRUFBRSxPQUFPLFFBQVEsS0FBSyxNQUFNLE1BQU07QUFDakQsMEJBQVUsUUFBUTtBQUNsQix1QkFBTztBQUFBLGNBQ1gsT0FDSztBQUNELHVCQUFPLEVBQUUsT0FBTyxRQUFXLE1BQU0sS0FBSztBQUFBLGNBQzFDO0FBQUEsWUFDSjtBQUFBLFVBQ0o7QUFDQSxpQkFBTztBQUFBLFFBQ1g7QUFBQSxRQUNBLFNBQVM7QUFDTCxnQkFBTSxRQUFRLEtBQUs7QUFDbkIsY0FBSSxVQUFVLEtBQUs7QUFDbkIsZ0JBQU0sV0FBVztBQUFBLFlBQ2IsQ0FBQyxPQUFPLFFBQVEsR0FBRyxNQUFNO0FBQ3JCLHFCQUFPO0FBQUEsWUFDWDtBQUFBLFlBQ0EsTUFBTSxNQUFNO0FBQ1Isa0JBQUksS0FBSyxXQUFXLE9BQU87QUFDdkIsc0JBQU0sSUFBSSxNQUFNLDBDQUEwQztBQUFBLGNBQzlEO0FBQ0Esa0JBQUksU0FBUztBQUNULHNCQUFNLFNBQVMsRUFBRSxPQUFPLFFBQVEsT0FBTyxNQUFNLE1BQU07QUFDbkQsMEJBQVUsUUFBUTtBQUNsQix1QkFBTztBQUFBLGNBQ1gsT0FDSztBQUNELHVCQUFPLEVBQUUsT0FBTyxRQUFXLE1BQU0sS0FBSztBQUFBLGNBQzFDO0FBQUEsWUFDSjtBQUFBLFVBQ0o7QUFDQSxpQkFBTztBQUFBLFFBQ1g7QUFBQSxRQUNBLFVBQVU7QUFDTixnQkFBTSxRQUFRLEtBQUs7QUFDbkIsY0FBSSxVQUFVLEtBQUs7QUFDbkIsZ0JBQU0sV0FBVztBQUFBLFlBQ2IsQ0FBQyxPQUFPLFFBQVEsR0FBRyxNQUFNO0FBQ3JCLHFCQUFPO0FBQUEsWUFDWDtBQUFBLFlBQ0EsTUFBTSxNQUFNO0FBQ1Isa0JBQUksS0FBSyxXQUFXLE9BQU87QUFDdkIsc0JBQU0sSUFBSSxNQUFNLDBDQUEwQztBQUFBLGNBQzlEO0FBQ0Esa0JBQUksU0FBUztBQUNULHNCQUFNLFNBQVMsRUFBRSxPQUFPLENBQUMsUUFBUSxLQUFLLFFBQVEsS0FBSyxHQUFHLE1BQU0sTUFBTTtBQUNsRSwwQkFBVSxRQUFRO0FBQ2xCLHVCQUFPO0FBQUEsY0FDWCxPQUNLO0FBQ0QsdUJBQU8sRUFBRSxPQUFPLFFBQVcsTUFBTSxLQUFLO0FBQUEsY0FDMUM7QUFBQSxZQUNKO0FBQUEsVUFDSjtBQUNBLGlCQUFPO0FBQUEsUUFDWDtBQUFBLFFBQ0EsRUFBRSxLQUFLLE9BQU8sYUFBYSxPQUFPLFNBQVMsSUFBSTtBQUMzQyxpQkFBTyxLQUFLLFFBQVE7QUFBQSxRQUN4QjtBQUFBLFFBQ0EsUUFBUSxTQUFTO0FBQ2IsY0FBSSxXQUFXLEtBQUssTUFBTTtBQUN0QjtBQUFBLFVBQ0o7QUFDQSxjQUFJLFlBQVksR0FBRztBQUNmLGlCQUFLLE1BQU07QUFDWDtBQUFBLFVBQ0o7QUFDQSxjQUFJLFVBQVUsS0FBSztBQUNuQixjQUFJLGNBQWMsS0FBSztBQUN2QixpQkFBTyxXQUFXLGNBQWMsU0FBUztBQUNyQyxpQkFBSyxLQUFLLE9BQU8sUUFBUSxHQUFHO0FBQzVCLHNCQUFVLFFBQVE7QUFDbEI7QUFBQSxVQUNKO0FBQ0EsZUFBSyxRQUFRO0FBQ2IsZUFBSyxRQUFRO0FBQ2IsY0FBSSxTQUFTO0FBQ1Qsb0JBQVEsV0FBVztBQUFBLFVBQ3ZCO0FBQ0EsZUFBSztBQUFBLFFBQ1Q7QUFBQSxRQUNBLGFBQWEsTUFBTTtBQUVmLGNBQUksQ0FBQyxLQUFLLFNBQVMsQ0FBQyxLQUFLLE9BQU87QUFDNUIsaUJBQUssUUFBUTtBQUFBLFVBQ2pCLFdBQ1MsQ0FBQyxLQUFLLE9BQU87QUFDbEIsa0JBQU0sSUFBSSxNQUFNLGNBQWM7QUFBQSxVQUNsQyxPQUNLO0FBQ0QsaUJBQUssT0FBTyxLQUFLO0FBQ2pCLGlCQUFLLE1BQU0sV0FBVztBQUFBLFVBQzFCO0FBQ0EsZUFBSyxRQUFRO0FBQ2IsZUFBSztBQUFBLFFBQ1Q7QUFBQSxRQUNBLFlBQVksTUFBTTtBQUVkLGNBQUksQ0FBQyxLQUFLLFNBQVMsQ0FBQyxLQUFLLE9BQU87QUFDNUIsaUJBQUssUUFBUTtBQUFBLFVBQ2pCLFdBQ1MsQ0FBQyxLQUFLLE9BQU87QUFDbEIsa0JBQU0sSUFBSSxNQUFNLGNBQWM7QUFBQSxVQUNsQyxPQUNLO0FBQ0QsaUJBQUssV0FBVyxLQUFLO0FBQ3JCLGlCQUFLLE1BQU0sT0FBTztBQUFBLFVBQ3RCO0FBQ0EsZUFBSyxRQUFRO0FBQ2IsZUFBSztBQUFBLFFBQ1Q7QUFBQSxRQUNBLFdBQVcsTUFBTTtBQUNiLGNBQUksU0FBUyxLQUFLLFNBQVMsU0FBUyxLQUFLLE9BQU87QUFDNUMsaUJBQUssUUFBUTtBQUNiLGlCQUFLLFFBQVE7QUFBQSxVQUNqQixXQUNTLFNBQVMsS0FBSyxPQUFPO0FBRzFCLGdCQUFJLENBQUMsS0FBSyxNQUFNO0FBQ1osb0JBQU0sSUFBSSxNQUFNLGNBQWM7QUFBQSxZQUNsQztBQUNBLGlCQUFLLEtBQUssV0FBVztBQUNyQixpQkFBSyxRQUFRLEtBQUs7QUFBQSxVQUN0QixXQUNTLFNBQVMsS0FBSyxPQUFPO0FBRzFCLGdCQUFJLENBQUMsS0FBSyxVQUFVO0FBQ2hCLG9CQUFNLElBQUksTUFBTSxjQUFjO0FBQUEsWUFDbEM7QUFDQSxpQkFBSyxTQUFTLE9BQU87QUFDckIsaUJBQUssUUFBUSxLQUFLO0FBQUEsVUFDdEIsT0FDSztBQUNELGtCQUFNLE9BQU8sS0FBSztBQUNsQixrQkFBTSxXQUFXLEtBQUs7QUFDdEIsZ0JBQUksQ0FBQyxRQUFRLENBQUMsVUFBVTtBQUNwQixvQkFBTSxJQUFJLE1BQU0sY0FBYztBQUFBLFlBQ2xDO0FBQ0EsaUJBQUssV0FBVztBQUNoQixxQkFBUyxPQUFPO0FBQUEsVUFDcEI7QUFDQSxlQUFLLE9BQU87QUFDWixlQUFLLFdBQVc7QUFDaEIsZUFBSztBQUFBLFFBQ1Q7QUFBQSxRQUNBLE1BQU0sTUFBTSxPQUFPO0FBQ2YsY0FBSSxDQUFDLEtBQUssU0FBUyxDQUFDLEtBQUssT0FBTztBQUM1QixrQkFBTSxJQUFJLE1BQU0sY0FBYztBQUFBLFVBQ2xDO0FBQ0EsY0FBSyxVQUFVLE1BQU0sU0FBUyxVQUFVLE1BQU0sTUFBTztBQUNqRDtBQUFBLFVBQ0o7QUFDQSxjQUFJLFVBQVUsTUFBTSxPQUFPO0FBQ3ZCLGdCQUFJLFNBQVMsS0FBSyxPQUFPO0FBQ3JCO0FBQUEsWUFDSjtBQUNBLGtCQUFNLE9BQU8sS0FBSztBQUNsQixrQkFBTSxXQUFXLEtBQUs7QUFFdEIsZ0JBQUksU0FBUyxLQUFLLE9BQU87QUFHckIsdUJBQVMsT0FBTztBQUNoQixtQkFBSyxRQUFRO0FBQUEsWUFDakIsT0FDSztBQUVELG1CQUFLLFdBQVc7QUFDaEIsdUJBQVMsT0FBTztBQUFBLFlBQ3BCO0FBRUEsaUJBQUssV0FBVztBQUNoQixpQkFBSyxPQUFPLEtBQUs7QUFDakIsaUJBQUssTUFBTSxXQUFXO0FBQ3RCLGlCQUFLLFFBQVE7QUFDYixpQkFBSztBQUFBLFVBQ1QsV0FDUyxVQUFVLE1BQU0sTUFBTTtBQUMzQixnQkFBSSxTQUFTLEtBQUssT0FBTztBQUNyQjtBQUFBLFlBQ0o7QUFDQSxrQkFBTSxPQUFPLEtBQUs7QUFDbEIsa0JBQU0sV0FBVyxLQUFLO0FBRXRCLGdCQUFJLFNBQVMsS0FBSyxPQUFPO0FBR3JCLG1CQUFLLFdBQVc7QUFDaEIsbUJBQUssUUFBUTtBQUFBLFlBQ2pCLE9BQ0s7QUFFRCxtQkFBSyxXQUFXO0FBQ2hCLHVCQUFTLE9BQU87QUFBQSxZQUNwQjtBQUNBLGlCQUFLLE9BQU87QUFDWixpQkFBSyxXQUFXLEtBQUs7QUFDckIsaUJBQUssTUFBTSxPQUFPO0FBQ2xCLGlCQUFLLFFBQVE7QUFDYixpQkFBSztBQUFBLFVBQ1Q7QUFBQSxRQUNKO0FBQUEsUUFDQSxTQUFTO0FBQ0wsZ0JBQU0sT0FBTyxDQUFDO0FBQ2QsZUFBSyxRQUFRLENBQUMsT0FBTyxRQUFRO0FBQ3pCLGlCQUFLLEtBQUssQ0FBQyxLQUFLLEtBQUssQ0FBQztBQUFBLFVBQzFCLENBQUM7QUFDRCxpQkFBTztBQUFBLFFBQ1g7QUFBQSxRQUNBLFNBQVMsTUFBTTtBQUNYLGVBQUssTUFBTTtBQUNYLHFCQUFXLENBQUMsS0FBSyxLQUFLLEtBQUssTUFBTTtBQUM3QixpQkFBSyxJQUFJLEtBQUssS0FBSztBQUFBLFVBQ3ZCO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFDQSxjQUFRLFlBQVk7QUFDcEIsVUFBTSxXQUFOLGNBQXVCLFVBQVU7QUFBQSxRQUM3QixZQUFZLE9BQU8sUUFBUSxHQUFHO0FBQzFCLGdCQUFNO0FBQ04sZUFBSyxTQUFTO0FBQ2QsZUFBSyxTQUFTLEtBQUssSUFBSSxLQUFLLElBQUksR0FBRyxLQUFLLEdBQUcsQ0FBQztBQUFBLFFBQ2hEO0FBQUEsUUFDQSxJQUFJLFFBQVE7QUFDUixpQkFBTyxLQUFLO0FBQUEsUUFDaEI7QUFBQSxRQUNBLElBQUksTUFBTSxPQUFPO0FBQ2IsZUFBSyxTQUFTO0FBQ2QsZUFBSyxVQUFVO0FBQUEsUUFDbkI7QUFBQSxRQUNBLElBQUksUUFBUTtBQUNSLGlCQUFPLEtBQUs7QUFBQSxRQUNoQjtBQUFBLFFBQ0EsSUFBSSxNQUFNLE9BQU87QUFDYixlQUFLLFNBQVMsS0FBSyxJQUFJLEtBQUssSUFBSSxHQUFHLEtBQUssR0FBRyxDQUFDO0FBQzVDLGVBQUssVUFBVTtBQUFBLFFBQ25CO0FBQUEsUUFDQSxJQUFJLEtBQUssUUFBUSxNQUFNLE9BQU87QUFDMUIsaUJBQU8sTUFBTSxJQUFJLEtBQUssS0FBSztBQUFBLFFBQy9CO0FBQUEsUUFDQSxLQUFLLEtBQUs7QUFDTixpQkFBTyxNQUFNLElBQUksS0FBSyxNQUFNLElBQUk7QUFBQSxRQUNwQztBQUFBLFFBQ0EsSUFBSSxLQUFLLE9BQU87QUFDWixnQkFBTSxJQUFJLEtBQUssT0FBTyxNQUFNLElBQUk7QUFDaEMsZUFBSyxVQUFVO0FBQ2YsaUJBQU87QUFBQSxRQUNYO0FBQUEsUUFDQSxZQUFZO0FBQ1IsY0FBSSxLQUFLLE9BQU8sS0FBSyxRQUFRO0FBQ3pCLGlCQUFLLFFBQVEsS0FBSyxNQUFNLEtBQUssU0FBUyxLQUFLLE1BQU0sQ0FBQztBQUFBLFVBQ3REO0FBQUEsUUFDSjtBQUFBLE1BQ0o7QUFDQSxjQUFRLFdBQVc7QUFBQTtBQUFBOzs7QUM3WW5CO0FBQUE7QUFBQTtBQUtBLGFBQU8sZUFBZSxTQUFTLGNBQWMsRUFBRSxPQUFPLEtBQUssQ0FBQztBQUM1RCxjQUFRLGFBQWE7QUFDckIsVUFBSUM7QUFDSixPQUFDLFNBQVVBLGFBQVk7QUFDbkIsaUJBQVMsT0FBTyxNQUFNO0FBQ2xCLGlCQUFPO0FBQUEsWUFDSCxTQUFTO0FBQUEsVUFDYjtBQUFBLFFBQ0o7QUFDQSxRQUFBQSxZQUFXLFNBQVM7QUFBQSxNQUN4QixHQUFHQSxnQkFBZSxRQUFRLGFBQWFBLGNBQWEsQ0FBQyxFQUFFO0FBQUE7QUFBQTs7O0FDZnZEO0FBQUE7QUFBQTtBQUtBLGFBQU8sZUFBZSxTQUFTLGNBQWMsRUFBRSxPQUFPLEtBQUssQ0FBQztBQUM1RCxVQUFJO0FBQ0osZUFBUyxNQUFNO0FBQ1gsWUFBSSxTQUFTLFFBQVc7QUFDcEIsZ0JBQU0sSUFBSSxNQUFNLHdDQUF3QztBQUFBLFFBQzVEO0FBQ0EsZUFBTztBQUFBLE1BQ1g7QUFDQSxPQUFDLFNBQVVDLE1BQUs7QUFDWixpQkFBUyxRQUFRLEtBQUs7QUFDbEIsY0FBSSxRQUFRLFFBQVc7QUFDbkIsa0JBQU0sSUFBSSxNQUFNLHVDQUF1QztBQUFBLFVBQzNEO0FBQ0EsaUJBQU87QUFBQSxRQUNYO0FBQ0EsUUFBQUEsS0FBSSxVQUFVO0FBQUEsTUFDbEIsR0FBRyxRQUFRLE1BQU0sQ0FBQyxFQUFFO0FBQ3BCLGNBQVEsVUFBVTtBQUFBO0FBQUE7OztBQ3RCbEI7QUFBQTtBQUFBO0FBS0EsYUFBTyxlQUFlLFNBQVMsY0FBYyxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQzVELGNBQVEsVUFBVSxRQUFRLFFBQVE7QUFDbEMsVUFBTSxRQUFRO0FBQ2QsVUFBSTtBQUNKLE9BQUMsU0FBVUMsUUFBTztBQUNkLGNBQU0sY0FBYyxFQUFFLFVBQVU7QUFBQSxRQUFFLEVBQUU7QUFDcEMsUUFBQUEsT0FBTSxPQUFPLFdBQVk7QUFBRSxpQkFBTztBQUFBLFFBQWE7QUFBQSxNQUNuRCxHQUFHLFVBQVUsUUFBUSxRQUFRLFFBQVEsQ0FBQyxFQUFFO0FBQ3hDLFVBQU0sZUFBTixNQUFtQjtBQUFBLFFBQ2YsSUFBSSxVQUFVLFVBQVUsTUFBTSxRQUFRO0FBQ2xDLGNBQUksQ0FBQyxLQUFLLFlBQVk7QUFDbEIsaUJBQUssYUFBYSxDQUFDO0FBQ25CLGlCQUFLLFlBQVksQ0FBQztBQUFBLFVBQ3RCO0FBQ0EsZUFBSyxXQUFXLEtBQUssUUFBUTtBQUM3QixlQUFLLFVBQVUsS0FBSyxPQUFPO0FBQzNCLGNBQUksTUFBTSxRQUFRLE1BQU0sR0FBRztBQUN2QixtQkFBTyxLQUFLLEVBQUUsU0FBUyxNQUFNLEtBQUssT0FBTyxVQUFVLE9BQU8sRUFBRSxDQUFDO0FBQUEsVUFDakU7QUFBQSxRQUNKO0FBQUEsUUFDQSxPQUFPLFVBQVUsVUFBVSxNQUFNO0FBQzdCLGNBQUksQ0FBQyxLQUFLLFlBQVk7QUFDbEI7QUFBQSxVQUNKO0FBQ0EsY0FBSSxvQ0FBb0M7QUFDeEMsbUJBQVMsSUFBSSxHQUFHLE1BQU0sS0FBSyxXQUFXLFFBQVEsSUFBSSxLQUFLLEtBQUs7QUFDeEQsZ0JBQUksS0FBSyxXQUFXLENBQUMsTUFBTSxVQUFVO0FBQ2pDLGtCQUFJLEtBQUssVUFBVSxDQUFDLE1BQU0sU0FBUztBQUUvQixxQkFBSyxXQUFXLE9BQU8sR0FBRyxDQUFDO0FBQzNCLHFCQUFLLFVBQVUsT0FBTyxHQUFHLENBQUM7QUFDMUI7QUFBQSxjQUNKLE9BQ0s7QUFDRCxvREFBb0M7QUFBQSxjQUN4QztBQUFBLFlBQ0o7QUFBQSxVQUNKO0FBQ0EsY0FBSSxtQ0FBbUM7QUFDbkMsa0JBQU0sSUFBSSxNQUFNLG1GQUFtRjtBQUFBLFVBQ3ZHO0FBQUEsUUFDSjtBQUFBLFFBQ0EsVUFBVSxNQUFNO0FBQ1osY0FBSSxDQUFDLEtBQUssWUFBWTtBQUNsQixtQkFBTyxDQUFDO0FBQUEsVUFDWjtBQUNBLGdCQUFNLE1BQU0sQ0FBQyxHQUFHLFlBQVksS0FBSyxXQUFXLE1BQU0sQ0FBQyxHQUFHLFdBQVcsS0FBSyxVQUFVLE1BQU0sQ0FBQztBQUN2RixtQkFBUyxJQUFJLEdBQUcsTUFBTSxVQUFVLFFBQVEsSUFBSSxLQUFLLEtBQUs7QUFDbEQsZ0JBQUk7QUFDQSxrQkFBSSxLQUFLLFVBQVUsQ0FBQyxFQUFFLE1BQU0sU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDO0FBQUEsWUFDbEQsU0FDTyxHQUFHO0FBRU4sZUFBQyxHQUFHLE1BQU0sU0FBUyxFQUFFLFFBQVEsTUFBTSxDQUFDO0FBQUEsWUFDeEM7QUFBQSxVQUNKO0FBQ0EsaUJBQU87QUFBQSxRQUNYO0FBQUEsUUFDQSxVQUFVO0FBQ04saUJBQU8sQ0FBQyxLQUFLLGNBQWMsS0FBSyxXQUFXLFdBQVc7QUFBQSxRQUMxRDtBQUFBLFFBQ0EsVUFBVTtBQUNOLGVBQUssYUFBYTtBQUNsQixlQUFLLFlBQVk7QUFBQSxRQUNyQjtBQUFBLE1BQ0o7QUFDQSxVQUFNLFVBQU4sTUFBTSxTQUFRO0FBQUEsUUFDVixZQUFZLFVBQVU7QUFDbEIsZUFBSyxXQUFXO0FBQUEsUUFDcEI7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFFBS0EsSUFBSSxRQUFRO0FBQ1IsY0FBSSxDQUFDLEtBQUssUUFBUTtBQUNkLGlCQUFLLFNBQVMsQ0FBQyxVQUFVLFVBQVUsZ0JBQWdCO0FBQy9DLGtCQUFJLENBQUMsS0FBSyxZQUFZO0FBQ2xCLHFCQUFLLGFBQWEsSUFBSSxhQUFhO0FBQUEsY0FDdkM7QUFDQSxrQkFBSSxLQUFLLFlBQVksS0FBSyxTQUFTLHNCQUFzQixLQUFLLFdBQVcsUUFBUSxHQUFHO0FBQ2hGLHFCQUFLLFNBQVMsbUJBQW1CLElBQUk7QUFBQSxjQUN6QztBQUNBLG1CQUFLLFdBQVcsSUFBSSxVQUFVLFFBQVE7QUFDdEMsb0JBQU0sU0FBUztBQUFBLGdCQUNYLFNBQVMsTUFBTTtBQUNYLHNCQUFJLENBQUMsS0FBSyxZQUFZO0FBRWxCO0FBQUEsa0JBQ0o7QUFDQSx1QkFBSyxXQUFXLE9BQU8sVUFBVSxRQUFRO0FBQ3pDLHlCQUFPLFVBQVUsU0FBUTtBQUN6QixzQkFBSSxLQUFLLFlBQVksS0FBSyxTQUFTLHdCQUF3QixLQUFLLFdBQVcsUUFBUSxHQUFHO0FBQ2xGLHlCQUFLLFNBQVMscUJBQXFCLElBQUk7QUFBQSxrQkFDM0M7QUFBQSxnQkFDSjtBQUFBLGNBQ0o7QUFDQSxrQkFBSSxNQUFNLFFBQVEsV0FBVyxHQUFHO0FBQzVCLDRCQUFZLEtBQUssTUFBTTtBQUFBLGNBQzNCO0FBQ0EscUJBQU87QUFBQSxZQUNYO0FBQUEsVUFDSjtBQUNBLGlCQUFPLEtBQUs7QUFBQSxRQUNoQjtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsUUFLQSxLQUFLLE9BQU87QUFDUixjQUFJLEtBQUssWUFBWTtBQUNqQixpQkFBSyxXQUFXLE9BQU8sS0FBSyxLQUFLLFlBQVksS0FBSztBQUFBLFVBQ3REO0FBQUEsUUFDSjtBQUFBLFFBQ0EsVUFBVTtBQUNOLGNBQUksS0FBSyxZQUFZO0FBQ2pCLGlCQUFLLFdBQVcsUUFBUTtBQUN4QixpQkFBSyxhQUFhO0FBQUEsVUFDdEI7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUNBLGNBQVEsVUFBVTtBQUNsQixjQUFRLFFBQVEsV0FBWTtBQUFBLE1BQUU7QUFBQTtBQUFBOzs7QUMvSDlCO0FBQUE7QUFBQTtBQUtBLGFBQU8sZUFBZSxTQUFTLGNBQWMsRUFBRSxPQUFPLEtBQUssQ0FBQztBQUM1RCxjQUFRLDBCQUEwQixRQUFRLG9CQUFvQjtBQUM5RCxVQUFNLFFBQVE7QUFDZCxVQUFNQyxNQUFLO0FBQ1gsVUFBTSxXQUFXO0FBQ2pCLFVBQUk7QUFDSixPQUFDLFNBQVVDLG9CQUFtQjtBQUMxQixRQUFBQSxtQkFBa0IsT0FBTyxPQUFPLE9BQU87QUFBQSxVQUNuQyx5QkFBeUI7QUFBQSxVQUN6Qix5QkFBeUIsU0FBUyxNQUFNO0FBQUEsUUFDNUMsQ0FBQztBQUNELFFBQUFBLG1CQUFrQixZQUFZLE9BQU8sT0FBTztBQUFBLFVBQ3hDLHlCQUF5QjtBQUFBLFVBQ3pCLHlCQUF5QixTQUFTLE1BQU07QUFBQSxRQUM1QyxDQUFDO0FBQ0QsaUJBQVMsR0FBRyxPQUFPO0FBQ2YsZ0JBQU0sWUFBWTtBQUNsQixpQkFBTyxjQUFjLGNBQWNBLG1CQUFrQixRQUM5QyxjQUFjQSxtQkFBa0IsYUFDL0JELElBQUcsUUFBUSxVQUFVLHVCQUF1QixLQUFLLENBQUMsQ0FBQyxVQUFVO0FBQUEsUUFDekU7QUFDQSxRQUFBQyxtQkFBa0IsS0FBSztBQUFBLE1BQzNCLEdBQUcsc0JBQXNCLFFBQVEsb0JBQW9CLG9CQUFvQixDQUFDLEVBQUU7QUFDNUUsVUFBTSxnQkFBZ0IsT0FBTyxPQUFPLFNBQVUsVUFBVSxTQUFTO0FBQzdELGNBQU0sVUFBVSxHQUFHLE1BQU0sU0FBUyxFQUFFLE1BQU0sV0FBVyxTQUFTLEtBQUssT0FBTyxHQUFHLENBQUM7QUFDOUUsZUFBTyxFQUFFLFVBQVU7QUFBRSxpQkFBTyxRQUFRO0FBQUEsUUFBRyxFQUFFO0FBQUEsTUFDN0MsQ0FBQztBQUNELFVBQU0sZUFBTixNQUFtQjtBQUFBLFFBQ2YsY0FBYztBQUNWLGVBQUssZUFBZTtBQUFBLFFBQ3hCO0FBQUEsUUFDQSxTQUFTO0FBQ0wsY0FBSSxDQUFDLEtBQUssY0FBYztBQUNwQixpQkFBSyxlQUFlO0FBQ3BCLGdCQUFJLEtBQUssVUFBVTtBQUNmLG1CQUFLLFNBQVMsS0FBSyxNQUFTO0FBQzVCLG1CQUFLLFFBQVE7QUFBQSxZQUNqQjtBQUFBLFVBQ0o7QUFBQSxRQUNKO0FBQUEsUUFDQSxJQUFJLDBCQUEwQjtBQUMxQixpQkFBTyxLQUFLO0FBQUEsUUFDaEI7QUFBQSxRQUNBLElBQUksMEJBQTBCO0FBQzFCLGNBQUksS0FBSyxjQUFjO0FBQ25CLG1CQUFPO0FBQUEsVUFDWDtBQUNBLGNBQUksQ0FBQyxLQUFLLFVBQVU7QUFDaEIsaUJBQUssV0FBVyxJQUFJLFNBQVMsUUFBUTtBQUFBLFVBQ3pDO0FBQ0EsaUJBQU8sS0FBSyxTQUFTO0FBQUEsUUFDekI7QUFBQSxRQUNBLFVBQVU7QUFDTixjQUFJLEtBQUssVUFBVTtBQUNmLGlCQUFLLFNBQVMsUUFBUTtBQUN0QixpQkFBSyxXQUFXO0FBQUEsVUFDcEI7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUNBLFVBQU0sMEJBQU4sTUFBOEI7QUFBQSxRQUMxQixJQUFJLFFBQVE7QUFDUixjQUFJLENBQUMsS0FBSyxRQUFRO0FBR2QsaUJBQUssU0FBUyxJQUFJLGFBQWE7QUFBQSxVQUNuQztBQUNBLGlCQUFPLEtBQUs7QUFBQSxRQUNoQjtBQUFBLFFBQ0EsU0FBUztBQUNMLGNBQUksQ0FBQyxLQUFLLFFBQVE7QUFJZCxpQkFBSyxTQUFTLGtCQUFrQjtBQUFBLFVBQ3BDLE9BQ0s7QUFDRCxpQkFBSyxPQUFPLE9BQU87QUFBQSxVQUN2QjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFVBQVU7QUFDTixjQUFJLENBQUMsS0FBSyxRQUFRO0FBRWQsaUJBQUssU0FBUyxrQkFBa0I7QUFBQSxVQUNwQyxXQUNTLEtBQUssa0JBQWtCLGNBQWM7QUFFMUMsaUJBQUssT0FBTyxRQUFRO0FBQUEsVUFDeEI7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUNBLGNBQVEsMEJBQTBCO0FBQUE7QUFBQTs7O0FDL0ZsQztBQUFBO0FBQUE7QUFLQSxhQUFPLGVBQWUsU0FBUyxjQUFjLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDNUQsY0FBUSw4QkFBOEIsUUFBUSw0QkFBNEI7QUFDMUUsVUFBTSxpQkFBaUI7QUFDdkIsVUFBSTtBQUNKLE9BQUMsU0FBVUMsb0JBQW1CO0FBQzFCLFFBQUFBLG1CQUFrQixXQUFXO0FBQzdCLFFBQUFBLG1CQUFrQixZQUFZO0FBQUEsTUFDbEMsR0FBRyxzQkFBc0Isb0JBQW9CLENBQUMsRUFBRTtBQUNoRCxVQUFNLDRCQUFOLE1BQWdDO0FBQUEsUUFDNUIsY0FBYztBQUNWLGVBQUssVUFBVSxvQkFBSSxJQUFJO0FBQUEsUUFDM0I7QUFBQSxRQUNBLG1CQUFtQixTQUFTO0FBQ3hCLGNBQUksUUFBUSxPQUFPLE1BQU07QUFDckI7QUFBQSxVQUNKO0FBQ0EsZ0JBQU0sU0FBUyxJQUFJLGtCQUFrQixDQUFDO0FBQ3RDLGdCQUFNLE9BQU8sSUFBSSxXQUFXLFFBQVEsR0FBRyxDQUFDO0FBQ3hDLGVBQUssQ0FBQyxJQUFJLGtCQUFrQjtBQUM1QixlQUFLLFFBQVEsSUFBSSxRQUFRLElBQUksTUFBTTtBQUNuQyxrQkFBUSxvQkFBb0I7QUFBQSxRQUNoQztBQUFBLFFBQ0EsTUFBTSxpQkFBaUJDLFFBQU8sSUFBSTtBQUM5QixnQkFBTSxTQUFTLEtBQUssUUFBUSxJQUFJLEVBQUU7QUFDbEMsY0FBSSxXQUFXLFFBQVc7QUFDdEI7QUFBQSxVQUNKO0FBQ0EsZ0JBQU0sT0FBTyxJQUFJLFdBQVcsUUFBUSxHQUFHLENBQUM7QUFDeEMsa0JBQVEsTUFBTSxNQUFNLEdBQUcsa0JBQWtCLFNBQVM7QUFBQSxRQUN0RDtBQUFBLFFBQ0EsUUFBUSxJQUFJO0FBQ1IsZUFBSyxRQUFRLE9BQU8sRUFBRTtBQUFBLFFBQzFCO0FBQUEsUUFDQSxVQUFVO0FBQ04sZUFBSyxRQUFRLE1BQU07QUFBQSxRQUN2QjtBQUFBLE1BQ0o7QUFDQSxjQUFRLDRCQUE0QjtBQUNwQyxVQUFNLHFDQUFOLE1BQXlDO0FBQUEsUUFDckMsWUFBWSxRQUFRO0FBQ2hCLGVBQUssT0FBTyxJQUFJLFdBQVcsUUFBUSxHQUFHLENBQUM7QUFBQSxRQUMzQztBQUFBLFFBQ0EsSUFBSSwwQkFBMEI7QUFDMUIsaUJBQU8sUUFBUSxLQUFLLEtBQUssTUFBTSxDQUFDLE1BQU0sa0JBQWtCO0FBQUEsUUFDNUQ7QUFBQSxRQUNBLElBQUksMEJBQTBCO0FBQzFCLGdCQUFNLElBQUksTUFBTSx5RUFBeUU7QUFBQSxRQUM3RjtBQUFBLE1BQ0o7QUFDQSxVQUFNLDJDQUFOLE1BQStDO0FBQUEsUUFDM0MsWUFBWSxRQUFRO0FBQ2hCLGVBQUssUUFBUSxJQUFJLG1DQUFtQyxNQUFNO0FBQUEsUUFDOUQ7QUFBQSxRQUNBLFNBQVM7QUFBQSxRQUNUO0FBQUEsUUFDQSxVQUFVO0FBQUEsUUFDVjtBQUFBLE1BQ0o7QUFDQSxVQUFNLDhCQUFOLE1BQWtDO0FBQUEsUUFDOUIsY0FBYztBQUNWLGVBQUssT0FBTztBQUFBLFFBQ2hCO0FBQUEsUUFDQSw4QkFBOEIsU0FBUztBQUNuQyxnQkFBTSxTQUFTLFFBQVE7QUFDdkIsY0FBSSxXQUFXLFFBQVc7QUFDdEIsbUJBQU8sSUFBSSxlQUFlLHdCQUF3QjtBQUFBLFVBQ3REO0FBQ0EsaUJBQU8sSUFBSSx5Q0FBeUMsTUFBTTtBQUFBLFFBQzlEO0FBQUEsTUFDSjtBQUNBLGNBQVEsOEJBQThCO0FBQUE7QUFBQTs7O0FDM0V0QztBQUFBO0FBQUE7QUFLQSxhQUFPLGVBQWUsU0FBUyxjQUFjLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDNUQsY0FBUSxZQUFZO0FBQ3BCLFVBQU0sUUFBUTtBQUNkLFVBQU0sWUFBTixNQUFnQjtBQUFBLFFBQ1osWUFBWSxXQUFXLEdBQUc7QUFDdEIsY0FBSSxZQUFZLEdBQUc7QUFDZixrQkFBTSxJQUFJLE1BQU0saUNBQWlDO0FBQUEsVUFDckQ7QUFDQSxlQUFLLFlBQVk7QUFDakIsZUFBSyxVQUFVO0FBQ2YsZUFBSyxXQUFXLENBQUM7QUFBQSxRQUNyQjtBQUFBLFFBQ0EsS0FBSyxPQUFPO0FBQ1IsaUJBQU8sSUFBSSxRQUFRLENBQUMsU0FBUyxXQUFXO0FBQ3BDLGlCQUFLLFNBQVMsS0FBSyxFQUFFLE9BQU8sU0FBUyxPQUFPLENBQUM7QUFDN0MsaUJBQUssUUFBUTtBQUFBLFVBQ2pCLENBQUM7QUFBQSxRQUNMO0FBQUEsUUFDQSxJQUFJLFNBQVM7QUFDVCxpQkFBTyxLQUFLO0FBQUEsUUFDaEI7QUFBQSxRQUNBLFVBQVU7QUFDTixjQUFJLEtBQUssU0FBUyxXQUFXLEtBQUssS0FBSyxZQUFZLEtBQUssV0FBVztBQUMvRDtBQUFBLFVBQ0o7QUFDQSxXQUFDLEdBQUcsTUFBTSxTQUFTLEVBQUUsTUFBTSxhQUFhLE1BQU0sS0FBSyxVQUFVLENBQUM7QUFBQSxRQUNsRTtBQUFBLFFBQ0EsWUFBWTtBQUNSLGNBQUksS0FBSyxTQUFTLFdBQVcsS0FBSyxLQUFLLFlBQVksS0FBSyxXQUFXO0FBQy9EO0FBQUEsVUFDSjtBQUNBLGdCQUFNLE9BQU8sS0FBSyxTQUFTLE1BQU07QUFDakMsZUFBSztBQUNMLGNBQUksS0FBSyxVQUFVLEtBQUssV0FBVztBQUMvQixrQkFBTSxJQUFJLE1BQU0sdUJBQXVCO0FBQUEsVUFDM0M7QUFDQSxjQUFJO0FBQ0Esa0JBQU0sU0FBUyxLQUFLLE1BQU07QUFDMUIsZ0JBQUksa0JBQWtCLFNBQVM7QUFDM0IscUJBQU8sS0FBSyxDQUFDLFVBQVU7QUFDbkIscUJBQUs7QUFDTCxxQkFBSyxRQUFRLEtBQUs7QUFDbEIscUJBQUssUUFBUTtBQUFBLGNBQ2pCLEdBQUcsQ0FBQyxRQUFRO0FBQ1IscUJBQUs7QUFDTCxxQkFBSyxPQUFPLEdBQUc7QUFDZixxQkFBSyxRQUFRO0FBQUEsY0FDakIsQ0FBQztBQUFBLFlBQ0wsT0FDSztBQUNELG1CQUFLO0FBQ0wsbUJBQUssUUFBUSxNQUFNO0FBQ25CLG1CQUFLLFFBQVE7QUFBQSxZQUNqQjtBQUFBLFVBQ0osU0FDTyxLQUFLO0FBQ1IsaUJBQUs7QUFDTCxpQkFBSyxPQUFPLEdBQUc7QUFDZixpQkFBSyxRQUFRO0FBQUEsVUFDakI7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUNBLGNBQVEsWUFBWTtBQUFBO0FBQUE7OztBQ25FcEI7QUFBQTtBQUFBO0FBS0EsYUFBTyxlQUFlLFNBQVMsY0FBYyxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQzVELGNBQVEsOEJBQThCLFFBQVEsd0JBQXdCLFFBQVEsZ0JBQWdCO0FBQzlGLFVBQU0sUUFBUTtBQUNkLFVBQU1DLE1BQUs7QUFDWCxVQUFNLFdBQVc7QUFDakIsVUFBTSxjQUFjO0FBQ3BCLFVBQUlDO0FBQ0osT0FBQyxTQUFVQSxnQkFBZTtBQUN0QixpQkFBUyxHQUFHLE9BQU87QUFDZixjQUFJLFlBQVk7QUFDaEIsaUJBQU8sYUFBYUQsSUFBRyxLQUFLLFVBQVUsTUFBTSxLQUFLQSxJQUFHLEtBQUssVUFBVSxPQUFPLEtBQ3RFQSxJQUFHLEtBQUssVUFBVSxPQUFPLEtBQUtBLElBQUcsS0FBSyxVQUFVLE9BQU8sS0FBS0EsSUFBRyxLQUFLLFVBQVUsZ0JBQWdCO0FBQUEsUUFDdEc7QUFDQSxRQUFBQyxlQUFjLEtBQUs7QUFBQSxNQUN2QixHQUFHQSxtQkFBa0IsUUFBUSxnQkFBZ0JBLGlCQUFnQixDQUFDLEVBQUU7QUFDaEUsVUFBTUMseUJBQU4sTUFBNEI7QUFBQSxRQUN4QixjQUFjO0FBQ1YsZUFBSyxlQUFlLElBQUksU0FBUyxRQUFRO0FBQ3pDLGVBQUssZUFBZSxJQUFJLFNBQVMsUUFBUTtBQUN6QyxlQUFLLHdCQUF3QixJQUFJLFNBQVMsUUFBUTtBQUFBLFFBQ3REO0FBQUEsUUFDQSxVQUFVO0FBQ04sZUFBSyxhQUFhLFFBQVE7QUFDMUIsZUFBSyxhQUFhLFFBQVE7QUFBQSxRQUM5QjtBQUFBLFFBQ0EsSUFBSSxVQUFVO0FBQ1YsaUJBQU8sS0FBSyxhQUFhO0FBQUEsUUFDN0I7QUFBQSxRQUNBLFVBQVUsT0FBTztBQUNiLGVBQUssYUFBYSxLQUFLLEtBQUssUUFBUSxLQUFLLENBQUM7QUFBQSxRQUM5QztBQUFBLFFBQ0EsSUFBSSxVQUFVO0FBQ1YsaUJBQU8sS0FBSyxhQUFhO0FBQUEsUUFDN0I7QUFBQSxRQUNBLFlBQVk7QUFDUixlQUFLLGFBQWEsS0FBSyxNQUFTO0FBQUEsUUFDcEM7QUFBQSxRQUNBLElBQUksbUJBQW1CO0FBQ25CLGlCQUFPLEtBQUssc0JBQXNCO0FBQUEsUUFDdEM7QUFBQSxRQUNBLG1CQUFtQixNQUFNO0FBQ3JCLGVBQUssc0JBQXNCLEtBQUssSUFBSTtBQUFBLFFBQ3hDO0FBQUEsUUFDQSxRQUFRLE9BQU87QUFDWCxjQUFJLGlCQUFpQixPQUFPO0FBQ3hCLG1CQUFPO0FBQUEsVUFDWCxPQUNLO0FBQ0QsbUJBQU8sSUFBSSxNQUFNLGtDQUFrQ0YsSUFBRyxPQUFPLE1BQU0sT0FBTyxJQUFJLE1BQU0sVUFBVSxTQUFTLEVBQUU7QUFBQSxVQUM3RztBQUFBLFFBQ0o7QUFBQSxNQUNKO0FBQ0EsY0FBUSx3QkFBd0JFO0FBQ2hDLFVBQUk7QUFDSixPQUFDLFNBQVVDLCtCQUE4QjtBQUNyQyxpQkFBUyxZQUFZLFNBQVM7QUFDMUIsY0FBSTtBQUNKLGNBQUk7QUFDSixjQUFJO0FBQ0osZ0JBQU0sa0JBQWtCLG9CQUFJLElBQUk7QUFDaEMsY0FBSTtBQUNKLGdCQUFNLHNCQUFzQixvQkFBSSxJQUFJO0FBQ3BDLGNBQUksWUFBWSxVQUFhLE9BQU8sWUFBWSxVQUFVO0FBQ3RELHNCQUFVLFdBQVc7QUFBQSxVQUN6QixPQUNLO0FBQ0Qsc0JBQVUsUUFBUSxXQUFXO0FBQzdCLGdCQUFJLFFBQVEsbUJBQW1CLFFBQVc7QUFDdEMsK0JBQWlCLFFBQVE7QUFDekIsOEJBQWdCLElBQUksZUFBZSxNQUFNLGNBQWM7QUFBQSxZQUMzRDtBQUNBLGdCQUFJLFFBQVEsb0JBQW9CLFFBQVc7QUFDdkMseUJBQVcsV0FBVyxRQUFRLGlCQUFpQjtBQUMzQyxnQ0FBZ0IsSUFBSSxRQUFRLE1BQU0sT0FBTztBQUFBLGNBQzdDO0FBQUEsWUFDSjtBQUNBLGdCQUFJLFFBQVEsdUJBQXVCLFFBQVc7QUFDMUMsbUNBQXFCLFFBQVE7QUFDN0Isa0NBQW9CLElBQUksbUJBQW1CLE1BQU0sa0JBQWtCO0FBQUEsWUFDdkU7QUFDQSxnQkFBSSxRQUFRLHdCQUF3QixRQUFXO0FBQzNDLHlCQUFXLFdBQVcsUUFBUSxxQkFBcUI7QUFDL0Msb0NBQW9CLElBQUksUUFBUSxNQUFNLE9BQU87QUFBQSxjQUNqRDtBQUFBLFlBQ0o7QUFBQSxVQUNKO0FBQ0EsY0FBSSx1QkFBdUIsUUFBVztBQUNsQyxrQ0FBc0IsR0FBRyxNQUFNLFNBQVMsRUFBRSxnQkFBZ0I7QUFDMUQsZ0NBQW9CLElBQUksbUJBQW1CLE1BQU0sa0JBQWtCO0FBQUEsVUFDdkU7QUFDQSxpQkFBTyxFQUFFLFNBQVMsZ0JBQWdCLGlCQUFpQixvQkFBb0Isb0JBQW9CO0FBQUEsUUFDL0Y7QUFDQSxRQUFBQSw4QkFBNkIsY0FBYztBQUFBLE1BQy9DLEdBQUcsaUNBQWlDLCtCQUErQixDQUFDLEVBQUU7QUFDdEUsVUFBTSw4QkFBTixjQUEwQ0QsdUJBQXNCO0FBQUEsUUFDNUQsWUFBWSxVQUFVLFNBQVM7QUFDM0IsZ0JBQU07QUFDTixlQUFLLFdBQVc7QUFDaEIsZUFBSyxVQUFVLDZCQUE2QixZQUFZLE9BQU87QUFDL0QsZUFBSyxVQUFVLEdBQUcsTUFBTSxTQUFTLEVBQUUsY0FBYyxPQUFPLEtBQUssUUFBUSxPQUFPO0FBQzVFLGVBQUsseUJBQXlCO0FBQzlCLGVBQUssb0JBQW9CO0FBQ3pCLGVBQUssZUFBZTtBQUNwQixlQUFLLGdCQUFnQixJQUFJLFlBQVksVUFBVSxDQUFDO0FBQUEsUUFDcEQ7QUFBQSxRQUNBLElBQUksc0JBQXNCLFNBQVM7QUFDL0IsZUFBSyx5QkFBeUI7QUFBQSxRQUNsQztBQUFBLFFBQ0EsSUFBSSx3QkFBd0I7QUFDeEIsaUJBQU8sS0FBSztBQUFBLFFBQ2hCO0FBQUEsUUFDQSxPQUFPLFVBQVU7QUFDYixlQUFLLG9CQUFvQjtBQUN6QixlQUFLLGVBQWU7QUFDcEIsZUFBSyxzQkFBc0I7QUFDM0IsZUFBSyxXQUFXO0FBQ2hCLGdCQUFNLFNBQVMsS0FBSyxTQUFTLE9BQU8sQ0FBQyxTQUFTO0FBQzFDLGlCQUFLLE9BQU8sSUFBSTtBQUFBLFVBQ3BCLENBQUM7QUFDRCxlQUFLLFNBQVMsUUFBUSxDQUFDLFVBQVUsS0FBSyxVQUFVLEtBQUssQ0FBQztBQUN0RCxlQUFLLFNBQVMsUUFBUSxNQUFNLEtBQUssVUFBVSxDQUFDO0FBQzVDLGlCQUFPO0FBQUEsUUFDWDtBQUFBLFFBQ0EsT0FBTyxNQUFNO0FBQ1QsY0FBSTtBQUNBLGlCQUFLLE9BQU8sT0FBTyxJQUFJO0FBQ3ZCLG1CQUFPLE1BQU07QUFDVCxrQkFBSSxLQUFLLHNCQUFzQixJQUFJO0FBQy9CLHNCQUFNLFVBQVUsS0FBSyxPQUFPLGVBQWUsSUFBSTtBQUMvQyxvQkFBSSxDQUFDLFNBQVM7QUFDVjtBQUFBLGdCQUNKO0FBQ0Esc0JBQU0sZ0JBQWdCLFFBQVEsSUFBSSxnQkFBZ0I7QUFDbEQsb0JBQUksQ0FBQyxlQUFlO0FBQ2hCLHVCQUFLLFVBQVUsSUFBSSxNQUFNO0FBQUEsRUFBbUQsS0FBSyxVQUFVLE9BQU8sWUFBWSxPQUFPLENBQUMsQ0FBQyxFQUFFLENBQUM7QUFDMUg7QUFBQSxnQkFDSjtBQUNBLHNCQUFNLFNBQVMsU0FBUyxhQUFhO0FBQ3JDLG9CQUFJLE1BQU0sTUFBTSxHQUFHO0FBQ2YsdUJBQUssVUFBVSxJQUFJLE1BQU0sOENBQThDLGFBQWEsRUFBRSxDQUFDO0FBQ3ZGO0FBQUEsZ0JBQ0o7QUFDQSxxQkFBSyxvQkFBb0I7QUFBQSxjQUM3QjtBQUNBLG9CQUFNLE9BQU8sS0FBSyxPQUFPLFlBQVksS0FBSyxpQkFBaUI7QUFDM0Qsa0JBQUksU0FBUyxRQUFXO0FBRXBCLHFCQUFLLHVCQUF1QjtBQUM1QjtBQUFBLGNBQ0o7QUFDQSxtQkFBSyx5QkFBeUI7QUFDOUIsbUJBQUssb0JBQW9CO0FBS3pCLG1CQUFLLGNBQWMsS0FBSyxZQUFZO0FBQ2hDLHNCQUFNLFFBQVEsS0FBSyxRQUFRLG1CQUFtQixTQUN4QyxNQUFNLEtBQUssUUFBUSxlQUFlLE9BQU8sSUFBSSxJQUM3QztBQUNOLHNCQUFNLFVBQVUsTUFBTSxLQUFLLFFBQVEsbUJBQW1CLE9BQU8sT0FBTyxLQUFLLE9BQU87QUFDaEYscUJBQUssU0FBUyxPQUFPO0FBQUEsY0FDekIsQ0FBQyxFQUFFLE1BQU0sQ0FBQyxVQUFVO0FBQ2hCLHFCQUFLLFVBQVUsS0FBSztBQUFBLGNBQ3hCLENBQUM7QUFBQSxZQUNMO0FBQUEsVUFDSixTQUNPLE9BQU87QUFDVixpQkFBSyxVQUFVLEtBQUs7QUFBQSxVQUN4QjtBQUFBLFFBQ0o7QUFBQSxRQUNBLDJCQUEyQjtBQUN2QixjQUFJLEtBQUsscUJBQXFCO0FBQzFCLGlCQUFLLG9CQUFvQixRQUFRO0FBQ2pDLGlCQUFLLHNCQUFzQjtBQUFBLFVBQy9CO0FBQUEsUUFDSjtBQUFBLFFBQ0EseUJBQXlCO0FBQ3JCLGVBQUsseUJBQXlCO0FBQzlCLGNBQUksS0FBSywwQkFBMEIsR0FBRztBQUNsQztBQUFBLFVBQ0o7QUFDQSxlQUFLLHVCQUF1QixHQUFHLE1BQU0sU0FBUyxFQUFFLE1BQU0sV0FBVyxDQUFDLE9BQU8sWUFBWTtBQUNqRixpQkFBSyxzQkFBc0I7QUFDM0IsZ0JBQUksVUFBVSxLQUFLLGNBQWM7QUFDN0IsbUJBQUssbUJBQW1CLEVBQUUsY0FBYyxPQUFPLGFBQWEsUUFBUSxDQUFDO0FBQ3JFLG1CQUFLLHVCQUF1QjtBQUFBLFlBQ2hDO0FBQUEsVUFDSixHQUFHLEtBQUssd0JBQXdCLEtBQUssY0FBYyxLQUFLLHNCQUFzQjtBQUFBLFFBQ2xGO0FBQUEsTUFDSjtBQUNBLGNBQVEsOEJBQThCO0FBQUE7QUFBQTs7O0FDcE10QztBQUFBO0FBQUE7QUFLQSxhQUFPLGVBQWUsU0FBUyxjQUFjLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDNUQsY0FBUSwrQkFBK0IsUUFBUSx3QkFBd0IsUUFBUSxnQkFBZ0I7QUFDL0YsVUFBTSxRQUFRO0FBQ2QsVUFBTUUsTUFBSztBQUNYLFVBQU0sY0FBYztBQUNwQixVQUFNLFdBQVc7QUFDakIsVUFBTSxnQkFBZ0I7QUFDdEIsVUFBTSxPQUFPO0FBQ2IsVUFBSUM7QUFDSixPQUFDLFNBQVVBLGdCQUFlO0FBQ3RCLGlCQUFTLEdBQUcsT0FBTztBQUNmLGNBQUksWUFBWTtBQUNoQixpQkFBTyxhQUFhRCxJQUFHLEtBQUssVUFBVSxPQUFPLEtBQUtBLElBQUcsS0FBSyxVQUFVLE9BQU8sS0FDdkVBLElBQUcsS0FBSyxVQUFVLE9BQU8sS0FBS0EsSUFBRyxLQUFLLFVBQVUsS0FBSztBQUFBLFFBQzdEO0FBQ0EsUUFBQUMsZUFBYyxLQUFLO0FBQUEsTUFDdkIsR0FBR0EsbUJBQWtCLFFBQVEsZ0JBQWdCQSxpQkFBZ0IsQ0FBQyxFQUFFO0FBQ2hFLFVBQU1DLHlCQUFOLE1BQTRCO0FBQUEsUUFDeEIsY0FBYztBQUNWLGVBQUssZUFBZSxJQUFJLFNBQVMsUUFBUTtBQUN6QyxlQUFLLGVBQWUsSUFBSSxTQUFTLFFBQVE7QUFBQSxRQUM3QztBQUFBLFFBQ0EsVUFBVTtBQUNOLGVBQUssYUFBYSxRQUFRO0FBQzFCLGVBQUssYUFBYSxRQUFRO0FBQUEsUUFDOUI7QUFBQSxRQUNBLElBQUksVUFBVTtBQUNWLGlCQUFPLEtBQUssYUFBYTtBQUFBLFFBQzdCO0FBQUEsUUFDQSxVQUFVLE9BQU8sU0FBUyxPQUFPO0FBQzdCLGVBQUssYUFBYSxLQUFLLENBQUMsS0FBSyxRQUFRLEtBQUssR0FBRyxTQUFTLEtBQUssQ0FBQztBQUFBLFFBQ2hFO0FBQUEsUUFDQSxJQUFJLFVBQVU7QUFDVixpQkFBTyxLQUFLLGFBQWE7QUFBQSxRQUM3QjtBQUFBLFFBQ0EsWUFBWTtBQUNSLGVBQUssYUFBYSxLQUFLLE1BQVM7QUFBQSxRQUNwQztBQUFBLFFBQ0EsUUFBUSxPQUFPO0FBQ1gsY0FBSSxpQkFBaUIsT0FBTztBQUN4QixtQkFBTztBQUFBLFVBQ1gsT0FDSztBQUNELG1CQUFPLElBQUksTUFBTSxrQ0FBa0NGLElBQUcsT0FBTyxNQUFNLE9BQU8sSUFBSSxNQUFNLFVBQVUsU0FBUyxFQUFFO0FBQUEsVUFDN0c7QUFBQSxRQUNKO0FBQUEsTUFDSjtBQUNBLGNBQVEsd0JBQXdCRTtBQUNoQyxVQUFJO0FBQ0osT0FBQyxTQUFVQywrQkFBOEI7QUFDckMsaUJBQVMsWUFBWSxTQUFTO0FBQzFCLGNBQUksWUFBWSxVQUFhLE9BQU8sWUFBWSxVQUFVO0FBQ3RELG1CQUFPLEVBQUUsU0FBUyxXQUFXLFNBQVMscUJBQXFCLEdBQUcsTUFBTSxTQUFTLEVBQUUsZ0JBQWdCLFFBQVE7QUFBQSxVQUMzRyxPQUNLO0FBQ0QsbUJBQU8sRUFBRSxTQUFTLFFBQVEsV0FBVyxTQUFTLGdCQUFnQixRQUFRLGdCQUFnQixvQkFBb0IsUUFBUSx1QkFBdUIsR0FBRyxNQUFNLFNBQVMsRUFBRSxnQkFBZ0IsUUFBUTtBQUFBLFVBQ3pMO0FBQUEsUUFDSjtBQUNBLFFBQUFBLDhCQUE2QixjQUFjO0FBQUEsTUFDL0MsR0FBRyxpQ0FBaUMsK0JBQStCLENBQUMsRUFBRTtBQUN0RSxVQUFNLCtCQUFOLGNBQTJDRCx1QkFBc0I7QUFBQSxRQUM3RCxZQUFZLFVBQVUsU0FBUztBQUMzQixnQkFBTTtBQUNOLGVBQUssV0FBVztBQUNoQixlQUFLLFVBQVUsNkJBQTZCLFlBQVksT0FBTztBQUMvRCxlQUFLLGFBQWE7QUFDbEIsZUFBSyxpQkFBaUIsSUFBSSxZQUFZLFVBQVUsQ0FBQztBQUNqRCxlQUFLLFNBQVMsUUFBUSxDQUFDLFVBQVUsS0FBSyxVQUFVLEtBQUssQ0FBQztBQUN0RCxlQUFLLFNBQVMsUUFBUSxNQUFNLEtBQUssVUFBVSxDQUFDO0FBQUEsUUFDaEQ7QUFBQSxRQUNBLE1BQU0sTUFBTSxLQUFLO0FBQ2IsaUJBQU8sS0FBSyxlQUFlLEtBQUssWUFBWTtBQUN4QyxrQkFBTSxVQUFVLEtBQUssUUFBUSxtQkFBbUIsT0FBTyxLQUFLLEtBQUssT0FBTyxFQUFFLEtBQUssQ0FBQyxXQUFXO0FBQ3ZGLGtCQUFJLEtBQUssUUFBUSxtQkFBbUIsUUFBVztBQUMzQyx1QkFBTyxLQUFLLFFBQVEsZUFBZSxPQUFPLE1BQU07QUFBQSxjQUNwRCxPQUNLO0FBQ0QsdUJBQU87QUFBQSxjQUNYO0FBQUEsWUFDSixDQUFDO0FBQ0QsbUJBQU8sUUFBUSxLQUFLLENBQUMsV0FBVztBQUM1QixvQkFBTSxVQUFVLENBQUM7QUFDakIsc0JBQVEsS0FBSyxlQUFlLE9BQU8sV0FBVyxTQUFTLEdBQUcsSUFBSTtBQUM5RCxzQkFBUSxLQUFLLElBQUk7QUFDakIscUJBQU8sS0FBSyxRQUFRLEtBQUssU0FBUyxNQUFNO0FBQUEsWUFDNUMsR0FBRyxDQUFDLFVBQVU7QUFDVixtQkFBSyxVQUFVLEtBQUs7QUFDcEIsb0JBQU07QUFBQSxZQUNWLENBQUM7QUFBQSxVQUNMLENBQUM7QUFBQSxRQUNMO0FBQUEsUUFDQSxNQUFNLFFBQVEsS0FBSyxTQUFTLE1BQU07QUFDOUIsY0FBSTtBQUNBLGtCQUFNLEtBQUssU0FBUyxNQUFNLFFBQVEsS0FBSyxFQUFFLEdBQUcsT0FBTztBQUNuRCxtQkFBTyxLQUFLLFNBQVMsTUFBTSxJQUFJO0FBQUEsVUFDbkMsU0FDTyxPQUFPO0FBQ1YsaUJBQUssWUFBWSxPQUFPLEdBQUc7QUFDM0IsbUJBQU8sUUFBUSxPQUFPLEtBQUs7QUFBQSxVQUMvQjtBQUFBLFFBQ0o7QUFBQSxRQUNBLFlBQVksT0FBTyxLQUFLO0FBQ3BCLGVBQUs7QUFDTCxlQUFLLFVBQVUsT0FBTyxLQUFLLEtBQUssVUFBVTtBQUFBLFFBQzlDO0FBQUEsUUFDQSxNQUFNO0FBQ0YsZUFBSyxTQUFTLElBQUk7QUFBQSxRQUN0QjtBQUFBLE1BQ0o7QUFDQSxjQUFRLCtCQUErQjtBQUFBO0FBQUE7OztBQ2xIdkM7QUFBQTtBQUFBO0FBS0EsYUFBTyxlQUFlLFNBQVMsY0FBYyxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQzVELGNBQVEsd0JBQXdCO0FBQ2hDLFVBQU0sS0FBSztBQUNYLFVBQU0sS0FBSztBQUNYLFVBQU0sT0FBTztBQUNiLFVBQU0sd0JBQU4sTUFBNEI7QUFBQSxRQUN4QixZQUFZLFdBQVcsU0FBUztBQUM1QixlQUFLLFlBQVk7QUFDakIsZUFBSyxVQUFVLENBQUM7QUFDaEIsZUFBSyxlQUFlO0FBQUEsUUFDeEI7QUFBQSxRQUNBLElBQUksV0FBVztBQUNYLGlCQUFPLEtBQUs7QUFBQSxRQUNoQjtBQUFBLFFBQ0EsT0FBTyxPQUFPO0FBQ1YsZ0JBQU0sV0FBVyxPQUFPLFVBQVUsV0FBVyxLQUFLLFdBQVcsT0FBTyxLQUFLLFNBQVMsSUFBSTtBQUN0RixlQUFLLFFBQVEsS0FBSyxRQUFRO0FBQzFCLGVBQUssZ0JBQWdCLFNBQVM7QUFBQSxRQUNsQztBQUFBLFFBQ0EsZUFBZSxnQkFBZ0IsT0FBTztBQUNsQyxjQUFJLEtBQUssUUFBUSxXQUFXLEdBQUc7QUFDM0IsbUJBQU87QUFBQSxVQUNYO0FBQ0EsY0FBSSxRQUFRO0FBQ1osY0FBSSxhQUFhO0FBQ2pCLGNBQUksU0FBUztBQUNiLGNBQUksaUJBQWlCO0FBQ3JCLGNBQUssUUFBTyxhQUFhLEtBQUssUUFBUSxRQUFRO0FBQzFDLGtCQUFNLFFBQVEsS0FBSyxRQUFRLFVBQVU7QUFDckMscUJBQVM7QUFDVCxtQkFBUSxRQUFPLFNBQVMsTUFBTSxRQUFRO0FBQ2xDLG9CQUFNLFFBQVEsTUFBTSxNQUFNO0FBQzFCLHNCQUFRLE9BQU87QUFBQSxnQkFDWCxLQUFLO0FBQ0QsMEJBQVEsT0FBTztBQUFBLG9CQUNYLEtBQUs7QUFDRCw4QkFBUTtBQUNSO0FBQUEsb0JBQ0osS0FBSztBQUNELDhCQUFRO0FBQ1I7QUFBQSxvQkFDSjtBQUNJLDhCQUFRO0FBQUEsa0JBQ2hCO0FBQ0E7QUFBQSxnQkFDSixLQUFLO0FBQ0QsMEJBQVEsT0FBTztBQUFBLG9CQUNYLEtBQUs7QUFDRCw4QkFBUTtBQUNSO0FBQUEsb0JBQ0osS0FBSztBQUNELDhCQUFRO0FBQ1I7QUFDQSw0QkFBTTtBQUFBLG9CQUNWO0FBQ0ksOEJBQVE7QUFBQSxrQkFDaEI7QUFDQTtBQUFBLGdCQUNKO0FBQ0ksMEJBQVE7QUFBQSxjQUNoQjtBQUNBO0FBQUEsWUFDSjtBQUNBLDhCQUFrQixNQUFNO0FBQ3hCO0FBQUEsVUFDSjtBQUNBLGNBQUksVUFBVSxHQUFHO0FBQ2IsbUJBQU87QUFBQSxVQUNYO0FBR0EsZ0JBQU0sU0FBUyxLQUFLLE1BQU0saUJBQWlCLE1BQU07QUFDakQsZ0JBQU0sU0FBUyxvQkFBSSxJQUFJO0FBQ3ZCLGdCQUFNLFVBQVUsS0FBSyxTQUFTLFFBQVEsT0FBTyxFQUFFLE1BQU0sSUFBSTtBQUN6RCxjQUFJLFFBQVEsU0FBUyxHQUFHO0FBQ3BCLG1CQUFPO0FBQUEsVUFDWDtBQUNBLG1CQUFTLElBQUksR0FBRyxJQUFJLFFBQVEsU0FBUyxHQUFHLEtBQUs7QUFDekMsa0JBQU0sU0FBUyxRQUFRLENBQUM7QUFDeEIsa0JBQU0sUUFBUSxPQUFPLFFBQVEsR0FBRztBQUNoQyxnQkFBSSxVQUFVLElBQUk7QUFDZCxvQkFBTSxJQUFJLE1BQU07QUFBQSxFQUF5RCxNQUFNLEVBQUU7QUFBQSxZQUNyRjtBQUNBLGtCQUFNLE1BQU0sT0FBTyxPQUFPLEdBQUcsS0FBSztBQUNsQyxrQkFBTSxRQUFRLE9BQU8sT0FBTyxRQUFRLENBQUMsRUFBRSxLQUFLO0FBQzVDLG1CQUFPLElBQUksZ0JBQWdCLElBQUksWUFBWSxJQUFJLEtBQUssS0FBSztBQUFBLFVBQzdEO0FBQ0EsaUJBQU87QUFBQSxRQUNYO0FBQUEsUUFDQSxZQUFZLFFBQVE7QUFDaEIsY0FBSSxLQUFLLGVBQWUsUUFBUTtBQUM1QixtQkFBTztBQUFBLFVBQ1g7QUFDQSxpQkFBTyxLQUFLLE1BQU0sTUFBTTtBQUFBLFFBQzVCO0FBQUEsUUFDQSxJQUFJLGdCQUFnQjtBQUNoQixpQkFBTyxLQUFLO0FBQUEsUUFDaEI7QUFBQSxRQUNBLE1BQU0sV0FBVztBQUNiLGNBQUksY0FBYyxHQUFHO0FBQ2pCLG1CQUFPLEtBQUssWUFBWTtBQUFBLFVBQzVCO0FBQ0EsY0FBSSxZQUFZLEtBQUssY0FBYztBQUMvQixrQkFBTSxJQUFJLE1BQU0sNEJBQTRCO0FBQUEsVUFDaEQ7QUFDQSxjQUFJLEtBQUssUUFBUSxDQUFDLEVBQUUsZUFBZSxXQUFXO0FBRTFDLGtCQUFNLFFBQVEsS0FBSyxRQUFRLENBQUM7QUFDNUIsaUJBQUssUUFBUSxNQUFNO0FBQ25CLGlCQUFLLGdCQUFnQjtBQUNyQixtQkFBTyxLQUFLLFNBQVMsS0FBSztBQUFBLFVBQzlCO0FBQ0EsY0FBSSxLQUFLLFFBQVEsQ0FBQyxFQUFFLGFBQWEsV0FBVztBQUV4QyxrQkFBTSxRQUFRLEtBQUssUUFBUSxDQUFDO0FBQzVCLGtCQUFNRSxVQUFTLEtBQUssU0FBUyxPQUFPLFNBQVM7QUFDN0MsaUJBQUssUUFBUSxDQUFDLElBQUksTUFBTSxNQUFNLFNBQVM7QUFDdkMsaUJBQUssZ0JBQWdCO0FBQ3JCLG1CQUFPQTtBQUFBLFVBQ1g7QUFDQSxnQkFBTSxTQUFTLEtBQUssWUFBWSxTQUFTO0FBQ3pDLGNBQUksZUFBZTtBQUNuQixjQUFJLGFBQWE7QUFDakIsaUJBQU8sWUFBWSxHQUFHO0FBQ2xCLGtCQUFNLFFBQVEsS0FBSyxRQUFRLFVBQVU7QUFDckMsZ0JBQUksTUFBTSxhQUFhLFdBQVc7QUFFOUIsb0JBQU0sWUFBWSxNQUFNLE1BQU0sR0FBRyxTQUFTO0FBQzFDLHFCQUFPLElBQUksV0FBVyxZQUFZO0FBQ2xDLDhCQUFnQjtBQUNoQixtQkFBSyxRQUFRLFVBQVUsSUFBSSxNQUFNLE1BQU0sU0FBUztBQUNoRCxtQkFBSyxnQkFBZ0I7QUFDckIsMkJBQWE7QUFBQSxZQUNqQixPQUNLO0FBRUQscUJBQU8sSUFBSSxPQUFPLFlBQVk7QUFDOUIsOEJBQWdCLE1BQU07QUFDdEIsbUJBQUssUUFBUSxNQUFNO0FBQ25CLG1CQUFLLGdCQUFnQixNQUFNO0FBQzNCLDJCQUFhLE1BQU07QUFBQSxZQUN2QjtBQUFBLFVBQ0o7QUFDQSxpQkFBTztBQUFBLFFBQ1g7QUFBQSxNQUNKO0FBQ0EsY0FBUSx3QkFBd0I7QUFBQTtBQUFBOzs7QUN2SmhDO0FBQUE7QUFBQTtBQUtBLGFBQU8sZUFBZSxTQUFTLGNBQWMsRUFBRSxPQUFPLEtBQUssQ0FBQztBQUM1RCxjQUFRLDBCQUEwQixRQUFRLG9CQUFvQixRQUFRLGtCQUFrQixRQUFRLHVCQUF1QixRQUFRLDZCQUE2QixRQUFRLCtCQUErQixRQUFRLHNDQUFzQyxRQUFRLGlDQUFpQyxRQUFRLHFCQUFxQixRQUFRLGtCQUFrQixRQUFRLG1CQUFtQixRQUFRLHVCQUF1QixRQUFRLHVCQUF1QixRQUFRLGNBQWMsUUFBUSxjQUFjLFFBQVEsUUFBUSxRQUFRLGFBQWEsUUFBUSxlQUFlLFFBQVEsZ0JBQWdCO0FBQzFpQixVQUFNLFFBQVE7QUFDZCxVQUFNQyxNQUFLO0FBQ1gsVUFBTSxhQUFhO0FBQ25CLFVBQU0sY0FBYztBQUNwQixVQUFNLFdBQVc7QUFDakIsVUFBTSxpQkFBaUI7QUFDdkIsVUFBSTtBQUNKLE9BQUMsU0FBVUMscUJBQW9CO0FBQzNCLFFBQUFBLG9CQUFtQixPQUFPLElBQUksV0FBVyxpQkFBaUIsaUJBQWlCO0FBQUEsTUFDL0UsR0FBRyx1QkFBdUIscUJBQXFCLENBQUMsRUFBRTtBQUNsRCxVQUFJO0FBQ0osT0FBQyxTQUFVQyxnQkFBZTtBQUN0QixpQkFBUyxHQUFHLE9BQU87QUFDZixpQkFBTyxPQUFPLFVBQVUsWUFBWSxPQUFPLFVBQVU7QUFBQSxRQUN6RDtBQUNBLFFBQUFBLGVBQWMsS0FBSztBQUFBLE1BQ3ZCLEdBQUcsa0JBQWtCLFFBQVEsZ0JBQWdCLGdCQUFnQixDQUFDLEVBQUU7QUFDaEUsVUFBSTtBQUNKLE9BQUMsU0FBVUMsdUJBQXNCO0FBQzdCLFFBQUFBLHNCQUFxQixPQUFPLElBQUksV0FBVyxpQkFBaUIsWUFBWTtBQUFBLE1BQzVFLEdBQUcseUJBQXlCLHVCQUF1QixDQUFDLEVBQUU7QUFDdEQsVUFBTSxlQUFOLE1BQW1CO0FBQUEsUUFDZixjQUFjO0FBQUEsUUFDZDtBQUFBLE1BQ0o7QUFDQSxjQUFRLGVBQWU7QUFDdkIsVUFBSTtBQUNKLE9BQUMsU0FBVUMscUJBQW9CO0FBQzNCLGlCQUFTLEdBQUcsT0FBTztBQUNmLGlCQUFPSixJQUFHLEtBQUssS0FBSztBQUFBLFFBQ3hCO0FBQ0EsUUFBQUksb0JBQW1CLEtBQUs7QUFBQSxNQUM1QixHQUFHLHVCQUF1QixxQkFBcUIsQ0FBQyxFQUFFO0FBQ2xELGNBQVEsYUFBYSxPQUFPLE9BQU87QUFBQSxRQUMvQixPQUFPLE1BQU07QUFBQSxRQUFFO0FBQUEsUUFDZixNQUFNLE1BQU07QUFBQSxRQUFFO0FBQUEsUUFDZCxNQUFNLE1BQU07QUFBQSxRQUFFO0FBQUEsUUFDZCxLQUFLLE1BQU07QUFBQSxRQUFFO0FBQUEsTUFDakIsQ0FBQztBQUNELFVBQUk7QUFDSixPQUFDLFNBQVVDLFFBQU87QUFDZCxRQUFBQSxPQUFNQSxPQUFNLEtBQUssSUFBSSxDQUFDLElBQUk7QUFDMUIsUUFBQUEsT0FBTUEsT0FBTSxVQUFVLElBQUksQ0FBQyxJQUFJO0FBQy9CLFFBQUFBLE9BQU1BLE9BQU0sU0FBUyxJQUFJLENBQUMsSUFBSTtBQUM5QixRQUFBQSxPQUFNQSxPQUFNLFNBQVMsSUFBSSxDQUFDLElBQUk7QUFBQSxNQUNsQyxHQUFHLFVBQVUsUUFBUSxRQUFRLFFBQVEsQ0FBQyxFQUFFO0FBQ3hDLFVBQUk7QUFDSixPQUFDLFNBQVVDLGNBQWE7QUFJcEIsUUFBQUEsYUFBWSxNQUFNO0FBSWxCLFFBQUFBLGFBQVksV0FBVztBQUl2QixRQUFBQSxhQUFZLFVBQVU7QUFJdEIsUUFBQUEsYUFBWSxVQUFVO0FBQUEsTUFDMUIsR0FBRyxnQkFBZ0IsUUFBUSxjQUFjLGNBQWMsQ0FBQyxFQUFFO0FBQzFELE9BQUMsU0FBVUQsUUFBTztBQUNkLGlCQUFTLFdBQVcsT0FBTztBQUN2QixjQUFJLENBQUNMLElBQUcsT0FBTyxLQUFLLEdBQUc7QUFDbkIsbUJBQU9LLE9BQU07QUFBQSxVQUNqQjtBQUNBLGtCQUFRLE1BQU0sWUFBWTtBQUMxQixrQkFBUSxPQUFPO0FBQUEsWUFDWCxLQUFLO0FBQ0QscUJBQU9BLE9BQU07QUFBQSxZQUNqQixLQUFLO0FBQ0QscUJBQU9BLE9BQU07QUFBQSxZQUNqQixLQUFLO0FBQ0QscUJBQU9BLE9BQU07QUFBQSxZQUNqQixLQUFLO0FBQ0QscUJBQU9BLE9BQU07QUFBQSxZQUNqQjtBQUNJLHFCQUFPQSxPQUFNO0FBQUEsVUFDckI7QUFBQSxRQUNKO0FBQ0EsUUFBQUEsT0FBTSxhQUFhO0FBQ25CLGlCQUFTLFNBQVMsT0FBTztBQUNyQixrQkFBUSxPQUFPO0FBQUEsWUFDWCxLQUFLQSxPQUFNO0FBQ1AscUJBQU87QUFBQSxZQUNYLEtBQUtBLE9BQU07QUFDUCxxQkFBTztBQUFBLFlBQ1gsS0FBS0EsT0FBTTtBQUNQLHFCQUFPO0FBQUEsWUFDWCxLQUFLQSxPQUFNO0FBQ1AscUJBQU87QUFBQSxZQUNYO0FBQ0kscUJBQU87QUFBQSxVQUNmO0FBQUEsUUFDSjtBQUNBLFFBQUFBLE9BQU0sV0FBVztBQUFBLE1BQ3JCLEdBQUcsVUFBVSxRQUFRLFFBQVEsUUFBUSxDQUFDLEVBQUU7QUFDeEMsVUFBSTtBQUNKLE9BQUMsU0FBVUUsY0FBYTtBQUNwQixRQUFBQSxhQUFZLE1BQU0sSUFBSTtBQUN0QixRQUFBQSxhQUFZLE1BQU0sSUFBSTtBQUFBLE1BQzFCLEdBQUcsZ0JBQWdCLFFBQVEsY0FBYyxjQUFjLENBQUMsRUFBRTtBQUMxRCxPQUFDLFNBQVVBLGNBQWE7QUFDcEIsaUJBQVMsV0FBVyxPQUFPO0FBQ3ZCLGNBQUksQ0FBQ1AsSUFBRyxPQUFPLEtBQUssR0FBRztBQUNuQixtQkFBT08sYUFBWTtBQUFBLFVBQ3ZCO0FBQ0Esa0JBQVEsTUFBTSxZQUFZO0FBQzFCLGNBQUksVUFBVSxRQUFRO0FBQ2xCLG1CQUFPQSxhQUFZO0FBQUEsVUFDdkIsT0FDSztBQUNELG1CQUFPQSxhQUFZO0FBQUEsVUFDdkI7QUFBQSxRQUNKO0FBQ0EsUUFBQUEsYUFBWSxhQUFhO0FBQUEsTUFDN0IsR0FBRyxnQkFBZ0IsUUFBUSxjQUFjLGNBQWMsQ0FBQyxFQUFFO0FBQzFELFVBQUk7QUFDSixPQUFDLFNBQVVDLHVCQUFzQjtBQUM3QixRQUFBQSxzQkFBcUIsT0FBTyxJQUFJLFdBQVcsaUJBQWlCLFlBQVk7QUFBQSxNQUM1RSxHQUFHLHlCQUF5QixRQUFRLHVCQUF1Qix1QkFBdUIsQ0FBQyxFQUFFO0FBQ3JGLFVBQUk7QUFDSixPQUFDLFNBQVVDLHVCQUFzQjtBQUM3QixRQUFBQSxzQkFBcUIsT0FBTyxJQUFJLFdBQVcsaUJBQWlCLFlBQVk7QUFBQSxNQUM1RSxHQUFHLHlCQUF5QixRQUFRLHVCQUF1Qix1QkFBdUIsQ0FBQyxFQUFFO0FBQ3JGLFVBQUk7QUFDSixPQUFDLFNBQVVDLG1CQUFrQjtBQUl6QixRQUFBQSxrQkFBaUJBLGtCQUFpQixRQUFRLElBQUksQ0FBQyxJQUFJO0FBSW5ELFFBQUFBLGtCQUFpQkEsa0JBQWlCLFVBQVUsSUFBSSxDQUFDLElBQUk7QUFJckQsUUFBQUEsa0JBQWlCQSxrQkFBaUIsa0JBQWtCLElBQUksQ0FBQyxJQUFJO0FBQUEsTUFDakUsR0FBRyxxQkFBcUIsUUFBUSxtQkFBbUIsbUJBQW1CLENBQUMsRUFBRTtBQUN6RSxVQUFNLGtCQUFOLE1BQU0seUJBQXdCLE1BQU07QUFBQSxRQUNoQyxZQUFZLE1BQU0sU0FBUztBQUN2QixnQkFBTSxPQUFPO0FBQ2IsZUFBSyxPQUFPO0FBQ1osaUJBQU8sZUFBZSxNQUFNLGlCQUFnQixTQUFTO0FBQUEsUUFDekQ7QUFBQSxNQUNKO0FBQ0EsY0FBUSxrQkFBa0I7QUFDMUIsVUFBSTtBQUNKLE9BQUMsU0FBVUMscUJBQW9CO0FBQzNCLGlCQUFTLEdBQUcsT0FBTztBQUNmLGdCQUFNLFlBQVk7QUFDbEIsaUJBQU8sYUFBYVgsSUFBRyxLQUFLLFVBQVUsa0JBQWtCO0FBQUEsUUFDNUQ7QUFDQSxRQUFBVyxvQkFBbUIsS0FBSztBQUFBLE1BQzVCLEdBQUcsdUJBQXVCLFFBQVEscUJBQXFCLHFCQUFxQixDQUFDLEVBQUU7QUFDL0UsVUFBSTtBQUNKLE9BQUMsU0FBVUMsaUNBQWdDO0FBQ3ZDLGlCQUFTLEdBQUcsT0FBTztBQUNmLGdCQUFNLFlBQVk7QUFDbEIsaUJBQU8sY0FBYyxVQUFVLFNBQVMsVUFBYSxVQUFVLFNBQVMsU0FBU1osSUFBRyxLQUFLLFVBQVUsNkJBQTZCLE1BQU0sVUFBVSxZQUFZLFVBQWFBLElBQUcsS0FBSyxVQUFVLE9BQU87QUFBQSxRQUN0TTtBQUNBLFFBQUFZLGdDQUErQixLQUFLO0FBQUEsTUFDeEMsR0FBRyxtQ0FBbUMsUUFBUSxpQ0FBaUMsaUNBQWlDLENBQUMsRUFBRTtBQUNuSCxVQUFJO0FBQ0osT0FBQyxTQUFVQyxzQ0FBcUM7QUFDNUMsaUJBQVMsR0FBRyxPQUFPO0FBQ2YsZ0JBQU0sWUFBWTtBQUNsQixpQkFBTyxhQUFhLFVBQVUsU0FBUyxhQUFhYixJQUFHLEtBQUssVUFBVSw2QkFBNkIsTUFBTSxVQUFVLFlBQVksVUFBYUEsSUFBRyxLQUFLLFVBQVUsT0FBTztBQUFBLFFBQ3pLO0FBQ0EsUUFBQWEscUNBQW9DLEtBQUs7QUFBQSxNQUM3QyxHQUFHLHdDQUF3QyxRQUFRLHNDQUFzQyxzQ0FBc0MsQ0FBQyxFQUFFO0FBQ2xJLFVBQUk7QUFDSixPQUFDLFNBQVVDLCtCQUE4QjtBQUNyQyxRQUFBQSw4QkFBNkIsVUFBVSxPQUFPLE9BQU87QUFBQSxVQUNqRCw4QkFBOEIsR0FBRztBQUM3QixtQkFBTyxJQUFJLGVBQWUsd0JBQXdCO0FBQUEsVUFDdEQ7QUFBQSxRQUNKLENBQUM7QUFDRCxpQkFBUyxHQUFHLE9BQU87QUFDZixpQkFBTywrQkFBK0IsR0FBRyxLQUFLLEtBQUssb0NBQW9DLEdBQUcsS0FBSztBQUFBLFFBQ25HO0FBQ0EsUUFBQUEsOEJBQTZCLEtBQUs7QUFBQSxNQUN0QyxHQUFHLGlDQUFpQyxRQUFRLCtCQUErQiwrQkFBK0IsQ0FBQyxFQUFFO0FBQzdHLFVBQUk7QUFDSixPQUFDLFNBQVVDLDZCQUE0QjtBQUNuQyxRQUFBQSw0QkFBMkIsVUFBVSxPQUFPLE9BQU87QUFBQSxVQUMvQyxpQkFBaUIsTUFBTSxJQUFJO0FBQ3ZCLG1CQUFPLEtBQUssaUJBQWlCLG1CQUFtQixNQUFNLEVBQUUsR0FBRyxDQUFDO0FBQUEsVUFDaEU7QUFBQSxVQUNBLFFBQVEsR0FBRztBQUFBLFVBQUU7QUFBQSxRQUNqQixDQUFDO0FBQ0QsaUJBQVMsR0FBRyxPQUFPO0FBQ2YsZ0JBQU0sWUFBWTtBQUNsQixpQkFBTyxhQUFhZixJQUFHLEtBQUssVUFBVSxnQkFBZ0IsS0FBS0EsSUFBRyxLQUFLLFVBQVUsT0FBTztBQUFBLFFBQ3hGO0FBQ0EsUUFBQWUsNEJBQTJCLEtBQUs7QUFBQSxNQUNwQyxHQUFHLCtCQUErQixRQUFRLDZCQUE2Qiw2QkFBNkIsQ0FBQyxFQUFFO0FBQ3ZHLFVBQUk7QUFDSixPQUFDLFNBQVVDLHVCQUFzQjtBQUM3QixRQUFBQSxzQkFBcUIsVUFBVSxPQUFPLE9BQU87QUFBQSxVQUN6QyxVQUFVLDZCQUE2QjtBQUFBLFVBQ3ZDLFFBQVEsMkJBQTJCO0FBQUEsUUFDdkMsQ0FBQztBQUNELGlCQUFTLEdBQUcsT0FBTztBQUNmLGdCQUFNLFlBQVk7QUFDbEIsaUJBQU8sYUFBYSw2QkFBNkIsR0FBRyxVQUFVLFFBQVEsS0FBSywyQkFBMkIsR0FBRyxVQUFVLE1BQU07QUFBQSxRQUM3SDtBQUNBLFFBQUFBLHNCQUFxQixLQUFLO0FBQUEsTUFDOUIsR0FBRyx5QkFBeUIsUUFBUSx1QkFBdUIsdUJBQXVCLENBQUMsRUFBRTtBQUNyRixVQUFJO0FBQ0osT0FBQyxTQUFVQyxrQkFBaUI7QUFDeEIsaUJBQVMsR0FBRyxPQUFPO0FBQ2YsZ0JBQU0sWUFBWTtBQUNsQixpQkFBTyxhQUFhakIsSUFBRyxLQUFLLFVBQVUsYUFBYTtBQUFBLFFBQ3ZEO0FBQ0EsUUFBQWlCLGlCQUFnQixLQUFLO0FBQUEsTUFDekIsR0FBRyxvQkFBb0IsUUFBUSxrQkFBa0Isa0JBQWtCLENBQUMsRUFBRTtBQUN0RSxVQUFJO0FBQ0osT0FBQyxTQUFVQyxvQkFBbUI7QUFDMUIsaUJBQVMsR0FBRyxPQUFPO0FBQ2YsZ0JBQU0sWUFBWTtBQUNsQixpQkFBTyxjQUFjLHFCQUFxQixHQUFHLFVBQVUsb0JBQW9CLEtBQUssbUJBQW1CLEdBQUcsVUFBVSxrQkFBa0IsS0FBSyxnQkFBZ0IsR0FBRyxVQUFVLGVBQWU7QUFBQSxRQUN2TDtBQUNBLFFBQUFBLG1CQUFrQixLQUFLO0FBQUEsTUFDM0IsR0FBRyxzQkFBc0IsUUFBUSxvQkFBb0Isb0JBQW9CLENBQUMsRUFBRTtBQUM1RSxVQUFJO0FBQ0osT0FBQyxTQUFVQyxrQkFBaUI7QUFDeEIsUUFBQUEsaUJBQWdCQSxpQkFBZ0IsS0FBSyxJQUFJLENBQUMsSUFBSTtBQUM5QyxRQUFBQSxpQkFBZ0JBLGlCQUFnQixXQUFXLElBQUksQ0FBQyxJQUFJO0FBQ3BELFFBQUFBLGlCQUFnQkEsaUJBQWdCLFFBQVEsSUFBSSxDQUFDLElBQUk7QUFDakQsUUFBQUEsaUJBQWdCQSxpQkFBZ0IsVUFBVSxJQUFJLENBQUMsSUFBSTtBQUFBLE1BQ3ZELEdBQUcsb0JBQW9CLGtCQUFrQixDQUFDLEVBQUU7QUFDNUMsZUFBU0MseUJBQXdCLGVBQWUsZUFBZSxTQUFTLFNBQVM7QUFDN0UsY0FBTSxTQUFTLFlBQVksU0FBWSxVQUFVLFFBQVE7QUFDekQsWUFBSSxpQkFBaUI7QUFDckIsWUFBSSw2QkFBNkI7QUFDakMsWUFBSSxnQ0FBZ0M7QUFDcEMsY0FBTSxVQUFVO0FBQ2hCLFlBQUkscUJBQXFCO0FBQ3pCLGNBQU0sa0JBQWtCLG9CQUFJLElBQUk7QUFDaEMsWUFBSSwwQkFBMEI7QUFDOUIsY0FBTSx1QkFBdUIsb0JBQUksSUFBSTtBQUNyQyxjQUFNLG1CQUFtQixvQkFBSSxJQUFJO0FBQ2pDLFlBQUk7QUFDSixZQUFJLGVBQWUsSUFBSSxZQUFZLFVBQVU7QUFDN0MsWUFBSSxtQkFBbUIsb0JBQUksSUFBSTtBQUMvQixZQUFJLHdCQUF3QixvQkFBSSxJQUFJO0FBQ3BDLFlBQUksZ0JBQWdCLG9CQUFJLElBQUk7QUFDNUIsWUFBSSxRQUFRLE1BQU07QUFDbEIsWUFBSSxjQUFjLFlBQVk7QUFDOUIsWUFBSTtBQUNKLFlBQUksUUFBUSxnQkFBZ0I7QUFDNUIsY0FBTSxlQUFlLElBQUksU0FBUyxRQUFRO0FBQzFDLGNBQU0sZUFBZSxJQUFJLFNBQVMsUUFBUTtBQUMxQyxjQUFNLCtCQUErQixJQUFJLFNBQVMsUUFBUTtBQUMxRCxjQUFNLDJCQUEyQixJQUFJLFNBQVMsUUFBUTtBQUN0RCxjQUFNLGlCQUFpQixJQUFJLFNBQVMsUUFBUTtBQUM1QyxjQUFNLHVCQUF3QixXQUFXLFFBQVEsdUJBQXdCLFFBQVEsdUJBQXVCLHFCQUFxQjtBQUM3SCxpQkFBUyxzQkFBc0IsSUFBSTtBQUMvQixjQUFJLE9BQU8sTUFBTTtBQUNiLGtCQUFNLElBQUksTUFBTSwwRUFBMEU7QUFBQSxVQUM5RjtBQUNBLGlCQUFPLFNBQVMsR0FBRyxTQUFTO0FBQUEsUUFDaEM7QUFDQSxpQkFBUyx1QkFBdUIsSUFBSTtBQUNoQyxjQUFJLE9BQU8sTUFBTTtBQUNiLG1CQUFPLGtCQUFrQixFQUFFLCtCQUErQixTQUFTO0FBQUEsVUFDdkUsT0FDSztBQUNELG1CQUFPLFNBQVMsR0FBRyxTQUFTO0FBQUEsVUFDaEM7QUFBQSxRQUNKO0FBQ0EsaUJBQVMsNkJBQTZCO0FBQ2xDLGlCQUFPLFVBQVUsRUFBRSw0QkFBNEIsU0FBUztBQUFBLFFBQzVEO0FBQ0EsaUJBQVMsa0JBQWtCLE9BQU8sU0FBUztBQUN2QyxjQUFJLFdBQVcsUUFBUSxVQUFVLE9BQU8sR0FBRztBQUN2QyxrQkFBTSxJQUFJLHNCQUFzQixRQUFRLEVBQUUsR0FBRyxPQUFPO0FBQUEsVUFDeEQsV0FDUyxXQUFXLFFBQVEsV0FBVyxPQUFPLEdBQUc7QUFDN0Msa0JBQU0sSUFBSSx1QkFBdUIsUUFBUSxFQUFFLEdBQUcsT0FBTztBQUFBLFVBQ3pELE9BQ0s7QUFDRCxrQkFBTSxJQUFJLDJCQUEyQixHQUFHLE9BQU87QUFBQSxVQUNuRDtBQUFBLFFBQ0o7QUFDQSxpQkFBUyxtQkFBbUIsVUFBVTtBQUNsQyxpQkFBTztBQUFBLFFBQ1g7QUFDQSxpQkFBUyxjQUFjO0FBQ25CLGlCQUFPLFVBQVUsZ0JBQWdCO0FBQUEsUUFDckM7QUFDQSxpQkFBUyxXQUFXO0FBQ2hCLGlCQUFPLFVBQVUsZ0JBQWdCO0FBQUEsUUFDckM7QUFDQSxpQkFBUyxhQUFhO0FBQ2xCLGlCQUFPLFVBQVUsZ0JBQWdCO0FBQUEsUUFDckM7QUFDQSxpQkFBUyxlQUFlO0FBQ3BCLGNBQUksVUFBVSxnQkFBZ0IsT0FBTyxVQUFVLGdCQUFnQixXQUFXO0FBQ3RFLG9CQUFRLGdCQUFnQjtBQUN4Qix5QkFBYSxLQUFLLE1BQVM7QUFBQSxVQUMvQjtBQUFBLFFBRUo7QUFDQSxpQkFBUyxpQkFBaUIsT0FBTztBQUM3Qix1QkFBYSxLQUFLLENBQUMsT0FBTyxRQUFXLE1BQVMsQ0FBQztBQUFBLFFBQ25EO0FBQ0EsaUJBQVMsa0JBQWtCLE1BQU07QUFDN0IsdUJBQWEsS0FBSyxJQUFJO0FBQUEsUUFDMUI7QUFDQSxzQkFBYyxRQUFRLFlBQVk7QUFDbEMsc0JBQWMsUUFBUSxnQkFBZ0I7QUFDdEMsc0JBQWMsUUFBUSxZQUFZO0FBQ2xDLHNCQUFjLFFBQVEsaUJBQWlCO0FBQ3ZDLGlCQUFTLHNCQUFzQjtBQUMzQixjQUFJLFNBQVMsYUFBYSxTQUFTLEdBQUc7QUFDbEM7QUFBQSxVQUNKO0FBQ0EsbUJBQVMsR0FBRyxNQUFNLFNBQVMsRUFBRSxNQUFNLGFBQWEsTUFBTTtBQUNsRCxvQkFBUTtBQUNSLGdDQUFvQjtBQUFBLFVBQ3hCLENBQUM7QUFBQSxRQUNMO0FBQ0EsaUJBQVMsY0FBYyxTQUFTO0FBQzVCLGNBQUksV0FBVyxRQUFRLFVBQVUsT0FBTyxHQUFHO0FBQ3ZDLDBCQUFjLE9BQU87QUFBQSxVQUN6QixXQUNTLFdBQVcsUUFBUSxlQUFlLE9BQU8sR0FBRztBQUNqRCwrQkFBbUIsT0FBTztBQUFBLFVBQzlCLFdBQ1MsV0FBVyxRQUFRLFdBQVcsT0FBTyxHQUFHO0FBQzdDLDJCQUFlLE9BQU87QUFBQSxVQUMxQixPQUNLO0FBQ0QsaUNBQXFCLE9BQU87QUFBQSxVQUNoQztBQUFBLFFBQ0o7QUFDQSxpQkFBUyxzQkFBc0I7QUFDM0IsY0FBSSxhQUFhLFNBQVMsR0FBRztBQUN6QjtBQUFBLFVBQ0o7QUFDQSxnQkFBTSxVQUFVLGFBQWEsTUFBTTtBQUNuQyxjQUFJO0FBQ0Esa0JBQU0sa0JBQWtCLFNBQVM7QUFDakMsZ0JBQUksZ0JBQWdCLEdBQUcsZUFBZSxHQUFHO0FBQ3JDLDhCQUFnQixjQUFjLFNBQVMsYUFBYTtBQUFBLFlBQ3hELE9BQ0s7QUFDRCw0QkFBYyxPQUFPO0FBQUEsWUFDekI7QUFBQSxVQUNKLFVBQ0E7QUFDSSxnQ0FBb0I7QUFBQSxVQUN4QjtBQUFBLFFBQ0o7QUFDQSxjQUFNLFdBQVcsQ0FBQyxZQUFZO0FBQzFCLGNBQUk7QUFHQSxnQkFBSSxXQUFXLFFBQVEsZUFBZSxPQUFPLEtBQUssUUFBUSxXQUFXLG1CQUFtQixLQUFLLFFBQVE7QUFDakcsb0JBQU0sV0FBVyxRQUFRLE9BQU87QUFDaEMsb0JBQU0sTUFBTSxzQkFBc0IsUUFBUTtBQUMxQyxvQkFBTSxXQUFXLGFBQWEsSUFBSSxHQUFHO0FBQ3JDLGtCQUFJLFdBQVcsUUFBUSxVQUFVLFFBQVEsR0FBRztBQUN4QyxzQkFBTSxXQUFXLFNBQVM7QUFDMUIsc0JBQU0sV0FBWSxZQUFZLFNBQVMscUJBQXNCLFNBQVMsbUJBQW1CLFVBQVUsa0JBQWtCLElBQUksbUJBQW1CLFFBQVE7QUFDcEosb0JBQUksYUFBYSxTQUFTLFVBQVUsVUFBYSxTQUFTLFdBQVcsU0FBWTtBQUM3RSwrQkFBYSxPQUFPLEdBQUc7QUFDdkIsZ0NBQWMsT0FBTyxRQUFRO0FBQzdCLDJCQUFTLEtBQUssU0FBUztBQUN2Qix1Q0FBcUIsVUFBVSxRQUFRLFFBQVEsS0FBSyxJQUFJLENBQUM7QUFDekQsZ0NBQWMsTUFBTSxRQUFRLEVBQUUsTUFBTSxNQUFNLE9BQU8sTUFBTSwrQ0FBK0MsQ0FBQztBQUN2RztBQUFBLGdCQUNKO0FBQUEsY0FDSjtBQUNBLG9CQUFNLG9CQUFvQixjQUFjLElBQUksUUFBUTtBQUVwRCxrQkFBSSxzQkFBc0IsUUFBVztBQUNqQyxrQ0FBa0IsT0FBTztBQUN6QiwwQ0FBMEIsT0FBTztBQUNqQztBQUFBLGNBQ0osT0FDSztBQUdELHNDQUFzQixJQUFJLFFBQVE7QUFBQSxjQUN0QztBQUFBLFlBQ0o7QUFDQSw4QkFBa0IsY0FBYyxPQUFPO0FBQUEsVUFDM0MsVUFDQTtBQUNJLGdDQUFvQjtBQUFBLFVBQ3hCO0FBQUEsUUFDSjtBQUNBLGlCQUFTLGNBQWMsZ0JBQWdCO0FBQ25DLGNBQUksV0FBVyxHQUFHO0FBR2Q7QUFBQSxVQUNKO0FBQ0EsbUJBQVMsTUFBTSxlQUFlLFFBQVFDLFlBQVc7QUFDN0Msa0JBQU0sVUFBVTtBQUFBLGNBQ1osU0FBUztBQUFBLGNBQ1QsSUFBSSxlQUFlO0FBQUEsWUFDdkI7QUFDQSxnQkFBSSx5QkFBeUIsV0FBVyxlQUFlO0FBQ25ELHNCQUFRLFFBQVEsY0FBYyxPQUFPO0FBQUEsWUFDekMsT0FDSztBQUNELHNCQUFRLFNBQVMsa0JBQWtCLFNBQVksT0FBTztBQUFBLFlBQzFEO0FBQ0EsaUNBQXFCLFNBQVMsUUFBUUEsVUFBUztBQUMvQywwQkFBYyxNQUFNLE9BQU8sRUFBRSxNQUFNLE1BQU0sT0FBTyxNQUFNLDBCQUEwQixDQUFDO0FBQUEsVUFDckY7QUFDQSxtQkFBUyxXQUFXLE9BQU8sUUFBUUEsWUFBVztBQUMxQyxrQkFBTSxVQUFVO0FBQUEsY0FDWixTQUFTO0FBQUEsY0FDVCxJQUFJLGVBQWU7QUFBQSxjQUNuQixPQUFPLE1BQU0sT0FBTztBQUFBLFlBQ3hCO0FBQ0EsaUNBQXFCLFNBQVMsUUFBUUEsVUFBUztBQUMvQywwQkFBYyxNQUFNLE9BQU8sRUFBRSxNQUFNLE1BQU0sT0FBTyxNQUFNLDBCQUEwQixDQUFDO0FBQUEsVUFDckY7QUFDQSxtQkFBUyxhQUFhLFFBQVEsUUFBUUEsWUFBVztBQUc3QyxnQkFBSSxXQUFXLFFBQVc7QUFDdEIsdUJBQVM7QUFBQSxZQUNiO0FBQ0Esa0JBQU0sVUFBVTtBQUFBLGNBQ1osU0FBUztBQUFBLGNBQ1QsSUFBSSxlQUFlO0FBQUEsY0FDbkI7QUFBQSxZQUNKO0FBQ0EsaUNBQXFCLFNBQVMsUUFBUUEsVUFBUztBQUMvQywwQkFBYyxNQUFNLE9BQU8sRUFBRSxNQUFNLE1BQU0sT0FBTyxNQUFNLDBCQUEwQixDQUFDO0FBQUEsVUFDckY7QUFDQSwrQkFBcUIsY0FBYztBQUNuQyxnQkFBTSxVQUFVLGdCQUFnQixJQUFJLGVBQWUsTUFBTTtBQUN6RCxjQUFJO0FBQ0osY0FBSTtBQUNKLGNBQUksU0FBUztBQUNULG1CQUFPLFFBQVE7QUFDZiw2QkFBaUIsUUFBUTtBQUFBLFVBQzdCO0FBQ0EsZ0JBQU0sWUFBWSxLQUFLLElBQUk7QUFDM0IsY0FBSSxrQkFBa0Isb0JBQW9CO0FBQ3RDLGtCQUFNLFdBQVcsZUFBZSxNQUFNLE9BQU8sS0FBSyxJQUFJLENBQUM7QUFDdkQsa0JBQU0scUJBQXFCLCtCQUErQixHQUFHLHFCQUFxQixRQUFRLElBQ3BGLHFCQUFxQixTQUFTLDhCQUE4QixRQUFRLElBQ3BFLHFCQUFxQixTQUFTLDhCQUE4QixjQUFjO0FBQ2hGLGdCQUFJLGVBQWUsT0FBTyxRQUFRLHNCQUFzQixJQUFJLGVBQWUsRUFBRSxHQUFHO0FBQzVFLGlDQUFtQixPQUFPO0FBQUEsWUFDOUI7QUFDQSxnQkFBSSxlQUFlLE9BQU8sTUFBTTtBQUM1Qiw0QkFBYyxJQUFJLFVBQVUsa0JBQWtCO0FBQUEsWUFDbEQ7QUFDQSxnQkFBSTtBQUNBLGtCQUFJO0FBQ0osa0JBQUksZ0JBQWdCO0FBQ2hCLG9CQUFJLGVBQWUsV0FBVyxRQUFXO0FBQ3JDLHNCQUFJLFNBQVMsVUFBYSxLQUFLLG1CQUFtQixHQUFHO0FBQ2pELCtCQUFXLElBQUksV0FBVyxjQUFjLFdBQVcsV0FBVyxlQUFlLFdBQVcsZUFBZSxNQUFNLFlBQVksS0FBSyxjQUFjLDRCQUE0QixHQUFHLGVBQWUsUUFBUSxTQUFTO0FBQzNNO0FBQUEsa0JBQ0o7QUFDQSxrQ0FBZ0IsZUFBZSxtQkFBbUIsS0FBSztBQUFBLGdCQUMzRCxXQUNTLE1BQU0sUUFBUSxlQUFlLE1BQU0sR0FBRztBQUMzQyxzQkFBSSxTQUFTLFVBQWEsS0FBSyx3QkFBd0IsV0FBVyxvQkFBb0IsUUFBUTtBQUMxRiwrQkFBVyxJQUFJLFdBQVcsY0FBYyxXQUFXLFdBQVcsZUFBZSxXQUFXLGVBQWUsTUFBTSxpRUFBaUUsR0FBRyxlQUFlLFFBQVEsU0FBUztBQUNqTjtBQUFBLGtCQUNKO0FBQ0Esa0NBQWdCLGVBQWUsR0FBRyxlQUFlLFFBQVEsbUJBQW1CLEtBQUs7QUFBQSxnQkFDckYsT0FDSztBQUNELHNCQUFJLFNBQVMsVUFBYSxLQUFLLHdCQUF3QixXQUFXLG9CQUFvQixZQUFZO0FBQzlGLCtCQUFXLElBQUksV0FBVyxjQUFjLFdBQVcsV0FBVyxlQUFlLFdBQVcsZUFBZSxNQUFNLGlFQUFpRSxHQUFHLGVBQWUsUUFBUSxTQUFTO0FBQ2pOO0FBQUEsa0JBQ0o7QUFDQSxrQ0FBZ0IsZUFBZSxlQUFlLFFBQVEsbUJBQW1CLEtBQUs7QUFBQSxnQkFDbEY7QUFBQSxjQUNKLFdBQ1Msb0JBQW9CO0FBQ3pCLGdDQUFnQixtQkFBbUIsZUFBZSxRQUFRLGVBQWUsUUFBUSxtQkFBbUIsS0FBSztBQUFBLGNBQzdHO0FBQ0Esb0JBQU0sVUFBVTtBQUNoQixrQkFBSSxDQUFDLGVBQWU7QUFDaEIsOEJBQWMsT0FBTyxRQUFRO0FBQzdCLDZCQUFhLGVBQWUsZUFBZSxRQUFRLFNBQVM7QUFBQSxjQUNoRSxXQUNTLFFBQVEsTUFBTTtBQUNuQix3QkFBUSxLQUFLLENBQUMsa0JBQWtCO0FBQzVCLGdDQUFjLE9BQU8sUUFBUTtBQUM3Qix3QkFBTSxlQUFlLGVBQWUsUUFBUSxTQUFTO0FBQUEsZ0JBQ3pELEdBQUcsV0FBUztBQUNSLGdDQUFjLE9BQU8sUUFBUTtBQUM3QixzQkFBSSxpQkFBaUIsV0FBVyxlQUFlO0FBQzNDLCtCQUFXLE9BQU8sZUFBZSxRQUFRLFNBQVM7QUFBQSxrQkFDdEQsV0FDUyxTQUFTckIsSUFBRyxPQUFPLE1BQU0sT0FBTyxHQUFHO0FBQ3hDLCtCQUFXLElBQUksV0FBVyxjQUFjLFdBQVcsV0FBVyxlQUFlLFdBQVcsZUFBZSxNQUFNLHlCQUF5QixNQUFNLE9BQU8sRUFBRSxHQUFHLGVBQWUsUUFBUSxTQUFTO0FBQUEsa0JBQzVMLE9BQ0s7QUFDRCwrQkFBVyxJQUFJLFdBQVcsY0FBYyxXQUFXLFdBQVcsZUFBZSxXQUFXLGVBQWUsTUFBTSxxREFBcUQsR0FBRyxlQUFlLFFBQVEsU0FBUztBQUFBLGtCQUN6TTtBQUFBLGdCQUNKLENBQUM7QUFBQSxjQUNMLE9BQ0s7QUFDRCw4QkFBYyxPQUFPLFFBQVE7QUFDN0Isc0JBQU0sZUFBZSxlQUFlLFFBQVEsU0FBUztBQUFBLGNBQ3pEO0FBQUEsWUFDSixTQUNPLE9BQU87QUFDViw0QkFBYyxPQUFPLFFBQVE7QUFDN0Isa0JBQUksaUJBQWlCLFdBQVcsZUFBZTtBQUMzQyxzQkFBTSxPQUFPLGVBQWUsUUFBUSxTQUFTO0FBQUEsY0FDakQsV0FDUyxTQUFTQSxJQUFHLE9BQU8sTUFBTSxPQUFPLEdBQUc7QUFDeEMsMkJBQVcsSUFBSSxXQUFXLGNBQWMsV0FBVyxXQUFXLGVBQWUsV0FBVyxlQUFlLE1BQU0seUJBQXlCLE1BQU0sT0FBTyxFQUFFLEdBQUcsZUFBZSxRQUFRLFNBQVM7QUFBQSxjQUM1TCxPQUNLO0FBQ0QsMkJBQVcsSUFBSSxXQUFXLGNBQWMsV0FBVyxXQUFXLGVBQWUsV0FBVyxlQUFlLE1BQU0scURBQXFELEdBQUcsZUFBZSxRQUFRLFNBQVM7QUFBQSxjQUN6TTtBQUFBLFlBQ0o7QUFBQSxVQUNKLE9BQ0s7QUFDRCx1QkFBVyxJQUFJLFdBQVcsY0FBYyxXQUFXLFdBQVcsZ0JBQWdCLG9CQUFvQixlQUFlLE1BQU0sRUFBRSxHQUFHLGVBQWUsUUFBUSxTQUFTO0FBQUEsVUFDaEs7QUFBQSxRQUNKO0FBQ0EsaUJBQVMsZUFBZSxpQkFBaUI7QUFDckMsY0FBSSxXQUFXLEdBQUc7QUFFZDtBQUFBLFVBQ0o7QUFDQSxjQUFJLGdCQUFnQixPQUFPLE1BQU07QUFDN0IsZ0JBQUksZ0JBQWdCLE9BQU87QUFDdkIscUJBQU8sTUFBTTtBQUFBLEVBQXFELEtBQUssVUFBVSxnQkFBZ0IsT0FBTyxRQUFXLENBQUMsQ0FBQyxFQUFFO0FBQUEsWUFDM0gsT0FDSztBQUNELHFCQUFPLE1BQU0sOEVBQThFO0FBQUEsWUFDL0Y7QUFBQSxVQUNKLE9BQ0s7QUFDRCxrQkFBTSxNQUFNLGdCQUFnQjtBQUM1QixrQkFBTSxrQkFBa0IsaUJBQWlCLElBQUksR0FBRztBQUNoRCxrQ0FBc0IsaUJBQWlCLGVBQWU7QUFDdEQsZ0JBQUksb0JBQW9CLFFBQVc7QUFDL0IsK0JBQWlCLE9BQU8sR0FBRztBQUMzQixrQkFBSTtBQUNBLG9CQUFJLGdCQUFnQixPQUFPO0FBQ3ZCLHdCQUFNLFFBQVEsZ0JBQWdCO0FBQzlCLGtDQUFnQixPQUFPLElBQUksV0FBVyxjQUFjLE1BQU0sTUFBTSxNQUFNLFNBQVMsTUFBTSxJQUFJLENBQUM7QUFBQSxnQkFDOUYsV0FDUyxnQkFBZ0IsV0FBVyxRQUFXO0FBQzNDLGtDQUFnQixRQUFRLGdCQUFnQixNQUFNO0FBQUEsZ0JBQ2xELE9BQ0s7QUFDRCx3QkFBTSxJQUFJLE1BQU0sc0JBQXNCO0FBQUEsZ0JBQzFDO0FBQUEsY0FDSixTQUNPLE9BQU87QUFDVixvQkFBSSxNQUFNLFNBQVM7QUFDZix5QkFBTyxNQUFNLHFCQUFxQixnQkFBZ0IsTUFBTSwwQkFBMEIsTUFBTSxPQUFPLEVBQUU7QUFBQSxnQkFDckcsT0FDSztBQUNELHlCQUFPLE1BQU0scUJBQXFCLGdCQUFnQixNQUFNLHdCQUF3QjtBQUFBLGdCQUNwRjtBQUFBLGNBQ0o7QUFBQSxZQUNKO0FBQUEsVUFDSjtBQUFBLFFBQ0o7QUFDQSxpQkFBUyxtQkFBbUIsU0FBUztBQUNqQyxjQUFJLFdBQVcsR0FBRztBQUVkO0FBQUEsVUFDSjtBQUNBLGNBQUksT0FBTztBQUNYLGNBQUk7QUFDSixjQUFJLFFBQVEsV0FBVyxtQkFBbUIsS0FBSyxRQUFRO0FBQ25ELGtCQUFNLFdBQVcsUUFBUSxPQUFPO0FBQ2hDLGtDQUFzQixPQUFPLFFBQVE7QUFDckMsc0NBQTBCLE9BQU87QUFDakM7QUFBQSxVQUNKLE9BQ0s7QUFDRCxrQkFBTSxVQUFVLHFCQUFxQixJQUFJLFFBQVEsTUFBTTtBQUN2RCxnQkFBSSxTQUFTO0FBQ1Qsb0NBQXNCLFFBQVE7QUFDOUIscUJBQU8sUUFBUTtBQUFBLFlBQ25CO0FBQUEsVUFDSjtBQUNBLGNBQUksdUJBQXVCLHlCQUF5QjtBQUNoRCxnQkFBSTtBQUNBLHdDQUEwQixPQUFPO0FBQ2pDLGtCQUFJLHFCQUFxQjtBQUNyQixvQkFBSSxRQUFRLFdBQVcsUUFBVztBQUM5QixzQkFBSSxTQUFTLFFBQVc7QUFDcEIsd0JBQUksS0FBSyxtQkFBbUIsS0FBSyxLQUFLLHdCQUF3QixXQUFXLG9CQUFvQixRQUFRO0FBQ2pHLDZCQUFPLE1BQU0sZ0JBQWdCLFFBQVEsTUFBTSxZQUFZLEtBQUssY0FBYyw0QkFBNEI7QUFBQSxvQkFDMUc7QUFBQSxrQkFDSjtBQUNBLHNDQUFvQjtBQUFBLGdCQUN4QixXQUNTLE1BQU0sUUFBUSxRQUFRLE1BQU0sR0FBRztBQUdwQyx3QkFBTSxTQUFTLFFBQVE7QUFDdkIsc0JBQUksUUFBUSxXQUFXLHFCQUFxQixLQUFLLFVBQVUsT0FBTyxXQUFXLEtBQUssY0FBYyxHQUFHLE9BQU8sQ0FBQyxDQUFDLEdBQUc7QUFDM0csd0NBQW9CLEVBQUUsT0FBTyxPQUFPLENBQUMsR0FBRyxPQUFPLE9BQU8sQ0FBQyxFQUFFLENBQUM7QUFBQSxrQkFDOUQsT0FDSztBQUNELHdCQUFJLFNBQVMsUUFBVztBQUNwQiwwQkFBSSxLQUFLLHdCQUF3QixXQUFXLG9CQUFvQixRQUFRO0FBQ3BFLCtCQUFPLE1BQU0sZ0JBQWdCLFFBQVEsTUFBTSxpRUFBaUU7QUFBQSxzQkFDaEg7QUFDQSwwQkFBSSxLQUFLLG1CQUFtQixRQUFRLE9BQU8sUUFBUTtBQUMvQywrQkFBTyxNQUFNLGdCQUFnQixRQUFRLE1BQU0sWUFBWSxLQUFLLGNBQWMsd0JBQXdCLE9BQU8sTUFBTSxZQUFZO0FBQUEsc0JBQy9IO0FBQUEsb0JBQ0o7QUFDQSx3Q0FBb0IsR0FBRyxNQUFNO0FBQUEsa0JBQ2pDO0FBQUEsZ0JBQ0osT0FDSztBQUNELHNCQUFJLFNBQVMsVUFBYSxLQUFLLHdCQUF3QixXQUFXLG9CQUFvQixZQUFZO0FBQzlGLDJCQUFPLE1BQU0sZ0JBQWdCLFFBQVEsTUFBTSxpRUFBaUU7QUFBQSxrQkFDaEg7QUFDQSxzQ0FBb0IsUUFBUSxNQUFNO0FBQUEsZ0JBQ3RDO0FBQUEsY0FDSixXQUNTLHlCQUF5QjtBQUM5Qix3Q0FBd0IsUUFBUSxRQUFRLFFBQVEsTUFBTTtBQUFBLGNBQzFEO0FBQUEsWUFDSixTQUNPLE9BQU87QUFDVixrQkFBSSxNQUFNLFNBQVM7QUFDZix1QkFBTyxNQUFNLHlCQUF5QixRQUFRLE1BQU0sMEJBQTBCLE1BQU0sT0FBTyxFQUFFO0FBQUEsY0FDakcsT0FDSztBQUNELHVCQUFPLE1BQU0seUJBQXlCLFFBQVEsTUFBTSx3QkFBd0I7QUFBQSxjQUNoRjtBQUFBLFlBQ0o7QUFBQSxVQUNKLE9BQ0s7QUFDRCx5Q0FBNkIsS0FBSyxPQUFPO0FBQUEsVUFDN0M7QUFBQSxRQUNKO0FBQ0EsaUJBQVMscUJBQXFCLFNBQVM7QUFDbkMsY0FBSSxDQUFDLFNBQVM7QUFDVixtQkFBTyxNQUFNLHlCQUF5QjtBQUN0QztBQUFBLFVBQ0o7QUFDQSxpQkFBTyxNQUFNO0FBQUEsRUFBNkUsS0FBSyxVQUFVLFNBQVMsTUFBTSxDQUFDLENBQUMsRUFBRTtBQUU1SCxnQkFBTSxrQkFBa0I7QUFDeEIsY0FBSUEsSUFBRyxPQUFPLGdCQUFnQixFQUFFLEtBQUtBLElBQUcsT0FBTyxnQkFBZ0IsRUFBRSxHQUFHO0FBQ2hFLGtCQUFNLE1BQU0sZ0JBQWdCO0FBQzVCLGtCQUFNLGtCQUFrQixpQkFBaUIsSUFBSSxHQUFHO0FBQ2hELGdCQUFJLGlCQUFpQjtBQUNqQiw4QkFBZ0IsT0FBTyxJQUFJLE1BQU0sbUVBQW1FLENBQUM7QUFBQSxZQUN6RztBQUFBLFVBQ0o7QUFBQSxRQUNKO0FBQ0EsaUJBQVMsZUFBZSxRQUFRO0FBQzVCLGNBQUksV0FBVyxVQUFhLFdBQVcsTUFBTTtBQUN6QyxtQkFBTztBQUFBLFVBQ1g7QUFDQSxrQkFBUSxPQUFPO0FBQUEsWUFDWCxLQUFLLE1BQU07QUFDUCxxQkFBTyxLQUFLLFVBQVUsUUFBUSxNQUFNLENBQUM7QUFBQSxZQUN6QyxLQUFLLE1BQU07QUFDUCxxQkFBTyxLQUFLLFVBQVUsTUFBTTtBQUFBLFlBQ2hDO0FBQ0kscUJBQU87QUFBQSxVQUNmO0FBQUEsUUFDSjtBQUNBLGlCQUFTLG9CQUFvQixTQUFTO0FBQ2xDLGNBQUksVUFBVSxNQUFNLE9BQU8sQ0FBQyxRQUFRO0FBQ2hDO0FBQUEsVUFDSjtBQUNBLGNBQUksZ0JBQWdCLFlBQVksTUFBTTtBQUNsQyxnQkFBSSxPQUFPO0FBQ1gsaUJBQUssVUFBVSxNQUFNLFdBQVcsVUFBVSxNQUFNLFlBQVksUUFBUSxRQUFRO0FBQ3hFLHFCQUFPLFdBQVcsZUFBZSxRQUFRLE1BQU0sQ0FBQztBQUFBO0FBQUE7QUFBQSxZQUNwRDtBQUNBLG1CQUFPLElBQUksb0JBQW9CLFFBQVEsTUFBTSxPQUFPLFFBQVEsRUFBRSxPQUFPLElBQUk7QUFBQSxVQUM3RSxPQUNLO0FBQ0QsMEJBQWMsZ0JBQWdCLE9BQU87QUFBQSxVQUN6QztBQUFBLFFBQ0o7QUFDQSxpQkFBUyx5QkFBeUIsU0FBUztBQUN2QyxjQUFJLFVBQVUsTUFBTSxPQUFPLENBQUMsUUFBUTtBQUNoQztBQUFBLFVBQ0o7QUFDQSxjQUFJLGdCQUFnQixZQUFZLE1BQU07QUFDbEMsZ0JBQUksT0FBTztBQUNYLGdCQUFJLFVBQVUsTUFBTSxXQUFXLFVBQVUsTUFBTSxTQUFTO0FBQ3BELGtCQUFJLFFBQVEsUUFBUTtBQUNoQix1QkFBTyxXQUFXLGVBQWUsUUFBUSxNQUFNLENBQUM7QUFBQTtBQUFBO0FBQUEsY0FDcEQsT0FDSztBQUNELHVCQUFPO0FBQUEsY0FDWDtBQUFBLFlBQ0o7QUFDQSxtQkFBTyxJQUFJLHlCQUF5QixRQUFRLE1BQU0sTUFBTSxJQUFJO0FBQUEsVUFDaEUsT0FDSztBQUNELDBCQUFjLHFCQUFxQixPQUFPO0FBQUEsVUFDOUM7QUFBQSxRQUNKO0FBQ0EsaUJBQVMscUJBQXFCLFNBQVMsUUFBUSxXQUFXO0FBQ3RELGNBQUksVUFBVSxNQUFNLE9BQU8sQ0FBQyxRQUFRO0FBQ2hDO0FBQUEsVUFDSjtBQUNBLGNBQUksZ0JBQWdCLFlBQVksTUFBTTtBQUNsQyxnQkFBSSxPQUFPO0FBQ1gsZ0JBQUksVUFBVSxNQUFNLFdBQVcsVUFBVSxNQUFNLFNBQVM7QUFDcEQsa0JBQUksUUFBUSxTQUFTLFFBQVEsTUFBTSxNQUFNO0FBQ3JDLHVCQUFPLGVBQWUsZUFBZSxRQUFRLE1BQU0sSUFBSSxDQUFDO0FBQUE7QUFBQTtBQUFBLGNBQzVELE9BQ0s7QUFDRCxvQkFBSSxRQUFRLFFBQVE7QUFDaEIseUJBQU8sV0FBVyxlQUFlLFFBQVEsTUFBTSxDQUFDO0FBQUE7QUFBQTtBQUFBLGdCQUNwRCxXQUNTLFFBQVEsVUFBVSxRQUFXO0FBQ2xDLHlCQUFPO0FBQUEsZ0JBQ1g7QUFBQSxjQUNKO0FBQUEsWUFDSjtBQUNBLG1CQUFPLElBQUkscUJBQXFCLE1BQU0sT0FBTyxRQUFRLEVBQUUsK0JBQStCLEtBQUssSUFBSSxJQUFJLFNBQVMsTUFBTSxJQUFJO0FBQUEsVUFDMUgsT0FDSztBQUNELDBCQUFjLGlCQUFpQixPQUFPO0FBQUEsVUFDMUM7QUFBQSxRQUNKO0FBQ0EsaUJBQVMscUJBQXFCLFNBQVM7QUFDbkMsY0FBSSxVQUFVLE1BQU0sT0FBTyxDQUFDLFFBQVE7QUFDaEM7QUFBQSxVQUNKO0FBQ0EsY0FBSSxnQkFBZ0IsWUFBWSxNQUFNO0FBQ2xDLGdCQUFJLE9BQU87QUFDWCxpQkFBSyxVQUFVLE1BQU0sV0FBVyxVQUFVLE1BQU0sWUFBWSxRQUFRLFFBQVE7QUFDeEUscUJBQU8sV0FBVyxlQUFlLFFBQVEsTUFBTSxDQUFDO0FBQUE7QUFBQTtBQUFBLFlBQ3BEO0FBQ0EsbUJBQU8sSUFBSSxxQkFBcUIsUUFBUSxNQUFNLE9BQU8sUUFBUSxFQUFFLE9BQU8sSUFBSTtBQUFBLFVBQzlFLE9BQ0s7QUFDRCwwQkFBYyxtQkFBbUIsT0FBTztBQUFBLFVBQzVDO0FBQUEsUUFDSjtBQUNBLGlCQUFTLDBCQUEwQixTQUFTO0FBQ3hDLGNBQUksVUFBVSxNQUFNLE9BQU8sQ0FBQyxVQUFVLFFBQVEsV0FBVyxxQkFBcUIsS0FBSyxRQUFRO0FBQ3ZGO0FBQUEsVUFDSjtBQUNBLGNBQUksZ0JBQWdCLFlBQVksTUFBTTtBQUNsQyxnQkFBSSxPQUFPO0FBQ1gsZ0JBQUksVUFBVSxNQUFNLFdBQVcsVUFBVSxNQUFNLFNBQVM7QUFDcEQsa0JBQUksUUFBUSxRQUFRO0FBQ2hCLHVCQUFPLFdBQVcsZUFBZSxRQUFRLE1BQU0sQ0FBQztBQUFBO0FBQUE7QUFBQSxjQUNwRCxPQUNLO0FBQ0QsdUJBQU87QUFBQSxjQUNYO0FBQUEsWUFDSjtBQUNBLG1CQUFPLElBQUksMEJBQTBCLFFBQVEsTUFBTSxNQUFNLElBQUk7QUFBQSxVQUNqRSxPQUNLO0FBQ0QsMEJBQWMsd0JBQXdCLE9BQU87QUFBQSxVQUNqRDtBQUFBLFFBQ0o7QUFDQSxpQkFBUyxzQkFBc0IsU0FBUyxpQkFBaUI7QUFDckQsY0FBSSxVQUFVLE1BQU0sT0FBTyxDQUFDLFFBQVE7QUFDaEM7QUFBQSxVQUNKO0FBQ0EsY0FBSSxnQkFBZ0IsWUFBWSxNQUFNO0FBQ2xDLGdCQUFJLE9BQU87QUFDWCxnQkFBSSxVQUFVLE1BQU0sV0FBVyxVQUFVLE1BQU0sU0FBUztBQUNwRCxrQkFBSSxRQUFRLFNBQVMsUUFBUSxNQUFNLE1BQU07QUFDckMsdUJBQU8sZUFBZSxlQUFlLFFBQVEsTUFBTSxJQUFJLENBQUM7QUFBQTtBQUFBO0FBQUEsY0FDNUQsT0FDSztBQUNELG9CQUFJLFFBQVEsUUFBUTtBQUNoQix5QkFBTyxXQUFXLGVBQWUsUUFBUSxNQUFNLENBQUM7QUFBQTtBQUFBO0FBQUEsZ0JBQ3BELFdBQ1MsUUFBUSxVQUFVLFFBQVc7QUFDbEMseUJBQU87QUFBQSxnQkFDWDtBQUFBLGNBQ0o7QUFBQSxZQUNKO0FBQ0EsZ0JBQUksaUJBQWlCO0FBQ2pCLG9CQUFNLFFBQVEsUUFBUSxRQUFRLG9CQUFvQixRQUFRLE1BQU0sT0FBTyxLQUFLLFFBQVEsTUFBTSxJQUFJLE9BQU87QUFDckcscUJBQU8sSUFBSSxzQkFBc0IsZ0JBQWdCLE1BQU0sT0FBTyxRQUFRLEVBQUUsU0FBUyxLQUFLLElBQUksSUFBSSxnQkFBZ0IsVUFBVSxNQUFNLEtBQUssSUFBSSxJQUFJO0FBQUEsWUFDL0ksT0FDSztBQUNELHFCQUFPLElBQUkscUJBQXFCLFFBQVEsRUFBRSxxQ0FBcUMsSUFBSTtBQUFBLFlBQ3ZGO0FBQUEsVUFDSixPQUNLO0FBQ0QsMEJBQWMsb0JBQW9CLE9BQU87QUFBQSxVQUM3QztBQUFBLFFBQ0o7QUFDQSxpQkFBUyxjQUFjLE1BQU0sU0FBUztBQUNsQyxjQUFJLENBQUMsVUFBVSxVQUFVLE1BQU0sS0FBSztBQUNoQztBQUFBLFVBQ0o7QUFDQSxnQkFBTSxhQUFhO0FBQUEsWUFDZixjQUFjO0FBQUEsWUFDZDtBQUFBLFlBQ0E7QUFBQSxZQUNBLFdBQVcsS0FBSyxJQUFJO0FBQUEsVUFDeEI7QUFDQSxpQkFBTyxJQUFJLFVBQVU7QUFBQSxRQUN6QjtBQUNBLGlCQUFTLDBCQUEwQjtBQUMvQixjQUFJLFNBQVMsR0FBRztBQUNaLGtCQUFNLElBQUksZ0JBQWdCLGlCQUFpQixRQUFRLHVCQUF1QjtBQUFBLFVBQzlFO0FBQ0EsY0FBSSxXQUFXLEdBQUc7QUFDZCxrQkFBTSxJQUFJLGdCQUFnQixpQkFBaUIsVUFBVSx5QkFBeUI7QUFBQSxVQUNsRjtBQUFBLFFBQ0o7QUFDQSxpQkFBUyxtQkFBbUI7QUFDeEIsY0FBSSxZQUFZLEdBQUc7QUFDZixrQkFBTSxJQUFJLGdCQUFnQixpQkFBaUIsa0JBQWtCLGlDQUFpQztBQUFBLFVBQ2xHO0FBQUEsUUFDSjtBQUNBLGlCQUFTLHNCQUFzQjtBQUMzQixjQUFJLENBQUMsWUFBWSxHQUFHO0FBQ2hCLGtCQUFNLElBQUksTUFBTSxzQkFBc0I7QUFBQSxVQUMxQztBQUFBLFFBQ0o7QUFDQSxpQkFBUyxnQkFBZ0IsT0FBTztBQUM1QixjQUFJLFVBQVUsUUFBVztBQUNyQixtQkFBTztBQUFBLFVBQ1gsT0FDSztBQUNELG1CQUFPO0FBQUEsVUFDWDtBQUFBLFFBQ0o7QUFDQSxpQkFBUyxnQkFBZ0IsT0FBTztBQUM1QixjQUFJLFVBQVUsTUFBTTtBQUNoQixtQkFBTztBQUFBLFVBQ1gsT0FDSztBQUNELG1CQUFPO0FBQUEsVUFDWDtBQUFBLFFBQ0o7QUFDQSxpQkFBUyxhQUFhLE9BQU87QUFDekIsaUJBQU8sVUFBVSxVQUFhLFVBQVUsUUFBUSxDQUFDLE1BQU0sUUFBUSxLQUFLLEtBQUssT0FBTyxVQUFVO0FBQUEsUUFDOUY7QUFDQSxpQkFBUyxtQkFBbUIscUJBQXFCLE9BQU87QUFDcEQsa0JBQVEscUJBQXFCO0FBQUEsWUFDekIsS0FBSyxXQUFXLG9CQUFvQjtBQUNoQyxrQkFBSSxhQUFhLEtBQUssR0FBRztBQUNyQix1QkFBTyxnQkFBZ0IsS0FBSztBQUFBLGNBQ2hDLE9BQ0s7QUFDRCx1QkFBTyxDQUFDLGdCQUFnQixLQUFLLENBQUM7QUFBQSxjQUNsQztBQUFBLFlBQ0osS0FBSyxXQUFXLG9CQUFvQjtBQUNoQyxrQkFBSSxDQUFDLGFBQWEsS0FBSyxHQUFHO0FBQ3RCLHNCQUFNLElBQUksTUFBTSxpRUFBaUU7QUFBQSxjQUNyRjtBQUNBLHFCQUFPLGdCQUFnQixLQUFLO0FBQUEsWUFDaEMsS0FBSyxXQUFXLG9CQUFvQjtBQUNoQyxxQkFBTyxDQUFDLGdCQUFnQixLQUFLLENBQUM7QUFBQSxZQUNsQztBQUNJLG9CQUFNLElBQUksTUFBTSwrQkFBK0Isb0JBQW9CLFNBQVMsQ0FBQyxFQUFFO0FBQUEsVUFDdkY7QUFBQSxRQUNKO0FBQ0EsaUJBQVMscUJBQXFCLE1BQU0sUUFBUTtBQUN4QyxjQUFJO0FBQ0osZ0JBQU0saUJBQWlCLEtBQUs7QUFDNUIsa0JBQVEsZ0JBQWdCO0FBQUEsWUFDcEIsS0FBSztBQUNELHVCQUFTO0FBQ1Q7QUFBQSxZQUNKLEtBQUs7QUFDRCx1QkFBUyxtQkFBbUIsS0FBSyxxQkFBcUIsT0FBTyxDQUFDLENBQUM7QUFDL0Q7QUFBQSxZQUNKO0FBQ0ksdUJBQVMsQ0FBQztBQUNWLHVCQUFTLElBQUksR0FBRyxJQUFJLE9BQU8sVUFBVSxJQUFJLGdCQUFnQixLQUFLO0FBQzFELHVCQUFPLEtBQUssZ0JBQWdCLE9BQU8sQ0FBQyxDQUFDLENBQUM7QUFBQSxjQUMxQztBQUNBLGtCQUFJLE9BQU8sU0FBUyxnQkFBZ0I7QUFDaEMseUJBQVMsSUFBSSxPQUFPLFFBQVEsSUFBSSxnQkFBZ0IsS0FBSztBQUNqRCx5QkFBTyxLQUFLLElBQUk7QUFBQSxnQkFDcEI7QUFBQSxjQUNKO0FBQ0E7QUFBQSxVQUNSO0FBQ0EsaUJBQU87QUFBQSxRQUNYO0FBQ0EsY0FBTSxhQUFhO0FBQUEsVUFDZixrQkFBa0IsQ0FBQyxTQUFTLFNBQVM7QUFDakMsb0NBQXdCO0FBQ3hCLGdCQUFJO0FBQ0osZ0JBQUk7QUFDSixnQkFBSUEsSUFBRyxPQUFPLElBQUksR0FBRztBQUNqQix1QkFBUztBQUNULG9CQUFNLFFBQVEsS0FBSyxDQUFDO0FBQ3BCLGtCQUFJLGFBQWE7QUFDakIsa0JBQUksc0JBQXNCLFdBQVcsb0JBQW9CO0FBQ3pELGtCQUFJLFdBQVcsb0JBQW9CLEdBQUcsS0FBSyxHQUFHO0FBQzFDLDZCQUFhO0FBQ2Isc0NBQXNCO0FBQUEsY0FDMUI7QUFDQSxrQkFBSSxXQUFXLEtBQUs7QUFDcEIsb0JBQU0saUJBQWlCLFdBQVc7QUFDbEMsc0JBQVEsZ0JBQWdCO0FBQUEsZ0JBQ3BCLEtBQUs7QUFDRCxrQ0FBZ0I7QUFDaEI7QUFBQSxnQkFDSixLQUFLO0FBQ0Qsa0NBQWdCLG1CQUFtQixxQkFBcUIsS0FBSyxVQUFVLENBQUM7QUFDeEU7QUFBQSxnQkFDSjtBQUNJLHNCQUFJLHdCQUF3QixXQUFXLG9CQUFvQixRQUFRO0FBQy9ELDBCQUFNLElBQUksTUFBTSxZQUFZLGNBQWMsNkRBQTZEO0FBQUEsa0JBQzNHO0FBQ0Esa0NBQWdCLEtBQUssTUFBTSxZQUFZLFFBQVEsRUFBRSxJQUFJLFdBQVMsZ0JBQWdCLEtBQUssQ0FBQztBQUNwRjtBQUFBLGNBQ1I7QUFBQSxZQUNKLE9BQ0s7QUFDRCxvQkFBTSxTQUFTO0FBQ2YsdUJBQVMsS0FBSztBQUNkLDhCQUFnQixxQkFBcUIsTUFBTSxNQUFNO0FBQUEsWUFDckQ7QUFDQSxrQkFBTSxzQkFBc0I7QUFBQSxjQUN4QixTQUFTO0FBQUEsY0FDVDtBQUFBLGNBQ0EsUUFBUTtBQUFBLFlBQ1o7QUFDQSxxQ0FBeUIsbUJBQW1CO0FBQzVDLG1CQUFPLGNBQWMsTUFBTSxtQkFBbUIsRUFBRSxNQUFNLENBQUMsVUFBVTtBQUM3RCxxQkFBTyxNQUFNLDhCQUE4QjtBQUMzQyxvQkFBTTtBQUFBLFlBQ1YsQ0FBQztBQUFBLFVBQ0w7QUFBQSxVQUNBLGdCQUFnQixDQUFDLE1BQU0sWUFBWTtBQUMvQixvQ0FBd0I7QUFDeEIsZ0JBQUk7QUFDSixnQkFBSUEsSUFBRyxLQUFLLElBQUksR0FBRztBQUNmLHdDQUEwQjtBQUFBLFlBQzlCLFdBQ1MsU0FBUztBQUNkLGtCQUFJQSxJQUFHLE9BQU8sSUFBSSxHQUFHO0FBQ2pCLHlCQUFTO0FBQ1QscUNBQXFCLElBQUksTUFBTSxFQUFFLE1BQU0sUUFBVyxRQUFRLENBQUM7QUFBQSxjQUMvRCxPQUNLO0FBQ0QseUJBQVMsS0FBSztBQUNkLHFDQUFxQixJQUFJLEtBQUssUUFBUSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQUEsY0FDM0Q7QUFBQSxZQUNKO0FBQ0EsbUJBQU87QUFBQSxjQUNILFNBQVMsTUFBTTtBQUNYLG9CQUFJLFdBQVcsUUFBVztBQUN0Qix1Q0FBcUIsT0FBTyxNQUFNO0FBQUEsZ0JBQ3RDLE9BQ0s7QUFDRCw0Q0FBMEI7QUFBQSxnQkFDOUI7QUFBQSxjQUNKO0FBQUEsWUFDSjtBQUFBLFVBQ0o7QUFBQSxVQUNBLFlBQVksQ0FBQyxPQUFPLE9BQU8sWUFBWTtBQUNuQyxnQkFBSSxpQkFBaUIsSUFBSSxLQUFLLEdBQUc7QUFDN0Isb0JBQU0sSUFBSSxNQUFNLDhCQUE4QixLQUFLLHFCQUFxQjtBQUFBLFlBQzVFO0FBQ0EsNkJBQWlCLElBQUksT0FBTyxPQUFPO0FBQ25DLG1CQUFPO0FBQUEsY0FDSCxTQUFTLE1BQU07QUFDWCxpQ0FBaUIsT0FBTyxLQUFLO0FBQUEsY0FDakM7QUFBQSxZQUNKO0FBQUEsVUFDSjtBQUFBLFVBQ0EsY0FBYyxDQUFDLE9BQU8sT0FBTyxVQUFVO0FBR25DLG1CQUFPLFdBQVcsaUJBQWlCLHFCQUFxQixNQUFNLEVBQUUsT0FBTyxNQUFNLENBQUM7QUFBQSxVQUNsRjtBQUFBLFVBQ0EscUJBQXFCLHlCQUF5QjtBQUFBLFVBQzlDLGFBQWEsQ0FBQyxTQUFTLFNBQVM7QUFDNUIsb0NBQXdCO0FBQ3hCLGdDQUFvQjtBQUNwQixnQkFBSTtBQUNKLGdCQUFJO0FBQ0osZ0JBQUksUUFBUTtBQUNaLGdCQUFJQSxJQUFHLE9BQU8sSUFBSSxHQUFHO0FBQ2pCLHVCQUFTO0FBQ1Qsb0JBQU0sUUFBUSxLQUFLLENBQUM7QUFDcEIsb0JBQU0sT0FBTyxLQUFLLEtBQUssU0FBUyxDQUFDO0FBQ2pDLGtCQUFJLGFBQWE7QUFDakIsa0JBQUksc0JBQXNCLFdBQVcsb0JBQW9CO0FBQ3pELGtCQUFJLFdBQVcsb0JBQW9CLEdBQUcsS0FBSyxHQUFHO0FBQzFDLDZCQUFhO0FBQ2Isc0NBQXNCO0FBQUEsY0FDMUI7QUFDQSxrQkFBSSxXQUFXLEtBQUs7QUFDcEIsa0JBQUksZUFBZSxrQkFBa0IsR0FBRyxJQUFJLEdBQUc7QUFDM0MsMkJBQVcsV0FBVztBQUN0Qix3QkFBUTtBQUFBLGNBQ1o7QUFDQSxvQkFBTSxpQkFBaUIsV0FBVztBQUNsQyxzQkFBUSxnQkFBZ0I7QUFBQSxnQkFDcEIsS0FBSztBQUNELGtDQUFnQjtBQUNoQjtBQUFBLGdCQUNKLEtBQUs7QUFDRCxrQ0FBZ0IsbUJBQW1CLHFCQUFxQixLQUFLLFVBQVUsQ0FBQztBQUN4RTtBQUFBLGdCQUNKO0FBQ0ksc0JBQUksd0JBQXdCLFdBQVcsb0JBQW9CLFFBQVE7QUFDL0QsMEJBQU0sSUFBSSxNQUFNLFlBQVksY0FBYyx3REFBd0Q7QUFBQSxrQkFDdEc7QUFDQSxrQ0FBZ0IsS0FBSyxNQUFNLFlBQVksUUFBUSxFQUFFLElBQUksV0FBUyxnQkFBZ0IsS0FBSyxDQUFDO0FBQ3BGO0FBQUEsY0FDUjtBQUFBLFlBQ0osT0FDSztBQUNELG9CQUFNLFNBQVM7QUFDZix1QkFBUyxLQUFLO0FBQ2QsOEJBQWdCLHFCQUFxQixNQUFNLE1BQU07QUFDakQsb0JBQU0saUJBQWlCLEtBQUs7QUFDNUIsc0JBQVEsZUFBZSxrQkFBa0IsR0FBRyxPQUFPLGNBQWMsQ0FBQyxJQUFJLE9BQU8sY0FBYyxJQUFJO0FBQUEsWUFDbkc7QUFDQSxrQkFBTSxLQUFLO0FBQ1gsZ0JBQUk7QUFDSixnQkFBSSxPQUFPO0FBQ1AsMkJBQWEsTUFBTSx3QkFBd0IsTUFBTTtBQUM3QyxzQkFBTSxJQUFJLHFCQUFxQixPQUFPLGlCQUFpQixZQUFZLEVBQUU7QUFDckUsb0JBQUksTUFBTSxRQUFXO0FBQ2pCLHlCQUFPLElBQUkscUVBQXFFLEVBQUUsRUFBRTtBQUNwRix5QkFBTyxRQUFRLFFBQVE7QUFBQSxnQkFDM0IsT0FDSztBQUNELHlCQUFPLEVBQUUsTUFBTSxNQUFNO0FBQ2pCLDJCQUFPLElBQUksd0NBQXdDLEVBQUUsU0FBUztBQUFBLGtCQUNsRSxDQUFDO0FBQUEsZ0JBQ0w7QUFBQSxjQUNKLENBQUM7QUFBQSxZQUNMO0FBQ0Esa0JBQU0saUJBQWlCO0FBQUEsY0FDbkIsU0FBUztBQUFBLGNBQ1Q7QUFBQSxjQUNBO0FBQUEsY0FDQSxRQUFRO0FBQUEsWUFDWjtBQUNBLGdDQUFvQixjQUFjO0FBQ2xDLGdCQUFJLE9BQU8scUJBQXFCLE9BQU8sdUJBQXVCLFlBQVk7QUFDdEUsbUNBQXFCLE9BQU8sbUJBQW1CLGNBQWM7QUFBQSxZQUNqRTtBQUNBLG1CQUFPLElBQUksUUFBUSxPQUFPLFNBQVMsV0FBVztBQUMxQyxvQkFBTSxxQkFBcUIsQ0FBQyxNQUFNO0FBQzlCLHdCQUFRLENBQUM7QUFDVCxxQ0FBcUIsT0FBTyxRQUFRLEVBQUU7QUFDdEMsNEJBQVksUUFBUTtBQUFBLGNBQ3hCO0FBQ0Esb0JBQU0sb0JBQW9CLENBQUMsTUFBTTtBQUM3Qix1QkFBTyxDQUFDO0FBQ1IscUNBQXFCLE9BQU8sUUFBUSxFQUFFO0FBQ3RDLDRCQUFZLFFBQVE7QUFBQSxjQUN4QjtBQUNBLG9CQUFNLGtCQUFrQixFQUFFLFFBQWdCLFlBQVksS0FBSyxJQUFJLEdBQUcsU0FBUyxvQkFBb0IsUUFBUSxrQkFBa0I7QUFDekgsa0JBQUk7QUFDQSxpQ0FBaUIsSUFBSSxJQUFJLGVBQWU7QUFDeEMsc0JBQU0sY0FBYyxNQUFNLGNBQWM7QUFBQSxjQUM1QyxTQUNPLE9BQU87QUFHVixpQ0FBaUIsT0FBTyxFQUFFO0FBQzFCLGdDQUFnQixPQUFPLElBQUksV0FBVyxjQUFjLFdBQVcsV0FBVyxtQkFBbUIsTUFBTSxVQUFVLE1BQU0sVUFBVSxnQkFBZ0IsQ0FBQztBQUM5SSx1QkFBTyxNQUFNLHlCQUF5QjtBQUN0QyxzQkFBTTtBQUFBLGNBQ1Y7QUFBQSxZQUNKLENBQUM7QUFBQSxVQUNMO0FBQUEsVUFDQSxXQUFXLENBQUMsTUFBTSxZQUFZO0FBQzFCLG9DQUF3QjtBQUN4QixnQkFBSSxTQUFTO0FBQ2IsZ0JBQUksbUJBQW1CLEdBQUcsSUFBSSxHQUFHO0FBQzdCLHVCQUFTO0FBQ1QsbUNBQXFCO0FBQUEsWUFDekIsV0FDU0EsSUFBRyxPQUFPLElBQUksR0FBRztBQUN0Qix1QkFBUztBQUNULGtCQUFJLFlBQVksUUFBVztBQUN2Qix5QkFBUztBQUNULGdDQUFnQixJQUFJLE1BQU0sRUFBRSxTQUFrQixNQUFNLE9BQVUsQ0FBQztBQUFBLGNBQ25FO0FBQUEsWUFDSixPQUNLO0FBQ0Qsa0JBQUksWUFBWSxRQUFXO0FBQ3ZCLHlCQUFTLEtBQUs7QUFDZCxnQ0FBZ0IsSUFBSSxLQUFLLFFBQVEsRUFBRSxNQUFNLFFBQVEsQ0FBQztBQUFBLGNBQ3REO0FBQUEsWUFDSjtBQUNBLG1CQUFPO0FBQUEsY0FDSCxTQUFTLE1BQU07QUFDWCxvQkFBSSxXQUFXLE1BQU07QUFDakI7QUFBQSxnQkFDSjtBQUNBLG9CQUFJLFdBQVcsUUFBVztBQUN0QixrQ0FBZ0IsT0FBTyxNQUFNO0FBQUEsZ0JBQ2pDLE9BQ0s7QUFDRCx1Q0FBcUI7QUFBQSxnQkFDekI7QUFBQSxjQUNKO0FBQUEsWUFDSjtBQUFBLFVBQ0o7QUFBQSxVQUNBLG9CQUFvQixNQUFNO0FBQ3RCLG1CQUFPLGlCQUFpQixPQUFPO0FBQUEsVUFDbkM7QUFBQSxVQUNBLE9BQU8sT0FBTyxRQUFRLFNBQVMsbUNBQW1DO0FBQzlELGdCQUFJLG9CQUFvQjtBQUN4QixnQkFBSSxlQUFlLFlBQVk7QUFDL0IsZ0JBQUksbUNBQW1DLFFBQVc7QUFDOUMsa0JBQUlBLElBQUcsUUFBUSw4QkFBOEIsR0FBRztBQUM1QyxvQ0FBb0I7QUFBQSxjQUN4QixPQUNLO0FBQ0Qsb0NBQW9CLCtCQUErQixvQkFBb0I7QUFDdkUsK0JBQWUsK0JBQStCLGVBQWUsWUFBWTtBQUFBLGNBQzdFO0FBQUEsWUFDSjtBQUNBLG9CQUFRO0FBQ1IsMEJBQWM7QUFDZCxnQkFBSSxVQUFVLE1BQU0sS0FBSztBQUNyQix1QkFBUztBQUFBLFlBQ2IsT0FDSztBQUNELHVCQUFTO0FBQUEsWUFDYjtBQUNBLGdCQUFJLHFCQUFxQixDQUFDLFNBQVMsS0FBSyxDQUFDLFdBQVcsR0FBRztBQUNuRCxvQkFBTSxXQUFXLGlCQUFpQixxQkFBcUIsTUFBTSxFQUFFLE9BQU8sTUFBTSxTQUFTLE1BQU0sRUFBRSxDQUFDO0FBQUEsWUFDbEc7QUFBQSxVQUNKO0FBQUEsVUFDQSxTQUFTLGFBQWE7QUFBQSxVQUN0QixTQUFTLGFBQWE7QUFBQSxVQUN0Qix5QkFBeUIsNkJBQTZCO0FBQUEsVUFDdEQsV0FBVyxlQUFlO0FBQUEsVUFDMUIsS0FBSyxNQUFNO0FBQ1AsMEJBQWMsSUFBSTtBQUFBLFVBQ3RCO0FBQUEsVUFDQSxTQUFTLE1BQU07QUFDWCxnQkFBSSxXQUFXLEdBQUc7QUFDZDtBQUFBLFlBQ0o7QUFDQSxvQkFBUSxnQkFBZ0I7QUFDeEIsMkJBQWUsS0FBSyxNQUFTO0FBQzdCLGtCQUFNLFFBQVEsSUFBSSxXQUFXLGNBQWMsV0FBVyxXQUFXLHlCQUF5Qix5REFBeUQ7QUFDbkosdUJBQVcsV0FBVyxpQkFBaUIsT0FBTyxHQUFHO0FBQzdDLHNCQUFRLE9BQU8sS0FBSztBQUFBLFlBQ3hCO0FBQ0EsK0JBQW1CLG9CQUFJLElBQUk7QUFDM0IsNEJBQWdCLG9CQUFJLElBQUk7QUFDeEIsb0NBQXdCLG9CQUFJLElBQUk7QUFDaEMsMkJBQWUsSUFBSSxZQUFZLFVBQVU7QUFFekMsZ0JBQUlBLElBQUcsS0FBSyxjQUFjLE9BQU8sR0FBRztBQUNoQyw0QkFBYyxRQUFRO0FBQUEsWUFDMUI7QUFDQSxnQkFBSUEsSUFBRyxLQUFLLGNBQWMsT0FBTyxHQUFHO0FBQ2hDLDRCQUFjLFFBQVE7QUFBQSxZQUMxQjtBQUFBLFVBQ0o7QUFBQSxVQUNBLFFBQVEsTUFBTTtBQUNWLG9DQUF3QjtBQUN4Qiw2QkFBaUI7QUFDakIsb0JBQVEsZ0JBQWdCO0FBQ3hCLDBCQUFjLE9BQU8sUUFBUTtBQUFBLFVBQ2pDO0FBQUEsVUFDQSxTQUFTLE1BQU07QUFFWCxhQUFDLEdBQUcsTUFBTSxTQUFTLEVBQUUsUUFBUSxJQUFJLFNBQVM7QUFBQSxVQUM5QztBQUFBLFFBQ0o7QUFDQSxtQkFBVyxlQUFlLHFCQUFxQixNQUFNLENBQUMsV0FBVztBQUM3RCxjQUFJLFVBQVUsTUFBTSxPQUFPLENBQUMsUUFBUTtBQUNoQztBQUFBLFVBQ0o7QUFDQSxnQkFBTSxVQUFVLFVBQVUsTUFBTSxXQUFXLFVBQVUsTUFBTTtBQUMzRCxpQkFBTyxJQUFJLE9BQU8sU0FBUyxVQUFVLE9BQU8sVUFBVSxNQUFTO0FBQUEsUUFDbkUsQ0FBQztBQUNELG1CQUFXLGVBQWUscUJBQXFCLE1BQU0sQ0FBQyxXQUFXO0FBQzdELGdCQUFNLFVBQVUsaUJBQWlCLElBQUksT0FBTyxLQUFLO0FBQ2pELGNBQUksU0FBUztBQUNULG9CQUFRLE9BQU8sS0FBSztBQUFBLFVBQ3hCLE9BQ0s7QUFDRCxxQ0FBeUIsS0FBSyxNQUFNO0FBQUEsVUFDeEM7QUFBQSxRQUNKLENBQUM7QUFDRCxlQUFPO0FBQUEsTUFDWDtBQUNBLGNBQVEsMEJBQTBCb0I7QUFBQTtBQUFBOzs7QUM3ckNsQztBQUFBO0FBQUE7QUFNQSxhQUFPLGVBQWUsU0FBUyxjQUFjLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDNUQsY0FBUSxlQUFlLFFBQVEsZ0JBQWdCLFFBQVEsMEJBQTBCLFFBQVEsYUFBYSxRQUFRLG9CQUFvQixRQUFRLHFCQUFxQixRQUFRLHdCQUF3QixRQUFRLCtCQUErQixRQUFRLHdCQUF3QixRQUFRLGdCQUFnQixRQUFRLDhCQUE4QixRQUFRLHdCQUF3QixRQUFRLGdCQUFnQixRQUFRLDhCQUE4QixRQUFRLDRCQUE0QixRQUFRLG9CQUFvQixRQUFRLDBCQUEwQixRQUFRLFVBQVUsUUFBUSxRQUFRLFFBQVEsYUFBYSxRQUFRLFdBQVcsUUFBUSxRQUFRLFFBQVEsWUFBWSxRQUFRLHNCQUFzQixRQUFRLG9CQUFvQixRQUFRLG9CQUFvQixRQUFRLG9CQUFvQixRQUFRLG9CQUFvQixRQUFRLG9CQUFvQixRQUFRLG9CQUFvQixRQUFRLG9CQUFvQixRQUFRLG9CQUFvQixRQUFRLG9CQUFvQixRQUFRLG9CQUFvQixRQUFRLG1CQUFtQixRQUFRLGFBQWEsUUFBUSxnQkFBZ0IsUUFBUSxlQUFlLFFBQVEsZUFBZSxRQUFRLGVBQWUsUUFBUSxlQUFlLFFBQVEsZUFBZSxRQUFRLGVBQWUsUUFBUSxlQUFlLFFBQVEsZUFBZSxRQUFRLGVBQWUsUUFBUSxlQUFlLFFBQVEsY0FBYyxRQUFRLFVBQVUsUUFBUSxNQUFNO0FBQzV3QyxjQUFRLGtCQUFrQixRQUFRLHVCQUF1QixRQUFRLDZCQUE2QixRQUFRLCtCQUErQixRQUFRLGtCQUFrQixRQUFRLG1CQUFtQixRQUFRLHVCQUF1QixRQUFRLHVCQUF1QixRQUFRLGNBQWMsUUFBUSxjQUFjLFFBQVEsUUFBUTtBQUNwVCxVQUFNLGFBQWE7QUFDbkIsYUFBTyxlQUFlLFNBQVMsV0FBVyxFQUFFLFlBQVksTUFBTSxLQUFLLFdBQVk7QUFBRSxlQUFPLFdBQVc7QUFBQSxNQUFTLEVBQUUsQ0FBQztBQUMvRyxhQUFPLGVBQWUsU0FBUyxlQUFlLEVBQUUsWUFBWSxNQUFNLEtBQUssV0FBWTtBQUFFLGVBQU8sV0FBVztBQUFBLE1BQWEsRUFBRSxDQUFDO0FBQ3ZILGFBQU8sZUFBZSxTQUFTLGdCQUFnQixFQUFFLFlBQVksTUFBTSxLQUFLLFdBQVk7QUFBRSxlQUFPLFdBQVc7QUFBQSxNQUFjLEVBQUUsQ0FBQztBQUN6SCxhQUFPLGVBQWUsU0FBUyxnQkFBZ0IsRUFBRSxZQUFZLE1BQU0sS0FBSyxXQUFZO0FBQUUsZUFBTyxXQUFXO0FBQUEsTUFBYyxFQUFFLENBQUM7QUFDekgsYUFBTyxlQUFlLFNBQVMsZ0JBQWdCLEVBQUUsWUFBWSxNQUFNLEtBQUssV0FBWTtBQUFFLGVBQU8sV0FBVztBQUFBLE1BQWMsRUFBRSxDQUFDO0FBQ3pILGFBQU8sZUFBZSxTQUFTLGdCQUFnQixFQUFFLFlBQVksTUFBTSxLQUFLLFdBQVk7QUFBRSxlQUFPLFdBQVc7QUFBQSxNQUFjLEVBQUUsQ0FBQztBQUN6SCxhQUFPLGVBQWUsU0FBUyxnQkFBZ0IsRUFBRSxZQUFZLE1BQU0sS0FBSyxXQUFZO0FBQUUsZUFBTyxXQUFXO0FBQUEsTUFBYyxFQUFFLENBQUM7QUFDekgsYUFBTyxlQUFlLFNBQVMsZ0JBQWdCLEVBQUUsWUFBWSxNQUFNLEtBQUssV0FBWTtBQUFFLGVBQU8sV0FBVztBQUFBLE1BQWMsRUFBRSxDQUFDO0FBQ3pILGFBQU8sZUFBZSxTQUFTLGdCQUFnQixFQUFFLFlBQVksTUFBTSxLQUFLLFdBQVk7QUFBRSxlQUFPLFdBQVc7QUFBQSxNQUFjLEVBQUUsQ0FBQztBQUN6SCxhQUFPLGVBQWUsU0FBUyxnQkFBZ0IsRUFBRSxZQUFZLE1BQU0sS0FBSyxXQUFZO0FBQUUsZUFBTyxXQUFXO0FBQUEsTUFBYyxFQUFFLENBQUM7QUFDekgsYUFBTyxlQUFlLFNBQVMsZ0JBQWdCLEVBQUUsWUFBWSxNQUFNLEtBQUssV0FBWTtBQUFFLGVBQU8sV0FBVztBQUFBLE1BQWMsRUFBRSxDQUFDO0FBQ3pILGFBQU8sZUFBZSxTQUFTLGdCQUFnQixFQUFFLFlBQVksTUFBTSxLQUFLLFdBQVk7QUFBRSxlQUFPLFdBQVc7QUFBQSxNQUFjLEVBQUUsQ0FBQztBQUN6SCxhQUFPLGVBQWUsU0FBUyxpQkFBaUIsRUFBRSxZQUFZLE1BQU0sS0FBSyxXQUFZO0FBQUUsZUFBTyxXQUFXO0FBQUEsTUFBZSxFQUFFLENBQUM7QUFDM0gsYUFBTyxlQUFlLFNBQVMsY0FBYyxFQUFFLFlBQVksTUFBTSxLQUFLLFdBQVk7QUFBRSxlQUFPLFdBQVc7QUFBQSxNQUFZLEVBQUUsQ0FBQztBQUNySCxhQUFPLGVBQWUsU0FBUyxvQkFBb0IsRUFBRSxZQUFZLE1BQU0sS0FBSyxXQUFZO0FBQUUsZUFBTyxXQUFXO0FBQUEsTUFBa0IsRUFBRSxDQUFDO0FBQ2pJLGFBQU8sZUFBZSxTQUFTLHFCQUFxQixFQUFFLFlBQVksTUFBTSxLQUFLLFdBQVk7QUFBRSxlQUFPLFdBQVc7QUFBQSxNQUFtQixFQUFFLENBQUM7QUFDbkksYUFBTyxlQUFlLFNBQVMscUJBQXFCLEVBQUUsWUFBWSxNQUFNLEtBQUssV0FBWTtBQUFFLGVBQU8sV0FBVztBQUFBLE1BQW1CLEVBQUUsQ0FBQztBQUNuSSxhQUFPLGVBQWUsU0FBUyxxQkFBcUIsRUFBRSxZQUFZLE1BQU0sS0FBSyxXQUFZO0FBQUUsZUFBTyxXQUFXO0FBQUEsTUFBbUIsRUFBRSxDQUFDO0FBQ25JLGFBQU8sZUFBZSxTQUFTLHFCQUFxQixFQUFFLFlBQVksTUFBTSxLQUFLLFdBQVk7QUFBRSxlQUFPLFdBQVc7QUFBQSxNQUFtQixFQUFFLENBQUM7QUFDbkksYUFBTyxlQUFlLFNBQVMscUJBQXFCLEVBQUUsWUFBWSxNQUFNLEtBQUssV0FBWTtBQUFFLGVBQU8sV0FBVztBQUFBLE1BQW1CLEVBQUUsQ0FBQztBQUNuSSxhQUFPLGVBQWUsU0FBUyxxQkFBcUIsRUFBRSxZQUFZLE1BQU0sS0FBSyxXQUFZO0FBQUUsZUFBTyxXQUFXO0FBQUEsTUFBbUIsRUFBRSxDQUFDO0FBQ25JLGFBQU8sZUFBZSxTQUFTLHFCQUFxQixFQUFFLFlBQVksTUFBTSxLQUFLLFdBQVk7QUFBRSxlQUFPLFdBQVc7QUFBQSxNQUFtQixFQUFFLENBQUM7QUFDbkksYUFBTyxlQUFlLFNBQVMscUJBQXFCLEVBQUUsWUFBWSxNQUFNLEtBQUssV0FBWTtBQUFFLGVBQU8sV0FBVztBQUFBLE1BQW1CLEVBQUUsQ0FBQztBQUNuSSxhQUFPLGVBQWUsU0FBUyxxQkFBcUIsRUFBRSxZQUFZLE1BQU0sS0FBSyxXQUFZO0FBQUUsZUFBTyxXQUFXO0FBQUEsTUFBbUIsRUFBRSxDQUFDO0FBQ25JLGFBQU8sZUFBZSxTQUFTLHFCQUFxQixFQUFFLFlBQVksTUFBTSxLQUFLLFdBQVk7QUFBRSxlQUFPLFdBQVc7QUFBQSxNQUFtQixFQUFFLENBQUM7QUFDbkksYUFBTyxlQUFlLFNBQVMsdUJBQXVCLEVBQUUsWUFBWSxNQUFNLEtBQUssV0FBWTtBQUFFLGVBQU8sV0FBVztBQUFBLE1BQXFCLEVBQUUsQ0FBQztBQUN2SSxVQUFNLGNBQWM7QUFDcEIsYUFBTyxlQUFlLFNBQVMsYUFBYSxFQUFFLFlBQVksTUFBTSxLQUFLLFdBQVk7QUFBRSxlQUFPLFlBQVk7QUFBQSxNQUFXLEVBQUUsQ0FBQztBQUNwSCxhQUFPLGVBQWUsU0FBUyxZQUFZLEVBQUUsWUFBWSxNQUFNLEtBQUssV0FBWTtBQUFFLGVBQU8sWUFBWTtBQUFBLE1BQVUsRUFBRSxDQUFDO0FBQ2xILGFBQU8sZUFBZSxTQUFTLFNBQVMsRUFBRSxZQUFZLE1BQU0sS0FBSyxXQUFZO0FBQUUsZUFBTyxZQUFZO0FBQUEsTUFBTyxFQUFFLENBQUM7QUFDNUcsVUFBTSxlQUFlO0FBQ3JCLGFBQU8sZUFBZSxTQUFTLGNBQWMsRUFBRSxZQUFZLE1BQU0sS0FBSyxXQUFZO0FBQUUsZUFBTyxhQUFhO0FBQUEsTUFBWSxFQUFFLENBQUM7QUFDdkgsVUFBTSxXQUFXO0FBQ2pCLGFBQU8sZUFBZSxTQUFTLFNBQVMsRUFBRSxZQUFZLE1BQU0sS0FBSyxXQUFZO0FBQUUsZUFBTyxTQUFTO0FBQUEsTUFBTyxFQUFFLENBQUM7QUFDekcsYUFBTyxlQUFlLFNBQVMsV0FBVyxFQUFFLFlBQVksTUFBTSxLQUFLLFdBQVk7QUFBRSxlQUFPLFNBQVM7QUFBQSxNQUFTLEVBQUUsQ0FBQztBQUM3RyxVQUFNLGlCQUFpQjtBQUN2QixhQUFPLGVBQWUsU0FBUywyQkFBMkIsRUFBRSxZQUFZLE1BQU0sS0FBSyxXQUFZO0FBQUUsZUFBTyxlQUFlO0FBQUEsTUFBeUIsRUFBRSxDQUFDO0FBQ25KLGFBQU8sZUFBZSxTQUFTLHFCQUFxQixFQUFFLFlBQVksTUFBTSxLQUFLLFdBQVk7QUFBRSxlQUFPLGVBQWU7QUFBQSxNQUFtQixFQUFFLENBQUM7QUFDdkksVUFBTSw0QkFBNEI7QUFDbEMsYUFBTyxlQUFlLFNBQVMsNkJBQTZCLEVBQUUsWUFBWSxNQUFNLEtBQUssV0FBWTtBQUFFLGVBQU8sMEJBQTBCO0FBQUEsTUFBMkIsRUFBRSxDQUFDO0FBQ2xLLGFBQU8sZUFBZSxTQUFTLCtCQUErQixFQUFFLFlBQVksTUFBTSxLQUFLLFdBQVk7QUFBRSxlQUFPLDBCQUEwQjtBQUFBLE1BQTZCLEVBQUUsQ0FBQztBQUN0SyxVQUFNLGtCQUFrQjtBQUN4QixhQUFPLGVBQWUsU0FBUyxpQkFBaUIsRUFBRSxZQUFZLE1BQU0sS0FBSyxXQUFZO0FBQUUsZUFBTyxnQkFBZ0I7QUFBQSxNQUFlLEVBQUUsQ0FBQztBQUNoSSxhQUFPLGVBQWUsU0FBUyx5QkFBeUIsRUFBRSxZQUFZLE1BQU0sS0FBSyxXQUFZO0FBQUUsZUFBTyxnQkFBZ0I7QUFBQSxNQUF1QixFQUFFLENBQUM7QUFDaEosYUFBTyxlQUFlLFNBQVMsK0JBQStCLEVBQUUsWUFBWSxNQUFNLEtBQUssV0FBWTtBQUFFLGVBQU8sZ0JBQWdCO0FBQUEsTUFBNkIsRUFBRSxDQUFDO0FBQzVKLFVBQU0sa0JBQWtCO0FBQ3hCLGFBQU8sZUFBZSxTQUFTLGlCQUFpQixFQUFFLFlBQVksTUFBTSxLQUFLLFdBQVk7QUFBRSxlQUFPLGdCQUFnQjtBQUFBLE1BQWUsRUFBRSxDQUFDO0FBQ2hJLGFBQU8sZUFBZSxTQUFTLHlCQUF5QixFQUFFLFlBQVksTUFBTSxLQUFLLFdBQVk7QUFBRSxlQUFPLGdCQUFnQjtBQUFBLE1BQXVCLEVBQUUsQ0FBQztBQUNoSixhQUFPLGVBQWUsU0FBUyxnQ0FBZ0MsRUFBRSxZQUFZLE1BQU0sS0FBSyxXQUFZO0FBQUUsZUFBTyxnQkFBZ0I7QUFBQSxNQUE4QixFQUFFLENBQUM7QUFDOUosVUFBTSxrQkFBa0I7QUFDeEIsYUFBTyxlQUFlLFNBQVMseUJBQXlCLEVBQUUsWUFBWSxNQUFNLEtBQUssV0FBWTtBQUFFLGVBQU8sZ0JBQWdCO0FBQUEsTUFBdUIsRUFBRSxDQUFDO0FBQ2hKLFVBQU0sZUFBZTtBQUNyQixhQUFPLGVBQWUsU0FBUyxzQkFBc0IsRUFBRSxZQUFZLE1BQU0sS0FBSyxXQUFZO0FBQUUsZUFBTyxhQUFhO0FBQUEsTUFBb0IsRUFBRSxDQUFDO0FBQ3ZJLGFBQU8sZUFBZSxTQUFTLHFCQUFxQixFQUFFLFlBQVksTUFBTSxLQUFLLFdBQVk7QUFBRSxlQUFPLGFBQWE7QUFBQSxNQUFtQixFQUFFLENBQUM7QUFDckksYUFBTyxlQUFlLFNBQVMsY0FBYyxFQUFFLFlBQVksTUFBTSxLQUFLLFdBQVk7QUFBRSxlQUFPLGFBQWE7QUFBQSxNQUFZLEVBQUUsQ0FBQztBQUN2SCxhQUFPLGVBQWUsU0FBUywyQkFBMkIsRUFBRSxZQUFZLE1BQU0sS0FBSyxXQUFZO0FBQUUsZUFBTyxhQUFhO0FBQUEsTUFBeUIsRUFBRSxDQUFDO0FBQ2pKLGFBQU8sZUFBZSxTQUFTLGlCQUFpQixFQUFFLFlBQVksTUFBTSxLQUFLLFdBQVk7QUFBRSxlQUFPLGFBQWE7QUFBQSxNQUFlLEVBQUUsQ0FBQztBQUM3SCxhQUFPLGVBQWUsU0FBUyxnQkFBZ0IsRUFBRSxZQUFZLE1BQU0sS0FBSyxXQUFZO0FBQUUsZUFBTyxhQUFhO0FBQUEsTUFBYyxFQUFFLENBQUM7QUFDM0gsYUFBTyxlQUFlLFNBQVMsU0FBUyxFQUFFLFlBQVksTUFBTSxLQUFLLFdBQVk7QUFBRSxlQUFPLGFBQWE7QUFBQSxNQUFPLEVBQUUsQ0FBQztBQUM3RyxhQUFPLGVBQWUsU0FBUyxlQUFlLEVBQUUsWUFBWSxNQUFNLEtBQUssV0FBWTtBQUFFLGVBQU8sYUFBYTtBQUFBLE1BQWEsRUFBRSxDQUFDO0FBQ3pILGFBQU8sZUFBZSxTQUFTLGVBQWUsRUFBRSxZQUFZLE1BQU0sS0FBSyxXQUFZO0FBQUUsZUFBTyxhQUFhO0FBQUEsTUFBYSxFQUFFLENBQUM7QUFDekgsYUFBTyxlQUFlLFNBQVMsd0JBQXdCLEVBQUUsWUFBWSxNQUFNLEtBQUssV0FBWTtBQUFFLGVBQU8sYUFBYTtBQUFBLE1BQXNCLEVBQUUsQ0FBQztBQUMzSSxhQUFPLGVBQWUsU0FBUyx3QkFBd0IsRUFBRSxZQUFZLE1BQU0sS0FBSyxXQUFZO0FBQUUsZUFBTyxhQUFhO0FBQUEsTUFBc0IsRUFBRSxDQUFDO0FBQzNJLGFBQU8sZUFBZSxTQUFTLG9CQUFvQixFQUFFLFlBQVksTUFBTSxLQUFLLFdBQVk7QUFBRSxlQUFPLGFBQWE7QUFBQSxNQUFrQixFQUFFLENBQUM7QUFDbkksYUFBTyxlQUFlLFNBQVMsbUJBQW1CLEVBQUUsWUFBWSxNQUFNLEtBQUssV0FBWTtBQUFFLGVBQU8sYUFBYTtBQUFBLE1BQWlCLEVBQUUsQ0FBQztBQUNqSSxhQUFPLGVBQWUsU0FBUyxnQ0FBZ0MsRUFBRSxZQUFZLE1BQU0sS0FBSyxXQUFZO0FBQUUsZUFBTyxhQUFhO0FBQUEsTUFBOEIsRUFBRSxDQUFDO0FBQzNKLGFBQU8sZUFBZSxTQUFTLDhCQUE4QixFQUFFLFlBQVksTUFBTSxLQUFLLFdBQVk7QUFBRSxlQUFPLGFBQWE7QUFBQSxNQUE0QixFQUFFLENBQUM7QUFDdkosYUFBTyxlQUFlLFNBQVMsd0JBQXdCLEVBQUUsWUFBWSxNQUFNLEtBQUssV0FBWTtBQUFFLGVBQU8sYUFBYTtBQUFBLE1BQXNCLEVBQUUsQ0FBQztBQUMzSSxhQUFPLGVBQWUsU0FBUyxtQkFBbUIsRUFBRSxZQUFZLE1BQU0sS0FBSyxXQUFZO0FBQUUsZUFBTyxhQUFhO0FBQUEsTUFBaUIsRUFBRSxDQUFDO0FBQ2pJLFVBQU0sUUFBUTtBQUNkLGNBQVEsTUFBTSxNQUFNO0FBQUE7QUFBQTs7O0FDaEZwQjtBQUFBO0FBQUE7QUFLQSxhQUFPLGVBQWUsU0FBUyxjQUFjLEVBQUUsT0FBTyxLQUFLLENBQUM7QUFDNUQsVUFBTSxRQUFRO0FBQ2QsVUFBTSxnQkFBTixNQUFNLHVCQUFzQixNQUFNLHNCQUFzQjtBQUFBLFFBQ3BELFlBQVksV0FBVyxTQUFTO0FBQzVCLGdCQUFNLFFBQVE7QUFDZCxlQUFLLGVBQWUsSUFBSSxZQUFZLE9BQU87QUFBQSxRQUMvQztBQUFBLFFBQ0EsY0FBYztBQUNWLGlCQUFPLGVBQWM7QUFBQSxRQUN6QjtBQUFBLFFBQ0EsV0FBVyxPQUFPLFdBQVc7QUFDekIsaUJBQVEsSUFBSSxZQUFZLEVBQUcsT0FBTyxLQUFLO0FBQUEsUUFDM0M7QUFBQSxRQUNBLFNBQVMsT0FBTyxVQUFVO0FBQ3RCLGNBQUksYUFBYSxTQUFTO0FBQ3RCLG1CQUFPLEtBQUssYUFBYSxPQUFPLEtBQUs7QUFBQSxVQUN6QyxPQUNLO0FBQ0QsbUJBQVEsSUFBSSxZQUFZLFFBQVEsRUFBRyxPQUFPLEtBQUs7QUFBQSxVQUNuRDtBQUFBLFFBQ0o7QUFBQSxRQUNBLFNBQVMsUUFBUSxRQUFRO0FBQ3JCLGNBQUksV0FBVyxRQUFXO0FBQ3RCLG1CQUFPO0FBQUEsVUFDWCxPQUNLO0FBQ0QsbUJBQU8sT0FBTyxNQUFNLEdBQUcsTUFBTTtBQUFBLFVBQ2pDO0FBQUEsUUFDSjtBQUFBLFFBQ0EsWUFBWSxRQUFRO0FBQ2hCLGlCQUFPLElBQUksV0FBVyxNQUFNO0FBQUEsUUFDaEM7QUFBQSxNQUNKO0FBQ0Esb0JBQWMsY0FBYyxJQUFJLFdBQVcsQ0FBQztBQUM1QyxVQUFNLHdCQUFOLE1BQTRCO0FBQUEsUUFDeEIsWUFBWSxRQUFRO0FBQ2hCLGVBQUssU0FBUztBQUNkLGVBQUssVUFBVSxJQUFJLE1BQU0sUUFBUTtBQUNqQyxlQUFLLG1CQUFtQixDQUFDLFVBQVU7QUFDL0Isa0JBQU0sT0FBTyxNQUFNO0FBQ25CLGlCQUFLLFlBQVksRUFBRSxLQUFLLENBQUMsV0FBVztBQUNoQyxtQkFBSyxRQUFRLEtBQUssSUFBSSxXQUFXLE1BQU0sQ0FBQztBQUFBLFlBQzVDLEdBQUcsTUFBTTtBQUNMLGVBQUMsR0FBRyxNQUFNLEtBQUssRUFBRSxRQUFRLE1BQU0seUNBQXlDO0FBQUEsWUFDNUUsQ0FBQztBQUFBLFVBQ0w7QUFDQSxlQUFLLE9BQU8saUJBQWlCLFdBQVcsS0FBSyxnQkFBZ0I7QUFBQSxRQUNqRTtBQUFBLFFBQ0EsUUFBUSxVQUFVO0FBQ2QsZUFBSyxPQUFPLGlCQUFpQixTQUFTLFFBQVE7QUFDOUMsaUJBQU8sTUFBTSxXQUFXLE9BQU8sTUFBTSxLQUFLLE9BQU8sb0JBQW9CLFNBQVMsUUFBUSxDQUFDO0FBQUEsUUFDM0Y7QUFBQSxRQUNBLFFBQVEsVUFBVTtBQUNkLGVBQUssT0FBTyxpQkFBaUIsU0FBUyxRQUFRO0FBQzlDLGlCQUFPLE1BQU0sV0FBVyxPQUFPLE1BQU0sS0FBSyxPQUFPLG9CQUFvQixTQUFTLFFBQVEsQ0FBQztBQUFBLFFBQzNGO0FBQUEsUUFDQSxNQUFNLFVBQVU7QUFDWixlQUFLLE9BQU8saUJBQWlCLE9BQU8sUUFBUTtBQUM1QyxpQkFBTyxNQUFNLFdBQVcsT0FBTyxNQUFNLEtBQUssT0FBTyxvQkFBb0IsT0FBTyxRQUFRLENBQUM7QUFBQSxRQUN6RjtBQUFBLFFBQ0EsT0FBTyxVQUFVO0FBQ2IsaUJBQU8sS0FBSyxRQUFRLE1BQU0sUUFBUTtBQUFBLFFBQ3RDO0FBQUEsTUFDSjtBQUNBLFVBQU0sd0JBQU4sTUFBNEI7QUFBQSxRQUN4QixZQUFZLFFBQVE7QUFDaEIsZUFBSyxTQUFTO0FBQUEsUUFDbEI7QUFBQSxRQUNBLFFBQVEsVUFBVTtBQUNkLGVBQUssT0FBTyxpQkFBaUIsU0FBUyxRQUFRO0FBQzlDLGlCQUFPLE1BQU0sV0FBVyxPQUFPLE1BQU0sS0FBSyxPQUFPLG9CQUFvQixTQUFTLFFBQVEsQ0FBQztBQUFBLFFBQzNGO0FBQUEsUUFDQSxRQUFRLFVBQVU7QUFDZCxlQUFLLE9BQU8saUJBQWlCLFNBQVMsUUFBUTtBQUM5QyxpQkFBTyxNQUFNLFdBQVcsT0FBTyxNQUFNLEtBQUssT0FBTyxvQkFBb0IsU0FBUyxRQUFRLENBQUM7QUFBQSxRQUMzRjtBQUFBLFFBQ0EsTUFBTSxVQUFVO0FBQ1osZUFBSyxPQUFPLGlCQUFpQixPQUFPLFFBQVE7QUFDNUMsaUJBQU8sTUFBTSxXQUFXLE9BQU8sTUFBTSxLQUFLLE9BQU8sb0JBQW9CLE9BQU8sUUFBUSxDQUFDO0FBQUEsUUFDekY7QUFBQSxRQUNBLE1BQU0sTUFBTSxVQUFVO0FBQ2xCLGNBQUksT0FBTyxTQUFTLFVBQVU7QUFDMUIsZ0JBQUksYUFBYSxVQUFhLGFBQWEsU0FBUztBQUNoRCxvQkFBTSxJQUFJLE1BQU0sc0ZBQXNGLFFBQVEsRUFBRTtBQUFBLFlBQ3BIO0FBQ0EsaUJBQUssT0FBTyxLQUFLLElBQUk7QUFBQSxVQUN6QixPQUNLO0FBQ0QsaUJBQUssT0FBTyxLQUFLLElBQUk7QUFBQSxVQUN6QjtBQUNBLGlCQUFPLFFBQVEsUUFBUTtBQUFBLFFBQzNCO0FBQUEsUUFDQSxNQUFNO0FBQ0YsZUFBSyxPQUFPLE1BQU07QUFBQSxRQUN0QjtBQUFBLE1BQ0o7QUFDQSxVQUFNLGVBQWUsSUFBSSxZQUFZO0FBQ3JDLFVBQU0sT0FBTyxPQUFPLE9BQU87QUFBQSxRQUN2QixlQUFlLE9BQU8sT0FBTztBQUFBLFVBQ3pCLFFBQVEsQ0FBQyxhQUFhLElBQUksY0FBYyxRQUFRO0FBQUEsUUFDcEQsQ0FBQztBQUFBLFFBQ0QsaUJBQWlCLE9BQU8sT0FBTztBQUFBLFVBQzNCLFNBQVMsT0FBTyxPQUFPO0FBQUEsWUFDbkIsTUFBTTtBQUFBLFlBQ04sUUFBUSxDQUFDLEtBQUssWUFBWTtBQUN0QixrQkFBSSxRQUFRLFlBQVksU0FBUztBQUM3QixzQkFBTSxJQUFJLE1BQU0sc0ZBQXNGLFFBQVEsT0FBTyxFQUFFO0FBQUEsY0FDM0g7QUFDQSxxQkFBTyxRQUFRLFFBQVEsYUFBYSxPQUFPLEtBQUssVUFBVSxLQUFLLFFBQVcsQ0FBQyxDQUFDLENBQUM7QUFBQSxZQUNqRjtBQUFBLFVBQ0osQ0FBQztBQUFBLFVBQ0QsU0FBUyxPQUFPLE9BQU87QUFBQSxZQUNuQixNQUFNO0FBQUEsWUFDTixRQUFRLENBQUMsUUFBUSxZQUFZO0FBQ3pCLGtCQUFJLEVBQUUsa0JBQWtCLGFBQWE7QUFDakMsc0JBQU0sSUFBSSxNQUFNLDJEQUEyRDtBQUFBLGNBQy9FO0FBQ0EscUJBQU8sUUFBUSxRQUFRLEtBQUssTUFBTSxJQUFJLFlBQVksUUFBUSxPQUFPLEVBQUUsT0FBTyxNQUFNLENBQUMsQ0FBQztBQUFBLFlBQ3RGO0FBQUEsVUFDSixDQUFDO0FBQUEsUUFDTCxDQUFDO0FBQUEsUUFDRCxRQUFRLE9BQU8sT0FBTztBQUFBLFVBQ2xCLGtCQUFrQixDQUFDLFdBQVcsSUFBSSxzQkFBc0IsTUFBTTtBQUFBLFVBQzlELGtCQUFrQixDQUFDLFdBQVcsSUFBSSxzQkFBc0IsTUFBTTtBQUFBLFFBQ2xFLENBQUM7QUFBQSxRQUNEO0FBQUEsUUFDQSxPQUFPLE9BQU8sT0FBTztBQUFBLFVBQ2pCLFdBQVcsVUFBVSxPQUFPLE1BQU07QUFDOUIsa0JBQU0sU0FBUyxXQUFXLFVBQVUsSUFBSSxHQUFHLElBQUk7QUFDL0MsbUJBQU8sRUFBRSxTQUFTLE1BQU0sYUFBYSxNQUFNLEVBQUU7QUFBQSxVQUNqRDtBQUFBLFVBQ0EsYUFBYSxhQUFhLE1BQU07QUFDNUIsa0JBQU0sU0FBUyxXQUFXLFVBQVUsR0FBRyxHQUFHLElBQUk7QUFDOUMsbUJBQU8sRUFBRSxTQUFTLE1BQU0sYUFBYSxNQUFNLEVBQUU7QUFBQSxVQUNqRDtBQUFBLFVBQ0EsWUFBWSxVQUFVLE9BQU8sTUFBTTtBQUMvQixrQkFBTSxTQUFTLFlBQVksVUFBVSxJQUFJLEdBQUcsSUFBSTtBQUNoRCxtQkFBTyxFQUFFLFNBQVMsTUFBTSxjQUFjLE1BQU0sRUFBRTtBQUFBLFVBQ2xEO0FBQUEsUUFDSixDQUFDO0FBQUEsTUFDTCxDQUFDO0FBQ0QsZUFBUyxNQUFNO0FBQ1gsZUFBTztBQUFBLE1BQ1g7QUFDQSxPQUFDLFNBQVVFLE1BQUs7QUFDWixpQkFBUyxVQUFVO0FBQ2YsZ0JBQU0sSUFBSSxRQUFRLElBQUk7QUFBQSxRQUMxQjtBQUNBLFFBQUFBLEtBQUksVUFBVTtBQUFBLE1BQ2xCLEdBQUcsUUFBUSxNQUFNLENBQUMsRUFBRTtBQUNwQixjQUFRLFVBQVU7QUFBQTtBQUFBOzs7QUMzSmxCO0FBQUE7QUFBQTtBQUtBLFVBQUksa0JBQW1CLFdBQVEsUUFBSyxvQkFBcUIsT0FBTyxTQUFVLFNBQVMsR0FBR0MsSUFBRyxHQUFHLElBQUk7QUFDNUYsWUFBSSxPQUFPLE9BQVcsTUFBSztBQUMzQixZQUFJLE9BQU8sT0FBTyx5QkFBeUJBLElBQUcsQ0FBQztBQUMvQyxZQUFJLENBQUMsU0FBUyxTQUFTLE9BQU8sQ0FBQ0EsR0FBRSxhQUFhLEtBQUssWUFBWSxLQUFLLGVBQWU7QUFDakYsaUJBQU8sRUFBRSxZQUFZLE1BQU0sS0FBSyxXQUFXO0FBQUUsbUJBQU9BLEdBQUUsQ0FBQztBQUFBLFVBQUcsRUFBRTtBQUFBLFFBQzlEO0FBQ0EsZUFBTyxlQUFlLEdBQUcsSUFBSSxJQUFJO0FBQUEsTUFDckMsSUFBTSxTQUFTLEdBQUdBLElBQUcsR0FBRyxJQUFJO0FBQ3hCLFlBQUksT0FBTyxPQUFXLE1BQUs7QUFDM0IsVUFBRSxFQUFFLElBQUlBLEdBQUUsQ0FBQztBQUFBLE1BQ2Y7QUFDQSxVQUFJLGVBQWdCLFdBQVEsUUFBSyxnQkFBaUIsU0FBU0EsSUFBR0MsVUFBUztBQUNuRSxpQkFBUyxLQUFLRCxHQUFHLEtBQUksTUFBTSxhQUFhLENBQUMsT0FBTyxVQUFVLGVBQWUsS0FBS0MsVUFBUyxDQUFDLEVBQUcsaUJBQWdCQSxVQUFTRCxJQUFHLENBQUM7QUFBQSxNQUM1SDtBQUNBLGFBQU8sZUFBZSxTQUFTLGNBQWMsRUFBRSxPQUFPLEtBQUssQ0FBQztBQUM1RCxjQUFRLDBCQUEwQixRQUFRLHVCQUF1QixRQUFRLHVCQUF1QjtBQUNoRyxVQUFNLFFBQVE7QUFFZCxZQUFNLFFBQVEsUUFBUTtBQUN0QixVQUFNLFFBQVE7QUFDZCxtQkFBYSxlQUEwQixPQUFPO0FBQzlDLFVBQU0sdUJBQU4sY0FBbUMsTUFBTSxzQkFBc0I7QUFBQSxRQUMzRCxZQUFZLE1BQU07QUFDZCxnQkFBTTtBQUNOLGVBQUssVUFBVSxJQUFJLE1BQU0sUUFBUTtBQUNqQyxlQUFLLG1CQUFtQixDQUFDLFVBQVU7QUFDL0IsaUJBQUssUUFBUSxLQUFLLE1BQU0sSUFBSTtBQUFBLFVBQ2hDO0FBQ0EsZUFBSyxpQkFBaUIsU0FBUyxDQUFDLFVBQVUsS0FBSyxVQUFVLEtBQUssQ0FBQztBQUMvRCxlQUFLLFlBQVksS0FBSztBQUFBLFFBQzFCO0FBQUEsUUFDQSxPQUFPLFVBQVU7QUFDYixpQkFBTyxLQUFLLFFBQVEsTUFBTSxRQUFRO0FBQUEsUUFDdEM7QUFBQSxNQUNKO0FBQ0EsY0FBUSx1QkFBdUI7QUFDL0IsVUFBTSx1QkFBTixjQUFtQyxNQUFNLHNCQUFzQjtBQUFBLFFBQzNELFlBQVksTUFBTTtBQUNkLGdCQUFNO0FBQ04sZUFBSyxPQUFPO0FBQ1osZUFBSyxhQUFhO0FBQ2xCLGVBQUssaUJBQWlCLFNBQVMsQ0FBQyxVQUFVLEtBQUssVUFBVSxLQUFLLENBQUM7QUFBQSxRQUNuRTtBQUFBLFFBQ0EsTUFBTSxLQUFLO0FBQ1AsY0FBSTtBQUNBLGlCQUFLLEtBQUssWUFBWSxHQUFHO0FBQ3pCLG1CQUFPLFFBQVEsUUFBUTtBQUFBLFVBQzNCLFNBQ08sT0FBTztBQUNWLGlCQUFLLFlBQVksT0FBTyxHQUFHO0FBQzNCLG1CQUFPLFFBQVEsT0FBTyxLQUFLO0FBQUEsVUFDL0I7QUFBQSxRQUNKO0FBQUEsUUFDQSxZQUFZLE9BQU8sS0FBSztBQUNwQixlQUFLO0FBQ0wsZUFBSyxVQUFVLE9BQU8sS0FBSyxLQUFLLFVBQVU7QUFBQSxRQUM5QztBQUFBLFFBQ0EsTUFBTTtBQUFBLFFBQ047QUFBQSxNQUNKO0FBQ0EsY0FBUSx1QkFBdUI7QUFDL0IsZUFBU0UseUJBQXdCLFFBQVEsUUFBUSxRQUFRLFNBQVM7QUFDOUQsWUFBSSxXQUFXLFFBQVc7QUFDdEIsbUJBQVMsTUFBTTtBQUFBLFFBQ25CO0FBQ0EsWUFBSSxNQUFNLG1CQUFtQixHQUFHLE9BQU8sR0FBRztBQUN0QyxvQkFBVSxFQUFFLG9CQUFvQixRQUFRO0FBQUEsUUFDNUM7QUFDQSxnQkFBUSxHQUFHLE1BQU0seUJBQXlCLFFBQVEsUUFBUSxRQUFRLE9BQU87QUFBQSxNQUM3RTtBQUNBLGNBQVEsMEJBQTBCQTtBQUFBO0FBQUE7OztBQzNFbEM7QUFBQTtBQUFBO0FBTUEsYUFBTyxVQUFVO0FBQUE7QUFBQTs7O0FDTmpCO0FBQUE7QUFBQTtBQUFBO0FBeUJBLHVCQUEyRDs7O0FDcEIzRCw4QkFBMkI7OztBQ0EzQixNQUFBQyx5QkFBMkI7OztBQ0EzQixNQUFBQyx5QkFBMkI7QUFHM0IsTUFBQUEseUJBQXdFO0FBR2xFLE1BQU8seUJBQVAsY0FBc0MsNkNBQXFCO0lBTzdELFlBQVksUUFBa0I7QUFDMUIsWUFBSztBQVBVO0FBQ1QsbUNBQTRDO0FBQzVDO0FBRVM7b0NBQWdELENBQUE7QUFJL0QsV0FBSyxTQUFTO0FBQ2QsV0FBSyxPQUFPLFVBQVUsYUFDbEIsS0FBSyxZQUFZLE9BQU8sQ0FBQztBQUU3QixXQUFLLE9BQU8sUUFBUSxXQUNoQixLQUFLLFVBQVUsS0FBSyxDQUFDO0FBRXpCLFdBQUssT0FBTyxRQUFRLENBQUMsTUFBTSxXQUFVO0FBQ2pDLFlBQUksU0FBUyxLQUFNO0FBQ2YsZ0JBQU0sUUFBZTtZQUNqQixNQUFNLEtBQUs7WUFDWCxTQUFTLHlDQUF5QyxJQUFJLGNBQWMsTUFBTTs7QUFFOUUsZUFBSyxVQUFVLEtBQUs7UUFDeEI7QUFDQSxhQUFLLFVBQVM7TUFDbEIsQ0FBQztJQUNMO0lBRUEsT0FBTyxVQUFzQjtBQUN6QixVQUFJLEtBQUssVUFBVSxXQUFXO0FBQzFCLGFBQUssUUFBUTtBQUNiLGFBQUssV0FBVztBQUNoQixlQUFPLEtBQUssT0FBTyxXQUFXLEdBQUc7QUFDN0IsZ0JBQU0sUUFBUSxLQUFLLE9BQU8sSUFBRztBQUM3QixjQUFJLE1BQU0sWUFBWSxRQUFXO0FBQzdCLGlCQUFLLFlBQVksTUFBTSxPQUFPO1VBQ2xDLFdBQVcsTUFBTSxVQUFVLFFBQVc7QUFDbEMsaUJBQUssVUFBVSxNQUFNLEtBQUs7VUFDOUIsT0FBTztBQUNILGlCQUFLLFVBQVM7VUFDbEI7UUFDSjtNQUNKO0FBQ0EsYUFBTztRQUNILFNBQVMsTUFBSztBQUNWLGNBQUksS0FBSyxhQUFhLFVBQVU7QUFDNUIsaUJBQUssUUFBUTtBQUNiLGlCQUFLLFdBQVc7VUFDcEI7UUFDSjs7SUFFUjtJQUVTLFVBQU87QUFDWixZQUFNLFFBQU87QUFDYixXQUFLLFFBQVE7QUFDYixXQUFLLFdBQVc7QUFDaEIsV0FBSyxPQUFPLE9BQU8sR0FBRyxLQUFLLE9BQU8sTUFBTTtJQUM1Qzs7SUFHVSxZQUFZLFNBQVk7QUFDOUIsVUFBSSxLQUFLLFVBQVUsV0FBVztBQUMxQixhQUFLLE9BQU8sT0FBTyxHQUFHLEdBQUcsRUFBRSxRQUFPLENBQUU7TUFDeEMsV0FBVyxLQUFLLFVBQVUsYUFBYTtBQUNuQyxZQUFJO0FBQ0EsZ0JBQU0sT0FBTyxLQUFLLE1BQU0sT0FBTztBQUMvQixlQUFLLFNBQVUsSUFBSTtRQUN2QixTQUFTLEtBQUs7QUFDVixnQkFBTSxRQUFlO1lBQ2pCLE1BQU07O1lBRU4sU0FBUywwQ0FBMEMsT0FBTyxRQUFRLFdBQVksSUFBWSxVQUFVLFNBQVM7O0FBRWpILGVBQUssVUFBVSxLQUFLO1FBQ3hCO01BQ0o7SUFDSjs7SUFHbUIsVUFBVSxPQUFVO0FBQ25DLFVBQUksS0FBSyxVQUFVLFdBQVc7QUFDMUIsYUFBSyxPQUFPLE9BQU8sR0FBRyxHQUFHLEVBQUUsTUFBSyxDQUFFO01BQ3RDLFdBQVcsS0FBSyxVQUFVLGFBQWE7QUFDbkMsY0FBTSxVQUFVLEtBQUs7TUFDekI7SUFDSjtJQUVtQixZQUFTO0FBQ3hCLFVBQUksS0FBSyxVQUFVLFdBQVc7QUFDMUIsYUFBSyxPQUFPLE9BQU8sR0FBRyxHQUFHLENBQUEsQ0FBRTtNQUMvQixXQUFXLEtBQUssVUFBVSxhQUFhO0FBQ25DLGNBQU0sVUFBUztNQUNuQjtBQUNBLFdBQUssUUFBUTtJQUNqQjs7OztBQ3JHSixNQUFBQyx5QkFBd0I7QUFDeEIsTUFBQUEseUJBQXFEO0FBRy9DLE1BQU8seUJBQVAsY0FBc0MsNkNBQXFCO0lBSTdELFlBQVksUUFBa0I7QUFDMUIsWUFBSztBQUpDLHdDQUFhO0FBQ0o7QUFJZixXQUFLLFNBQVM7SUFDbEI7SUFFQSxNQUFHO0lBQ0g7SUFFQSxNQUFNLE1BQU0sS0FBWTtBQUNwQixVQUFJO0FBQ0EsY0FBTSxVQUFVLEtBQUssVUFBVSxHQUFHO0FBQ2xDLGFBQUssT0FBTyxLQUFLLE9BQU87TUFDNUIsU0FBUyxHQUFHO0FBQ1IsYUFBSztBQUNMLGFBQUssVUFBVSxHQUFHLEtBQUssS0FBSyxVQUFVO01BQzFDO0lBQ0o7Ozs7QUN2QkosTUFBQUMseUJBQXdDOzs7QUNrQmxDLFdBQVUsU0FBUyxXQUFvQjtBQUN6QyxXQUFPO01BQ0gsTUFBTSxhQUFXLFVBQVUsS0FBSyxPQUFPO01BQ3ZDLFdBQVcsUUFBSztBQUNaLGtCQUFVLFlBQVksV0FBUyxHQUFHLE1BQU0sSUFBSTtNQUNoRDtNQUNBLFNBQVMsUUFBSztBQUVWLGtCQUFVLFVBQVUsQ0FBQyxVQUFjO0FBQy9CLGNBQUksT0FBTyxPQUFPLE9BQU8sU0FBUyxHQUFHO0FBQ2pDLGVBQUcsTUFBTSxPQUFPO1VBQ3BCO1FBQ0o7TUFDSjtNQUNBLFNBQVMsUUFBSztBQUNWLGtCQUFVLFVBQVUsV0FBUyxHQUFHLE1BQU0sTUFBTSxNQUFNLE1BQU07TUFDNUQ7TUFDQSxTQUFTLE1BQU0sVUFBVSxNQUFLOztFQUV0Qzs7O0FDcEJBLFdBQVMsSUFBTztBQUNaLFdBQVEsV0FBbUI7QUFBQSxFQUMvQjtBQUVBLFdBQVMsR0FBcUIsUUFBb0I7QUFDOUMsV0FBTyxJQUFJLE1BQU0sQ0FBQyxHQUFRO0FBQUEsTUFDdEIsS0FBSyxDQUFDLEdBQUcsTUFBTyxPQUFPLEVBQVUsQ0FBVztBQUFBLElBQ2hELENBQUM7QUFBQSxFQUNMO0FBRUEsV0FBUyxJQUFPLFFBQW9CO0FBQ2hDLFdBQU8sSUFBSSxNQUFNLFdBQVk7QUFBQSxJQUFDLEdBQVU7QUFBQSxNQUNwQyxXQUFXLENBQUMsR0FBRyxTQUFTLEtBQUssT0FBTyxHQUFVLEdBQUcsSUFBSTtBQUFBLE1BQ3JELEtBQVcsQ0FBQyxHQUFHLE1BQVUsT0FBTyxFQUFVLENBQVc7QUFBQSxJQUN6RCxDQUFDO0FBQUEsRUFDTDtBQUVPLE1BQU0sU0FBaUIsR0FBRyxNQUFNLEVBQUUsRUFBRSxNQUFNO0FBQzFDLE1BQU0sWUFBaUIsR0FBRyxNQUFNLEVBQUUsRUFBRSxTQUFTO0FBQzdDLE1BQU0saUJBQWlCLEdBQUcsTUFBTSxFQUFFLEVBQUUsY0FBYztBQUNsRCxNQUFNLFlBQWlCLEdBQUcsTUFBTyxFQUFFLEVBQVUsU0FBUztBQUN0RCxNQUFNLE1BQWlCLElBQUksTUFBTSxFQUFFLEVBQUUsR0FBRztBQUN4QyxNQUFNLFFBQWlCLElBQUksTUFBTSxFQUFFLEVBQUUsS0FBSztBQUMxQyxNQUFNLFdBQWlCLElBQUksTUFBTSxFQUFFLEVBQUUsUUFBUTtBQUM3QyxNQUFNLFlBQWlCLElBQUksTUFBTSxFQUFFLEVBQUUsU0FBUztBQUM5QyxNQUFNLFVBQWlCLEdBQUcsTUFBTSxFQUFFLEVBQUUsT0FBTztBQUMzQyxNQUFNLFNBQWlCLEdBQUcsTUFBTSxFQUFFLEVBQUUsTUFBTTs7O0FDNUMxQyxNQUFJO0FBQ1gsR0FBQyxTQUFVQyxjQUFhO0FBQ3BCLGFBQVMsR0FBRyxPQUFPO0FBQ2YsYUFBTyxPQUFPLFVBQVU7QUFBQSxJQUM1QjtBQUNBLElBQUFBLGFBQVksS0FBSztBQUFBLEVBQ3JCLEdBQUcsZ0JBQWdCLGNBQWMsQ0FBQyxFQUFFO0FBQzdCLE1BQUk7QUFDWCxHQUFDLFNBQVVDLE1BQUs7QUFDWixhQUFTLEdBQUcsT0FBTztBQUNmLGFBQU8sT0FBTyxVQUFVO0FBQUEsSUFDNUI7QUFDQSxJQUFBQSxLQUFJLEtBQUs7QUFBQSxFQUNiLEdBQUcsUUFBUSxNQUFNLENBQUMsRUFBRTtBQUNiLE1BQUk7QUFDWCxHQUFDLFNBQVVDLFVBQVM7QUFDaEIsSUFBQUEsU0FBUSxZQUFZO0FBQ3BCLElBQUFBLFNBQVEsWUFBWTtBQUNwQixhQUFTLEdBQUcsT0FBTztBQUNmLGFBQU8sT0FBTyxVQUFVLFlBQVlBLFNBQVEsYUFBYSxTQUFTLFNBQVNBLFNBQVE7QUFBQSxJQUN2RjtBQUNBLElBQUFBLFNBQVEsS0FBSztBQUFBLEVBQ2pCLEdBQUcsWUFBWSxVQUFVLENBQUMsRUFBRTtBQUNyQixNQUFJO0FBQ1gsR0FBQyxTQUFVQyxXQUFVO0FBQ2pCLElBQUFBLFVBQVMsWUFBWTtBQUNyQixJQUFBQSxVQUFTLFlBQVk7QUFDckIsYUFBUyxHQUFHLE9BQU87QUFDZixhQUFPLE9BQU8sVUFBVSxZQUFZQSxVQUFTLGFBQWEsU0FBUyxTQUFTQSxVQUFTO0FBQUEsSUFDekY7QUFDQSxJQUFBQSxVQUFTLEtBQUs7QUFBQSxFQUNsQixHQUFHLGFBQWEsV0FBVyxDQUFDLEVBQUU7QUFLdkIsTUFBSUM7QUFDWCxHQUFDLFNBQVVBLFdBQVU7QUFNakIsYUFBUyxPQUFPLE1BQU0sV0FBVztBQUM3QixVQUFJLFNBQVMsT0FBTyxXQUFXO0FBQzNCLGVBQU8sU0FBUztBQUFBLE1BQ3BCO0FBQ0EsVUFBSSxjQUFjLE9BQU8sV0FBVztBQUNoQyxvQkFBWSxTQUFTO0FBQUEsTUFDekI7QUFDQSxhQUFPLEVBQUUsTUFBTSxVQUFVO0FBQUEsSUFDN0I7QUFDQSxJQUFBQSxVQUFTLFNBQVM7QUFJbEIsYUFBUyxHQUFHLE9BQU87QUFDZixVQUFJLFlBQVk7QUFDaEIsYUFBTyxHQUFHLGNBQWMsU0FBUyxLQUFLLEdBQUcsU0FBUyxVQUFVLElBQUksS0FBSyxHQUFHLFNBQVMsVUFBVSxTQUFTO0FBQUEsSUFDeEc7QUFDQSxJQUFBQSxVQUFTLEtBQUs7QUFBQSxFQUNsQixHQUFHQSxjQUFhQSxZQUFXLENBQUMsRUFBRTtBQUt2QixNQUFJQztBQUNYLEdBQUMsU0FBVUEsUUFBTztBQUNkLGFBQVMsT0FBTyxLQUFLLEtBQUssT0FBTyxNQUFNO0FBQ25DLFVBQUksR0FBRyxTQUFTLEdBQUcsS0FBSyxHQUFHLFNBQVMsR0FBRyxLQUFLLEdBQUcsU0FBUyxLQUFLLEtBQUssR0FBRyxTQUFTLElBQUksR0FBRztBQUNqRixlQUFPLEVBQUUsT0FBT0QsVUFBUyxPQUFPLEtBQUssR0FBRyxHQUFHLEtBQUtBLFVBQVMsT0FBTyxPQUFPLElBQUksRUFBRTtBQUFBLE1BQ2pGLFdBQ1NBLFVBQVMsR0FBRyxHQUFHLEtBQUtBLFVBQVMsR0FBRyxHQUFHLEdBQUc7QUFDM0MsZUFBTyxFQUFFLE9BQU8sS0FBSyxLQUFLLElBQUk7QUFBQSxNQUNsQyxPQUNLO0FBQ0QsY0FBTSxJQUFJLE1BQU0sOENBQThDLEdBQUcsS0FBSyxHQUFHLEtBQUssS0FBSyxLQUFLLElBQUksR0FBRztBQUFBLE1BQ25HO0FBQUEsSUFDSjtBQUNBLElBQUFDLE9BQU0sU0FBUztBQUlmLGFBQVMsR0FBRyxPQUFPO0FBQ2YsVUFBSSxZQUFZO0FBQ2hCLGFBQU8sR0FBRyxjQUFjLFNBQVMsS0FBS0QsVUFBUyxHQUFHLFVBQVUsS0FBSyxLQUFLQSxVQUFTLEdBQUcsVUFBVSxHQUFHO0FBQUEsSUFDbkc7QUFDQSxJQUFBQyxPQUFNLEtBQUs7QUFBQSxFQUNmLEdBQUdBLFdBQVVBLFNBQVEsQ0FBQyxFQUFFO0FBS2pCLE1BQUk7QUFDWCxHQUFDLFNBQVVDLFdBQVU7QUFNakIsYUFBUyxPQUFPLEtBQUssT0FBTztBQUN4QixhQUFPLEVBQUUsS0FBSyxNQUFNO0FBQUEsSUFDeEI7QUFDQSxJQUFBQSxVQUFTLFNBQVM7QUFJbEIsYUFBUyxHQUFHLE9BQU87QUFDZixVQUFJLFlBQVk7QUFDaEIsYUFBTyxHQUFHLGNBQWMsU0FBUyxLQUFLRCxPQUFNLEdBQUcsVUFBVSxLQUFLLE1BQU0sR0FBRyxPQUFPLFVBQVUsR0FBRyxLQUFLLEdBQUcsVUFBVSxVQUFVLEdBQUc7QUFBQSxJQUM5SDtBQUNBLElBQUFDLFVBQVMsS0FBSztBQUFBLEVBQ2xCLEdBQUcsYUFBYSxXQUFXLENBQUMsRUFBRTtBQUt2QixNQUFJO0FBQ1gsR0FBQyxTQUFVQyxlQUFjO0FBUXJCLGFBQVMsT0FBTyxXQUFXLGFBQWEsc0JBQXNCLHNCQUFzQjtBQUNoRixhQUFPLEVBQUUsV0FBVyxhQUFhLHNCQUFzQixxQkFBcUI7QUFBQSxJQUNoRjtBQUNBLElBQUFBLGNBQWEsU0FBUztBQUl0QixhQUFTLEdBQUcsT0FBTztBQUNmLFVBQUksWUFBWTtBQUNoQixhQUFPLEdBQUcsY0FBYyxTQUFTLEtBQUtGLE9BQU0sR0FBRyxVQUFVLFdBQVcsS0FBSyxHQUFHLE9BQU8sVUFBVSxTQUFTLEtBQy9GQSxPQUFNLEdBQUcsVUFBVSxvQkFBb0IsTUFDdENBLE9BQU0sR0FBRyxVQUFVLG9CQUFvQixLQUFLLEdBQUcsVUFBVSxVQUFVLG9CQUFvQjtBQUFBLElBQ25HO0FBQ0EsSUFBQUUsY0FBYSxLQUFLO0FBQUEsRUFDdEIsR0FBRyxpQkFBaUIsZUFBZSxDQUFDLEVBQUU7QUFLL0IsTUFBSTtBQUNYLEdBQUMsU0FBVUMsUUFBTztBQUlkLGFBQVMsT0FBTyxLQUFLLE9BQU8sTUFBTSxPQUFPO0FBQ3JDLGFBQU87QUFBQSxRQUNIO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFDQSxJQUFBQSxPQUFNLFNBQVM7QUFJZixhQUFTLEdBQUcsT0FBTztBQUNmLFlBQU0sWUFBWTtBQUNsQixhQUFPLEdBQUcsY0FBYyxTQUFTLEtBQUssR0FBRyxZQUFZLFVBQVUsS0FBSyxHQUFHLENBQUMsS0FDakUsR0FBRyxZQUFZLFVBQVUsT0FBTyxHQUFHLENBQUMsS0FDcEMsR0FBRyxZQUFZLFVBQVUsTUFBTSxHQUFHLENBQUMsS0FDbkMsR0FBRyxZQUFZLFVBQVUsT0FBTyxHQUFHLENBQUM7QUFBQSxJQUMvQztBQUNBLElBQUFBLE9BQU0sS0FBSztBQUFBLEVBQ2YsR0FBRyxVQUFVLFFBQVEsQ0FBQyxFQUFFO0FBS2pCLE1BQUk7QUFDWCxHQUFDLFNBQVVDLG1CQUFrQjtBQUl6QixhQUFTLE9BQU8sT0FBTyxPQUFPO0FBQzFCLGFBQU87QUFBQSxRQUNIO0FBQUEsUUFDQTtBQUFBLE1BQ0o7QUFBQSxJQUNKO0FBQ0EsSUFBQUEsa0JBQWlCLFNBQVM7QUFJMUIsYUFBUyxHQUFHLE9BQU87QUFDZixZQUFNLFlBQVk7QUFDbEIsYUFBTyxHQUFHLGNBQWMsU0FBUyxLQUFLSixPQUFNLEdBQUcsVUFBVSxLQUFLLEtBQUssTUFBTSxHQUFHLFVBQVUsS0FBSztBQUFBLElBQy9GO0FBQ0EsSUFBQUksa0JBQWlCLEtBQUs7QUFBQSxFQUMxQixHQUFHLHFCQUFxQixtQkFBbUIsQ0FBQyxFQUFFO0FBS3ZDLE1BQUk7QUFDWCxHQUFDLFNBQVVDLG9CQUFtQjtBQUkxQixhQUFTLE9BQU8sT0FBTyxVQUFVLHFCQUFxQjtBQUNsRCxhQUFPO0FBQUEsUUFDSDtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFDQSxJQUFBQSxtQkFBa0IsU0FBUztBQUkzQixhQUFTLEdBQUcsT0FBTztBQUNmLFlBQU0sWUFBWTtBQUNsQixhQUFPLEdBQUcsY0FBYyxTQUFTLEtBQUssR0FBRyxPQUFPLFVBQVUsS0FBSyxNQUN2RCxHQUFHLFVBQVUsVUFBVSxRQUFRLEtBQUssU0FBUyxHQUFHLFNBQVMsT0FDekQsR0FBRyxVQUFVLFVBQVUsbUJBQW1CLEtBQUssR0FBRyxXQUFXLFVBQVUscUJBQXFCLFNBQVMsRUFBRTtBQUFBLElBQ25IO0FBQ0EsSUFBQUEsbUJBQWtCLEtBQUs7QUFBQSxFQUMzQixHQUFHLHNCQUFzQixvQkFBb0IsQ0FBQyxFQUFFO0FBSXpDLE1BQUk7QUFDWCxHQUFDLFNBQVVDLG1CQUFrQjtBQUl6QixJQUFBQSxrQkFBaUIsVUFBVTtBQUkzQixJQUFBQSxrQkFBaUIsVUFBVTtBQUkzQixJQUFBQSxrQkFBaUIsU0FBUztBQUFBLEVBQzlCLEdBQUcscUJBQXFCLG1CQUFtQixDQUFDLEVBQUU7QUFLdkMsTUFBSTtBQUNYLEdBQUMsU0FBVUMsZUFBYztBQUlyQixhQUFTLE9BQU8sV0FBVyxTQUFTLGdCQUFnQixjQUFjLE1BQU0sZUFBZTtBQUNuRixZQUFNLFNBQVM7QUFBQSxRQUNYO0FBQUEsUUFDQTtBQUFBLE1BQ0o7QUFDQSxVQUFJLEdBQUcsUUFBUSxjQUFjLEdBQUc7QUFDNUIsZUFBTyxpQkFBaUI7QUFBQSxNQUM1QjtBQUNBLFVBQUksR0FBRyxRQUFRLFlBQVksR0FBRztBQUMxQixlQUFPLGVBQWU7QUFBQSxNQUMxQjtBQUNBLFVBQUksR0FBRyxRQUFRLElBQUksR0FBRztBQUNsQixlQUFPLE9BQU87QUFBQSxNQUNsQjtBQUNBLFVBQUksR0FBRyxRQUFRLGFBQWEsR0FBRztBQUMzQixlQUFPLGdCQUFnQjtBQUFBLE1BQzNCO0FBQ0EsYUFBTztBQUFBLElBQ1g7QUFDQSxJQUFBQSxjQUFhLFNBQVM7QUFJdEIsYUFBUyxHQUFHLE9BQU87QUFDZixZQUFNLFlBQVk7QUFDbEIsYUFBTyxHQUFHLGNBQWMsU0FBUyxLQUFLLEdBQUcsU0FBUyxVQUFVLFNBQVMsS0FBSyxHQUFHLFNBQVMsVUFBVSxTQUFTLE1BQ2pHLEdBQUcsVUFBVSxVQUFVLGNBQWMsS0FBSyxHQUFHLFNBQVMsVUFBVSxjQUFjLE9BQzlFLEdBQUcsVUFBVSxVQUFVLFlBQVksS0FBSyxHQUFHLFNBQVMsVUFBVSxZQUFZLE9BQzFFLEdBQUcsVUFBVSxVQUFVLElBQUksS0FBSyxHQUFHLE9BQU8sVUFBVSxJQUFJO0FBQUEsSUFDcEU7QUFDQSxJQUFBQSxjQUFhLEtBQUs7QUFBQSxFQUN0QixHQUFHLGlCQUFpQixlQUFlLENBQUMsRUFBRTtBQUsvQixNQUFJO0FBQ1gsR0FBQyxTQUFVQywrQkFBOEI7QUFJckMsYUFBUyxPQUFPQyxXQUFVLFNBQVM7QUFDL0IsYUFBTztBQUFBLFFBQ0gsVUFBQUE7QUFBQSxRQUNBO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFDQSxJQUFBRCw4QkFBNkIsU0FBUztBQUl0QyxhQUFTLEdBQUcsT0FBTztBQUNmLFVBQUksWUFBWTtBQUNoQixhQUFPLEdBQUcsUUFBUSxTQUFTLEtBQUssU0FBUyxHQUFHLFVBQVUsUUFBUSxLQUFLLEdBQUcsT0FBTyxVQUFVLE9BQU87QUFBQSxJQUNsRztBQUNBLElBQUFBLDhCQUE2QixLQUFLO0FBQUEsRUFDdEMsR0FBRyxpQ0FBaUMsK0JBQStCLENBQUMsRUFBRTtBQUkvRCxNQUFJO0FBQ1gsR0FBQyxTQUFVRSxxQkFBb0I7QUFJM0IsSUFBQUEsb0JBQW1CLFFBQVE7QUFJM0IsSUFBQUEsb0JBQW1CLFVBQVU7QUFJN0IsSUFBQUEsb0JBQW1CLGNBQWM7QUFJakMsSUFBQUEsb0JBQW1CLE9BQU87QUFBQSxFQUM5QixHQUFHLHVCQUF1QixxQkFBcUIsQ0FBQyxFQUFFO0FBTTNDLE1BQUk7QUFDWCxHQUFDLFNBQVVDLGdCQUFlO0FBT3RCLElBQUFBLGVBQWMsY0FBYztBQU01QixJQUFBQSxlQUFjLGFBQWE7QUFBQSxFQUMvQixHQUFHLGtCQUFrQixnQkFBZ0IsQ0FBQyxFQUFFO0FBTWpDLE1BQUk7QUFDWCxHQUFDLFNBQVVDLGtCQUFpQjtBQUN4QixhQUFTLEdBQUcsT0FBTztBQUNmLFlBQU0sWUFBWTtBQUNsQixhQUFPLEdBQUcsY0FBYyxTQUFTLEtBQUssR0FBRyxPQUFPLFVBQVUsSUFBSTtBQUFBLElBQ2xFO0FBQ0EsSUFBQUEsaUJBQWdCLEtBQUs7QUFBQSxFQUN6QixHQUFHLG9CQUFvQixrQkFBa0IsQ0FBQyxFQUFFO0FBS3JDLE1BQUk7QUFDWCxHQUFDLFNBQVVDLGFBQVk7QUFJbkIsYUFBUyxPQUFPLE9BQU8sU0FBUyxVQUFVLE1BQU0sUUFBUSxvQkFBb0I7QUFDeEUsVUFBSSxTQUFTLEVBQUUsT0FBTyxRQUFRO0FBQzlCLFVBQUksR0FBRyxRQUFRLFFBQVEsR0FBRztBQUN0QixlQUFPLFdBQVc7QUFBQSxNQUN0QjtBQUNBLFVBQUksR0FBRyxRQUFRLElBQUksR0FBRztBQUNsQixlQUFPLE9BQU87QUFBQSxNQUNsQjtBQUNBLFVBQUksR0FBRyxRQUFRLE1BQU0sR0FBRztBQUNwQixlQUFPLFNBQVM7QUFBQSxNQUNwQjtBQUNBLFVBQUksR0FBRyxRQUFRLGtCQUFrQixHQUFHO0FBQ2hDLGVBQU8scUJBQXFCO0FBQUEsTUFDaEM7QUFDQSxhQUFPO0FBQUEsSUFDWDtBQUNBLElBQUFBLFlBQVcsU0FBUztBQUlwQixhQUFTLEdBQUcsT0FBTztBQUNmLFVBQUk7QUFDSixVQUFJLFlBQVk7QUFDaEIsYUFBTyxHQUFHLFFBQVEsU0FBUyxLQUNwQmIsT0FBTSxHQUFHLFVBQVUsS0FBSyxLQUN4QixHQUFHLE9BQU8sVUFBVSxPQUFPLE1BQzFCLEdBQUcsT0FBTyxVQUFVLFFBQVEsS0FBSyxHQUFHLFVBQVUsVUFBVSxRQUFRLE9BQ2hFLEdBQUcsUUFBUSxVQUFVLElBQUksS0FBSyxHQUFHLE9BQU8sVUFBVSxJQUFJLEtBQUssR0FBRyxVQUFVLFVBQVUsSUFBSSxPQUN0RixHQUFHLFVBQVUsVUFBVSxlQUFlLEtBQU0sR0FBRyxRQUFRLEtBQUssVUFBVSxxQkFBcUIsUUFBUSxPQUFPLFNBQVMsU0FBUyxHQUFHLElBQUksT0FDbkksR0FBRyxPQUFPLFVBQVUsTUFBTSxLQUFLLEdBQUcsVUFBVSxVQUFVLE1BQU0sT0FDNUQsR0FBRyxVQUFVLFVBQVUsa0JBQWtCLEtBQUssR0FBRyxXQUFXLFVBQVUsb0JBQW9CLDZCQUE2QixFQUFFO0FBQUEsSUFDckk7QUFDQSxJQUFBYSxZQUFXLEtBQUs7QUFBQSxFQUNwQixHQUFHLGVBQWUsYUFBYSxDQUFDLEVBQUU7QUFLM0IsTUFBSTtBQUNYLEdBQUMsU0FBVUMsVUFBUztBQUloQixhQUFTLE9BQU8sT0FBTyxZQUFZLE1BQU07QUFDckMsVUFBSSxTQUFTLEVBQUUsT0FBTyxRQUFRO0FBQzlCLFVBQUksR0FBRyxRQUFRLElBQUksS0FBSyxLQUFLLFNBQVMsR0FBRztBQUNyQyxlQUFPLFlBQVk7QUFBQSxNQUN2QjtBQUNBLGFBQU87QUFBQSxJQUNYO0FBQ0EsSUFBQUEsU0FBUSxTQUFTO0FBSWpCLGFBQVMsR0FBRyxPQUFPO0FBQ2YsVUFBSSxZQUFZO0FBQ2hCLGFBQU8sR0FBRyxRQUFRLFNBQVMsS0FBSyxHQUFHLE9BQU8sVUFBVSxLQUFLLEtBQUssR0FBRyxPQUFPLFVBQVUsT0FBTztBQUFBLElBQzdGO0FBQ0EsSUFBQUEsU0FBUSxLQUFLO0FBQUEsRUFDakIsR0FBRyxZQUFZLFVBQVUsQ0FBQyxFQUFFO0FBS3JCLE1BQUk7QUFDWCxHQUFDLFNBQVVDLFdBQVU7QUFNakIsYUFBUyxRQUFRLE9BQU8sU0FBUztBQUM3QixhQUFPLEVBQUUsT0FBTyxRQUFRO0FBQUEsSUFDNUI7QUFDQSxJQUFBQSxVQUFTLFVBQVU7QUFNbkIsYUFBUyxPQUFPLFVBQVUsU0FBUztBQUMvQixhQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sVUFBVSxLQUFLLFNBQVMsR0FBRyxRQUFRO0FBQUEsSUFDaEU7QUFDQSxJQUFBQSxVQUFTLFNBQVM7QUFLbEIsYUFBUyxJQUFJLE9BQU87QUFDaEIsYUFBTyxFQUFFLE9BQU8sU0FBUyxHQUFHO0FBQUEsSUFDaEM7QUFDQSxJQUFBQSxVQUFTLE1BQU07QUFDZixhQUFTLEdBQUcsT0FBTztBQUNmLFlBQU0sWUFBWTtBQUNsQixhQUFPLEdBQUcsY0FBYyxTQUFTLEtBQzFCLEdBQUcsT0FBTyxVQUFVLE9BQU8sS0FDM0JmLE9BQU0sR0FBRyxVQUFVLEtBQUs7QUFBQSxJQUNuQztBQUNBLElBQUFlLFVBQVMsS0FBSztBQUFBLEVBQ2xCLEdBQUcsYUFBYSxXQUFXLENBQUMsRUFBRTtBQUN2QixNQUFJO0FBQ1gsR0FBQyxTQUFVQyxtQkFBa0I7QUFDekIsYUFBUyxPQUFPLE9BQU8sbUJBQW1CLGFBQWE7QUFDbkQsWUFBTSxTQUFTLEVBQUUsTUFBTTtBQUN2QixVQUFJLHNCQUFzQixRQUFXO0FBQ2pDLGVBQU8sb0JBQW9CO0FBQUEsTUFDL0I7QUFDQSxVQUFJLGdCQUFnQixRQUFXO0FBQzNCLGVBQU8sY0FBYztBQUFBLE1BQ3pCO0FBQ0EsYUFBTztBQUFBLElBQ1g7QUFDQSxJQUFBQSxrQkFBaUIsU0FBUztBQUMxQixhQUFTLEdBQUcsT0FBTztBQUNmLFlBQU0sWUFBWTtBQUNsQixhQUFPLEdBQUcsY0FBYyxTQUFTLEtBQUssR0FBRyxPQUFPLFVBQVUsS0FBSyxNQUMxRCxHQUFHLFFBQVEsVUFBVSxpQkFBaUIsS0FBSyxVQUFVLHNCQUFzQixZQUMzRSxHQUFHLE9BQU8sVUFBVSxXQUFXLEtBQUssVUFBVSxnQkFBZ0I7QUFBQSxJQUN2RTtBQUNBLElBQUFBLGtCQUFpQixLQUFLO0FBQUEsRUFDMUIsR0FBRyxxQkFBcUIsbUJBQW1CLENBQUMsRUFBRTtBQUN2QyxNQUFJO0FBQ1gsR0FBQyxTQUFVQyw2QkFBNEI7QUFDbkMsYUFBUyxHQUFHLE9BQU87QUFDZixZQUFNLFlBQVk7QUFDbEIsYUFBTyxHQUFHLE9BQU8sU0FBUztBQUFBLElBQzlCO0FBQ0EsSUFBQUEsNEJBQTJCLEtBQUs7QUFBQSxFQUNwQyxHQUFHLCtCQUErQiw2QkFBNkIsQ0FBQyxFQUFFO0FBQzNELE1BQUk7QUFDWCxHQUFDLFNBQVVDLG9CQUFtQjtBQVExQixhQUFTLFFBQVEsT0FBTyxTQUFTLFlBQVk7QUFDekMsYUFBTyxFQUFFLE9BQU8sU0FBUyxjQUFjLFdBQVc7QUFBQSxJQUN0RDtBQUNBLElBQUFBLG1CQUFrQixVQUFVO0FBUTVCLGFBQVMsT0FBTyxVQUFVLFNBQVMsWUFBWTtBQUMzQyxhQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sVUFBVSxLQUFLLFNBQVMsR0FBRyxTQUFTLGNBQWMsV0FBVztBQUFBLElBQzFGO0FBQ0EsSUFBQUEsbUJBQWtCLFNBQVM7QUFPM0IsYUFBUyxJQUFJLE9BQU8sWUFBWTtBQUM1QixhQUFPLEVBQUUsT0FBTyxTQUFTLElBQUksY0FBYyxXQUFXO0FBQUEsSUFDMUQ7QUFDQSxJQUFBQSxtQkFBa0IsTUFBTTtBQUN4QixhQUFTLEdBQUcsT0FBTztBQUNmLFlBQU0sWUFBWTtBQUNsQixhQUFPLFNBQVMsR0FBRyxTQUFTLE1BQU0saUJBQWlCLEdBQUcsVUFBVSxZQUFZLEtBQUssMkJBQTJCLEdBQUcsVUFBVSxZQUFZO0FBQUEsSUFDekk7QUFDQSxJQUFBQSxtQkFBa0IsS0FBSztBQUFBLEVBQzNCLEdBQUcsc0JBQXNCLG9CQUFvQixDQUFDLEVBQUU7QUFLekMsTUFBSTtBQUNYLEdBQUMsU0FBVUMsbUJBQWtCO0FBSXpCLGFBQVMsT0FBTyxjQUFjLE9BQU87QUFDakMsYUFBTyxFQUFFLGNBQWMsTUFBTTtBQUFBLElBQ2pDO0FBQ0EsSUFBQUEsa0JBQWlCLFNBQVM7QUFDMUIsYUFBUyxHQUFHLE9BQU87QUFDZixVQUFJLFlBQVk7QUFDaEIsYUFBTyxHQUFHLFFBQVEsU0FBUyxLQUNwQix3Q0FBd0MsR0FBRyxVQUFVLFlBQVksS0FDakUsTUFBTSxRQUFRLFVBQVUsS0FBSztBQUFBLElBQ3hDO0FBQ0EsSUFBQUEsa0JBQWlCLEtBQUs7QUFBQSxFQUMxQixHQUFHLHFCQUFxQixtQkFBbUIsQ0FBQyxFQUFFO0FBQ3ZDLE1BQUk7QUFDWCxHQUFDLFNBQVVDLGFBQVk7QUFDbkIsYUFBUyxPQUFPLEtBQUssU0FBUyxZQUFZO0FBQ3RDLFVBQUksU0FBUztBQUFBLFFBQ1QsTUFBTTtBQUFBLFFBQ047QUFBQSxNQUNKO0FBQ0EsVUFBSSxZQUFZLFdBQWMsUUFBUSxjQUFjLFVBQWEsUUFBUSxtQkFBbUIsU0FBWTtBQUNwRyxlQUFPLFVBQVU7QUFBQSxNQUNyQjtBQUNBLFVBQUksZUFBZSxRQUFXO0FBQzFCLGVBQU8sZUFBZTtBQUFBLE1BQzFCO0FBQ0EsYUFBTztBQUFBLElBQ1g7QUFDQSxJQUFBQSxZQUFXLFNBQVM7QUFDcEIsYUFBUyxHQUFHLE9BQU87QUFDZixVQUFJLFlBQVk7QUFDaEIsYUFBTyxhQUFhLFVBQVUsU0FBUyxZQUFZLEdBQUcsT0FBTyxVQUFVLEdBQUcsTUFBTSxVQUFVLFlBQVksV0FDaEcsVUFBVSxRQUFRLGNBQWMsVUFBYSxHQUFHLFFBQVEsVUFBVSxRQUFRLFNBQVMsT0FBTyxVQUFVLFFBQVEsbUJBQW1CLFVBQWEsR0FBRyxRQUFRLFVBQVUsUUFBUSxjQUFjLFFBQVMsVUFBVSxpQkFBaUIsVUFBYSwyQkFBMkIsR0FBRyxVQUFVLFlBQVk7QUFBQSxJQUN0UztBQUNBLElBQUFBLFlBQVcsS0FBSztBQUFBLEVBQ3BCLEdBQUcsZUFBZSxhQUFhLENBQUMsRUFBRTtBQUMzQixNQUFJO0FBQ1gsR0FBQyxTQUFVQyxhQUFZO0FBQ25CLGFBQVMsT0FBTyxRQUFRLFFBQVEsU0FBUyxZQUFZO0FBQ2pELFVBQUksU0FBUztBQUFBLFFBQ1QsTUFBTTtBQUFBLFFBQ047QUFBQSxRQUNBO0FBQUEsTUFDSjtBQUNBLFVBQUksWUFBWSxXQUFjLFFBQVEsY0FBYyxVQUFhLFFBQVEsbUJBQW1CLFNBQVk7QUFDcEcsZUFBTyxVQUFVO0FBQUEsTUFDckI7QUFDQSxVQUFJLGVBQWUsUUFBVztBQUMxQixlQUFPLGVBQWU7QUFBQSxNQUMxQjtBQUNBLGFBQU87QUFBQSxJQUNYO0FBQ0EsSUFBQUEsWUFBVyxTQUFTO0FBQ3BCLGFBQVMsR0FBRyxPQUFPO0FBQ2YsVUFBSSxZQUFZO0FBQ2hCLGFBQU8sYUFBYSxVQUFVLFNBQVMsWUFBWSxHQUFHLE9BQU8sVUFBVSxNQUFNLEtBQUssR0FBRyxPQUFPLFVBQVUsTUFBTSxNQUFNLFVBQVUsWUFBWSxXQUNsSSxVQUFVLFFBQVEsY0FBYyxVQUFhLEdBQUcsUUFBUSxVQUFVLFFBQVEsU0FBUyxPQUFPLFVBQVUsUUFBUSxtQkFBbUIsVUFBYSxHQUFHLFFBQVEsVUFBVSxRQUFRLGNBQWMsUUFBUyxVQUFVLGlCQUFpQixVQUFhLDJCQUEyQixHQUFHLFVBQVUsWUFBWTtBQUFBLElBQ3RTO0FBQ0EsSUFBQUEsWUFBVyxLQUFLO0FBQUEsRUFDcEIsR0FBRyxlQUFlLGFBQWEsQ0FBQyxFQUFFO0FBQzNCLE1BQUk7QUFDWCxHQUFDLFNBQVVDLGFBQVk7QUFDbkIsYUFBUyxPQUFPLEtBQUssU0FBUyxZQUFZO0FBQ3RDLFVBQUksU0FBUztBQUFBLFFBQ1QsTUFBTTtBQUFBLFFBQ047QUFBQSxNQUNKO0FBQ0EsVUFBSSxZQUFZLFdBQWMsUUFBUSxjQUFjLFVBQWEsUUFBUSxzQkFBc0IsU0FBWTtBQUN2RyxlQUFPLFVBQVU7QUFBQSxNQUNyQjtBQUNBLFVBQUksZUFBZSxRQUFXO0FBQzFCLGVBQU8sZUFBZTtBQUFBLE1BQzFCO0FBQ0EsYUFBTztBQUFBLElBQ1g7QUFDQSxJQUFBQSxZQUFXLFNBQVM7QUFDcEIsYUFBUyxHQUFHLE9BQU87QUFDZixVQUFJLFlBQVk7QUFDaEIsYUFBTyxhQUFhLFVBQVUsU0FBUyxZQUFZLEdBQUcsT0FBTyxVQUFVLEdBQUcsTUFBTSxVQUFVLFlBQVksV0FDaEcsVUFBVSxRQUFRLGNBQWMsVUFBYSxHQUFHLFFBQVEsVUFBVSxRQUFRLFNBQVMsT0FBTyxVQUFVLFFBQVEsc0JBQXNCLFVBQWEsR0FBRyxRQUFRLFVBQVUsUUFBUSxpQkFBaUIsUUFBUyxVQUFVLGlCQUFpQixVQUFhLDJCQUEyQixHQUFHLFVBQVUsWUFBWTtBQUFBLElBQzVTO0FBQ0EsSUFBQUEsWUFBVyxLQUFLO0FBQUEsRUFDcEIsR0FBRyxlQUFlLGFBQWEsQ0FBQyxFQUFFO0FBQzNCLE1BQUk7QUFDWCxHQUFDLFNBQVVDLGdCQUFlO0FBQ3RCLGFBQVMsR0FBRyxPQUFPO0FBQ2YsVUFBSSxZQUFZO0FBQ2hCLGFBQU8sY0FDRixVQUFVLFlBQVksVUFBYSxVQUFVLG9CQUFvQixZQUNqRSxVQUFVLG9CQUFvQixVQUFhLFVBQVUsZ0JBQWdCLE1BQU0sQ0FBQyxXQUFXO0FBQ3BGLFlBQUksR0FBRyxPQUFPLE9BQU8sSUFBSSxHQUFHO0FBQ3hCLGlCQUFPLFdBQVcsR0FBRyxNQUFNLEtBQUssV0FBVyxHQUFHLE1BQU0sS0FBSyxXQUFXLEdBQUcsTUFBTTtBQUFBLFFBQ2pGLE9BQ0s7QUFDRCxpQkFBTyxpQkFBaUIsR0FBRyxNQUFNO0FBQUEsUUFDckM7QUFBQSxNQUNKLENBQUM7QUFBQSxJQUNUO0FBQ0EsSUFBQUEsZUFBYyxLQUFLO0FBQUEsRUFDdkIsR0FBRyxrQkFBa0IsZ0JBQWdCLENBQUMsRUFBRTtBQXVTakMsTUFBSTtBQUNYLEdBQUMsU0FBVUMseUJBQXdCO0FBSy9CLGFBQVMsT0FBTyxLQUFLO0FBQ2pCLGFBQU8sRUFBRSxJQUFJO0FBQUEsSUFDakI7QUFDQSxJQUFBQSx3QkFBdUIsU0FBUztBQUloQyxhQUFTLEdBQUcsT0FBTztBQUNmLFVBQUksWUFBWTtBQUNoQixhQUFPLEdBQUcsUUFBUSxTQUFTLEtBQUssR0FBRyxPQUFPLFVBQVUsR0FBRztBQUFBLElBQzNEO0FBQ0EsSUFBQUEsd0JBQXVCLEtBQUs7QUFBQSxFQUNoQyxHQUFHLDJCQUEyQix5QkFBeUIsQ0FBQyxFQUFFO0FBS25ELE1BQUk7QUFDWCxHQUFDLFNBQVVDLGtDQUFpQztBQU14QyxhQUFTLE9BQU8sS0FBSyxTQUFTO0FBQzFCLGFBQU8sRUFBRSxLQUFLLFFBQVE7QUFBQSxJQUMxQjtBQUNBLElBQUFBLGlDQUFnQyxTQUFTO0FBSXpDLGFBQVMsR0FBRyxPQUFPO0FBQ2YsVUFBSSxZQUFZO0FBQ2hCLGFBQU8sR0FBRyxRQUFRLFNBQVMsS0FBSyxHQUFHLE9BQU8sVUFBVSxHQUFHLEtBQUssR0FBRyxRQUFRLFVBQVUsT0FBTztBQUFBLElBQzVGO0FBQ0EsSUFBQUEsaUNBQWdDLEtBQUs7QUFBQSxFQUN6QyxHQUFHLG9DQUFvQyxrQ0FBa0MsQ0FBQyxFQUFFO0FBS3JFLE1BQUk7QUFDWCxHQUFDLFNBQVVDLDBDQUF5QztBQU1oRCxhQUFTLE9BQU8sS0FBSyxTQUFTO0FBQzFCLGFBQU8sRUFBRSxLQUFLLFFBQVE7QUFBQSxJQUMxQjtBQUNBLElBQUFBLHlDQUF3QyxTQUFTO0FBSWpELGFBQVMsR0FBRyxPQUFPO0FBQ2YsVUFBSSxZQUFZO0FBQ2hCLGFBQU8sR0FBRyxRQUFRLFNBQVMsS0FBSyxHQUFHLE9BQU8sVUFBVSxHQUFHLE1BQU0sVUFBVSxZQUFZLFFBQVEsR0FBRyxRQUFRLFVBQVUsT0FBTztBQUFBLElBQzNIO0FBQ0EsSUFBQUEseUNBQXdDLEtBQUs7QUFBQSxFQUNqRCxHQUFHLDRDQUE0QywwQ0FBMEMsQ0FBQyxFQUFFO0FBS3JGLE1BQUk7QUFDWCxHQUFDLFNBQVVDLG1CQUFrQjtBQVF6QixhQUFTLE9BQU8sS0FBSyxZQUFZLFNBQVMsTUFBTTtBQUM1QyxhQUFPLEVBQUUsS0FBSyxZQUFZLFNBQVMsS0FBSztBQUFBLElBQzVDO0FBQ0EsSUFBQUEsa0JBQWlCLFNBQVM7QUFJMUIsYUFBUyxHQUFHLE9BQU87QUFDZixVQUFJLFlBQVk7QUFDaEIsYUFBTyxHQUFHLFFBQVEsU0FBUyxLQUFLLEdBQUcsT0FBTyxVQUFVLEdBQUcsS0FBSyxHQUFHLE9BQU8sVUFBVSxVQUFVLEtBQUssR0FBRyxRQUFRLFVBQVUsT0FBTyxLQUFLLEdBQUcsT0FBTyxVQUFVLElBQUk7QUFBQSxJQUM1SjtBQUNBLElBQUFBLGtCQUFpQixLQUFLO0FBQUEsRUFDMUIsR0FBRyxxQkFBcUIsbUJBQW1CLENBQUMsRUFBRTtBQVF2QyxNQUFJO0FBQ1gsR0FBQyxTQUFVQyxhQUFZO0FBSW5CLElBQUFBLFlBQVcsWUFBWTtBQUl2QixJQUFBQSxZQUFXLFdBQVc7QUFJdEIsYUFBUyxHQUFHLE9BQU87QUFDZixZQUFNLFlBQVk7QUFDbEIsYUFBTyxjQUFjQSxZQUFXLGFBQWEsY0FBY0EsWUFBVztBQUFBLElBQzFFO0FBQ0EsSUFBQUEsWUFBVyxLQUFLO0FBQUEsRUFDcEIsR0FBRyxlQUFlLGFBQWEsQ0FBQyxFQUFFO0FBQzNCLE1BQUk7QUFDWCxHQUFDLFNBQVVDLGdCQUFlO0FBSXRCLGFBQVMsR0FBRyxPQUFPO0FBQ2YsWUFBTSxZQUFZO0FBQ2xCLGFBQU8sR0FBRyxjQUFjLEtBQUssS0FBSyxXQUFXLEdBQUcsVUFBVSxJQUFJLEtBQUssR0FBRyxPQUFPLFVBQVUsS0FBSztBQUFBLElBQ2hHO0FBQ0EsSUFBQUEsZUFBYyxLQUFLO0FBQUEsRUFDdkIsR0FBRyxrQkFBa0IsZ0JBQWdCLENBQUMsRUFBRTtBQUlqQyxNQUFJO0FBQ1gsR0FBQyxTQUFVQyxxQkFBb0I7QUFDM0IsSUFBQUEsb0JBQW1CLE9BQU87QUFDMUIsSUFBQUEsb0JBQW1CLFNBQVM7QUFDNUIsSUFBQUEsb0JBQW1CLFdBQVc7QUFDOUIsSUFBQUEsb0JBQW1CLGNBQWM7QUFDakMsSUFBQUEsb0JBQW1CLFFBQVE7QUFDM0IsSUFBQUEsb0JBQW1CLFdBQVc7QUFDOUIsSUFBQUEsb0JBQW1CLFFBQVE7QUFDM0IsSUFBQUEsb0JBQW1CLFlBQVk7QUFDL0IsSUFBQUEsb0JBQW1CLFNBQVM7QUFDNUIsSUFBQUEsb0JBQW1CLFdBQVc7QUFDOUIsSUFBQUEsb0JBQW1CLE9BQU87QUFDMUIsSUFBQUEsb0JBQW1CLFFBQVE7QUFDM0IsSUFBQUEsb0JBQW1CLE9BQU87QUFDMUIsSUFBQUEsb0JBQW1CLFVBQVU7QUFDN0IsSUFBQUEsb0JBQW1CLFVBQVU7QUFDN0IsSUFBQUEsb0JBQW1CLFFBQVE7QUFDM0IsSUFBQUEsb0JBQW1CLE9BQU87QUFDMUIsSUFBQUEsb0JBQW1CLFlBQVk7QUFDL0IsSUFBQUEsb0JBQW1CLFNBQVM7QUFDNUIsSUFBQUEsb0JBQW1CLGFBQWE7QUFDaEMsSUFBQUEsb0JBQW1CLFdBQVc7QUFDOUIsSUFBQUEsb0JBQW1CLFNBQVM7QUFDNUIsSUFBQUEsb0JBQW1CLFFBQVE7QUFDM0IsSUFBQUEsb0JBQW1CLFdBQVc7QUFDOUIsSUFBQUEsb0JBQW1CLGdCQUFnQjtBQUFBLEVBQ3ZDLEdBQUcsdUJBQXVCLHFCQUFxQixDQUFDLEVBQUU7QUFLM0MsTUFBSTtBQUNYLEdBQUMsU0FBVUMsbUJBQWtCO0FBSXpCLElBQUFBLGtCQUFpQixZQUFZO0FBVzdCLElBQUFBLGtCQUFpQixVQUFVO0FBQUEsRUFDL0IsR0FBRyxxQkFBcUIsbUJBQW1CLENBQUMsRUFBRTtBQU92QyxNQUFJO0FBQ1gsR0FBQyxTQUFVQyxvQkFBbUI7QUFJMUIsSUFBQUEsbUJBQWtCLGFBQWE7QUFBQSxFQUNuQyxHQUFHLHNCQUFzQixvQkFBb0IsQ0FBQyxFQUFFO0FBTXpDLE1BQUk7QUFDWCxHQUFDLFNBQVVDLG9CQUFtQjtBQUkxQixhQUFTLE9BQU8sU0FBUyxRQUFRLFNBQVM7QUFDdEMsYUFBTyxFQUFFLFNBQVMsUUFBUSxRQUFRO0FBQUEsSUFDdEM7QUFDQSxJQUFBQSxtQkFBa0IsU0FBUztBQUkzQixhQUFTLEdBQUcsT0FBTztBQUNmLFlBQU0sWUFBWTtBQUNsQixhQUFPLGFBQWEsR0FBRyxPQUFPLFVBQVUsT0FBTyxLQUFLQyxPQUFNLEdBQUcsVUFBVSxNQUFNLEtBQUtBLE9BQU0sR0FBRyxVQUFVLE9BQU87QUFBQSxJQUNoSDtBQUNBLElBQUFELG1CQUFrQixLQUFLO0FBQUEsRUFDM0IsR0FBRyxzQkFBc0Isb0JBQW9CLENBQUMsRUFBRTtBQU96QyxNQUFJO0FBQ1gsR0FBQyxTQUFVRSxpQkFBZ0I7QUFRdkIsSUFBQUEsZ0JBQWUsT0FBTztBQVV0QixJQUFBQSxnQkFBZSxvQkFBb0I7QUFBQSxFQUN2QyxHQUFHLG1CQUFtQixpQkFBaUIsQ0FBQyxFQUFFO0FBQ25DLE1BQUk7QUFDWCxHQUFDLFNBQVVDLDZCQUE0QjtBQUNuQyxhQUFTLEdBQUcsT0FBTztBQUNmLFlBQU0sWUFBWTtBQUNsQixhQUFPLGNBQWMsR0FBRyxPQUFPLFVBQVUsTUFBTSxLQUFLLFVBQVUsV0FBVyxZQUNwRSxHQUFHLE9BQU8sVUFBVSxXQUFXLEtBQUssVUFBVSxnQkFBZ0I7QUFBQSxJQUN2RTtBQUNBLElBQUFBLDRCQUEyQixLQUFLO0FBQUEsRUFDcEMsR0FBRywrQkFBK0IsNkJBQTZCLENBQUMsRUFBRTtBQUszRCxNQUFJO0FBQ1gsR0FBQyxTQUFVQyxpQkFBZ0I7QUFLdkIsYUFBUyxPQUFPLE9BQU87QUFDbkIsYUFBTyxFQUFFLE1BQU07QUFBQSxJQUNuQjtBQUNBLElBQUFBLGdCQUFlLFNBQVM7QUFBQSxFQUM1QixHQUFHLG1CQUFtQixpQkFBaUIsQ0FBQyxFQUFFO0FBS25DLE1BQUk7QUFDWCxHQUFDLFNBQVVDLGlCQUFnQjtBQU92QixhQUFTLE9BQU8sT0FBTyxjQUFjO0FBQ2pDLGFBQU8sRUFBRSxPQUFPLFFBQVEsUUFBUSxDQUFDLEdBQUcsY0FBYyxDQUFDLENBQUMsYUFBYTtBQUFBLElBQ3JFO0FBQ0EsSUFBQUEsZ0JBQWUsU0FBUztBQUFBLEVBQzVCLEdBQUcsbUJBQW1CLGlCQUFpQixDQUFDLEVBQUU7QUFDbkMsTUFBSTtBQUNYLEdBQUMsU0FBVUMsZUFBYztBQU1yQixhQUFTLGNBQWMsV0FBVztBQUM5QixhQUFPLFVBQVUsUUFBUSx5QkFBeUIsTUFBTTtBQUFBLElBQzVEO0FBQ0EsSUFBQUEsY0FBYSxnQkFBZ0I7QUFJN0IsYUFBUyxHQUFHLE9BQU87QUFDZixZQUFNLFlBQVk7QUFDbEIsYUFBTyxHQUFHLE9BQU8sU0FBUyxLQUFNLEdBQUcsY0FBYyxTQUFTLEtBQUssR0FBRyxPQUFPLFVBQVUsUUFBUSxLQUFLLEdBQUcsT0FBTyxVQUFVLEtBQUs7QUFBQSxJQUM3SDtBQUNBLElBQUFBLGNBQWEsS0FBSztBQUFBLEVBQ3RCLEdBQUcsaUJBQWlCLGVBQWUsQ0FBQyxFQUFFO0FBQy9CLE1BQUk7QUFDWCxHQUFDLFNBQVVDLFFBQU87QUFJZCxhQUFTLEdBQUcsT0FBTztBQUNmLFVBQUksWUFBWTtBQUNoQixhQUFPLENBQUMsQ0FBQyxhQUFhLEdBQUcsY0FBYyxTQUFTLE1BQU0sY0FBYyxHQUFHLFVBQVUsUUFBUSxLQUNyRixhQUFhLEdBQUcsVUFBVSxRQUFRLEtBQ2xDLEdBQUcsV0FBVyxVQUFVLFVBQVUsYUFBYSxFQUFFLE9BQU8sTUFBTSxVQUFVLFVBQWFOLE9BQU0sR0FBRyxNQUFNLEtBQUs7QUFBQSxJQUNqSDtBQUNBLElBQUFNLE9BQU0sS0FBSztBQUFBLEVBQ2YsR0FBRyxVQUFVLFFBQVEsQ0FBQyxFQUFFO0FBS2pCLE1BQUk7QUFDWCxHQUFDLFNBQVVDLHVCQUFzQjtBQU83QixhQUFTLE9BQU8sT0FBTyxlQUFlO0FBQ2xDLGFBQU8sZ0JBQWdCLEVBQUUsT0FBTyxjQUFjLElBQUksRUFBRSxNQUFNO0FBQUEsSUFDOUQ7QUFDQSxJQUFBQSxzQkFBcUIsU0FBUztBQUFBLEVBQ2xDLEdBQUcseUJBQXlCLHVCQUF1QixDQUFDLEVBQUU7QUFLL0MsTUFBSTtBQUNYLEdBQUMsU0FBVUMsdUJBQXNCO0FBQzdCLGFBQVMsT0FBTyxPQUFPLGtCQUFrQixZQUFZO0FBQ2pELFVBQUksU0FBUyxFQUFFLE1BQU07QUFDckIsVUFBSSxHQUFHLFFBQVEsYUFBYSxHQUFHO0FBQzNCLGVBQU8sZ0JBQWdCO0FBQUEsTUFDM0I7QUFDQSxVQUFJLEdBQUcsUUFBUSxVQUFVLEdBQUc7QUFDeEIsZUFBTyxhQUFhO0FBQUEsTUFDeEIsT0FDSztBQUNELGVBQU8sYUFBYSxDQUFDO0FBQUEsTUFDekI7QUFDQSxhQUFPO0FBQUEsSUFDWDtBQUNBLElBQUFBLHNCQUFxQixTQUFTO0FBQUEsRUFDbEMsR0FBRyx5QkFBeUIsdUJBQXVCLENBQUMsRUFBRTtBQUkvQyxNQUFJO0FBQ1gsR0FBQyxTQUFVQyx3QkFBdUI7QUFJOUIsSUFBQUEsdUJBQXNCLE9BQU87QUFJN0IsSUFBQUEsdUJBQXNCLE9BQU87QUFJN0IsSUFBQUEsdUJBQXNCLFFBQVE7QUFBQSxFQUNsQyxHQUFHLDBCQUEwQix3QkFBd0IsQ0FBQyxFQUFFO0FBS2pELE1BQUk7QUFDWCxHQUFDLFNBQVVDLG9CQUFtQjtBQU0xQixhQUFTLE9BQU8sT0FBTyxNQUFNO0FBQ3pCLFVBQUksU0FBUyxFQUFFLE1BQU07QUFDckIsVUFBSSxHQUFHLE9BQU8sSUFBSSxHQUFHO0FBQ2pCLGVBQU8sT0FBTztBQUFBLE1BQ2xCO0FBQ0EsYUFBTztBQUFBLElBQ1g7QUFDQSxJQUFBQSxtQkFBa0IsU0FBUztBQUFBLEVBQy9CLEdBQUcsc0JBQXNCLG9CQUFvQixDQUFDLEVBQUU7QUFJekMsTUFBSTtBQUNYLEdBQUMsU0FBVUMsYUFBWTtBQUNuQixJQUFBQSxZQUFXLE9BQU87QUFDbEIsSUFBQUEsWUFBVyxTQUFTO0FBQ3BCLElBQUFBLFlBQVcsWUFBWTtBQUN2QixJQUFBQSxZQUFXLFVBQVU7QUFDckIsSUFBQUEsWUFBVyxRQUFRO0FBQ25CLElBQUFBLFlBQVcsU0FBUztBQUNwQixJQUFBQSxZQUFXLFdBQVc7QUFDdEIsSUFBQUEsWUFBVyxRQUFRO0FBQ25CLElBQUFBLFlBQVcsY0FBYztBQUN6QixJQUFBQSxZQUFXLE9BQU87QUFDbEIsSUFBQUEsWUFBVyxZQUFZO0FBQ3ZCLElBQUFBLFlBQVcsV0FBVztBQUN0QixJQUFBQSxZQUFXLFdBQVc7QUFDdEIsSUFBQUEsWUFBVyxXQUFXO0FBQ3RCLElBQUFBLFlBQVcsU0FBUztBQUNwQixJQUFBQSxZQUFXLFNBQVM7QUFDcEIsSUFBQUEsWUFBVyxVQUFVO0FBQ3JCLElBQUFBLFlBQVcsUUFBUTtBQUNuQixJQUFBQSxZQUFXLFNBQVM7QUFDcEIsSUFBQUEsWUFBVyxNQUFNO0FBQ2pCLElBQUFBLFlBQVcsT0FBTztBQUNsQixJQUFBQSxZQUFXLGFBQWE7QUFDeEIsSUFBQUEsWUFBVyxTQUFTO0FBQ3BCLElBQUFBLFlBQVcsUUFBUTtBQUNuQixJQUFBQSxZQUFXLFdBQVc7QUFDdEIsSUFBQUEsWUFBVyxnQkFBZ0I7QUFBQSxFQUMvQixHQUFHLGVBQWUsYUFBYSxDQUFDLEVBQUU7QUFNM0IsTUFBSTtBQUNYLEdBQUMsU0FBVUMsWUFBVztBQUlsQixJQUFBQSxXQUFVLGFBQWE7QUFBQSxFQUMzQixHQUFHLGNBQWMsWUFBWSxDQUFDLEVBQUU7QUFDekIsTUFBSTtBQUNYLEdBQUMsU0FBVUMsb0JBQW1CO0FBVTFCLGFBQVMsT0FBTyxNQUFNLE1BQU0sT0FBTyxLQUFLLGVBQWU7QUFDbkQsVUFBSSxTQUFTO0FBQUEsUUFDVDtBQUFBLFFBQ0E7QUFBQSxRQUNBLFVBQVUsRUFBRSxLQUFLLE1BQU07QUFBQSxNQUMzQjtBQUNBLFVBQUksZUFBZTtBQUNmLGVBQU8sZ0JBQWdCO0FBQUEsTUFDM0I7QUFDQSxhQUFPO0FBQUEsSUFDWDtBQUNBLElBQUFBLG1CQUFrQixTQUFTO0FBQUEsRUFDL0IsR0FBRyxzQkFBc0Isb0JBQW9CLENBQUMsRUFBRTtBQUN6QyxNQUFJO0FBQ1gsR0FBQyxTQUFVQyxrQkFBaUI7QUFVeEIsYUFBUyxPQUFPLE1BQU0sTUFBTSxLQUFLLE9BQU87QUFDcEMsYUFBTyxVQUFVLFNBQ1gsRUFBRSxNQUFNLE1BQU0sVUFBVSxFQUFFLEtBQUssTUFBTSxFQUFFLElBQ3ZDLEVBQUUsTUFBTSxNQUFNLFVBQVUsRUFBRSxJQUFJLEVBQUU7QUFBQSxJQUMxQztBQUNBLElBQUFBLGlCQUFnQixTQUFTO0FBQUEsRUFDN0IsR0FBRyxvQkFBb0Isa0JBQWtCLENBQUMsRUFBRTtBQUNyQyxNQUFJO0FBQ1gsR0FBQyxTQUFVQyxpQkFBZ0I7QUFXdkIsYUFBUyxPQUFPLE1BQU0sUUFBUSxNQUFNLE9BQU8sZ0JBQWdCLFVBQVU7QUFDakUsVUFBSSxTQUFTO0FBQUEsUUFDVDtBQUFBLFFBQ0E7QUFBQSxRQUNBO0FBQUEsUUFDQTtBQUFBLFFBQ0E7QUFBQSxNQUNKO0FBQ0EsVUFBSSxhQUFhLFFBQVc7QUFDeEIsZUFBTyxXQUFXO0FBQUEsTUFDdEI7QUFDQSxhQUFPO0FBQUEsSUFDWDtBQUNBLElBQUFBLGdCQUFlLFNBQVM7QUFJeEIsYUFBUyxHQUFHLE9BQU87QUFDZixVQUFJLFlBQVk7QUFDaEIsYUFBTyxhQUNILEdBQUcsT0FBTyxVQUFVLElBQUksS0FBSyxHQUFHLE9BQU8sVUFBVSxJQUFJLEtBQ3JEZixPQUFNLEdBQUcsVUFBVSxLQUFLLEtBQUtBLE9BQU0sR0FBRyxVQUFVLGNBQWMsTUFDN0QsVUFBVSxXQUFXLFVBQWEsR0FBRyxPQUFPLFVBQVUsTUFBTSxPQUM1RCxVQUFVLGVBQWUsVUFBYSxHQUFHLFFBQVEsVUFBVSxVQUFVLE9BQ3JFLFVBQVUsYUFBYSxVQUFhLE1BQU0sUUFBUSxVQUFVLFFBQVEsT0FDcEUsVUFBVSxTQUFTLFVBQWEsTUFBTSxRQUFRLFVBQVUsSUFBSTtBQUFBLElBQ3JFO0FBQ0EsSUFBQWUsZ0JBQWUsS0FBSztBQUFBLEVBQ3hCLEdBQUcsbUJBQW1CLGlCQUFpQixDQUFDLEVBQUU7QUFJbkMsTUFBSTtBQUNYLEdBQUMsU0FBVUMsaUJBQWdCO0FBSXZCLElBQUFBLGdCQUFlLFFBQVE7QUFJdkIsSUFBQUEsZ0JBQWUsV0FBVztBQUkxQixJQUFBQSxnQkFBZSxXQUFXO0FBWTFCLElBQUFBLGdCQUFlLGtCQUFrQjtBQVdqQyxJQUFBQSxnQkFBZSxpQkFBaUI7QUFhaEMsSUFBQUEsZ0JBQWUsa0JBQWtCO0FBTWpDLElBQUFBLGdCQUFlLFNBQVM7QUFJeEIsSUFBQUEsZ0JBQWUsd0JBQXdCO0FBU3ZDLElBQUFBLGdCQUFlLGVBQWU7QUFBQSxFQUNsQyxHQUFHLG1CQUFtQixpQkFBaUIsQ0FBQyxFQUFFO0FBTW5DLE1BQUk7QUFDWCxHQUFDLFNBQVVDLHdCQUF1QjtBQUk5QixJQUFBQSx1QkFBc0IsVUFBVTtBQU9oQyxJQUFBQSx1QkFBc0IsWUFBWTtBQUFBLEVBQ3RDLEdBQUcsMEJBQTBCLHdCQUF3QixDQUFDLEVBQUU7QUFLakQsTUFBSTtBQUNYLEdBQUMsU0FBVUMsb0JBQW1CO0FBSTFCLGFBQVMsT0FBTyxhQUFhLE1BQU0sYUFBYTtBQUM1QyxVQUFJLFNBQVMsRUFBRSxZQUFZO0FBQzNCLFVBQUksU0FBUyxVQUFhLFNBQVMsTUFBTTtBQUNyQyxlQUFPLE9BQU87QUFBQSxNQUNsQjtBQUNBLFVBQUksZ0JBQWdCLFVBQWEsZ0JBQWdCLE1BQU07QUFDbkQsZUFBTyxjQUFjO0FBQUEsTUFDekI7QUFDQSxhQUFPO0FBQUEsSUFDWDtBQUNBLElBQUFBLG1CQUFrQixTQUFTO0FBSTNCLGFBQVMsR0FBRyxPQUFPO0FBQ2YsVUFBSSxZQUFZO0FBQ2hCLGFBQU8sR0FBRyxRQUFRLFNBQVMsS0FBSyxHQUFHLFdBQVcsVUFBVSxhQUFhLFdBQVcsRUFBRSxNQUMxRSxVQUFVLFNBQVMsVUFBYSxHQUFHLFdBQVcsVUFBVSxNQUFNLEdBQUcsTUFBTSxPQUN2RSxVQUFVLGdCQUFnQixVQUFhLFVBQVUsZ0JBQWdCLHNCQUFzQixXQUFXLFVBQVUsZ0JBQWdCLHNCQUFzQjtBQUFBLElBQzlKO0FBQ0EsSUFBQUEsbUJBQWtCLEtBQUs7QUFBQSxFQUMzQixHQUFHLHNCQUFzQixvQkFBb0IsQ0FBQyxFQUFFO0FBQ3pDLE1BQUk7QUFDWCxHQUFDLFNBQVVDLGFBQVk7QUFDbkIsYUFBUyxPQUFPLE9BQU8scUJBQXFCLE1BQU07QUFDOUMsVUFBSSxTQUFTLEVBQUUsTUFBTTtBQUNyQixVQUFJLFlBQVk7QUFDaEIsVUFBSSxPQUFPLHdCQUF3QixVQUFVO0FBQ3pDLG9CQUFZO0FBQ1osZUFBTyxPQUFPO0FBQUEsTUFDbEIsV0FDUyxRQUFRLEdBQUcsbUJBQW1CLEdBQUc7QUFDdEMsZUFBTyxVQUFVO0FBQUEsTUFDckIsT0FDSztBQUNELGVBQU8sT0FBTztBQUFBLE1BQ2xCO0FBQ0EsVUFBSSxhQUFhLFNBQVMsUUFBVztBQUNqQyxlQUFPLE9BQU87QUFBQSxNQUNsQjtBQUNBLGFBQU87QUFBQSxJQUNYO0FBQ0EsSUFBQUEsWUFBVyxTQUFTO0FBQ3BCLGFBQVMsR0FBRyxPQUFPO0FBQ2YsVUFBSSxZQUFZO0FBQ2hCLGFBQU8sYUFBYSxHQUFHLE9BQU8sVUFBVSxLQUFLLE1BQ3hDLFVBQVUsZ0JBQWdCLFVBQWEsR0FBRyxXQUFXLFVBQVUsYUFBYSxXQUFXLEVBQUUsT0FDekYsVUFBVSxTQUFTLFVBQWEsR0FBRyxPQUFPLFVBQVUsSUFBSSxPQUN4RCxVQUFVLFNBQVMsVUFBYSxVQUFVLFlBQVksWUFDdEQsVUFBVSxZQUFZLFVBQWEsUUFBUSxHQUFHLFVBQVUsT0FBTyxPQUMvRCxVQUFVLGdCQUFnQixVQUFhLEdBQUcsUUFBUSxVQUFVLFdBQVcsT0FDdkUsVUFBVSxTQUFTLFVBQWEsY0FBYyxHQUFHLFVBQVUsSUFBSTtBQUFBLElBQ3hFO0FBQ0EsSUFBQUEsWUFBVyxLQUFLO0FBQUEsRUFDcEIsR0FBRyxlQUFlLGFBQWEsQ0FBQyxFQUFFO0FBSzNCLE1BQUk7QUFDWCxHQUFDLFNBQVVDLFdBQVU7QUFJakIsYUFBUyxPQUFPLE9BQU8sTUFBTTtBQUN6QixVQUFJLFNBQVMsRUFBRSxNQUFNO0FBQ3JCLFVBQUksR0FBRyxRQUFRLElBQUksR0FBRztBQUNsQixlQUFPLE9BQU87QUFBQSxNQUNsQjtBQUNBLGFBQU87QUFBQSxJQUNYO0FBQ0EsSUFBQUEsVUFBUyxTQUFTO0FBSWxCLGFBQVMsR0FBRyxPQUFPO0FBQ2YsVUFBSSxZQUFZO0FBQ2hCLGFBQU8sR0FBRyxRQUFRLFNBQVMsS0FBS3BCLE9BQU0sR0FBRyxVQUFVLEtBQUssTUFBTSxHQUFHLFVBQVUsVUFBVSxPQUFPLEtBQUssUUFBUSxHQUFHLFVBQVUsT0FBTztBQUFBLElBQ2pJO0FBQ0EsSUFBQW9CLFVBQVMsS0FBSztBQUFBLEVBQ2xCLEdBQUcsYUFBYSxXQUFXLENBQUMsRUFBRTtBQUt2QixNQUFJO0FBQ1gsR0FBQyxTQUFVQyxvQkFBbUI7QUFJMUIsYUFBUyxPQUFPLFNBQVMsY0FBYztBQUNuQyxhQUFPLEVBQUUsU0FBUyxhQUFhO0FBQUEsSUFDbkM7QUFDQSxJQUFBQSxtQkFBa0IsU0FBUztBQUkzQixhQUFTLEdBQUcsT0FBTztBQUNmLFVBQUksWUFBWTtBQUNoQixhQUFPLEdBQUcsUUFBUSxTQUFTLEtBQUssR0FBRyxTQUFTLFVBQVUsT0FBTyxLQUFLLEdBQUcsUUFBUSxVQUFVLFlBQVk7QUFBQSxJQUN2RztBQUNBLElBQUFBLG1CQUFrQixLQUFLO0FBQUEsRUFDM0IsR0FBRyxzQkFBc0Isb0JBQW9CLENBQUMsRUFBRTtBQUt6QyxNQUFJO0FBQ1gsR0FBQyxTQUFVQyxlQUFjO0FBSXJCLGFBQVMsT0FBTyxPQUFPLFFBQVEsTUFBTTtBQUNqQyxhQUFPLEVBQUUsT0FBTyxRQUFRLEtBQUs7QUFBQSxJQUNqQztBQUNBLElBQUFBLGNBQWEsU0FBUztBQUl0QixhQUFTLEdBQUcsT0FBTztBQUNmLFVBQUksWUFBWTtBQUNoQixhQUFPLEdBQUcsUUFBUSxTQUFTLEtBQUt0QixPQUFNLEdBQUcsVUFBVSxLQUFLLE1BQU0sR0FBRyxVQUFVLFVBQVUsTUFBTSxLQUFLLEdBQUcsT0FBTyxVQUFVLE1BQU07QUFBQSxJQUM5SDtBQUNBLElBQUFzQixjQUFhLEtBQUs7QUFBQSxFQUN0QixHQUFHLGlCQUFpQixlQUFlLENBQUMsRUFBRTtBQUsvQixNQUFJO0FBQ1gsR0FBQyxTQUFVQyxpQkFBZ0I7QUFNdkIsYUFBUyxPQUFPLE9BQU8sUUFBUTtBQUMzQixhQUFPLEVBQUUsT0FBTyxPQUFPO0FBQUEsSUFDM0I7QUFDQSxJQUFBQSxnQkFBZSxTQUFTO0FBQ3hCLGFBQVMsR0FBRyxPQUFPO0FBQ2YsVUFBSSxZQUFZO0FBQ2hCLGFBQU8sR0FBRyxjQUFjLFNBQVMsS0FBS3ZCLE9BQU0sR0FBRyxVQUFVLEtBQUssTUFBTSxVQUFVLFdBQVcsVUFBYXVCLGdCQUFlLEdBQUcsVUFBVSxNQUFNO0FBQUEsSUFDNUk7QUFDQSxJQUFBQSxnQkFBZSxLQUFLO0FBQUEsRUFDeEIsR0FBRyxtQkFBbUIsaUJBQWlCLENBQUMsRUFBRTtBQVFuQyxNQUFJO0FBQ1gsR0FBQyxTQUFVQyxxQkFBb0I7QUFDM0IsSUFBQUEsb0JBQW1CLFdBQVcsSUFBSTtBQUtsQyxJQUFBQSxvQkFBbUIsTUFBTSxJQUFJO0FBQzdCLElBQUFBLG9CQUFtQixPQUFPLElBQUk7QUFDOUIsSUFBQUEsb0JBQW1CLE1BQU0sSUFBSTtBQUM3QixJQUFBQSxvQkFBbUIsV0FBVyxJQUFJO0FBQ2xDLElBQUFBLG9CQUFtQixRQUFRLElBQUk7QUFDL0IsSUFBQUEsb0JBQW1CLGVBQWUsSUFBSTtBQUN0QyxJQUFBQSxvQkFBbUIsV0FBVyxJQUFJO0FBQ2xDLElBQUFBLG9CQUFtQixVQUFVLElBQUk7QUFDakMsSUFBQUEsb0JBQW1CLFVBQVUsSUFBSTtBQUNqQyxJQUFBQSxvQkFBbUIsWUFBWSxJQUFJO0FBQ25DLElBQUFBLG9CQUFtQixPQUFPLElBQUk7QUFDOUIsSUFBQUEsb0JBQW1CLFVBQVUsSUFBSTtBQUNqQyxJQUFBQSxvQkFBbUIsUUFBUSxJQUFJO0FBQy9CLElBQUFBLG9CQUFtQixPQUFPLElBQUk7QUFDOUIsSUFBQUEsb0JBQW1CLFNBQVMsSUFBSTtBQUNoQyxJQUFBQSxvQkFBbUIsVUFBVSxJQUFJO0FBQ2pDLElBQUFBLG9CQUFtQixTQUFTLElBQUk7QUFDaEMsSUFBQUEsb0JBQW1CLFFBQVEsSUFBSTtBQUMvQixJQUFBQSxvQkFBbUIsUUFBUSxJQUFJO0FBQy9CLElBQUFBLG9CQUFtQixRQUFRLElBQUk7QUFDL0IsSUFBQUEsb0JBQW1CLFVBQVUsSUFBSTtBQUlqQyxJQUFBQSxvQkFBbUIsV0FBVyxJQUFJO0FBQUEsRUFDdEMsR0FBRyx1QkFBdUIscUJBQXFCLENBQUMsRUFBRTtBQVEzQyxNQUFJO0FBQ1gsR0FBQyxTQUFVQyx5QkFBd0I7QUFDL0IsSUFBQUEsd0JBQXVCLGFBQWEsSUFBSTtBQUN4QyxJQUFBQSx3QkFBdUIsWUFBWSxJQUFJO0FBQ3ZDLElBQUFBLHdCQUF1QixVQUFVLElBQUk7QUFDckMsSUFBQUEsd0JBQXVCLFFBQVEsSUFBSTtBQUNuQyxJQUFBQSx3QkFBdUIsWUFBWSxJQUFJO0FBQ3ZDLElBQUFBLHdCQUF1QixVQUFVLElBQUk7QUFDckMsSUFBQUEsd0JBQXVCLE9BQU8sSUFBSTtBQUNsQyxJQUFBQSx3QkFBdUIsY0FBYyxJQUFJO0FBQ3pDLElBQUFBLHdCQUF1QixlQUFlLElBQUk7QUFDMUMsSUFBQUEsd0JBQXVCLGdCQUFnQixJQUFJO0FBQUEsRUFDL0MsR0FBRywyQkFBMkIseUJBQXlCLENBQUMsRUFBRTtBQUluRCxNQUFJO0FBQ1gsR0FBQyxTQUFVQyxpQkFBZ0I7QUFDdkIsYUFBUyxHQUFHLE9BQU87QUFDZixZQUFNLFlBQVk7QUFDbEIsYUFBTyxHQUFHLGNBQWMsU0FBUyxNQUFNLFVBQVUsYUFBYSxVQUFhLE9BQU8sVUFBVSxhQUFhLGFBQ3JHLE1BQU0sUUFBUSxVQUFVLElBQUksTUFBTSxVQUFVLEtBQUssV0FBVyxLQUFLLE9BQU8sVUFBVSxLQUFLLENBQUMsTUFBTTtBQUFBLElBQ3RHO0FBQ0EsSUFBQUEsZ0JBQWUsS0FBSztBQUFBLEVBQ3hCLEdBQUcsbUJBQW1CLGlCQUFpQixDQUFDLEVBQUU7QUFNbkMsTUFBSTtBQUNYLEdBQUMsU0FBVUMsa0JBQWlCO0FBSXhCLGFBQVMsT0FBTyxPQUFPLE1BQU07QUFDekIsYUFBTyxFQUFFLE9BQU8sS0FBSztBQUFBLElBQ3pCO0FBQ0EsSUFBQUEsaUJBQWdCLFNBQVM7QUFDekIsYUFBUyxHQUFHLE9BQU87QUFDZixZQUFNLFlBQVk7QUFDbEIsYUFBTyxjQUFjLFVBQWEsY0FBYyxRQUFRM0IsT0FBTSxHQUFHLFVBQVUsS0FBSyxLQUFLLEdBQUcsT0FBTyxVQUFVLElBQUk7QUFBQSxJQUNqSDtBQUNBLElBQUEyQixpQkFBZ0IsS0FBSztBQUFBLEVBQ3pCLEdBQUcsb0JBQW9CLGtCQUFrQixDQUFDLEVBQUU7QUFNckMsTUFBSTtBQUNYLEdBQUMsU0FBVUMsNEJBQTJCO0FBSWxDLGFBQVMsT0FBTyxPQUFPLGNBQWMscUJBQXFCO0FBQ3RELGFBQU8sRUFBRSxPQUFPLGNBQWMsb0JBQW9CO0FBQUEsSUFDdEQ7QUFDQSxJQUFBQSwyQkFBMEIsU0FBUztBQUNuQyxhQUFTLEdBQUcsT0FBTztBQUNmLFlBQU0sWUFBWTtBQUNsQixhQUFPLGNBQWMsVUFBYSxjQUFjLFFBQVE1QixPQUFNLEdBQUcsVUFBVSxLQUFLLEtBQUssR0FBRyxRQUFRLFVBQVUsbUJBQW1CLE1BQ3JILEdBQUcsT0FBTyxVQUFVLFlBQVksS0FBSyxVQUFVLGlCQUFpQjtBQUFBLElBQzVFO0FBQ0EsSUFBQTRCLDJCQUEwQixLQUFLO0FBQUEsRUFDbkMsR0FBRyw4QkFBOEIsNEJBQTRCLENBQUMsRUFBRTtBQU16RCxNQUFJO0FBQ1gsR0FBQyxTQUFVQyxtQ0FBa0M7QUFJekMsYUFBUyxPQUFPLE9BQU8sWUFBWTtBQUMvQixhQUFPLEVBQUUsT0FBTyxXQUFXO0FBQUEsSUFDL0I7QUFDQSxJQUFBQSxrQ0FBaUMsU0FBUztBQUMxQyxhQUFTLEdBQUcsT0FBTztBQUNmLFlBQU0sWUFBWTtBQUNsQixhQUFPLGNBQWMsVUFBYSxjQUFjLFFBQVE3QixPQUFNLEdBQUcsVUFBVSxLQUFLLE1BQ3hFLEdBQUcsT0FBTyxVQUFVLFVBQVUsS0FBSyxVQUFVLGVBQWU7QUFBQSxJQUN4RTtBQUNBLElBQUE2QixrQ0FBaUMsS0FBSztBQUFBLEVBQzFDLEdBQUcscUNBQXFDLG1DQUFtQyxDQUFDLEVBQUU7QUFPdkUsTUFBSTtBQUNYLEdBQUMsU0FBVUMscUJBQW9CO0FBSTNCLGFBQVMsT0FBTyxTQUFTLGlCQUFpQjtBQUN0QyxhQUFPLEVBQUUsU0FBUyxnQkFBZ0I7QUFBQSxJQUN0QztBQUNBLElBQUFBLG9CQUFtQixTQUFTO0FBSTVCLGFBQVMsR0FBRyxPQUFPO0FBQ2YsWUFBTSxZQUFZO0FBQ2xCLGFBQU8sR0FBRyxRQUFRLFNBQVMsS0FBSzlCLE9BQU0sR0FBRyxNQUFNLGVBQWU7QUFBQSxJQUNsRTtBQUNBLElBQUE4QixvQkFBbUIsS0FBSztBQUFBLEVBQzVCLEdBQUcsdUJBQXVCLHFCQUFxQixDQUFDLEVBQUU7QUFNM0MsTUFBSTtBQUNYLEdBQUMsU0FBVUMsZ0JBQWU7QUFJdEIsSUFBQUEsZUFBYyxPQUFPO0FBSXJCLElBQUFBLGVBQWMsWUFBWTtBQUMxQixhQUFTLEdBQUcsT0FBTztBQUNmLGFBQU8sVUFBVSxLQUFLLFVBQVU7QUFBQSxJQUNwQztBQUNBLElBQUFBLGVBQWMsS0FBSztBQUFBLEVBQ3ZCLEdBQUcsa0JBQWtCLGdCQUFnQixDQUFDLEVBQUU7QUFDakMsTUFBSTtBQUNYLEdBQUMsU0FBVUMscUJBQW9CO0FBQzNCLGFBQVMsT0FBTyxPQUFPO0FBQ25CLGFBQU8sRUFBRSxNQUFNO0FBQUEsSUFDbkI7QUFDQSxJQUFBQSxvQkFBbUIsU0FBUztBQUM1QixhQUFTLEdBQUcsT0FBTztBQUNmLFlBQU0sWUFBWTtBQUNsQixhQUFPLEdBQUcsY0FBYyxTQUFTLE1BQ3pCLFVBQVUsWUFBWSxVQUFhLEdBQUcsT0FBTyxVQUFVLE9BQU8sS0FBSyxjQUFjLEdBQUcsVUFBVSxPQUFPLE9BQ3JHLFVBQVUsYUFBYSxVQUFhLFNBQVMsR0FBRyxVQUFVLFFBQVEsT0FDbEUsVUFBVSxZQUFZLFVBQWEsUUFBUSxHQUFHLFVBQVUsT0FBTztBQUFBLElBQzNFO0FBQ0EsSUFBQUEsb0JBQW1CLEtBQUs7QUFBQSxFQUM1QixHQUFHLHVCQUF1QixxQkFBcUIsQ0FBQyxFQUFFO0FBQzNDLE1BQUk7QUFDWCxHQUFDLFNBQVVDLFlBQVc7QUFDbEIsYUFBUyxPQUFPLFVBQVUsT0FBTyxNQUFNO0FBQ25DLFlBQU0sU0FBUyxFQUFFLFVBQVUsTUFBTTtBQUNqQyxVQUFJLFNBQVMsUUFBVztBQUNwQixlQUFPLE9BQU87QUFBQSxNQUNsQjtBQUNBLGFBQU87QUFBQSxJQUNYO0FBQ0EsSUFBQUEsV0FBVSxTQUFTO0FBQ25CLGFBQVMsR0FBRyxPQUFPO0FBQ2YsWUFBTSxZQUFZO0FBQ2xCLGFBQU8sR0FBRyxjQUFjLFNBQVMsS0FBS0MsVUFBUyxHQUFHLFVBQVUsUUFBUSxNQUM1RCxHQUFHLE9BQU8sVUFBVSxLQUFLLEtBQUssR0FBRyxXQUFXLFVBQVUsT0FBTyxtQkFBbUIsRUFBRSxPQUNsRixVQUFVLFNBQVMsVUFBYSxjQUFjLEdBQUcsVUFBVSxJQUFJLE1BQy9ELFVBQVUsY0FBYyxVQUFjLEdBQUcsV0FBVyxVQUFVLFdBQVcsU0FBUyxFQUFFLE1BQ3BGLFVBQVUsWUFBWSxVQUFhLEdBQUcsT0FBTyxVQUFVLE9BQU8sS0FBSyxjQUFjLEdBQUcsVUFBVSxPQUFPLE9BQ3JHLFVBQVUsZ0JBQWdCLFVBQWEsR0FBRyxRQUFRLFVBQVUsV0FBVyxPQUN2RSxVQUFVLGlCQUFpQixVQUFhLEdBQUcsUUFBUSxVQUFVLFlBQVk7QUFBQSxJQUNyRjtBQUNBLElBQUFELFdBQVUsS0FBSztBQUFBLEVBQ25CLEdBQUcsY0FBYyxZQUFZLENBQUMsRUFBRTtBQUN6QixNQUFJO0FBQ1gsR0FBQyxTQUFVRSxjQUFhO0FBQ3BCLGFBQVMsY0FBYyxPQUFPO0FBQzFCLGFBQU8sRUFBRSxNQUFNLFdBQVcsTUFBTTtBQUFBLElBQ3BDO0FBQ0EsSUFBQUEsYUFBWSxnQkFBZ0I7QUFBQSxFQUNoQyxHQUFHLGdCQUFnQixjQUFjLENBQUMsRUFBRTtBQUM3QixNQUFJO0FBQ1gsR0FBQyxTQUFVQyx1QkFBc0I7QUFDN0IsYUFBUyxPQUFPLFlBQVksWUFBWSxPQUFPLFNBQVM7QUFDcEQsYUFBTyxFQUFFLFlBQVksWUFBWSxPQUFPLFFBQVE7QUFBQSxJQUNwRDtBQUNBLElBQUFBLHNCQUFxQixTQUFTO0FBQUEsRUFDbEMsR0FBRyx5QkFBeUIsdUJBQXVCLENBQUMsRUFBRTtBQUMvQyxNQUFJO0FBQ1gsR0FBQyxTQUFVQyx1QkFBc0I7QUFDN0IsYUFBUyxPQUFPLE9BQU87QUFDbkIsYUFBTyxFQUFFLE1BQU07QUFBQSxJQUNuQjtBQUNBLElBQUFBLHNCQUFxQixTQUFTO0FBQUEsRUFDbEMsR0FBRyx5QkFBeUIsdUJBQXVCLENBQUMsRUFBRTtBQU8vQyxNQUFJO0FBQ1gsR0FBQyxTQUFVQyw4QkFBNkI7QUFJcEMsSUFBQUEsNkJBQTRCLFVBQVU7QUFJdEMsSUFBQUEsNkJBQTRCLFlBQVk7QUFBQSxFQUM1QyxHQUFHLGdDQUFnQyw4QkFBOEIsQ0FBQyxFQUFFO0FBQzdELE1BQUk7QUFDWCxHQUFDLFNBQVVDLHlCQUF3QjtBQUMvQixhQUFTLE9BQU8sT0FBTyxNQUFNO0FBQ3pCLGFBQU8sRUFBRSxPQUFPLEtBQUs7QUFBQSxJQUN6QjtBQUNBLElBQUFBLHdCQUF1QixTQUFTO0FBQUEsRUFDcEMsR0FBRywyQkFBMkIseUJBQXlCLENBQUMsRUFBRTtBQUNuRCxNQUFJO0FBQ1gsR0FBQyxTQUFVQywwQkFBeUI7QUFDaEMsYUFBUyxPQUFPLGFBQWEsd0JBQXdCO0FBQ2pELGFBQU8sRUFBRSxhQUFhLHVCQUF1QjtBQUFBLElBQ2pEO0FBQ0EsSUFBQUEseUJBQXdCLFNBQVM7QUFBQSxFQUNyQyxHQUFHLDRCQUE0QiwwQkFBMEIsQ0FBQyxFQUFFO0FBQ3JELE1BQUk7QUFDWCxHQUFDLFNBQVVDLGtCQUFpQjtBQUN4QixhQUFTLEdBQUcsT0FBTztBQUNmLFlBQU0sWUFBWTtBQUNsQixhQUFPLEdBQUcsY0FBYyxTQUFTLEtBQUssSUFBSSxHQUFHLFVBQVUsR0FBRyxLQUFLLEdBQUcsT0FBTyxVQUFVLElBQUk7QUFBQSxJQUMzRjtBQUNBLElBQUFBLGlCQUFnQixLQUFLO0FBQUEsRUFDekIsR0FBRyxvQkFBb0Isa0JBQWtCLENBQUMsRUFBRTtBQUtyQyxNQUFJO0FBQ1gsR0FBQyxTQUFVQyxlQUFjO0FBUXJCLGFBQVMsT0FBTyxLQUFLLFlBQVksU0FBUyxTQUFTO0FBQy9DLGFBQU8sSUFBSSxpQkFBaUIsS0FBSyxZQUFZLFNBQVMsT0FBTztBQUFBLElBQ2pFO0FBQ0EsSUFBQUEsY0FBYSxTQUFTO0FBSXRCLGFBQVMsR0FBRyxPQUFPO0FBQ2YsVUFBSSxZQUFZO0FBQ2hCLGFBQU8sR0FBRyxRQUFRLFNBQVMsS0FBSyxHQUFHLE9BQU8sVUFBVSxHQUFHLE1BQU0sR0FBRyxVQUFVLFVBQVUsVUFBVSxLQUFLLEdBQUcsT0FBTyxVQUFVLFVBQVUsTUFBTSxHQUFHLFNBQVMsVUFBVSxTQUFTLEtBQy9KLEdBQUcsS0FBSyxVQUFVLE9BQU8sS0FBSyxHQUFHLEtBQUssVUFBVSxVQUFVLEtBQUssR0FBRyxLQUFLLFVBQVUsUUFBUSxJQUFJLE9BQU87QUFBQSxJQUMvRztBQUNBLElBQUFBLGNBQWEsS0FBSztBQUNsQixhQUFTLFdBQVcsVUFBVSxPQUFPO0FBQ2pDLFVBQUksT0FBTyxTQUFTLFFBQVE7QUFDNUIsVUFBSSxjQUFjLFVBQVUsT0FBTyxDQUFDLEdBQUcsTUFBTTtBQUN6QyxZQUFJLE9BQU8sRUFBRSxNQUFNLE1BQU0sT0FBTyxFQUFFLE1BQU0sTUFBTTtBQUM5QyxZQUFJLFNBQVMsR0FBRztBQUNaLGlCQUFPLEVBQUUsTUFBTSxNQUFNLFlBQVksRUFBRSxNQUFNLE1BQU07QUFBQSxRQUNuRDtBQUNBLGVBQU87QUFBQSxNQUNYLENBQUM7QUFDRCxVQUFJLHFCQUFxQixLQUFLO0FBQzlCLGVBQVMsSUFBSSxZQUFZLFNBQVMsR0FBRyxLQUFLLEdBQUcsS0FBSztBQUM5QyxZQUFJLElBQUksWUFBWSxDQUFDO0FBQ3JCLFlBQUksY0FBYyxTQUFTLFNBQVMsRUFBRSxNQUFNLEtBQUs7QUFDakQsWUFBSSxZQUFZLFNBQVMsU0FBUyxFQUFFLE1BQU0sR0FBRztBQUM3QyxZQUFJLGFBQWEsb0JBQW9CO0FBQ2pDLGlCQUFPLEtBQUssVUFBVSxHQUFHLFdBQVcsSUFBSSxFQUFFLFVBQVUsS0FBSyxVQUFVLFdBQVcsS0FBSyxNQUFNO0FBQUEsUUFDN0YsT0FDSztBQUNELGdCQUFNLElBQUksTUFBTSxrQkFBa0I7QUFBQSxRQUN0QztBQUNBLDZCQUFxQjtBQUFBLE1BQ3pCO0FBQ0EsYUFBTztBQUFBLElBQ1g7QUFDQSxJQUFBQSxjQUFhLGFBQWE7QUFDMUIsYUFBUyxVQUFVLE1BQU0sU0FBUztBQUM5QixVQUFJLEtBQUssVUFBVSxHQUFHO0FBRWxCLGVBQU87QUFBQSxNQUNYO0FBQ0EsWUFBTSxJQUFLLEtBQUssU0FBUyxJQUFLO0FBQzlCLFlBQU0sT0FBTyxLQUFLLE1BQU0sR0FBRyxDQUFDO0FBQzVCLFlBQU0sUUFBUSxLQUFLLE1BQU0sQ0FBQztBQUMxQixnQkFBVSxNQUFNLE9BQU87QUFDdkIsZ0JBQVUsT0FBTyxPQUFPO0FBQ3hCLFVBQUksVUFBVTtBQUNkLFVBQUksV0FBVztBQUNmLFVBQUksSUFBSTtBQUNSLGFBQU8sVUFBVSxLQUFLLFVBQVUsV0FBVyxNQUFNLFFBQVE7QUFDckQsWUFBSSxNQUFNLFFBQVEsS0FBSyxPQUFPLEdBQUcsTUFBTSxRQUFRLENBQUM7QUFDaEQsWUFBSSxPQUFPLEdBQUc7QUFFVixlQUFLLEdBQUcsSUFBSSxLQUFLLFNBQVM7QUFBQSxRQUM5QixPQUNLO0FBRUQsZUFBSyxHQUFHLElBQUksTUFBTSxVQUFVO0FBQUEsUUFDaEM7QUFBQSxNQUNKO0FBQ0EsYUFBTyxVQUFVLEtBQUssUUFBUTtBQUMxQixhQUFLLEdBQUcsSUFBSSxLQUFLLFNBQVM7QUFBQSxNQUM5QjtBQUNBLGFBQU8sV0FBVyxNQUFNLFFBQVE7QUFDNUIsYUFBSyxHQUFHLElBQUksTUFBTSxVQUFVO0FBQUEsTUFDaEM7QUFDQSxhQUFPO0FBQUEsSUFDWDtBQUFBLEVBQ0osR0FBRyxpQkFBaUIsZUFBZSxDQUFDLEVBQUU7QUFJdEMsTUFBTSxtQkFBTixNQUF1QjtBQUFBLElBQ25CLFlBQVksS0FBSyxZQUFZLFNBQVMsU0FBUztBQUMzQyxXQUFLLE9BQU87QUFDWixXQUFLLGNBQWM7QUFDbkIsV0FBSyxXQUFXO0FBQ2hCLFdBQUssV0FBVztBQUNoQixXQUFLLGVBQWU7QUFBQSxJQUN4QjtBQUFBLElBQ0EsSUFBSSxNQUFNO0FBQ04sYUFBTyxLQUFLO0FBQUEsSUFDaEI7QUFBQSxJQUNBLElBQUksYUFBYTtBQUNiLGFBQU8sS0FBSztBQUFBLElBQ2hCO0FBQUEsSUFDQSxJQUFJLFVBQVU7QUFDVixhQUFPLEtBQUs7QUFBQSxJQUNoQjtBQUFBLElBQ0EsUUFBUSxPQUFPO0FBQ1gsVUFBSSxPQUFPO0FBQ1AsWUFBSSxRQUFRLEtBQUssU0FBUyxNQUFNLEtBQUs7QUFDckMsWUFBSSxNQUFNLEtBQUssU0FBUyxNQUFNLEdBQUc7QUFDakMsZUFBTyxLQUFLLFNBQVMsVUFBVSxPQUFPLEdBQUc7QUFBQSxNQUM3QztBQUNBLGFBQU8sS0FBSztBQUFBLElBQ2hCO0FBQUEsSUFDQSxPQUFPLE9BQU8sU0FBUztBQUNuQixXQUFLLFdBQVcsTUFBTTtBQUN0QixXQUFLLFdBQVc7QUFDaEIsV0FBSyxlQUFlO0FBQUEsSUFDeEI7QUFBQSxJQUNBLGlCQUFpQjtBQUNiLFVBQUksS0FBSyxpQkFBaUIsUUFBVztBQUNqQyxZQUFJLGNBQWMsQ0FBQztBQUNuQixZQUFJLE9BQU8sS0FBSztBQUNoQixZQUFJLGNBQWM7QUFDbEIsaUJBQVMsSUFBSSxHQUFHLElBQUksS0FBSyxRQUFRLEtBQUs7QUFDbEMsY0FBSSxhQUFhO0FBQ2Isd0JBQVksS0FBSyxDQUFDO0FBQ2xCLDBCQUFjO0FBQUEsVUFDbEI7QUFDQSxjQUFJLEtBQUssS0FBSyxPQUFPLENBQUM7QUFDdEIsd0JBQWUsT0FBTyxRQUFRLE9BQU87QUFDckMsY0FBSSxPQUFPLFFBQVEsSUFBSSxJQUFJLEtBQUssVUFBVSxLQUFLLE9BQU8sSUFBSSxDQUFDLE1BQU0sTUFBTTtBQUNuRTtBQUFBLFVBQ0o7QUFBQSxRQUNKO0FBQ0EsWUFBSSxlQUFlLEtBQUssU0FBUyxHQUFHO0FBQ2hDLHNCQUFZLEtBQUssS0FBSyxNQUFNO0FBQUEsUUFDaEM7QUFDQSxhQUFLLGVBQWU7QUFBQSxNQUN4QjtBQUNBLGFBQU8sS0FBSztBQUFBLElBQ2hCO0FBQUEsSUFDQSxXQUFXLFFBQVE7QUFDZixlQUFTLEtBQUssSUFBSSxLQUFLLElBQUksUUFBUSxLQUFLLFNBQVMsTUFBTSxHQUFHLENBQUM7QUFDM0QsVUFBSSxjQUFjLEtBQUssZUFBZTtBQUN0QyxVQUFJLE1BQU0sR0FBRyxPQUFPLFlBQVk7QUFDaEMsVUFBSSxTQUFTLEdBQUc7QUFDWixlQUFPQyxVQUFTLE9BQU8sR0FBRyxNQUFNO0FBQUEsTUFDcEM7QUFDQSxhQUFPLE1BQU0sTUFBTTtBQUNmLFlBQUksTUFBTSxLQUFLLE9BQU8sTUFBTSxRQUFRLENBQUM7QUFDckMsWUFBSSxZQUFZLEdBQUcsSUFBSSxRQUFRO0FBQzNCLGlCQUFPO0FBQUEsUUFDWCxPQUNLO0FBQ0QsZ0JBQU0sTUFBTTtBQUFBLFFBQ2hCO0FBQUEsTUFDSjtBQUdBLFVBQUksT0FBTyxNQUFNO0FBQ2pCLGFBQU9BLFVBQVMsT0FBTyxNQUFNLFNBQVMsWUFBWSxJQUFJLENBQUM7QUFBQSxJQUMzRDtBQUFBLElBQ0EsU0FBUyxVQUFVO0FBQ2YsVUFBSSxjQUFjLEtBQUssZUFBZTtBQUN0QyxVQUFJLFNBQVMsUUFBUSxZQUFZLFFBQVE7QUFDckMsZUFBTyxLQUFLLFNBQVM7QUFBQSxNQUN6QixXQUNTLFNBQVMsT0FBTyxHQUFHO0FBQ3hCLGVBQU87QUFBQSxNQUNYO0FBQ0EsVUFBSSxhQUFhLFlBQVksU0FBUyxJQUFJO0FBQzFDLFVBQUksaUJBQWtCLFNBQVMsT0FBTyxJQUFJLFlBQVksU0FBVSxZQUFZLFNBQVMsT0FBTyxDQUFDLElBQUksS0FBSyxTQUFTO0FBQy9HLGFBQU8sS0FBSyxJQUFJLEtBQUssSUFBSSxhQUFhLFNBQVMsV0FBVyxjQUFjLEdBQUcsVUFBVTtBQUFBLElBQ3pGO0FBQUEsSUFDQSxJQUFJLFlBQVk7QUFDWixhQUFPLEtBQUssZUFBZSxFQUFFO0FBQUEsSUFDakM7QUFBQSxFQUNKO0FBQ0EsTUFBSTtBQUNKLEdBQUMsU0FBVUMsS0FBSTtBQUNYLFVBQU0sV0FBVyxPQUFPLFVBQVU7QUFDbEMsYUFBUyxRQUFRLE9BQU87QUFDcEIsYUFBTyxPQUFPLFVBQVU7QUFBQSxJQUM1QjtBQUNBLElBQUFBLElBQUcsVUFBVTtBQUNiLGFBQVNDLFdBQVUsT0FBTztBQUN0QixhQUFPLE9BQU8sVUFBVTtBQUFBLElBQzVCO0FBQ0EsSUFBQUQsSUFBRyxZQUFZQztBQUNmLGFBQVMsUUFBUSxPQUFPO0FBQ3BCLGFBQU8sVUFBVSxRQUFRLFVBQVU7QUFBQSxJQUN2QztBQUNBLElBQUFELElBQUcsVUFBVTtBQUNiLGFBQVMsT0FBTyxPQUFPO0FBQ25CLGFBQU8sU0FBUyxLQUFLLEtBQUssTUFBTTtBQUFBLElBQ3BDO0FBQ0EsSUFBQUEsSUFBRyxTQUFTO0FBQ1osYUFBUyxPQUFPLE9BQU87QUFDbkIsYUFBTyxTQUFTLEtBQUssS0FBSyxNQUFNO0FBQUEsSUFDcEM7QUFDQSxJQUFBQSxJQUFHLFNBQVM7QUFDWixhQUFTLFlBQVksT0FBTyxLQUFLLEtBQUs7QUFDbEMsYUFBTyxTQUFTLEtBQUssS0FBSyxNQUFNLHFCQUFxQixPQUFPLFNBQVMsU0FBUztBQUFBLElBQ2xGO0FBQ0EsSUFBQUEsSUFBRyxjQUFjO0FBQ2pCLGFBQVNFLFNBQVEsT0FBTztBQUNwQixhQUFPLFNBQVMsS0FBSyxLQUFLLE1BQU0scUJBQXFCLGVBQWUsU0FBUyxTQUFTO0FBQUEsSUFDMUY7QUFDQSxJQUFBRixJQUFHLFVBQVVFO0FBQ2IsYUFBU0MsVUFBUyxPQUFPO0FBQ3JCLGFBQU8sU0FBUyxLQUFLLEtBQUssTUFBTSxxQkFBcUIsS0FBSyxTQUFTLFNBQVM7QUFBQSxJQUNoRjtBQUNBLElBQUFILElBQUcsV0FBV0c7QUFDZCxhQUFTLEtBQUssT0FBTztBQUNqQixhQUFPLFNBQVMsS0FBSyxLQUFLLE1BQU07QUFBQSxJQUNwQztBQUNBLElBQUFILElBQUcsT0FBTztBQUNWLGFBQVMsY0FBYyxPQUFPO0FBSTFCLGFBQU8sVUFBVSxRQUFRLE9BQU8sVUFBVTtBQUFBLElBQzlDO0FBQ0EsSUFBQUEsSUFBRyxnQkFBZ0I7QUFDbkIsYUFBUyxXQUFXLE9BQU8sT0FBTztBQUM5QixhQUFPLE1BQU0sUUFBUSxLQUFLLEtBQUssTUFBTSxNQUFNLEtBQUs7QUFBQSxJQUNwRDtBQUNBLElBQUFBLElBQUcsYUFBYTtBQUFBLEVBQ3BCLEdBQUcsT0FBTyxLQUFLLENBQUMsRUFBRTs7O0FSeG5FbEIsTUFBSSxRQUFrQztBQU10QyxNQUFJLGlCQUFpQjtBQUdyQixNQUFNLGFBQTBCLG9CQUFJLElBQUk7QUFHeEMsTUFBTSxnQkFBNEQsb0JBQUksSUFBSTtBQU8xRSxNQUFNLGVBQTBDLG9CQUFJLElBQUk7QUFFeEQsTUFBSSx1QkFBdUI7QUFHM0IsTUFBSSx3QkFBbUY7QUFPdkYsaUJBQXNCLFFBQVEsY0FBcUM7QUFDL0QsVUFBTSxRQUFRLGFBQWEsUUFBUSxPQUFPLEVBQUUsRUFBRSxNQUFNLEdBQUc7QUFDdkQsVUFBTSxZQUFZLE1BQU0sQ0FBQztBQUN6QixVQUFNLFVBQVksTUFBTSxDQUFDO0FBQ3pCLFVBQU0sVUFBVSxxQkFBcUIsU0FBUyxJQUFJLE9BQU8sSUFBSSxNQUFNLE1BQU0sQ0FBQyxFQUFFLEtBQUssR0FBRyxDQUFDO0FBRXJGLFFBQUksT0FBTztBQUVQLGVBQVMsT0FBTztBQUNoQjtBQUFBLElBQ0o7QUFFQSxxQkFBaUIscUJBQXFCLFNBQVM7QUFFL0MsVUFBTSxRQUFRLFNBQVMsYUFBYSxXQUFXLFFBQVE7QUFDdkQsVUFBTSxRQUFRLEdBQUcsS0FBSyxNQUFNLFNBQVMsSUFBSSxzQ0FDYixtQkFBbUIsU0FBUyxDQUFDO0FBRXpELFVBQU0sS0FBSyxJQUFJLFVBQVUsS0FBSztBQUM5QixVQUFNLElBQUksUUFBYyxDQUFDLFNBQVMsV0FBVztBQUN6QyxTQUFHLFNBQVUsTUFBTSxRQUFRO0FBQzNCLFNBQUcsVUFBVSxNQUFNLE9BQU8sSUFBSSxNQUFNLHdDQUF3QyxLQUFLLEVBQUUsQ0FBQztBQUFBLElBQ3hGLENBQUM7QUFFRCxVQUFNLFNBQVMsU0FBUyxFQUFFO0FBQzFCLFVBQU0sU0FBUyxJQUFJLHVCQUF1QixNQUFNO0FBQ2hELFVBQU0sU0FBUyxJQUFJLHVCQUF1QixNQUFNO0FBQ2hELGdCQUFRLHdDQUF3QixRQUFRLE1BQU07QUFHOUMsVUFBTSxlQUFlLG1DQUFtQyxDQUFDLFdBQXVEO0FBQzVHLG1CQUFhLElBQUksT0FBTyxLQUFLLE9BQU8sZUFBZSxDQUFDLENBQUM7QUFDckQsWUFBTSxRQUFlLE9BQU8sVUFBVSxFQUFFLEtBQUssQ0FBQUksT0FBS0EsR0FBRSxJQUFJLFNBQVMsTUFBTSxPQUFPLEdBQUc7QUFDakYsVUFBSSxDQUFDLE1BQU87QUFDWixNQUFPLE9BQU8sZ0JBQWdCLE9BQU8sWUFBWSxPQUFPLFlBQVksSUFBSSxRQUFNO0FBQUEsUUFDMUUsVUFBaUIsWUFBWSxFQUFFLFFBQVE7QUFBQSxRQUN2QyxTQUFpQixFQUFFO0FBQUEsUUFDbkIsUUFBaUIsRUFBRSxVQUFVO0FBQUEsUUFDN0IsaUJBQWlCLEVBQUUsTUFBTSxNQUFNLE9BQU87QUFBQSxRQUN0QyxhQUFpQixFQUFFLE1BQU0sTUFBTSxZQUFZO0FBQUEsUUFDM0MsZUFBaUIsRUFBRSxNQUFNLElBQUksT0FBTztBQUFBLFFBQ3BDLFdBQWlCLEVBQUUsTUFBTSxJQUFJLFlBQVk7QUFBQSxNQUM3QyxFQUFFLENBQUM7QUFBQSxJQUNQLENBQUM7QUFHRCxVQUFNLFVBQVUsdUJBQXVCLENBQUMsV0FBb0M7QUFDeEUseUJBQW1CLE9BQU8sSUFBSTtBQUM5QixhQUFPLEVBQUUsU0FBUyxLQUFLO0FBQUEsSUFDM0IsQ0FBQztBQUNELFVBQU0sVUFBVSwyQkFBMkIsQ0FBQyxZQUN2QyxPQUFPLFNBQVMsQ0FBQyxHQUFHLElBQUksTUFBTSxjQUFjLEVBQUUsSUFBSSxDQUFDO0FBQ3hELFVBQU0sVUFBVSw2QkFBNkIsTUFBTSxJQUFJO0FBQ3ZELFVBQU0sVUFBVSwrQkFBK0IsTUFBTSxJQUFJO0FBQ3pELFVBQU0sVUFBVSw2QkFBNkIsTUFBTSxJQUFJO0FBQ3ZELFVBQU0sVUFBVSxrQ0FBa0MsTUFBTSxJQUFJO0FBQzVELFVBQU0sZUFBZSxxQkFBcUIsQ0FBQyxNQUEyQixRQUFRLE1BQU0sY0FBYyxHQUFHLE9BQU8sQ0FBQztBQUM3RyxVQUFNLGVBQWUsc0JBQXNCLENBQUMsTUFBMkIsUUFBUSxLQUFLLGNBQWMsR0FBRyxPQUFPLENBQUM7QUFFN0csVUFBTSxlQUFlLG1CQUFtQixNQUFNO0FBQUEsSUFBdUMsQ0FBQztBQUN0RixVQUFNLGVBQWUsMkJBQTJCLE1BQU07QUFBQSxJQUFnQyxDQUFDO0FBRXZGLFVBQU0sT0FBTztBQUViLFVBQU0sVUFBVTtBQUNoQixVQUFNLGFBQWtCLE1BQU0sTUFBTSxZQUFZLGNBQWM7QUFBQSxNQUMxRCxXQUFXO0FBQUEsTUFDWDtBQUFBLE1BQ0EsdUJBQXVCO0FBQUEsUUFDbkIsVUFBVSxjQUFjO0FBQUEsUUFDeEIsNEJBQTRCO0FBQUEsVUFDeEIsd0JBQW1DO0FBQUEsVUFDbkMsMEJBQW1DO0FBQUEsVUFDbkMsbUNBQW1DO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBLFVBTW5DLHVCQUFtQyxDQUFDLGlCQUFpQixtQkFBbUIsY0FBYztBQUFBLFFBQzFGO0FBQUEsTUFDSjtBQUFBLE1BQ0Esa0JBQWtCLENBQUMsRUFBRSxLQUFLLFNBQVMsTUFBTSxVQUFVLENBQUM7QUFBQSxNQUNwRCxjQUFjO0FBQUEsUUFDVixjQUFjO0FBQUEsVUFDVixpQkFBaUIsRUFBRSxxQkFBcUIsTUFBTSxVQUFVLE9BQU8sU0FBUyxNQUFNLG1CQUFtQixNQUFNO0FBQUEsVUFDdkcsWUFBWTtBQUFBLFlBQ1IscUJBQXFCO0FBQUEsWUFDckIsZ0JBQWdCO0FBQUEsY0FDWixnQkFBdUI7QUFBQSxjQUN2QixxQkFBdUIsQ0FBQyxZQUFZLFdBQVc7QUFBQSxjQUMvQyxtQkFBdUI7QUFBQSxjQUN2Qix5QkFBeUI7QUFBQSxjQUN6QixnQkFBdUIsRUFBRSxZQUFZLENBQUMsaUJBQWlCLFVBQVUscUJBQXFCLEVBQUU7QUFBQSxZQUM1RjtBQUFBLFlBQ0EsZ0JBQWdCO0FBQUEsVUFDcEI7QUFBQSxVQUNBLE9BQWdCLEVBQUUscUJBQXFCLE1BQU0sZUFBZSxDQUFDLFlBQVksV0FBVyxFQUFFO0FBQUEsVUFDdEYsZUFBZ0IsRUFBRSxxQkFBcUIsTUFBTSxzQkFBc0IsRUFBRSxxQkFBcUIsQ0FBQyxZQUFZLFdBQVcsR0FBRyxzQkFBc0IsRUFBRSxvQkFBb0IsS0FBSyxFQUFFLEVBQUU7QUFBQSxVQUMxSyxZQUFnQixFQUFFLHFCQUFxQixLQUFLO0FBQUEsVUFDNUMsWUFBZ0IsRUFBRSxxQkFBcUIsS0FBSztBQUFBLFVBQzVDLGdCQUFnQixFQUFFLHFCQUFxQixLQUFLO0FBQUEsVUFDNUMsZ0JBQWdCLEVBQUUscUJBQXFCLEtBQUs7QUFBQSxVQUM1QyxtQkFBbUIsRUFBRSxxQkFBcUIsS0FBSztBQUFBLFVBQy9DLGdCQUFnQixFQUFFLHFCQUFxQixNQUFNLG1DQUFtQyxLQUFLO0FBQUEsVUFDckYsY0FBZ0IsRUFBRSxxQkFBcUIsTUFBTSxpQkFBaUIsTUFBTTtBQUFBLFVBQ3BFLGdCQUFnQixFQUFFLHFCQUFxQixLQUFLO0FBQUEsVUFDNUMsVUFBZ0IsRUFBRSxxQkFBcUIsS0FBSztBQUFBLFVBQzVDLFdBQWdCLEVBQUUscUJBQXFCLE1BQU0sZ0JBQWdCLEVBQUUsWUFBWSxDQUFDLE9BQU8sRUFBRSxFQUFFO0FBQUEsVUFDdkYsZ0JBQWdCO0FBQUEsWUFDWixxQkFBcUI7QUFBQSxZQUNyQixVQUFpQixFQUFFLE9BQU8sT0FBTyxNQUFNLEVBQUUsT0FBTyxNQUFNLEVBQUU7QUFBQSxZQUN4RCxZQUFpQjtBQUFBLGNBQUM7QUFBQSxjQUFhO0FBQUEsY0FBUTtBQUFBLGNBQVM7QUFBQSxjQUFRO0FBQUEsY0FBYTtBQUFBLGNBQVU7QUFBQSxjQUMzRTtBQUFBLGNBQWE7QUFBQSxjQUFZO0FBQUEsY0FBWTtBQUFBLGNBQWM7QUFBQSxjQUFTO0FBQUEsY0FBWTtBQUFBLGNBQVU7QUFBQSxjQUNsRjtBQUFBLGNBQVc7QUFBQSxjQUFZO0FBQUEsY0FBVztBQUFBLGNBQVU7QUFBQSxjQUFVO0FBQUEsY0FBVTtBQUFBLGNBQVk7QUFBQSxZQUFXO0FBQUEsWUFDM0YsZ0JBQWlCO0FBQUEsY0FBQztBQUFBLGNBQWU7QUFBQSxjQUFjO0FBQUEsY0FBWTtBQUFBLGNBQVU7QUFBQSxjQUFjO0FBQUEsY0FDL0U7QUFBQSxjQUFTO0FBQUEsY0FBZ0I7QUFBQSxjQUFpQjtBQUFBLFlBQWdCO0FBQUEsWUFDOUQsU0FBaUIsQ0FBQyxVQUFVO0FBQUEsWUFDNUIseUJBQXlCO0FBQUEsWUFDekIsdUJBQXlCO0FBQUEsVUFDN0I7QUFBQSxVQUNBLFlBQWdCLEVBQUUscUJBQXFCLEtBQUs7QUFBQSxVQUM1QyxpQkFBaUIsRUFBRSxxQkFBcUIsS0FBSztBQUFBLFVBQzdDLFFBQWdCLEVBQUUscUJBQXFCLE1BQU0sZ0JBQWdCLEtBQUs7QUFBQSxVQUNsRSxZQUFZO0FBQUEsWUFDUixxQkFBcUI7QUFBQSxZQUNyQiwwQkFBMEI7QUFBQSxjQUN0QixnQkFBZ0I7QUFBQSxnQkFDWixVQUFVO0FBQUEsa0JBQUM7QUFBQSxrQkFBWTtBQUFBLGtCQUFZO0FBQUEsa0JBQW9CO0FBQUEsa0JBQ25EO0FBQUEsa0JBQW9CO0FBQUEsa0JBQVU7QUFBQSxnQkFBd0I7QUFBQSxjQUM5RDtBQUFBLFlBQ0o7QUFBQSxZQUNBLG9CQUFvQjtBQUFBLFlBQ3BCLGFBQW9CO0FBQUEsWUFDcEIsZ0JBQW9CLEVBQUUsWUFBWSxDQUFDLE1BQU0sRUFBRTtBQUFBLFVBQy9DO0FBQUEsVUFDQSxvQkFBb0IsRUFBRSxvQkFBb0IsS0FBSztBQUFBLFFBQ25EO0FBQUEsUUFDQSxXQUFXO0FBQUEsVUFDUCxXQUF3QjtBQUFBLFVBQ3hCLGVBQXdCO0FBQUEsVUFDeEIsZ0JBQXdCLEVBQUUscUJBQXFCLEtBQUs7QUFBQSxVQUNwRCx3QkFBd0IsRUFBRSxxQkFBcUIsS0FBSztBQUFBLFVBQ3BELGVBQXdCLEVBQUUsaUJBQWlCLE1BQU0sb0JBQW9CLENBQUMsVUFBVSxVQUFVLFFBQVEsRUFBRTtBQUFBLFFBQ3hHO0FBQUEsTUFDSjtBQUFBLElBQ0osQ0FBQztBQUVELDRCQUF3QixZQUFZLGNBQWMsd0JBQXdCLFVBQVU7QUFFcEYsVUFBTSxpQkFBaUIsZUFBZSxDQUFDLENBQUM7QUFDeEMsVUFBTSxpQkFBaUIsb0NBQW9DLEVBQUUsVUFBVSxjQUFjLEVBQUUsQ0FBQztBQUV4RixhQUFTLE9BQU87QUFFaEIsUUFBSSxDQUFDLHNCQUFzQjtBQUN2Qiw2QkFBdUI7QUFDdkIsd0JBQWtCO0FBQUEsSUFDdEI7QUFBQSxFQUNKO0FBVUEsV0FBUyxTQUFTLFNBQXVCO0FBQ3JDLFFBQUksV0FBVyxJQUFJLE9BQU8sS0FBSyxDQUFDLE1BQU87QUFDdkMsZUFBVyxJQUFJLE9BQU87QUFFdEIsVUFBTSxRQUFlLE9BQU8sVUFBVSxFQUFFLEtBQUssQ0FBQUEsT0FBS0EsR0FBRSxJQUFJLFNBQVMsTUFBTSxPQUFPO0FBQzlFLFVBQU0saUJBQWlCLHdCQUF3QjtBQUFBLE1BQzNDLGNBQWM7QUFBQSxRQUNWLEtBQVk7QUFBQSxRQUNaLFlBQVk7QUFBQSxRQUNaLFNBQVk7QUFBQSxRQUNaLE1BQVksT0FBTyxTQUFTLEtBQUs7QUFBQSxNQUNyQztBQUFBLElBQ0osQ0FBQztBQUVELFFBQUksT0FBTztBQUNQLFlBQU0sbUJBQW1CLE1BQU07QUFDM0IsY0FBTSxXQUFXLGNBQWMsSUFBSSxPQUFPO0FBQzFDLFlBQUksU0FBVSxjQUFhLFFBQVE7QUFDbkMsc0JBQWMsSUFBSSxTQUFTLFdBQVcsTUFBTSxjQUFjLE9BQU8sR0FBRyxHQUFHLENBQUM7QUFBQSxNQUM1RSxDQUFDO0FBQUEsSUFDTDtBQUFBLEVBQ0o7QUFHQSxXQUFTLGNBQWMsU0FBdUI7QUFDMUMsa0JBQWMsT0FBTyxPQUFPO0FBQzVCLFVBQU0sUUFBZSxPQUFPLFNBQWdCLElBQUksTUFBTSxPQUFPLENBQUM7QUFDOUQsUUFBSSxTQUFTLE9BQU87QUFDaEIsWUFBTSxpQkFBaUIsMEJBQTBCO0FBQUEsUUFDN0MsY0FBZ0IsRUFBRSxLQUFLLFNBQVMsU0FBUyxNQUFNLGFBQWEsRUFBRTtBQUFBLFFBQzlELGdCQUFnQixDQUFDLEVBQUUsTUFBTSxNQUFNLFNBQVMsRUFBRSxDQUFDO0FBQUEsTUFDL0MsQ0FBQztBQUFBLElBQ0w7QUFBQSxFQUNKO0FBT0EsV0FBUyxtQkFBbUIsU0FBdUI7QUFDL0MsUUFBSSxjQUFjLElBQUksT0FBTyxHQUFHO0FBQzVCLG1CQUFhLGNBQWMsSUFBSSxPQUFPLENBQUU7QUFDeEMsb0JBQWMsT0FBTztBQUFBLElBQ3pCO0FBQUEsRUFDSjtBQVVBLFdBQVMsZ0JBQWdCLEtBQXNCO0FBQzNDLFdBQU8sbUJBQW1CLE1BQU0sSUFBSSxXQUFXLGNBQWM7QUFBQSxFQUNqRTtBQU1BLFdBQVMsb0JBQTBCO0FBRS9CLElBQU8sT0FBTyxnQkFBZ0Isc0JBQXNCLENBQUMsV0FBb0IsV0FBaUM7QUFDdEcsc0JBQWdCLE1BQU07QUFBQSxJQUMxQixDQUFDO0FBQ0QsSUFBTyxPQUFPLGdCQUFnQixjQUFjLE1BQU07QUFBQSxJQUE4QixDQUFDO0FBS2pGLElBQU8sT0FBTyxxQkFBcUI7QUFBQSxNQUMvQixnQkFBZ0IsQ0FBQyxRQUFRLFVBQVUsd0JBQXdCO0FBQ3ZELGNBQU0sTUFBTSxTQUFTLFNBQVM7QUFDOUIsWUFBSSxDQUFDLGdCQUFnQixHQUFHLEtBQUssQ0FBQyxJQUFJLFdBQVcsbUJBQW1CLEVBQUcsUUFBTztBQUMxRSxjQUFNLGVBQWUsT0FBTyxTQUFTO0FBQ3JDLFlBQUksZ0JBQWdCLGFBQWEsSUFBSSxTQUFTLE1BQU0sSUFBSyxRQUFPO0FBQ2hFLGNBQU0sU0FBVSxXQUFtQjtBQUNuQyxZQUFJLE9BQU8sV0FBVyxXQUFZLFFBQU87QUFDekMsY0FBTSxNQUFNO0FBQ1osY0FBTSxPQUFPLE1BQU8sSUFBSSxtQkFBbUIsSUFBSSxhQUFjO0FBQzdELGNBQU0sU0FBUyxNQUFPLElBQUksZUFBZSxJQUFJLFNBQVU7QUFDdkQsZUFBTyxJQUFJLFVBQVUsb0JBQW9CLE1BQU0sR0FBRyxNQUFNLE1BQU07QUFDOUQsZUFBTztBQUFBLE1BQ1g7QUFBQSxJQUNKLENBQUM7QUFFRCxJQUFPLFVBQVUsK0JBQStCLFFBQVE7QUFBQSxNQUNwRCxtQkFBbUIsQ0FBQyxLQUFLLEtBQUssR0FBRztBQUFBLE1BQ2pDLHdCQUF3QixPQUFPLE9BQU8sVUFBVSxZQUFZO0FBQ3hELFlBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLE1BQU0sSUFBSSxTQUFTLENBQUMsRUFBRyxRQUFPO0FBQzdELGNBQU0sVUFBVSxNQUFNLElBQUksU0FBUztBQUVuQywyQkFBbUIsT0FBTztBQUMxQixjQUFNLFNBQW1ELE1BQU0sTUFBTSxZQUFZLDJCQUEyQjtBQUFBLFVBQ3hHLGNBQWMsRUFBRSxLQUFLLFFBQVE7QUFBQSxVQUM3QixVQUFjLEVBQUUsTUFBTSxTQUFTLGFBQWEsR0FBRyxXQUFXLFNBQVMsU0FBUyxFQUFFO0FBQUE7QUFBQSxVQUU5RSxTQUFjLEVBQUUsY0FBYyxRQUFRLGVBQWUsS0FBSyxHQUFHLGtCQUFrQixRQUFRLGlCQUFpQjtBQUFBLFFBQzVHLENBQUM7QUFDRCxjQUFNLFFBQVEsTUFBTSxRQUFRLE1BQU0sSUFBSSxTQUFVLFFBQVEsU0FBUyxDQUFDO0FBQ2xFLGVBQU87QUFBQSxVQUNILGFBQWEsTUFBTSxJQUFJLFVBQVEsc0JBQXNCLE1BQU0sT0FBTyxRQUFRLENBQUM7QUFBQTtBQUFBO0FBQUEsVUFHM0UsWUFBYSxNQUFNLFFBQVEsTUFBTSxJQUFJLFFBQVEsQ0FBQyxDQUFDLFFBQVE7QUFBQSxRQUMzRDtBQUFBLE1BQ0o7QUFBQTtBQUFBO0FBQUEsTUFHQSx1QkFBdUIsT0FBTyxTQUFTO0FBQ25DLGNBQU0sTUFBTyxLQUE4QjtBQUMzQyxZQUFJLENBQUMsU0FBUyxDQUFDLElBQUssUUFBTztBQUMzQixZQUFJO0FBQ0EsZ0JBQU0sV0FBMkIsTUFBTSxNQUFNLFlBQVksMEJBQTBCLEdBQUc7QUFDdEYsY0FBSSxTQUFTLGVBQWU7QUFDeEIsaUJBQUssZ0JBQWdCLEVBQUUsT0FBTyxlQUFlLFNBQVMsYUFBYSxHQUFHLFdBQVcsTUFBTTtBQUFBLFVBQzNGO0FBQ0EsY0FBSSxTQUFTLE9BQVEsTUFBSyxTQUFTLFNBQVM7QUFDNUMsY0FBSSxTQUFTLHFCQUFxQixRQUFRO0FBQ3RDLGlCQUFLLHNCQUFzQixTQUFTLG9CQUFvQixJQUFJLGdCQUFnQjtBQUFBLFVBQ2hGO0FBQUEsUUFDSixTQUFTLEdBQUc7QUFDUixrQkFBUSxNQUFNLHlDQUEwQyxHQUFhLE9BQU87QUFBQSxRQUNoRjtBQUNBLGVBQU87QUFBQSxNQUNYO0FBQUEsSUFDSixDQUFDO0FBRUQsSUFBTyxVQUFVLHNCQUFzQixRQUFRO0FBQUEsTUFDM0MsY0FBYyxPQUFPLE9BQU8sYUFBYTtBQUNyQyxZQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixNQUFNLElBQUksU0FBUyxDQUFDLEVBQUcsUUFBTztBQUM3RCxjQUFNLFVBQVUsTUFBTSxJQUFJLFNBQVM7QUFDbkMsY0FBTSxTQUF1QixNQUFNLE1BQU0sWUFBWSxzQkFBc0I7QUFBQSxVQUN2RSxjQUFjLEVBQUUsS0FBSyxRQUFRO0FBQUEsVUFDN0IsVUFBYyxFQUFFLE1BQU0sU0FBUyxhQUFhLEdBQUcsV0FBVyxTQUFTLFNBQVMsRUFBRTtBQUFBLFFBQ2xGLENBQUM7QUFDRCxZQUFJLENBQUMsUUFBUSxTQUFVLFFBQU87QUFDOUIsY0FBTSxXQUFXLE1BQU0sUUFBUSxPQUFPLFFBQVEsSUFBSSxPQUFPLFdBQVcsQ0FBQyxPQUFPLFFBQVE7QUFDcEYsZUFBTztBQUFBLFVBQ0gsVUFBVSxTQUFTLElBQUksUUFBTTtBQUFBLFlBQ3pCLE9BQU8sT0FBTyxNQUFNLFdBQVcsSUFBSyxFQUFvQjtBQUFBLFlBQ3hELFdBQVc7QUFBQSxVQUNmLEVBQUU7QUFBQSxVQUNGLE9BQU8sT0FBTyxRQUFRLGlCQUFpQixPQUFPLEtBQUssSUFBSTtBQUFBLFFBQzNEO0FBQUEsTUFDSjtBQUFBLElBQ0osQ0FBQztBQUVELElBQU8sVUFBVSw4QkFBOEIsUUFBUTtBQUFBLE1BQ25ELGdDQUFnQyxDQUFDLEtBQUssR0FBRztBQUFBLE1BQ3pDLHNCQUFzQixPQUFPLE9BQU8sYUFBYTtBQUM3QyxZQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixNQUFNLElBQUksU0FBUyxDQUFDLEVBQUcsUUFBTztBQUM3RCxjQUFNLFVBQVUsTUFBTSxJQUFJLFNBQVM7QUFDbkMsY0FBTSxTQUErQixNQUFNLE1BQU0sWUFBWSw4QkFBOEI7QUFBQSxVQUN2RixjQUFjLEVBQUUsS0FBSyxRQUFRO0FBQUEsVUFDN0IsVUFBYyxFQUFFLE1BQU0sU0FBUyxhQUFhLEdBQUcsV0FBVyxTQUFTLFNBQVMsRUFBRTtBQUFBLFFBQ2xGLENBQUM7QUFDRCxZQUFJLENBQUMsT0FBUSxRQUFPO0FBQ3BCLGVBQU87QUFBQSxVQUNILE9BQU87QUFBQSxZQUNILFlBQVksT0FBTyxXQUFXLElBQUksQ0FBQyxTQUErQjtBQUFBLGNBQzlELE9BQWUsSUFBSTtBQUFBLGNBQ25CLGVBQWUsSUFBSSxnQkFBZ0IsZUFBZSxJQUFJLGFBQWEsSUFBSTtBQUFBLGNBQ3ZFLGFBQWdCLElBQUksY0FBYyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQTZCO0FBQUEsZ0JBQ3BFLE9BQWUsRUFBRTtBQUFBLGdCQUNqQixlQUFlLEVBQUUsZ0JBQWdCLGVBQWUsRUFBRSxhQUFhLElBQUk7QUFBQSxjQUN2RSxFQUFFO0FBQUEsWUFDTixFQUFFO0FBQUEsWUFDRixpQkFBaUIsT0FBTyxtQkFBbUI7QUFBQSxZQUMzQyxpQkFBaUIsT0FBTyxtQkFBbUI7QUFBQSxVQUMvQztBQUFBLFVBQ0EsU0FBUyxNQUFNO0FBQUEsVUFBQztBQUFBLFFBQ3BCO0FBQUEsTUFDSjtBQUFBLElBQ0osQ0FBQztBQUVELElBQU8sVUFBVSwyQkFBMkIsUUFBUTtBQUFBLE1BQ2hELG1CQUFtQixPQUFPLE9BQU8sYUFBYTtBQUMxQyxZQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixNQUFNLElBQUksU0FBUyxDQUFDLEVBQUcsUUFBTztBQUM3RCxjQUFNLFVBQVUsTUFBTSxJQUFJLFNBQVM7QUFDbkMsY0FBTSxTQUF1QyxNQUFNLE1BQU0sWUFBWSwyQkFBMkI7QUFBQSxVQUM1RixjQUFjLEVBQUUsS0FBSyxRQUFRO0FBQUEsVUFDN0IsVUFBYyxFQUFFLE1BQU0sU0FBUyxhQUFhLEdBQUcsV0FBVyxTQUFTLFNBQVMsRUFBRTtBQUFBLFFBQ2xGLENBQUM7QUFDRCxZQUFJLENBQUMsT0FBUSxRQUFPO0FBQ3BCLGNBQU0sYUFBYSxNQUFNLFFBQVEsTUFBTSxJQUFJLFNBQVMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxVQUFRO0FBQUEsVUFDdEUsS0FBYyxJQUFJLE1BQU0sSUFBSSxHQUFHO0FBQUEsVUFDL0IsT0FBTyxpQkFBaUIsSUFBSSxLQUFLO0FBQUEsUUFDckMsRUFBRTtBQUNGLGNBQU0seUJBQXlCLFNBQVM7QUFDeEMsZUFBTztBQUFBLE1BQ1g7QUFBQSxJQUNKLENBQUM7QUFFRCxJQUFPLFVBQVUsMEJBQTBCLFFBQVE7QUFBQSxNQUMvQyxtQkFBbUIsT0FBTyxPQUFPLFVBQVUsWUFBWTtBQUNuRCxZQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixNQUFNLElBQUksU0FBUyxDQUFDLEVBQUcsUUFBTztBQUM3RCxjQUFNLFNBQTRCLE1BQU0sTUFBTSxZQUFZLDJCQUEyQjtBQUFBLFVBQ2pGLGNBQWMsRUFBRSxLQUFLLE1BQU0sSUFBSSxTQUFTLEVBQUU7QUFBQSxVQUMxQyxVQUFjLEVBQUUsTUFBTSxTQUFTLGFBQWEsR0FBRyxXQUFXLFNBQVMsU0FBUyxFQUFFO0FBQUEsVUFDOUUsU0FBYyxFQUFFLG9CQUFvQixRQUFRLG1CQUFtQjtBQUFBLFFBQ25FLENBQUM7QUFDRCxZQUFJLENBQUMsT0FBUSxRQUFPO0FBQ3BCLGNBQU0sWUFBWSxPQUFPLElBQUksVUFBUSxFQUFFLEtBQVksSUFBSSxNQUFNLElBQUksR0FBRyxHQUFHLE9BQU8saUJBQWlCLElBQUksS0FBSyxFQUFFLEVBQUU7QUFHNUcsY0FBTSx5QkFBeUIsU0FBUztBQUN4QyxlQUFPO0FBQUEsTUFDWDtBQUFBLElBQ0osQ0FBQztBQUVELElBQU8sVUFBVSx1QkFBdUIsUUFBUTtBQUFBLE1BQzVDLG9CQUFvQixPQUFPLE9BQU8sVUFBVSxZQUFZO0FBQ3BELFlBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLE1BQU0sSUFBSSxTQUFTLENBQUMsRUFBRyxRQUFPLEVBQUUsT0FBTyxDQUFDLEVBQUU7QUFDekUsY0FBTSxPQUE2QixNQUFNLE1BQU0sWUFBWSx1QkFBdUI7QUFBQSxVQUM5RSxjQUFjLEVBQUUsS0FBSyxNQUFNLElBQUksU0FBUyxFQUFFO0FBQUEsVUFDMUMsVUFBYyxFQUFFLE1BQU0sU0FBUyxhQUFhLEdBQUcsV0FBVyxTQUFTLFNBQVMsRUFBRTtBQUFBLFVBQzlFO0FBQUEsUUFDSixDQUFDO0FBQ0QsWUFBSSxDQUFDLEtBQU0sUUFBTyxFQUFFLE9BQU8sQ0FBQyxFQUFFO0FBSTlCLFlBQUksT0FBUSxXQUFtQix5QkFBeUIsWUFBWTtBQUNoRSxjQUFJO0FBQ0Esa0JBQU0sMkJBQTJCLE9BQU8sSUFBSTtBQUM1QyxtQkFBTyxFQUFFLE9BQU8sQ0FBQyxFQUFFO0FBQUEsVUFDdkIsU0FBUyxHQUFHO0FBQ1Isb0JBQVEsTUFBTSwyRUFBMkUsQ0FBQztBQUMxRixtQkFBTyxzQkFBc0IsSUFBSTtBQUFBLFVBQ3JDO0FBQUEsUUFDSjtBQUNBLGVBQU8sc0JBQXNCLElBQUk7QUFBQSxNQUNyQztBQUFBLE1BQ0EsdUJBQXVCLE9BQU8sT0FBTyxhQUFhO0FBQzlDLFlBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLE1BQU0sSUFBSSxTQUFTLENBQUMsRUFBRyxRQUFPO0FBQzdELFlBQUk7QUFDQSxnQkFBTSxTQUNGLE1BQU0sTUFBTSxZQUFZLDhCQUE4QjtBQUFBLFlBQ2xELGNBQWMsRUFBRSxLQUFLLE1BQU0sSUFBSSxTQUFTLEVBQUU7QUFBQSxZQUMxQyxVQUFjLEVBQUUsTUFBTSxTQUFTLGFBQWEsR0FBRyxXQUFXLFNBQVMsU0FBUyxFQUFFO0FBQUEsVUFDbEYsQ0FBQztBQUNMLGNBQUksQ0FBQyxPQUFRLFFBQU87QUFDcEIsZ0JBQU0sUUFBUSxXQUFXLFNBQVMsT0FBTyxRQUFRO0FBQ2pELGdCQUFNLGNBQWMsaUJBQWlCLFVBQVUsT0FBTyxjQUNoRCxPQUFPLGNBQ1AsTUFBTSxrQkFBa0IsUUFBUSxHQUFHLFFBQVE7QUFDakQsaUJBQU8sRUFBRSxPQUFPLGlCQUFpQixLQUFLLEdBQUcsTUFBTSxZQUFZO0FBQUEsUUFDL0QsUUFBUTtBQUNKLGdCQUFNLE9BQU8sTUFBTSxrQkFBa0IsUUFBUTtBQUM3QyxpQkFBTyxPQUFPO0FBQUEsWUFDVixPQUFPLEVBQUUsaUJBQWlCLFNBQVMsWUFBWSxhQUFhLEtBQUssYUFBYSxlQUFlLFNBQVMsWUFBWSxXQUFXLEtBQUssVUFBVTtBQUFBLFlBQzVJLE1BQU0sS0FBSztBQUFBLFVBQ2YsSUFBSTtBQUFBLFFBQ1I7QUFBQSxNQUNKO0FBQUEsSUFDSixDQUFDO0FBS0QsSUFBTyxVQUFVLHVDQUF1QyxRQUFRO0FBQUEsTUFDNUQsZ0NBQWdDLE9BQU8sVUFBVTtBQUM3QyxZQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixNQUFNLElBQUksU0FBUyxDQUFDLEVBQUcsUUFBTztBQUM3RCxjQUFNLFFBQTJCLE1BQU0sTUFBTSxZQUFZLDJCQUEyQjtBQUFBLFVBQ2hGLGNBQWMsRUFBRSxLQUFLLE1BQU0sSUFBSSxTQUFTLEVBQUU7QUFBQSxVQUMxQyxTQUFjLEVBQUUsU0FBUyxNQUFNLFdBQVcsRUFBRSxTQUFTLGNBQWMsTUFBTSxXQUFXLEVBQUUsYUFBYTtBQUFBLFFBQ3ZHLENBQUM7QUFDRCxlQUFPLFFBQVEsTUFBTSxJQUFJLGdCQUFnQixJQUFJO0FBQUEsTUFDakQ7QUFBQSxJQUNKLENBQUM7QUFFRCxJQUFPLFVBQVUsMkJBQTJCLFFBQVE7QUFBQSxNQUNoRCxvQkFBb0IsT0FBTyxPQUFPLE9BQU8sWUFBWTtBQUNqRCxjQUFNLFFBQVEsRUFBRSxTQUFTLENBQUMsR0FBRyxVQUFVO0FBQUEsUUFBMkIsRUFBRTtBQUNwRSxZQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixNQUFNLElBQUksU0FBUyxDQUFDLEVBQUcsUUFBTztBQUc3RCxjQUFNLFdBQVcsaUJBQWlCLEtBQUs7QUFDdkMsY0FBTSxlQUFlLGFBQWEsSUFBSSxNQUFNLElBQUksU0FBUyxDQUFDLEtBQUssQ0FBQyxHQUFHLE9BQU8sT0FBSyxjQUFjLEVBQUUsT0FBTyxRQUFRLENBQUM7QUFDL0csY0FBTSxTQUE2QyxNQUFNLE1BQU0sWUFBWSwyQkFBMkI7QUFBQSxVQUNsRyxjQUFjLEVBQUUsS0FBSyxNQUFNLElBQUksU0FBUyxFQUFFO0FBQUEsVUFDMUMsT0FBYztBQUFBLFVBQ2QsU0FBYyxFQUFFLGFBQWEsTUFBTSxRQUFRLE9BQU8sQ0FBQyxRQUFRLElBQUksSUFBSSxPQUFVO0FBQUEsUUFDakYsQ0FBQztBQUNELFlBQUksQ0FBQyxRQUFRLE9BQVEsUUFBTztBQUM1QixlQUFPO0FBQUEsVUFDSCxTQUFTLE9BQU8sSUFBSSxxQkFBcUI7QUFBQSxVQUN6QyxVQUFVO0FBQUEsVUFBMkI7QUFBQSxRQUN6QztBQUFBLE1BQ0o7QUFBQSxJQUNKLEdBQUc7QUFBQSxNQUNDLHlCQUF5QjtBQUFBLFFBQUM7QUFBQSxRQUFZO0FBQUEsUUFBWTtBQUFBLFFBQW9CO0FBQUEsUUFDbEU7QUFBQSxRQUFvQjtBQUFBLFFBQVU7QUFBQSxNQUF3QjtBQUFBLElBQzlELENBQUM7QUFJRCxJQUFPLFVBQVUsK0JBQStCLFFBQVE7QUFBQSxNQUNwRCx1QkFBdUIsQ0FBQyxPQUFPLGFBQWEsaUJBQWlCLCtCQUErQixPQUFPLFFBQVE7QUFBQSxJQUMvRyxDQUFDO0FBRUQsSUFBTyxVQUFVLCtCQUErQixRQUFRO0FBQUEsTUFDcEQsdUJBQXVCLENBQUMsT0FBTyxhQUFhLGlCQUFpQiwrQkFBK0IsT0FBTyxRQUFRO0FBQUEsSUFDL0csQ0FBQztBQUVELElBQU8sVUFBVSxrQ0FBa0MsUUFBUTtBQUFBLE1BQ3ZELDJCQUEyQixPQUFPLE9BQU8sYUFBYTtBQUNsRCxZQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixNQUFNLElBQUksU0FBUyxDQUFDLEVBQUcsUUFBTztBQUM3RCxjQUFNLFNBQXVCLE1BQU0sTUFBTSxZQUFZLGtDQUFrQztBQUFBLFVBQ25GLGNBQWMsRUFBRSxLQUFLLE1BQU0sSUFBSSxTQUFTLEVBQUU7QUFBQSxVQUMxQyxVQUFjLEVBQUUsTUFBTSxTQUFTLGFBQWEsR0FBRyxXQUFXLFNBQVMsU0FBUyxFQUFFO0FBQUEsUUFDbEYsQ0FBQztBQUNELFlBQUksQ0FBQyxPQUFRLFFBQU87QUFDcEIsZUFBTyxPQUFPLElBQUksUUFBTSxFQUFFLE9BQU8saUJBQWlCLEVBQUUsS0FBSyxHQUFHLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxJQUFJLE9BQVUsRUFBRTtBQUFBLE1BQ3hHO0FBQUEsSUFDSixDQUFDO0FBRUQsSUFBTyxVQUFVLCtCQUErQixRQUFRO0FBQUEsTUFDcEQsd0JBQXdCLE9BQU8sVUFBVTtBQUNyQyxZQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixNQUFNLElBQUksU0FBUyxDQUFDLEVBQUcsUUFBTztBQUM3RCxjQUFNLFNBQXVCLE1BQU0sTUFBTSxZQUFZLCtCQUErQjtBQUFBLFVBQ2hGLGNBQWMsRUFBRSxLQUFLLE1BQU0sSUFBSSxTQUFTLEVBQUU7QUFBQSxRQUM5QyxDQUFDO0FBQ0QsZUFBTyxTQUFTLG1CQUFtQixNQUFNLElBQUk7QUFBQSxNQUNqRDtBQUFBLElBQ0osQ0FBQztBQUVELElBQU8sVUFBVSw2QkFBNkIsUUFBUTtBQUFBLE1BQ2xELHNCQUFzQixPQUFPLFVBQVU7QUFDbkMsWUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsTUFBTSxJQUFJLFNBQVMsQ0FBQyxFQUFHLFFBQU87QUFDN0QsY0FBTSxTQUF1QixNQUFNLE1BQU0sWUFBWSw2QkFBNkI7QUFBQSxVQUM5RSxjQUFjLEVBQUUsS0FBSyxNQUFNLElBQUksU0FBUyxFQUFFO0FBQUEsUUFDOUMsQ0FBQztBQUNELFlBQUksQ0FBQyxPQUFRLFFBQU87QUFDcEIsZUFBTyxPQUFPLElBQUksUUFBTSxFQUFFLE9BQU8sRUFBRSxZQUFZLEdBQUcsS0FBSyxFQUFFLFVBQVUsR0FBRyxNQUFNLFlBQVksRUFBRSxJQUFJLEVBQUUsRUFBRTtBQUFBLE1BQ3RHO0FBQUEsSUFDSixDQUFDO0FBRUQsSUFBTyxVQUFVLCtCQUErQixRQUFRO0FBQUEsTUFDcEQsd0JBQXdCLE9BQU8sT0FBTyxjQUFjO0FBQ2hELFlBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLE1BQU0sSUFBSSxTQUFTLENBQUMsRUFBRyxRQUFPO0FBQzdELGNBQU0sU0FBdUIsTUFBTSxNQUFNLFlBQVksK0JBQStCO0FBQUEsVUFDaEYsY0FBYyxFQUFFLEtBQUssTUFBTSxJQUFJLFNBQVMsRUFBRTtBQUFBLFVBQzFDLFdBQWMsVUFBVSxJQUFJLFFBQU0sRUFBRSxNQUFNLEVBQUUsYUFBYSxHQUFHLFdBQVcsRUFBRSxTQUFTLEVBQUUsRUFBRTtBQUFBLFFBQzFGLENBQUM7QUFDRCxZQUFJLENBQUMsT0FBUSxRQUFPO0FBQ3BCLGVBQU8sT0FBTyxJQUFJLHFCQUFxQjtBQUFBLE1BQzNDO0FBQUEsSUFDSixDQUFDO0FBRUQsSUFBTyxVQUFVLDRDQUE0QyxRQUFRO0FBQUEsTUFDakUscUNBQXFDLE9BQU8sT0FBTyxVQUFVO0FBQ3pELFlBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLE1BQU0sSUFBSSxTQUFTLENBQUMsRUFBRyxRQUFPO0FBQzdELGNBQU0sUUFBMkIsTUFBTSxNQUFNLFlBQVksZ0NBQWdDO0FBQUEsVUFDckYsY0FBYyxFQUFFLEtBQUssTUFBTSxJQUFJLFNBQVMsRUFBRTtBQUFBLFVBQzFDLE9BQWMsaUJBQWlCLEtBQUs7QUFBQSxVQUNwQyxTQUFjLEVBQUUsU0FBUyxNQUFNLFdBQVcsRUFBRSxTQUFTLGNBQWMsTUFBTSxXQUFXLEVBQUUsYUFBYTtBQUFBLFFBQ3ZHLENBQUM7QUFDRCxlQUFPLFFBQVEsTUFBTSxJQUFJLGdCQUFnQixJQUFJO0FBQUEsTUFDakQ7QUFBQSxJQUNKLENBQUM7QUFJRCxJQUFPLFVBQVUsMkJBQTJCLFFBQVE7QUFBQSxNQUNoRCxtQkFBbUIsT0FBTyxPQUFPLFVBQVU7QUFDdkMsWUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsTUFBTSxJQUFJLFNBQVMsQ0FBQyxFQUFHLFFBQU87QUFDN0QsY0FBTSxTQUF1QixNQUFNLE1BQU0sWUFBWSwwQkFBMEI7QUFBQSxVQUMzRSxjQUFjLEVBQUUsS0FBSyxNQUFNLElBQUksU0FBUyxFQUFFO0FBQUEsVUFDMUMsT0FBYyxpQkFBaUIsS0FBSztBQUFBLFFBQ3hDLENBQUM7QUFDRCxZQUFJLENBQUMsT0FBUSxRQUFPO0FBQ3BCLGVBQU87QUFBQSxVQUNILE9BQU8sT0FBTyxJQUFJLFFBQU07QUFBQSxZQUNwQixVQUFjLEVBQUUsWUFBWSxFQUFFLFNBQVMsT0FBTyxHQUFHLFFBQVEsRUFBRSxTQUFTLFlBQVksRUFBRTtBQUFBLFlBQ2xGLE9BQWMsT0FBTyxFQUFFLFVBQVUsV0FBVyxFQUFFLFNBQVMsRUFBRSxTQUFTLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBWSxFQUFFLE9BQU8sRUFBRSxNQUFNLEVBQUU7QUFBQSxZQUMxRyxNQUFjLEVBQUU7QUFBQSxZQUNoQixhQUFjLEVBQUU7QUFBQSxZQUNoQixjQUFjLEVBQUU7QUFBQSxZQUNoQixTQUFjLEVBQUUsVUFBVSxlQUFlLEVBQUUsT0FBTyxJQUFJO0FBQUEsVUFDMUQsRUFBRTtBQUFBLFVBQ0YsVUFBVTtBQUFBLFVBQTJCO0FBQUEsUUFDekM7QUFBQSxNQUNKO0FBQUEsSUFDSixDQUFDO0FBRUQsSUFBTyxVQUFVLHVDQUF1QyxRQUFRO0FBQUEsTUFDNUQsV0FBVyxNQUFNLHlCQUF5QixFQUFFLFlBQVksQ0FBQyxHQUFHLGdCQUFnQixDQUFDLEVBQUU7QUFBQSxNQUMvRSwrQkFBK0IsT0FBTyxVQUFVO0FBQzVDLFlBQUksQ0FBQyxTQUFTLENBQUMsZ0JBQWdCLE1BQU0sSUFBSSxTQUFTLENBQUMsS0FBSyxDQUFDLHNCQUF1QixRQUFPO0FBQ3ZGLGNBQU0sU0FBdUQsTUFBTSxNQUFNLFlBQVksb0NBQW9DO0FBQUEsVUFDckgsY0FBYyxFQUFFLEtBQUssTUFBTSxJQUFJLFNBQVMsRUFBRTtBQUFBLFFBQzlDLENBQUM7QUFDRCxZQUFJLENBQUMsUUFBUSxLQUFNLFFBQU87QUFDMUIsZUFBTyxFQUFFLE1BQU0sSUFBSSxZQUFZLE9BQU8sSUFBSSxHQUFHLFVBQVUsT0FBTyxTQUFTO0FBQUEsTUFDM0U7QUFBQSxNQUNBLCtCQUErQixNQUFNO0FBQUEsTUFBMkI7QUFBQSxJQUNwRSxDQUFDO0FBSUQsSUFBTyxVQUFVLHlCQUF5QixRQUFRO0FBQUEsTUFDOUMsbUJBQW1CLE9BQU8sVUFBVTtBQUNoQyxZQUFJLENBQUMsU0FBUyxDQUFDLGdCQUFnQixNQUFNLElBQUksU0FBUyxDQUFDLEVBQUcsUUFBTyxFQUFFLFFBQVEsQ0FBQyxHQUFHLFVBQVU7QUFBQSxRQUFRLEVBQUU7QUFDL0YsY0FBTSxTQUF1QixNQUFNLE1BQU0sWUFBWSx5QkFBeUI7QUFBQSxVQUMxRSxjQUFjLEVBQUUsS0FBSyxNQUFNLElBQUksU0FBUyxFQUFFO0FBQUEsUUFDOUMsQ0FBQztBQUNELGNBQU0sVUFBVSxVQUFVLENBQUMsR0FBRyxJQUFJLENBQUMsTUFBTSxPQUFPO0FBQUEsVUFDNUMsT0FBVSxpQkFBaUIsS0FBSyxLQUFLO0FBQUEsVUFDckMsSUFBVSxPQUFPLENBQUM7QUFBQSxVQUNsQixTQUFVLEtBQUssVUFBVSxlQUFlLEtBQUssT0FBTyxJQUFJO0FBQUEsVUFDeEQsTUFBVTtBQUFBLFFBQ2QsRUFBRTtBQUNGLGVBQU8sRUFBRSxRQUFRLFVBQVU7QUFBQSxRQUFRLEVBQUU7QUFBQSxNQUN6QztBQUFBLE1BQ0EsaUJBQWlCLE9BQU8sUUFBUSxhQUFhO0FBQ3pDLGNBQU0sTUFBTyxTQUFpQjtBQUM5QixZQUFJLFNBQVMsT0FBTyxDQUFDLElBQUksU0FBUztBQUM5QixjQUFJO0FBQ0Esa0JBQU0sV0FBZ0IsTUFBTSxNQUFNLFlBQVksb0JBQW9CLEdBQUc7QUFDckUscUJBQVMsVUFBVSxVQUFVLFVBQVUsZUFBZSxTQUFTLE9BQU8sSUFBSSxFQUFFLElBQUksY0FBYyxPQUFPLEdBQUc7QUFBQSxVQUM1RyxRQUFRO0FBQ0oscUJBQVMsVUFBVSxFQUFFLElBQUksY0FBYyxPQUFPLEdBQUc7QUFBQSxVQUNyRDtBQUFBLFFBQ0o7QUFDQSxlQUFPO0FBQUEsTUFDWDtBQUFBLElBQ0osQ0FBQztBQUlELElBQU8sVUFBVSwrQkFBK0IsUUFBUTtBQUFBLE1BQ3BELHdCQUF3QixDQUFDLE9BQU8sYUFBYTtBQUN6QyxZQUFJLENBQUMsZ0JBQWdCLE1BQU0sSUFBSSxTQUFTLENBQUMsRUFBRyxRQUFPO0FBQ25ELGNBQU0sT0FBTyxNQUFNLHFCQUFxQixRQUFRO0FBQ2hELGNBQU0sUUFBdUI7QUFBQSxVQUN6QixpQkFBaUIsU0FBUztBQUFBLFVBQVksYUFBYSxLQUFLO0FBQUEsVUFDeEQsZUFBaUIsU0FBUztBQUFBLFVBQVksV0FBYSxLQUFLO0FBQUEsUUFDNUQ7QUFDQSxlQUFPO0FBQUEsVUFDSCxhQUFhLGNBQWMsSUFBSSxjQUFZO0FBQUEsWUFDdkMsT0FBWTtBQUFBLFlBQ1osTUFBbUIsVUFBVSxtQkFBbUI7QUFBQSxZQUNoRCxZQUFZO0FBQUEsWUFDWjtBQUFBLFlBQ0EsVUFBWSxLQUFLLE9BQU87QUFBQSxVQUM1QixFQUFFO0FBQUEsUUFDTjtBQUFBLE1BQ0o7QUFBQSxJQUNKLENBQUM7QUFBQSxFQUNMO0FBTUEsV0FBUyxZQUFZLFVBQWlFO0FBQ2xGLFlBQVEsVUFBVTtBQUFBLE1BQ2QsS0FBSyxtQkFBbUI7QUFBYSxlQUFjLGVBQWU7QUFBQSxNQUNsRSxLQUFLLG1CQUFtQjtBQUFhLGVBQWMsZUFBZTtBQUFBLE1BQ2xFLEtBQUssbUJBQW1CO0FBQWEsZUFBYyxlQUFlO0FBQUEsTUFDbEUsS0FBSyxtQkFBbUI7QUFBYSxlQUFjLGVBQWU7QUFBQSxNQUNsRTtBQUFxQyxlQUFjLGVBQWU7QUFBQSxJQUN0RTtBQUFBLEVBQ0o7QUFFQSxXQUFTLGlCQUFpQixHQUE0RztBQUNsSSxXQUFPO0FBQUEsTUFDSCxpQkFBaUIsRUFBRSxNQUFNLE9BQU87QUFBQSxNQUNoQyxhQUFpQixFQUFFLE1BQU0sWUFBWTtBQUFBLE1BQ3JDLGVBQWlCLEVBQUUsSUFBSSxPQUFPO0FBQUEsTUFDOUIsV0FBaUIsRUFBRSxJQUFJLFlBQVk7QUFBQSxJQUN2QztBQUFBLEVBQ0o7QUFFQSxXQUFTLGVBQWUsR0FBbUM7QUFDdkQsV0FBTyxPQUFPLE1BQU0sV0FBVyxJQUFJLEVBQUU7QUFBQSxFQUN6QztBQUVBLFdBQVMsa0JBQWtCLE1BQTJFO0FBQ2xHLFVBQU0sSUFBVyxVQUFVO0FBQzNCLFlBQVEsTUFBTTtBQUFBLE1BQ1YsS0FBSyxtQkFBbUI7QUFBZSxlQUFPLEVBQUU7QUFBQSxNQUNoRCxLQUFLLG1CQUFtQjtBQUFlLGVBQU8sRUFBRTtBQUFBLE1BQ2hELEtBQUssbUJBQW1CO0FBQWUsZUFBTyxFQUFFO0FBQUEsTUFDaEQsS0FBSyxtQkFBbUI7QUFBZSxlQUFPLEVBQUU7QUFBQSxNQUNoRCxLQUFLLG1CQUFtQjtBQUFlLGVBQU8sRUFBRTtBQUFBLE1BQ2hELEtBQUssbUJBQW1CO0FBQWUsZUFBTyxFQUFFO0FBQUEsTUFDaEQsS0FBSyxtQkFBbUI7QUFBZSxlQUFPLEVBQUU7QUFBQSxNQUNoRCxLQUFLLG1CQUFtQjtBQUFlLGVBQU8sRUFBRTtBQUFBLE1BQ2hELEtBQUssbUJBQW1CO0FBQWUsZUFBTyxFQUFFO0FBQUEsTUFDaEQsS0FBSyxtQkFBbUI7QUFBZSxlQUFPLEVBQUU7QUFBQSxNQUNoRCxLQUFLLG1CQUFtQjtBQUFlLGVBQU8sRUFBRTtBQUFBLE1BQ2hELEtBQUssbUJBQW1CO0FBQWUsZUFBTyxFQUFFO0FBQUEsTUFDaEQsS0FBSyxtQkFBbUI7QUFBZSxlQUFPLEVBQUU7QUFBQSxNQUNoRCxLQUFLLG1CQUFtQjtBQUFlLGVBQU8sRUFBRTtBQUFBLE1BQ2hELEtBQUssbUJBQW1CO0FBQWUsZUFBTyxFQUFFO0FBQUEsTUFDaEQ7QUFBdUMsZUFBTyxFQUFFO0FBQUEsSUFDcEQ7QUFBQSxFQUNKO0FBRUEsV0FBUyxzQkFDTCxNQUNBLE9BQ0EsVUFDb0I7QUFDcEIsVUFBTSxPQUFPLE1BQU0scUJBQXFCLFFBQVE7QUFDaEQsUUFBSSxRQUF1QjtBQUFBLE1BQ3ZCLGlCQUFpQixTQUFTO0FBQUEsTUFDMUIsYUFBaUIsS0FBSztBQUFBLE1BQ3RCLGVBQWlCLFNBQVM7QUFBQSxNQUMxQixXQUFpQixLQUFLO0FBQUEsSUFDMUI7QUFDQSxRQUFJLGFBQWEsS0FBSyxjQUFjLEtBQUs7QUFDekMsVUFBTSxXQUFXLEtBQUs7QUFDdEIsUUFBSSxVQUFVO0FBQ1YsWUFBTSxJQUFJLFNBQVMsU0FBUyxTQUFTLFdBQVcsU0FBUztBQUN6RCxVQUFJLEVBQUcsU0FBUSxpQkFBaUIsQ0FBQztBQUNqQyxVQUFJLE9BQU8sU0FBUyxZQUFZLFNBQVUsY0FBYSxTQUFTO0FBQUEsSUFDcEU7QUFDQSxVQUFNLFNBQStCO0FBQUEsTUFDakMsT0FBaUIsS0FBSztBQUFBLE1BQ3RCLE1BQWlCLGtCQUFrQixLQUFLLElBQUk7QUFBQSxNQUM1QyxRQUFpQixLQUFLO0FBQUEsTUFDdEIsZUFBaUIsS0FBSyxnQkFBZ0IsRUFBRSxPQUFPLGVBQWUsS0FBSyxhQUFhLEdBQUcsV0FBVyxNQUFNLElBQUk7QUFBQSxNQUN4RztBQUFBLE1BQ0EsaUJBQWlCLEtBQUsscUJBQXFCLGlCQUFpQixVQUM5QixVQUFVLDZCQUE2QixrQkFDOUM7QUFBQSxNQUN2QjtBQUFBLE1BQ0EsVUFBcUIsdUJBQXVCLElBQUk7QUFBQSxNQUNoRCxZQUFxQixLQUFLO0FBQUEsTUFDMUIsV0FBcUIsS0FBSztBQUFBLE1BQzFCLGtCQUFxQixLQUFLO0FBQUEsTUFDMUIscUJBQXFCLEtBQUsscUJBQXFCLElBQUksZ0JBQWdCO0FBQUEsSUFDdkU7QUFDQSxXQUFPLE9BQU87QUFDZCxXQUFPO0FBQUEsRUFDWDtBQU1BLFdBQVMsdUJBQXVCLE1BQThCO0FBQzFELFVBQU0sT0FBTyxLQUFLLGFBQWEsT0FBTyxLQUFLLFVBQVUsV0FBVyxLQUFLLFFBQVE7QUFDN0UsVUFBTSxjQUFlLEtBQUssZ0JBQWdCLE9BQU8sS0FBSyxhQUFhLGdCQUFnQixXQUM3RSxLQUFLLGFBQWEsY0FBYztBQUN0QyxVQUFNLFdBQVcsR0FBRyxLQUFLLFVBQVUsRUFBRSxJQUFJLFdBQVc7QUFDcEQsV0FBTyxTQUFTLFNBQVMsMkJBQTJCLElBQUksS0FBSyxJQUFJLEtBQUssS0FBSyxJQUFJO0FBQUEsRUFDbkY7QUFPQSxNQUFNLHVCQUF1QjtBQUc3QixNQUFNLHNCQUFzQjtBQUc1QixNQUFNLGVBQWU7QUFHckIsTUFBTSxnQkFBZ0I7QUFBQSxJQUFDO0FBQUEsSUFBWTtBQUFBLElBQVU7QUFBQSxJQUFXO0FBQUEsSUFBUztBQUFBLElBQVE7QUFBQSxJQUFRO0FBQUEsSUFBUztBQUFBLElBQVE7QUFBQSxJQUM5RjtBQUFBLElBQVM7QUFBQSxJQUFZO0FBQUEsSUFBVztBQUFBLElBQU07QUFBQSxJQUFVO0FBQUEsSUFBUTtBQUFBLElBQVE7QUFBQSxJQUFXO0FBQUEsSUFBUztBQUFBLElBQVc7QUFBQSxJQUMvRjtBQUFBLElBQU87QUFBQSxJQUFRO0FBQUEsSUFBTTtBQUFBLElBQWM7QUFBQSxJQUFVO0FBQUEsSUFBYztBQUFBLElBQU87QUFBQSxJQUFhO0FBQUEsSUFBUTtBQUFBLElBQVU7QUFBQSxJQUNqRztBQUFBLElBQVc7QUFBQSxJQUFXO0FBQUEsSUFBYTtBQUFBLElBQVU7QUFBQSxJQUFVO0FBQUEsSUFBUztBQUFBLElBQVU7QUFBQSxJQUFZO0FBQUEsSUFBUztBQUFBLElBQy9GO0FBQUEsSUFBZ0I7QUFBQSxJQUFRO0FBQUEsSUFBUztBQUFBLElBQVU7QUFBQSxJQUFhO0FBQUEsSUFBTztBQUFBLElBQVE7QUFBQSxJQUFZO0FBQUEsSUFBUztBQUFBLElBQzVGO0FBQUEsSUFBUztBQUFBLElBQVU7QUFBQSxJQUFVO0FBQUEsSUFBVztBQUFBLElBQVE7QUFBQSxJQUFTO0FBQUEsRUFBTTtBQUduRSxpQkFBZSxpQkFBaUIsUUFBZ0IsT0FBaUMsVUFBMkI7QUFDeEcsUUFBSSxDQUFDLFNBQVMsQ0FBQyxnQkFBZ0IsTUFBTSxJQUFJLFNBQVMsQ0FBQyxFQUFHLFFBQU87QUFDN0QsVUFBTSxTQUF1QyxNQUFNLE1BQU0sWUFBWSxRQUFRO0FBQUEsTUFDekUsY0FBYyxFQUFFLEtBQUssTUFBTSxJQUFJLFNBQVMsRUFBRTtBQUFBLE1BQzFDLFVBQWMsRUFBRSxNQUFNLFNBQVMsYUFBYSxHQUFHLFdBQVcsU0FBUyxTQUFTLEVBQUU7QUFBQSxJQUNsRixDQUFDO0FBQ0QsUUFBSSxDQUFDLE9BQVEsUUFBTztBQUNwQixVQUFNLGFBQWEsTUFBTSxRQUFRLE1BQU0sSUFBSSxTQUFTLENBQUMsTUFBTSxHQUFHLElBQUksVUFBUSxFQUFFLEtBQVksSUFBSSxNQUFNLElBQUksR0FBRyxHQUFHLE9BQU8saUJBQWlCLElBQUksS0FBSyxFQUFFLEVBQUU7QUFDakosVUFBTSx5QkFBeUIsU0FBUztBQUN4QyxXQUFPO0FBQUEsRUFDWDtBQU9BLGlCQUFlLHlCQUF5QixXQUFzRDtBQUMxRixVQUFNLE9BQU8sb0JBQUksSUFBWTtBQUM3QixVQUFNLFFBQVEsSUFBSSxVQUFVLElBQUksT0FBTyxFQUFFLElBQUksTUFBTTtBQUMvQyxZQUFNLFNBQVMsSUFBSSxTQUFTO0FBQzVCLFVBQUksS0FBSyxJQUFJLE1BQU0sS0FBSyxDQUFDLE9BQU8sV0FBVyxtQkFBbUIsS0FBWSxPQUFPLFNBQVMsR0FBRyxFQUFHO0FBQ2hHLFdBQUssSUFBSSxNQUFNO0FBQ2YsVUFBSTtBQUNBLGNBQU0sT0FBTyxNQUFNLHVCQUF1QixtQkFBbUIsTUFBTSxLQUFLLE1BQU07QUFDOUUsWUFBSSxDQUFRLE9BQU8sU0FBUyxHQUFHLEVBQUcsQ0FBTyxPQUFPLFlBQVksTUFBTSxRQUFRLEdBQUc7QUFBQSxNQUNqRixRQUFRO0FBQUEsTUFFUjtBQUFBLElBQ0osQ0FBQyxDQUFDO0FBQUEsRUFDTjtBQUdBLFdBQVMsbUJBQW1CLFNBQW1EO0FBQzNFLFlBQVEsV0FBVyxDQUFDLEdBQUcsSUFBSSxRQUFNO0FBQUEsTUFDN0IsTUFBZ0IsRUFBRTtBQUFBLE1BQ2xCLFFBQWdCLEVBQUUsVUFBVTtBQUFBLE1BQzVCLE9BQWlCLEVBQUUsUUFBUSxLQUFLO0FBQUEsTUFDaEMsTUFBZ0IsRUFBRSxRQUFRLENBQUM7QUFBQSxNQUMzQixPQUFnQixpQkFBaUIsRUFBRSxLQUFLO0FBQUEsTUFDeEMsZ0JBQWdCLGlCQUFpQixFQUFFLGtCQUFrQixFQUFFLEtBQUs7QUFBQSxNQUM1RCxVQUFnQixFQUFFLFdBQVcsbUJBQW1CLEVBQUUsUUFBUSxJQUFJLENBQUM7QUFBQSxJQUNuRSxFQUFFO0FBQUEsRUFDTjtBQUVBLFdBQVMsWUFBWSxNQUF5RTtBQUMxRixVQUFNLEtBQVksVUFBVTtBQUM1QixZQUFRLE1BQU07QUFBQSxNQUNWLEtBQUs7QUFBVyxlQUFPLEdBQUc7QUFBQSxNQUMxQixLQUFLO0FBQVcsZUFBTyxHQUFHO0FBQUEsTUFDMUIsS0FBSztBQUFXLGVBQU8sR0FBRztBQUFBLE1BQzFCO0FBQWdCLGVBQU87QUFBQSxJQUMzQjtBQUFBLEVBQ0o7QUFHQSxXQUFTLHNCQUFzQixnQkFBd0Q7QUFDbkYsVUFBTSxTQUE0QyxDQUFDO0FBQ25ELFFBQUksVUFBVTtBQUNkLFdBQU8sU0FBUztBQUNaLGFBQU8sS0FBSyxFQUFFLE9BQU8saUJBQWlCLFFBQVEsS0FBSyxFQUFFLENBQUM7QUFDdEQsZ0JBQVUsUUFBUTtBQUFBLElBQ3RCO0FBQ0EsV0FBTztBQUFBLEVBQ1g7QUFHQSxXQUFTLGVBQWUsS0FBb0M7QUFDeEQsVUFBTSxPQUFPLElBQUksYUFBYSxDQUFDO0FBQy9CLFNBQUssSUFBSSxZQUFZLDBCQUEwQixJQUFJLFlBQVksZ0NBQWdDLEtBQUssVUFBVSxHQUFHO0FBQzdHLFlBQU0sYUFBYSxLQUFLLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQVksRUFBRSxLQUFZLElBQUksTUFBTSxFQUFFLEdBQUcsR0FBRyxPQUFPLGlCQUFpQixFQUFFLEtBQUssRUFBRSxFQUFFO0FBQ3RILGFBQU87QUFBQSxRQUNILElBQVc7QUFBQSxRQUNYLE9BQVcsSUFBSTtBQUFBLFFBQ2YsV0FBVyxDQUFRLElBQUksTUFBTSxLQUFLLENBQUMsQ0FBQyxHQUFHLEVBQUUsWUFBWSxLQUFLLENBQUMsRUFBRSxPQUFPLEdBQUcsUUFBUSxLQUFLLENBQUMsRUFBRSxZQUFZLEVBQUUsR0FBRyxTQUFTO0FBQUEsTUFDckg7QUFBQSxJQUNKO0FBQ0EsV0FBTyxFQUFFLElBQUksY0FBYyxPQUFPLElBQUksTUFBTTtBQUFBLEVBQ2hEO0FBT0EsV0FBUyxpQkFBaUIsTUFBMkM7QUFDakUsV0FBTyxFQUFFLE9BQU8saUJBQWlCLEtBQUssS0FBSyxHQUFHLE1BQU0sS0FBSyxRQUFRO0FBQUEsRUFDckU7QUFFQSxXQUFTLGlCQUFpQixHQUE0QjtBQUNsRCxXQUFPO0FBQUEsTUFDSCxPQUFPLEVBQUUsTUFBTSxFQUFFLGtCQUFrQixHQUFHLFdBQVcsRUFBRSxjQUFjLEVBQUU7QUFBQSxNQUNuRSxLQUFPLEVBQUUsTUFBTSxFQUFFLGdCQUFnQixHQUFHLFdBQVcsRUFBRSxZQUFZLEVBQUU7QUFBQSxJQUNuRTtBQUFBLEVBQ0o7QUFHQSxXQUFTLGNBQWMsR0FBYSxHQUFzQjtBQUN0RCxVQUFNLFdBQVcsQ0FBQyxHQUF3QyxNQUN0RCxFQUFFLE9BQU8sRUFBRSxRQUFTLEVBQUUsU0FBUyxFQUFFLFFBQVEsRUFBRSxhQUFhLEVBQUU7QUFDOUQsV0FBTyxTQUFTLEVBQUUsT0FBTyxFQUFFLEdBQUcsS0FBSyxTQUFTLEVBQUUsT0FBTyxFQUFFLEdBQUc7QUFBQSxFQUM5RDtBQUVBLFdBQVMsc0JBQXNCLFFBQTJEO0FBQ3RGLFVBQU0sWUFBWSxPQUFRLE9BQW1CLFlBQVk7QUFDekQsVUFBTSxRQUFRLE9BQU8sVUFDYixZQUFhLE9BQW1CLFVBQVcsT0FBc0IsU0FBUyxVQUMzRTtBQUNQLFVBQU0sT0FBTyxZQUFZLGFBQWUsT0FBc0IsUUFBUTtBQUN0RSxXQUFPO0FBQUEsTUFDSDtBQUFBLE1BQ0E7QUFBQSxNQUNBLGFBQWEsQ0FBQztBQUFBLE1BQ2QsYUFBYyxPQUFzQjtBQUFBO0FBQUEsTUFFcEMsU0FBUyxFQUFFLElBQUksc0JBQXNCLE9BQU8sV0FBVyxDQUFDLE1BQU0sRUFBRTtBQUFBLElBQ3BFO0FBQUEsRUFDSjtBQUVBLGlCQUFlLGdCQUFnQixRQUE2QztBQUN4RSxRQUFJLENBQUMsTUFBTztBQUNaLFFBQUk7QUFDQSxVQUFJLE9BQVEsT0FBbUIsWUFBWSxVQUFVO0FBQ2pELGNBQU0saUJBQWlCLE1BQWlCO0FBQ3hDO0FBQUEsTUFDSjtBQUNBLFVBQUksV0FBVztBQUNmLFVBQUksQ0FBQyxTQUFTLFFBQVMsU0FBZ0MsU0FBUyxRQUFXO0FBQ3ZFLG1CQUFXLE1BQU0sTUFBTSxZQUFZLHNCQUFzQixRQUFRO0FBQUEsTUFDckU7QUFDQSxVQUFJLFNBQVMsS0FBTSxvQkFBbUIsU0FBUyxJQUFJO0FBQ25ELFVBQUksU0FBUyxRQUFTLE9BQU0saUJBQWlCLFNBQVMsT0FBTztBQUFBLElBQ2pFLFNBQVMsR0FBRztBQUNSLGNBQVEsS0FBSyxrQ0FBbUMsR0FBYSxXQUFXLENBQUM7QUFBQSxJQUM3RTtBQUFBLEVBQ0o7QUFFQSxXQUFTLGdCQUFnQixPQUF3QztBQUM3RCxXQUFPLENBQUMsQ0FBQyxVQUFVLENBQUMsQ0FBRSxNQUF3QixXQUFXLENBQUMsQ0FBRSxNQUF3QjtBQUFBLEVBQ3hGO0FBRUEsaUJBQWUsaUJBQWlCLEtBQTZCO0FBQ3pELFFBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxRQUFTO0FBQzdCLFFBQUksU0FBUyxJQUFJLE9BQU8sR0FBRztBQUN2QixZQUFNLFlBQVksSUFBSSxTQUFTLElBQUksYUFBYSxDQUFDLENBQUM7QUFDbEQ7QUFBQSxJQUNKO0FBQ0EsVUFBTSxTQUFTLE1BQU0sTUFBTSxZQUFZLDRCQUE0QixFQUFFLFNBQVMsSUFBSSxTQUFTLFdBQVcsSUFBSSxhQUFhLENBQUMsRUFBRSxDQUFDO0FBQzNILFFBQUksZ0JBQWdCLE1BQU0sRUFBRyxvQkFBbUIsTUFBTTtBQUFBLEVBQzFEO0FBV0EsV0FBUyxXQUFXLEdBQWdCO0FBQ2hDLFVBQU0sT0FBTyxHQUFHLFFBQVEsR0FBRyxhQUFhO0FBQ3hDLFVBQU0sT0FBTyxHQUFHLFFBQVEsR0FBRztBQUMzQixXQUFPLE9BQU8sR0FBRyxJQUFJLEtBQUssSUFBSSxLQUFLLEdBQUcsSUFBSTtBQUFBLEVBQzlDO0FBT0EsTUFBTSxXQUF5QztBQUFBLElBQzNDLDBDQUEwQztBQUFBLE1BQ3RDLE9BQU87QUFBQSxNQUNQLFFBQVE7QUFBQSxNQUNSLFVBQVU7QUFBQSxNQUNWLFNBQVMsQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQVksRUFBRSxPQUFPLFdBQVcsQ0FBQyxHQUFHLEtBQUssRUFBRSxFQUFFO0FBQUEsTUFDcEYsV0FBVyxDQUFDLE1BQU0sR0FBRyxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsRUFBRSxjQUFjLEdBQUcsZ0JBQWdCLENBQUMsR0FBRyxRQUFRLElBQUksSUFBSSxDQUFBQSxPQUFLQSxHQUFFLEdBQUcsRUFBRSxDQUFDO0FBQUEsSUFDL0c7QUFBQSxJQUNBLHNDQUFzQztBQUFBLE1BQ2xDLE9BQU87QUFBQSxNQUNQLFFBQVE7QUFBQSxNQUNSLFVBQVU7QUFBQSxNQUNWLFNBQVMsQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQVksRUFBRSxPQUFPLFdBQVcsQ0FBQyxHQUFHLEtBQUssRUFBRSxFQUFFO0FBQUEsTUFDcEYsV0FBVyxDQUFDLE1BQU0sSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUFBLE9BQUtBLEdBQUUsR0FBRyxDQUFDO0FBQUEsSUFDL0Q7QUFBQSxJQUNBLG9DQUFvQztBQUFBLE1BQ2hDLE9BQU87QUFBQSxNQUNQLFFBQVE7QUFBQSxNQUNSLFVBQVU7QUFBQSxNQUNWLFNBQVMsQ0FBQyxPQUFPLEdBQUcsVUFBVSxDQUFDLEdBQUcsSUFBSSxDQUFDLE9BQVksRUFBRSxPQUFPLFdBQVcsQ0FBQyxHQUFHLEtBQUssRUFBRSxFQUFFO0FBQUEsTUFDcEYsV0FBVyxDQUFDLE1BQU0sSUFBSSxRQUFRLENBQUMsS0FBSyxDQUFDLEdBQUcsSUFBSSxJQUFJLENBQUFBLE9BQUtBLEdBQUUsR0FBRyxHQUFHLEtBQUs7QUFBQSxJQUN0RTtBQUFBLElBQ0EsdUNBQXVDO0FBQUEsTUFDbkMsT0FBTztBQUFBLE1BQ1AsUUFBUTtBQUFBLE1BQ1IsVUFBVTtBQUFBLE1BQ1YsU0FBUyxDQUFDLE9BQU8sR0FBRyxhQUFhLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxPQUFZLEVBQUUsT0FBTyxXQUFXLENBQUMsR0FBRyxLQUFLLEVBQUUsRUFBRTtBQUFBLE1BQzVGLFdBQVcsQ0FBQyxNQUFNLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFBQSxPQUFLQSxHQUFFLEdBQUcsQ0FBQztBQUFBLElBQy9EO0FBQUEsSUFDQSxxQ0FBcUM7QUFBQSxNQUNqQyxPQUFPO0FBQUEsTUFDUCxRQUFRO0FBQUEsTUFDUixVQUFVO0FBQUEsTUFDVixTQUFTLENBQUMsT0FBTyxHQUFHLFdBQVcsQ0FBQyxHQUFHLElBQUksQ0FBQ0EsUUFBWTtBQUFBLFFBQ2hELE9BQU8sR0FBR0EsR0FBRSxJQUFJLEtBQUtBLEdBQUUsY0FBYyxDQUFDLEdBQUcsS0FBSyxJQUFJLENBQUMsSUFBSUEsR0FBRSxpQkFBaUIsUUFBUUEsR0FBRSxpQkFBaUIsRUFBRTtBQUFBLFFBQ3ZHLEtBQUtBO0FBQUEsTUFDVCxFQUFFO0FBQUEsTUFDRixXQUFXLENBQUMsTUFBTSxRQUFRLFFBQVEsQ0FBQyxLQUFLLENBQUMsR0FBRyxFQUFFLG9CQUFvQixJQUFJLElBQUksQ0FBQUEsT0FBS0EsR0FBRSxHQUFHLEdBQUcsTUFBTSxRQUFRLEtBQUssQ0FBQztBQUFBLElBQy9HO0FBQUEsRUFDSjtBQUVBLGlCQUFlLFlBQVksVUFBa0IsTUFBNEI7QUFDckUsUUFBSSxDQUFDLE1BQU87QUFDWixVQUFNLE9BQU8sU0FBUyxRQUFRO0FBQzlCLFVBQU0sU0FBUyxNQUFNLE1BQU0sWUFBWSw0QkFBNEIsRUFBRSxTQUFTLEtBQUssUUFBUSxXQUFXLEtBQUssQ0FBQztBQUM1RyxRQUFJLENBQUMsT0FBUTtBQUNiLFVBQU0sVUFBVSxLQUFLLFFBQVEsTUFBTTtBQUNuQyxRQUFJLFdBQVc7QUFDZixVQUFNLFNBQVUsV0FBbUI7QUFDbkMsUUFBSSxRQUFRLFVBQVUsT0FBTyxXQUFXLFlBQVk7QUFDaEQsWUFBTSxTQUEwQixNQUFNLE9BQU8sS0FBSyxPQUFPLFFBQVEsSUFBSSxDQUFBQSxPQUFLQSxHQUFFLEtBQUssQ0FBQztBQUNsRixVQUFJLFdBQVcsS0FBTTtBQUNyQixpQkFBVyxRQUFRLE9BQU8sQ0FBQUEsT0FBSyxPQUFPLFNBQVNBLEdBQUUsS0FBSyxDQUFDO0FBQUEsSUFDM0Q7QUFDQSxVQUFNLE9BQU8sTUFBTSxNQUFNLFlBQVksNEJBQTRCO0FBQUEsTUFDN0QsU0FBUyxLQUFLO0FBQUEsTUFDZCxXQUFXLEtBQUssVUFBVSxNQUFNLFFBQVEsUUFBUTtBQUFBLElBQ3BELENBQUM7QUFDRCxRQUFJLGdCQUFnQixJQUFJLEVBQUcsb0JBQW1CLElBQUk7QUFBQSxFQUN0RDtBQUdBLFdBQVMsbUJBQW1CLE1BQThDO0FBQ3RFLFFBQUksQ0FBQyxLQUFNO0FBQ1gsVUFBTSxRQUFvQyxDQUFDO0FBQzNDLFFBQUksS0FBSyxTQUFTO0FBQ2QsaUJBQVcsT0FBTyxLQUFLLFFBQVMsT0FBTSxHQUFHLEtBQUssTUFBTSxHQUFHLEtBQUssQ0FBQyxHQUFHLE9BQU8sS0FBSyxRQUFRLEdBQUcsQ0FBQztBQUFBLElBQzVGO0FBQ0EsUUFBSSxLQUFLLGlCQUFpQjtBQUN0QixpQkFBVyxNQUFNLEtBQUssaUJBQTBCO0FBQzVDLFlBQUksSUFBSSxjQUFjLE9BQU8sTUFBTSxRQUFRLEdBQUcsS0FBSyxHQUFHO0FBQ2xELGdCQUFNLEdBQUcsYUFBYSxHQUFHLEtBQUssTUFBTSxHQUFHLGFBQWEsR0FBRyxLQUFLLENBQUMsR0FBRyxPQUFPLEdBQUcsS0FBSztBQUFBLFFBQ25GO0FBQUEsTUFDSjtBQUFBLElBQ0o7QUFDQSxlQUFXLE9BQU8sT0FBTztBQUNyQixZQUFNLFFBQWUsT0FBTyxVQUFVLEVBQUUsS0FBSyxDQUFBQSxPQUFLQSxHQUFFLElBQUksU0FBUyxNQUFNLEdBQUc7QUFDMUUsVUFBSSxDQUFDLE1BQU87QUFDWixZQUFNLE1BQU0sTUFBTSxHQUFHLEVBQUUsSUFBSSxRQUFNLEVBQUUsT0FBTyxpQkFBaUIsRUFBRSxLQUFLLEdBQUcsTUFBTSxFQUFFLFNBQVMsa0JBQWtCLEtBQUssRUFBRTtBQUMvRyxZQUFNLG1CQUFtQixDQUFDLEdBQUcsS0FBSyxNQUFNLElBQUk7QUFBQSxJQUNoRDtBQUFBLEVBQ0o7QUFHQSxXQUFTLHNCQUFzQixNQUE0RDtBQUN2RixVQUFNLFFBQWUsQ0FBQztBQUN0QixVQUFNLE9BQU8sQ0FBQyxLQUFhLFNBQXFCO0FBQzVDLGlCQUFXLEtBQUssTUFBTTtBQUNsQixjQUFNLEtBQUssRUFBRSxVQUFpQixJQUFJLE1BQU0sR0FBRyxHQUFHLFVBQVUsRUFBRSxPQUFPLGlCQUFpQixFQUFFLEtBQUssR0FBRyxNQUFNLEVBQUUsUUFBUSxHQUFHLFdBQVcsT0FBVSxDQUFDO0FBQUEsTUFDekk7QUFBQSxJQUNKO0FBQ0EsUUFBSSxNQUFNLFNBQVM7QUFDZixpQkFBVyxPQUFPLEtBQUssUUFBUyxNQUFLLEtBQUssS0FBSyxRQUFRLEdBQUcsQ0FBQztBQUFBLElBQy9EO0FBQ0EsUUFBSSxNQUFNLGlCQUFpQjtBQUN2QixpQkFBVyxNQUFNLEtBQUssaUJBQTBCO0FBQzVDLFlBQUksSUFBSSxjQUFjLE9BQU8sTUFBTSxRQUFRLEdBQUcsS0FBSyxFQUFHLE1BQUssR0FBRyxhQUFhLEtBQUssR0FBRyxLQUFLO0FBQUEsTUFDNUY7QUFBQSxJQUNKO0FBQ0EsV0FBTyxFQUFFLE1BQU07QUFBQSxFQUNuQjtBQUdBLFdBQVMsbUJBQW1CLEtBQTRCO0FBQ3BELFFBQUksQ0FBQyxJQUFJLFdBQVcsbUJBQW1CLEVBQUcsUUFBTztBQUNqRCxXQUFPLG1CQUFtQixJQUFJLFVBQVUsb0JBQW9CLE1BQU0sQ0FBQztBQUFBLEVBQ3ZFO0FBR0EsaUJBQWUsdUJBQXVCLFNBQWtDO0FBQ3BFLFVBQU0sV0FBVyxNQUFNLE1BQU0sNkJBQTZCLFNBQVMsRUFBRSxTQUFTLEVBQUUsb0JBQW9CLFFBQVEsRUFBRSxDQUFDO0FBQy9HLFFBQUksQ0FBQyxTQUFTLElBQUk7QUFDZCxZQUFNLElBQUksTUFBTSxrQkFBa0IsT0FBTyxVQUFVLFNBQVMsTUFBTSxHQUFHO0FBQUEsSUFDekU7QUFDQSxXQUFPLFNBQVMsS0FBSztBQUFBLEVBQ3pCO0FBSUEsV0FBUyxpQkFBaUIsTUFBYyxPQUEyQjtBQUMvRCxVQUFNLGFBQWEsQ0FBQyxDQUFDO0FBQ3JCLGFBQVMsSUFBSSxHQUFHLElBQUksS0FBSyxRQUFRLEtBQUs7QUFDbEMsVUFBSSxLQUFLLFdBQVcsQ0FBQyxNQUFNLEdBQWEsWUFBVyxLQUFLLElBQUksQ0FBQztBQUFBLElBQ2pFO0FBQ0EsVUFBTSxTQUFTLENBQUMsT0FBNEMsV0FBVyxFQUFFLElBQUksS0FBSyxLQUFLLFVBQVUsRUFBRTtBQUNuRyxVQUFNLFVBQVUsTUFBTSxNQUFNLEVBQ04sS0FBSyxDQUFDLEdBQUcsTUFBTSxPQUFPLEVBQUUsTUFBTSxLQUFLLElBQUksT0FBTyxFQUFFLE1BQU0sS0FBSyxDQUFDO0FBQ2xGLFFBQUksU0FBUztBQUNiLGVBQVcsS0FBSyxTQUFTO0FBQ3JCLGVBQVMsT0FBTyxNQUFNLEdBQUcsT0FBTyxFQUFFLE1BQU0sS0FBSyxDQUFDLElBQUksRUFBRSxVQUFVLE9BQU8sTUFBTSxPQUFPLEVBQUUsTUFBTSxHQUFHLENBQUM7QUFBQSxJQUNsRztBQUNBLFdBQU87QUFBQSxFQUNYO0FBU0EsaUJBQWUsMkJBQTJCLE9BQWlDLE1BQW9DO0FBQzNHLFVBQU0sYUFBYSxNQUFNLElBQUksU0FBUztBQUN0QyxVQUFNLFlBQXdDLENBQUM7QUFDL0MsVUFBTSxjQUFzQyxDQUFDO0FBRTdDLFFBQUksS0FBSyxTQUFTO0FBQ2QsaUJBQVcsT0FBTyxLQUFLLFFBQVMsV0FBVSxHQUFHLEtBQUssVUFBVSxHQUFHLEtBQUssQ0FBQyxHQUFHLE9BQU8sS0FBSyxRQUFRLEdBQUcsQ0FBQztBQUFBLElBQ3BHO0FBQ0EsUUFBSSxLQUFLLGlCQUFpQjtBQUN0QixpQkFBVyxNQUFNLEtBQUssaUJBQTBCO0FBQzVDLFlBQUksSUFBSSxTQUFTLFlBQVksR0FBRyxVQUFVLEdBQUcsUUFBUTtBQUNqRCxzQkFBWSxHQUFHLE1BQU0sSUFBSSxHQUFHO0FBQUEsUUFDaEMsV0FBVyxJQUFJLGNBQWMsT0FBTyxNQUFNLFFBQVEsR0FBRyxLQUFLLEdBQUc7QUFDekQsb0JBQVUsR0FBRyxhQUFhLEdBQUcsS0FBSyxVQUFVLEdBQUcsYUFBYSxHQUFHLEtBQUssQ0FBQyxHQUFHLE9BQU8sR0FBRyxLQUFLO0FBQUEsUUFDM0Y7QUFBQSxNQUNKO0FBQUEsSUFDSjtBQU1BLFVBQU0sV0FBbUMsQ0FBQztBQUMxQyxlQUFXLFVBQVUsWUFBYSxVQUFTLFlBQVksTUFBTSxDQUFDLElBQUk7QUFDbEUsVUFBTSxhQUF5QyxDQUFDO0FBQ2hELGVBQVcsT0FBTyxXQUFXO0FBQ3pCLFlBQU0sWUFBWSxTQUFTLEdBQUcsS0FBSztBQUNuQyxpQkFBVyxTQUFTLEtBQUssV0FBVyxTQUFTLEtBQUssQ0FBQyxHQUFHLE9BQU8sVUFBVSxHQUFHLENBQUM7QUFBQSxJQUMvRTtBQUVBLFVBQU0sVUFNRixFQUFFLGFBQWEsbUJBQW1CLFVBQVUsR0FBRyxnQkFBZ0IsTUFBTSxnQkFBZ0IsTUFBTSxRQUFRLENBQUMsR0FBRyxTQUFTLENBQUMsRUFBRTtBQUV2SCxVQUFNLGlCQUF1RCxDQUFDO0FBQzlELFVBQU0sVUFBVSxvQkFBSSxJQUFZLENBQUMsR0FBRyxPQUFPLEtBQUssVUFBVSxHQUFHLEdBQUcsT0FBTyxLQUFLLFdBQVcsQ0FBQyxDQUFDO0FBQ3pGLGVBQVcsVUFBVSxTQUFTO0FBQzFCLFlBQU0sUUFBUSxXQUFXLE1BQU0sS0FBSyxDQUFDO0FBQ3JDLFVBQUk7QUFDSixVQUFJLFdBQVcsWUFBWTtBQUN2QixZQUFJLE1BQU0sUUFBUTtBQUNkLGdCQUFNLG1CQUFtQixDQUFDLEdBQUcsTUFBTSxJQUFJLFFBQU0sRUFBRSxPQUFPLGlCQUFpQixFQUFFLEtBQUssR0FBRyxNQUFNLEVBQUUsU0FBUyxrQkFBa0IsS0FBSyxFQUFFLEdBQUcsTUFBTSxJQUFJO0FBQUEsUUFDNUk7QUFDQSxrQkFBVSxNQUFNLFNBQVM7QUFBQSxNQUM3QixPQUFPO0FBQ0gsY0FBTSxTQUFTLE1BQU0sdUJBQXVCLG1CQUFtQixNQUFNLEtBQUssTUFBTTtBQUNoRixrQkFBVSxNQUFNLFNBQVMsaUJBQWlCLFFBQVEsS0FBSyxJQUFJO0FBQUEsTUFDL0Q7QUFDQSxZQUFNLFNBQVMsWUFBWSxNQUFNO0FBQ2pDLFVBQUksV0FBVyxZQUFZO0FBQ3ZCLGdCQUFRLGlCQUFpQjtBQUN6QixnQkFBUSxpQkFBaUIsU0FBUyxtQkFBbUIsTUFBTSxJQUFJO0FBQUEsTUFDbkUsV0FBVyxRQUFRO0FBQ2YsZ0JBQVEsUUFBUSxLQUFLLEVBQUUsU0FBUyxtQkFBbUIsTUFBTSxHQUFHLFNBQVMsbUJBQW1CLE1BQU0sR0FBRyxRQUFRLENBQUM7QUFBQSxNQUM5RyxPQUFPO0FBQ0gsZ0JBQVEsT0FBTyxLQUFLLEVBQUUsTUFBTSxtQkFBbUIsTUFBTSxHQUFHLFFBQVEsQ0FBQztBQUFBLE1BQ3JFO0FBRUEsVUFBSSxRQUFRO0FBQ1IsdUJBQWUsS0FBSztBQUFBLFVBQUUsS0FBSztBQUFBLFVBQVEsTUFBTTtBQUFBO0FBQUEsUUFBZ0IsR0FBRztBQUFBLFVBQUUsS0FBSztBQUFBLFVBQVEsTUFBTTtBQUFBO0FBQUEsUUFBZ0IsQ0FBQztBQUNsRyxtQkFBVyxPQUFPLE1BQU07QUFDeEIsZUFBTyxpQkFBaUIseUJBQXlCLEVBQUUsY0FBYyxFQUFFLEtBQUssT0FBTyxFQUFFLENBQUM7QUFBQSxNQUN0RixPQUFPO0FBQ0gsdUJBQWUsS0FBSztBQUFBLFVBQUUsS0FBSztBQUFBLFVBQVEsTUFBTTtBQUFBO0FBQUEsUUFBZ0IsQ0FBQztBQUFBLE1BQzlEO0FBQUEsSUFDSjtBQUVBLFVBQU8sV0FBbUIscUJBQXFCLE9BQU87QUFHdEQsUUFBSSxTQUFTLGVBQWUsUUFBUTtBQUNoQyxZQUFNLGlCQUFpQixtQ0FBbUMsRUFBRSxTQUFTLGVBQWUsQ0FBQztBQUFBLElBQ3pGO0FBQUEsRUFDSjtBQUVBLFdBQVMsZ0JBQWdCO0FBQ3JCLFdBQU87QUFBQSxNQUNILE1BQU07QUFBQSxRQUNGLFFBQVE7QUFBQSxVQUNKLE9BQVksRUFBRSxTQUFTLEtBQUs7QUFBQSxVQUM1QixRQUFZLEVBQUUsU0FBUyxNQUFNO0FBQUEsVUFDN0IsWUFBWSxDQUFDLHNCQUFzQixtQkFBbUIsMkJBQTJCO0FBQUEsUUFDckY7QUFBQSxRQUNBLFdBQVcsRUFBRSxTQUFTLEtBQUs7QUFBQSxRQUMzQixZQUFZO0FBQUEsVUFDUixXQUFzQjtBQUFBLFVBQ3RCLHNCQUFzQjtBQUFBLFVBQ3RCLGVBQWU7QUFBQSxZQUNYO0FBQUEsWUFBYTtBQUFBLFlBQVM7QUFBQSxZQUN0QjtBQUFBLFlBQ0E7QUFBQSxZQUNBO0FBQUEsVUFDSjtBQUFBLFVBQ0EsYUFBYSxDQUFDLFFBQVEsU0FBUyxPQUFPLE9BQU8sRUFBRTtBQUFBLFFBQ25EO0FBQUEsUUFDQSxlQUFnQixFQUFFLFNBQVMsS0FBSztBQUFBLFFBQ2hDLFFBQWdCLEVBQUUsU0FBUyxLQUFLO0FBQUEsUUFDaEMsYUFBZ0IsRUFBRSxpQkFBaUIsTUFBTTtBQUFBLFFBQ3pDLFlBQWdCLEVBQUUsZ0JBQWdCLEVBQUUsU0FBUyxNQUFNLEVBQUU7QUFBQSxRQUNyRCxvQkFBd0IsRUFBRSxTQUFTLEtBQUs7QUFBQSxRQUN4Qyx5QkFBeUIsRUFBRSxTQUFTLEtBQUs7QUFBQSxNQUM3QztBQUFBLElBQ0o7QUFBQSxFQUNKOyIsCiAgIm5hbWVzIjogWyJFcnJvckNvZGVzIiwgIk1lc3NhZ2UiLCAiVG91Y2giLCAiRGlzcG9zYWJsZSIsICJSQUwiLCAiRXZlbnQiLCAiSXMiLCAiQ2FuY2VsbGF0aW9uVG9rZW4iLCAiQ2FuY2VsbGF0aW9uU3RhdGUiLCAiX2Nvbm4iLCAiSXMiLCAiTWVzc2FnZVJlYWRlciIsICJBYnN0cmFjdE1lc3NhZ2VSZWFkZXIiLCAiUmVzb2x2ZWRNZXNzYWdlUmVhZGVyT3B0aW9ucyIsICJJcyIsICJNZXNzYWdlV3JpdGVyIiwgIkFic3RyYWN0TWVzc2FnZVdyaXRlciIsICJSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zIiwgInJlc3VsdCIsICJJcyIsICJDYW5jZWxOb3RpZmljYXRpb24iLCAiUHJvZ3Jlc3NUb2tlbiIsICJQcm9ncmVzc05vdGlmaWNhdGlvbiIsICJTdGFyUmVxdWVzdEhhbmRsZXIiLCAiVHJhY2UiLCAiVHJhY2VWYWx1ZXMiLCAiVHJhY2VGb3JtYXQiLCAiU2V0VHJhY2VOb3RpZmljYXRpb24iLCAiTG9nVHJhY2VOb3RpZmljYXRpb24iLCAiQ29ubmVjdGlvbkVycm9ycyIsICJDb25uZWN0aW9uU3RyYXRlZ3kiLCAiSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5IiwgIlJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5IiwgIkNhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kiLCAiQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kiLCAiQ2FuY2VsbGF0aW9uU3RyYXRlZ3kiLCAiTWVzc2FnZVN0cmF0ZWd5IiwgIkNvbm5lY3Rpb25PcHRpb25zIiwgIkNvbm5lY3Rpb25TdGF0ZSIsICJjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiIsICJzdGFydFRpbWUiLCAiUklMIiwgIm0iLCAiZXhwb3J0cyIsICJjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiIsICJpbXBvcnRfdnNjb2RlX2pzb25ycGMiLCAiaW1wb3J0X3ZzY29kZV9qc29ucnBjIiwgImltcG9ydF92c2NvZGVfanNvbnJwYyIsICJpbXBvcnRfdnNjb2RlX2pzb25ycGMiLCAiRG9jdW1lbnRVcmkiLCAiVVJJIiwgImludGVnZXIiLCAidWludGVnZXIiLCAiUG9zaXRpb24iLCAiUmFuZ2UiLCAiTG9jYXRpb24iLCAiTG9jYXRpb25MaW5rIiwgIkNvbG9yIiwgIkNvbG9ySW5mb3JtYXRpb24iLCAiQ29sb3JQcmVzZW50YXRpb24iLCAiRm9sZGluZ1JhbmdlS2luZCIsICJGb2xkaW5nUmFuZ2UiLCAiRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbiIsICJsb2NhdGlvbiIsICJEaWFnbm9zdGljU2V2ZXJpdHkiLCAiRGlhZ25vc3RpY1RhZyIsICJDb2RlRGVzY3JpcHRpb24iLCAiRGlhZ25vc3RpYyIsICJDb21tYW5kIiwgIlRleHRFZGl0IiwgIkNoYW5nZUFubm90YXRpb24iLCAiQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIiLCAiQW5ub3RhdGVkVGV4dEVkaXQiLCAiVGV4dERvY3VtZW50RWRpdCIsICJDcmVhdGVGaWxlIiwgIlJlbmFtZUZpbGUiLCAiRGVsZXRlRmlsZSIsICJXb3Jrc3BhY2VFZGl0IiwgIlRleHREb2N1bWVudElkZW50aWZpZXIiLCAiVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciIsICJPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIiLCAiVGV4dERvY3VtZW50SXRlbSIsICJNYXJrdXBLaW5kIiwgIk1hcmt1cENvbnRlbnQiLCAiQ29tcGxldGlvbkl0ZW1LaW5kIiwgIkluc2VydFRleHRGb3JtYXQiLCAiQ29tcGxldGlvbkl0ZW1UYWciLCAiSW5zZXJ0UmVwbGFjZUVkaXQiLCAiUmFuZ2UiLCAiSW5zZXJ0VGV4dE1vZGUiLCAiQ29tcGxldGlvbkl0ZW1MYWJlbERldGFpbHMiLCAiQ29tcGxldGlvbkl0ZW0iLCAiQ29tcGxldGlvbkxpc3QiLCAiTWFya2VkU3RyaW5nIiwgIkhvdmVyIiwgIlBhcmFtZXRlckluZm9ybWF0aW9uIiwgIlNpZ25hdHVyZUluZm9ybWF0aW9uIiwgIkRvY3VtZW50SGlnaGxpZ2h0S2luZCIsICJEb2N1bWVudEhpZ2hsaWdodCIsICJTeW1ib2xLaW5kIiwgIlN5bWJvbFRhZyIsICJTeW1ib2xJbmZvcm1hdGlvbiIsICJXb3Jrc3BhY2VTeW1ib2wiLCAiRG9jdW1lbnRTeW1ib2wiLCAiQ29kZUFjdGlvbktpbmQiLCAiQ29kZUFjdGlvblRyaWdnZXJLaW5kIiwgIkNvZGVBY3Rpb25Db250ZXh0IiwgIkNvZGVBY3Rpb24iLCAiQ29kZUxlbnMiLCAiRm9ybWF0dGluZ09wdGlvbnMiLCAiRG9jdW1lbnRMaW5rIiwgIlNlbGVjdGlvblJhbmdlIiwgIlNlbWFudGljVG9rZW5UeXBlcyIsICJTZW1hbnRpY1Rva2VuTW9kaWZpZXJzIiwgIlNlbWFudGljVG9rZW5zIiwgIklubGluZVZhbHVlVGV4dCIsICJJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwIiwgIklubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uIiwgIklubGluZVZhbHVlQ29udGV4dCIsICJJbmxheUhpbnRLaW5kIiwgIklubGF5SGludExhYmVsUGFydCIsICJJbmxheUhpbnQiLCAiUG9zaXRpb24iLCAiU3RyaW5nVmFsdWUiLCAiSW5saW5lQ29tcGxldGlvbkl0ZW0iLCAiSW5saW5lQ29tcGxldGlvbkxpc3QiLCAiSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kIiwgIlNlbGVjdGVkQ29tcGxldGlvbkluZm8iLCAiSW5saW5lQ29tcGxldGlvbkNvbnRleHQiLCAiV29ya3NwYWNlRm9sZGVyIiwgIlRleHREb2N1bWVudCIsICJQb3NpdGlvbiIsICJJcyIsICJ1bmRlZmluZWQiLCAiaW50ZWdlciIsICJ1aW50ZWdlciIsICJtIl0KfQo= +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvY29tbW9uL2lzLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlcy5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vbGlua2VkTWFwLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9kaXNwb3NhYmxlLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9yYWwuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvY29tbW9uL2V2ZW50cy5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vY2FuY2VsbGF0aW9uLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9zaGFyZWRBcnJheUNhbmNlbGxhdGlvbi5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vc2VtYXBob3JlLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlUmVhZGVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlV3JpdGVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlQnVmZmVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9jb25uZWN0aW9uLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9hcGkuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvYnJvd3Nlci9yaWwuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvYnJvd3Nlci9tYWluLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvYnJvd3Nlci5qcyIsICJsc3AvamF2YS1sc3AtY2xpZW50LnRzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLXdzLWpzb25ycGMvc3JjL2Rpc3Bvc2FibGUudHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvc29ja2V0L3NvY2tldC50cyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS13cy1qc29ucnBjL3NyYy9zb2NrZXQvcmVhZGVyLnRzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLXdzLWpzb25ycGMvc3JjL3NvY2tldC93cml0ZXIudHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvc29ja2V0L2Nvbm5lY3Rpb24udHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvY29ubmVjdGlvbi50cyIsICJsc3AvbW9uYWNvLXNoaW0udHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtbGFuZ3VhZ2VzZXJ2ZXItdHlwZXMvbGliL2VzbS9tYWluLmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuc3RyaW5nQXJyYXkgPSBleHBvcnRzLmFycmF5ID0gZXhwb3J0cy5mdW5jID0gZXhwb3J0cy5lcnJvciA9IGV4cG9ydHMubnVtYmVyID0gZXhwb3J0cy5zdHJpbmcgPSBleHBvcnRzLmJvb2xlYW4gPSB2b2lkIDA7XG5mdW5jdGlvbiBib29sZWFuKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZTtcbn1cbmV4cG9ydHMuYm9vbGVhbiA9IGJvb2xlYW47XG5mdW5jdGlvbiBzdHJpbmcodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZztcbn1cbmV4cG9ydHMuc3RyaW5nID0gc3RyaW5nO1xuZnVuY3Rpb24gbnVtYmVyKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdmFsdWUgaW5zdGFuY2VvZiBOdW1iZXI7XG59XG5leHBvcnRzLm51bWJlciA9IG51bWJlcjtcbmZ1bmN0aW9uIGVycm9yKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgRXJyb3I7XG59XG5leHBvcnRzLmVycm9yID0gZXJyb3I7XG5mdW5jdGlvbiBmdW5jKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cbmV4cG9ydHMuZnVuYyA9IGZ1bmM7XG5mdW5jdGlvbiBhcnJheSh2YWx1ZSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cbmV4cG9ydHMuYXJyYXkgPSBhcnJheTtcbmZ1bmN0aW9uIHN0cmluZ0FycmF5KHZhbHVlKSB7XG4gICAgcmV0dXJuIGFycmF5KHZhbHVlKSAmJiB2YWx1ZS5ldmVyeShlbGVtID0+IHN0cmluZyhlbGVtKSk7XG59XG5leHBvcnRzLnN0cmluZ0FycmF5ID0gc3RyaW5nQXJyYXk7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLk1lc3NhZ2UgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU5ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlOCA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTcgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU2ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNSA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTQgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUzID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMiA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTEgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUwID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTkgPSBleHBvcnRzLlJlcXVlc3RUeXBlOCA9IGV4cG9ydHMuUmVxdWVzdFR5cGU3ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTYgPSBleHBvcnRzLlJlcXVlc3RUeXBlNSA9IGV4cG9ydHMuUmVxdWVzdFR5cGU0ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTMgPSBleHBvcnRzLlJlcXVlc3RUeXBlMiA9IGV4cG9ydHMuUmVxdWVzdFR5cGUxID0gZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IGV4cG9ydHMuUmVxdWVzdFR5cGUwID0gZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUgPSBleHBvcnRzLlBhcmFtZXRlclN0cnVjdHVyZXMgPSBleHBvcnRzLlJlc3BvbnNlRXJyb3IgPSBleHBvcnRzLkVycm9yQ29kZXMgPSB2b2lkIDA7XG5jb25zdCBpcyA9IHJlcXVpcmUoXCIuL2lzXCIpO1xuLyoqXG4gKiBQcmVkZWZpbmVkIGVycm9yIGNvZGVzLlxuICovXG52YXIgRXJyb3JDb2RlcztcbihmdW5jdGlvbiAoRXJyb3JDb2Rlcykge1xuICAgIC8vIERlZmluZWQgYnkgSlNPTiBSUENcbiAgICBFcnJvckNvZGVzLlBhcnNlRXJyb3IgPSAtMzI3MDA7XG4gICAgRXJyb3JDb2Rlcy5JbnZhbGlkUmVxdWVzdCA9IC0zMjYwMDtcbiAgICBFcnJvckNvZGVzLk1ldGhvZE5vdEZvdW5kID0gLTMyNjAxO1xuICAgIEVycm9yQ29kZXMuSW52YWxpZFBhcmFtcyA9IC0zMjYwMjtcbiAgICBFcnJvckNvZGVzLkludGVybmFsRXJyb3IgPSAtMzI2MDM7XG4gICAgLyoqXG4gICAgICogVGhpcyBpcyB0aGUgc3RhcnQgcmFuZ2Ugb2YgSlNPTiBSUEMgcmVzZXJ2ZWQgZXJyb3IgY29kZXMuXG4gICAgICogSXQgZG9lc24ndCBkZW5vdGUgYSByZWFsIGVycm9yIGNvZGUuIE5vIGFwcGxpY2F0aW9uIGVycm9yIGNvZGVzIHNob3VsZFxuICAgICAqIGJlIGRlZmluZWQgYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCByYW5nZS4gRm9yIGJhY2t3YXJkc1xuICAgICAqIGNvbXBhdGliaWxpdHkgdGhlIGBTZXJ2ZXJOb3RJbml0aWFsaXplZGAgYW5kIHRoZSBgVW5rbm93bkVycm9yQ29kZWBcbiAgICAgKiBhcmUgbGVmdCBpbiB0aGUgcmFuZ2UuXG4gICAgICpcbiAgICAgKiBAc2luY2UgMy4xNi4wXG4gICAgKi9cbiAgICBFcnJvckNvZGVzLmpzb25ycGNSZXNlcnZlZEVycm9yUmFuZ2VTdGFydCA9IC0zMjA5OTtcbiAgICAvKiogQGRlcHJlY2F0ZWQgdXNlICBqc29ucnBjUmVzZXJ2ZWRFcnJvclJhbmdlU3RhcnQgKi9cbiAgICBFcnJvckNvZGVzLnNlcnZlckVycm9yU3RhcnQgPSAtMzIwOTk7XG4gICAgLyoqXG4gICAgICogQW4gZXJyb3Igb2NjdXJyZWQgd2hlbiB3cml0ZSBhIG1lc3NhZ2UgdG8gdGhlIHRyYW5zcG9ydCBsYXllci5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLk1lc3NhZ2VXcml0ZUVycm9yID0gLTMyMDk5O1xuICAgIC8qKlxuICAgICAqIEFuIGVycm9yIG9jY3VycmVkIHdoZW4gcmVhZGluZyBhIG1lc3NhZ2UgZnJvbSB0aGUgdHJhbnNwb3J0IGxheWVyLlxuICAgICAqL1xuICAgIEVycm9yQ29kZXMuTWVzc2FnZVJlYWRFcnJvciA9IC0zMjA5ODtcbiAgICAvKipcbiAgICAgKiBUaGUgY29ubmVjdGlvbiBnb3QgZGlzcG9zZWQgb3IgbG9zdCBhbmQgYWxsIHBlbmRpbmcgcmVzcG9uc2VzIGdvdFxuICAgICAqIHJlamVjdGVkLlxuICAgICAqL1xuICAgIEVycm9yQ29kZXMuUGVuZGluZ1Jlc3BvbnNlUmVqZWN0ZWQgPSAtMzIwOTc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gaXMgaW5hY3RpdmUgYW5kIGEgdXNlIG9mIGl0IGZhaWxlZC5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLkNvbm5lY3Rpb25JbmFjdGl2ZSA9IC0zMjA5NjtcbiAgICAvKipcbiAgICAgKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBhIHNlcnZlciByZWNlaXZlZCBhIG5vdGlmaWNhdGlvbiBvclxuICAgICAqIHJlcXVlc3QgYmVmb3JlIHRoZSBzZXJ2ZXIgaGFzIHJlY2VpdmVkIHRoZSBgaW5pdGlhbGl6ZWAgcmVxdWVzdC5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLlNlcnZlck5vdEluaXRpYWxpemVkID0gLTMyMDAyO1xuICAgIEVycm9yQ29kZXMuVW5rbm93bkVycm9yQ29kZSA9IC0zMjAwMTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIHRoZSBlbmQgcmFuZ2Ugb2YgSlNPTiBSUEMgcmVzZXJ2ZWQgZXJyb3IgY29kZXMuXG4gICAgICogSXQgZG9lc24ndCBkZW5vdGUgYSByZWFsIGVycm9yIGNvZGUuXG4gICAgICpcbiAgICAgKiBAc2luY2UgMy4xNi4wXG4gICAgKi9cbiAgICBFcnJvckNvZGVzLmpzb25ycGNSZXNlcnZlZEVycm9yUmFuZ2VFbmQgPSAtMzIwMDA7XG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSAganNvbnJwY1Jlc2VydmVkRXJyb3JSYW5nZUVuZCAqL1xuICAgIEVycm9yQ29kZXMuc2VydmVyRXJyb3JFbmQgPSAtMzIwMDA7XG59KShFcnJvckNvZGVzIHx8IChleHBvcnRzLkVycm9yQ29kZXMgPSBFcnJvckNvZGVzID0ge30pKTtcbi8qKlxuICogQW4gZXJyb3Igb2JqZWN0IHJldHVybiBpbiBhIHJlc3BvbnNlIGluIGNhc2UgYSByZXF1ZXN0XG4gKiBoYXMgZmFpbGVkLlxuICovXG5jbGFzcyBSZXNwb25zZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNvZGUsIG1lc3NhZ2UsIGRhdGEpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuY29kZSA9IGlzLm51bWJlcihjb2RlKSA/IGNvZGUgOiBFcnJvckNvZGVzLlVua25vd25FcnJvckNvZGU7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBSZXNwb25zZUVycm9yLnByb3RvdHlwZSk7XG4gICAgfVxuICAgIHRvSnNvbigpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgY29kZTogdGhpcy5jb2RlLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLmRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmRhdGEgPSB0aGlzLmRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5leHBvcnRzLlJlc3BvbnNlRXJyb3IgPSBSZXNwb25zZUVycm9yO1xuY2xhc3MgUGFyYW1ldGVyU3RydWN0dXJlcyB7XG4gICAgY29uc3RydWN0b3Ioa2luZCkge1xuICAgICAgICB0aGlzLmtpbmQgPSBraW5kO1xuICAgIH1cbiAgICBzdGF0aWMgaXModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8gfHwgdmFsdWUgPT09IFBhcmFtZXRlclN0cnVjdHVyZXMuYnlOYW1lIHx8IHZhbHVlID09PSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5UG9zaXRpb247XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5raW5kO1xuICAgIH1cbn1cbmV4cG9ydHMuUGFyYW1ldGVyU3RydWN0dXJlcyA9IFBhcmFtZXRlclN0cnVjdHVyZXM7XG4vKipcbiAqIFRoZSBwYXJhbWV0ZXIgc3RydWN0dXJlIGlzIGF1dG9tYXRpY2FsbHkgaW5mZXJyZWQgb24gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzXG4gKiBhbmQgdGhlIHBhcmFtZXRlciB0eXBlIGluIGNhc2Ugb2YgYSBzaW5nbGUgcGFyYW0uXG4gKi9cblBhcmFtZXRlclN0cnVjdHVyZXMuYXV0byA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdhdXRvJyk7XG4vKipcbiAqIEZvcmNlcyBgYnlQb3NpdGlvbmAgcGFyYW1ldGVyIHN0cnVjdHVyZS4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGhhdmUgYSBzaW5nbGVcbiAqIHBhcmFtZXRlciB3aGljaCBoYXMgYSBsaXRlcmFsIHR5cGUuXG4gKi9cblBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbiA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdieVBvc2l0aW9uJyk7XG4vKipcbiAqIEZvcmNlcyBgYnlOYW1lYCBwYXJhbWV0ZXIgc3RydWN0dXJlLiBUaGlzIGlzIG9ubHkgdXNlZnVsIHdoZW4gaGF2aW5nIGEgc2luZ2xlXG4gKiBwYXJhbWV0ZXIuIFRoZSBsaWJyYXJ5IHdpbGwgcmVwb3J0IGVycm9ycyBpZiB1c2VkIHdpdGggYSBkaWZmZXJlbnQgbnVtYmVyIG9mXG4gKiBwYXJhbWV0ZXJzLlxuICovXG5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdieU5hbWUnKTtcbi8qKlxuICogQW4gYWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgYSBNZXNzYWdlVHlwZS5cbiAqL1xuY2xhc3MgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIG51bWJlck9mUGFyYW1zKSB7XG4gICAgICAgIHRoaXMubWV0aG9kID0gbWV0aG9kO1xuICAgICAgICB0aGlzLm51bWJlck9mUGFyYW1zID0gbnVtYmVyT2ZQYXJhbXM7XG4gICAgfVxuICAgIGdldCBwYXJhbWV0ZXJTdHJ1Y3R1cmVzKCkge1xuICAgICAgICByZXR1cm4gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvO1xuICAgIH1cbn1cbmV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlID0gQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlO1xuLyoqXG4gKiBDbGFzc2VzIHRvIHR5cGUgcmVxdWVzdCByZXNwb25zZSBwYWlyc1xuICovXG5jbGFzcyBSZXF1ZXN0VHlwZTAgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDApO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGUwID0gUmVxdWVzdFR5cGUwO1xuY2xhc3MgUmVxdWVzdFR5cGUgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCwgX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8pIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAxKTtcbiAgICAgICAgdGhpcy5fcGFyYW1ldGVyU3RydWN0dXJlcyA9IF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbiAgICBnZXQgcGFyYW1ldGVyU3RydWN0dXJlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXM7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IFJlcXVlc3RUeXBlO1xuY2xhc3MgUmVxdWVzdFR5cGUxIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMSk7XG4gICAgICAgIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBfcGFyYW1ldGVyU3RydWN0dXJlcztcbiAgICB9XG4gICAgZ2V0IHBhcmFtZXRlclN0cnVjdHVyZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGUxID0gUmVxdWVzdFR5cGUxO1xuY2xhc3MgUmVxdWVzdFR5cGUyIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAyKTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlMiA9IFJlcXVlc3RUeXBlMjtcbmNsYXNzIFJlcXVlc3RUeXBlMyBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMyk7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTMgPSBSZXF1ZXN0VHlwZTM7XG5jbGFzcyBSZXF1ZXN0VHlwZTQgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDQpO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGU0ID0gUmVxdWVzdFR5cGU0O1xuY2xhc3MgUmVxdWVzdFR5cGU1IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA1KTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlNSA9IFJlcXVlc3RUeXBlNTtcbmNsYXNzIFJlcXVlc3RUeXBlNiBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNik7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTYgPSBSZXF1ZXN0VHlwZTY7XG5jbGFzcyBSZXF1ZXN0VHlwZTcgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDcpO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGU3ID0gUmVxdWVzdFR5cGU3O1xuY2xhc3MgUmVxdWVzdFR5cGU4IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA4KTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlOCA9IFJlcXVlc3RUeXBlODtcbmNsYXNzIFJlcXVlc3RUeXBlOSBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgOSk7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTkgPSBSZXF1ZXN0VHlwZTk7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMSk7XG4gICAgICAgIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBfcGFyYW1ldGVyU3RydWN0dXJlcztcbiAgICB9XG4gICAgZ2V0IHBhcmFtZXRlclN0cnVjdHVyZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZSA9IE5vdGlmaWNhdGlvblR5cGU7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlMCBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMCk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMCA9IE5vdGlmaWNhdGlvblR5cGUwO1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTEgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCwgX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8pIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAxKTtcbiAgICAgICAgdGhpcy5fcGFyYW1ldGVyU3RydWN0dXJlcyA9IF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbiAgICBnZXQgcGFyYW1ldGVyU3RydWN0dXJlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXM7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMSA9IE5vdGlmaWNhdGlvblR5cGUxO1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDIpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTIgPSBOb3RpZmljYXRpb25UeXBlMjtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGUzIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAzKTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGUzID0gTm90aWZpY2F0aW9uVHlwZTM7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlNCBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNCk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNCA9IE5vdGlmaWNhdGlvblR5cGU0O1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTUgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDUpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTUgPSBOb3RpZmljYXRpb25UeXBlNTtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGU2IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA2KTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGU2ID0gTm90aWZpY2F0aW9uVHlwZTY7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlNyBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNyk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNyA9IE5vdGlmaWNhdGlvblR5cGU3O1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTggZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDgpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTggPSBOb3RpZmljYXRpb25UeXBlODtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGU5IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA5KTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGU5ID0gTm90aWZpY2F0aW9uVHlwZTk7XG52YXIgTWVzc2FnZTtcbihmdW5jdGlvbiAoTWVzc2FnZSkge1xuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoZSBnaXZlbiBtZXNzYWdlIGlzIGEgcmVxdWVzdCBtZXNzYWdlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gbWVzc2FnZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBpcy5zdHJpbmcoY2FuZGlkYXRlLm1ldGhvZCkgJiYgKGlzLnN0cmluZyhjYW5kaWRhdGUuaWQpIHx8IGlzLm51bWJlcihjYW5kaWRhdGUuaWQpKTtcbiAgICB9XG4gICAgTWVzc2FnZS5pc1JlcXVlc3QgPSBpc1JlcXVlc3Q7XG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhlIGdpdmVuIG1lc3NhZ2UgaXMgYSBub3RpZmljYXRpb24gbWVzc2FnZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTm90aWZpY2F0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gbWVzc2FnZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBpcy5zdHJpbmcoY2FuZGlkYXRlLm1ldGhvZCkgJiYgbWVzc2FnZS5pZCA9PT0gdm9pZCAwO1xuICAgIH1cbiAgICBNZXNzYWdlLmlzTm90aWZpY2F0aW9uID0gaXNOb3RpZmljYXRpb247XG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhlIGdpdmVuIG1lc3NhZ2UgaXMgYSByZXNwb25zZSBtZXNzYWdlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNSZXNwb25zZShtZXNzYWdlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IG1lc3NhZ2U7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgKGNhbmRpZGF0ZS5yZXN1bHQgIT09IHZvaWQgMCB8fCAhIWNhbmRpZGF0ZS5lcnJvcikgJiYgKGlzLnN0cmluZyhjYW5kaWRhdGUuaWQpIHx8IGlzLm51bWJlcihjYW5kaWRhdGUuaWQpIHx8IGNhbmRpZGF0ZS5pZCA9PT0gbnVsbCk7XG4gICAgfVxuICAgIE1lc3NhZ2UuaXNSZXNwb25zZSA9IGlzUmVzcG9uc2U7XG59KShNZXNzYWdlIHx8IChleHBvcnRzLk1lc3NhZ2UgPSBNZXNzYWdlID0ge30pKTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xudmFyIF9hO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5MUlVDYWNoZSA9IGV4cG9ydHMuTGlua2VkTWFwID0gZXhwb3J0cy5Ub3VjaCA9IHZvaWQgMDtcbnZhciBUb3VjaDtcbihmdW5jdGlvbiAoVG91Y2gpIHtcbiAgICBUb3VjaC5Ob25lID0gMDtcbiAgICBUb3VjaC5GaXJzdCA9IDE7XG4gICAgVG91Y2guQXNPbGQgPSBUb3VjaC5GaXJzdDtcbiAgICBUb3VjaC5MYXN0ID0gMjtcbiAgICBUb3VjaC5Bc05ldyA9IFRvdWNoLkxhc3Q7XG59KShUb3VjaCB8fCAoZXhwb3J0cy5Ub3VjaCA9IFRvdWNoID0ge30pKTtcbmNsYXNzIExpbmtlZE1hcCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXNbX2FdID0gJ0xpbmtlZE1hcCc7XG4gICAgICAgIHRoaXMuX21hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5faGVhZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fdGFpbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IDA7XG4gICAgICAgIHRoaXMuX3N0YXRlID0gMDtcbiAgICB9XG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuX21hcC5jbGVhcigpO1xuICAgICAgICB0aGlzLl9oZWFkID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl90YWlsID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9zaXplID0gMDtcbiAgICAgICAgdGhpcy5fc3RhdGUrKztcbiAgICB9XG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLl9oZWFkICYmICF0aGlzLl90YWlsO1xuICAgIH1cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpemU7XG4gICAgfVxuICAgIGdldCBmaXJzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlYWQ/LnZhbHVlO1xuICAgIH1cbiAgICBnZXQgbGFzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhaWw/LnZhbHVlO1xuICAgIH1cbiAgICBoYXMoa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXAuaGFzKGtleSk7XG4gICAgfVxuICAgIGdldChrZXksIHRvdWNoID0gVG91Y2guTm9uZSkge1xuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5fbWFwLmdldChrZXkpO1xuICAgICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRvdWNoICE9PSBUb3VjaC5Ob25lKSB7XG4gICAgICAgICAgICB0aGlzLnRvdWNoKGl0ZW0sIHRvdWNoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICB9XG4gICAgc2V0KGtleSwgdmFsdWUsIHRvdWNoID0gVG91Y2guTm9uZSkge1xuICAgICAgICBsZXQgaXRlbSA9IHRoaXMuX21hcC5nZXQoa2V5KTtcbiAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgIGl0ZW0udmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIGlmICh0b3VjaCAhPT0gVG91Y2guTm9uZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudG91Y2goaXRlbSwgdG91Y2gpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaXRlbSA9IHsga2V5LCB2YWx1ZSwgbmV4dDogdW5kZWZpbmVkLCBwcmV2aW91czogdW5kZWZpbmVkIH07XG4gICAgICAgICAgICBzd2l0Y2ggKHRvdWNoKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBUb3VjaC5Ob25lOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFRvdWNoLkZpcnN0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1GaXJzdChpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBUb3VjaC5MYXN0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX21hcC5zZXQoa2V5LCBpdGVtKTtcbiAgICAgICAgICAgIHRoaXMuX3NpemUrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGVsZXRlKGtleSkge1xuICAgICAgICByZXR1cm4gISF0aGlzLnJlbW92ZShrZXkpO1xuICAgIH1cbiAgICByZW1vdmUoa2V5KSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl9tYXAuZ2V0KGtleSk7XG4gICAgICAgIGlmICghaXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tYXAuZGVsZXRlKGtleSk7XG4gICAgICAgIHRoaXMucmVtb3ZlSXRlbShpdGVtKTtcbiAgICAgICAgdGhpcy5fc2l6ZS0tO1xuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICB9XG4gICAgc2hpZnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5faGVhZCAmJiAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2hlYWQgfHwgIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIHRoaXMuX21hcC5kZWxldGUoaXRlbS5rZXkpO1xuICAgICAgICB0aGlzLnJlbW92ZUl0ZW0oaXRlbSk7XG4gICAgICAgIHRoaXMuX3NpemUtLTtcbiAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7XG4gICAgfVxuICAgIGZvckVhY2goY2FsbGJhY2tmbiwgdGhpc0FyZykge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3N0YXRlO1xuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICAgICAgICBpZiAodGhpc0FyZykge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrZm4uYmluZCh0aGlzQXJnKShjdXJyZW50LnZhbHVlLCBjdXJyZW50LmtleSwgdGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFja2ZuKGN1cnJlbnQudmFsdWUsIGN1cnJlbnQua2V5LCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gc3RhdGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExpbmtlZE1hcCBnb3QgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAga2V5cygpIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9zdGF0ZTtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLl9oZWFkO1xuICAgICAgICBjb25zdCBpdGVyYXRvciA9IHtcbiAgICAgICAgICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fc3RhdGUgIT09IHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTGlua2VkTWFwIGdvdCBtb2RpZmllZCBkdXJpbmcgaXRlcmF0aW9uLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7IHZhbHVlOiBjdXJyZW50LmtleSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICB9XG4gICAgdmFsdWVzKCkge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3N0YXRlO1xuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIGNvbnN0IGl0ZXJhdG9yID0ge1xuICAgICAgICAgICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlcmF0b3I7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBMaW5rZWRNYXAgZ290IG1vZGlmaWVkIGR1cmluZyBpdGVyYXRpb24uYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHsgdmFsdWU6IGN1cnJlbnQudmFsdWUsIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gaXRlcmF0b3I7XG4gICAgfVxuICAgIGVudHJpZXMoKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5fc3RhdGU7XG4gICAgICAgIGxldCBjdXJyZW50ID0gdGhpcy5faGVhZDtcbiAgICAgICAgY29uc3QgaXRlcmF0b3IgPSB7XG4gICAgICAgICAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3N0YXRlICE9PSBzdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExpbmtlZE1hcCBnb3QgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geyB2YWx1ZTogW2N1cnJlbnQua2V5LCBjdXJyZW50LnZhbHVlXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICB9XG4gICAgWyhfYSA9IFN5bWJvbC50b1N0cmluZ1RhZywgU3ltYm9sLml0ZXJhdG9yKV0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMoKTtcbiAgICB9XG4gICAgdHJpbU9sZChuZXdTaXplKSB7XG4gICAgICAgIGlmIChuZXdTaXplID49IHRoaXMuc2l6ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuZXdTaXplID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLl9oZWFkO1xuICAgICAgICBsZXQgY3VycmVudFNpemUgPSB0aGlzLnNpemU7XG4gICAgICAgIHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnRTaXplID4gbmV3U2l6ZSkge1xuICAgICAgICAgICAgdGhpcy5fbWFwLmRlbGV0ZShjdXJyZW50LmtleSk7XG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0O1xuICAgICAgICAgICAgY3VycmVudFNpemUtLTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9oZWFkID0gY3VycmVudDtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IGN1cnJlbnRTaXplO1xuICAgICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICAgICAgY3VycmVudC5wcmV2aW91cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgIH1cbiAgICBhZGRJdGVtRmlyc3QoaXRlbSkge1xuICAgICAgICAvLyBGaXJzdCB0aW1lIEluc2VydFxuICAgICAgICBpZiAoIXRoaXMuX2hlYWQgJiYgIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRoaXMuX3RhaWwgPSBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCF0aGlzLl9oZWFkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbGlzdCcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdGhpcy5faGVhZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQucHJldmlvdXMgPSBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2hlYWQgPSBpdGVtO1xuICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgIH1cbiAgICBhZGRJdGVtTGFzdChpdGVtKSB7XG4gICAgICAgIC8vIEZpcnN0IHRpbWUgSW5zZXJ0XG4gICAgICAgIGlmICghdGhpcy5faGVhZCAmJiAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgdGhpcy5faGVhZCA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpdGVtLnByZXZpb3VzID0gdGhpcy5fdGFpbDtcbiAgICAgICAgICAgIHRoaXMuX3RhaWwubmV4dCA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW07XG4gICAgICAgIHRoaXMuX3N0YXRlKys7XG4gICAgfVxuICAgIHJlbW92ZUl0ZW0oaXRlbSkge1xuICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCAmJiBpdGVtID09PSB0aGlzLl90YWlsKSB7XG4gICAgICAgICAgICB0aGlzLl9oZWFkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpdGVtID09PSB0aGlzLl9oZWFkKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGNhbiBvbmx5IGhhcHBlbmVkIGlmIHNpemUgPT09IDEgd2hpY2ggaXMgaGFuZGxlXG4gICAgICAgICAgICAvLyBieSB0aGUgY2FzZSBhYm92ZS5cbiAgICAgICAgICAgIGlmICghaXRlbS5uZXh0KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxpc3QnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGl0ZW0ubmV4dC5wcmV2aW91cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQgPSBpdGVtLm5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXRlbSA9PT0gdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgLy8gVGhpcyBjYW4gb25seSBoYXBwZW5lZCBpZiBzaXplID09PSAxIHdoaWNoIGlzIGhhbmRsZVxuICAgICAgICAgICAgLy8gYnkgdGhlIGNhc2UgYWJvdmUuXG4gICAgICAgICAgICBpZiAoIWl0ZW0ucHJldmlvdXMpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbGlzdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbS5wcmV2aW91cy5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gaXRlbS5uZXh0O1xuICAgICAgICAgICAgY29uc3QgcHJldmlvdXMgPSBpdGVtLnByZXZpb3VzO1xuICAgICAgICAgICAgaWYgKCFuZXh0IHx8ICFwcmV2aW91cykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXh0LnByZXZpb3VzID0gcHJldmlvdXM7XG4gICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gbmV4dDtcbiAgICAgICAgfVxuICAgICAgICBpdGVtLm5leHQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGl0ZW0ucHJldmlvdXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX3N0YXRlKys7XG4gICAgfVxuICAgIHRvdWNoKGl0ZW0sIHRvdWNoKSB7XG4gICAgICAgIGlmICghdGhpcy5faGVhZCB8fCAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxpc3QnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHRvdWNoICE9PSBUb3VjaC5GaXJzdCAmJiB0b3VjaCAhPT0gVG91Y2guTGFzdCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG91Y2ggPT09IFRvdWNoLkZpcnN0KSB7XG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBpdGVtLm5leHQ7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgICAgICAvLyBVbmxpbmsgdGhlIGl0ZW1cbiAgICAgICAgICAgIGlmIChpdGVtID09PSB0aGlzLl90YWlsKSB7XG4gICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgbXVzdCBiZSBkZWZpbmVkIHNpbmNlIGl0ZW0gd2FzIG5vdCBoZWFkIGJ1dCBpcyB0YWlsXG4gICAgICAgICAgICAgICAgLy8gU28gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbiBpdGVtIGluIHRoZSBtYXBcbiAgICAgICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuX3RhaWwgPSBwcmV2aW91cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEJvdGggbmV4dCBhbmQgcHJldmlvdXMgYXJlIG5vdCB1bmRlZmluZWQgc2luY2UgaXRlbSB3YXMgbmVpdGhlciBoZWFkIG5vciB0YWlsLlxuICAgICAgICAgICAgICAgIG5leHQucHJldmlvdXMgPSBwcmV2aW91cztcbiAgICAgICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEluc2VydCB0aGUgbm9kZSBhdCBoZWFkXG4gICAgICAgICAgICBpdGVtLnByZXZpb3VzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdGhpcy5faGVhZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQucHJldmlvdXMgPSBpdGVtO1xuICAgICAgICAgICAgdGhpcy5faGVhZCA9IGl0ZW07XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRvdWNoID09PSBUb3VjaC5MYXN0KSB7XG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBpdGVtLm5leHQ7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgICAgICAvLyBVbmxpbmsgdGhlIGl0ZW0uXG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCkge1xuICAgICAgICAgICAgICAgIC8vIG5leHQgbXVzdCBiZSBkZWZpbmVkIHNpbmNlIGl0ZW0gd2FzIG5vdCB0YWlsIGJ1dCBpcyBoZWFkXG4gICAgICAgICAgICAgICAgLy8gU28gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbiBpdGVtIGluIHRoZSBtYXBcbiAgICAgICAgICAgICAgICBuZXh0LnByZXZpb3VzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuX2hlYWQgPSBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQm90aCBuZXh0IGFuZCBwcmV2aW91cyBhcmUgbm90IHVuZGVmaW5lZCBzaW5jZSBpdGVtIHdhcyBuZWl0aGVyIGhlYWQgbm9yIHRhaWwuXG4gICAgICAgICAgICAgICAgbmV4dC5wcmV2aW91cyA9IHByZXZpb3VzO1xuICAgICAgICAgICAgICAgIHByZXZpb3VzLm5leHQgPSBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaXRlbS5wcmV2aW91cyA9IHRoaXMuX3RhaWw7XG4gICAgICAgICAgICB0aGlzLl90YWlsLm5leHQgPSBpdGVtO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW07XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IFtdO1xuICAgICAgICB0aGlzLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGRhdGEucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGZyb21KU09OKGRhdGEpIHtcbiAgICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBkYXRhKSB7XG4gICAgICAgICAgICB0aGlzLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuTGlua2VkTWFwID0gTGlua2VkTWFwO1xuY2xhc3MgTFJVQ2FjaGUgZXh0ZW5kcyBMaW5rZWRNYXAge1xuICAgIGNvbnN0cnVjdG9yKGxpbWl0LCByYXRpbyA9IDEpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fbGltaXQgPSBsaW1pdDtcbiAgICAgICAgdGhpcy5fcmF0aW8gPSBNYXRoLm1pbihNYXRoLm1heCgwLCByYXRpbyksIDEpO1xuICAgIH1cbiAgICBnZXQgbGltaXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9saW1pdDtcbiAgICB9XG4gICAgc2V0IGxpbWl0KGxpbWl0KSB7XG4gICAgICAgIHRoaXMuX2xpbWl0ID0gbGltaXQ7XG4gICAgICAgIHRoaXMuY2hlY2tUcmltKCk7XG4gICAgfVxuICAgIGdldCByYXRpbygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JhdGlvO1xuICAgIH1cbiAgICBzZXQgcmF0aW8ocmF0aW8pIHtcbiAgICAgICAgdGhpcy5fcmF0aW8gPSBNYXRoLm1pbihNYXRoLm1heCgwLCByYXRpbyksIDEpO1xuICAgICAgICB0aGlzLmNoZWNrVHJpbSgpO1xuICAgIH1cbiAgICBnZXQoa2V5LCB0b3VjaCA9IFRvdWNoLkFzTmV3KSB7XG4gICAgICAgIHJldHVybiBzdXBlci5nZXQoa2V5LCB0b3VjaCk7XG4gICAgfVxuICAgIHBlZWsoa2V5KSB7XG4gICAgICAgIHJldHVybiBzdXBlci5nZXQoa2V5LCBUb3VjaC5Ob25lKTtcbiAgICB9XG4gICAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgc3VwZXIuc2V0KGtleSwgdmFsdWUsIFRvdWNoLkxhc3QpO1xuICAgICAgICB0aGlzLmNoZWNrVHJpbSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgY2hlY2tUcmltKCkge1xuICAgICAgICBpZiAodGhpcy5zaXplID4gdGhpcy5fbGltaXQpIHtcbiAgICAgICAgICAgIHRoaXMudHJpbU9sZChNYXRoLnJvdW5kKHRoaXMuX2xpbWl0ICogdGhpcy5fcmF0aW8pKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuTFJVQ2FjaGUgPSBMUlVDYWNoZTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5EaXNwb3NhYmxlID0gdm9pZCAwO1xudmFyIERpc3Bvc2FibGU7XG4oZnVuY3Rpb24gKERpc3Bvc2FibGUpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUoZnVuYykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGlzcG9zZTogZnVuY1xuICAgICAgICB9O1xuICAgIH1cbiAgICBEaXNwb3NhYmxlLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKERpc3Bvc2FibGUgfHwgKGV4cG9ydHMuRGlzcG9zYWJsZSA9IERpc3Bvc2FibGUgPSB7fSkpO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xubGV0IF9yYWw7XG5mdW5jdGlvbiBSQUwoKSB7XG4gICAgaWYgKF9yYWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHJ1bnRpbWUgYWJzdHJhY3Rpb24gbGF5ZXIgaW5zdGFsbGVkYCk7XG4gICAgfVxuICAgIHJldHVybiBfcmFsO1xufVxuKGZ1bmN0aW9uIChSQUwpIHtcbiAgICBmdW5jdGlvbiBpbnN0YWxsKHJhbCkge1xuICAgICAgICBpZiAocmFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gcnVudGltZSBhYnN0cmFjdGlvbiBsYXllciBwcm92aWRlZGApO1xuICAgICAgICB9XG4gICAgICAgIF9yYWwgPSByYWw7XG4gICAgfVxuICAgIFJBTC5pbnN0YWxsID0gaW5zdGFsbDtcbn0pKFJBTCB8fCAoUkFMID0ge30pKTtcbmV4cG9ydHMuZGVmYXVsdCA9IFJBTDtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuRW1pdHRlciA9IGV4cG9ydHMuRXZlbnQgPSB2b2lkIDA7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbnZhciBFdmVudDtcbihmdW5jdGlvbiAoRXZlbnQpIHtcbiAgICBjb25zdCBfZGlzcG9zYWJsZSA9IHsgZGlzcG9zZSgpIHsgfSB9O1xuICAgIEV2ZW50Lk5vbmUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBfZGlzcG9zYWJsZTsgfTtcbn0pKEV2ZW50IHx8IChleHBvcnRzLkV2ZW50ID0gRXZlbnQgPSB7fSkpO1xuY2xhc3MgQ2FsbGJhY2tMaXN0IHtcbiAgICBhZGQoY2FsbGJhY2ssIGNvbnRleHQgPSBudWxsLCBidWNrZXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fY29udGV4dHMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgICAgIHRoaXMuX2NvbnRleHRzLnB1c2goY29udGV4dCk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGJ1Y2tldCkpIHtcbiAgICAgICAgICAgIGJ1Y2tldC5wdXNoKHsgZGlzcG9zZTogKCkgPT4gdGhpcy5yZW1vdmUoY2FsbGJhY2ssIGNvbnRleHQpIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlbW92ZShjYWxsYmFjaywgY29udGV4dCA9IG51bGwpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZm91bmRDYWxsYmFja1dpdGhEaWZmZXJlbnRDb250ZXh0ID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLl9jYWxsYmFja3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jYWxsYmFja3NbaV0gPT09IGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NvbnRleHRzW2ldID09PSBjb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrICYgY29udGV4dCBtYXRjaCA9PiByZW1vdmUgaXRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29udGV4dHMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZENhbGxiYWNrV2l0aERpZmZlcmVudENvbnRleHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZm91bmRDYWxsYmFja1dpdGhEaWZmZXJlbnRDb250ZXh0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1doZW4gYWRkaW5nIGEgbGlzdGVuZXIgd2l0aCBhIGNvbnRleHQsIHlvdSBzaG91bGQgcmVtb3ZlIGl0IHdpdGggdGhlIHNhbWUgY29udGV4dCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGludm9rZSguLi5hcmdzKSB7XG4gICAgICAgIGlmICghdGhpcy5fY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmV0ID0gW10sIGNhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcy5zbGljZSgwKSwgY29udGV4dHMgPSB0aGlzLl9jb250ZXh0cy5zbGljZSgwKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXQucHVzaChjYWxsYmFja3NbaV0uYXBwbHkoY29udGV4dHNbaV0sIGFyZ3MpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS5jb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICAgIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5fY2FsbGJhY2tzIHx8IHRoaXMuX2NhbGxiYWNrcy5sZW5ndGggPT09IDA7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fY29udGV4dHMgPSB1bmRlZmluZWQ7XG4gICAgfVxufVxuY2xhc3MgRW1pdHRlciB7XG4gICAgY29uc3RydWN0b3IoX29wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IF9vcHRpb25zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGb3IgdGhlIHB1YmxpYyB0byBhbGxvdyB0byBzdWJzY3JpYmVcbiAgICAgKiB0byBldmVudHMgZnJvbSB0aGlzIEVtaXR0ZXJcbiAgICAgKi9cbiAgICBnZXQgZXZlbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fZXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50ID0gKGxpc3RlbmVyLCB0aGlzQXJncywgZGlzcG9zYWJsZXMpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2NhbGxiYWNrcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWxsYmFja3MgPSBuZXcgQ2FsbGJhY2tMaXN0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMub25GaXJzdExpc3RlbmVyQWRkICYmIHRoaXMuX2NhbGxiYWNrcy5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy5vbkZpcnN0TGlzdGVuZXJBZGQodGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5hZGQobGlzdGVuZXIsIHRoaXNBcmdzKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlzcG9zYWJsZSBpcyBkaXNwb3NlZCBhZnRlciBlbWl0dGVyIGlzIGRpc3Bvc2VkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5yZW1vdmUobGlzdGVuZXIsIHRoaXNBcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5kaXNwb3NlID0gRW1pdHRlci5fbm9vcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMub25MYXN0TGlzdGVuZXJSZW1vdmUgJiYgdGhpcy5fY2FsbGJhY2tzLmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29wdGlvbnMub25MYXN0TGlzdGVuZXJSZW1vdmUodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRpc3Bvc2FibGVzKSkge1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlcy5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9ldmVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVG8gYmUga2VwdCBwcml2YXRlIHRvIGZpcmUgYW4gZXZlbnQgdG9cbiAgICAgKiBzdWJzY3JpYmVyc1xuICAgICAqL1xuICAgIGZpcmUoZXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NhbGxiYWNrcykge1xuICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzLmludm9rZS5jYWxsKHRoaXMuX2NhbGxiYWNrcywgZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5kaXNwb3NlKCk7XG4gICAgICAgICAgICB0aGlzLl9jYWxsYmFja3MgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLkVtaXR0ZXIgPSBFbWl0dGVyO1xuRW1pdHRlci5fbm9vcCA9IGZ1bmN0aW9uICgpIHsgfTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uVG9rZW4gPSB2b2lkIDA7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbmNvbnN0IElzID0gcmVxdWlyZShcIi4vaXNcIik7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCIuL2V2ZW50c1wiKTtcbnZhciBDYW5jZWxsYXRpb25Ub2tlbjtcbihmdW5jdGlvbiAoQ2FuY2VsbGF0aW9uVG9rZW4pIHtcbiAgICBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGlzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkOiBmYWxzZSxcbiAgICAgICAgb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6IGV2ZW50c18xLkV2ZW50Lk5vbmVcbiAgICB9KTtcbiAgICBDYW5jZWxsYXRpb25Ub2tlbi5DYW5jZWxsZWQgPSBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6IHRydWUsXG4gICAgICAgIG9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkOiBldmVudHNfMS5FdmVudC5Ob25lXG4gICAgfSk7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgKGNhbmRpZGF0ZSA9PT0gQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZVxuICAgICAgICAgICAgfHwgY2FuZGlkYXRlID09PSBDYW5jZWxsYXRpb25Ub2tlbi5DYW5jZWxsZWRcbiAgICAgICAgICAgIHx8IChJcy5ib29sZWFuKGNhbmRpZGF0ZS5pc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkgJiYgISFjYW5kaWRhdGUub25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQpKTtcbiAgICB9XG4gICAgQ2FuY2VsbGF0aW9uVG9rZW4uaXMgPSBpcztcbn0pKENhbmNlbGxhdGlvblRva2VuIHx8IChleHBvcnRzLkNhbmNlbGxhdGlvblRva2VuID0gQ2FuY2VsbGF0aW9uVG9rZW4gPSB7fSkpO1xuY29uc3Qgc2hvcnRjdXRFdmVudCA9IE9iamVjdC5mcmVlemUoZnVuY3Rpb24gKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgY29uc3QgaGFuZGxlID0gKDAsIHJhbF8xLmRlZmF1bHQpKCkudGltZXIuc2V0VGltZW91dChjYWxsYmFjay5iaW5kKGNvbnRleHQpLCAwKTtcbiAgICByZXR1cm4geyBkaXNwb3NlKCkgeyBoYW5kbGUuZGlzcG9zZSgpOyB9IH07XG59KTtcbmNsYXNzIE11dGFibGVUb2tlbiB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX2lzQ2FuY2VsbGVkID0gZmFsc2U7XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9pc0NhbmNlbGxlZCkge1xuICAgICAgICAgICAgdGhpcy5faXNDYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2VtaXR0ZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmZpcmUodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0NhbmNlbGxlZDtcbiAgICB9XG4gICAgZ2V0IG9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKCkge1xuICAgICAgICBpZiAodGhpcy5faXNDYW5jZWxsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBzaG9ydGN1dEV2ZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5fZW1pdHRlcikge1xuICAgICAgICAgICAgdGhpcy5fZW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2VtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLl9lbWl0dGVyKSB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5jbGFzcyBDYW5jZWxsYXRpb25Ub2tlblNvdXJjZSB7XG4gICAgZ2V0IHRva2VuKCkge1xuICAgICAgICBpZiAoIXRoaXMuX3Rva2VuKSB7XG4gICAgICAgICAgICAvLyBiZSBsYXp5IGFuZCBjcmVhdGUgdGhlIHRva2VuIG9ubHkgd2hlblxuICAgICAgICAgICAgLy8gYWN0dWFsbHkgbmVlZGVkXG4gICAgICAgICAgICB0aGlzLl90b2tlbiA9IG5ldyBNdXRhYmxlVG9rZW4oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fdG9rZW47XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl90b2tlbikge1xuICAgICAgICAgICAgLy8gc2F2ZSBhbiBvYmplY3QgYnkgcmV0dXJuaW5nIHRoZSBkZWZhdWx0XG4gICAgICAgICAgICAvLyBjYW5jZWxsZWQgdG9rZW4gd2hlbiBjYW5jZWxsYXRpb24gaGFwcGVuc1xuICAgICAgICAgICAgLy8gYmVmb3JlIHNvbWVvbmUgYXNrcyBmb3IgdGhlIHRva2VuXG4gICAgICAgICAgICB0aGlzLl90b2tlbiA9IENhbmNlbGxhdGlvblRva2VuLkNhbmNlbGxlZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3Rva2VuLmNhbmNlbCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICghdGhpcy5fdG9rZW4pIHtcbiAgICAgICAgICAgIC8vIGVuc3VyZSB0byBpbml0aWFsaXplIHdpdGggYW4gZW1wdHkgdG9rZW4gaWYgd2UgaGFkIG5vbmVcbiAgICAgICAgICAgIHRoaXMuX3Rva2VuID0gQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLl90b2tlbiBpbnN0YW5jZW9mIE11dGFibGVUb2tlbikge1xuICAgICAgICAgICAgLy8gYWN0dWFsbHkgZGlzcG9zZVxuICAgICAgICAgICAgdGhpcy5fdG9rZW4uZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IENhbmNlbGxhdGlvblRva2VuU291cmNlO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3kgPSB2b2lkIDA7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbnZhciBDYW5jZWxsYXRpb25TdGF0ZTtcbihmdW5jdGlvbiAoQ2FuY2VsbGF0aW9uU3RhdGUpIHtcbiAgICBDYW5jZWxsYXRpb25TdGF0ZS5Db250aW51ZSA9IDA7XG4gICAgQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkID0gMTtcbn0pKENhbmNlbGxhdGlvblN0YXRlIHx8IChDYW5jZWxsYXRpb25TdGF0ZSA9IHt9KSk7XG5jbGFzcyBTaGFyZWRBcnJheVNlbmRlclN0cmF0ZWd5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5idWZmZXJzID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICBlbmFibGVDYW5jZWxsYXRpb24ocmVxdWVzdCkge1xuICAgICAgICBpZiAocmVxdWVzdC5pZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBTaGFyZWRBcnJheUJ1ZmZlcig0KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBJbnQzMkFycmF5KGJ1ZmZlciwgMCwgMSk7XG4gICAgICAgIGRhdGFbMF0gPSBDYW5jZWxsYXRpb25TdGF0ZS5Db250aW51ZTtcbiAgICAgICAgdGhpcy5idWZmZXJzLnNldChyZXF1ZXN0LmlkLCBidWZmZXIpO1xuICAgICAgICByZXF1ZXN0LiRjYW5jZWxsYXRpb25EYXRhID0gYnVmZmVyO1xuICAgIH1cbiAgICBhc3luYyBzZW5kQ2FuY2VsbGF0aW9uKF9jb25uLCBpZCkge1xuICAgICAgICBjb25zdCBidWZmZXIgPSB0aGlzLmJ1ZmZlcnMuZ2V0KGlkKTtcbiAgICAgICAgaWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBJbnQzMkFycmF5KGJ1ZmZlciwgMCwgMSk7XG4gICAgICAgIEF0b21pY3Muc3RvcmUoZGF0YSwgMCwgQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkKTtcbiAgICB9XG4gICAgY2xlYW51cChpZCkge1xuICAgICAgICB0aGlzLmJ1ZmZlcnMuZGVsZXRlKGlkKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy5idWZmZXJzLmNsZWFyKCk7XG4gICAgfVxufVxuZXhwb3J0cy5TaGFyZWRBcnJheVNlbmRlclN0cmF0ZWd5ID0gU2hhcmVkQXJyYXlTZW5kZXJTdHJhdGVneTtcbmNsYXNzIFNoYXJlZEFycmF5QnVmZmVyQ2FuY2VsbGF0aW9uVG9rZW4ge1xuICAgIGNvbnN0cnVjdG9yKGJ1ZmZlcikge1xuICAgICAgICB0aGlzLmRhdGEgPSBuZXcgSW50MzJBcnJheShidWZmZXIsIDAsIDEpO1xuICAgIH1cbiAgICBnZXQgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHJldHVybiBBdG9taWNzLmxvYWQodGhpcy5kYXRhLCAwKSA9PT0gQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkO1xuICAgIH1cbiAgICBnZXQgb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuY2VsbGF0aW9uIG92ZXIgU2hhcmVkQXJyYXlCdWZmZXIgZG9lc24ndCBzdXBwb3J0IGNhbmNlbGxhdGlvbiBldmVudHNgKTtcbiAgICB9XG59XG5jbGFzcyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuU291cmNlIHtcbiAgICBjb25zdHJ1Y3RvcihidWZmZXIpIHtcbiAgICAgICAgdGhpcy50b2tlbiA9IG5ldyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuKGJ1ZmZlcik7XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICB9XG59XG5jbGFzcyBTaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmtpbmQgPSAncmVxdWVzdCc7XG4gICAgfVxuICAgIGNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKHJlcXVlc3QpIHtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gcmVxdWVzdC4kY2FuY2VsbGF0aW9uRGF0YTtcbiAgICAgICAgaWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuU291cmNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuU291cmNlKGJ1ZmZlcik7XG4gICAgfVxufVxuZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBTaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3k7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNlbWFwaG9yZSA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY2xhc3MgU2VtYXBob3JlIHtcbiAgICBjb25zdHJ1Y3RvcihjYXBhY2l0eSA9IDEpIHtcbiAgICAgICAgaWYgKGNhcGFjaXR5IDw9IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FwYWNpdHkgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NhcGFjaXR5ID0gY2FwYWNpdHk7XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IDA7XG4gICAgICAgIHRoaXMuX3dhaXRpbmcgPSBbXTtcbiAgICB9XG4gICAgbG9jayh0aHVuaykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fd2FpdGluZy5wdXNoKHsgdGh1bmssIHJlc29sdmUsIHJlamVjdCB9KTtcbiAgICAgICAgICAgIHRoaXMucnVuTmV4dCgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0IGFjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTtcbiAgICB9XG4gICAgcnVuTmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dhaXRpbmcubGVuZ3RoID09PSAwIHx8IHRoaXMuX2FjdGl2ZSA9PT0gdGhpcy5fY2FwYWNpdHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS50aW1lci5zZXRJbW1lZGlhdGUoKCkgPT4gdGhpcy5kb1J1bk5leHQoKSk7XG4gICAgfVxuICAgIGRvUnVuTmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dhaXRpbmcubGVuZ3RoID09PSAwIHx8IHRoaXMuX2FjdGl2ZSA9PT0gdGhpcy5fY2FwYWNpdHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5fd2FpdGluZy5zaGlmdCgpO1xuICAgICAgICB0aGlzLl9hY3RpdmUrKztcbiAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZSA+IHRoaXMuX2NhcGFjaXR5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRvIG1hbnkgdGh1bmtzIGFjdGl2ZWApO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXh0LnRodW5rKCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC50aGVuKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5yZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5OZXh0KCk7XG4gICAgICAgICAgICAgICAgfSwgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5yZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5OZXh0KCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICBuZXh0LnJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1bk5leHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgIG5leHQucmVqZWN0KGVycik7XG4gICAgICAgICAgICB0aGlzLnJ1bk5leHQoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuU2VtYXBob3JlID0gU2VtYXBob3JlO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXIgPSBleHBvcnRzLkFic3RyYWN0TWVzc2FnZVJlYWRlciA9IGV4cG9ydHMuTWVzc2FnZVJlYWRlciA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IGV2ZW50c18xID0gcmVxdWlyZShcIi4vZXZlbnRzXCIpO1xuY29uc3Qgc2VtYXBob3JlXzEgPSByZXF1aXJlKFwiLi9zZW1hcGhvcmVcIik7XG52YXIgTWVzc2FnZVJlYWRlcjtcbihmdW5jdGlvbiAoTWVzc2FnZVJlYWRlcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5saXN0ZW4pICYmIElzLmZ1bmMoY2FuZGlkYXRlLmRpc3Bvc2UpICYmXG4gICAgICAgICAgICBJcy5mdW5jKGNhbmRpZGF0ZS5vbkVycm9yKSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5vbkNsb3NlKSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5vblBhcnRpYWxNZXNzYWdlKTtcbiAgICB9XG4gICAgTWVzc2FnZVJlYWRlci5pcyA9IGlzO1xufSkoTWVzc2FnZVJlYWRlciB8fCAoZXhwb3J0cy5NZXNzYWdlUmVhZGVyID0gTWVzc2FnZVJlYWRlciA9IHt9KSk7XG5jbGFzcyBBYnN0cmFjdE1lc3NhZ2VSZWFkZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZUVtaXR0ZXIgPSBuZXcgZXZlbnRzXzEuRW1pdHRlcigpO1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlci5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgZ2V0IG9uRXJyb3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVycm9yRW1pdHRlci5ldmVudDtcbiAgICB9XG4gICAgZmlyZUVycm9yKGVycm9yKSB7XG4gICAgICAgIHRoaXMuZXJyb3JFbWl0dGVyLmZpcmUodGhpcy5hc0Vycm9yKGVycm9yKSk7XG4gICAgfVxuICAgIGdldCBvbkNsb3NlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9zZUVtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGZpcmVDbG9zZSgpIHtcbiAgICAgICAgdGhpcy5jbG9zZUVtaXR0ZXIuZmlyZSh1bmRlZmluZWQpO1xuICAgIH1cbiAgICBnZXQgb25QYXJ0aWFsTWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFydGlhbE1lc3NhZ2VFbWl0dGVyLmV2ZW50O1xuICAgIH1cbiAgICBmaXJlUGFydGlhbE1lc3NhZ2UoaW5mbykge1xuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlRW1pdHRlci5maXJlKGluZm8pO1xuICAgIH1cbiAgICBhc0Vycm9yKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKGBSZWFkZXIgcmVjZWl2ZWQgZXJyb3IuIFJlYXNvbjogJHtJcy5zdHJpbmcoZXJyb3IubWVzc2FnZSkgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24nfWApO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VSZWFkZXIgPSBBYnN0cmFjdE1lc3NhZ2VSZWFkZXI7XG52YXIgUmVzb2x2ZWRNZXNzYWdlUmVhZGVyT3B0aW9ucztcbihmdW5jdGlvbiAoUmVzb2x2ZWRNZXNzYWdlUmVhZGVyT3B0aW9ucykge1xuICAgIGZ1bmN0aW9uIGZyb21PcHRpb25zKG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IGNoYXJzZXQ7XG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIGxldCBjb250ZW50RGVjb2RlcjtcbiAgICAgICAgY29uc3QgY29udGVudERlY29kZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICBsZXQgY29udGVudFR5cGVEZWNvZGVyO1xuICAgICAgICBjb25zdCBjb250ZW50VHlwZURlY29kZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY2hhcnNldCA9IG9wdGlvbnMgPz8gJ3V0Zi04JztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNoYXJzZXQgPSBvcHRpb25zLmNoYXJzZXQgPz8gJ3V0Zi04JztcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnREZWNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50RGVjb2RlciA9IG9wdGlvbnMuY29udGVudERlY29kZXI7XG4gICAgICAgICAgICAgICAgY29udGVudERlY29kZXJzLnNldChjb250ZW50RGVjb2Rlci5uYW1lLCBjb250ZW50RGVjb2Rlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5jb250ZW50RGVjb2RlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGVjb2RlciBvZiBvcHRpb25zLmNvbnRlbnREZWNvZGVycykge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50RGVjb2RlcnMuc2V0KGRlY29kZXIubmFtZSwgZGVjb2Rlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuY29udGVudFR5cGVEZWNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXIgPSBvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcjtcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXJzLnNldChjb250ZW50VHlwZURlY29kZXIubmFtZSwgY29udGVudFR5cGVEZWNvZGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGVjb2RlciBvZiBvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGVEZWNvZGVycy5zZXQoZGVjb2Rlci5uYW1lLCBkZWNvZGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnRlbnRUeXBlRGVjb2RlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXIgPSAoMCwgcmFsXzEuZGVmYXVsdCkoKS5hcHBsaWNhdGlvbkpzb24uZGVjb2RlcjtcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlRGVjb2RlcnMuc2V0KGNvbnRlbnRUeXBlRGVjb2Rlci5uYW1lLCBjb250ZW50VHlwZURlY29kZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGNoYXJzZXQsIGNvbnRlbnREZWNvZGVyLCBjb250ZW50RGVjb2RlcnMsIGNvbnRlbnRUeXBlRGVjb2RlciwgY29udGVudFR5cGVEZWNvZGVycyB9O1xuICAgIH1cbiAgICBSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zLmZyb21PcHRpb25zID0gZnJvbU9wdGlvbnM7XG59KShSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zIHx8IChSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zID0ge30pKTtcbmNsYXNzIFJlYWRhYmxlU3RyZWFtTWVzc2FnZVJlYWRlciBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVJlYWRlciB7XG4gICAgY29uc3RydWN0b3IocmVhZGFibGUsIG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZSA9IHJlYWRhYmxlO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zLmZyb21PcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmJ1ZmZlciA9ICgwLCByYWxfMS5kZWZhdWx0KSgpLm1lc3NhZ2VCdWZmZXIuY3JlYXRlKHRoaXMub3B0aW9ucy5jaGFyc2V0KTtcbiAgICAgICAgdGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0ID0gMTAwMDA7XG4gICAgICAgIHRoaXMubmV4dE1lc3NhZ2VMZW5ndGggPSAtMTtcbiAgICAgICAgdGhpcy5tZXNzYWdlVG9rZW4gPSAwO1xuICAgICAgICB0aGlzLnJlYWRTZW1hcGhvcmUgPSBuZXcgc2VtYXBob3JlXzEuU2VtYXBob3JlKDEpO1xuICAgIH1cbiAgICBzZXQgcGFydGlhbE1lc3NhZ2VUaW1lb3V0KHRpbWVvdXQpIHtcbiAgICAgICAgdGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0ID0gdGltZW91dDtcbiAgICB9XG4gICAgZ2V0IHBhcnRpYWxNZXNzYWdlVGltZW91dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dDtcbiAgICB9XG4gICAgbGlzdGVuKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMubmV4dE1lc3NhZ2VMZW5ndGggPSAtMTtcbiAgICAgICAgdGhpcy5tZXNzYWdlVG9rZW4gPSAwO1xuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlVGltZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5yZWFkYWJsZS5vbkRhdGEoKGRhdGEpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25EYXRhKGRhdGEpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZS5vbkVycm9yKChlcnJvcikgPT4gdGhpcy5maXJlRXJyb3IoZXJyb3IpKTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZS5vbkNsb3NlKCgpID0+IHRoaXMuZmlyZUNsb3NlKCkpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBvbkRhdGEoZGF0YSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5idWZmZXIuYXBwZW5kKGRhdGEpO1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IHRoaXMuYnVmZmVyLnRyeVJlYWRIZWFkZXJzKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50TGVuZ3RoID0gaGVhZGVycy5nZXQoJ2NvbnRlbnQtbGVuZ3RoJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY29udGVudExlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IobmV3IEVycm9yKGBIZWFkZXIgbXVzdCBwcm92aWRlIGEgQ29udGVudC1MZW5ndGggcHJvcGVydHkuXFxuJHtKU09OLnN0cmluZ2lmeShPYmplY3QuZnJvbUVudHJpZXMoaGVhZGVycykpfWApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsZW5ndGggPSBwYXJzZUludChjb250ZW50TGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKGxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKG5ldyBFcnJvcihgQ29udGVudC1MZW5ndGggdmFsdWUgbXVzdCBiZSBhIG51bWJlci4gR290ICR7Y29udGVudExlbmd0aH1gKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IHRoaXMuYnVmZmVyLnRyeVJlYWRCb2R5KHRoaXMubmV4dE1lc3NhZ2VMZW5ndGgpO1xuICAgICAgICAgICAgICAgIGlmIChib2R5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLyoqIFdlIGhhdmVuJ3QgcmVjZWl2ZWQgdGhlIGZ1bGwgbWVzc2FnZSB5ZXQuICovXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0UGFydGlhbE1lc3NhZ2VUaW1lcigpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJQYXJ0aWFsTWVzc2FnZVRpbWVyKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9IC0xO1xuICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHdlIGNvbnZlcnQgb25lIHJlY2VpdmVkIG1lc3NhZ2UgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAgICAgLy8gb3RoZXIuIE90aGVyd2lzZSBpdCBjb3VsZCBoYXBwZW4gdGhhdCBhIGRlY29kaW5nIG9mIGEgc2Vjb25kXG4gICAgICAgICAgICAgICAgLy8gc21hbGxlciBtZXNzYWdlIGZpbmlzaGVkIGJlZm9yZSB0aGUgZGVjb2Rpbmcgb2YgYSBmaXJzdCBsYXJnZXJcbiAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIGFuZCB0aGVuIHdlIHdvdWxkIGRlbGl2ZXIgdGhlIHNlY29uZCBtZXNzYWdlIGZpcnN0LlxuICAgICAgICAgICAgICAgIHRoaXMucmVhZFNlbWFwaG9yZS5sb2NrKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnl0ZXMgPSB0aGlzLm9wdGlvbnMuY29udGVudERlY29kZXIgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBhd2FpdCB0aGlzLm9wdGlvbnMuY29udGVudERlY29kZXIuZGVjb2RlKGJvZHkpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGJvZHk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBhd2FpdCB0aGlzLm9wdGlvbnMuY29udGVudFR5cGVEZWNvZGVyLmRlY29kZShieXRlcywgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjayhtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNsZWFyUGFydGlhbE1lc3NhZ2VUaW1lcigpIHtcbiAgICAgICAgaWYgKHRoaXMucGFydGlhbE1lc3NhZ2VUaW1lcikge1xuICAgICAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZVRpbWVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRoaXMucGFydGlhbE1lc3NhZ2VUaW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRQYXJ0aWFsTWVzc2FnZVRpbWVyKCkge1xuICAgICAgICB0aGlzLmNsZWFyUGFydGlhbE1lc3NhZ2VUaW1lcigpO1xuICAgICAgICBpZiAodGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0IDw9IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlVGltZXIgPSAoMCwgcmFsXzEuZGVmYXVsdCkoKS50aW1lci5zZXRUaW1lb3V0KCh0b2tlbiwgdGltZW91dCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZVRpbWVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRva2VuID09PSB0aGlzLm1lc3NhZ2VUb2tlbikge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZVBhcnRpYWxNZXNzYWdlKHsgbWVzc2FnZVRva2VuOiB0b2tlbiwgd2FpdGluZ1RpbWU6IHRpbWVvdXQgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRQYXJ0aWFsTWVzc2FnZVRpbWVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dCwgdGhpcy5tZXNzYWdlVG9rZW4sIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dCk7XG4gICAgfVxufVxuZXhwb3J0cy5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXIgPSBSZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLldyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLkFic3RyYWN0TWVzc2FnZVdyaXRlciA9IGV4cG9ydHMuTWVzc2FnZVdyaXRlciA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IHNlbWFwaG9yZV8xID0gcmVxdWlyZShcIi4vc2VtYXBob3JlXCIpO1xuY29uc3QgZXZlbnRzXzEgPSByZXF1aXJlKFwiLi9ldmVudHNcIik7XG5jb25zdCBDb250ZW50TGVuZ3RoID0gJ0NvbnRlbnQtTGVuZ3RoOiAnO1xuY29uc3QgQ1JMRiA9ICdcXHJcXG4nO1xudmFyIE1lc3NhZ2VXcml0ZXI7XG4oZnVuY3Rpb24gKE1lc3NhZ2VXcml0ZXIpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgSXMuZnVuYyhjYW5kaWRhdGUuZGlzcG9zZSkgJiYgSXMuZnVuYyhjYW5kaWRhdGUub25DbG9zZSkgJiZcbiAgICAgICAgICAgIElzLmZ1bmMoY2FuZGlkYXRlLm9uRXJyb3IpICYmIElzLmZ1bmMoY2FuZGlkYXRlLndyaXRlKTtcbiAgICB9XG4gICAgTWVzc2FnZVdyaXRlci5pcyA9IGlzO1xufSkoTWVzc2FnZVdyaXRlciB8fCAoZXhwb3J0cy5NZXNzYWdlV3JpdGVyID0gTWVzc2FnZVdyaXRlciA9IHt9KSk7XG5jbGFzcyBBYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy5lcnJvckVtaXR0ZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLmNsb3NlRW1pdHRlci5kaXNwb3NlKCk7XG4gICAgfVxuICAgIGdldCBvbkVycm9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lcnJvckVtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGZpcmVFcnJvcihlcnJvciwgbWVzc2FnZSwgY291bnQpIHtcbiAgICAgICAgdGhpcy5lcnJvckVtaXR0ZXIuZmlyZShbdGhpcy5hc0Vycm9yKGVycm9yKSwgbWVzc2FnZSwgY291bnRdKTtcbiAgICB9XG4gICAgZ2V0IG9uQ2xvc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb3NlRW1pdHRlci5ldmVudDtcbiAgICB9XG4gICAgZmlyZUNsb3NlKCkge1xuICAgICAgICB0aGlzLmNsb3NlRW1pdHRlci5maXJlKHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIGFzRXJyb3IoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoYFdyaXRlciByZWNlaXZlZCBlcnJvci4gUmVhc29uOiAke0lzLnN0cmluZyhlcnJvci5tZXNzYWdlKSA/IGVycm9yLm1lc3NhZ2UgOiAndW5rbm93bid9YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLkFic3RyYWN0TWVzc2FnZVdyaXRlciA9IEFic3RyYWN0TWVzc2FnZVdyaXRlcjtcbnZhciBSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zO1xuKGZ1bmN0aW9uIChSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zKSB7XG4gICAgZnVuY3Rpb24gZnJvbU9wdGlvbnMob3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHsgY2hhcnNldDogb3B0aW9ucyA/PyAndXRmLTgnLCBjb250ZW50VHlwZUVuY29kZXI6ICgwLCByYWxfMS5kZWZhdWx0KSgpLmFwcGxpY2F0aW9uSnNvbi5lbmNvZGVyIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4geyBjaGFyc2V0OiBvcHRpb25zLmNoYXJzZXQgPz8gJ3V0Zi04JywgY29udGVudEVuY29kZXI6IG9wdGlvbnMuY29udGVudEVuY29kZXIsIGNvbnRlbnRUeXBlRW5jb2Rlcjogb3B0aW9ucy5jb250ZW50VHlwZUVuY29kZXIgPz8gKDAsIHJhbF8xLmRlZmF1bHQpKCkuYXBwbGljYXRpb25Kc29uLmVuY29kZXIgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zLmZyb21PcHRpb25zID0gZnJvbU9wdGlvbnM7XG59KShSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zIHx8IChSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zID0ge30pKTtcbmNsYXNzIFdyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKHdyaXRhYmxlLCBvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMud3JpdGFibGUgPSB3cml0YWJsZTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gUmVzb2x2ZWRNZXNzYWdlV3JpdGVyT3B0aW9ucy5mcm9tT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50ID0gMDtcbiAgICAgICAgdGhpcy53cml0ZVNlbWFwaG9yZSA9IG5ldyBzZW1hcGhvcmVfMS5TZW1hcGhvcmUoMSk7XG4gICAgICAgIHRoaXMud3JpdGFibGUub25FcnJvcigoZXJyb3IpID0+IHRoaXMuZmlyZUVycm9yKGVycm9yKSk7XG4gICAgICAgIHRoaXMud3JpdGFibGUub25DbG9zZSgoKSA9PiB0aGlzLmZpcmVDbG9zZSgpKTtcbiAgICB9XG4gICAgYXN5bmMgd3JpdGUobXNnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndyaXRlU2VtYXBob3JlLmxvY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHRoaXMub3B0aW9ucy5jb250ZW50VHlwZUVuY29kZXIuZW5jb2RlKG1zZywgdGhpcy5vcHRpb25zKS50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNvbnRlbnRFbmNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jb250ZW50RW5jb2Rlci5lbmNvZGUoYnVmZmVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZC50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJzID0gW107XG4gICAgICAgICAgICAgICAgaGVhZGVycy5wdXNoKENvbnRlbnRMZW5ndGgsIGJ1ZmZlci5ieXRlTGVuZ3RoLnRvU3RyaW5nKCksIENSTEYpO1xuICAgICAgICAgICAgICAgIGhlYWRlcnMucHVzaChDUkxGKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kb1dyaXRlKG1zZywgaGVhZGVycywgYnVmZmVyKTtcbiAgICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgZG9Xcml0ZShtc2csIGhlYWRlcnMsIGRhdGEpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMud3JpdGFibGUud3JpdGUoaGVhZGVycy5qb2luKCcnKSwgJ2FzY2lpJyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy53cml0YWJsZS53cml0ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IsIG1zZyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZUVycm9yKGVycm9yLCBtc2cpIHtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50Kys7XG4gICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yLCBtc2csIHRoaXMuZXJyb3JDb3VudCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICAgICAgdGhpcy53cml0YWJsZS5lbmQoKTtcbiAgICB9XG59XG5leHBvcnRzLldyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgPSBXcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkFic3RyYWN0TWVzc2FnZUJ1ZmZlciA9IHZvaWQgMDtcbmNvbnN0IENSID0gMTM7XG5jb25zdCBMRiA9IDEwO1xuY29uc3QgQ1JMRiA9ICdcXHJcXG4nO1xuY2xhc3MgQWJzdHJhY3RNZXNzYWdlQnVmZmVyIHtcbiAgICBjb25zdHJ1Y3RvcihlbmNvZGluZyA9ICd1dGYtOCcpIHtcbiAgICAgICAgdGhpcy5fZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgICAgICAgdGhpcy5fY2h1bmtzID0gW107XG4gICAgICAgIHRoaXMuX3RvdGFsTGVuZ3RoID0gMDtcbiAgICB9XG4gICAgZ2V0IGVuY29kaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW5jb2Rpbmc7XG4gICAgfVxuICAgIGFwcGVuZChjaHVuaykge1xuICAgICAgICBjb25zdCB0b0FwcGVuZCA9IHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZycgPyB0aGlzLmZyb21TdHJpbmcoY2h1bmssIHRoaXMuX2VuY29kaW5nKSA6IGNodW5rO1xuICAgICAgICB0aGlzLl9jaHVua3MucHVzaCh0b0FwcGVuZCk7XG4gICAgICAgIHRoaXMuX3RvdGFsTGVuZ3RoICs9IHRvQXBwZW5kLmJ5dGVMZW5ndGg7XG4gICAgfVxuICAgIHRyeVJlYWRIZWFkZXJzKGxvd2VyQ2FzZUtleXMgPSBmYWxzZSkge1xuICAgICAgICBpZiAodGhpcy5fY2h1bmtzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3RhdGUgPSAwO1xuICAgICAgICBsZXQgY2h1bmtJbmRleCA9IDA7XG4gICAgICAgIGxldCBvZmZzZXQgPSAwO1xuICAgICAgICBsZXQgY2h1bmtCeXRlc1JlYWQgPSAwO1xuICAgICAgICByb3c6IHdoaWxlIChjaHVua0luZGV4IDwgdGhpcy5fY2h1bmtzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgY2h1bmsgPSB0aGlzLl9jaHVua3NbY2h1bmtJbmRleF07XG4gICAgICAgICAgICBvZmZzZXQgPSAwO1xuICAgICAgICAgICAgY29sdW1uOiB3aGlsZSAob2Zmc2V0IDwgY2h1bmsubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjaHVua1tvZmZzZXRdO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDUjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIExGOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gNDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHJvdztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjaHVua0J5dGVzUmVhZCArPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgY2h1bmtJbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZSAhPT0gNCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgYnVmZmVyIGNvbnRhaW5zIHRoZSB0d28gQ1JMRiBhdCB0aGUgZW5kLiBTbyB3ZSB3aWxsXG4gICAgICAgIC8vIGhhdmUgdHdvIGVtcHR5IGxpbmVzIGFmdGVyIHRoZSBzcGxpdCBhdCB0aGUgZW5kIGFzIHdlbGwuXG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuX3JlYWQoY2h1bmtCeXRlc1JlYWQgKyBvZmZzZXQpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwKCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLnRvU3RyaW5nKGJ1ZmZlciwgJ2FzY2lpJykuc3BsaXQoQ1JMRik7XG4gICAgICAgIGlmIChoZWFkZXJzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXJzLmxlbmd0aCAtIDI7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaGVhZGVyID0gaGVhZGVyc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gaGVhZGVyLmluZGV4T2YoJzonKTtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1lc3NhZ2UgaGVhZGVyIG11c3Qgc2VwYXJhdGUga2V5IGFuZCB2YWx1ZSB1c2luZyAnOidcXG4ke2hlYWRlcn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGhlYWRlci5zdWJzdHIoMCwgaW5kZXgpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBoZWFkZXIuc3Vic3RyKGluZGV4ICsgMSkudHJpbSgpO1xuICAgICAgICAgICAgcmVzdWx0LnNldChsb3dlckNhc2VLZXlzID8ga2V5LnRvTG93ZXJDYXNlKCkgOiBrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICB0cnlSZWFkQm9keShsZW5ndGgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3RvdGFsTGVuZ3RoIDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkKGxlbmd0aCk7XG4gICAgfVxuICAgIGdldCBudW1iZXJPZkJ5dGVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdG90YWxMZW5ndGg7XG4gICAgfVxuICAgIF9yZWFkKGJ5dGVDb3VudCkge1xuICAgICAgICBpZiAoYnl0ZUNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbXB0eUJ1ZmZlcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChieXRlQ291bnQgPiB0aGlzLl90b3RhbExlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVhZCBzbyBtYW55IGJ5dGVzIWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jaHVua3NbMF0uYnl0ZUxlbmd0aCA9PT0gYnl0ZUNvdW50KSB7XG4gICAgICAgICAgICAvLyBzdXBlciBmYXN0IHBhdGgsIHByZWNpc2VseSBmaXJzdCBjaHVuayBtdXN0IGJlIHJldHVybmVkXG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1swXTtcbiAgICAgICAgICAgIHRoaXMuX2NodW5rcy5zaGlmdCgpO1xuICAgICAgICAgICAgdGhpcy5fdG90YWxMZW5ndGggLT0gYnl0ZUNvdW50O1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXNOYXRpdmUoY2h1bmspO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jaHVua3NbMF0uYnl0ZUxlbmd0aCA+IGJ5dGVDb3VudCkge1xuICAgICAgICAgICAgLy8gZmFzdCBwYXRoLCB0aGUgcmVhZGluZyBpcyBlbnRpcmVseSB3aXRoaW4gdGhlIGZpcnN0IGNodW5rXG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1swXTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuYXNOYXRpdmUoY2h1bmssIGJ5dGVDb3VudCk7XG4gICAgICAgICAgICB0aGlzLl9jaHVua3NbMF0gPSBjaHVuay5zbGljZShieXRlQ291bnQpO1xuICAgICAgICAgICAgdGhpcy5fdG90YWxMZW5ndGggLT0gYnl0ZUNvdW50O1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmFsbG9jTmF0aXZlKGJ5dGVDb3VudCk7XG4gICAgICAgIGxldCByZXN1bHRPZmZzZXQgPSAwO1xuICAgICAgICBsZXQgY2h1bmtJbmRleCA9IDA7XG4gICAgICAgIHdoaWxlIChieXRlQ291bnQgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1tjaHVua0luZGV4XTtcbiAgICAgICAgICAgIGlmIChjaHVuay5ieXRlTGVuZ3RoID4gYnl0ZUNvdW50KSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBjaHVuayB3aWxsIHN1cnZpdmVcbiAgICAgICAgICAgICAgICBjb25zdCBjaHVua1BhcnQgPSBjaHVuay5zbGljZSgwLCBieXRlQ291bnQpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5zZXQoY2h1bmtQYXJ0LCByZXN1bHRPZmZzZXQpO1xuICAgICAgICAgICAgICAgIHJlc3VsdE9mZnNldCArPSBieXRlQ291bnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2h1bmtzW2NodW5rSW5kZXhdID0gY2h1bmsuc2xpY2UoYnl0ZUNvdW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLl90b3RhbExlbmd0aCAtPSBieXRlQ291bnQ7XG4gICAgICAgICAgICAgICAgYnl0ZUNvdW50IC09IGJ5dGVDb3VudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHRoaXMgY2h1bmsgd2lsbCBiZSBlbnRpcmVseSByZWFkXG4gICAgICAgICAgICAgICAgcmVzdWx0LnNldChjaHVuaywgcmVzdWx0T2Zmc2V0KTtcbiAgICAgICAgICAgICAgICByZXN1bHRPZmZzZXQgKz0gY2h1bmsuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgICAgICB0aGlzLl9jaHVua3Muc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl90b3RhbExlbmd0aCAtPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgICAgIGJ5dGVDb3VudCAtPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VCdWZmZXIgPSBBYnN0cmFjdE1lc3NhZ2VCdWZmZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uID0gZXhwb3J0cy5Db25uZWN0aW9uT3B0aW9ucyA9IGV4cG9ydHMuTWVzc2FnZVN0cmF0ZWd5ID0gZXhwb3J0cy5DYW5jZWxsYXRpb25TdHJhdGVneSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gZXhwb3J0cy5JZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IGV4cG9ydHMuQ29ubmVjdGlvbkVycm9yID0gZXhwb3J0cy5Db25uZWN0aW9uRXJyb3JzID0gZXhwb3J0cy5Mb2dUcmFjZU5vdGlmaWNhdGlvbiA9IGV4cG9ydHMuU2V0VHJhY2VOb3RpZmljYXRpb24gPSBleHBvcnRzLlRyYWNlRm9ybWF0ID0gZXhwb3J0cy5UcmFjZVZhbHVlcyA9IGV4cG9ydHMuVHJhY2UgPSBleHBvcnRzLk51bGxMb2dnZXIgPSBleHBvcnRzLlByb2dyZXNzVHlwZSA9IGV4cG9ydHMuUHJvZ3Jlc3NUb2tlbiA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IG1lc3NhZ2VzXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlc1wiKTtcbmNvbnN0IGxpbmtlZE1hcF8xID0gcmVxdWlyZShcIi4vbGlua2VkTWFwXCIpO1xuY29uc3QgZXZlbnRzXzEgPSByZXF1aXJlKFwiLi9ldmVudHNcIik7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbnZhciBDYW5jZWxOb3RpZmljYXRpb247XG4oZnVuY3Rpb24gKENhbmNlbE5vdGlmaWNhdGlvbikge1xuICAgIENhbmNlbE5vdGlmaWNhdGlvbi50eXBlID0gbmV3IG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZSgnJC9jYW5jZWxSZXF1ZXN0Jyk7XG59KShDYW5jZWxOb3RpZmljYXRpb24gfHwgKENhbmNlbE5vdGlmaWNhdGlvbiA9IHt9KSk7XG52YXIgUHJvZ3Jlc3NUb2tlbjtcbihmdW5jdGlvbiAoUHJvZ3Jlc3NUb2tlbikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG4gICAgfVxuICAgIFByb2dyZXNzVG9rZW4uaXMgPSBpcztcbn0pKFByb2dyZXNzVG9rZW4gfHwgKGV4cG9ydHMuUHJvZ3Jlc3NUb2tlbiA9IFByb2dyZXNzVG9rZW4gPSB7fSkpO1xudmFyIFByb2dyZXNzTm90aWZpY2F0aW9uO1xuKGZ1bmN0aW9uIChQcm9ncmVzc05vdGlmaWNhdGlvbikge1xuICAgIFByb2dyZXNzTm90aWZpY2F0aW9uLnR5cGUgPSBuZXcgbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlKCckL3Byb2dyZXNzJyk7XG59KShQcm9ncmVzc05vdGlmaWNhdGlvbiB8fCAoUHJvZ3Jlc3NOb3RpZmljYXRpb24gPSB7fSkpO1xuY2xhc3MgUHJvZ3Jlc3NUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICB9XG59XG5leHBvcnRzLlByb2dyZXNzVHlwZSA9IFByb2dyZXNzVHlwZTtcbnZhciBTdGFyUmVxdWVzdEhhbmRsZXI7XG4oZnVuY3Rpb24gKFN0YXJSZXF1ZXN0SGFuZGxlcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBJcy5mdW5jKHZhbHVlKTtcbiAgICB9XG4gICAgU3RhclJlcXVlc3RIYW5kbGVyLmlzID0gaXM7XG59KShTdGFyUmVxdWVzdEhhbmRsZXIgfHwgKFN0YXJSZXF1ZXN0SGFuZGxlciA9IHt9KSk7XG5leHBvcnRzLk51bGxMb2dnZXIgPSBPYmplY3QuZnJlZXplKHtcbiAgICBlcnJvcjogKCkgPT4geyB9LFxuICAgIHdhcm46ICgpID0+IHsgfSxcbiAgICBpbmZvOiAoKSA9PiB7IH0sXG4gICAgbG9nOiAoKSA9PiB7IH1cbn0pO1xudmFyIFRyYWNlO1xuKGZ1bmN0aW9uIChUcmFjZSkge1xuICAgIFRyYWNlW1RyYWNlW1wiT2ZmXCJdID0gMF0gPSBcIk9mZlwiO1xuICAgIFRyYWNlW1RyYWNlW1wiTWVzc2FnZXNcIl0gPSAxXSA9IFwiTWVzc2FnZXNcIjtcbiAgICBUcmFjZVtUcmFjZVtcIkNvbXBhY3RcIl0gPSAyXSA9IFwiQ29tcGFjdFwiO1xuICAgIFRyYWNlW1RyYWNlW1wiVmVyYm9zZVwiXSA9IDNdID0gXCJWZXJib3NlXCI7XG59KShUcmFjZSB8fCAoZXhwb3J0cy5UcmFjZSA9IFRyYWNlID0ge30pKTtcbnZhciBUcmFjZVZhbHVlcztcbihmdW5jdGlvbiAoVHJhY2VWYWx1ZXMpIHtcbiAgICAvKipcbiAgICAgKiBUdXJuIHRyYWNpbmcgb2ZmLlxuICAgICAqL1xuICAgIFRyYWNlVmFsdWVzLk9mZiA9ICdvZmYnO1xuICAgIC8qKlxuICAgICAqIFRyYWNlIG1lc3NhZ2VzIG9ubHkuXG4gICAgICovXG4gICAgVHJhY2VWYWx1ZXMuTWVzc2FnZXMgPSAnbWVzc2FnZXMnO1xuICAgIC8qKlxuICAgICAqIENvbXBhY3QgbWVzc2FnZSB0cmFjaW5nLlxuICAgICAqL1xuICAgIFRyYWNlVmFsdWVzLkNvbXBhY3QgPSAnY29tcGFjdCc7XG4gICAgLyoqXG4gICAgICogVmVyYm9zZSBtZXNzYWdlIHRyYWNpbmcuXG4gICAgICovXG4gICAgVHJhY2VWYWx1ZXMuVmVyYm9zZSA9ICd2ZXJib3NlJztcbn0pKFRyYWNlVmFsdWVzIHx8IChleHBvcnRzLlRyYWNlVmFsdWVzID0gVHJhY2VWYWx1ZXMgPSB7fSkpO1xuKGZ1bmN0aW9uIChUcmFjZSkge1xuICAgIGZ1bmN0aW9uIGZyb21TdHJpbmcodmFsdWUpIHtcbiAgICAgICAgaWYgKCFJcy5zdHJpbmcodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gVHJhY2UuT2ZmO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSAnb2ZmJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gVHJhY2UuT2ZmO1xuICAgICAgICAgICAgY2FzZSAnbWVzc2FnZXMnOlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5NZXNzYWdlcztcbiAgICAgICAgICAgIGNhc2UgJ2NvbXBhY3QnOlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5Db21wYWN0O1xuICAgICAgICAgICAgY2FzZSAndmVyYm9zZSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFRyYWNlLlZlcmJvc2U7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5PZmY7XG4gICAgICAgIH1cbiAgICB9XG4gICAgVHJhY2UuZnJvbVN0cmluZyA9IGZyb21TdHJpbmc7XG4gICAgZnVuY3Rpb24gdG9TdHJpbmcodmFsdWUpIHtcbiAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5PZmY6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdvZmYnO1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5NZXNzYWdlczpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ21lc3NhZ2VzJztcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuQ29tcGFjdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2NvbXBhY3QnO1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5WZXJib3NlOlxuICAgICAgICAgICAgICAgIHJldHVybiAndmVyYm9zZSc7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAnb2ZmJztcbiAgICAgICAgfVxuICAgIH1cbiAgICBUcmFjZS50b1N0cmluZyA9IHRvU3RyaW5nO1xufSkoVHJhY2UgfHwgKGV4cG9ydHMuVHJhY2UgPSBUcmFjZSA9IHt9KSk7XG52YXIgVHJhY2VGb3JtYXQ7XG4oZnVuY3Rpb24gKFRyYWNlRm9ybWF0KSB7XG4gICAgVHJhY2VGb3JtYXRbXCJUZXh0XCJdID0gXCJ0ZXh0XCI7XG4gICAgVHJhY2VGb3JtYXRbXCJKU09OXCJdID0gXCJqc29uXCI7XG59KShUcmFjZUZvcm1hdCB8fCAoZXhwb3J0cy5UcmFjZUZvcm1hdCA9IFRyYWNlRm9ybWF0ID0ge30pKTtcbihmdW5jdGlvbiAoVHJhY2VGb3JtYXQpIHtcbiAgICBmdW5jdGlvbiBmcm9tU3RyaW5nKHZhbHVlKSB7XG4gICAgICAgIGlmICghSXMuc3RyaW5nKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIFRyYWNlRm9ybWF0LlRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAodmFsdWUgPT09ICdqc29uJykge1xuICAgICAgICAgICAgcmV0dXJuIFRyYWNlRm9ybWF0LkpTT047XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gVHJhY2VGb3JtYXQuVGV4dDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBUcmFjZUZvcm1hdC5mcm9tU3RyaW5nID0gZnJvbVN0cmluZztcbn0pKFRyYWNlRm9ybWF0IHx8IChleHBvcnRzLlRyYWNlRm9ybWF0ID0gVHJhY2VGb3JtYXQgPSB7fSkpO1xudmFyIFNldFRyYWNlTm90aWZpY2F0aW9uO1xuKGZ1bmN0aW9uIChTZXRUcmFjZU5vdGlmaWNhdGlvbikge1xuICAgIFNldFRyYWNlTm90aWZpY2F0aW9uLnR5cGUgPSBuZXcgbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlKCckL3NldFRyYWNlJyk7XG59KShTZXRUcmFjZU5vdGlmaWNhdGlvbiB8fCAoZXhwb3J0cy5TZXRUcmFjZU5vdGlmaWNhdGlvbiA9IFNldFRyYWNlTm90aWZpY2F0aW9uID0ge30pKTtcbnZhciBMb2dUcmFjZU5vdGlmaWNhdGlvbjtcbihmdW5jdGlvbiAoTG9nVHJhY2VOb3RpZmljYXRpb24pIHtcbiAgICBMb2dUcmFjZU5vdGlmaWNhdGlvbi50eXBlID0gbmV3IG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZSgnJC9sb2dUcmFjZScpO1xufSkoTG9nVHJhY2VOb3RpZmljYXRpb24gfHwgKGV4cG9ydHMuTG9nVHJhY2VOb3RpZmljYXRpb24gPSBMb2dUcmFjZU5vdGlmaWNhdGlvbiA9IHt9KSk7XG52YXIgQ29ubmVjdGlvbkVycm9ycztcbihmdW5jdGlvbiAoQ29ubmVjdGlvbkVycm9ycykge1xuICAgIC8qKlxuICAgICAqIFRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZC5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uRXJyb3JzW0Nvbm5lY3Rpb25FcnJvcnNbXCJDbG9zZWRcIl0gPSAxXSA9IFwiQ2xvc2VkXCI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gZ290IGRpc3Bvc2VkLlxuICAgICAqL1xuICAgIENvbm5lY3Rpb25FcnJvcnNbQ29ubmVjdGlvbkVycm9yc1tcIkRpc3Bvc2VkXCJdID0gMl0gPSBcIkRpc3Bvc2VkXCI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBpbiBsaXN0ZW5pbmcgbW9kZS5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uRXJyb3JzW0Nvbm5lY3Rpb25FcnJvcnNbXCJBbHJlYWR5TGlzdGVuaW5nXCJdID0gM10gPSBcIkFscmVhZHlMaXN0ZW5pbmdcIjtcbn0pKENvbm5lY3Rpb25FcnJvcnMgfHwgKGV4cG9ydHMuQ29ubmVjdGlvbkVycm9ycyA9IENvbm5lY3Rpb25FcnJvcnMgPSB7fSkpO1xuY2xhc3MgQ29ubmVjdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNvZGUsIG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBDb25uZWN0aW9uRXJyb3IucHJvdG90eXBlKTtcbiAgICB9XG59XG5leHBvcnRzLkNvbm5lY3Rpb25FcnJvciA9IENvbm5lY3Rpb25FcnJvcjtcbnZhciBDb25uZWN0aW9uU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENvbm5lY3Rpb25TdHJhdGVneSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNhbmNlbFVuZGlzcGF0Y2hlZCk7XG4gICAgfVxuICAgIENvbm5lY3Rpb25TdHJhdGVneS5pcyA9IGlzO1xufSkoQ29ubmVjdGlvblN0cmF0ZWd5IHx8IChleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IENvbm5lY3Rpb25TdHJhdGVneSA9IHt9KSk7XG52YXIgSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5O1xuKGZ1bmN0aW9uIChJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiAoY2FuZGlkYXRlLmtpbmQgPT09IHVuZGVmaW5lZCB8fCBjYW5kaWRhdGUua2luZCA9PT0gJ2lkJykgJiYgSXMuZnVuYyhjYW5kaWRhdGUuY3JlYXRlQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UpICYmIChjYW5kaWRhdGUuZGlzcG9zZSA9PT0gdW5kZWZpbmVkIHx8IElzLmZ1bmMoY2FuZGlkYXRlLmRpc3Bvc2UpKTtcbiAgICB9XG4gICAgSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzID0gaXM7XG59KShJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgfHwgKGV4cG9ydHMuSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0ge30pKTtcbnZhciBSZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneTtcbihmdW5jdGlvbiAoUmVxdWVzdENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBjYW5kaWRhdGUua2luZCA9PT0gJ3JlcXVlc3QnICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKSAmJiAoY2FuZGlkYXRlLmRpc3Bvc2UgPT09IHVuZGVmaW5lZCB8fCBJcy5mdW5jKGNhbmRpZGF0ZS5kaXNwb3NlKSk7XG4gICAgfVxuICAgIFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzID0gaXM7XG59KShSZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSB8fCAoZXhwb3J0cy5SZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0ge30pKTtcbnZhciBDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5O1xuKGZ1bmN0aW9uIChDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5NZXNzYWdlID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKF8pIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgY2FuY2VsbGF0aW9uXzEuQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UoKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kuaXModmFsdWUpIHx8IFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKHZhbHVlKTtcbiAgICB9XG4gICAgQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5pcyA9IGlzO1xufSkoQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSB8fCAoZXhwb3J0cy5DYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IHt9KSk7XG52YXIgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENhbmNlbGxhdGlvblNlbmRlclN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kuTWVzc2FnZSA9IE9iamVjdC5mcmVlemUoe1xuICAgICAgICBzZW5kQ2FuY2VsbGF0aW9uKGNvbm4sIGlkKSB7XG4gICAgICAgICAgICByZXR1cm4gY29ubi5zZW5kTm90aWZpY2F0aW9uKENhbmNlbE5vdGlmaWNhdGlvbi50eXBlLCB7IGlkIH0pO1xuICAgICAgICB9LFxuICAgICAgICBjbGVhbnVwKF8pIHsgfVxuICAgIH0pO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLnNlbmRDYW5jZWxsYXRpb24pICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNsZWFudXApO1xuICAgIH1cbiAgICBDYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneS5pcyA9IGlzO1xufSkoQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgfHwgKGV4cG9ydHMuQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgPSBDYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneSA9IHt9KSk7XG52YXIgQ2FuY2VsbGF0aW9uU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENhbmNlbGxhdGlvblN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uU3RyYXRlZ3kuTWVzc2FnZSA9IE9iamVjdC5mcmVlemUoe1xuICAgICAgICByZWNlaXZlcjogQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5NZXNzYWdlLFxuICAgICAgICBzZW5kZXI6IENhbmNlbGxhdGlvblNlbmRlclN0cmF0ZWd5Lk1lc3NhZ2VcbiAgICB9KTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKGNhbmRpZGF0ZS5yZWNlaXZlcikgJiYgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kuaXMoY2FuZGlkYXRlLnNlbmRlcik7XG4gICAgfVxuICAgIENhbmNlbGxhdGlvblN0cmF0ZWd5LmlzID0gaXM7XG59KShDYW5jZWxsYXRpb25TdHJhdGVneSB8fCAoZXhwb3J0cy5DYW5jZWxsYXRpb25TdHJhdGVneSA9IENhbmNlbGxhdGlvblN0cmF0ZWd5ID0ge30pKTtcbnZhciBNZXNzYWdlU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKE1lc3NhZ2VTdHJhdGVneSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLmhhbmRsZU1lc3NhZ2UpO1xuICAgIH1cbiAgICBNZXNzYWdlU3RyYXRlZ3kuaXMgPSBpcztcbn0pKE1lc3NhZ2VTdHJhdGVneSB8fCAoZXhwb3J0cy5NZXNzYWdlU3RyYXRlZ3kgPSBNZXNzYWdlU3RyYXRlZ3kgPSB7fSkpO1xudmFyIENvbm5lY3Rpb25PcHRpb25zO1xuKGZ1bmN0aW9uIChDb25uZWN0aW9uT3B0aW9ucykge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIChDYW5jZWxsYXRpb25TdHJhdGVneS5pcyhjYW5kaWRhdGUuY2FuY2VsbGF0aW9uU3RyYXRlZ3kpIHx8IENvbm5lY3Rpb25TdHJhdGVneS5pcyhjYW5kaWRhdGUuY29ubmVjdGlvblN0cmF0ZWd5KSB8fCBNZXNzYWdlU3RyYXRlZ3kuaXMoY2FuZGlkYXRlLm1lc3NhZ2VTdHJhdGVneSkpO1xuICAgIH1cbiAgICBDb25uZWN0aW9uT3B0aW9ucy5pcyA9IGlzO1xufSkoQ29ubmVjdGlvbk9wdGlvbnMgfHwgKGV4cG9ydHMuQ29ubmVjdGlvbk9wdGlvbnMgPSBDb25uZWN0aW9uT3B0aW9ucyA9IHt9KSk7XG52YXIgQ29ubmVjdGlvblN0YXRlO1xuKGZ1bmN0aW9uIChDb25uZWN0aW9uU3RhdGUpIHtcbiAgICBDb25uZWN0aW9uU3RhdGVbQ29ubmVjdGlvblN0YXRlW1wiTmV3XCJdID0gMV0gPSBcIk5ld1wiO1xuICAgIENvbm5lY3Rpb25TdGF0ZVtDb25uZWN0aW9uU3RhdGVbXCJMaXN0ZW5pbmdcIl0gPSAyXSA9IFwiTGlzdGVuaW5nXCI7XG4gICAgQ29ubmVjdGlvblN0YXRlW0Nvbm5lY3Rpb25TdGF0ZVtcIkNsb3NlZFwiXSA9IDNdID0gXCJDbG9zZWRcIjtcbiAgICBDb25uZWN0aW9uU3RhdGVbQ29ubmVjdGlvblN0YXRlW1wiRGlzcG9zZWRcIl0gPSA0XSA9IFwiRGlzcG9zZWRcIjtcbn0pKENvbm5lY3Rpb25TdGF0ZSB8fCAoQ29ubmVjdGlvblN0YXRlID0ge30pKTtcbmZ1bmN0aW9uIGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uKG1lc3NhZ2VSZWFkZXIsIG1lc3NhZ2VXcml0ZXIsIF9sb2dnZXIsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBsb2dnZXIgPSBfbG9nZ2VyICE9PSB1bmRlZmluZWQgPyBfbG9nZ2VyIDogZXhwb3J0cy5OdWxsTG9nZ2VyO1xuICAgIGxldCBzZXF1ZW5jZU51bWJlciA9IDA7XG4gICAgbGV0IG5vdGlmaWNhdGlvblNlcXVlbmNlTnVtYmVyID0gMDtcbiAgICBsZXQgdW5rbm93blJlc3BvbnNlU2VxdWVuY2VOdW1iZXIgPSAwO1xuICAgIGNvbnN0IHZlcnNpb24gPSAnMi4wJztcbiAgICBsZXQgc3RhclJlcXVlc3RIYW5kbGVyID0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlcXVlc3RIYW5kbGVycyA9IG5ldyBNYXAoKTtcbiAgICBsZXQgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgY29uc3Qgbm90aWZpY2F0aW9uSGFuZGxlcnMgPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgcHJvZ3Jlc3NIYW5kbGVycyA9IG5ldyBNYXAoKTtcbiAgICBsZXQgdGltZXI7XG4gICAgbGV0IG1lc3NhZ2VRdWV1ZSA9IG5ldyBsaW5rZWRNYXBfMS5MaW5rZWRNYXAoKTtcbiAgICBsZXQgcmVzcG9uc2VQcm9taXNlcyA9IG5ldyBNYXAoKTtcbiAgICBsZXQga25vd25DYW5jZWxlZFJlcXVlc3RzID0gbmV3IFNldCgpO1xuICAgIGxldCByZXF1ZXN0VG9rZW5zID0gbmV3IE1hcCgpO1xuICAgIGxldCB0cmFjZSA9IFRyYWNlLk9mZjtcbiAgICBsZXQgdHJhY2VGb3JtYXQgPSBUcmFjZUZvcm1hdC5UZXh0O1xuICAgIGxldCB0cmFjZXI7XG4gICAgbGV0IHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLk5ldztcbiAgICBjb25zdCBlcnJvckVtaXR0ZXIgPSBuZXcgZXZlbnRzXzEuRW1pdHRlcigpO1xuICAgIGNvbnN0IGNsb3NlRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgdW5oYW5kbGVkTm90aWZpY2F0aW9uRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgdW5oYW5kbGVkUHJvZ3Jlc3NFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICBjb25zdCBkaXNwb3NlRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgY2FuY2VsbGF0aW9uU3RyYXRlZ3kgPSAob3B0aW9ucyAmJiBvcHRpb25zLmNhbmNlbGxhdGlvblN0cmF0ZWd5KSA/IG9wdGlvbnMuY2FuY2VsbGF0aW9uU3RyYXRlZ3kgOiBDYW5jZWxsYXRpb25TdHJhdGVneS5NZXNzYWdlO1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlcXVlc3RRdWV1ZUtleShpZCkge1xuICAgICAgICBpZiAoaWQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuJ3Qgc2VuZCByZXF1ZXN0cyB3aXRoIGlkIG51bGwgc2luY2UgdGhlIHJlc3BvbnNlIGNhbid0IGJlIGNvcnJlbGF0ZWQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdyZXEtJyArIGlkLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlc3BvbnNlUXVldWVLZXkoaWQpIHtcbiAgICAgICAgaWYgKGlkID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3Jlcy11bmtub3duLScgKyAoKyt1bmtub3duUmVzcG9uc2VTZXF1ZW5jZU51bWJlcikudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAncmVzLScgKyBpZC50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZU5vdGlmaWNhdGlvblF1ZXVlS2V5KCkge1xuICAgICAgICByZXR1cm4gJ25vdC0nICsgKCsrbm90aWZpY2F0aW9uU2VxdWVuY2VOdW1iZXIpLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFkZE1lc3NhZ2VUb1F1ZXVlKHF1ZXVlLCBtZXNzYWdlKSB7XG4gICAgICAgIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXF1ZXN0KG1lc3NhZ2UpKSB7XG4gICAgICAgICAgICBxdWV1ZS5zZXQoY3JlYXRlUmVxdWVzdFF1ZXVlS2V5KG1lc3NhZ2UuaWQpLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXNwb25zZShtZXNzYWdlKSkge1xuICAgICAgICAgICAgcXVldWUuc2V0KGNyZWF0ZVJlc3BvbnNlUXVldWVLZXkobWVzc2FnZS5pZCksIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcXVldWUuc2V0KGNyZWF0ZU5vdGlmaWNhdGlvblF1ZXVlS2V5KCksIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNhbmNlbFVuZGlzcGF0Y2hlZChfbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0xpc3RlbmluZygpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlID09PSBDb25uZWN0aW9uU3RhdGUuTGlzdGVuaW5nO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0Nsb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlID09PSBDb25uZWN0aW9uU3RhdGUuQ2xvc2VkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0Rpc3Bvc2VkKCkge1xuICAgICAgICByZXR1cm4gc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5EaXNwb3NlZDtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2xvc2VIYW5kbGVyKCkge1xuICAgICAgICBpZiAoc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5OZXcgfHwgc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5MaXN0ZW5pbmcpIHtcbiAgICAgICAgICAgIHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLkNsb3NlZDtcbiAgICAgICAgICAgIGNsb3NlRW1pdHRlci5maXJlKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlIGNvbm5lY3Rpb24gaXMgZGlzcG9zZWQgZG9uJ3Qgc2VudCBjbG9zZSBldmVudHMuXG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlYWRFcnJvckhhbmRsZXIoZXJyb3IpIHtcbiAgICAgICAgZXJyb3JFbWl0dGVyLmZpcmUoW2Vycm9yLCB1bmRlZmluZWQsIHVuZGVmaW5lZF0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiB3cml0ZUVycm9ySGFuZGxlcihkYXRhKSB7XG4gICAgICAgIGVycm9yRW1pdHRlci5maXJlKGRhdGEpO1xuICAgIH1cbiAgICBtZXNzYWdlUmVhZGVyLm9uQ2xvc2UoY2xvc2VIYW5kbGVyKTtcbiAgICBtZXNzYWdlUmVhZGVyLm9uRXJyb3IocmVhZEVycm9ySGFuZGxlcik7XG4gICAgbWVzc2FnZVdyaXRlci5vbkNsb3NlKGNsb3NlSGFuZGxlcik7XG4gICAgbWVzc2FnZVdyaXRlci5vbkVycm9yKHdyaXRlRXJyb3JIYW5kbGVyKTtcbiAgICBmdW5jdGlvbiB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCkge1xuICAgICAgICBpZiAodGltZXIgfHwgbWVzc2FnZVF1ZXVlLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aW1lciA9ICgwLCByYWxfMS5kZWZhdWx0KSgpLnRpbWVyLnNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICAgICAgICB0aW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHByb2Nlc3NNZXNzYWdlUXVldWUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGhhbmRsZU1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICBpZiAobWVzc2FnZXNfMS5NZXNzYWdlLmlzUmVxdWVzdChtZXNzYWdlKSkge1xuICAgICAgICAgICAgaGFuZGxlUmVxdWVzdChtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNOb3RpZmljYXRpb24obWVzc2FnZSkpIHtcbiAgICAgICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvbihtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXNwb25zZShtZXNzYWdlKSkge1xuICAgICAgICAgICAgaGFuZGxlUmVzcG9uc2UobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBoYW5kbGVJbnZhbGlkTWVzc2FnZShtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBwcm9jZXNzTWVzc2FnZVF1ZXVlKCkge1xuICAgICAgICBpZiAobWVzc2FnZVF1ZXVlLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXNzYWdlID0gbWVzc2FnZVF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlU3RyYXRlZ3kgPSBvcHRpb25zPy5tZXNzYWdlU3RyYXRlZ3k7XG4gICAgICAgICAgICBpZiAoTWVzc2FnZVN0cmF0ZWd5LmlzKG1lc3NhZ2VTdHJhdGVneSkpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlU3RyYXRlZ3kuaGFuZGxlTWVzc2FnZShtZXNzYWdlLCBoYW5kbGVNZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGhhbmRsZU1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgY2FsbGJhY2sgPSAobWVzc2FnZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2UgaGF2ZSByZWNlaXZlZCBhIGNhbmNlbGxhdGlvbiBtZXNzYWdlLiBDaGVjayBpZiB0aGUgbWVzc2FnZSBpcyBzdGlsbCBpbiB0aGUgcXVldWVcbiAgICAgICAgICAgIC8vIGFuZCBjYW5jZWwgaXQgaWYgYWxsb3dlZCB0byBkbyBzby5cbiAgICAgICAgICAgIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNOb3RpZmljYXRpb24obWVzc2FnZSkgJiYgbWVzc2FnZS5tZXRob2QgPT09IENhbmNlbE5vdGlmaWNhdGlvbi50eXBlLm1ldGhvZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbmNlbElkID0gbWVzc2FnZS5wYXJhbXMuaWQ7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gY3JlYXRlUmVxdWVzdFF1ZXVlS2V5KGNhbmNlbElkKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0b0NhbmNlbCA9IG1lc3NhZ2VRdWV1ZS5nZXQoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZXNfMS5NZXNzYWdlLmlzUmVxdWVzdCh0b0NhbmNlbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyYXRlZ3kgPSBvcHRpb25zPy5jb25uZWN0aW9uU3RyYXRlZ3k7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gKHN0cmF0ZWd5ICYmIHN0cmF0ZWd5LmNhbmNlbFVuZGlzcGF0Y2hlZCkgPyBzdHJhdGVneS5jYW5jZWxVbmRpc3BhdGNoZWQodG9DYW5jZWwsIGNhbmNlbFVuZGlzcGF0Y2hlZCkgOiBjYW5jZWxVbmRpc3BhdGNoZWQodG9DYW5jZWwpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgJiYgKHJlc3BvbnNlLmVycm9yICE9PSB1bmRlZmluZWQgfHwgcmVzcG9uc2UucmVzdWx0ICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUXVldWUuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLmRlbGV0ZShjYW5jZWxJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5pZCA9IHRvQ2FuY2VsLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VTZW5kaW5nUmVzcG9uc2UocmVzcG9uc2UsIG1lc3NhZ2UubWV0aG9kLCBEYXRlLm5vdygpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUocmVzcG9uc2UpLmNhdGNoKCgpID0+IGxvZ2dlci5lcnJvcihgU2VuZGluZyByZXNwb25zZSBmb3IgY2FuY2VsZWQgbWVzc2FnZSBmYWlsZWQuYCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGNhbmNlbGxhdGlvblRva2VuID0gcmVxdWVzdFRva2Vucy5nZXQoY2FuY2VsSWQpO1xuICAgICAgICAgICAgICAgIC8vIFRoZSByZXF1ZXN0IGlzIGFscmVhZHkgcnVubmluZy4gQ2FuY2VsIHRoZSB0b2tlblxuICAgICAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbmNlbGxhdGlvblRva2VuLmNhbmNlbCgpO1xuICAgICAgICAgICAgICAgICAgICB0cmFjZVJlY2VpdmVkTm90aWZpY2F0aW9uKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZW1lbWJlciB0aGUgY2FuY2VsIGJ1dCBzdGlsbCBxdWV1ZSB0aGUgbWVzc2FnZSB0b1xuICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbiB1cCBzdGF0ZSBpbiBwcm9jZXNzIG1lc3NhZ2UuXG4gICAgICAgICAgICAgICAgICAgIGtub3duQ2FuY2VsZWRSZXF1ZXN0cy5hZGQoY2FuY2VsSWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFkZE1lc3NhZ2VUb1F1ZXVlKG1lc3NhZ2VRdWV1ZSwgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGZ1bmN0aW9uIGhhbmRsZVJlcXVlc3QocmVxdWVzdE1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgLy8gd2UgcmV0dXJuIGhlcmUgc2lsZW50bHkgc2luY2Ugd2UgZmlyZWQgYW4gZXZlbnQgd2hlbiB0aGVcbiAgICAgICAgICAgIC8vIGNvbm5lY3Rpb24gZ290IGRpc3Bvc2VkLlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHJlcGx5KHJlc3VsdE9yRXJyb3IsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgaWQ6IHJlcXVlc3RNZXNzYWdlLmlkXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKHJlc3VsdE9yRXJyb3IgaW5zdGFuY2VvZiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlLmVycm9yID0gcmVzdWx0T3JFcnJvci50b0pzb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVzdWx0ID0gcmVzdWx0T3JFcnJvciA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHJlc3VsdE9yRXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cmFjZVNlbmRpbmdSZXNwb25zZShtZXNzYWdlLCBtZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICBtZXNzYWdlV3JpdGVyLndyaXRlKG1lc3NhZ2UpLmNhdGNoKCgpID0+IGxvZ2dlci5lcnJvcihgU2VuZGluZyByZXNwb25zZSBmYWlsZWQuYCkpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHJlcGx5RXJyb3IoZXJyb3IsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgaWQ6IHJlcXVlc3RNZXNzYWdlLmlkLFxuICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvci50b0pzb24oKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUobWVzc2FnZSkuY2F0Y2goKCkgPT4gbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlc3BvbnNlIGZhaWxlZC5gKSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gcmVwbHlTdWNjZXNzKHJlc3VsdCwgbWV0aG9kLCBzdGFydFRpbWUpIHtcbiAgICAgICAgICAgIC8vIFRoZSBKU09OIFJQQyBkZWZpbmVzIHRoYXQgYSByZXNwb25zZSBtdXN0IGVpdGhlciBoYXZlIGEgcmVzdWx0IG9yIGFuIGVycm9yXG4gICAgICAgICAgICAvLyBTbyB3ZSBjYW4ndCB0cmVhdCB1bmRlZmluZWQgYXMgYSB2YWxpZCByZXNwb25zZSByZXN1bHQuXG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgICAgICAgICAgICBqc29ucnBjOiB2ZXJzaW9uLFxuICAgICAgICAgICAgICAgIGlkOiByZXF1ZXN0TWVzc2FnZS5pZCxcbiAgICAgICAgICAgICAgICByZXN1bHQ6IHJlc3VsdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUobWVzc2FnZSkuY2F0Y2goKCkgPT4gbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlc3BvbnNlIGZhaWxlZC5gKSk7XG4gICAgICAgIH1cbiAgICAgICAgdHJhY2VSZWNlaXZlZFJlcXVlc3QocmVxdWVzdE1lc3NhZ2UpO1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gcmVxdWVzdEhhbmRsZXJzLmdldChyZXF1ZXN0TWVzc2FnZS5tZXRob2QpO1xuICAgICAgICBsZXQgdHlwZTtcbiAgICAgICAgbGV0IHJlcXVlc3RIYW5kbGVyO1xuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgdHlwZSA9IGVsZW1lbnQudHlwZTtcbiAgICAgICAgICAgIHJlcXVlc3RIYW5kbGVyID0gZWxlbWVudC5oYW5kbGVyO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIGlmIChyZXF1ZXN0SGFuZGxlciB8fCBzdGFyUmVxdWVzdEhhbmRsZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHRva2VuS2V5ID0gcmVxdWVzdE1lc3NhZ2UuaWQgPz8gU3RyaW5nKERhdGUubm93KCkpOyAvL1xuICAgICAgICAgICAgY29uc3QgY2FuY2VsbGF0aW9uU291cmNlID0gSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKGNhbmNlbGxhdGlvblN0cmF0ZWd5LnJlY2VpdmVyKVxuICAgICAgICAgICAgICAgID8gY2FuY2VsbGF0aW9uU3RyYXRlZ3kucmVjZWl2ZXIuY3JlYXRlQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UodG9rZW5LZXkpXG4gICAgICAgICAgICAgICAgOiBjYW5jZWxsYXRpb25TdHJhdGVneS5yZWNlaXZlci5jcmVhdGVDYW5jZWxsYXRpb25Ub2tlblNvdXJjZShyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICBpZiAocmVxdWVzdE1lc3NhZ2UuaWQgIT09IG51bGwgJiYga25vd25DYW5jZWxlZFJlcXVlc3RzLmhhcyhyZXF1ZXN0TWVzc2FnZS5pZCkpIHtcbiAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25Tb3VyY2UuY2FuY2VsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVxdWVzdE1lc3NhZ2UuaWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLnNldCh0b2tlbktleSwgY2FuY2VsbGF0aW9uU291cmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IGhhbmRsZXJSZXN1bHQ7XG4gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0TWVzc2FnZS5wYXJhbXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlLm51bWJlck9mUGFyYW1zICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1zLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyAke3R5cGUubnVtYmVyT2ZQYXJhbXN9IHBhcmFtcyBidXQgcmVjZWl2ZWQgbm9uZS5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJSZXN1bHQgPSByZXF1ZXN0SGFuZGxlcihjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVxdWVzdE1lc3NhZ2UucGFyYW1zKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlLnBhcmFtZXRlclN0cnVjdHVyZXMgPT09IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseUVycm9yKG5ldyBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IobWVzc2FnZXNfMS5FcnJvckNvZGVzLkludmFsaWRQYXJhbXMsIGBSZXF1ZXN0ICR7cmVxdWVzdE1lc3NhZ2UubWV0aG9kfSBkZWZpbmVzIHBhcmFtZXRlcnMgYnkgbmFtZSBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBwb3NpdGlvbmApLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlclJlc3VsdCA9IHJlcXVlc3RIYW5kbGVyKC4uLnJlcXVlc3RNZXNzYWdlLnBhcmFtcywgY2FuY2VsbGF0aW9uU291cmNlLnRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS5wYXJhbWV0ZXJTdHJ1Y3R1cmVzID09PSBtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW52YWxpZFBhcmFtcywgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGRlZmluZXMgcGFyYW1ldGVycyBieSBwb3NpdGlvbiBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBuYW1lYCksIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gcmVxdWVzdEhhbmRsZXIocmVxdWVzdE1lc3NhZ2UucGFyYW1zLCBjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0YXJSZXF1ZXN0SGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gc3RhclJlcXVlc3RIYW5kbGVyKHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgcmVxdWVzdE1lc3NhZ2UucGFyYW1zLCBjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBwcm9taXNlID0gaGFuZGxlclJlc3VsdDtcbiAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZXJSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFRva2Vucy5kZWxldGUodG9rZW5LZXkpO1xuICAgICAgICAgICAgICAgICAgICByZXBseVN1Y2Nlc3MoaGFuZGxlclJlc3VsdCwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwcm9taXNlLnRoZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS50aGVuKChyZXN1bHRPckVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLmRlbGV0ZSh0b2tlbktleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXBseShyZXN1bHRPckVycm9yLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IoZXJyb3IsIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVycm9yICYmIElzLnN0cmluZyhlcnJvci5tZXNzYWdlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGZhaWxlZCB3aXRoIG1lc3NhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZmFpbGVkIHVuZXhwZWN0ZWRseSB3aXRob3V0IHByb3ZpZGluZyBhbnkgZGV0YWlscy5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHkoaGFuZGxlclJlc3VsdCwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHkoZXJyb3IsIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZXJyb3IgJiYgSXMuc3RyaW5nKGVycm9yLm1lc3NhZ2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGZhaWxlZCB3aXRoIG1lc3NhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZmFpbGVkIHVuZXhwZWN0ZWRseSB3aXRob3V0IHByb3ZpZGluZyBhbnkgZGV0YWlscy5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuTWV0aG9kTm90Rm91bmQsIGBVbmhhbmRsZWQgbWV0aG9kICR7cmVxdWVzdE1lc3NhZ2UubWV0aG9kfWApLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlUmVzcG9uc2UocmVzcG9uc2VNZXNzYWdlKSB7XG4gICAgICAgIGlmIChpc0Rpc3Bvc2VkKCkpIHtcbiAgICAgICAgICAgIC8vIFNlZSBoYW5kbGUgcmVxdWVzdC5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzcG9uc2VNZXNzYWdlLmlkID09PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VNZXNzYWdlLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBSZWNlaXZlZCByZXNwb25zZSBtZXNzYWdlIHdpdGhvdXQgaWQ6IEVycm9yIGlzOiBcXG4ke0pTT04uc3RyaW5naWZ5KHJlc3BvbnNlTWVzc2FnZS5lcnJvciwgdW5kZWZpbmVkLCA0KX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgUmVjZWl2ZWQgcmVzcG9uc2UgbWVzc2FnZSB3aXRob3V0IGlkLiBObyBmdXJ0aGVyIGVycm9yIGluZm9ybWF0aW9uIHByb3ZpZGVkLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gcmVzcG9uc2VNZXNzYWdlLmlkO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VQcm9taXNlID0gcmVzcG9uc2VQcm9taXNlcy5nZXQoa2V5KTtcbiAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWRSZXNwb25zZShyZXNwb25zZU1lc3NhZ2UsIHJlc3BvbnNlUHJvbWlzZSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VQcm9taXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2VzLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZU1lc3NhZ2UuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gcmVzcG9uc2VNZXNzYWdlLmVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlLnJlamVjdChuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKGVycm9yLmNvZGUsIGVycm9yLm1lc3NhZ2UsIGVycm9yLmRhdGEpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXNwb25zZU1lc3NhZ2UucmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlTWVzc2FnZS5yZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgbmV2ZXIgaGFwcGVuLicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IubWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBSZXNwb25zZSBoYW5kbGVyICcke3Jlc3BvbnNlUHJvbWlzZS5tZXRob2R9JyBmYWlsZWQgd2l0aCBtZXNzYWdlOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYFJlc3BvbnNlIGhhbmRsZXIgJyR7cmVzcG9uc2VQcm9taXNlLm1ldGhvZH0nIGZhaWxlZCB1bmV4cGVjdGVkbHkuYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlTm90aWZpY2F0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgLy8gU2VlIGhhbmRsZSByZXF1ZXN0LlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0eXBlID0gdW5kZWZpbmVkO1xuICAgICAgICBsZXQgbm90aWZpY2F0aW9uSGFuZGxlcjtcbiAgICAgICAgaWYgKG1lc3NhZ2UubWV0aG9kID09PSBDYW5jZWxOb3RpZmljYXRpb24udHlwZS5tZXRob2QpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhbmNlbElkID0gbWVzc2FnZS5wYXJhbXMuaWQ7XG4gICAgICAgICAgICBrbm93bkNhbmNlbGVkUmVxdWVzdHMuZGVsZXRlKGNhbmNlbElkKTtcbiAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWROb3RpZmljYXRpb24obWVzc2FnZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gbm90aWZpY2F0aW9uSGFuZGxlcnMuZ2V0KG1lc3NhZ2UubWV0aG9kKTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uSGFuZGxlciA9IGVsZW1lbnQuaGFuZGxlcjtcbiAgICAgICAgICAgICAgICB0eXBlID0gZWxlbWVudC50eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChub3RpZmljYXRpb25IYW5kbGVyIHx8IHN0YXJOb3RpZmljYXRpb25IYW5kbGVyKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWROb3RpZmljYXRpb24obWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgaWYgKG5vdGlmaWNhdGlvbkhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UucGFyYW1zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5udW1iZXJPZlBhcmFtcyAhPT0gMCAmJiB0eXBlLnBhcmFtZXRlclN0cnVjdHVyZXMgIT09IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBOb3RpZmljYXRpb24gJHttZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyAke3R5cGUubnVtYmVyT2ZQYXJhbXN9IHBhcmFtcyBidXQgcmVjZWl2ZWQgbm9uZS5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShtZXNzYWdlLnBhcmFtcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGFyZSBKU09OLVJQQyBsaWJyYXJpZXMgdGhhdCBzZW5kIHByb2dyZXNzIG1lc3NhZ2UgYXMgcG9zaXRpb25hbCBwYXJhbXMgYWx0aG91Z2hcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpZmllZCBhcyBuYW1lZC4gU28gY29udmVydCB0aGVtIGlmIHRoaXMgaXMgdGhlIGNhc2UuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBtZXNzYWdlLnBhcmFtcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLm1ldGhvZCA9PT0gUHJvZ3Jlc3NOb3RpZmljYXRpb24udHlwZS5tZXRob2QgJiYgcGFyYW1zLmxlbmd0aCA9PT0gMiAmJiBQcm9ncmVzc1Rva2VuLmlzKHBhcmFtc1swXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKHsgdG9rZW46IHBhcmFtc1swXSwgdmFsdWU6IHBhcmFtc1sxXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUucGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBOb3RpZmljYXRpb24gJHttZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyBwYXJhbWV0ZXJzIGJ5IG5hbWUgYnV0IHJlY2VpdmVkIHBhcmFtZXRlcnMgYnkgcG9zaXRpb25gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5udW1iZXJPZlBhcmFtcyAhPT0gbWVzc2FnZS5wYXJhbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYE5vdGlmaWNhdGlvbiAke21lc3NhZ2UubWV0aG9kfSBkZWZpbmVzICR7dHlwZS5udW1iZXJPZlBhcmFtc30gcGFyYW1zIGJ1dCByZWNlaXZlZCAke3BhcmFtcy5sZW5ndGh9IGFyZ3VtZW50c2ApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXIoLi4ucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS5wYXJhbWV0ZXJTdHJ1Y3R1cmVzID09PSBtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgTm90aWZpY2F0aW9uICR7bWVzc2FnZS5tZXRob2R9IGRlZmluZXMgcGFyYW1ldGVycyBieSBwb3NpdGlvbiBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBuYW1lYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKG1lc3NhZ2UucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGFyTm90aWZpY2F0aW9uSGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICBzdGFyTm90aWZpY2F0aW9uSGFuZGxlcihtZXNzYWdlLm1ldGhvZCwgbWVzc2FnZS5wYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvci5tZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgTm90aWZpY2F0aW9uIGhhbmRsZXIgJyR7bWVzc2FnZS5tZXRob2R9JyBmYWlsZWQgd2l0aCBtZXNzYWdlOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYE5vdGlmaWNhdGlvbiBoYW5kbGVyICcke21lc3NhZ2UubWV0aG9kfScgZmFpbGVkIHVuZXhwZWN0ZWRseS5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1bmhhbmRsZWROb3RpZmljYXRpb25FbWl0dGVyLmZpcmUobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlSW52YWxpZE1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignUmVjZWl2ZWQgZW1wdHkgbWVzc2FnZS4nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsb2dnZXIuZXJyb3IoYFJlY2VpdmVkIG1lc3NhZ2Ugd2hpY2ggaXMgbmVpdGhlciBhIHJlc3BvbnNlIG5vciBhIG5vdGlmaWNhdGlvbiBtZXNzYWdlOlxcbiR7SlNPTi5zdHJpbmdpZnkobWVzc2FnZSwgbnVsbCwgNCl9YCk7XG4gICAgICAgIC8vIFRlc3Qgd2hldGhlciB3ZSBmaW5kIGFuIGlkIHRvIHJlamVjdCB0aGUgcHJvbWlzZVxuICAgICAgICBjb25zdCByZXNwb25zZU1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICBpZiAoSXMuc3RyaW5nKHJlc3BvbnNlTWVzc2FnZS5pZCkgfHwgSXMubnVtYmVyKHJlc3BvbnNlTWVzc2FnZS5pZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHJlc3BvbnNlTWVzc2FnZS5pZDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxlciA9IHJlc3BvbnNlUHJvbWlzZXMuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VIYW5kbGVyLnJlamVjdChuZXcgRXJyb3IoJ1RoZSByZWNlaXZlZCByZXNwb25zZSBoYXMgbmVpdGhlciBhIHJlc3VsdCBub3IgYW4gZXJyb3IgcHJvcGVydHkuJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0cmluZ2lmeVRyYWNlKHBhcmFtcykge1xuICAgICAgICBpZiAocGFyYW1zID09PSB1bmRlZmluZWQgfHwgcGFyYW1zID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAodHJhY2UpIHtcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuVmVyYm9zZTpcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGFyYW1zLCBudWxsLCA0KTtcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuQ29tcGFjdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGFyYW1zKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVNlbmRpbmdSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFjZUZvcm1hdCA9PT0gVHJhY2VGb3JtYXQuVGV4dCkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSAmJiBtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBgUGFyYW1zOiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucGFyYW1zKX1cXG5cXG5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJhY2VyLmxvZyhgU2VuZGluZyByZXF1ZXN0ICcke21lc3NhZ2UubWV0aG9kfSAtICgke21lc3NhZ2UuaWR9KScuYCwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb2dMU1BNZXNzYWdlKCdzZW5kLXJlcXVlc3QnLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVNlbmRpbmdOb3RpZmljYXRpb24obWVzc2FnZSkge1xuICAgICAgICBpZiAodHJhY2UgPT09IFRyYWNlLk9mZiB8fCAhdHJhY2VyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYWNlRm9ybWF0ID09PSBUcmFjZUZvcm1hdC5UZXh0KSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdCkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0gYFBhcmFtczogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLnBhcmFtcyl9XFxuXFxuYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSAnTm8gcGFyYW1ldGVycyBwcm92aWRlZC5cXG5cXG4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFNlbmRpbmcgbm90aWZpY2F0aW9uICcke21lc3NhZ2UubWV0aG9kfScuYCwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb2dMU1BNZXNzYWdlKCdzZW5kLW5vdGlmaWNhdGlvbicsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhY2VGb3JtYXQgPT09IFRyYWNlRm9ybWF0LlRleHQpIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZXJyb3IgJiYgbWVzc2FnZS5lcnJvci5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgRXJyb3IgZGF0YTogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLmVycm9yLmRhdGEpfVxcblxcbmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgUmVzdWx0OiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucmVzdWx0KX1cXG5cXG5gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UuZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9ICdObyByZXN1bHQgcmV0dXJuZWQuXFxuXFxuJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFNlbmRpbmcgcmVzcG9uc2UgJyR7bWV0aG9kfSAtICgke21lc3NhZ2UuaWR9KScuIFByb2Nlc3NpbmcgcmVxdWVzdCB0b29rICR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1tc2AsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgnc2VuZC1yZXNwb25zZScsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYWNlUmVjZWl2ZWRSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFjZUZvcm1hdCA9PT0gVHJhY2VGb3JtYXQuVGV4dCkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSAmJiBtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBgUGFyYW1zOiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucGFyYW1zKX1cXG5cXG5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJhY2VyLmxvZyhgUmVjZWl2ZWQgcmVxdWVzdCAnJHttZXNzYWdlLm1ldGhvZH0gLSAoJHttZXNzYWdlLmlkfSknLmAsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1yZXF1ZXN0JywgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdHJhY2VSZWNlaXZlZE5vdGlmaWNhdGlvbihtZXNzYWdlKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIgfHwgbWVzc2FnZS5tZXRob2QgPT09IExvZ1RyYWNlTm90aWZpY2F0aW9uLnR5cGUubWV0aG9kKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYWNlRm9ybWF0ID09PSBUcmFjZUZvcm1hdC5UZXh0KSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdCkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0gYFBhcmFtczogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLnBhcmFtcyl9XFxuXFxuYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSAnTm8gcGFyYW1ldGVycyBwcm92aWRlZC5cXG5cXG4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFJlY2VpdmVkIG5vdGlmaWNhdGlvbiAnJHttZXNzYWdlLm1ldGhvZH0nLmAsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1ub3RpZmljYXRpb24nLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVJlY2VpdmVkUmVzcG9uc2UobWVzc2FnZSwgcmVzcG9uc2VQcm9taXNlKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhY2VGb3JtYXQgPT09IFRyYWNlRm9ybWF0LlRleHQpIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZXJyb3IgJiYgbWVzc2FnZS5lcnJvci5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgRXJyb3IgZGF0YTogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLmVycm9yLmRhdGEpfVxcblxcbmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgUmVzdWx0OiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucmVzdWx0KX1cXG5cXG5gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UuZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9ICdObyByZXN1bHQgcmV0dXJuZWQuXFxuXFxuJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXNwb25zZVByb21pc2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IG1lc3NhZ2UuZXJyb3IgPyBgIFJlcXVlc3QgZmFpbGVkOiAke21lc3NhZ2UuZXJyb3IubWVzc2FnZX0gKCR7bWVzc2FnZS5lcnJvci5jb2RlfSkuYCA6ICcnO1xuICAgICAgICAgICAgICAgIHRyYWNlci5sb2coYFJlY2VpdmVkIHJlc3BvbnNlICcke3Jlc3BvbnNlUHJvbWlzZS5tZXRob2R9IC0gKCR7bWVzc2FnZS5pZH0pJyBpbiAke0RhdGUubm93KCkgLSByZXNwb25zZVByb21pc2UudGltZXJTdGFydH1tcy4ke2Vycm9yfWAsIGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJhY2VyLmxvZyhgUmVjZWl2ZWQgcmVzcG9uc2UgJHttZXNzYWdlLmlkfSB3aXRob3V0IGFjdGl2ZSByZXNwb25zZSBwcm9taXNlLmAsIGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1yZXNwb25zZScsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGxvZ0xTUE1lc3NhZ2UodHlwZSwgbWVzc2FnZSkge1xuICAgICAgICBpZiAoIXRyYWNlciB8fCB0cmFjZSA9PT0gVHJhY2UuT2ZmKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbHNwTWVzc2FnZSA9IHtcbiAgICAgICAgICAgIGlzTFNQTWVzc2FnZTogdHJ1ZSxcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpXG4gICAgICAgIH07XG4gICAgICAgIHRyYWNlci5sb2cobHNwTWVzc2FnZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRocm93SWZDbG9zZWRPckRpc3Bvc2VkKCkge1xuICAgICAgICBpZiAoaXNDbG9zZWQoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IENvbm5lY3Rpb25FcnJvcihDb25uZWN0aW9uRXJyb3JzLkNsb3NlZCwgJ0Nvbm5lY3Rpb24gaXMgY2xvc2VkLicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0Rpc3Bvc2VkKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb25uZWN0aW9uRXJyb3IoQ29ubmVjdGlvbkVycm9ycy5EaXNwb3NlZCwgJ0Nvbm5lY3Rpb24gaXMgZGlzcG9zZWQuJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdGhyb3dJZkxpc3RlbmluZygpIHtcbiAgICAgICAgaWYgKGlzTGlzdGVuaW5nKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb25uZWN0aW9uRXJyb3IoQ29ubmVjdGlvbkVycm9ycy5BbHJlYWR5TGlzdGVuaW5nLCAnQ29ubmVjdGlvbiBpcyBhbHJlYWR5IGxpc3RlbmluZycpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRocm93SWZOb3RMaXN0ZW5pbmcoKSB7XG4gICAgICAgIGlmICghaXNMaXN0ZW5pbmcoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYWxsIGxpc3RlbigpIGZpcnN0LicpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVuZGVmaW5lZFRvTnVsbChwYXJhbSkge1xuICAgICAgICBpZiAocGFyYW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyYW07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gbnVsbFRvVW5kZWZpbmVkKHBhcmFtKSB7XG4gICAgICAgIGlmIChwYXJhbSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJhbTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBpc05hbWVkUGFyYW0ocGFyYW0pIHtcbiAgICAgICAgcmV0dXJuIHBhcmFtICE9PSB1bmRlZmluZWQgJiYgcGFyYW0gIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkocGFyYW0pICYmIHR5cGVvZiBwYXJhbSA9PT0gJ29iamVjdCc7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXB1dGVTaW5nbGVQYXJhbShwYXJhbWV0ZXJTdHJ1Y3R1cmVzLCBwYXJhbSkge1xuICAgICAgICBzd2l0Y2ggKHBhcmFtZXRlclN0cnVjdHVyZXMpIHtcbiAgICAgICAgICAgIGNhc2UgbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG86XG4gICAgICAgICAgICAgICAgaWYgKGlzTmFtZWRQYXJhbShwYXJhbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxUb1VuZGVmaW5lZChwYXJhbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3VuZGVmaW5lZFRvTnVsbChwYXJhbSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZTpcbiAgICAgICAgICAgICAgICBpZiAoIWlzTmFtZWRQYXJhbShwYXJhbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWNlaXZlZCBwYXJhbWV0ZXJzIGJ5IG5hbWUgYnV0IHBhcmFtIGlzIG5vdCBhbiBvYmplY3QgbGl0ZXJhbC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGxUb1VuZGVmaW5lZChwYXJhbSk7XG4gICAgICAgICAgICBjYXNlIG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieVBvc2l0aW9uOlxuICAgICAgICAgICAgICAgIHJldHVybiBbdW5kZWZpbmVkVG9OdWxsKHBhcmFtKV07XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBwYXJhbWV0ZXIgc3RydWN0dXJlICR7cGFyYW1ldGVyU3RydWN0dXJlcy50b1N0cmluZygpfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXB1dGVNZXNzYWdlUGFyYW1zKHR5cGUsIHBhcmFtcykge1xuICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICBjb25zdCBudW1iZXJPZlBhcmFtcyA9IHR5cGUubnVtYmVyT2ZQYXJhbXM7XG4gICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gY29tcHV0ZVNpbmdsZVBhcmFtKHR5cGUucGFyYW1ldGVyU3RydWN0dXJlcywgcGFyYW1zWzBdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoICYmIGkgPCBudW1iZXJPZlBhcmFtczsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHVuZGVmaW5lZFRvTnVsbChwYXJhbXNbaV0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPCBudW1iZXJPZlBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gcGFyYW1zLmxlbmd0aDsgaSA8IG51bWJlck9mUGFyYW1zOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB7XG4gICAgICAgIHNlbmROb3RpZmljYXRpb246ICh0eXBlLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlUGFyYW1zO1xuICAgICAgICAgICAgaWYgKElzLnN0cmluZyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICAgIGxldCBwYXJhbVN0YXJ0ID0gMDtcbiAgICAgICAgICAgICAgICBsZXQgcGFyYW1ldGVyU3RydWN0dXJlcyA9IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvO1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuaXMoZmlyc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtU3RhcnQgPSAxO1xuICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gZmlyc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBwYXJhbUVuZCA9IGFyZ3MubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gcGFyYW1FbmQgLSBwYXJhbVN0YXJ0O1xuICAgICAgICAgICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zID0gY29tcHV0ZVNpbmdsZVBhcmFtKHBhcmFtZXRlclN0cnVjdHVyZXMsIGFyZ3NbcGFyYW1TdGFydF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjZWl2ZWQgJHtudW1iZXJPZlBhcmFtc30gcGFyYW1ldGVycyBmb3IgJ2J5IE5hbWUnIG5vdGlmaWNhdGlvbiBwYXJhbWV0ZXIgc3RydWN0dXJlLmApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IGFyZ3Muc2xpY2UocGFyYW1TdGFydCwgcGFyYW1FbmQpLm1hcCh2YWx1ZSA9PiB1bmRlZmluZWRUb051bGwodmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IGFyZ3M7XG4gICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZS5tZXRob2Q7XG4gICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IGNvbXB1dGVNZXNzYWdlUGFyYW1zKHR5cGUsIHBhcmFtcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBub3RpZmljYXRpb25NZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBtZXNzYWdlUGFyYW1zXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdHJhY2VTZW5kaW5nTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbk1lc3NhZ2UpO1xuICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2VXcml0ZXIud3JpdGUobm90aWZpY2F0aW9uTWVzc2FnZSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBTZW5kaW5nIG5vdGlmaWNhdGlvbiBmYWlsZWQuYCk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25Ob3RpZmljYXRpb246ICh0eXBlLCBoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGlmIChJcy5mdW5jKHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB0eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaGFuZGxlcikge1xuICAgICAgICAgICAgICAgIGlmIChJcy5zdHJpbmcodHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZTtcbiAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uSGFuZGxlcnMuc2V0KHR5cGUsIHsgdHlwZTogdW5kZWZpbmVkLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZS5tZXRob2Q7XG4gICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXJzLnNldCh0eXBlLm1ldGhvZCwgeyB0eXBlLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXJzLmRlbGV0ZShtZXRob2QpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBvblByb2dyZXNzOiAoX3R5cGUsIHRva2VuLCBoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgICBpZiAocHJvZ3Jlc3NIYW5kbGVycy5oYXModG9rZW4pKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm9ncmVzcyBoYW5kbGVyIGZvciB0b2tlbiAke3Rva2VufSBhbHJlYWR5IHJlZ2lzdGVyZWRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByb2dyZXNzSGFuZGxlcnMuc2V0KHRva2VuLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc0hhbmRsZXJzLmRlbGV0ZSh0b2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgc2VuZFByb2dyZXNzOiAoX3R5cGUsIHRva2VuLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGF3YWl0IGJ1dCBzaW1wbGUgcmV0dXJuIHRvIGVuc3VyZSB0aGF0IHdlIGRvbid0IGhhdmUgYW5vdGhlclxuICAgICAgICAgICAgLy8gYXN5bmMgc2NoZWR1bGluZy4gT3RoZXJ3aXNlIG9uZSBzZW5kIGNvdWxkIG92ZXJ0YWtlIGFub3RoZXIgc2VuZC5cbiAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLnNlbmROb3RpZmljYXRpb24oUHJvZ3Jlc3NOb3RpZmljYXRpb24udHlwZSwgeyB0b2tlbiwgdmFsdWUgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uVW5oYW5kbGVkUHJvZ3Jlc3M6IHVuaGFuZGxlZFByb2dyZXNzRW1pdHRlci5ldmVudCxcbiAgICAgICAgc2VuZFJlcXVlc3Q6ICh0eXBlLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgdGhyb3dJZk5vdExpc3RlbmluZygpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlUGFyYW1zO1xuICAgICAgICAgICAgbGV0IHRva2VuID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKElzLnN0cmluZyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3QgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgbGV0IHBhcmFtU3RhcnQgPSAwO1xuICAgICAgICAgICAgICAgIGxldCBwYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG87XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5pcyhmaXJzdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1TdGFydCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlclN0cnVjdHVyZXMgPSBmaXJzdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHBhcmFtRW5kID0gYXJncy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuLmlzKGxhc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtRW5kID0gcGFyYW1FbmQgLSAxO1xuICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IGxhc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gcGFyYW1FbmQgLSBwYXJhbVN0YXJ0O1xuICAgICAgICAgICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zID0gY29tcHV0ZVNpbmdsZVBhcmFtKHBhcmFtZXRlclN0cnVjdHVyZXMsIGFyZ3NbcGFyYW1TdGFydF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjZWl2ZWQgJHtudW1iZXJPZlBhcmFtc30gcGFyYW1ldGVycyBmb3IgJ2J5IE5hbWUnIHJlcXVlc3QgcGFyYW1ldGVyIHN0cnVjdHVyZS5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMgPSBhcmdzLnNsaWNlKHBhcmFtU3RhcnQsIHBhcmFtRW5kKS5tYXAodmFsdWUgPT4gdW5kZWZpbmVkVG9OdWxsKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBhcmdzO1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGUubWV0aG9kO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMgPSBjb21wdXRlTWVzc2FnZVBhcmFtcyh0eXBlLCBwYXJhbXMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gdHlwZS5udW1iZXJPZlBhcmFtcztcbiAgICAgICAgICAgICAgICB0b2tlbiA9IGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuLmlzKHBhcmFtc1tudW1iZXJPZlBhcmFtc10pID8gcGFyYW1zW251bWJlck9mUGFyYW1zXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGlkID0gc2VxdWVuY2VOdW1iZXIrKztcbiAgICAgICAgICAgIGxldCBkaXNwb3NhYmxlO1xuICAgICAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgICAgICAgZGlzcG9zYWJsZSA9IHRva2VuLm9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcCA9IGNhbmNlbGxhdGlvblN0cmF0ZWd5LnNlbmRlci5zZW5kQ2FuY2VsbGF0aW9uKGNvbm5lY3Rpb24sIGlkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhgUmVjZWl2ZWQgbm8gcHJvbWlzZSBmcm9tIGNhbmNlbGxhdGlvbiBzdHJhdGVneSB3aGVuIGNhbmNlbGxpbmcgaWQgJHtpZH1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIubG9nKGBTZW5kaW5nIGNhbmNlbGxhdGlvbiBtZXNzYWdlcyBmb3IgaWQgJHtpZH0gZmFpbGVkYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdE1lc3NhZ2UgPSB7XG4gICAgICAgICAgICAgICAganNvbnJwYzogdmVyc2lvbixcbiAgICAgICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBtZXNzYWdlUGFyYW1zXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdHJhY2VTZW5kaW5nUmVxdWVzdChyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNhbmNlbGxhdGlvblN0cmF0ZWd5LnNlbmRlci5lbmFibGVDYW5jZWxsYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25TdHJhdGVneS5zZW5kZXIuZW5hYmxlQ2FuY2VsbGF0aW9uKHJlcXVlc3RNZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZVdpdGhDbGVhbnVwID0gKHIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyKTtcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uU3RyYXRlZ3kuc2VuZGVyLmNsZWFudXAoaWQpO1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlPy5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWplY3RXaXRoQ2xlYW51cCA9IChyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChyKTtcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uU3RyYXRlZ3kuc2VuZGVyLmNsZWFudXAoaWQpO1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlPy5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZVByb21pc2UgPSB7IG1ldGhvZDogbWV0aG9kLCB0aW1lclN0YXJ0OiBEYXRlLm5vdygpLCByZXNvbHZlOiByZXNvbHZlV2l0aENsZWFudXAsIHJlamVjdDogcmVqZWN0V2l0aENsZWFudXAgfTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2VzLnNldChpZCwgcmVzcG9uc2VQcm9taXNlKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbWVzc2FnZVdyaXRlci53cml0ZShyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAvLyBXcml0aW5nIHRoZSBtZXNzYWdlIGZhaWxlZC4gU28gd2UgbmVlZCB0byBkZWxldGUgaXQgZnJvbSB0aGUgcmVzcG9uc2UgcHJvbWlzZXMgYW5kXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlamVjdCBpdC5cbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlcy5kZWxldGUoaWQpO1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2UucmVqZWN0KG5ldyBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IobWVzc2FnZXNfMS5FcnJvckNvZGVzLk1lc3NhZ2VXcml0ZUVycm9yLCBlcnJvci5tZXNzYWdlID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIHJlYXNvbicpKTtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlcXVlc3QgZmFpbGVkLmApO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25SZXF1ZXN0OiAodHlwZSwgaGFuZGxlcikgPT4ge1xuICAgICAgICAgICAgdGhyb3dJZkNsb3NlZE9yRGlzcG9zZWQoKTtcbiAgICAgICAgICAgIGxldCBtZXRob2QgPSBudWxsO1xuICAgICAgICAgICAgaWYgKFN0YXJSZXF1ZXN0SGFuZGxlci5pcyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBzdGFyUmVxdWVzdEhhbmRsZXIgPSB0eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoSXMuc3RyaW5nKHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgbWV0aG9kID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoaGFuZGxlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RIYW5kbGVycy5zZXQodHlwZSwgeyBoYW5kbGVyOiBoYW5kbGVyLCB0eXBlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSB0eXBlLm1ldGhvZDtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEhhbmRsZXJzLnNldCh0eXBlLm1ldGhvZCwgeyB0eXBlLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SGFuZGxlcnMuZGVsZXRlKG1ldGhvZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFyUmVxdWVzdEhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBoYXNQZW5kaW5nUmVzcG9uc2U6ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZVByb21pc2VzLnNpemUgPiAwO1xuICAgICAgICB9LFxuICAgICAgICB0cmFjZTogYXN5bmMgKF92YWx1ZSwgX3RyYWNlciwgc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBsZXQgX3NlbmROb3RpZmljYXRpb24gPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBfdHJhY2VGb3JtYXQgPSBUcmFjZUZvcm1hdC5UZXh0O1xuICAgICAgICAgICAgaWYgKHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKElzLmJvb2xlYW4oc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zKSkge1xuICAgICAgICAgICAgICAgICAgICBfc2VuZE5vdGlmaWNhdGlvbiA9IHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF9zZW5kTm90aWZpY2F0aW9uID0gc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zLnNlbmROb3RpZmljYXRpb24gfHwgZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIF90cmFjZUZvcm1hdCA9IHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucy50cmFjZUZvcm1hdCB8fCBUcmFjZUZvcm1hdC5UZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlID0gX3ZhbHVlO1xuICAgICAgICAgICAgdHJhY2VGb3JtYXQgPSBfdHJhY2VGb3JtYXQ7XG4gICAgICAgICAgICBpZiAodHJhY2UgPT09IFRyYWNlLk9mZikge1xuICAgICAgICAgICAgICAgIHRyYWNlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRyYWNlciA9IF90cmFjZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoX3NlbmROb3RpZmljYXRpb24gJiYgIWlzQ2xvc2VkKCkgJiYgIWlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGNvbm5lY3Rpb24uc2VuZE5vdGlmaWNhdGlvbihTZXRUcmFjZU5vdGlmaWNhdGlvbi50eXBlLCB7IHZhbHVlOiBUcmFjZS50b1N0cmluZyhfdmFsdWUpIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBvbkVycm9yOiBlcnJvckVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIG9uQ2xvc2U6IGNsb3NlRW1pdHRlci5ldmVudCxcbiAgICAgICAgb25VbmhhbmRsZWROb3RpZmljYXRpb246IHVuaGFuZGxlZE5vdGlmaWNhdGlvbkVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIG9uRGlzcG9zZTogZGlzcG9zZUVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIGVuZDogKCkgPT4ge1xuICAgICAgICAgICAgbWVzc2FnZVdyaXRlci5lbmQoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLkRpc3Bvc2VkO1xuICAgICAgICAgICAgZGlzcG9zZUVtaXR0ZXIuZmlyZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5QZW5kaW5nUmVzcG9uc2VSZWplY3RlZCwgJ1BlbmRpbmcgcmVzcG9uc2UgcmVqZWN0ZWQgc2luY2UgY29ubmVjdGlvbiBnb3QgZGlzcG9zZWQnKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvbWlzZSBvZiByZXNwb25zZVByb21pc2VzLnZhbHVlcygpKSB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBrbm93bkNhbmNlbGVkUmVxdWVzdHMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICBtZXNzYWdlUXVldWUgPSBuZXcgbGlua2VkTWFwXzEuTGlua2VkTWFwKCk7XG4gICAgICAgICAgICAvLyBUZXN0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgaWYgKElzLmZ1bmMobWVzc2FnZVdyaXRlci5kaXNwb3NlKSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKElzLmZ1bmMobWVzc2FnZVJlYWRlci5kaXNwb3NlKSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VSZWFkZXIuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBsaXN0ZW46ICgpID0+IHtcbiAgICAgICAgICAgIHRocm93SWZDbG9zZWRPckRpc3Bvc2VkKCk7XG4gICAgICAgICAgICB0aHJvd0lmTGlzdGVuaW5nKCk7XG4gICAgICAgICAgICBzdGF0ZSA9IENvbm5lY3Rpb25TdGF0ZS5MaXN0ZW5pbmc7XG4gICAgICAgICAgICBtZXNzYWdlUmVhZGVyLmxpc3RlbihjYWxsYmFjayk7XG4gICAgICAgIH0sXG4gICAgICAgIGluc3BlY3Q6ICgpID0+IHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS5jb25zb2xlLmxvZygnaW5zcGVjdCcpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25uZWN0aW9uLm9uTm90aWZpY2F0aW9uKExvZ1RyYWNlTm90aWZpY2F0aW9uLnR5cGUsIChwYXJhbXMpID0+IHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZlcmJvc2UgPSB0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdDtcbiAgICAgICAgdHJhY2VyLmxvZyhwYXJhbXMubWVzc2FnZSwgdmVyYm9zZSA/IHBhcmFtcy52ZXJib3NlIDogdW5kZWZpbmVkKTtcbiAgICB9KTtcbiAgICBjb25uZWN0aW9uLm9uTm90aWZpY2F0aW9uKFByb2dyZXNzTm90aWZpY2F0aW9uLnR5cGUsIChwYXJhbXMpID0+IHtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IHByb2dyZXNzSGFuZGxlcnMuZ2V0KHBhcmFtcy50b2tlbik7XG4gICAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICAgICBoYW5kbGVyKHBhcmFtcy52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1bmhhbmRsZWRQcm9ncmVzc0VtaXR0ZXIuZmlyZShwYXJhbXMpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbm5lY3Rpb247XG59XG5leHBvcnRzLmNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uID0gY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb247XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vdHlwaW5ncy90aGVuYWJsZS5kLnRzXCIgLz5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUHJvZ3Jlc3NUeXBlID0gZXhwb3J0cy5Qcm9ncmVzc1Rva2VuID0gZXhwb3J0cy5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiA9IGV4cG9ydHMuTnVsbExvZ2dlciA9IGV4cG9ydHMuQ29ubmVjdGlvbk9wdGlvbnMgPSBleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IGV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlQnVmZmVyID0gZXhwb3J0cy5Xcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyID0gZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLk1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLlJlYWRhYmxlU3RyZWFtTWVzc2FnZVJlYWRlciA9IGV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlUmVhZGVyID0gZXhwb3J0cy5NZXNzYWdlUmVhZGVyID0gZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblRva2VuID0gZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IGV4cG9ydHMuRW1pdHRlciA9IGV4cG9ydHMuRXZlbnQgPSBleHBvcnRzLkRpc3Bvc2FibGUgPSBleHBvcnRzLkxSVUNhY2hlID0gZXhwb3J0cy5Ub3VjaCA9IGV4cG9ydHMuTGlua2VkTWFwID0gZXhwb3J0cy5QYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlOSA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTggPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU3ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNiA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTUgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU0ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMyA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTIgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUxID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMCA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZSA9IGV4cG9ydHMuRXJyb3JDb2RlcyA9IGV4cG9ydHMuUmVzcG9uc2VFcnJvciA9IGV4cG9ydHMuUmVxdWVzdFR5cGU5ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTggPSBleHBvcnRzLlJlcXVlc3RUeXBlNyA9IGV4cG9ydHMuUmVxdWVzdFR5cGU2ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTUgPSBleHBvcnRzLlJlcXVlc3RUeXBlNCA9IGV4cG9ydHMuUmVxdWVzdFR5cGUzID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTIgPSBleHBvcnRzLlJlcXVlc3RUeXBlMSA9IGV4cG9ydHMuUmVxdWVzdFR5cGUwID0gZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IGV4cG9ydHMuTWVzc2FnZSA9IGV4cG9ydHMuUkFMID0gdm9pZCAwO1xuZXhwb3J0cy5NZXNzYWdlU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblN0cmF0ZWd5ID0gZXhwb3J0cy5DYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IGV4cG9ydHMuQ29ubmVjdGlvbkVycm9yID0gZXhwb3J0cy5Db25uZWN0aW9uRXJyb3JzID0gZXhwb3J0cy5Mb2dUcmFjZU5vdGlmaWNhdGlvbiA9IGV4cG9ydHMuU2V0VHJhY2VOb3RpZmljYXRpb24gPSBleHBvcnRzLlRyYWNlRm9ybWF0ID0gZXhwb3J0cy5UcmFjZVZhbHVlcyA9IGV4cG9ydHMuVHJhY2UgPSB2b2lkIDA7XG5jb25zdCBtZXNzYWdlc18xID0gcmVxdWlyZShcIi4vbWVzc2FnZXNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNZXNzYWdlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk1lc3NhZ2U7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlMFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTA7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTFcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGUxOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGUyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlMjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlM1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGU0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGU1XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlNTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlNlwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTY7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTdcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGU3OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGU4XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlODsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlOVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTk7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXNwb25zZUVycm9yXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3I7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJFcnJvckNvZGVzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLkVycm9yQ29kZXM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlMFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlMDsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGUxXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGUxOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZTJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlM1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlMzsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGU0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZTVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlNlwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlNjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGU3XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU3OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZThcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTg7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlOVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlOTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlBhcmFtZXRlclN0cnVjdHVyZXNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlczsgfSB9KTtcbmNvbnN0IGxpbmtlZE1hcF8xID0gcmVxdWlyZShcIi4vbGlua2VkTWFwXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTGlua2VkTWFwXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBsaW5rZWRNYXBfMS5MaW5rZWRNYXA7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJMUlVDYWNoZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbGlua2VkTWFwXzEuTFJVQ2FjaGU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJUb3VjaFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbGlua2VkTWFwXzEuVG91Y2g7IH0gfSk7XG5jb25zdCBkaXNwb3NhYmxlXzEgPSByZXF1aXJlKFwiLi9kaXNwb3NhYmxlXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiRGlzcG9zYWJsZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZGlzcG9zYWJsZV8xLkRpc3Bvc2FibGU7IH0gfSk7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCIuL2V2ZW50c1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkV2ZW50XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBldmVudHNfMS5FdmVudDsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkVtaXR0ZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGV2ZW50c18xLkVtaXR0ZXI7IH0gfSk7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblRva2VuU291cmNlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjYW5jZWxsYXRpb25fMS5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblRva2VuXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjYW5jZWxsYXRpb25fMS5DYW5jZWxsYXRpb25Ub2tlbjsgfSB9KTtcbmNvbnN0IHNoYXJlZEFycmF5Q2FuY2VsbGF0aW9uXzEgPSByZXF1aXJlKFwiLi9zaGFyZWRBcnJheUNhbmNlbGxhdGlvblwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHNoYXJlZEFycmF5Q2FuY2VsbGF0aW9uXzEuU2hhcmVkQXJyYXlTZW5kZXJTdHJhdGVneTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlNoYXJlZEFycmF5UmVjZWl2ZXJTdHJhdGVneVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gc2hhcmVkQXJyYXlDYW5jZWxsYXRpb25fMS5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3k7IH0gfSk7XG5jb25zdCBtZXNzYWdlUmVhZGVyXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlUmVhZGVyXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTWVzc2FnZVJlYWRlclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZVJlYWRlcl8xLk1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VSZWFkZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VSZWFkZXJfMS5BYnN0cmFjdE1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VSZWFkZXJfMS5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5jb25zdCBtZXNzYWdlV3JpdGVyXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlV3JpdGVyXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTWVzc2FnZVdyaXRlclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZVdyaXRlcl8xLk1lc3NhZ2VXcml0ZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VXcml0ZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VXcml0ZXJfMS5BYnN0cmFjdE1lc3NhZ2VXcml0ZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJXcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlV3JpdGVyXzEuV3JpdGVhYmxlU3RyZWFtTWVzc2FnZVdyaXRlcjsgfSB9KTtcbmNvbnN0IG1lc3NhZ2VCdWZmZXJfMSA9IHJlcXVpcmUoXCIuL21lc3NhZ2VCdWZmZXJcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VCdWZmZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VCdWZmZXJfMS5BYnN0cmFjdE1lc3NhZ2VCdWZmZXI7IH0gfSk7XG5jb25zdCBjb25uZWN0aW9uXzEgPSByZXF1aXJlKFwiLi9jb25uZWN0aW9uXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29ubmVjdGlvblN0cmF0ZWd5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ29ubmVjdGlvblN0cmF0ZWd5OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29ubmVjdGlvbk9wdGlvbnNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5Db25uZWN0aW9uT3B0aW9uczsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk51bGxMb2dnZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5OdWxsTG9nZ2VyOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb25cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlByb2dyZXNzVG9rZW5cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5Qcm9ncmVzc1Rva2VuOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUHJvZ3Jlc3NUeXBlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuUHJvZ3Jlc3NUeXBlOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiVHJhY2VcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5UcmFjZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlRyYWNlVmFsdWVzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuVHJhY2VWYWx1ZXM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJUcmFjZUZvcm1hdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29ubmVjdGlvbl8xLlRyYWNlRm9ybWF0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiU2V0VHJhY2VOb3RpZmljYXRpb25cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5TZXRUcmFjZU5vdGlmaWNhdGlvbjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkxvZ1RyYWNlTm90aWZpY2F0aW9uXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuTG9nVHJhY2VOb3RpZmljYXRpb247IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJDb25uZWN0aW9uRXJyb3JzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ29ubmVjdGlvbkVycm9yczsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNvbm5lY3Rpb25FcnJvclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29ubmVjdGlvbl8xLkNvbm5lY3Rpb25FcnJvcjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5DYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5DYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblN0cmF0ZWd5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ2FuY2VsbGF0aW9uU3RyYXRlZ3k7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNZXNzYWdlU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5NZXNzYWdlU3RyYXRlZ3k7IH0gfSk7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbmV4cG9ydHMuUkFMID0gcmFsXzEuZGVmYXVsdDtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGFwaV8xID0gcmVxdWlyZShcIi4uL2NvbW1vbi9hcGlcIik7XG5jbGFzcyBNZXNzYWdlQnVmZmVyIGV4dGVuZHMgYXBpXzEuQWJzdHJhY3RNZXNzYWdlQnVmZmVyIHtcbiAgICBjb25zdHJ1Y3RvcihlbmNvZGluZyA9ICd1dGYtOCcpIHtcbiAgICAgICAgc3VwZXIoZW5jb2RpbmcpO1xuICAgICAgICB0aGlzLmFzY2lpRGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcignYXNjaWknKTtcbiAgICB9XG4gICAgZW1wdHlCdWZmZXIoKSB7XG4gICAgICAgIHJldHVybiBNZXNzYWdlQnVmZmVyLmVtcHR5QnVmZmVyO1xuICAgIH1cbiAgICBmcm9tU3RyaW5nKHZhbHVlLCBfZW5jb2RpbmcpIHtcbiAgICAgICAgcmV0dXJuIChuZXcgVGV4dEVuY29kZXIoKSkuZW5jb2RlKHZhbHVlKTtcbiAgICB9XG4gICAgdG9TdHJpbmcodmFsdWUsIGVuY29kaW5nKSB7XG4gICAgICAgIGlmIChlbmNvZGluZyA9PT0gJ2FzY2lpJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXNjaWlEZWNvZGVyLmRlY29kZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gKG5ldyBUZXh0RGVjb2RlcihlbmNvZGluZykpLmRlY29kZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXNOYXRpdmUoYnVmZmVyLCBsZW5ndGgpIHtcbiAgICAgICAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlci5zbGljZSgwLCBsZW5ndGgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFsbG9jTmF0aXZlKGxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTtcbiAgICB9XG59XG5NZXNzYWdlQnVmZmVyLmVtcHR5QnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMCk7XG5jbGFzcyBSZWFkYWJsZVN0cmVhbVdyYXBwZXIge1xuICAgIGNvbnN0cnVjdG9yKHNvY2tldCkge1xuICAgICAgICB0aGlzLnNvY2tldCA9IHNvY2tldDtcbiAgICAgICAgdGhpcy5fb25EYXRhID0gbmV3IGFwaV8xLkVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5fbWVzc2FnZUxpc3RlbmVyID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBibG9iID0gZXZlbnQuZGF0YTtcbiAgICAgICAgICAgIGJsb2IuYXJyYXlCdWZmZXIoKS50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkRhdGEuZmlyZShuZXcgVWludDhBcnJheShidWZmZXIpKTtcbiAgICAgICAgICAgIH0sICgpID0+IHtcbiAgICAgICAgICAgICAgICAoMCwgYXBpXzEuUkFMKSgpLmNvbnNvbGUuZXJyb3IoYENvbnZlcnRpbmcgYmxvYiB0byBhcnJheSBidWZmZXIgZmFpbGVkLmApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLl9tZXNzYWdlTGlzdGVuZXIpO1xuICAgIH1cbiAgICBvbkNsb3NlKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2Nsb3NlJywgbGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gYXBpXzEuRGlzcG9zYWJsZS5jcmVhdGUoKCkgPT4gdGhpcy5zb2NrZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xvc2UnLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkVycm9yKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgbGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gYXBpXzEuRGlzcG9zYWJsZS5jcmVhdGUoKCkgPT4gdGhpcy5zb2NrZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkVuZChsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKCdlbmQnLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdlbmQnLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkRhdGEobGlzdGVuZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uRGF0YS5ldmVudChsaXN0ZW5lcik7XG4gICAgfVxufVxuY2xhc3MgV3JpdGFibGVTdHJlYW1XcmFwcGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihzb2NrZXQpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7XG4gICAgfVxuICAgIG9uQ2xvc2UobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignY2xvc2UnLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbG9zZScsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIG9uRXJyb3IobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIG9uRW5kKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2VuZCcsIGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIGFwaV8xLkRpc3Bvc2FibGUuY3JlYXRlKCgpID0+IHRoaXMuc29ja2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2VuZCcsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIHdyaXRlKGRhdGEsIGVuY29kaW5nKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkICYmIGVuY29kaW5nICE9PSAndXRmLTgnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbiBhIEJyb3dzZXIgZW52aXJvbm1lbnRzIG9ubHkgdXRmLTggdGV4dCBlbmNvZGluZyBpcyBzdXBwb3J0ZWQuIEJ1dCBnb3QgZW5jb2Rpbmc6ICR7ZW5jb2Rpbmd9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKTtcbiAgICB9XG59XG5jb25zdCBfdGV4dEVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbmNvbnN0IF9yaWwgPSBPYmplY3QuZnJlZXplKHtcbiAgICBtZXNzYWdlQnVmZmVyOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgY3JlYXRlOiAoZW5jb2RpbmcpID0+IG5ldyBNZXNzYWdlQnVmZmVyKGVuY29kaW5nKVxuICAgIH0pLFxuICAgIGFwcGxpY2F0aW9uSnNvbjogT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGVuY29kZXI6IE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgbmFtZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgZW5jb2RlOiAobXNnLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2hhcnNldCAhPT0gJ3V0Zi04Jykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluIGEgQnJvd3NlciBlbnZpcm9ubWVudHMgb25seSB1dGYtOCB0ZXh0IGVuY29kaW5nIGlzIHN1cHBvcnRlZC4gQnV0IGdvdCBlbmNvZGluZzogJHtvcHRpb25zLmNoYXJzZXR9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoX3RleHRFbmNvZGVyLmVuY29kZShKU09OLnN0cmluZ2lmeShtc2csIHVuZGVmaW5lZCwgMCkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIGRlY29kZXI6IE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgbmFtZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgZGVjb2RlOiAoYnVmZmVyLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCEoYnVmZmVyIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbiBhIEJyb3dzZXIgZW52aXJvbm1lbnRzIG9ubHkgVWludDhBcnJheXMgYXJlIHN1cHBvcnRlZC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShKU09OLnBhcnNlKG5ldyBUZXh0RGVjb2RlcihvcHRpb25zLmNoYXJzZXQpLmRlY29kZShidWZmZXIpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfSksXG4gICAgc3RyZWFtOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgYXNSZWFkYWJsZVN0cmVhbTogKHNvY2tldCkgPT4gbmV3IFJlYWRhYmxlU3RyZWFtV3JhcHBlcihzb2NrZXQpLFxuICAgICAgICBhc1dyaXRhYmxlU3RyZWFtOiAoc29ja2V0KSA9PiBuZXcgV3JpdGFibGVTdHJlYW1XcmFwcGVyKHNvY2tldClcbiAgICB9KSxcbiAgICBjb25zb2xlOiBjb25zb2xlLFxuICAgIHRpbWVyOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgc2V0VGltZW91dChjYWxsYmFjaywgbXMsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHNldFRpbWVvdXQoY2FsbGJhY2ssIG1zLCAuLi5hcmdzKTtcbiAgICAgICAgICAgIHJldHVybiB7IGRpc3Bvc2U6ICgpID0+IGNsZWFyVGltZW91dChoYW5kbGUpIH07XG4gICAgICAgIH0sXG4gICAgICAgIHNldEltbWVkaWF0ZShjYWxsYmFjaywgLi4uYXJncykge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gc2V0VGltZW91dChjYWxsYmFjaywgMCwgLi4uYXJncyk7XG4gICAgICAgICAgICByZXR1cm4geyBkaXNwb3NlOiAoKSA9PiBjbGVhclRpbWVvdXQoaGFuZGxlKSB9O1xuICAgICAgICB9LFxuICAgICAgICBzZXRJbnRlcnZhbChjYWxsYmFjaywgbXMsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHNldEludGVydmFsKGNhbGxiYWNrLCBtcywgLi4uYXJncyk7XG4gICAgICAgICAgICByZXR1cm4geyBkaXNwb3NlOiAoKSA9PiBjbGVhckludGVydmFsKGhhbmRsZSkgfTtcbiAgICAgICAgfSxcbiAgICB9KVxufSk7XG5mdW5jdGlvbiBSSUwoKSB7XG4gICAgcmV0dXJuIF9yaWw7XG59XG4oZnVuY3Rpb24gKFJJTCkge1xuICAgIGZ1bmN0aW9uIGluc3RhbGwoKSB7XG4gICAgICAgIGFwaV8xLlJBTC5pbnN0YWxsKF9yaWwpO1xuICAgIH1cbiAgICBSSUwuaW5zdGFsbCA9IGluc3RhbGw7XG59KShSSUwgfHwgKFJJTCA9IHt9KSk7XG5leHBvcnRzLmRlZmF1bHQgPSBSSUw7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24gPSBleHBvcnRzLkJyb3dzZXJNZXNzYWdlV3JpdGVyID0gZXhwb3J0cy5Ccm93c2VyTWVzc2FnZVJlYWRlciA9IHZvaWQgMDtcbmNvbnN0IHJpbF8xID0gcmVxdWlyZShcIi4vcmlsXCIpO1xuLy8gSW5zdGFsbCB0aGUgYnJvd3NlciBydW50aW1lIGFic3RyYWN0LlxucmlsXzEuZGVmYXVsdC5pbnN0YWxsKCk7XG5jb25zdCBhcGlfMSA9IHJlcXVpcmUoXCIuLi9jb21tb24vYXBpXCIpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuLi9jb21tb24vYXBpXCIpLCBleHBvcnRzKTtcbmNsYXNzIEJyb3dzZXJNZXNzYWdlUmVhZGVyIGV4dGVuZHMgYXBpXzEuQWJzdHJhY3RNZXNzYWdlUmVhZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihwb3J0KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX29uRGF0YSA9IG5ldyBhcGlfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuX21lc3NhZ2VMaXN0ZW5lciA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fb25EYXRhLmZpcmUoZXZlbnQuZGF0YSk7XG4gICAgICAgIH07XG4gICAgICAgIHBvcnQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoZXZlbnQpID0+IHRoaXMuZmlyZUVycm9yKGV2ZW50KSk7XG4gICAgICAgIHBvcnQub25tZXNzYWdlID0gdGhpcy5fbWVzc2FnZUxpc3RlbmVyO1xuICAgIH1cbiAgICBsaXN0ZW4oY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uRGF0YS5ldmVudChjYWxsYmFjayk7XG4gICAgfVxufVxuZXhwb3J0cy5Ccm93c2VyTWVzc2FnZVJlYWRlciA9IEJyb3dzZXJNZXNzYWdlUmVhZGVyO1xuY2xhc3MgQnJvd3Nlck1lc3NhZ2VXcml0ZXIgZXh0ZW5kcyBhcGlfMS5BYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKHBvcnQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50ID0gMDtcbiAgICAgICAgcG9ydC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIChldmVudCkgPT4gdGhpcy5maXJlRXJyb3IoZXZlbnQpKTtcbiAgICB9XG4gICAgd3JpdGUobXNnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnBvcnQucG9zdE1lc3NhZ2UobXNnKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IsIG1zZyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZUVycm9yKGVycm9yLCBtc2cpIHtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50Kys7XG4gICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yLCBtc2csIHRoaXMuZXJyb3JDb3VudCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICB9XG59XG5leHBvcnRzLkJyb3dzZXJNZXNzYWdlV3JpdGVyID0gQnJvd3Nlck1lc3NhZ2VXcml0ZXI7XG5mdW5jdGlvbiBjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbihyZWFkZXIsIHdyaXRlciwgbG9nZ2VyLCBvcHRpb25zKSB7XG4gICAgaWYgKGxvZ2dlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxvZ2dlciA9IGFwaV8xLk51bGxMb2dnZXI7XG4gICAgfVxuICAgIGlmIChhcGlfMS5Db25uZWN0aW9uU3RyYXRlZ3kuaXMob3B0aW9ucykpIHtcbiAgICAgICAgb3B0aW9ucyA9IHsgY29ubmVjdGlvblN0cmF0ZWd5OiBvcHRpb25zIH07XG4gICAgfVxuICAgIHJldHVybiAoMCwgYXBpXzEuY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24pKHJlYWRlciwgd3JpdGVyLCBsb2dnZXIsIG9wdGlvbnMpO1xufVxuZXhwb3J0cy5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiA9IGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uO1xuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL2Jyb3dzZXIvbWFpbicpOyIsICIvKlxuICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMjYgRWNsaXBzZSBEaXJpZ2libGUgY29udHJpYnV0b3JzXG4gKlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlXG4gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2Mi4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG4gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MjAuaHRtbFxuICpcbiAqIFNQRFgtRmlsZUNvcHlyaWdodFRleHQ6IEVjbGlwc2UgRGlyaWdpYmxlIGNvbnRyaWJ1dG9ycyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbi8qKlxuICogSmF2YSBMU1AgY2xpZW50IGJ1bmRsZS5cbiAqXG4gKiBVc2VzIHZzY29kZS13cy1qc29ucnBjIGZvciB0eXBlZCBKU09OLVJQQyBvdmVyIFdlYlNvY2tldCBhbmQgcmVnaXN0ZXJzIE1vbmFjb1xuICogcHJvdmlkZXJzIHRoYXQgZGVsZWdhdGUgdG8gSkRULkxTLiBFeHBvc2VkIGFzIGdsb2JhbCBKYXZhTHNwQ2xpZW50TGliIHNvIHRoYXRcbiAqIGVkaXRvci5qcyBjYW4gY2FsbCBKYXZhTHNwQ2xpZW50TGliLmNvbm5lY3QocmVzb3VyY2VQYXRoKS5cbiAqXG4gKiBPbmUgSkRULkxTIHByb2Nlc3MgY292ZXJzIHRoZSBlbnRpcmUgd29ya3NwYWNlLCBzbyBhIHNpbmdsZSBXZWJTb2NrZXQgY29ubmVjdGlvblxuICogaXMgc2hhcmVkIGFjcm9zcyBhbGwgSmF2YSBmaWxlcyBvcGVuIGluIHRoZSBzYW1lIGJyb3dzZXIgcGFnZS4gVGhlIGNvbm5lY3Rpb24gaXNcbiAqIGVzdGFibGlzaGVkIG9uIHRoZSBmaXJzdCBjb25uZWN0KCkgY2FsbCBhbmQgcmV1c2VkIGZvciBhbGwgc3Vic2VxdWVudCBjYWxscy5cbiAqXG4gKiBlZGl0b3IuanMgc2V0cyB3aW5kb3cubW9uYWNvIGJlZm9yZSBjYWxsaW5nIGNvbm5lY3QoKSwgc28gdGhlIG1vbmFjby1zaGltJ3MgbGF6eVxuICogUHJveGllcyByZXNvbHZlIGNvcnJlY3RseSBhdCBjYWxsIHRpbWUuXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24sIE1lc3NhZ2VDb25uZWN0aW9uIH0gZnJvbSAndnNjb2RlLWpzb25ycGMvYnJvd3Nlcic7XG5pbXBvcnQgeyB0b1NvY2tldCwgV2ViU29ja2V0TWVzc2FnZVJlYWRlciwgV2ViU29ja2V0TWVzc2FnZVdyaXRlciB9IGZyb20gJ3ZzY29kZS13cy1qc29ucnBjJztcbmltcG9ydCAqIGFzIG1vbmFjbyBmcm9tICdtb25hY28tZWRpdG9yJztcbmltcG9ydCB7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLFxuICAgIERpYWdub3N0aWNTZXZlcml0eSxcbiAgICBJbnNlcnRUZXh0Rm9ybWF0LFxuICAgIE1hcmt1cENvbnRlbnQsXG4gICAgTWFya3VwS2luZCxcbiAgICB0eXBlIENvZGVBY3Rpb24sXG4gICAgdHlwZSBDb21tYW5kLFxuICAgIHR5cGUgQ29tcGxldGlvbkl0ZW0sXG4gICAgdHlwZSBDb21wbGV0aW9uTGlzdCxcbiAgICB0eXBlIERpYWdub3N0aWMsXG4gICAgdHlwZSBIb3ZlcixcbiAgICB0eXBlIExvY2F0aW9uLFxuICAgIHR5cGUgUGFyYW1ldGVySW5mb3JtYXRpb24sXG4gICAgdHlwZSBTaWduYXR1cmVIZWxwLFxuICAgIHR5cGUgU2lnbmF0dXJlSW5mb3JtYXRpb24sXG4gICAgdHlwZSBUZXh0RWRpdCxcbiAgICB0eXBlIFdvcmtzcGFjZUVkaXQsXG59IGZyb20gJ3ZzY29kZS1sYW5ndWFnZXNlcnZlci10eXBlcyc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNpbmdsZXRvbiBzdGF0ZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogU2hhcmVkIGNvbm5lY3Rpb24gXHUyMDE0IG9uZSBwZXIgYnJvd3NlciBwYWdlLCBjb3ZlcmluZyBhbGwgcHJvamVjdHMgaW4gdGhlIHdvcmtzcGFjZS4gKi9cbmxldCBfY29ubjogTWVzc2FnZUNvbm5lY3Rpb24gfCBudWxsID0gbnVsbDtcblxuLyoqXG4gKiBWaXJ0dWFsIHdvcmtzcGFjZSByb290IFVSSSwgZS5nLiB7QGNvZGUgZmlsZTovLy93b3Jrc3BhY2Uvd29ya3NwYWNlL30uXG4gKiBTZXQgb25jZSBvbiBmaXJzdCBjb25uZWN0KCk7IHVzZWQgdG8gc2NvcGUgTW9uYWNvIHByb3ZpZGVycyB0byB3b3Jrc3BhY2UgZmlsZXMuXG4gKi9cbmxldCBfd29ya3NwYWNlUm9vdCA9ICcnO1xuXG4vKiogVVJJcyBmb3Igd2hpY2ggdGV4dERvY3VtZW50L2RpZE9wZW4gaGFzIGFscmVhZHkgYmVlbiBzZW50LiAqL1xuY29uc3QgX29wZW5GaWxlczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cbi8qKiBQZW5kaW5nIGRlYm91bmNlZCBkaWRDaGFuZ2UgdGltZXJzIHBlciBmaWxlIFVSSSwgc28gYSBjaGFuZ2UgY2FuIGJlIGZsdXNoZWQgYmVmb3JlIGNvbXBsZXRpb24uICovXG5jb25zdCBfY2hhbmdlVGltZXJzOiBNYXA8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0Pj4gPSBuZXcgTWFwKCk7XG5cbi8qKlxuICogTGFzdCBkaWFnbm9zdGljcyBwdWJsaXNoZWQgcGVyIGZpbGUgVVJJLCBrZXB0IHZlcmJhdGltICh3aXRoIHRoZWlyIExTUCBjb2RlL2RhdGEpLiBDb2RlLWFjdGlvblxuICogcmVxdWVzdHMgbXVzdCBzZW5kIHRoZXNlIFx1MjAxNCBKRFQuTFMgbWF0Y2hlcyBxdWljay1maXhlcyBieSB0aGUgZGlhZ25vc3RpYydzIGNvZGUvZGF0YSwgd2hpY2ggTW9uYWNvJ3NcbiAqIElNYXJrZXJEYXRhIGNhbm5vdCByb3VuZC10cmlwLCBzbyByZWNvbnN0cnVjdGluZyBkaWFnbm9zdGljcyBmcm9tIG1hcmtlcnMgeWllbGRzIG5vIHF1aWNrLWZpeGVzLlxuICovXG5jb25zdCBfZGlhZ25vc3RpY3M6IE1hcDxzdHJpbmcsIERpYWdub3N0aWNbXT4gPSBuZXcgTWFwKCk7XG5cbmxldCBfcHJvdmlkZXJzUmVnaXN0ZXJlZCA9IGZhbHNlO1xuXG4vKiogU2VtYW50aWMtdG9rZW4gbGVnZW5kIHJlcG9ydGVkIGJ5IEpEVC5MUyBpbiB0aGUgaW5pdGlhbGl6ZSByZXN1bHQ7IG5lZWRlZCB0byBkZWNvZGUgdG9rZW4gZGF0YS4gKi9cbmxldCBfc2VtYW50aWNUb2tlbnNMZWdlbmQ6IHsgdG9rZW5UeXBlczogc3RyaW5nW107IHRva2VuTW9kaWZpZXJzOiBzdHJpbmdbXSB9IHwgbnVsbCA9IG51bGw7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFB1YmxpYyBBUElcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIENhbGxlZCBieSBlZGl0b3IuanMgd2hlbiBhIEphdmEgZmlsZSBpcyBvcGVuZWQuIFNhZmUgdG8gY2FsbCBtdWx0aXBsZSB0aW1lcy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb25uZWN0KHJlc291cmNlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFydHMgPSByZXNvdXJjZVBhdGgucmVwbGFjZSgvXlxcLy8sICcnKS5zcGxpdCgnLycpO1xuICAgIGNvbnN0IHdvcmtzcGFjZSA9IHBhcnRzWzBdO1xuICAgIGNvbnN0IHByb2plY3QgICA9IHBhcnRzWzFdO1xuICAgIGNvbnN0IGZpbGVVcmkgPSBgZmlsZTovLy93b3Jrc3BhY2UvJHt3b3Jrc3BhY2V9LyR7cHJvamVjdH0vJHtwYXJ0cy5zbGljZSgyKS5qb2luKCcvJyl9YDtcblxuICAgIGlmIChfY29ubikge1xuICAgICAgICAvLyBDb25uZWN0aW9uIGFscmVhZHkgZXN0YWJsaXNoZWQgXHUyMDE0IGp1c3Qgb3BlbiB0aGUgbmV3IGZpbGUuXG4gICAgICAgIG9wZW5GaWxlKGZpbGVVcmkpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgX3dvcmtzcGFjZVJvb3QgPSBgZmlsZTovLy93b3Jrc3BhY2UvJHt3b3Jrc3BhY2V9L2A7XG5cbiAgICBjb25zdCBwcm90byA9IGxvY2F0aW9uLnByb3RvY29sID09PSAnaHR0cHM6JyA/ICd3c3MnIDogJ3dzJztcbiAgICBjb25zdCB3c1VybCA9IGAke3Byb3RvfTovLyR7bG9jYXRpb24uaG9zdH0vd2Vic29ja2V0cy9pZGUvamF2YS1sc3BgXG4gICAgICAgICAgICAgICAgKyBgP3dvcmtzcGFjZT0ke2VuY29kZVVSSUNvbXBvbmVudCh3b3Jrc3BhY2UpfWA7XG5cbiAgICBjb25zdCB3cyA9IG5ldyBXZWJTb2NrZXQod3NVcmwpO1xuICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgd3Mub25vcGVuICA9ICgpID0+IHJlc29sdmUoKTtcbiAgICAgICAgd3Mub25lcnJvciA9ICgpID0+IHJlamVjdChuZXcgRXJyb3IoYFtqYXZhLWxzcF0gV2ViU29ja2V0IGNvbm5lY3QgZmFpbGVkOiAke3dzVXJsfWApKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHNvY2tldCA9IHRvU29ja2V0KHdzKTtcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgV2ViU29ja2V0TWVzc2FnZVJlYWRlcihzb2NrZXQpO1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBXZWJTb2NrZXRNZXNzYWdlV3JpdGVyKHNvY2tldCk7XG4gICAgX2Nvbm4gPSBjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbihyZWFkZXIsIHdyaXRlcik7XG5cbiAgICAvLyBEaWFnbm9zdGljcyBub3RpZmljYXRpb24gXHUyMTkyIE1vbmFjbyBtYXJrZXJzIChhcHBsaWVzIHRvIGFueSB3b3Jrc3BhY2UgZmlsZSlcbiAgICBfY29ubi5vbk5vdGlmaWNhdGlvbigndGV4dERvY3VtZW50L3B1Ymxpc2hEaWFnbm9zdGljcycsIChwYXJhbXM6IHsgdXJpOiBzdHJpbmc7IGRpYWdub3N0aWNzOiBEaWFnbm9zdGljW10gfSkgPT4ge1xuICAgICAgICBfZGlhZ25vc3RpY3Muc2V0KHBhcmFtcy51cmksIHBhcmFtcy5kaWFnbm9zdGljcyA/PyBbXSk7XG4gICAgICAgIGNvbnN0IG1vZGVsID0gbW9uYWNvLmVkaXRvci5nZXRNb2RlbHMoKS5maW5kKG0gPT4gbS51cmkudG9TdHJpbmcoKSA9PT0gcGFyYW1zLnVyaSk7XG4gICAgICAgIGlmICghbW9kZWwpIHJldHVybjtcbiAgICAgICAgbW9uYWNvLmVkaXRvci5zZXRNb2RlbE1hcmtlcnMobW9kZWwsICdqYXZhLWxzcCcsIHBhcmFtcy5kaWFnbm9zdGljcy5tYXAoZCA9PiAoe1xuICAgICAgICAgICAgc2V2ZXJpdHk6ICAgICAgICBsc3BTZXZlcml0eShkLnNldmVyaXR5KSxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICAgICAgICAgZC5tZXNzYWdlLFxuICAgICAgICAgICAgc291cmNlOiAgICAgICAgICBkLnNvdXJjZSA/PyAnamF2YScsXG4gICAgICAgICAgICBzdGFydExpbmVOdW1iZXI6IGQucmFuZ2Uuc3RhcnQubGluZSArIDEsXG4gICAgICAgICAgICBzdGFydENvbHVtbjogICAgIGQucmFuZ2Uuc3RhcnQuY2hhcmFjdGVyICsgMSxcbiAgICAgICAgICAgIGVuZExpbmVOdW1iZXI6ICAgZC5yYW5nZS5lbmQubGluZSArIDEsXG4gICAgICAgICAgICBlbmRDb2x1bW46ICAgICAgIGQucmFuZ2UuZW5kLmNoYXJhY3RlciArIDEsXG4gICAgICAgIH0pKSk7XG4gICAgfSk7XG5cbiAgICAvLyBTZXJ2ZXIgLT4gY2xpZW50IHJlcXVlc3RzIHRoYXQgZHJpdmUgcmVmYWN0b3IgLyBnZW5lcmF0ZSByZXN1bHRzIGFuZCBkeW5hbWljIHJlZ2lzdHJhdGlvbi5cbiAgICBfY29ubi5vblJlcXVlc3QoJ3dvcmtzcGFjZS9hcHBseUVkaXQnLCAocGFyYW1zOiB7IGVkaXQ6IFdvcmtzcGFjZUVkaXQgfSkgPT4ge1xuICAgICAgICBhcHBseVdvcmtzcGFjZUVkaXQocGFyYW1zLmVkaXQpO1xuICAgICAgICByZXR1cm4geyBhcHBsaWVkOiB0cnVlIH07XG4gICAgfSk7XG4gICAgX2Nvbm4ub25SZXF1ZXN0KCd3b3Jrc3BhY2UvY29uZmlndXJhdGlvbicsIChwYXJhbXM6IHsgaXRlbXM6IEFycmF5PHsgc2VjdGlvbj86IHN0cmluZyB9PiB9KSA9PlxuICAgICAgICAocGFyYW1zLml0ZW1zID8/IFtdKS5tYXAoKCkgPT4gamR0bHNTZXR0aW5ncygpLmphdmEpKTtcbiAgICBfY29ubi5vblJlcXVlc3QoJ2NsaWVudC9yZWdpc3RlckNhcGFiaWxpdHknLCAoKSA9PiBudWxsKTtcbiAgICBfY29ubi5vblJlcXVlc3QoJ2NsaWVudC91bnJlZ2lzdGVyQ2FwYWJpbGl0eScsICgpID0+IG51bGwpO1xuICAgIF9jb25uLm9uUmVxdWVzdCgnd2luZG93L3Nob3dNZXNzYWdlUmVxdWVzdCcsICgpID0+IG51bGwpO1xuICAgIF9jb25uLm9uUmVxdWVzdCgnd2luZG93L3dvcmtEb25lUHJvZ3Jlc3MvY3JlYXRlJywgKCkgPT4gbnVsbCk7XG4gICAgX2Nvbm4ub25Ob3RpZmljYXRpb24oJ3dpbmRvdy9sb2dNZXNzYWdlJywgKHA6IHsgbWVzc2FnZTogc3RyaW5nIH0pID0+IGNvbnNvbGUuZGVidWcoJ1tqYXZhLWxzcF0nLCBwPy5tZXNzYWdlKSk7XG4gICAgX2Nvbm4ub25Ob3RpZmljYXRpb24oJ3dpbmRvdy9zaG93TWVzc2FnZScsIChwOiB7IG1lc3NhZ2U6IHN0cmluZyB9KSA9PiBjb25zb2xlLmluZm8oJ1tqYXZhLWxzcF0nLCBwPy5tZXNzYWdlKSk7XG4gICAgLy8gSkRULkxTIGxhbmd1YWdlLXN0YXR1cyAvIHByb2dyZXNzIG5vdGlmaWNhdGlvbnMgXHUyMDE0IGFja25vd2xlZGdlZCBzaWxlbnRseS5cbiAgICBfY29ubi5vbk5vdGlmaWNhdGlvbignbGFuZ3VhZ2Uvc3RhdHVzJywgKCkgPT4geyAvKiBpbmRleGluZy9yZWFkeSBzdGF0dXMsIGlnbm9yZWQgKi8gfSk7XG4gICAgX2Nvbm4ub25Ob3RpZmljYXRpb24oJ2xhbmd1YWdlL3Byb2dyZXNzUmVwb3J0JywgKCkgPT4geyAvKiBidWlsZCBwcm9ncmVzcywgaWdub3JlZCAqLyB9KTtcblxuICAgIF9jb25uLmxpc3RlbigpO1xuXG4gICAgY29uc3Qgcm9vdFVyaSA9IF93b3Jrc3BhY2VSb290O1xuICAgIGNvbnN0IGluaXRSZXN1bHQ6IGFueSA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCdpbml0aWFsaXplJywge1xuICAgICAgICBwcm9jZXNzSWQ6IG51bGwsXG4gICAgICAgIHJvb3RVcmksXG4gICAgICAgIGluaXRpYWxpemF0aW9uT3B0aW9uczoge1xuICAgICAgICAgICAgc2V0dGluZ3M6IGpkdGxzU2V0dGluZ3MoKSxcbiAgICAgICAgICAgIGV4dGVuZGVkQ2xpZW50Q2FwYWJpbGl0aWVzOiB7XG4gICAgICAgICAgICAgICAgcHJvZ3Jlc3NSZXBvcnRQcm92aWRlcjogICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICAgICBjbGFzc0ZpbGVDb250ZW50c1N1cHBvcnQ6ICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgcmVzb2x2ZUFkZGl0aW9uYWxUZXh0RWRpdHNTdXBwb3J0OiB0cnVlLFxuICAgICAgICAgICAgICAgIC8vIERvIE5PVCBhZHZlcnRpc2UgdGhlICpQcm9tcHRTdXBwb3J0IGZsYWdzOiB0aG9zZSBtYWtlIEpEVC5MUyByZXR1cm4gc291cmNlIGFjdGlvbnNcbiAgICAgICAgICAgICAgICAvLyAoZ2VuZXJhdGUgdG9TdHJpbmcvY29uc3RydWN0b3JzL2FjY2Vzc29ycywgb3ZlcnJpZGUvaW1wbGVtZW50LCBvcmdhbml6ZSBpbXBvcnRzKSBhc1xuICAgICAgICAgICAgICAgIC8vIGNsaWVudC1zaWRlIFwiKlByb21wdFwiIGNvbW1hbmRzIHRoZSB2c2NvZGUtamF2YSBleHRlbnNpb24gaW1wbGVtZW50cyBidXQgd2UgZG9uJ3QuXG4gICAgICAgICAgICAgICAgLy8gV2l0aCB0aGVtIG9mZiwgSkRULkxTIHJldHVybnMgdGhlIHNhbWUgYWN0aW9ucyBhcyByZXNvbHZhYmxlIFdvcmtzcGFjZUVkaXRzIG9wZXJhdGluZ1xuICAgICAgICAgICAgICAgIC8vIG9uIGFsbCBtZW1iZXJzLCB3aGljaCBhcHBseUNvZGVBY3Rpb24gcmVzb2x2ZXMgYW5kIGFwcGxpZXMgZGlyZWN0bHkuXG4gICAgICAgICAgICAgICAgaW5mZXJTZWxlY3Rpb25TdXBwb3J0OiAgICAgICAgICAgICBbJ2V4dHJhY3RNZXRob2QnLCAnZXh0cmFjdFZhcmlhYmxlJywgJ2V4dHJhY3RGaWVsZCddLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgd29ya3NwYWNlRm9sZGVyczogW3sgdXJpOiByb290VXJpLCBuYW1lOiB3b3Jrc3BhY2UgfV0sXG4gICAgICAgIGNhcGFiaWxpdGllczoge1xuICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7XG4gICAgICAgICAgICAgICAgc3luY2hyb25pemF0aW9uOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUsIHdpbGxTYXZlOiBmYWxzZSwgZGlkU2F2ZTogdHJ1ZSwgd2lsbFNhdmVXYWl0VW50aWw6IGZhbHNlIH0sXG4gICAgICAgICAgICAgICAgY29tcGxldGlvbjoge1xuICAgICAgICAgICAgICAgICAgICBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uSXRlbToge1xuICAgICAgICAgICAgICAgICAgICAgICAgc25pcHBldFN1cHBvcnQ6ICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRhdGlvbkZvcm1hdDogICBbJ21hcmtkb3duJywgJ3BsYWludGV4dCddLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRlZFN1cHBvcnQ6ICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWl0Q2hhcmFjdGVyc1N1cHBvcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlU3VwcG9ydDogICAgICAgIHsgcHJvcGVydGllczogWydkb2N1bWVudGF0aW9uJywgJ2RldGFpbCcsICdhZGRpdGlvbmFsVGV4dEVkaXRzJ10gfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dFN1cHBvcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBob3ZlcjogICAgICAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLCBjb250ZW50Rm9ybWF0OiBbJ21hcmtkb3duJywgJ3BsYWludGV4dCddIH0sXG4gICAgICAgICAgICAgICAgc2lnbmF0dXJlSGVscDogIHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSwgc2lnbmF0dXJlSW5mb3JtYXRpb246IHsgZG9jdW1lbnRhdGlvbkZvcm1hdDogWydtYXJrZG93bicsICdwbGFpbnRleHQnXSwgcGFyYW1ldGVySW5mb3JtYXRpb246IHsgbGFiZWxPZmZzZXRTdXBwb3J0OiB0cnVlIH0gfSB9LFxuICAgICAgICAgICAgICAgIGRlZmluaXRpb246ICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VzOiAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb246IHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIHR5cGVEZWZpbml0aW9uOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICBkb2N1bWVudEhpZ2hsaWdodDogeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgZG9jdW1lbnRTeW1ib2w6IHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSwgaGllcmFyY2hpY2FsRG9jdW1lbnRTeW1ib2xTdXBwb3J0OiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgZm9sZGluZ1JhbmdlOiAgIHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSwgbGluZUZvbGRpbmdPbmx5OiBmYWxzZSB9LFxuICAgICAgICAgICAgICAgIHNlbGVjdGlvblJhbmdlOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICBjb2RlTGVuczogICAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgaW5sYXlIaW50OiAgICAgIHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSwgcmVzb2x2ZVN1cHBvcnQ6IHsgcHJvcGVydGllczogWydsYWJlbCddIH0gfSxcbiAgICAgICAgICAgICAgICBzZW1hbnRpY1Rva2Vuczoge1xuICAgICAgICAgICAgICAgICAgICBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0czogICAgICAgIHsgcmFuZ2U6IGZhbHNlLCBmdWxsOiB7IGRlbHRhOiBmYWxzZSB9IH0sXG4gICAgICAgICAgICAgICAgICAgIHRva2VuVHlwZXM6ICAgICAgWyduYW1lc3BhY2UnLCAndHlwZScsICdjbGFzcycsICdlbnVtJywgJ2ludGVyZmFjZScsICdzdHJ1Y3QnLCAndHlwZVBhcmFtZXRlcicsXG4gICAgICAgICAgICAgICAgICAgICAgICAncGFyYW1ldGVyJywgJ3ZhcmlhYmxlJywgJ3Byb3BlcnR5JywgJ2VudW1NZW1iZXInLCAnZXZlbnQnLCAnZnVuY3Rpb24nLCAnbWV0aG9kJywgJ21hY3JvJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdrZXl3b3JkJywgJ21vZGlmaWVyJywgJ2NvbW1lbnQnLCAnc3RyaW5nJywgJ251bWJlcicsICdyZWdleHAnLCAnb3BlcmF0b3InLCAnZGVjb3JhdG9yJ10sXG4gICAgICAgICAgICAgICAgICAgIHRva2VuTW9kaWZpZXJzOiAgWydkZWNsYXJhdGlvbicsICdkZWZpbml0aW9uJywgJ3JlYWRvbmx5JywgJ3N0YXRpYycsICdkZXByZWNhdGVkJywgJ2Fic3RyYWN0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdhc3luYycsICdtb2RpZmljYXRpb24nLCAnZG9jdW1lbnRhdGlvbicsICdkZWZhdWx0TGlicmFyeSddLFxuICAgICAgICAgICAgICAgICAgICBmb3JtYXRzOiAgICAgICAgIFsncmVsYXRpdmUnXSxcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxhcHBpbmdUb2tlblN1cHBvcnQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBtdWx0aWxpbmVUb2tlblN1cHBvcnQ6ICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBmb3JtYXR0aW5nOiAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgcmFuZ2VGb3JtYXR0aW5nOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICByZW5hbWU6ICAgICAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLCBwcmVwYXJlU3VwcG9ydDogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIGNvZGVBY3Rpb246IHtcbiAgICAgICAgICAgICAgICAgICAgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgY29kZUFjdGlvbkxpdGVyYWxTdXBwb3J0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlQWN0aW9uS2luZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU2V0OiBbJ3F1aWNrZml4JywgJ3JlZmFjdG9yJywgJ3JlZmFjdG9yLmV4dHJhY3QnLCAncmVmYWN0b3IuaW5saW5lJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlZmFjdG9yLnJld3JpdGUnLCAnc291cmNlJywgJ3NvdXJjZS5vcmdhbml6ZUltcG9ydHMnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGlzUHJlZmVycmVkU3VwcG9ydDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgZGF0YVN1cHBvcnQ6ICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlU3VwcG9ydDogICAgIHsgcHJvcGVydGllczogWydlZGl0J10gfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHB1Ymxpc2hEaWFnbm9zdGljczogeyByZWxhdGVkSW5mb3JtYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3b3Jrc3BhY2U6IHtcbiAgICAgICAgICAgICAgICBhcHBseUVkaXQ6ICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb246ICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgZXhlY3V0ZUNvbW1hbmQ6ICAgICAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgZGlkQ2hhbmdlQ29uZmlndXJhdGlvbjogeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgd29ya3NwYWNlRWRpdDogICAgICAgICAgeyBkb2N1bWVudENoYW5nZXM6IHRydWUsIHJlc291cmNlT3BlcmF0aW9uczogWydjcmVhdGUnLCAncmVuYW1lJywgJ2RlbGV0ZSddIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgX3NlbWFudGljVG9rZW5zTGVnZW5kID0gaW5pdFJlc3VsdD8uY2FwYWJpbGl0aWVzPy5zZW1hbnRpY1Rva2Vuc1Byb3ZpZGVyPy5sZWdlbmQgPz8gbnVsbDtcblxuICAgIF9jb25uLnNlbmROb3RpZmljYXRpb24oJ2luaXRpYWxpemVkJywge30pO1xuICAgIF9jb25uLnNlbmROb3RpZmljYXRpb24oJ3dvcmtzcGFjZS9kaWRDaGFuZ2VDb25maWd1cmF0aW9uJywgeyBzZXR0aW5nczogamR0bHNTZXR0aW5ncygpIH0pO1xuXG4gICAgb3BlbkZpbGUoZmlsZVVyaSk7XG5cbiAgICBpZiAoIV9wcm92aWRlcnNSZWdpc3RlcmVkKSB7XG4gICAgICAgIF9wcm92aWRlcnNSZWdpc3RlcmVkID0gdHJ1ZTtcbiAgICAgICAgcmVnaXN0ZXJQcm92aWRlcnMoKTtcbiAgICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEZpbGUgbGlmZWN5Y2xlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogU2VuZHMgdGV4dERvY3VtZW50L2RpZE9wZW4gZm9yIHRoZSBnaXZlbiBVUkkgKGlmIG5vdCBhbHJlYWR5IHNlbnQpIGFuZCByZWdpc3RlcnMgYSBkZWJvdW5jZWRcbiAqIHRleHREb2N1bWVudC9kaWRDaGFuZ2UgbGlzdGVuZXIgb24gdGhlIGNvcnJlc3BvbmRpbmcgTW9uYWNvIG1vZGVsLlxuICovXG5mdW5jdGlvbiBvcGVuRmlsZShmaWxlVXJpOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoX29wZW5GaWxlcy5oYXMoZmlsZVVyaSkgfHwgIV9jb25uKSByZXR1cm47XG4gICAgX29wZW5GaWxlcy5hZGQoZmlsZVVyaSk7XG5cbiAgICBjb25zdCBtb2RlbCA9IG1vbmFjby5lZGl0b3IuZ2V0TW9kZWxzKCkuZmluZChtID0+IG0udXJpLnRvU3RyaW5nKCkgPT09IGZpbGVVcmkpO1xuICAgIF9jb25uLnNlbmROb3RpZmljYXRpb24oJ3RleHREb2N1bWVudC9kaWRPcGVuJywge1xuICAgICAgICB0ZXh0RG9jdW1lbnQ6IHtcbiAgICAgICAgICAgIHVyaTogICAgICAgIGZpbGVVcmksXG4gICAgICAgICAgICBsYW5ndWFnZUlkOiAnamF2YScsXG4gICAgICAgICAgICB2ZXJzaW9uOiAgICAxLFxuICAgICAgICAgICAgdGV4dDogICAgICAgbW9kZWw/LmdldFZhbHVlKCkgPz8gJycsXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBpZiAobW9kZWwpIHtcbiAgICAgICAgbW9kZWwub25EaWRDaGFuZ2VDb250ZW50KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gX2NoYW5nZVRpbWVycy5nZXQoZmlsZVVyaSk7XG4gICAgICAgICAgICBpZiAoZXhpc3RpbmcpIGNsZWFyVGltZW91dChleGlzdGluZyk7XG4gICAgICAgICAgICBfY2hhbmdlVGltZXJzLnNldChmaWxlVXJpLCBzZXRUaW1lb3V0KCgpID0+IHNlbmREaWRDaGFuZ2UoZmlsZVVyaSksIDQwMCkpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbi8qKiBTZW5kcyB0aGUgY3VycmVudCBtb2RlbCBjb250ZW50IGFzIGEgZGlkQ2hhbmdlIGFuZCBjbGVhcnMgYW55IHBlbmRpbmcgZGVib3VuY2UgZm9yIHRoZSBmaWxlLiAqL1xuZnVuY3Rpb24gc2VuZERpZENoYW5nZShmaWxlVXJpOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBfY2hhbmdlVGltZXJzLmRlbGV0ZShmaWxlVXJpKTtcbiAgICBjb25zdCBtb2RlbCA9IG1vbmFjby5lZGl0b3IuZ2V0TW9kZWwobW9uYWNvLlVyaS5wYXJzZShmaWxlVXJpKSk7XG4gICAgaWYgKF9jb25uICYmIG1vZGVsKSB7XG4gICAgICAgIF9jb25uLnNlbmROb3RpZmljYXRpb24oJ3RleHREb2N1bWVudC9kaWRDaGFuZ2UnLCB7XG4gICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6ICAgeyB1cmk6IGZpbGVVcmksIHZlcnNpb246IG1vZGVsLmdldFZlcnNpb25JZCgpIH0sXG4gICAgICAgICAgICBjb250ZW50Q2hhbmdlczogW3sgdGV4dDogbW9kZWwuZ2V0VmFsdWUoKSB9XSxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEZsdXNoZXMgYSBwZW5kaW5nIGRlYm91bmNlZCBjaGFuZ2UgaW1tZWRpYXRlbHkuIENhbGxlZCBiZWZvcmUgYSBjb21wbGV0aW9uIHJlcXVlc3Qgc28gSkRULkxTIHNlZXMgdGhlXG4gKiBqdXN0LXR5cGVkIHRleHQgb24gdGhlIGZpcnN0IEN0cmwrU3BhY2UsIGluc3RlYWQgb2YgY29tcGxldGluZyBhZ2FpbnN0IHN0YWxlIGNvbnRlbnQgKHRoZSBkZWJvdW5jZVxuICogb3RoZXJ3aXNlIGRlbGF5cyB0aGUgY2hhbmdlIGJ5IHVwIHRvIDQwMG1zIFx1MjAxNCB0aGUgY2F1c2Ugb2YgXCJmaXJzdCBDdHJsK1NwYWNlIHNob3dzIG5vdGhpbmdcIikuXG4gKi9cbmZ1bmN0aW9uIGZsdXNoUGVuZGluZ0NoYW5nZShmaWxlVXJpOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoX2NoYW5nZVRpbWVycy5oYXMoZmlsZVVyaSkpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KF9jaGFuZ2VUaW1lcnMuZ2V0KGZpbGVVcmkpISk7XG4gICAgICAgIHNlbmREaWRDaGFuZ2UoZmlsZVVyaSk7XG4gICAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBXb3Jrc3BhY2UgZmlsZSBwcmVkaWNhdGVcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBSZXR1cm5zIHtAY29kZSB0cnVlfSB3aGVuIHRoZSBnaXZlbiBtb2RlbCBVUkkgYmVsb25ncyB0byB0aGUgY3VycmVudGx5IGNvbm5lY3RlZCB3b3Jrc3BhY2UuIFVzZWRcbiAqIGJ5IE1vbmFjbyBwcm92aWRlcnMgdG8gc2tpcCBub24tSmF2YS13b3Jrc3BhY2UgbW9kZWxzIHdpdGhvdXQgYW4gZXhhY3QtVVJJIGNvbXBhcmlzb24uXG4gKi9cbmZ1bmN0aW9uIGlzV29ya3NwYWNlRmlsZSh1cmk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBfd29ya3NwYWNlUm9vdCAhPT0gJycgJiYgdXJpLnN0YXJ0c1dpdGgoX3dvcmtzcGFjZVJvb3QpO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBNb25hY28gcHJvdmlkZXIgcmVnaXN0cmF0aW9uXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIHJlZ2lzdGVyUHJvdmlkZXJzKCk6IHZvaWQge1xuXG4gICAgbW9uYWNvLmVkaXRvci5yZWdpc3RlckNvbW1hbmQoQVBQTFlfQUNUSU9OX0NPTU1BTkQsIChfYWNjZXNzb3I6IHVua25vd24sIGFjdGlvbjogQ29kZUFjdGlvbiB8IENvbW1hbmQpID0+IHtcbiAgICAgICAgYXBwbHlDb2RlQWN0aW9uKGFjdGlvbik7XG4gICAgfSk7XG4gICAgbW9uYWNvLmVkaXRvci5yZWdpc3RlckNvbW1hbmQoTk9PUF9DT01NQU5ELCAoKSA9PiB7IC8qIGRpc3BsYXktb25seSBDb2RlTGVucyAqLyB9KTtcblxuICAgIC8vIENyb3NzLWZpbGUgbmF2aWdhdGlvbjogdGhpcyBzaW5nbGUtZmlsZSBlZGl0b3IgaGFzIG5vIG1vZGVsIGZvciBvdGhlciB3b3Jrc3BhY2UgZmlsZXMsIHNvIEdvIHRvXG4gICAgLy8gRGVmaW5pdGlvbiAvIEZpbmQgUmVmZXJlbmNlcyB0byBhbm90aGVyIGZpbGUgd291bGQgc2lsZW50bHkgZG8gbm90aGluZy4gSGFuZCB0aG9zZSBvZmYgdG8gdGhlIElERVxuICAgIC8vIHRvIG9wZW4gdGhlIHRhcmdldCBmaWxlIChhbmQgcmV2ZWFsIHRoZSBsaW5lKS4gU2FtZS1maWxlIHRhcmdldHMgZmFsbCB0aHJvdWdoIHRvIE1vbmFjby5cbiAgICBtb25hY28uZWRpdG9yLnJlZ2lzdGVyRWRpdG9yT3BlbmVyKHtcbiAgICAgICAgb3BlbkNvZGVFZGl0b3I6IChzb3VyY2UsIHJlc291cmNlLCBzZWxlY3Rpb25PclBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB1cmkgPSByZXNvdXJjZS50b1N0cmluZygpO1xuICAgICAgICAgICAgaWYgKCFpc1dvcmtzcGFjZUZpbGUodXJpKSB8fCAhdXJpLnN0YXJ0c1dpdGgoVklSVFVBTF9GSUxFX1BSRUZJWCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRNb2RlbCA9IHNvdXJjZS5nZXRNb2RlbCgpO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRNb2RlbCAmJiBjdXJyZW50TW9kZWwudXJpLnRvU3RyaW5nKCkgPT09IHVyaSkgcmV0dXJuIGZhbHNlOyAvLyBzYW1lIGZpbGUgXHUyMDE0IGxldCBNb25hY28ganVtcFxuICAgICAgICAgICAgY29uc3Qgb3BlbmVyID0gKGdsb2JhbFRoaXMgYXMgYW55KS5qYXZhTHNwT3BlbkZpbGU7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wZW5lciAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgcG9zID0gc2VsZWN0aW9uT3JQb3NpdGlvbiBhcyB7IHN0YXJ0TGluZU51bWJlcj86IG51bWJlcjsgbGluZU51bWJlcj86IG51bWJlcjsgc3RhcnRDb2x1bW4/OiBudW1iZXI7IGNvbHVtbj86IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgbGluZSA9IHBvcyA/IChwb3Muc3RhcnRMaW5lTnVtYmVyID8/IHBvcy5saW5lTnVtYmVyKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHBvcyA/IChwb3Muc3RhcnRDb2x1bW4gPz8gcG9zLmNvbHVtbikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBvcGVuZXIodXJpLnN1YnN0cmluZyhWSVJUVUFMX0ZJTEVfUFJFRklYLmxlbmd0aCksIGxpbmUsIGNvbHVtbik7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJDb21wbGV0aW9uSXRlbVByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICB0cmlnZ2VyQ2hhcmFjdGVyczogWycuJywgJ0AnLCAnPCddLFxuICAgICAgICBwcm92aWRlQ29tcGxldGlvbkl0ZW1zOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uLCBjb250ZXh0KSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVVcmkgPSBtb2RlbC51cmkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBKRFQuTFMgaGFzIHRoZSBqdXN0LXR5cGVkIHRleHQgYmVmb3JlIGNvbXBsZXRpbmcgKHNlZSBmbHVzaFBlbmRpbmdDaGFuZ2UpLlxuICAgICAgICAgICAgZmx1c2hQZW5kaW5nQ2hhbmdlKGZpbGVVcmkpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBDb21wbGV0aW9uTGlzdCB8IENvbXBsZXRpb25JdGVtW10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9jb21wbGV0aW9uJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IGZpbGVVcmkgfSxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogICAgIHsgbGluZTogcG9zaXRpb24ubGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogcG9zaXRpb24uY29sdW1uIC0gMSB9LFxuICAgICAgICAgICAgICAgIC8vIE1vbmFjbyB0cmlnZ2VyIGtpbmRzIGFyZSAwLWJhc2VkIChJbnZva2UvVHJpZ2dlckNoYXJhY3Rlci9Gb3JJbmNvbXBsZXRlKTsgTFNQIGlzIDEtYmFzZWQuXG4gICAgICAgICAgICAgICAgY29udGV4dDogICAgICB7IHRyaWdnZXJLaW5kOiAoY29udGV4dC50cmlnZ2VyS2luZCA/PyAwKSArIDEsIHRyaWdnZXJDaGFyYWN0ZXI6IGNvbnRleHQudHJpZ2dlckNoYXJhY3RlciB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBpdGVtcyA9IEFycmF5LmlzQXJyYXkocmVzdWx0KSA/IHJlc3VsdCA6IChyZXN1bHQ/Lml0ZW1zID8/IFtdKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3VnZ2VzdGlvbnM6IGl0ZW1zLm1hcChpdGVtID0+IGxzcENvbXBsZXRpb25Ub01vbmFjbyhpdGVtLCBtb2RlbCwgcG9zaXRpb24pKSxcbiAgICAgICAgICAgICAgICAvLyBKRFQuTFMgcmV0dXJucyBhIHRydW5jYXRlZCBsaXN0IG9uIHRoZSBmaXJzdCBrZXlzdHJva2VzOyBwcm9wYWdhdGluZyBcImluY29tcGxldGVcIiBtYWtlc1xuICAgICAgICAgICAgICAgIC8vIE1vbmFjbyByZS1xdWVyeSBhcyB0aGUgdXNlciB0eXBlcyBpbnN0ZWFkIG9mIGNhY2hpbmcgdGhlIGZpcnN0IChvZnRlbiBlbXB0eSkgcmVzdWx0LlxuICAgICAgICAgICAgICAgIGluY29tcGxldGU6ICBBcnJheS5pc0FycmF5KHJlc3VsdCkgPyBmYWxzZSA6ICEhcmVzdWx0Py5pc0luY29tcGxldGUsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvLyBSZXNvbHZlIGRvY3VtZW50YXRpb24gYW5kLCBjcnVjaWFsbHksIHRoZSBhdXRvLWltcG9ydCBhZGRpdGlvbmFsVGV4dEVkaXRzIHdoaWNoIEpEVC5MUyBvbmx5XG4gICAgICAgIC8vIGF0dGFjaGVzIG9uIHJlc29sdmUgXHUyMDE0IHNlbGVjdGluZyBhIHR5cGUgdGhlbiBpbnNlcnRzIGl0cyBpbXBvcnQgc3RhdGVtZW50LlxuICAgICAgICByZXNvbHZlQ29tcGxldGlvbkl0ZW06IGFzeW5jIChpdGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsc3AgPSAoaXRlbSBhcyBNb25hY29Db21wbGV0aW9uSXRlbSkuX2xzcDtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWxzcCkgcmV0dXJuIGl0ZW07XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkOiBDb21wbGV0aW9uSXRlbSA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCdjb21wbGV0aW9uSXRlbS9yZXNvbHZlJywgbHNwKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQuZG9jdW1lbnRhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBpdGVtLmRvY3VtZW50YXRpb24gPSB7IHZhbHVlOiBtYXJrdXBUb1N0cmluZyhyZXNvbHZlZC5kb2N1bWVudGF0aW9uKSwgaXNUcnVzdGVkOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQuZGV0YWlsKSBpdGVtLmRldGFpbCA9IHJlc29sdmVkLmRldGFpbDtcbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQuYWRkaXRpb25hbFRleHRFZGl0cz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uYWRkaXRpb25hbFRleHRFZGl0cyA9IHJlc29sdmVkLmFkZGl0aW9uYWxUZXh0RWRpdHMubWFwKHRleHRFZGl0VG9Nb25hY28pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKCdbamF2YS1sc3BdIGNvbXBsZXRpb24gcmVzb2x2ZSBmYWlsZWQ6JywgKGUgYXMgRXJyb3IpPy5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckhvdmVyUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVIb3ZlcjogYXN5bmMgKG1vZGVsLCBwb3NpdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBmaWxlVXJpID0gbW9kZWwudXJpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IEhvdmVyIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvaG92ZXInLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogZmlsZVVyaSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0Py5jb250ZW50cykgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50cyA9IEFycmF5LmlzQXJyYXkocmVzdWx0LmNvbnRlbnRzKSA/IHJlc3VsdC5jb250ZW50cyA6IFtyZXN1bHQuY29udGVudHNdO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjb250ZW50czogY29udGVudHMubWFwKGMgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHR5cGVvZiBjID09PSAnc3RyaW5nJyA/IGMgOiAoYyBhcyBNYXJrdXBDb250ZW50KS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgaXNUcnVzdGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgcmFuZ2U6IHJlc3VsdC5yYW5nZSA/IGxzcFJhbmdlVG9Nb25hY28ocmVzdWx0LnJhbmdlKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyU2lnbmF0dXJlSGVscFByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBzaWduYXR1cmVIZWxwVHJpZ2dlckNoYXJhY3RlcnM6IFsnKCcsICcsJ10sXG4gICAgICAgIHByb3ZpZGVTaWduYXR1cmVIZWxwOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVVcmkgPSBtb2RlbC51cmkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogU2lnbmF0dXJlSGVscCB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L3NpZ25hdHVyZUhlbHAnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogZmlsZVVyaSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlczogcmVzdWx0LnNpZ25hdHVyZXMubWFwKChzaWc6IFNpZ25hdHVyZUluZm9ybWF0aW9uKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICAgICAgICAgc2lnLmxhYmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRhdGlvbjogc2lnLmRvY3VtZW50YXRpb24gPyBtYXJrdXBUb1N0cmluZyhzaWcuZG9jdW1lbnRhdGlvbikgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiAgICAoc2lnLnBhcmFtZXRlcnMgPz8gW10pLm1hcCgocDogUGFyYW1ldGVySW5mb3JtYXRpb24pID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICAgICAgICAgcC5sYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudGF0aW9uOiBwLmRvY3VtZW50YXRpb24gPyBtYXJrdXBUb1N0cmluZyhwLmRvY3VtZW50YXRpb24pIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZVNpZ25hdHVyZTogcmVzdWx0LmFjdGl2ZVNpZ25hdHVyZSA/PyAwLFxuICAgICAgICAgICAgICAgICAgICBhY3RpdmVQYXJhbWV0ZXI6IHJlc3VsdC5hY3RpdmVQYXJhbWV0ZXIgPz8gMCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGRpc3Bvc2U6ICgpID0+IHt9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJEZWZpbml0aW9uUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVEZWZpbml0aW9uOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVVcmkgPSBtb2RlbC51cmkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogTG9jYXRpb24gfCBMb2NhdGlvbltdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvZGVmaW5pdGlvbicsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBmaWxlVXJpIH0sXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgbG9jYXRpb25zID0gKEFycmF5LmlzQXJyYXkocmVzdWx0KSA/IHJlc3VsdCA6IFtyZXN1bHRdKS5tYXAobG9jID0+ICh7XG4gICAgICAgICAgICAgICAgdXJpOiAgIG1vbmFjby5VcmkucGFyc2UobG9jLnVyaSksXG4gICAgICAgICAgICAgICAgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28obG9jLnJhbmdlKSxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIGF3YWl0IGVuc3VyZU1vZGVsc0ZvckxvY2F0aW9ucyhsb2NhdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGxvY2F0aW9ucztcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJSZWZlcmVuY2VQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZVJlZmVyZW5jZXM6IGFzeW5jIChtb2RlbCwgcG9zaXRpb24sIGNvbnRleHQpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBMb2NhdGlvbltdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvcmVmZXJlbmNlcycsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICAgICAgY29udGV4dDogICAgICB7IGluY2x1ZGVEZWNsYXJhdGlvbjogY29udGV4dC5pbmNsdWRlRGVjbGFyYXRpb24gfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgbG9jYXRpb25zID0gcmVzdWx0Lm1hcChsb2MgPT4gKHsgdXJpOiBtb25hY28uVXJpLnBhcnNlKGxvYy51cmkpLCByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhsb2MucmFuZ2UpIH0pKTtcbiAgICAgICAgICAgIC8vIFRoZSByZWZlcmVuY2VzIHBlZWsgY2FuIG9ubHkgc2hvdyBhIGNvZGUgcHJldmlldyBmb3IgZmlsZXMgaXQgaGFzIGEgbW9kZWwgZm9yOyBjcmVhdGVcbiAgICAgICAgICAgIC8vIGluLW1lbW9yeSBtb2RlbHMgZm9yIHRoZSByZWZlcmVuY2VkIChwb3NzaWJseSB1bm9wZW5lZCkgZmlsZXMgc28gcHJldmlld3MgcmVuZGVyLlxuICAgICAgICAgICAgYXdhaXQgZW5zdXJlTW9kZWxzRm9yTG9jYXRpb25zKGxvY2F0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gbG9jYXRpb25zO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlclJlbmFtZVByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlUmVuYW1lRWRpdHM6IGFzeW5jIChtb2RlbCwgcG9zaXRpb24sIG5ld05hbWUpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiB7IGVkaXRzOiBbXSB9O1xuICAgICAgICAgICAgY29uc3QgZWRpdDogV29ya3NwYWNlRWRpdCB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L3JlbmFtZScsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICAgICAgbmV3TmFtZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFlZGl0KSByZXR1cm4geyBlZGl0czogW10gfTtcbiAgICAgICAgICAgIC8vIEEgSkRULkxTIHJlbmFtZSBjYW4gc3BhbiBtYW55IGZpbGVzIGFuZCBldmVuIHJlbmFtZSB0aGUgdHlwZSdzIG93biAuamF2YSBmaWxlLiBNb25hY28nc1xuICAgICAgICAgICAgLy8gc2luZ2xlLWZpbGUgZWRpdG9yIHdvdWxkIGRyb3AgZXZlcnl0aGluZyBidXQgdGhlIGN1cnJlbnQgbW9kZWwsIHNvIGFwcGx5IHRoZSB3aG9sZSBlZGl0XG4gICAgICAgICAgICAvLyB0aHJvdWdoIHRoZSB3b3Jrc3BhY2Ugb3Vyc2VsdmVzIHdoZW4gdGhlIElERSBwZXJzaXN0ZW5jZSBob29rIGlzIGF2YWlsYWJsZS5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgKGdsb2JhbFRoaXMgYXMgYW55KS5qYXZhTHNwUGVyc2lzdFJlbmFtZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGFwcGx5UmVuYW1lQWNyb3NzV29ya3NwYWNlKG1vZGVsLCBlZGl0KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZWRpdHM6IFtdIH07XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbamF2YS1sc3BdIGNyb3NzLWZpbGUgcmVuYW1lIGZhaWxlZCwgYXBwbHlpbmcgdG8gdGhlIGN1cnJlbnQgZmlsZSBvbmx5OicsIGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gd29ya3NwYWNlRWRpdFRvTW9uYWNvKGVkaXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB3b3Jrc3BhY2VFZGl0VG9Nb25hY28oZWRpdCk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlc29sdmVSZW5hbWVMb2NhdGlvbjogYXN5bmMgKG1vZGVsLCBwb3NpdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogeyByYW5nZTogTHNwUmFuZ2U7IHBsYWNlaG9sZGVyPzogc3RyaW5nIH0gfCBMc3BSYW5nZSB8IG51bGwgPVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L3ByZXBhcmVSZW5hbWUnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gJ3JhbmdlJyBpbiByZXN1bHQgPyByZXN1bHQucmFuZ2UgOiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSAncGxhY2Vob2xkZXInIGluIHJlc3VsdCAmJiByZXN1bHQucGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICAgICAgPyByZXN1bHQucGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICAgICAgOiBtb2RlbC5nZXRXb3JkQXRQb3NpdGlvbihwb3NpdGlvbik/LndvcmQgPz8gJyc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28ocmFuZ2UpLCB0ZXh0OiBwbGFjZWhvbGRlciB9O1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgY29uc3Qgd29yZCA9IG1vZGVsLmdldFdvcmRBdFBvc2l0aW9uKHBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gd29yZCA/IHtcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2U6IHsgc3RhcnRMaW5lTnVtYmVyOiBwb3NpdGlvbi5saW5lTnVtYmVyLCBzdGFydENvbHVtbjogd29yZC5zdGFydENvbHVtbiwgZW5kTGluZU51bWJlcjogcG9zaXRpb24ubGluZU51bWJlciwgZW5kQ29sdW1uOiB3b3JkLmVuZENvbHVtbiB9LFxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiB3b3JkLndvcmQsXG4gICAgICAgICAgICAgICAgfSA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBSZWdpc3RlcmluZyB0aGlzIHByb3ZpZGVyIGFsc28gZW5hYmxlcyBlZGl0b3IuanMncyBleGlzdGluZyBmb3JtYXQtb24tc2F2ZSBwYXRoIGZvciBKYXZhOiB0aGVcbiAgICAvLyBzaGFyZWQgU2F2ZSBhY3Rpb24gcnVucyBlZGl0b3IuYWN0aW9uLmZvcm1hdERvY3VtZW50IHdoZW4gYXV0by1mb3JtYXR0aW5nIGlzIG9uICh0aGUgc2FtZVxuICAgIC8vIG1lY2hhbmlzbSBhbmQgZ2xvYmFsIHRvZ2dsZSB1c2VkIGZvciBUeXBlU2NyaXB0KS5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyRG9jdW1lbnRGb3JtYXR0aW5nRWRpdFByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlRG9jdW1lbnRGb3JtYXR0aW5nRWRpdHM6IGFzeW5jIChtb2RlbCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBlZGl0czogVGV4dEVkaXRbXSB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L2Zvcm1hdHRpbmcnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiAgICAgIHsgdGFiU2l6ZTogbW9kZWwuZ2V0T3B0aW9ucygpLnRhYlNpemUsIGluc2VydFNwYWNlczogbW9kZWwuZ2V0T3B0aW9ucygpLmluc2VydFNwYWNlcyB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gZWRpdHMgPyBlZGl0cy5tYXAodGV4dEVkaXRUb01vbmFjbykgOiBudWxsO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckNvZGVBY3Rpb25Qcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZUNvZGVBY3Rpb25zOiBhc3luYyAobW9kZWwsIHJhbmdlLCBjb250ZXh0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbXB0eSA9IHsgYWN0aW9uczogW10sIGRpc3Bvc2UoKSB7IC8qIG5vdGhpbmcgdG8gZGlzcG9zZSAqLyB9IH07XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gZW1wdHk7XG4gICAgICAgICAgICAvLyBTZW5kIHRoZSBvcmlnaW5hbCBMU1AgZGlhZ25vc3RpY3MgdGhhdCBvdmVybGFwIHRoZSByYW5nZSAodGhleSBjYXJyeSB0aGUgY29kZS9kYXRhIEpEVC5MU1xuICAgICAgICAgICAgLy8gbmVlZHMgdG8gY29tcHV0ZSBxdWljay1maXhlcyksIG5vdCBvbmVzIHJlY29uc3RydWN0ZWQgZnJvbSBNb25hY28gbWFya2Vycy5cbiAgICAgICAgICAgIGNvbnN0IGxzcFJhbmdlID0gbW9uYWNvUmFuZ2VUb0xzcChyYW5nZSk7XG4gICAgICAgICAgICBjb25zdCBkaWFnbm9zdGljcyA9IChfZGlhZ25vc3RpY3MuZ2V0KG1vZGVsLnVyaS50b1N0cmluZygpKSA/PyBbXSkuZmlsdGVyKGQgPT4gcmFuZ2VzT3ZlcmxhcChkLnJhbmdlLCBsc3BSYW5nZSkpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBBcnJheTxDb2RlQWN0aW9uIHwgQ29tbWFuZD4gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9jb2RlQWN0aW9uJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICAgICAgcmFuZ2U6ICAgICAgICBsc3BSYW5nZSxcbiAgICAgICAgICAgICAgICBjb250ZXh0OiAgICAgIHsgZGlhZ25vc3RpY3MsIG9ubHk6IGNvbnRleHQub25seSA/IFtjb250ZXh0Lm9ubHldIDogdW5kZWZpbmVkIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0Py5sZW5ndGgpIHJldHVybiBlbXB0eTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgYWN0aW9uczogcmVzdWx0Lm1hcChsc3BDb2RlQWN0aW9uVG9Nb25hY28pLFxuICAgICAgICAgICAgICAgIGRpc3Bvc2UoKSB7IC8qIG5vdGhpbmcgdG8gZGlzcG9zZSAqLyB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICB9LCB7XG4gICAgICAgIHByb3ZpZGVkQ29kZUFjdGlvbktpbmRzOiBbJ3F1aWNrZml4JywgJ3JlZmFjdG9yJywgJ3JlZmFjdG9yLmV4dHJhY3QnLCAncmVmYWN0b3IuaW5saW5lJyxcbiAgICAgICAgICAgICdyZWZhY3Rvci5yZXdyaXRlJywgJ3NvdXJjZScsICdzb3VyY2Uub3JnYW5pemVJbXBvcnRzJ10sXG4gICAgfSk7XG5cbiAgICAvLyAtLS0gTmF2aWdhdGlvbiAmIHN0cnVjdHVyZSAoUGFjayAxKSAtLS1cblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJJbXBsZW1lbnRhdGlvblByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlSW1wbGVtZW50YXRpb246IChtb2RlbCwgcG9zaXRpb24pID0+IHJlcXVlc3RMb2NhdGlvbnMoJ3RleHREb2N1bWVudC9pbXBsZW1lbnRhdGlvbicsIG1vZGVsLCBwb3NpdGlvbiksXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyVHlwZURlZmluaXRpb25Qcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZVR5cGVEZWZpbml0aW9uOiAobW9kZWwsIHBvc2l0aW9uKSA9PiByZXF1ZXN0TG9jYXRpb25zKCd0ZXh0RG9jdW1lbnQvdHlwZURlZmluaXRpb24nLCBtb2RlbCwgcG9zaXRpb24pLFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckRvY3VtZW50SGlnaGxpZ2h0UHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVEb2N1bWVudEhpZ2hsaWdodHM6IGFzeW5jIChtb2RlbCwgcG9zaXRpb24pID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBhbnlbXSB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L2RvY3VtZW50SGlnaGxpZ2h0Jywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5tYXAoaCA9PiAoeyByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhoLnJhbmdlKSwga2luZDogaC5raW5kID8gaC5raW5kIC0gMSA6IHVuZGVmaW5lZCB9KSk7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyRG9jdW1lbnRTeW1ib2xQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZURvY3VtZW50U3ltYm9sczogYXN5bmMgKG1vZGVsKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55W10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9kb2N1bWVudFN5bWJvbCcsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0ID8gbWFwRG9jdW1lbnRTeW1ib2xzKHJlc3VsdCkgOiBudWxsO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckZvbGRpbmdSYW5nZVByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlRm9sZGluZ1JhbmdlczogYXN5bmMgKG1vZGVsKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55W10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9mb2xkaW5nUmFuZ2UnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5tYXAociA9PiAoeyBzdGFydDogci5zdGFydExpbmUgKyAxLCBlbmQ6IHIuZW5kTGluZSArIDEsIGtpbmQ6IGZvbGRpbmdLaW5kKHIua2luZCkgfSkpO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlclNlbGVjdGlvblJhbmdlUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVTZWxlY3Rpb25SYW5nZXM6IGFzeW5jIChtb2RlbCwgcG9zaXRpb25zKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55W10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9zZWxlY3Rpb25SYW5nZScsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uczogICAgcG9zaXRpb25zLm1hcChwID0+ICh7IGxpbmU6IHAubGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogcC5jb2x1bW4gLSAxIH0pKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5tYXAoZmxhdHRlblNlbGVjdGlvblJhbmdlKTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJEb2N1bWVudFJhbmdlRm9ybWF0dGluZ0VkaXRQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZURvY3VtZW50UmFuZ2VGb3JtYXR0aW5nRWRpdHM6IGFzeW5jIChtb2RlbCwgcmFuZ2UpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgZWRpdHM6IFRleHRFZGl0W10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9yYW5nZUZvcm1hdHRpbmcnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgICAgICByYW5nZTogICAgICAgIG1vbmFjb1JhbmdlVG9Mc3AocmFuZ2UpLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6ICAgICAgeyB0YWJTaXplOiBtb2RlbC5nZXRPcHRpb25zKCkudGFiU2l6ZSwgaW5zZXJ0U3BhY2VzOiBtb2RlbC5nZXRPcHRpb25zKCkuaW5zZXJ0U3BhY2VzIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBlZGl0cyA/IGVkaXRzLm1hcCh0ZXh0RWRpdFRvTW9uYWNvKSA6IG51bGw7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyAtLS0gSW5sYXkgaGludHMgKyBzZW1hbnRpYyBoaWdobGlnaHRpbmcgKFBhY2sgMikgLS0tXG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVySW5sYXlIaW50c1Byb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlSW5sYXlIaW50czogYXN5bmMgKG1vZGVsLCByYW5nZSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IGFueVtdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvaW5sYXlIaW50Jywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICAgICAgcmFuZ2U6ICAgICAgICBtb25hY29SYW5nZVRvTHNwKHJhbmdlKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBoaW50czogcmVzdWx0Lm1hcChoID0+ICh7XG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lTnVtYmVyOiBoLnBvc2l0aW9uLmxpbmUgKyAxLCBjb2x1bW46IGgucG9zaXRpb24uY2hhcmFjdGVyICsgMSB9LFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogICAgICAgIHR5cGVvZiBoLmxhYmVsID09PSAnc3RyaW5nJyA/IGgubGFiZWwgOiAoaC5sYWJlbCA/PyBbXSkubWFwKChwOiBhbnkpID0+ICh7IGxhYmVsOiBwLnZhbHVlIH0pKSxcbiAgICAgICAgICAgICAgICAgICAga2luZDogICAgICAgICBoLmtpbmQsXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmdMZWZ0OiAgaC5wYWRkaW5nTGVmdCxcbiAgICAgICAgICAgICAgICAgICAgcGFkZGluZ1JpZ2h0OiBoLnBhZGRpbmdSaWdodCxcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcDogICAgICBoLnRvb2x0aXAgPyBtYXJrdXBUb1N0cmluZyhoLnRvb2x0aXApIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgICBkaXNwb3NlKCkgeyAvKiBub3RoaW5nIHRvIGRpc3Bvc2UgKi8gfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyRG9jdW1lbnRTZW1hbnRpY1Rva2Vuc1Byb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBnZXRMZWdlbmQ6ICgpID0+IF9zZW1hbnRpY1Rva2Vuc0xlZ2VuZCA/PyB7IHRva2VuVHlwZXM6IFtdLCB0b2tlbk1vZGlmaWVyczogW10gfSxcbiAgICAgICAgcHJvdmlkZURvY3VtZW50U2VtYW50aWNUb2tlbnM6IGFzeW5jIChtb2RlbCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSB8fCAhX3NlbWFudGljVG9rZW5zTGVnZW5kKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogeyBkYXRhOiBudW1iZXJbXTsgcmVzdWx0SWQ/OiBzdHJpbmcgfSB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L3NlbWFudGljVG9rZW5zL2Z1bGwnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQ/LmRhdGEpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogbmV3IFVpbnQzMkFycmF5KHJlc3VsdC5kYXRhKSwgcmVzdWx0SWQ6IHJlc3VsdC5yZXN1bHRJZCB9O1xuICAgICAgICB9LFxuICAgICAgICByZWxlYXNlRG9jdW1lbnRTZW1hbnRpY1Rva2VuczogKCkgPT4geyAvKiBub3RoaW5nIHRvIHJlbGVhc2UgKi8gfSxcbiAgICB9KTtcblxuICAgIC8vIC0tLSBDb2RlTGVucyAoUGFjayAzKSAtLS1cblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJDb2RlTGVuc1Byb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlQ29kZUxlbnNlczogYXN5bmMgKG1vZGVsKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4geyBsZW5zZXM6IFtdLCBkaXNwb3NlKCkgeyAvKiAqLyB9IH07XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IGFueVtdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvY29kZUxlbnMnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgbGVuc2VzID0gKHJlc3VsdCA/PyBbXSkubWFwKChsZW5zLCBpKSA9PiAoe1xuICAgICAgICAgICAgICAgIHJhbmdlOiAgICBsc3BSYW5nZVRvTW9uYWNvKGxlbnMucmFuZ2UpLFxuICAgICAgICAgICAgICAgIGlkOiAgICAgICBTdHJpbmcoaSksXG4gICAgICAgICAgICAgICAgY29tbWFuZDogIGxlbnMuY29tbWFuZCA/IG1hcExlbnNDb21tYW5kKGxlbnMuY29tbWFuZCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgX2xzcDogICAgIGxlbnMsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICByZXR1cm4geyBsZW5zZXMsIGRpc3Bvc2UoKSB7IC8qICovIH0gfTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVzb2x2ZUNvZGVMZW5zOiBhc3luYyAoX21vZGVsLCBjb2RlTGVucykgPT4ge1xuICAgICAgICAgICAgY29uc3QgbHNwID0gKGNvZGVMZW5zIGFzIGFueSkuX2xzcDtcbiAgICAgICAgICAgIGlmIChfY29ubiAmJiBsc3AgJiYgIWxzcC5jb21tYW5kKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWQ6IGFueSA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCdjb2RlTGVucy9yZXNvbHZlJywgbHNwKTtcbiAgICAgICAgICAgICAgICAgICAgY29kZUxlbnMuY29tbWFuZCA9IHJlc29sdmVkPy5jb21tYW5kID8gbWFwTGVuc0NvbW1hbmQocmVzb2x2ZWQuY29tbWFuZCkgOiB7IGlkOiBOT09QX0NPTU1BTkQsIHRpdGxlOiAnJyB9O1xuICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICBjb2RlTGVucy5jb21tYW5kID0geyBpZDogTk9PUF9DT01NQU5ELCB0aXRsZTogJycgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29kZUxlbnM7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyAtLS0gSmF2YSBrZXl3b3JkIGNvbXBsZXRpb24gKFBhY2sgMWIpOiBhbHdheXMtYXZhaWxhYmxlLCByYW5rZWQgYmVsb3cgU0RLL0xTUCByZXN1bHRzIC0tLVxuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckNvbXBsZXRpb25JdGVtUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVDb21wbGV0aW9uSXRlbXM6IChtb2RlbCwgcG9zaXRpb24pID0+IHtcbiAgICAgICAgICAgIGlmICghaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCB3b3JkID0gbW9kZWwuZ2V0V29yZFVudGlsUG9zaXRpb24ocG9zaXRpb24pO1xuICAgICAgICAgICAgY29uc3QgcmFuZ2U6IG1vbmFjby5JUmFuZ2UgPSB7XG4gICAgICAgICAgICAgICAgc3RhcnRMaW5lTnVtYmVyOiBwb3NpdGlvbi5saW5lTnVtYmVyLCBzdGFydENvbHVtbjogd29yZC5zdGFydENvbHVtbixcbiAgICAgICAgICAgICAgICBlbmRMaW5lTnVtYmVyOiAgIHBvc2l0aW9uLmxpbmVOdW1iZXIsIGVuZENvbHVtbjogICB3b3JkLmVuZENvbHVtbixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb25zOiBKQVZBX0tFWVdPUkRTLm1hcChrZXl3b3JkID0+ICh7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAgICAgIGtleXdvcmQsXG4gICAgICAgICAgICAgICAgICAgIGtpbmQ6ICAgICAgIG1vbmFjby5sYW5ndWFnZXMuQ29tcGxldGlvbkl0ZW1LaW5kLktleXdvcmQsXG4gICAgICAgICAgICAgICAgICAgIGluc2VydFRleHQ6IGtleXdvcmQsXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlLFxuICAgICAgICAgICAgICAgICAgICBzb3J0VGV4dDogICBgOV8ke2tleXdvcmR9YCxcbiAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgIH0pO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBIZWxwZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIGxzcFNldmVyaXR5KHNldmVyaXR5OiBEaWFnbm9zdGljU2V2ZXJpdHkgfCB1bmRlZmluZWQpOiBtb25hY28uTWFya2VyU2V2ZXJpdHkge1xuICAgIHN3aXRjaCAoc2V2ZXJpdHkpIHtcbiAgICAgICAgY2FzZSBEaWFnbm9zdGljU2V2ZXJpdHkuRXJyb3I6ICAgICAgIHJldHVybiBtb25hY28uTWFya2VyU2V2ZXJpdHkuRXJyb3I7XG4gICAgICAgIGNhc2UgRGlhZ25vc3RpY1NldmVyaXR5Lldhcm5pbmc6ICAgICByZXR1cm4gbW9uYWNvLk1hcmtlclNldmVyaXR5Lldhcm5pbmc7XG4gICAgICAgIGNhc2UgRGlhZ25vc3RpY1NldmVyaXR5LkluZm9ybWF0aW9uOiByZXR1cm4gbW9uYWNvLk1hcmtlclNldmVyaXR5LkluZm87XG4gICAgICAgIGNhc2UgRGlhZ25vc3RpY1NldmVyaXR5LkhpbnQ6ICAgICAgICByZXR1cm4gbW9uYWNvLk1hcmtlclNldmVyaXR5LkhpbnQ7XG4gICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9uYWNvLk1hcmtlclNldmVyaXR5LkVycm9yO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gbHNwUmFuZ2VUb01vbmFjbyhyOiB7IHN0YXJ0OiB7IGxpbmU6IG51bWJlcjsgY2hhcmFjdGVyOiBudW1iZXIgfTsgZW5kOiB7IGxpbmU6IG51bWJlcjsgY2hhcmFjdGVyOiBudW1iZXIgfSB9KTogbW9uYWNvLklSYW5nZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnRMaW5lTnVtYmVyOiByLnN0YXJ0LmxpbmUgKyAxLFxuICAgICAgICBzdGFydENvbHVtbjogICAgIHIuc3RhcnQuY2hhcmFjdGVyICsgMSxcbiAgICAgICAgZW5kTGluZU51bWJlcjogICByLmVuZC5saW5lICsgMSxcbiAgICAgICAgZW5kQ29sdW1uOiAgICAgICByLmVuZC5jaGFyYWN0ZXIgKyAxLFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIG1hcmt1cFRvU3RyaW5nKGM6IHN0cmluZyB8IE1hcmt1cENvbnRlbnQpOiBzdHJpbmcge1xuICAgIHJldHVybiB0eXBlb2YgYyA9PT0gJ3N0cmluZycgPyBjIDogYy52YWx1ZTtcbn1cblxuZnVuY3Rpb24gbHNwQ29tcGxldGlvbktpbmQoa2luZDogQ29tcGxldGlvbkl0ZW1LaW5kIHwgdW5kZWZpbmVkKTogbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbUtpbmQge1xuICAgIGNvbnN0IEsgPSBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtS2luZDtcbiAgICBzd2l0Y2ggKGtpbmQpIHtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuVGV4dDogICAgICAgICAgcmV0dXJuIEsuVGV4dDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuTWV0aG9kOiAgICAgICAgcmV0dXJuIEsuTWV0aG9kO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5GdW5jdGlvbjogICAgICByZXR1cm4gSy5GdW5jdGlvbjtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuQ29uc3RydWN0b3I6ICAgcmV0dXJuIEsuQ29uc3RydWN0b3I7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLkZpZWxkOiAgICAgICAgIHJldHVybiBLLkZpZWxkO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5WYXJpYWJsZTogICAgICByZXR1cm4gSy5WYXJpYWJsZTtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuQ2xhc3M6ICAgICAgICAgcmV0dXJuIEsuQ2xhc3M7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLkludGVyZmFjZTogICAgIHJldHVybiBLLkludGVyZmFjZTtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuTW9kdWxlOiAgICAgICAgcmV0dXJuIEsuTW9kdWxlO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5Qcm9wZXJ0eTogICAgICByZXR1cm4gSy5Qcm9wZXJ0eTtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuS2V5d29yZDogICAgICAgcmV0dXJuIEsuS2V5d29yZDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuU25pcHBldDogICAgICAgcmV0dXJuIEsuU25pcHBldDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuQ29uc3RhbnQ6ICAgICAgcmV0dXJuIEsuQ29uc3RhbnQ7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLlN0cnVjdDogICAgICAgIHJldHVybiBLLlN0cnVjdDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuVHlwZVBhcmFtZXRlcjogcmV0dXJuIEsuVHlwZVBhcmFtZXRlcjtcbiAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEsuVGV4dDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGxzcENvbXBsZXRpb25Ub01vbmFjbyhcbiAgICBpdGVtOiBDb21wbGV0aW9uSXRlbSxcbiAgICBtb2RlbDogbW9uYWNvLmVkaXRvci5JVGV4dE1vZGVsLFxuICAgIHBvc2l0aW9uOiBtb25hY28uUG9zaXRpb24sXG4pOiBNb25hY29Db21wbGV0aW9uSXRlbSB7XG4gICAgY29uc3Qgd29yZCA9IG1vZGVsLmdldFdvcmRVbnRpbFBvc2l0aW9uKHBvc2l0aW9uKTtcbiAgICBsZXQgcmFuZ2U6IG1vbmFjby5JUmFuZ2UgPSB7XG4gICAgICAgIHN0YXJ0TGluZU51bWJlcjogcG9zaXRpb24ubGluZU51bWJlcixcbiAgICAgICAgc3RhcnRDb2x1bW46ICAgICB3b3JkLnN0YXJ0Q29sdW1uLFxuICAgICAgICBlbmRMaW5lTnVtYmVyOiAgIHBvc2l0aW9uLmxpbmVOdW1iZXIsXG4gICAgICAgIGVuZENvbHVtbjogICAgICAgd29yZC5lbmRDb2x1bW4sXG4gICAgfTtcbiAgICBsZXQgaW5zZXJ0VGV4dCA9IGl0ZW0uaW5zZXJ0VGV4dCA/PyBpdGVtLmxhYmVsO1xuICAgIGNvbnN0IHRleHRFZGl0ID0gaXRlbS50ZXh0RWRpdCBhcyB7IHJhbmdlPzogTHNwUmFuZ2U7IHJlcGxhY2U/OiBMc3BSYW5nZTsgaW5zZXJ0PzogTHNwUmFuZ2U7IG5ld1RleHQ/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcbiAgICBpZiAodGV4dEVkaXQpIHtcbiAgICAgICAgY29uc3QgciA9IHRleHRFZGl0LnJhbmdlID8/IHRleHRFZGl0LnJlcGxhY2UgPz8gdGV4dEVkaXQuaW5zZXJ0O1xuICAgICAgICBpZiAocikgcmFuZ2UgPSBsc3BSYW5nZVRvTW9uYWNvKHIpO1xuICAgICAgICBpZiAodHlwZW9mIHRleHRFZGl0Lm5ld1RleHQgPT09ICdzdHJpbmcnKSBpbnNlcnRUZXh0ID0gdGV4dEVkaXQubmV3VGV4dDtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0OiBNb25hY29Db21wbGV0aW9uSXRlbSA9IHtcbiAgICAgICAgbGFiZWw6ICAgICAgICAgICBpdGVtLmxhYmVsLFxuICAgICAgICBraW5kOiAgICAgICAgICAgIGxzcENvbXBsZXRpb25LaW5kKGl0ZW0ua2luZCksXG4gICAgICAgIGRldGFpbDogICAgICAgICAgaXRlbS5kZXRhaWwsXG4gICAgICAgIGRvY3VtZW50YXRpb246ICAgaXRlbS5kb2N1bWVudGF0aW9uID8geyB2YWx1ZTogbWFya3VwVG9TdHJpbmcoaXRlbS5kb2N1bWVudGF0aW9uKSwgaXNUcnVzdGVkOiBmYWxzZSB9IDogdW5kZWZpbmVkLFxuICAgICAgICBpbnNlcnRUZXh0LFxuICAgICAgICBpbnNlcnRUZXh0UnVsZXM6IGl0ZW0uaW5zZXJ0VGV4dEZvcm1hdCA9PT0gSW5zZXJ0VGV4dEZvcm1hdC5TbmlwcGV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbUluc2VydFRleHRSdWxlLkluc2VydEFzU25pcHBldFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgcmFuZ2UsXG4gICAgICAgIHNvcnRUZXh0OiAgICAgICAgICAgIHNka1ByaW9yaXRpc2VkU29ydFRleHQoaXRlbSksXG4gICAgICAgIGZpbHRlclRleHQ6ICAgICAgICAgIGl0ZW0uZmlsdGVyVGV4dCxcbiAgICAgICAgcHJlc2VsZWN0OiAgICAgICAgICAgaXRlbS5wcmVzZWxlY3QsXG4gICAgICAgIGNvbW1pdENoYXJhY3RlcnM6ICAgIGl0ZW0uY29tbWl0Q2hhcmFjdGVycyxcbiAgICAgICAgYWRkaXRpb25hbFRleHRFZGl0czogaXRlbS5hZGRpdGlvbmFsVGV4dEVkaXRzPy5tYXAodGV4dEVkaXRUb01vbmFjbyksXG4gICAgfTtcbiAgICByZXN1bHQuX2xzcCA9IGl0ZW07XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBSYW5rcyBEaXJpZ2libGUgU0RLIHN1Z2dlc3Rpb25zICh7QGNvZGUgb3JnLmVjbGlwc2UuZGlyaWdpYmxlLnNkay4qfSkgYWJvdmUgZXZlcnl0aGluZyBlbHNlIGJ5XG4gKiBwcmVmaXhpbmcgdGhlIHNlcnZlciBzb3J0VGV4dCB3aXRoIGEgcHJpb3JpdHkgYnVja2V0LCBwcmVzZXJ2aW5nIHRoZSBzZXJ2ZXIgb3JkZXIgd2l0aGluIGVhY2ggYnVja2V0LlxuICovXG5mdW5jdGlvbiBzZGtQcmlvcml0aXNlZFNvcnRUZXh0KGl0ZW06IENvbXBsZXRpb25JdGVtKTogc3RyaW5nIHtcbiAgICBjb25zdCBiYXNlID0gaXRlbS5zb3J0VGV4dCA/PyAodHlwZW9mIGl0ZW0ubGFiZWwgPT09ICdzdHJpbmcnID8gaXRlbS5sYWJlbCA6ICcnKTtcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IChpdGVtLmxhYmVsRGV0YWlscyAmJiB0eXBlb2YgaXRlbS5sYWJlbERldGFpbHMuZGVzY3JpcHRpb24gPT09ICdzdHJpbmcnKVxuICAgICAgICA/IGl0ZW0ubGFiZWxEZXRhaWxzLmRlc2NyaXB0aW9uIDogJyc7XG4gICAgY29uc3QgaGF5c3RhY2sgPSBgJHtpdGVtLmRldGFpbCA/PyAnJ30gJHtkZXNjcmlwdGlvbn1gO1xuICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcygnb3JnLmVjbGlwc2UuZGlyaWdpYmxlLnNkaycpID8gYDBfJHtiYXNlfWAgOiBgMV8ke2Jhc2V9YDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ29kZSBhY3Rpb25zLCBjb21tYW5kcywgcmVmYWN0b3IvZ2VuZXJhdGUsIHdvcmtzcGFjZSBlZGl0c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogTW9uYWNvIGNvbW1hbmQgaWQgdXNlZCB0byBhcHBseSBhIGRlZmVycmVkIExTUCBjb2RlIGFjdGlvbiB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgaXQuICovXG5jb25zdCBBUFBMWV9BQ1RJT05fQ09NTUFORCA9ICdkaXJpZ2libGUuamF2YS5hcHBseUNvZGVBY3Rpb24nO1xuXG4vKiogVmlydHVhbCBVUkkgcHJlZml4IG9mIGVkaXRvciBtb2RlbHM7IHN0cmlwcGluZyBpdCB5aWVsZHMgdGhlIElERSB3b3Jrc3BhY2UgcGF0aCAoL3dzL3Byb2ovLi4uKS4gKi9cbmNvbnN0IFZJUlRVQUxfRklMRV9QUkVGSVggPSAnZmlsZTovLy93b3Jrc3BhY2UnO1xuXG4vKiogTW9uYWNvIGNvbW1hbmQgaWQgdXNlZCBmb3IgZGlzcGxheS1vbmx5IENvZGVMZW5zZXMgKGUuZy4gYSByZWZlcmVuY2UgY291bnQgd2l0aCBubyByZXNvbHZlZCBhY3Rpb24pLiAqL1xuY29uc3QgTk9PUF9DT01NQU5EID0gJ2RpcmlnaWJsZS5qYXZhLm5vb3BMZW5zJztcblxuLyoqIEphdmEgU0Uga2V5d29yZHMvbGl0ZXJhbHMgb2ZmZXJlZCBhcyBsb3ctcHJpb3JpdHkgY29tcGxldGlvbiBzbyB0aGV5IGFsd2F5cyBhcHBlYXIgd2hpbGUgdHlwaW5nLiAqL1xuY29uc3QgSkFWQV9LRVlXT1JEUyA9IFsnYWJzdHJhY3QnLCAnYXNzZXJ0JywgJ2Jvb2xlYW4nLCAnYnJlYWsnLCAnYnl0ZScsICdjYXNlJywgJ2NhdGNoJywgJ2NoYXInLCAnY2xhc3MnLFxuICAgICdjb25zdCcsICdjb250aW51ZScsICdkZWZhdWx0JywgJ2RvJywgJ2RvdWJsZScsICdlbHNlJywgJ2VudW0nLCAnZXh0ZW5kcycsICdmaW5hbCcsICdmaW5hbGx5JywgJ2Zsb2F0JyxcbiAgICAnZm9yJywgJ2dvdG8nLCAnaWYnLCAnaW1wbGVtZW50cycsICdpbXBvcnQnLCAnaW5zdGFuY2VvZicsICdpbnQnLCAnaW50ZXJmYWNlJywgJ2xvbmcnLCAnbmF0aXZlJywgJ25ldycsXG4gICAgJ3BhY2thZ2UnLCAncHJpdmF0ZScsICdwcm90ZWN0ZWQnLCAncHVibGljJywgJ3JldHVybicsICdzaG9ydCcsICdzdGF0aWMnLCAnc3RyaWN0ZnAnLCAnc3VwZXInLCAnc3dpdGNoJyxcbiAgICAnc3luY2hyb25pemVkJywgJ3RoaXMnLCAndGhyb3cnLCAndGhyb3dzJywgJ3RyYW5zaWVudCcsICd0cnknLCAndm9pZCcsICd2b2xhdGlsZScsICd3aGlsZScsICd2YXInLFxuICAgICd5aWVsZCcsICdyZWNvcmQnLCAnc2VhbGVkJywgJ3Blcm1pdHMnLCAndHJ1ZScsICdmYWxzZScsICdudWxsJ107XG5cbi8qKiBTaGFyZWQgZGVmaW5pdGlvbi1zdHlsZSBsb2NhdGlvbiByZXF1ZXN0IHVzZWQgYnkgZ28tdG8tZGVmaW5pdGlvbi9pbXBsZW1lbnRhdGlvbi90eXBlLWRlZmluaXRpb24uICovXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0TG9jYXRpb25zKG1ldGhvZDogc3RyaW5nLCBtb2RlbDogbW9uYWNvLmVkaXRvci5JVGV4dE1vZGVsLCBwb3NpdGlvbjogbW9uYWNvLlBvc2l0aW9uKSB7XG4gICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgcmVzdWx0OiBMb2NhdGlvbiB8IExvY2F0aW9uW10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QobWV0aG9kLCB7XG4gICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgfSk7XG4gICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGxvY2F0aW9ucyA9IChBcnJheS5pc0FycmF5KHJlc3VsdCkgPyByZXN1bHQgOiBbcmVzdWx0XSkubWFwKGxvYyA9PiAoeyB1cmk6IG1vbmFjby5VcmkucGFyc2UobG9jLnVyaSksIHJhbmdlOiBsc3BSYW5nZVRvTW9uYWNvKGxvYy5yYW5nZSkgfSkpO1xuICAgIGF3YWl0IGVuc3VyZU1vZGVsc0ZvckxvY2F0aW9ucyhsb2NhdGlvbnMpO1xuICAgIHJldHVybiBsb2NhdGlvbnM7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBpbi1tZW1vcnkgTW9uYWNvIG1vZGVscyBmb3IgdGhlIHdvcmtzcGFjZSBmaWxlcyByZWZlcmVuY2VkIGJ5IHRoZSBnaXZlbiBsb2NhdGlvbnMgKGZldGNoZWRcbiAqIG92ZXIgUkVTVCkgc28gdGhlIHJlZmVyZW5jZXMgLyBwZWVrIHdpZGdldHMgY2FuIHJlbmRlciBhIGNvZGUgcHJldmlldyBcdTIwMTQgTW9uYWNvIGNhbiBvbmx5IHByZXZpZXcgZmlsZXNcbiAqIGl0IGhhcyBhIG1vZGVsIGZvciwgYW5kIHRoaXMgc2luZ2xlLWZpbGUgZWRpdG9yIG90aGVyd2lzZSBoYXMgbm9uZSBmb3Igb3RoZXIgZmlsZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGVuc3VyZU1vZGVsc0ZvckxvY2F0aW9ucyhsb2NhdGlvbnM6IEFycmF5PHsgdXJpOiBtb25hY28uVXJpIH0+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKGxvY2F0aW9ucy5tYXAoYXN5bmMgKHsgdXJpIH0pID0+IHtcbiAgICAgICAgY29uc3QgdXJpU3RyID0gdXJpLnRvU3RyaW5nKCk7XG4gICAgICAgIGlmIChzZWVuLmhhcyh1cmlTdHIpIHx8ICF1cmlTdHIuc3RhcnRzV2l0aChWSVJUVUFMX0ZJTEVfUFJFRklYKSB8fCBtb25hY28uZWRpdG9yLmdldE1vZGVsKHVyaSkpIHJldHVybjtcbiAgICAgICAgc2Vlbi5hZGQodXJpU3RyKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCBmZXRjaFdvcmtzcGFjZUZpbGVUZXh0KHVyaVRvV29ya3NwYWNlUGF0aCh1cmlTdHIpID8/IHVyaVN0cik7XG4gICAgICAgICAgICBpZiAoIW1vbmFjby5lZGl0b3IuZ2V0TW9kZWwodXJpKSkgbW9uYWNvLmVkaXRvci5jcmVhdGVNb2RlbCh0ZXh0LCAnamF2YScsIHVyaSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gcHJldmlldyBqdXN0IHdvbid0IHJlbmRlciBmb3IgdGhpcyBvbmVcbiAgICAgICAgfVxuICAgIH0pKTtcbn1cblxuLyoqIFJlY3Vyc2l2ZWx5IG1hcHMgTFNQIGhpZXJhcmNoaWNhbCBEb2N1bWVudFN5bWJvbHMgdG8gTW9uYWNvJ3Mgc2hhcGUgKGtpbmRzIGFyZSAxLWJhc2VkIHZzIDAtYmFzZWQpLiAqL1xuZnVuY3Rpb24gbWFwRG9jdW1lbnRTeW1ib2xzKHN5bWJvbHM6IGFueVtdKTogbW9uYWNvLmxhbmd1YWdlcy5Eb2N1bWVudFN5bWJvbFtdIHtcbiAgICByZXR1cm4gKHN5bWJvbHMgPz8gW10pLm1hcChzID0+ICh7XG4gICAgICAgIG5hbWU6ICAgICAgICAgICBzLm5hbWUsXG4gICAgICAgIGRldGFpbDogICAgICAgICBzLmRldGFpbCA/PyAnJyxcbiAgICAgICAga2luZDogICAgICAgICAgIChzLmtpbmQgPz8gMSkgLSAxLFxuICAgICAgICB0YWdzOiAgICAgICAgICAgcy50YWdzID8/IFtdLFxuICAgICAgICByYW5nZTogICAgICAgICAgbHNwUmFuZ2VUb01vbmFjbyhzLnJhbmdlKSxcbiAgICAgICAgc2VsZWN0aW9uUmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28ocy5zZWxlY3Rpb25SYW5nZSA/PyBzLnJhbmdlKSxcbiAgICAgICAgY2hpbGRyZW46ICAgICAgIHMuY2hpbGRyZW4gPyBtYXBEb2N1bWVudFN5bWJvbHMocy5jaGlsZHJlbikgOiBbXSxcbiAgICB9KSk7XG59XG5cbmZ1bmN0aW9uIGZvbGRpbmdLaW5kKGtpbmQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IG1vbmFjby5sYW5ndWFnZXMuRm9sZGluZ1JhbmdlS2luZCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgRksgPSBtb25hY28ubGFuZ3VhZ2VzLkZvbGRpbmdSYW5nZUtpbmQ7XG4gICAgc3dpdGNoIChraW5kKSB7XG4gICAgICAgIGNhc2UgJ2NvbW1lbnQnOiByZXR1cm4gRksuQ29tbWVudDtcbiAgICAgICAgY2FzZSAnaW1wb3J0cyc6IHJldHVybiBGSy5JbXBvcnRzO1xuICAgICAgICBjYXNlICdyZWdpb24nOiAgcmV0dXJuIEZLLlJlZ2lvbjtcbiAgICAgICAgZGVmYXVsdDogICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxufVxuXG4vKiogRmxhdHRlbnMgYW4gTFNQIFNlbGVjdGlvblJhbmdlIHBhcmVudC1jaGFpbiBpbnRvIE1vbmFjbydzIGlubmVybW9zdC10by1vdXRlcm1vc3QgYXJyYXkuICovXG5mdW5jdGlvbiBmbGF0dGVuU2VsZWN0aW9uUmFuZ2Uoc2VsZWN0aW9uUmFuZ2U6IGFueSk6IG1vbmFjby5sYW5ndWFnZXMuU2VsZWN0aW9uUmFuZ2VbXSB7XG4gICAgY29uc3QgcmFuZ2VzOiBtb25hY28ubGFuZ3VhZ2VzLlNlbGVjdGlvblJhbmdlW10gPSBbXTtcbiAgICBsZXQgY3VycmVudCA9IHNlbGVjdGlvblJhbmdlO1xuICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICAgIHJhbmdlcy5wdXNoKHsgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28oY3VycmVudC5yYW5nZSkgfSk7XG4gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudDtcbiAgICB9XG4gICAgcmV0dXJuIHJhbmdlcztcbn1cblxuLyoqIE1hcHMgYSBKRFQuTFMgQ29kZUxlbnMgY29tbWFuZCB0byBhIE1vbmFjbyBjb21tYW5kLCB3aXJpbmcgdGhlIHJlZmVyZW5jZXMvaW1wbGVtZW50YXRpb25zIHBlZWsuICovXG5mdW5jdGlvbiBtYXBMZW5zQ29tbWFuZChjbWQ6IGFueSk6IG1vbmFjby5sYW5ndWFnZXMuQ29tbWFuZCB7XG4gICAgY29uc3QgYXJncyA9IGNtZC5hcmd1bWVudHMgPz8gW107XG4gICAgaWYgKChjbWQuY29tbWFuZCA9PT0gJ2phdmEuc2hvdy5yZWZlcmVuY2VzJyB8fCBjbWQuY29tbWFuZCA9PT0gJ2phdmEuc2hvdy5pbXBsZW1lbnRhdGlvbnMnKSAmJiBhcmdzLmxlbmd0aCA+PSAzKSB7XG4gICAgICAgIGNvbnN0IGxvY2F0aW9ucyA9IChhcmdzWzJdID8/IFtdKS5tYXAoKGw6IGFueSkgPT4gKHsgdXJpOiBtb25hY28uVXJpLnBhcnNlKGwudXJpKSwgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28obC5yYW5nZSkgfSkpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6ICAgICAgICAnZWRpdG9yLmFjdGlvbi5zaG93UmVmZXJlbmNlcycsXG4gICAgICAgICAgICB0aXRsZTogICAgIGNtZC50aXRsZSxcbiAgICAgICAgICAgIGFyZ3VtZW50czogW21vbmFjby5VcmkucGFyc2UoYXJnc1swXSksIHsgbGluZU51bWJlcjogYXJnc1sxXS5saW5lICsgMSwgY29sdW1uOiBhcmdzWzFdLmNoYXJhY3RlciArIDEgfSwgbG9jYXRpb25zXSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgaWQ6IE5PT1BfQ09NTUFORCwgdGl0bGU6IGNtZC50aXRsZSB9O1xufVxuXG50eXBlIExzcFJhbmdlID0geyBzdGFydDogeyBsaW5lOiBudW1iZXI7IGNoYXJhY3RlcjogbnVtYmVyIH07IGVuZDogeyBsaW5lOiBudW1iZXI7IGNoYXJhY3RlcjogbnVtYmVyIH0gfTtcblxuLyoqIE1vbmFjbyBjb21wbGV0aW9uIGl0ZW0gY2FycnlpbmcgdGhlIG9yaWdpbmF0aW5nIExTUCBpdGVtIHNvIHJlc29sdmUgY2FuIGZldGNoIGl0cyBpbXBvcnQgZWRpdHMuICovXG50eXBlIE1vbmFjb0NvbXBsZXRpb25JdGVtID0gbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbSAmIHsgX2xzcD86IENvbXBsZXRpb25JdGVtIH07XG5cbmZ1bmN0aW9uIHRleHRFZGl0VG9Nb25hY28oZWRpdDogVGV4dEVkaXQpOiBtb25hY28ubGFuZ3VhZ2VzLlRleHRFZGl0IHtcbiAgICByZXR1cm4geyByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhlZGl0LnJhbmdlKSwgdGV4dDogZWRpdC5uZXdUZXh0IH07XG59XG5cbmZ1bmN0aW9uIG1vbmFjb1JhbmdlVG9Mc3AocjogbW9uYWNvLklSYW5nZSk6IExzcFJhbmdlIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBzdGFydDogeyBsaW5lOiByLnN0YXJ0TGluZU51bWJlciAtIDEsIGNoYXJhY3Rlcjogci5zdGFydENvbHVtbiAtIDEgfSxcbiAgICAgICAgZW5kOiAgIHsgbGluZTogci5lbmRMaW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiByLmVuZENvbHVtbiAtIDEgfSxcbiAgICB9O1xufVxuXG4vKiogVHJ1ZSB3aGVuIHR3byBMU1AgcmFuZ2VzIGludGVyc2VjdCAodXNlZCB0byBwaWNrIHRoZSBkaWFnbm9zdGljcyByZWxldmFudCB0byBhIGNvZGUtYWN0aW9uIHJlcXVlc3QpLiAqL1xuZnVuY3Rpb24gcmFuZ2VzT3ZlcmxhcChhOiBMc3BSYW5nZSwgYjogTHNwUmFuZ2UpOiBib29sZWFuIHtcbiAgICBjb25zdCBub3RBZnRlciA9IChwOiB7IGxpbmU6IG51bWJlcjsgY2hhcmFjdGVyOiBudW1iZXIgfSwgcTogeyBsaW5lOiBudW1iZXI7IGNoYXJhY3RlcjogbnVtYmVyIH0pID0+XG4gICAgICAgIHAubGluZSA8IHEubGluZSB8fCAocC5saW5lID09PSBxLmxpbmUgJiYgcC5jaGFyYWN0ZXIgPD0gcS5jaGFyYWN0ZXIpO1xuICAgIHJldHVybiBub3RBZnRlcihhLnN0YXJ0LCBiLmVuZCkgJiYgbm90QWZ0ZXIoYi5zdGFydCwgYS5lbmQpO1xufVxuXG5mdW5jdGlvbiBsc3BDb2RlQWN0aW9uVG9Nb25hY28oYWN0aW9uOiBDb2RlQWN0aW9uIHwgQ29tbWFuZCk6IG1vbmFjby5sYW5ndWFnZXMuQ29kZUFjdGlvbiB7XG4gICAgY29uc3QgaXNDb21tYW5kID0gdHlwZW9mIChhY3Rpb24gYXMgQ29tbWFuZCkuY29tbWFuZCA9PT0gJ3N0cmluZyc7XG4gICAgY29uc3QgdGl0bGUgPSBhY3Rpb24udGl0bGVcbiAgICAgICAgPz8gKGlzQ29tbWFuZCA/IChhY3Rpb24gYXMgQ29tbWFuZCkuY29tbWFuZCA6IChhY3Rpb24gYXMgQ29kZUFjdGlvbikuY29tbWFuZD8udGl0bGUpXG4gICAgICAgID8/ICdBY3Rpb24nO1xuICAgIGNvbnN0IGtpbmQgPSBpc0NvbW1hbmQgPyAncXVpY2tmaXgnIDogKChhY3Rpb24gYXMgQ29kZUFjdGlvbikua2luZCA/PyAncXVpY2tmaXgnKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB0aXRsZSxcbiAgICAgICAga2luZCxcbiAgICAgICAgZGlhZ25vc3RpY3M6IFtdLFxuICAgICAgICBpc1ByZWZlcnJlZDogKGFjdGlvbiBhcyBDb2RlQWN0aW9uKS5pc1ByZWZlcnJlZCxcbiAgICAgICAgLy8gQXBwbHkgbGF6aWx5IHRocm91Z2ggb3VyIGNvbW1hbmQgc28gd2UgY2FuIHJlc29sdmUsIHJ1biBzZXJ2ZXIgY29tbWFuZHMgYW5kIGFwcGx5IGVkaXRzIHVuaWZvcm1seS5cbiAgICAgICAgY29tbWFuZDogeyBpZDogQVBQTFlfQUNUSU9OX0NPTU1BTkQsIHRpdGxlLCBhcmd1bWVudHM6IFthY3Rpb25dIH0sXG4gICAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gYXBwbHlDb2RlQWN0aW9uKGFjdGlvbjogQ29kZUFjdGlvbiB8IENvbW1hbmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIV9jb25uKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiAoYWN0aW9uIGFzIENvbW1hbmQpLmNvbW1hbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBhd2FpdCBydW5TZXJ2ZXJDb21tYW5kKGFjdGlvbiBhcyBDb21tYW5kKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzb2x2ZWQgPSBhY3Rpb24gYXMgQ29kZUFjdGlvbjtcbiAgICAgICAgaWYgKCFyZXNvbHZlZC5lZGl0ICYmIChyZXNvbHZlZCBhcyB7IGRhdGE/OiB1bmtub3duIH0pLmRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzb2x2ZWQgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgnY29kZUFjdGlvbi9yZXNvbHZlJywgcmVzb2x2ZWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXNvbHZlZC5lZGl0KSBhcHBseVdvcmtzcGFjZUVkaXQocmVzb2x2ZWQuZWRpdCk7XG4gICAgICAgIGlmIChyZXNvbHZlZC5jb21tYW5kKSBhd2FpdCBydW5TZXJ2ZXJDb21tYW5kKHJlc29sdmVkLmNvbW1hbmQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbamF2YS1sc3BdIGNvZGUgYWN0aW9uIGZhaWxlZDonLCAoZSBhcyBFcnJvcik/Lm1lc3NhZ2UgPz8gZSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBpc1dvcmtzcGFjZUVkaXQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBXb3Jrc3BhY2VFZGl0IHtcbiAgICByZXR1cm4gISF2YWx1ZSAmJiAoISEodmFsdWUgYXMgV29ya3NwYWNlRWRpdCkuY2hhbmdlcyB8fCAhISh2YWx1ZSBhcyBXb3Jrc3BhY2VFZGl0KS5kb2N1bWVudENoYW5nZXMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5TZXJ2ZXJDb21tYW5kKGNtZDogQ29tbWFuZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghX2Nvbm4gfHwgIWNtZD8uY29tbWFuZCkgcmV0dXJuO1xuICAgIGlmIChHRU5FUkFURVtjbWQuY29tbWFuZF0pIHtcbiAgICAgICAgYXdhaXQgcnVuR2VuZXJhdGUoY21kLmNvbW1hbmQsIGNtZC5hcmd1bWVudHMgPz8gW10pO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd3b3Jrc3BhY2UvZXhlY3V0ZUNvbW1hbmQnLCB7IGNvbW1hbmQ6IGNtZC5jb21tYW5kLCBhcmd1bWVudHM6IGNtZC5hcmd1bWVudHMgPz8gW10gfSk7XG4gICAgaWYgKGlzV29ya3NwYWNlRWRpdChyZXN1bHQpKSBhcHBseVdvcmtzcGFjZUVkaXQocmVzdWx0KTtcbn1cblxuaW50ZXJmYWNlIEdlbmVyYXRlU3BlYyB7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICBzdGF0dXM6IHN0cmluZztcbiAgICBnZW5lcmF0ZTogc3RyaW5nO1xuICAgIG1lbWJlcnM6IChzdGF0dXM6IGFueSkgPT4gQXJyYXk8eyBsYWJlbDogc3RyaW5nOyByZWY6IGFueSB9PjtcbiAgICBidWlsZEFyZ3M6IChwcm9tcHRBcmdzOiBhbnlbXSwgc3RhdHVzOiBhbnksIHNlbGVjdGVkOiBhbnlbXSkgPT4gYW55W107XG59XG5cbi8qKiBNZW1iZXItbmFtZWQgZmllbGRzIFx1MjE5MiBwaWNrZXIgbGFiZWxzLiAqL1xuZnVuY3Rpb24gZmllbGRMYWJlbChmOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSBmPy5uYW1lID8/IGY/LmZpZWxkTmFtZSA/PyAnJztcbiAgICBjb25zdCB0eXBlID0gZj8udHlwZSA/PyBmPy50eXBlTmFtZTtcbiAgICByZXR1cm4gdHlwZSA/IGAke25hbWV9OiAke3R5cGV9YCA6IGAke25hbWV9YDtcbn1cblxuLyoqXG4gKiBUaGUgSkRULkxTIHNvdXJjZS1nZW5lcmF0aW9uIGNvbW1hbmRzIChjb25zdHJ1Y3RvcnMsIGdldHRlcnMvc2V0dGVycywgdG9TdHJpbmcsIGhhc2hDb2RlL2VxdWFscykuXG4gKiBFYWNoIG1hcHMgdGhlIGNsaWVudCBcIipQcm9tcHRcIiBjb21tYW5kIHRvIHRoZSBzZXJ2ZXIgc3RhdHVzICsgZ2VuZXJhdGUgZGVsZWdhdGUgY29tbWFuZHM7IHRoZSBzdGF0dXNcbiAqIGNhbGwgeWllbGRzIHRoZSBjYW5kaWRhdGUgZmllbGRzIHNob3duIGluIHRoZSBtZW1iZXIgcGlja2VyLCB0aGUgZ2VuZXJhdGUgY2FsbCByZXR1cm5zIHRoZSBlZGl0LlxuICovXG5jb25zdCBHRU5FUkFURTogUmVjb3JkPHN0cmluZywgR2VuZXJhdGVTcGVjPiA9IHtcbiAgICAnamF2YS5hY3Rpb24uZ2VuZXJhdGVDb25zdHJ1Y3RvcnNQcm9tcHQnOiB7XG4gICAgICAgIGxhYmVsOiAnU2VsZWN0IGZpZWxkcyBhbmQgY29uc3RydWN0b3JzJyxcbiAgICAgICAgc3RhdHVzOiAnamF2YS5hY3Rpb24uY2hlY2tDb25zdHJ1Y3RvcnNTdGF0dXMnLFxuICAgICAgICBnZW5lcmF0ZTogJ2phdmEuYWN0aW9uLmdlbmVyYXRlQ29uc3RydWN0b3JzJyxcbiAgICAgICAgbWVtYmVyczogKHMpID0+IChzPy5maWVsZHMgPz8gW10pLm1hcCgoZjogYW55KSA9PiAoeyBsYWJlbDogZmllbGRMYWJlbChmKSwgcmVmOiBmIH0pKSxcbiAgICAgICAgYnVpbGRBcmdzOiAoYXJncywgcywgc2VsKSA9PiBbYXJnc1swXSwgeyBjb25zdHJ1Y3RvcnM6IHM/LmNvbnN0cnVjdG9ycyA/PyBbXSwgZmllbGRzOiBzZWwubWFwKG0gPT4gbS5yZWYpIH1dLFxuICAgIH0sXG4gICAgJ2phdmEuYWN0aW9uLmdlbmVyYXRlVG9TdHJpbmdQcm9tcHQnOiB7XG4gICAgICAgIGxhYmVsOiAnU2VsZWN0IGZpZWxkcyB0byBpbmNsdWRlIGluIHRvU3RyaW5nKCknLFxuICAgICAgICBzdGF0dXM6ICdqYXZhLmFjdGlvbi5jaGVja1RvU3RyaW5nU3RhdHVzJyxcbiAgICAgICAgZ2VuZXJhdGU6ICdqYXZhLmFjdGlvbi5nZW5lcmF0ZVRvU3RyaW5nJyxcbiAgICAgICAgbWVtYmVyczogKHMpID0+IChzPy5maWVsZHMgPz8gW10pLm1hcCgoZjogYW55KSA9PiAoeyBsYWJlbDogZmllbGRMYWJlbChmKSwgcmVmOiBmIH0pKSxcbiAgICAgICAgYnVpbGRBcmdzOiAoYXJncywgX3MsIHNlbCkgPT4gW2FyZ3NbMF0sIHNlbC5tYXAobSA9PiBtLnJlZildLFxuICAgIH0sXG4gICAgJ2phdmEuYWN0aW9uLmhhc2hDb2RlRXF1YWxzUHJvbXB0Jzoge1xuICAgICAgICBsYWJlbDogJ1NlbGVjdCBmaWVsZHMgZm9yIGhhc2hDb2RlKCkgYW5kIGVxdWFscygpJyxcbiAgICAgICAgc3RhdHVzOiAnamF2YS5hY3Rpb24uY2hlY2tIYXNoQ29kZUVxdWFsc1N0YXR1cycsXG4gICAgICAgIGdlbmVyYXRlOiAnamF2YS5hY3Rpb24uZ2VuZXJhdGVIYXNoQ29kZUVxdWFscycsXG4gICAgICAgIG1lbWJlcnM6IChzKSA9PiAocz8uZmllbGRzID8/IFtdKS5tYXAoKGY6IGFueSkgPT4gKHsgbGFiZWw6IGZpZWxkTGFiZWwoZiksIHJlZjogZiB9KSksXG4gICAgICAgIGJ1aWxkQXJnczogKGFyZ3MsIF9zLCBzZWwpID0+IFthcmdzWzBdLCBzZWwubWFwKG0gPT4gbS5yZWYpLCBmYWxzZV0sXG4gICAgfSxcbiAgICAnamF2YS5hY3Rpb24uZ2VuZXJhdGVBY2Nlc3NvcnNQcm9tcHQnOiB7XG4gICAgICAgIGxhYmVsOiAnU2VsZWN0IGZpZWxkcyB0byBnZW5lcmF0ZSBnZXR0ZXJzIGFuZCBzZXR0ZXJzJyxcbiAgICAgICAgc3RhdHVzOiAnamF2YS5hY3Rpb24uY2hlY2tBY2Nlc3NvcnNTdGF0dXMnLFxuICAgICAgICBnZW5lcmF0ZTogJ2phdmEuYWN0aW9uLmdlbmVyYXRlQWNjZXNzb3JzJyxcbiAgICAgICAgbWVtYmVyczogKHMpID0+IChzPy5hY2Nlc3NvcnMgPz8gcyA/PyBbXSkubWFwKChhOiBhbnkpID0+ICh7IGxhYmVsOiBmaWVsZExhYmVsKGEpLCByZWY6IGEgfSkpLFxuICAgICAgICBidWlsZEFyZ3M6IChhcmdzLCBfcywgc2VsKSA9PiBbYXJnc1swXSwgc2VsLm1hcChtID0+IG0ucmVmKV0sXG4gICAgfSxcbiAgICAnamF2YS5hY3Rpb24ub3ZlcnJpZGVNZXRob2RzUHJvbXB0Jzoge1xuICAgICAgICBsYWJlbDogJ1NlbGVjdCBtZXRob2RzIHRvIG92ZXJyaWRlIG9yIGltcGxlbWVudCcsXG4gICAgICAgIHN0YXR1czogJ2phdmEuYWN0aW9uLmxpc3RPdmVycmlkYWJsZU1ldGhvZHMnLFxuICAgICAgICBnZW5lcmF0ZTogJ2phdmEuYWN0aW9uLmFkZE92ZXJyaWRhYmxlTWV0aG9kcycsXG4gICAgICAgIG1lbWJlcnM6IChzKSA9PiAocz8ubWV0aG9kcyA/PyBbXSkubWFwKChtOiBhbnkpID0+ICh7XG4gICAgICAgICAgICBsYWJlbDogYCR7bS5uYW1lfSgkeyhtLnBhcmFtZXRlcnMgPz8gW10pLmpvaW4oJywgJyl9KSR7bS5kZWNsYXJpbmdDbGFzcyA/ICcgOiAnICsgbS5kZWNsYXJpbmdDbGFzcyA6ICcnfWAsXG4gICAgICAgICAgICByZWY6IG0sXG4gICAgICAgIH0pKSxcbiAgICAgICAgYnVpbGRBcmdzOiAoYXJncywgc3RhdHVzLCBzZWwpID0+IFthcmdzWzBdLCB7IG92ZXJyaWRhYmxlTWV0aG9kczogc2VsLm1hcChtID0+IG0ucmVmKSwgdHlwZTogc3RhdHVzPy50eXBlIH1dLFxuICAgIH0sXG59O1xuXG5hc3luYyBmdW5jdGlvbiBydW5HZW5lcmF0ZShwcm9tcHRJZDogc3RyaW5nLCBhcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghX2Nvbm4pIHJldHVybjtcbiAgICBjb25zdCBzcGVjID0gR0VORVJBVEVbcHJvbXB0SWRdO1xuICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd3b3Jrc3BhY2UvZXhlY3V0ZUNvbW1hbmQnLCB7IGNvbW1hbmQ6IHNwZWMuc3RhdHVzLCBhcmd1bWVudHM6IGFyZ3MgfSk7XG4gICAgaWYgKCFzdGF0dXMpIHJldHVybjtcbiAgICBjb25zdCBtZW1iZXJzID0gc3BlYy5tZW1iZXJzKHN0YXR1cyk7XG4gICAgbGV0IHNlbGVjdGVkID0gbWVtYmVycztcbiAgICBjb25zdCBwaWNrZXIgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLmphdmFMc3BNZW1iZXJQaWNrZXI7XG4gICAgaWYgKG1lbWJlcnMubGVuZ3RoICYmIHR5cGVvZiBwaWNrZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY29uc3QgY2hvc2VuOiBzdHJpbmdbXSB8IG51bGwgPSBhd2FpdCBwaWNrZXIoc3BlYy5sYWJlbCwgbWVtYmVycy5tYXAobSA9PiBtLmxhYmVsKSk7XG4gICAgICAgIGlmIChjaG9zZW4gPT09IG51bGwpIHJldHVybjsgLy8gdXNlciBjYW5jZWxsZWQgdGhlIGRpYWxvZ1xuICAgICAgICBzZWxlY3RlZCA9IG1lbWJlcnMuZmlsdGVyKG0gPT4gY2hvc2VuLmluY2x1ZGVzKG0ubGFiZWwpKTtcbiAgICB9XG4gICAgY29uc3QgZWRpdCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd3b3Jrc3BhY2UvZXhlY3V0ZUNvbW1hbmQnLCB7XG4gICAgICAgIGNvbW1hbmQ6IHNwZWMuZ2VuZXJhdGUsXG4gICAgICAgIGFyZ3VtZW50czogc3BlYy5idWlsZEFyZ3MoYXJncywgc3RhdHVzLCBzZWxlY3RlZCksXG4gICAgfSk7XG4gICAgaWYgKGlzV29ya3NwYWNlRWRpdChlZGl0KSkgYXBwbHlXb3Jrc3BhY2VFZGl0KGVkaXQpO1xufVxuXG4vKiogR3JvdXBzIGEgd29ya3NwYWNlIGVkaXQncyB0ZXh0IGVkaXRzIGJ5IGRvY3VtZW50IGFuZCBhcHBsaWVzIHRoZW0gaW4gcGxhY2UgdG8gb3BlbiBNb25hY28gbW9kZWxzLiAqL1xuZnVuY3Rpb24gYXBwbHlXb3Jrc3BhY2VFZGl0KGVkaXQ6IFdvcmtzcGFjZUVkaXQgfCBudWxsIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0KSByZXR1cm47XG4gICAgY29uc3QgYnlVcmk6IFJlY29yZDxzdHJpbmcsIFRleHRFZGl0W10+ID0ge307XG4gICAgaWYgKGVkaXQuY2hhbmdlcykge1xuICAgICAgICBmb3IgKGNvbnN0IHVyaSBpbiBlZGl0LmNoYW5nZXMpIGJ5VXJpW3VyaV0gPSAoYnlVcmlbdXJpXSA/PyBbXSkuY29uY2F0KGVkaXQuY2hhbmdlc1t1cmldKTtcbiAgICB9XG4gICAgaWYgKGVkaXQuZG9jdW1lbnRDaGFuZ2VzKSB7XG4gICAgICAgIGZvciAoY29uc3QgZGMgb2YgZWRpdC5kb2N1bWVudENoYW5nZXMgYXMgYW55W10pIHtcbiAgICAgICAgICAgIGlmIChkYz8udGV4dERvY3VtZW50Py51cmkgJiYgQXJyYXkuaXNBcnJheShkYy5lZGl0cykpIHtcbiAgICAgICAgICAgICAgICBieVVyaVtkYy50ZXh0RG9jdW1lbnQudXJpXSA9IChieVVyaVtkYy50ZXh0RG9jdW1lbnQudXJpXSA/PyBbXSkuY29uY2F0KGRjLmVkaXRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IHVyaSBpbiBieVVyaSkge1xuICAgICAgICBjb25zdCBtb2RlbCA9IG1vbmFjby5lZGl0b3IuZ2V0TW9kZWxzKCkuZmluZChtID0+IG0udXJpLnRvU3RyaW5nKCkgPT09IHVyaSk7XG4gICAgICAgIGlmICghbW9kZWwpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBvcHMgPSBieVVyaVt1cmldLm1hcChlID0+ICh7IHJhbmdlOiBsc3BSYW5nZVRvTW9uYWNvKGUucmFuZ2UpLCB0ZXh0OiBlLm5ld1RleHQsIGZvcmNlTW92ZU1hcmtlcnM6IHRydWUgfSkpO1xuICAgICAgICBtb2RlbC5wdXNoRWRpdE9wZXJhdGlvbnMoW10sIG9wcywgKCkgPT4gbnVsbCk7XG4gICAgfVxufVxuXG4vKiogQ29udmVydHMgYW4gTFNQIHdvcmtzcGFjZSBlZGl0IGludG8gdGhlIE1vbmFjbyBzaGFwZSByZXR1cm5lZCBieSB0aGUgcmVuYW1lIHByb3ZpZGVyLiAqL1xuZnVuY3Rpb24gd29ya3NwYWNlRWRpdFRvTW9uYWNvKGVkaXQ6IFdvcmtzcGFjZUVkaXQgfCBudWxsKTogbW9uYWNvLmxhbmd1YWdlcy5Xb3Jrc3BhY2VFZGl0IHtcbiAgICBjb25zdCBlZGl0czogYW55W10gPSBbXTtcbiAgICBjb25zdCBwdXNoID0gKHVyaTogc3RyaW5nLCBsaXN0OiBUZXh0RWRpdFtdKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgZSBvZiBsaXN0KSB7XG4gICAgICAgICAgICBlZGl0cy5wdXNoKHsgcmVzb3VyY2U6IG1vbmFjby5VcmkucGFyc2UodXJpKSwgdGV4dEVkaXQ6IHsgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28oZS5yYW5nZSksIHRleHQ6IGUubmV3VGV4dCB9LCB2ZXJzaW9uSWQ6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgaWYgKGVkaXQ/LmNoYW5nZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCB1cmkgaW4gZWRpdC5jaGFuZ2VzKSBwdXNoKHVyaSwgZWRpdC5jaGFuZ2VzW3VyaV0pO1xuICAgIH1cbiAgICBpZiAoZWRpdD8uZG9jdW1lbnRDaGFuZ2VzKSB7XG4gICAgICAgIGZvciAoY29uc3QgZGMgb2YgZWRpdC5kb2N1bWVudENoYW5nZXMgYXMgYW55W10pIHtcbiAgICAgICAgICAgIGlmIChkYz8udGV4dERvY3VtZW50Py51cmkgJiYgQXJyYXkuaXNBcnJheShkYy5lZGl0cykpIHB1c2goZGMudGV4dERvY3VtZW50LnVyaSwgZGMuZWRpdHMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGVkaXRzIH07XG59XG5cbi8qKiBNYXBzIGEgdmlydHVhbCBlZGl0b3IgVVJJIGJhY2sgdG8gdGhlIElERSB3b3Jrc3BhY2UgcGF0aCAoe0Bjb2RlIC93cy9wcm9qLy4uLn0pLiAqL1xuZnVuY3Rpb24gdXJpVG9Xb3Jrc3BhY2VQYXRoKHVyaTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCF1cmkuc3RhcnRzV2l0aChWSVJUVUFMX0ZJTEVfUFJFRklYKSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh1cmkuc3Vic3RyaW5nKFZJUlRVQUxfRklMRV9QUkVGSVgubGVuZ3RoKSk7XG59XG5cbi8qKiBSZWFkcyBhIHdvcmtzcGFjZSBmaWxlJ3MgY3VycmVudCB0ZXh0IG92ZXIgdGhlIElERSBSRVNUIEFQSS4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZldGNoV29ya3NwYWNlRmlsZVRleHQoaWRlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvc2VydmljZXMvaWRlL3dvcmtzcGFjZXMnICsgaWRlUGF0aCwgeyBoZWFkZXJzOiB7ICdYLVJlcXVlc3RlZC1XaXRoJzogJ0ZldGNoJyB9IH0pO1xuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgcmVhZCAke2lkZVBhdGh9IChIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfSlgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTtcbn1cblxuLyoqIEFwcGxpZXMgTFNQIHRleHQgZWRpdHMgdG8gYSBzdHJpbmcuIE9mZnNldHMgYXJlIHJlc29sdmVkIGFnYWluc3QgdGhlIG9yaWdpbmFsIHRleHQgYW5kIGVkaXRzIGFyZVxuICogIGFwcGxpZWQgZnJvbSB0aGUgZW5kIGJhY2t3YXJkcywgc28gZWFybGllciBvZmZzZXRzIHN0YXkgdmFsaWQuICovXG5mdW5jdGlvbiBhcHBseUVkaXRzVG9UZXh0KHRleHQ6IHN0cmluZywgZWRpdHM6IFRleHRFZGl0W10pOiBzdHJpbmcge1xuICAgIGNvbnN0IGxpbmVTdGFydHMgPSBbMF07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICh0ZXh0LmNoYXJDb2RlQXQoaSkgPT09IDEwIC8qIFxcbiAqLykgbGluZVN0YXJ0cy5wdXNoKGkgKyAxKTtcbiAgICB9XG4gICAgY29uc3Qgb2Zmc2V0ID0gKHA6IHsgbGluZTogbnVtYmVyOyBjaGFyYWN0ZXI6IG51bWJlciB9KSA9PiAobGluZVN0YXJ0c1twLmxpbmVdID8/IHRleHQubGVuZ3RoKSArIHAuY2hhcmFjdGVyO1xuICAgIGNvbnN0IG9yZGVyZWQgPSBlZGl0cy5zbGljZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IG9mZnNldChiLnJhbmdlLnN0YXJ0KSAtIG9mZnNldChhLnJhbmdlLnN0YXJ0KSk7XG4gICAgbGV0IHJlc3VsdCA9IHRleHQ7XG4gICAgZm9yIChjb25zdCBlIG9mIG9yZGVyZWQpIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnNsaWNlKDAsIG9mZnNldChlLnJhbmdlLnN0YXJ0KSkgKyBlLm5ld1RleHQgKyByZXN1bHQuc2xpY2Uob2Zmc2V0KGUucmFuZ2UuZW5kKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQXBwbGllcyBhIEpEVC5MUyByZW5hbWUge0BsaW5rIFdvcmtzcGFjZUVkaXR9IGFjcm9zcyB0aGUgd2hvbGUgd29ya3NwYWNlOiB0ZXh0IGVkaXRzIGluIGV2ZXJ5XG4gKiBhZmZlY3RlZCBmaWxlIHBsdXMgYW55IHtAY29kZSBSZW5hbWVGaWxlfSBvcGVyYXRpb24gKGEgcHVibGljLXR5cGUgcmVuYW1lIHJlbmFtZXMgaXRzIG93blxuICoge0Bjb2RlIC5qYXZhfSBmaWxlKS4gVGhlIGN1cnJlbnQgZmlsZSdzIGVkaXRzIGdvIHRocm91Z2ggdGhlIGxpdmUgTW9uYWNvIG1vZGVsOyB0aGUgcmVzdCBhcmUgcmVhZCxcbiAqIGVkaXRlZCBhbmQgd3JpdHRlbiBiYWNrIG92ZXIgUkVTVC4gUGVyc2lzdGVuY2UgKENTUkYtZ3VhcmRlZCB3cml0ZXMsIHRoZSB0YWIgc3dpdGNoIHdoZW4gdGhlIGN1cnJlbnRcbiAqIGZpbGUgaXMgcmVuYW1lZCwgYW5kIHJlbG9hZGluZyBvdGhlciBvcGVuIGVkaXRvcnMpIGlzIGRlbGVnYXRlZCB0byB0aGUgSURFIHZpYSBqYXZhTHNwUGVyc2lzdFJlbmFtZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYXBwbHlSZW5hbWVBY3Jvc3NXb3Jrc3BhY2UobW9kZWw6IG1vbmFjby5lZGl0b3IuSVRleHRNb2RlbCwgZWRpdDogV29ya3NwYWNlRWRpdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGN1cnJlbnRVcmkgPSBtb2RlbC51cmkudG9TdHJpbmcoKTtcbiAgICBjb25zdCB0ZXh0QnlVcmk6IFJlY29yZDxzdHJpbmcsIFRleHRFZGl0W10+ID0ge307XG4gICAgY29uc3QgcmVuYW1lQnlVcmk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgIGlmIChlZGl0LmNoYW5nZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCB1cmkgaW4gZWRpdC5jaGFuZ2VzKSB0ZXh0QnlVcmlbdXJpXSA9ICh0ZXh0QnlVcmlbdXJpXSA/PyBbXSkuY29uY2F0KGVkaXQuY2hhbmdlc1t1cmldKTtcbiAgICB9XG4gICAgaWYgKGVkaXQuZG9jdW1lbnRDaGFuZ2VzKSB7XG4gICAgICAgIGZvciAoY29uc3QgZGMgb2YgZWRpdC5kb2N1bWVudENoYW5nZXMgYXMgYW55W10pIHtcbiAgICAgICAgICAgIGlmIChkYz8ua2luZCA9PT0gJ3JlbmFtZScgJiYgZGMub2xkVXJpICYmIGRjLm5ld1VyaSkge1xuICAgICAgICAgICAgICAgIHJlbmFtZUJ5VXJpW2RjLm9sZFVyaV0gPSBkYy5uZXdVcmk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRjPy50ZXh0RG9jdW1lbnQ/LnVyaSAmJiBBcnJheS5pc0FycmF5KGRjLmVkaXRzKSkge1xuICAgICAgICAgICAgICAgIHRleHRCeVVyaVtkYy50ZXh0RG9jdW1lbnQudXJpXSA9ICh0ZXh0QnlVcmlbZGMudGV4dERvY3VtZW50LnVyaV0gPz8gW10pLmNvbmNhdChkYy5lZGl0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBKRFQuTFMgbWF5IGtleSBhIGZpbGUncyB0ZXh0IGVkaXRzIGJ5IGl0cyBQT1NULXJlbmFtZSBVUkkgKGRvY3VtZW50Q2hhbmdlcyBhcmUgb3JkZXJlZCwgYW5kIHRoZVxuICAgIC8vIHJlbmFtZSBjYW4gcHJlY2VkZSB0aGUgZWRpdCkuIFJlLWF0dHJpYnV0ZSBldmVyeSBlZGl0IHRvIHRoZSBvbi1kaXNrIChvbGQpIFVSSSBzbyB0aGUgY29udGVudCBpc1xuICAgIC8vIGVkaXRlZCBjb3JyZWN0bHkgYmVmb3JlIHRoZSBmaWxlIGlzIHdyaXR0ZW4vcmVuYW1lZCBcdTIwMTQgb3RoZXJ3aXNlIHRoZSBuZXcgZmlsZSBrZWVwcyB0aGUgb2xkIHR5cGVcbiAgICAvLyBuYW1lIGFuZCB0cmlnZ2VycyBcIlRoZSBwdWJsaWMgdHlwZSBYIG11c3QgYmUgZGVmaW5lZCBpbiBpdHMgb3duIGZpbGVcIi5cbiAgICBjb25zdCBuZXdUb09sZDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgIGZvciAoY29uc3Qgb2xkVXJpIGluIHJlbmFtZUJ5VXJpKSBuZXdUb09sZFtyZW5hbWVCeVVyaVtvbGRVcmldXSA9IG9sZFVyaTtcbiAgICBjb25zdCBlZGl0c0J5T2xkOiBSZWNvcmQ8c3RyaW5nLCBUZXh0RWRpdFtdPiA9IHt9O1xuICAgIGZvciAoY29uc3QgdXJpIGluIHRleHRCeVVyaSkge1xuICAgICAgICBjb25zdCBvbkRpc2tVcmkgPSBuZXdUb09sZFt1cmldID8/IHVyaTtcbiAgICAgICAgZWRpdHNCeU9sZFtvbkRpc2tVcmldID0gKGVkaXRzQnlPbGRbb25EaXNrVXJpXSA/PyBbXSkuY29uY2F0KHRleHRCeVVyaVt1cmldKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXlsb2FkOiB7XG4gICAgICAgIGN1cnJlbnRQYXRoOiBzdHJpbmcgfCBudWxsO1xuICAgICAgICBjdXJyZW50Q29udGVudDogc3RyaW5nIHwgbnVsbDtcbiAgICAgICAgY3VycmVudE5ld1BhdGg6IHN0cmluZyB8IG51bGw7XG4gICAgICAgIHdyaXRlczogQXJyYXk8eyBwYXRoOiBzdHJpbmcgfCBudWxsOyBjb250ZW50OiBzdHJpbmcgfT47XG4gICAgICAgIHJlbmFtZXM6IEFycmF5PHsgb2xkUGF0aDogc3RyaW5nIHwgbnVsbDsgbmV3UGF0aDogc3RyaW5nIHwgbnVsbDsgY29udGVudDogc3RyaW5nIH0+O1xuICAgIH0gPSB7IGN1cnJlbnRQYXRoOiB1cmlUb1dvcmtzcGFjZVBhdGgoY3VycmVudFVyaSksIGN1cnJlbnRDb250ZW50OiBudWxsLCBjdXJyZW50TmV3UGF0aDogbnVsbCwgd3JpdGVzOiBbXSwgcmVuYW1lczogW10gfTtcblxuICAgIGNvbnN0IHdhdGNoZWRDaGFuZ2VzOiBBcnJheTx7IHVyaTogc3RyaW5nOyB0eXBlOiBudW1iZXIgfT4gPSBbXTtcbiAgICBjb25zdCBvbGRVcmlzID0gbmV3IFNldDxzdHJpbmc+KFsuLi5PYmplY3Qua2V5cyhlZGl0c0J5T2xkKSwgLi4uT2JqZWN0LmtleXMocmVuYW1lQnlVcmkpXSk7XG4gICAgZm9yIChjb25zdCBvbGRVcmkgb2Ygb2xkVXJpcykge1xuICAgICAgICBjb25zdCBlZGl0cyA9IGVkaXRzQnlPbGRbb2xkVXJpXSA/PyBbXTtcbiAgICAgICAgbGV0IGNvbnRlbnQ6IHN0cmluZztcbiAgICAgICAgaWYgKG9sZFVyaSA9PT0gY3VycmVudFVyaSkge1xuICAgICAgICAgICAgaWYgKGVkaXRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIG1vZGVsLnB1c2hFZGl0T3BlcmF0aW9ucyhbXSwgZWRpdHMubWFwKGUgPT4gKHsgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28oZS5yYW5nZSksIHRleHQ6IGUubmV3VGV4dCwgZm9yY2VNb3ZlTWFya2VyczogdHJ1ZSB9KSksICgpID0+IG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGVudCA9IG1vZGVsLmdldFZhbHVlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBhd2FpdCBmZXRjaFdvcmtzcGFjZUZpbGVUZXh0KHVyaVRvV29ya3NwYWNlUGF0aChvbGRVcmkpID8/IG9sZFVyaSk7XG4gICAgICAgICAgICBjb250ZW50ID0gZWRpdHMubGVuZ3RoID8gYXBwbHlFZGl0c1RvVGV4dChzb3VyY2UsIGVkaXRzKSA6IHNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdVcmkgPSByZW5hbWVCeVVyaVtvbGRVcmldO1xuICAgICAgICBpZiAob2xkVXJpID09PSBjdXJyZW50VXJpKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmN1cnJlbnRDb250ZW50ID0gY29udGVudDtcbiAgICAgICAgICAgIHBheWxvYWQuY3VycmVudE5ld1BhdGggPSBuZXdVcmkgPyB1cmlUb1dvcmtzcGFjZVBhdGgobmV3VXJpKSA6IG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAobmV3VXJpKSB7XG4gICAgICAgICAgICBwYXlsb2FkLnJlbmFtZXMucHVzaCh7IG9sZFBhdGg6IHVyaVRvV29ya3NwYWNlUGF0aChvbGRVcmkpLCBuZXdQYXRoOiB1cmlUb1dvcmtzcGFjZVBhdGgobmV3VXJpKSwgY29udGVudCB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBheWxvYWQud3JpdGVzLnB1c2goeyBwYXRoOiB1cmlUb1dvcmtzcGFjZVBhdGgob2xkVXJpKSwgY29udGVudCB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGaWxlLWNoYW5nZSBldmVudHMgZm9yIEpEVC5MUyBzbyBpdCByZS1zeW5jcyB3aXRob3V0IGEgcGFnZSByZWZyZXNoLlxuICAgICAgICBpZiAobmV3VXJpKSB7XG4gICAgICAgICAgICB3YXRjaGVkQ2hhbmdlcy5wdXNoKHsgdXJpOiBvbGRVcmksIHR5cGU6IDMgLyogRGVsZXRlZCAqLyB9LCB7IHVyaTogbmV3VXJpLCB0eXBlOiAxIC8qIENyZWF0ZWQgKi8gfSk7XG4gICAgICAgICAgICBfb3BlbkZpbGVzLmRlbGV0ZShvbGRVcmkpO1xuICAgICAgICAgICAgX2Nvbm4/LnNlbmROb3RpZmljYXRpb24oJ3RleHREb2N1bWVudC9kaWRDbG9zZScsIHsgdGV4dERvY3VtZW50OiB7IHVyaTogb2xkVXJpIH0gfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3YXRjaGVkQ2hhbmdlcy5wdXNoKHsgdXJpOiBvbGRVcmksIHR5cGU6IDIgLyogQ2hhbmdlZCAqLyB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IChnbG9iYWxUaGlzIGFzIGFueSkuamF2YUxzcFBlcnNpc3RSZW5hbWUocGF5bG9hZCk7XG5cbiAgICAvLyBJbmZvcm0gSkRULkxTIG9mIHRoZSBvbi1kaXNrIGNoYW5nZXMgc28gdGhlIHJlbmFtZWQgdHlwZSdzIGRpYWdub3N0aWNzIGNsZWFyIGltbWVkaWF0ZWx5LlxuICAgIGlmIChfY29ubiAmJiB3YXRjaGVkQ2hhbmdlcy5sZW5ndGgpIHtcbiAgICAgICAgX2Nvbm4uc2VuZE5vdGlmaWNhdGlvbignd29ya3NwYWNlL2RpZENoYW5nZVdhdGNoZWRGaWxlcycsIHsgY2hhbmdlczogd2F0Y2hlZENoYW5nZXMgfSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBqZHRsc1NldHRpbmdzKCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGphdmE6IHtcbiAgICAgICAgICAgIGltcG9ydDoge1xuICAgICAgICAgICAgICAgIG1hdmVuOiAgICAgIHsgZW5hYmxlZDogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIGdyYWRsZTogICAgIHsgZW5hYmxlZDogZmFsc2UgfSxcbiAgICAgICAgICAgICAgICBleGNsdXNpb25zOiBbJyoqL25vZGVfbW9kdWxlcy8qKicsICcqKi8ubWV0YWRhdGEvKionLCAnKiovYXJjaGV0eXBlLXJlc291cmNlcy8qKiddLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGF1dG9idWlsZDogeyBlbmFibGVkOiB0cnVlIH0sXG4gICAgICAgICAgICBjb21wbGV0aW9uOiB7XG4gICAgICAgICAgICAgICAgb3ZlcndyaXRlOiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgZ3Vlc3NNZXRob2RBcmd1bWVudHM6IGZhbHNlLFxuICAgICAgICAgICAgICAgIC8vIENhcCByZXN1bHRzIHNvIGltcG9ydC90eXBlIGNvbXBsZXRpb24gb3ZlciB0aGUgbGFyZ2UgcGxhdGZvcm0gY2xhc3NwYXRoIHN0YXlzIHNuYXBweS5cbiAgICAgICAgICAgICAgICBtYXhSZXN1bHRzOiAgICAgICAgICAgNTAsXG4gICAgICAgICAgICAgICAgZmlsdGVyZWRUeXBlczogW1xuICAgICAgICAgICAgICAgICAgICAnY29tLnN1bi4qJywgJ3N1bi4qJywgJ2pkay4qJyxcbiAgICAgICAgICAgICAgICAgICAgJ29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC4qJyxcbiAgICAgICAgICAgICAgICAgICAgJ29yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuKicsXG4gICAgICAgICAgICAgICAgICAgICdvcmcuZWNsaXBzZS5vc2dpLmludGVybmFsLionLFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgaW1wb3J0T3JkZXI6IFsnamF2YScsICdqYXZheCcsICdvcmcnLCAnY29tJywgJyddLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNpZ25hdHVyZUhlbHA6ICB7IGVuYWJsZWQ6IHRydWUgfSxcbiAgICAgICAgICAgIGZvcm1hdDogICAgICAgICB7IGVuYWJsZWQ6IHRydWUgfSxcbiAgICAgICAgICAgIHNhdmVBY3Rpb25zOiAgICB7IG9yZ2FuaXplSW1wb3J0czogZmFsc2UgfSxcbiAgICAgICAgICAgIGlubGF5SGludHM6ICAgICB7IHBhcmFtZXRlck5hbWVzOiB7IGVuYWJsZWQ6ICdhbGwnIH0gfSxcbiAgICAgICAgICAgIHJlZmVyZW5jZXNDb2RlTGVuczogICAgIHsgZW5hYmxlZDogdHJ1ZSB9LFxuICAgICAgICAgICAgaW1wbGVtZW50YXRpb25zQ29kZUxlbnM6IHsgZW5hYmxlZDogdHJ1ZSB9LFxuICAgICAgICB9LFxuICAgIH07XG59XG4iLCAiLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgMjAyNCBUeXBlRm94IGFuZCBvdGhlcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMSUNFTlNFIGluIHRoZSBwYWNrYWdlIHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuaW1wb3J0IHsgRGlzcG9zYWJsZSB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcblxuZXhwb3J0IGNsYXNzIERpc3Bvc2FibGVDb2xsZWN0aW9uIGltcGxlbWVudHMgRGlzcG9zYWJsZSB7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGRpc3Bvc2FibGVzOiBEaXNwb3NhYmxlW10gPSBbXTtcblxuICAgIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgICAgIHdoaWxlICh0aGlzLmRpc3Bvc2FibGVzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgdGhpcy5kaXNwb3NhYmxlcy5wb3AoKSEuZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVzaChkaXNwb3NhYmxlOiBEaXNwb3NhYmxlKTogRGlzcG9zYWJsZSB7XG4gICAgICAgIGNvbnN0IGRpc3Bvc2FibGVzID0gdGhpcy5kaXNwb3NhYmxlcztcbiAgICAgICAgZGlzcG9zYWJsZXMucHVzaChkaXNwb3NhYmxlKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBkaXNwb3NhYmxlcy5pbmRleE9mKGRpc3Bvc2FibGUpO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgZGlzcG9zYWJsZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxufVxuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjQgVHlwZUZveCBhbmQgb3RoZXJzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTElDRU5TRSBpbiB0aGUgcGFja2FnZSByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbmltcG9ydCB7IERpc3Bvc2FibGUgfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG5pbXBvcnQgdHlwZSB7IElDb25uZWN0aW9uIH0gZnJvbSAnLi4vc2VydmVyL2Nvbm5lY3Rpb24uanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElXZWJTb2NrZXQgZXh0ZW5kcyBEaXNwb3NhYmxlIHtcbiAgICBzZW5kKGNvbnRlbnQ6IHN0cmluZyk6IHZvaWQ7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBvbk1lc3NhZ2UoY2I6IChkYXRhOiBhbnkpID0+IHZvaWQpOiB2b2lkO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgb25FcnJvcihjYjogKHJlYXNvbjogYW55KSA9PiB2b2lkKTogdm9pZDtcbiAgICBvbkNsb3NlKGNiOiAoY29kZTogbnVtYmVyLCByZWFzb246IHN0cmluZykgPT4gdm9pZCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVdlYlNvY2tldENvbm5lY3Rpb24gZXh0ZW5kcyBJQ29ubmVjdGlvbiB7XG4gICAgcmVhZG9ubHkgc29ja2V0OiBJV2ViU29ja2V0O1xufVxuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjQgVHlwZUZveCBhbmQgb3RoZXJzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTElDRU5TRSBpbiB0aGUgcGFja2FnZSByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbmltcG9ydCB7IERpc3Bvc2FibGUgfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG4vLyBUT0RPOiBVc2UgZW52aXJvbm1lbnQtc3BlY2lmaWMgaW1wb3J0cyAodnNjb2RlLWpzb25ycGMvYnJvd3NlciBvciB2c2NvZGUtanNvbnJwYy9ub2RlKVxuLy8gd2hlbiB1cGdyYWRpbmcgdG8gdnNjb2RlLWpzb25ycGNAOS54LngtbmV4dC5YIHdoaWNoIHN1cHBvcnRzIHByb3BlciBleHBvcnQgbWFwc1xuaW1wb3J0IHsgdHlwZSBEYXRhQ2FsbGJhY2ssIEFic3RyYWN0TWVzc2FnZVJlYWRlciwgTWVzc2FnZVJlYWRlciB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcbmltcG9ydCB0eXBlIHsgSVdlYlNvY2tldCB9IGZyb20gJy4vc29ja2V0LmpzJztcblxuZXhwb3J0IGNsYXNzIFdlYlNvY2tldE1lc3NhZ2VSZWFkZXIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VSZWFkZXIgaW1wbGVtZW50cyBNZXNzYWdlUmVhZGVyIHtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgc29ja2V0OiBJV2ViU29ja2V0O1xuICAgIHByb3RlY3RlZCBzdGF0ZTogJ2luaXRpYWwnIHwgJ2xpc3RlbmluZycgfCAnY2xvc2VkJyA9ICdpbml0aWFsJztcbiAgICBwcm90ZWN0ZWQgY2FsbGJhY2s6IERhdGFDYWxsYmFjayB8IHVuZGVmaW5lZDtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHByb3RlY3RlZCByZWFkb25seSBldmVudHM6IEFycmF5PHsgbWVzc2FnZT86IGFueSwgZXJyb3I/OiBhbnkgfT4gPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKHNvY2tldDogSVdlYlNvY2tldCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnNvY2tldCA9IHNvY2tldDtcbiAgICAgICAgdGhpcy5zb2NrZXQub25NZXNzYWdlKG1lc3NhZ2UgPT5cbiAgICAgICAgICAgIHRoaXMucmVhZE1lc3NhZ2UobWVzc2FnZSlcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zb2NrZXQub25FcnJvcihlcnJvciA9PlxuICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc29ja2V0Lm9uQ2xvc2UoKGNvZGUsIHJlYXNvbikgPT4ge1xuICAgICAgICAgICAgaWYgKGNvZGUgIT09IDEwMDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvcjogRXJyb3IgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICcnICsgY29kZSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYEVycm9yIGR1cmluZyBzb2NrZXQgcmVjb25uZWN0OiBjb2RlID0gJHtjb2RlfSwgcmVhc29uID0gJHtyZWFzb259YFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5maXJlQ2xvc2UoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbGlzdGVuKGNhbGxiYWNrOiBEYXRhQ2FsbGJhY2spOiBEaXNwb3NhYmxlIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09ICdpbml0aWFsJykge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9ICdsaXN0ZW5pbmcnO1xuICAgICAgICAgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgICAgICAgd2hpbGUgKHRoaXMuZXZlbnRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gdGhpcy5ldmVudHMucG9wKCkhO1xuICAgICAgICAgICAgICAgIGlmIChldmVudC5tZXNzYWdlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWFkTWVzc2FnZShldmVudC5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXZlbnQuZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZUNsb3NlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkaXNwb3NlOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2FsbGJhY2sgPT09IGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSAnaW5pdGlhbCc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsbGJhY2sgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIG92ZXJyaWRlIGRpc3Bvc2UoKSB7XG4gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9ICdpbml0aWFsJztcbiAgICAgICAgdGhpcy5jYWxsYmFjayA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5ldmVudHMuc3BsaWNlKDAsIHRoaXMuZXZlbnRzLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBwcm90ZWN0ZWQgcmVhZE1lc3NhZ2UobWVzc2FnZTogYW55KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09PSAnaW5pdGlhbCcpIHtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRzLnNwbGljZSgwLCAwLCB7IG1lc3NhZ2UgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZSA9PT0gJ2xpc3RlbmluZycpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjayEoZGF0YSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvcjogRXJyb3IgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICcnICsgNDAwLFxuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgRXJyb3IgZHVyaW5nIG1lc3NhZ2UgcGFyc2luZywgcmVhc29uID0gJHt0eXBlb2YgZXJyID09PSAnb2JqZWN0JyA/IChlcnIgYXMgYW55KS5tZXNzYWdlIDogJ3Vua25vd24nfWBcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIGZpcmVFcnJvcihlcnJvcjogYW55KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09PSAnaW5pdGlhbCcpIHtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRzLnNwbGljZSgwLCAwLCB7IGVycm9yIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUgPT09ICdsaXN0ZW5pbmcnKSB7XG4gICAgICAgICAgICBzdXBlci5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIGZpcmVDbG9zZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09ICdpbml0aWFsJykge1xuICAgICAgICAgICAgdGhpcy5ldmVudHMuc3BsaWNlKDAsIDAsIHt9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlID09PSAnbGlzdGVuaW5nJykge1xuICAgICAgICAgICAgc3VwZXIuZmlyZUNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGF0ZSA9ICdjbG9zZWQnO1xuICAgIH1cbn1cbiIsICIvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSAyMDI0IFR5cGVGb3ggYW5kIG90aGVycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExJQ0VOU0UgaW4gdGhlIHBhY2thZ2Ugcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5pbXBvcnQgeyBNZXNzYWdlIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuaW1wb3J0IHsgQWJzdHJhY3RNZXNzYWdlV3JpdGVyLCBNZXNzYWdlV3JpdGVyIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuaW1wb3J0IHR5cGUgeyBJV2ViU29ja2V0IH0gZnJvbSAnLi9zb2NrZXQuanMnO1xuXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0TWVzc2FnZVdyaXRlciBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVdyaXRlciBpbXBsZW1lbnRzIE1lc3NhZ2VXcml0ZXIge1xuICAgIHByb3RlY3RlZCBlcnJvckNvdW50ID0gMDtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgc29ja2V0OiBJV2ViU29ja2V0O1xuXG4gICAgY29uc3RydWN0b3Ioc29ja2V0OiBJV2ViU29ja2V0KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuc29ja2V0ID0gc29ja2V0O1xuICAgIH1cblxuICAgIGVuZCgpOiB2b2lkIHtcbiAgICB9XG5cbiAgICBhc3luYyB3cml0ZShtc2c6IE1lc3NhZ2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShtc2cpO1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChjb250ZW50KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5lcnJvckNvdW50Kys7XG4gICAgICAgICAgICB0aGlzLmZpcmVFcnJvcihlLCBtc2csIHRoaXMuZXJyb3JDb3VudCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgMjAyNCBUeXBlRm94IGFuZCBvdGhlcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMSUNFTlNFIGluIHRoZSBwYWNrYWdlIHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuaW1wb3J0IHR5cGUgeyBNZXNzYWdlQ29ubmVjdGlvbiwgTG9nZ2VyIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuaW1wb3J0IHsgY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24gfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG5pbXBvcnQgdHlwZSB7IElXZWJTb2NrZXQgfSBmcm9tICcuL3NvY2tldC5qcyc7XG5pbXBvcnQgeyBXZWJTb2NrZXRNZXNzYWdlUmVhZGVyIH0gZnJvbSAnLi9yZWFkZXIuanMnO1xuaW1wb3J0IHsgV2ViU29ja2V0TWVzc2FnZVdyaXRlciB9IGZyb20gJy4vd3JpdGVyLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdlYlNvY2tldENvbm5lY3Rpb24oc29ja2V0OiBJV2ViU29ja2V0LCBsb2dnZXI6IExvZ2dlcik6IE1lc3NhZ2VDb25uZWN0aW9uIHtcbiAgICBjb25zdCBtZXNzYWdlUmVhZGVyID0gbmV3IFdlYlNvY2tldE1lc3NhZ2VSZWFkZXIoc29ja2V0KTtcbiAgICBjb25zdCBtZXNzYWdlV3JpdGVyID0gbmV3IFdlYlNvY2tldE1lc3NhZ2VXcml0ZXIoc29ja2V0KTtcbiAgICBjb25zdCBjb25uZWN0aW9uID0gY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24obWVzc2FnZVJlYWRlciwgbWVzc2FnZVdyaXRlciwgbG9nZ2VyKTtcbiAgICBjb25uZWN0aW9uLm9uQ2xvc2UoKCkgPT4gY29ubmVjdGlvbi5kaXNwb3NlKCkpO1xuICAgIHJldHVybiBjb25uZWN0aW9uO1xufVxuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjQgVHlwZUZveCBhbmQgb3RoZXJzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTElDRU5TRSBpbiB0aGUgcGFja2FnZSByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbmltcG9ydCB0eXBlIHsgTWVzc2FnZUNvbm5lY3Rpb24sIExvZ2dlciB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcbmltcG9ydCB7IGNyZWF0ZVdlYlNvY2tldENvbm5lY3Rpb24gfSBmcm9tICcuL3NvY2tldC9jb25uZWN0aW9uLmpzJztcbmltcG9ydCB0eXBlIHsgSVdlYlNvY2tldCB9IGZyb20gJy4vc29ja2V0L3NvY2tldC5qcyc7XG5pbXBvcnQgeyBDb25zb2xlTG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gbGlzdGVuKG9wdGlvbnM6IHtcbiAgICB3ZWJTb2NrZXQ6IFdlYlNvY2tldDtcbiAgICBsb2dnZXI/OiBMb2dnZXI7XG4gICAgb25Db25uZWN0aW9uOiAoY29ubmVjdGlvbjogTWVzc2FnZUNvbm5lY3Rpb24pID0+IHZvaWQ7XG59KSB7XG4gICAgY29uc3QgeyB3ZWJTb2NrZXQsIG9uQ29ubmVjdGlvbiB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBsb2dnZXIgPSBvcHRpb25zLmxvZ2dlciB8fCBuZXcgQ29uc29sZUxvZ2dlcigpO1xuICAgIHdlYlNvY2tldC5vbm9wZW4gPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNvY2tldCA9IHRvU29ja2V0KHdlYlNvY2tldCk7XG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBjcmVhdGVXZWJTb2NrZXRDb25uZWN0aW9uKHNvY2tldCwgbG9nZ2VyKTtcbiAgICAgICAgb25Db25uZWN0aW9uKGNvbm5lY3Rpb24pO1xuICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1NvY2tldCh3ZWJTb2NrZXQ6IFdlYlNvY2tldCk6IElXZWJTb2NrZXQge1xuICAgIHJldHVybiB7XG4gICAgICAgIHNlbmQ6IGNvbnRlbnQgPT4gd2ViU29ja2V0LnNlbmQoY29udGVudCksXG4gICAgICAgIG9uTWVzc2FnZTogY2IgPT4ge1xuICAgICAgICAgICAgd2ViU29ja2V0Lm9ubWVzc2FnZSA9IGV2ZW50ID0+IGNiKGV2ZW50LmRhdGEpO1xuICAgICAgICB9LFxuICAgICAgICBvbkVycm9yOiBjYiA9PiB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgd2ViU29ja2V0Lm9uZXJyb3IgPSAoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3QuaGFzT3duKGV2ZW50LCAnbWVzc2FnZScpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNiKGV2ZW50Lm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIG9uQ2xvc2U6IGNiID0+IHtcbiAgICAgICAgICAgIHdlYlNvY2tldC5vbmNsb3NlID0gZXZlbnQgPT4gY2IoZXZlbnQuY29kZSwgZXZlbnQucmVhc29uKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGlzcG9zZTogKCkgPT4gd2ViU29ja2V0LmNsb3NlKClcbiAgICB9O1xufVxuIiwgIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAyNiBFY2xpcHNlIERpcmlnaWJsZSBjb250cmlidXRvcnNcbiAqXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGVcbiAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYyLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcbiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYyMC5odG1sXG4gKlxuICogU1BEWC1GaWxlQ29weXJpZ2h0VGV4dDogRWNsaXBzZSBEaXJpZ2libGUgY29udHJpYnV0b3JzIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wXG4gKi9cblxuLyoqXG4gKiBMYXp5IFByb3h5IHNoaW0gZm9yIE1vbmFjbyBFZGl0b3IgbG9hZGVkIHZpYSBBTUQuXG4gKlxuICogZWRpdG9yLmpzIHNldHMgZ2xvYmFsVGhpcy5tb25hY28gaW5zaWRlIHRoZSBBTUQgcmVxdWlyZSgpIGNhbGxiYWNrLCBiZWZvcmUgYW55XG4gKiBKYXZhTHNwQ2xpZW50TGliLmNvbm5lY3QoKSBjYWxsLiBBbGwgcHJvcGVydHkgYWNjZXNzZXMgZ28gdGhyb3VnaCBQcm94eS5nZXQoKSB0cmFwc1xuICogc28gdGhleSByZXNvbHZlIGFnYWluc3QgdGhlIGxpdmUgd2luZG93Lm1vbmFjbyBhdCBjYWxsIHRpbWUsIG5vdCBhdCBidW5kbGUgbG9hZCB0aW1lLlxuICpcbiAqIFR5cGVTY3JpcHQgcmVzb2x2ZXMgdHlwZXMgZnJvbSB0aGUgcmVhbCBtb25hY28tZWRpdG9yIGRldkRlcGVuZGVuY3k7IGVzYnVpbGQgcmVwbGFjZXNcbiAqIHRoZSBcIm1vbmFjby1lZGl0b3JcIiBpbXBvcnQgd2l0aCB0aGlzIGZpbGUgYXQgYnVuZGxlIHRpbWUgdmlhIHRoZSBhbGlhcyBvcHRpb24uXG4gKi9cblxudHlwZSBNID0gdHlwZW9mIGltcG9ydCgnbW9uYWNvLWVkaXRvcicpO1xuXG5mdW5jdGlvbiBtKCk6IE0ge1xuICAgIHJldHVybiAoZ2xvYmFsVGhpcyBhcyBhbnkpLm1vbmFjbyBhcyBNO1xufVxuXG5mdW5jdGlvbiBuczxUIGV4dGVuZHMgb2JqZWN0PihnZXR0ZXI6ICgpID0+IFQpOiBUIHtcbiAgICByZXR1cm4gbmV3IFByb3h5KHt9IGFzIFQsIHtcbiAgICAgICAgZ2V0OiAoXywgaykgPT4gKGdldHRlcigpIGFzIGFueSlbayBhcyBzdHJpbmddLFxuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBjbHM8VD4oZ2V0dGVyOiAoKSA9PiBUKTogVCB7XG4gICAgcmV0dXJuIG5ldyBQcm94eShmdW5jdGlvbiAoKSB7fSBhcyBhbnksIHtcbiAgICAgICAgY29uc3RydWN0OiAoXywgYXJncykgPT4gbmV3IChnZXR0ZXIoKSBhcyBhbnkpKC4uLmFyZ3MpLFxuICAgICAgICBnZXQ6ICAgICAgIChfLCBrKSAgICA9PiAoZ2V0dGVyKCkgYXMgYW55KVtrIGFzIHN0cmluZ10sXG4gICAgfSkgYXMgVDtcbn1cblxuZXhwb3J0IGNvbnN0IGVkaXRvciAgICAgICAgID0gbnMoKCkgPT4gbSgpLmVkaXRvcik7XG5leHBvcnQgY29uc3QgbGFuZ3VhZ2VzICAgICAgPSBucygoKSA9PiBtKCkubGFuZ3VhZ2VzKTtcbmV4cG9ydCBjb25zdCBNYXJrZXJTZXZlcml0eSA9IG5zKCgpID0+IG0oKS5NYXJrZXJTZXZlcml0eSk7XG5leHBvcnQgY29uc3QgTWFya2VyVGFnICAgICAgPSBucygoKSA9PiAobSgpIGFzIGFueSkuTWFya2VyVGFnKTtcbmV4cG9ydCBjb25zdCBVcmkgICAgICAgICAgICA9IGNscygoKSA9PiBtKCkuVXJpKTtcbmV4cG9ydCBjb25zdCBSYW5nZSAgICAgICAgICA9IGNscygoKSA9PiBtKCkuUmFuZ2UpO1xuZXhwb3J0IGNvbnN0IFBvc2l0aW9uICAgICAgID0gY2xzKCgpID0+IG0oKS5Qb3NpdGlvbik7XG5leHBvcnQgY29uc3QgU2VsZWN0aW9uICAgICAgPSBjbHMoKCkgPT4gbSgpLlNlbGVjdGlvbik7XG5leHBvcnQgY29uc3QgS2V5Q29kZSAgICAgICAgPSBucygoKSA9PiBtKCkuS2V5Q29kZSk7XG5leHBvcnQgY29uc3QgS2V5TW9kICAgICAgICAgPSBucygoKSA9PiBtKCkuS2V5TW9kKTtcbiIsICIvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4ndXNlIHN0cmljdCc7XG5leHBvcnQgdmFyIERvY3VtZW50VXJpO1xuKGZ1bmN0aW9uIChEb2N1bWVudFVyaSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnO1xuICAgIH1cbiAgICBEb2N1bWVudFVyaS5pcyA9IGlzO1xufSkoRG9jdW1lbnRVcmkgfHwgKERvY3VtZW50VXJpID0ge30pKTtcbmV4cG9ydCB2YXIgVVJJO1xuKGZ1bmN0aW9uIChVUkkpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJztcbiAgICB9XG4gICAgVVJJLmlzID0gaXM7XG59KShVUkkgfHwgKFVSSSA9IHt9KSk7XG5leHBvcnQgdmFyIGludGVnZXI7XG4oZnVuY3Rpb24gKGludGVnZXIpIHtcbiAgICBpbnRlZ2VyLk1JTl9WQUxVRSA9IC0yMTQ3NDgzNjQ4O1xuICAgIGludGVnZXIuTUFYX1ZBTFVFID0gMjE0NzQ4MzY0NztcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBpbnRlZ2VyLk1JTl9WQUxVRSA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSBpbnRlZ2VyLk1BWF9WQUxVRTtcbiAgICB9XG4gICAgaW50ZWdlci5pcyA9IGlzO1xufSkoaW50ZWdlciB8fCAoaW50ZWdlciA9IHt9KSk7XG5leHBvcnQgdmFyIHVpbnRlZ2VyO1xuKGZ1bmN0aW9uICh1aW50ZWdlcikge1xuICAgIHVpbnRlZ2VyLk1JTl9WQUxVRSA9IDA7XG4gICAgdWludGVnZXIuTUFYX1ZBTFVFID0gMjE0NzQ4MzY0NztcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiB1aW50ZWdlci5NSU5fVkFMVUUgPD0gdmFsdWUgJiYgdmFsdWUgPD0gdWludGVnZXIuTUFYX1ZBTFVFO1xuICAgIH1cbiAgICB1aW50ZWdlci5pcyA9IGlzO1xufSkodWludGVnZXIgfHwgKHVpbnRlZ2VyID0ge30pKTtcbi8qKlxuICogVGhlIFBvc2l0aW9uIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIFBvc2l0aW9ufSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBQb3NpdGlvbjtcbihmdW5jdGlvbiAoUG9zaXRpb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFBvc2l0aW9uIGxpdGVyYWwgZnJvbSB0aGUgZ2l2ZW4gbGluZSBhbmQgY2hhcmFjdGVyLlxuICAgICAqIEBwYXJhbSBsaW5lIFRoZSBwb3NpdGlvbidzIGxpbmUuXG4gICAgICogQHBhcmFtIGNoYXJhY3RlciBUaGUgcG9zaXRpb24ncyBjaGFyYWN0ZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGxpbmUsIGNoYXJhY3Rlcikge1xuICAgICAgICBpZiAobGluZSA9PT0gTnVtYmVyLk1BWF9WQUxVRSkge1xuICAgICAgICAgICAgbGluZSA9IHVpbnRlZ2VyLk1BWF9WQUxVRTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhcmFjdGVyID09PSBOdW1iZXIuTUFYX1ZBTFVFKSB7XG4gICAgICAgICAgICBjaGFyYWN0ZXIgPSB1aW50ZWdlci5NQVhfVkFMVUU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgbGluZSwgY2hhcmFjdGVyIH07XG4gICAgfVxuICAgIFBvc2l0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIFBvc2l0aW9ufSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS5saW5lKSAmJiBJcy51aW50ZWdlcihjYW5kaWRhdGUuY2hhcmFjdGVyKTtcbiAgICB9XG4gICAgUG9zaXRpb24uaXMgPSBpcztcbn0pKFBvc2l0aW9uIHx8IChQb3NpdGlvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBSYW5nZSBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBSYW5nZX0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgUmFuZ2U7XG4oZnVuY3Rpb24gKFJhbmdlKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKG9uZSwgdHdvLCB0aHJlZSwgZm91cikge1xuICAgICAgICBpZiAoSXMudWludGVnZXIob25lKSAmJiBJcy51aW50ZWdlcih0d28pICYmIElzLnVpbnRlZ2VyKHRocmVlKSAmJiBJcy51aW50ZWdlcihmb3VyKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IFBvc2l0aW9uLmNyZWF0ZShvbmUsIHR3byksIGVuZDogUG9zaXRpb24uY3JlYXRlKHRocmVlLCBmb3VyKSB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKFBvc2l0aW9uLmlzKG9uZSkgJiYgUG9zaXRpb24uaXModHdvKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IG9uZSwgZW5kOiB0d28gfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmFuZ2UjY3JlYXRlIGNhbGxlZCB3aXRoIGludmFsaWQgYXJndW1lbnRzWyR7b25lfSwgJHt0d299LCAke3RocmVlfSwgJHtmb3VyfV1gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBSYW5nZS5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBSYW5nZX0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBQb3NpdGlvbi5pcyhjYW5kaWRhdGUuc3RhcnQpICYmIFBvc2l0aW9uLmlzKGNhbmRpZGF0ZS5lbmQpO1xuICAgIH1cbiAgICBSYW5nZS5pcyA9IGlzO1xufSkoUmFuZ2UgfHwgKFJhbmdlID0ge30pKTtcbi8qKlxuICogVGhlIExvY2F0aW9uIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIExvY2F0aW9ufSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBMb2NhdGlvbjtcbihmdW5jdGlvbiAoTG9jYXRpb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgTG9jYXRpb24gbGl0ZXJhbC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSBsb2NhdGlvbidzIHVyaS5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIGxvY2F0aW9uJ3MgcmFuZ2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHVyaSwgcmFuZ2UpIHtcbiAgICAgICAgcmV0dXJuIHsgdXJpLCByYW5nZSB9O1xuICAgIH1cbiAgICBMb2NhdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBMb2NhdGlvbn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIChJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSkgfHwgSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS51cmkpKTtcbiAgICB9XG4gICAgTG9jYXRpb24uaXMgPSBpcztcbn0pKExvY2F0aW9uIHx8IChMb2NhdGlvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBMb2NhdGlvbkxpbmsgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgTG9jYXRpb25MaW5rfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBMb2NhdGlvbkxpbms7XG4oZnVuY3Rpb24gKExvY2F0aW9uTGluaykge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBMb2NhdGlvbkxpbmsgbGl0ZXJhbC5cbiAgICAgKiBAcGFyYW0gdGFyZ2V0VXJpIFRoZSBkZWZpbml0aW9uJ3MgdXJpLlxuICAgICAqIEBwYXJhbSB0YXJnZXRSYW5nZSBUaGUgZnVsbCByYW5nZSBvZiB0aGUgZGVmaW5pdGlvbi5cbiAgICAgKiBAcGFyYW0gdGFyZ2V0U2VsZWN0aW9uUmFuZ2UgVGhlIHNwYW4gb2YgdGhlIHN5bWJvbCBkZWZpbml0aW9uIGF0IHRoZSB0YXJnZXQuXG4gICAgICogQHBhcmFtIG9yaWdpblNlbGVjdGlvblJhbmdlIFRoZSBzcGFuIG9mIHRoZSBzeW1ib2wgYmVpbmcgZGVmaW5lZCBpbiB0aGUgb3JpZ2luYXRpbmcgc291cmNlIGZpbGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHRhcmdldFVyaSwgdGFyZ2V0UmFuZ2UsIHRhcmdldFNlbGVjdGlvblJhbmdlLCBvcmlnaW5TZWxlY3Rpb25SYW5nZSkge1xuICAgICAgICByZXR1cm4geyB0YXJnZXRVcmksIHRhcmdldFJhbmdlLCB0YXJnZXRTZWxlY3Rpb25SYW5nZSwgb3JpZ2luU2VsZWN0aW9uUmFuZ2UgfTtcbiAgICB9XG4gICAgTG9jYXRpb25MaW5rLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIExvY2F0aW9uTGlua30gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUudGFyZ2V0UmFuZ2UpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudGFyZ2V0VXJpKVxuICAgICAgICAgICAgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnRhcmdldFNlbGVjdGlvblJhbmdlKVxuICAgICAgICAgICAgJiYgKFJhbmdlLmlzKGNhbmRpZGF0ZS5vcmlnaW5TZWxlY3Rpb25SYW5nZSkgfHwgSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5vcmlnaW5TZWxlY3Rpb25SYW5nZSkpO1xuICAgIH1cbiAgICBMb2NhdGlvbkxpbmsuaXMgPSBpcztcbn0pKExvY2F0aW9uTGluayB8fCAoTG9jYXRpb25MaW5rID0ge30pKTtcbi8qKlxuICogVGhlIENvbG9yIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIENvbG9yfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBDb2xvcjtcbihmdW5jdGlvbiAoQ29sb3IpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENvbG9yIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZWQsXG4gICAgICAgICAgICBncmVlbixcbiAgICAgICAgICAgIGJsdWUsXG4gICAgICAgICAgICBhbHBoYSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgQ29sb3IuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgQ29sb3J9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBJcy5udW1iZXJSYW5nZShjYW5kaWRhdGUucmVkLCAwLCAxKVxuICAgICAgICAgICAgJiYgSXMubnVtYmVyUmFuZ2UoY2FuZGlkYXRlLmdyZWVuLCAwLCAxKVxuICAgICAgICAgICAgJiYgSXMubnVtYmVyUmFuZ2UoY2FuZGlkYXRlLmJsdWUsIDAsIDEpXG4gICAgICAgICAgICAmJiBJcy5udW1iZXJSYW5nZShjYW5kaWRhdGUuYWxwaGEsIDAsIDEpO1xuICAgIH1cbiAgICBDb2xvci5pcyA9IGlzO1xufSkoQ29sb3IgfHwgKENvbG9yID0ge30pKTtcbi8qKlxuICogVGhlIENvbG9ySW5mb3JtYXRpb24gbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgQ29sb3JJbmZvcm1hdGlvbn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgQ29sb3JJbmZvcm1hdGlvbjtcbihmdW5jdGlvbiAoQ29sb3JJbmZvcm1hdGlvbikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ29sb3JJbmZvcm1hdGlvbiBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgY29sb3IpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJhbmdlLFxuICAgICAgICAgICAgY29sb3IsXG4gICAgICAgIH07XG4gICAgfVxuICAgIENvbG9ySW5mb3JtYXRpb24uY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgQ29sb3JJbmZvcm1hdGlvbn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgQ29sb3IuaXMoY2FuZGlkYXRlLmNvbG9yKTtcbiAgICB9XG4gICAgQ29sb3JJbmZvcm1hdGlvbi5pcyA9IGlzO1xufSkoQ29sb3JJbmZvcm1hdGlvbiB8fCAoQ29sb3JJbmZvcm1hdGlvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb2xvciBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBDb2xvclByZXNlbnRhdGlvbn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgQ29sb3JQcmVzZW50YXRpb247XG4oZnVuY3Rpb24gKENvbG9yUHJlc2VudGF0aW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDb2xvckluZm9ybWF0aW9uIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGxhYmVsLCB0ZXh0RWRpdCwgYWRkaXRpb25hbFRleHRFZGl0cykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICB0ZXh0RWRpdCxcbiAgICAgICAgICAgIGFkZGl0aW9uYWxUZXh0RWRpdHMsXG4gICAgICAgIH07XG4gICAgfVxuICAgIENvbG9yUHJlc2VudGF0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIENvbG9ySW5mb3JtYXRpb259IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLmxhYmVsKVxuICAgICAgICAgICAgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUudGV4dEVkaXQpIHx8IFRleHRFZGl0LmlzKGNhbmRpZGF0ZSkpXG4gICAgICAgICAgICAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5hZGRpdGlvbmFsVGV4dEVkaXRzKSB8fCBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS5hZGRpdGlvbmFsVGV4dEVkaXRzLCBUZXh0RWRpdC5pcykpO1xuICAgIH1cbiAgICBDb2xvclByZXNlbnRhdGlvbi5pcyA9IGlzO1xufSkoQ29sb3JQcmVzZW50YXRpb24gfHwgKENvbG9yUHJlc2VudGF0aW9uID0ge30pKTtcbi8qKlxuICogQSBzZXQgb2YgcHJlZGVmaW5lZCByYW5nZSBraW5kcy5cbiAqL1xuZXhwb3J0IHZhciBGb2xkaW5nUmFuZ2VLaW5kO1xuKGZ1bmN0aW9uIChGb2xkaW5nUmFuZ2VLaW5kKSB7XG4gICAgLyoqXG4gICAgICogRm9sZGluZyByYW5nZSBmb3IgYSBjb21tZW50XG4gICAgICovXG4gICAgRm9sZGluZ1JhbmdlS2luZC5Db21tZW50ID0gJ2NvbW1lbnQnO1xuICAgIC8qKlxuICAgICAqIEZvbGRpbmcgcmFuZ2UgZm9yIGFuIGltcG9ydCBvciBpbmNsdWRlXG4gICAgICovXG4gICAgRm9sZGluZ1JhbmdlS2luZC5JbXBvcnRzID0gJ2ltcG9ydHMnO1xuICAgIC8qKlxuICAgICAqIEZvbGRpbmcgcmFuZ2UgZm9yIGEgcmVnaW9uIChlLmcuIGAjcmVnaW9uYClcbiAgICAgKi9cbiAgICBGb2xkaW5nUmFuZ2VLaW5kLlJlZ2lvbiA9ICdyZWdpb24nO1xufSkoRm9sZGluZ1JhbmdlS2luZCB8fCAoRm9sZGluZ1JhbmdlS2luZCA9IHt9KSk7XG4vKipcbiAqIFRoZSBmb2xkaW5nIHJhbmdlIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIEZvbGRpbmdSYW5nZX0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgRm9sZGluZ1JhbmdlO1xuKGZ1bmN0aW9uIChGb2xkaW5nUmFuZ2UpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IEZvbGRpbmdSYW5nZSBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShzdGFydExpbmUsIGVuZExpbmUsIHN0YXJ0Q2hhcmFjdGVyLCBlbmRDaGFyYWN0ZXIsIGtpbmQsIGNvbGxhcHNlZFRleHQpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgc3RhcnRMaW5lLFxuICAgICAgICAgICAgZW5kTGluZVxuICAgICAgICB9O1xuICAgICAgICBpZiAoSXMuZGVmaW5lZChzdGFydENoYXJhY3RlcikpIHtcbiAgICAgICAgICAgIHJlc3VsdC5zdGFydENoYXJhY3RlciA9IHN0YXJ0Q2hhcmFjdGVyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKGVuZENoYXJhY3RlcikpIHtcbiAgICAgICAgICAgIHJlc3VsdC5lbmRDaGFyYWN0ZXIgPSBlbmRDaGFyYWN0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzLmRlZmluZWQoa2luZCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5raW5kID0ga2luZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXMuZGVmaW5lZChjb2xsYXBzZWRUZXh0KSkge1xuICAgICAgICAgICAgcmVzdWx0LmNvbGxhcHNlZFRleHQgPSBjb2xsYXBzZWRUZXh0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIEZvbGRpbmdSYW5nZS5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBGb2xkaW5nUmFuZ2V9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBJcy51aW50ZWdlcihjYW5kaWRhdGUuc3RhcnRMaW5lKSAmJiBJcy51aW50ZWdlcihjYW5kaWRhdGUuc3RhcnRMaW5lKVxuICAgICAgICAgICAgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUuc3RhcnRDaGFyYWN0ZXIpIHx8IElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS5zdGFydENoYXJhY3RlcikpXG4gICAgICAgICAgICAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5lbmRDaGFyYWN0ZXIpIHx8IElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS5lbmRDaGFyYWN0ZXIpKVxuICAgICAgICAgICAgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUua2luZCkgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS5raW5kKSk7XG4gICAgfVxuICAgIEZvbGRpbmdSYW5nZS5pcyA9IGlzO1xufSkoRm9sZGluZ1JhbmdlIHx8IChGb2xkaW5nUmFuZ2UgPSB7fSkpO1xuLyoqXG4gKiBUaGUgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbiBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9ufSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uO1xuKGZ1bmN0aW9uIChEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGxvY2F0aW9uLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgICAgIG1lc3NhZ2VcbiAgICAgICAgfTtcbiAgICB9XG4gICAgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9ufSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIExvY2F0aW9uLmlzKGNhbmRpZGF0ZS5sb2NhdGlvbikgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5tZXNzYWdlKTtcbiAgICB9XG4gICAgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbi5pcyA9IGlzO1xufSkoRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbiB8fCAoRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBkaWFnbm9zdGljJ3Mgc2V2ZXJpdHkuXG4gKi9cbmV4cG9ydCB2YXIgRGlhZ25vc3RpY1NldmVyaXR5O1xuKGZ1bmN0aW9uIChEaWFnbm9zdGljU2V2ZXJpdHkpIHtcbiAgICAvKipcbiAgICAgKiBSZXBvcnRzIGFuIGVycm9yLlxuICAgICAqL1xuICAgIERpYWdub3N0aWNTZXZlcml0eS5FcnJvciA9IDE7XG4gICAgLyoqXG4gICAgICogUmVwb3J0cyBhIHdhcm5pbmcuXG4gICAgICovXG4gICAgRGlhZ25vc3RpY1NldmVyaXR5Lldhcm5pbmcgPSAyO1xuICAgIC8qKlxuICAgICAqIFJlcG9ydHMgYW4gaW5mb3JtYXRpb24uXG4gICAgICovXG4gICAgRGlhZ25vc3RpY1NldmVyaXR5LkluZm9ybWF0aW9uID0gMztcbiAgICAvKipcbiAgICAgKiBSZXBvcnRzIGEgaGludC5cbiAgICAgKi9cbiAgICBEaWFnbm9zdGljU2V2ZXJpdHkuSGludCA9IDQ7XG59KShEaWFnbm9zdGljU2V2ZXJpdHkgfHwgKERpYWdub3N0aWNTZXZlcml0eSA9IHt9KSk7XG4vKipcbiAqIFRoZSBkaWFnbm9zdGljIHRhZ3MuXG4gKlxuICogQHNpbmNlIDMuMTUuMFxuICovXG5leHBvcnQgdmFyIERpYWdub3N0aWNUYWc7XG4oZnVuY3Rpb24gKERpYWdub3N0aWNUYWcpIHtcbiAgICAvKipcbiAgICAgKiBVbnVzZWQgb3IgdW5uZWNlc3NhcnkgY29kZS5cbiAgICAgKlxuICAgICAqIENsaWVudHMgYXJlIGFsbG93ZWQgdG8gcmVuZGVyIGRpYWdub3N0aWNzIHdpdGggdGhpcyB0YWcgZmFkZWQgb3V0IGluc3RlYWQgb2YgaGF2aW5nXG4gICAgICogYW4gZXJyb3Igc3F1aWdnbGUuXG4gICAgICovXG4gICAgRGlhZ25vc3RpY1RhZy5Vbm5lY2Vzc2FyeSA9IDE7XG4gICAgLyoqXG4gICAgICogRGVwcmVjYXRlZCBvciBvYnNvbGV0ZSBjb2RlLlxuICAgICAqXG4gICAgICogQ2xpZW50cyBhcmUgYWxsb3dlZCB0byByZW5kZXJlZCBkaWFnbm9zdGljcyB3aXRoIHRoaXMgdGFnIHN0cmlrZSB0aHJvdWdoLlxuICAgICAqL1xuICAgIERpYWdub3N0aWNUYWcuRGVwcmVjYXRlZCA9IDI7XG59KShEaWFnbm9zdGljVGFnIHx8IChEaWFnbm9zdGljVGFnID0ge30pKTtcbi8qKlxuICogVGhlIENvZGVEZXNjcmlwdGlvbiBuYW1lc3BhY2UgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCBkZXNjcmlwdGlvbnMgZm9yIGRpYWdub3N0aWMgY29kZXMuXG4gKlxuICogQHNpbmNlIDMuMTYuMFxuICovXG5leHBvcnQgdmFyIENvZGVEZXNjcmlwdGlvbjtcbihmdW5jdGlvbiAoQ29kZURlc2NyaXB0aW9uKSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5ocmVmKTtcbiAgICB9XG4gICAgQ29kZURlc2NyaXB0aW9uLmlzID0gaXM7XG59KShDb2RlRGVzY3JpcHRpb24gfHwgKENvZGVEZXNjcmlwdGlvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBEaWFnbm9zdGljIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIERpYWdub3N0aWN9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIERpYWdub3N0aWM7XG4oZnVuY3Rpb24gKERpYWdub3N0aWMpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IERpYWdub3N0aWMgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIG1lc3NhZ2UsIHNldmVyaXR5LCBjb2RlLCBzb3VyY2UsIHJlbGF0ZWRJbmZvcm1hdGlvbikge1xuICAgICAgICBsZXQgcmVzdWx0ID0geyByYW5nZSwgbWVzc2FnZSB9O1xuICAgICAgICBpZiAoSXMuZGVmaW5lZChzZXZlcml0eSkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5zZXZlcml0eSA9IHNldmVyaXR5O1xuICAgICAgICB9XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKGNvZGUpKSB7XG4gICAgICAgICAgICByZXN1bHQuY29kZSA9IGNvZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzLmRlZmluZWQoc291cmNlKSkge1xuICAgICAgICAgICAgcmVzdWx0LnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXMuZGVmaW5lZChyZWxhdGVkSW5mb3JtYXRpb24pKSB7XG4gICAgICAgICAgICByZXN1bHQucmVsYXRlZEluZm9ybWF0aW9uID0gcmVsYXRlZEluZm9ybWF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIERpYWdub3N0aWMuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgRGlhZ25vc3RpY30gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpXG4gICAgICAgICAgICAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpXG4gICAgICAgICAgICAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLm1lc3NhZ2UpXG4gICAgICAgICAgICAmJiAoSXMubnVtYmVyKGNhbmRpZGF0ZS5zZXZlcml0eSkgfHwgSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5zZXZlcml0eSkpXG4gICAgICAgICAgICAmJiAoSXMuaW50ZWdlcihjYW5kaWRhdGUuY29kZSkgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS5jb2RlKSB8fCBJcy51bmRlZmluZWQoY2FuZGlkYXRlLmNvZGUpKVxuICAgICAgICAgICAgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUuY29kZURlc2NyaXB0aW9uKSB8fCAoSXMuc3RyaW5nKChfYSA9IGNhbmRpZGF0ZS5jb2RlRGVzY3JpcHRpb24pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5ocmVmKSkpXG4gICAgICAgICAgICAmJiAoSXMuc3RyaW5nKGNhbmRpZGF0ZS5zb3VyY2UpIHx8IElzLnVuZGVmaW5lZChjYW5kaWRhdGUuc291cmNlKSlcbiAgICAgICAgICAgICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLnJlbGF0ZWRJbmZvcm1hdGlvbikgfHwgSXMudHlwZWRBcnJheShjYW5kaWRhdGUucmVsYXRlZEluZm9ybWF0aW9uLCBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uLmlzKSk7XG4gICAgfVxuICAgIERpYWdub3N0aWMuaXMgPSBpcztcbn0pKERpYWdub3N0aWMgfHwgKERpYWdub3N0aWMgPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29tbWFuZCBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBDb21tYW5kfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBDb21tYW5kO1xuKGZ1bmN0aW9uIChDb21tYW5kKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDb21tYW5kIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHRpdGxlLCBjb21tYW5kLCAuLi5hcmdzKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IHRpdGxlLCBjb21tYW5kIH07XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKGFyZ3MpICYmIGFyZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmVzdWx0LmFyZ3VtZW50cyA9IGFyZ3M7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgQ29tbWFuZC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBDb21tYW5kfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudGl0bGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUuY29tbWFuZCk7XG4gICAgfVxuICAgIENvbW1hbmQuaXMgPSBpcztcbn0pKENvbW1hbmQgfHwgKENvbW1hbmQgPSB7fSkpO1xuLyoqXG4gKiBUaGUgVGV4dEVkaXQgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgcmVwbGFjZSxcbiAqIGluc2VydCBhbmQgZGVsZXRlIGVkaXRzIG1vcmUgZWFzaWx5LlxuICovXG5leHBvcnQgdmFyIFRleHRFZGl0O1xuKGZ1bmN0aW9uIChUZXh0RWRpdCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSByZXBsYWNlIHRleHQgZWRpdC5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlIG9mIHRleHQgdG8gYmUgcmVwbGFjZWQuXG4gICAgICogQHBhcmFtIG5ld1RleHQgVGhlIG5ldyB0ZXh0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlcGxhY2UocmFuZ2UsIG5ld1RleHQpIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIG5ld1RleHQgfTtcbiAgICB9XG4gICAgVGV4dEVkaXQucmVwbGFjZSA9IHJlcGxhY2U7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnNlcnQgdGV4dCBlZGl0LlxuICAgICAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgcG9zaXRpb24gdG8gaW5zZXJ0IHRoZSB0ZXh0IGF0LlxuICAgICAqIEBwYXJhbSBuZXdUZXh0IFRoZSB0ZXh0IHRvIGJlIGluc2VydGVkLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluc2VydChwb3NpdGlvbiwgbmV3VGV4dCkge1xuICAgICAgICByZXR1cm4geyByYW5nZTogeyBzdGFydDogcG9zaXRpb24sIGVuZDogcG9zaXRpb24gfSwgbmV3VGV4dCB9O1xuICAgIH1cbiAgICBUZXh0RWRpdC5pbnNlcnQgPSBpbnNlcnQ7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGRlbGV0ZSB0ZXh0IGVkaXQuXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSBvZiB0ZXh0IHRvIGJlIGRlbGV0ZWQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZGVsKHJhbmdlKSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCBuZXdUZXh0OiAnJyB9O1xuICAgIH1cbiAgICBUZXh0RWRpdC5kZWwgPSBkZWw7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSlcbiAgICAgICAgICAgICYmIElzLnN0cmluZyhjYW5kaWRhdGUubmV3VGV4dClcbiAgICAgICAgICAgICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSk7XG4gICAgfVxuICAgIFRleHRFZGl0LmlzID0gaXM7XG59KShUZXh0RWRpdCB8fCAoVGV4dEVkaXQgPSB7fSkpO1xuZXhwb3J0IHZhciBDaGFuZ2VBbm5vdGF0aW9uO1xuKGZ1bmN0aW9uIChDaGFuZ2VBbm5vdGF0aW9uKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKGxhYmVsLCBuZWVkc0NvbmZpcm1hdGlvbiwgZGVzY3JpcHRpb24pIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0geyBsYWJlbCB9O1xuICAgICAgICBpZiAobmVlZHNDb25maXJtYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0Lm5lZWRzQ29uZmlybWF0aW9uID0gbmVlZHNDb25maXJtYXRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIENoYW5nZUFubm90YXRpb24uY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUubGFiZWwpICYmXG4gICAgICAgICAgICAoSXMuYm9vbGVhbihjYW5kaWRhdGUubmVlZHNDb25maXJtYXRpb24pIHx8IGNhbmRpZGF0ZS5uZWVkc0NvbmZpcm1hdGlvbiA9PT0gdW5kZWZpbmVkKSAmJlxuICAgICAgICAgICAgKElzLnN0cmluZyhjYW5kaWRhdGUuZGVzY3JpcHRpb24pIHx8IGNhbmRpZGF0ZS5kZXNjcmlwdGlvbiA9PT0gdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgQ2hhbmdlQW5ub3RhdGlvbi5pcyA9IGlzO1xufSkoQ2hhbmdlQW5ub3RhdGlvbiB8fCAoQ2hhbmdlQW5ub3RhdGlvbiA9IHt9KSk7XG5leHBvcnQgdmFyIENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyO1xuKGZ1bmN0aW9uIChDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuc3RyaW5nKGNhbmRpZGF0ZSk7XG4gICAgfVxuICAgIENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzID0gaXM7XG59KShDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllciB8fCAoQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIgPSB7fSkpO1xuZXhwb3J0IHZhciBBbm5vdGF0ZWRUZXh0RWRpdDtcbihmdW5jdGlvbiAoQW5ub3RhdGVkVGV4dEVkaXQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFubm90YXRlZCByZXBsYWNlIHRleHQgZWRpdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2Ugb2YgdGV4dCB0byBiZSByZXBsYWNlZC5cbiAgICAgKiBAcGFyYW0gbmV3VGV4dCBUaGUgbmV3IHRleHQuXG4gICAgICogQHBhcmFtIGFubm90YXRpb24gVGhlIGFubm90YXRpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVwbGFjZShyYW5nZSwgbmV3VGV4dCwgYW5ub3RhdGlvbikge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgbmV3VGV4dCwgYW5ub3RhdGlvbklkOiBhbm5vdGF0aW9uIH07XG4gICAgfVxuICAgIEFubm90YXRlZFRleHRFZGl0LnJlcGxhY2UgPSByZXBsYWNlO1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYW5ub3RhdGVkIGluc2VydCB0ZXh0IGVkaXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIHBvc2l0aW9uIHRvIGluc2VydCB0aGUgdGV4dCBhdC5cbiAgICAgKiBAcGFyYW0gbmV3VGV4dCBUaGUgdGV4dCB0byBiZSBpbnNlcnRlZC5cbiAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiBUaGUgYW5ub3RhdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbnNlcnQocG9zaXRpb24sIG5ld1RleHQsIGFubm90YXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2U6IHsgc3RhcnQ6IHBvc2l0aW9uLCBlbmQ6IHBvc2l0aW9uIH0sIG5ld1RleHQsIGFubm90YXRpb25JZDogYW5ub3RhdGlvbiB9O1xuICAgIH1cbiAgICBBbm5vdGF0ZWRUZXh0RWRpdC5pbnNlcnQgPSBpbnNlcnQ7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhbm5vdGF0ZWQgZGVsZXRlIHRleHQgZWRpdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2Ugb2YgdGV4dCB0byBiZSBkZWxldGVkLlxuICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIFRoZSBhbm5vdGF0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRlbChyYW5nZSwgYW5ub3RhdGlvbikge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgbmV3VGV4dDogJycsIGFubm90YXRpb25JZDogYW5ub3RhdGlvbiB9O1xuICAgIH1cbiAgICBBbm5vdGF0ZWRUZXh0RWRpdC5kZWwgPSBkZWw7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBUZXh0RWRpdC5pcyhjYW5kaWRhdGUpICYmIChDaGFuZ2VBbm5vdGF0aW9uLmlzKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQpIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQpKTtcbiAgICB9XG4gICAgQW5ub3RhdGVkVGV4dEVkaXQuaXMgPSBpcztcbn0pKEFubm90YXRlZFRleHRFZGl0IHx8IChBbm5vdGF0ZWRUZXh0RWRpdCA9IHt9KSk7XG4vKipcbiAqIFRoZSBUZXh0RG9jdW1lbnRFZGl0IG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlXG4gKiBhbiBlZGl0IHRoYXQgbWFuaXB1bGF0ZXMgYSB0ZXh0IGRvY3VtZW50LlxuICovXG5leHBvcnQgdmFyIFRleHREb2N1bWVudEVkaXQ7XG4oZnVuY3Rpb24gKFRleHREb2N1bWVudEVkaXQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGBUZXh0RG9jdW1lbnRFZGl0YFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh0ZXh0RG9jdW1lbnQsIGVkaXRzKSB7XG4gICAgICAgIHJldHVybiB7IHRleHREb2N1bWVudCwgZWRpdHMgfTtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50RWRpdC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpXG4gICAgICAgICAgICAmJiBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIuaXMoY2FuZGlkYXRlLnRleHREb2N1bWVudClcbiAgICAgICAgICAgICYmIEFycmF5LmlzQXJyYXkoY2FuZGlkYXRlLmVkaXRzKTtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50RWRpdC5pcyA9IGlzO1xufSkoVGV4dERvY3VtZW50RWRpdCB8fCAoVGV4dERvY3VtZW50RWRpdCA9IHt9KSk7XG5leHBvcnQgdmFyIENyZWF0ZUZpbGU7XG4oZnVuY3Rpb24gKENyZWF0ZUZpbGUpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUodXJpLCBvcHRpb25zLCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7XG4gICAgICAgICAgICBraW5kOiAnY3JlYXRlJyxcbiAgICAgICAgICAgIHVyaVxuICAgICAgICB9O1xuICAgICAgICBpZiAob3B0aW9ucyAhPT0gdW5kZWZpbmVkICYmIChvcHRpb25zLm92ZXJ3cml0ZSAhPT0gdW5kZWZpbmVkIHx8IG9wdGlvbnMuaWdub3JlSWZFeGlzdHMgIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgfVxuICAgICAgICBpZiAoYW5ub3RhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQuYW5ub3RhdGlvbklkID0gYW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBDcmVhdGVGaWxlLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgY2FuZGlkYXRlLmtpbmQgPT09ICdjcmVhdGUnICYmIElzLnN0cmluZyhjYW5kaWRhdGUudXJpKSAmJiAoY2FuZGlkYXRlLm9wdGlvbnMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgKChjYW5kaWRhdGUub3B0aW9ucy5vdmVyd3JpdGUgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5vcHRpb25zLm92ZXJ3cml0ZSkpICYmIChjYW5kaWRhdGUub3B0aW9ucy5pZ25vcmVJZkV4aXN0cyA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLm9wdGlvbnMuaWdub3JlSWZFeGlzdHMpKSkpICYmIChjYW5kaWRhdGUuYW5ub3RhdGlvbklkID09PSB1bmRlZmluZWQgfHwgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoY2FuZGlkYXRlLmFubm90YXRpb25JZCkpO1xuICAgIH1cbiAgICBDcmVhdGVGaWxlLmlzID0gaXM7XG59KShDcmVhdGVGaWxlIHx8IChDcmVhdGVGaWxlID0ge30pKTtcbmV4cG9ydCB2YXIgUmVuYW1lRmlsZTtcbihmdW5jdGlvbiAoUmVuYW1lRmlsZSkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShvbGRVcmksIG5ld1VyaSwgb3B0aW9ucywgYW5ub3RhdGlvbikge1xuICAgICAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgICAgICAga2luZDogJ3JlbmFtZScsXG4gICAgICAgICAgICBvbGRVcmksXG4gICAgICAgICAgICBuZXdVcmlcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKG9wdGlvbnMgIT09IHVuZGVmaW5lZCAmJiAob3B0aW9ucy5vdmVyd3JpdGUgIT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLmlnbm9yZUlmRXhpc3RzICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICByZXN1bHQub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFubm90YXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmFubm90YXRpb25JZCA9IGFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgUmVuYW1lRmlsZS5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIGNhbmRpZGF0ZS5raW5kID09PSAncmVuYW1lJyAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLm9sZFVyaSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5uZXdVcmkpICYmIChjYW5kaWRhdGUub3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAoKGNhbmRpZGF0ZS5vcHRpb25zLm92ZXJ3cml0ZSA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLm9wdGlvbnMub3ZlcndyaXRlKSkgJiYgKGNhbmRpZGF0ZS5vcHRpb25zLmlnbm9yZUlmRXhpc3RzID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUub3B0aW9ucy5pZ25vcmVJZkV4aXN0cykpKSkgJiYgKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQgPT09IHVuZGVmaW5lZCB8fCBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhjYW5kaWRhdGUuYW5ub3RhdGlvbklkKSk7XG4gICAgfVxuICAgIFJlbmFtZUZpbGUuaXMgPSBpcztcbn0pKFJlbmFtZUZpbGUgfHwgKFJlbmFtZUZpbGUgPSB7fSkpO1xuZXhwb3J0IHZhciBEZWxldGVGaWxlO1xuKGZ1bmN0aW9uIChEZWxldGVGaWxlKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKHVyaSwgb3B0aW9ucywgYW5ub3RhdGlvbikge1xuICAgICAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgICAgICAga2luZDogJ2RlbGV0ZScsXG4gICAgICAgICAgICB1cmlcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKG9wdGlvbnMgIT09IHVuZGVmaW5lZCAmJiAob3B0aW9ucy5yZWN1cnNpdmUgIT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLmlnbm9yZUlmTm90RXhpc3RzICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICByZXN1bHQub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFubm90YXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmFubm90YXRpb25JZCA9IGFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgRGVsZXRlRmlsZS5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIGNhbmRpZGF0ZS5raW5kID09PSAnZGVsZXRlJyAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSkgJiYgKGNhbmRpZGF0ZS5vcHRpb25zID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICgoY2FuZGlkYXRlLm9wdGlvbnMucmVjdXJzaXZlID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUub3B0aW9ucy5yZWN1cnNpdmUpKSAmJiAoY2FuZGlkYXRlLm9wdGlvbnMuaWdub3JlSWZOb3RFeGlzdHMgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5vcHRpb25zLmlnbm9yZUlmTm90RXhpc3RzKSkpKSAmJiAoY2FuZGlkYXRlLmFubm90YXRpb25JZCA9PT0gdW5kZWZpbmVkIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQpKTtcbiAgICB9XG4gICAgRGVsZXRlRmlsZS5pcyA9IGlzO1xufSkoRGVsZXRlRmlsZSB8fCAoRGVsZXRlRmlsZSA9IHt9KSk7XG5leHBvcnQgdmFyIFdvcmtzcGFjZUVkaXQ7XG4oZnVuY3Rpb24gKFdvcmtzcGFjZUVkaXQpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuY2hhbmdlcyAhPT0gdW5kZWZpbmVkIHx8IGNhbmRpZGF0ZS5kb2N1bWVudENoYW5nZXMgIT09IHVuZGVmaW5lZCkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuZG9jdW1lbnRDaGFuZ2VzID09PSB1bmRlZmluZWQgfHwgY2FuZGlkYXRlLmRvY3VtZW50Q2hhbmdlcy5ldmVyeSgoY2hhbmdlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKElzLnN0cmluZyhjaGFuZ2Uua2luZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZUZpbGUuaXMoY2hhbmdlKSB8fCBSZW5hbWVGaWxlLmlzKGNoYW5nZSkgfHwgRGVsZXRlRmlsZS5pcyhjaGFuZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRleHREb2N1bWVudEVkaXQuaXMoY2hhbmdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSk7XG4gICAgfVxuICAgIFdvcmtzcGFjZUVkaXQuaXMgPSBpcztcbn0pKFdvcmtzcGFjZUVkaXQgfHwgKFdvcmtzcGFjZUVkaXQgPSB7fSkpO1xuY2xhc3MgVGV4dEVkaXRDaGFuZ2VJbXBsIHtcbiAgICBjb25zdHJ1Y3RvcihlZGl0cywgY2hhbmdlQW5ub3RhdGlvbnMpIHtcbiAgICAgICAgdGhpcy5lZGl0cyA9IGVkaXRzO1xuICAgICAgICB0aGlzLmNoYW5nZUFubm90YXRpb25zID0gY2hhbmdlQW5ub3RhdGlvbnM7XG4gICAgfVxuICAgIGluc2VydChwb3NpdGlvbiwgbmV3VGV4dCwgYW5ub3RhdGlvbikge1xuICAgICAgICBsZXQgZWRpdDtcbiAgICAgICAgbGV0IGlkO1xuICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBlZGl0ID0gVGV4dEVkaXQuaW5zZXJ0KHBvc2l0aW9uLCBuZXdUZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhhbm5vdGF0aW9uKSkge1xuICAgICAgICAgICAgaWQgPSBhbm5vdGF0aW9uO1xuICAgICAgICAgICAgZWRpdCA9IEFubm90YXRlZFRleHRFZGl0Lmluc2VydChwb3NpdGlvbiwgbmV3VGV4dCwgYW5ub3RhdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFzc2VydENoYW5nZUFubm90YXRpb25zKHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgaWQgPSB0aGlzLmNoYW5nZUFubm90YXRpb25zLm1hbmFnZShhbm5vdGF0aW9uKTtcbiAgICAgICAgICAgIGVkaXQgPSBBbm5vdGF0ZWRUZXh0RWRpdC5pbnNlcnQocG9zaXRpb24sIG5ld1RleHQsIGlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVkaXRzLnB1c2goZWRpdCk7XG4gICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVwbGFjZShyYW5nZSwgbmV3VGV4dCwgYW5ub3RhdGlvbikge1xuICAgICAgICBsZXQgZWRpdDtcbiAgICAgICAgbGV0IGlkO1xuICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBlZGl0ID0gVGV4dEVkaXQucmVwbGFjZShyYW5nZSwgbmV3VGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoYW5ub3RhdGlvbikpIHtcbiAgICAgICAgICAgIGlkID0gYW5ub3RhdGlvbjtcbiAgICAgICAgICAgIGVkaXQgPSBBbm5vdGF0ZWRUZXh0RWRpdC5yZXBsYWNlKHJhbmdlLCBuZXdUZXh0LCBhbm5vdGF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYXNzZXJ0Q2hhbmdlQW5ub3RhdGlvbnModGhpcy5jaGFuZ2VBbm5vdGF0aW9ucyk7XG4gICAgICAgICAgICBpZCA9IHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMubWFuYWdlKGFubm90YXRpb24pO1xuICAgICAgICAgICAgZWRpdCA9IEFubm90YXRlZFRleHRFZGl0LnJlcGxhY2UocmFuZ2UsIG5ld1RleHQsIGlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVkaXRzLnB1c2goZWRpdCk7XG4gICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVsZXRlKHJhbmdlLCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIGxldCBlZGl0O1xuICAgICAgICBsZXQgaWQ7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGVkaXQgPSBUZXh0RWRpdC5kZWwocmFuZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGFubm90YXRpb24pKSB7XG4gICAgICAgICAgICBpZCA9IGFubm90YXRpb247XG4gICAgICAgICAgICBlZGl0ID0gQW5ub3RhdGVkVGV4dEVkaXQuZGVsKHJhbmdlLCBhbm5vdGF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYXNzZXJ0Q2hhbmdlQW5ub3RhdGlvbnModGhpcy5jaGFuZ2VBbm5vdGF0aW9ucyk7XG4gICAgICAgICAgICBpZCA9IHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMubWFuYWdlKGFubm90YXRpb24pO1xuICAgICAgICAgICAgZWRpdCA9IEFubm90YXRlZFRleHRFZGl0LmRlbChyYW5nZSwgaWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWRpdHMucHVzaChlZGl0KTtcbiAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhZGQoZWRpdCkge1xuICAgICAgICB0aGlzLmVkaXRzLnB1c2goZWRpdCk7XG4gICAgfVxuICAgIGFsbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdHM7XG4gICAgfVxuICAgIGNsZWFyKCkge1xuICAgICAgICB0aGlzLmVkaXRzLnNwbGljZSgwLCB0aGlzLmVkaXRzLmxlbmd0aCk7XG4gICAgfVxuICAgIGFzc2VydENoYW5nZUFubm90YXRpb25zKHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRleHQgZWRpdCBjaGFuZ2UgaXMgbm90IGNvbmZpZ3VyZWQgdG8gbWFuYWdlIGNoYW5nZSBhbm5vdGF0aW9ucy5gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogQSBoZWxwZXIgY2xhc3NcbiAqL1xuY2xhc3MgQ2hhbmdlQW5ub3RhdGlvbnMge1xuICAgIGNvbnN0cnVjdG9yKGFubm90YXRpb25zKSB7XG4gICAgICAgIHRoaXMuX2Fubm90YXRpb25zID0gYW5ub3RhdGlvbnMgPT09IHVuZGVmaW5lZCA/IE9iamVjdC5jcmVhdGUobnVsbCkgOiBhbm5vdGF0aW9ucztcbiAgICAgICAgdGhpcy5fY291bnRlciA9IDA7XG4gICAgICAgIHRoaXMuX3NpemUgPSAwO1xuICAgIH1cbiAgICBhbGwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hbm5vdGF0aW9ucztcbiAgICB9XG4gICAgZ2V0IHNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaXplO1xuICAgIH1cbiAgICBtYW5hZ2UoaWRPckFubm90YXRpb24sIGFubm90YXRpb24pIHtcbiAgICAgICAgbGV0IGlkO1xuICAgICAgICBpZiAoQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoaWRPckFubm90YXRpb24pKSB7XG4gICAgICAgICAgICBpZCA9IGlkT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWQgPSB0aGlzLm5leHRJZCgpO1xuICAgICAgICAgICAgYW5ub3RhdGlvbiA9IGlkT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9hbm5vdGF0aW9uc1tpZF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJZCAke2lkfSBpcyBhbHJlYWR5IGluIHVzZS5gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGFubm90YXRpb24gcHJvdmlkZWQgZm9yIGlkICR7aWR9YCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fYW5ub3RhdGlvbnNbaWRdID0gYW5ub3RhdGlvbjtcbiAgICAgICAgdGhpcy5fc2l6ZSsrO1xuICAgICAgICByZXR1cm4gaWQ7XG4gICAgfVxuICAgIG5leHRJZCgpIHtcbiAgICAgICAgdGhpcy5fY291bnRlcisrO1xuICAgICAgICByZXR1cm4gdGhpcy5fY291bnRlci50b1N0cmluZygpO1xuICAgIH1cbn1cbi8qKlxuICogQSB3b3Jrc3BhY2UgY2hhbmdlIGhlbHBzIGNvbnN0cnVjdGluZyBjaGFuZ2VzIHRvIGEgd29ya3NwYWNlLlxuICovXG5leHBvcnQgY2xhc3MgV29ya3NwYWNlQ2hhbmdlIHtcbiAgICBjb25zdHJ1Y3Rvcih3b3Jrc3BhY2VFZGl0KSB7XG4gICAgICAgIHRoaXMuX3RleHRFZGl0Q2hhbmdlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIGlmICh3b3Jrc3BhY2VFZGl0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQgPSB3b3Jrc3BhY2VFZGl0O1xuICAgICAgICAgICAgaWYgKHdvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMgPSBuZXcgQ2hhbmdlQW5ub3RhdGlvbnMod29ya3NwYWNlRWRpdC5jaGFuZ2VBbm5vdGF0aW9ucyk7XG4gICAgICAgICAgICAgICAgd29ya3NwYWNlRWRpdC5jaGFuZ2VBbm5vdGF0aW9ucyA9IHRoaXMuX2NoYW5nZUFubm90YXRpb25zLmFsbCgpO1xuICAgICAgICAgICAgICAgIHdvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzLmZvckVhY2goKGNoYW5nZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoVGV4dERvY3VtZW50RWRpdC5pcyhjaGFuZ2UpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0RWRpdENoYW5nZSA9IG5ldyBUZXh0RWRpdENoYW5nZUltcGwoY2hhbmdlLmVkaXRzLCB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXh0RWRpdENoYW5nZXNbY2hhbmdlLnRleHREb2N1bWVudC51cmldID0gdGV4dEVkaXRDaGFuZ2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHdvcmtzcGFjZUVkaXQuY2hhbmdlcykge1xuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHdvcmtzcGFjZUVkaXQuY2hhbmdlcykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHRFZGl0Q2hhbmdlID0gbmV3IFRleHRFZGl0Q2hhbmdlSW1wbCh3b3Jrc3BhY2VFZGl0LmNoYW5nZXNba2V5XSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RleHRFZGl0Q2hhbmdlc1trZXldID0gdGV4dEVkaXRDaGFuZ2U7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0ID0ge307XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdW5kZXJseWluZyB7QGxpbmsgV29ya3NwYWNlRWRpdH0gbGl0ZXJhbFxuICAgICAqIHVzZSB0byBiZSByZXR1cm5lZCBmcm9tIGEgd29ya3NwYWNlIGVkaXQgb3BlcmF0aW9uIGxpa2UgcmVuYW1lLlxuICAgICAqL1xuICAgIGdldCBlZGl0KCkge1xuICAgICAgICB0aGlzLmluaXREb2N1bWVudENoYW5nZXMoKTtcbiAgICAgICAgaWYgKHRoaXMuX2NoYW5nZUFubm90YXRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5zaXplID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VBbm5vdGF0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlQW5ub3RhdGlvbnMgPSB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5hbGwoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fd29ya3NwYWNlRWRpdDtcbiAgICB9XG4gICAgZ2V0VGV4dEVkaXRDaGFuZ2Uoa2V5KSB7XG4gICAgICAgIGlmIChPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIuaXMoa2V5KSkge1xuICAgICAgICAgICAgdGhpcy5pbml0RG9jdW1lbnRDaGFuZ2VzKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV29ya3NwYWNlIGVkaXQgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIGRvY3VtZW50IGNoYW5nZXMuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0ZXh0RG9jdW1lbnQgPSB7IHVyaToga2V5LnVyaSwgdmVyc2lvbjoga2V5LnZlcnNpb24gfTtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLl90ZXh0RWRpdENoYW5nZXNbdGV4dERvY3VtZW50LnVyaV07XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVkaXRzID0gW107XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dERvY3VtZW50RWRpdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dERvY3VtZW50LFxuICAgICAgICAgICAgICAgICAgICBlZGl0c1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMucHVzaCh0ZXh0RG9jdW1lbnRFZGl0KTtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgVGV4dEVkaXRDaGFuZ2VJbXBsKGVkaXRzLCB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGV4dEVkaXRDaGFuZ2VzW3RleHREb2N1bWVudC51cmldID0gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdENoYW5nZXMoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV29ya3NwYWNlIGVkaXQgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIG5vcm1hbCB0ZXh0IGVkaXQgY2hhbmdlcy4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLl90ZXh0RWRpdENoYW5nZXNba2V5XTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgbGV0IGVkaXRzID0gW107XG4gICAgICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VzW2tleV0gPSBlZGl0cztcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgVGV4dEVkaXRDaGFuZ2VJbXBsKGVkaXRzKTtcbiAgICAgICAgICAgICAgICB0aGlzLl90ZXh0RWRpdENoYW5nZXNba2V5XSA9IHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaW5pdERvY3VtZW50Q2hhbmdlcygpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzID09PSB1bmRlZmluZWQgJiYgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZUFubm90YXRpb25zID0gbmV3IENoYW5nZUFubm90YXRpb25zKCk7XG4gICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VBbm5vdGF0aW9ucyA9IHRoaXMuX2NoYW5nZUFubm90YXRpb25zLmFsbCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGluaXRDaGFuZ2VzKCkge1xuICAgICAgICBpZiAodGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMgPT09IHVuZGVmaW5lZCAmJiB0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjcmVhdGVGaWxlKHVyaSwgb3B0aW9uc09yQW5ub3RhdGlvbiwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLmluaXREb2N1bWVudENoYW5nZXMoKTtcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV29ya3NwYWNlIGVkaXQgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIGRvY3VtZW50IGNoYW5nZXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGFubm90YXRpb247XG4gICAgICAgIGlmIChDaGFuZ2VBbm5vdGF0aW9uLmlzKG9wdGlvbnNPckFubm90YXRpb24pIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKG9wdGlvbnNPckFubm90YXRpb24pKSB7XG4gICAgICAgICAgICBhbm5vdGF0aW9uID0gb3B0aW9uc09yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGxldCBvcGVyYXRpb247XG4gICAgICAgIGxldCBpZDtcbiAgICAgICAgaWYgKGFubm90YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3BlcmF0aW9uID0gQ3JlYXRlRmlsZS5jcmVhdGUodXJpLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlkID0gQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoYW5ub3RhdGlvbikgPyBhbm5vdGF0aW9uIDogdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMubWFuYWdlKGFubm90YXRpb24pO1xuICAgICAgICAgICAgb3BlcmF0aW9uID0gQ3JlYXRlRmlsZS5jcmVhdGUodXJpLCBvcHRpb25zLCBpZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMucHVzaChvcGVyYXRpb24pO1xuICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlbmFtZUZpbGUob2xkVXJpLCBuZXdVcmksIG9wdGlvbnNPckFubm90YXRpb24sIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5pbml0RG9jdW1lbnRDaGFuZ2VzKCk7XG4gICAgICAgIGlmICh0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dvcmtzcGFjZSBlZGl0IGlzIG5vdCBjb25maWd1cmVkIGZvciBkb2N1bWVudCBjaGFuZ2VzLicpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhbm5vdGF0aW9uO1xuICAgICAgICBpZiAoQ2hhbmdlQW5ub3RhdGlvbi5pcyhvcHRpb25zT3JBbm5vdGF0aW9uKSB8fCBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhvcHRpb25zT3JBbm5vdGF0aW9uKSkge1xuICAgICAgICAgICAgYW5ub3RhdGlvbiA9IG9wdGlvbnNPckFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvcHRpb25zID0gb3B0aW9uc09yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb3BlcmF0aW9uO1xuICAgICAgICBsZXQgaWQ7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wZXJhdGlvbiA9IFJlbmFtZUZpbGUuY3JlYXRlKG9sZFVyaSwgbmV3VXJpLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlkID0gQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoYW5ub3RhdGlvbikgPyBhbm5vdGF0aW9uIDogdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMubWFuYWdlKGFubm90YXRpb24pO1xuICAgICAgICAgICAgb3BlcmF0aW9uID0gUmVuYW1lRmlsZS5jcmVhdGUob2xkVXJpLCBuZXdVcmksIG9wdGlvbnMsIGlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcy5wdXNoKG9wZXJhdGlvbik7XG4gICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVsZXRlRmlsZSh1cmksIG9wdGlvbnNPckFubm90YXRpb24sIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5pbml0RG9jdW1lbnRDaGFuZ2VzKCk7XG4gICAgICAgIGlmICh0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dvcmtzcGFjZSBlZGl0IGlzIG5vdCBjb25maWd1cmVkIGZvciBkb2N1bWVudCBjaGFuZ2VzLicpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhbm5vdGF0aW9uO1xuICAgICAgICBpZiAoQ2hhbmdlQW5ub3RhdGlvbi5pcyhvcHRpb25zT3JBbm5vdGF0aW9uKSB8fCBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhvcHRpb25zT3JBbm5vdGF0aW9uKSkge1xuICAgICAgICAgICAgYW5ub3RhdGlvbiA9IG9wdGlvbnNPckFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvcHRpb25zID0gb3B0aW9uc09yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb3BlcmF0aW9uO1xuICAgICAgICBsZXQgaWQ7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wZXJhdGlvbiA9IERlbGV0ZUZpbGUuY3JlYXRlKHVyaSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZCA9IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGFubm90YXRpb24pID8gYW5ub3RhdGlvbiA6IHRoaXMuX2NoYW5nZUFubm90YXRpb25zLm1hbmFnZShhbm5vdGF0aW9uKTtcbiAgICAgICAgICAgIG9wZXJhdGlvbiA9IERlbGV0ZUZpbGUuY3JlYXRlKHVyaSwgb3B0aW9ucywgaWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzLnB1c2gob3BlcmF0aW9uKTtcbiAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogVGhlIFRleHREb2N1bWVudElkZW50aWZpZXIgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgVGV4dERvY3VtZW50SWRlbnRpZmllcn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgVGV4dERvY3VtZW50SWRlbnRpZmllcjtcbihmdW5jdGlvbiAoVGV4dERvY3VtZW50SWRlbnRpZmllcikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgVGV4dERvY3VtZW50SWRlbnRpZmllciBsaXRlcmFsLlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIGRvY3VtZW50J3MgdXJpLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmkpIHtcbiAgICAgICAgcmV0dXJuIHsgdXJpIH07XG4gICAgfVxuICAgIFRleHREb2N1bWVudElkZW50aWZpZXIuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgVGV4dERvY3VtZW50SWRlbnRpZmllcn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSk7XG4gICAgfVxuICAgIFRleHREb2N1bWVudElkZW50aWZpZXIuaXMgPSBpcztcbn0pKFRleHREb2N1bWVudElkZW50aWZpZXIgfHwgKFRleHREb2N1bWVudElkZW50aWZpZXIgPSB7fSkpO1xuLyoqXG4gKiBUaGUgVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyO1xuKGZ1bmN0aW9uIChWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIGxpdGVyYWwuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgZG9jdW1lbnQncyB1cmkuXG4gICAgICogQHBhcmFtIHZlcnNpb24gVGhlIGRvY3VtZW50J3MgdmVyc2lvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodXJpLCB2ZXJzaW9uKSB7XG4gICAgICAgIHJldHVybiB7IHVyaSwgdmVyc2lvbiB9O1xuICAgIH1cbiAgICBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXJ9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpICYmIElzLmludGVnZXIoY2FuZGlkYXRlLnZlcnNpb24pO1xuICAgIH1cbiAgICBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmlzID0gaXM7XG59KShWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIHx8IChWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyID0ge30pKTtcbi8qKlxuICogVGhlIE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXJ9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcjtcbihmdW5jdGlvbiAoT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIgbGl0ZXJhbC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSBkb2N1bWVudCdzIHVyaS5cbiAgICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgZG9jdW1lbnQncyB2ZXJzaW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmksIHZlcnNpb24pIHtcbiAgICAgICAgcmV0dXJuIHsgdXJpLCB2ZXJzaW9uIH07XG4gICAgfVxuICAgIE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllci5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXJ9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpICYmIChjYW5kaWRhdGUudmVyc2lvbiA9PT0gbnVsbCB8fCBJcy5pbnRlZ2VyKGNhbmRpZGF0ZS52ZXJzaW9uKSk7XG4gICAgfVxuICAgIE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllci5pcyA9IGlzO1xufSkoT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIHx8IChPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIgPSB7fSkpO1xuLyoqXG4gKiBUaGUgVGV4dERvY3VtZW50SXRlbSBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBUZXh0RG9jdW1lbnRJdGVtfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBUZXh0RG9jdW1lbnRJdGVtO1xuKGZ1bmN0aW9uIChUZXh0RG9jdW1lbnRJdGVtKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBUZXh0RG9jdW1lbnRJdGVtIGxpdGVyYWwuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgZG9jdW1lbnQncyB1cmkuXG4gICAgICogQHBhcmFtIGxhbmd1YWdlSWQgVGhlIGRvY3VtZW50J3MgbGFuZ3VhZ2UgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgZG9jdW1lbnQncyB2ZXJzaW9uIG51bWJlci5cbiAgICAgKiBAcGFyYW0gdGV4dCBUaGUgZG9jdW1lbnQncyB0ZXh0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmksIGxhbmd1YWdlSWQsIHZlcnNpb24sIHRleHQpIHtcbiAgICAgICAgcmV0dXJuIHsgdXJpLCBsYW5ndWFnZUlkLCB2ZXJzaW9uLCB0ZXh0IH07XG4gICAgfVxuICAgIFRleHREb2N1bWVudEl0ZW0uY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgVGV4dERvY3VtZW50SXRlbX0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5sYW5ndWFnZUlkKSAmJiBJcy5pbnRlZ2VyKGNhbmRpZGF0ZS52ZXJzaW9uKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnRleHQpO1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnRJdGVtLmlzID0gaXM7XG59KShUZXh0RG9jdW1lbnRJdGVtIHx8IChUZXh0RG9jdW1lbnRJdGVtID0ge30pKTtcbi8qKlxuICogRGVzY3JpYmVzIHRoZSBjb250ZW50IHR5cGUgdGhhdCBhIGNsaWVudCBzdXBwb3J0cyBpbiB2YXJpb3VzXG4gKiByZXN1bHQgbGl0ZXJhbHMgbGlrZSBgSG92ZXJgLCBgUGFyYW1ldGVySW5mb2Agb3IgYENvbXBsZXRpb25JdGVtYC5cbiAqXG4gKiBQbGVhc2Ugbm90ZSB0aGF0IGBNYXJrdXBLaW5kc2AgbXVzdCBub3Qgc3RhcnQgd2l0aCBhIGAkYC4gVGhpcyBraW5kc1xuICogYXJlIHJlc2VydmVkIGZvciBpbnRlcm5hbCB1c2FnZS5cbiAqL1xuZXhwb3J0IHZhciBNYXJrdXBLaW5kO1xuKGZ1bmN0aW9uIChNYXJrdXBLaW5kKSB7XG4gICAgLyoqXG4gICAgICogUGxhaW4gdGV4dCBpcyBzdXBwb3J0ZWQgYXMgYSBjb250ZW50IGZvcm1hdFxuICAgICAqL1xuICAgIE1hcmt1cEtpbmQuUGxhaW5UZXh0ID0gJ3BsYWludGV4dCc7XG4gICAgLyoqXG4gICAgICogTWFya2Rvd24gaXMgc3VwcG9ydGVkIGFzIGEgY29udGVudCBmb3JtYXRcbiAgICAgKi9cbiAgICBNYXJrdXBLaW5kLk1hcmtkb3duID0gJ21hcmtkb3duJztcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgaXMgYSB2YWx1ZSBvZiB0aGUge0BsaW5rIE1hcmt1cEtpbmR9IHR5cGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgPT09IE1hcmt1cEtpbmQuUGxhaW5UZXh0IHx8IGNhbmRpZGF0ZSA9PT0gTWFya3VwS2luZC5NYXJrZG93bjtcbiAgICB9XG4gICAgTWFya3VwS2luZC5pcyA9IGlzO1xufSkoTWFya3VwS2luZCB8fCAoTWFya3VwS2luZCA9IHt9KSk7XG5leHBvcnQgdmFyIE1hcmt1cENvbnRlbnQ7XG4oZnVuY3Rpb24gKE1hcmt1cENvbnRlbnQpIHtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgY29uZm9ybXMgdG8gdGhlIHtAbGluayBNYXJrdXBDb250ZW50fSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKHZhbHVlKSAmJiBNYXJrdXBLaW5kLmlzKGNhbmRpZGF0ZS5raW5kKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnZhbHVlKTtcbiAgICB9XG4gICAgTWFya3VwQ29udGVudC5pcyA9IGlzO1xufSkoTWFya3VwQ29udGVudCB8fCAoTWFya3VwQ29udGVudCA9IHt9KSk7XG4vKipcbiAqIFRoZSBraW5kIG9mIGEgY29tcGxldGlvbiBlbnRyeS5cbiAqL1xuZXhwb3J0IHZhciBDb21wbGV0aW9uSXRlbUtpbmQ7XG4oZnVuY3Rpb24gKENvbXBsZXRpb25JdGVtS2luZCkge1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5UZXh0ID0gMTtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuTWV0aG9kID0gMjtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuRnVuY3Rpb24gPSAzO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5Db25zdHJ1Y3RvciA9IDQ7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkZpZWxkID0gNTtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuVmFyaWFibGUgPSA2O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5DbGFzcyA9IDc7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkludGVyZmFjZSA9IDg7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLk1vZHVsZSA9IDk7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlByb3BlcnR5ID0gMTA7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlVuaXQgPSAxMTtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuVmFsdWUgPSAxMjtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuRW51bSA9IDEzO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5LZXl3b3JkID0gMTQ7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlNuaXBwZXQgPSAxNTtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuQ29sb3IgPSAxNjtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuRmlsZSA9IDE3O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5SZWZlcmVuY2UgPSAxODtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuRm9sZGVyID0gMTk7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkVudW1NZW1iZXIgPSAyMDtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuQ29uc3RhbnQgPSAyMTtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuU3RydWN0ID0gMjI7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkV2ZW50ID0gMjM7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLk9wZXJhdG9yID0gMjQ7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlR5cGVQYXJhbWV0ZXIgPSAyNTtcbn0pKENvbXBsZXRpb25JdGVtS2luZCB8fCAoQ29tcGxldGlvbkl0ZW1LaW5kID0ge30pKTtcbi8qKlxuICogRGVmaW5lcyB3aGV0aGVyIHRoZSBpbnNlcnQgdGV4dCBpbiBhIGNvbXBsZXRpb24gaXRlbSBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXNcbiAqIHBsYWluIHRleHQgb3IgYSBzbmlwcGV0LlxuICovXG5leHBvcnQgdmFyIEluc2VydFRleHRGb3JtYXQ7XG4oZnVuY3Rpb24gKEluc2VydFRleHRGb3JtYXQpIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpbWFyeSB0ZXh0IHRvIGJlIGluc2VydGVkIGlzIHRyZWF0ZWQgYXMgYSBwbGFpbiBzdHJpbmcuXG4gICAgICovXG4gICAgSW5zZXJ0VGV4dEZvcm1hdC5QbGFpblRleHQgPSAxO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcmltYXJ5IHRleHQgdG8gYmUgaW5zZXJ0ZWQgaXMgdHJlYXRlZCBhcyBhIHNuaXBwZXQuXG4gICAgICpcbiAgICAgKiBBIHNuaXBwZXQgY2FuIGRlZmluZSB0YWIgc3RvcHMgYW5kIHBsYWNlaG9sZGVycyB3aXRoIGAkMWAsIGAkMmBcbiAgICAgKiBhbmQgYCR7Mzpmb299YC4gYCQwYCBkZWZpbmVzIHRoZSBmaW5hbCB0YWIgc3RvcCwgaXQgZGVmYXVsdHMgdG9cbiAgICAgKiB0aGUgZW5kIG9mIHRoZSBzbmlwcGV0LiBQbGFjZWhvbGRlcnMgd2l0aCBlcXVhbCBpZGVudGlmaWVycyBhcmUgbGlua2VkLFxuICAgICAqIHRoYXQgaXMgdHlwaW5nIGluIG9uZSB3aWxsIHVwZGF0ZSBvdGhlcnMgdG9vLlxuICAgICAqXG4gICAgICogU2VlIGFsc286IGh0dHBzOi8vbWljcm9zb2Z0LmdpdGh1Yi5pby9sYW5ndWFnZS1zZXJ2ZXItcHJvdG9jb2wvc3BlY2lmaWNhdGlvbnMvc3BlY2lmaWNhdGlvbi1jdXJyZW50LyNzbmlwcGV0X3N5bnRheFxuICAgICAqL1xuICAgIEluc2VydFRleHRGb3JtYXQuU25pcHBldCA9IDI7XG59KShJbnNlcnRUZXh0Rm9ybWF0IHx8IChJbnNlcnRUZXh0Rm9ybWF0ID0ge30pKTtcbi8qKlxuICogQ29tcGxldGlvbiBpdGVtIHRhZ3MgYXJlIGV4dHJhIGFubm90YXRpb25zIHRoYXQgdHdlYWsgdGhlIHJlbmRlcmluZyBvZiBhIGNvbXBsZXRpb25cbiAqIGl0ZW0uXG4gKlxuICogQHNpbmNlIDMuMTUuMFxuICovXG5leHBvcnQgdmFyIENvbXBsZXRpb25JdGVtVGFnO1xuKGZ1bmN0aW9uIChDb21wbGV0aW9uSXRlbVRhZykge1xuICAgIC8qKlxuICAgICAqIFJlbmRlciBhIGNvbXBsZXRpb24gYXMgb2Jzb2xldGUsIHVzdWFsbHkgdXNpbmcgYSBzdHJpa2Utb3V0LlxuICAgICAqL1xuICAgIENvbXBsZXRpb25JdGVtVGFnLkRlcHJlY2F0ZWQgPSAxO1xufSkoQ29tcGxldGlvbkl0ZW1UYWcgfHwgKENvbXBsZXRpb25JdGVtVGFnID0ge30pKTtcbi8qKlxuICogVGhlIEluc2VydFJlcGxhY2VFZGl0IG5hbWVzcGFjZSBwcm92aWRlcyBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIGluc2VydCAvIHJlcGxhY2UgZWRpdHMuXG4gKlxuICogQHNpbmNlIDMuMTYuMFxuICovXG5leHBvcnQgdmFyIEluc2VydFJlcGxhY2VFZGl0O1xuKGZ1bmN0aW9uIChJbnNlcnRSZXBsYWNlRWRpdCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zZXJ0IC8gcmVwbGFjZSBlZGl0XG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKG5ld1RleHQsIGluc2VydCwgcmVwbGFjZSkge1xuICAgICAgICByZXR1cm4geyBuZXdUZXh0LCBpbnNlcnQsIHJlcGxhY2UgfTtcbiAgICB9XG4gICAgSW5zZXJ0UmVwbGFjZUVkaXQuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgSW5zZXJ0UmVwbGFjZUVkaXR9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLm5ld1RleHQpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5pbnNlcnQpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yZXBsYWNlKTtcbiAgICB9XG4gICAgSW5zZXJ0UmVwbGFjZUVkaXQuaXMgPSBpcztcbn0pKEluc2VydFJlcGxhY2VFZGl0IHx8IChJbnNlcnRSZXBsYWNlRWRpdCA9IHt9KSk7XG4vKipcbiAqIEhvdyB3aGl0ZXNwYWNlIGFuZCBpbmRlbnRhdGlvbiBpcyBoYW5kbGVkIGR1cmluZyBjb21wbGV0aW9uXG4gKiBpdGVtIGluc2VydGlvbi5cbiAqXG4gKiBAc2luY2UgMy4xNi4wXG4gKi9cbmV4cG9ydCB2YXIgSW5zZXJ0VGV4dE1vZGU7XG4oZnVuY3Rpb24gKEluc2VydFRleHRNb2RlKSB7XG4gICAgLyoqXG4gICAgICogVGhlIGluc2VydGlvbiBvciByZXBsYWNlIHN0cmluZ3MgaXMgdGFrZW4gYXMgaXQgaXMuIElmIHRoZVxuICAgICAqIHZhbHVlIGlzIG11bHRpIGxpbmUgdGhlIGxpbmVzIGJlbG93IHRoZSBjdXJzb3Igd2lsbCBiZVxuICAgICAqIGluc2VydGVkIHVzaW5nIHRoZSBpbmRlbnRhdGlvbiBkZWZpbmVkIGluIHRoZSBzdHJpbmcgdmFsdWUuXG4gICAgICogVGhlIGNsaWVudCB3aWxsIG5vdCBhcHBseSBhbnkga2luZCBvZiBhZGp1c3RtZW50cyB0byB0aGVcbiAgICAgKiBzdHJpbmcuXG4gICAgICovXG4gICAgSW5zZXJ0VGV4dE1vZGUuYXNJcyA9IDE7XG4gICAgLyoqXG4gICAgICogVGhlIGVkaXRvciBhZGp1c3RzIGxlYWRpbmcgd2hpdGVzcGFjZSBvZiBuZXcgbGluZXMgc28gdGhhdFxuICAgICAqIHRoZXkgbWF0Y2ggdGhlIGluZGVudGF0aW9uIHVwIHRvIHRoZSBjdXJzb3Igb2YgdGhlIGxpbmUgZm9yXG4gICAgICogd2hpY2ggdGhlIGl0ZW0gaXMgYWNjZXB0ZWQuXG4gICAgICpcbiAgICAgKiBDb25zaWRlciBhIGxpbmUgbGlrZSB0aGlzOiA8MnRhYnM+PGN1cnNvcj48M3RhYnM+Zm9vLiBBY2NlcHRpbmcgYVxuICAgICAqIG11bHRpIGxpbmUgY29tcGxldGlvbiBpdGVtIGlzIGluZGVudGVkIHVzaW5nIDIgdGFicyBhbmQgYWxsXG4gICAgICogZm9sbG93aW5nIGxpbmVzIGluc2VydGVkIHdpbGwgYmUgaW5kZW50ZWQgdXNpbmcgMiB0YWJzIGFzIHdlbGwuXG4gICAgICovXG4gICAgSW5zZXJ0VGV4dE1vZGUuYWRqdXN0SW5kZW50YXRpb24gPSAyO1xufSkoSW5zZXJ0VGV4dE1vZGUgfHwgKEluc2VydFRleHRNb2RlID0ge30pKTtcbmV4cG9ydCB2YXIgQ29tcGxldGlvbkl0ZW1MYWJlbERldGFpbHM7XG4oZnVuY3Rpb24gKENvbXBsZXRpb25JdGVtTGFiZWxEZXRhaWxzKSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgKElzLnN0cmluZyhjYW5kaWRhdGUuZGV0YWlsKSB8fCBjYW5kaWRhdGUuZGV0YWlsID09PSB1bmRlZmluZWQpICYmXG4gICAgICAgICAgICAoSXMuc3RyaW5nKGNhbmRpZGF0ZS5kZXNjcmlwdGlvbikgfHwgY2FuZGlkYXRlLmRlc2NyaXB0aW9uID09PSB1bmRlZmluZWQpO1xuICAgIH1cbiAgICBDb21wbGV0aW9uSXRlbUxhYmVsRGV0YWlscy5pcyA9IGlzO1xufSkoQ29tcGxldGlvbkl0ZW1MYWJlbERldGFpbHMgfHwgKENvbXBsZXRpb25JdGVtTGFiZWxEZXRhaWxzID0ge30pKTtcbi8qKlxuICogVGhlIENvbXBsZXRpb25JdGVtIG5hbWVzcGFjZSBwcm92aWRlcyBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoXG4gKiBjb21wbGV0aW9uIGl0ZW1zLlxuICovXG5leHBvcnQgdmFyIENvbXBsZXRpb25JdGVtO1xuKGZ1bmN0aW9uIChDb21wbGV0aW9uSXRlbSkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIGNvbXBsZXRpb24gaXRlbSBhbmQgc2VlZCBpdCB3aXRoIGEgbGFiZWwuXG4gICAgICogQHBhcmFtIGxhYmVsIFRoZSBjb21wbGV0aW9uIGl0ZW0ncyBsYWJlbFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShsYWJlbCkge1xuICAgICAgICByZXR1cm4geyBsYWJlbCB9O1xuICAgIH1cbiAgICBDb21wbGV0aW9uSXRlbS5jcmVhdGUgPSBjcmVhdGU7XG59KShDb21wbGV0aW9uSXRlbSB8fCAoQ29tcGxldGlvbkl0ZW0gPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29tcGxldGlvbkxpc3QgbmFtZXNwYWNlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGhcbiAqIGNvbXBsZXRpb24gbGlzdHMuXG4gKi9cbmV4cG9ydCB2YXIgQ29tcGxldGlvbkxpc3Q7XG4oZnVuY3Rpb24gKENvbXBsZXRpb25MaXN0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBjb21wbGV0aW9uIGxpc3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaXRlbXMgVGhlIGNvbXBsZXRpb24gaXRlbXMuXG4gICAgICogQHBhcmFtIGlzSW5jb21wbGV0ZSBUaGUgbGlzdCBpcyBub3QgY29tcGxldGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGl0ZW1zLCBpc0luY29tcGxldGUpIHtcbiAgICAgICAgcmV0dXJuIHsgaXRlbXM6IGl0ZW1zID8gaXRlbXMgOiBbXSwgaXNJbmNvbXBsZXRlOiAhIWlzSW5jb21wbGV0ZSB9O1xuICAgIH1cbiAgICBDb21wbGV0aW9uTGlzdC5jcmVhdGUgPSBjcmVhdGU7XG59KShDb21wbGV0aW9uTGlzdCB8fCAoQ29tcGxldGlvbkxpc3QgPSB7fSkpO1xuZXhwb3J0IHZhciBNYXJrZWRTdHJpbmc7XG4oZnVuY3Rpb24gKE1hcmtlZFN0cmluZykge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBtYXJrZWQgc3RyaW5nIGZyb20gcGxhaW4gdGV4dC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwbGFpblRleHQgVGhlIHBsYWluIHRleHQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZnJvbVBsYWluVGV4dChwbGFpblRleHQpIHtcbiAgICAgICAgcmV0dXJuIHBsYWluVGV4dC5yZXBsYWNlKC9bXFxcXGAqX3t9W1xcXSgpIytcXC0uIV0vZywgJ1xcXFwkJicpOyAvLyBlc2NhcGUgbWFya2Rvd24gc3ludGF4IHRva2VuczogaHR0cDovL2RhcmluZ2ZpcmViYWxsLm5ldC9wcm9qZWN0cy9tYXJrZG93bi9zeW50YXgjYmFja3NsYXNoXG4gICAgfVxuICAgIE1hcmtlZFN0cmluZy5mcm9tUGxhaW5UZXh0ID0gZnJvbVBsYWluVGV4dDtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgY29uZm9ybXMgdG8gdGhlIHtAbGluayBNYXJrZWRTdHJpbmd9IHR5cGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5zdHJpbmcoY2FuZGlkYXRlKSB8fCAoSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUubGFuZ3VhZ2UpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudmFsdWUpKTtcbiAgICB9XG4gICAgTWFya2VkU3RyaW5nLmlzID0gaXM7XG59KShNYXJrZWRTdHJpbmcgfHwgKE1hcmtlZFN0cmluZyA9IHt9KSk7XG5leHBvcnQgdmFyIEhvdmVyO1xuKGZ1bmN0aW9uIChIb3Zlcikge1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBjb25mb3JtcyB0byB0aGUge0BsaW5rIEhvdmVyfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gISFjYW5kaWRhdGUgJiYgSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIChNYXJrdXBDb250ZW50LmlzKGNhbmRpZGF0ZS5jb250ZW50cykgfHxcbiAgICAgICAgICAgIE1hcmtlZFN0cmluZy5pcyhjYW5kaWRhdGUuY29udGVudHMpIHx8XG4gICAgICAgICAgICBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS5jb250ZW50cywgTWFya2VkU3RyaW5nLmlzKSkgJiYgKHZhbHVlLnJhbmdlID09PSB1bmRlZmluZWQgfHwgUmFuZ2UuaXModmFsdWUucmFuZ2UpKTtcbiAgICB9XG4gICAgSG92ZXIuaXMgPSBpcztcbn0pKEhvdmVyIHx8IChIb3ZlciA9IHt9KSk7XG4vKipcbiAqIFRoZSBQYXJhbWV0ZXJJbmZvcm1hdGlvbiBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBQYXJhbWV0ZXJJbmZvcm1hdGlvbn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgUGFyYW1ldGVySW5mb3JtYXRpb247XG4oZnVuY3Rpb24gKFBhcmFtZXRlckluZm9ybWF0aW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBwYXJhbWV0ZXIgaW5mb3JtYXRpb24gbGl0ZXJhbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBsYWJlbCBBIGxhYmVsIHN0cmluZy5cbiAgICAgKiBAcGFyYW0gZG9jdW1lbnRhdGlvbiBBIGRvYyBzdHJpbmcuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGxhYmVsLCBkb2N1bWVudGF0aW9uKSB7XG4gICAgICAgIHJldHVybiBkb2N1bWVudGF0aW9uID8geyBsYWJlbCwgZG9jdW1lbnRhdGlvbiB9IDogeyBsYWJlbCB9O1xuICAgIH1cbiAgICBQYXJhbWV0ZXJJbmZvcm1hdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG59KShQYXJhbWV0ZXJJbmZvcm1hdGlvbiB8fCAoUGFyYW1ldGVySW5mb3JtYXRpb24gPSB7fSkpO1xuLyoqXG4gKiBUaGUgU2lnbmF0dXJlSW5mb3JtYXRpb24gbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgU2lnbmF0dXJlSW5mb3JtYXRpb259IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIFNpZ25hdHVyZUluZm9ybWF0aW9uO1xuKGZ1bmN0aW9uIChTaWduYXR1cmVJbmZvcm1hdGlvbikge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShsYWJlbCwgZG9jdW1lbnRhdGlvbiwgLi4ucGFyYW1ldGVycykge1xuICAgICAgICBsZXQgcmVzdWx0ID0geyBsYWJlbCB9O1xuICAgICAgICBpZiAoSXMuZGVmaW5lZChkb2N1bWVudGF0aW9uKSkge1xuICAgICAgICAgICAgcmVzdWx0LmRvY3VtZW50YXRpb24gPSBkb2N1bWVudGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKHBhcmFtZXRlcnMpKSB7XG4gICAgICAgICAgICByZXN1bHQucGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQucGFyYW1ldGVycyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIFNpZ25hdHVyZUluZm9ybWF0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKFNpZ25hdHVyZUluZm9ybWF0aW9uIHx8IChTaWduYXR1cmVJbmZvcm1hdGlvbiA9IHt9KSk7XG4vKipcbiAqIEEgZG9jdW1lbnQgaGlnaGxpZ2h0IGtpbmQuXG4gKi9cbmV4cG9ydCB2YXIgRG9jdW1lbnRIaWdobGlnaHRLaW5kO1xuKGZ1bmN0aW9uIChEb2N1bWVudEhpZ2hsaWdodEtpbmQpIHtcbiAgICAvKipcbiAgICAgKiBBIHRleHR1YWwgb2NjdXJyZW5jZS5cbiAgICAgKi9cbiAgICBEb2N1bWVudEhpZ2hsaWdodEtpbmQuVGV4dCA9IDE7XG4gICAgLyoqXG4gICAgICogUmVhZC1hY2Nlc3Mgb2YgYSBzeW1ib2wsIGxpa2UgcmVhZGluZyBhIHZhcmlhYmxlLlxuICAgICAqL1xuICAgIERvY3VtZW50SGlnaGxpZ2h0S2luZC5SZWFkID0gMjtcbiAgICAvKipcbiAgICAgKiBXcml0ZS1hY2Nlc3Mgb2YgYSBzeW1ib2wsIGxpa2Ugd3JpdGluZyB0byBhIHZhcmlhYmxlLlxuICAgICAqL1xuICAgIERvY3VtZW50SGlnaGxpZ2h0S2luZC5Xcml0ZSA9IDM7XG59KShEb2N1bWVudEhpZ2hsaWdodEtpbmQgfHwgKERvY3VtZW50SGlnaGxpZ2h0S2luZCA9IHt9KSk7XG4vKipcbiAqIERvY3VtZW50SGlnaGxpZ2h0IG5hbWVzcGFjZSB0byBwcm92aWRlIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgRG9jdW1lbnRIaWdobGlnaHR9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIERvY3VtZW50SGlnaGxpZ2h0O1xuKGZ1bmN0aW9uIChEb2N1bWVudEhpZ2hsaWdodCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIERvY3VtZW50SGlnaGxpZ2h0IG9iamVjdC5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlIHRoZSBoaWdobGlnaHQgYXBwbGllcyB0by5cbiAgICAgKiBAcGFyYW0ga2luZCBUaGUgaGlnaGxpZ2h0IGtpbmRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIGtpbmQpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHsgcmFuZ2UgfTtcbiAgICAgICAgaWYgKElzLm51bWJlcihraW5kKSkge1xuICAgICAgICAgICAgcmVzdWx0LmtpbmQgPSBraW5kO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIERvY3VtZW50SGlnaGxpZ2h0LmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKERvY3VtZW50SGlnaGxpZ2h0IHx8IChEb2N1bWVudEhpZ2hsaWdodCA9IHt9KSk7XG4vKipcbiAqIEEgc3ltYm9sIGtpbmQuXG4gKi9cbmV4cG9ydCB2YXIgU3ltYm9sS2luZDtcbihmdW5jdGlvbiAoU3ltYm9sS2luZCkge1xuICAgIFN5bWJvbEtpbmQuRmlsZSA9IDE7XG4gICAgU3ltYm9sS2luZC5Nb2R1bGUgPSAyO1xuICAgIFN5bWJvbEtpbmQuTmFtZXNwYWNlID0gMztcbiAgICBTeW1ib2xLaW5kLlBhY2thZ2UgPSA0O1xuICAgIFN5bWJvbEtpbmQuQ2xhc3MgPSA1O1xuICAgIFN5bWJvbEtpbmQuTWV0aG9kID0gNjtcbiAgICBTeW1ib2xLaW5kLlByb3BlcnR5ID0gNztcbiAgICBTeW1ib2xLaW5kLkZpZWxkID0gODtcbiAgICBTeW1ib2xLaW5kLkNvbnN0cnVjdG9yID0gOTtcbiAgICBTeW1ib2xLaW5kLkVudW0gPSAxMDtcbiAgICBTeW1ib2xLaW5kLkludGVyZmFjZSA9IDExO1xuICAgIFN5bWJvbEtpbmQuRnVuY3Rpb24gPSAxMjtcbiAgICBTeW1ib2xLaW5kLlZhcmlhYmxlID0gMTM7XG4gICAgU3ltYm9sS2luZC5Db25zdGFudCA9IDE0O1xuICAgIFN5bWJvbEtpbmQuU3RyaW5nID0gMTU7XG4gICAgU3ltYm9sS2luZC5OdW1iZXIgPSAxNjtcbiAgICBTeW1ib2xLaW5kLkJvb2xlYW4gPSAxNztcbiAgICBTeW1ib2xLaW5kLkFycmF5ID0gMTg7XG4gICAgU3ltYm9sS2luZC5PYmplY3QgPSAxOTtcbiAgICBTeW1ib2xLaW5kLktleSA9IDIwO1xuICAgIFN5bWJvbEtpbmQuTnVsbCA9IDIxO1xuICAgIFN5bWJvbEtpbmQuRW51bU1lbWJlciA9IDIyO1xuICAgIFN5bWJvbEtpbmQuU3RydWN0ID0gMjM7XG4gICAgU3ltYm9sS2luZC5FdmVudCA9IDI0O1xuICAgIFN5bWJvbEtpbmQuT3BlcmF0b3IgPSAyNTtcbiAgICBTeW1ib2xLaW5kLlR5cGVQYXJhbWV0ZXIgPSAyNjtcbn0pKFN5bWJvbEtpbmQgfHwgKFN5bWJvbEtpbmQgPSB7fSkpO1xuLyoqXG4gKiBTeW1ib2wgdGFncyBhcmUgZXh0cmEgYW5ub3RhdGlvbnMgdGhhdCB0d2VhayB0aGUgcmVuZGVyaW5nIG9mIGEgc3ltYm9sLlxuICpcbiAqIEBzaW5jZSAzLjE2XG4gKi9cbmV4cG9ydCB2YXIgU3ltYm9sVGFnO1xuKGZ1bmN0aW9uIChTeW1ib2xUYWcpIHtcbiAgICAvKipcbiAgICAgKiBSZW5kZXIgYSBzeW1ib2wgYXMgb2Jzb2xldGUsIHVzdWFsbHkgdXNpbmcgYSBzdHJpa2Utb3V0LlxuICAgICAqL1xuICAgIFN5bWJvbFRhZy5EZXByZWNhdGVkID0gMTtcbn0pKFN5bWJvbFRhZyB8fCAoU3ltYm9sVGFnID0ge30pKTtcbmV4cG9ydCB2YXIgU3ltYm9sSW5mb3JtYXRpb247XG4oZnVuY3Rpb24gKFN5bWJvbEluZm9ybWF0aW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBzeW1ib2wgaW5mb3JtYXRpb24gbGl0ZXJhbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIGtpbmQgVGhlIGtpbmQgb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlIG9mIHRoZSBsb2NhdGlvbiBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIHJlc291cmNlIG9mIHRoZSBsb2NhdGlvbiBvZiBzeW1ib2wuXG4gICAgICogQHBhcmFtIGNvbnRhaW5lck5hbWUgVGhlIG5hbWUgb2YgdGhlIHN5bWJvbCBjb250YWluaW5nIHRoZSBzeW1ib2wuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKG5hbWUsIGtpbmQsIHJhbmdlLCB1cmksIGNvbnRhaW5lck5hbWUpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBraW5kLFxuICAgICAgICAgICAgbG9jYXRpb246IHsgdXJpLCByYW5nZSB9XG4gICAgICAgIH07XG4gICAgICAgIGlmIChjb250YWluZXJOYW1lKSB7XG4gICAgICAgICAgICByZXN1bHQuY29udGFpbmVyTmFtZSA9IGNvbnRhaW5lck5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgU3ltYm9sSW5mb3JtYXRpb24uY3JlYXRlID0gY3JlYXRlO1xufSkoU3ltYm9sSW5mb3JtYXRpb24gfHwgKFN5bWJvbEluZm9ybWF0aW9uID0ge30pKTtcbmV4cG9ydCB2YXIgV29ya3NwYWNlU3ltYm9sO1xuKGZ1bmN0aW9uIChXb3Jrc3BhY2VTeW1ib2wpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgd29ya3NwYWNlIHN5bWJvbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIGtpbmQgVGhlIGtpbmQgb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSByZXNvdXJjZSBvZiB0aGUgbG9jYXRpb24gb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgQW4gb3B0aW9ucyByYW5nZSBvZiB0aGUgbG9jYXRpb24uXG4gICAgICogQHJldHVybnMgQSBXb3Jrc3BhY2VTeW1ib2wuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKG5hbWUsIGtpbmQsIHVyaSwgcmFuZ2UpIHtcbiAgICAgICAgcmV0dXJuIHJhbmdlICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8geyBuYW1lLCBraW5kLCBsb2NhdGlvbjogeyB1cmksIHJhbmdlIH0gfVxuICAgICAgICAgICAgOiB7IG5hbWUsIGtpbmQsIGxvY2F0aW9uOiB7IHVyaSB9IH07XG4gICAgfVxuICAgIFdvcmtzcGFjZVN5bWJvbC5jcmVhdGUgPSBjcmVhdGU7XG59KShXb3Jrc3BhY2VTeW1ib2wgfHwgKFdvcmtzcGFjZVN5bWJvbCA9IHt9KSk7XG5leHBvcnQgdmFyIERvY3VtZW50U3ltYm9sO1xuKGZ1bmN0aW9uIChEb2N1bWVudFN5bWJvbCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgc3ltYm9sIGluZm9ybWF0aW9uIGxpdGVyYWwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSBkZXRhaWwgVGhlIGRldGFpbCBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSBraW5kIFRoZSBraW5kIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSBzZWxlY3Rpb25SYW5nZSBUaGUgc2VsZWN0aW9uUmFuZ2Ugb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gY2hpbGRyZW4gQ2hpbGRyZW4gb2YgdGhlIHN5bWJvbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobmFtZSwgZGV0YWlsLCBraW5kLCByYW5nZSwgc2VsZWN0aW9uUmFuZ2UsIGNoaWxkcmVuKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgZGV0YWlsLFxuICAgICAgICAgICAga2luZCxcbiAgICAgICAgICAgIHJhbmdlLFxuICAgICAgICAgICAgc2VsZWN0aW9uUmFuZ2VcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGNoaWxkcmVuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIERvY3VtZW50U3ltYm9sLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIERvY3VtZW50U3ltYm9sfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmXG4gICAgICAgICAgICBJcy5zdHJpbmcoY2FuZGlkYXRlLm5hbWUpICYmIElzLm51bWJlcihjYW5kaWRhdGUua2luZCkgJiZcbiAgICAgICAgICAgIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnNlbGVjdGlvblJhbmdlKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5kZXRhaWwgPT09IHVuZGVmaW5lZCB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLmRldGFpbCkpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmRlcHJlY2F0ZWQgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5kZXByZWNhdGVkKSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuY2hpbGRyZW4gPT09IHVuZGVmaW5lZCB8fCBBcnJheS5pc0FycmF5KGNhbmRpZGF0ZS5jaGlsZHJlbikpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLnRhZ3MgPT09IHVuZGVmaW5lZCB8fCBBcnJheS5pc0FycmF5KGNhbmRpZGF0ZS50YWdzKSk7XG4gICAgfVxuICAgIERvY3VtZW50U3ltYm9sLmlzID0gaXM7XG59KShEb2N1bWVudFN5bWJvbCB8fCAoRG9jdW1lbnRTeW1ib2wgPSB7fSkpO1xuLyoqXG4gKiBBIHNldCBvZiBwcmVkZWZpbmVkIGNvZGUgYWN0aW9uIGtpbmRzXG4gKi9cbmV4cG9ydCB2YXIgQ29kZUFjdGlvbktpbmQ7XG4oZnVuY3Rpb24gKENvZGVBY3Rpb25LaW5kKSB7XG4gICAgLyoqXG4gICAgICogRW1wdHkga2luZC5cbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5FbXB0eSA9ICcnO1xuICAgIC8qKlxuICAgICAqIEJhc2Uga2luZCBmb3IgcXVpY2tmaXggYWN0aW9uczogJ3F1aWNrZml4J1xuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlF1aWNrRml4ID0gJ3F1aWNrZml4JztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIHJlZmFjdG9yaW5nIGFjdGlvbnM6ICdyZWZhY3RvcidcbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5SZWZhY3RvciA9ICdyZWZhY3Rvcic7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciByZWZhY3RvcmluZyBleHRyYWN0aW9uIGFjdGlvbnM6ICdyZWZhY3Rvci5leHRyYWN0J1xuICAgICAqXG4gICAgICogRXhhbXBsZSBleHRyYWN0IGFjdGlvbnM6XG4gICAgICpcbiAgICAgKiAtIEV4dHJhY3QgbWV0aG9kXG4gICAgICogLSBFeHRyYWN0IGZ1bmN0aW9uXG4gICAgICogLSBFeHRyYWN0IHZhcmlhYmxlXG4gICAgICogLSBFeHRyYWN0IGludGVyZmFjZSBmcm9tIGNsYXNzXG4gICAgICogLSAuLi5cbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5SZWZhY3RvckV4dHJhY3QgPSAncmVmYWN0b3IuZXh0cmFjdCc7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciByZWZhY3RvcmluZyBpbmxpbmUgYWN0aW9uczogJ3JlZmFjdG9yLmlubGluZSdcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgaW5saW5lIGFjdGlvbnM6XG4gICAgICpcbiAgICAgKiAtIElubGluZSBmdW5jdGlvblxuICAgICAqIC0gSW5saW5lIHZhcmlhYmxlXG4gICAgICogLSBJbmxpbmUgY29uc3RhbnRcbiAgICAgKiAtIC4uLlxuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlJlZmFjdG9ySW5saW5lID0gJ3JlZmFjdG9yLmlubGluZSc7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciByZWZhY3RvcmluZyByZXdyaXRlIGFjdGlvbnM6ICdyZWZhY3Rvci5yZXdyaXRlJ1xuICAgICAqXG4gICAgICogRXhhbXBsZSByZXdyaXRlIGFjdGlvbnM6XG4gICAgICpcbiAgICAgKiAtIENvbnZlcnQgSmF2YVNjcmlwdCBmdW5jdGlvbiB0byBjbGFzc1xuICAgICAqIC0gQWRkIG9yIHJlbW92ZSBwYXJhbWV0ZXJcbiAgICAgKiAtIEVuY2Fwc3VsYXRlIGZpZWxkXG4gICAgICogLSBNYWtlIG1ldGhvZCBzdGF0aWNcbiAgICAgKiAtIE1vdmUgbWV0aG9kIHRvIGJhc2UgY2xhc3NcbiAgICAgKiAtIC4uLlxuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlJlZmFjdG9yUmV3cml0ZSA9ICdyZWZhY3Rvci5yZXdyaXRlJztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIHNvdXJjZSBhY3Rpb25zOiBgc291cmNlYFxuICAgICAqXG4gICAgICogU291cmNlIGNvZGUgYWN0aW9ucyBhcHBseSB0byB0aGUgZW50aXJlIGZpbGUuXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuU291cmNlID0gJ3NvdXJjZSc7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciBhbiBvcmdhbml6ZSBpbXBvcnRzIHNvdXJjZSBhY3Rpb246IGBzb3VyY2Uub3JnYW5pemVJbXBvcnRzYFxuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlNvdXJjZU9yZ2FuaXplSW1wb3J0cyA9ICdzb3VyY2Uub3JnYW5pemVJbXBvcnRzJztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIGF1dG8tZml4IHNvdXJjZSBhY3Rpb25zOiBgc291cmNlLmZpeEFsbGAuXG4gICAgICpcbiAgICAgKiBGaXggYWxsIGFjdGlvbnMgYXV0b21hdGljYWxseSBmaXggZXJyb3JzIHRoYXQgaGF2ZSBhIGNsZWFyIGZpeCB0aGF0IGRvIG5vdCByZXF1aXJlIHVzZXIgaW5wdXQuXG4gICAgICogVGhleSBzaG91bGQgbm90IHN1cHByZXNzIGVycm9ycyBvciBwZXJmb3JtIHVuc2FmZSBmaXhlcyBzdWNoIGFzIGdlbmVyYXRpbmcgbmV3IHR5cGVzIG9yIGNsYXNzZXMuXG4gICAgICpcbiAgICAgKiBAc2luY2UgMy4xNS4wXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuU291cmNlRml4QWxsID0gJ3NvdXJjZS5maXhBbGwnO1xufSkoQ29kZUFjdGlvbktpbmQgfHwgKENvZGVBY3Rpb25LaW5kID0ge30pKTtcbi8qKlxuICogVGhlIHJlYXNvbiB3aHkgY29kZSBhY3Rpb25zIHdlcmUgcmVxdWVzdGVkLlxuICpcbiAqIEBzaW5jZSAzLjE3LjBcbiAqL1xuZXhwb3J0IHZhciBDb2RlQWN0aW9uVHJpZ2dlcktpbmQ7XG4oZnVuY3Rpb24gKENvZGVBY3Rpb25UcmlnZ2VyS2luZCkge1xuICAgIC8qKlxuICAgICAqIENvZGUgYWN0aW9ucyB3ZXJlIGV4cGxpY2l0bHkgcmVxdWVzdGVkIGJ5IHRoZSB1c2VyIG9yIGJ5IGFuIGV4dGVuc2lvbi5cbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uVHJpZ2dlcktpbmQuSW52b2tlZCA9IDE7XG4gICAgLyoqXG4gICAgICogQ29kZSBhY3Rpb25zIHdlcmUgcmVxdWVzdGVkIGF1dG9tYXRpY2FsbHkuXG4gICAgICpcbiAgICAgKiBUaGlzIHR5cGljYWxseSBoYXBwZW5zIHdoZW4gY3VycmVudCBzZWxlY3Rpb24gaW4gYSBmaWxlIGNoYW5nZXMsIGJ1dCBjYW5cbiAgICAgKiBhbHNvIGJlIHRyaWdnZXJlZCB3aGVuIGZpbGUgY29udGVudCBjaGFuZ2VzLlxuICAgICAqL1xuICAgIENvZGVBY3Rpb25UcmlnZ2VyS2luZC5BdXRvbWF0aWMgPSAyO1xufSkoQ29kZUFjdGlvblRyaWdnZXJLaW5kIHx8IChDb2RlQWN0aW9uVHJpZ2dlcktpbmQgPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29kZUFjdGlvbkNvbnRleHQgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgQ29kZUFjdGlvbkNvbnRleHR9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIENvZGVBY3Rpb25Db250ZXh0O1xuKGZ1bmN0aW9uIChDb2RlQWN0aW9uQ29udGV4dCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ29kZUFjdGlvbkNvbnRleHQgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUoZGlhZ25vc3RpY3MsIG9ubHksIHRyaWdnZXJLaW5kKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IGRpYWdub3N0aWNzIH07XG4gICAgICAgIGlmIChvbmx5ICE9PSB1bmRlZmluZWQgJiYgb25seSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmVzdWx0Lm9ubHkgPSBvbmx5O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmlnZ2VyS2luZCAhPT0gdW5kZWZpbmVkICYmIHRyaWdnZXJLaW5kICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXN1bHQudHJpZ2dlcktpbmQgPSB0cmlnZ2VyS2luZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBDb2RlQWN0aW9uQ29udGV4dC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBDb2RlQWN0aW9uQ29udGV4dH0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS5kaWFnbm9zdGljcywgRGlhZ25vc3RpYy5pcylcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUub25seSA9PT0gdW5kZWZpbmVkIHx8IElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLm9ubHksIElzLnN0cmluZykpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLnRyaWdnZXJLaW5kID09PSB1bmRlZmluZWQgfHwgY2FuZGlkYXRlLnRyaWdnZXJLaW5kID09PSBDb2RlQWN0aW9uVHJpZ2dlcktpbmQuSW52b2tlZCB8fCBjYW5kaWRhdGUudHJpZ2dlcktpbmQgPT09IENvZGVBY3Rpb25UcmlnZ2VyS2luZC5BdXRvbWF0aWMpO1xuICAgIH1cbiAgICBDb2RlQWN0aW9uQ29udGV4dC5pcyA9IGlzO1xufSkoQ29kZUFjdGlvbkNvbnRleHQgfHwgKENvZGVBY3Rpb25Db250ZXh0ID0ge30pKTtcbmV4cG9ydCB2YXIgQ29kZUFjdGlvbjtcbihmdW5jdGlvbiAoQ29kZUFjdGlvbikge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh0aXRsZSwga2luZE9yQ29tbWFuZE9yRWRpdCwga2luZCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0geyB0aXRsZSB9O1xuICAgICAgICBsZXQgY2hlY2tLaW5kID0gdHJ1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBraW5kT3JDb21tYW5kT3JFZGl0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY2hlY2tLaW5kID0gZmFsc2U7XG4gICAgICAgICAgICByZXN1bHQua2luZCA9IGtpbmRPckNvbW1hbmRPckVkaXQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoQ29tbWFuZC5pcyhraW5kT3JDb21tYW5kT3JFZGl0KSkge1xuICAgICAgICAgICAgcmVzdWx0LmNvbW1hbmQgPSBraW5kT3JDb21tYW5kT3JFZGl0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0LmVkaXQgPSBraW5kT3JDb21tYW5kT3JFZGl0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGVja0tpbmQgJiYga2luZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQua2luZCA9IGtpbmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgQ29kZUFjdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLnN0cmluZyhjYW5kaWRhdGUudGl0bGUpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmRpYWdub3N0aWNzID09PSB1bmRlZmluZWQgfHwgSXMudHlwZWRBcnJheShjYW5kaWRhdGUuZGlhZ25vc3RpY3MsIERpYWdub3N0aWMuaXMpKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5raW5kID09PSB1bmRlZmluZWQgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS5raW5kKSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuZWRpdCAhPT0gdW5kZWZpbmVkIHx8IGNhbmRpZGF0ZS5jb21tYW5kICE9PSB1bmRlZmluZWQpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmNvbW1hbmQgPT09IHVuZGVmaW5lZCB8fCBDb21tYW5kLmlzKGNhbmRpZGF0ZS5jb21tYW5kKSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuaXNQcmVmZXJyZWQgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5pc1ByZWZlcnJlZCkpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmVkaXQgPT09IHVuZGVmaW5lZCB8fCBXb3Jrc3BhY2VFZGl0LmlzKGNhbmRpZGF0ZS5lZGl0KSk7XG4gICAgfVxuICAgIENvZGVBY3Rpb24uaXMgPSBpcztcbn0pKENvZGVBY3Rpb24gfHwgKENvZGVBY3Rpb24gPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29kZUxlbnMgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgQ29kZUxlbnN9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIENvZGVMZW5zO1xuKGZ1bmN0aW9uIChDb2RlTGVucykge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ29kZUxlbnMgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIGRhdGEpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHsgcmFuZ2UgfTtcbiAgICAgICAgaWYgKElzLmRlZmluZWQoZGF0YSkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5kYXRhID0gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBDb2RlTGVucy5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBDb2RlTGVuc30gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLmNvbW1hbmQpIHx8IENvbW1hbmQuaXMoY2FuZGlkYXRlLmNvbW1hbmQpKTtcbiAgICB9XG4gICAgQ29kZUxlbnMuaXMgPSBpcztcbn0pKENvZGVMZW5zIHx8IChDb2RlTGVucyA9IHt9KSk7XG4vKipcbiAqIFRoZSBGb3JtYXR0aW5nT3B0aW9ucyBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBGb3JtYXR0aW5nT3B0aW9uc30gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgRm9ybWF0dGluZ09wdGlvbnM7XG4oZnVuY3Rpb24gKEZvcm1hdHRpbmdPcHRpb25zKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBGb3JtYXR0aW5nT3B0aW9ucyBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh0YWJTaXplLCBpbnNlcnRTcGFjZXMpIHtcbiAgICAgICAgcmV0dXJuIHsgdGFiU2l6ZSwgaW5zZXJ0U3BhY2VzIH07XG4gICAgfVxuICAgIEZvcm1hdHRpbmdPcHRpb25zLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIEZvcm1hdHRpbmdPcHRpb25zfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS50YWJTaXplKSAmJiBJcy5ib29sZWFuKGNhbmRpZGF0ZS5pbnNlcnRTcGFjZXMpO1xuICAgIH1cbiAgICBGb3JtYXR0aW5nT3B0aW9ucy5pcyA9IGlzO1xufSkoRm9ybWF0dGluZ09wdGlvbnMgfHwgKEZvcm1hdHRpbmdPcHRpb25zID0ge30pKTtcbi8qKlxuICogVGhlIERvY3VtZW50TGluayBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBEb2N1bWVudExpbmt9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIERvY3VtZW50TGluaztcbihmdW5jdGlvbiAoRG9jdW1lbnRMaW5rKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBEb2N1bWVudExpbmsgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIHRhcmdldCwgZGF0YSkge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgdGFyZ2V0LCBkYXRhIH07XG4gICAgfVxuICAgIERvY3VtZW50TGluay5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBEb2N1bWVudExpbmt9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS50YXJnZXQpIHx8IElzLnN0cmluZyhjYW5kaWRhdGUudGFyZ2V0KSk7XG4gICAgfVxuICAgIERvY3VtZW50TGluay5pcyA9IGlzO1xufSkoRG9jdW1lbnRMaW5rIHx8IChEb2N1bWVudExpbmsgPSB7fSkpO1xuLyoqXG4gKiBUaGUgU2VsZWN0aW9uUmFuZ2UgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbiB0byB3b3JrIHdpdGhcbiAqIFNlbGVjdGlvblJhbmdlIGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIFNlbGVjdGlvblJhbmdlO1xuKGZ1bmN0aW9uIChTZWxlY3Rpb25SYW5nZSkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgU2VsZWN0aW9uUmFuZ2VcbiAgICAgKiBAcGFyYW0gcmFuZ2UgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSBwYXJlbnQgYW4gb3B0aW9uYWwgcGFyZW50LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgcGFyZW50KSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCBwYXJlbnQgfTtcbiAgICB9XG4gICAgU2VsZWN0aW9uUmFuZ2UuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIChjYW5kaWRhdGUucGFyZW50ID09PSB1bmRlZmluZWQgfHwgU2VsZWN0aW9uUmFuZ2UuaXMoY2FuZGlkYXRlLnBhcmVudCkpO1xuICAgIH1cbiAgICBTZWxlY3Rpb25SYW5nZS5pcyA9IGlzO1xufSkoU2VsZWN0aW9uUmFuZ2UgfHwgKFNlbGVjdGlvblJhbmdlID0ge30pKTtcbi8qKlxuICogQSBzZXQgb2YgcHJlZGVmaW5lZCB0b2tlbiB0eXBlcy4gVGhpcyBzZXQgaXMgbm90IGZpeGVkXG4gKiBhbiBjbGllbnRzIGNhbiBzcGVjaWZ5IGFkZGl0aW9uYWwgdG9rZW4gdHlwZXMgdmlhIHRoZVxuICogY29ycmVzcG9uZGluZyBjbGllbnQgY2FwYWJpbGl0aWVzLlxuICpcbiAqIEBzaW5jZSAzLjE2LjBcbiAqL1xuZXhwb3J0IHZhciBTZW1hbnRpY1Rva2VuVHlwZXM7XG4oZnVuY3Rpb24gKFNlbWFudGljVG9rZW5UeXBlcykge1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcIm5hbWVzcGFjZVwiXSA9IFwibmFtZXNwYWNlXCI7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIGdlbmVyaWMgdHlwZS4gQWN0cyBhcyBhIGZhbGxiYWNrIGZvciB0eXBlcyB3aGljaCBjYW4ndCBiZSBtYXBwZWQgdG9cbiAgICAgKiBhIHNwZWNpZmljIHR5cGUgbGlrZSBjbGFzcyBvciBlbnVtLlxuICAgICAqL1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInR5cGVcIl0gPSBcInR5cGVcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJjbGFzc1wiXSA9IFwiY2xhc3NcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJlbnVtXCJdID0gXCJlbnVtXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wiaW50ZXJmYWNlXCJdID0gXCJpbnRlcmZhY2VcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJzdHJ1Y3RcIl0gPSBcInN0cnVjdFwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInR5cGVQYXJhbWV0ZXJcIl0gPSBcInR5cGVQYXJhbWV0ZXJcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJwYXJhbWV0ZXJcIl0gPSBcInBhcmFtZXRlclwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInZhcmlhYmxlXCJdID0gXCJ2YXJpYWJsZVwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInByb3BlcnR5XCJdID0gXCJwcm9wZXJ0eVwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImVudW1NZW1iZXJcIl0gPSBcImVudW1NZW1iZXJcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJldmVudFwiXSA9IFwiZXZlbnRcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJmdW5jdGlvblwiXSA9IFwiZnVuY3Rpb25cIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJtZXRob2RcIl0gPSBcIm1ldGhvZFwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcIm1hY3JvXCJdID0gXCJtYWNyb1wiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImtleXdvcmRcIl0gPSBcImtleXdvcmRcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJtb2RpZmllclwiXSA9IFwibW9kaWZpZXJcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJjb21tZW50XCJdID0gXCJjb21tZW50XCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wic3RyaW5nXCJdID0gXCJzdHJpbmdcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJudW1iZXJcIl0gPSBcIm51bWJlclwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInJlZ2V4cFwiXSA9IFwicmVnZXhwXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wib3BlcmF0b3JcIl0gPSBcIm9wZXJhdG9yXCI7XG4gICAgLyoqXG4gICAgICogQHNpbmNlIDMuMTcuMFxuICAgICAqL1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImRlY29yYXRvclwiXSA9IFwiZGVjb3JhdG9yXCI7XG59KShTZW1hbnRpY1Rva2VuVHlwZXMgfHwgKFNlbWFudGljVG9rZW5UeXBlcyA9IHt9KSk7XG4vKipcbiAqIEEgc2V0IG9mIHByZWRlZmluZWQgdG9rZW4gbW9kaWZpZXJzLiBUaGlzIHNldCBpcyBub3QgZml4ZWRcbiAqIGFuIGNsaWVudHMgY2FuIHNwZWNpZnkgYWRkaXRpb25hbCB0b2tlbiB0eXBlcyB2aWEgdGhlXG4gKiBjb3JyZXNwb25kaW5nIGNsaWVudCBjYXBhYmlsaXRpZXMuXG4gKlxuICogQHNpbmNlIDMuMTYuMFxuICovXG5leHBvcnQgdmFyIFNlbWFudGljVG9rZW5Nb2RpZmllcnM7XG4oZnVuY3Rpb24gKFNlbWFudGljVG9rZW5Nb2RpZmllcnMpIHtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wiZGVjbGFyYXRpb25cIl0gPSBcImRlY2xhcmF0aW9uXCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcImRlZmluaXRpb25cIl0gPSBcImRlZmluaXRpb25cIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wicmVhZG9ubHlcIl0gPSBcInJlYWRvbmx5XCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcInN0YXRpY1wiXSA9IFwic3RhdGljXCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcImRlcHJlY2F0ZWRcIl0gPSBcImRlcHJlY2F0ZWRcIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wiYWJzdHJhY3RcIl0gPSBcImFic3RyYWN0XCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcImFzeW5jXCJdID0gXCJhc3luY1wiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJtb2RpZmljYXRpb25cIl0gPSBcIm1vZGlmaWNhdGlvblwiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJkb2N1bWVudGF0aW9uXCJdID0gXCJkb2N1bWVudGF0aW9uXCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcImRlZmF1bHRMaWJyYXJ5XCJdID0gXCJkZWZhdWx0TGlicmFyeVwiO1xufSkoU2VtYW50aWNUb2tlbk1vZGlmaWVycyB8fCAoU2VtYW50aWNUb2tlbk1vZGlmaWVycyA9IHt9KSk7XG4vKipcbiAqIEBzaW5jZSAzLjE2LjBcbiAqL1xuZXhwb3J0IHZhciBTZW1hbnRpY1Rva2VucztcbihmdW5jdGlvbiAoU2VtYW50aWNUb2tlbnMpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiAoY2FuZGlkYXRlLnJlc3VsdElkID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIGNhbmRpZGF0ZS5yZXN1bHRJZCA9PT0gJ3N0cmluZycpICYmXG4gICAgICAgICAgICBBcnJheS5pc0FycmF5KGNhbmRpZGF0ZS5kYXRhKSAmJiAoY2FuZGlkYXRlLmRhdGEubGVuZ3RoID09PSAwIHx8IHR5cGVvZiBjYW5kaWRhdGUuZGF0YVswXSA9PT0gJ251bWJlcicpO1xuICAgIH1cbiAgICBTZW1hbnRpY1Rva2Vucy5pcyA9IGlzO1xufSkoU2VtYW50aWNUb2tlbnMgfHwgKFNlbWFudGljVG9rZW5zID0ge30pKTtcbi8qKlxuICogVGhlIElubGluZVZhbHVlVGV4dCBuYW1lc3BhY2UgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCBJbmxpbmVWYWx1ZVRleHRzLlxuICpcbiAqIEBzaW5jZSAzLjE3LjBcbiAqL1xuZXhwb3J0IHZhciBJbmxpbmVWYWx1ZVRleHQ7XG4oZnVuY3Rpb24gKElubGluZVZhbHVlVGV4dCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgSW5saW5lVmFsdWVUZXh0IGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCB0ZXh0KSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCB0ZXh0IH07XG4gICAgfVxuICAgIElubGluZVZhbHVlVGV4dC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgIT09IHVuZGVmaW5lZCAmJiBjYW5kaWRhdGUgIT09IG51bGwgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnRleHQpO1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZVRleHQuaXMgPSBpcztcbn0pKElubGluZVZhbHVlVGV4dCB8fCAoSW5saW5lVmFsdWVUZXh0ID0ge30pKTtcbi8qKlxuICogVGhlIElubGluZVZhbHVlVmFyaWFibGVMb29rdXAgbmFtZXNwYWNlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGggSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cHMuXG4gKlxuICogQHNpbmNlIDMuMTcuMFxuICovXG5leHBvcnQgdmFyIElubGluZVZhbHVlVmFyaWFibGVMb29rdXA7XG4oZnVuY3Rpb24gKElubGluZVZhbHVlVmFyaWFibGVMb29rdXApIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IElubGluZVZhbHVlVGV4dCBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgdmFyaWFibGVOYW1lLCBjYXNlU2Vuc2l0aXZlTG9va3VwKSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCB2YXJpYWJsZU5hbWUsIGNhc2VTZW5zaXRpdmVMb29rdXAgfTtcbiAgICB9XG4gICAgSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgIT09IHVuZGVmaW5lZCAmJiBjYW5kaWRhdGUgIT09IG51bGwgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiBJcy5ib29sZWFuKGNhbmRpZGF0ZS5jYXNlU2Vuc2l0aXZlTG9va3VwKVxuICAgICAgICAgICAgJiYgKElzLnN0cmluZyhjYW5kaWRhdGUudmFyaWFibGVOYW1lKSB8fCBjYW5kaWRhdGUudmFyaWFibGVOYW1lID09PSB1bmRlZmluZWQpO1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwLmlzID0gaXM7XG59KShJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwIHx8IChJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwID0ge30pKTtcbi8qKlxuICogVGhlIElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uIG5hbWVzcGFjZSBwcm92aWRlcyBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uLlxuICpcbiAqIEBzaW5jZSAzLjE3LjBcbiAqL1xuZXhwb3J0IHZhciBJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbjtcbihmdW5jdGlvbiAoSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCBleHByZXNzaW9uKSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCBleHByZXNzaW9uIH07XG4gICAgfVxuICAgIElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAhPT0gdW5kZWZpbmVkICYmIGNhbmRpZGF0ZSAhPT0gbnVsbCAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpXG4gICAgICAgICAgICAmJiAoSXMuc3RyaW5nKGNhbmRpZGF0ZS5leHByZXNzaW9uKSB8fCBjYW5kaWRhdGUuZXhwcmVzc2lvbiA9PT0gdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24uaXMgPSBpcztcbn0pKElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uIHx8IChJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBJbmxpbmVWYWx1ZUNvbnRleHQgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgSW5saW5lVmFsdWVDb250ZXh0fSBsaXRlcmFscy5cbiAqXG4gKiBAc2luY2UgMy4xNy4wXG4gKi9cbmV4cG9ydCB2YXIgSW5saW5lVmFsdWVDb250ZXh0O1xuKGZ1bmN0aW9uIChJbmxpbmVWYWx1ZUNvbnRleHQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IElubGluZVZhbHVlQ29udGV4dCBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShmcmFtZUlkLCBzdG9wcGVkTG9jYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHsgZnJhbWVJZCwgc3RvcHBlZExvY2F0aW9uIH07XG4gICAgfVxuICAgIElubGluZVZhbHVlQ29udGV4dC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBJbmxpbmVWYWx1ZUNvbnRleHR9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyh2YWx1ZS5zdG9wcGVkTG9jYXRpb24pO1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZUNvbnRleHQuaXMgPSBpcztcbn0pKElubGluZVZhbHVlQ29udGV4dCB8fCAoSW5saW5lVmFsdWVDb250ZXh0ID0ge30pKTtcbi8qKlxuICogSW5sYXkgaGludCBraW5kcy5cbiAqXG4gKiBAc2luY2UgMy4xNy4wXG4gKi9cbmV4cG9ydCB2YXIgSW5sYXlIaW50S2luZDtcbihmdW5jdGlvbiAoSW5sYXlIaW50S2luZCkge1xuICAgIC8qKlxuICAgICAqIEFuIGlubGF5IGhpbnQgdGhhdCBmb3IgYSB0eXBlIGFubm90YXRpb24uXG4gICAgICovXG4gICAgSW5sYXlIaW50S2luZC5UeXBlID0gMTtcbiAgICAvKipcbiAgICAgKiBBbiBpbmxheSBoaW50IHRoYXQgaXMgZm9yIGEgcGFyYW1ldGVyLlxuICAgICAqL1xuICAgIElubGF5SGludEtpbmQuUGFyYW1ldGVyID0gMjtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWUgPT09IDEgfHwgdmFsdWUgPT09IDI7XG4gICAgfVxuICAgIElubGF5SGludEtpbmQuaXMgPSBpcztcbn0pKElubGF5SGludEtpbmQgfHwgKElubGF5SGludEtpbmQgPSB7fSkpO1xuZXhwb3J0IHZhciBJbmxheUhpbnRMYWJlbFBhcnQ7XG4oZnVuY3Rpb24gKElubGF5SGludExhYmVsUGFydCkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh2YWx1ZSkge1xuICAgICAgICByZXR1cm4geyB2YWx1ZSB9O1xuICAgIH1cbiAgICBJbmxheUhpbnRMYWJlbFBhcnQuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLnRvb2x0aXAgPT09IHVuZGVmaW5lZCB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLnRvb2x0aXApIHx8IE1hcmt1cENvbnRlbnQuaXMoY2FuZGlkYXRlLnRvb2x0aXApKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS5sb2NhdGlvbiA9PT0gdW5kZWZpbmVkIHx8IExvY2F0aW9uLmlzKGNhbmRpZGF0ZS5sb2NhdGlvbikpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLmNvbW1hbmQgPT09IHVuZGVmaW5lZCB8fCBDb21tYW5kLmlzKGNhbmRpZGF0ZS5jb21tYW5kKSk7XG4gICAgfVxuICAgIElubGF5SGludExhYmVsUGFydC5pcyA9IGlzO1xufSkoSW5sYXlIaW50TGFiZWxQYXJ0IHx8IChJbmxheUhpbnRMYWJlbFBhcnQgPSB7fSkpO1xuZXhwb3J0IHZhciBJbmxheUhpbnQ7XG4oZnVuY3Rpb24gKElubGF5SGludCkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShwb3NpdGlvbiwgbGFiZWwsIGtpbmQpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0geyBwb3NpdGlvbiwgbGFiZWwgfTtcbiAgICAgICAgaWYgKGtpbmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmtpbmQgPSBraW5kO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIElubGF5SGludC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgUG9zaXRpb24uaXMoY2FuZGlkYXRlLnBvc2l0aW9uKVxuICAgICAgICAgICAgJiYgKElzLnN0cmluZyhjYW5kaWRhdGUubGFiZWwpIHx8IElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLmxhYmVsLCBJbmxheUhpbnRMYWJlbFBhcnQuaXMpKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS5raW5kID09PSB1bmRlZmluZWQgfHwgSW5sYXlIaW50S2luZC5pcyhjYW5kaWRhdGUua2luZCkpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLnRleHRFZGl0cyA9PT0gdW5kZWZpbmVkKSB8fCBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS50ZXh0RWRpdHMsIFRleHRFZGl0LmlzKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS50b29sdGlwID09PSB1bmRlZmluZWQgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS50b29sdGlwKSB8fCBNYXJrdXBDb250ZW50LmlzKGNhbmRpZGF0ZS50b29sdGlwKSlcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUucGFkZGluZ0xlZnQgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5wYWRkaW5nTGVmdCkpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLnBhZGRpbmdSaWdodCA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLnBhZGRpbmdSaWdodCkpO1xuICAgIH1cbiAgICBJbmxheUhpbnQuaXMgPSBpcztcbn0pKElubGF5SGludCB8fCAoSW5sYXlIaW50ID0ge30pKTtcbmV4cG9ydCB2YXIgU3RyaW5nVmFsdWU7XG4oZnVuY3Rpb24gKFN0cmluZ1ZhbHVlKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlU25pcHBldCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4geyBraW5kOiAnc25pcHBldCcsIHZhbHVlIH07XG4gICAgfVxuICAgIFN0cmluZ1ZhbHVlLmNyZWF0ZVNuaXBwZXQgPSBjcmVhdGVTbmlwcGV0O1xufSkoU3RyaW5nVmFsdWUgfHwgKFN0cmluZ1ZhbHVlID0ge30pKTtcbmV4cG9ydCB2YXIgSW5saW5lQ29tcGxldGlvbkl0ZW07XG4oZnVuY3Rpb24gKElubGluZUNvbXBsZXRpb25JdGVtKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKGluc2VydFRleHQsIGZpbHRlclRleHQsIHJhbmdlLCBjb21tYW5kKSB7XG4gICAgICAgIHJldHVybiB7IGluc2VydFRleHQsIGZpbHRlclRleHQsIHJhbmdlLCBjb21tYW5kIH07XG4gICAgfVxuICAgIElubGluZUNvbXBsZXRpb25JdGVtLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKElubGluZUNvbXBsZXRpb25JdGVtIHx8IChJbmxpbmVDb21wbGV0aW9uSXRlbSA9IHt9KSk7XG5leHBvcnQgdmFyIElubGluZUNvbXBsZXRpb25MaXN0O1xuKGZ1bmN0aW9uIChJbmxpbmVDb21wbGV0aW9uTGlzdCkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShpdGVtcykge1xuICAgICAgICByZXR1cm4geyBpdGVtcyB9O1xuICAgIH1cbiAgICBJbmxpbmVDb21wbGV0aW9uTGlzdC5jcmVhdGUgPSBjcmVhdGU7XG59KShJbmxpbmVDb21wbGV0aW9uTGlzdCB8fCAoSW5saW5lQ29tcGxldGlvbkxpc3QgPSB7fSkpO1xuLyoqXG4gKiBEZXNjcmliZXMgaG93IGFuIHtAbGluayBJbmxpbmVDb21wbGV0aW9uSXRlbVByb3ZpZGVyIGlubGluZSBjb21wbGV0aW9uIHByb3ZpZGVyfSB3YXMgdHJpZ2dlcmVkLlxuICpcbiAqIEBzaW5jZSAzLjE4LjBcbiAqIEBwcm9wb3NlZFxuICovXG5leHBvcnQgdmFyIElubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZDtcbihmdW5jdGlvbiAoSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kKSB7XG4gICAgLyoqXG4gICAgICogQ29tcGxldGlvbiB3YXMgdHJpZ2dlcmVkIGV4cGxpY2l0bHkgYnkgYSB1c2VyIGdlc3R1cmUuXG4gICAgICovXG4gICAgSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kLkludm9rZWQgPSAwO1xuICAgIC8qKlxuICAgICAqIENvbXBsZXRpb24gd2FzIHRyaWdnZXJlZCBhdXRvbWF0aWNhbGx5IHdoaWxlIGVkaXRpbmcuXG4gICAgICovXG4gICAgSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kLkF1dG9tYXRpYyA9IDE7XG59KShJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmQgfHwgKElubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZCA9IHt9KSk7XG5leHBvcnQgdmFyIFNlbGVjdGVkQ29tcGxldGlvbkluZm87XG4oZnVuY3Rpb24gKFNlbGVjdGVkQ29tcGxldGlvbkluZm8pIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIHRleHQpIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIHRleHQgfTtcbiAgICB9XG4gICAgU2VsZWN0ZWRDb21wbGV0aW9uSW5mby5jcmVhdGUgPSBjcmVhdGU7XG59KShTZWxlY3RlZENvbXBsZXRpb25JbmZvIHx8IChTZWxlY3RlZENvbXBsZXRpb25JbmZvID0ge30pKTtcbmV4cG9ydCB2YXIgSW5saW5lQ29tcGxldGlvbkNvbnRleHQ7XG4oZnVuY3Rpb24gKElubGluZUNvbXBsZXRpb25Db250ZXh0KSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKHRyaWdnZXJLaW5kLCBzZWxlY3RlZENvbXBsZXRpb25JbmZvKSB7XG4gICAgICAgIHJldHVybiB7IHRyaWdnZXJLaW5kLCBzZWxlY3RlZENvbXBsZXRpb25JbmZvIH07XG4gICAgfVxuICAgIElubGluZUNvbXBsZXRpb25Db250ZXh0LmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKElubGluZUNvbXBsZXRpb25Db250ZXh0IHx8IChJbmxpbmVDb21wbGV0aW9uQ29udGV4dCA9IHt9KSk7XG5leHBvcnQgdmFyIFdvcmtzcGFjZUZvbGRlcjtcbihmdW5jdGlvbiAoV29ya3NwYWNlRm9sZGVyKSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgVVJJLmlzKGNhbmRpZGF0ZS51cmkpICYmIElzLnN0cmluZyhjYW5kaWRhdGUubmFtZSk7XG4gICAgfVxuICAgIFdvcmtzcGFjZUZvbGRlci5pcyA9IGlzO1xufSkoV29ya3NwYWNlRm9sZGVyIHx8IChXb3Jrc3BhY2VGb2xkZXIgPSB7fSkpO1xuZXhwb3J0IGNvbnN0IEVPTCA9IFsnXFxuJywgJ1xcclxcbicsICdcXHInXTtcbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHRoZSB0ZXh0IGRvY3VtZW50IGZyb20gdGhlIG5ldyB2c2NvZGUtbGFuZ3VhZ2VzZXJ2ZXItdGV4dGRvY3VtZW50IHBhY2thZ2UuXG4gKi9cbmV4cG9ydCB2YXIgVGV4dERvY3VtZW50O1xuKGZ1bmN0aW9uIChUZXh0RG9jdW1lbnQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IElUZXh0RG9jdW1lbnQgbGl0ZXJhbCBmcm9tIHRoZSBnaXZlbiB1cmkgYW5kIGNvbnRlbnQuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgZG9jdW1lbnQncyB1cmkuXG4gICAgICogQHBhcmFtIGxhbmd1YWdlSWQgVGhlIGRvY3VtZW50J3MgbGFuZ3VhZ2UgSWQuXG4gICAgICogQHBhcmFtIHZlcnNpb24gVGhlIGRvY3VtZW50J3MgdmVyc2lvbi5cbiAgICAgKiBAcGFyYW0gY29udGVudCBUaGUgZG9jdW1lbnQncyBjb250ZW50LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmksIGxhbmd1YWdlSWQsIHZlcnNpb24sIGNvbnRlbnQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGdWxsVGV4dERvY3VtZW50KHVyaSwgbGFuZ3VhZ2VJZCwgdmVyc2lvbiwgY29udGVudCk7XG4gICAgfVxuICAgIFRleHREb2N1bWVudC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBJVGV4dERvY3VtZW50fSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudXJpKSAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5sYW5ndWFnZUlkKSB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLmxhbmd1YWdlSWQpKSAmJiBJcy51aW50ZWdlcihjYW5kaWRhdGUubGluZUNvdW50KVxuICAgICAgICAgICAgJiYgSXMuZnVuYyhjYW5kaWRhdGUuZ2V0VGV4dCkgJiYgSXMuZnVuYyhjYW5kaWRhdGUucG9zaXRpb25BdCkgJiYgSXMuZnVuYyhjYW5kaWRhdGUub2Zmc2V0QXQpID8gdHJ1ZSA6IGZhbHNlO1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnQuaXMgPSBpcztcbiAgICBmdW5jdGlvbiBhcHBseUVkaXRzKGRvY3VtZW50LCBlZGl0cykge1xuICAgICAgICBsZXQgdGV4dCA9IGRvY3VtZW50LmdldFRleHQoKTtcbiAgICAgICAgbGV0IHNvcnRlZEVkaXRzID0gbWVyZ2VTb3J0KGVkaXRzLCAoYSwgYikgPT4ge1xuICAgICAgICAgICAgbGV0IGRpZmYgPSBhLnJhbmdlLnN0YXJ0LmxpbmUgLSBiLnJhbmdlLnN0YXJ0LmxpbmU7XG4gICAgICAgICAgICBpZiAoZGlmZiA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhLnJhbmdlLnN0YXJ0LmNoYXJhY3RlciAtIGIucmFuZ2Uuc3RhcnQuY2hhcmFjdGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRpZmY7XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgbGFzdE1vZGlmaWVkT2Zmc2V0ID0gdGV4dC5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGkgPSBzb3J0ZWRFZGl0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgbGV0IGUgPSBzb3J0ZWRFZGl0c1tpXTtcbiAgICAgICAgICAgIGxldCBzdGFydE9mZnNldCA9IGRvY3VtZW50Lm9mZnNldEF0KGUucmFuZ2Uuc3RhcnQpO1xuICAgICAgICAgICAgbGV0IGVuZE9mZnNldCA9IGRvY3VtZW50Lm9mZnNldEF0KGUucmFuZ2UuZW5kKTtcbiAgICAgICAgICAgIGlmIChlbmRPZmZzZXQgPD0gbGFzdE1vZGlmaWVkT2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIHN0YXJ0T2Zmc2V0KSArIGUubmV3VGV4dCArIHRleHQuc3Vic3RyaW5nKGVuZE9mZnNldCwgdGV4dC5sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdPdmVybGFwcGluZyBlZGl0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsYXN0TW9kaWZpZWRPZmZzZXQgPSBzdGFydE9mZnNldDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50LmFwcGx5RWRpdHMgPSBhcHBseUVkaXRzO1xuICAgIGZ1bmN0aW9uIG1lcmdlU29ydChkYXRhLCBjb21wYXJlKSB7XG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCA8PSAxKSB7XG4gICAgICAgICAgICAvLyBzb3J0ZWRcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHAgPSAoZGF0YS5sZW5ndGggLyAyKSB8IDA7XG4gICAgICAgIGNvbnN0IGxlZnQgPSBkYXRhLnNsaWNlKDAsIHApO1xuICAgICAgICBjb25zdCByaWdodCA9IGRhdGEuc2xpY2UocCk7XG4gICAgICAgIG1lcmdlU29ydChsZWZ0LCBjb21wYXJlKTtcbiAgICAgICAgbWVyZ2VTb3J0KHJpZ2h0LCBjb21wYXJlKTtcbiAgICAgICAgbGV0IGxlZnRJZHggPSAwO1xuICAgICAgICBsZXQgcmlnaHRJZHggPSAwO1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIHdoaWxlIChsZWZ0SWR4IDwgbGVmdC5sZW5ndGggJiYgcmlnaHRJZHggPCByaWdodC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCByZXQgPSBjb21wYXJlKGxlZnRbbGVmdElkeF0sIHJpZ2h0W3JpZ2h0SWR4XSk7XG4gICAgICAgICAgICBpZiAocmV0IDw9IDApIHtcbiAgICAgICAgICAgICAgICAvLyBzbWFsbGVyX2VxdWFsIC0+IHRha2UgbGVmdCB0byBwcmVzZXJ2ZSBvcmRlclxuICAgICAgICAgICAgICAgIGRhdGFbaSsrXSA9IGxlZnRbbGVmdElkeCsrXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGdyZWF0ZXIgLT4gdGFrZSByaWdodFxuICAgICAgICAgICAgICAgIGRhdGFbaSsrXSA9IHJpZ2h0W3JpZ2h0SWR4KytdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChsZWZ0SWR4IDwgbGVmdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRhdGFbaSsrXSA9IGxlZnRbbGVmdElkeCsrXTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAocmlnaHRJZHggPCByaWdodC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRhdGFbaSsrXSA9IHJpZ2h0W3JpZ2h0SWR4KytdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbn0pKFRleHREb2N1bWVudCB8fCAoVGV4dERvY3VtZW50ID0ge30pKTtcbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHRoZSB0ZXh0IGRvY3VtZW50IGZyb20gdGhlIG5ldyB2c2NvZGUtbGFuZ3VhZ2VzZXJ2ZXItdGV4dGRvY3VtZW50IHBhY2thZ2UuXG4gKi9cbmNsYXNzIEZ1bGxUZXh0RG9jdW1lbnQge1xuICAgIGNvbnN0cnVjdG9yKHVyaSwgbGFuZ3VhZ2VJZCwgdmVyc2lvbiwgY29udGVudCkge1xuICAgICAgICB0aGlzLl91cmkgPSB1cmk7XG4gICAgICAgIHRoaXMuX2xhbmd1YWdlSWQgPSBsYW5ndWFnZUlkO1xuICAgICAgICB0aGlzLl92ZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgICAgdGhpcy5fY29udGVudCA9IGNvbnRlbnQ7XG4gICAgICAgIHRoaXMuX2xpbmVPZmZzZXRzID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBnZXQgdXJpKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdXJpO1xuICAgIH1cbiAgICBnZXQgbGFuZ3VhZ2VJZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhbmd1YWdlSWQ7XG4gICAgfVxuICAgIGdldCB2ZXJzaW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmVyc2lvbjtcbiAgICB9XG4gICAgZ2V0VGV4dChyYW5nZSkge1xuICAgICAgICBpZiAocmFuZ2UpIHtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IHRoaXMub2Zmc2V0QXQocmFuZ2Uuc3RhcnQpO1xuICAgICAgICAgICAgbGV0IGVuZCA9IHRoaXMub2Zmc2V0QXQocmFuZ2UuZW5kKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb250ZW50LnN1YnN0cmluZyhzdGFydCwgZW5kKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fY29udGVudDtcbiAgICB9XG4gICAgdXBkYXRlKGV2ZW50LCB2ZXJzaW9uKSB7XG4gICAgICAgIHRoaXMuX2NvbnRlbnQgPSBldmVudC50ZXh0O1xuICAgICAgICB0aGlzLl92ZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgICAgdGhpcy5fbGluZU9mZnNldHMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGdldExpbmVPZmZzZXRzKCkge1xuICAgICAgICBpZiAodGhpcy5fbGluZU9mZnNldHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbGV0IGxpbmVPZmZzZXRzID0gW107XG4gICAgICAgICAgICBsZXQgdGV4dCA9IHRoaXMuX2NvbnRlbnQ7XG4gICAgICAgICAgICBsZXQgaXNMaW5lU3RhcnQgPSB0cnVlO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzTGluZVN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgIGxpbmVPZmZzZXRzLnB1c2goaSk7XG4gICAgICAgICAgICAgICAgICAgIGlzTGluZVN0YXJ0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBjaCA9IHRleHQuY2hhckF0KGkpO1xuICAgICAgICAgICAgICAgIGlzTGluZVN0YXJ0ID0gKGNoID09PSAnXFxyJyB8fCBjaCA9PT0gJ1xcbicpO1xuICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ1xccicgJiYgaSArIDEgPCB0ZXh0Lmxlbmd0aCAmJiB0ZXh0LmNoYXJBdChpICsgMSkgPT09ICdcXG4nKSB7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNMaW5lU3RhcnQgJiYgdGV4dC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGluZU9mZnNldHMucHVzaCh0ZXh0Lmxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9saW5lT2Zmc2V0cyA9IGxpbmVPZmZzZXRzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9saW5lT2Zmc2V0cztcbiAgICB9XG4gICAgcG9zaXRpb25BdChvZmZzZXQpIHtcbiAgICAgICAgb2Zmc2V0ID0gTWF0aC5tYXgoTWF0aC5taW4ob2Zmc2V0LCB0aGlzLl9jb250ZW50Lmxlbmd0aCksIDApO1xuICAgICAgICBsZXQgbGluZU9mZnNldHMgPSB0aGlzLmdldExpbmVPZmZzZXRzKCk7XG4gICAgICAgIGxldCBsb3cgPSAwLCBoaWdoID0gbGluZU9mZnNldHMubGVuZ3RoO1xuICAgICAgICBpZiAoaGlnaCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFBvc2l0aW9uLmNyZWF0ZSgwLCBvZmZzZXQpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgICAgICAgICBsZXQgbWlkID0gTWF0aC5mbG9vcigobG93ICsgaGlnaCkgLyAyKTtcbiAgICAgICAgICAgIGlmIChsaW5lT2Zmc2V0c1ttaWRdID4gb2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgaGlnaCA9IG1pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvdyA9IG1pZCArIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gbG93IGlzIHRoZSBsZWFzdCB4IGZvciB3aGljaCB0aGUgbGluZSBvZmZzZXQgaXMgbGFyZ2VyIHRoYW4gdGhlIGN1cnJlbnQgb2Zmc2V0XG4gICAgICAgIC8vIG9yIGFycmF5Lmxlbmd0aCBpZiBubyBsaW5lIG9mZnNldCBpcyBsYXJnZXIgdGhhbiB0aGUgY3VycmVudCBvZmZzZXRcbiAgICAgICAgbGV0IGxpbmUgPSBsb3cgLSAxO1xuICAgICAgICByZXR1cm4gUG9zaXRpb24uY3JlYXRlKGxpbmUsIG9mZnNldCAtIGxpbmVPZmZzZXRzW2xpbmVdKTtcbiAgICB9XG4gICAgb2Zmc2V0QXQocG9zaXRpb24pIHtcbiAgICAgICAgbGV0IGxpbmVPZmZzZXRzID0gdGhpcy5nZXRMaW5lT2Zmc2V0cygpO1xuICAgICAgICBpZiAocG9zaXRpb24ubGluZSA+PSBsaW5lT2Zmc2V0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb250ZW50Lmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwb3NpdGlvbi5saW5lIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGxpbmVPZmZzZXQgPSBsaW5lT2Zmc2V0c1twb3NpdGlvbi5saW5lXTtcbiAgICAgICAgbGV0IG5leHRMaW5lT2Zmc2V0ID0gKHBvc2l0aW9uLmxpbmUgKyAxIDwgbGluZU9mZnNldHMubGVuZ3RoKSA/IGxpbmVPZmZzZXRzW3Bvc2l0aW9uLmxpbmUgKyAxXSA6IHRoaXMuX2NvbnRlbnQubGVuZ3RoO1xuICAgICAgICByZXR1cm4gTWF0aC5tYXgoTWF0aC5taW4obGluZU9mZnNldCArIHBvc2l0aW9uLmNoYXJhY3RlciwgbmV4dExpbmVPZmZzZXQpLCBsaW5lT2Zmc2V0KTtcbiAgICB9XG4gICAgZ2V0IGxpbmVDb3VudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TGluZU9mZnNldHMoKS5sZW5ndGg7XG4gICAgfVxufVxudmFyIElzO1xuKGZ1bmN0aW9uIChJcykge1xuICAgIGNvbnN0IHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbiAgICBmdW5jdGlvbiBkZWZpbmVkKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnO1xuICAgIH1cbiAgICBJcy5kZWZpbmVkID0gZGVmaW5lZDtcbiAgICBmdW5jdGlvbiB1bmRlZmluZWQodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCc7XG4gICAgfVxuICAgIElzLnVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBmdW5jdGlvbiBib29sZWFuKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gZmFsc2U7XG4gICAgfVxuICAgIElzLmJvb2xlYW4gPSBib29sZWFuO1xuICAgIGZ1bmN0aW9uIHN0cmluZyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IFN0cmluZ10nO1xuICAgIH1cbiAgICBJcy5zdHJpbmcgPSBzdHJpbmc7XG4gICAgZnVuY3Rpb24gbnVtYmVyKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgTnVtYmVyXSc7XG4gICAgfVxuICAgIElzLm51bWJlciA9IG51bWJlcjtcbiAgICBmdW5jdGlvbiBudW1iZXJSYW5nZSh2YWx1ZSwgbWluLCBtYXgpIHtcbiAgICAgICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBOdW1iZXJdJyAmJiBtaW4gPD0gdmFsdWUgJiYgdmFsdWUgPD0gbWF4O1xuICAgIH1cbiAgICBJcy5udW1iZXJSYW5nZSA9IG51bWJlclJhbmdlO1xuICAgIGZ1bmN0aW9uIGludGVnZXIodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBOdW1iZXJdJyAmJiAtMjE0NzQ4MzY0OCA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSAyMTQ3NDgzNjQ3O1xuICAgIH1cbiAgICBJcy5pbnRlZ2VyID0gaW50ZWdlcjtcbiAgICBmdW5jdGlvbiB1aW50ZWdlcih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IE51bWJlcl0nICYmIDAgPD0gdmFsdWUgJiYgdmFsdWUgPD0gMjE0NzQ4MzY0NztcbiAgICB9XG4gICAgSXMudWludGVnZXIgPSB1aW50ZWdlcjtcbiAgICBmdW5jdGlvbiBmdW5jKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbiAgICB9XG4gICAgSXMuZnVuYyA9IGZ1bmM7XG4gICAgZnVuY3Rpb24gb2JqZWN0TGl0ZXJhbCh2YWx1ZSkge1xuICAgICAgICAvLyBTdHJpY3RseSBzcGVha2luZyBjbGFzcyBpbnN0YW5jZXMgcGFzcyB0aGlzIGNoZWNrIGFzIHdlbGwuIFNpbmNlIHRoZSBMU1BcbiAgICAgICAgLy8gZG9lc24ndCB1c2UgY2xhc3NlcyB3ZSBpZ25vcmUgdGhpcyBmb3Igbm93LiBJZiB3ZSBkbyB3ZSBuZWVkIHRvIGFkZCBzb21ldGhpbmdcbiAgICAgICAgLy8gbGlrZSB0aGlzOiBgT2JqZWN0LmdldFByb3RvdHlwZU9mKE9iamVjdC5nZXRQcm90b3R5cGVPZih4KSkgPT09IG51bGxgXG4gICAgICAgIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnO1xuICAgIH1cbiAgICBJcy5vYmplY3RMaXRlcmFsID0gb2JqZWN0TGl0ZXJhbDtcbiAgICBmdW5jdGlvbiB0eXBlZEFycmF5KHZhbHVlLCBjaGVjaykge1xuICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUuZXZlcnkoY2hlY2spO1xuICAgIH1cbiAgICBJcy50eXBlZEFycmF5ID0gdHlwZWRBcnJheTtcbn0pKElzIHx8IChJcyA9IHt9KSk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFLQSxhQUFPLGVBQWUsU0FBUyxjQUFjLEVBQUUsT0FBTyxL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QUs7QUFBQSxRQUN4Qyx5QkFBeUIsRUFBRSxTQUFTLEtBQUs7QUFBQSxNQUM3QztBQUFBLElBQ0o7QUFBQSxFQUNKOyIsCiAgIm5hbWVzIjogWyJFcnJvckNvZGVzIiwgIk1lc3NhZ2UiLCAiVG91Y2giLCAiRGlzcG9zYWJsZSIsICJSQUwiLCAiRXZlbnQiLCAiSXMiLCAiQ2FuY2VsbGF0aW9uVG9rZW4iLCAiQ2FuY2VsbGF0aW9uU3RhdGUiLCAiX2Nvbm4iLCAiSXMiLCAiTWVzc2FnZVJlYWRlciIsICJBYnN0cmFjdE1lc3NhZ2VSZWFkZXIiLCAiUmVzb2x2ZWRNZXNzYWdlUmVhZGVyT3B0aW9ucyIsICJJcyIsICJNZXNzYWdlV3JpdGVyIiwgIkFic3RyYWN0TWVzc2FnZVdyaXRlciIsICJSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zIiwgInJlc3VsdCIsICJJcyIsICJDYW5jZWxOb3RpZmljYXRpb24iLCAiUHJvZ3Jlc3NUb2tlbiIsICJQcm9ncmVzc05vdGlmaWNhdGlvbiIsICJTdGFyUmVxdWVzdEhhbmRsZXIiLCAiVHJhY2UiLCAiVHJhY2VWYWx1ZXMiLCAiVHJhY2VGb3JtYXQiLCAiU2V0VHJhY2VOb3RpZmljYXRpb24iLCAiTG9nVHJhY2VOb3RpZmljYXRpb24iLCAiQ29ubmVjdGlvbkVycm9ycyIsICJDb25uZWN0aW9uU3RyYXRlZ3kiLCAiSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5IiwgIlJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5IiwgIkNhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kiLCAiQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kiLCAiQ2FuY2VsbGF0aW9uU3RyYXRlZ3kiLCAiTWVzc2FnZVN0cmF0ZWd5IiwgIkNvbm5lY3Rpb25PcHRpb25zIiwgIkNvbm5lY3Rpb25TdGF0ZSIsICJjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiIsICJzdGFydFRpbWUiLCAiUklMIiwgIm0iLCAiZXhwb3J0cyIsICJjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiIsICJpbXBvcnRfdnNjb2RlX2pzb25ycGMiLCAiaW1wb3J0X3ZzY29kZV9qc29ucnBjIiwgImltcG9ydF92c2NvZGVfanNvbnJwYyIsICJpbXBvcnRfdnNjb2RlX2pzb25ycGMiLCAiRG9jdW1lbnRVcmkiLCAiVVJJIiwgImludGVnZXIiLCAidWludGVnZXIiLCAiUG9zaXRpb24iLCAiUmFuZ2UiLCAiTG9jYXRpb24iLCAiTG9jYXRpb25MaW5rIiwgIkNvbG9yIiwgIkNvbG9ySW5mb3JtYXRpb24iLCAiQ29sb3JQcmVzZW50YXRpb24iLCAiRm9sZGluZ1JhbmdlS2luZCIsICJGb2xkaW5nUmFuZ2UiLCAiRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbiIsICJsb2NhdGlvbiIsICJEaWFnbm9zdGljU2V2ZXJpdHkiLCAiRGlhZ25vc3RpY1RhZyIsICJDb2RlRGVzY3JpcHRpb24iLCAiRGlhZ25vc3RpYyIsICJDb21tYW5kIiwgIlRleHRFZGl0IiwgIkNoYW5nZUFubm90YXRpb24iLCAiQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIiLCAiQW5ub3RhdGVkVGV4dEVkaXQiLCAiVGV4dERvY3VtZW50RWRpdCIsICJDcmVhdGVGaWxlIiwgIlJlbmFtZUZpbGUiLCAiRGVsZXRlRmlsZSIsICJXb3Jrc3BhY2VFZGl0IiwgIlRleHREb2N1bWVudElkZW50aWZpZXIiLCAiVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciIsICJPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIiLCAiVGV4dERvY3VtZW50SXRlbSIsICJNYXJrdXBLaW5kIiwgIk1hcmt1cENvbnRlbnQiLCAiQ29tcGxldGlvbkl0ZW1LaW5kIiwgIkluc2VydFRleHRGb3JtYXQiLCAiQ29tcGxldGlvbkl0ZW1UYWciLCAiSW5zZXJ0UmVwbGFjZUVkaXQiLCAiUmFuZ2UiLCAiSW5zZXJ0VGV4dE1vZGUiLCAiQ29tcGxldGlvbkl0ZW1MYWJlbERldGFpbHMiLCAiQ29tcGxldGlvbkl0ZW0iLCAiQ29tcGxldGlvbkxpc3QiLCAiTWFya2VkU3RyaW5nIiwgIkhvdmVyIiwgIlBhcmFtZXRlckluZm9ybWF0aW9uIiwgIlNpZ25hdHVyZUluZm9ybWF0aW9uIiwgIkRvY3VtZW50SGlnaGxpZ2h0S2luZCIsICJEb2N1bWVudEhpZ2hsaWdodCIsICJTeW1ib2xLaW5kIiwgIlN5bWJvbFRhZyIsICJTeW1ib2xJbmZvcm1hdGlvbiIsICJXb3Jrc3BhY2VTeW1ib2wiLCAiRG9jdW1lbnRTeW1ib2wiLCAiQ29kZUFjdGlvbktpbmQiLCAiQ29kZUFjdGlvblRyaWdnZXJLaW5kIiwgIkNvZGVBY3Rpb25Db250ZXh0IiwgIkNvZGVBY3Rpb24iLCAiQ29kZUxlbnMiLCAiRm9ybWF0dGluZ09wdGlvbnMiLCAiRG9jdW1lbnRMaW5rIiwgIlNlbGVjdGlvblJhbmdlIiwgIlNlbWFudGljVG9rZW5UeXBlcyIsICJTZW1hbnRpY1Rva2VuTW9kaWZpZXJzIiwgIlNlbWFudGljVG9rZW5zIiwgIklubGluZVZhbHVlVGV4dCIsICJJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwIiwgIklubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uIiwgIklubGluZVZhbHVlQ29udGV4dCIsICJJbmxheUhpbnRLaW5kIiwgIklubGF5SGludExhYmVsUGFydCIsICJJbmxheUhpbnQiLCAiUG9zaXRpb24iLCAiU3RyaW5nVmFsdWUiLCAiSW5saW5lQ29tcGxldGlvbkl0ZW0iLCAiSW5saW5lQ29tcGxldGlvbkxpc3QiLCAiSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kIiwgIlNlbGVjdGVkQ29tcGxldGlvbkluZm8iLCAiSW5saW5lQ29tcGxldGlvbkNvbnRleHQiLCAiV29ya3NwYWNlRm9sZGVyIiwgIlRleHREb2N1bWVudCIsICJQb3NpdGlvbiIsICJJcyIsICJ1bmRlZmluZWQiLCAiaW50ZWdlciIsICJ1aW50ZWdlciIsICJtIl0KfQo= diff --git a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/lsp/java-lsp-client.ts b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/lsp/java-lsp-client.ts index 01115c3e5ac..5e68d1b70e7 100644 --- a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/lsp/java-lsp-client.ts +++ b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/lsp/java-lsp-client.ts @@ -1232,6 +1232,8 @@ function jdtlsSettings() { completion: { overwrite: true, guessMethodArguments: false, + // Cap results so import/type completion over the large platform classpath stays snappy. + maxResults: 50, filteredTypes: [ 'com.sun.*', 'sun.*', 'jdk.*', 'org.eclipse.jdt.internal.*', diff --git a/components/ui/view-projects/src/main/resources/META-INF/dirigible/view-projects/js/projects.js b/components/ui/view-projects/src/main/resources/META-INF/dirigible/view-projects/js/projects.js index de2e5d9c665..22bd55555cb 100644 --- a/components/ui/view-projects/src/main/resources/META-INF/dirigible/view-projects/js/projects.js +++ b/components/ui/view-projects/src/main/resources/META-INF/dirigible/view-projects/js/projects.js @@ -2173,9 +2173,22 @@ projectsView.controller('ProjectsViewController', ( } }); - // A Java refactor (e.g. renaming a class via F2) renames files on disk; refresh the tree so the - // renamed file shows up instead of the stale one. - Workspace.onFileRenamed(() => { + // A Java refactor (e.g. renaming a class/interface via F2) renames files on disk. Rename the matching + // tree node in place so it stays revealed and selected; fall back to a reload if it isn't loaded yet. + Workspace.onFileRenamed((data) => { + if (!data || !data.oldPath || !data.newPath) return; + const instance = jstreeWidget.jstree(true); + const newName = data.newPath.substring(data.newPath.lastIndexOf('/') + 1); + for (let item in instance._model.data) { + if (item !== '#' && instance._model.data[item].data && instance._model.data[item].data.path === data.oldPath) { + instance.rename_node(item, newName); + instance._model.data[item].data.path = data.newPath; + instance.set_icon(item, getFileIcon(newName)); + instance.deselect_all(true); + instance.select_node(item); + return; + } + } $scope.$evalAsync(() => { $scope.reloadWorkspace(); }); }); From e84ebf9edd589950d50acc7eb9fb41d169090e51 Mon Sep 17 00:00:00 2001 From: Iliyan Velichkov Date: Tue, 23 Jun 2026 16:56:16 +0300 Subject: [PATCH 11/14] feat(editor): surface refactor assists via the lightbulb (assign parameter to field) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Set the Monaco code-action lightbulb to "on" so it appears whenever any code action is available at the cursor — not only on diagnostics. This surfaces JDT.LS refactor assists like "Assign parameter to new field" / "Assign all parameters to new fields" (kind refactor.assign.field) on a constructor parameter, plus Extract Method/Variable/ Constant/Field, as a visible suggestion instead of being hidden behind Refactor…. The assist itself already flowed through the existing code-action provider. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../resources/META-INF/dirigible/editor-monaco/js/editor.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/editor.js b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/editor.js index 3f3db5198af..8b05d0f7bb3 100644 --- a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/editor.js +++ b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/editor.js @@ -725,6 +725,9 @@ class DirigibleEditor { minimap: { autohide: DirigibleEditor.isMinimapAutohideEnabled(), }, + // Show the code-action lightbulb whenever any action (incl. refactor assists like + // "Assign parameter to new field", Extract, ...) is available, not just on diagnostics. + lightbulb: { enabled: 'on' }, }; if (TypeScriptUtils.isTypeScriptFile(fileName)) { // @ts-ignore From e768c87258b74b6c2b53503a45bf1abba79d04b5 Mon Sep 17 00:00:00 2001 From: Iliyan Velichkov Date: Tue, 23 Jun 2026 19:13:41 +0300 Subject: [PATCH 12/14] =?UTF-8?q?perf(editor):=20cut=20Java=20LSP=20load?= =?UTF-8?q?=20=E2=80=94=20code-action=20triggerKind,=20no=20reference=20Co?= =?UTF-8?q?deLens?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Java editor had become slow to "enable" features on a fresh project and sluggish while typing. Two avoidable load sources, on top of JDT.LS's inherent cold-start indexing of the large platform classpath: - Code-action requests omitted triggerKind, so JDT.LS computed the full set of quick assists/refactorings on every passive-lightbulb evaluation (every cursor move). Now we forward Monaco's trigger (Invoke=1/Auto=2, 1:1 with the LSP kind): the passive lightbulb computes only quick-fixes (cheap); full assists/refactorings only on explicit Ctrl+. / Refactor…. - references/implementations CodeLens ran a reference search for every declaration on open and on every edit — the heaviest always-on provider. Disabled by default. - Reverted the eager `lightbulb: 'on'` (its purpose was to surface refactor assists in the passive bulb, which we instead keep on the explicit Refactor… surface). Refactor assists like "Assign parameter to new field" / Extract remain available via Refactor… (Ctrl+Shift+R). Co-Authored-By: Claude Opus 4.8 (1M context) --- .../META-INF/dirigible/editor-monaco/js/editor.js | 3 --- .../dirigible/editor-monaco/js/java-lsp-client.js | 13 +++++++++---- .../editor-monaco/js/lsp/java-lsp-client.ts | 11 ++++++++--- 3 files changed, 17 insertions(+), 10 deletions(-) diff --git a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/editor.js b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/editor.js index 8b05d0f7bb3..3f3db5198af 100644 --- a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/editor.js +++ b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/editor.js @@ -725,9 +725,6 @@ class DirigibleEditor { minimap: { autohide: DirigibleEditor.isMinimapAutohideEnabled(), }, - // Show the code-action lightbulb whenever any action (incl. refactor assists like - // "Assign parameter to new field", Extract, ...) is available, not just on diagnostics. - lightbulb: { enabled: 'on' }, }; if (TypeScriptUtils.isTypeScriptFile(fileName)) { // @ts-ignore diff --git a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/java-lsp-client.js b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/java-lsp-client.js index fdf3c8ed72a..e441e28fac7 100644 --- a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/java-lsp-client.js +++ b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/java-lsp-client.js @@ -4895,7 +4895,10 @@ ${JSON.stringify(message, null, 4)}`); const result = await _conn.sendRequest("textDocument/codeAction", { textDocument: { uri: model.uri.toString() }, range: lspRange, - context: { diagnostics, only: context.only ? [context.only] : void 0 } + // Monaco's CodeActionTriggerType (Invoke=1, Auto=2) maps 1:1 to the LSP trigger kind. + // Forwarding it lets JDT.LS compute only quick-fixes for the passive lightbulb (cheap) + // and the full assists/refactorings only on explicit Ctrl+. / Refactor… (Invoked). + context: { diagnostics, only: context.only ? [context.only] : void 0, triggerKind: context.trigger } }); if (!result?.length) return empty; return { @@ -5571,11 +5574,13 @@ ${JSON.stringify(message, null, 4)}`); format: { enabled: true }, saveActions: { organizeImports: false }, inlayHints: { parameterNames: { enabled: "all" } }, - referencesCodeLens: { enabled: true }, - implementationsCodeLens: { enabled: true } + // Off by default: the reference/implementation search behind these CodeLenses runs for every + // declaration on open and on every edit and dominates JDT.LS load on a large classpath. + referencesCodeLens: { enabled: false }, + implementationsCodeLens: { enabled: false } } }; } return __toCommonJS(java_lsp_client_exports); })(); -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvY29tbW9uL2lzLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlcy5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vbGlua2VkTWFwLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9kaXNwb3NhYmxlLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9yYWwuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvY29tbW9uL2V2ZW50cy5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vY2FuY2VsbGF0aW9uLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9zaGFyZWRBcnJheUNhbmNlbGxhdGlvbi5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vc2VtYXBob3JlLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlUmVhZGVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlV3JpdGVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlQnVmZmVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9jb25uZWN0aW9uLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9hcGkuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvYnJvd3Nlci9yaWwuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvYnJvd3Nlci9tYWluLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvYnJvd3Nlci5qcyIsICJsc3AvamF2YS1sc3AtY2xpZW50LnRzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLXdzLWpzb25ycGMvc3JjL2Rpc3Bvc2FibGUudHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvc29ja2V0L3NvY2tldC50cyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS13cy1qc29ucnBjL3NyYy9zb2NrZXQvcmVhZGVyLnRzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLXdzLWpzb25ycGMvc3JjL3NvY2tldC93cml0ZXIudHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvc29ja2V0L2Nvbm5lY3Rpb24udHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvY29ubmVjdGlvbi50cyIsICJsc3AvbW9uYWNvLXNoaW0udHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtbGFuZ3VhZ2VzZXJ2ZXItdHlwZXMvbGliL2VzbS9tYWluLmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuc3RyaW5nQXJyYXkgPSBleHBvcnRzLmFycmF5ID0gZXhwb3J0cy5mdW5jID0gZXhwb3J0cy5lcnJvciA9IGV4cG9ydHMubnVtYmVyID0gZXhwb3J0cy5zdHJpbmcgPSBleHBvcnRzLmJvb2xlYW4gPSB2b2lkIDA7XG5mdW5jdGlvbiBib29sZWFuKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZTtcbn1cbmV4cG9ydHMuYm9vbGVhbiA9IGJvb2xlYW47XG5mdW5jdGlvbiBzdHJpbmcodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZztcbn1cbmV4cG9ydHMuc3RyaW5nID0gc3RyaW5nO1xuZnVuY3Rpb24gbnVtYmVyKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdmFsdWUgaW5zdGFuY2VvZiBOdW1iZXI7XG59XG5leHBvcnRzLm51bWJlciA9IG51bWJlcjtcbmZ1bmN0aW9uIGVycm9yKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgRXJyb3I7XG59XG5leHBvcnRzLmVycm9yID0gZXJyb3I7XG5mdW5jdGlvbiBmdW5jKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cbmV4cG9ydHMuZnVuYyA9IGZ1bmM7XG5mdW5jdGlvbiBhcnJheSh2YWx1ZSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cbmV4cG9ydHMuYXJyYXkgPSBhcnJheTtcbmZ1bmN0aW9uIHN0cmluZ0FycmF5KHZhbHVlKSB7XG4gICAgcmV0dXJuIGFycmF5KHZhbHVlKSAmJiB2YWx1ZS5ldmVyeShlbGVtID0+IHN0cmluZyhlbGVtKSk7XG59XG5leHBvcnRzLnN0cmluZ0FycmF5ID0gc3RyaW5nQXJyYXk7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLk1lc3NhZ2UgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU5ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlOCA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTcgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU2ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNSA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTQgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUzID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMiA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTEgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUwID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTkgPSBleHBvcnRzLlJlcXVlc3RUeXBlOCA9IGV4cG9ydHMuUmVxdWVzdFR5cGU3ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTYgPSBleHBvcnRzLlJlcXVlc3RUeXBlNSA9IGV4cG9ydHMuUmVxdWVzdFR5cGU0ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTMgPSBleHBvcnRzLlJlcXVlc3RUeXBlMiA9IGV4cG9ydHMuUmVxdWVzdFR5cGUxID0gZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IGV4cG9ydHMuUmVxdWVzdFR5cGUwID0gZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUgPSBleHBvcnRzLlBhcmFtZXRlclN0cnVjdHVyZXMgPSBleHBvcnRzLlJlc3BvbnNlRXJyb3IgPSBleHBvcnRzLkVycm9yQ29kZXMgPSB2b2lkIDA7XG5jb25zdCBpcyA9IHJlcXVpcmUoXCIuL2lzXCIpO1xuLyoqXG4gKiBQcmVkZWZpbmVkIGVycm9yIGNvZGVzLlxuICovXG52YXIgRXJyb3JDb2RlcztcbihmdW5jdGlvbiAoRXJyb3JDb2Rlcykge1xuICAgIC8vIERlZmluZWQgYnkgSlNPTiBSUENcbiAgICBFcnJvckNvZGVzLlBhcnNlRXJyb3IgPSAtMzI3MDA7XG4gICAgRXJyb3JDb2Rlcy5JbnZhbGlkUmVxdWVzdCA9IC0zMjYwMDtcbiAgICBFcnJvckNvZGVzLk1ldGhvZE5vdEZvdW5kID0gLTMyNjAxO1xuICAgIEVycm9yQ29kZXMuSW52YWxpZFBhcmFtcyA9IC0zMjYwMjtcbiAgICBFcnJvckNvZGVzLkludGVybmFsRXJyb3IgPSAtMzI2MDM7XG4gICAgLyoqXG4gICAgICogVGhpcyBpcyB0aGUgc3RhcnQgcmFuZ2Ugb2YgSlNPTiBSUEMgcmVzZXJ2ZWQgZXJyb3IgY29kZXMuXG4gICAgICogSXQgZG9lc24ndCBkZW5vdGUgYSByZWFsIGVycm9yIGNvZGUuIE5vIGFwcGxpY2F0aW9uIGVycm9yIGNvZGVzIHNob3VsZFxuICAgICAqIGJlIGRlZmluZWQgYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCByYW5nZS4gRm9yIGJhY2t3YXJkc1xuICAgICAqIGNvbXBhdGliaWxpdHkgdGhlIGBTZXJ2ZXJOb3RJbml0aWFsaXplZGAgYW5kIHRoZSBgVW5rbm93bkVycm9yQ29kZWBcbiAgICAgKiBhcmUgbGVmdCBpbiB0aGUgcmFuZ2UuXG4gICAgICpcbiAgICAgKiBAc2luY2UgMy4xNi4wXG4gICAgKi9cbiAgICBFcnJvckNvZGVzLmpzb25ycGNSZXNlcnZlZEVycm9yUmFuZ2VTdGFydCA9IC0zMjA5OTtcbiAgICAvKiogQGRlcHJlY2F0ZWQgdXNlICBqc29ucnBjUmVzZXJ2ZWRFcnJvclJhbmdlU3RhcnQgKi9cbiAgICBFcnJvckNvZGVzLnNlcnZlckVycm9yU3RhcnQgPSAtMzIwOTk7XG4gICAgLyoqXG4gICAgICogQW4gZXJyb3Igb2NjdXJyZWQgd2hlbiB3cml0ZSBhIG1lc3NhZ2UgdG8gdGhlIHRyYW5zcG9ydCBsYXllci5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLk1lc3NhZ2VXcml0ZUVycm9yID0gLTMyMDk5O1xuICAgIC8qKlxuICAgICAqIEFuIGVycm9yIG9jY3VycmVkIHdoZW4gcmVhZGluZyBhIG1lc3NhZ2UgZnJvbSB0aGUgdHJhbnNwb3J0IGxheWVyLlxuICAgICAqL1xuICAgIEVycm9yQ29kZXMuTWVzc2FnZVJlYWRFcnJvciA9IC0zMjA5ODtcbiAgICAvKipcbiAgICAgKiBUaGUgY29ubmVjdGlvbiBnb3QgZGlzcG9zZWQgb3IgbG9zdCBhbmQgYWxsIHBlbmRpbmcgcmVzcG9uc2VzIGdvdFxuICAgICAqIHJlamVjdGVkLlxuICAgICAqL1xuICAgIEVycm9yQ29kZXMuUGVuZGluZ1Jlc3BvbnNlUmVqZWN0ZWQgPSAtMzIwOTc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gaXMgaW5hY3RpdmUgYW5kIGEgdXNlIG9mIGl0IGZhaWxlZC5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLkNvbm5lY3Rpb25JbmFjdGl2ZSA9IC0zMjA5NjtcbiAgICAvKipcbiAgICAgKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBhIHNlcnZlciByZWNlaXZlZCBhIG5vdGlmaWNhdGlvbiBvclxuICAgICAqIHJlcXVlc3QgYmVmb3JlIHRoZSBzZXJ2ZXIgaGFzIHJlY2VpdmVkIHRoZSBgaW5pdGlhbGl6ZWAgcmVxdWVzdC5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLlNlcnZlck5vdEluaXRpYWxpemVkID0gLTMyMDAyO1xuICAgIEVycm9yQ29kZXMuVW5rbm93bkVycm9yQ29kZSA9IC0zMjAwMTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIHRoZSBlbmQgcmFuZ2Ugb2YgSlNPTiBSUEMgcmVzZXJ2ZWQgZXJyb3IgY29kZXMuXG4gICAgICogSXQgZG9lc24ndCBkZW5vdGUgYSByZWFsIGVycm9yIGNvZGUuXG4gICAgICpcbiAgICAgKiBAc2luY2UgMy4xNi4wXG4gICAgKi9cbiAgICBFcnJvckNvZGVzLmpzb25ycGNSZXNlcnZlZEVycm9yUmFuZ2VFbmQgPSAtMzIwMDA7XG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSAganNvbnJwY1Jlc2VydmVkRXJyb3JSYW5nZUVuZCAqL1xuICAgIEVycm9yQ29kZXMuc2VydmVyRXJyb3JFbmQgPSAtMzIwMDA7XG59KShFcnJvckNvZGVzIHx8IChleHBvcnRzLkVycm9yQ29kZXMgPSBFcnJvckNvZGVzID0ge30pKTtcbi8qKlxuICogQW4gZXJyb3Igb2JqZWN0IHJldHVybiBpbiBhIHJlc3BvbnNlIGluIGNhc2UgYSByZXF1ZXN0XG4gKiBoYXMgZmFpbGVkLlxuICovXG5jbGFzcyBSZXNwb25zZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNvZGUsIG1lc3NhZ2UsIGRhdGEpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuY29kZSA9IGlzLm51bWJlcihjb2RlKSA/IGNvZGUgOiBFcnJvckNvZGVzLlVua25vd25FcnJvckNvZGU7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBSZXNwb25zZUVycm9yLnByb3RvdHlwZSk7XG4gICAgfVxuICAgIHRvSnNvbigpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgY29kZTogdGhpcy5jb2RlLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLmRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmRhdGEgPSB0aGlzLmRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5leHBvcnRzLlJlc3BvbnNlRXJyb3IgPSBSZXNwb25zZUVycm9yO1xuY2xhc3MgUGFyYW1ldGVyU3RydWN0dXJlcyB7XG4gICAgY29uc3RydWN0b3Ioa2luZCkge1xuICAgICAgICB0aGlzLmtpbmQgPSBraW5kO1xuICAgIH1cbiAgICBzdGF0aWMgaXModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8gfHwgdmFsdWUgPT09IFBhcmFtZXRlclN0cnVjdHVyZXMuYnlOYW1lIHx8IHZhbHVlID09PSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5UG9zaXRpb247XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5raW5kO1xuICAgIH1cbn1cbmV4cG9ydHMuUGFyYW1ldGVyU3RydWN0dXJlcyA9IFBhcmFtZXRlclN0cnVjdHVyZXM7XG4vKipcbiAqIFRoZSBwYXJhbWV0ZXIgc3RydWN0dXJlIGlzIGF1dG9tYXRpY2FsbHkgaW5mZXJyZWQgb24gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzXG4gKiBhbmQgdGhlIHBhcmFtZXRlciB0eXBlIGluIGNhc2Ugb2YgYSBzaW5nbGUgcGFyYW0uXG4gKi9cblBhcmFtZXRlclN0cnVjdHVyZXMuYXV0byA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdhdXRvJyk7XG4vKipcbiAqIEZvcmNlcyBgYnlQb3NpdGlvbmAgcGFyYW1ldGVyIHN0cnVjdHVyZS4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGhhdmUgYSBzaW5nbGVcbiAqIHBhcmFtZXRlciB3aGljaCBoYXMgYSBsaXRlcmFsIHR5cGUuXG4gKi9cblBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbiA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdieVBvc2l0aW9uJyk7XG4vKipcbiAqIEZvcmNlcyBgYnlOYW1lYCBwYXJhbWV0ZXIgc3RydWN0dXJlLiBUaGlzIGlzIG9ubHkgdXNlZnVsIHdoZW4gaGF2aW5nIGEgc2luZ2xlXG4gKiBwYXJhbWV0ZXIuIFRoZSBsaWJyYXJ5IHdpbGwgcmVwb3J0IGVycm9ycyBpZiB1c2VkIHdpdGggYSBkaWZmZXJlbnQgbnVtYmVyIG9mXG4gKiBwYXJhbWV0ZXJzLlxuICovXG5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdieU5hbWUnKTtcbi8qKlxuICogQW4gYWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgYSBNZXNzYWdlVHlwZS5cbiAqL1xuY2xhc3MgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIG51bWJlck9mUGFyYW1zKSB7XG4gICAgICAgIHRoaXMubWV0aG9kID0gbWV0aG9kO1xuICAgICAgICB0aGlzLm51bWJlck9mUGFyYW1zID0gbnVtYmVyT2ZQYXJhbXM7XG4gICAgfVxuICAgIGdldCBwYXJhbWV0ZXJTdHJ1Y3R1cmVzKCkge1xuICAgICAgICByZXR1cm4gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvO1xuICAgIH1cbn1cbmV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlID0gQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlO1xuLyoqXG4gKiBDbGFzc2VzIHRvIHR5cGUgcmVxdWVzdCByZXNwb25zZSBwYWlyc1xuICovXG5jbGFzcyBSZXF1ZXN0VHlwZTAgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDApO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGUwID0gUmVxdWVzdFR5cGUwO1xuY2xhc3MgUmVxdWVzdFR5cGUgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCwgX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8pIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAxKTtcbiAgICAgICAgdGhpcy5fcGFyYW1ldGVyU3RydWN0dXJlcyA9IF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbiAgICBnZXQgcGFyYW1ldGVyU3RydWN0dXJlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXM7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IFJlcXVlc3RUeXBlO1xuY2xhc3MgUmVxdWVzdFR5cGUxIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMSk7XG4gICAgICAgIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBfcGFyYW1ldGVyU3RydWN0dXJlcztcbiAgICB9XG4gICAgZ2V0IHBhcmFtZXRlclN0cnVjdHVyZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGUxID0gUmVxdWVzdFR5cGUxO1xuY2xhc3MgUmVxdWVzdFR5cGUyIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAyKTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlMiA9IFJlcXVlc3RUeXBlMjtcbmNsYXNzIFJlcXVlc3RUeXBlMyBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMyk7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTMgPSBSZXF1ZXN0VHlwZTM7XG5jbGFzcyBSZXF1ZXN0VHlwZTQgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDQpO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGU0ID0gUmVxdWVzdFR5cGU0O1xuY2xhc3MgUmVxdWVzdFR5cGU1IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA1KTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlNSA9IFJlcXVlc3RUeXBlNTtcbmNsYXNzIFJlcXVlc3RUeXBlNiBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNik7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTYgPSBSZXF1ZXN0VHlwZTY7XG5jbGFzcyBSZXF1ZXN0VHlwZTcgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDcpO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGU3ID0gUmVxdWVzdFR5cGU3O1xuY2xhc3MgUmVxdWVzdFR5cGU4IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA4KTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlOCA9IFJlcXVlc3RUeXBlODtcbmNsYXNzIFJlcXVlc3RUeXBlOSBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgOSk7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTkgPSBSZXF1ZXN0VHlwZTk7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMSk7XG4gICAgICAgIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBfcGFyYW1ldGVyU3RydWN0dXJlcztcbiAgICB9XG4gICAgZ2V0IHBhcmFtZXRlclN0cnVjdHVyZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZSA9IE5vdGlmaWNhdGlvblR5cGU7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlMCBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMCk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMCA9IE5vdGlmaWNhdGlvblR5cGUwO1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTEgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCwgX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8pIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAxKTtcbiAgICAgICAgdGhpcy5fcGFyYW1ldGVyU3RydWN0dXJlcyA9IF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbiAgICBnZXQgcGFyYW1ldGVyU3RydWN0dXJlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXM7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMSA9IE5vdGlmaWNhdGlvblR5cGUxO1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDIpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTIgPSBOb3RpZmljYXRpb25UeXBlMjtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGUzIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAzKTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGUzID0gTm90aWZpY2F0aW9uVHlwZTM7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlNCBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNCk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNCA9IE5vdGlmaWNhdGlvblR5cGU0O1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTUgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDUpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTUgPSBOb3RpZmljYXRpb25UeXBlNTtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGU2IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA2KTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGU2ID0gTm90aWZpY2F0aW9uVHlwZTY7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlNyBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNyk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNyA9IE5vdGlmaWNhdGlvblR5cGU3O1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTggZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDgpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTggPSBOb3RpZmljYXRpb25UeXBlODtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGU5IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA5KTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGU5ID0gTm90aWZpY2F0aW9uVHlwZTk7XG52YXIgTWVzc2FnZTtcbihmdW5jdGlvbiAoTWVzc2FnZSkge1xuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoZSBnaXZlbiBtZXNzYWdlIGlzIGEgcmVxdWVzdCBtZXNzYWdlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gbWVzc2FnZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBpcy5zdHJpbmcoY2FuZGlkYXRlLm1ldGhvZCkgJiYgKGlzLnN0cmluZyhjYW5kaWRhdGUuaWQpIHx8IGlzLm51bWJlcihjYW5kaWRhdGUuaWQpKTtcbiAgICB9XG4gICAgTWVzc2FnZS5pc1JlcXVlc3QgPSBpc1JlcXVlc3Q7XG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhlIGdpdmVuIG1lc3NhZ2UgaXMgYSBub3RpZmljYXRpb24gbWVzc2FnZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTm90aWZpY2F0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gbWVzc2FnZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBpcy5zdHJpbmcoY2FuZGlkYXRlLm1ldGhvZCkgJiYgbWVzc2FnZS5pZCA9PT0gdm9pZCAwO1xuICAgIH1cbiAgICBNZXNzYWdlLmlzTm90aWZpY2F0aW9uID0gaXNOb3RpZmljYXRpb247XG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhlIGdpdmVuIG1lc3NhZ2UgaXMgYSByZXNwb25zZSBtZXNzYWdlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNSZXNwb25zZShtZXNzYWdlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IG1lc3NhZ2U7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgKGNhbmRpZGF0ZS5yZXN1bHQgIT09IHZvaWQgMCB8fCAhIWNhbmRpZGF0ZS5lcnJvcikgJiYgKGlzLnN0cmluZyhjYW5kaWRhdGUuaWQpIHx8IGlzLm51bWJlcihjYW5kaWRhdGUuaWQpIHx8IGNhbmRpZGF0ZS5pZCA9PT0gbnVsbCk7XG4gICAgfVxuICAgIE1lc3NhZ2UuaXNSZXNwb25zZSA9IGlzUmVzcG9uc2U7XG59KShNZXNzYWdlIHx8IChleHBvcnRzLk1lc3NhZ2UgPSBNZXNzYWdlID0ge30pKTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xudmFyIF9hO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5MUlVDYWNoZSA9IGV4cG9ydHMuTGlua2VkTWFwID0gZXhwb3J0cy5Ub3VjaCA9IHZvaWQgMDtcbnZhciBUb3VjaDtcbihmdW5jdGlvbiAoVG91Y2gpIHtcbiAgICBUb3VjaC5Ob25lID0gMDtcbiAgICBUb3VjaC5GaXJzdCA9IDE7XG4gICAgVG91Y2guQXNPbGQgPSBUb3VjaC5GaXJzdDtcbiAgICBUb3VjaC5MYXN0ID0gMjtcbiAgICBUb3VjaC5Bc05ldyA9IFRvdWNoLkxhc3Q7XG59KShUb3VjaCB8fCAoZXhwb3J0cy5Ub3VjaCA9IFRvdWNoID0ge30pKTtcbmNsYXNzIExpbmtlZE1hcCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXNbX2FdID0gJ0xpbmtlZE1hcCc7XG4gICAgICAgIHRoaXMuX21hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5faGVhZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fdGFpbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IDA7XG4gICAgICAgIHRoaXMuX3N0YXRlID0gMDtcbiAgICB9XG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuX21hcC5jbGVhcigpO1xuICAgICAgICB0aGlzLl9oZWFkID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl90YWlsID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9zaXplID0gMDtcbiAgICAgICAgdGhpcy5fc3RhdGUrKztcbiAgICB9XG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLl9oZWFkICYmICF0aGlzLl90YWlsO1xuICAgIH1cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpemU7XG4gICAgfVxuICAgIGdldCBmaXJzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlYWQ/LnZhbHVlO1xuICAgIH1cbiAgICBnZXQgbGFzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhaWw/LnZhbHVlO1xuICAgIH1cbiAgICBoYXMoa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXAuaGFzKGtleSk7XG4gICAgfVxuICAgIGdldChrZXksIHRvdWNoID0gVG91Y2guTm9uZSkge1xuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5fbWFwLmdldChrZXkpO1xuICAgICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRvdWNoICE9PSBUb3VjaC5Ob25lKSB7XG4gICAgICAgICAgICB0aGlzLnRvdWNoKGl0ZW0sIHRvdWNoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICB9XG4gICAgc2V0KGtleSwgdmFsdWUsIHRvdWNoID0gVG91Y2guTm9uZSkge1xuICAgICAgICBsZXQgaXRlbSA9IHRoaXMuX21hcC5nZXQoa2V5KTtcbiAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgIGl0ZW0udmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIGlmICh0b3VjaCAhPT0gVG91Y2guTm9uZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudG91Y2goaXRlbSwgdG91Y2gpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaXRlbSA9IHsga2V5LCB2YWx1ZSwgbmV4dDogdW5kZWZpbmVkLCBwcmV2aW91czogdW5kZWZpbmVkIH07XG4gICAgICAgICAgICBzd2l0Y2ggKHRvdWNoKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBUb3VjaC5Ob25lOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFRvdWNoLkZpcnN0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1GaXJzdChpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBUb3VjaC5MYXN0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX21hcC5zZXQoa2V5LCBpdGVtKTtcbiAgICAgICAgICAgIHRoaXMuX3NpemUrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGVsZXRlKGtleSkge1xuICAgICAgICByZXR1cm4gISF0aGlzLnJlbW92ZShrZXkpO1xuICAgIH1cbiAgICByZW1vdmUoa2V5KSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl9tYXAuZ2V0KGtleSk7XG4gICAgICAgIGlmICghaXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tYXAuZGVsZXRlKGtleSk7XG4gICAgICAgIHRoaXMucmVtb3ZlSXRlbShpdGVtKTtcbiAgICAgICAgdGhpcy5fc2l6ZS0tO1xuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICB9XG4gICAgc2hpZnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5faGVhZCAmJiAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2hlYWQgfHwgIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIHRoaXMuX21hcC5kZWxldGUoaXRlbS5rZXkpO1xuICAgICAgICB0aGlzLnJlbW92ZUl0ZW0oaXRlbSk7XG4gICAgICAgIHRoaXMuX3NpemUtLTtcbiAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7XG4gICAgfVxuICAgIGZvckVhY2goY2FsbGJhY2tmbiwgdGhpc0FyZykge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3N0YXRlO1xuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICAgICAgICBpZiAodGhpc0FyZykge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrZm4uYmluZCh0aGlzQXJnKShjdXJyZW50LnZhbHVlLCBjdXJyZW50LmtleSwgdGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFja2ZuKGN1cnJlbnQudmFsdWUsIGN1cnJlbnQua2V5LCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gc3RhdGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExpbmtlZE1hcCBnb3QgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAga2V5cygpIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9zdGF0ZTtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLl9oZWFkO1xuICAgICAgICBjb25zdCBpdGVyYXRvciA9IHtcbiAgICAgICAgICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fc3RhdGUgIT09IHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTGlua2VkTWFwIGdvdCBtb2RpZmllZCBkdXJpbmcgaXRlcmF0aW9uLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7IHZhbHVlOiBjdXJyZW50LmtleSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICB9XG4gICAgdmFsdWVzKCkge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3N0YXRlO1xuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIGNvbnN0IGl0ZXJhdG9yID0ge1xuICAgICAgICAgICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlcmF0b3I7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBMaW5rZWRNYXAgZ290IG1vZGlmaWVkIGR1cmluZyBpdGVyYXRpb24uYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHsgdmFsdWU6IGN1cnJlbnQudmFsdWUsIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gaXRlcmF0b3I7XG4gICAgfVxuICAgIGVudHJpZXMoKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5fc3RhdGU7XG4gICAgICAgIGxldCBjdXJyZW50ID0gdGhpcy5faGVhZDtcbiAgICAgICAgY29uc3QgaXRlcmF0b3IgPSB7XG4gICAgICAgICAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3N0YXRlICE9PSBzdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExpbmtlZE1hcCBnb3QgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geyB2YWx1ZTogW2N1cnJlbnQua2V5LCBjdXJyZW50LnZhbHVlXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICB9XG4gICAgWyhfYSA9IFN5bWJvbC50b1N0cmluZ1RhZywgU3ltYm9sLml0ZXJhdG9yKV0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMoKTtcbiAgICB9XG4gICAgdHJpbU9sZChuZXdTaXplKSB7XG4gICAgICAgIGlmIChuZXdTaXplID49IHRoaXMuc2l6ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuZXdTaXplID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLl9oZWFkO1xuICAgICAgICBsZXQgY3VycmVudFNpemUgPSB0aGlzLnNpemU7XG4gICAgICAgIHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnRTaXplID4gbmV3U2l6ZSkge1xuICAgICAgICAgICAgdGhpcy5fbWFwLmRlbGV0ZShjdXJyZW50LmtleSk7XG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0O1xuICAgICAgICAgICAgY3VycmVudFNpemUtLTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9oZWFkID0gY3VycmVudDtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IGN1cnJlbnRTaXplO1xuICAgICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICAgICAgY3VycmVudC5wcmV2aW91cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgIH1cbiAgICBhZGRJdGVtRmlyc3QoaXRlbSkge1xuICAgICAgICAvLyBGaXJzdCB0aW1lIEluc2VydFxuICAgICAgICBpZiAoIXRoaXMuX2hlYWQgJiYgIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRoaXMuX3RhaWwgPSBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCF0aGlzLl9oZWFkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbGlzdCcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdGhpcy5faGVhZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQucHJldmlvdXMgPSBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2hlYWQgPSBpdGVtO1xuICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgIH1cbiAgICBhZGRJdGVtTGFzdChpdGVtKSB7XG4gICAgICAgIC8vIEZpcnN0IHRpbWUgSW5zZXJ0XG4gICAgICAgIGlmICghdGhpcy5faGVhZCAmJiAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgdGhpcy5faGVhZCA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpdGVtLnByZXZpb3VzID0gdGhpcy5fdGFpbDtcbiAgICAgICAgICAgIHRoaXMuX3RhaWwubmV4dCA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW07XG4gICAgICAgIHRoaXMuX3N0YXRlKys7XG4gICAgfVxuICAgIHJlbW92ZUl0ZW0oaXRlbSkge1xuICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCAmJiBpdGVtID09PSB0aGlzLl90YWlsKSB7XG4gICAgICAgICAgICB0aGlzLl9oZWFkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpdGVtID09PSB0aGlzLl9oZWFkKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGNhbiBvbmx5IGhhcHBlbmVkIGlmIHNpemUgPT09IDEgd2hpY2ggaXMgaGFuZGxlXG4gICAgICAgICAgICAvLyBieSB0aGUgY2FzZSBhYm92ZS5cbiAgICAgICAgICAgIGlmICghaXRlbS5uZXh0KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxpc3QnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGl0ZW0ubmV4dC5wcmV2aW91cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQgPSBpdGVtLm5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXRlbSA9PT0gdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgLy8gVGhpcyBjYW4gb25seSBoYXBwZW5lZCBpZiBzaXplID09PSAxIHdoaWNoIGlzIGhhbmRsZVxuICAgICAgICAgICAgLy8gYnkgdGhlIGNhc2UgYWJvdmUuXG4gICAgICAgICAgICBpZiAoIWl0ZW0ucHJldmlvdXMpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbGlzdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbS5wcmV2aW91cy5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gaXRlbS5uZXh0O1xuICAgICAgICAgICAgY29uc3QgcHJldmlvdXMgPSBpdGVtLnByZXZpb3VzO1xuICAgICAgICAgICAgaWYgKCFuZXh0IHx8ICFwcmV2aW91cykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXh0LnByZXZpb3VzID0gcHJldmlvdXM7XG4gICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gbmV4dDtcbiAgICAgICAgfVxuICAgICAgICBpdGVtLm5leHQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGl0ZW0ucHJldmlvdXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX3N0YXRlKys7XG4gICAgfVxuICAgIHRvdWNoKGl0ZW0sIHRvdWNoKSB7XG4gICAgICAgIGlmICghdGhpcy5faGVhZCB8fCAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxpc3QnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHRvdWNoICE9PSBUb3VjaC5GaXJzdCAmJiB0b3VjaCAhPT0gVG91Y2guTGFzdCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG91Y2ggPT09IFRvdWNoLkZpcnN0KSB7XG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBpdGVtLm5leHQ7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgICAgICAvLyBVbmxpbmsgdGhlIGl0ZW1cbiAgICAgICAgICAgIGlmIChpdGVtID09PSB0aGlzLl90YWlsKSB7XG4gICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgbXVzdCBiZSBkZWZpbmVkIHNpbmNlIGl0ZW0gd2FzIG5vdCBoZWFkIGJ1dCBpcyB0YWlsXG4gICAgICAgICAgICAgICAgLy8gU28gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbiBpdGVtIGluIHRoZSBtYXBcbiAgICAgICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuX3RhaWwgPSBwcmV2aW91cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEJvdGggbmV4dCBhbmQgcHJldmlvdXMgYXJlIG5vdCB1bmRlZmluZWQgc2luY2UgaXRlbSB3YXMgbmVpdGhlciBoZWFkIG5vciB0YWlsLlxuICAgICAgICAgICAgICAgIG5leHQucHJldmlvdXMgPSBwcmV2aW91cztcbiAgICAgICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEluc2VydCB0aGUgbm9kZSBhdCBoZWFkXG4gICAgICAgICAgICBpdGVtLnByZXZpb3VzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdGhpcy5faGVhZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQucHJldmlvdXMgPSBpdGVtO1xuICAgICAgICAgICAgdGhpcy5faGVhZCA9IGl0ZW07XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRvdWNoID09PSBUb3VjaC5MYXN0KSB7XG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBpdGVtLm5leHQ7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgICAgICAvLyBVbmxpbmsgdGhlIGl0ZW0uXG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCkge1xuICAgICAgICAgICAgICAgIC8vIG5leHQgbXVzdCBiZSBkZWZpbmVkIHNpbmNlIGl0ZW0gd2FzIG5vdCB0YWlsIGJ1dCBpcyBoZWFkXG4gICAgICAgICAgICAgICAgLy8gU28gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbiBpdGVtIGluIHRoZSBtYXBcbiAgICAgICAgICAgICAgICBuZXh0LnByZXZpb3VzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuX2hlYWQgPSBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQm90aCBuZXh0IGFuZCBwcmV2aW91cyBhcmUgbm90IHVuZGVmaW5lZCBzaW5jZSBpdGVtIHdhcyBuZWl0aGVyIGhlYWQgbm9yIHRhaWwuXG4gICAgICAgICAgICAgICAgbmV4dC5wcmV2aW91cyA9IHByZXZpb3VzO1xuICAgICAgICAgICAgICAgIHByZXZpb3VzLm5leHQgPSBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaXRlbS5wcmV2aW91cyA9IHRoaXMuX3RhaWw7XG4gICAgICAgICAgICB0aGlzLl90YWlsLm5leHQgPSBpdGVtO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW07XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IFtdO1xuICAgICAgICB0aGlzLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGRhdGEucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGZyb21KU09OKGRhdGEpIHtcbiAgICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBkYXRhKSB7XG4gICAgICAgICAgICB0aGlzLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuTGlua2VkTWFwID0gTGlua2VkTWFwO1xuY2xhc3MgTFJVQ2FjaGUgZXh0ZW5kcyBMaW5rZWRNYXAge1xuICAgIGNvbnN0cnVjdG9yKGxpbWl0LCByYXRpbyA9IDEpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fbGltaXQgPSBsaW1pdDtcbiAgICAgICAgdGhpcy5fcmF0aW8gPSBNYXRoLm1pbihNYXRoLm1heCgwLCByYXRpbyksIDEpO1xuICAgIH1cbiAgICBnZXQgbGltaXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9saW1pdDtcbiAgICB9XG4gICAgc2V0IGxpbWl0KGxpbWl0KSB7XG4gICAgICAgIHRoaXMuX2xpbWl0ID0gbGltaXQ7XG4gICAgICAgIHRoaXMuY2hlY2tUcmltKCk7XG4gICAgfVxuICAgIGdldCByYXRpbygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JhdGlvO1xuICAgIH1cbiAgICBzZXQgcmF0aW8ocmF0aW8pIHtcbiAgICAgICAgdGhpcy5fcmF0aW8gPSBNYXRoLm1pbihNYXRoLm1heCgwLCByYXRpbyksIDEpO1xuICAgICAgICB0aGlzLmNoZWNrVHJpbSgpO1xuICAgIH1cbiAgICBnZXQoa2V5LCB0b3VjaCA9IFRvdWNoLkFzTmV3KSB7XG4gICAgICAgIHJldHVybiBzdXBlci5nZXQoa2V5LCB0b3VjaCk7XG4gICAgfVxuICAgIHBlZWsoa2V5KSB7XG4gICAgICAgIHJldHVybiBzdXBlci5nZXQoa2V5LCBUb3VjaC5Ob25lKTtcbiAgICB9XG4gICAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgc3VwZXIuc2V0KGtleSwgdmFsdWUsIFRvdWNoLkxhc3QpO1xuICAgICAgICB0aGlzLmNoZWNrVHJpbSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgY2hlY2tUcmltKCkge1xuICAgICAgICBpZiAodGhpcy5zaXplID4gdGhpcy5fbGltaXQpIHtcbiAgICAgICAgICAgIHRoaXMudHJpbU9sZChNYXRoLnJvdW5kKHRoaXMuX2xpbWl0ICogdGhpcy5fcmF0aW8pKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuTFJVQ2FjaGUgPSBMUlVDYWNoZTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5EaXNwb3NhYmxlID0gdm9pZCAwO1xudmFyIERpc3Bvc2FibGU7XG4oZnVuY3Rpb24gKERpc3Bvc2FibGUpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUoZnVuYykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGlzcG9zZTogZnVuY1xuICAgICAgICB9O1xuICAgIH1cbiAgICBEaXNwb3NhYmxlLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKERpc3Bvc2FibGUgfHwgKGV4cG9ydHMuRGlzcG9zYWJsZSA9IERpc3Bvc2FibGUgPSB7fSkpO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xubGV0IF9yYWw7XG5mdW5jdGlvbiBSQUwoKSB7XG4gICAgaWYgKF9yYWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHJ1bnRpbWUgYWJzdHJhY3Rpb24gbGF5ZXIgaW5zdGFsbGVkYCk7XG4gICAgfVxuICAgIHJldHVybiBfcmFsO1xufVxuKGZ1bmN0aW9uIChSQUwpIHtcbiAgICBmdW5jdGlvbiBpbnN0YWxsKHJhbCkge1xuICAgICAgICBpZiAocmFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gcnVudGltZSBhYnN0cmFjdGlvbiBsYXllciBwcm92aWRlZGApO1xuICAgICAgICB9XG4gICAgICAgIF9yYWwgPSByYWw7XG4gICAgfVxuICAgIFJBTC5pbnN0YWxsID0gaW5zdGFsbDtcbn0pKFJBTCB8fCAoUkFMID0ge30pKTtcbmV4cG9ydHMuZGVmYXVsdCA9IFJBTDtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuRW1pdHRlciA9IGV4cG9ydHMuRXZlbnQgPSB2b2lkIDA7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbnZhciBFdmVudDtcbihmdW5jdGlvbiAoRXZlbnQpIHtcbiAgICBjb25zdCBfZGlzcG9zYWJsZSA9IHsgZGlzcG9zZSgpIHsgfSB9O1xuICAgIEV2ZW50Lk5vbmUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBfZGlzcG9zYWJsZTsgfTtcbn0pKEV2ZW50IHx8IChleHBvcnRzLkV2ZW50ID0gRXZlbnQgPSB7fSkpO1xuY2xhc3MgQ2FsbGJhY2tMaXN0IHtcbiAgICBhZGQoY2FsbGJhY2ssIGNvbnRleHQgPSBudWxsLCBidWNrZXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fY29udGV4dHMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgICAgIHRoaXMuX2NvbnRleHRzLnB1c2goY29udGV4dCk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGJ1Y2tldCkpIHtcbiAgICAgICAgICAgIGJ1Y2tldC5wdXNoKHsgZGlzcG9zZTogKCkgPT4gdGhpcy5yZW1vdmUoY2FsbGJhY2ssIGNvbnRleHQpIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlbW92ZShjYWxsYmFjaywgY29udGV4dCA9IG51bGwpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZm91bmRDYWxsYmFja1dpdGhEaWZmZXJlbnRDb250ZXh0ID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLl9jYWxsYmFja3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jYWxsYmFja3NbaV0gPT09IGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NvbnRleHRzW2ldID09PSBjb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrICYgY29udGV4dCBtYXRjaCA9PiByZW1vdmUgaXRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29udGV4dHMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZENhbGxiYWNrV2l0aERpZmZlcmVudENvbnRleHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZm91bmRDYWxsYmFja1dpdGhEaWZmZXJlbnRDb250ZXh0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1doZW4gYWRkaW5nIGEgbGlzdGVuZXIgd2l0aCBhIGNvbnRleHQsIHlvdSBzaG91bGQgcmVtb3ZlIGl0IHdpdGggdGhlIHNhbWUgY29udGV4dCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGludm9rZSguLi5hcmdzKSB7XG4gICAgICAgIGlmICghdGhpcy5fY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmV0ID0gW10sIGNhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcy5zbGljZSgwKSwgY29udGV4dHMgPSB0aGlzLl9jb250ZXh0cy5zbGljZSgwKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXQucHVzaChjYWxsYmFja3NbaV0uYXBwbHkoY29udGV4dHNbaV0sIGFyZ3MpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS5jb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICAgIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5fY2FsbGJhY2tzIHx8IHRoaXMuX2NhbGxiYWNrcy5sZW5ndGggPT09IDA7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fY29udGV4dHMgPSB1bmRlZmluZWQ7XG4gICAgfVxufVxuY2xhc3MgRW1pdHRlciB7XG4gICAgY29uc3RydWN0b3IoX29wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IF9vcHRpb25zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGb3IgdGhlIHB1YmxpYyB0byBhbGxvdyB0byBzdWJzY3JpYmVcbiAgICAgKiB0byBldmVudHMgZnJvbSB0aGlzIEVtaXR0ZXJcbiAgICAgKi9cbiAgICBnZXQgZXZlbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fZXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50ID0gKGxpc3RlbmVyLCB0aGlzQXJncywgZGlzcG9zYWJsZXMpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2NhbGxiYWNrcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWxsYmFja3MgPSBuZXcgQ2FsbGJhY2tMaXN0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMub25GaXJzdExpc3RlbmVyQWRkICYmIHRoaXMuX2NhbGxiYWNrcy5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy5vbkZpcnN0TGlzdGVuZXJBZGQodGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5hZGQobGlzdGVuZXIsIHRoaXNBcmdzKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlzcG9zYWJsZSBpcyBkaXNwb3NlZCBhZnRlciBlbWl0dGVyIGlzIGRpc3Bvc2VkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5yZW1vdmUobGlzdGVuZXIsIHRoaXNBcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5kaXNwb3NlID0gRW1pdHRlci5fbm9vcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMub25MYXN0TGlzdGVuZXJSZW1vdmUgJiYgdGhpcy5fY2FsbGJhY2tzLmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29wdGlvbnMub25MYXN0TGlzdGVuZXJSZW1vdmUodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRpc3Bvc2FibGVzKSkge1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlcy5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9ldmVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVG8gYmUga2VwdCBwcml2YXRlIHRvIGZpcmUgYW4gZXZlbnQgdG9cbiAgICAgKiBzdWJzY3JpYmVyc1xuICAgICAqL1xuICAgIGZpcmUoZXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NhbGxiYWNrcykge1xuICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzLmludm9rZS5jYWxsKHRoaXMuX2NhbGxiYWNrcywgZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5kaXNwb3NlKCk7XG4gICAgICAgICAgICB0aGlzLl9jYWxsYmFja3MgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLkVtaXR0ZXIgPSBFbWl0dGVyO1xuRW1pdHRlci5fbm9vcCA9IGZ1bmN0aW9uICgpIHsgfTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uVG9rZW4gPSB2b2lkIDA7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbmNvbnN0IElzID0gcmVxdWlyZShcIi4vaXNcIik7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCIuL2V2ZW50c1wiKTtcbnZhciBDYW5jZWxsYXRpb25Ub2tlbjtcbihmdW5jdGlvbiAoQ2FuY2VsbGF0aW9uVG9rZW4pIHtcbiAgICBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGlzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkOiBmYWxzZSxcbiAgICAgICAgb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6IGV2ZW50c18xLkV2ZW50Lk5vbmVcbiAgICB9KTtcbiAgICBDYW5jZWxsYXRpb25Ub2tlbi5DYW5jZWxsZWQgPSBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6IHRydWUsXG4gICAgICAgIG9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkOiBldmVudHNfMS5FdmVudC5Ob25lXG4gICAgfSk7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgKGNhbmRpZGF0ZSA9PT0gQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZVxuICAgICAgICAgICAgfHwgY2FuZGlkYXRlID09PSBDYW5jZWxsYXRpb25Ub2tlbi5DYW5jZWxsZWRcbiAgICAgICAgICAgIHx8IChJcy5ib29sZWFuKGNhbmRpZGF0ZS5pc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkgJiYgISFjYW5kaWRhdGUub25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQpKTtcbiAgICB9XG4gICAgQ2FuY2VsbGF0aW9uVG9rZW4uaXMgPSBpcztcbn0pKENhbmNlbGxhdGlvblRva2VuIHx8IChleHBvcnRzLkNhbmNlbGxhdGlvblRva2VuID0gQ2FuY2VsbGF0aW9uVG9rZW4gPSB7fSkpO1xuY29uc3Qgc2hvcnRjdXRFdmVudCA9IE9iamVjdC5mcmVlemUoZnVuY3Rpb24gKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgY29uc3QgaGFuZGxlID0gKDAsIHJhbF8xLmRlZmF1bHQpKCkudGltZXIuc2V0VGltZW91dChjYWxsYmFjay5iaW5kKGNvbnRleHQpLCAwKTtcbiAgICByZXR1cm4geyBkaXNwb3NlKCkgeyBoYW5kbGUuZGlzcG9zZSgpOyB9IH07XG59KTtcbmNsYXNzIE11dGFibGVUb2tlbiB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX2lzQ2FuY2VsbGVkID0gZmFsc2U7XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9pc0NhbmNlbGxlZCkge1xuICAgICAgICAgICAgdGhpcy5faXNDYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2VtaXR0ZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmZpcmUodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0NhbmNlbGxlZDtcbiAgICB9XG4gICAgZ2V0IG9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKCkge1xuICAgICAgICBpZiAodGhpcy5faXNDYW5jZWxsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBzaG9ydGN1dEV2ZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5fZW1pdHRlcikge1xuICAgICAgICAgICAgdGhpcy5fZW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2VtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLl9lbWl0dGVyKSB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5jbGFzcyBDYW5jZWxsYXRpb25Ub2tlblNvdXJjZSB7XG4gICAgZ2V0IHRva2VuKCkge1xuICAgICAgICBpZiAoIXRoaXMuX3Rva2VuKSB7XG4gICAgICAgICAgICAvLyBiZSBsYXp5IGFuZCBjcmVhdGUgdGhlIHRva2VuIG9ubHkgd2hlblxuICAgICAgICAgICAgLy8gYWN0dWFsbHkgbmVlZGVkXG4gICAgICAgICAgICB0aGlzLl90b2tlbiA9IG5ldyBNdXRhYmxlVG9rZW4oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fdG9rZW47XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl90b2tlbikge1xuICAgICAgICAgICAgLy8gc2F2ZSBhbiBvYmplY3QgYnkgcmV0dXJuaW5nIHRoZSBkZWZhdWx0XG4gICAgICAgICAgICAvLyBjYW5jZWxsZWQgdG9rZW4gd2hlbiBjYW5jZWxsYXRpb24gaGFwcGVuc1xuICAgICAgICAgICAgLy8gYmVmb3JlIHNvbWVvbmUgYXNrcyBmb3IgdGhlIHRva2VuXG4gICAgICAgICAgICB0aGlzLl90b2tlbiA9IENhbmNlbGxhdGlvblRva2VuLkNhbmNlbGxlZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3Rva2VuLmNhbmNlbCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICghdGhpcy5fdG9rZW4pIHtcbiAgICAgICAgICAgIC8vIGVuc3VyZSB0byBpbml0aWFsaXplIHdpdGggYW4gZW1wdHkgdG9rZW4gaWYgd2UgaGFkIG5vbmVcbiAgICAgICAgICAgIHRoaXMuX3Rva2VuID0gQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLl90b2tlbiBpbnN0YW5jZW9mIE11dGFibGVUb2tlbikge1xuICAgICAgICAgICAgLy8gYWN0dWFsbHkgZGlzcG9zZVxuICAgICAgICAgICAgdGhpcy5fdG9rZW4uZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IENhbmNlbGxhdGlvblRva2VuU291cmNlO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3kgPSB2b2lkIDA7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbnZhciBDYW5jZWxsYXRpb25TdGF0ZTtcbihmdW5jdGlvbiAoQ2FuY2VsbGF0aW9uU3RhdGUpIHtcbiAgICBDYW5jZWxsYXRpb25TdGF0ZS5Db250aW51ZSA9IDA7XG4gICAgQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkID0gMTtcbn0pKENhbmNlbGxhdGlvblN0YXRlIHx8IChDYW5jZWxsYXRpb25TdGF0ZSA9IHt9KSk7XG5jbGFzcyBTaGFyZWRBcnJheVNlbmRlclN0cmF0ZWd5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5idWZmZXJzID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICBlbmFibGVDYW5jZWxsYXRpb24ocmVxdWVzdCkge1xuICAgICAgICBpZiAocmVxdWVzdC5pZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBTaGFyZWRBcnJheUJ1ZmZlcig0KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBJbnQzMkFycmF5KGJ1ZmZlciwgMCwgMSk7XG4gICAgICAgIGRhdGFbMF0gPSBDYW5jZWxsYXRpb25TdGF0ZS5Db250aW51ZTtcbiAgICAgICAgdGhpcy5idWZmZXJzLnNldChyZXF1ZXN0LmlkLCBidWZmZXIpO1xuICAgICAgICByZXF1ZXN0LiRjYW5jZWxsYXRpb25EYXRhID0gYnVmZmVyO1xuICAgIH1cbiAgICBhc3luYyBzZW5kQ2FuY2VsbGF0aW9uKF9jb25uLCBpZCkge1xuICAgICAgICBjb25zdCBidWZmZXIgPSB0aGlzLmJ1ZmZlcnMuZ2V0KGlkKTtcbiAgICAgICAgaWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBJbnQzMkFycmF5KGJ1ZmZlciwgMCwgMSk7XG4gICAgICAgIEF0b21pY3Muc3RvcmUoZGF0YSwgMCwgQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkKTtcbiAgICB9XG4gICAgY2xlYW51cChpZCkge1xuICAgICAgICB0aGlzLmJ1ZmZlcnMuZGVsZXRlKGlkKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy5idWZmZXJzLmNsZWFyKCk7XG4gICAgfVxufVxuZXhwb3J0cy5TaGFyZWRBcnJheVNlbmRlclN0cmF0ZWd5ID0gU2hhcmVkQXJyYXlTZW5kZXJTdHJhdGVneTtcbmNsYXNzIFNoYXJlZEFycmF5QnVmZmVyQ2FuY2VsbGF0aW9uVG9rZW4ge1xuICAgIGNvbnN0cnVjdG9yKGJ1ZmZlcikge1xuICAgICAgICB0aGlzLmRhdGEgPSBuZXcgSW50MzJBcnJheShidWZmZXIsIDAsIDEpO1xuICAgIH1cbiAgICBnZXQgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHJldHVybiBBdG9taWNzLmxvYWQodGhpcy5kYXRhLCAwKSA9PT0gQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkO1xuICAgIH1cbiAgICBnZXQgb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuY2VsbGF0aW9uIG92ZXIgU2hhcmVkQXJyYXlCdWZmZXIgZG9lc24ndCBzdXBwb3J0IGNhbmNlbGxhdGlvbiBldmVudHNgKTtcbiAgICB9XG59XG5jbGFzcyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuU291cmNlIHtcbiAgICBjb25zdHJ1Y3RvcihidWZmZXIpIHtcbiAgICAgICAgdGhpcy50b2tlbiA9IG5ldyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuKGJ1ZmZlcik7XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICB9XG59XG5jbGFzcyBTaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmtpbmQgPSAncmVxdWVzdCc7XG4gICAgfVxuICAgIGNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKHJlcXVlc3QpIHtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gcmVxdWVzdC4kY2FuY2VsbGF0aW9uRGF0YTtcbiAgICAgICAgaWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuU291cmNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuU291cmNlKGJ1ZmZlcik7XG4gICAgfVxufVxuZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBTaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3k7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNlbWFwaG9yZSA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY2xhc3MgU2VtYXBob3JlIHtcbiAgICBjb25zdHJ1Y3RvcihjYXBhY2l0eSA9IDEpIHtcbiAgICAgICAgaWYgKGNhcGFjaXR5IDw9IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FwYWNpdHkgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NhcGFjaXR5ID0gY2FwYWNpdHk7XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IDA7XG4gICAgICAgIHRoaXMuX3dhaXRpbmcgPSBbXTtcbiAgICB9XG4gICAgbG9jayh0aHVuaykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fd2FpdGluZy5wdXNoKHsgdGh1bmssIHJlc29sdmUsIHJlamVjdCB9KTtcbiAgICAgICAgICAgIHRoaXMucnVuTmV4dCgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0IGFjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTtcbiAgICB9XG4gICAgcnVuTmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dhaXRpbmcubGVuZ3RoID09PSAwIHx8IHRoaXMuX2FjdGl2ZSA9PT0gdGhpcy5fY2FwYWNpdHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS50aW1lci5zZXRJbW1lZGlhdGUoKCkgPT4gdGhpcy5kb1J1bk5leHQoKSk7XG4gICAgfVxuICAgIGRvUnVuTmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dhaXRpbmcubGVuZ3RoID09PSAwIHx8IHRoaXMuX2FjdGl2ZSA9PT0gdGhpcy5fY2FwYWNpdHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5fd2FpdGluZy5zaGlmdCgpO1xuICAgICAgICB0aGlzLl9hY3RpdmUrKztcbiAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZSA+IHRoaXMuX2NhcGFjaXR5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRvIG1hbnkgdGh1bmtzIGFjdGl2ZWApO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXh0LnRodW5rKCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC50aGVuKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5yZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5OZXh0KCk7XG4gICAgICAgICAgICAgICAgfSwgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5yZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5OZXh0KCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICBuZXh0LnJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1bk5leHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgIG5leHQucmVqZWN0KGVycik7XG4gICAgICAgICAgICB0aGlzLnJ1bk5leHQoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuU2VtYXBob3JlID0gU2VtYXBob3JlO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXIgPSBleHBvcnRzLkFic3RyYWN0TWVzc2FnZVJlYWRlciA9IGV4cG9ydHMuTWVzc2FnZVJlYWRlciA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IGV2ZW50c18xID0gcmVxdWlyZShcIi4vZXZlbnRzXCIpO1xuY29uc3Qgc2VtYXBob3JlXzEgPSByZXF1aXJlKFwiLi9zZW1hcGhvcmVcIik7XG52YXIgTWVzc2FnZVJlYWRlcjtcbihmdW5jdGlvbiAoTWVzc2FnZVJlYWRlcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5saXN0ZW4pICYmIElzLmZ1bmMoY2FuZGlkYXRlLmRpc3Bvc2UpICYmXG4gICAgICAgICAgICBJcy5mdW5jKGNhbmRpZGF0ZS5vbkVycm9yKSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5vbkNsb3NlKSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5vblBhcnRpYWxNZXNzYWdlKTtcbiAgICB9XG4gICAgTWVzc2FnZVJlYWRlci5pcyA9IGlzO1xufSkoTWVzc2FnZVJlYWRlciB8fCAoZXhwb3J0cy5NZXNzYWdlUmVhZGVyID0gTWVzc2FnZVJlYWRlciA9IHt9KSk7XG5jbGFzcyBBYnN0cmFjdE1lc3NhZ2VSZWFkZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZUVtaXR0ZXIgPSBuZXcgZXZlbnRzXzEuRW1pdHRlcigpO1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlci5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgZ2V0IG9uRXJyb3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVycm9yRW1pdHRlci5ldmVudDtcbiAgICB9XG4gICAgZmlyZUVycm9yKGVycm9yKSB7XG4gICAgICAgIHRoaXMuZXJyb3JFbWl0dGVyLmZpcmUodGhpcy5hc0Vycm9yKGVycm9yKSk7XG4gICAgfVxuICAgIGdldCBvbkNsb3NlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9zZUVtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGZpcmVDbG9zZSgpIHtcbiAgICAgICAgdGhpcy5jbG9zZUVtaXR0ZXIuZmlyZSh1bmRlZmluZWQpO1xuICAgIH1cbiAgICBnZXQgb25QYXJ0aWFsTWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFydGlhbE1lc3NhZ2VFbWl0dGVyLmV2ZW50O1xuICAgIH1cbiAgICBmaXJlUGFydGlhbE1lc3NhZ2UoaW5mbykge1xuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlRW1pdHRlci5maXJlKGluZm8pO1xuICAgIH1cbiAgICBhc0Vycm9yKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKGBSZWFkZXIgcmVjZWl2ZWQgZXJyb3IuIFJlYXNvbjogJHtJcy5zdHJpbmcoZXJyb3IubWVzc2FnZSkgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24nfWApO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VSZWFkZXIgPSBBYnN0cmFjdE1lc3NhZ2VSZWFkZXI7XG52YXIgUmVzb2x2ZWRNZXNzYWdlUmVhZGVyT3B0aW9ucztcbihmdW5jdGlvbiAoUmVzb2x2ZWRNZXNzYWdlUmVhZGVyT3B0aW9ucykge1xuICAgIGZ1bmN0aW9uIGZyb21PcHRpb25zKG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IGNoYXJzZXQ7XG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIGxldCBjb250ZW50RGVjb2RlcjtcbiAgICAgICAgY29uc3QgY29udGVudERlY29kZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICBsZXQgY29udGVudFR5cGVEZWNvZGVyO1xuICAgICAgICBjb25zdCBjb250ZW50VHlwZURlY29kZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY2hhcnNldCA9IG9wdGlvbnMgPz8gJ3V0Zi04JztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNoYXJzZXQgPSBvcHRpb25zLmNoYXJzZXQgPz8gJ3V0Zi04JztcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnREZWNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50RGVjb2RlciA9IG9wdGlvbnMuY29udGVudERlY29kZXI7XG4gICAgICAgICAgICAgICAgY29udGVudERlY29kZXJzLnNldChjb250ZW50RGVjb2Rlci5uYW1lLCBjb250ZW50RGVjb2Rlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5jb250ZW50RGVjb2RlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGVjb2RlciBvZiBvcHRpb25zLmNvbnRlbnREZWNvZGVycykge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50RGVjb2RlcnMuc2V0KGRlY29kZXIubmFtZSwgZGVjb2Rlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuY29udGVudFR5cGVEZWNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXIgPSBvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcjtcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXJzLnNldChjb250ZW50VHlwZURlY29kZXIubmFtZSwgY29udGVudFR5cGVEZWNvZGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGVjb2RlciBvZiBvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGVEZWNvZGVycy5zZXQoZGVjb2Rlci5uYW1lLCBkZWNvZGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnRlbnRUeXBlRGVjb2RlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXIgPSAoMCwgcmFsXzEuZGVmYXVsdCkoKS5hcHBsaWNhdGlvbkpzb24uZGVjb2RlcjtcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlRGVjb2RlcnMuc2V0KGNvbnRlbnRUeXBlRGVjb2Rlci5uYW1lLCBjb250ZW50VHlwZURlY29kZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGNoYXJzZXQsIGNvbnRlbnREZWNvZGVyLCBjb250ZW50RGVjb2RlcnMsIGNvbnRlbnRUeXBlRGVjb2RlciwgY29udGVudFR5cGVEZWNvZGVycyB9O1xuICAgIH1cbiAgICBSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zLmZyb21PcHRpb25zID0gZnJvbU9wdGlvbnM7XG59KShSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zIHx8IChSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zID0ge30pKTtcbmNsYXNzIFJlYWRhYmxlU3RyZWFtTWVzc2FnZVJlYWRlciBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVJlYWRlciB7XG4gICAgY29uc3RydWN0b3IocmVhZGFibGUsIG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZSA9IHJlYWRhYmxlO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zLmZyb21PcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmJ1ZmZlciA9ICgwLCByYWxfMS5kZWZhdWx0KSgpLm1lc3NhZ2VCdWZmZXIuY3JlYXRlKHRoaXMub3B0aW9ucy5jaGFyc2V0KTtcbiAgICAgICAgdGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0ID0gMTAwMDA7XG4gICAgICAgIHRoaXMubmV4dE1lc3NhZ2VMZW5ndGggPSAtMTtcbiAgICAgICAgdGhpcy5tZXNzYWdlVG9rZW4gPSAwO1xuICAgICAgICB0aGlzLnJlYWRTZW1hcGhvcmUgPSBuZXcgc2VtYXBob3JlXzEuU2VtYXBob3JlKDEpO1xuICAgIH1cbiAgICBzZXQgcGFydGlhbE1lc3NhZ2VUaW1lb3V0KHRpbWVvdXQpIHtcbiAgICAgICAgdGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0ID0gdGltZW91dDtcbiAgICB9XG4gICAgZ2V0IHBhcnRpYWxNZXNzYWdlVGltZW91dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dDtcbiAgICB9XG4gICAgbGlzdGVuKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMubmV4dE1lc3NhZ2VMZW5ndGggPSAtMTtcbiAgICAgICAgdGhpcy5tZXNzYWdlVG9rZW4gPSAwO1xuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlVGltZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5yZWFkYWJsZS5vbkRhdGEoKGRhdGEpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25EYXRhKGRhdGEpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZS5vbkVycm9yKChlcnJvcikgPT4gdGhpcy5maXJlRXJyb3IoZXJyb3IpKTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZS5vbkNsb3NlKCgpID0+IHRoaXMuZmlyZUNsb3NlKCkpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBvbkRhdGEoZGF0YSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5idWZmZXIuYXBwZW5kKGRhdGEpO1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IHRoaXMuYnVmZmVyLnRyeVJlYWRIZWFkZXJzKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50TGVuZ3RoID0gaGVhZGVycy5nZXQoJ2NvbnRlbnQtbGVuZ3RoJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY29udGVudExlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IobmV3IEVycm9yKGBIZWFkZXIgbXVzdCBwcm92aWRlIGEgQ29udGVudC1MZW5ndGggcHJvcGVydHkuXFxuJHtKU09OLnN0cmluZ2lmeShPYmplY3QuZnJvbUVudHJpZXMoaGVhZGVycykpfWApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsZW5ndGggPSBwYXJzZUludChjb250ZW50TGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKGxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKG5ldyBFcnJvcihgQ29udGVudC1MZW5ndGggdmFsdWUgbXVzdCBiZSBhIG51bWJlci4gR290ICR7Y29udGVudExlbmd0aH1gKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IHRoaXMuYnVmZmVyLnRyeVJlYWRCb2R5KHRoaXMubmV4dE1lc3NhZ2VMZW5ndGgpO1xuICAgICAgICAgICAgICAgIGlmIChib2R5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLyoqIFdlIGhhdmVuJ3QgcmVjZWl2ZWQgdGhlIGZ1bGwgbWVzc2FnZSB5ZXQuICovXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0UGFydGlhbE1lc3NhZ2VUaW1lcigpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJQYXJ0aWFsTWVzc2FnZVRpbWVyKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9IC0xO1xuICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHdlIGNvbnZlcnQgb25lIHJlY2VpdmVkIG1lc3NhZ2UgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAgICAgLy8gb3RoZXIuIE90aGVyd2lzZSBpdCBjb3VsZCBoYXBwZW4gdGhhdCBhIGRlY29kaW5nIG9mIGEgc2Vjb25kXG4gICAgICAgICAgICAgICAgLy8gc21hbGxlciBtZXNzYWdlIGZpbmlzaGVkIGJlZm9yZSB0aGUgZGVjb2Rpbmcgb2YgYSBmaXJzdCBsYXJnZXJcbiAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIGFuZCB0aGVuIHdlIHdvdWxkIGRlbGl2ZXIgdGhlIHNlY29uZCBtZXNzYWdlIGZpcnN0LlxuICAgICAgICAgICAgICAgIHRoaXMucmVhZFNlbWFwaG9yZS5sb2NrKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnl0ZXMgPSB0aGlzLm9wdGlvbnMuY29udGVudERlY29kZXIgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBhd2FpdCB0aGlzLm9wdGlvbnMuY29udGVudERlY29kZXIuZGVjb2RlKGJvZHkpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGJvZHk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBhd2FpdCB0aGlzLm9wdGlvbnMuY29udGVudFR5cGVEZWNvZGVyLmRlY29kZShieXRlcywgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjayhtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNsZWFyUGFydGlhbE1lc3NhZ2VUaW1lcigpIHtcbiAgICAgICAgaWYgKHRoaXMucGFydGlhbE1lc3NhZ2VUaW1lcikge1xuICAgICAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZVRpbWVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRoaXMucGFydGlhbE1lc3NhZ2VUaW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRQYXJ0aWFsTWVzc2FnZVRpbWVyKCkge1xuICAgICAgICB0aGlzLmNsZWFyUGFydGlhbE1lc3NhZ2VUaW1lcigpO1xuICAgICAgICBpZiAodGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0IDw9IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlVGltZXIgPSAoMCwgcmFsXzEuZGVmYXVsdCkoKS50aW1lci5zZXRUaW1lb3V0KCh0b2tlbiwgdGltZW91dCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZVRpbWVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRva2VuID09PSB0aGlzLm1lc3NhZ2VUb2tlbikge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZVBhcnRpYWxNZXNzYWdlKHsgbWVzc2FnZVRva2VuOiB0b2tlbiwgd2FpdGluZ1RpbWU6IHRpbWVvdXQgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRQYXJ0aWFsTWVzc2FnZVRpbWVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dCwgdGhpcy5tZXNzYWdlVG9rZW4sIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dCk7XG4gICAgfVxufVxuZXhwb3J0cy5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXIgPSBSZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLldyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLkFic3RyYWN0TWVzc2FnZVdyaXRlciA9IGV4cG9ydHMuTWVzc2FnZVdyaXRlciA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IHNlbWFwaG9yZV8xID0gcmVxdWlyZShcIi4vc2VtYXBob3JlXCIpO1xuY29uc3QgZXZlbnRzXzEgPSByZXF1aXJlKFwiLi9ldmVudHNcIik7XG5jb25zdCBDb250ZW50TGVuZ3RoID0gJ0NvbnRlbnQtTGVuZ3RoOiAnO1xuY29uc3QgQ1JMRiA9ICdcXHJcXG4nO1xudmFyIE1lc3NhZ2VXcml0ZXI7XG4oZnVuY3Rpb24gKE1lc3NhZ2VXcml0ZXIpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgSXMuZnVuYyhjYW5kaWRhdGUuZGlzcG9zZSkgJiYgSXMuZnVuYyhjYW5kaWRhdGUub25DbG9zZSkgJiZcbiAgICAgICAgICAgIElzLmZ1bmMoY2FuZGlkYXRlLm9uRXJyb3IpICYmIElzLmZ1bmMoY2FuZGlkYXRlLndyaXRlKTtcbiAgICB9XG4gICAgTWVzc2FnZVdyaXRlci5pcyA9IGlzO1xufSkoTWVzc2FnZVdyaXRlciB8fCAoZXhwb3J0cy5NZXNzYWdlV3JpdGVyID0gTWVzc2FnZVdyaXRlciA9IHt9KSk7XG5jbGFzcyBBYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy5lcnJvckVtaXR0ZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLmNsb3NlRW1pdHRlci5kaXNwb3NlKCk7XG4gICAgfVxuICAgIGdldCBvbkVycm9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lcnJvckVtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGZpcmVFcnJvcihlcnJvciwgbWVzc2FnZSwgY291bnQpIHtcbiAgICAgICAgdGhpcy5lcnJvckVtaXR0ZXIuZmlyZShbdGhpcy5hc0Vycm9yKGVycm9yKSwgbWVzc2FnZSwgY291bnRdKTtcbiAgICB9XG4gICAgZ2V0IG9uQ2xvc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb3NlRW1pdHRlci5ldmVudDtcbiAgICB9XG4gICAgZmlyZUNsb3NlKCkge1xuICAgICAgICB0aGlzLmNsb3NlRW1pdHRlci5maXJlKHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIGFzRXJyb3IoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoYFdyaXRlciByZWNlaXZlZCBlcnJvci4gUmVhc29uOiAke0lzLnN0cmluZyhlcnJvci5tZXNzYWdlKSA/IGVycm9yLm1lc3NhZ2UgOiAndW5rbm93bid9YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLkFic3RyYWN0TWVzc2FnZVdyaXRlciA9IEFic3RyYWN0TWVzc2FnZVdyaXRlcjtcbnZhciBSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zO1xuKGZ1bmN0aW9uIChSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zKSB7XG4gICAgZnVuY3Rpb24gZnJvbU9wdGlvbnMob3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHsgY2hhcnNldDogb3B0aW9ucyA/PyAndXRmLTgnLCBjb250ZW50VHlwZUVuY29kZXI6ICgwLCByYWxfMS5kZWZhdWx0KSgpLmFwcGxpY2F0aW9uSnNvbi5lbmNvZGVyIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4geyBjaGFyc2V0OiBvcHRpb25zLmNoYXJzZXQgPz8gJ3V0Zi04JywgY29udGVudEVuY29kZXI6IG9wdGlvbnMuY29udGVudEVuY29kZXIsIGNvbnRlbnRUeXBlRW5jb2Rlcjogb3B0aW9ucy5jb250ZW50VHlwZUVuY29kZXIgPz8gKDAsIHJhbF8xLmRlZmF1bHQpKCkuYXBwbGljYXRpb25Kc29uLmVuY29kZXIgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zLmZyb21PcHRpb25zID0gZnJvbU9wdGlvbnM7XG59KShSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zIHx8IChSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zID0ge30pKTtcbmNsYXNzIFdyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKHdyaXRhYmxlLCBvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMud3JpdGFibGUgPSB3cml0YWJsZTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gUmVzb2x2ZWRNZXNzYWdlV3JpdGVyT3B0aW9ucy5mcm9tT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50ID0gMDtcbiAgICAgICAgdGhpcy53cml0ZVNlbWFwaG9yZSA9IG5ldyBzZW1hcGhvcmVfMS5TZW1hcGhvcmUoMSk7XG4gICAgICAgIHRoaXMud3JpdGFibGUub25FcnJvcigoZXJyb3IpID0+IHRoaXMuZmlyZUVycm9yKGVycm9yKSk7XG4gICAgICAgIHRoaXMud3JpdGFibGUub25DbG9zZSgoKSA9PiB0aGlzLmZpcmVDbG9zZSgpKTtcbiAgICB9XG4gICAgYXN5bmMgd3JpdGUobXNnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndyaXRlU2VtYXBob3JlLmxvY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHRoaXMub3B0aW9ucy5jb250ZW50VHlwZUVuY29kZXIuZW5jb2RlKG1zZywgdGhpcy5vcHRpb25zKS50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNvbnRlbnRFbmNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jb250ZW50RW5jb2Rlci5lbmNvZGUoYnVmZmVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZC50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJzID0gW107XG4gICAgICAgICAgICAgICAgaGVhZGVycy5wdXNoKENvbnRlbnRMZW5ndGgsIGJ1ZmZlci5ieXRlTGVuZ3RoLnRvU3RyaW5nKCksIENSTEYpO1xuICAgICAgICAgICAgICAgIGhlYWRlcnMucHVzaChDUkxGKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kb1dyaXRlKG1zZywgaGVhZGVycywgYnVmZmVyKTtcbiAgICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgZG9Xcml0ZShtc2csIGhlYWRlcnMsIGRhdGEpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMud3JpdGFibGUud3JpdGUoaGVhZGVycy5qb2luKCcnKSwgJ2FzY2lpJyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy53cml0YWJsZS53cml0ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IsIG1zZyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZUVycm9yKGVycm9yLCBtc2cpIHtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50Kys7XG4gICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yLCBtc2csIHRoaXMuZXJyb3JDb3VudCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICAgICAgdGhpcy53cml0YWJsZS5lbmQoKTtcbiAgICB9XG59XG5leHBvcnRzLldyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgPSBXcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkFic3RyYWN0TWVzc2FnZUJ1ZmZlciA9IHZvaWQgMDtcbmNvbnN0IENSID0gMTM7XG5jb25zdCBMRiA9IDEwO1xuY29uc3QgQ1JMRiA9ICdcXHJcXG4nO1xuY2xhc3MgQWJzdHJhY3RNZXNzYWdlQnVmZmVyIHtcbiAgICBjb25zdHJ1Y3RvcihlbmNvZGluZyA9ICd1dGYtOCcpIHtcbiAgICAgICAgdGhpcy5fZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgICAgICAgdGhpcy5fY2h1bmtzID0gW107XG4gICAgICAgIHRoaXMuX3RvdGFsTGVuZ3RoID0gMDtcbiAgICB9XG4gICAgZ2V0IGVuY29kaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW5jb2Rpbmc7XG4gICAgfVxuICAgIGFwcGVuZChjaHVuaykge1xuICAgICAgICBjb25zdCB0b0FwcGVuZCA9IHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZycgPyB0aGlzLmZyb21TdHJpbmcoY2h1bmssIHRoaXMuX2VuY29kaW5nKSA6IGNodW5rO1xuICAgICAgICB0aGlzLl9jaHVua3MucHVzaCh0b0FwcGVuZCk7XG4gICAgICAgIHRoaXMuX3RvdGFsTGVuZ3RoICs9IHRvQXBwZW5kLmJ5dGVMZW5ndGg7XG4gICAgfVxuICAgIHRyeVJlYWRIZWFkZXJzKGxvd2VyQ2FzZUtleXMgPSBmYWxzZSkge1xuICAgICAgICBpZiAodGhpcy5fY2h1bmtzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3RhdGUgPSAwO1xuICAgICAgICBsZXQgY2h1bmtJbmRleCA9IDA7XG4gICAgICAgIGxldCBvZmZzZXQgPSAwO1xuICAgICAgICBsZXQgY2h1bmtCeXRlc1JlYWQgPSAwO1xuICAgICAgICByb3c6IHdoaWxlIChjaHVua0luZGV4IDwgdGhpcy5fY2h1bmtzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgY2h1bmsgPSB0aGlzLl9jaHVua3NbY2h1bmtJbmRleF07XG4gICAgICAgICAgICBvZmZzZXQgPSAwO1xuICAgICAgICAgICAgY29sdW1uOiB3aGlsZSAob2Zmc2V0IDwgY2h1bmsubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjaHVua1tvZmZzZXRdO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDUjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIExGOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gNDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHJvdztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjaHVua0J5dGVzUmVhZCArPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgY2h1bmtJbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZSAhPT0gNCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgYnVmZmVyIGNvbnRhaW5zIHRoZSB0d28gQ1JMRiBhdCB0aGUgZW5kLiBTbyB3ZSB3aWxsXG4gICAgICAgIC8vIGhhdmUgdHdvIGVtcHR5IGxpbmVzIGFmdGVyIHRoZSBzcGxpdCBhdCB0aGUgZW5kIGFzIHdlbGwuXG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuX3JlYWQoY2h1bmtCeXRlc1JlYWQgKyBvZmZzZXQpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwKCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLnRvU3RyaW5nKGJ1ZmZlciwgJ2FzY2lpJykuc3BsaXQoQ1JMRik7XG4gICAgICAgIGlmIChoZWFkZXJzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXJzLmxlbmd0aCAtIDI7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaGVhZGVyID0gaGVhZGVyc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gaGVhZGVyLmluZGV4T2YoJzonKTtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1lc3NhZ2UgaGVhZGVyIG11c3Qgc2VwYXJhdGUga2V5IGFuZCB2YWx1ZSB1c2luZyAnOidcXG4ke2hlYWRlcn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGhlYWRlci5zdWJzdHIoMCwgaW5kZXgpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBoZWFkZXIuc3Vic3RyKGluZGV4ICsgMSkudHJpbSgpO1xuICAgICAgICAgICAgcmVzdWx0LnNldChsb3dlckNhc2VLZXlzID8ga2V5LnRvTG93ZXJDYXNlKCkgOiBrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICB0cnlSZWFkQm9keShsZW5ndGgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3RvdGFsTGVuZ3RoIDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkKGxlbmd0aCk7XG4gICAgfVxuICAgIGdldCBudW1iZXJPZkJ5dGVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdG90YWxMZW5ndGg7XG4gICAgfVxuICAgIF9yZWFkKGJ5dGVDb3VudCkge1xuICAgICAgICBpZiAoYnl0ZUNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbXB0eUJ1ZmZlcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChieXRlQ291bnQgPiB0aGlzLl90b3RhbExlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVhZCBzbyBtYW55IGJ5dGVzIWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jaHVua3NbMF0uYnl0ZUxlbmd0aCA9PT0gYnl0ZUNvdW50KSB7XG4gICAgICAgICAgICAvLyBzdXBlciBmYXN0IHBhdGgsIHByZWNpc2VseSBmaXJzdCBjaHVuayBtdXN0IGJlIHJldHVybmVkXG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1swXTtcbiAgICAgICAgICAgIHRoaXMuX2NodW5rcy5zaGlmdCgpO1xuICAgICAgICAgICAgdGhpcy5fdG90YWxMZW5ndGggLT0gYnl0ZUNvdW50O1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXNOYXRpdmUoY2h1bmspO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jaHVua3NbMF0uYnl0ZUxlbmd0aCA+IGJ5dGVDb3VudCkge1xuICAgICAgICAgICAgLy8gZmFzdCBwYXRoLCB0aGUgcmVhZGluZyBpcyBlbnRpcmVseSB3aXRoaW4gdGhlIGZpcnN0IGNodW5rXG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1swXTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuYXNOYXRpdmUoY2h1bmssIGJ5dGVDb3VudCk7XG4gICAgICAgICAgICB0aGlzLl9jaHVua3NbMF0gPSBjaHVuay5zbGljZShieXRlQ291bnQpO1xuICAgICAgICAgICAgdGhpcy5fdG90YWxMZW5ndGggLT0gYnl0ZUNvdW50O1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmFsbG9jTmF0aXZlKGJ5dGVDb3VudCk7XG4gICAgICAgIGxldCByZXN1bHRPZmZzZXQgPSAwO1xuICAgICAgICBsZXQgY2h1bmtJbmRleCA9IDA7XG4gICAgICAgIHdoaWxlIChieXRlQ291bnQgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1tjaHVua0luZGV4XTtcbiAgICAgICAgICAgIGlmIChjaHVuay5ieXRlTGVuZ3RoID4gYnl0ZUNvdW50KSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBjaHVuayB3aWxsIHN1cnZpdmVcbiAgICAgICAgICAgICAgICBjb25zdCBjaHVua1BhcnQgPSBjaHVuay5zbGljZSgwLCBieXRlQ291bnQpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5zZXQoY2h1bmtQYXJ0LCByZXN1bHRPZmZzZXQpO1xuICAgICAgICAgICAgICAgIHJlc3VsdE9mZnNldCArPSBieXRlQ291bnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2h1bmtzW2NodW5rSW5kZXhdID0gY2h1bmsuc2xpY2UoYnl0ZUNvdW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLl90b3RhbExlbmd0aCAtPSBieXRlQ291bnQ7XG4gICAgICAgICAgICAgICAgYnl0ZUNvdW50IC09IGJ5dGVDb3VudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHRoaXMgY2h1bmsgd2lsbCBiZSBlbnRpcmVseSByZWFkXG4gICAgICAgICAgICAgICAgcmVzdWx0LnNldChjaHVuaywgcmVzdWx0T2Zmc2V0KTtcbiAgICAgICAgICAgICAgICByZXN1bHRPZmZzZXQgKz0gY2h1bmsuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgICAgICB0aGlzLl9jaHVua3Muc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl90b3RhbExlbmd0aCAtPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgICAgIGJ5dGVDb3VudCAtPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VCdWZmZXIgPSBBYnN0cmFjdE1lc3NhZ2VCdWZmZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uID0gZXhwb3J0cy5Db25uZWN0aW9uT3B0aW9ucyA9IGV4cG9ydHMuTWVzc2FnZVN0cmF0ZWd5ID0gZXhwb3J0cy5DYW5jZWxsYXRpb25TdHJhdGVneSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gZXhwb3J0cy5JZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IGV4cG9ydHMuQ29ubmVjdGlvbkVycm9yID0gZXhwb3J0cy5Db25uZWN0aW9uRXJyb3JzID0gZXhwb3J0cy5Mb2dUcmFjZU5vdGlmaWNhdGlvbiA9IGV4cG9ydHMuU2V0VHJhY2VOb3RpZmljYXRpb24gPSBleHBvcnRzLlRyYWNlRm9ybWF0ID0gZXhwb3J0cy5UcmFjZVZhbHVlcyA9IGV4cG9ydHMuVHJhY2UgPSBleHBvcnRzLk51bGxMb2dnZXIgPSBleHBvcnRzLlByb2dyZXNzVHlwZSA9IGV4cG9ydHMuUHJvZ3Jlc3NUb2tlbiA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IG1lc3NhZ2VzXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlc1wiKTtcbmNvbnN0IGxpbmtlZE1hcF8xID0gcmVxdWlyZShcIi4vbGlua2VkTWFwXCIpO1xuY29uc3QgZXZlbnRzXzEgPSByZXF1aXJlKFwiLi9ldmVudHNcIik7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbnZhciBDYW5jZWxOb3RpZmljYXRpb247XG4oZnVuY3Rpb24gKENhbmNlbE5vdGlmaWNhdGlvbikge1xuICAgIENhbmNlbE5vdGlmaWNhdGlvbi50eXBlID0gbmV3IG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZSgnJC9jYW5jZWxSZXF1ZXN0Jyk7XG59KShDYW5jZWxOb3RpZmljYXRpb24gfHwgKENhbmNlbE5vdGlmaWNhdGlvbiA9IHt9KSk7XG52YXIgUHJvZ3Jlc3NUb2tlbjtcbihmdW5jdGlvbiAoUHJvZ3Jlc3NUb2tlbikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG4gICAgfVxuICAgIFByb2dyZXNzVG9rZW4uaXMgPSBpcztcbn0pKFByb2dyZXNzVG9rZW4gfHwgKGV4cG9ydHMuUHJvZ3Jlc3NUb2tlbiA9IFByb2dyZXNzVG9rZW4gPSB7fSkpO1xudmFyIFByb2dyZXNzTm90aWZpY2F0aW9uO1xuKGZ1bmN0aW9uIChQcm9ncmVzc05vdGlmaWNhdGlvbikge1xuICAgIFByb2dyZXNzTm90aWZpY2F0aW9uLnR5cGUgPSBuZXcgbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlKCckL3Byb2dyZXNzJyk7XG59KShQcm9ncmVzc05vdGlmaWNhdGlvbiB8fCAoUHJvZ3Jlc3NOb3RpZmljYXRpb24gPSB7fSkpO1xuY2xhc3MgUHJvZ3Jlc3NUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICB9XG59XG5leHBvcnRzLlByb2dyZXNzVHlwZSA9IFByb2dyZXNzVHlwZTtcbnZhciBTdGFyUmVxdWVzdEhhbmRsZXI7XG4oZnVuY3Rpb24gKFN0YXJSZXF1ZXN0SGFuZGxlcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBJcy5mdW5jKHZhbHVlKTtcbiAgICB9XG4gICAgU3RhclJlcXVlc3RIYW5kbGVyLmlzID0gaXM7XG59KShTdGFyUmVxdWVzdEhhbmRsZXIgfHwgKFN0YXJSZXF1ZXN0SGFuZGxlciA9IHt9KSk7XG5leHBvcnRzLk51bGxMb2dnZXIgPSBPYmplY3QuZnJlZXplKHtcbiAgICBlcnJvcjogKCkgPT4geyB9LFxuICAgIHdhcm46ICgpID0+IHsgfSxcbiAgICBpbmZvOiAoKSA9PiB7IH0sXG4gICAgbG9nOiAoKSA9PiB7IH1cbn0pO1xudmFyIFRyYWNlO1xuKGZ1bmN0aW9uIChUcmFjZSkge1xuICAgIFRyYWNlW1RyYWNlW1wiT2ZmXCJdID0gMF0gPSBcIk9mZlwiO1xuICAgIFRyYWNlW1RyYWNlW1wiTWVzc2FnZXNcIl0gPSAxXSA9IFwiTWVzc2FnZXNcIjtcbiAgICBUcmFjZVtUcmFjZVtcIkNvbXBhY3RcIl0gPSAyXSA9IFwiQ29tcGFjdFwiO1xuICAgIFRyYWNlW1RyYWNlW1wiVmVyYm9zZVwiXSA9IDNdID0gXCJWZXJib3NlXCI7XG59KShUcmFjZSB8fCAoZXhwb3J0cy5UcmFjZSA9IFRyYWNlID0ge30pKTtcbnZhciBUcmFjZVZhbHVlcztcbihmdW5jdGlvbiAoVHJhY2VWYWx1ZXMpIHtcbiAgICAvKipcbiAgICAgKiBUdXJuIHRyYWNpbmcgb2ZmLlxuICAgICAqL1xuICAgIFRyYWNlVmFsdWVzLk9mZiA9ICdvZmYnO1xuICAgIC8qKlxuICAgICAqIFRyYWNlIG1lc3NhZ2VzIG9ubHkuXG4gICAgICovXG4gICAgVHJhY2VWYWx1ZXMuTWVzc2FnZXMgPSAnbWVzc2FnZXMnO1xuICAgIC8qKlxuICAgICAqIENvbXBhY3QgbWVzc2FnZSB0cmFjaW5nLlxuICAgICAqL1xuICAgIFRyYWNlVmFsdWVzLkNvbXBhY3QgPSAnY29tcGFjdCc7XG4gICAgLyoqXG4gICAgICogVmVyYm9zZSBtZXNzYWdlIHRyYWNpbmcuXG4gICAgICovXG4gICAgVHJhY2VWYWx1ZXMuVmVyYm9zZSA9ICd2ZXJib3NlJztcbn0pKFRyYWNlVmFsdWVzIHx8IChleHBvcnRzLlRyYWNlVmFsdWVzID0gVHJhY2VWYWx1ZXMgPSB7fSkpO1xuKGZ1bmN0aW9uIChUcmFjZSkge1xuICAgIGZ1bmN0aW9uIGZyb21TdHJpbmcodmFsdWUpIHtcbiAgICAgICAgaWYgKCFJcy5zdHJpbmcodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gVHJhY2UuT2ZmO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSAnb2ZmJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gVHJhY2UuT2ZmO1xuICAgICAgICAgICAgY2FzZSAnbWVzc2FnZXMnOlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5NZXNzYWdlcztcbiAgICAgICAgICAgIGNhc2UgJ2NvbXBhY3QnOlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5Db21wYWN0O1xuICAgICAgICAgICAgY2FzZSAndmVyYm9zZSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFRyYWNlLlZlcmJvc2U7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5PZmY7XG4gICAgICAgIH1cbiAgICB9XG4gICAgVHJhY2UuZnJvbVN0cmluZyA9IGZyb21TdHJpbmc7XG4gICAgZnVuY3Rpb24gdG9TdHJpbmcodmFsdWUpIHtcbiAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5PZmY6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdvZmYnO1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5NZXNzYWdlczpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ21lc3NhZ2VzJztcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuQ29tcGFjdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2NvbXBhY3QnO1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5WZXJib3NlOlxuICAgICAgICAgICAgICAgIHJldHVybiAndmVyYm9zZSc7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAnb2ZmJztcbiAgICAgICAgfVxuICAgIH1cbiAgICBUcmFjZS50b1N0cmluZyA9IHRvU3RyaW5nO1xufSkoVHJhY2UgfHwgKGV4cG9ydHMuVHJhY2UgPSBUcmFjZSA9IHt9KSk7XG52YXIgVHJhY2VGb3JtYXQ7XG4oZnVuY3Rpb24gKFRyYWNlRm9ybWF0KSB7XG4gICAgVHJhY2VGb3JtYXRbXCJUZXh0XCJdID0gXCJ0ZXh0XCI7XG4gICAgVHJhY2VGb3JtYXRbXCJKU09OXCJdID0gXCJqc29uXCI7XG59KShUcmFjZUZvcm1hdCB8fCAoZXhwb3J0cy5UcmFjZUZvcm1hdCA9IFRyYWNlRm9ybWF0ID0ge30pKTtcbihmdW5jdGlvbiAoVHJhY2VGb3JtYXQpIHtcbiAgICBmdW5jdGlvbiBmcm9tU3RyaW5nKHZhbHVlKSB7XG4gICAgICAgIGlmICghSXMuc3RyaW5nKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIFRyYWNlRm9ybWF0LlRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAodmFsdWUgPT09ICdqc29uJykge1xuICAgICAgICAgICAgcmV0dXJuIFRyYWNlRm9ybWF0LkpTT047XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gVHJhY2VGb3JtYXQuVGV4dDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBUcmFjZUZvcm1hdC5mcm9tU3RyaW5nID0gZnJvbVN0cmluZztcbn0pKFRyYWNlRm9ybWF0IHx8IChleHBvcnRzLlRyYWNlRm9ybWF0ID0gVHJhY2VGb3JtYXQgPSB7fSkpO1xudmFyIFNldFRyYWNlTm90aWZpY2F0aW9uO1xuKGZ1bmN0aW9uIChTZXRUcmFjZU5vdGlmaWNhdGlvbikge1xuICAgIFNldFRyYWNlTm90aWZpY2F0aW9uLnR5cGUgPSBuZXcgbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlKCckL3NldFRyYWNlJyk7XG59KShTZXRUcmFjZU5vdGlmaWNhdGlvbiB8fCAoZXhwb3J0cy5TZXRUcmFjZU5vdGlmaWNhdGlvbiA9IFNldFRyYWNlTm90aWZpY2F0aW9uID0ge30pKTtcbnZhciBMb2dUcmFjZU5vdGlmaWNhdGlvbjtcbihmdW5jdGlvbiAoTG9nVHJhY2VOb3RpZmljYXRpb24pIHtcbiAgICBMb2dUcmFjZU5vdGlmaWNhdGlvbi50eXBlID0gbmV3IG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZSgnJC9sb2dUcmFjZScpO1xufSkoTG9nVHJhY2VOb3RpZmljYXRpb24gfHwgKGV4cG9ydHMuTG9nVHJhY2VOb3RpZmljYXRpb24gPSBMb2dUcmFjZU5vdGlmaWNhdGlvbiA9IHt9KSk7XG52YXIgQ29ubmVjdGlvbkVycm9ycztcbihmdW5jdGlvbiAoQ29ubmVjdGlvbkVycm9ycykge1xuICAgIC8qKlxuICAgICAqIFRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZC5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uRXJyb3JzW0Nvbm5lY3Rpb25FcnJvcnNbXCJDbG9zZWRcIl0gPSAxXSA9IFwiQ2xvc2VkXCI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gZ290IGRpc3Bvc2VkLlxuICAgICAqL1xuICAgIENvbm5lY3Rpb25FcnJvcnNbQ29ubmVjdGlvbkVycm9yc1tcIkRpc3Bvc2VkXCJdID0gMl0gPSBcIkRpc3Bvc2VkXCI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBpbiBsaXN0ZW5pbmcgbW9kZS5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uRXJyb3JzW0Nvbm5lY3Rpb25FcnJvcnNbXCJBbHJlYWR5TGlzdGVuaW5nXCJdID0gM10gPSBcIkFscmVhZHlMaXN0ZW5pbmdcIjtcbn0pKENvbm5lY3Rpb25FcnJvcnMgfHwgKGV4cG9ydHMuQ29ubmVjdGlvbkVycm9ycyA9IENvbm5lY3Rpb25FcnJvcnMgPSB7fSkpO1xuY2xhc3MgQ29ubmVjdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNvZGUsIG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBDb25uZWN0aW9uRXJyb3IucHJvdG90eXBlKTtcbiAgICB9XG59XG5leHBvcnRzLkNvbm5lY3Rpb25FcnJvciA9IENvbm5lY3Rpb25FcnJvcjtcbnZhciBDb25uZWN0aW9uU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENvbm5lY3Rpb25TdHJhdGVneSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNhbmNlbFVuZGlzcGF0Y2hlZCk7XG4gICAgfVxuICAgIENvbm5lY3Rpb25TdHJhdGVneS5pcyA9IGlzO1xufSkoQ29ubmVjdGlvblN0cmF0ZWd5IHx8IChleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IENvbm5lY3Rpb25TdHJhdGVneSA9IHt9KSk7XG52YXIgSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5O1xuKGZ1bmN0aW9uIChJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiAoY2FuZGlkYXRlLmtpbmQgPT09IHVuZGVmaW5lZCB8fCBjYW5kaWRhdGUua2luZCA9PT0gJ2lkJykgJiYgSXMuZnVuYyhjYW5kaWRhdGUuY3JlYXRlQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UpICYmIChjYW5kaWRhdGUuZGlzcG9zZSA9PT0gdW5kZWZpbmVkIHx8IElzLmZ1bmMoY2FuZGlkYXRlLmRpc3Bvc2UpKTtcbiAgICB9XG4gICAgSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzID0gaXM7XG59KShJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgfHwgKGV4cG9ydHMuSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0ge30pKTtcbnZhciBSZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneTtcbihmdW5jdGlvbiAoUmVxdWVzdENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBjYW5kaWRhdGUua2luZCA9PT0gJ3JlcXVlc3QnICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKSAmJiAoY2FuZGlkYXRlLmRpc3Bvc2UgPT09IHVuZGVmaW5lZCB8fCBJcy5mdW5jKGNhbmRpZGF0ZS5kaXNwb3NlKSk7XG4gICAgfVxuICAgIFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzID0gaXM7XG59KShSZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSB8fCAoZXhwb3J0cy5SZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0ge30pKTtcbnZhciBDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5O1xuKGZ1bmN0aW9uIChDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5NZXNzYWdlID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKF8pIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgY2FuY2VsbGF0aW9uXzEuQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UoKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kuaXModmFsdWUpIHx8IFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKHZhbHVlKTtcbiAgICB9XG4gICAgQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5pcyA9IGlzO1xufSkoQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSB8fCAoZXhwb3J0cy5DYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IHt9KSk7XG52YXIgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENhbmNlbGxhdGlvblNlbmRlclN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kuTWVzc2FnZSA9IE9iamVjdC5mcmVlemUoe1xuICAgICAgICBzZW5kQ2FuY2VsbGF0aW9uKGNvbm4sIGlkKSB7XG4gICAgICAgICAgICByZXR1cm4gY29ubi5zZW5kTm90aWZpY2F0aW9uKENhbmNlbE5vdGlmaWNhdGlvbi50eXBlLCB7IGlkIH0pO1xuICAgICAgICB9LFxuICAgICAgICBjbGVhbnVwKF8pIHsgfVxuICAgIH0pO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLnNlbmRDYW5jZWxsYXRpb24pICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNsZWFudXApO1xuICAgIH1cbiAgICBDYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneS5pcyA9IGlzO1xufSkoQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgfHwgKGV4cG9ydHMuQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgPSBDYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneSA9IHt9KSk7XG52YXIgQ2FuY2VsbGF0aW9uU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENhbmNlbGxhdGlvblN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uU3RyYXRlZ3kuTWVzc2FnZSA9IE9iamVjdC5mcmVlemUoe1xuICAgICAgICByZWNlaXZlcjogQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5NZXNzYWdlLFxuICAgICAgICBzZW5kZXI6IENhbmNlbGxhdGlvblNlbmRlclN0cmF0ZWd5Lk1lc3NhZ2VcbiAgICB9KTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKGNhbmRpZGF0ZS5yZWNlaXZlcikgJiYgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kuaXMoY2FuZGlkYXRlLnNlbmRlcik7XG4gICAgfVxuICAgIENhbmNlbGxhdGlvblN0cmF0ZWd5LmlzID0gaXM7XG59KShDYW5jZWxsYXRpb25TdHJhdGVneSB8fCAoZXhwb3J0cy5DYW5jZWxsYXRpb25TdHJhdGVneSA9IENhbmNlbGxhdGlvblN0cmF0ZWd5ID0ge30pKTtcbnZhciBNZXNzYWdlU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKE1lc3NhZ2VTdHJhdGVneSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLmhhbmRsZU1lc3NhZ2UpO1xuICAgIH1cbiAgICBNZXNzYWdlU3RyYXRlZ3kuaXMgPSBpcztcbn0pKE1lc3NhZ2VTdHJhdGVneSB8fCAoZXhwb3J0cy5NZXNzYWdlU3RyYXRlZ3kgPSBNZXNzYWdlU3RyYXRlZ3kgPSB7fSkpO1xudmFyIENvbm5lY3Rpb25PcHRpb25zO1xuKGZ1bmN0aW9uIChDb25uZWN0aW9uT3B0aW9ucykge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIChDYW5jZWxsYXRpb25TdHJhdGVneS5pcyhjYW5kaWRhdGUuY2FuY2VsbGF0aW9uU3RyYXRlZ3kpIHx8IENvbm5lY3Rpb25TdHJhdGVneS5pcyhjYW5kaWRhdGUuY29ubmVjdGlvblN0cmF0ZWd5KSB8fCBNZXNzYWdlU3RyYXRlZ3kuaXMoY2FuZGlkYXRlLm1lc3NhZ2VTdHJhdGVneSkpO1xuICAgIH1cbiAgICBDb25uZWN0aW9uT3B0aW9ucy5pcyA9IGlzO1xufSkoQ29ubmVjdGlvbk9wdGlvbnMgfHwgKGV4cG9ydHMuQ29ubmVjdGlvbk9wdGlvbnMgPSBDb25uZWN0aW9uT3B0aW9ucyA9IHt9KSk7XG52YXIgQ29ubmVjdGlvblN0YXRlO1xuKGZ1bmN0aW9uIChDb25uZWN0aW9uU3RhdGUpIHtcbiAgICBDb25uZWN0aW9uU3RhdGVbQ29ubmVjdGlvblN0YXRlW1wiTmV3XCJdID0gMV0gPSBcIk5ld1wiO1xuICAgIENvbm5lY3Rpb25TdGF0ZVtDb25uZWN0aW9uU3RhdGVbXCJMaXN0ZW5pbmdcIl0gPSAyXSA9IFwiTGlzdGVuaW5nXCI7XG4gICAgQ29ubmVjdGlvblN0YXRlW0Nvbm5lY3Rpb25TdGF0ZVtcIkNsb3NlZFwiXSA9IDNdID0gXCJDbG9zZWRcIjtcbiAgICBDb25uZWN0aW9uU3RhdGVbQ29ubmVjdGlvblN0YXRlW1wiRGlzcG9zZWRcIl0gPSA0XSA9IFwiRGlzcG9zZWRcIjtcbn0pKENvbm5lY3Rpb25TdGF0ZSB8fCAoQ29ubmVjdGlvblN0YXRlID0ge30pKTtcbmZ1bmN0aW9uIGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uKG1lc3NhZ2VSZWFkZXIsIG1lc3NhZ2VXcml0ZXIsIF9sb2dnZXIsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBsb2dnZXIgPSBfbG9nZ2VyICE9PSB1bmRlZmluZWQgPyBfbG9nZ2VyIDogZXhwb3J0cy5OdWxsTG9nZ2VyO1xuICAgIGxldCBzZXF1ZW5jZU51bWJlciA9IDA7XG4gICAgbGV0IG5vdGlmaWNhdGlvblNlcXVlbmNlTnVtYmVyID0gMDtcbiAgICBsZXQgdW5rbm93blJlc3BvbnNlU2VxdWVuY2VOdW1iZXIgPSAwO1xuICAgIGNvbnN0IHZlcnNpb24gPSAnMi4wJztcbiAgICBsZXQgc3RhclJlcXVlc3RIYW5kbGVyID0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlcXVlc3RIYW5kbGVycyA9IG5ldyBNYXAoKTtcbiAgICBsZXQgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgY29uc3Qgbm90aWZpY2F0aW9uSGFuZGxlcnMgPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgcHJvZ3Jlc3NIYW5kbGVycyA9IG5ldyBNYXAoKTtcbiAgICBsZXQgdGltZXI7XG4gICAgbGV0IG1lc3NhZ2VRdWV1ZSA9IG5ldyBsaW5rZWRNYXBfMS5MaW5rZWRNYXAoKTtcbiAgICBsZXQgcmVzcG9uc2VQcm9taXNlcyA9IG5ldyBNYXAoKTtcbiAgICBsZXQga25vd25DYW5jZWxlZFJlcXVlc3RzID0gbmV3IFNldCgpO1xuICAgIGxldCByZXF1ZXN0VG9rZW5zID0gbmV3IE1hcCgpO1xuICAgIGxldCB0cmFjZSA9IFRyYWNlLk9mZjtcbiAgICBsZXQgdHJhY2VGb3JtYXQgPSBUcmFjZUZvcm1hdC5UZXh0O1xuICAgIGxldCB0cmFjZXI7XG4gICAgbGV0IHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLk5ldztcbiAgICBjb25zdCBlcnJvckVtaXR0ZXIgPSBuZXcgZXZlbnRzXzEuRW1pdHRlcigpO1xuICAgIGNvbnN0IGNsb3NlRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgdW5oYW5kbGVkTm90aWZpY2F0aW9uRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgdW5oYW5kbGVkUHJvZ3Jlc3NFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICBjb25zdCBkaXNwb3NlRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgY2FuY2VsbGF0aW9uU3RyYXRlZ3kgPSAob3B0aW9ucyAmJiBvcHRpb25zLmNhbmNlbGxhdGlvblN0cmF0ZWd5KSA/IG9wdGlvbnMuY2FuY2VsbGF0aW9uU3RyYXRlZ3kgOiBDYW5jZWxsYXRpb25TdHJhdGVneS5NZXNzYWdlO1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlcXVlc3RRdWV1ZUtleShpZCkge1xuICAgICAgICBpZiAoaWQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuJ3Qgc2VuZCByZXF1ZXN0cyB3aXRoIGlkIG51bGwgc2luY2UgdGhlIHJlc3BvbnNlIGNhbid0IGJlIGNvcnJlbGF0ZWQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdyZXEtJyArIGlkLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlc3BvbnNlUXVldWVLZXkoaWQpIHtcbiAgICAgICAgaWYgKGlkID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3Jlcy11bmtub3duLScgKyAoKyt1bmtub3duUmVzcG9uc2VTZXF1ZW5jZU51bWJlcikudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAncmVzLScgKyBpZC50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZU5vdGlmaWNhdGlvblF1ZXVlS2V5KCkge1xuICAgICAgICByZXR1cm4gJ25vdC0nICsgKCsrbm90aWZpY2F0aW9uU2VxdWVuY2VOdW1iZXIpLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFkZE1lc3NhZ2VUb1F1ZXVlKHF1ZXVlLCBtZXNzYWdlKSB7XG4gICAgICAgIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXF1ZXN0KG1lc3NhZ2UpKSB7XG4gICAgICAgICAgICBxdWV1ZS5zZXQoY3JlYXRlUmVxdWVzdFF1ZXVlS2V5KG1lc3NhZ2UuaWQpLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXNwb25zZShtZXNzYWdlKSkge1xuICAgICAgICAgICAgcXVldWUuc2V0KGNyZWF0ZVJlc3BvbnNlUXVldWVLZXkobWVzc2FnZS5pZCksIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcXVldWUuc2V0KGNyZWF0ZU5vdGlmaWNhdGlvblF1ZXVlS2V5KCksIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNhbmNlbFVuZGlzcGF0Y2hlZChfbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0xpc3RlbmluZygpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlID09PSBDb25uZWN0aW9uU3RhdGUuTGlzdGVuaW5nO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0Nsb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlID09PSBDb25uZWN0aW9uU3RhdGUuQ2xvc2VkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0Rpc3Bvc2VkKCkge1xuICAgICAgICByZXR1cm4gc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5EaXNwb3NlZDtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2xvc2VIYW5kbGVyKCkge1xuICAgICAgICBpZiAoc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5OZXcgfHwgc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5MaXN0ZW5pbmcpIHtcbiAgICAgICAgICAgIHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLkNsb3NlZDtcbiAgICAgICAgICAgIGNsb3NlRW1pdHRlci5maXJlKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlIGNvbm5lY3Rpb24gaXMgZGlzcG9zZWQgZG9uJ3Qgc2VudCBjbG9zZSBldmVudHMuXG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlYWRFcnJvckhhbmRsZXIoZXJyb3IpIHtcbiAgICAgICAgZXJyb3JFbWl0dGVyLmZpcmUoW2Vycm9yLCB1bmRlZmluZWQsIHVuZGVmaW5lZF0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiB3cml0ZUVycm9ySGFuZGxlcihkYXRhKSB7XG4gICAgICAgIGVycm9yRW1pdHRlci5maXJlKGRhdGEpO1xuICAgIH1cbiAgICBtZXNzYWdlUmVhZGVyLm9uQ2xvc2UoY2xvc2VIYW5kbGVyKTtcbiAgICBtZXNzYWdlUmVhZGVyLm9uRXJyb3IocmVhZEVycm9ySGFuZGxlcik7XG4gICAgbWVzc2FnZVdyaXRlci5vbkNsb3NlKGNsb3NlSGFuZGxlcik7XG4gICAgbWVzc2FnZVdyaXRlci5vbkVycm9yKHdyaXRlRXJyb3JIYW5kbGVyKTtcbiAgICBmdW5jdGlvbiB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCkge1xuICAgICAgICBpZiAodGltZXIgfHwgbWVzc2FnZVF1ZXVlLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aW1lciA9ICgwLCByYWxfMS5kZWZhdWx0KSgpLnRpbWVyLnNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICAgICAgICB0aW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHByb2Nlc3NNZXNzYWdlUXVldWUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGhhbmRsZU1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICBpZiAobWVzc2FnZXNfMS5NZXNzYWdlLmlzUmVxdWVzdChtZXNzYWdlKSkge1xuICAgICAgICAgICAgaGFuZGxlUmVxdWVzdChtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNOb3RpZmljYXRpb24obWVzc2FnZSkpIHtcbiAgICAgICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvbihtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXNwb25zZShtZXNzYWdlKSkge1xuICAgICAgICAgICAgaGFuZGxlUmVzcG9uc2UobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBoYW5kbGVJbnZhbGlkTWVzc2FnZShtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBwcm9jZXNzTWVzc2FnZVF1ZXVlKCkge1xuICAgICAgICBpZiAobWVzc2FnZVF1ZXVlLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXNzYWdlID0gbWVzc2FnZVF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlU3RyYXRlZ3kgPSBvcHRpb25zPy5tZXNzYWdlU3RyYXRlZ3k7XG4gICAgICAgICAgICBpZiAoTWVzc2FnZVN0cmF0ZWd5LmlzKG1lc3NhZ2VTdHJhdGVneSkpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlU3RyYXRlZ3kuaGFuZGxlTWVzc2FnZShtZXNzYWdlLCBoYW5kbGVNZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGhhbmRsZU1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgY2FsbGJhY2sgPSAobWVzc2FnZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2UgaGF2ZSByZWNlaXZlZCBhIGNhbmNlbGxhdGlvbiBtZXNzYWdlLiBDaGVjayBpZiB0aGUgbWVzc2FnZSBpcyBzdGlsbCBpbiB0aGUgcXVldWVcbiAgICAgICAgICAgIC8vIGFuZCBjYW5jZWwgaXQgaWYgYWxsb3dlZCB0byBkbyBzby5cbiAgICAgICAgICAgIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNOb3RpZmljYXRpb24obWVzc2FnZSkgJiYgbWVzc2FnZS5tZXRob2QgPT09IENhbmNlbE5vdGlmaWNhdGlvbi50eXBlLm1ldGhvZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbmNlbElkID0gbWVzc2FnZS5wYXJhbXMuaWQ7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gY3JlYXRlUmVxdWVzdFF1ZXVlS2V5KGNhbmNlbElkKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0b0NhbmNlbCA9IG1lc3NhZ2VRdWV1ZS5nZXQoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZXNfMS5NZXNzYWdlLmlzUmVxdWVzdCh0b0NhbmNlbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyYXRlZ3kgPSBvcHRpb25zPy5jb25uZWN0aW9uU3RyYXRlZ3k7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gKHN0cmF0ZWd5ICYmIHN0cmF0ZWd5LmNhbmNlbFVuZGlzcGF0Y2hlZCkgPyBzdHJhdGVneS5jYW5jZWxVbmRpc3BhdGNoZWQodG9DYW5jZWwsIGNhbmNlbFVuZGlzcGF0Y2hlZCkgOiBjYW5jZWxVbmRpc3BhdGNoZWQodG9DYW5jZWwpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgJiYgKHJlc3BvbnNlLmVycm9yICE9PSB1bmRlZmluZWQgfHwgcmVzcG9uc2UucmVzdWx0ICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUXVldWUuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLmRlbGV0ZShjYW5jZWxJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5pZCA9IHRvQ2FuY2VsLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VTZW5kaW5nUmVzcG9uc2UocmVzcG9uc2UsIG1lc3NhZ2UubWV0aG9kLCBEYXRlLm5vdygpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUocmVzcG9uc2UpLmNhdGNoKCgpID0+IGxvZ2dlci5lcnJvcihgU2VuZGluZyByZXNwb25zZSBmb3IgY2FuY2VsZWQgbWVzc2FnZSBmYWlsZWQuYCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGNhbmNlbGxhdGlvblRva2VuID0gcmVxdWVzdFRva2Vucy5nZXQoY2FuY2VsSWQpO1xuICAgICAgICAgICAgICAgIC8vIFRoZSByZXF1ZXN0IGlzIGFscmVhZHkgcnVubmluZy4gQ2FuY2VsIHRoZSB0b2tlblxuICAgICAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbmNlbGxhdGlvblRva2VuLmNhbmNlbCgpO1xuICAgICAgICAgICAgICAgICAgICB0cmFjZVJlY2VpdmVkTm90aWZpY2F0aW9uKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZW1lbWJlciB0aGUgY2FuY2VsIGJ1dCBzdGlsbCBxdWV1ZSB0aGUgbWVzc2FnZSB0b1xuICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbiB1cCBzdGF0ZSBpbiBwcm9jZXNzIG1lc3NhZ2UuXG4gICAgICAgICAgICAgICAgICAgIGtub3duQ2FuY2VsZWRSZXF1ZXN0cy5hZGQoY2FuY2VsSWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFkZE1lc3NhZ2VUb1F1ZXVlKG1lc3NhZ2VRdWV1ZSwgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGZ1bmN0aW9uIGhhbmRsZVJlcXVlc3QocmVxdWVzdE1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgLy8gd2UgcmV0dXJuIGhlcmUgc2lsZW50bHkgc2luY2Ugd2UgZmlyZWQgYW4gZXZlbnQgd2hlbiB0aGVcbiAgICAgICAgICAgIC8vIGNvbm5lY3Rpb24gZ290IGRpc3Bvc2VkLlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHJlcGx5KHJlc3VsdE9yRXJyb3IsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgaWQ6IHJlcXVlc3RNZXNzYWdlLmlkXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKHJlc3VsdE9yRXJyb3IgaW5zdGFuY2VvZiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlLmVycm9yID0gcmVzdWx0T3JFcnJvci50b0pzb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVzdWx0ID0gcmVzdWx0T3JFcnJvciA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHJlc3VsdE9yRXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cmFjZVNlbmRpbmdSZXNwb25zZShtZXNzYWdlLCBtZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICBtZXNzYWdlV3JpdGVyLndyaXRlKG1lc3NhZ2UpLmNhdGNoKCgpID0+IGxvZ2dlci5lcnJvcihgU2VuZGluZyByZXNwb25zZSBmYWlsZWQuYCkpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHJlcGx5RXJyb3IoZXJyb3IsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgaWQ6IHJlcXVlc3RNZXNzYWdlLmlkLFxuICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvci50b0pzb24oKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUobWVzc2FnZSkuY2F0Y2goKCkgPT4gbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlc3BvbnNlIGZhaWxlZC5gKSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gcmVwbHlTdWNjZXNzKHJlc3VsdCwgbWV0aG9kLCBzdGFydFRpbWUpIHtcbiAgICAgICAgICAgIC8vIFRoZSBKU09OIFJQQyBkZWZpbmVzIHRoYXQgYSByZXNwb25zZSBtdXN0IGVpdGhlciBoYXZlIGEgcmVzdWx0IG9yIGFuIGVycm9yXG4gICAgICAgICAgICAvLyBTbyB3ZSBjYW4ndCB0cmVhdCB1bmRlZmluZWQgYXMgYSB2YWxpZCByZXNwb25zZSByZXN1bHQuXG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgICAgICAgICAgICBqc29ucnBjOiB2ZXJzaW9uLFxuICAgICAgICAgICAgICAgIGlkOiByZXF1ZXN0TWVzc2FnZS5pZCxcbiAgICAgICAgICAgICAgICByZXN1bHQ6IHJlc3VsdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUobWVzc2FnZSkuY2F0Y2goKCkgPT4gbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlc3BvbnNlIGZhaWxlZC5gKSk7XG4gICAgICAgIH1cbiAgICAgICAgdHJhY2VSZWNlaXZlZFJlcXVlc3QocmVxdWVzdE1lc3NhZ2UpO1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gcmVxdWVzdEhhbmRsZXJzLmdldChyZXF1ZXN0TWVzc2FnZS5tZXRob2QpO1xuICAgICAgICBsZXQgdHlwZTtcbiAgICAgICAgbGV0IHJlcXVlc3RIYW5kbGVyO1xuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgdHlwZSA9IGVsZW1lbnQudHlwZTtcbiAgICAgICAgICAgIHJlcXVlc3RIYW5kbGVyID0gZWxlbWVudC5oYW5kbGVyO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIGlmIChyZXF1ZXN0SGFuZGxlciB8fCBzdGFyUmVxdWVzdEhhbmRsZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHRva2VuS2V5ID0gcmVxdWVzdE1lc3NhZ2UuaWQgPz8gU3RyaW5nKERhdGUubm93KCkpOyAvL1xuICAgICAgICAgICAgY29uc3QgY2FuY2VsbGF0aW9uU291cmNlID0gSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKGNhbmNlbGxhdGlvblN0cmF0ZWd5LnJlY2VpdmVyKVxuICAgICAgICAgICAgICAgID8gY2FuY2VsbGF0aW9uU3RyYXRlZ3kucmVjZWl2ZXIuY3JlYXRlQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UodG9rZW5LZXkpXG4gICAgICAgICAgICAgICAgOiBjYW5jZWxsYXRpb25TdHJhdGVneS5yZWNlaXZlci5jcmVhdGVDYW5jZWxsYXRpb25Ub2tlblNvdXJjZShyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICBpZiAocmVxdWVzdE1lc3NhZ2UuaWQgIT09IG51bGwgJiYga25vd25DYW5jZWxlZFJlcXVlc3RzLmhhcyhyZXF1ZXN0TWVzc2FnZS5pZCkpIHtcbiAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25Tb3VyY2UuY2FuY2VsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVxdWVzdE1lc3NhZ2UuaWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLnNldCh0b2tlbktleSwgY2FuY2VsbGF0aW9uU291cmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IGhhbmRsZXJSZXN1bHQ7XG4gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0TWVzc2FnZS5wYXJhbXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlLm51bWJlck9mUGFyYW1zICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1zLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyAke3R5cGUubnVtYmVyT2ZQYXJhbXN9IHBhcmFtcyBidXQgcmVjZWl2ZWQgbm9uZS5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJSZXN1bHQgPSByZXF1ZXN0SGFuZGxlcihjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVxdWVzdE1lc3NhZ2UucGFyYW1zKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlLnBhcmFtZXRlclN0cnVjdHVyZXMgPT09IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseUVycm9yKG5ldyBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IobWVzc2FnZXNfMS5FcnJvckNvZGVzLkludmFsaWRQYXJhbXMsIGBSZXF1ZXN0ICR7cmVxdWVzdE1lc3NhZ2UubWV0aG9kfSBkZWZpbmVzIHBhcmFtZXRlcnMgYnkgbmFtZSBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBwb3NpdGlvbmApLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlclJlc3VsdCA9IHJlcXVlc3RIYW5kbGVyKC4uLnJlcXVlc3RNZXNzYWdlLnBhcmFtcywgY2FuY2VsbGF0aW9uU291cmNlLnRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS5wYXJhbWV0ZXJTdHJ1Y3R1cmVzID09PSBtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW52YWxpZFBhcmFtcywgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGRlZmluZXMgcGFyYW1ldGVycyBieSBwb3NpdGlvbiBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBuYW1lYCksIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gcmVxdWVzdEhhbmRsZXIocmVxdWVzdE1lc3NhZ2UucGFyYW1zLCBjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0YXJSZXF1ZXN0SGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gc3RhclJlcXVlc3RIYW5kbGVyKHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgcmVxdWVzdE1lc3NhZ2UucGFyYW1zLCBjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBwcm9taXNlID0gaGFuZGxlclJlc3VsdDtcbiAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZXJSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFRva2Vucy5kZWxldGUodG9rZW5LZXkpO1xuICAgICAgICAgICAgICAgICAgICByZXBseVN1Y2Nlc3MoaGFuZGxlclJlc3VsdCwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwcm9taXNlLnRoZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS50aGVuKChyZXN1bHRPckVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLmRlbGV0ZSh0b2tlbktleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXBseShyZXN1bHRPckVycm9yLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IoZXJyb3IsIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVycm9yICYmIElzLnN0cmluZyhlcnJvci5tZXNzYWdlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGZhaWxlZCB3aXRoIG1lc3NhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZmFpbGVkIHVuZXhwZWN0ZWRseSB3aXRob3V0IHByb3ZpZGluZyBhbnkgZGV0YWlscy5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHkoaGFuZGxlclJlc3VsdCwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHkoZXJyb3IsIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZXJyb3IgJiYgSXMuc3RyaW5nKGVycm9yLm1lc3NhZ2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGZhaWxlZCB3aXRoIG1lc3NhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZmFpbGVkIHVuZXhwZWN0ZWRseSB3aXRob3V0IHByb3ZpZGluZyBhbnkgZGV0YWlscy5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuTWV0aG9kTm90Rm91bmQsIGBVbmhhbmRsZWQgbWV0aG9kICR7cmVxdWVzdE1lc3NhZ2UubWV0aG9kfWApLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlUmVzcG9uc2UocmVzcG9uc2VNZXNzYWdlKSB7XG4gICAgICAgIGlmIChpc0Rpc3Bvc2VkKCkpIHtcbiAgICAgICAgICAgIC8vIFNlZSBoYW5kbGUgcmVxdWVzdC5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzcG9uc2VNZXNzYWdlLmlkID09PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VNZXNzYWdlLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBSZWNlaXZlZCByZXNwb25zZSBtZXNzYWdlIHdpdGhvdXQgaWQ6IEVycm9yIGlzOiBcXG4ke0pTT04uc3RyaW5naWZ5KHJlc3BvbnNlTWVzc2FnZS5lcnJvciwgdW5kZWZpbmVkLCA0KX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgUmVjZWl2ZWQgcmVzcG9uc2UgbWVzc2FnZSB3aXRob3V0IGlkLiBObyBmdXJ0aGVyIGVycm9yIGluZm9ybWF0aW9uIHByb3ZpZGVkLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gcmVzcG9uc2VNZXNzYWdlLmlkO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VQcm9taXNlID0gcmVzcG9uc2VQcm9taXNlcy5nZXQoa2V5KTtcbiAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWRSZXNwb25zZShyZXNwb25zZU1lc3NhZ2UsIHJlc3BvbnNlUHJvbWlzZSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VQcm9taXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2VzLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZU1lc3NhZ2UuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gcmVzcG9uc2VNZXNzYWdlLmVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlLnJlamVjdChuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKGVycm9yLmNvZGUsIGVycm9yLm1lc3NhZ2UsIGVycm9yLmRhdGEpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXNwb25zZU1lc3NhZ2UucmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlTWVzc2FnZS5yZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgbmV2ZXIgaGFwcGVuLicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IubWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBSZXNwb25zZSBoYW5kbGVyICcke3Jlc3BvbnNlUHJvbWlzZS5tZXRob2R9JyBmYWlsZWQgd2l0aCBtZXNzYWdlOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYFJlc3BvbnNlIGhhbmRsZXIgJyR7cmVzcG9uc2VQcm9taXNlLm1ldGhvZH0nIGZhaWxlZCB1bmV4cGVjdGVkbHkuYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlTm90aWZpY2F0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgLy8gU2VlIGhhbmRsZSByZXF1ZXN0LlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0eXBlID0gdW5kZWZpbmVkO1xuICAgICAgICBsZXQgbm90aWZpY2F0aW9uSGFuZGxlcjtcbiAgICAgICAgaWYgKG1lc3NhZ2UubWV0aG9kID09PSBDYW5jZWxOb3RpZmljYXRpb24udHlwZS5tZXRob2QpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhbmNlbElkID0gbWVzc2FnZS5wYXJhbXMuaWQ7XG4gICAgICAgICAgICBrbm93bkNhbmNlbGVkUmVxdWVzdHMuZGVsZXRlKGNhbmNlbElkKTtcbiAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWROb3RpZmljYXRpb24obWVzc2FnZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gbm90aWZpY2F0aW9uSGFuZGxlcnMuZ2V0KG1lc3NhZ2UubWV0aG9kKTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uSGFuZGxlciA9IGVsZW1lbnQuaGFuZGxlcjtcbiAgICAgICAgICAgICAgICB0eXBlID0gZWxlbWVudC50eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChub3RpZmljYXRpb25IYW5kbGVyIHx8IHN0YXJOb3RpZmljYXRpb25IYW5kbGVyKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWROb3RpZmljYXRpb24obWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgaWYgKG5vdGlmaWNhdGlvbkhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UucGFyYW1zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5udW1iZXJPZlBhcmFtcyAhPT0gMCAmJiB0eXBlLnBhcmFtZXRlclN0cnVjdHVyZXMgIT09IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBOb3RpZmljYXRpb24gJHttZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyAke3R5cGUubnVtYmVyT2ZQYXJhbXN9IHBhcmFtcyBidXQgcmVjZWl2ZWQgbm9uZS5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShtZXNzYWdlLnBhcmFtcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGFyZSBKU09OLVJQQyBsaWJyYXJpZXMgdGhhdCBzZW5kIHByb2dyZXNzIG1lc3NhZ2UgYXMgcG9zaXRpb25hbCBwYXJhbXMgYWx0aG91Z2hcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpZmllZCBhcyBuYW1lZC4gU28gY29udmVydCB0aGVtIGlmIHRoaXMgaXMgdGhlIGNhc2UuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBtZXNzYWdlLnBhcmFtcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLm1ldGhvZCA9PT0gUHJvZ3Jlc3NOb3RpZmljYXRpb24udHlwZS5tZXRob2QgJiYgcGFyYW1zLmxlbmd0aCA9PT0gMiAmJiBQcm9ncmVzc1Rva2VuLmlzKHBhcmFtc1swXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKHsgdG9rZW46IHBhcmFtc1swXSwgdmFsdWU6IHBhcmFtc1sxXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUucGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBOb3RpZmljYXRpb24gJHttZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyBwYXJhbWV0ZXJzIGJ5IG5hbWUgYnV0IHJlY2VpdmVkIHBhcmFtZXRlcnMgYnkgcG9zaXRpb25gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5udW1iZXJPZlBhcmFtcyAhPT0gbWVzc2FnZS5wYXJhbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYE5vdGlmaWNhdGlvbiAke21lc3NhZ2UubWV0aG9kfSBkZWZpbmVzICR7dHlwZS5udW1iZXJPZlBhcmFtc30gcGFyYW1zIGJ1dCByZWNlaXZlZCAke3BhcmFtcy5sZW5ndGh9IGFyZ3VtZW50c2ApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXIoLi4ucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS5wYXJhbWV0ZXJTdHJ1Y3R1cmVzID09PSBtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgTm90aWZpY2F0aW9uICR7bWVzc2FnZS5tZXRob2R9IGRlZmluZXMgcGFyYW1ldGVycyBieSBwb3NpdGlvbiBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBuYW1lYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKG1lc3NhZ2UucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGFyTm90aWZpY2F0aW9uSGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICBzdGFyTm90aWZpY2F0aW9uSGFuZGxlcihtZXNzYWdlLm1ldGhvZCwgbWVzc2FnZS5wYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvci5tZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgTm90aWZpY2F0aW9uIGhhbmRsZXIgJyR7bWVzc2FnZS5tZXRob2R9JyBmYWlsZWQgd2l0aCBtZXNzYWdlOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYE5vdGlmaWNhdGlvbiBoYW5kbGVyICcke21lc3NhZ2UubWV0aG9kfScgZmFpbGVkIHVuZXhwZWN0ZWRseS5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1bmhhbmRsZWROb3RpZmljYXRpb25FbWl0dGVyLmZpcmUobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlSW52YWxpZE1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignUmVjZWl2ZWQgZW1wdHkgbWVzc2FnZS4nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsb2dnZXIuZXJyb3IoYFJlY2VpdmVkIG1lc3NhZ2Ugd2hpY2ggaXMgbmVpdGhlciBhIHJlc3BvbnNlIG5vciBhIG5vdGlmaWNhdGlvbiBtZXNzYWdlOlxcbiR7SlNPTi5zdHJpbmdpZnkobWVzc2FnZSwgbnVsbCwgNCl9YCk7XG4gICAgICAgIC8vIFRlc3Qgd2hldGhlciB3ZSBmaW5kIGFuIGlkIHRvIHJlamVjdCB0aGUgcHJvbWlzZVxuICAgICAgICBjb25zdCByZXNwb25zZU1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICBpZiAoSXMuc3RyaW5nKHJlc3BvbnNlTWVzc2FnZS5pZCkgfHwgSXMubnVtYmVyKHJlc3BvbnNlTWVzc2FnZS5pZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHJlc3BvbnNlTWVzc2FnZS5pZDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxlciA9IHJlc3BvbnNlUHJvbWlzZXMuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VIYW5kbGVyLnJlamVjdChuZXcgRXJyb3IoJ1RoZSByZWNlaXZlZCByZXNwb25zZSBoYXMgbmVpdGhlciBhIHJlc3VsdCBub3IgYW4gZXJyb3IgcHJvcGVydHkuJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0cmluZ2lmeVRyYWNlKHBhcmFtcykge1xuICAgICAgICBpZiAocGFyYW1zID09PSB1bmRlZmluZWQgfHwgcGFyYW1zID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAodHJhY2UpIHtcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuVmVyYm9zZTpcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGFyYW1zLCBudWxsLCA0KTtcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuQ29tcGFjdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGFyYW1zKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVNlbmRpbmdSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFjZUZvcm1hdCA9PT0gVHJhY2VGb3JtYXQuVGV4dCkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSAmJiBtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBgUGFyYW1zOiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucGFyYW1zKX1cXG5cXG5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJhY2VyLmxvZyhgU2VuZGluZyByZXF1ZXN0ICcke21lc3NhZ2UubWV0aG9kfSAtICgke21lc3NhZ2UuaWR9KScuYCwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb2dMU1BNZXNzYWdlKCdzZW5kLXJlcXVlc3QnLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVNlbmRpbmdOb3RpZmljYXRpb24obWVzc2FnZSkge1xuICAgICAgICBpZiAodHJhY2UgPT09IFRyYWNlLk9mZiB8fCAhdHJhY2VyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYWNlRm9ybWF0ID09PSBUcmFjZUZvcm1hdC5UZXh0KSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdCkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0gYFBhcmFtczogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLnBhcmFtcyl9XFxuXFxuYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSAnTm8gcGFyYW1ldGVycyBwcm92aWRlZC5cXG5cXG4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFNlbmRpbmcgbm90aWZpY2F0aW9uICcke21lc3NhZ2UubWV0aG9kfScuYCwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb2dMU1BNZXNzYWdlKCdzZW5kLW5vdGlmaWNhdGlvbicsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhY2VGb3JtYXQgPT09IFRyYWNlRm9ybWF0LlRleHQpIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZXJyb3IgJiYgbWVzc2FnZS5lcnJvci5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgRXJyb3IgZGF0YTogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLmVycm9yLmRhdGEpfVxcblxcbmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgUmVzdWx0OiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucmVzdWx0KX1cXG5cXG5gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UuZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9ICdObyByZXN1bHQgcmV0dXJuZWQuXFxuXFxuJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFNlbmRpbmcgcmVzcG9uc2UgJyR7bWV0aG9kfSAtICgke21lc3NhZ2UuaWR9KScuIFByb2Nlc3NpbmcgcmVxdWVzdCB0b29rICR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1tc2AsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgnc2VuZC1yZXNwb25zZScsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYWNlUmVjZWl2ZWRSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFjZUZvcm1hdCA9PT0gVHJhY2VGb3JtYXQuVGV4dCkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSAmJiBtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBgUGFyYW1zOiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucGFyYW1zKX1cXG5cXG5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJhY2VyLmxvZyhgUmVjZWl2ZWQgcmVxdWVzdCAnJHttZXNzYWdlLm1ldGhvZH0gLSAoJHttZXNzYWdlLmlkfSknLmAsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1yZXF1ZXN0JywgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdHJhY2VSZWNlaXZlZE5vdGlmaWNhdGlvbihtZXNzYWdlKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIgfHwgbWVzc2FnZS5tZXRob2QgPT09IExvZ1RyYWNlTm90aWZpY2F0aW9uLnR5cGUubWV0aG9kKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYWNlRm9ybWF0ID09PSBUcmFjZUZvcm1hdC5UZXh0KSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdCkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0gYFBhcmFtczogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLnBhcmFtcyl9XFxuXFxuYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSAnTm8gcGFyYW1ldGVycyBwcm92aWRlZC5cXG5cXG4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFJlY2VpdmVkIG5vdGlmaWNhdGlvbiAnJHttZXNzYWdlLm1ldGhvZH0nLmAsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1ub3RpZmljYXRpb24nLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVJlY2VpdmVkUmVzcG9uc2UobWVzc2FnZSwgcmVzcG9uc2VQcm9taXNlKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhY2VGb3JtYXQgPT09IFRyYWNlRm9ybWF0LlRleHQpIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZXJyb3IgJiYgbWVzc2FnZS5lcnJvci5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgRXJyb3IgZGF0YTogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLmVycm9yLmRhdGEpfVxcblxcbmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgUmVzdWx0OiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucmVzdWx0KX1cXG5cXG5gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UuZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9ICdObyByZXN1bHQgcmV0dXJuZWQuXFxuXFxuJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXNwb25zZVByb21pc2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IG1lc3NhZ2UuZXJyb3IgPyBgIFJlcXVlc3QgZmFpbGVkOiAke21lc3NhZ2UuZXJyb3IubWVzc2FnZX0gKCR7bWVzc2FnZS5lcnJvci5jb2RlfSkuYCA6ICcnO1xuICAgICAgICAgICAgICAgIHRyYWNlci5sb2coYFJlY2VpdmVkIHJlc3BvbnNlICcke3Jlc3BvbnNlUHJvbWlzZS5tZXRob2R9IC0gKCR7bWVzc2FnZS5pZH0pJyBpbiAke0RhdGUubm93KCkgLSByZXNwb25zZVByb21pc2UudGltZXJTdGFydH1tcy4ke2Vycm9yfWAsIGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJhY2VyLmxvZyhgUmVjZWl2ZWQgcmVzcG9uc2UgJHttZXNzYWdlLmlkfSB3aXRob3V0IGFjdGl2ZSByZXNwb25zZSBwcm9taXNlLmAsIGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1yZXNwb25zZScsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGxvZ0xTUE1lc3NhZ2UodHlwZSwgbWVzc2FnZSkge1xuICAgICAgICBpZiAoIXRyYWNlciB8fCB0cmFjZSA9PT0gVHJhY2UuT2ZmKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbHNwTWVzc2FnZSA9IHtcbiAgICAgICAgICAgIGlzTFNQTWVzc2FnZTogdHJ1ZSxcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpXG4gICAgICAgIH07XG4gICAgICAgIHRyYWNlci5sb2cobHNwTWVzc2FnZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRocm93SWZDbG9zZWRPckRpc3Bvc2VkKCkge1xuICAgICAgICBpZiAoaXNDbG9zZWQoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IENvbm5lY3Rpb25FcnJvcihDb25uZWN0aW9uRXJyb3JzLkNsb3NlZCwgJ0Nvbm5lY3Rpb24gaXMgY2xvc2VkLicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0Rpc3Bvc2VkKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb25uZWN0aW9uRXJyb3IoQ29ubmVjdGlvbkVycm9ycy5EaXNwb3NlZCwgJ0Nvbm5lY3Rpb24gaXMgZGlzcG9zZWQuJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdGhyb3dJZkxpc3RlbmluZygpIHtcbiAgICAgICAgaWYgKGlzTGlzdGVuaW5nKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb25uZWN0aW9uRXJyb3IoQ29ubmVjdGlvbkVycm9ycy5BbHJlYWR5TGlzdGVuaW5nLCAnQ29ubmVjdGlvbiBpcyBhbHJlYWR5IGxpc3RlbmluZycpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRocm93SWZOb3RMaXN0ZW5pbmcoKSB7XG4gICAgICAgIGlmICghaXNMaXN0ZW5pbmcoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYWxsIGxpc3RlbigpIGZpcnN0LicpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVuZGVmaW5lZFRvTnVsbChwYXJhbSkge1xuICAgICAgICBpZiAocGFyYW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyYW07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gbnVsbFRvVW5kZWZpbmVkKHBhcmFtKSB7XG4gICAgICAgIGlmIChwYXJhbSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJhbTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBpc05hbWVkUGFyYW0ocGFyYW0pIHtcbiAgICAgICAgcmV0dXJuIHBhcmFtICE9PSB1bmRlZmluZWQgJiYgcGFyYW0gIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkocGFyYW0pICYmIHR5cGVvZiBwYXJhbSA9PT0gJ29iamVjdCc7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXB1dGVTaW5nbGVQYXJhbShwYXJhbWV0ZXJTdHJ1Y3R1cmVzLCBwYXJhbSkge1xuICAgICAgICBzd2l0Y2ggKHBhcmFtZXRlclN0cnVjdHVyZXMpIHtcbiAgICAgICAgICAgIGNhc2UgbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG86XG4gICAgICAgICAgICAgICAgaWYgKGlzTmFtZWRQYXJhbShwYXJhbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxUb1VuZGVmaW5lZChwYXJhbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3VuZGVmaW5lZFRvTnVsbChwYXJhbSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZTpcbiAgICAgICAgICAgICAgICBpZiAoIWlzTmFtZWRQYXJhbShwYXJhbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWNlaXZlZCBwYXJhbWV0ZXJzIGJ5IG5hbWUgYnV0IHBhcmFtIGlzIG5vdCBhbiBvYmplY3QgbGl0ZXJhbC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGxUb1VuZGVmaW5lZChwYXJhbSk7XG4gICAgICAgICAgICBjYXNlIG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieVBvc2l0aW9uOlxuICAgICAgICAgICAgICAgIHJldHVybiBbdW5kZWZpbmVkVG9OdWxsKHBhcmFtKV07XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBwYXJhbWV0ZXIgc3RydWN0dXJlICR7cGFyYW1ldGVyU3RydWN0dXJlcy50b1N0cmluZygpfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXB1dGVNZXNzYWdlUGFyYW1zKHR5cGUsIHBhcmFtcykge1xuICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICBjb25zdCBudW1iZXJPZlBhcmFtcyA9IHR5cGUubnVtYmVyT2ZQYXJhbXM7XG4gICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gY29tcHV0ZVNpbmdsZVBhcmFtKHR5cGUucGFyYW1ldGVyU3RydWN0dXJlcywgcGFyYW1zWzBdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoICYmIGkgPCBudW1iZXJPZlBhcmFtczsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHVuZGVmaW5lZFRvTnVsbChwYXJhbXNbaV0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPCBudW1iZXJPZlBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gcGFyYW1zLmxlbmd0aDsgaSA8IG51bWJlck9mUGFyYW1zOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB7XG4gICAgICAgIHNlbmROb3RpZmljYXRpb246ICh0eXBlLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlUGFyYW1zO1xuICAgICAgICAgICAgaWYgKElzLnN0cmluZyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICAgIGxldCBwYXJhbVN0YXJ0ID0gMDtcbiAgICAgICAgICAgICAgICBsZXQgcGFyYW1ldGVyU3RydWN0dXJlcyA9IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvO1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuaXMoZmlyc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtU3RhcnQgPSAxO1xuICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gZmlyc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBwYXJhbUVuZCA9IGFyZ3MubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gcGFyYW1FbmQgLSBwYXJhbVN0YXJ0O1xuICAgICAgICAgICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zID0gY29tcHV0ZVNpbmdsZVBhcmFtKHBhcmFtZXRlclN0cnVjdHVyZXMsIGFyZ3NbcGFyYW1TdGFydF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjZWl2ZWQgJHtudW1iZXJPZlBhcmFtc30gcGFyYW1ldGVycyBmb3IgJ2J5IE5hbWUnIG5vdGlmaWNhdGlvbiBwYXJhbWV0ZXIgc3RydWN0dXJlLmApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IGFyZ3Muc2xpY2UocGFyYW1TdGFydCwgcGFyYW1FbmQpLm1hcCh2YWx1ZSA9PiB1bmRlZmluZWRUb051bGwodmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IGFyZ3M7XG4gICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZS5tZXRob2Q7XG4gICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IGNvbXB1dGVNZXNzYWdlUGFyYW1zKHR5cGUsIHBhcmFtcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBub3RpZmljYXRpb25NZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBtZXNzYWdlUGFyYW1zXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdHJhY2VTZW5kaW5nTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbk1lc3NhZ2UpO1xuICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2VXcml0ZXIud3JpdGUobm90aWZpY2F0aW9uTWVzc2FnZSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBTZW5kaW5nIG5vdGlmaWNhdGlvbiBmYWlsZWQuYCk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25Ob3RpZmljYXRpb246ICh0eXBlLCBoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGlmIChJcy5mdW5jKHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB0eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaGFuZGxlcikge1xuICAgICAgICAgICAgICAgIGlmIChJcy5zdHJpbmcodHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZTtcbiAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uSGFuZGxlcnMuc2V0KHR5cGUsIHsgdHlwZTogdW5kZWZpbmVkLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZS5tZXRob2Q7XG4gICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXJzLnNldCh0eXBlLm1ldGhvZCwgeyB0eXBlLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXJzLmRlbGV0ZShtZXRob2QpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBvblByb2dyZXNzOiAoX3R5cGUsIHRva2VuLCBoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgICBpZiAocHJvZ3Jlc3NIYW5kbGVycy5oYXModG9rZW4pKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm9ncmVzcyBoYW5kbGVyIGZvciB0b2tlbiAke3Rva2VufSBhbHJlYWR5IHJlZ2lzdGVyZWRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByb2dyZXNzSGFuZGxlcnMuc2V0KHRva2VuLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc0hhbmRsZXJzLmRlbGV0ZSh0b2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgc2VuZFByb2dyZXNzOiAoX3R5cGUsIHRva2VuLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGF3YWl0IGJ1dCBzaW1wbGUgcmV0dXJuIHRvIGVuc3VyZSB0aGF0IHdlIGRvbid0IGhhdmUgYW5vdGhlclxuICAgICAgICAgICAgLy8gYXN5bmMgc2NoZWR1bGluZy4gT3RoZXJ3aXNlIG9uZSBzZW5kIGNvdWxkIG92ZXJ0YWtlIGFub3RoZXIgc2VuZC5cbiAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLnNlbmROb3RpZmljYXRpb24oUHJvZ3Jlc3NOb3RpZmljYXRpb24udHlwZSwgeyB0b2tlbiwgdmFsdWUgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uVW5oYW5kbGVkUHJvZ3Jlc3M6IHVuaGFuZGxlZFByb2dyZXNzRW1pdHRlci5ldmVudCxcbiAgICAgICAgc2VuZFJlcXVlc3Q6ICh0eXBlLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgdGhyb3dJZk5vdExpc3RlbmluZygpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlUGFyYW1zO1xuICAgICAgICAgICAgbGV0IHRva2VuID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKElzLnN0cmluZyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3QgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgbGV0IHBhcmFtU3RhcnQgPSAwO1xuICAgICAgICAgICAgICAgIGxldCBwYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG87XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5pcyhmaXJzdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1TdGFydCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlclN0cnVjdHVyZXMgPSBmaXJzdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHBhcmFtRW5kID0gYXJncy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuLmlzKGxhc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtRW5kID0gcGFyYW1FbmQgLSAxO1xuICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IGxhc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gcGFyYW1FbmQgLSBwYXJhbVN0YXJ0O1xuICAgICAgICAgICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zID0gY29tcHV0ZVNpbmdsZVBhcmFtKHBhcmFtZXRlclN0cnVjdHVyZXMsIGFyZ3NbcGFyYW1TdGFydF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjZWl2ZWQgJHtudW1iZXJPZlBhcmFtc30gcGFyYW1ldGVycyBmb3IgJ2J5IE5hbWUnIHJlcXVlc3QgcGFyYW1ldGVyIHN0cnVjdHVyZS5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMgPSBhcmdzLnNsaWNlKHBhcmFtU3RhcnQsIHBhcmFtRW5kKS5tYXAodmFsdWUgPT4gdW5kZWZpbmVkVG9OdWxsKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBhcmdzO1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGUubWV0aG9kO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMgPSBjb21wdXRlTWVzc2FnZVBhcmFtcyh0eXBlLCBwYXJhbXMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gdHlwZS5udW1iZXJPZlBhcmFtcztcbiAgICAgICAgICAgICAgICB0b2tlbiA9IGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuLmlzKHBhcmFtc1tudW1iZXJPZlBhcmFtc10pID8gcGFyYW1zW251bWJlck9mUGFyYW1zXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGlkID0gc2VxdWVuY2VOdW1iZXIrKztcbiAgICAgICAgICAgIGxldCBkaXNwb3NhYmxlO1xuICAgICAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgICAgICAgZGlzcG9zYWJsZSA9IHRva2VuLm9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcCA9IGNhbmNlbGxhdGlvblN0cmF0ZWd5LnNlbmRlci5zZW5kQ2FuY2VsbGF0aW9uKGNvbm5lY3Rpb24sIGlkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhgUmVjZWl2ZWQgbm8gcHJvbWlzZSBmcm9tIGNhbmNlbGxhdGlvbiBzdHJhdGVneSB3aGVuIGNhbmNlbGxpbmcgaWQgJHtpZH1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIubG9nKGBTZW5kaW5nIGNhbmNlbGxhdGlvbiBtZXNzYWdlcyBmb3IgaWQgJHtpZH0gZmFpbGVkYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdE1lc3NhZ2UgPSB7XG4gICAgICAgICAgICAgICAganNvbnJwYzogdmVyc2lvbixcbiAgICAgICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBtZXNzYWdlUGFyYW1zXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdHJhY2VTZW5kaW5nUmVxdWVzdChyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNhbmNlbGxhdGlvblN0cmF0ZWd5LnNlbmRlci5lbmFibGVDYW5jZWxsYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25TdHJhdGVneS5zZW5kZXIuZW5hYmxlQ2FuY2VsbGF0aW9uKHJlcXVlc3RNZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZVdpdGhDbGVhbnVwID0gKHIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyKTtcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uU3RyYXRlZ3kuc2VuZGVyLmNsZWFudXAoaWQpO1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlPy5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWplY3RXaXRoQ2xlYW51cCA9IChyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChyKTtcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uU3RyYXRlZ3kuc2VuZGVyLmNsZWFudXAoaWQpO1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlPy5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZVByb21pc2UgPSB7IG1ldGhvZDogbWV0aG9kLCB0aW1lclN0YXJ0OiBEYXRlLm5vdygpLCByZXNvbHZlOiByZXNvbHZlV2l0aENsZWFudXAsIHJlamVjdDogcmVqZWN0V2l0aENsZWFudXAgfTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2VzLnNldChpZCwgcmVzcG9uc2VQcm9taXNlKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbWVzc2FnZVdyaXRlci53cml0ZShyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAvLyBXcml0aW5nIHRoZSBtZXNzYWdlIGZhaWxlZC4gU28gd2UgbmVlZCB0byBkZWxldGUgaXQgZnJvbSB0aGUgcmVzcG9uc2UgcHJvbWlzZXMgYW5kXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlamVjdCBpdC5cbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlcy5kZWxldGUoaWQpO1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2UucmVqZWN0KG5ldyBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IobWVzc2FnZXNfMS5FcnJvckNvZGVzLk1lc3NhZ2VXcml0ZUVycm9yLCBlcnJvci5tZXNzYWdlID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIHJlYXNvbicpKTtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlcXVlc3QgZmFpbGVkLmApO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25SZXF1ZXN0OiAodHlwZSwgaGFuZGxlcikgPT4ge1xuICAgICAgICAgICAgdGhyb3dJZkNsb3NlZE9yRGlzcG9zZWQoKTtcbiAgICAgICAgICAgIGxldCBtZXRob2QgPSBudWxsO1xuICAgICAgICAgICAgaWYgKFN0YXJSZXF1ZXN0SGFuZGxlci5pcyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBzdGFyUmVxdWVzdEhhbmRsZXIgPSB0eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoSXMuc3RyaW5nKHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgbWV0aG9kID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoaGFuZGxlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RIYW5kbGVycy5zZXQodHlwZSwgeyBoYW5kbGVyOiBoYW5kbGVyLCB0eXBlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSB0eXBlLm1ldGhvZDtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEhhbmRsZXJzLnNldCh0eXBlLm1ldGhvZCwgeyB0eXBlLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SGFuZGxlcnMuZGVsZXRlKG1ldGhvZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFyUmVxdWVzdEhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBoYXNQZW5kaW5nUmVzcG9uc2U6ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZVByb21pc2VzLnNpemUgPiAwO1xuICAgICAgICB9LFxuICAgICAgICB0cmFjZTogYXN5bmMgKF92YWx1ZSwgX3RyYWNlciwgc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBsZXQgX3NlbmROb3RpZmljYXRpb24gPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBfdHJhY2VGb3JtYXQgPSBUcmFjZUZvcm1hdC5UZXh0O1xuICAgICAgICAgICAgaWYgKHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKElzLmJvb2xlYW4oc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zKSkge1xuICAgICAgICAgICAgICAgICAgICBfc2VuZE5vdGlmaWNhdGlvbiA9IHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF9zZW5kTm90aWZpY2F0aW9uID0gc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zLnNlbmROb3RpZmljYXRpb24gfHwgZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIF90cmFjZUZvcm1hdCA9IHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucy50cmFjZUZvcm1hdCB8fCBUcmFjZUZvcm1hdC5UZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlID0gX3ZhbHVlO1xuICAgICAgICAgICAgdHJhY2VGb3JtYXQgPSBfdHJhY2VGb3JtYXQ7XG4gICAgICAgICAgICBpZiAodHJhY2UgPT09IFRyYWNlLk9mZikge1xuICAgICAgICAgICAgICAgIHRyYWNlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRyYWNlciA9IF90cmFjZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoX3NlbmROb3RpZmljYXRpb24gJiYgIWlzQ2xvc2VkKCkgJiYgIWlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGNvbm5lY3Rpb24uc2VuZE5vdGlmaWNhdGlvbihTZXRUcmFjZU5vdGlmaWNhdGlvbi50eXBlLCB7IHZhbHVlOiBUcmFjZS50b1N0cmluZyhfdmFsdWUpIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBvbkVycm9yOiBlcnJvckVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIG9uQ2xvc2U6IGNsb3NlRW1pdHRlci5ldmVudCxcbiAgICAgICAgb25VbmhhbmRsZWROb3RpZmljYXRpb246IHVuaGFuZGxlZE5vdGlmaWNhdGlvbkVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIG9uRGlzcG9zZTogZGlzcG9zZUVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIGVuZDogKCkgPT4ge1xuICAgICAgICAgICAgbWVzc2FnZVdyaXRlci5lbmQoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLkRpc3Bvc2VkO1xuICAgICAgICAgICAgZGlzcG9zZUVtaXR0ZXIuZmlyZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5QZW5kaW5nUmVzcG9uc2VSZWplY3RlZCwgJ1BlbmRpbmcgcmVzcG9uc2UgcmVqZWN0ZWQgc2luY2UgY29ubmVjdGlvbiBnb3QgZGlzcG9zZWQnKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvbWlzZSBvZiByZXNwb25zZVByb21pc2VzLnZhbHVlcygpKSB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBrbm93bkNhbmNlbGVkUmVxdWVzdHMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICBtZXNzYWdlUXVldWUgPSBuZXcgbGlua2VkTWFwXzEuTGlua2VkTWFwKCk7XG4gICAgICAgICAgICAvLyBUZXN0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgaWYgKElzLmZ1bmMobWVzc2FnZVdyaXRlci5kaXNwb3NlKSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKElzLmZ1bmMobWVzc2FnZVJlYWRlci5kaXNwb3NlKSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VSZWFkZXIuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBsaXN0ZW46ICgpID0+IHtcbiAgICAgICAgICAgIHRocm93SWZDbG9zZWRPckRpc3Bvc2VkKCk7XG4gICAgICAgICAgICB0aHJvd0lmTGlzdGVuaW5nKCk7XG4gICAgICAgICAgICBzdGF0ZSA9IENvbm5lY3Rpb25TdGF0ZS5MaXN0ZW5pbmc7XG4gICAgICAgICAgICBtZXNzYWdlUmVhZGVyLmxpc3RlbihjYWxsYmFjayk7XG4gICAgICAgIH0sXG4gICAgICAgIGluc3BlY3Q6ICgpID0+IHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS5jb25zb2xlLmxvZygnaW5zcGVjdCcpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25uZWN0aW9uLm9uTm90aWZpY2F0aW9uKExvZ1RyYWNlTm90aWZpY2F0aW9uLnR5cGUsIChwYXJhbXMpID0+IHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZlcmJvc2UgPSB0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdDtcbiAgICAgICAgdHJhY2VyLmxvZyhwYXJhbXMubWVzc2FnZSwgdmVyYm9zZSA/IHBhcmFtcy52ZXJib3NlIDogdW5kZWZpbmVkKTtcbiAgICB9KTtcbiAgICBjb25uZWN0aW9uLm9uTm90aWZpY2F0aW9uKFByb2dyZXNzTm90aWZpY2F0aW9uLnR5cGUsIChwYXJhbXMpID0+IHtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IHByb2dyZXNzSGFuZGxlcnMuZ2V0KHBhcmFtcy50b2tlbik7XG4gICAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICAgICBoYW5kbGVyKHBhcmFtcy52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1bmhhbmRsZWRQcm9ncmVzc0VtaXR0ZXIuZmlyZShwYXJhbXMpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbm5lY3Rpb247XG59XG5leHBvcnRzLmNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uID0gY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb247XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vdHlwaW5ncy90aGVuYWJsZS5kLnRzXCIgLz5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUHJvZ3Jlc3NUeXBlID0gZXhwb3J0cy5Qcm9ncmVzc1Rva2VuID0gZXhwb3J0cy5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiA9IGV4cG9ydHMuTnVsbExvZ2dlciA9IGV4cG9ydHMuQ29ubmVjdGlvbk9wdGlvbnMgPSBleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IGV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlQnVmZmVyID0gZXhwb3J0cy5Xcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyID0gZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLk1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLlJlYWRhYmxlU3RyZWFtTWVzc2FnZVJlYWRlciA9IGV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlUmVhZGVyID0gZXhwb3J0cy5NZXNzYWdlUmVhZGVyID0gZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblRva2VuID0gZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IGV4cG9ydHMuRW1pdHRlciA9IGV4cG9ydHMuRXZlbnQgPSBleHBvcnRzLkRpc3Bvc2FibGUgPSBleHBvcnRzLkxSVUNhY2hlID0gZXhwb3J0cy5Ub3VjaCA9IGV4cG9ydHMuTGlua2VkTWFwID0gZXhwb3J0cy5QYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlOSA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTggPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU3ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNiA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTUgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU0ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMyA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTIgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUxID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMCA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZSA9IGV4cG9ydHMuRXJyb3JDb2RlcyA9IGV4cG9ydHMuUmVzcG9uc2VFcnJvciA9IGV4cG9ydHMuUmVxdWVzdFR5cGU5ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTggPSBleHBvcnRzLlJlcXVlc3RUeXBlNyA9IGV4cG9ydHMuUmVxdWVzdFR5cGU2ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTUgPSBleHBvcnRzLlJlcXVlc3RUeXBlNCA9IGV4cG9ydHMuUmVxdWVzdFR5cGUzID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTIgPSBleHBvcnRzLlJlcXVlc3RUeXBlMSA9IGV4cG9ydHMuUmVxdWVzdFR5cGUwID0gZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IGV4cG9ydHMuTWVzc2FnZSA9IGV4cG9ydHMuUkFMID0gdm9pZCAwO1xuZXhwb3J0cy5NZXNzYWdlU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblN0cmF0ZWd5ID0gZXhwb3J0cy5DYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IGV4cG9ydHMuQ29ubmVjdGlvbkVycm9yID0gZXhwb3J0cy5Db25uZWN0aW9uRXJyb3JzID0gZXhwb3J0cy5Mb2dUcmFjZU5vdGlmaWNhdGlvbiA9IGV4cG9ydHMuU2V0VHJhY2VOb3RpZmljYXRpb24gPSBleHBvcnRzLlRyYWNlRm9ybWF0ID0gZXhwb3J0cy5UcmFjZVZhbHVlcyA9IGV4cG9ydHMuVHJhY2UgPSB2b2lkIDA7XG5jb25zdCBtZXNzYWdlc18xID0gcmVxdWlyZShcIi4vbWVzc2FnZXNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNZXNzYWdlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk1lc3NhZ2U7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlMFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTA7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTFcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGUxOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGUyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlMjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlM1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGU0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGU1XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlNTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlNlwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTY7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTdcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGU3OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGU4XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlODsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlOVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTk7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXNwb25zZUVycm9yXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3I7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJFcnJvckNvZGVzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLkVycm9yQ29kZXM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlMFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlMDsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGUxXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGUxOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZTJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlM1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlMzsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGU0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZTVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlNlwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlNjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGU3XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU3OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZThcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTg7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlOVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlOTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlBhcmFtZXRlclN0cnVjdHVyZXNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlczsgfSB9KTtcbmNvbnN0IGxpbmtlZE1hcF8xID0gcmVxdWlyZShcIi4vbGlua2VkTWFwXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTGlua2VkTWFwXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBsaW5rZWRNYXBfMS5MaW5rZWRNYXA7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJMUlVDYWNoZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbGlua2VkTWFwXzEuTFJVQ2FjaGU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJUb3VjaFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbGlua2VkTWFwXzEuVG91Y2g7IH0gfSk7XG5jb25zdCBkaXNwb3NhYmxlXzEgPSByZXF1aXJlKFwiLi9kaXNwb3NhYmxlXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiRGlzcG9zYWJsZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZGlzcG9zYWJsZV8xLkRpc3Bvc2FibGU7IH0gfSk7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCIuL2V2ZW50c1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkV2ZW50XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBldmVudHNfMS5FdmVudDsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkVtaXR0ZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGV2ZW50c18xLkVtaXR0ZXI7IH0gfSk7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblRva2VuU291cmNlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjYW5jZWxsYXRpb25fMS5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblRva2VuXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjYW5jZWxsYXRpb25fMS5DYW5jZWxsYXRpb25Ub2tlbjsgfSB9KTtcbmNvbnN0IHNoYXJlZEFycmF5Q2FuY2VsbGF0aW9uXzEgPSByZXF1aXJlKFwiLi9zaGFyZWRBcnJheUNhbmNlbGxhdGlvblwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHNoYXJlZEFycmF5Q2FuY2VsbGF0aW9uXzEuU2hhcmVkQXJyYXlTZW5kZXJTdHJhdGVneTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlNoYXJlZEFycmF5UmVjZWl2ZXJTdHJhdGVneVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gc2hhcmVkQXJyYXlDYW5jZWxsYXRpb25fMS5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3k7IH0gfSk7XG5jb25zdCBtZXNzYWdlUmVhZGVyXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlUmVhZGVyXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTWVzc2FnZVJlYWRlclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZVJlYWRlcl8xLk1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VSZWFkZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VSZWFkZXJfMS5BYnN0cmFjdE1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VSZWFkZXJfMS5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5jb25zdCBtZXNzYWdlV3JpdGVyXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlV3JpdGVyXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTWVzc2FnZVdyaXRlclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZVdyaXRlcl8xLk1lc3NhZ2VXcml0ZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VXcml0ZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VXcml0ZXJfMS5BYnN0cmFjdE1lc3NhZ2VXcml0ZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJXcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlV3JpdGVyXzEuV3JpdGVhYmxlU3RyZWFtTWVzc2FnZVdyaXRlcjsgfSB9KTtcbmNvbnN0IG1lc3NhZ2VCdWZmZXJfMSA9IHJlcXVpcmUoXCIuL21lc3NhZ2VCdWZmZXJcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VCdWZmZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VCdWZmZXJfMS5BYnN0cmFjdE1lc3NhZ2VCdWZmZXI7IH0gfSk7XG5jb25zdCBjb25uZWN0aW9uXzEgPSByZXF1aXJlKFwiLi9jb25uZWN0aW9uXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29ubmVjdGlvblN0cmF0ZWd5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ29ubmVjdGlvblN0cmF0ZWd5OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29ubmVjdGlvbk9wdGlvbnNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5Db25uZWN0aW9uT3B0aW9uczsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk51bGxMb2dnZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5OdWxsTG9nZ2VyOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb25cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlByb2dyZXNzVG9rZW5cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5Qcm9ncmVzc1Rva2VuOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUHJvZ3Jlc3NUeXBlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuUHJvZ3Jlc3NUeXBlOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiVHJhY2VcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5UcmFjZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlRyYWNlVmFsdWVzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuVHJhY2VWYWx1ZXM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJUcmFjZUZvcm1hdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29ubmVjdGlvbl8xLlRyYWNlRm9ybWF0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiU2V0VHJhY2VOb3RpZmljYXRpb25cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5TZXRUcmFjZU5vdGlmaWNhdGlvbjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkxvZ1RyYWNlTm90aWZpY2F0aW9uXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuTG9nVHJhY2VOb3RpZmljYXRpb247IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJDb25uZWN0aW9uRXJyb3JzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ29ubmVjdGlvbkVycm9yczsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNvbm5lY3Rpb25FcnJvclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29ubmVjdGlvbl8xLkNvbm5lY3Rpb25FcnJvcjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5DYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5DYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblN0cmF0ZWd5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ2FuY2VsbGF0aW9uU3RyYXRlZ3k7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNZXNzYWdlU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5NZXNzYWdlU3RyYXRlZ3k7IH0gfSk7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbmV4cG9ydHMuUkFMID0gcmFsXzEuZGVmYXVsdDtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGFwaV8xID0gcmVxdWlyZShcIi4uL2NvbW1vbi9hcGlcIik7XG5jbGFzcyBNZXNzYWdlQnVmZmVyIGV4dGVuZHMgYXBpXzEuQWJzdHJhY3RNZXNzYWdlQnVmZmVyIHtcbiAgICBjb25zdHJ1Y3RvcihlbmNvZGluZyA9ICd1dGYtOCcpIHtcbiAgICAgICAgc3VwZXIoZW5jb2RpbmcpO1xuICAgICAgICB0aGlzLmFzY2lpRGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcignYXNjaWknKTtcbiAgICB9XG4gICAgZW1wdHlCdWZmZXIoKSB7XG4gICAgICAgIHJldHVybiBNZXNzYWdlQnVmZmVyLmVtcHR5QnVmZmVyO1xuICAgIH1cbiAgICBmcm9tU3RyaW5nKHZhbHVlLCBfZW5jb2RpbmcpIHtcbiAgICAgICAgcmV0dXJuIChuZXcgVGV4dEVuY29kZXIoKSkuZW5jb2RlKHZhbHVlKTtcbiAgICB9XG4gICAgdG9TdHJpbmcodmFsdWUsIGVuY29kaW5nKSB7XG4gICAgICAgIGlmIChlbmNvZGluZyA9PT0gJ2FzY2lpJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXNjaWlEZWNvZGVyLmRlY29kZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gKG5ldyBUZXh0RGVjb2RlcihlbmNvZGluZykpLmRlY29kZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXNOYXRpdmUoYnVmZmVyLCBsZW5ndGgpIHtcbiAgICAgICAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlci5zbGljZSgwLCBsZW5ndGgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFsbG9jTmF0aXZlKGxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTtcbiAgICB9XG59XG5NZXNzYWdlQnVmZmVyLmVtcHR5QnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMCk7XG5jbGFzcyBSZWFkYWJsZVN0cmVhbVdyYXBwZXIge1xuICAgIGNvbnN0cnVjdG9yKHNvY2tldCkge1xuICAgICAgICB0aGlzLnNvY2tldCA9IHNvY2tldDtcbiAgICAgICAgdGhpcy5fb25EYXRhID0gbmV3IGFwaV8xLkVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5fbWVzc2FnZUxpc3RlbmVyID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBibG9iID0gZXZlbnQuZGF0YTtcbiAgICAgICAgICAgIGJsb2IuYXJyYXlCdWZmZXIoKS50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkRhdGEuZmlyZShuZXcgVWludDhBcnJheShidWZmZXIpKTtcbiAgICAgICAgICAgIH0sICgpID0+IHtcbiAgICAgICAgICAgICAgICAoMCwgYXBpXzEuUkFMKSgpLmNvbnNvbGUuZXJyb3IoYENvbnZlcnRpbmcgYmxvYiB0byBhcnJheSBidWZmZXIgZmFpbGVkLmApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLl9tZXNzYWdlTGlzdGVuZXIpO1xuICAgIH1cbiAgICBvbkNsb3NlKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2Nsb3NlJywgbGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gYXBpXzEuRGlzcG9zYWJsZS5jcmVhdGUoKCkgPT4gdGhpcy5zb2NrZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xvc2UnLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkVycm9yKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgbGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gYXBpXzEuRGlzcG9zYWJsZS5jcmVhdGUoKCkgPT4gdGhpcy5zb2NrZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkVuZChsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKCdlbmQnLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdlbmQnLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkRhdGEobGlzdGVuZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uRGF0YS5ldmVudChsaXN0ZW5lcik7XG4gICAgfVxufVxuY2xhc3MgV3JpdGFibGVTdHJlYW1XcmFwcGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihzb2NrZXQpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7XG4gICAgfVxuICAgIG9uQ2xvc2UobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignY2xvc2UnLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbG9zZScsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIG9uRXJyb3IobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIG9uRW5kKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2VuZCcsIGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIGFwaV8xLkRpc3Bvc2FibGUuY3JlYXRlKCgpID0+IHRoaXMuc29ja2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2VuZCcsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIHdyaXRlKGRhdGEsIGVuY29kaW5nKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkICYmIGVuY29kaW5nICE9PSAndXRmLTgnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbiBhIEJyb3dzZXIgZW52aXJvbm1lbnRzIG9ubHkgdXRmLTggdGV4dCBlbmNvZGluZyBpcyBzdXBwb3J0ZWQuIEJ1dCBnb3QgZW5jb2Rpbmc6ICR7ZW5jb2Rpbmd9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKTtcbiAgICB9XG59XG5jb25zdCBfdGV4dEVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbmNvbnN0IF9yaWwgPSBPYmplY3QuZnJlZXplKHtcbiAgICBtZXNzYWdlQnVmZmVyOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgY3JlYXRlOiAoZW5jb2RpbmcpID0+IG5ldyBNZXNzYWdlQnVmZmVyKGVuY29kaW5nKVxuICAgIH0pLFxuICAgIGFwcGxpY2F0aW9uSnNvbjogT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGVuY29kZXI6IE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgbmFtZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgZW5jb2RlOiAobXNnLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2hhcnNldCAhPT0gJ3V0Zi04Jykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluIGEgQnJvd3NlciBlbnZpcm9ubWVudHMgb25seSB1dGYtOCB0ZXh0IGVuY29kaW5nIGlzIHN1cHBvcnRlZC4gQnV0IGdvdCBlbmNvZGluZzogJHtvcHRpb25zLmNoYXJzZXR9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoX3RleHRFbmNvZGVyLmVuY29kZShKU09OLnN0cmluZ2lmeShtc2csIHVuZGVmaW5lZCwgMCkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIGRlY29kZXI6IE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgbmFtZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgZGVjb2RlOiAoYnVmZmVyLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCEoYnVmZmVyIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbiBhIEJyb3dzZXIgZW52aXJvbm1lbnRzIG9ubHkgVWludDhBcnJheXMgYXJlIHN1cHBvcnRlZC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShKU09OLnBhcnNlKG5ldyBUZXh0RGVjb2RlcihvcHRpb25zLmNoYXJzZXQpLmRlY29kZShidWZmZXIpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfSksXG4gICAgc3RyZWFtOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgYXNSZWFkYWJsZVN0cmVhbTogKHNvY2tldCkgPT4gbmV3IFJlYWRhYmxlU3RyZWFtV3JhcHBlcihzb2NrZXQpLFxuICAgICAgICBhc1dyaXRhYmxlU3RyZWFtOiAoc29ja2V0KSA9PiBuZXcgV3JpdGFibGVTdHJlYW1XcmFwcGVyKHNvY2tldClcbiAgICB9KSxcbiAgICBjb25zb2xlOiBjb25zb2xlLFxuICAgIHRpbWVyOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgc2V0VGltZW91dChjYWxsYmFjaywgbXMsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHNldFRpbWVvdXQoY2FsbGJhY2ssIG1zLCAuLi5hcmdzKTtcbiAgICAgICAgICAgIHJldHVybiB7IGRpc3Bvc2U6ICgpID0+IGNsZWFyVGltZW91dChoYW5kbGUpIH07XG4gICAgICAgIH0sXG4gICAgICAgIHNldEltbWVkaWF0ZShjYWxsYmFjaywgLi4uYXJncykge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gc2V0VGltZW91dChjYWxsYmFjaywgMCwgLi4uYXJncyk7XG4gICAgICAgICAgICByZXR1cm4geyBkaXNwb3NlOiAoKSA9PiBjbGVhclRpbWVvdXQoaGFuZGxlKSB9O1xuICAgICAgICB9LFxuICAgICAgICBzZXRJbnRlcnZhbChjYWxsYmFjaywgbXMsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHNldEludGVydmFsKGNhbGxiYWNrLCBtcywgLi4uYXJncyk7XG4gICAgICAgICAgICByZXR1cm4geyBkaXNwb3NlOiAoKSA9PiBjbGVhckludGVydmFsKGhhbmRsZSkgfTtcbiAgICAgICAgfSxcbiAgICB9KVxufSk7XG5mdW5jdGlvbiBSSUwoKSB7XG4gICAgcmV0dXJuIF9yaWw7XG59XG4oZnVuY3Rpb24gKFJJTCkge1xuICAgIGZ1bmN0aW9uIGluc3RhbGwoKSB7XG4gICAgICAgIGFwaV8xLlJBTC5pbnN0YWxsKF9yaWwpO1xuICAgIH1cbiAgICBSSUwuaW5zdGFsbCA9IGluc3RhbGw7XG59KShSSUwgfHwgKFJJTCA9IHt9KSk7XG5leHBvcnRzLmRlZmF1bHQgPSBSSUw7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24gPSBleHBvcnRzLkJyb3dzZXJNZXNzYWdlV3JpdGVyID0gZXhwb3J0cy5Ccm93c2VyTWVzc2FnZVJlYWRlciA9IHZvaWQgMDtcbmNvbnN0IHJpbF8xID0gcmVxdWlyZShcIi4vcmlsXCIpO1xuLy8gSW5zdGFsbCB0aGUgYnJvd3NlciBydW50aW1lIGFic3RyYWN0LlxucmlsXzEuZGVmYXVsdC5pbnN0YWxsKCk7XG5jb25zdCBhcGlfMSA9IHJlcXVpcmUoXCIuLi9jb21tb24vYXBpXCIpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuLi9jb21tb24vYXBpXCIpLCBleHBvcnRzKTtcbmNsYXNzIEJyb3dzZXJNZXNzYWdlUmVhZGVyIGV4dGVuZHMgYXBpXzEuQWJzdHJhY3RNZXNzYWdlUmVhZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihwb3J0KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX29uRGF0YSA9IG5ldyBhcGlfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuX21lc3NhZ2VMaXN0ZW5lciA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fb25EYXRhLmZpcmUoZXZlbnQuZGF0YSk7XG4gICAgICAgIH07XG4gICAgICAgIHBvcnQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoZXZlbnQpID0+IHRoaXMuZmlyZUVycm9yKGV2ZW50KSk7XG4gICAgICAgIHBvcnQub25tZXNzYWdlID0gdGhpcy5fbWVzc2FnZUxpc3RlbmVyO1xuICAgIH1cbiAgICBsaXN0ZW4oY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uRGF0YS5ldmVudChjYWxsYmFjayk7XG4gICAgfVxufVxuZXhwb3J0cy5Ccm93c2VyTWVzc2FnZVJlYWRlciA9IEJyb3dzZXJNZXNzYWdlUmVhZGVyO1xuY2xhc3MgQnJvd3Nlck1lc3NhZ2VXcml0ZXIgZXh0ZW5kcyBhcGlfMS5BYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKHBvcnQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50ID0gMDtcbiAgICAgICAgcG9ydC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIChldmVudCkgPT4gdGhpcy5maXJlRXJyb3IoZXZlbnQpKTtcbiAgICB9XG4gICAgd3JpdGUobXNnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnBvcnQucG9zdE1lc3NhZ2UobXNnKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IsIG1zZyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZUVycm9yKGVycm9yLCBtc2cpIHtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50Kys7XG4gICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yLCBtc2csIHRoaXMuZXJyb3JDb3VudCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICB9XG59XG5leHBvcnRzLkJyb3dzZXJNZXNzYWdlV3JpdGVyID0gQnJvd3Nlck1lc3NhZ2VXcml0ZXI7XG5mdW5jdGlvbiBjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbihyZWFkZXIsIHdyaXRlciwgbG9nZ2VyLCBvcHRpb25zKSB7XG4gICAgaWYgKGxvZ2dlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxvZ2dlciA9IGFwaV8xLk51bGxMb2dnZXI7XG4gICAgfVxuICAgIGlmIChhcGlfMS5Db25uZWN0aW9uU3RyYXRlZ3kuaXMob3B0aW9ucykpIHtcbiAgICAgICAgb3B0aW9ucyA9IHsgY29ubmVjdGlvblN0cmF0ZWd5OiBvcHRpb25zIH07XG4gICAgfVxuICAgIHJldHVybiAoMCwgYXBpXzEuY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24pKHJlYWRlciwgd3JpdGVyLCBsb2dnZXIsIG9wdGlvbnMpO1xufVxuZXhwb3J0cy5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiA9IGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uO1xuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL2Jyb3dzZXIvbWFpbicpOyIsICIvKlxuICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMjYgRWNsaXBzZSBEaXJpZ2libGUgY29udHJpYnV0b3JzXG4gKlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlXG4gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2Mi4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG4gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MjAuaHRtbFxuICpcbiAqIFNQRFgtRmlsZUNvcHlyaWdodFRleHQ6IEVjbGlwc2UgRGlyaWdpYmxlIGNvbnRyaWJ1dG9ycyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbi8qKlxuICogSmF2YSBMU1AgY2xpZW50IGJ1bmRsZS5cbiAqXG4gKiBVc2VzIHZzY29kZS13cy1qc29ucnBjIGZvciB0eXBlZCBKU09OLVJQQyBvdmVyIFdlYlNvY2tldCBhbmQgcmVnaXN0ZXJzIE1vbmFjb1xuICogcHJvdmlkZXJzIHRoYXQgZGVsZWdhdGUgdG8gSkRULkxTLiBFeHBvc2VkIGFzIGdsb2JhbCBKYXZhTHNwQ2xpZW50TGliIHNvIHRoYXRcbiAqIGVkaXRvci5qcyBjYW4gY2FsbCBKYXZhTHNwQ2xpZW50TGliLmNvbm5lY3QocmVzb3VyY2VQYXRoKS5cbiAqXG4gKiBPbmUgSkRULkxTIHByb2Nlc3MgY292ZXJzIHRoZSBlbnRpcmUgd29ya3NwYWNlLCBzbyBhIHNpbmdsZSBXZWJTb2NrZXQgY29ubmVjdGlvblxuICogaXMgc2hhcmVkIGFjcm9zcyBhbGwgSmF2YSBmaWxlcyBvcGVuIGluIHRoZSBzYW1lIGJyb3dzZXIgcGFnZS4gVGhlIGNvbm5lY3Rpb24gaXNcbiAqIGVzdGFibGlzaGVkIG9uIHRoZSBmaXJzdCBjb25uZWN0KCkgY2FsbCBhbmQgcmV1c2VkIGZvciBhbGwgc3Vic2VxdWVudCBjYWxscy5cbiAqXG4gKiBlZGl0b3IuanMgc2V0cyB3aW5kb3cubW9uYWNvIGJlZm9yZSBjYWxsaW5nIGNvbm5lY3QoKSwgc28gdGhlIG1vbmFjby1zaGltJ3MgbGF6eVxuICogUHJveGllcyByZXNvbHZlIGNvcnJlY3RseSBhdCBjYWxsIHRpbWUuXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24sIE1lc3NhZ2VDb25uZWN0aW9uIH0gZnJvbSAndnNjb2RlLWpzb25ycGMvYnJvd3Nlcic7XG5pbXBvcnQgeyB0b1NvY2tldCwgV2ViU29ja2V0TWVzc2FnZVJlYWRlciwgV2ViU29ja2V0TWVzc2FnZVdyaXRlciB9IGZyb20gJ3ZzY29kZS13cy1qc29ucnBjJztcbmltcG9ydCAqIGFzIG1vbmFjbyBmcm9tICdtb25hY28tZWRpdG9yJztcbmltcG9ydCB7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLFxuICAgIERpYWdub3N0aWNTZXZlcml0eSxcbiAgICBJbnNlcnRUZXh0Rm9ybWF0LFxuICAgIE1hcmt1cENvbnRlbnQsXG4gICAgTWFya3VwS2luZCxcbiAgICB0eXBlIENvZGVBY3Rpb24sXG4gICAgdHlwZSBDb21tYW5kLFxuICAgIHR5cGUgQ29tcGxldGlvbkl0ZW0sXG4gICAgdHlwZSBDb21wbGV0aW9uTGlzdCxcbiAgICB0eXBlIERpYWdub3N0aWMsXG4gICAgdHlwZSBIb3ZlcixcbiAgICB0eXBlIExvY2F0aW9uLFxuICAgIHR5cGUgUGFyYW1ldGVySW5mb3JtYXRpb24sXG4gICAgdHlwZSBTaWduYXR1cmVIZWxwLFxuICAgIHR5cGUgU2lnbmF0dXJlSW5mb3JtYXRpb24sXG4gICAgdHlwZSBUZXh0RWRpdCxcbiAgICB0eXBlIFdvcmtzcGFjZUVkaXQsXG59IGZyb20gJ3ZzY29kZS1sYW5ndWFnZXNlcnZlci10eXBlcyc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNpbmdsZXRvbiBzdGF0ZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogU2hhcmVkIGNvbm5lY3Rpb24gXHUyMDE0IG9uZSBwZXIgYnJvd3NlciBwYWdlLCBjb3ZlcmluZyBhbGwgcHJvamVjdHMgaW4gdGhlIHdvcmtzcGFjZS4gKi9cbmxldCBfY29ubjogTWVzc2FnZUNvbm5lY3Rpb24gfCBudWxsID0gbnVsbDtcblxuLyoqXG4gKiBWaXJ0dWFsIHdvcmtzcGFjZSByb290IFVSSSwgZS5nLiB7QGNvZGUgZmlsZTovLy93b3Jrc3BhY2Uvd29ya3NwYWNlL30uXG4gKiBTZXQgb25jZSBvbiBmaXJzdCBjb25uZWN0KCk7IHVzZWQgdG8gc2NvcGUgTW9uYWNvIHByb3ZpZGVycyB0byB3b3Jrc3BhY2UgZmlsZXMuXG4gKi9cbmxldCBfd29ya3NwYWNlUm9vdCA9ICcnO1xuXG4vKiogVVJJcyBmb3Igd2hpY2ggdGV4dERvY3VtZW50L2RpZE9wZW4gaGFzIGFscmVhZHkgYmVlbiBzZW50LiAqL1xuY29uc3QgX29wZW5GaWxlczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cbi8qKiBQZW5kaW5nIGRlYm91bmNlZCBkaWRDaGFuZ2UgdGltZXJzIHBlciBmaWxlIFVSSSwgc28gYSBjaGFuZ2UgY2FuIGJlIGZsdXNoZWQgYmVmb3JlIGNvbXBsZXRpb24uICovXG5jb25zdCBfY2hhbmdlVGltZXJzOiBNYXA8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0Pj4gPSBuZXcgTWFwKCk7XG5cbi8qKlxuICogTGFzdCBkaWFnbm9zdGljcyBwdWJsaXNoZWQgcGVyIGZpbGUgVVJJLCBrZXB0IHZlcmJhdGltICh3aXRoIHRoZWlyIExTUCBjb2RlL2RhdGEpLiBDb2RlLWFjdGlvblxuICogcmVxdWVzdHMgbXVzdCBzZW5kIHRoZXNlIFx1MjAxNCBKRFQuTFMgbWF0Y2hlcyBxdWljay1maXhlcyBieSB0aGUgZGlhZ25vc3RpYydzIGNvZGUvZGF0YSwgd2hpY2ggTW9uYWNvJ3NcbiAqIElNYXJrZXJEYXRhIGNhbm5vdCByb3VuZC10cmlwLCBzbyByZWNvbnN0cnVjdGluZyBkaWFnbm9zdGljcyBmcm9tIG1hcmtlcnMgeWllbGRzIG5vIHF1aWNrLWZpeGVzLlxuICovXG5jb25zdCBfZGlhZ25vc3RpY3M6IE1hcDxzdHJpbmcsIERpYWdub3N0aWNbXT4gPSBuZXcgTWFwKCk7XG5cbmxldCBfcHJvdmlkZXJzUmVnaXN0ZXJlZCA9IGZhbHNlO1xuXG4vKiogU2VtYW50aWMtdG9rZW4gbGVnZW5kIHJlcG9ydGVkIGJ5IEpEVC5MUyBpbiB0aGUgaW5pdGlhbGl6ZSByZXN1bHQ7IG5lZWRlZCB0byBkZWNvZGUgdG9rZW4gZGF0YS4gKi9cbmxldCBfc2VtYW50aWNUb2tlbnNMZWdlbmQ6IHsgdG9rZW5UeXBlczogc3RyaW5nW107IHRva2VuTW9kaWZpZXJzOiBzdHJpbmdbXSB9IHwgbnVsbCA9IG51bGw7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFB1YmxpYyBBUElcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIENhbGxlZCBieSBlZGl0b3IuanMgd2hlbiBhIEphdmEgZmlsZSBpcyBvcGVuZWQuIFNhZmUgdG8gY2FsbCBtdWx0aXBsZSB0aW1lcy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb25uZWN0KHJlc291cmNlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFydHMgPSByZXNvdXJjZVBhdGgucmVwbGFjZSgvXlxcLy8sICcnKS5zcGxpdCgnLycpO1xuICAgIGNvbnN0IHdvcmtzcGFjZSA9IHBhcnRzWzBdO1xuICAgIGNvbnN0IHByb2plY3QgICA9IHBhcnRzWzFdO1xuICAgIGNvbnN0IGZpbGVVcmkgPSBgZmlsZTovLy93b3Jrc3BhY2UvJHt3b3Jrc3BhY2V9LyR7cHJvamVjdH0vJHtwYXJ0cy5zbGljZSgyKS5qb2luKCcvJyl9YDtcblxuICAgIGlmIChfY29ubikge1xuICAgICAgICAvLyBDb25uZWN0aW9uIGFscmVhZHkgZXN0YWJsaXNoZWQgXHUyMDE0IGp1c3Qgb3BlbiB0aGUgbmV3IGZpbGUuXG4gICAgICAgIG9wZW5GaWxlKGZpbGVVcmkpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgX3dvcmtzcGFjZVJvb3QgPSBgZmlsZTovLy93b3Jrc3BhY2UvJHt3b3Jrc3BhY2V9L2A7XG5cbiAgICBjb25zdCBwcm90byA9IGxvY2F0aW9uLnByb3RvY29sID09PSAnaHR0cHM6JyA/ICd3c3MnIDogJ3dzJztcbiAgICBjb25zdCB3c1VybCA9IGAke3Byb3RvfTovLyR7bG9jYXRpb24uaG9zdH0vd2Vic29ja2V0cy9pZGUvamF2YS1sc3BgXG4gICAgICAgICAgICAgICAgKyBgP3dvcmtzcGFjZT0ke2VuY29kZVVSSUNvbXBvbmVudCh3b3Jrc3BhY2UpfWA7XG5cbiAgICBjb25zdCB3cyA9IG5ldyBXZWJTb2NrZXQod3NVcmwpO1xuICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgd3Mub25vcGVuICA9ICgpID0+IHJlc29sdmUoKTtcbiAgICAgICAgd3Mub25lcnJvciA9ICgpID0+IHJlamVjdChuZXcgRXJyb3IoYFtqYXZhLWxzcF0gV2ViU29ja2V0IGNvbm5lY3QgZmFpbGVkOiAke3dzVXJsfWApKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHNvY2tldCA9IHRvU29ja2V0KHdzKTtcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgV2ViU29ja2V0TWVzc2FnZVJlYWRlcihzb2NrZXQpO1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBXZWJTb2NrZXRNZXNzYWdlV3JpdGVyKHNvY2tldCk7XG4gICAgX2Nvbm4gPSBjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbihyZWFkZXIsIHdyaXRlcik7XG5cbiAgICAvLyBEaWFnbm9zdGljcyBub3RpZmljYXRpb24gXHUyMTkyIE1vbmFjbyBtYXJrZXJzIChhcHBsaWVzIHRvIGFueSB3b3Jrc3BhY2UgZmlsZSlcbiAgICBfY29ubi5vbk5vdGlmaWNhdGlvbigndGV4dERvY3VtZW50L3B1Ymxpc2hEaWFnbm9zdGljcycsIChwYXJhbXM6IHsgdXJpOiBzdHJpbmc7IGRpYWdub3N0aWNzOiBEaWFnbm9zdGljW10gfSkgPT4ge1xuICAgICAgICBfZGlhZ25vc3RpY3Muc2V0KHBhcmFtcy51cmksIHBhcmFtcy5kaWFnbm9zdGljcyA/PyBbXSk7XG4gICAgICAgIGNvbnN0IG1vZGVsID0gbW9uYWNvLmVkaXRvci5nZXRNb2RlbHMoKS5maW5kKG0gPT4gbS51cmkudG9TdHJpbmcoKSA9PT0gcGFyYW1zLnVyaSk7XG4gICAgICAgIGlmICghbW9kZWwpIHJldHVybjtcbiAgICAgICAgbW9uYWNvLmVkaXRvci5zZXRNb2RlbE1hcmtlcnMobW9kZWwsICdqYXZhLWxzcCcsIHBhcmFtcy5kaWFnbm9zdGljcy5tYXAoZCA9PiAoe1xuICAgICAgICAgICAgc2V2ZXJpdHk6ICAgICAgICBsc3BTZXZlcml0eShkLnNldmVyaXR5KSxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICAgICAgICAgZC5tZXNzYWdlLFxuICAgICAgICAgICAgc291cmNlOiAgICAgICAgICBkLnNvdXJjZSA/PyAnamF2YScsXG4gICAgICAgICAgICBzdGFydExpbmVOdW1iZXI6IGQucmFuZ2Uuc3RhcnQubGluZSArIDEsXG4gICAgICAgICAgICBzdGFydENvbHVtbjogICAgIGQucmFuZ2Uuc3RhcnQuY2hhcmFjdGVyICsgMSxcbiAgICAgICAgICAgIGVuZExpbmVOdW1iZXI6ICAgZC5yYW5nZS5lbmQubGluZSArIDEsXG4gICAgICAgICAgICBlbmRDb2x1bW46ICAgICAgIGQucmFuZ2UuZW5kLmNoYXJhY3RlciArIDEsXG4gICAgICAgIH0pKSk7XG4gICAgfSk7XG5cbiAgICAvLyBTZXJ2ZXIgLT4gY2xpZW50IHJlcXVlc3RzIHRoYXQgZHJpdmUgcmVmYWN0b3IgLyBnZW5lcmF0ZSByZXN1bHRzIGFuZCBkeW5hbWljIHJlZ2lzdHJhdGlvbi5cbiAgICBfY29ubi5vblJlcXVlc3QoJ3dvcmtzcGFjZS9hcHBseUVkaXQnLCAocGFyYW1zOiB7IGVkaXQ6IFdvcmtzcGFjZUVkaXQgfSkgPT4ge1xuICAgICAgICBhcHBseVdvcmtzcGFjZUVkaXQocGFyYW1zLmVkaXQpO1xuICAgICAgICByZXR1cm4geyBhcHBsaWVkOiB0cnVlIH07XG4gICAgfSk7XG4gICAgX2Nvbm4ub25SZXF1ZXN0KCd3b3Jrc3BhY2UvY29uZmlndXJhdGlvbicsIChwYXJhbXM6IHsgaXRlbXM6IEFycmF5PHsgc2VjdGlvbj86IHN0cmluZyB9PiB9KSA9PlxuICAgICAgICAocGFyYW1zLml0ZW1zID8/IFtdKS5tYXAoKCkgPT4gamR0bHNTZXR0aW5ncygpLmphdmEpKTtcbiAgICBfY29ubi5vblJlcXVlc3QoJ2NsaWVudC9yZWdpc3RlckNhcGFiaWxpdHknLCAoKSA9PiBudWxsKTtcbiAgICBfY29ubi5vblJlcXVlc3QoJ2NsaWVudC91bnJlZ2lzdGVyQ2FwYWJpbGl0eScsICgpID0+IG51bGwpO1xuICAgIF9jb25uLm9uUmVxdWVzdCgnd2luZG93L3Nob3dNZXNzYWdlUmVxdWVzdCcsICgpID0+IG51bGwpO1xuICAgIF9jb25uLm9uUmVxdWVzdCgnd2luZG93L3dvcmtEb25lUHJvZ3Jlc3MvY3JlYXRlJywgKCkgPT4gbnVsbCk7XG4gICAgX2Nvbm4ub25Ob3RpZmljYXRpb24oJ3dpbmRvdy9sb2dNZXNzYWdlJywgKHA6IHsgbWVzc2FnZTogc3RyaW5nIH0pID0+IGNvbnNvbGUuZGVidWcoJ1tqYXZhLWxzcF0nLCBwPy5tZXNzYWdlKSk7XG4gICAgX2Nvbm4ub25Ob3RpZmljYXRpb24oJ3dpbmRvdy9zaG93TWVzc2FnZScsIChwOiB7IG1lc3NhZ2U6IHN0cmluZyB9KSA9PiBjb25zb2xlLmluZm8oJ1tqYXZhLWxzcF0nLCBwPy5tZXNzYWdlKSk7XG4gICAgLy8gSkRULkxTIGxhbmd1YWdlLXN0YXR1cyAvIHByb2dyZXNzIG5vdGlmaWNhdGlvbnMgXHUyMDE0IGFja25vd2xlZGdlZCBzaWxlbnRseS5cbiAgICBfY29ubi5vbk5vdGlmaWNhdGlvbignbGFuZ3VhZ2Uvc3RhdHVzJywgKCkgPT4geyAvKiBpbmRleGluZy9yZWFkeSBzdGF0dXMsIGlnbm9yZWQgKi8gfSk7XG4gICAgX2Nvbm4ub25Ob3RpZmljYXRpb24oJ2xhbmd1YWdlL3Byb2dyZXNzUmVwb3J0JywgKCkgPT4geyAvKiBidWlsZCBwcm9ncmVzcywgaWdub3JlZCAqLyB9KTtcblxuICAgIF9jb25uLmxpc3RlbigpO1xuXG4gICAgY29uc3Qgcm9vdFVyaSA9IF93b3Jrc3BhY2VSb290O1xuICAgIGNvbnN0IGluaXRSZXN1bHQ6IGFueSA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCdpbml0aWFsaXplJywge1xuICAgICAgICBwcm9jZXNzSWQ6IG51bGwsXG4gICAgICAgIHJvb3RVcmksXG4gICAgICAgIGluaXRpYWxpemF0aW9uT3B0aW9uczoge1xuICAgICAgICAgICAgc2V0dGluZ3M6IGpkdGxzU2V0dGluZ3MoKSxcbiAgICAgICAgICAgIGV4dGVuZGVkQ2xpZW50Q2FwYWJpbGl0aWVzOiB7XG4gICAgICAgICAgICAgICAgcHJvZ3Jlc3NSZXBvcnRQcm92aWRlcjogICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICAgICBjbGFzc0ZpbGVDb250ZW50c1N1cHBvcnQ6ICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgcmVzb2x2ZUFkZGl0aW9uYWxUZXh0RWRpdHNTdXBwb3J0OiB0cnVlLFxuICAgICAgICAgICAgICAgIC8vIERvIE5PVCBhZHZlcnRpc2UgdGhlICpQcm9tcHRTdXBwb3J0IGZsYWdzOiB0aG9zZSBtYWtlIEpEVC5MUyByZXR1cm4gc291cmNlIGFjdGlvbnNcbiAgICAgICAgICAgICAgICAvLyAoZ2VuZXJhdGUgdG9TdHJpbmcvY29uc3RydWN0b3JzL2FjY2Vzc29ycywgb3ZlcnJpZGUvaW1wbGVtZW50LCBvcmdhbml6ZSBpbXBvcnRzKSBhc1xuICAgICAgICAgICAgICAgIC8vIGNsaWVudC1zaWRlIFwiKlByb21wdFwiIGNvbW1hbmRzIHRoZSB2c2NvZGUtamF2YSBleHRlbnNpb24gaW1wbGVtZW50cyBidXQgd2UgZG9uJ3QuXG4gICAgICAgICAgICAgICAgLy8gV2l0aCB0aGVtIG9mZiwgSkRULkxTIHJldHVybnMgdGhlIHNhbWUgYWN0aW9ucyBhcyByZXNvbHZhYmxlIFdvcmtzcGFjZUVkaXRzIG9wZXJhdGluZ1xuICAgICAgICAgICAgICAgIC8vIG9uIGFsbCBtZW1iZXJzLCB3aGljaCBhcHBseUNvZGVBY3Rpb24gcmVzb2x2ZXMgYW5kIGFwcGxpZXMgZGlyZWN0bHkuXG4gICAgICAgICAgICAgICAgaW5mZXJTZWxlY3Rpb25TdXBwb3J0OiAgICAgICAgICAgICBbJ2V4dHJhY3RNZXRob2QnLCAnZXh0cmFjdFZhcmlhYmxlJywgJ2V4dHJhY3RGaWVsZCddLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgd29ya3NwYWNlRm9sZGVyczogW3sgdXJpOiByb290VXJpLCBuYW1lOiB3b3Jrc3BhY2UgfV0sXG4gICAgICAgIGNhcGFiaWxpdGllczoge1xuICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7XG4gICAgICAgICAgICAgICAgc3luY2hyb25pemF0aW9uOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUsIHdpbGxTYXZlOiBmYWxzZSwgZGlkU2F2ZTogdHJ1ZSwgd2lsbFNhdmVXYWl0VW50aWw6IGZhbHNlIH0sXG4gICAgICAgICAgICAgICAgY29tcGxldGlvbjoge1xuICAgICAgICAgICAgICAgICAgICBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uSXRlbToge1xuICAgICAgICAgICAgICAgICAgICAgICAgc25pcHBldFN1cHBvcnQ6ICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRhdGlvbkZvcm1hdDogICBbJ21hcmtkb3duJywgJ3BsYWludGV4dCddLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRlZFN1cHBvcnQ6ICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWl0Q2hhcmFjdGVyc1N1cHBvcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlU3VwcG9ydDogICAgICAgIHsgcHJvcGVydGllczogWydkb2N1bWVudGF0aW9uJywgJ2RldGFpbCcsICdhZGRpdGlvbmFsVGV4dEVkaXRzJ10gfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dFN1cHBvcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBob3ZlcjogICAgICAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLCBjb250ZW50Rm9ybWF0OiBbJ21hcmtkb3duJywgJ3BsYWludGV4dCddIH0sXG4gICAgICAgICAgICAgICAgc2lnbmF0dXJlSGVscDogIHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSwgc2lnbmF0dXJlSW5mb3JtYXRpb246IHsgZG9jdW1lbnRhdGlvbkZvcm1hdDogWydtYXJrZG93bicsICdwbGFpbnRleHQnXSwgcGFyYW1ldGVySW5mb3JtYXRpb246IHsgbGFiZWxPZmZzZXRTdXBwb3J0OiB0cnVlIH0gfSB9LFxuICAgICAgICAgICAgICAgIGRlZmluaXRpb246ICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VzOiAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb246IHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIHR5cGVEZWZpbml0aW9uOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICBkb2N1bWVudEhpZ2hsaWdodDogeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgZG9jdW1lbnRTeW1ib2w6IHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSwgaGllcmFyY2hpY2FsRG9jdW1lbnRTeW1ib2xTdXBwb3J0OiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgZm9sZGluZ1JhbmdlOiAgIHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSwgbGluZUZvbGRpbmdPbmx5OiBmYWxzZSB9LFxuICAgICAgICAgICAgICAgIHNlbGVjdGlvblJhbmdlOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICBjb2RlTGVuczogICAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgaW5sYXlIaW50OiAgICAgIHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSwgcmVzb2x2ZVN1cHBvcnQ6IHsgcHJvcGVydGllczogWydsYWJlbCddIH0gfSxcbiAgICAgICAgICAgICAgICBzZW1hbnRpY1Rva2Vuczoge1xuICAgICAgICAgICAgICAgICAgICBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0czogICAgICAgIHsgcmFuZ2U6IGZhbHNlLCBmdWxsOiB7IGRlbHRhOiBmYWxzZSB9IH0sXG4gICAgICAgICAgICAgICAgICAgIHRva2VuVHlwZXM6ICAgICAgWyduYW1lc3BhY2UnLCAndHlwZScsICdjbGFzcycsICdlbnVtJywgJ2ludGVyZmFjZScsICdzdHJ1Y3QnLCAndHlwZVBhcmFtZXRlcicsXG4gICAgICAgICAgICAgICAgICAgICAgICAncGFyYW1ldGVyJywgJ3ZhcmlhYmxlJywgJ3Byb3BlcnR5JywgJ2VudW1NZW1iZXInLCAnZXZlbnQnLCAnZnVuY3Rpb24nLCAnbWV0aG9kJywgJ21hY3JvJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdrZXl3b3JkJywgJ21vZGlmaWVyJywgJ2NvbW1lbnQnLCAnc3RyaW5nJywgJ251bWJlcicsICdyZWdleHAnLCAnb3BlcmF0b3InLCAnZGVjb3JhdG9yJ10sXG4gICAgICAgICAgICAgICAgICAgIHRva2VuTW9kaWZpZXJzOiAgWydkZWNsYXJhdGlvbicsICdkZWZpbml0aW9uJywgJ3JlYWRvbmx5JywgJ3N0YXRpYycsICdkZXByZWNhdGVkJywgJ2Fic3RyYWN0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdhc3luYycsICdtb2RpZmljYXRpb24nLCAnZG9jdW1lbnRhdGlvbicsICdkZWZhdWx0TGlicmFyeSddLFxuICAgICAgICAgICAgICAgICAgICBmb3JtYXRzOiAgICAgICAgIFsncmVsYXRpdmUnXSxcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxhcHBpbmdUb2tlblN1cHBvcnQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBtdWx0aWxpbmVUb2tlblN1cHBvcnQ6ICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBmb3JtYXR0aW5nOiAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgcmFuZ2VGb3JtYXR0aW5nOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICByZW5hbWU6ICAgICAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLCBwcmVwYXJlU3VwcG9ydDogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIGNvZGVBY3Rpb246IHtcbiAgICAgICAgICAgICAgICAgICAgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgY29kZUFjdGlvbkxpdGVyYWxTdXBwb3J0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlQWN0aW9uS2luZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU2V0OiBbJ3F1aWNrZml4JywgJ3JlZmFjdG9yJywgJ3JlZmFjdG9yLmV4dHJhY3QnLCAncmVmYWN0b3IuaW5saW5lJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlZmFjdG9yLnJld3JpdGUnLCAnc291cmNlJywgJ3NvdXJjZS5vcmdhbml6ZUltcG9ydHMnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGlzUHJlZmVycmVkU3VwcG9ydDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgZGF0YVN1cHBvcnQ6ICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlU3VwcG9ydDogICAgIHsgcHJvcGVydGllczogWydlZGl0J10gfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHB1Ymxpc2hEaWFnbm9zdGljczogeyByZWxhdGVkSW5mb3JtYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3b3Jrc3BhY2U6IHtcbiAgICAgICAgICAgICAgICBhcHBseUVkaXQ6ICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb246ICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgZXhlY3V0ZUNvbW1hbmQ6ICAgICAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgZGlkQ2hhbmdlQ29uZmlndXJhdGlvbjogeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgd29ya3NwYWNlRWRpdDogICAgICAgICAgeyBkb2N1bWVudENoYW5nZXM6IHRydWUsIHJlc291cmNlT3BlcmF0aW9uczogWydjcmVhdGUnLCAncmVuYW1lJywgJ2RlbGV0ZSddIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgX3NlbWFudGljVG9rZW5zTGVnZW5kID0gaW5pdFJlc3VsdD8uY2FwYWJpbGl0aWVzPy5zZW1hbnRpY1Rva2Vuc1Byb3ZpZGVyPy5sZWdlbmQgPz8gbnVsbDtcblxuICAgIF9jb25uLnNlbmROb3RpZmljYXRpb24oJ2luaXRpYWxpemVkJywge30pO1xuICAgIF9jb25uLnNlbmROb3RpZmljYXRpb24oJ3dvcmtzcGFjZS9kaWRDaGFuZ2VDb25maWd1cmF0aW9uJywgeyBzZXR0aW5nczogamR0bHNTZXR0aW5ncygpIH0pO1xuXG4gICAgb3BlbkZpbGUoZmlsZVVyaSk7XG5cbiAgICBpZiAoIV9wcm92aWRlcnNSZWdpc3RlcmVkKSB7XG4gICAgICAgIF9wcm92aWRlcnNSZWdpc3RlcmVkID0gdHJ1ZTtcbiAgICAgICAgcmVnaXN0ZXJQcm92aWRlcnMoKTtcbiAgICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEZpbGUgbGlmZWN5Y2xlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogU2VuZHMgdGV4dERvY3VtZW50L2RpZE9wZW4gZm9yIHRoZSBnaXZlbiBVUkkgKGlmIG5vdCBhbHJlYWR5IHNlbnQpIGFuZCByZWdpc3RlcnMgYSBkZWJvdW5jZWRcbiAqIHRleHREb2N1bWVudC9kaWRDaGFuZ2UgbGlzdGVuZXIgb24gdGhlIGNvcnJlc3BvbmRpbmcgTW9uYWNvIG1vZGVsLlxuICovXG5mdW5jdGlvbiBvcGVuRmlsZShmaWxlVXJpOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoX29wZW5GaWxlcy5oYXMoZmlsZVVyaSkgfHwgIV9jb25uKSByZXR1cm47XG4gICAgX29wZW5GaWxlcy5hZGQoZmlsZVVyaSk7XG5cbiAgICBjb25zdCBtb2RlbCA9IG1vbmFjby5lZGl0b3IuZ2V0TW9kZWxzKCkuZmluZChtID0+IG0udXJpLnRvU3RyaW5nKCkgPT09IGZpbGVVcmkpO1xuICAgIF9jb25uLnNlbmROb3RpZmljYXRpb24oJ3RleHREb2N1bWVudC9kaWRPcGVuJywge1xuICAgICAgICB0ZXh0RG9jdW1lbnQ6IHtcbiAgICAgICAgICAgIHVyaTogICAgICAgIGZpbGVVcmksXG4gICAgICAgICAgICBsYW5ndWFnZUlkOiAnamF2YScsXG4gICAgICAgICAgICB2ZXJzaW9uOiAgICAxLFxuICAgICAgICAgICAgdGV4dDogICAgICAgbW9kZWw/LmdldFZhbHVlKCkgPz8gJycsXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBpZiAobW9kZWwpIHtcbiAgICAgICAgbW9kZWwub25EaWRDaGFuZ2VDb250ZW50KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gX2NoYW5nZVRpbWVycy5nZXQoZmlsZVVyaSk7XG4gICAgICAgICAgICBpZiAoZXhpc3RpbmcpIGNsZWFyVGltZW91dChleGlzdGluZyk7XG4gICAgICAgICAgICBfY2hhbmdlVGltZXJzLnNldChmaWxlVXJpLCBzZXRUaW1lb3V0KCgpID0+IHNlbmREaWRDaGFuZ2UoZmlsZVVyaSksIDQwMCkpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbi8qKiBTZW5kcyB0aGUgY3VycmVudCBtb2RlbCBjb250ZW50IGFzIGEgZGlkQ2hhbmdlIGFuZCBjbGVhcnMgYW55IHBlbmRpbmcgZGVib3VuY2UgZm9yIHRoZSBmaWxlLiAqL1xuZnVuY3Rpb24gc2VuZERpZENoYW5nZShmaWxlVXJpOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBfY2hhbmdlVGltZXJzLmRlbGV0ZShmaWxlVXJpKTtcbiAgICBjb25zdCBtb2RlbCA9IG1vbmFjby5lZGl0b3IuZ2V0TW9kZWwobW9uYWNvLlVyaS5wYXJzZShmaWxlVXJpKSk7XG4gICAgaWYgKF9jb25uICYmIG1vZGVsKSB7XG4gICAgICAgIF9jb25uLnNlbmROb3RpZmljYXRpb24oJ3RleHREb2N1bWVudC9kaWRDaGFuZ2UnLCB7XG4gICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6ICAgeyB1cmk6IGZpbGVVcmksIHZlcnNpb246IG1vZGVsLmdldFZlcnNpb25JZCgpIH0sXG4gICAgICAgICAgICBjb250ZW50Q2hhbmdlczogW3sgdGV4dDogbW9kZWwuZ2V0VmFsdWUoKSB9XSxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEZsdXNoZXMgYSBwZW5kaW5nIGRlYm91bmNlZCBjaGFuZ2UgaW1tZWRpYXRlbHkuIENhbGxlZCBiZWZvcmUgYSBjb21wbGV0aW9uIHJlcXVlc3Qgc28gSkRULkxTIHNlZXMgdGhlXG4gKiBqdXN0LXR5cGVkIHRleHQgb24gdGhlIGZpcnN0IEN0cmwrU3BhY2UsIGluc3RlYWQgb2YgY29tcGxldGluZyBhZ2FpbnN0IHN0YWxlIGNvbnRlbnQgKHRoZSBkZWJvdW5jZVxuICogb3RoZXJ3aXNlIGRlbGF5cyB0aGUgY2hhbmdlIGJ5IHVwIHRvIDQwMG1zIFx1MjAxNCB0aGUgY2F1c2Ugb2YgXCJmaXJzdCBDdHJsK1NwYWNlIHNob3dzIG5vdGhpbmdcIikuXG4gKi9cbmZ1bmN0aW9uIGZsdXNoUGVuZGluZ0NoYW5nZShmaWxlVXJpOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoX2NoYW5nZVRpbWVycy5oYXMoZmlsZVVyaSkpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KF9jaGFuZ2VUaW1lcnMuZ2V0KGZpbGVVcmkpISk7XG4gICAgICAgIHNlbmREaWRDaGFuZ2UoZmlsZVVyaSk7XG4gICAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBXb3Jrc3BhY2UgZmlsZSBwcmVkaWNhdGVcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBSZXR1cm5zIHtAY29kZSB0cnVlfSB3aGVuIHRoZSBnaXZlbiBtb2RlbCBVUkkgYmVsb25ncyB0byB0aGUgY3VycmVudGx5IGNvbm5lY3RlZCB3b3Jrc3BhY2UuIFVzZWRcbiAqIGJ5IE1vbmFjbyBwcm92aWRlcnMgdG8gc2tpcCBub24tSmF2YS13b3Jrc3BhY2UgbW9kZWxzIHdpdGhvdXQgYW4gZXhhY3QtVVJJIGNvbXBhcmlzb24uXG4gKi9cbmZ1bmN0aW9uIGlzV29ya3NwYWNlRmlsZSh1cmk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBfd29ya3NwYWNlUm9vdCAhPT0gJycgJiYgdXJpLnN0YXJ0c1dpdGgoX3dvcmtzcGFjZVJvb3QpO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBNb25hY28gcHJvdmlkZXIgcmVnaXN0cmF0aW9uXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIHJlZ2lzdGVyUHJvdmlkZXJzKCk6IHZvaWQge1xuXG4gICAgbW9uYWNvLmVkaXRvci5yZWdpc3RlckNvbW1hbmQoQVBQTFlfQUNUSU9OX0NPTU1BTkQsIChfYWNjZXNzb3I6IHVua25vd24sIGFjdGlvbjogQ29kZUFjdGlvbiB8IENvbW1hbmQpID0+IHtcbiAgICAgICAgYXBwbHlDb2RlQWN0aW9uKGFjdGlvbik7XG4gICAgfSk7XG4gICAgbW9uYWNvLmVkaXRvci5yZWdpc3RlckNvbW1hbmQoTk9PUF9DT01NQU5ELCAoKSA9PiB7IC8qIGRpc3BsYXktb25seSBDb2RlTGVucyAqLyB9KTtcblxuICAgIC8vIENyb3NzLWZpbGUgbmF2aWdhdGlvbjogdGhpcyBzaW5nbGUtZmlsZSBlZGl0b3IgaGFzIG5vIG1vZGVsIGZvciBvdGhlciB3b3Jrc3BhY2UgZmlsZXMsIHNvIEdvIHRvXG4gICAgLy8gRGVmaW5pdGlvbiAvIEZpbmQgUmVmZXJlbmNlcyB0byBhbm90aGVyIGZpbGUgd291bGQgc2lsZW50bHkgZG8gbm90aGluZy4gSGFuZCB0aG9zZSBvZmYgdG8gdGhlIElERVxuICAgIC8vIHRvIG9wZW4gdGhlIHRhcmdldCBmaWxlIChhbmQgcmV2ZWFsIHRoZSBsaW5lKS4gU2FtZS1maWxlIHRhcmdldHMgZmFsbCB0aHJvdWdoIHRvIE1vbmFjby5cbiAgICBtb25hY28uZWRpdG9yLnJlZ2lzdGVyRWRpdG9yT3BlbmVyKHtcbiAgICAgICAgb3BlbkNvZGVFZGl0b3I6IChzb3VyY2UsIHJlc291cmNlLCBzZWxlY3Rpb25PclBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB1cmkgPSByZXNvdXJjZS50b1N0cmluZygpO1xuICAgICAgICAgICAgaWYgKCFpc1dvcmtzcGFjZUZpbGUodXJpKSB8fCAhdXJpLnN0YXJ0c1dpdGgoVklSVFVBTF9GSUxFX1BSRUZJWCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRNb2RlbCA9IHNvdXJjZS5nZXRNb2RlbCgpO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRNb2RlbCAmJiBjdXJyZW50TW9kZWwudXJpLnRvU3RyaW5nKCkgPT09IHVyaSkgcmV0dXJuIGZhbHNlOyAvLyBzYW1lIGZpbGUgXHUyMDE0IGxldCBNb25hY28ganVtcFxuICAgICAgICAgICAgY29uc3Qgb3BlbmVyID0gKGdsb2JhbFRoaXMgYXMgYW55KS5qYXZhTHNwT3BlbkZpbGU7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wZW5lciAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgcG9zID0gc2VsZWN0aW9uT3JQb3NpdGlvbiBhcyB7IHN0YXJ0TGluZU51bWJlcj86IG51bWJlcjsgbGluZU51bWJlcj86IG51bWJlcjsgc3RhcnRDb2x1bW4/OiBudW1iZXI7IGNvbHVtbj86IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgbGluZSA9IHBvcyA/IChwb3Muc3RhcnRMaW5lTnVtYmVyID8/IHBvcy5saW5lTnVtYmVyKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHBvcyA/IChwb3Muc3RhcnRDb2x1bW4gPz8gcG9zLmNvbHVtbikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBvcGVuZXIodXJpLnN1YnN0cmluZyhWSVJUVUFMX0ZJTEVfUFJFRklYLmxlbmd0aCksIGxpbmUsIGNvbHVtbik7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJDb21wbGV0aW9uSXRlbVByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICB0cmlnZ2VyQ2hhcmFjdGVyczogWycuJywgJ0AnLCAnPCddLFxuICAgICAgICBwcm92aWRlQ29tcGxldGlvbkl0ZW1zOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uLCBjb250ZXh0KSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVVcmkgPSBtb2RlbC51cmkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBKRFQuTFMgaGFzIHRoZSBqdXN0LXR5cGVkIHRleHQgYmVmb3JlIGNvbXBsZXRpbmcgKHNlZSBmbHVzaFBlbmRpbmdDaGFuZ2UpLlxuICAgICAgICAgICAgZmx1c2hQZW5kaW5nQ2hhbmdlKGZpbGVVcmkpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBDb21wbGV0aW9uTGlzdCB8IENvbXBsZXRpb25JdGVtW10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9jb21wbGV0aW9uJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IGZpbGVVcmkgfSxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogICAgIHsgbGluZTogcG9zaXRpb24ubGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogcG9zaXRpb24uY29sdW1uIC0gMSB9LFxuICAgICAgICAgICAgICAgIC8vIE1vbmFjbyB0cmlnZ2VyIGtpbmRzIGFyZSAwLWJhc2VkIChJbnZva2UvVHJpZ2dlckNoYXJhY3Rlci9Gb3JJbmNvbXBsZXRlKTsgTFNQIGlzIDEtYmFzZWQuXG4gICAgICAgICAgICAgICAgY29udGV4dDogICAgICB7IHRyaWdnZXJLaW5kOiAoY29udGV4dC50cmlnZ2VyS2luZCA/PyAwKSArIDEsIHRyaWdnZXJDaGFyYWN0ZXI6IGNvbnRleHQudHJpZ2dlckNoYXJhY3RlciB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBpdGVtcyA9IEFycmF5LmlzQXJyYXkocmVzdWx0KSA/IHJlc3VsdCA6IChyZXN1bHQ/Lml0ZW1zID8/IFtdKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3VnZ2VzdGlvbnM6IGl0ZW1zLm1hcChpdGVtID0+IGxzcENvbXBsZXRpb25Ub01vbmFjbyhpdGVtLCBtb2RlbCwgcG9zaXRpb24pKSxcbiAgICAgICAgICAgICAgICAvLyBKRFQuTFMgcmV0dXJucyBhIHRydW5jYXRlZCBsaXN0IG9uIHRoZSBmaXJzdCBrZXlzdHJva2VzOyBwcm9wYWdhdGluZyBcImluY29tcGxldGVcIiBtYWtlc1xuICAgICAgICAgICAgICAgIC8vIE1vbmFjbyByZS1xdWVyeSBhcyB0aGUgdXNlciB0eXBlcyBpbnN0ZWFkIG9mIGNhY2hpbmcgdGhlIGZpcnN0IChvZnRlbiBlbXB0eSkgcmVzdWx0LlxuICAgICAgICAgICAgICAgIGluY29tcGxldGU6ICBBcnJheS5pc0FycmF5KHJlc3VsdCkgPyBmYWxzZSA6ICEhcmVzdWx0Py5pc0luY29tcGxldGUsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvLyBSZXNvbHZlIGRvY3VtZW50YXRpb24gYW5kLCBjcnVjaWFsbHksIHRoZSBhdXRvLWltcG9ydCBhZGRpdGlvbmFsVGV4dEVkaXRzIHdoaWNoIEpEVC5MUyBvbmx5XG4gICAgICAgIC8vIGF0dGFjaGVzIG9uIHJlc29sdmUgXHUyMDE0IHNlbGVjdGluZyBhIHR5cGUgdGhlbiBpbnNlcnRzIGl0cyBpbXBvcnQgc3RhdGVtZW50LlxuICAgICAgICByZXNvbHZlQ29tcGxldGlvbkl0ZW06IGFzeW5jIChpdGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsc3AgPSAoaXRlbSBhcyBNb25hY29Db21wbGV0aW9uSXRlbSkuX2xzcDtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWxzcCkgcmV0dXJuIGl0ZW07XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkOiBDb21wbGV0aW9uSXRlbSA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCdjb21wbGV0aW9uSXRlbS9yZXNvbHZlJywgbHNwKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQuZG9jdW1lbnRhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBpdGVtLmRvY3VtZW50YXRpb24gPSB7IHZhbHVlOiBtYXJrdXBUb1N0cmluZyhyZXNvbHZlZC5kb2N1bWVudGF0aW9uKSwgaXNUcnVzdGVkOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQuZGV0YWlsKSBpdGVtLmRldGFpbCA9IHJlc29sdmVkLmRldGFpbDtcbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQuYWRkaXRpb25hbFRleHRFZGl0cz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uYWRkaXRpb25hbFRleHRFZGl0cyA9IHJlc29sdmVkLmFkZGl0aW9uYWxUZXh0RWRpdHMubWFwKHRleHRFZGl0VG9Nb25hY28pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKCdbamF2YS1sc3BdIGNvbXBsZXRpb24gcmVzb2x2ZSBmYWlsZWQ6JywgKGUgYXMgRXJyb3IpPy5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckhvdmVyUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVIb3ZlcjogYXN5bmMgKG1vZGVsLCBwb3NpdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBmaWxlVXJpID0gbW9kZWwudXJpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IEhvdmVyIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvaG92ZXInLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogZmlsZVVyaSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0Py5jb250ZW50cykgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50cyA9IEFycmF5LmlzQXJyYXkocmVzdWx0LmNvbnRlbnRzKSA/IHJlc3VsdC5jb250ZW50cyA6IFtyZXN1bHQuY29udGVudHNdO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjb250ZW50czogY29udGVudHMubWFwKGMgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHR5cGVvZiBjID09PSAnc3RyaW5nJyA/IGMgOiAoYyBhcyBNYXJrdXBDb250ZW50KS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgaXNUcnVzdGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgcmFuZ2U6IHJlc3VsdC5yYW5nZSA/IGxzcFJhbmdlVG9Nb25hY28ocmVzdWx0LnJhbmdlKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyU2lnbmF0dXJlSGVscFByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBzaWduYXR1cmVIZWxwVHJpZ2dlckNoYXJhY3RlcnM6IFsnKCcsICcsJ10sXG4gICAgICAgIHByb3ZpZGVTaWduYXR1cmVIZWxwOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVVcmkgPSBtb2RlbC51cmkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogU2lnbmF0dXJlSGVscCB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L3NpZ25hdHVyZUhlbHAnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogZmlsZVVyaSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlczogcmVzdWx0LnNpZ25hdHVyZXMubWFwKChzaWc6IFNpZ25hdHVyZUluZm9ybWF0aW9uKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICAgICAgICAgc2lnLmxhYmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRhdGlvbjogc2lnLmRvY3VtZW50YXRpb24gPyBtYXJrdXBUb1N0cmluZyhzaWcuZG9jdW1lbnRhdGlvbikgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiAgICAoc2lnLnBhcmFtZXRlcnMgPz8gW10pLm1hcCgocDogUGFyYW1ldGVySW5mb3JtYXRpb24pID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICAgICAgICAgcC5sYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudGF0aW9uOiBwLmRvY3VtZW50YXRpb24gPyBtYXJrdXBUb1N0cmluZyhwLmRvY3VtZW50YXRpb24pIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZVNpZ25hdHVyZTogcmVzdWx0LmFjdGl2ZVNpZ25hdHVyZSA/PyAwLFxuICAgICAgICAgICAgICAgICAgICBhY3RpdmVQYXJhbWV0ZXI6IHJlc3VsdC5hY3RpdmVQYXJhbWV0ZXIgPz8gMCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGRpc3Bvc2U6ICgpID0+IHt9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJEZWZpbml0aW9uUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVEZWZpbml0aW9uOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVVcmkgPSBtb2RlbC51cmkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogTG9jYXRpb24gfCBMb2NhdGlvbltdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvZGVmaW5pdGlvbicsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBmaWxlVXJpIH0sXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgbG9jYXRpb25zID0gKEFycmF5LmlzQXJyYXkocmVzdWx0KSA/IHJlc3VsdCA6IFtyZXN1bHRdKS5tYXAobG9jID0+ICh7XG4gICAgICAgICAgICAgICAgdXJpOiAgIG1vbmFjby5VcmkucGFyc2UobG9jLnVyaSksXG4gICAgICAgICAgICAgICAgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28obG9jLnJhbmdlKSxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIGF3YWl0IGVuc3VyZU1vZGVsc0ZvckxvY2F0aW9ucyhsb2NhdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGxvY2F0aW9ucztcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJSZWZlcmVuY2VQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZVJlZmVyZW5jZXM6IGFzeW5jIChtb2RlbCwgcG9zaXRpb24sIGNvbnRleHQpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBMb2NhdGlvbltdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvcmVmZXJlbmNlcycsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICAgICAgY29udGV4dDogICAgICB7IGluY2x1ZGVEZWNsYXJhdGlvbjogY29udGV4dC5pbmNsdWRlRGVjbGFyYXRpb24gfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgbG9jYXRpb25zID0gcmVzdWx0Lm1hcChsb2MgPT4gKHsgdXJpOiBtb25hY28uVXJpLnBhcnNlKGxvYy51cmkpLCByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhsb2MucmFuZ2UpIH0pKTtcbiAgICAgICAgICAgIC8vIFRoZSByZWZlcmVuY2VzIHBlZWsgY2FuIG9ubHkgc2hvdyBhIGNvZGUgcHJldmlldyBmb3IgZmlsZXMgaXQgaGFzIGEgbW9kZWwgZm9yOyBjcmVhdGVcbiAgICAgICAgICAgIC8vIGluLW1lbW9yeSBtb2RlbHMgZm9yIHRoZSByZWZlcmVuY2VkIChwb3NzaWJseSB1bm9wZW5lZCkgZmlsZXMgc28gcHJldmlld3MgcmVuZGVyLlxuICAgICAgICAgICAgYXdhaXQgZW5zdXJlTW9kZWxzRm9yTG9jYXRpb25zKGxvY2F0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gbG9jYXRpb25zO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlclJlbmFtZVByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlUmVuYW1lRWRpdHM6IGFzeW5jIChtb2RlbCwgcG9zaXRpb24sIG5ld05hbWUpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiB7IGVkaXRzOiBbXSB9O1xuICAgICAgICAgICAgY29uc3QgZWRpdDogV29ya3NwYWNlRWRpdCB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L3JlbmFtZScsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICAgICAgbmV3TmFtZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFlZGl0KSByZXR1cm4geyBlZGl0czogW10gfTtcbiAgICAgICAgICAgIC8vIEEgSkRULkxTIHJlbmFtZSBjYW4gc3BhbiBtYW55IGZpbGVzIGFuZCBldmVuIHJlbmFtZSB0aGUgdHlwZSdzIG93biAuamF2YSBmaWxlLiBNb25hY28nc1xuICAgICAgICAgICAgLy8gc2luZ2xlLWZpbGUgZWRpdG9yIHdvdWxkIGRyb3AgZXZlcnl0aGluZyBidXQgdGhlIGN1cnJlbnQgbW9kZWwsIHNvIGFwcGx5IHRoZSB3aG9sZSBlZGl0XG4gICAgICAgICAgICAvLyB0aHJvdWdoIHRoZSB3b3Jrc3BhY2Ugb3Vyc2VsdmVzIHdoZW4gdGhlIElERSBwZXJzaXN0ZW5jZSBob29rIGlzIGF2YWlsYWJsZS5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgKGdsb2JhbFRoaXMgYXMgYW55KS5qYXZhTHNwUGVyc2lzdFJlbmFtZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGFwcGx5UmVuYW1lQWNyb3NzV29ya3NwYWNlKG1vZGVsLCBlZGl0KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZWRpdHM6IFtdIH07XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbamF2YS1sc3BdIGNyb3NzLWZpbGUgcmVuYW1lIGZhaWxlZCwgYXBwbHlpbmcgdG8gdGhlIGN1cnJlbnQgZmlsZSBvbmx5OicsIGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gd29ya3NwYWNlRWRpdFRvTW9uYWNvKGVkaXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB3b3Jrc3BhY2VFZGl0VG9Nb25hY28oZWRpdCk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlc29sdmVSZW5hbWVMb2NhdGlvbjogYXN5bmMgKG1vZGVsLCBwb3NpdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogeyByYW5nZTogTHNwUmFuZ2U7IHBsYWNlaG9sZGVyPzogc3RyaW5nIH0gfCBMc3BSYW5nZSB8IG51bGwgPVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L3ByZXBhcmVSZW5hbWUnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gJ3JhbmdlJyBpbiByZXN1bHQgPyByZXN1bHQucmFuZ2UgOiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSAncGxhY2Vob2xkZXInIGluIHJlc3VsdCAmJiByZXN1bHQucGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICAgICAgPyByZXN1bHQucGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICAgICAgOiBtb2RlbC5nZXRXb3JkQXRQb3NpdGlvbihwb3NpdGlvbik/LndvcmQgPz8gJyc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28ocmFuZ2UpLCB0ZXh0OiBwbGFjZWhvbGRlciB9O1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgY29uc3Qgd29yZCA9IG1vZGVsLmdldFdvcmRBdFBvc2l0aW9uKHBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gd29yZCA/IHtcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2U6IHsgc3RhcnRMaW5lTnVtYmVyOiBwb3NpdGlvbi5saW5lTnVtYmVyLCBzdGFydENvbHVtbjogd29yZC5zdGFydENvbHVtbiwgZW5kTGluZU51bWJlcjogcG9zaXRpb24ubGluZU51bWJlciwgZW5kQ29sdW1uOiB3b3JkLmVuZENvbHVtbiB9LFxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiB3b3JkLndvcmQsXG4gICAgICAgICAgICAgICAgfSA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBSZWdpc3RlcmluZyB0aGlzIHByb3ZpZGVyIGFsc28gZW5hYmxlcyBlZGl0b3IuanMncyBleGlzdGluZyBmb3JtYXQtb24tc2F2ZSBwYXRoIGZvciBKYXZhOiB0aGVcbiAgICAvLyBzaGFyZWQgU2F2ZSBhY3Rpb24gcnVucyBlZGl0b3IuYWN0aW9uLmZvcm1hdERvY3VtZW50IHdoZW4gYXV0by1mb3JtYXR0aW5nIGlzIG9uICh0aGUgc2FtZVxuICAgIC8vIG1lY2hhbmlzbSBhbmQgZ2xvYmFsIHRvZ2dsZSB1c2VkIGZvciBUeXBlU2NyaXB0KS5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyRG9jdW1lbnRGb3JtYXR0aW5nRWRpdFByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlRG9jdW1lbnRGb3JtYXR0aW5nRWRpdHM6IGFzeW5jIChtb2RlbCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBlZGl0czogVGV4dEVkaXRbXSB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L2Zvcm1hdHRpbmcnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiAgICAgIHsgdGFiU2l6ZTogbW9kZWwuZ2V0T3B0aW9ucygpLnRhYlNpemUsIGluc2VydFNwYWNlczogbW9kZWwuZ2V0T3B0aW9ucygpLmluc2VydFNwYWNlcyB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gZWRpdHMgPyBlZGl0cy5tYXAodGV4dEVkaXRUb01vbmFjbykgOiBudWxsO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckNvZGVBY3Rpb25Qcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZUNvZGVBY3Rpb25zOiBhc3luYyAobW9kZWwsIHJhbmdlLCBjb250ZXh0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbXB0eSA9IHsgYWN0aW9uczogW10sIGRpc3Bvc2UoKSB7IC8qIG5vdGhpbmcgdG8gZGlzcG9zZSAqLyB9IH07XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gZW1wdHk7XG4gICAgICAgICAgICAvLyBTZW5kIHRoZSBvcmlnaW5hbCBMU1AgZGlhZ25vc3RpY3MgdGhhdCBvdmVybGFwIHRoZSByYW5nZSAodGhleSBjYXJyeSB0aGUgY29kZS9kYXRhIEpEVC5MU1xuICAgICAgICAgICAgLy8gbmVlZHMgdG8gY29tcHV0ZSBxdWljay1maXhlcyksIG5vdCBvbmVzIHJlY29uc3RydWN0ZWQgZnJvbSBNb25hY28gbWFya2Vycy5cbiAgICAgICAgICAgIGNvbnN0IGxzcFJhbmdlID0gbW9uYWNvUmFuZ2VUb0xzcChyYW5nZSk7XG4gICAgICAgICAgICBjb25zdCBkaWFnbm9zdGljcyA9IChfZGlhZ25vc3RpY3MuZ2V0KG1vZGVsLnVyaS50b1N0cmluZygpKSA/PyBbXSkuZmlsdGVyKGQgPT4gcmFuZ2VzT3ZlcmxhcChkLnJhbmdlLCBsc3BSYW5nZSkpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBBcnJheTxDb2RlQWN0aW9uIHwgQ29tbWFuZD4gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9jb2RlQWN0aW9uJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICAgICAgcmFuZ2U6ICAgICAgICBsc3BSYW5nZSxcbiAgICAgICAgICAgICAgICBjb250ZXh0OiAgICAgIHsgZGlhZ25vc3RpY3MsIG9ubHk6IGNvbnRleHQub25seSA/IFtjb250ZXh0Lm9ubHldIDogdW5kZWZpbmVkIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0Py5sZW5ndGgpIHJldHVybiBlbXB0eTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgYWN0aW9uczogcmVzdWx0Lm1hcChsc3BDb2RlQWN0aW9uVG9Nb25hY28pLFxuICAgICAgICAgICAgICAgIGRpc3Bvc2UoKSB7IC8qIG5vdGhpbmcgdG8gZGlzcG9zZSAqLyB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICB9LCB7XG4gICAgICAgIHByb3ZpZGVkQ29kZUFjdGlvbktpbmRzOiBbJ3F1aWNrZml4JywgJ3JlZmFjdG9yJywgJ3JlZmFjdG9yLmV4dHJhY3QnLCAncmVmYWN0b3IuaW5saW5lJyxcbiAgICAgICAgICAgICdyZWZhY3Rvci5yZXdyaXRlJywgJ3NvdXJjZScsICdzb3VyY2Uub3JnYW5pemVJbXBvcnRzJ10sXG4gICAgfSk7XG5cbiAgICAvLyAtLS0gTmF2aWdhdGlvbiAmIHN0cnVjdHVyZSAoUGFjayAxKSAtLS1cblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJJbXBsZW1lbnRhdGlvblByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlSW1wbGVtZW50YXRpb246IChtb2RlbCwgcG9zaXRpb24pID0+IHJlcXVlc3RMb2NhdGlvbnMoJ3RleHREb2N1bWVudC9pbXBsZW1lbnRhdGlvbicsIG1vZGVsLCBwb3NpdGlvbiksXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyVHlwZURlZmluaXRpb25Qcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZVR5cGVEZWZpbml0aW9uOiAobW9kZWwsIHBvc2l0aW9uKSA9PiByZXF1ZXN0TG9jYXRpb25zKCd0ZXh0RG9jdW1lbnQvdHlwZURlZmluaXRpb24nLCBtb2RlbCwgcG9zaXRpb24pLFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckRvY3VtZW50SGlnaGxpZ2h0UHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVEb2N1bWVudEhpZ2hsaWdodHM6IGFzeW5jIChtb2RlbCwgcG9zaXRpb24pID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBhbnlbXSB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L2RvY3VtZW50SGlnaGxpZ2h0Jywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5tYXAoaCA9PiAoeyByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhoLnJhbmdlKSwga2luZDogaC5raW5kID8gaC5raW5kIC0gMSA6IHVuZGVmaW5lZCB9KSk7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyRG9jdW1lbnRTeW1ib2xQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZURvY3VtZW50U3ltYm9sczogYXN5bmMgKG1vZGVsKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55W10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9kb2N1bWVudFN5bWJvbCcsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0ID8gbWFwRG9jdW1lbnRTeW1ib2xzKHJlc3VsdCkgOiBudWxsO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckZvbGRpbmdSYW5nZVByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlRm9sZGluZ1JhbmdlczogYXN5bmMgKG1vZGVsKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55W10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9mb2xkaW5nUmFuZ2UnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5tYXAociA9PiAoeyBzdGFydDogci5zdGFydExpbmUgKyAxLCBlbmQ6IHIuZW5kTGluZSArIDEsIGtpbmQ6IGZvbGRpbmdLaW5kKHIua2luZCkgfSkpO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlclNlbGVjdGlvblJhbmdlUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVTZWxlY3Rpb25SYW5nZXM6IGFzeW5jIChtb2RlbCwgcG9zaXRpb25zKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55W10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9zZWxlY3Rpb25SYW5nZScsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uczogICAgcG9zaXRpb25zLm1hcChwID0+ICh7IGxpbmU6IHAubGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogcC5jb2x1bW4gLSAxIH0pKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5tYXAoZmxhdHRlblNlbGVjdGlvblJhbmdlKTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJEb2N1bWVudFJhbmdlRm9ybWF0dGluZ0VkaXRQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZURvY3VtZW50UmFuZ2VGb3JtYXR0aW5nRWRpdHM6IGFzeW5jIChtb2RlbCwgcmFuZ2UpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgZWRpdHM6IFRleHRFZGl0W10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9yYW5nZUZvcm1hdHRpbmcnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgICAgICByYW5nZTogICAgICAgIG1vbmFjb1JhbmdlVG9Mc3AocmFuZ2UpLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6ICAgICAgeyB0YWJTaXplOiBtb2RlbC5nZXRPcHRpb25zKCkudGFiU2l6ZSwgaW5zZXJ0U3BhY2VzOiBtb2RlbC5nZXRPcHRpb25zKCkuaW5zZXJ0U3BhY2VzIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBlZGl0cyA/IGVkaXRzLm1hcCh0ZXh0RWRpdFRvTW9uYWNvKSA6IG51bGw7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyAtLS0gSW5sYXkgaGludHMgKyBzZW1hbnRpYyBoaWdobGlnaHRpbmcgKFBhY2sgMikgLS0tXG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVySW5sYXlIaW50c1Byb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlSW5sYXlIaW50czogYXN5bmMgKG1vZGVsLCByYW5nZSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IGFueVtdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvaW5sYXlIaW50Jywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICAgICAgcmFuZ2U6ICAgICAgICBtb25hY29SYW5nZVRvTHNwKHJhbmdlKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBoaW50czogcmVzdWx0Lm1hcChoID0+ICh7XG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lTnVtYmVyOiBoLnBvc2l0aW9uLmxpbmUgKyAxLCBjb2x1bW46IGgucG9zaXRpb24uY2hhcmFjdGVyICsgMSB9LFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogICAgICAgIHR5cGVvZiBoLmxhYmVsID09PSAnc3RyaW5nJyA/IGgubGFiZWwgOiAoaC5sYWJlbCA/PyBbXSkubWFwKChwOiBhbnkpID0+ICh7IGxhYmVsOiBwLnZhbHVlIH0pKSxcbiAgICAgICAgICAgICAgICAgICAga2luZDogICAgICAgICBoLmtpbmQsXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmdMZWZ0OiAgaC5wYWRkaW5nTGVmdCxcbiAgICAgICAgICAgICAgICAgICAgcGFkZGluZ1JpZ2h0OiBoLnBhZGRpbmdSaWdodCxcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcDogICAgICBoLnRvb2x0aXAgPyBtYXJrdXBUb1N0cmluZyhoLnRvb2x0aXApIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgICBkaXNwb3NlKCkgeyAvKiBub3RoaW5nIHRvIGRpc3Bvc2UgKi8gfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyRG9jdW1lbnRTZW1hbnRpY1Rva2Vuc1Byb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBnZXRMZWdlbmQ6ICgpID0+IF9zZW1hbnRpY1Rva2Vuc0xlZ2VuZCA/PyB7IHRva2VuVHlwZXM6IFtdLCB0b2tlbk1vZGlmaWVyczogW10gfSxcbiAgICAgICAgcHJvdmlkZURvY3VtZW50U2VtYW50aWNUb2tlbnM6IGFzeW5jIChtb2RlbCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSB8fCAhX3NlbWFudGljVG9rZW5zTGVnZW5kKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogeyBkYXRhOiBudW1iZXJbXTsgcmVzdWx0SWQ/OiBzdHJpbmcgfSB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L3NlbWFudGljVG9rZW5zL2Z1bGwnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQ/LmRhdGEpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogbmV3IFVpbnQzMkFycmF5KHJlc3VsdC5kYXRhKSwgcmVzdWx0SWQ6IHJlc3VsdC5yZXN1bHRJZCB9O1xuICAgICAgICB9LFxuICAgICAgICByZWxlYXNlRG9jdW1lbnRTZW1hbnRpY1Rva2VuczogKCkgPT4geyAvKiBub3RoaW5nIHRvIHJlbGVhc2UgKi8gfSxcbiAgICB9KTtcblxuICAgIC8vIC0tLSBDb2RlTGVucyAoUGFjayAzKSAtLS1cblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJDb2RlTGVuc1Byb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlQ29kZUxlbnNlczogYXN5bmMgKG1vZGVsKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4geyBsZW5zZXM6IFtdLCBkaXNwb3NlKCkgeyAvKiAqLyB9IH07XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IGFueVtdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvY29kZUxlbnMnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgbGVuc2VzID0gKHJlc3VsdCA/PyBbXSkubWFwKChsZW5zLCBpKSA9PiAoe1xuICAgICAgICAgICAgICAgIHJhbmdlOiAgICBsc3BSYW5nZVRvTW9uYWNvKGxlbnMucmFuZ2UpLFxuICAgICAgICAgICAgICAgIGlkOiAgICAgICBTdHJpbmcoaSksXG4gICAgICAgICAgICAgICAgY29tbWFuZDogIGxlbnMuY29tbWFuZCA/IG1hcExlbnNDb21tYW5kKGxlbnMuY29tbWFuZCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgX2xzcDogICAgIGxlbnMsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICByZXR1cm4geyBsZW5zZXMsIGRpc3Bvc2UoKSB7IC8qICovIH0gfTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVzb2x2ZUNvZGVMZW5zOiBhc3luYyAoX21vZGVsLCBjb2RlTGVucykgPT4ge1xuICAgICAgICAgICAgY29uc3QgbHNwID0gKGNvZGVMZW5zIGFzIGFueSkuX2xzcDtcbiAgICAgICAgICAgIGlmIChfY29ubiAmJiBsc3AgJiYgIWxzcC5jb21tYW5kKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWQ6IGFueSA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCdjb2RlTGVucy9yZXNvbHZlJywgbHNwKTtcbiAgICAgICAgICAgICAgICAgICAgY29kZUxlbnMuY29tbWFuZCA9IHJlc29sdmVkPy5jb21tYW5kID8gbWFwTGVuc0NvbW1hbmQocmVzb2x2ZWQuY29tbWFuZCkgOiB7IGlkOiBOT09QX0NPTU1BTkQsIHRpdGxlOiAnJyB9O1xuICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICBjb2RlTGVucy5jb21tYW5kID0geyBpZDogTk9PUF9DT01NQU5ELCB0aXRsZTogJycgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29kZUxlbnM7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyAtLS0gSmF2YSBrZXl3b3JkIGNvbXBsZXRpb24gKFBhY2sgMWIpOiBhbHdheXMtYXZhaWxhYmxlLCByYW5rZWQgYmVsb3cgU0RLL0xTUCByZXN1bHRzIC0tLVxuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckNvbXBsZXRpb25JdGVtUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVDb21wbGV0aW9uSXRlbXM6IChtb2RlbCwgcG9zaXRpb24pID0+IHtcbiAgICAgICAgICAgIGlmICghaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCB3b3JkID0gbW9kZWwuZ2V0V29yZFVudGlsUG9zaXRpb24ocG9zaXRpb24pO1xuICAgICAgICAgICAgY29uc3QgcmFuZ2U6IG1vbmFjby5JUmFuZ2UgPSB7XG4gICAgICAgICAgICAgICAgc3RhcnRMaW5lTnVtYmVyOiBwb3NpdGlvbi5saW5lTnVtYmVyLCBzdGFydENvbHVtbjogd29yZC5zdGFydENvbHVtbixcbiAgICAgICAgICAgICAgICBlbmRMaW5lTnVtYmVyOiAgIHBvc2l0aW9uLmxpbmVOdW1iZXIsIGVuZENvbHVtbjogICB3b3JkLmVuZENvbHVtbixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb25zOiBKQVZBX0tFWVdPUkRTLm1hcChrZXl3b3JkID0+ICh7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAgICAgIGtleXdvcmQsXG4gICAgICAgICAgICAgICAgICAgIGtpbmQ6ICAgICAgIG1vbmFjby5sYW5ndWFnZXMuQ29tcGxldGlvbkl0ZW1LaW5kLktleXdvcmQsXG4gICAgICAgICAgICAgICAgICAgIGluc2VydFRleHQ6IGtleXdvcmQsXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlLFxuICAgICAgICAgICAgICAgICAgICBzb3J0VGV4dDogICBgOV8ke2tleXdvcmR9YCxcbiAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgIH0pO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBIZWxwZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIGxzcFNldmVyaXR5KHNldmVyaXR5OiBEaWFnbm9zdGljU2V2ZXJpdHkgfCB1bmRlZmluZWQpOiBtb25hY28uTWFya2VyU2V2ZXJpdHkge1xuICAgIHN3aXRjaCAoc2V2ZXJpdHkpIHtcbiAgICAgICAgY2FzZSBEaWFnbm9zdGljU2V2ZXJpdHkuRXJyb3I6ICAgICAgIHJldHVybiBtb25hY28uTWFya2VyU2V2ZXJpdHkuRXJyb3I7XG4gICAgICAgIGNhc2UgRGlhZ25vc3RpY1NldmVyaXR5Lldhcm5pbmc6ICAgICByZXR1cm4gbW9uYWNvLk1hcmtlclNldmVyaXR5Lldhcm5pbmc7XG4gICAgICAgIGNhc2UgRGlhZ25vc3RpY1NldmVyaXR5LkluZm9ybWF0aW9uOiByZXR1cm4gbW9uYWNvLk1hcmtlclNldmVyaXR5LkluZm87XG4gICAgICAgIGNhc2UgRGlhZ25vc3RpY1NldmVyaXR5LkhpbnQ6ICAgICAgICByZXR1cm4gbW9uYWNvLk1hcmtlclNldmVyaXR5LkhpbnQ7XG4gICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9uYWNvLk1hcmtlclNldmVyaXR5LkVycm9yO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gbHNwUmFuZ2VUb01vbmFjbyhyOiB7IHN0YXJ0OiB7IGxpbmU6IG51bWJlcjsgY2hhcmFjdGVyOiBudW1iZXIgfTsgZW5kOiB7IGxpbmU6IG51bWJlcjsgY2hhcmFjdGVyOiBudW1iZXIgfSB9KTogbW9uYWNvLklSYW5nZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnRMaW5lTnVtYmVyOiByLnN0YXJ0LmxpbmUgKyAxLFxuICAgICAgICBzdGFydENvbHVtbjogICAgIHIuc3RhcnQuY2hhcmFjdGVyICsgMSxcbiAgICAgICAgZW5kTGluZU51bWJlcjogICByLmVuZC5saW5lICsgMSxcbiAgICAgICAgZW5kQ29sdW1uOiAgICAgICByLmVuZC5jaGFyYWN0ZXIgKyAxLFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIG1hcmt1cFRvU3RyaW5nKGM6IHN0cmluZyB8IE1hcmt1cENvbnRlbnQpOiBzdHJpbmcge1xuICAgIHJldHVybiB0eXBlb2YgYyA9PT0gJ3N0cmluZycgPyBjIDogYy52YWx1ZTtcbn1cblxuZnVuY3Rpb24gbHNwQ29tcGxldGlvbktpbmQoa2luZDogQ29tcGxldGlvbkl0ZW1LaW5kIHwgdW5kZWZpbmVkKTogbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbUtpbmQge1xuICAgIGNvbnN0IEsgPSBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtS2luZDtcbiAgICBzd2l0Y2ggKGtpbmQpIHtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuVGV4dDogICAgICAgICAgcmV0dXJuIEsuVGV4dDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuTWV0aG9kOiAgICAgICAgcmV0dXJuIEsuTWV0aG9kO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5GdW5jdGlvbjogICAgICByZXR1cm4gSy5GdW5jdGlvbjtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuQ29uc3RydWN0b3I6ICAgcmV0dXJuIEsuQ29uc3RydWN0b3I7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLkZpZWxkOiAgICAgICAgIHJldHVybiBLLkZpZWxkO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5WYXJpYWJsZTogICAgICByZXR1cm4gSy5WYXJpYWJsZTtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuQ2xhc3M6ICAgICAgICAgcmV0dXJuIEsuQ2xhc3M7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLkludGVyZmFjZTogICAgIHJldHVybiBLLkludGVyZmFjZTtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuTW9kdWxlOiAgICAgICAgcmV0dXJuIEsuTW9kdWxlO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5Qcm9wZXJ0eTogICAgICByZXR1cm4gSy5Qcm9wZXJ0eTtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuS2V5d29yZDogICAgICAgcmV0dXJuIEsuS2V5d29yZDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuU25pcHBldDogICAgICAgcmV0dXJuIEsuU25pcHBldDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuQ29uc3RhbnQ6ICAgICAgcmV0dXJuIEsuQ29uc3RhbnQ7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLlN0cnVjdDogICAgICAgIHJldHVybiBLLlN0cnVjdDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuVHlwZVBhcmFtZXRlcjogcmV0dXJuIEsuVHlwZVBhcmFtZXRlcjtcbiAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEsuVGV4dDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGxzcENvbXBsZXRpb25Ub01vbmFjbyhcbiAgICBpdGVtOiBDb21wbGV0aW9uSXRlbSxcbiAgICBtb2RlbDogbW9uYWNvLmVkaXRvci5JVGV4dE1vZGVsLFxuICAgIHBvc2l0aW9uOiBtb25hY28uUG9zaXRpb24sXG4pOiBNb25hY29Db21wbGV0aW9uSXRlbSB7XG4gICAgY29uc3Qgd29yZCA9IG1vZGVsLmdldFdvcmRVbnRpbFBvc2l0aW9uKHBvc2l0aW9uKTtcbiAgICBsZXQgcmFuZ2U6IG1vbmFjby5JUmFuZ2UgPSB7XG4gICAgICAgIHN0YXJ0TGluZU51bWJlcjogcG9zaXRpb24ubGluZU51bWJlcixcbiAgICAgICAgc3RhcnRDb2x1bW46ICAgICB3b3JkLnN0YXJ0Q29sdW1uLFxuICAgICAgICBlbmRMaW5lTnVtYmVyOiAgIHBvc2l0aW9uLmxpbmVOdW1iZXIsXG4gICAgICAgIGVuZENvbHVtbjogICAgICAgd29yZC5lbmRDb2x1bW4sXG4gICAgfTtcbiAgICBsZXQgaW5zZXJ0VGV4dCA9IGl0ZW0uaW5zZXJ0VGV4dCA/PyBpdGVtLmxhYmVsO1xuICAgIGNvbnN0IHRleHRFZGl0ID0gaXRlbS50ZXh0RWRpdCBhcyB7IHJhbmdlPzogTHNwUmFuZ2U7IHJlcGxhY2U/OiBMc3BSYW5nZTsgaW5zZXJ0PzogTHNwUmFuZ2U7IG5ld1RleHQ/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcbiAgICBpZiAodGV4dEVkaXQpIHtcbiAgICAgICAgY29uc3QgciA9IHRleHRFZGl0LnJhbmdlID8/IHRleHRFZGl0LnJlcGxhY2UgPz8gdGV4dEVkaXQuaW5zZXJ0O1xuICAgICAgICBpZiAocikgcmFuZ2UgPSBsc3BSYW5nZVRvTW9uYWNvKHIpO1xuICAgICAgICBpZiAodHlwZW9mIHRleHRFZGl0Lm5ld1RleHQgPT09ICdzdHJpbmcnKSBpbnNlcnRUZXh0ID0gdGV4dEVkaXQubmV3VGV4dDtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0OiBNb25hY29Db21wbGV0aW9uSXRlbSA9IHtcbiAgICAgICAgbGFiZWw6ICAgICAgICAgICBpdGVtLmxhYmVsLFxuICAgICAgICBraW5kOiAgICAgICAgICAgIGxzcENvbXBsZXRpb25LaW5kKGl0ZW0ua2luZCksXG4gICAgICAgIGRldGFpbDogICAgICAgICAgaXRlbS5kZXRhaWwsXG4gICAgICAgIGRvY3VtZW50YXRpb246ICAgaXRlbS5kb2N1bWVudGF0aW9uID8geyB2YWx1ZTogbWFya3VwVG9TdHJpbmcoaXRlbS5kb2N1bWVudGF0aW9uKSwgaXNUcnVzdGVkOiBmYWxzZSB9IDogdW5kZWZpbmVkLFxuICAgICAgICBpbnNlcnRUZXh0LFxuICAgICAgICBpbnNlcnRUZXh0UnVsZXM6IGl0ZW0uaW5zZXJ0VGV4dEZvcm1hdCA9PT0gSW5zZXJ0VGV4dEZvcm1hdC5TbmlwcGV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbUluc2VydFRleHRSdWxlLkluc2VydEFzU25pcHBldFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgcmFuZ2UsXG4gICAgICAgIHNvcnRUZXh0OiAgICAgICAgICAgIHNka1ByaW9yaXRpc2VkU29ydFRleHQoaXRlbSksXG4gICAgICAgIGZpbHRlclRleHQ6ICAgICAgICAgIGl0ZW0uZmlsdGVyVGV4dCxcbiAgICAgICAgcHJlc2VsZWN0OiAgICAgICAgICAgaXRlbS5wcmVzZWxlY3QsXG4gICAgICAgIGNvbW1pdENoYXJhY3RlcnM6ICAgIGl0ZW0uY29tbWl0Q2hhcmFjdGVycyxcbiAgICAgICAgYWRkaXRpb25hbFRleHRFZGl0czogaXRlbS5hZGRpdGlvbmFsVGV4dEVkaXRzPy5tYXAodGV4dEVkaXRUb01vbmFjbyksXG4gICAgfTtcbiAgICByZXN1bHQuX2xzcCA9IGl0ZW07XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBSYW5rcyBEaXJpZ2libGUgU0RLIHN1Z2dlc3Rpb25zICh7QGNvZGUgb3JnLmVjbGlwc2UuZGlyaWdpYmxlLnNkay4qfSkgYWJvdmUgZXZlcnl0aGluZyBlbHNlIGJ5XG4gKiBwcmVmaXhpbmcgdGhlIHNlcnZlciBzb3J0VGV4dCB3aXRoIGEgcHJpb3JpdHkgYnVja2V0LCBwcmVzZXJ2aW5nIHRoZSBzZXJ2ZXIgb3JkZXIgd2l0aGluIGVhY2ggYnVja2V0LlxuICovXG5mdW5jdGlvbiBzZGtQcmlvcml0aXNlZFNvcnRUZXh0KGl0ZW06IENvbXBsZXRpb25JdGVtKTogc3RyaW5nIHtcbiAgICBjb25zdCBiYXNlID0gaXRlbS5zb3J0VGV4dCA/PyAodHlwZW9mIGl0ZW0ubGFiZWwgPT09ICdzdHJpbmcnID8gaXRlbS5sYWJlbCA6ICcnKTtcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IChpdGVtLmxhYmVsRGV0YWlscyAmJiB0eXBlb2YgaXRlbS5sYWJlbERldGFpbHMuZGVzY3JpcHRpb24gPT09ICdzdHJpbmcnKVxuICAgICAgICA/IGl0ZW0ubGFiZWxEZXRhaWxzLmRlc2NyaXB0aW9uIDogJyc7XG4gICAgY29uc3QgaGF5c3RhY2sgPSBgJHtpdGVtLmRldGFpbCA/PyAnJ30gJHtkZXNjcmlwdGlvbn1gO1xuICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcygnb3JnLmVjbGlwc2UuZGlyaWdpYmxlLnNkaycpID8gYDBfJHtiYXNlfWAgOiBgMV8ke2Jhc2V9YDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ29kZSBhY3Rpb25zLCBjb21tYW5kcywgcmVmYWN0b3IvZ2VuZXJhdGUsIHdvcmtzcGFjZSBlZGl0c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogTW9uYWNvIGNvbW1hbmQgaWQgdXNlZCB0byBhcHBseSBhIGRlZmVycmVkIExTUCBjb2RlIGFjdGlvbiB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgaXQuICovXG5jb25zdCBBUFBMWV9BQ1RJT05fQ09NTUFORCA9ICdkaXJpZ2libGUuamF2YS5hcHBseUNvZGVBY3Rpb24nO1xuXG4vKiogVmlydHVhbCBVUkkgcHJlZml4IG9mIGVkaXRvciBtb2RlbHM7IHN0cmlwcGluZyBpdCB5aWVsZHMgdGhlIElERSB3b3Jrc3BhY2UgcGF0aCAoL3dzL3Byb2ovLi4uKS4gKi9cbmNvbnN0IFZJUlRVQUxfRklMRV9QUkVGSVggPSAnZmlsZTovLy93b3Jrc3BhY2UnO1xuXG4vKiogTW9uYWNvIGNvbW1hbmQgaWQgdXNlZCBmb3IgZGlzcGxheS1vbmx5IENvZGVMZW5zZXMgKGUuZy4gYSByZWZlcmVuY2UgY291bnQgd2l0aCBubyByZXNvbHZlZCBhY3Rpb24pLiAqL1xuY29uc3QgTk9PUF9DT01NQU5EID0gJ2RpcmlnaWJsZS5qYXZhLm5vb3BMZW5zJztcblxuLyoqIEphdmEgU0Uga2V5d29yZHMvbGl0ZXJhbHMgb2ZmZXJlZCBhcyBsb3ctcHJpb3JpdHkgY29tcGxldGlvbiBzbyB0aGV5IGFsd2F5cyBhcHBlYXIgd2hpbGUgdHlwaW5nLiAqL1xuY29uc3QgSkFWQV9LRVlXT1JEUyA9IFsnYWJzdHJhY3QnLCAnYXNzZXJ0JywgJ2Jvb2xlYW4nLCAnYnJlYWsnLCAnYnl0ZScsICdjYXNlJywgJ2NhdGNoJywgJ2NoYXInLCAnY2xhc3MnLFxuICAgICdjb25zdCcsICdjb250aW51ZScsICdkZWZhdWx0JywgJ2RvJywgJ2RvdWJsZScsICdlbHNlJywgJ2VudW0nLCAnZXh0ZW5kcycsICdmaW5hbCcsICdmaW5hbGx5JywgJ2Zsb2F0JyxcbiAgICAnZm9yJywgJ2dvdG8nLCAnaWYnLCAnaW1wbGVtZW50cycsICdpbXBvcnQnLCAnaW5zdGFuY2VvZicsICdpbnQnLCAnaW50ZXJmYWNlJywgJ2xvbmcnLCAnbmF0aXZlJywgJ25ldycsXG4gICAgJ3BhY2thZ2UnLCAncHJpdmF0ZScsICdwcm90ZWN0ZWQnLCAncHVibGljJywgJ3JldHVybicsICdzaG9ydCcsICdzdGF0aWMnLCAnc3RyaWN0ZnAnLCAnc3VwZXInLCAnc3dpdGNoJyxcbiAgICAnc3luY2hyb25pemVkJywgJ3RoaXMnLCAndGhyb3cnLCAndGhyb3dzJywgJ3RyYW5zaWVudCcsICd0cnknLCAndm9pZCcsICd2b2xhdGlsZScsICd3aGlsZScsICd2YXInLFxuICAgICd5aWVsZCcsICdyZWNvcmQnLCAnc2VhbGVkJywgJ3Blcm1pdHMnLCAndHJ1ZScsICdmYWxzZScsICdudWxsJ107XG5cbi8qKiBTaGFyZWQgZGVmaW5pdGlvbi1zdHlsZSBsb2NhdGlvbiByZXF1ZXN0IHVzZWQgYnkgZ28tdG8tZGVmaW5pdGlvbi9pbXBsZW1lbnRhdGlvbi90eXBlLWRlZmluaXRpb24uICovXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0TG9jYXRpb25zKG1ldGhvZDogc3RyaW5nLCBtb2RlbDogbW9uYWNvLmVkaXRvci5JVGV4dE1vZGVsLCBwb3NpdGlvbjogbW9uYWNvLlBvc2l0aW9uKSB7XG4gICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgcmVzdWx0OiBMb2NhdGlvbiB8IExvY2F0aW9uW10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QobWV0aG9kLCB7XG4gICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgfSk7XG4gICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGxvY2F0aW9ucyA9IChBcnJheS5pc0FycmF5KHJlc3VsdCkgPyByZXN1bHQgOiBbcmVzdWx0XSkubWFwKGxvYyA9PiAoeyB1cmk6IG1vbmFjby5VcmkucGFyc2UobG9jLnVyaSksIHJhbmdlOiBsc3BSYW5nZVRvTW9uYWNvKGxvYy5yYW5nZSkgfSkpO1xuICAgIGF3YWl0IGVuc3VyZU1vZGVsc0ZvckxvY2F0aW9ucyhsb2NhdGlvbnMpO1xuICAgIHJldHVybiBsb2NhdGlvbnM7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBpbi1tZW1vcnkgTW9uYWNvIG1vZGVscyBmb3IgdGhlIHdvcmtzcGFjZSBmaWxlcyByZWZlcmVuY2VkIGJ5IHRoZSBnaXZlbiBsb2NhdGlvbnMgKGZldGNoZWRcbiAqIG92ZXIgUkVTVCkgc28gdGhlIHJlZmVyZW5jZXMgLyBwZWVrIHdpZGdldHMgY2FuIHJlbmRlciBhIGNvZGUgcHJldmlldyBcdTIwMTQgTW9uYWNvIGNhbiBvbmx5IHByZXZpZXcgZmlsZXNcbiAqIGl0IGhhcyBhIG1vZGVsIGZvciwgYW5kIHRoaXMgc2luZ2xlLWZpbGUgZWRpdG9yIG90aGVyd2lzZSBoYXMgbm9uZSBmb3Igb3RoZXIgZmlsZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGVuc3VyZU1vZGVsc0ZvckxvY2F0aW9ucyhsb2NhdGlvbnM6IEFycmF5PHsgdXJpOiBtb25hY28uVXJpIH0+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKGxvY2F0aW9ucy5tYXAoYXN5bmMgKHsgdXJpIH0pID0+IHtcbiAgICAgICAgY29uc3QgdXJpU3RyID0gdXJpLnRvU3RyaW5nKCk7XG4gICAgICAgIGlmIChzZWVuLmhhcyh1cmlTdHIpIHx8ICF1cmlTdHIuc3RhcnRzV2l0aChWSVJUVUFMX0ZJTEVfUFJFRklYKSB8fCBtb25hY28uZWRpdG9yLmdldE1vZGVsKHVyaSkpIHJldHVybjtcbiAgICAgICAgc2Vlbi5hZGQodXJpU3RyKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCBmZXRjaFdvcmtzcGFjZUZpbGVUZXh0KHVyaVRvV29ya3NwYWNlUGF0aCh1cmlTdHIpID8/IHVyaVN0cik7XG4gICAgICAgICAgICBpZiAoIW1vbmFjby5lZGl0b3IuZ2V0TW9kZWwodXJpKSkgbW9uYWNvLmVkaXRvci5jcmVhdGVNb2RlbCh0ZXh0LCAnamF2YScsIHVyaSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gcHJldmlldyBqdXN0IHdvbid0IHJlbmRlciBmb3IgdGhpcyBvbmVcbiAgICAgICAgfVxuICAgIH0pKTtcbn1cblxuLyoqIFJlY3Vyc2l2ZWx5IG1hcHMgTFNQIGhpZXJhcmNoaWNhbCBEb2N1bWVudFN5bWJvbHMgdG8gTW9uYWNvJ3Mgc2hhcGUgKGtpbmRzIGFyZSAxLWJhc2VkIHZzIDAtYmFzZWQpLiAqL1xuZnVuY3Rpb24gbWFwRG9jdW1lbnRTeW1ib2xzKHN5bWJvbHM6IGFueVtdKTogbW9uYWNvLmxhbmd1YWdlcy5Eb2N1bWVudFN5bWJvbFtdIHtcbiAgICByZXR1cm4gKHN5bWJvbHMgPz8gW10pLm1hcChzID0+ICh7XG4gICAgICAgIG5hbWU6ICAgICAgICAgICBzLm5hbWUsXG4gICAgICAgIGRldGFpbDogICAgICAgICBzLmRldGFpbCA/PyAnJyxcbiAgICAgICAga2luZDogICAgICAgICAgIChzLmtpbmQgPz8gMSkgLSAxLFxuICAgICAgICB0YWdzOiAgICAgICAgICAgcy50YWdzID8/IFtdLFxuICAgICAgICByYW5nZTogICAgICAgICAgbHNwUmFuZ2VUb01vbmFjbyhzLnJhbmdlKSxcbiAgICAgICAgc2VsZWN0aW9uUmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28ocy5zZWxlY3Rpb25SYW5nZSA/PyBzLnJhbmdlKSxcbiAgICAgICAgY2hpbGRyZW46ICAgICAgIHMuY2hpbGRyZW4gPyBtYXBEb2N1bWVudFN5bWJvbHMocy5jaGlsZHJlbikgOiBbXSxcbiAgICB9KSk7XG59XG5cbmZ1bmN0aW9uIGZvbGRpbmdLaW5kKGtpbmQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IG1vbmFjby5sYW5ndWFnZXMuRm9sZGluZ1JhbmdlS2luZCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgRksgPSBtb25hY28ubGFuZ3VhZ2VzLkZvbGRpbmdSYW5nZUtpbmQ7XG4gICAgc3dpdGNoIChraW5kKSB7XG4gICAgICAgIGNhc2UgJ2NvbW1lbnQnOiByZXR1cm4gRksuQ29tbWVudDtcbiAgICAgICAgY2FzZSAnaW1wb3J0cyc6IHJldHVybiBGSy5JbXBvcnRzO1xuICAgICAgICBjYXNlICdyZWdpb24nOiAgcmV0dXJuIEZLLlJlZ2lvbjtcbiAgICAgICAgZGVmYXVsdDogICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxufVxuXG4vKiogRmxhdHRlbnMgYW4gTFNQIFNlbGVjdGlvblJhbmdlIHBhcmVudC1jaGFpbiBpbnRvIE1vbmFjbydzIGlubmVybW9zdC10by1vdXRlcm1vc3QgYXJyYXkuICovXG5mdW5jdGlvbiBmbGF0dGVuU2VsZWN0aW9uUmFuZ2Uoc2VsZWN0aW9uUmFuZ2U6IGFueSk6IG1vbmFjby5sYW5ndWFnZXMuU2VsZWN0aW9uUmFuZ2VbXSB7XG4gICAgY29uc3QgcmFuZ2VzOiBtb25hY28ubGFuZ3VhZ2VzLlNlbGVjdGlvblJhbmdlW10gPSBbXTtcbiAgICBsZXQgY3VycmVudCA9IHNlbGVjdGlvblJhbmdlO1xuICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICAgIHJhbmdlcy5wdXNoKHsgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28oY3VycmVudC5yYW5nZSkgfSk7XG4gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudDtcbiAgICB9XG4gICAgcmV0dXJuIHJhbmdlcztcbn1cblxuLyoqIE1hcHMgYSBKRFQuTFMgQ29kZUxlbnMgY29tbWFuZCB0byBhIE1vbmFjbyBjb21tYW5kLCB3aXJpbmcgdGhlIHJlZmVyZW5jZXMvaW1wbGVtZW50YXRpb25zIHBlZWsuICovXG5mdW5jdGlvbiBtYXBMZW5zQ29tbWFuZChjbWQ6IGFueSk6IG1vbmFjby5sYW5ndWFnZXMuQ29tbWFuZCB7XG4gICAgY29uc3QgYXJncyA9IGNtZC5hcmd1bWVudHMgPz8gW107XG4gICAgaWYgKChjbWQuY29tbWFuZCA9PT0gJ2phdmEuc2hvdy5yZWZlcmVuY2VzJyB8fCBjbWQuY29tbWFuZCA9PT0gJ2phdmEuc2hvdy5pbXBsZW1lbnRhdGlvbnMnKSAmJiBhcmdzLmxlbmd0aCA+PSAzKSB7XG4gICAgICAgIGNvbnN0IGxvY2F0aW9ucyA9IChhcmdzWzJdID8/IFtdKS5tYXAoKGw6IGFueSkgPT4gKHsgdXJpOiBtb25hY28uVXJpLnBhcnNlKGwudXJpKSwgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28obC5yYW5nZSkgfSkpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6ICAgICAgICAnZWRpdG9yLmFjdGlvbi5zaG93UmVmZXJlbmNlcycsXG4gICAgICAgICAgICB0aXRsZTogICAgIGNtZC50aXRsZSxcbiAgICAgICAgICAgIGFyZ3VtZW50czogW21vbmFjby5VcmkucGFyc2UoYXJnc1swXSksIHsgbGluZU51bWJlcjogYXJnc1sxXS5saW5lICsgMSwgY29sdW1uOiBhcmdzWzFdLmNoYXJhY3RlciArIDEgfSwgbG9jYXRpb25zXSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgaWQ6IE5PT1BfQ09NTUFORCwgdGl0bGU6IGNtZC50aXRsZSB9O1xufVxuXG50eXBlIExzcFJhbmdlID0geyBzdGFydDogeyBsaW5lOiBudW1iZXI7IGNoYXJhY3RlcjogbnVtYmVyIH07IGVuZDogeyBsaW5lOiBudW1iZXI7IGNoYXJhY3RlcjogbnVtYmVyIH0gfTtcblxuLyoqIE1vbmFjbyBjb21wbGV0aW9uIGl0ZW0gY2FycnlpbmcgdGhlIG9yaWdpbmF0aW5nIExTUCBpdGVtIHNvIHJlc29sdmUgY2FuIGZldGNoIGl0cyBpbXBvcnQgZWRpdHMuICovXG50eXBlIE1vbmFjb0NvbXBsZXRpb25JdGVtID0gbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbSAmIHsgX2xzcD86IENvbXBsZXRpb25JdGVtIH07XG5cbmZ1bmN0aW9uIHRleHRFZGl0VG9Nb25hY28oZWRpdDogVGV4dEVkaXQpOiBtb25hY28ubGFuZ3VhZ2VzLlRleHRFZGl0IHtcbiAgICByZXR1cm4geyByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhlZGl0LnJhbmdlKSwgdGV4dDogZWRpdC5uZXdUZXh0IH07XG59XG5cbmZ1bmN0aW9uIG1vbmFjb1JhbmdlVG9Mc3AocjogbW9uYWNvLklSYW5nZSk6IExzcFJhbmdlIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBzdGFydDogeyBsaW5lOiByLnN0YXJ0TGluZU51bWJlciAtIDEsIGNoYXJhY3Rlcjogci5zdGFydENvbHVtbiAtIDEgfSxcbiAgICAgICAgZW5kOiAgIHsgbGluZTogci5lbmRMaW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiByLmVuZENvbHVtbiAtIDEgfSxcbiAgICB9O1xufVxuXG4vKiogVHJ1ZSB3aGVuIHR3byBMU1AgcmFuZ2VzIGludGVyc2VjdCAodXNlZCB0byBwaWNrIHRoZSBkaWFnbm9zdGljcyByZWxldmFudCB0byBhIGNvZGUtYWN0aW9uIHJlcXVlc3QpLiAqL1xuZnVuY3Rpb24gcmFuZ2VzT3ZlcmxhcChhOiBMc3BSYW5nZSwgYjogTHNwUmFuZ2UpOiBib29sZWFuIHtcbiAgICBjb25zdCBub3RBZnRlciA9IChwOiB7IGxpbmU6IG51bWJlcjsgY2hhcmFjdGVyOiBudW1iZXIgfSwgcTogeyBsaW5lOiBudW1iZXI7IGNoYXJhY3RlcjogbnVtYmVyIH0pID0+XG4gICAgICAgIHAubGluZSA8IHEubGluZSB8fCAocC5saW5lID09PSBxLmxpbmUgJiYgcC5jaGFyYWN0ZXIgPD0gcS5jaGFyYWN0ZXIpO1xuICAgIHJldHVybiBub3RBZnRlcihhLnN0YXJ0LCBiLmVuZCkgJiYgbm90QWZ0ZXIoYi5zdGFydCwgYS5lbmQpO1xufVxuXG5mdW5jdGlvbiBsc3BDb2RlQWN0aW9uVG9Nb25hY28oYWN0aW9uOiBDb2RlQWN0aW9uIHwgQ29tbWFuZCk6IG1vbmFjby5sYW5ndWFnZXMuQ29kZUFjdGlvbiB7XG4gICAgY29uc3QgaXNDb21tYW5kID0gdHlwZW9mIChhY3Rpb24gYXMgQ29tbWFuZCkuY29tbWFuZCA9PT0gJ3N0cmluZyc7XG4gICAgY29uc3QgdGl0bGUgPSBhY3Rpb24udGl0bGVcbiAgICAgICAgPz8gKGlzQ29tbWFuZCA/IChhY3Rpb24gYXMgQ29tbWFuZCkuY29tbWFuZCA6IChhY3Rpb24gYXMgQ29kZUFjdGlvbikuY29tbWFuZD8udGl0bGUpXG4gICAgICAgID8/ICdBY3Rpb24nO1xuICAgIGNvbnN0IGtpbmQgPSBpc0NvbW1hbmQgPyAncXVpY2tmaXgnIDogKChhY3Rpb24gYXMgQ29kZUFjdGlvbikua2luZCA/PyAncXVpY2tmaXgnKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB0aXRsZSxcbiAgICAgICAga2luZCxcbiAgICAgICAgZGlhZ25vc3RpY3M6IFtdLFxuICAgICAgICBpc1ByZWZlcnJlZDogKGFjdGlvbiBhcyBDb2RlQWN0aW9uKS5pc1ByZWZlcnJlZCxcbiAgICAgICAgLy8gQXBwbHkgbGF6aWx5IHRocm91Z2ggb3VyIGNvbW1hbmQgc28gd2UgY2FuIHJlc29sdmUsIHJ1biBzZXJ2ZXIgY29tbWFuZHMgYW5kIGFwcGx5IGVkaXRzIHVuaWZvcm1seS5cbiAgICAgICAgY29tbWFuZDogeyBpZDogQVBQTFlfQUNUSU9OX0NPTU1BTkQsIHRpdGxlLCBhcmd1bWVudHM6IFthY3Rpb25dIH0sXG4gICAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gYXBwbHlDb2RlQWN0aW9uKGFjdGlvbjogQ29kZUFjdGlvbiB8IENvbW1hbmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIV9jb25uKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiAoYWN0aW9uIGFzIENvbW1hbmQpLmNvbW1hbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBhd2FpdCBydW5TZXJ2ZXJDb21tYW5kKGFjdGlvbiBhcyBDb21tYW5kKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzb2x2ZWQgPSBhY3Rpb24gYXMgQ29kZUFjdGlvbjtcbiAgICAgICAgaWYgKCFyZXNvbHZlZC5lZGl0ICYmIChyZXNvbHZlZCBhcyB7IGRhdGE/OiB1bmtub3duIH0pLmRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzb2x2ZWQgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgnY29kZUFjdGlvbi9yZXNvbHZlJywgcmVzb2x2ZWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXNvbHZlZC5lZGl0KSBhcHBseVdvcmtzcGFjZUVkaXQocmVzb2x2ZWQuZWRpdCk7XG4gICAgICAgIGlmIChyZXNvbHZlZC5jb21tYW5kKSBhd2FpdCBydW5TZXJ2ZXJDb21tYW5kKHJlc29sdmVkLmNvbW1hbmQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbamF2YS1sc3BdIGNvZGUgYWN0aW9uIGZhaWxlZDonLCAoZSBhcyBFcnJvcik/Lm1lc3NhZ2UgPz8gZSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBpc1dvcmtzcGFjZUVkaXQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBXb3Jrc3BhY2VFZGl0IHtcbiAgICByZXR1cm4gISF2YWx1ZSAmJiAoISEodmFsdWUgYXMgV29ya3NwYWNlRWRpdCkuY2hhbmdlcyB8fCAhISh2YWx1ZSBhcyBXb3Jrc3BhY2VFZGl0KS5kb2N1bWVudENoYW5nZXMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5TZXJ2ZXJDb21tYW5kKGNtZDogQ29tbWFuZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghX2Nvbm4gfHwgIWNtZD8uY29tbWFuZCkgcmV0dXJuO1xuICAgIGlmIChHRU5FUkFURVtjbWQuY29tbWFuZF0pIHtcbiAgICAgICAgYXdhaXQgcnVuR2VuZXJhdGUoY21kLmNvbW1hbmQsIGNtZC5hcmd1bWVudHMgPz8gW10pO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd3b3Jrc3BhY2UvZXhlY3V0ZUNvbW1hbmQnLCB7IGNvbW1hbmQ6IGNtZC5jb21tYW5kLCBhcmd1bWVudHM6IGNtZC5hcmd1bWVudHMgPz8gW10gfSk7XG4gICAgaWYgKGlzV29ya3NwYWNlRWRpdChyZXN1bHQpKSBhcHBseVdvcmtzcGFjZUVkaXQocmVzdWx0KTtcbn1cblxuaW50ZXJmYWNlIEdlbmVyYXRlU3BlYyB7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICBzdGF0dXM6IHN0cmluZztcbiAgICBnZW5lcmF0ZTogc3RyaW5nO1xuICAgIG1lbWJlcnM6IChzdGF0dXM6IGFueSkgPT4gQXJyYXk8eyBsYWJlbDogc3RyaW5nOyByZWY6IGFueSB9PjtcbiAgICBidWlsZEFyZ3M6IChwcm9tcHRBcmdzOiBhbnlbXSwgc3RhdHVzOiBhbnksIHNlbGVjdGVkOiBhbnlbXSkgPT4gYW55W107XG59XG5cbi8qKiBNZW1iZXItbmFtZWQgZmllbGRzIFx1MjE5MiBwaWNrZXIgbGFiZWxzLiAqL1xuZnVuY3Rpb24gZmllbGRMYWJlbChmOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSBmPy5uYW1lID8/IGY/LmZpZWxkTmFtZSA/PyAnJztcbiAgICBjb25zdCB0eXBlID0gZj8udHlwZSA/PyBmPy50eXBlTmFtZTtcbiAgICByZXR1cm4gdHlwZSA/IGAke25hbWV9OiAke3R5cGV9YCA6IGAke25hbWV9YDtcbn1cblxuLyoqXG4gKiBUaGUgSkRULkxTIHNvdXJjZS1nZW5lcmF0aW9uIGNvbW1hbmRzIChjb25zdHJ1Y3RvcnMsIGdldHRlcnMvc2V0dGVycywgdG9TdHJpbmcsIGhhc2hDb2RlL2VxdWFscykuXG4gKiBFYWNoIG1hcHMgdGhlIGNsaWVudCBcIipQcm9tcHRcIiBjb21tYW5kIHRvIHRoZSBzZXJ2ZXIgc3RhdHVzICsgZ2VuZXJhdGUgZGVsZWdhdGUgY29tbWFuZHM7IHRoZSBzdGF0dXNcbiAqIGNhbGwgeWllbGRzIHRoZSBjYW5kaWRhdGUgZmllbGRzIHNob3duIGluIHRoZSBtZW1iZXIgcGlja2VyLCB0aGUgZ2VuZXJhdGUgY2FsbCByZXR1cm5zIHRoZSBlZGl0LlxuICovXG5jb25zdCBHRU5FUkFURTogUmVjb3JkPHN0cmluZywgR2VuZXJhdGVTcGVjPiA9IHtcbiAgICAnamF2YS5hY3Rpb24uZ2VuZXJhdGVDb25zdHJ1Y3RvcnNQcm9tcHQnOiB7XG4gICAgICAgIGxhYmVsOiAnU2VsZWN0IGZpZWxkcyBhbmQgY29uc3RydWN0b3JzJyxcbiAgICAgICAgc3RhdHVzOiAnamF2YS5hY3Rpb24uY2hlY2tDb25zdHJ1Y3RvcnNTdGF0dXMnLFxuICAgICAgICBnZW5lcmF0ZTogJ2phdmEuYWN0aW9uLmdlbmVyYXRlQ29uc3RydWN0b3JzJyxcbiAgICAgICAgbWVtYmVyczogKHMpID0+IChzPy5maWVsZHMgPz8gW10pLm1hcCgoZjogYW55KSA9PiAoeyBsYWJlbDogZmllbGRMYWJlbChmKSwgcmVmOiBmIH0pKSxcbiAgICAgICAgYnVpbGRBcmdzOiAoYXJncywgcywgc2VsKSA9PiBbYXJnc1swXSwgeyBjb25zdHJ1Y3RvcnM6IHM/LmNvbnN0cnVjdG9ycyA/PyBbXSwgZmllbGRzOiBzZWwubWFwKG0gPT4gbS5yZWYpIH1dLFxuICAgIH0sXG4gICAgJ2phdmEuYWN0aW9uLmdlbmVyYXRlVG9TdHJpbmdQcm9tcHQnOiB7XG4gICAgICAgIGxhYmVsOiAnU2VsZWN0IGZpZWxkcyB0byBpbmNsdWRlIGluIHRvU3RyaW5nKCknLFxuICAgICAgICBzdGF0dXM6ICdqYXZhLmFjdGlvbi5jaGVja1RvU3RyaW5nU3RhdHVzJyxcbiAgICAgICAgZ2VuZXJhdGU6ICdqYXZhLmFjdGlvbi5nZW5lcmF0ZVRvU3RyaW5nJyxcbiAgICAgICAgbWVtYmVyczogKHMpID0+IChzPy5maWVsZHMgPz8gW10pLm1hcCgoZjogYW55KSA9PiAoeyBsYWJlbDogZmllbGRMYWJlbChmKSwgcmVmOiBmIH0pKSxcbiAgICAgICAgYnVpbGRBcmdzOiAoYXJncywgX3MsIHNlbCkgPT4gW2FyZ3NbMF0sIHNlbC5tYXAobSA9PiBtLnJlZildLFxuICAgIH0sXG4gICAgJ2phdmEuYWN0aW9uLmhhc2hDb2RlRXF1YWxzUHJvbXB0Jzoge1xuICAgICAgICBsYWJlbDogJ1NlbGVjdCBmaWVsZHMgZm9yIGhhc2hDb2RlKCkgYW5kIGVxdWFscygpJyxcbiAgICAgICAgc3RhdHVzOiAnamF2YS5hY3Rpb24uY2hlY2tIYXNoQ29kZUVxdWFsc1N0YXR1cycsXG4gICAgICAgIGdlbmVyYXRlOiAnamF2YS5hY3Rpb24uZ2VuZXJhdGVIYXNoQ29kZUVxdWFscycsXG4gICAgICAgIG1lbWJlcnM6IChzKSA9PiAocz8uZmllbGRzID8/IFtdKS5tYXAoKGY6IGFueSkgPT4gKHsgbGFiZWw6IGZpZWxkTGFiZWwoZiksIHJlZjogZiB9KSksXG4gICAgICAgIGJ1aWxkQXJnczogKGFyZ3MsIF9zLCBzZWwpID0+IFthcmdzWzBdLCBzZWwubWFwKG0gPT4gbS5yZWYpLCBmYWxzZV0sXG4gICAgfSxcbiAgICAnamF2YS5hY3Rpb24uZ2VuZXJhdGVBY2Nlc3NvcnNQcm9tcHQnOiB7XG4gICAgICAgIGxhYmVsOiAnU2VsZWN0IGZpZWxkcyB0byBnZW5lcmF0ZSBnZXR0ZXJzIGFuZCBzZXR0ZXJzJyxcbiAgICAgICAgc3RhdHVzOiAnamF2YS5hY3Rpb24uY2hlY2tBY2Nlc3NvcnNTdGF0dXMnLFxuICAgICAgICBnZW5lcmF0ZTogJ2phdmEuYWN0aW9uLmdlbmVyYXRlQWNjZXNzb3JzJyxcbiAgICAgICAgbWVtYmVyczogKHMpID0+IChzPy5hY2Nlc3NvcnMgPz8gcyA/PyBbXSkubWFwKChhOiBhbnkpID0+ICh7IGxhYmVsOiBmaWVsZExhYmVsKGEpLCByZWY6IGEgfSkpLFxuICAgICAgICBidWlsZEFyZ3M6IChhcmdzLCBfcywgc2VsKSA9PiBbYXJnc1swXSwgc2VsLm1hcChtID0+IG0ucmVmKV0sXG4gICAgfSxcbiAgICAnamF2YS5hY3Rpb24ub3ZlcnJpZGVNZXRob2RzUHJvbXB0Jzoge1xuICAgICAgICBsYWJlbDogJ1NlbGVjdCBtZXRob2RzIHRvIG92ZXJyaWRlIG9yIGltcGxlbWVudCcsXG4gICAgICAgIHN0YXR1czogJ2phdmEuYWN0aW9uLmxpc3RPdmVycmlkYWJsZU1ldGhvZHMnLFxuICAgICAgICBnZW5lcmF0ZTogJ2phdmEuYWN0aW9uLmFkZE92ZXJyaWRhYmxlTWV0aG9kcycsXG4gICAgICAgIG1lbWJlcnM6IChzKSA9PiAocz8ubWV0aG9kcyA/PyBbXSkubWFwKChtOiBhbnkpID0+ICh7XG4gICAgICAgICAgICBsYWJlbDogYCR7bS5uYW1lfSgkeyhtLnBhcmFtZXRlcnMgPz8gW10pLmpvaW4oJywgJyl9KSR7bS5kZWNsYXJpbmdDbGFzcyA/ICcgOiAnICsgbS5kZWNsYXJpbmdDbGFzcyA6ICcnfWAsXG4gICAgICAgICAgICByZWY6IG0sXG4gICAgICAgIH0pKSxcbiAgICAgICAgYnVpbGRBcmdzOiAoYXJncywgc3RhdHVzLCBzZWwpID0+IFthcmdzWzBdLCB7IG92ZXJyaWRhYmxlTWV0aG9kczogc2VsLm1hcChtID0+IG0ucmVmKSwgdHlwZTogc3RhdHVzPy50eXBlIH1dLFxuICAgIH0sXG59O1xuXG5hc3luYyBmdW5jdGlvbiBydW5HZW5lcmF0ZShwcm9tcHRJZDogc3RyaW5nLCBhcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghX2Nvbm4pIHJldHVybjtcbiAgICBjb25zdCBzcGVjID0gR0VORVJBVEVbcHJvbXB0SWRdO1xuICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd3b3Jrc3BhY2UvZXhlY3V0ZUNvbW1hbmQnLCB7IGNvbW1hbmQ6IHNwZWMuc3RhdHVzLCBhcmd1bWVudHM6IGFyZ3MgfSk7XG4gICAgaWYgKCFzdGF0dXMpIHJldHVybjtcbiAgICBjb25zdCBtZW1iZXJzID0gc3BlYy5tZW1iZXJzKHN0YXR1cyk7XG4gICAgbGV0IHNlbGVjdGVkID0gbWVtYmVycztcbiAgICBjb25zdCBwaWNrZXIgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLmphdmFMc3BNZW1iZXJQaWNrZXI7XG4gICAgaWYgKG1lbWJlcnMubGVuZ3RoICYmIHR5cGVvZiBwaWNrZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY29uc3QgY2hvc2VuOiBzdHJpbmdbXSB8IG51bGwgPSBhd2FpdCBwaWNrZXIoc3BlYy5sYWJlbCwgbWVtYmVycy5tYXAobSA9PiBtLmxhYmVsKSk7XG4gICAgICAgIGlmIChjaG9zZW4gPT09IG51bGwpIHJldHVybjsgLy8gdXNlciBjYW5jZWxsZWQgdGhlIGRpYWxvZ1xuICAgICAgICBzZWxlY3RlZCA9IG1lbWJlcnMuZmlsdGVyKG0gPT4gY2hvc2VuLmluY2x1ZGVzKG0ubGFiZWwpKTtcbiAgICB9XG4gICAgY29uc3QgZWRpdCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd3b3Jrc3BhY2UvZXhlY3V0ZUNvbW1hbmQnLCB7XG4gICAgICAgIGNvbW1hbmQ6IHNwZWMuZ2VuZXJhdGUsXG4gICAgICAgIGFyZ3VtZW50czogc3BlYy5idWlsZEFyZ3MoYXJncywgc3RhdHVzLCBzZWxlY3RlZCksXG4gICAgfSk7XG4gICAgaWYgKGlzV29ya3NwYWNlRWRpdChlZGl0KSkgYXBwbHlXb3Jrc3BhY2VFZGl0KGVkaXQpO1xufVxuXG4vKiogR3JvdXBzIGEgd29ya3NwYWNlIGVkaXQncyB0ZXh0IGVkaXRzIGJ5IGRvY3VtZW50IGFuZCBhcHBsaWVzIHRoZW0gaW4gcGxhY2UgdG8gb3BlbiBNb25hY28gbW9kZWxzLiAqL1xuZnVuY3Rpb24gYXBwbHlXb3Jrc3BhY2VFZGl0KGVkaXQ6IFdvcmtzcGFjZUVkaXQgfCBudWxsIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0KSByZXR1cm47XG4gICAgY29uc3QgYnlVcmk6IFJlY29yZDxzdHJpbmcsIFRleHRFZGl0W10+ID0ge307XG4gICAgaWYgKGVkaXQuY2hhbmdlcykge1xuICAgICAgICBmb3IgKGNvbnN0IHVyaSBpbiBlZGl0LmNoYW5nZXMpIGJ5VXJpW3VyaV0gPSAoYnlVcmlbdXJpXSA/PyBbXSkuY29uY2F0KGVkaXQuY2hhbmdlc1t1cmldKTtcbiAgICB9XG4gICAgaWYgKGVkaXQuZG9jdW1lbnRDaGFuZ2VzKSB7XG4gICAgICAgIGZvciAoY29uc3QgZGMgb2YgZWRpdC5kb2N1bWVudENoYW5nZXMgYXMgYW55W10pIHtcbiAgICAgICAgICAgIGlmIChkYz8udGV4dERvY3VtZW50Py51cmkgJiYgQXJyYXkuaXNBcnJheShkYy5lZGl0cykpIHtcbiAgICAgICAgICAgICAgICBieVVyaVtkYy50ZXh0RG9jdW1lbnQudXJpXSA9IChieVVyaVtkYy50ZXh0RG9jdW1lbnQudXJpXSA/PyBbXSkuY29uY2F0KGRjLmVkaXRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IHVyaSBpbiBieVVyaSkge1xuICAgICAgICBjb25zdCBtb2RlbCA9IG1vbmFjby5lZGl0b3IuZ2V0TW9kZWxzKCkuZmluZChtID0+IG0udXJpLnRvU3RyaW5nKCkgPT09IHVyaSk7XG4gICAgICAgIGlmICghbW9kZWwpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBvcHMgPSBieVVyaVt1cmldLm1hcChlID0+ICh7IHJhbmdlOiBsc3BSYW5nZVRvTW9uYWNvKGUucmFuZ2UpLCB0ZXh0OiBlLm5ld1RleHQsIGZvcmNlTW92ZU1hcmtlcnM6IHRydWUgfSkpO1xuICAgICAgICBtb2RlbC5wdXNoRWRpdE9wZXJhdGlvbnMoW10sIG9wcywgKCkgPT4gbnVsbCk7XG4gICAgfVxufVxuXG4vKiogQ29udmVydHMgYW4gTFNQIHdvcmtzcGFjZSBlZGl0IGludG8gdGhlIE1vbmFjbyBzaGFwZSByZXR1cm5lZCBieSB0aGUgcmVuYW1lIHByb3ZpZGVyLiAqL1xuZnVuY3Rpb24gd29ya3NwYWNlRWRpdFRvTW9uYWNvKGVkaXQ6IFdvcmtzcGFjZUVkaXQgfCBudWxsKTogbW9uYWNvLmxhbmd1YWdlcy5Xb3Jrc3BhY2VFZGl0IHtcbiAgICBjb25zdCBlZGl0czogYW55W10gPSBbXTtcbiAgICBjb25zdCBwdXNoID0gKHVyaTogc3RyaW5nLCBsaXN0OiBUZXh0RWRpdFtdKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgZSBvZiBsaXN0KSB7XG4gICAgICAgICAgICBlZGl0cy5wdXNoKHsgcmVzb3VyY2U6IG1vbmFjby5VcmkucGFyc2UodXJpKSwgdGV4dEVkaXQ6IHsgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28oZS5yYW5nZSksIHRleHQ6IGUubmV3VGV4dCB9LCB2ZXJzaW9uSWQ6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgaWYgKGVkaXQ/LmNoYW5nZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCB1cmkgaW4gZWRpdC5jaGFuZ2VzKSBwdXNoKHVyaSwgZWRpdC5jaGFuZ2VzW3VyaV0pO1xuICAgIH1cbiAgICBpZiAoZWRpdD8uZG9jdW1lbnRDaGFuZ2VzKSB7XG4gICAgICAgIGZvciAoY29uc3QgZGMgb2YgZWRpdC5kb2N1bWVudENoYW5nZXMgYXMgYW55W10pIHtcbiAgICAgICAgICAgIGlmIChkYz8udGV4dERvY3VtZW50Py51cmkgJiYgQXJyYXkuaXNBcnJheShkYy5lZGl0cykpIHB1c2goZGMudGV4dERvY3VtZW50LnVyaSwgZGMuZWRpdHMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGVkaXRzIH07XG59XG5cbi8qKiBNYXBzIGEgdmlydHVhbCBlZGl0b3IgVVJJIGJhY2sgdG8gdGhlIElERSB3b3Jrc3BhY2UgcGF0aCAoe0Bjb2RlIC93cy9wcm9qLy4uLn0pLiAqL1xuZnVuY3Rpb24gdXJpVG9Xb3Jrc3BhY2VQYXRoKHVyaTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCF1cmkuc3RhcnRzV2l0aChWSVJUVUFMX0ZJTEVfUFJFRklYKSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh1cmkuc3Vic3RyaW5nKFZJUlRVQUxfRklMRV9QUkVGSVgubGVuZ3RoKSk7XG59XG5cbi8qKiBSZWFkcyBhIHdvcmtzcGFjZSBmaWxlJ3MgY3VycmVudCB0ZXh0IG92ZXIgdGhlIElERSBSRVNUIEFQSS4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZldGNoV29ya3NwYWNlRmlsZVRleHQoaWRlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvc2VydmljZXMvaWRlL3dvcmtzcGFjZXMnICsgaWRlUGF0aCwgeyBoZWFkZXJzOiB7ICdYLVJlcXVlc3RlZC1XaXRoJzogJ0ZldGNoJyB9IH0pO1xuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgcmVhZCAke2lkZVBhdGh9IChIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfSlgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTtcbn1cblxuLyoqIEFwcGxpZXMgTFNQIHRleHQgZWRpdHMgdG8gYSBzdHJpbmcuIE9mZnNldHMgYXJlIHJlc29sdmVkIGFnYWluc3QgdGhlIG9yaWdpbmFsIHRleHQgYW5kIGVkaXRzIGFyZVxuICogIGFwcGxpZWQgZnJvbSB0aGUgZW5kIGJhY2t3YXJkcywgc28gZWFybGllciBvZmZzZXRzIHN0YXkgdmFsaWQuICovXG5mdW5jdGlvbiBhcHBseUVkaXRzVG9UZXh0KHRleHQ6IHN0cmluZywgZWRpdHM6IFRleHRFZGl0W10pOiBzdHJpbmcge1xuICAgIGNvbnN0IGxpbmVTdGFydHMgPSBbMF07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICh0ZXh0LmNoYXJDb2RlQXQoaSkgPT09IDEwIC8qIFxcbiAqLykgbGluZVN0YXJ0cy5wdXNoKGkgKyAxKTtcbiAgICB9XG4gICAgY29uc3Qgb2Zmc2V0ID0gKHA6IHsgbGluZTogbnVtYmVyOyBjaGFyYWN0ZXI6IG51bWJlciB9KSA9PiAobGluZVN0YXJ0c1twLmxpbmVdID8/IHRleHQubGVuZ3RoKSArIHAuY2hhcmFjdGVyO1xuICAgIGNvbnN0IG9yZGVyZWQgPSBlZGl0cy5zbGljZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IG9mZnNldChiLnJhbmdlLnN0YXJ0KSAtIG9mZnNldChhLnJhbmdlLnN0YXJ0KSk7XG4gICAgbGV0IHJlc3VsdCA9IHRleHQ7XG4gICAgZm9yIChjb25zdCBlIG9mIG9yZGVyZWQpIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnNsaWNlKDAsIG9mZnNldChlLnJhbmdlLnN0YXJ0KSkgKyBlLm5ld1RleHQgKyByZXN1bHQuc2xpY2Uob2Zmc2V0KGUucmFuZ2UuZW5kKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQXBwbGllcyBhIEpEVC5MUyByZW5hbWUge0BsaW5rIFdvcmtzcGFjZUVkaXR9IGFjcm9zcyB0aGUgd2hvbGUgd29ya3NwYWNlOiB0ZXh0IGVkaXRzIGluIGV2ZXJ5XG4gKiBhZmZlY3RlZCBmaWxlIHBsdXMgYW55IHtAY29kZSBSZW5hbWVGaWxlfSBvcGVyYXRpb24gKGEgcHVibGljLXR5cGUgcmVuYW1lIHJlbmFtZXMgaXRzIG93blxuICoge0Bjb2RlIC5qYXZhfSBmaWxlKS4gVGhlIGN1cnJlbnQgZmlsZSdzIGVkaXRzIGdvIHRocm91Z2ggdGhlIGxpdmUgTW9uYWNvIG1vZGVsOyB0aGUgcmVzdCBhcmUgcmVhZCxcbiAqIGVkaXRlZCBhbmQgd3JpdHRlbiBiYWNrIG92ZXIgUkVTVC4gUGVyc2lzdGVuY2UgKENTUkYtZ3VhcmRlZCB3cml0ZXMsIHRoZSB0YWIgc3dpdGNoIHdoZW4gdGhlIGN1cnJlbnRcbiAqIGZpbGUgaXMgcmVuYW1lZCwgYW5kIHJlbG9hZGluZyBvdGhlciBvcGVuIGVkaXRvcnMpIGlzIGRlbGVnYXRlZCB0byB0aGUgSURFIHZpYSBqYXZhTHNwUGVyc2lzdFJlbmFtZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYXBwbHlSZW5hbWVBY3Jvc3NXb3Jrc3BhY2UobW9kZWw6IG1vbmFjby5lZGl0b3IuSVRleHRNb2RlbCwgZWRpdDogV29ya3NwYWNlRWRpdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGN1cnJlbnRVcmkgPSBtb2RlbC51cmkudG9TdHJpbmcoKTtcbiAgICBjb25zdCB0ZXh0QnlVcmk6IFJlY29yZDxzdHJpbmcsIFRleHRFZGl0W10+ID0ge307XG4gICAgY29uc3QgcmVuYW1lQnlVcmk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgIGlmIChlZGl0LmNoYW5nZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCB1cmkgaW4gZWRpdC5jaGFuZ2VzKSB0ZXh0QnlVcmlbdXJpXSA9ICh0ZXh0QnlVcmlbdXJpXSA/PyBbXSkuY29uY2F0KGVkaXQuY2hhbmdlc1t1cmldKTtcbiAgICB9XG4gICAgaWYgKGVkaXQuZG9jdW1lbnRDaGFuZ2VzKSB7XG4gICAgICAgIGZvciAoY29uc3QgZGMgb2YgZWRpdC5kb2N1bWVudENoYW5nZXMgYXMgYW55W10pIHtcbiAgICAgICAgICAgIGlmIChkYz8ua2luZCA9PT0gJ3JlbmFtZScgJiYgZGMub2xkVXJpICYmIGRjLm5ld1VyaSkge1xuICAgICAgICAgICAgICAgIHJlbmFtZUJ5VXJpW2RjLm9sZFVyaV0gPSBkYy5uZXdVcmk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRjPy50ZXh0RG9jdW1lbnQ/LnVyaSAmJiBBcnJheS5pc0FycmF5KGRjLmVkaXRzKSkge1xuICAgICAgICAgICAgICAgIHRleHRCeVVyaVtkYy50ZXh0RG9jdW1lbnQudXJpXSA9ICh0ZXh0QnlVcmlbZGMudGV4dERvY3VtZW50LnVyaV0gPz8gW10pLmNvbmNhdChkYy5lZGl0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBKRFQuTFMgbWF5IGtleSBhIGZpbGUncyB0ZXh0IGVkaXRzIGJ5IGl0cyBQT1NULXJlbmFtZSBVUkkgKGRvY3VtZW50Q2hhbmdlcyBhcmUgb3JkZXJlZCwgYW5kIHRoZVxuICAgIC8vIHJlbmFtZSBjYW4gcHJlY2VkZSB0aGUgZWRpdCkuIFJlLWF0dHJpYnV0ZSBldmVyeSBlZGl0IHRvIHRoZSBvbi1kaXNrIChvbGQpIFVSSSBzbyB0aGUgY29udGVudCBpc1xuICAgIC8vIGVkaXRlZCBjb3JyZWN0bHkgYmVmb3JlIHRoZSBmaWxlIGlzIHdyaXR0ZW4vcmVuYW1lZCBcdTIwMTQgb3RoZXJ3aXNlIHRoZSBuZXcgZmlsZSBrZWVwcyB0aGUgb2xkIHR5cGVcbiAgICAvLyBuYW1lIGFuZCB0cmlnZ2VycyBcIlRoZSBwdWJsaWMgdHlwZSBYIG11c3QgYmUgZGVmaW5lZCBpbiBpdHMgb3duIGZpbGVcIi5cbiAgICBjb25zdCBuZXdUb09sZDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgIGZvciAoY29uc3Qgb2xkVXJpIGluIHJlbmFtZUJ5VXJpKSBuZXdUb09sZFtyZW5hbWVCeVVyaVtvbGRVcmldXSA9IG9sZFVyaTtcbiAgICBjb25zdCBlZGl0c0J5T2xkOiBSZWNvcmQ8c3RyaW5nLCBUZXh0RWRpdFtdPiA9IHt9O1xuICAgIGZvciAoY29uc3QgdXJpIGluIHRleHRCeVVyaSkge1xuICAgICAgICBjb25zdCBvbkRpc2tVcmkgPSBuZXdUb09sZFt1cmldID8/IHVyaTtcbiAgICAgICAgZWRpdHNCeU9sZFtvbkRpc2tVcmldID0gKGVkaXRzQnlPbGRbb25EaXNrVXJpXSA/PyBbXSkuY29uY2F0KHRleHRCeVVyaVt1cmldKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXlsb2FkOiB7XG4gICAgICAgIGN1cnJlbnRQYXRoOiBzdHJpbmcgfCBudWxsO1xuICAgICAgICBjdXJyZW50Q29udGVudDogc3RyaW5nIHwgbnVsbDtcbiAgICAgICAgY3VycmVudE5ld1BhdGg6IHN0cmluZyB8IG51bGw7XG4gICAgICAgIHdyaXRlczogQXJyYXk8eyBwYXRoOiBzdHJpbmcgfCBudWxsOyBjb250ZW50OiBzdHJpbmcgfT47XG4gICAgICAgIHJlbmFtZXM6IEFycmF5PHsgb2xkUGF0aDogc3RyaW5nIHwgbnVsbDsgbmV3UGF0aDogc3RyaW5nIHwgbnVsbDsgY29udGVudDogc3RyaW5nIH0+O1xuICAgIH0gPSB7IGN1cnJlbnRQYXRoOiB1cmlUb1dvcmtzcGFjZVBhdGgoY3VycmVudFVyaSksIGN1cnJlbnRDb250ZW50OiBudWxsLCBjdXJyZW50TmV3UGF0aDogbnVsbCwgd3JpdGVzOiBbXSwgcmVuYW1lczogW10gfTtcblxuICAgIGNvbnN0IHdhdGNoZWRDaGFuZ2VzOiBBcnJheTx7IHVyaTogc3RyaW5nOyB0eXBlOiBudW1iZXIgfT4gPSBbXTtcbiAgICBjb25zdCBvbGRVcmlzID0gbmV3IFNldDxzdHJpbmc+KFsuLi5PYmplY3Qua2V5cyhlZGl0c0J5T2xkKSwgLi4uT2JqZWN0LmtleXMocmVuYW1lQnlVcmkpXSk7XG4gICAgZm9yIChjb25zdCBvbGRVcmkgb2Ygb2xkVXJpcykge1xuICAgICAgICBjb25zdCBlZGl0cyA9IGVkaXRzQnlPbGRbb2xkVXJpXSA/PyBbXTtcbiAgICAgICAgbGV0IGNvbnRlbnQ6IHN0cmluZztcbiAgICAgICAgaWYgKG9sZFVyaSA9PT0gY3VycmVudFVyaSkge1xuICAgICAgICAgICAgaWYgKGVkaXRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIG1vZGVsLnB1c2hFZGl0T3BlcmF0aW9ucyhbXSwgZWRpdHMubWFwKGUgPT4gKHsgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28oZS5yYW5nZSksIHRleHQ6IGUubmV3VGV4dCwgZm9yY2VNb3ZlTWFya2VyczogdHJ1ZSB9KSksICgpID0+IG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGVudCA9IG1vZGVsLmdldFZhbHVlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBhd2FpdCBmZXRjaFdvcmtzcGFjZUZpbGVUZXh0KHVyaVRvV29ya3NwYWNlUGF0aChvbGRVcmkpID8/IG9sZFVyaSk7XG4gICAgICAgICAgICBjb250ZW50ID0gZWRpdHMubGVuZ3RoID8gYXBwbHlFZGl0c1RvVGV4dChzb3VyY2UsIGVkaXRzKSA6IHNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdVcmkgPSByZW5hbWVCeVVyaVtvbGRVcmldO1xuICAgICAgICBpZiAob2xkVXJpID09PSBjdXJyZW50VXJpKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmN1cnJlbnRDb250ZW50ID0gY29udGVudDtcbiAgICAgICAgICAgIHBheWxvYWQuY3VycmVudE5ld1BhdGggPSBuZXdVcmkgPyB1cmlUb1dvcmtzcGFjZVBhdGgobmV3VXJpKSA6IG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAobmV3VXJpKSB7XG4gICAgICAgICAgICBwYXlsb2FkLnJlbmFtZXMucHVzaCh7IG9sZFBhdGg6IHVyaVRvV29ya3NwYWNlUGF0aChvbGRVcmkpLCBuZXdQYXRoOiB1cmlUb1dvcmtzcGFjZVBhdGgobmV3VXJpKSwgY29udGVudCB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBheWxvYWQud3JpdGVzLnB1c2goeyBwYXRoOiB1cmlUb1dvcmtzcGFjZVBhdGgob2xkVXJpKSwgY29udGVudCB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGaWxlLWNoYW5nZSBldmVudHMgZm9yIEpEVC5MUyBzbyBpdCByZS1zeW5jcyB3aXRob3V0IGEgcGFnZSByZWZyZXNoLlxuICAgICAgICBpZiAobmV3VXJpKSB7XG4gICAgICAgICAgICB3YXRjaGVkQ2hhbmdlcy5wdXNoKHsgdXJpOiBvbGRVcmksIHR5cGU6IDMgLyogRGVsZXRlZCAqLyB9LCB7IHVyaTogbmV3VXJpLCB0eXBlOiAxIC8qIENyZWF0ZWQgKi8gfSk7XG4gICAgICAgICAgICBfb3BlbkZpbGVzLmRlbGV0ZShvbGRVcmkpO1xuICAgICAgICAgICAgX2Nvbm4/LnNlbmROb3RpZmljYXRpb24oJ3RleHREb2N1bWVudC9kaWRDbG9zZScsIHsgdGV4dERvY3VtZW50OiB7IHVyaTogb2xkVXJpIH0gfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3YXRjaGVkQ2hhbmdlcy5wdXNoKHsgdXJpOiBvbGRVcmksIHR5cGU6IDIgLyogQ2hhbmdlZCAqLyB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IChnbG9iYWxUaGlzIGFzIGFueSkuamF2YUxzcFBlcnNpc3RSZW5hbWUocGF5bG9hZCk7XG5cbiAgICAvLyBJbmZvcm0gSkRULkxTIG9mIHRoZSBvbi1kaXNrIGNoYW5nZXMgc28gdGhlIHJlbmFtZWQgdHlwZSdzIGRpYWdub3N0aWNzIGNsZWFyIGltbWVkaWF0ZWx5LlxuICAgIGlmIChfY29ubiAmJiB3YXRjaGVkQ2hhbmdlcy5sZW5ndGgpIHtcbiAgICAgICAgX2Nvbm4uc2VuZE5vdGlmaWNhdGlvbignd29ya3NwYWNlL2RpZENoYW5nZVdhdGNoZWRGaWxlcycsIHsgY2hhbmdlczogd2F0Y2hlZENoYW5nZXMgfSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBqZHRsc1NldHRpbmdzKCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGphdmE6IHtcbiAgICAgICAgICAgIGltcG9ydDoge1xuICAgICAgICAgICAgICAgIG1hdmVuOiAgICAgIHsgZW5hYmxlZDogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIGdyYWRsZTogICAgIHsgZW5hYmxlZDogZmFsc2UgfSxcbiAgICAgICAgICAgICAgICBleGNsdXNpb25zOiBbJyoqL25vZGVfbW9kdWxlcy8qKicsICcqKi8ubWV0YWRhdGEvKionLCAnKiovYXJjaGV0eXBlLXJlc291cmNlcy8qKiddLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGF1dG9idWlsZDogeyBlbmFibGVkOiB0cnVlIH0sXG4gICAgICAgICAgICBjb21wbGV0aW9uOiB7XG4gICAgICAgICAgICAgICAgb3ZlcndyaXRlOiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgZ3Vlc3NNZXRob2RBcmd1bWVudHM6IGZhbHNlLFxuICAgICAgICAgICAgICAgIC8vIENhcCByZXN1bHRzIHNvIGltcG9ydC90eXBlIGNvbXBsZXRpb24gb3ZlciB0aGUgbGFyZ2UgcGxhdGZvcm0gY2xhc3NwYXRoIHN0YXlzIHNuYXBweS5cbiAgICAgICAgICAgICAgICBtYXhSZXN1bHRzOiAgICAgICAgICAgNTAsXG4gICAgICAgICAgICAgICAgZmlsdGVyZWRUeXBlczogW1xuICAgICAgICAgICAgICAgICAgICAnY29tLnN1bi4qJywgJ3N1bi4qJywgJ2pkay4qJyxcbiAgICAgICAgICAgICAgICAgICAgJ29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC4qJyxcbiAgICAgICAgICAgICAgICAgICAgJ29yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuKicsXG4gICAgICAgICAgICAgICAgICAgICdvcmcuZWNsaXBzZS5vc2dpLmludGVybmFsLionLFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgaW1wb3J0T3JkZXI6IFsnamF2YScsICdqYXZheCcsICdvcmcnLCAnY29tJywgJyddLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNpZ25hdHVyZUhlbHA6ICB7IGVuYWJsZWQ6IHRydWUgfSxcbiAgICAgICAgICAgIGZvcm1hdDogICAgICAgICB7IGVuYWJsZWQ6IHRydWUgfSxcbiAgICAgICAgICAgIHNhdmVBY3Rpb25zOiAgICB7IG9yZ2FuaXplSW1wb3J0czogZmFsc2UgfSxcbiAgICAgICAgICAgIGlubGF5SGludHM6ICAgICB7IHBhcmFtZXRlck5hbWVzOiB7IGVuYWJsZWQ6ICdhbGwnIH0gfSxcbiAgICAgICAgICAgIHJlZmVyZW5jZXNDb2RlTGVuczogICAgIHsgZW5hYmxlZDogdHJ1ZSB9LFxuICAgICAgICAgICAgaW1wbGVtZW50YXRpb25zQ29kZUxlbnM6IHsgZW5hYmxlZDogdHJ1ZSB9LFxuICAgICAgICB9LFxuICAgIH07XG59XG4iLCAiLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgMjAyNCBUeXBlRm94IGFuZCBvdGhlcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMSUNFTlNFIGluIHRoZSBwYWNrYWdlIHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuaW1wb3J0IHsgRGlzcG9zYWJsZSB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcblxuZXhwb3J0IGNsYXNzIERpc3Bvc2FibGVDb2xsZWN0aW9uIGltcGxlbWVudHMgRGlzcG9zYWJsZSB7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IGRpc3Bvc2FibGVzOiBEaXNwb3NhYmxlW10gPSBbXTtcblxuICAgIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgICAgIHdoaWxlICh0aGlzLmRpc3Bvc2FibGVzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgdGhpcy5kaXNwb3NhYmxlcy5wb3AoKSEuZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHVzaChkaXNwb3NhYmxlOiBEaXNwb3NhYmxlKTogRGlzcG9zYWJsZSB7XG4gICAgICAgIGNvbnN0IGRpc3Bvc2FibGVzID0gdGhpcy5kaXNwb3NhYmxlcztcbiAgICAgICAgZGlzcG9zYWJsZXMucHVzaChkaXNwb3NhYmxlKTtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRpc3Bvc2UoKTogdm9pZCB7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXggPSBkaXNwb3NhYmxlcy5pbmRleE9mKGRpc3Bvc2FibGUpO1xuICAgICAgICAgICAgICAgIGlmIChpbmRleCAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgZGlzcG9zYWJsZXMuc3BsaWNlKGluZGV4LCAxKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxufVxuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjQgVHlwZUZveCBhbmQgb3RoZXJzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTElDRU5TRSBpbiB0aGUgcGFja2FnZSByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbmltcG9ydCB7IERpc3Bvc2FibGUgfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG5pbXBvcnQgdHlwZSB7IElDb25uZWN0aW9uIH0gZnJvbSAnLi4vc2VydmVyL2Nvbm5lY3Rpb24uanMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIElXZWJTb2NrZXQgZXh0ZW5kcyBEaXNwb3NhYmxlIHtcbiAgICBzZW5kKGNvbnRlbnQ6IHN0cmluZyk6IHZvaWQ7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBvbk1lc3NhZ2UoY2I6IChkYXRhOiBhbnkpID0+IHZvaWQpOiB2b2lkO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgb25FcnJvcihjYjogKHJlYXNvbjogYW55KSA9PiB2b2lkKTogdm9pZDtcbiAgICBvbkNsb3NlKGNiOiAoY29kZTogbnVtYmVyLCByZWFzb246IHN0cmluZykgPT4gdm9pZCk6IHZvaWQ7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgSVdlYlNvY2tldENvbm5lY3Rpb24gZXh0ZW5kcyBJQ29ubmVjdGlvbiB7XG4gICAgcmVhZG9ubHkgc29ja2V0OiBJV2ViU29ja2V0O1xufVxuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjQgVHlwZUZveCBhbmQgb3RoZXJzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTElDRU5TRSBpbiB0aGUgcGFja2FnZSByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbmltcG9ydCB7IERpc3Bvc2FibGUgfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG4vLyBUT0RPOiBVc2UgZW52aXJvbm1lbnQtc3BlY2lmaWMgaW1wb3J0cyAodnNjb2RlLWpzb25ycGMvYnJvd3NlciBvciB2c2NvZGUtanNvbnJwYy9ub2RlKVxuLy8gd2hlbiB1cGdyYWRpbmcgdG8gdnNjb2RlLWpzb25ycGNAOS54LngtbmV4dC5YIHdoaWNoIHN1cHBvcnRzIHByb3BlciBleHBvcnQgbWFwc1xuaW1wb3J0IHsgdHlwZSBEYXRhQ2FsbGJhY2ssIEFic3RyYWN0TWVzc2FnZVJlYWRlciwgTWVzc2FnZVJlYWRlciB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcbmltcG9ydCB0eXBlIHsgSVdlYlNvY2tldCB9IGZyb20gJy4vc29ja2V0LmpzJztcblxuZXhwb3J0IGNsYXNzIFdlYlNvY2tldE1lc3NhZ2VSZWFkZXIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VSZWFkZXIgaW1wbGVtZW50cyBNZXNzYWdlUmVhZGVyIHtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgc29ja2V0OiBJV2ViU29ja2V0O1xuICAgIHByb3RlY3RlZCBzdGF0ZTogJ2luaXRpYWwnIHwgJ2xpc3RlbmluZycgfCAnY2xvc2VkJyA9ICdpbml0aWFsJztcbiAgICBwcm90ZWN0ZWQgY2FsbGJhY2s6IERhdGFDYWxsYmFjayB8IHVuZGVmaW5lZDtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHByb3RlY3RlZCByZWFkb25seSBldmVudHM6IEFycmF5PHsgbWVzc2FnZT86IGFueSwgZXJyb3I/OiBhbnkgfT4gPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKHNvY2tldDogSVdlYlNvY2tldCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnNvY2tldCA9IHNvY2tldDtcbiAgICAgICAgdGhpcy5zb2NrZXQub25NZXNzYWdlKG1lc3NhZ2UgPT5cbiAgICAgICAgICAgIHRoaXMucmVhZE1lc3NhZ2UobWVzc2FnZSlcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy5zb2NrZXQub25FcnJvcihlcnJvciA9PlxuICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc29ja2V0Lm9uQ2xvc2UoKGNvZGUsIHJlYXNvbikgPT4ge1xuICAgICAgICAgICAgaWYgKGNvZGUgIT09IDEwMDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvcjogRXJyb3IgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICcnICsgY29kZSxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYEVycm9yIGR1cmluZyBzb2NrZXQgcmVjb25uZWN0OiBjb2RlID0gJHtjb2RlfSwgcmVhc29uID0gJHtyZWFzb259YFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5maXJlQ2xvc2UoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgbGlzdGVuKGNhbGxiYWNrOiBEYXRhQ2FsbGJhY2spOiBEaXNwb3NhYmxlIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09ICdpbml0aWFsJykge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9ICdsaXN0ZW5pbmcnO1xuICAgICAgICAgICAgdGhpcy5jYWxsYmFjayA9IGNhbGxiYWNrO1xuICAgICAgICAgICAgd2hpbGUgKHRoaXMuZXZlbnRzLmxlbmd0aCAhPT0gMCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGV2ZW50ID0gdGhpcy5ldmVudHMucG9wKCkhO1xuICAgICAgICAgICAgICAgIGlmIChldmVudC5tZXNzYWdlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZWFkTWVzc2FnZShldmVudC5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGV2ZW50LmVycm9yICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXZlbnQuZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZUNsb3NlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkaXNwb3NlOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY2FsbGJhY2sgPT09IGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSAnaW5pdGlhbCc7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY2FsbGJhY2sgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIG92ZXJyaWRlIGRpc3Bvc2UoKSB7XG4gICAgICAgIHN1cGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgdGhpcy5zdGF0ZSA9ICdpbml0aWFsJztcbiAgICAgICAgdGhpcy5jYWxsYmFjayA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5ldmVudHMuc3BsaWNlKDAsIHRoaXMuZXZlbnRzLmxlbmd0aCk7XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBwcm90ZWN0ZWQgcmVhZE1lc3NhZ2UobWVzc2FnZTogYW55KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09PSAnaW5pdGlhbCcpIHtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRzLnNwbGljZSgwLCAwLCB7IG1lc3NhZ2UgfSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZSA9PT0gJ2xpc3RlbmluZycpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZGF0YSA9IEpTT04ucGFyc2UobWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjayEoZGF0YSk7XG4gICAgICAgICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvcjogRXJyb3IgPSB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICcnICsgNDAwLFxuICAgICAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiBgRXJyb3IgZHVyaW5nIG1lc3NhZ2UgcGFyc2luZywgcmVhc29uID0gJHt0eXBlb2YgZXJyID09PSAnb2JqZWN0JyA/IChlcnIgYXMgYW55KS5tZXNzYWdlIDogJ3Vua25vd24nfWBcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIGZpcmVFcnJvcihlcnJvcjogYW55KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09PSAnaW5pdGlhbCcpIHtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRzLnNwbGljZSgwLCAwLCB7IGVycm9yIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUgPT09ICdsaXN0ZW5pbmcnKSB7XG4gICAgICAgICAgICBzdXBlci5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIG92ZXJyaWRlIGZpcmVDbG9zZSgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc3RhdGUgPT09ICdpbml0aWFsJykge1xuICAgICAgICAgICAgdGhpcy5ldmVudHMuc3BsaWNlKDAsIDAsIHt9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlID09PSAnbGlzdGVuaW5nJykge1xuICAgICAgICAgICAgc3VwZXIuZmlyZUNsb3NlKCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zdGF0ZSA9ICdjbG9zZWQnO1xuICAgIH1cbn1cbiIsICIvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSAyMDI0IFR5cGVGb3ggYW5kIG90aGVycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExJQ0VOU0UgaW4gdGhlIHBhY2thZ2Ugcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5pbXBvcnQgeyBNZXNzYWdlIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuaW1wb3J0IHsgQWJzdHJhY3RNZXNzYWdlV3JpdGVyLCBNZXNzYWdlV3JpdGVyIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuaW1wb3J0IHR5cGUgeyBJV2ViU29ja2V0IH0gZnJvbSAnLi9zb2NrZXQuanMnO1xuXG5leHBvcnQgY2xhc3MgV2ViU29ja2V0TWVzc2FnZVdyaXRlciBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVdyaXRlciBpbXBsZW1lbnRzIE1lc3NhZ2VXcml0ZXIge1xuICAgIHByb3RlY3RlZCBlcnJvckNvdW50ID0gMDtcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgc29ja2V0OiBJV2ViU29ja2V0O1xuXG4gICAgY29uc3RydWN0b3Ioc29ja2V0OiBJV2ViU29ja2V0KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuc29ja2V0ID0gc29ja2V0O1xuICAgIH1cblxuICAgIGVuZCgpOiB2b2lkIHtcbiAgICB9XG5cbiAgICBhc3luYyB3cml0ZShtc2c6IE1lc3NhZ2UpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnQgPSBKU09OLnN0cmluZ2lmeShtc2cpO1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChjb250ZW50KTtcbiAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy5lcnJvckNvdW50Kys7XG4gICAgICAgICAgICB0aGlzLmZpcmVFcnJvcihlLCBtc2csIHRoaXMuZXJyb3JDb3VudCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4iLCAiLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgMjAyNCBUeXBlRm94IGFuZCBvdGhlcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMSUNFTlNFIGluIHRoZSBwYWNrYWdlIHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuaW1wb3J0IHR5cGUgeyBNZXNzYWdlQ29ubmVjdGlvbiwgTG9nZ2VyIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuaW1wb3J0IHsgY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24gfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG5pbXBvcnQgdHlwZSB7IElXZWJTb2NrZXQgfSBmcm9tICcuL3NvY2tldC5qcyc7XG5pbXBvcnQgeyBXZWJTb2NrZXRNZXNzYWdlUmVhZGVyIH0gZnJvbSAnLi9yZWFkZXIuanMnO1xuaW1wb3J0IHsgV2ViU29ja2V0TWVzc2FnZVdyaXRlciB9IGZyb20gJy4vd3JpdGVyLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGNyZWF0ZVdlYlNvY2tldENvbm5lY3Rpb24oc29ja2V0OiBJV2ViU29ja2V0LCBsb2dnZXI6IExvZ2dlcik6IE1lc3NhZ2VDb25uZWN0aW9uIHtcbiAgICBjb25zdCBtZXNzYWdlUmVhZGVyID0gbmV3IFdlYlNvY2tldE1lc3NhZ2VSZWFkZXIoc29ja2V0KTtcbiAgICBjb25zdCBtZXNzYWdlV3JpdGVyID0gbmV3IFdlYlNvY2tldE1lc3NhZ2VXcml0ZXIoc29ja2V0KTtcbiAgICBjb25zdCBjb25uZWN0aW9uID0gY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24obWVzc2FnZVJlYWRlciwgbWVzc2FnZVdyaXRlciwgbG9nZ2VyKTtcbiAgICBjb25uZWN0aW9uLm9uQ2xvc2UoKCkgPT4gY29ubmVjdGlvbi5kaXNwb3NlKCkpO1xuICAgIHJldHVybiBjb25uZWN0aW9uO1xufVxuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjQgVHlwZUZveCBhbmQgb3RoZXJzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTElDRU5TRSBpbiB0aGUgcGFja2FnZSByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbmltcG9ydCB0eXBlIHsgTWVzc2FnZUNvbm5lY3Rpb24sIExvZ2dlciB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcbmltcG9ydCB7IGNyZWF0ZVdlYlNvY2tldENvbm5lY3Rpb24gfSBmcm9tICcuL3NvY2tldC9jb25uZWN0aW9uLmpzJztcbmltcG9ydCB0eXBlIHsgSVdlYlNvY2tldCB9IGZyb20gJy4vc29ja2V0L3NvY2tldC5qcyc7XG5pbXBvcnQgeyBDb25zb2xlTG9nZ2VyIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuXG5leHBvcnQgZnVuY3Rpb24gbGlzdGVuKG9wdGlvbnM6IHtcbiAgICB3ZWJTb2NrZXQ6IFdlYlNvY2tldDtcbiAgICBsb2dnZXI/OiBMb2dnZXI7XG4gICAgb25Db25uZWN0aW9uOiAoY29ubmVjdGlvbjogTWVzc2FnZUNvbm5lY3Rpb24pID0+IHZvaWQ7XG59KSB7XG4gICAgY29uc3QgeyB3ZWJTb2NrZXQsIG9uQ29ubmVjdGlvbiB9ID0gb3B0aW9ucztcbiAgICBjb25zdCBsb2dnZXIgPSBvcHRpb25zLmxvZ2dlciB8fCBuZXcgQ29uc29sZUxvZ2dlcigpO1xuICAgIHdlYlNvY2tldC5vbm9wZW4gPSAoKSA9PiB7XG4gICAgICAgIGNvbnN0IHNvY2tldCA9IHRvU29ja2V0KHdlYlNvY2tldCk7XG4gICAgICAgIGNvbnN0IGNvbm5lY3Rpb24gPSBjcmVhdGVXZWJTb2NrZXRDb25uZWN0aW9uKHNvY2tldCwgbG9nZ2VyKTtcbiAgICAgICAgb25Db25uZWN0aW9uKGNvbm5lY3Rpb24pO1xuICAgIH07XG59XG5cbmV4cG9ydCBmdW5jdGlvbiB0b1NvY2tldCh3ZWJTb2NrZXQ6IFdlYlNvY2tldCk6IElXZWJTb2NrZXQge1xuICAgIHJldHVybiB7XG4gICAgICAgIHNlbmQ6IGNvbnRlbnQgPT4gd2ViU29ja2V0LnNlbmQoY29udGVudCksXG4gICAgICAgIG9uTWVzc2FnZTogY2IgPT4ge1xuICAgICAgICAgICAgd2ViU29ja2V0Lm9ubWVzc2FnZSA9IGV2ZW50ID0+IGNiKGV2ZW50LmRhdGEpO1xuICAgICAgICB9LFxuICAgICAgICBvbkVycm9yOiBjYiA9PiB7XG4gICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgICAgICAgICAgd2ViU29ja2V0Lm9uZXJyb3IgPSAoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChPYmplY3QuaGFzT3duKGV2ZW50LCAnbWVzc2FnZScpKSB7XG4gICAgICAgICAgICAgICAgICAgIGNiKGV2ZW50Lm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIG9uQ2xvc2U6IGNiID0+IHtcbiAgICAgICAgICAgIHdlYlNvY2tldC5vbmNsb3NlID0gZXZlbnQgPT4gY2IoZXZlbnQuY29kZSwgZXZlbnQucmVhc29uKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGlzcG9zZTogKCkgPT4gd2ViU29ja2V0LmNsb3NlKClcbiAgICB9O1xufVxuIiwgIi8qXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTAtMjAyNiBFY2xpcHNlIERpcmlnaWJsZSBjb250cmlidXRvcnNcbiAqXG4gKiBBbGwgcmlnaHRzIHJlc2VydmVkLiBUaGlzIHByb2dyYW0gYW5kIHRoZSBhY2NvbXBhbnlpbmcgbWF0ZXJpYWxzIGFyZSBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGVcbiAqIHRlcm1zIG9mIHRoZSBFY2xpcHNlIFB1YmxpYyBMaWNlbnNlIHYyLjAgd2hpY2ggYWNjb21wYW5pZXMgdGhpcyBkaXN0cmlidXRpb24sIGFuZCBpcyBhdmFpbGFibGUgYXRcbiAqIGh0dHA6Ly93d3cuZWNsaXBzZS5vcmcvbGVnYWwvZXBsLXYyMC5odG1sXG4gKlxuICogU1BEWC1GaWxlQ29weXJpZ2h0VGV4dDogRWNsaXBzZSBEaXJpZ2libGUgY29udHJpYnV0b3JzIFNQRFgtTGljZW5zZS1JZGVudGlmaWVyOiBFUEwtMi4wXG4gKi9cblxuLyoqXG4gKiBMYXp5IFByb3h5IHNoaW0gZm9yIE1vbmFjbyBFZGl0b3IgbG9hZGVkIHZpYSBBTUQuXG4gKlxuICogZWRpdG9yLmpzIHNldHMgZ2xvYmFsVGhpcy5tb25hY28gaW5zaWRlIHRoZSBBTUQgcmVxdWlyZSgpIGNhbGxiYWNrLCBiZWZvcmUgYW55XG4gKiBKYXZhTHNwQ2xpZW50TGliLmNvbm5lY3QoKSBjYWxsLiBBbGwgcHJvcGVydHkgYWNjZXNzZXMgZ28gdGhyb3VnaCBQcm94eS5nZXQoKSB0cmFwc1xuICogc28gdGhleSByZXNvbHZlIGFnYWluc3QgdGhlIGxpdmUgd2luZG93Lm1vbmFjbyBhdCBjYWxsIHRpbWUsIG5vdCBhdCBidW5kbGUgbG9hZCB0aW1lLlxuICpcbiAqIFR5cGVTY3JpcHQgcmVzb2x2ZXMgdHlwZXMgZnJvbSB0aGUgcmVhbCBtb25hY28tZWRpdG9yIGRldkRlcGVuZGVuY3k7IGVzYnVpbGQgcmVwbGFjZXNcbiAqIHRoZSBcIm1vbmFjby1lZGl0b3JcIiBpbXBvcnQgd2l0aCB0aGlzIGZpbGUgYXQgYnVuZGxlIHRpbWUgdmlhIHRoZSBhbGlhcyBvcHRpb24uXG4gKi9cblxudHlwZSBNID0gdHlwZW9mIGltcG9ydCgnbW9uYWNvLWVkaXRvcicpO1xuXG5mdW5jdGlvbiBtKCk6IE0ge1xuICAgIHJldHVybiAoZ2xvYmFsVGhpcyBhcyBhbnkpLm1vbmFjbyBhcyBNO1xufVxuXG5mdW5jdGlvbiBuczxUIGV4dGVuZHMgb2JqZWN0PihnZXR0ZXI6ICgpID0+IFQpOiBUIHtcbiAgICByZXR1cm4gbmV3IFByb3h5KHt9IGFzIFQsIHtcbiAgICAgICAgZ2V0OiAoXywgaykgPT4gKGdldHRlcigpIGFzIGFueSlbayBhcyBzdHJpbmddLFxuICAgIH0pO1xufVxuXG5mdW5jdGlvbiBjbHM8VD4oZ2V0dGVyOiAoKSA9PiBUKTogVCB7XG4gICAgcmV0dXJuIG5ldyBQcm94eShmdW5jdGlvbiAoKSB7fSBhcyBhbnksIHtcbiAgICAgICAgY29uc3RydWN0OiAoXywgYXJncykgPT4gbmV3IChnZXR0ZXIoKSBhcyBhbnkpKC4uLmFyZ3MpLFxuICAgICAgICBnZXQ6ICAgICAgIChfLCBrKSAgICA9PiAoZ2V0dGVyKCkgYXMgYW55KVtrIGFzIHN0cmluZ10sXG4gICAgfSkgYXMgVDtcbn1cblxuZXhwb3J0IGNvbnN0IGVkaXRvciAgICAgICAgID0gbnMoKCkgPT4gbSgpLmVkaXRvcik7XG5leHBvcnQgY29uc3QgbGFuZ3VhZ2VzICAgICAgPSBucygoKSA9PiBtKCkubGFuZ3VhZ2VzKTtcbmV4cG9ydCBjb25zdCBNYXJrZXJTZXZlcml0eSA9IG5zKCgpID0+IG0oKS5NYXJrZXJTZXZlcml0eSk7XG5leHBvcnQgY29uc3QgTWFya2VyVGFnICAgICAgPSBucygoKSA9PiAobSgpIGFzIGFueSkuTWFya2VyVGFnKTtcbmV4cG9ydCBjb25zdCBVcmkgICAgICAgICAgICA9IGNscygoKSA9PiBtKCkuVXJpKTtcbmV4cG9ydCBjb25zdCBSYW5nZSAgICAgICAgICA9IGNscygoKSA9PiBtKCkuUmFuZ2UpO1xuZXhwb3J0IGNvbnN0IFBvc2l0aW9uICAgICAgID0gY2xzKCgpID0+IG0oKS5Qb3NpdGlvbik7XG5leHBvcnQgY29uc3QgU2VsZWN0aW9uICAgICAgPSBjbHMoKCkgPT4gbSgpLlNlbGVjdGlvbik7XG5leHBvcnQgY29uc3QgS2V5Q29kZSAgICAgICAgPSBucygoKSA9PiBtKCkuS2V5Q29kZSk7XG5leHBvcnQgY29uc3QgS2V5TW9kICAgICAgICAgPSBucygoKSA9PiBtKCkuS2V5TW9kKTtcbiIsICIvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4ndXNlIHN0cmljdCc7XG5leHBvcnQgdmFyIERvY3VtZW50VXJpO1xuKGZ1bmN0aW9uIChEb2N1bWVudFVyaSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnO1xuICAgIH1cbiAgICBEb2N1bWVudFVyaS5pcyA9IGlzO1xufSkoRG9jdW1lbnRVcmkgfHwgKERvY3VtZW50VXJpID0ge30pKTtcbmV4cG9ydCB2YXIgVVJJO1xuKGZ1bmN0aW9uIChVUkkpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJztcbiAgICB9XG4gICAgVVJJLmlzID0gaXM7XG59KShVUkkgfHwgKFVSSSA9IHt9KSk7XG5leHBvcnQgdmFyIGludGVnZXI7XG4oZnVuY3Rpb24gKGludGVnZXIpIHtcbiAgICBpbnRlZ2VyLk1JTl9WQUxVRSA9IC0yMTQ3NDgzNjQ4O1xuICAgIGludGVnZXIuTUFYX1ZBTFVFID0gMjE0NzQ4MzY0NztcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiBpbnRlZ2VyLk1JTl9WQUxVRSA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSBpbnRlZ2VyLk1BWF9WQUxVRTtcbiAgICB9XG4gICAgaW50ZWdlci5pcyA9IGlzO1xufSkoaW50ZWdlciB8fCAoaW50ZWdlciA9IHt9KSk7XG5leHBvcnQgdmFyIHVpbnRlZ2VyO1xuKGZ1bmN0aW9uICh1aW50ZWdlcikge1xuICAgIHVpbnRlZ2VyLk1JTl9WQUxVRSA9IDA7XG4gICAgdWludGVnZXIuTUFYX1ZBTFVFID0gMjE0NzQ4MzY0NztcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyAmJiB1aW50ZWdlci5NSU5fVkFMVUUgPD0gdmFsdWUgJiYgdmFsdWUgPD0gdWludGVnZXIuTUFYX1ZBTFVFO1xuICAgIH1cbiAgICB1aW50ZWdlci5pcyA9IGlzO1xufSkodWludGVnZXIgfHwgKHVpbnRlZ2VyID0ge30pKTtcbi8qKlxuICogVGhlIFBvc2l0aW9uIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIFBvc2l0aW9ufSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBQb3NpdGlvbjtcbihmdW5jdGlvbiAoUG9zaXRpb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFBvc2l0aW9uIGxpdGVyYWwgZnJvbSB0aGUgZ2l2ZW4gbGluZSBhbmQgY2hhcmFjdGVyLlxuICAgICAqIEBwYXJhbSBsaW5lIFRoZSBwb3NpdGlvbidzIGxpbmUuXG4gICAgICogQHBhcmFtIGNoYXJhY3RlciBUaGUgcG9zaXRpb24ncyBjaGFyYWN0ZXIuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGxpbmUsIGNoYXJhY3Rlcikge1xuICAgICAgICBpZiAobGluZSA9PT0gTnVtYmVyLk1BWF9WQUxVRSkge1xuICAgICAgICAgICAgbGluZSA9IHVpbnRlZ2VyLk1BWF9WQUxVRTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhcmFjdGVyID09PSBOdW1iZXIuTUFYX1ZBTFVFKSB7XG4gICAgICAgICAgICBjaGFyYWN0ZXIgPSB1aW50ZWdlci5NQVhfVkFMVUU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHsgbGluZSwgY2hhcmFjdGVyIH07XG4gICAgfVxuICAgIFBvc2l0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIFBvc2l0aW9ufSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS5saW5lKSAmJiBJcy51aW50ZWdlcihjYW5kaWRhdGUuY2hhcmFjdGVyKTtcbiAgICB9XG4gICAgUG9zaXRpb24uaXMgPSBpcztcbn0pKFBvc2l0aW9uIHx8IChQb3NpdGlvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBSYW5nZSBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBSYW5nZX0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgUmFuZ2U7XG4oZnVuY3Rpb24gKFJhbmdlKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKG9uZSwgdHdvLCB0aHJlZSwgZm91cikge1xuICAgICAgICBpZiAoSXMudWludGVnZXIob25lKSAmJiBJcy51aW50ZWdlcih0d28pICYmIElzLnVpbnRlZ2VyKHRocmVlKSAmJiBJcy51aW50ZWdlcihmb3VyKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IFBvc2l0aW9uLmNyZWF0ZShvbmUsIHR3byksIGVuZDogUG9zaXRpb24uY3JlYXRlKHRocmVlLCBmb3VyKSB9O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKFBvc2l0aW9uLmlzKG9uZSkgJiYgUG9zaXRpb24uaXModHdvKSkge1xuICAgICAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IG9uZSwgZW5kOiB0d28gfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmFuZ2UjY3JlYXRlIGNhbGxlZCB3aXRoIGludmFsaWQgYXJndW1lbnRzWyR7b25lfSwgJHt0d299LCAke3RocmVlfSwgJHtmb3VyfV1gKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBSYW5nZS5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBSYW5nZX0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBQb3NpdGlvbi5pcyhjYW5kaWRhdGUuc3RhcnQpICYmIFBvc2l0aW9uLmlzKGNhbmRpZGF0ZS5lbmQpO1xuICAgIH1cbiAgICBSYW5nZS5pcyA9IGlzO1xufSkoUmFuZ2UgfHwgKFJhbmdlID0ge30pKTtcbi8qKlxuICogVGhlIExvY2F0aW9uIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIExvY2F0aW9ufSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBMb2NhdGlvbjtcbihmdW5jdGlvbiAoTG9jYXRpb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgTG9jYXRpb24gbGl0ZXJhbC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSBsb2NhdGlvbidzIHVyaS5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIGxvY2F0aW9uJ3MgcmFuZ2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHVyaSwgcmFuZ2UpIHtcbiAgICAgICAgcmV0dXJuIHsgdXJpLCByYW5nZSB9O1xuICAgIH1cbiAgICBMb2NhdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBMb2NhdGlvbn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIChJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSkgfHwgSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS51cmkpKTtcbiAgICB9XG4gICAgTG9jYXRpb24uaXMgPSBpcztcbn0pKExvY2F0aW9uIHx8IChMb2NhdGlvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBMb2NhdGlvbkxpbmsgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgTG9jYXRpb25MaW5rfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBMb2NhdGlvbkxpbms7XG4oZnVuY3Rpb24gKExvY2F0aW9uTGluaykge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBMb2NhdGlvbkxpbmsgbGl0ZXJhbC5cbiAgICAgKiBAcGFyYW0gdGFyZ2V0VXJpIFRoZSBkZWZpbml0aW9uJ3MgdXJpLlxuICAgICAqIEBwYXJhbSB0YXJnZXRSYW5nZSBUaGUgZnVsbCByYW5nZSBvZiB0aGUgZGVmaW5pdGlvbi5cbiAgICAgKiBAcGFyYW0gdGFyZ2V0U2VsZWN0aW9uUmFuZ2UgVGhlIHNwYW4gb2YgdGhlIHN5bWJvbCBkZWZpbml0aW9uIGF0IHRoZSB0YXJnZXQuXG4gICAgICogQHBhcmFtIG9yaWdpblNlbGVjdGlvblJhbmdlIFRoZSBzcGFuIG9mIHRoZSBzeW1ib2wgYmVpbmcgZGVmaW5lZCBpbiB0aGUgb3JpZ2luYXRpbmcgc291cmNlIGZpbGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHRhcmdldFVyaSwgdGFyZ2V0UmFuZ2UsIHRhcmdldFNlbGVjdGlvblJhbmdlLCBvcmlnaW5TZWxlY3Rpb25SYW5nZSkge1xuICAgICAgICByZXR1cm4geyB0YXJnZXRVcmksIHRhcmdldFJhbmdlLCB0YXJnZXRTZWxlY3Rpb25SYW5nZSwgb3JpZ2luU2VsZWN0aW9uUmFuZ2UgfTtcbiAgICB9XG4gICAgTG9jYXRpb25MaW5rLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIExvY2F0aW9uTGlua30gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUudGFyZ2V0UmFuZ2UpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudGFyZ2V0VXJpKVxuICAgICAgICAgICAgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnRhcmdldFNlbGVjdGlvblJhbmdlKVxuICAgICAgICAgICAgJiYgKFJhbmdlLmlzKGNhbmRpZGF0ZS5vcmlnaW5TZWxlY3Rpb25SYW5nZSkgfHwgSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5vcmlnaW5TZWxlY3Rpb25SYW5nZSkpO1xuICAgIH1cbiAgICBMb2NhdGlvbkxpbmsuaXMgPSBpcztcbn0pKExvY2F0aW9uTGluayB8fCAoTG9jYXRpb25MaW5rID0ge30pKTtcbi8qKlxuICogVGhlIENvbG9yIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIENvbG9yfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBDb2xvcjtcbihmdW5jdGlvbiAoQ29sb3IpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENvbG9yIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJlZCwgZ3JlZW4sIGJsdWUsIGFscGhhKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByZWQsXG4gICAgICAgICAgICBncmVlbixcbiAgICAgICAgICAgIGJsdWUsXG4gICAgICAgICAgICBhbHBoYSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgQ29sb3IuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgQ29sb3J9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBJcy5udW1iZXJSYW5nZShjYW5kaWRhdGUucmVkLCAwLCAxKVxuICAgICAgICAgICAgJiYgSXMubnVtYmVyUmFuZ2UoY2FuZGlkYXRlLmdyZWVuLCAwLCAxKVxuICAgICAgICAgICAgJiYgSXMubnVtYmVyUmFuZ2UoY2FuZGlkYXRlLmJsdWUsIDAsIDEpXG4gICAgICAgICAgICAmJiBJcy5udW1iZXJSYW5nZShjYW5kaWRhdGUuYWxwaGEsIDAsIDEpO1xuICAgIH1cbiAgICBDb2xvci5pcyA9IGlzO1xufSkoQ29sb3IgfHwgKENvbG9yID0ge30pKTtcbi8qKlxuICogVGhlIENvbG9ySW5mb3JtYXRpb24gbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgQ29sb3JJbmZvcm1hdGlvbn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgQ29sb3JJbmZvcm1hdGlvbjtcbihmdW5jdGlvbiAoQ29sb3JJbmZvcm1hdGlvbikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ29sb3JJbmZvcm1hdGlvbiBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgY29sb3IpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHJhbmdlLFxuICAgICAgICAgICAgY29sb3IsXG4gICAgICAgIH07XG4gICAgfVxuICAgIENvbG9ySW5mb3JtYXRpb24uY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgQ29sb3JJbmZvcm1hdGlvbn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgQ29sb3IuaXMoY2FuZGlkYXRlLmNvbG9yKTtcbiAgICB9XG4gICAgQ29sb3JJbmZvcm1hdGlvbi5pcyA9IGlzO1xufSkoQ29sb3JJbmZvcm1hdGlvbiB8fCAoQ29sb3JJbmZvcm1hdGlvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb2xvciBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBDb2xvclByZXNlbnRhdGlvbn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgQ29sb3JQcmVzZW50YXRpb247XG4oZnVuY3Rpb24gKENvbG9yUHJlc2VudGF0aW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDb2xvckluZm9ybWF0aW9uIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGxhYmVsLCB0ZXh0RWRpdCwgYWRkaXRpb25hbFRleHRFZGl0cykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbGFiZWwsXG4gICAgICAgICAgICB0ZXh0RWRpdCxcbiAgICAgICAgICAgIGFkZGl0aW9uYWxUZXh0RWRpdHMsXG4gICAgICAgIH07XG4gICAgfVxuICAgIENvbG9yUHJlc2VudGF0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIENvbG9ySW5mb3JtYXRpb259IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLmxhYmVsKVxuICAgICAgICAgICAgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUudGV4dEVkaXQpIHx8IFRleHRFZGl0LmlzKGNhbmRpZGF0ZSkpXG4gICAgICAgICAgICAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5hZGRpdGlvbmFsVGV4dEVkaXRzKSB8fCBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS5hZGRpdGlvbmFsVGV4dEVkaXRzLCBUZXh0RWRpdC5pcykpO1xuICAgIH1cbiAgICBDb2xvclByZXNlbnRhdGlvbi5pcyA9IGlzO1xufSkoQ29sb3JQcmVzZW50YXRpb24gfHwgKENvbG9yUHJlc2VudGF0aW9uID0ge30pKTtcbi8qKlxuICogQSBzZXQgb2YgcHJlZGVmaW5lZCByYW5nZSBraW5kcy5cbiAqL1xuZXhwb3J0IHZhciBGb2xkaW5nUmFuZ2VLaW5kO1xuKGZ1bmN0aW9uIChGb2xkaW5nUmFuZ2VLaW5kKSB7XG4gICAgLyoqXG4gICAgICogRm9sZGluZyByYW5nZSBmb3IgYSBjb21tZW50XG4gICAgICovXG4gICAgRm9sZGluZ1JhbmdlS2luZC5Db21tZW50ID0gJ2NvbW1lbnQnO1xuICAgIC8qKlxuICAgICAqIEZvbGRpbmcgcmFuZ2UgZm9yIGFuIGltcG9ydCBvciBpbmNsdWRlXG4gICAgICovXG4gICAgRm9sZGluZ1JhbmdlS2luZC5JbXBvcnRzID0gJ2ltcG9ydHMnO1xuICAgIC8qKlxuICAgICAqIEZvbGRpbmcgcmFuZ2UgZm9yIGEgcmVnaW9uIChlLmcuIGAjcmVnaW9uYClcbiAgICAgKi9cbiAgICBGb2xkaW5nUmFuZ2VLaW5kLlJlZ2lvbiA9ICdyZWdpb24nO1xufSkoRm9sZGluZ1JhbmdlS2luZCB8fCAoRm9sZGluZ1JhbmdlS2luZCA9IHt9KSk7XG4vKipcbiAqIFRoZSBmb2xkaW5nIHJhbmdlIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIEZvbGRpbmdSYW5nZX0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgRm9sZGluZ1JhbmdlO1xuKGZ1bmN0aW9uIChGb2xkaW5nUmFuZ2UpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IEZvbGRpbmdSYW5nZSBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShzdGFydExpbmUsIGVuZExpbmUsIHN0YXJ0Q2hhcmFjdGVyLCBlbmRDaGFyYWN0ZXIsIGtpbmQsIGNvbGxhcHNlZFRleHQpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgc3RhcnRMaW5lLFxuICAgICAgICAgICAgZW5kTGluZVxuICAgICAgICB9O1xuICAgICAgICBpZiAoSXMuZGVmaW5lZChzdGFydENoYXJhY3RlcikpIHtcbiAgICAgICAgICAgIHJlc3VsdC5zdGFydENoYXJhY3RlciA9IHN0YXJ0Q2hhcmFjdGVyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKGVuZENoYXJhY3RlcikpIHtcbiAgICAgICAgICAgIHJlc3VsdC5lbmRDaGFyYWN0ZXIgPSBlbmRDaGFyYWN0ZXI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzLmRlZmluZWQoa2luZCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5raW5kID0ga2luZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXMuZGVmaW5lZChjb2xsYXBzZWRUZXh0KSkge1xuICAgICAgICAgICAgcmVzdWx0LmNvbGxhcHNlZFRleHQgPSBjb2xsYXBzZWRUZXh0O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIEZvbGRpbmdSYW5nZS5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBGb2xkaW5nUmFuZ2V9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBJcy51aW50ZWdlcihjYW5kaWRhdGUuc3RhcnRMaW5lKSAmJiBJcy51aW50ZWdlcihjYW5kaWRhdGUuc3RhcnRMaW5lKVxuICAgICAgICAgICAgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUuc3RhcnRDaGFyYWN0ZXIpIHx8IElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS5zdGFydENoYXJhY3RlcikpXG4gICAgICAgICAgICAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5lbmRDaGFyYWN0ZXIpIHx8IElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS5lbmRDaGFyYWN0ZXIpKVxuICAgICAgICAgICAgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUua2luZCkgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS5raW5kKSk7XG4gICAgfVxuICAgIEZvbGRpbmdSYW5nZS5pcyA9IGlzO1xufSkoRm9sZGluZ1JhbmdlIHx8IChGb2xkaW5nUmFuZ2UgPSB7fSkpO1xuLyoqXG4gKiBUaGUgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbiBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9ufSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uO1xuKGZ1bmN0aW9uIChEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGxvY2F0aW9uLCBtZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsb2NhdGlvbixcbiAgICAgICAgICAgIG1lc3NhZ2VcbiAgICAgICAgfTtcbiAgICB9XG4gICAgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9ufSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIExvY2F0aW9uLmlzKGNhbmRpZGF0ZS5sb2NhdGlvbikgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5tZXNzYWdlKTtcbiAgICB9XG4gICAgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbi5pcyA9IGlzO1xufSkoRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbiB8fCAoRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBkaWFnbm9zdGljJ3Mgc2V2ZXJpdHkuXG4gKi9cbmV4cG9ydCB2YXIgRGlhZ25vc3RpY1NldmVyaXR5O1xuKGZ1bmN0aW9uIChEaWFnbm9zdGljU2V2ZXJpdHkpIHtcbiAgICAvKipcbiAgICAgKiBSZXBvcnRzIGFuIGVycm9yLlxuICAgICAqL1xuICAgIERpYWdub3N0aWNTZXZlcml0eS5FcnJvciA9IDE7XG4gICAgLyoqXG4gICAgICogUmVwb3J0cyBhIHdhcm5pbmcuXG4gICAgICovXG4gICAgRGlhZ25vc3RpY1NldmVyaXR5Lldhcm5pbmcgPSAyO1xuICAgIC8qKlxuICAgICAqIFJlcG9ydHMgYW4gaW5mb3JtYXRpb24uXG4gICAgICovXG4gICAgRGlhZ25vc3RpY1NldmVyaXR5LkluZm9ybWF0aW9uID0gMztcbiAgICAvKipcbiAgICAgKiBSZXBvcnRzIGEgaGludC5cbiAgICAgKi9cbiAgICBEaWFnbm9zdGljU2V2ZXJpdHkuSGludCA9IDQ7XG59KShEaWFnbm9zdGljU2V2ZXJpdHkgfHwgKERpYWdub3N0aWNTZXZlcml0eSA9IHt9KSk7XG4vKipcbiAqIFRoZSBkaWFnbm9zdGljIHRhZ3MuXG4gKlxuICogQHNpbmNlIDMuMTUuMFxuICovXG5leHBvcnQgdmFyIERpYWdub3N0aWNUYWc7XG4oZnVuY3Rpb24gKERpYWdub3N0aWNUYWcpIHtcbiAgICAvKipcbiAgICAgKiBVbnVzZWQgb3IgdW5uZWNlc3NhcnkgY29kZS5cbiAgICAgKlxuICAgICAqIENsaWVudHMgYXJlIGFsbG93ZWQgdG8gcmVuZGVyIGRpYWdub3N0aWNzIHdpdGggdGhpcyB0YWcgZmFkZWQgb3V0IGluc3RlYWQgb2YgaGF2aW5nXG4gICAgICogYW4gZXJyb3Igc3F1aWdnbGUuXG4gICAgICovXG4gICAgRGlhZ25vc3RpY1RhZy5Vbm5lY2Vzc2FyeSA9IDE7XG4gICAgLyoqXG4gICAgICogRGVwcmVjYXRlZCBvciBvYnNvbGV0ZSBjb2RlLlxuICAgICAqXG4gICAgICogQ2xpZW50cyBhcmUgYWxsb3dlZCB0byByZW5kZXJlZCBkaWFnbm9zdGljcyB3aXRoIHRoaXMgdGFnIHN0cmlrZSB0aHJvdWdoLlxuICAgICAqL1xuICAgIERpYWdub3N0aWNUYWcuRGVwcmVjYXRlZCA9IDI7XG59KShEaWFnbm9zdGljVGFnIHx8IChEaWFnbm9zdGljVGFnID0ge30pKTtcbi8qKlxuICogVGhlIENvZGVEZXNjcmlwdGlvbiBuYW1lc3BhY2UgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCBkZXNjcmlwdGlvbnMgZm9yIGRpYWdub3N0aWMgY29kZXMuXG4gKlxuICogQHNpbmNlIDMuMTYuMFxuICovXG5leHBvcnQgdmFyIENvZGVEZXNjcmlwdGlvbjtcbihmdW5jdGlvbiAoQ29kZURlc2NyaXB0aW9uKSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5ocmVmKTtcbiAgICB9XG4gICAgQ29kZURlc2NyaXB0aW9uLmlzID0gaXM7XG59KShDb2RlRGVzY3JpcHRpb24gfHwgKENvZGVEZXNjcmlwdGlvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBEaWFnbm9zdGljIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIERpYWdub3N0aWN9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIERpYWdub3N0aWM7XG4oZnVuY3Rpb24gKERpYWdub3N0aWMpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IERpYWdub3N0aWMgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIG1lc3NhZ2UsIHNldmVyaXR5LCBjb2RlLCBzb3VyY2UsIHJlbGF0ZWRJbmZvcm1hdGlvbikge1xuICAgICAgICBsZXQgcmVzdWx0ID0geyByYW5nZSwgbWVzc2FnZSB9O1xuICAgICAgICBpZiAoSXMuZGVmaW5lZChzZXZlcml0eSkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5zZXZlcml0eSA9IHNldmVyaXR5O1xuICAgICAgICB9XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKGNvZGUpKSB7XG4gICAgICAgICAgICByZXN1bHQuY29kZSA9IGNvZGU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzLmRlZmluZWQoc291cmNlKSkge1xuICAgICAgICAgICAgcmVzdWx0LnNvdXJjZSA9IHNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXMuZGVmaW5lZChyZWxhdGVkSW5mb3JtYXRpb24pKSB7XG4gICAgICAgICAgICByZXN1bHQucmVsYXRlZEluZm9ybWF0aW9uID0gcmVsYXRlZEluZm9ybWF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIERpYWdub3N0aWMuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgRGlhZ25vc3RpY30gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHZhciBfYTtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpXG4gICAgICAgICAgICAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpXG4gICAgICAgICAgICAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLm1lc3NhZ2UpXG4gICAgICAgICAgICAmJiAoSXMubnVtYmVyKGNhbmRpZGF0ZS5zZXZlcml0eSkgfHwgSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5zZXZlcml0eSkpXG4gICAgICAgICAgICAmJiAoSXMuaW50ZWdlcihjYW5kaWRhdGUuY29kZSkgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS5jb2RlKSB8fCBJcy51bmRlZmluZWQoY2FuZGlkYXRlLmNvZGUpKVxuICAgICAgICAgICAgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUuY29kZURlc2NyaXB0aW9uKSB8fCAoSXMuc3RyaW5nKChfYSA9IGNhbmRpZGF0ZS5jb2RlRGVzY3JpcHRpb24pID09PSBudWxsIHx8IF9hID09PSB2b2lkIDAgPyB2b2lkIDAgOiBfYS5ocmVmKSkpXG4gICAgICAgICAgICAmJiAoSXMuc3RyaW5nKGNhbmRpZGF0ZS5zb3VyY2UpIHx8IElzLnVuZGVmaW5lZChjYW5kaWRhdGUuc291cmNlKSlcbiAgICAgICAgICAgICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLnJlbGF0ZWRJbmZvcm1hdGlvbikgfHwgSXMudHlwZWRBcnJheShjYW5kaWRhdGUucmVsYXRlZEluZm9ybWF0aW9uLCBEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uLmlzKSk7XG4gICAgfVxuICAgIERpYWdub3N0aWMuaXMgPSBpcztcbn0pKERpYWdub3N0aWMgfHwgKERpYWdub3N0aWMgPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29tbWFuZCBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBDb21tYW5kfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBDb21tYW5kO1xuKGZ1bmN0aW9uIChDb21tYW5kKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDb21tYW5kIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHRpdGxlLCBjb21tYW5kLCAuLi5hcmdzKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IHRpdGxlLCBjb21tYW5kIH07XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKGFyZ3MpICYmIGFyZ3MubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmVzdWx0LmFyZ3VtZW50cyA9IGFyZ3M7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgQ29tbWFuZC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBDb21tYW5kfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudGl0bGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUuY29tbWFuZCk7XG4gICAgfVxuICAgIENvbW1hbmQuaXMgPSBpcztcbn0pKENvbW1hbmQgfHwgKENvbW1hbmQgPSB7fSkpO1xuLyoqXG4gKiBUaGUgVGV4dEVkaXQgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgcmVwbGFjZSxcbiAqIGluc2VydCBhbmQgZGVsZXRlIGVkaXRzIG1vcmUgZWFzaWx5LlxuICovXG5leHBvcnQgdmFyIFRleHRFZGl0O1xuKGZ1bmN0aW9uIChUZXh0RWRpdCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSByZXBsYWNlIHRleHQgZWRpdC5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlIG9mIHRleHQgdG8gYmUgcmVwbGFjZWQuXG4gICAgICogQHBhcmFtIG5ld1RleHQgVGhlIG5ldyB0ZXh0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlcGxhY2UocmFuZ2UsIG5ld1RleHQpIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIG5ld1RleHQgfTtcbiAgICB9XG4gICAgVGV4dEVkaXQucmVwbGFjZSA9IHJlcGxhY2U7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBpbnNlcnQgdGV4dCBlZGl0LlxuICAgICAqIEBwYXJhbSBwb3NpdGlvbiBUaGUgcG9zaXRpb24gdG8gaW5zZXJ0IHRoZSB0ZXh0IGF0LlxuICAgICAqIEBwYXJhbSBuZXdUZXh0IFRoZSB0ZXh0IHRvIGJlIGluc2VydGVkLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGluc2VydChwb3NpdGlvbiwgbmV3VGV4dCkge1xuICAgICAgICByZXR1cm4geyByYW5nZTogeyBzdGFydDogcG9zaXRpb24sIGVuZDogcG9zaXRpb24gfSwgbmV3VGV4dCB9O1xuICAgIH1cbiAgICBUZXh0RWRpdC5pbnNlcnQgPSBpbnNlcnQ7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIGRlbGV0ZSB0ZXh0IGVkaXQuXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSBvZiB0ZXh0IHRvIGJlIGRlbGV0ZWQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZGVsKHJhbmdlKSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCBuZXdUZXh0OiAnJyB9O1xuICAgIH1cbiAgICBUZXh0RWRpdC5kZWwgPSBkZWw7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSlcbiAgICAgICAgICAgICYmIElzLnN0cmluZyhjYW5kaWRhdGUubmV3VGV4dClcbiAgICAgICAgICAgICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSk7XG4gICAgfVxuICAgIFRleHRFZGl0LmlzID0gaXM7XG59KShUZXh0RWRpdCB8fCAoVGV4dEVkaXQgPSB7fSkpO1xuZXhwb3J0IHZhciBDaGFuZ2VBbm5vdGF0aW9uO1xuKGZ1bmN0aW9uIChDaGFuZ2VBbm5vdGF0aW9uKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKGxhYmVsLCBuZWVkc0NvbmZpcm1hdGlvbiwgZGVzY3JpcHRpb24pIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0geyBsYWJlbCB9O1xuICAgICAgICBpZiAobmVlZHNDb25maXJtYXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0Lm5lZWRzQ29uZmlybWF0aW9uID0gbmVlZHNDb25maXJtYXRpb247XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRlc2NyaXB0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIENoYW5nZUFubm90YXRpb24uY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUubGFiZWwpICYmXG4gICAgICAgICAgICAoSXMuYm9vbGVhbihjYW5kaWRhdGUubmVlZHNDb25maXJtYXRpb24pIHx8IGNhbmRpZGF0ZS5uZWVkc0NvbmZpcm1hdGlvbiA9PT0gdW5kZWZpbmVkKSAmJlxuICAgICAgICAgICAgKElzLnN0cmluZyhjYW5kaWRhdGUuZGVzY3JpcHRpb24pIHx8IGNhbmRpZGF0ZS5kZXNjcmlwdGlvbiA9PT0gdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgQ2hhbmdlQW5ub3RhdGlvbi5pcyA9IGlzO1xufSkoQ2hhbmdlQW5ub3RhdGlvbiB8fCAoQ2hhbmdlQW5ub3RhdGlvbiA9IHt9KSk7XG5leHBvcnQgdmFyIENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyO1xuKGZ1bmN0aW9uIChDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuc3RyaW5nKGNhbmRpZGF0ZSk7XG4gICAgfVxuICAgIENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzID0gaXM7XG59KShDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllciB8fCAoQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIgPSB7fSkpO1xuZXhwb3J0IHZhciBBbm5vdGF0ZWRUZXh0RWRpdDtcbihmdW5jdGlvbiAoQW5ub3RhdGVkVGV4dEVkaXQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFubm90YXRlZCByZXBsYWNlIHRleHQgZWRpdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2Ugb2YgdGV4dCB0byBiZSByZXBsYWNlZC5cbiAgICAgKiBAcGFyYW0gbmV3VGV4dCBUaGUgbmV3IHRleHQuXG4gICAgICogQHBhcmFtIGFubm90YXRpb24gVGhlIGFubm90YXRpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gcmVwbGFjZShyYW5nZSwgbmV3VGV4dCwgYW5ub3RhdGlvbikge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgbmV3VGV4dCwgYW5ub3RhdGlvbklkOiBhbm5vdGF0aW9uIH07XG4gICAgfVxuICAgIEFubm90YXRlZFRleHRFZGl0LnJlcGxhY2UgPSByZXBsYWNlO1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYW5ub3RhdGVkIGluc2VydCB0ZXh0IGVkaXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIHBvc2l0aW9uIHRvIGluc2VydCB0aGUgdGV4dCBhdC5cbiAgICAgKiBAcGFyYW0gbmV3VGV4dCBUaGUgdGV4dCB0byBiZSBpbnNlcnRlZC5cbiAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiBUaGUgYW5ub3RhdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbnNlcnQocG9zaXRpb24sIG5ld1RleHQsIGFubm90YXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2U6IHsgc3RhcnQ6IHBvc2l0aW9uLCBlbmQ6IHBvc2l0aW9uIH0sIG5ld1RleHQsIGFubm90YXRpb25JZDogYW5ub3RhdGlvbiB9O1xuICAgIH1cbiAgICBBbm5vdGF0ZWRUZXh0RWRpdC5pbnNlcnQgPSBpbnNlcnQ7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhbm5vdGF0ZWQgZGVsZXRlIHRleHQgZWRpdC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2Ugb2YgdGV4dCB0byBiZSBkZWxldGVkLlxuICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIFRoZSBhbm5vdGF0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRlbChyYW5nZSwgYW5ub3RhdGlvbikge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgbmV3VGV4dDogJycsIGFubm90YXRpb25JZDogYW5ub3RhdGlvbiB9O1xuICAgIH1cbiAgICBBbm5vdGF0ZWRUZXh0RWRpdC5kZWwgPSBkZWw7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBUZXh0RWRpdC5pcyhjYW5kaWRhdGUpICYmIChDaGFuZ2VBbm5vdGF0aW9uLmlzKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQpIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQpKTtcbiAgICB9XG4gICAgQW5ub3RhdGVkVGV4dEVkaXQuaXMgPSBpcztcbn0pKEFubm90YXRlZFRleHRFZGl0IHx8IChBbm5vdGF0ZWRUZXh0RWRpdCA9IHt9KSk7XG4vKipcbiAqIFRoZSBUZXh0RG9jdW1lbnRFZGl0IG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlXG4gKiBhbiBlZGl0IHRoYXQgbWFuaXB1bGF0ZXMgYSB0ZXh0IGRvY3VtZW50LlxuICovXG5leHBvcnQgdmFyIFRleHREb2N1bWVudEVkaXQ7XG4oZnVuY3Rpb24gKFRleHREb2N1bWVudEVkaXQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGBUZXh0RG9jdW1lbnRFZGl0YFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh0ZXh0RG9jdW1lbnQsIGVkaXRzKSB7XG4gICAgICAgIHJldHVybiB7IHRleHREb2N1bWVudCwgZWRpdHMgfTtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50RWRpdC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpXG4gICAgICAgICAgICAmJiBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIuaXMoY2FuZGlkYXRlLnRleHREb2N1bWVudClcbiAgICAgICAgICAgICYmIEFycmF5LmlzQXJyYXkoY2FuZGlkYXRlLmVkaXRzKTtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50RWRpdC5pcyA9IGlzO1xufSkoVGV4dERvY3VtZW50RWRpdCB8fCAoVGV4dERvY3VtZW50RWRpdCA9IHt9KSk7XG5leHBvcnQgdmFyIENyZWF0ZUZpbGU7XG4oZnVuY3Rpb24gKENyZWF0ZUZpbGUpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUodXJpLCBvcHRpb25zLCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7XG4gICAgICAgICAgICBraW5kOiAnY3JlYXRlJyxcbiAgICAgICAgICAgIHVyaVxuICAgICAgICB9O1xuICAgICAgICBpZiAob3B0aW9ucyAhPT0gdW5kZWZpbmVkICYmIChvcHRpb25zLm92ZXJ3cml0ZSAhPT0gdW5kZWZpbmVkIHx8IG9wdGlvbnMuaWdub3JlSWZFeGlzdHMgIT09IHVuZGVmaW5lZCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5vcHRpb25zID0gb3B0aW9ucztcbiAgICAgICAgfVxuICAgICAgICBpZiAoYW5ub3RhdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQuYW5ub3RhdGlvbklkID0gYW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBDcmVhdGVGaWxlLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgY2FuZGlkYXRlLmtpbmQgPT09ICdjcmVhdGUnICYmIElzLnN0cmluZyhjYW5kaWRhdGUudXJpKSAmJiAoY2FuZGlkYXRlLm9wdGlvbnMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgKChjYW5kaWRhdGUub3B0aW9ucy5vdmVyd3JpdGUgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5vcHRpb25zLm92ZXJ3cml0ZSkpICYmIChjYW5kaWRhdGUub3B0aW9ucy5pZ25vcmVJZkV4aXN0cyA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLm9wdGlvbnMuaWdub3JlSWZFeGlzdHMpKSkpICYmIChjYW5kaWRhdGUuYW5ub3RhdGlvbklkID09PSB1bmRlZmluZWQgfHwgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoY2FuZGlkYXRlLmFubm90YXRpb25JZCkpO1xuICAgIH1cbiAgICBDcmVhdGVGaWxlLmlzID0gaXM7XG59KShDcmVhdGVGaWxlIHx8IChDcmVhdGVGaWxlID0ge30pKTtcbmV4cG9ydCB2YXIgUmVuYW1lRmlsZTtcbihmdW5jdGlvbiAoUmVuYW1lRmlsZSkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShvbGRVcmksIG5ld1VyaSwgb3B0aW9ucywgYW5ub3RhdGlvbikge1xuICAgICAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgICAgICAga2luZDogJ3JlbmFtZScsXG4gICAgICAgICAgICBvbGRVcmksXG4gICAgICAgICAgICBuZXdVcmlcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKG9wdGlvbnMgIT09IHVuZGVmaW5lZCAmJiAob3B0aW9ucy5vdmVyd3JpdGUgIT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLmlnbm9yZUlmRXhpc3RzICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICByZXN1bHQub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFubm90YXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmFubm90YXRpb25JZCA9IGFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgUmVuYW1lRmlsZS5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIGNhbmRpZGF0ZS5raW5kID09PSAncmVuYW1lJyAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLm9sZFVyaSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5uZXdVcmkpICYmIChjYW5kaWRhdGUub3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAoKGNhbmRpZGF0ZS5vcHRpb25zLm92ZXJ3cml0ZSA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLm9wdGlvbnMub3ZlcndyaXRlKSkgJiYgKGNhbmRpZGF0ZS5vcHRpb25zLmlnbm9yZUlmRXhpc3RzID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUub3B0aW9ucy5pZ25vcmVJZkV4aXN0cykpKSkgJiYgKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQgPT09IHVuZGVmaW5lZCB8fCBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhjYW5kaWRhdGUuYW5ub3RhdGlvbklkKSk7XG4gICAgfVxuICAgIFJlbmFtZUZpbGUuaXMgPSBpcztcbn0pKFJlbmFtZUZpbGUgfHwgKFJlbmFtZUZpbGUgPSB7fSkpO1xuZXhwb3J0IHZhciBEZWxldGVGaWxlO1xuKGZ1bmN0aW9uIChEZWxldGVGaWxlKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKHVyaSwgb3B0aW9ucywgYW5ub3RhdGlvbikge1xuICAgICAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgICAgICAga2luZDogJ2RlbGV0ZScsXG4gICAgICAgICAgICB1cmlcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKG9wdGlvbnMgIT09IHVuZGVmaW5lZCAmJiAob3B0aW9ucy5yZWN1cnNpdmUgIT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLmlnbm9yZUlmTm90RXhpc3RzICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICByZXN1bHQub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFubm90YXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmFubm90YXRpb25JZCA9IGFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgRGVsZXRlRmlsZS5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIGNhbmRpZGF0ZS5raW5kID09PSAnZGVsZXRlJyAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSkgJiYgKGNhbmRpZGF0ZS5vcHRpb25zID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICgoY2FuZGlkYXRlLm9wdGlvbnMucmVjdXJzaXZlID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUub3B0aW9ucy5yZWN1cnNpdmUpKSAmJiAoY2FuZGlkYXRlLm9wdGlvbnMuaWdub3JlSWZOb3RFeGlzdHMgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5vcHRpb25zLmlnbm9yZUlmTm90RXhpc3RzKSkpKSAmJiAoY2FuZGlkYXRlLmFubm90YXRpb25JZCA9PT0gdW5kZWZpbmVkIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQpKTtcbiAgICB9XG4gICAgRGVsZXRlRmlsZS5pcyA9IGlzO1xufSkoRGVsZXRlRmlsZSB8fCAoRGVsZXRlRmlsZSA9IHt9KSk7XG5leHBvcnQgdmFyIFdvcmtzcGFjZUVkaXQ7XG4oZnVuY3Rpb24gKFdvcmtzcGFjZUVkaXQpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuY2hhbmdlcyAhPT0gdW5kZWZpbmVkIHx8IGNhbmRpZGF0ZS5kb2N1bWVudENoYW5nZXMgIT09IHVuZGVmaW5lZCkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuZG9jdW1lbnRDaGFuZ2VzID09PSB1bmRlZmluZWQgfHwgY2FuZGlkYXRlLmRvY3VtZW50Q2hhbmdlcy5ldmVyeSgoY2hhbmdlKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKElzLnN0cmluZyhjaGFuZ2Uua2luZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENyZWF0ZUZpbGUuaXMoY2hhbmdlKSB8fCBSZW5hbWVGaWxlLmlzKGNoYW5nZSkgfHwgRGVsZXRlRmlsZS5pcyhjaGFuZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFRleHREb2N1bWVudEVkaXQuaXMoY2hhbmdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KSk7XG4gICAgfVxuICAgIFdvcmtzcGFjZUVkaXQuaXMgPSBpcztcbn0pKFdvcmtzcGFjZUVkaXQgfHwgKFdvcmtzcGFjZUVkaXQgPSB7fSkpO1xuY2xhc3MgVGV4dEVkaXRDaGFuZ2VJbXBsIHtcbiAgICBjb25zdHJ1Y3RvcihlZGl0cywgY2hhbmdlQW5ub3RhdGlvbnMpIHtcbiAgICAgICAgdGhpcy5lZGl0cyA9IGVkaXRzO1xuICAgICAgICB0aGlzLmNoYW5nZUFubm90YXRpb25zID0gY2hhbmdlQW5ub3RhdGlvbnM7XG4gICAgfVxuICAgIGluc2VydChwb3NpdGlvbiwgbmV3VGV4dCwgYW5ub3RhdGlvbikge1xuICAgICAgICBsZXQgZWRpdDtcbiAgICAgICAgbGV0IGlkO1xuICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBlZGl0ID0gVGV4dEVkaXQuaW5zZXJ0KHBvc2l0aW9uLCBuZXdUZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhhbm5vdGF0aW9uKSkge1xuICAgICAgICAgICAgaWQgPSBhbm5vdGF0aW9uO1xuICAgICAgICAgICAgZWRpdCA9IEFubm90YXRlZFRleHRFZGl0Lmluc2VydChwb3NpdGlvbiwgbmV3VGV4dCwgYW5ub3RhdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFzc2VydENoYW5nZUFubm90YXRpb25zKHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgaWQgPSB0aGlzLmNoYW5nZUFubm90YXRpb25zLm1hbmFnZShhbm5vdGF0aW9uKTtcbiAgICAgICAgICAgIGVkaXQgPSBBbm5vdGF0ZWRUZXh0RWRpdC5pbnNlcnQocG9zaXRpb24sIG5ld1RleHQsIGlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVkaXRzLnB1c2goZWRpdCk7XG4gICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmVwbGFjZShyYW5nZSwgbmV3VGV4dCwgYW5ub3RhdGlvbikge1xuICAgICAgICBsZXQgZWRpdDtcbiAgICAgICAgbGV0IGlkO1xuICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBlZGl0ID0gVGV4dEVkaXQucmVwbGFjZShyYW5nZSwgbmV3VGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoYW5ub3RhdGlvbikpIHtcbiAgICAgICAgICAgIGlkID0gYW5ub3RhdGlvbjtcbiAgICAgICAgICAgIGVkaXQgPSBBbm5vdGF0ZWRUZXh0RWRpdC5yZXBsYWNlKHJhbmdlLCBuZXdUZXh0LCBhbm5vdGF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYXNzZXJ0Q2hhbmdlQW5ub3RhdGlvbnModGhpcy5jaGFuZ2VBbm5vdGF0aW9ucyk7XG4gICAgICAgICAgICBpZCA9IHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMubWFuYWdlKGFubm90YXRpb24pO1xuICAgICAgICAgICAgZWRpdCA9IEFubm90YXRlZFRleHRFZGl0LnJlcGxhY2UocmFuZ2UsIG5ld1RleHQsIGlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVkaXRzLnB1c2goZWRpdCk7XG4gICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVsZXRlKHJhbmdlLCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIGxldCBlZGl0O1xuICAgICAgICBsZXQgaWQ7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGVkaXQgPSBUZXh0RWRpdC5kZWwocmFuZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGFubm90YXRpb24pKSB7XG4gICAgICAgICAgICBpZCA9IGFubm90YXRpb247XG4gICAgICAgICAgICBlZGl0ID0gQW5ub3RhdGVkVGV4dEVkaXQuZGVsKHJhbmdlLCBhbm5vdGF0aW9uKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYXNzZXJ0Q2hhbmdlQW5ub3RhdGlvbnModGhpcy5jaGFuZ2VBbm5vdGF0aW9ucyk7XG4gICAgICAgICAgICBpZCA9IHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMubWFuYWdlKGFubm90YXRpb24pO1xuICAgICAgICAgICAgZWRpdCA9IEFubm90YXRlZFRleHRFZGl0LmRlbChyYW5nZSwgaWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZWRpdHMucHVzaChlZGl0KTtcbiAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBhZGQoZWRpdCkge1xuICAgICAgICB0aGlzLmVkaXRzLnB1c2goZWRpdCk7XG4gICAgfVxuICAgIGFsbCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZWRpdHM7XG4gICAgfVxuICAgIGNsZWFyKCkge1xuICAgICAgICB0aGlzLmVkaXRzLnNwbGljZSgwLCB0aGlzLmVkaXRzLmxlbmd0aCk7XG4gICAgfVxuICAgIGFzc2VydENoYW5nZUFubm90YXRpb25zKHZhbHVlKSB7XG4gICAgICAgIGlmICh2YWx1ZSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRleHQgZWRpdCBjaGFuZ2UgaXMgbm90IGNvbmZpZ3VyZWQgdG8gbWFuYWdlIGNoYW5nZSBhbm5vdGF0aW9ucy5gKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogQSBoZWxwZXIgY2xhc3NcbiAqL1xuY2xhc3MgQ2hhbmdlQW5ub3RhdGlvbnMge1xuICAgIGNvbnN0cnVjdG9yKGFubm90YXRpb25zKSB7XG4gICAgICAgIHRoaXMuX2Fubm90YXRpb25zID0gYW5ub3RhdGlvbnMgPT09IHVuZGVmaW5lZCA/IE9iamVjdC5jcmVhdGUobnVsbCkgOiBhbm5vdGF0aW9ucztcbiAgICAgICAgdGhpcy5fY291bnRlciA9IDA7XG4gICAgICAgIHRoaXMuX3NpemUgPSAwO1xuICAgIH1cbiAgICBhbGwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9hbm5vdGF0aW9ucztcbiAgICB9XG4gICAgZ2V0IHNpemUoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9zaXplO1xuICAgIH1cbiAgICBtYW5hZ2UoaWRPckFubm90YXRpb24sIGFubm90YXRpb24pIHtcbiAgICAgICAgbGV0IGlkO1xuICAgICAgICBpZiAoQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoaWRPckFubm90YXRpb24pKSB7XG4gICAgICAgICAgICBpZCA9IGlkT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWQgPSB0aGlzLm5leHRJZCgpO1xuICAgICAgICAgICAgYW5ub3RhdGlvbiA9IGlkT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9hbm5vdGF0aW9uc1tpZF0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJZCAke2lkfSBpcyBhbHJlYWR5IGluIHVzZS5gKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIGFubm90YXRpb24gcHJvdmlkZWQgZm9yIGlkICR7aWR9YCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fYW5ub3RhdGlvbnNbaWRdID0gYW5ub3RhdGlvbjtcbiAgICAgICAgdGhpcy5fc2l6ZSsrO1xuICAgICAgICByZXR1cm4gaWQ7XG4gICAgfVxuICAgIG5leHRJZCgpIHtcbiAgICAgICAgdGhpcy5fY291bnRlcisrO1xuICAgICAgICByZXR1cm4gdGhpcy5fY291bnRlci50b1N0cmluZygpO1xuICAgIH1cbn1cbi8qKlxuICogQSB3b3Jrc3BhY2UgY2hhbmdlIGhlbHBzIGNvbnN0cnVjdGluZyBjaGFuZ2VzIHRvIGEgd29ya3NwYWNlLlxuICovXG5leHBvcnQgY2xhc3MgV29ya3NwYWNlQ2hhbmdlIHtcbiAgICBjb25zdHJ1Y3Rvcih3b3Jrc3BhY2VFZGl0KSB7XG4gICAgICAgIHRoaXMuX3RleHRFZGl0Q2hhbmdlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIGlmICh3b3Jrc3BhY2VFZGl0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQgPSB3b3Jrc3BhY2VFZGl0O1xuICAgICAgICAgICAgaWYgKHdvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMgPSBuZXcgQ2hhbmdlQW5ub3RhdGlvbnMod29ya3NwYWNlRWRpdC5jaGFuZ2VBbm5vdGF0aW9ucyk7XG4gICAgICAgICAgICAgICAgd29ya3NwYWNlRWRpdC5jaGFuZ2VBbm5vdGF0aW9ucyA9IHRoaXMuX2NoYW5nZUFubm90YXRpb25zLmFsbCgpO1xuICAgICAgICAgICAgICAgIHdvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzLmZvckVhY2goKGNoYW5nZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoVGV4dERvY3VtZW50RWRpdC5pcyhjaGFuZ2UpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0RWRpdENoYW5nZSA9IG5ldyBUZXh0RWRpdENoYW5nZUltcGwoY2hhbmdlLmVkaXRzLCB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXh0RWRpdENoYW5nZXNbY2hhbmdlLnRleHREb2N1bWVudC51cmldID0gdGV4dEVkaXRDaGFuZ2U7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHdvcmtzcGFjZUVkaXQuY2hhbmdlcykge1xuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHdvcmtzcGFjZUVkaXQuY2hhbmdlcykuZm9yRWFjaCgoa2V5KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHRleHRFZGl0Q2hhbmdlID0gbmV3IFRleHRFZGl0Q2hhbmdlSW1wbCh3b3Jrc3BhY2VFZGl0LmNoYW5nZXNba2V5XSk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3RleHRFZGl0Q2hhbmdlc1trZXldID0gdGV4dEVkaXRDaGFuZ2U7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0ID0ge307XG4gICAgICAgIH1cbiAgICB9XG4gICAgLyoqXG4gICAgICogUmV0dXJucyB0aGUgdW5kZXJseWluZyB7QGxpbmsgV29ya3NwYWNlRWRpdH0gbGl0ZXJhbFxuICAgICAqIHVzZSB0byBiZSByZXR1cm5lZCBmcm9tIGEgd29ya3NwYWNlIGVkaXQgb3BlcmF0aW9uIGxpa2UgcmVuYW1lLlxuICAgICAqL1xuICAgIGdldCBlZGl0KCkge1xuICAgICAgICB0aGlzLmluaXREb2N1bWVudENoYW5nZXMoKTtcbiAgICAgICAgaWYgKHRoaXMuX2NoYW5nZUFubm90YXRpb25zICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5zaXplID09PSAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VBbm5vdGF0aW9ucyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlQW5ub3RhdGlvbnMgPSB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5hbGwoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fd29ya3NwYWNlRWRpdDtcbiAgICB9XG4gICAgZ2V0VGV4dEVkaXRDaGFuZ2Uoa2V5KSB7XG4gICAgICAgIGlmIChPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIuaXMoa2V5KSkge1xuICAgICAgICAgICAgdGhpcy5pbml0RG9jdW1lbnRDaGFuZ2VzKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV29ya3NwYWNlIGVkaXQgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIGRvY3VtZW50IGNoYW5nZXMuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCB0ZXh0RG9jdW1lbnQgPSB7IHVyaToga2V5LnVyaSwgdmVyc2lvbjoga2V5LnZlcnNpb24gfTtcbiAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLl90ZXh0RWRpdENoYW5nZXNbdGV4dERvY3VtZW50LnVyaV07XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGVkaXRzID0gW107XG4gICAgICAgICAgICAgICAgY29uc3QgdGV4dERvY3VtZW50RWRpdCA9IHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dERvY3VtZW50LFxuICAgICAgICAgICAgICAgICAgICBlZGl0c1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMucHVzaCh0ZXh0RG9jdW1lbnRFZGl0KTtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgVGV4dEVkaXRDaGFuZ2VJbXBsKGVkaXRzLCB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGV4dEVkaXRDaGFuZ2VzW3RleHREb2N1bWVudC51cmldID0gcmVzdWx0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdENoYW5nZXMoKTtcbiAgICAgICAgICAgIGlmICh0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV29ya3NwYWNlIGVkaXQgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIG5vcm1hbCB0ZXh0IGVkaXQgY2hhbmdlcy4nKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCByZXN1bHQgPSB0aGlzLl90ZXh0RWRpdENoYW5nZXNba2V5XTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSB7XG4gICAgICAgICAgICAgICAgbGV0IGVkaXRzID0gW107XG4gICAgICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VzW2tleV0gPSBlZGl0cztcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXcgVGV4dEVkaXRDaGFuZ2VJbXBsKGVkaXRzKTtcbiAgICAgICAgICAgICAgICB0aGlzLl90ZXh0RWRpdENoYW5nZXNba2V5XSA9IHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgaW5pdERvY3VtZW50Q2hhbmdlcygpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzID09PSB1bmRlZmluZWQgJiYgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX2NoYW5nZUFubm90YXRpb25zID0gbmV3IENoYW5nZUFubm90YXRpb25zKCk7XG4gICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VBbm5vdGF0aW9ucyA9IHRoaXMuX2NoYW5nZUFubm90YXRpb25zLmFsbCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGluaXRDaGFuZ2VzKCkge1xuICAgICAgICBpZiAodGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMgPT09IHVuZGVmaW5lZCAmJiB0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VzID0gT2JqZWN0LmNyZWF0ZShudWxsKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBjcmVhdGVGaWxlKHVyaSwgb3B0aW9uc09yQW5ub3RhdGlvbiwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLmluaXREb2N1bWVudENoYW5nZXMoKTtcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignV29ya3NwYWNlIGVkaXQgaXMgbm90IGNvbmZpZ3VyZWQgZm9yIGRvY3VtZW50IGNoYW5nZXMuJyk7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGFubm90YXRpb247XG4gICAgICAgIGlmIChDaGFuZ2VBbm5vdGF0aW9uLmlzKG9wdGlvbnNPckFubm90YXRpb24pIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKG9wdGlvbnNPckFubm90YXRpb24pKSB7XG4gICAgICAgICAgICBhbm5vdGF0aW9uID0gb3B0aW9uc09yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGxldCBvcGVyYXRpb247XG4gICAgICAgIGxldCBpZDtcbiAgICAgICAgaWYgKGFubm90YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgb3BlcmF0aW9uID0gQ3JlYXRlRmlsZS5jcmVhdGUodXJpLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlkID0gQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoYW5ub3RhdGlvbikgPyBhbm5vdGF0aW9uIDogdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMubWFuYWdlKGFubm90YXRpb24pO1xuICAgICAgICAgICAgb3BlcmF0aW9uID0gQ3JlYXRlRmlsZS5jcmVhdGUodXJpLCBvcHRpb25zLCBpZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMucHVzaChvcGVyYXRpb24pO1xuICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlbmFtZUZpbGUob2xkVXJpLCBuZXdVcmksIG9wdGlvbnNPckFubm90YXRpb24sIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5pbml0RG9jdW1lbnRDaGFuZ2VzKCk7XG4gICAgICAgIGlmICh0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dvcmtzcGFjZSBlZGl0IGlzIG5vdCBjb25maWd1cmVkIGZvciBkb2N1bWVudCBjaGFuZ2VzLicpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhbm5vdGF0aW9uO1xuICAgICAgICBpZiAoQ2hhbmdlQW5ub3RhdGlvbi5pcyhvcHRpb25zT3JBbm5vdGF0aW9uKSB8fCBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhvcHRpb25zT3JBbm5vdGF0aW9uKSkge1xuICAgICAgICAgICAgYW5ub3RhdGlvbiA9IG9wdGlvbnNPckFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvcHRpb25zID0gb3B0aW9uc09yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb3BlcmF0aW9uO1xuICAgICAgICBsZXQgaWQ7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wZXJhdGlvbiA9IFJlbmFtZUZpbGUuY3JlYXRlKG9sZFVyaSwgbmV3VXJpLCBvcHRpb25zKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlkID0gQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoYW5ub3RhdGlvbikgPyBhbm5vdGF0aW9uIDogdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMubWFuYWdlKGFubm90YXRpb24pO1xuICAgICAgICAgICAgb3BlcmF0aW9uID0gUmVuYW1lRmlsZS5jcmVhdGUob2xkVXJpLCBuZXdVcmksIG9wdGlvbnMsIGlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcy5wdXNoKG9wZXJhdGlvbik7XG4gICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZGVsZXRlRmlsZSh1cmksIG9wdGlvbnNPckFubm90YXRpb24sIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5pbml0RG9jdW1lbnRDaGFuZ2VzKCk7XG4gICAgICAgIGlmICh0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dvcmtzcGFjZSBlZGl0IGlzIG5vdCBjb25maWd1cmVkIGZvciBkb2N1bWVudCBjaGFuZ2VzLicpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhbm5vdGF0aW9uO1xuICAgICAgICBpZiAoQ2hhbmdlQW5ub3RhdGlvbi5pcyhvcHRpb25zT3JBbm5vdGF0aW9uKSB8fCBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhvcHRpb25zT3JBbm5vdGF0aW9uKSkge1xuICAgICAgICAgICAgYW5ub3RhdGlvbiA9IG9wdGlvbnNPckFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvcHRpb25zID0gb3B0aW9uc09yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb3BlcmF0aW9uO1xuICAgICAgICBsZXQgaWQ7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wZXJhdGlvbiA9IERlbGV0ZUZpbGUuY3JlYXRlKHVyaSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZCA9IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGFubm90YXRpb24pID8gYW5ub3RhdGlvbiA6IHRoaXMuX2NoYW5nZUFubm90YXRpb25zLm1hbmFnZShhbm5vdGF0aW9uKTtcbiAgICAgICAgICAgIG9wZXJhdGlvbiA9IERlbGV0ZUZpbGUuY3JlYXRlKHVyaSwgb3B0aW9ucywgaWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzLnB1c2gob3BlcmF0aW9uKTtcbiAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgfVxuICAgIH1cbn1cbi8qKlxuICogVGhlIFRleHREb2N1bWVudElkZW50aWZpZXIgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgVGV4dERvY3VtZW50SWRlbnRpZmllcn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgVGV4dERvY3VtZW50SWRlbnRpZmllcjtcbihmdW5jdGlvbiAoVGV4dERvY3VtZW50SWRlbnRpZmllcikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgVGV4dERvY3VtZW50SWRlbnRpZmllciBsaXRlcmFsLlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIGRvY3VtZW50J3MgdXJpLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmkpIHtcbiAgICAgICAgcmV0dXJuIHsgdXJpIH07XG4gICAgfVxuICAgIFRleHREb2N1bWVudElkZW50aWZpZXIuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgVGV4dERvY3VtZW50SWRlbnRpZmllcn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSk7XG4gICAgfVxuICAgIFRleHREb2N1bWVudElkZW50aWZpZXIuaXMgPSBpcztcbn0pKFRleHREb2N1bWVudElkZW50aWZpZXIgfHwgKFRleHREb2N1bWVudElkZW50aWZpZXIgPSB7fSkpO1xuLyoqXG4gKiBUaGUgVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyO1xuKGZ1bmN0aW9uIChWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIGxpdGVyYWwuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgZG9jdW1lbnQncyB1cmkuXG4gICAgICogQHBhcmFtIHZlcnNpb24gVGhlIGRvY3VtZW50J3MgdmVyc2lvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodXJpLCB2ZXJzaW9uKSB7XG4gICAgICAgIHJldHVybiB7IHVyaSwgdmVyc2lvbiB9O1xuICAgIH1cbiAgICBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXJ9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpICYmIElzLmludGVnZXIoY2FuZGlkYXRlLnZlcnNpb24pO1xuICAgIH1cbiAgICBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmlzID0gaXM7XG59KShWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIHx8IChWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyID0ge30pKTtcbi8qKlxuICogVGhlIE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXJ9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcjtcbihmdW5jdGlvbiAoT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIgbGl0ZXJhbC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSBkb2N1bWVudCdzIHVyaS5cbiAgICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgZG9jdW1lbnQncyB2ZXJzaW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmksIHZlcnNpb24pIHtcbiAgICAgICAgcmV0dXJuIHsgdXJpLCB2ZXJzaW9uIH07XG4gICAgfVxuICAgIE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllci5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXJ9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpICYmIChjYW5kaWRhdGUudmVyc2lvbiA9PT0gbnVsbCB8fCBJcy5pbnRlZ2VyKGNhbmRpZGF0ZS52ZXJzaW9uKSk7XG4gICAgfVxuICAgIE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllci5pcyA9IGlzO1xufSkoT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIHx8IChPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIgPSB7fSkpO1xuLyoqXG4gKiBUaGUgVGV4dERvY3VtZW50SXRlbSBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBUZXh0RG9jdW1lbnRJdGVtfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBUZXh0RG9jdW1lbnRJdGVtO1xuKGZ1bmN0aW9uIChUZXh0RG9jdW1lbnRJdGVtKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBUZXh0RG9jdW1lbnRJdGVtIGxpdGVyYWwuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgZG9jdW1lbnQncyB1cmkuXG4gICAgICogQHBhcmFtIGxhbmd1YWdlSWQgVGhlIGRvY3VtZW50J3MgbGFuZ3VhZ2UgaWRlbnRpZmllci5cbiAgICAgKiBAcGFyYW0gdmVyc2lvbiBUaGUgZG9jdW1lbnQncyB2ZXJzaW9uIG51bWJlci5cbiAgICAgKiBAcGFyYW0gdGV4dCBUaGUgZG9jdW1lbnQncyB0ZXh0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmksIGxhbmd1YWdlSWQsIHZlcnNpb24sIHRleHQpIHtcbiAgICAgICAgcmV0dXJuIHsgdXJpLCBsYW5ndWFnZUlkLCB2ZXJzaW9uLCB0ZXh0IH07XG4gICAgfVxuICAgIFRleHREb2N1bWVudEl0ZW0uY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgVGV4dERvY3VtZW50SXRlbX0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5sYW5ndWFnZUlkKSAmJiBJcy5pbnRlZ2VyKGNhbmRpZGF0ZS52ZXJzaW9uKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnRleHQpO1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnRJdGVtLmlzID0gaXM7XG59KShUZXh0RG9jdW1lbnRJdGVtIHx8IChUZXh0RG9jdW1lbnRJdGVtID0ge30pKTtcbi8qKlxuICogRGVzY3JpYmVzIHRoZSBjb250ZW50IHR5cGUgdGhhdCBhIGNsaWVudCBzdXBwb3J0cyBpbiB2YXJpb3VzXG4gKiByZXN1bHQgbGl0ZXJhbHMgbGlrZSBgSG92ZXJgLCBgUGFyYW1ldGVySW5mb2Agb3IgYENvbXBsZXRpb25JdGVtYC5cbiAqXG4gKiBQbGVhc2Ugbm90ZSB0aGF0IGBNYXJrdXBLaW5kc2AgbXVzdCBub3Qgc3RhcnQgd2l0aCBhIGAkYC4gVGhpcyBraW5kc1xuICogYXJlIHJlc2VydmVkIGZvciBpbnRlcm5hbCB1c2FnZS5cbiAqL1xuZXhwb3J0IHZhciBNYXJrdXBLaW5kO1xuKGZ1bmN0aW9uIChNYXJrdXBLaW5kKSB7XG4gICAgLyoqXG4gICAgICogUGxhaW4gdGV4dCBpcyBzdXBwb3J0ZWQgYXMgYSBjb250ZW50IGZvcm1hdFxuICAgICAqL1xuICAgIE1hcmt1cEtpbmQuUGxhaW5UZXh0ID0gJ3BsYWludGV4dCc7XG4gICAgLyoqXG4gICAgICogTWFya2Rvd24gaXMgc3VwcG9ydGVkIGFzIGEgY29udGVudCBmb3JtYXRcbiAgICAgKi9cbiAgICBNYXJrdXBLaW5kLk1hcmtkb3duID0gJ21hcmtkb3duJztcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgaXMgYSB2YWx1ZSBvZiB0aGUge0BsaW5rIE1hcmt1cEtpbmR9IHR5cGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgPT09IE1hcmt1cEtpbmQuUGxhaW5UZXh0IHx8IGNhbmRpZGF0ZSA9PT0gTWFya3VwS2luZC5NYXJrZG93bjtcbiAgICB9XG4gICAgTWFya3VwS2luZC5pcyA9IGlzO1xufSkoTWFya3VwS2luZCB8fCAoTWFya3VwS2luZCA9IHt9KSk7XG5leHBvcnQgdmFyIE1hcmt1cENvbnRlbnQ7XG4oZnVuY3Rpb24gKE1hcmt1cENvbnRlbnQpIHtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgY29uZm9ybXMgdG8gdGhlIHtAbGluayBNYXJrdXBDb250ZW50fSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKHZhbHVlKSAmJiBNYXJrdXBLaW5kLmlzKGNhbmRpZGF0ZS5raW5kKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnZhbHVlKTtcbiAgICB9XG4gICAgTWFya3VwQ29udGVudC5pcyA9IGlzO1xufSkoTWFya3VwQ29udGVudCB8fCAoTWFya3VwQ29udGVudCA9IHt9KSk7XG4vKipcbiAqIFRoZSBraW5kIG9mIGEgY29tcGxldGlvbiBlbnRyeS5cbiAqL1xuZXhwb3J0IHZhciBDb21wbGV0aW9uSXRlbUtpbmQ7XG4oZnVuY3Rpb24gKENvbXBsZXRpb25JdGVtS2luZCkge1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5UZXh0ID0gMTtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuTWV0aG9kID0gMjtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuRnVuY3Rpb24gPSAzO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5Db25zdHJ1Y3RvciA9IDQ7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkZpZWxkID0gNTtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuVmFyaWFibGUgPSA2O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5DbGFzcyA9IDc7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkludGVyZmFjZSA9IDg7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLk1vZHVsZSA9IDk7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlByb3BlcnR5ID0gMTA7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlVuaXQgPSAxMTtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuVmFsdWUgPSAxMjtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuRW51bSA9IDEzO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5LZXl3b3JkID0gMTQ7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlNuaXBwZXQgPSAxNTtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuQ29sb3IgPSAxNjtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuRmlsZSA9IDE3O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5SZWZlcmVuY2UgPSAxODtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuRm9sZGVyID0gMTk7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkVudW1NZW1iZXIgPSAyMDtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuQ29uc3RhbnQgPSAyMTtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuU3RydWN0ID0gMjI7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkV2ZW50ID0gMjM7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLk9wZXJhdG9yID0gMjQ7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlR5cGVQYXJhbWV0ZXIgPSAyNTtcbn0pKENvbXBsZXRpb25JdGVtS2luZCB8fCAoQ29tcGxldGlvbkl0ZW1LaW5kID0ge30pKTtcbi8qKlxuICogRGVmaW5lcyB3aGV0aGVyIHRoZSBpbnNlcnQgdGV4dCBpbiBhIGNvbXBsZXRpb24gaXRlbSBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXNcbiAqIHBsYWluIHRleHQgb3IgYSBzbmlwcGV0LlxuICovXG5leHBvcnQgdmFyIEluc2VydFRleHRGb3JtYXQ7XG4oZnVuY3Rpb24gKEluc2VydFRleHRGb3JtYXQpIHtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpbWFyeSB0ZXh0IHRvIGJlIGluc2VydGVkIGlzIHRyZWF0ZWQgYXMgYSBwbGFpbiBzdHJpbmcuXG4gICAgICovXG4gICAgSW5zZXJ0VGV4dEZvcm1hdC5QbGFpblRleHQgPSAxO1xuICAgIC8qKlxuICAgICAqIFRoZSBwcmltYXJ5IHRleHQgdG8gYmUgaW5zZXJ0ZWQgaXMgdHJlYXRlZCBhcyBhIHNuaXBwZXQuXG4gICAgICpcbiAgICAgKiBBIHNuaXBwZXQgY2FuIGRlZmluZSB0YWIgc3RvcHMgYW5kIHBsYWNlaG9sZGVycyB3aXRoIGAkMWAsIGAkMmBcbiAgICAgKiBhbmQgYCR7Mzpmb299YC4gYCQwYCBkZWZpbmVzIHRoZSBmaW5hbCB0YWIgc3RvcCwgaXQgZGVmYXVsdHMgdG9cbiAgICAgKiB0aGUgZW5kIG9mIHRoZSBzbmlwcGV0LiBQbGFjZWhvbGRlcnMgd2l0aCBlcXVhbCBpZGVudGlmaWVycyBhcmUgbGlua2VkLFxuICAgICAqIHRoYXQgaXMgdHlwaW5nIGluIG9uZSB3aWxsIHVwZGF0ZSBvdGhlcnMgdG9vLlxuICAgICAqXG4gICAgICogU2VlIGFsc286IGh0dHBzOi8vbWljcm9zb2Z0LmdpdGh1Yi5pby9sYW5ndWFnZS1zZXJ2ZXItcHJvdG9jb2wvc3BlY2lmaWNhdGlvbnMvc3BlY2lmaWNhdGlvbi1jdXJyZW50LyNzbmlwcGV0X3N5bnRheFxuICAgICAqL1xuICAgIEluc2VydFRleHRGb3JtYXQuU25pcHBldCA9IDI7XG59KShJbnNlcnRUZXh0Rm9ybWF0IHx8IChJbnNlcnRUZXh0Rm9ybWF0ID0ge30pKTtcbi8qKlxuICogQ29tcGxldGlvbiBpdGVtIHRhZ3MgYXJlIGV4dHJhIGFubm90YXRpb25zIHRoYXQgdHdlYWsgdGhlIHJlbmRlcmluZyBvZiBhIGNvbXBsZXRpb25cbiAqIGl0ZW0uXG4gKlxuICogQHNpbmNlIDMuMTUuMFxuICovXG5leHBvcnQgdmFyIENvbXBsZXRpb25JdGVtVGFnO1xuKGZ1bmN0aW9uIChDb21wbGV0aW9uSXRlbVRhZykge1xuICAgIC8qKlxuICAgICAqIFJlbmRlciBhIGNvbXBsZXRpb24gYXMgb2Jzb2xldGUsIHVzdWFsbHkgdXNpbmcgYSBzdHJpa2Utb3V0LlxuICAgICAqL1xuICAgIENvbXBsZXRpb25JdGVtVGFnLkRlcHJlY2F0ZWQgPSAxO1xufSkoQ29tcGxldGlvbkl0ZW1UYWcgfHwgKENvbXBsZXRpb25JdGVtVGFnID0ge30pKTtcbi8qKlxuICogVGhlIEluc2VydFJlcGxhY2VFZGl0IG5hbWVzcGFjZSBwcm92aWRlcyBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIGluc2VydCAvIHJlcGxhY2UgZWRpdHMuXG4gKlxuICogQHNpbmNlIDMuMTYuMFxuICovXG5leHBvcnQgdmFyIEluc2VydFJlcGxhY2VFZGl0O1xuKGZ1bmN0aW9uIChJbnNlcnRSZXBsYWNlRWRpdCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgaW5zZXJ0IC8gcmVwbGFjZSBlZGl0XG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKG5ld1RleHQsIGluc2VydCwgcmVwbGFjZSkge1xuICAgICAgICByZXR1cm4geyBuZXdUZXh0LCBpbnNlcnQsIHJlcGxhY2UgfTtcbiAgICB9XG4gICAgSW5zZXJ0UmVwbGFjZUVkaXQuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgSW5zZXJ0UmVwbGFjZUVkaXR9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLm5ld1RleHQpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5pbnNlcnQpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yZXBsYWNlKTtcbiAgICB9XG4gICAgSW5zZXJ0UmVwbGFjZUVkaXQuaXMgPSBpcztcbn0pKEluc2VydFJlcGxhY2VFZGl0IHx8IChJbnNlcnRSZXBsYWNlRWRpdCA9IHt9KSk7XG4vKipcbiAqIEhvdyB3aGl0ZXNwYWNlIGFuZCBpbmRlbnRhdGlvbiBpcyBoYW5kbGVkIGR1cmluZyBjb21wbGV0aW9uXG4gKiBpdGVtIGluc2VydGlvbi5cbiAqXG4gKiBAc2luY2UgMy4xNi4wXG4gKi9cbmV4cG9ydCB2YXIgSW5zZXJ0VGV4dE1vZGU7XG4oZnVuY3Rpb24gKEluc2VydFRleHRNb2RlKSB7XG4gICAgLyoqXG4gICAgICogVGhlIGluc2VydGlvbiBvciByZXBsYWNlIHN0cmluZ3MgaXMgdGFrZW4gYXMgaXQgaXMuIElmIHRoZVxuICAgICAqIHZhbHVlIGlzIG11bHRpIGxpbmUgdGhlIGxpbmVzIGJlbG93IHRoZSBjdXJzb3Igd2lsbCBiZVxuICAgICAqIGluc2VydGVkIHVzaW5nIHRoZSBpbmRlbnRhdGlvbiBkZWZpbmVkIGluIHRoZSBzdHJpbmcgdmFsdWUuXG4gICAgICogVGhlIGNsaWVudCB3aWxsIG5vdCBhcHBseSBhbnkga2luZCBvZiBhZGp1c3RtZW50cyB0byB0aGVcbiAgICAgKiBzdHJpbmcuXG4gICAgICovXG4gICAgSW5zZXJ0VGV4dE1vZGUuYXNJcyA9IDE7XG4gICAgLyoqXG4gICAgICogVGhlIGVkaXRvciBhZGp1c3RzIGxlYWRpbmcgd2hpdGVzcGFjZSBvZiBuZXcgbGluZXMgc28gdGhhdFxuICAgICAqIHRoZXkgbWF0Y2ggdGhlIGluZGVudGF0aW9uIHVwIHRvIHRoZSBjdXJzb3Igb2YgdGhlIGxpbmUgZm9yXG4gICAgICogd2hpY2ggdGhlIGl0ZW0gaXMgYWNjZXB0ZWQuXG4gICAgICpcbiAgICAgKiBDb25zaWRlciBhIGxpbmUgbGlrZSB0aGlzOiA8MnRhYnM+PGN1cnNvcj48M3RhYnM+Zm9vLiBBY2NlcHRpbmcgYVxuICAgICAqIG11bHRpIGxpbmUgY29tcGxldGlvbiBpdGVtIGlzIGluZGVudGVkIHVzaW5nIDIgdGFicyBhbmQgYWxsXG4gICAgICogZm9sbG93aW5nIGxpbmVzIGluc2VydGVkIHdpbGwgYmUgaW5kZW50ZWQgdXNpbmcgMiB0YWJzIGFzIHdlbGwuXG4gICAgICovXG4gICAgSW5zZXJ0VGV4dE1vZGUuYWRqdXN0SW5kZW50YXRpb24gPSAyO1xufSkoSW5zZXJ0VGV4dE1vZGUgfHwgKEluc2VydFRleHRNb2RlID0ge30pKTtcbmV4cG9ydCB2YXIgQ29tcGxldGlvbkl0ZW1MYWJlbERldGFpbHM7XG4oZnVuY3Rpb24gKENvbXBsZXRpb25JdGVtTGFiZWxEZXRhaWxzKSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgKElzLnN0cmluZyhjYW5kaWRhdGUuZGV0YWlsKSB8fCBjYW5kaWRhdGUuZGV0YWlsID09PSB1bmRlZmluZWQpICYmXG4gICAgICAgICAgICAoSXMuc3RyaW5nKGNhbmRpZGF0ZS5kZXNjcmlwdGlvbikgfHwgY2FuZGlkYXRlLmRlc2NyaXB0aW9uID09PSB1bmRlZmluZWQpO1xuICAgIH1cbiAgICBDb21wbGV0aW9uSXRlbUxhYmVsRGV0YWlscy5pcyA9IGlzO1xufSkoQ29tcGxldGlvbkl0ZW1MYWJlbERldGFpbHMgfHwgKENvbXBsZXRpb25JdGVtTGFiZWxEZXRhaWxzID0ge30pKTtcbi8qKlxuICogVGhlIENvbXBsZXRpb25JdGVtIG5hbWVzcGFjZSBwcm92aWRlcyBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoXG4gKiBjb21wbGV0aW9uIGl0ZW1zLlxuICovXG5leHBvcnQgdmFyIENvbXBsZXRpb25JdGVtO1xuKGZ1bmN0aW9uIChDb21wbGV0aW9uSXRlbSkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIGNvbXBsZXRpb24gaXRlbSBhbmQgc2VlZCBpdCB3aXRoIGEgbGFiZWwuXG4gICAgICogQHBhcmFtIGxhYmVsIFRoZSBjb21wbGV0aW9uIGl0ZW0ncyBsYWJlbFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShsYWJlbCkge1xuICAgICAgICByZXR1cm4geyBsYWJlbCB9O1xuICAgIH1cbiAgICBDb21wbGV0aW9uSXRlbS5jcmVhdGUgPSBjcmVhdGU7XG59KShDb21wbGV0aW9uSXRlbSB8fCAoQ29tcGxldGlvbkl0ZW0gPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29tcGxldGlvbkxpc3QgbmFtZXNwYWNlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGhcbiAqIGNvbXBsZXRpb24gbGlzdHMuXG4gKi9cbmV4cG9ydCB2YXIgQ29tcGxldGlvbkxpc3Q7XG4oZnVuY3Rpb24gKENvbXBsZXRpb25MaXN0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBjb21wbGV0aW9uIGxpc3QuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gaXRlbXMgVGhlIGNvbXBsZXRpb24gaXRlbXMuXG4gICAgICogQHBhcmFtIGlzSW5jb21wbGV0ZSBUaGUgbGlzdCBpcyBub3QgY29tcGxldGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGl0ZW1zLCBpc0luY29tcGxldGUpIHtcbiAgICAgICAgcmV0dXJuIHsgaXRlbXM6IGl0ZW1zID8gaXRlbXMgOiBbXSwgaXNJbmNvbXBsZXRlOiAhIWlzSW5jb21wbGV0ZSB9O1xuICAgIH1cbiAgICBDb21wbGV0aW9uTGlzdC5jcmVhdGUgPSBjcmVhdGU7XG59KShDb21wbGV0aW9uTGlzdCB8fCAoQ29tcGxldGlvbkxpc3QgPSB7fSkpO1xuZXhwb3J0IHZhciBNYXJrZWRTdHJpbmc7XG4oZnVuY3Rpb24gKE1hcmtlZFN0cmluZykge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBtYXJrZWQgc3RyaW5nIGZyb20gcGxhaW4gdGV4dC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBwbGFpblRleHQgVGhlIHBsYWluIHRleHQuXG4gICAgICovXG4gICAgZnVuY3Rpb24gZnJvbVBsYWluVGV4dChwbGFpblRleHQpIHtcbiAgICAgICAgcmV0dXJuIHBsYWluVGV4dC5yZXBsYWNlKC9bXFxcXGAqX3t9W1xcXSgpIytcXC0uIV0vZywgJ1xcXFwkJicpOyAvLyBlc2NhcGUgbWFya2Rvd24gc3ludGF4IHRva2VuczogaHR0cDovL2RhcmluZ2ZpcmViYWxsLm5ldC9wcm9qZWN0cy9tYXJrZG93bi9zeW50YXgjYmFja3NsYXNoXG4gICAgfVxuICAgIE1hcmtlZFN0cmluZy5mcm9tUGxhaW5UZXh0ID0gZnJvbVBsYWluVGV4dDtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgY29uZm9ybXMgdG8gdGhlIHtAbGluayBNYXJrZWRTdHJpbmd9IHR5cGUuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5zdHJpbmcoY2FuZGlkYXRlKSB8fCAoSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUubGFuZ3VhZ2UpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudmFsdWUpKTtcbiAgICB9XG4gICAgTWFya2VkU3RyaW5nLmlzID0gaXM7XG59KShNYXJrZWRTdHJpbmcgfHwgKE1hcmtlZFN0cmluZyA9IHt9KSk7XG5leHBvcnQgdmFyIEhvdmVyO1xuKGZ1bmN0aW9uIChIb3Zlcikge1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBjb25mb3JtcyB0byB0aGUge0BsaW5rIEhvdmVyfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gISFjYW5kaWRhdGUgJiYgSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIChNYXJrdXBDb250ZW50LmlzKGNhbmRpZGF0ZS5jb250ZW50cykgfHxcbiAgICAgICAgICAgIE1hcmtlZFN0cmluZy5pcyhjYW5kaWRhdGUuY29udGVudHMpIHx8XG4gICAgICAgICAgICBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS5jb250ZW50cywgTWFya2VkU3RyaW5nLmlzKSkgJiYgKHZhbHVlLnJhbmdlID09PSB1bmRlZmluZWQgfHwgUmFuZ2UuaXModmFsdWUucmFuZ2UpKTtcbiAgICB9XG4gICAgSG92ZXIuaXMgPSBpcztcbn0pKEhvdmVyIHx8IChIb3ZlciA9IHt9KSk7XG4vKipcbiAqIFRoZSBQYXJhbWV0ZXJJbmZvcm1hdGlvbiBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBQYXJhbWV0ZXJJbmZvcm1hdGlvbn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgUGFyYW1ldGVySW5mb3JtYXRpb247XG4oZnVuY3Rpb24gKFBhcmFtZXRlckluZm9ybWF0aW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBwYXJhbWV0ZXIgaW5mb3JtYXRpb24gbGl0ZXJhbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBsYWJlbCBBIGxhYmVsIHN0cmluZy5cbiAgICAgKiBAcGFyYW0gZG9jdW1lbnRhdGlvbiBBIGRvYyBzdHJpbmcuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGxhYmVsLCBkb2N1bWVudGF0aW9uKSB7XG4gICAgICAgIHJldHVybiBkb2N1bWVudGF0aW9uID8geyBsYWJlbCwgZG9jdW1lbnRhdGlvbiB9IDogeyBsYWJlbCB9O1xuICAgIH1cbiAgICBQYXJhbWV0ZXJJbmZvcm1hdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG59KShQYXJhbWV0ZXJJbmZvcm1hdGlvbiB8fCAoUGFyYW1ldGVySW5mb3JtYXRpb24gPSB7fSkpO1xuLyoqXG4gKiBUaGUgU2lnbmF0dXJlSW5mb3JtYXRpb24gbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgU2lnbmF0dXJlSW5mb3JtYXRpb259IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIFNpZ25hdHVyZUluZm9ybWF0aW9uO1xuKGZ1bmN0aW9uIChTaWduYXR1cmVJbmZvcm1hdGlvbikge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShsYWJlbCwgZG9jdW1lbnRhdGlvbiwgLi4ucGFyYW1ldGVycykge1xuICAgICAgICBsZXQgcmVzdWx0ID0geyBsYWJlbCB9O1xuICAgICAgICBpZiAoSXMuZGVmaW5lZChkb2N1bWVudGF0aW9uKSkge1xuICAgICAgICAgICAgcmVzdWx0LmRvY3VtZW50YXRpb24gPSBkb2N1bWVudGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKHBhcmFtZXRlcnMpKSB7XG4gICAgICAgICAgICByZXN1bHQucGFyYW1ldGVycyA9IHBhcmFtZXRlcnM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXN1bHQucGFyYW1ldGVycyA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIFNpZ25hdHVyZUluZm9ybWF0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKFNpZ25hdHVyZUluZm9ybWF0aW9uIHx8IChTaWduYXR1cmVJbmZvcm1hdGlvbiA9IHt9KSk7XG4vKipcbiAqIEEgZG9jdW1lbnQgaGlnaGxpZ2h0IGtpbmQuXG4gKi9cbmV4cG9ydCB2YXIgRG9jdW1lbnRIaWdobGlnaHRLaW5kO1xuKGZ1bmN0aW9uIChEb2N1bWVudEhpZ2hsaWdodEtpbmQpIHtcbiAgICAvKipcbiAgICAgKiBBIHRleHR1YWwgb2NjdXJyZW5jZS5cbiAgICAgKi9cbiAgICBEb2N1bWVudEhpZ2hsaWdodEtpbmQuVGV4dCA9IDE7XG4gICAgLyoqXG4gICAgICogUmVhZC1hY2Nlc3Mgb2YgYSBzeW1ib2wsIGxpa2UgcmVhZGluZyBhIHZhcmlhYmxlLlxuICAgICAqL1xuICAgIERvY3VtZW50SGlnaGxpZ2h0S2luZC5SZWFkID0gMjtcbiAgICAvKipcbiAgICAgKiBXcml0ZS1hY2Nlc3Mgb2YgYSBzeW1ib2wsIGxpa2Ugd3JpdGluZyB0byBhIHZhcmlhYmxlLlxuICAgICAqL1xuICAgIERvY3VtZW50SGlnaGxpZ2h0S2luZC5Xcml0ZSA9IDM7XG59KShEb2N1bWVudEhpZ2hsaWdodEtpbmQgfHwgKERvY3VtZW50SGlnaGxpZ2h0S2luZCA9IHt9KSk7XG4vKipcbiAqIERvY3VtZW50SGlnaGxpZ2h0IG5hbWVzcGFjZSB0byBwcm92aWRlIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgRG9jdW1lbnRIaWdobGlnaHR9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIERvY3VtZW50SGlnaGxpZ2h0O1xuKGZ1bmN0aW9uIChEb2N1bWVudEhpZ2hsaWdodCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIERvY3VtZW50SGlnaGxpZ2h0IG9iamVjdC5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlIHRoZSBoaWdobGlnaHQgYXBwbGllcyB0by5cbiAgICAgKiBAcGFyYW0ga2luZCBUaGUgaGlnaGxpZ2h0IGtpbmRcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIGtpbmQpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHsgcmFuZ2UgfTtcbiAgICAgICAgaWYgKElzLm51bWJlcihraW5kKSkge1xuICAgICAgICAgICAgcmVzdWx0LmtpbmQgPSBraW5kO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIERvY3VtZW50SGlnaGxpZ2h0LmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKERvY3VtZW50SGlnaGxpZ2h0IHx8IChEb2N1bWVudEhpZ2hsaWdodCA9IHt9KSk7XG4vKipcbiAqIEEgc3ltYm9sIGtpbmQuXG4gKi9cbmV4cG9ydCB2YXIgU3ltYm9sS2luZDtcbihmdW5jdGlvbiAoU3ltYm9sS2luZCkge1xuICAgIFN5bWJvbEtpbmQuRmlsZSA9IDE7XG4gICAgU3ltYm9sS2luZC5Nb2R1bGUgPSAyO1xuICAgIFN5bWJvbEtpbmQuTmFtZXNwYWNlID0gMztcbiAgICBTeW1ib2xLaW5kLlBhY2thZ2UgPSA0O1xuICAgIFN5bWJvbEtpbmQuQ2xhc3MgPSA1O1xuICAgIFN5bWJvbEtpbmQuTWV0aG9kID0gNjtcbiAgICBTeW1ib2xLaW5kLlByb3BlcnR5ID0gNztcbiAgICBTeW1ib2xLaW5kLkZpZWxkID0gODtcbiAgICBTeW1ib2xLaW5kLkNvbnN0cnVjdG9yID0gOTtcbiAgICBTeW1ib2xLaW5kLkVudW0gPSAxMDtcbiAgICBTeW1ib2xLaW5kLkludGVyZmFjZSA9IDExO1xuICAgIFN5bWJvbEtpbmQuRnVuY3Rpb24gPSAxMjtcbiAgICBTeW1ib2xLaW5kLlZhcmlhYmxlID0gMTM7XG4gICAgU3ltYm9sS2luZC5Db25zdGFudCA9IDE0O1xuICAgIFN5bWJvbEtpbmQuU3RyaW5nID0gMTU7XG4gICAgU3ltYm9sS2luZC5OdW1iZXIgPSAxNjtcbiAgICBTeW1ib2xLaW5kLkJvb2xlYW4gPSAxNztcbiAgICBTeW1ib2xLaW5kLkFycmF5ID0gMTg7XG4gICAgU3ltYm9sS2luZC5PYmplY3QgPSAxOTtcbiAgICBTeW1ib2xLaW5kLktleSA9IDIwO1xuICAgIFN5bWJvbEtpbmQuTnVsbCA9IDIxO1xuICAgIFN5bWJvbEtpbmQuRW51bU1lbWJlciA9IDIyO1xuICAgIFN5bWJvbEtpbmQuU3RydWN0ID0gMjM7XG4gICAgU3ltYm9sS2luZC5FdmVudCA9IDI0O1xuICAgIFN5bWJvbEtpbmQuT3BlcmF0b3IgPSAyNTtcbiAgICBTeW1ib2xLaW5kLlR5cGVQYXJhbWV0ZXIgPSAyNjtcbn0pKFN5bWJvbEtpbmQgfHwgKFN5bWJvbEtpbmQgPSB7fSkpO1xuLyoqXG4gKiBTeW1ib2wgdGFncyBhcmUgZXh0cmEgYW5ub3RhdGlvbnMgdGhhdCB0d2VhayB0aGUgcmVuZGVyaW5nIG9mIGEgc3ltYm9sLlxuICpcbiAqIEBzaW5jZSAzLjE2XG4gKi9cbmV4cG9ydCB2YXIgU3ltYm9sVGFnO1xuKGZ1bmN0aW9uIChTeW1ib2xUYWcpIHtcbiAgICAvKipcbiAgICAgKiBSZW5kZXIgYSBzeW1ib2wgYXMgb2Jzb2xldGUsIHVzdWFsbHkgdXNpbmcgYSBzdHJpa2Utb3V0LlxuICAgICAqL1xuICAgIFN5bWJvbFRhZy5EZXByZWNhdGVkID0gMTtcbn0pKFN5bWJvbFRhZyB8fCAoU3ltYm9sVGFnID0ge30pKTtcbmV4cG9ydCB2YXIgU3ltYm9sSW5mb3JtYXRpb247XG4oZnVuY3Rpb24gKFN5bWJvbEluZm9ybWF0aW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBzeW1ib2wgaW5mb3JtYXRpb24gbGl0ZXJhbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIGtpbmQgVGhlIGtpbmQgb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlIG9mIHRoZSBsb2NhdGlvbiBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIHJlc291cmNlIG9mIHRoZSBsb2NhdGlvbiBvZiBzeW1ib2wuXG4gICAgICogQHBhcmFtIGNvbnRhaW5lck5hbWUgVGhlIG5hbWUgb2YgdGhlIHN5bWJvbCBjb250YWluaW5nIHRoZSBzeW1ib2wuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKG5hbWUsIGtpbmQsIHJhbmdlLCB1cmksIGNvbnRhaW5lck5hbWUpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICBraW5kLFxuICAgICAgICAgICAgbG9jYXRpb246IHsgdXJpLCByYW5nZSB9XG4gICAgICAgIH07XG4gICAgICAgIGlmIChjb250YWluZXJOYW1lKSB7XG4gICAgICAgICAgICByZXN1bHQuY29udGFpbmVyTmFtZSA9IGNvbnRhaW5lck5hbWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgU3ltYm9sSW5mb3JtYXRpb24uY3JlYXRlID0gY3JlYXRlO1xufSkoU3ltYm9sSW5mb3JtYXRpb24gfHwgKFN5bWJvbEluZm9ybWF0aW9uID0ge30pKTtcbmV4cG9ydCB2YXIgV29ya3NwYWNlU3ltYm9sO1xuKGZ1bmN0aW9uIChXb3Jrc3BhY2VTeW1ib2wpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgd29ya3NwYWNlIHN5bWJvbC5cbiAgICAgKlxuICAgICAqIEBwYXJhbSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIGtpbmQgVGhlIGtpbmQgb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSByZXNvdXJjZSBvZiB0aGUgbG9jYXRpb24gb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gcmFuZ2UgQW4gb3B0aW9ucyByYW5nZSBvZiB0aGUgbG9jYXRpb24uXG4gICAgICogQHJldHVybnMgQSBXb3Jrc3BhY2VTeW1ib2wuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKG5hbWUsIGtpbmQsIHVyaSwgcmFuZ2UpIHtcbiAgICAgICAgcmV0dXJuIHJhbmdlICE9PSB1bmRlZmluZWRcbiAgICAgICAgICAgID8geyBuYW1lLCBraW5kLCBsb2NhdGlvbjogeyB1cmksIHJhbmdlIH0gfVxuICAgICAgICAgICAgOiB7IG5hbWUsIGtpbmQsIGxvY2F0aW9uOiB7IHVyaSB9IH07XG4gICAgfVxuICAgIFdvcmtzcGFjZVN5bWJvbC5jcmVhdGUgPSBjcmVhdGU7XG59KShXb3Jrc3BhY2VTeW1ib2wgfHwgKFdvcmtzcGFjZVN5bWJvbCA9IHt9KSk7XG5leHBvcnQgdmFyIERvY3VtZW50U3ltYm9sO1xuKGZ1bmN0aW9uIChEb2N1bWVudFN5bWJvbCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgc3ltYm9sIGluZm9ybWF0aW9uIGxpdGVyYWwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSBkZXRhaWwgVGhlIGRldGFpbCBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSBraW5kIFRoZSBraW5kIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSBzZWxlY3Rpb25SYW5nZSBUaGUgc2VsZWN0aW9uUmFuZ2Ugb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gY2hpbGRyZW4gQ2hpbGRyZW4gb2YgdGhlIHN5bWJvbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobmFtZSwgZGV0YWlsLCBraW5kLCByYW5nZSwgc2VsZWN0aW9uUmFuZ2UsIGNoaWxkcmVuKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAgZGV0YWlsLFxuICAgICAgICAgICAga2luZCxcbiAgICAgICAgICAgIHJhbmdlLFxuICAgICAgICAgICAgc2VsZWN0aW9uUmFuZ2VcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKGNoaWxkcmVuICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5jaGlsZHJlbiA9IGNoaWxkcmVuO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIERvY3VtZW50U3ltYm9sLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIERvY3VtZW50U3ltYm9sfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmXG4gICAgICAgICAgICBJcy5zdHJpbmcoY2FuZGlkYXRlLm5hbWUpICYmIElzLm51bWJlcihjYW5kaWRhdGUua2luZCkgJiZcbiAgICAgICAgICAgIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnNlbGVjdGlvblJhbmdlKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5kZXRhaWwgPT09IHVuZGVmaW5lZCB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLmRldGFpbCkpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmRlcHJlY2F0ZWQgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5kZXByZWNhdGVkKSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuY2hpbGRyZW4gPT09IHVuZGVmaW5lZCB8fCBBcnJheS5pc0FycmF5KGNhbmRpZGF0ZS5jaGlsZHJlbikpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLnRhZ3MgPT09IHVuZGVmaW5lZCB8fCBBcnJheS5pc0FycmF5KGNhbmRpZGF0ZS50YWdzKSk7XG4gICAgfVxuICAgIERvY3VtZW50U3ltYm9sLmlzID0gaXM7XG59KShEb2N1bWVudFN5bWJvbCB8fCAoRG9jdW1lbnRTeW1ib2wgPSB7fSkpO1xuLyoqXG4gKiBBIHNldCBvZiBwcmVkZWZpbmVkIGNvZGUgYWN0aW9uIGtpbmRzXG4gKi9cbmV4cG9ydCB2YXIgQ29kZUFjdGlvbktpbmQ7XG4oZnVuY3Rpb24gKENvZGVBY3Rpb25LaW5kKSB7XG4gICAgLyoqXG4gICAgICogRW1wdHkga2luZC5cbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5FbXB0eSA9ICcnO1xuICAgIC8qKlxuICAgICAqIEJhc2Uga2luZCBmb3IgcXVpY2tmaXggYWN0aW9uczogJ3F1aWNrZml4J1xuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlF1aWNrRml4ID0gJ3F1aWNrZml4JztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIHJlZmFjdG9yaW5nIGFjdGlvbnM6ICdyZWZhY3RvcidcbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5SZWZhY3RvciA9ICdyZWZhY3Rvcic7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciByZWZhY3RvcmluZyBleHRyYWN0aW9uIGFjdGlvbnM6ICdyZWZhY3Rvci5leHRyYWN0J1xuICAgICAqXG4gICAgICogRXhhbXBsZSBleHRyYWN0IGFjdGlvbnM6XG4gICAgICpcbiAgICAgKiAtIEV4dHJhY3QgbWV0aG9kXG4gICAgICogLSBFeHRyYWN0IGZ1bmN0aW9uXG4gICAgICogLSBFeHRyYWN0IHZhcmlhYmxlXG4gICAgICogLSBFeHRyYWN0IGludGVyZmFjZSBmcm9tIGNsYXNzXG4gICAgICogLSAuLi5cbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5SZWZhY3RvckV4dHJhY3QgPSAncmVmYWN0b3IuZXh0cmFjdCc7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciByZWZhY3RvcmluZyBpbmxpbmUgYWN0aW9uczogJ3JlZmFjdG9yLmlubGluZSdcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgaW5saW5lIGFjdGlvbnM6XG4gICAgICpcbiAgICAgKiAtIElubGluZSBmdW5jdGlvblxuICAgICAqIC0gSW5saW5lIHZhcmlhYmxlXG4gICAgICogLSBJbmxpbmUgY29uc3RhbnRcbiAgICAgKiAtIC4uLlxuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlJlZmFjdG9ySW5saW5lID0gJ3JlZmFjdG9yLmlubGluZSc7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciByZWZhY3RvcmluZyByZXdyaXRlIGFjdGlvbnM6ICdyZWZhY3Rvci5yZXdyaXRlJ1xuICAgICAqXG4gICAgICogRXhhbXBsZSByZXdyaXRlIGFjdGlvbnM6XG4gICAgICpcbiAgICAgKiAtIENvbnZlcnQgSmF2YVNjcmlwdCBmdW5jdGlvbiB0byBjbGFzc1xuICAgICAqIC0gQWRkIG9yIHJlbW92ZSBwYXJhbWV0ZXJcbiAgICAgKiAtIEVuY2Fwc3VsYXRlIGZpZWxkXG4gICAgICogLSBNYWtlIG1ldGhvZCBzdGF0aWNcbiAgICAgKiAtIE1vdmUgbWV0aG9kIHRvIGJhc2UgY2xhc3NcbiAgICAgKiAtIC4uLlxuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlJlZmFjdG9yUmV3cml0ZSA9ICdyZWZhY3Rvci5yZXdyaXRlJztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIHNvdXJjZSBhY3Rpb25zOiBgc291cmNlYFxuICAgICAqXG4gICAgICogU291cmNlIGNvZGUgYWN0aW9ucyBhcHBseSB0byB0aGUgZW50aXJlIGZpbGUuXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuU291cmNlID0gJ3NvdXJjZSc7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciBhbiBvcmdhbml6ZSBpbXBvcnRzIHNvdXJjZSBhY3Rpb246IGBzb3VyY2Uub3JnYW5pemVJbXBvcnRzYFxuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlNvdXJjZU9yZ2FuaXplSW1wb3J0cyA9ICdzb3VyY2Uub3JnYW5pemVJbXBvcnRzJztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIGF1dG8tZml4IHNvdXJjZSBhY3Rpb25zOiBgc291cmNlLmZpeEFsbGAuXG4gICAgICpcbiAgICAgKiBGaXggYWxsIGFjdGlvbnMgYXV0b21hdGljYWxseSBmaXggZXJyb3JzIHRoYXQgaGF2ZSBhIGNsZWFyIGZpeCB0aGF0IGRvIG5vdCByZXF1aXJlIHVzZXIgaW5wdXQuXG4gICAgICogVGhleSBzaG91bGQgbm90IHN1cHByZXNzIGVycm9ycyBvciBwZXJmb3JtIHVuc2FmZSBmaXhlcyBzdWNoIGFzIGdlbmVyYXRpbmcgbmV3IHR5cGVzIG9yIGNsYXNzZXMuXG4gICAgICpcbiAgICAgKiBAc2luY2UgMy4xNS4wXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuU291cmNlRml4QWxsID0gJ3NvdXJjZS5maXhBbGwnO1xufSkoQ29kZUFjdGlvbktpbmQgfHwgKENvZGVBY3Rpb25LaW5kID0ge30pKTtcbi8qKlxuICogVGhlIHJlYXNvbiB3aHkgY29kZSBhY3Rpb25zIHdlcmUgcmVxdWVzdGVkLlxuICpcbiAqIEBzaW5jZSAzLjE3LjBcbiAqL1xuZXhwb3J0IHZhciBDb2RlQWN0aW9uVHJpZ2dlcktpbmQ7XG4oZnVuY3Rpb24gKENvZGVBY3Rpb25UcmlnZ2VyS2luZCkge1xuICAgIC8qKlxuICAgICAqIENvZGUgYWN0aW9ucyB3ZXJlIGV4cGxpY2l0bHkgcmVxdWVzdGVkIGJ5IHRoZSB1c2VyIG9yIGJ5IGFuIGV4dGVuc2lvbi5cbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uVHJpZ2dlcktpbmQuSW52b2tlZCA9IDE7XG4gICAgLyoqXG4gICAgICogQ29kZSBhY3Rpb25zIHdlcmUgcmVxdWVzdGVkIGF1dG9tYXRpY2FsbHkuXG4gICAgICpcbiAgICAgKiBUaGlzIHR5cGljYWxseSBoYXBwZW5zIHdoZW4gY3VycmVudCBzZWxlY3Rpb24gaW4gYSBmaWxlIGNoYW5nZXMsIGJ1dCBjYW5cbiAgICAgKiBhbHNvIGJlIHRyaWdnZXJlZCB3aGVuIGZpbGUgY29udGVudCBjaGFuZ2VzLlxuICAgICAqL1xuICAgIENvZGVBY3Rpb25UcmlnZ2VyS2luZC5BdXRvbWF0aWMgPSAyO1xufSkoQ29kZUFjdGlvblRyaWdnZXJLaW5kIHx8IChDb2RlQWN0aW9uVHJpZ2dlcktpbmQgPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29kZUFjdGlvbkNvbnRleHQgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgQ29kZUFjdGlvbkNvbnRleHR9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIENvZGVBY3Rpb25Db250ZXh0O1xuKGZ1bmN0aW9uIChDb2RlQWN0aW9uQ29udGV4dCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ29kZUFjdGlvbkNvbnRleHQgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUoZGlhZ25vc3RpY3MsIG9ubHksIHRyaWdnZXJLaW5kKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IGRpYWdub3N0aWNzIH07XG4gICAgICAgIGlmIChvbmx5ICE9PSB1bmRlZmluZWQgJiYgb25seSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmVzdWx0Lm9ubHkgPSBvbmx5O1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmlnZ2VyS2luZCAhPT0gdW5kZWZpbmVkICYmIHRyaWdnZXJLaW5kICE9PSBudWxsKSB7XG4gICAgICAgICAgICByZXN1bHQudHJpZ2dlcktpbmQgPSB0cmlnZ2VyS2luZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBDb2RlQWN0aW9uQ29udGV4dC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBDb2RlQWN0aW9uQ29udGV4dH0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS5kaWFnbm9zdGljcywgRGlhZ25vc3RpYy5pcylcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUub25seSA9PT0gdW5kZWZpbmVkIHx8IElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLm9ubHksIElzLnN0cmluZykpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLnRyaWdnZXJLaW5kID09PSB1bmRlZmluZWQgfHwgY2FuZGlkYXRlLnRyaWdnZXJLaW5kID09PSBDb2RlQWN0aW9uVHJpZ2dlcktpbmQuSW52b2tlZCB8fCBjYW5kaWRhdGUudHJpZ2dlcktpbmQgPT09IENvZGVBY3Rpb25UcmlnZ2VyS2luZC5BdXRvbWF0aWMpO1xuICAgIH1cbiAgICBDb2RlQWN0aW9uQ29udGV4dC5pcyA9IGlzO1xufSkoQ29kZUFjdGlvbkNvbnRleHQgfHwgKENvZGVBY3Rpb25Db250ZXh0ID0ge30pKTtcbmV4cG9ydCB2YXIgQ29kZUFjdGlvbjtcbihmdW5jdGlvbiAoQ29kZUFjdGlvbikge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh0aXRsZSwga2luZE9yQ29tbWFuZE9yRWRpdCwga2luZCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0geyB0aXRsZSB9O1xuICAgICAgICBsZXQgY2hlY2tLaW5kID0gdHJ1ZTtcbiAgICAgICAgaWYgKHR5cGVvZiBraW5kT3JDb21tYW5kT3JFZGl0ID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY2hlY2tLaW5kID0gZmFsc2U7XG4gICAgICAgICAgICByZXN1bHQua2luZCA9IGtpbmRPckNvbW1hbmRPckVkaXQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoQ29tbWFuZC5pcyhraW5kT3JDb21tYW5kT3JFZGl0KSkge1xuICAgICAgICAgICAgcmVzdWx0LmNvbW1hbmQgPSBraW5kT3JDb21tYW5kT3JFZGl0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0LmVkaXQgPSBraW5kT3JDb21tYW5kT3JFZGl0O1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGVja0tpbmQgJiYga2luZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQua2luZCA9IGtpbmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgQ29kZUFjdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLnN0cmluZyhjYW5kaWRhdGUudGl0bGUpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmRpYWdub3N0aWNzID09PSB1bmRlZmluZWQgfHwgSXMudHlwZWRBcnJheShjYW5kaWRhdGUuZGlhZ25vc3RpY3MsIERpYWdub3N0aWMuaXMpKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5raW5kID09PSB1bmRlZmluZWQgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS5raW5kKSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuZWRpdCAhPT0gdW5kZWZpbmVkIHx8IGNhbmRpZGF0ZS5jb21tYW5kICE9PSB1bmRlZmluZWQpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmNvbW1hbmQgPT09IHVuZGVmaW5lZCB8fCBDb21tYW5kLmlzKGNhbmRpZGF0ZS5jb21tYW5kKSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuaXNQcmVmZXJyZWQgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5pc1ByZWZlcnJlZCkpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmVkaXQgPT09IHVuZGVmaW5lZCB8fCBXb3Jrc3BhY2VFZGl0LmlzKGNhbmRpZGF0ZS5lZGl0KSk7XG4gICAgfVxuICAgIENvZGVBY3Rpb24uaXMgPSBpcztcbn0pKENvZGVBY3Rpb24gfHwgKENvZGVBY3Rpb24gPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29kZUxlbnMgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgQ29kZUxlbnN9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIENvZGVMZW5zO1xuKGZ1bmN0aW9uIChDb2RlTGVucykge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ29kZUxlbnMgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIGRhdGEpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHsgcmFuZ2UgfTtcbiAgICAgICAgaWYgKElzLmRlZmluZWQoZGF0YSkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5kYXRhID0gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBDb2RlTGVucy5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBDb2RlTGVuc30gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLmNvbW1hbmQpIHx8IENvbW1hbmQuaXMoY2FuZGlkYXRlLmNvbW1hbmQpKTtcbiAgICB9XG4gICAgQ29kZUxlbnMuaXMgPSBpcztcbn0pKENvZGVMZW5zIHx8IChDb2RlTGVucyA9IHt9KSk7XG4vKipcbiAqIFRoZSBGb3JtYXR0aW5nT3B0aW9ucyBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBGb3JtYXR0aW5nT3B0aW9uc30gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgRm9ybWF0dGluZ09wdGlvbnM7XG4oZnVuY3Rpb24gKEZvcm1hdHRpbmdPcHRpb25zKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBGb3JtYXR0aW5nT3B0aW9ucyBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh0YWJTaXplLCBpbnNlcnRTcGFjZXMpIHtcbiAgICAgICAgcmV0dXJuIHsgdGFiU2l6ZSwgaW5zZXJ0U3BhY2VzIH07XG4gICAgfVxuICAgIEZvcm1hdHRpbmdPcHRpb25zLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIEZvcm1hdHRpbmdPcHRpb25zfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnVpbnRlZ2VyKGNhbmRpZGF0ZS50YWJTaXplKSAmJiBJcy5ib29sZWFuKGNhbmRpZGF0ZS5pbnNlcnRTcGFjZXMpO1xuICAgIH1cbiAgICBGb3JtYXR0aW5nT3B0aW9ucy5pcyA9IGlzO1xufSkoRm9ybWF0dGluZ09wdGlvbnMgfHwgKEZvcm1hdHRpbmdPcHRpb25zID0ge30pKTtcbi8qKlxuICogVGhlIERvY3VtZW50TGluayBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBEb2N1bWVudExpbmt9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIERvY3VtZW50TGluaztcbihmdW5jdGlvbiAoRG9jdW1lbnRMaW5rKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBEb2N1bWVudExpbmsgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIHRhcmdldCwgZGF0YSkge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgdGFyZ2V0LCBkYXRhIH07XG4gICAgfVxuICAgIERvY3VtZW50TGluay5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBEb2N1bWVudExpbmt9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS50YXJnZXQpIHx8IElzLnN0cmluZyhjYW5kaWRhdGUudGFyZ2V0KSk7XG4gICAgfVxuICAgIERvY3VtZW50TGluay5pcyA9IGlzO1xufSkoRG9jdW1lbnRMaW5rIHx8IChEb2N1bWVudExpbmsgPSB7fSkpO1xuLyoqXG4gKiBUaGUgU2VsZWN0aW9uUmFuZ2UgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbiB0byB3b3JrIHdpdGhcbiAqIFNlbGVjdGlvblJhbmdlIGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIFNlbGVjdGlvblJhbmdlO1xuKGZ1bmN0aW9uIChTZWxlY3Rpb25SYW5nZSkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgU2VsZWN0aW9uUmFuZ2VcbiAgICAgKiBAcGFyYW0gcmFuZ2UgdGhlIHJhbmdlLlxuICAgICAqIEBwYXJhbSBwYXJlbnQgYW4gb3B0aW9uYWwgcGFyZW50LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgcGFyZW50KSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCBwYXJlbnQgfTtcbiAgICB9XG4gICAgU2VsZWN0aW9uUmFuZ2UuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIChjYW5kaWRhdGUucGFyZW50ID09PSB1bmRlZmluZWQgfHwgU2VsZWN0aW9uUmFuZ2UuaXMoY2FuZGlkYXRlLnBhcmVudCkpO1xuICAgIH1cbiAgICBTZWxlY3Rpb25SYW5nZS5pcyA9IGlzO1xufSkoU2VsZWN0aW9uUmFuZ2UgfHwgKFNlbGVjdGlvblJhbmdlID0ge30pKTtcbi8qKlxuICogQSBzZXQgb2YgcHJlZGVmaW5lZCB0b2tlbiB0eXBlcy4gVGhpcyBzZXQgaXMgbm90IGZpeGVkXG4gKiBhbiBjbGllbnRzIGNhbiBzcGVjaWZ5IGFkZGl0aW9uYWwgdG9rZW4gdHlwZXMgdmlhIHRoZVxuICogY29ycmVzcG9uZGluZyBjbGllbnQgY2FwYWJpbGl0aWVzLlxuICpcbiAqIEBzaW5jZSAzLjE2LjBcbiAqL1xuZXhwb3J0IHZhciBTZW1hbnRpY1Rva2VuVHlwZXM7XG4oZnVuY3Rpb24gKFNlbWFudGljVG9rZW5UeXBlcykge1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcIm5hbWVzcGFjZVwiXSA9IFwibmFtZXNwYWNlXCI7XG4gICAgLyoqXG4gICAgICogUmVwcmVzZW50cyBhIGdlbmVyaWMgdHlwZS4gQWN0cyBhcyBhIGZhbGxiYWNrIGZvciB0eXBlcyB3aGljaCBjYW4ndCBiZSBtYXBwZWQgdG9cbiAgICAgKiBhIHNwZWNpZmljIHR5cGUgbGlrZSBjbGFzcyBvciBlbnVtLlxuICAgICAqL1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInR5cGVcIl0gPSBcInR5cGVcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJjbGFzc1wiXSA9IFwiY2xhc3NcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJlbnVtXCJdID0gXCJlbnVtXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wiaW50ZXJmYWNlXCJdID0gXCJpbnRlcmZhY2VcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJzdHJ1Y3RcIl0gPSBcInN0cnVjdFwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInR5cGVQYXJhbWV0ZXJcIl0gPSBcInR5cGVQYXJhbWV0ZXJcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJwYXJhbWV0ZXJcIl0gPSBcInBhcmFtZXRlclwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInZhcmlhYmxlXCJdID0gXCJ2YXJpYWJsZVwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInByb3BlcnR5XCJdID0gXCJwcm9wZXJ0eVwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImVudW1NZW1iZXJcIl0gPSBcImVudW1NZW1iZXJcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJldmVudFwiXSA9IFwiZXZlbnRcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJmdW5jdGlvblwiXSA9IFwiZnVuY3Rpb25cIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJtZXRob2RcIl0gPSBcIm1ldGhvZFwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcIm1hY3JvXCJdID0gXCJtYWNyb1wiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImtleXdvcmRcIl0gPSBcImtleXdvcmRcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJtb2RpZmllclwiXSA9IFwibW9kaWZpZXJcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJjb21tZW50XCJdID0gXCJjb21tZW50XCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wic3RyaW5nXCJdID0gXCJzdHJpbmdcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJudW1iZXJcIl0gPSBcIm51bWJlclwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInJlZ2V4cFwiXSA9IFwicmVnZXhwXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wib3BlcmF0b3JcIl0gPSBcIm9wZXJhdG9yXCI7XG4gICAgLyoqXG4gICAgICogQHNpbmNlIDMuMTcuMFxuICAgICAqL1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImRlY29yYXRvclwiXSA9IFwiZGVjb3JhdG9yXCI7XG59KShTZW1hbnRpY1Rva2VuVHlwZXMgfHwgKFNlbWFudGljVG9rZW5UeXBlcyA9IHt9KSk7XG4vKipcbiAqIEEgc2V0IG9mIHByZWRlZmluZWQgdG9rZW4gbW9kaWZpZXJzLiBUaGlzIHNldCBpcyBub3QgZml4ZWRcbiAqIGFuIGNsaWVudHMgY2FuIHNwZWNpZnkgYWRkaXRpb25hbCB0b2tlbiB0eXBlcyB2aWEgdGhlXG4gKiBjb3JyZXNwb25kaW5nIGNsaWVudCBjYXBhYmlsaXRpZXMuXG4gKlxuICogQHNpbmNlIDMuMTYuMFxuICovXG5leHBvcnQgdmFyIFNlbWFudGljVG9rZW5Nb2RpZmllcnM7XG4oZnVuY3Rpb24gKFNlbWFudGljVG9rZW5Nb2RpZmllcnMpIHtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wiZGVjbGFyYXRpb25cIl0gPSBcImRlY2xhcmF0aW9uXCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcImRlZmluaXRpb25cIl0gPSBcImRlZmluaXRpb25cIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wicmVhZG9ubHlcIl0gPSBcInJlYWRvbmx5XCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcInN0YXRpY1wiXSA9IFwic3RhdGljXCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcImRlcHJlY2F0ZWRcIl0gPSBcImRlcHJlY2F0ZWRcIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wiYWJzdHJhY3RcIl0gPSBcImFic3RyYWN0XCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcImFzeW5jXCJdID0gXCJhc3luY1wiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJtb2RpZmljYXRpb25cIl0gPSBcIm1vZGlmaWNhdGlvblwiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJkb2N1bWVudGF0aW9uXCJdID0gXCJkb2N1bWVudGF0aW9uXCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcImRlZmF1bHRMaWJyYXJ5XCJdID0gXCJkZWZhdWx0TGlicmFyeVwiO1xufSkoU2VtYW50aWNUb2tlbk1vZGlmaWVycyB8fCAoU2VtYW50aWNUb2tlbk1vZGlmaWVycyA9IHt9KSk7XG4vKipcbiAqIEBzaW5jZSAzLjE2LjBcbiAqL1xuZXhwb3J0IHZhciBTZW1hbnRpY1Rva2VucztcbihmdW5jdGlvbiAoU2VtYW50aWNUb2tlbnMpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiAoY2FuZGlkYXRlLnJlc3VsdElkID09PSB1bmRlZmluZWQgfHwgdHlwZW9mIGNhbmRpZGF0ZS5yZXN1bHRJZCA9PT0gJ3N0cmluZycpICYmXG4gICAgICAgICAgICBBcnJheS5pc0FycmF5KGNhbmRpZGF0ZS5kYXRhKSAmJiAoY2FuZGlkYXRlLmRhdGEubGVuZ3RoID09PSAwIHx8IHR5cGVvZiBjYW5kaWRhdGUuZGF0YVswXSA9PT0gJ251bWJlcicpO1xuICAgIH1cbiAgICBTZW1hbnRpY1Rva2Vucy5pcyA9IGlzO1xufSkoU2VtYW50aWNUb2tlbnMgfHwgKFNlbWFudGljVG9rZW5zID0ge30pKTtcbi8qKlxuICogVGhlIElubGluZVZhbHVlVGV4dCBuYW1lc3BhY2UgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCBJbmxpbmVWYWx1ZVRleHRzLlxuICpcbiAqIEBzaW5jZSAzLjE3LjBcbiAqL1xuZXhwb3J0IHZhciBJbmxpbmVWYWx1ZVRleHQ7XG4oZnVuY3Rpb24gKElubGluZVZhbHVlVGV4dCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgSW5saW5lVmFsdWVUZXh0IGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCB0ZXh0KSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCB0ZXh0IH07XG4gICAgfVxuICAgIElubGluZVZhbHVlVGV4dC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgIT09IHVuZGVmaW5lZCAmJiBjYW5kaWRhdGUgIT09IG51bGwgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnRleHQpO1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZVRleHQuaXMgPSBpcztcbn0pKElubGluZVZhbHVlVGV4dCB8fCAoSW5saW5lVmFsdWVUZXh0ID0ge30pKTtcbi8qKlxuICogVGhlIElubGluZVZhbHVlVmFyaWFibGVMb29rdXAgbmFtZXNwYWNlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGggSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cHMuXG4gKlxuICogQHNpbmNlIDMuMTcuMFxuICovXG5leHBvcnQgdmFyIElubGluZVZhbHVlVmFyaWFibGVMb29rdXA7XG4oZnVuY3Rpb24gKElubGluZVZhbHVlVmFyaWFibGVMb29rdXApIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IElubGluZVZhbHVlVGV4dCBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgdmFyaWFibGVOYW1lLCBjYXNlU2Vuc2l0aXZlTG9va3VwKSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCB2YXJpYWJsZU5hbWUsIGNhc2VTZW5zaXRpdmVMb29rdXAgfTtcbiAgICB9XG4gICAgSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgIT09IHVuZGVmaW5lZCAmJiBjYW5kaWRhdGUgIT09IG51bGwgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiBJcy5ib29sZWFuKGNhbmRpZGF0ZS5jYXNlU2Vuc2l0aXZlTG9va3VwKVxuICAgICAgICAgICAgJiYgKElzLnN0cmluZyhjYW5kaWRhdGUudmFyaWFibGVOYW1lKSB8fCBjYW5kaWRhdGUudmFyaWFibGVOYW1lID09PSB1bmRlZmluZWQpO1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwLmlzID0gaXM7XG59KShJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwIHx8IChJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwID0ge30pKTtcbi8qKlxuICogVGhlIElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uIG5hbWVzcGFjZSBwcm92aWRlcyBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uLlxuICpcbiAqIEBzaW5jZSAzLjE3LjBcbiAqL1xuZXhwb3J0IHZhciBJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbjtcbihmdW5jdGlvbiAoSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCBleHByZXNzaW9uKSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCBleHByZXNzaW9uIH07XG4gICAgfVxuICAgIElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAhPT0gdW5kZWZpbmVkICYmIGNhbmRpZGF0ZSAhPT0gbnVsbCAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpXG4gICAgICAgICAgICAmJiAoSXMuc3RyaW5nKGNhbmRpZGF0ZS5leHByZXNzaW9uKSB8fCBjYW5kaWRhdGUuZXhwcmVzc2lvbiA9PT0gdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24uaXMgPSBpcztcbn0pKElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uIHx8IChJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbiA9IHt9KSk7XG4vKipcbiAqIFRoZSBJbmxpbmVWYWx1ZUNvbnRleHQgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgSW5saW5lVmFsdWVDb250ZXh0fSBsaXRlcmFscy5cbiAqXG4gKiBAc2luY2UgMy4xNy4wXG4gKi9cbmV4cG9ydCB2YXIgSW5saW5lVmFsdWVDb250ZXh0O1xuKGZ1bmN0aW9uIChJbmxpbmVWYWx1ZUNvbnRleHQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IElubGluZVZhbHVlQ29udGV4dCBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShmcmFtZUlkLCBzdG9wcGVkTG9jYXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHsgZnJhbWVJZCwgc3RvcHBlZExvY2F0aW9uIH07XG4gICAgfVxuICAgIElubGluZVZhbHVlQ29udGV4dC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBJbmxpbmVWYWx1ZUNvbnRleHR9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyh2YWx1ZS5zdG9wcGVkTG9jYXRpb24pO1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZUNvbnRleHQuaXMgPSBpcztcbn0pKElubGluZVZhbHVlQ29udGV4dCB8fCAoSW5saW5lVmFsdWVDb250ZXh0ID0ge30pKTtcbi8qKlxuICogSW5sYXkgaGludCBraW5kcy5cbiAqXG4gKiBAc2luY2UgMy4xNy4wXG4gKi9cbmV4cG9ydCB2YXIgSW5sYXlIaW50S2luZDtcbihmdW5jdGlvbiAoSW5sYXlIaW50S2luZCkge1xuICAgIC8qKlxuICAgICAqIEFuIGlubGF5IGhpbnQgdGhhdCBmb3IgYSB0eXBlIGFubm90YXRpb24uXG4gICAgICovXG4gICAgSW5sYXlIaW50S2luZC5UeXBlID0gMTtcbiAgICAvKipcbiAgICAgKiBBbiBpbmxheSBoaW50IHRoYXQgaXMgZm9yIGEgcGFyYW1ldGVyLlxuICAgICAqL1xuICAgIElubGF5SGludEtpbmQuUGFyYW1ldGVyID0gMjtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWUgPT09IDEgfHwgdmFsdWUgPT09IDI7XG4gICAgfVxuICAgIElubGF5SGludEtpbmQuaXMgPSBpcztcbn0pKElubGF5SGludEtpbmQgfHwgKElubGF5SGludEtpbmQgPSB7fSkpO1xuZXhwb3J0IHZhciBJbmxheUhpbnRMYWJlbFBhcnQ7XG4oZnVuY3Rpb24gKElubGF5SGludExhYmVsUGFydCkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh2YWx1ZSkge1xuICAgICAgICByZXR1cm4geyB2YWx1ZSB9O1xuICAgIH1cbiAgICBJbmxheUhpbnRMYWJlbFBhcnQuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLnRvb2x0aXAgPT09IHVuZGVmaW5lZCB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLnRvb2x0aXApIHx8IE1hcmt1cENvbnRlbnQuaXMoY2FuZGlkYXRlLnRvb2x0aXApKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS5sb2NhdGlvbiA9PT0gdW5kZWZpbmVkIHx8IExvY2F0aW9uLmlzKGNhbmRpZGF0ZS5sb2NhdGlvbikpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLmNvbW1hbmQgPT09IHVuZGVmaW5lZCB8fCBDb21tYW5kLmlzKGNhbmRpZGF0ZS5jb21tYW5kKSk7XG4gICAgfVxuICAgIElubGF5SGludExhYmVsUGFydC5pcyA9IGlzO1xufSkoSW5sYXlIaW50TGFiZWxQYXJ0IHx8IChJbmxheUhpbnRMYWJlbFBhcnQgPSB7fSkpO1xuZXhwb3J0IHZhciBJbmxheUhpbnQ7XG4oZnVuY3Rpb24gKElubGF5SGludCkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShwb3NpdGlvbiwgbGFiZWwsIGtpbmQpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0geyBwb3NpdGlvbiwgbGFiZWwgfTtcbiAgICAgICAgaWYgKGtpbmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmtpbmQgPSBraW5kO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIElubGF5SGludC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgUG9zaXRpb24uaXMoY2FuZGlkYXRlLnBvc2l0aW9uKVxuICAgICAgICAgICAgJiYgKElzLnN0cmluZyhjYW5kaWRhdGUubGFiZWwpIHx8IElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLmxhYmVsLCBJbmxheUhpbnRMYWJlbFBhcnQuaXMpKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS5raW5kID09PSB1bmRlZmluZWQgfHwgSW5sYXlIaW50S2luZC5pcyhjYW5kaWRhdGUua2luZCkpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLnRleHRFZGl0cyA9PT0gdW5kZWZpbmVkKSB8fCBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS50ZXh0RWRpdHMsIFRleHRFZGl0LmlzKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS50b29sdGlwID09PSB1bmRlZmluZWQgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS50b29sdGlwKSB8fCBNYXJrdXBDb250ZW50LmlzKGNhbmRpZGF0ZS50b29sdGlwKSlcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUucGFkZGluZ0xlZnQgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5wYWRkaW5nTGVmdCkpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLnBhZGRpbmdSaWdodCA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLnBhZGRpbmdSaWdodCkpO1xuICAgIH1cbiAgICBJbmxheUhpbnQuaXMgPSBpcztcbn0pKElubGF5SGludCB8fCAoSW5sYXlIaW50ID0ge30pKTtcbmV4cG9ydCB2YXIgU3RyaW5nVmFsdWU7XG4oZnVuY3Rpb24gKFN0cmluZ1ZhbHVlKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlU25pcHBldCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4geyBraW5kOiAnc25pcHBldCcsIHZhbHVlIH07XG4gICAgfVxuICAgIFN0cmluZ1ZhbHVlLmNyZWF0ZVNuaXBwZXQgPSBjcmVhdGVTbmlwcGV0O1xufSkoU3RyaW5nVmFsdWUgfHwgKFN0cmluZ1ZhbHVlID0ge30pKTtcbmV4cG9ydCB2YXIgSW5saW5lQ29tcGxldGlvbkl0ZW07XG4oZnVuY3Rpb24gKElubGluZUNvbXBsZXRpb25JdGVtKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKGluc2VydFRleHQsIGZpbHRlclRleHQsIHJhbmdlLCBjb21tYW5kKSB7XG4gICAgICAgIHJldHVybiB7IGluc2VydFRleHQsIGZpbHRlclRleHQsIHJhbmdlLCBjb21tYW5kIH07XG4gICAgfVxuICAgIElubGluZUNvbXBsZXRpb25JdGVtLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKElubGluZUNvbXBsZXRpb25JdGVtIHx8IChJbmxpbmVDb21wbGV0aW9uSXRlbSA9IHt9KSk7XG5leHBvcnQgdmFyIElubGluZUNvbXBsZXRpb25MaXN0O1xuKGZ1bmN0aW9uIChJbmxpbmVDb21wbGV0aW9uTGlzdCkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShpdGVtcykge1xuICAgICAgICByZXR1cm4geyBpdGVtcyB9O1xuICAgIH1cbiAgICBJbmxpbmVDb21wbGV0aW9uTGlzdC5jcmVhdGUgPSBjcmVhdGU7XG59KShJbmxpbmVDb21wbGV0aW9uTGlzdCB8fCAoSW5saW5lQ29tcGxldGlvbkxpc3QgPSB7fSkpO1xuLyoqXG4gKiBEZXNjcmliZXMgaG93IGFuIHtAbGluayBJbmxpbmVDb21wbGV0aW9uSXRlbVByb3ZpZGVyIGlubGluZSBjb21wbGV0aW9uIHByb3ZpZGVyfSB3YXMgdHJpZ2dlcmVkLlxuICpcbiAqIEBzaW5jZSAzLjE4LjBcbiAqIEBwcm9wb3NlZFxuICovXG5leHBvcnQgdmFyIElubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZDtcbihmdW5jdGlvbiAoSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kKSB7XG4gICAgLyoqXG4gICAgICogQ29tcGxldGlvbiB3YXMgdHJpZ2dlcmVkIGV4cGxpY2l0bHkgYnkgYSB1c2VyIGdlc3R1cmUuXG4gICAgICovXG4gICAgSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kLkludm9rZWQgPSAwO1xuICAgIC8qKlxuICAgICAqIENvbXBsZXRpb24gd2FzIHRyaWdnZXJlZCBhdXRvbWF0aWNhbGx5IHdoaWxlIGVkaXRpbmcuXG4gICAgICovXG4gICAgSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kLkF1dG9tYXRpYyA9IDE7XG59KShJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmQgfHwgKElubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZCA9IHt9KSk7XG5leHBvcnQgdmFyIFNlbGVjdGVkQ29tcGxldGlvbkluZm87XG4oZnVuY3Rpb24gKFNlbGVjdGVkQ29tcGxldGlvbkluZm8pIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIHRleHQpIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIHRleHQgfTtcbiAgICB9XG4gICAgU2VsZWN0ZWRDb21wbGV0aW9uSW5mby5jcmVhdGUgPSBjcmVhdGU7XG59KShTZWxlY3RlZENvbXBsZXRpb25JbmZvIHx8IChTZWxlY3RlZENvbXBsZXRpb25JbmZvID0ge30pKTtcbmV4cG9ydCB2YXIgSW5saW5lQ29tcGxldGlvbkNvbnRleHQ7XG4oZnVuY3Rpb24gKElubGluZUNvbXBsZXRpb25Db250ZXh0KSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKHRyaWdnZXJLaW5kLCBzZWxlY3RlZENvbXBsZXRpb25JbmZvKSB7XG4gICAgICAgIHJldHVybiB7IHRyaWdnZXJLaW5kLCBzZWxlY3RlZENvbXBsZXRpb25JbmZvIH07XG4gICAgfVxuICAgIElubGluZUNvbXBsZXRpb25Db250ZXh0LmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKElubGluZUNvbXBsZXRpb25Db250ZXh0IHx8IChJbmxpbmVDb21wbGV0aW9uQ29udGV4dCA9IHt9KSk7XG5leHBvcnQgdmFyIFdvcmtzcGFjZUZvbGRlcjtcbihmdW5jdGlvbiAoV29ya3NwYWNlRm9sZGVyKSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgVVJJLmlzKGNhbmRpZGF0ZS51cmkpICYmIElzLnN0cmluZyhjYW5kaWRhdGUubmFtZSk7XG4gICAgfVxuICAgIFdvcmtzcGFjZUZvbGRlci5pcyA9IGlzO1xufSkoV29ya3NwYWNlRm9sZGVyIHx8IChXb3Jrc3BhY2VGb2xkZXIgPSB7fSkpO1xuZXhwb3J0IGNvbnN0IEVPTCA9IFsnXFxuJywgJ1xcclxcbicsICdcXHInXTtcbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHRoZSB0ZXh0IGRvY3VtZW50IGZyb20gdGhlIG5ldyB2c2NvZGUtbGFuZ3VhZ2VzZXJ2ZXItdGV4dGRvY3VtZW50IHBhY2thZ2UuXG4gKi9cbmV4cG9ydCB2YXIgVGV4dERvY3VtZW50O1xuKGZ1bmN0aW9uIChUZXh0RG9jdW1lbnQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IElUZXh0RG9jdW1lbnQgbGl0ZXJhbCBmcm9tIHRoZSBnaXZlbiB1cmkgYW5kIGNvbnRlbnQuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgZG9jdW1lbnQncyB1cmkuXG4gICAgICogQHBhcmFtIGxhbmd1YWdlSWQgVGhlIGRvY3VtZW50J3MgbGFuZ3VhZ2UgSWQuXG4gICAgICogQHBhcmFtIHZlcnNpb24gVGhlIGRvY3VtZW50J3MgdmVyc2lvbi5cbiAgICAgKiBAcGFyYW0gY29udGVudCBUaGUgZG9jdW1lbnQncyBjb250ZW50LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmksIGxhbmd1YWdlSWQsIHZlcnNpb24sIGNvbnRlbnQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBGdWxsVGV4dERvY3VtZW50KHVyaSwgbGFuZ3VhZ2VJZCwgdmVyc2lvbiwgY29udGVudCk7XG4gICAgfVxuICAgIFRleHREb2N1bWVudC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBJVGV4dERvY3VtZW50fSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudXJpKSAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5sYW5ndWFnZUlkKSB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLmxhbmd1YWdlSWQpKSAmJiBJcy51aW50ZWdlcihjYW5kaWRhdGUubGluZUNvdW50KVxuICAgICAgICAgICAgJiYgSXMuZnVuYyhjYW5kaWRhdGUuZ2V0VGV4dCkgJiYgSXMuZnVuYyhjYW5kaWRhdGUucG9zaXRpb25BdCkgJiYgSXMuZnVuYyhjYW5kaWRhdGUub2Zmc2V0QXQpID8gdHJ1ZSA6IGZhbHNlO1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnQuaXMgPSBpcztcbiAgICBmdW5jdGlvbiBhcHBseUVkaXRzKGRvY3VtZW50LCBlZGl0cykge1xuICAgICAgICBsZXQgdGV4dCA9IGRvY3VtZW50LmdldFRleHQoKTtcbiAgICAgICAgbGV0IHNvcnRlZEVkaXRzID0gbWVyZ2VTb3J0KGVkaXRzLCAoYSwgYikgPT4ge1xuICAgICAgICAgICAgbGV0IGRpZmYgPSBhLnJhbmdlLnN0YXJ0LmxpbmUgLSBiLnJhbmdlLnN0YXJ0LmxpbmU7XG4gICAgICAgICAgICBpZiAoZGlmZiA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBhLnJhbmdlLnN0YXJ0LmNoYXJhY3RlciAtIGIucmFuZ2Uuc3RhcnQuY2hhcmFjdGVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGRpZmY7XG4gICAgICAgIH0pO1xuICAgICAgICBsZXQgbGFzdE1vZGlmaWVkT2Zmc2V0ID0gdGV4dC5sZW5ndGg7XG4gICAgICAgIGZvciAobGV0IGkgPSBzb3J0ZWRFZGl0cy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkge1xuICAgICAgICAgICAgbGV0IGUgPSBzb3J0ZWRFZGl0c1tpXTtcbiAgICAgICAgICAgIGxldCBzdGFydE9mZnNldCA9IGRvY3VtZW50Lm9mZnNldEF0KGUucmFuZ2Uuc3RhcnQpO1xuICAgICAgICAgICAgbGV0IGVuZE9mZnNldCA9IGRvY3VtZW50Lm9mZnNldEF0KGUucmFuZ2UuZW5kKTtcbiAgICAgICAgICAgIGlmIChlbmRPZmZzZXQgPD0gbGFzdE1vZGlmaWVkT2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgdGV4dCA9IHRleHQuc3Vic3RyaW5nKDAsIHN0YXJ0T2Zmc2V0KSArIGUubmV3VGV4dCArIHRleHQuc3Vic3RyaW5nKGVuZE9mZnNldCwgdGV4dC5sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdPdmVybGFwcGluZyBlZGl0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsYXN0TW9kaWZpZWRPZmZzZXQgPSBzdGFydE9mZnNldDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50LmFwcGx5RWRpdHMgPSBhcHBseUVkaXRzO1xuICAgIGZ1bmN0aW9uIG1lcmdlU29ydChkYXRhLCBjb21wYXJlKSB7XG4gICAgICAgIGlmIChkYXRhLmxlbmd0aCA8PSAxKSB7XG4gICAgICAgICAgICAvLyBzb3J0ZWRcbiAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHAgPSAoZGF0YS5sZW5ndGggLyAyKSB8IDA7XG4gICAgICAgIGNvbnN0IGxlZnQgPSBkYXRhLnNsaWNlKDAsIHApO1xuICAgICAgICBjb25zdCByaWdodCA9IGRhdGEuc2xpY2UocCk7XG4gICAgICAgIG1lcmdlU29ydChsZWZ0LCBjb21wYXJlKTtcbiAgICAgICAgbWVyZ2VTb3J0KHJpZ2h0LCBjb21wYXJlKTtcbiAgICAgICAgbGV0IGxlZnRJZHggPSAwO1xuICAgICAgICBsZXQgcmlnaHRJZHggPSAwO1xuICAgICAgICBsZXQgaSA9IDA7XG4gICAgICAgIHdoaWxlIChsZWZ0SWR4IDwgbGVmdC5sZW5ndGggJiYgcmlnaHRJZHggPCByaWdodC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGxldCByZXQgPSBjb21wYXJlKGxlZnRbbGVmdElkeF0sIHJpZ2h0W3JpZ2h0SWR4XSk7XG4gICAgICAgICAgICBpZiAocmV0IDw9IDApIHtcbiAgICAgICAgICAgICAgICAvLyBzbWFsbGVyX2VxdWFsIC0+IHRha2UgbGVmdCB0byBwcmVzZXJ2ZSBvcmRlclxuICAgICAgICAgICAgICAgIGRhdGFbaSsrXSA9IGxlZnRbbGVmdElkeCsrXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIGdyZWF0ZXIgLT4gdGFrZSByaWdodFxuICAgICAgICAgICAgICAgIGRhdGFbaSsrXSA9IHJpZ2h0W3JpZ2h0SWR4KytdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChsZWZ0SWR4IDwgbGVmdC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRhdGFbaSsrXSA9IGxlZnRbbGVmdElkeCsrXTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAocmlnaHRJZHggPCByaWdodC5sZW5ndGgpIHtcbiAgICAgICAgICAgIGRhdGFbaSsrXSA9IHJpZ2h0W3JpZ2h0SWR4KytdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkYXRhO1xuICAgIH1cbn0pKFRleHREb2N1bWVudCB8fCAoVGV4dERvY3VtZW50ID0ge30pKTtcbi8qKlxuICogQGRlcHJlY2F0ZWQgVXNlIHRoZSB0ZXh0IGRvY3VtZW50IGZyb20gdGhlIG5ldyB2c2NvZGUtbGFuZ3VhZ2VzZXJ2ZXItdGV4dGRvY3VtZW50IHBhY2thZ2UuXG4gKi9cbmNsYXNzIEZ1bGxUZXh0RG9jdW1lbnQge1xuICAgIGNvbnN0cnVjdG9yKHVyaSwgbGFuZ3VhZ2VJZCwgdmVyc2lvbiwgY29udGVudCkge1xuICAgICAgICB0aGlzLl91cmkgPSB1cmk7XG4gICAgICAgIHRoaXMuX2xhbmd1YWdlSWQgPSBsYW5ndWFnZUlkO1xuICAgICAgICB0aGlzLl92ZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgICAgdGhpcy5fY29udGVudCA9IGNvbnRlbnQ7XG4gICAgICAgIHRoaXMuX2xpbmVPZmZzZXRzID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBnZXQgdXJpKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdXJpO1xuICAgIH1cbiAgICBnZXQgbGFuZ3VhZ2VJZCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2xhbmd1YWdlSWQ7XG4gICAgfVxuICAgIGdldCB2ZXJzaW9uKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdmVyc2lvbjtcbiAgICB9XG4gICAgZ2V0VGV4dChyYW5nZSkge1xuICAgICAgICBpZiAocmFuZ2UpIHtcbiAgICAgICAgICAgIGxldCBzdGFydCA9IHRoaXMub2Zmc2V0QXQocmFuZ2Uuc3RhcnQpO1xuICAgICAgICAgICAgbGV0IGVuZCA9IHRoaXMub2Zmc2V0QXQocmFuZ2UuZW5kKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb250ZW50LnN1YnN0cmluZyhzdGFydCwgZW5kKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fY29udGVudDtcbiAgICB9XG4gICAgdXBkYXRlKGV2ZW50LCB2ZXJzaW9uKSB7XG4gICAgICAgIHRoaXMuX2NvbnRlbnQgPSBldmVudC50ZXh0O1xuICAgICAgICB0aGlzLl92ZXJzaW9uID0gdmVyc2lvbjtcbiAgICAgICAgdGhpcy5fbGluZU9mZnNldHMgPSB1bmRlZmluZWQ7XG4gICAgfVxuICAgIGdldExpbmVPZmZzZXRzKCkge1xuICAgICAgICBpZiAodGhpcy5fbGluZU9mZnNldHMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgbGV0IGxpbmVPZmZzZXRzID0gW107XG4gICAgICAgICAgICBsZXQgdGV4dCA9IHRoaXMuX2NvbnRlbnQ7XG4gICAgICAgICAgICBsZXQgaXNMaW5lU3RhcnQgPSB0cnVlO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgaWYgKGlzTGluZVN0YXJ0KSB7XG4gICAgICAgICAgICAgICAgICAgIGxpbmVPZmZzZXRzLnB1c2goaSk7XG4gICAgICAgICAgICAgICAgICAgIGlzTGluZVN0YXJ0ID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBjaCA9IHRleHQuY2hhckF0KGkpO1xuICAgICAgICAgICAgICAgIGlzTGluZVN0YXJ0ID0gKGNoID09PSAnXFxyJyB8fCBjaCA9PT0gJ1xcbicpO1xuICAgICAgICAgICAgICAgIGlmIChjaCA9PT0gJ1xccicgJiYgaSArIDEgPCB0ZXh0Lmxlbmd0aCAmJiB0ZXh0LmNoYXJBdChpICsgMSkgPT09ICdcXG4nKSB7XG4gICAgICAgICAgICAgICAgICAgIGkrKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoaXNMaW5lU3RhcnQgJiYgdGV4dC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbGluZU9mZnNldHMucHVzaCh0ZXh0Lmxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLl9saW5lT2Zmc2V0cyA9IGxpbmVPZmZzZXRzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9saW5lT2Zmc2V0cztcbiAgICB9XG4gICAgcG9zaXRpb25BdChvZmZzZXQpIHtcbiAgICAgICAgb2Zmc2V0ID0gTWF0aC5tYXgoTWF0aC5taW4ob2Zmc2V0LCB0aGlzLl9jb250ZW50Lmxlbmd0aCksIDApO1xuICAgICAgICBsZXQgbGluZU9mZnNldHMgPSB0aGlzLmdldExpbmVPZmZzZXRzKCk7XG4gICAgICAgIGxldCBsb3cgPSAwLCBoaWdoID0gbGluZU9mZnNldHMubGVuZ3RoO1xuICAgICAgICBpZiAoaGlnaCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFBvc2l0aW9uLmNyZWF0ZSgwLCBvZmZzZXQpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChsb3cgPCBoaWdoKSB7XG4gICAgICAgICAgICBsZXQgbWlkID0gTWF0aC5mbG9vcigobG93ICsgaGlnaCkgLyAyKTtcbiAgICAgICAgICAgIGlmIChsaW5lT2Zmc2V0c1ttaWRdID4gb2Zmc2V0KSB7XG4gICAgICAgICAgICAgICAgaGlnaCA9IG1pZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvdyA9IG1pZCArIDE7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gbG93IGlzIHRoZSBsZWFzdCB4IGZvciB3aGljaCB0aGUgbGluZSBvZmZzZXQgaXMgbGFyZ2VyIHRoYW4gdGhlIGN1cnJlbnQgb2Zmc2V0XG4gICAgICAgIC8vIG9yIGFycmF5Lmxlbmd0aCBpZiBubyBsaW5lIG9mZnNldCBpcyBsYXJnZXIgdGhhbiB0aGUgY3VycmVudCBvZmZzZXRcbiAgICAgICAgbGV0IGxpbmUgPSBsb3cgLSAxO1xuICAgICAgICByZXR1cm4gUG9zaXRpb24uY3JlYXRlKGxpbmUsIG9mZnNldCAtIGxpbmVPZmZzZXRzW2xpbmVdKTtcbiAgICB9XG4gICAgb2Zmc2V0QXQocG9zaXRpb24pIHtcbiAgICAgICAgbGV0IGxpbmVPZmZzZXRzID0gdGhpcy5nZXRMaW5lT2Zmc2V0cygpO1xuICAgICAgICBpZiAocG9zaXRpb24ubGluZSA+PSBsaW5lT2Zmc2V0cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl9jb250ZW50Lmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChwb3NpdGlvbi5saW5lIDwgMCkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGxpbmVPZmZzZXQgPSBsaW5lT2Zmc2V0c1twb3NpdGlvbi5saW5lXTtcbiAgICAgICAgbGV0IG5leHRMaW5lT2Zmc2V0ID0gKHBvc2l0aW9uLmxpbmUgKyAxIDwgbGluZU9mZnNldHMubGVuZ3RoKSA/IGxpbmVPZmZzZXRzW3Bvc2l0aW9uLmxpbmUgKyAxXSA6IHRoaXMuX2NvbnRlbnQubGVuZ3RoO1xuICAgICAgICByZXR1cm4gTWF0aC5tYXgoTWF0aC5taW4obGluZU9mZnNldCArIHBvc2l0aW9uLmNoYXJhY3RlciwgbmV4dExpbmVPZmZzZXQpLCBsaW5lT2Zmc2V0KTtcbiAgICB9XG4gICAgZ2V0IGxpbmVDb3VudCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0TGluZU9mZnNldHMoKS5sZW5ndGg7XG4gICAgfVxufVxudmFyIElzO1xuKGZ1bmN0aW9uIChJcykge1xuICAgIGNvbnN0IHRvU3RyaW5nID0gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztcbiAgICBmdW5jdGlvbiBkZWZpbmVkKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgIT09ICd1bmRlZmluZWQnO1xuICAgIH1cbiAgICBJcy5kZWZpbmVkID0gZGVmaW5lZDtcbiAgICBmdW5jdGlvbiB1bmRlZmluZWQodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3VuZGVmaW5lZCc7XG4gICAgfVxuICAgIElzLnVuZGVmaW5lZCA9IHVuZGVmaW5lZDtcbiAgICBmdW5jdGlvbiBib29sZWFuKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB2YWx1ZSA9PT0gdHJ1ZSB8fCB2YWx1ZSA9PT0gZmFsc2U7XG4gICAgfVxuICAgIElzLmJvb2xlYW4gPSBib29sZWFuO1xuICAgIGZ1bmN0aW9uIHN0cmluZyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IFN0cmluZ10nO1xuICAgIH1cbiAgICBJcy5zdHJpbmcgPSBzdHJpbmc7XG4gICAgZnVuY3Rpb24gbnVtYmVyKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgTnVtYmVyXSc7XG4gICAgfVxuICAgIElzLm51bWJlciA9IG51bWJlcjtcbiAgICBmdW5jdGlvbiBudW1iZXJSYW5nZSh2YWx1ZSwgbWluLCBtYXgpIHtcbiAgICAgICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBOdW1iZXJdJyAmJiBtaW4gPD0gdmFsdWUgJiYgdmFsdWUgPD0gbWF4O1xuICAgIH1cbiAgICBJcy5udW1iZXJSYW5nZSA9IG51bWJlclJhbmdlO1xuICAgIGZ1bmN0aW9uIGludGVnZXIodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBOdW1iZXJdJyAmJiAtMjE0NzQ4MzY0OCA8PSB2YWx1ZSAmJiB2YWx1ZSA8PSAyMTQ3NDgzNjQ3O1xuICAgIH1cbiAgICBJcy5pbnRlZ2VyID0gaW50ZWdlcjtcbiAgICBmdW5jdGlvbiB1aW50ZWdlcih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IE51bWJlcl0nICYmIDAgPD0gdmFsdWUgJiYgdmFsdWUgPD0gMjE0NzQ4MzY0NztcbiAgICB9XG4gICAgSXMudWludGVnZXIgPSB1aW50ZWdlcjtcbiAgICBmdW5jdGlvbiBmdW5jKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgRnVuY3Rpb25dJztcbiAgICB9XG4gICAgSXMuZnVuYyA9IGZ1bmM7XG4gICAgZnVuY3Rpb24gb2JqZWN0TGl0ZXJhbCh2YWx1ZSkge1xuICAgICAgICAvLyBTdHJpY3RseSBzcGVha2luZyBjbGFzcyBpbnN0YW5jZXMgcGFzcyB0aGlzIGNoZWNrIGFzIHdlbGwuIFNpbmNlIHRoZSBMU1BcbiAgICAgICAgLy8gZG9lc24ndCB1c2UgY2xhc3NlcyB3ZSBpZ25vcmUgdGhpcyBmb3Igbm93LiBJZiB3ZSBkbyB3ZSBuZWVkIHRvIGFkZCBzb21ldGhpbmdcbiAgICAgICAgLy8gbGlrZSB0aGlzOiBgT2JqZWN0LmdldFByb3RvdHlwZU9mKE9iamVjdC5nZXRQcm90b3R5cGVPZih4KSkgPT09IG51bGxgXG4gICAgICAgIHJldHVybiB2YWx1ZSAhPT0gbnVsbCAmJiB0eXBlb2YgdmFsdWUgPT09ICdvYmplY3QnO1xuICAgIH1cbiAgICBJcy5vYmplY3RMaXRlcmFsID0gb2JqZWN0TGl0ZXJhbDtcbiAgICBmdW5jdGlvbiB0eXBlZEFycmF5KHZhbHVlLCBjaGVjaykge1xuICAgICAgICByZXR1cm4gQXJyYXkuaXNBcnJheSh2YWx1ZSkgJiYgdmFsdWUuZXZlcnkoY2hlY2spO1xuICAgIH1cbiAgICBJcy50eXBlZEFycmF5ID0gdHlwZWRBcnJheTtcbn0pKElzIHx8IChJcyA9IHt9KSk7XG4iXSwKICAibWFwcGluZ3MiOiAiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUFBQTtBQUFBO0FBQUE7QUFLQSxhQUFPLGVBQWUsU0FBUyxjQUFjLEVBQUUsT0FBTyxL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QUs7QUFBQSxRQUN4Qyx5QkFBeUIsRUFBRSxTQUFTLEtBQUs7QUFBQSxNQUM3QztBQUFBLElBQ0o7QUFBQSxFQUNKOyIsCiAgIm5hbWVzIjogWyJFcnJvckNvZGVzIiwgIk1lc3NhZ2UiLCAiVG91Y2giLCAiRGlzcG9zYWJsZSIsICJSQUwiLCAiRXZlbnQiLCAiSXMiLCAiQ2FuY2VsbGF0aW9uVG9rZW4iLCAiQ2FuY2VsbGF0aW9uU3RhdGUiLCAiX2Nvbm4iLCAiSXMiLCAiTWVzc2FnZVJlYWRlciIsICJBYnN0cmFjdE1lc3NhZ2VSZWFkZXIiLCAiUmVzb2x2ZWRNZXNzYWdlUmVhZGVyT3B0aW9ucyIsICJJcyIsICJNZXNzYWdlV3JpdGVyIiwgIkFic3RyYWN0TWVzc2FnZVdyaXRlciIsICJSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zIiwgInJlc3VsdCIsICJJcyIsICJDYW5jZWxOb3RpZmljYXRpb24iLCAiUHJvZ3Jlc3NUb2tlbiIsICJQcm9ncmVzc05vdGlmaWNhdGlvbiIsICJTdGFyUmVxdWVzdEhhbmRsZXIiLCAiVHJhY2UiLCAiVHJhY2VWYWx1ZXMiLCAiVHJhY2VGb3JtYXQiLCAiU2V0VHJhY2VOb3RpZmljYXRpb24iLCAiTG9nVHJhY2VOb3RpZmljYXRpb24iLCAiQ29ubmVjdGlvbkVycm9ycyIsICJDb25uZWN0aW9uU3RyYXRlZ3kiLCAiSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5IiwgIlJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5IiwgIkNhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kiLCAiQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kiLCAiQ2FuY2VsbGF0aW9uU3RyYXRlZ3kiLCAiTWVzc2FnZVN0cmF0ZWd5IiwgIkNvbm5lY3Rpb25PcHRpb25zIiwgIkNvbm5lY3Rpb25TdGF0ZSIsICJjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiIsICJzdGFydFRpbWUiLCAiUklMIiwgIm0iLCAiZXhwb3J0cyIsICJjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiIsICJpbXBvcnRfdnNjb2RlX2pzb25ycGMiLCAiaW1wb3J0X3ZzY29kZV9qc29ucnBjIiwgImltcG9ydF92c2NvZGVfanNvbnJwYyIsICJpbXBvcnRfdnNjb2RlX2pzb25ycGMiLCAiRG9jdW1lbnRVcmkiLCAiVVJJIiwgImludGVnZXIiLCAidWludGVnZXIiLCAiUG9zaXRpb24iLCAiUmFuZ2UiLCAiTG9jYXRpb24iLCAiTG9jYXRpb25MaW5rIiwgIkNvbG9yIiwgIkNvbG9ySW5mb3JtYXRpb24iLCAiQ29sb3JQcmVzZW50YXRpb24iLCAiRm9sZGluZ1JhbmdlS2luZCIsICJGb2xkaW5nUmFuZ2UiLCAiRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbiIsICJsb2NhdGlvbiIsICJEaWFnbm9zdGljU2V2ZXJpdHkiLCAiRGlhZ25vc3RpY1RhZyIsICJDb2RlRGVzY3JpcHRpb24iLCAiRGlhZ25vc3RpYyIsICJDb21tYW5kIiwgIlRleHRFZGl0IiwgIkNoYW5nZUFubm90YXRpb24iLCAiQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIiLCAiQW5ub3RhdGVkVGV4dEVkaXQiLCAiVGV4dERvY3VtZW50RWRpdCIsICJDcmVhdGVGaWxlIiwgIlJlbmFtZUZpbGUiLCAiRGVsZXRlRmlsZSIsICJXb3Jrc3BhY2VFZGl0IiwgIlRleHREb2N1bWVudElkZW50aWZpZXIiLCAiVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciIsICJPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIiLCAiVGV4dERvY3VtZW50SXRlbSIsICJNYXJrdXBLaW5kIiwgIk1hcmt1cENvbnRlbnQiLCAiQ29tcGxldGlvbkl0ZW1LaW5kIiwgIkluc2VydFRleHRGb3JtYXQiLCAiQ29tcGxldGlvbkl0ZW1UYWciLCAiSW5zZXJ0UmVwbGFjZUVkaXQiLCAiUmFuZ2UiLCAiSW5zZXJ0VGV4dE1vZGUiLCAiQ29tcGxldGlvbkl0ZW1MYWJlbERldGFpbHMiLCAiQ29tcGxldGlvbkl0ZW0iLCAiQ29tcGxldGlvbkxpc3QiLCAiTWFya2VkU3RyaW5nIiwgIkhvdmVyIiwgIlBhcmFtZXRlckluZm9ybWF0aW9uIiwgIlNpZ25hdHVyZUluZm9ybWF0aW9uIiwgIkRvY3VtZW50SGlnaGxpZ2h0S2luZCIsICJEb2N1bWVudEhpZ2hsaWdodCIsICJTeW1ib2xLaW5kIiwgIlN5bWJvbFRhZyIsICJTeW1ib2xJbmZvcm1hdGlvbiIsICJXb3Jrc3BhY2VTeW1ib2wiLCAiRG9jdW1lbnRTeW1ib2wiLCAiQ29kZUFjdGlvbktpbmQiLCAiQ29kZUFjdGlvblRyaWdnZXJLaW5kIiwgIkNvZGVBY3Rpb25Db250ZXh0IiwgIkNvZGVBY3Rpb24iLCAiQ29kZUxlbnMiLCAiRm9ybWF0dGluZ09wdGlvbnMiLCAiRG9jdW1lbnRMaW5rIiwgIlNlbGVjdGlvblJhbmdlIiwgIlNlbWFudGljVG9rZW5UeXBlcyIsICJTZW1hbnRpY1Rva2VuTW9kaWZpZXJzIiwgIlNlbWFudGljVG9rZW5zIiwgIklubGluZVZhbHVlVGV4dCIsICJJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwIiwgIklubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uIiwgIklubGluZVZhbHVlQ29udGV4dCIsICJJbmxheUhpbnRLaW5kIiwgIklubGF5SGludExhYmVsUGFydCIsICJJbmxheUhpbnQiLCAiUG9zaXRpb24iLCAiU3RyaW5nVmFsdWUiLCAiSW5saW5lQ29tcGxldGlvbkl0ZW0iLCAiSW5saW5lQ29tcGxldGlvbkxpc3QiLCAiSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kIiwgIlNlbGVjdGVkQ29tcGxldGlvbkluZm8iLCAiSW5saW5lQ29tcGxldGlvbkNvbnRleHQiLCAiV29ya3NwYWNlRm9sZGVyIiwgIlRleHREb2N1bWVudCIsICJQb3NpdGlvbiIsICJJcyIsICJ1bmRlZmluZWQiLCAiaW50ZWdlciIsICJ1aW50ZWdlciIsICJtIl0KfQo= +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvY29tbW9uL2lzLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlcy5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vbGlua2VkTWFwLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9kaXNwb3NhYmxlLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9yYWwuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvY29tbW9uL2V2ZW50cy5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vY2FuY2VsbGF0aW9uLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9zaGFyZWRBcnJheUNhbmNlbGxhdGlvbi5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vc2VtYXBob3JlLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlUmVhZGVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlV3JpdGVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlQnVmZmVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9jb25uZWN0aW9uLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9hcGkuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvYnJvd3Nlci9yaWwuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvYnJvd3Nlci9tYWluLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvYnJvd3Nlci5qcyIsICJsc3AvamF2YS1sc3AtY2xpZW50LnRzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLXdzLWpzb25ycGMvc3JjL2Rpc3Bvc2FibGUudHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvc29ja2V0L3NvY2tldC50cyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS13cy1qc29ucnBjL3NyYy9zb2NrZXQvcmVhZGVyLnRzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLXdzLWpzb25ycGMvc3JjL3NvY2tldC93cml0ZXIudHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvc29ja2V0L2Nvbm5lY3Rpb24udHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvY29ubmVjdGlvbi50cyIsICJsc3AvbW9uYWNvLXNoaW0udHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtbGFuZ3VhZ2VzZXJ2ZXItdHlwZXMvbGliL2VzbS9tYWluLmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuc3RyaW5nQXJyYXkgPSBleHBvcnRzLmFycmF5ID0gZXhwb3J0cy5mdW5jID0gZXhwb3J0cy5lcnJvciA9IGV4cG9ydHMubnVtYmVyID0gZXhwb3J0cy5zdHJpbmcgPSBleHBvcnRzLmJvb2xlYW4gPSB2b2lkIDA7XG5mdW5jdGlvbiBib29sZWFuKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZTtcbn1cbmV4cG9ydHMuYm9vbGVhbiA9IGJvb2xlYW47XG5mdW5jdGlvbiBzdHJpbmcodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZztcbn1cbmV4cG9ydHMuc3RyaW5nID0gc3RyaW5nO1xuZnVuY3Rpb24gbnVtYmVyKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdmFsdWUgaW5zdGFuY2VvZiBOdW1iZXI7XG59XG5leHBvcnRzLm51bWJlciA9IG51bWJlcjtcbmZ1bmN0aW9uIGVycm9yKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgRXJyb3I7XG59XG5leHBvcnRzLmVycm9yID0gZXJyb3I7XG5mdW5jdGlvbiBmdW5jKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cbmV4cG9ydHMuZnVuYyA9IGZ1bmM7XG5mdW5jdGlvbiBhcnJheSh2YWx1ZSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cbmV4cG9ydHMuYXJyYXkgPSBhcnJheTtcbmZ1bmN0aW9uIHN0cmluZ0FycmF5KHZhbHVlKSB7XG4gICAgcmV0dXJuIGFycmF5KHZhbHVlKSAmJiB2YWx1ZS5ldmVyeShlbGVtID0+IHN0cmluZyhlbGVtKSk7XG59XG5leHBvcnRzLnN0cmluZ0FycmF5ID0gc3RyaW5nQXJyYXk7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLk1lc3NhZ2UgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU5ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlOCA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTcgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU2ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNSA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTQgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUzID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMiA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTEgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUwID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTkgPSBleHBvcnRzLlJlcXVlc3RUeXBlOCA9IGV4cG9ydHMuUmVxdWVzdFR5cGU3ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTYgPSBleHBvcnRzLlJlcXVlc3RUeXBlNSA9IGV4cG9ydHMuUmVxdWVzdFR5cGU0ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTMgPSBleHBvcnRzLlJlcXVlc3RUeXBlMiA9IGV4cG9ydHMuUmVxdWVzdFR5cGUxID0gZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IGV4cG9ydHMuUmVxdWVzdFR5cGUwID0gZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUgPSBleHBvcnRzLlBhcmFtZXRlclN0cnVjdHVyZXMgPSBleHBvcnRzLlJlc3BvbnNlRXJyb3IgPSBleHBvcnRzLkVycm9yQ29kZXMgPSB2b2lkIDA7XG5jb25zdCBpcyA9IHJlcXVpcmUoXCIuL2lzXCIpO1xuLyoqXG4gKiBQcmVkZWZpbmVkIGVycm9yIGNvZGVzLlxuICovXG52YXIgRXJyb3JDb2RlcztcbihmdW5jdGlvbiAoRXJyb3JDb2Rlcykge1xuICAgIC8vIERlZmluZWQgYnkgSlNPTiBSUENcbiAgICBFcnJvckNvZGVzLlBhcnNlRXJyb3IgPSAtMzI3MDA7XG4gICAgRXJyb3JDb2Rlcy5JbnZhbGlkUmVxdWVzdCA9IC0zMjYwMDtcbiAgICBFcnJvckNvZGVzLk1ldGhvZE5vdEZvdW5kID0gLTMyNjAxO1xuICAgIEVycm9yQ29kZXMuSW52YWxpZFBhcmFtcyA9IC0zMjYwMjtcbiAgICBFcnJvckNvZGVzLkludGVybmFsRXJyb3IgPSAtMzI2MDM7XG4gICAgLyoqXG4gICAgICogVGhpcyBpcyB0aGUgc3RhcnQgcmFuZ2Ugb2YgSlNPTiBSUEMgcmVzZXJ2ZWQgZXJyb3IgY29kZXMuXG4gICAgICogSXQgZG9lc24ndCBkZW5vdGUgYSByZWFsIGVycm9yIGNvZGUuIE5vIGFwcGxpY2F0aW9uIGVycm9yIGNvZGVzIHNob3VsZFxuICAgICAqIGJlIGRlZmluZWQgYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCByYW5nZS4gRm9yIGJhY2t3YXJkc1xuICAgICAqIGNvbXBhdGliaWxpdHkgdGhlIGBTZXJ2ZXJOb3RJbml0aWFsaXplZGAgYW5kIHRoZSBgVW5rbm93bkVycm9yQ29kZWBcbiAgICAgKiBhcmUgbGVmdCBpbiB0aGUgcmFuZ2UuXG4gICAgICpcbiAgICAgKiBAc2luY2UgMy4xNi4wXG4gICAgKi9cbiAgICBFcnJvckNvZGVzLmpzb25ycGNSZXNlcnZlZEVycm9yUmFuZ2VTdGFydCA9IC0zMjA5OTtcbiAgICAvKiogQGRlcHJlY2F0ZWQgdXNlICBqc29ucnBjUmVzZXJ2ZWRFcnJvclJhbmdlU3RhcnQgKi9cbiAgICBFcnJvckNvZGVzLnNlcnZlckVycm9yU3RhcnQgPSAtMzIwOTk7XG4gICAgLyoqXG4gICAgICogQW4gZXJyb3Igb2NjdXJyZWQgd2hlbiB3cml0ZSBhIG1lc3NhZ2UgdG8gdGhlIHRyYW5zcG9ydCBsYXllci5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLk1lc3NhZ2VXcml0ZUVycm9yID0gLTMyMDk5O1xuICAgIC8qKlxuICAgICAqIEFuIGVycm9yIG9jY3VycmVkIHdoZW4gcmVhZGluZyBhIG1lc3NhZ2UgZnJvbSB0aGUgdHJhbnNwb3J0IGxheWVyLlxuICAgICAqL1xuICAgIEVycm9yQ29kZXMuTWVzc2FnZVJlYWRFcnJvciA9IC0zMjA5ODtcbiAgICAvKipcbiAgICAgKiBUaGUgY29ubmVjdGlvbiBnb3QgZGlzcG9zZWQgb3IgbG9zdCBhbmQgYWxsIHBlbmRpbmcgcmVzcG9uc2VzIGdvdFxuICAgICAqIHJlamVjdGVkLlxuICAgICAqL1xuICAgIEVycm9yQ29kZXMuUGVuZGluZ1Jlc3BvbnNlUmVqZWN0ZWQgPSAtMzIwOTc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gaXMgaW5hY3RpdmUgYW5kIGEgdXNlIG9mIGl0IGZhaWxlZC5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLkNvbm5lY3Rpb25JbmFjdGl2ZSA9IC0zMjA5NjtcbiAgICAvKipcbiAgICAgKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBhIHNlcnZlciByZWNlaXZlZCBhIG5vdGlmaWNhdGlvbiBvclxuICAgICAqIHJlcXVlc3QgYmVmb3JlIHRoZSBzZXJ2ZXIgaGFzIHJlY2VpdmVkIHRoZSBgaW5pdGlhbGl6ZWAgcmVxdWVzdC5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLlNlcnZlck5vdEluaXRpYWxpemVkID0gLTMyMDAyO1xuICAgIEVycm9yQ29kZXMuVW5rbm93bkVycm9yQ29kZSA9IC0zMjAwMTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIHRoZSBlbmQgcmFuZ2Ugb2YgSlNPTiBSUEMgcmVzZXJ2ZWQgZXJyb3IgY29kZXMuXG4gICAgICogSXQgZG9lc24ndCBkZW5vdGUgYSByZWFsIGVycm9yIGNvZGUuXG4gICAgICpcbiAgICAgKiBAc2luY2UgMy4xNi4wXG4gICAgKi9cbiAgICBFcnJvckNvZGVzLmpzb25ycGNSZXNlcnZlZEVycm9yUmFuZ2VFbmQgPSAtMzIwMDA7XG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSAganNvbnJwY1Jlc2VydmVkRXJyb3JSYW5nZUVuZCAqL1xuICAgIEVycm9yQ29kZXMuc2VydmVyRXJyb3JFbmQgPSAtMzIwMDA7XG59KShFcnJvckNvZGVzIHx8IChleHBvcnRzLkVycm9yQ29kZXMgPSBFcnJvckNvZGVzID0ge30pKTtcbi8qKlxuICogQW4gZXJyb3Igb2JqZWN0IHJldHVybiBpbiBhIHJlc3BvbnNlIGluIGNhc2UgYSByZXF1ZXN0XG4gKiBoYXMgZmFpbGVkLlxuICovXG5jbGFzcyBSZXNwb25zZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNvZGUsIG1lc3NhZ2UsIGRhdGEpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuY29kZSA9IGlzLm51bWJlcihjb2RlKSA/IGNvZGUgOiBFcnJvckNvZGVzLlVua25vd25FcnJvckNvZGU7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBSZXNwb25zZUVycm9yLnByb3RvdHlwZSk7XG4gICAgfVxuICAgIHRvSnNvbigpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgY29kZTogdGhpcy5jb2RlLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLmRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmRhdGEgPSB0aGlzLmRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5leHBvcnRzLlJlc3BvbnNlRXJyb3IgPSBSZXNwb25zZUVycm9yO1xuY2xhc3MgUGFyYW1ldGVyU3RydWN0dXJlcyB7XG4gICAgY29uc3RydWN0b3Ioa2luZCkge1xuICAgICAgICB0aGlzLmtpbmQgPSBraW5kO1xuICAgIH1cbiAgICBzdGF0aWMgaXModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8gfHwgdmFsdWUgPT09IFBhcmFtZXRlclN0cnVjdHVyZXMuYnlOYW1lIHx8IHZhbHVlID09PSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5UG9zaXRpb247XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5raW5kO1xuICAgIH1cbn1cbmV4cG9ydHMuUGFyYW1ldGVyU3RydWN0dXJlcyA9IFBhcmFtZXRlclN0cnVjdHVyZXM7XG4vKipcbiAqIFRoZSBwYXJhbWV0ZXIgc3RydWN0dXJlIGlzIGF1dG9tYXRpY2FsbHkgaW5mZXJyZWQgb24gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzXG4gKiBhbmQgdGhlIHBhcmFtZXRlciB0eXBlIGluIGNhc2Ugb2YgYSBzaW5nbGUgcGFyYW0uXG4gKi9cblBhcmFtZXRlclN0cnVjdHVyZXMuYXV0byA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdhdXRvJyk7XG4vKipcbiAqIEZvcmNlcyBgYnlQb3NpdGlvbmAgcGFyYW1ldGVyIHN0cnVjdHVyZS4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGhhdmUgYSBzaW5nbGVcbiAqIHBhcmFtZXRlciB3aGljaCBoYXMgYSBsaXRlcmFsIHR5cGUuXG4gKi9cblBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbiA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdieVBvc2l0aW9uJyk7XG4vKipcbiAqIEZvcmNlcyBgYnlOYW1lYCBwYXJhbWV0ZXIgc3RydWN0dXJlLiBUaGlzIGlzIG9ubHkgdXNlZnVsIHdoZW4gaGF2aW5nIGEgc2luZ2xlXG4gKiBwYXJhbWV0ZXIuIFRoZSBsaWJyYXJ5IHdpbGwgcmVwb3J0IGVycm9ycyBpZiB1c2VkIHdpdGggYSBkaWZmZXJlbnQgbnVtYmVyIG9mXG4gKiBwYXJhbWV0ZXJzLlxuICovXG5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdieU5hbWUnKTtcbi8qKlxuICogQW4gYWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgYSBNZXNzYWdlVHlwZS5cbiAqL1xuY2xhc3MgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIG51bWJlck9mUGFyYW1zKSB7XG4gICAgICAgIHRoaXMubWV0aG9kID0gbWV0aG9kO1xuICAgICAgICB0aGlzLm51bWJlck9mUGFyYW1zID0gbnVtYmVyT2ZQYXJhbXM7XG4gICAgfVxuICAgIGdldCBwYXJhbWV0ZXJTdHJ1Y3R1cmVzKCkge1xuICAgICAgICByZXR1cm4gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvO1xuICAgIH1cbn1cbmV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlID0gQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlO1xuLyoqXG4gKiBDbGFzc2VzIHRvIHR5cGUgcmVxdWVzdCByZXNwb25zZSBwYWlyc1xuICovXG5jbGFzcyBSZXF1ZXN0VHlwZTAgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDApO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGUwID0gUmVxdWVzdFR5cGUwO1xuY2xhc3MgUmVxdWVzdFR5cGUgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCwgX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8pIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAxKTtcbiAgICAgICAgdGhpcy5fcGFyYW1ldGVyU3RydWN0dXJlcyA9IF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbiAgICBnZXQgcGFyYW1ldGVyU3RydWN0dXJlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXM7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IFJlcXVlc3RUeXBlO1xuY2xhc3MgUmVxdWVzdFR5cGUxIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMSk7XG4gICAgICAgIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBfcGFyYW1ldGVyU3RydWN0dXJlcztcbiAgICB9XG4gICAgZ2V0IHBhcmFtZXRlclN0cnVjdHVyZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGUxID0gUmVxdWVzdFR5cGUxO1xuY2xhc3MgUmVxdWVzdFR5cGUyIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAyKTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlMiA9IFJlcXVlc3RUeXBlMjtcbmNsYXNzIFJlcXVlc3RUeXBlMyBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMyk7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTMgPSBSZXF1ZXN0VHlwZTM7XG5jbGFzcyBSZXF1ZXN0VHlwZTQgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDQpO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGU0ID0gUmVxdWVzdFR5cGU0O1xuY2xhc3MgUmVxdWVzdFR5cGU1IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA1KTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlNSA9IFJlcXVlc3RUeXBlNTtcbmNsYXNzIFJlcXVlc3RUeXBlNiBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNik7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTYgPSBSZXF1ZXN0VHlwZTY7XG5jbGFzcyBSZXF1ZXN0VHlwZTcgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDcpO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGU3ID0gUmVxdWVzdFR5cGU3O1xuY2xhc3MgUmVxdWVzdFR5cGU4IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA4KTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlOCA9IFJlcXVlc3RUeXBlODtcbmNsYXNzIFJlcXVlc3RUeXBlOSBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgOSk7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTkgPSBSZXF1ZXN0VHlwZTk7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMSk7XG4gICAgICAgIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBfcGFyYW1ldGVyU3RydWN0dXJlcztcbiAgICB9XG4gICAgZ2V0IHBhcmFtZXRlclN0cnVjdHVyZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZSA9IE5vdGlmaWNhdGlvblR5cGU7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlMCBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMCk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMCA9IE5vdGlmaWNhdGlvblR5cGUwO1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTEgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCwgX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8pIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAxKTtcbiAgICAgICAgdGhpcy5fcGFyYW1ldGVyU3RydWN0dXJlcyA9IF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbiAgICBnZXQgcGFyYW1ldGVyU3RydWN0dXJlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXM7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMSA9IE5vdGlmaWNhdGlvblR5cGUxO1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDIpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTIgPSBOb3RpZmljYXRpb25UeXBlMjtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGUzIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAzKTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGUzID0gTm90aWZpY2F0aW9uVHlwZTM7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlNCBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNCk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNCA9IE5vdGlmaWNhdGlvblR5cGU0O1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTUgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDUpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTUgPSBOb3RpZmljYXRpb25UeXBlNTtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGU2IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA2KTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGU2ID0gTm90aWZpY2F0aW9uVHlwZTY7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlNyBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNyk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNyA9IE5vdGlmaWNhdGlvblR5cGU3O1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTggZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDgpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTggPSBOb3RpZmljYXRpb25UeXBlODtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGU5IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA5KTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGU5ID0gTm90aWZpY2F0aW9uVHlwZTk7XG52YXIgTWVzc2FnZTtcbihmdW5jdGlvbiAoTWVzc2FnZSkge1xuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoZSBnaXZlbiBtZXNzYWdlIGlzIGEgcmVxdWVzdCBtZXNzYWdlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gbWVzc2FnZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBpcy5zdHJpbmcoY2FuZGlkYXRlLm1ldGhvZCkgJiYgKGlzLnN0cmluZyhjYW5kaWRhdGUuaWQpIHx8IGlzLm51bWJlcihjYW5kaWRhdGUuaWQpKTtcbiAgICB9XG4gICAgTWVzc2FnZS5pc1JlcXVlc3QgPSBpc1JlcXVlc3Q7XG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhlIGdpdmVuIG1lc3NhZ2UgaXMgYSBub3RpZmljYXRpb24gbWVzc2FnZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTm90aWZpY2F0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gbWVzc2FnZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBpcy5zdHJpbmcoY2FuZGlkYXRlLm1ldGhvZCkgJiYgbWVzc2FnZS5pZCA9PT0gdm9pZCAwO1xuICAgIH1cbiAgICBNZXNzYWdlLmlzTm90aWZpY2F0aW9uID0gaXNOb3RpZmljYXRpb247XG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhlIGdpdmVuIG1lc3NhZ2UgaXMgYSByZXNwb25zZSBtZXNzYWdlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNSZXNwb25zZShtZXNzYWdlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IG1lc3NhZ2U7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgKGNhbmRpZGF0ZS5yZXN1bHQgIT09IHZvaWQgMCB8fCAhIWNhbmRpZGF0ZS5lcnJvcikgJiYgKGlzLnN0cmluZyhjYW5kaWRhdGUuaWQpIHx8IGlzLm51bWJlcihjYW5kaWRhdGUuaWQpIHx8IGNhbmRpZGF0ZS5pZCA9PT0gbnVsbCk7XG4gICAgfVxuICAgIE1lc3NhZ2UuaXNSZXNwb25zZSA9IGlzUmVzcG9uc2U7XG59KShNZXNzYWdlIHx8IChleHBvcnRzLk1lc3NhZ2UgPSBNZXNzYWdlID0ge30pKTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xudmFyIF9hO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5MUlVDYWNoZSA9IGV4cG9ydHMuTGlua2VkTWFwID0gZXhwb3J0cy5Ub3VjaCA9IHZvaWQgMDtcbnZhciBUb3VjaDtcbihmdW5jdGlvbiAoVG91Y2gpIHtcbiAgICBUb3VjaC5Ob25lID0gMDtcbiAgICBUb3VjaC5GaXJzdCA9IDE7XG4gICAgVG91Y2guQXNPbGQgPSBUb3VjaC5GaXJzdDtcbiAgICBUb3VjaC5MYXN0ID0gMjtcbiAgICBUb3VjaC5Bc05ldyA9IFRvdWNoLkxhc3Q7XG59KShUb3VjaCB8fCAoZXhwb3J0cy5Ub3VjaCA9IFRvdWNoID0ge30pKTtcbmNsYXNzIExpbmtlZE1hcCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXNbX2FdID0gJ0xpbmtlZE1hcCc7XG4gICAgICAgIHRoaXMuX21hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5faGVhZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fdGFpbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IDA7XG4gICAgICAgIHRoaXMuX3N0YXRlID0gMDtcbiAgICB9XG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuX21hcC5jbGVhcigpO1xuICAgICAgICB0aGlzLl9oZWFkID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl90YWlsID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9zaXplID0gMDtcbiAgICAgICAgdGhpcy5fc3RhdGUrKztcbiAgICB9XG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLl9oZWFkICYmICF0aGlzLl90YWlsO1xuICAgIH1cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpemU7XG4gICAgfVxuICAgIGdldCBmaXJzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlYWQ/LnZhbHVlO1xuICAgIH1cbiAgICBnZXQgbGFzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhaWw/LnZhbHVlO1xuICAgIH1cbiAgICBoYXMoa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXAuaGFzKGtleSk7XG4gICAgfVxuICAgIGdldChrZXksIHRvdWNoID0gVG91Y2guTm9uZSkge1xuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5fbWFwLmdldChrZXkpO1xuICAgICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRvdWNoICE9PSBUb3VjaC5Ob25lKSB7XG4gICAgICAgICAgICB0aGlzLnRvdWNoKGl0ZW0sIHRvdWNoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICB9XG4gICAgc2V0KGtleSwgdmFsdWUsIHRvdWNoID0gVG91Y2guTm9uZSkge1xuICAgICAgICBsZXQgaXRlbSA9IHRoaXMuX21hcC5nZXQoa2V5KTtcbiAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgIGl0ZW0udmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIGlmICh0b3VjaCAhPT0gVG91Y2guTm9uZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudG91Y2goaXRlbSwgdG91Y2gpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaXRlbSA9IHsga2V5LCB2YWx1ZSwgbmV4dDogdW5kZWZpbmVkLCBwcmV2aW91czogdW5kZWZpbmVkIH07XG4gICAgICAgICAgICBzd2l0Y2ggKHRvdWNoKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBUb3VjaC5Ob25lOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFRvdWNoLkZpcnN0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1GaXJzdChpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBUb3VjaC5MYXN0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX21hcC5zZXQoa2V5LCBpdGVtKTtcbiAgICAgICAgICAgIHRoaXMuX3NpemUrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGVsZXRlKGtleSkge1xuICAgICAgICByZXR1cm4gISF0aGlzLnJlbW92ZShrZXkpO1xuICAgIH1cbiAgICByZW1vdmUoa2V5KSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl9tYXAuZ2V0KGtleSk7XG4gICAgICAgIGlmICghaXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tYXAuZGVsZXRlKGtleSk7XG4gICAgICAgIHRoaXMucmVtb3ZlSXRlbShpdGVtKTtcbiAgICAgICAgdGhpcy5fc2l6ZS0tO1xuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICB9XG4gICAgc2hpZnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5faGVhZCAmJiAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2hlYWQgfHwgIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIHRoaXMuX21hcC5kZWxldGUoaXRlbS5rZXkpO1xuICAgICAgICB0aGlzLnJlbW92ZUl0ZW0oaXRlbSk7XG4gICAgICAgIHRoaXMuX3NpemUtLTtcbiAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7XG4gICAgfVxuICAgIGZvckVhY2goY2FsbGJhY2tmbiwgdGhpc0FyZykge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3N0YXRlO1xuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICAgICAgICBpZiAodGhpc0FyZykge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrZm4uYmluZCh0aGlzQXJnKShjdXJyZW50LnZhbHVlLCBjdXJyZW50LmtleSwgdGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFja2ZuKGN1cnJlbnQudmFsdWUsIGN1cnJlbnQua2V5LCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gc3RhdGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExpbmtlZE1hcCBnb3QgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAga2V5cygpIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9zdGF0ZTtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLl9oZWFkO1xuICAgICAgICBjb25zdCBpdGVyYXRvciA9IHtcbiAgICAgICAgICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fc3RhdGUgIT09IHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTGlua2VkTWFwIGdvdCBtb2RpZmllZCBkdXJpbmcgaXRlcmF0aW9uLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7IHZhbHVlOiBjdXJyZW50LmtleSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICB9XG4gICAgdmFsdWVzKCkge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3N0YXRlO1xuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIGNvbnN0IGl0ZXJhdG9yID0ge1xuICAgICAgICAgICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlcmF0b3I7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBMaW5rZWRNYXAgZ290IG1vZGlmaWVkIGR1cmluZyBpdGVyYXRpb24uYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHsgdmFsdWU6IGN1cnJlbnQudmFsdWUsIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gaXRlcmF0b3I7XG4gICAgfVxuICAgIGVudHJpZXMoKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5fc3RhdGU7XG4gICAgICAgIGxldCBjdXJyZW50ID0gdGhpcy5faGVhZDtcbiAgICAgICAgY29uc3QgaXRlcmF0b3IgPSB7XG4gICAgICAgICAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3N0YXRlICE9PSBzdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExpbmtlZE1hcCBnb3QgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geyB2YWx1ZTogW2N1cnJlbnQua2V5LCBjdXJyZW50LnZhbHVlXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICB9XG4gICAgWyhfYSA9IFN5bWJvbC50b1N0cmluZ1RhZywgU3ltYm9sLml0ZXJhdG9yKV0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMoKTtcbiAgICB9XG4gICAgdHJpbU9sZChuZXdTaXplKSB7XG4gICAgICAgIGlmIChuZXdTaXplID49IHRoaXMuc2l6ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuZXdTaXplID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLl9oZWFkO1xuICAgICAgICBsZXQgY3VycmVudFNpemUgPSB0aGlzLnNpemU7XG4gICAgICAgIHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnRTaXplID4gbmV3U2l6ZSkge1xuICAgICAgICAgICAgdGhpcy5fbWFwLmRlbGV0ZShjdXJyZW50LmtleSk7XG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0O1xuICAgICAgICAgICAgY3VycmVudFNpemUtLTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9oZWFkID0gY3VycmVudDtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IGN1cnJlbnRTaXplO1xuICAgICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICAgICAgY3VycmVudC5wcmV2aW91cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgIH1cbiAgICBhZGRJdGVtRmlyc3QoaXRlbSkge1xuICAgICAgICAvLyBGaXJzdCB0aW1lIEluc2VydFxuICAgICAgICBpZiAoIXRoaXMuX2hlYWQgJiYgIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRoaXMuX3RhaWwgPSBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCF0aGlzLl9oZWFkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbGlzdCcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdGhpcy5faGVhZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQucHJldmlvdXMgPSBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2hlYWQgPSBpdGVtO1xuICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgIH1cbiAgICBhZGRJdGVtTGFzdChpdGVtKSB7XG4gICAgICAgIC8vIEZpcnN0IHRpbWUgSW5zZXJ0XG4gICAgICAgIGlmICghdGhpcy5faGVhZCAmJiAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgdGhpcy5faGVhZCA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpdGVtLnByZXZpb3VzID0gdGhpcy5fdGFpbDtcbiAgICAgICAgICAgIHRoaXMuX3RhaWwubmV4dCA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW07XG4gICAgICAgIHRoaXMuX3N0YXRlKys7XG4gICAgfVxuICAgIHJlbW92ZUl0ZW0oaXRlbSkge1xuICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCAmJiBpdGVtID09PSB0aGlzLl90YWlsKSB7XG4gICAgICAgICAgICB0aGlzLl9oZWFkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpdGVtID09PSB0aGlzLl9oZWFkKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGNhbiBvbmx5IGhhcHBlbmVkIGlmIHNpemUgPT09IDEgd2hpY2ggaXMgaGFuZGxlXG4gICAgICAgICAgICAvLyBieSB0aGUgY2FzZSBhYm92ZS5cbiAgICAgICAgICAgIGlmICghaXRlbS5uZXh0KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxpc3QnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGl0ZW0ubmV4dC5wcmV2aW91cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQgPSBpdGVtLm5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXRlbSA9PT0gdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgLy8gVGhpcyBjYW4gb25seSBoYXBwZW5lZCBpZiBzaXplID09PSAxIHdoaWNoIGlzIGhhbmRsZVxuICAgICAgICAgICAgLy8gYnkgdGhlIGNhc2UgYWJvdmUuXG4gICAgICAgICAgICBpZiAoIWl0ZW0ucHJldmlvdXMpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbGlzdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbS5wcmV2aW91cy5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gaXRlbS5uZXh0O1xuICAgICAgICAgICAgY29uc3QgcHJldmlvdXMgPSBpdGVtLnByZXZpb3VzO1xuICAgICAgICAgICAgaWYgKCFuZXh0IHx8ICFwcmV2aW91cykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXh0LnByZXZpb3VzID0gcHJldmlvdXM7XG4gICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gbmV4dDtcbiAgICAgICAgfVxuICAgICAgICBpdGVtLm5leHQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGl0ZW0ucHJldmlvdXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX3N0YXRlKys7XG4gICAgfVxuICAgIHRvdWNoKGl0ZW0sIHRvdWNoKSB7XG4gICAgICAgIGlmICghdGhpcy5faGVhZCB8fCAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxpc3QnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHRvdWNoICE9PSBUb3VjaC5GaXJzdCAmJiB0b3VjaCAhPT0gVG91Y2guTGFzdCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG91Y2ggPT09IFRvdWNoLkZpcnN0KSB7XG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBpdGVtLm5leHQ7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgICAgICAvLyBVbmxpbmsgdGhlIGl0ZW1cbiAgICAgICAgICAgIGlmIChpdGVtID09PSB0aGlzLl90YWlsKSB7XG4gICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgbXVzdCBiZSBkZWZpbmVkIHNpbmNlIGl0ZW0gd2FzIG5vdCBoZWFkIGJ1dCBpcyB0YWlsXG4gICAgICAgICAgICAgICAgLy8gU28gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbiBpdGVtIGluIHRoZSBtYXBcbiAgICAgICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuX3RhaWwgPSBwcmV2aW91cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEJvdGggbmV4dCBhbmQgcHJldmlvdXMgYXJlIG5vdCB1bmRlZmluZWQgc2luY2UgaXRlbSB3YXMgbmVpdGhlciBoZWFkIG5vciB0YWlsLlxuICAgICAgICAgICAgICAgIG5leHQucHJldmlvdXMgPSBwcmV2aW91cztcbiAgICAgICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEluc2VydCB0aGUgbm9kZSBhdCBoZWFkXG4gICAgICAgICAgICBpdGVtLnByZXZpb3VzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdGhpcy5faGVhZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQucHJldmlvdXMgPSBpdGVtO1xuICAgICAgICAgICAgdGhpcy5faGVhZCA9IGl0ZW07XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRvdWNoID09PSBUb3VjaC5MYXN0KSB7XG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBpdGVtLm5leHQ7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgICAgICAvLyBVbmxpbmsgdGhlIGl0ZW0uXG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCkge1xuICAgICAgICAgICAgICAgIC8vIG5leHQgbXVzdCBiZSBkZWZpbmVkIHNpbmNlIGl0ZW0gd2FzIG5vdCB0YWlsIGJ1dCBpcyBoZWFkXG4gICAgICAgICAgICAgICAgLy8gU28gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbiBpdGVtIGluIHRoZSBtYXBcbiAgICAgICAgICAgICAgICBuZXh0LnByZXZpb3VzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuX2hlYWQgPSBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQm90aCBuZXh0IGFuZCBwcmV2aW91cyBhcmUgbm90IHVuZGVmaW5lZCBzaW5jZSBpdGVtIHdhcyBuZWl0aGVyIGhlYWQgbm9yIHRhaWwuXG4gICAgICAgICAgICAgICAgbmV4dC5wcmV2aW91cyA9IHByZXZpb3VzO1xuICAgICAgICAgICAgICAgIHByZXZpb3VzLm5leHQgPSBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaXRlbS5wcmV2aW91cyA9IHRoaXMuX3RhaWw7XG4gICAgICAgICAgICB0aGlzLl90YWlsLm5leHQgPSBpdGVtO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW07XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IFtdO1xuICAgICAgICB0aGlzLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGRhdGEucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGZyb21KU09OKGRhdGEpIHtcbiAgICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBkYXRhKSB7XG4gICAgICAgICAgICB0aGlzLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuTGlua2VkTWFwID0gTGlua2VkTWFwO1xuY2xhc3MgTFJVQ2FjaGUgZXh0ZW5kcyBMaW5rZWRNYXAge1xuICAgIGNvbnN0cnVjdG9yKGxpbWl0LCByYXRpbyA9IDEpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fbGltaXQgPSBsaW1pdDtcbiAgICAgICAgdGhpcy5fcmF0aW8gPSBNYXRoLm1pbihNYXRoLm1heCgwLCByYXRpbyksIDEpO1xuICAgIH1cbiAgICBnZXQgbGltaXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9saW1pdDtcbiAgICB9XG4gICAgc2V0IGxpbWl0KGxpbWl0KSB7XG4gICAgICAgIHRoaXMuX2xpbWl0ID0gbGltaXQ7XG4gICAgICAgIHRoaXMuY2hlY2tUcmltKCk7XG4gICAgfVxuICAgIGdldCByYXRpbygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JhdGlvO1xuICAgIH1cbiAgICBzZXQgcmF0aW8ocmF0aW8pIHtcbiAgICAgICAgdGhpcy5fcmF0aW8gPSBNYXRoLm1pbihNYXRoLm1heCgwLCByYXRpbyksIDEpO1xuICAgICAgICB0aGlzLmNoZWNrVHJpbSgpO1xuICAgIH1cbiAgICBnZXQoa2V5LCB0b3VjaCA9IFRvdWNoLkFzTmV3KSB7XG4gICAgICAgIHJldHVybiBzdXBlci5nZXQoa2V5LCB0b3VjaCk7XG4gICAgfVxuICAgIHBlZWsoa2V5KSB7XG4gICAgICAgIHJldHVybiBzdXBlci5nZXQoa2V5LCBUb3VjaC5Ob25lKTtcbiAgICB9XG4gICAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgc3VwZXIuc2V0KGtleSwgdmFsdWUsIFRvdWNoLkxhc3QpO1xuICAgICAgICB0aGlzLmNoZWNrVHJpbSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgY2hlY2tUcmltKCkge1xuICAgICAgICBpZiAodGhpcy5zaXplID4gdGhpcy5fbGltaXQpIHtcbiAgICAgICAgICAgIHRoaXMudHJpbU9sZChNYXRoLnJvdW5kKHRoaXMuX2xpbWl0ICogdGhpcy5fcmF0aW8pKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuTFJVQ2FjaGUgPSBMUlVDYWNoZTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5EaXNwb3NhYmxlID0gdm9pZCAwO1xudmFyIERpc3Bvc2FibGU7XG4oZnVuY3Rpb24gKERpc3Bvc2FibGUpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUoZnVuYykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGlzcG9zZTogZnVuY1xuICAgICAgICB9O1xuICAgIH1cbiAgICBEaXNwb3NhYmxlLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKERpc3Bvc2FibGUgfHwgKGV4cG9ydHMuRGlzcG9zYWJsZSA9IERpc3Bvc2FibGUgPSB7fSkpO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xubGV0IF9yYWw7XG5mdW5jdGlvbiBSQUwoKSB7XG4gICAgaWYgKF9yYWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHJ1bnRpbWUgYWJzdHJhY3Rpb24gbGF5ZXIgaW5zdGFsbGVkYCk7XG4gICAgfVxuICAgIHJldHVybiBfcmFsO1xufVxuKGZ1bmN0aW9uIChSQUwpIHtcbiAgICBmdW5jdGlvbiBpbnN0YWxsKHJhbCkge1xuICAgICAgICBpZiAocmFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gcnVudGltZSBhYnN0cmFjdGlvbiBsYXllciBwcm92aWRlZGApO1xuICAgICAgICB9XG4gICAgICAgIF9yYWwgPSByYWw7XG4gICAgfVxuICAgIFJBTC5pbnN0YWxsID0gaW5zdGFsbDtcbn0pKFJBTCB8fCAoUkFMID0ge30pKTtcbmV4cG9ydHMuZGVmYXVsdCA9IFJBTDtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuRW1pdHRlciA9IGV4cG9ydHMuRXZlbnQgPSB2b2lkIDA7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbnZhciBFdmVudDtcbihmdW5jdGlvbiAoRXZlbnQpIHtcbiAgICBjb25zdCBfZGlzcG9zYWJsZSA9IHsgZGlzcG9zZSgpIHsgfSB9O1xuICAgIEV2ZW50Lk5vbmUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBfZGlzcG9zYWJsZTsgfTtcbn0pKEV2ZW50IHx8IChleHBvcnRzLkV2ZW50ID0gRXZlbnQgPSB7fSkpO1xuY2xhc3MgQ2FsbGJhY2tMaXN0IHtcbiAgICBhZGQoY2FsbGJhY2ssIGNvbnRleHQgPSBudWxsLCBidWNrZXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fY29udGV4dHMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgICAgIHRoaXMuX2NvbnRleHRzLnB1c2goY29udGV4dCk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGJ1Y2tldCkpIHtcbiAgICAgICAgICAgIGJ1Y2tldC5wdXNoKHsgZGlzcG9zZTogKCkgPT4gdGhpcy5yZW1vdmUoY2FsbGJhY2ssIGNvbnRleHQpIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlbW92ZShjYWxsYmFjaywgY29udGV4dCA9IG51bGwpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZm91bmRDYWxsYmFja1dpdGhEaWZmZXJlbnRDb250ZXh0ID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLl9jYWxsYmFja3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jYWxsYmFja3NbaV0gPT09IGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NvbnRleHRzW2ldID09PSBjb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrICYgY29udGV4dCBtYXRjaCA9PiByZW1vdmUgaXRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29udGV4dHMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZENhbGxiYWNrV2l0aERpZmZlcmVudENvbnRleHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZm91bmRDYWxsYmFja1dpdGhEaWZmZXJlbnRDb250ZXh0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1doZW4gYWRkaW5nIGEgbGlzdGVuZXIgd2l0aCBhIGNvbnRleHQsIHlvdSBzaG91bGQgcmVtb3ZlIGl0IHdpdGggdGhlIHNhbWUgY29udGV4dCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGludm9rZSguLi5hcmdzKSB7XG4gICAgICAgIGlmICghdGhpcy5fY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmV0ID0gW10sIGNhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcy5zbGljZSgwKSwgY29udGV4dHMgPSB0aGlzLl9jb250ZXh0cy5zbGljZSgwKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXQucHVzaChjYWxsYmFja3NbaV0uYXBwbHkoY29udGV4dHNbaV0sIGFyZ3MpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS5jb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICAgIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5fY2FsbGJhY2tzIHx8IHRoaXMuX2NhbGxiYWNrcy5sZW5ndGggPT09IDA7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fY29udGV4dHMgPSB1bmRlZmluZWQ7XG4gICAgfVxufVxuY2xhc3MgRW1pdHRlciB7XG4gICAgY29uc3RydWN0b3IoX29wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IF9vcHRpb25zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGb3IgdGhlIHB1YmxpYyB0byBhbGxvdyB0byBzdWJzY3JpYmVcbiAgICAgKiB0byBldmVudHMgZnJvbSB0aGlzIEVtaXR0ZXJcbiAgICAgKi9cbiAgICBnZXQgZXZlbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fZXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50ID0gKGxpc3RlbmVyLCB0aGlzQXJncywgZGlzcG9zYWJsZXMpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2NhbGxiYWNrcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWxsYmFja3MgPSBuZXcgQ2FsbGJhY2tMaXN0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMub25GaXJzdExpc3RlbmVyQWRkICYmIHRoaXMuX2NhbGxiYWNrcy5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy5vbkZpcnN0TGlzdGVuZXJBZGQodGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5hZGQobGlzdGVuZXIsIHRoaXNBcmdzKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlzcG9zYWJsZSBpcyBkaXNwb3NlZCBhZnRlciBlbWl0dGVyIGlzIGRpc3Bvc2VkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5yZW1vdmUobGlzdGVuZXIsIHRoaXNBcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5kaXNwb3NlID0gRW1pdHRlci5fbm9vcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMub25MYXN0TGlzdGVuZXJSZW1vdmUgJiYgdGhpcy5fY2FsbGJhY2tzLmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29wdGlvbnMub25MYXN0TGlzdGVuZXJSZW1vdmUodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRpc3Bvc2FibGVzKSkge1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlcy5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9ldmVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVG8gYmUga2VwdCBwcml2YXRlIHRvIGZpcmUgYW4gZXZlbnQgdG9cbiAgICAgKiBzdWJzY3JpYmVyc1xuICAgICAqL1xuICAgIGZpcmUoZXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NhbGxiYWNrcykge1xuICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzLmludm9rZS5jYWxsKHRoaXMuX2NhbGxiYWNrcywgZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5kaXNwb3NlKCk7XG4gICAgICAgICAgICB0aGlzLl9jYWxsYmFja3MgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLkVtaXR0ZXIgPSBFbWl0dGVyO1xuRW1pdHRlci5fbm9vcCA9IGZ1bmN0aW9uICgpIHsgfTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uVG9rZW4gPSB2b2lkIDA7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbmNvbnN0IElzID0gcmVxdWlyZShcIi4vaXNcIik7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCIuL2V2ZW50c1wiKTtcbnZhciBDYW5jZWxsYXRpb25Ub2tlbjtcbihmdW5jdGlvbiAoQ2FuY2VsbGF0aW9uVG9rZW4pIHtcbiAgICBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGlzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkOiBmYWxzZSxcbiAgICAgICAgb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6IGV2ZW50c18xLkV2ZW50Lk5vbmVcbiAgICB9KTtcbiAgICBDYW5jZWxsYXRpb25Ub2tlbi5DYW5jZWxsZWQgPSBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6IHRydWUsXG4gICAgICAgIG9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkOiBldmVudHNfMS5FdmVudC5Ob25lXG4gICAgfSk7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgKGNhbmRpZGF0ZSA9PT0gQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZVxuICAgICAgICAgICAgfHwgY2FuZGlkYXRlID09PSBDYW5jZWxsYXRpb25Ub2tlbi5DYW5jZWxsZWRcbiAgICAgICAgICAgIHx8IChJcy5ib29sZWFuKGNhbmRpZGF0ZS5pc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkgJiYgISFjYW5kaWRhdGUub25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQpKTtcbiAgICB9XG4gICAgQ2FuY2VsbGF0aW9uVG9rZW4uaXMgPSBpcztcbn0pKENhbmNlbGxhdGlvblRva2VuIHx8IChleHBvcnRzLkNhbmNlbGxhdGlvblRva2VuID0gQ2FuY2VsbGF0aW9uVG9rZW4gPSB7fSkpO1xuY29uc3Qgc2hvcnRjdXRFdmVudCA9IE9iamVjdC5mcmVlemUoZnVuY3Rpb24gKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgY29uc3QgaGFuZGxlID0gKDAsIHJhbF8xLmRlZmF1bHQpKCkudGltZXIuc2V0VGltZW91dChjYWxsYmFjay5iaW5kKGNvbnRleHQpLCAwKTtcbiAgICByZXR1cm4geyBkaXNwb3NlKCkgeyBoYW5kbGUuZGlzcG9zZSgpOyB9IH07XG59KTtcbmNsYXNzIE11dGFibGVUb2tlbiB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX2lzQ2FuY2VsbGVkID0gZmFsc2U7XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9pc0NhbmNlbGxlZCkge1xuICAgICAgICAgICAgdGhpcy5faXNDYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2VtaXR0ZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmZpcmUodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0NhbmNlbGxlZDtcbiAgICB9XG4gICAgZ2V0IG9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKCkge1xuICAgICAgICBpZiAodGhpcy5faXNDYW5jZWxsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBzaG9ydGN1dEV2ZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5fZW1pdHRlcikge1xuICAgICAgICAgICAgdGhpcy5fZW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2VtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLl9lbWl0dGVyKSB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5jbGFzcyBDYW5jZWxsYXRpb25Ub2tlblNvdXJjZSB7XG4gICAgZ2V0IHRva2VuKCkge1xuICAgICAgICBpZiAoIXRoaXMuX3Rva2VuKSB7XG4gICAgICAgICAgICAvLyBiZSBsYXp5IGFuZCBjcmVhdGUgdGhlIHRva2VuIG9ubHkgd2hlblxuICAgICAgICAgICAgLy8gYWN0dWFsbHkgbmVlZGVkXG4gICAgICAgICAgICB0aGlzLl90b2tlbiA9IG5ldyBNdXRhYmxlVG9rZW4oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fdG9rZW47XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl90b2tlbikge1xuICAgICAgICAgICAgLy8gc2F2ZSBhbiBvYmplY3QgYnkgcmV0dXJuaW5nIHRoZSBkZWZhdWx0XG4gICAgICAgICAgICAvLyBjYW5jZWxsZWQgdG9rZW4gd2hlbiBjYW5jZWxsYXRpb24gaGFwcGVuc1xuICAgICAgICAgICAgLy8gYmVmb3JlIHNvbWVvbmUgYXNrcyBmb3IgdGhlIHRva2VuXG4gICAgICAgICAgICB0aGlzLl90b2tlbiA9IENhbmNlbGxhdGlvblRva2VuLkNhbmNlbGxlZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3Rva2VuLmNhbmNlbCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICghdGhpcy5fdG9rZW4pIHtcbiAgICAgICAgICAgIC8vIGVuc3VyZSB0byBpbml0aWFsaXplIHdpdGggYW4gZW1wdHkgdG9rZW4gaWYgd2UgaGFkIG5vbmVcbiAgICAgICAgICAgIHRoaXMuX3Rva2VuID0gQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLl90b2tlbiBpbnN0YW5jZW9mIE11dGFibGVUb2tlbikge1xuICAgICAgICAgICAgLy8gYWN0dWFsbHkgZGlzcG9zZVxuICAgICAgICAgICAgdGhpcy5fdG9rZW4uZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IENhbmNlbGxhdGlvblRva2VuU291cmNlO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3kgPSB2b2lkIDA7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbnZhciBDYW5jZWxsYXRpb25TdGF0ZTtcbihmdW5jdGlvbiAoQ2FuY2VsbGF0aW9uU3RhdGUpIHtcbiAgICBDYW5jZWxsYXRpb25TdGF0ZS5Db250aW51ZSA9IDA7XG4gICAgQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkID0gMTtcbn0pKENhbmNlbGxhdGlvblN0YXRlIHx8IChDYW5jZWxsYXRpb25TdGF0ZSA9IHt9KSk7XG5jbGFzcyBTaGFyZWRBcnJheVNlbmRlclN0cmF0ZWd5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5idWZmZXJzID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICBlbmFibGVDYW5jZWxsYXRpb24ocmVxdWVzdCkge1xuICAgICAgICBpZiAocmVxdWVzdC5pZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBTaGFyZWRBcnJheUJ1ZmZlcig0KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBJbnQzMkFycmF5KGJ1ZmZlciwgMCwgMSk7XG4gICAgICAgIGRhdGFbMF0gPSBDYW5jZWxsYXRpb25TdGF0ZS5Db250aW51ZTtcbiAgICAgICAgdGhpcy5idWZmZXJzLnNldChyZXF1ZXN0LmlkLCBidWZmZXIpO1xuICAgICAgICByZXF1ZXN0LiRjYW5jZWxsYXRpb25EYXRhID0gYnVmZmVyO1xuICAgIH1cbiAgICBhc3luYyBzZW5kQ2FuY2VsbGF0aW9uKF9jb25uLCBpZCkge1xuICAgICAgICBjb25zdCBidWZmZXIgPSB0aGlzLmJ1ZmZlcnMuZ2V0KGlkKTtcbiAgICAgICAgaWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBJbnQzMkFycmF5KGJ1ZmZlciwgMCwgMSk7XG4gICAgICAgIEF0b21pY3Muc3RvcmUoZGF0YSwgMCwgQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkKTtcbiAgICB9XG4gICAgY2xlYW51cChpZCkge1xuICAgICAgICB0aGlzLmJ1ZmZlcnMuZGVsZXRlKGlkKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy5idWZmZXJzLmNsZWFyKCk7XG4gICAgfVxufVxuZXhwb3J0cy5TaGFyZWRBcnJheVNlbmRlclN0cmF0ZWd5ID0gU2hhcmVkQXJyYXlTZW5kZXJTdHJhdGVneTtcbmNsYXNzIFNoYXJlZEFycmF5QnVmZmVyQ2FuY2VsbGF0aW9uVG9rZW4ge1xuICAgIGNvbnN0cnVjdG9yKGJ1ZmZlcikge1xuICAgICAgICB0aGlzLmRhdGEgPSBuZXcgSW50MzJBcnJheShidWZmZXIsIDAsIDEpO1xuICAgIH1cbiAgICBnZXQgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHJldHVybiBBdG9taWNzLmxvYWQodGhpcy5kYXRhLCAwKSA9PT0gQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkO1xuICAgIH1cbiAgICBnZXQgb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuY2VsbGF0aW9uIG92ZXIgU2hhcmVkQXJyYXlCdWZmZXIgZG9lc24ndCBzdXBwb3J0IGNhbmNlbGxhdGlvbiBldmVudHNgKTtcbiAgICB9XG59XG5jbGFzcyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuU291cmNlIHtcbiAgICBjb25zdHJ1Y3RvcihidWZmZXIpIHtcbiAgICAgICAgdGhpcy50b2tlbiA9IG5ldyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuKGJ1ZmZlcik7XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICB9XG59XG5jbGFzcyBTaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmtpbmQgPSAncmVxdWVzdCc7XG4gICAgfVxuICAgIGNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKHJlcXVlc3QpIHtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gcmVxdWVzdC4kY2FuY2VsbGF0aW9uRGF0YTtcbiAgICAgICAgaWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuU291cmNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuU291cmNlKGJ1ZmZlcik7XG4gICAgfVxufVxuZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBTaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3k7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNlbWFwaG9yZSA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY2xhc3MgU2VtYXBob3JlIHtcbiAgICBjb25zdHJ1Y3RvcihjYXBhY2l0eSA9IDEpIHtcbiAgICAgICAgaWYgKGNhcGFjaXR5IDw9IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FwYWNpdHkgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NhcGFjaXR5ID0gY2FwYWNpdHk7XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IDA7XG4gICAgICAgIHRoaXMuX3dhaXRpbmcgPSBbXTtcbiAgICB9XG4gICAgbG9jayh0aHVuaykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fd2FpdGluZy5wdXNoKHsgdGh1bmssIHJlc29sdmUsIHJlamVjdCB9KTtcbiAgICAgICAgICAgIHRoaXMucnVuTmV4dCgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0IGFjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTtcbiAgICB9XG4gICAgcnVuTmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dhaXRpbmcubGVuZ3RoID09PSAwIHx8IHRoaXMuX2FjdGl2ZSA9PT0gdGhpcy5fY2FwYWNpdHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS50aW1lci5zZXRJbW1lZGlhdGUoKCkgPT4gdGhpcy5kb1J1bk5leHQoKSk7XG4gICAgfVxuICAgIGRvUnVuTmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dhaXRpbmcubGVuZ3RoID09PSAwIHx8IHRoaXMuX2FjdGl2ZSA9PT0gdGhpcy5fY2FwYWNpdHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5fd2FpdGluZy5zaGlmdCgpO1xuICAgICAgICB0aGlzLl9hY3RpdmUrKztcbiAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZSA+IHRoaXMuX2NhcGFjaXR5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRvIG1hbnkgdGh1bmtzIGFjdGl2ZWApO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXh0LnRodW5rKCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC50aGVuKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5yZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5OZXh0KCk7XG4gICAgICAgICAgICAgICAgfSwgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5yZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5OZXh0KCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICBuZXh0LnJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1bk5leHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgIG5leHQucmVqZWN0KGVycik7XG4gICAgICAgICAgICB0aGlzLnJ1bk5leHQoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuU2VtYXBob3JlID0gU2VtYXBob3JlO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXIgPSBleHBvcnRzLkFic3RyYWN0TWVzc2FnZVJlYWRlciA9IGV4cG9ydHMuTWVzc2FnZVJlYWRlciA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IGV2ZW50c18xID0gcmVxdWlyZShcIi4vZXZlbnRzXCIpO1xuY29uc3Qgc2VtYXBob3JlXzEgPSByZXF1aXJlKFwiLi9zZW1hcGhvcmVcIik7XG52YXIgTWVzc2FnZVJlYWRlcjtcbihmdW5jdGlvbiAoTWVzc2FnZVJlYWRlcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5saXN0ZW4pICYmIElzLmZ1bmMoY2FuZGlkYXRlLmRpc3Bvc2UpICYmXG4gICAgICAgICAgICBJcy5mdW5jKGNhbmRpZGF0ZS5vbkVycm9yKSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5vbkNsb3NlKSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5vblBhcnRpYWxNZXNzYWdlKTtcbiAgICB9XG4gICAgTWVzc2FnZVJlYWRlci5pcyA9IGlzO1xufSkoTWVzc2FnZVJlYWRlciB8fCAoZXhwb3J0cy5NZXNzYWdlUmVhZGVyID0gTWVzc2FnZVJlYWRlciA9IHt9KSk7XG5jbGFzcyBBYnN0cmFjdE1lc3NhZ2VSZWFkZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZUVtaXR0ZXIgPSBuZXcgZXZlbnRzXzEuRW1pdHRlcigpO1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlci5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgZ2V0IG9uRXJyb3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVycm9yRW1pdHRlci5ldmVudDtcbiAgICB9XG4gICAgZmlyZUVycm9yKGVycm9yKSB7XG4gICAgICAgIHRoaXMuZXJyb3JFbWl0dGVyLmZpcmUodGhpcy5hc0Vycm9yKGVycm9yKSk7XG4gICAgfVxuICAgIGdldCBvbkNsb3NlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9zZUVtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGZpcmVDbG9zZSgpIHtcbiAgICAgICAgdGhpcy5jbG9zZUVtaXR0ZXIuZmlyZSh1bmRlZmluZWQpO1xuICAgIH1cbiAgICBnZXQgb25QYXJ0aWFsTWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFydGlhbE1lc3NhZ2VFbWl0dGVyLmV2ZW50O1xuICAgIH1cbiAgICBmaXJlUGFydGlhbE1lc3NhZ2UoaW5mbykge1xuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlRW1pdHRlci5maXJlKGluZm8pO1xuICAgIH1cbiAgICBhc0Vycm9yKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKGBSZWFkZXIgcmVjZWl2ZWQgZXJyb3IuIFJlYXNvbjogJHtJcy5zdHJpbmcoZXJyb3IubWVzc2FnZSkgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24nfWApO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VSZWFkZXIgPSBBYnN0cmFjdE1lc3NhZ2VSZWFkZXI7XG52YXIgUmVzb2x2ZWRNZXNzYWdlUmVhZGVyT3B0aW9ucztcbihmdW5jdGlvbiAoUmVzb2x2ZWRNZXNzYWdlUmVhZGVyT3B0aW9ucykge1xuICAgIGZ1bmN0aW9uIGZyb21PcHRpb25zKG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IGNoYXJzZXQ7XG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIGxldCBjb250ZW50RGVjb2RlcjtcbiAgICAgICAgY29uc3QgY29udGVudERlY29kZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICBsZXQgY29udGVudFR5cGVEZWNvZGVyO1xuICAgICAgICBjb25zdCBjb250ZW50VHlwZURlY29kZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY2hhcnNldCA9IG9wdGlvbnMgPz8gJ3V0Zi04JztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNoYXJzZXQgPSBvcHRpb25zLmNoYXJzZXQgPz8gJ3V0Zi04JztcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnREZWNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50RGVjb2RlciA9IG9wdGlvbnMuY29udGVudERlY29kZXI7XG4gICAgICAgICAgICAgICAgY29udGVudERlY29kZXJzLnNldChjb250ZW50RGVjb2Rlci5uYW1lLCBjb250ZW50RGVjb2Rlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5jb250ZW50RGVjb2RlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGVjb2RlciBvZiBvcHRpb25zLmNvbnRlbnREZWNvZGVycykge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50RGVjb2RlcnMuc2V0KGRlY29kZXIubmFtZSwgZGVjb2Rlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuY29udGVudFR5cGVEZWNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXIgPSBvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcjtcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXJzLnNldChjb250ZW50VHlwZURlY29kZXIubmFtZSwgY29udGVudFR5cGVEZWNvZGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGVjb2RlciBvZiBvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGVEZWNvZGVycy5zZXQoZGVjb2Rlci5uYW1lLCBkZWNvZGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnRlbnRUeXBlRGVjb2RlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXIgPSAoMCwgcmFsXzEuZGVmYXVsdCkoKS5hcHBsaWNhdGlvbkpzb24uZGVjb2RlcjtcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlRGVjb2RlcnMuc2V0KGNvbnRlbnRUeXBlRGVjb2Rlci5uYW1lLCBjb250ZW50VHlwZURlY29kZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGNoYXJzZXQsIGNvbnRlbnREZWNvZGVyLCBjb250ZW50RGVjb2RlcnMsIGNvbnRlbnRUeXBlRGVjb2RlciwgY29udGVudFR5cGVEZWNvZGVycyB9O1xuICAgIH1cbiAgICBSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zLmZyb21PcHRpb25zID0gZnJvbU9wdGlvbnM7XG59KShSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zIHx8IChSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zID0ge30pKTtcbmNsYXNzIFJlYWRhYmxlU3RyZWFtTWVzc2FnZVJlYWRlciBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVJlYWRlciB7XG4gICAgY29uc3RydWN0b3IocmVhZGFibGUsIG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZSA9IHJlYWRhYmxlO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zLmZyb21PcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmJ1ZmZlciA9ICgwLCByYWxfMS5kZWZhdWx0KSgpLm1lc3NhZ2VCdWZmZXIuY3JlYXRlKHRoaXMub3B0aW9ucy5jaGFyc2V0KTtcbiAgICAgICAgdGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0ID0gMTAwMDA7XG4gICAgICAgIHRoaXMubmV4dE1lc3NhZ2VMZW5ndGggPSAtMTtcbiAgICAgICAgdGhpcy5tZXNzYWdlVG9rZW4gPSAwO1xuICAgICAgICB0aGlzLnJlYWRTZW1hcGhvcmUgPSBuZXcgc2VtYXBob3JlXzEuU2VtYXBob3JlKDEpO1xuICAgIH1cbiAgICBzZXQgcGFydGlhbE1lc3NhZ2VUaW1lb3V0KHRpbWVvdXQpIHtcbiAgICAgICAgdGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0ID0gdGltZW91dDtcbiAgICB9XG4gICAgZ2V0IHBhcnRpYWxNZXNzYWdlVGltZW91dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dDtcbiAgICB9XG4gICAgbGlzdGVuKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMubmV4dE1lc3NhZ2VMZW5ndGggPSAtMTtcbiAgICAgICAgdGhpcy5tZXNzYWdlVG9rZW4gPSAwO1xuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlVGltZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5yZWFkYWJsZS5vbkRhdGEoKGRhdGEpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25EYXRhKGRhdGEpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZS5vbkVycm9yKChlcnJvcikgPT4gdGhpcy5maXJlRXJyb3IoZXJyb3IpKTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZS5vbkNsb3NlKCgpID0+IHRoaXMuZmlyZUNsb3NlKCkpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBvbkRhdGEoZGF0YSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5idWZmZXIuYXBwZW5kKGRhdGEpO1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IHRoaXMuYnVmZmVyLnRyeVJlYWRIZWFkZXJzKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50TGVuZ3RoID0gaGVhZGVycy5nZXQoJ2NvbnRlbnQtbGVuZ3RoJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY29udGVudExlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IobmV3IEVycm9yKGBIZWFkZXIgbXVzdCBwcm92aWRlIGEgQ29udGVudC1MZW5ndGggcHJvcGVydHkuXFxuJHtKU09OLnN0cmluZ2lmeShPYmplY3QuZnJvbUVudHJpZXMoaGVhZGVycykpfWApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsZW5ndGggPSBwYXJzZUludChjb250ZW50TGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKGxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKG5ldyBFcnJvcihgQ29udGVudC1MZW5ndGggdmFsdWUgbXVzdCBiZSBhIG51bWJlci4gR290ICR7Y29udGVudExlbmd0aH1gKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IHRoaXMuYnVmZmVyLnRyeVJlYWRCb2R5KHRoaXMubmV4dE1lc3NhZ2VMZW5ndGgpO1xuICAgICAgICAgICAgICAgIGlmIChib2R5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLyoqIFdlIGhhdmVuJ3QgcmVjZWl2ZWQgdGhlIGZ1bGwgbWVzc2FnZSB5ZXQuICovXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0UGFydGlhbE1lc3NhZ2VUaW1lcigpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJQYXJ0aWFsTWVzc2FnZVRpbWVyKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9IC0xO1xuICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHdlIGNvbnZlcnQgb25lIHJlY2VpdmVkIG1lc3NhZ2UgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAgICAgLy8gb3RoZXIuIE90aGVyd2lzZSBpdCBjb3VsZCBoYXBwZW4gdGhhdCBhIGRlY29kaW5nIG9mIGEgc2Vjb25kXG4gICAgICAgICAgICAgICAgLy8gc21hbGxlciBtZXNzYWdlIGZpbmlzaGVkIGJlZm9yZSB0aGUgZGVjb2Rpbmcgb2YgYSBmaXJzdCBsYXJnZXJcbiAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIGFuZCB0aGVuIHdlIHdvdWxkIGRlbGl2ZXIgdGhlIHNlY29uZCBtZXNzYWdlIGZpcnN0LlxuICAgICAgICAgICAgICAgIHRoaXMucmVhZFNlbWFwaG9yZS5sb2NrKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnl0ZXMgPSB0aGlzLm9wdGlvbnMuY29udGVudERlY29kZXIgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBhd2FpdCB0aGlzLm9wdGlvbnMuY29udGVudERlY29kZXIuZGVjb2RlKGJvZHkpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGJvZHk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBhd2FpdCB0aGlzLm9wdGlvbnMuY29udGVudFR5cGVEZWNvZGVyLmRlY29kZShieXRlcywgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjayhtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNsZWFyUGFydGlhbE1lc3NhZ2VUaW1lcigpIHtcbiAgICAgICAgaWYgKHRoaXMucGFydGlhbE1lc3NhZ2VUaW1lcikge1xuICAgICAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZVRpbWVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRoaXMucGFydGlhbE1lc3NhZ2VUaW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRQYXJ0aWFsTWVzc2FnZVRpbWVyKCkge1xuICAgICAgICB0aGlzLmNsZWFyUGFydGlhbE1lc3NhZ2VUaW1lcigpO1xuICAgICAgICBpZiAodGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0IDw9IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlVGltZXIgPSAoMCwgcmFsXzEuZGVmYXVsdCkoKS50aW1lci5zZXRUaW1lb3V0KCh0b2tlbiwgdGltZW91dCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZVRpbWVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRva2VuID09PSB0aGlzLm1lc3NhZ2VUb2tlbikge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZVBhcnRpYWxNZXNzYWdlKHsgbWVzc2FnZVRva2VuOiB0b2tlbiwgd2FpdGluZ1RpbWU6IHRpbWVvdXQgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRQYXJ0aWFsTWVzc2FnZVRpbWVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dCwgdGhpcy5tZXNzYWdlVG9rZW4sIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dCk7XG4gICAgfVxufVxuZXhwb3J0cy5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXIgPSBSZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLldyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLkFic3RyYWN0TWVzc2FnZVdyaXRlciA9IGV4cG9ydHMuTWVzc2FnZVdyaXRlciA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IHNlbWFwaG9yZV8xID0gcmVxdWlyZShcIi4vc2VtYXBob3JlXCIpO1xuY29uc3QgZXZlbnRzXzEgPSByZXF1aXJlKFwiLi9ldmVudHNcIik7XG5jb25zdCBDb250ZW50TGVuZ3RoID0gJ0NvbnRlbnQtTGVuZ3RoOiAnO1xuY29uc3QgQ1JMRiA9ICdcXHJcXG4nO1xudmFyIE1lc3NhZ2VXcml0ZXI7XG4oZnVuY3Rpb24gKE1lc3NhZ2VXcml0ZXIpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgSXMuZnVuYyhjYW5kaWRhdGUuZGlzcG9zZSkgJiYgSXMuZnVuYyhjYW5kaWRhdGUub25DbG9zZSkgJiZcbiAgICAgICAgICAgIElzLmZ1bmMoY2FuZGlkYXRlLm9uRXJyb3IpICYmIElzLmZ1bmMoY2FuZGlkYXRlLndyaXRlKTtcbiAgICB9XG4gICAgTWVzc2FnZVdyaXRlci5pcyA9IGlzO1xufSkoTWVzc2FnZVdyaXRlciB8fCAoZXhwb3J0cy5NZXNzYWdlV3JpdGVyID0gTWVzc2FnZVdyaXRlciA9IHt9KSk7XG5jbGFzcyBBYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy5lcnJvckVtaXR0ZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLmNsb3NlRW1pdHRlci5kaXNwb3NlKCk7XG4gICAgfVxuICAgIGdldCBvbkVycm9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lcnJvckVtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGZpcmVFcnJvcihlcnJvciwgbWVzc2FnZSwgY291bnQpIHtcbiAgICAgICAgdGhpcy5lcnJvckVtaXR0ZXIuZmlyZShbdGhpcy5hc0Vycm9yKGVycm9yKSwgbWVzc2FnZSwgY291bnRdKTtcbiAgICB9XG4gICAgZ2V0IG9uQ2xvc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb3NlRW1pdHRlci5ldmVudDtcbiAgICB9XG4gICAgZmlyZUNsb3NlKCkge1xuICAgICAgICB0aGlzLmNsb3NlRW1pdHRlci5maXJlKHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIGFzRXJyb3IoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoYFdyaXRlciByZWNlaXZlZCBlcnJvci4gUmVhc29uOiAke0lzLnN0cmluZyhlcnJvci5tZXNzYWdlKSA/IGVycm9yLm1lc3NhZ2UgOiAndW5rbm93bid9YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLkFic3RyYWN0TWVzc2FnZVdyaXRlciA9IEFic3RyYWN0TWVzc2FnZVdyaXRlcjtcbnZhciBSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zO1xuKGZ1bmN0aW9uIChSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zKSB7XG4gICAgZnVuY3Rpb24gZnJvbU9wdGlvbnMob3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHsgY2hhcnNldDogb3B0aW9ucyA/PyAndXRmLTgnLCBjb250ZW50VHlwZUVuY29kZXI6ICgwLCByYWxfMS5kZWZhdWx0KSgpLmFwcGxpY2F0aW9uSnNvbi5lbmNvZGVyIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4geyBjaGFyc2V0OiBvcHRpb25zLmNoYXJzZXQgPz8gJ3V0Zi04JywgY29udGVudEVuY29kZXI6IG9wdGlvbnMuY29udGVudEVuY29kZXIsIGNvbnRlbnRUeXBlRW5jb2Rlcjogb3B0aW9ucy5jb250ZW50VHlwZUVuY29kZXIgPz8gKDAsIHJhbF8xLmRlZmF1bHQpKCkuYXBwbGljYXRpb25Kc29uLmVuY29kZXIgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zLmZyb21PcHRpb25zID0gZnJvbU9wdGlvbnM7XG59KShSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zIHx8IChSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zID0ge30pKTtcbmNsYXNzIFdyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKHdyaXRhYmxlLCBvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMud3JpdGFibGUgPSB3cml0YWJsZTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gUmVzb2x2ZWRNZXNzYWdlV3JpdGVyT3B0aW9ucy5mcm9tT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50ID0gMDtcbiAgICAgICAgdGhpcy53cml0ZVNlbWFwaG9yZSA9IG5ldyBzZW1hcGhvcmVfMS5TZW1hcGhvcmUoMSk7XG4gICAgICAgIHRoaXMud3JpdGFibGUub25FcnJvcigoZXJyb3IpID0+IHRoaXMuZmlyZUVycm9yKGVycm9yKSk7XG4gICAgICAgIHRoaXMud3JpdGFibGUub25DbG9zZSgoKSA9PiB0aGlzLmZpcmVDbG9zZSgpKTtcbiAgICB9XG4gICAgYXN5bmMgd3JpdGUobXNnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndyaXRlU2VtYXBob3JlLmxvY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHRoaXMub3B0aW9ucy5jb250ZW50VHlwZUVuY29kZXIuZW5jb2RlKG1zZywgdGhpcy5vcHRpb25zKS50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNvbnRlbnRFbmNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jb250ZW50RW5jb2Rlci5lbmNvZGUoYnVmZmVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZC50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJzID0gW107XG4gICAgICAgICAgICAgICAgaGVhZGVycy5wdXNoKENvbnRlbnRMZW5ndGgsIGJ1ZmZlci5ieXRlTGVuZ3RoLnRvU3RyaW5nKCksIENSTEYpO1xuICAgICAgICAgICAgICAgIGhlYWRlcnMucHVzaChDUkxGKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kb1dyaXRlKG1zZywgaGVhZGVycywgYnVmZmVyKTtcbiAgICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgZG9Xcml0ZShtc2csIGhlYWRlcnMsIGRhdGEpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMud3JpdGFibGUud3JpdGUoaGVhZGVycy5qb2luKCcnKSwgJ2FzY2lpJyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy53cml0YWJsZS53cml0ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IsIG1zZyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZUVycm9yKGVycm9yLCBtc2cpIHtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50Kys7XG4gICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yLCBtc2csIHRoaXMuZXJyb3JDb3VudCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICAgICAgdGhpcy53cml0YWJsZS5lbmQoKTtcbiAgICB9XG59XG5leHBvcnRzLldyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgPSBXcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkFic3RyYWN0TWVzc2FnZUJ1ZmZlciA9IHZvaWQgMDtcbmNvbnN0IENSID0gMTM7XG5jb25zdCBMRiA9IDEwO1xuY29uc3QgQ1JMRiA9ICdcXHJcXG4nO1xuY2xhc3MgQWJzdHJhY3RNZXNzYWdlQnVmZmVyIHtcbiAgICBjb25zdHJ1Y3RvcihlbmNvZGluZyA9ICd1dGYtOCcpIHtcbiAgICAgICAgdGhpcy5fZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgICAgICAgdGhpcy5fY2h1bmtzID0gW107XG4gICAgICAgIHRoaXMuX3RvdGFsTGVuZ3RoID0gMDtcbiAgICB9XG4gICAgZ2V0IGVuY29kaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW5jb2Rpbmc7XG4gICAgfVxuICAgIGFwcGVuZChjaHVuaykge1xuICAgICAgICBjb25zdCB0b0FwcGVuZCA9IHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZycgPyB0aGlzLmZyb21TdHJpbmcoY2h1bmssIHRoaXMuX2VuY29kaW5nKSA6IGNodW5rO1xuICAgICAgICB0aGlzLl9jaHVua3MucHVzaCh0b0FwcGVuZCk7XG4gICAgICAgIHRoaXMuX3RvdGFsTGVuZ3RoICs9IHRvQXBwZW5kLmJ5dGVMZW5ndGg7XG4gICAgfVxuICAgIHRyeVJlYWRIZWFkZXJzKGxvd2VyQ2FzZUtleXMgPSBmYWxzZSkge1xuICAgICAgICBpZiAodGhpcy5fY2h1bmtzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3RhdGUgPSAwO1xuICAgICAgICBsZXQgY2h1bmtJbmRleCA9IDA7XG4gICAgICAgIGxldCBvZmZzZXQgPSAwO1xuICAgICAgICBsZXQgY2h1bmtCeXRlc1JlYWQgPSAwO1xuICAgICAgICByb3c6IHdoaWxlIChjaHVua0luZGV4IDwgdGhpcy5fY2h1bmtzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgY2h1bmsgPSB0aGlzLl9jaHVua3NbY2h1bmtJbmRleF07XG4gICAgICAgICAgICBvZmZzZXQgPSAwO1xuICAgICAgICAgICAgY29sdW1uOiB3aGlsZSAob2Zmc2V0IDwgY2h1bmsubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjaHVua1tvZmZzZXRdO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDUjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIExGOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gNDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHJvdztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjaHVua0J5dGVzUmVhZCArPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgY2h1bmtJbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZSAhPT0gNCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgYnVmZmVyIGNvbnRhaW5zIHRoZSB0d28gQ1JMRiBhdCB0aGUgZW5kLiBTbyB3ZSB3aWxsXG4gICAgICAgIC8vIGhhdmUgdHdvIGVtcHR5IGxpbmVzIGFmdGVyIHRoZSBzcGxpdCBhdCB0aGUgZW5kIGFzIHdlbGwuXG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuX3JlYWQoY2h1bmtCeXRlc1JlYWQgKyBvZmZzZXQpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwKCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLnRvU3RyaW5nKGJ1ZmZlciwgJ2FzY2lpJykuc3BsaXQoQ1JMRik7XG4gICAgICAgIGlmIChoZWFkZXJzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXJzLmxlbmd0aCAtIDI7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaGVhZGVyID0gaGVhZGVyc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gaGVhZGVyLmluZGV4T2YoJzonKTtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1lc3NhZ2UgaGVhZGVyIG11c3Qgc2VwYXJhdGUga2V5IGFuZCB2YWx1ZSB1c2luZyAnOidcXG4ke2hlYWRlcn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGhlYWRlci5zdWJzdHIoMCwgaW5kZXgpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBoZWFkZXIuc3Vic3RyKGluZGV4ICsgMSkudHJpbSgpO1xuICAgICAgICAgICAgcmVzdWx0LnNldChsb3dlckNhc2VLZXlzID8ga2V5LnRvTG93ZXJDYXNlKCkgOiBrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICB0cnlSZWFkQm9keShsZW5ndGgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3RvdGFsTGVuZ3RoIDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkKGxlbmd0aCk7XG4gICAgfVxuICAgIGdldCBudW1iZXJPZkJ5dGVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdG90YWxMZW5ndGg7XG4gICAgfVxuICAgIF9yZWFkKGJ5dGVDb3VudCkge1xuICAgICAgICBpZiAoYnl0ZUNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbXB0eUJ1ZmZlcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChieXRlQ291bnQgPiB0aGlzLl90b3RhbExlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVhZCBzbyBtYW55IGJ5dGVzIWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jaHVua3NbMF0uYnl0ZUxlbmd0aCA9PT0gYnl0ZUNvdW50KSB7XG4gICAgICAgICAgICAvLyBzdXBlciBmYXN0IHBhdGgsIHByZWNpc2VseSBmaXJzdCBjaHVuayBtdXN0IGJlIHJldHVybmVkXG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1swXTtcbiAgICAgICAgICAgIHRoaXMuX2NodW5rcy5zaGlmdCgpO1xuICAgICAgICAgICAgdGhpcy5fdG90YWxMZW5ndGggLT0gYnl0ZUNvdW50O1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXNOYXRpdmUoY2h1bmspO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jaHVua3NbMF0uYnl0ZUxlbmd0aCA+IGJ5dGVDb3VudCkge1xuICAgICAgICAgICAgLy8gZmFzdCBwYXRoLCB0aGUgcmVhZGluZyBpcyBlbnRpcmVseSB3aXRoaW4gdGhlIGZpcnN0IGNodW5rXG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1swXTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuYXNOYXRpdmUoY2h1bmssIGJ5dGVDb3VudCk7XG4gICAgICAgICAgICB0aGlzLl9jaHVua3NbMF0gPSBjaHVuay5zbGljZShieXRlQ291bnQpO1xuICAgICAgICAgICAgdGhpcy5fdG90YWxMZW5ndGggLT0gYnl0ZUNvdW50O1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmFsbG9jTmF0aXZlKGJ5dGVDb3VudCk7XG4gICAgICAgIGxldCByZXN1bHRPZmZzZXQgPSAwO1xuICAgICAgICBsZXQgY2h1bmtJbmRleCA9IDA7XG4gICAgICAgIHdoaWxlIChieXRlQ291bnQgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1tjaHVua0luZGV4XTtcbiAgICAgICAgICAgIGlmIChjaHVuay5ieXRlTGVuZ3RoID4gYnl0ZUNvdW50KSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBjaHVuayB3aWxsIHN1cnZpdmVcbiAgICAgICAgICAgICAgICBjb25zdCBjaHVua1BhcnQgPSBjaHVuay5zbGljZSgwLCBieXRlQ291bnQpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5zZXQoY2h1bmtQYXJ0LCByZXN1bHRPZmZzZXQpO1xuICAgICAgICAgICAgICAgIHJlc3VsdE9mZnNldCArPSBieXRlQ291bnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2h1bmtzW2NodW5rSW5kZXhdID0gY2h1bmsuc2xpY2UoYnl0ZUNvdW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLl90b3RhbExlbmd0aCAtPSBieXRlQ291bnQ7XG4gICAgICAgICAgICAgICAgYnl0ZUNvdW50IC09IGJ5dGVDb3VudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHRoaXMgY2h1bmsgd2lsbCBiZSBlbnRpcmVseSByZWFkXG4gICAgICAgICAgICAgICAgcmVzdWx0LnNldChjaHVuaywgcmVzdWx0T2Zmc2V0KTtcbiAgICAgICAgICAgICAgICByZXN1bHRPZmZzZXQgKz0gY2h1bmsuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgICAgICB0aGlzLl9jaHVua3Muc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl90b3RhbExlbmd0aCAtPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgICAgIGJ5dGVDb3VudCAtPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VCdWZmZXIgPSBBYnN0cmFjdE1lc3NhZ2VCdWZmZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uID0gZXhwb3J0cy5Db25uZWN0aW9uT3B0aW9ucyA9IGV4cG9ydHMuTWVzc2FnZVN0cmF0ZWd5ID0gZXhwb3J0cy5DYW5jZWxsYXRpb25TdHJhdGVneSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gZXhwb3J0cy5JZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IGV4cG9ydHMuQ29ubmVjdGlvbkVycm9yID0gZXhwb3J0cy5Db25uZWN0aW9uRXJyb3JzID0gZXhwb3J0cy5Mb2dUcmFjZU5vdGlmaWNhdGlvbiA9IGV4cG9ydHMuU2V0VHJhY2VOb3RpZmljYXRpb24gPSBleHBvcnRzLlRyYWNlRm9ybWF0ID0gZXhwb3J0cy5UcmFjZVZhbHVlcyA9IGV4cG9ydHMuVHJhY2UgPSBleHBvcnRzLk51bGxMb2dnZXIgPSBleHBvcnRzLlByb2dyZXNzVHlwZSA9IGV4cG9ydHMuUHJvZ3Jlc3NUb2tlbiA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IG1lc3NhZ2VzXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlc1wiKTtcbmNvbnN0IGxpbmtlZE1hcF8xID0gcmVxdWlyZShcIi4vbGlua2VkTWFwXCIpO1xuY29uc3QgZXZlbnRzXzEgPSByZXF1aXJlKFwiLi9ldmVudHNcIik7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbnZhciBDYW5jZWxOb3RpZmljYXRpb247XG4oZnVuY3Rpb24gKENhbmNlbE5vdGlmaWNhdGlvbikge1xuICAgIENhbmNlbE5vdGlmaWNhdGlvbi50eXBlID0gbmV3IG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZSgnJC9jYW5jZWxSZXF1ZXN0Jyk7XG59KShDYW5jZWxOb3RpZmljYXRpb24gfHwgKENhbmNlbE5vdGlmaWNhdGlvbiA9IHt9KSk7XG52YXIgUHJvZ3Jlc3NUb2tlbjtcbihmdW5jdGlvbiAoUHJvZ3Jlc3NUb2tlbikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG4gICAgfVxuICAgIFByb2dyZXNzVG9rZW4uaXMgPSBpcztcbn0pKFByb2dyZXNzVG9rZW4gfHwgKGV4cG9ydHMuUHJvZ3Jlc3NUb2tlbiA9IFByb2dyZXNzVG9rZW4gPSB7fSkpO1xudmFyIFByb2dyZXNzTm90aWZpY2F0aW9uO1xuKGZ1bmN0aW9uIChQcm9ncmVzc05vdGlmaWNhdGlvbikge1xuICAgIFByb2dyZXNzTm90aWZpY2F0aW9uLnR5cGUgPSBuZXcgbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlKCckL3Byb2dyZXNzJyk7XG59KShQcm9ncmVzc05vdGlmaWNhdGlvbiB8fCAoUHJvZ3Jlc3NOb3RpZmljYXRpb24gPSB7fSkpO1xuY2xhc3MgUHJvZ3Jlc3NUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICB9XG59XG5leHBvcnRzLlByb2dyZXNzVHlwZSA9IFByb2dyZXNzVHlwZTtcbnZhciBTdGFyUmVxdWVzdEhhbmRsZXI7XG4oZnVuY3Rpb24gKFN0YXJSZXF1ZXN0SGFuZGxlcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBJcy5mdW5jKHZhbHVlKTtcbiAgICB9XG4gICAgU3RhclJlcXVlc3RIYW5kbGVyLmlzID0gaXM7XG59KShTdGFyUmVxdWVzdEhhbmRsZXIgfHwgKFN0YXJSZXF1ZXN0SGFuZGxlciA9IHt9KSk7XG5leHBvcnRzLk51bGxMb2dnZXIgPSBPYmplY3QuZnJlZXplKHtcbiAgICBlcnJvcjogKCkgPT4geyB9LFxuICAgIHdhcm46ICgpID0+IHsgfSxcbiAgICBpbmZvOiAoKSA9PiB7IH0sXG4gICAgbG9nOiAoKSA9PiB7IH1cbn0pO1xudmFyIFRyYWNlO1xuKGZ1bmN0aW9uIChUcmFjZSkge1xuICAgIFRyYWNlW1RyYWNlW1wiT2ZmXCJdID0gMF0gPSBcIk9mZlwiO1xuICAgIFRyYWNlW1RyYWNlW1wiTWVzc2FnZXNcIl0gPSAxXSA9IFwiTWVzc2FnZXNcIjtcbiAgICBUcmFjZVtUcmFjZVtcIkNvbXBhY3RcIl0gPSAyXSA9IFwiQ29tcGFjdFwiO1xuICAgIFRyYWNlW1RyYWNlW1wiVmVyYm9zZVwiXSA9IDNdID0gXCJWZXJib3NlXCI7XG59KShUcmFjZSB8fCAoZXhwb3J0cy5UcmFjZSA9IFRyYWNlID0ge30pKTtcbnZhciBUcmFjZVZhbHVlcztcbihmdW5jdGlvbiAoVHJhY2VWYWx1ZXMpIHtcbiAgICAvKipcbiAgICAgKiBUdXJuIHRyYWNpbmcgb2ZmLlxuICAgICAqL1xuICAgIFRyYWNlVmFsdWVzLk9mZiA9ICdvZmYnO1xuICAgIC8qKlxuICAgICAqIFRyYWNlIG1lc3NhZ2VzIG9ubHkuXG4gICAgICovXG4gICAgVHJhY2VWYWx1ZXMuTWVzc2FnZXMgPSAnbWVzc2FnZXMnO1xuICAgIC8qKlxuICAgICAqIENvbXBhY3QgbWVzc2FnZSB0cmFjaW5nLlxuICAgICAqL1xuICAgIFRyYWNlVmFsdWVzLkNvbXBhY3QgPSAnY29tcGFjdCc7XG4gICAgLyoqXG4gICAgICogVmVyYm9zZSBtZXNzYWdlIHRyYWNpbmcuXG4gICAgICovXG4gICAgVHJhY2VWYWx1ZXMuVmVyYm9zZSA9ICd2ZXJib3NlJztcbn0pKFRyYWNlVmFsdWVzIHx8IChleHBvcnRzLlRyYWNlVmFsdWVzID0gVHJhY2VWYWx1ZXMgPSB7fSkpO1xuKGZ1bmN0aW9uIChUcmFjZSkge1xuICAgIGZ1bmN0aW9uIGZyb21TdHJpbmcodmFsdWUpIHtcbiAgICAgICAgaWYgKCFJcy5zdHJpbmcodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gVHJhY2UuT2ZmO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSAnb2ZmJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gVHJhY2UuT2ZmO1xuICAgICAgICAgICAgY2FzZSAnbWVzc2FnZXMnOlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5NZXNzYWdlcztcbiAgICAgICAgICAgIGNhc2UgJ2NvbXBhY3QnOlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5Db21wYWN0O1xuICAgICAgICAgICAgY2FzZSAndmVyYm9zZSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFRyYWNlLlZlcmJvc2U7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5PZmY7XG4gICAgICAgIH1cbiAgICB9XG4gICAgVHJhY2UuZnJvbVN0cmluZyA9IGZyb21TdHJpbmc7XG4gICAgZnVuY3Rpb24gdG9TdHJpbmcodmFsdWUpIHtcbiAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5PZmY6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdvZmYnO1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5NZXNzYWdlczpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ21lc3NhZ2VzJztcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuQ29tcGFjdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2NvbXBhY3QnO1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5WZXJib3NlOlxuICAgICAgICAgICAgICAgIHJldHVybiAndmVyYm9zZSc7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAnb2ZmJztcbiAgICAgICAgfVxuICAgIH1cbiAgICBUcmFjZS50b1N0cmluZyA9IHRvU3RyaW5nO1xufSkoVHJhY2UgfHwgKGV4cG9ydHMuVHJhY2UgPSBUcmFjZSA9IHt9KSk7XG52YXIgVHJhY2VGb3JtYXQ7XG4oZnVuY3Rpb24gKFRyYWNlRm9ybWF0KSB7XG4gICAgVHJhY2VGb3JtYXRbXCJUZXh0XCJdID0gXCJ0ZXh0XCI7XG4gICAgVHJhY2VGb3JtYXRbXCJKU09OXCJdID0gXCJqc29uXCI7XG59KShUcmFjZUZvcm1hdCB8fCAoZXhwb3J0cy5UcmFjZUZvcm1hdCA9IFRyYWNlRm9ybWF0ID0ge30pKTtcbihmdW5jdGlvbiAoVHJhY2VGb3JtYXQpIHtcbiAgICBmdW5jdGlvbiBmcm9tU3RyaW5nKHZhbHVlKSB7XG4gICAgICAgIGlmICghSXMuc3RyaW5nKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIFRyYWNlRm9ybWF0LlRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAodmFsdWUgPT09ICdqc29uJykge1xuICAgICAgICAgICAgcmV0dXJuIFRyYWNlRm9ybWF0LkpTT047XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gVHJhY2VGb3JtYXQuVGV4dDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBUcmFjZUZvcm1hdC5mcm9tU3RyaW5nID0gZnJvbVN0cmluZztcbn0pKFRyYWNlRm9ybWF0IHx8IChleHBvcnRzLlRyYWNlRm9ybWF0ID0gVHJhY2VGb3JtYXQgPSB7fSkpO1xudmFyIFNldFRyYWNlTm90aWZpY2F0aW9uO1xuKGZ1bmN0aW9uIChTZXRUcmFjZU5vdGlmaWNhdGlvbikge1xuICAgIFNldFRyYWNlTm90aWZpY2F0aW9uLnR5cGUgPSBuZXcgbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlKCckL3NldFRyYWNlJyk7XG59KShTZXRUcmFjZU5vdGlmaWNhdGlvbiB8fCAoZXhwb3J0cy5TZXRUcmFjZU5vdGlmaWNhdGlvbiA9IFNldFRyYWNlTm90aWZpY2F0aW9uID0ge30pKTtcbnZhciBMb2dUcmFjZU5vdGlmaWNhdGlvbjtcbihmdW5jdGlvbiAoTG9nVHJhY2VOb3RpZmljYXRpb24pIHtcbiAgICBMb2dUcmFjZU5vdGlmaWNhdGlvbi50eXBlID0gbmV3IG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZSgnJC9sb2dUcmFjZScpO1xufSkoTG9nVHJhY2VOb3RpZmljYXRpb24gfHwgKGV4cG9ydHMuTG9nVHJhY2VOb3RpZmljYXRpb24gPSBMb2dUcmFjZU5vdGlmaWNhdGlvbiA9IHt9KSk7XG52YXIgQ29ubmVjdGlvbkVycm9ycztcbihmdW5jdGlvbiAoQ29ubmVjdGlvbkVycm9ycykge1xuICAgIC8qKlxuICAgICAqIFRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZC5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uRXJyb3JzW0Nvbm5lY3Rpb25FcnJvcnNbXCJDbG9zZWRcIl0gPSAxXSA9IFwiQ2xvc2VkXCI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gZ290IGRpc3Bvc2VkLlxuICAgICAqL1xuICAgIENvbm5lY3Rpb25FcnJvcnNbQ29ubmVjdGlvbkVycm9yc1tcIkRpc3Bvc2VkXCJdID0gMl0gPSBcIkRpc3Bvc2VkXCI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBpbiBsaXN0ZW5pbmcgbW9kZS5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uRXJyb3JzW0Nvbm5lY3Rpb25FcnJvcnNbXCJBbHJlYWR5TGlzdGVuaW5nXCJdID0gM10gPSBcIkFscmVhZHlMaXN0ZW5pbmdcIjtcbn0pKENvbm5lY3Rpb25FcnJvcnMgfHwgKGV4cG9ydHMuQ29ubmVjdGlvbkVycm9ycyA9IENvbm5lY3Rpb25FcnJvcnMgPSB7fSkpO1xuY2xhc3MgQ29ubmVjdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNvZGUsIG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBDb25uZWN0aW9uRXJyb3IucHJvdG90eXBlKTtcbiAgICB9XG59XG5leHBvcnRzLkNvbm5lY3Rpb25FcnJvciA9IENvbm5lY3Rpb25FcnJvcjtcbnZhciBDb25uZWN0aW9uU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENvbm5lY3Rpb25TdHJhdGVneSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNhbmNlbFVuZGlzcGF0Y2hlZCk7XG4gICAgfVxuICAgIENvbm5lY3Rpb25TdHJhdGVneS5pcyA9IGlzO1xufSkoQ29ubmVjdGlvblN0cmF0ZWd5IHx8IChleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IENvbm5lY3Rpb25TdHJhdGVneSA9IHt9KSk7XG52YXIgSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5O1xuKGZ1bmN0aW9uIChJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiAoY2FuZGlkYXRlLmtpbmQgPT09IHVuZGVmaW5lZCB8fCBjYW5kaWRhdGUua2luZCA9PT0gJ2lkJykgJiYgSXMuZnVuYyhjYW5kaWRhdGUuY3JlYXRlQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UpICYmIChjYW5kaWRhdGUuZGlzcG9zZSA9PT0gdW5kZWZpbmVkIHx8IElzLmZ1bmMoY2FuZGlkYXRlLmRpc3Bvc2UpKTtcbiAgICB9XG4gICAgSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzID0gaXM7XG59KShJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgfHwgKGV4cG9ydHMuSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0ge30pKTtcbnZhciBSZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneTtcbihmdW5jdGlvbiAoUmVxdWVzdENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBjYW5kaWRhdGUua2luZCA9PT0gJ3JlcXVlc3QnICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKSAmJiAoY2FuZGlkYXRlLmRpc3Bvc2UgPT09IHVuZGVmaW5lZCB8fCBJcy5mdW5jKGNhbmRpZGF0ZS5kaXNwb3NlKSk7XG4gICAgfVxuICAgIFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzID0gaXM7XG59KShSZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSB8fCAoZXhwb3J0cy5SZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0ge30pKTtcbnZhciBDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5O1xuKGZ1bmN0aW9uIChDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5NZXNzYWdlID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKF8pIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgY2FuY2VsbGF0aW9uXzEuQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UoKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kuaXModmFsdWUpIHx8IFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKHZhbHVlKTtcbiAgICB9XG4gICAgQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5pcyA9IGlzO1xufSkoQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSB8fCAoZXhwb3J0cy5DYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IHt9KSk7XG52YXIgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENhbmNlbGxhdGlvblNlbmRlclN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kuTWVzc2FnZSA9IE9iamVjdC5mcmVlemUoe1xuICAgICAgICBzZW5kQ2FuY2VsbGF0aW9uKGNvbm4sIGlkKSB7XG4gICAgICAgICAgICByZXR1cm4gY29ubi5zZW5kTm90aWZpY2F0aW9uKENhbmNlbE5vdGlmaWNhdGlvbi50eXBlLCB7IGlkIH0pO1xuICAgICAgICB9LFxuICAgICAgICBjbGVhbnVwKF8pIHsgfVxuICAgIH0pO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLnNlbmRDYW5jZWxsYXRpb24pICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNsZWFudXApO1xuICAgIH1cbiAgICBDYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneS5pcyA9IGlzO1xufSkoQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgfHwgKGV4cG9ydHMuQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgPSBDYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneSA9IHt9KSk7XG52YXIgQ2FuY2VsbGF0aW9uU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENhbmNlbGxhdGlvblN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uU3RyYXRlZ3kuTWVzc2FnZSA9IE9iamVjdC5mcmVlemUoe1xuICAgICAgICByZWNlaXZlcjogQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5NZXNzYWdlLFxuICAgICAgICBzZW5kZXI6IENhbmNlbGxhdGlvblNlbmRlclN0cmF0ZWd5Lk1lc3NhZ2VcbiAgICB9KTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKGNhbmRpZGF0ZS5yZWNlaXZlcikgJiYgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kuaXMoY2FuZGlkYXRlLnNlbmRlcik7XG4gICAgfVxuICAgIENhbmNlbGxhdGlvblN0cmF0ZWd5LmlzID0gaXM7XG59KShDYW5jZWxsYXRpb25TdHJhdGVneSB8fCAoZXhwb3J0cy5DYW5jZWxsYXRpb25TdHJhdGVneSA9IENhbmNlbGxhdGlvblN0cmF0ZWd5ID0ge30pKTtcbnZhciBNZXNzYWdlU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKE1lc3NhZ2VTdHJhdGVneSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLmhhbmRsZU1lc3NhZ2UpO1xuICAgIH1cbiAgICBNZXNzYWdlU3RyYXRlZ3kuaXMgPSBpcztcbn0pKE1lc3NhZ2VTdHJhdGVneSB8fCAoZXhwb3J0cy5NZXNzYWdlU3RyYXRlZ3kgPSBNZXNzYWdlU3RyYXRlZ3kgPSB7fSkpO1xudmFyIENvbm5lY3Rpb25PcHRpb25zO1xuKGZ1bmN0aW9uIChDb25uZWN0aW9uT3B0aW9ucykge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIChDYW5jZWxsYXRpb25TdHJhdGVneS5pcyhjYW5kaWRhdGUuY2FuY2VsbGF0aW9uU3RyYXRlZ3kpIHx8IENvbm5lY3Rpb25TdHJhdGVneS5pcyhjYW5kaWRhdGUuY29ubmVjdGlvblN0cmF0ZWd5KSB8fCBNZXNzYWdlU3RyYXRlZ3kuaXMoY2FuZGlkYXRlLm1lc3NhZ2VTdHJhdGVneSkpO1xuICAgIH1cbiAgICBDb25uZWN0aW9uT3B0aW9ucy5pcyA9IGlzO1xufSkoQ29ubmVjdGlvbk9wdGlvbnMgfHwgKGV4cG9ydHMuQ29ubmVjdGlvbk9wdGlvbnMgPSBDb25uZWN0aW9uT3B0aW9ucyA9IHt9KSk7XG52YXIgQ29ubmVjdGlvblN0YXRlO1xuKGZ1bmN0aW9uIChDb25uZWN0aW9uU3RhdGUpIHtcbiAgICBDb25uZWN0aW9uU3RhdGVbQ29ubmVjdGlvblN0YXRlW1wiTmV3XCJdID0gMV0gPSBcIk5ld1wiO1xuICAgIENvbm5lY3Rpb25TdGF0ZVtDb25uZWN0aW9uU3RhdGVbXCJMaXN0ZW5pbmdcIl0gPSAyXSA9IFwiTGlzdGVuaW5nXCI7XG4gICAgQ29ubmVjdGlvblN0YXRlW0Nvbm5lY3Rpb25TdGF0ZVtcIkNsb3NlZFwiXSA9IDNdID0gXCJDbG9zZWRcIjtcbiAgICBDb25uZWN0aW9uU3RhdGVbQ29ubmVjdGlvblN0YXRlW1wiRGlzcG9zZWRcIl0gPSA0XSA9IFwiRGlzcG9zZWRcIjtcbn0pKENvbm5lY3Rpb25TdGF0ZSB8fCAoQ29ubmVjdGlvblN0YXRlID0ge30pKTtcbmZ1bmN0aW9uIGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uKG1lc3NhZ2VSZWFkZXIsIG1lc3NhZ2VXcml0ZXIsIF9sb2dnZXIsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBsb2dnZXIgPSBfbG9nZ2VyICE9PSB1bmRlZmluZWQgPyBfbG9nZ2VyIDogZXhwb3J0cy5OdWxsTG9nZ2VyO1xuICAgIGxldCBzZXF1ZW5jZU51bWJlciA9IDA7XG4gICAgbGV0IG5vdGlmaWNhdGlvblNlcXVlbmNlTnVtYmVyID0gMDtcbiAgICBsZXQgdW5rbm93blJlc3BvbnNlU2VxdWVuY2VOdW1iZXIgPSAwO1xuICAgIGNvbnN0IHZlcnNpb24gPSAnMi4wJztcbiAgICBsZXQgc3RhclJlcXVlc3RIYW5kbGVyID0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlcXVlc3RIYW5kbGVycyA9IG5ldyBNYXAoKTtcbiAgICBsZXQgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgY29uc3Qgbm90aWZpY2F0aW9uSGFuZGxlcnMgPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgcHJvZ3Jlc3NIYW5kbGVycyA9IG5ldyBNYXAoKTtcbiAgICBsZXQgdGltZXI7XG4gICAgbGV0IG1lc3NhZ2VRdWV1ZSA9IG5ldyBsaW5rZWRNYXBfMS5MaW5rZWRNYXAoKTtcbiAgICBsZXQgcmVzcG9uc2VQcm9taXNlcyA9IG5ldyBNYXAoKTtcbiAgICBsZXQga25vd25DYW5jZWxlZFJlcXVlc3RzID0gbmV3IFNldCgpO1xuICAgIGxldCByZXF1ZXN0VG9rZW5zID0gbmV3IE1hcCgpO1xuICAgIGxldCB0cmFjZSA9IFRyYWNlLk9mZjtcbiAgICBsZXQgdHJhY2VGb3JtYXQgPSBUcmFjZUZvcm1hdC5UZXh0O1xuICAgIGxldCB0cmFjZXI7XG4gICAgbGV0IHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLk5ldztcbiAgICBjb25zdCBlcnJvckVtaXR0ZXIgPSBuZXcgZXZlbnRzXzEuRW1pdHRlcigpO1xuICAgIGNvbnN0IGNsb3NlRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgdW5oYW5kbGVkTm90aWZpY2F0aW9uRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgdW5oYW5kbGVkUHJvZ3Jlc3NFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICBjb25zdCBkaXNwb3NlRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgY2FuY2VsbGF0aW9uU3RyYXRlZ3kgPSAob3B0aW9ucyAmJiBvcHRpb25zLmNhbmNlbGxhdGlvblN0cmF0ZWd5KSA/IG9wdGlvbnMuY2FuY2VsbGF0aW9uU3RyYXRlZ3kgOiBDYW5jZWxsYXRpb25TdHJhdGVneS5NZXNzYWdlO1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlcXVlc3RRdWV1ZUtleShpZCkge1xuICAgICAgICBpZiAoaWQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuJ3Qgc2VuZCByZXF1ZXN0cyB3aXRoIGlkIG51bGwgc2luY2UgdGhlIHJlc3BvbnNlIGNhbid0IGJlIGNvcnJlbGF0ZWQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdyZXEtJyArIGlkLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlc3BvbnNlUXVldWVLZXkoaWQpIHtcbiAgICAgICAgaWYgKGlkID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3Jlcy11bmtub3duLScgKyAoKyt1bmtub3duUmVzcG9uc2VTZXF1ZW5jZU51bWJlcikudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAncmVzLScgKyBpZC50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZU5vdGlmaWNhdGlvblF1ZXVlS2V5KCkge1xuICAgICAgICByZXR1cm4gJ25vdC0nICsgKCsrbm90aWZpY2F0aW9uU2VxdWVuY2VOdW1iZXIpLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFkZE1lc3NhZ2VUb1F1ZXVlKHF1ZXVlLCBtZXNzYWdlKSB7XG4gICAgICAgIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXF1ZXN0KG1lc3NhZ2UpKSB7XG4gICAgICAgICAgICBxdWV1ZS5zZXQoY3JlYXRlUmVxdWVzdFF1ZXVlS2V5KG1lc3NhZ2UuaWQpLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXNwb25zZShtZXNzYWdlKSkge1xuICAgICAgICAgICAgcXVldWUuc2V0KGNyZWF0ZVJlc3BvbnNlUXVldWVLZXkobWVzc2FnZS5pZCksIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcXVldWUuc2V0KGNyZWF0ZU5vdGlmaWNhdGlvblF1ZXVlS2V5KCksIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNhbmNlbFVuZGlzcGF0Y2hlZChfbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0xpc3RlbmluZygpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlID09PSBDb25uZWN0aW9uU3RhdGUuTGlzdGVuaW5nO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0Nsb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlID09PSBDb25uZWN0aW9uU3RhdGUuQ2xvc2VkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0Rpc3Bvc2VkKCkge1xuICAgICAgICByZXR1cm4gc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5EaXNwb3NlZDtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2xvc2VIYW5kbGVyKCkge1xuICAgICAgICBpZiAoc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5OZXcgfHwgc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5MaXN0ZW5pbmcpIHtcbiAgICAgICAgICAgIHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLkNsb3NlZDtcbiAgICAgICAgICAgIGNsb3NlRW1pdHRlci5maXJlKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlIGNvbm5lY3Rpb24gaXMgZGlzcG9zZWQgZG9uJ3Qgc2VudCBjbG9zZSBldmVudHMuXG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlYWRFcnJvckhhbmRsZXIoZXJyb3IpIHtcbiAgICAgICAgZXJyb3JFbWl0dGVyLmZpcmUoW2Vycm9yLCB1bmRlZmluZWQsIHVuZGVmaW5lZF0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiB3cml0ZUVycm9ySGFuZGxlcihkYXRhKSB7XG4gICAgICAgIGVycm9yRW1pdHRlci5maXJlKGRhdGEpO1xuICAgIH1cbiAgICBtZXNzYWdlUmVhZGVyLm9uQ2xvc2UoY2xvc2VIYW5kbGVyKTtcbiAgICBtZXNzYWdlUmVhZGVyLm9uRXJyb3IocmVhZEVycm9ySGFuZGxlcik7XG4gICAgbWVzc2FnZVdyaXRlci5vbkNsb3NlKGNsb3NlSGFuZGxlcik7XG4gICAgbWVzc2FnZVdyaXRlci5vbkVycm9yKHdyaXRlRXJyb3JIYW5kbGVyKTtcbiAgICBmdW5jdGlvbiB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCkge1xuICAgICAgICBpZiAodGltZXIgfHwgbWVzc2FnZVF1ZXVlLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aW1lciA9ICgwLCByYWxfMS5kZWZhdWx0KSgpLnRpbWVyLnNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICAgICAgICB0aW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHByb2Nlc3NNZXNzYWdlUXVldWUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGhhbmRsZU1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICBpZiAobWVzc2FnZXNfMS5NZXNzYWdlLmlzUmVxdWVzdChtZXNzYWdlKSkge1xuICAgICAgICAgICAgaGFuZGxlUmVxdWVzdChtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNOb3RpZmljYXRpb24obWVzc2FnZSkpIHtcbiAgICAgICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvbihtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXNwb25zZShtZXNzYWdlKSkge1xuICAgICAgICAgICAgaGFuZGxlUmVzcG9uc2UobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBoYW5kbGVJbnZhbGlkTWVzc2FnZShtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBwcm9jZXNzTWVzc2FnZVF1ZXVlKCkge1xuICAgICAgICBpZiAobWVzc2FnZVF1ZXVlLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXNzYWdlID0gbWVzc2FnZVF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlU3RyYXRlZ3kgPSBvcHRpb25zPy5tZXNzYWdlU3RyYXRlZ3k7XG4gICAgICAgICAgICBpZiAoTWVzc2FnZVN0cmF0ZWd5LmlzKG1lc3NhZ2VTdHJhdGVneSkpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlU3RyYXRlZ3kuaGFuZGxlTWVzc2FnZShtZXNzYWdlLCBoYW5kbGVNZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGhhbmRsZU1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgY2FsbGJhY2sgPSAobWVzc2FnZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2UgaGF2ZSByZWNlaXZlZCBhIGNhbmNlbGxhdGlvbiBtZXNzYWdlLiBDaGVjayBpZiB0aGUgbWVzc2FnZSBpcyBzdGlsbCBpbiB0aGUgcXVldWVcbiAgICAgICAgICAgIC8vIGFuZCBjYW5jZWwgaXQgaWYgYWxsb3dlZCB0byBkbyBzby5cbiAgICAgICAgICAgIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNOb3RpZmljYXRpb24obWVzc2FnZSkgJiYgbWVzc2FnZS5tZXRob2QgPT09IENhbmNlbE5vdGlmaWNhdGlvbi50eXBlLm1ldGhvZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbmNlbElkID0gbWVzc2FnZS5wYXJhbXMuaWQ7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gY3JlYXRlUmVxdWVzdFF1ZXVlS2V5KGNhbmNlbElkKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0b0NhbmNlbCA9IG1lc3NhZ2VRdWV1ZS5nZXQoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZXNfMS5NZXNzYWdlLmlzUmVxdWVzdCh0b0NhbmNlbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyYXRlZ3kgPSBvcHRpb25zPy5jb25uZWN0aW9uU3RyYXRlZ3k7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gKHN0cmF0ZWd5ICYmIHN0cmF0ZWd5LmNhbmNlbFVuZGlzcGF0Y2hlZCkgPyBzdHJhdGVneS5jYW5jZWxVbmRpc3BhdGNoZWQodG9DYW5jZWwsIGNhbmNlbFVuZGlzcGF0Y2hlZCkgOiBjYW5jZWxVbmRpc3BhdGNoZWQodG9DYW5jZWwpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgJiYgKHJlc3BvbnNlLmVycm9yICE9PSB1bmRlZmluZWQgfHwgcmVzcG9uc2UucmVzdWx0ICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUXVldWUuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLmRlbGV0ZShjYW5jZWxJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5pZCA9IHRvQ2FuY2VsLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VTZW5kaW5nUmVzcG9uc2UocmVzcG9uc2UsIG1lc3NhZ2UubWV0aG9kLCBEYXRlLm5vdygpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUocmVzcG9uc2UpLmNhdGNoKCgpID0+IGxvZ2dlci5lcnJvcihgU2VuZGluZyByZXNwb25zZSBmb3IgY2FuY2VsZWQgbWVzc2FnZSBmYWlsZWQuYCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGNhbmNlbGxhdGlvblRva2VuID0gcmVxdWVzdFRva2Vucy5nZXQoY2FuY2VsSWQpO1xuICAgICAgICAgICAgICAgIC8vIFRoZSByZXF1ZXN0IGlzIGFscmVhZHkgcnVubmluZy4gQ2FuY2VsIHRoZSB0b2tlblxuICAgICAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbmNlbGxhdGlvblRva2VuLmNhbmNlbCgpO1xuICAgICAgICAgICAgICAgICAgICB0cmFjZVJlY2VpdmVkTm90aWZpY2F0aW9uKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZW1lbWJlciB0aGUgY2FuY2VsIGJ1dCBzdGlsbCBxdWV1ZSB0aGUgbWVzc2FnZSB0b1xuICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbiB1cCBzdGF0ZSBpbiBwcm9jZXNzIG1lc3NhZ2UuXG4gICAgICAgICAgICAgICAgICAgIGtub3duQ2FuY2VsZWRSZXF1ZXN0cy5hZGQoY2FuY2VsSWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFkZE1lc3NhZ2VUb1F1ZXVlKG1lc3NhZ2VRdWV1ZSwgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGZ1bmN0aW9uIGhhbmRsZVJlcXVlc3QocmVxdWVzdE1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgLy8gd2UgcmV0dXJuIGhlcmUgc2lsZW50bHkgc2luY2Ugd2UgZmlyZWQgYW4gZXZlbnQgd2hlbiB0aGVcbiAgICAgICAgICAgIC8vIGNvbm5lY3Rpb24gZ290IGRpc3Bvc2VkLlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHJlcGx5KHJlc3VsdE9yRXJyb3IsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgaWQ6IHJlcXVlc3RNZXNzYWdlLmlkXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKHJlc3VsdE9yRXJyb3IgaW5zdGFuY2VvZiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlLmVycm9yID0gcmVzdWx0T3JFcnJvci50b0pzb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVzdWx0ID0gcmVzdWx0T3JFcnJvciA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHJlc3VsdE9yRXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cmFjZVNlbmRpbmdSZXNwb25zZShtZXNzYWdlLCBtZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICBtZXNzYWdlV3JpdGVyLndyaXRlKG1lc3NhZ2UpLmNhdGNoKCgpID0+IGxvZ2dlci5lcnJvcihgU2VuZGluZyByZXNwb25zZSBmYWlsZWQuYCkpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHJlcGx5RXJyb3IoZXJyb3IsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgaWQ6IHJlcXVlc3RNZXNzYWdlLmlkLFxuICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvci50b0pzb24oKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUobWVzc2FnZSkuY2F0Y2goKCkgPT4gbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlc3BvbnNlIGZhaWxlZC5gKSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gcmVwbHlTdWNjZXNzKHJlc3VsdCwgbWV0aG9kLCBzdGFydFRpbWUpIHtcbiAgICAgICAgICAgIC8vIFRoZSBKU09OIFJQQyBkZWZpbmVzIHRoYXQgYSByZXNwb25zZSBtdXN0IGVpdGhlciBoYXZlIGEgcmVzdWx0IG9yIGFuIGVycm9yXG4gICAgICAgICAgICAvLyBTbyB3ZSBjYW4ndCB0cmVhdCB1bmRlZmluZWQgYXMgYSB2YWxpZCByZXNwb25zZSByZXN1bHQuXG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgICAgICAgICAgICBqc29ucnBjOiB2ZXJzaW9uLFxuICAgICAgICAgICAgICAgIGlkOiByZXF1ZXN0TWVzc2FnZS5pZCxcbiAgICAgICAgICAgICAgICByZXN1bHQ6IHJlc3VsdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUobWVzc2FnZSkuY2F0Y2goKCkgPT4gbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlc3BvbnNlIGZhaWxlZC5gKSk7XG4gICAgICAgIH1cbiAgICAgICAgdHJhY2VSZWNlaXZlZFJlcXVlc3QocmVxdWVzdE1lc3NhZ2UpO1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gcmVxdWVzdEhhbmRsZXJzLmdldChyZXF1ZXN0TWVzc2FnZS5tZXRob2QpO1xuICAgICAgICBsZXQgdHlwZTtcbiAgICAgICAgbGV0IHJlcXVlc3RIYW5kbGVyO1xuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgdHlwZSA9IGVsZW1lbnQudHlwZTtcbiAgICAgICAgICAgIHJlcXVlc3RIYW5kbGVyID0gZWxlbWVudC5oYW5kbGVyO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIGlmIChyZXF1ZXN0SGFuZGxlciB8fCBzdGFyUmVxdWVzdEhhbmRsZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHRva2VuS2V5ID0gcmVxdWVzdE1lc3NhZ2UuaWQgPz8gU3RyaW5nKERhdGUubm93KCkpOyAvL1xuICAgICAgICAgICAgY29uc3QgY2FuY2VsbGF0aW9uU291cmNlID0gSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKGNhbmNlbGxhdGlvblN0cmF0ZWd5LnJlY2VpdmVyKVxuICAgICAgICAgICAgICAgID8gY2FuY2VsbGF0aW9uU3RyYXRlZ3kucmVjZWl2ZXIuY3JlYXRlQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UodG9rZW5LZXkpXG4gICAgICAgICAgICAgICAgOiBjYW5jZWxsYXRpb25TdHJhdGVneS5yZWNlaXZlci5jcmVhdGVDYW5jZWxsYXRpb25Ub2tlblNvdXJjZShyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICBpZiAocmVxdWVzdE1lc3NhZ2UuaWQgIT09IG51bGwgJiYga25vd25DYW5jZWxlZFJlcXVlc3RzLmhhcyhyZXF1ZXN0TWVzc2FnZS5pZCkpIHtcbiAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25Tb3VyY2UuY2FuY2VsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVxdWVzdE1lc3NhZ2UuaWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLnNldCh0b2tlbktleSwgY2FuY2VsbGF0aW9uU291cmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IGhhbmRsZXJSZXN1bHQ7XG4gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0TWVzc2FnZS5wYXJhbXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlLm51bWJlck9mUGFyYW1zICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1zLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyAke3R5cGUubnVtYmVyT2ZQYXJhbXN9IHBhcmFtcyBidXQgcmVjZWl2ZWQgbm9uZS5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJSZXN1bHQgPSByZXF1ZXN0SGFuZGxlcihjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVxdWVzdE1lc3NhZ2UucGFyYW1zKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlLnBhcmFtZXRlclN0cnVjdHVyZXMgPT09IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseUVycm9yKG5ldyBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IobWVzc2FnZXNfMS5FcnJvckNvZGVzLkludmFsaWRQYXJhbXMsIGBSZXF1ZXN0ICR7cmVxdWVzdE1lc3NhZ2UubWV0aG9kfSBkZWZpbmVzIHBhcmFtZXRlcnMgYnkgbmFtZSBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBwb3NpdGlvbmApLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlclJlc3VsdCA9IHJlcXVlc3RIYW5kbGVyKC4uLnJlcXVlc3RNZXNzYWdlLnBhcmFtcywgY2FuY2VsbGF0aW9uU291cmNlLnRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS5wYXJhbWV0ZXJTdHJ1Y3R1cmVzID09PSBtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW52YWxpZFBhcmFtcywgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGRlZmluZXMgcGFyYW1ldGVycyBieSBwb3NpdGlvbiBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBuYW1lYCksIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gcmVxdWVzdEhhbmRsZXIocmVxdWVzdE1lc3NhZ2UucGFyYW1zLCBjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0YXJSZXF1ZXN0SGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gc3RhclJlcXVlc3RIYW5kbGVyKHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgcmVxdWVzdE1lc3NhZ2UucGFyYW1zLCBjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBwcm9taXNlID0gaGFuZGxlclJlc3VsdDtcbiAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZXJSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFRva2Vucy5kZWxldGUodG9rZW5LZXkpO1xuICAgICAgICAgICAgICAgICAgICByZXBseVN1Y2Nlc3MoaGFuZGxlclJlc3VsdCwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwcm9taXNlLnRoZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS50aGVuKChyZXN1bHRPckVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLmRlbGV0ZSh0b2tlbktleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXBseShyZXN1bHRPckVycm9yLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IoZXJyb3IsIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVycm9yICYmIElzLnN0cmluZyhlcnJvci5tZXNzYWdlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGZhaWxlZCB3aXRoIG1lc3NhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZmFpbGVkIHVuZXhwZWN0ZWRseSB3aXRob3V0IHByb3ZpZGluZyBhbnkgZGV0YWlscy5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHkoaGFuZGxlclJlc3VsdCwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHkoZXJyb3IsIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZXJyb3IgJiYgSXMuc3RyaW5nKGVycm9yLm1lc3NhZ2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGZhaWxlZCB3aXRoIG1lc3NhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZmFpbGVkIHVuZXhwZWN0ZWRseSB3aXRob3V0IHByb3ZpZGluZyBhbnkgZGV0YWlscy5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuTWV0aG9kTm90Rm91bmQsIGBVbmhhbmRsZWQgbWV0aG9kICR7cmVxdWVzdE1lc3NhZ2UubWV0aG9kfWApLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlUmVzcG9uc2UocmVzcG9uc2VNZXNzYWdlKSB7XG4gICAgICAgIGlmIChpc0Rpc3Bvc2VkKCkpIHtcbiAgICAgICAgICAgIC8vIFNlZSBoYW5kbGUgcmVxdWVzdC5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzcG9uc2VNZXNzYWdlLmlkID09PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VNZXNzYWdlLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBSZWNlaXZlZCByZXNwb25zZSBtZXNzYWdlIHdpdGhvdXQgaWQ6IEVycm9yIGlzOiBcXG4ke0pTT04uc3RyaW5naWZ5KHJlc3BvbnNlTWVzc2FnZS5lcnJvciwgdW5kZWZpbmVkLCA0KX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgUmVjZWl2ZWQgcmVzcG9uc2UgbWVzc2FnZSB3aXRob3V0IGlkLiBObyBmdXJ0aGVyIGVycm9yIGluZm9ybWF0aW9uIHByb3ZpZGVkLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gcmVzcG9uc2VNZXNzYWdlLmlkO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VQcm9taXNlID0gcmVzcG9uc2VQcm9taXNlcy5nZXQoa2V5KTtcbiAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWRSZXNwb25zZShyZXNwb25zZU1lc3NhZ2UsIHJlc3BvbnNlUHJvbWlzZSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VQcm9taXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2VzLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZU1lc3NhZ2UuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gcmVzcG9uc2VNZXNzYWdlLmVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlLnJlamVjdChuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKGVycm9yLmNvZGUsIGVycm9yLm1lc3NhZ2UsIGVycm9yLmRhdGEpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXNwb25zZU1lc3NhZ2UucmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlTWVzc2FnZS5yZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgbmV2ZXIgaGFwcGVuLicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IubWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBSZXNwb25zZSBoYW5kbGVyICcke3Jlc3BvbnNlUHJvbWlzZS5tZXRob2R9JyBmYWlsZWQgd2l0aCBtZXNzYWdlOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYFJlc3BvbnNlIGhhbmRsZXIgJyR7cmVzcG9uc2VQcm9taXNlLm1ldGhvZH0nIGZhaWxlZCB1bmV4cGVjdGVkbHkuYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlTm90aWZpY2F0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgLy8gU2VlIGhhbmRsZSByZXF1ZXN0LlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0eXBlID0gdW5kZWZpbmVkO1xuICAgICAgICBsZXQgbm90aWZpY2F0aW9uSGFuZGxlcjtcbiAgICAgICAgaWYgKG1lc3NhZ2UubWV0aG9kID09PSBDYW5jZWxOb3RpZmljYXRpb24udHlwZS5tZXRob2QpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhbmNlbElkID0gbWVzc2FnZS5wYXJhbXMuaWQ7XG4gICAgICAgICAgICBrbm93bkNhbmNlbGVkUmVxdWVzdHMuZGVsZXRlKGNhbmNlbElkKTtcbiAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWROb3RpZmljYXRpb24obWVzc2FnZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gbm90aWZpY2F0aW9uSGFuZGxlcnMuZ2V0KG1lc3NhZ2UubWV0aG9kKTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uSGFuZGxlciA9IGVsZW1lbnQuaGFuZGxlcjtcbiAgICAgICAgICAgICAgICB0eXBlID0gZWxlbWVudC50eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChub3RpZmljYXRpb25IYW5kbGVyIHx8IHN0YXJOb3RpZmljYXRpb25IYW5kbGVyKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWROb3RpZmljYXRpb24obWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgaWYgKG5vdGlmaWNhdGlvbkhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UucGFyYW1zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5udW1iZXJPZlBhcmFtcyAhPT0gMCAmJiB0eXBlLnBhcmFtZXRlclN0cnVjdHVyZXMgIT09IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBOb3RpZmljYXRpb24gJHttZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyAke3R5cGUubnVtYmVyT2ZQYXJhbXN9IHBhcmFtcyBidXQgcmVjZWl2ZWQgbm9uZS5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShtZXNzYWdlLnBhcmFtcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGFyZSBKU09OLVJQQyBsaWJyYXJpZXMgdGhhdCBzZW5kIHByb2dyZXNzIG1lc3NhZ2UgYXMgcG9zaXRpb25hbCBwYXJhbXMgYWx0aG91Z2hcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpZmllZCBhcyBuYW1lZC4gU28gY29udmVydCB0aGVtIGlmIHRoaXMgaXMgdGhlIGNhc2UuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBtZXNzYWdlLnBhcmFtcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLm1ldGhvZCA9PT0gUHJvZ3Jlc3NOb3RpZmljYXRpb24udHlwZS5tZXRob2QgJiYgcGFyYW1zLmxlbmd0aCA9PT0gMiAmJiBQcm9ncmVzc1Rva2VuLmlzKHBhcmFtc1swXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKHsgdG9rZW46IHBhcmFtc1swXSwgdmFsdWU6IHBhcmFtc1sxXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUucGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBOb3RpZmljYXRpb24gJHttZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyBwYXJhbWV0ZXJzIGJ5IG5hbWUgYnV0IHJlY2VpdmVkIHBhcmFtZXRlcnMgYnkgcG9zaXRpb25gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5udW1iZXJPZlBhcmFtcyAhPT0gbWVzc2FnZS5wYXJhbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYE5vdGlmaWNhdGlvbiAke21lc3NhZ2UubWV0aG9kfSBkZWZpbmVzICR7dHlwZS5udW1iZXJPZlBhcmFtc30gcGFyYW1zIGJ1dCByZWNlaXZlZCAke3BhcmFtcy5sZW5ndGh9IGFyZ3VtZW50c2ApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXIoLi4ucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS5wYXJhbWV0ZXJTdHJ1Y3R1cmVzID09PSBtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgTm90aWZpY2F0aW9uICR7bWVzc2FnZS5tZXRob2R9IGRlZmluZXMgcGFyYW1ldGVycyBieSBwb3NpdGlvbiBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBuYW1lYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKG1lc3NhZ2UucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGFyTm90aWZpY2F0aW9uSGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICBzdGFyTm90aWZpY2F0aW9uSGFuZGxlcihtZXNzYWdlLm1ldGhvZCwgbWVzc2FnZS5wYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvci5tZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgTm90aWZpY2F0aW9uIGhhbmRsZXIgJyR7bWVzc2FnZS5tZXRob2R9JyBmYWlsZWQgd2l0aCBtZXNzYWdlOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYE5vdGlmaWNhdGlvbiBoYW5kbGVyICcke21lc3NhZ2UubWV0aG9kfScgZmFpbGVkIHVuZXhwZWN0ZWRseS5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1bmhhbmRsZWROb3RpZmljYXRpb25FbWl0dGVyLmZpcmUobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlSW52YWxpZE1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignUmVjZWl2ZWQgZW1wdHkgbWVzc2FnZS4nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsb2dnZXIuZXJyb3IoYFJlY2VpdmVkIG1lc3NhZ2Ugd2hpY2ggaXMgbmVpdGhlciBhIHJlc3BvbnNlIG5vciBhIG5vdGlmaWNhdGlvbiBtZXNzYWdlOlxcbiR7SlNPTi5zdHJpbmdpZnkobWVzc2FnZSwgbnVsbCwgNCl9YCk7XG4gICAgICAgIC8vIFRlc3Qgd2hldGhlciB3ZSBmaW5kIGFuIGlkIHRvIHJlamVjdCB0aGUgcHJvbWlzZVxuICAgICAgICBjb25zdCByZXNwb25zZU1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICBpZiAoSXMuc3RyaW5nKHJlc3BvbnNlTWVzc2FnZS5pZCkgfHwgSXMubnVtYmVyKHJlc3BvbnNlTWVzc2FnZS5pZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHJlc3BvbnNlTWVzc2FnZS5pZDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxlciA9IHJlc3BvbnNlUHJvbWlzZXMuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VIYW5kbGVyLnJlamVjdChuZXcgRXJyb3IoJ1RoZSByZWNlaXZlZCByZXNwb25zZSBoYXMgbmVpdGhlciBhIHJlc3VsdCBub3IgYW4gZXJyb3IgcHJvcGVydHkuJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0cmluZ2lmeVRyYWNlKHBhcmFtcykge1xuICAgICAgICBpZiAocGFyYW1zID09PSB1bmRlZmluZWQgfHwgcGFyYW1zID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAodHJhY2UpIHtcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuVmVyYm9zZTpcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGFyYW1zLCBudWxsLCA0KTtcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuQ29tcGFjdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGFyYW1zKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVNlbmRpbmdSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFjZUZvcm1hdCA9PT0gVHJhY2VGb3JtYXQuVGV4dCkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSAmJiBtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBgUGFyYW1zOiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucGFyYW1zKX1cXG5cXG5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJhY2VyLmxvZyhgU2VuZGluZyByZXF1ZXN0ICcke21lc3NhZ2UubWV0aG9kfSAtICgke21lc3NhZ2UuaWR9KScuYCwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb2dMU1BNZXNzYWdlKCdzZW5kLXJlcXVlc3QnLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVNlbmRpbmdOb3RpZmljYXRpb24obWVzc2FnZSkge1xuICAgICAgICBpZiAodHJhY2UgPT09IFRyYWNlLk9mZiB8fCAhdHJhY2VyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYWNlRm9ybWF0ID09PSBUcmFjZUZvcm1hdC5UZXh0KSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdCkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0gYFBhcmFtczogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLnBhcmFtcyl9XFxuXFxuYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSAnTm8gcGFyYW1ldGVycyBwcm92aWRlZC5cXG5cXG4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFNlbmRpbmcgbm90aWZpY2F0aW9uICcke21lc3NhZ2UubWV0aG9kfScuYCwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb2dMU1BNZXNzYWdlKCdzZW5kLW5vdGlmaWNhdGlvbicsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhY2VGb3JtYXQgPT09IFRyYWNlRm9ybWF0LlRleHQpIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZXJyb3IgJiYgbWVzc2FnZS5lcnJvci5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgRXJyb3IgZGF0YTogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLmVycm9yLmRhdGEpfVxcblxcbmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgUmVzdWx0OiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucmVzdWx0KX1cXG5cXG5gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UuZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9ICdObyByZXN1bHQgcmV0dXJuZWQuXFxuXFxuJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFNlbmRpbmcgcmVzcG9uc2UgJyR7bWV0aG9kfSAtICgke21lc3NhZ2UuaWR9KScuIFByb2Nlc3NpbmcgcmVxdWVzdCB0b29rICR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1tc2AsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgnc2VuZC1yZXNwb25zZScsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYWNlUmVjZWl2ZWRSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFjZUZvcm1hdCA9PT0gVHJhY2VGb3JtYXQuVGV4dCkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSAmJiBtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBgUGFyYW1zOiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucGFyYW1zKX1cXG5cXG5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJhY2VyLmxvZyhgUmVjZWl2ZWQgcmVxdWVzdCAnJHttZXNzYWdlLm1ldGhvZH0gLSAoJHttZXNzYWdlLmlkfSknLmAsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1yZXF1ZXN0JywgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdHJhY2VSZWNlaXZlZE5vdGlmaWNhdGlvbihtZXNzYWdlKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIgfHwgbWVzc2FnZS5tZXRob2QgPT09IExvZ1RyYWNlTm90aWZpY2F0aW9uLnR5cGUubWV0aG9kKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYWNlRm9ybWF0ID09PSBUcmFjZUZvcm1hdC5UZXh0KSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdCkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0gYFBhcmFtczogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLnBhcmFtcyl9XFxuXFxuYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSAnTm8gcGFyYW1ldGVycyBwcm92aWRlZC5cXG5cXG4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFJlY2VpdmVkIG5vdGlmaWNhdGlvbiAnJHttZXNzYWdlLm1ldGhvZH0nLmAsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1ub3RpZmljYXRpb24nLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVJlY2VpdmVkUmVzcG9uc2UobWVzc2FnZSwgcmVzcG9uc2VQcm9taXNlKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhY2VGb3JtYXQgPT09IFRyYWNlRm9ybWF0LlRleHQpIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZXJyb3IgJiYgbWVzc2FnZS5lcnJvci5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgRXJyb3IgZGF0YTogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLmVycm9yLmRhdGEpfVxcblxcbmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgUmVzdWx0OiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucmVzdWx0KX1cXG5cXG5gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UuZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9ICdObyByZXN1bHQgcmV0dXJuZWQuXFxuXFxuJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXNwb25zZVByb21pc2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IG1lc3NhZ2UuZXJyb3IgPyBgIFJlcXVlc3QgZmFpbGVkOiAke21lc3NhZ2UuZXJyb3IubWVzc2FnZX0gKCR7bWVzc2FnZS5lcnJvci5jb2RlfSkuYCA6ICcnO1xuICAgICAgICAgICAgICAgIHRyYWNlci5sb2coYFJlY2VpdmVkIHJlc3BvbnNlICcke3Jlc3BvbnNlUHJvbWlzZS5tZXRob2R9IC0gKCR7bWVzc2FnZS5pZH0pJyBpbiAke0RhdGUubm93KCkgLSByZXNwb25zZVByb21pc2UudGltZXJTdGFydH1tcy4ke2Vycm9yfWAsIGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJhY2VyLmxvZyhgUmVjZWl2ZWQgcmVzcG9uc2UgJHttZXNzYWdlLmlkfSB3aXRob3V0IGFjdGl2ZSByZXNwb25zZSBwcm9taXNlLmAsIGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1yZXNwb25zZScsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGxvZ0xTUE1lc3NhZ2UodHlwZSwgbWVzc2FnZSkge1xuICAgICAgICBpZiAoIXRyYWNlciB8fCB0cmFjZSA9PT0gVHJhY2UuT2ZmKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbHNwTWVzc2FnZSA9IHtcbiAgICAgICAgICAgIGlzTFNQTWVzc2FnZTogdHJ1ZSxcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpXG4gICAgICAgIH07XG4gICAgICAgIHRyYWNlci5sb2cobHNwTWVzc2FnZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRocm93SWZDbG9zZWRPckRpc3Bvc2VkKCkge1xuICAgICAgICBpZiAoaXNDbG9zZWQoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IENvbm5lY3Rpb25FcnJvcihDb25uZWN0aW9uRXJyb3JzLkNsb3NlZCwgJ0Nvbm5lY3Rpb24gaXMgY2xvc2VkLicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0Rpc3Bvc2VkKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb25uZWN0aW9uRXJyb3IoQ29ubmVjdGlvbkVycm9ycy5EaXNwb3NlZCwgJ0Nvbm5lY3Rpb24gaXMgZGlzcG9zZWQuJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdGhyb3dJZkxpc3RlbmluZygpIHtcbiAgICAgICAgaWYgKGlzTGlzdGVuaW5nKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb25uZWN0aW9uRXJyb3IoQ29ubmVjdGlvbkVycm9ycy5BbHJlYWR5TGlzdGVuaW5nLCAnQ29ubmVjdGlvbiBpcyBhbHJlYWR5IGxpc3RlbmluZycpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRocm93SWZOb3RMaXN0ZW5pbmcoKSB7XG4gICAgICAgIGlmICghaXNMaXN0ZW5pbmcoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYWxsIGxpc3RlbigpIGZpcnN0LicpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVuZGVmaW5lZFRvTnVsbChwYXJhbSkge1xuICAgICAgICBpZiAocGFyYW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyYW07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gbnVsbFRvVW5kZWZpbmVkKHBhcmFtKSB7XG4gICAgICAgIGlmIChwYXJhbSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJhbTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBpc05hbWVkUGFyYW0ocGFyYW0pIHtcbiAgICAgICAgcmV0dXJuIHBhcmFtICE9PSB1bmRlZmluZWQgJiYgcGFyYW0gIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkocGFyYW0pICYmIHR5cGVvZiBwYXJhbSA9PT0gJ29iamVjdCc7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXB1dGVTaW5nbGVQYXJhbShwYXJhbWV0ZXJTdHJ1Y3R1cmVzLCBwYXJhbSkge1xuICAgICAgICBzd2l0Y2ggKHBhcmFtZXRlclN0cnVjdHVyZXMpIHtcbiAgICAgICAgICAgIGNhc2UgbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG86XG4gICAgICAgICAgICAgICAgaWYgKGlzTmFtZWRQYXJhbShwYXJhbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxUb1VuZGVmaW5lZChwYXJhbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3VuZGVmaW5lZFRvTnVsbChwYXJhbSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZTpcbiAgICAgICAgICAgICAgICBpZiAoIWlzTmFtZWRQYXJhbShwYXJhbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWNlaXZlZCBwYXJhbWV0ZXJzIGJ5IG5hbWUgYnV0IHBhcmFtIGlzIG5vdCBhbiBvYmplY3QgbGl0ZXJhbC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGxUb1VuZGVmaW5lZChwYXJhbSk7XG4gICAgICAgICAgICBjYXNlIG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieVBvc2l0aW9uOlxuICAgICAgICAgICAgICAgIHJldHVybiBbdW5kZWZpbmVkVG9OdWxsKHBhcmFtKV07XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBwYXJhbWV0ZXIgc3RydWN0dXJlICR7cGFyYW1ldGVyU3RydWN0dXJlcy50b1N0cmluZygpfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXB1dGVNZXNzYWdlUGFyYW1zKHR5cGUsIHBhcmFtcykge1xuICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICBjb25zdCBudW1iZXJPZlBhcmFtcyA9IHR5cGUubnVtYmVyT2ZQYXJhbXM7XG4gICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gY29tcHV0ZVNpbmdsZVBhcmFtKHR5cGUucGFyYW1ldGVyU3RydWN0dXJlcywgcGFyYW1zWzBdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoICYmIGkgPCBudW1iZXJPZlBhcmFtczsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHVuZGVmaW5lZFRvTnVsbChwYXJhbXNbaV0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPCBudW1iZXJPZlBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gcGFyYW1zLmxlbmd0aDsgaSA8IG51bWJlck9mUGFyYW1zOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB7XG4gICAgICAgIHNlbmROb3RpZmljYXRpb246ICh0eXBlLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlUGFyYW1zO1xuICAgICAgICAgICAgaWYgKElzLnN0cmluZyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICAgIGxldCBwYXJhbVN0YXJ0ID0gMDtcbiAgICAgICAgICAgICAgICBsZXQgcGFyYW1ldGVyU3RydWN0dXJlcyA9IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvO1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuaXMoZmlyc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtU3RhcnQgPSAxO1xuICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gZmlyc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBwYXJhbUVuZCA9IGFyZ3MubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gcGFyYW1FbmQgLSBwYXJhbVN0YXJ0O1xuICAgICAgICAgICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zID0gY29tcHV0ZVNpbmdsZVBhcmFtKHBhcmFtZXRlclN0cnVjdHVyZXMsIGFyZ3NbcGFyYW1TdGFydF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjZWl2ZWQgJHtudW1iZXJPZlBhcmFtc30gcGFyYW1ldGVycyBmb3IgJ2J5IE5hbWUnIG5vdGlmaWNhdGlvbiBwYXJhbWV0ZXIgc3RydWN0dXJlLmApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IGFyZ3Muc2xpY2UocGFyYW1TdGFydCwgcGFyYW1FbmQpLm1hcCh2YWx1ZSA9PiB1bmRlZmluZWRUb051bGwodmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IGFyZ3M7XG4gICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZS5tZXRob2Q7XG4gICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IGNvbXB1dGVNZXNzYWdlUGFyYW1zKHR5cGUsIHBhcmFtcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBub3RpZmljYXRpb25NZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBtZXNzYWdlUGFyYW1zXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdHJhY2VTZW5kaW5nTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbk1lc3NhZ2UpO1xuICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2VXcml0ZXIud3JpdGUobm90aWZpY2F0aW9uTWVzc2FnZSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBTZW5kaW5nIG5vdGlmaWNhdGlvbiBmYWlsZWQuYCk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25Ob3RpZmljYXRpb246ICh0eXBlLCBoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGlmIChJcy5mdW5jKHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB0eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaGFuZGxlcikge1xuICAgICAgICAgICAgICAgIGlmIChJcy5zdHJpbmcodHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZTtcbiAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uSGFuZGxlcnMuc2V0KHR5cGUsIHsgdHlwZTogdW5kZWZpbmVkLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZS5tZXRob2Q7XG4gICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXJzLnNldCh0eXBlLm1ldGhvZCwgeyB0eXBlLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXJzLmRlbGV0ZShtZXRob2QpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBvblByb2dyZXNzOiAoX3R5cGUsIHRva2VuLCBoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgICBpZiAocHJvZ3Jlc3NIYW5kbGVycy5oYXModG9rZW4pKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm9ncmVzcyBoYW5kbGVyIGZvciB0b2tlbiAke3Rva2VufSBhbHJlYWR5IHJlZ2lzdGVyZWRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByb2dyZXNzSGFuZGxlcnMuc2V0KHRva2VuLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc0hhbmRsZXJzLmRlbGV0ZSh0b2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgc2VuZFByb2dyZXNzOiAoX3R5cGUsIHRva2VuLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGF3YWl0IGJ1dCBzaW1wbGUgcmV0dXJuIHRvIGVuc3VyZSB0aGF0IHdlIGRvbid0IGhhdmUgYW5vdGhlclxuICAgICAgICAgICAgLy8gYXN5bmMgc2NoZWR1bGluZy4gT3RoZXJ3aXNlIG9uZSBzZW5kIGNvdWxkIG92ZXJ0YWtlIGFub3RoZXIgc2VuZC5cbiAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLnNlbmROb3RpZmljYXRpb24oUHJvZ3Jlc3NOb3RpZmljYXRpb24udHlwZSwgeyB0b2tlbiwgdmFsdWUgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uVW5oYW5kbGVkUHJvZ3Jlc3M6IHVuaGFuZGxlZFByb2dyZXNzRW1pdHRlci5ldmVudCxcbiAgICAgICAgc2VuZFJlcXVlc3Q6ICh0eXBlLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgdGhyb3dJZk5vdExpc3RlbmluZygpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlUGFyYW1zO1xuICAgICAgICAgICAgbGV0IHRva2VuID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKElzLnN0cmluZyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3QgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgbGV0IHBhcmFtU3RhcnQgPSAwO1xuICAgICAgICAgICAgICAgIGxldCBwYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG87XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5pcyhmaXJzdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1TdGFydCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlclN0cnVjdHVyZXMgPSBmaXJzdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHBhcmFtRW5kID0gYXJncy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuLmlzKGxhc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtRW5kID0gcGFyYW1FbmQgLSAxO1xuICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IGxhc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gcGFyYW1FbmQgLSBwYXJhbVN0YXJ0O1xuICAgICAgICAgICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zID0gY29tcHV0ZVNpbmdsZVBhcmFtKHBhcmFtZXRlclN0cnVjdHVyZXMsIGFyZ3NbcGFyYW1TdGFydF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjZWl2ZWQgJHtudW1iZXJPZlBhcmFtc30gcGFyYW1ldGVycyBmb3IgJ2J5IE5hbWUnIHJlcXVlc3QgcGFyYW1ldGVyIHN0cnVjdHVyZS5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMgPSBhcmdzLnNsaWNlKHBhcmFtU3RhcnQsIHBhcmFtRW5kKS5tYXAodmFsdWUgPT4gdW5kZWZpbmVkVG9OdWxsKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBhcmdzO1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGUubWV0aG9kO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMgPSBjb21wdXRlTWVzc2FnZVBhcmFtcyh0eXBlLCBwYXJhbXMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gdHlwZS5udW1iZXJPZlBhcmFtcztcbiAgICAgICAgICAgICAgICB0b2tlbiA9IGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuLmlzKHBhcmFtc1tudW1iZXJPZlBhcmFtc10pID8gcGFyYW1zW251bWJlck9mUGFyYW1zXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGlkID0gc2VxdWVuY2VOdW1iZXIrKztcbiAgICAgICAgICAgIGxldCBkaXNwb3NhYmxlO1xuICAgICAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgICAgICAgZGlzcG9zYWJsZSA9IHRva2VuLm9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcCA9IGNhbmNlbGxhdGlvblN0cmF0ZWd5LnNlbmRlci5zZW5kQ2FuY2VsbGF0aW9uKGNvbm5lY3Rpb24sIGlkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhgUmVjZWl2ZWQgbm8gcHJvbWlzZSBmcm9tIGNhbmNlbGxhdGlvbiBzdHJhdGVneSB3aGVuIGNhbmNlbGxpbmcgaWQgJHtpZH1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIubG9nKGBTZW5kaW5nIGNhbmNlbGxhdGlvbiBtZXNzYWdlcyBmb3IgaWQgJHtpZH0gZmFpbGVkYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdE1lc3NhZ2UgPSB7XG4gICAgICAgICAgICAgICAganNvbnJwYzogdmVyc2lvbixcbiAgICAgICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBtZXNzYWdlUGFyYW1zXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdHJhY2VTZW5kaW5nUmVxdWVzdChyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNhbmNlbGxhdGlvblN0cmF0ZWd5LnNlbmRlci5lbmFibGVDYW5jZWxsYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25TdHJhdGVneS5zZW5kZXIuZW5hYmxlQ2FuY2VsbGF0aW9uKHJlcXVlc3RNZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZVdpdGhDbGVhbnVwID0gKHIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyKTtcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uU3RyYXRlZ3kuc2VuZGVyLmNsZWFudXAoaWQpO1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlPy5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWplY3RXaXRoQ2xlYW51cCA9IChyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChyKTtcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uU3RyYXRlZ3kuc2VuZGVyLmNsZWFudXAoaWQpO1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlPy5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZVByb21pc2UgPSB7IG1ldGhvZDogbWV0aG9kLCB0aW1lclN0YXJ0OiBEYXRlLm5vdygpLCByZXNvbHZlOiByZXNvbHZlV2l0aENsZWFudXAsIHJlamVjdDogcmVqZWN0V2l0aENsZWFudXAgfTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2VzLnNldChpZCwgcmVzcG9uc2VQcm9taXNlKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbWVzc2FnZVdyaXRlci53cml0ZShyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAvLyBXcml0aW5nIHRoZSBtZXNzYWdlIGZhaWxlZC4gU28gd2UgbmVlZCB0byBkZWxldGUgaXQgZnJvbSB0aGUgcmVzcG9uc2UgcHJvbWlzZXMgYW5kXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlamVjdCBpdC5cbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlcy5kZWxldGUoaWQpO1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2UucmVqZWN0KG5ldyBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IobWVzc2FnZXNfMS5FcnJvckNvZGVzLk1lc3NhZ2VXcml0ZUVycm9yLCBlcnJvci5tZXNzYWdlID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIHJlYXNvbicpKTtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlcXVlc3QgZmFpbGVkLmApO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25SZXF1ZXN0OiAodHlwZSwgaGFuZGxlcikgPT4ge1xuICAgICAgICAgICAgdGhyb3dJZkNsb3NlZE9yRGlzcG9zZWQoKTtcbiAgICAgICAgICAgIGxldCBtZXRob2QgPSBudWxsO1xuICAgICAgICAgICAgaWYgKFN0YXJSZXF1ZXN0SGFuZGxlci5pcyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBzdGFyUmVxdWVzdEhhbmRsZXIgPSB0eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoSXMuc3RyaW5nKHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgbWV0aG9kID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoaGFuZGxlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RIYW5kbGVycy5zZXQodHlwZSwgeyBoYW5kbGVyOiBoYW5kbGVyLCB0eXBlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSB0eXBlLm1ldGhvZDtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEhhbmRsZXJzLnNldCh0eXBlLm1ldGhvZCwgeyB0eXBlLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SGFuZGxlcnMuZGVsZXRlKG1ldGhvZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFyUmVxdWVzdEhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBoYXNQZW5kaW5nUmVzcG9uc2U6ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZVByb21pc2VzLnNpemUgPiAwO1xuICAgICAgICB9LFxuICAgICAgICB0cmFjZTogYXN5bmMgKF92YWx1ZSwgX3RyYWNlciwgc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBsZXQgX3NlbmROb3RpZmljYXRpb24gPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBfdHJhY2VGb3JtYXQgPSBUcmFjZUZvcm1hdC5UZXh0O1xuICAgICAgICAgICAgaWYgKHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKElzLmJvb2xlYW4oc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zKSkge1xuICAgICAgICAgICAgICAgICAgICBfc2VuZE5vdGlmaWNhdGlvbiA9IHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF9zZW5kTm90aWZpY2F0aW9uID0gc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zLnNlbmROb3RpZmljYXRpb24gfHwgZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIF90cmFjZUZvcm1hdCA9IHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucy50cmFjZUZvcm1hdCB8fCBUcmFjZUZvcm1hdC5UZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlID0gX3ZhbHVlO1xuICAgICAgICAgICAgdHJhY2VGb3JtYXQgPSBfdHJhY2VGb3JtYXQ7XG4gICAgICAgICAgICBpZiAodHJhY2UgPT09IFRyYWNlLk9mZikge1xuICAgICAgICAgICAgICAgIHRyYWNlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRyYWNlciA9IF90cmFjZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoX3NlbmROb3RpZmljYXRpb24gJiYgIWlzQ2xvc2VkKCkgJiYgIWlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGNvbm5lY3Rpb24uc2VuZE5vdGlmaWNhdGlvbihTZXRUcmFjZU5vdGlmaWNhdGlvbi50eXBlLCB7IHZhbHVlOiBUcmFjZS50b1N0cmluZyhfdmFsdWUpIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBvbkVycm9yOiBlcnJvckVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIG9uQ2xvc2U6IGNsb3NlRW1pdHRlci5ldmVudCxcbiAgICAgICAgb25VbmhhbmRsZWROb3RpZmljYXRpb246IHVuaGFuZGxlZE5vdGlmaWNhdGlvbkVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIG9uRGlzcG9zZTogZGlzcG9zZUVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIGVuZDogKCkgPT4ge1xuICAgICAgICAgICAgbWVzc2FnZVdyaXRlci5lbmQoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLkRpc3Bvc2VkO1xuICAgICAgICAgICAgZGlzcG9zZUVtaXR0ZXIuZmlyZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5QZW5kaW5nUmVzcG9uc2VSZWplY3RlZCwgJ1BlbmRpbmcgcmVzcG9uc2UgcmVqZWN0ZWQgc2luY2UgY29ubmVjdGlvbiBnb3QgZGlzcG9zZWQnKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvbWlzZSBvZiByZXNwb25zZVByb21pc2VzLnZhbHVlcygpKSB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBrbm93bkNhbmNlbGVkUmVxdWVzdHMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICBtZXNzYWdlUXVldWUgPSBuZXcgbGlua2VkTWFwXzEuTGlua2VkTWFwKCk7XG4gICAgICAgICAgICAvLyBUZXN0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgaWYgKElzLmZ1bmMobWVzc2FnZVdyaXRlci5kaXNwb3NlKSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKElzLmZ1bmMobWVzc2FnZVJlYWRlci5kaXNwb3NlKSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VSZWFkZXIuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBsaXN0ZW46ICgpID0+IHtcbiAgICAgICAgICAgIHRocm93SWZDbG9zZWRPckRpc3Bvc2VkKCk7XG4gICAgICAgICAgICB0aHJvd0lmTGlzdGVuaW5nKCk7XG4gICAgICAgICAgICBzdGF0ZSA9IENvbm5lY3Rpb25TdGF0ZS5MaXN0ZW5pbmc7XG4gICAgICAgICAgICBtZXNzYWdlUmVhZGVyLmxpc3RlbihjYWxsYmFjayk7XG4gICAgICAgIH0sXG4gICAgICAgIGluc3BlY3Q6ICgpID0+IHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS5jb25zb2xlLmxvZygnaW5zcGVjdCcpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25uZWN0aW9uLm9uTm90aWZpY2F0aW9uKExvZ1RyYWNlTm90aWZpY2F0aW9uLnR5cGUsIChwYXJhbXMpID0+IHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZlcmJvc2UgPSB0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdDtcbiAgICAgICAgdHJhY2VyLmxvZyhwYXJhbXMubWVzc2FnZSwgdmVyYm9zZSA/IHBhcmFtcy52ZXJib3NlIDogdW5kZWZpbmVkKTtcbiAgICB9KTtcbiAgICBjb25uZWN0aW9uLm9uTm90aWZpY2F0aW9uKFByb2dyZXNzTm90aWZpY2F0aW9uLnR5cGUsIChwYXJhbXMpID0+IHtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IHByb2dyZXNzSGFuZGxlcnMuZ2V0KHBhcmFtcy50b2tlbik7XG4gICAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICAgICBoYW5kbGVyKHBhcmFtcy52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1bmhhbmRsZWRQcm9ncmVzc0VtaXR0ZXIuZmlyZShwYXJhbXMpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbm5lY3Rpb247XG59XG5leHBvcnRzLmNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uID0gY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb247XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vdHlwaW5ncy90aGVuYWJsZS5kLnRzXCIgLz5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUHJvZ3Jlc3NUeXBlID0gZXhwb3J0cy5Qcm9ncmVzc1Rva2VuID0gZXhwb3J0cy5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiA9IGV4cG9ydHMuTnVsbExvZ2dlciA9IGV4cG9ydHMuQ29ubmVjdGlvbk9wdGlvbnMgPSBleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IGV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlQnVmZmVyID0gZXhwb3J0cy5Xcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyID0gZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLk1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLlJlYWRhYmxlU3RyZWFtTWVzc2FnZVJlYWRlciA9IGV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlUmVhZGVyID0gZXhwb3J0cy5NZXNzYWdlUmVhZGVyID0gZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblRva2VuID0gZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IGV4cG9ydHMuRW1pdHRlciA9IGV4cG9ydHMuRXZlbnQgPSBleHBvcnRzLkRpc3Bvc2FibGUgPSBleHBvcnRzLkxSVUNhY2hlID0gZXhwb3J0cy5Ub3VjaCA9IGV4cG9ydHMuTGlua2VkTWFwID0gZXhwb3J0cy5QYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlOSA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTggPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU3ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNiA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTUgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU0ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMyA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTIgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUxID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMCA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZSA9IGV4cG9ydHMuRXJyb3JDb2RlcyA9IGV4cG9ydHMuUmVzcG9uc2VFcnJvciA9IGV4cG9ydHMuUmVxdWVzdFR5cGU5ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTggPSBleHBvcnRzLlJlcXVlc3RUeXBlNyA9IGV4cG9ydHMuUmVxdWVzdFR5cGU2ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTUgPSBleHBvcnRzLlJlcXVlc3RUeXBlNCA9IGV4cG9ydHMuUmVxdWVzdFR5cGUzID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTIgPSBleHBvcnRzLlJlcXVlc3RUeXBlMSA9IGV4cG9ydHMuUmVxdWVzdFR5cGUwID0gZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IGV4cG9ydHMuTWVzc2FnZSA9IGV4cG9ydHMuUkFMID0gdm9pZCAwO1xuZXhwb3J0cy5NZXNzYWdlU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblN0cmF0ZWd5ID0gZXhwb3J0cy5DYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IGV4cG9ydHMuQ29ubmVjdGlvbkVycm9yID0gZXhwb3J0cy5Db25uZWN0aW9uRXJyb3JzID0gZXhwb3J0cy5Mb2dUcmFjZU5vdGlmaWNhdGlvbiA9IGV4cG9ydHMuU2V0VHJhY2VOb3RpZmljYXRpb24gPSBleHBvcnRzLlRyYWNlRm9ybWF0ID0gZXhwb3J0cy5UcmFjZVZhbHVlcyA9IGV4cG9ydHMuVHJhY2UgPSB2b2lkIDA7XG5jb25zdCBtZXNzYWdlc18xID0gcmVxdWlyZShcIi4vbWVzc2FnZXNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNZXNzYWdlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk1lc3NhZ2U7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlMFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTA7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTFcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGUxOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGUyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlMjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlM1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGU0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGU1XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlNTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlNlwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTY7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTdcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGU3OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGU4XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlODsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlOVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTk7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXNwb25zZUVycm9yXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3I7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJFcnJvckNvZGVzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLkVycm9yQ29kZXM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlMFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlMDsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGUxXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGUxOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZTJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlM1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlMzsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGU0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZTVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlNlwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlNjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGU3XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU3OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZThcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTg7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlOVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlOTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlBhcmFtZXRlclN0cnVjdHVyZXNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlczsgfSB9KTtcbmNvbnN0IGxpbmtlZE1hcF8xID0gcmVxdWlyZShcIi4vbGlua2VkTWFwXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTGlua2VkTWFwXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBsaW5rZWRNYXBfMS5MaW5rZWRNYXA7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJMUlVDYWNoZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbGlua2VkTWFwXzEuTFJVQ2FjaGU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJUb3VjaFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbGlua2VkTWFwXzEuVG91Y2g7IH0gfSk7XG5jb25zdCBkaXNwb3NhYmxlXzEgPSByZXF1aXJlKFwiLi9kaXNwb3NhYmxlXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiRGlzcG9zYWJsZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZGlzcG9zYWJsZV8xLkRpc3Bvc2FibGU7IH0gfSk7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCIuL2V2ZW50c1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkV2ZW50XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBldmVudHNfMS5FdmVudDsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkVtaXR0ZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGV2ZW50c18xLkVtaXR0ZXI7IH0gfSk7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblRva2VuU291cmNlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjYW5jZWxsYXRpb25fMS5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblRva2VuXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjYW5jZWxsYXRpb25fMS5DYW5jZWxsYXRpb25Ub2tlbjsgfSB9KTtcbmNvbnN0IHNoYXJlZEFycmF5Q2FuY2VsbGF0aW9uXzEgPSByZXF1aXJlKFwiLi9zaGFyZWRBcnJheUNhbmNlbGxhdGlvblwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHNoYXJlZEFycmF5Q2FuY2VsbGF0aW9uXzEuU2hhcmVkQXJyYXlTZW5kZXJTdHJhdGVneTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlNoYXJlZEFycmF5UmVjZWl2ZXJTdHJhdGVneVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gc2hhcmVkQXJyYXlDYW5jZWxsYXRpb25fMS5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3k7IH0gfSk7XG5jb25zdCBtZXNzYWdlUmVhZGVyXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlUmVhZGVyXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTWVzc2FnZVJlYWRlclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZVJlYWRlcl8xLk1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VSZWFkZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VSZWFkZXJfMS5BYnN0cmFjdE1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VSZWFkZXJfMS5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5jb25zdCBtZXNzYWdlV3JpdGVyXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlV3JpdGVyXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTWVzc2FnZVdyaXRlclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZVdyaXRlcl8xLk1lc3NhZ2VXcml0ZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VXcml0ZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VXcml0ZXJfMS5BYnN0cmFjdE1lc3NhZ2VXcml0ZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJXcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlV3JpdGVyXzEuV3JpdGVhYmxlU3RyZWFtTWVzc2FnZVdyaXRlcjsgfSB9KTtcbmNvbnN0IG1lc3NhZ2VCdWZmZXJfMSA9IHJlcXVpcmUoXCIuL21lc3NhZ2VCdWZmZXJcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VCdWZmZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VCdWZmZXJfMS5BYnN0cmFjdE1lc3NhZ2VCdWZmZXI7IH0gfSk7XG5jb25zdCBjb25uZWN0aW9uXzEgPSByZXF1aXJlKFwiLi9jb25uZWN0aW9uXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29ubmVjdGlvblN0cmF0ZWd5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ29ubmVjdGlvblN0cmF0ZWd5OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29ubmVjdGlvbk9wdGlvbnNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5Db25uZWN0aW9uT3B0aW9uczsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk51bGxMb2dnZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5OdWxsTG9nZ2VyOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb25cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlByb2dyZXNzVG9rZW5cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5Qcm9ncmVzc1Rva2VuOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUHJvZ3Jlc3NUeXBlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuUHJvZ3Jlc3NUeXBlOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiVHJhY2VcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5UcmFjZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlRyYWNlVmFsdWVzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuVHJhY2VWYWx1ZXM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJUcmFjZUZvcm1hdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29ubmVjdGlvbl8xLlRyYWNlRm9ybWF0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiU2V0VHJhY2VOb3RpZmljYXRpb25cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5TZXRUcmFjZU5vdGlmaWNhdGlvbjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkxvZ1RyYWNlTm90aWZpY2F0aW9uXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuTG9nVHJhY2VOb3RpZmljYXRpb247IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJDb25uZWN0aW9uRXJyb3JzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ29ubmVjdGlvbkVycm9yczsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNvbm5lY3Rpb25FcnJvclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29ubmVjdGlvbl8xLkNvbm5lY3Rpb25FcnJvcjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5DYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5DYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblN0cmF0ZWd5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ2FuY2VsbGF0aW9uU3RyYXRlZ3k7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNZXNzYWdlU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5NZXNzYWdlU3RyYXRlZ3k7IH0gfSk7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbmV4cG9ydHMuUkFMID0gcmFsXzEuZGVmYXVsdDtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGFwaV8xID0gcmVxdWlyZShcIi4uL2NvbW1vbi9hcGlcIik7XG5jbGFzcyBNZXNzYWdlQnVmZmVyIGV4dGVuZHMgYXBpXzEuQWJzdHJhY3RNZXNzYWdlQnVmZmVyIHtcbiAgICBjb25zdHJ1Y3RvcihlbmNvZGluZyA9ICd1dGYtOCcpIHtcbiAgICAgICAgc3VwZXIoZW5jb2RpbmcpO1xuICAgICAgICB0aGlzLmFzY2lpRGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcignYXNjaWknKTtcbiAgICB9XG4gICAgZW1wdHlCdWZmZXIoKSB7XG4gICAgICAgIHJldHVybiBNZXNzYWdlQnVmZmVyLmVtcHR5QnVmZmVyO1xuICAgIH1cbiAgICBmcm9tU3RyaW5nKHZhbHVlLCBfZW5jb2RpbmcpIHtcbiAgICAgICAgcmV0dXJuIChuZXcgVGV4dEVuY29kZXIoKSkuZW5jb2RlKHZhbHVlKTtcbiAgICB9XG4gICAgdG9TdHJpbmcodmFsdWUsIGVuY29kaW5nKSB7XG4gICAgICAgIGlmIChlbmNvZGluZyA9PT0gJ2FzY2lpJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXNjaWlEZWNvZGVyLmRlY29kZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gKG5ldyBUZXh0RGVjb2RlcihlbmNvZGluZykpLmRlY29kZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXNOYXRpdmUoYnVmZmVyLCBsZW5ndGgpIHtcbiAgICAgICAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlci5zbGljZSgwLCBsZW5ndGgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFsbG9jTmF0aXZlKGxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTtcbiAgICB9XG59XG5NZXNzYWdlQnVmZmVyLmVtcHR5QnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMCk7XG5jbGFzcyBSZWFkYWJsZVN0cmVhbVdyYXBwZXIge1xuICAgIGNvbnN0cnVjdG9yKHNvY2tldCkge1xuICAgICAgICB0aGlzLnNvY2tldCA9IHNvY2tldDtcbiAgICAgICAgdGhpcy5fb25EYXRhID0gbmV3IGFwaV8xLkVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5fbWVzc2FnZUxpc3RlbmVyID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBibG9iID0gZXZlbnQuZGF0YTtcbiAgICAgICAgICAgIGJsb2IuYXJyYXlCdWZmZXIoKS50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkRhdGEuZmlyZShuZXcgVWludDhBcnJheShidWZmZXIpKTtcbiAgICAgICAgICAgIH0sICgpID0+IHtcbiAgICAgICAgICAgICAgICAoMCwgYXBpXzEuUkFMKSgpLmNvbnNvbGUuZXJyb3IoYENvbnZlcnRpbmcgYmxvYiB0byBhcnJheSBidWZmZXIgZmFpbGVkLmApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLl9tZXNzYWdlTGlzdGVuZXIpO1xuICAgIH1cbiAgICBvbkNsb3NlKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2Nsb3NlJywgbGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gYXBpXzEuRGlzcG9zYWJsZS5jcmVhdGUoKCkgPT4gdGhpcy5zb2NrZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xvc2UnLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkVycm9yKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgbGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gYXBpXzEuRGlzcG9zYWJsZS5jcmVhdGUoKCkgPT4gdGhpcy5zb2NrZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkVuZChsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKCdlbmQnLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdlbmQnLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkRhdGEobGlzdGVuZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uRGF0YS5ldmVudChsaXN0ZW5lcik7XG4gICAgfVxufVxuY2xhc3MgV3JpdGFibGVTdHJlYW1XcmFwcGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihzb2NrZXQpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7XG4gICAgfVxuICAgIG9uQ2xvc2UobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignY2xvc2UnLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbG9zZScsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIG9uRXJyb3IobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIG9uRW5kKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2VuZCcsIGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIGFwaV8xLkRpc3Bvc2FibGUuY3JlYXRlKCgpID0+IHRoaXMuc29ja2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2VuZCcsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIHdyaXRlKGRhdGEsIGVuY29kaW5nKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkICYmIGVuY29kaW5nICE9PSAndXRmLTgnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbiBhIEJyb3dzZXIgZW52aXJvbm1lbnRzIG9ubHkgdXRmLTggdGV4dCBlbmNvZGluZyBpcyBzdXBwb3J0ZWQuIEJ1dCBnb3QgZW5jb2Rpbmc6ICR7ZW5jb2Rpbmd9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKTtcbiAgICB9XG59XG5jb25zdCBfdGV4dEVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbmNvbnN0IF9yaWwgPSBPYmplY3QuZnJlZXplKHtcbiAgICBtZXNzYWdlQnVmZmVyOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgY3JlYXRlOiAoZW5jb2RpbmcpID0+IG5ldyBNZXNzYWdlQnVmZmVyKGVuY29kaW5nKVxuICAgIH0pLFxuICAgIGFwcGxpY2F0aW9uSnNvbjogT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGVuY29kZXI6IE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgbmFtZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgZW5jb2RlOiAobXNnLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2hhcnNldCAhPT0gJ3V0Zi04Jykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluIGEgQnJvd3NlciBlbnZpcm9ubWVudHMgb25seSB1dGYtOCB0ZXh0IGVuY29kaW5nIGlzIHN1cHBvcnRlZC4gQnV0IGdvdCBlbmNvZGluZzogJHtvcHRpb25zLmNoYXJzZXR9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoX3RleHRFbmNvZGVyLmVuY29kZShKU09OLnN0cmluZ2lmeShtc2csIHVuZGVmaW5lZCwgMCkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIGRlY29kZXI6IE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgbmFtZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgZGVjb2RlOiAoYnVmZmVyLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCEoYnVmZmVyIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbiBhIEJyb3dzZXIgZW52aXJvbm1lbnRzIG9ubHkgVWludDhBcnJheXMgYXJlIHN1cHBvcnRlZC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShKU09OLnBhcnNlKG5ldyBUZXh0RGVjb2RlcihvcHRpb25zLmNoYXJzZXQpLmRlY29kZShidWZmZXIpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfSksXG4gICAgc3RyZWFtOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgYXNSZWFkYWJsZVN0cmVhbTogKHNvY2tldCkgPT4gbmV3IFJlYWRhYmxlU3RyZWFtV3JhcHBlcihzb2NrZXQpLFxuICAgICAgICBhc1dyaXRhYmxlU3RyZWFtOiAoc29ja2V0KSA9PiBuZXcgV3JpdGFibGVTdHJlYW1XcmFwcGVyKHNvY2tldClcbiAgICB9KSxcbiAgICBjb25zb2xlOiBjb25zb2xlLFxuICAgIHRpbWVyOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgc2V0VGltZW91dChjYWxsYmFjaywgbXMsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHNldFRpbWVvdXQoY2FsbGJhY2ssIG1zLCAuLi5hcmdzKTtcbiAgICAgICAgICAgIHJldHVybiB7IGRpc3Bvc2U6ICgpID0+IGNsZWFyVGltZW91dChoYW5kbGUpIH07XG4gICAgICAgIH0sXG4gICAgICAgIHNldEltbWVkaWF0ZShjYWxsYmFjaywgLi4uYXJncykge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gc2V0VGltZW91dChjYWxsYmFjaywgMCwgLi4uYXJncyk7XG4gICAgICAgICAgICByZXR1cm4geyBkaXNwb3NlOiAoKSA9PiBjbGVhclRpbWVvdXQoaGFuZGxlKSB9O1xuICAgICAgICB9LFxuICAgICAgICBzZXRJbnRlcnZhbChjYWxsYmFjaywgbXMsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHNldEludGVydmFsKGNhbGxiYWNrLCBtcywgLi4uYXJncyk7XG4gICAgICAgICAgICByZXR1cm4geyBkaXNwb3NlOiAoKSA9PiBjbGVhckludGVydmFsKGhhbmRsZSkgfTtcbiAgICAgICAgfSxcbiAgICB9KVxufSk7XG5mdW5jdGlvbiBSSUwoKSB7XG4gICAgcmV0dXJuIF9yaWw7XG59XG4oZnVuY3Rpb24gKFJJTCkge1xuICAgIGZ1bmN0aW9uIGluc3RhbGwoKSB7XG4gICAgICAgIGFwaV8xLlJBTC5pbnN0YWxsKF9yaWwpO1xuICAgIH1cbiAgICBSSUwuaW5zdGFsbCA9IGluc3RhbGw7XG59KShSSUwgfHwgKFJJTCA9IHt9KSk7XG5leHBvcnRzLmRlZmF1bHQgPSBSSUw7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24gPSBleHBvcnRzLkJyb3dzZXJNZXNzYWdlV3JpdGVyID0gZXhwb3J0cy5Ccm93c2VyTWVzc2FnZVJlYWRlciA9IHZvaWQgMDtcbmNvbnN0IHJpbF8xID0gcmVxdWlyZShcIi4vcmlsXCIpO1xuLy8gSW5zdGFsbCB0aGUgYnJvd3NlciBydW50aW1lIGFic3RyYWN0LlxucmlsXzEuZGVmYXVsdC5pbnN0YWxsKCk7XG5jb25zdCBhcGlfMSA9IHJlcXVpcmUoXCIuLi9jb21tb24vYXBpXCIpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuLi9jb21tb24vYXBpXCIpLCBleHBvcnRzKTtcbmNsYXNzIEJyb3dzZXJNZXNzYWdlUmVhZGVyIGV4dGVuZHMgYXBpXzEuQWJzdHJhY3RNZXNzYWdlUmVhZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihwb3J0KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX29uRGF0YSA9IG5ldyBhcGlfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuX21lc3NhZ2VMaXN0ZW5lciA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fb25EYXRhLmZpcmUoZXZlbnQuZGF0YSk7XG4gICAgICAgIH07XG4gICAgICAgIHBvcnQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoZXZlbnQpID0+IHRoaXMuZmlyZUVycm9yKGV2ZW50KSk7XG4gICAgICAgIHBvcnQub25tZXNzYWdlID0gdGhpcy5fbWVzc2FnZUxpc3RlbmVyO1xuICAgIH1cbiAgICBsaXN0ZW4oY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uRGF0YS5ldmVudChjYWxsYmFjayk7XG4gICAgfVxufVxuZXhwb3J0cy5Ccm93c2VyTWVzc2FnZVJlYWRlciA9IEJyb3dzZXJNZXNzYWdlUmVhZGVyO1xuY2xhc3MgQnJvd3Nlck1lc3NhZ2VXcml0ZXIgZXh0ZW5kcyBhcGlfMS5BYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKHBvcnQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50ID0gMDtcbiAgICAgICAgcG9ydC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIChldmVudCkgPT4gdGhpcy5maXJlRXJyb3IoZXZlbnQpKTtcbiAgICB9XG4gICAgd3JpdGUobXNnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnBvcnQucG9zdE1lc3NhZ2UobXNnKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IsIG1zZyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZUVycm9yKGVycm9yLCBtc2cpIHtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50Kys7XG4gICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yLCBtc2csIHRoaXMuZXJyb3JDb3VudCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICB9XG59XG5leHBvcnRzLkJyb3dzZXJNZXNzYWdlV3JpdGVyID0gQnJvd3Nlck1lc3NhZ2VXcml0ZXI7XG5mdW5jdGlvbiBjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbihyZWFkZXIsIHdyaXRlciwgbG9nZ2VyLCBvcHRpb25zKSB7XG4gICAgaWYgKGxvZ2dlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxvZ2dlciA9IGFwaV8xLk51bGxMb2dnZXI7XG4gICAgfVxuICAgIGlmIChhcGlfMS5Db25uZWN0aW9uU3RyYXRlZ3kuaXMob3B0aW9ucykpIHtcbiAgICAgICAgb3B0aW9ucyA9IHsgY29ubmVjdGlvblN0cmF0ZWd5OiBvcHRpb25zIH07XG4gICAgfVxuICAgIHJldHVybiAoMCwgYXBpXzEuY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24pKHJlYWRlciwgd3JpdGVyLCBsb2dnZXIsIG9wdGlvbnMpO1xufVxuZXhwb3J0cy5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiA9IGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uO1xuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL2Jyb3dzZXIvbWFpbicpOyIsICIvKlxuICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMjYgRWNsaXBzZSBEaXJpZ2libGUgY29udHJpYnV0b3JzXG4gKlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlXG4gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2Mi4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG4gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MjAuaHRtbFxuICpcbiAqIFNQRFgtRmlsZUNvcHlyaWdodFRleHQ6IEVjbGlwc2UgRGlyaWdpYmxlIGNvbnRyaWJ1dG9ycyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbi8qKlxuICogSmF2YSBMU1AgY2xpZW50IGJ1bmRsZS5cbiAqXG4gKiBVc2VzIHZzY29kZS13cy1qc29ucnBjIGZvciB0eXBlZCBKU09OLVJQQyBvdmVyIFdlYlNvY2tldCBhbmQgcmVnaXN0ZXJzIE1vbmFjb1xuICogcHJvdmlkZXJzIHRoYXQgZGVsZWdhdGUgdG8gSkRULkxTLiBFeHBvc2VkIGFzIGdsb2JhbCBKYXZhTHNwQ2xpZW50TGliIHNvIHRoYXRcbiAqIGVkaXRvci5qcyBjYW4gY2FsbCBKYXZhTHNwQ2xpZW50TGliLmNvbm5lY3QocmVzb3VyY2VQYXRoKS5cbiAqXG4gKiBPbmUgSkRULkxTIHByb2Nlc3MgY292ZXJzIHRoZSBlbnRpcmUgd29ya3NwYWNlLCBzbyBhIHNpbmdsZSBXZWJTb2NrZXQgY29ubmVjdGlvblxuICogaXMgc2hhcmVkIGFjcm9zcyBhbGwgSmF2YSBmaWxlcyBvcGVuIGluIHRoZSBzYW1lIGJyb3dzZXIgcGFnZS4gVGhlIGNvbm5lY3Rpb24gaXNcbiAqIGVzdGFibGlzaGVkIG9uIHRoZSBmaXJzdCBjb25uZWN0KCkgY2FsbCBhbmQgcmV1c2VkIGZvciBhbGwgc3Vic2VxdWVudCBjYWxscy5cbiAqXG4gKiBlZGl0b3IuanMgc2V0cyB3aW5kb3cubW9uYWNvIGJlZm9yZSBjYWxsaW5nIGNvbm5lY3QoKSwgc28gdGhlIG1vbmFjby1zaGltJ3MgbGF6eVxuICogUHJveGllcyByZXNvbHZlIGNvcnJlY3RseSBhdCBjYWxsIHRpbWUuXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24sIE1lc3NhZ2VDb25uZWN0aW9uIH0gZnJvbSAndnNjb2RlLWpzb25ycGMvYnJvd3Nlcic7XG5pbXBvcnQgeyB0b1NvY2tldCwgV2ViU29ja2V0TWVzc2FnZVJlYWRlciwgV2ViU29ja2V0TWVzc2FnZVdyaXRlciB9IGZyb20gJ3ZzY29kZS13cy1qc29ucnBjJztcbmltcG9ydCAqIGFzIG1vbmFjbyBmcm9tICdtb25hY28tZWRpdG9yJztcbmltcG9ydCB7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLFxuICAgIERpYWdub3N0aWNTZXZlcml0eSxcbiAgICBJbnNlcnRUZXh0Rm9ybWF0LFxuICAgIE1hcmt1cENvbnRlbnQsXG4gICAgTWFya3VwS2luZCxcbiAgICB0eXBlIENvZGVBY3Rpb24sXG4gICAgdHlwZSBDb21tYW5kLFxuICAgIHR5cGUgQ29tcGxldGlvbkl0ZW0sXG4gICAgdHlwZSBDb21wbGV0aW9uTGlzdCxcbiAgICB0eXBlIERpYWdub3N0aWMsXG4gICAgdHlwZSBIb3ZlcixcbiAgICB0eXBlIExvY2F0aW9uLFxuICAgIHR5cGUgUGFyYW1ldGVySW5mb3JtYXRpb24sXG4gICAgdHlwZSBTaWduYXR1cmVIZWxwLFxuICAgIHR5cGUgU2lnbmF0dXJlSW5mb3JtYXRpb24sXG4gICAgdHlwZSBUZXh0RWRpdCxcbiAgICB0eXBlIFdvcmtzcGFjZUVkaXQsXG59IGZyb20gJ3ZzY29kZS1sYW5ndWFnZXNlcnZlci10eXBlcyc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNpbmdsZXRvbiBzdGF0ZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogU2hhcmVkIGNvbm5lY3Rpb24gXHUyMDE0IG9uZSBwZXIgYnJvd3NlciBwYWdlLCBjb3ZlcmluZyBhbGwgcHJvamVjdHMgaW4gdGhlIHdvcmtzcGFjZS4gKi9cbmxldCBfY29ubjogTWVzc2FnZUNvbm5lY3Rpb24gfCBudWxsID0gbnVsbDtcblxuLyoqXG4gKiBWaXJ0dWFsIHdvcmtzcGFjZSByb290IFVSSSwgZS5nLiB7QGNvZGUgZmlsZTovLy93b3Jrc3BhY2Uvd29ya3NwYWNlL30uXG4gKiBTZXQgb25jZSBvbiBmaXJzdCBjb25uZWN0KCk7IHVzZWQgdG8gc2NvcGUgTW9uYWNvIHByb3ZpZGVycyB0byB3b3Jrc3BhY2UgZmlsZXMuXG4gKi9cbmxldCBfd29ya3NwYWNlUm9vdCA9ICcnO1xuXG4vKiogVVJJcyBmb3Igd2hpY2ggdGV4dERvY3VtZW50L2RpZE9wZW4gaGFzIGFscmVhZHkgYmVlbiBzZW50LiAqL1xuY29uc3QgX29wZW5GaWxlczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cbi8qKiBQZW5kaW5nIGRlYm91bmNlZCBkaWRDaGFuZ2UgdGltZXJzIHBlciBmaWxlIFVSSSwgc28gYSBjaGFuZ2UgY2FuIGJlIGZsdXNoZWQgYmVmb3JlIGNvbXBsZXRpb24uICovXG5jb25zdCBfY2hhbmdlVGltZXJzOiBNYXA8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0Pj4gPSBuZXcgTWFwKCk7XG5cbi8qKlxuICogTGFzdCBkaWFnbm9zdGljcyBwdWJsaXNoZWQgcGVyIGZpbGUgVVJJLCBrZXB0IHZlcmJhdGltICh3aXRoIHRoZWlyIExTUCBjb2RlL2RhdGEpLiBDb2RlLWFjdGlvblxuICogcmVxdWVzdHMgbXVzdCBzZW5kIHRoZXNlIFx1MjAxNCBKRFQuTFMgbWF0Y2hlcyBxdWljay1maXhlcyBieSB0aGUgZGlhZ25vc3RpYydzIGNvZGUvZGF0YSwgd2hpY2ggTW9uYWNvJ3NcbiAqIElNYXJrZXJEYXRhIGNhbm5vdCByb3VuZC10cmlwLCBzbyByZWNvbnN0cnVjdGluZyBkaWFnbm9zdGljcyBmcm9tIG1hcmtlcnMgeWllbGRzIG5vIHF1aWNrLWZpeGVzLlxuICovXG5jb25zdCBfZGlhZ25vc3RpY3M6IE1hcDxzdHJpbmcsIERpYWdub3N0aWNbXT4gPSBuZXcgTWFwKCk7XG5cbmxldCBfcHJvdmlkZXJzUmVnaXN0ZXJlZCA9IGZhbHNlO1xuXG4vKiogU2VtYW50aWMtdG9rZW4gbGVnZW5kIHJlcG9ydGVkIGJ5IEpEVC5MUyBpbiB0aGUgaW5pdGlhbGl6ZSByZXN1bHQ7IG5lZWRlZCB0byBkZWNvZGUgdG9rZW4gZGF0YS4gKi9cbmxldCBfc2VtYW50aWNUb2tlbnNMZWdlbmQ6IHsgdG9rZW5UeXBlczogc3RyaW5nW107IHRva2VuTW9kaWZpZXJzOiBzdHJpbmdbXSB9IHwgbnVsbCA9IG51bGw7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFB1YmxpYyBBUElcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIENhbGxlZCBieSBlZGl0b3IuanMgd2hlbiBhIEphdmEgZmlsZSBpcyBvcGVuZWQuIFNhZmUgdG8gY2FsbCBtdWx0aXBsZSB0aW1lcy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb25uZWN0KHJlc291cmNlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFydHMgPSByZXNvdXJjZVBhdGgucmVwbGFjZSgvXlxcLy8sICcnKS5zcGxpdCgnLycpO1xuICAgIGNvbnN0IHdvcmtzcGFjZSA9IHBhcnRzWzBdO1xuICAgIGNvbnN0IHByb2plY3QgICA9IHBhcnRzWzFdO1xuICAgIGNvbnN0IGZpbGVVcmkgPSBgZmlsZTovLy93b3Jrc3BhY2UvJHt3b3Jrc3BhY2V9LyR7cHJvamVjdH0vJHtwYXJ0cy5zbGljZSgyKS5qb2luKCcvJyl9YDtcblxuICAgIGlmIChfY29ubikge1xuICAgICAgICAvLyBDb25uZWN0aW9uIGFscmVhZHkgZXN0YWJsaXNoZWQgXHUyMDE0IGp1c3Qgb3BlbiB0aGUgbmV3IGZpbGUuXG4gICAgICAgIG9wZW5GaWxlKGZpbGVVcmkpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgX3dvcmtzcGFjZVJvb3QgPSBgZmlsZTovLy93b3Jrc3BhY2UvJHt3b3Jrc3BhY2V9L2A7XG5cbiAgICBjb25zdCBwcm90byA9IGxvY2F0aW9uLnByb3RvY29sID09PSAnaHR0cHM6JyA/ICd3c3MnIDogJ3dzJztcbiAgICBjb25zdCB3c1VybCA9IGAke3Byb3RvfTovLyR7bG9jYXRpb24uaG9zdH0vd2Vic29ja2V0cy9pZGUvamF2YS1sc3BgXG4gICAgICAgICAgICAgICAgKyBgP3dvcmtzcGFjZT0ke2VuY29kZVVSSUNvbXBvbmVudCh3b3Jrc3BhY2UpfWA7XG5cbiAgICBjb25zdCB3cyA9IG5ldyBXZWJTb2NrZXQod3NVcmwpO1xuICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgd3Mub25vcGVuICA9ICgpID0+IHJlc29sdmUoKTtcbiAgICAgICAgd3Mub25lcnJvciA9ICgpID0+IHJlamVjdChuZXcgRXJyb3IoYFtqYXZhLWxzcF0gV2ViU29ja2V0IGNvbm5lY3QgZmFpbGVkOiAke3dzVXJsfWApKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHNvY2tldCA9IHRvU29ja2V0KHdzKTtcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgV2ViU29ja2V0TWVzc2FnZVJlYWRlcihzb2NrZXQpO1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBXZWJTb2NrZXRNZXNzYWdlV3JpdGVyKHNvY2tldCk7XG4gICAgX2Nvbm4gPSBjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbihyZWFkZXIsIHdyaXRlcik7XG5cbiAgICAvLyBEaWFnbm9zdGljcyBub3RpZmljYXRpb24gXHUyMTkyIE1vbmFjbyBtYXJrZXJzIChhcHBsaWVzIHRvIGFueSB3b3Jrc3BhY2UgZmlsZSlcbiAgICBfY29ubi5vbk5vdGlmaWNhdGlvbigndGV4dERvY3VtZW50L3B1Ymxpc2hEaWFnbm9zdGljcycsIChwYXJhbXM6IHsgdXJpOiBzdHJpbmc7IGRpYWdub3N0aWNzOiBEaWFnbm9zdGljW10gfSkgPT4ge1xuICAgICAgICBfZGlhZ25vc3RpY3Muc2V0KHBhcmFtcy51cmksIHBhcmFtcy5kaWFnbm9zdGljcyA/PyBbXSk7XG4gICAgICAgIGNvbnN0IG1vZGVsID0gbW9uYWNvLmVkaXRvci5nZXRNb2RlbHMoKS5maW5kKG0gPT4gbS51cmkudG9TdHJpbmcoKSA9PT0gcGFyYW1zLnVyaSk7XG4gICAgICAgIGlmICghbW9kZWwpIHJldHVybjtcbiAgICAgICAgbW9uYWNvLmVkaXRvci5zZXRNb2RlbE1hcmtlcnMobW9kZWwsICdqYXZhLWxzcCcsIHBhcmFtcy5kaWFnbm9zdGljcy5tYXAoZCA9PiAoe1xuICAgICAgICAgICAgc2V2ZXJpdHk6ICAgICAgICBsc3BTZXZlcml0eShkLnNldmVyaXR5KSxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICAgICAgICAgZC5tZXNzYWdlLFxuICAgICAgICAgICAgc291cmNlOiAgICAgICAgICBkLnNvdXJjZSA/PyAnamF2YScsXG4gICAgICAgICAgICBzdGFydExpbmVOdW1iZXI6IGQucmFuZ2Uuc3RhcnQubGluZSArIDEsXG4gICAgICAgICAgICBzdGFydENvbHVtbjogICAgIGQucmFuZ2Uuc3RhcnQuY2hhcmFjdGVyICsgMSxcbiAgICAgICAgICAgIGVuZExpbmVOdW1iZXI6ICAgZC5yYW5nZS5lbmQubGluZSArIDEsXG4gICAgICAgICAgICBlbmRDb2x1bW46ICAgICAgIGQucmFuZ2UuZW5kLmNoYXJhY3RlciArIDEsXG4gICAgICAgIH0pKSk7XG4gICAgfSk7XG5cbiAgICAvLyBTZXJ2ZXIgLT4gY2xpZW50IHJlcXVlc3RzIHRoYXQgZHJpdmUgcmVmYWN0b3IgLyBnZW5lcmF0ZSByZXN1bHRzIGFuZCBkeW5hbWljIHJlZ2lzdHJhdGlvbi5cbiAgICBfY29ubi5vblJlcXVlc3QoJ3dvcmtzcGFjZS9hcHBseUVkaXQnLCAocGFyYW1zOiB7IGVkaXQ6IFdvcmtzcGFjZUVkaXQgfSkgPT4ge1xuICAgICAgICBhcHBseVdvcmtzcGFjZUVkaXQocGFyYW1zLmVkaXQpO1xuICAgICAgICByZXR1cm4geyBhcHBsaWVkOiB0cnVlIH07XG4gICAgfSk7XG4gICAgX2Nvbm4ub25SZXF1ZXN0KCd3b3Jrc3BhY2UvY29uZmlndXJhdGlvbicsIChwYXJhbXM6IHsgaXRlbXM6IEFycmF5PHsgc2VjdGlvbj86IHN0cmluZyB9PiB9KSA9PlxuICAgICAgICAocGFyYW1zLml0ZW1zID8/IFtdKS5tYXAoKCkgPT4gamR0bHNTZXR0aW5ncygpLmphdmEpKTtcbiAgICBfY29ubi5vblJlcXVlc3QoJ2NsaWVudC9yZWdpc3RlckNhcGFiaWxpdHknLCAoKSA9PiBudWxsKTtcbiAgICBfY29ubi5vblJlcXVlc3QoJ2NsaWVudC91bnJlZ2lzdGVyQ2FwYWJpbGl0eScsICgpID0+IG51bGwpO1xuICAgIF9jb25uLm9uUmVxdWVzdCgnd2luZG93L3Nob3dNZXNzYWdlUmVxdWVzdCcsICgpID0+IG51bGwpO1xuICAgIF9jb25uLm9uUmVxdWVzdCgnd2luZG93L3dvcmtEb25lUHJvZ3Jlc3MvY3JlYXRlJywgKCkgPT4gbnVsbCk7XG4gICAgX2Nvbm4ub25Ob3RpZmljYXRpb24oJ3dpbmRvdy9sb2dNZXNzYWdlJywgKHA6IHsgbWVzc2FnZTogc3RyaW5nIH0pID0+IGNvbnNvbGUuZGVidWcoJ1tqYXZhLWxzcF0nLCBwPy5tZXNzYWdlKSk7XG4gICAgX2Nvbm4ub25Ob3RpZmljYXRpb24oJ3dpbmRvdy9zaG93TWVzc2FnZScsIChwOiB7IG1lc3NhZ2U6IHN0cmluZyB9KSA9PiBjb25zb2xlLmluZm8oJ1tqYXZhLWxzcF0nLCBwPy5tZXNzYWdlKSk7XG4gICAgLy8gSkRULkxTIGxhbmd1YWdlLXN0YXR1cyAvIHByb2dyZXNzIG5vdGlmaWNhdGlvbnMgXHUyMDE0IGFja25vd2xlZGdlZCBzaWxlbnRseS5cbiAgICBfY29ubi5vbk5vdGlmaWNhdGlvbignbGFuZ3VhZ2Uvc3RhdHVzJywgKCkgPT4geyAvKiBpbmRleGluZy9yZWFkeSBzdGF0dXMsIGlnbm9yZWQgKi8gfSk7XG4gICAgX2Nvbm4ub25Ob3RpZmljYXRpb24oJ2xhbmd1YWdlL3Byb2dyZXNzUmVwb3J0JywgKCkgPT4geyAvKiBidWlsZCBwcm9ncmVzcywgaWdub3JlZCAqLyB9KTtcblxuICAgIF9jb25uLmxpc3RlbigpO1xuXG4gICAgY29uc3Qgcm9vdFVyaSA9IF93b3Jrc3BhY2VSb290O1xuICAgIGNvbnN0IGluaXRSZXN1bHQ6IGFueSA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCdpbml0aWFsaXplJywge1xuICAgICAgICBwcm9jZXNzSWQ6IG51bGwsXG4gICAgICAgIHJvb3RVcmksXG4gICAgICAgIGluaXRpYWxpemF0aW9uT3B0aW9uczoge1xuICAgICAgICAgICAgc2V0dGluZ3M6IGpkdGxzU2V0dGluZ3MoKSxcbiAgICAgICAgICAgIGV4dGVuZGVkQ2xpZW50Q2FwYWJpbGl0aWVzOiB7XG4gICAgICAgICAgICAgICAgcHJvZ3Jlc3NSZXBvcnRQcm92aWRlcjogICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICAgICBjbGFzc0ZpbGVDb250ZW50c1N1cHBvcnQ6ICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgcmVzb2x2ZUFkZGl0aW9uYWxUZXh0RWRpdHNTdXBwb3J0OiB0cnVlLFxuICAgICAgICAgICAgICAgIC8vIERvIE5PVCBhZHZlcnRpc2UgdGhlICpQcm9tcHRTdXBwb3J0IGZsYWdzOiB0aG9zZSBtYWtlIEpEVC5MUyByZXR1cm4gc291cmNlIGFjdGlvbnNcbiAgICAgICAgICAgICAgICAvLyAoZ2VuZXJhdGUgdG9TdHJpbmcvY29uc3RydWN0b3JzL2FjY2Vzc29ycywgb3ZlcnJpZGUvaW1wbGVtZW50LCBvcmdhbml6ZSBpbXBvcnRzKSBhc1xuICAgICAgICAgICAgICAgIC8vIGNsaWVudC1zaWRlIFwiKlByb21wdFwiIGNvbW1hbmRzIHRoZSB2c2NvZGUtamF2YSBleHRlbnNpb24gaW1wbGVtZW50cyBidXQgd2UgZG9uJ3QuXG4gICAgICAgICAgICAgICAgLy8gV2l0aCB0aGVtIG9mZiwgSkRULkxTIHJldHVybnMgdGhlIHNhbWUgYWN0aW9ucyBhcyByZXNvbHZhYmxlIFdvcmtzcGFjZUVkaXRzIG9wZXJhdGluZ1xuICAgICAgICAgICAgICAgIC8vIG9uIGFsbCBtZW1iZXJzLCB3aGljaCBhcHBseUNvZGVBY3Rpb24gcmVzb2x2ZXMgYW5kIGFwcGxpZXMgZGlyZWN0bHkuXG4gICAgICAgICAgICAgICAgaW5mZXJTZWxlY3Rpb25TdXBwb3J0OiAgICAgICAgICAgICBbJ2V4dHJhY3RNZXRob2QnLCAnZXh0cmFjdFZhcmlhYmxlJywgJ2V4dHJhY3RGaWVsZCddLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgd29ya3NwYWNlRm9sZGVyczogW3sgdXJpOiByb290VXJpLCBuYW1lOiB3b3Jrc3BhY2UgfV0sXG4gICAgICAgIGNhcGFiaWxpdGllczoge1xuICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7XG4gICAgICAgICAgICAgICAgc3luY2hyb25pemF0aW9uOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUsIHdpbGxTYXZlOiBmYWxzZSwgZGlkU2F2ZTogdHJ1ZSwgd2lsbFNhdmVXYWl0VW50aWw6IGZhbHNlIH0sXG4gICAgICAgICAgICAgICAgY29tcGxldGlvbjoge1xuICAgICAgICAgICAgICAgICAgICBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uSXRlbToge1xuICAgICAgICAgICAgICAgICAgICAgICAgc25pcHBldFN1cHBvcnQ6ICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRhdGlvbkZvcm1hdDogICBbJ21hcmtkb3duJywgJ3BsYWludGV4dCddLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRlZFN1cHBvcnQ6ICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWl0Q2hhcmFjdGVyc1N1cHBvcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlU3VwcG9ydDogICAgICAgIHsgcHJvcGVydGllczogWydkb2N1bWVudGF0aW9uJywgJ2RldGFpbCcsICdhZGRpdGlvbmFsVGV4dEVkaXRzJ10gfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dFN1cHBvcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBob3ZlcjogICAgICAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLCBjb250ZW50Rm9ybWF0OiBbJ21hcmtkb3duJywgJ3BsYWludGV4dCddIH0sXG4gICAgICAgICAgICAgICAgc2lnbmF0dXJlSGVscDogIHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSwgc2lnbmF0dXJlSW5mb3JtYXRpb246IHsgZG9jdW1lbnRhdGlvbkZvcm1hdDogWydtYXJrZG93bicsICdwbGFpbnRleHQnXSwgcGFyYW1ldGVySW5mb3JtYXRpb246IHsgbGFiZWxPZmZzZXRTdXBwb3J0OiB0cnVlIH0gfSB9LFxuICAgICAgICAgICAgICAgIGRlZmluaXRpb246ICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VzOiAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb246IHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIHR5cGVEZWZpbml0aW9uOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICBkb2N1bWVudEhpZ2hsaWdodDogeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgZG9jdW1lbnRTeW1ib2w6IHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSwgaGllcmFyY2hpY2FsRG9jdW1lbnRTeW1ib2xTdXBwb3J0OiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgZm9sZGluZ1JhbmdlOiAgIHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSwgbGluZUZvbGRpbmdPbmx5OiBmYWxzZSB9LFxuICAgICAgICAgICAgICAgIHNlbGVjdGlvblJhbmdlOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICBjb2RlTGVuczogICAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgaW5sYXlIaW50OiAgICAgIHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSwgcmVzb2x2ZVN1cHBvcnQ6IHsgcHJvcGVydGllczogWydsYWJlbCddIH0gfSxcbiAgICAgICAgICAgICAgICBzZW1hbnRpY1Rva2Vuczoge1xuICAgICAgICAgICAgICAgICAgICBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0czogICAgICAgIHsgcmFuZ2U6IGZhbHNlLCBmdWxsOiB7IGRlbHRhOiBmYWxzZSB9IH0sXG4gICAgICAgICAgICAgICAgICAgIHRva2VuVHlwZXM6ICAgICAgWyduYW1lc3BhY2UnLCAndHlwZScsICdjbGFzcycsICdlbnVtJywgJ2ludGVyZmFjZScsICdzdHJ1Y3QnLCAndHlwZVBhcmFtZXRlcicsXG4gICAgICAgICAgICAgICAgICAgICAgICAncGFyYW1ldGVyJywgJ3ZhcmlhYmxlJywgJ3Byb3BlcnR5JywgJ2VudW1NZW1iZXInLCAnZXZlbnQnLCAnZnVuY3Rpb24nLCAnbWV0aG9kJywgJ21hY3JvJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdrZXl3b3JkJywgJ21vZGlmaWVyJywgJ2NvbW1lbnQnLCAnc3RyaW5nJywgJ251bWJlcicsICdyZWdleHAnLCAnb3BlcmF0b3InLCAnZGVjb3JhdG9yJ10sXG4gICAgICAgICAgICAgICAgICAgIHRva2VuTW9kaWZpZXJzOiAgWydkZWNsYXJhdGlvbicsICdkZWZpbml0aW9uJywgJ3JlYWRvbmx5JywgJ3N0YXRpYycsICdkZXByZWNhdGVkJywgJ2Fic3RyYWN0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdhc3luYycsICdtb2RpZmljYXRpb24nLCAnZG9jdW1lbnRhdGlvbicsICdkZWZhdWx0TGlicmFyeSddLFxuICAgICAgICAgICAgICAgICAgICBmb3JtYXRzOiAgICAgICAgIFsncmVsYXRpdmUnXSxcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxhcHBpbmdUb2tlblN1cHBvcnQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBtdWx0aWxpbmVUb2tlblN1cHBvcnQ6ICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBmb3JtYXR0aW5nOiAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgcmFuZ2VGb3JtYXR0aW5nOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICByZW5hbWU6ICAgICAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLCBwcmVwYXJlU3VwcG9ydDogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIGNvZGVBY3Rpb246IHtcbiAgICAgICAgICAgICAgICAgICAgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgY29kZUFjdGlvbkxpdGVyYWxTdXBwb3J0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlQWN0aW9uS2luZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU2V0OiBbJ3F1aWNrZml4JywgJ3JlZmFjdG9yJywgJ3JlZmFjdG9yLmV4dHJhY3QnLCAncmVmYWN0b3IuaW5saW5lJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlZmFjdG9yLnJld3JpdGUnLCAnc291cmNlJywgJ3NvdXJjZS5vcmdhbml6ZUltcG9ydHMnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGlzUHJlZmVycmVkU3VwcG9ydDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgZGF0YVN1cHBvcnQ6ICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlU3VwcG9ydDogICAgIHsgcHJvcGVydGllczogWydlZGl0J10gfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHB1Ymxpc2hEaWFnbm9zdGljczogeyByZWxhdGVkSW5mb3JtYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3b3Jrc3BhY2U6IHtcbiAgICAgICAgICAgICAgICBhcHBseUVkaXQ6ICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb246ICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgZXhlY3V0ZUNvbW1hbmQ6ICAgICAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgZGlkQ2hhbmdlQ29uZmlndXJhdGlvbjogeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgd29ya3NwYWNlRWRpdDogICAgICAgICAgeyBkb2N1bWVudENoYW5nZXM6IHRydWUsIHJlc291cmNlT3BlcmF0aW9uczogWydjcmVhdGUnLCAncmVuYW1lJywgJ2RlbGV0ZSddIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgX3NlbWFudGljVG9rZW5zTGVnZW5kID0gaW5pdFJlc3VsdD8uY2FwYWJpbGl0aWVzPy5zZW1hbnRpY1Rva2Vuc1Byb3ZpZGVyPy5sZWdlbmQgPz8gbnVsbDtcblxuICAgIF9jb25uLnNlbmROb3RpZmljYXRpb24oJ2luaXRpYWxpemVkJywge30pO1xuICAgIF9jb25uLnNlbmROb3RpZmljYXRpb24oJ3dvcmtzcGFjZS9kaWRDaGFuZ2VDb25maWd1cmF0aW9uJywgeyBzZXR0aW5nczogamR0bHNTZXR0aW5ncygpIH0pO1xuXG4gICAgb3BlbkZpbGUoZmlsZVVyaSk7XG5cbiAgICBpZiAoIV9wcm92aWRlcnNSZWdpc3RlcmVkKSB7XG4gICAgICAgIF9wcm92aWRlcnNSZWdpc3RlcmVkID0gdHJ1ZTtcbiAgICAgICAgcmVnaXN0ZXJQcm92aWRlcnMoKTtcbiAgICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEZpbGUgbGlmZWN5Y2xlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogU2VuZHMgdGV4dERvY3VtZW50L2RpZE9wZW4gZm9yIHRoZSBnaXZlbiBVUkkgKGlmIG5vdCBhbHJlYWR5IHNlbnQpIGFuZCByZWdpc3RlcnMgYSBkZWJvdW5jZWRcbiAqIHRleHREb2N1bWVudC9kaWRDaGFuZ2UgbGlzdGVuZXIgb24gdGhlIGNvcnJlc3BvbmRpbmcgTW9uYWNvIG1vZGVsLlxuICovXG5mdW5jdGlvbiBvcGVuRmlsZShmaWxlVXJpOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoX29wZW5GaWxlcy5oYXMoZmlsZVVyaSkgfHwgIV9jb25uKSByZXR1cm47XG4gICAgX29wZW5GaWxlcy5hZGQoZmlsZVVyaSk7XG5cbiAgICBjb25zdCBtb2RlbCA9IG1vbmFjby5lZGl0b3IuZ2V0TW9kZWxzKCkuZmluZChtID0+IG0udXJpLnRvU3RyaW5nKCkgPT09IGZpbGVVcmkpO1xuICAgIF9jb25uLnNlbmROb3RpZmljYXRpb24oJ3RleHREb2N1bWVudC9kaWRPcGVuJywge1xuICAgICAgICB0ZXh0RG9jdW1lbnQ6IHtcbiAgICAgICAgICAgIHVyaTogICAgICAgIGZpbGVVcmksXG4gICAgICAgICAgICBsYW5ndWFnZUlkOiAnamF2YScsXG4gICAgICAgICAgICB2ZXJzaW9uOiAgICAxLFxuICAgICAgICAgICAgdGV4dDogICAgICAgbW9kZWw/LmdldFZhbHVlKCkgPz8gJycsXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBpZiAobW9kZWwpIHtcbiAgICAgICAgbW9kZWwub25EaWRDaGFuZ2VDb250ZW50KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gX2NoYW5nZVRpbWVycy5nZXQoZmlsZVVyaSk7XG4gICAgICAgICAgICBpZiAoZXhpc3RpbmcpIGNsZWFyVGltZW91dChleGlzdGluZyk7XG4gICAgICAgICAgICBfY2hhbmdlVGltZXJzLnNldChmaWxlVXJpLCBzZXRUaW1lb3V0KCgpID0+IHNlbmREaWRDaGFuZ2UoZmlsZVVyaSksIDQwMCkpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbi8qKiBTZW5kcyB0aGUgY3VycmVudCBtb2RlbCBjb250ZW50IGFzIGEgZGlkQ2hhbmdlIGFuZCBjbGVhcnMgYW55IHBlbmRpbmcgZGVib3VuY2UgZm9yIHRoZSBmaWxlLiAqL1xuZnVuY3Rpb24gc2VuZERpZENoYW5nZShmaWxlVXJpOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBfY2hhbmdlVGltZXJzLmRlbGV0ZShmaWxlVXJpKTtcbiAgICBjb25zdCBtb2RlbCA9IG1vbmFjby5lZGl0b3IuZ2V0TW9kZWwobW9uYWNvLlVyaS5wYXJzZShmaWxlVXJpKSk7XG4gICAgaWYgKF9jb25uICYmIG1vZGVsKSB7XG4gICAgICAgIF9jb25uLnNlbmROb3RpZmljYXRpb24oJ3RleHREb2N1bWVudC9kaWRDaGFuZ2UnLCB7XG4gICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6ICAgeyB1cmk6IGZpbGVVcmksIHZlcnNpb246IG1vZGVsLmdldFZlcnNpb25JZCgpIH0sXG4gICAgICAgICAgICBjb250ZW50Q2hhbmdlczogW3sgdGV4dDogbW9kZWwuZ2V0VmFsdWUoKSB9XSxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEZsdXNoZXMgYSBwZW5kaW5nIGRlYm91bmNlZCBjaGFuZ2UgaW1tZWRpYXRlbHkuIENhbGxlZCBiZWZvcmUgYSBjb21wbGV0aW9uIHJlcXVlc3Qgc28gSkRULkxTIHNlZXMgdGhlXG4gKiBqdXN0LXR5cGVkIHRleHQgb24gdGhlIGZpcnN0IEN0cmwrU3BhY2UsIGluc3RlYWQgb2YgY29tcGxldGluZyBhZ2FpbnN0IHN0YWxlIGNvbnRlbnQgKHRoZSBkZWJvdW5jZVxuICogb3RoZXJ3aXNlIGRlbGF5cyB0aGUgY2hhbmdlIGJ5IHVwIHRvIDQwMG1zIFx1MjAxNCB0aGUgY2F1c2Ugb2YgXCJmaXJzdCBDdHJsK1NwYWNlIHNob3dzIG5vdGhpbmdcIikuXG4gKi9cbmZ1bmN0aW9uIGZsdXNoUGVuZGluZ0NoYW5nZShmaWxlVXJpOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoX2NoYW5nZVRpbWVycy5oYXMoZmlsZVVyaSkpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KF9jaGFuZ2VUaW1lcnMuZ2V0KGZpbGVVcmkpISk7XG4gICAgICAgIHNlbmREaWRDaGFuZ2UoZmlsZVVyaSk7XG4gICAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBXb3Jrc3BhY2UgZmlsZSBwcmVkaWNhdGVcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBSZXR1cm5zIHtAY29kZSB0cnVlfSB3aGVuIHRoZSBnaXZlbiBtb2RlbCBVUkkgYmVsb25ncyB0byB0aGUgY3VycmVudGx5IGNvbm5lY3RlZCB3b3Jrc3BhY2UuIFVzZWRcbiAqIGJ5IE1vbmFjbyBwcm92aWRlcnMgdG8gc2tpcCBub24tSmF2YS13b3Jrc3BhY2UgbW9kZWxzIHdpdGhvdXQgYW4gZXhhY3QtVVJJIGNvbXBhcmlzb24uXG4gKi9cbmZ1bmN0aW9uIGlzV29ya3NwYWNlRmlsZSh1cmk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBfd29ya3NwYWNlUm9vdCAhPT0gJycgJiYgdXJpLnN0YXJ0c1dpdGgoX3dvcmtzcGFjZVJvb3QpO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBNb25hY28gcHJvdmlkZXIgcmVnaXN0cmF0aW9uXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIHJlZ2lzdGVyUHJvdmlkZXJzKCk6IHZvaWQge1xuXG4gICAgbW9uYWNvLmVkaXRvci5yZWdpc3RlckNvbW1hbmQoQVBQTFlfQUNUSU9OX0NPTU1BTkQsIChfYWNjZXNzb3I6IHVua25vd24sIGFjdGlvbjogQ29kZUFjdGlvbiB8IENvbW1hbmQpID0+IHtcbiAgICAgICAgYXBwbHlDb2RlQWN0aW9uKGFjdGlvbik7XG4gICAgfSk7XG4gICAgbW9uYWNvLmVkaXRvci5yZWdpc3RlckNvbW1hbmQoTk9PUF9DT01NQU5ELCAoKSA9PiB7IC8qIGRpc3BsYXktb25seSBDb2RlTGVucyAqLyB9KTtcblxuICAgIC8vIENyb3NzLWZpbGUgbmF2aWdhdGlvbjogdGhpcyBzaW5nbGUtZmlsZSBlZGl0b3IgaGFzIG5vIG1vZGVsIGZvciBvdGhlciB3b3Jrc3BhY2UgZmlsZXMsIHNvIEdvIHRvXG4gICAgLy8gRGVmaW5pdGlvbiAvIEZpbmQgUmVmZXJlbmNlcyB0byBhbm90aGVyIGZpbGUgd291bGQgc2lsZW50bHkgZG8gbm90aGluZy4gSGFuZCB0aG9zZSBvZmYgdG8gdGhlIElERVxuICAgIC8vIHRvIG9wZW4gdGhlIHRhcmdldCBmaWxlIChhbmQgcmV2ZWFsIHRoZSBsaW5lKS4gU2FtZS1maWxlIHRhcmdldHMgZmFsbCB0aHJvdWdoIHRvIE1vbmFjby5cbiAgICBtb25hY28uZWRpdG9yLnJlZ2lzdGVyRWRpdG9yT3BlbmVyKHtcbiAgICAgICAgb3BlbkNvZGVFZGl0b3I6IChzb3VyY2UsIHJlc291cmNlLCBzZWxlY3Rpb25PclBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB1cmkgPSByZXNvdXJjZS50b1N0cmluZygpO1xuICAgICAgICAgICAgaWYgKCFpc1dvcmtzcGFjZUZpbGUodXJpKSB8fCAhdXJpLnN0YXJ0c1dpdGgoVklSVFVBTF9GSUxFX1BSRUZJWCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRNb2RlbCA9IHNvdXJjZS5nZXRNb2RlbCgpO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRNb2RlbCAmJiBjdXJyZW50TW9kZWwudXJpLnRvU3RyaW5nKCkgPT09IHVyaSkgcmV0dXJuIGZhbHNlOyAvLyBzYW1lIGZpbGUgXHUyMDE0IGxldCBNb25hY28ganVtcFxuICAgICAgICAgICAgY29uc3Qgb3BlbmVyID0gKGdsb2JhbFRoaXMgYXMgYW55KS5qYXZhTHNwT3BlbkZpbGU7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wZW5lciAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgcG9zID0gc2VsZWN0aW9uT3JQb3NpdGlvbiBhcyB7IHN0YXJ0TGluZU51bWJlcj86IG51bWJlcjsgbGluZU51bWJlcj86IG51bWJlcjsgc3RhcnRDb2x1bW4/OiBudW1iZXI7IGNvbHVtbj86IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgbGluZSA9IHBvcyA/IChwb3Muc3RhcnRMaW5lTnVtYmVyID8/IHBvcy5saW5lTnVtYmVyKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHBvcyA/IChwb3Muc3RhcnRDb2x1bW4gPz8gcG9zLmNvbHVtbikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBvcGVuZXIodXJpLnN1YnN0cmluZyhWSVJUVUFMX0ZJTEVfUFJFRklYLmxlbmd0aCksIGxpbmUsIGNvbHVtbik7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJDb21wbGV0aW9uSXRlbVByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICB0cmlnZ2VyQ2hhcmFjdGVyczogWycuJywgJ0AnLCAnPCddLFxuICAgICAgICBwcm92aWRlQ29tcGxldGlvbkl0ZW1zOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uLCBjb250ZXh0KSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVVcmkgPSBtb2RlbC51cmkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBKRFQuTFMgaGFzIHRoZSBqdXN0LXR5cGVkIHRleHQgYmVmb3JlIGNvbXBsZXRpbmcgKHNlZSBmbHVzaFBlbmRpbmdDaGFuZ2UpLlxuICAgICAgICAgICAgZmx1c2hQZW5kaW5nQ2hhbmdlKGZpbGVVcmkpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBDb21wbGV0aW9uTGlzdCB8IENvbXBsZXRpb25JdGVtW10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9jb21wbGV0aW9uJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IGZpbGVVcmkgfSxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogICAgIHsgbGluZTogcG9zaXRpb24ubGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogcG9zaXRpb24uY29sdW1uIC0gMSB9LFxuICAgICAgICAgICAgICAgIC8vIE1vbmFjbyB0cmlnZ2VyIGtpbmRzIGFyZSAwLWJhc2VkIChJbnZva2UvVHJpZ2dlckNoYXJhY3Rlci9Gb3JJbmNvbXBsZXRlKTsgTFNQIGlzIDEtYmFzZWQuXG4gICAgICAgICAgICAgICAgY29udGV4dDogICAgICB7IHRyaWdnZXJLaW5kOiAoY29udGV4dC50cmlnZ2VyS2luZCA/PyAwKSArIDEsIHRyaWdnZXJDaGFyYWN0ZXI6IGNvbnRleHQudHJpZ2dlckNoYXJhY3RlciB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBpdGVtcyA9IEFycmF5LmlzQXJyYXkocmVzdWx0KSA/IHJlc3VsdCA6IChyZXN1bHQ/Lml0ZW1zID8/IFtdKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3VnZ2VzdGlvbnM6IGl0ZW1zLm1hcChpdGVtID0+IGxzcENvbXBsZXRpb25Ub01vbmFjbyhpdGVtLCBtb2RlbCwgcG9zaXRpb24pKSxcbiAgICAgICAgICAgICAgICAvLyBKRFQuTFMgcmV0dXJucyBhIHRydW5jYXRlZCBsaXN0IG9uIHRoZSBmaXJzdCBrZXlzdHJva2VzOyBwcm9wYWdhdGluZyBcImluY29tcGxldGVcIiBtYWtlc1xuICAgICAgICAgICAgICAgIC8vIE1vbmFjbyByZS1xdWVyeSBhcyB0aGUgdXNlciB0eXBlcyBpbnN0ZWFkIG9mIGNhY2hpbmcgdGhlIGZpcnN0IChvZnRlbiBlbXB0eSkgcmVzdWx0LlxuICAgICAgICAgICAgICAgIGluY29tcGxldGU6ICBBcnJheS5pc0FycmF5KHJlc3VsdCkgPyBmYWxzZSA6ICEhcmVzdWx0Py5pc0luY29tcGxldGUsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvLyBSZXNvbHZlIGRvY3VtZW50YXRpb24gYW5kLCBjcnVjaWFsbHksIHRoZSBhdXRvLWltcG9ydCBhZGRpdGlvbmFsVGV4dEVkaXRzIHdoaWNoIEpEVC5MUyBvbmx5XG4gICAgICAgIC8vIGF0dGFjaGVzIG9uIHJlc29sdmUgXHUyMDE0IHNlbGVjdGluZyBhIHR5cGUgdGhlbiBpbnNlcnRzIGl0cyBpbXBvcnQgc3RhdGVtZW50LlxuICAgICAgICByZXNvbHZlQ29tcGxldGlvbkl0ZW06IGFzeW5jIChpdGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsc3AgPSAoaXRlbSBhcyBNb25hY29Db21wbGV0aW9uSXRlbSkuX2xzcDtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWxzcCkgcmV0dXJuIGl0ZW07XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkOiBDb21wbGV0aW9uSXRlbSA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCdjb21wbGV0aW9uSXRlbS9yZXNvbHZlJywgbHNwKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQuZG9jdW1lbnRhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBpdGVtLmRvY3VtZW50YXRpb24gPSB7IHZhbHVlOiBtYXJrdXBUb1N0cmluZyhyZXNvbHZlZC5kb2N1bWVudGF0aW9uKSwgaXNUcnVzdGVkOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQuZGV0YWlsKSBpdGVtLmRldGFpbCA9IHJlc29sdmVkLmRldGFpbDtcbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQuYWRkaXRpb25hbFRleHRFZGl0cz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uYWRkaXRpb25hbFRleHRFZGl0cyA9IHJlc29sdmVkLmFkZGl0aW9uYWxUZXh0RWRpdHMubWFwKHRleHRFZGl0VG9Nb25hY28pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKCdbamF2YS1sc3BdIGNvbXBsZXRpb24gcmVzb2x2ZSBmYWlsZWQ6JywgKGUgYXMgRXJyb3IpPy5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckhvdmVyUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVIb3ZlcjogYXN5bmMgKG1vZGVsLCBwb3NpdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBmaWxlVXJpID0gbW9kZWwudXJpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IEhvdmVyIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvaG92ZXInLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogZmlsZVVyaSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0Py5jb250ZW50cykgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50cyA9IEFycmF5LmlzQXJyYXkocmVzdWx0LmNvbnRlbnRzKSA/IHJlc3VsdC5jb250ZW50cyA6IFtyZXN1bHQuY29udGVudHNdO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjb250ZW50czogY29udGVudHMubWFwKGMgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHR5cGVvZiBjID09PSAnc3RyaW5nJyA/IGMgOiAoYyBhcyBNYXJrdXBDb250ZW50KS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgaXNUcnVzdGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgcmFuZ2U6IHJlc3VsdC5yYW5nZSA/IGxzcFJhbmdlVG9Nb25hY28ocmVzdWx0LnJhbmdlKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyU2lnbmF0dXJlSGVscFByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBzaWduYXR1cmVIZWxwVHJpZ2dlckNoYXJhY3RlcnM6IFsnKCcsICcsJ10sXG4gICAgICAgIHByb3ZpZGVTaWduYXR1cmVIZWxwOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVVcmkgPSBtb2RlbC51cmkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogU2lnbmF0dXJlSGVscCB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L3NpZ25hdHVyZUhlbHAnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogZmlsZVVyaSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlczogcmVzdWx0LnNpZ25hdHVyZXMubWFwKChzaWc6IFNpZ25hdHVyZUluZm9ybWF0aW9uKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICAgICAgICAgc2lnLmxhYmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRhdGlvbjogc2lnLmRvY3VtZW50YXRpb24gPyBtYXJrdXBUb1N0cmluZyhzaWcuZG9jdW1lbnRhdGlvbikgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiAgICAoc2lnLnBhcmFtZXRlcnMgPz8gW10pLm1hcCgocDogUGFyYW1ldGVySW5mb3JtYXRpb24pID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICAgICAgICAgcC5sYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudGF0aW9uOiBwLmRvY3VtZW50YXRpb24gPyBtYXJrdXBUb1N0cmluZyhwLmRvY3VtZW50YXRpb24pIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZVNpZ25hdHVyZTogcmVzdWx0LmFjdGl2ZVNpZ25hdHVyZSA/PyAwLFxuICAgICAgICAgICAgICAgICAgICBhY3RpdmVQYXJhbWV0ZXI6IHJlc3VsdC5hY3RpdmVQYXJhbWV0ZXIgPz8gMCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGRpc3Bvc2U6ICgpID0+IHt9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJEZWZpbml0aW9uUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVEZWZpbml0aW9uOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVVcmkgPSBtb2RlbC51cmkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogTG9jYXRpb24gfCBMb2NhdGlvbltdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvZGVmaW5pdGlvbicsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBmaWxlVXJpIH0sXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgbG9jYXRpb25zID0gKEFycmF5LmlzQXJyYXkocmVzdWx0KSA/IHJlc3VsdCA6IFtyZXN1bHRdKS5tYXAobG9jID0+ICh7XG4gICAgICAgICAgICAgICAgdXJpOiAgIG1vbmFjby5VcmkucGFyc2UobG9jLnVyaSksXG4gICAgICAgICAgICAgICAgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28obG9jLnJhbmdlKSxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIGF3YWl0IGVuc3VyZU1vZGVsc0ZvckxvY2F0aW9ucyhsb2NhdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGxvY2F0aW9ucztcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJSZWZlcmVuY2VQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZVJlZmVyZW5jZXM6IGFzeW5jIChtb2RlbCwgcG9zaXRpb24sIGNvbnRleHQpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBMb2NhdGlvbltdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvcmVmZXJlbmNlcycsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICAgICAgY29udGV4dDogICAgICB7IGluY2x1ZGVEZWNsYXJhdGlvbjogY29udGV4dC5pbmNsdWRlRGVjbGFyYXRpb24gfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgbG9jYXRpb25zID0gcmVzdWx0Lm1hcChsb2MgPT4gKHsgdXJpOiBtb25hY28uVXJpLnBhcnNlKGxvYy51cmkpLCByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhsb2MucmFuZ2UpIH0pKTtcbiAgICAgICAgICAgIC8vIFRoZSByZWZlcmVuY2VzIHBlZWsgY2FuIG9ubHkgc2hvdyBhIGNvZGUgcHJldmlldyBmb3IgZmlsZXMgaXQgaGFzIGEgbW9kZWwgZm9yOyBjcmVhdGVcbiAgICAgICAgICAgIC8vIGluLW1lbW9yeSBtb2RlbHMgZm9yIHRoZSByZWZlcmVuY2VkIChwb3NzaWJseSB1bm9wZW5lZCkgZmlsZXMgc28gcHJldmlld3MgcmVuZGVyLlxuICAgICAgICAgICAgYXdhaXQgZW5zdXJlTW9kZWxzRm9yTG9jYXRpb25zKGxvY2F0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gbG9jYXRpb25zO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlclJlbmFtZVByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlUmVuYW1lRWRpdHM6IGFzeW5jIChtb2RlbCwgcG9zaXRpb24sIG5ld05hbWUpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiB7IGVkaXRzOiBbXSB9O1xuICAgICAgICAgICAgY29uc3QgZWRpdDogV29ya3NwYWNlRWRpdCB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L3JlbmFtZScsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICAgICAgbmV3TmFtZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFlZGl0KSByZXR1cm4geyBlZGl0czogW10gfTtcbiAgICAgICAgICAgIC8vIEEgSkRULkxTIHJlbmFtZSBjYW4gc3BhbiBtYW55IGZpbGVzIGFuZCBldmVuIHJlbmFtZSB0aGUgdHlwZSdzIG93biAuamF2YSBmaWxlLiBNb25hY28nc1xuICAgICAgICAgICAgLy8gc2luZ2xlLWZpbGUgZWRpdG9yIHdvdWxkIGRyb3AgZXZlcnl0aGluZyBidXQgdGhlIGN1cnJlbnQgbW9kZWwsIHNvIGFwcGx5IHRoZSB3aG9sZSBlZGl0XG4gICAgICAgICAgICAvLyB0aHJvdWdoIHRoZSB3b3Jrc3BhY2Ugb3Vyc2VsdmVzIHdoZW4gdGhlIElERSBwZXJzaXN0ZW5jZSBob29rIGlzIGF2YWlsYWJsZS5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgKGdsb2JhbFRoaXMgYXMgYW55KS5qYXZhTHNwUGVyc2lzdFJlbmFtZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGFwcGx5UmVuYW1lQWNyb3NzV29ya3NwYWNlKG1vZGVsLCBlZGl0KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZWRpdHM6IFtdIH07XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbamF2YS1sc3BdIGNyb3NzLWZpbGUgcmVuYW1lIGZhaWxlZCwgYXBwbHlpbmcgdG8gdGhlIGN1cnJlbnQgZmlsZSBvbmx5OicsIGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gd29ya3NwYWNlRWRpdFRvTW9uYWNvKGVkaXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB3b3Jrc3BhY2VFZGl0VG9Nb25hY28oZWRpdCk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlc29sdmVSZW5hbWVMb2NhdGlvbjogYXN5bmMgKG1vZGVsLCBwb3NpdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogeyByYW5nZTogTHNwUmFuZ2U7IHBsYWNlaG9sZGVyPzogc3RyaW5nIH0gfCBMc3BSYW5nZSB8IG51bGwgPVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L3ByZXBhcmVSZW5hbWUnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gJ3JhbmdlJyBpbiByZXN1bHQgPyByZXN1bHQucmFuZ2UgOiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSAncGxhY2Vob2xkZXInIGluIHJlc3VsdCAmJiByZXN1bHQucGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICAgICAgPyByZXN1bHQucGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICAgICAgOiBtb2RlbC5nZXRXb3JkQXRQb3NpdGlvbihwb3NpdGlvbik/LndvcmQgPz8gJyc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28ocmFuZ2UpLCB0ZXh0OiBwbGFjZWhvbGRlciB9O1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgY29uc3Qgd29yZCA9IG1vZGVsLmdldFdvcmRBdFBvc2l0aW9uKHBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gd29yZCA/IHtcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2U6IHsgc3RhcnRMaW5lTnVtYmVyOiBwb3NpdGlvbi5saW5lTnVtYmVyLCBzdGFydENvbHVtbjogd29yZC5zdGFydENvbHVtbiwgZW5kTGluZU51bWJlcjogcG9zaXRpb24ubGluZU51bWJlciwgZW5kQ29sdW1uOiB3b3JkLmVuZENvbHVtbiB9LFxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiB3b3JkLndvcmQsXG4gICAgICAgICAgICAgICAgfSA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBSZWdpc3RlcmluZyB0aGlzIHByb3ZpZGVyIGFsc28gZW5hYmxlcyBlZGl0b3IuanMncyBleGlzdGluZyBmb3JtYXQtb24tc2F2ZSBwYXRoIGZvciBKYXZhOiB0aGVcbiAgICAvLyBzaGFyZWQgU2F2ZSBhY3Rpb24gcnVucyBlZGl0b3IuYWN0aW9uLmZvcm1hdERvY3VtZW50IHdoZW4gYXV0by1mb3JtYXR0aW5nIGlzIG9uICh0aGUgc2FtZVxuICAgIC8vIG1lY2hhbmlzbSBhbmQgZ2xvYmFsIHRvZ2dsZSB1c2VkIGZvciBUeXBlU2NyaXB0KS5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyRG9jdW1lbnRGb3JtYXR0aW5nRWRpdFByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlRG9jdW1lbnRGb3JtYXR0aW5nRWRpdHM6IGFzeW5jIChtb2RlbCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBlZGl0czogVGV4dEVkaXRbXSB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L2Zvcm1hdHRpbmcnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiAgICAgIHsgdGFiU2l6ZTogbW9kZWwuZ2V0T3B0aW9ucygpLnRhYlNpemUsIGluc2VydFNwYWNlczogbW9kZWwuZ2V0T3B0aW9ucygpLmluc2VydFNwYWNlcyB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gZWRpdHMgPyBlZGl0cy5tYXAodGV4dEVkaXRUb01vbmFjbykgOiBudWxsO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckNvZGVBY3Rpb25Qcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZUNvZGVBY3Rpb25zOiBhc3luYyAobW9kZWwsIHJhbmdlLCBjb250ZXh0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbXB0eSA9IHsgYWN0aW9uczogW10sIGRpc3Bvc2UoKSB7IC8qIG5vdGhpbmcgdG8gZGlzcG9zZSAqLyB9IH07XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gZW1wdHk7XG4gICAgICAgICAgICAvLyBTZW5kIHRoZSBvcmlnaW5hbCBMU1AgZGlhZ25vc3RpY3MgdGhhdCBvdmVybGFwIHRoZSByYW5nZSAodGhleSBjYXJyeSB0aGUgY29kZS9kYXRhIEpEVC5MU1xuICAgICAgICAgICAgLy8gbmVlZHMgdG8gY29tcHV0ZSBxdWljay1maXhlcyksIG5vdCBvbmVzIHJlY29uc3RydWN0ZWQgZnJvbSBNb25hY28gbWFya2Vycy5cbiAgICAgICAgICAgIGNvbnN0IGxzcFJhbmdlID0gbW9uYWNvUmFuZ2VUb0xzcChyYW5nZSk7XG4gICAgICAgICAgICBjb25zdCBkaWFnbm9zdGljcyA9IChfZGlhZ25vc3RpY3MuZ2V0KG1vZGVsLnVyaS50b1N0cmluZygpKSA/PyBbXSkuZmlsdGVyKGQgPT4gcmFuZ2VzT3ZlcmxhcChkLnJhbmdlLCBsc3BSYW5nZSkpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBBcnJheTxDb2RlQWN0aW9uIHwgQ29tbWFuZD4gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9jb2RlQWN0aW9uJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICAgICAgcmFuZ2U6ICAgICAgICBsc3BSYW5nZSxcbiAgICAgICAgICAgICAgICAvLyBNb25hY28ncyBDb2RlQWN0aW9uVHJpZ2dlclR5cGUgKEludm9rZT0xLCBBdXRvPTIpIG1hcHMgMToxIHRvIHRoZSBMU1AgdHJpZ2dlciBraW5kLlxuICAgICAgICAgICAgICAgIC8vIEZvcndhcmRpbmcgaXQgbGV0cyBKRFQuTFMgY29tcHV0ZSBvbmx5IHF1aWNrLWZpeGVzIGZvciB0aGUgcGFzc2l2ZSBsaWdodGJ1bGIgKGNoZWFwKVxuICAgICAgICAgICAgICAgIC8vIGFuZCB0aGUgZnVsbCBhc3Npc3RzL3JlZmFjdG9yaW5ncyBvbmx5IG9uIGV4cGxpY2l0IEN0cmwrLiAvIFJlZmFjdG9yXHUyMDI2IChJbnZva2VkKS5cbiAgICAgICAgICAgICAgICBjb250ZXh0OiAgICAgIHsgZGlhZ25vc3RpY3MsIG9ubHk6IGNvbnRleHQub25seSA/IFtjb250ZXh0Lm9ubHldIDogdW5kZWZpbmVkLCB0cmlnZ2VyS2luZDogY29udGV4dC50cmlnZ2VyIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0Py5sZW5ndGgpIHJldHVybiBlbXB0eTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgYWN0aW9uczogcmVzdWx0Lm1hcChsc3BDb2RlQWN0aW9uVG9Nb25hY28pLFxuICAgICAgICAgICAgICAgIGRpc3Bvc2UoKSB7IC8qIG5vdGhpbmcgdG8gZGlzcG9zZSAqLyB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICB9LCB7XG4gICAgICAgIHByb3ZpZGVkQ29kZUFjdGlvbktpbmRzOiBbJ3F1aWNrZml4JywgJ3JlZmFjdG9yJywgJ3JlZmFjdG9yLmV4dHJhY3QnLCAncmVmYWN0b3IuaW5saW5lJyxcbiAgICAgICAgICAgICdyZWZhY3Rvci5yZXdyaXRlJywgJ3NvdXJjZScsICdzb3VyY2Uub3JnYW5pemVJbXBvcnRzJ10sXG4gICAgfSk7XG5cbiAgICAvLyAtLS0gTmF2aWdhdGlvbiAmIHN0cnVjdHVyZSAoUGFjayAxKSAtLS1cblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJJbXBsZW1lbnRhdGlvblByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlSW1wbGVtZW50YXRpb246IChtb2RlbCwgcG9zaXRpb24pID0+IHJlcXVlc3RMb2NhdGlvbnMoJ3RleHREb2N1bWVudC9pbXBsZW1lbnRhdGlvbicsIG1vZGVsLCBwb3NpdGlvbiksXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyVHlwZURlZmluaXRpb25Qcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZVR5cGVEZWZpbml0aW9uOiAobW9kZWwsIHBvc2l0aW9uKSA9PiByZXF1ZXN0TG9jYXRpb25zKCd0ZXh0RG9jdW1lbnQvdHlwZURlZmluaXRpb24nLCBtb2RlbCwgcG9zaXRpb24pLFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckRvY3VtZW50SGlnaGxpZ2h0UHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVEb2N1bWVudEhpZ2hsaWdodHM6IGFzeW5jIChtb2RlbCwgcG9zaXRpb24pID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBhbnlbXSB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L2RvY3VtZW50SGlnaGxpZ2h0Jywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5tYXAoaCA9PiAoeyByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhoLnJhbmdlKSwga2luZDogaC5raW5kID8gaC5raW5kIC0gMSA6IHVuZGVmaW5lZCB9KSk7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyRG9jdW1lbnRTeW1ib2xQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZURvY3VtZW50U3ltYm9sczogYXN5bmMgKG1vZGVsKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55W10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9kb2N1bWVudFN5bWJvbCcsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0ID8gbWFwRG9jdW1lbnRTeW1ib2xzKHJlc3VsdCkgOiBudWxsO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckZvbGRpbmdSYW5nZVByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlRm9sZGluZ1JhbmdlczogYXN5bmMgKG1vZGVsKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55W10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9mb2xkaW5nUmFuZ2UnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5tYXAociA9PiAoeyBzdGFydDogci5zdGFydExpbmUgKyAxLCBlbmQ6IHIuZW5kTGluZSArIDEsIGtpbmQ6IGZvbGRpbmdLaW5kKHIua2luZCkgfSkpO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlclNlbGVjdGlvblJhbmdlUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVTZWxlY3Rpb25SYW5nZXM6IGFzeW5jIChtb2RlbCwgcG9zaXRpb25zKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55W10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9zZWxlY3Rpb25SYW5nZScsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uczogICAgcG9zaXRpb25zLm1hcChwID0+ICh7IGxpbmU6IHAubGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogcC5jb2x1bW4gLSAxIH0pKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5tYXAoZmxhdHRlblNlbGVjdGlvblJhbmdlKTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJEb2N1bWVudFJhbmdlRm9ybWF0dGluZ0VkaXRQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZURvY3VtZW50UmFuZ2VGb3JtYXR0aW5nRWRpdHM6IGFzeW5jIChtb2RlbCwgcmFuZ2UpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgZWRpdHM6IFRleHRFZGl0W10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9yYW5nZUZvcm1hdHRpbmcnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgICAgICByYW5nZTogICAgICAgIG1vbmFjb1JhbmdlVG9Mc3AocmFuZ2UpLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6ICAgICAgeyB0YWJTaXplOiBtb2RlbC5nZXRPcHRpb25zKCkudGFiU2l6ZSwgaW5zZXJ0U3BhY2VzOiBtb2RlbC5nZXRPcHRpb25zKCkuaW5zZXJ0U3BhY2VzIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBlZGl0cyA/IGVkaXRzLm1hcCh0ZXh0RWRpdFRvTW9uYWNvKSA6IG51bGw7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyAtLS0gSW5sYXkgaGludHMgKyBzZW1hbnRpYyBoaWdobGlnaHRpbmcgKFBhY2sgMikgLS0tXG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVySW5sYXlIaW50c1Byb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlSW5sYXlIaW50czogYXN5bmMgKG1vZGVsLCByYW5nZSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IGFueVtdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvaW5sYXlIaW50Jywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICAgICAgcmFuZ2U6ICAgICAgICBtb25hY29SYW5nZVRvTHNwKHJhbmdlKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBoaW50czogcmVzdWx0Lm1hcChoID0+ICh7XG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lTnVtYmVyOiBoLnBvc2l0aW9uLmxpbmUgKyAxLCBjb2x1bW46IGgucG9zaXRpb24uY2hhcmFjdGVyICsgMSB9LFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogICAgICAgIHR5cGVvZiBoLmxhYmVsID09PSAnc3RyaW5nJyA/IGgubGFiZWwgOiAoaC5sYWJlbCA/PyBbXSkubWFwKChwOiBhbnkpID0+ICh7IGxhYmVsOiBwLnZhbHVlIH0pKSxcbiAgICAgICAgICAgICAgICAgICAga2luZDogICAgICAgICBoLmtpbmQsXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmdMZWZ0OiAgaC5wYWRkaW5nTGVmdCxcbiAgICAgICAgICAgICAgICAgICAgcGFkZGluZ1JpZ2h0OiBoLnBhZGRpbmdSaWdodCxcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcDogICAgICBoLnRvb2x0aXAgPyBtYXJrdXBUb1N0cmluZyhoLnRvb2x0aXApIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgICBkaXNwb3NlKCkgeyAvKiBub3RoaW5nIHRvIGRpc3Bvc2UgKi8gfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyRG9jdW1lbnRTZW1hbnRpY1Rva2Vuc1Byb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBnZXRMZWdlbmQ6ICgpID0+IF9zZW1hbnRpY1Rva2Vuc0xlZ2VuZCA/PyB7IHRva2VuVHlwZXM6IFtdLCB0b2tlbk1vZGlmaWVyczogW10gfSxcbiAgICAgICAgcHJvdmlkZURvY3VtZW50U2VtYW50aWNUb2tlbnM6IGFzeW5jIChtb2RlbCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSB8fCAhX3NlbWFudGljVG9rZW5zTGVnZW5kKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogeyBkYXRhOiBudW1iZXJbXTsgcmVzdWx0SWQ/OiBzdHJpbmcgfSB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L3NlbWFudGljVG9rZW5zL2Z1bGwnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQ/LmRhdGEpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogbmV3IFVpbnQzMkFycmF5KHJlc3VsdC5kYXRhKSwgcmVzdWx0SWQ6IHJlc3VsdC5yZXN1bHRJZCB9O1xuICAgICAgICB9LFxuICAgICAgICByZWxlYXNlRG9jdW1lbnRTZW1hbnRpY1Rva2VuczogKCkgPT4geyAvKiBub3RoaW5nIHRvIHJlbGVhc2UgKi8gfSxcbiAgICB9KTtcblxuICAgIC8vIC0tLSBDb2RlTGVucyAoUGFjayAzKSAtLS1cblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJDb2RlTGVuc1Byb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlQ29kZUxlbnNlczogYXN5bmMgKG1vZGVsKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4geyBsZW5zZXM6IFtdLCBkaXNwb3NlKCkgeyAvKiAqLyB9IH07XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IGFueVtdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvY29kZUxlbnMnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgbGVuc2VzID0gKHJlc3VsdCA/PyBbXSkubWFwKChsZW5zLCBpKSA9PiAoe1xuICAgICAgICAgICAgICAgIHJhbmdlOiAgICBsc3BSYW5nZVRvTW9uYWNvKGxlbnMucmFuZ2UpLFxuICAgICAgICAgICAgICAgIGlkOiAgICAgICBTdHJpbmcoaSksXG4gICAgICAgICAgICAgICAgY29tbWFuZDogIGxlbnMuY29tbWFuZCA/IG1hcExlbnNDb21tYW5kKGxlbnMuY29tbWFuZCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgX2xzcDogICAgIGxlbnMsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICByZXR1cm4geyBsZW5zZXMsIGRpc3Bvc2UoKSB7IC8qICovIH0gfTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVzb2x2ZUNvZGVMZW5zOiBhc3luYyAoX21vZGVsLCBjb2RlTGVucykgPT4ge1xuICAgICAgICAgICAgY29uc3QgbHNwID0gKGNvZGVMZW5zIGFzIGFueSkuX2xzcDtcbiAgICAgICAgICAgIGlmIChfY29ubiAmJiBsc3AgJiYgIWxzcC5jb21tYW5kKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWQ6IGFueSA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCdjb2RlTGVucy9yZXNvbHZlJywgbHNwKTtcbiAgICAgICAgICAgICAgICAgICAgY29kZUxlbnMuY29tbWFuZCA9IHJlc29sdmVkPy5jb21tYW5kID8gbWFwTGVuc0NvbW1hbmQocmVzb2x2ZWQuY29tbWFuZCkgOiB7IGlkOiBOT09QX0NPTU1BTkQsIHRpdGxlOiAnJyB9O1xuICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICBjb2RlTGVucy5jb21tYW5kID0geyBpZDogTk9PUF9DT01NQU5ELCB0aXRsZTogJycgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29kZUxlbnM7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyAtLS0gSmF2YSBrZXl3b3JkIGNvbXBsZXRpb24gKFBhY2sgMWIpOiBhbHdheXMtYXZhaWxhYmxlLCByYW5rZWQgYmVsb3cgU0RLL0xTUCByZXN1bHRzIC0tLVxuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckNvbXBsZXRpb25JdGVtUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVDb21wbGV0aW9uSXRlbXM6IChtb2RlbCwgcG9zaXRpb24pID0+IHtcbiAgICAgICAgICAgIGlmICghaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCB3b3JkID0gbW9kZWwuZ2V0V29yZFVudGlsUG9zaXRpb24ocG9zaXRpb24pO1xuICAgICAgICAgICAgY29uc3QgcmFuZ2U6IG1vbmFjby5JUmFuZ2UgPSB7XG4gICAgICAgICAgICAgICAgc3RhcnRMaW5lTnVtYmVyOiBwb3NpdGlvbi5saW5lTnVtYmVyLCBzdGFydENvbHVtbjogd29yZC5zdGFydENvbHVtbixcbiAgICAgICAgICAgICAgICBlbmRMaW5lTnVtYmVyOiAgIHBvc2l0aW9uLmxpbmVOdW1iZXIsIGVuZENvbHVtbjogICB3b3JkLmVuZENvbHVtbixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb25zOiBKQVZBX0tFWVdPUkRTLm1hcChrZXl3b3JkID0+ICh7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAgICAgIGtleXdvcmQsXG4gICAgICAgICAgICAgICAgICAgIGtpbmQ6ICAgICAgIG1vbmFjby5sYW5ndWFnZXMuQ29tcGxldGlvbkl0ZW1LaW5kLktleXdvcmQsXG4gICAgICAgICAgICAgICAgICAgIGluc2VydFRleHQ6IGtleXdvcmQsXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlLFxuICAgICAgICAgICAgICAgICAgICBzb3J0VGV4dDogICBgOV8ke2tleXdvcmR9YCxcbiAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgIH0pO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBIZWxwZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIGxzcFNldmVyaXR5KHNldmVyaXR5OiBEaWFnbm9zdGljU2V2ZXJpdHkgfCB1bmRlZmluZWQpOiBtb25hY28uTWFya2VyU2V2ZXJpdHkge1xuICAgIHN3aXRjaCAoc2V2ZXJpdHkpIHtcbiAgICAgICAgY2FzZSBEaWFnbm9zdGljU2V2ZXJpdHkuRXJyb3I6ICAgICAgIHJldHVybiBtb25hY28uTWFya2VyU2V2ZXJpdHkuRXJyb3I7XG4gICAgICAgIGNhc2UgRGlhZ25vc3RpY1NldmVyaXR5Lldhcm5pbmc6ICAgICByZXR1cm4gbW9uYWNvLk1hcmtlclNldmVyaXR5Lldhcm5pbmc7XG4gICAgICAgIGNhc2UgRGlhZ25vc3RpY1NldmVyaXR5LkluZm9ybWF0aW9uOiByZXR1cm4gbW9uYWNvLk1hcmtlclNldmVyaXR5LkluZm87XG4gICAgICAgIGNhc2UgRGlhZ25vc3RpY1NldmVyaXR5LkhpbnQ6ICAgICAgICByZXR1cm4gbW9uYWNvLk1hcmtlclNldmVyaXR5LkhpbnQ7XG4gICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9uYWNvLk1hcmtlclNldmVyaXR5LkVycm9yO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gbHNwUmFuZ2VUb01vbmFjbyhyOiB7IHN0YXJ0OiB7IGxpbmU6IG51bWJlcjsgY2hhcmFjdGVyOiBudW1iZXIgfTsgZW5kOiB7IGxpbmU6IG51bWJlcjsgY2hhcmFjdGVyOiBudW1iZXIgfSB9KTogbW9uYWNvLklSYW5nZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnRMaW5lTnVtYmVyOiByLnN0YXJ0LmxpbmUgKyAxLFxuICAgICAgICBzdGFydENvbHVtbjogICAgIHIuc3RhcnQuY2hhcmFjdGVyICsgMSxcbiAgICAgICAgZW5kTGluZU51bWJlcjogICByLmVuZC5saW5lICsgMSxcbiAgICAgICAgZW5kQ29sdW1uOiAgICAgICByLmVuZC5jaGFyYWN0ZXIgKyAxLFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIG1hcmt1cFRvU3RyaW5nKGM6IHN0cmluZyB8IE1hcmt1cENvbnRlbnQpOiBzdHJpbmcge1xuICAgIHJldHVybiB0eXBlb2YgYyA9PT0gJ3N0cmluZycgPyBjIDogYy52YWx1ZTtcbn1cblxuZnVuY3Rpb24gbHNwQ29tcGxldGlvbktpbmQoa2luZDogQ29tcGxldGlvbkl0ZW1LaW5kIHwgdW5kZWZpbmVkKTogbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbUtpbmQge1xuICAgIGNvbnN0IEsgPSBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtS2luZDtcbiAgICBzd2l0Y2ggKGtpbmQpIHtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuVGV4dDogICAgICAgICAgcmV0dXJuIEsuVGV4dDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuTWV0aG9kOiAgICAgICAgcmV0dXJuIEsuTWV0aG9kO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5GdW5jdGlvbjogICAgICByZXR1cm4gSy5GdW5jdGlvbjtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuQ29uc3RydWN0b3I6ICAgcmV0dXJuIEsuQ29uc3RydWN0b3I7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLkZpZWxkOiAgICAgICAgIHJldHVybiBLLkZpZWxkO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5WYXJpYWJsZTogICAgICByZXR1cm4gSy5WYXJpYWJsZTtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuQ2xhc3M6ICAgICAgICAgcmV0dXJuIEsuQ2xhc3M7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLkludGVyZmFjZTogICAgIHJldHVybiBLLkludGVyZmFjZTtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuTW9kdWxlOiAgICAgICAgcmV0dXJuIEsuTW9kdWxlO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5Qcm9wZXJ0eTogICAgICByZXR1cm4gSy5Qcm9wZXJ0eTtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuS2V5d29yZDogICAgICAgcmV0dXJuIEsuS2V5d29yZDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuU25pcHBldDogICAgICAgcmV0dXJuIEsuU25pcHBldDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuQ29uc3RhbnQ6ICAgICAgcmV0dXJuIEsuQ29uc3RhbnQ7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLlN0cnVjdDogICAgICAgIHJldHVybiBLLlN0cnVjdDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuVHlwZVBhcmFtZXRlcjogcmV0dXJuIEsuVHlwZVBhcmFtZXRlcjtcbiAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEsuVGV4dDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGxzcENvbXBsZXRpb25Ub01vbmFjbyhcbiAgICBpdGVtOiBDb21wbGV0aW9uSXRlbSxcbiAgICBtb2RlbDogbW9uYWNvLmVkaXRvci5JVGV4dE1vZGVsLFxuICAgIHBvc2l0aW9uOiBtb25hY28uUG9zaXRpb24sXG4pOiBNb25hY29Db21wbGV0aW9uSXRlbSB7XG4gICAgY29uc3Qgd29yZCA9IG1vZGVsLmdldFdvcmRVbnRpbFBvc2l0aW9uKHBvc2l0aW9uKTtcbiAgICBsZXQgcmFuZ2U6IG1vbmFjby5JUmFuZ2UgPSB7XG4gICAgICAgIHN0YXJ0TGluZU51bWJlcjogcG9zaXRpb24ubGluZU51bWJlcixcbiAgICAgICAgc3RhcnRDb2x1bW46ICAgICB3b3JkLnN0YXJ0Q29sdW1uLFxuICAgICAgICBlbmRMaW5lTnVtYmVyOiAgIHBvc2l0aW9uLmxpbmVOdW1iZXIsXG4gICAgICAgIGVuZENvbHVtbjogICAgICAgd29yZC5lbmRDb2x1bW4sXG4gICAgfTtcbiAgICBsZXQgaW5zZXJ0VGV4dCA9IGl0ZW0uaW5zZXJ0VGV4dCA/PyBpdGVtLmxhYmVsO1xuICAgIGNvbnN0IHRleHRFZGl0ID0gaXRlbS50ZXh0RWRpdCBhcyB7IHJhbmdlPzogTHNwUmFuZ2U7IHJlcGxhY2U/OiBMc3BSYW5nZTsgaW5zZXJ0PzogTHNwUmFuZ2U7IG5ld1RleHQ/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcbiAgICBpZiAodGV4dEVkaXQpIHtcbiAgICAgICAgY29uc3QgciA9IHRleHRFZGl0LnJhbmdlID8/IHRleHRFZGl0LnJlcGxhY2UgPz8gdGV4dEVkaXQuaW5zZXJ0O1xuICAgICAgICBpZiAocikgcmFuZ2UgPSBsc3BSYW5nZVRvTW9uYWNvKHIpO1xuICAgICAgICBpZiAodHlwZW9mIHRleHRFZGl0Lm5ld1RleHQgPT09ICdzdHJpbmcnKSBpbnNlcnRUZXh0ID0gdGV4dEVkaXQubmV3VGV4dDtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0OiBNb25hY29Db21wbGV0aW9uSXRlbSA9IHtcbiAgICAgICAgbGFiZWw6ICAgICAgICAgICBpdGVtLmxhYmVsLFxuICAgICAgICBraW5kOiAgICAgICAgICAgIGxzcENvbXBsZXRpb25LaW5kKGl0ZW0ua2luZCksXG4gICAgICAgIGRldGFpbDogICAgICAgICAgaXRlbS5kZXRhaWwsXG4gICAgICAgIGRvY3VtZW50YXRpb246ICAgaXRlbS5kb2N1bWVudGF0aW9uID8geyB2YWx1ZTogbWFya3VwVG9TdHJpbmcoaXRlbS5kb2N1bWVudGF0aW9uKSwgaXNUcnVzdGVkOiBmYWxzZSB9IDogdW5kZWZpbmVkLFxuICAgICAgICBpbnNlcnRUZXh0LFxuICAgICAgICBpbnNlcnRUZXh0UnVsZXM6IGl0ZW0uaW5zZXJ0VGV4dEZvcm1hdCA9PT0gSW5zZXJ0VGV4dEZvcm1hdC5TbmlwcGV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbUluc2VydFRleHRSdWxlLkluc2VydEFzU25pcHBldFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgcmFuZ2UsXG4gICAgICAgIHNvcnRUZXh0OiAgICAgICAgICAgIHNka1ByaW9yaXRpc2VkU29ydFRleHQoaXRlbSksXG4gICAgICAgIGZpbHRlclRleHQ6ICAgICAgICAgIGl0ZW0uZmlsdGVyVGV4dCxcbiAgICAgICAgcHJlc2VsZWN0OiAgICAgICAgICAgaXRlbS5wcmVzZWxlY3QsXG4gICAgICAgIGNvbW1pdENoYXJhY3RlcnM6ICAgIGl0ZW0uY29tbWl0Q2hhcmFjdGVycyxcbiAgICAgICAgYWRkaXRpb25hbFRleHRFZGl0czogaXRlbS5hZGRpdGlvbmFsVGV4dEVkaXRzPy5tYXAodGV4dEVkaXRUb01vbmFjbyksXG4gICAgfTtcbiAgICByZXN1bHQuX2xzcCA9IGl0ZW07XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBSYW5rcyBEaXJpZ2libGUgU0RLIHN1Z2dlc3Rpb25zICh7QGNvZGUgb3JnLmVjbGlwc2UuZGlyaWdpYmxlLnNkay4qfSkgYWJvdmUgZXZlcnl0aGluZyBlbHNlIGJ5XG4gKiBwcmVmaXhpbmcgdGhlIHNlcnZlciBzb3J0VGV4dCB3aXRoIGEgcHJpb3JpdHkgYnVja2V0LCBwcmVzZXJ2aW5nIHRoZSBzZXJ2ZXIgb3JkZXIgd2l0aGluIGVhY2ggYnVja2V0LlxuICovXG5mdW5jdGlvbiBzZGtQcmlvcml0aXNlZFNvcnRUZXh0KGl0ZW06IENvbXBsZXRpb25JdGVtKTogc3RyaW5nIHtcbiAgICBjb25zdCBiYXNlID0gaXRlbS5zb3J0VGV4dCA/PyAodHlwZW9mIGl0ZW0ubGFiZWwgPT09ICdzdHJpbmcnID8gaXRlbS5sYWJlbCA6ICcnKTtcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IChpdGVtLmxhYmVsRGV0YWlscyAmJiB0eXBlb2YgaXRlbS5sYWJlbERldGFpbHMuZGVzY3JpcHRpb24gPT09ICdzdHJpbmcnKVxuICAgICAgICA/IGl0ZW0ubGFiZWxEZXRhaWxzLmRlc2NyaXB0aW9uIDogJyc7XG4gICAgY29uc3QgaGF5c3RhY2sgPSBgJHtpdGVtLmRldGFpbCA/PyAnJ30gJHtkZXNjcmlwdGlvbn1gO1xuICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcygnb3JnLmVjbGlwc2UuZGlyaWdpYmxlLnNkaycpID8gYDBfJHtiYXNlfWAgOiBgMV8ke2Jhc2V9YDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ29kZSBhY3Rpb25zLCBjb21tYW5kcywgcmVmYWN0b3IvZ2VuZXJhdGUsIHdvcmtzcGFjZSBlZGl0c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogTW9uYWNvIGNvbW1hbmQgaWQgdXNlZCB0byBhcHBseSBhIGRlZmVycmVkIExTUCBjb2RlIGFjdGlvbiB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgaXQuICovXG5jb25zdCBBUFBMWV9BQ1RJT05fQ09NTUFORCA9ICdkaXJpZ2libGUuamF2YS5hcHBseUNvZGVBY3Rpb24nO1xuXG4vKiogVmlydHVhbCBVUkkgcHJlZml4IG9mIGVkaXRvciBtb2RlbHM7IHN0cmlwcGluZyBpdCB5aWVsZHMgdGhlIElERSB3b3Jrc3BhY2UgcGF0aCAoL3dzL3Byb2ovLi4uKS4gKi9cbmNvbnN0IFZJUlRVQUxfRklMRV9QUkVGSVggPSAnZmlsZTovLy93b3Jrc3BhY2UnO1xuXG4vKiogTW9uYWNvIGNvbW1hbmQgaWQgdXNlZCBmb3IgZGlzcGxheS1vbmx5IENvZGVMZW5zZXMgKGUuZy4gYSByZWZlcmVuY2UgY291bnQgd2l0aCBubyByZXNvbHZlZCBhY3Rpb24pLiAqL1xuY29uc3QgTk9PUF9DT01NQU5EID0gJ2RpcmlnaWJsZS5qYXZhLm5vb3BMZW5zJztcblxuLyoqIEphdmEgU0Uga2V5d29yZHMvbGl0ZXJhbHMgb2ZmZXJlZCBhcyBsb3ctcHJpb3JpdHkgY29tcGxldGlvbiBzbyB0aGV5IGFsd2F5cyBhcHBlYXIgd2hpbGUgdHlwaW5nLiAqL1xuY29uc3QgSkFWQV9LRVlXT1JEUyA9IFsnYWJzdHJhY3QnLCAnYXNzZXJ0JywgJ2Jvb2xlYW4nLCAnYnJlYWsnLCAnYnl0ZScsICdjYXNlJywgJ2NhdGNoJywgJ2NoYXInLCAnY2xhc3MnLFxuICAgICdjb25zdCcsICdjb250aW51ZScsICdkZWZhdWx0JywgJ2RvJywgJ2RvdWJsZScsICdlbHNlJywgJ2VudW0nLCAnZXh0ZW5kcycsICdmaW5hbCcsICdmaW5hbGx5JywgJ2Zsb2F0JyxcbiAgICAnZm9yJywgJ2dvdG8nLCAnaWYnLCAnaW1wbGVtZW50cycsICdpbXBvcnQnLCAnaW5zdGFuY2VvZicsICdpbnQnLCAnaW50ZXJmYWNlJywgJ2xvbmcnLCAnbmF0aXZlJywgJ25ldycsXG4gICAgJ3BhY2thZ2UnLCAncHJpdmF0ZScsICdwcm90ZWN0ZWQnLCAncHVibGljJywgJ3JldHVybicsICdzaG9ydCcsICdzdGF0aWMnLCAnc3RyaWN0ZnAnLCAnc3VwZXInLCAnc3dpdGNoJyxcbiAgICAnc3luY2hyb25pemVkJywgJ3RoaXMnLCAndGhyb3cnLCAndGhyb3dzJywgJ3RyYW5zaWVudCcsICd0cnknLCAndm9pZCcsICd2b2xhdGlsZScsICd3aGlsZScsICd2YXInLFxuICAgICd5aWVsZCcsICdyZWNvcmQnLCAnc2VhbGVkJywgJ3Blcm1pdHMnLCAndHJ1ZScsICdmYWxzZScsICdudWxsJ107XG5cbi8qKiBTaGFyZWQgZGVmaW5pdGlvbi1zdHlsZSBsb2NhdGlvbiByZXF1ZXN0IHVzZWQgYnkgZ28tdG8tZGVmaW5pdGlvbi9pbXBsZW1lbnRhdGlvbi90eXBlLWRlZmluaXRpb24uICovXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0TG9jYXRpb25zKG1ldGhvZDogc3RyaW5nLCBtb2RlbDogbW9uYWNvLmVkaXRvci5JVGV4dE1vZGVsLCBwb3NpdGlvbjogbW9uYWNvLlBvc2l0aW9uKSB7XG4gICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgcmVzdWx0OiBMb2NhdGlvbiB8IExvY2F0aW9uW10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QobWV0aG9kLCB7XG4gICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgfSk7XG4gICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGxvY2F0aW9ucyA9IChBcnJheS5pc0FycmF5KHJlc3VsdCkgPyByZXN1bHQgOiBbcmVzdWx0XSkubWFwKGxvYyA9PiAoeyB1cmk6IG1vbmFjby5VcmkucGFyc2UobG9jLnVyaSksIHJhbmdlOiBsc3BSYW5nZVRvTW9uYWNvKGxvYy5yYW5nZSkgfSkpO1xuICAgIGF3YWl0IGVuc3VyZU1vZGVsc0ZvckxvY2F0aW9ucyhsb2NhdGlvbnMpO1xuICAgIHJldHVybiBsb2NhdGlvbnM7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBpbi1tZW1vcnkgTW9uYWNvIG1vZGVscyBmb3IgdGhlIHdvcmtzcGFjZSBmaWxlcyByZWZlcmVuY2VkIGJ5IHRoZSBnaXZlbiBsb2NhdGlvbnMgKGZldGNoZWRcbiAqIG92ZXIgUkVTVCkgc28gdGhlIHJlZmVyZW5jZXMgLyBwZWVrIHdpZGdldHMgY2FuIHJlbmRlciBhIGNvZGUgcHJldmlldyBcdTIwMTQgTW9uYWNvIGNhbiBvbmx5IHByZXZpZXcgZmlsZXNcbiAqIGl0IGhhcyBhIG1vZGVsIGZvciwgYW5kIHRoaXMgc2luZ2xlLWZpbGUgZWRpdG9yIG90aGVyd2lzZSBoYXMgbm9uZSBmb3Igb3RoZXIgZmlsZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGVuc3VyZU1vZGVsc0ZvckxvY2F0aW9ucyhsb2NhdGlvbnM6IEFycmF5PHsgdXJpOiBtb25hY28uVXJpIH0+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKGxvY2F0aW9ucy5tYXAoYXN5bmMgKHsgdXJpIH0pID0+IHtcbiAgICAgICAgY29uc3QgdXJpU3RyID0gdXJpLnRvU3RyaW5nKCk7XG4gICAgICAgIGlmIChzZWVuLmhhcyh1cmlTdHIpIHx8ICF1cmlTdHIuc3RhcnRzV2l0aChWSVJUVUFMX0ZJTEVfUFJFRklYKSB8fCBtb25hY28uZWRpdG9yLmdldE1vZGVsKHVyaSkpIHJldHVybjtcbiAgICAgICAgc2Vlbi5hZGQodXJpU3RyKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCBmZXRjaFdvcmtzcGFjZUZpbGVUZXh0KHVyaVRvV29ya3NwYWNlUGF0aCh1cmlTdHIpID8/IHVyaVN0cik7XG4gICAgICAgICAgICBpZiAoIW1vbmFjby5lZGl0b3IuZ2V0TW9kZWwodXJpKSkgbW9uYWNvLmVkaXRvci5jcmVhdGVNb2RlbCh0ZXh0LCAnamF2YScsIHVyaSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gcHJldmlldyBqdXN0IHdvbid0IHJlbmRlciBmb3IgdGhpcyBvbmVcbiAgICAgICAgfVxuICAgIH0pKTtcbn1cblxuLyoqIFJlY3Vyc2l2ZWx5IG1hcHMgTFNQIGhpZXJhcmNoaWNhbCBEb2N1bWVudFN5bWJvbHMgdG8gTW9uYWNvJ3Mgc2hhcGUgKGtpbmRzIGFyZSAxLWJhc2VkIHZzIDAtYmFzZWQpLiAqL1xuZnVuY3Rpb24gbWFwRG9jdW1lbnRTeW1ib2xzKHN5bWJvbHM6IGFueVtdKTogbW9uYWNvLmxhbmd1YWdlcy5Eb2N1bWVudFN5bWJvbFtdIHtcbiAgICByZXR1cm4gKHN5bWJvbHMgPz8gW10pLm1hcChzID0+ICh7XG4gICAgICAgIG5hbWU6ICAgICAgICAgICBzLm5hbWUsXG4gICAgICAgIGRldGFpbDogICAgICAgICBzLmRldGFpbCA/PyAnJyxcbiAgICAgICAga2luZDogICAgICAgICAgIChzLmtpbmQgPz8gMSkgLSAxLFxuICAgICAgICB0YWdzOiAgICAgICAgICAgcy50YWdzID8/IFtdLFxuICAgICAgICByYW5nZTogICAgICAgICAgbHNwUmFuZ2VUb01vbmFjbyhzLnJhbmdlKSxcbiAgICAgICAgc2VsZWN0aW9uUmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28ocy5zZWxlY3Rpb25SYW5nZSA/PyBzLnJhbmdlKSxcbiAgICAgICAgY2hpbGRyZW46ICAgICAgIHMuY2hpbGRyZW4gPyBtYXBEb2N1bWVudFN5bWJvbHMocy5jaGlsZHJlbikgOiBbXSxcbiAgICB9KSk7XG59XG5cbmZ1bmN0aW9uIGZvbGRpbmdLaW5kKGtpbmQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IG1vbmFjby5sYW5ndWFnZXMuRm9sZGluZ1JhbmdlS2luZCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgRksgPSBtb25hY28ubGFuZ3VhZ2VzLkZvbGRpbmdSYW5nZUtpbmQ7XG4gICAgc3dpdGNoIChraW5kKSB7XG4gICAgICAgIGNhc2UgJ2NvbW1lbnQnOiByZXR1cm4gRksuQ29tbWVudDtcbiAgICAgICAgY2FzZSAnaW1wb3J0cyc6IHJldHVybiBGSy5JbXBvcnRzO1xuICAgICAgICBjYXNlICdyZWdpb24nOiAgcmV0dXJuIEZLLlJlZ2lvbjtcbiAgICAgICAgZGVmYXVsdDogICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxufVxuXG4vKiogRmxhdHRlbnMgYW4gTFNQIFNlbGVjdGlvblJhbmdlIHBhcmVudC1jaGFpbiBpbnRvIE1vbmFjbydzIGlubmVybW9zdC10by1vdXRlcm1vc3QgYXJyYXkuICovXG5mdW5jdGlvbiBmbGF0dGVuU2VsZWN0aW9uUmFuZ2Uoc2VsZWN0aW9uUmFuZ2U6IGFueSk6IG1vbmFjby5sYW5ndWFnZXMuU2VsZWN0aW9uUmFuZ2VbXSB7XG4gICAgY29uc3QgcmFuZ2VzOiBtb25hY28ubGFuZ3VhZ2VzLlNlbGVjdGlvblJhbmdlW10gPSBbXTtcbiAgICBsZXQgY3VycmVudCA9IHNlbGVjdGlvblJhbmdlO1xuICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICAgIHJhbmdlcy5wdXNoKHsgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28oY3VycmVudC5yYW5nZSkgfSk7XG4gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudDtcbiAgICB9XG4gICAgcmV0dXJuIHJhbmdlcztcbn1cblxuLyoqIE1hcHMgYSBKRFQuTFMgQ29kZUxlbnMgY29tbWFuZCB0byBhIE1vbmFjbyBjb21tYW5kLCB3aXJpbmcgdGhlIHJlZmVyZW5jZXMvaW1wbGVtZW50YXRpb25zIHBlZWsuICovXG5mdW5jdGlvbiBtYXBMZW5zQ29tbWFuZChjbWQ6IGFueSk6IG1vbmFjby5sYW5ndWFnZXMuQ29tbWFuZCB7XG4gICAgY29uc3QgYXJncyA9IGNtZC5hcmd1bWVudHMgPz8gW107XG4gICAgaWYgKChjbWQuY29tbWFuZCA9PT0gJ2phdmEuc2hvdy5yZWZlcmVuY2VzJyB8fCBjbWQuY29tbWFuZCA9PT0gJ2phdmEuc2hvdy5pbXBsZW1lbnRhdGlvbnMnKSAmJiBhcmdzLmxlbmd0aCA+PSAzKSB7XG4gICAgICAgIGNvbnN0IGxvY2F0aW9ucyA9IChhcmdzWzJdID8/IFtdKS5tYXAoKGw6IGFueSkgPT4gKHsgdXJpOiBtb25hY28uVXJpLnBhcnNlKGwudXJpKSwgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28obC5yYW5nZSkgfSkpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6ICAgICAgICAnZWRpdG9yLmFjdGlvbi5zaG93UmVmZXJlbmNlcycsXG4gICAgICAgICAgICB0aXRsZTogICAgIGNtZC50aXRsZSxcbiAgICAgICAgICAgIGFyZ3VtZW50czogW21vbmFjby5VcmkucGFyc2UoYXJnc1swXSksIHsgbGluZU51bWJlcjogYXJnc1sxXS5saW5lICsgMSwgY29sdW1uOiBhcmdzWzFdLmNoYXJhY3RlciArIDEgfSwgbG9jYXRpb25zXSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgaWQ6IE5PT1BfQ09NTUFORCwgdGl0bGU6IGNtZC50aXRsZSB9O1xufVxuXG50eXBlIExzcFJhbmdlID0geyBzdGFydDogeyBsaW5lOiBudW1iZXI7IGNoYXJhY3RlcjogbnVtYmVyIH07IGVuZDogeyBsaW5lOiBudW1iZXI7IGNoYXJhY3RlcjogbnVtYmVyIH0gfTtcblxuLyoqIE1vbmFjbyBjb21wbGV0aW9uIGl0ZW0gY2FycnlpbmcgdGhlIG9yaWdpbmF0aW5nIExTUCBpdGVtIHNvIHJlc29sdmUgY2FuIGZldGNoIGl0cyBpbXBvcnQgZWRpdHMuICovXG50eXBlIE1vbmFjb0NvbXBsZXRpb25JdGVtID0gbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbSAmIHsgX2xzcD86IENvbXBsZXRpb25JdGVtIH07XG5cbmZ1bmN0aW9uIHRleHRFZGl0VG9Nb25hY28oZWRpdDogVGV4dEVkaXQpOiBtb25hY28ubGFuZ3VhZ2VzLlRleHRFZGl0IHtcbiAgICByZXR1cm4geyByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhlZGl0LnJhbmdlKSwgdGV4dDogZWRpdC5uZXdUZXh0IH07XG59XG5cbmZ1bmN0aW9uIG1vbmFjb1JhbmdlVG9Mc3AocjogbW9uYWNvLklSYW5nZSk6IExzcFJhbmdlIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBzdGFydDogeyBsaW5lOiByLnN0YXJ0TGluZU51bWJlciAtIDEsIGNoYXJhY3Rlcjogci5zdGFydENvbHVtbiAtIDEgfSxcbiAgICAgICAgZW5kOiAgIHsgbGluZTogci5lbmRMaW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiByLmVuZENvbHVtbiAtIDEgfSxcbiAgICB9O1xufVxuXG4vKiogVHJ1ZSB3aGVuIHR3byBMU1AgcmFuZ2VzIGludGVyc2VjdCAodXNlZCB0byBwaWNrIHRoZSBkaWFnbm9zdGljcyByZWxldmFudCB0byBhIGNvZGUtYWN0aW9uIHJlcXVlc3QpLiAqL1xuZnVuY3Rpb24gcmFuZ2VzT3ZlcmxhcChhOiBMc3BSYW5nZSwgYjogTHNwUmFuZ2UpOiBib29sZWFuIHtcbiAgICBjb25zdCBub3RBZnRlciA9IChwOiB7IGxpbmU6IG51bWJlcjsgY2hhcmFjdGVyOiBudW1iZXIgfSwgcTogeyBsaW5lOiBudW1iZXI7IGNoYXJhY3RlcjogbnVtYmVyIH0pID0+XG4gICAgICAgIHAubGluZSA8IHEubGluZSB8fCAocC5saW5lID09PSBxLmxpbmUgJiYgcC5jaGFyYWN0ZXIgPD0gcS5jaGFyYWN0ZXIpO1xuICAgIHJldHVybiBub3RBZnRlcihhLnN0YXJ0LCBiLmVuZCkgJiYgbm90QWZ0ZXIoYi5zdGFydCwgYS5lbmQpO1xufVxuXG5mdW5jdGlvbiBsc3BDb2RlQWN0aW9uVG9Nb25hY28oYWN0aW9uOiBDb2RlQWN0aW9uIHwgQ29tbWFuZCk6IG1vbmFjby5sYW5ndWFnZXMuQ29kZUFjdGlvbiB7XG4gICAgY29uc3QgaXNDb21tYW5kID0gdHlwZW9mIChhY3Rpb24gYXMgQ29tbWFuZCkuY29tbWFuZCA9PT0gJ3N0cmluZyc7XG4gICAgY29uc3QgdGl0bGUgPSBhY3Rpb24udGl0bGVcbiAgICAgICAgPz8gKGlzQ29tbWFuZCA/IChhY3Rpb24gYXMgQ29tbWFuZCkuY29tbWFuZCA6IChhY3Rpb24gYXMgQ29kZUFjdGlvbikuY29tbWFuZD8udGl0bGUpXG4gICAgICAgID8/ICdBY3Rpb24nO1xuICAgIGNvbnN0IGtpbmQgPSBpc0NvbW1hbmQgPyAncXVpY2tmaXgnIDogKChhY3Rpb24gYXMgQ29kZUFjdGlvbikua2luZCA/PyAncXVpY2tmaXgnKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB0aXRsZSxcbiAgICAgICAga2luZCxcbiAgICAgICAgZGlhZ25vc3RpY3M6IFtdLFxuICAgICAgICBpc1ByZWZlcnJlZDogKGFjdGlvbiBhcyBDb2RlQWN0aW9uKS5pc1ByZWZlcnJlZCxcbiAgICAgICAgLy8gQXBwbHkgbGF6aWx5IHRocm91Z2ggb3VyIGNvbW1hbmQgc28gd2UgY2FuIHJlc29sdmUsIHJ1biBzZXJ2ZXIgY29tbWFuZHMgYW5kIGFwcGx5IGVkaXRzIHVuaWZvcm1seS5cbiAgICAgICAgY29tbWFuZDogeyBpZDogQVBQTFlfQUNUSU9OX0NPTU1BTkQsIHRpdGxlLCBhcmd1bWVudHM6IFthY3Rpb25dIH0sXG4gICAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gYXBwbHlDb2RlQWN0aW9uKGFjdGlvbjogQ29kZUFjdGlvbiB8IENvbW1hbmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIV9jb25uKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiAoYWN0aW9uIGFzIENvbW1hbmQpLmNvbW1hbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBhd2FpdCBydW5TZXJ2ZXJDb21tYW5kKGFjdGlvbiBhcyBDb21tYW5kKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzb2x2ZWQgPSBhY3Rpb24gYXMgQ29kZUFjdGlvbjtcbiAgICAgICAgaWYgKCFyZXNvbHZlZC5lZGl0ICYmIChyZXNvbHZlZCBhcyB7IGRhdGE/OiB1bmtub3duIH0pLmRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzb2x2ZWQgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgnY29kZUFjdGlvbi9yZXNvbHZlJywgcmVzb2x2ZWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXNvbHZlZC5lZGl0KSBhcHBseVdvcmtzcGFjZUVkaXQocmVzb2x2ZWQuZWRpdCk7XG4gICAgICAgIGlmIChyZXNvbHZlZC5jb21tYW5kKSBhd2FpdCBydW5TZXJ2ZXJDb21tYW5kKHJlc29sdmVkLmNvbW1hbmQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbamF2YS1sc3BdIGNvZGUgYWN0aW9uIGZhaWxlZDonLCAoZSBhcyBFcnJvcik/Lm1lc3NhZ2UgPz8gZSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBpc1dvcmtzcGFjZUVkaXQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBXb3Jrc3BhY2VFZGl0IHtcbiAgICByZXR1cm4gISF2YWx1ZSAmJiAoISEodmFsdWUgYXMgV29ya3NwYWNlRWRpdCkuY2hhbmdlcyB8fCAhISh2YWx1ZSBhcyBXb3Jrc3BhY2VFZGl0KS5kb2N1bWVudENoYW5nZXMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5TZXJ2ZXJDb21tYW5kKGNtZDogQ29tbWFuZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghX2Nvbm4gfHwgIWNtZD8uY29tbWFuZCkgcmV0dXJuO1xuICAgIGlmIChHRU5FUkFURVtjbWQuY29tbWFuZF0pIHtcbiAgICAgICAgYXdhaXQgcnVuR2VuZXJhdGUoY21kLmNvbW1hbmQsIGNtZC5hcmd1bWVudHMgPz8gW10pO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd3b3Jrc3BhY2UvZXhlY3V0ZUNvbW1hbmQnLCB7IGNvbW1hbmQ6IGNtZC5jb21tYW5kLCBhcmd1bWVudHM6IGNtZC5hcmd1bWVudHMgPz8gW10gfSk7XG4gICAgaWYgKGlzV29ya3NwYWNlRWRpdChyZXN1bHQpKSBhcHBseVdvcmtzcGFjZUVkaXQocmVzdWx0KTtcbn1cblxuaW50ZXJmYWNlIEdlbmVyYXRlU3BlYyB7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICBzdGF0dXM6IHN0cmluZztcbiAgICBnZW5lcmF0ZTogc3RyaW5nO1xuICAgIG1lbWJlcnM6IChzdGF0dXM6IGFueSkgPT4gQXJyYXk8eyBsYWJlbDogc3RyaW5nOyByZWY6IGFueSB9PjtcbiAgICBidWlsZEFyZ3M6IChwcm9tcHRBcmdzOiBhbnlbXSwgc3RhdHVzOiBhbnksIHNlbGVjdGVkOiBhbnlbXSkgPT4gYW55W107XG59XG5cbi8qKiBNZW1iZXItbmFtZWQgZmllbGRzIFx1MjE5MiBwaWNrZXIgbGFiZWxzLiAqL1xuZnVuY3Rpb24gZmllbGRMYWJlbChmOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSBmPy5uYW1lID8/IGY/LmZpZWxkTmFtZSA/PyAnJztcbiAgICBjb25zdCB0eXBlID0gZj8udHlwZSA/PyBmPy50eXBlTmFtZTtcbiAgICByZXR1cm4gdHlwZSA/IGAke25hbWV9OiAke3R5cGV9YCA6IGAke25hbWV9YDtcbn1cblxuLyoqXG4gKiBUaGUgSkRULkxTIHNvdXJjZS1nZW5lcmF0aW9uIGNvbW1hbmRzIChjb25zdHJ1Y3RvcnMsIGdldHRlcnMvc2V0dGVycywgdG9TdHJpbmcsIGhhc2hDb2RlL2VxdWFscykuXG4gKiBFYWNoIG1hcHMgdGhlIGNsaWVudCBcIipQcm9tcHRcIiBjb21tYW5kIHRvIHRoZSBzZXJ2ZXIgc3RhdHVzICsgZ2VuZXJhdGUgZGVsZWdhdGUgY29tbWFuZHM7IHRoZSBzdGF0dXNcbiAqIGNhbGwgeWllbGRzIHRoZSBjYW5kaWRhdGUgZmllbGRzIHNob3duIGluIHRoZSBtZW1iZXIgcGlja2VyLCB0aGUgZ2VuZXJhdGUgY2FsbCByZXR1cm5zIHRoZSBlZGl0LlxuICovXG5jb25zdCBHRU5FUkFURTogUmVjb3JkPHN0cmluZywgR2VuZXJhdGVTcGVjPiA9IHtcbiAgICAnamF2YS5hY3Rpb24uZ2VuZXJhdGVDb25zdHJ1Y3RvcnNQcm9tcHQnOiB7XG4gICAgICAgIGxhYmVsOiAnU2VsZWN0IGZpZWxkcyBhbmQgY29uc3RydWN0b3JzJyxcbiAgICAgICAgc3RhdHVzOiAnamF2YS5hY3Rpb24uY2hlY2tDb25zdHJ1Y3RvcnNTdGF0dXMnLFxuICAgICAgICBnZW5lcmF0ZTogJ2phdmEuYWN0aW9uLmdlbmVyYXRlQ29uc3RydWN0b3JzJyxcbiAgICAgICAgbWVtYmVyczogKHMpID0+IChzPy5maWVsZHMgPz8gW10pLm1hcCgoZjogYW55KSA9PiAoeyBsYWJlbDogZmllbGRMYWJlbChmKSwgcmVmOiBmIH0pKSxcbiAgICAgICAgYnVpbGRBcmdzOiAoYXJncywgcywgc2VsKSA9PiBbYXJnc1swXSwgeyBjb25zdHJ1Y3RvcnM6IHM/LmNvbnN0cnVjdG9ycyA/PyBbXSwgZmllbGRzOiBzZWwubWFwKG0gPT4gbS5yZWYpIH1dLFxuICAgIH0sXG4gICAgJ2phdmEuYWN0aW9uLmdlbmVyYXRlVG9TdHJpbmdQcm9tcHQnOiB7XG4gICAgICAgIGxhYmVsOiAnU2VsZWN0IGZpZWxkcyB0byBpbmNsdWRlIGluIHRvU3RyaW5nKCknLFxuICAgICAgICBzdGF0dXM6ICdqYXZhLmFjdGlvbi5jaGVja1RvU3RyaW5nU3RhdHVzJyxcbiAgICAgICAgZ2VuZXJhdGU6ICdqYXZhLmFjdGlvbi5nZW5lcmF0ZVRvU3RyaW5nJyxcbiAgICAgICAgbWVtYmVyczogKHMpID0+IChzPy5maWVsZHMgPz8gW10pLm1hcCgoZjogYW55KSA9PiAoeyBsYWJlbDogZmllbGRMYWJlbChmKSwgcmVmOiBmIH0pKSxcbiAgICAgICAgYnVpbGRBcmdzOiAoYXJncywgX3MsIHNlbCkgPT4gW2FyZ3NbMF0sIHNlbC5tYXAobSA9PiBtLnJlZildLFxuICAgIH0sXG4gICAgJ2phdmEuYWN0aW9uLmhhc2hDb2RlRXF1YWxzUHJvbXB0Jzoge1xuICAgICAgICBsYWJlbDogJ1NlbGVjdCBmaWVsZHMgZm9yIGhhc2hDb2RlKCkgYW5kIGVxdWFscygpJyxcbiAgICAgICAgc3RhdHVzOiAnamF2YS5hY3Rpb24uY2hlY2tIYXNoQ29kZUVxdWFsc1N0YXR1cycsXG4gICAgICAgIGdlbmVyYXRlOiAnamF2YS5hY3Rpb24uZ2VuZXJhdGVIYXNoQ29kZUVxdWFscycsXG4gICAgICAgIG1lbWJlcnM6IChzKSA9PiAocz8uZmllbGRzID8/IFtdKS5tYXAoKGY6IGFueSkgPT4gKHsgbGFiZWw6IGZpZWxkTGFiZWwoZiksIHJlZjogZiB9KSksXG4gICAgICAgIGJ1aWxkQXJnczogKGFyZ3MsIF9zLCBzZWwpID0+IFthcmdzWzBdLCBzZWwubWFwKG0gPT4gbS5yZWYpLCBmYWxzZV0sXG4gICAgfSxcbiAgICAnamF2YS5hY3Rpb24uZ2VuZXJhdGVBY2Nlc3NvcnNQcm9tcHQnOiB7XG4gICAgICAgIGxhYmVsOiAnU2VsZWN0IGZpZWxkcyB0byBnZW5lcmF0ZSBnZXR0ZXJzIGFuZCBzZXR0ZXJzJyxcbiAgICAgICAgc3RhdHVzOiAnamF2YS5hY3Rpb24uY2hlY2tBY2Nlc3NvcnNTdGF0dXMnLFxuICAgICAgICBnZW5lcmF0ZTogJ2phdmEuYWN0aW9uLmdlbmVyYXRlQWNjZXNzb3JzJyxcbiAgICAgICAgbWVtYmVyczogKHMpID0+IChzPy5hY2Nlc3NvcnMgPz8gcyA/PyBbXSkubWFwKChhOiBhbnkpID0+ICh7IGxhYmVsOiBmaWVsZExhYmVsKGEpLCByZWY6IGEgfSkpLFxuICAgICAgICBidWlsZEFyZ3M6IChhcmdzLCBfcywgc2VsKSA9PiBbYXJnc1swXSwgc2VsLm1hcChtID0+IG0ucmVmKV0sXG4gICAgfSxcbiAgICAnamF2YS5hY3Rpb24ub3ZlcnJpZGVNZXRob2RzUHJvbXB0Jzoge1xuICAgICAgICBsYWJlbDogJ1NlbGVjdCBtZXRob2RzIHRvIG92ZXJyaWRlIG9yIGltcGxlbWVudCcsXG4gICAgICAgIHN0YXR1czogJ2phdmEuYWN0aW9uLmxpc3RPdmVycmlkYWJsZU1ldGhvZHMnLFxuICAgICAgICBnZW5lcmF0ZTogJ2phdmEuYWN0aW9uLmFkZE92ZXJyaWRhYmxlTWV0aG9kcycsXG4gICAgICAgIG1lbWJlcnM6IChzKSA9PiAocz8ubWV0aG9kcyA/PyBbXSkubWFwKChtOiBhbnkpID0+ICh7XG4gICAgICAgICAgICBsYWJlbDogYCR7bS5uYW1lfSgkeyhtLnBhcmFtZXRlcnMgPz8gW10pLmpvaW4oJywgJyl9KSR7bS5kZWNsYXJpbmdDbGFzcyA/ICcgOiAnICsgbS5kZWNsYXJpbmdDbGFzcyA6ICcnfWAsXG4gICAgICAgICAgICByZWY6IG0sXG4gICAgICAgIH0pKSxcbiAgICAgICAgYnVpbGRBcmdzOiAoYXJncywgc3RhdHVzLCBzZWwpID0+IFthcmdzWzBdLCB7IG92ZXJyaWRhYmxlTWV0aG9kczogc2VsLm1hcChtID0+IG0ucmVmKSwgdHlwZTogc3RhdHVzPy50eXBlIH1dLFxuICAgIH0sXG59O1xuXG5hc3luYyBmdW5jdGlvbiBydW5HZW5lcmF0ZShwcm9tcHRJZDogc3RyaW5nLCBhcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghX2Nvbm4pIHJldHVybjtcbiAgICBjb25zdCBzcGVjID0gR0VORVJBVEVbcHJvbXB0SWRdO1xuICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd3b3Jrc3BhY2UvZXhlY3V0ZUNvbW1hbmQnLCB7IGNvbW1hbmQ6IHNwZWMuc3RhdHVzLCBhcmd1bWVudHM6IGFyZ3MgfSk7XG4gICAgaWYgKCFzdGF0dXMpIHJldHVybjtcbiAgICBjb25zdCBtZW1iZXJzID0gc3BlYy5tZW1iZXJzKHN0YXR1cyk7XG4gICAgbGV0IHNlbGVjdGVkID0gbWVtYmVycztcbiAgICBjb25zdCBwaWNrZXIgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLmphdmFMc3BNZW1iZXJQaWNrZXI7XG4gICAgaWYgKG1lbWJlcnMubGVuZ3RoICYmIHR5cGVvZiBwaWNrZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY29uc3QgY2hvc2VuOiBzdHJpbmdbXSB8IG51bGwgPSBhd2FpdCBwaWNrZXIoc3BlYy5sYWJlbCwgbWVtYmVycy5tYXAobSA9PiBtLmxhYmVsKSk7XG4gICAgICAgIGlmIChjaG9zZW4gPT09IG51bGwpIHJldHVybjsgLy8gdXNlciBjYW5jZWxsZWQgdGhlIGRpYWxvZ1xuICAgICAgICBzZWxlY3RlZCA9IG1lbWJlcnMuZmlsdGVyKG0gPT4gY2hvc2VuLmluY2x1ZGVzKG0ubGFiZWwpKTtcbiAgICB9XG4gICAgY29uc3QgZWRpdCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd3b3Jrc3BhY2UvZXhlY3V0ZUNvbW1hbmQnLCB7XG4gICAgICAgIGNvbW1hbmQ6IHNwZWMuZ2VuZXJhdGUsXG4gICAgICAgIGFyZ3VtZW50czogc3BlYy5idWlsZEFyZ3MoYXJncywgc3RhdHVzLCBzZWxlY3RlZCksXG4gICAgfSk7XG4gICAgaWYgKGlzV29ya3NwYWNlRWRpdChlZGl0KSkgYXBwbHlXb3Jrc3BhY2VFZGl0KGVkaXQpO1xufVxuXG4vKiogR3JvdXBzIGEgd29ya3NwYWNlIGVkaXQncyB0ZXh0IGVkaXRzIGJ5IGRvY3VtZW50IGFuZCBhcHBsaWVzIHRoZW0gaW4gcGxhY2UgdG8gb3BlbiBNb25hY28gbW9kZWxzLiAqL1xuZnVuY3Rpb24gYXBwbHlXb3Jrc3BhY2VFZGl0KGVkaXQ6IFdvcmtzcGFjZUVkaXQgfCBudWxsIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0KSByZXR1cm47XG4gICAgY29uc3QgYnlVcmk6IFJlY29yZDxzdHJpbmcsIFRleHRFZGl0W10+ID0ge307XG4gICAgaWYgKGVkaXQuY2hhbmdlcykge1xuICAgICAgICBmb3IgKGNvbnN0IHVyaSBpbiBlZGl0LmNoYW5nZXMpIGJ5VXJpW3VyaV0gPSAoYnlVcmlbdXJpXSA/PyBbXSkuY29uY2F0KGVkaXQuY2hhbmdlc1t1cmldKTtcbiAgICB9XG4gICAgaWYgKGVkaXQuZG9jdW1lbnRDaGFuZ2VzKSB7XG4gICAgICAgIGZvciAoY29uc3QgZGMgb2YgZWRpdC5kb2N1bWVudENoYW5nZXMgYXMgYW55W10pIHtcbiAgICAgICAgICAgIGlmIChkYz8udGV4dERvY3VtZW50Py51cmkgJiYgQXJyYXkuaXNBcnJheShkYy5lZGl0cykpIHtcbiAgICAgICAgICAgICAgICBieVVyaVtkYy50ZXh0RG9jdW1lbnQudXJpXSA9IChieVVyaVtkYy50ZXh0RG9jdW1lbnQudXJpXSA/PyBbXSkuY29uY2F0KGRjLmVkaXRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IHVyaSBpbiBieVVyaSkge1xuICAgICAgICBjb25zdCBtb2RlbCA9IG1vbmFjby5lZGl0b3IuZ2V0TW9kZWxzKCkuZmluZChtID0+IG0udXJpLnRvU3RyaW5nKCkgPT09IHVyaSk7XG4gICAgICAgIGlmICghbW9kZWwpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBvcHMgPSBieVVyaVt1cmldLm1hcChlID0+ICh7IHJhbmdlOiBsc3BSYW5nZVRvTW9uYWNvKGUucmFuZ2UpLCB0ZXh0OiBlLm5ld1RleHQsIGZvcmNlTW92ZU1hcmtlcnM6IHRydWUgfSkpO1xuICAgICAgICBtb2RlbC5wdXNoRWRpdE9wZXJhdGlvbnMoW10sIG9wcywgKCkgPT4gbnVsbCk7XG4gICAgfVxufVxuXG4vKiogQ29udmVydHMgYW4gTFNQIHdvcmtzcGFjZSBlZGl0IGludG8gdGhlIE1vbmFjbyBzaGFwZSByZXR1cm5lZCBieSB0aGUgcmVuYW1lIHByb3ZpZGVyLiAqL1xuZnVuY3Rpb24gd29ya3NwYWNlRWRpdFRvTW9uYWNvKGVkaXQ6IFdvcmtzcGFjZUVkaXQgfCBudWxsKTogbW9uYWNvLmxhbmd1YWdlcy5Xb3Jrc3BhY2VFZGl0IHtcbiAgICBjb25zdCBlZGl0czogYW55W10gPSBbXTtcbiAgICBjb25zdCBwdXNoID0gKHVyaTogc3RyaW5nLCBsaXN0OiBUZXh0RWRpdFtdKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgZSBvZiBsaXN0KSB7XG4gICAgICAgICAgICBlZGl0cy5wdXNoKHsgcmVzb3VyY2U6IG1vbmFjby5VcmkucGFyc2UodXJpKSwgdGV4dEVkaXQ6IHsgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28oZS5yYW5nZSksIHRleHQ6IGUubmV3VGV4dCB9LCB2ZXJzaW9uSWQ6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgaWYgKGVkaXQ/LmNoYW5nZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCB1cmkgaW4gZWRpdC5jaGFuZ2VzKSBwdXNoKHVyaSwgZWRpdC5jaGFuZ2VzW3VyaV0pO1xuICAgIH1cbiAgICBpZiAoZWRpdD8uZG9jdW1lbnRDaGFuZ2VzKSB7XG4gICAgICAgIGZvciAoY29uc3QgZGMgb2YgZWRpdC5kb2N1bWVudENoYW5nZXMgYXMgYW55W10pIHtcbiAgICAgICAgICAgIGlmIChkYz8udGV4dERvY3VtZW50Py51cmkgJiYgQXJyYXkuaXNBcnJheShkYy5lZGl0cykpIHB1c2goZGMudGV4dERvY3VtZW50LnVyaSwgZGMuZWRpdHMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGVkaXRzIH07XG59XG5cbi8qKiBNYXBzIGEgdmlydHVhbCBlZGl0b3IgVVJJIGJhY2sgdG8gdGhlIElERSB3b3Jrc3BhY2UgcGF0aCAoe0Bjb2RlIC93cy9wcm9qLy4uLn0pLiAqL1xuZnVuY3Rpb24gdXJpVG9Xb3Jrc3BhY2VQYXRoKHVyaTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCF1cmkuc3RhcnRzV2l0aChWSVJUVUFMX0ZJTEVfUFJFRklYKSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh1cmkuc3Vic3RyaW5nKFZJUlRVQUxfRklMRV9QUkVGSVgubGVuZ3RoKSk7XG59XG5cbi8qKiBSZWFkcyBhIHdvcmtzcGFjZSBmaWxlJ3MgY3VycmVudCB0ZXh0IG92ZXIgdGhlIElERSBSRVNUIEFQSS4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZldGNoV29ya3NwYWNlRmlsZVRleHQoaWRlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvc2VydmljZXMvaWRlL3dvcmtzcGFjZXMnICsgaWRlUGF0aCwgeyBoZWFkZXJzOiB7ICdYLVJlcXVlc3RlZC1XaXRoJzogJ0ZldGNoJyB9IH0pO1xuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgcmVhZCAke2lkZVBhdGh9IChIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfSlgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTtcbn1cblxuLyoqIEFwcGxpZXMgTFNQIHRleHQgZWRpdHMgdG8gYSBzdHJpbmcuIE9mZnNldHMgYXJlIHJlc29sdmVkIGFnYWluc3QgdGhlIG9yaWdpbmFsIHRleHQgYW5kIGVkaXRzIGFyZVxuICogIGFwcGxpZWQgZnJvbSB0aGUgZW5kIGJhY2t3YXJkcywgc28gZWFybGllciBvZmZzZXRzIHN0YXkgdmFsaWQuICovXG5mdW5jdGlvbiBhcHBseUVkaXRzVG9UZXh0KHRleHQ6IHN0cmluZywgZWRpdHM6IFRleHRFZGl0W10pOiBzdHJpbmcge1xuICAgIGNvbnN0IGxpbmVTdGFydHMgPSBbMF07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICh0ZXh0LmNoYXJDb2RlQXQoaSkgPT09IDEwIC8qIFxcbiAqLykgbGluZVN0YXJ0cy5wdXNoKGkgKyAxKTtcbiAgICB9XG4gICAgY29uc3Qgb2Zmc2V0ID0gKHA6IHsgbGluZTogbnVtYmVyOyBjaGFyYWN0ZXI6IG51bWJlciB9KSA9PiAobGluZVN0YXJ0c1twLmxpbmVdID8/IHRleHQubGVuZ3RoKSArIHAuY2hhcmFjdGVyO1xuICAgIGNvbnN0IG9yZGVyZWQgPSBlZGl0cy5zbGljZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IG9mZnNldChiLnJhbmdlLnN0YXJ0KSAtIG9mZnNldChhLnJhbmdlLnN0YXJ0KSk7XG4gICAgbGV0IHJlc3VsdCA9IHRleHQ7XG4gICAgZm9yIChjb25zdCBlIG9mIG9yZGVyZWQpIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnNsaWNlKDAsIG9mZnNldChlLnJhbmdlLnN0YXJ0KSkgKyBlLm5ld1RleHQgKyByZXN1bHQuc2xpY2Uob2Zmc2V0KGUucmFuZ2UuZW5kKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQXBwbGllcyBhIEpEVC5MUyByZW5hbWUge0BsaW5rIFdvcmtzcGFjZUVkaXR9IGFjcm9zcyB0aGUgd2hvbGUgd29ya3NwYWNlOiB0ZXh0IGVkaXRzIGluIGV2ZXJ5XG4gKiBhZmZlY3RlZCBmaWxlIHBsdXMgYW55IHtAY29kZSBSZW5hbWVGaWxlfSBvcGVyYXRpb24gKGEgcHVibGljLXR5cGUgcmVuYW1lIHJlbmFtZXMgaXRzIG93blxuICoge0Bjb2RlIC5qYXZhfSBmaWxlKS4gVGhlIGN1cnJlbnQgZmlsZSdzIGVkaXRzIGdvIHRocm91Z2ggdGhlIGxpdmUgTW9uYWNvIG1vZGVsOyB0aGUgcmVzdCBhcmUgcmVhZCxcbiAqIGVkaXRlZCBhbmQgd3JpdHRlbiBiYWNrIG92ZXIgUkVTVC4gUGVyc2lzdGVuY2UgKENTUkYtZ3VhcmRlZCB3cml0ZXMsIHRoZSB0YWIgc3dpdGNoIHdoZW4gdGhlIGN1cnJlbnRcbiAqIGZpbGUgaXMgcmVuYW1lZCwgYW5kIHJlbG9hZGluZyBvdGhlciBvcGVuIGVkaXRvcnMpIGlzIGRlbGVnYXRlZCB0byB0aGUgSURFIHZpYSBqYXZhTHNwUGVyc2lzdFJlbmFtZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYXBwbHlSZW5hbWVBY3Jvc3NXb3Jrc3BhY2UobW9kZWw6IG1vbmFjby5lZGl0b3IuSVRleHRNb2RlbCwgZWRpdDogV29ya3NwYWNlRWRpdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGN1cnJlbnRVcmkgPSBtb2RlbC51cmkudG9TdHJpbmcoKTtcbiAgICBjb25zdCB0ZXh0QnlVcmk6IFJlY29yZDxzdHJpbmcsIFRleHRFZGl0W10+ID0ge307XG4gICAgY29uc3QgcmVuYW1lQnlVcmk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgIGlmIChlZGl0LmNoYW5nZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCB1cmkgaW4gZWRpdC5jaGFuZ2VzKSB0ZXh0QnlVcmlbdXJpXSA9ICh0ZXh0QnlVcmlbdXJpXSA/PyBbXSkuY29uY2F0KGVkaXQuY2hhbmdlc1t1cmldKTtcbiAgICB9XG4gICAgaWYgKGVkaXQuZG9jdW1lbnRDaGFuZ2VzKSB7XG4gICAgICAgIGZvciAoY29uc3QgZGMgb2YgZWRpdC5kb2N1bWVudENoYW5nZXMgYXMgYW55W10pIHtcbiAgICAgICAgICAgIGlmIChkYz8ua2luZCA9PT0gJ3JlbmFtZScgJiYgZGMub2xkVXJpICYmIGRjLm5ld1VyaSkge1xuICAgICAgICAgICAgICAgIHJlbmFtZUJ5VXJpW2RjLm9sZFVyaV0gPSBkYy5uZXdVcmk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRjPy50ZXh0RG9jdW1lbnQ/LnVyaSAmJiBBcnJheS5pc0FycmF5KGRjLmVkaXRzKSkge1xuICAgICAgICAgICAgICAgIHRleHRCeVVyaVtkYy50ZXh0RG9jdW1lbnQudXJpXSA9ICh0ZXh0QnlVcmlbZGMudGV4dERvY3VtZW50LnVyaV0gPz8gW10pLmNvbmNhdChkYy5lZGl0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBKRFQuTFMgbWF5IGtleSBhIGZpbGUncyB0ZXh0IGVkaXRzIGJ5IGl0cyBQT1NULXJlbmFtZSBVUkkgKGRvY3VtZW50Q2hhbmdlcyBhcmUgb3JkZXJlZCwgYW5kIHRoZVxuICAgIC8vIHJlbmFtZSBjYW4gcHJlY2VkZSB0aGUgZWRpdCkuIFJlLWF0dHJpYnV0ZSBldmVyeSBlZGl0IHRvIHRoZSBvbi1kaXNrIChvbGQpIFVSSSBzbyB0aGUgY29udGVudCBpc1xuICAgIC8vIGVkaXRlZCBjb3JyZWN0bHkgYmVmb3JlIHRoZSBmaWxlIGlzIHdyaXR0ZW4vcmVuYW1lZCBcdTIwMTQgb3RoZXJ3aXNlIHRoZSBuZXcgZmlsZSBrZWVwcyB0aGUgb2xkIHR5cGVcbiAgICAvLyBuYW1lIGFuZCB0cmlnZ2VycyBcIlRoZSBwdWJsaWMgdHlwZSBYIG11c3QgYmUgZGVmaW5lZCBpbiBpdHMgb3duIGZpbGVcIi5cbiAgICBjb25zdCBuZXdUb09sZDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgIGZvciAoY29uc3Qgb2xkVXJpIGluIHJlbmFtZUJ5VXJpKSBuZXdUb09sZFtyZW5hbWVCeVVyaVtvbGRVcmldXSA9IG9sZFVyaTtcbiAgICBjb25zdCBlZGl0c0J5T2xkOiBSZWNvcmQ8c3RyaW5nLCBUZXh0RWRpdFtdPiA9IHt9O1xuICAgIGZvciAoY29uc3QgdXJpIGluIHRleHRCeVVyaSkge1xuICAgICAgICBjb25zdCBvbkRpc2tVcmkgPSBuZXdUb09sZFt1cmldID8/IHVyaTtcbiAgICAgICAgZWRpdHNCeU9sZFtvbkRpc2tVcmldID0gKGVkaXRzQnlPbGRbb25EaXNrVXJpXSA/PyBbXSkuY29uY2F0KHRleHRCeVVyaVt1cmldKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXlsb2FkOiB7XG4gICAgICAgIGN1cnJlbnRQYXRoOiBzdHJpbmcgfCBudWxsO1xuICAgICAgICBjdXJyZW50Q29udGVudDogc3RyaW5nIHwgbnVsbDtcbiAgICAgICAgY3VycmVudE5ld1BhdGg6IHN0cmluZyB8IG51bGw7XG4gICAgICAgIHdyaXRlczogQXJyYXk8eyBwYXRoOiBzdHJpbmcgfCBudWxsOyBjb250ZW50OiBzdHJpbmcgfT47XG4gICAgICAgIHJlbmFtZXM6IEFycmF5PHsgb2xkUGF0aDogc3RyaW5nIHwgbnVsbDsgbmV3UGF0aDogc3RyaW5nIHwgbnVsbDsgY29udGVudDogc3RyaW5nIH0+O1xuICAgIH0gPSB7IGN1cnJlbnRQYXRoOiB1cmlUb1dvcmtzcGFjZVBhdGgoY3VycmVudFVyaSksIGN1cnJlbnRDb250ZW50OiBudWxsLCBjdXJyZW50TmV3UGF0aDogbnVsbCwgd3JpdGVzOiBbXSwgcmVuYW1lczogW10gfTtcblxuICAgIGNvbnN0IHdhdGNoZWRDaGFuZ2VzOiBBcnJheTx7IHVyaTogc3RyaW5nOyB0eXBlOiBudW1iZXIgfT4gPSBbXTtcbiAgICBjb25zdCBvbGRVcmlzID0gbmV3IFNldDxzdHJpbmc+KFsuLi5PYmplY3Qua2V5cyhlZGl0c0J5T2xkKSwgLi4uT2JqZWN0LmtleXMocmVuYW1lQnlVcmkpXSk7XG4gICAgZm9yIChjb25zdCBvbGRVcmkgb2Ygb2xkVXJpcykge1xuICAgICAgICBjb25zdCBlZGl0cyA9IGVkaXRzQnlPbGRbb2xkVXJpXSA/PyBbXTtcbiAgICAgICAgbGV0IGNvbnRlbnQ6IHN0cmluZztcbiAgICAgICAgaWYgKG9sZFVyaSA9PT0gY3VycmVudFVyaSkge1xuICAgICAgICAgICAgaWYgKGVkaXRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIG1vZGVsLnB1c2hFZGl0T3BlcmF0aW9ucyhbXSwgZWRpdHMubWFwKGUgPT4gKHsgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28oZS5yYW5nZSksIHRleHQ6IGUubmV3VGV4dCwgZm9yY2VNb3ZlTWFya2VyczogdHJ1ZSB9KSksICgpID0+IG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGVudCA9IG1vZGVsLmdldFZhbHVlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBhd2FpdCBmZXRjaFdvcmtzcGFjZUZpbGVUZXh0KHVyaVRvV29ya3NwYWNlUGF0aChvbGRVcmkpID8/IG9sZFVyaSk7XG4gICAgICAgICAgICBjb250ZW50ID0gZWRpdHMubGVuZ3RoID8gYXBwbHlFZGl0c1RvVGV4dChzb3VyY2UsIGVkaXRzKSA6IHNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdVcmkgPSByZW5hbWVCeVVyaVtvbGRVcmldO1xuICAgICAgICBpZiAob2xkVXJpID09PSBjdXJyZW50VXJpKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmN1cnJlbnRDb250ZW50ID0gY29udGVudDtcbiAgICAgICAgICAgIHBheWxvYWQuY3VycmVudE5ld1BhdGggPSBuZXdVcmkgPyB1cmlUb1dvcmtzcGFjZVBhdGgobmV3VXJpKSA6IG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAobmV3VXJpKSB7XG4gICAgICAgICAgICBwYXlsb2FkLnJlbmFtZXMucHVzaCh7IG9sZFBhdGg6IHVyaVRvV29ya3NwYWNlUGF0aChvbGRVcmkpLCBuZXdQYXRoOiB1cmlUb1dvcmtzcGFjZVBhdGgobmV3VXJpKSwgY29udGVudCB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBheWxvYWQud3JpdGVzLnB1c2goeyBwYXRoOiB1cmlUb1dvcmtzcGFjZVBhdGgob2xkVXJpKSwgY29udGVudCB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGaWxlLWNoYW5nZSBldmVudHMgZm9yIEpEVC5MUyBzbyBpdCByZS1zeW5jcyB3aXRob3V0IGEgcGFnZSByZWZyZXNoLlxuICAgICAgICBpZiAobmV3VXJpKSB7XG4gICAgICAgICAgICB3YXRjaGVkQ2hhbmdlcy5wdXNoKHsgdXJpOiBvbGRVcmksIHR5cGU6IDMgLyogRGVsZXRlZCAqLyB9LCB7IHVyaTogbmV3VXJpLCB0eXBlOiAxIC8qIENyZWF0ZWQgKi8gfSk7XG4gICAgICAgICAgICBfb3BlbkZpbGVzLmRlbGV0ZShvbGRVcmkpO1xuICAgICAgICAgICAgX2Nvbm4/LnNlbmROb3RpZmljYXRpb24oJ3RleHREb2N1bWVudC9kaWRDbG9zZScsIHsgdGV4dERvY3VtZW50OiB7IHVyaTogb2xkVXJpIH0gfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3YXRjaGVkQ2hhbmdlcy5wdXNoKHsgdXJpOiBvbGRVcmksIHR5cGU6IDIgLyogQ2hhbmdlZCAqLyB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IChnbG9iYWxUaGlzIGFzIGFueSkuamF2YUxzcFBlcnNpc3RSZW5hbWUocGF5bG9hZCk7XG5cbiAgICAvLyBJbmZvcm0gSkRULkxTIG9mIHRoZSBvbi1kaXNrIGNoYW5nZXMgc28gdGhlIHJlbmFtZWQgdHlwZSdzIGRpYWdub3N0aWNzIGNsZWFyIGltbWVkaWF0ZWx5LlxuICAgIGlmIChfY29ubiAmJiB3YXRjaGVkQ2hhbmdlcy5sZW5ndGgpIHtcbiAgICAgICAgX2Nvbm4uc2VuZE5vdGlmaWNhdGlvbignd29ya3NwYWNlL2RpZENoYW5nZVdhdGNoZWRGaWxlcycsIHsgY2hhbmdlczogd2F0Y2hlZENoYW5nZXMgfSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBqZHRsc1NldHRpbmdzKCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGphdmE6IHtcbiAgICAgICAgICAgIGltcG9ydDoge1xuICAgICAgICAgICAgICAgIG1hdmVuOiAgICAgIHsgZW5hYmxlZDogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIGdyYWRsZTogICAgIHsgZW5hYmxlZDogZmFsc2UgfSxcbiAgICAgICAgICAgICAgICBleGNsdXNpb25zOiBbJyoqL25vZGVfbW9kdWxlcy8qKicsICcqKi8ubWV0YWRhdGEvKionLCAnKiovYXJjaGV0eXBlLXJlc291cmNlcy8qKiddLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGF1dG9idWlsZDogeyBlbmFibGVkOiB0cnVlIH0sXG4gICAgICAgICAgICBjb21wbGV0aW9uOiB7XG4gICAgICAgICAgICAgICAgb3ZlcndyaXRlOiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgZ3Vlc3NNZXRob2RBcmd1bWVudHM6IGZhbHNlLFxuICAgICAgICAgICAgICAgIC8vIENhcCByZXN1bHRzIHNvIGltcG9ydC90eXBlIGNvbXBsZXRpb24gb3ZlciB0aGUgbGFyZ2UgcGxhdGZvcm0gY2xhc3NwYXRoIHN0YXlzIHNuYXBweS5cbiAgICAgICAgICAgICAgICBtYXhSZXN1bHRzOiAgICAgICAgICAgNTAsXG4gICAgICAgICAgICAgICAgZmlsdGVyZWRUeXBlczogW1xuICAgICAgICAgICAgICAgICAgICAnY29tLnN1bi4qJywgJ3N1bi4qJywgJ2pkay4qJyxcbiAgICAgICAgICAgICAgICAgICAgJ29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC4qJyxcbiAgICAgICAgICAgICAgICAgICAgJ29yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuKicsXG4gICAgICAgICAgICAgICAgICAgICdvcmcuZWNsaXBzZS5vc2dpLmludGVybmFsLionLFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgaW1wb3J0T3JkZXI6IFsnamF2YScsICdqYXZheCcsICdvcmcnLCAnY29tJywgJyddLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNpZ25hdHVyZUhlbHA6ICB7IGVuYWJsZWQ6IHRydWUgfSxcbiAgICAgICAgICAgIGZvcm1hdDogICAgICAgICB7IGVuYWJsZWQ6IHRydWUgfSxcbiAgICAgICAgICAgIHNhdmVBY3Rpb25zOiAgICB7IG9yZ2FuaXplSW1wb3J0czogZmFsc2UgfSxcbiAgICAgICAgICAgIGlubGF5SGludHM6ICAgICB7IHBhcmFtZXRlck5hbWVzOiB7IGVuYWJsZWQ6ICdhbGwnIH0gfSxcbiAgICAgICAgICAgIC8vIE9mZiBieSBkZWZhdWx0OiB0aGUgcmVmZXJlbmNlL2ltcGxlbWVudGF0aW9uIHNlYXJjaCBiZWhpbmQgdGhlc2UgQ29kZUxlbnNlcyBydW5zIGZvciBldmVyeVxuICAgICAgICAgICAgLy8gZGVjbGFyYXRpb24gb24gb3BlbiBhbmQgb24gZXZlcnkgZWRpdCBhbmQgZG9taW5hdGVzIEpEVC5MUyBsb2FkIG9uIGEgbGFyZ2UgY2xhc3NwYXRoLlxuICAgICAgICAgICAgcmVmZXJlbmNlc0NvZGVMZW5zOiAgICAgeyBlbmFibGVkOiBmYWxzZSB9LFxuICAgICAgICAgICAgaW1wbGVtZW50YXRpb25zQ29kZUxlbnM6IHsgZW5hYmxlZDogZmFsc2UgfSxcbiAgICAgICAgfSxcbiAgICB9O1xufVxuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjQgVHlwZUZveCBhbmQgb3RoZXJzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTElDRU5TRSBpbiB0aGUgcGFja2FnZSByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbmltcG9ydCB7IERpc3Bvc2FibGUgfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG5cbmV4cG9ydCBjbGFzcyBEaXNwb3NhYmxlQ29sbGVjdGlvbiBpbXBsZW1lbnRzIERpc3Bvc2FibGUge1xuICAgIHByb3RlY3RlZCByZWFkb25seSBkaXNwb3NhYmxlczogRGlzcG9zYWJsZVtdID0gW107XG5cbiAgICBkaXNwb3NlKCk6IHZvaWQge1xuICAgICAgICB3aGlsZSAodGhpcy5kaXNwb3NhYmxlcy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcG9zYWJsZXMucG9wKCkhLmRpc3Bvc2UoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1c2goZGlzcG9zYWJsZTogRGlzcG9zYWJsZSk6IERpc3Bvc2FibGUge1xuICAgICAgICBjb25zdCBkaXNwb3NhYmxlcyA9IHRoaXMuZGlzcG9zYWJsZXM7XG4gICAgICAgIGRpc3Bvc2FibGVzLnB1c2goZGlzcG9zYWJsZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkaXNwb3NlKCk6IHZvaWQge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gZGlzcG9zYWJsZXMuaW5kZXhPZihkaXNwb3NhYmxlKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3Bvc2FibGVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbn1cbiIsICIvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSAyMDI0IFR5cGVGb3ggYW5kIG90aGVycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExJQ0VOU0UgaW4gdGhlIHBhY2thZ2Ugcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5pbXBvcnQgeyBEaXNwb3NhYmxlIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuaW1wb3J0IHR5cGUgeyBJQ29ubmVjdGlvbiB9IGZyb20gJy4uL3NlcnZlci9jb25uZWN0aW9uLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBJV2ViU29ja2V0IGV4dGVuZHMgRGlzcG9zYWJsZSB7XG4gICAgc2VuZChjb250ZW50OiBzdHJpbmcpOiB2b2lkO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgb25NZXNzYWdlKGNiOiAoZGF0YTogYW55KSA9PiB2b2lkKTogdm9pZDtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIG9uRXJyb3IoY2I6IChyZWFzb246IGFueSkgPT4gdm9pZCk6IHZvaWQ7XG4gICAgb25DbG9zZShjYjogKGNvZGU6IG51bWJlciwgcmVhc29uOiBzdHJpbmcpID0+IHZvaWQpOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElXZWJTb2NrZXRDb25uZWN0aW9uIGV4dGVuZHMgSUNvbm5lY3Rpb24ge1xuICAgIHJlYWRvbmx5IHNvY2tldDogSVdlYlNvY2tldDtcbn1cbiIsICIvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSAyMDI0IFR5cGVGb3ggYW5kIG90aGVycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExJQ0VOU0UgaW4gdGhlIHBhY2thZ2Ugcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5pbXBvcnQgeyBEaXNwb3NhYmxlIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuLy8gVE9ETzogVXNlIGVudmlyb25tZW50LXNwZWNpZmljIGltcG9ydHMgKHZzY29kZS1qc29ucnBjL2Jyb3dzZXIgb3IgdnNjb2RlLWpzb25ycGMvbm9kZSlcbi8vIHdoZW4gdXBncmFkaW5nIHRvIHZzY29kZS1qc29ucnBjQDkueC54LW5leHQuWCB3aGljaCBzdXBwb3J0cyBwcm9wZXIgZXhwb3J0IG1hcHNcbmltcG9ydCB7IHR5cGUgRGF0YUNhbGxiYWNrLCBBYnN0cmFjdE1lc3NhZ2VSZWFkZXIsIE1lc3NhZ2VSZWFkZXIgfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG5pbXBvcnQgdHlwZSB7IElXZWJTb2NrZXQgfSBmcm9tICcuL3NvY2tldC5qcyc7XG5cbmV4cG9ydCBjbGFzcyBXZWJTb2NrZXRNZXNzYWdlUmVhZGVyIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlUmVhZGVyIGltcGxlbWVudHMgTWVzc2FnZVJlYWRlciB7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHNvY2tldDogSVdlYlNvY2tldDtcbiAgICBwcm90ZWN0ZWQgc3RhdGU6ICdpbml0aWFsJyB8ICdsaXN0ZW5pbmcnIHwgJ2Nsb3NlZCcgPSAnaW5pdGlhbCc7XG4gICAgcHJvdGVjdGVkIGNhbGxiYWNrOiBEYXRhQ2FsbGJhY2sgfCB1bmRlZmluZWQ7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZXZlbnRzOiBBcnJheTx7IG1lc3NhZ2U/OiBhbnksIGVycm9yPzogYW55IH0+ID0gW107XG5cbiAgICBjb25zdHJ1Y3Rvcihzb2NrZXQ6IElXZWJTb2NrZXQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7XG4gICAgICAgIHRoaXMuc29ja2V0Lm9uTWVzc2FnZShtZXNzYWdlID0+XG4gICAgICAgICAgICB0aGlzLnJlYWRNZXNzYWdlKG1lc3NhZ2UpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc29ja2V0Lm9uRXJyb3IoZXJyb3IgPT5cbiAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLnNvY2tldC5vbkNsb3NlKChjb2RlLCByZWFzb24pID0+IHtcbiAgICAgICAgICAgIGlmIChjb2RlICE9PSAxMDAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3I6IEVycm9yID0ge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnJyArIGNvZGUsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBFcnJvciBkdXJpbmcgc29ja2V0IHJlY29ubmVjdDogY29kZSA9ICR7Y29kZX0sIHJlYXNvbiA9ICR7cmVhc29ufWBcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZmlyZUNsb3NlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGxpc3RlbihjYWxsYmFjazogRGF0YUNhbGxiYWNrKTogRGlzcG9zYWJsZSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09PSAnaW5pdGlhbCcpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSAnbGlzdGVuaW5nJztcbiAgICAgICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgICAgICAgIHdoaWxlICh0aGlzLmV2ZW50cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBldmVudCA9IHRoaXMuZXZlbnRzLnBvcCgpITtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQubWVzc2FnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVhZE1lc3NhZ2UoZXZlbnQubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5lcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGV2ZW50LmVycm9yKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmVDbG9zZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhbGxiYWNrID09PSBjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gJ2luaXRpYWwnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbGxiYWNrID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBkaXNwb3NlKCkge1xuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSAnaW5pdGlhbCc7XG4gICAgICAgIHRoaXMuY2FsbGJhY2sgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuZXZlbnRzLnNwbGljZSgwLCB0aGlzLmV2ZW50cy5sZW5ndGgpO1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgcHJvdGVjdGVkIHJlYWRNZXNzYWdlKG1lc3NhZ2U6IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gJ2luaXRpYWwnKSB7XG4gICAgICAgICAgICB0aGlzLmV2ZW50cy5zcGxpY2UoMCwgMCwgeyBtZXNzYWdlIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUgPT09ICdsaXN0ZW5pbmcnKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2FsbGJhY2shKGRhdGEpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3I6IEVycm9yID0ge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnJyArIDQwMCxcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYEVycm9yIGR1cmluZyBtZXNzYWdlIHBhcnNpbmcsIHJlYXNvbiA9ICR7dHlwZW9mIGVyciA9PT0gJ29iamVjdCcgPyAoZXJyIGFzIGFueSkubWVzc2FnZSA6ICd1bmtub3duJ31gXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmVFcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBmaXJlRXJyb3IoZXJyb3I6IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gJ2luaXRpYWwnKSB7XG4gICAgICAgICAgICB0aGlzLmV2ZW50cy5zcGxpY2UoMCwgMCwgeyBlcnJvciB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlID09PSAnbGlzdGVuaW5nJykge1xuICAgICAgICAgICAgc3VwZXIuZmlyZUVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBmaXJlQ2xvc2UoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09PSAnaW5pdGlhbCcpIHtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRzLnNwbGljZSgwLCAwLCB7fSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZSA9PT0gJ2xpc3RlbmluZycpIHtcbiAgICAgICAgICAgIHN1cGVyLmZpcmVDbG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhdGUgPSAnY2xvc2VkJztcbiAgICB9XG59XG4iLCAiLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgMjAyNCBUeXBlRm94IGFuZCBvdGhlcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMSUNFTlNFIGluIHRoZSBwYWNrYWdlIHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuaW1wb3J0IHsgTWVzc2FnZSB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcbmltcG9ydCB7IEFic3RyYWN0TWVzc2FnZVdyaXRlciwgTWVzc2FnZVdyaXRlciB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcbmltcG9ydCB0eXBlIHsgSVdlYlNvY2tldCB9IGZyb20gJy4vc29ja2V0LmpzJztcblxuZXhwb3J0IGNsYXNzIFdlYlNvY2tldE1lc3NhZ2VXcml0ZXIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VXcml0ZXIgaW1wbGVtZW50cyBNZXNzYWdlV3JpdGVyIHtcbiAgICBwcm90ZWN0ZWQgZXJyb3JDb3VudCA9IDA7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHNvY2tldDogSVdlYlNvY2tldDtcblxuICAgIGNvbnN0cnVjdG9yKHNvY2tldDogSVdlYlNvY2tldCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnNvY2tldCA9IHNvY2tldDtcbiAgICB9XG5cbiAgICBlbmQoKTogdm9pZCB7XG4gICAgfVxuXG4gICAgYXN5bmMgd3JpdGUobXNnOiBNZXNzYWdlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobXNnKTtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0LnNlbmQoY29udGVudCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMuZXJyb3JDb3VudCsrO1xuICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZSwgbXNnLCB0aGlzLmVycm9yQ291bnQpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjQgVHlwZUZveCBhbmQgb3RoZXJzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTElDRU5TRSBpbiB0aGUgcGFja2FnZSByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbmltcG9ydCB0eXBlIHsgTWVzc2FnZUNvbm5lY3Rpb24sIExvZ2dlciB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcbmltcG9ydCB7IGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuaW1wb3J0IHR5cGUgeyBJV2ViU29ja2V0IH0gZnJvbSAnLi9zb2NrZXQuanMnO1xuaW1wb3J0IHsgV2ViU29ja2V0TWVzc2FnZVJlYWRlciB9IGZyb20gJy4vcmVhZGVyLmpzJztcbmltcG9ydCB7IFdlYlNvY2tldE1lc3NhZ2VXcml0ZXIgfSBmcm9tICcuL3dyaXRlci5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVXZWJTb2NrZXRDb25uZWN0aW9uKHNvY2tldDogSVdlYlNvY2tldCwgbG9nZ2VyOiBMb2dnZXIpOiBNZXNzYWdlQ29ubmVjdGlvbiB7XG4gICAgY29uc3QgbWVzc2FnZVJlYWRlciA9IG5ldyBXZWJTb2NrZXRNZXNzYWdlUmVhZGVyKHNvY2tldCk7XG4gICAgY29uc3QgbWVzc2FnZVdyaXRlciA9IG5ldyBXZWJTb2NrZXRNZXNzYWdlV3JpdGVyKHNvY2tldCk7XG4gICAgY29uc3QgY29ubmVjdGlvbiA9IGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uKG1lc3NhZ2VSZWFkZXIsIG1lc3NhZ2VXcml0ZXIsIGxvZ2dlcik7XG4gICAgY29ubmVjdGlvbi5vbkNsb3NlKCgpID0+IGNvbm5lY3Rpb24uZGlzcG9zZSgpKTtcbiAgICByZXR1cm4gY29ubmVjdGlvbjtcbn1cbiIsICIvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSAyMDI0IFR5cGVGb3ggYW5kIG90aGVycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExJQ0VOU0UgaW4gdGhlIHBhY2thZ2Ugcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5pbXBvcnQgdHlwZSB7IE1lc3NhZ2VDb25uZWN0aW9uLCBMb2dnZXIgfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG5pbXBvcnQgeyBjcmVhdGVXZWJTb2NrZXRDb25uZWN0aW9uIH0gZnJvbSAnLi9zb2NrZXQvY29ubmVjdGlvbi5qcyc7XG5pbXBvcnQgdHlwZSB7IElXZWJTb2NrZXQgfSBmcm9tICcuL3NvY2tldC9zb2NrZXQuanMnO1xuaW1wb3J0IHsgQ29uc29sZUxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGxpc3RlbihvcHRpb25zOiB7XG4gICAgd2ViU29ja2V0OiBXZWJTb2NrZXQ7XG4gICAgbG9nZ2VyPzogTG9nZ2VyO1xuICAgIG9uQ29ubmVjdGlvbjogKGNvbm5lY3Rpb246IE1lc3NhZ2VDb25uZWN0aW9uKSA9PiB2b2lkO1xufSkge1xuICAgIGNvbnN0IHsgd2ViU29ja2V0LCBvbkNvbm5lY3Rpb24gfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgbG9nZ2VyID0gb3B0aW9ucy5sb2dnZXIgfHwgbmV3IENvbnNvbGVMb2dnZXIoKTtcbiAgICB3ZWJTb2NrZXQub25vcGVuID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBzb2NrZXQgPSB0b1NvY2tldCh3ZWJTb2NrZXQpO1xuICAgICAgICBjb25zdCBjb25uZWN0aW9uID0gY3JlYXRlV2ViU29ja2V0Q29ubmVjdGlvbihzb2NrZXQsIGxvZ2dlcik7XG4gICAgICAgIG9uQ29ubmVjdGlvbihjb25uZWN0aW9uKTtcbiAgICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9Tb2NrZXQod2ViU29ja2V0OiBXZWJTb2NrZXQpOiBJV2ViU29ja2V0IHtcbiAgICByZXR1cm4ge1xuICAgICAgICBzZW5kOiBjb250ZW50ID0+IHdlYlNvY2tldC5zZW5kKGNvbnRlbnQpLFxuICAgICAgICBvbk1lc3NhZ2U6IGNiID0+IHtcbiAgICAgICAgICAgIHdlYlNvY2tldC5vbm1lc3NhZ2UgPSBldmVudCA9PiBjYihldmVudC5kYXRhKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25FcnJvcjogY2IgPT4ge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgIHdlYlNvY2tldC5vbmVycm9yID0gKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0Lmhhc093bihldmVudCwgJ21lc3NhZ2UnKSkge1xuICAgICAgICAgICAgICAgICAgICBjYihldmVudC5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBvbkNsb3NlOiBjYiA9PiB7XG4gICAgICAgICAgICB3ZWJTb2NrZXQub25jbG9zZSA9IGV2ZW50ID0+IGNiKGV2ZW50LmNvZGUsIGV2ZW50LnJlYXNvbik7XG4gICAgICAgIH0sXG4gICAgICAgIGRpc3Bvc2U6ICgpID0+IHdlYlNvY2tldC5jbG9zZSgpXG4gICAgfTtcbn1cbiIsICIvKlxuICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMjYgRWNsaXBzZSBEaXJpZ2libGUgY29udHJpYnV0b3JzXG4gKlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlXG4gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2Mi4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG4gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MjAuaHRtbFxuICpcbiAqIFNQRFgtRmlsZUNvcHlyaWdodFRleHQ6IEVjbGlwc2UgRGlyaWdpYmxlIGNvbnRyaWJ1dG9ycyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbi8qKlxuICogTGF6eSBQcm94eSBzaGltIGZvciBNb25hY28gRWRpdG9yIGxvYWRlZCB2aWEgQU1ELlxuICpcbiAqIGVkaXRvci5qcyBzZXRzIGdsb2JhbFRoaXMubW9uYWNvIGluc2lkZSB0aGUgQU1EIHJlcXVpcmUoKSBjYWxsYmFjaywgYmVmb3JlIGFueVxuICogSmF2YUxzcENsaWVudExpYi5jb25uZWN0KCkgY2FsbC4gQWxsIHByb3BlcnR5IGFjY2Vzc2VzIGdvIHRocm91Z2ggUHJveHkuZ2V0KCkgdHJhcHNcbiAqIHNvIHRoZXkgcmVzb2x2ZSBhZ2FpbnN0IHRoZSBsaXZlIHdpbmRvdy5tb25hY28gYXQgY2FsbCB0aW1lLCBub3QgYXQgYnVuZGxlIGxvYWQgdGltZS5cbiAqXG4gKiBUeXBlU2NyaXB0IHJlc29sdmVzIHR5cGVzIGZyb20gdGhlIHJlYWwgbW9uYWNvLWVkaXRvciBkZXZEZXBlbmRlbmN5OyBlc2J1aWxkIHJlcGxhY2VzXG4gKiB0aGUgXCJtb25hY28tZWRpdG9yXCIgaW1wb3J0IHdpdGggdGhpcyBmaWxlIGF0IGJ1bmRsZSB0aW1lIHZpYSB0aGUgYWxpYXMgb3B0aW9uLlxuICovXG5cbnR5cGUgTSA9IHR5cGVvZiBpbXBvcnQoJ21vbmFjby1lZGl0b3InKTtcblxuZnVuY3Rpb24gbSgpOiBNIHtcbiAgICByZXR1cm4gKGdsb2JhbFRoaXMgYXMgYW55KS5tb25hY28gYXMgTTtcbn1cblxuZnVuY3Rpb24gbnM8VCBleHRlbmRzIG9iamVjdD4oZ2V0dGVyOiAoKSA9PiBUKTogVCB7XG4gICAgcmV0dXJuIG5ldyBQcm94eSh7fSBhcyBULCB7XG4gICAgICAgIGdldDogKF8sIGspID0+IChnZXR0ZXIoKSBhcyBhbnkpW2sgYXMgc3RyaW5nXSxcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gY2xzPFQ+KGdldHRlcjogKCkgPT4gVCk6IFQge1xuICAgIHJldHVybiBuZXcgUHJveHkoZnVuY3Rpb24gKCkge30gYXMgYW55LCB7XG4gICAgICAgIGNvbnN0cnVjdDogKF8sIGFyZ3MpID0+IG5ldyAoZ2V0dGVyKCkgYXMgYW55KSguLi5hcmdzKSxcbiAgICAgICAgZ2V0OiAgICAgICAoXywgaykgICAgPT4gKGdldHRlcigpIGFzIGFueSlbayBhcyBzdHJpbmddLFxuICAgIH0pIGFzIFQ7XG59XG5cbmV4cG9ydCBjb25zdCBlZGl0b3IgICAgICAgICA9IG5zKCgpID0+IG0oKS5lZGl0b3IpO1xuZXhwb3J0IGNvbnN0IGxhbmd1YWdlcyAgICAgID0gbnMoKCkgPT4gbSgpLmxhbmd1YWdlcyk7XG5leHBvcnQgY29uc3QgTWFya2VyU2V2ZXJpdHkgPSBucygoKSA9PiBtKCkuTWFya2VyU2V2ZXJpdHkpO1xuZXhwb3J0IGNvbnN0IE1hcmtlclRhZyAgICAgID0gbnMoKCkgPT4gKG0oKSBhcyBhbnkpLk1hcmtlclRhZyk7XG5leHBvcnQgY29uc3QgVXJpICAgICAgICAgICAgPSBjbHMoKCkgPT4gbSgpLlVyaSk7XG5leHBvcnQgY29uc3QgUmFuZ2UgICAgICAgICAgPSBjbHMoKCkgPT4gbSgpLlJhbmdlKTtcbmV4cG9ydCBjb25zdCBQb3NpdGlvbiAgICAgICA9IGNscygoKSA9PiBtKCkuUG9zaXRpb24pO1xuZXhwb3J0IGNvbnN0IFNlbGVjdGlvbiAgICAgID0gY2xzKCgpID0+IG0oKS5TZWxlY3Rpb24pO1xuZXhwb3J0IGNvbnN0IEtleUNvZGUgICAgICAgID0gbnMoKCkgPT4gbSgpLktleUNvZGUpO1xuZXhwb3J0IGNvbnN0IEtleU1vZCAgICAgICAgID0gbnMoKCkgPT4gbSgpLktleU1vZCk7XG4iLCAiLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuJ3VzZSBzdHJpY3QnO1xuZXhwb3J0IHZhciBEb2N1bWVudFVyaTtcbihmdW5jdGlvbiAoRG9jdW1lbnRVcmkpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJztcbiAgICB9XG4gICAgRG9jdW1lbnRVcmkuaXMgPSBpcztcbn0pKERvY3VtZW50VXJpIHx8IChEb2N1bWVudFVyaSA9IHt9KSk7XG5leHBvcnQgdmFyIFVSSTtcbihmdW5jdGlvbiAoVVJJKSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZyc7XG4gICAgfVxuICAgIFVSSS5pcyA9IGlzO1xufSkoVVJJIHx8IChVUkkgPSB7fSkpO1xuZXhwb3J0IHZhciBpbnRlZ2VyO1xuKGZ1bmN0aW9uIChpbnRlZ2VyKSB7XG4gICAgaW50ZWdlci5NSU5fVkFMVUUgPSAtMjE0NzQ4MzY0ODtcbiAgICBpbnRlZ2VyLk1BWF9WQUxVRSA9IDIxNDc0ODM2NDc7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgaW50ZWdlci5NSU5fVkFMVUUgPD0gdmFsdWUgJiYgdmFsdWUgPD0gaW50ZWdlci5NQVhfVkFMVUU7XG4gICAgfVxuICAgIGludGVnZXIuaXMgPSBpcztcbn0pKGludGVnZXIgfHwgKGludGVnZXIgPSB7fSkpO1xuZXhwb3J0IHZhciB1aW50ZWdlcjtcbihmdW5jdGlvbiAodWludGVnZXIpIHtcbiAgICB1aW50ZWdlci5NSU5fVkFMVUUgPSAwO1xuICAgIHVpbnRlZ2VyLk1BWF9WQUxVRSA9IDIxNDc0ODM2NDc7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgdWludGVnZXIuTUlOX1ZBTFVFIDw9IHZhbHVlICYmIHZhbHVlIDw9IHVpbnRlZ2VyLk1BWF9WQUxVRTtcbiAgICB9XG4gICAgdWludGVnZXIuaXMgPSBpcztcbn0pKHVpbnRlZ2VyIHx8ICh1aW50ZWdlciA9IHt9KSk7XG4vKipcbiAqIFRoZSBQb3NpdGlvbiBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBQb3NpdGlvbn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgUG9zaXRpb247XG4oZnVuY3Rpb24gKFBvc2l0aW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBQb3NpdGlvbiBsaXRlcmFsIGZyb20gdGhlIGdpdmVuIGxpbmUgYW5kIGNoYXJhY3Rlci5cbiAgICAgKiBAcGFyYW0gbGluZSBUaGUgcG9zaXRpb24ncyBsaW5lLlxuICAgICAqIEBwYXJhbSBjaGFyYWN0ZXIgVGhlIHBvc2l0aW9uJ3MgY2hhcmFjdGVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShsaW5lLCBjaGFyYWN0ZXIpIHtcbiAgICAgICAgaWYgKGxpbmUgPT09IE51bWJlci5NQVhfVkFMVUUpIHtcbiAgICAgICAgICAgIGxpbmUgPSB1aW50ZWdlci5NQVhfVkFMVUU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYXJhY3RlciA9PT0gTnVtYmVyLk1BWF9WQUxVRSkge1xuICAgICAgICAgICAgY2hhcmFjdGVyID0gdWludGVnZXIuTUFYX1ZBTFVFO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGxpbmUsIGNoYXJhY3RlciB9O1xuICAgIH1cbiAgICBQb3NpdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBQb3NpdGlvbn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBJcy51aW50ZWdlcihjYW5kaWRhdGUubGluZSkgJiYgSXMudWludGVnZXIoY2FuZGlkYXRlLmNoYXJhY3Rlcik7XG4gICAgfVxuICAgIFBvc2l0aW9uLmlzID0gaXM7XG59KShQb3NpdGlvbiB8fCAoUG9zaXRpb24gPSB7fSkpO1xuLyoqXG4gKiBUaGUgUmFuZ2UgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgUmFuZ2V9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIFJhbmdlO1xuKGZ1bmN0aW9uIChSYW5nZSkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShvbmUsIHR3bywgdGhyZWUsIGZvdXIpIHtcbiAgICAgICAgaWYgKElzLnVpbnRlZ2VyKG9uZSkgJiYgSXMudWludGVnZXIodHdvKSAmJiBJcy51aW50ZWdlcih0aHJlZSkgJiYgSXMudWludGVnZXIoZm91cikpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHN0YXJ0OiBQb3NpdGlvbi5jcmVhdGUob25lLCB0d28pLCBlbmQ6IFBvc2l0aW9uLmNyZWF0ZSh0aHJlZSwgZm91cikgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChQb3NpdGlvbi5pcyhvbmUpICYmIFBvc2l0aW9uLmlzKHR3bykpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHN0YXJ0OiBvbmUsIGVuZDogdHdvIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJhbmdlI2NyZWF0ZSBjYWxsZWQgd2l0aCBpbnZhbGlkIGFyZ3VtZW50c1ske29uZX0sICR7dHdvfSwgJHt0aHJlZX0sICR7Zm91cn1dYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgUmFuZ2UuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgUmFuZ2V9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgUG9zaXRpb24uaXMoY2FuZGlkYXRlLnN0YXJ0KSAmJiBQb3NpdGlvbi5pcyhjYW5kaWRhdGUuZW5kKTtcbiAgICB9XG4gICAgUmFuZ2UuaXMgPSBpcztcbn0pKFJhbmdlIHx8IChSYW5nZSA9IHt9KSk7XG4vKipcbiAqIFRoZSBMb2NhdGlvbiBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBMb2NhdGlvbn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgTG9jYXRpb247XG4oZnVuY3Rpb24gKExvY2F0aW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIExvY2F0aW9uIGxpdGVyYWwuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgbG9jYXRpb24ncyB1cmkuXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSBsb2NhdGlvbidzIHJhbmdlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmksIHJhbmdlKSB7XG4gICAgICAgIHJldHVybiB7IHVyaSwgcmFuZ2UgfTtcbiAgICB9XG4gICAgTG9jYXRpb24uY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgTG9jYXRpb259IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiAoSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpIHx8IElzLnVuZGVmaW5lZChjYW5kaWRhdGUudXJpKSk7XG4gICAgfVxuICAgIExvY2F0aW9uLmlzID0gaXM7XG59KShMb2NhdGlvbiB8fCAoTG9jYXRpb24gPSB7fSkpO1xuLyoqXG4gKiBUaGUgTG9jYXRpb25MaW5rIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIExvY2F0aW9uTGlua30gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgTG9jYXRpb25MaW5rO1xuKGZ1bmN0aW9uIChMb2NhdGlvbkxpbmspIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgTG9jYXRpb25MaW5rIGxpdGVyYWwuXG4gICAgICogQHBhcmFtIHRhcmdldFVyaSBUaGUgZGVmaW5pdGlvbidzIHVyaS5cbiAgICAgKiBAcGFyYW0gdGFyZ2V0UmFuZ2UgVGhlIGZ1bGwgcmFuZ2Ugb2YgdGhlIGRlZmluaXRpb24uXG4gICAgICogQHBhcmFtIHRhcmdldFNlbGVjdGlvblJhbmdlIFRoZSBzcGFuIG9mIHRoZSBzeW1ib2wgZGVmaW5pdGlvbiBhdCB0aGUgdGFyZ2V0LlxuICAgICAqIEBwYXJhbSBvcmlnaW5TZWxlY3Rpb25SYW5nZSBUaGUgc3BhbiBvZiB0aGUgc3ltYm9sIGJlaW5nIGRlZmluZWQgaW4gdGhlIG9yaWdpbmF0aW5nIHNvdXJjZSBmaWxlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh0YXJnZXRVcmksIHRhcmdldFJhbmdlLCB0YXJnZXRTZWxlY3Rpb25SYW5nZSwgb3JpZ2luU2VsZWN0aW9uUmFuZ2UpIHtcbiAgICAgICAgcmV0dXJuIHsgdGFyZ2V0VXJpLCB0YXJnZXRSYW5nZSwgdGFyZ2V0U2VsZWN0aW9uUmFuZ2UsIG9yaWdpblNlbGVjdGlvblJhbmdlIH07XG4gICAgfVxuICAgIExvY2F0aW9uTGluay5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBMb2NhdGlvbkxpbmt9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnRhcmdldFJhbmdlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnRhcmdldFVyaSlcbiAgICAgICAgICAgICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS50YXJnZXRTZWxlY3Rpb25SYW5nZSlcbiAgICAgICAgICAgICYmIChSYW5nZS5pcyhjYW5kaWRhdGUub3JpZ2luU2VsZWN0aW9uUmFuZ2UpIHx8IElzLnVuZGVmaW5lZChjYW5kaWRhdGUub3JpZ2luU2VsZWN0aW9uUmFuZ2UpKTtcbiAgICB9XG4gICAgTG9jYXRpb25MaW5rLmlzID0gaXM7XG59KShMb2NhdGlvbkxpbmsgfHwgKExvY2F0aW9uTGluayA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb2xvciBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBDb2xvcn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgQ29sb3I7XG4oZnVuY3Rpb24gKENvbG9yKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDb2xvciBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmVkLFxuICAgICAgICAgICAgZ3JlZW4sXG4gICAgICAgICAgICBibHVlLFxuICAgICAgICAgICAgYWxwaGEsXG4gICAgICAgIH07XG4gICAgfVxuICAgIENvbG9yLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIENvbG9yfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgSXMubnVtYmVyUmFuZ2UoY2FuZGlkYXRlLnJlZCwgMCwgMSlcbiAgICAgICAgICAgICYmIElzLm51bWJlclJhbmdlKGNhbmRpZGF0ZS5ncmVlbiwgMCwgMSlcbiAgICAgICAgICAgICYmIElzLm51bWJlclJhbmdlKGNhbmRpZGF0ZS5ibHVlLCAwLCAxKVxuICAgICAgICAgICAgJiYgSXMubnVtYmVyUmFuZ2UoY2FuZGlkYXRlLmFscGhhLCAwLCAxKTtcbiAgICB9XG4gICAgQ29sb3IuaXMgPSBpcztcbn0pKENvbG9yIHx8IChDb2xvciA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb2xvckluZm9ybWF0aW9uIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIENvbG9ySW5mb3JtYXRpb259IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIENvbG9ySW5mb3JtYXRpb247XG4oZnVuY3Rpb24gKENvbG9ySW5mb3JtYXRpb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENvbG9ySW5mb3JtYXRpb24gbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIGNvbG9yKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByYW5nZSxcbiAgICAgICAgICAgIGNvbG9yLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBDb2xvckluZm9ybWF0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIENvbG9ySW5mb3JtYXRpb259IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIENvbG9yLmlzKGNhbmRpZGF0ZS5jb2xvcik7XG4gICAgfVxuICAgIENvbG9ySW5mb3JtYXRpb24uaXMgPSBpcztcbn0pKENvbG9ySW5mb3JtYXRpb24gfHwgKENvbG9ySW5mb3JtYXRpb24gPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29sb3IgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgQ29sb3JQcmVzZW50YXRpb259IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIENvbG9yUHJlc2VudGF0aW9uO1xuKGZ1bmN0aW9uIChDb2xvclByZXNlbnRhdGlvbikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ29sb3JJbmZvcm1hdGlvbiBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShsYWJlbCwgdGV4dEVkaXQsIGFkZGl0aW9uYWxUZXh0RWRpdHMpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgICAgdGV4dEVkaXQsXG4gICAgICAgICAgICBhZGRpdGlvbmFsVGV4dEVkaXRzLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBDb2xvclByZXNlbnRhdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBDb2xvckluZm9ybWF0aW9ufSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5sYWJlbClcbiAgICAgICAgICAgICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLnRleHRFZGl0KSB8fCBUZXh0RWRpdC5pcyhjYW5kaWRhdGUpKVxuICAgICAgICAgICAgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUuYWRkaXRpb25hbFRleHRFZGl0cykgfHwgSXMudHlwZWRBcnJheShjYW5kaWRhdGUuYWRkaXRpb25hbFRleHRFZGl0cywgVGV4dEVkaXQuaXMpKTtcbiAgICB9XG4gICAgQ29sb3JQcmVzZW50YXRpb24uaXMgPSBpcztcbn0pKENvbG9yUHJlc2VudGF0aW9uIHx8IChDb2xvclByZXNlbnRhdGlvbiA9IHt9KSk7XG4vKipcbiAqIEEgc2V0IG9mIHByZWRlZmluZWQgcmFuZ2Uga2luZHMuXG4gKi9cbmV4cG9ydCB2YXIgRm9sZGluZ1JhbmdlS2luZDtcbihmdW5jdGlvbiAoRm9sZGluZ1JhbmdlS2luZCkge1xuICAgIC8qKlxuICAgICAqIEZvbGRpbmcgcmFuZ2UgZm9yIGEgY29tbWVudFxuICAgICAqL1xuICAgIEZvbGRpbmdSYW5nZUtpbmQuQ29tbWVudCA9ICdjb21tZW50JztcbiAgICAvKipcbiAgICAgKiBGb2xkaW5nIHJhbmdlIGZvciBhbiBpbXBvcnQgb3IgaW5jbHVkZVxuICAgICAqL1xuICAgIEZvbGRpbmdSYW5nZUtpbmQuSW1wb3J0cyA9ICdpbXBvcnRzJztcbiAgICAvKipcbiAgICAgKiBGb2xkaW5nIHJhbmdlIGZvciBhIHJlZ2lvbiAoZS5nLiBgI3JlZ2lvbmApXG4gICAgICovXG4gICAgRm9sZGluZ1JhbmdlS2luZC5SZWdpb24gPSAncmVnaW9uJztcbn0pKEZvbGRpbmdSYW5nZUtpbmQgfHwgKEZvbGRpbmdSYW5nZUtpbmQgPSB7fSkpO1xuLyoqXG4gKiBUaGUgZm9sZGluZyByYW5nZSBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBGb2xkaW5nUmFuZ2V9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIEZvbGRpbmdSYW5nZTtcbihmdW5jdGlvbiAoRm9sZGluZ1JhbmdlKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBGb2xkaW5nUmFuZ2UgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUoc3RhcnRMaW5lLCBlbmRMaW5lLCBzdGFydENoYXJhY3RlciwgZW5kQ2hhcmFjdGVyLCBraW5kLCBjb2xsYXBzZWRUZXh0KSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIHN0YXJ0TGluZSxcbiAgICAgICAgICAgIGVuZExpbmVcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKElzLmRlZmluZWQoc3RhcnRDaGFyYWN0ZXIpKSB7XG4gICAgICAgICAgICByZXN1bHQuc3RhcnRDaGFyYWN0ZXIgPSBzdGFydENoYXJhY3RlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXMuZGVmaW5lZChlbmRDaGFyYWN0ZXIpKSB7XG4gICAgICAgICAgICByZXN1bHQuZW5kQ2hhcmFjdGVyID0gZW5kQ2hhcmFjdGVyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKGtpbmQpKSB7XG4gICAgICAgICAgICByZXN1bHQua2luZCA9IGtpbmQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzLmRlZmluZWQoY29sbGFwc2VkVGV4dCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5jb2xsYXBzZWRUZXh0ID0gY29sbGFwc2VkVGV4dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBGb2xkaW5nUmFuZ2UuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgRm9sZGluZ1JhbmdlfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgSXMudWludGVnZXIoY2FuZGlkYXRlLnN0YXJ0TGluZSkgJiYgSXMudWludGVnZXIoY2FuZGlkYXRlLnN0YXJ0TGluZSlcbiAgICAgICAgICAgICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLnN0YXJ0Q2hhcmFjdGVyKSB8fCBJcy51aW50ZWdlcihjYW5kaWRhdGUuc3RhcnRDaGFyYWN0ZXIpKVxuICAgICAgICAgICAgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUuZW5kQ2hhcmFjdGVyKSB8fCBJcy51aW50ZWdlcihjYW5kaWRhdGUuZW5kQ2hhcmFjdGVyKSlcbiAgICAgICAgICAgICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLmtpbmQpIHx8IElzLnN0cmluZyhjYW5kaWRhdGUua2luZCkpO1xuICAgIH1cbiAgICBGb2xkaW5nUmFuZ2UuaXMgPSBpcztcbn0pKEZvbGRpbmdSYW5nZSB8fCAoRm9sZGluZ1JhbmdlID0ge30pKTtcbi8qKlxuICogVGhlIERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24gbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbjtcbihmdW5jdGlvbiAoRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbiBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShsb2NhdGlvbiwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbG9jYXRpb24sXG4gICAgICAgICAgICBtZXNzYWdlXG4gICAgICAgIH07XG4gICAgfVxuICAgIERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24uY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBMb2NhdGlvbi5pcyhjYW5kaWRhdGUubG9jYXRpb24pICYmIElzLnN0cmluZyhjYW5kaWRhdGUubWVzc2FnZSk7XG4gICAgfVxuICAgIERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24uaXMgPSBpcztcbn0pKERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24gfHwgKERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24gPSB7fSkpO1xuLyoqXG4gKiBUaGUgZGlhZ25vc3RpYydzIHNldmVyaXR5LlxuICovXG5leHBvcnQgdmFyIERpYWdub3N0aWNTZXZlcml0eTtcbihmdW5jdGlvbiAoRGlhZ25vc3RpY1NldmVyaXR5KSB7XG4gICAgLyoqXG4gICAgICogUmVwb3J0cyBhbiBlcnJvci5cbiAgICAgKi9cbiAgICBEaWFnbm9zdGljU2V2ZXJpdHkuRXJyb3IgPSAxO1xuICAgIC8qKlxuICAgICAqIFJlcG9ydHMgYSB3YXJuaW5nLlxuICAgICAqL1xuICAgIERpYWdub3N0aWNTZXZlcml0eS5XYXJuaW5nID0gMjtcbiAgICAvKipcbiAgICAgKiBSZXBvcnRzIGFuIGluZm9ybWF0aW9uLlxuICAgICAqL1xuICAgIERpYWdub3N0aWNTZXZlcml0eS5JbmZvcm1hdGlvbiA9IDM7XG4gICAgLyoqXG4gICAgICogUmVwb3J0cyBhIGhpbnQuXG4gICAgICovXG4gICAgRGlhZ25vc3RpY1NldmVyaXR5LkhpbnQgPSA0O1xufSkoRGlhZ25vc3RpY1NldmVyaXR5IHx8IChEaWFnbm9zdGljU2V2ZXJpdHkgPSB7fSkpO1xuLyoqXG4gKiBUaGUgZGlhZ25vc3RpYyB0YWdzLlxuICpcbiAqIEBzaW5jZSAzLjE1LjBcbiAqL1xuZXhwb3J0IHZhciBEaWFnbm9zdGljVGFnO1xuKGZ1bmN0aW9uIChEaWFnbm9zdGljVGFnKSB7XG4gICAgLyoqXG4gICAgICogVW51c2VkIG9yIHVubmVjZXNzYXJ5IGNvZGUuXG4gICAgICpcbiAgICAgKiBDbGllbnRzIGFyZSBhbGxvd2VkIHRvIHJlbmRlciBkaWFnbm9zdGljcyB3aXRoIHRoaXMgdGFnIGZhZGVkIG91dCBpbnN0ZWFkIG9mIGhhdmluZ1xuICAgICAqIGFuIGVycm9yIHNxdWlnZ2xlLlxuICAgICAqL1xuICAgIERpYWdub3N0aWNUYWcuVW5uZWNlc3NhcnkgPSAxO1xuICAgIC8qKlxuICAgICAqIERlcHJlY2F0ZWQgb3Igb2Jzb2xldGUgY29kZS5cbiAgICAgKlxuICAgICAqIENsaWVudHMgYXJlIGFsbG93ZWQgdG8gcmVuZGVyZWQgZGlhZ25vc3RpY3Mgd2l0aCB0aGlzIHRhZyBzdHJpa2UgdGhyb3VnaC5cbiAgICAgKi9cbiAgICBEaWFnbm9zdGljVGFnLkRlcHJlY2F0ZWQgPSAyO1xufSkoRGlhZ25vc3RpY1RhZyB8fCAoRGlhZ25vc3RpY1RhZyA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb2RlRGVzY3JpcHRpb24gbmFtZXNwYWNlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGggZGVzY3JpcHRpb25zIGZvciBkaWFnbm9zdGljIGNvZGVzLlxuICpcbiAqIEBzaW5jZSAzLjE2LjBcbiAqL1xuZXhwb3J0IHZhciBDb2RlRGVzY3JpcHRpb247XG4oZnVuY3Rpb24gKENvZGVEZXNjcmlwdGlvbikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUuaHJlZik7XG4gICAgfVxuICAgIENvZGVEZXNjcmlwdGlvbi5pcyA9IGlzO1xufSkoQ29kZURlc2NyaXB0aW9uIHx8IChDb2RlRGVzY3JpcHRpb24gPSB7fSkpO1xuLyoqXG4gKiBUaGUgRGlhZ25vc3RpYyBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBEaWFnbm9zdGljfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBEaWFnbm9zdGljO1xuKGZ1bmN0aW9uIChEaWFnbm9zdGljKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBEaWFnbm9zdGljIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCBtZXNzYWdlLCBzZXZlcml0eSwgY29kZSwgc291cmNlLCByZWxhdGVkSW5mb3JtYXRpb24pIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHsgcmFuZ2UsIG1lc3NhZ2UgfTtcbiAgICAgICAgaWYgKElzLmRlZmluZWQoc2V2ZXJpdHkpKSB7XG4gICAgICAgICAgICByZXN1bHQuc2V2ZXJpdHkgPSBzZXZlcml0eTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXMuZGVmaW5lZChjb2RlKSkge1xuICAgICAgICAgICAgcmVzdWx0LmNvZGUgPSBjb2RlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKHNvdXJjZSkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzLmRlZmluZWQocmVsYXRlZEluZm9ybWF0aW9uKSkge1xuICAgICAgICAgICAgcmVzdWx0LnJlbGF0ZWRJbmZvcm1hdGlvbiA9IHJlbGF0ZWRJbmZvcm1hdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBEaWFnbm9zdGljLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIERpYWdub3N0aWN9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKVxuICAgICAgICAgICAgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKVxuICAgICAgICAgICAgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5tZXNzYWdlKVxuICAgICAgICAgICAgJiYgKElzLm51bWJlcihjYW5kaWRhdGUuc2V2ZXJpdHkpIHx8IElzLnVuZGVmaW5lZChjYW5kaWRhdGUuc2V2ZXJpdHkpKVxuICAgICAgICAgICAgJiYgKElzLmludGVnZXIoY2FuZGlkYXRlLmNvZGUpIHx8IElzLnN0cmluZyhjYW5kaWRhdGUuY29kZSkgfHwgSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5jb2RlKSlcbiAgICAgICAgICAgICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLmNvZGVEZXNjcmlwdGlvbikgfHwgKElzLnN0cmluZygoX2EgPSBjYW5kaWRhdGUuY29kZURlc2NyaXB0aW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaHJlZikpKVxuICAgICAgICAgICAgJiYgKElzLnN0cmluZyhjYW5kaWRhdGUuc291cmNlKSB8fCBJcy51bmRlZmluZWQoY2FuZGlkYXRlLnNvdXJjZSkpXG4gICAgICAgICAgICAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5yZWxhdGVkSW5mb3JtYXRpb24pIHx8IElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLnJlbGF0ZWRJbmZvcm1hdGlvbiwgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbi5pcykpO1xuICAgIH1cbiAgICBEaWFnbm9zdGljLmlzID0gaXM7XG59KShEaWFnbm9zdGljIHx8IChEaWFnbm9zdGljID0ge30pKTtcbi8qKlxuICogVGhlIENvbW1hbmQgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgQ29tbWFuZH0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgQ29tbWFuZDtcbihmdW5jdGlvbiAoQ29tbWFuZCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ29tbWFuZCBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh0aXRsZSwgY29tbWFuZCwgLi4uYXJncykge1xuICAgICAgICBsZXQgcmVzdWx0ID0geyB0aXRsZSwgY29tbWFuZCB9O1xuICAgICAgICBpZiAoSXMuZGVmaW5lZChhcmdzKSAmJiBhcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJlc3VsdC5hcmd1bWVudHMgPSBhcmdzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIENvbW1hbmQuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgQ29tbWFuZH0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnRpdGxlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLmNvbW1hbmQpO1xuICAgIH1cbiAgICBDb21tYW5kLmlzID0gaXM7XG59KShDb21tYW5kIHx8IChDb21tYW5kID0ge30pKTtcbi8qKlxuICogVGhlIFRleHRFZGl0IG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIHJlcGxhY2UsXG4gKiBpbnNlcnQgYW5kIGRlbGV0ZSBlZGl0cyBtb3JlIGVhc2lseS5cbiAqL1xuZXhwb3J0IHZhciBUZXh0RWRpdDtcbihmdW5jdGlvbiAoVGV4dEVkaXQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgcmVwbGFjZSB0ZXh0IGVkaXQuXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSBvZiB0ZXh0IHRvIGJlIHJlcGxhY2VkLlxuICAgICAqIEBwYXJhbSBuZXdUZXh0IFRoZSBuZXcgdGV4dC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXBsYWNlKHJhbmdlLCBuZXdUZXh0KSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCBuZXdUZXh0IH07XG4gICAgfVxuICAgIFRleHRFZGl0LnJlcGxhY2UgPSByZXBsYWNlO1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zZXJ0IHRleHQgZWRpdC5cbiAgICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIHBvc2l0aW9uIHRvIGluc2VydCB0aGUgdGV4dCBhdC5cbiAgICAgKiBAcGFyYW0gbmV3VGV4dCBUaGUgdGV4dCB0byBiZSBpbnNlcnRlZC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbnNlcnQocG9zaXRpb24sIG5ld1RleHQpIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2U6IHsgc3RhcnQ6IHBvc2l0aW9uLCBlbmQ6IHBvc2l0aW9uIH0sIG5ld1RleHQgfTtcbiAgICB9XG4gICAgVGV4dEVkaXQuaW5zZXJ0ID0gaW5zZXJ0O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBkZWxldGUgdGV4dCBlZGl0LlxuICAgICAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2Ugb2YgdGV4dCB0byBiZSBkZWxldGVkLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRlbChyYW5nZSkge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgbmV3VGV4dDogJycgfTtcbiAgICB9XG4gICAgVGV4dEVkaXQuZGVsID0gZGVsO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpXG4gICAgICAgICAgICAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLm5ld1RleHQpXG4gICAgICAgICAgICAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpO1xuICAgIH1cbiAgICBUZXh0RWRpdC5pcyA9IGlzO1xufSkoVGV4dEVkaXQgfHwgKFRleHRFZGl0ID0ge30pKTtcbmV4cG9ydCB2YXIgQ2hhbmdlQW5ub3RhdGlvbjtcbihmdW5jdGlvbiAoQ2hhbmdlQW5ub3RhdGlvbikge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShsYWJlbCwgbmVlZHNDb25maXJtYXRpb24sIGRlc2NyaXB0aW9uKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHsgbGFiZWwgfTtcbiAgICAgICAgaWYgKG5lZWRzQ29uZmlybWF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5uZWVkc0NvbmZpcm1hdGlvbiA9IG5lZWRzQ29uZmlybWF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZXNjcmlwdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBDaGFuZ2VBbm5vdGF0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLmxhYmVsKSAmJlxuICAgICAgICAgICAgKElzLmJvb2xlYW4oY2FuZGlkYXRlLm5lZWRzQ29uZmlybWF0aW9uKSB8fCBjYW5kaWRhdGUubmVlZHNDb25maXJtYXRpb24gPT09IHVuZGVmaW5lZCkgJiZcbiAgICAgICAgICAgIChJcy5zdHJpbmcoY2FuZGlkYXRlLmRlc2NyaXB0aW9uKSB8fCBjYW5kaWRhdGUuZGVzY3JpcHRpb24gPT09IHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIENoYW5nZUFubm90YXRpb24uaXMgPSBpcztcbn0pKENoYW5nZUFubm90YXRpb24gfHwgKENoYW5nZUFubm90YXRpb24gPSB7fSkpO1xuZXhwb3J0IHZhciBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllcjtcbihmdW5jdGlvbiAoQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLnN0cmluZyhjYW5kaWRhdGUpO1xuICAgIH1cbiAgICBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyA9IGlzO1xufSkoQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIgfHwgKENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyID0ge30pKTtcbmV4cG9ydCB2YXIgQW5ub3RhdGVkVGV4dEVkaXQ7XG4oZnVuY3Rpb24gKEFubm90YXRlZFRleHRFZGl0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhbm5vdGF0ZWQgcmVwbGFjZSB0ZXh0IGVkaXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlIG9mIHRleHQgdG8gYmUgcmVwbGFjZWQuXG4gICAgICogQHBhcmFtIG5ld1RleHQgVGhlIG5ldyB0ZXh0LlxuICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIFRoZSBhbm5vdGF0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlcGxhY2UocmFuZ2UsIG5ld1RleHQsIGFubm90YXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIG5ld1RleHQsIGFubm90YXRpb25JZDogYW5ub3RhdGlvbiB9O1xuICAgIH1cbiAgICBBbm5vdGF0ZWRUZXh0RWRpdC5yZXBsYWNlID0gcmVwbGFjZTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFubm90YXRlZCBpbnNlcnQgdGV4dCBlZGl0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBwb3NpdGlvbiB0byBpbnNlcnQgdGhlIHRleHQgYXQuXG4gICAgICogQHBhcmFtIG5ld1RleHQgVGhlIHRleHQgdG8gYmUgaW5zZXJ0ZWQuXG4gICAgICogQHBhcmFtIGFubm90YXRpb24gVGhlIGFubm90YXRpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5zZXJ0KHBvc2l0aW9uLCBuZXdUZXh0LCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlOiB7IHN0YXJ0OiBwb3NpdGlvbiwgZW5kOiBwb3NpdGlvbiB9LCBuZXdUZXh0LCBhbm5vdGF0aW9uSWQ6IGFubm90YXRpb24gfTtcbiAgICB9XG4gICAgQW5ub3RhdGVkVGV4dEVkaXQuaW5zZXJ0ID0gaW5zZXJ0O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYW5ub3RhdGVkIGRlbGV0ZSB0ZXh0IGVkaXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlIG9mIHRleHQgdG8gYmUgZGVsZXRlZC5cbiAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiBUaGUgYW5ub3RhdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkZWwocmFuZ2UsIGFubm90YXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIG5ld1RleHQ6ICcnLCBhbm5vdGF0aW9uSWQ6IGFubm90YXRpb24gfTtcbiAgICB9XG4gICAgQW5ub3RhdGVkVGV4dEVkaXQuZGVsID0gZGVsO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gVGV4dEVkaXQuaXMoY2FuZGlkYXRlKSAmJiAoQ2hhbmdlQW5ub3RhdGlvbi5pcyhjYW5kaWRhdGUuYW5ub3RhdGlvbklkKSB8fCBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhjYW5kaWRhdGUuYW5ub3RhdGlvbklkKSk7XG4gICAgfVxuICAgIEFubm90YXRlZFRleHRFZGl0LmlzID0gaXM7XG59KShBbm5vdGF0ZWRUZXh0RWRpdCB8fCAoQW5ub3RhdGVkVGV4dEVkaXQgPSB7fSkpO1xuLyoqXG4gKiBUaGUgVGV4dERvY3VtZW50RWRpdCBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZVxuICogYW4gZWRpdCB0aGF0IG1hbmlwdWxhdGVzIGEgdGV4dCBkb2N1bWVudC5cbiAqL1xuZXhwb3J0IHZhciBUZXh0RG9jdW1lbnRFZGl0O1xuKGZ1bmN0aW9uIChUZXh0RG9jdW1lbnRFZGl0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBgVGV4dERvY3VtZW50RWRpdGBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodGV4dERvY3VtZW50LCBlZGl0cykge1xuICAgICAgICByZXR1cm4geyB0ZXh0RG9jdW1lbnQsIGVkaXRzIH07XG4gICAgfVxuICAgIFRleHREb2N1bWVudEVkaXQuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKVxuICAgICAgICAgICAgJiYgT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmlzKGNhbmRpZGF0ZS50ZXh0RG9jdW1lbnQpXG4gICAgICAgICAgICAmJiBBcnJheS5pc0FycmF5KGNhbmRpZGF0ZS5lZGl0cyk7XG4gICAgfVxuICAgIFRleHREb2N1bWVudEVkaXQuaXMgPSBpcztcbn0pKFRleHREb2N1bWVudEVkaXQgfHwgKFRleHREb2N1bWVudEVkaXQgPSB7fSkpO1xuZXhwb3J0IHZhciBDcmVhdGVGaWxlO1xuKGZ1bmN0aW9uIChDcmVhdGVGaWxlKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKHVyaSwgb3B0aW9ucywgYW5ub3RhdGlvbikge1xuICAgICAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgICAgICAga2luZDogJ2NyZWF0ZScsXG4gICAgICAgICAgICB1cmlcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKG9wdGlvbnMgIT09IHVuZGVmaW5lZCAmJiAob3B0aW9ucy5vdmVyd3JpdGUgIT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLmlnbm9yZUlmRXhpc3RzICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICByZXN1bHQub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFubm90YXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmFubm90YXRpb25JZCA9IGFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgQ3JlYXRlRmlsZS5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIGNhbmRpZGF0ZS5raW5kID09PSAnY3JlYXRlJyAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSkgJiYgKGNhbmRpZGF0ZS5vcHRpb25zID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICgoY2FuZGlkYXRlLm9wdGlvbnMub3ZlcndyaXRlID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUub3B0aW9ucy5vdmVyd3JpdGUpKSAmJiAoY2FuZGlkYXRlLm9wdGlvbnMuaWdub3JlSWZFeGlzdHMgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5vcHRpb25zLmlnbm9yZUlmRXhpc3RzKSkpKSAmJiAoY2FuZGlkYXRlLmFubm90YXRpb25JZCA9PT0gdW5kZWZpbmVkIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQpKTtcbiAgICB9XG4gICAgQ3JlYXRlRmlsZS5pcyA9IGlzO1xufSkoQ3JlYXRlRmlsZSB8fCAoQ3JlYXRlRmlsZSA9IHt9KSk7XG5leHBvcnQgdmFyIFJlbmFtZUZpbGU7XG4oZnVuY3Rpb24gKFJlbmFtZUZpbGUpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUob2xkVXJpLCBuZXdVcmksIG9wdGlvbnMsIGFubm90YXRpb24pIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIGtpbmQ6ICdyZW5hbWUnLFxuICAgICAgICAgICAgb2xkVXJpLFxuICAgICAgICAgICAgbmV3VXJpXG4gICAgICAgIH07XG4gICAgICAgIGlmIChvcHRpb25zICE9PSB1bmRlZmluZWQgJiYgKG9wdGlvbnMub3ZlcndyaXRlICE9PSB1bmRlZmluZWQgfHwgb3B0aW9ucy5pZ25vcmVJZkV4aXN0cyAhPT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgcmVzdWx0Lm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbm5vdGF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5hbm5vdGF0aW9uSWQgPSBhbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIFJlbmFtZUZpbGUuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBjYW5kaWRhdGUua2luZCA9PT0gJ3JlbmFtZScgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5vbGRVcmkpICYmIElzLnN0cmluZyhjYW5kaWRhdGUubmV3VXJpKSAmJiAoY2FuZGlkYXRlLm9wdGlvbnMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgKChjYW5kaWRhdGUub3B0aW9ucy5vdmVyd3JpdGUgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5vcHRpb25zLm92ZXJ3cml0ZSkpICYmIChjYW5kaWRhdGUub3B0aW9ucy5pZ25vcmVJZkV4aXN0cyA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLm9wdGlvbnMuaWdub3JlSWZFeGlzdHMpKSkpICYmIChjYW5kaWRhdGUuYW5ub3RhdGlvbklkID09PSB1bmRlZmluZWQgfHwgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoY2FuZGlkYXRlLmFubm90YXRpb25JZCkpO1xuICAgIH1cbiAgICBSZW5hbWVGaWxlLmlzID0gaXM7XG59KShSZW5hbWVGaWxlIHx8IChSZW5hbWVGaWxlID0ge30pKTtcbmV4cG9ydCB2YXIgRGVsZXRlRmlsZTtcbihmdW5jdGlvbiAoRGVsZXRlRmlsZSkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmksIG9wdGlvbnMsIGFubm90YXRpb24pIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIGtpbmQ6ICdkZWxldGUnLFxuICAgICAgICAgICAgdXJpXG4gICAgICAgIH07XG4gICAgICAgIGlmIChvcHRpb25zICE9PSB1bmRlZmluZWQgJiYgKG9wdGlvbnMucmVjdXJzaXZlICE9PSB1bmRlZmluZWQgfHwgb3B0aW9ucy5pZ25vcmVJZk5vdEV4aXN0cyAhPT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgcmVzdWx0Lm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbm5vdGF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5hbm5vdGF0aW9uSWQgPSBhbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIERlbGV0ZUZpbGUuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBjYW5kaWRhdGUua2luZCA9PT0gJ2RlbGV0ZScgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpICYmIChjYW5kaWRhdGUub3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAoKGNhbmRpZGF0ZS5vcHRpb25zLnJlY3Vyc2l2ZSA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLm9wdGlvbnMucmVjdXJzaXZlKSkgJiYgKGNhbmRpZGF0ZS5vcHRpb25zLmlnbm9yZUlmTm90RXhpc3RzID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUub3B0aW9ucy5pZ25vcmVJZk5vdEV4aXN0cykpKSkgJiYgKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQgPT09IHVuZGVmaW5lZCB8fCBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhjYW5kaWRhdGUuYW5ub3RhdGlvbklkKSk7XG4gICAgfVxuICAgIERlbGV0ZUZpbGUuaXMgPSBpcztcbn0pKERlbGV0ZUZpbGUgfHwgKERlbGV0ZUZpbGUgPSB7fSkpO1xuZXhwb3J0IHZhciBXb3Jrc3BhY2VFZGl0O1xuKGZ1bmN0aW9uIChXb3Jrc3BhY2VFZGl0KSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmNoYW5nZXMgIT09IHVuZGVmaW5lZCB8fCBjYW5kaWRhdGUuZG9jdW1lbnRDaGFuZ2VzICE9PSB1bmRlZmluZWQpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmRvY3VtZW50Q2hhbmdlcyA9PT0gdW5kZWZpbmVkIHx8IGNhbmRpZGF0ZS5kb2N1bWVudENoYW5nZXMuZXZlcnkoKGNoYW5nZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChJcy5zdHJpbmcoY2hhbmdlLmtpbmQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVGaWxlLmlzKGNoYW5nZSkgfHwgUmVuYW1lRmlsZS5pcyhjaGFuZ2UpIHx8IERlbGV0ZUZpbGUuaXMoY2hhbmdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBUZXh0RG9jdW1lbnRFZGl0LmlzKGNoYW5nZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgIH1cbiAgICBXb3Jrc3BhY2VFZGl0LmlzID0gaXM7XG59KShXb3Jrc3BhY2VFZGl0IHx8IChXb3Jrc3BhY2VFZGl0ID0ge30pKTtcbmNsYXNzIFRleHRFZGl0Q2hhbmdlSW1wbCB7XG4gICAgY29uc3RydWN0b3IoZWRpdHMsIGNoYW5nZUFubm90YXRpb25zKSB7XG4gICAgICAgIHRoaXMuZWRpdHMgPSBlZGl0cztcbiAgICAgICAgdGhpcy5jaGFuZ2VBbm5vdGF0aW9ucyA9IGNoYW5nZUFubm90YXRpb25zO1xuICAgIH1cbiAgICBpbnNlcnQocG9zaXRpb24sIG5ld1RleHQsIGFubm90YXRpb24pIHtcbiAgICAgICAgbGV0IGVkaXQ7XG4gICAgICAgIGxldCBpZDtcbiAgICAgICAgaWYgKGFubm90YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZWRpdCA9IFRleHRFZGl0Lmluc2VydChwb3NpdGlvbiwgbmV3VGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoYW5ub3RhdGlvbikpIHtcbiAgICAgICAgICAgIGlkID0gYW5ub3RhdGlvbjtcbiAgICAgICAgICAgIGVkaXQgPSBBbm5vdGF0ZWRUZXh0RWRpdC5pbnNlcnQocG9zaXRpb24sIG5ld1RleHQsIGFubm90YXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hc3NlcnRDaGFuZ2VBbm5vdGF0aW9ucyh0aGlzLmNoYW5nZUFubm90YXRpb25zKTtcbiAgICAgICAgICAgIGlkID0gdGhpcy5jaGFuZ2VBbm5vdGF0aW9ucy5tYW5hZ2UoYW5ub3RhdGlvbik7XG4gICAgICAgICAgICBlZGl0ID0gQW5ub3RhdGVkVGV4dEVkaXQuaW5zZXJ0KHBvc2l0aW9uLCBuZXdUZXh0LCBpZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lZGl0cy5wdXNoKGVkaXQpO1xuICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlcGxhY2UocmFuZ2UsIG5ld1RleHQsIGFubm90YXRpb24pIHtcbiAgICAgICAgbGV0IGVkaXQ7XG4gICAgICAgIGxldCBpZDtcbiAgICAgICAgaWYgKGFubm90YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZWRpdCA9IFRleHRFZGl0LnJlcGxhY2UocmFuZ2UsIG5ld1RleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGFubm90YXRpb24pKSB7XG4gICAgICAgICAgICBpZCA9IGFubm90YXRpb247XG4gICAgICAgICAgICBlZGl0ID0gQW5ub3RhdGVkVGV4dEVkaXQucmVwbGFjZShyYW5nZSwgbmV3VGV4dCwgYW5ub3RhdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFzc2VydENoYW5nZUFubm90YXRpb25zKHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgaWQgPSB0aGlzLmNoYW5nZUFubm90YXRpb25zLm1hbmFnZShhbm5vdGF0aW9uKTtcbiAgICAgICAgICAgIGVkaXQgPSBBbm5vdGF0ZWRUZXh0RWRpdC5yZXBsYWNlKHJhbmdlLCBuZXdUZXh0LCBpZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lZGl0cy5wdXNoKGVkaXQpO1xuICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlbGV0ZShyYW5nZSwgYW5ub3RhdGlvbikge1xuICAgICAgICBsZXQgZWRpdDtcbiAgICAgICAgbGV0IGlkO1xuICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBlZGl0ID0gVGV4dEVkaXQuZGVsKHJhbmdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhhbm5vdGF0aW9uKSkge1xuICAgICAgICAgICAgaWQgPSBhbm5vdGF0aW9uO1xuICAgICAgICAgICAgZWRpdCA9IEFubm90YXRlZFRleHRFZGl0LmRlbChyYW5nZSwgYW5ub3RhdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFzc2VydENoYW5nZUFubm90YXRpb25zKHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgaWQgPSB0aGlzLmNoYW5nZUFubm90YXRpb25zLm1hbmFnZShhbm5vdGF0aW9uKTtcbiAgICAgICAgICAgIGVkaXQgPSBBbm5vdGF0ZWRUZXh0RWRpdC5kZWwocmFuZ2UsIGlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVkaXRzLnB1c2goZWRpdCk7XG4gICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYWRkKGVkaXQpIHtcbiAgICAgICAgdGhpcy5lZGl0cy5wdXNoKGVkaXQpO1xuICAgIH1cbiAgICBhbGwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRzO1xuICAgIH1cbiAgICBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5lZGl0cy5zcGxpY2UoMCwgdGhpcy5lZGl0cy5sZW5ndGgpO1xuICAgIH1cbiAgICBhc3NlcnRDaGFuZ2VBbm5vdGF0aW9ucyh2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUZXh0IGVkaXQgY2hhbmdlIGlzIG5vdCBjb25maWd1cmVkIHRvIG1hbmFnZSBjaGFuZ2UgYW5ub3RhdGlvbnMuYCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIEEgaGVscGVyIGNsYXNzXG4gKi9cbmNsYXNzIENoYW5nZUFubm90YXRpb25zIHtcbiAgICBjb25zdHJ1Y3Rvcihhbm5vdGF0aW9ucykge1xuICAgICAgICB0aGlzLl9hbm5vdGF0aW9ucyA9IGFubm90YXRpb25zID09PSB1bmRlZmluZWQgPyBPYmplY3QuY3JlYXRlKG51bGwpIDogYW5ub3RhdGlvbnM7XG4gICAgICAgIHRoaXMuX2NvdW50ZXIgPSAwO1xuICAgICAgICB0aGlzLl9zaXplID0gMDtcbiAgICB9XG4gICAgYWxsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYW5ub3RhdGlvbnM7XG4gICAgfVxuICAgIGdldCBzaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2l6ZTtcbiAgICB9XG4gICAgbWFuYWdlKGlkT3JBbm5vdGF0aW9uLCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIGxldCBpZDtcbiAgICAgICAgaWYgKENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGlkT3JBbm5vdGF0aW9uKSkge1xuICAgICAgICAgICAgaWQgPSBpZE9yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlkID0gdGhpcy5uZXh0SWQoKTtcbiAgICAgICAgICAgIGFubm90YXRpb24gPSBpZE9yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fYW5ub3RhdGlvbnNbaWRdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSWQgJHtpZH0gaXMgYWxyZWFkeSBpbiB1c2UuYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFubm90YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBhbm5vdGF0aW9uIHByb3ZpZGVkIGZvciBpZCAke2lkfWApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2Fubm90YXRpb25zW2lkXSA9IGFubm90YXRpb247XG4gICAgICAgIHRoaXMuX3NpemUrKztcbiAgICAgICAgcmV0dXJuIGlkO1xuICAgIH1cbiAgICBuZXh0SWQoKSB7XG4gICAgICAgIHRoaXMuX2NvdW50ZXIrKztcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvdW50ZXIudG9TdHJpbmcoKTtcbiAgICB9XG59XG4vKipcbiAqIEEgd29ya3NwYWNlIGNoYW5nZSBoZWxwcyBjb25zdHJ1Y3RpbmcgY2hhbmdlcyB0byBhIHdvcmtzcGFjZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFdvcmtzcGFjZUNoYW5nZSB7XG4gICAgY29uc3RydWN0b3Iod29ya3NwYWNlRWRpdCkge1xuICAgICAgICB0aGlzLl90ZXh0RWRpdENoYW5nZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBpZiAod29ya3NwYWNlRWRpdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0ID0gd29ya3NwYWNlRWRpdDtcbiAgICAgICAgICAgIGlmICh3b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZUFubm90YXRpb25zID0gbmV3IENoYW5nZUFubm90YXRpb25zKHdvcmtzcGFjZUVkaXQuY2hhbmdlQW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgICAgIHdvcmtzcGFjZUVkaXQuY2hhbmdlQW5ub3RhdGlvbnMgPSB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5hbGwoKTtcbiAgICAgICAgICAgICAgICB3b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcy5mb3JFYWNoKChjaGFuZ2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFRleHREb2N1bWVudEVkaXQuaXMoY2hhbmdlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dEVkaXRDaGFuZ2UgPSBuZXcgVGV4dEVkaXRDaGFuZ2VJbXBsKGNoYW5nZS5lZGl0cywgdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGV4dEVkaXRDaGFuZ2VzW2NoYW5nZS50ZXh0RG9jdW1lbnQudXJpXSA9IHRleHRFZGl0Q2hhbmdlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh3b3Jrc3BhY2VFZGl0LmNoYW5nZXMpIHtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyh3b3Jrc3BhY2VFZGl0LmNoYW5nZXMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0RWRpdENoYW5nZSA9IG5ldyBUZXh0RWRpdENoYW5nZUltcGwod29ya3NwYWNlRWRpdC5jaGFuZ2VzW2tleV0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXh0RWRpdENoYW5nZXNba2V5XSA9IHRleHRFZGl0Q2hhbmdlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdCA9IHt9O1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHVuZGVybHlpbmcge0BsaW5rIFdvcmtzcGFjZUVkaXR9IGxpdGVyYWxcbiAgICAgKiB1c2UgdG8gYmUgcmV0dXJuZWQgZnJvbSBhIHdvcmtzcGFjZSBlZGl0IG9wZXJhdGlvbiBsaWtlIHJlbmFtZS5cbiAgICAgKi9cbiAgICBnZXQgZWRpdCgpIHtcbiAgICAgICAgdGhpcy5pbml0RG9jdW1lbnRDaGFuZ2VzKCk7XG4gICAgICAgIGlmICh0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlQW5ub3RhdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZUFubm90YXRpb25zID0gdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMuYWxsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3dvcmtzcGFjZUVkaXQ7XG4gICAgfVxuICAgIGdldFRleHRFZGl0Q2hhbmdlKGtleSkge1xuICAgICAgICBpZiAoT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmlzKGtleSkpIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdERvY3VtZW50Q2hhbmdlcygpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dvcmtzcGFjZSBlZGl0IGlzIG5vdCBjb25maWd1cmVkIGZvciBkb2N1bWVudCBjaGFuZ2VzLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdGV4dERvY3VtZW50ID0geyB1cmk6IGtleS51cmksIHZlcnNpb246IGtleS52ZXJzaW9uIH07XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5fdGV4dEVkaXRDaGFuZ2VzW3RleHREb2N1bWVudC51cmldO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlZGl0cyA9IFtdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRleHREb2N1bWVudEVkaXQgPSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHREb2N1bWVudCxcbiAgICAgICAgICAgICAgICAgICAgZWRpdHNcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzLnB1c2godGV4dERvY3VtZW50RWRpdCk7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFRleHRFZGl0Q2hhbmdlSW1wbChlZGl0cywgdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3RleHRFZGl0Q2hhbmdlc1t0ZXh0RG9jdW1lbnQudXJpXSA9IHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmluaXRDaGFuZ2VzKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dvcmtzcGFjZSBlZGl0IGlzIG5vdCBjb25maWd1cmVkIGZvciBub3JtYWwgdGV4dCBlZGl0IGNoYW5nZXMuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5fdGV4dEVkaXRDaGFuZ2VzW2tleV07XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgICAgIGxldCBlZGl0cyA9IFtdO1xuICAgICAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlc1trZXldID0gZWRpdHM7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFRleHRFZGl0Q2hhbmdlSW1wbChlZGl0cyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGV4dEVkaXRDaGFuZ2VzW2tleV0gPSByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgfVxuICAgIGluaXREb2N1bWVudENoYW5nZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcyA9PT0gdW5kZWZpbmVkICYmIHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucyA9IG5ldyBDaGFuZ2VBbm5vdGF0aW9ucygpO1xuICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlQW5ub3RhdGlvbnMgPSB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5hbGwoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpbml0Q2hhbmdlcygpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzID09PSB1bmRlZmluZWQgJiYgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY3JlYXRlRmlsZSh1cmksIG9wdGlvbnNPckFubm90YXRpb24sIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5pbml0RG9jdW1lbnRDaGFuZ2VzKCk7XG4gICAgICAgIGlmICh0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dvcmtzcGFjZSBlZGl0IGlzIG5vdCBjb25maWd1cmVkIGZvciBkb2N1bWVudCBjaGFuZ2VzLicpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhbm5vdGF0aW9uO1xuICAgICAgICBpZiAoQ2hhbmdlQW5ub3RhdGlvbi5pcyhvcHRpb25zT3JBbm5vdGF0aW9uKSB8fCBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhvcHRpb25zT3JBbm5vdGF0aW9uKSkge1xuICAgICAgICAgICAgYW5ub3RhdGlvbiA9IG9wdGlvbnNPckFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvcHRpb25zID0gb3B0aW9uc09yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb3BlcmF0aW9uO1xuICAgICAgICBsZXQgaWQ7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wZXJhdGlvbiA9IENyZWF0ZUZpbGUuY3JlYXRlKHVyaSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZCA9IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGFubm90YXRpb24pID8gYW5ub3RhdGlvbiA6IHRoaXMuX2NoYW5nZUFubm90YXRpb25zLm1hbmFnZShhbm5vdGF0aW9uKTtcbiAgICAgICAgICAgIG9wZXJhdGlvbiA9IENyZWF0ZUZpbGUuY3JlYXRlKHVyaSwgb3B0aW9ucywgaWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzLnB1c2gob3BlcmF0aW9uKTtcbiAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZW5hbWVGaWxlKG9sZFVyaSwgbmV3VXJpLCBvcHRpb25zT3JBbm5vdGF0aW9uLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuaW5pdERvY3VtZW50Q2hhbmdlcygpO1xuICAgICAgICBpZiAodGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXb3Jrc3BhY2UgZWRpdCBpcyBub3QgY29uZmlndXJlZCBmb3IgZG9jdW1lbnQgY2hhbmdlcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYW5ub3RhdGlvbjtcbiAgICAgICAgaWYgKENoYW5nZUFubm90YXRpb24uaXMob3B0aW9uc09yQW5ub3RhdGlvbikgfHwgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMob3B0aW9uc09yQW5ub3RhdGlvbikpIHtcbiAgICAgICAgICAgIGFubm90YXRpb24gPSBvcHRpb25zT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnNPckFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG9wZXJhdGlvbjtcbiAgICAgICAgbGV0IGlkO1xuICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcGVyYXRpb24gPSBSZW5hbWVGaWxlLmNyZWF0ZShvbGRVcmksIG5ld1VyaSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZCA9IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGFubm90YXRpb24pID8gYW5ub3RhdGlvbiA6IHRoaXMuX2NoYW5nZUFubm90YXRpb25zLm1hbmFnZShhbm5vdGF0aW9uKTtcbiAgICAgICAgICAgIG9wZXJhdGlvbiA9IFJlbmFtZUZpbGUuY3JlYXRlKG9sZFVyaSwgbmV3VXJpLCBvcHRpb25zLCBpZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMucHVzaChvcGVyYXRpb24pO1xuICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlbGV0ZUZpbGUodXJpLCBvcHRpb25zT3JBbm5vdGF0aW9uLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuaW5pdERvY3VtZW50Q2hhbmdlcygpO1xuICAgICAgICBpZiAodGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXb3Jrc3BhY2UgZWRpdCBpcyBub3QgY29uZmlndXJlZCBmb3IgZG9jdW1lbnQgY2hhbmdlcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYW5ub3RhdGlvbjtcbiAgICAgICAgaWYgKENoYW5nZUFubm90YXRpb24uaXMob3B0aW9uc09yQW5ub3RhdGlvbikgfHwgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMob3B0aW9uc09yQW5ub3RhdGlvbikpIHtcbiAgICAgICAgICAgIGFubm90YXRpb24gPSBvcHRpb25zT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnNPckFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG9wZXJhdGlvbjtcbiAgICAgICAgbGV0IGlkO1xuICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcGVyYXRpb24gPSBEZWxldGVGaWxlLmNyZWF0ZSh1cmksIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWQgPSBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhhbm5vdGF0aW9uKSA/IGFubm90YXRpb24gOiB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5tYW5hZ2UoYW5ub3RhdGlvbik7XG4gICAgICAgICAgICBvcGVyYXRpb24gPSBEZWxldGVGaWxlLmNyZWF0ZSh1cmksIG9wdGlvbnMsIGlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcy5wdXNoKG9wZXJhdGlvbik7XG4gICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIFRoZSBUZXh0RG9jdW1lbnRJZGVudGlmaWVyIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIFRleHREb2N1bWVudElkZW50aWZpZXJ9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIFRleHREb2N1bWVudElkZW50aWZpZXI7XG4oZnVuY3Rpb24gKFRleHREb2N1bWVudElkZW50aWZpZXIpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFRleHREb2N1bWVudElkZW50aWZpZXIgbGl0ZXJhbC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSBkb2N1bWVudCdzIHVyaS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodXJpKSB7XG4gICAgICAgIHJldHVybiB7IHVyaSB9O1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIFRleHREb2N1bWVudElkZW50aWZpZXJ9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpO1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmlzID0gaXM7XG59KShUZXh0RG9jdW1lbnRJZGVudGlmaWVyIHx8IChUZXh0RG9jdW1lbnRJZGVudGlmaWVyID0ge30pKTtcbi8qKlxuICogVGhlIFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcjtcbihmdW5jdGlvbiAoVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciBsaXRlcmFsLlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIGRvY3VtZW50J3MgdXJpLlxuICAgICAqIEBwYXJhbSB2ZXJzaW9uIFRoZSBkb2N1bWVudCdzIHZlcnNpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHVyaSwgdmVyc2lvbikge1xuICAgICAgICByZXR1cm4geyB1cmksIHZlcnNpb24gfTtcbiAgICB9XG4gICAgVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllci5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudXJpKSAmJiBJcy5pbnRlZ2VyKGNhbmRpZGF0ZS52ZXJzaW9uKTtcbiAgICB9XG4gICAgVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllci5pcyA9IGlzO1xufSkoVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciB8fCAoVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciA9IHt9KSk7XG4vKipcbiAqIFRoZSBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXI7XG4oZnVuY3Rpb24gKE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIGxpdGVyYWwuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgZG9jdW1lbnQncyB1cmkuXG4gICAgICogQHBhcmFtIHZlcnNpb24gVGhlIGRvY3VtZW50J3MgdmVyc2lvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodXJpLCB2ZXJzaW9uKSB7XG4gICAgICAgIHJldHVybiB7IHVyaSwgdmVyc2lvbiB9O1xuICAgIH1cbiAgICBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudXJpKSAmJiAoY2FuZGlkYXRlLnZlcnNpb24gPT09IG51bGwgfHwgSXMuaW50ZWdlcihjYW5kaWRhdGUudmVyc2lvbikpO1xuICAgIH1cbiAgICBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIuaXMgPSBpcztcbn0pKE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciB8fCAoT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyID0ge30pKTtcbi8qKlxuICogVGhlIFRleHREb2N1bWVudEl0ZW0gbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgVGV4dERvY3VtZW50SXRlbX0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgVGV4dERvY3VtZW50SXRlbTtcbihmdW5jdGlvbiAoVGV4dERvY3VtZW50SXRlbSkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgVGV4dERvY3VtZW50SXRlbSBsaXRlcmFsLlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIGRvY3VtZW50J3MgdXJpLlxuICAgICAqIEBwYXJhbSBsYW5ndWFnZUlkIFRoZSBkb2N1bWVudCdzIGxhbmd1YWdlIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHZlcnNpb24gVGhlIGRvY3VtZW50J3MgdmVyc2lvbiBudW1iZXIuXG4gICAgICogQHBhcmFtIHRleHQgVGhlIGRvY3VtZW50J3MgdGV4dC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodXJpLCBsYW5ndWFnZUlkLCB2ZXJzaW9uLCB0ZXh0KSB7XG4gICAgICAgIHJldHVybiB7IHVyaSwgbGFuZ3VhZ2VJZCwgdmVyc2lvbiwgdGV4dCB9O1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnRJdGVtLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIFRleHREb2N1bWVudEl0ZW19IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpICYmIElzLnN0cmluZyhjYW5kaWRhdGUubGFuZ3VhZ2VJZCkgJiYgSXMuaW50ZWdlcihjYW5kaWRhdGUudmVyc2lvbikgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS50ZXh0KTtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50SXRlbS5pcyA9IGlzO1xufSkoVGV4dERvY3VtZW50SXRlbSB8fCAoVGV4dERvY3VtZW50SXRlbSA9IHt9KSk7XG4vKipcbiAqIERlc2NyaWJlcyB0aGUgY29udGVudCB0eXBlIHRoYXQgYSBjbGllbnQgc3VwcG9ydHMgaW4gdmFyaW91c1xuICogcmVzdWx0IGxpdGVyYWxzIGxpa2UgYEhvdmVyYCwgYFBhcmFtZXRlckluZm9gIG9yIGBDb21wbGV0aW9uSXRlbWAuXG4gKlxuICogUGxlYXNlIG5vdGUgdGhhdCBgTWFya3VwS2luZHNgIG11c3Qgbm90IHN0YXJ0IHdpdGggYSBgJGAuIFRoaXMga2luZHNcbiAqIGFyZSByZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNhZ2UuXG4gKi9cbmV4cG9ydCB2YXIgTWFya3VwS2luZDtcbihmdW5jdGlvbiAoTWFya3VwS2luZCkge1xuICAgIC8qKlxuICAgICAqIFBsYWluIHRleHQgaXMgc3VwcG9ydGVkIGFzIGEgY29udGVudCBmb3JtYXRcbiAgICAgKi9cbiAgICBNYXJrdXBLaW5kLlBsYWluVGV4dCA9ICdwbGFpbnRleHQnO1xuICAgIC8qKlxuICAgICAqIE1hcmtkb3duIGlzIHN1cHBvcnRlZCBhcyBhIGNvbnRlbnQgZm9ybWF0XG4gICAgICovXG4gICAgTWFya3VwS2luZC5NYXJrZG93biA9ICdtYXJrZG93bic7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIGlzIGEgdmFsdWUgb2YgdGhlIHtAbGluayBNYXJrdXBLaW5kfSB0eXBlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlID09PSBNYXJrdXBLaW5kLlBsYWluVGV4dCB8fCBjYW5kaWRhdGUgPT09IE1hcmt1cEtpbmQuTWFya2Rvd247XG4gICAgfVxuICAgIE1hcmt1cEtpbmQuaXMgPSBpcztcbn0pKE1hcmt1cEtpbmQgfHwgKE1hcmt1cEtpbmQgPSB7fSkpO1xuZXhwb3J0IHZhciBNYXJrdXBDb250ZW50O1xuKGZ1bmN0aW9uIChNYXJrdXBDb250ZW50KSB7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgTWFya3VwQ29udGVudH0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbCh2YWx1ZSkgJiYgTWFya3VwS2luZC5pcyhjYW5kaWRhdGUua2luZCkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS52YWx1ZSk7XG4gICAgfVxuICAgIE1hcmt1cENvbnRlbnQuaXMgPSBpcztcbn0pKE1hcmt1cENvbnRlbnQgfHwgKE1hcmt1cENvbnRlbnQgPSB7fSkpO1xuLyoqXG4gKiBUaGUga2luZCBvZiBhIGNvbXBsZXRpb24gZW50cnkuXG4gKi9cbmV4cG9ydCB2YXIgQ29tcGxldGlvbkl0ZW1LaW5kO1xuKGZ1bmN0aW9uIChDb21wbGV0aW9uSXRlbUtpbmQpIHtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuVGV4dCA9IDE7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLk1ldGhvZCA9IDI7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkZ1bmN0aW9uID0gMztcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuQ29uc3RydWN0b3IgPSA0O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5GaWVsZCA9IDU7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlZhcmlhYmxlID0gNjtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuQ2xhc3MgPSA3O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5JbnRlcmZhY2UgPSA4O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5Nb2R1bGUgPSA5O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5Qcm9wZXJ0eSA9IDEwO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5Vbml0ID0gMTE7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlZhbHVlID0gMTI7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkVudW0gPSAxMztcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuS2V5d29yZCA9IDE0O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5TbmlwcGV0ID0gMTU7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkNvbG9yID0gMTY7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkZpbGUgPSAxNztcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuUmVmZXJlbmNlID0gMTg7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkZvbGRlciA9IDE5O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5FbnVtTWVtYmVyID0gMjA7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkNvbnN0YW50ID0gMjE7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlN0cnVjdCA9IDIyO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5FdmVudCA9IDIzO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5PcGVyYXRvciA9IDI0O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5UeXBlUGFyYW1ldGVyID0gMjU7XG59KShDb21wbGV0aW9uSXRlbUtpbmQgfHwgKENvbXBsZXRpb25JdGVtS2luZCA9IHt9KSk7XG4vKipcbiAqIERlZmluZXMgd2hldGhlciB0aGUgaW5zZXJ0IHRleHQgaW4gYSBjb21wbGV0aW9uIGl0ZW0gc2hvdWxkIGJlIGludGVycHJldGVkIGFzXG4gKiBwbGFpbiB0ZXh0IG9yIGEgc25pcHBldC5cbiAqL1xuZXhwb3J0IHZhciBJbnNlcnRUZXh0Rm9ybWF0O1xuKGZ1bmN0aW9uIChJbnNlcnRUZXh0Rm9ybWF0KSB7XG4gICAgLyoqXG4gICAgICogVGhlIHByaW1hcnkgdGV4dCB0byBiZSBpbnNlcnRlZCBpcyB0cmVhdGVkIGFzIGEgcGxhaW4gc3RyaW5nLlxuICAgICAqL1xuICAgIEluc2VydFRleHRGb3JtYXQuUGxhaW5UZXh0ID0gMTtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpbWFyeSB0ZXh0IHRvIGJlIGluc2VydGVkIGlzIHRyZWF0ZWQgYXMgYSBzbmlwcGV0LlxuICAgICAqXG4gICAgICogQSBzbmlwcGV0IGNhbiBkZWZpbmUgdGFiIHN0b3BzIGFuZCBwbGFjZWhvbGRlcnMgd2l0aCBgJDFgLCBgJDJgXG4gICAgICogYW5kIGAkezM6Zm9vfWAuIGAkMGAgZGVmaW5lcyB0aGUgZmluYWwgdGFiIHN0b3AsIGl0IGRlZmF1bHRzIHRvXG4gICAgICogdGhlIGVuZCBvZiB0aGUgc25pcHBldC4gUGxhY2Vob2xkZXJzIHdpdGggZXF1YWwgaWRlbnRpZmllcnMgYXJlIGxpbmtlZCxcbiAgICAgKiB0aGF0IGlzIHR5cGluZyBpbiBvbmUgd2lsbCB1cGRhdGUgb3RoZXJzIHRvby5cbiAgICAgKlxuICAgICAqIFNlZSBhbHNvOiBodHRwczovL21pY3Jvc29mdC5naXRodWIuaW8vbGFuZ3VhZ2Utc2VydmVyLXByb3RvY29sL3NwZWNpZmljYXRpb25zL3NwZWNpZmljYXRpb24tY3VycmVudC8jc25pcHBldF9zeW50YXhcbiAgICAgKi9cbiAgICBJbnNlcnRUZXh0Rm9ybWF0LlNuaXBwZXQgPSAyO1xufSkoSW5zZXJ0VGV4dEZvcm1hdCB8fCAoSW5zZXJ0VGV4dEZvcm1hdCA9IHt9KSk7XG4vKipcbiAqIENvbXBsZXRpb24gaXRlbSB0YWdzIGFyZSBleHRyYSBhbm5vdGF0aW9ucyB0aGF0IHR3ZWFrIHRoZSByZW5kZXJpbmcgb2YgYSBjb21wbGV0aW9uXG4gKiBpdGVtLlxuICpcbiAqIEBzaW5jZSAzLjE1LjBcbiAqL1xuZXhwb3J0IHZhciBDb21wbGV0aW9uSXRlbVRhZztcbihmdW5jdGlvbiAoQ29tcGxldGlvbkl0ZW1UYWcpIHtcbiAgICAvKipcbiAgICAgKiBSZW5kZXIgYSBjb21wbGV0aW9uIGFzIG9ic29sZXRlLCB1c3VhbGx5IHVzaW5nIGEgc3RyaWtlLW91dC5cbiAgICAgKi9cbiAgICBDb21wbGV0aW9uSXRlbVRhZy5EZXByZWNhdGVkID0gMTtcbn0pKENvbXBsZXRpb25JdGVtVGFnIHx8IChDb21wbGV0aW9uSXRlbVRhZyA9IHt9KSk7XG4vKipcbiAqIFRoZSBJbnNlcnRSZXBsYWNlRWRpdCBuYW1lc3BhY2UgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCBpbnNlcnQgLyByZXBsYWNlIGVkaXRzLlxuICpcbiAqIEBzaW5jZSAzLjE2LjBcbiAqL1xuZXhwb3J0IHZhciBJbnNlcnRSZXBsYWNlRWRpdDtcbihmdW5jdGlvbiAoSW5zZXJ0UmVwbGFjZUVkaXQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGluc2VydCAvIHJlcGxhY2UgZWRpdFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShuZXdUZXh0LCBpbnNlcnQsIHJlcGxhY2UpIHtcbiAgICAgICAgcmV0dXJuIHsgbmV3VGV4dCwgaW5zZXJ0LCByZXBsYWNlIH07XG4gICAgfVxuICAgIEluc2VydFJlcGxhY2VFZGl0LmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIEluc2VydFJlcGxhY2VFZGl0fSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5uZXdUZXh0KSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUuaW5zZXJ0KSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmVwbGFjZSk7XG4gICAgfVxuICAgIEluc2VydFJlcGxhY2VFZGl0LmlzID0gaXM7XG59KShJbnNlcnRSZXBsYWNlRWRpdCB8fCAoSW5zZXJ0UmVwbGFjZUVkaXQgPSB7fSkpO1xuLyoqXG4gKiBIb3cgd2hpdGVzcGFjZSBhbmQgaW5kZW50YXRpb24gaXMgaGFuZGxlZCBkdXJpbmcgY29tcGxldGlvblxuICogaXRlbSBpbnNlcnRpb24uXG4gKlxuICogQHNpbmNlIDMuMTYuMFxuICovXG5leHBvcnQgdmFyIEluc2VydFRleHRNb2RlO1xuKGZ1bmN0aW9uIChJbnNlcnRUZXh0TW9kZSkge1xuICAgIC8qKlxuICAgICAqIFRoZSBpbnNlcnRpb24gb3IgcmVwbGFjZSBzdHJpbmdzIGlzIHRha2VuIGFzIGl0IGlzLiBJZiB0aGVcbiAgICAgKiB2YWx1ZSBpcyBtdWx0aSBsaW5lIHRoZSBsaW5lcyBiZWxvdyB0aGUgY3Vyc29yIHdpbGwgYmVcbiAgICAgKiBpbnNlcnRlZCB1c2luZyB0aGUgaW5kZW50YXRpb24gZGVmaW5lZCBpbiB0aGUgc3RyaW5nIHZhbHVlLlxuICAgICAqIFRoZSBjbGllbnQgd2lsbCBub3QgYXBwbHkgYW55IGtpbmQgb2YgYWRqdXN0bWVudHMgdG8gdGhlXG4gICAgICogc3RyaW5nLlxuICAgICAqL1xuICAgIEluc2VydFRleHRNb2RlLmFzSXMgPSAxO1xuICAgIC8qKlxuICAgICAqIFRoZSBlZGl0b3IgYWRqdXN0cyBsZWFkaW5nIHdoaXRlc3BhY2Ugb2YgbmV3IGxpbmVzIHNvIHRoYXRcbiAgICAgKiB0aGV5IG1hdGNoIHRoZSBpbmRlbnRhdGlvbiB1cCB0byB0aGUgY3Vyc29yIG9mIHRoZSBsaW5lIGZvclxuICAgICAqIHdoaWNoIHRoZSBpdGVtIGlzIGFjY2VwdGVkLlxuICAgICAqXG4gICAgICogQ29uc2lkZXIgYSBsaW5lIGxpa2UgdGhpczogPDJ0YWJzPjxjdXJzb3I+PDN0YWJzPmZvby4gQWNjZXB0aW5nIGFcbiAgICAgKiBtdWx0aSBsaW5lIGNvbXBsZXRpb24gaXRlbSBpcyBpbmRlbnRlZCB1c2luZyAyIHRhYnMgYW5kIGFsbFxuICAgICAqIGZvbGxvd2luZyBsaW5lcyBpbnNlcnRlZCB3aWxsIGJlIGluZGVudGVkIHVzaW5nIDIgdGFicyBhcyB3ZWxsLlxuICAgICAqL1xuICAgIEluc2VydFRleHRNb2RlLmFkanVzdEluZGVudGF0aW9uID0gMjtcbn0pKEluc2VydFRleHRNb2RlIHx8IChJbnNlcnRUZXh0TW9kZSA9IHt9KSk7XG5leHBvcnQgdmFyIENvbXBsZXRpb25JdGVtTGFiZWxEZXRhaWxzO1xuKGZ1bmN0aW9uIChDb21wbGV0aW9uSXRlbUxhYmVsRGV0YWlscykge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIChJcy5zdHJpbmcoY2FuZGlkYXRlLmRldGFpbCkgfHwgY2FuZGlkYXRlLmRldGFpbCA9PT0gdW5kZWZpbmVkKSAmJlxuICAgICAgICAgICAgKElzLnN0cmluZyhjYW5kaWRhdGUuZGVzY3JpcHRpb24pIHx8IGNhbmRpZGF0ZS5kZXNjcmlwdGlvbiA9PT0gdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgQ29tcGxldGlvbkl0ZW1MYWJlbERldGFpbHMuaXMgPSBpcztcbn0pKENvbXBsZXRpb25JdGVtTGFiZWxEZXRhaWxzIHx8IChDb21wbGV0aW9uSXRlbUxhYmVsRGV0YWlscyA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb21wbGV0aW9uSXRlbSBuYW1lc3BhY2UgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aFxuICogY29tcGxldGlvbiBpdGVtcy5cbiAqL1xuZXhwb3J0IHZhciBDb21wbGV0aW9uSXRlbTtcbihmdW5jdGlvbiAoQ29tcGxldGlvbkl0ZW0pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBjb21wbGV0aW9uIGl0ZW0gYW5kIHNlZWQgaXQgd2l0aCBhIGxhYmVsLlxuICAgICAqIEBwYXJhbSBsYWJlbCBUaGUgY29tcGxldGlvbiBpdGVtJ3MgbGFiZWxcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobGFiZWwpIHtcbiAgICAgICAgcmV0dXJuIHsgbGFiZWwgfTtcbiAgICB9XG4gICAgQ29tcGxldGlvbkl0ZW0uY3JlYXRlID0gY3JlYXRlO1xufSkoQ29tcGxldGlvbkl0ZW0gfHwgKENvbXBsZXRpb25JdGVtID0ge30pKTtcbi8qKlxuICogVGhlIENvbXBsZXRpb25MaXN0IG5hbWVzcGFjZSBwcm92aWRlcyBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoXG4gKiBjb21wbGV0aW9uIGxpc3RzLlxuICovXG5leHBvcnQgdmFyIENvbXBsZXRpb25MaXN0O1xuKGZ1bmN0aW9uIChDb21wbGV0aW9uTGlzdCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgY29tcGxldGlvbiBsaXN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIGl0ZW1zIFRoZSBjb21wbGV0aW9uIGl0ZW1zLlxuICAgICAqIEBwYXJhbSBpc0luY29tcGxldGUgVGhlIGxpc3QgaXMgbm90IGNvbXBsZXRlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShpdGVtcywgaXNJbmNvbXBsZXRlKSB7XG4gICAgICAgIHJldHVybiB7IGl0ZW1zOiBpdGVtcyA/IGl0ZW1zIDogW10sIGlzSW5jb21wbGV0ZTogISFpc0luY29tcGxldGUgfTtcbiAgICB9XG4gICAgQ29tcGxldGlvbkxpc3QuY3JlYXRlID0gY3JlYXRlO1xufSkoQ29tcGxldGlvbkxpc3QgfHwgKENvbXBsZXRpb25MaXN0ID0ge30pKTtcbmV4cG9ydCB2YXIgTWFya2VkU3RyaW5nO1xuKGZ1bmN0aW9uIChNYXJrZWRTdHJpbmcpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbWFya2VkIHN0cmluZyBmcm9tIHBsYWluIHRleHQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGxhaW5UZXh0IFRoZSBwbGFpbiB0ZXh0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZyb21QbGFpblRleHQocGxhaW5UZXh0KSB7XG4gICAgICAgIHJldHVybiBwbGFpblRleHQucmVwbGFjZSgvW1xcXFxgKl97fVtcXF0oKSMrXFwtLiFdL2csICdcXFxcJCYnKTsgLy8gZXNjYXBlIG1hcmtkb3duIHN5bnRheCB0b2tlbnM6IGh0dHA6Ly9kYXJpbmdmaXJlYmFsbC5uZXQvcHJvamVjdHMvbWFya2Rvd24vc3ludGF4I2JhY2tzbGFzaFxuICAgIH1cbiAgICBNYXJrZWRTdHJpbmcuZnJvbVBsYWluVGV4dCA9IGZyb21QbGFpblRleHQ7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgTWFya2VkU3RyaW5nfSB0eXBlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuc3RyaW5nKGNhbmRpZGF0ZSkgfHwgKElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLmxhbmd1YWdlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnZhbHVlKSk7XG4gICAgfVxuICAgIE1hcmtlZFN0cmluZy5pcyA9IGlzO1xufSkoTWFya2VkU3RyaW5nIHx8IChNYXJrZWRTdHJpbmcgPSB7fSkpO1xuZXhwb3J0IHZhciBIb3ZlcjtcbihmdW5jdGlvbiAoSG92ZXIpIHtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgY29uZm9ybXMgdG8gdGhlIHtAbGluayBIb3Zlcn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuICEhY2FuZGlkYXRlICYmIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiAoTWFya3VwQ29udGVudC5pcyhjYW5kaWRhdGUuY29udGVudHMpIHx8XG4gICAgICAgICAgICBNYXJrZWRTdHJpbmcuaXMoY2FuZGlkYXRlLmNvbnRlbnRzKSB8fFxuICAgICAgICAgICAgSXMudHlwZWRBcnJheShjYW5kaWRhdGUuY29udGVudHMsIE1hcmtlZFN0cmluZy5pcykpICYmICh2YWx1ZS5yYW5nZSA9PT0gdW5kZWZpbmVkIHx8IFJhbmdlLmlzKHZhbHVlLnJhbmdlKSk7XG4gICAgfVxuICAgIEhvdmVyLmlzID0gaXM7XG59KShIb3ZlciB8fCAoSG92ZXIgPSB7fSkpO1xuLyoqXG4gKiBUaGUgUGFyYW1ldGVySW5mb3JtYXRpb24gbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgUGFyYW1ldGVySW5mb3JtYXRpb259IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIFBhcmFtZXRlckluZm9ybWF0aW9uO1xuKGZ1bmN0aW9uIChQYXJhbWV0ZXJJbmZvcm1hdGlvbikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgcGFyYW1ldGVyIGluZm9ybWF0aW9uIGxpdGVyYWwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGFiZWwgQSBsYWJlbCBzdHJpbmcuXG4gICAgICogQHBhcmFtIGRvY3VtZW50YXRpb24gQSBkb2Mgc3RyaW5nLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShsYWJlbCwgZG9jdW1lbnRhdGlvbikge1xuICAgICAgICByZXR1cm4gZG9jdW1lbnRhdGlvbiA/IHsgbGFiZWwsIGRvY3VtZW50YXRpb24gfSA6IHsgbGFiZWwgfTtcbiAgICB9XG4gICAgUGFyYW1ldGVySW5mb3JtYXRpb24uY3JlYXRlID0gY3JlYXRlO1xufSkoUGFyYW1ldGVySW5mb3JtYXRpb24gfHwgKFBhcmFtZXRlckluZm9ybWF0aW9uID0ge30pKTtcbi8qKlxuICogVGhlIFNpZ25hdHVyZUluZm9ybWF0aW9uIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIFNpZ25hdHVyZUluZm9ybWF0aW9ufSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBTaWduYXR1cmVJbmZvcm1hdGlvbjtcbihmdW5jdGlvbiAoU2lnbmF0dXJlSW5mb3JtYXRpb24pIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUobGFiZWwsIGRvY3VtZW50YXRpb24sIC4uLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHsgbGFiZWwgfTtcbiAgICAgICAgaWYgKElzLmRlZmluZWQoZG9jdW1lbnRhdGlvbikpIHtcbiAgICAgICAgICAgIHJlc3VsdC5kb2N1bWVudGF0aW9uID0gZG9jdW1lbnRhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXMuZGVmaW5lZChwYXJhbWV0ZXJzKSkge1xuICAgICAgICAgICAgcmVzdWx0LnBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0LnBhcmFtZXRlcnMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBTaWduYXR1cmVJbmZvcm1hdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG59KShTaWduYXR1cmVJbmZvcm1hdGlvbiB8fCAoU2lnbmF0dXJlSW5mb3JtYXRpb24gPSB7fSkpO1xuLyoqXG4gKiBBIGRvY3VtZW50IGhpZ2hsaWdodCBraW5kLlxuICovXG5leHBvcnQgdmFyIERvY3VtZW50SGlnaGxpZ2h0S2luZDtcbihmdW5jdGlvbiAoRG9jdW1lbnRIaWdobGlnaHRLaW5kKSB7XG4gICAgLyoqXG4gICAgICogQSB0ZXh0dWFsIG9jY3VycmVuY2UuXG4gICAgICovXG4gICAgRG9jdW1lbnRIaWdobGlnaHRLaW5kLlRleHQgPSAxO1xuICAgIC8qKlxuICAgICAqIFJlYWQtYWNjZXNzIG9mIGEgc3ltYm9sLCBsaWtlIHJlYWRpbmcgYSB2YXJpYWJsZS5cbiAgICAgKi9cbiAgICBEb2N1bWVudEhpZ2hsaWdodEtpbmQuUmVhZCA9IDI7XG4gICAgLyoqXG4gICAgICogV3JpdGUtYWNjZXNzIG9mIGEgc3ltYm9sLCBsaWtlIHdyaXRpbmcgdG8gYSB2YXJpYWJsZS5cbiAgICAgKi9cbiAgICBEb2N1bWVudEhpZ2hsaWdodEtpbmQuV3JpdGUgPSAzO1xufSkoRG9jdW1lbnRIaWdobGlnaHRLaW5kIHx8IChEb2N1bWVudEhpZ2hsaWdodEtpbmQgPSB7fSkpO1xuLyoqXG4gKiBEb2N1bWVudEhpZ2hsaWdodCBuYW1lc3BhY2UgdG8gcHJvdmlkZSBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIERvY3VtZW50SGlnaGxpZ2h0fSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBEb2N1bWVudEhpZ2hsaWdodDtcbihmdW5jdGlvbiAoRG9jdW1lbnRIaWdobGlnaHQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBEb2N1bWVudEhpZ2hsaWdodCBvYmplY3QuXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSB0aGUgaGlnaGxpZ2h0IGFwcGxpZXMgdG8uXG4gICAgICogQHBhcmFtIGtpbmQgVGhlIGhpZ2hsaWdodCBraW5kXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCBraW5kKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IHJhbmdlIH07XG4gICAgICAgIGlmIChJcy5udW1iZXIoa2luZCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5raW5kID0ga2luZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBEb2N1bWVudEhpZ2hsaWdodC5jcmVhdGUgPSBjcmVhdGU7XG59KShEb2N1bWVudEhpZ2hsaWdodCB8fCAoRG9jdW1lbnRIaWdobGlnaHQgPSB7fSkpO1xuLyoqXG4gKiBBIHN5bWJvbCBraW5kLlxuICovXG5leHBvcnQgdmFyIFN5bWJvbEtpbmQ7XG4oZnVuY3Rpb24gKFN5bWJvbEtpbmQpIHtcbiAgICBTeW1ib2xLaW5kLkZpbGUgPSAxO1xuICAgIFN5bWJvbEtpbmQuTW9kdWxlID0gMjtcbiAgICBTeW1ib2xLaW5kLk5hbWVzcGFjZSA9IDM7XG4gICAgU3ltYm9sS2luZC5QYWNrYWdlID0gNDtcbiAgICBTeW1ib2xLaW5kLkNsYXNzID0gNTtcbiAgICBTeW1ib2xLaW5kLk1ldGhvZCA9IDY7XG4gICAgU3ltYm9sS2luZC5Qcm9wZXJ0eSA9IDc7XG4gICAgU3ltYm9sS2luZC5GaWVsZCA9IDg7XG4gICAgU3ltYm9sS2luZC5Db25zdHJ1Y3RvciA9IDk7XG4gICAgU3ltYm9sS2luZC5FbnVtID0gMTA7XG4gICAgU3ltYm9sS2luZC5JbnRlcmZhY2UgPSAxMTtcbiAgICBTeW1ib2xLaW5kLkZ1bmN0aW9uID0gMTI7XG4gICAgU3ltYm9sS2luZC5WYXJpYWJsZSA9IDEzO1xuICAgIFN5bWJvbEtpbmQuQ29uc3RhbnQgPSAxNDtcbiAgICBTeW1ib2xLaW5kLlN0cmluZyA9IDE1O1xuICAgIFN5bWJvbEtpbmQuTnVtYmVyID0gMTY7XG4gICAgU3ltYm9sS2luZC5Cb29sZWFuID0gMTc7XG4gICAgU3ltYm9sS2luZC5BcnJheSA9IDE4O1xuICAgIFN5bWJvbEtpbmQuT2JqZWN0ID0gMTk7XG4gICAgU3ltYm9sS2luZC5LZXkgPSAyMDtcbiAgICBTeW1ib2xLaW5kLk51bGwgPSAyMTtcbiAgICBTeW1ib2xLaW5kLkVudW1NZW1iZXIgPSAyMjtcbiAgICBTeW1ib2xLaW5kLlN0cnVjdCA9IDIzO1xuICAgIFN5bWJvbEtpbmQuRXZlbnQgPSAyNDtcbiAgICBTeW1ib2xLaW5kLk9wZXJhdG9yID0gMjU7XG4gICAgU3ltYm9sS2luZC5UeXBlUGFyYW1ldGVyID0gMjY7XG59KShTeW1ib2xLaW5kIHx8IChTeW1ib2xLaW5kID0ge30pKTtcbi8qKlxuICogU3ltYm9sIHRhZ3MgYXJlIGV4dHJhIGFubm90YXRpb25zIHRoYXQgdHdlYWsgdGhlIHJlbmRlcmluZyBvZiBhIHN5bWJvbC5cbiAqXG4gKiBAc2luY2UgMy4xNlxuICovXG5leHBvcnQgdmFyIFN5bWJvbFRhZztcbihmdW5jdGlvbiAoU3ltYm9sVGFnKSB7XG4gICAgLyoqXG4gICAgICogUmVuZGVyIGEgc3ltYm9sIGFzIG9ic29sZXRlLCB1c3VhbGx5IHVzaW5nIGEgc3RyaWtlLW91dC5cbiAgICAgKi9cbiAgICBTeW1ib2xUYWcuRGVwcmVjYXRlZCA9IDE7XG59KShTeW1ib2xUYWcgfHwgKFN5bWJvbFRhZyA9IHt9KSk7XG5leHBvcnQgdmFyIFN5bWJvbEluZm9ybWF0aW9uO1xuKGZ1bmN0aW9uIChTeW1ib2xJbmZvcm1hdGlvbikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgc3ltYm9sIGluZm9ybWF0aW9uIGxpdGVyYWwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSBraW5kIFRoZSBraW5kIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSBvZiB0aGUgbG9jYXRpb24gb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSByZXNvdXJjZSBvZiB0aGUgbG9jYXRpb24gb2Ygc3ltYm9sLlxuICAgICAqIEBwYXJhbSBjb250YWluZXJOYW1lIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgY29udGFpbmluZyB0aGUgc3ltYm9sLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShuYW1lLCBraW5kLCByYW5nZSwgdXJpLCBjb250YWluZXJOYW1lKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAga2luZCxcbiAgICAgICAgICAgIGxvY2F0aW9uOiB7IHVyaSwgcmFuZ2UgfVxuICAgICAgICB9O1xuICAgICAgICBpZiAoY29udGFpbmVyTmFtZSkge1xuICAgICAgICAgICAgcmVzdWx0LmNvbnRhaW5lck5hbWUgPSBjb250YWluZXJOYW1lO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIFN5bWJvbEluZm9ybWF0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKFN5bWJvbEluZm9ybWF0aW9uIHx8IChTeW1ib2xJbmZvcm1hdGlvbiA9IHt9KSk7XG5leHBvcnQgdmFyIFdvcmtzcGFjZVN5bWJvbDtcbihmdW5jdGlvbiAoV29ya3NwYWNlU3ltYm9sKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IHdvcmtzcGFjZSBzeW1ib2wuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSBraW5kIFRoZSBraW5kIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgcmVzb3VyY2Ugb2YgdGhlIGxvY2F0aW9uIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIHJhbmdlIEFuIG9wdGlvbnMgcmFuZ2Ugb2YgdGhlIGxvY2F0aW9uLlxuICAgICAqIEByZXR1cm5zIEEgV29ya3NwYWNlU3ltYm9sLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShuYW1lLCBraW5kLCB1cmksIHJhbmdlKSB7XG4gICAgICAgIHJldHVybiByYW5nZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IHsgbmFtZSwga2luZCwgbG9jYXRpb246IHsgdXJpLCByYW5nZSB9IH1cbiAgICAgICAgICAgIDogeyBuYW1lLCBraW5kLCBsb2NhdGlvbjogeyB1cmkgfSB9O1xuICAgIH1cbiAgICBXb3Jrc3BhY2VTeW1ib2wuY3JlYXRlID0gY3JlYXRlO1xufSkoV29ya3NwYWNlU3ltYm9sIHx8IChXb3Jrc3BhY2VTeW1ib2wgPSB7fSkpO1xuZXhwb3J0IHZhciBEb2N1bWVudFN5bWJvbDtcbihmdW5jdGlvbiAoRG9jdW1lbnRTeW1ib2wpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHN5bWJvbCBpbmZvcm1hdGlvbiBsaXRlcmFsLlxuICAgICAqXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gZGV0YWlsIFRoZSBkZXRhaWwgb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0ga2luZCBUaGUga2luZCBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2Ugb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gc2VsZWN0aW9uUmFuZ2UgVGhlIHNlbGVjdGlvblJhbmdlIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIGNoaWxkcmVuIENoaWxkcmVuIG9mIHRoZSBzeW1ib2wuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKG5hbWUsIGRldGFpbCwga2luZCwgcmFuZ2UsIHNlbGVjdGlvblJhbmdlLCBjaGlsZHJlbikge1xuICAgICAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGRldGFpbCxcbiAgICAgICAgICAgIGtpbmQsXG4gICAgICAgICAgICByYW5nZSxcbiAgICAgICAgICAgIHNlbGVjdGlvblJhbmdlXG4gICAgICAgIH07XG4gICAgICAgIGlmIChjaGlsZHJlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBEb2N1bWVudFN5bWJvbC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBEb2N1bWVudFN5bWJvbH0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJlxuICAgICAgICAgICAgSXMuc3RyaW5nKGNhbmRpZGF0ZS5uYW1lKSAmJiBJcy5udW1iZXIoY2FuZGlkYXRlLmtpbmQpICYmXG4gICAgICAgICAgICBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5zZWxlY3Rpb25SYW5nZSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuZGV0YWlsID09PSB1bmRlZmluZWQgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS5kZXRhaWwpKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5kZXByZWNhdGVkID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUuZGVwcmVjYXRlZCkpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmNoaWxkcmVuID09PSB1bmRlZmluZWQgfHwgQXJyYXkuaXNBcnJheShjYW5kaWRhdGUuY2hpbGRyZW4pKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS50YWdzID09PSB1bmRlZmluZWQgfHwgQXJyYXkuaXNBcnJheShjYW5kaWRhdGUudGFncykpO1xuICAgIH1cbiAgICBEb2N1bWVudFN5bWJvbC5pcyA9IGlzO1xufSkoRG9jdW1lbnRTeW1ib2wgfHwgKERvY3VtZW50U3ltYm9sID0ge30pKTtcbi8qKlxuICogQSBzZXQgb2YgcHJlZGVmaW5lZCBjb2RlIGFjdGlvbiBraW5kc1xuICovXG5leHBvcnQgdmFyIENvZGVBY3Rpb25LaW5kO1xuKGZ1bmN0aW9uIChDb2RlQWN0aW9uS2luZCkge1xuICAgIC8qKlxuICAgICAqIEVtcHR5IGtpbmQuXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuRW1wdHkgPSAnJztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIHF1aWNrZml4IGFjdGlvbnM6ICdxdWlja2ZpeCdcbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5RdWlja0ZpeCA9ICdxdWlja2ZpeCc7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciByZWZhY3RvcmluZyBhY3Rpb25zOiAncmVmYWN0b3InXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuUmVmYWN0b3IgPSAncmVmYWN0b3InO1xuICAgIC8qKlxuICAgICAqIEJhc2Uga2luZCBmb3IgcmVmYWN0b3JpbmcgZXh0cmFjdGlvbiBhY3Rpb25zOiAncmVmYWN0b3IuZXh0cmFjdCdcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgZXh0cmFjdCBhY3Rpb25zOlxuICAgICAqXG4gICAgICogLSBFeHRyYWN0IG1ldGhvZFxuICAgICAqIC0gRXh0cmFjdCBmdW5jdGlvblxuICAgICAqIC0gRXh0cmFjdCB2YXJpYWJsZVxuICAgICAqIC0gRXh0cmFjdCBpbnRlcmZhY2UgZnJvbSBjbGFzc1xuICAgICAqIC0gLi4uXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuUmVmYWN0b3JFeHRyYWN0ID0gJ3JlZmFjdG9yLmV4dHJhY3QnO1xuICAgIC8qKlxuICAgICAqIEJhc2Uga2luZCBmb3IgcmVmYWN0b3JpbmcgaW5saW5lIGFjdGlvbnM6ICdyZWZhY3Rvci5pbmxpbmUnXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIGlubGluZSBhY3Rpb25zOlxuICAgICAqXG4gICAgICogLSBJbmxpbmUgZnVuY3Rpb25cbiAgICAgKiAtIElubGluZSB2YXJpYWJsZVxuICAgICAqIC0gSW5saW5lIGNvbnN0YW50XG4gICAgICogLSAuLi5cbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5SZWZhY3RvcklubGluZSA9ICdyZWZhY3Rvci5pbmxpbmUnO1xuICAgIC8qKlxuICAgICAqIEJhc2Uga2luZCBmb3IgcmVmYWN0b3JpbmcgcmV3cml0ZSBhY3Rpb25zOiAncmVmYWN0b3IucmV3cml0ZSdcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgcmV3cml0ZSBhY3Rpb25zOlxuICAgICAqXG4gICAgICogLSBDb252ZXJ0IEphdmFTY3JpcHQgZnVuY3Rpb24gdG8gY2xhc3NcbiAgICAgKiAtIEFkZCBvciByZW1vdmUgcGFyYW1ldGVyXG4gICAgICogLSBFbmNhcHN1bGF0ZSBmaWVsZFxuICAgICAqIC0gTWFrZSBtZXRob2Qgc3RhdGljXG4gICAgICogLSBNb3ZlIG1ldGhvZCB0byBiYXNlIGNsYXNzXG4gICAgICogLSAuLi5cbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5SZWZhY3RvclJld3JpdGUgPSAncmVmYWN0b3IucmV3cml0ZSc7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciBzb3VyY2UgYWN0aW9uczogYHNvdXJjZWBcbiAgICAgKlxuICAgICAqIFNvdXJjZSBjb2RlIGFjdGlvbnMgYXBwbHkgdG8gdGhlIGVudGlyZSBmaWxlLlxuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlNvdXJjZSA9ICdzb3VyY2UnO1xuICAgIC8qKlxuICAgICAqIEJhc2Uga2luZCBmb3IgYW4gb3JnYW5pemUgaW1wb3J0cyBzb3VyY2UgYWN0aW9uOiBgc291cmNlLm9yZ2FuaXplSW1wb3J0c2BcbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5Tb3VyY2VPcmdhbml6ZUltcG9ydHMgPSAnc291cmNlLm9yZ2FuaXplSW1wb3J0cyc7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciBhdXRvLWZpeCBzb3VyY2UgYWN0aW9uczogYHNvdXJjZS5maXhBbGxgLlxuICAgICAqXG4gICAgICogRml4IGFsbCBhY3Rpb25zIGF1dG9tYXRpY2FsbHkgZml4IGVycm9ycyB0aGF0IGhhdmUgYSBjbGVhciBmaXggdGhhdCBkbyBub3QgcmVxdWlyZSB1c2VyIGlucHV0LlxuICAgICAqIFRoZXkgc2hvdWxkIG5vdCBzdXBwcmVzcyBlcnJvcnMgb3IgcGVyZm9ybSB1bnNhZmUgZml4ZXMgc3VjaCBhcyBnZW5lcmF0aW5nIG5ldyB0eXBlcyBvciBjbGFzc2VzLlxuICAgICAqXG4gICAgICogQHNpbmNlIDMuMTUuMFxuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlNvdXJjZUZpeEFsbCA9ICdzb3VyY2UuZml4QWxsJztcbn0pKENvZGVBY3Rpb25LaW5kIHx8IChDb2RlQWN0aW9uS2luZCA9IHt9KSk7XG4vKipcbiAqIFRoZSByZWFzb24gd2h5IGNvZGUgYWN0aW9ucyB3ZXJlIHJlcXVlc3RlZC5cbiAqXG4gKiBAc2luY2UgMy4xNy4wXG4gKi9cbmV4cG9ydCB2YXIgQ29kZUFjdGlvblRyaWdnZXJLaW5kO1xuKGZ1bmN0aW9uIChDb2RlQWN0aW9uVHJpZ2dlcktpbmQpIHtcbiAgICAvKipcbiAgICAgKiBDb2RlIGFjdGlvbnMgd2VyZSBleHBsaWNpdGx5IHJlcXVlc3RlZCBieSB0aGUgdXNlciBvciBieSBhbiBleHRlbnNpb24uXG4gICAgICovXG4gICAgQ29kZUFjdGlvblRyaWdnZXJLaW5kLkludm9rZWQgPSAxO1xuICAgIC8qKlxuICAgICAqIENvZGUgYWN0aW9ucyB3ZXJlIHJlcXVlc3RlZCBhdXRvbWF0aWNhbGx5LlxuICAgICAqXG4gICAgICogVGhpcyB0eXBpY2FsbHkgaGFwcGVucyB3aGVuIGN1cnJlbnQgc2VsZWN0aW9uIGluIGEgZmlsZSBjaGFuZ2VzLCBidXQgY2FuXG4gICAgICogYWxzbyBiZSB0cmlnZ2VyZWQgd2hlbiBmaWxlIGNvbnRlbnQgY2hhbmdlcy5cbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uVHJpZ2dlcktpbmQuQXV0b21hdGljID0gMjtcbn0pKENvZGVBY3Rpb25UcmlnZ2VyS2luZCB8fCAoQ29kZUFjdGlvblRyaWdnZXJLaW5kID0ge30pKTtcbi8qKlxuICogVGhlIENvZGVBY3Rpb25Db250ZXh0IG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIENvZGVBY3Rpb25Db250ZXh0fSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBDb2RlQWN0aW9uQ29udGV4dDtcbihmdW5jdGlvbiAoQ29kZUFjdGlvbkNvbnRleHQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENvZGVBY3Rpb25Db250ZXh0IGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGRpYWdub3N0aWNzLCBvbmx5LCB0cmlnZ2VyS2luZCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0geyBkaWFnbm9zdGljcyB9O1xuICAgICAgICBpZiAob25seSAhPT0gdW5kZWZpbmVkICYmIG9ubHkgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJlc3VsdC5vbmx5ID0gb25seTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJpZ2dlcktpbmQgIT09IHVuZGVmaW5lZCAmJiB0cmlnZ2VyS2luZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmVzdWx0LnRyaWdnZXJLaW5kID0gdHJpZ2dlcktpbmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgQ29kZUFjdGlvbkNvbnRleHQuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgQ29kZUFjdGlvbkNvbnRleHR9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMudHlwZWRBcnJheShjYW5kaWRhdGUuZGlhZ25vc3RpY3MsIERpYWdub3N0aWMuaXMpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLm9ubHkgPT09IHVuZGVmaW5lZCB8fCBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS5vbmx5LCBJcy5zdHJpbmcpKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS50cmlnZ2VyS2luZCA9PT0gdW5kZWZpbmVkIHx8IGNhbmRpZGF0ZS50cmlnZ2VyS2luZCA9PT0gQ29kZUFjdGlvblRyaWdnZXJLaW5kLkludm9rZWQgfHwgY2FuZGlkYXRlLnRyaWdnZXJLaW5kID09PSBDb2RlQWN0aW9uVHJpZ2dlcktpbmQuQXV0b21hdGljKTtcbiAgICB9XG4gICAgQ29kZUFjdGlvbkNvbnRleHQuaXMgPSBpcztcbn0pKENvZGVBY3Rpb25Db250ZXh0IHx8IChDb2RlQWN0aW9uQ29udGV4dCA9IHt9KSk7XG5leHBvcnQgdmFyIENvZGVBY3Rpb247XG4oZnVuY3Rpb24gKENvZGVBY3Rpb24pIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUodGl0bGUsIGtpbmRPckNvbW1hbmRPckVkaXQsIGtpbmQpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHsgdGl0bGUgfTtcbiAgICAgICAgbGV0IGNoZWNrS2luZCA9IHRydWU7XG4gICAgICAgIGlmICh0eXBlb2Yga2luZE9yQ29tbWFuZE9yRWRpdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNoZWNrS2luZCA9IGZhbHNlO1xuICAgICAgICAgICAgcmVzdWx0LmtpbmQgPSBraW5kT3JDb21tYW5kT3JFZGl0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKENvbW1hbmQuaXMoa2luZE9yQ29tbWFuZE9yRWRpdCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5jb21tYW5kID0ga2luZE9yQ29tbWFuZE9yRWRpdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdC5lZGl0ID0ga2luZE9yQ29tbWFuZE9yRWRpdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hlY2tLaW5kICYmIGtpbmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmtpbmQgPSBraW5kO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIENvZGVBY3Rpb24uY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnRpdGxlKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5kaWFnbm9zdGljcyA9PT0gdW5kZWZpbmVkIHx8IElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLmRpYWdub3N0aWNzLCBEaWFnbm9zdGljLmlzKSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUua2luZCA9PT0gdW5kZWZpbmVkIHx8IElzLnN0cmluZyhjYW5kaWRhdGUua2luZCkpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmVkaXQgIT09IHVuZGVmaW5lZCB8fCBjYW5kaWRhdGUuY29tbWFuZCAhPT0gdW5kZWZpbmVkKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5jb21tYW5kID09PSB1bmRlZmluZWQgfHwgQ29tbWFuZC5pcyhjYW5kaWRhdGUuY29tbWFuZCkpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmlzUHJlZmVycmVkID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUuaXNQcmVmZXJyZWQpKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5lZGl0ID09PSB1bmRlZmluZWQgfHwgV29ya3NwYWNlRWRpdC5pcyhjYW5kaWRhdGUuZWRpdCkpO1xuICAgIH1cbiAgICBDb2RlQWN0aW9uLmlzID0gaXM7XG59KShDb2RlQWN0aW9uIHx8IChDb2RlQWN0aW9uID0ge30pKTtcbi8qKlxuICogVGhlIENvZGVMZW5zIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIENvZGVMZW5zfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBDb2RlTGVucztcbihmdW5jdGlvbiAoQ29kZUxlbnMpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENvZGVMZW5zIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCBkYXRhKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IHJhbmdlIH07XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKGRhdGEpKSB7XG4gICAgICAgICAgICByZXN1bHQuZGF0YSA9IGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgQ29kZUxlbnMuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgQ29kZUxlbnN9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5jb21tYW5kKSB8fCBDb21tYW5kLmlzKGNhbmRpZGF0ZS5jb21tYW5kKSk7XG4gICAgfVxuICAgIENvZGVMZW5zLmlzID0gaXM7XG59KShDb2RlTGVucyB8fCAoQ29kZUxlbnMgPSB7fSkpO1xuLyoqXG4gKiBUaGUgRm9ybWF0dGluZ09wdGlvbnMgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgRm9ybWF0dGluZ09wdGlvbnN9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIEZvcm1hdHRpbmdPcHRpb25zO1xuKGZ1bmN0aW9uIChGb3JtYXR0aW5nT3B0aW9ucykge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgRm9ybWF0dGluZ09wdGlvbnMgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodGFiU2l6ZSwgaW5zZXJ0U3BhY2VzKSB7XG4gICAgICAgIHJldHVybiB7IHRhYlNpemUsIGluc2VydFNwYWNlcyB9O1xuICAgIH1cbiAgICBGb3JtYXR0aW5nT3B0aW9ucy5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBGb3JtYXR0aW5nT3B0aW9uc30gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy51aW50ZWdlcihjYW5kaWRhdGUudGFiU2l6ZSkgJiYgSXMuYm9vbGVhbihjYW5kaWRhdGUuaW5zZXJ0U3BhY2VzKTtcbiAgICB9XG4gICAgRm9ybWF0dGluZ09wdGlvbnMuaXMgPSBpcztcbn0pKEZvcm1hdHRpbmdPcHRpb25zIHx8IChGb3JtYXR0aW5nT3B0aW9ucyA9IHt9KSk7XG4vKipcbiAqIFRoZSBEb2N1bWVudExpbmsgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgRG9jdW1lbnRMaW5rfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBEb2N1bWVudExpbms7XG4oZnVuY3Rpb24gKERvY3VtZW50TGluaykge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgRG9jdW1lbnRMaW5rIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCB0YXJnZXQsIGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIHRhcmdldCwgZGF0YSB9O1xuICAgIH1cbiAgICBEb2N1bWVudExpbmsuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgRG9jdW1lbnRMaW5rfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUudGFyZ2V0KSB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLnRhcmdldCkpO1xuICAgIH1cbiAgICBEb2N1bWVudExpbmsuaXMgPSBpcztcbn0pKERvY3VtZW50TGluayB8fCAoRG9jdW1lbnRMaW5rID0ge30pKTtcbi8qKlxuICogVGhlIFNlbGVjdGlvblJhbmdlIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb24gdG8gd29yayB3aXRoXG4gKiBTZWxlY3Rpb25SYW5nZSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBTZWxlY3Rpb25SYW5nZTtcbihmdW5jdGlvbiAoU2VsZWN0aW9uUmFuZ2UpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFNlbGVjdGlvblJhbmdlXG4gICAgICogQHBhcmFtIHJhbmdlIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0gcGFyZW50IGFuIG9wdGlvbmFsIHBhcmVudC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIHBhcmVudCkge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgcGFyZW50IH07XG4gICAgfVxuICAgIFNlbGVjdGlvblJhbmdlLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiAoY2FuZGlkYXRlLnBhcmVudCA9PT0gdW5kZWZpbmVkIHx8IFNlbGVjdGlvblJhbmdlLmlzKGNhbmRpZGF0ZS5wYXJlbnQpKTtcbiAgICB9XG4gICAgU2VsZWN0aW9uUmFuZ2UuaXMgPSBpcztcbn0pKFNlbGVjdGlvblJhbmdlIHx8IChTZWxlY3Rpb25SYW5nZSA9IHt9KSk7XG4vKipcbiAqIEEgc2V0IG9mIHByZWRlZmluZWQgdG9rZW4gdHlwZXMuIFRoaXMgc2V0IGlzIG5vdCBmaXhlZFxuICogYW4gY2xpZW50cyBjYW4gc3BlY2lmeSBhZGRpdGlvbmFsIHRva2VuIHR5cGVzIHZpYSB0aGVcbiAqIGNvcnJlc3BvbmRpbmcgY2xpZW50IGNhcGFiaWxpdGllcy5cbiAqXG4gKiBAc2luY2UgMy4xNi4wXG4gKi9cbmV4cG9ydCB2YXIgU2VtYW50aWNUb2tlblR5cGVzO1xuKGZ1bmN0aW9uIChTZW1hbnRpY1Rva2VuVHlwZXMpIHtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJuYW1lc3BhY2VcIl0gPSBcIm5hbWVzcGFjZVwiO1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBnZW5lcmljIHR5cGUuIEFjdHMgYXMgYSBmYWxsYmFjayBmb3IgdHlwZXMgd2hpY2ggY2FuJ3QgYmUgbWFwcGVkIHRvXG4gICAgICogYSBzcGVjaWZpYyB0eXBlIGxpa2UgY2xhc3Mgb3IgZW51bS5cbiAgICAgKi9cbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJ0eXBlXCJdID0gXCJ0eXBlXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wiY2xhc3NcIl0gPSBcImNsYXNzXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wiZW51bVwiXSA9IFwiZW51bVwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImludGVyZmFjZVwiXSA9IFwiaW50ZXJmYWNlXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wic3RydWN0XCJdID0gXCJzdHJ1Y3RcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJ0eXBlUGFyYW1ldGVyXCJdID0gXCJ0eXBlUGFyYW1ldGVyXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wicGFyYW1ldGVyXCJdID0gXCJwYXJhbWV0ZXJcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJ2YXJpYWJsZVwiXSA9IFwidmFyaWFibGVcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJwcm9wZXJ0eVwiXSA9IFwicHJvcGVydHlcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJlbnVtTWVtYmVyXCJdID0gXCJlbnVtTWVtYmVyXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wiZXZlbnRcIl0gPSBcImV2ZW50XCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wiZnVuY3Rpb25cIl0gPSBcImZ1bmN0aW9uXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wibWV0aG9kXCJdID0gXCJtZXRob2RcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJtYWNyb1wiXSA9IFwibWFjcm9cIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJrZXl3b3JkXCJdID0gXCJrZXl3b3JkXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wibW9kaWZpZXJcIl0gPSBcIm1vZGlmaWVyXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wiY29tbWVudFwiXSA9IFwiY29tbWVudFwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInN0cmluZ1wiXSA9IFwic3RyaW5nXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wibnVtYmVyXCJdID0gXCJudW1iZXJcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJyZWdleHBcIl0gPSBcInJlZ2V4cFwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcIm9wZXJhdG9yXCJdID0gXCJvcGVyYXRvclwiO1xuICAgIC8qKlxuICAgICAqIEBzaW5jZSAzLjE3LjBcbiAgICAgKi9cbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJkZWNvcmF0b3JcIl0gPSBcImRlY29yYXRvclwiO1xufSkoU2VtYW50aWNUb2tlblR5cGVzIHx8IChTZW1hbnRpY1Rva2VuVHlwZXMgPSB7fSkpO1xuLyoqXG4gKiBBIHNldCBvZiBwcmVkZWZpbmVkIHRva2VuIG1vZGlmaWVycy4gVGhpcyBzZXQgaXMgbm90IGZpeGVkXG4gKiBhbiBjbGllbnRzIGNhbiBzcGVjaWZ5IGFkZGl0aW9uYWwgdG9rZW4gdHlwZXMgdmlhIHRoZVxuICogY29ycmVzcG9uZGluZyBjbGllbnQgY2FwYWJpbGl0aWVzLlxuICpcbiAqIEBzaW5jZSAzLjE2LjBcbiAqL1xuZXhwb3J0IHZhciBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzO1xuKGZ1bmN0aW9uIChTZW1hbnRpY1Rva2VuTW9kaWZpZXJzKSB7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcImRlY2xhcmF0aW9uXCJdID0gXCJkZWNsYXJhdGlvblwiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJkZWZpbml0aW9uXCJdID0gXCJkZWZpbml0aW9uXCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcInJlYWRvbmx5XCJdID0gXCJyZWFkb25seVwiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJzdGF0aWNcIl0gPSBcInN0YXRpY1wiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJkZXByZWNhdGVkXCJdID0gXCJkZXByZWNhdGVkXCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcImFic3RyYWN0XCJdID0gXCJhYnN0cmFjdFwiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJhc3luY1wiXSA9IFwiYXN5bmNcIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wibW9kaWZpY2F0aW9uXCJdID0gXCJtb2RpZmljYXRpb25cIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wiZG9jdW1lbnRhdGlvblwiXSA9IFwiZG9jdW1lbnRhdGlvblwiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJkZWZhdWx0TGlicmFyeVwiXSA9IFwiZGVmYXVsdExpYnJhcnlcIjtcbn0pKFNlbWFudGljVG9rZW5Nb2RpZmllcnMgfHwgKFNlbWFudGljVG9rZW5Nb2RpZmllcnMgPSB7fSkpO1xuLyoqXG4gKiBAc2luY2UgMy4xNi4wXG4gKi9cbmV4cG9ydCB2YXIgU2VtYW50aWNUb2tlbnM7XG4oZnVuY3Rpb24gKFNlbWFudGljVG9rZW5zKSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgKGNhbmRpZGF0ZS5yZXN1bHRJZCA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBjYW5kaWRhdGUucmVzdWx0SWQgPT09ICdzdHJpbmcnKSAmJlxuICAgICAgICAgICAgQXJyYXkuaXNBcnJheShjYW5kaWRhdGUuZGF0YSkgJiYgKGNhbmRpZGF0ZS5kYXRhLmxlbmd0aCA9PT0gMCB8fCB0eXBlb2YgY2FuZGlkYXRlLmRhdGFbMF0gPT09ICdudW1iZXInKTtcbiAgICB9XG4gICAgU2VtYW50aWNUb2tlbnMuaXMgPSBpcztcbn0pKFNlbWFudGljVG9rZW5zIHx8IChTZW1hbnRpY1Rva2VucyA9IHt9KSk7XG4vKipcbiAqIFRoZSBJbmxpbmVWYWx1ZVRleHQgbmFtZXNwYWNlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGggSW5saW5lVmFsdWVUZXh0cy5cbiAqXG4gKiBAc2luY2UgMy4xNy4wXG4gKi9cbmV4cG9ydCB2YXIgSW5saW5lVmFsdWVUZXh0O1xuKGZ1bmN0aW9uIChJbmxpbmVWYWx1ZVRleHQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IElubGluZVZhbHVlVGV4dCBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgdGV4dCkge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgdGV4dCB9O1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZVRleHQuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICE9PSB1bmRlZmluZWQgJiYgY2FuZGlkYXRlICE9PSBudWxsICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS50ZXh0KTtcbiAgICB9XG4gICAgSW5saW5lVmFsdWVUZXh0LmlzID0gaXM7XG59KShJbmxpbmVWYWx1ZVRleHQgfHwgKElubGluZVZhbHVlVGV4dCA9IHt9KSk7XG4vKipcbiAqIFRoZSBJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwIG5hbWVzcGFjZSBwcm92aWRlcyBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIElubGluZVZhbHVlVmFyaWFibGVMb29rdXBzLlxuICpcbiAqIEBzaW5jZSAzLjE3LjBcbiAqL1xuZXhwb3J0IHZhciBJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwO1xuKGZ1bmN0aW9uIChJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBJbmxpbmVWYWx1ZVRleHQgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIHZhcmlhYmxlTmFtZSwgY2FzZVNlbnNpdGl2ZUxvb2t1cCkge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgdmFyaWFibGVOYW1lLCBjYXNlU2Vuc2l0aXZlTG9va3VwIH07XG4gICAgfVxuICAgIElubGluZVZhbHVlVmFyaWFibGVMb29rdXAuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICE9PSB1bmRlZmluZWQgJiYgY2FuZGlkYXRlICE9PSBudWxsICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgSXMuYm9vbGVhbihjYW5kaWRhdGUuY2FzZVNlbnNpdGl2ZUxvb2t1cClcbiAgICAgICAgICAgICYmIChJcy5zdHJpbmcoY2FuZGlkYXRlLnZhcmlhYmxlTmFtZSkgfHwgY2FuZGlkYXRlLnZhcmlhYmxlTmFtZSA9PT0gdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cC5pcyA9IGlzO1xufSkoSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cCB8fCAoSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cCA9IHt9KSk7XG4vKipcbiAqIFRoZSBJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbiBuYW1lc3BhY2UgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCBJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbi5cbiAqXG4gKiBAc2luY2UgMy4xNy4wXG4gKi9cbmV4cG9ydCB2YXIgSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb247XG4oZnVuY3Rpb24gKElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbiBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgZXhwcmVzc2lvbikge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgZXhwcmVzc2lvbiB9O1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgIT09IHVuZGVmaW5lZCAmJiBjYW5kaWRhdGUgIT09IG51bGwgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKVxuICAgICAgICAgICAgJiYgKElzLnN0cmluZyhjYW5kaWRhdGUuZXhwcmVzc2lvbikgfHwgY2FuZGlkYXRlLmV4cHJlc3Npb24gPT09IHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uLmlzID0gaXM7XG59KShJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbiB8fCAoSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24gPSB7fSkpO1xuLyoqXG4gKiBUaGUgSW5saW5lVmFsdWVDb250ZXh0IG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIElubGluZVZhbHVlQ29udGV4dH0gbGl0ZXJhbHMuXG4gKlxuICogQHNpbmNlIDMuMTcuMFxuICovXG5leHBvcnQgdmFyIElubGluZVZhbHVlQ29udGV4dDtcbihmdW5jdGlvbiAoSW5saW5lVmFsdWVDb250ZXh0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBJbmxpbmVWYWx1ZUNvbnRleHQgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUoZnJhbWVJZCwgc3RvcHBlZExvY2F0aW9uKSB7XG4gICAgICAgIHJldHVybiB7IGZyYW1lSWQsIHN0b3BwZWRMb2NhdGlvbiB9O1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZUNvbnRleHQuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgSW5saW5lVmFsdWVDb250ZXh0fSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgUmFuZ2UuaXModmFsdWUuc3RvcHBlZExvY2F0aW9uKTtcbiAgICB9XG4gICAgSW5saW5lVmFsdWVDb250ZXh0LmlzID0gaXM7XG59KShJbmxpbmVWYWx1ZUNvbnRleHQgfHwgKElubGluZVZhbHVlQ29udGV4dCA9IHt9KSk7XG4vKipcbiAqIElubGF5IGhpbnQga2luZHMuXG4gKlxuICogQHNpbmNlIDMuMTcuMFxuICovXG5leHBvcnQgdmFyIElubGF5SGludEtpbmQ7XG4oZnVuY3Rpb24gKElubGF5SGludEtpbmQpIHtcbiAgICAvKipcbiAgICAgKiBBbiBpbmxheSBoaW50IHRoYXQgZm9yIGEgdHlwZSBhbm5vdGF0aW9uLlxuICAgICAqL1xuICAgIElubGF5SGludEtpbmQuVHlwZSA9IDE7XG4gICAgLyoqXG4gICAgICogQW4gaW5sYXkgaGludCB0aGF0IGlzIGZvciBhIHBhcmFtZXRlci5cbiAgICAgKi9cbiAgICBJbmxheUhpbnRLaW5kLlBhcmFtZXRlciA9IDI7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSAxIHx8IHZhbHVlID09PSAyO1xuICAgIH1cbiAgICBJbmxheUhpbnRLaW5kLmlzID0gaXM7XG59KShJbmxheUhpbnRLaW5kIHx8IChJbmxheUhpbnRLaW5kID0ge30pKTtcbmV4cG9ydCB2YXIgSW5sYXlIaW50TGFiZWxQYXJ0O1xuKGZ1bmN0aW9uIChJbmxheUhpbnRMYWJlbFBhcnQpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHsgdmFsdWUgfTtcbiAgICB9XG4gICAgSW5sYXlIaW50TGFiZWxQYXJ0LmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS50b29sdGlwID09PSB1bmRlZmluZWQgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS50b29sdGlwKSB8fCBNYXJrdXBDb250ZW50LmlzKGNhbmRpZGF0ZS50b29sdGlwKSlcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUubG9jYXRpb24gPT09IHVuZGVmaW5lZCB8fCBMb2NhdGlvbi5pcyhjYW5kaWRhdGUubG9jYXRpb24pKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS5jb21tYW5kID09PSB1bmRlZmluZWQgfHwgQ29tbWFuZC5pcyhjYW5kaWRhdGUuY29tbWFuZCkpO1xuICAgIH1cbiAgICBJbmxheUhpbnRMYWJlbFBhcnQuaXMgPSBpcztcbn0pKElubGF5SGludExhYmVsUGFydCB8fCAoSW5sYXlIaW50TGFiZWxQYXJ0ID0ge30pKTtcbmV4cG9ydCB2YXIgSW5sYXlIaW50O1xuKGZ1bmN0aW9uIChJbmxheUhpbnQpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUocG9zaXRpb24sIGxhYmVsLCBraW5kKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHsgcG9zaXRpb24sIGxhYmVsIH07XG4gICAgICAgIGlmIChraW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5raW5kID0ga2luZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBJbmxheUhpbnQuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIFBvc2l0aW9uLmlzKGNhbmRpZGF0ZS5wb3NpdGlvbilcbiAgICAgICAgICAgICYmIChJcy5zdHJpbmcoY2FuZGlkYXRlLmxhYmVsKSB8fCBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS5sYWJlbCwgSW5sYXlIaW50TGFiZWxQYXJ0LmlzKSlcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUua2luZCA9PT0gdW5kZWZpbmVkIHx8IElubGF5SGludEtpbmQuaXMoY2FuZGlkYXRlLmtpbmQpKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS50ZXh0RWRpdHMgPT09IHVuZGVmaW5lZCkgfHwgSXMudHlwZWRBcnJheShjYW5kaWRhdGUudGV4dEVkaXRzLCBUZXh0RWRpdC5pcylcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUudG9vbHRpcCA9PT0gdW5kZWZpbmVkIHx8IElzLnN0cmluZyhjYW5kaWRhdGUudG9vbHRpcCkgfHwgTWFya3VwQ29udGVudC5pcyhjYW5kaWRhdGUudG9vbHRpcCkpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLnBhZGRpbmdMZWZ0ID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUucGFkZGluZ0xlZnQpKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS5wYWRkaW5nUmlnaHQgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5wYWRkaW5nUmlnaHQpKTtcbiAgICB9XG4gICAgSW5sYXlIaW50LmlzID0gaXM7XG59KShJbmxheUhpbnQgfHwgKElubGF5SGludCA9IHt9KSk7XG5leHBvcnQgdmFyIFN0cmluZ1ZhbHVlO1xuKGZ1bmN0aW9uIChTdHJpbmdWYWx1ZSkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVNuaXBwZXQodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHsga2luZDogJ3NuaXBwZXQnLCB2YWx1ZSB9O1xuICAgIH1cbiAgICBTdHJpbmdWYWx1ZS5jcmVhdGVTbmlwcGV0ID0gY3JlYXRlU25pcHBldDtcbn0pKFN0cmluZ1ZhbHVlIHx8IChTdHJpbmdWYWx1ZSA9IHt9KSk7XG5leHBvcnQgdmFyIElubGluZUNvbXBsZXRpb25JdGVtO1xuKGZ1bmN0aW9uIChJbmxpbmVDb21wbGV0aW9uSXRlbSkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShpbnNlcnRUZXh0LCBmaWx0ZXJUZXh0LCByYW5nZSwgY29tbWFuZCkge1xuICAgICAgICByZXR1cm4geyBpbnNlcnRUZXh0LCBmaWx0ZXJUZXh0LCByYW5nZSwgY29tbWFuZCB9O1xuICAgIH1cbiAgICBJbmxpbmVDb21wbGV0aW9uSXRlbS5jcmVhdGUgPSBjcmVhdGU7XG59KShJbmxpbmVDb21wbGV0aW9uSXRlbSB8fCAoSW5saW5lQ29tcGxldGlvbkl0ZW0gPSB7fSkpO1xuZXhwb3J0IHZhciBJbmxpbmVDb21wbGV0aW9uTGlzdDtcbihmdW5jdGlvbiAoSW5saW5lQ29tcGxldGlvbkxpc3QpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUoaXRlbXMpIHtcbiAgICAgICAgcmV0dXJuIHsgaXRlbXMgfTtcbiAgICB9XG4gICAgSW5saW5lQ29tcGxldGlvbkxpc3QuY3JlYXRlID0gY3JlYXRlO1xufSkoSW5saW5lQ29tcGxldGlvbkxpc3QgfHwgKElubGluZUNvbXBsZXRpb25MaXN0ID0ge30pKTtcbi8qKlxuICogRGVzY3JpYmVzIGhvdyBhbiB7QGxpbmsgSW5saW5lQ29tcGxldGlvbkl0ZW1Qcm92aWRlciBpbmxpbmUgY29tcGxldGlvbiBwcm92aWRlcn0gd2FzIHRyaWdnZXJlZC5cbiAqXG4gKiBAc2luY2UgMy4xOC4wXG4gKiBAcHJvcG9zZWRcbiAqL1xuZXhwb3J0IHZhciBJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmQ7XG4oZnVuY3Rpb24gKElubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZCkge1xuICAgIC8qKlxuICAgICAqIENvbXBsZXRpb24gd2FzIHRyaWdnZXJlZCBleHBsaWNpdGx5IGJ5IGEgdXNlciBnZXN0dXJlLlxuICAgICAqL1xuICAgIElubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZC5JbnZva2VkID0gMDtcbiAgICAvKipcbiAgICAgKiBDb21wbGV0aW9uIHdhcyB0cmlnZ2VyZWQgYXV0b21hdGljYWxseSB3aGlsZSBlZGl0aW5nLlxuICAgICAqL1xuICAgIElubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZC5BdXRvbWF0aWMgPSAxO1xufSkoSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kIHx8IChJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmQgPSB7fSkpO1xuZXhwb3J0IHZhciBTZWxlY3RlZENvbXBsZXRpb25JbmZvO1xuKGZ1bmN0aW9uIChTZWxlY3RlZENvbXBsZXRpb25JbmZvKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCB0ZXh0KSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCB0ZXh0IH07XG4gICAgfVxuICAgIFNlbGVjdGVkQ29tcGxldGlvbkluZm8uY3JlYXRlID0gY3JlYXRlO1xufSkoU2VsZWN0ZWRDb21wbGV0aW9uSW5mbyB8fCAoU2VsZWN0ZWRDb21wbGV0aW9uSW5mbyA9IHt9KSk7XG5leHBvcnQgdmFyIElubGluZUNvbXBsZXRpb25Db250ZXh0O1xuKGZ1bmN0aW9uIChJbmxpbmVDb21wbGV0aW9uQ29udGV4dCkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh0cmlnZ2VyS2luZCwgc2VsZWN0ZWRDb21wbGV0aW9uSW5mbykge1xuICAgICAgICByZXR1cm4geyB0cmlnZ2VyS2luZCwgc2VsZWN0ZWRDb21wbGV0aW9uSW5mbyB9O1xuICAgIH1cbiAgICBJbmxpbmVDb21wbGV0aW9uQ29udGV4dC5jcmVhdGUgPSBjcmVhdGU7XG59KShJbmxpbmVDb21wbGV0aW9uQ29udGV4dCB8fCAoSW5saW5lQ29tcGxldGlvbkNvbnRleHQgPSB7fSkpO1xuZXhwb3J0IHZhciBXb3Jrc3BhY2VGb2xkZXI7XG4oZnVuY3Rpb24gKFdvcmtzcGFjZUZvbGRlcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIFVSSS5pcyhjYW5kaWRhdGUudXJpKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLm5hbWUpO1xuICAgIH1cbiAgICBXb3Jrc3BhY2VGb2xkZXIuaXMgPSBpcztcbn0pKFdvcmtzcGFjZUZvbGRlciB8fCAoV29ya3NwYWNlRm9sZGVyID0ge30pKTtcbmV4cG9ydCBjb25zdCBFT0wgPSBbJ1xcbicsICdcXHJcXG4nLCAnXFxyJ107XG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSB0aGUgdGV4dCBkb2N1bWVudCBmcm9tIHRoZSBuZXcgdnNjb2RlLWxhbmd1YWdlc2VydmVyLXRleHRkb2N1bWVudCBwYWNrYWdlLlxuICovXG5leHBvcnQgdmFyIFRleHREb2N1bWVudDtcbihmdW5jdGlvbiAoVGV4dERvY3VtZW50KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBJVGV4dERvY3VtZW50IGxpdGVyYWwgZnJvbSB0aGUgZ2l2ZW4gdXJpIGFuZCBjb250ZW50LlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIGRvY3VtZW50J3MgdXJpLlxuICAgICAqIEBwYXJhbSBsYW5ndWFnZUlkIFRoZSBkb2N1bWVudCdzIGxhbmd1YWdlIElkLlxuICAgICAqIEBwYXJhbSB2ZXJzaW9uIFRoZSBkb2N1bWVudCdzIHZlcnNpb24uXG4gICAgICogQHBhcmFtIGNvbnRlbnQgVGhlIGRvY3VtZW50J3MgY29udGVudC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodXJpLCBsYW5ndWFnZUlkLCB2ZXJzaW9uLCBjb250ZW50KSB7XG4gICAgICAgIHJldHVybiBuZXcgRnVsbFRleHREb2N1bWVudCh1cmksIGxhbmd1YWdlSWQsIHZlcnNpb24sIGNvbnRlbnQpO1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnQuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgSVRleHREb2N1bWVudH0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSkgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUubGFuZ3VhZ2VJZCkgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS5sYW5ndWFnZUlkKSkgJiYgSXMudWludGVnZXIoY2FuZGlkYXRlLmxpbmVDb3VudClcbiAgICAgICAgICAgICYmIElzLmZ1bmMoY2FuZGlkYXRlLmdldFRleHQpICYmIElzLmZ1bmMoY2FuZGlkYXRlLnBvc2l0aW9uQXQpICYmIElzLmZ1bmMoY2FuZGlkYXRlLm9mZnNldEF0KSA/IHRydWUgOiBmYWxzZTtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50LmlzID0gaXM7XG4gICAgZnVuY3Rpb24gYXBwbHlFZGl0cyhkb2N1bWVudCwgZWRpdHMpIHtcbiAgICAgICAgbGV0IHRleHQgPSBkb2N1bWVudC5nZXRUZXh0KCk7XG4gICAgICAgIGxldCBzb3J0ZWRFZGl0cyA9IG1lcmdlU29ydChlZGl0cywgKGEsIGIpID0+IHtcbiAgICAgICAgICAgIGxldCBkaWZmID0gYS5yYW5nZS5zdGFydC5saW5lIC0gYi5yYW5nZS5zdGFydC5saW5lO1xuICAgICAgICAgICAgaWYgKGRpZmYgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYS5yYW5nZS5zdGFydC5jaGFyYWN0ZXIgLSBiLnJhbmdlLnN0YXJ0LmNoYXJhY3RlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBkaWZmO1xuICAgICAgICB9KTtcbiAgICAgICAgbGV0IGxhc3RNb2RpZmllZE9mZnNldCA9IHRleHQubGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBpID0gc29ydGVkRWRpdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGxldCBlID0gc29ydGVkRWRpdHNbaV07XG4gICAgICAgICAgICBsZXQgc3RhcnRPZmZzZXQgPSBkb2N1bWVudC5vZmZzZXRBdChlLnJhbmdlLnN0YXJ0KTtcbiAgICAgICAgICAgIGxldCBlbmRPZmZzZXQgPSBkb2N1bWVudC5vZmZzZXRBdChlLnJhbmdlLmVuZCk7XG4gICAgICAgICAgICBpZiAoZW5kT2Zmc2V0IDw9IGxhc3RNb2RpZmllZE9mZnNldCkge1xuICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cmluZygwLCBzdGFydE9mZnNldCkgKyBlLm5ld1RleHQgKyB0ZXh0LnN1YnN0cmluZyhlbmRPZmZzZXQsIHRleHQubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignT3ZlcmxhcHBpbmcgZWRpdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkT2Zmc2V0ID0gc3RhcnRPZmZzZXQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuICAgIFRleHREb2N1bWVudC5hcHBseUVkaXRzID0gYXBwbHlFZGl0cztcbiAgICBmdW5jdGlvbiBtZXJnZVNvcnQoZGF0YSwgY29tcGFyZSkge1xuICAgICAgICBpZiAoZGF0YS5sZW5ndGggPD0gMSkge1xuICAgICAgICAgICAgLy8gc29ydGVkXG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwID0gKGRhdGEubGVuZ3RoIC8gMikgfCAwO1xuICAgICAgICBjb25zdCBsZWZ0ID0gZGF0YS5zbGljZSgwLCBwKTtcbiAgICAgICAgY29uc3QgcmlnaHQgPSBkYXRhLnNsaWNlKHApO1xuICAgICAgICBtZXJnZVNvcnQobGVmdCwgY29tcGFyZSk7XG4gICAgICAgIG1lcmdlU29ydChyaWdodCwgY29tcGFyZSk7XG4gICAgICAgIGxldCBsZWZ0SWR4ID0gMDtcbiAgICAgICAgbGV0IHJpZ2h0SWR4ID0gMDtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICB3aGlsZSAobGVmdElkeCA8IGxlZnQubGVuZ3RoICYmIHJpZ2h0SWR4IDwgcmlnaHQubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgcmV0ID0gY29tcGFyZShsZWZ0W2xlZnRJZHhdLCByaWdodFtyaWdodElkeF0pO1xuICAgICAgICAgICAgaWYgKHJldCA8PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gc21hbGxlcl9lcXVhbCAtPiB0YWtlIGxlZnQgdG8gcHJlc2VydmUgb3JkZXJcbiAgICAgICAgICAgICAgICBkYXRhW2krK10gPSBsZWZ0W2xlZnRJZHgrK107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBncmVhdGVyIC0+IHRha2UgcmlnaHRcbiAgICAgICAgICAgICAgICBkYXRhW2krK10gPSByaWdodFtyaWdodElkeCsrXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAobGVmdElkeCA8IGxlZnQubGVuZ3RoKSB7XG4gICAgICAgICAgICBkYXRhW2krK10gPSBsZWZ0W2xlZnRJZHgrK107XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKHJpZ2h0SWR4IDwgcmlnaHQubGVuZ3RoKSB7XG4gICAgICAgICAgICBkYXRhW2krK10gPSByaWdodFtyaWdodElkeCsrXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG59KShUZXh0RG9jdW1lbnQgfHwgKFRleHREb2N1bWVudCA9IHt9KSk7XG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSB0aGUgdGV4dCBkb2N1bWVudCBmcm9tIHRoZSBuZXcgdnNjb2RlLWxhbmd1YWdlc2VydmVyLXRleHRkb2N1bWVudCBwYWNrYWdlLlxuICovXG5jbGFzcyBGdWxsVGV4dERvY3VtZW50IHtcbiAgICBjb25zdHJ1Y3Rvcih1cmksIGxhbmd1YWdlSWQsIHZlcnNpb24sIGNvbnRlbnQpIHtcbiAgICAgICAgdGhpcy5fdXJpID0gdXJpO1xuICAgICAgICB0aGlzLl9sYW5ndWFnZUlkID0gbGFuZ3VhZ2VJZDtcbiAgICAgICAgdGhpcy5fdmVyc2lvbiA9IHZlcnNpb247XG4gICAgICAgIHRoaXMuX2NvbnRlbnQgPSBjb250ZW50O1xuICAgICAgICB0aGlzLl9saW5lT2Zmc2V0cyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZ2V0IHVyaSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VyaTtcbiAgICB9XG4gICAgZ2V0IGxhbmd1YWdlSWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sYW5ndWFnZUlkO1xuICAgIH1cbiAgICBnZXQgdmVyc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZlcnNpb247XG4gICAgfVxuICAgIGdldFRleHQocmFuZ2UpIHtcbiAgICAgICAgaWYgKHJhbmdlKSB7XG4gICAgICAgICAgICBsZXQgc3RhcnQgPSB0aGlzLm9mZnNldEF0KHJhbmdlLnN0YXJ0KTtcbiAgICAgICAgICAgIGxldCBlbmQgPSB0aGlzLm9mZnNldEF0KHJhbmdlLmVuZCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY29udGVudC5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRlbnQ7XG4gICAgfVxuICAgIHVwZGF0ZShldmVudCwgdmVyc2lvbikge1xuICAgICAgICB0aGlzLl9jb250ZW50ID0gZXZlbnQudGV4dDtcbiAgICAgICAgdGhpcy5fdmVyc2lvbiA9IHZlcnNpb247XG4gICAgICAgIHRoaXMuX2xpbmVPZmZzZXRzID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBnZXRMaW5lT2Zmc2V0cygpIHtcbiAgICAgICAgaWYgKHRoaXMuX2xpbmVPZmZzZXRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxldCBsaW5lT2Zmc2V0cyA9IFtdO1xuICAgICAgICAgICAgbGV0IHRleHQgPSB0aGlzLl9jb250ZW50O1xuICAgICAgICAgICAgbGV0IGlzTGluZVN0YXJ0ID0gdHJ1ZTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChpc0xpbmVTdGFydCkge1xuICAgICAgICAgICAgICAgICAgICBsaW5lT2Zmc2V0cy5wdXNoKGkpO1xuICAgICAgICAgICAgICAgICAgICBpc0xpbmVTdGFydCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgY2ggPSB0ZXh0LmNoYXJBdChpKTtcbiAgICAgICAgICAgICAgICBpc0xpbmVTdGFydCA9IChjaCA9PT0gJ1xccicgfHwgY2ggPT09ICdcXG4nKTtcbiAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICdcXHInICYmIGkgKyAxIDwgdGV4dC5sZW5ndGggJiYgdGV4dC5jaGFyQXQoaSArIDEpID09PSAnXFxuJykge1xuICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzTGluZVN0YXJ0ICYmIHRleHQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxpbmVPZmZzZXRzLnB1c2godGV4dC5sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fbGluZU9mZnNldHMgPSBsaW5lT2Zmc2V0cztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fbGluZU9mZnNldHM7XG4gICAgfVxuICAgIHBvc2l0aW9uQXQob2Zmc2V0KSB7XG4gICAgICAgIG9mZnNldCA9IE1hdGgubWF4KE1hdGgubWluKG9mZnNldCwgdGhpcy5fY29udGVudC5sZW5ndGgpLCAwKTtcbiAgICAgICAgbGV0IGxpbmVPZmZzZXRzID0gdGhpcy5nZXRMaW5lT2Zmc2V0cygpO1xuICAgICAgICBsZXQgbG93ID0gMCwgaGlnaCA9IGxpbmVPZmZzZXRzLmxlbmd0aDtcbiAgICAgICAgaWYgKGhpZ2ggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBQb3NpdGlvbi5jcmVhdGUoMCwgb2Zmc2V0KTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAobG93IDwgaGlnaCkge1xuICAgICAgICAgICAgbGV0IG1pZCA9IE1hdGguZmxvb3IoKGxvdyArIGhpZ2gpIC8gMik7XG4gICAgICAgICAgICBpZiAobGluZU9mZnNldHNbbWlkXSA+IG9mZnNldCkge1xuICAgICAgICAgICAgICAgIGhpZ2ggPSBtaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsb3cgPSBtaWQgKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGxvdyBpcyB0aGUgbGVhc3QgeCBmb3Igd2hpY2ggdGhlIGxpbmUgb2Zmc2V0IGlzIGxhcmdlciB0aGFuIHRoZSBjdXJyZW50IG9mZnNldFxuICAgICAgICAvLyBvciBhcnJheS5sZW5ndGggaWYgbm8gbGluZSBvZmZzZXQgaXMgbGFyZ2VyIHRoYW4gdGhlIGN1cnJlbnQgb2Zmc2V0XG4gICAgICAgIGxldCBsaW5lID0gbG93IC0gMTtcbiAgICAgICAgcmV0dXJuIFBvc2l0aW9uLmNyZWF0ZShsaW5lLCBvZmZzZXQgLSBsaW5lT2Zmc2V0c1tsaW5lXSk7XG4gICAgfVxuICAgIG9mZnNldEF0KHBvc2l0aW9uKSB7XG4gICAgICAgIGxldCBsaW5lT2Zmc2V0cyA9IHRoaXMuZ2V0TGluZU9mZnNldHMoKTtcbiAgICAgICAgaWYgKHBvc2l0aW9uLmxpbmUgPj0gbGluZU9mZnNldHMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY29udGVudC5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocG9zaXRpb24ubGluZSA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIGxldCBsaW5lT2Zmc2V0ID0gbGluZU9mZnNldHNbcG9zaXRpb24ubGluZV07XG4gICAgICAgIGxldCBuZXh0TGluZU9mZnNldCA9IChwb3NpdGlvbi5saW5lICsgMSA8IGxpbmVPZmZzZXRzLmxlbmd0aCkgPyBsaW5lT2Zmc2V0c1twb3NpdGlvbi5saW5lICsgMV0gOiB0aGlzLl9jb250ZW50Lmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KE1hdGgubWluKGxpbmVPZmZzZXQgKyBwb3NpdGlvbi5jaGFyYWN0ZXIsIG5leHRMaW5lT2Zmc2V0KSwgbGluZU9mZnNldCk7XG4gICAgfVxuICAgIGdldCBsaW5lQ291bnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldExpbmVPZmZzZXRzKCkubGVuZ3RoO1xuICAgIH1cbn1cbnZhciBJcztcbihmdW5jdGlvbiAoSXMpIHtcbiAgICBjb25zdCB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG4gICAgZnVuY3Rpb24gZGVmaW5lZCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJztcbiAgICB9XG4gICAgSXMuZGVmaW5lZCA9IGRlZmluZWQ7XG4gICAgZnVuY3Rpb24gdW5kZWZpbmVkKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnO1xuICAgIH1cbiAgICBJcy51bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgZnVuY3Rpb24gYm9vbGVhbih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWUgPT09IHRydWUgfHwgdmFsdWUgPT09IGZhbHNlO1xuICAgIH1cbiAgICBJcy5ib29sZWFuID0gYm9vbGVhbjtcbiAgICBmdW5jdGlvbiBzdHJpbmcodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBTdHJpbmddJztcbiAgICB9XG4gICAgSXMuc3RyaW5nID0gc3RyaW5nO1xuICAgIGZ1bmN0aW9uIG51bWJlcih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IE51bWJlcl0nO1xuICAgIH1cbiAgICBJcy5udW1iZXIgPSBudW1iZXI7XG4gICAgZnVuY3Rpb24gbnVtYmVyUmFuZ2UodmFsdWUsIG1pbiwgbWF4KSB7XG4gICAgICAgIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgTnVtYmVyXScgJiYgbWluIDw9IHZhbHVlICYmIHZhbHVlIDw9IG1heDtcbiAgICB9XG4gICAgSXMubnVtYmVyUmFuZ2UgPSBudW1iZXJSYW5nZTtcbiAgICBmdW5jdGlvbiBpbnRlZ2VyKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgTnVtYmVyXScgJiYgLTIxNDc0ODM2NDggPD0gdmFsdWUgJiYgdmFsdWUgPD0gMjE0NzQ4MzY0NztcbiAgICB9XG4gICAgSXMuaW50ZWdlciA9IGludGVnZXI7XG4gICAgZnVuY3Rpb24gdWludGVnZXIodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBOdW1iZXJdJyAmJiAwIDw9IHZhbHVlICYmIHZhbHVlIDw9IDIxNDc0ODM2NDc7XG4gICAgfVxuICAgIElzLnVpbnRlZ2VyID0gdWludGVnZXI7XG4gICAgZnVuY3Rpb24gZnVuYyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG4gICAgfVxuICAgIElzLmZ1bmMgPSBmdW5jO1xuICAgIGZ1bmN0aW9uIG9iamVjdExpdGVyYWwodmFsdWUpIHtcbiAgICAgICAgLy8gU3RyaWN0bHkgc3BlYWtpbmcgY2xhc3MgaW5zdGFuY2VzIHBhc3MgdGhpcyBjaGVjayBhcyB3ZWxsLiBTaW5jZSB0aGUgTFNQXG4gICAgICAgIC8vIGRvZXNuJ3QgdXNlIGNsYXNzZXMgd2UgaWdub3JlIHRoaXMgZm9yIG5vdy4gSWYgd2UgZG8gd2UgbmVlZCB0byBhZGQgc29tZXRoaW5nXG4gICAgICAgIC8vIGxpa2UgdGhpczogYE9iamVjdC5nZXRQcm90b3R5cGVPZihPYmplY3QuZ2V0UHJvdG90eXBlT2YoeCkpID09PSBudWxsYFxuICAgICAgICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JztcbiAgICB9XG4gICAgSXMub2JqZWN0TGl0ZXJhbCA9IG9iamVjdExpdGVyYWw7XG4gICAgZnVuY3Rpb24gdHlwZWRBcnJheSh2YWx1ZSwgY2hlY2spIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmV2ZXJ5KGNoZWNrKTtcbiAgICB9XG4gICAgSXMudHlwZWRBcnJheSA9IHR5cGVkQXJyYXk7XG59KShJcyB8fCAoSXMgPSB7fSkpO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBS0EsYUFBTyxlQUFlLFNBQVMsY0FBYyxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQzVELGNBQVEsY0FBYyxRQUFRLFFBQVEsUUFBUSxPQUFPLFFBQVEsUUFBUSxRQUFRLFNBQVMsUUFBUSxTQUFTLFFBQVEsVUFBVTtBQUN6SCxlQUFTLFFBQVEsT0FBTztBQUNwQixlQUFPLFVBQVUsUUFBUSxVQUFVO0FBQUEsTUFDdkM7QUFDQSxjQUFRLFVBQVU7QUFDbEIsZUFBUyxPQUFPLE9BQU87QUFDbkIsZUFBTyxPQUFPLFVBQVUsWUFBWSxpQkFBaUI7QUFBQSxNQUN6RDtBQUNBLGNBQVEsU0FBUztBQUNqQixlQUFTLE9BQU8sT0FBTztBQUNuQixlQUFPLE9BQU8sVUFBVSxZQUFZLGlCQUFpQjtBQUFBLE1BQ3pEO0FBQ0EsY0FBUSxTQUFTO0FBQ2pCLGVBQVMsTUFBTSxPQUFPO0FBQ2xC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QVMsZ0JBQWdCO0FBQ3JCLFdBQU87QUFBQSxNQUNILE1BQU07QUFBQSxRQUNGLFFBQVE7QUFBQSxVQUNKLE9BQVksRUFBRSxTQUFTLEtBQUs7QUFBQSxVQUM1QixRQUFZLEVBQUUsU0FBUyxNQUFNO0FBQUEsVUFDN0IsWUFBWSxDQUFDLHNCQUFzQixtQkFBbUIsMkJBQTJCO0FBQUEsUUFDckY7QUFBQSxRQUNBLFdBQVcsRUFBRSxTQUFTLEtBQUs7QUFBQSxRQUMzQixZQUFZO0FBQUEsVUFDUixXQUFzQjtBQUFBLFVBQ3RCLHNCQUFzQjtBQUFBO0FBQUEsVUFFdEIsWUFBc0I7QUFBQSxVQUN0QixlQUFlO0FBQUEsWUFDWDtBQUFBLFlBQWE7QUFBQSxZQUFTO0FBQUEsWUFDdEI7QUFBQSxZQUNBO0FBQUEsWUFDQTtBQUFBLFVBQ0o7QUFBQSxVQUNBLGFBQWEsQ0FBQyxRQUFRLFNBQVMsT0FBTyxPQUFPLEVBQUU7QUFBQSxRQUNuRDtBQUFBLFFBQ0EsZUFBZ0IsRUFBRSxTQUFTLEtBQUs7QUFBQSxRQUNoQyxRQUFnQixFQUFFLFNBQVMsS0FBSztBQUFBLFFBQ2hDLGFBQWdCLEVBQUUsaUJBQWlCLE1BQU07QUFBQSxRQUN6QyxZQUFnQixFQUFFLGdCQUFnQixFQUFFLFNBQVMsTUFBTSxFQUFFO0FBQUE7QUFBQTtBQUFBLFFBR3JELG9CQUF3QixFQUFFLFNBQVMsTUFBTTtBQUFBLFFBQ3pDLHlCQUF5QixFQUFFLFNBQVMsTUFBTTtBQUFBLE1BQzlDO0FBQUEsSUFDSjtBQUFBLEVBQ0o7IiwKICAibmFtZXMiOiBbIkVycm9yQ29kZXMiLCAiTWVzc2FnZSIsICJUb3VjaCIsICJEaXNwb3NhYmxlIiwgIlJBTCIsICJFdmVudCIsICJJcyIsICJDYW5jZWxsYXRpb25Ub2tlbiIsICJDYW5jZWxsYXRpb25TdGF0ZSIsICJfY29ubiIsICJJcyIsICJNZXNzYWdlUmVhZGVyIiwgIkFic3RyYWN0TWVzc2FnZVJlYWRlciIsICJSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zIiwgIklzIiwgIk1lc3NhZ2VXcml0ZXIiLCAiQWJzdHJhY3RNZXNzYWdlV3JpdGVyIiwgIlJlc29sdmVkTWVzc2FnZVdyaXRlck9wdGlvbnMiLCAicmVzdWx0IiwgIklzIiwgIkNhbmNlbE5vdGlmaWNhdGlvbiIsICJQcm9ncmVzc1Rva2VuIiwgIlByb2dyZXNzTm90aWZpY2F0aW9uIiwgIlN0YXJSZXF1ZXN0SGFuZGxlciIsICJUcmFjZSIsICJUcmFjZVZhbHVlcyIsICJUcmFjZUZvcm1hdCIsICJTZXRUcmFjZU5vdGlmaWNhdGlvbiIsICJMb2dUcmFjZU5vdGlmaWNhdGlvbiIsICJDb25uZWN0aW9uRXJyb3JzIiwgIkNvbm5lY3Rpb25TdHJhdGVneSIsICJJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kiLCAiUmVxdWVzdENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kiLCAiQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSIsICJDYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneSIsICJDYW5jZWxsYXRpb25TdHJhdGVneSIsICJNZXNzYWdlU3RyYXRlZ3kiLCAiQ29ubmVjdGlvbk9wdGlvbnMiLCAiQ29ubmVjdGlvblN0YXRlIiwgImNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uIiwgInN0YXJ0VGltZSIsICJSSUwiLCAibSIsICJleHBvcnRzIiwgImNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uIiwgImltcG9ydF92c2NvZGVfanNvbnJwYyIsICJpbXBvcnRfdnNjb2RlX2pzb25ycGMiLCAiaW1wb3J0X3ZzY29kZV9qc29ucnBjIiwgImltcG9ydF92c2NvZGVfanNvbnJwYyIsICJEb2N1bWVudFVyaSIsICJVUkkiLCAiaW50ZWdlciIsICJ1aW50ZWdlciIsICJQb3NpdGlvbiIsICJSYW5nZSIsICJMb2NhdGlvbiIsICJMb2NhdGlvbkxpbmsiLCAiQ29sb3IiLCAiQ29sb3JJbmZvcm1hdGlvbiIsICJDb2xvclByZXNlbnRhdGlvbiIsICJGb2xkaW5nUmFuZ2VLaW5kIiwgIkZvbGRpbmdSYW5nZSIsICJEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uIiwgImxvY2F0aW9uIiwgIkRpYWdub3N0aWNTZXZlcml0eSIsICJEaWFnbm9zdGljVGFnIiwgIkNvZGVEZXNjcmlwdGlvbiIsICJEaWFnbm9zdGljIiwgIkNvbW1hbmQiLCAiVGV4dEVkaXQiLCAiQ2hhbmdlQW5ub3RhdGlvbiIsICJDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllciIsICJBbm5vdGF0ZWRUZXh0RWRpdCIsICJUZXh0RG9jdW1lbnRFZGl0IiwgIkNyZWF0ZUZpbGUiLCAiUmVuYW1lRmlsZSIsICJEZWxldGVGaWxlIiwgIldvcmtzcGFjZUVkaXQiLCAiVGV4dERvY3VtZW50SWRlbnRpZmllciIsICJWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIiwgIk9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciIsICJUZXh0RG9jdW1lbnRJdGVtIiwgIk1hcmt1cEtpbmQiLCAiTWFya3VwQ29udGVudCIsICJDb21wbGV0aW9uSXRlbUtpbmQiLCAiSW5zZXJ0VGV4dEZvcm1hdCIsICJDb21wbGV0aW9uSXRlbVRhZyIsICJJbnNlcnRSZXBsYWNlRWRpdCIsICJSYW5nZSIsICJJbnNlcnRUZXh0TW9kZSIsICJDb21wbGV0aW9uSXRlbUxhYmVsRGV0YWlscyIsICJDb21wbGV0aW9uSXRlbSIsICJDb21wbGV0aW9uTGlzdCIsICJNYXJrZWRTdHJpbmciLCAiSG92ZXIiLCAiUGFyYW1ldGVySW5mb3JtYXRpb24iLCAiU2lnbmF0dXJlSW5mb3JtYXRpb24iLCAiRG9jdW1lbnRIaWdobGlnaHRLaW5kIiwgIkRvY3VtZW50SGlnaGxpZ2h0IiwgIlN5bWJvbEtpbmQiLCAiU3ltYm9sVGFnIiwgIlN5bWJvbEluZm9ybWF0aW9uIiwgIldvcmtzcGFjZVN5bWJvbCIsICJEb2N1bWVudFN5bWJvbCIsICJDb2RlQWN0aW9uS2luZCIsICJDb2RlQWN0aW9uVHJpZ2dlcktpbmQiLCAiQ29kZUFjdGlvbkNvbnRleHQiLCAiQ29kZUFjdGlvbiIsICJDb2RlTGVucyIsICJGb3JtYXR0aW5nT3B0aW9ucyIsICJEb2N1bWVudExpbmsiLCAiU2VsZWN0aW9uUmFuZ2UiLCAiU2VtYW50aWNUb2tlblR5cGVzIiwgIlNlbWFudGljVG9rZW5Nb2RpZmllcnMiLCAiU2VtYW50aWNUb2tlbnMiLCAiSW5saW5lVmFsdWVUZXh0IiwgIklubGluZVZhbHVlVmFyaWFibGVMb29rdXAiLCAiSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24iLCAiSW5saW5lVmFsdWVDb250ZXh0IiwgIklubGF5SGludEtpbmQiLCAiSW5sYXlIaW50TGFiZWxQYXJ0IiwgIklubGF5SGludCIsICJQb3NpdGlvbiIsICJTdHJpbmdWYWx1ZSIsICJJbmxpbmVDb21wbGV0aW9uSXRlbSIsICJJbmxpbmVDb21wbGV0aW9uTGlzdCIsICJJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmQiLCAiU2VsZWN0ZWRDb21wbGV0aW9uSW5mbyIsICJJbmxpbmVDb21wbGV0aW9uQ29udGV4dCIsICJXb3Jrc3BhY2VGb2xkZXIiLCAiVGV4dERvY3VtZW50IiwgIlBvc2l0aW9uIiwgIklzIiwgInVuZGVmaW5lZCIsICJpbnRlZ2VyIiwgInVpbnRlZ2VyIiwgIm0iXQp9Cg== diff --git a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/lsp/java-lsp-client.ts b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/lsp/java-lsp-client.ts index 5e68d1b70e7..3455c30a322 100644 --- a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/lsp/java-lsp-client.ts +++ b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/lsp/java-lsp-client.ts @@ -537,7 +537,10 @@ function registerProviders(): void { const result: Array | null = await _conn.sendRequest('textDocument/codeAction', { textDocument: { uri: model.uri.toString() }, range: lspRange, - context: { diagnostics, only: context.only ? [context.only] : undefined }, + // Monaco's CodeActionTriggerType (Invoke=1, Auto=2) maps 1:1 to the LSP trigger kind. + // Forwarding it lets JDT.LS compute only quick-fixes for the passive lightbulb (cheap) + // and the full assists/refactorings only on explicit Ctrl+. / Refactor… (Invoked). + context: { diagnostics, only: context.only ? [context.only] : undefined, triggerKind: context.trigger }, }); if (!result?.length) return empty; return { @@ -1246,8 +1249,10 @@ function jdtlsSettings() { format: { enabled: true }, saveActions: { organizeImports: false }, inlayHints: { parameterNames: { enabled: 'all' } }, - referencesCodeLens: { enabled: true }, - implementationsCodeLens: { enabled: true }, + // Off by default: the reference/implementation search behind these CodeLenses runs for every + // declaration on open and on every edit and dominates JDT.LS load on a large classpath. + referencesCodeLens: { enabled: false }, + implementationsCodeLens: { enabled: false }, }, }; } From 7d4717d7ea4b036a33f6aac72d0b648475d63f66 Mon Sep 17 00:00:00 2001 From: Iliyan Velichkov Date: Tue, 23 Jun 2026 21:24:14 +0300 Subject: [PATCH 13/14] =?UTF-8?q?fix(ide):=20move=20New=E2=86=92Java=20to?= =?UTF-8?q?=20a=20top-level=20"Java"=20menu=20(unbreak=20New=20scrolling?= =?UTF-8?q?=20/=20CreateNewFileIT)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit BlimpKit's context menu disables scrolling for any submenu that contains a nested submenu (contextmenu.js canScroll). Nesting the "Java" group inside "New" therefore turned off scrolling for the whole New menu, so once enough artefact templates are registered the menu overflows the viewport and top items (e.g. "JavaScript Service") become unreachable — which failed CreateNewFileIT. Move "Java" to a top-level context-menu entry (sibling of New) on project/folder nodes. New keeps its scrolling; "Java" is its own 2-level submenu. Workbench page object navigates Java → accordingly. Verified: CreateNewFileIT and CreateJavaArtifactsIT both pass. Co-Authored-By: Claude Opus 4.8 (1M context) --- .../META-INF/dirigible/view-projects/js/projects.js | 8 +++++++- .../eclipse/dirigible/tests/framework/ide/Workbench.java | 2 +- 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/components/ui/view-projects/src/main/resources/META-INF/dirigible/view-projects/js/projects.js b/components/ui/view-projects/src/main/resources/META-INF/dirigible/view-projects/js/projects.js index 22bd55555cb..2da55ee0635 100644 --- a/components/ui/view-projects/src/main/resources/META-INF/dirigible/view-projects/js/projects.js +++ b/components/ui/view-projects/src/main/resources/META-INF/dirigible/view-projects/js/projects.js @@ -447,9 +447,13 @@ projectsView.controller('ProjectsViewController', ( label: 'Folder', leftIconClass: 'sap-icon--add-folder', separator: true, - }, JavaNew.submenu()], + }], separator: true, }; + // A dedicated top-level "Java" submenu (sibling of New), NOT nested inside New: BlimpKit + // disables scrolling for any menu that contains a submenu child, and the New menu relies + // on scrolling once enough artefact templates are registered. + const javaSubmenu = JavaNew.submenu(); const cutObj = { id: 'cut', label: 'Cut', @@ -523,6 +527,7 @@ projectsView.controller('ProjectsViewController', ( if (node.type === 'project') { if (nodes.length === 1) items.push( newSubmenu, + javaSubmenu, { id: 'duplicateProject', label: 'Duplicate', @@ -565,6 +570,7 @@ projectsView.controller('ProjectsViewController', ( } else if (node.type === 'folder') { items.push( newSubmenu, + javaSubmenu, cutObj, copyObj, pasteObj, diff --git a/tests/tests-framework/src/main/java/org/eclipse/dirigible/tests/framework/ide/Workbench.java b/tests/tests-framework/src/main/java/org/eclipse/dirigible/tests/framework/ide/Workbench.java index d067c83c566..c9f1c0a2cd2 100644 --- a/tests/tests-framework/src/main/java/org/eclipse/dirigible/tests/framework/ide/Workbench.java +++ b/tests/tests-framework/src/main/java/org/eclipse/dirigible/tests/framework/ide/Workbench.java @@ -96,7 +96,7 @@ public void createJavaArtifact(String projectName, String leafLabel, String name expandProject(projectName); browser.rightClickOnElementContainingText(HtmlElementType.ANCHOR, projectName); - browser.clickCascadingMenuItem("New", "Java", leafLabel); + browser.clickCascadingMenuItem("Java", leafLabel); browser.enterTextInElementById("fdti1", name); if (entity != null) { From a9a2be0f0226d7b818d3dcd15c2839255e8b0607 Mon Sep 17 00:00:00 2001 From: Iliyan Velichkov Date: Tue, 23 Jun 2026 21:40:50 +0300 Subject: [PATCH 14/14] perf(java-lsp): persist JDT.LS index across restarts; pre-warm classpath; index freshness MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Java editor was slow to "enable" features after every jar restart because JDT.LS re-indexed the whole platform classpath each time. Causes and fixes: - JdtLsManager wiped the JDT.LS data/index dir on every start. Since ClassPathIndex now extracts to a stable cache dir, the index only goes stale when the classpath actually changes. Wipe is now guarded by a classpath fingerprint (SHA-256 of the sorted classpath entries) stored next to the data dir: matching fingerprint → reuse the index (warm, fast restart); mismatch/first run → rebuild once. - Pre-warm the (cached) compile classpath on the boot virtual thread so the first Java file open doesn't pay the multi-second materialisation. - After didOpen, send workspace/didChangeWatchedFiles(Created) so JDT.LS's project model includes just-created files immediately (a fresh interface is now offered in a sibling class without waiting for a rebuild). - Dropped java.completion.maxResults (it equalled JDT.LS's default and only risked trimming relevant results such as the project's own types). Verified: CreateJavaArtifactsIT + CreateNewFileIT pass; logs show "Pre-warmed compile classpath" and the fingerprint-guarded "Building/Reusing JDT.LS index". Co-Authored-By: Claude Opus 4.8 (1M context) --- .../ide/lsp/java/process/JdtLsManager.java | 63 +++++++++++++++++-- .../editor-monaco/js/java-lsp-client.js | 9 ++- .../editor-monaco/js/lsp/java-lsp-client.ts | 5 +- 3 files changed, 67 insertions(+), 10 deletions(-) diff --git a/components/ide/ide-java-lsp/src/main/java/org/eclipse/dirigible/components/ide/lsp/java/process/JdtLsManager.java b/components/ide/ide-java-lsp/src/main/java/org/eclipse/dirigible/components/ide/lsp/java/process/JdtLsManager.java index ed8e3f99920..486a842ea0e 100644 --- a/components/ide/ide-java-lsp/src/main/java/org/eclipse/dirigible/components/ide/lsp/java/process/JdtLsManager.java +++ b/components/ide/ide-java-lsp/src/main/java/org/eclipse/dirigible/components/ide/lsp/java/process/JdtLsManager.java @@ -33,7 +33,9 @@ import java.nio.file.SimpleFileVisitor; import java.nio.file.StandardCopyOption; import java.nio.file.attribute.BasicFileAttributes; +import java.security.MessageDigest; import java.util.ArrayList; +import java.util.HexFormat; import java.util.List; import java.util.Map; import java.util.Optional; @@ -112,6 +114,15 @@ public void run(ApplicationArguments args) { ensureInstalled(); available = true; logger.info("[java-lsp] JDT.LS is ready at {}", jdtlsHome); + // Materialise the platform classpath now (it is cached on disk), so the first Java + // file the user opens does not pay the multi-second extraction on its critical path. + try { + int entries = classPathIndex.classPathEntries() + .size(); + logger.info("[java-lsp] Pre-warmed compile classpath: {} entries", entries); + } catch (Exception warmEx) { + logger.warn("[java-lsp] Classpath pre-warm failed (will materialise lazily on first use)", warmEx); + } } catch (Exception e) { logger.warn("[java-lsp] JDT.LS is not available: {}. Java language support will be disabled.", e.getMessage()); } @@ -197,11 +208,25 @@ private JdtLsInstance startInstance(String username, String workspace) throws Ex Path dataDir = jdtlsHome.resolve("data") .resolve(username) .resolve(workspace); - // Wipe stale workspace index so JDT.LS re-imports projects with the current .classpath. - // Without this, a cached Eclipse workspace that references deleted JAR paths (e.g. from - // a previous temp-dir extraction) causes unresolved-import errors on every restart. - deleteDirectory(dataDir); - Files.createDirectories(dataDir); + // Reuse the JDT.LS index across restarts so the (expensive) re-index of the platform classpath + // is not paid every time. The cached index only goes stale when the classpath itself changes + // (ClassPathIndex extracts to a stable dir and re-extracts only on a new build), so wipe the + // index only when a classpath fingerprint marker is missing or no longer matches. + Path fingerprintMarker = dataDir.resolveSibling(dataDir.getFileName() + ".classpath-fp"); + String fingerprint = classpathFingerprint(); + boolean indexValid = !fingerprint.isEmpty() && Files.isDirectory(dataDir) && Files.exists(fingerprintMarker) + && fingerprint.equals(readFingerprint(fingerprintMarker)); + if (indexValid) { + logger.info("[java-lsp] Reusing cached JDT.LS index for {}/{}", sanitize(username), sanitize(workspace)); + } else { + logger.info("[java-lsp] Building JDT.LS index for {}/{} (first run or classpath changed)", sanitize(username), + sanitize(workspace)); + deleteDirectory(dataDir); + Files.createDirectories(dataDir); + if (!fingerprint.isEmpty()) { + Files.writeString(fingerprintMarker, fingerprint); + } + } String launcherJar = findLauncherJar(); String configDir = resolveConfigDir(); @@ -357,6 +382,34 @@ private static Path workspaceRoot(String username, String workspace) { .normalize(); } + /** + * SHA-256 over the sorted classpath entry paths; identifies whether a cached index is still valid. + */ + private String classpathFingerprint() { + try { + MessageDigest digest = MessageDigest.getInstance("SHA-256"); + classPathIndex.classPathEntries() + .stream() + .map(Path::toString) + .sorted() + .forEach(entry -> digest.update(entry.getBytes(StandardCharsets.UTF_8))); + return HexFormat.of() + .formatHex(digest.digest()); + } catch (Exception e) { + logger.warn("[java-lsp] Could not compute classpath fingerprint; index will be rebuilt", e); + return ""; + } + } + + private static String readFingerprint(Path marker) { + try { + return Files.readString(marker) + .trim(); + } catch (IOException e) { + return ""; + } + } + private static void deleteDirectory(Path dir) throws IOException { if (!Files.exists(dir)) { return; diff --git a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/java-lsp-client.js b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/java-lsp-client.js index e441e28fac7..997701a3e46 100644 --- a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/java-lsp-client.js +++ b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/java-lsp-client.js @@ -4669,6 +4669,11 @@ ${JSON.stringify(message, null, 4)}`); text: model?.getValue() ?? "" } }); + _conn.sendNotification("workspace/didChangeWatchedFiles", { changes: [{ + uri: fileUri, + type: 1 + /* Created */ + }] }); if (model) { model.onDidChangeContent(() => { const existing = _changeTimers.get(fileUri); @@ -5558,8 +5563,6 @@ ${JSON.stringify(message, null, 4)}`); completion: { overwrite: true, guessMethodArguments: false, - // Cap results so import/type completion over the large platform classpath stays snappy. - maxResults: 50, filteredTypes: [ "com.sun.*", "sun.*", @@ -5583,4 +5586,4 @@ ${JSON.stringify(message, null, 4)}`); } return __toCommonJS(java_lsp_client_exports); })(); -//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvY29tbW9uL2lzLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlcy5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vbGlua2VkTWFwLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9kaXNwb3NhYmxlLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9yYWwuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvY29tbW9uL2V2ZW50cy5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vY2FuY2VsbGF0aW9uLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9zaGFyZWRBcnJheUNhbmNlbGxhdGlvbi5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vc2VtYXBob3JlLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlUmVhZGVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlV3JpdGVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlQnVmZmVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9jb25uZWN0aW9uLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9hcGkuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvYnJvd3Nlci9yaWwuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvYnJvd3Nlci9tYWluLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvYnJvd3Nlci5qcyIsICJsc3AvamF2YS1sc3AtY2xpZW50LnRzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLXdzLWpzb25ycGMvc3JjL2Rpc3Bvc2FibGUudHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvc29ja2V0L3NvY2tldC50cyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS13cy1qc29ucnBjL3NyYy9zb2NrZXQvcmVhZGVyLnRzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLXdzLWpzb25ycGMvc3JjL3NvY2tldC93cml0ZXIudHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvc29ja2V0L2Nvbm5lY3Rpb24udHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvY29ubmVjdGlvbi50cyIsICJsc3AvbW9uYWNvLXNoaW0udHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtbGFuZ3VhZ2VzZXJ2ZXItdHlwZXMvbGliL2VzbS9tYWluLmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuc3RyaW5nQXJyYXkgPSBleHBvcnRzLmFycmF5ID0gZXhwb3J0cy5mdW5jID0gZXhwb3J0cy5lcnJvciA9IGV4cG9ydHMubnVtYmVyID0gZXhwb3J0cy5zdHJpbmcgPSBleHBvcnRzLmJvb2xlYW4gPSB2b2lkIDA7XG5mdW5jdGlvbiBib29sZWFuKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZTtcbn1cbmV4cG9ydHMuYm9vbGVhbiA9IGJvb2xlYW47XG5mdW5jdGlvbiBzdHJpbmcodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZztcbn1cbmV4cG9ydHMuc3RyaW5nID0gc3RyaW5nO1xuZnVuY3Rpb24gbnVtYmVyKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdmFsdWUgaW5zdGFuY2VvZiBOdW1iZXI7XG59XG5leHBvcnRzLm51bWJlciA9IG51bWJlcjtcbmZ1bmN0aW9uIGVycm9yKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgRXJyb3I7XG59XG5leHBvcnRzLmVycm9yID0gZXJyb3I7XG5mdW5jdGlvbiBmdW5jKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cbmV4cG9ydHMuZnVuYyA9IGZ1bmM7XG5mdW5jdGlvbiBhcnJheSh2YWx1ZSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cbmV4cG9ydHMuYXJyYXkgPSBhcnJheTtcbmZ1bmN0aW9uIHN0cmluZ0FycmF5KHZhbHVlKSB7XG4gICAgcmV0dXJuIGFycmF5KHZhbHVlKSAmJiB2YWx1ZS5ldmVyeShlbGVtID0+IHN0cmluZyhlbGVtKSk7XG59XG5leHBvcnRzLnN0cmluZ0FycmF5ID0gc3RyaW5nQXJyYXk7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLk1lc3NhZ2UgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU5ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlOCA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTcgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU2ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNSA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTQgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUzID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMiA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTEgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUwID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTkgPSBleHBvcnRzLlJlcXVlc3RUeXBlOCA9IGV4cG9ydHMuUmVxdWVzdFR5cGU3ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTYgPSBleHBvcnRzLlJlcXVlc3RUeXBlNSA9IGV4cG9ydHMuUmVxdWVzdFR5cGU0ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTMgPSBleHBvcnRzLlJlcXVlc3RUeXBlMiA9IGV4cG9ydHMuUmVxdWVzdFR5cGUxID0gZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IGV4cG9ydHMuUmVxdWVzdFR5cGUwID0gZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUgPSBleHBvcnRzLlBhcmFtZXRlclN0cnVjdHVyZXMgPSBleHBvcnRzLlJlc3BvbnNlRXJyb3IgPSBleHBvcnRzLkVycm9yQ29kZXMgPSB2b2lkIDA7XG5jb25zdCBpcyA9IHJlcXVpcmUoXCIuL2lzXCIpO1xuLyoqXG4gKiBQcmVkZWZpbmVkIGVycm9yIGNvZGVzLlxuICovXG52YXIgRXJyb3JDb2RlcztcbihmdW5jdGlvbiAoRXJyb3JDb2Rlcykge1xuICAgIC8vIERlZmluZWQgYnkgSlNPTiBSUENcbiAgICBFcnJvckNvZGVzLlBhcnNlRXJyb3IgPSAtMzI3MDA7XG4gICAgRXJyb3JDb2Rlcy5JbnZhbGlkUmVxdWVzdCA9IC0zMjYwMDtcbiAgICBFcnJvckNvZGVzLk1ldGhvZE5vdEZvdW5kID0gLTMyNjAxO1xuICAgIEVycm9yQ29kZXMuSW52YWxpZFBhcmFtcyA9IC0zMjYwMjtcbiAgICBFcnJvckNvZGVzLkludGVybmFsRXJyb3IgPSAtMzI2MDM7XG4gICAgLyoqXG4gICAgICogVGhpcyBpcyB0aGUgc3RhcnQgcmFuZ2Ugb2YgSlNPTiBSUEMgcmVzZXJ2ZWQgZXJyb3IgY29kZXMuXG4gICAgICogSXQgZG9lc24ndCBkZW5vdGUgYSByZWFsIGVycm9yIGNvZGUuIE5vIGFwcGxpY2F0aW9uIGVycm9yIGNvZGVzIHNob3VsZFxuICAgICAqIGJlIGRlZmluZWQgYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCByYW5nZS4gRm9yIGJhY2t3YXJkc1xuICAgICAqIGNvbXBhdGliaWxpdHkgdGhlIGBTZXJ2ZXJOb3RJbml0aWFsaXplZGAgYW5kIHRoZSBgVW5rbm93bkVycm9yQ29kZWBcbiAgICAgKiBhcmUgbGVmdCBpbiB0aGUgcmFuZ2UuXG4gICAgICpcbiAgICAgKiBAc2luY2UgMy4xNi4wXG4gICAgKi9cbiAgICBFcnJvckNvZGVzLmpzb25ycGNSZXNlcnZlZEVycm9yUmFuZ2VTdGFydCA9IC0zMjA5OTtcbiAgICAvKiogQGRlcHJlY2F0ZWQgdXNlICBqc29ucnBjUmVzZXJ2ZWRFcnJvclJhbmdlU3RhcnQgKi9cbiAgICBFcnJvckNvZGVzLnNlcnZlckVycm9yU3RhcnQgPSAtMzIwOTk7XG4gICAgLyoqXG4gICAgICogQW4gZXJyb3Igb2NjdXJyZWQgd2hlbiB3cml0ZSBhIG1lc3NhZ2UgdG8gdGhlIHRyYW5zcG9ydCBsYXllci5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLk1lc3NhZ2VXcml0ZUVycm9yID0gLTMyMDk5O1xuICAgIC8qKlxuICAgICAqIEFuIGVycm9yIG9jY3VycmVkIHdoZW4gcmVhZGluZyBhIG1lc3NhZ2UgZnJvbSB0aGUgdHJhbnNwb3J0IGxheWVyLlxuICAgICAqL1xuICAgIEVycm9yQ29kZXMuTWVzc2FnZVJlYWRFcnJvciA9IC0zMjA5ODtcbiAgICAvKipcbiAgICAgKiBUaGUgY29ubmVjdGlvbiBnb3QgZGlzcG9zZWQgb3IgbG9zdCBhbmQgYWxsIHBlbmRpbmcgcmVzcG9uc2VzIGdvdFxuICAgICAqIHJlamVjdGVkLlxuICAgICAqL1xuICAgIEVycm9yQ29kZXMuUGVuZGluZ1Jlc3BvbnNlUmVqZWN0ZWQgPSAtMzIwOTc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gaXMgaW5hY3RpdmUgYW5kIGEgdXNlIG9mIGl0IGZhaWxlZC5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLkNvbm5lY3Rpb25JbmFjdGl2ZSA9IC0zMjA5NjtcbiAgICAvKipcbiAgICAgKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBhIHNlcnZlciByZWNlaXZlZCBhIG5vdGlmaWNhdGlvbiBvclxuICAgICAqIHJlcXVlc3QgYmVmb3JlIHRoZSBzZXJ2ZXIgaGFzIHJlY2VpdmVkIHRoZSBgaW5pdGlhbGl6ZWAgcmVxdWVzdC5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLlNlcnZlck5vdEluaXRpYWxpemVkID0gLTMyMDAyO1xuICAgIEVycm9yQ29kZXMuVW5rbm93bkVycm9yQ29kZSA9IC0zMjAwMTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIHRoZSBlbmQgcmFuZ2Ugb2YgSlNPTiBSUEMgcmVzZXJ2ZWQgZXJyb3IgY29kZXMuXG4gICAgICogSXQgZG9lc24ndCBkZW5vdGUgYSByZWFsIGVycm9yIGNvZGUuXG4gICAgICpcbiAgICAgKiBAc2luY2UgMy4xNi4wXG4gICAgKi9cbiAgICBFcnJvckNvZGVzLmpzb25ycGNSZXNlcnZlZEVycm9yUmFuZ2VFbmQgPSAtMzIwMDA7XG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSAganNvbnJwY1Jlc2VydmVkRXJyb3JSYW5nZUVuZCAqL1xuICAgIEVycm9yQ29kZXMuc2VydmVyRXJyb3JFbmQgPSAtMzIwMDA7XG59KShFcnJvckNvZGVzIHx8IChleHBvcnRzLkVycm9yQ29kZXMgPSBFcnJvckNvZGVzID0ge30pKTtcbi8qKlxuICogQW4gZXJyb3Igb2JqZWN0IHJldHVybiBpbiBhIHJlc3BvbnNlIGluIGNhc2UgYSByZXF1ZXN0XG4gKiBoYXMgZmFpbGVkLlxuICovXG5jbGFzcyBSZXNwb25zZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNvZGUsIG1lc3NhZ2UsIGRhdGEpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuY29kZSA9IGlzLm51bWJlcihjb2RlKSA/IGNvZGUgOiBFcnJvckNvZGVzLlVua25vd25FcnJvckNvZGU7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBSZXNwb25zZUVycm9yLnByb3RvdHlwZSk7XG4gICAgfVxuICAgIHRvSnNvbigpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgY29kZTogdGhpcy5jb2RlLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLmRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmRhdGEgPSB0aGlzLmRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5leHBvcnRzLlJlc3BvbnNlRXJyb3IgPSBSZXNwb25zZUVycm9yO1xuY2xhc3MgUGFyYW1ldGVyU3RydWN0dXJlcyB7XG4gICAgY29uc3RydWN0b3Ioa2luZCkge1xuICAgICAgICB0aGlzLmtpbmQgPSBraW5kO1xuICAgIH1cbiAgICBzdGF0aWMgaXModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8gfHwgdmFsdWUgPT09IFBhcmFtZXRlclN0cnVjdHVyZXMuYnlOYW1lIHx8IHZhbHVlID09PSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5UG9zaXRpb247XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5raW5kO1xuICAgIH1cbn1cbmV4cG9ydHMuUGFyYW1ldGVyU3RydWN0dXJlcyA9IFBhcmFtZXRlclN0cnVjdHVyZXM7XG4vKipcbiAqIFRoZSBwYXJhbWV0ZXIgc3RydWN0dXJlIGlzIGF1dG9tYXRpY2FsbHkgaW5mZXJyZWQgb24gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzXG4gKiBhbmQgdGhlIHBhcmFtZXRlciB0eXBlIGluIGNhc2Ugb2YgYSBzaW5nbGUgcGFyYW0uXG4gKi9cblBhcmFtZXRlclN0cnVjdHVyZXMuYXV0byA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdhdXRvJyk7XG4vKipcbiAqIEZvcmNlcyBgYnlQb3NpdGlvbmAgcGFyYW1ldGVyIHN0cnVjdHVyZS4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGhhdmUgYSBzaW5nbGVcbiAqIHBhcmFtZXRlciB3aGljaCBoYXMgYSBsaXRlcmFsIHR5cGUuXG4gKi9cblBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbiA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdieVBvc2l0aW9uJyk7XG4vKipcbiAqIEZvcmNlcyBgYnlOYW1lYCBwYXJhbWV0ZXIgc3RydWN0dXJlLiBUaGlzIGlzIG9ubHkgdXNlZnVsIHdoZW4gaGF2aW5nIGEgc2luZ2xlXG4gKiBwYXJhbWV0ZXIuIFRoZSBsaWJyYXJ5IHdpbGwgcmVwb3J0IGVycm9ycyBpZiB1c2VkIHdpdGggYSBkaWZmZXJlbnQgbnVtYmVyIG9mXG4gKiBwYXJhbWV0ZXJzLlxuICovXG5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdieU5hbWUnKTtcbi8qKlxuICogQW4gYWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgYSBNZXNzYWdlVHlwZS5cbiAqL1xuY2xhc3MgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIG51bWJlck9mUGFyYW1zKSB7XG4gICAgICAgIHRoaXMubWV0aG9kID0gbWV0aG9kO1xuICAgICAgICB0aGlzLm51bWJlck9mUGFyYW1zID0gbnVtYmVyT2ZQYXJhbXM7XG4gICAgfVxuICAgIGdldCBwYXJhbWV0ZXJTdHJ1Y3R1cmVzKCkge1xuICAgICAgICByZXR1cm4gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvO1xuICAgIH1cbn1cbmV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlID0gQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlO1xuLyoqXG4gKiBDbGFzc2VzIHRvIHR5cGUgcmVxdWVzdCByZXNwb25zZSBwYWlyc1xuICovXG5jbGFzcyBSZXF1ZXN0VHlwZTAgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDApO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGUwID0gUmVxdWVzdFR5cGUwO1xuY2xhc3MgUmVxdWVzdFR5cGUgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCwgX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8pIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAxKTtcbiAgICAgICAgdGhpcy5fcGFyYW1ldGVyU3RydWN0dXJlcyA9IF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbiAgICBnZXQgcGFyYW1ldGVyU3RydWN0dXJlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXM7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IFJlcXVlc3RUeXBlO1xuY2xhc3MgUmVxdWVzdFR5cGUxIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMSk7XG4gICAgICAgIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBfcGFyYW1ldGVyU3RydWN0dXJlcztcbiAgICB9XG4gICAgZ2V0IHBhcmFtZXRlclN0cnVjdHVyZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGUxID0gUmVxdWVzdFR5cGUxO1xuY2xhc3MgUmVxdWVzdFR5cGUyIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAyKTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlMiA9IFJlcXVlc3RUeXBlMjtcbmNsYXNzIFJlcXVlc3RUeXBlMyBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMyk7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTMgPSBSZXF1ZXN0VHlwZTM7XG5jbGFzcyBSZXF1ZXN0VHlwZTQgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDQpO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGU0ID0gUmVxdWVzdFR5cGU0O1xuY2xhc3MgUmVxdWVzdFR5cGU1IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA1KTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlNSA9IFJlcXVlc3RUeXBlNTtcbmNsYXNzIFJlcXVlc3RUeXBlNiBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNik7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTYgPSBSZXF1ZXN0VHlwZTY7XG5jbGFzcyBSZXF1ZXN0VHlwZTcgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDcpO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGU3ID0gUmVxdWVzdFR5cGU3O1xuY2xhc3MgUmVxdWVzdFR5cGU4IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA4KTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlOCA9IFJlcXVlc3RUeXBlODtcbmNsYXNzIFJlcXVlc3RUeXBlOSBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgOSk7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTkgPSBSZXF1ZXN0VHlwZTk7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMSk7XG4gICAgICAgIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBfcGFyYW1ldGVyU3RydWN0dXJlcztcbiAgICB9XG4gICAgZ2V0IHBhcmFtZXRlclN0cnVjdHVyZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZSA9IE5vdGlmaWNhdGlvblR5cGU7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlMCBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMCk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMCA9IE5vdGlmaWNhdGlvblR5cGUwO1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTEgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCwgX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8pIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAxKTtcbiAgICAgICAgdGhpcy5fcGFyYW1ldGVyU3RydWN0dXJlcyA9IF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbiAgICBnZXQgcGFyYW1ldGVyU3RydWN0dXJlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXM7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMSA9IE5vdGlmaWNhdGlvblR5cGUxO1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDIpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTIgPSBOb3RpZmljYXRpb25UeXBlMjtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGUzIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAzKTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGUzID0gTm90aWZpY2F0aW9uVHlwZTM7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlNCBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNCk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNCA9IE5vdGlmaWNhdGlvblR5cGU0O1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTUgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDUpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTUgPSBOb3RpZmljYXRpb25UeXBlNTtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGU2IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA2KTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGU2ID0gTm90aWZpY2F0aW9uVHlwZTY7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlNyBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNyk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNyA9IE5vdGlmaWNhdGlvblR5cGU3O1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTggZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDgpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTggPSBOb3RpZmljYXRpb25UeXBlODtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGU5IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA5KTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGU5ID0gTm90aWZpY2F0aW9uVHlwZTk7XG52YXIgTWVzc2FnZTtcbihmdW5jdGlvbiAoTWVzc2FnZSkge1xuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoZSBnaXZlbiBtZXNzYWdlIGlzIGEgcmVxdWVzdCBtZXNzYWdlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gbWVzc2FnZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBpcy5zdHJpbmcoY2FuZGlkYXRlLm1ldGhvZCkgJiYgKGlzLnN0cmluZyhjYW5kaWRhdGUuaWQpIHx8IGlzLm51bWJlcihjYW5kaWRhdGUuaWQpKTtcbiAgICB9XG4gICAgTWVzc2FnZS5pc1JlcXVlc3QgPSBpc1JlcXVlc3Q7XG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhlIGdpdmVuIG1lc3NhZ2UgaXMgYSBub3RpZmljYXRpb24gbWVzc2FnZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTm90aWZpY2F0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gbWVzc2FnZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBpcy5zdHJpbmcoY2FuZGlkYXRlLm1ldGhvZCkgJiYgbWVzc2FnZS5pZCA9PT0gdm9pZCAwO1xuICAgIH1cbiAgICBNZXNzYWdlLmlzTm90aWZpY2F0aW9uID0gaXNOb3RpZmljYXRpb247XG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhlIGdpdmVuIG1lc3NhZ2UgaXMgYSByZXNwb25zZSBtZXNzYWdlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNSZXNwb25zZShtZXNzYWdlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IG1lc3NhZ2U7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgKGNhbmRpZGF0ZS5yZXN1bHQgIT09IHZvaWQgMCB8fCAhIWNhbmRpZGF0ZS5lcnJvcikgJiYgKGlzLnN0cmluZyhjYW5kaWRhdGUuaWQpIHx8IGlzLm51bWJlcihjYW5kaWRhdGUuaWQpIHx8IGNhbmRpZGF0ZS5pZCA9PT0gbnVsbCk7XG4gICAgfVxuICAgIE1lc3NhZ2UuaXNSZXNwb25zZSA9IGlzUmVzcG9uc2U7XG59KShNZXNzYWdlIHx8IChleHBvcnRzLk1lc3NhZ2UgPSBNZXNzYWdlID0ge30pKTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xudmFyIF9hO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5MUlVDYWNoZSA9IGV4cG9ydHMuTGlua2VkTWFwID0gZXhwb3J0cy5Ub3VjaCA9IHZvaWQgMDtcbnZhciBUb3VjaDtcbihmdW5jdGlvbiAoVG91Y2gpIHtcbiAgICBUb3VjaC5Ob25lID0gMDtcbiAgICBUb3VjaC5GaXJzdCA9IDE7XG4gICAgVG91Y2guQXNPbGQgPSBUb3VjaC5GaXJzdDtcbiAgICBUb3VjaC5MYXN0ID0gMjtcbiAgICBUb3VjaC5Bc05ldyA9IFRvdWNoLkxhc3Q7XG59KShUb3VjaCB8fCAoZXhwb3J0cy5Ub3VjaCA9IFRvdWNoID0ge30pKTtcbmNsYXNzIExpbmtlZE1hcCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXNbX2FdID0gJ0xpbmtlZE1hcCc7XG4gICAgICAgIHRoaXMuX21hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5faGVhZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fdGFpbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IDA7XG4gICAgICAgIHRoaXMuX3N0YXRlID0gMDtcbiAgICB9XG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuX21hcC5jbGVhcigpO1xuICAgICAgICB0aGlzLl9oZWFkID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl90YWlsID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9zaXplID0gMDtcbiAgICAgICAgdGhpcy5fc3RhdGUrKztcbiAgICB9XG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLl9oZWFkICYmICF0aGlzLl90YWlsO1xuICAgIH1cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpemU7XG4gICAgfVxuICAgIGdldCBmaXJzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlYWQ/LnZhbHVlO1xuICAgIH1cbiAgICBnZXQgbGFzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhaWw/LnZhbHVlO1xuICAgIH1cbiAgICBoYXMoa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXAuaGFzKGtleSk7XG4gICAgfVxuICAgIGdldChrZXksIHRvdWNoID0gVG91Y2guTm9uZSkge1xuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5fbWFwLmdldChrZXkpO1xuICAgICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRvdWNoICE9PSBUb3VjaC5Ob25lKSB7XG4gICAgICAgICAgICB0aGlzLnRvdWNoKGl0ZW0sIHRvdWNoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICB9XG4gICAgc2V0KGtleSwgdmFsdWUsIHRvdWNoID0gVG91Y2guTm9uZSkge1xuICAgICAgICBsZXQgaXRlbSA9IHRoaXMuX21hcC5nZXQoa2V5KTtcbiAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgIGl0ZW0udmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIGlmICh0b3VjaCAhPT0gVG91Y2guTm9uZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudG91Y2goaXRlbSwgdG91Y2gpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaXRlbSA9IHsga2V5LCB2YWx1ZSwgbmV4dDogdW5kZWZpbmVkLCBwcmV2aW91czogdW5kZWZpbmVkIH07XG4gICAgICAgICAgICBzd2l0Y2ggKHRvdWNoKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBUb3VjaC5Ob25lOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFRvdWNoLkZpcnN0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1GaXJzdChpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBUb3VjaC5MYXN0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX21hcC5zZXQoa2V5LCBpdGVtKTtcbiAgICAgICAgICAgIHRoaXMuX3NpemUrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGVsZXRlKGtleSkge1xuICAgICAgICByZXR1cm4gISF0aGlzLnJlbW92ZShrZXkpO1xuICAgIH1cbiAgICByZW1vdmUoa2V5KSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl9tYXAuZ2V0KGtleSk7XG4gICAgICAgIGlmICghaXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tYXAuZGVsZXRlKGtleSk7XG4gICAgICAgIHRoaXMucmVtb3ZlSXRlbShpdGVtKTtcbiAgICAgICAgdGhpcy5fc2l6ZS0tO1xuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICB9XG4gICAgc2hpZnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5faGVhZCAmJiAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2hlYWQgfHwgIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIHRoaXMuX21hcC5kZWxldGUoaXRlbS5rZXkpO1xuICAgICAgICB0aGlzLnJlbW92ZUl0ZW0oaXRlbSk7XG4gICAgICAgIHRoaXMuX3NpemUtLTtcbiAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7XG4gICAgfVxuICAgIGZvckVhY2goY2FsbGJhY2tmbiwgdGhpc0FyZykge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3N0YXRlO1xuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICAgICAgICBpZiAodGhpc0FyZykge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrZm4uYmluZCh0aGlzQXJnKShjdXJyZW50LnZhbHVlLCBjdXJyZW50LmtleSwgdGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFja2ZuKGN1cnJlbnQudmFsdWUsIGN1cnJlbnQua2V5LCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gc3RhdGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExpbmtlZE1hcCBnb3QgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAga2V5cygpIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9zdGF0ZTtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLl9oZWFkO1xuICAgICAgICBjb25zdCBpdGVyYXRvciA9IHtcbiAgICAgICAgICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fc3RhdGUgIT09IHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTGlua2VkTWFwIGdvdCBtb2RpZmllZCBkdXJpbmcgaXRlcmF0aW9uLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7IHZhbHVlOiBjdXJyZW50LmtleSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICB9XG4gICAgdmFsdWVzKCkge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3N0YXRlO1xuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIGNvbnN0IGl0ZXJhdG9yID0ge1xuICAgICAgICAgICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlcmF0b3I7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBMaW5rZWRNYXAgZ290IG1vZGlmaWVkIGR1cmluZyBpdGVyYXRpb24uYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHsgdmFsdWU6IGN1cnJlbnQudmFsdWUsIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gaXRlcmF0b3I7XG4gICAgfVxuICAgIGVudHJpZXMoKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5fc3RhdGU7XG4gICAgICAgIGxldCBjdXJyZW50ID0gdGhpcy5faGVhZDtcbiAgICAgICAgY29uc3QgaXRlcmF0b3IgPSB7XG4gICAgICAgICAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3N0YXRlICE9PSBzdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExpbmtlZE1hcCBnb3QgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geyB2YWx1ZTogW2N1cnJlbnQua2V5LCBjdXJyZW50LnZhbHVlXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICB9XG4gICAgWyhfYSA9IFN5bWJvbC50b1N0cmluZ1RhZywgU3ltYm9sLml0ZXJhdG9yKV0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMoKTtcbiAgICB9XG4gICAgdHJpbU9sZChuZXdTaXplKSB7XG4gICAgICAgIGlmIChuZXdTaXplID49IHRoaXMuc2l6ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuZXdTaXplID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLl9oZWFkO1xuICAgICAgICBsZXQgY3VycmVudFNpemUgPSB0aGlzLnNpemU7XG4gICAgICAgIHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnRTaXplID4gbmV3U2l6ZSkge1xuICAgICAgICAgICAgdGhpcy5fbWFwLmRlbGV0ZShjdXJyZW50LmtleSk7XG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0O1xuICAgICAgICAgICAgY3VycmVudFNpemUtLTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9oZWFkID0gY3VycmVudDtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IGN1cnJlbnRTaXplO1xuICAgICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICAgICAgY3VycmVudC5wcmV2aW91cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgIH1cbiAgICBhZGRJdGVtRmlyc3QoaXRlbSkge1xuICAgICAgICAvLyBGaXJzdCB0aW1lIEluc2VydFxuICAgICAgICBpZiAoIXRoaXMuX2hlYWQgJiYgIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRoaXMuX3RhaWwgPSBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCF0aGlzLl9oZWFkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbGlzdCcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdGhpcy5faGVhZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQucHJldmlvdXMgPSBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2hlYWQgPSBpdGVtO1xuICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgIH1cbiAgICBhZGRJdGVtTGFzdChpdGVtKSB7XG4gICAgICAgIC8vIEZpcnN0IHRpbWUgSW5zZXJ0XG4gICAgICAgIGlmICghdGhpcy5faGVhZCAmJiAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgdGhpcy5faGVhZCA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpdGVtLnByZXZpb3VzID0gdGhpcy5fdGFpbDtcbiAgICAgICAgICAgIHRoaXMuX3RhaWwubmV4dCA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW07XG4gICAgICAgIHRoaXMuX3N0YXRlKys7XG4gICAgfVxuICAgIHJlbW92ZUl0ZW0oaXRlbSkge1xuICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCAmJiBpdGVtID09PSB0aGlzLl90YWlsKSB7XG4gICAgICAgICAgICB0aGlzLl9oZWFkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpdGVtID09PSB0aGlzLl9oZWFkKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGNhbiBvbmx5IGhhcHBlbmVkIGlmIHNpemUgPT09IDEgd2hpY2ggaXMgaGFuZGxlXG4gICAgICAgICAgICAvLyBieSB0aGUgY2FzZSBhYm92ZS5cbiAgICAgICAgICAgIGlmICghaXRlbS5uZXh0KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxpc3QnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGl0ZW0ubmV4dC5wcmV2aW91cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQgPSBpdGVtLm5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXRlbSA9PT0gdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgLy8gVGhpcyBjYW4gb25seSBoYXBwZW5lZCBpZiBzaXplID09PSAxIHdoaWNoIGlzIGhhbmRsZVxuICAgICAgICAgICAgLy8gYnkgdGhlIGNhc2UgYWJvdmUuXG4gICAgICAgICAgICBpZiAoIWl0ZW0ucHJldmlvdXMpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbGlzdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbS5wcmV2aW91cy5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gaXRlbS5uZXh0O1xuICAgICAgICAgICAgY29uc3QgcHJldmlvdXMgPSBpdGVtLnByZXZpb3VzO1xuICAgICAgICAgICAgaWYgKCFuZXh0IHx8ICFwcmV2aW91cykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXh0LnByZXZpb3VzID0gcHJldmlvdXM7XG4gICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gbmV4dDtcbiAgICAgICAgfVxuICAgICAgICBpdGVtLm5leHQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGl0ZW0ucHJldmlvdXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX3N0YXRlKys7XG4gICAgfVxuICAgIHRvdWNoKGl0ZW0sIHRvdWNoKSB7XG4gICAgICAgIGlmICghdGhpcy5faGVhZCB8fCAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxpc3QnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHRvdWNoICE9PSBUb3VjaC5GaXJzdCAmJiB0b3VjaCAhPT0gVG91Y2guTGFzdCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG91Y2ggPT09IFRvdWNoLkZpcnN0KSB7XG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBpdGVtLm5leHQ7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgICAgICAvLyBVbmxpbmsgdGhlIGl0ZW1cbiAgICAgICAgICAgIGlmIChpdGVtID09PSB0aGlzLl90YWlsKSB7XG4gICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgbXVzdCBiZSBkZWZpbmVkIHNpbmNlIGl0ZW0gd2FzIG5vdCBoZWFkIGJ1dCBpcyB0YWlsXG4gICAgICAgICAgICAgICAgLy8gU28gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbiBpdGVtIGluIHRoZSBtYXBcbiAgICAgICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuX3RhaWwgPSBwcmV2aW91cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEJvdGggbmV4dCBhbmQgcHJldmlvdXMgYXJlIG5vdCB1bmRlZmluZWQgc2luY2UgaXRlbSB3YXMgbmVpdGhlciBoZWFkIG5vciB0YWlsLlxuICAgICAgICAgICAgICAgIG5leHQucHJldmlvdXMgPSBwcmV2aW91cztcbiAgICAgICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEluc2VydCB0aGUgbm9kZSBhdCBoZWFkXG4gICAgICAgICAgICBpdGVtLnByZXZpb3VzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdGhpcy5faGVhZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQucHJldmlvdXMgPSBpdGVtO1xuICAgICAgICAgICAgdGhpcy5faGVhZCA9IGl0ZW07XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRvdWNoID09PSBUb3VjaC5MYXN0KSB7XG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBpdGVtLm5leHQ7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgICAgICAvLyBVbmxpbmsgdGhlIGl0ZW0uXG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCkge1xuICAgICAgICAgICAgICAgIC8vIG5leHQgbXVzdCBiZSBkZWZpbmVkIHNpbmNlIGl0ZW0gd2FzIG5vdCB0YWlsIGJ1dCBpcyBoZWFkXG4gICAgICAgICAgICAgICAgLy8gU28gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbiBpdGVtIGluIHRoZSBtYXBcbiAgICAgICAgICAgICAgICBuZXh0LnByZXZpb3VzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuX2hlYWQgPSBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQm90aCBuZXh0IGFuZCBwcmV2aW91cyBhcmUgbm90IHVuZGVmaW5lZCBzaW5jZSBpdGVtIHdhcyBuZWl0aGVyIGhlYWQgbm9yIHRhaWwuXG4gICAgICAgICAgICAgICAgbmV4dC5wcmV2aW91cyA9IHByZXZpb3VzO1xuICAgICAgICAgICAgICAgIHByZXZpb3VzLm5leHQgPSBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaXRlbS5wcmV2aW91cyA9IHRoaXMuX3RhaWw7XG4gICAgICAgICAgICB0aGlzLl90YWlsLm5leHQgPSBpdGVtO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW07XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IFtdO1xuICAgICAgICB0aGlzLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGRhdGEucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGZyb21KU09OKGRhdGEpIHtcbiAgICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBkYXRhKSB7XG4gICAgICAgICAgICB0aGlzLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuTGlua2VkTWFwID0gTGlua2VkTWFwO1xuY2xhc3MgTFJVQ2FjaGUgZXh0ZW5kcyBMaW5rZWRNYXAge1xuICAgIGNvbnN0cnVjdG9yKGxpbWl0LCByYXRpbyA9IDEpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fbGltaXQgPSBsaW1pdDtcbiAgICAgICAgdGhpcy5fcmF0aW8gPSBNYXRoLm1pbihNYXRoLm1heCgwLCByYXRpbyksIDEpO1xuICAgIH1cbiAgICBnZXQgbGltaXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9saW1pdDtcbiAgICB9XG4gICAgc2V0IGxpbWl0KGxpbWl0KSB7XG4gICAgICAgIHRoaXMuX2xpbWl0ID0gbGltaXQ7XG4gICAgICAgIHRoaXMuY2hlY2tUcmltKCk7XG4gICAgfVxuICAgIGdldCByYXRpbygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JhdGlvO1xuICAgIH1cbiAgICBzZXQgcmF0aW8ocmF0aW8pIHtcbiAgICAgICAgdGhpcy5fcmF0aW8gPSBNYXRoLm1pbihNYXRoLm1heCgwLCByYXRpbyksIDEpO1xuICAgICAgICB0aGlzLmNoZWNrVHJpbSgpO1xuICAgIH1cbiAgICBnZXQoa2V5LCB0b3VjaCA9IFRvdWNoLkFzTmV3KSB7XG4gICAgICAgIHJldHVybiBzdXBlci5nZXQoa2V5LCB0b3VjaCk7XG4gICAgfVxuICAgIHBlZWsoa2V5KSB7XG4gICAgICAgIHJldHVybiBzdXBlci5nZXQoa2V5LCBUb3VjaC5Ob25lKTtcbiAgICB9XG4gICAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgc3VwZXIuc2V0KGtleSwgdmFsdWUsIFRvdWNoLkxhc3QpO1xuICAgICAgICB0aGlzLmNoZWNrVHJpbSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgY2hlY2tUcmltKCkge1xuICAgICAgICBpZiAodGhpcy5zaXplID4gdGhpcy5fbGltaXQpIHtcbiAgICAgICAgICAgIHRoaXMudHJpbU9sZChNYXRoLnJvdW5kKHRoaXMuX2xpbWl0ICogdGhpcy5fcmF0aW8pKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuTFJVQ2FjaGUgPSBMUlVDYWNoZTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5EaXNwb3NhYmxlID0gdm9pZCAwO1xudmFyIERpc3Bvc2FibGU7XG4oZnVuY3Rpb24gKERpc3Bvc2FibGUpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUoZnVuYykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGlzcG9zZTogZnVuY1xuICAgICAgICB9O1xuICAgIH1cbiAgICBEaXNwb3NhYmxlLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKERpc3Bvc2FibGUgfHwgKGV4cG9ydHMuRGlzcG9zYWJsZSA9IERpc3Bvc2FibGUgPSB7fSkpO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xubGV0IF9yYWw7XG5mdW5jdGlvbiBSQUwoKSB7XG4gICAgaWYgKF9yYWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHJ1bnRpbWUgYWJzdHJhY3Rpb24gbGF5ZXIgaW5zdGFsbGVkYCk7XG4gICAgfVxuICAgIHJldHVybiBfcmFsO1xufVxuKGZ1bmN0aW9uIChSQUwpIHtcbiAgICBmdW5jdGlvbiBpbnN0YWxsKHJhbCkge1xuICAgICAgICBpZiAocmFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gcnVudGltZSBhYnN0cmFjdGlvbiBsYXllciBwcm92aWRlZGApO1xuICAgICAgICB9XG4gICAgICAgIF9yYWwgPSByYWw7XG4gICAgfVxuICAgIFJBTC5pbnN0YWxsID0gaW5zdGFsbDtcbn0pKFJBTCB8fCAoUkFMID0ge30pKTtcbmV4cG9ydHMuZGVmYXVsdCA9IFJBTDtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuRW1pdHRlciA9IGV4cG9ydHMuRXZlbnQgPSB2b2lkIDA7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbnZhciBFdmVudDtcbihmdW5jdGlvbiAoRXZlbnQpIHtcbiAgICBjb25zdCBfZGlzcG9zYWJsZSA9IHsgZGlzcG9zZSgpIHsgfSB9O1xuICAgIEV2ZW50Lk5vbmUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBfZGlzcG9zYWJsZTsgfTtcbn0pKEV2ZW50IHx8IChleHBvcnRzLkV2ZW50ID0gRXZlbnQgPSB7fSkpO1xuY2xhc3MgQ2FsbGJhY2tMaXN0IHtcbiAgICBhZGQoY2FsbGJhY2ssIGNvbnRleHQgPSBudWxsLCBidWNrZXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fY29udGV4dHMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgICAgIHRoaXMuX2NvbnRleHRzLnB1c2goY29udGV4dCk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGJ1Y2tldCkpIHtcbiAgICAgICAgICAgIGJ1Y2tldC5wdXNoKHsgZGlzcG9zZTogKCkgPT4gdGhpcy5yZW1vdmUoY2FsbGJhY2ssIGNvbnRleHQpIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlbW92ZShjYWxsYmFjaywgY29udGV4dCA9IG51bGwpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZm91bmRDYWxsYmFja1dpdGhEaWZmZXJlbnRDb250ZXh0ID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLl9jYWxsYmFja3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jYWxsYmFja3NbaV0gPT09IGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NvbnRleHRzW2ldID09PSBjb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrICYgY29udGV4dCBtYXRjaCA9PiByZW1vdmUgaXRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29udGV4dHMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZENhbGxiYWNrV2l0aERpZmZlcmVudENvbnRleHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZm91bmRDYWxsYmFja1dpdGhEaWZmZXJlbnRDb250ZXh0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1doZW4gYWRkaW5nIGEgbGlzdGVuZXIgd2l0aCBhIGNvbnRleHQsIHlvdSBzaG91bGQgcmVtb3ZlIGl0IHdpdGggdGhlIHNhbWUgY29udGV4dCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGludm9rZSguLi5hcmdzKSB7XG4gICAgICAgIGlmICghdGhpcy5fY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmV0ID0gW10sIGNhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcy5zbGljZSgwKSwgY29udGV4dHMgPSB0aGlzLl9jb250ZXh0cy5zbGljZSgwKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXQucHVzaChjYWxsYmFja3NbaV0uYXBwbHkoY29udGV4dHNbaV0sIGFyZ3MpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS5jb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICAgIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5fY2FsbGJhY2tzIHx8IHRoaXMuX2NhbGxiYWNrcy5sZW5ndGggPT09IDA7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fY29udGV4dHMgPSB1bmRlZmluZWQ7XG4gICAgfVxufVxuY2xhc3MgRW1pdHRlciB7XG4gICAgY29uc3RydWN0b3IoX29wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IF9vcHRpb25zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGb3IgdGhlIHB1YmxpYyB0byBhbGxvdyB0byBzdWJzY3JpYmVcbiAgICAgKiB0byBldmVudHMgZnJvbSB0aGlzIEVtaXR0ZXJcbiAgICAgKi9cbiAgICBnZXQgZXZlbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fZXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50ID0gKGxpc3RlbmVyLCB0aGlzQXJncywgZGlzcG9zYWJsZXMpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2NhbGxiYWNrcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWxsYmFja3MgPSBuZXcgQ2FsbGJhY2tMaXN0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMub25GaXJzdExpc3RlbmVyQWRkICYmIHRoaXMuX2NhbGxiYWNrcy5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy5vbkZpcnN0TGlzdGVuZXJBZGQodGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5hZGQobGlzdGVuZXIsIHRoaXNBcmdzKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlzcG9zYWJsZSBpcyBkaXNwb3NlZCBhZnRlciBlbWl0dGVyIGlzIGRpc3Bvc2VkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5yZW1vdmUobGlzdGVuZXIsIHRoaXNBcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5kaXNwb3NlID0gRW1pdHRlci5fbm9vcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMub25MYXN0TGlzdGVuZXJSZW1vdmUgJiYgdGhpcy5fY2FsbGJhY2tzLmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29wdGlvbnMub25MYXN0TGlzdGVuZXJSZW1vdmUodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRpc3Bvc2FibGVzKSkge1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlcy5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9ldmVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVG8gYmUga2VwdCBwcml2YXRlIHRvIGZpcmUgYW4gZXZlbnQgdG9cbiAgICAgKiBzdWJzY3JpYmVyc1xuICAgICAqL1xuICAgIGZpcmUoZXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NhbGxiYWNrcykge1xuICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzLmludm9rZS5jYWxsKHRoaXMuX2NhbGxiYWNrcywgZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5kaXNwb3NlKCk7XG4gICAgICAgICAgICB0aGlzLl9jYWxsYmFja3MgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLkVtaXR0ZXIgPSBFbWl0dGVyO1xuRW1pdHRlci5fbm9vcCA9IGZ1bmN0aW9uICgpIHsgfTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uVG9rZW4gPSB2b2lkIDA7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbmNvbnN0IElzID0gcmVxdWlyZShcIi4vaXNcIik7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCIuL2V2ZW50c1wiKTtcbnZhciBDYW5jZWxsYXRpb25Ub2tlbjtcbihmdW5jdGlvbiAoQ2FuY2VsbGF0aW9uVG9rZW4pIHtcbiAgICBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGlzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkOiBmYWxzZSxcbiAgICAgICAgb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6IGV2ZW50c18xLkV2ZW50Lk5vbmVcbiAgICB9KTtcbiAgICBDYW5jZWxsYXRpb25Ub2tlbi5DYW5jZWxsZWQgPSBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6IHRydWUsXG4gICAgICAgIG9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkOiBldmVudHNfMS5FdmVudC5Ob25lXG4gICAgfSk7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgKGNhbmRpZGF0ZSA9PT0gQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZVxuICAgICAgICAgICAgfHwgY2FuZGlkYXRlID09PSBDYW5jZWxsYXRpb25Ub2tlbi5DYW5jZWxsZWRcbiAgICAgICAgICAgIHx8IChJcy5ib29sZWFuKGNhbmRpZGF0ZS5pc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkgJiYgISFjYW5kaWRhdGUub25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQpKTtcbiAgICB9XG4gICAgQ2FuY2VsbGF0aW9uVG9rZW4uaXMgPSBpcztcbn0pKENhbmNlbGxhdGlvblRva2VuIHx8IChleHBvcnRzLkNhbmNlbGxhdGlvblRva2VuID0gQ2FuY2VsbGF0aW9uVG9rZW4gPSB7fSkpO1xuY29uc3Qgc2hvcnRjdXRFdmVudCA9IE9iamVjdC5mcmVlemUoZnVuY3Rpb24gKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgY29uc3QgaGFuZGxlID0gKDAsIHJhbF8xLmRlZmF1bHQpKCkudGltZXIuc2V0VGltZW91dChjYWxsYmFjay5iaW5kKGNvbnRleHQpLCAwKTtcbiAgICByZXR1cm4geyBkaXNwb3NlKCkgeyBoYW5kbGUuZGlzcG9zZSgpOyB9IH07XG59KTtcbmNsYXNzIE11dGFibGVUb2tlbiB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX2lzQ2FuY2VsbGVkID0gZmFsc2U7XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9pc0NhbmNlbGxlZCkge1xuICAgICAgICAgICAgdGhpcy5faXNDYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2VtaXR0ZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmZpcmUodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0NhbmNlbGxlZDtcbiAgICB9XG4gICAgZ2V0IG9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKCkge1xuICAgICAgICBpZiAodGhpcy5faXNDYW5jZWxsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBzaG9ydGN1dEV2ZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5fZW1pdHRlcikge1xuICAgICAgICAgICAgdGhpcy5fZW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2VtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLl9lbWl0dGVyKSB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5jbGFzcyBDYW5jZWxsYXRpb25Ub2tlblNvdXJjZSB7XG4gICAgZ2V0IHRva2VuKCkge1xuICAgICAgICBpZiAoIXRoaXMuX3Rva2VuKSB7XG4gICAgICAgICAgICAvLyBiZSBsYXp5IGFuZCBjcmVhdGUgdGhlIHRva2VuIG9ubHkgd2hlblxuICAgICAgICAgICAgLy8gYWN0dWFsbHkgbmVlZGVkXG4gICAgICAgICAgICB0aGlzLl90b2tlbiA9IG5ldyBNdXRhYmxlVG9rZW4oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fdG9rZW47XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl90b2tlbikge1xuICAgICAgICAgICAgLy8gc2F2ZSBhbiBvYmplY3QgYnkgcmV0dXJuaW5nIHRoZSBkZWZhdWx0XG4gICAgICAgICAgICAvLyBjYW5jZWxsZWQgdG9rZW4gd2hlbiBjYW5jZWxsYXRpb24gaGFwcGVuc1xuICAgICAgICAgICAgLy8gYmVmb3JlIHNvbWVvbmUgYXNrcyBmb3IgdGhlIHRva2VuXG4gICAgICAgICAgICB0aGlzLl90b2tlbiA9IENhbmNlbGxhdGlvblRva2VuLkNhbmNlbGxlZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3Rva2VuLmNhbmNlbCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICghdGhpcy5fdG9rZW4pIHtcbiAgICAgICAgICAgIC8vIGVuc3VyZSB0byBpbml0aWFsaXplIHdpdGggYW4gZW1wdHkgdG9rZW4gaWYgd2UgaGFkIG5vbmVcbiAgICAgICAgICAgIHRoaXMuX3Rva2VuID0gQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLl90b2tlbiBpbnN0YW5jZW9mIE11dGFibGVUb2tlbikge1xuICAgICAgICAgICAgLy8gYWN0dWFsbHkgZGlzcG9zZVxuICAgICAgICAgICAgdGhpcy5fdG9rZW4uZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IENhbmNlbGxhdGlvblRva2VuU291cmNlO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3kgPSB2b2lkIDA7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbnZhciBDYW5jZWxsYXRpb25TdGF0ZTtcbihmdW5jdGlvbiAoQ2FuY2VsbGF0aW9uU3RhdGUpIHtcbiAgICBDYW5jZWxsYXRpb25TdGF0ZS5Db250aW51ZSA9IDA7XG4gICAgQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkID0gMTtcbn0pKENhbmNlbGxhdGlvblN0YXRlIHx8IChDYW5jZWxsYXRpb25TdGF0ZSA9IHt9KSk7XG5jbGFzcyBTaGFyZWRBcnJheVNlbmRlclN0cmF0ZWd5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5idWZmZXJzID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICBlbmFibGVDYW5jZWxsYXRpb24ocmVxdWVzdCkge1xuICAgICAgICBpZiAocmVxdWVzdC5pZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBTaGFyZWRBcnJheUJ1ZmZlcig0KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBJbnQzMkFycmF5KGJ1ZmZlciwgMCwgMSk7XG4gICAgICAgIGRhdGFbMF0gPSBDYW5jZWxsYXRpb25TdGF0ZS5Db250aW51ZTtcbiAgICAgICAgdGhpcy5idWZmZXJzLnNldChyZXF1ZXN0LmlkLCBidWZmZXIpO1xuICAgICAgICByZXF1ZXN0LiRjYW5jZWxsYXRpb25EYXRhID0gYnVmZmVyO1xuICAgIH1cbiAgICBhc3luYyBzZW5kQ2FuY2VsbGF0aW9uKF9jb25uLCBpZCkge1xuICAgICAgICBjb25zdCBidWZmZXIgPSB0aGlzLmJ1ZmZlcnMuZ2V0KGlkKTtcbiAgICAgICAgaWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBJbnQzMkFycmF5KGJ1ZmZlciwgMCwgMSk7XG4gICAgICAgIEF0b21pY3Muc3RvcmUoZGF0YSwgMCwgQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkKTtcbiAgICB9XG4gICAgY2xlYW51cChpZCkge1xuICAgICAgICB0aGlzLmJ1ZmZlcnMuZGVsZXRlKGlkKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy5idWZmZXJzLmNsZWFyKCk7XG4gICAgfVxufVxuZXhwb3J0cy5TaGFyZWRBcnJheVNlbmRlclN0cmF0ZWd5ID0gU2hhcmVkQXJyYXlTZW5kZXJTdHJhdGVneTtcbmNsYXNzIFNoYXJlZEFycmF5QnVmZmVyQ2FuY2VsbGF0aW9uVG9rZW4ge1xuICAgIGNvbnN0cnVjdG9yKGJ1ZmZlcikge1xuICAgICAgICB0aGlzLmRhdGEgPSBuZXcgSW50MzJBcnJheShidWZmZXIsIDAsIDEpO1xuICAgIH1cbiAgICBnZXQgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHJldHVybiBBdG9taWNzLmxvYWQodGhpcy5kYXRhLCAwKSA9PT0gQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkO1xuICAgIH1cbiAgICBnZXQgb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuY2VsbGF0aW9uIG92ZXIgU2hhcmVkQXJyYXlCdWZmZXIgZG9lc24ndCBzdXBwb3J0IGNhbmNlbGxhdGlvbiBldmVudHNgKTtcbiAgICB9XG59XG5jbGFzcyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuU291cmNlIHtcbiAgICBjb25zdHJ1Y3RvcihidWZmZXIpIHtcbiAgICAgICAgdGhpcy50b2tlbiA9IG5ldyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuKGJ1ZmZlcik7XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICB9XG59XG5jbGFzcyBTaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmtpbmQgPSAncmVxdWVzdCc7XG4gICAgfVxuICAgIGNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKHJlcXVlc3QpIHtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gcmVxdWVzdC4kY2FuY2VsbGF0aW9uRGF0YTtcbiAgICAgICAgaWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuU291cmNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuU291cmNlKGJ1ZmZlcik7XG4gICAgfVxufVxuZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBTaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3k7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNlbWFwaG9yZSA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY2xhc3MgU2VtYXBob3JlIHtcbiAgICBjb25zdHJ1Y3RvcihjYXBhY2l0eSA9IDEpIHtcbiAgICAgICAgaWYgKGNhcGFjaXR5IDw9IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FwYWNpdHkgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NhcGFjaXR5ID0gY2FwYWNpdHk7XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IDA7XG4gICAgICAgIHRoaXMuX3dhaXRpbmcgPSBbXTtcbiAgICB9XG4gICAgbG9jayh0aHVuaykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fd2FpdGluZy5wdXNoKHsgdGh1bmssIHJlc29sdmUsIHJlamVjdCB9KTtcbiAgICAgICAgICAgIHRoaXMucnVuTmV4dCgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0IGFjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTtcbiAgICB9XG4gICAgcnVuTmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dhaXRpbmcubGVuZ3RoID09PSAwIHx8IHRoaXMuX2FjdGl2ZSA9PT0gdGhpcy5fY2FwYWNpdHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS50aW1lci5zZXRJbW1lZGlhdGUoKCkgPT4gdGhpcy5kb1J1bk5leHQoKSk7XG4gICAgfVxuICAgIGRvUnVuTmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dhaXRpbmcubGVuZ3RoID09PSAwIHx8IHRoaXMuX2FjdGl2ZSA9PT0gdGhpcy5fY2FwYWNpdHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5fd2FpdGluZy5zaGlmdCgpO1xuICAgICAgICB0aGlzLl9hY3RpdmUrKztcbiAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZSA+IHRoaXMuX2NhcGFjaXR5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRvIG1hbnkgdGh1bmtzIGFjdGl2ZWApO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXh0LnRodW5rKCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC50aGVuKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5yZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5OZXh0KCk7XG4gICAgICAgICAgICAgICAgfSwgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5yZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5OZXh0KCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICBuZXh0LnJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1bk5leHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgIG5leHQucmVqZWN0KGVycik7XG4gICAgICAgICAgICB0aGlzLnJ1bk5leHQoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuU2VtYXBob3JlID0gU2VtYXBob3JlO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXIgPSBleHBvcnRzLkFic3RyYWN0TWVzc2FnZVJlYWRlciA9IGV4cG9ydHMuTWVzc2FnZVJlYWRlciA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IGV2ZW50c18xID0gcmVxdWlyZShcIi4vZXZlbnRzXCIpO1xuY29uc3Qgc2VtYXBob3JlXzEgPSByZXF1aXJlKFwiLi9zZW1hcGhvcmVcIik7XG52YXIgTWVzc2FnZVJlYWRlcjtcbihmdW5jdGlvbiAoTWVzc2FnZVJlYWRlcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5saXN0ZW4pICYmIElzLmZ1bmMoY2FuZGlkYXRlLmRpc3Bvc2UpICYmXG4gICAgICAgICAgICBJcy5mdW5jKGNhbmRpZGF0ZS5vbkVycm9yKSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5vbkNsb3NlKSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5vblBhcnRpYWxNZXNzYWdlKTtcbiAgICB9XG4gICAgTWVzc2FnZVJlYWRlci5pcyA9IGlzO1xufSkoTWVzc2FnZVJlYWRlciB8fCAoZXhwb3J0cy5NZXNzYWdlUmVhZGVyID0gTWVzc2FnZVJlYWRlciA9IHt9KSk7XG5jbGFzcyBBYnN0cmFjdE1lc3NhZ2VSZWFkZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZUVtaXR0ZXIgPSBuZXcgZXZlbnRzXzEuRW1pdHRlcigpO1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlci5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgZ2V0IG9uRXJyb3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVycm9yRW1pdHRlci5ldmVudDtcbiAgICB9XG4gICAgZmlyZUVycm9yKGVycm9yKSB7XG4gICAgICAgIHRoaXMuZXJyb3JFbWl0dGVyLmZpcmUodGhpcy5hc0Vycm9yKGVycm9yKSk7XG4gICAgfVxuICAgIGdldCBvbkNsb3NlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9zZUVtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGZpcmVDbG9zZSgpIHtcbiAgICAgICAgdGhpcy5jbG9zZUVtaXR0ZXIuZmlyZSh1bmRlZmluZWQpO1xuICAgIH1cbiAgICBnZXQgb25QYXJ0aWFsTWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFydGlhbE1lc3NhZ2VFbWl0dGVyLmV2ZW50O1xuICAgIH1cbiAgICBmaXJlUGFydGlhbE1lc3NhZ2UoaW5mbykge1xuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlRW1pdHRlci5maXJlKGluZm8pO1xuICAgIH1cbiAgICBhc0Vycm9yKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKGBSZWFkZXIgcmVjZWl2ZWQgZXJyb3IuIFJlYXNvbjogJHtJcy5zdHJpbmcoZXJyb3IubWVzc2FnZSkgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24nfWApO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VSZWFkZXIgPSBBYnN0cmFjdE1lc3NhZ2VSZWFkZXI7XG52YXIgUmVzb2x2ZWRNZXNzYWdlUmVhZGVyT3B0aW9ucztcbihmdW5jdGlvbiAoUmVzb2x2ZWRNZXNzYWdlUmVhZGVyT3B0aW9ucykge1xuICAgIGZ1bmN0aW9uIGZyb21PcHRpb25zKG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IGNoYXJzZXQ7XG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIGxldCBjb250ZW50RGVjb2RlcjtcbiAgICAgICAgY29uc3QgY29udGVudERlY29kZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICBsZXQgY29udGVudFR5cGVEZWNvZGVyO1xuICAgICAgICBjb25zdCBjb250ZW50VHlwZURlY29kZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY2hhcnNldCA9IG9wdGlvbnMgPz8gJ3V0Zi04JztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNoYXJzZXQgPSBvcHRpb25zLmNoYXJzZXQgPz8gJ3V0Zi04JztcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnREZWNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50RGVjb2RlciA9IG9wdGlvbnMuY29udGVudERlY29kZXI7XG4gICAgICAgICAgICAgICAgY29udGVudERlY29kZXJzLnNldChjb250ZW50RGVjb2Rlci5uYW1lLCBjb250ZW50RGVjb2Rlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5jb250ZW50RGVjb2RlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGVjb2RlciBvZiBvcHRpb25zLmNvbnRlbnREZWNvZGVycykge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50RGVjb2RlcnMuc2V0KGRlY29kZXIubmFtZSwgZGVjb2Rlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuY29udGVudFR5cGVEZWNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXIgPSBvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcjtcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXJzLnNldChjb250ZW50VHlwZURlY29kZXIubmFtZSwgY29udGVudFR5cGVEZWNvZGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGVjb2RlciBvZiBvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGVEZWNvZGVycy5zZXQoZGVjb2Rlci5uYW1lLCBkZWNvZGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnRlbnRUeXBlRGVjb2RlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXIgPSAoMCwgcmFsXzEuZGVmYXVsdCkoKS5hcHBsaWNhdGlvbkpzb24uZGVjb2RlcjtcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlRGVjb2RlcnMuc2V0KGNvbnRlbnRUeXBlRGVjb2Rlci5uYW1lLCBjb250ZW50VHlwZURlY29kZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGNoYXJzZXQsIGNvbnRlbnREZWNvZGVyLCBjb250ZW50RGVjb2RlcnMsIGNvbnRlbnRUeXBlRGVjb2RlciwgY29udGVudFR5cGVEZWNvZGVycyB9O1xuICAgIH1cbiAgICBSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zLmZyb21PcHRpb25zID0gZnJvbU9wdGlvbnM7XG59KShSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zIHx8IChSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zID0ge30pKTtcbmNsYXNzIFJlYWRhYmxlU3RyZWFtTWVzc2FnZVJlYWRlciBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVJlYWRlciB7XG4gICAgY29uc3RydWN0b3IocmVhZGFibGUsIG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZSA9IHJlYWRhYmxlO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zLmZyb21PcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmJ1ZmZlciA9ICgwLCByYWxfMS5kZWZhdWx0KSgpLm1lc3NhZ2VCdWZmZXIuY3JlYXRlKHRoaXMub3B0aW9ucy5jaGFyc2V0KTtcbiAgICAgICAgdGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0ID0gMTAwMDA7XG4gICAgICAgIHRoaXMubmV4dE1lc3NhZ2VMZW5ndGggPSAtMTtcbiAgICAgICAgdGhpcy5tZXNzYWdlVG9rZW4gPSAwO1xuICAgICAgICB0aGlzLnJlYWRTZW1hcGhvcmUgPSBuZXcgc2VtYXBob3JlXzEuU2VtYXBob3JlKDEpO1xuICAgIH1cbiAgICBzZXQgcGFydGlhbE1lc3NhZ2VUaW1lb3V0KHRpbWVvdXQpIHtcbiAgICAgICAgdGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0ID0gdGltZW91dDtcbiAgICB9XG4gICAgZ2V0IHBhcnRpYWxNZXNzYWdlVGltZW91dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dDtcbiAgICB9XG4gICAgbGlzdGVuKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMubmV4dE1lc3NhZ2VMZW5ndGggPSAtMTtcbiAgICAgICAgdGhpcy5tZXNzYWdlVG9rZW4gPSAwO1xuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlVGltZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5yZWFkYWJsZS5vbkRhdGEoKGRhdGEpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25EYXRhKGRhdGEpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZS5vbkVycm9yKChlcnJvcikgPT4gdGhpcy5maXJlRXJyb3IoZXJyb3IpKTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZS5vbkNsb3NlKCgpID0+IHRoaXMuZmlyZUNsb3NlKCkpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBvbkRhdGEoZGF0YSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5idWZmZXIuYXBwZW5kKGRhdGEpO1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IHRoaXMuYnVmZmVyLnRyeVJlYWRIZWFkZXJzKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50TGVuZ3RoID0gaGVhZGVycy5nZXQoJ2NvbnRlbnQtbGVuZ3RoJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY29udGVudExlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IobmV3IEVycm9yKGBIZWFkZXIgbXVzdCBwcm92aWRlIGEgQ29udGVudC1MZW5ndGggcHJvcGVydHkuXFxuJHtKU09OLnN0cmluZ2lmeShPYmplY3QuZnJvbUVudHJpZXMoaGVhZGVycykpfWApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsZW5ndGggPSBwYXJzZUludChjb250ZW50TGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKGxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKG5ldyBFcnJvcihgQ29udGVudC1MZW5ndGggdmFsdWUgbXVzdCBiZSBhIG51bWJlci4gR290ICR7Y29udGVudExlbmd0aH1gKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IHRoaXMuYnVmZmVyLnRyeVJlYWRCb2R5KHRoaXMubmV4dE1lc3NhZ2VMZW5ndGgpO1xuICAgICAgICAgICAgICAgIGlmIChib2R5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLyoqIFdlIGhhdmVuJ3QgcmVjZWl2ZWQgdGhlIGZ1bGwgbWVzc2FnZSB5ZXQuICovXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0UGFydGlhbE1lc3NhZ2VUaW1lcigpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJQYXJ0aWFsTWVzc2FnZVRpbWVyKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9IC0xO1xuICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHdlIGNvbnZlcnQgb25lIHJlY2VpdmVkIG1lc3NhZ2UgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAgICAgLy8gb3RoZXIuIE90aGVyd2lzZSBpdCBjb3VsZCBoYXBwZW4gdGhhdCBhIGRlY29kaW5nIG9mIGEgc2Vjb25kXG4gICAgICAgICAgICAgICAgLy8gc21hbGxlciBtZXNzYWdlIGZpbmlzaGVkIGJlZm9yZSB0aGUgZGVjb2Rpbmcgb2YgYSBmaXJzdCBsYXJnZXJcbiAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIGFuZCB0aGVuIHdlIHdvdWxkIGRlbGl2ZXIgdGhlIHNlY29uZCBtZXNzYWdlIGZpcnN0LlxuICAgICAgICAgICAgICAgIHRoaXMucmVhZFNlbWFwaG9yZS5sb2NrKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnl0ZXMgPSB0aGlzLm9wdGlvbnMuY29udGVudERlY29kZXIgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBhd2FpdCB0aGlzLm9wdGlvbnMuY29udGVudERlY29kZXIuZGVjb2RlKGJvZHkpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGJvZHk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBhd2FpdCB0aGlzLm9wdGlvbnMuY29udGVudFR5cGVEZWNvZGVyLmRlY29kZShieXRlcywgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjayhtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNsZWFyUGFydGlhbE1lc3NhZ2VUaW1lcigpIHtcbiAgICAgICAgaWYgKHRoaXMucGFydGlhbE1lc3NhZ2VUaW1lcikge1xuICAgICAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZVRpbWVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRoaXMucGFydGlhbE1lc3NhZ2VUaW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRQYXJ0aWFsTWVzc2FnZVRpbWVyKCkge1xuICAgICAgICB0aGlzLmNsZWFyUGFydGlhbE1lc3NhZ2VUaW1lcigpO1xuICAgICAgICBpZiAodGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0IDw9IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlVGltZXIgPSAoMCwgcmFsXzEuZGVmYXVsdCkoKS50aW1lci5zZXRUaW1lb3V0KCh0b2tlbiwgdGltZW91dCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZVRpbWVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRva2VuID09PSB0aGlzLm1lc3NhZ2VUb2tlbikge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZVBhcnRpYWxNZXNzYWdlKHsgbWVzc2FnZVRva2VuOiB0b2tlbiwgd2FpdGluZ1RpbWU6IHRpbWVvdXQgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRQYXJ0aWFsTWVzc2FnZVRpbWVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dCwgdGhpcy5tZXNzYWdlVG9rZW4sIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dCk7XG4gICAgfVxufVxuZXhwb3J0cy5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXIgPSBSZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLldyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLkFic3RyYWN0TWVzc2FnZVdyaXRlciA9IGV4cG9ydHMuTWVzc2FnZVdyaXRlciA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IHNlbWFwaG9yZV8xID0gcmVxdWlyZShcIi4vc2VtYXBob3JlXCIpO1xuY29uc3QgZXZlbnRzXzEgPSByZXF1aXJlKFwiLi9ldmVudHNcIik7XG5jb25zdCBDb250ZW50TGVuZ3RoID0gJ0NvbnRlbnQtTGVuZ3RoOiAnO1xuY29uc3QgQ1JMRiA9ICdcXHJcXG4nO1xudmFyIE1lc3NhZ2VXcml0ZXI7XG4oZnVuY3Rpb24gKE1lc3NhZ2VXcml0ZXIpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgSXMuZnVuYyhjYW5kaWRhdGUuZGlzcG9zZSkgJiYgSXMuZnVuYyhjYW5kaWRhdGUub25DbG9zZSkgJiZcbiAgICAgICAgICAgIElzLmZ1bmMoY2FuZGlkYXRlLm9uRXJyb3IpICYmIElzLmZ1bmMoY2FuZGlkYXRlLndyaXRlKTtcbiAgICB9XG4gICAgTWVzc2FnZVdyaXRlci5pcyA9IGlzO1xufSkoTWVzc2FnZVdyaXRlciB8fCAoZXhwb3J0cy5NZXNzYWdlV3JpdGVyID0gTWVzc2FnZVdyaXRlciA9IHt9KSk7XG5jbGFzcyBBYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy5lcnJvckVtaXR0ZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLmNsb3NlRW1pdHRlci5kaXNwb3NlKCk7XG4gICAgfVxuICAgIGdldCBvbkVycm9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lcnJvckVtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGZpcmVFcnJvcihlcnJvciwgbWVzc2FnZSwgY291bnQpIHtcbiAgICAgICAgdGhpcy5lcnJvckVtaXR0ZXIuZmlyZShbdGhpcy5hc0Vycm9yKGVycm9yKSwgbWVzc2FnZSwgY291bnRdKTtcbiAgICB9XG4gICAgZ2V0IG9uQ2xvc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb3NlRW1pdHRlci5ldmVudDtcbiAgICB9XG4gICAgZmlyZUNsb3NlKCkge1xuICAgICAgICB0aGlzLmNsb3NlRW1pdHRlci5maXJlKHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIGFzRXJyb3IoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoYFdyaXRlciByZWNlaXZlZCBlcnJvci4gUmVhc29uOiAke0lzLnN0cmluZyhlcnJvci5tZXNzYWdlKSA/IGVycm9yLm1lc3NhZ2UgOiAndW5rbm93bid9YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLkFic3RyYWN0TWVzc2FnZVdyaXRlciA9IEFic3RyYWN0TWVzc2FnZVdyaXRlcjtcbnZhciBSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zO1xuKGZ1bmN0aW9uIChSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zKSB7XG4gICAgZnVuY3Rpb24gZnJvbU9wdGlvbnMob3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHsgY2hhcnNldDogb3B0aW9ucyA/PyAndXRmLTgnLCBjb250ZW50VHlwZUVuY29kZXI6ICgwLCByYWxfMS5kZWZhdWx0KSgpLmFwcGxpY2F0aW9uSnNvbi5lbmNvZGVyIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4geyBjaGFyc2V0OiBvcHRpb25zLmNoYXJzZXQgPz8gJ3V0Zi04JywgY29udGVudEVuY29kZXI6IG9wdGlvbnMuY29udGVudEVuY29kZXIsIGNvbnRlbnRUeXBlRW5jb2Rlcjogb3B0aW9ucy5jb250ZW50VHlwZUVuY29kZXIgPz8gKDAsIHJhbF8xLmRlZmF1bHQpKCkuYXBwbGljYXRpb25Kc29uLmVuY29kZXIgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zLmZyb21PcHRpb25zID0gZnJvbU9wdGlvbnM7XG59KShSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zIHx8IChSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zID0ge30pKTtcbmNsYXNzIFdyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKHdyaXRhYmxlLCBvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMud3JpdGFibGUgPSB3cml0YWJsZTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gUmVzb2x2ZWRNZXNzYWdlV3JpdGVyT3B0aW9ucy5mcm9tT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50ID0gMDtcbiAgICAgICAgdGhpcy53cml0ZVNlbWFwaG9yZSA9IG5ldyBzZW1hcGhvcmVfMS5TZW1hcGhvcmUoMSk7XG4gICAgICAgIHRoaXMud3JpdGFibGUub25FcnJvcigoZXJyb3IpID0+IHRoaXMuZmlyZUVycm9yKGVycm9yKSk7XG4gICAgICAgIHRoaXMud3JpdGFibGUub25DbG9zZSgoKSA9PiB0aGlzLmZpcmVDbG9zZSgpKTtcbiAgICB9XG4gICAgYXN5bmMgd3JpdGUobXNnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndyaXRlU2VtYXBob3JlLmxvY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHRoaXMub3B0aW9ucy5jb250ZW50VHlwZUVuY29kZXIuZW5jb2RlKG1zZywgdGhpcy5vcHRpb25zKS50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNvbnRlbnRFbmNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jb250ZW50RW5jb2Rlci5lbmNvZGUoYnVmZmVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZC50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJzID0gW107XG4gICAgICAgICAgICAgICAgaGVhZGVycy5wdXNoKENvbnRlbnRMZW5ndGgsIGJ1ZmZlci5ieXRlTGVuZ3RoLnRvU3RyaW5nKCksIENSTEYpO1xuICAgICAgICAgICAgICAgIGhlYWRlcnMucHVzaChDUkxGKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kb1dyaXRlKG1zZywgaGVhZGVycywgYnVmZmVyKTtcbiAgICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgZG9Xcml0ZShtc2csIGhlYWRlcnMsIGRhdGEpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMud3JpdGFibGUud3JpdGUoaGVhZGVycy5qb2luKCcnKSwgJ2FzY2lpJyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy53cml0YWJsZS53cml0ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IsIG1zZyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZUVycm9yKGVycm9yLCBtc2cpIHtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50Kys7XG4gICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yLCBtc2csIHRoaXMuZXJyb3JDb3VudCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICAgICAgdGhpcy53cml0YWJsZS5lbmQoKTtcbiAgICB9XG59XG5leHBvcnRzLldyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgPSBXcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkFic3RyYWN0TWVzc2FnZUJ1ZmZlciA9IHZvaWQgMDtcbmNvbnN0IENSID0gMTM7XG5jb25zdCBMRiA9IDEwO1xuY29uc3QgQ1JMRiA9ICdcXHJcXG4nO1xuY2xhc3MgQWJzdHJhY3RNZXNzYWdlQnVmZmVyIHtcbiAgICBjb25zdHJ1Y3RvcihlbmNvZGluZyA9ICd1dGYtOCcpIHtcbiAgICAgICAgdGhpcy5fZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgICAgICAgdGhpcy5fY2h1bmtzID0gW107XG4gICAgICAgIHRoaXMuX3RvdGFsTGVuZ3RoID0gMDtcbiAgICB9XG4gICAgZ2V0IGVuY29kaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW5jb2Rpbmc7XG4gICAgfVxuICAgIGFwcGVuZChjaHVuaykge1xuICAgICAgICBjb25zdCB0b0FwcGVuZCA9IHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZycgPyB0aGlzLmZyb21TdHJpbmcoY2h1bmssIHRoaXMuX2VuY29kaW5nKSA6IGNodW5rO1xuICAgICAgICB0aGlzLl9jaHVua3MucHVzaCh0b0FwcGVuZCk7XG4gICAgICAgIHRoaXMuX3RvdGFsTGVuZ3RoICs9IHRvQXBwZW5kLmJ5dGVMZW5ndGg7XG4gICAgfVxuICAgIHRyeVJlYWRIZWFkZXJzKGxvd2VyQ2FzZUtleXMgPSBmYWxzZSkge1xuICAgICAgICBpZiAodGhpcy5fY2h1bmtzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3RhdGUgPSAwO1xuICAgICAgICBsZXQgY2h1bmtJbmRleCA9IDA7XG4gICAgICAgIGxldCBvZmZzZXQgPSAwO1xuICAgICAgICBsZXQgY2h1bmtCeXRlc1JlYWQgPSAwO1xuICAgICAgICByb3c6IHdoaWxlIChjaHVua0luZGV4IDwgdGhpcy5fY2h1bmtzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgY2h1bmsgPSB0aGlzLl9jaHVua3NbY2h1bmtJbmRleF07XG4gICAgICAgICAgICBvZmZzZXQgPSAwO1xuICAgICAgICAgICAgY29sdW1uOiB3aGlsZSAob2Zmc2V0IDwgY2h1bmsubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjaHVua1tvZmZzZXRdO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDUjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIExGOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gNDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHJvdztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjaHVua0J5dGVzUmVhZCArPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgY2h1bmtJbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZSAhPT0gNCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgYnVmZmVyIGNvbnRhaW5zIHRoZSB0d28gQ1JMRiBhdCB0aGUgZW5kLiBTbyB3ZSB3aWxsXG4gICAgICAgIC8vIGhhdmUgdHdvIGVtcHR5IGxpbmVzIGFmdGVyIHRoZSBzcGxpdCBhdCB0aGUgZW5kIGFzIHdlbGwuXG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuX3JlYWQoY2h1bmtCeXRlc1JlYWQgKyBvZmZzZXQpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwKCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLnRvU3RyaW5nKGJ1ZmZlciwgJ2FzY2lpJykuc3BsaXQoQ1JMRik7XG4gICAgICAgIGlmIChoZWFkZXJzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXJzLmxlbmd0aCAtIDI7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaGVhZGVyID0gaGVhZGVyc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gaGVhZGVyLmluZGV4T2YoJzonKTtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1lc3NhZ2UgaGVhZGVyIG11c3Qgc2VwYXJhdGUga2V5IGFuZCB2YWx1ZSB1c2luZyAnOidcXG4ke2hlYWRlcn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGhlYWRlci5zdWJzdHIoMCwgaW5kZXgpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBoZWFkZXIuc3Vic3RyKGluZGV4ICsgMSkudHJpbSgpO1xuICAgICAgICAgICAgcmVzdWx0LnNldChsb3dlckNhc2VLZXlzID8ga2V5LnRvTG93ZXJDYXNlKCkgOiBrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICB0cnlSZWFkQm9keShsZW5ndGgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3RvdGFsTGVuZ3RoIDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkKGxlbmd0aCk7XG4gICAgfVxuICAgIGdldCBudW1iZXJPZkJ5dGVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdG90YWxMZW5ndGg7XG4gICAgfVxuICAgIF9yZWFkKGJ5dGVDb3VudCkge1xuICAgICAgICBpZiAoYnl0ZUNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbXB0eUJ1ZmZlcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChieXRlQ291bnQgPiB0aGlzLl90b3RhbExlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVhZCBzbyBtYW55IGJ5dGVzIWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jaHVua3NbMF0uYnl0ZUxlbmd0aCA9PT0gYnl0ZUNvdW50KSB7XG4gICAgICAgICAgICAvLyBzdXBlciBmYXN0IHBhdGgsIHByZWNpc2VseSBmaXJzdCBjaHVuayBtdXN0IGJlIHJldHVybmVkXG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1swXTtcbiAgICAgICAgICAgIHRoaXMuX2NodW5rcy5zaGlmdCgpO1xuICAgICAgICAgICAgdGhpcy5fdG90YWxMZW5ndGggLT0gYnl0ZUNvdW50O1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXNOYXRpdmUoY2h1bmspO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jaHVua3NbMF0uYnl0ZUxlbmd0aCA+IGJ5dGVDb3VudCkge1xuICAgICAgICAgICAgLy8gZmFzdCBwYXRoLCB0aGUgcmVhZGluZyBpcyBlbnRpcmVseSB3aXRoaW4gdGhlIGZpcnN0IGNodW5rXG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1swXTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuYXNOYXRpdmUoY2h1bmssIGJ5dGVDb3VudCk7XG4gICAgICAgICAgICB0aGlzLl9jaHVua3NbMF0gPSBjaHVuay5zbGljZShieXRlQ291bnQpO1xuICAgICAgICAgICAgdGhpcy5fdG90YWxMZW5ndGggLT0gYnl0ZUNvdW50O1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmFsbG9jTmF0aXZlKGJ5dGVDb3VudCk7XG4gICAgICAgIGxldCByZXN1bHRPZmZzZXQgPSAwO1xuICAgICAgICBsZXQgY2h1bmtJbmRleCA9IDA7XG4gICAgICAgIHdoaWxlIChieXRlQ291bnQgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1tjaHVua0luZGV4XTtcbiAgICAgICAgICAgIGlmIChjaHVuay5ieXRlTGVuZ3RoID4gYnl0ZUNvdW50KSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBjaHVuayB3aWxsIHN1cnZpdmVcbiAgICAgICAgICAgICAgICBjb25zdCBjaHVua1BhcnQgPSBjaHVuay5zbGljZSgwLCBieXRlQ291bnQpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5zZXQoY2h1bmtQYXJ0LCByZXN1bHRPZmZzZXQpO1xuICAgICAgICAgICAgICAgIHJlc3VsdE9mZnNldCArPSBieXRlQ291bnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2h1bmtzW2NodW5rSW5kZXhdID0gY2h1bmsuc2xpY2UoYnl0ZUNvdW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLl90b3RhbExlbmd0aCAtPSBieXRlQ291bnQ7XG4gICAgICAgICAgICAgICAgYnl0ZUNvdW50IC09IGJ5dGVDb3VudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHRoaXMgY2h1bmsgd2lsbCBiZSBlbnRpcmVseSByZWFkXG4gICAgICAgICAgICAgICAgcmVzdWx0LnNldChjaHVuaywgcmVzdWx0T2Zmc2V0KTtcbiAgICAgICAgICAgICAgICByZXN1bHRPZmZzZXQgKz0gY2h1bmsuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgICAgICB0aGlzLl9jaHVua3Muc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl90b3RhbExlbmd0aCAtPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgICAgIGJ5dGVDb3VudCAtPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VCdWZmZXIgPSBBYnN0cmFjdE1lc3NhZ2VCdWZmZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uID0gZXhwb3J0cy5Db25uZWN0aW9uT3B0aW9ucyA9IGV4cG9ydHMuTWVzc2FnZVN0cmF0ZWd5ID0gZXhwb3J0cy5DYW5jZWxsYXRpb25TdHJhdGVneSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gZXhwb3J0cy5JZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IGV4cG9ydHMuQ29ubmVjdGlvbkVycm9yID0gZXhwb3J0cy5Db25uZWN0aW9uRXJyb3JzID0gZXhwb3J0cy5Mb2dUcmFjZU5vdGlmaWNhdGlvbiA9IGV4cG9ydHMuU2V0VHJhY2VOb3RpZmljYXRpb24gPSBleHBvcnRzLlRyYWNlRm9ybWF0ID0gZXhwb3J0cy5UcmFjZVZhbHVlcyA9IGV4cG9ydHMuVHJhY2UgPSBleHBvcnRzLk51bGxMb2dnZXIgPSBleHBvcnRzLlByb2dyZXNzVHlwZSA9IGV4cG9ydHMuUHJvZ3Jlc3NUb2tlbiA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IG1lc3NhZ2VzXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlc1wiKTtcbmNvbnN0IGxpbmtlZE1hcF8xID0gcmVxdWlyZShcIi4vbGlua2VkTWFwXCIpO1xuY29uc3QgZXZlbnRzXzEgPSByZXF1aXJlKFwiLi9ldmVudHNcIik7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbnZhciBDYW5jZWxOb3RpZmljYXRpb247XG4oZnVuY3Rpb24gKENhbmNlbE5vdGlmaWNhdGlvbikge1xuICAgIENhbmNlbE5vdGlmaWNhdGlvbi50eXBlID0gbmV3IG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZSgnJC9jYW5jZWxSZXF1ZXN0Jyk7XG59KShDYW5jZWxOb3RpZmljYXRpb24gfHwgKENhbmNlbE5vdGlmaWNhdGlvbiA9IHt9KSk7XG52YXIgUHJvZ3Jlc3NUb2tlbjtcbihmdW5jdGlvbiAoUHJvZ3Jlc3NUb2tlbikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG4gICAgfVxuICAgIFByb2dyZXNzVG9rZW4uaXMgPSBpcztcbn0pKFByb2dyZXNzVG9rZW4gfHwgKGV4cG9ydHMuUHJvZ3Jlc3NUb2tlbiA9IFByb2dyZXNzVG9rZW4gPSB7fSkpO1xudmFyIFByb2dyZXNzTm90aWZpY2F0aW9uO1xuKGZ1bmN0aW9uIChQcm9ncmVzc05vdGlmaWNhdGlvbikge1xuICAgIFByb2dyZXNzTm90aWZpY2F0aW9uLnR5cGUgPSBuZXcgbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlKCckL3Byb2dyZXNzJyk7XG59KShQcm9ncmVzc05vdGlmaWNhdGlvbiB8fCAoUHJvZ3Jlc3NOb3RpZmljYXRpb24gPSB7fSkpO1xuY2xhc3MgUHJvZ3Jlc3NUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICB9XG59XG5leHBvcnRzLlByb2dyZXNzVHlwZSA9IFByb2dyZXNzVHlwZTtcbnZhciBTdGFyUmVxdWVzdEhhbmRsZXI7XG4oZnVuY3Rpb24gKFN0YXJSZXF1ZXN0SGFuZGxlcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBJcy5mdW5jKHZhbHVlKTtcbiAgICB9XG4gICAgU3RhclJlcXVlc3RIYW5kbGVyLmlzID0gaXM7XG59KShTdGFyUmVxdWVzdEhhbmRsZXIgfHwgKFN0YXJSZXF1ZXN0SGFuZGxlciA9IHt9KSk7XG5leHBvcnRzLk51bGxMb2dnZXIgPSBPYmplY3QuZnJlZXplKHtcbiAgICBlcnJvcjogKCkgPT4geyB9LFxuICAgIHdhcm46ICgpID0+IHsgfSxcbiAgICBpbmZvOiAoKSA9PiB7IH0sXG4gICAgbG9nOiAoKSA9PiB7IH1cbn0pO1xudmFyIFRyYWNlO1xuKGZ1bmN0aW9uIChUcmFjZSkge1xuICAgIFRyYWNlW1RyYWNlW1wiT2ZmXCJdID0gMF0gPSBcIk9mZlwiO1xuICAgIFRyYWNlW1RyYWNlW1wiTWVzc2FnZXNcIl0gPSAxXSA9IFwiTWVzc2FnZXNcIjtcbiAgICBUcmFjZVtUcmFjZVtcIkNvbXBhY3RcIl0gPSAyXSA9IFwiQ29tcGFjdFwiO1xuICAgIFRyYWNlW1RyYWNlW1wiVmVyYm9zZVwiXSA9IDNdID0gXCJWZXJib3NlXCI7XG59KShUcmFjZSB8fCAoZXhwb3J0cy5UcmFjZSA9IFRyYWNlID0ge30pKTtcbnZhciBUcmFjZVZhbHVlcztcbihmdW5jdGlvbiAoVHJhY2VWYWx1ZXMpIHtcbiAgICAvKipcbiAgICAgKiBUdXJuIHRyYWNpbmcgb2ZmLlxuICAgICAqL1xuICAgIFRyYWNlVmFsdWVzLk9mZiA9ICdvZmYnO1xuICAgIC8qKlxuICAgICAqIFRyYWNlIG1lc3NhZ2VzIG9ubHkuXG4gICAgICovXG4gICAgVHJhY2VWYWx1ZXMuTWVzc2FnZXMgPSAnbWVzc2FnZXMnO1xuICAgIC8qKlxuICAgICAqIENvbXBhY3QgbWVzc2FnZSB0cmFjaW5nLlxuICAgICAqL1xuICAgIFRyYWNlVmFsdWVzLkNvbXBhY3QgPSAnY29tcGFjdCc7XG4gICAgLyoqXG4gICAgICogVmVyYm9zZSBtZXNzYWdlIHRyYWNpbmcuXG4gICAgICovXG4gICAgVHJhY2VWYWx1ZXMuVmVyYm9zZSA9ICd2ZXJib3NlJztcbn0pKFRyYWNlVmFsdWVzIHx8IChleHBvcnRzLlRyYWNlVmFsdWVzID0gVHJhY2VWYWx1ZXMgPSB7fSkpO1xuKGZ1bmN0aW9uIChUcmFjZSkge1xuICAgIGZ1bmN0aW9uIGZyb21TdHJpbmcodmFsdWUpIHtcbiAgICAgICAgaWYgKCFJcy5zdHJpbmcodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gVHJhY2UuT2ZmO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSAnb2ZmJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gVHJhY2UuT2ZmO1xuICAgICAgICAgICAgY2FzZSAnbWVzc2FnZXMnOlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5NZXNzYWdlcztcbiAgICAgICAgICAgIGNhc2UgJ2NvbXBhY3QnOlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5Db21wYWN0O1xuICAgICAgICAgICAgY2FzZSAndmVyYm9zZSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFRyYWNlLlZlcmJvc2U7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5PZmY7XG4gICAgICAgIH1cbiAgICB9XG4gICAgVHJhY2UuZnJvbVN0cmluZyA9IGZyb21TdHJpbmc7XG4gICAgZnVuY3Rpb24gdG9TdHJpbmcodmFsdWUpIHtcbiAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5PZmY6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdvZmYnO1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5NZXNzYWdlczpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ21lc3NhZ2VzJztcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuQ29tcGFjdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2NvbXBhY3QnO1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5WZXJib3NlOlxuICAgICAgICAgICAgICAgIHJldHVybiAndmVyYm9zZSc7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAnb2ZmJztcbiAgICAgICAgfVxuICAgIH1cbiAgICBUcmFjZS50b1N0cmluZyA9IHRvU3RyaW5nO1xufSkoVHJhY2UgfHwgKGV4cG9ydHMuVHJhY2UgPSBUcmFjZSA9IHt9KSk7XG52YXIgVHJhY2VGb3JtYXQ7XG4oZnVuY3Rpb24gKFRyYWNlRm9ybWF0KSB7XG4gICAgVHJhY2VGb3JtYXRbXCJUZXh0XCJdID0gXCJ0ZXh0XCI7XG4gICAgVHJhY2VGb3JtYXRbXCJKU09OXCJdID0gXCJqc29uXCI7XG59KShUcmFjZUZvcm1hdCB8fCAoZXhwb3J0cy5UcmFjZUZvcm1hdCA9IFRyYWNlRm9ybWF0ID0ge30pKTtcbihmdW5jdGlvbiAoVHJhY2VGb3JtYXQpIHtcbiAgICBmdW5jdGlvbiBmcm9tU3RyaW5nKHZhbHVlKSB7XG4gICAgICAgIGlmICghSXMuc3RyaW5nKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIFRyYWNlRm9ybWF0LlRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAodmFsdWUgPT09ICdqc29uJykge1xuICAgICAgICAgICAgcmV0dXJuIFRyYWNlRm9ybWF0LkpTT047XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gVHJhY2VGb3JtYXQuVGV4dDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBUcmFjZUZvcm1hdC5mcm9tU3RyaW5nID0gZnJvbVN0cmluZztcbn0pKFRyYWNlRm9ybWF0IHx8IChleHBvcnRzLlRyYWNlRm9ybWF0ID0gVHJhY2VGb3JtYXQgPSB7fSkpO1xudmFyIFNldFRyYWNlTm90aWZpY2F0aW9uO1xuKGZ1bmN0aW9uIChTZXRUcmFjZU5vdGlmaWNhdGlvbikge1xuICAgIFNldFRyYWNlTm90aWZpY2F0aW9uLnR5cGUgPSBuZXcgbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlKCckL3NldFRyYWNlJyk7XG59KShTZXRUcmFjZU5vdGlmaWNhdGlvbiB8fCAoZXhwb3J0cy5TZXRUcmFjZU5vdGlmaWNhdGlvbiA9IFNldFRyYWNlTm90aWZpY2F0aW9uID0ge30pKTtcbnZhciBMb2dUcmFjZU5vdGlmaWNhdGlvbjtcbihmdW5jdGlvbiAoTG9nVHJhY2VOb3RpZmljYXRpb24pIHtcbiAgICBMb2dUcmFjZU5vdGlmaWNhdGlvbi50eXBlID0gbmV3IG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZSgnJC9sb2dUcmFjZScpO1xufSkoTG9nVHJhY2VOb3RpZmljYXRpb24gfHwgKGV4cG9ydHMuTG9nVHJhY2VOb3RpZmljYXRpb24gPSBMb2dUcmFjZU5vdGlmaWNhdGlvbiA9IHt9KSk7XG52YXIgQ29ubmVjdGlvbkVycm9ycztcbihmdW5jdGlvbiAoQ29ubmVjdGlvbkVycm9ycykge1xuICAgIC8qKlxuICAgICAqIFRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZC5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uRXJyb3JzW0Nvbm5lY3Rpb25FcnJvcnNbXCJDbG9zZWRcIl0gPSAxXSA9IFwiQ2xvc2VkXCI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gZ290IGRpc3Bvc2VkLlxuICAgICAqL1xuICAgIENvbm5lY3Rpb25FcnJvcnNbQ29ubmVjdGlvbkVycm9yc1tcIkRpc3Bvc2VkXCJdID0gMl0gPSBcIkRpc3Bvc2VkXCI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBpbiBsaXN0ZW5pbmcgbW9kZS5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uRXJyb3JzW0Nvbm5lY3Rpb25FcnJvcnNbXCJBbHJlYWR5TGlzdGVuaW5nXCJdID0gM10gPSBcIkFscmVhZHlMaXN0ZW5pbmdcIjtcbn0pKENvbm5lY3Rpb25FcnJvcnMgfHwgKGV4cG9ydHMuQ29ubmVjdGlvbkVycm9ycyA9IENvbm5lY3Rpb25FcnJvcnMgPSB7fSkpO1xuY2xhc3MgQ29ubmVjdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNvZGUsIG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBDb25uZWN0aW9uRXJyb3IucHJvdG90eXBlKTtcbiAgICB9XG59XG5leHBvcnRzLkNvbm5lY3Rpb25FcnJvciA9IENvbm5lY3Rpb25FcnJvcjtcbnZhciBDb25uZWN0aW9uU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENvbm5lY3Rpb25TdHJhdGVneSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNhbmNlbFVuZGlzcGF0Y2hlZCk7XG4gICAgfVxuICAgIENvbm5lY3Rpb25TdHJhdGVneS5pcyA9IGlzO1xufSkoQ29ubmVjdGlvblN0cmF0ZWd5IHx8IChleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IENvbm5lY3Rpb25TdHJhdGVneSA9IHt9KSk7XG52YXIgSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5O1xuKGZ1bmN0aW9uIChJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiAoY2FuZGlkYXRlLmtpbmQgPT09IHVuZGVmaW5lZCB8fCBjYW5kaWRhdGUua2luZCA9PT0gJ2lkJykgJiYgSXMuZnVuYyhjYW5kaWRhdGUuY3JlYXRlQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UpICYmIChjYW5kaWRhdGUuZGlzcG9zZSA9PT0gdW5kZWZpbmVkIHx8IElzLmZ1bmMoY2FuZGlkYXRlLmRpc3Bvc2UpKTtcbiAgICB9XG4gICAgSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzID0gaXM7XG59KShJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgfHwgKGV4cG9ydHMuSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0ge30pKTtcbnZhciBSZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneTtcbihmdW5jdGlvbiAoUmVxdWVzdENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBjYW5kaWRhdGUua2luZCA9PT0gJ3JlcXVlc3QnICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKSAmJiAoY2FuZGlkYXRlLmRpc3Bvc2UgPT09IHVuZGVmaW5lZCB8fCBJcy5mdW5jKGNhbmRpZGF0ZS5kaXNwb3NlKSk7XG4gICAgfVxuICAgIFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzID0gaXM7XG59KShSZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSB8fCAoZXhwb3J0cy5SZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0ge30pKTtcbnZhciBDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5O1xuKGZ1bmN0aW9uIChDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5NZXNzYWdlID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKF8pIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgY2FuY2VsbGF0aW9uXzEuQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UoKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kuaXModmFsdWUpIHx8IFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKHZhbHVlKTtcbiAgICB9XG4gICAgQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5pcyA9IGlzO1xufSkoQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSB8fCAoZXhwb3J0cy5DYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IHt9KSk7XG52YXIgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENhbmNlbGxhdGlvblNlbmRlclN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kuTWVzc2FnZSA9IE9iamVjdC5mcmVlemUoe1xuICAgICAgICBzZW5kQ2FuY2VsbGF0aW9uKGNvbm4sIGlkKSB7XG4gICAgICAgICAgICByZXR1cm4gY29ubi5zZW5kTm90aWZpY2F0aW9uKENhbmNlbE5vdGlmaWNhdGlvbi50eXBlLCB7IGlkIH0pO1xuICAgICAgICB9LFxuICAgICAgICBjbGVhbnVwKF8pIHsgfVxuICAgIH0pO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLnNlbmRDYW5jZWxsYXRpb24pICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNsZWFudXApO1xuICAgIH1cbiAgICBDYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneS5pcyA9IGlzO1xufSkoQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgfHwgKGV4cG9ydHMuQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgPSBDYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneSA9IHt9KSk7XG52YXIgQ2FuY2VsbGF0aW9uU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENhbmNlbGxhdGlvblN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uU3RyYXRlZ3kuTWVzc2FnZSA9IE9iamVjdC5mcmVlemUoe1xuICAgICAgICByZWNlaXZlcjogQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5NZXNzYWdlLFxuICAgICAgICBzZW5kZXI6IENhbmNlbGxhdGlvblNlbmRlclN0cmF0ZWd5Lk1lc3NhZ2VcbiAgICB9KTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKGNhbmRpZGF0ZS5yZWNlaXZlcikgJiYgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kuaXMoY2FuZGlkYXRlLnNlbmRlcik7XG4gICAgfVxuICAgIENhbmNlbGxhdGlvblN0cmF0ZWd5LmlzID0gaXM7XG59KShDYW5jZWxsYXRpb25TdHJhdGVneSB8fCAoZXhwb3J0cy5DYW5jZWxsYXRpb25TdHJhdGVneSA9IENhbmNlbGxhdGlvblN0cmF0ZWd5ID0ge30pKTtcbnZhciBNZXNzYWdlU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKE1lc3NhZ2VTdHJhdGVneSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLmhhbmRsZU1lc3NhZ2UpO1xuICAgIH1cbiAgICBNZXNzYWdlU3RyYXRlZ3kuaXMgPSBpcztcbn0pKE1lc3NhZ2VTdHJhdGVneSB8fCAoZXhwb3J0cy5NZXNzYWdlU3RyYXRlZ3kgPSBNZXNzYWdlU3RyYXRlZ3kgPSB7fSkpO1xudmFyIENvbm5lY3Rpb25PcHRpb25zO1xuKGZ1bmN0aW9uIChDb25uZWN0aW9uT3B0aW9ucykge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIChDYW5jZWxsYXRpb25TdHJhdGVneS5pcyhjYW5kaWRhdGUuY2FuY2VsbGF0aW9uU3RyYXRlZ3kpIHx8IENvbm5lY3Rpb25TdHJhdGVneS5pcyhjYW5kaWRhdGUuY29ubmVjdGlvblN0cmF0ZWd5KSB8fCBNZXNzYWdlU3RyYXRlZ3kuaXMoY2FuZGlkYXRlLm1lc3NhZ2VTdHJhdGVneSkpO1xuICAgIH1cbiAgICBDb25uZWN0aW9uT3B0aW9ucy5pcyA9IGlzO1xufSkoQ29ubmVjdGlvbk9wdGlvbnMgfHwgKGV4cG9ydHMuQ29ubmVjdGlvbk9wdGlvbnMgPSBDb25uZWN0aW9uT3B0aW9ucyA9IHt9KSk7XG52YXIgQ29ubmVjdGlvblN0YXRlO1xuKGZ1bmN0aW9uIChDb25uZWN0aW9uU3RhdGUpIHtcbiAgICBDb25uZWN0aW9uU3RhdGVbQ29ubmVjdGlvblN0YXRlW1wiTmV3XCJdID0gMV0gPSBcIk5ld1wiO1xuICAgIENvbm5lY3Rpb25TdGF0ZVtDb25uZWN0aW9uU3RhdGVbXCJMaXN0ZW5pbmdcIl0gPSAyXSA9IFwiTGlzdGVuaW5nXCI7XG4gICAgQ29ubmVjdGlvblN0YXRlW0Nvbm5lY3Rpb25TdGF0ZVtcIkNsb3NlZFwiXSA9IDNdID0gXCJDbG9zZWRcIjtcbiAgICBDb25uZWN0aW9uU3RhdGVbQ29ubmVjdGlvblN0YXRlW1wiRGlzcG9zZWRcIl0gPSA0XSA9IFwiRGlzcG9zZWRcIjtcbn0pKENvbm5lY3Rpb25TdGF0ZSB8fCAoQ29ubmVjdGlvblN0YXRlID0ge30pKTtcbmZ1bmN0aW9uIGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uKG1lc3NhZ2VSZWFkZXIsIG1lc3NhZ2VXcml0ZXIsIF9sb2dnZXIsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBsb2dnZXIgPSBfbG9nZ2VyICE9PSB1bmRlZmluZWQgPyBfbG9nZ2VyIDogZXhwb3J0cy5OdWxsTG9nZ2VyO1xuICAgIGxldCBzZXF1ZW5jZU51bWJlciA9IDA7XG4gICAgbGV0IG5vdGlmaWNhdGlvblNlcXVlbmNlTnVtYmVyID0gMDtcbiAgICBsZXQgdW5rbm93blJlc3BvbnNlU2VxdWVuY2VOdW1iZXIgPSAwO1xuICAgIGNvbnN0IHZlcnNpb24gPSAnMi4wJztcbiAgICBsZXQgc3RhclJlcXVlc3RIYW5kbGVyID0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlcXVlc3RIYW5kbGVycyA9IG5ldyBNYXAoKTtcbiAgICBsZXQgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgY29uc3Qgbm90aWZpY2F0aW9uSGFuZGxlcnMgPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgcHJvZ3Jlc3NIYW5kbGVycyA9IG5ldyBNYXAoKTtcbiAgICBsZXQgdGltZXI7XG4gICAgbGV0IG1lc3NhZ2VRdWV1ZSA9IG5ldyBsaW5rZWRNYXBfMS5MaW5rZWRNYXAoKTtcbiAgICBsZXQgcmVzcG9uc2VQcm9taXNlcyA9IG5ldyBNYXAoKTtcbiAgICBsZXQga25vd25DYW5jZWxlZFJlcXVlc3RzID0gbmV3IFNldCgpO1xuICAgIGxldCByZXF1ZXN0VG9rZW5zID0gbmV3IE1hcCgpO1xuICAgIGxldCB0cmFjZSA9IFRyYWNlLk9mZjtcbiAgICBsZXQgdHJhY2VGb3JtYXQgPSBUcmFjZUZvcm1hdC5UZXh0O1xuICAgIGxldCB0cmFjZXI7XG4gICAgbGV0IHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLk5ldztcbiAgICBjb25zdCBlcnJvckVtaXR0ZXIgPSBuZXcgZXZlbnRzXzEuRW1pdHRlcigpO1xuICAgIGNvbnN0IGNsb3NlRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgdW5oYW5kbGVkTm90aWZpY2F0aW9uRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgdW5oYW5kbGVkUHJvZ3Jlc3NFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICBjb25zdCBkaXNwb3NlRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgY2FuY2VsbGF0aW9uU3RyYXRlZ3kgPSAob3B0aW9ucyAmJiBvcHRpb25zLmNhbmNlbGxhdGlvblN0cmF0ZWd5KSA/IG9wdGlvbnMuY2FuY2VsbGF0aW9uU3RyYXRlZ3kgOiBDYW5jZWxsYXRpb25TdHJhdGVneS5NZXNzYWdlO1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlcXVlc3RRdWV1ZUtleShpZCkge1xuICAgICAgICBpZiAoaWQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuJ3Qgc2VuZCByZXF1ZXN0cyB3aXRoIGlkIG51bGwgc2luY2UgdGhlIHJlc3BvbnNlIGNhbid0IGJlIGNvcnJlbGF0ZWQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdyZXEtJyArIGlkLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlc3BvbnNlUXVldWVLZXkoaWQpIHtcbiAgICAgICAgaWYgKGlkID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3Jlcy11bmtub3duLScgKyAoKyt1bmtub3duUmVzcG9uc2VTZXF1ZW5jZU51bWJlcikudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAncmVzLScgKyBpZC50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZU5vdGlmaWNhdGlvblF1ZXVlS2V5KCkge1xuICAgICAgICByZXR1cm4gJ25vdC0nICsgKCsrbm90aWZpY2F0aW9uU2VxdWVuY2VOdW1iZXIpLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFkZE1lc3NhZ2VUb1F1ZXVlKHF1ZXVlLCBtZXNzYWdlKSB7XG4gICAgICAgIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXF1ZXN0KG1lc3NhZ2UpKSB7XG4gICAgICAgICAgICBxdWV1ZS5zZXQoY3JlYXRlUmVxdWVzdFF1ZXVlS2V5KG1lc3NhZ2UuaWQpLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXNwb25zZShtZXNzYWdlKSkge1xuICAgICAgICAgICAgcXVldWUuc2V0KGNyZWF0ZVJlc3BvbnNlUXVldWVLZXkobWVzc2FnZS5pZCksIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcXVldWUuc2V0KGNyZWF0ZU5vdGlmaWNhdGlvblF1ZXVlS2V5KCksIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNhbmNlbFVuZGlzcGF0Y2hlZChfbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0xpc3RlbmluZygpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlID09PSBDb25uZWN0aW9uU3RhdGUuTGlzdGVuaW5nO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0Nsb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlID09PSBDb25uZWN0aW9uU3RhdGUuQ2xvc2VkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0Rpc3Bvc2VkKCkge1xuICAgICAgICByZXR1cm4gc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5EaXNwb3NlZDtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2xvc2VIYW5kbGVyKCkge1xuICAgICAgICBpZiAoc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5OZXcgfHwgc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5MaXN0ZW5pbmcpIHtcbiAgICAgICAgICAgIHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLkNsb3NlZDtcbiAgICAgICAgICAgIGNsb3NlRW1pdHRlci5maXJlKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlIGNvbm5lY3Rpb24gaXMgZGlzcG9zZWQgZG9uJ3Qgc2VudCBjbG9zZSBldmVudHMuXG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlYWRFcnJvckhhbmRsZXIoZXJyb3IpIHtcbiAgICAgICAgZXJyb3JFbWl0dGVyLmZpcmUoW2Vycm9yLCB1bmRlZmluZWQsIHVuZGVmaW5lZF0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiB3cml0ZUVycm9ySGFuZGxlcihkYXRhKSB7XG4gICAgICAgIGVycm9yRW1pdHRlci5maXJlKGRhdGEpO1xuICAgIH1cbiAgICBtZXNzYWdlUmVhZGVyLm9uQ2xvc2UoY2xvc2VIYW5kbGVyKTtcbiAgICBtZXNzYWdlUmVhZGVyLm9uRXJyb3IocmVhZEVycm9ySGFuZGxlcik7XG4gICAgbWVzc2FnZVdyaXRlci5vbkNsb3NlKGNsb3NlSGFuZGxlcik7XG4gICAgbWVzc2FnZVdyaXRlci5vbkVycm9yKHdyaXRlRXJyb3JIYW5kbGVyKTtcbiAgICBmdW5jdGlvbiB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCkge1xuICAgICAgICBpZiAodGltZXIgfHwgbWVzc2FnZVF1ZXVlLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aW1lciA9ICgwLCByYWxfMS5kZWZhdWx0KSgpLnRpbWVyLnNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICAgICAgICB0aW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHByb2Nlc3NNZXNzYWdlUXVldWUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGhhbmRsZU1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICBpZiAobWVzc2FnZXNfMS5NZXNzYWdlLmlzUmVxdWVzdChtZXNzYWdlKSkge1xuICAgICAgICAgICAgaGFuZGxlUmVxdWVzdChtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNOb3RpZmljYXRpb24obWVzc2FnZSkpIHtcbiAgICAgICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvbihtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXNwb25zZShtZXNzYWdlKSkge1xuICAgICAgICAgICAgaGFuZGxlUmVzcG9uc2UobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBoYW5kbGVJbnZhbGlkTWVzc2FnZShtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBwcm9jZXNzTWVzc2FnZVF1ZXVlKCkge1xuICAgICAgICBpZiAobWVzc2FnZVF1ZXVlLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXNzYWdlID0gbWVzc2FnZVF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlU3RyYXRlZ3kgPSBvcHRpb25zPy5tZXNzYWdlU3RyYXRlZ3k7XG4gICAgICAgICAgICBpZiAoTWVzc2FnZVN0cmF0ZWd5LmlzKG1lc3NhZ2VTdHJhdGVneSkpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlU3RyYXRlZ3kuaGFuZGxlTWVzc2FnZShtZXNzYWdlLCBoYW5kbGVNZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGhhbmRsZU1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgY2FsbGJhY2sgPSAobWVzc2FnZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2UgaGF2ZSByZWNlaXZlZCBhIGNhbmNlbGxhdGlvbiBtZXNzYWdlLiBDaGVjayBpZiB0aGUgbWVzc2FnZSBpcyBzdGlsbCBpbiB0aGUgcXVldWVcbiAgICAgICAgICAgIC8vIGFuZCBjYW5jZWwgaXQgaWYgYWxsb3dlZCB0byBkbyBzby5cbiAgICAgICAgICAgIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNOb3RpZmljYXRpb24obWVzc2FnZSkgJiYgbWVzc2FnZS5tZXRob2QgPT09IENhbmNlbE5vdGlmaWNhdGlvbi50eXBlLm1ldGhvZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbmNlbElkID0gbWVzc2FnZS5wYXJhbXMuaWQ7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gY3JlYXRlUmVxdWVzdFF1ZXVlS2V5KGNhbmNlbElkKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0b0NhbmNlbCA9IG1lc3NhZ2VRdWV1ZS5nZXQoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZXNfMS5NZXNzYWdlLmlzUmVxdWVzdCh0b0NhbmNlbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyYXRlZ3kgPSBvcHRpb25zPy5jb25uZWN0aW9uU3RyYXRlZ3k7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gKHN0cmF0ZWd5ICYmIHN0cmF0ZWd5LmNhbmNlbFVuZGlzcGF0Y2hlZCkgPyBzdHJhdGVneS5jYW5jZWxVbmRpc3BhdGNoZWQodG9DYW5jZWwsIGNhbmNlbFVuZGlzcGF0Y2hlZCkgOiBjYW5jZWxVbmRpc3BhdGNoZWQodG9DYW5jZWwpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgJiYgKHJlc3BvbnNlLmVycm9yICE9PSB1bmRlZmluZWQgfHwgcmVzcG9uc2UucmVzdWx0ICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUXVldWUuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLmRlbGV0ZShjYW5jZWxJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5pZCA9IHRvQ2FuY2VsLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VTZW5kaW5nUmVzcG9uc2UocmVzcG9uc2UsIG1lc3NhZ2UubWV0aG9kLCBEYXRlLm5vdygpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUocmVzcG9uc2UpLmNhdGNoKCgpID0+IGxvZ2dlci5lcnJvcihgU2VuZGluZyByZXNwb25zZSBmb3IgY2FuY2VsZWQgbWVzc2FnZSBmYWlsZWQuYCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGNhbmNlbGxhdGlvblRva2VuID0gcmVxdWVzdFRva2Vucy5nZXQoY2FuY2VsSWQpO1xuICAgICAgICAgICAgICAgIC8vIFRoZSByZXF1ZXN0IGlzIGFscmVhZHkgcnVubmluZy4gQ2FuY2VsIHRoZSB0b2tlblxuICAgICAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbmNlbGxhdGlvblRva2VuLmNhbmNlbCgpO1xuICAgICAgICAgICAgICAgICAgICB0cmFjZVJlY2VpdmVkTm90aWZpY2F0aW9uKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZW1lbWJlciB0aGUgY2FuY2VsIGJ1dCBzdGlsbCBxdWV1ZSB0aGUgbWVzc2FnZSB0b1xuICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbiB1cCBzdGF0ZSBpbiBwcm9jZXNzIG1lc3NhZ2UuXG4gICAgICAgICAgICAgICAgICAgIGtub3duQ2FuY2VsZWRSZXF1ZXN0cy5hZGQoY2FuY2VsSWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFkZE1lc3NhZ2VUb1F1ZXVlKG1lc3NhZ2VRdWV1ZSwgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGZ1bmN0aW9uIGhhbmRsZVJlcXVlc3QocmVxdWVzdE1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgLy8gd2UgcmV0dXJuIGhlcmUgc2lsZW50bHkgc2luY2Ugd2UgZmlyZWQgYW4gZXZlbnQgd2hlbiB0aGVcbiAgICAgICAgICAgIC8vIGNvbm5lY3Rpb24gZ290IGRpc3Bvc2VkLlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHJlcGx5KHJlc3VsdE9yRXJyb3IsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgaWQ6IHJlcXVlc3RNZXNzYWdlLmlkXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKHJlc3VsdE9yRXJyb3IgaW5zdGFuY2VvZiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlLmVycm9yID0gcmVzdWx0T3JFcnJvci50b0pzb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVzdWx0ID0gcmVzdWx0T3JFcnJvciA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHJlc3VsdE9yRXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cmFjZVNlbmRpbmdSZXNwb25zZShtZXNzYWdlLCBtZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICBtZXNzYWdlV3JpdGVyLndyaXRlKG1lc3NhZ2UpLmNhdGNoKCgpID0+IGxvZ2dlci5lcnJvcihgU2VuZGluZyByZXNwb25zZSBmYWlsZWQuYCkpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHJlcGx5RXJyb3IoZXJyb3IsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgaWQ6IHJlcXVlc3RNZXNzYWdlLmlkLFxuICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvci50b0pzb24oKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUobWVzc2FnZSkuY2F0Y2goKCkgPT4gbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlc3BvbnNlIGZhaWxlZC5gKSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gcmVwbHlTdWNjZXNzKHJlc3VsdCwgbWV0aG9kLCBzdGFydFRpbWUpIHtcbiAgICAgICAgICAgIC8vIFRoZSBKU09OIFJQQyBkZWZpbmVzIHRoYXQgYSByZXNwb25zZSBtdXN0IGVpdGhlciBoYXZlIGEgcmVzdWx0IG9yIGFuIGVycm9yXG4gICAgICAgICAgICAvLyBTbyB3ZSBjYW4ndCB0cmVhdCB1bmRlZmluZWQgYXMgYSB2YWxpZCByZXNwb25zZSByZXN1bHQuXG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgICAgICAgICAgICBqc29ucnBjOiB2ZXJzaW9uLFxuICAgICAgICAgICAgICAgIGlkOiByZXF1ZXN0TWVzc2FnZS5pZCxcbiAgICAgICAgICAgICAgICByZXN1bHQ6IHJlc3VsdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUobWVzc2FnZSkuY2F0Y2goKCkgPT4gbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlc3BvbnNlIGZhaWxlZC5gKSk7XG4gICAgICAgIH1cbiAgICAgICAgdHJhY2VSZWNlaXZlZFJlcXVlc3QocmVxdWVzdE1lc3NhZ2UpO1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gcmVxdWVzdEhhbmRsZXJzLmdldChyZXF1ZXN0TWVzc2FnZS5tZXRob2QpO1xuICAgICAgICBsZXQgdHlwZTtcbiAgICAgICAgbGV0IHJlcXVlc3RIYW5kbGVyO1xuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgdHlwZSA9IGVsZW1lbnQudHlwZTtcbiAgICAgICAgICAgIHJlcXVlc3RIYW5kbGVyID0gZWxlbWVudC5oYW5kbGVyO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIGlmIChyZXF1ZXN0SGFuZGxlciB8fCBzdGFyUmVxdWVzdEhhbmRsZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHRva2VuS2V5ID0gcmVxdWVzdE1lc3NhZ2UuaWQgPz8gU3RyaW5nKERhdGUubm93KCkpOyAvL1xuICAgICAgICAgICAgY29uc3QgY2FuY2VsbGF0aW9uU291cmNlID0gSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKGNhbmNlbGxhdGlvblN0cmF0ZWd5LnJlY2VpdmVyKVxuICAgICAgICAgICAgICAgID8gY2FuY2VsbGF0aW9uU3RyYXRlZ3kucmVjZWl2ZXIuY3JlYXRlQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UodG9rZW5LZXkpXG4gICAgICAgICAgICAgICAgOiBjYW5jZWxsYXRpb25TdHJhdGVneS5yZWNlaXZlci5jcmVhdGVDYW5jZWxsYXRpb25Ub2tlblNvdXJjZShyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICBpZiAocmVxdWVzdE1lc3NhZ2UuaWQgIT09IG51bGwgJiYga25vd25DYW5jZWxlZFJlcXVlc3RzLmhhcyhyZXF1ZXN0TWVzc2FnZS5pZCkpIHtcbiAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25Tb3VyY2UuY2FuY2VsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVxdWVzdE1lc3NhZ2UuaWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLnNldCh0b2tlbktleSwgY2FuY2VsbGF0aW9uU291cmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IGhhbmRsZXJSZXN1bHQ7XG4gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0TWVzc2FnZS5wYXJhbXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlLm51bWJlck9mUGFyYW1zICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1zLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyAke3R5cGUubnVtYmVyT2ZQYXJhbXN9IHBhcmFtcyBidXQgcmVjZWl2ZWQgbm9uZS5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJSZXN1bHQgPSByZXF1ZXN0SGFuZGxlcihjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVxdWVzdE1lc3NhZ2UucGFyYW1zKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlLnBhcmFtZXRlclN0cnVjdHVyZXMgPT09IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseUVycm9yKG5ldyBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IobWVzc2FnZXNfMS5FcnJvckNvZGVzLkludmFsaWRQYXJhbXMsIGBSZXF1ZXN0ICR7cmVxdWVzdE1lc3NhZ2UubWV0aG9kfSBkZWZpbmVzIHBhcmFtZXRlcnMgYnkgbmFtZSBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBwb3NpdGlvbmApLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlclJlc3VsdCA9IHJlcXVlc3RIYW5kbGVyKC4uLnJlcXVlc3RNZXNzYWdlLnBhcmFtcywgY2FuY2VsbGF0aW9uU291cmNlLnRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS5wYXJhbWV0ZXJTdHJ1Y3R1cmVzID09PSBtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW52YWxpZFBhcmFtcywgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGRlZmluZXMgcGFyYW1ldGVycyBieSBwb3NpdGlvbiBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBuYW1lYCksIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gcmVxdWVzdEhhbmRsZXIocmVxdWVzdE1lc3NhZ2UucGFyYW1zLCBjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0YXJSZXF1ZXN0SGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gc3RhclJlcXVlc3RIYW5kbGVyKHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgcmVxdWVzdE1lc3NhZ2UucGFyYW1zLCBjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBwcm9taXNlID0gaGFuZGxlclJlc3VsdDtcbiAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZXJSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFRva2Vucy5kZWxldGUodG9rZW5LZXkpO1xuICAgICAgICAgICAgICAgICAgICByZXBseVN1Y2Nlc3MoaGFuZGxlclJlc3VsdCwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwcm9taXNlLnRoZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS50aGVuKChyZXN1bHRPckVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLmRlbGV0ZSh0b2tlbktleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXBseShyZXN1bHRPckVycm9yLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IoZXJyb3IsIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVycm9yICYmIElzLnN0cmluZyhlcnJvci5tZXNzYWdlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGZhaWxlZCB3aXRoIG1lc3NhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZmFpbGVkIHVuZXhwZWN0ZWRseSB3aXRob3V0IHByb3ZpZGluZyBhbnkgZGV0YWlscy5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHkoaGFuZGxlclJlc3VsdCwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHkoZXJyb3IsIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZXJyb3IgJiYgSXMuc3RyaW5nKGVycm9yLm1lc3NhZ2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGZhaWxlZCB3aXRoIG1lc3NhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZmFpbGVkIHVuZXhwZWN0ZWRseSB3aXRob3V0IHByb3ZpZGluZyBhbnkgZGV0YWlscy5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuTWV0aG9kTm90Rm91bmQsIGBVbmhhbmRsZWQgbWV0aG9kICR7cmVxdWVzdE1lc3NhZ2UubWV0aG9kfWApLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlUmVzcG9uc2UocmVzcG9uc2VNZXNzYWdlKSB7XG4gICAgICAgIGlmIChpc0Rpc3Bvc2VkKCkpIHtcbiAgICAgICAgICAgIC8vIFNlZSBoYW5kbGUgcmVxdWVzdC5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzcG9uc2VNZXNzYWdlLmlkID09PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VNZXNzYWdlLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBSZWNlaXZlZCByZXNwb25zZSBtZXNzYWdlIHdpdGhvdXQgaWQ6IEVycm9yIGlzOiBcXG4ke0pTT04uc3RyaW5naWZ5KHJlc3BvbnNlTWVzc2FnZS5lcnJvciwgdW5kZWZpbmVkLCA0KX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgUmVjZWl2ZWQgcmVzcG9uc2UgbWVzc2FnZSB3aXRob3V0IGlkLiBObyBmdXJ0aGVyIGVycm9yIGluZm9ybWF0aW9uIHByb3ZpZGVkLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gcmVzcG9uc2VNZXNzYWdlLmlkO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VQcm9taXNlID0gcmVzcG9uc2VQcm9taXNlcy5nZXQoa2V5KTtcbiAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWRSZXNwb25zZShyZXNwb25zZU1lc3NhZ2UsIHJlc3BvbnNlUHJvbWlzZSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VQcm9taXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2VzLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZU1lc3NhZ2UuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gcmVzcG9uc2VNZXNzYWdlLmVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlLnJlamVjdChuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKGVycm9yLmNvZGUsIGVycm9yLm1lc3NhZ2UsIGVycm9yLmRhdGEpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXNwb25zZU1lc3NhZ2UucmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlTWVzc2FnZS5yZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgbmV2ZXIgaGFwcGVuLicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IubWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBSZXNwb25zZSBoYW5kbGVyICcke3Jlc3BvbnNlUHJvbWlzZS5tZXRob2R9JyBmYWlsZWQgd2l0aCBtZXNzYWdlOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYFJlc3BvbnNlIGhhbmRsZXIgJyR7cmVzcG9uc2VQcm9taXNlLm1ldGhvZH0nIGZhaWxlZCB1bmV4cGVjdGVkbHkuYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlTm90aWZpY2F0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgLy8gU2VlIGhhbmRsZSByZXF1ZXN0LlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0eXBlID0gdW5kZWZpbmVkO1xuICAgICAgICBsZXQgbm90aWZpY2F0aW9uSGFuZGxlcjtcbiAgICAgICAgaWYgKG1lc3NhZ2UubWV0aG9kID09PSBDYW5jZWxOb3RpZmljYXRpb24udHlwZS5tZXRob2QpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhbmNlbElkID0gbWVzc2FnZS5wYXJhbXMuaWQ7XG4gICAgICAgICAgICBrbm93bkNhbmNlbGVkUmVxdWVzdHMuZGVsZXRlKGNhbmNlbElkKTtcbiAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWROb3RpZmljYXRpb24obWVzc2FnZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gbm90aWZpY2F0aW9uSGFuZGxlcnMuZ2V0KG1lc3NhZ2UubWV0aG9kKTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uSGFuZGxlciA9IGVsZW1lbnQuaGFuZGxlcjtcbiAgICAgICAgICAgICAgICB0eXBlID0gZWxlbWVudC50eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChub3RpZmljYXRpb25IYW5kbGVyIHx8IHN0YXJOb3RpZmljYXRpb25IYW5kbGVyKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWROb3RpZmljYXRpb24obWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgaWYgKG5vdGlmaWNhdGlvbkhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UucGFyYW1zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5udW1iZXJPZlBhcmFtcyAhPT0gMCAmJiB0eXBlLnBhcmFtZXRlclN0cnVjdHVyZXMgIT09IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBOb3RpZmljYXRpb24gJHttZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyAke3R5cGUubnVtYmVyT2ZQYXJhbXN9IHBhcmFtcyBidXQgcmVjZWl2ZWQgbm9uZS5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShtZXNzYWdlLnBhcmFtcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGFyZSBKU09OLVJQQyBsaWJyYXJpZXMgdGhhdCBzZW5kIHByb2dyZXNzIG1lc3NhZ2UgYXMgcG9zaXRpb25hbCBwYXJhbXMgYWx0aG91Z2hcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpZmllZCBhcyBuYW1lZC4gU28gY29udmVydCB0aGVtIGlmIHRoaXMgaXMgdGhlIGNhc2UuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBtZXNzYWdlLnBhcmFtcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLm1ldGhvZCA9PT0gUHJvZ3Jlc3NOb3RpZmljYXRpb24udHlwZS5tZXRob2QgJiYgcGFyYW1zLmxlbmd0aCA9PT0gMiAmJiBQcm9ncmVzc1Rva2VuLmlzKHBhcmFtc1swXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKHsgdG9rZW46IHBhcmFtc1swXSwgdmFsdWU6IHBhcmFtc1sxXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUucGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBOb3RpZmljYXRpb24gJHttZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyBwYXJhbWV0ZXJzIGJ5IG5hbWUgYnV0IHJlY2VpdmVkIHBhcmFtZXRlcnMgYnkgcG9zaXRpb25gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5udW1iZXJPZlBhcmFtcyAhPT0gbWVzc2FnZS5wYXJhbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYE5vdGlmaWNhdGlvbiAke21lc3NhZ2UubWV0aG9kfSBkZWZpbmVzICR7dHlwZS5udW1iZXJPZlBhcmFtc30gcGFyYW1zIGJ1dCByZWNlaXZlZCAke3BhcmFtcy5sZW5ndGh9IGFyZ3VtZW50c2ApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXIoLi4ucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS5wYXJhbWV0ZXJTdHJ1Y3R1cmVzID09PSBtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgTm90aWZpY2F0aW9uICR7bWVzc2FnZS5tZXRob2R9IGRlZmluZXMgcGFyYW1ldGVycyBieSBwb3NpdGlvbiBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBuYW1lYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKG1lc3NhZ2UucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGFyTm90aWZpY2F0aW9uSGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICBzdGFyTm90aWZpY2F0aW9uSGFuZGxlcihtZXNzYWdlLm1ldGhvZCwgbWVzc2FnZS5wYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvci5tZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgTm90aWZpY2F0aW9uIGhhbmRsZXIgJyR7bWVzc2FnZS5tZXRob2R9JyBmYWlsZWQgd2l0aCBtZXNzYWdlOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYE5vdGlmaWNhdGlvbiBoYW5kbGVyICcke21lc3NhZ2UubWV0aG9kfScgZmFpbGVkIHVuZXhwZWN0ZWRseS5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1bmhhbmRsZWROb3RpZmljYXRpb25FbWl0dGVyLmZpcmUobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlSW52YWxpZE1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignUmVjZWl2ZWQgZW1wdHkgbWVzc2FnZS4nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsb2dnZXIuZXJyb3IoYFJlY2VpdmVkIG1lc3NhZ2Ugd2hpY2ggaXMgbmVpdGhlciBhIHJlc3BvbnNlIG5vciBhIG5vdGlmaWNhdGlvbiBtZXNzYWdlOlxcbiR7SlNPTi5zdHJpbmdpZnkobWVzc2FnZSwgbnVsbCwgNCl9YCk7XG4gICAgICAgIC8vIFRlc3Qgd2hldGhlciB3ZSBmaW5kIGFuIGlkIHRvIHJlamVjdCB0aGUgcHJvbWlzZVxuICAgICAgICBjb25zdCByZXNwb25zZU1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICBpZiAoSXMuc3RyaW5nKHJlc3BvbnNlTWVzc2FnZS5pZCkgfHwgSXMubnVtYmVyKHJlc3BvbnNlTWVzc2FnZS5pZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHJlc3BvbnNlTWVzc2FnZS5pZDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxlciA9IHJlc3BvbnNlUHJvbWlzZXMuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VIYW5kbGVyLnJlamVjdChuZXcgRXJyb3IoJ1RoZSByZWNlaXZlZCByZXNwb25zZSBoYXMgbmVpdGhlciBhIHJlc3VsdCBub3IgYW4gZXJyb3IgcHJvcGVydHkuJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0cmluZ2lmeVRyYWNlKHBhcmFtcykge1xuICAgICAgICBpZiAocGFyYW1zID09PSB1bmRlZmluZWQgfHwgcGFyYW1zID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAodHJhY2UpIHtcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuVmVyYm9zZTpcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGFyYW1zLCBudWxsLCA0KTtcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuQ29tcGFjdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGFyYW1zKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVNlbmRpbmdSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFjZUZvcm1hdCA9PT0gVHJhY2VGb3JtYXQuVGV4dCkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSAmJiBtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBgUGFyYW1zOiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucGFyYW1zKX1cXG5cXG5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJhY2VyLmxvZyhgU2VuZGluZyByZXF1ZXN0ICcke21lc3NhZ2UubWV0aG9kfSAtICgke21lc3NhZ2UuaWR9KScuYCwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb2dMU1BNZXNzYWdlKCdzZW5kLXJlcXVlc3QnLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVNlbmRpbmdOb3RpZmljYXRpb24obWVzc2FnZSkge1xuICAgICAgICBpZiAodHJhY2UgPT09IFRyYWNlLk9mZiB8fCAhdHJhY2VyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYWNlRm9ybWF0ID09PSBUcmFjZUZvcm1hdC5UZXh0KSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdCkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0gYFBhcmFtczogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLnBhcmFtcyl9XFxuXFxuYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSAnTm8gcGFyYW1ldGVycyBwcm92aWRlZC5cXG5cXG4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFNlbmRpbmcgbm90aWZpY2F0aW9uICcke21lc3NhZ2UubWV0aG9kfScuYCwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb2dMU1BNZXNzYWdlKCdzZW5kLW5vdGlmaWNhdGlvbicsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhY2VGb3JtYXQgPT09IFRyYWNlRm9ybWF0LlRleHQpIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZXJyb3IgJiYgbWVzc2FnZS5lcnJvci5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgRXJyb3IgZGF0YTogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLmVycm9yLmRhdGEpfVxcblxcbmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgUmVzdWx0OiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucmVzdWx0KX1cXG5cXG5gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UuZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9ICdObyByZXN1bHQgcmV0dXJuZWQuXFxuXFxuJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFNlbmRpbmcgcmVzcG9uc2UgJyR7bWV0aG9kfSAtICgke21lc3NhZ2UuaWR9KScuIFByb2Nlc3NpbmcgcmVxdWVzdCB0b29rICR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1tc2AsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgnc2VuZC1yZXNwb25zZScsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYWNlUmVjZWl2ZWRSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFjZUZvcm1hdCA9PT0gVHJhY2VGb3JtYXQuVGV4dCkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSAmJiBtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBgUGFyYW1zOiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucGFyYW1zKX1cXG5cXG5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJhY2VyLmxvZyhgUmVjZWl2ZWQgcmVxdWVzdCAnJHttZXNzYWdlLm1ldGhvZH0gLSAoJHttZXNzYWdlLmlkfSknLmAsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1yZXF1ZXN0JywgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdHJhY2VSZWNlaXZlZE5vdGlmaWNhdGlvbihtZXNzYWdlKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIgfHwgbWVzc2FnZS5tZXRob2QgPT09IExvZ1RyYWNlTm90aWZpY2F0aW9uLnR5cGUubWV0aG9kKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYWNlRm9ybWF0ID09PSBUcmFjZUZvcm1hdC5UZXh0KSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdCkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0gYFBhcmFtczogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLnBhcmFtcyl9XFxuXFxuYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSAnTm8gcGFyYW1ldGVycyBwcm92aWRlZC5cXG5cXG4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFJlY2VpdmVkIG5vdGlmaWNhdGlvbiAnJHttZXNzYWdlLm1ldGhvZH0nLmAsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1ub3RpZmljYXRpb24nLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVJlY2VpdmVkUmVzcG9uc2UobWVzc2FnZSwgcmVzcG9uc2VQcm9taXNlKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhY2VGb3JtYXQgPT09IFRyYWNlRm9ybWF0LlRleHQpIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZXJyb3IgJiYgbWVzc2FnZS5lcnJvci5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgRXJyb3IgZGF0YTogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLmVycm9yLmRhdGEpfVxcblxcbmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgUmVzdWx0OiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucmVzdWx0KX1cXG5cXG5gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UuZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9ICdObyByZXN1bHQgcmV0dXJuZWQuXFxuXFxuJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXNwb25zZVByb21pc2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IG1lc3NhZ2UuZXJyb3IgPyBgIFJlcXVlc3QgZmFpbGVkOiAke21lc3NhZ2UuZXJyb3IubWVzc2FnZX0gKCR7bWVzc2FnZS5lcnJvci5jb2RlfSkuYCA6ICcnO1xuICAgICAgICAgICAgICAgIHRyYWNlci5sb2coYFJlY2VpdmVkIHJlc3BvbnNlICcke3Jlc3BvbnNlUHJvbWlzZS5tZXRob2R9IC0gKCR7bWVzc2FnZS5pZH0pJyBpbiAke0RhdGUubm93KCkgLSByZXNwb25zZVByb21pc2UudGltZXJTdGFydH1tcy4ke2Vycm9yfWAsIGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJhY2VyLmxvZyhgUmVjZWl2ZWQgcmVzcG9uc2UgJHttZXNzYWdlLmlkfSB3aXRob3V0IGFjdGl2ZSByZXNwb25zZSBwcm9taXNlLmAsIGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1yZXNwb25zZScsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGxvZ0xTUE1lc3NhZ2UodHlwZSwgbWVzc2FnZSkge1xuICAgICAgICBpZiAoIXRyYWNlciB8fCB0cmFjZSA9PT0gVHJhY2UuT2ZmKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbHNwTWVzc2FnZSA9IHtcbiAgICAgICAgICAgIGlzTFNQTWVzc2FnZTogdHJ1ZSxcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpXG4gICAgICAgIH07XG4gICAgICAgIHRyYWNlci5sb2cobHNwTWVzc2FnZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRocm93SWZDbG9zZWRPckRpc3Bvc2VkKCkge1xuICAgICAgICBpZiAoaXNDbG9zZWQoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IENvbm5lY3Rpb25FcnJvcihDb25uZWN0aW9uRXJyb3JzLkNsb3NlZCwgJ0Nvbm5lY3Rpb24gaXMgY2xvc2VkLicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0Rpc3Bvc2VkKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb25uZWN0aW9uRXJyb3IoQ29ubmVjdGlvbkVycm9ycy5EaXNwb3NlZCwgJ0Nvbm5lY3Rpb24gaXMgZGlzcG9zZWQuJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdGhyb3dJZkxpc3RlbmluZygpIHtcbiAgICAgICAgaWYgKGlzTGlzdGVuaW5nKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb25uZWN0aW9uRXJyb3IoQ29ubmVjdGlvbkVycm9ycy5BbHJlYWR5TGlzdGVuaW5nLCAnQ29ubmVjdGlvbiBpcyBhbHJlYWR5IGxpc3RlbmluZycpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRocm93SWZOb3RMaXN0ZW5pbmcoKSB7XG4gICAgICAgIGlmICghaXNMaXN0ZW5pbmcoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYWxsIGxpc3RlbigpIGZpcnN0LicpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVuZGVmaW5lZFRvTnVsbChwYXJhbSkge1xuICAgICAgICBpZiAocGFyYW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyYW07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gbnVsbFRvVW5kZWZpbmVkKHBhcmFtKSB7XG4gICAgICAgIGlmIChwYXJhbSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJhbTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBpc05hbWVkUGFyYW0ocGFyYW0pIHtcbiAgICAgICAgcmV0dXJuIHBhcmFtICE9PSB1bmRlZmluZWQgJiYgcGFyYW0gIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkocGFyYW0pICYmIHR5cGVvZiBwYXJhbSA9PT0gJ29iamVjdCc7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXB1dGVTaW5nbGVQYXJhbShwYXJhbWV0ZXJTdHJ1Y3R1cmVzLCBwYXJhbSkge1xuICAgICAgICBzd2l0Y2ggKHBhcmFtZXRlclN0cnVjdHVyZXMpIHtcbiAgICAgICAgICAgIGNhc2UgbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG86XG4gICAgICAgICAgICAgICAgaWYgKGlzTmFtZWRQYXJhbShwYXJhbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxUb1VuZGVmaW5lZChwYXJhbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3VuZGVmaW5lZFRvTnVsbChwYXJhbSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZTpcbiAgICAgICAgICAgICAgICBpZiAoIWlzTmFtZWRQYXJhbShwYXJhbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWNlaXZlZCBwYXJhbWV0ZXJzIGJ5IG5hbWUgYnV0IHBhcmFtIGlzIG5vdCBhbiBvYmplY3QgbGl0ZXJhbC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGxUb1VuZGVmaW5lZChwYXJhbSk7XG4gICAgICAgICAgICBjYXNlIG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieVBvc2l0aW9uOlxuICAgICAgICAgICAgICAgIHJldHVybiBbdW5kZWZpbmVkVG9OdWxsKHBhcmFtKV07XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBwYXJhbWV0ZXIgc3RydWN0dXJlICR7cGFyYW1ldGVyU3RydWN0dXJlcy50b1N0cmluZygpfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXB1dGVNZXNzYWdlUGFyYW1zKHR5cGUsIHBhcmFtcykge1xuICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICBjb25zdCBudW1iZXJPZlBhcmFtcyA9IHR5cGUubnVtYmVyT2ZQYXJhbXM7XG4gICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gY29tcHV0ZVNpbmdsZVBhcmFtKHR5cGUucGFyYW1ldGVyU3RydWN0dXJlcywgcGFyYW1zWzBdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoICYmIGkgPCBudW1iZXJPZlBhcmFtczsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHVuZGVmaW5lZFRvTnVsbChwYXJhbXNbaV0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPCBudW1iZXJPZlBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gcGFyYW1zLmxlbmd0aDsgaSA8IG51bWJlck9mUGFyYW1zOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB7XG4gICAgICAgIHNlbmROb3RpZmljYXRpb246ICh0eXBlLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlUGFyYW1zO1xuICAgICAgICAgICAgaWYgKElzLnN0cmluZyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICAgIGxldCBwYXJhbVN0YXJ0ID0gMDtcbiAgICAgICAgICAgICAgICBsZXQgcGFyYW1ldGVyU3RydWN0dXJlcyA9IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvO1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuaXMoZmlyc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtU3RhcnQgPSAxO1xuICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gZmlyc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBwYXJhbUVuZCA9IGFyZ3MubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gcGFyYW1FbmQgLSBwYXJhbVN0YXJ0O1xuICAgICAgICAgICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zID0gY29tcHV0ZVNpbmdsZVBhcmFtKHBhcmFtZXRlclN0cnVjdHVyZXMsIGFyZ3NbcGFyYW1TdGFydF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjZWl2ZWQgJHtudW1iZXJPZlBhcmFtc30gcGFyYW1ldGVycyBmb3IgJ2J5IE5hbWUnIG5vdGlmaWNhdGlvbiBwYXJhbWV0ZXIgc3RydWN0dXJlLmApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IGFyZ3Muc2xpY2UocGFyYW1TdGFydCwgcGFyYW1FbmQpLm1hcCh2YWx1ZSA9PiB1bmRlZmluZWRUb051bGwodmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IGFyZ3M7XG4gICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZS5tZXRob2Q7XG4gICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IGNvbXB1dGVNZXNzYWdlUGFyYW1zKHR5cGUsIHBhcmFtcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBub3RpZmljYXRpb25NZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBtZXNzYWdlUGFyYW1zXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdHJhY2VTZW5kaW5nTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbk1lc3NhZ2UpO1xuICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2VXcml0ZXIud3JpdGUobm90aWZpY2F0aW9uTWVzc2FnZSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBTZW5kaW5nIG5vdGlmaWNhdGlvbiBmYWlsZWQuYCk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25Ob3RpZmljYXRpb246ICh0eXBlLCBoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGlmIChJcy5mdW5jKHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB0eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaGFuZGxlcikge1xuICAgICAgICAgICAgICAgIGlmIChJcy5zdHJpbmcodHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZTtcbiAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uSGFuZGxlcnMuc2V0KHR5cGUsIHsgdHlwZTogdW5kZWZpbmVkLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZS5tZXRob2Q7XG4gICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXJzLnNldCh0eXBlLm1ldGhvZCwgeyB0eXBlLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXJzLmRlbGV0ZShtZXRob2QpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBvblByb2dyZXNzOiAoX3R5cGUsIHRva2VuLCBoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgICBpZiAocHJvZ3Jlc3NIYW5kbGVycy5oYXModG9rZW4pKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm9ncmVzcyBoYW5kbGVyIGZvciB0b2tlbiAke3Rva2VufSBhbHJlYWR5IHJlZ2lzdGVyZWRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByb2dyZXNzSGFuZGxlcnMuc2V0KHRva2VuLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc0hhbmRsZXJzLmRlbGV0ZSh0b2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgc2VuZFByb2dyZXNzOiAoX3R5cGUsIHRva2VuLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGF3YWl0IGJ1dCBzaW1wbGUgcmV0dXJuIHRvIGVuc3VyZSB0aGF0IHdlIGRvbid0IGhhdmUgYW5vdGhlclxuICAgICAgICAgICAgLy8gYXN5bmMgc2NoZWR1bGluZy4gT3RoZXJ3aXNlIG9uZSBzZW5kIGNvdWxkIG92ZXJ0YWtlIGFub3RoZXIgc2VuZC5cbiAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLnNlbmROb3RpZmljYXRpb24oUHJvZ3Jlc3NOb3RpZmljYXRpb24udHlwZSwgeyB0b2tlbiwgdmFsdWUgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uVW5oYW5kbGVkUHJvZ3Jlc3M6IHVuaGFuZGxlZFByb2dyZXNzRW1pdHRlci5ldmVudCxcbiAgICAgICAgc2VuZFJlcXVlc3Q6ICh0eXBlLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgdGhyb3dJZk5vdExpc3RlbmluZygpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlUGFyYW1zO1xuICAgICAgICAgICAgbGV0IHRva2VuID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKElzLnN0cmluZyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3QgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgbGV0IHBhcmFtU3RhcnQgPSAwO1xuICAgICAgICAgICAgICAgIGxldCBwYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG87XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5pcyhmaXJzdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1TdGFydCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlclN0cnVjdHVyZXMgPSBmaXJzdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHBhcmFtRW5kID0gYXJncy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuLmlzKGxhc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtRW5kID0gcGFyYW1FbmQgLSAxO1xuICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IGxhc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gcGFyYW1FbmQgLSBwYXJhbVN0YXJ0O1xuICAgICAgICAgICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zID0gY29tcHV0ZVNpbmdsZVBhcmFtKHBhcmFtZXRlclN0cnVjdHVyZXMsIGFyZ3NbcGFyYW1TdGFydF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjZWl2ZWQgJHtudW1iZXJPZlBhcmFtc30gcGFyYW1ldGVycyBmb3IgJ2J5IE5hbWUnIHJlcXVlc3QgcGFyYW1ldGVyIHN0cnVjdHVyZS5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMgPSBhcmdzLnNsaWNlKHBhcmFtU3RhcnQsIHBhcmFtRW5kKS5tYXAodmFsdWUgPT4gdW5kZWZpbmVkVG9OdWxsKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBhcmdzO1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGUubWV0aG9kO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMgPSBjb21wdXRlTWVzc2FnZVBhcmFtcyh0eXBlLCBwYXJhbXMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gdHlwZS5udW1iZXJPZlBhcmFtcztcbiAgICAgICAgICAgICAgICB0b2tlbiA9IGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuLmlzKHBhcmFtc1tudW1iZXJPZlBhcmFtc10pID8gcGFyYW1zW251bWJlck9mUGFyYW1zXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGlkID0gc2VxdWVuY2VOdW1iZXIrKztcbiAgICAgICAgICAgIGxldCBkaXNwb3NhYmxlO1xuICAgICAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgICAgICAgZGlzcG9zYWJsZSA9IHRva2VuLm9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcCA9IGNhbmNlbGxhdGlvblN0cmF0ZWd5LnNlbmRlci5zZW5kQ2FuY2VsbGF0aW9uKGNvbm5lY3Rpb24sIGlkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhgUmVjZWl2ZWQgbm8gcHJvbWlzZSBmcm9tIGNhbmNlbGxhdGlvbiBzdHJhdGVneSB3aGVuIGNhbmNlbGxpbmcgaWQgJHtpZH1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIubG9nKGBTZW5kaW5nIGNhbmNlbGxhdGlvbiBtZXNzYWdlcyBmb3IgaWQgJHtpZH0gZmFpbGVkYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdE1lc3NhZ2UgPSB7XG4gICAgICAgICAgICAgICAganNvbnJwYzogdmVyc2lvbixcbiAgICAgICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBtZXNzYWdlUGFyYW1zXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdHJhY2VTZW5kaW5nUmVxdWVzdChyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNhbmNlbGxhdGlvblN0cmF0ZWd5LnNlbmRlci5lbmFibGVDYW5jZWxsYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25TdHJhdGVneS5zZW5kZXIuZW5hYmxlQ2FuY2VsbGF0aW9uKHJlcXVlc3RNZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZVdpdGhDbGVhbnVwID0gKHIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyKTtcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uU3RyYXRlZ3kuc2VuZGVyLmNsZWFudXAoaWQpO1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlPy5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWplY3RXaXRoQ2xlYW51cCA9IChyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChyKTtcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uU3RyYXRlZ3kuc2VuZGVyLmNsZWFudXAoaWQpO1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlPy5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZVByb21pc2UgPSB7IG1ldGhvZDogbWV0aG9kLCB0aW1lclN0YXJ0OiBEYXRlLm5vdygpLCByZXNvbHZlOiByZXNvbHZlV2l0aENsZWFudXAsIHJlamVjdDogcmVqZWN0V2l0aENsZWFudXAgfTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2VzLnNldChpZCwgcmVzcG9uc2VQcm9taXNlKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbWVzc2FnZVdyaXRlci53cml0ZShyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAvLyBXcml0aW5nIHRoZSBtZXNzYWdlIGZhaWxlZC4gU28gd2UgbmVlZCB0byBkZWxldGUgaXQgZnJvbSB0aGUgcmVzcG9uc2UgcHJvbWlzZXMgYW5kXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlamVjdCBpdC5cbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlcy5kZWxldGUoaWQpO1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2UucmVqZWN0KG5ldyBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IobWVzc2FnZXNfMS5FcnJvckNvZGVzLk1lc3NhZ2VXcml0ZUVycm9yLCBlcnJvci5tZXNzYWdlID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIHJlYXNvbicpKTtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlcXVlc3QgZmFpbGVkLmApO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25SZXF1ZXN0OiAodHlwZSwgaGFuZGxlcikgPT4ge1xuICAgICAgICAgICAgdGhyb3dJZkNsb3NlZE9yRGlzcG9zZWQoKTtcbiAgICAgICAgICAgIGxldCBtZXRob2QgPSBudWxsO1xuICAgICAgICAgICAgaWYgKFN0YXJSZXF1ZXN0SGFuZGxlci5pcyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBzdGFyUmVxdWVzdEhhbmRsZXIgPSB0eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoSXMuc3RyaW5nKHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgbWV0aG9kID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoaGFuZGxlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RIYW5kbGVycy5zZXQodHlwZSwgeyBoYW5kbGVyOiBoYW5kbGVyLCB0eXBlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSB0eXBlLm1ldGhvZDtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEhhbmRsZXJzLnNldCh0eXBlLm1ldGhvZCwgeyB0eXBlLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SGFuZGxlcnMuZGVsZXRlKG1ldGhvZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFyUmVxdWVzdEhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBoYXNQZW5kaW5nUmVzcG9uc2U6ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZVByb21pc2VzLnNpemUgPiAwO1xuICAgICAgICB9LFxuICAgICAgICB0cmFjZTogYXN5bmMgKF92YWx1ZSwgX3RyYWNlciwgc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBsZXQgX3NlbmROb3RpZmljYXRpb24gPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBfdHJhY2VGb3JtYXQgPSBUcmFjZUZvcm1hdC5UZXh0O1xuICAgICAgICAgICAgaWYgKHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKElzLmJvb2xlYW4oc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zKSkge1xuICAgICAgICAgICAgICAgICAgICBfc2VuZE5vdGlmaWNhdGlvbiA9IHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF9zZW5kTm90aWZpY2F0aW9uID0gc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zLnNlbmROb3RpZmljYXRpb24gfHwgZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIF90cmFjZUZvcm1hdCA9IHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucy50cmFjZUZvcm1hdCB8fCBUcmFjZUZvcm1hdC5UZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlID0gX3ZhbHVlO1xuICAgICAgICAgICAgdHJhY2VGb3JtYXQgPSBfdHJhY2VGb3JtYXQ7XG4gICAgICAgICAgICBpZiAodHJhY2UgPT09IFRyYWNlLk9mZikge1xuICAgICAgICAgICAgICAgIHRyYWNlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRyYWNlciA9IF90cmFjZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoX3NlbmROb3RpZmljYXRpb24gJiYgIWlzQ2xvc2VkKCkgJiYgIWlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGNvbm5lY3Rpb24uc2VuZE5vdGlmaWNhdGlvbihTZXRUcmFjZU5vdGlmaWNhdGlvbi50eXBlLCB7IHZhbHVlOiBUcmFjZS50b1N0cmluZyhfdmFsdWUpIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBvbkVycm9yOiBlcnJvckVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIG9uQ2xvc2U6IGNsb3NlRW1pdHRlci5ldmVudCxcbiAgICAgICAgb25VbmhhbmRsZWROb3RpZmljYXRpb246IHVuaGFuZGxlZE5vdGlmaWNhdGlvbkVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIG9uRGlzcG9zZTogZGlzcG9zZUVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIGVuZDogKCkgPT4ge1xuICAgICAgICAgICAgbWVzc2FnZVdyaXRlci5lbmQoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLkRpc3Bvc2VkO1xuICAgICAgICAgICAgZGlzcG9zZUVtaXR0ZXIuZmlyZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5QZW5kaW5nUmVzcG9uc2VSZWplY3RlZCwgJ1BlbmRpbmcgcmVzcG9uc2UgcmVqZWN0ZWQgc2luY2UgY29ubmVjdGlvbiBnb3QgZGlzcG9zZWQnKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvbWlzZSBvZiByZXNwb25zZVByb21pc2VzLnZhbHVlcygpKSB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBrbm93bkNhbmNlbGVkUmVxdWVzdHMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICBtZXNzYWdlUXVldWUgPSBuZXcgbGlua2VkTWFwXzEuTGlua2VkTWFwKCk7XG4gICAgICAgICAgICAvLyBUZXN0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgaWYgKElzLmZ1bmMobWVzc2FnZVdyaXRlci5kaXNwb3NlKSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKElzLmZ1bmMobWVzc2FnZVJlYWRlci5kaXNwb3NlKSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VSZWFkZXIuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBsaXN0ZW46ICgpID0+IHtcbiAgICAgICAgICAgIHRocm93SWZDbG9zZWRPckRpc3Bvc2VkKCk7XG4gICAgICAgICAgICB0aHJvd0lmTGlzdGVuaW5nKCk7XG4gICAgICAgICAgICBzdGF0ZSA9IENvbm5lY3Rpb25TdGF0ZS5MaXN0ZW5pbmc7XG4gICAgICAgICAgICBtZXNzYWdlUmVhZGVyLmxpc3RlbihjYWxsYmFjayk7XG4gICAgICAgIH0sXG4gICAgICAgIGluc3BlY3Q6ICgpID0+IHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS5jb25zb2xlLmxvZygnaW5zcGVjdCcpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25uZWN0aW9uLm9uTm90aWZpY2F0aW9uKExvZ1RyYWNlTm90aWZpY2F0aW9uLnR5cGUsIChwYXJhbXMpID0+IHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZlcmJvc2UgPSB0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdDtcbiAgICAgICAgdHJhY2VyLmxvZyhwYXJhbXMubWVzc2FnZSwgdmVyYm9zZSA/IHBhcmFtcy52ZXJib3NlIDogdW5kZWZpbmVkKTtcbiAgICB9KTtcbiAgICBjb25uZWN0aW9uLm9uTm90aWZpY2F0aW9uKFByb2dyZXNzTm90aWZpY2F0aW9uLnR5cGUsIChwYXJhbXMpID0+IHtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IHByb2dyZXNzSGFuZGxlcnMuZ2V0KHBhcmFtcy50b2tlbik7XG4gICAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICAgICBoYW5kbGVyKHBhcmFtcy52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1bmhhbmRsZWRQcm9ncmVzc0VtaXR0ZXIuZmlyZShwYXJhbXMpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbm5lY3Rpb247XG59XG5leHBvcnRzLmNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uID0gY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb247XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vdHlwaW5ncy90aGVuYWJsZS5kLnRzXCIgLz5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUHJvZ3Jlc3NUeXBlID0gZXhwb3J0cy5Qcm9ncmVzc1Rva2VuID0gZXhwb3J0cy5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiA9IGV4cG9ydHMuTnVsbExvZ2dlciA9IGV4cG9ydHMuQ29ubmVjdGlvbk9wdGlvbnMgPSBleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IGV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlQnVmZmVyID0gZXhwb3J0cy5Xcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyID0gZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLk1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLlJlYWRhYmxlU3RyZWFtTWVzc2FnZVJlYWRlciA9IGV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlUmVhZGVyID0gZXhwb3J0cy5NZXNzYWdlUmVhZGVyID0gZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblRva2VuID0gZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IGV4cG9ydHMuRW1pdHRlciA9IGV4cG9ydHMuRXZlbnQgPSBleHBvcnRzLkRpc3Bvc2FibGUgPSBleHBvcnRzLkxSVUNhY2hlID0gZXhwb3J0cy5Ub3VjaCA9IGV4cG9ydHMuTGlua2VkTWFwID0gZXhwb3J0cy5QYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlOSA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTggPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU3ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNiA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTUgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU0ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMyA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTIgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUxID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMCA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZSA9IGV4cG9ydHMuRXJyb3JDb2RlcyA9IGV4cG9ydHMuUmVzcG9uc2VFcnJvciA9IGV4cG9ydHMuUmVxdWVzdFR5cGU5ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTggPSBleHBvcnRzLlJlcXVlc3RUeXBlNyA9IGV4cG9ydHMuUmVxdWVzdFR5cGU2ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTUgPSBleHBvcnRzLlJlcXVlc3RUeXBlNCA9IGV4cG9ydHMuUmVxdWVzdFR5cGUzID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTIgPSBleHBvcnRzLlJlcXVlc3RUeXBlMSA9IGV4cG9ydHMuUmVxdWVzdFR5cGUwID0gZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IGV4cG9ydHMuTWVzc2FnZSA9IGV4cG9ydHMuUkFMID0gdm9pZCAwO1xuZXhwb3J0cy5NZXNzYWdlU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblN0cmF0ZWd5ID0gZXhwb3J0cy5DYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IGV4cG9ydHMuQ29ubmVjdGlvbkVycm9yID0gZXhwb3J0cy5Db25uZWN0aW9uRXJyb3JzID0gZXhwb3J0cy5Mb2dUcmFjZU5vdGlmaWNhdGlvbiA9IGV4cG9ydHMuU2V0VHJhY2VOb3RpZmljYXRpb24gPSBleHBvcnRzLlRyYWNlRm9ybWF0ID0gZXhwb3J0cy5UcmFjZVZhbHVlcyA9IGV4cG9ydHMuVHJhY2UgPSB2b2lkIDA7XG5jb25zdCBtZXNzYWdlc18xID0gcmVxdWlyZShcIi4vbWVzc2FnZXNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNZXNzYWdlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk1lc3NhZ2U7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlMFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTA7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTFcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGUxOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGUyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlMjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlM1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGU0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGU1XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlNTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlNlwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTY7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTdcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGU3OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGU4XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlODsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlOVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTk7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXNwb25zZUVycm9yXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3I7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJFcnJvckNvZGVzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLkVycm9yQ29kZXM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlMFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlMDsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGUxXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGUxOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZTJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlM1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlMzsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGU0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZTVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlNlwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlNjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGU3XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU3OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZThcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTg7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlOVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlOTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlBhcmFtZXRlclN0cnVjdHVyZXNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlczsgfSB9KTtcbmNvbnN0IGxpbmtlZE1hcF8xID0gcmVxdWlyZShcIi4vbGlua2VkTWFwXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTGlua2VkTWFwXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBsaW5rZWRNYXBfMS5MaW5rZWRNYXA7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJMUlVDYWNoZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbGlua2VkTWFwXzEuTFJVQ2FjaGU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJUb3VjaFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbGlua2VkTWFwXzEuVG91Y2g7IH0gfSk7XG5jb25zdCBkaXNwb3NhYmxlXzEgPSByZXF1aXJlKFwiLi9kaXNwb3NhYmxlXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiRGlzcG9zYWJsZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZGlzcG9zYWJsZV8xLkRpc3Bvc2FibGU7IH0gfSk7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCIuL2V2ZW50c1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkV2ZW50XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBldmVudHNfMS5FdmVudDsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkVtaXR0ZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGV2ZW50c18xLkVtaXR0ZXI7IH0gfSk7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblRva2VuU291cmNlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjYW5jZWxsYXRpb25fMS5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblRva2VuXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjYW5jZWxsYXRpb25fMS5DYW5jZWxsYXRpb25Ub2tlbjsgfSB9KTtcbmNvbnN0IHNoYXJlZEFycmF5Q2FuY2VsbGF0aW9uXzEgPSByZXF1aXJlKFwiLi9zaGFyZWRBcnJheUNhbmNlbGxhdGlvblwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHNoYXJlZEFycmF5Q2FuY2VsbGF0aW9uXzEuU2hhcmVkQXJyYXlTZW5kZXJTdHJhdGVneTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlNoYXJlZEFycmF5UmVjZWl2ZXJTdHJhdGVneVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gc2hhcmVkQXJyYXlDYW5jZWxsYXRpb25fMS5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3k7IH0gfSk7XG5jb25zdCBtZXNzYWdlUmVhZGVyXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlUmVhZGVyXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTWVzc2FnZVJlYWRlclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZVJlYWRlcl8xLk1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VSZWFkZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VSZWFkZXJfMS5BYnN0cmFjdE1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VSZWFkZXJfMS5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5jb25zdCBtZXNzYWdlV3JpdGVyXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlV3JpdGVyXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTWVzc2FnZVdyaXRlclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZVdyaXRlcl8xLk1lc3NhZ2VXcml0ZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VXcml0ZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VXcml0ZXJfMS5BYnN0cmFjdE1lc3NhZ2VXcml0ZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJXcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlV3JpdGVyXzEuV3JpdGVhYmxlU3RyZWFtTWVzc2FnZVdyaXRlcjsgfSB9KTtcbmNvbnN0IG1lc3NhZ2VCdWZmZXJfMSA9IHJlcXVpcmUoXCIuL21lc3NhZ2VCdWZmZXJcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VCdWZmZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VCdWZmZXJfMS5BYnN0cmFjdE1lc3NhZ2VCdWZmZXI7IH0gfSk7XG5jb25zdCBjb25uZWN0aW9uXzEgPSByZXF1aXJlKFwiLi9jb25uZWN0aW9uXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29ubmVjdGlvblN0cmF0ZWd5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ29ubmVjdGlvblN0cmF0ZWd5OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29ubmVjdGlvbk9wdGlvbnNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5Db25uZWN0aW9uT3B0aW9uczsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk51bGxMb2dnZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5OdWxsTG9nZ2VyOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb25cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlByb2dyZXNzVG9rZW5cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5Qcm9ncmVzc1Rva2VuOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUHJvZ3Jlc3NUeXBlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuUHJvZ3Jlc3NUeXBlOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiVHJhY2VcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5UcmFjZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlRyYWNlVmFsdWVzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuVHJhY2VWYWx1ZXM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJUcmFjZUZvcm1hdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29ubmVjdGlvbl8xLlRyYWNlRm9ybWF0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiU2V0VHJhY2VOb3RpZmljYXRpb25cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5TZXRUcmFjZU5vdGlmaWNhdGlvbjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkxvZ1RyYWNlTm90aWZpY2F0aW9uXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuTG9nVHJhY2VOb3RpZmljYXRpb247IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJDb25uZWN0aW9uRXJyb3JzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ29ubmVjdGlvbkVycm9yczsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNvbm5lY3Rpb25FcnJvclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29ubmVjdGlvbl8xLkNvbm5lY3Rpb25FcnJvcjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5DYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5DYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblN0cmF0ZWd5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ2FuY2VsbGF0aW9uU3RyYXRlZ3k7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNZXNzYWdlU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5NZXNzYWdlU3RyYXRlZ3k7IH0gfSk7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbmV4cG9ydHMuUkFMID0gcmFsXzEuZGVmYXVsdDtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGFwaV8xID0gcmVxdWlyZShcIi4uL2NvbW1vbi9hcGlcIik7XG5jbGFzcyBNZXNzYWdlQnVmZmVyIGV4dGVuZHMgYXBpXzEuQWJzdHJhY3RNZXNzYWdlQnVmZmVyIHtcbiAgICBjb25zdHJ1Y3RvcihlbmNvZGluZyA9ICd1dGYtOCcpIHtcbiAgICAgICAgc3VwZXIoZW5jb2RpbmcpO1xuICAgICAgICB0aGlzLmFzY2lpRGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcignYXNjaWknKTtcbiAgICB9XG4gICAgZW1wdHlCdWZmZXIoKSB7XG4gICAgICAgIHJldHVybiBNZXNzYWdlQnVmZmVyLmVtcHR5QnVmZmVyO1xuICAgIH1cbiAgICBmcm9tU3RyaW5nKHZhbHVlLCBfZW5jb2RpbmcpIHtcbiAgICAgICAgcmV0dXJuIChuZXcgVGV4dEVuY29kZXIoKSkuZW5jb2RlKHZhbHVlKTtcbiAgICB9XG4gICAgdG9TdHJpbmcodmFsdWUsIGVuY29kaW5nKSB7XG4gICAgICAgIGlmIChlbmNvZGluZyA9PT0gJ2FzY2lpJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXNjaWlEZWNvZGVyLmRlY29kZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gKG5ldyBUZXh0RGVjb2RlcihlbmNvZGluZykpLmRlY29kZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXNOYXRpdmUoYnVmZmVyLCBsZW5ndGgpIHtcbiAgICAgICAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlci5zbGljZSgwLCBsZW5ndGgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFsbG9jTmF0aXZlKGxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTtcbiAgICB9XG59XG5NZXNzYWdlQnVmZmVyLmVtcHR5QnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMCk7XG5jbGFzcyBSZWFkYWJsZVN0cmVhbVdyYXBwZXIge1xuICAgIGNvbnN0cnVjdG9yKHNvY2tldCkge1xuICAgICAgICB0aGlzLnNvY2tldCA9IHNvY2tldDtcbiAgICAgICAgdGhpcy5fb25EYXRhID0gbmV3IGFwaV8xLkVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5fbWVzc2FnZUxpc3RlbmVyID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBibG9iID0gZXZlbnQuZGF0YTtcbiAgICAgICAgICAgIGJsb2IuYXJyYXlCdWZmZXIoKS50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkRhdGEuZmlyZShuZXcgVWludDhBcnJheShidWZmZXIpKTtcbiAgICAgICAgICAgIH0sICgpID0+IHtcbiAgICAgICAgICAgICAgICAoMCwgYXBpXzEuUkFMKSgpLmNvbnNvbGUuZXJyb3IoYENvbnZlcnRpbmcgYmxvYiB0byBhcnJheSBidWZmZXIgZmFpbGVkLmApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLl9tZXNzYWdlTGlzdGVuZXIpO1xuICAgIH1cbiAgICBvbkNsb3NlKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2Nsb3NlJywgbGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gYXBpXzEuRGlzcG9zYWJsZS5jcmVhdGUoKCkgPT4gdGhpcy5zb2NrZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xvc2UnLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkVycm9yKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgbGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gYXBpXzEuRGlzcG9zYWJsZS5jcmVhdGUoKCkgPT4gdGhpcy5zb2NrZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkVuZChsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKCdlbmQnLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdlbmQnLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkRhdGEobGlzdGVuZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uRGF0YS5ldmVudChsaXN0ZW5lcik7XG4gICAgfVxufVxuY2xhc3MgV3JpdGFibGVTdHJlYW1XcmFwcGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihzb2NrZXQpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7XG4gICAgfVxuICAgIG9uQ2xvc2UobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignY2xvc2UnLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbG9zZScsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIG9uRXJyb3IobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIG9uRW5kKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2VuZCcsIGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIGFwaV8xLkRpc3Bvc2FibGUuY3JlYXRlKCgpID0+IHRoaXMuc29ja2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2VuZCcsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIHdyaXRlKGRhdGEsIGVuY29kaW5nKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkICYmIGVuY29kaW5nICE9PSAndXRmLTgnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbiBhIEJyb3dzZXIgZW52aXJvbm1lbnRzIG9ubHkgdXRmLTggdGV4dCBlbmNvZGluZyBpcyBzdXBwb3J0ZWQuIEJ1dCBnb3QgZW5jb2Rpbmc6ICR7ZW5jb2Rpbmd9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKTtcbiAgICB9XG59XG5jb25zdCBfdGV4dEVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbmNvbnN0IF9yaWwgPSBPYmplY3QuZnJlZXplKHtcbiAgICBtZXNzYWdlQnVmZmVyOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgY3JlYXRlOiAoZW5jb2RpbmcpID0+IG5ldyBNZXNzYWdlQnVmZmVyKGVuY29kaW5nKVxuICAgIH0pLFxuICAgIGFwcGxpY2F0aW9uSnNvbjogT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGVuY29kZXI6IE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgbmFtZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgZW5jb2RlOiAobXNnLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2hhcnNldCAhPT0gJ3V0Zi04Jykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluIGEgQnJvd3NlciBlbnZpcm9ubWVudHMgb25seSB1dGYtOCB0ZXh0IGVuY29kaW5nIGlzIHN1cHBvcnRlZC4gQnV0IGdvdCBlbmNvZGluZzogJHtvcHRpb25zLmNoYXJzZXR9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoX3RleHRFbmNvZGVyLmVuY29kZShKU09OLnN0cmluZ2lmeShtc2csIHVuZGVmaW5lZCwgMCkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIGRlY29kZXI6IE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgbmFtZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgZGVjb2RlOiAoYnVmZmVyLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCEoYnVmZmVyIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbiBhIEJyb3dzZXIgZW52aXJvbm1lbnRzIG9ubHkgVWludDhBcnJheXMgYXJlIHN1cHBvcnRlZC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShKU09OLnBhcnNlKG5ldyBUZXh0RGVjb2RlcihvcHRpb25zLmNoYXJzZXQpLmRlY29kZShidWZmZXIpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfSksXG4gICAgc3RyZWFtOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgYXNSZWFkYWJsZVN0cmVhbTogKHNvY2tldCkgPT4gbmV3IFJlYWRhYmxlU3RyZWFtV3JhcHBlcihzb2NrZXQpLFxuICAgICAgICBhc1dyaXRhYmxlU3RyZWFtOiAoc29ja2V0KSA9PiBuZXcgV3JpdGFibGVTdHJlYW1XcmFwcGVyKHNvY2tldClcbiAgICB9KSxcbiAgICBjb25zb2xlOiBjb25zb2xlLFxuICAgIHRpbWVyOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgc2V0VGltZW91dChjYWxsYmFjaywgbXMsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHNldFRpbWVvdXQoY2FsbGJhY2ssIG1zLCAuLi5hcmdzKTtcbiAgICAgICAgICAgIHJldHVybiB7IGRpc3Bvc2U6ICgpID0+IGNsZWFyVGltZW91dChoYW5kbGUpIH07XG4gICAgICAgIH0sXG4gICAgICAgIHNldEltbWVkaWF0ZShjYWxsYmFjaywgLi4uYXJncykge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gc2V0VGltZW91dChjYWxsYmFjaywgMCwgLi4uYXJncyk7XG4gICAgICAgICAgICByZXR1cm4geyBkaXNwb3NlOiAoKSA9PiBjbGVhclRpbWVvdXQoaGFuZGxlKSB9O1xuICAgICAgICB9LFxuICAgICAgICBzZXRJbnRlcnZhbChjYWxsYmFjaywgbXMsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHNldEludGVydmFsKGNhbGxiYWNrLCBtcywgLi4uYXJncyk7XG4gICAgICAgICAgICByZXR1cm4geyBkaXNwb3NlOiAoKSA9PiBjbGVhckludGVydmFsKGhhbmRsZSkgfTtcbiAgICAgICAgfSxcbiAgICB9KVxufSk7XG5mdW5jdGlvbiBSSUwoKSB7XG4gICAgcmV0dXJuIF9yaWw7XG59XG4oZnVuY3Rpb24gKFJJTCkge1xuICAgIGZ1bmN0aW9uIGluc3RhbGwoKSB7XG4gICAgICAgIGFwaV8xLlJBTC5pbnN0YWxsKF9yaWwpO1xuICAgIH1cbiAgICBSSUwuaW5zdGFsbCA9IGluc3RhbGw7XG59KShSSUwgfHwgKFJJTCA9IHt9KSk7XG5leHBvcnRzLmRlZmF1bHQgPSBSSUw7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24gPSBleHBvcnRzLkJyb3dzZXJNZXNzYWdlV3JpdGVyID0gZXhwb3J0cy5Ccm93c2VyTWVzc2FnZVJlYWRlciA9IHZvaWQgMDtcbmNvbnN0IHJpbF8xID0gcmVxdWlyZShcIi4vcmlsXCIpO1xuLy8gSW5zdGFsbCB0aGUgYnJvd3NlciBydW50aW1lIGFic3RyYWN0LlxucmlsXzEuZGVmYXVsdC5pbnN0YWxsKCk7XG5jb25zdCBhcGlfMSA9IHJlcXVpcmUoXCIuLi9jb21tb24vYXBpXCIpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuLi9jb21tb24vYXBpXCIpLCBleHBvcnRzKTtcbmNsYXNzIEJyb3dzZXJNZXNzYWdlUmVhZGVyIGV4dGVuZHMgYXBpXzEuQWJzdHJhY3RNZXNzYWdlUmVhZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihwb3J0KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX29uRGF0YSA9IG5ldyBhcGlfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuX21lc3NhZ2VMaXN0ZW5lciA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fb25EYXRhLmZpcmUoZXZlbnQuZGF0YSk7XG4gICAgICAgIH07XG4gICAgICAgIHBvcnQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoZXZlbnQpID0+IHRoaXMuZmlyZUVycm9yKGV2ZW50KSk7XG4gICAgICAgIHBvcnQub25tZXNzYWdlID0gdGhpcy5fbWVzc2FnZUxpc3RlbmVyO1xuICAgIH1cbiAgICBsaXN0ZW4oY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uRGF0YS5ldmVudChjYWxsYmFjayk7XG4gICAgfVxufVxuZXhwb3J0cy5Ccm93c2VyTWVzc2FnZVJlYWRlciA9IEJyb3dzZXJNZXNzYWdlUmVhZGVyO1xuY2xhc3MgQnJvd3Nlck1lc3NhZ2VXcml0ZXIgZXh0ZW5kcyBhcGlfMS5BYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKHBvcnQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50ID0gMDtcbiAgICAgICAgcG9ydC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIChldmVudCkgPT4gdGhpcy5maXJlRXJyb3IoZXZlbnQpKTtcbiAgICB9XG4gICAgd3JpdGUobXNnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnBvcnQucG9zdE1lc3NhZ2UobXNnKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IsIG1zZyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZUVycm9yKGVycm9yLCBtc2cpIHtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50Kys7XG4gICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yLCBtc2csIHRoaXMuZXJyb3JDb3VudCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICB9XG59XG5leHBvcnRzLkJyb3dzZXJNZXNzYWdlV3JpdGVyID0gQnJvd3Nlck1lc3NhZ2VXcml0ZXI7XG5mdW5jdGlvbiBjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbihyZWFkZXIsIHdyaXRlciwgbG9nZ2VyLCBvcHRpb25zKSB7XG4gICAgaWYgKGxvZ2dlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxvZ2dlciA9IGFwaV8xLk51bGxMb2dnZXI7XG4gICAgfVxuICAgIGlmIChhcGlfMS5Db25uZWN0aW9uU3RyYXRlZ3kuaXMob3B0aW9ucykpIHtcbiAgICAgICAgb3B0aW9ucyA9IHsgY29ubmVjdGlvblN0cmF0ZWd5OiBvcHRpb25zIH07XG4gICAgfVxuICAgIHJldHVybiAoMCwgYXBpXzEuY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24pKHJlYWRlciwgd3JpdGVyLCBsb2dnZXIsIG9wdGlvbnMpO1xufVxuZXhwb3J0cy5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiA9IGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uO1xuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL2Jyb3dzZXIvbWFpbicpOyIsICIvKlxuICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMjYgRWNsaXBzZSBEaXJpZ2libGUgY29udHJpYnV0b3JzXG4gKlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlXG4gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2Mi4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG4gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MjAuaHRtbFxuICpcbiAqIFNQRFgtRmlsZUNvcHlyaWdodFRleHQ6IEVjbGlwc2UgRGlyaWdpYmxlIGNvbnRyaWJ1dG9ycyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbi8qKlxuICogSmF2YSBMU1AgY2xpZW50IGJ1bmRsZS5cbiAqXG4gKiBVc2VzIHZzY29kZS13cy1qc29ucnBjIGZvciB0eXBlZCBKU09OLVJQQyBvdmVyIFdlYlNvY2tldCBhbmQgcmVnaXN0ZXJzIE1vbmFjb1xuICogcHJvdmlkZXJzIHRoYXQgZGVsZWdhdGUgdG8gSkRULkxTLiBFeHBvc2VkIGFzIGdsb2JhbCBKYXZhTHNwQ2xpZW50TGliIHNvIHRoYXRcbiAqIGVkaXRvci5qcyBjYW4gY2FsbCBKYXZhTHNwQ2xpZW50TGliLmNvbm5lY3QocmVzb3VyY2VQYXRoKS5cbiAqXG4gKiBPbmUgSkRULkxTIHByb2Nlc3MgY292ZXJzIHRoZSBlbnRpcmUgd29ya3NwYWNlLCBzbyBhIHNpbmdsZSBXZWJTb2NrZXQgY29ubmVjdGlvblxuICogaXMgc2hhcmVkIGFjcm9zcyBhbGwgSmF2YSBmaWxlcyBvcGVuIGluIHRoZSBzYW1lIGJyb3dzZXIgcGFnZS4gVGhlIGNvbm5lY3Rpb24gaXNcbiAqIGVzdGFibGlzaGVkIG9uIHRoZSBmaXJzdCBjb25uZWN0KCkgY2FsbCBhbmQgcmV1c2VkIGZvciBhbGwgc3Vic2VxdWVudCBjYWxscy5cbiAqXG4gKiBlZGl0b3IuanMgc2V0cyB3aW5kb3cubW9uYWNvIGJlZm9yZSBjYWxsaW5nIGNvbm5lY3QoKSwgc28gdGhlIG1vbmFjby1zaGltJ3MgbGF6eVxuICogUHJveGllcyByZXNvbHZlIGNvcnJlY3RseSBhdCBjYWxsIHRpbWUuXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24sIE1lc3NhZ2VDb25uZWN0aW9uIH0gZnJvbSAndnNjb2RlLWpzb25ycGMvYnJvd3Nlcic7XG5pbXBvcnQgeyB0b1NvY2tldCwgV2ViU29ja2V0TWVzc2FnZVJlYWRlciwgV2ViU29ja2V0TWVzc2FnZVdyaXRlciB9IGZyb20gJ3ZzY29kZS13cy1qc29ucnBjJztcbmltcG9ydCAqIGFzIG1vbmFjbyBmcm9tICdtb25hY28tZWRpdG9yJztcbmltcG9ydCB7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLFxuICAgIERpYWdub3N0aWNTZXZlcml0eSxcbiAgICBJbnNlcnRUZXh0Rm9ybWF0LFxuICAgIE1hcmt1cENvbnRlbnQsXG4gICAgTWFya3VwS2luZCxcbiAgICB0eXBlIENvZGVBY3Rpb24sXG4gICAgdHlwZSBDb21tYW5kLFxuICAgIHR5cGUgQ29tcGxldGlvbkl0ZW0sXG4gICAgdHlwZSBDb21wbGV0aW9uTGlzdCxcbiAgICB0eXBlIERpYWdub3N0aWMsXG4gICAgdHlwZSBIb3ZlcixcbiAgICB0eXBlIExvY2F0aW9uLFxuICAgIHR5cGUgUGFyYW1ldGVySW5mb3JtYXRpb24sXG4gICAgdHlwZSBTaWduYXR1cmVIZWxwLFxuICAgIHR5cGUgU2lnbmF0dXJlSW5mb3JtYXRpb24sXG4gICAgdHlwZSBUZXh0RWRpdCxcbiAgICB0eXBlIFdvcmtzcGFjZUVkaXQsXG59IGZyb20gJ3ZzY29kZS1sYW5ndWFnZXNlcnZlci10eXBlcyc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNpbmdsZXRvbiBzdGF0ZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogU2hhcmVkIGNvbm5lY3Rpb24gXHUyMDE0IG9uZSBwZXIgYnJvd3NlciBwYWdlLCBjb3ZlcmluZyBhbGwgcHJvamVjdHMgaW4gdGhlIHdvcmtzcGFjZS4gKi9cbmxldCBfY29ubjogTWVzc2FnZUNvbm5lY3Rpb24gfCBudWxsID0gbnVsbDtcblxuLyoqXG4gKiBWaXJ0dWFsIHdvcmtzcGFjZSByb290IFVSSSwgZS5nLiB7QGNvZGUgZmlsZTovLy93b3Jrc3BhY2Uvd29ya3NwYWNlL30uXG4gKiBTZXQgb25jZSBvbiBmaXJzdCBjb25uZWN0KCk7IHVzZWQgdG8gc2NvcGUgTW9uYWNvIHByb3ZpZGVycyB0byB3b3Jrc3BhY2UgZmlsZXMuXG4gKi9cbmxldCBfd29ya3NwYWNlUm9vdCA9ICcnO1xuXG4vKiogVVJJcyBmb3Igd2hpY2ggdGV4dERvY3VtZW50L2RpZE9wZW4gaGFzIGFscmVhZHkgYmVlbiBzZW50LiAqL1xuY29uc3QgX29wZW5GaWxlczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cbi8qKiBQZW5kaW5nIGRlYm91bmNlZCBkaWRDaGFuZ2UgdGltZXJzIHBlciBmaWxlIFVSSSwgc28gYSBjaGFuZ2UgY2FuIGJlIGZsdXNoZWQgYmVmb3JlIGNvbXBsZXRpb24uICovXG5jb25zdCBfY2hhbmdlVGltZXJzOiBNYXA8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0Pj4gPSBuZXcgTWFwKCk7XG5cbi8qKlxuICogTGFzdCBkaWFnbm9zdGljcyBwdWJsaXNoZWQgcGVyIGZpbGUgVVJJLCBrZXB0IHZlcmJhdGltICh3aXRoIHRoZWlyIExTUCBjb2RlL2RhdGEpLiBDb2RlLWFjdGlvblxuICogcmVxdWVzdHMgbXVzdCBzZW5kIHRoZXNlIFx1MjAxNCBKRFQuTFMgbWF0Y2hlcyBxdWljay1maXhlcyBieSB0aGUgZGlhZ25vc3RpYydzIGNvZGUvZGF0YSwgd2hpY2ggTW9uYWNvJ3NcbiAqIElNYXJrZXJEYXRhIGNhbm5vdCByb3VuZC10cmlwLCBzbyByZWNvbnN0cnVjdGluZyBkaWFnbm9zdGljcyBmcm9tIG1hcmtlcnMgeWllbGRzIG5vIHF1aWNrLWZpeGVzLlxuICovXG5jb25zdCBfZGlhZ25vc3RpY3M6IE1hcDxzdHJpbmcsIERpYWdub3N0aWNbXT4gPSBuZXcgTWFwKCk7XG5cbmxldCBfcHJvdmlkZXJzUmVnaXN0ZXJlZCA9IGZhbHNlO1xuXG4vKiogU2VtYW50aWMtdG9rZW4gbGVnZW5kIHJlcG9ydGVkIGJ5IEpEVC5MUyBpbiB0aGUgaW5pdGlhbGl6ZSByZXN1bHQ7IG5lZWRlZCB0byBkZWNvZGUgdG9rZW4gZGF0YS4gKi9cbmxldCBfc2VtYW50aWNUb2tlbnNMZWdlbmQ6IHsgdG9rZW5UeXBlczogc3RyaW5nW107IHRva2VuTW9kaWZpZXJzOiBzdHJpbmdbXSB9IHwgbnVsbCA9IG51bGw7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFB1YmxpYyBBUElcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIENhbGxlZCBieSBlZGl0b3IuanMgd2hlbiBhIEphdmEgZmlsZSBpcyBvcGVuZWQuIFNhZmUgdG8gY2FsbCBtdWx0aXBsZSB0aW1lcy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb25uZWN0KHJlc291cmNlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFydHMgPSByZXNvdXJjZVBhdGgucmVwbGFjZSgvXlxcLy8sICcnKS5zcGxpdCgnLycpO1xuICAgIGNvbnN0IHdvcmtzcGFjZSA9IHBhcnRzWzBdO1xuICAgIGNvbnN0IHByb2plY3QgICA9IHBhcnRzWzFdO1xuICAgIGNvbnN0IGZpbGVVcmkgPSBgZmlsZTovLy93b3Jrc3BhY2UvJHt3b3Jrc3BhY2V9LyR7cHJvamVjdH0vJHtwYXJ0cy5zbGljZSgyKS5qb2luKCcvJyl9YDtcblxuICAgIGlmIChfY29ubikge1xuICAgICAgICAvLyBDb25uZWN0aW9uIGFscmVhZHkgZXN0YWJsaXNoZWQgXHUyMDE0IGp1c3Qgb3BlbiB0aGUgbmV3IGZpbGUuXG4gICAgICAgIG9wZW5GaWxlKGZpbGVVcmkpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgX3dvcmtzcGFjZVJvb3QgPSBgZmlsZTovLy93b3Jrc3BhY2UvJHt3b3Jrc3BhY2V9L2A7XG5cbiAgICBjb25zdCBwcm90byA9IGxvY2F0aW9uLnByb3RvY29sID09PSAnaHR0cHM6JyA/ICd3c3MnIDogJ3dzJztcbiAgICBjb25zdCB3c1VybCA9IGAke3Byb3RvfTovLyR7bG9jYXRpb24uaG9zdH0vd2Vic29ja2V0cy9pZGUvamF2YS1sc3BgXG4gICAgICAgICAgICAgICAgKyBgP3dvcmtzcGFjZT0ke2VuY29kZVVSSUNvbXBvbmVudCh3b3Jrc3BhY2UpfWA7XG5cbiAgICBjb25zdCB3cyA9IG5ldyBXZWJTb2NrZXQod3NVcmwpO1xuICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgd3Mub25vcGVuICA9ICgpID0+IHJlc29sdmUoKTtcbiAgICAgICAgd3Mub25lcnJvciA9ICgpID0+IHJlamVjdChuZXcgRXJyb3IoYFtqYXZhLWxzcF0gV2ViU29ja2V0IGNvbm5lY3QgZmFpbGVkOiAke3dzVXJsfWApKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHNvY2tldCA9IHRvU29ja2V0KHdzKTtcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgV2ViU29ja2V0TWVzc2FnZVJlYWRlcihzb2NrZXQpO1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBXZWJTb2NrZXRNZXNzYWdlV3JpdGVyKHNvY2tldCk7XG4gICAgX2Nvbm4gPSBjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbihyZWFkZXIsIHdyaXRlcik7XG5cbiAgICAvLyBEaWFnbm9zdGljcyBub3RpZmljYXRpb24gXHUyMTkyIE1vbmFjbyBtYXJrZXJzIChhcHBsaWVzIHRvIGFueSB3b3Jrc3BhY2UgZmlsZSlcbiAgICBfY29ubi5vbk5vdGlmaWNhdGlvbigndGV4dERvY3VtZW50L3B1Ymxpc2hEaWFnbm9zdGljcycsIChwYXJhbXM6IHsgdXJpOiBzdHJpbmc7IGRpYWdub3N0aWNzOiBEaWFnbm9zdGljW10gfSkgPT4ge1xuICAgICAgICBfZGlhZ25vc3RpY3Muc2V0KHBhcmFtcy51cmksIHBhcmFtcy5kaWFnbm9zdGljcyA/PyBbXSk7XG4gICAgICAgIGNvbnN0IG1vZGVsID0gbW9uYWNvLmVkaXRvci5nZXRNb2RlbHMoKS5maW5kKG0gPT4gbS51cmkudG9TdHJpbmcoKSA9PT0gcGFyYW1zLnVyaSk7XG4gICAgICAgIGlmICghbW9kZWwpIHJldHVybjtcbiAgICAgICAgbW9uYWNvLmVkaXRvci5zZXRNb2RlbE1hcmtlcnMobW9kZWwsICdqYXZhLWxzcCcsIHBhcmFtcy5kaWFnbm9zdGljcy5tYXAoZCA9PiAoe1xuICAgICAgICAgICAgc2V2ZXJpdHk6ICAgICAgICBsc3BTZXZlcml0eShkLnNldmVyaXR5KSxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICAgICAgICAgZC5tZXNzYWdlLFxuICAgICAgICAgICAgc291cmNlOiAgICAgICAgICBkLnNvdXJjZSA/PyAnamF2YScsXG4gICAgICAgICAgICBzdGFydExpbmVOdW1iZXI6IGQucmFuZ2Uuc3RhcnQubGluZSArIDEsXG4gICAgICAgICAgICBzdGFydENvbHVtbjogICAgIGQucmFuZ2Uuc3RhcnQuY2hhcmFjdGVyICsgMSxcbiAgICAgICAgICAgIGVuZExpbmVOdW1iZXI6ICAgZC5yYW5nZS5lbmQubGluZSArIDEsXG4gICAgICAgICAgICBlbmRDb2x1bW46ICAgICAgIGQucmFuZ2UuZW5kLmNoYXJhY3RlciArIDEsXG4gICAgICAgIH0pKSk7XG4gICAgfSk7XG5cbiAgICAvLyBTZXJ2ZXIgLT4gY2xpZW50IHJlcXVlc3RzIHRoYXQgZHJpdmUgcmVmYWN0b3IgLyBnZW5lcmF0ZSByZXN1bHRzIGFuZCBkeW5hbWljIHJlZ2lzdHJhdGlvbi5cbiAgICBfY29ubi5vblJlcXVlc3QoJ3dvcmtzcGFjZS9hcHBseUVkaXQnLCAocGFyYW1zOiB7IGVkaXQ6IFdvcmtzcGFjZUVkaXQgfSkgPT4ge1xuICAgICAgICBhcHBseVdvcmtzcGFjZUVkaXQocGFyYW1zLmVkaXQpO1xuICAgICAgICByZXR1cm4geyBhcHBsaWVkOiB0cnVlIH07XG4gICAgfSk7XG4gICAgX2Nvbm4ub25SZXF1ZXN0KCd3b3Jrc3BhY2UvY29uZmlndXJhdGlvbicsIChwYXJhbXM6IHsgaXRlbXM6IEFycmF5PHsgc2VjdGlvbj86IHN0cmluZyB9PiB9KSA9PlxuICAgICAgICAocGFyYW1zLml0ZW1zID8/IFtdKS5tYXAoKCkgPT4gamR0bHNTZXR0aW5ncygpLmphdmEpKTtcbiAgICBfY29ubi5vblJlcXVlc3QoJ2NsaWVudC9yZWdpc3RlckNhcGFiaWxpdHknLCAoKSA9PiBudWxsKTtcbiAgICBfY29ubi5vblJlcXVlc3QoJ2NsaWVudC91bnJlZ2lzdGVyQ2FwYWJpbGl0eScsICgpID0+IG51bGwpO1xuICAgIF9jb25uLm9uUmVxdWVzdCgnd2luZG93L3Nob3dNZXNzYWdlUmVxdWVzdCcsICgpID0+IG51bGwpO1xuICAgIF9jb25uLm9uUmVxdWVzdCgnd2luZG93L3dvcmtEb25lUHJvZ3Jlc3MvY3JlYXRlJywgKCkgPT4gbnVsbCk7XG4gICAgX2Nvbm4ub25Ob3RpZmljYXRpb24oJ3dpbmRvdy9sb2dNZXNzYWdlJywgKHA6IHsgbWVzc2FnZTogc3RyaW5nIH0pID0+IGNvbnNvbGUuZGVidWcoJ1tqYXZhLWxzcF0nLCBwPy5tZXNzYWdlKSk7XG4gICAgX2Nvbm4ub25Ob3RpZmljYXRpb24oJ3dpbmRvdy9zaG93TWVzc2FnZScsIChwOiB7IG1lc3NhZ2U6IHN0cmluZyB9KSA9PiBjb25zb2xlLmluZm8oJ1tqYXZhLWxzcF0nLCBwPy5tZXNzYWdlKSk7XG4gICAgLy8gSkRULkxTIGxhbmd1YWdlLXN0YXR1cyAvIHByb2dyZXNzIG5vdGlmaWNhdGlvbnMgXHUyMDE0IGFja25vd2xlZGdlZCBzaWxlbnRseS5cbiAgICBfY29ubi5vbk5vdGlmaWNhdGlvbignbGFuZ3VhZ2Uvc3RhdHVzJywgKCkgPT4geyAvKiBpbmRleGluZy9yZWFkeSBzdGF0dXMsIGlnbm9yZWQgKi8gfSk7XG4gICAgX2Nvbm4ub25Ob3RpZmljYXRpb24oJ2xhbmd1YWdlL3Byb2dyZXNzUmVwb3J0JywgKCkgPT4geyAvKiBidWlsZCBwcm9ncmVzcywgaWdub3JlZCAqLyB9KTtcblxuICAgIF9jb25uLmxpc3RlbigpO1xuXG4gICAgY29uc3Qgcm9vdFVyaSA9IF93b3Jrc3BhY2VSb290O1xuICAgIGNvbnN0IGluaXRSZXN1bHQ6IGFueSA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCdpbml0aWFsaXplJywge1xuICAgICAgICBwcm9jZXNzSWQ6IG51bGwsXG4gICAgICAgIHJvb3RVcmksXG4gICAgICAgIGluaXRpYWxpemF0aW9uT3B0aW9uczoge1xuICAgICAgICAgICAgc2V0dGluZ3M6IGpkdGxzU2V0dGluZ3MoKSxcbiAgICAgICAgICAgIGV4dGVuZGVkQ2xpZW50Q2FwYWJpbGl0aWVzOiB7XG4gICAgICAgICAgICAgICAgcHJvZ3Jlc3NSZXBvcnRQcm92aWRlcjogICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICAgICBjbGFzc0ZpbGVDb250ZW50c1N1cHBvcnQ6ICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgcmVzb2x2ZUFkZGl0aW9uYWxUZXh0RWRpdHNTdXBwb3J0OiB0cnVlLFxuICAgICAgICAgICAgICAgIC8vIERvIE5PVCBhZHZlcnRpc2UgdGhlICpQcm9tcHRTdXBwb3J0IGZsYWdzOiB0aG9zZSBtYWtlIEpEVC5MUyByZXR1cm4gc291cmNlIGFjdGlvbnNcbiAgICAgICAgICAgICAgICAvLyAoZ2VuZXJhdGUgdG9TdHJpbmcvY29uc3RydWN0b3JzL2FjY2Vzc29ycywgb3ZlcnJpZGUvaW1wbGVtZW50LCBvcmdhbml6ZSBpbXBvcnRzKSBhc1xuICAgICAgICAgICAgICAgIC8vIGNsaWVudC1zaWRlIFwiKlByb21wdFwiIGNvbW1hbmRzIHRoZSB2c2NvZGUtamF2YSBleHRlbnNpb24gaW1wbGVtZW50cyBidXQgd2UgZG9uJ3QuXG4gICAgICAgICAgICAgICAgLy8gV2l0aCB0aGVtIG9mZiwgSkRULkxTIHJldHVybnMgdGhlIHNhbWUgYWN0aW9ucyBhcyByZXNvbHZhYmxlIFdvcmtzcGFjZUVkaXRzIG9wZXJhdGluZ1xuICAgICAgICAgICAgICAgIC8vIG9uIGFsbCBtZW1iZXJzLCB3aGljaCBhcHBseUNvZGVBY3Rpb24gcmVzb2x2ZXMgYW5kIGFwcGxpZXMgZGlyZWN0bHkuXG4gICAgICAgICAgICAgICAgaW5mZXJTZWxlY3Rpb25TdXBwb3J0OiAgICAgICAgICAgICBbJ2V4dHJhY3RNZXRob2QnLCAnZXh0cmFjdFZhcmlhYmxlJywgJ2V4dHJhY3RGaWVsZCddLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgd29ya3NwYWNlRm9sZGVyczogW3sgdXJpOiByb290VXJpLCBuYW1lOiB3b3Jrc3BhY2UgfV0sXG4gICAgICAgIGNhcGFiaWxpdGllczoge1xuICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7XG4gICAgICAgICAgICAgICAgc3luY2hyb25pemF0aW9uOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUsIHdpbGxTYXZlOiBmYWxzZSwgZGlkU2F2ZTogdHJ1ZSwgd2lsbFNhdmVXYWl0VW50aWw6IGZhbHNlIH0sXG4gICAgICAgICAgICAgICAgY29tcGxldGlvbjoge1xuICAgICAgICAgICAgICAgICAgICBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uSXRlbToge1xuICAgICAgICAgICAgICAgICAgICAgICAgc25pcHBldFN1cHBvcnQ6ICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRhdGlvbkZvcm1hdDogICBbJ21hcmtkb3duJywgJ3BsYWludGV4dCddLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRlZFN1cHBvcnQ6ICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWl0Q2hhcmFjdGVyc1N1cHBvcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlU3VwcG9ydDogICAgICAgIHsgcHJvcGVydGllczogWydkb2N1bWVudGF0aW9uJywgJ2RldGFpbCcsICdhZGRpdGlvbmFsVGV4dEVkaXRzJ10gfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dFN1cHBvcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBob3ZlcjogICAgICAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLCBjb250ZW50Rm9ybWF0OiBbJ21hcmtkb3duJywgJ3BsYWludGV4dCddIH0sXG4gICAgICAgICAgICAgICAgc2lnbmF0dXJlSGVscDogIHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSwgc2lnbmF0dXJlSW5mb3JtYXRpb246IHsgZG9jdW1lbnRhdGlvbkZvcm1hdDogWydtYXJrZG93bicsICdwbGFpbnRleHQnXSwgcGFyYW1ldGVySW5mb3JtYXRpb246IHsgbGFiZWxPZmZzZXRTdXBwb3J0OiB0cnVlIH0gfSB9LFxuICAgICAgICAgICAgICAgIGRlZmluaXRpb246ICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VzOiAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb246IHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIHR5cGVEZWZpbml0aW9uOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICBkb2N1bWVudEhpZ2hsaWdodDogeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgZG9jdW1lbnRTeW1ib2w6IHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSwgaGllcmFyY2hpY2FsRG9jdW1lbnRTeW1ib2xTdXBwb3J0OiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgZm9sZGluZ1JhbmdlOiAgIHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSwgbGluZUZvbGRpbmdPbmx5OiBmYWxzZSB9LFxuICAgICAgICAgICAgICAgIHNlbGVjdGlvblJhbmdlOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICBjb2RlTGVuczogICAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgaW5sYXlIaW50OiAgICAgIHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSwgcmVzb2x2ZVN1cHBvcnQ6IHsgcHJvcGVydGllczogWydsYWJlbCddIH0gfSxcbiAgICAgICAgICAgICAgICBzZW1hbnRpY1Rva2Vuczoge1xuICAgICAgICAgICAgICAgICAgICBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0czogICAgICAgIHsgcmFuZ2U6IGZhbHNlLCBmdWxsOiB7IGRlbHRhOiBmYWxzZSB9IH0sXG4gICAgICAgICAgICAgICAgICAgIHRva2VuVHlwZXM6ICAgICAgWyduYW1lc3BhY2UnLCAndHlwZScsICdjbGFzcycsICdlbnVtJywgJ2ludGVyZmFjZScsICdzdHJ1Y3QnLCAndHlwZVBhcmFtZXRlcicsXG4gICAgICAgICAgICAgICAgICAgICAgICAncGFyYW1ldGVyJywgJ3ZhcmlhYmxlJywgJ3Byb3BlcnR5JywgJ2VudW1NZW1iZXInLCAnZXZlbnQnLCAnZnVuY3Rpb24nLCAnbWV0aG9kJywgJ21hY3JvJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdrZXl3b3JkJywgJ21vZGlmaWVyJywgJ2NvbW1lbnQnLCAnc3RyaW5nJywgJ251bWJlcicsICdyZWdleHAnLCAnb3BlcmF0b3InLCAnZGVjb3JhdG9yJ10sXG4gICAgICAgICAgICAgICAgICAgIHRva2VuTW9kaWZpZXJzOiAgWydkZWNsYXJhdGlvbicsICdkZWZpbml0aW9uJywgJ3JlYWRvbmx5JywgJ3N0YXRpYycsICdkZXByZWNhdGVkJywgJ2Fic3RyYWN0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdhc3luYycsICdtb2RpZmljYXRpb24nLCAnZG9jdW1lbnRhdGlvbicsICdkZWZhdWx0TGlicmFyeSddLFxuICAgICAgICAgICAgICAgICAgICBmb3JtYXRzOiAgICAgICAgIFsncmVsYXRpdmUnXSxcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxhcHBpbmdUb2tlblN1cHBvcnQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBtdWx0aWxpbmVUb2tlblN1cHBvcnQ6ICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBmb3JtYXR0aW5nOiAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgcmFuZ2VGb3JtYXR0aW5nOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICByZW5hbWU6ICAgICAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLCBwcmVwYXJlU3VwcG9ydDogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIGNvZGVBY3Rpb246IHtcbiAgICAgICAgICAgICAgICAgICAgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgY29kZUFjdGlvbkxpdGVyYWxTdXBwb3J0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlQWN0aW9uS2luZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU2V0OiBbJ3F1aWNrZml4JywgJ3JlZmFjdG9yJywgJ3JlZmFjdG9yLmV4dHJhY3QnLCAncmVmYWN0b3IuaW5saW5lJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlZmFjdG9yLnJld3JpdGUnLCAnc291cmNlJywgJ3NvdXJjZS5vcmdhbml6ZUltcG9ydHMnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGlzUHJlZmVycmVkU3VwcG9ydDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgZGF0YVN1cHBvcnQ6ICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlU3VwcG9ydDogICAgIHsgcHJvcGVydGllczogWydlZGl0J10gfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHB1Ymxpc2hEaWFnbm9zdGljczogeyByZWxhdGVkSW5mb3JtYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3b3Jrc3BhY2U6IHtcbiAgICAgICAgICAgICAgICBhcHBseUVkaXQ6ICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb246ICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgZXhlY3V0ZUNvbW1hbmQ6ICAgICAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgZGlkQ2hhbmdlQ29uZmlndXJhdGlvbjogeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgd29ya3NwYWNlRWRpdDogICAgICAgICAgeyBkb2N1bWVudENoYW5nZXM6IHRydWUsIHJlc291cmNlT3BlcmF0aW9uczogWydjcmVhdGUnLCAncmVuYW1lJywgJ2RlbGV0ZSddIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgX3NlbWFudGljVG9rZW5zTGVnZW5kID0gaW5pdFJlc3VsdD8uY2FwYWJpbGl0aWVzPy5zZW1hbnRpY1Rva2Vuc1Byb3ZpZGVyPy5sZWdlbmQgPz8gbnVsbDtcblxuICAgIF9jb25uLnNlbmROb3RpZmljYXRpb24oJ2luaXRpYWxpemVkJywge30pO1xuICAgIF9jb25uLnNlbmROb3RpZmljYXRpb24oJ3dvcmtzcGFjZS9kaWRDaGFuZ2VDb25maWd1cmF0aW9uJywgeyBzZXR0aW5nczogamR0bHNTZXR0aW5ncygpIH0pO1xuXG4gICAgb3BlbkZpbGUoZmlsZVVyaSk7XG5cbiAgICBpZiAoIV9wcm92aWRlcnNSZWdpc3RlcmVkKSB7XG4gICAgICAgIF9wcm92aWRlcnNSZWdpc3RlcmVkID0gdHJ1ZTtcbiAgICAgICAgcmVnaXN0ZXJQcm92aWRlcnMoKTtcbiAgICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEZpbGUgbGlmZWN5Y2xlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogU2VuZHMgdGV4dERvY3VtZW50L2RpZE9wZW4gZm9yIHRoZSBnaXZlbiBVUkkgKGlmIG5vdCBhbHJlYWR5IHNlbnQpIGFuZCByZWdpc3RlcnMgYSBkZWJvdW5jZWRcbiAqIHRleHREb2N1bWVudC9kaWRDaGFuZ2UgbGlzdGVuZXIgb24gdGhlIGNvcnJlc3BvbmRpbmcgTW9uYWNvIG1vZGVsLlxuICovXG5mdW5jdGlvbiBvcGVuRmlsZShmaWxlVXJpOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoX29wZW5GaWxlcy5oYXMoZmlsZVVyaSkgfHwgIV9jb25uKSByZXR1cm47XG4gICAgX29wZW5GaWxlcy5hZGQoZmlsZVVyaSk7XG5cbiAgICBjb25zdCBtb2RlbCA9IG1vbmFjby5lZGl0b3IuZ2V0TW9kZWxzKCkuZmluZChtID0+IG0udXJpLnRvU3RyaW5nKCkgPT09IGZpbGVVcmkpO1xuICAgIF9jb25uLnNlbmROb3RpZmljYXRpb24oJ3RleHREb2N1bWVudC9kaWRPcGVuJywge1xuICAgICAgICB0ZXh0RG9jdW1lbnQ6IHtcbiAgICAgICAgICAgIHVyaTogICAgICAgIGZpbGVVcmksXG4gICAgICAgICAgICBsYW5ndWFnZUlkOiAnamF2YScsXG4gICAgICAgICAgICB2ZXJzaW9uOiAgICAxLFxuICAgICAgICAgICAgdGV4dDogICAgICAgbW9kZWw/LmdldFZhbHVlKCkgPz8gJycsXG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBpZiAobW9kZWwpIHtcbiAgICAgICAgbW9kZWwub25EaWRDaGFuZ2VDb250ZW50KCgpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGV4aXN0aW5nID0gX2NoYW5nZVRpbWVycy5nZXQoZmlsZVVyaSk7XG4gICAgICAgICAgICBpZiAoZXhpc3RpbmcpIGNsZWFyVGltZW91dChleGlzdGluZyk7XG4gICAgICAgICAgICBfY2hhbmdlVGltZXJzLnNldChmaWxlVXJpLCBzZXRUaW1lb3V0KCgpID0+IHNlbmREaWRDaGFuZ2UoZmlsZVVyaSksIDQwMCkpO1xuICAgICAgICB9KTtcbiAgICB9XG59XG5cbi8qKiBTZW5kcyB0aGUgY3VycmVudCBtb2RlbCBjb250ZW50IGFzIGEgZGlkQ2hhbmdlIGFuZCBjbGVhcnMgYW55IHBlbmRpbmcgZGVib3VuY2UgZm9yIHRoZSBmaWxlLiAqL1xuZnVuY3Rpb24gc2VuZERpZENoYW5nZShmaWxlVXJpOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBfY2hhbmdlVGltZXJzLmRlbGV0ZShmaWxlVXJpKTtcbiAgICBjb25zdCBtb2RlbCA9IG1vbmFjby5lZGl0b3IuZ2V0TW9kZWwobW9uYWNvLlVyaS5wYXJzZShmaWxlVXJpKSk7XG4gICAgaWYgKF9jb25uICYmIG1vZGVsKSB7XG4gICAgICAgIF9jb25uLnNlbmROb3RpZmljYXRpb24oJ3RleHREb2N1bWVudC9kaWRDaGFuZ2UnLCB7XG4gICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6ICAgeyB1cmk6IGZpbGVVcmksIHZlcnNpb246IG1vZGVsLmdldFZlcnNpb25JZCgpIH0sXG4gICAgICAgICAgICBjb250ZW50Q2hhbmdlczogW3sgdGV4dDogbW9kZWwuZ2V0VmFsdWUoKSB9XSxcbiAgICAgICAgfSk7XG4gICAgfVxufVxuXG4vKipcbiAqIEZsdXNoZXMgYSBwZW5kaW5nIGRlYm91bmNlZCBjaGFuZ2UgaW1tZWRpYXRlbHkuIENhbGxlZCBiZWZvcmUgYSBjb21wbGV0aW9uIHJlcXVlc3Qgc28gSkRULkxTIHNlZXMgdGhlXG4gKiBqdXN0LXR5cGVkIHRleHQgb24gdGhlIGZpcnN0IEN0cmwrU3BhY2UsIGluc3RlYWQgb2YgY29tcGxldGluZyBhZ2FpbnN0IHN0YWxlIGNvbnRlbnQgKHRoZSBkZWJvdW5jZVxuICogb3RoZXJ3aXNlIGRlbGF5cyB0aGUgY2hhbmdlIGJ5IHVwIHRvIDQwMG1zIFx1MjAxNCB0aGUgY2F1c2Ugb2YgXCJmaXJzdCBDdHJsK1NwYWNlIHNob3dzIG5vdGhpbmdcIikuXG4gKi9cbmZ1bmN0aW9uIGZsdXNoUGVuZGluZ0NoYW5nZShmaWxlVXJpOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoX2NoYW5nZVRpbWVycy5oYXMoZmlsZVVyaSkpIHtcbiAgICAgICAgY2xlYXJUaW1lb3V0KF9jaGFuZ2VUaW1lcnMuZ2V0KGZpbGVVcmkpISk7XG4gICAgICAgIHNlbmREaWRDaGFuZ2UoZmlsZVVyaSk7XG4gICAgfVxufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBXb3Jrc3BhY2UgZmlsZSBwcmVkaWNhdGVcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqXG4gKiBSZXR1cm5zIHtAY29kZSB0cnVlfSB3aGVuIHRoZSBnaXZlbiBtb2RlbCBVUkkgYmVsb25ncyB0byB0aGUgY3VycmVudGx5IGNvbm5lY3RlZCB3b3Jrc3BhY2UuIFVzZWRcbiAqIGJ5IE1vbmFjbyBwcm92aWRlcnMgdG8gc2tpcCBub24tSmF2YS13b3Jrc3BhY2UgbW9kZWxzIHdpdGhvdXQgYW4gZXhhY3QtVVJJIGNvbXBhcmlzb24uXG4gKi9cbmZ1bmN0aW9uIGlzV29ya3NwYWNlRmlsZSh1cmk6IHN0cmluZyk6IGJvb2xlYW4ge1xuICAgIHJldHVybiBfd29ya3NwYWNlUm9vdCAhPT0gJycgJiYgdXJpLnN0YXJ0c1dpdGgoX3dvcmtzcGFjZVJvb3QpO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBNb25hY28gcHJvdmlkZXIgcmVnaXN0cmF0aW9uXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIHJlZ2lzdGVyUHJvdmlkZXJzKCk6IHZvaWQge1xuXG4gICAgbW9uYWNvLmVkaXRvci5yZWdpc3RlckNvbW1hbmQoQVBQTFlfQUNUSU9OX0NPTU1BTkQsIChfYWNjZXNzb3I6IHVua25vd24sIGFjdGlvbjogQ29kZUFjdGlvbiB8IENvbW1hbmQpID0+IHtcbiAgICAgICAgYXBwbHlDb2RlQWN0aW9uKGFjdGlvbik7XG4gICAgfSk7XG4gICAgbW9uYWNvLmVkaXRvci5yZWdpc3RlckNvbW1hbmQoTk9PUF9DT01NQU5ELCAoKSA9PiB7IC8qIGRpc3BsYXktb25seSBDb2RlTGVucyAqLyB9KTtcblxuICAgIC8vIENyb3NzLWZpbGUgbmF2aWdhdGlvbjogdGhpcyBzaW5nbGUtZmlsZSBlZGl0b3IgaGFzIG5vIG1vZGVsIGZvciBvdGhlciB3b3Jrc3BhY2UgZmlsZXMsIHNvIEdvIHRvXG4gICAgLy8gRGVmaW5pdGlvbiAvIEZpbmQgUmVmZXJlbmNlcyB0byBhbm90aGVyIGZpbGUgd291bGQgc2lsZW50bHkgZG8gbm90aGluZy4gSGFuZCB0aG9zZSBvZmYgdG8gdGhlIElERVxuICAgIC8vIHRvIG9wZW4gdGhlIHRhcmdldCBmaWxlIChhbmQgcmV2ZWFsIHRoZSBsaW5lKS4gU2FtZS1maWxlIHRhcmdldHMgZmFsbCB0aHJvdWdoIHRvIE1vbmFjby5cbiAgICBtb25hY28uZWRpdG9yLnJlZ2lzdGVyRWRpdG9yT3BlbmVyKHtcbiAgICAgICAgb3BlbkNvZGVFZGl0b3I6IChzb3VyY2UsIHJlc291cmNlLCBzZWxlY3Rpb25PclBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB1cmkgPSByZXNvdXJjZS50b1N0cmluZygpO1xuICAgICAgICAgICAgaWYgKCFpc1dvcmtzcGFjZUZpbGUodXJpKSB8fCAhdXJpLnN0YXJ0c1dpdGgoVklSVFVBTF9GSUxFX1BSRUZJWCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIGNvbnN0IGN1cnJlbnRNb2RlbCA9IHNvdXJjZS5nZXRNb2RlbCgpO1xuICAgICAgICAgICAgaWYgKGN1cnJlbnRNb2RlbCAmJiBjdXJyZW50TW9kZWwudXJpLnRvU3RyaW5nKCkgPT09IHVyaSkgcmV0dXJuIGZhbHNlOyAvLyBzYW1lIGZpbGUgXHUyMDE0IGxldCBNb25hY28ganVtcFxuICAgICAgICAgICAgY29uc3Qgb3BlbmVyID0gKGdsb2JhbFRoaXMgYXMgYW55KS5qYXZhTHNwT3BlbkZpbGU7XG4gICAgICAgICAgICBpZiAodHlwZW9mIG9wZW5lciAhPT0gJ2Z1bmN0aW9uJykgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgcG9zID0gc2VsZWN0aW9uT3JQb3NpdGlvbiBhcyB7IHN0YXJ0TGluZU51bWJlcj86IG51bWJlcjsgbGluZU51bWJlcj86IG51bWJlcjsgc3RhcnRDb2x1bW4/OiBudW1iZXI7IGNvbHVtbj86IG51bWJlciB9IHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgbGluZSA9IHBvcyA/IChwb3Muc3RhcnRMaW5lTnVtYmVyID8/IHBvcy5saW5lTnVtYmVyKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHBvcyA/IChwb3Muc3RhcnRDb2x1bW4gPz8gcG9zLmNvbHVtbikgOiB1bmRlZmluZWQ7XG4gICAgICAgICAgICBvcGVuZXIodXJpLnN1YnN0cmluZyhWSVJUVUFMX0ZJTEVfUFJFRklYLmxlbmd0aCksIGxpbmUsIGNvbHVtbik7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJDb21wbGV0aW9uSXRlbVByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICB0cmlnZ2VyQ2hhcmFjdGVyczogWycuJywgJ0AnLCAnPCddLFxuICAgICAgICBwcm92aWRlQ29tcGxldGlvbkl0ZW1zOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uLCBjb250ZXh0KSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVVcmkgPSBtb2RlbC51cmkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSBKRFQuTFMgaGFzIHRoZSBqdXN0LXR5cGVkIHRleHQgYmVmb3JlIGNvbXBsZXRpbmcgKHNlZSBmbHVzaFBlbmRpbmdDaGFuZ2UpLlxuICAgICAgICAgICAgZmx1c2hQZW5kaW5nQ2hhbmdlKGZpbGVVcmkpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBDb21wbGV0aW9uTGlzdCB8IENvbXBsZXRpb25JdGVtW10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9jb21wbGV0aW9uJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IGZpbGVVcmkgfSxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogICAgIHsgbGluZTogcG9zaXRpb24ubGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogcG9zaXRpb24uY29sdW1uIC0gMSB9LFxuICAgICAgICAgICAgICAgIC8vIE1vbmFjbyB0cmlnZ2VyIGtpbmRzIGFyZSAwLWJhc2VkIChJbnZva2UvVHJpZ2dlckNoYXJhY3Rlci9Gb3JJbmNvbXBsZXRlKTsgTFNQIGlzIDEtYmFzZWQuXG4gICAgICAgICAgICAgICAgY29udGV4dDogICAgICB7IHRyaWdnZXJLaW5kOiAoY29udGV4dC50cmlnZ2VyS2luZCA/PyAwKSArIDEsIHRyaWdnZXJDaGFyYWN0ZXI6IGNvbnRleHQudHJpZ2dlckNoYXJhY3RlciB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBpdGVtcyA9IEFycmF5LmlzQXJyYXkocmVzdWx0KSA/IHJlc3VsdCA6IChyZXN1bHQ/Lml0ZW1zID8/IFtdKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3VnZ2VzdGlvbnM6IGl0ZW1zLm1hcChpdGVtID0+IGxzcENvbXBsZXRpb25Ub01vbmFjbyhpdGVtLCBtb2RlbCwgcG9zaXRpb24pKSxcbiAgICAgICAgICAgICAgICAvLyBKRFQuTFMgcmV0dXJucyBhIHRydW5jYXRlZCBsaXN0IG9uIHRoZSBmaXJzdCBrZXlzdHJva2VzOyBwcm9wYWdhdGluZyBcImluY29tcGxldGVcIiBtYWtlc1xuICAgICAgICAgICAgICAgIC8vIE1vbmFjbyByZS1xdWVyeSBhcyB0aGUgdXNlciB0eXBlcyBpbnN0ZWFkIG9mIGNhY2hpbmcgdGhlIGZpcnN0IChvZnRlbiBlbXB0eSkgcmVzdWx0LlxuICAgICAgICAgICAgICAgIGluY29tcGxldGU6ICBBcnJheS5pc0FycmF5KHJlc3VsdCkgPyBmYWxzZSA6ICEhcmVzdWx0Py5pc0luY29tcGxldGUsXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICAvLyBSZXNvbHZlIGRvY3VtZW50YXRpb24gYW5kLCBjcnVjaWFsbHksIHRoZSBhdXRvLWltcG9ydCBhZGRpdGlvbmFsVGV4dEVkaXRzIHdoaWNoIEpEVC5MUyBvbmx5XG4gICAgICAgIC8vIGF0dGFjaGVzIG9uIHJlc29sdmUgXHUyMDE0IHNlbGVjdGluZyBhIHR5cGUgdGhlbiBpbnNlcnRzIGl0cyBpbXBvcnQgc3RhdGVtZW50LlxuICAgICAgICByZXNvbHZlQ29tcGxldGlvbkl0ZW06IGFzeW5jIChpdGVtKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsc3AgPSAoaXRlbSBhcyBNb25hY29Db21wbGV0aW9uSXRlbSkuX2xzcDtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWxzcCkgcmV0dXJuIGl0ZW07XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc29sdmVkOiBDb21wbGV0aW9uSXRlbSA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCdjb21wbGV0aW9uSXRlbS9yZXNvbHZlJywgbHNwKTtcbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQuZG9jdW1lbnRhdGlvbikge1xuICAgICAgICAgICAgICAgICAgICBpdGVtLmRvY3VtZW50YXRpb24gPSB7IHZhbHVlOiBtYXJrdXBUb1N0cmluZyhyZXNvbHZlZC5kb2N1bWVudGF0aW9uKSwgaXNUcnVzdGVkOiBmYWxzZSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQuZGV0YWlsKSBpdGVtLmRldGFpbCA9IHJlc29sdmVkLmRldGFpbDtcbiAgICAgICAgICAgICAgICBpZiAocmVzb2x2ZWQuYWRkaXRpb25hbFRleHRFZGl0cz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uYWRkaXRpb25hbFRleHRFZGl0cyA9IHJlc29sdmVkLmFkZGl0aW9uYWxUZXh0RWRpdHMubWFwKHRleHRFZGl0VG9Nb25hY28pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICBjb25zb2xlLmRlYnVnKCdbamF2YS1sc3BdIGNvbXBsZXRpb24gcmVzb2x2ZSBmYWlsZWQ6JywgKGUgYXMgRXJyb3IpPy5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBpdGVtO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckhvdmVyUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVIb3ZlcjogYXN5bmMgKG1vZGVsLCBwb3NpdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBmaWxlVXJpID0gbW9kZWwudXJpLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IEhvdmVyIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvaG92ZXInLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogZmlsZVVyaSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0Py5jb250ZW50cykgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50cyA9IEFycmF5LmlzQXJyYXkocmVzdWx0LmNvbnRlbnRzKSA/IHJlc3VsdC5jb250ZW50cyA6IFtyZXN1bHQuY29udGVudHNdO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBjb250ZW50czogY29udGVudHMubWFwKGMgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHR5cGVvZiBjID09PSAnc3RyaW5nJyA/IGMgOiAoYyBhcyBNYXJrdXBDb250ZW50KS52YWx1ZSxcbiAgICAgICAgICAgICAgICAgICAgaXNUcnVzdGVkOiBmYWxzZSxcbiAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgcmFuZ2U6IHJlc3VsdC5yYW5nZSA/IGxzcFJhbmdlVG9Nb25hY28ocmVzdWx0LnJhbmdlKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyU2lnbmF0dXJlSGVscFByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBzaWduYXR1cmVIZWxwVHJpZ2dlckNoYXJhY3RlcnM6IFsnKCcsICcsJ10sXG4gICAgICAgIHByb3ZpZGVTaWduYXR1cmVIZWxwOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVVcmkgPSBtb2RlbC51cmkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogU2lnbmF0dXJlSGVscCB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L3NpZ25hdHVyZUhlbHAnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogZmlsZVVyaSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgdmFsdWU6IHtcbiAgICAgICAgICAgICAgICAgICAgc2lnbmF0dXJlczogcmVzdWx0LnNpZ25hdHVyZXMubWFwKChzaWc6IFNpZ25hdHVyZUluZm9ybWF0aW9uKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICAgICAgICAgc2lnLmxhYmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRhdGlvbjogc2lnLmRvY3VtZW50YXRpb24gPyBtYXJrdXBUb1N0cmluZyhzaWcuZG9jdW1lbnRhdGlvbikgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzOiAgICAoc2lnLnBhcmFtZXRlcnMgPz8gW10pLm1hcCgocDogUGFyYW1ldGVySW5mb3JtYXRpb24pID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICAgICAgICAgcC5sYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudGF0aW9uOiBwLmRvY3VtZW50YXRpb24gPyBtYXJrdXBUb1N0cmluZyhwLmRvY3VtZW50YXRpb24pIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZVNpZ25hdHVyZTogcmVzdWx0LmFjdGl2ZVNpZ25hdHVyZSA/PyAwLFxuICAgICAgICAgICAgICAgICAgICBhY3RpdmVQYXJhbWV0ZXI6IHJlc3VsdC5hY3RpdmVQYXJhbWV0ZXIgPz8gMCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIGRpc3Bvc2U6ICgpID0+IHt9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJEZWZpbml0aW9uUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVEZWZpbml0aW9uOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVVcmkgPSBtb2RlbC51cmkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogTG9jYXRpb24gfCBMb2NhdGlvbltdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvZGVmaW5pdGlvbicsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBmaWxlVXJpIH0sXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgbG9jYXRpb25zID0gKEFycmF5LmlzQXJyYXkocmVzdWx0KSA/IHJlc3VsdCA6IFtyZXN1bHRdKS5tYXAobG9jID0+ICh7XG4gICAgICAgICAgICAgICAgdXJpOiAgIG1vbmFjby5VcmkucGFyc2UobG9jLnVyaSksXG4gICAgICAgICAgICAgICAgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28obG9jLnJhbmdlKSxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIGF3YWl0IGVuc3VyZU1vZGVsc0ZvckxvY2F0aW9ucyhsb2NhdGlvbnMpO1xuICAgICAgICAgICAgcmV0dXJuIGxvY2F0aW9ucztcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJSZWZlcmVuY2VQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZVJlZmVyZW5jZXM6IGFzeW5jIChtb2RlbCwgcG9zaXRpb24sIGNvbnRleHQpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBMb2NhdGlvbltdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvcmVmZXJlbmNlcycsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICAgICAgY29udGV4dDogICAgICB7IGluY2x1ZGVEZWNsYXJhdGlvbjogY29udGV4dC5pbmNsdWRlRGVjbGFyYXRpb24gfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgbG9jYXRpb25zID0gcmVzdWx0Lm1hcChsb2MgPT4gKHsgdXJpOiBtb25hY28uVXJpLnBhcnNlKGxvYy51cmkpLCByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhsb2MucmFuZ2UpIH0pKTtcbiAgICAgICAgICAgIC8vIFRoZSByZWZlcmVuY2VzIHBlZWsgY2FuIG9ubHkgc2hvdyBhIGNvZGUgcHJldmlldyBmb3IgZmlsZXMgaXQgaGFzIGEgbW9kZWwgZm9yOyBjcmVhdGVcbiAgICAgICAgICAgIC8vIGluLW1lbW9yeSBtb2RlbHMgZm9yIHRoZSByZWZlcmVuY2VkIChwb3NzaWJseSB1bm9wZW5lZCkgZmlsZXMgc28gcHJldmlld3MgcmVuZGVyLlxuICAgICAgICAgICAgYXdhaXQgZW5zdXJlTW9kZWxzRm9yTG9jYXRpb25zKGxvY2F0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gbG9jYXRpb25zO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlclJlbmFtZVByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlUmVuYW1lRWRpdHM6IGFzeW5jIChtb2RlbCwgcG9zaXRpb24sIG5ld05hbWUpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiB7IGVkaXRzOiBbXSB9O1xuICAgICAgICAgICAgY29uc3QgZWRpdDogV29ya3NwYWNlRWRpdCB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L3JlbmFtZScsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICAgICAgbmV3TmFtZSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFlZGl0KSByZXR1cm4geyBlZGl0czogW10gfTtcbiAgICAgICAgICAgIC8vIEEgSkRULkxTIHJlbmFtZSBjYW4gc3BhbiBtYW55IGZpbGVzIGFuZCBldmVuIHJlbmFtZSB0aGUgdHlwZSdzIG93biAuamF2YSBmaWxlLiBNb25hY28nc1xuICAgICAgICAgICAgLy8gc2luZ2xlLWZpbGUgZWRpdG9yIHdvdWxkIGRyb3AgZXZlcnl0aGluZyBidXQgdGhlIGN1cnJlbnQgbW9kZWwsIHNvIGFwcGx5IHRoZSB3aG9sZSBlZGl0XG4gICAgICAgICAgICAvLyB0aHJvdWdoIHRoZSB3b3Jrc3BhY2Ugb3Vyc2VsdmVzIHdoZW4gdGhlIElERSBwZXJzaXN0ZW5jZSBob29rIGlzIGF2YWlsYWJsZS5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgKGdsb2JhbFRoaXMgYXMgYW55KS5qYXZhTHNwUGVyc2lzdFJlbmFtZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IGFwcGx5UmVuYW1lQWNyb3NzV29ya3NwYWNlKG1vZGVsLCBlZGl0KTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHsgZWRpdHM6IFtdIH07XG4gICAgICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdbamF2YS1sc3BdIGNyb3NzLWZpbGUgcmVuYW1lIGZhaWxlZCwgYXBwbHlpbmcgdG8gdGhlIGN1cnJlbnQgZmlsZSBvbmx5OicsIGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gd29ya3NwYWNlRWRpdFRvTW9uYWNvKGVkaXQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB3b3Jrc3BhY2VFZGl0VG9Nb25hY28oZWRpdCk7XG4gICAgICAgIH0sXG4gICAgICAgIHJlc29sdmVSZW5hbWVMb2NhdGlvbjogYXN5bmMgKG1vZGVsLCBwb3NpdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogeyByYW5nZTogTHNwUmFuZ2U7IHBsYWNlaG9sZGVyPzogc3RyaW5nIH0gfCBMc3BSYW5nZSB8IG51bGwgPVxuICAgICAgICAgICAgICAgICAgICBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L3ByZXBhcmVSZW5hbWUnLCB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgICAgIGNvbnN0IHJhbmdlID0gJ3JhbmdlJyBpbiByZXN1bHQgPyByZXN1bHQucmFuZ2UgOiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgY29uc3QgcGxhY2Vob2xkZXIgPSAncGxhY2Vob2xkZXInIGluIHJlc3VsdCAmJiByZXN1bHQucGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICAgICAgPyByZXN1bHQucGxhY2Vob2xkZXJcbiAgICAgICAgICAgICAgICAgICAgOiBtb2RlbC5nZXRXb3JkQXRQb3NpdGlvbihwb3NpdGlvbik/LndvcmQgPz8gJyc7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28ocmFuZ2UpLCB0ZXh0OiBwbGFjZWhvbGRlciB9O1xuICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgY29uc3Qgd29yZCA9IG1vZGVsLmdldFdvcmRBdFBvc2l0aW9uKHBvc2l0aW9uKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gd29yZCA/IHtcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2U6IHsgc3RhcnRMaW5lTnVtYmVyOiBwb3NpdGlvbi5saW5lTnVtYmVyLCBzdGFydENvbHVtbjogd29yZC5zdGFydENvbHVtbiwgZW5kTGluZU51bWJlcjogcG9zaXRpb24ubGluZU51bWJlciwgZW5kQ29sdW1uOiB3b3JkLmVuZENvbHVtbiB9LFxuICAgICAgICAgICAgICAgICAgICB0ZXh0OiB3b3JkLndvcmQsXG4gICAgICAgICAgICAgICAgfSA6IG51bGw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyBSZWdpc3RlcmluZyB0aGlzIHByb3ZpZGVyIGFsc28gZW5hYmxlcyBlZGl0b3IuanMncyBleGlzdGluZyBmb3JtYXQtb24tc2F2ZSBwYXRoIGZvciBKYXZhOiB0aGVcbiAgICAvLyBzaGFyZWQgU2F2ZSBhY3Rpb24gcnVucyBlZGl0b3IuYWN0aW9uLmZvcm1hdERvY3VtZW50IHdoZW4gYXV0by1mb3JtYXR0aW5nIGlzIG9uICh0aGUgc2FtZVxuICAgIC8vIG1lY2hhbmlzbSBhbmQgZ2xvYmFsIHRvZ2dsZSB1c2VkIGZvciBUeXBlU2NyaXB0KS5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyRG9jdW1lbnRGb3JtYXR0aW5nRWRpdFByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlRG9jdW1lbnRGb3JtYXR0aW5nRWRpdHM6IGFzeW5jIChtb2RlbCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBlZGl0czogVGV4dEVkaXRbXSB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L2Zvcm1hdHRpbmcnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgICAgICBvcHRpb25zOiAgICAgIHsgdGFiU2l6ZTogbW9kZWwuZ2V0T3B0aW9ucygpLnRhYlNpemUsIGluc2VydFNwYWNlczogbW9kZWwuZ2V0T3B0aW9ucygpLmluc2VydFNwYWNlcyB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gZWRpdHMgPyBlZGl0cy5tYXAodGV4dEVkaXRUb01vbmFjbykgOiBudWxsO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckNvZGVBY3Rpb25Qcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZUNvZGVBY3Rpb25zOiBhc3luYyAobW9kZWwsIHJhbmdlLCBjb250ZXh0KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBlbXB0eSA9IHsgYWN0aW9uczogW10sIGRpc3Bvc2UoKSB7IC8qIG5vdGhpbmcgdG8gZGlzcG9zZSAqLyB9IH07XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gZW1wdHk7XG4gICAgICAgICAgICAvLyBTZW5kIHRoZSBvcmlnaW5hbCBMU1AgZGlhZ25vc3RpY3MgdGhhdCBvdmVybGFwIHRoZSByYW5nZSAodGhleSBjYXJyeSB0aGUgY29kZS9kYXRhIEpEVC5MU1xuICAgICAgICAgICAgLy8gbmVlZHMgdG8gY29tcHV0ZSBxdWljay1maXhlcyksIG5vdCBvbmVzIHJlY29uc3RydWN0ZWQgZnJvbSBNb25hY28gbWFya2Vycy5cbiAgICAgICAgICAgIGNvbnN0IGxzcFJhbmdlID0gbW9uYWNvUmFuZ2VUb0xzcChyYW5nZSk7XG4gICAgICAgICAgICBjb25zdCBkaWFnbm9zdGljcyA9IChfZGlhZ25vc3RpY3MuZ2V0KG1vZGVsLnVyaS50b1N0cmluZygpKSA/PyBbXSkuZmlsdGVyKGQgPT4gcmFuZ2VzT3ZlcmxhcChkLnJhbmdlLCBsc3BSYW5nZSkpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBBcnJheTxDb2RlQWN0aW9uIHwgQ29tbWFuZD4gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9jb2RlQWN0aW9uJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICAgICAgcmFuZ2U6ICAgICAgICBsc3BSYW5nZSxcbiAgICAgICAgICAgICAgICAvLyBNb25hY28ncyBDb2RlQWN0aW9uVHJpZ2dlclR5cGUgKEludm9rZT0xLCBBdXRvPTIpIG1hcHMgMToxIHRvIHRoZSBMU1AgdHJpZ2dlciBraW5kLlxuICAgICAgICAgICAgICAgIC8vIEZvcndhcmRpbmcgaXQgbGV0cyBKRFQuTFMgY29tcHV0ZSBvbmx5IHF1aWNrLWZpeGVzIGZvciB0aGUgcGFzc2l2ZSBsaWdodGJ1bGIgKGNoZWFwKVxuICAgICAgICAgICAgICAgIC8vIGFuZCB0aGUgZnVsbCBhc3Npc3RzL3JlZmFjdG9yaW5ncyBvbmx5IG9uIGV4cGxpY2l0IEN0cmwrLiAvIFJlZmFjdG9yXHUyMDI2IChJbnZva2VkKS5cbiAgICAgICAgICAgICAgICBjb250ZXh0OiAgICAgIHsgZGlhZ25vc3RpY3MsIG9ubHk6IGNvbnRleHQub25seSA/IFtjb250ZXh0Lm9ubHldIDogdW5kZWZpbmVkLCB0cmlnZ2VyS2luZDogY29udGV4dC50cmlnZ2VyIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGlmICghcmVzdWx0Py5sZW5ndGgpIHJldHVybiBlbXB0eTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgYWN0aW9uczogcmVzdWx0Lm1hcChsc3BDb2RlQWN0aW9uVG9Nb25hY28pLFxuICAgICAgICAgICAgICAgIGRpc3Bvc2UoKSB7IC8qIG5vdGhpbmcgdG8gZGlzcG9zZSAqLyB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICB9LCB7XG4gICAgICAgIHByb3ZpZGVkQ29kZUFjdGlvbktpbmRzOiBbJ3F1aWNrZml4JywgJ3JlZmFjdG9yJywgJ3JlZmFjdG9yLmV4dHJhY3QnLCAncmVmYWN0b3IuaW5saW5lJyxcbiAgICAgICAgICAgICdyZWZhY3Rvci5yZXdyaXRlJywgJ3NvdXJjZScsICdzb3VyY2Uub3JnYW5pemVJbXBvcnRzJ10sXG4gICAgfSk7XG5cbiAgICAvLyAtLS0gTmF2aWdhdGlvbiAmIHN0cnVjdHVyZSAoUGFjayAxKSAtLS1cblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJJbXBsZW1lbnRhdGlvblByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlSW1wbGVtZW50YXRpb246IChtb2RlbCwgcG9zaXRpb24pID0+IHJlcXVlc3RMb2NhdGlvbnMoJ3RleHREb2N1bWVudC9pbXBsZW1lbnRhdGlvbicsIG1vZGVsLCBwb3NpdGlvbiksXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyVHlwZURlZmluaXRpb25Qcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZVR5cGVEZWZpbml0aW9uOiAobW9kZWwsIHBvc2l0aW9uKSA9PiByZXF1ZXN0TG9jYXRpb25zKCd0ZXh0RG9jdW1lbnQvdHlwZURlZmluaXRpb24nLCBtb2RlbCwgcG9zaXRpb24pLFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckRvY3VtZW50SGlnaGxpZ2h0UHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVEb2N1bWVudEhpZ2hsaWdodHM6IGFzeW5jIChtb2RlbCwgcG9zaXRpb24pID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBhbnlbXSB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L2RvY3VtZW50SGlnaGxpZ2h0Jywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5tYXAoaCA9PiAoeyByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhoLnJhbmdlKSwga2luZDogaC5raW5kID8gaC5raW5kIC0gMSA6IHVuZGVmaW5lZCB9KSk7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyRG9jdW1lbnRTeW1ib2xQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZURvY3VtZW50U3ltYm9sczogYXN5bmMgKG1vZGVsKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55W10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9kb2N1bWVudFN5bWJvbCcsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0ID8gbWFwRG9jdW1lbnRTeW1ib2xzKHJlc3VsdCkgOiBudWxsO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckZvbGRpbmdSYW5nZVByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlRm9sZGluZ1JhbmdlczogYXN5bmMgKG1vZGVsKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55W10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9mb2xkaW5nUmFuZ2UnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5tYXAociA9PiAoeyBzdGFydDogci5zdGFydExpbmUgKyAxLCBlbmQ6IHIuZW5kTGluZSArIDEsIGtpbmQ6IGZvbGRpbmdLaW5kKHIua2luZCkgfSkpO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlclNlbGVjdGlvblJhbmdlUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVTZWxlY3Rpb25SYW5nZXM6IGFzeW5jIChtb2RlbCwgcG9zaXRpb25zKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55W10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9zZWxlY3Rpb25SYW5nZScsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uczogICAgcG9zaXRpb25zLm1hcChwID0+ICh7IGxpbmU6IHAubGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogcC5jb2x1bW4gLSAxIH0pKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdC5tYXAoZmxhdHRlblNlbGVjdGlvblJhbmdlKTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJEb2N1bWVudFJhbmdlRm9ybWF0dGluZ0VkaXRQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZURvY3VtZW50UmFuZ2VGb3JtYXR0aW5nRWRpdHM6IGFzeW5jIChtb2RlbCwgcmFuZ2UpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgZWRpdHM6IFRleHRFZGl0W10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9yYW5nZUZvcm1hdHRpbmcnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgICAgICByYW5nZTogICAgICAgIG1vbmFjb1JhbmdlVG9Mc3AocmFuZ2UpLFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6ICAgICAgeyB0YWJTaXplOiBtb2RlbC5nZXRPcHRpb25zKCkudGFiU2l6ZSwgaW5zZXJ0U3BhY2VzOiBtb2RlbC5nZXRPcHRpb25zKCkuaW5zZXJ0U3BhY2VzIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBlZGl0cyA/IGVkaXRzLm1hcCh0ZXh0RWRpdFRvTW9uYWNvKSA6IG51bGw7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyAtLS0gSW5sYXkgaGludHMgKyBzZW1hbnRpYyBoaWdobGlnaHRpbmcgKFBhY2sgMikgLS0tXG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVySW5sYXlIaW50c1Byb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlSW5sYXlIaW50czogYXN5bmMgKG1vZGVsLCByYW5nZSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IGFueVtdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvaW5sYXlIaW50Jywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICAgICAgcmFuZ2U6ICAgICAgICBtb25hY29SYW5nZVRvTHNwKHJhbmdlKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBoaW50czogcmVzdWx0Lm1hcChoID0+ICh7XG4gICAgICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lTnVtYmVyOiBoLnBvc2l0aW9uLmxpbmUgKyAxLCBjb2x1bW46IGgucG9zaXRpb24uY2hhcmFjdGVyICsgMSB9LFxuICAgICAgICAgICAgICAgICAgICBsYWJlbDogICAgICAgIHR5cGVvZiBoLmxhYmVsID09PSAnc3RyaW5nJyA/IGgubGFiZWwgOiAoaC5sYWJlbCA/PyBbXSkubWFwKChwOiBhbnkpID0+ICh7IGxhYmVsOiBwLnZhbHVlIH0pKSxcbiAgICAgICAgICAgICAgICAgICAga2luZDogICAgICAgICBoLmtpbmQsXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmdMZWZ0OiAgaC5wYWRkaW5nTGVmdCxcbiAgICAgICAgICAgICAgICAgICAgcGFkZGluZ1JpZ2h0OiBoLnBhZGRpbmdSaWdodCxcbiAgICAgICAgICAgICAgICAgICAgdG9vbHRpcDogICAgICBoLnRvb2x0aXAgPyBtYXJrdXBUb1N0cmluZyhoLnRvb2x0aXApIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgICBkaXNwb3NlKCkgeyAvKiBub3RoaW5nIHRvIGRpc3Bvc2UgKi8gfSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyRG9jdW1lbnRTZW1hbnRpY1Rva2Vuc1Byb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBnZXRMZWdlbmQ6ICgpID0+IF9zZW1hbnRpY1Rva2Vuc0xlZ2VuZCA/PyB7IHRva2VuVHlwZXM6IFtdLCB0b2tlbk1vZGlmaWVyczogW10gfSxcbiAgICAgICAgcHJvdmlkZURvY3VtZW50U2VtYW50aWNUb2tlbnM6IGFzeW5jIChtb2RlbCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSB8fCAhX3NlbWFudGljVG9rZW5zTGVnZW5kKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogeyBkYXRhOiBudW1iZXJbXTsgcmVzdWx0SWQ/OiBzdHJpbmcgfSB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L3NlbWFudGljVG9rZW5zL2Z1bGwnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQ/LmRhdGEpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHsgZGF0YTogbmV3IFVpbnQzMkFycmF5KHJlc3VsdC5kYXRhKSwgcmVzdWx0SWQ6IHJlc3VsdC5yZXN1bHRJZCB9O1xuICAgICAgICB9LFxuICAgICAgICByZWxlYXNlRG9jdW1lbnRTZW1hbnRpY1Rva2VuczogKCkgPT4geyAvKiBub3RoaW5nIHRvIHJlbGVhc2UgKi8gfSxcbiAgICB9KTtcblxuICAgIC8vIC0tLSBDb2RlTGVucyAoUGFjayAzKSAtLS1cblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJDb2RlTGVuc1Byb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlQ29kZUxlbnNlczogYXN5bmMgKG1vZGVsKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4geyBsZW5zZXM6IFtdLCBkaXNwb3NlKCkgeyAvKiAqLyB9IH07XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IGFueVtdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvY29kZUxlbnMnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgY29uc3QgbGVuc2VzID0gKHJlc3VsdCA/PyBbXSkubWFwKChsZW5zLCBpKSA9PiAoe1xuICAgICAgICAgICAgICAgIHJhbmdlOiAgICBsc3BSYW5nZVRvTW9uYWNvKGxlbnMucmFuZ2UpLFxuICAgICAgICAgICAgICAgIGlkOiAgICAgICBTdHJpbmcoaSksXG4gICAgICAgICAgICAgICAgY29tbWFuZDogIGxlbnMuY29tbWFuZCA/IG1hcExlbnNDb21tYW5kKGxlbnMuY29tbWFuZCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgX2xzcDogICAgIGxlbnMsXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgICAgICByZXR1cm4geyBsZW5zZXMsIGRpc3Bvc2UoKSB7IC8qICovIH0gfTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVzb2x2ZUNvZGVMZW5zOiBhc3luYyAoX21vZGVsLCBjb2RlTGVucykgPT4ge1xuICAgICAgICAgICAgY29uc3QgbHNwID0gKGNvZGVMZW5zIGFzIGFueSkuX2xzcDtcbiAgICAgICAgICAgIGlmIChfY29ubiAmJiBsc3AgJiYgIWxzcC5jb21tYW5kKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWQ6IGFueSA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCdjb2RlTGVucy9yZXNvbHZlJywgbHNwKTtcbiAgICAgICAgICAgICAgICAgICAgY29kZUxlbnMuY29tbWFuZCA9IHJlc29sdmVkPy5jb21tYW5kID8gbWFwTGVuc0NvbW1hbmQocmVzb2x2ZWQuY29tbWFuZCkgOiB7IGlkOiBOT09QX0NPTU1BTkQsIHRpdGxlOiAnJyB9O1xuICAgICAgICAgICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgICAgICAgICBjb2RlTGVucy5jb21tYW5kID0geyBpZDogTk9PUF9DT01NQU5ELCB0aXRsZTogJycgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gY29kZUxlbnM7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICAvLyAtLS0gSmF2YSBrZXl3b3JkIGNvbXBsZXRpb24gKFBhY2sgMWIpOiBhbHdheXMtYXZhaWxhYmxlLCByYW5rZWQgYmVsb3cgU0RLL0xTUCByZXN1bHRzIC0tLVxuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckNvbXBsZXRpb25JdGVtUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVDb21wbGV0aW9uSXRlbXM6IChtb2RlbCwgcG9zaXRpb24pID0+IHtcbiAgICAgICAgICAgIGlmICghaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCB3b3JkID0gbW9kZWwuZ2V0V29yZFVudGlsUG9zaXRpb24ocG9zaXRpb24pO1xuICAgICAgICAgICAgY29uc3QgcmFuZ2U6IG1vbmFjby5JUmFuZ2UgPSB7XG4gICAgICAgICAgICAgICAgc3RhcnRMaW5lTnVtYmVyOiBwb3NpdGlvbi5saW5lTnVtYmVyLCBzdGFydENvbHVtbjogd29yZC5zdGFydENvbHVtbixcbiAgICAgICAgICAgICAgICBlbmRMaW5lTnVtYmVyOiAgIHBvc2l0aW9uLmxpbmVOdW1iZXIsIGVuZENvbHVtbjogICB3b3JkLmVuZENvbHVtbixcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIHN1Z2dlc3Rpb25zOiBKQVZBX0tFWVdPUkRTLm1hcChrZXl3b3JkID0+ICh7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAgICAgIGtleXdvcmQsXG4gICAgICAgICAgICAgICAgICAgIGtpbmQ6ICAgICAgIG1vbmFjby5sYW5ndWFnZXMuQ29tcGxldGlvbkl0ZW1LaW5kLktleXdvcmQsXG4gICAgICAgICAgICAgICAgICAgIGluc2VydFRleHQ6IGtleXdvcmQsXG4gICAgICAgICAgICAgICAgICAgIHJhbmdlLFxuICAgICAgICAgICAgICAgICAgICBzb3J0VGV4dDogICBgOV8ke2tleXdvcmR9YCxcbiAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgIH0pO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBIZWxwZXJzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbmZ1bmN0aW9uIGxzcFNldmVyaXR5KHNldmVyaXR5OiBEaWFnbm9zdGljU2V2ZXJpdHkgfCB1bmRlZmluZWQpOiBtb25hY28uTWFya2VyU2V2ZXJpdHkge1xuICAgIHN3aXRjaCAoc2V2ZXJpdHkpIHtcbiAgICAgICAgY2FzZSBEaWFnbm9zdGljU2V2ZXJpdHkuRXJyb3I6ICAgICAgIHJldHVybiBtb25hY28uTWFya2VyU2V2ZXJpdHkuRXJyb3I7XG4gICAgICAgIGNhc2UgRGlhZ25vc3RpY1NldmVyaXR5Lldhcm5pbmc6ICAgICByZXR1cm4gbW9uYWNvLk1hcmtlclNldmVyaXR5Lldhcm5pbmc7XG4gICAgICAgIGNhc2UgRGlhZ25vc3RpY1NldmVyaXR5LkluZm9ybWF0aW9uOiByZXR1cm4gbW9uYWNvLk1hcmtlclNldmVyaXR5LkluZm87XG4gICAgICAgIGNhc2UgRGlhZ25vc3RpY1NldmVyaXR5LkhpbnQ6ICAgICAgICByZXR1cm4gbW9uYWNvLk1hcmtlclNldmVyaXR5LkhpbnQ7XG4gICAgICAgIGRlZmF1bHQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbW9uYWNvLk1hcmtlclNldmVyaXR5LkVycm9yO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gbHNwUmFuZ2VUb01vbmFjbyhyOiB7IHN0YXJ0OiB7IGxpbmU6IG51bWJlcjsgY2hhcmFjdGVyOiBudW1iZXIgfTsgZW5kOiB7IGxpbmU6IG51bWJlcjsgY2hhcmFjdGVyOiBudW1iZXIgfSB9KTogbW9uYWNvLklSYW5nZSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgc3RhcnRMaW5lTnVtYmVyOiByLnN0YXJ0LmxpbmUgKyAxLFxuICAgICAgICBzdGFydENvbHVtbjogICAgIHIuc3RhcnQuY2hhcmFjdGVyICsgMSxcbiAgICAgICAgZW5kTGluZU51bWJlcjogICByLmVuZC5saW5lICsgMSxcbiAgICAgICAgZW5kQ29sdW1uOiAgICAgICByLmVuZC5jaGFyYWN0ZXIgKyAxLFxuICAgIH07XG59XG5cbmZ1bmN0aW9uIG1hcmt1cFRvU3RyaW5nKGM6IHN0cmluZyB8IE1hcmt1cENvbnRlbnQpOiBzdHJpbmcge1xuICAgIHJldHVybiB0eXBlb2YgYyA9PT0gJ3N0cmluZycgPyBjIDogYy52YWx1ZTtcbn1cblxuZnVuY3Rpb24gbHNwQ29tcGxldGlvbktpbmQoa2luZDogQ29tcGxldGlvbkl0ZW1LaW5kIHwgdW5kZWZpbmVkKTogbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbUtpbmQge1xuICAgIGNvbnN0IEsgPSBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtS2luZDtcbiAgICBzd2l0Y2ggKGtpbmQpIHtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuVGV4dDogICAgICAgICAgcmV0dXJuIEsuVGV4dDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuTWV0aG9kOiAgICAgICAgcmV0dXJuIEsuTWV0aG9kO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5GdW5jdGlvbjogICAgICByZXR1cm4gSy5GdW5jdGlvbjtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuQ29uc3RydWN0b3I6ICAgcmV0dXJuIEsuQ29uc3RydWN0b3I7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLkZpZWxkOiAgICAgICAgIHJldHVybiBLLkZpZWxkO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5WYXJpYWJsZTogICAgICByZXR1cm4gSy5WYXJpYWJsZTtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuQ2xhc3M6ICAgICAgICAgcmV0dXJuIEsuQ2xhc3M7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLkludGVyZmFjZTogICAgIHJldHVybiBLLkludGVyZmFjZTtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuTW9kdWxlOiAgICAgICAgcmV0dXJuIEsuTW9kdWxlO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5Qcm9wZXJ0eTogICAgICByZXR1cm4gSy5Qcm9wZXJ0eTtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuS2V5d29yZDogICAgICAgcmV0dXJuIEsuS2V5d29yZDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuU25pcHBldDogICAgICAgcmV0dXJuIEsuU25pcHBldDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuQ29uc3RhbnQ6ICAgICAgcmV0dXJuIEsuQ29uc3RhbnQ7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLlN0cnVjdDogICAgICAgIHJldHVybiBLLlN0cnVjdDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuVHlwZVBhcmFtZXRlcjogcmV0dXJuIEsuVHlwZVBhcmFtZXRlcjtcbiAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEsuVGV4dDtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGxzcENvbXBsZXRpb25Ub01vbmFjbyhcbiAgICBpdGVtOiBDb21wbGV0aW9uSXRlbSxcbiAgICBtb2RlbDogbW9uYWNvLmVkaXRvci5JVGV4dE1vZGVsLFxuICAgIHBvc2l0aW9uOiBtb25hY28uUG9zaXRpb24sXG4pOiBNb25hY29Db21wbGV0aW9uSXRlbSB7XG4gICAgY29uc3Qgd29yZCA9IG1vZGVsLmdldFdvcmRVbnRpbFBvc2l0aW9uKHBvc2l0aW9uKTtcbiAgICBsZXQgcmFuZ2U6IG1vbmFjby5JUmFuZ2UgPSB7XG4gICAgICAgIHN0YXJ0TGluZU51bWJlcjogcG9zaXRpb24ubGluZU51bWJlcixcbiAgICAgICAgc3RhcnRDb2x1bW46ICAgICB3b3JkLnN0YXJ0Q29sdW1uLFxuICAgICAgICBlbmRMaW5lTnVtYmVyOiAgIHBvc2l0aW9uLmxpbmVOdW1iZXIsXG4gICAgICAgIGVuZENvbHVtbjogICAgICAgd29yZC5lbmRDb2x1bW4sXG4gICAgfTtcbiAgICBsZXQgaW5zZXJ0VGV4dCA9IGl0ZW0uaW5zZXJ0VGV4dCA/PyBpdGVtLmxhYmVsO1xuICAgIGNvbnN0IHRleHRFZGl0ID0gaXRlbS50ZXh0RWRpdCBhcyB7IHJhbmdlPzogTHNwUmFuZ2U7IHJlcGxhY2U/OiBMc3BSYW5nZTsgaW5zZXJ0PzogTHNwUmFuZ2U7IG5ld1RleHQ/OiBzdHJpbmcgfSB8IHVuZGVmaW5lZDtcbiAgICBpZiAodGV4dEVkaXQpIHtcbiAgICAgICAgY29uc3QgciA9IHRleHRFZGl0LnJhbmdlID8/IHRleHRFZGl0LnJlcGxhY2UgPz8gdGV4dEVkaXQuaW5zZXJ0O1xuICAgICAgICBpZiAocikgcmFuZ2UgPSBsc3BSYW5nZVRvTW9uYWNvKHIpO1xuICAgICAgICBpZiAodHlwZW9mIHRleHRFZGl0Lm5ld1RleHQgPT09ICdzdHJpbmcnKSBpbnNlcnRUZXh0ID0gdGV4dEVkaXQubmV3VGV4dDtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0OiBNb25hY29Db21wbGV0aW9uSXRlbSA9IHtcbiAgICAgICAgbGFiZWw6ICAgICAgICAgICBpdGVtLmxhYmVsLFxuICAgICAgICBraW5kOiAgICAgICAgICAgIGxzcENvbXBsZXRpb25LaW5kKGl0ZW0ua2luZCksXG4gICAgICAgIGRldGFpbDogICAgICAgICAgaXRlbS5kZXRhaWwsXG4gICAgICAgIGRvY3VtZW50YXRpb246ICAgaXRlbS5kb2N1bWVudGF0aW9uID8geyB2YWx1ZTogbWFya3VwVG9TdHJpbmcoaXRlbS5kb2N1bWVudGF0aW9uKSwgaXNUcnVzdGVkOiBmYWxzZSB9IDogdW5kZWZpbmVkLFxuICAgICAgICBpbnNlcnRUZXh0LFxuICAgICAgICBpbnNlcnRUZXh0UnVsZXM6IGl0ZW0uaW5zZXJ0VGV4dEZvcm1hdCA9PT0gSW5zZXJ0VGV4dEZvcm1hdC5TbmlwcGV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbUluc2VydFRleHRSdWxlLkluc2VydEFzU25pcHBldFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHVuZGVmaW5lZCxcbiAgICAgICAgcmFuZ2UsXG4gICAgICAgIHNvcnRUZXh0OiAgICAgICAgICAgIHNka1ByaW9yaXRpc2VkU29ydFRleHQoaXRlbSksXG4gICAgICAgIGZpbHRlclRleHQ6ICAgICAgICAgIGl0ZW0uZmlsdGVyVGV4dCxcbiAgICAgICAgcHJlc2VsZWN0OiAgICAgICAgICAgaXRlbS5wcmVzZWxlY3QsXG4gICAgICAgIGNvbW1pdENoYXJhY3RlcnM6ICAgIGl0ZW0uY29tbWl0Q2hhcmFjdGVycyxcbiAgICAgICAgYWRkaXRpb25hbFRleHRFZGl0czogaXRlbS5hZGRpdGlvbmFsVGV4dEVkaXRzPy5tYXAodGV4dEVkaXRUb01vbmFjbyksXG4gICAgfTtcbiAgICByZXN1bHQuX2xzcCA9IGl0ZW07XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBSYW5rcyBEaXJpZ2libGUgU0RLIHN1Z2dlc3Rpb25zICh7QGNvZGUgb3JnLmVjbGlwc2UuZGlyaWdpYmxlLnNkay4qfSkgYWJvdmUgZXZlcnl0aGluZyBlbHNlIGJ5XG4gKiBwcmVmaXhpbmcgdGhlIHNlcnZlciBzb3J0VGV4dCB3aXRoIGEgcHJpb3JpdHkgYnVja2V0LCBwcmVzZXJ2aW5nIHRoZSBzZXJ2ZXIgb3JkZXIgd2l0aGluIGVhY2ggYnVja2V0LlxuICovXG5mdW5jdGlvbiBzZGtQcmlvcml0aXNlZFNvcnRUZXh0KGl0ZW06IENvbXBsZXRpb25JdGVtKTogc3RyaW5nIHtcbiAgICBjb25zdCBiYXNlID0gaXRlbS5zb3J0VGV4dCA/PyAodHlwZW9mIGl0ZW0ubGFiZWwgPT09ICdzdHJpbmcnID8gaXRlbS5sYWJlbCA6ICcnKTtcbiAgICBjb25zdCBkZXNjcmlwdGlvbiA9IChpdGVtLmxhYmVsRGV0YWlscyAmJiB0eXBlb2YgaXRlbS5sYWJlbERldGFpbHMuZGVzY3JpcHRpb24gPT09ICdzdHJpbmcnKVxuICAgICAgICA/IGl0ZW0ubGFiZWxEZXRhaWxzLmRlc2NyaXB0aW9uIDogJyc7XG4gICAgY29uc3QgaGF5c3RhY2sgPSBgJHtpdGVtLmRldGFpbCA/PyAnJ30gJHtkZXNjcmlwdGlvbn1gO1xuICAgIHJldHVybiBoYXlzdGFjay5pbmNsdWRlcygnb3JnLmVjbGlwc2UuZGlyaWdpYmxlLnNkaycpID8gYDBfJHtiYXNlfWAgOiBgMV8ke2Jhc2V9YDtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuLy8gQ29kZSBhY3Rpb25zLCBjb21tYW5kcywgcmVmYWN0b3IvZ2VuZXJhdGUsIHdvcmtzcGFjZSBlZGl0c1xuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogTW9uYWNvIGNvbW1hbmQgaWQgdXNlZCB0byBhcHBseSBhIGRlZmVycmVkIExTUCBjb2RlIGFjdGlvbiB3aGVuIHRoZSB1c2VyIHNlbGVjdHMgaXQuICovXG5jb25zdCBBUFBMWV9BQ1RJT05fQ09NTUFORCA9ICdkaXJpZ2libGUuamF2YS5hcHBseUNvZGVBY3Rpb24nO1xuXG4vKiogVmlydHVhbCBVUkkgcHJlZml4IG9mIGVkaXRvciBtb2RlbHM7IHN0cmlwcGluZyBpdCB5aWVsZHMgdGhlIElERSB3b3Jrc3BhY2UgcGF0aCAoL3dzL3Byb2ovLi4uKS4gKi9cbmNvbnN0IFZJUlRVQUxfRklMRV9QUkVGSVggPSAnZmlsZTovLy93b3Jrc3BhY2UnO1xuXG4vKiogTW9uYWNvIGNvbW1hbmQgaWQgdXNlZCBmb3IgZGlzcGxheS1vbmx5IENvZGVMZW5zZXMgKGUuZy4gYSByZWZlcmVuY2UgY291bnQgd2l0aCBubyByZXNvbHZlZCBhY3Rpb24pLiAqL1xuY29uc3QgTk9PUF9DT01NQU5EID0gJ2RpcmlnaWJsZS5qYXZhLm5vb3BMZW5zJztcblxuLyoqIEphdmEgU0Uga2V5d29yZHMvbGl0ZXJhbHMgb2ZmZXJlZCBhcyBsb3ctcHJpb3JpdHkgY29tcGxldGlvbiBzbyB0aGV5IGFsd2F5cyBhcHBlYXIgd2hpbGUgdHlwaW5nLiAqL1xuY29uc3QgSkFWQV9LRVlXT1JEUyA9IFsnYWJzdHJhY3QnLCAnYXNzZXJ0JywgJ2Jvb2xlYW4nLCAnYnJlYWsnLCAnYnl0ZScsICdjYXNlJywgJ2NhdGNoJywgJ2NoYXInLCAnY2xhc3MnLFxuICAgICdjb25zdCcsICdjb250aW51ZScsICdkZWZhdWx0JywgJ2RvJywgJ2RvdWJsZScsICdlbHNlJywgJ2VudW0nLCAnZXh0ZW5kcycsICdmaW5hbCcsICdmaW5hbGx5JywgJ2Zsb2F0JyxcbiAgICAnZm9yJywgJ2dvdG8nLCAnaWYnLCAnaW1wbGVtZW50cycsICdpbXBvcnQnLCAnaW5zdGFuY2VvZicsICdpbnQnLCAnaW50ZXJmYWNlJywgJ2xvbmcnLCAnbmF0aXZlJywgJ25ldycsXG4gICAgJ3BhY2thZ2UnLCAncHJpdmF0ZScsICdwcm90ZWN0ZWQnLCAncHVibGljJywgJ3JldHVybicsICdzaG9ydCcsICdzdGF0aWMnLCAnc3RyaWN0ZnAnLCAnc3VwZXInLCAnc3dpdGNoJyxcbiAgICAnc3luY2hyb25pemVkJywgJ3RoaXMnLCAndGhyb3cnLCAndGhyb3dzJywgJ3RyYW5zaWVudCcsICd0cnknLCAndm9pZCcsICd2b2xhdGlsZScsICd3aGlsZScsICd2YXInLFxuICAgICd5aWVsZCcsICdyZWNvcmQnLCAnc2VhbGVkJywgJ3Blcm1pdHMnLCAndHJ1ZScsICdmYWxzZScsICdudWxsJ107XG5cbi8qKiBTaGFyZWQgZGVmaW5pdGlvbi1zdHlsZSBsb2NhdGlvbiByZXF1ZXN0IHVzZWQgYnkgZ28tdG8tZGVmaW5pdGlvbi9pbXBsZW1lbnRhdGlvbi90eXBlLWRlZmluaXRpb24uICovXG5hc3luYyBmdW5jdGlvbiByZXF1ZXN0TG9jYXRpb25zKG1ldGhvZDogc3RyaW5nLCBtb2RlbDogbW9uYWNvLmVkaXRvci5JVGV4dE1vZGVsLCBwb3NpdGlvbjogbW9uYWNvLlBvc2l0aW9uKSB7XG4gICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgcmVzdWx0OiBMb2NhdGlvbiB8IExvY2F0aW9uW10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QobWV0aG9kLCB7XG4gICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgfSk7XG4gICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgIGNvbnN0IGxvY2F0aW9ucyA9IChBcnJheS5pc0FycmF5KHJlc3VsdCkgPyByZXN1bHQgOiBbcmVzdWx0XSkubWFwKGxvYyA9PiAoeyB1cmk6IG1vbmFjby5VcmkucGFyc2UobG9jLnVyaSksIHJhbmdlOiBsc3BSYW5nZVRvTW9uYWNvKGxvYy5yYW5nZSkgfSkpO1xuICAgIGF3YWl0IGVuc3VyZU1vZGVsc0ZvckxvY2F0aW9ucyhsb2NhdGlvbnMpO1xuICAgIHJldHVybiBsb2NhdGlvbnM7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBpbi1tZW1vcnkgTW9uYWNvIG1vZGVscyBmb3IgdGhlIHdvcmtzcGFjZSBmaWxlcyByZWZlcmVuY2VkIGJ5IHRoZSBnaXZlbiBsb2NhdGlvbnMgKGZldGNoZWRcbiAqIG92ZXIgUkVTVCkgc28gdGhlIHJlZmVyZW5jZXMgLyBwZWVrIHdpZGdldHMgY2FuIHJlbmRlciBhIGNvZGUgcHJldmlldyBcdTIwMTQgTW9uYWNvIGNhbiBvbmx5IHByZXZpZXcgZmlsZXNcbiAqIGl0IGhhcyBhIG1vZGVsIGZvciwgYW5kIHRoaXMgc2luZ2xlLWZpbGUgZWRpdG9yIG90aGVyd2lzZSBoYXMgbm9uZSBmb3Igb3RoZXIgZmlsZXMuXG4gKi9cbmFzeW5jIGZ1bmN0aW9uIGVuc3VyZU1vZGVsc0ZvckxvY2F0aW9ucyhsb2NhdGlvbnM6IEFycmF5PHsgdXJpOiBtb25hY28uVXJpIH0+KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3Qgc2VlbiA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICAgIGF3YWl0IFByb21pc2UuYWxsKGxvY2F0aW9ucy5tYXAoYXN5bmMgKHsgdXJpIH0pID0+IHtcbiAgICAgICAgY29uc3QgdXJpU3RyID0gdXJpLnRvU3RyaW5nKCk7XG4gICAgICAgIGlmIChzZWVuLmhhcyh1cmlTdHIpIHx8ICF1cmlTdHIuc3RhcnRzV2l0aChWSVJUVUFMX0ZJTEVfUFJFRklYKSB8fCBtb25hY28uZWRpdG9yLmdldE1vZGVsKHVyaSkpIHJldHVybjtcbiAgICAgICAgc2Vlbi5hZGQodXJpU3RyKTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGNvbnN0IHRleHQgPSBhd2FpdCBmZXRjaFdvcmtzcGFjZUZpbGVUZXh0KHVyaVRvV29ya3NwYWNlUGF0aCh1cmlTdHIpID8/IHVyaVN0cik7XG4gICAgICAgICAgICBpZiAoIW1vbmFjby5lZGl0b3IuZ2V0TW9kZWwodXJpKSkgbW9uYWNvLmVkaXRvci5jcmVhdGVNb2RlbCh0ZXh0LCAnamF2YScsIHVyaSk7XG4gICAgICAgIH0gY2F0Y2gge1xuICAgICAgICAgICAgLy8gcHJldmlldyBqdXN0IHdvbid0IHJlbmRlciBmb3IgdGhpcyBvbmVcbiAgICAgICAgfVxuICAgIH0pKTtcbn1cblxuLyoqIFJlY3Vyc2l2ZWx5IG1hcHMgTFNQIGhpZXJhcmNoaWNhbCBEb2N1bWVudFN5bWJvbHMgdG8gTW9uYWNvJ3Mgc2hhcGUgKGtpbmRzIGFyZSAxLWJhc2VkIHZzIDAtYmFzZWQpLiAqL1xuZnVuY3Rpb24gbWFwRG9jdW1lbnRTeW1ib2xzKHN5bWJvbHM6IGFueVtdKTogbW9uYWNvLmxhbmd1YWdlcy5Eb2N1bWVudFN5bWJvbFtdIHtcbiAgICByZXR1cm4gKHN5bWJvbHMgPz8gW10pLm1hcChzID0+ICh7XG4gICAgICAgIG5hbWU6ICAgICAgICAgICBzLm5hbWUsXG4gICAgICAgIGRldGFpbDogICAgICAgICBzLmRldGFpbCA/PyAnJyxcbiAgICAgICAga2luZDogICAgICAgICAgIChzLmtpbmQgPz8gMSkgLSAxLFxuICAgICAgICB0YWdzOiAgICAgICAgICAgcy50YWdzID8/IFtdLFxuICAgICAgICByYW5nZTogICAgICAgICAgbHNwUmFuZ2VUb01vbmFjbyhzLnJhbmdlKSxcbiAgICAgICAgc2VsZWN0aW9uUmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28ocy5zZWxlY3Rpb25SYW5nZSA/PyBzLnJhbmdlKSxcbiAgICAgICAgY2hpbGRyZW46ICAgICAgIHMuY2hpbGRyZW4gPyBtYXBEb2N1bWVudFN5bWJvbHMocy5jaGlsZHJlbikgOiBbXSxcbiAgICB9KSk7XG59XG5cbmZ1bmN0aW9uIGZvbGRpbmdLaW5kKGtpbmQ6IHN0cmluZyB8IHVuZGVmaW5lZCk6IG1vbmFjby5sYW5ndWFnZXMuRm9sZGluZ1JhbmdlS2luZCB8IHVuZGVmaW5lZCB7XG4gICAgY29uc3QgRksgPSBtb25hY28ubGFuZ3VhZ2VzLkZvbGRpbmdSYW5nZUtpbmQ7XG4gICAgc3dpdGNoIChraW5kKSB7XG4gICAgICAgIGNhc2UgJ2NvbW1lbnQnOiByZXR1cm4gRksuQ29tbWVudDtcbiAgICAgICAgY2FzZSAnaW1wb3J0cyc6IHJldHVybiBGSy5JbXBvcnRzO1xuICAgICAgICBjYXNlICdyZWdpb24nOiAgcmV0dXJuIEZLLlJlZ2lvbjtcbiAgICAgICAgZGVmYXVsdDogICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgfVxufVxuXG4vKiogRmxhdHRlbnMgYW4gTFNQIFNlbGVjdGlvblJhbmdlIHBhcmVudC1jaGFpbiBpbnRvIE1vbmFjbydzIGlubmVybW9zdC10by1vdXRlcm1vc3QgYXJyYXkuICovXG5mdW5jdGlvbiBmbGF0dGVuU2VsZWN0aW9uUmFuZ2Uoc2VsZWN0aW9uUmFuZ2U6IGFueSk6IG1vbmFjby5sYW5ndWFnZXMuU2VsZWN0aW9uUmFuZ2VbXSB7XG4gICAgY29uc3QgcmFuZ2VzOiBtb25hY28ubGFuZ3VhZ2VzLlNlbGVjdGlvblJhbmdlW10gPSBbXTtcbiAgICBsZXQgY3VycmVudCA9IHNlbGVjdGlvblJhbmdlO1xuICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICAgIHJhbmdlcy5wdXNoKHsgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28oY3VycmVudC5yYW5nZSkgfSk7XG4gICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LnBhcmVudDtcbiAgICB9XG4gICAgcmV0dXJuIHJhbmdlcztcbn1cblxuLyoqIE1hcHMgYSBKRFQuTFMgQ29kZUxlbnMgY29tbWFuZCB0byBhIE1vbmFjbyBjb21tYW5kLCB3aXJpbmcgdGhlIHJlZmVyZW5jZXMvaW1wbGVtZW50YXRpb25zIHBlZWsuICovXG5mdW5jdGlvbiBtYXBMZW5zQ29tbWFuZChjbWQ6IGFueSk6IG1vbmFjby5sYW5ndWFnZXMuQ29tbWFuZCB7XG4gICAgY29uc3QgYXJncyA9IGNtZC5hcmd1bWVudHMgPz8gW107XG4gICAgaWYgKChjbWQuY29tbWFuZCA9PT0gJ2phdmEuc2hvdy5yZWZlcmVuY2VzJyB8fCBjbWQuY29tbWFuZCA9PT0gJ2phdmEuc2hvdy5pbXBsZW1lbnRhdGlvbnMnKSAmJiBhcmdzLmxlbmd0aCA+PSAzKSB7XG4gICAgICAgIGNvbnN0IGxvY2F0aW9ucyA9IChhcmdzWzJdID8/IFtdKS5tYXAoKGw6IGFueSkgPT4gKHsgdXJpOiBtb25hY28uVXJpLnBhcnNlKGwudXJpKSwgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28obC5yYW5nZSkgfSkpO1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6ICAgICAgICAnZWRpdG9yLmFjdGlvbi5zaG93UmVmZXJlbmNlcycsXG4gICAgICAgICAgICB0aXRsZTogICAgIGNtZC50aXRsZSxcbiAgICAgICAgICAgIGFyZ3VtZW50czogW21vbmFjby5VcmkucGFyc2UoYXJnc1swXSksIHsgbGluZU51bWJlcjogYXJnc1sxXS5saW5lICsgMSwgY29sdW1uOiBhcmdzWzFdLmNoYXJhY3RlciArIDEgfSwgbG9jYXRpb25zXSxcbiAgICAgICAgfTtcbiAgICB9XG4gICAgcmV0dXJuIHsgaWQ6IE5PT1BfQ09NTUFORCwgdGl0bGU6IGNtZC50aXRsZSB9O1xufVxuXG50eXBlIExzcFJhbmdlID0geyBzdGFydDogeyBsaW5lOiBudW1iZXI7IGNoYXJhY3RlcjogbnVtYmVyIH07IGVuZDogeyBsaW5lOiBudW1iZXI7IGNoYXJhY3RlcjogbnVtYmVyIH0gfTtcblxuLyoqIE1vbmFjbyBjb21wbGV0aW9uIGl0ZW0gY2FycnlpbmcgdGhlIG9yaWdpbmF0aW5nIExTUCBpdGVtIHNvIHJlc29sdmUgY2FuIGZldGNoIGl0cyBpbXBvcnQgZWRpdHMuICovXG50eXBlIE1vbmFjb0NvbXBsZXRpb25JdGVtID0gbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbSAmIHsgX2xzcD86IENvbXBsZXRpb25JdGVtIH07XG5cbmZ1bmN0aW9uIHRleHRFZGl0VG9Nb25hY28oZWRpdDogVGV4dEVkaXQpOiBtb25hY28ubGFuZ3VhZ2VzLlRleHRFZGl0IHtcbiAgICByZXR1cm4geyByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhlZGl0LnJhbmdlKSwgdGV4dDogZWRpdC5uZXdUZXh0IH07XG59XG5cbmZ1bmN0aW9uIG1vbmFjb1JhbmdlVG9Mc3AocjogbW9uYWNvLklSYW5nZSk6IExzcFJhbmdlIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBzdGFydDogeyBsaW5lOiByLnN0YXJ0TGluZU51bWJlciAtIDEsIGNoYXJhY3Rlcjogci5zdGFydENvbHVtbiAtIDEgfSxcbiAgICAgICAgZW5kOiAgIHsgbGluZTogci5lbmRMaW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiByLmVuZENvbHVtbiAtIDEgfSxcbiAgICB9O1xufVxuXG4vKiogVHJ1ZSB3aGVuIHR3byBMU1AgcmFuZ2VzIGludGVyc2VjdCAodXNlZCB0byBwaWNrIHRoZSBkaWFnbm9zdGljcyByZWxldmFudCB0byBhIGNvZGUtYWN0aW9uIHJlcXVlc3QpLiAqL1xuZnVuY3Rpb24gcmFuZ2VzT3ZlcmxhcChhOiBMc3BSYW5nZSwgYjogTHNwUmFuZ2UpOiBib29sZWFuIHtcbiAgICBjb25zdCBub3RBZnRlciA9IChwOiB7IGxpbmU6IG51bWJlcjsgY2hhcmFjdGVyOiBudW1iZXIgfSwgcTogeyBsaW5lOiBudW1iZXI7IGNoYXJhY3RlcjogbnVtYmVyIH0pID0+XG4gICAgICAgIHAubGluZSA8IHEubGluZSB8fCAocC5saW5lID09PSBxLmxpbmUgJiYgcC5jaGFyYWN0ZXIgPD0gcS5jaGFyYWN0ZXIpO1xuICAgIHJldHVybiBub3RBZnRlcihhLnN0YXJ0LCBiLmVuZCkgJiYgbm90QWZ0ZXIoYi5zdGFydCwgYS5lbmQpO1xufVxuXG5mdW5jdGlvbiBsc3BDb2RlQWN0aW9uVG9Nb25hY28oYWN0aW9uOiBDb2RlQWN0aW9uIHwgQ29tbWFuZCk6IG1vbmFjby5sYW5ndWFnZXMuQ29kZUFjdGlvbiB7XG4gICAgY29uc3QgaXNDb21tYW5kID0gdHlwZW9mIChhY3Rpb24gYXMgQ29tbWFuZCkuY29tbWFuZCA9PT0gJ3N0cmluZyc7XG4gICAgY29uc3QgdGl0bGUgPSBhY3Rpb24udGl0bGVcbiAgICAgICAgPz8gKGlzQ29tbWFuZCA/IChhY3Rpb24gYXMgQ29tbWFuZCkuY29tbWFuZCA6IChhY3Rpb24gYXMgQ29kZUFjdGlvbikuY29tbWFuZD8udGl0bGUpXG4gICAgICAgID8/ICdBY3Rpb24nO1xuICAgIGNvbnN0IGtpbmQgPSBpc0NvbW1hbmQgPyAncXVpY2tmaXgnIDogKChhY3Rpb24gYXMgQ29kZUFjdGlvbikua2luZCA/PyAncXVpY2tmaXgnKTtcbiAgICByZXR1cm4ge1xuICAgICAgICB0aXRsZSxcbiAgICAgICAga2luZCxcbiAgICAgICAgZGlhZ25vc3RpY3M6IFtdLFxuICAgICAgICBpc1ByZWZlcnJlZDogKGFjdGlvbiBhcyBDb2RlQWN0aW9uKS5pc1ByZWZlcnJlZCxcbiAgICAgICAgLy8gQXBwbHkgbGF6aWx5IHRocm91Z2ggb3VyIGNvbW1hbmQgc28gd2UgY2FuIHJlc29sdmUsIHJ1biBzZXJ2ZXIgY29tbWFuZHMgYW5kIGFwcGx5IGVkaXRzIHVuaWZvcm1seS5cbiAgICAgICAgY29tbWFuZDogeyBpZDogQVBQTFlfQUNUSU9OX0NPTU1BTkQsIHRpdGxlLCBhcmd1bWVudHM6IFthY3Rpb25dIH0sXG4gICAgfTtcbn1cblxuYXN5bmMgZnVuY3Rpb24gYXBwbHlDb2RlQWN0aW9uKGFjdGlvbjogQ29kZUFjdGlvbiB8IENvbW1hbmQpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBpZiAoIV9jb25uKSByZXR1cm47XG4gICAgdHJ5IHtcbiAgICAgICAgaWYgKHR5cGVvZiAoYWN0aW9uIGFzIENvbW1hbmQpLmNvbW1hbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBhd2FpdCBydW5TZXJ2ZXJDb21tYW5kKGFjdGlvbiBhcyBDb21tYW5kKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgcmVzb2x2ZWQgPSBhY3Rpb24gYXMgQ29kZUFjdGlvbjtcbiAgICAgICAgaWYgKCFyZXNvbHZlZC5lZGl0ICYmIChyZXNvbHZlZCBhcyB7IGRhdGE/OiB1bmtub3duIH0pLmRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzb2x2ZWQgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgnY29kZUFjdGlvbi9yZXNvbHZlJywgcmVzb2x2ZWQpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChyZXNvbHZlZC5lZGl0KSBhcHBseVdvcmtzcGFjZUVkaXQocmVzb2x2ZWQuZWRpdCk7XG4gICAgICAgIGlmIChyZXNvbHZlZC5jb21tYW5kKSBhd2FpdCBydW5TZXJ2ZXJDb21tYW5kKHJlc29sdmVkLmNvbW1hbmQpO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY29uc29sZS53YXJuKCdbamF2YS1sc3BdIGNvZGUgYWN0aW9uIGZhaWxlZDonLCAoZSBhcyBFcnJvcik/Lm1lc3NhZ2UgPz8gZSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBpc1dvcmtzcGFjZUVkaXQodmFsdWU6IHVua25vd24pOiB2YWx1ZSBpcyBXb3Jrc3BhY2VFZGl0IHtcbiAgICByZXR1cm4gISF2YWx1ZSAmJiAoISEodmFsdWUgYXMgV29ya3NwYWNlRWRpdCkuY2hhbmdlcyB8fCAhISh2YWx1ZSBhcyBXb3Jrc3BhY2VFZGl0KS5kb2N1bWVudENoYW5nZXMpO1xufVxuXG5hc3luYyBmdW5jdGlvbiBydW5TZXJ2ZXJDb21tYW5kKGNtZDogQ29tbWFuZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghX2Nvbm4gfHwgIWNtZD8uY29tbWFuZCkgcmV0dXJuO1xuICAgIGlmIChHRU5FUkFURVtjbWQuY29tbWFuZF0pIHtcbiAgICAgICAgYXdhaXQgcnVuR2VuZXJhdGUoY21kLmNvbW1hbmQsIGNtZC5hcmd1bWVudHMgPz8gW10pO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGNvbnN0IHJlc3VsdCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd3b3Jrc3BhY2UvZXhlY3V0ZUNvbW1hbmQnLCB7IGNvbW1hbmQ6IGNtZC5jb21tYW5kLCBhcmd1bWVudHM6IGNtZC5hcmd1bWVudHMgPz8gW10gfSk7XG4gICAgaWYgKGlzV29ya3NwYWNlRWRpdChyZXN1bHQpKSBhcHBseVdvcmtzcGFjZUVkaXQocmVzdWx0KTtcbn1cblxuaW50ZXJmYWNlIEdlbmVyYXRlU3BlYyB7XG4gICAgbGFiZWw6IHN0cmluZztcbiAgICBzdGF0dXM6IHN0cmluZztcbiAgICBnZW5lcmF0ZTogc3RyaW5nO1xuICAgIG1lbWJlcnM6IChzdGF0dXM6IGFueSkgPT4gQXJyYXk8eyBsYWJlbDogc3RyaW5nOyByZWY6IGFueSB9PjtcbiAgICBidWlsZEFyZ3M6IChwcm9tcHRBcmdzOiBhbnlbXSwgc3RhdHVzOiBhbnksIHNlbGVjdGVkOiBhbnlbXSkgPT4gYW55W107XG59XG5cbi8qKiBNZW1iZXItbmFtZWQgZmllbGRzIFx1MjE5MiBwaWNrZXIgbGFiZWxzLiAqL1xuZnVuY3Rpb24gZmllbGRMYWJlbChmOiBhbnkpOiBzdHJpbmcge1xuICAgIGNvbnN0IG5hbWUgPSBmPy5uYW1lID8/IGY/LmZpZWxkTmFtZSA/PyAnJztcbiAgICBjb25zdCB0eXBlID0gZj8udHlwZSA/PyBmPy50eXBlTmFtZTtcbiAgICByZXR1cm4gdHlwZSA/IGAke25hbWV9OiAke3R5cGV9YCA6IGAke25hbWV9YDtcbn1cblxuLyoqXG4gKiBUaGUgSkRULkxTIHNvdXJjZS1nZW5lcmF0aW9uIGNvbW1hbmRzIChjb25zdHJ1Y3RvcnMsIGdldHRlcnMvc2V0dGVycywgdG9TdHJpbmcsIGhhc2hDb2RlL2VxdWFscykuXG4gKiBFYWNoIG1hcHMgdGhlIGNsaWVudCBcIipQcm9tcHRcIiBjb21tYW5kIHRvIHRoZSBzZXJ2ZXIgc3RhdHVzICsgZ2VuZXJhdGUgZGVsZWdhdGUgY29tbWFuZHM7IHRoZSBzdGF0dXNcbiAqIGNhbGwgeWllbGRzIHRoZSBjYW5kaWRhdGUgZmllbGRzIHNob3duIGluIHRoZSBtZW1iZXIgcGlja2VyLCB0aGUgZ2VuZXJhdGUgY2FsbCByZXR1cm5zIHRoZSBlZGl0LlxuICovXG5jb25zdCBHRU5FUkFURTogUmVjb3JkPHN0cmluZywgR2VuZXJhdGVTcGVjPiA9IHtcbiAgICAnamF2YS5hY3Rpb24uZ2VuZXJhdGVDb25zdHJ1Y3RvcnNQcm9tcHQnOiB7XG4gICAgICAgIGxhYmVsOiAnU2VsZWN0IGZpZWxkcyBhbmQgY29uc3RydWN0b3JzJyxcbiAgICAgICAgc3RhdHVzOiAnamF2YS5hY3Rpb24uY2hlY2tDb25zdHJ1Y3RvcnNTdGF0dXMnLFxuICAgICAgICBnZW5lcmF0ZTogJ2phdmEuYWN0aW9uLmdlbmVyYXRlQ29uc3RydWN0b3JzJyxcbiAgICAgICAgbWVtYmVyczogKHMpID0+IChzPy5maWVsZHMgPz8gW10pLm1hcCgoZjogYW55KSA9PiAoeyBsYWJlbDogZmllbGRMYWJlbChmKSwgcmVmOiBmIH0pKSxcbiAgICAgICAgYnVpbGRBcmdzOiAoYXJncywgcywgc2VsKSA9PiBbYXJnc1swXSwgeyBjb25zdHJ1Y3RvcnM6IHM/LmNvbnN0cnVjdG9ycyA/PyBbXSwgZmllbGRzOiBzZWwubWFwKG0gPT4gbS5yZWYpIH1dLFxuICAgIH0sXG4gICAgJ2phdmEuYWN0aW9uLmdlbmVyYXRlVG9TdHJpbmdQcm9tcHQnOiB7XG4gICAgICAgIGxhYmVsOiAnU2VsZWN0IGZpZWxkcyB0byBpbmNsdWRlIGluIHRvU3RyaW5nKCknLFxuICAgICAgICBzdGF0dXM6ICdqYXZhLmFjdGlvbi5jaGVja1RvU3RyaW5nU3RhdHVzJyxcbiAgICAgICAgZ2VuZXJhdGU6ICdqYXZhLmFjdGlvbi5nZW5lcmF0ZVRvU3RyaW5nJyxcbiAgICAgICAgbWVtYmVyczogKHMpID0+IChzPy5maWVsZHMgPz8gW10pLm1hcCgoZjogYW55KSA9PiAoeyBsYWJlbDogZmllbGRMYWJlbChmKSwgcmVmOiBmIH0pKSxcbiAgICAgICAgYnVpbGRBcmdzOiAoYXJncywgX3MsIHNlbCkgPT4gW2FyZ3NbMF0sIHNlbC5tYXAobSA9PiBtLnJlZildLFxuICAgIH0sXG4gICAgJ2phdmEuYWN0aW9uLmhhc2hDb2RlRXF1YWxzUHJvbXB0Jzoge1xuICAgICAgICBsYWJlbDogJ1NlbGVjdCBmaWVsZHMgZm9yIGhhc2hDb2RlKCkgYW5kIGVxdWFscygpJyxcbiAgICAgICAgc3RhdHVzOiAnamF2YS5hY3Rpb24uY2hlY2tIYXNoQ29kZUVxdWFsc1N0YXR1cycsXG4gICAgICAgIGdlbmVyYXRlOiAnamF2YS5hY3Rpb24uZ2VuZXJhdGVIYXNoQ29kZUVxdWFscycsXG4gICAgICAgIG1lbWJlcnM6IChzKSA9PiAocz8uZmllbGRzID8/IFtdKS5tYXAoKGY6IGFueSkgPT4gKHsgbGFiZWw6IGZpZWxkTGFiZWwoZiksIHJlZjogZiB9KSksXG4gICAgICAgIGJ1aWxkQXJnczogKGFyZ3MsIF9zLCBzZWwpID0+IFthcmdzWzBdLCBzZWwubWFwKG0gPT4gbS5yZWYpLCBmYWxzZV0sXG4gICAgfSxcbiAgICAnamF2YS5hY3Rpb24uZ2VuZXJhdGVBY2Nlc3NvcnNQcm9tcHQnOiB7XG4gICAgICAgIGxhYmVsOiAnU2VsZWN0IGZpZWxkcyB0byBnZW5lcmF0ZSBnZXR0ZXJzIGFuZCBzZXR0ZXJzJyxcbiAgICAgICAgc3RhdHVzOiAnamF2YS5hY3Rpb24uY2hlY2tBY2Nlc3NvcnNTdGF0dXMnLFxuICAgICAgICBnZW5lcmF0ZTogJ2phdmEuYWN0aW9uLmdlbmVyYXRlQWNjZXNzb3JzJyxcbiAgICAgICAgbWVtYmVyczogKHMpID0+IChzPy5hY2Nlc3NvcnMgPz8gcyA/PyBbXSkubWFwKChhOiBhbnkpID0+ICh7IGxhYmVsOiBmaWVsZExhYmVsKGEpLCByZWY6IGEgfSkpLFxuICAgICAgICBidWlsZEFyZ3M6IChhcmdzLCBfcywgc2VsKSA9PiBbYXJnc1swXSwgc2VsLm1hcChtID0+IG0ucmVmKV0sXG4gICAgfSxcbiAgICAnamF2YS5hY3Rpb24ub3ZlcnJpZGVNZXRob2RzUHJvbXB0Jzoge1xuICAgICAgICBsYWJlbDogJ1NlbGVjdCBtZXRob2RzIHRvIG92ZXJyaWRlIG9yIGltcGxlbWVudCcsXG4gICAgICAgIHN0YXR1czogJ2phdmEuYWN0aW9uLmxpc3RPdmVycmlkYWJsZU1ldGhvZHMnLFxuICAgICAgICBnZW5lcmF0ZTogJ2phdmEuYWN0aW9uLmFkZE92ZXJyaWRhYmxlTWV0aG9kcycsXG4gICAgICAgIG1lbWJlcnM6IChzKSA9PiAocz8ubWV0aG9kcyA/PyBbXSkubWFwKChtOiBhbnkpID0+ICh7XG4gICAgICAgICAgICBsYWJlbDogYCR7bS5uYW1lfSgkeyhtLnBhcmFtZXRlcnMgPz8gW10pLmpvaW4oJywgJyl9KSR7bS5kZWNsYXJpbmdDbGFzcyA/ICcgOiAnICsgbS5kZWNsYXJpbmdDbGFzcyA6ICcnfWAsXG4gICAgICAgICAgICByZWY6IG0sXG4gICAgICAgIH0pKSxcbiAgICAgICAgYnVpbGRBcmdzOiAoYXJncywgc3RhdHVzLCBzZWwpID0+IFthcmdzWzBdLCB7IG92ZXJyaWRhYmxlTWV0aG9kczogc2VsLm1hcChtID0+IG0ucmVmKSwgdHlwZTogc3RhdHVzPy50eXBlIH1dLFxuICAgIH0sXG59O1xuXG5hc3luYyBmdW5jdGlvbiBydW5HZW5lcmF0ZShwcm9tcHRJZDogc3RyaW5nLCBhcmdzOiBhbnlbXSk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghX2Nvbm4pIHJldHVybjtcbiAgICBjb25zdCBzcGVjID0gR0VORVJBVEVbcHJvbXB0SWRdO1xuICAgIGNvbnN0IHN0YXR1cyA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd3b3Jrc3BhY2UvZXhlY3V0ZUNvbW1hbmQnLCB7IGNvbW1hbmQ6IHNwZWMuc3RhdHVzLCBhcmd1bWVudHM6IGFyZ3MgfSk7XG4gICAgaWYgKCFzdGF0dXMpIHJldHVybjtcbiAgICBjb25zdCBtZW1iZXJzID0gc3BlYy5tZW1iZXJzKHN0YXR1cyk7XG4gICAgbGV0IHNlbGVjdGVkID0gbWVtYmVycztcbiAgICBjb25zdCBwaWNrZXIgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLmphdmFMc3BNZW1iZXJQaWNrZXI7XG4gICAgaWYgKG1lbWJlcnMubGVuZ3RoICYmIHR5cGVvZiBwaWNrZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgY29uc3QgY2hvc2VuOiBzdHJpbmdbXSB8IG51bGwgPSBhd2FpdCBwaWNrZXIoc3BlYy5sYWJlbCwgbWVtYmVycy5tYXAobSA9PiBtLmxhYmVsKSk7XG4gICAgICAgIGlmIChjaG9zZW4gPT09IG51bGwpIHJldHVybjsgLy8gdXNlciBjYW5jZWxsZWQgdGhlIGRpYWxvZ1xuICAgICAgICBzZWxlY3RlZCA9IG1lbWJlcnMuZmlsdGVyKG0gPT4gY2hvc2VuLmluY2x1ZGVzKG0ubGFiZWwpKTtcbiAgICB9XG4gICAgY29uc3QgZWRpdCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd3b3Jrc3BhY2UvZXhlY3V0ZUNvbW1hbmQnLCB7XG4gICAgICAgIGNvbW1hbmQ6IHNwZWMuZ2VuZXJhdGUsXG4gICAgICAgIGFyZ3VtZW50czogc3BlYy5idWlsZEFyZ3MoYXJncywgc3RhdHVzLCBzZWxlY3RlZCksXG4gICAgfSk7XG4gICAgaWYgKGlzV29ya3NwYWNlRWRpdChlZGl0KSkgYXBwbHlXb3Jrc3BhY2VFZGl0KGVkaXQpO1xufVxuXG4vKiogR3JvdXBzIGEgd29ya3NwYWNlIGVkaXQncyB0ZXh0IGVkaXRzIGJ5IGRvY3VtZW50IGFuZCBhcHBsaWVzIHRoZW0gaW4gcGxhY2UgdG8gb3BlbiBNb25hY28gbW9kZWxzLiAqL1xuZnVuY3Rpb24gYXBwbHlXb3Jrc3BhY2VFZGl0KGVkaXQ6IFdvcmtzcGFjZUVkaXQgfCBudWxsIHwgdW5kZWZpbmVkKTogdm9pZCB7XG4gICAgaWYgKCFlZGl0KSByZXR1cm47XG4gICAgY29uc3QgYnlVcmk6IFJlY29yZDxzdHJpbmcsIFRleHRFZGl0W10+ID0ge307XG4gICAgaWYgKGVkaXQuY2hhbmdlcykge1xuICAgICAgICBmb3IgKGNvbnN0IHVyaSBpbiBlZGl0LmNoYW5nZXMpIGJ5VXJpW3VyaV0gPSAoYnlVcmlbdXJpXSA/PyBbXSkuY29uY2F0KGVkaXQuY2hhbmdlc1t1cmldKTtcbiAgICB9XG4gICAgaWYgKGVkaXQuZG9jdW1lbnRDaGFuZ2VzKSB7XG4gICAgICAgIGZvciAoY29uc3QgZGMgb2YgZWRpdC5kb2N1bWVudENoYW5nZXMgYXMgYW55W10pIHtcbiAgICAgICAgICAgIGlmIChkYz8udGV4dERvY3VtZW50Py51cmkgJiYgQXJyYXkuaXNBcnJheShkYy5lZGl0cykpIHtcbiAgICAgICAgICAgICAgICBieVVyaVtkYy50ZXh0RG9jdW1lbnQudXJpXSA9IChieVVyaVtkYy50ZXh0RG9jdW1lbnQudXJpXSA/PyBbXSkuY29uY2F0KGRjLmVkaXRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBmb3IgKGNvbnN0IHVyaSBpbiBieVVyaSkge1xuICAgICAgICBjb25zdCBtb2RlbCA9IG1vbmFjby5lZGl0b3IuZ2V0TW9kZWxzKCkuZmluZChtID0+IG0udXJpLnRvU3RyaW5nKCkgPT09IHVyaSk7XG4gICAgICAgIGlmICghbW9kZWwpIGNvbnRpbnVlO1xuICAgICAgICBjb25zdCBvcHMgPSBieVVyaVt1cmldLm1hcChlID0+ICh7IHJhbmdlOiBsc3BSYW5nZVRvTW9uYWNvKGUucmFuZ2UpLCB0ZXh0OiBlLm5ld1RleHQsIGZvcmNlTW92ZU1hcmtlcnM6IHRydWUgfSkpO1xuICAgICAgICBtb2RlbC5wdXNoRWRpdE9wZXJhdGlvbnMoW10sIG9wcywgKCkgPT4gbnVsbCk7XG4gICAgfVxufVxuXG4vKiogQ29udmVydHMgYW4gTFNQIHdvcmtzcGFjZSBlZGl0IGludG8gdGhlIE1vbmFjbyBzaGFwZSByZXR1cm5lZCBieSB0aGUgcmVuYW1lIHByb3ZpZGVyLiAqL1xuZnVuY3Rpb24gd29ya3NwYWNlRWRpdFRvTW9uYWNvKGVkaXQ6IFdvcmtzcGFjZUVkaXQgfCBudWxsKTogbW9uYWNvLmxhbmd1YWdlcy5Xb3Jrc3BhY2VFZGl0IHtcbiAgICBjb25zdCBlZGl0czogYW55W10gPSBbXTtcbiAgICBjb25zdCBwdXNoID0gKHVyaTogc3RyaW5nLCBsaXN0OiBUZXh0RWRpdFtdKSA9PiB7XG4gICAgICAgIGZvciAoY29uc3QgZSBvZiBsaXN0KSB7XG4gICAgICAgICAgICBlZGl0cy5wdXNoKHsgcmVzb3VyY2U6IG1vbmFjby5VcmkucGFyc2UodXJpKSwgdGV4dEVkaXQ6IHsgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28oZS5yYW5nZSksIHRleHQ6IGUubmV3VGV4dCB9LCB2ZXJzaW9uSWQ6IHVuZGVmaW5lZCB9KTtcbiAgICAgICAgfVxuICAgIH07XG4gICAgaWYgKGVkaXQ/LmNoYW5nZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCB1cmkgaW4gZWRpdC5jaGFuZ2VzKSBwdXNoKHVyaSwgZWRpdC5jaGFuZ2VzW3VyaV0pO1xuICAgIH1cbiAgICBpZiAoZWRpdD8uZG9jdW1lbnRDaGFuZ2VzKSB7XG4gICAgICAgIGZvciAoY29uc3QgZGMgb2YgZWRpdC5kb2N1bWVudENoYW5nZXMgYXMgYW55W10pIHtcbiAgICAgICAgICAgIGlmIChkYz8udGV4dERvY3VtZW50Py51cmkgJiYgQXJyYXkuaXNBcnJheShkYy5lZGl0cykpIHB1c2goZGMudGV4dERvY3VtZW50LnVyaSwgZGMuZWRpdHMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB7IGVkaXRzIH07XG59XG5cbi8qKiBNYXBzIGEgdmlydHVhbCBlZGl0b3IgVVJJIGJhY2sgdG8gdGhlIElERSB3b3Jrc3BhY2UgcGF0aCAoe0Bjb2RlIC93cy9wcm9qLy4uLn0pLiAqL1xuZnVuY3Rpb24gdXJpVG9Xb3Jrc3BhY2VQYXRoKHVyaTogc3RyaW5nKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgaWYgKCF1cmkuc3RhcnRzV2l0aChWSVJUVUFMX0ZJTEVfUFJFRklYKSkgcmV0dXJuIG51bGw7XG4gICAgcmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudCh1cmkuc3Vic3RyaW5nKFZJUlRVQUxfRklMRV9QUkVGSVgubGVuZ3RoKSk7XG59XG5cbi8qKiBSZWFkcyBhIHdvcmtzcGFjZSBmaWxlJ3MgY3VycmVudCB0ZXh0IG92ZXIgdGhlIElERSBSRVNUIEFQSS4gKi9cbmFzeW5jIGZ1bmN0aW9uIGZldGNoV29ya3NwYWNlRmlsZVRleHQoaWRlUGF0aDogc3RyaW5nKTogUHJvbWlzZTxzdHJpbmc+IHtcbiAgICBjb25zdCByZXNwb25zZSA9IGF3YWl0IGZldGNoKCcvc2VydmljZXMvaWRlL3dvcmtzcGFjZXMnICsgaWRlUGF0aCwgeyBoZWFkZXJzOiB7ICdYLVJlcXVlc3RlZC1XaXRoJzogJ0ZldGNoJyB9IH0pO1xuICAgIGlmICghcmVzcG9uc2Uub2spIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDb3VsZCBub3QgcmVhZCAke2lkZVBhdGh9IChIVFRQICR7cmVzcG9uc2Uuc3RhdHVzfSlgKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3BvbnNlLnRleHQoKTtcbn1cblxuLyoqIEFwcGxpZXMgTFNQIHRleHQgZWRpdHMgdG8gYSBzdHJpbmcuIE9mZnNldHMgYXJlIHJlc29sdmVkIGFnYWluc3QgdGhlIG9yaWdpbmFsIHRleHQgYW5kIGVkaXRzIGFyZVxuICogIGFwcGxpZWQgZnJvbSB0aGUgZW5kIGJhY2t3YXJkcywgc28gZWFybGllciBvZmZzZXRzIHN0YXkgdmFsaWQuICovXG5mdW5jdGlvbiBhcHBseUVkaXRzVG9UZXh0KHRleHQ6IHN0cmluZywgZWRpdHM6IFRleHRFZGl0W10pOiBzdHJpbmcge1xuICAgIGNvbnN0IGxpbmVTdGFydHMgPSBbMF07XG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmICh0ZXh0LmNoYXJDb2RlQXQoaSkgPT09IDEwIC8qIFxcbiAqLykgbGluZVN0YXJ0cy5wdXNoKGkgKyAxKTtcbiAgICB9XG4gICAgY29uc3Qgb2Zmc2V0ID0gKHA6IHsgbGluZTogbnVtYmVyOyBjaGFyYWN0ZXI6IG51bWJlciB9KSA9PiAobGluZVN0YXJ0c1twLmxpbmVdID8/IHRleHQubGVuZ3RoKSArIHAuY2hhcmFjdGVyO1xuICAgIGNvbnN0IG9yZGVyZWQgPSBlZGl0cy5zbGljZSgpXG4gICAgICAgICAgICAgICAgICAgICAgICAgLnNvcnQoKGEsIGIpID0+IG9mZnNldChiLnJhbmdlLnN0YXJ0KSAtIG9mZnNldChhLnJhbmdlLnN0YXJ0KSk7XG4gICAgbGV0IHJlc3VsdCA9IHRleHQ7XG4gICAgZm9yIChjb25zdCBlIG9mIG9yZGVyZWQpIHtcbiAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnNsaWNlKDAsIG9mZnNldChlLnJhbmdlLnN0YXJ0KSkgKyBlLm5ld1RleHQgKyByZXN1bHQuc2xpY2Uob2Zmc2V0KGUucmFuZ2UuZW5kKSk7XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59XG5cbi8qKlxuICogQXBwbGllcyBhIEpEVC5MUyByZW5hbWUge0BsaW5rIFdvcmtzcGFjZUVkaXR9IGFjcm9zcyB0aGUgd2hvbGUgd29ya3NwYWNlOiB0ZXh0IGVkaXRzIGluIGV2ZXJ5XG4gKiBhZmZlY3RlZCBmaWxlIHBsdXMgYW55IHtAY29kZSBSZW5hbWVGaWxlfSBvcGVyYXRpb24gKGEgcHVibGljLXR5cGUgcmVuYW1lIHJlbmFtZXMgaXRzIG93blxuICoge0Bjb2RlIC5qYXZhfSBmaWxlKS4gVGhlIGN1cnJlbnQgZmlsZSdzIGVkaXRzIGdvIHRocm91Z2ggdGhlIGxpdmUgTW9uYWNvIG1vZGVsOyB0aGUgcmVzdCBhcmUgcmVhZCxcbiAqIGVkaXRlZCBhbmQgd3JpdHRlbiBiYWNrIG92ZXIgUkVTVC4gUGVyc2lzdGVuY2UgKENTUkYtZ3VhcmRlZCB3cml0ZXMsIHRoZSB0YWIgc3dpdGNoIHdoZW4gdGhlIGN1cnJlbnRcbiAqIGZpbGUgaXMgcmVuYW1lZCwgYW5kIHJlbG9hZGluZyBvdGhlciBvcGVuIGVkaXRvcnMpIGlzIGRlbGVnYXRlZCB0byB0aGUgSURFIHZpYSBqYXZhTHNwUGVyc2lzdFJlbmFtZS5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gYXBwbHlSZW5hbWVBY3Jvc3NXb3Jrc3BhY2UobW9kZWw6IG1vbmFjby5lZGl0b3IuSVRleHRNb2RlbCwgZWRpdDogV29ya3NwYWNlRWRpdCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGNvbnN0IGN1cnJlbnRVcmkgPSBtb2RlbC51cmkudG9TdHJpbmcoKTtcbiAgICBjb25zdCB0ZXh0QnlVcmk6IFJlY29yZDxzdHJpbmcsIFRleHRFZGl0W10+ID0ge307XG4gICAgY29uc3QgcmVuYW1lQnlVcmk6IFJlY29yZDxzdHJpbmcsIHN0cmluZz4gPSB7fTtcblxuICAgIGlmIChlZGl0LmNoYW5nZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCB1cmkgaW4gZWRpdC5jaGFuZ2VzKSB0ZXh0QnlVcmlbdXJpXSA9ICh0ZXh0QnlVcmlbdXJpXSA/PyBbXSkuY29uY2F0KGVkaXQuY2hhbmdlc1t1cmldKTtcbiAgICB9XG4gICAgaWYgKGVkaXQuZG9jdW1lbnRDaGFuZ2VzKSB7XG4gICAgICAgIGZvciAoY29uc3QgZGMgb2YgZWRpdC5kb2N1bWVudENoYW5nZXMgYXMgYW55W10pIHtcbiAgICAgICAgICAgIGlmIChkYz8ua2luZCA9PT0gJ3JlbmFtZScgJiYgZGMub2xkVXJpICYmIGRjLm5ld1VyaSkge1xuICAgICAgICAgICAgICAgIHJlbmFtZUJ5VXJpW2RjLm9sZFVyaV0gPSBkYy5uZXdVcmk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRjPy50ZXh0RG9jdW1lbnQ/LnVyaSAmJiBBcnJheS5pc0FycmF5KGRjLmVkaXRzKSkge1xuICAgICAgICAgICAgICAgIHRleHRCeVVyaVtkYy50ZXh0RG9jdW1lbnQudXJpXSA9ICh0ZXh0QnlVcmlbZGMudGV4dERvY3VtZW50LnVyaV0gPz8gW10pLmNvbmNhdChkYy5lZGl0cyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBKRFQuTFMgbWF5IGtleSBhIGZpbGUncyB0ZXh0IGVkaXRzIGJ5IGl0cyBQT1NULXJlbmFtZSBVUkkgKGRvY3VtZW50Q2hhbmdlcyBhcmUgb3JkZXJlZCwgYW5kIHRoZVxuICAgIC8vIHJlbmFtZSBjYW4gcHJlY2VkZSB0aGUgZWRpdCkuIFJlLWF0dHJpYnV0ZSBldmVyeSBlZGl0IHRvIHRoZSBvbi1kaXNrIChvbGQpIFVSSSBzbyB0aGUgY29udGVudCBpc1xuICAgIC8vIGVkaXRlZCBjb3JyZWN0bHkgYmVmb3JlIHRoZSBmaWxlIGlzIHdyaXR0ZW4vcmVuYW1lZCBcdTIwMTQgb3RoZXJ3aXNlIHRoZSBuZXcgZmlsZSBrZWVwcyB0aGUgb2xkIHR5cGVcbiAgICAvLyBuYW1lIGFuZCB0cmlnZ2VycyBcIlRoZSBwdWJsaWMgdHlwZSBYIG11c3QgYmUgZGVmaW5lZCBpbiBpdHMgb3duIGZpbGVcIi5cbiAgICBjb25zdCBuZXdUb09sZDogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuICAgIGZvciAoY29uc3Qgb2xkVXJpIGluIHJlbmFtZUJ5VXJpKSBuZXdUb09sZFtyZW5hbWVCeVVyaVtvbGRVcmldXSA9IG9sZFVyaTtcbiAgICBjb25zdCBlZGl0c0J5T2xkOiBSZWNvcmQ8c3RyaW5nLCBUZXh0RWRpdFtdPiA9IHt9O1xuICAgIGZvciAoY29uc3QgdXJpIGluIHRleHRCeVVyaSkge1xuICAgICAgICBjb25zdCBvbkRpc2tVcmkgPSBuZXdUb09sZFt1cmldID8/IHVyaTtcbiAgICAgICAgZWRpdHNCeU9sZFtvbkRpc2tVcmldID0gKGVkaXRzQnlPbGRbb25EaXNrVXJpXSA/PyBbXSkuY29uY2F0KHRleHRCeVVyaVt1cmldKTtcbiAgICB9XG5cbiAgICBjb25zdCBwYXlsb2FkOiB7XG4gICAgICAgIGN1cnJlbnRQYXRoOiBzdHJpbmcgfCBudWxsO1xuICAgICAgICBjdXJyZW50Q29udGVudDogc3RyaW5nIHwgbnVsbDtcbiAgICAgICAgY3VycmVudE5ld1BhdGg6IHN0cmluZyB8IG51bGw7XG4gICAgICAgIHdyaXRlczogQXJyYXk8eyBwYXRoOiBzdHJpbmcgfCBudWxsOyBjb250ZW50OiBzdHJpbmcgfT47XG4gICAgICAgIHJlbmFtZXM6IEFycmF5PHsgb2xkUGF0aDogc3RyaW5nIHwgbnVsbDsgbmV3UGF0aDogc3RyaW5nIHwgbnVsbDsgY29udGVudDogc3RyaW5nIH0+O1xuICAgIH0gPSB7IGN1cnJlbnRQYXRoOiB1cmlUb1dvcmtzcGFjZVBhdGgoY3VycmVudFVyaSksIGN1cnJlbnRDb250ZW50OiBudWxsLCBjdXJyZW50TmV3UGF0aDogbnVsbCwgd3JpdGVzOiBbXSwgcmVuYW1lczogW10gfTtcblxuICAgIGNvbnN0IHdhdGNoZWRDaGFuZ2VzOiBBcnJheTx7IHVyaTogc3RyaW5nOyB0eXBlOiBudW1iZXIgfT4gPSBbXTtcbiAgICBjb25zdCBvbGRVcmlzID0gbmV3IFNldDxzdHJpbmc+KFsuLi5PYmplY3Qua2V5cyhlZGl0c0J5T2xkKSwgLi4uT2JqZWN0LmtleXMocmVuYW1lQnlVcmkpXSk7XG4gICAgZm9yIChjb25zdCBvbGRVcmkgb2Ygb2xkVXJpcykge1xuICAgICAgICBjb25zdCBlZGl0cyA9IGVkaXRzQnlPbGRbb2xkVXJpXSA/PyBbXTtcbiAgICAgICAgbGV0IGNvbnRlbnQ6IHN0cmluZztcbiAgICAgICAgaWYgKG9sZFVyaSA9PT0gY3VycmVudFVyaSkge1xuICAgICAgICAgICAgaWYgKGVkaXRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIG1vZGVsLnB1c2hFZGl0T3BlcmF0aW9ucyhbXSwgZWRpdHMubWFwKGUgPT4gKHsgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28oZS5yYW5nZSksIHRleHQ6IGUubmV3VGV4dCwgZm9yY2VNb3ZlTWFya2VyczogdHJ1ZSB9KSksICgpID0+IG51bGwpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29udGVudCA9IG1vZGVsLmdldFZhbHVlKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBzb3VyY2UgPSBhd2FpdCBmZXRjaFdvcmtzcGFjZUZpbGVUZXh0KHVyaVRvV29ya3NwYWNlUGF0aChvbGRVcmkpID8/IG9sZFVyaSk7XG4gICAgICAgICAgICBjb250ZW50ID0gZWRpdHMubGVuZ3RoID8gYXBwbHlFZGl0c1RvVGV4dChzb3VyY2UsIGVkaXRzKSA6IHNvdXJjZTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXdVcmkgPSByZW5hbWVCeVVyaVtvbGRVcmldO1xuICAgICAgICBpZiAob2xkVXJpID09PSBjdXJyZW50VXJpKSB7XG4gICAgICAgICAgICBwYXlsb2FkLmN1cnJlbnRDb250ZW50ID0gY29udGVudDtcbiAgICAgICAgICAgIHBheWxvYWQuY3VycmVudE5ld1BhdGggPSBuZXdVcmkgPyB1cmlUb1dvcmtzcGFjZVBhdGgobmV3VXJpKSA6IG51bGw7XG4gICAgICAgIH0gZWxzZSBpZiAobmV3VXJpKSB7XG4gICAgICAgICAgICBwYXlsb2FkLnJlbmFtZXMucHVzaCh7IG9sZFBhdGg6IHVyaVRvV29ya3NwYWNlUGF0aChvbGRVcmkpLCBuZXdQYXRoOiB1cmlUb1dvcmtzcGFjZVBhdGgobmV3VXJpKSwgY29udGVudCB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHBheWxvYWQud3JpdGVzLnB1c2goeyBwYXRoOiB1cmlUb1dvcmtzcGFjZVBhdGgob2xkVXJpKSwgY29udGVudCB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBGaWxlLWNoYW5nZSBldmVudHMgZm9yIEpEVC5MUyBzbyBpdCByZS1zeW5jcyB3aXRob3V0IGEgcGFnZSByZWZyZXNoLlxuICAgICAgICBpZiAobmV3VXJpKSB7XG4gICAgICAgICAgICB3YXRjaGVkQ2hhbmdlcy5wdXNoKHsgdXJpOiBvbGRVcmksIHR5cGU6IDMgLyogRGVsZXRlZCAqLyB9LCB7IHVyaTogbmV3VXJpLCB0eXBlOiAxIC8qIENyZWF0ZWQgKi8gfSk7XG4gICAgICAgICAgICBfb3BlbkZpbGVzLmRlbGV0ZShvbGRVcmkpO1xuICAgICAgICAgICAgX2Nvbm4/LnNlbmROb3RpZmljYXRpb24oJ3RleHREb2N1bWVudC9kaWRDbG9zZScsIHsgdGV4dERvY3VtZW50OiB7IHVyaTogb2xkVXJpIH0gfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB3YXRjaGVkQ2hhbmdlcy5wdXNoKHsgdXJpOiBvbGRVcmksIHR5cGU6IDIgLyogQ2hhbmdlZCAqLyB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGF3YWl0IChnbG9iYWxUaGlzIGFzIGFueSkuamF2YUxzcFBlcnNpc3RSZW5hbWUocGF5bG9hZCk7XG5cbiAgICAvLyBJbmZvcm0gSkRULkxTIG9mIHRoZSBvbi1kaXNrIGNoYW5nZXMgc28gdGhlIHJlbmFtZWQgdHlwZSdzIGRpYWdub3N0aWNzIGNsZWFyIGltbWVkaWF0ZWx5LlxuICAgIGlmIChfY29ubiAmJiB3YXRjaGVkQ2hhbmdlcy5sZW5ndGgpIHtcbiAgICAgICAgX2Nvbm4uc2VuZE5vdGlmaWNhdGlvbignd29ya3NwYWNlL2RpZENoYW5nZVdhdGNoZWRGaWxlcycsIHsgY2hhbmdlczogd2F0Y2hlZENoYW5nZXMgfSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBqZHRsc1NldHRpbmdzKCkge1xuICAgIHJldHVybiB7XG4gICAgICAgIGphdmE6IHtcbiAgICAgICAgICAgIGltcG9ydDoge1xuICAgICAgICAgICAgICAgIG1hdmVuOiAgICAgIHsgZW5hYmxlZDogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIGdyYWRsZTogICAgIHsgZW5hYmxlZDogZmFsc2UgfSxcbiAgICAgICAgICAgICAgICBleGNsdXNpb25zOiBbJyoqL25vZGVfbW9kdWxlcy8qKicsICcqKi8ubWV0YWRhdGEvKionLCAnKiovYXJjaGV0eXBlLXJlc291cmNlcy8qKiddLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIGF1dG9idWlsZDogeyBlbmFibGVkOiB0cnVlIH0sXG4gICAgICAgICAgICBjb21wbGV0aW9uOiB7XG4gICAgICAgICAgICAgICAgb3ZlcndyaXRlOiAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgZ3Vlc3NNZXRob2RBcmd1bWVudHM6IGZhbHNlLFxuICAgICAgICAgICAgICAgIC8vIENhcCByZXN1bHRzIHNvIGltcG9ydC90eXBlIGNvbXBsZXRpb24gb3ZlciB0aGUgbGFyZ2UgcGxhdGZvcm0gY2xhc3NwYXRoIHN0YXlzIHNuYXBweS5cbiAgICAgICAgICAgICAgICBtYXhSZXN1bHRzOiAgICAgICAgICAgNTAsXG4gICAgICAgICAgICAgICAgZmlsdGVyZWRUeXBlczogW1xuICAgICAgICAgICAgICAgICAgICAnY29tLnN1bi4qJywgJ3N1bi4qJywgJ2pkay4qJyxcbiAgICAgICAgICAgICAgICAgICAgJ29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC4qJyxcbiAgICAgICAgICAgICAgICAgICAgJ29yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuKicsXG4gICAgICAgICAgICAgICAgICAgICdvcmcuZWNsaXBzZS5vc2dpLmludGVybmFsLionLFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgaW1wb3J0T3JkZXI6IFsnamF2YScsICdqYXZheCcsICdvcmcnLCAnY29tJywgJyddLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNpZ25hdHVyZUhlbHA6ICB7IGVuYWJsZWQ6IHRydWUgfSxcbiAgICAgICAgICAgIGZvcm1hdDogICAgICAgICB7IGVuYWJsZWQ6IHRydWUgfSxcbiAgICAgICAgICAgIHNhdmVBY3Rpb25zOiAgICB7IG9yZ2FuaXplSW1wb3J0czogZmFsc2UgfSxcbiAgICAgICAgICAgIGlubGF5SGludHM6ICAgICB7IHBhcmFtZXRlck5hbWVzOiB7IGVuYWJsZWQ6ICdhbGwnIH0gfSxcbiAgICAgICAgICAgIC8vIE9mZiBieSBkZWZhdWx0OiB0aGUgcmVmZXJlbmNlL2ltcGxlbWVudGF0aW9uIHNlYXJjaCBiZWhpbmQgdGhlc2UgQ29kZUxlbnNlcyBydW5zIGZvciBldmVyeVxuICAgICAgICAgICAgLy8gZGVjbGFyYXRpb24gb24gb3BlbiBhbmQgb24gZXZlcnkgZWRpdCBhbmQgZG9taW5hdGVzIEpEVC5MUyBsb2FkIG9uIGEgbGFyZ2UgY2xhc3NwYXRoLlxuICAgICAgICAgICAgcmVmZXJlbmNlc0NvZGVMZW5zOiAgICAgeyBlbmFibGVkOiBmYWxzZSB9LFxuICAgICAgICAgICAgaW1wbGVtZW50YXRpb25zQ29kZUxlbnM6IHsgZW5hYmxlZDogZmFsc2UgfSxcbiAgICAgICAgfSxcbiAgICB9O1xufVxuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjQgVHlwZUZveCBhbmQgb3RoZXJzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTElDRU5TRSBpbiB0aGUgcGFja2FnZSByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbmltcG9ydCB7IERpc3Bvc2FibGUgfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG5cbmV4cG9ydCBjbGFzcyBEaXNwb3NhYmxlQ29sbGVjdGlvbiBpbXBsZW1lbnRzIERpc3Bvc2FibGUge1xuICAgIHByb3RlY3RlZCByZWFkb25seSBkaXNwb3NhYmxlczogRGlzcG9zYWJsZVtdID0gW107XG5cbiAgICBkaXNwb3NlKCk6IHZvaWQge1xuICAgICAgICB3aGlsZSAodGhpcy5kaXNwb3NhYmxlcy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcG9zYWJsZXMucG9wKCkhLmRpc3Bvc2UoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1c2goZGlzcG9zYWJsZTogRGlzcG9zYWJsZSk6IERpc3Bvc2FibGUge1xuICAgICAgICBjb25zdCBkaXNwb3NhYmxlcyA9IHRoaXMuZGlzcG9zYWJsZXM7XG4gICAgICAgIGRpc3Bvc2FibGVzLnB1c2goZGlzcG9zYWJsZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkaXNwb3NlKCk6IHZvaWQge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gZGlzcG9zYWJsZXMuaW5kZXhPZihkaXNwb3NhYmxlKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3Bvc2FibGVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbn1cbiIsICIvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSAyMDI0IFR5cGVGb3ggYW5kIG90aGVycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExJQ0VOU0UgaW4gdGhlIHBhY2thZ2Ugcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5pbXBvcnQgeyBEaXNwb3NhYmxlIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuaW1wb3J0IHR5cGUgeyBJQ29ubmVjdGlvbiB9IGZyb20gJy4uL3NlcnZlci9jb25uZWN0aW9uLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBJV2ViU29ja2V0IGV4dGVuZHMgRGlzcG9zYWJsZSB7XG4gICAgc2VuZChjb250ZW50OiBzdHJpbmcpOiB2b2lkO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgb25NZXNzYWdlKGNiOiAoZGF0YTogYW55KSA9PiB2b2lkKTogdm9pZDtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIG9uRXJyb3IoY2I6IChyZWFzb246IGFueSkgPT4gdm9pZCk6IHZvaWQ7XG4gICAgb25DbG9zZShjYjogKGNvZGU6IG51bWJlciwgcmVhc29uOiBzdHJpbmcpID0+IHZvaWQpOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElXZWJTb2NrZXRDb25uZWN0aW9uIGV4dGVuZHMgSUNvbm5lY3Rpb24ge1xuICAgIHJlYWRvbmx5IHNvY2tldDogSVdlYlNvY2tldDtcbn1cbiIsICIvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSAyMDI0IFR5cGVGb3ggYW5kIG90aGVycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExJQ0VOU0UgaW4gdGhlIHBhY2thZ2Ugcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5pbXBvcnQgeyBEaXNwb3NhYmxlIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuLy8gVE9ETzogVXNlIGVudmlyb25tZW50LXNwZWNpZmljIGltcG9ydHMgKHZzY29kZS1qc29ucnBjL2Jyb3dzZXIgb3IgdnNjb2RlLWpzb25ycGMvbm9kZSlcbi8vIHdoZW4gdXBncmFkaW5nIHRvIHZzY29kZS1qc29ucnBjQDkueC54LW5leHQuWCB3aGljaCBzdXBwb3J0cyBwcm9wZXIgZXhwb3J0IG1hcHNcbmltcG9ydCB7IHR5cGUgRGF0YUNhbGxiYWNrLCBBYnN0cmFjdE1lc3NhZ2VSZWFkZXIsIE1lc3NhZ2VSZWFkZXIgfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG5pbXBvcnQgdHlwZSB7IElXZWJTb2NrZXQgfSBmcm9tICcuL3NvY2tldC5qcyc7XG5cbmV4cG9ydCBjbGFzcyBXZWJTb2NrZXRNZXNzYWdlUmVhZGVyIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlUmVhZGVyIGltcGxlbWVudHMgTWVzc2FnZVJlYWRlciB7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHNvY2tldDogSVdlYlNvY2tldDtcbiAgICBwcm90ZWN0ZWQgc3RhdGU6ICdpbml0aWFsJyB8ICdsaXN0ZW5pbmcnIHwgJ2Nsb3NlZCcgPSAnaW5pdGlhbCc7XG4gICAgcHJvdGVjdGVkIGNhbGxiYWNrOiBEYXRhQ2FsbGJhY2sgfCB1bmRlZmluZWQ7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZXZlbnRzOiBBcnJheTx7IG1lc3NhZ2U/OiBhbnksIGVycm9yPzogYW55IH0+ID0gW107XG5cbiAgICBjb25zdHJ1Y3Rvcihzb2NrZXQ6IElXZWJTb2NrZXQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7XG4gICAgICAgIHRoaXMuc29ja2V0Lm9uTWVzc2FnZShtZXNzYWdlID0+XG4gICAgICAgICAgICB0aGlzLnJlYWRNZXNzYWdlKG1lc3NhZ2UpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc29ja2V0Lm9uRXJyb3IoZXJyb3IgPT5cbiAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLnNvY2tldC5vbkNsb3NlKChjb2RlLCByZWFzb24pID0+IHtcbiAgICAgICAgICAgIGlmIChjb2RlICE9PSAxMDAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3I6IEVycm9yID0ge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnJyArIGNvZGUsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBFcnJvciBkdXJpbmcgc29ja2V0IHJlY29ubmVjdDogY29kZSA9ICR7Y29kZX0sIHJlYXNvbiA9ICR7cmVhc29ufWBcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZmlyZUNsb3NlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGxpc3RlbihjYWxsYmFjazogRGF0YUNhbGxiYWNrKTogRGlzcG9zYWJsZSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09PSAnaW5pdGlhbCcpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSAnbGlzdGVuaW5nJztcbiAgICAgICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgICAgICAgIHdoaWxlICh0aGlzLmV2ZW50cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBldmVudCA9IHRoaXMuZXZlbnRzLnBvcCgpITtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQubWVzc2FnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVhZE1lc3NhZ2UoZXZlbnQubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5lcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGV2ZW50LmVycm9yKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmVDbG9zZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhbGxiYWNrID09PSBjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gJ2luaXRpYWwnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbGxiYWNrID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBkaXNwb3NlKCkge1xuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSAnaW5pdGlhbCc7XG4gICAgICAgIHRoaXMuY2FsbGJhY2sgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuZXZlbnRzLnNwbGljZSgwLCB0aGlzLmV2ZW50cy5sZW5ndGgpO1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgcHJvdGVjdGVkIHJlYWRNZXNzYWdlKG1lc3NhZ2U6IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gJ2luaXRpYWwnKSB7XG4gICAgICAgICAgICB0aGlzLmV2ZW50cy5zcGxpY2UoMCwgMCwgeyBtZXNzYWdlIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUgPT09ICdsaXN0ZW5pbmcnKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2FsbGJhY2shKGRhdGEpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3I6IEVycm9yID0ge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnJyArIDQwMCxcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYEVycm9yIGR1cmluZyBtZXNzYWdlIHBhcnNpbmcsIHJlYXNvbiA9ICR7dHlwZW9mIGVyciA9PT0gJ29iamVjdCcgPyAoZXJyIGFzIGFueSkubWVzc2FnZSA6ICd1bmtub3duJ31gXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmVFcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBmaXJlRXJyb3IoZXJyb3I6IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gJ2luaXRpYWwnKSB7XG4gICAgICAgICAgICB0aGlzLmV2ZW50cy5zcGxpY2UoMCwgMCwgeyBlcnJvciB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlID09PSAnbGlzdGVuaW5nJykge1xuICAgICAgICAgICAgc3VwZXIuZmlyZUVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBmaXJlQ2xvc2UoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09PSAnaW5pdGlhbCcpIHtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRzLnNwbGljZSgwLCAwLCB7fSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZSA9PT0gJ2xpc3RlbmluZycpIHtcbiAgICAgICAgICAgIHN1cGVyLmZpcmVDbG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhdGUgPSAnY2xvc2VkJztcbiAgICB9XG59XG4iLCAiLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgMjAyNCBUeXBlRm94IGFuZCBvdGhlcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMSUNFTlNFIGluIHRoZSBwYWNrYWdlIHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuaW1wb3J0IHsgTWVzc2FnZSB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcbmltcG9ydCB7IEFic3RyYWN0TWVzc2FnZVdyaXRlciwgTWVzc2FnZVdyaXRlciB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcbmltcG9ydCB0eXBlIHsgSVdlYlNvY2tldCB9IGZyb20gJy4vc29ja2V0LmpzJztcblxuZXhwb3J0IGNsYXNzIFdlYlNvY2tldE1lc3NhZ2VXcml0ZXIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VXcml0ZXIgaW1wbGVtZW50cyBNZXNzYWdlV3JpdGVyIHtcbiAgICBwcm90ZWN0ZWQgZXJyb3JDb3VudCA9IDA7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHNvY2tldDogSVdlYlNvY2tldDtcblxuICAgIGNvbnN0cnVjdG9yKHNvY2tldDogSVdlYlNvY2tldCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnNvY2tldCA9IHNvY2tldDtcbiAgICB9XG5cbiAgICBlbmQoKTogdm9pZCB7XG4gICAgfVxuXG4gICAgYXN5bmMgd3JpdGUobXNnOiBNZXNzYWdlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobXNnKTtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0LnNlbmQoY29udGVudCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMuZXJyb3JDb3VudCsrO1xuICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZSwgbXNnLCB0aGlzLmVycm9yQ291bnQpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjQgVHlwZUZveCBhbmQgb3RoZXJzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTElDRU5TRSBpbiB0aGUgcGFja2FnZSByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbmltcG9ydCB0eXBlIHsgTWVzc2FnZUNvbm5lY3Rpb24sIExvZ2dlciB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcbmltcG9ydCB7IGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuaW1wb3J0IHR5cGUgeyBJV2ViU29ja2V0IH0gZnJvbSAnLi9zb2NrZXQuanMnO1xuaW1wb3J0IHsgV2ViU29ja2V0TWVzc2FnZVJlYWRlciB9IGZyb20gJy4vcmVhZGVyLmpzJztcbmltcG9ydCB7IFdlYlNvY2tldE1lc3NhZ2VXcml0ZXIgfSBmcm9tICcuL3dyaXRlci5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVXZWJTb2NrZXRDb25uZWN0aW9uKHNvY2tldDogSVdlYlNvY2tldCwgbG9nZ2VyOiBMb2dnZXIpOiBNZXNzYWdlQ29ubmVjdGlvbiB7XG4gICAgY29uc3QgbWVzc2FnZVJlYWRlciA9IG5ldyBXZWJTb2NrZXRNZXNzYWdlUmVhZGVyKHNvY2tldCk7XG4gICAgY29uc3QgbWVzc2FnZVdyaXRlciA9IG5ldyBXZWJTb2NrZXRNZXNzYWdlV3JpdGVyKHNvY2tldCk7XG4gICAgY29uc3QgY29ubmVjdGlvbiA9IGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uKG1lc3NhZ2VSZWFkZXIsIG1lc3NhZ2VXcml0ZXIsIGxvZ2dlcik7XG4gICAgY29ubmVjdGlvbi5vbkNsb3NlKCgpID0+IGNvbm5lY3Rpb24uZGlzcG9zZSgpKTtcbiAgICByZXR1cm4gY29ubmVjdGlvbjtcbn1cbiIsICIvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSAyMDI0IFR5cGVGb3ggYW5kIG90aGVycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExJQ0VOU0UgaW4gdGhlIHBhY2thZ2Ugcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5pbXBvcnQgdHlwZSB7IE1lc3NhZ2VDb25uZWN0aW9uLCBMb2dnZXIgfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG5pbXBvcnQgeyBjcmVhdGVXZWJTb2NrZXRDb25uZWN0aW9uIH0gZnJvbSAnLi9zb2NrZXQvY29ubmVjdGlvbi5qcyc7XG5pbXBvcnQgdHlwZSB7IElXZWJTb2NrZXQgfSBmcm9tICcuL3NvY2tldC9zb2NrZXQuanMnO1xuaW1wb3J0IHsgQ29uc29sZUxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGxpc3RlbihvcHRpb25zOiB7XG4gICAgd2ViU29ja2V0OiBXZWJTb2NrZXQ7XG4gICAgbG9nZ2VyPzogTG9nZ2VyO1xuICAgIG9uQ29ubmVjdGlvbjogKGNvbm5lY3Rpb246IE1lc3NhZ2VDb25uZWN0aW9uKSA9PiB2b2lkO1xufSkge1xuICAgIGNvbnN0IHsgd2ViU29ja2V0LCBvbkNvbm5lY3Rpb24gfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgbG9nZ2VyID0gb3B0aW9ucy5sb2dnZXIgfHwgbmV3IENvbnNvbGVMb2dnZXIoKTtcbiAgICB3ZWJTb2NrZXQub25vcGVuID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBzb2NrZXQgPSB0b1NvY2tldCh3ZWJTb2NrZXQpO1xuICAgICAgICBjb25zdCBjb25uZWN0aW9uID0gY3JlYXRlV2ViU29ja2V0Q29ubmVjdGlvbihzb2NrZXQsIGxvZ2dlcik7XG4gICAgICAgIG9uQ29ubmVjdGlvbihjb25uZWN0aW9uKTtcbiAgICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9Tb2NrZXQod2ViU29ja2V0OiBXZWJTb2NrZXQpOiBJV2ViU29ja2V0IHtcbiAgICByZXR1cm4ge1xuICAgICAgICBzZW5kOiBjb250ZW50ID0+IHdlYlNvY2tldC5zZW5kKGNvbnRlbnQpLFxuICAgICAgICBvbk1lc3NhZ2U6IGNiID0+IHtcbiAgICAgICAgICAgIHdlYlNvY2tldC5vbm1lc3NhZ2UgPSBldmVudCA9PiBjYihldmVudC5kYXRhKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25FcnJvcjogY2IgPT4ge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgIHdlYlNvY2tldC5vbmVycm9yID0gKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0Lmhhc093bihldmVudCwgJ21lc3NhZ2UnKSkge1xuICAgICAgICAgICAgICAgICAgICBjYihldmVudC5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBvbkNsb3NlOiBjYiA9PiB7XG4gICAgICAgICAgICB3ZWJTb2NrZXQub25jbG9zZSA9IGV2ZW50ID0+IGNiKGV2ZW50LmNvZGUsIGV2ZW50LnJlYXNvbik7XG4gICAgICAgIH0sXG4gICAgICAgIGRpc3Bvc2U6ICgpID0+IHdlYlNvY2tldC5jbG9zZSgpXG4gICAgfTtcbn1cbiIsICIvKlxuICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMjYgRWNsaXBzZSBEaXJpZ2libGUgY29udHJpYnV0b3JzXG4gKlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlXG4gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2Mi4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG4gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MjAuaHRtbFxuICpcbiAqIFNQRFgtRmlsZUNvcHlyaWdodFRleHQ6IEVjbGlwc2UgRGlyaWdpYmxlIGNvbnRyaWJ1dG9ycyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbi8qKlxuICogTGF6eSBQcm94eSBzaGltIGZvciBNb25hY28gRWRpdG9yIGxvYWRlZCB2aWEgQU1ELlxuICpcbiAqIGVkaXRvci5qcyBzZXRzIGdsb2JhbFRoaXMubW9uYWNvIGluc2lkZSB0aGUgQU1EIHJlcXVpcmUoKSBjYWxsYmFjaywgYmVmb3JlIGFueVxuICogSmF2YUxzcENsaWVudExpYi5jb25uZWN0KCkgY2FsbC4gQWxsIHByb3BlcnR5IGFjY2Vzc2VzIGdvIHRocm91Z2ggUHJveHkuZ2V0KCkgdHJhcHNcbiAqIHNvIHRoZXkgcmVzb2x2ZSBhZ2FpbnN0IHRoZSBsaXZlIHdpbmRvdy5tb25hY28gYXQgY2FsbCB0aW1lLCBub3QgYXQgYnVuZGxlIGxvYWQgdGltZS5cbiAqXG4gKiBUeXBlU2NyaXB0IHJlc29sdmVzIHR5cGVzIGZyb20gdGhlIHJlYWwgbW9uYWNvLWVkaXRvciBkZXZEZXBlbmRlbmN5OyBlc2J1aWxkIHJlcGxhY2VzXG4gKiB0aGUgXCJtb25hY28tZWRpdG9yXCIgaW1wb3J0IHdpdGggdGhpcyBmaWxlIGF0IGJ1bmRsZSB0aW1lIHZpYSB0aGUgYWxpYXMgb3B0aW9uLlxuICovXG5cbnR5cGUgTSA9IHR5cGVvZiBpbXBvcnQoJ21vbmFjby1lZGl0b3InKTtcblxuZnVuY3Rpb24gbSgpOiBNIHtcbiAgICByZXR1cm4gKGdsb2JhbFRoaXMgYXMgYW55KS5tb25hY28gYXMgTTtcbn1cblxuZnVuY3Rpb24gbnM8VCBleHRlbmRzIG9iamVjdD4oZ2V0dGVyOiAoKSA9PiBUKTogVCB7XG4gICAgcmV0dXJuIG5ldyBQcm94eSh7fSBhcyBULCB7XG4gICAgICAgIGdldDogKF8sIGspID0+IChnZXR0ZXIoKSBhcyBhbnkpW2sgYXMgc3RyaW5nXSxcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gY2xzPFQ+KGdldHRlcjogKCkgPT4gVCk6IFQge1xuICAgIHJldHVybiBuZXcgUHJveHkoZnVuY3Rpb24gKCkge30gYXMgYW55LCB7XG4gICAgICAgIGNvbnN0cnVjdDogKF8sIGFyZ3MpID0+IG5ldyAoZ2V0dGVyKCkgYXMgYW55KSguLi5hcmdzKSxcbiAgICAgICAgZ2V0OiAgICAgICAoXywgaykgICAgPT4gKGdldHRlcigpIGFzIGFueSlbayBhcyBzdHJpbmddLFxuICAgIH0pIGFzIFQ7XG59XG5cbmV4cG9ydCBjb25zdCBlZGl0b3IgICAgICAgICA9IG5zKCgpID0+IG0oKS5lZGl0b3IpO1xuZXhwb3J0IGNvbnN0IGxhbmd1YWdlcyAgICAgID0gbnMoKCkgPT4gbSgpLmxhbmd1YWdlcyk7XG5leHBvcnQgY29uc3QgTWFya2VyU2V2ZXJpdHkgPSBucygoKSA9PiBtKCkuTWFya2VyU2V2ZXJpdHkpO1xuZXhwb3J0IGNvbnN0IE1hcmtlclRhZyAgICAgID0gbnMoKCkgPT4gKG0oKSBhcyBhbnkpLk1hcmtlclRhZyk7XG5leHBvcnQgY29uc3QgVXJpICAgICAgICAgICAgPSBjbHMoKCkgPT4gbSgpLlVyaSk7XG5leHBvcnQgY29uc3QgUmFuZ2UgICAgICAgICAgPSBjbHMoKCkgPT4gbSgpLlJhbmdlKTtcbmV4cG9ydCBjb25zdCBQb3NpdGlvbiAgICAgICA9IGNscygoKSA9PiBtKCkuUG9zaXRpb24pO1xuZXhwb3J0IGNvbnN0IFNlbGVjdGlvbiAgICAgID0gY2xzKCgpID0+IG0oKS5TZWxlY3Rpb24pO1xuZXhwb3J0IGNvbnN0IEtleUNvZGUgICAgICAgID0gbnMoKCkgPT4gbSgpLktleUNvZGUpO1xuZXhwb3J0IGNvbnN0IEtleU1vZCAgICAgICAgID0gbnMoKCkgPT4gbSgpLktleU1vZCk7XG4iLCAiLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuJ3VzZSBzdHJpY3QnO1xuZXhwb3J0IHZhciBEb2N1bWVudFVyaTtcbihmdW5jdGlvbiAoRG9jdW1lbnRVcmkpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJztcbiAgICB9XG4gICAgRG9jdW1lbnRVcmkuaXMgPSBpcztcbn0pKERvY3VtZW50VXJpIHx8IChEb2N1bWVudFVyaSA9IHt9KSk7XG5leHBvcnQgdmFyIFVSSTtcbihmdW5jdGlvbiAoVVJJKSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZyc7XG4gICAgfVxuICAgIFVSSS5pcyA9IGlzO1xufSkoVVJJIHx8IChVUkkgPSB7fSkpO1xuZXhwb3J0IHZhciBpbnRlZ2VyO1xuKGZ1bmN0aW9uIChpbnRlZ2VyKSB7XG4gICAgaW50ZWdlci5NSU5fVkFMVUUgPSAtMjE0NzQ4MzY0ODtcbiAgICBpbnRlZ2VyLk1BWF9WQUxVRSA9IDIxNDc0ODM2NDc7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgaW50ZWdlci5NSU5fVkFMVUUgPD0gdmFsdWUgJiYgdmFsdWUgPD0gaW50ZWdlci5NQVhfVkFMVUU7XG4gICAgfVxuICAgIGludGVnZXIuaXMgPSBpcztcbn0pKGludGVnZXIgfHwgKGludGVnZXIgPSB7fSkpO1xuZXhwb3J0IHZhciB1aW50ZWdlcjtcbihmdW5jdGlvbiAodWludGVnZXIpIHtcbiAgICB1aW50ZWdlci5NSU5fVkFMVUUgPSAwO1xuICAgIHVpbnRlZ2VyLk1BWF9WQUxVRSA9IDIxNDc0ODM2NDc7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgdWludGVnZXIuTUlOX1ZBTFVFIDw9IHZhbHVlICYmIHZhbHVlIDw9IHVpbnRlZ2VyLk1BWF9WQUxVRTtcbiAgICB9XG4gICAgdWludGVnZXIuaXMgPSBpcztcbn0pKHVpbnRlZ2VyIHx8ICh1aW50ZWdlciA9IHt9KSk7XG4vKipcbiAqIFRoZSBQb3NpdGlvbiBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBQb3NpdGlvbn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgUG9zaXRpb247XG4oZnVuY3Rpb24gKFBvc2l0aW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBQb3NpdGlvbiBsaXRlcmFsIGZyb20gdGhlIGdpdmVuIGxpbmUgYW5kIGNoYXJhY3Rlci5cbiAgICAgKiBAcGFyYW0gbGluZSBUaGUgcG9zaXRpb24ncyBsaW5lLlxuICAgICAqIEBwYXJhbSBjaGFyYWN0ZXIgVGhlIHBvc2l0aW9uJ3MgY2hhcmFjdGVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShsaW5lLCBjaGFyYWN0ZXIpIHtcbiAgICAgICAgaWYgKGxpbmUgPT09IE51bWJlci5NQVhfVkFMVUUpIHtcbiAgICAgICAgICAgIGxpbmUgPSB1aW50ZWdlci5NQVhfVkFMVUU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYXJhY3RlciA9PT0gTnVtYmVyLk1BWF9WQUxVRSkge1xuICAgICAgICAgICAgY2hhcmFjdGVyID0gdWludGVnZXIuTUFYX1ZBTFVFO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGxpbmUsIGNoYXJhY3RlciB9O1xuICAgIH1cbiAgICBQb3NpdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBQb3NpdGlvbn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBJcy51aW50ZWdlcihjYW5kaWRhdGUubGluZSkgJiYgSXMudWludGVnZXIoY2FuZGlkYXRlLmNoYXJhY3Rlcik7XG4gICAgfVxuICAgIFBvc2l0aW9uLmlzID0gaXM7XG59KShQb3NpdGlvbiB8fCAoUG9zaXRpb24gPSB7fSkpO1xuLyoqXG4gKiBUaGUgUmFuZ2UgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgUmFuZ2V9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIFJhbmdlO1xuKGZ1bmN0aW9uIChSYW5nZSkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShvbmUsIHR3bywgdGhyZWUsIGZvdXIpIHtcbiAgICAgICAgaWYgKElzLnVpbnRlZ2VyKG9uZSkgJiYgSXMudWludGVnZXIodHdvKSAmJiBJcy51aW50ZWdlcih0aHJlZSkgJiYgSXMudWludGVnZXIoZm91cikpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHN0YXJ0OiBQb3NpdGlvbi5jcmVhdGUob25lLCB0d28pLCBlbmQ6IFBvc2l0aW9uLmNyZWF0ZSh0aHJlZSwgZm91cikgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChQb3NpdGlvbi5pcyhvbmUpICYmIFBvc2l0aW9uLmlzKHR3bykpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHN0YXJ0OiBvbmUsIGVuZDogdHdvIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJhbmdlI2NyZWF0ZSBjYWxsZWQgd2l0aCBpbnZhbGlkIGFyZ3VtZW50c1ske29uZX0sICR7dHdvfSwgJHt0aHJlZX0sICR7Zm91cn1dYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgUmFuZ2UuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgUmFuZ2V9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgUG9zaXRpb24uaXMoY2FuZGlkYXRlLnN0YXJ0KSAmJiBQb3NpdGlvbi5pcyhjYW5kaWRhdGUuZW5kKTtcbiAgICB9XG4gICAgUmFuZ2UuaXMgPSBpcztcbn0pKFJhbmdlIHx8IChSYW5nZSA9IHt9KSk7XG4vKipcbiAqIFRoZSBMb2NhdGlvbiBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBMb2NhdGlvbn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgTG9jYXRpb247XG4oZnVuY3Rpb24gKExvY2F0aW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIExvY2F0aW9uIGxpdGVyYWwuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgbG9jYXRpb24ncyB1cmkuXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSBsb2NhdGlvbidzIHJhbmdlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmksIHJhbmdlKSB7XG4gICAgICAgIHJldHVybiB7IHVyaSwgcmFuZ2UgfTtcbiAgICB9XG4gICAgTG9jYXRpb24uY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgTG9jYXRpb259IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiAoSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpIHx8IElzLnVuZGVmaW5lZChjYW5kaWRhdGUudXJpKSk7XG4gICAgfVxuICAgIExvY2F0aW9uLmlzID0gaXM7XG59KShMb2NhdGlvbiB8fCAoTG9jYXRpb24gPSB7fSkpO1xuLyoqXG4gKiBUaGUgTG9jYXRpb25MaW5rIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIExvY2F0aW9uTGlua30gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgTG9jYXRpb25MaW5rO1xuKGZ1bmN0aW9uIChMb2NhdGlvbkxpbmspIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgTG9jYXRpb25MaW5rIGxpdGVyYWwuXG4gICAgICogQHBhcmFtIHRhcmdldFVyaSBUaGUgZGVmaW5pdGlvbidzIHVyaS5cbiAgICAgKiBAcGFyYW0gdGFyZ2V0UmFuZ2UgVGhlIGZ1bGwgcmFuZ2Ugb2YgdGhlIGRlZmluaXRpb24uXG4gICAgICogQHBhcmFtIHRhcmdldFNlbGVjdGlvblJhbmdlIFRoZSBzcGFuIG9mIHRoZSBzeW1ib2wgZGVmaW5pdGlvbiBhdCB0aGUgdGFyZ2V0LlxuICAgICAqIEBwYXJhbSBvcmlnaW5TZWxlY3Rpb25SYW5nZSBUaGUgc3BhbiBvZiB0aGUgc3ltYm9sIGJlaW5nIGRlZmluZWQgaW4gdGhlIG9yaWdpbmF0aW5nIHNvdXJjZSBmaWxlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh0YXJnZXRVcmksIHRhcmdldFJhbmdlLCB0YXJnZXRTZWxlY3Rpb25SYW5nZSwgb3JpZ2luU2VsZWN0aW9uUmFuZ2UpIHtcbiAgICAgICAgcmV0dXJuIHsgdGFyZ2V0VXJpLCB0YXJnZXRSYW5nZSwgdGFyZ2V0U2VsZWN0aW9uUmFuZ2UsIG9yaWdpblNlbGVjdGlvblJhbmdlIH07XG4gICAgfVxuICAgIExvY2F0aW9uTGluay5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBMb2NhdGlvbkxpbmt9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnRhcmdldFJhbmdlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnRhcmdldFVyaSlcbiAgICAgICAgICAgICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS50YXJnZXRTZWxlY3Rpb25SYW5nZSlcbiAgICAgICAgICAgICYmIChSYW5nZS5pcyhjYW5kaWRhdGUub3JpZ2luU2VsZWN0aW9uUmFuZ2UpIHx8IElzLnVuZGVmaW5lZChjYW5kaWRhdGUub3JpZ2luU2VsZWN0aW9uUmFuZ2UpKTtcbiAgICB9XG4gICAgTG9jYXRpb25MaW5rLmlzID0gaXM7XG59KShMb2NhdGlvbkxpbmsgfHwgKExvY2F0aW9uTGluayA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb2xvciBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBDb2xvcn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgQ29sb3I7XG4oZnVuY3Rpb24gKENvbG9yKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDb2xvciBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmVkLFxuICAgICAgICAgICAgZ3JlZW4sXG4gICAgICAgICAgICBibHVlLFxuICAgICAgICAgICAgYWxwaGEsXG4gICAgICAgIH07XG4gICAgfVxuICAgIENvbG9yLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIENvbG9yfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgSXMubnVtYmVyUmFuZ2UoY2FuZGlkYXRlLnJlZCwgMCwgMSlcbiAgICAgICAgICAgICYmIElzLm51bWJlclJhbmdlKGNhbmRpZGF0ZS5ncmVlbiwgMCwgMSlcbiAgICAgICAgICAgICYmIElzLm51bWJlclJhbmdlKGNhbmRpZGF0ZS5ibHVlLCAwLCAxKVxuICAgICAgICAgICAgJiYgSXMubnVtYmVyUmFuZ2UoY2FuZGlkYXRlLmFscGhhLCAwLCAxKTtcbiAgICB9XG4gICAgQ29sb3IuaXMgPSBpcztcbn0pKENvbG9yIHx8IChDb2xvciA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb2xvckluZm9ybWF0aW9uIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIENvbG9ySW5mb3JtYXRpb259IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIENvbG9ySW5mb3JtYXRpb247XG4oZnVuY3Rpb24gKENvbG9ySW5mb3JtYXRpb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENvbG9ySW5mb3JtYXRpb24gbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIGNvbG9yKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByYW5nZSxcbiAgICAgICAgICAgIGNvbG9yLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBDb2xvckluZm9ybWF0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIENvbG9ySW5mb3JtYXRpb259IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIENvbG9yLmlzKGNhbmRpZGF0ZS5jb2xvcik7XG4gICAgfVxuICAgIENvbG9ySW5mb3JtYXRpb24uaXMgPSBpcztcbn0pKENvbG9ySW5mb3JtYXRpb24gfHwgKENvbG9ySW5mb3JtYXRpb24gPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29sb3IgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgQ29sb3JQcmVzZW50YXRpb259IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIENvbG9yUHJlc2VudGF0aW9uO1xuKGZ1bmN0aW9uIChDb2xvclByZXNlbnRhdGlvbikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ29sb3JJbmZvcm1hdGlvbiBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShsYWJlbCwgdGV4dEVkaXQsIGFkZGl0aW9uYWxUZXh0RWRpdHMpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgICAgdGV4dEVkaXQsXG4gICAgICAgICAgICBhZGRpdGlvbmFsVGV4dEVkaXRzLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBDb2xvclByZXNlbnRhdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBDb2xvckluZm9ybWF0aW9ufSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5sYWJlbClcbiAgICAgICAgICAgICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLnRleHRFZGl0KSB8fCBUZXh0RWRpdC5pcyhjYW5kaWRhdGUpKVxuICAgICAgICAgICAgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUuYWRkaXRpb25hbFRleHRFZGl0cykgfHwgSXMudHlwZWRBcnJheShjYW5kaWRhdGUuYWRkaXRpb25hbFRleHRFZGl0cywgVGV4dEVkaXQuaXMpKTtcbiAgICB9XG4gICAgQ29sb3JQcmVzZW50YXRpb24uaXMgPSBpcztcbn0pKENvbG9yUHJlc2VudGF0aW9uIHx8IChDb2xvclByZXNlbnRhdGlvbiA9IHt9KSk7XG4vKipcbiAqIEEgc2V0IG9mIHByZWRlZmluZWQgcmFuZ2Uga2luZHMuXG4gKi9cbmV4cG9ydCB2YXIgRm9sZGluZ1JhbmdlS2luZDtcbihmdW5jdGlvbiAoRm9sZGluZ1JhbmdlS2luZCkge1xuICAgIC8qKlxuICAgICAqIEZvbGRpbmcgcmFuZ2UgZm9yIGEgY29tbWVudFxuICAgICAqL1xuICAgIEZvbGRpbmdSYW5nZUtpbmQuQ29tbWVudCA9ICdjb21tZW50JztcbiAgICAvKipcbiAgICAgKiBGb2xkaW5nIHJhbmdlIGZvciBhbiBpbXBvcnQgb3IgaW5jbHVkZVxuICAgICAqL1xuICAgIEZvbGRpbmdSYW5nZUtpbmQuSW1wb3J0cyA9ICdpbXBvcnRzJztcbiAgICAvKipcbiAgICAgKiBGb2xkaW5nIHJhbmdlIGZvciBhIHJlZ2lvbiAoZS5nLiBgI3JlZ2lvbmApXG4gICAgICovXG4gICAgRm9sZGluZ1JhbmdlS2luZC5SZWdpb24gPSAncmVnaW9uJztcbn0pKEZvbGRpbmdSYW5nZUtpbmQgfHwgKEZvbGRpbmdSYW5nZUtpbmQgPSB7fSkpO1xuLyoqXG4gKiBUaGUgZm9sZGluZyByYW5nZSBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBGb2xkaW5nUmFuZ2V9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIEZvbGRpbmdSYW5nZTtcbihmdW5jdGlvbiAoRm9sZGluZ1JhbmdlKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBGb2xkaW5nUmFuZ2UgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUoc3RhcnRMaW5lLCBlbmRMaW5lLCBzdGFydENoYXJhY3RlciwgZW5kQ2hhcmFjdGVyLCBraW5kLCBjb2xsYXBzZWRUZXh0KSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIHN0YXJ0TGluZSxcbiAgICAgICAgICAgIGVuZExpbmVcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKElzLmRlZmluZWQoc3RhcnRDaGFyYWN0ZXIpKSB7XG4gICAgICAgICAgICByZXN1bHQuc3RhcnRDaGFyYWN0ZXIgPSBzdGFydENoYXJhY3RlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXMuZGVmaW5lZChlbmRDaGFyYWN0ZXIpKSB7XG4gICAgICAgICAgICByZXN1bHQuZW5kQ2hhcmFjdGVyID0gZW5kQ2hhcmFjdGVyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKGtpbmQpKSB7XG4gICAgICAgICAgICByZXN1bHQua2luZCA9IGtpbmQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzLmRlZmluZWQoY29sbGFwc2VkVGV4dCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5jb2xsYXBzZWRUZXh0ID0gY29sbGFwc2VkVGV4dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBGb2xkaW5nUmFuZ2UuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgRm9sZGluZ1JhbmdlfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgSXMudWludGVnZXIoY2FuZGlkYXRlLnN0YXJ0TGluZSkgJiYgSXMudWludGVnZXIoY2FuZGlkYXRlLnN0YXJ0TGluZSlcbiAgICAgICAgICAgICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLnN0YXJ0Q2hhcmFjdGVyKSB8fCBJcy51aW50ZWdlcihjYW5kaWRhdGUuc3RhcnRDaGFyYWN0ZXIpKVxuICAgICAgICAgICAgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUuZW5kQ2hhcmFjdGVyKSB8fCBJcy51aW50ZWdlcihjYW5kaWRhdGUuZW5kQ2hhcmFjdGVyKSlcbiAgICAgICAgICAgICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLmtpbmQpIHx8IElzLnN0cmluZyhjYW5kaWRhdGUua2luZCkpO1xuICAgIH1cbiAgICBGb2xkaW5nUmFuZ2UuaXMgPSBpcztcbn0pKEZvbGRpbmdSYW5nZSB8fCAoRm9sZGluZ1JhbmdlID0ge30pKTtcbi8qKlxuICogVGhlIERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24gbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbjtcbihmdW5jdGlvbiAoRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbiBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShsb2NhdGlvbiwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbG9jYXRpb24sXG4gICAgICAgICAgICBtZXNzYWdlXG4gICAgICAgIH07XG4gICAgfVxuICAgIERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24uY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBMb2NhdGlvbi5pcyhjYW5kaWRhdGUubG9jYXRpb24pICYmIElzLnN0cmluZyhjYW5kaWRhdGUubWVzc2FnZSk7XG4gICAgfVxuICAgIERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24uaXMgPSBpcztcbn0pKERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24gfHwgKERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24gPSB7fSkpO1xuLyoqXG4gKiBUaGUgZGlhZ25vc3RpYydzIHNldmVyaXR5LlxuICovXG5leHBvcnQgdmFyIERpYWdub3N0aWNTZXZlcml0eTtcbihmdW5jdGlvbiAoRGlhZ25vc3RpY1NldmVyaXR5KSB7XG4gICAgLyoqXG4gICAgICogUmVwb3J0cyBhbiBlcnJvci5cbiAgICAgKi9cbiAgICBEaWFnbm9zdGljU2V2ZXJpdHkuRXJyb3IgPSAxO1xuICAgIC8qKlxuICAgICAqIFJlcG9ydHMgYSB3YXJuaW5nLlxuICAgICAqL1xuICAgIERpYWdub3N0aWNTZXZlcml0eS5XYXJuaW5nID0gMjtcbiAgICAvKipcbiAgICAgKiBSZXBvcnRzIGFuIGluZm9ybWF0aW9uLlxuICAgICAqL1xuICAgIERpYWdub3N0aWNTZXZlcml0eS5JbmZvcm1hdGlvbiA9IDM7XG4gICAgLyoqXG4gICAgICogUmVwb3J0cyBhIGhpbnQuXG4gICAgICovXG4gICAgRGlhZ25vc3RpY1NldmVyaXR5LkhpbnQgPSA0O1xufSkoRGlhZ25vc3RpY1NldmVyaXR5IHx8IChEaWFnbm9zdGljU2V2ZXJpdHkgPSB7fSkpO1xuLyoqXG4gKiBUaGUgZGlhZ25vc3RpYyB0YWdzLlxuICpcbiAqIEBzaW5jZSAzLjE1LjBcbiAqL1xuZXhwb3J0IHZhciBEaWFnbm9zdGljVGFnO1xuKGZ1bmN0aW9uIChEaWFnbm9zdGljVGFnKSB7XG4gICAgLyoqXG4gICAgICogVW51c2VkIG9yIHVubmVjZXNzYXJ5IGNvZGUuXG4gICAgICpcbiAgICAgKiBDbGllbnRzIGFyZSBhbGxvd2VkIHRvIHJlbmRlciBkaWFnbm9zdGljcyB3aXRoIHRoaXMgdGFnIGZhZGVkIG91dCBpbnN0ZWFkIG9mIGhhdmluZ1xuICAgICAqIGFuIGVycm9yIHNxdWlnZ2xlLlxuICAgICAqL1xuICAgIERpYWdub3N0aWNUYWcuVW5uZWNlc3NhcnkgPSAxO1xuICAgIC8qKlxuICAgICAqIERlcHJlY2F0ZWQgb3Igb2Jzb2xldGUgY29kZS5cbiAgICAgKlxuICAgICAqIENsaWVudHMgYXJlIGFsbG93ZWQgdG8gcmVuZGVyZWQgZGlhZ25vc3RpY3Mgd2l0aCB0aGlzIHRhZyBzdHJpa2UgdGhyb3VnaC5cbiAgICAgKi9cbiAgICBEaWFnbm9zdGljVGFnLkRlcHJlY2F0ZWQgPSAyO1xufSkoRGlhZ25vc3RpY1RhZyB8fCAoRGlhZ25vc3RpY1RhZyA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb2RlRGVzY3JpcHRpb24gbmFtZXNwYWNlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGggZGVzY3JpcHRpb25zIGZvciBkaWFnbm9zdGljIGNvZGVzLlxuICpcbiAqIEBzaW5jZSAzLjE2LjBcbiAqL1xuZXhwb3J0IHZhciBDb2RlRGVzY3JpcHRpb247XG4oZnVuY3Rpb24gKENvZGVEZXNjcmlwdGlvbikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUuaHJlZik7XG4gICAgfVxuICAgIENvZGVEZXNjcmlwdGlvbi5pcyA9IGlzO1xufSkoQ29kZURlc2NyaXB0aW9uIHx8IChDb2RlRGVzY3JpcHRpb24gPSB7fSkpO1xuLyoqXG4gKiBUaGUgRGlhZ25vc3RpYyBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBEaWFnbm9zdGljfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBEaWFnbm9zdGljO1xuKGZ1bmN0aW9uIChEaWFnbm9zdGljKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBEaWFnbm9zdGljIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCBtZXNzYWdlLCBzZXZlcml0eSwgY29kZSwgc291cmNlLCByZWxhdGVkSW5mb3JtYXRpb24pIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHsgcmFuZ2UsIG1lc3NhZ2UgfTtcbiAgICAgICAgaWYgKElzLmRlZmluZWQoc2V2ZXJpdHkpKSB7XG4gICAgICAgICAgICByZXN1bHQuc2V2ZXJpdHkgPSBzZXZlcml0eTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXMuZGVmaW5lZChjb2RlKSkge1xuICAgICAgICAgICAgcmVzdWx0LmNvZGUgPSBjb2RlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKHNvdXJjZSkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzLmRlZmluZWQocmVsYXRlZEluZm9ybWF0aW9uKSkge1xuICAgICAgICAgICAgcmVzdWx0LnJlbGF0ZWRJbmZvcm1hdGlvbiA9IHJlbGF0ZWRJbmZvcm1hdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBEaWFnbm9zdGljLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIERpYWdub3N0aWN9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKVxuICAgICAgICAgICAgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKVxuICAgICAgICAgICAgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5tZXNzYWdlKVxuICAgICAgICAgICAgJiYgKElzLm51bWJlcihjYW5kaWRhdGUuc2V2ZXJpdHkpIHx8IElzLnVuZGVmaW5lZChjYW5kaWRhdGUuc2V2ZXJpdHkpKVxuICAgICAgICAgICAgJiYgKElzLmludGVnZXIoY2FuZGlkYXRlLmNvZGUpIHx8IElzLnN0cmluZyhjYW5kaWRhdGUuY29kZSkgfHwgSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5jb2RlKSlcbiAgICAgICAgICAgICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLmNvZGVEZXNjcmlwdGlvbikgfHwgKElzLnN0cmluZygoX2EgPSBjYW5kaWRhdGUuY29kZURlc2NyaXB0aW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaHJlZikpKVxuICAgICAgICAgICAgJiYgKElzLnN0cmluZyhjYW5kaWRhdGUuc291cmNlKSB8fCBJcy51bmRlZmluZWQoY2FuZGlkYXRlLnNvdXJjZSkpXG4gICAgICAgICAgICAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5yZWxhdGVkSW5mb3JtYXRpb24pIHx8IElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLnJlbGF0ZWRJbmZvcm1hdGlvbiwgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbi5pcykpO1xuICAgIH1cbiAgICBEaWFnbm9zdGljLmlzID0gaXM7XG59KShEaWFnbm9zdGljIHx8IChEaWFnbm9zdGljID0ge30pKTtcbi8qKlxuICogVGhlIENvbW1hbmQgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgQ29tbWFuZH0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgQ29tbWFuZDtcbihmdW5jdGlvbiAoQ29tbWFuZCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ29tbWFuZCBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh0aXRsZSwgY29tbWFuZCwgLi4uYXJncykge1xuICAgICAgICBsZXQgcmVzdWx0ID0geyB0aXRsZSwgY29tbWFuZCB9O1xuICAgICAgICBpZiAoSXMuZGVmaW5lZChhcmdzKSAmJiBhcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJlc3VsdC5hcmd1bWVudHMgPSBhcmdzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIENvbW1hbmQuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgQ29tbWFuZH0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnRpdGxlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLmNvbW1hbmQpO1xuICAgIH1cbiAgICBDb21tYW5kLmlzID0gaXM7XG59KShDb21tYW5kIHx8IChDb21tYW5kID0ge30pKTtcbi8qKlxuICogVGhlIFRleHRFZGl0IG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIHJlcGxhY2UsXG4gKiBpbnNlcnQgYW5kIGRlbGV0ZSBlZGl0cyBtb3JlIGVhc2lseS5cbiAqL1xuZXhwb3J0IHZhciBUZXh0RWRpdDtcbihmdW5jdGlvbiAoVGV4dEVkaXQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgcmVwbGFjZSB0ZXh0IGVkaXQuXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSBvZiB0ZXh0IHRvIGJlIHJlcGxhY2VkLlxuICAgICAqIEBwYXJhbSBuZXdUZXh0IFRoZSBuZXcgdGV4dC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXBsYWNlKHJhbmdlLCBuZXdUZXh0KSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCBuZXdUZXh0IH07XG4gICAgfVxuICAgIFRleHRFZGl0LnJlcGxhY2UgPSByZXBsYWNlO1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zZXJ0IHRleHQgZWRpdC5cbiAgICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIHBvc2l0aW9uIHRvIGluc2VydCB0aGUgdGV4dCBhdC5cbiAgICAgKiBAcGFyYW0gbmV3VGV4dCBUaGUgdGV4dCB0byBiZSBpbnNlcnRlZC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbnNlcnQocG9zaXRpb24sIG5ld1RleHQpIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2U6IHsgc3RhcnQ6IHBvc2l0aW9uLCBlbmQ6IHBvc2l0aW9uIH0sIG5ld1RleHQgfTtcbiAgICB9XG4gICAgVGV4dEVkaXQuaW5zZXJ0ID0gaW5zZXJ0O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBkZWxldGUgdGV4dCBlZGl0LlxuICAgICAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2Ugb2YgdGV4dCB0byBiZSBkZWxldGVkLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRlbChyYW5nZSkge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgbmV3VGV4dDogJycgfTtcbiAgICB9XG4gICAgVGV4dEVkaXQuZGVsID0gZGVsO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpXG4gICAgICAgICAgICAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLm5ld1RleHQpXG4gICAgICAgICAgICAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpO1xuICAgIH1cbiAgICBUZXh0RWRpdC5pcyA9IGlzO1xufSkoVGV4dEVkaXQgfHwgKFRleHRFZGl0ID0ge30pKTtcbmV4cG9ydCB2YXIgQ2hhbmdlQW5ub3RhdGlvbjtcbihmdW5jdGlvbiAoQ2hhbmdlQW5ub3RhdGlvbikge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShsYWJlbCwgbmVlZHNDb25maXJtYXRpb24sIGRlc2NyaXB0aW9uKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHsgbGFiZWwgfTtcbiAgICAgICAgaWYgKG5lZWRzQ29uZmlybWF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5uZWVkc0NvbmZpcm1hdGlvbiA9IG5lZWRzQ29uZmlybWF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZXNjcmlwdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBDaGFuZ2VBbm5vdGF0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLmxhYmVsKSAmJlxuICAgICAgICAgICAgKElzLmJvb2xlYW4oY2FuZGlkYXRlLm5lZWRzQ29uZmlybWF0aW9uKSB8fCBjYW5kaWRhdGUubmVlZHNDb25maXJtYXRpb24gPT09IHVuZGVmaW5lZCkgJiZcbiAgICAgICAgICAgIChJcy5zdHJpbmcoY2FuZGlkYXRlLmRlc2NyaXB0aW9uKSB8fCBjYW5kaWRhdGUuZGVzY3JpcHRpb24gPT09IHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIENoYW5nZUFubm90YXRpb24uaXMgPSBpcztcbn0pKENoYW5nZUFubm90YXRpb24gfHwgKENoYW5nZUFubm90YXRpb24gPSB7fSkpO1xuZXhwb3J0IHZhciBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllcjtcbihmdW5jdGlvbiAoQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLnN0cmluZyhjYW5kaWRhdGUpO1xuICAgIH1cbiAgICBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyA9IGlzO1xufSkoQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIgfHwgKENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyID0ge30pKTtcbmV4cG9ydCB2YXIgQW5ub3RhdGVkVGV4dEVkaXQ7XG4oZnVuY3Rpb24gKEFubm90YXRlZFRleHRFZGl0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhbm5vdGF0ZWQgcmVwbGFjZSB0ZXh0IGVkaXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlIG9mIHRleHQgdG8gYmUgcmVwbGFjZWQuXG4gICAgICogQHBhcmFtIG5ld1RleHQgVGhlIG5ldyB0ZXh0LlxuICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIFRoZSBhbm5vdGF0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlcGxhY2UocmFuZ2UsIG5ld1RleHQsIGFubm90YXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIG5ld1RleHQsIGFubm90YXRpb25JZDogYW5ub3RhdGlvbiB9O1xuICAgIH1cbiAgICBBbm5vdGF0ZWRUZXh0RWRpdC5yZXBsYWNlID0gcmVwbGFjZTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFubm90YXRlZCBpbnNlcnQgdGV4dCBlZGl0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBwb3NpdGlvbiB0byBpbnNlcnQgdGhlIHRleHQgYXQuXG4gICAgICogQHBhcmFtIG5ld1RleHQgVGhlIHRleHQgdG8gYmUgaW5zZXJ0ZWQuXG4gICAgICogQHBhcmFtIGFubm90YXRpb24gVGhlIGFubm90YXRpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5zZXJ0KHBvc2l0aW9uLCBuZXdUZXh0LCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlOiB7IHN0YXJ0OiBwb3NpdGlvbiwgZW5kOiBwb3NpdGlvbiB9LCBuZXdUZXh0LCBhbm5vdGF0aW9uSWQ6IGFubm90YXRpb24gfTtcbiAgICB9XG4gICAgQW5ub3RhdGVkVGV4dEVkaXQuaW5zZXJ0ID0gaW5zZXJ0O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYW5ub3RhdGVkIGRlbGV0ZSB0ZXh0IGVkaXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlIG9mIHRleHQgdG8gYmUgZGVsZXRlZC5cbiAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiBUaGUgYW5ub3RhdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkZWwocmFuZ2UsIGFubm90YXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIG5ld1RleHQ6ICcnLCBhbm5vdGF0aW9uSWQ6IGFubm90YXRpb24gfTtcbiAgICB9XG4gICAgQW5ub3RhdGVkVGV4dEVkaXQuZGVsID0gZGVsO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gVGV4dEVkaXQuaXMoY2FuZGlkYXRlKSAmJiAoQ2hhbmdlQW5ub3RhdGlvbi5pcyhjYW5kaWRhdGUuYW5ub3RhdGlvbklkKSB8fCBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhjYW5kaWRhdGUuYW5ub3RhdGlvbklkKSk7XG4gICAgfVxuICAgIEFubm90YXRlZFRleHRFZGl0LmlzID0gaXM7XG59KShBbm5vdGF0ZWRUZXh0RWRpdCB8fCAoQW5ub3RhdGVkVGV4dEVkaXQgPSB7fSkpO1xuLyoqXG4gKiBUaGUgVGV4dERvY3VtZW50RWRpdCBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZVxuICogYW4gZWRpdCB0aGF0IG1hbmlwdWxhdGVzIGEgdGV4dCBkb2N1bWVudC5cbiAqL1xuZXhwb3J0IHZhciBUZXh0RG9jdW1lbnRFZGl0O1xuKGZ1bmN0aW9uIChUZXh0RG9jdW1lbnRFZGl0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBgVGV4dERvY3VtZW50RWRpdGBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodGV4dERvY3VtZW50LCBlZGl0cykge1xuICAgICAgICByZXR1cm4geyB0ZXh0RG9jdW1lbnQsIGVkaXRzIH07XG4gICAgfVxuICAgIFRleHREb2N1bWVudEVkaXQuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKVxuICAgICAgICAgICAgJiYgT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmlzKGNhbmRpZGF0ZS50ZXh0RG9jdW1lbnQpXG4gICAgICAgICAgICAmJiBBcnJheS5pc0FycmF5KGNhbmRpZGF0ZS5lZGl0cyk7XG4gICAgfVxuICAgIFRleHREb2N1bWVudEVkaXQuaXMgPSBpcztcbn0pKFRleHREb2N1bWVudEVkaXQgfHwgKFRleHREb2N1bWVudEVkaXQgPSB7fSkpO1xuZXhwb3J0IHZhciBDcmVhdGVGaWxlO1xuKGZ1bmN0aW9uIChDcmVhdGVGaWxlKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKHVyaSwgb3B0aW9ucywgYW5ub3RhdGlvbikge1xuICAgICAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgICAgICAga2luZDogJ2NyZWF0ZScsXG4gICAgICAgICAgICB1cmlcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKG9wdGlvbnMgIT09IHVuZGVmaW5lZCAmJiAob3B0aW9ucy5vdmVyd3JpdGUgIT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLmlnbm9yZUlmRXhpc3RzICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICByZXN1bHQub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFubm90YXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmFubm90YXRpb25JZCA9IGFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgQ3JlYXRlRmlsZS5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIGNhbmRpZGF0ZS5raW5kID09PSAnY3JlYXRlJyAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSkgJiYgKGNhbmRpZGF0ZS5vcHRpb25zID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICgoY2FuZGlkYXRlLm9wdGlvbnMub3ZlcndyaXRlID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUub3B0aW9ucy5vdmVyd3JpdGUpKSAmJiAoY2FuZGlkYXRlLm9wdGlvbnMuaWdub3JlSWZFeGlzdHMgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5vcHRpb25zLmlnbm9yZUlmRXhpc3RzKSkpKSAmJiAoY2FuZGlkYXRlLmFubm90YXRpb25JZCA9PT0gdW5kZWZpbmVkIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQpKTtcbiAgICB9XG4gICAgQ3JlYXRlRmlsZS5pcyA9IGlzO1xufSkoQ3JlYXRlRmlsZSB8fCAoQ3JlYXRlRmlsZSA9IHt9KSk7XG5leHBvcnQgdmFyIFJlbmFtZUZpbGU7XG4oZnVuY3Rpb24gKFJlbmFtZUZpbGUpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUob2xkVXJpLCBuZXdVcmksIG9wdGlvbnMsIGFubm90YXRpb24pIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIGtpbmQ6ICdyZW5hbWUnLFxuICAgICAgICAgICAgb2xkVXJpLFxuICAgICAgICAgICAgbmV3VXJpXG4gICAgICAgIH07XG4gICAgICAgIGlmIChvcHRpb25zICE9PSB1bmRlZmluZWQgJiYgKG9wdGlvbnMub3ZlcndyaXRlICE9PSB1bmRlZmluZWQgfHwgb3B0aW9ucy5pZ25vcmVJZkV4aXN0cyAhPT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgcmVzdWx0Lm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbm5vdGF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5hbm5vdGF0aW9uSWQgPSBhbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIFJlbmFtZUZpbGUuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBjYW5kaWRhdGUua2luZCA9PT0gJ3JlbmFtZScgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5vbGRVcmkpICYmIElzLnN0cmluZyhjYW5kaWRhdGUubmV3VXJpKSAmJiAoY2FuZGlkYXRlLm9wdGlvbnMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgKChjYW5kaWRhdGUub3B0aW9ucy5vdmVyd3JpdGUgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5vcHRpb25zLm92ZXJ3cml0ZSkpICYmIChjYW5kaWRhdGUub3B0aW9ucy5pZ25vcmVJZkV4aXN0cyA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLm9wdGlvbnMuaWdub3JlSWZFeGlzdHMpKSkpICYmIChjYW5kaWRhdGUuYW5ub3RhdGlvbklkID09PSB1bmRlZmluZWQgfHwgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoY2FuZGlkYXRlLmFubm90YXRpb25JZCkpO1xuICAgIH1cbiAgICBSZW5hbWVGaWxlLmlzID0gaXM7XG59KShSZW5hbWVGaWxlIHx8IChSZW5hbWVGaWxlID0ge30pKTtcbmV4cG9ydCB2YXIgRGVsZXRlRmlsZTtcbihmdW5jdGlvbiAoRGVsZXRlRmlsZSkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmksIG9wdGlvbnMsIGFubm90YXRpb24pIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIGtpbmQ6ICdkZWxldGUnLFxuICAgICAgICAgICAgdXJpXG4gICAgICAgIH07XG4gICAgICAgIGlmIChvcHRpb25zICE9PSB1bmRlZmluZWQgJiYgKG9wdGlvbnMucmVjdXJzaXZlICE9PSB1bmRlZmluZWQgfHwgb3B0aW9ucy5pZ25vcmVJZk5vdEV4aXN0cyAhPT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgcmVzdWx0Lm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbm5vdGF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5hbm5vdGF0aW9uSWQgPSBhbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIERlbGV0ZUZpbGUuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBjYW5kaWRhdGUua2luZCA9PT0gJ2RlbGV0ZScgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpICYmIChjYW5kaWRhdGUub3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAoKGNhbmRpZGF0ZS5vcHRpb25zLnJlY3Vyc2l2ZSA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLm9wdGlvbnMucmVjdXJzaXZlKSkgJiYgKGNhbmRpZGF0ZS5vcHRpb25zLmlnbm9yZUlmTm90RXhpc3RzID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUub3B0aW9ucy5pZ25vcmVJZk5vdEV4aXN0cykpKSkgJiYgKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQgPT09IHVuZGVmaW5lZCB8fCBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhjYW5kaWRhdGUuYW5ub3RhdGlvbklkKSk7XG4gICAgfVxuICAgIERlbGV0ZUZpbGUuaXMgPSBpcztcbn0pKERlbGV0ZUZpbGUgfHwgKERlbGV0ZUZpbGUgPSB7fSkpO1xuZXhwb3J0IHZhciBXb3Jrc3BhY2VFZGl0O1xuKGZ1bmN0aW9uIChXb3Jrc3BhY2VFZGl0KSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmNoYW5nZXMgIT09IHVuZGVmaW5lZCB8fCBjYW5kaWRhdGUuZG9jdW1lbnRDaGFuZ2VzICE9PSB1bmRlZmluZWQpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmRvY3VtZW50Q2hhbmdlcyA9PT0gdW5kZWZpbmVkIHx8IGNhbmRpZGF0ZS5kb2N1bWVudENoYW5nZXMuZXZlcnkoKGNoYW5nZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChJcy5zdHJpbmcoY2hhbmdlLmtpbmQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVGaWxlLmlzKGNoYW5nZSkgfHwgUmVuYW1lRmlsZS5pcyhjaGFuZ2UpIHx8IERlbGV0ZUZpbGUuaXMoY2hhbmdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBUZXh0RG9jdW1lbnRFZGl0LmlzKGNoYW5nZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgIH1cbiAgICBXb3Jrc3BhY2VFZGl0LmlzID0gaXM7XG59KShXb3Jrc3BhY2VFZGl0IHx8IChXb3Jrc3BhY2VFZGl0ID0ge30pKTtcbmNsYXNzIFRleHRFZGl0Q2hhbmdlSW1wbCB7XG4gICAgY29uc3RydWN0b3IoZWRpdHMsIGNoYW5nZUFubm90YXRpb25zKSB7XG4gICAgICAgIHRoaXMuZWRpdHMgPSBlZGl0cztcbiAgICAgICAgdGhpcy5jaGFuZ2VBbm5vdGF0aW9ucyA9IGNoYW5nZUFubm90YXRpb25zO1xuICAgIH1cbiAgICBpbnNlcnQocG9zaXRpb24sIG5ld1RleHQsIGFubm90YXRpb24pIHtcbiAgICAgICAgbGV0IGVkaXQ7XG4gICAgICAgIGxldCBpZDtcbiAgICAgICAgaWYgKGFubm90YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZWRpdCA9IFRleHRFZGl0Lmluc2VydChwb3NpdGlvbiwgbmV3VGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoYW5ub3RhdGlvbikpIHtcbiAgICAgICAgICAgIGlkID0gYW5ub3RhdGlvbjtcbiAgICAgICAgICAgIGVkaXQgPSBBbm5vdGF0ZWRUZXh0RWRpdC5pbnNlcnQocG9zaXRpb24sIG5ld1RleHQsIGFubm90YXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hc3NlcnRDaGFuZ2VBbm5vdGF0aW9ucyh0aGlzLmNoYW5nZUFubm90YXRpb25zKTtcbiAgICAgICAgICAgIGlkID0gdGhpcy5jaGFuZ2VBbm5vdGF0aW9ucy5tYW5hZ2UoYW5ub3RhdGlvbik7XG4gICAgICAgICAgICBlZGl0ID0gQW5ub3RhdGVkVGV4dEVkaXQuaW5zZXJ0KHBvc2l0aW9uLCBuZXdUZXh0LCBpZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lZGl0cy5wdXNoKGVkaXQpO1xuICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlcGxhY2UocmFuZ2UsIG5ld1RleHQsIGFubm90YXRpb24pIHtcbiAgICAgICAgbGV0IGVkaXQ7XG4gICAgICAgIGxldCBpZDtcbiAgICAgICAgaWYgKGFubm90YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZWRpdCA9IFRleHRFZGl0LnJlcGxhY2UocmFuZ2UsIG5ld1RleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGFubm90YXRpb24pKSB7XG4gICAgICAgICAgICBpZCA9IGFubm90YXRpb247XG4gICAgICAgICAgICBlZGl0ID0gQW5ub3RhdGVkVGV4dEVkaXQucmVwbGFjZShyYW5nZSwgbmV3VGV4dCwgYW5ub3RhdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFzc2VydENoYW5nZUFubm90YXRpb25zKHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgaWQgPSB0aGlzLmNoYW5nZUFubm90YXRpb25zLm1hbmFnZShhbm5vdGF0aW9uKTtcbiAgICAgICAgICAgIGVkaXQgPSBBbm5vdGF0ZWRUZXh0RWRpdC5yZXBsYWNlKHJhbmdlLCBuZXdUZXh0LCBpZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lZGl0cy5wdXNoKGVkaXQpO1xuICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlbGV0ZShyYW5nZSwgYW5ub3RhdGlvbikge1xuICAgICAgICBsZXQgZWRpdDtcbiAgICAgICAgbGV0IGlkO1xuICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBlZGl0ID0gVGV4dEVkaXQuZGVsKHJhbmdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhhbm5vdGF0aW9uKSkge1xuICAgICAgICAgICAgaWQgPSBhbm5vdGF0aW9uO1xuICAgICAgICAgICAgZWRpdCA9IEFubm90YXRlZFRleHRFZGl0LmRlbChyYW5nZSwgYW5ub3RhdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFzc2VydENoYW5nZUFubm90YXRpb25zKHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgaWQgPSB0aGlzLmNoYW5nZUFubm90YXRpb25zLm1hbmFnZShhbm5vdGF0aW9uKTtcbiAgICAgICAgICAgIGVkaXQgPSBBbm5vdGF0ZWRUZXh0RWRpdC5kZWwocmFuZ2UsIGlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVkaXRzLnB1c2goZWRpdCk7XG4gICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYWRkKGVkaXQpIHtcbiAgICAgICAgdGhpcy5lZGl0cy5wdXNoKGVkaXQpO1xuICAgIH1cbiAgICBhbGwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRzO1xuICAgIH1cbiAgICBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5lZGl0cy5zcGxpY2UoMCwgdGhpcy5lZGl0cy5sZW5ndGgpO1xuICAgIH1cbiAgICBhc3NlcnRDaGFuZ2VBbm5vdGF0aW9ucyh2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUZXh0IGVkaXQgY2hhbmdlIGlzIG5vdCBjb25maWd1cmVkIHRvIG1hbmFnZSBjaGFuZ2UgYW5ub3RhdGlvbnMuYCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIEEgaGVscGVyIGNsYXNzXG4gKi9cbmNsYXNzIENoYW5nZUFubm90YXRpb25zIHtcbiAgICBjb25zdHJ1Y3Rvcihhbm5vdGF0aW9ucykge1xuICAgICAgICB0aGlzLl9hbm5vdGF0aW9ucyA9IGFubm90YXRpb25zID09PSB1bmRlZmluZWQgPyBPYmplY3QuY3JlYXRlKG51bGwpIDogYW5ub3RhdGlvbnM7XG4gICAgICAgIHRoaXMuX2NvdW50ZXIgPSAwO1xuICAgICAgICB0aGlzLl9zaXplID0gMDtcbiAgICB9XG4gICAgYWxsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYW5ub3RhdGlvbnM7XG4gICAgfVxuICAgIGdldCBzaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2l6ZTtcbiAgICB9XG4gICAgbWFuYWdlKGlkT3JBbm5vdGF0aW9uLCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIGxldCBpZDtcbiAgICAgICAgaWYgKENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGlkT3JBbm5vdGF0aW9uKSkge1xuICAgICAgICAgICAgaWQgPSBpZE9yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlkID0gdGhpcy5uZXh0SWQoKTtcbiAgICAgICAgICAgIGFubm90YXRpb24gPSBpZE9yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fYW5ub3RhdGlvbnNbaWRdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSWQgJHtpZH0gaXMgYWxyZWFkeSBpbiB1c2UuYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFubm90YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBhbm5vdGF0aW9uIHByb3ZpZGVkIGZvciBpZCAke2lkfWApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2Fubm90YXRpb25zW2lkXSA9IGFubm90YXRpb247XG4gICAgICAgIHRoaXMuX3NpemUrKztcbiAgICAgICAgcmV0dXJuIGlkO1xuICAgIH1cbiAgICBuZXh0SWQoKSB7XG4gICAgICAgIHRoaXMuX2NvdW50ZXIrKztcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvdW50ZXIudG9TdHJpbmcoKTtcbiAgICB9XG59XG4vKipcbiAqIEEgd29ya3NwYWNlIGNoYW5nZSBoZWxwcyBjb25zdHJ1Y3RpbmcgY2hhbmdlcyB0byBhIHdvcmtzcGFjZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFdvcmtzcGFjZUNoYW5nZSB7XG4gICAgY29uc3RydWN0b3Iod29ya3NwYWNlRWRpdCkge1xuICAgICAgICB0aGlzLl90ZXh0RWRpdENoYW5nZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBpZiAod29ya3NwYWNlRWRpdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0ID0gd29ya3NwYWNlRWRpdDtcbiAgICAgICAgICAgIGlmICh3b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZUFubm90YXRpb25zID0gbmV3IENoYW5nZUFubm90YXRpb25zKHdvcmtzcGFjZUVkaXQuY2hhbmdlQW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgICAgIHdvcmtzcGFjZUVkaXQuY2hhbmdlQW5ub3RhdGlvbnMgPSB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5hbGwoKTtcbiAgICAgICAgICAgICAgICB3b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcy5mb3JFYWNoKChjaGFuZ2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFRleHREb2N1bWVudEVkaXQuaXMoY2hhbmdlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dEVkaXRDaGFuZ2UgPSBuZXcgVGV4dEVkaXRDaGFuZ2VJbXBsKGNoYW5nZS5lZGl0cywgdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGV4dEVkaXRDaGFuZ2VzW2NoYW5nZS50ZXh0RG9jdW1lbnQudXJpXSA9IHRleHRFZGl0Q2hhbmdlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh3b3Jrc3BhY2VFZGl0LmNoYW5nZXMpIHtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyh3b3Jrc3BhY2VFZGl0LmNoYW5nZXMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0RWRpdENoYW5nZSA9IG5ldyBUZXh0RWRpdENoYW5nZUltcGwod29ya3NwYWNlRWRpdC5jaGFuZ2VzW2tleV0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXh0RWRpdENoYW5nZXNba2V5XSA9IHRleHRFZGl0Q2hhbmdlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdCA9IHt9O1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHVuZGVybHlpbmcge0BsaW5rIFdvcmtzcGFjZUVkaXR9IGxpdGVyYWxcbiAgICAgKiB1c2UgdG8gYmUgcmV0dXJuZWQgZnJvbSBhIHdvcmtzcGFjZSBlZGl0IG9wZXJhdGlvbiBsaWtlIHJlbmFtZS5cbiAgICAgKi9cbiAgICBnZXQgZWRpdCgpIHtcbiAgICAgICAgdGhpcy5pbml0RG9jdW1lbnRDaGFuZ2VzKCk7XG4gICAgICAgIGlmICh0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlQW5ub3RhdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZUFubm90YXRpb25zID0gdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMuYWxsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3dvcmtzcGFjZUVkaXQ7XG4gICAgfVxuICAgIGdldFRleHRFZGl0Q2hhbmdlKGtleSkge1xuICAgICAgICBpZiAoT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmlzKGtleSkpIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdERvY3VtZW50Q2hhbmdlcygpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dvcmtzcGFjZSBlZGl0IGlzIG5vdCBjb25maWd1cmVkIGZvciBkb2N1bWVudCBjaGFuZ2VzLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdGV4dERvY3VtZW50ID0geyB1cmk6IGtleS51cmksIHZlcnNpb246IGtleS52ZXJzaW9uIH07XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5fdGV4dEVkaXRDaGFuZ2VzW3RleHREb2N1bWVudC51cmldO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlZGl0cyA9IFtdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRleHREb2N1bWVudEVkaXQgPSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHREb2N1bWVudCxcbiAgICAgICAgICAgICAgICAgICAgZWRpdHNcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzLnB1c2godGV4dERvY3VtZW50RWRpdCk7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFRleHRFZGl0Q2hhbmdlSW1wbChlZGl0cywgdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3RleHRFZGl0Q2hhbmdlc1t0ZXh0RG9jdW1lbnQudXJpXSA9IHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmluaXRDaGFuZ2VzKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dvcmtzcGFjZSBlZGl0IGlzIG5vdCBjb25maWd1cmVkIGZvciBub3JtYWwgdGV4dCBlZGl0IGNoYW5nZXMuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5fdGV4dEVkaXRDaGFuZ2VzW2tleV07XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgICAgIGxldCBlZGl0cyA9IFtdO1xuICAgICAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlc1trZXldID0gZWRpdHM7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFRleHRFZGl0Q2hhbmdlSW1wbChlZGl0cyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGV4dEVkaXRDaGFuZ2VzW2tleV0gPSByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgfVxuICAgIGluaXREb2N1bWVudENoYW5nZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcyA9PT0gdW5kZWZpbmVkICYmIHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucyA9IG5ldyBDaGFuZ2VBbm5vdGF0aW9ucygpO1xuICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlQW5ub3RhdGlvbnMgPSB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5hbGwoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpbml0Q2hhbmdlcygpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzID09PSB1bmRlZmluZWQgJiYgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY3JlYXRlRmlsZSh1cmksIG9wdGlvbnNPckFubm90YXRpb24sIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5pbml0RG9jdW1lbnRDaGFuZ2VzKCk7XG4gICAgICAgIGlmICh0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dvcmtzcGFjZSBlZGl0IGlzIG5vdCBjb25maWd1cmVkIGZvciBkb2N1bWVudCBjaGFuZ2VzLicpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhbm5vdGF0aW9uO1xuICAgICAgICBpZiAoQ2hhbmdlQW5ub3RhdGlvbi5pcyhvcHRpb25zT3JBbm5vdGF0aW9uKSB8fCBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhvcHRpb25zT3JBbm5vdGF0aW9uKSkge1xuICAgICAgICAgICAgYW5ub3RhdGlvbiA9IG9wdGlvbnNPckFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvcHRpb25zID0gb3B0aW9uc09yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb3BlcmF0aW9uO1xuICAgICAgICBsZXQgaWQ7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wZXJhdGlvbiA9IENyZWF0ZUZpbGUuY3JlYXRlKHVyaSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZCA9IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGFubm90YXRpb24pID8gYW5ub3RhdGlvbiA6IHRoaXMuX2NoYW5nZUFubm90YXRpb25zLm1hbmFnZShhbm5vdGF0aW9uKTtcbiAgICAgICAgICAgIG9wZXJhdGlvbiA9IENyZWF0ZUZpbGUuY3JlYXRlKHVyaSwgb3B0aW9ucywgaWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzLnB1c2gob3BlcmF0aW9uKTtcbiAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZW5hbWVGaWxlKG9sZFVyaSwgbmV3VXJpLCBvcHRpb25zT3JBbm5vdGF0aW9uLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuaW5pdERvY3VtZW50Q2hhbmdlcygpO1xuICAgICAgICBpZiAodGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXb3Jrc3BhY2UgZWRpdCBpcyBub3QgY29uZmlndXJlZCBmb3IgZG9jdW1lbnQgY2hhbmdlcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYW5ub3RhdGlvbjtcbiAgICAgICAgaWYgKENoYW5nZUFubm90YXRpb24uaXMob3B0aW9uc09yQW5ub3RhdGlvbikgfHwgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMob3B0aW9uc09yQW5ub3RhdGlvbikpIHtcbiAgICAgICAgICAgIGFubm90YXRpb24gPSBvcHRpb25zT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnNPckFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG9wZXJhdGlvbjtcbiAgICAgICAgbGV0IGlkO1xuICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcGVyYXRpb24gPSBSZW5hbWVGaWxlLmNyZWF0ZShvbGRVcmksIG5ld1VyaSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZCA9IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGFubm90YXRpb24pID8gYW5ub3RhdGlvbiA6IHRoaXMuX2NoYW5nZUFubm90YXRpb25zLm1hbmFnZShhbm5vdGF0aW9uKTtcbiAgICAgICAgICAgIG9wZXJhdGlvbiA9IFJlbmFtZUZpbGUuY3JlYXRlKG9sZFVyaSwgbmV3VXJpLCBvcHRpb25zLCBpZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMucHVzaChvcGVyYXRpb24pO1xuICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlbGV0ZUZpbGUodXJpLCBvcHRpb25zT3JBbm5vdGF0aW9uLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuaW5pdERvY3VtZW50Q2hhbmdlcygpO1xuICAgICAgICBpZiAodGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXb3Jrc3BhY2UgZWRpdCBpcyBub3QgY29uZmlndXJlZCBmb3IgZG9jdW1lbnQgY2hhbmdlcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYW5ub3RhdGlvbjtcbiAgICAgICAgaWYgKENoYW5nZUFubm90YXRpb24uaXMob3B0aW9uc09yQW5ub3RhdGlvbikgfHwgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMob3B0aW9uc09yQW5ub3RhdGlvbikpIHtcbiAgICAgICAgICAgIGFubm90YXRpb24gPSBvcHRpb25zT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnNPckFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG9wZXJhdGlvbjtcbiAgICAgICAgbGV0IGlkO1xuICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcGVyYXRpb24gPSBEZWxldGVGaWxlLmNyZWF0ZSh1cmksIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWQgPSBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhhbm5vdGF0aW9uKSA/IGFubm90YXRpb24gOiB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5tYW5hZ2UoYW5ub3RhdGlvbik7XG4gICAgICAgICAgICBvcGVyYXRpb24gPSBEZWxldGVGaWxlLmNyZWF0ZSh1cmksIG9wdGlvbnMsIGlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcy5wdXNoKG9wZXJhdGlvbik7XG4gICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIFRoZSBUZXh0RG9jdW1lbnRJZGVudGlmaWVyIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIFRleHREb2N1bWVudElkZW50aWZpZXJ9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIFRleHREb2N1bWVudElkZW50aWZpZXI7XG4oZnVuY3Rpb24gKFRleHREb2N1bWVudElkZW50aWZpZXIpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFRleHREb2N1bWVudElkZW50aWZpZXIgbGl0ZXJhbC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSBkb2N1bWVudCdzIHVyaS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodXJpKSB7XG4gICAgICAgIHJldHVybiB7IHVyaSB9O1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIFRleHREb2N1bWVudElkZW50aWZpZXJ9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpO1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmlzID0gaXM7XG59KShUZXh0RG9jdW1lbnRJZGVudGlmaWVyIHx8IChUZXh0RG9jdW1lbnRJZGVudGlmaWVyID0ge30pKTtcbi8qKlxuICogVGhlIFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcjtcbihmdW5jdGlvbiAoVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciBsaXRlcmFsLlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIGRvY3VtZW50J3MgdXJpLlxuICAgICAqIEBwYXJhbSB2ZXJzaW9uIFRoZSBkb2N1bWVudCdzIHZlcnNpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHVyaSwgdmVyc2lvbikge1xuICAgICAgICByZXR1cm4geyB1cmksIHZlcnNpb24gfTtcbiAgICB9XG4gICAgVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllci5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudXJpKSAmJiBJcy5pbnRlZ2VyKGNhbmRpZGF0ZS52ZXJzaW9uKTtcbiAgICB9XG4gICAgVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllci5pcyA9IGlzO1xufSkoVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciB8fCAoVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciA9IHt9KSk7XG4vKipcbiAqIFRoZSBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXI7XG4oZnVuY3Rpb24gKE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIGxpdGVyYWwuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgZG9jdW1lbnQncyB1cmkuXG4gICAgICogQHBhcmFtIHZlcnNpb24gVGhlIGRvY3VtZW50J3MgdmVyc2lvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodXJpLCB2ZXJzaW9uKSB7XG4gICAgICAgIHJldHVybiB7IHVyaSwgdmVyc2lvbiB9O1xuICAgIH1cbiAgICBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudXJpKSAmJiAoY2FuZGlkYXRlLnZlcnNpb24gPT09IG51bGwgfHwgSXMuaW50ZWdlcihjYW5kaWRhdGUudmVyc2lvbikpO1xuICAgIH1cbiAgICBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIuaXMgPSBpcztcbn0pKE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciB8fCAoT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyID0ge30pKTtcbi8qKlxuICogVGhlIFRleHREb2N1bWVudEl0ZW0gbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgVGV4dERvY3VtZW50SXRlbX0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgVGV4dERvY3VtZW50SXRlbTtcbihmdW5jdGlvbiAoVGV4dERvY3VtZW50SXRlbSkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgVGV4dERvY3VtZW50SXRlbSBsaXRlcmFsLlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIGRvY3VtZW50J3MgdXJpLlxuICAgICAqIEBwYXJhbSBsYW5ndWFnZUlkIFRoZSBkb2N1bWVudCdzIGxhbmd1YWdlIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHZlcnNpb24gVGhlIGRvY3VtZW50J3MgdmVyc2lvbiBudW1iZXIuXG4gICAgICogQHBhcmFtIHRleHQgVGhlIGRvY3VtZW50J3MgdGV4dC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodXJpLCBsYW5ndWFnZUlkLCB2ZXJzaW9uLCB0ZXh0KSB7XG4gICAgICAgIHJldHVybiB7IHVyaSwgbGFuZ3VhZ2VJZCwgdmVyc2lvbiwgdGV4dCB9O1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnRJdGVtLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIFRleHREb2N1bWVudEl0ZW19IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpICYmIElzLnN0cmluZyhjYW5kaWRhdGUubGFuZ3VhZ2VJZCkgJiYgSXMuaW50ZWdlcihjYW5kaWRhdGUudmVyc2lvbikgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS50ZXh0KTtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50SXRlbS5pcyA9IGlzO1xufSkoVGV4dERvY3VtZW50SXRlbSB8fCAoVGV4dERvY3VtZW50SXRlbSA9IHt9KSk7XG4vKipcbiAqIERlc2NyaWJlcyB0aGUgY29udGVudCB0eXBlIHRoYXQgYSBjbGllbnQgc3VwcG9ydHMgaW4gdmFyaW91c1xuICogcmVzdWx0IGxpdGVyYWxzIGxpa2UgYEhvdmVyYCwgYFBhcmFtZXRlckluZm9gIG9yIGBDb21wbGV0aW9uSXRlbWAuXG4gKlxuICogUGxlYXNlIG5vdGUgdGhhdCBgTWFya3VwS2luZHNgIG11c3Qgbm90IHN0YXJ0IHdpdGggYSBgJGAuIFRoaXMga2luZHNcbiAqIGFyZSByZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNhZ2UuXG4gKi9cbmV4cG9ydCB2YXIgTWFya3VwS2luZDtcbihmdW5jdGlvbiAoTWFya3VwS2luZCkge1xuICAgIC8qKlxuICAgICAqIFBsYWluIHRleHQgaXMgc3VwcG9ydGVkIGFzIGEgY29udGVudCBmb3JtYXRcbiAgICAgKi9cbiAgICBNYXJrdXBLaW5kLlBsYWluVGV4dCA9ICdwbGFpbnRleHQnO1xuICAgIC8qKlxuICAgICAqIE1hcmtkb3duIGlzIHN1cHBvcnRlZCBhcyBhIGNvbnRlbnQgZm9ybWF0XG4gICAgICovXG4gICAgTWFya3VwS2luZC5NYXJrZG93biA9ICdtYXJrZG93bic7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIGlzIGEgdmFsdWUgb2YgdGhlIHtAbGluayBNYXJrdXBLaW5kfSB0eXBlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlID09PSBNYXJrdXBLaW5kLlBsYWluVGV4dCB8fCBjYW5kaWRhdGUgPT09IE1hcmt1cEtpbmQuTWFya2Rvd247XG4gICAgfVxuICAgIE1hcmt1cEtpbmQuaXMgPSBpcztcbn0pKE1hcmt1cEtpbmQgfHwgKE1hcmt1cEtpbmQgPSB7fSkpO1xuZXhwb3J0IHZhciBNYXJrdXBDb250ZW50O1xuKGZ1bmN0aW9uIChNYXJrdXBDb250ZW50KSB7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgTWFya3VwQ29udGVudH0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbCh2YWx1ZSkgJiYgTWFya3VwS2luZC5pcyhjYW5kaWRhdGUua2luZCkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS52YWx1ZSk7XG4gICAgfVxuICAgIE1hcmt1cENvbnRlbnQuaXMgPSBpcztcbn0pKE1hcmt1cENvbnRlbnQgfHwgKE1hcmt1cENvbnRlbnQgPSB7fSkpO1xuLyoqXG4gKiBUaGUga2luZCBvZiBhIGNvbXBsZXRpb24gZW50cnkuXG4gKi9cbmV4cG9ydCB2YXIgQ29tcGxldGlvbkl0ZW1LaW5kO1xuKGZ1bmN0aW9uIChDb21wbGV0aW9uSXRlbUtpbmQpIHtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuVGV4dCA9IDE7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLk1ldGhvZCA9IDI7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkZ1bmN0aW9uID0gMztcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuQ29uc3RydWN0b3IgPSA0O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5GaWVsZCA9IDU7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlZhcmlhYmxlID0gNjtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuQ2xhc3MgPSA3O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5JbnRlcmZhY2UgPSA4O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5Nb2R1bGUgPSA5O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5Qcm9wZXJ0eSA9IDEwO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5Vbml0ID0gMTE7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlZhbHVlID0gMTI7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkVudW0gPSAxMztcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuS2V5d29yZCA9IDE0O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5TbmlwcGV0ID0gMTU7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkNvbG9yID0gMTY7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkZpbGUgPSAxNztcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuUmVmZXJlbmNlID0gMTg7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkZvbGRlciA9IDE5O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5FbnVtTWVtYmVyID0gMjA7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkNvbnN0YW50ID0gMjE7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlN0cnVjdCA9IDIyO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5FdmVudCA9IDIzO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5PcGVyYXRvciA9IDI0O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5UeXBlUGFyYW1ldGVyID0gMjU7XG59KShDb21wbGV0aW9uSXRlbUtpbmQgfHwgKENvbXBsZXRpb25JdGVtS2luZCA9IHt9KSk7XG4vKipcbiAqIERlZmluZXMgd2hldGhlciB0aGUgaW5zZXJ0IHRleHQgaW4gYSBjb21wbGV0aW9uIGl0ZW0gc2hvdWxkIGJlIGludGVycHJldGVkIGFzXG4gKiBwbGFpbiB0ZXh0IG9yIGEgc25pcHBldC5cbiAqL1xuZXhwb3J0IHZhciBJbnNlcnRUZXh0Rm9ybWF0O1xuKGZ1bmN0aW9uIChJbnNlcnRUZXh0Rm9ybWF0KSB7XG4gICAgLyoqXG4gICAgICogVGhlIHByaW1hcnkgdGV4dCB0byBiZSBpbnNlcnRlZCBpcyB0cmVhdGVkIGFzIGEgcGxhaW4gc3RyaW5nLlxuICAgICAqL1xuICAgIEluc2VydFRleHRGb3JtYXQuUGxhaW5UZXh0ID0gMTtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpbWFyeSB0ZXh0IHRvIGJlIGluc2VydGVkIGlzIHRyZWF0ZWQgYXMgYSBzbmlwcGV0LlxuICAgICAqXG4gICAgICogQSBzbmlwcGV0IGNhbiBkZWZpbmUgdGFiIHN0b3BzIGFuZCBwbGFjZWhvbGRlcnMgd2l0aCBgJDFgLCBgJDJgXG4gICAgICogYW5kIGAkezM6Zm9vfWAuIGAkMGAgZGVmaW5lcyB0aGUgZmluYWwgdGFiIHN0b3AsIGl0IGRlZmF1bHRzIHRvXG4gICAgICogdGhlIGVuZCBvZiB0aGUgc25pcHBldC4gUGxhY2Vob2xkZXJzIHdpdGggZXF1YWwgaWRlbnRpZmllcnMgYXJlIGxpbmtlZCxcbiAgICAgKiB0aGF0IGlzIHR5cGluZyBpbiBvbmUgd2lsbCB1cGRhdGUgb3RoZXJzIHRvby5cbiAgICAgKlxuICAgICAqIFNlZSBhbHNvOiBodHRwczovL21pY3Jvc29mdC5naXRodWIuaW8vbGFuZ3VhZ2Utc2VydmVyLXByb3RvY29sL3NwZWNpZmljYXRpb25zL3NwZWNpZmljYXRpb24tY3VycmVudC8jc25pcHBldF9zeW50YXhcbiAgICAgKi9cbiAgICBJbnNlcnRUZXh0Rm9ybWF0LlNuaXBwZXQgPSAyO1xufSkoSW5zZXJ0VGV4dEZvcm1hdCB8fCAoSW5zZXJ0VGV4dEZvcm1hdCA9IHt9KSk7XG4vKipcbiAqIENvbXBsZXRpb24gaXRlbSB0YWdzIGFyZSBleHRyYSBhbm5vdGF0aW9ucyB0aGF0IHR3ZWFrIHRoZSByZW5kZXJpbmcgb2YgYSBjb21wbGV0aW9uXG4gKiBpdGVtLlxuICpcbiAqIEBzaW5jZSAzLjE1LjBcbiAqL1xuZXhwb3J0IHZhciBDb21wbGV0aW9uSXRlbVRhZztcbihmdW5jdGlvbiAoQ29tcGxldGlvbkl0ZW1UYWcpIHtcbiAgICAvKipcbiAgICAgKiBSZW5kZXIgYSBjb21wbGV0aW9uIGFzIG9ic29sZXRlLCB1c3VhbGx5IHVzaW5nIGEgc3RyaWtlLW91dC5cbiAgICAgKi9cbiAgICBDb21wbGV0aW9uSXRlbVRhZy5EZXByZWNhdGVkID0gMTtcbn0pKENvbXBsZXRpb25JdGVtVGFnIHx8IChDb21wbGV0aW9uSXRlbVRhZyA9IHt9KSk7XG4vKipcbiAqIFRoZSBJbnNlcnRSZXBsYWNlRWRpdCBuYW1lc3BhY2UgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCBpbnNlcnQgLyByZXBsYWNlIGVkaXRzLlxuICpcbiAqIEBzaW5jZSAzLjE2LjBcbiAqL1xuZXhwb3J0IHZhciBJbnNlcnRSZXBsYWNlRWRpdDtcbihmdW5jdGlvbiAoSW5zZXJ0UmVwbGFjZUVkaXQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGluc2VydCAvIHJlcGxhY2UgZWRpdFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShuZXdUZXh0LCBpbnNlcnQsIHJlcGxhY2UpIHtcbiAgICAgICAgcmV0dXJuIHsgbmV3VGV4dCwgaW5zZXJ0LCByZXBsYWNlIH07XG4gICAgfVxuICAgIEluc2VydFJlcGxhY2VFZGl0LmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIEluc2VydFJlcGxhY2VFZGl0fSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5uZXdUZXh0KSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUuaW5zZXJ0KSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmVwbGFjZSk7XG4gICAgfVxuICAgIEluc2VydFJlcGxhY2VFZGl0LmlzID0gaXM7XG59KShJbnNlcnRSZXBsYWNlRWRpdCB8fCAoSW5zZXJ0UmVwbGFjZUVkaXQgPSB7fSkpO1xuLyoqXG4gKiBIb3cgd2hpdGVzcGFjZSBhbmQgaW5kZW50YXRpb24gaXMgaGFuZGxlZCBkdXJpbmcgY29tcGxldGlvblxuICogaXRlbSBpbnNlcnRpb24uXG4gKlxuICogQHNpbmNlIDMuMTYuMFxuICovXG5leHBvcnQgdmFyIEluc2VydFRleHRNb2RlO1xuKGZ1bmN0aW9uIChJbnNlcnRUZXh0TW9kZSkge1xuICAgIC8qKlxuICAgICAqIFRoZSBpbnNlcnRpb24gb3IgcmVwbGFjZSBzdHJpbmdzIGlzIHRha2VuIGFzIGl0IGlzLiBJZiB0aGVcbiAgICAgKiB2YWx1ZSBpcyBtdWx0aSBsaW5lIHRoZSBsaW5lcyBiZWxvdyB0aGUgY3Vyc29yIHdpbGwgYmVcbiAgICAgKiBpbnNlcnRlZCB1c2luZyB0aGUgaW5kZW50YXRpb24gZGVmaW5lZCBpbiB0aGUgc3RyaW5nIHZhbHVlLlxuICAgICAqIFRoZSBjbGllbnQgd2lsbCBub3QgYXBwbHkgYW55IGtpbmQgb2YgYWRqdXN0bWVudHMgdG8gdGhlXG4gICAgICogc3RyaW5nLlxuICAgICAqL1xuICAgIEluc2VydFRleHRNb2RlLmFzSXMgPSAxO1xuICAgIC8qKlxuICAgICAqIFRoZSBlZGl0b3IgYWRqdXN0cyBsZWFkaW5nIHdoaXRlc3BhY2Ugb2YgbmV3IGxpbmVzIHNvIHRoYXRcbiAgICAgKiB0aGV5IG1hdGNoIHRoZSBpbmRlbnRhdGlvbiB1cCB0byB0aGUgY3Vyc29yIG9mIHRoZSBsaW5lIGZvclxuICAgICAqIHdoaWNoIHRoZSBpdGVtIGlzIGFjY2VwdGVkLlxuICAgICAqXG4gICAgICogQ29uc2lkZXIgYSBsaW5lIGxpa2UgdGhpczogPDJ0YWJzPjxjdXJzb3I+PDN0YWJzPmZvby4gQWNjZXB0aW5nIGFcbiAgICAgKiBtdWx0aSBsaW5lIGNvbXBsZXRpb24gaXRlbSBpcyBpbmRlbnRlZCB1c2luZyAyIHRhYnMgYW5kIGFsbFxuICAgICAqIGZvbGxvd2luZyBsaW5lcyBpbnNlcnRlZCB3aWxsIGJlIGluZGVudGVkIHVzaW5nIDIgdGFicyBhcyB3ZWxsLlxuICAgICAqL1xuICAgIEluc2VydFRleHRNb2RlLmFkanVzdEluZGVudGF0aW9uID0gMjtcbn0pKEluc2VydFRleHRNb2RlIHx8IChJbnNlcnRUZXh0TW9kZSA9IHt9KSk7XG5leHBvcnQgdmFyIENvbXBsZXRpb25JdGVtTGFiZWxEZXRhaWxzO1xuKGZ1bmN0aW9uIChDb21wbGV0aW9uSXRlbUxhYmVsRGV0YWlscykge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIChJcy5zdHJpbmcoY2FuZGlkYXRlLmRldGFpbCkgfHwgY2FuZGlkYXRlLmRldGFpbCA9PT0gdW5kZWZpbmVkKSAmJlxuICAgICAgICAgICAgKElzLnN0cmluZyhjYW5kaWRhdGUuZGVzY3JpcHRpb24pIHx8IGNhbmRpZGF0ZS5kZXNjcmlwdGlvbiA9PT0gdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgQ29tcGxldGlvbkl0ZW1MYWJlbERldGFpbHMuaXMgPSBpcztcbn0pKENvbXBsZXRpb25JdGVtTGFiZWxEZXRhaWxzIHx8IChDb21wbGV0aW9uSXRlbUxhYmVsRGV0YWlscyA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb21wbGV0aW9uSXRlbSBuYW1lc3BhY2UgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aFxuICogY29tcGxldGlvbiBpdGVtcy5cbiAqL1xuZXhwb3J0IHZhciBDb21wbGV0aW9uSXRlbTtcbihmdW5jdGlvbiAoQ29tcGxldGlvbkl0ZW0pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBjb21wbGV0aW9uIGl0ZW0gYW5kIHNlZWQgaXQgd2l0aCBhIGxhYmVsLlxuICAgICAqIEBwYXJhbSBsYWJlbCBUaGUgY29tcGxldGlvbiBpdGVtJ3MgbGFiZWxcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobGFiZWwpIHtcbiAgICAgICAgcmV0dXJuIHsgbGFiZWwgfTtcbiAgICB9XG4gICAgQ29tcGxldGlvbkl0ZW0uY3JlYXRlID0gY3JlYXRlO1xufSkoQ29tcGxldGlvbkl0ZW0gfHwgKENvbXBsZXRpb25JdGVtID0ge30pKTtcbi8qKlxuICogVGhlIENvbXBsZXRpb25MaXN0IG5hbWVzcGFjZSBwcm92aWRlcyBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoXG4gKiBjb21wbGV0aW9uIGxpc3RzLlxuICovXG5leHBvcnQgdmFyIENvbXBsZXRpb25MaXN0O1xuKGZ1bmN0aW9uIChDb21wbGV0aW9uTGlzdCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgY29tcGxldGlvbiBsaXN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIGl0ZW1zIFRoZSBjb21wbGV0aW9uIGl0ZW1zLlxuICAgICAqIEBwYXJhbSBpc0luY29tcGxldGUgVGhlIGxpc3QgaXMgbm90IGNvbXBsZXRlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShpdGVtcywgaXNJbmNvbXBsZXRlKSB7XG4gICAgICAgIHJldHVybiB7IGl0ZW1zOiBpdGVtcyA/IGl0ZW1zIDogW10sIGlzSW5jb21wbGV0ZTogISFpc0luY29tcGxldGUgfTtcbiAgICB9XG4gICAgQ29tcGxldGlvbkxpc3QuY3JlYXRlID0gY3JlYXRlO1xufSkoQ29tcGxldGlvbkxpc3QgfHwgKENvbXBsZXRpb25MaXN0ID0ge30pKTtcbmV4cG9ydCB2YXIgTWFya2VkU3RyaW5nO1xuKGZ1bmN0aW9uIChNYXJrZWRTdHJpbmcpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbWFya2VkIHN0cmluZyBmcm9tIHBsYWluIHRleHQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGxhaW5UZXh0IFRoZSBwbGFpbiB0ZXh0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZyb21QbGFpblRleHQocGxhaW5UZXh0KSB7XG4gICAgICAgIHJldHVybiBwbGFpblRleHQucmVwbGFjZSgvW1xcXFxgKl97fVtcXF0oKSMrXFwtLiFdL2csICdcXFxcJCYnKTsgLy8gZXNjYXBlIG1hcmtkb3duIHN5bnRheCB0b2tlbnM6IGh0dHA6Ly9kYXJpbmdmaXJlYmFsbC5uZXQvcHJvamVjdHMvbWFya2Rvd24vc3ludGF4I2JhY2tzbGFzaFxuICAgIH1cbiAgICBNYXJrZWRTdHJpbmcuZnJvbVBsYWluVGV4dCA9IGZyb21QbGFpblRleHQ7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgTWFya2VkU3RyaW5nfSB0eXBlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuc3RyaW5nKGNhbmRpZGF0ZSkgfHwgKElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLmxhbmd1YWdlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnZhbHVlKSk7XG4gICAgfVxuICAgIE1hcmtlZFN0cmluZy5pcyA9IGlzO1xufSkoTWFya2VkU3RyaW5nIHx8IChNYXJrZWRTdHJpbmcgPSB7fSkpO1xuZXhwb3J0IHZhciBIb3ZlcjtcbihmdW5jdGlvbiAoSG92ZXIpIHtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgY29uZm9ybXMgdG8gdGhlIHtAbGluayBIb3Zlcn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuICEhY2FuZGlkYXRlICYmIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiAoTWFya3VwQ29udGVudC5pcyhjYW5kaWRhdGUuY29udGVudHMpIHx8XG4gICAgICAgICAgICBNYXJrZWRTdHJpbmcuaXMoY2FuZGlkYXRlLmNvbnRlbnRzKSB8fFxuICAgICAgICAgICAgSXMudHlwZWRBcnJheShjYW5kaWRhdGUuY29udGVudHMsIE1hcmtlZFN0cmluZy5pcykpICYmICh2YWx1ZS5yYW5nZSA9PT0gdW5kZWZpbmVkIHx8IFJhbmdlLmlzKHZhbHVlLnJhbmdlKSk7XG4gICAgfVxuICAgIEhvdmVyLmlzID0gaXM7XG59KShIb3ZlciB8fCAoSG92ZXIgPSB7fSkpO1xuLyoqXG4gKiBUaGUgUGFyYW1ldGVySW5mb3JtYXRpb24gbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgUGFyYW1ldGVySW5mb3JtYXRpb259IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIFBhcmFtZXRlckluZm9ybWF0aW9uO1xuKGZ1bmN0aW9uIChQYXJhbWV0ZXJJbmZvcm1hdGlvbikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgcGFyYW1ldGVyIGluZm9ybWF0aW9uIGxpdGVyYWwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGFiZWwgQSBsYWJlbCBzdHJpbmcuXG4gICAgICogQHBhcmFtIGRvY3VtZW50YXRpb24gQSBkb2Mgc3RyaW5nLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShsYWJlbCwgZG9jdW1lbnRhdGlvbikge1xuICAgICAgICByZXR1cm4gZG9jdW1lbnRhdGlvbiA/IHsgbGFiZWwsIGRvY3VtZW50YXRpb24gfSA6IHsgbGFiZWwgfTtcbiAgICB9XG4gICAgUGFyYW1ldGVySW5mb3JtYXRpb24uY3JlYXRlID0gY3JlYXRlO1xufSkoUGFyYW1ldGVySW5mb3JtYXRpb24gfHwgKFBhcmFtZXRlckluZm9ybWF0aW9uID0ge30pKTtcbi8qKlxuICogVGhlIFNpZ25hdHVyZUluZm9ybWF0aW9uIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIFNpZ25hdHVyZUluZm9ybWF0aW9ufSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBTaWduYXR1cmVJbmZvcm1hdGlvbjtcbihmdW5jdGlvbiAoU2lnbmF0dXJlSW5mb3JtYXRpb24pIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUobGFiZWwsIGRvY3VtZW50YXRpb24sIC4uLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHsgbGFiZWwgfTtcbiAgICAgICAgaWYgKElzLmRlZmluZWQoZG9jdW1lbnRhdGlvbikpIHtcbiAgICAgICAgICAgIHJlc3VsdC5kb2N1bWVudGF0aW9uID0gZG9jdW1lbnRhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXMuZGVmaW5lZChwYXJhbWV0ZXJzKSkge1xuICAgICAgICAgICAgcmVzdWx0LnBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0LnBhcmFtZXRlcnMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBTaWduYXR1cmVJbmZvcm1hdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG59KShTaWduYXR1cmVJbmZvcm1hdGlvbiB8fCAoU2lnbmF0dXJlSW5mb3JtYXRpb24gPSB7fSkpO1xuLyoqXG4gKiBBIGRvY3VtZW50IGhpZ2hsaWdodCBraW5kLlxuICovXG5leHBvcnQgdmFyIERvY3VtZW50SGlnaGxpZ2h0S2luZDtcbihmdW5jdGlvbiAoRG9jdW1lbnRIaWdobGlnaHRLaW5kKSB7XG4gICAgLyoqXG4gICAgICogQSB0ZXh0dWFsIG9jY3VycmVuY2UuXG4gICAgICovXG4gICAgRG9jdW1lbnRIaWdobGlnaHRLaW5kLlRleHQgPSAxO1xuICAgIC8qKlxuICAgICAqIFJlYWQtYWNjZXNzIG9mIGEgc3ltYm9sLCBsaWtlIHJlYWRpbmcgYSB2YXJpYWJsZS5cbiAgICAgKi9cbiAgICBEb2N1bWVudEhpZ2hsaWdodEtpbmQuUmVhZCA9IDI7XG4gICAgLyoqXG4gICAgICogV3JpdGUtYWNjZXNzIG9mIGEgc3ltYm9sLCBsaWtlIHdyaXRpbmcgdG8gYSB2YXJpYWJsZS5cbiAgICAgKi9cbiAgICBEb2N1bWVudEhpZ2hsaWdodEtpbmQuV3JpdGUgPSAzO1xufSkoRG9jdW1lbnRIaWdobGlnaHRLaW5kIHx8IChEb2N1bWVudEhpZ2hsaWdodEtpbmQgPSB7fSkpO1xuLyoqXG4gKiBEb2N1bWVudEhpZ2hsaWdodCBuYW1lc3BhY2UgdG8gcHJvdmlkZSBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIERvY3VtZW50SGlnaGxpZ2h0fSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBEb2N1bWVudEhpZ2hsaWdodDtcbihmdW5jdGlvbiAoRG9jdW1lbnRIaWdobGlnaHQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBEb2N1bWVudEhpZ2hsaWdodCBvYmplY3QuXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSB0aGUgaGlnaGxpZ2h0IGFwcGxpZXMgdG8uXG4gICAgICogQHBhcmFtIGtpbmQgVGhlIGhpZ2hsaWdodCBraW5kXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCBraW5kKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IHJhbmdlIH07XG4gICAgICAgIGlmIChJcy5udW1iZXIoa2luZCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5raW5kID0ga2luZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBEb2N1bWVudEhpZ2hsaWdodC5jcmVhdGUgPSBjcmVhdGU7XG59KShEb2N1bWVudEhpZ2hsaWdodCB8fCAoRG9jdW1lbnRIaWdobGlnaHQgPSB7fSkpO1xuLyoqXG4gKiBBIHN5bWJvbCBraW5kLlxuICovXG5leHBvcnQgdmFyIFN5bWJvbEtpbmQ7XG4oZnVuY3Rpb24gKFN5bWJvbEtpbmQpIHtcbiAgICBTeW1ib2xLaW5kLkZpbGUgPSAxO1xuICAgIFN5bWJvbEtpbmQuTW9kdWxlID0gMjtcbiAgICBTeW1ib2xLaW5kLk5hbWVzcGFjZSA9IDM7XG4gICAgU3ltYm9sS2luZC5QYWNrYWdlID0gNDtcbiAgICBTeW1ib2xLaW5kLkNsYXNzID0gNTtcbiAgICBTeW1ib2xLaW5kLk1ldGhvZCA9IDY7XG4gICAgU3ltYm9sS2luZC5Qcm9wZXJ0eSA9IDc7XG4gICAgU3ltYm9sS2luZC5GaWVsZCA9IDg7XG4gICAgU3ltYm9sS2luZC5Db25zdHJ1Y3RvciA9IDk7XG4gICAgU3ltYm9sS2luZC5FbnVtID0gMTA7XG4gICAgU3ltYm9sS2luZC5JbnRlcmZhY2UgPSAxMTtcbiAgICBTeW1ib2xLaW5kLkZ1bmN0aW9uID0gMTI7XG4gICAgU3ltYm9sS2luZC5WYXJpYWJsZSA9IDEzO1xuICAgIFN5bWJvbEtpbmQuQ29uc3RhbnQgPSAxNDtcbiAgICBTeW1ib2xLaW5kLlN0cmluZyA9IDE1O1xuICAgIFN5bWJvbEtpbmQuTnVtYmVyID0gMTY7XG4gICAgU3ltYm9sS2luZC5Cb29sZWFuID0gMTc7XG4gICAgU3ltYm9sS2luZC5BcnJheSA9IDE4O1xuICAgIFN5bWJvbEtpbmQuT2JqZWN0ID0gMTk7XG4gICAgU3ltYm9sS2luZC5LZXkgPSAyMDtcbiAgICBTeW1ib2xLaW5kLk51bGwgPSAyMTtcbiAgICBTeW1ib2xLaW5kLkVudW1NZW1iZXIgPSAyMjtcbiAgICBTeW1ib2xLaW5kLlN0cnVjdCA9IDIzO1xuICAgIFN5bWJvbEtpbmQuRXZlbnQgPSAyNDtcbiAgICBTeW1ib2xLaW5kLk9wZXJhdG9yID0gMjU7XG4gICAgU3ltYm9sS2luZC5UeXBlUGFyYW1ldGVyID0gMjY7XG59KShTeW1ib2xLaW5kIHx8IChTeW1ib2xLaW5kID0ge30pKTtcbi8qKlxuICogU3ltYm9sIHRhZ3MgYXJlIGV4dHJhIGFubm90YXRpb25zIHRoYXQgdHdlYWsgdGhlIHJlbmRlcmluZyBvZiBhIHN5bWJvbC5cbiAqXG4gKiBAc2luY2UgMy4xNlxuICovXG5leHBvcnQgdmFyIFN5bWJvbFRhZztcbihmdW5jdGlvbiAoU3ltYm9sVGFnKSB7XG4gICAgLyoqXG4gICAgICogUmVuZGVyIGEgc3ltYm9sIGFzIG9ic29sZXRlLCB1c3VhbGx5IHVzaW5nIGEgc3RyaWtlLW91dC5cbiAgICAgKi9cbiAgICBTeW1ib2xUYWcuRGVwcmVjYXRlZCA9IDE7XG59KShTeW1ib2xUYWcgfHwgKFN5bWJvbFRhZyA9IHt9KSk7XG5leHBvcnQgdmFyIFN5bWJvbEluZm9ybWF0aW9uO1xuKGZ1bmN0aW9uIChTeW1ib2xJbmZvcm1hdGlvbikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgc3ltYm9sIGluZm9ybWF0aW9uIGxpdGVyYWwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSBraW5kIFRoZSBraW5kIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSBvZiB0aGUgbG9jYXRpb24gb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSByZXNvdXJjZSBvZiB0aGUgbG9jYXRpb24gb2Ygc3ltYm9sLlxuICAgICAqIEBwYXJhbSBjb250YWluZXJOYW1lIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgY29udGFpbmluZyB0aGUgc3ltYm9sLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShuYW1lLCBraW5kLCByYW5nZSwgdXJpLCBjb250YWluZXJOYW1lKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAga2luZCxcbiAgICAgICAgICAgIGxvY2F0aW9uOiB7IHVyaSwgcmFuZ2UgfVxuICAgICAgICB9O1xuICAgICAgICBpZiAoY29udGFpbmVyTmFtZSkge1xuICAgICAgICAgICAgcmVzdWx0LmNvbnRhaW5lck5hbWUgPSBjb250YWluZXJOYW1lO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIFN5bWJvbEluZm9ybWF0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKFN5bWJvbEluZm9ybWF0aW9uIHx8IChTeW1ib2xJbmZvcm1hdGlvbiA9IHt9KSk7XG5leHBvcnQgdmFyIFdvcmtzcGFjZVN5bWJvbDtcbihmdW5jdGlvbiAoV29ya3NwYWNlU3ltYm9sKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IHdvcmtzcGFjZSBzeW1ib2wuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSBraW5kIFRoZSBraW5kIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgcmVzb3VyY2Ugb2YgdGhlIGxvY2F0aW9uIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIHJhbmdlIEFuIG9wdGlvbnMgcmFuZ2Ugb2YgdGhlIGxvY2F0aW9uLlxuICAgICAqIEByZXR1cm5zIEEgV29ya3NwYWNlU3ltYm9sLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShuYW1lLCBraW5kLCB1cmksIHJhbmdlKSB7XG4gICAgICAgIHJldHVybiByYW5nZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IHsgbmFtZSwga2luZCwgbG9jYXRpb246IHsgdXJpLCByYW5nZSB9IH1cbiAgICAgICAgICAgIDogeyBuYW1lLCBraW5kLCBsb2NhdGlvbjogeyB1cmkgfSB9O1xuICAgIH1cbiAgICBXb3Jrc3BhY2VTeW1ib2wuY3JlYXRlID0gY3JlYXRlO1xufSkoV29ya3NwYWNlU3ltYm9sIHx8IChXb3Jrc3BhY2VTeW1ib2wgPSB7fSkpO1xuZXhwb3J0IHZhciBEb2N1bWVudFN5bWJvbDtcbihmdW5jdGlvbiAoRG9jdW1lbnRTeW1ib2wpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHN5bWJvbCBpbmZvcm1hdGlvbiBsaXRlcmFsLlxuICAgICAqXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gZGV0YWlsIFRoZSBkZXRhaWwgb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0ga2luZCBUaGUga2luZCBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2Ugb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gc2VsZWN0aW9uUmFuZ2UgVGhlIHNlbGVjdGlvblJhbmdlIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIGNoaWxkcmVuIENoaWxkcmVuIG9mIHRoZSBzeW1ib2wuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKG5hbWUsIGRldGFpbCwga2luZCwgcmFuZ2UsIHNlbGVjdGlvblJhbmdlLCBjaGlsZHJlbikge1xuICAgICAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGRldGFpbCxcbiAgICAgICAgICAgIGtpbmQsXG4gICAgICAgICAgICByYW5nZSxcbiAgICAgICAgICAgIHNlbGVjdGlvblJhbmdlXG4gICAgICAgIH07XG4gICAgICAgIGlmIChjaGlsZHJlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBEb2N1bWVudFN5bWJvbC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBEb2N1bWVudFN5bWJvbH0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJlxuICAgICAgICAgICAgSXMuc3RyaW5nKGNhbmRpZGF0ZS5uYW1lKSAmJiBJcy5udW1iZXIoY2FuZGlkYXRlLmtpbmQpICYmXG4gICAgICAgICAgICBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5zZWxlY3Rpb25SYW5nZSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuZGV0YWlsID09PSB1bmRlZmluZWQgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS5kZXRhaWwpKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5kZXByZWNhdGVkID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUuZGVwcmVjYXRlZCkpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmNoaWxkcmVuID09PSB1bmRlZmluZWQgfHwgQXJyYXkuaXNBcnJheShjYW5kaWRhdGUuY2hpbGRyZW4pKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS50YWdzID09PSB1bmRlZmluZWQgfHwgQXJyYXkuaXNBcnJheShjYW5kaWRhdGUudGFncykpO1xuICAgIH1cbiAgICBEb2N1bWVudFN5bWJvbC5pcyA9IGlzO1xufSkoRG9jdW1lbnRTeW1ib2wgfHwgKERvY3VtZW50U3ltYm9sID0ge30pKTtcbi8qKlxuICogQSBzZXQgb2YgcHJlZGVmaW5lZCBjb2RlIGFjdGlvbiBraW5kc1xuICovXG5leHBvcnQgdmFyIENvZGVBY3Rpb25LaW5kO1xuKGZ1bmN0aW9uIChDb2RlQWN0aW9uS2luZCkge1xuICAgIC8qKlxuICAgICAqIEVtcHR5IGtpbmQuXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuRW1wdHkgPSAnJztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIHF1aWNrZml4IGFjdGlvbnM6ICdxdWlja2ZpeCdcbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5RdWlja0ZpeCA9ICdxdWlja2ZpeCc7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciByZWZhY3RvcmluZyBhY3Rpb25zOiAncmVmYWN0b3InXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuUmVmYWN0b3IgPSAncmVmYWN0b3InO1xuICAgIC8qKlxuICAgICAqIEJhc2Uga2luZCBmb3IgcmVmYWN0b3JpbmcgZXh0cmFjdGlvbiBhY3Rpb25zOiAncmVmYWN0b3IuZXh0cmFjdCdcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgZXh0cmFjdCBhY3Rpb25zOlxuICAgICAqXG4gICAgICogLSBFeHRyYWN0IG1ldGhvZFxuICAgICAqIC0gRXh0cmFjdCBmdW5jdGlvblxuICAgICAqIC0gRXh0cmFjdCB2YXJpYWJsZVxuICAgICAqIC0gRXh0cmFjdCBpbnRlcmZhY2UgZnJvbSBjbGFzc1xuICAgICAqIC0gLi4uXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuUmVmYWN0b3JFeHRyYWN0ID0gJ3JlZmFjdG9yLmV4dHJhY3QnO1xuICAgIC8qKlxuICAgICAqIEJhc2Uga2luZCBmb3IgcmVmYWN0b3JpbmcgaW5saW5lIGFjdGlvbnM6ICdyZWZhY3Rvci5pbmxpbmUnXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIGlubGluZSBhY3Rpb25zOlxuICAgICAqXG4gICAgICogLSBJbmxpbmUgZnVuY3Rpb25cbiAgICAgKiAtIElubGluZSB2YXJpYWJsZVxuICAgICAqIC0gSW5saW5lIGNvbnN0YW50XG4gICAgICogLSAuLi5cbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5SZWZhY3RvcklubGluZSA9ICdyZWZhY3Rvci5pbmxpbmUnO1xuICAgIC8qKlxuICAgICAqIEJhc2Uga2luZCBmb3IgcmVmYWN0b3JpbmcgcmV3cml0ZSBhY3Rpb25zOiAncmVmYWN0b3IucmV3cml0ZSdcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgcmV3cml0ZSBhY3Rpb25zOlxuICAgICAqXG4gICAgICogLSBDb252ZXJ0IEphdmFTY3JpcHQgZnVuY3Rpb24gdG8gY2xhc3NcbiAgICAgKiAtIEFkZCBvciByZW1vdmUgcGFyYW1ldGVyXG4gICAgICogLSBFbmNhcHN1bGF0ZSBmaWVsZFxuICAgICAqIC0gTWFrZSBtZXRob2Qgc3RhdGljXG4gICAgICogLSBNb3ZlIG1ldGhvZCB0byBiYXNlIGNsYXNzXG4gICAgICogLSAuLi5cbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5SZWZhY3RvclJld3JpdGUgPSAncmVmYWN0b3IucmV3cml0ZSc7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciBzb3VyY2UgYWN0aW9uczogYHNvdXJjZWBcbiAgICAgKlxuICAgICAqIFNvdXJjZSBjb2RlIGFjdGlvbnMgYXBwbHkgdG8gdGhlIGVudGlyZSBmaWxlLlxuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlNvdXJjZSA9ICdzb3VyY2UnO1xuICAgIC8qKlxuICAgICAqIEJhc2Uga2luZCBmb3IgYW4gb3JnYW5pemUgaW1wb3J0cyBzb3VyY2UgYWN0aW9uOiBgc291cmNlLm9yZ2FuaXplSW1wb3J0c2BcbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5Tb3VyY2VPcmdhbml6ZUltcG9ydHMgPSAnc291cmNlLm9yZ2FuaXplSW1wb3J0cyc7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciBhdXRvLWZpeCBzb3VyY2UgYWN0aW9uczogYHNvdXJjZS5maXhBbGxgLlxuICAgICAqXG4gICAgICogRml4IGFsbCBhY3Rpb25zIGF1dG9tYXRpY2FsbHkgZml4IGVycm9ycyB0aGF0IGhhdmUgYSBjbGVhciBmaXggdGhhdCBkbyBub3QgcmVxdWlyZSB1c2VyIGlucHV0LlxuICAgICAqIFRoZXkgc2hvdWxkIG5vdCBzdXBwcmVzcyBlcnJvcnMgb3IgcGVyZm9ybSB1bnNhZmUgZml4ZXMgc3VjaCBhcyBnZW5lcmF0aW5nIG5ldyB0eXBlcyBvciBjbGFzc2VzLlxuICAgICAqXG4gICAgICogQHNpbmNlIDMuMTUuMFxuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlNvdXJjZUZpeEFsbCA9ICdzb3VyY2UuZml4QWxsJztcbn0pKENvZGVBY3Rpb25LaW5kIHx8IChDb2RlQWN0aW9uS2luZCA9IHt9KSk7XG4vKipcbiAqIFRoZSByZWFzb24gd2h5IGNvZGUgYWN0aW9ucyB3ZXJlIHJlcXVlc3RlZC5cbiAqXG4gKiBAc2luY2UgMy4xNy4wXG4gKi9cbmV4cG9ydCB2YXIgQ29kZUFjdGlvblRyaWdnZXJLaW5kO1xuKGZ1bmN0aW9uIChDb2RlQWN0aW9uVHJpZ2dlcktpbmQpIHtcbiAgICAvKipcbiAgICAgKiBDb2RlIGFjdGlvbnMgd2VyZSBleHBsaWNpdGx5IHJlcXVlc3RlZCBieSB0aGUgdXNlciBvciBieSBhbiBleHRlbnNpb24uXG4gICAgICovXG4gICAgQ29kZUFjdGlvblRyaWdnZXJLaW5kLkludm9rZWQgPSAxO1xuICAgIC8qKlxuICAgICAqIENvZGUgYWN0aW9ucyB3ZXJlIHJlcXVlc3RlZCBhdXRvbWF0aWNhbGx5LlxuICAgICAqXG4gICAgICogVGhpcyB0eXBpY2FsbHkgaGFwcGVucyB3aGVuIGN1cnJlbnQgc2VsZWN0aW9uIGluIGEgZmlsZSBjaGFuZ2VzLCBidXQgY2FuXG4gICAgICogYWxzbyBiZSB0cmlnZ2VyZWQgd2hlbiBmaWxlIGNvbnRlbnQgY2hhbmdlcy5cbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uVHJpZ2dlcktpbmQuQXV0b21hdGljID0gMjtcbn0pKENvZGVBY3Rpb25UcmlnZ2VyS2luZCB8fCAoQ29kZUFjdGlvblRyaWdnZXJLaW5kID0ge30pKTtcbi8qKlxuICogVGhlIENvZGVBY3Rpb25Db250ZXh0IG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIENvZGVBY3Rpb25Db250ZXh0fSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBDb2RlQWN0aW9uQ29udGV4dDtcbihmdW5jdGlvbiAoQ29kZUFjdGlvbkNvbnRleHQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENvZGVBY3Rpb25Db250ZXh0IGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGRpYWdub3N0aWNzLCBvbmx5LCB0cmlnZ2VyS2luZCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0geyBkaWFnbm9zdGljcyB9O1xuICAgICAgICBpZiAob25seSAhPT0gdW5kZWZpbmVkICYmIG9ubHkgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJlc3VsdC5vbmx5ID0gb25seTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJpZ2dlcktpbmQgIT09IHVuZGVmaW5lZCAmJiB0cmlnZ2VyS2luZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmVzdWx0LnRyaWdnZXJLaW5kID0gdHJpZ2dlcktpbmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgQ29kZUFjdGlvbkNvbnRleHQuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgQ29kZUFjdGlvbkNvbnRleHR9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMudHlwZWRBcnJheShjYW5kaWRhdGUuZGlhZ25vc3RpY3MsIERpYWdub3N0aWMuaXMpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLm9ubHkgPT09IHVuZGVmaW5lZCB8fCBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS5vbmx5LCBJcy5zdHJpbmcpKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS50cmlnZ2VyS2luZCA9PT0gdW5kZWZpbmVkIHx8IGNhbmRpZGF0ZS50cmlnZ2VyS2luZCA9PT0gQ29kZUFjdGlvblRyaWdnZXJLaW5kLkludm9rZWQgfHwgY2FuZGlkYXRlLnRyaWdnZXJLaW5kID09PSBDb2RlQWN0aW9uVHJpZ2dlcktpbmQuQXV0b21hdGljKTtcbiAgICB9XG4gICAgQ29kZUFjdGlvbkNvbnRleHQuaXMgPSBpcztcbn0pKENvZGVBY3Rpb25Db250ZXh0IHx8IChDb2RlQWN0aW9uQ29udGV4dCA9IHt9KSk7XG5leHBvcnQgdmFyIENvZGVBY3Rpb247XG4oZnVuY3Rpb24gKENvZGVBY3Rpb24pIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUodGl0bGUsIGtpbmRPckNvbW1hbmRPckVkaXQsIGtpbmQpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHsgdGl0bGUgfTtcbiAgICAgICAgbGV0IGNoZWNrS2luZCA9IHRydWU7XG4gICAgICAgIGlmICh0eXBlb2Yga2luZE9yQ29tbWFuZE9yRWRpdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNoZWNrS2luZCA9IGZhbHNlO1xuICAgICAgICAgICAgcmVzdWx0LmtpbmQgPSBraW5kT3JDb21tYW5kT3JFZGl0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKENvbW1hbmQuaXMoa2luZE9yQ29tbWFuZE9yRWRpdCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5jb21tYW5kID0ga2luZE9yQ29tbWFuZE9yRWRpdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdC5lZGl0ID0ga2luZE9yQ29tbWFuZE9yRWRpdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hlY2tLaW5kICYmIGtpbmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmtpbmQgPSBraW5kO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIENvZGVBY3Rpb24uY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnRpdGxlKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5kaWFnbm9zdGljcyA9PT0gdW5kZWZpbmVkIHx8IElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLmRpYWdub3N0aWNzLCBEaWFnbm9zdGljLmlzKSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUua2luZCA9PT0gdW5kZWZpbmVkIHx8IElzLnN0cmluZyhjYW5kaWRhdGUua2luZCkpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmVkaXQgIT09IHVuZGVmaW5lZCB8fCBjYW5kaWRhdGUuY29tbWFuZCAhPT0gdW5kZWZpbmVkKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5jb21tYW5kID09PSB1bmRlZmluZWQgfHwgQ29tbWFuZC5pcyhjYW5kaWRhdGUuY29tbWFuZCkpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmlzUHJlZmVycmVkID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUuaXNQcmVmZXJyZWQpKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5lZGl0ID09PSB1bmRlZmluZWQgfHwgV29ya3NwYWNlRWRpdC5pcyhjYW5kaWRhdGUuZWRpdCkpO1xuICAgIH1cbiAgICBDb2RlQWN0aW9uLmlzID0gaXM7XG59KShDb2RlQWN0aW9uIHx8IChDb2RlQWN0aW9uID0ge30pKTtcbi8qKlxuICogVGhlIENvZGVMZW5zIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIENvZGVMZW5zfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBDb2RlTGVucztcbihmdW5jdGlvbiAoQ29kZUxlbnMpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENvZGVMZW5zIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCBkYXRhKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IHJhbmdlIH07XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKGRhdGEpKSB7XG4gICAgICAgICAgICByZXN1bHQuZGF0YSA9IGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgQ29kZUxlbnMuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgQ29kZUxlbnN9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5jb21tYW5kKSB8fCBDb21tYW5kLmlzKGNhbmRpZGF0ZS5jb21tYW5kKSk7XG4gICAgfVxuICAgIENvZGVMZW5zLmlzID0gaXM7XG59KShDb2RlTGVucyB8fCAoQ29kZUxlbnMgPSB7fSkpO1xuLyoqXG4gKiBUaGUgRm9ybWF0dGluZ09wdGlvbnMgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgRm9ybWF0dGluZ09wdGlvbnN9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIEZvcm1hdHRpbmdPcHRpb25zO1xuKGZ1bmN0aW9uIChGb3JtYXR0aW5nT3B0aW9ucykge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgRm9ybWF0dGluZ09wdGlvbnMgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodGFiU2l6ZSwgaW5zZXJ0U3BhY2VzKSB7XG4gICAgICAgIHJldHVybiB7IHRhYlNpemUsIGluc2VydFNwYWNlcyB9O1xuICAgIH1cbiAgICBGb3JtYXR0aW5nT3B0aW9ucy5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBGb3JtYXR0aW5nT3B0aW9uc30gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy51aW50ZWdlcihjYW5kaWRhdGUudGFiU2l6ZSkgJiYgSXMuYm9vbGVhbihjYW5kaWRhdGUuaW5zZXJ0U3BhY2VzKTtcbiAgICB9XG4gICAgRm9ybWF0dGluZ09wdGlvbnMuaXMgPSBpcztcbn0pKEZvcm1hdHRpbmdPcHRpb25zIHx8IChGb3JtYXR0aW5nT3B0aW9ucyA9IHt9KSk7XG4vKipcbiAqIFRoZSBEb2N1bWVudExpbmsgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgRG9jdW1lbnRMaW5rfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBEb2N1bWVudExpbms7XG4oZnVuY3Rpb24gKERvY3VtZW50TGluaykge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgRG9jdW1lbnRMaW5rIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCB0YXJnZXQsIGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIHRhcmdldCwgZGF0YSB9O1xuICAgIH1cbiAgICBEb2N1bWVudExpbmsuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgRG9jdW1lbnRMaW5rfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUudGFyZ2V0KSB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLnRhcmdldCkpO1xuICAgIH1cbiAgICBEb2N1bWVudExpbmsuaXMgPSBpcztcbn0pKERvY3VtZW50TGluayB8fCAoRG9jdW1lbnRMaW5rID0ge30pKTtcbi8qKlxuICogVGhlIFNlbGVjdGlvblJhbmdlIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb24gdG8gd29yayB3aXRoXG4gKiBTZWxlY3Rpb25SYW5nZSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBTZWxlY3Rpb25SYW5nZTtcbihmdW5jdGlvbiAoU2VsZWN0aW9uUmFuZ2UpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFNlbGVjdGlvblJhbmdlXG4gICAgICogQHBhcmFtIHJhbmdlIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0gcGFyZW50IGFuIG9wdGlvbmFsIHBhcmVudC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIHBhcmVudCkge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgcGFyZW50IH07XG4gICAgfVxuICAgIFNlbGVjdGlvblJhbmdlLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiAoY2FuZGlkYXRlLnBhcmVudCA9PT0gdW5kZWZpbmVkIHx8IFNlbGVjdGlvblJhbmdlLmlzKGNhbmRpZGF0ZS5wYXJlbnQpKTtcbiAgICB9XG4gICAgU2VsZWN0aW9uUmFuZ2UuaXMgPSBpcztcbn0pKFNlbGVjdGlvblJhbmdlIHx8IChTZWxlY3Rpb25SYW5nZSA9IHt9KSk7XG4vKipcbiAqIEEgc2V0IG9mIHByZWRlZmluZWQgdG9rZW4gdHlwZXMuIFRoaXMgc2V0IGlzIG5vdCBmaXhlZFxuICogYW4gY2xpZW50cyBjYW4gc3BlY2lmeSBhZGRpdGlvbmFsIHRva2VuIHR5cGVzIHZpYSB0aGVcbiAqIGNvcnJlc3BvbmRpbmcgY2xpZW50IGNhcGFiaWxpdGllcy5cbiAqXG4gKiBAc2luY2UgMy4xNi4wXG4gKi9cbmV4cG9ydCB2YXIgU2VtYW50aWNUb2tlblR5cGVzO1xuKGZ1bmN0aW9uIChTZW1hbnRpY1Rva2VuVHlwZXMpIHtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJuYW1lc3BhY2VcIl0gPSBcIm5hbWVzcGFjZVwiO1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBnZW5lcmljIHR5cGUuIEFjdHMgYXMgYSBmYWxsYmFjayBmb3IgdHlwZXMgd2hpY2ggY2FuJ3QgYmUgbWFwcGVkIHRvXG4gICAgICogYSBzcGVjaWZpYyB0eXBlIGxpa2UgY2xhc3Mgb3IgZW51bS5cbiAgICAgKi9cbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJ0eXBlXCJdID0gXCJ0eXBlXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wiY2xhc3NcIl0gPSBcImNsYXNzXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wiZW51bVwiXSA9IFwiZW51bVwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImludGVyZmFjZVwiXSA9IFwiaW50ZXJmYWNlXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wic3RydWN0XCJdID0gXCJzdHJ1Y3RcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJ0eXBlUGFyYW1ldGVyXCJdID0gXCJ0eXBlUGFyYW1ldGVyXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wicGFyYW1ldGVyXCJdID0gXCJwYXJhbWV0ZXJcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJ2YXJpYWJsZVwiXSA9IFwidmFyaWFibGVcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJwcm9wZXJ0eVwiXSA9IFwicHJvcGVydHlcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJlbnVtTWVtYmVyXCJdID0gXCJlbnVtTWVtYmVyXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wiZXZlbnRcIl0gPSBcImV2ZW50XCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wiZnVuY3Rpb25cIl0gPSBcImZ1bmN0aW9uXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wibWV0aG9kXCJdID0gXCJtZXRob2RcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJtYWNyb1wiXSA9IFwibWFjcm9cIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJrZXl3b3JkXCJdID0gXCJrZXl3b3JkXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wibW9kaWZpZXJcIl0gPSBcIm1vZGlmaWVyXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wiY29tbWVudFwiXSA9IFwiY29tbWVudFwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInN0cmluZ1wiXSA9IFwic3RyaW5nXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wibnVtYmVyXCJdID0gXCJudW1iZXJcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJyZWdleHBcIl0gPSBcInJlZ2V4cFwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcIm9wZXJhdG9yXCJdID0gXCJvcGVyYXRvclwiO1xuICAgIC8qKlxuICAgICAqIEBzaW5jZSAzLjE3LjBcbiAgICAgKi9cbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJkZWNvcmF0b3JcIl0gPSBcImRlY29yYXRvclwiO1xufSkoU2VtYW50aWNUb2tlblR5cGVzIHx8IChTZW1hbnRpY1Rva2VuVHlwZXMgPSB7fSkpO1xuLyoqXG4gKiBBIHNldCBvZiBwcmVkZWZpbmVkIHRva2VuIG1vZGlmaWVycy4gVGhpcyBzZXQgaXMgbm90IGZpeGVkXG4gKiBhbiBjbGllbnRzIGNhbiBzcGVjaWZ5IGFkZGl0aW9uYWwgdG9rZW4gdHlwZXMgdmlhIHRoZVxuICogY29ycmVzcG9uZGluZyBjbGllbnQgY2FwYWJpbGl0aWVzLlxuICpcbiAqIEBzaW5jZSAzLjE2LjBcbiAqL1xuZXhwb3J0IHZhciBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzO1xuKGZ1bmN0aW9uIChTZW1hbnRpY1Rva2VuTW9kaWZpZXJzKSB7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcImRlY2xhcmF0aW9uXCJdID0gXCJkZWNsYXJhdGlvblwiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJkZWZpbml0aW9uXCJdID0gXCJkZWZpbml0aW9uXCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcInJlYWRvbmx5XCJdID0gXCJyZWFkb25seVwiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJzdGF0aWNcIl0gPSBcInN0YXRpY1wiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJkZXByZWNhdGVkXCJdID0gXCJkZXByZWNhdGVkXCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcImFic3RyYWN0XCJdID0gXCJhYnN0cmFjdFwiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJhc3luY1wiXSA9IFwiYXN5bmNcIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wibW9kaWZpY2F0aW9uXCJdID0gXCJtb2RpZmljYXRpb25cIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wiZG9jdW1lbnRhdGlvblwiXSA9IFwiZG9jdW1lbnRhdGlvblwiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJkZWZhdWx0TGlicmFyeVwiXSA9IFwiZGVmYXVsdExpYnJhcnlcIjtcbn0pKFNlbWFudGljVG9rZW5Nb2RpZmllcnMgfHwgKFNlbWFudGljVG9rZW5Nb2RpZmllcnMgPSB7fSkpO1xuLyoqXG4gKiBAc2luY2UgMy4xNi4wXG4gKi9cbmV4cG9ydCB2YXIgU2VtYW50aWNUb2tlbnM7XG4oZnVuY3Rpb24gKFNlbWFudGljVG9rZW5zKSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgKGNhbmRpZGF0ZS5yZXN1bHRJZCA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBjYW5kaWRhdGUucmVzdWx0SWQgPT09ICdzdHJpbmcnKSAmJlxuICAgICAgICAgICAgQXJyYXkuaXNBcnJheShjYW5kaWRhdGUuZGF0YSkgJiYgKGNhbmRpZGF0ZS5kYXRhLmxlbmd0aCA9PT0gMCB8fCB0eXBlb2YgY2FuZGlkYXRlLmRhdGFbMF0gPT09ICdudW1iZXInKTtcbiAgICB9XG4gICAgU2VtYW50aWNUb2tlbnMuaXMgPSBpcztcbn0pKFNlbWFudGljVG9rZW5zIHx8IChTZW1hbnRpY1Rva2VucyA9IHt9KSk7XG4vKipcbiAqIFRoZSBJbmxpbmVWYWx1ZVRleHQgbmFtZXNwYWNlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGggSW5saW5lVmFsdWVUZXh0cy5cbiAqXG4gKiBAc2luY2UgMy4xNy4wXG4gKi9cbmV4cG9ydCB2YXIgSW5saW5lVmFsdWVUZXh0O1xuKGZ1bmN0aW9uIChJbmxpbmVWYWx1ZVRleHQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IElubGluZVZhbHVlVGV4dCBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgdGV4dCkge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgdGV4dCB9O1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZVRleHQuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICE9PSB1bmRlZmluZWQgJiYgY2FuZGlkYXRlICE9PSBudWxsICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS50ZXh0KTtcbiAgICB9XG4gICAgSW5saW5lVmFsdWVUZXh0LmlzID0gaXM7XG59KShJbmxpbmVWYWx1ZVRleHQgfHwgKElubGluZVZhbHVlVGV4dCA9IHt9KSk7XG4vKipcbiAqIFRoZSBJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwIG5hbWVzcGFjZSBwcm92aWRlcyBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIElubGluZVZhbHVlVmFyaWFibGVMb29rdXBzLlxuICpcbiAqIEBzaW5jZSAzLjE3LjBcbiAqL1xuZXhwb3J0IHZhciBJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwO1xuKGZ1bmN0aW9uIChJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBJbmxpbmVWYWx1ZVRleHQgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIHZhcmlhYmxlTmFtZSwgY2FzZVNlbnNpdGl2ZUxvb2t1cCkge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgdmFyaWFibGVOYW1lLCBjYXNlU2Vuc2l0aXZlTG9va3VwIH07XG4gICAgfVxuICAgIElubGluZVZhbHVlVmFyaWFibGVMb29rdXAuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICE9PSB1bmRlZmluZWQgJiYgY2FuZGlkYXRlICE9PSBudWxsICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgSXMuYm9vbGVhbihjYW5kaWRhdGUuY2FzZVNlbnNpdGl2ZUxvb2t1cClcbiAgICAgICAgICAgICYmIChJcy5zdHJpbmcoY2FuZGlkYXRlLnZhcmlhYmxlTmFtZSkgfHwgY2FuZGlkYXRlLnZhcmlhYmxlTmFtZSA9PT0gdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cC5pcyA9IGlzO1xufSkoSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cCB8fCAoSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cCA9IHt9KSk7XG4vKipcbiAqIFRoZSBJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbiBuYW1lc3BhY2UgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCBJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbi5cbiAqXG4gKiBAc2luY2UgMy4xNy4wXG4gKi9cbmV4cG9ydCB2YXIgSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb247XG4oZnVuY3Rpb24gKElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbiBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgZXhwcmVzc2lvbikge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgZXhwcmVzc2lvbiB9O1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgIT09IHVuZGVmaW5lZCAmJiBjYW5kaWRhdGUgIT09IG51bGwgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKVxuICAgICAgICAgICAgJiYgKElzLnN0cmluZyhjYW5kaWRhdGUuZXhwcmVzc2lvbikgfHwgY2FuZGlkYXRlLmV4cHJlc3Npb24gPT09IHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uLmlzID0gaXM7XG59KShJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbiB8fCAoSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24gPSB7fSkpO1xuLyoqXG4gKiBUaGUgSW5saW5lVmFsdWVDb250ZXh0IG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIElubGluZVZhbHVlQ29udGV4dH0gbGl0ZXJhbHMuXG4gKlxuICogQHNpbmNlIDMuMTcuMFxuICovXG5leHBvcnQgdmFyIElubGluZVZhbHVlQ29udGV4dDtcbihmdW5jdGlvbiAoSW5saW5lVmFsdWVDb250ZXh0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBJbmxpbmVWYWx1ZUNvbnRleHQgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUoZnJhbWVJZCwgc3RvcHBlZExvY2F0aW9uKSB7XG4gICAgICAgIHJldHVybiB7IGZyYW1lSWQsIHN0b3BwZWRMb2NhdGlvbiB9O1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZUNvbnRleHQuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgSW5saW5lVmFsdWVDb250ZXh0fSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgUmFuZ2UuaXModmFsdWUuc3RvcHBlZExvY2F0aW9uKTtcbiAgICB9XG4gICAgSW5saW5lVmFsdWVDb250ZXh0LmlzID0gaXM7XG59KShJbmxpbmVWYWx1ZUNvbnRleHQgfHwgKElubGluZVZhbHVlQ29udGV4dCA9IHt9KSk7XG4vKipcbiAqIElubGF5IGhpbnQga2luZHMuXG4gKlxuICogQHNpbmNlIDMuMTcuMFxuICovXG5leHBvcnQgdmFyIElubGF5SGludEtpbmQ7XG4oZnVuY3Rpb24gKElubGF5SGludEtpbmQpIHtcbiAgICAvKipcbiAgICAgKiBBbiBpbmxheSBoaW50IHRoYXQgZm9yIGEgdHlwZSBhbm5vdGF0aW9uLlxuICAgICAqL1xuICAgIElubGF5SGludEtpbmQuVHlwZSA9IDE7XG4gICAgLyoqXG4gICAgICogQW4gaW5sYXkgaGludCB0aGF0IGlzIGZvciBhIHBhcmFtZXRlci5cbiAgICAgKi9cbiAgICBJbmxheUhpbnRLaW5kLlBhcmFtZXRlciA9IDI7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSAxIHx8IHZhbHVlID09PSAyO1xuICAgIH1cbiAgICBJbmxheUhpbnRLaW5kLmlzID0gaXM7XG59KShJbmxheUhpbnRLaW5kIHx8IChJbmxheUhpbnRLaW5kID0ge30pKTtcbmV4cG9ydCB2YXIgSW5sYXlIaW50TGFiZWxQYXJ0O1xuKGZ1bmN0aW9uIChJbmxheUhpbnRMYWJlbFBhcnQpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHsgdmFsdWUgfTtcbiAgICB9XG4gICAgSW5sYXlIaW50TGFiZWxQYXJ0LmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS50b29sdGlwID09PSB1bmRlZmluZWQgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS50b29sdGlwKSB8fCBNYXJrdXBDb250ZW50LmlzKGNhbmRpZGF0ZS50b29sdGlwKSlcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUubG9jYXRpb24gPT09IHVuZGVmaW5lZCB8fCBMb2NhdGlvbi5pcyhjYW5kaWRhdGUubG9jYXRpb24pKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS5jb21tYW5kID09PSB1bmRlZmluZWQgfHwgQ29tbWFuZC5pcyhjYW5kaWRhdGUuY29tbWFuZCkpO1xuICAgIH1cbiAgICBJbmxheUhpbnRMYWJlbFBhcnQuaXMgPSBpcztcbn0pKElubGF5SGludExhYmVsUGFydCB8fCAoSW5sYXlIaW50TGFiZWxQYXJ0ID0ge30pKTtcbmV4cG9ydCB2YXIgSW5sYXlIaW50O1xuKGZ1bmN0aW9uIChJbmxheUhpbnQpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUocG9zaXRpb24sIGxhYmVsLCBraW5kKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHsgcG9zaXRpb24sIGxhYmVsIH07XG4gICAgICAgIGlmIChraW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5raW5kID0ga2luZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBJbmxheUhpbnQuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIFBvc2l0aW9uLmlzKGNhbmRpZGF0ZS5wb3NpdGlvbilcbiAgICAgICAgICAgICYmIChJcy5zdHJpbmcoY2FuZGlkYXRlLmxhYmVsKSB8fCBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS5sYWJlbCwgSW5sYXlIaW50TGFiZWxQYXJ0LmlzKSlcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUua2luZCA9PT0gdW5kZWZpbmVkIHx8IElubGF5SGludEtpbmQuaXMoY2FuZGlkYXRlLmtpbmQpKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS50ZXh0RWRpdHMgPT09IHVuZGVmaW5lZCkgfHwgSXMudHlwZWRBcnJheShjYW5kaWRhdGUudGV4dEVkaXRzLCBUZXh0RWRpdC5pcylcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUudG9vbHRpcCA9PT0gdW5kZWZpbmVkIHx8IElzLnN0cmluZyhjYW5kaWRhdGUudG9vbHRpcCkgfHwgTWFya3VwQ29udGVudC5pcyhjYW5kaWRhdGUudG9vbHRpcCkpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLnBhZGRpbmdMZWZ0ID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUucGFkZGluZ0xlZnQpKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS5wYWRkaW5nUmlnaHQgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5wYWRkaW5nUmlnaHQpKTtcbiAgICB9XG4gICAgSW5sYXlIaW50LmlzID0gaXM7XG59KShJbmxheUhpbnQgfHwgKElubGF5SGludCA9IHt9KSk7XG5leHBvcnQgdmFyIFN0cmluZ1ZhbHVlO1xuKGZ1bmN0aW9uIChTdHJpbmdWYWx1ZSkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVNuaXBwZXQodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHsga2luZDogJ3NuaXBwZXQnLCB2YWx1ZSB9O1xuICAgIH1cbiAgICBTdHJpbmdWYWx1ZS5jcmVhdGVTbmlwcGV0ID0gY3JlYXRlU25pcHBldDtcbn0pKFN0cmluZ1ZhbHVlIHx8IChTdHJpbmdWYWx1ZSA9IHt9KSk7XG5leHBvcnQgdmFyIElubGluZUNvbXBsZXRpb25JdGVtO1xuKGZ1bmN0aW9uIChJbmxpbmVDb21wbGV0aW9uSXRlbSkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShpbnNlcnRUZXh0LCBmaWx0ZXJUZXh0LCByYW5nZSwgY29tbWFuZCkge1xuICAgICAgICByZXR1cm4geyBpbnNlcnRUZXh0LCBmaWx0ZXJUZXh0LCByYW5nZSwgY29tbWFuZCB9O1xuICAgIH1cbiAgICBJbmxpbmVDb21wbGV0aW9uSXRlbS5jcmVhdGUgPSBjcmVhdGU7XG59KShJbmxpbmVDb21wbGV0aW9uSXRlbSB8fCAoSW5saW5lQ29tcGxldGlvbkl0ZW0gPSB7fSkpO1xuZXhwb3J0IHZhciBJbmxpbmVDb21wbGV0aW9uTGlzdDtcbihmdW5jdGlvbiAoSW5saW5lQ29tcGxldGlvbkxpc3QpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUoaXRlbXMpIHtcbiAgICAgICAgcmV0dXJuIHsgaXRlbXMgfTtcbiAgICB9XG4gICAgSW5saW5lQ29tcGxldGlvbkxpc3QuY3JlYXRlID0gY3JlYXRlO1xufSkoSW5saW5lQ29tcGxldGlvbkxpc3QgfHwgKElubGluZUNvbXBsZXRpb25MaXN0ID0ge30pKTtcbi8qKlxuICogRGVzY3JpYmVzIGhvdyBhbiB7QGxpbmsgSW5saW5lQ29tcGxldGlvbkl0ZW1Qcm92aWRlciBpbmxpbmUgY29tcGxldGlvbiBwcm92aWRlcn0gd2FzIHRyaWdnZXJlZC5cbiAqXG4gKiBAc2luY2UgMy4xOC4wXG4gKiBAcHJvcG9zZWRcbiAqL1xuZXhwb3J0IHZhciBJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmQ7XG4oZnVuY3Rpb24gKElubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZCkge1xuICAgIC8qKlxuICAgICAqIENvbXBsZXRpb24gd2FzIHRyaWdnZXJlZCBleHBsaWNpdGx5IGJ5IGEgdXNlciBnZXN0dXJlLlxuICAgICAqL1xuICAgIElubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZC5JbnZva2VkID0gMDtcbiAgICAvKipcbiAgICAgKiBDb21wbGV0aW9uIHdhcyB0cmlnZ2VyZWQgYXV0b21hdGljYWxseSB3aGlsZSBlZGl0aW5nLlxuICAgICAqL1xuICAgIElubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZC5BdXRvbWF0aWMgPSAxO1xufSkoSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kIHx8IChJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmQgPSB7fSkpO1xuZXhwb3J0IHZhciBTZWxlY3RlZENvbXBsZXRpb25JbmZvO1xuKGZ1bmN0aW9uIChTZWxlY3RlZENvbXBsZXRpb25JbmZvKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCB0ZXh0KSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCB0ZXh0IH07XG4gICAgfVxuICAgIFNlbGVjdGVkQ29tcGxldGlvbkluZm8uY3JlYXRlID0gY3JlYXRlO1xufSkoU2VsZWN0ZWRDb21wbGV0aW9uSW5mbyB8fCAoU2VsZWN0ZWRDb21wbGV0aW9uSW5mbyA9IHt9KSk7XG5leHBvcnQgdmFyIElubGluZUNvbXBsZXRpb25Db250ZXh0O1xuKGZ1bmN0aW9uIChJbmxpbmVDb21wbGV0aW9uQ29udGV4dCkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh0cmlnZ2VyS2luZCwgc2VsZWN0ZWRDb21wbGV0aW9uSW5mbykge1xuICAgICAgICByZXR1cm4geyB0cmlnZ2VyS2luZCwgc2VsZWN0ZWRDb21wbGV0aW9uSW5mbyB9O1xuICAgIH1cbiAgICBJbmxpbmVDb21wbGV0aW9uQ29udGV4dC5jcmVhdGUgPSBjcmVhdGU7XG59KShJbmxpbmVDb21wbGV0aW9uQ29udGV4dCB8fCAoSW5saW5lQ29tcGxldGlvbkNvbnRleHQgPSB7fSkpO1xuZXhwb3J0IHZhciBXb3Jrc3BhY2VGb2xkZXI7XG4oZnVuY3Rpb24gKFdvcmtzcGFjZUZvbGRlcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIFVSSS5pcyhjYW5kaWRhdGUudXJpKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLm5hbWUpO1xuICAgIH1cbiAgICBXb3Jrc3BhY2VGb2xkZXIuaXMgPSBpcztcbn0pKFdvcmtzcGFjZUZvbGRlciB8fCAoV29ya3NwYWNlRm9sZGVyID0ge30pKTtcbmV4cG9ydCBjb25zdCBFT0wgPSBbJ1xcbicsICdcXHJcXG4nLCAnXFxyJ107XG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSB0aGUgdGV4dCBkb2N1bWVudCBmcm9tIHRoZSBuZXcgdnNjb2RlLWxhbmd1YWdlc2VydmVyLXRleHRkb2N1bWVudCBwYWNrYWdlLlxuICovXG5leHBvcnQgdmFyIFRleHREb2N1bWVudDtcbihmdW5jdGlvbiAoVGV4dERvY3VtZW50KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBJVGV4dERvY3VtZW50IGxpdGVyYWwgZnJvbSB0aGUgZ2l2ZW4gdXJpIGFuZCBjb250ZW50LlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIGRvY3VtZW50J3MgdXJpLlxuICAgICAqIEBwYXJhbSBsYW5ndWFnZUlkIFRoZSBkb2N1bWVudCdzIGxhbmd1YWdlIElkLlxuICAgICAqIEBwYXJhbSB2ZXJzaW9uIFRoZSBkb2N1bWVudCdzIHZlcnNpb24uXG4gICAgICogQHBhcmFtIGNvbnRlbnQgVGhlIGRvY3VtZW50J3MgY29udGVudC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodXJpLCBsYW5ndWFnZUlkLCB2ZXJzaW9uLCBjb250ZW50KSB7XG4gICAgICAgIHJldHVybiBuZXcgRnVsbFRleHREb2N1bWVudCh1cmksIGxhbmd1YWdlSWQsIHZlcnNpb24sIGNvbnRlbnQpO1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnQuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgSVRleHREb2N1bWVudH0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSkgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUubGFuZ3VhZ2VJZCkgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS5sYW5ndWFnZUlkKSkgJiYgSXMudWludGVnZXIoY2FuZGlkYXRlLmxpbmVDb3VudClcbiAgICAgICAgICAgICYmIElzLmZ1bmMoY2FuZGlkYXRlLmdldFRleHQpICYmIElzLmZ1bmMoY2FuZGlkYXRlLnBvc2l0aW9uQXQpICYmIElzLmZ1bmMoY2FuZGlkYXRlLm9mZnNldEF0KSA/IHRydWUgOiBmYWxzZTtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50LmlzID0gaXM7XG4gICAgZnVuY3Rpb24gYXBwbHlFZGl0cyhkb2N1bWVudCwgZWRpdHMpIHtcbiAgICAgICAgbGV0IHRleHQgPSBkb2N1bWVudC5nZXRUZXh0KCk7XG4gICAgICAgIGxldCBzb3J0ZWRFZGl0cyA9IG1lcmdlU29ydChlZGl0cywgKGEsIGIpID0+IHtcbiAgICAgICAgICAgIGxldCBkaWZmID0gYS5yYW5nZS5zdGFydC5saW5lIC0gYi5yYW5nZS5zdGFydC5saW5lO1xuICAgICAgICAgICAgaWYgKGRpZmYgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYS5yYW5nZS5zdGFydC5jaGFyYWN0ZXIgLSBiLnJhbmdlLnN0YXJ0LmNoYXJhY3RlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBkaWZmO1xuICAgICAgICB9KTtcbiAgICAgICAgbGV0IGxhc3RNb2RpZmllZE9mZnNldCA9IHRleHQubGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBpID0gc29ydGVkRWRpdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGxldCBlID0gc29ydGVkRWRpdHNbaV07XG4gICAgICAgICAgICBsZXQgc3RhcnRPZmZzZXQgPSBkb2N1bWVudC5vZmZzZXRBdChlLnJhbmdlLnN0YXJ0KTtcbiAgICAgICAgICAgIGxldCBlbmRPZmZzZXQgPSBkb2N1bWVudC5vZmZzZXRBdChlLnJhbmdlLmVuZCk7XG4gICAgICAgICAgICBpZiAoZW5kT2Zmc2V0IDw9IGxhc3RNb2RpZmllZE9mZnNldCkge1xuICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cmluZygwLCBzdGFydE9mZnNldCkgKyBlLm5ld1RleHQgKyB0ZXh0LnN1YnN0cmluZyhlbmRPZmZzZXQsIHRleHQubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignT3ZlcmxhcHBpbmcgZWRpdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkT2Zmc2V0ID0gc3RhcnRPZmZzZXQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuICAgIFRleHREb2N1bWVudC5hcHBseUVkaXRzID0gYXBwbHlFZGl0cztcbiAgICBmdW5jdGlvbiBtZXJnZVNvcnQoZGF0YSwgY29tcGFyZSkge1xuICAgICAgICBpZiAoZGF0YS5sZW5ndGggPD0gMSkge1xuICAgICAgICAgICAgLy8gc29ydGVkXG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwID0gKGRhdGEubGVuZ3RoIC8gMikgfCAwO1xuICAgICAgICBjb25zdCBsZWZ0ID0gZGF0YS5zbGljZSgwLCBwKTtcbiAgICAgICAgY29uc3QgcmlnaHQgPSBkYXRhLnNsaWNlKHApO1xuICAgICAgICBtZXJnZVNvcnQobGVmdCwgY29tcGFyZSk7XG4gICAgICAgIG1lcmdlU29ydChyaWdodCwgY29tcGFyZSk7XG4gICAgICAgIGxldCBsZWZ0SWR4ID0gMDtcbiAgICAgICAgbGV0IHJpZ2h0SWR4ID0gMDtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICB3aGlsZSAobGVmdElkeCA8IGxlZnQubGVuZ3RoICYmIHJpZ2h0SWR4IDwgcmlnaHQubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgcmV0ID0gY29tcGFyZShsZWZ0W2xlZnRJZHhdLCByaWdodFtyaWdodElkeF0pO1xuICAgICAgICAgICAgaWYgKHJldCA8PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gc21hbGxlcl9lcXVhbCAtPiB0YWtlIGxlZnQgdG8gcHJlc2VydmUgb3JkZXJcbiAgICAgICAgICAgICAgICBkYXRhW2krK10gPSBsZWZ0W2xlZnRJZHgrK107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBncmVhdGVyIC0+IHRha2UgcmlnaHRcbiAgICAgICAgICAgICAgICBkYXRhW2krK10gPSByaWdodFtyaWdodElkeCsrXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAobGVmdElkeCA8IGxlZnQubGVuZ3RoKSB7XG4gICAgICAgICAgICBkYXRhW2krK10gPSBsZWZ0W2xlZnRJZHgrK107XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKHJpZ2h0SWR4IDwgcmlnaHQubGVuZ3RoKSB7XG4gICAgICAgICAgICBkYXRhW2krK10gPSByaWdodFtyaWdodElkeCsrXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG59KShUZXh0RG9jdW1lbnQgfHwgKFRleHREb2N1bWVudCA9IHt9KSk7XG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSB0aGUgdGV4dCBkb2N1bWVudCBmcm9tIHRoZSBuZXcgdnNjb2RlLWxhbmd1YWdlc2VydmVyLXRleHRkb2N1bWVudCBwYWNrYWdlLlxuICovXG5jbGFzcyBGdWxsVGV4dERvY3VtZW50IHtcbiAgICBjb25zdHJ1Y3Rvcih1cmksIGxhbmd1YWdlSWQsIHZlcnNpb24sIGNvbnRlbnQpIHtcbiAgICAgICAgdGhpcy5fdXJpID0gdXJpO1xuICAgICAgICB0aGlzLl9sYW5ndWFnZUlkID0gbGFuZ3VhZ2VJZDtcbiAgICAgICAgdGhpcy5fdmVyc2lvbiA9IHZlcnNpb247XG4gICAgICAgIHRoaXMuX2NvbnRlbnQgPSBjb250ZW50O1xuICAgICAgICB0aGlzLl9saW5lT2Zmc2V0cyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZ2V0IHVyaSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VyaTtcbiAgICB9XG4gICAgZ2V0IGxhbmd1YWdlSWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sYW5ndWFnZUlkO1xuICAgIH1cbiAgICBnZXQgdmVyc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZlcnNpb247XG4gICAgfVxuICAgIGdldFRleHQocmFuZ2UpIHtcbiAgICAgICAgaWYgKHJhbmdlKSB7XG4gICAgICAgICAgICBsZXQgc3RhcnQgPSB0aGlzLm9mZnNldEF0KHJhbmdlLnN0YXJ0KTtcbiAgICAgICAgICAgIGxldCBlbmQgPSB0aGlzLm9mZnNldEF0KHJhbmdlLmVuZCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY29udGVudC5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRlbnQ7XG4gICAgfVxuICAgIHVwZGF0ZShldmVudCwgdmVyc2lvbikge1xuICAgICAgICB0aGlzLl9jb250ZW50ID0gZXZlbnQudGV4dDtcbiAgICAgICAgdGhpcy5fdmVyc2lvbiA9IHZlcnNpb247XG4gICAgICAgIHRoaXMuX2xpbmVPZmZzZXRzID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBnZXRMaW5lT2Zmc2V0cygpIHtcbiAgICAgICAgaWYgKHRoaXMuX2xpbmVPZmZzZXRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxldCBsaW5lT2Zmc2V0cyA9IFtdO1xuICAgICAgICAgICAgbGV0IHRleHQgPSB0aGlzLl9jb250ZW50O1xuICAgICAgICAgICAgbGV0IGlzTGluZVN0YXJ0ID0gdHJ1ZTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChpc0xpbmVTdGFydCkge1xuICAgICAgICAgICAgICAgICAgICBsaW5lT2Zmc2V0cy5wdXNoKGkpO1xuICAgICAgICAgICAgICAgICAgICBpc0xpbmVTdGFydCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgY2ggPSB0ZXh0LmNoYXJBdChpKTtcbiAgICAgICAgICAgICAgICBpc0xpbmVTdGFydCA9IChjaCA9PT0gJ1xccicgfHwgY2ggPT09ICdcXG4nKTtcbiAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICdcXHInICYmIGkgKyAxIDwgdGV4dC5sZW5ndGggJiYgdGV4dC5jaGFyQXQoaSArIDEpID09PSAnXFxuJykge1xuICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzTGluZVN0YXJ0ICYmIHRleHQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxpbmVPZmZzZXRzLnB1c2godGV4dC5sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fbGluZU9mZnNldHMgPSBsaW5lT2Zmc2V0cztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fbGluZU9mZnNldHM7XG4gICAgfVxuICAgIHBvc2l0aW9uQXQob2Zmc2V0KSB7XG4gICAgICAgIG9mZnNldCA9IE1hdGgubWF4KE1hdGgubWluKG9mZnNldCwgdGhpcy5fY29udGVudC5sZW5ndGgpLCAwKTtcbiAgICAgICAgbGV0IGxpbmVPZmZzZXRzID0gdGhpcy5nZXRMaW5lT2Zmc2V0cygpO1xuICAgICAgICBsZXQgbG93ID0gMCwgaGlnaCA9IGxpbmVPZmZzZXRzLmxlbmd0aDtcbiAgICAgICAgaWYgKGhpZ2ggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBQb3NpdGlvbi5jcmVhdGUoMCwgb2Zmc2V0KTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAobG93IDwgaGlnaCkge1xuICAgICAgICAgICAgbGV0IG1pZCA9IE1hdGguZmxvb3IoKGxvdyArIGhpZ2gpIC8gMik7XG4gICAgICAgICAgICBpZiAobGluZU9mZnNldHNbbWlkXSA+IG9mZnNldCkge1xuICAgICAgICAgICAgICAgIGhpZ2ggPSBtaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsb3cgPSBtaWQgKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGxvdyBpcyB0aGUgbGVhc3QgeCBmb3Igd2hpY2ggdGhlIGxpbmUgb2Zmc2V0IGlzIGxhcmdlciB0aGFuIHRoZSBjdXJyZW50IG9mZnNldFxuICAgICAgICAvLyBvciBhcnJheS5sZW5ndGggaWYgbm8gbGluZSBvZmZzZXQgaXMgbGFyZ2VyIHRoYW4gdGhlIGN1cnJlbnQgb2Zmc2V0XG4gICAgICAgIGxldCBsaW5lID0gbG93IC0gMTtcbiAgICAgICAgcmV0dXJuIFBvc2l0aW9uLmNyZWF0ZShsaW5lLCBvZmZzZXQgLSBsaW5lT2Zmc2V0c1tsaW5lXSk7XG4gICAgfVxuICAgIG9mZnNldEF0KHBvc2l0aW9uKSB7XG4gICAgICAgIGxldCBsaW5lT2Zmc2V0cyA9IHRoaXMuZ2V0TGluZU9mZnNldHMoKTtcbiAgICAgICAgaWYgKHBvc2l0aW9uLmxpbmUgPj0gbGluZU9mZnNldHMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY29udGVudC5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocG9zaXRpb24ubGluZSA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIGxldCBsaW5lT2Zmc2V0ID0gbGluZU9mZnNldHNbcG9zaXRpb24ubGluZV07XG4gICAgICAgIGxldCBuZXh0TGluZU9mZnNldCA9IChwb3NpdGlvbi5saW5lICsgMSA8IGxpbmVPZmZzZXRzLmxlbmd0aCkgPyBsaW5lT2Zmc2V0c1twb3NpdGlvbi5saW5lICsgMV0gOiB0aGlzLl9jb250ZW50Lmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KE1hdGgubWluKGxpbmVPZmZzZXQgKyBwb3NpdGlvbi5jaGFyYWN0ZXIsIG5leHRMaW5lT2Zmc2V0KSwgbGluZU9mZnNldCk7XG4gICAgfVxuICAgIGdldCBsaW5lQ291bnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldExpbmVPZmZzZXRzKCkubGVuZ3RoO1xuICAgIH1cbn1cbnZhciBJcztcbihmdW5jdGlvbiAoSXMpIHtcbiAgICBjb25zdCB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG4gICAgZnVuY3Rpb24gZGVmaW5lZCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJztcbiAgICB9XG4gICAgSXMuZGVmaW5lZCA9IGRlZmluZWQ7XG4gICAgZnVuY3Rpb24gdW5kZWZpbmVkKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnO1xuICAgIH1cbiAgICBJcy51bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgZnVuY3Rpb24gYm9vbGVhbih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWUgPT09IHRydWUgfHwgdmFsdWUgPT09IGZhbHNlO1xuICAgIH1cbiAgICBJcy5ib29sZWFuID0gYm9vbGVhbjtcbiAgICBmdW5jdGlvbiBzdHJpbmcodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBTdHJpbmddJztcbiAgICB9XG4gICAgSXMuc3RyaW5nID0gc3RyaW5nO1xuICAgIGZ1bmN0aW9uIG51bWJlcih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IE51bWJlcl0nO1xuICAgIH1cbiAgICBJcy5udW1iZXIgPSBudW1iZXI7XG4gICAgZnVuY3Rpb24gbnVtYmVyUmFuZ2UodmFsdWUsIG1pbiwgbWF4KSB7XG4gICAgICAgIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgTnVtYmVyXScgJiYgbWluIDw9IHZhbHVlICYmIHZhbHVlIDw9IG1heDtcbiAgICB9XG4gICAgSXMubnVtYmVyUmFuZ2UgPSBudW1iZXJSYW5nZTtcbiAgICBmdW5jdGlvbiBpbnRlZ2VyKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgTnVtYmVyXScgJiYgLTIxNDc0ODM2NDggPD0gdmFsdWUgJiYgdmFsdWUgPD0gMjE0NzQ4MzY0NztcbiAgICB9XG4gICAgSXMuaW50ZWdlciA9IGludGVnZXI7XG4gICAgZnVuY3Rpb24gdWludGVnZXIodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBOdW1iZXJdJyAmJiAwIDw9IHZhbHVlICYmIHZhbHVlIDw9IDIxNDc0ODM2NDc7XG4gICAgfVxuICAgIElzLnVpbnRlZ2VyID0gdWludGVnZXI7XG4gICAgZnVuY3Rpb24gZnVuYyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG4gICAgfVxuICAgIElzLmZ1bmMgPSBmdW5jO1xuICAgIGZ1bmN0aW9uIG9iamVjdExpdGVyYWwodmFsdWUpIHtcbiAgICAgICAgLy8gU3RyaWN0bHkgc3BlYWtpbmcgY2xhc3MgaW5zdGFuY2VzIHBhc3MgdGhpcyBjaGVjayBhcyB3ZWxsLiBTaW5jZSB0aGUgTFNQXG4gICAgICAgIC8vIGRvZXNuJ3QgdXNlIGNsYXNzZXMgd2UgaWdub3JlIHRoaXMgZm9yIG5vdy4gSWYgd2UgZG8gd2UgbmVlZCB0byBhZGQgc29tZXRoaW5nXG4gICAgICAgIC8vIGxpa2UgdGhpczogYE9iamVjdC5nZXRQcm90b3R5cGVPZihPYmplY3QuZ2V0UHJvdG90eXBlT2YoeCkpID09PSBudWxsYFxuICAgICAgICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JztcbiAgICB9XG4gICAgSXMub2JqZWN0TGl0ZXJhbCA9IG9iamVjdExpdGVyYWw7XG4gICAgZnVuY3Rpb24gdHlwZWRBcnJheSh2YWx1ZSwgY2hlY2spIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmV2ZXJ5KGNoZWNrKTtcbiAgICB9XG4gICAgSXMudHlwZWRBcnJheSA9IHR5cGVkQXJyYXk7XG59KShJcyB8fCAoSXMgPSB7fSkpO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBS0EsYUFBTyxlQUFlLFNBQVMsY0FBYyxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQzVELGNBQVEsY0FBYyxRQUFRLFFBQVEsUUFBUSxPQUFPLFFBQVEsUUFBUSxRQUFRLFNBQVMsUUFBUSxTQUFTLFFBQVEsVUFBVTtBQUN6SCxlQUFTLFFBQVEsT0FBTztBQUNwQixlQUFPLFVBQVUsUUFBUSxVQUFVO0FBQUEsTUFDdkM7QUFDQSxjQUFRLFVBQVU7QUFDbEIsZUFBUyxPQUFPLE9BQU87QUFDbkIsZUFBTyxPQUFPLFVBQVUsWUFBWSxpQkFBaUI7QUFBQSxNQUN6RDtBQUNBLGNBQVEsU0FBUztBQUNqQixlQUFTLE9BQU8sT0FBTztBQUNuQixlQUFPLE9BQU8sVUFBVSxZQUFZLGlCQUFpQjtBQUFBLE1BQ3pEO0FBQ0EsY0FBUSxTQUFTO0FBQ2pCLGVBQVMsTUFBTSxPQUFPO0FBQ2xC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QVMsZ0JBQWdCO0FBQ3JCLFdBQU87QUFBQSxNQUNILE1BQU07QUFBQSxRQUNGLFFBQVE7QUFBQSxVQUNKLE9BQVksRUFBRSxTQUFTLEtBQUs7QUFBQSxVQUM1QixRQUFZLEVBQUUsU0FBUyxNQUFNO0FBQUEsVUFDN0IsWUFBWSxDQUFDLHNCQUFzQixtQkFBbUIsMkJBQTJCO0FBQUEsUUFDckY7QUFBQSxRQUNBLFdBQVcsRUFBRSxTQUFTLEtBQUs7QUFBQSxRQUMzQixZQUFZO0FBQUEsVUFDUixXQUFzQjtBQUFBLFVBQ3RCLHNCQUFzQjtBQUFBO0FBQUEsVUFFdEIsWUFBc0I7QUFBQSxVQUN0QixlQUFlO0FBQUEsWUFDWDtBQUFBLFlBQWE7QUFBQSxZQUFTO0FBQUEsWUFDdEI7QUFBQSxZQUNBO0FBQUEsWUFDQTtBQUFBLFVBQ0o7QUFBQSxVQUNBLGFBQWEsQ0FBQyxRQUFRLFNBQVMsT0FBTyxPQUFPLEVBQUU7QUFBQSxRQUNuRDtBQUFBLFFBQ0EsZUFBZ0IsRUFBRSxTQUFTLEtBQUs7QUFBQSxRQUNoQyxRQUFnQixFQUFFLFNBQVMsS0FBSztBQUFBLFFBQ2hDLGFBQWdCLEVBQUUsaUJBQWlCLE1BQU07QUFBQSxRQUN6QyxZQUFnQixFQUFFLGdCQUFnQixFQUFFLFNBQVMsTUFBTSxFQUFFO0FBQUE7QUFBQTtBQUFBLFFBR3JELG9CQUF3QixFQUFFLFNBQVMsTUFBTTtBQUFBLFFBQ3pDLHlCQUF5QixFQUFFLFNBQVMsTUFBTTtBQUFBLE1BQzlDO0FBQUEsSUFDSjtBQUFBLEVBQ0o7IiwKICAibmFtZXMiOiBbIkVycm9yQ29kZXMiLCAiTWVzc2FnZSIsICJUb3VjaCIsICJEaXNwb3NhYmxlIiwgIlJBTCIsICJFdmVudCIsICJJcyIsICJDYW5jZWxsYXRpb25Ub2tlbiIsICJDYW5jZWxsYXRpb25TdGF0ZSIsICJfY29ubiIsICJJcyIsICJNZXNzYWdlUmVhZGVyIiwgIkFic3RyYWN0TWVzc2FnZVJlYWRlciIsICJSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zIiwgIklzIiwgIk1lc3NhZ2VXcml0ZXIiLCAiQWJzdHJhY3RNZXNzYWdlV3JpdGVyIiwgIlJlc29sdmVkTWVzc2FnZVdyaXRlck9wdGlvbnMiLCAicmVzdWx0IiwgIklzIiwgIkNhbmNlbE5vdGlmaWNhdGlvbiIsICJQcm9ncmVzc1Rva2VuIiwgIlByb2dyZXNzTm90aWZpY2F0aW9uIiwgIlN0YXJSZXF1ZXN0SGFuZGxlciIsICJUcmFjZSIsICJUcmFjZVZhbHVlcyIsICJUcmFjZUZvcm1hdCIsICJTZXRUcmFjZU5vdGlmaWNhdGlvbiIsICJMb2dUcmFjZU5vdGlmaWNhdGlvbiIsICJDb25uZWN0aW9uRXJyb3JzIiwgIkNvbm5lY3Rpb25TdHJhdGVneSIsICJJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kiLCAiUmVxdWVzdENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kiLCAiQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSIsICJDYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneSIsICJDYW5jZWxsYXRpb25TdHJhdGVneSIsICJNZXNzYWdlU3RyYXRlZ3kiLCAiQ29ubmVjdGlvbk9wdGlvbnMiLCAiQ29ubmVjdGlvblN0YXRlIiwgImNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uIiwgInN0YXJ0VGltZSIsICJSSUwiLCAibSIsICJleHBvcnRzIiwgImNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uIiwgImltcG9ydF92c2NvZGVfanNvbnJwYyIsICJpbXBvcnRfdnNjb2RlX2pzb25ycGMiLCAiaW1wb3J0X3ZzY29kZV9qc29ucnBjIiwgImltcG9ydF92c2NvZGVfanNvbnJwYyIsICJEb2N1bWVudFVyaSIsICJVUkkiLCAiaW50ZWdlciIsICJ1aW50ZWdlciIsICJQb3NpdGlvbiIsICJSYW5nZSIsICJMb2NhdGlvbiIsICJMb2NhdGlvbkxpbmsiLCAiQ29sb3IiLCAiQ29sb3JJbmZvcm1hdGlvbiIsICJDb2xvclByZXNlbnRhdGlvbiIsICJGb2xkaW5nUmFuZ2VLaW5kIiwgIkZvbGRpbmdSYW5nZSIsICJEaWFnbm9zdGljUmVsYXRlZEluZm9ybWF0aW9uIiwgImxvY2F0aW9uIiwgIkRpYWdub3N0aWNTZXZlcml0eSIsICJEaWFnbm9zdGljVGFnIiwgIkNvZGVEZXNjcmlwdGlvbiIsICJEaWFnbm9zdGljIiwgIkNvbW1hbmQiLCAiVGV4dEVkaXQiLCAiQ2hhbmdlQW5ub3RhdGlvbiIsICJDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllciIsICJBbm5vdGF0ZWRUZXh0RWRpdCIsICJUZXh0RG9jdW1lbnRFZGl0IiwgIkNyZWF0ZUZpbGUiLCAiUmVuYW1lRmlsZSIsICJEZWxldGVGaWxlIiwgIldvcmtzcGFjZUVkaXQiLCAiVGV4dERvY3VtZW50SWRlbnRpZmllciIsICJWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIiwgIk9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciIsICJUZXh0RG9jdW1lbnRJdGVtIiwgIk1hcmt1cEtpbmQiLCAiTWFya3VwQ29udGVudCIsICJDb21wbGV0aW9uSXRlbUtpbmQiLCAiSW5zZXJ0VGV4dEZvcm1hdCIsICJDb21wbGV0aW9uSXRlbVRhZyIsICJJbnNlcnRSZXBsYWNlRWRpdCIsICJSYW5nZSIsICJJbnNlcnRUZXh0TW9kZSIsICJDb21wbGV0aW9uSXRlbUxhYmVsRGV0YWlscyIsICJDb21wbGV0aW9uSXRlbSIsICJDb21wbGV0aW9uTGlzdCIsICJNYXJrZWRTdHJpbmciLCAiSG92ZXIiLCAiUGFyYW1ldGVySW5mb3JtYXRpb24iLCAiU2lnbmF0dXJlSW5mb3JtYXRpb24iLCAiRG9jdW1lbnRIaWdobGlnaHRLaW5kIiwgIkRvY3VtZW50SGlnaGxpZ2h0IiwgIlN5bWJvbEtpbmQiLCAiU3ltYm9sVGFnIiwgIlN5bWJvbEluZm9ybWF0aW9uIiwgIldvcmtzcGFjZVN5bWJvbCIsICJEb2N1bWVudFN5bWJvbCIsICJDb2RlQWN0aW9uS2luZCIsICJDb2RlQWN0aW9uVHJpZ2dlcktpbmQiLCAiQ29kZUFjdGlvbkNvbnRleHQiLCAiQ29kZUFjdGlvbiIsICJDb2RlTGVucyIsICJGb3JtYXR0aW5nT3B0aW9ucyIsICJEb2N1bWVudExpbmsiLCAiU2VsZWN0aW9uUmFuZ2UiLCAiU2VtYW50aWNUb2tlblR5cGVzIiwgIlNlbWFudGljVG9rZW5Nb2RpZmllcnMiLCAiU2VtYW50aWNUb2tlbnMiLCAiSW5saW5lVmFsdWVUZXh0IiwgIklubGluZVZhbHVlVmFyaWFibGVMb29rdXAiLCAiSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24iLCAiSW5saW5lVmFsdWVDb250ZXh0IiwgIklubGF5SGludEtpbmQiLCAiSW5sYXlIaW50TGFiZWxQYXJ0IiwgIklubGF5SGludCIsICJQb3NpdGlvbiIsICJTdHJpbmdWYWx1ZSIsICJJbmxpbmVDb21wbGV0aW9uSXRlbSIsICJJbmxpbmVDb21wbGV0aW9uTGlzdCIsICJJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmQiLCAiU2VsZWN0ZWRDb21wbGV0aW9uSW5mbyIsICJJbmxpbmVDb21wbGV0aW9uQ29udGV4dCIsICJXb3Jrc3BhY2VGb2xkZXIiLCAiVGV4dERvY3VtZW50IiwgIlBvc2l0aW9uIiwgIklzIiwgInVuZGVmaW5lZCIsICJpbnRlZ2VyIiwgInVpbnRlZ2VyIiwgIm0iXQp9Cg== +//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvY29tbW9uL2lzLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlcy5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vbGlua2VkTWFwLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9kaXNwb3NhYmxlLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9yYWwuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvY29tbW9uL2V2ZW50cy5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vY2FuY2VsbGF0aW9uLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9zaGFyZWRBcnJheUNhbmNlbGxhdGlvbi5qcyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS1qc29ucnBjL2xpYi9jb21tb24vc2VtYXBob3JlLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlUmVhZGVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlV3JpdGVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9tZXNzYWdlQnVmZmVyLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9jb25uZWN0aW9uLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvbGliL2NvbW1vbi9hcGkuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvYnJvd3Nlci9yaWwuanMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtanNvbnJwYy9saWIvYnJvd3Nlci9tYWluLmpzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLWpzb25ycGMvYnJvd3Nlci5qcyIsICJsc3AvamF2YS1sc3AtY2xpZW50LnRzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLXdzLWpzb25ycGMvc3JjL2Rpc3Bvc2FibGUudHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvc29ja2V0L3NvY2tldC50cyIsICJsc3Avbm9kZV9tb2R1bGVzL3ZzY29kZS13cy1qc29ucnBjL3NyYy9zb2NrZXQvcmVhZGVyLnRzIiwgImxzcC9ub2RlX21vZHVsZXMvdnNjb2RlLXdzLWpzb25ycGMvc3JjL3NvY2tldC93cml0ZXIudHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvc29ja2V0L2Nvbm5lY3Rpb24udHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtd3MtanNvbnJwYy9zcmMvY29ubmVjdGlvbi50cyIsICJsc3AvbW9uYWNvLXNoaW0udHMiLCAibHNwL25vZGVfbW9kdWxlcy92c2NvZGUtbGFuZ3VhZ2VzZXJ2ZXItdHlwZXMvbGliL2VzbS9tYWluLmpzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuc3RyaW5nQXJyYXkgPSBleHBvcnRzLmFycmF5ID0gZXhwb3J0cy5mdW5jID0gZXhwb3J0cy5lcnJvciA9IGV4cG9ydHMubnVtYmVyID0gZXhwb3J0cy5zdHJpbmcgPSBleHBvcnRzLmJvb2xlYW4gPSB2b2lkIDA7XG5mdW5jdGlvbiBib29sZWFuKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlID09PSB0cnVlIHx8IHZhbHVlID09PSBmYWxzZTtcbn1cbmV4cG9ydHMuYm9vbGVhbiA9IGJvb2xlYW47XG5mdW5jdGlvbiBzdHJpbmcodmFsdWUpIHtcbiAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyB8fCB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZztcbn1cbmV4cG9ydHMuc3RyaW5nID0gc3RyaW5nO1xuZnVuY3Rpb24gbnVtYmVyKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgdmFsdWUgaW5zdGFuY2VvZiBOdW1iZXI7XG59XG5leHBvcnRzLm51bWJlciA9IG51bWJlcjtcbmZ1bmN0aW9uIGVycm9yKHZhbHVlKSB7XG4gICAgcmV0dXJuIHZhbHVlIGluc3RhbmNlb2YgRXJyb3I7XG59XG5leHBvcnRzLmVycm9yID0gZXJyb3I7XG5mdW5jdGlvbiBmdW5jKHZhbHVlKSB7XG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJztcbn1cbmV4cG9ydHMuZnVuYyA9IGZ1bmM7XG5mdW5jdGlvbiBhcnJheSh2YWx1ZSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KHZhbHVlKTtcbn1cbmV4cG9ydHMuYXJyYXkgPSBhcnJheTtcbmZ1bmN0aW9uIHN0cmluZ0FycmF5KHZhbHVlKSB7XG4gICAgcmV0dXJuIGFycmF5KHZhbHVlKSAmJiB2YWx1ZS5ldmVyeShlbGVtID0+IHN0cmluZyhlbGVtKSk7XG59XG5leHBvcnRzLnN0cmluZ0FycmF5ID0gc3RyaW5nQXJyYXk7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLk1lc3NhZ2UgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU5ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlOCA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTcgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU2ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNSA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTQgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUzID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMiA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTEgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUwID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTkgPSBleHBvcnRzLlJlcXVlc3RUeXBlOCA9IGV4cG9ydHMuUmVxdWVzdFR5cGU3ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTYgPSBleHBvcnRzLlJlcXVlc3RUeXBlNSA9IGV4cG9ydHMuUmVxdWVzdFR5cGU0ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTMgPSBleHBvcnRzLlJlcXVlc3RUeXBlMiA9IGV4cG9ydHMuUmVxdWVzdFR5cGUxID0gZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IGV4cG9ydHMuUmVxdWVzdFR5cGUwID0gZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUgPSBleHBvcnRzLlBhcmFtZXRlclN0cnVjdHVyZXMgPSBleHBvcnRzLlJlc3BvbnNlRXJyb3IgPSBleHBvcnRzLkVycm9yQ29kZXMgPSB2b2lkIDA7XG5jb25zdCBpcyA9IHJlcXVpcmUoXCIuL2lzXCIpO1xuLyoqXG4gKiBQcmVkZWZpbmVkIGVycm9yIGNvZGVzLlxuICovXG52YXIgRXJyb3JDb2RlcztcbihmdW5jdGlvbiAoRXJyb3JDb2Rlcykge1xuICAgIC8vIERlZmluZWQgYnkgSlNPTiBSUENcbiAgICBFcnJvckNvZGVzLlBhcnNlRXJyb3IgPSAtMzI3MDA7XG4gICAgRXJyb3JDb2Rlcy5JbnZhbGlkUmVxdWVzdCA9IC0zMjYwMDtcbiAgICBFcnJvckNvZGVzLk1ldGhvZE5vdEZvdW5kID0gLTMyNjAxO1xuICAgIEVycm9yQ29kZXMuSW52YWxpZFBhcmFtcyA9IC0zMjYwMjtcbiAgICBFcnJvckNvZGVzLkludGVybmFsRXJyb3IgPSAtMzI2MDM7XG4gICAgLyoqXG4gICAgICogVGhpcyBpcyB0aGUgc3RhcnQgcmFuZ2Ugb2YgSlNPTiBSUEMgcmVzZXJ2ZWQgZXJyb3IgY29kZXMuXG4gICAgICogSXQgZG9lc24ndCBkZW5vdGUgYSByZWFsIGVycm9yIGNvZGUuIE5vIGFwcGxpY2F0aW9uIGVycm9yIGNvZGVzIHNob3VsZFxuICAgICAqIGJlIGRlZmluZWQgYmV0d2VlbiB0aGUgc3RhcnQgYW5kIGVuZCByYW5nZS4gRm9yIGJhY2t3YXJkc1xuICAgICAqIGNvbXBhdGliaWxpdHkgdGhlIGBTZXJ2ZXJOb3RJbml0aWFsaXplZGAgYW5kIHRoZSBgVW5rbm93bkVycm9yQ29kZWBcbiAgICAgKiBhcmUgbGVmdCBpbiB0aGUgcmFuZ2UuXG4gICAgICpcbiAgICAgKiBAc2luY2UgMy4xNi4wXG4gICAgKi9cbiAgICBFcnJvckNvZGVzLmpzb25ycGNSZXNlcnZlZEVycm9yUmFuZ2VTdGFydCA9IC0zMjA5OTtcbiAgICAvKiogQGRlcHJlY2F0ZWQgdXNlICBqc29ucnBjUmVzZXJ2ZWRFcnJvclJhbmdlU3RhcnQgKi9cbiAgICBFcnJvckNvZGVzLnNlcnZlckVycm9yU3RhcnQgPSAtMzIwOTk7XG4gICAgLyoqXG4gICAgICogQW4gZXJyb3Igb2NjdXJyZWQgd2hlbiB3cml0ZSBhIG1lc3NhZ2UgdG8gdGhlIHRyYW5zcG9ydCBsYXllci5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLk1lc3NhZ2VXcml0ZUVycm9yID0gLTMyMDk5O1xuICAgIC8qKlxuICAgICAqIEFuIGVycm9yIG9jY3VycmVkIHdoZW4gcmVhZGluZyBhIG1lc3NhZ2UgZnJvbSB0aGUgdHJhbnNwb3J0IGxheWVyLlxuICAgICAqL1xuICAgIEVycm9yQ29kZXMuTWVzc2FnZVJlYWRFcnJvciA9IC0zMjA5ODtcbiAgICAvKipcbiAgICAgKiBUaGUgY29ubmVjdGlvbiBnb3QgZGlzcG9zZWQgb3IgbG9zdCBhbmQgYWxsIHBlbmRpbmcgcmVzcG9uc2VzIGdvdFxuICAgICAqIHJlamVjdGVkLlxuICAgICAqL1xuICAgIEVycm9yQ29kZXMuUGVuZGluZ1Jlc3BvbnNlUmVqZWN0ZWQgPSAtMzIwOTc7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gaXMgaW5hY3RpdmUgYW5kIGEgdXNlIG9mIGl0IGZhaWxlZC5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLkNvbm5lY3Rpb25JbmFjdGl2ZSA9IC0zMjA5NjtcbiAgICAvKipcbiAgICAgKiBFcnJvciBjb2RlIGluZGljYXRpbmcgdGhhdCBhIHNlcnZlciByZWNlaXZlZCBhIG5vdGlmaWNhdGlvbiBvclxuICAgICAqIHJlcXVlc3QgYmVmb3JlIHRoZSBzZXJ2ZXIgaGFzIHJlY2VpdmVkIHRoZSBgaW5pdGlhbGl6ZWAgcmVxdWVzdC5cbiAgICAgKi9cbiAgICBFcnJvckNvZGVzLlNlcnZlck5vdEluaXRpYWxpemVkID0gLTMyMDAyO1xuICAgIEVycm9yQ29kZXMuVW5rbm93bkVycm9yQ29kZSA9IC0zMjAwMTtcbiAgICAvKipcbiAgICAgKiBUaGlzIGlzIHRoZSBlbmQgcmFuZ2Ugb2YgSlNPTiBSUEMgcmVzZXJ2ZWQgZXJyb3IgY29kZXMuXG4gICAgICogSXQgZG9lc24ndCBkZW5vdGUgYSByZWFsIGVycm9yIGNvZGUuXG4gICAgICpcbiAgICAgKiBAc2luY2UgMy4xNi4wXG4gICAgKi9cbiAgICBFcnJvckNvZGVzLmpzb25ycGNSZXNlcnZlZEVycm9yUmFuZ2VFbmQgPSAtMzIwMDA7XG4gICAgLyoqIEBkZXByZWNhdGVkIHVzZSAganNvbnJwY1Jlc2VydmVkRXJyb3JSYW5nZUVuZCAqL1xuICAgIEVycm9yQ29kZXMuc2VydmVyRXJyb3JFbmQgPSAtMzIwMDA7XG59KShFcnJvckNvZGVzIHx8IChleHBvcnRzLkVycm9yQ29kZXMgPSBFcnJvckNvZGVzID0ge30pKTtcbi8qKlxuICogQW4gZXJyb3Igb2JqZWN0IHJldHVybiBpbiBhIHJlc3BvbnNlIGluIGNhc2UgYSByZXF1ZXN0XG4gKiBoYXMgZmFpbGVkLlxuICovXG5jbGFzcyBSZXNwb25zZUVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNvZGUsIG1lc3NhZ2UsIGRhdGEpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuY29kZSA9IGlzLm51bWJlcihjb2RlKSA/IGNvZGUgOiBFcnJvckNvZGVzLlVua25vd25FcnJvckNvZGU7XG4gICAgICAgIHRoaXMuZGF0YSA9IGRhdGE7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBSZXNwb25zZUVycm9yLnByb3RvdHlwZSk7XG4gICAgfVxuICAgIHRvSnNvbigpIHtcbiAgICAgICAgY29uc3QgcmVzdWx0ID0ge1xuICAgICAgICAgICAgY29kZTogdGhpcy5jb2RlLFxuICAgICAgICAgICAgbWVzc2FnZTogdGhpcy5tZXNzYWdlXG4gICAgICAgIH07XG4gICAgICAgIGlmICh0aGlzLmRhdGEgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmRhdGEgPSB0aGlzLmRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG59XG5leHBvcnRzLlJlc3BvbnNlRXJyb3IgPSBSZXNwb25zZUVycm9yO1xuY2xhc3MgUGFyYW1ldGVyU3RydWN0dXJlcyB7XG4gICAgY29uc3RydWN0b3Ioa2luZCkge1xuICAgICAgICB0aGlzLmtpbmQgPSBraW5kO1xuICAgIH1cbiAgICBzdGF0aWMgaXModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8gfHwgdmFsdWUgPT09IFBhcmFtZXRlclN0cnVjdHVyZXMuYnlOYW1lIHx8IHZhbHVlID09PSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5UG9zaXRpb247XG4gICAgfVxuICAgIHRvU3RyaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5raW5kO1xuICAgIH1cbn1cbmV4cG9ydHMuUGFyYW1ldGVyU3RydWN0dXJlcyA9IFBhcmFtZXRlclN0cnVjdHVyZXM7XG4vKipcbiAqIFRoZSBwYXJhbWV0ZXIgc3RydWN0dXJlIGlzIGF1dG9tYXRpY2FsbHkgaW5mZXJyZWQgb24gdGhlIG51bWJlciBvZiBwYXJhbWV0ZXJzXG4gKiBhbmQgdGhlIHBhcmFtZXRlciB0eXBlIGluIGNhc2Ugb2YgYSBzaW5nbGUgcGFyYW0uXG4gKi9cblBhcmFtZXRlclN0cnVjdHVyZXMuYXV0byA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdhdXRvJyk7XG4vKipcbiAqIEZvcmNlcyBgYnlQb3NpdGlvbmAgcGFyYW1ldGVyIHN0cnVjdHVyZS4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGhhdmUgYSBzaW5nbGVcbiAqIHBhcmFtZXRlciB3aGljaCBoYXMgYSBsaXRlcmFsIHR5cGUuXG4gKi9cblBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbiA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdieVBvc2l0aW9uJyk7XG4vKipcbiAqIEZvcmNlcyBgYnlOYW1lYCBwYXJhbWV0ZXIgc3RydWN0dXJlLiBUaGlzIGlzIG9ubHkgdXNlZnVsIHdoZW4gaGF2aW5nIGEgc2luZ2xlXG4gKiBwYXJhbWV0ZXIuIFRoZSBsaWJyYXJ5IHdpbGwgcmVwb3J0IGVycm9ycyBpZiB1c2VkIHdpdGggYSBkaWZmZXJlbnQgbnVtYmVyIG9mXG4gKiBwYXJhbWV0ZXJzLlxuICovXG5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSA9IG5ldyBQYXJhbWV0ZXJTdHJ1Y3R1cmVzKCdieU5hbWUnKTtcbi8qKlxuICogQW4gYWJzdHJhY3QgaW1wbGVtZW50YXRpb24gb2YgYSBNZXNzYWdlVHlwZS5cbiAqL1xuY2xhc3MgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIG51bWJlck9mUGFyYW1zKSB7XG4gICAgICAgIHRoaXMubWV0aG9kID0gbWV0aG9kO1xuICAgICAgICB0aGlzLm51bWJlck9mUGFyYW1zID0gbnVtYmVyT2ZQYXJhbXM7XG4gICAgfVxuICAgIGdldCBwYXJhbWV0ZXJTdHJ1Y3R1cmVzKCkge1xuICAgICAgICByZXR1cm4gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvO1xuICAgIH1cbn1cbmV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlID0gQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlO1xuLyoqXG4gKiBDbGFzc2VzIHRvIHR5cGUgcmVxdWVzdCByZXNwb25zZSBwYWlyc1xuICovXG5jbGFzcyBSZXF1ZXN0VHlwZTAgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDApO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGUwID0gUmVxdWVzdFR5cGUwO1xuY2xhc3MgUmVxdWVzdFR5cGUgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCwgX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8pIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAxKTtcbiAgICAgICAgdGhpcy5fcGFyYW1ldGVyU3RydWN0dXJlcyA9IF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbiAgICBnZXQgcGFyYW1ldGVyU3RydWN0dXJlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXM7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IFJlcXVlc3RUeXBlO1xuY2xhc3MgUmVxdWVzdFR5cGUxIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMSk7XG4gICAgICAgIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBfcGFyYW1ldGVyU3RydWN0dXJlcztcbiAgICB9XG4gICAgZ2V0IHBhcmFtZXRlclN0cnVjdHVyZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGUxID0gUmVxdWVzdFR5cGUxO1xuY2xhc3MgUmVxdWVzdFR5cGUyIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAyKTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlMiA9IFJlcXVlc3RUeXBlMjtcbmNsYXNzIFJlcXVlc3RUeXBlMyBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMyk7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTMgPSBSZXF1ZXN0VHlwZTM7XG5jbGFzcyBSZXF1ZXN0VHlwZTQgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDQpO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGU0ID0gUmVxdWVzdFR5cGU0O1xuY2xhc3MgUmVxdWVzdFR5cGU1IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA1KTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlNSA9IFJlcXVlc3RUeXBlNTtcbmNsYXNzIFJlcXVlc3RUeXBlNiBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNik7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTYgPSBSZXF1ZXN0VHlwZTY7XG5jbGFzcyBSZXF1ZXN0VHlwZTcgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDcpO1xuICAgIH1cbn1cbmV4cG9ydHMuUmVxdWVzdFR5cGU3ID0gUmVxdWVzdFR5cGU3O1xuY2xhc3MgUmVxdWVzdFR5cGU4IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA4KTtcbiAgICB9XG59XG5leHBvcnRzLlJlcXVlc3RUeXBlOCA9IFJlcXVlc3RUeXBlODtcbmNsYXNzIFJlcXVlc3RUeXBlOSBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgOSk7XG4gICAgfVxufVxuZXhwb3J0cy5SZXF1ZXN0VHlwZTkgPSBSZXF1ZXN0VHlwZTk7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QsIF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMSk7XG4gICAgICAgIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBfcGFyYW1ldGVyU3RydWN0dXJlcztcbiAgICB9XG4gICAgZ2V0IHBhcmFtZXRlclN0cnVjdHVyZXMoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZSA9IE5vdGlmaWNhdGlvblR5cGU7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlMCBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgMCk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMCA9IE5vdGlmaWNhdGlvblR5cGUwO1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTEgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCwgX3BhcmFtZXRlclN0cnVjdHVyZXMgPSBQYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG8pIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAxKTtcbiAgICAgICAgdGhpcy5fcGFyYW1ldGVyU3RydWN0dXJlcyA9IF9wYXJhbWV0ZXJTdHJ1Y3R1cmVzO1xuICAgIH1cbiAgICBnZXQgcGFyYW1ldGVyU3RydWN0dXJlcygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcmFtZXRlclN0cnVjdHVyZXM7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMSA9IE5vdGlmaWNhdGlvblR5cGUxO1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDIpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTIgPSBOb3RpZmljYXRpb25UeXBlMjtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGUzIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCAzKTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGUzID0gTm90aWZpY2F0aW9uVHlwZTM7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlNCBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNCk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNCA9IE5vdGlmaWNhdGlvblR5cGU0O1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTUgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDUpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTUgPSBOb3RpZmljYXRpb25UeXBlNTtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGU2IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA2KTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGU2ID0gTm90aWZpY2F0aW9uVHlwZTY7XG5jbGFzcyBOb3RpZmljYXRpb25UeXBlNyBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVNpZ25hdHVyZSB7XG4gICAgY29uc3RydWN0b3IobWV0aG9kKSB7XG4gICAgICAgIHN1cGVyKG1ldGhvZCwgNyk7XG4gICAgfVxufVxuZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNyA9IE5vdGlmaWNhdGlvblR5cGU3O1xuY2xhc3MgTm90aWZpY2F0aW9uVHlwZTggZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VTaWduYXR1cmUge1xuICAgIGNvbnN0cnVjdG9yKG1ldGhvZCkge1xuICAgICAgICBzdXBlcihtZXRob2QsIDgpO1xuICAgIH1cbn1cbmV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTggPSBOb3RpZmljYXRpb25UeXBlODtcbmNsYXNzIE5vdGlmaWNhdGlvblR5cGU5IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlU2lnbmF0dXJlIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2QpIHtcbiAgICAgICAgc3VwZXIobWV0aG9kLCA5KTtcbiAgICB9XG59XG5leHBvcnRzLk5vdGlmaWNhdGlvblR5cGU5ID0gTm90aWZpY2F0aW9uVHlwZTk7XG52YXIgTWVzc2FnZTtcbihmdW5jdGlvbiAoTWVzc2FnZSkge1xuICAgIC8qKlxuICAgICAqIFRlc3RzIGlmIHRoZSBnaXZlbiBtZXNzYWdlIGlzIGEgcmVxdWVzdCBtZXNzYWdlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gbWVzc2FnZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBpcy5zdHJpbmcoY2FuZGlkYXRlLm1ldGhvZCkgJiYgKGlzLnN0cmluZyhjYW5kaWRhdGUuaWQpIHx8IGlzLm51bWJlcihjYW5kaWRhdGUuaWQpKTtcbiAgICB9XG4gICAgTWVzc2FnZS5pc1JlcXVlc3QgPSBpc1JlcXVlc3Q7XG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhlIGdpdmVuIG1lc3NhZ2UgaXMgYSBub3RpZmljYXRpb24gbWVzc2FnZVxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzTm90aWZpY2F0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gbWVzc2FnZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBpcy5zdHJpbmcoY2FuZGlkYXRlLm1ldGhvZCkgJiYgbWVzc2FnZS5pZCA9PT0gdm9pZCAwO1xuICAgIH1cbiAgICBNZXNzYWdlLmlzTm90aWZpY2F0aW9uID0gaXNOb3RpZmljYXRpb247XG4gICAgLyoqXG4gICAgICogVGVzdHMgaWYgdGhlIGdpdmVuIG1lc3NhZ2UgaXMgYSByZXNwb25zZSBtZXNzYWdlXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXNSZXNwb25zZShtZXNzYWdlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IG1lc3NhZ2U7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgKGNhbmRpZGF0ZS5yZXN1bHQgIT09IHZvaWQgMCB8fCAhIWNhbmRpZGF0ZS5lcnJvcikgJiYgKGlzLnN0cmluZyhjYW5kaWRhdGUuaWQpIHx8IGlzLm51bWJlcihjYW5kaWRhdGUuaWQpIHx8IGNhbmRpZGF0ZS5pZCA9PT0gbnVsbCk7XG4gICAgfVxuICAgIE1lc3NhZ2UuaXNSZXNwb25zZSA9IGlzUmVzcG9uc2U7XG59KShNZXNzYWdlIHx8IChleHBvcnRzLk1lc3NhZ2UgPSBNZXNzYWdlID0ge30pKTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xudmFyIF9hO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5MUlVDYWNoZSA9IGV4cG9ydHMuTGlua2VkTWFwID0gZXhwb3J0cy5Ub3VjaCA9IHZvaWQgMDtcbnZhciBUb3VjaDtcbihmdW5jdGlvbiAoVG91Y2gpIHtcbiAgICBUb3VjaC5Ob25lID0gMDtcbiAgICBUb3VjaC5GaXJzdCA9IDE7XG4gICAgVG91Y2guQXNPbGQgPSBUb3VjaC5GaXJzdDtcbiAgICBUb3VjaC5MYXN0ID0gMjtcbiAgICBUb3VjaC5Bc05ldyA9IFRvdWNoLkxhc3Q7XG59KShUb3VjaCB8fCAoZXhwb3J0cy5Ub3VjaCA9IFRvdWNoID0ge30pKTtcbmNsYXNzIExpbmtlZE1hcCB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXNbX2FdID0gJ0xpbmtlZE1hcCc7XG4gICAgICAgIHRoaXMuX21hcCA9IG5ldyBNYXAoKTtcbiAgICAgICAgdGhpcy5faGVhZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fdGFpbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IDA7XG4gICAgICAgIHRoaXMuX3N0YXRlID0gMDtcbiAgICB9XG4gICAgY2xlYXIoKSB7XG4gICAgICAgIHRoaXMuX21hcC5jbGVhcigpO1xuICAgICAgICB0aGlzLl9oZWFkID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl90YWlsID0gdW5kZWZpbmVkO1xuICAgICAgICB0aGlzLl9zaXplID0gMDtcbiAgICAgICAgdGhpcy5fc3RhdGUrKztcbiAgICB9XG4gICAgaXNFbXB0eSgpIHtcbiAgICAgICAgcmV0dXJuICF0aGlzLl9oZWFkICYmICF0aGlzLl90YWlsO1xuICAgIH1cbiAgICBnZXQgc2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3NpemU7XG4gICAgfVxuICAgIGdldCBmaXJzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2hlYWQ/LnZhbHVlO1xuICAgIH1cbiAgICBnZXQgbGFzdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3RhaWw/LnZhbHVlO1xuICAgIH1cbiAgICBoYXMoa2V5KSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9tYXAuaGFzKGtleSk7XG4gICAgfVxuICAgIGdldChrZXksIHRvdWNoID0gVG91Y2guTm9uZSkge1xuICAgICAgICBjb25zdCBpdGVtID0gdGhpcy5fbWFwLmdldChrZXkpO1xuICAgICAgICBpZiAoIWl0ZW0pIHtcbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRvdWNoICE9PSBUb3VjaC5Ob25lKSB7XG4gICAgICAgICAgICB0aGlzLnRvdWNoKGl0ZW0sIHRvdWNoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICB9XG4gICAgc2V0KGtleSwgdmFsdWUsIHRvdWNoID0gVG91Y2guTm9uZSkge1xuICAgICAgICBsZXQgaXRlbSA9IHRoaXMuX21hcC5nZXQoa2V5KTtcbiAgICAgICAgaWYgKGl0ZW0pIHtcbiAgICAgICAgICAgIGl0ZW0udmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgICAgIGlmICh0b3VjaCAhPT0gVG91Y2guTm9uZSkge1xuICAgICAgICAgICAgICAgIHRoaXMudG91Y2goaXRlbSwgdG91Y2gpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaXRlbSA9IHsga2V5LCB2YWx1ZSwgbmV4dDogdW5kZWZpbmVkLCBwcmV2aW91czogdW5kZWZpbmVkIH07XG4gICAgICAgICAgICBzd2l0Y2ggKHRvdWNoKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBUb3VjaC5Ob25lOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBjYXNlIFRvdWNoLkZpcnN0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1GaXJzdChpdGVtKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZSBUb3VjaC5MYXN0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICB0aGlzLmFkZEl0ZW1MYXN0KGl0ZW0pO1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuX21hcC5zZXQoa2V5LCBpdGVtKTtcbiAgICAgICAgICAgIHRoaXMuX3NpemUrKztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgZGVsZXRlKGtleSkge1xuICAgICAgICByZXR1cm4gISF0aGlzLnJlbW92ZShrZXkpO1xuICAgIH1cbiAgICByZW1vdmUoa2V5KSB7XG4gICAgICAgIGNvbnN0IGl0ZW0gPSB0aGlzLl9tYXAuZ2V0KGtleSk7XG4gICAgICAgIGlmICghaXRlbSkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9tYXAuZGVsZXRlKGtleSk7XG4gICAgICAgIHRoaXMucmVtb3ZlSXRlbShpdGVtKTtcbiAgICAgICAgdGhpcy5fc2l6ZS0tO1xuICAgICAgICByZXR1cm4gaXRlbS52YWx1ZTtcbiAgICB9XG4gICAgc2hpZnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5faGVhZCAmJiAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuX2hlYWQgfHwgIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgaXRlbSA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIHRoaXMuX21hcC5kZWxldGUoaXRlbS5rZXkpO1xuICAgICAgICB0aGlzLnJlbW92ZUl0ZW0oaXRlbSk7XG4gICAgICAgIHRoaXMuX3NpemUtLTtcbiAgICAgICAgcmV0dXJuIGl0ZW0udmFsdWU7XG4gICAgfVxuICAgIGZvckVhY2goY2FsbGJhY2tmbiwgdGhpc0FyZykge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3N0YXRlO1xuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIHdoaWxlIChjdXJyZW50KSB7XG4gICAgICAgICAgICBpZiAodGhpc0FyZykge1xuICAgICAgICAgICAgICAgIGNhbGxiYWNrZm4uYmluZCh0aGlzQXJnKShjdXJyZW50LnZhbHVlLCBjdXJyZW50LmtleSwgdGhpcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjYWxsYmFja2ZuKGN1cnJlbnQudmFsdWUsIGN1cnJlbnQua2V5LCB0aGlzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gc3RhdGUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExpbmtlZE1hcCBnb3QgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi5gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAga2V5cygpIHtcbiAgICAgICAgY29uc3Qgc3RhdGUgPSB0aGlzLl9zdGF0ZTtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLl9oZWFkO1xuICAgICAgICBjb25zdCBpdGVyYXRvciA9IHtcbiAgICAgICAgICAgIFtTeW1ib2wuaXRlcmF0b3JdOiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGl0ZXJhdG9yO1xuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5leHQ6ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fc3RhdGUgIT09IHN0YXRlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTGlua2VkTWFwIGdvdCBtb2RpZmllZCBkdXJpbmcgaXRlcmF0aW9uLmApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7IHZhbHVlOiBjdXJyZW50LmtleSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICB9XG4gICAgdmFsdWVzKCkge1xuICAgICAgICBjb25zdCBzdGF0ZSA9IHRoaXMuX3N0YXRlO1xuICAgICAgICBsZXQgY3VycmVudCA9IHRoaXMuX2hlYWQ7XG4gICAgICAgIGNvbnN0IGl0ZXJhdG9yID0ge1xuICAgICAgICAgICAgW1N5bWJvbC5pdGVyYXRvcl06ICgpID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gaXRlcmF0b3I7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmV4dDogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9zdGF0ZSAhPT0gc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBMaW5rZWRNYXAgZ290IG1vZGlmaWVkIGR1cmluZyBpdGVyYXRpb24uYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChjdXJyZW50KSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHsgdmFsdWU6IGN1cnJlbnQudmFsdWUsIGRvbmU6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50Lm5leHQ7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyB2YWx1ZTogdW5kZWZpbmVkLCBkb25lOiB0cnVlIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gaXRlcmF0b3I7XG4gICAgfVxuICAgIGVudHJpZXMoKSB7XG4gICAgICAgIGNvbnN0IHN0YXRlID0gdGhpcy5fc3RhdGU7XG4gICAgICAgIGxldCBjdXJyZW50ID0gdGhpcy5faGVhZDtcbiAgICAgICAgY29uc3QgaXRlcmF0b3IgPSB7XG4gICAgICAgICAgICBbU3ltYm9sLml0ZXJhdG9yXTogKCkgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBuZXh0OiAoKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX3N0YXRlICE9PSBzdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYExpbmtlZE1hcCBnb3QgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0ID0geyB2YWx1ZTogW2N1cnJlbnQua2V5LCBjdXJyZW50LnZhbHVlXSwgZG9uZTogZmFsc2UgfTtcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudCA9IGN1cnJlbnQubmV4dDtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IHZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWUgfTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgICAgIHJldHVybiBpdGVyYXRvcjtcbiAgICB9XG4gICAgWyhfYSA9IFN5bWJvbC50b1N0cmluZ1RhZywgU3ltYm9sLml0ZXJhdG9yKV0oKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVudHJpZXMoKTtcbiAgICB9XG4gICAgdHJpbU9sZChuZXdTaXplKSB7XG4gICAgICAgIGlmIChuZXdTaXplID49IHRoaXMuc2l6ZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuZXdTaXplID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmNsZWFyKCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgbGV0IGN1cnJlbnQgPSB0aGlzLl9oZWFkO1xuICAgICAgICBsZXQgY3VycmVudFNpemUgPSB0aGlzLnNpemU7XG4gICAgICAgIHdoaWxlIChjdXJyZW50ICYmIGN1cnJlbnRTaXplID4gbmV3U2l6ZSkge1xuICAgICAgICAgICAgdGhpcy5fbWFwLmRlbGV0ZShjdXJyZW50LmtleSk7XG4gICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0O1xuICAgICAgICAgICAgY3VycmVudFNpemUtLTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9oZWFkID0gY3VycmVudDtcbiAgICAgICAgdGhpcy5fc2l6ZSA9IGN1cnJlbnRTaXplO1xuICAgICAgICBpZiAoY3VycmVudCkge1xuICAgICAgICAgICAgY3VycmVudC5wcmV2aW91cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgIH1cbiAgICBhZGRJdGVtRmlyc3QoaXRlbSkge1xuICAgICAgICAvLyBGaXJzdCB0aW1lIEluc2VydFxuICAgICAgICBpZiAoIXRoaXMuX2hlYWQgJiYgIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRoaXMuX3RhaWwgPSBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKCF0aGlzLl9oZWFkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbGlzdCcpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdGhpcy5faGVhZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQucHJldmlvdXMgPSBpdGVtO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2hlYWQgPSBpdGVtO1xuICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgIH1cbiAgICBhZGRJdGVtTGFzdChpdGVtKSB7XG4gICAgICAgIC8vIEZpcnN0IHRpbWUgSW5zZXJ0XG4gICAgICAgIGlmICghdGhpcy5faGVhZCAmJiAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgdGhpcy5faGVhZCA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoIXRoaXMuX3RhaWwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpdGVtLnByZXZpb3VzID0gdGhpcy5fdGFpbDtcbiAgICAgICAgICAgIHRoaXMuX3RhaWwubmV4dCA9IGl0ZW07XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW07XG4gICAgICAgIHRoaXMuX3N0YXRlKys7XG4gICAgfVxuICAgIHJlbW92ZUl0ZW0oaXRlbSkge1xuICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCAmJiBpdGVtID09PSB0aGlzLl90YWlsKSB7XG4gICAgICAgICAgICB0aGlzLl9oZWFkID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChpdGVtID09PSB0aGlzLl9oZWFkKSB7XG4gICAgICAgICAgICAvLyBUaGlzIGNhbiBvbmx5IGhhcHBlbmVkIGlmIHNpemUgPT09IDEgd2hpY2ggaXMgaGFuZGxlXG4gICAgICAgICAgICAvLyBieSB0aGUgY2FzZSBhYm92ZS5cbiAgICAgICAgICAgIGlmICghaXRlbS5uZXh0KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxpc3QnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGl0ZW0ubmV4dC5wcmV2aW91cyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQgPSBpdGVtLm5leHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoaXRlbSA9PT0gdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgLy8gVGhpcyBjYW4gb25seSBoYXBwZW5lZCBpZiBzaXplID09PSAxIHdoaWNoIGlzIGhhbmRsZVxuICAgICAgICAgICAgLy8gYnkgdGhlIGNhc2UgYWJvdmUuXG4gICAgICAgICAgICBpZiAoIWl0ZW0ucHJldmlvdXMpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0ludmFsaWQgbGlzdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbS5wcmV2aW91cy5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBuZXh0ID0gaXRlbS5uZXh0O1xuICAgICAgICAgICAgY29uc3QgcHJldmlvdXMgPSBpdGVtLnByZXZpb3VzO1xuICAgICAgICAgICAgaWYgKCFuZXh0IHx8ICFwcmV2aW91cykge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBsaXN0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBuZXh0LnByZXZpb3VzID0gcHJldmlvdXM7XG4gICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gbmV4dDtcbiAgICAgICAgfVxuICAgICAgICBpdGVtLm5leHQgPSB1bmRlZmluZWQ7XG4gICAgICAgIGl0ZW0ucHJldmlvdXMgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuX3N0YXRlKys7XG4gICAgfVxuICAgIHRvdWNoKGl0ZW0sIHRvdWNoKSB7XG4gICAgICAgIGlmICghdGhpcy5faGVhZCB8fCAhdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGxpc3QnKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoKHRvdWNoICE9PSBUb3VjaC5GaXJzdCAmJiB0b3VjaCAhPT0gVG91Y2guTGFzdCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodG91Y2ggPT09IFRvdWNoLkZpcnN0KSB7XG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBpdGVtLm5leHQ7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgICAgICAvLyBVbmxpbmsgdGhlIGl0ZW1cbiAgICAgICAgICAgIGlmIChpdGVtID09PSB0aGlzLl90YWlsKSB7XG4gICAgICAgICAgICAgICAgLy8gcHJldmlvdXMgbXVzdCBiZSBkZWZpbmVkIHNpbmNlIGl0ZW0gd2FzIG5vdCBoZWFkIGJ1dCBpcyB0YWlsXG4gICAgICAgICAgICAgICAgLy8gU28gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbiBpdGVtIGluIHRoZSBtYXBcbiAgICAgICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuX3RhaWwgPSBwcmV2aW91cztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIEJvdGggbmV4dCBhbmQgcHJldmlvdXMgYXJlIG5vdCB1bmRlZmluZWQgc2luY2UgaXRlbSB3YXMgbmVpdGhlciBoZWFkIG5vciB0YWlsLlxuICAgICAgICAgICAgICAgIG5leHQucHJldmlvdXMgPSBwcmV2aW91cztcbiAgICAgICAgICAgICAgICBwcmV2aW91cy5uZXh0ID0gbmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEluc2VydCB0aGUgbm9kZSBhdCBoZWFkXG4gICAgICAgICAgICBpdGVtLnByZXZpb3VzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdGhpcy5faGVhZDtcbiAgICAgICAgICAgIHRoaXMuX2hlYWQucHJldmlvdXMgPSBpdGVtO1xuICAgICAgICAgICAgdGhpcy5faGVhZCA9IGl0ZW07XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRvdWNoID09PSBUb3VjaC5MYXN0KSB7XG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5fdGFpbCkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IG5leHQgPSBpdGVtLm5leHQ7XG4gICAgICAgICAgICBjb25zdCBwcmV2aW91cyA9IGl0ZW0ucHJldmlvdXM7XG4gICAgICAgICAgICAvLyBVbmxpbmsgdGhlIGl0ZW0uXG4gICAgICAgICAgICBpZiAoaXRlbSA9PT0gdGhpcy5faGVhZCkge1xuICAgICAgICAgICAgICAgIC8vIG5leHQgbXVzdCBiZSBkZWZpbmVkIHNpbmNlIGl0ZW0gd2FzIG5vdCB0YWlsIGJ1dCBpcyBoZWFkXG4gICAgICAgICAgICAgICAgLy8gU28gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbiBpdGVtIGluIHRoZSBtYXBcbiAgICAgICAgICAgICAgICBuZXh0LnByZXZpb3VzID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIHRoaXMuX2hlYWQgPSBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQm90aCBuZXh0IGFuZCBwcmV2aW91cyBhcmUgbm90IHVuZGVmaW5lZCBzaW5jZSBpdGVtIHdhcyBuZWl0aGVyIGhlYWQgbm9yIHRhaWwuXG4gICAgICAgICAgICAgICAgbmV4dC5wcmV2aW91cyA9IHByZXZpb3VzO1xuICAgICAgICAgICAgICAgIHByZXZpb3VzLm5leHQgPSBuZXh0O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaXRlbS5uZXh0ID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaXRlbS5wcmV2aW91cyA9IHRoaXMuX3RhaWw7XG4gICAgICAgICAgICB0aGlzLl90YWlsLm5leHQgPSBpdGVtO1xuICAgICAgICAgICAgdGhpcy5fdGFpbCA9IGl0ZW07XG4gICAgICAgICAgICB0aGlzLl9zdGF0ZSsrO1xuICAgICAgICB9XG4gICAgfVxuICAgIHRvSlNPTigpIHtcbiAgICAgICAgY29uc3QgZGF0YSA9IFtdO1xuICAgICAgICB0aGlzLmZvckVhY2goKHZhbHVlLCBrZXkpID0+IHtcbiAgICAgICAgICAgIGRhdGEucHVzaChba2V5LCB2YWx1ZV0pO1xuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuICAgIGZyb21KU09OKGRhdGEpIHtcbiAgICAgICAgdGhpcy5jbGVhcigpO1xuICAgICAgICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBkYXRhKSB7XG4gICAgICAgICAgICB0aGlzLnNldChrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuTGlua2VkTWFwID0gTGlua2VkTWFwO1xuY2xhc3MgTFJVQ2FjaGUgZXh0ZW5kcyBMaW5rZWRNYXAge1xuICAgIGNvbnN0cnVjdG9yKGxpbWl0LCByYXRpbyA9IDEpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5fbGltaXQgPSBsaW1pdDtcbiAgICAgICAgdGhpcy5fcmF0aW8gPSBNYXRoLm1pbihNYXRoLm1heCgwLCByYXRpbyksIDEpO1xuICAgIH1cbiAgICBnZXQgbGltaXQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9saW1pdDtcbiAgICB9XG4gICAgc2V0IGxpbWl0KGxpbWl0KSB7XG4gICAgICAgIHRoaXMuX2xpbWl0ID0gbGltaXQ7XG4gICAgICAgIHRoaXMuY2hlY2tUcmltKCk7XG4gICAgfVxuICAgIGdldCByYXRpbygpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3JhdGlvO1xuICAgIH1cbiAgICBzZXQgcmF0aW8ocmF0aW8pIHtcbiAgICAgICAgdGhpcy5fcmF0aW8gPSBNYXRoLm1pbihNYXRoLm1heCgwLCByYXRpbyksIDEpO1xuICAgICAgICB0aGlzLmNoZWNrVHJpbSgpO1xuICAgIH1cbiAgICBnZXQoa2V5LCB0b3VjaCA9IFRvdWNoLkFzTmV3KSB7XG4gICAgICAgIHJldHVybiBzdXBlci5nZXQoa2V5LCB0b3VjaCk7XG4gICAgfVxuICAgIHBlZWsoa2V5KSB7XG4gICAgICAgIHJldHVybiBzdXBlci5nZXQoa2V5LCBUb3VjaC5Ob25lKTtcbiAgICB9XG4gICAgc2V0KGtleSwgdmFsdWUpIHtcbiAgICAgICAgc3VwZXIuc2V0KGtleSwgdmFsdWUsIFRvdWNoLkxhc3QpO1xuICAgICAgICB0aGlzLmNoZWNrVHJpbSgpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG4gICAgY2hlY2tUcmltKCkge1xuICAgICAgICBpZiAodGhpcy5zaXplID4gdGhpcy5fbGltaXQpIHtcbiAgICAgICAgICAgIHRoaXMudHJpbU9sZChNYXRoLnJvdW5kKHRoaXMuX2xpbWl0ICogdGhpcy5fcmF0aW8pKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuTFJVQ2FjaGUgPSBMUlVDYWNoZTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5EaXNwb3NhYmxlID0gdm9pZCAwO1xudmFyIERpc3Bvc2FibGU7XG4oZnVuY3Rpb24gKERpc3Bvc2FibGUpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUoZnVuYykge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGlzcG9zZTogZnVuY1xuICAgICAgICB9O1xuICAgIH1cbiAgICBEaXNwb3NhYmxlLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKERpc3Bvc2FibGUgfHwgKGV4cG9ydHMuRGlzcG9zYWJsZSA9IERpc3Bvc2FibGUgPSB7fSkpO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xubGV0IF9yYWw7XG5mdW5jdGlvbiBSQUwoKSB7XG4gICAgaWYgKF9yYWwgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE5vIHJ1bnRpbWUgYWJzdHJhY3Rpb24gbGF5ZXIgaW5zdGFsbGVkYCk7XG4gICAgfVxuICAgIHJldHVybiBfcmFsO1xufVxuKGZ1bmN0aW9uIChSQUwpIHtcbiAgICBmdW5jdGlvbiBpbnN0YWxsKHJhbCkge1xuICAgICAgICBpZiAocmFsID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgTm8gcnVudGltZSBhYnN0cmFjdGlvbiBsYXllciBwcm92aWRlZGApO1xuICAgICAgICB9XG4gICAgICAgIF9yYWwgPSByYWw7XG4gICAgfVxuICAgIFJBTC5pbnN0YWxsID0gaW5zdGFsbDtcbn0pKFJBTCB8fCAoUkFMID0ge30pKTtcbmV4cG9ydHMuZGVmYXVsdCA9IFJBTDtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuRW1pdHRlciA9IGV4cG9ydHMuRXZlbnQgPSB2b2lkIDA7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbnZhciBFdmVudDtcbihmdW5jdGlvbiAoRXZlbnQpIHtcbiAgICBjb25zdCBfZGlzcG9zYWJsZSA9IHsgZGlzcG9zZSgpIHsgfSB9O1xuICAgIEV2ZW50Lk5vbmUgPSBmdW5jdGlvbiAoKSB7IHJldHVybiBfZGlzcG9zYWJsZTsgfTtcbn0pKEV2ZW50IHx8IChleHBvcnRzLkV2ZW50ID0gRXZlbnQgPSB7fSkpO1xuY2xhc3MgQ2FsbGJhY2tMaXN0IHtcbiAgICBhZGQoY2FsbGJhY2ssIGNvbnRleHQgPSBudWxsLCBidWNrZXQpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IFtdO1xuICAgICAgICAgICAgdGhpcy5fY29udGV4dHMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl9jYWxsYmFja3MucHVzaChjYWxsYmFjayk7XG4gICAgICAgIHRoaXMuX2NvbnRleHRzLnB1c2goY29udGV4dCk7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGJ1Y2tldCkpIHtcbiAgICAgICAgICAgIGJ1Y2tldC5wdXNoKHsgZGlzcG9zZTogKCkgPT4gdGhpcy5yZW1vdmUoY2FsbGJhY2ssIGNvbnRleHQpIH0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlbW92ZShjYWxsYmFjaywgY29udGV4dCA9IG51bGwpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgZm91bmRDYWxsYmFja1dpdGhEaWZmZXJlbnRDb250ZXh0ID0gZmFsc2U7XG4gICAgICAgIGZvciAobGV0IGkgPSAwLCBsZW4gPSB0aGlzLl9jYWxsYmFja3MubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIGlmICh0aGlzLl9jYWxsYmFja3NbaV0gPT09IGNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuX2NvbnRleHRzW2ldID09PSBjb250ZXh0KSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGNhbGxiYWNrICYgY29udGV4dCBtYXRjaCA9PiByZW1vdmUgaXRcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzLnNwbGljZShpLCAxKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fY29udGV4dHMuc3BsaWNlKGksIDEpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBmb3VuZENhbGxiYWNrV2l0aERpZmZlcmVudENvbnRleHQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoZm91bmRDYWxsYmFja1dpdGhEaWZmZXJlbnRDb250ZXh0KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1doZW4gYWRkaW5nIGEgbGlzdGVuZXIgd2l0aCBhIGNvbnRleHQsIHlvdSBzaG91bGQgcmVtb3ZlIGl0IHdpdGggdGhlIHNhbWUgY29udGV4dCcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGludm9rZSguLi5hcmdzKSB7XG4gICAgICAgIGlmICghdGhpcy5fY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgcmV0ID0gW10sIGNhbGxiYWNrcyA9IHRoaXMuX2NhbGxiYWNrcy5zbGljZSgwKSwgY29udGV4dHMgPSB0aGlzLl9jb250ZXh0cy5zbGljZSgwKTtcbiAgICAgICAgZm9yIChsZXQgaSA9IDAsIGxlbiA9IGNhbGxiYWNrcy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXQucHVzaChjYWxsYmFja3NbaV0uYXBwbHkoY29udGV4dHNbaV0sIGFyZ3MpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLWNvbnNvbGVcbiAgICAgICAgICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS5jb25zb2xlLmVycm9yKGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXQ7XG4gICAgfVxuICAgIGlzRW1wdHkoKSB7XG4gICAgICAgIHJldHVybiAhdGhpcy5fY2FsbGJhY2tzIHx8IHRoaXMuX2NhbGxiYWNrcy5sZW5ndGggPT09IDA7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIHRoaXMuX2NhbGxiYWNrcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgdGhpcy5fY29udGV4dHMgPSB1bmRlZmluZWQ7XG4gICAgfVxufVxuY2xhc3MgRW1pdHRlciB7XG4gICAgY29uc3RydWN0b3IoX29wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5fb3B0aW9ucyA9IF9vcHRpb25zO1xuICAgIH1cbiAgICAvKipcbiAgICAgKiBGb3IgdGhlIHB1YmxpYyB0byBhbGxvdyB0byBzdWJzY3JpYmVcbiAgICAgKiB0byBldmVudHMgZnJvbSB0aGlzIEVtaXR0ZXJcbiAgICAgKi9cbiAgICBnZXQgZXZlbnQoKSB7XG4gICAgICAgIGlmICghdGhpcy5fZXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMuX2V2ZW50ID0gKGxpc3RlbmVyLCB0aGlzQXJncywgZGlzcG9zYWJsZXMpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX2NhbGxiYWNrcykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9jYWxsYmFja3MgPSBuZXcgQ2FsbGJhY2tMaXN0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMub25GaXJzdExpc3RlbmVyQWRkICYmIHRoaXMuX2NhbGxiYWNrcy5pc0VtcHR5KCkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fb3B0aW9ucy5vbkZpcnN0TGlzdGVuZXJBZGQodGhpcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5hZGQobGlzdGVuZXIsIHRoaXNBcmdzKTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXN1bHQgPSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3Bvc2U6ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghdGhpcy5fY2FsbGJhY2tzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGlzcG9zYWJsZSBpcyBkaXNwb3NlZCBhZnRlciBlbWl0dGVyIGlzIGRpc3Bvc2VkLlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5yZW1vdmUobGlzdGVuZXIsIHRoaXNBcmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5kaXNwb3NlID0gRW1pdHRlci5fbm9vcDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLl9vcHRpb25zICYmIHRoaXMuX29wdGlvbnMub25MYXN0TGlzdGVuZXJSZW1vdmUgJiYgdGhpcy5fY2FsbGJhY2tzLmlzRW1wdHkoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX29wdGlvbnMub25MYXN0TGlzdGVuZXJSZW1vdmUodGhpcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGRpc3Bvc2FibGVzKSkge1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlcy5wdXNoKHJlc3VsdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9ldmVudDtcbiAgICB9XG4gICAgLyoqXG4gICAgICogVG8gYmUga2VwdCBwcml2YXRlIHRvIGZpcmUgYW4gZXZlbnQgdG9cbiAgICAgKiBzdWJzY3JpYmVyc1xuICAgICAqL1xuICAgIGZpcmUoZXZlbnQpIHtcbiAgICAgICAgaWYgKHRoaXMuX2NhbGxiYWNrcykge1xuICAgICAgICAgICAgdGhpcy5fY2FsbGJhY2tzLmludm9rZS5jYWxsKHRoaXMuX2NhbGxiYWNrcywgZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLl9jYWxsYmFja3MpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGxiYWNrcy5kaXNwb3NlKCk7XG4gICAgICAgICAgICB0aGlzLl9jYWxsYmFja3MgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLkVtaXR0ZXIgPSBFbWl0dGVyO1xuRW1pdHRlci5fbm9vcCA9IGZ1bmN0aW9uICgpIHsgfTtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiAgQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiAgTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uVG9rZW4gPSB2b2lkIDA7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbmNvbnN0IElzID0gcmVxdWlyZShcIi4vaXNcIik7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCIuL2V2ZW50c1wiKTtcbnZhciBDYW5jZWxsYXRpb25Ub2tlbjtcbihmdW5jdGlvbiAoQ2FuY2VsbGF0aW9uVG9rZW4pIHtcbiAgICBDYW5jZWxsYXRpb25Ub2tlbi5Ob25lID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGlzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkOiBmYWxzZSxcbiAgICAgICAgb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6IGV2ZW50c18xLkV2ZW50Lk5vbmVcbiAgICB9KTtcbiAgICBDYW5jZWxsYXRpb25Ub2tlbi5DYW5jZWxsZWQgPSBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6IHRydWUsXG4gICAgICAgIG9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkOiBldmVudHNfMS5FdmVudC5Ob25lXG4gICAgfSk7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgKGNhbmRpZGF0ZSA9PT0gQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZVxuICAgICAgICAgICAgfHwgY2FuZGlkYXRlID09PSBDYW5jZWxsYXRpb25Ub2tlbi5DYW5jZWxsZWRcbiAgICAgICAgICAgIHx8IChJcy5ib29sZWFuKGNhbmRpZGF0ZS5pc0NhbmNlbGxhdGlvblJlcXVlc3RlZCkgJiYgISFjYW5kaWRhdGUub25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQpKTtcbiAgICB9XG4gICAgQ2FuY2VsbGF0aW9uVG9rZW4uaXMgPSBpcztcbn0pKENhbmNlbGxhdGlvblRva2VuIHx8IChleHBvcnRzLkNhbmNlbGxhdGlvblRva2VuID0gQ2FuY2VsbGF0aW9uVG9rZW4gPSB7fSkpO1xuY29uc3Qgc2hvcnRjdXRFdmVudCA9IE9iamVjdC5mcmVlemUoZnVuY3Rpb24gKGNhbGxiYWNrLCBjb250ZXh0KSB7XG4gICAgY29uc3QgaGFuZGxlID0gKDAsIHJhbF8xLmRlZmF1bHQpKCkudGltZXIuc2V0VGltZW91dChjYWxsYmFjay5iaW5kKGNvbnRleHQpLCAwKTtcbiAgICByZXR1cm4geyBkaXNwb3NlKCkgeyBoYW5kbGUuZGlzcG9zZSgpOyB9IH07XG59KTtcbmNsYXNzIE11dGFibGVUb2tlbiB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMuX2lzQ2FuY2VsbGVkID0gZmFsc2U7XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl9pc0NhbmNlbGxlZCkge1xuICAgICAgICAgICAgdGhpcy5faXNDYW5jZWxsZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHRoaXMuX2VtaXR0ZXIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmZpcmUodW5kZWZpbmVkKTtcbiAgICAgICAgICAgICAgICB0aGlzLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICBnZXQgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9pc0NhbmNlbGxlZDtcbiAgICB9XG4gICAgZ2V0IG9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKCkge1xuICAgICAgICBpZiAodGhpcy5faXNDYW5jZWxsZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBzaG9ydGN1dEV2ZW50O1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5fZW1pdHRlcikge1xuICAgICAgICAgICAgdGhpcy5fZW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2VtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICh0aGlzLl9lbWl0dGVyKSB7XG4gICAgICAgICAgICB0aGlzLl9lbWl0dGVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRoaXMuX2VtaXR0ZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG5jbGFzcyBDYW5jZWxsYXRpb25Ub2tlblNvdXJjZSB7XG4gICAgZ2V0IHRva2VuKCkge1xuICAgICAgICBpZiAoIXRoaXMuX3Rva2VuKSB7XG4gICAgICAgICAgICAvLyBiZSBsYXp5IGFuZCBjcmVhdGUgdGhlIHRva2VuIG9ubHkgd2hlblxuICAgICAgICAgICAgLy8gYWN0dWFsbHkgbmVlZGVkXG4gICAgICAgICAgICB0aGlzLl90b2tlbiA9IG5ldyBNdXRhYmxlVG9rZW4oKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fdG9rZW47XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLl90b2tlbikge1xuICAgICAgICAgICAgLy8gc2F2ZSBhbiBvYmplY3QgYnkgcmV0dXJuaW5nIHRoZSBkZWZhdWx0XG4gICAgICAgICAgICAvLyBjYW5jZWxsZWQgdG9rZW4gd2hlbiBjYW5jZWxsYXRpb24gaGFwcGVuc1xuICAgICAgICAgICAgLy8gYmVmb3JlIHNvbWVvbmUgYXNrcyBmb3IgdGhlIHRva2VuXG4gICAgICAgICAgICB0aGlzLl90b2tlbiA9IENhbmNlbGxhdGlvblRva2VuLkNhbmNlbGxlZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuX3Rva2VuLmNhbmNlbCgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRpc3Bvc2UoKSB7XG4gICAgICAgIGlmICghdGhpcy5fdG9rZW4pIHtcbiAgICAgICAgICAgIC8vIGVuc3VyZSB0byBpbml0aWFsaXplIHdpdGggYW4gZW1wdHkgdG9rZW4gaWYgd2UgaGFkIG5vbmVcbiAgICAgICAgICAgIHRoaXMuX3Rva2VuID0gQ2FuY2VsbGF0aW9uVG9rZW4uTm9uZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLl90b2tlbiBpbnN0YW5jZW9mIE11dGFibGVUb2tlbikge1xuICAgICAgICAgICAgLy8gYWN0dWFsbHkgZGlzcG9zZVxuICAgICAgICAgICAgdGhpcy5fdG9rZW4uZGlzcG9zZSgpO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IENhbmNlbGxhdGlvblRva2VuU291cmNlO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3kgPSB2b2lkIDA7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbnZhciBDYW5jZWxsYXRpb25TdGF0ZTtcbihmdW5jdGlvbiAoQ2FuY2VsbGF0aW9uU3RhdGUpIHtcbiAgICBDYW5jZWxsYXRpb25TdGF0ZS5Db250aW51ZSA9IDA7XG4gICAgQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkID0gMTtcbn0pKENhbmNlbGxhdGlvblN0YXRlIHx8IChDYW5jZWxsYXRpb25TdGF0ZSA9IHt9KSk7XG5jbGFzcyBTaGFyZWRBcnJheVNlbmRlclN0cmF0ZWd5IHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5idWZmZXJzID0gbmV3IE1hcCgpO1xuICAgIH1cbiAgICBlbmFibGVDYW5jZWxsYXRpb24ocmVxdWVzdCkge1xuICAgICAgICBpZiAocmVxdWVzdC5pZCA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IG5ldyBTaGFyZWRBcnJheUJ1ZmZlcig0KTtcbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBJbnQzMkFycmF5KGJ1ZmZlciwgMCwgMSk7XG4gICAgICAgIGRhdGFbMF0gPSBDYW5jZWxsYXRpb25TdGF0ZS5Db250aW51ZTtcbiAgICAgICAgdGhpcy5idWZmZXJzLnNldChyZXF1ZXN0LmlkLCBidWZmZXIpO1xuICAgICAgICByZXF1ZXN0LiRjYW5jZWxsYXRpb25EYXRhID0gYnVmZmVyO1xuICAgIH1cbiAgICBhc3luYyBzZW5kQ2FuY2VsbGF0aW9uKF9jb25uLCBpZCkge1xuICAgICAgICBjb25zdCBidWZmZXIgPSB0aGlzLmJ1ZmZlcnMuZ2V0KGlkKTtcbiAgICAgICAgaWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF0YSA9IG5ldyBJbnQzMkFycmF5KGJ1ZmZlciwgMCwgMSk7XG4gICAgICAgIEF0b21pY3Muc3RvcmUoZGF0YSwgMCwgQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkKTtcbiAgICB9XG4gICAgY2xlYW51cChpZCkge1xuICAgICAgICB0aGlzLmJ1ZmZlcnMuZGVsZXRlKGlkKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy5idWZmZXJzLmNsZWFyKCk7XG4gICAgfVxufVxuZXhwb3J0cy5TaGFyZWRBcnJheVNlbmRlclN0cmF0ZWd5ID0gU2hhcmVkQXJyYXlTZW5kZXJTdHJhdGVneTtcbmNsYXNzIFNoYXJlZEFycmF5QnVmZmVyQ2FuY2VsbGF0aW9uVG9rZW4ge1xuICAgIGNvbnN0cnVjdG9yKGJ1ZmZlcikge1xuICAgICAgICB0aGlzLmRhdGEgPSBuZXcgSW50MzJBcnJheShidWZmZXIsIDAsIDEpO1xuICAgIH1cbiAgICBnZXQgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHJldHVybiBBdG9taWNzLmxvYWQodGhpcy5kYXRhLCAwKSA9PT0gQ2FuY2VsbGF0aW9uU3RhdGUuQ2FuY2VsbGVkO1xuICAgIH1cbiAgICBnZXQgb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuY2VsbGF0aW9uIG92ZXIgU2hhcmVkQXJyYXlCdWZmZXIgZG9lc24ndCBzdXBwb3J0IGNhbmNlbGxhdGlvbiBldmVudHNgKTtcbiAgICB9XG59XG5jbGFzcyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuU291cmNlIHtcbiAgICBjb25zdHJ1Y3RvcihidWZmZXIpIHtcbiAgICAgICAgdGhpcy50b2tlbiA9IG5ldyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuKGJ1ZmZlcik7XG4gICAgfVxuICAgIGNhbmNlbCgpIHtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICB9XG59XG5jbGFzcyBTaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmtpbmQgPSAncmVxdWVzdCc7XG4gICAgfVxuICAgIGNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKHJlcXVlc3QpIHtcbiAgICAgICAgY29uc3QgYnVmZmVyID0gcmVxdWVzdC4kY2FuY2VsbGF0aW9uRGF0YTtcbiAgICAgICAgaWYgKGJ1ZmZlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuU291cmNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG5ldyBTaGFyZWRBcnJheUJ1ZmZlckNhbmNlbGxhdGlvblRva2VuU291cmNlKGJ1ZmZlcik7XG4gICAgfVxufVxuZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBTaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3k7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLlNlbWFwaG9yZSA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY2xhc3MgU2VtYXBob3JlIHtcbiAgICBjb25zdHJ1Y3RvcihjYXBhY2l0eSA9IDEpIHtcbiAgICAgICAgaWYgKGNhcGFjaXR5IDw9IDApIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignQ2FwYWNpdHkgbXVzdCBiZSBncmVhdGVyIHRoYW4gMCcpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2NhcGFjaXR5ID0gY2FwYWNpdHk7XG4gICAgICAgIHRoaXMuX2FjdGl2ZSA9IDA7XG4gICAgICAgIHRoaXMuX3dhaXRpbmcgPSBbXTtcbiAgICB9XG4gICAgbG9jayh0aHVuaykge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fd2FpdGluZy5wdXNoKHsgdGh1bmssIHJlc29sdmUsIHJlamVjdCB9KTtcbiAgICAgICAgICAgIHRoaXMucnVuTmV4dCgpO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgZ2V0IGFjdGl2ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX2FjdGl2ZTtcbiAgICB9XG4gICAgcnVuTmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dhaXRpbmcubGVuZ3RoID09PSAwIHx8IHRoaXMuX2FjdGl2ZSA9PT0gdGhpcy5fY2FwYWNpdHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS50aW1lci5zZXRJbW1lZGlhdGUoKCkgPT4gdGhpcy5kb1J1bk5leHQoKSk7XG4gICAgfVxuICAgIGRvUnVuTmV4dCgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dhaXRpbmcubGVuZ3RoID09PSAwIHx8IHRoaXMuX2FjdGl2ZSA9PT0gdGhpcy5fY2FwYWNpdHkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBuZXh0ID0gdGhpcy5fd2FpdGluZy5zaGlmdCgpO1xuICAgICAgICB0aGlzLl9hY3RpdmUrKztcbiAgICAgICAgaWYgKHRoaXMuX2FjdGl2ZSA+IHRoaXMuX2NhcGFjaXR5KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFRvIG1hbnkgdGh1bmtzIGFjdGl2ZWApO1xuICAgICAgICB9XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQgPSBuZXh0LnRodW5rKCk7XG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC50aGVuKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5yZXNvbHZlKHZhbHVlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5OZXh0KCk7XG4gICAgICAgICAgICAgICAgfSwgKGVycikgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICAgICAgbmV4dC5yZWplY3QoZXJyKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ydW5OZXh0KCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgICAgICBuZXh0LnJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgICAgICB0aGlzLnJ1bk5leHQoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICB0aGlzLl9hY3RpdmUtLTtcbiAgICAgICAgICAgIG5leHQucmVqZWN0KGVycik7XG4gICAgICAgICAgICB0aGlzLnJ1bk5leHQoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbmV4cG9ydHMuU2VtYXBob3JlID0gU2VtYXBob3JlO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiX19lc01vZHVsZVwiLCB7IHZhbHVlOiB0cnVlIH0pO1xuZXhwb3J0cy5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXIgPSBleHBvcnRzLkFic3RyYWN0TWVzc2FnZVJlYWRlciA9IGV4cG9ydHMuTWVzc2FnZVJlYWRlciA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IGV2ZW50c18xID0gcmVxdWlyZShcIi4vZXZlbnRzXCIpO1xuY29uc3Qgc2VtYXBob3JlXzEgPSByZXF1aXJlKFwiLi9zZW1hcGhvcmVcIik7XG52YXIgTWVzc2FnZVJlYWRlcjtcbihmdW5jdGlvbiAoTWVzc2FnZVJlYWRlcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5saXN0ZW4pICYmIElzLmZ1bmMoY2FuZGlkYXRlLmRpc3Bvc2UpICYmXG4gICAgICAgICAgICBJcy5mdW5jKGNhbmRpZGF0ZS5vbkVycm9yKSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5vbkNsb3NlKSAmJiBJcy5mdW5jKGNhbmRpZGF0ZS5vblBhcnRpYWxNZXNzYWdlKTtcbiAgICB9XG4gICAgTWVzc2FnZVJlYWRlci5pcyA9IGlzO1xufSkoTWVzc2FnZVJlYWRlciB8fCAoZXhwb3J0cy5NZXNzYWdlUmVhZGVyID0gTWVzc2FnZVJlYWRlciA9IHt9KSk7XG5jbGFzcyBBYnN0cmFjdE1lc3NhZ2VSZWFkZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZUVtaXR0ZXIgPSBuZXcgZXZlbnRzXzEuRW1pdHRlcigpO1xuICAgIH1cbiAgICBkaXNwb3NlKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlci5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyLmRpc3Bvc2UoKTtcbiAgICB9XG4gICAgZ2V0IG9uRXJyb3IoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVycm9yRW1pdHRlci5ldmVudDtcbiAgICB9XG4gICAgZmlyZUVycm9yKGVycm9yKSB7XG4gICAgICAgIHRoaXMuZXJyb3JFbWl0dGVyLmZpcmUodGhpcy5hc0Vycm9yKGVycm9yKSk7XG4gICAgfVxuICAgIGdldCBvbkNsb3NlKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5jbG9zZUVtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGZpcmVDbG9zZSgpIHtcbiAgICAgICAgdGhpcy5jbG9zZUVtaXR0ZXIuZmlyZSh1bmRlZmluZWQpO1xuICAgIH1cbiAgICBnZXQgb25QYXJ0aWFsTWVzc2FnZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucGFydGlhbE1lc3NhZ2VFbWl0dGVyLmV2ZW50O1xuICAgIH1cbiAgICBmaXJlUGFydGlhbE1lc3NhZ2UoaW5mbykge1xuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlRW1pdHRlci5maXJlKGluZm8pO1xuICAgIH1cbiAgICBhc0Vycm9yKGVycm9yKSB7XG4gICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIEVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm4gZXJyb3I7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IEVycm9yKGBSZWFkZXIgcmVjZWl2ZWQgZXJyb3IuIFJlYXNvbjogJHtJcy5zdHJpbmcoZXJyb3IubWVzc2FnZSkgPyBlcnJvci5tZXNzYWdlIDogJ3Vua25vd24nfWApO1xuICAgICAgICB9XG4gICAgfVxufVxuZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VSZWFkZXIgPSBBYnN0cmFjdE1lc3NhZ2VSZWFkZXI7XG52YXIgUmVzb2x2ZWRNZXNzYWdlUmVhZGVyT3B0aW9ucztcbihmdW5jdGlvbiAoUmVzb2x2ZWRNZXNzYWdlUmVhZGVyT3B0aW9ucykge1xuICAgIGZ1bmN0aW9uIGZyb21PcHRpb25zKG9wdGlvbnMpIHtcbiAgICAgICAgbGV0IGNoYXJzZXQ7XG4gICAgICAgIGxldCByZXN1bHQ7XG4gICAgICAgIGxldCBjb250ZW50RGVjb2RlcjtcbiAgICAgICAgY29uc3QgY29udGVudERlY29kZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICBsZXQgY29udGVudFR5cGVEZWNvZGVyO1xuICAgICAgICBjb25zdCBjb250ZW50VHlwZURlY29kZXJzID0gbmV3IE1hcCgpO1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgY2hhcnNldCA9IG9wdGlvbnMgPz8gJ3V0Zi04JztcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGNoYXJzZXQgPSBvcHRpb25zLmNoYXJzZXQgPz8gJ3V0Zi04JztcbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnREZWNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50RGVjb2RlciA9IG9wdGlvbnMuY29udGVudERlY29kZXI7XG4gICAgICAgICAgICAgICAgY29udGVudERlY29kZXJzLnNldChjb250ZW50RGVjb2Rlci5uYW1lLCBjb250ZW50RGVjb2Rlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAob3B0aW9ucy5jb250ZW50RGVjb2RlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGVjb2RlciBvZiBvcHRpb25zLmNvbnRlbnREZWNvZGVycykge1xuICAgICAgICAgICAgICAgICAgICBjb250ZW50RGVjb2RlcnMuc2V0KGRlY29kZXIubmFtZSwgZGVjb2Rlcik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuY29udGVudFR5cGVEZWNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXIgPSBvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcjtcbiAgICAgICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXJzLnNldChjb250ZW50VHlwZURlY29kZXIubmFtZSwgY29udGVudFR5cGVEZWNvZGVyKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcnMgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGZvciAoY29uc3QgZGVjb2RlciBvZiBvcHRpb25zLmNvbnRlbnRUeXBlRGVjb2RlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGVudFR5cGVEZWNvZGVycy5zZXQoZGVjb2Rlci5uYW1lLCBkZWNvZGVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvbnRlbnRUeXBlRGVjb2RlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBjb250ZW50VHlwZURlY29kZXIgPSAoMCwgcmFsXzEuZGVmYXVsdCkoKS5hcHBsaWNhdGlvbkpzb24uZGVjb2RlcjtcbiAgICAgICAgICAgIGNvbnRlbnRUeXBlRGVjb2RlcnMuc2V0KGNvbnRlbnRUeXBlRGVjb2Rlci5uYW1lLCBjb250ZW50VHlwZURlY29kZXIpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGNoYXJzZXQsIGNvbnRlbnREZWNvZGVyLCBjb250ZW50RGVjb2RlcnMsIGNvbnRlbnRUeXBlRGVjb2RlciwgY29udGVudFR5cGVEZWNvZGVycyB9O1xuICAgIH1cbiAgICBSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zLmZyb21PcHRpb25zID0gZnJvbU9wdGlvbnM7XG59KShSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zIHx8IChSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zID0ge30pKTtcbmNsYXNzIFJlYWRhYmxlU3RyZWFtTWVzc2FnZVJlYWRlciBleHRlbmRzIEFic3RyYWN0TWVzc2FnZVJlYWRlciB7XG4gICAgY29uc3RydWN0b3IocmVhZGFibGUsIG9wdGlvbnMpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZSA9IHJlYWRhYmxlO1xuICAgICAgICB0aGlzLm9wdGlvbnMgPSBSZXNvbHZlZE1lc3NhZ2VSZWFkZXJPcHRpb25zLmZyb21PcHRpb25zKG9wdGlvbnMpO1xuICAgICAgICB0aGlzLmJ1ZmZlciA9ICgwLCByYWxfMS5kZWZhdWx0KSgpLm1lc3NhZ2VCdWZmZXIuY3JlYXRlKHRoaXMub3B0aW9ucy5jaGFyc2V0KTtcbiAgICAgICAgdGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0ID0gMTAwMDA7XG4gICAgICAgIHRoaXMubmV4dE1lc3NhZ2VMZW5ndGggPSAtMTtcbiAgICAgICAgdGhpcy5tZXNzYWdlVG9rZW4gPSAwO1xuICAgICAgICB0aGlzLnJlYWRTZW1hcGhvcmUgPSBuZXcgc2VtYXBob3JlXzEuU2VtYXBob3JlKDEpO1xuICAgIH1cbiAgICBzZXQgcGFydGlhbE1lc3NhZ2VUaW1lb3V0KHRpbWVvdXQpIHtcbiAgICAgICAgdGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0ID0gdGltZW91dDtcbiAgICB9XG4gICAgZ2V0IHBhcnRpYWxNZXNzYWdlVGltZW91dCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dDtcbiAgICB9XG4gICAgbGlzdGVuKGNhbGxiYWNrKSB7XG4gICAgICAgIHRoaXMubmV4dE1lc3NhZ2VMZW5ndGggPSAtMTtcbiAgICAgICAgdGhpcy5tZXNzYWdlVG9rZW4gPSAwO1xuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlVGltZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGhpcy5yZWFkYWJsZS5vbkRhdGEoKGRhdGEpID0+IHtcbiAgICAgICAgICAgIHRoaXMub25EYXRhKGRhdGEpO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZS5vbkVycm9yKChlcnJvcikgPT4gdGhpcy5maXJlRXJyb3IoZXJyb3IpKTtcbiAgICAgICAgdGhpcy5yZWFkYWJsZS5vbkNsb3NlKCgpID0+IHRoaXMuZmlyZUNsb3NlKCkpO1xuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBvbkRhdGEoZGF0YSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdGhpcy5idWZmZXIuYXBwZW5kKGRhdGEpO1xuICAgICAgICAgICAgd2hpbGUgKHRydWUpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgaGVhZGVycyA9IHRoaXMuYnVmZmVyLnRyeVJlYWRIZWFkZXJzKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWhlYWRlcnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb250ZW50TGVuZ3RoID0gaGVhZGVycy5nZXQoJ2NvbnRlbnQtbGVuZ3RoJyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY29udGVudExlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IobmV3IEVycm9yKGBIZWFkZXIgbXVzdCBwcm92aWRlIGEgQ29udGVudC1MZW5ndGggcHJvcGVydHkuXFxuJHtKU09OLnN0cmluZ2lmeShPYmplY3QuZnJvbUVudHJpZXMoaGVhZGVycykpfWApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBsZW5ndGggPSBwYXJzZUludChjb250ZW50TGVuZ3RoKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGlzTmFOKGxlbmd0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKG5ldyBFcnJvcihgQ29udGVudC1MZW5ndGggdmFsdWUgbXVzdCBiZSBhIG51bWJlci4gR290ICR7Y29udGVudExlbmd0aH1gKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9IGxlbmd0aDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY29uc3QgYm9keSA9IHRoaXMuYnVmZmVyLnRyeVJlYWRCb2R5KHRoaXMubmV4dE1lc3NhZ2VMZW5ndGgpO1xuICAgICAgICAgICAgICAgIGlmIChib2R5ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgLyoqIFdlIGhhdmVuJ3QgcmVjZWl2ZWQgdGhlIGZ1bGwgbWVzc2FnZSB5ZXQuICovXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0UGFydGlhbE1lc3NhZ2VUaW1lcigpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuY2xlYXJQYXJ0aWFsTWVzc2FnZVRpbWVyKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5uZXh0TWVzc2FnZUxlbmd0aCA9IC0xO1xuICAgICAgICAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHdlIGNvbnZlcnQgb25lIHJlY2VpdmVkIG1lc3NhZ2UgYWZ0ZXIgdGhlXG4gICAgICAgICAgICAgICAgLy8gb3RoZXIuIE90aGVyd2lzZSBpdCBjb3VsZCBoYXBwZW4gdGhhdCBhIGRlY29kaW5nIG9mIGEgc2Vjb25kXG4gICAgICAgICAgICAgICAgLy8gc21hbGxlciBtZXNzYWdlIGZpbmlzaGVkIGJlZm9yZSB0aGUgZGVjb2Rpbmcgb2YgYSBmaXJzdCBsYXJnZXJcbiAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIGFuZCB0aGVuIHdlIHdvdWxkIGRlbGl2ZXIgdGhlIHNlY29uZCBtZXNzYWdlIGZpcnN0LlxuICAgICAgICAgICAgICAgIHRoaXMucmVhZFNlbWFwaG9yZS5sb2NrKGFzeW5jICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgYnl0ZXMgPSB0aGlzLm9wdGlvbnMuY29udGVudERlY29kZXIgIT09IHVuZGVmaW5lZFxuICAgICAgICAgICAgICAgICAgICAgICAgPyBhd2FpdCB0aGlzLm9wdGlvbnMuY29udGVudERlY29kZXIuZGVjb2RlKGJvZHkpXG4gICAgICAgICAgICAgICAgICAgICAgICA6IGJvZHk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG1lc3NhZ2UgPSBhd2FpdCB0aGlzLm9wdGlvbnMuY29udGVudFR5cGVEZWNvZGVyLmRlY29kZShieXRlcywgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jYWxsYmFjayhtZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGNsZWFyUGFydGlhbE1lc3NhZ2VUaW1lcigpIHtcbiAgICAgICAgaWYgKHRoaXMucGFydGlhbE1lc3NhZ2VUaW1lcikge1xuICAgICAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZVRpbWVyLmRpc3Bvc2UoKTtcbiAgICAgICAgICAgIHRoaXMucGFydGlhbE1lc3NhZ2VUaW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBzZXRQYXJ0aWFsTWVzc2FnZVRpbWVyKCkge1xuICAgICAgICB0aGlzLmNsZWFyUGFydGlhbE1lc3NhZ2VUaW1lcigpO1xuICAgICAgICBpZiAodGhpcy5fcGFydGlhbE1lc3NhZ2VUaW1lb3V0IDw9IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnBhcnRpYWxNZXNzYWdlVGltZXIgPSAoMCwgcmFsXzEuZGVmYXVsdCkoKS50aW1lci5zZXRUaW1lb3V0KCh0b2tlbiwgdGltZW91dCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5wYXJ0aWFsTWVzc2FnZVRpbWVyID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRva2VuID09PSB0aGlzLm1lc3NhZ2VUb2tlbikge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZVBhcnRpYWxNZXNzYWdlKHsgbWVzc2FnZVRva2VuOiB0b2tlbiwgd2FpdGluZ1RpbWU6IHRpbWVvdXQgfSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zZXRQYXJ0aWFsTWVzc2FnZVRpbWVyKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dCwgdGhpcy5tZXNzYWdlVG9rZW4sIHRoaXMuX3BhcnRpYWxNZXNzYWdlVGltZW91dCk7XG4gICAgfVxufVxuZXhwb3J0cy5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXIgPSBSZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLldyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLkFic3RyYWN0TWVzc2FnZVdyaXRlciA9IGV4cG9ydHMuTWVzc2FnZVdyaXRlciA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IHNlbWFwaG9yZV8xID0gcmVxdWlyZShcIi4vc2VtYXBob3JlXCIpO1xuY29uc3QgZXZlbnRzXzEgPSByZXF1aXJlKFwiLi9ldmVudHNcIik7XG5jb25zdCBDb250ZW50TGVuZ3RoID0gJ0NvbnRlbnQtTGVuZ3RoOiAnO1xuY29uc3QgQ1JMRiA9ICdcXHJcXG4nO1xudmFyIE1lc3NhZ2VXcml0ZXI7XG4oZnVuY3Rpb24gKE1lc3NhZ2VXcml0ZXIpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgSXMuZnVuYyhjYW5kaWRhdGUuZGlzcG9zZSkgJiYgSXMuZnVuYyhjYW5kaWRhdGUub25DbG9zZSkgJiZcbiAgICAgICAgICAgIElzLmZ1bmMoY2FuZGlkYXRlLm9uRXJyb3IpICYmIElzLmZ1bmMoY2FuZGlkYXRlLndyaXRlKTtcbiAgICB9XG4gICAgTWVzc2FnZVdyaXRlci5pcyA9IGlzO1xufSkoTWVzc2FnZVdyaXRlciB8fCAoZXhwb3J0cy5NZXNzYWdlV3JpdGVyID0gTWVzc2FnZVdyaXRlciA9IHt9KSk7XG5jbGFzcyBBYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICB0aGlzLmVycm9yRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuY2xvc2VFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICB9XG4gICAgZGlzcG9zZSgpIHtcbiAgICAgICAgdGhpcy5lcnJvckVtaXR0ZXIuZGlzcG9zZSgpO1xuICAgICAgICB0aGlzLmNsb3NlRW1pdHRlci5kaXNwb3NlKCk7XG4gICAgfVxuICAgIGdldCBvbkVycm9yKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5lcnJvckVtaXR0ZXIuZXZlbnQ7XG4gICAgfVxuICAgIGZpcmVFcnJvcihlcnJvciwgbWVzc2FnZSwgY291bnQpIHtcbiAgICAgICAgdGhpcy5lcnJvckVtaXR0ZXIuZmlyZShbdGhpcy5hc0Vycm9yKGVycm9yKSwgbWVzc2FnZSwgY291bnRdKTtcbiAgICB9XG4gICAgZ2V0IG9uQ2xvc2UoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmNsb3NlRW1pdHRlci5ldmVudDtcbiAgICB9XG4gICAgZmlyZUNsb3NlKCkge1xuICAgICAgICB0aGlzLmNsb3NlRW1pdHRlci5maXJlKHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIGFzRXJyb3IoZXJyb3IpIHtcbiAgICAgICAgaWYgKGVycm9yIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBlcnJvcjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRXJyb3IoYFdyaXRlciByZWNlaXZlZCBlcnJvci4gUmVhc29uOiAke0lzLnN0cmluZyhlcnJvci5tZXNzYWdlKSA/IGVycm9yLm1lc3NhZ2UgOiAndW5rbm93bid9YCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5leHBvcnRzLkFic3RyYWN0TWVzc2FnZVdyaXRlciA9IEFic3RyYWN0TWVzc2FnZVdyaXRlcjtcbnZhciBSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zO1xuKGZ1bmN0aW9uIChSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zKSB7XG4gICAgZnVuY3Rpb24gZnJvbU9wdGlvbnMob3B0aW9ucykge1xuICAgICAgICBpZiAob3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBvcHRpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIHsgY2hhcnNldDogb3B0aW9ucyA/PyAndXRmLTgnLCBjb250ZW50VHlwZUVuY29kZXI6ICgwLCByYWxfMS5kZWZhdWx0KSgpLmFwcGxpY2F0aW9uSnNvbi5lbmNvZGVyIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4geyBjaGFyc2V0OiBvcHRpb25zLmNoYXJzZXQgPz8gJ3V0Zi04JywgY29udGVudEVuY29kZXI6IG9wdGlvbnMuY29udGVudEVuY29kZXIsIGNvbnRlbnRUeXBlRW5jb2Rlcjogb3B0aW9ucy5jb250ZW50VHlwZUVuY29kZXIgPz8gKDAsIHJhbF8xLmRlZmF1bHQpKCkuYXBwbGljYXRpb25Kc29uLmVuY29kZXIgfTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zLmZyb21PcHRpb25zID0gZnJvbU9wdGlvbnM7XG59KShSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zIHx8IChSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zID0ge30pKTtcbmNsYXNzIFdyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKHdyaXRhYmxlLCBvcHRpb25zKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMud3JpdGFibGUgPSB3cml0YWJsZTtcbiAgICAgICAgdGhpcy5vcHRpb25zID0gUmVzb2x2ZWRNZXNzYWdlV3JpdGVyT3B0aW9ucy5mcm9tT3B0aW9ucyhvcHRpb25zKTtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50ID0gMDtcbiAgICAgICAgdGhpcy53cml0ZVNlbWFwaG9yZSA9IG5ldyBzZW1hcGhvcmVfMS5TZW1hcGhvcmUoMSk7XG4gICAgICAgIHRoaXMud3JpdGFibGUub25FcnJvcigoZXJyb3IpID0+IHRoaXMuZmlyZUVycm9yKGVycm9yKSk7XG4gICAgICAgIHRoaXMud3JpdGFibGUub25DbG9zZSgoKSA9PiB0aGlzLmZpcmVDbG9zZSgpKTtcbiAgICB9XG4gICAgYXN5bmMgd3JpdGUobXNnKSB7XG4gICAgICAgIHJldHVybiB0aGlzLndyaXRlU2VtYXBob3JlLmxvY2soYXN5bmMgKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgcGF5bG9hZCA9IHRoaXMub3B0aW9ucy5jb250ZW50VHlwZUVuY29kZXIuZW5jb2RlKG1zZywgdGhpcy5vcHRpb25zKS50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmNvbnRlbnRFbmNvZGVyICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5jb250ZW50RW5jb2Rlci5lbmNvZGUoYnVmZmVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICByZXR1cm4gcGF5bG9hZC50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICBjb25zdCBoZWFkZXJzID0gW107XG4gICAgICAgICAgICAgICAgaGVhZGVycy5wdXNoKENvbnRlbnRMZW5ndGgsIGJ1ZmZlci5ieXRlTGVuZ3RoLnRvU3RyaW5nKCksIENSTEYpO1xuICAgICAgICAgICAgICAgIGhlYWRlcnMucHVzaChDUkxGKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5kb1dyaXRlKG1zZywgaGVhZGVycywgYnVmZmVyKTtcbiAgICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgYXN5bmMgZG9Xcml0ZShtc2csIGhlYWRlcnMsIGRhdGEpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGF3YWl0IHRoaXMud3JpdGFibGUud3JpdGUoaGVhZGVycy5qb2luKCcnKSwgJ2FzY2lpJyk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy53cml0YWJsZS53cml0ZShkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IsIG1zZyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZUVycm9yKGVycm9yLCBtc2cpIHtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50Kys7XG4gICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yLCBtc2csIHRoaXMuZXJyb3JDb3VudCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICAgICAgdGhpcy53cml0YWJsZS5lbmQoKTtcbiAgICB9XG59XG5leHBvcnRzLldyaXRlYWJsZVN0cmVhbU1lc3NhZ2VXcml0ZXIgPSBXcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyO1xuIiwgIlwidXNlIHN0cmljdFwiO1xuLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqICBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqICBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLkFic3RyYWN0TWVzc2FnZUJ1ZmZlciA9IHZvaWQgMDtcbmNvbnN0IENSID0gMTM7XG5jb25zdCBMRiA9IDEwO1xuY29uc3QgQ1JMRiA9ICdcXHJcXG4nO1xuY2xhc3MgQWJzdHJhY3RNZXNzYWdlQnVmZmVyIHtcbiAgICBjb25zdHJ1Y3RvcihlbmNvZGluZyA9ICd1dGYtOCcpIHtcbiAgICAgICAgdGhpcy5fZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgICAgICAgdGhpcy5fY2h1bmtzID0gW107XG4gICAgICAgIHRoaXMuX3RvdGFsTGVuZ3RoID0gMDtcbiAgICB9XG4gICAgZ2V0IGVuY29kaW5nKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZW5jb2Rpbmc7XG4gICAgfVxuICAgIGFwcGVuZChjaHVuaykge1xuICAgICAgICBjb25zdCB0b0FwcGVuZCA9IHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZycgPyB0aGlzLmZyb21TdHJpbmcoY2h1bmssIHRoaXMuX2VuY29kaW5nKSA6IGNodW5rO1xuICAgICAgICB0aGlzLl9jaHVua3MucHVzaCh0b0FwcGVuZCk7XG4gICAgICAgIHRoaXMuX3RvdGFsTGVuZ3RoICs9IHRvQXBwZW5kLmJ5dGVMZW5ndGg7XG4gICAgfVxuICAgIHRyeVJlYWRIZWFkZXJzKGxvd2VyQ2FzZUtleXMgPSBmYWxzZSkge1xuICAgICAgICBpZiAodGhpcy5fY2h1bmtzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBsZXQgc3RhdGUgPSAwO1xuICAgICAgICBsZXQgY2h1bmtJbmRleCA9IDA7XG4gICAgICAgIGxldCBvZmZzZXQgPSAwO1xuICAgICAgICBsZXQgY2h1bmtCeXRlc1JlYWQgPSAwO1xuICAgICAgICByb3c6IHdoaWxlIChjaHVua0luZGV4IDwgdGhpcy5fY2h1bmtzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgY2h1bmsgPSB0aGlzLl9jaHVua3NbY2h1bmtJbmRleF07XG4gICAgICAgICAgICBvZmZzZXQgPSAwO1xuICAgICAgICAgICAgY29sdW1uOiB3aGlsZSAob2Zmc2V0IDwgY2h1bmsubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjaHVua1tvZmZzZXRdO1xuICAgICAgICAgICAgICAgIHN3aXRjaCAodmFsdWUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSBDUjpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoc3RhdGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAyOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIExGOlxuICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzdGF0ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMTpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSAyO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gNDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIHJvdztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgb2Zmc2V0Kys7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjaHVua0J5dGVzUmVhZCArPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgY2h1bmtJbmRleCsrO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZSAhPT0gNCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICAvLyBUaGUgYnVmZmVyIGNvbnRhaW5zIHRoZSB0d28gQ1JMRiBhdCB0aGUgZW5kLiBTbyB3ZSB3aWxsXG4gICAgICAgIC8vIGhhdmUgdHdvIGVtcHR5IGxpbmVzIGFmdGVyIHRoZSBzcGxpdCBhdCB0aGUgZW5kIGFzIHdlbGwuXG4gICAgICAgIGNvbnN0IGJ1ZmZlciA9IHRoaXMuX3JlYWQoY2h1bmtCeXRlc1JlYWQgKyBvZmZzZXQpO1xuICAgICAgICBjb25zdCByZXN1bHQgPSBuZXcgTWFwKCk7XG4gICAgICAgIGNvbnN0IGhlYWRlcnMgPSB0aGlzLnRvU3RyaW5nKGJ1ZmZlciwgJ2FzY2lpJykuc3BsaXQoQ1JMRik7XG4gICAgICAgIGlmIChoZWFkZXJzLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBoZWFkZXJzLmxlbmd0aCAtIDI7IGkrKykge1xuICAgICAgICAgICAgY29uc3QgaGVhZGVyID0gaGVhZGVyc1tpXTtcbiAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gaGVhZGVyLmluZGV4T2YoJzonKTtcbiAgICAgICAgICAgIGlmIChpbmRleCA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1lc3NhZ2UgaGVhZGVyIG11c3Qgc2VwYXJhdGUga2V5IGFuZCB2YWx1ZSB1c2luZyAnOidcXG4ke2hlYWRlcn1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGhlYWRlci5zdWJzdHIoMCwgaW5kZXgpO1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBoZWFkZXIuc3Vic3RyKGluZGV4ICsgMSkudHJpbSgpO1xuICAgICAgICAgICAgcmVzdWx0LnNldChsb3dlckNhc2VLZXlzID8ga2V5LnRvTG93ZXJDYXNlKCkgOiBrZXksIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICB0cnlSZWFkQm9keShsZW5ndGgpIHtcbiAgICAgICAgaWYgKHRoaXMuX3RvdGFsTGVuZ3RoIDwgbGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLl9yZWFkKGxlbmd0aCk7XG4gICAgfVxuICAgIGdldCBudW1iZXJPZkJ5dGVzKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fdG90YWxMZW5ndGg7XG4gICAgfVxuICAgIF9yZWFkKGJ5dGVDb3VudCkge1xuICAgICAgICBpZiAoYnl0ZUNvdW50ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbXB0eUJ1ZmZlcigpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChieXRlQ291bnQgPiB0aGlzLl90b3RhbExlbmd0aCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgcmVhZCBzbyBtYW55IGJ5dGVzIWApO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jaHVua3NbMF0uYnl0ZUxlbmd0aCA9PT0gYnl0ZUNvdW50KSB7XG4gICAgICAgICAgICAvLyBzdXBlciBmYXN0IHBhdGgsIHByZWNpc2VseSBmaXJzdCBjaHVuayBtdXN0IGJlIHJldHVybmVkXG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1swXTtcbiAgICAgICAgICAgIHRoaXMuX2NodW5rcy5zaGlmdCgpO1xuICAgICAgICAgICAgdGhpcy5fdG90YWxMZW5ndGggLT0gYnl0ZUNvdW50O1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXNOYXRpdmUoY2h1bmspO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLl9jaHVua3NbMF0uYnl0ZUxlbmd0aCA+IGJ5dGVDb3VudCkge1xuICAgICAgICAgICAgLy8gZmFzdCBwYXRoLCB0aGUgcmVhZGluZyBpcyBlbnRpcmVseSB3aXRoaW4gdGhlIGZpcnN0IGNodW5rXG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1swXTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdCA9IHRoaXMuYXNOYXRpdmUoY2h1bmssIGJ5dGVDb3VudCk7XG4gICAgICAgICAgICB0aGlzLl9jaHVua3NbMF0gPSBjaHVuay5zbGljZShieXRlQ291bnQpO1xuICAgICAgICAgICAgdGhpcy5fdG90YWxMZW5ndGggLT0gYnl0ZUNvdW50O1xuICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aGlzLmFsbG9jTmF0aXZlKGJ5dGVDb3VudCk7XG4gICAgICAgIGxldCByZXN1bHRPZmZzZXQgPSAwO1xuICAgICAgICBsZXQgY2h1bmtJbmRleCA9IDA7XG4gICAgICAgIHdoaWxlIChieXRlQ291bnQgPiAwKSB7XG4gICAgICAgICAgICBjb25zdCBjaHVuayA9IHRoaXMuX2NodW5rc1tjaHVua0luZGV4XTtcbiAgICAgICAgICAgIGlmIChjaHVuay5ieXRlTGVuZ3RoID4gYnl0ZUNvdW50KSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBjaHVuayB3aWxsIHN1cnZpdmVcbiAgICAgICAgICAgICAgICBjb25zdCBjaHVua1BhcnQgPSBjaHVuay5zbGljZSgwLCBieXRlQ291bnQpO1xuICAgICAgICAgICAgICAgIHJlc3VsdC5zZXQoY2h1bmtQYXJ0LCByZXN1bHRPZmZzZXQpO1xuICAgICAgICAgICAgICAgIHJlc3VsdE9mZnNldCArPSBieXRlQ291bnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5fY2h1bmtzW2NodW5rSW5kZXhdID0gY2h1bmsuc2xpY2UoYnl0ZUNvdW50KTtcbiAgICAgICAgICAgICAgICB0aGlzLl90b3RhbExlbmd0aCAtPSBieXRlQ291bnQ7XG4gICAgICAgICAgICAgICAgYnl0ZUNvdW50IC09IGJ5dGVDb3VudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIHRoaXMgY2h1bmsgd2lsbCBiZSBlbnRpcmVseSByZWFkXG4gICAgICAgICAgICAgICAgcmVzdWx0LnNldChjaHVuaywgcmVzdWx0T2Zmc2V0KTtcbiAgICAgICAgICAgICAgICByZXN1bHRPZmZzZXQgKz0gY2h1bmsuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgICAgICB0aGlzLl9jaHVua3Muc2hpZnQoKTtcbiAgICAgICAgICAgICAgICB0aGlzLl90b3RhbExlbmd0aCAtPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgICAgIGJ5dGVDb3VudCAtPSBjaHVuay5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxufVxuZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VCdWZmZXIgPSBBYnN0cmFjdE1lc3NhZ2VCdWZmZXI7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJfX2VzTW9kdWxlXCIsIHsgdmFsdWU6IHRydWUgfSk7XG5leHBvcnRzLmNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uID0gZXhwb3J0cy5Db25uZWN0aW9uT3B0aW9ucyA9IGV4cG9ydHMuTWVzc2FnZVN0cmF0ZWd5ID0gZXhwb3J0cy5DYW5jZWxsYXRpb25TdHJhdGVneSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gZXhwb3J0cy5JZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IGV4cG9ydHMuQ29ubmVjdGlvbkVycm9yID0gZXhwb3J0cy5Db25uZWN0aW9uRXJyb3JzID0gZXhwb3J0cy5Mb2dUcmFjZU5vdGlmaWNhdGlvbiA9IGV4cG9ydHMuU2V0VHJhY2VOb3RpZmljYXRpb24gPSBleHBvcnRzLlRyYWNlRm9ybWF0ID0gZXhwb3J0cy5UcmFjZVZhbHVlcyA9IGV4cG9ydHMuVHJhY2UgPSBleHBvcnRzLk51bGxMb2dnZXIgPSBleHBvcnRzLlByb2dyZXNzVHlwZSA9IGV4cG9ydHMuUHJvZ3Jlc3NUb2tlbiA9IHZvaWQgMDtcbmNvbnN0IHJhbF8xID0gcmVxdWlyZShcIi4vcmFsXCIpO1xuY29uc3QgSXMgPSByZXF1aXJlKFwiLi9pc1wiKTtcbmNvbnN0IG1lc3NhZ2VzXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlc1wiKTtcbmNvbnN0IGxpbmtlZE1hcF8xID0gcmVxdWlyZShcIi4vbGlua2VkTWFwXCIpO1xuY29uc3QgZXZlbnRzXzEgPSByZXF1aXJlKFwiLi9ldmVudHNcIik7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbnZhciBDYW5jZWxOb3RpZmljYXRpb247XG4oZnVuY3Rpb24gKENhbmNlbE5vdGlmaWNhdGlvbikge1xuICAgIENhbmNlbE5vdGlmaWNhdGlvbi50eXBlID0gbmV3IG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZSgnJC9jYW5jZWxSZXF1ZXN0Jyk7XG59KShDYW5jZWxOb3RpZmljYXRpb24gfHwgKENhbmNlbE5vdGlmaWNhdGlvbiA9IHt9KSk7XG52YXIgUHJvZ3Jlc3NUb2tlbjtcbihmdW5jdGlvbiAoUHJvZ3Jlc3NUb2tlbikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnIHx8IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcic7XG4gICAgfVxuICAgIFByb2dyZXNzVG9rZW4uaXMgPSBpcztcbn0pKFByb2dyZXNzVG9rZW4gfHwgKGV4cG9ydHMuUHJvZ3Jlc3NUb2tlbiA9IFByb2dyZXNzVG9rZW4gPSB7fSkpO1xudmFyIFByb2dyZXNzTm90aWZpY2F0aW9uO1xuKGZ1bmN0aW9uIChQcm9ncmVzc05vdGlmaWNhdGlvbikge1xuICAgIFByb2dyZXNzTm90aWZpY2F0aW9uLnR5cGUgPSBuZXcgbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlKCckL3Byb2dyZXNzJyk7XG59KShQcm9ncmVzc05vdGlmaWNhdGlvbiB8fCAoUHJvZ3Jlc3NOb3RpZmljYXRpb24gPSB7fSkpO1xuY2xhc3MgUHJvZ3Jlc3NUeXBlIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICB9XG59XG5leHBvcnRzLlByb2dyZXNzVHlwZSA9IFByb2dyZXNzVHlwZTtcbnZhciBTdGFyUmVxdWVzdEhhbmRsZXI7XG4oZnVuY3Rpb24gKFN0YXJSZXF1ZXN0SGFuZGxlcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBJcy5mdW5jKHZhbHVlKTtcbiAgICB9XG4gICAgU3RhclJlcXVlc3RIYW5kbGVyLmlzID0gaXM7XG59KShTdGFyUmVxdWVzdEhhbmRsZXIgfHwgKFN0YXJSZXF1ZXN0SGFuZGxlciA9IHt9KSk7XG5leHBvcnRzLk51bGxMb2dnZXIgPSBPYmplY3QuZnJlZXplKHtcbiAgICBlcnJvcjogKCkgPT4geyB9LFxuICAgIHdhcm46ICgpID0+IHsgfSxcbiAgICBpbmZvOiAoKSA9PiB7IH0sXG4gICAgbG9nOiAoKSA9PiB7IH1cbn0pO1xudmFyIFRyYWNlO1xuKGZ1bmN0aW9uIChUcmFjZSkge1xuICAgIFRyYWNlW1RyYWNlW1wiT2ZmXCJdID0gMF0gPSBcIk9mZlwiO1xuICAgIFRyYWNlW1RyYWNlW1wiTWVzc2FnZXNcIl0gPSAxXSA9IFwiTWVzc2FnZXNcIjtcbiAgICBUcmFjZVtUcmFjZVtcIkNvbXBhY3RcIl0gPSAyXSA9IFwiQ29tcGFjdFwiO1xuICAgIFRyYWNlW1RyYWNlW1wiVmVyYm9zZVwiXSA9IDNdID0gXCJWZXJib3NlXCI7XG59KShUcmFjZSB8fCAoZXhwb3J0cy5UcmFjZSA9IFRyYWNlID0ge30pKTtcbnZhciBUcmFjZVZhbHVlcztcbihmdW5jdGlvbiAoVHJhY2VWYWx1ZXMpIHtcbiAgICAvKipcbiAgICAgKiBUdXJuIHRyYWNpbmcgb2ZmLlxuICAgICAqL1xuICAgIFRyYWNlVmFsdWVzLk9mZiA9ICdvZmYnO1xuICAgIC8qKlxuICAgICAqIFRyYWNlIG1lc3NhZ2VzIG9ubHkuXG4gICAgICovXG4gICAgVHJhY2VWYWx1ZXMuTWVzc2FnZXMgPSAnbWVzc2FnZXMnO1xuICAgIC8qKlxuICAgICAqIENvbXBhY3QgbWVzc2FnZSB0cmFjaW5nLlxuICAgICAqL1xuICAgIFRyYWNlVmFsdWVzLkNvbXBhY3QgPSAnY29tcGFjdCc7XG4gICAgLyoqXG4gICAgICogVmVyYm9zZSBtZXNzYWdlIHRyYWNpbmcuXG4gICAgICovXG4gICAgVHJhY2VWYWx1ZXMuVmVyYm9zZSA9ICd2ZXJib3NlJztcbn0pKFRyYWNlVmFsdWVzIHx8IChleHBvcnRzLlRyYWNlVmFsdWVzID0gVHJhY2VWYWx1ZXMgPSB7fSkpO1xuKGZ1bmN0aW9uIChUcmFjZSkge1xuICAgIGZ1bmN0aW9uIGZyb21TdHJpbmcodmFsdWUpIHtcbiAgICAgICAgaWYgKCFJcy5zdHJpbmcodmFsdWUpKSB7XG4gICAgICAgICAgICByZXR1cm4gVHJhY2UuT2ZmO1xuICAgICAgICB9XG4gICAgICAgIHZhbHVlID0gdmFsdWUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSAnb2ZmJzpcbiAgICAgICAgICAgICAgICByZXR1cm4gVHJhY2UuT2ZmO1xuICAgICAgICAgICAgY2FzZSAnbWVzc2FnZXMnOlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5NZXNzYWdlcztcbiAgICAgICAgICAgIGNhc2UgJ2NvbXBhY3QnOlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5Db21wYWN0O1xuICAgICAgICAgICAgY2FzZSAndmVyYm9zZSc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIFRyYWNlLlZlcmJvc2U7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiBUcmFjZS5PZmY7XG4gICAgICAgIH1cbiAgICB9XG4gICAgVHJhY2UuZnJvbVN0cmluZyA9IGZyb21TdHJpbmc7XG4gICAgZnVuY3Rpb24gdG9TdHJpbmcodmFsdWUpIHtcbiAgICAgICAgc3dpdGNoICh2YWx1ZSkge1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5PZmY6XG4gICAgICAgICAgICAgICAgcmV0dXJuICdvZmYnO1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5NZXNzYWdlczpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ21lc3NhZ2VzJztcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuQ29tcGFjdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gJ2NvbXBhY3QnO1xuICAgICAgICAgICAgY2FzZSBUcmFjZS5WZXJib3NlOlxuICAgICAgICAgICAgICAgIHJldHVybiAndmVyYm9zZSc7XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHJldHVybiAnb2ZmJztcbiAgICAgICAgfVxuICAgIH1cbiAgICBUcmFjZS50b1N0cmluZyA9IHRvU3RyaW5nO1xufSkoVHJhY2UgfHwgKGV4cG9ydHMuVHJhY2UgPSBUcmFjZSA9IHt9KSk7XG52YXIgVHJhY2VGb3JtYXQ7XG4oZnVuY3Rpb24gKFRyYWNlRm9ybWF0KSB7XG4gICAgVHJhY2VGb3JtYXRbXCJUZXh0XCJdID0gXCJ0ZXh0XCI7XG4gICAgVHJhY2VGb3JtYXRbXCJKU09OXCJdID0gXCJqc29uXCI7XG59KShUcmFjZUZvcm1hdCB8fCAoZXhwb3J0cy5UcmFjZUZvcm1hdCA9IFRyYWNlRm9ybWF0ID0ge30pKTtcbihmdW5jdGlvbiAoVHJhY2VGb3JtYXQpIHtcbiAgICBmdW5jdGlvbiBmcm9tU3RyaW5nKHZhbHVlKSB7XG4gICAgICAgIGlmICghSXMuc3RyaW5nKHZhbHVlKSkge1xuICAgICAgICAgICAgcmV0dXJuIFRyYWNlRm9ybWF0LlRleHQ7XG4gICAgICAgIH1cbiAgICAgICAgdmFsdWUgPSB2YWx1ZS50b0xvd2VyQ2FzZSgpO1xuICAgICAgICBpZiAodmFsdWUgPT09ICdqc29uJykge1xuICAgICAgICAgICAgcmV0dXJuIFRyYWNlRm9ybWF0LkpTT047XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gVHJhY2VGb3JtYXQuVGV4dDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBUcmFjZUZvcm1hdC5mcm9tU3RyaW5nID0gZnJvbVN0cmluZztcbn0pKFRyYWNlRm9ybWF0IHx8IChleHBvcnRzLlRyYWNlRm9ybWF0ID0gVHJhY2VGb3JtYXQgPSB7fSkpO1xudmFyIFNldFRyYWNlTm90aWZpY2F0aW9uO1xuKGZ1bmN0aW9uIChTZXRUcmFjZU5vdGlmaWNhdGlvbikge1xuICAgIFNldFRyYWNlTm90aWZpY2F0aW9uLnR5cGUgPSBuZXcgbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlKCckL3NldFRyYWNlJyk7XG59KShTZXRUcmFjZU5vdGlmaWNhdGlvbiB8fCAoZXhwb3J0cy5TZXRUcmFjZU5vdGlmaWNhdGlvbiA9IFNldFRyYWNlTm90aWZpY2F0aW9uID0ge30pKTtcbnZhciBMb2dUcmFjZU5vdGlmaWNhdGlvbjtcbihmdW5jdGlvbiAoTG9nVHJhY2VOb3RpZmljYXRpb24pIHtcbiAgICBMb2dUcmFjZU5vdGlmaWNhdGlvbi50eXBlID0gbmV3IG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZSgnJC9sb2dUcmFjZScpO1xufSkoTG9nVHJhY2VOb3RpZmljYXRpb24gfHwgKGV4cG9ydHMuTG9nVHJhY2VOb3RpZmljYXRpb24gPSBMb2dUcmFjZU5vdGlmaWNhdGlvbiA9IHt9KSk7XG52YXIgQ29ubmVjdGlvbkVycm9ycztcbihmdW5jdGlvbiAoQ29ubmVjdGlvbkVycm9ycykge1xuICAgIC8qKlxuICAgICAqIFRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZC5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uRXJyb3JzW0Nvbm5lY3Rpb25FcnJvcnNbXCJDbG9zZWRcIl0gPSAxXSA9IFwiQ2xvc2VkXCI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gZ290IGRpc3Bvc2VkLlxuICAgICAqL1xuICAgIENvbm5lY3Rpb25FcnJvcnNbQ29ubmVjdGlvbkVycm9yc1tcIkRpc3Bvc2VkXCJdID0gMl0gPSBcIkRpc3Bvc2VkXCI7XG4gICAgLyoqXG4gICAgICogVGhlIGNvbm5lY3Rpb24gaXMgYWxyZWFkeSBpbiBsaXN0ZW5pbmcgbW9kZS5cbiAgICAgKi9cbiAgICBDb25uZWN0aW9uRXJyb3JzW0Nvbm5lY3Rpb25FcnJvcnNbXCJBbHJlYWR5TGlzdGVuaW5nXCJdID0gM10gPSBcIkFscmVhZHlMaXN0ZW5pbmdcIjtcbn0pKENvbm5lY3Rpb25FcnJvcnMgfHwgKGV4cG9ydHMuQ29ubmVjdGlvbkVycm9ycyA9IENvbm5lY3Rpb25FcnJvcnMgPSB7fSkpO1xuY2xhc3MgQ29ubmVjdGlvbkVycm9yIGV4dGVuZHMgRXJyb3Ige1xuICAgIGNvbnN0cnVjdG9yKGNvZGUsIG1lc3NhZ2UpIHtcbiAgICAgICAgc3VwZXIobWVzc2FnZSk7XG4gICAgICAgIHRoaXMuY29kZSA9IGNvZGU7XG4gICAgICAgIE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLCBDb25uZWN0aW9uRXJyb3IucHJvdG90eXBlKTtcbiAgICB9XG59XG5leHBvcnRzLkNvbm5lY3Rpb25FcnJvciA9IENvbm5lY3Rpb25FcnJvcjtcbnZhciBDb25uZWN0aW9uU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENvbm5lY3Rpb25TdHJhdGVneSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNhbmNlbFVuZGlzcGF0Y2hlZCk7XG4gICAgfVxuICAgIENvbm5lY3Rpb25TdHJhdGVneS5pcyA9IGlzO1xufSkoQ29ubmVjdGlvblN0cmF0ZWd5IHx8IChleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IENvbm5lY3Rpb25TdHJhdGVneSA9IHt9KSk7XG52YXIgSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5O1xuKGZ1bmN0aW9uIChJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiAoY2FuZGlkYXRlLmtpbmQgPT09IHVuZGVmaW5lZCB8fCBjYW5kaWRhdGUua2luZCA9PT0gJ2lkJykgJiYgSXMuZnVuYyhjYW5kaWRhdGUuY3JlYXRlQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UpICYmIChjYW5kaWRhdGUuZGlzcG9zZSA9PT0gdW5kZWZpbmVkIHx8IElzLmZ1bmMoY2FuZGlkYXRlLmRpc3Bvc2UpKTtcbiAgICB9XG4gICAgSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzID0gaXM7XG59KShJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kgfHwgKGV4cG9ydHMuSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0ge30pKTtcbnZhciBSZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneTtcbihmdW5jdGlvbiAoUmVxdWVzdENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBjYW5kaWRhdGUua2luZCA9PT0gJ3JlcXVlc3QnICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKSAmJiAoY2FuZGlkYXRlLmRpc3Bvc2UgPT09IHVuZGVmaW5lZCB8fCBJcy5mdW5jKGNhbmRpZGF0ZS5kaXNwb3NlKSk7XG4gICAgfVxuICAgIFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzID0gaXM7XG59KShSZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSB8fCAoZXhwb3J0cy5SZXF1ZXN0Q2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0ge30pKTtcbnZhciBDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5O1xuKGZ1bmN0aW9uIChDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5NZXNzYWdlID0gT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGNyZWF0ZUNhbmNlbGxhdGlvblRva2VuU291cmNlKF8pIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgY2FuY2VsbGF0aW9uXzEuQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UoKTtcbiAgICAgICAgfVxuICAgIH0pO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiBJZENhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kuaXModmFsdWUpIHx8IFJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKHZhbHVlKTtcbiAgICB9XG4gICAgQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5pcyA9IGlzO1xufSkoQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSB8fCAoZXhwb3J0cy5DYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5ID0gQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IHt9KSk7XG52YXIgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENhbmNlbGxhdGlvblNlbmRlclN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kuTWVzc2FnZSA9IE9iamVjdC5mcmVlemUoe1xuICAgICAgICBzZW5kQ2FuY2VsbGF0aW9uKGNvbm4sIGlkKSB7XG4gICAgICAgICAgICByZXR1cm4gY29ubi5zZW5kTm90aWZpY2F0aW9uKENhbmNlbE5vdGlmaWNhdGlvbi50eXBlLCB7IGlkIH0pO1xuICAgICAgICB9LFxuICAgICAgICBjbGVhbnVwKF8pIHsgfVxuICAgIH0pO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLnNlbmRDYW5jZWxsYXRpb24pICYmIElzLmZ1bmMoY2FuZGlkYXRlLmNsZWFudXApO1xuICAgIH1cbiAgICBDYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneS5pcyA9IGlzO1xufSkoQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgfHwgKGV4cG9ydHMuQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kgPSBDYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneSA9IHt9KSk7XG52YXIgQ2FuY2VsbGF0aW9uU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKENhbmNlbGxhdGlvblN0cmF0ZWd5KSB7XG4gICAgQ2FuY2VsbGF0aW9uU3RyYXRlZ3kuTWVzc2FnZSA9IE9iamVjdC5mcmVlemUoe1xuICAgICAgICByZWNlaXZlcjogQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneS5NZXNzYWdlLFxuICAgICAgICBzZW5kZXI6IENhbmNlbGxhdGlvblNlbmRlclN0cmF0ZWd5Lk1lc3NhZ2VcbiAgICB9KTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKGNhbmRpZGF0ZS5yZWNlaXZlcikgJiYgQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kuaXMoY2FuZGlkYXRlLnNlbmRlcik7XG4gICAgfVxuICAgIENhbmNlbGxhdGlvblN0cmF0ZWd5LmlzID0gaXM7XG59KShDYW5jZWxsYXRpb25TdHJhdGVneSB8fCAoZXhwb3J0cy5DYW5jZWxsYXRpb25TdHJhdGVneSA9IENhbmNlbGxhdGlvblN0cmF0ZWd5ID0ge30pKTtcbnZhciBNZXNzYWdlU3RyYXRlZ3k7XG4oZnVuY3Rpb24gKE1lc3NhZ2VTdHJhdGVneSkge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIElzLmZ1bmMoY2FuZGlkYXRlLmhhbmRsZU1lc3NhZ2UpO1xuICAgIH1cbiAgICBNZXNzYWdlU3RyYXRlZ3kuaXMgPSBpcztcbn0pKE1lc3NhZ2VTdHJhdGVneSB8fCAoZXhwb3J0cy5NZXNzYWdlU3RyYXRlZ3kgPSBNZXNzYWdlU3RyYXRlZ3kgPSB7fSkpO1xudmFyIENvbm5lY3Rpb25PcHRpb25zO1xuKGZ1bmN0aW9uIChDb25uZWN0aW9uT3B0aW9ucykge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIChDYW5jZWxsYXRpb25TdHJhdGVneS5pcyhjYW5kaWRhdGUuY2FuY2VsbGF0aW9uU3RyYXRlZ3kpIHx8IENvbm5lY3Rpb25TdHJhdGVneS5pcyhjYW5kaWRhdGUuY29ubmVjdGlvblN0cmF0ZWd5KSB8fCBNZXNzYWdlU3RyYXRlZ3kuaXMoY2FuZGlkYXRlLm1lc3NhZ2VTdHJhdGVneSkpO1xuICAgIH1cbiAgICBDb25uZWN0aW9uT3B0aW9ucy5pcyA9IGlzO1xufSkoQ29ubmVjdGlvbk9wdGlvbnMgfHwgKGV4cG9ydHMuQ29ubmVjdGlvbk9wdGlvbnMgPSBDb25uZWN0aW9uT3B0aW9ucyA9IHt9KSk7XG52YXIgQ29ubmVjdGlvblN0YXRlO1xuKGZ1bmN0aW9uIChDb25uZWN0aW9uU3RhdGUpIHtcbiAgICBDb25uZWN0aW9uU3RhdGVbQ29ubmVjdGlvblN0YXRlW1wiTmV3XCJdID0gMV0gPSBcIk5ld1wiO1xuICAgIENvbm5lY3Rpb25TdGF0ZVtDb25uZWN0aW9uU3RhdGVbXCJMaXN0ZW5pbmdcIl0gPSAyXSA9IFwiTGlzdGVuaW5nXCI7XG4gICAgQ29ubmVjdGlvblN0YXRlW0Nvbm5lY3Rpb25TdGF0ZVtcIkNsb3NlZFwiXSA9IDNdID0gXCJDbG9zZWRcIjtcbiAgICBDb25uZWN0aW9uU3RhdGVbQ29ubmVjdGlvblN0YXRlW1wiRGlzcG9zZWRcIl0gPSA0XSA9IFwiRGlzcG9zZWRcIjtcbn0pKENvbm5lY3Rpb25TdGF0ZSB8fCAoQ29ubmVjdGlvblN0YXRlID0ge30pKTtcbmZ1bmN0aW9uIGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uKG1lc3NhZ2VSZWFkZXIsIG1lc3NhZ2VXcml0ZXIsIF9sb2dnZXIsIG9wdGlvbnMpIHtcbiAgICBjb25zdCBsb2dnZXIgPSBfbG9nZ2VyICE9PSB1bmRlZmluZWQgPyBfbG9nZ2VyIDogZXhwb3J0cy5OdWxsTG9nZ2VyO1xuICAgIGxldCBzZXF1ZW5jZU51bWJlciA9IDA7XG4gICAgbGV0IG5vdGlmaWNhdGlvblNlcXVlbmNlTnVtYmVyID0gMDtcbiAgICBsZXQgdW5rbm93blJlc3BvbnNlU2VxdWVuY2VOdW1iZXIgPSAwO1xuICAgIGNvbnN0IHZlcnNpb24gPSAnMi4wJztcbiAgICBsZXQgc3RhclJlcXVlc3RIYW5kbGVyID0gdW5kZWZpbmVkO1xuICAgIGNvbnN0IHJlcXVlc3RIYW5kbGVycyA9IG5ldyBNYXAoKTtcbiAgICBsZXQgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgY29uc3Qgbm90aWZpY2F0aW9uSGFuZGxlcnMgPSBuZXcgTWFwKCk7XG4gICAgY29uc3QgcHJvZ3Jlc3NIYW5kbGVycyA9IG5ldyBNYXAoKTtcbiAgICBsZXQgdGltZXI7XG4gICAgbGV0IG1lc3NhZ2VRdWV1ZSA9IG5ldyBsaW5rZWRNYXBfMS5MaW5rZWRNYXAoKTtcbiAgICBsZXQgcmVzcG9uc2VQcm9taXNlcyA9IG5ldyBNYXAoKTtcbiAgICBsZXQga25vd25DYW5jZWxlZFJlcXVlc3RzID0gbmV3IFNldCgpO1xuICAgIGxldCByZXF1ZXN0VG9rZW5zID0gbmV3IE1hcCgpO1xuICAgIGxldCB0cmFjZSA9IFRyYWNlLk9mZjtcbiAgICBsZXQgdHJhY2VGb3JtYXQgPSBUcmFjZUZvcm1hdC5UZXh0O1xuICAgIGxldCB0cmFjZXI7XG4gICAgbGV0IHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLk5ldztcbiAgICBjb25zdCBlcnJvckVtaXR0ZXIgPSBuZXcgZXZlbnRzXzEuRW1pdHRlcigpO1xuICAgIGNvbnN0IGNsb3NlRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgdW5oYW5kbGVkTm90aWZpY2F0aW9uRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgdW5oYW5kbGVkUHJvZ3Jlc3NFbWl0dGVyID0gbmV3IGV2ZW50c18xLkVtaXR0ZXIoKTtcbiAgICBjb25zdCBkaXNwb3NlRW1pdHRlciA9IG5ldyBldmVudHNfMS5FbWl0dGVyKCk7XG4gICAgY29uc3QgY2FuY2VsbGF0aW9uU3RyYXRlZ3kgPSAob3B0aW9ucyAmJiBvcHRpb25zLmNhbmNlbGxhdGlvblN0cmF0ZWd5KSA/IG9wdGlvbnMuY2FuY2VsbGF0aW9uU3RyYXRlZ3kgOiBDYW5jZWxsYXRpb25TdHJhdGVneS5NZXNzYWdlO1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlcXVlc3RRdWV1ZUtleShpZCkge1xuICAgICAgICBpZiAoaWQgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgQ2FuJ3Qgc2VuZCByZXF1ZXN0cyB3aXRoIGlkIG51bGwgc2luY2UgdGhlIHJlc3BvbnNlIGNhbid0IGJlIGNvcnJlbGF0ZWQuYCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuICdyZXEtJyArIGlkLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZVJlc3BvbnNlUXVldWVLZXkoaWQpIHtcbiAgICAgICAgaWYgKGlkID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gJ3Jlcy11bmtub3duLScgKyAoKyt1bmtub3duUmVzcG9uc2VTZXF1ZW5jZU51bWJlcikudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiAncmVzLScgKyBpZC50b1N0cmluZygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNyZWF0ZU5vdGlmaWNhdGlvblF1ZXVlS2V5KCkge1xuICAgICAgICByZXR1cm4gJ25vdC0nICsgKCsrbm90aWZpY2F0aW9uU2VxdWVuY2VOdW1iZXIpLnRvU3RyaW5nKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGFkZE1lc3NhZ2VUb1F1ZXVlKHF1ZXVlLCBtZXNzYWdlKSB7XG4gICAgICAgIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXF1ZXN0KG1lc3NhZ2UpKSB7XG4gICAgICAgICAgICBxdWV1ZS5zZXQoY3JlYXRlUmVxdWVzdFF1ZXVlS2V5KG1lc3NhZ2UuaWQpLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXNwb25zZShtZXNzYWdlKSkge1xuICAgICAgICAgICAgcXVldWUuc2V0KGNyZWF0ZVJlc3BvbnNlUXVldWVLZXkobWVzc2FnZS5pZCksIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcXVldWUuc2V0KGNyZWF0ZU5vdGlmaWNhdGlvblF1ZXVlS2V5KCksIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNhbmNlbFVuZGlzcGF0Y2hlZChfbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0xpc3RlbmluZygpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlID09PSBDb25uZWN0aW9uU3RhdGUuTGlzdGVuaW5nO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0Nsb3NlZCgpIHtcbiAgICAgICAgcmV0dXJuIHN0YXRlID09PSBDb25uZWN0aW9uU3RhdGUuQ2xvc2VkO1xuICAgIH1cbiAgICBmdW5jdGlvbiBpc0Rpc3Bvc2VkKCkge1xuICAgICAgICByZXR1cm4gc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5EaXNwb3NlZDtcbiAgICB9XG4gICAgZnVuY3Rpb24gY2xvc2VIYW5kbGVyKCkge1xuICAgICAgICBpZiAoc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5OZXcgfHwgc3RhdGUgPT09IENvbm5lY3Rpb25TdGF0ZS5MaXN0ZW5pbmcpIHtcbiAgICAgICAgICAgIHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLkNsb3NlZDtcbiAgICAgICAgICAgIGNsb3NlRW1pdHRlci5maXJlKHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gSWYgdGhlIGNvbm5lY3Rpb24gaXMgZGlzcG9zZWQgZG9uJ3Qgc2VudCBjbG9zZSBldmVudHMuXG4gICAgfVxuICAgIGZ1bmN0aW9uIHJlYWRFcnJvckhhbmRsZXIoZXJyb3IpIHtcbiAgICAgICAgZXJyb3JFbWl0dGVyLmZpcmUoW2Vycm9yLCB1bmRlZmluZWQsIHVuZGVmaW5lZF0pO1xuICAgIH1cbiAgICBmdW5jdGlvbiB3cml0ZUVycm9ySGFuZGxlcihkYXRhKSB7XG4gICAgICAgIGVycm9yRW1pdHRlci5maXJlKGRhdGEpO1xuICAgIH1cbiAgICBtZXNzYWdlUmVhZGVyLm9uQ2xvc2UoY2xvc2VIYW5kbGVyKTtcbiAgICBtZXNzYWdlUmVhZGVyLm9uRXJyb3IocmVhZEVycm9ySGFuZGxlcik7XG4gICAgbWVzc2FnZVdyaXRlci5vbkNsb3NlKGNsb3NlSGFuZGxlcik7XG4gICAgbWVzc2FnZVdyaXRlci5vbkVycm9yKHdyaXRlRXJyb3JIYW5kbGVyKTtcbiAgICBmdW5jdGlvbiB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCkge1xuICAgICAgICBpZiAodGltZXIgfHwgbWVzc2FnZVF1ZXVlLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aW1lciA9ICgwLCByYWxfMS5kZWZhdWx0KSgpLnRpbWVyLnNldEltbWVkaWF0ZSgoKSA9PiB7XG4gICAgICAgICAgICB0aW1lciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIHByb2Nlc3NNZXNzYWdlUXVldWUoKTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGhhbmRsZU1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICBpZiAobWVzc2FnZXNfMS5NZXNzYWdlLmlzUmVxdWVzdChtZXNzYWdlKSkge1xuICAgICAgICAgICAgaGFuZGxlUmVxdWVzdChtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNOb3RpZmljYXRpb24obWVzc2FnZSkpIHtcbiAgICAgICAgICAgIGhhbmRsZU5vdGlmaWNhdGlvbihtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNSZXNwb25zZShtZXNzYWdlKSkge1xuICAgICAgICAgICAgaGFuZGxlUmVzcG9uc2UobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBoYW5kbGVJbnZhbGlkTWVzc2FnZShtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBwcm9jZXNzTWVzc2FnZVF1ZXVlKCkge1xuICAgICAgICBpZiAobWVzc2FnZVF1ZXVlLnNpemUgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBtZXNzYWdlID0gbWVzc2FnZVF1ZXVlLnNoaWZ0KCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlU3RyYXRlZ3kgPSBvcHRpb25zPy5tZXNzYWdlU3RyYXRlZ3k7XG4gICAgICAgICAgICBpZiAoTWVzc2FnZVN0cmF0ZWd5LmlzKG1lc3NhZ2VTdHJhdGVneSkpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlU3RyYXRlZ3kuaGFuZGxlTWVzc2FnZShtZXNzYWdlLCBoYW5kbGVNZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGhhbmRsZU1lc3NhZ2UobWVzc2FnZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY29uc3QgY2FsbGJhY2sgPSAobWVzc2FnZSkgPT4ge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2UgaGF2ZSByZWNlaXZlZCBhIGNhbmNlbGxhdGlvbiBtZXNzYWdlLiBDaGVjayBpZiB0aGUgbWVzc2FnZSBpcyBzdGlsbCBpbiB0aGUgcXVldWVcbiAgICAgICAgICAgIC8vIGFuZCBjYW5jZWwgaXQgaWYgYWxsb3dlZCB0byBkbyBzby5cbiAgICAgICAgICAgIGlmIChtZXNzYWdlc18xLk1lc3NhZ2UuaXNOb3RpZmljYXRpb24obWVzc2FnZSkgJiYgbWVzc2FnZS5tZXRob2QgPT09IENhbmNlbE5vdGlmaWNhdGlvbi50eXBlLm1ldGhvZCkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNhbmNlbElkID0gbWVzc2FnZS5wYXJhbXMuaWQ7XG4gICAgICAgICAgICAgICAgY29uc3Qga2V5ID0gY3JlYXRlUmVxdWVzdFF1ZXVlS2V5KGNhbmNlbElkKTtcbiAgICAgICAgICAgICAgICBjb25zdCB0b0NhbmNlbCA9IG1lc3NhZ2VRdWV1ZS5nZXQoa2V5KTtcbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZXNfMS5NZXNzYWdlLmlzUmVxdWVzdCh0b0NhbmNlbCkpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyYXRlZ3kgPSBvcHRpb25zPy5jb25uZWN0aW9uU3RyYXRlZ3k7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlID0gKHN0cmF0ZWd5ICYmIHN0cmF0ZWd5LmNhbmNlbFVuZGlzcGF0Y2hlZCkgPyBzdHJhdGVneS5jYW5jZWxVbmRpc3BhdGNoZWQodG9DYW5jZWwsIGNhbmNlbFVuZGlzcGF0Y2hlZCkgOiBjYW5jZWxVbmRpc3BhdGNoZWQodG9DYW5jZWwpO1xuICAgICAgICAgICAgICAgICAgICBpZiAocmVzcG9uc2UgJiYgKHJlc3BvbnNlLmVycm9yICE9PSB1bmRlZmluZWQgfHwgcmVzcG9uc2UucmVzdWx0ICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUXVldWUuZGVsZXRlKGtleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLmRlbGV0ZShjYW5jZWxJZCk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNwb25zZS5pZCA9IHRvQ2FuY2VsLmlkO1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2VTZW5kaW5nUmVzcG9uc2UocmVzcG9uc2UsIG1lc3NhZ2UubWV0aG9kLCBEYXRlLm5vdygpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUocmVzcG9uc2UpLmNhdGNoKCgpID0+IGxvZ2dlci5lcnJvcihgU2VuZGluZyByZXNwb25zZSBmb3IgY2FuY2VsZWQgbWVzc2FnZSBmYWlsZWQuYCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IGNhbmNlbGxhdGlvblRva2VuID0gcmVxdWVzdFRva2Vucy5nZXQoY2FuY2VsSWQpO1xuICAgICAgICAgICAgICAgIC8vIFRoZSByZXF1ZXN0IGlzIGFscmVhZHkgcnVubmluZy4gQ2FuY2VsIHRoZSB0b2tlblxuICAgICAgICAgICAgICAgIGlmIChjYW5jZWxsYXRpb25Ub2tlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGNhbmNlbGxhdGlvblRva2VuLmNhbmNlbCgpO1xuICAgICAgICAgICAgICAgICAgICB0cmFjZVJlY2VpdmVkTm90aWZpY2F0aW9uKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBSZW1lbWJlciB0aGUgY2FuY2VsIGJ1dCBzdGlsbCBxdWV1ZSB0aGUgbWVzc2FnZSB0b1xuICAgICAgICAgICAgICAgICAgICAvLyBjbGVhbiB1cCBzdGF0ZSBpbiBwcm9jZXNzIG1lc3NhZ2UuXG4gICAgICAgICAgICAgICAgICAgIGtub3duQ2FuY2VsZWRSZXF1ZXN0cy5hZGQoY2FuY2VsSWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGFkZE1lc3NhZ2VUb1F1ZXVlKG1lc3NhZ2VRdWV1ZSwgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgZmluYWxseSB7XG4gICAgICAgICAgICB0cmlnZ2VyTWVzc2FnZVF1ZXVlKCk7XG4gICAgICAgIH1cbiAgICB9O1xuICAgIGZ1bmN0aW9uIGhhbmRsZVJlcXVlc3QocmVxdWVzdE1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgLy8gd2UgcmV0dXJuIGhlcmUgc2lsZW50bHkgc2luY2Ugd2UgZmlyZWQgYW4gZXZlbnQgd2hlbiB0aGVcbiAgICAgICAgICAgIC8vIGNvbm5lY3Rpb24gZ290IGRpc3Bvc2VkLlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHJlcGx5KHJlc3VsdE9yRXJyb3IsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgaWQ6IHJlcXVlc3RNZXNzYWdlLmlkXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgaWYgKHJlc3VsdE9yRXJyb3IgaW5zdGFuY2VvZiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICBtZXNzYWdlLmVycm9yID0gcmVzdWx0T3JFcnJvci50b0pzb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVzdWx0ID0gcmVzdWx0T3JFcnJvciA9PT0gdW5kZWZpbmVkID8gbnVsbCA6IHJlc3VsdE9yRXJyb3I7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0cmFjZVNlbmRpbmdSZXNwb25zZShtZXNzYWdlLCBtZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICBtZXNzYWdlV3JpdGVyLndyaXRlKG1lc3NhZ2UpLmNhdGNoKCgpID0+IGxvZ2dlci5lcnJvcihgU2VuZGluZyByZXNwb25zZSBmYWlsZWQuYCkpO1xuICAgICAgICB9XG4gICAgICAgIGZ1bmN0aW9uIHJlcGx5RXJyb3IoZXJyb3IsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgICAgICBjb25zdCBtZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgaWQ6IHJlcXVlc3RNZXNzYWdlLmlkLFxuICAgICAgICAgICAgICAgIGVycm9yOiBlcnJvci50b0pzb24oKVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUobWVzc2FnZSkuY2F0Y2goKCkgPT4gbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlc3BvbnNlIGZhaWxlZC5gKSk7XG4gICAgICAgIH1cbiAgICAgICAgZnVuY3Rpb24gcmVwbHlTdWNjZXNzKHJlc3VsdCwgbWV0aG9kLCBzdGFydFRpbWUpIHtcbiAgICAgICAgICAgIC8vIFRoZSBKU09OIFJQQyBkZWZpbmVzIHRoYXQgYSByZXNwb25zZSBtdXN0IGVpdGhlciBoYXZlIGEgcmVzdWx0IG9yIGFuIGVycm9yXG4gICAgICAgICAgICAvLyBTbyB3ZSBjYW4ndCB0cmVhdCB1bmRlZmluZWQgYXMgYSB2YWxpZCByZXNwb25zZSByZXN1bHQuXG4gICAgICAgICAgICBpZiAocmVzdWx0ID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgbWVzc2FnZSA9IHtcbiAgICAgICAgICAgICAgICBqc29ucnBjOiB2ZXJzaW9uLFxuICAgICAgICAgICAgICAgIGlkOiByZXF1ZXN0TWVzc2FnZS5pZCxcbiAgICAgICAgICAgICAgICByZXN1bHQ6IHJlc3VsdFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIud3JpdGUobWVzc2FnZSkuY2F0Y2goKCkgPT4gbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlc3BvbnNlIGZhaWxlZC5gKSk7XG4gICAgICAgIH1cbiAgICAgICAgdHJhY2VSZWNlaXZlZFJlcXVlc3QocmVxdWVzdE1lc3NhZ2UpO1xuICAgICAgICBjb25zdCBlbGVtZW50ID0gcmVxdWVzdEhhbmRsZXJzLmdldChyZXF1ZXN0TWVzc2FnZS5tZXRob2QpO1xuICAgICAgICBsZXQgdHlwZTtcbiAgICAgICAgbGV0IHJlcXVlc3RIYW5kbGVyO1xuICAgICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICAgICAgdHlwZSA9IGVsZW1lbnQudHlwZTtcbiAgICAgICAgICAgIHJlcXVlc3RIYW5kbGVyID0gZWxlbWVudC5oYW5kbGVyO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHN0YXJ0VGltZSA9IERhdGUubm93KCk7XG4gICAgICAgIGlmIChyZXF1ZXN0SGFuZGxlciB8fCBzdGFyUmVxdWVzdEhhbmRsZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IHRva2VuS2V5ID0gcmVxdWVzdE1lc3NhZ2UuaWQgPz8gU3RyaW5nKERhdGUubm93KCkpOyAvL1xuICAgICAgICAgICAgY29uc3QgY2FuY2VsbGF0aW9uU291cmNlID0gSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5LmlzKGNhbmNlbGxhdGlvblN0cmF0ZWd5LnJlY2VpdmVyKVxuICAgICAgICAgICAgICAgID8gY2FuY2VsbGF0aW9uU3RyYXRlZ3kucmVjZWl2ZXIuY3JlYXRlQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2UodG9rZW5LZXkpXG4gICAgICAgICAgICAgICAgOiBjYW5jZWxsYXRpb25TdHJhdGVneS5yZWNlaXZlci5jcmVhdGVDYW5jZWxsYXRpb25Ub2tlblNvdXJjZShyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICBpZiAocmVxdWVzdE1lc3NhZ2UuaWQgIT09IG51bGwgJiYga25vd25DYW5jZWxlZFJlcXVlc3RzLmhhcyhyZXF1ZXN0TWVzc2FnZS5pZCkpIHtcbiAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25Tb3VyY2UuY2FuY2VsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAocmVxdWVzdE1lc3NhZ2UuaWQgIT09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLnNldCh0b2tlbktleSwgY2FuY2VsbGF0aW9uU291cmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgbGV0IGhhbmRsZXJSZXN1bHQ7XG4gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3RIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0TWVzc2FnZS5wYXJhbXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlLm51bWJlck9mUGFyYW1zICE9PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnZhbGlkUGFyYW1zLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyAke3R5cGUubnVtYmVyT2ZQYXJhbXN9IHBhcmFtcyBidXQgcmVjZWl2ZWQgbm9uZS5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXJSZXN1bHQgPSByZXF1ZXN0SGFuZGxlcihjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkocmVxdWVzdE1lc3NhZ2UucGFyYW1zKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUgIT09IHVuZGVmaW5lZCAmJiB0eXBlLnBhcmFtZXRlclN0cnVjdHVyZXMgPT09IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBseUVycm9yKG5ldyBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IobWVzc2FnZXNfMS5FcnJvckNvZGVzLkludmFsaWRQYXJhbXMsIGBSZXF1ZXN0ICR7cmVxdWVzdE1lc3NhZ2UubWV0aG9kfSBkZWZpbmVzIHBhcmFtZXRlcnMgYnkgbmFtZSBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBwb3NpdGlvbmApLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlclJlc3VsdCA9IHJlcXVlc3RIYW5kbGVyKC4uLnJlcXVlc3RNZXNzYWdlLnBhcmFtcywgY2FuY2VsbGF0aW9uU291cmNlLnRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS5wYXJhbWV0ZXJTdHJ1Y3R1cmVzID09PSBtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW52YWxpZFBhcmFtcywgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGRlZmluZXMgcGFyYW1ldGVycyBieSBwb3NpdGlvbiBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBuYW1lYCksIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gcmVxdWVzdEhhbmRsZXIocmVxdWVzdE1lc3NhZ2UucGFyYW1zLCBjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHN0YXJSZXF1ZXN0SGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVyUmVzdWx0ID0gc3RhclJlcXVlc3RIYW5kbGVyKHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgcmVxdWVzdE1lc3NhZ2UucGFyYW1zLCBjYW5jZWxsYXRpb25Tb3VyY2UudG9rZW4pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjb25zdCBwcm9taXNlID0gaGFuZGxlclJlc3VsdDtcbiAgICAgICAgICAgICAgICBpZiAoIWhhbmRsZXJSZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdFRva2Vucy5kZWxldGUodG9rZW5LZXkpO1xuICAgICAgICAgICAgICAgICAgICByZXBseVN1Y2Nlc3MoaGFuZGxlclJlc3VsdCwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChwcm9taXNlLnRoZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgcHJvbWlzZS50aGVuKChyZXN1bHRPckVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0VG9rZW5zLmRlbGV0ZSh0b2tlbktleSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXBseShyZXN1bHRPckVycm9yLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgICAgICAgICAgICAgIH0sIGVycm9yID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlcnJvciBpbnN0YW5jZW9mIG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IoZXJyb3IsIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGVycm9yICYmIElzLnN0cmluZyhlcnJvci5tZXNzYWdlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGZhaWxlZCB3aXRoIG1lc3NhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZmFpbGVkIHVuZXhwZWN0ZWRseSB3aXRob3V0IHByb3ZpZGluZyBhbnkgZGV0YWlscy5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHkoaGFuZGxlclJlc3VsdCwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMuZGVsZXRlKHRva2VuS2V5KTtcbiAgICAgICAgICAgICAgICBpZiAoZXJyb3IgaW5zdGFuY2VvZiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHkoZXJyb3IsIHJlcXVlc3RNZXNzYWdlLm1ldGhvZCwgc3RhcnRUaW1lKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZXJyb3IgJiYgSXMuc3RyaW5nKGVycm9yLm1lc3NhZ2UpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuSW50ZXJuYWxFcnJvciwgYFJlcXVlc3QgJHtyZXF1ZXN0TWVzc2FnZS5tZXRob2R9IGZhaWxlZCB3aXRoIG1lc3NhZ2U6ICR7ZXJyb3IubWVzc2FnZX1gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmVwbHlFcnJvcihuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5JbnRlcm5hbEVycm9yLCBgUmVxdWVzdCAke3JlcXVlc3RNZXNzYWdlLm1ldGhvZH0gZmFpbGVkIHVuZXhwZWN0ZWRseSB3aXRob3V0IHByb3ZpZGluZyBhbnkgZGV0YWlscy5gKSwgcmVxdWVzdE1lc3NhZ2UubWV0aG9kLCBzdGFydFRpbWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlcGx5RXJyb3IobmV3IG1lc3NhZ2VzXzEuUmVzcG9uc2VFcnJvcihtZXNzYWdlc18xLkVycm9yQ29kZXMuTWV0aG9kTm90Rm91bmQsIGBVbmhhbmRsZWQgbWV0aG9kICR7cmVxdWVzdE1lc3NhZ2UubWV0aG9kfWApLCByZXF1ZXN0TWVzc2FnZS5tZXRob2QsIHN0YXJ0VGltZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlUmVzcG9uc2UocmVzcG9uc2VNZXNzYWdlKSB7XG4gICAgICAgIGlmIChpc0Rpc3Bvc2VkKCkpIHtcbiAgICAgICAgICAgIC8vIFNlZSBoYW5kbGUgcmVxdWVzdC5cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocmVzcG9uc2VNZXNzYWdlLmlkID09PSBudWxsKSB7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VNZXNzYWdlLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBSZWNlaXZlZCByZXNwb25zZSBtZXNzYWdlIHdpdGhvdXQgaWQ6IEVycm9yIGlzOiBcXG4ke0pTT04uc3RyaW5naWZ5KHJlc3BvbnNlTWVzc2FnZS5lcnJvciwgdW5kZWZpbmVkLCA0KX1gKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgUmVjZWl2ZWQgcmVzcG9uc2UgbWVzc2FnZSB3aXRob3V0IGlkLiBObyBmdXJ0aGVyIGVycm9yIGluZm9ybWF0aW9uIHByb3ZpZGVkLmApO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgY29uc3Qga2V5ID0gcmVzcG9uc2VNZXNzYWdlLmlkO1xuICAgICAgICAgICAgY29uc3QgcmVzcG9uc2VQcm9taXNlID0gcmVzcG9uc2VQcm9taXNlcy5nZXQoa2V5KTtcbiAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWRSZXNwb25zZShyZXNwb25zZU1lc3NhZ2UsIHJlc3BvbnNlUHJvbWlzZSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VQcm9taXNlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2VzLmRlbGV0ZShrZXkpO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXNwb25zZU1lc3NhZ2UuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGVycm9yID0gcmVzcG9uc2VNZXNzYWdlLmVycm9yO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlLnJlamVjdChuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKGVycm9yLmNvZGUsIGVycm9yLm1lc3NhZ2UsIGVycm9yLmRhdGEpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChyZXNwb25zZU1lc3NhZ2UucmVzdWx0ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlUHJvbWlzZS5yZXNvbHZlKHJlc3BvbnNlTWVzc2FnZS5yZXN1bHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTaG91bGQgbmV2ZXIgaGFwcGVuLicpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZXJyb3IubWVzc2FnZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBSZXNwb25zZSBoYW5kbGVyICcke3Jlc3BvbnNlUHJvbWlzZS5tZXRob2R9JyBmYWlsZWQgd2l0aCBtZXNzYWdlOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYFJlc3BvbnNlIGhhbmRsZXIgJyR7cmVzcG9uc2VQcm9taXNlLm1ldGhvZH0nIGZhaWxlZCB1bmV4cGVjdGVkbHkuYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlTm90aWZpY2F0aW9uKG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgLy8gU2VlIGhhbmRsZSByZXF1ZXN0LlxuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCB0eXBlID0gdW5kZWZpbmVkO1xuICAgICAgICBsZXQgbm90aWZpY2F0aW9uSGFuZGxlcjtcbiAgICAgICAgaWYgKG1lc3NhZ2UubWV0aG9kID09PSBDYW5jZWxOb3RpZmljYXRpb24udHlwZS5tZXRob2QpIHtcbiAgICAgICAgICAgIGNvbnN0IGNhbmNlbElkID0gbWVzc2FnZS5wYXJhbXMuaWQ7XG4gICAgICAgICAgICBrbm93bkNhbmNlbGVkUmVxdWVzdHMuZGVsZXRlKGNhbmNlbElkKTtcbiAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWROb3RpZmljYXRpb24obWVzc2FnZSk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBjb25zdCBlbGVtZW50ID0gbm90aWZpY2F0aW9uSGFuZGxlcnMuZ2V0KG1lc3NhZ2UubWV0aG9kKTtcbiAgICAgICAgICAgIGlmIChlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uSGFuZGxlciA9IGVsZW1lbnQuaGFuZGxlcjtcbiAgICAgICAgICAgICAgICB0eXBlID0gZWxlbWVudC50eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChub3RpZmljYXRpb25IYW5kbGVyIHx8IHN0YXJOb3RpZmljYXRpb25IYW5kbGVyKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHRyYWNlUmVjZWl2ZWROb3RpZmljYXRpb24obWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgaWYgKG5vdGlmaWNhdGlvbkhhbmRsZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UucGFyYW1zID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5udW1iZXJPZlBhcmFtcyAhPT0gMCAmJiB0eXBlLnBhcmFtZXRlclN0cnVjdHVyZXMgIT09IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieU5hbWUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBOb3RpZmljYXRpb24gJHttZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyAke3R5cGUubnVtYmVyT2ZQYXJhbXN9IHBhcmFtcyBidXQgcmVjZWl2ZWQgbm9uZS5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShtZXNzYWdlLnBhcmFtcykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGFyZSBKU09OLVJQQyBsaWJyYXJpZXMgdGhhdCBzZW5kIHByb2dyZXNzIG1lc3NhZ2UgYXMgcG9zaXRpb25hbCBwYXJhbXMgYWx0aG91Z2hcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWNpZmllZCBhcyBuYW1lZC4gU28gY29udmVydCB0aGVtIGlmIHRoaXMgaXMgdGhlIGNhc2UuXG4gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBtZXNzYWdlLnBhcmFtcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLm1ldGhvZCA9PT0gUHJvZ3Jlc3NOb3RpZmljYXRpb24udHlwZS5tZXRob2QgJiYgcGFyYW1zLmxlbmd0aCA9PT0gMiAmJiBQcm9ncmVzc1Rva2VuLmlzKHBhcmFtc1swXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKHsgdG9rZW46IHBhcmFtc1swXSwgdmFsdWU6IHBhcmFtc1sxXSB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGUucGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBOb3RpZmljYXRpb24gJHttZXNzYWdlLm1ldGhvZH0gZGVmaW5lcyBwYXJhbWV0ZXJzIGJ5IG5hbWUgYnV0IHJlY2VpdmVkIHBhcmFtZXRlcnMgYnkgcG9zaXRpb25gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZS5udW1iZXJPZlBhcmFtcyAhPT0gbWVzc2FnZS5wYXJhbXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYE5vdGlmaWNhdGlvbiAke21lc3NhZ2UubWV0aG9kfSBkZWZpbmVzICR7dHlwZS5udW1iZXJPZlBhcmFtc30gcGFyYW1zIGJ1dCByZWNlaXZlZCAke3BhcmFtcy5sZW5ndGh9IGFyZ3VtZW50c2ApO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXIoLi4ucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlICE9PSB1bmRlZmluZWQgJiYgdHlwZS5wYXJhbWV0ZXJTdHJ1Y3R1cmVzID09PSBtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuYnlQb3NpdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgTm90aWZpY2F0aW9uICR7bWVzc2FnZS5tZXRob2R9IGRlZmluZXMgcGFyYW1ldGVycyBieSBwb3NpdGlvbiBidXQgcmVjZWl2ZWQgcGFyYW1ldGVycyBieSBuYW1lYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBub3RpZmljYXRpb25IYW5kbGVyKG1lc3NhZ2UucGFyYW1zKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChzdGFyTm90aWZpY2F0aW9uSGFuZGxlcikge1xuICAgICAgICAgICAgICAgICAgICBzdGFyTm90aWZpY2F0aW9uSGFuZGxlcihtZXNzYWdlLm1ldGhvZCwgbWVzc2FnZS5wYXJhbXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgIGlmIChlcnJvci5tZXNzYWdlKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZ2dlci5lcnJvcihgTm90aWZpY2F0aW9uIGhhbmRsZXIgJyR7bWVzc2FnZS5tZXRob2R9JyBmYWlsZWQgd2l0aCBtZXNzYWdlOiAke2Vycm9yLm1lc3NhZ2V9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsb2dnZXIuZXJyb3IoYE5vdGlmaWNhdGlvbiBoYW5kbGVyICcke21lc3NhZ2UubWV0aG9kfScgZmFpbGVkIHVuZXhwZWN0ZWRseS5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1bmhhbmRsZWROb3RpZmljYXRpb25FbWl0dGVyLmZpcmUobWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gaGFuZGxlSW52YWxpZE1lc3NhZ2UobWVzc2FnZSkge1xuICAgICAgICBpZiAoIW1lc3NhZ2UpIHtcbiAgICAgICAgICAgIGxvZ2dlci5lcnJvcignUmVjZWl2ZWQgZW1wdHkgbWVzc2FnZS4nKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBsb2dnZXIuZXJyb3IoYFJlY2VpdmVkIG1lc3NhZ2Ugd2hpY2ggaXMgbmVpdGhlciBhIHJlc3BvbnNlIG5vciBhIG5vdGlmaWNhdGlvbiBtZXNzYWdlOlxcbiR7SlNPTi5zdHJpbmdpZnkobWVzc2FnZSwgbnVsbCwgNCl9YCk7XG4gICAgICAgIC8vIFRlc3Qgd2hldGhlciB3ZSBmaW5kIGFuIGlkIHRvIHJlamVjdCB0aGUgcHJvbWlzZVxuICAgICAgICBjb25zdCByZXNwb25zZU1lc3NhZ2UgPSBtZXNzYWdlO1xuICAgICAgICBpZiAoSXMuc3RyaW5nKHJlc3BvbnNlTWVzc2FnZS5pZCkgfHwgSXMubnVtYmVyKHJlc3BvbnNlTWVzc2FnZS5pZCkpIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IHJlc3BvbnNlTWVzc2FnZS5pZDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3BvbnNlSGFuZGxlciA9IHJlc3BvbnNlUHJvbWlzZXMuZ2V0KGtleSk7XG4gICAgICAgICAgICBpZiAocmVzcG9uc2VIYW5kbGVyKSB7XG4gICAgICAgICAgICAgICAgcmVzcG9uc2VIYW5kbGVyLnJlamVjdChuZXcgRXJyb3IoJ1RoZSByZWNlaXZlZCByZXNwb25zZSBoYXMgbmVpdGhlciBhIHJlc3VsdCBub3IgYW4gZXJyb3IgcHJvcGVydHkuJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN0cmluZ2lmeVRyYWNlKHBhcmFtcykge1xuICAgICAgICBpZiAocGFyYW1zID09PSB1bmRlZmluZWQgfHwgcGFyYW1zID09PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gdW5kZWZpbmVkO1xuICAgICAgICB9XG4gICAgICAgIHN3aXRjaCAodHJhY2UpIHtcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuVmVyYm9zZTpcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGFyYW1zLCBudWxsLCA0KTtcbiAgICAgICAgICAgIGNhc2UgVHJhY2UuQ29tcGFjdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkocGFyYW1zKTtcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVNlbmRpbmdSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFjZUZvcm1hdCA9PT0gVHJhY2VGb3JtYXQuVGV4dCkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSAmJiBtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBgUGFyYW1zOiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucGFyYW1zKX1cXG5cXG5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJhY2VyLmxvZyhgU2VuZGluZyByZXF1ZXN0ICcke21lc3NhZ2UubWV0aG9kfSAtICgke21lc3NhZ2UuaWR9KScuYCwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb2dMU1BNZXNzYWdlKCdzZW5kLXJlcXVlc3QnLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVNlbmRpbmdOb3RpZmljYXRpb24obWVzc2FnZSkge1xuICAgICAgICBpZiAodHJhY2UgPT09IFRyYWNlLk9mZiB8fCAhdHJhY2VyKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYWNlRm9ybWF0ID09PSBUcmFjZUZvcm1hdC5UZXh0KSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdCkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0gYFBhcmFtczogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLnBhcmFtcyl9XFxuXFxuYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSAnTm8gcGFyYW1ldGVycyBwcm92aWRlZC5cXG5cXG4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFNlbmRpbmcgbm90aWZpY2F0aW9uICcke21lc3NhZ2UubWV0aG9kfScuYCwgZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsb2dMU1BNZXNzYWdlKCdzZW5kLW5vdGlmaWNhdGlvbicsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYWNlU2VuZGluZ1Jlc3BvbnNlKG1lc3NhZ2UsIG1ldGhvZCwgc3RhcnRUaW1lKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhY2VGb3JtYXQgPT09IFRyYWNlRm9ybWF0LlRleHQpIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZXJyb3IgJiYgbWVzc2FnZS5lcnJvci5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgRXJyb3IgZGF0YTogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLmVycm9yLmRhdGEpfVxcblxcbmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgUmVzdWx0OiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucmVzdWx0KX1cXG5cXG5gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UuZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9ICdObyByZXN1bHQgcmV0dXJuZWQuXFxuXFxuJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFNlbmRpbmcgcmVzcG9uc2UgJyR7bWV0aG9kfSAtICgke21lc3NhZ2UuaWR9KScuIFByb2Nlc3NpbmcgcmVxdWVzdCB0b29rICR7RGF0ZS5ub3coKSAtIHN0YXJ0VGltZX1tc2AsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgnc2VuZC1yZXNwb25zZScsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRyYWNlUmVjZWl2ZWRSZXF1ZXN0KG1lc3NhZ2UpIHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0cmFjZUZvcm1hdCA9PT0gVHJhY2VGb3JtYXQuVGV4dCkge1xuICAgICAgICAgICAgbGV0IGRhdGEgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICBpZiAoKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSAmJiBtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBgUGFyYW1zOiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucGFyYW1zKX1cXG5cXG5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdHJhY2VyLmxvZyhgUmVjZWl2ZWQgcmVxdWVzdCAnJHttZXNzYWdlLm1ldGhvZH0gLSAoJHttZXNzYWdlLmlkfSknLmAsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1yZXF1ZXN0JywgbWVzc2FnZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdHJhY2VSZWNlaXZlZE5vdGlmaWNhdGlvbihtZXNzYWdlKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIgfHwgbWVzc2FnZS5tZXRob2QgPT09IExvZ1RyYWNlTm90aWZpY2F0aW9uLnR5cGUubWV0aG9kKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRyYWNlRm9ybWF0ID09PSBUcmFjZUZvcm1hdC5UZXh0KSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdCkge1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlLnBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhID0gYFBhcmFtczogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLnBhcmFtcyl9XFxuXFxuYDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSAnTm8gcGFyYW1ldGVycyBwcm92aWRlZC5cXG5cXG4nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlci5sb2coYFJlY2VpdmVkIG5vdGlmaWNhdGlvbiAnJHttZXNzYWdlLm1ldGhvZH0nLmAsIGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1ub3RpZmljYXRpb24nLCBtZXNzYWdlKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiB0cmFjZVJlY2VpdmVkUmVzcG9uc2UobWVzc2FnZSwgcmVzcG9uc2VQcm9taXNlKSB7XG4gICAgICAgIGlmICh0cmFjZSA9PT0gVHJhY2UuT2ZmIHx8ICF0cmFjZXIpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJhY2VGb3JtYXQgPT09IFRyYWNlRm9ybWF0LlRleHQpIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5WZXJib3NlIHx8IHRyYWNlID09PSBUcmFjZS5Db21wYWN0KSB7XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2UuZXJyb3IgJiYgbWVzc2FnZS5lcnJvci5kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgRXJyb3IgZGF0YTogJHtzdHJpbmdpZnlUcmFjZShtZXNzYWdlLmVycm9yLmRhdGEpfVxcblxcbmA7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5yZXN1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBgUmVzdWx0OiAke3N0cmluZ2lmeVRyYWNlKG1lc3NhZ2UucmVzdWx0KX1cXG5cXG5gO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1lc3NhZ2UuZXJyb3IgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9ICdObyByZXN1bHQgcmV0dXJuZWQuXFxuXFxuJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChyZXNwb25zZVByb21pc2UpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlcnJvciA9IG1lc3NhZ2UuZXJyb3IgPyBgIFJlcXVlc3QgZmFpbGVkOiAke21lc3NhZ2UuZXJyb3IubWVzc2FnZX0gKCR7bWVzc2FnZS5lcnJvci5jb2RlfSkuYCA6ICcnO1xuICAgICAgICAgICAgICAgIHRyYWNlci5sb2coYFJlY2VpdmVkIHJlc3BvbnNlICcke3Jlc3BvbnNlUHJvbWlzZS5tZXRob2R9IC0gKCR7bWVzc2FnZS5pZH0pJyBpbiAke0RhdGUubm93KCkgLSByZXNwb25zZVByb21pc2UudGltZXJTdGFydH1tcy4ke2Vycm9yfWAsIGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdHJhY2VyLmxvZyhgUmVjZWl2ZWQgcmVzcG9uc2UgJHttZXNzYWdlLmlkfSB3aXRob3V0IGFjdGl2ZSByZXNwb25zZSBwcm9taXNlLmAsIGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbG9nTFNQTWVzc2FnZSgncmVjZWl2ZS1yZXNwb25zZScsIG1lc3NhZ2UpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGxvZ0xTUE1lc3NhZ2UodHlwZSwgbWVzc2FnZSkge1xuICAgICAgICBpZiAoIXRyYWNlciB8fCB0cmFjZSA9PT0gVHJhY2UuT2ZmKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbHNwTWVzc2FnZSA9IHtcbiAgICAgICAgICAgIGlzTFNQTWVzc2FnZTogdHJ1ZSxcbiAgICAgICAgICAgIHR5cGUsXG4gICAgICAgICAgICBtZXNzYWdlLFxuICAgICAgICAgICAgdGltZXN0YW1wOiBEYXRlLm5vdygpXG4gICAgICAgIH07XG4gICAgICAgIHRyYWNlci5sb2cobHNwTWVzc2FnZSk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRocm93SWZDbG9zZWRPckRpc3Bvc2VkKCkge1xuICAgICAgICBpZiAoaXNDbG9zZWQoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IENvbm5lY3Rpb25FcnJvcihDb25uZWN0aW9uRXJyb3JzLkNsb3NlZCwgJ0Nvbm5lY3Rpb24gaXMgY2xvc2VkLicpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChpc0Rpc3Bvc2VkKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb25uZWN0aW9uRXJyb3IoQ29ubmVjdGlvbkVycm9ycy5EaXNwb3NlZCwgJ0Nvbm5lY3Rpb24gaXMgZGlzcG9zZWQuJyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gdGhyb3dJZkxpc3RlbmluZygpIHtcbiAgICAgICAgaWYgKGlzTGlzdGVuaW5nKCkpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBDb25uZWN0aW9uRXJyb3IoQ29ubmVjdGlvbkVycm9ycy5BbHJlYWR5TGlzdGVuaW5nLCAnQ29ubmVjdGlvbiBpcyBhbHJlYWR5IGxpc3RlbmluZycpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHRocm93SWZOb3RMaXN0ZW5pbmcoKSB7XG4gICAgICAgIGlmICghaXNMaXN0ZW5pbmcoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdDYWxsIGxpc3RlbigpIGZpcnN0LicpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIHVuZGVmaW5lZFRvTnVsbChwYXJhbSkge1xuICAgICAgICBpZiAocGFyYW0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gcGFyYW07XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gbnVsbFRvVW5kZWZpbmVkKHBhcmFtKSB7XG4gICAgICAgIGlmIChwYXJhbSA9PT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJhbTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBmdW5jdGlvbiBpc05hbWVkUGFyYW0ocGFyYW0pIHtcbiAgICAgICAgcmV0dXJuIHBhcmFtICE9PSB1bmRlZmluZWQgJiYgcGFyYW0gIT09IG51bGwgJiYgIUFycmF5LmlzQXJyYXkocGFyYW0pICYmIHR5cGVvZiBwYXJhbSA9PT0gJ29iamVjdCc7XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXB1dGVTaW5nbGVQYXJhbShwYXJhbWV0ZXJTdHJ1Y3R1cmVzLCBwYXJhbSkge1xuICAgICAgICBzd2l0Y2ggKHBhcmFtZXRlclN0cnVjdHVyZXMpIHtcbiAgICAgICAgICAgIGNhc2UgbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG86XG4gICAgICAgICAgICAgICAgaWYgKGlzTmFtZWRQYXJhbShwYXJhbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGxUb1VuZGVmaW5lZChwYXJhbSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gW3VuZGVmaW5lZFRvTnVsbChwYXJhbSldO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhc2UgbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZTpcbiAgICAgICAgICAgICAgICBpZiAoIWlzTmFtZWRQYXJhbShwYXJhbSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBSZWNlaXZlZCBwYXJhbWV0ZXJzIGJ5IG5hbWUgYnV0IHBhcmFtIGlzIG5vdCBhbiBvYmplY3QgbGl0ZXJhbC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIG51bGxUb1VuZGVmaW5lZChwYXJhbSk7XG4gICAgICAgICAgICBjYXNlIG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5ieVBvc2l0aW9uOlxuICAgICAgICAgICAgICAgIHJldHVybiBbdW5kZWZpbmVkVG9OdWxsKHBhcmFtKV07XG4gICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBwYXJhbWV0ZXIgc3RydWN0dXJlICR7cGFyYW1ldGVyU3RydWN0dXJlcy50b1N0cmluZygpfWApO1xuICAgICAgICB9XG4gICAgfVxuICAgIGZ1bmN0aW9uIGNvbXB1dGVNZXNzYWdlUGFyYW1zKHR5cGUsIHBhcmFtcykge1xuICAgICAgICBsZXQgcmVzdWx0O1xuICAgICAgICBjb25zdCBudW1iZXJPZlBhcmFtcyA9IHR5cGUubnVtYmVyT2ZQYXJhbXM7XG4gICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgIGNhc2UgMDpcbiAgICAgICAgICAgICAgICByZXN1bHQgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gY29tcHV0ZVNpbmdsZVBhcmFtKHR5cGUucGFyYW1ldGVyU3RydWN0dXJlcywgcGFyYW1zWzBdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gW107XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwYXJhbXMubGVuZ3RoICYmIGkgPCBudW1iZXJPZlBhcmFtczsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKHVuZGVmaW5lZFRvTnVsbChwYXJhbXNbaV0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPCBudW1iZXJPZlBhcmFtcykge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gcGFyYW1zLmxlbmd0aDsgaSA8IG51bWJlck9mUGFyYW1zOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKG51bGwpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIGNvbnN0IGNvbm5lY3Rpb24gPSB7XG4gICAgICAgIHNlbmROb3RpZmljYXRpb246ICh0eXBlLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlUGFyYW1zO1xuICAgICAgICAgICAgaWYgKElzLnN0cmluZyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICAgIGxldCBwYXJhbVN0YXJ0ID0gMDtcbiAgICAgICAgICAgICAgICBsZXQgcGFyYW1ldGVyU3RydWN0dXJlcyA9IG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5hdXRvO1xuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlc18xLlBhcmFtZXRlclN0cnVjdHVyZXMuaXMoZmlyc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtU3RhcnQgPSAxO1xuICAgICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gZmlyc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxldCBwYXJhbUVuZCA9IGFyZ3MubGVuZ3RoO1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gcGFyYW1FbmQgLSBwYXJhbVN0YXJ0O1xuICAgICAgICAgICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zID0gY29tcHV0ZVNpbmdsZVBhcmFtKHBhcmFtZXRlclN0cnVjdHVyZXMsIGFyZ3NbcGFyYW1TdGFydF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjZWl2ZWQgJHtudW1iZXJPZlBhcmFtc30gcGFyYW1ldGVycyBmb3IgJ2J5IE5hbWUnIG5vdGlmaWNhdGlvbiBwYXJhbWV0ZXIgc3RydWN0dXJlLmApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IGFyZ3Muc2xpY2UocGFyYW1TdGFydCwgcGFyYW1FbmQpLm1hcCh2YWx1ZSA9PiB1bmRlZmluZWRUb051bGwodmFsdWUpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGNvbnN0IHBhcmFtcyA9IGFyZ3M7XG4gICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZS5tZXRob2Q7XG4gICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IGNvbXB1dGVNZXNzYWdlUGFyYW1zKHR5cGUsIHBhcmFtcyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb25zdCBub3RpZmljYXRpb25NZXNzYWdlID0ge1xuICAgICAgICAgICAgICAgIGpzb25ycGM6IHZlcnNpb24sXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBtZXNzYWdlUGFyYW1zXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdHJhY2VTZW5kaW5nTm90aWZpY2F0aW9uKG5vdGlmaWNhdGlvbk1lc3NhZ2UpO1xuICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2VXcml0ZXIud3JpdGUobm90aWZpY2F0aW9uTWVzc2FnZSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBTZW5kaW5nIG5vdGlmaWNhdGlvbiBmYWlsZWQuYCk7XG4gICAgICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25Ob3RpZmljYXRpb246ICh0eXBlLCBoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGlmIChJcy5mdW5jKHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB0eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaGFuZGxlcikge1xuICAgICAgICAgICAgICAgIGlmIChJcy5zdHJpbmcodHlwZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZTtcbiAgICAgICAgICAgICAgICAgICAgbm90aWZpY2F0aW9uSGFuZGxlcnMuc2V0KHR5cGUsIHsgdHlwZTogdW5kZWZpbmVkLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbWV0aG9kID0gdHlwZS5tZXRob2Q7XG4gICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXJzLnNldCh0eXBlLm1ldGhvZCwgeyB0eXBlLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5vdGlmaWNhdGlvbkhhbmRsZXJzLmRlbGV0ZShtZXRob2QpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3Rhck5vdGlmaWNhdGlvbkhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBvblByb2dyZXNzOiAoX3R5cGUsIHRva2VuLCBoYW5kbGVyKSA9PiB7XG4gICAgICAgICAgICBpZiAocHJvZ3Jlc3NIYW5kbGVycy5oYXModG9rZW4pKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBQcm9ncmVzcyBoYW5kbGVyIGZvciB0b2tlbiAke3Rva2VufSBhbHJlYWR5IHJlZ2lzdGVyZWRgKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHByb2dyZXNzSGFuZGxlcnMuc2V0KHRva2VuLCBoYW5kbGVyKTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzc0hhbmRsZXJzLmRlbGV0ZSh0b2tlbik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICAgICAgc2VuZFByb2dyZXNzOiAoX3R5cGUsIHRva2VuLCB2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgbm90IGF3YWl0IGJ1dCBzaW1wbGUgcmV0dXJuIHRvIGVuc3VyZSB0aGF0IHdlIGRvbid0IGhhdmUgYW5vdGhlclxuICAgICAgICAgICAgLy8gYXN5bmMgc2NoZWR1bGluZy4gT3RoZXJ3aXNlIG9uZSBzZW5kIGNvdWxkIG92ZXJ0YWtlIGFub3RoZXIgc2VuZC5cbiAgICAgICAgICAgIHJldHVybiBjb25uZWN0aW9uLnNlbmROb3RpZmljYXRpb24oUHJvZ3Jlc3NOb3RpZmljYXRpb24udHlwZSwgeyB0b2tlbiwgdmFsdWUgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIG9uVW5oYW5kbGVkUHJvZ3Jlc3M6IHVuaGFuZGxlZFByb2dyZXNzRW1pdHRlci5ldmVudCxcbiAgICAgICAgc2VuZFJlcXVlc3Q6ICh0eXBlLCAuLi5hcmdzKSA9PiB7XG4gICAgICAgICAgICB0aHJvd0lmQ2xvc2VkT3JEaXNwb3NlZCgpO1xuICAgICAgICAgICAgdGhyb3dJZk5vdExpc3RlbmluZygpO1xuICAgICAgICAgICAgbGV0IG1ldGhvZDtcbiAgICAgICAgICAgIGxldCBtZXNzYWdlUGFyYW1zO1xuICAgICAgICAgICAgbGV0IHRva2VuID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgaWYgKElzLnN0cmluZyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgY29uc3QgZmlyc3QgPSBhcmdzWzBdO1xuICAgICAgICAgICAgICAgIGNvbnN0IGxhc3QgPSBhcmdzW2FyZ3MubGVuZ3RoIC0gMV07XG4gICAgICAgICAgICAgICAgbGV0IHBhcmFtU3RhcnQgPSAwO1xuICAgICAgICAgICAgICAgIGxldCBwYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmF1dG87XG4gICAgICAgICAgICAgICAgaWYgKG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlcy5pcyhmaXJzdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyYW1TdGFydCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlclN0cnVjdHVyZXMgPSBmaXJzdDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbGV0IHBhcmFtRW5kID0gYXJncy5sZW5ndGg7XG4gICAgICAgICAgICAgICAgaWYgKGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuLmlzKGxhc3QpKSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcmFtRW5kID0gcGFyYW1FbmQgLSAxO1xuICAgICAgICAgICAgICAgICAgICB0b2tlbiA9IGxhc3Q7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gcGFyYW1FbmQgLSBwYXJhbVN0YXJ0O1xuICAgICAgICAgICAgICAgIHN3aXRjaCAobnVtYmVyT2ZQYXJhbXMpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAwOlxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVBhcmFtcyA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlUGFyYW1zID0gY29tcHV0ZVNpbmdsZVBhcmFtKHBhcmFtZXRlclN0cnVjdHVyZXMsIGFyZ3NbcGFyYW1TdGFydF0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAocGFyYW1ldGVyU3RydWN0dXJlcyA9PT0gbWVzc2FnZXNfMS5QYXJhbWV0ZXJTdHJ1Y3R1cmVzLmJ5TmFtZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgUmVjZWl2ZWQgJHtudW1iZXJPZlBhcmFtc30gcGFyYW1ldGVycyBmb3IgJ2J5IE5hbWUnIHJlcXVlc3QgcGFyYW1ldGVyIHN0cnVjdHVyZS5gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMgPSBhcmdzLnNsaWNlKHBhcmFtU3RhcnQsIHBhcmFtRW5kKS5tYXAodmFsdWUgPT4gdW5kZWZpbmVkVG9OdWxsKHZhbHVlKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwYXJhbXMgPSBhcmdzO1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGUubWV0aG9kO1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VQYXJhbXMgPSBjb21wdXRlTWVzc2FnZVBhcmFtcyh0eXBlLCBwYXJhbXMpO1xuICAgICAgICAgICAgICAgIGNvbnN0IG51bWJlck9mUGFyYW1zID0gdHlwZS5udW1iZXJPZlBhcmFtcztcbiAgICAgICAgICAgICAgICB0b2tlbiA9IGNhbmNlbGxhdGlvbl8xLkNhbmNlbGxhdGlvblRva2VuLmlzKHBhcmFtc1tudW1iZXJPZlBhcmFtc10pID8gcGFyYW1zW251bWJlck9mUGFyYW1zXSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGlkID0gc2VxdWVuY2VOdW1iZXIrKztcbiAgICAgICAgICAgIGxldCBkaXNwb3NhYmxlO1xuICAgICAgICAgICAgaWYgKHRva2VuKSB7XG4gICAgICAgICAgICAgICAgZGlzcG9zYWJsZSA9IHRva2VuLm9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgcCA9IGNhbmNlbGxhdGlvblN0cmF0ZWd5LnNlbmRlci5zZW5kQ2FuY2VsbGF0aW9uKGNvbm5lY3Rpb24sIGlkKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHAgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmxvZyhgUmVjZWl2ZWQgbm8gcHJvbWlzZSBmcm9tIGNhbmNlbGxhdGlvbiBzdHJhdGVneSB3aGVuIGNhbmNlbGxpbmcgaWQgJHtpZH1gKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBwLmNhdGNoKCgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2dnZXIubG9nKGBTZW5kaW5nIGNhbmNlbGxhdGlvbiBtZXNzYWdlcyBmb3IgaWQgJHtpZH0gZmFpbGVkYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgcmVxdWVzdE1lc3NhZ2UgPSB7XG4gICAgICAgICAgICAgICAganNvbnJwYzogdmVyc2lvbixcbiAgICAgICAgICAgICAgICBpZDogaWQsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiBtZXRob2QsXG4gICAgICAgICAgICAgICAgcGFyYW1zOiBtZXNzYWdlUGFyYW1zXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdHJhY2VTZW5kaW5nUmVxdWVzdChyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICBpZiAodHlwZW9mIGNhbmNlbGxhdGlvblN0cmF0ZWd5LnNlbmRlci5lbmFibGVDYW5jZWxsYXRpb24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBjYW5jZWxsYXRpb25TdHJhdGVneS5zZW5kZXIuZW5hYmxlQ2FuY2VsbGF0aW9uKHJlcXVlc3RNZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBuZXcgUHJvbWlzZShhc3luYyAocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZVdpdGhDbGVhbnVwID0gKHIpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyKTtcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uU3RyYXRlZ3kuc2VuZGVyLmNsZWFudXAoaWQpO1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlPy5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCByZWplY3RXaXRoQ2xlYW51cCA9IChyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChyKTtcbiAgICAgICAgICAgICAgICAgICAgY2FuY2VsbGF0aW9uU3RyYXRlZ3kuc2VuZGVyLmNsZWFudXAoaWQpO1xuICAgICAgICAgICAgICAgICAgICBkaXNwb3NhYmxlPy5kaXNwb3NlKCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjb25zdCByZXNwb25zZVByb21pc2UgPSB7IG1ldGhvZDogbWV0aG9kLCB0aW1lclN0YXJ0OiBEYXRlLm5vdygpLCByZXNvbHZlOiByZXNvbHZlV2l0aENsZWFudXAsIHJlamVjdDogcmVqZWN0V2l0aENsZWFudXAgfTtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2VzLnNldChpZCwgcmVzcG9uc2VQcm9taXNlKTtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgbWVzc2FnZVdyaXRlci53cml0ZShyZXF1ZXN0TWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoIChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAvLyBXcml0aW5nIHRoZSBtZXNzYWdlIGZhaWxlZC4gU28gd2UgbmVlZCB0byBkZWxldGUgaXQgZnJvbSB0aGUgcmVzcG9uc2UgcHJvbWlzZXMgYW5kXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlamVjdCBpdC5cbiAgICAgICAgICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlcy5kZWxldGUoaWQpO1xuICAgICAgICAgICAgICAgICAgICByZXNwb25zZVByb21pc2UucmVqZWN0KG5ldyBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3IobWVzc2FnZXNfMS5FcnJvckNvZGVzLk1lc3NhZ2VXcml0ZUVycm9yLCBlcnJvci5tZXNzYWdlID8gZXJyb3IubWVzc2FnZSA6ICdVbmtub3duIHJlYXNvbicpKTtcbiAgICAgICAgICAgICAgICAgICAgbG9nZ2VyLmVycm9yKGBTZW5kaW5nIHJlcXVlc3QgZmFpbGVkLmApO1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcbiAgICAgICAgb25SZXF1ZXN0OiAodHlwZSwgaGFuZGxlcikgPT4ge1xuICAgICAgICAgICAgdGhyb3dJZkNsb3NlZE9yRGlzcG9zZWQoKTtcbiAgICAgICAgICAgIGxldCBtZXRob2QgPSBudWxsO1xuICAgICAgICAgICAgaWYgKFN0YXJSZXF1ZXN0SGFuZGxlci5pcyh0eXBlKSkge1xuICAgICAgICAgICAgICAgIG1ldGhvZCA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgICAgICBzdGFyUmVxdWVzdEhhbmRsZXIgPSB0eXBlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoSXMuc3RyaW5nKHR5cGUpKSB7XG4gICAgICAgICAgICAgICAgbWV0aG9kID0gbnVsbDtcbiAgICAgICAgICAgICAgICBpZiAoaGFuZGxlciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIG1ldGhvZCA9IHR5cGU7XG4gICAgICAgICAgICAgICAgICAgIHJlcXVlc3RIYW5kbGVycy5zZXQodHlwZSwgeyBoYW5kbGVyOiBoYW5kbGVyLCB0eXBlOiB1bmRlZmluZWQgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgaWYgKGhhbmRsZXIgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBtZXRob2QgPSB0eXBlLm1ldGhvZDtcbiAgICAgICAgICAgICAgICAgICAgcmVxdWVzdEhhbmRsZXJzLnNldCh0eXBlLm1ldGhvZCwgeyB0eXBlLCBoYW5kbGVyIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAobWV0aG9kID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1ldGhvZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0SGFuZGxlcnMuZGVsZXRlKG1ldGhvZCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdGFyUmVxdWVzdEhhbmRsZXIgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBoYXNQZW5kaW5nUmVzcG9uc2U6ICgpID0+IHtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZVByb21pc2VzLnNpemUgPiAwO1xuICAgICAgICB9LFxuICAgICAgICB0cmFjZTogYXN5bmMgKF92YWx1ZSwgX3RyYWNlciwgc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zKSA9PiB7XG4gICAgICAgICAgICBsZXQgX3NlbmROb3RpZmljYXRpb24gPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBfdHJhY2VGb3JtYXQgPSBUcmFjZUZvcm1hdC5UZXh0O1xuICAgICAgICAgICAgaWYgKHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgaWYgKElzLmJvb2xlYW4oc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zKSkge1xuICAgICAgICAgICAgICAgICAgICBfc2VuZE5vdGlmaWNhdGlvbiA9IHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIF9zZW5kTm90aWZpY2F0aW9uID0gc2VuZE5vdGlmaWNhdGlvbk9yVHJhY2VPcHRpb25zLnNlbmROb3RpZmljYXRpb24gfHwgZmFsc2U7XG4gICAgICAgICAgICAgICAgICAgIF90cmFjZUZvcm1hdCA9IHNlbmROb3RpZmljYXRpb25PclRyYWNlT3B0aW9ucy50cmFjZUZvcm1hdCB8fCBUcmFjZUZvcm1hdC5UZXh0O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRyYWNlID0gX3ZhbHVlO1xuICAgICAgICAgICAgdHJhY2VGb3JtYXQgPSBfdHJhY2VGb3JtYXQ7XG4gICAgICAgICAgICBpZiAodHJhY2UgPT09IFRyYWNlLk9mZikge1xuICAgICAgICAgICAgICAgIHRyYWNlciA9IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRyYWNlciA9IF90cmFjZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoX3NlbmROb3RpZmljYXRpb24gJiYgIWlzQ2xvc2VkKCkgJiYgIWlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgICAgIGF3YWl0IGNvbm5lY3Rpb24uc2VuZE5vdGlmaWNhdGlvbihTZXRUcmFjZU5vdGlmaWNhdGlvbi50eXBlLCB7IHZhbHVlOiBUcmFjZS50b1N0cmluZyhfdmFsdWUpIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBvbkVycm9yOiBlcnJvckVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIG9uQ2xvc2U6IGNsb3NlRW1pdHRlci5ldmVudCxcbiAgICAgICAgb25VbmhhbmRsZWROb3RpZmljYXRpb246IHVuaGFuZGxlZE5vdGlmaWNhdGlvbkVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIG9uRGlzcG9zZTogZGlzcG9zZUVtaXR0ZXIuZXZlbnQsXG4gICAgICAgIGVuZDogKCkgPT4ge1xuICAgICAgICAgICAgbWVzc2FnZVdyaXRlci5lbmQoKTtcbiAgICAgICAgfSxcbiAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgaWYgKGlzRGlzcG9zZWQoKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHN0YXRlID0gQ29ubmVjdGlvblN0YXRlLkRpc3Bvc2VkO1xuICAgICAgICAgICAgZGlzcG9zZUVtaXR0ZXIuZmlyZSh1bmRlZmluZWQpO1xuICAgICAgICAgICAgY29uc3QgZXJyb3IgPSBuZXcgbWVzc2FnZXNfMS5SZXNwb25zZUVycm9yKG1lc3NhZ2VzXzEuRXJyb3JDb2Rlcy5QZW5kaW5nUmVzcG9uc2VSZWplY3RlZCwgJ1BlbmRpbmcgcmVzcG9uc2UgcmVqZWN0ZWQgc2luY2UgY29ubmVjdGlvbiBnb3QgZGlzcG9zZWQnKTtcbiAgICAgICAgICAgIGZvciAoY29uc3QgcHJvbWlzZSBvZiByZXNwb25zZVByb21pc2VzLnZhbHVlcygpKSB7XG4gICAgICAgICAgICAgICAgcHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVzcG9uc2VQcm9taXNlcyA9IG5ldyBNYXAoKTtcbiAgICAgICAgICAgIHJlcXVlc3RUb2tlbnMgPSBuZXcgTWFwKCk7XG4gICAgICAgICAgICBrbm93bkNhbmNlbGVkUmVxdWVzdHMgPSBuZXcgU2V0KCk7XG4gICAgICAgICAgICBtZXNzYWdlUXVldWUgPSBuZXcgbGlua2VkTWFwXzEuTGlua2VkTWFwKCk7XG4gICAgICAgICAgICAvLyBUZXN0IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eVxuICAgICAgICAgICAgaWYgKElzLmZ1bmMobWVzc2FnZVdyaXRlci5kaXNwb3NlKSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VXcml0ZXIuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKElzLmZ1bmMobWVzc2FnZVJlYWRlci5kaXNwb3NlKSkge1xuICAgICAgICAgICAgICAgIG1lc3NhZ2VSZWFkZXIuZGlzcG9zZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuICAgICAgICBsaXN0ZW46ICgpID0+IHtcbiAgICAgICAgICAgIHRocm93SWZDbG9zZWRPckRpc3Bvc2VkKCk7XG4gICAgICAgICAgICB0aHJvd0lmTGlzdGVuaW5nKCk7XG4gICAgICAgICAgICBzdGF0ZSA9IENvbm5lY3Rpb25TdGF0ZS5MaXN0ZW5pbmc7XG4gICAgICAgICAgICBtZXNzYWdlUmVhZGVyLmxpc3RlbihjYWxsYmFjayk7XG4gICAgICAgIH0sXG4gICAgICAgIGluc3BlY3Q6ICgpID0+IHtcbiAgICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby1jb25zb2xlXG4gICAgICAgICAgICAoMCwgcmFsXzEuZGVmYXVsdCkoKS5jb25zb2xlLmxvZygnaW5zcGVjdCcpO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBjb25uZWN0aW9uLm9uTm90aWZpY2F0aW9uKExvZ1RyYWNlTm90aWZpY2F0aW9uLnR5cGUsIChwYXJhbXMpID0+IHtcbiAgICAgICAgaWYgKHRyYWNlID09PSBUcmFjZS5PZmYgfHwgIXRyYWNlcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IHZlcmJvc2UgPSB0cmFjZSA9PT0gVHJhY2UuVmVyYm9zZSB8fCB0cmFjZSA9PT0gVHJhY2UuQ29tcGFjdDtcbiAgICAgICAgdHJhY2VyLmxvZyhwYXJhbXMubWVzc2FnZSwgdmVyYm9zZSA/IHBhcmFtcy52ZXJib3NlIDogdW5kZWZpbmVkKTtcbiAgICB9KTtcbiAgICBjb25uZWN0aW9uLm9uTm90aWZpY2F0aW9uKFByb2dyZXNzTm90aWZpY2F0aW9uLnR5cGUsIChwYXJhbXMpID0+IHtcbiAgICAgICAgY29uc3QgaGFuZGxlciA9IHByb2dyZXNzSGFuZGxlcnMuZ2V0KHBhcmFtcy50b2tlbik7XG4gICAgICAgIGlmIChoYW5kbGVyKSB7XG4gICAgICAgICAgICBoYW5kbGVyKHBhcmFtcy52YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB1bmhhbmRsZWRQcm9ncmVzc0VtaXR0ZXIuZmlyZShwYXJhbXMpO1xuICAgICAgICB9XG4gICAgfSk7XG4gICAgcmV0dXJuIGNvbm5lY3Rpb247XG59XG5leHBvcnRzLmNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uID0gY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb247XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG4vLy8gPHJlZmVyZW5jZSBwYXRoPVwiLi4vLi4vdHlwaW5ncy90aGVuYWJsZS5kLnRzXCIgLz5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuUHJvZ3Jlc3NUeXBlID0gZXhwb3J0cy5Qcm9ncmVzc1Rva2VuID0gZXhwb3J0cy5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiA9IGV4cG9ydHMuTnVsbExvZ2dlciA9IGV4cG9ydHMuQ29ubmVjdGlvbk9wdGlvbnMgPSBleHBvcnRzLkNvbm5lY3Rpb25TdHJhdGVneSA9IGV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlQnVmZmVyID0gZXhwb3J0cy5Xcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyID0gZXhwb3J0cy5BYnN0cmFjdE1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLk1lc3NhZ2VXcml0ZXIgPSBleHBvcnRzLlJlYWRhYmxlU3RyZWFtTWVzc2FnZVJlYWRlciA9IGV4cG9ydHMuQWJzdHJhY3RNZXNzYWdlUmVhZGVyID0gZXhwb3J0cy5NZXNzYWdlUmVhZGVyID0gZXhwb3J0cy5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3kgPSBleHBvcnRzLlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblRva2VuID0gZXhwb3J0cy5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZSA9IGV4cG9ydHMuRW1pdHRlciA9IGV4cG9ydHMuRXZlbnQgPSBleHBvcnRzLkRpc3Bvc2FibGUgPSBleHBvcnRzLkxSVUNhY2hlID0gZXhwb3J0cy5Ub3VjaCA9IGV4cG9ydHMuTGlua2VkTWFwID0gZXhwb3J0cy5QYXJhbWV0ZXJTdHJ1Y3R1cmVzID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlOSA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTggPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU3ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlNiA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTUgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGU0ID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMyA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZTIgPSBleHBvcnRzLk5vdGlmaWNhdGlvblR5cGUxID0gZXhwb3J0cy5Ob3RpZmljYXRpb25UeXBlMCA9IGV4cG9ydHMuTm90aWZpY2F0aW9uVHlwZSA9IGV4cG9ydHMuRXJyb3JDb2RlcyA9IGV4cG9ydHMuUmVzcG9uc2VFcnJvciA9IGV4cG9ydHMuUmVxdWVzdFR5cGU5ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTggPSBleHBvcnRzLlJlcXVlc3RUeXBlNyA9IGV4cG9ydHMuUmVxdWVzdFR5cGU2ID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTUgPSBleHBvcnRzLlJlcXVlc3RUeXBlNCA9IGV4cG9ydHMuUmVxdWVzdFR5cGUzID0gZXhwb3J0cy5SZXF1ZXN0VHlwZTIgPSBleHBvcnRzLlJlcXVlc3RUeXBlMSA9IGV4cG9ydHMuUmVxdWVzdFR5cGUwID0gZXhwb3J0cy5SZXF1ZXN0VHlwZSA9IGV4cG9ydHMuTWVzc2FnZSA9IGV4cG9ydHMuUkFMID0gdm9pZCAwO1xuZXhwb3J0cy5NZXNzYWdlU3RyYXRlZ3kgPSBleHBvcnRzLkNhbmNlbGxhdGlvblN0cmF0ZWd5ID0gZXhwb3J0cy5DYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneSA9IGV4cG9ydHMuQ2FuY2VsbGF0aW9uUmVjZWl2ZXJTdHJhdGVneSA9IGV4cG9ydHMuQ29ubmVjdGlvbkVycm9yID0gZXhwb3J0cy5Db25uZWN0aW9uRXJyb3JzID0gZXhwb3J0cy5Mb2dUcmFjZU5vdGlmaWNhdGlvbiA9IGV4cG9ydHMuU2V0VHJhY2VOb3RpZmljYXRpb24gPSBleHBvcnRzLlRyYWNlRm9ybWF0ID0gZXhwb3J0cy5UcmFjZVZhbHVlcyA9IGV4cG9ydHMuVHJhY2UgPSB2b2lkIDA7XG5jb25zdCBtZXNzYWdlc18xID0gcmVxdWlyZShcIi4vbWVzc2FnZXNcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNZXNzYWdlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk1lc3NhZ2U7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlMFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTA7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTFcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGUxOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGUyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlMjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlM1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTRcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGU0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGU1XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlNTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlNlwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTY7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXF1ZXN0VHlwZTdcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUmVxdWVzdFR5cGU3OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUmVxdWVzdFR5cGU4XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlcXVlc3RUeXBlODsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlJlcXVlc3RUeXBlOVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5SZXF1ZXN0VHlwZTk7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZXNwb25zZUVycm9yXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLlJlc3BvbnNlRXJyb3I7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJFcnJvckNvZGVzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLkVycm9yQ29kZXM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlMFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlMDsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGUxXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGUxOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZTJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlM1wiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlMzsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGU0XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZTVcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlNlwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlNjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk5vdGlmaWNhdGlvblR5cGU3XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlc18xLk5vdGlmaWNhdGlvblR5cGU3OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTm90aWZpY2F0aW9uVHlwZThcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuTm90aWZpY2F0aW9uVHlwZTg7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJOb3RpZmljYXRpb25UeXBlOVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZXNfMS5Ob3RpZmljYXRpb25UeXBlOTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlBhcmFtZXRlclN0cnVjdHVyZXNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VzXzEuUGFyYW1ldGVyU3RydWN0dXJlczsgfSB9KTtcbmNvbnN0IGxpbmtlZE1hcF8xID0gcmVxdWlyZShcIi4vbGlua2VkTWFwXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTGlua2VkTWFwXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBsaW5rZWRNYXBfMS5MaW5rZWRNYXA7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJMUlVDYWNoZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbGlua2VkTWFwXzEuTFJVQ2FjaGU7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJUb3VjaFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbGlua2VkTWFwXzEuVG91Y2g7IH0gfSk7XG5jb25zdCBkaXNwb3NhYmxlXzEgPSByZXF1aXJlKFwiLi9kaXNwb3NhYmxlXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiRGlzcG9zYWJsZVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gZGlzcG9zYWJsZV8xLkRpc3Bvc2FibGU7IH0gfSk7XG5jb25zdCBldmVudHNfMSA9IHJlcXVpcmUoXCIuL2V2ZW50c1wiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkV2ZW50XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBldmVudHNfMS5FdmVudDsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkVtaXR0ZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGV2ZW50c18xLkVtaXR0ZXI7IH0gfSk7XG5jb25zdCBjYW5jZWxsYXRpb25fMSA9IHJlcXVpcmUoXCIuL2NhbmNlbGxhdGlvblwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblRva2VuU291cmNlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjYW5jZWxsYXRpb25fMS5DYW5jZWxsYXRpb25Ub2tlblNvdXJjZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblRva2VuXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjYW5jZWxsYXRpb25fMS5DYW5jZWxsYXRpb25Ub2tlbjsgfSB9KTtcbmNvbnN0IHNoYXJlZEFycmF5Q2FuY2VsbGF0aW9uXzEgPSByZXF1aXJlKFwiLi9zaGFyZWRBcnJheUNhbmNlbGxhdGlvblwiKTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlNoYXJlZEFycmF5U2VuZGVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIHNoYXJlZEFycmF5Q2FuY2VsbGF0aW9uXzEuU2hhcmVkQXJyYXlTZW5kZXJTdHJhdGVneTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlNoYXJlZEFycmF5UmVjZWl2ZXJTdHJhdGVneVwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gc2hhcmVkQXJyYXlDYW5jZWxsYXRpb25fMS5TaGFyZWRBcnJheVJlY2VpdmVyU3RyYXRlZ3k7IH0gfSk7XG5jb25zdCBtZXNzYWdlUmVhZGVyXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlUmVhZGVyXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTWVzc2FnZVJlYWRlclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZVJlYWRlcl8xLk1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VSZWFkZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VSZWFkZXJfMS5BYnN0cmFjdE1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJSZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VSZWFkZXJfMS5SZWFkYWJsZVN0cmVhbU1lc3NhZ2VSZWFkZXI7IH0gfSk7XG5jb25zdCBtZXNzYWdlV3JpdGVyXzEgPSByZXF1aXJlKFwiLi9tZXNzYWdlV3JpdGVyXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiTWVzc2FnZVdyaXRlclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gbWVzc2FnZVdyaXRlcl8xLk1lc3NhZ2VXcml0ZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VXcml0ZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VXcml0ZXJfMS5BYnN0cmFjdE1lc3NhZ2VXcml0ZXI7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJXcml0ZWFibGVTdHJlYW1NZXNzYWdlV3JpdGVyXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBtZXNzYWdlV3JpdGVyXzEuV3JpdGVhYmxlU3RyZWFtTWVzc2FnZVdyaXRlcjsgfSB9KTtcbmNvbnN0IG1lc3NhZ2VCdWZmZXJfMSA9IHJlcXVpcmUoXCIuL21lc3NhZ2VCdWZmZXJcIik7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJBYnN0cmFjdE1lc3NhZ2VCdWZmZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIG1lc3NhZ2VCdWZmZXJfMS5BYnN0cmFjdE1lc3NhZ2VCdWZmZXI7IH0gfSk7XG5jb25zdCBjb25uZWN0aW9uXzEgPSByZXF1aXJlKFwiLi9jb25uZWN0aW9uXCIpO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29ubmVjdGlvblN0cmF0ZWd5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ29ubmVjdGlvblN0cmF0ZWd5OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ29ubmVjdGlvbk9wdGlvbnNcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5Db25uZWN0aW9uT3B0aW9uczsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIk51bGxMb2dnZXJcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5OdWxsTG9nZ2VyOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb25cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlByb2dyZXNzVG9rZW5cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5Qcm9ncmVzc1Rva2VuOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiUHJvZ3Jlc3NUeXBlXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuUHJvZ3Jlc3NUeXBlOyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiVHJhY2VcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5UcmFjZTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIlRyYWNlVmFsdWVzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuVHJhY2VWYWx1ZXM7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJUcmFjZUZvcm1hdFwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29ubmVjdGlvbl8xLlRyYWNlRm9ybWF0OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiU2V0VHJhY2VOb3RpZmljYXRpb25cIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5TZXRUcmFjZU5vdGlmaWNhdGlvbjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkxvZ1RyYWNlTm90aWZpY2F0aW9uXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuTG9nVHJhY2VOb3RpZmljYXRpb247IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJDb25uZWN0aW9uRXJyb3JzXCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ29ubmVjdGlvbkVycm9yczsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNvbm5lY3Rpb25FcnJvclwiLCB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24gKCkgeyByZXR1cm4gY29ubmVjdGlvbl8xLkNvbm5lY3Rpb25FcnJvcjsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5DYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5OyB9IH0pO1xuT2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIFwiQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5DYW5jZWxsYXRpb25TZW5kZXJTdHJhdGVneTsgfSB9KTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIkNhbmNlbGxhdGlvblN0cmF0ZWd5XCIsIHsgZW51bWVyYWJsZTogdHJ1ZSwgZ2V0OiBmdW5jdGlvbiAoKSB7IHJldHVybiBjb25uZWN0aW9uXzEuQ2FuY2VsbGF0aW9uU3RyYXRlZ3k7IH0gfSk7XG5PYmplY3QuZGVmaW5lUHJvcGVydHkoZXhwb3J0cywgXCJNZXNzYWdlU3RyYXRlZ3lcIiwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGZ1bmN0aW9uICgpIHsgcmV0dXJuIGNvbm5lY3Rpb25fMS5NZXNzYWdlU3RyYXRlZ3k7IH0gfSk7XG5jb25zdCByYWxfMSA9IHJlcXVpcmUoXCIuL3JhbFwiKTtcbmV4cG9ydHMuUkFMID0gcmFsXzEuZGVmYXVsdDtcbiIsICJcInVzZSBzdHJpY3RcIjtcbi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmNvbnN0IGFwaV8xID0gcmVxdWlyZShcIi4uL2NvbW1vbi9hcGlcIik7XG5jbGFzcyBNZXNzYWdlQnVmZmVyIGV4dGVuZHMgYXBpXzEuQWJzdHJhY3RNZXNzYWdlQnVmZmVyIHtcbiAgICBjb25zdHJ1Y3RvcihlbmNvZGluZyA9ICd1dGYtOCcpIHtcbiAgICAgICAgc3VwZXIoZW5jb2RpbmcpO1xuICAgICAgICB0aGlzLmFzY2lpRGVjb2RlciA9IG5ldyBUZXh0RGVjb2RlcignYXNjaWknKTtcbiAgICB9XG4gICAgZW1wdHlCdWZmZXIoKSB7XG4gICAgICAgIHJldHVybiBNZXNzYWdlQnVmZmVyLmVtcHR5QnVmZmVyO1xuICAgIH1cbiAgICBmcm9tU3RyaW5nKHZhbHVlLCBfZW5jb2RpbmcpIHtcbiAgICAgICAgcmV0dXJuIChuZXcgVGV4dEVuY29kZXIoKSkuZW5jb2RlKHZhbHVlKTtcbiAgICB9XG4gICAgdG9TdHJpbmcodmFsdWUsIGVuY29kaW5nKSB7XG4gICAgICAgIGlmIChlbmNvZGluZyA9PT0gJ2FzY2lpJykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYXNjaWlEZWNvZGVyLmRlY29kZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gKG5ldyBUZXh0RGVjb2RlcihlbmNvZGluZykpLmRlY29kZSh2YWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYXNOYXRpdmUoYnVmZmVyLCBsZW5ndGgpIHtcbiAgICAgICAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gYnVmZmVyO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGJ1ZmZlci5zbGljZSgwLCBsZW5ndGgpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGFsbG9jTmF0aXZlKGxlbmd0aCkge1xuICAgICAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKTtcbiAgICB9XG59XG5NZXNzYWdlQnVmZmVyLmVtcHR5QnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoMCk7XG5jbGFzcyBSZWFkYWJsZVN0cmVhbVdyYXBwZXIge1xuICAgIGNvbnN0cnVjdG9yKHNvY2tldCkge1xuICAgICAgICB0aGlzLnNvY2tldCA9IHNvY2tldDtcbiAgICAgICAgdGhpcy5fb25EYXRhID0gbmV3IGFwaV8xLkVtaXR0ZXIoKTtcbiAgICAgICAgdGhpcy5fbWVzc2FnZUxpc3RlbmVyID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBibG9iID0gZXZlbnQuZGF0YTtcbiAgICAgICAgICAgIGJsb2IuYXJyYXlCdWZmZXIoKS50aGVuKChidWZmZXIpID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLl9vbkRhdGEuZmlyZShuZXcgVWludDhBcnJheShidWZmZXIpKTtcbiAgICAgICAgICAgIH0sICgpID0+IHtcbiAgICAgICAgICAgICAgICAoMCwgYXBpXzEuUkFMKSgpLmNvbnNvbGUuZXJyb3IoYENvbnZlcnRpbmcgYmxvYiB0byBhcnJheSBidWZmZXIgZmFpbGVkLmApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCB0aGlzLl9tZXNzYWdlTGlzdGVuZXIpO1xuICAgIH1cbiAgICBvbkNsb3NlKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2Nsb3NlJywgbGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gYXBpXzEuRGlzcG9zYWJsZS5jcmVhdGUoKCkgPT4gdGhpcy5zb2NrZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignY2xvc2UnLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkVycm9yKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2Vycm9yJywgbGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gYXBpXzEuRGlzcG9zYWJsZS5jcmVhdGUoKCkgPT4gdGhpcy5zb2NrZXQucmVtb3ZlRXZlbnRMaXN0ZW5lcignZXJyb3InLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkVuZChsaXN0ZW5lcikge1xuICAgICAgICB0aGlzLnNvY2tldC5hZGRFdmVudExpc3RlbmVyKCdlbmQnLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdlbmQnLCBsaXN0ZW5lcikpO1xuICAgIH1cbiAgICBvbkRhdGEobGlzdGVuZXIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uRGF0YS5ldmVudChsaXN0ZW5lcik7XG4gICAgfVxufVxuY2xhc3MgV3JpdGFibGVTdHJlYW1XcmFwcGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihzb2NrZXQpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7XG4gICAgfVxuICAgIG9uQ2xvc2UobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignY2xvc2UnLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbG9zZScsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIG9uRXJyb3IobGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCBsaXN0ZW5lcik7XG4gICAgICAgIHJldHVybiBhcGlfMS5EaXNwb3NhYmxlLmNyZWF0ZSgoKSA9PiB0aGlzLnNvY2tldC5yZW1vdmVFdmVudExpc3RlbmVyKCdlcnJvcicsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIG9uRW5kKGxpc3RlbmVyKSB7XG4gICAgICAgIHRoaXMuc29ja2V0LmFkZEV2ZW50TGlzdGVuZXIoJ2VuZCcsIGxpc3RlbmVyKTtcbiAgICAgICAgcmV0dXJuIGFwaV8xLkRpc3Bvc2FibGUuY3JlYXRlKCgpID0+IHRoaXMuc29ja2V0LnJlbW92ZUV2ZW50TGlzdGVuZXIoJ2VuZCcsIGxpc3RlbmVyKSk7XG4gICAgfVxuICAgIHdyaXRlKGRhdGEsIGVuY29kaW5nKSB7XG4gICAgICAgIGlmICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkICYmIGVuY29kaW5nICE9PSAndXRmLTgnKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbiBhIEJyb3dzZXIgZW52aXJvbm1lbnRzIG9ubHkgdXRmLTggdGV4dCBlbmNvZGluZyBpcyBzdXBwb3J0ZWQuIEJ1dCBnb3QgZW5jb2Rpbmc6ICR7ZW5jb2Rpbmd9YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnNvY2tldC5zZW5kKGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zb2NrZXQuc2VuZChkYXRhKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICAgICAgdGhpcy5zb2NrZXQuY2xvc2UoKTtcbiAgICB9XG59XG5jb25zdCBfdGV4dEVuY29kZXIgPSBuZXcgVGV4dEVuY29kZXIoKTtcbmNvbnN0IF9yaWwgPSBPYmplY3QuZnJlZXplKHtcbiAgICBtZXNzYWdlQnVmZmVyOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgY3JlYXRlOiAoZW5jb2RpbmcpID0+IG5ldyBNZXNzYWdlQnVmZmVyKGVuY29kaW5nKVxuICAgIH0pLFxuICAgIGFwcGxpY2F0aW9uSnNvbjogT2JqZWN0LmZyZWV6ZSh7XG4gICAgICAgIGVuY29kZXI6IE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgbmFtZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgZW5jb2RlOiAobXNnLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuY2hhcnNldCAhPT0gJ3V0Zi04Jykge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYEluIGEgQnJvd3NlciBlbnZpcm9ubWVudHMgb25seSB1dGYtOCB0ZXh0IGVuY29kaW5nIGlzIHN1cHBvcnRlZC4gQnV0IGdvdCBlbmNvZGluZzogJHtvcHRpb25zLmNoYXJzZXR9YCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoX3RleHRFbmNvZGVyLmVuY29kZShKU09OLnN0cmluZ2lmeShtc2csIHVuZGVmaW5lZCwgMCkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSksXG4gICAgICAgIGRlY29kZXI6IE9iamVjdC5mcmVlemUoe1xuICAgICAgICAgICAgbmFtZTogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICAgZGVjb2RlOiAoYnVmZmVyLCBvcHRpb25zKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCEoYnVmZmVyIGluc3RhbmNlb2YgVWludDhBcnJheSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBJbiBhIEJyb3dzZXIgZW52aXJvbm1lbnRzIG9ubHkgVWludDhBcnJheXMgYXJlIHN1cHBvcnRlZC5gKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShKU09OLnBhcnNlKG5ldyBUZXh0RGVjb2RlcihvcHRpb25zLmNoYXJzZXQpLmRlY29kZShidWZmZXIpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgfSksXG4gICAgc3RyZWFtOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgYXNSZWFkYWJsZVN0cmVhbTogKHNvY2tldCkgPT4gbmV3IFJlYWRhYmxlU3RyZWFtV3JhcHBlcihzb2NrZXQpLFxuICAgICAgICBhc1dyaXRhYmxlU3RyZWFtOiAoc29ja2V0KSA9PiBuZXcgV3JpdGFibGVTdHJlYW1XcmFwcGVyKHNvY2tldClcbiAgICB9KSxcbiAgICBjb25zb2xlOiBjb25zb2xlLFxuICAgIHRpbWVyOiBPYmplY3QuZnJlZXplKHtcbiAgICAgICAgc2V0VGltZW91dChjYWxsYmFjaywgbXMsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHNldFRpbWVvdXQoY2FsbGJhY2ssIG1zLCAuLi5hcmdzKTtcbiAgICAgICAgICAgIHJldHVybiB7IGRpc3Bvc2U6ICgpID0+IGNsZWFyVGltZW91dChoYW5kbGUpIH07XG4gICAgICAgIH0sXG4gICAgICAgIHNldEltbWVkaWF0ZShjYWxsYmFjaywgLi4uYXJncykge1xuICAgICAgICAgICAgY29uc3QgaGFuZGxlID0gc2V0VGltZW91dChjYWxsYmFjaywgMCwgLi4uYXJncyk7XG4gICAgICAgICAgICByZXR1cm4geyBkaXNwb3NlOiAoKSA9PiBjbGVhclRpbWVvdXQoaGFuZGxlKSB9O1xuICAgICAgICB9LFxuICAgICAgICBzZXRJbnRlcnZhbChjYWxsYmFjaywgbXMsIC4uLmFyZ3MpIHtcbiAgICAgICAgICAgIGNvbnN0IGhhbmRsZSA9IHNldEludGVydmFsKGNhbGxiYWNrLCBtcywgLi4uYXJncyk7XG4gICAgICAgICAgICByZXR1cm4geyBkaXNwb3NlOiAoKSA9PiBjbGVhckludGVydmFsKGhhbmRsZSkgfTtcbiAgICAgICAgfSxcbiAgICB9KVxufSk7XG5mdW5jdGlvbiBSSUwoKSB7XG4gICAgcmV0dXJuIF9yaWw7XG59XG4oZnVuY3Rpb24gKFJJTCkge1xuICAgIGZ1bmN0aW9uIGluc3RhbGwoKSB7XG4gICAgICAgIGFwaV8xLlJBTC5pbnN0YWxsKF9yaWwpO1xuICAgIH1cbiAgICBSSUwuaW5zdGFsbCA9IGluc3RhbGw7XG59KShSSUwgfHwgKFJJTCA9IHt9KSk7XG5leHBvcnRzLmRlZmF1bHQgPSBSSUw7XG4iLCAiXCJ1c2Ugc3RyaWN0XCI7XG4vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMaWNlbnNlLnR4dCBpbiB0aGUgcHJvamVjdCByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG52YXIgX19jcmVhdGVCaW5kaW5nID0gKHRoaXMgJiYgdGhpcy5fX2NyZWF0ZUJpbmRpbmcpIHx8IChPYmplY3QuY3JlYXRlID8gKGZ1bmN0aW9uKG8sIG0sIGssIGsyKSB7XG4gICAgaWYgKGsyID09PSB1bmRlZmluZWQpIGsyID0gaztcbiAgICB2YXIgZGVzYyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IobSwgayk7XG4gICAgaWYgKCFkZXNjIHx8IChcImdldFwiIGluIGRlc2MgPyAhbS5fX2VzTW9kdWxlIDogZGVzYy53cml0YWJsZSB8fCBkZXNjLmNvbmZpZ3VyYWJsZSkpIHtcbiAgICAgIGRlc2MgPSB7IGVudW1lcmFibGU6IHRydWUsIGdldDogZnVuY3Rpb24oKSB7IHJldHVybiBtW2tdOyB9IH07XG4gICAgfVxuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShvLCBrMiwgZGVzYyk7XG59KSA6IChmdW5jdGlvbihvLCBtLCBrLCBrMikge1xuICAgIGlmIChrMiA9PT0gdW5kZWZpbmVkKSBrMiA9IGs7XG4gICAgb1trMl0gPSBtW2tdO1xufSkpO1xudmFyIF9fZXhwb3J0U3RhciA9ICh0aGlzICYmIHRoaXMuX19leHBvcnRTdGFyKSB8fCBmdW5jdGlvbihtLCBleHBvcnRzKSB7XG4gICAgZm9yICh2YXIgcCBpbiBtKSBpZiAocCAhPT0gXCJkZWZhdWx0XCIgJiYgIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChleHBvcnRzLCBwKSkgX19jcmVhdGVCaW5kaW5nKGV4cG9ydHMsIG0sIHApO1xufTtcbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBcIl9fZXNNb2R1bGVcIiwgeyB2YWx1ZTogdHJ1ZSB9KTtcbmV4cG9ydHMuY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24gPSBleHBvcnRzLkJyb3dzZXJNZXNzYWdlV3JpdGVyID0gZXhwb3J0cy5Ccm93c2VyTWVzc2FnZVJlYWRlciA9IHZvaWQgMDtcbmNvbnN0IHJpbF8xID0gcmVxdWlyZShcIi4vcmlsXCIpO1xuLy8gSW5zdGFsbCB0aGUgYnJvd3NlciBydW50aW1lIGFic3RyYWN0LlxucmlsXzEuZGVmYXVsdC5pbnN0YWxsKCk7XG5jb25zdCBhcGlfMSA9IHJlcXVpcmUoXCIuLi9jb21tb24vYXBpXCIpO1xuX19leHBvcnRTdGFyKHJlcXVpcmUoXCIuLi9jb21tb24vYXBpXCIpLCBleHBvcnRzKTtcbmNsYXNzIEJyb3dzZXJNZXNzYWdlUmVhZGVyIGV4dGVuZHMgYXBpXzEuQWJzdHJhY3RNZXNzYWdlUmVhZGVyIHtcbiAgICBjb25zdHJ1Y3Rvcihwb3J0KSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMuX29uRGF0YSA9IG5ldyBhcGlfMS5FbWl0dGVyKCk7XG4gICAgICAgIHRoaXMuX21lc3NhZ2VMaXN0ZW5lciA9IChldmVudCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5fb25EYXRhLmZpcmUoZXZlbnQuZGF0YSk7XG4gICAgICAgIH07XG4gICAgICAgIHBvcnQuYWRkRXZlbnRMaXN0ZW5lcignZXJyb3InLCAoZXZlbnQpID0+IHRoaXMuZmlyZUVycm9yKGV2ZW50KSk7XG4gICAgICAgIHBvcnQub25tZXNzYWdlID0gdGhpcy5fbWVzc2FnZUxpc3RlbmVyO1xuICAgIH1cbiAgICBsaXN0ZW4oY2FsbGJhY2spIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX29uRGF0YS5ldmVudChjYWxsYmFjayk7XG4gICAgfVxufVxuZXhwb3J0cy5Ccm93c2VyTWVzc2FnZVJlYWRlciA9IEJyb3dzZXJNZXNzYWdlUmVhZGVyO1xuY2xhc3MgQnJvd3Nlck1lc3NhZ2VXcml0ZXIgZXh0ZW5kcyBhcGlfMS5BYnN0cmFjdE1lc3NhZ2VXcml0ZXIge1xuICAgIGNvbnN0cnVjdG9yKHBvcnQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5wb3J0ID0gcG9ydDtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50ID0gMDtcbiAgICAgICAgcG9ydC5hZGRFdmVudExpc3RlbmVyKCdlcnJvcicsIChldmVudCkgPT4gdGhpcy5maXJlRXJyb3IoZXZlbnQpKTtcbiAgICB9XG4gICAgd3JpdGUobXNnKSB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnBvcnQucG9zdE1lc3NhZ2UobXNnKTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHRoaXMuaGFuZGxlRXJyb3IoZXJyb3IsIG1zZyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3IpO1xuICAgICAgICB9XG4gICAgfVxuICAgIGhhbmRsZUVycm9yKGVycm9yLCBtc2cpIHtcbiAgICAgICAgdGhpcy5lcnJvckNvdW50Kys7XG4gICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yLCBtc2csIHRoaXMuZXJyb3JDb3VudCk7XG4gICAgfVxuICAgIGVuZCgpIHtcbiAgICB9XG59XG5leHBvcnRzLkJyb3dzZXJNZXNzYWdlV3JpdGVyID0gQnJvd3Nlck1lc3NhZ2VXcml0ZXI7XG5mdW5jdGlvbiBjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbihyZWFkZXIsIHdyaXRlciwgbG9nZ2VyLCBvcHRpb25zKSB7XG4gICAgaWYgKGxvZ2dlciA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIGxvZ2dlciA9IGFwaV8xLk51bGxMb2dnZXI7XG4gICAgfVxuICAgIGlmIChhcGlfMS5Db25uZWN0aW9uU3RyYXRlZ3kuaXMob3B0aW9ucykpIHtcbiAgICAgICAgb3B0aW9ucyA9IHsgY29ubmVjdGlvblN0cmF0ZWd5OiBvcHRpb25zIH07XG4gICAgfVxuICAgIHJldHVybiAoMCwgYXBpXzEuY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24pKHJlYWRlciwgd3JpdGVyLCBsb2dnZXIsIG9wdGlvbnMpO1xufVxuZXhwb3J0cy5jcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiA9IGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uO1xuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExpY2Vuc2UudHh0IGluIHRoZSBwcm9qZWN0IHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL2Jyb3dzZXIvbWFpbicpOyIsICIvKlxuICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMjYgRWNsaXBzZSBEaXJpZ2libGUgY29udHJpYnV0b3JzXG4gKlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlXG4gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2Mi4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG4gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MjAuaHRtbFxuICpcbiAqIFNQRFgtRmlsZUNvcHlyaWdodFRleHQ6IEVjbGlwc2UgRGlyaWdpYmxlIGNvbnRyaWJ1dG9ycyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbi8qKlxuICogSmF2YSBMU1AgY2xpZW50IGJ1bmRsZS5cbiAqXG4gKiBVc2VzIHZzY29kZS13cy1qc29ucnBjIGZvciB0eXBlZCBKU09OLVJQQyBvdmVyIFdlYlNvY2tldCBhbmQgcmVnaXN0ZXJzIE1vbmFjb1xuICogcHJvdmlkZXJzIHRoYXQgZGVsZWdhdGUgdG8gSkRULkxTLiBFeHBvc2VkIGFzIGdsb2JhbCBKYXZhTHNwQ2xpZW50TGliIHNvIHRoYXRcbiAqIGVkaXRvci5qcyBjYW4gY2FsbCBKYXZhTHNwQ2xpZW50TGliLmNvbm5lY3QocmVzb3VyY2VQYXRoKS5cbiAqXG4gKiBPbmUgSkRULkxTIHByb2Nlc3MgY292ZXJzIHRoZSBlbnRpcmUgd29ya3NwYWNlLCBzbyBhIHNpbmdsZSBXZWJTb2NrZXQgY29ubmVjdGlvblxuICogaXMgc2hhcmVkIGFjcm9zcyBhbGwgSmF2YSBmaWxlcyBvcGVuIGluIHRoZSBzYW1lIGJyb3dzZXIgcGFnZS4gVGhlIGNvbm5lY3Rpb24gaXNcbiAqIGVzdGFibGlzaGVkIG9uIHRoZSBmaXJzdCBjb25uZWN0KCkgY2FsbCBhbmQgcmV1c2VkIGZvciBhbGwgc3Vic2VxdWVudCBjYWxscy5cbiAqXG4gKiBlZGl0b3IuanMgc2V0cyB3aW5kb3cubW9uYWNvIGJlZm9yZSBjYWxsaW5nIGNvbm5lY3QoKSwgc28gdGhlIG1vbmFjby1zaGltJ3MgbGF6eVxuICogUHJveGllcyByZXNvbHZlIGNvcnJlY3RseSBhdCBjYWxsIHRpbWUuXG4gKi9cblxuaW1wb3J0IHsgY3JlYXRlTWVzc2FnZUNvbm5lY3Rpb24sIE1lc3NhZ2VDb25uZWN0aW9uIH0gZnJvbSAndnNjb2RlLWpzb25ycGMvYnJvd3Nlcic7XG5pbXBvcnQgeyB0b1NvY2tldCwgV2ViU29ja2V0TWVzc2FnZVJlYWRlciwgV2ViU29ja2V0TWVzc2FnZVdyaXRlciB9IGZyb20gJ3ZzY29kZS13cy1qc29ucnBjJztcbmltcG9ydCAqIGFzIG1vbmFjbyBmcm9tICdtb25hY28tZWRpdG9yJztcbmltcG9ydCB7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLFxuICAgIERpYWdub3N0aWNTZXZlcml0eSxcbiAgICBJbnNlcnRUZXh0Rm9ybWF0LFxuICAgIE1hcmt1cENvbnRlbnQsXG4gICAgTWFya3VwS2luZCxcbiAgICB0eXBlIENvZGVBY3Rpb24sXG4gICAgdHlwZSBDb21tYW5kLFxuICAgIHR5cGUgQ29tcGxldGlvbkl0ZW0sXG4gICAgdHlwZSBDb21wbGV0aW9uTGlzdCxcbiAgICB0eXBlIERpYWdub3N0aWMsXG4gICAgdHlwZSBIb3ZlcixcbiAgICB0eXBlIExvY2F0aW9uLFxuICAgIHR5cGUgUGFyYW1ldGVySW5mb3JtYXRpb24sXG4gICAgdHlwZSBTaWduYXR1cmVIZWxwLFxuICAgIHR5cGUgU2lnbmF0dXJlSW5mb3JtYXRpb24sXG4gICAgdHlwZSBUZXh0RWRpdCxcbiAgICB0eXBlIFdvcmtzcGFjZUVkaXQsXG59IGZyb20gJ3ZzY29kZS1sYW5ndWFnZXNlcnZlci10eXBlcyc7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFNpbmdsZXRvbiBzdGF0ZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKiogU2hhcmVkIGNvbm5lY3Rpb24gXHUyMDE0IG9uZSBwZXIgYnJvd3NlciBwYWdlLCBjb3ZlcmluZyBhbGwgcHJvamVjdHMgaW4gdGhlIHdvcmtzcGFjZS4gKi9cbmxldCBfY29ubjogTWVzc2FnZUNvbm5lY3Rpb24gfCBudWxsID0gbnVsbDtcblxuLyoqXG4gKiBWaXJ0dWFsIHdvcmtzcGFjZSByb290IFVSSSwgZS5nLiB7QGNvZGUgZmlsZTovLy93b3Jrc3BhY2Uvd29ya3NwYWNlL30uXG4gKiBTZXQgb25jZSBvbiBmaXJzdCBjb25uZWN0KCk7IHVzZWQgdG8gc2NvcGUgTW9uYWNvIHByb3ZpZGVycyB0byB3b3Jrc3BhY2UgZmlsZXMuXG4gKi9cbmxldCBfd29ya3NwYWNlUm9vdCA9ICcnO1xuXG4vKiogVVJJcyBmb3Igd2hpY2ggdGV4dERvY3VtZW50L2RpZE9wZW4gaGFzIGFscmVhZHkgYmVlbiBzZW50LiAqL1xuY29uc3QgX29wZW5GaWxlczogU2V0PHN0cmluZz4gPSBuZXcgU2V0KCk7XG5cbi8qKiBQZW5kaW5nIGRlYm91bmNlZCBkaWRDaGFuZ2UgdGltZXJzIHBlciBmaWxlIFVSSSwgc28gYSBjaGFuZ2UgY2FuIGJlIGZsdXNoZWQgYmVmb3JlIGNvbXBsZXRpb24uICovXG5jb25zdCBfY2hhbmdlVGltZXJzOiBNYXA8c3RyaW5nLCBSZXR1cm5UeXBlPHR5cGVvZiBzZXRUaW1lb3V0Pj4gPSBuZXcgTWFwKCk7XG5cbi8qKlxuICogTGFzdCBkaWFnbm9zdGljcyBwdWJsaXNoZWQgcGVyIGZpbGUgVVJJLCBrZXB0IHZlcmJhdGltICh3aXRoIHRoZWlyIExTUCBjb2RlL2RhdGEpLiBDb2RlLWFjdGlvblxuICogcmVxdWVzdHMgbXVzdCBzZW5kIHRoZXNlIFx1MjAxNCBKRFQuTFMgbWF0Y2hlcyBxdWljay1maXhlcyBieSB0aGUgZGlhZ25vc3RpYydzIGNvZGUvZGF0YSwgd2hpY2ggTW9uYWNvJ3NcbiAqIElNYXJrZXJEYXRhIGNhbm5vdCByb3VuZC10cmlwLCBzbyByZWNvbnN0cnVjdGluZyBkaWFnbm9zdGljcyBmcm9tIG1hcmtlcnMgeWllbGRzIG5vIHF1aWNrLWZpeGVzLlxuICovXG5jb25zdCBfZGlhZ25vc3RpY3M6IE1hcDxzdHJpbmcsIERpYWdub3N0aWNbXT4gPSBuZXcgTWFwKCk7XG5cbmxldCBfcHJvdmlkZXJzUmVnaXN0ZXJlZCA9IGZhbHNlO1xuXG4vKiogU2VtYW50aWMtdG9rZW4gbGVnZW5kIHJlcG9ydGVkIGJ5IEpEVC5MUyBpbiB0aGUgaW5pdGlhbGl6ZSByZXN1bHQ7IG5lZWRlZCB0byBkZWNvZGUgdG9rZW4gZGF0YS4gKi9cbmxldCBfc2VtYW50aWNUb2tlbnNMZWdlbmQ6IHsgdG9rZW5UeXBlczogc3RyaW5nW107IHRva2VuTW9kaWZpZXJzOiBzdHJpbmdbXSB9IHwgbnVsbCA9IG51bGw7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFB1YmxpYyBBUElcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuLyoqIENhbGxlZCBieSBlZGl0b3IuanMgd2hlbiBhIEphdmEgZmlsZSBpcyBvcGVuZWQuIFNhZmUgdG8gY2FsbCBtdWx0aXBsZSB0aW1lcy4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBjb25uZWN0KHJlc291cmNlUGF0aDogc3RyaW5nKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgcGFydHMgPSByZXNvdXJjZVBhdGgucmVwbGFjZSgvXlxcLy8sICcnKS5zcGxpdCgnLycpO1xuICAgIGNvbnN0IHdvcmtzcGFjZSA9IHBhcnRzWzBdO1xuICAgIGNvbnN0IHByb2plY3QgICA9IHBhcnRzWzFdO1xuICAgIGNvbnN0IGZpbGVVcmkgPSBgZmlsZTovLy93b3Jrc3BhY2UvJHt3b3Jrc3BhY2V9LyR7cHJvamVjdH0vJHtwYXJ0cy5zbGljZSgyKS5qb2luKCcvJyl9YDtcblxuICAgIGlmIChfY29ubikge1xuICAgICAgICAvLyBDb25uZWN0aW9uIGFscmVhZHkgZXN0YWJsaXNoZWQgXHUyMDE0IGp1c3Qgb3BlbiB0aGUgbmV3IGZpbGUuXG4gICAgICAgIG9wZW5GaWxlKGZpbGVVcmkpO1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgX3dvcmtzcGFjZVJvb3QgPSBgZmlsZTovLy93b3Jrc3BhY2UvJHt3b3Jrc3BhY2V9L2A7XG5cbiAgICBjb25zdCBwcm90byA9IGxvY2F0aW9uLnByb3RvY29sID09PSAnaHR0cHM6JyA/ICd3c3MnIDogJ3dzJztcbiAgICBjb25zdCB3c1VybCA9IGAke3Byb3RvfTovLyR7bG9jYXRpb24uaG9zdH0vd2Vic29ja2V0cy9pZGUvamF2YS1sc3BgXG4gICAgICAgICAgICAgICAgKyBgP3dvcmtzcGFjZT0ke2VuY29kZVVSSUNvbXBvbmVudCh3b3Jrc3BhY2UpfWA7XG5cbiAgICBjb25zdCB3cyA9IG5ldyBXZWJTb2NrZXQod3NVcmwpO1xuICAgIGF3YWl0IG5ldyBQcm9taXNlPHZvaWQ+KChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgd3Mub25vcGVuICA9ICgpID0+IHJlc29sdmUoKTtcbiAgICAgICAgd3Mub25lcnJvciA9ICgpID0+IHJlamVjdChuZXcgRXJyb3IoYFtqYXZhLWxzcF0gV2ViU29ja2V0IGNvbm5lY3QgZmFpbGVkOiAke3dzVXJsfWApKTtcbiAgICB9KTtcblxuICAgIGNvbnN0IHNvY2tldCA9IHRvU29ja2V0KHdzKTtcbiAgICBjb25zdCByZWFkZXIgPSBuZXcgV2ViU29ja2V0TWVzc2FnZVJlYWRlcihzb2NrZXQpO1xuICAgIGNvbnN0IHdyaXRlciA9IG5ldyBXZWJTb2NrZXRNZXNzYWdlV3JpdGVyKHNvY2tldCk7XG4gICAgX2Nvbm4gPSBjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbihyZWFkZXIsIHdyaXRlcik7XG5cbiAgICAvLyBEaWFnbm9zdGljcyBub3RpZmljYXRpb24gXHUyMTkyIE1vbmFjbyBtYXJrZXJzIChhcHBsaWVzIHRvIGFueSB3b3Jrc3BhY2UgZmlsZSlcbiAgICBfY29ubi5vbk5vdGlmaWNhdGlvbigndGV4dERvY3VtZW50L3B1Ymxpc2hEaWFnbm9zdGljcycsIChwYXJhbXM6IHsgdXJpOiBzdHJpbmc7IGRpYWdub3N0aWNzOiBEaWFnbm9zdGljW10gfSkgPT4ge1xuICAgICAgICBfZGlhZ25vc3RpY3Muc2V0KHBhcmFtcy51cmksIHBhcmFtcy5kaWFnbm9zdGljcyA/PyBbXSk7XG4gICAgICAgIGNvbnN0IG1vZGVsID0gbW9uYWNvLmVkaXRvci5nZXRNb2RlbHMoKS5maW5kKG0gPT4gbS51cmkudG9TdHJpbmcoKSA9PT0gcGFyYW1zLnVyaSk7XG4gICAgICAgIGlmICghbW9kZWwpIHJldHVybjtcbiAgICAgICAgbW9uYWNvLmVkaXRvci5zZXRNb2RlbE1hcmtlcnMobW9kZWwsICdqYXZhLWxzcCcsIHBhcmFtcy5kaWFnbm9zdGljcy5tYXAoZCA9PiAoe1xuICAgICAgICAgICAgc2V2ZXJpdHk6ICAgICAgICBsc3BTZXZlcml0eShkLnNldmVyaXR5KSxcbiAgICAgICAgICAgIG1lc3NhZ2U6ICAgICAgICAgZC5tZXNzYWdlLFxuICAgICAgICAgICAgc291cmNlOiAgICAgICAgICBkLnNvdXJjZSA/PyAnamF2YScsXG4gICAgICAgICAgICBzdGFydExpbmVOdW1iZXI6IGQucmFuZ2Uuc3RhcnQubGluZSArIDEsXG4gICAgICAgICAgICBzdGFydENvbHVtbjogICAgIGQucmFuZ2Uuc3RhcnQuY2hhcmFjdGVyICsgMSxcbiAgICAgICAgICAgIGVuZExpbmVOdW1iZXI6ICAgZC5yYW5nZS5lbmQubGluZSArIDEsXG4gICAgICAgICAgICBlbmRDb2x1bW46ICAgICAgIGQucmFuZ2UuZW5kLmNoYXJhY3RlciArIDEsXG4gICAgICAgIH0pKSk7XG4gICAgfSk7XG5cbiAgICAvLyBTZXJ2ZXIgLT4gY2xpZW50IHJlcXVlc3RzIHRoYXQgZHJpdmUgcmVmYWN0b3IgLyBnZW5lcmF0ZSByZXN1bHRzIGFuZCBkeW5hbWljIHJlZ2lzdHJhdGlvbi5cbiAgICBfY29ubi5vblJlcXVlc3QoJ3dvcmtzcGFjZS9hcHBseUVkaXQnLCAocGFyYW1zOiB7IGVkaXQ6IFdvcmtzcGFjZUVkaXQgfSkgPT4ge1xuICAgICAgICBhcHBseVdvcmtzcGFjZUVkaXQocGFyYW1zLmVkaXQpO1xuICAgICAgICByZXR1cm4geyBhcHBsaWVkOiB0cnVlIH07XG4gICAgfSk7XG4gICAgX2Nvbm4ub25SZXF1ZXN0KCd3b3Jrc3BhY2UvY29uZmlndXJhdGlvbicsIChwYXJhbXM6IHsgaXRlbXM6IEFycmF5PHsgc2VjdGlvbj86IHN0cmluZyB9PiB9KSA9PlxuICAgICAgICAocGFyYW1zLml0ZW1zID8/IFtdKS5tYXAoKCkgPT4gamR0bHNTZXR0aW5ncygpLmphdmEpKTtcbiAgICBfY29ubi5vblJlcXVlc3QoJ2NsaWVudC9yZWdpc3RlckNhcGFiaWxpdHknLCAoKSA9PiBudWxsKTtcbiAgICBfY29ubi5vblJlcXVlc3QoJ2NsaWVudC91bnJlZ2lzdGVyQ2FwYWJpbGl0eScsICgpID0+IG51bGwpO1xuICAgIF9jb25uLm9uUmVxdWVzdCgnd2luZG93L3Nob3dNZXNzYWdlUmVxdWVzdCcsICgpID0+IG51bGwpO1xuICAgIF9jb25uLm9uUmVxdWVzdCgnd2luZG93L3dvcmtEb25lUHJvZ3Jlc3MvY3JlYXRlJywgKCkgPT4gbnVsbCk7XG4gICAgX2Nvbm4ub25Ob3RpZmljYXRpb24oJ3dpbmRvdy9sb2dNZXNzYWdlJywgKHA6IHsgbWVzc2FnZTogc3RyaW5nIH0pID0+IGNvbnNvbGUuZGVidWcoJ1tqYXZhLWxzcF0nLCBwPy5tZXNzYWdlKSk7XG4gICAgX2Nvbm4ub25Ob3RpZmljYXRpb24oJ3dpbmRvdy9zaG93TWVzc2FnZScsIChwOiB7IG1lc3NhZ2U6IHN0cmluZyB9KSA9PiBjb25zb2xlLmluZm8oJ1tqYXZhLWxzcF0nLCBwPy5tZXNzYWdlKSk7XG4gICAgLy8gSkRULkxTIGxhbmd1YWdlLXN0YXR1cyAvIHByb2dyZXNzIG5vdGlmaWNhdGlvbnMgXHUyMDE0IGFja25vd2xlZGdlZCBzaWxlbnRseS5cbiAgICBfY29ubi5vbk5vdGlmaWNhdGlvbignbGFuZ3VhZ2Uvc3RhdHVzJywgKCkgPT4geyAvKiBpbmRleGluZy9yZWFkeSBzdGF0dXMsIGlnbm9yZWQgKi8gfSk7XG4gICAgX2Nvbm4ub25Ob3RpZmljYXRpb24oJ2xhbmd1YWdlL3Byb2dyZXNzUmVwb3J0JywgKCkgPT4geyAvKiBidWlsZCBwcm9ncmVzcywgaWdub3JlZCAqLyB9KTtcblxuICAgIF9jb25uLmxpc3RlbigpO1xuXG4gICAgY29uc3Qgcm9vdFVyaSA9IF93b3Jrc3BhY2VSb290O1xuICAgIGNvbnN0IGluaXRSZXN1bHQ6IGFueSA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCdpbml0aWFsaXplJywge1xuICAgICAgICBwcm9jZXNzSWQ6IG51bGwsXG4gICAgICAgIHJvb3RVcmksXG4gICAgICAgIGluaXRpYWxpemF0aW9uT3B0aW9uczoge1xuICAgICAgICAgICAgc2V0dGluZ3M6IGpkdGxzU2V0dGluZ3MoKSxcbiAgICAgICAgICAgIGV4dGVuZGVkQ2xpZW50Q2FwYWJpbGl0aWVzOiB7XG4gICAgICAgICAgICAgICAgcHJvZ3Jlc3NSZXBvcnRQcm92aWRlcjogICAgICAgICAgICBmYWxzZSxcbiAgICAgICAgICAgICAgICBjbGFzc0ZpbGVDb250ZW50c1N1cHBvcnQ6ICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgcmVzb2x2ZUFkZGl0aW9uYWxUZXh0RWRpdHNTdXBwb3J0OiB0cnVlLFxuICAgICAgICAgICAgICAgIC8vIERvIE5PVCBhZHZlcnRpc2UgdGhlICpQcm9tcHRTdXBwb3J0IGZsYWdzOiB0aG9zZSBtYWtlIEpEVC5MUyByZXR1cm4gc291cmNlIGFjdGlvbnNcbiAgICAgICAgICAgICAgICAvLyAoZ2VuZXJhdGUgdG9TdHJpbmcvY29uc3RydWN0b3JzL2FjY2Vzc29ycywgb3ZlcnJpZGUvaW1wbGVtZW50LCBvcmdhbml6ZSBpbXBvcnRzKSBhc1xuICAgICAgICAgICAgICAgIC8vIGNsaWVudC1zaWRlIFwiKlByb21wdFwiIGNvbW1hbmRzIHRoZSB2c2NvZGUtamF2YSBleHRlbnNpb24gaW1wbGVtZW50cyBidXQgd2UgZG9uJ3QuXG4gICAgICAgICAgICAgICAgLy8gV2l0aCB0aGVtIG9mZiwgSkRULkxTIHJldHVybnMgdGhlIHNhbWUgYWN0aW9ucyBhcyByZXNvbHZhYmxlIFdvcmtzcGFjZUVkaXRzIG9wZXJhdGluZ1xuICAgICAgICAgICAgICAgIC8vIG9uIGFsbCBtZW1iZXJzLCB3aGljaCBhcHBseUNvZGVBY3Rpb24gcmVzb2x2ZXMgYW5kIGFwcGxpZXMgZGlyZWN0bHkuXG4gICAgICAgICAgICAgICAgaW5mZXJTZWxlY3Rpb25TdXBwb3J0OiAgICAgICAgICAgICBbJ2V4dHJhY3RNZXRob2QnLCAnZXh0cmFjdFZhcmlhYmxlJywgJ2V4dHJhY3RGaWVsZCddLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgfSxcbiAgICAgICAgd29ya3NwYWNlRm9sZGVyczogW3sgdXJpOiByb290VXJpLCBuYW1lOiB3b3Jrc3BhY2UgfV0sXG4gICAgICAgIGNhcGFiaWxpdGllczoge1xuICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7XG4gICAgICAgICAgICAgICAgc3luY2hyb25pemF0aW9uOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUsIHdpbGxTYXZlOiBmYWxzZSwgZGlkU2F2ZTogdHJ1ZSwgd2lsbFNhdmVXYWl0VW50aWw6IGZhbHNlIH0sXG4gICAgICAgICAgICAgICAgY29tcGxldGlvbjoge1xuICAgICAgICAgICAgICAgICAgICBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBjb21wbGV0aW9uSXRlbToge1xuICAgICAgICAgICAgICAgICAgICAgICAgc25pcHBldFN1cHBvcnQ6ICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZG9jdW1lbnRhdGlvbkZvcm1hdDogICBbJ21hcmtkb3duJywgJ3BsYWludGV4dCddLFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVwcmVjYXRlZFN1cHBvcnQ6ICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29tbWl0Q2hhcmFjdGVyc1N1cHBvcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlU3VwcG9ydDogICAgICAgIHsgcHJvcGVydGllczogWydkb2N1bWVudGF0aW9uJywgJ2RldGFpbCcsICdhZGRpdGlvbmFsVGV4dEVkaXRzJ10gfSxcbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dFN1cHBvcnQ6IHRydWUsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBob3ZlcjogICAgICAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLCBjb250ZW50Rm9ybWF0OiBbJ21hcmtkb3duJywgJ3BsYWludGV4dCddIH0sXG4gICAgICAgICAgICAgICAgc2lnbmF0dXJlSGVscDogIHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSwgc2lnbmF0dXJlSW5mb3JtYXRpb246IHsgZG9jdW1lbnRhdGlvbkZvcm1hdDogWydtYXJrZG93bicsICdwbGFpbnRleHQnXSwgcGFyYW1ldGVySW5mb3JtYXRpb246IHsgbGFiZWxPZmZzZXRTdXBwb3J0OiB0cnVlIH0gfSB9LFxuICAgICAgICAgICAgICAgIGRlZmluaXRpb246ICAgICB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICByZWZlcmVuY2VzOiAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgaW1wbGVtZW50YXRpb246IHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIHR5cGVEZWZpbml0aW9uOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICBkb2N1bWVudEhpZ2hsaWdodDogeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgZG9jdW1lbnRTeW1ib2w6IHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSwgaGllcmFyY2hpY2FsRG9jdW1lbnRTeW1ib2xTdXBwb3J0OiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgZm9sZGluZ1JhbmdlOiAgIHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSwgbGluZUZvbGRpbmdPbmx5OiBmYWxzZSB9LFxuICAgICAgICAgICAgICAgIHNlbGVjdGlvblJhbmdlOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICBjb2RlTGVuczogICAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgaW5sYXlIaW50OiAgICAgIHsgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSwgcmVzb2x2ZVN1cHBvcnQ6IHsgcHJvcGVydGllczogWydsYWJlbCddIH0gfSxcbiAgICAgICAgICAgICAgICBzZW1hbnRpY1Rva2Vuczoge1xuICAgICAgICAgICAgICAgICAgICBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0czogICAgICAgIHsgcmFuZ2U6IGZhbHNlLCBmdWxsOiB7IGRlbHRhOiBmYWxzZSB9IH0sXG4gICAgICAgICAgICAgICAgICAgIHRva2VuVHlwZXM6ICAgICAgWyduYW1lc3BhY2UnLCAndHlwZScsICdjbGFzcycsICdlbnVtJywgJ2ludGVyZmFjZScsICdzdHJ1Y3QnLCAndHlwZVBhcmFtZXRlcicsXG4gICAgICAgICAgICAgICAgICAgICAgICAncGFyYW1ldGVyJywgJ3ZhcmlhYmxlJywgJ3Byb3BlcnR5JywgJ2VudW1NZW1iZXInLCAnZXZlbnQnLCAnZnVuY3Rpb24nLCAnbWV0aG9kJywgJ21hY3JvJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdrZXl3b3JkJywgJ21vZGlmaWVyJywgJ2NvbW1lbnQnLCAnc3RyaW5nJywgJ251bWJlcicsICdyZWdleHAnLCAnb3BlcmF0b3InLCAnZGVjb3JhdG9yJ10sXG4gICAgICAgICAgICAgICAgICAgIHRva2VuTW9kaWZpZXJzOiAgWydkZWNsYXJhdGlvbicsICdkZWZpbml0aW9uJywgJ3JlYWRvbmx5JywgJ3N0YXRpYycsICdkZXByZWNhdGVkJywgJ2Fic3RyYWN0JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICdhc3luYycsICdtb2RpZmljYXRpb24nLCAnZG9jdW1lbnRhdGlvbicsICdkZWZhdWx0TGlicmFyeSddLFxuICAgICAgICAgICAgICAgICAgICBmb3JtYXRzOiAgICAgICAgIFsncmVsYXRpdmUnXSxcbiAgICAgICAgICAgICAgICAgICAgb3ZlcmxhcHBpbmdUb2tlblN1cHBvcnQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgICAgICBtdWx0aWxpbmVUb2tlblN1cHBvcnQ6ICAgZmFsc2UsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICBmb3JtYXR0aW5nOiAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgcmFuZ2VGb3JtYXR0aW5nOiB7IGR5bmFtaWNSZWdpc3RyYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgICAgICByZW5hbWU6ICAgICAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlLCBwcmVwYXJlU3VwcG9ydDogdHJ1ZSB9LFxuICAgICAgICAgICAgICAgIGNvZGVBY3Rpb246IHtcbiAgICAgICAgICAgICAgICAgICAgZHluYW1pY1JlZ2lzdHJhdGlvbjogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgY29kZUFjdGlvbkxpdGVyYWxTdXBwb3J0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2RlQWN0aW9uS2luZDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlU2V0OiBbJ3F1aWNrZml4JywgJ3JlZmFjdG9yJywgJ3JlZmFjdG9yLmV4dHJhY3QnLCAncmVmYWN0b3IuaW5saW5lJyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3JlZmFjdG9yLnJld3JpdGUnLCAnc291cmNlJywgJ3NvdXJjZS5vcmdhbml6ZUltcG9ydHMnXSxcbiAgICAgICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgICAgIGlzUHJlZmVycmVkU3VwcG9ydDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgZGF0YVN1cHBvcnQ6ICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgICAgICByZXNvbHZlU3VwcG9ydDogICAgIHsgcHJvcGVydGllczogWydlZGl0J10gfSxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHB1Ymxpc2hEaWFnbm9zdGljczogeyByZWxhdGVkSW5mb3JtYXRpb246IHRydWUgfSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB3b3Jrc3BhY2U6IHtcbiAgICAgICAgICAgICAgICBhcHBseUVkaXQ6ICAgICAgICAgICAgICB0cnVlLFxuICAgICAgICAgICAgICAgIGNvbmZpZ3VyYXRpb246ICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICAgZXhlY3V0ZUNvbW1hbmQ6ICAgICAgICAgeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgZGlkQ2hhbmdlQ29uZmlndXJhdGlvbjogeyBkeW5hbWljUmVnaXN0cmF0aW9uOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgd29ya3NwYWNlRWRpdDogICAgICAgICAgeyBkb2N1bWVudENoYW5nZXM6IHRydWUsIHJlc291cmNlT3BlcmF0aW9uczogWydjcmVhdGUnLCAncmVuYW1lJywgJ2RlbGV0ZSddIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgX3NlbWFudGljVG9rZW5zTGVnZW5kID0gaW5pdFJlc3VsdD8uY2FwYWJpbGl0aWVzPy5zZW1hbnRpY1Rva2Vuc1Byb3ZpZGVyPy5sZWdlbmQgPz8gbnVsbDtcblxuICAgIF9jb25uLnNlbmROb3RpZmljYXRpb24oJ2luaXRpYWxpemVkJywge30pO1xuICAgIF9jb25uLnNlbmROb3RpZmljYXRpb24oJ3dvcmtzcGFjZS9kaWRDaGFuZ2VDb25maWd1cmF0aW9uJywgeyBzZXR0aW5nczogamR0bHNTZXR0aW5ncygpIH0pO1xuXG4gICAgb3BlbkZpbGUoZmlsZVVyaSk7XG5cbiAgICBpZiAoIV9wcm92aWRlcnNSZWdpc3RlcmVkKSB7XG4gICAgICAgIF9wcm92aWRlcnNSZWdpc3RlcmVkID0gdHJ1ZTtcbiAgICAgICAgcmVnaXN0ZXJQcm92aWRlcnMoKTtcbiAgICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEZpbGUgbGlmZWN5Y2xlXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKlxuICogU2VuZHMgdGV4dERvY3VtZW50L2RpZE9wZW4gZm9yIHRoZSBnaXZlbiBVUkkgKGlmIG5vdCBhbHJlYWR5IHNlbnQpIGFuZCByZWdpc3RlcnMgYSBkZWJvdW5jZWRcbiAqIHRleHREb2N1bWVudC9kaWRDaGFuZ2UgbGlzdGVuZXIgb24gdGhlIGNvcnJlc3BvbmRpbmcgTW9uYWNvIG1vZGVsLlxuICovXG5mdW5jdGlvbiBvcGVuRmlsZShmaWxlVXJpOiBzdHJpbmcpOiB2b2lkIHtcbiAgICBpZiAoX29wZW5GaWxlcy5oYXMoZmlsZVVyaSkgfHwgIV9jb25uKSByZXR1cm47XG4gICAgX29wZW5GaWxlcy5hZGQoZmlsZVVyaSk7XG5cbiAgICBjb25zdCBtb2RlbCA9IG1vbmFjby5lZGl0b3IuZ2V0TW9kZWxzKCkuZmluZChtID0+IG0udXJpLnRvU3RyaW5nKCkgPT09IGZpbGVVcmkpO1xuICAgIF9jb25uLnNlbmROb3RpZmljYXRpb24oJ3RleHREb2N1bWVudC9kaWRPcGVuJywge1xuICAgICAgICB0ZXh0RG9jdW1lbnQ6IHtcbiAgICAgICAgICAgIHVyaTogICAgICAgIGZpbGVVcmksXG4gICAgICAgICAgICBsYW5ndWFnZUlkOiAnamF2YScsXG4gICAgICAgICAgICB2ZXJzaW9uOiAgICAxLFxuICAgICAgICAgICAgdGV4dDogICAgICAgbW9kZWw/LmdldFZhbHVlKCkgPz8gJycsXG4gICAgICAgIH0sXG4gICAgfSk7XG4gICAgLy8gVGVsbCBKRFQuTFMgdGhlIGZpbGUgZXhpc3RzIG9uIGRpc2sgc28gaXRzIHByb2plY3QgbW9kZWwgaW5jbHVkZXMgaXQgZXZlbiBiZWZvcmUgYSBidWlsZCBcdTIwMTQgdGhpc1xuICAgIC8vIG1ha2VzIGEganVzdC1jcmVhdGVkIHR5cGUgKGUuZy4gYSBuZXcgaW50ZXJmYWNlKSByZXNvbHZhYmxlL29mZmVyZWQgaW4gc2libGluZyBmaWxlcyBpbW1lZGlhdGVseS5cbiAgICBfY29ubi5zZW5kTm90aWZpY2F0aW9uKCd3b3Jrc3BhY2UvZGlkQ2hhbmdlV2F0Y2hlZEZpbGVzJywgeyBjaGFuZ2VzOiBbeyB1cmk6IGZpbGVVcmksIHR5cGU6IDEgLyogQ3JlYXRlZCAqLyB9XSB9KTtcblxuICAgIGlmIChtb2RlbCkge1xuICAgICAgICBtb2RlbC5vbkRpZENoYW5nZUNvbnRlbnQoKCkgPT4ge1xuICAgICAgICAgICAgY29uc3QgZXhpc3RpbmcgPSBfY2hhbmdlVGltZXJzLmdldChmaWxlVXJpKTtcbiAgICAgICAgICAgIGlmIChleGlzdGluZykgY2xlYXJUaW1lb3V0KGV4aXN0aW5nKTtcbiAgICAgICAgICAgIF9jaGFuZ2VUaW1lcnMuc2V0KGZpbGVVcmksIHNldFRpbWVvdXQoKCkgPT4gc2VuZERpZENoYW5nZShmaWxlVXJpKSwgNDAwKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbn1cblxuLyoqIFNlbmRzIHRoZSBjdXJyZW50IG1vZGVsIGNvbnRlbnQgYXMgYSBkaWRDaGFuZ2UgYW5kIGNsZWFycyBhbnkgcGVuZGluZyBkZWJvdW5jZSBmb3IgdGhlIGZpbGUuICovXG5mdW5jdGlvbiBzZW5kRGlkQ2hhbmdlKGZpbGVVcmk6IHN0cmluZyk6IHZvaWQge1xuICAgIF9jaGFuZ2VUaW1lcnMuZGVsZXRlKGZpbGVVcmkpO1xuICAgIGNvbnN0IG1vZGVsID0gbW9uYWNvLmVkaXRvci5nZXRNb2RlbChtb25hY28uVXJpLnBhcnNlKGZpbGVVcmkpKTtcbiAgICBpZiAoX2Nvbm4gJiYgbW9kZWwpIHtcbiAgICAgICAgX2Nvbm4uc2VuZE5vdGlmaWNhdGlvbigndGV4dERvY3VtZW50L2RpZENoYW5nZScsIHtcbiAgICAgICAgICAgIHRleHREb2N1bWVudDogICB7IHVyaTogZmlsZVVyaSwgdmVyc2lvbjogbW9kZWwuZ2V0VmVyc2lvbklkKCkgfSxcbiAgICAgICAgICAgIGNvbnRlbnRDaGFuZ2VzOiBbeyB0ZXh0OiBtb2RlbC5nZXRWYWx1ZSgpIH1dLFxuICAgICAgICB9KTtcbiAgICB9XG59XG5cbi8qKlxuICogRmx1c2hlcyBhIHBlbmRpbmcgZGVib3VuY2VkIGNoYW5nZSBpbW1lZGlhdGVseS4gQ2FsbGVkIGJlZm9yZSBhIGNvbXBsZXRpb24gcmVxdWVzdCBzbyBKRFQuTFMgc2VlcyB0aGVcbiAqIGp1c3QtdHlwZWQgdGV4dCBvbiB0aGUgZmlyc3QgQ3RybCtTcGFjZSwgaW5zdGVhZCBvZiBjb21wbGV0aW5nIGFnYWluc3Qgc3RhbGUgY29udGVudCAodGhlIGRlYm91bmNlXG4gKiBvdGhlcndpc2UgZGVsYXlzIHRoZSBjaGFuZ2UgYnkgdXAgdG8gNDAwbXMgXHUyMDE0IHRoZSBjYXVzZSBvZiBcImZpcnN0IEN0cmwrU3BhY2Ugc2hvd3Mgbm90aGluZ1wiKS5cbiAqL1xuZnVuY3Rpb24gZmx1c2hQZW5kaW5nQ2hhbmdlKGZpbGVVcmk6IHN0cmluZyk6IHZvaWQge1xuICAgIGlmIChfY2hhbmdlVGltZXJzLmhhcyhmaWxlVXJpKSkge1xuICAgICAgICBjbGVhclRpbWVvdXQoX2NoYW5nZVRpbWVycy5nZXQoZmlsZVVyaSkhKTtcbiAgICAgICAgc2VuZERpZENoYW5nZShmaWxlVXJpKTtcbiAgICB9XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIFdvcmtzcGFjZSBmaWxlIHByZWRpY2F0ZVxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG4vKipcbiAqIFJldHVybnMge0Bjb2RlIHRydWV9IHdoZW4gdGhlIGdpdmVuIG1vZGVsIFVSSSBiZWxvbmdzIHRvIHRoZSBjdXJyZW50bHkgY29ubmVjdGVkIHdvcmtzcGFjZS4gVXNlZFxuICogYnkgTW9uYWNvIHByb3ZpZGVycyB0byBza2lwIG5vbi1KYXZhLXdvcmtzcGFjZSBtb2RlbHMgd2l0aG91dCBhbiBleGFjdC1VUkkgY29tcGFyaXNvbi5cbiAqL1xuZnVuY3Rpb24gaXNXb3Jrc3BhY2VGaWxlKHVyaTogc3RyaW5nKTogYm9vbGVhbiB7XG4gICAgcmV0dXJuIF93b3Jrc3BhY2VSb290ICE9PSAnJyAmJiB1cmkuc3RhcnRzV2l0aChfd29ya3NwYWNlUm9vdCk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIE1vbmFjbyBwcm92aWRlciByZWdpc3RyYXRpb25cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gcmVnaXN0ZXJQcm92aWRlcnMoKTogdm9pZCB7XG5cbiAgICBtb25hY28uZWRpdG9yLnJlZ2lzdGVyQ29tbWFuZChBUFBMWV9BQ1RJT05fQ09NTUFORCwgKF9hY2Nlc3NvcjogdW5rbm93biwgYWN0aW9uOiBDb2RlQWN0aW9uIHwgQ29tbWFuZCkgPT4ge1xuICAgICAgICBhcHBseUNvZGVBY3Rpb24oYWN0aW9uKTtcbiAgICB9KTtcbiAgICBtb25hY28uZWRpdG9yLnJlZ2lzdGVyQ29tbWFuZChOT09QX0NPTU1BTkQsICgpID0+IHsgLyogZGlzcGxheS1vbmx5IENvZGVMZW5zICovIH0pO1xuXG4gICAgLy8gQ3Jvc3MtZmlsZSBuYXZpZ2F0aW9uOiB0aGlzIHNpbmdsZS1maWxlIGVkaXRvciBoYXMgbm8gbW9kZWwgZm9yIG90aGVyIHdvcmtzcGFjZSBmaWxlcywgc28gR28gdG9cbiAgICAvLyBEZWZpbml0aW9uIC8gRmluZCBSZWZlcmVuY2VzIHRvIGFub3RoZXIgZmlsZSB3b3VsZCBzaWxlbnRseSBkbyBub3RoaW5nLiBIYW5kIHRob3NlIG9mZiB0byB0aGUgSURFXG4gICAgLy8gdG8gb3BlbiB0aGUgdGFyZ2V0IGZpbGUgKGFuZCByZXZlYWwgdGhlIGxpbmUpLiBTYW1lLWZpbGUgdGFyZ2V0cyBmYWxsIHRocm91Z2ggdG8gTW9uYWNvLlxuICAgIG1vbmFjby5lZGl0b3IucmVnaXN0ZXJFZGl0b3JPcGVuZXIoe1xuICAgICAgICBvcGVuQ29kZUVkaXRvcjogKHNvdXJjZSwgcmVzb3VyY2UsIHNlbGVjdGlvbk9yUG9zaXRpb24pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHVyaSA9IHJlc291cmNlLnRvU3RyaW5nKCk7XG4gICAgICAgICAgICBpZiAoIWlzV29ya3NwYWNlRmlsZSh1cmkpIHx8ICF1cmkuc3RhcnRzV2l0aChWSVJUVUFMX0ZJTEVfUFJFRklYKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgY29uc3QgY3VycmVudE1vZGVsID0gc291cmNlLmdldE1vZGVsKCk7XG4gICAgICAgICAgICBpZiAoY3VycmVudE1vZGVsICYmIGN1cnJlbnRNb2RlbC51cmkudG9TdHJpbmcoKSA9PT0gdXJpKSByZXR1cm4gZmFsc2U7IC8vIHNhbWUgZmlsZSBcdTIwMTQgbGV0IE1vbmFjbyBqdW1wXG4gICAgICAgICAgICBjb25zdCBvcGVuZXIgPSAoZ2xvYmFsVGhpcyBhcyBhbnkpLmphdmFMc3BPcGVuRmlsZTtcbiAgICAgICAgICAgIGlmICh0eXBlb2Ygb3BlbmVyICE9PSAnZnVuY3Rpb24nKSByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICBjb25zdCBwb3MgPSBzZWxlY3Rpb25PclBvc2l0aW9uIGFzIHsgc3RhcnRMaW5lTnVtYmVyPzogbnVtYmVyOyBsaW5lTnVtYmVyPzogbnVtYmVyOyBzdGFydENvbHVtbj86IG51bWJlcjsgY29sdW1uPzogbnVtYmVyIH0gfCB1bmRlZmluZWQ7XG4gICAgICAgICAgICBjb25zdCBsaW5lID0gcG9zID8gKHBvcy5zdGFydExpbmVOdW1iZXIgPz8gcG9zLmxpbmVOdW1iZXIpIDogdW5kZWZpbmVkO1xuICAgICAgICAgICAgY29uc3QgY29sdW1uID0gcG9zID8gKHBvcy5zdGFydENvbHVtbiA/PyBwb3MuY29sdW1uKSA6IHVuZGVmaW5lZDtcbiAgICAgICAgICAgIG9wZW5lcih1cmkuc3Vic3RyaW5nKFZJUlRVQUxfRklMRV9QUkVGSVgubGVuZ3RoKSwgbGluZSwgY29sdW1uKTtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckNvbXBsZXRpb25JdGVtUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHRyaWdnZXJDaGFyYWN0ZXJzOiBbJy4nLCAnQCcsICc8J10sXG4gICAgICAgIHByb3ZpZGVDb21wbGV0aW9uSXRlbXM6IGFzeW5jIChtb2RlbCwgcG9zaXRpb24sIGNvbnRleHQpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgZmlsZVVyaSA9IG1vZGVsLnVyaS50b1N0cmluZygpO1xuICAgICAgICAgICAgLy8gTWFrZSBzdXJlIEpEVC5MUyBoYXMgdGhlIGp1c3QtdHlwZWQgdGV4dCBiZWZvcmUgY29tcGxldGluZyAoc2VlIGZsdXNoUGVuZGluZ0NoYW5nZSkuXG4gICAgICAgICAgICBmbHVzaFBlbmRpbmdDaGFuZ2UoZmlsZVVyaSk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IENvbXBsZXRpb25MaXN0IHwgQ29tcGxldGlvbkl0ZW1bXSB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L2NvbXBsZXRpb24nLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogZmlsZVVyaSB9LFxuICAgICAgICAgICAgICAgIHBvc2l0aW9uOiAgICAgeyBsaW5lOiBwb3NpdGlvbi5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwb3NpdGlvbi5jb2x1bW4gLSAxIH0sXG4gICAgICAgICAgICAgICAgLy8gTW9uYWNvIHRyaWdnZXIga2luZHMgYXJlIDAtYmFzZWQgKEludm9rZS9UcmlnZ2VyQ2hhcmFjdGVyL0ZvckluY29tcGxldGUpOyBMU1AgaXMgMS1iYXNlZC5cbiAgICAgICAgICAgICAgICBjb250ZXh0OiAgICAgIHsgdHJpZ2dlcktpbmQ6IChjb250ZXh0LnRyaWdnZXJLaW5kID8/IDApICsgMSwgdHJpZ2dlckNoYXJhY3RlcjogY29udGV4dC50cmlnZ2VyQ2hhcmFjdGVyIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGNvbnN0IGl0ZW1zID0gQXJyYXkuaXNBcnJheShyZXN1bHQpID8gcmVzdWx0IDogKHJlc3VsdD8uaXRlbXMgPz8gW10pO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBzdWdnZXN0aW9uczogaXRlbXMubWFwKGl0ZW0gPT4gbHNwQ29tcGxldGlvblRvTW9uYWNvKGl0ZW0sIG1vZGVsLCBwb3NpdGlvbikpLFxuICAgICAgICAgICAgICAgIC8vIEpEVC5MUyByZXR1cm5zIGEgdHJ1bmNhdGVkIGxpc3Qgb24gdGhlIGZpcnN0IGtleXN0cm9rZXM7IHByb3BhZ2F0aW5nIFwiaW5jb21wbGV0ZVwiIG1ha2VzXG4gICAgICAgICAgICAgICAgLy8gTW9uYWNvIHJlLXF1ZXJ5IGFzIHRoZSB1c2VyIHR5cGVzIGluc3RlYWQgb2YgY2FjaGluZyB0aGUgZmlyc3QgKG9mdGVuIGVtcHR5KSByZXN1bHQuXG4gICAgICAgICAgICAgICAgaW5jb21wbGV0ZTogIEFycmF5LmlzQXJyYXkocmVzdWx0KSA/IGZhbHNlIDogISFyZXN1bHQ/LmlzSW5jb21wbGV0ZSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgICAgIC8vIFJlc29sdmUgZG9jdW1lbnRhdGlvbiBhbmQsIGNydWNpYWxseSwgdGhlIGF1dG8taW1wb3J0IGFkZGl0aW9uYWxUZXh0RWRpdHMgd2hpY2ggSkRULkxTIG9ubHlcbiAgICAgICAgLy8gYXR0YWNoZXMgb24gcmVzb2x2ZSBcdTIwMTQgc2VsZWN0aW5nIGEgdHlwZSB0aGVuIGluc2VydHMgaXRzIGltcG9ydCBzdGF0ZW1lbnQuXG4gICAgICAgIHJlc29sdmVDb21wbGV0aW9uSXRlbTogYXN5bmMgKGl0ZW0pID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGxzcCA9IChpdGVtIGFzIE1vbmFjb0NvbXBsZXRpb25JdGVtKS5fbHNwO1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhbHNwKSByZXR1cm4gaXRlbTtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzb2x2ZWQ6IENvbXBsZXRpb25JdGVtID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ2NvbXBsZXRpb25JdGVtL3Jlc29sdmUnLCBsc3ApO1xuICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZC5kb2N1bWVudGF0aW9uKSB7XG4gICAgICAgICAgICAgICAgICAgIGl0ZW0uZG9jdW1lbnRhdGlvbiA9IHsgdmFsdWU6IG1hcmt1cFRvU3RyaW5nKHJlc29sdmVkLmRvY3VtZW50YXRpb24pLCBpc1RydXN0ZWQ6IGZhbHNlIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZC5kZXRhaWwpIGl0ZW0uZGV0YWlsID0gcmVzb2x2ZWQuZGV0YWlsO1xuICAgICAgICAgICAgICAgIGlmIChyZXNvbHZlZC5hZGRpdGlvbmFsVGV4dEVkaXRzPy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgaXRlbS5hZGRpdGlvbmFsVGV4dEVkaXRzID0gcmVzb2x2ZWQuYWRkaXRpb25hbFRleHRFZGl0cy5tYXAodGV4dEVkaXRUb01vbmFjbyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNvbnNvbGUuZGVidWcoJ1tqYXZhLWxzcF0gY29tcGxldGlvbiByZXNvbHZlIGZhaWxlZDonLCAoZSBhcyBFcnJvcik/Lm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGl0ZW07XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVySG92ZXJQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZUhvdmVyOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGZpbGVVcmkgPSBtb2RlbC51cmkudG9TdHJpbmcoKTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogSG92ZXIgfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9ob3ZlcicsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBmaWxlVXJpIH0sXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQ/LmNvbnRlbnRzKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGNvbnRlbnRzID0gQXJyYXkuaXNBcnJheShyZXN1bHQuY29udGVudHMpID8gcmVzdWx0LmNvbnRlbnRzIDogW3Jlc3VsdC5jb250ZW50c107XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGNvbnRlbnRzOiBjb250ZW50cy5tYXAoYyA9PiAoe1xuICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdHlwZW9mIGMgPT09ICdzdHJpbmcnID8gYyA6IChjIGFzIE1hcmt1cENvbnRlbnQpLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICBpc1RydXN0ZWQ6IGZhbHNlLFxuICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgICByYW5nZTogcmVzdWx0LnJhbmdlID8gbHNwUmFuZ2VUb01vbmFjbyhyZXN1bHQucmFuZ2UpIDogdW5kZWZpbmVkLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJTaWduYXR1cmVIZWxwUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHNpZ25hdHVyZUhlbHBUcmlnZ2VyQ2hhcmFjdGVyczogWycoJywgJywnXSxcbiAgICAgICAgcHJvdmlkZVNpZ25hdHVyZUhlbHA6IGFzeW5jIChtb2RlbCwgcG9zaXRpb24pID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgZmlsZVVyaSA9IG1vZGVsLnVyaS50b1N0cmluZygpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBTaWduYXR1cmVIZWxwIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvc2lnbmF0dXJlSGVscCcsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBmaWxlVXJpIH0sXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICB2YWx1ZToge1xuICAgICAgICAgICAgICAgICAgICBzaWduYXR1cmVzOiByZXN1bHQuc2lnbmF0dXJlcy5tYXAoKHNpZzogU2lnbmF0dXJlSW5mb3JtYXRpb24pID0+ICh7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogICAgICAgICBzaWcubGFiZWwsXG4gICAgICAgICAgICAgICAgICAgICAgICBkb2N1bWVudGF0aW9uOiBzaWcuZG9jdW1lbnRhdGlvbiA/IG1hcmt1cFRvU3RyaW5nKHNpZy5kb2N1bWVudGF0aW9uKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnM6ICAgIChzaWcucGFyYW1ldGVycyA/PyBbXSkubWFwKChwOiBQYXJhbWV0ZXJJbmZvcm1hdGlvbikgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbDogICAgICAgICBwLmxhYmVsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvY3VtZW50YXRpb246IHAuZG9jdW1lbnRhdGlvbiA/IG1hcmt1cFRvU3RyaW5nKHAuZG9jdW1lbnRhdGlvbikgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgICAgICAgICB9KSksXG4gICAgICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlU2lnbmF0dXJlOiByZXN1bHQuYWN0aXZlU2lnbmF0dXJlID8/IDAsXG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZVBhcmFtZXRlcjogcmVzdWx0LmFjdGl2ZVBhcmFtZXRlciA/PyAwLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge30sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckRlZmluaXRpb25Qcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZURlZmluaXRpb246IGFzeW5jIChtb2RlbCwgcG9zaXRpb24pID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgZmlsZVVyaSA9IG1vZGVsLnVyaS50b1N0cmluZygpO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBMb2NhdGlvbiB8IExvY2F0aW9uW10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9kZWZpbml0aW9uJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IGZpbGVVcmkgfSxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogICAgIHsgbGluZTogcG9zaXRpb24ubGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogcG9zaXRpb24uY29sdW1uIC0gMSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBsb2NhdGlvbnMgPSAoQXJyYXkuaXNBcnJheShyZXN1bHQpID8gcmVzdWx0IDogW3Jlc3VsdF0pLm1hcChsb2MgPT4gKHtcbiAgICAgICAgICAgICAgICB1cmk6ICAgbW9uYWNvLlVyaS5wYXJzZShsb2MudXJpKSxcbiAgICAgICAgICAgICAgICByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhsb2MucmFuZ2UpLFxuICAgICAgICAgICAgfSkpO1xuICAgICAgICAgICAgYXdhaXQgZW5zdXJlTW9kZWxzRm9yTG9jYXRpb25zKGxvY2F0aW9ucyk7XG4gICAgICAgICAgICByZXR1cm4gbG9jYXRpb25zO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlclJlZmVyZW5jZVByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlUmVmZXJlbmNlczogYXN5bmMgKG1vZGVsLCBwb3NpdGlvbiwgY29udGV4dCkgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IExvY2F0aW9uW10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9yZWZlcmVuY2VzJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgICAgICBjb250ZXh0OiAgICAgIHsgaW5jbHVkZURlY2xhcmF0aW9uOiBjb250ZXh0LmluY2x1ZGVEZWNsYXJhdGlvbiB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBsb2NhdGlvbnMgPSByZXN1bHQubWFwKGxvYyA9PiAoeyB1cmk6IG1vbmFjby5VcmkucGFyc2UobG9jLnVyaSksIHJhbmdlOiBsc3BSYW5nZVRvTW9uYWNvKGxvYy5yYW5nZSkgfSkpO1xuICAgICAgICAgICAgLy8gVGhlIHJlZmVyZW5jZXMgcGVlayBjYW4gb25seSBzaG93IGEgY29kZSBwcmV2aWV3IGZvciBmaWxlcyBpdCBoYXMgYSBtb2RlbCBmb3I7IGNyZWF0ZVxuICAgICAgICAgICAgLy8gaW4tbWVtb3J5IG1vZGVscyBmb3IgdGhlIHJlZmVyZW5jZWQgKHBvc3NpYmx5IHVub3BlbmVkKSBmaWxlcyBzbyBwcmV2aWV3cyByZW5kZXIuXG4gICAgICAgICAgICBhd2FpdCBlbnN1cmVNb2RlbHNGb3JMb2NhdGlvbnMobG9jYXRpb25zKTtcbiAgICAgICAgICAgIHJldHVybiBsb2NhdGlvbnM7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyUmVuYW1lUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVSZW5hbWVFZGl0czogYXN5bmMgKG1vZGVsLCBwb3NpdGlvbiwgbmV3TmFtZSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIHsgZWRpdHM6IFtdIH07XG4gICAgICAgICAgICBjb25zdCBlZGl0OiBXb3Jrc3BhY2VFZGl0IHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvcmVuYW1lJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICAgICAgICAgICAgICBuZXdOYW1lLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIWVkaXQpIHJldHVybiB7IGVkaXRzOiBbXSB9O1xuICAgICAgICAgICAgLy8gQSBKRFQuTFMgcmVuYW1lIGNhbiBzcGFuIG1hbnkgZmlsZXMgYW5kIGV2ZW4gcmVuYW1lIHRoZSB0eXBlJ3Mgb3duIC5qYXZhIGZpbGUuIE1vbmFjbydzXG4gICAgICAgICAgICAvLyBzaW5nbGUtZmlsZSBlZGl0b3Igd291bGQgZHJvcCBldmVyeXRoaW5nIGJ1dCB0aGUgY3VycmVudCBtb2RlbCwgc28gYXBwbHkgdGhlIHdob2xlIGVkaXRcbiAgICAgICAgICAgIC8vIHRocm91Z2ggdGhlIHdvcmtzcGFjZSBvdXJzZWx2ZXMgd2hlbiB0aGUgSURFIHBlcnNpc3RlbmNlIGhvb2sgaXMgYXZhaWxhYmxlLlxuICAgICAgICAgICAgaWYgKHR5cGVvZiAoZ2xvYmFsVGhpcyBhcyBhbnkpLmphdmFMc3BQZXJzaXN0UmVuYW1lID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgYXdhaXQgYXBwbHlSZW5hbWVBY3Jvc3NXb3Jrc3BhY2UobW9kZWwsIGVkaXQpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4geyBlZGl0czogW10gfTtcbiAgICAgICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1tqYXZhLWxzcF0gY3Jvc3MtZmlsZSByZW5hbWUgZmFpbGVkLCBhcHBseWluZyB0byB0aGUgY3VycmVudCBmaWxlIG9ubHk6JywgZSk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB3b3Jrc3BhY2VFZGl0VG9Nb25hY28oZWRpdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHdvcmtzcGFjZUVkaXRUb01vbmFjbyhlZGl0KTtcbiAgICAgICAgfSxcbiAgICAgICAgcmVzb2x2ZVJlbmFtZUxvY2F0aW9uOiBhc3luYyAobW9kZWwsIHBvc2l0aW9uKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgY29uc3QgcmVzdWx0OiB7IHJhbmdlOiBMc3BSYW5nZTsgcGxhY2Vob2xkZXI/OiBzdHJpbmcgfSB8IExzcFJhbmdlIHwgbnVsbCA9XG4gICAgICAgICAgICAgICAgICAgIGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvcHJlcGFyZVJlbmFtZScsIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbjogICAgIHsgbGluZTogcG9zaXRpb24ubGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogcG9zaXRpb24uY29sdW1uIC0gMSB9LFxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgY29uc3QgcmFuZ2UgPSAncmFuZ2UnIGluIHJlc3VsdCA/IHJlc3VsdC5yYW5nZSA6IHJlc3VsdDtcbiAgICAgICAgICAgICAgICBjb25zdCBwbGFjZWhvbGRlciA9ICdwbGFjZWhvbGRlcicgaW4gcmVzdWx0ICYmIHJlc3VsdC5wbGFjZWhvbGRlclxuICAgICAgICAgICAgICAgICAgICA/IHJlc3VsdC5wbGFjZWhvbGRlclxuICAgICAgICAgICAgICAgICAgICA6IG1vZGVsLmdldFdvcmRBdFBvc2l0aW9uKHBvc2l0aW9uKT8ud29yZCA/PyAnJztcbiAgICAgICAgICAgICAgICByZXR1cm4geyByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhyYW5nZSksIHRleHQ6IHBsYWNlaG9sZGVyIH07XG4gICAgICAgICAgICB9IGNhdGNoIHtcbiAgICAgICAgICAgICAgICBjb25zdCB3b3JkID0gbW9kZWwuZ2V0V29yZEF0UG9zaXRpb24ocG9zaXRpb24pO1xuICAgICAgICAgICAgICAgIHJldHVybiB3b3JkID8ge1xuICAgICAgICAgICAgICAgICAgICByYW5nZTogeyBzdGFydExpbmVOdW1iZXI6IHBvc2l0aW9uLmxpbmVOdW1iZXIsIHN0YXJ0Q29sdW1uOiB3b3JkLnN0YXJ0Q29sdW1uLCBlbmRMaW5lTnVtYmVyOiBwb3NpdGlvbi5saW5lTnVtYmVyLCBlbmRDb2x1bW46IHdvcmQuZW5kQ29sdW1uIH0sXG4gICAgICAgICAgICAgICAgICAgIHRleHQ6IHdvcmQud29yZCxcbiAgICAgICAgICAgICAgICB9IDogbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIFJlZ2lzdGVyaW5nIHRoaXMgcHJvdmlkZXIgYWxzbyBlbmFibGVzIGVkaXRvci5qcydzIGV4aXN0aW5nIGZvcm1hdC1vbi1zYXZlIHBhdGggZm9yIEphdmE6IHRoZVxuICAgIC8vIHNoYXJlZCBTYXZlIGFjdGlvbiBydW5zIGVkaXRvci5hY3Rpb24uZm9ybWF0RG9jdW1lbnQgd2hlbiBhdXRvLWZvcm1hdHRpbmcgaXMgb24gKHRoZSBzYW1lXG4gICAgLy8gbWVjaGFuaXNtIGFuZCBnbG9iYWwgdG9nZ2xlIHVzZWQgZm9yIFR5cGVTY3JpcHQpLlxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJEb2N1bWVudEZvcm1hdHRpbmdFZGl0UHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVEb2N1bWVudEZvcm1hdHRpbmdFZGl0czogYXN5bmMgKG1vZGVsKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IGVkaXRzOiBUZXh0RWRpdFtdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvZm9ybWF0dGluZycsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgIG9wdGlvbnM6ICAgICAgeyB0YWJTaXplOiBtb2RlbC5nZXRPcHRpb25zKCkudGFiU2l6ZSwgaW5zZXJ0U3BhY2VzOiBtb2RlbC5nZXRPcHRpb25zKCkuaW5zZXJ0U3BhY2VzIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBlZGl0cyA/IGVkaXRzLm1hcCh0ZXh0RWRpdFRvTW9uYWNvKSA6IG51bGw7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyQ29kZUFjdGlvblByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlQ29kZUFjdGlvbnM6IGFzeW5jIChtb2RlbCwgcmFuZ2UsIGNvbnRleHQpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGVtcHR5ID0geyBhY3Rpb25zOiBbXSwgZGlzcG9zZSgpIHsgLyogbm90aGluZyB0byBkaXNwb3NlICovIH0gfTtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBlbXB0eTtcbiAgICAgICAgICAgIC8vIFNlbmQgdGhlIG9yaWdpbmFsIExTUCBkaWFnbm9zdGljcyB0aGF0IG92ZXJsYXAgdGhlIHJhbmdlICh0aGV5IGNhcnJ5IHRoZSBjb2RlL2RhdGEgSkRULkxTXG4gICAgICAgICAgICAvLyBuZWVkcyB0byBjb21wdXRlIHF1aWNrLWZpeGVzKSwgbm90IG9uZXMgcmVjb25zdHJ1Y3RlZCBmcm9tIE1vbmFjbyBtYXJrZXJzLlxuICAgICAgICAgICAgY29uc3QgbHNwUmFuZ2UgPSBtb25hY29SYW5nZVRvTHNwKHJhbmdlKTtcbiAgICAgICAgICAgIGNvbnN0IGRpYWdub3N0aWNzID0gKF9kaWFnbm9zdGljcy5nZXQobW9kZWwudXJpLnRvU3RyaW5nKCkpID8/IFtdKS5maWx0ZXIoZCA9PiByYW5nZXNPdmVybGFwKGQucmFuZ2UsIGxzcFJhbmdlKSk7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IEFycmF5PENvZGVBY3Rpb24gfCBDb21tYW5kPiB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L2NvZGVBY3Rpb24nLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgICAgICByYW5nZTogICAgICAgIGxzcFJhbmdlLFxuICAgICAgICAgICAgICAgIC8vIE1vbmFjbydzIENvZGVBY3Rpb25UcmlnZ2VyVHlwZSAoSW52b2tlPTEsIEF1dG89MikgbWFwcyAxOjEgdG8gdGhlIExTUCB0cmlnZ2VyIGtpbmQuXG4gICAgICAgICAgICAgICAgLy8gRm9yd2FyZGluZyBpdCBsZXRzIEpEVC5MUyBjb21wdXRlIG9ubHkgcXVpY2stZml4ZXMgZm9yIHRoZSBwYXNzaXZlIGxpZ2h0YnVsYiAoY2hlYXApXG4gICAgICAgICAgICAgICAgLy8gYW5kIHRoZSBmdWxsIGFzc2lzdHMvcmVmYWN0b3JpbmdzIG9ubHkgb24gZXhwbGljaXQgQ3RybCsuIC8gUmVmYWN0b3JcdTIwMjYgKEludm9rZWQpLlxuICAgICAgICAgICAgICAgIGNvbnRleHQ6ICAgICAgeyBkaWFnbm9zdGljcywgb25seTogY29udGV4dC5vbmx5ID8gW2NvbnRleHQub25seV0gOiB1bmRlZmluZWQsIHRyaWdnZXJLaW5kOiBjb250ZXh0LnRyaWdnZXIgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQ/Lmxlbmd0aCkgcmV0dXJuIGVtcHR5O1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBhY3Rpb25zOiByZXN1bHQubWFwKGxzcENvZGVBY3Rpb25Ub01vbmFjbyksXG4gICAgICAgICAgICAgICAgZGlzcG9zZSgpIHsgLyogbm90aGluZyB0byBkaXNwb3NlICovIH0sXG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgIH0sIHtcbiAgICAgICAgcHJvdmlkZWRDb2RlQWN0aW9uS2luZHM6IFsncXVpY2tmaXgnLCAncmVmYWN0b3InLCAncmVmYWN0b3IuZXh0cmFjdCcsICdyZWZhY3Rvci5pbmxpbmUnLFxuICAgICAgICAgICAgJ3JlZmFjdG9yLnJld3JpdGUnLCAnc291cmNlJywgJ3NvdXJjZS5vcmdhbml6ZUltcG9ydHMnXSxcbiAgICB9KTtcblxuICAgIC8vIC0tLSBOYXZpZ2F0aW9uICYgc3RydWN0dXJlIChQYWNrIDEpIC0tLVxuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckltcGxlbWVudGF0aW9uUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVJbXBsZW1lbnRhdGlvbjogKG1vZGVsLCBwb3NpdGlvbikgPT4gcmVxdWVzdExvY2F0aW9ucygndGV4dERvY3VtZW50L2ltcGxlbWVudGF0aW9uJywgbW9kZWwsIHBvc2l0aW9uKSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJUeXBlRGVmaW5pdGlvblByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlVHlwZURlZmluaXRpb246IChtb2RlbCwgcG9zaXRpb24pID0+IHJlcXVlc3RMb2NhdGlvbnMoJ3RleHREb2N1bWVudC90eXBlRGVmaW5pdGlvbicsIG1vZGVsLCBwb3NpdGlvbiksXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyRG9jdW1lbnRIaWdobGlnaHRQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZURvY3VtZW50SGlnaGxpZ2h0czogYXN5bmMgKG1vZGVsLCBwb3NpdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCByZXN1bHQ6IGFueVtdIHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvZG9jdW1lbnRIaWdobGlnaHQnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogICAgIHsgbGluZTogcG9zaXRpb24ubGluZU51bWJlciAtIDEsIGNoYXJhY3RlcjogcG9zaXRpb24uY29sdW1uIC0gMSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0Lm1hcChoID0+ICh7IHJhbmdlOiBsc3BSYW5nZVRvTW9uYWNvKGgucmFuZ2UpLCBraW5kOiBoLmtpbmQgPyBoLmtpbmQgLSAxIDogdW5kZWZpbmVkIH0pKTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJEb2N1bWVudFN5bWJvbFByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlRG9jdW1lbnRTeW1ib2xzOiBhc3luYyAobW9kZWwpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBhbnlbXSB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L2RvY3VtZW50U3ltYm9sJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiByZXN1bHQgPyBtYXBEb2N1bWVudFN5bWJvbHMocmVzdWx0KSA6IG51bGw7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyRm9sZGluZ1JhbmdlUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVGb2xkaW5nUmFuZ2VzOiBhc3luYyAobW9kZWwpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBhbnlbXSB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L2ZvbGRpbmdSYW5nZScsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0Lm1hcChyID0+ICh7IHN0YXJ0OiByLnN0YXJ0TGluZSArIDEsIGVuZDogci5lbmRMaW5lICsgMSwga2luZDogZm9sZGluZ0tpbmQoci5raW5kKSB9KSk7XG4gICAgICAgIH0sXG4gICAgfSk7XG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyU2VsZWN0aW9uUmFuZ2VQcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZVNlbGVjdGlvblJhbmdlczogYXN5bmMgKG1vZGVsLCBwb3NpdGlvbnMpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiBhbnlbXSB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L3NlbGVjdGlvblJhbmdlJywge1xuICAgICAgICAgICAgICAgIHRleHREb2N1bWVudDogeyB1cmk6IG1vZGVsLnVyaS50b1N0cmluZygpIH0sXG4gICAgICAgICAgICAgICAgcG9zaXRpb25zOiAgICBwb3NpdGlvbnMubWFwKHAgPT4gKHsgbGluZTogcC5saW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiBwLmNvbHVtbiAtIDEgfSkpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0Lm1hcChmbGF0dGVuU2VsZWN0aW9uUmFuZ2UpO1xuICAgICAgICB9LFxuICAgIH0pO1xuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckRvY3VtZW50UmFuZ2VGb3JtYXR0aW5nRWRpdFByb3ZpZGVyKCdqYXZhJywge1xuICAgICAgICBwcm92aWRlRG9jdW1lbnRSYW5nZUZvcm1hdHRpbmdFZGl0czogYXN5bmMgKG1vZGVsLCByYW5nZSkgPT4ge1xuICAgICAgICAgICAgaWYgKCFfY29ubiB8fCAhaXNXb3Jrc3BhY2VGaWxlKG1vZGVsLnVyaS50b1N0cmluZygpKSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICBjb25zdCBlZGl0czogVGV4dEVkaXRbXSB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdCgndGV4dERvY3VtZW50L3JhbmdlRm9ybWF0dGluZycsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgICAgIHJhbmdlOiAgICAgICAgbW9uYWNvUmFuZ2VUb0xzcChyYW5nZSksXG4gICAgICAgICAgICAgICAgb3B0aW9uczogICAgICB7IHRhYlNpemU6IG1vZGVsLmdldE9wdGlvbnMoKS50YWJTaXplLCBpbnNlcnRTcGFjZXM6IG1vZGVsLmdldE9wdGlvbnMoKS5pbnNlcnRTcGFjZXMgfSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIGVkaXRzID8gZWRpdHMubWFwKHRleHRFZGl0VG9Nb25hY28pIDogbnVsbDtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIC0tLSBJbmxheSBoaW50cyArIHNlbWFudGljIGhpZ2hsaWdodGluZyAoUGFjayAyKSAtLS1cblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJJbmxheUhpbnRzUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVJbmxheUhpbnRzOiBhc3luYyAobW9kZWwsIHJhbmdlKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55W10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9pbmxheUhpbnQnLCB7XG4gICAgICAgICAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgICAgICAgICByYW5nZTogICAgICAgIG1vbmFjb1JhbmdlVG9Mc3AocmFuZ2UpLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgIGhpbnRzOiByZXN1bHQubWFwKGggPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmVOdW1iZXI6IGgucG9zaXRpb24ubGluZSArIDEsIGNvbHVtbjogaC5wb3NpdGlvbi5jaGFyYWN0ZXIgKyAxIH0sXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiAgICAgICAgdHlwZW9mIGgubGFiZWwgPT09ICdzdHJpbmcnID8gaC5sYWJlbCA6IChoLmxhYmVsID8/IFtdKS5tYXAoKHA6IGFueSkgPT4gKHsgbGFiZWw6IHAudmFsdWUgfSkpLFxuICAgICAgICAgICAgICAgICAgICBraW5kOiAgICAgICAgIGgua2luZCxcbiAgICAgICAgICAgICAgICAgICAgcGFkZGluZ0xlZnQ6ICBoLnBhZGRpbmdMZWZ0LFxuICAgICAgICAgICAgICAgICAgICBwYWRkaW5nUmlnaHQ6IGgucGFkZGluZ1JpZ2h0LFxuICAgICAgICAgICAgICAgICAgICB0b29sdGlwOiAgICAgIGgudG9vbHRpcCA/IG1hcmt1cFRvU3RyaW5nKGgudG9vbHRpcCkgOiB1bmRlZmluZWQsXG4gICAgICAgICAgICAgICAgfSkpLFxuICAgICAgICAgICAgICAgIGRpc3Bvc2UoKSB7IC8qIG5vdGhpbmcgdG8gZGlzcG9zZSAqLyB9LFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIG1vbmFjby5sYW5ndWFnZXMucmVnaXN0ZXJEb2N1bWVudFNlbWFudGljVG9rZW5zUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIGdldExlZ2VuZDogKCkgPT4gX3NlbWFudGljVG9rZW5zTGVnZW5kID8/IHsgdG9rZW5UeXBlczogW10sIHRva2VuTW9kaWZpZXJzOiBbXSB9LFxuICAgICAgICBwcm92aWRlRG9jdW1lbnRTZW1hbnRpY1Rva2VuczogYXN5bmMgKG1vZGVsKSA9PiB7XG4gICAgICAgICAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpIHx8ICFfc2VtYW50aWNUb2tlbnNMZWdlbmQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgY29uc3QgcmVzdWx0OiB7IGRhdGE6IG51bWJlcltdOyByZXN1bHRJZD86IHN0cmluZyB9IHwgbnVsbCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCd0ZXh0RG9jdW1lbnQvc2VtYW50aWNUb2tlbnMvZnVsbCcsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoIXJlc3VsdD8uZGF0YSkgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICByZXR1cm4geyBkYXRhOiBuZXcgVWludDMyQXJyYXkocmVzdWx0LmRhdGEpLCByZXN1bHRJZDogcmVzdWx0LnJlc3VsdElkIH07XG4gICAgICAgIH0sXG4gICAgICAgIHJlbGVhc2VEb2N1bWVudFNlbWFudGljVG9rZW5zOiAoKSA9PiB7IC8qIG5vdGhpbmcgdG8gcmVsZWFzZSAqLyB9LFxuICAgIH0pO1xuXG4gICAgLy8gLS0tIENvZGVMZW5zIChQYWNrIDMpIC0tLVxuXG4gICAgbW9uYWNvLmxhbmd1YWdlcy5yZWdpc3RlckNvZGVMZW5zUHJvdmlkZXIoJ2phdmEnLCB7XG4gICAgICAgIHByb3ZpZGVDb2RlTGVuc2VzOiBhc3luYyAobW9kZWwpID0+IHtcbiAgICAgICAgICAgIGlmICghX2Nvbm4gfHwgIWlzV29ya3NwYWNlRmlsZShtb2RlbC51cmkudG9TdHJpbmcoKSkpIHJldHVybiB7IGxlbnNlczogW10sIGRpc3Bvc2UoKSB7IC8qICovIH0gfTtcbiAgICAgICAgICAgIGNvbnN0IHJlc3VsdDogYW55W10gfCBudWxsID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3RleHREb2N1bWVudC9jb2RlTGVucycsIHtcbiAgICAgICAgICAgICAgICB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBtb2RlbC51cmkudG9TdHJpbmcoKSB9LFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBjb25zdCBsZW5zZXMgPSAocmVzdWx0ID8/IFtdKS5tYXAoKGxlbnMsIGkpID0+ICh7XG4gICAgICAgICAgICAgICAgcmFuZ2U6ICAgIGxzcFJhbmdlVG9Nb25hY28obGVucy5yYW5nZSksXG4gICAgICAgICAgICAgICAgaWQ6ICAgICAgIFN0cmluZyhpKSxcbiAgICAgICAgICAgICAgICBjb21tYW5kOiAgbGVucy5jb21tYW5kID8gbWFwTGVuc0NvbW1hbmQobGVucy5jb21tYW5kKSA6IHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICBfbHNwOiAgICAgbGVucyxcbiAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgIHJldHVybiB7IGxlbnNlcywgZGlzcG9zZSgpIHsgLyogKi8gfSB9O1xuICAgICAgICB9LFxuICAgICAgICByZXNvbHZlQ29kZUxlbnM6IGFzeW5jIChfbW9kZWwsIGNvZGVMZW5zKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBsc3AgPSAoY29kZUxlbnMgYXMgYW55KS5fbHNwO1xuICAgICAgICAgICAgaWYgKF9jb25uICYmIGxzcCAmJiAhbHNwLmNvbW1hbmQpIHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCByZXNvbHZlZDogYW55ID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ2NvZGVMZW5zL3Jlc29sdmUnLCBsc3ApO1xuICAgICAgICAgICAgICAgICAgICBjb2RlTGVucy5jb21tYW5kID0gcmVzb2x2ZWQ/LmNvbW1hbmQgPyBtYXBMZW5zQ29tbWFuZChyZXNvbHZlZC5jb21tYW5kKSA6IHsgaWQ6IE5PT1BfQ09NTUFORCwgdGl0bGU6ICcnIH07XG4gICAgICAgICAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAgICAgICAgIGNvZGVMZW5zLmNvbW1hbmQgPSB7IGlkOiBOT09QX0NPTU1BTkQsIHRpdGxlOiAnJyB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBjb2RlTGVucztcbiAgICAgICAgfSxcbiAgICB9KTtcblxuICAgIC8vIC0tLSBKYXZhIGtleXdvcmQgY29tcGxldGlvbiAoUGFjayAxYik6IGFsd2F5cy1hdmFpbGFibGUsIHJhbmtlZCBiZWxvdyBTREsvTFNQIHJlc3VsdHMgLS0tXG5cbiAgICBtb25hY28ubGFuZ3VhZ2VzLnJlZ2lzdGVyQ29tcGxldGlvbkl0ZW1Qcm92aWRlcignamF2YScsIHtcbiAgICAgICAgcHJvdmlkZUNvbXBsZXRpb25JdGVtczogKG1vZGVsLCBwb3NpdGlvbikgPT4ge1xuICAgICAgICAgICAgaWYgKCFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIGNvbnN0IHdvcmQgPSBtb2RlbC5nZXRXb3JkVW50aWxQb3NpdGlvbihwb3NpdGlvbik7XG4gICAgICAgICAgICBjb25zdCByYW5nZTogbW9uYWNvLklSYW5nZSA9IHtcbiAgICAgICAgICAgICAgICBzdGFydExpbmVOdW1iZXI6IHBvc2l0aW9uLmxpbmVOdW1iZXIsIHN0YXJ0Q29sdW1uOiB3b3JkLnN0YXJ0Q29sdW1uLFxuICAgICAgICAgICAgICAgIGVuZExpbmVOdW1iZXI6ICAgcG9zaXRpb24ubGluZU51bWJlciwgZW5kQ29sdW1uOiAgIHdvcmQuZW5kQ29sdW1uLFxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgc3VnZ2VzdGlvbnM6IEpBVkFfS0VZV09SRFMubWFwKGtleXdvcmQgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6ICAgICAga2V5d29yZCxcbiAgICAgICAgICAgICAgICAgICAga2luZDogICAgICAgbW9uYWNvLmxhbmd1YWdlcy5Db21wbGV0aW9uSXRlbUtpbmQuS2V5d29yZCxcbiAgICAgICAgICAgICAgICAgICAgaW5zZXJ0VGV4dDoga2V5d29yZCxcbiAgICAgICAgICAgICAgICAgICAgcmFuZ2UsXG4gICAgICAgICAgICAgICAgICAgIHNvcnRUZXh0OiAgIGA5XyR7a2V5d29yZH1gLFxuICAgICAgICAgICAgICAgIH0pKSxcbiAgICAgICAgICAgIH07XG4gICAgICAgIH0sXG4gICAgfSk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbi8vIEhlbHBlcnNcbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuZnVuY3Rpb24gbHNwU2V2ZXJpdHkoc2V2ZXJpdHk6IERpYWdub3N0aWNTZXZlcml0eSB8IHVuZGVmaW5lZCk6IG1vbmFjby5NYXJrZXJTZXZlcml0eSB7XG4gICAgc3dpdGNoIChzZXZlcml0eSkge1xuICAgICAgICBjYXNlIERpYWdub3N0aWNTZXZlcml0eS5FcnJvcjogICAgICAgcmV0dXJuIG1vbmFjby5NYXJrZXJTZXZlcml0eS5FcnJvcjtcbiAgICAgICAgY2FzZSBEaWFnbm9zdGljU2V2ZXJpdHkuV2FybmluZzogICAgIHJldHVybiBtb25hY28uTWFya2VyU2V2ZXJpdHkuV2FybmluZztcbiAgICAgICAgY2FzZSBEaWFnbm9zdGljU2V2ZXJpdHkuSW5mb3JtYXRpb246IHJldHVybiBtb25hY28uTWFya2VyU2V2ZXJpdHkuSW5mbztcbiAgICAgICAgY2FzZSBEaWFnbm9zdGljU2V2ZXJpdHkuSGludDogICAgICAgIHJldHVybiBtb25hY28uTWFya2VyU2V2ZXJpdHkuSGludDtcbiAgICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtb25hY28uTWFya2VyU2V2ZXJpdHkuRXJyb3I7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBsc3BSYW5nZVRvTW9uYWNvKHI6IHsgc3RhcnQ6IHsgbGluZTogbnVtYmVyOyBjaGFyYWN0ZXI6IG51bWJlciB9OyBlbmQ6IHsgbGluZTogbnVtYmVyOyBjaGFyYWN0ZXI6IG51bWJlciB9IH0pOiBtb25hY28uSVJhbmdlIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBzdGFydExpbmVOdW1iZXI6IHIuc3RhcnQubGluZSArIDEsXG4gICAgICAgIHN0YXJ0Q29sdW1uOiAgICAgci5zdGFydC5jaGFyYWN0ZXIgKyAxLFxuICAgICAgICBlbmRMaW5lTnVtYmVyOiAgIHIuZW5kLmxpbmUgKyAxLFxuICAgICAgICBlbmRDb2x1bW46ICAgICAgIHIuZW5kLmNoYXJhY3RlciArIDEsXG4gICAgfTtcbn1cblxuZnVuY3Rpb24gbWFya3VwVG9TdHJpbmcoYzogc3RyaW5nIHwgTWFya3VwQ29udGVudCk6IHN0cmluZyB7XG4gICAgcmV0dXJuIHR5cGVvZiBjID09PSAnc3RyaW5nJyA/IGMgOiBjLnZhbHVlO1xufVxuXG5mdW5jdGlvbiBsc3BDb21wbGV0aW9uS2luZChraW5kOiBDb21wbGV0aW9uSXRlbUtpbmQgfCB1bmRlZmluZWQpOiBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtS2luZCB7XG4gICAgY29uc3QgSyA9IG1vbmFjby5sYW5ndWFnZXMuQ29tcGxldGlvbkl0ZW1LaW5kO1xuICAgIHN3aXRjaCAoa2luZCkge1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5UZXh0OiAgICAgICAgICByZXR1cm4gSy5UZXh0O1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5NZXRob2Q6ICAgICAgICByZXR1cm4gSy5NZXRob2Q7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLkZ1bmN0aW9uOiAgICAgIHJldHVybiBLLkZ1bmN0aW9uO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5Db25zdHJ1Y3RvcjogICByZXR1cm4gSy5Db25zdHJ1Y3RvcjtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuRmllbGQ6ICAgICAgICAgcmV0dXJuIEsuRmllbGQ7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLlZhcmlhYmxlOiAgICAgIHJldHVybiBLLlZhcmlhYmxlO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5DbGFzczogICAgICAgICByZXR1cm4gSy5DbGFzcztcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuSW50ZXJmYWNlOiAgICAgcmV0dXJuIEsuSW50ZXJmYWNlO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5Nb2R1bGU6ICAgICAgICByZXR1cm4gSy5Nb2R1bGU7XG4gICAgICAgIGNhc2UgQ29tcGxldGlvbkl0ZW1LaW5kLlByb3BlcnR5OiAgICAgIHJldHVybiBLLlByb3BlcnR5O1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5LZXl3b3JkOiAgICAgICByZXR1cm4gSy5LZXl3b3JkO1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5TbmlwcGV0OiAgICAgICByZXR1cm4gSy5TbmlwcGV0O1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5Db25zdGFudDogICAgICByZXR1cm4gSy5Db25zdGFudDtcbiAgICAgICAgY2FzZSBDb21wbGV0aW9uSXRlbUtpbmQuU3RydWN0OiAgICAgICAgcmV0dXJuIEsuU3RydWN0O1xuICAgICAgICBjYXNlIENvbXBsZXRpb25JdGVtS2luZC5UeXBlUGFyYW1ldGVyOiByZXR1cm4gSy5UeXBlUGFyYW1ldGVyO1xuICAgICAgICBkZWZhdWx0OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSy5UZXh0O1xuICAgIH1cbn1cblxuZnVuY3Rpb24gbHNwQ29tcGxldGlvblRvTW9uYWNvKFxuICAgIGl0ZW06IENvbXBsZXRpb25JdGVtLFxuICAgIG1vZGVsOiBtb25hY28uZWRpdG9yLklUZXh0TW9kZWwsXG4gICAgcG9zaXRpb246IG1vbmFjby5Qb3NpdGlvbixcbik6IE1vbmFjb0NvbXBsZXRpb25JdGVtIHtcbiAgICBjb25zdCB3b3JkID0gbW9kZWwuZ2V0V29yZFVudGlsUG9zaXRpb24ocG9zaXRpb24pO1xuICAgIGxldCByYW5nZTogbW9uYWNvLklSYW5nZSA9IHtcbiAgICAgICAgc3RhcnRMaW5lTnVtYmVyOiBwb3NpdGlvbi5saW5lTnVtYmVyLFxuICAgICAgICBzdGFydENvbHVtbjogICAgIHdvcmQuc3RhcnRDb2x1bW4sXG4gICAgICAgIGVuZExpbmVOdW1iZXI6ICAgcG9zaXRpb24ubGluZU51bWJlcixcbiAgICAgICAgZW5kQ29sdW1uOiAgICAgICB3b3JkLmVuZENvbHVtbixcbiAgICB9O1xuICAgIGxldCBpbnNlcnRUZXh0ID0gaXRlbS5pbnNlcnRUZXh0ID8/IGl0ZW0ubGFiZWw7XG4gICAgY29uc3QgdGV4dEVkaXQgPSBpdGVtLnRleHRFZGl0IGFzIHsgcmFuZ2U/OiBMc3BSYW5nZTsgcmVwbGFjZT86IExzcFJhbmdlOyBpbnNlcnQ/OiBMc3BSYW5nZTsgbmV3VGV4dD86IHN0cmluZyB9IHwgdW5kZWZpbmVkO1xuICAgIGlmICh0ZXh0RWRpdCkge1xuICAgICAgICBjb25zdCByID0gdGV4dEVkaXQucmFuZ2UgPz8gdGV4dEVkaXQucmVwbGFjZSA/PyB0ZXh0RWRpdC5pbnNlcnQ7XG4gICAgICAgIGlmIChyKSByYW5nZSA9IGxzcFJhbmdlVG9Nb25hY28ocik7XG4gICAgICAgIGlmICh0eXBlb2YgdGV4dEVkaXQubmV3VGV4dCA9PT0gJ3N0cmluZycpIGluc2VydFRleHQgPSB0ZXh0RWRpdC5uZXdUZXh0O1xuICAgIH1cbiAgICBjb25zdCByZXN1bHQ6IE1vbmFjb0NvbXBsZXRpb25JdGVtID0ge1xuICAgICAgICBsYWJlbDogICAgICAgICAgIGl0ZW0ubGFiZWwsXG4gICAgICAgIGtpbmQ6ICAgICAgICAgICAgbHNwQ29tcGxldGlvbktpbmQoaXRlbS5raW5kKSxcbiAgICAgICAgZGV0YWlsOiAgICAgICAgICBpdGVtLmRldGFpbCxcbiAgICAgICAgZG9jdW1lbnRhdGlvbjogICBpdGVtLmRvY3VtZW50YXRpb24gPyB7IHZhbHVlOiBtYXJrdXBUb1N0cmluZyhpdGVtLmRvY3VtZW50YXRpb24pLCBpc1RydXN0ZWQ6IGZhbHNlIH0gOiB1bmRlZmluZWQsXG4gICAgICAgIGluc2VydFRleHQsXG4gICAgICAgIGluc2VydFRleHRSdWxlczogaXRlbS5pbnNlcnRUZXh0Rm9ybWF0ID09PSBJbnNlcnRUZXh0Rm9ybWF0LlNuaXBwZXRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtSW5zZXJ0VGV4dFJ1bGUuSW5zZXJ0QXNTbmlwcGV0XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogdW5kZWZpbmVkLFxuICAgICAgICByYW5nZSxcbiAgICAgICAgc29ydFRleHQ6ICAgICAgICAgICAgc2RrUHJpb3JpdGlzZWRTb3J0VGV4dChpdGVtKSxcbiAgICAgICAgZmlsdGVyVGV4dDogICAgICAgICAgaXRlbS5maWx0ZXJUZXh0LFxuICAgICAgICBwcmVzZWxlY3Q6ICAgICAgICAgICBpdGVtLnByZXNlbGVjdCxcbiAgICAgICAgY29tbWl0Q2hhcmFjdGVyczogICAgaXRlbS5jb21taXRDaGFyYWN0ZXJzLFxuICAgICAgICBhZGRpdGlvbmFsVGV4dEVkaXRzOiBpdGVtLmFkZGl0aW9uYWxUZXh0RWRpdHM/Lm1hcCh0ZXh0RWRpdFRvTW9uYWNvKSxcbiAgICB9O1xuICAgIHJlc3VsdC5fbHNwID0gaXRlbTtcbiAgICByZXR1cm4gcmVzdWx0O1xufVxuXG4vKipcbiAqIFJhbmtzIERpcmlnaWJsZSBTREsgc3VnZ2VzdGlvbnMgKHtAY29kZSBvcmcuZWNsaXBzZS5kaXJpZ2libGUuc2RrLip9KSBhYm92ZSBldmVyeXRoaW5nIGVsc2UgYnlcbiAqIHByZWZpeGluZyB0aGUgc2VydmVyIHNvcnRUZXh0IHdpdGggYSBwcmlvcml0eSBidWNrZXQsIHByZXNlcnZpbmcgdGhlIHNlcnZlciBvcmRlciB3aXRoaW4gZWFjaCBidWNrZXQuXG4gKi9cbmZ1bmN0aW9uIHNka1ByaW9yaXRpc2VkU29ydFRleHQoaXRlbTogQ29tcGxldGlvbkl0ZW0pOiBzdHJpbmcge1xuICAgIGNvbnN0IGJhc2UgPSBpdGVtLnNvcnRUZXh0ID8/ICh0eXBlb2YgaXRlbS5sYWJlbCA9PT0gJ3N0cmluZycgPyBpdGVtLmxhYmVsIDogJycpO1xuICAgIGNvbnN0IGRlc2NyaXB0aW9uID0gKGl0ZW0ubGFiZWxEZXRhaWxzICYmIHR5cGVvZiBpdGVtLmxhYmVsRGV0YWlscy5kZXNjcmlwdGlvbiA9PT0gJ3N0cmluZycpXG4gICAgICAgID8gaXRlbS5sYWJlbERldGFpbHMuZGVzY3JpcHRpb24gOiAnJztcbiAgICBjb25zdCBoYXlzdGFjayA9IGAke2l0ZW0uZGV0YWlsID8/ICcnfSAke2Rlc2NyaXB0aW9ufWA7XG4gICAgcmV0dXJuIGhheXN0YWNrLmluY2x1ZGVzKCdvcmcuZWNsaXBzZS5kaXJpZ2libGUuc2RrJykgPyBgMF8ke2Jhc2V9YCA6IGAxXyR7YmFzZX1gO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4vLyBDb2RlIGFjdGlvbnMsIGNvbW1hbmRzLCByZWZhY3Rvci9nZW5lcmF0ZSwgd29ya3NwYWNlIGVkaXRzXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cbi8qKiBNb25hY28gY29tbWFuZCBpZCB1c2VkIHRvIGFwcGx5IGEgZGVmZXJyZWQgTFNQIGNvZGUgYWN0aW9uIHdoZW4gdGhlIHVzZXIgc2VsZWN0cyBpdC4gKi9cbmNvbnN0IEFQUExZX0FDVElPTl9DT01NQU5EID0gJ2RpcmlnaWJsZS5qYXZhLmFwcGx5Q29kZUFjdGlvbic7XG5cbi8qKiBWaXJ0dWFsIFVSSSBwcmVmaXggb2YgZWRpdG9yIG1vZGVsczsgc3RyaXBwaW5nIGl0IHlpZWxkcyB0aGUgSURFIHdvcmtzcGFjZSBwYXRoICgvd3MvcHJvai8uLi4pLiAqL1xuY29uc3QgVklSVFVBTF9GSUxFX1BSRUZJWCA9ICdmaWxlOi8vL3dvcmtzcGFjZSc7XG5cbi8qKiBNb25hY28gY29tbWFuZCBpZCB1c2VkIGZvciBkaXNwbGF5LW9ubHkgQ29kZUxlbnNlcyAoZS5nLiBhIHJlZmVyZW5jZSBjb3VudCB3aXRoIG5vIHJlc29sdmVkIGFjdGlvbikuICovXG5jb25zdCBOT09QX0NPTU1BTkQgPSAnZGlyaWdpYmxlLmphdmEubm9vcExlbnMnO1xuXG4vKiogSmF2YSBTRSBrZXl3b3Jkcy9saXRlcmFscyBvZmZlcmVkIGFzIGxvdy1wcmlvcml0eSBjb21wbGV0aW9uIHNvIHRoZXkgYWx3YXlzIGFwcGVhciB3aGlsZSB0eXBpbmcuICovXG5jb25zdCBKQVZBX0tFWVdPUkRTID0gWydhYnN0cmFjdCcsICdhc3NlcnQnLCAnYm9vbGVhbicsICdicmVhaycsICdieXRlJywgJ2Nhc2UnLCAnY2F0Y2gnLCAnY2hhcicsICdjbGFzcycsXG4gICAgJ2NvbnN0JywgJ2NvbnRpbnVlJywgJ2RlZmF1bHQnLCAnZG8nLCAnZG91YmxlJywgJ2Vsc2UnLCAnZW51bScsICdleHRlbmRzJywgJ2ZpbmFsJywgJ2ZpbmFsbHknLCAnZmxvYXQnLFxuICAgICdmb3InLCAnZ290bycsICdpZicsICdpbXBsZW1lbnRzJywgJ2ltcG9ydCcsICdpbnN0YW5jZW9mJywgJ2ludCcsICdpbnRlcmZhY2UnLCAnbG9uZycsICduYXRpdmUnLCAnbmV3JyxcbiAgICAncGFja2FnZScsICdwcml2YXRlJywgJ3Byb3RlY3RlZCcsICdwdWJsaWMnLCAncmV0dXJuJywgJ3Nob3J0JywgJ3N0YXRpYycsICdzdHJpY3RmcCcsICdzdXBlcicsICdzd2l0Y2gnLFxuICAgICdzeW5jaHJvbml6ZWQnLCAndGhpcycsICd0aHJvdycsICd0aHJvd3MnLCAndHJhbnNpZW50JywgJ3RyeScsICd2b2lkJywgJ3ZvbGF0aWxlJywgJ3doaWxlJywgJ3ZhcicsXG4gICAgJ3lpZWxkJywgJ3JlY29yZCcsICdzZWFsZWQnLCAncGVybWl0cycsICd0cnVlJywgJ2ZhbHNlJywgJ251bGwnXTtcblxuLyoqIFNoYXJlZCBkZWZpbml0aW9uLXN0eWxlIGxvY2F0aW9uIHJlcXVlc3QgdXNlZCBieSBnby10by1kZWZpbml0aW9uL2ltcGxlbWVudGF0aW9uL3R5cGUtZGVmaW5pdGlvbi4gKi9cbmFzeW5jIGZ1bmN0aW9uIHJlcXVlc3RMb2NhdGlvbnMobWV0aG9kOiBzdHJpbmcsIG1vZGVsOiBtb25hY28uZWRpdG9yLklUZXh0TW9kZWwsIHBvc2l0aW9uOiBtb25hY28uUG9zaXRpb24pIHtcbiAgICBpZiAoIV9jb25uIHx8ICFpc1dvcmtzcGFjZUZpbGUobW9kZWwudXJpLnRvU3RyaW5nKCkpKSByZXR1cm4gbnVsbDtcbiAgICBjb25zdCByZXN1bHQ6IExvY2F0aW9uIHwgTG9jYXRpb25bXSB8IG51bGwgPSBhd2FpdCBfY29ubi5zZW5kUmVxdWVzdChtZXRob2QsIHtcbiAgICAgICAgdGV4dERvY3VtZW50OiB7IHVyaTogbW9kZWwudXJpLnRvU3RyaW5nKCkgfSxcbiAgICAgICAgcG9zaXRpb246ICAgICB7IGxpbmU6IHBvc2l0aW9uLmxpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHBvc2l0aW9uLmNvbHVtbiAtIDEgfSxcbiAgICB9KTtcbiAgICBpZiAoIXJlc3VsdCkgcmV0dXJuIG51bGw7XG4gICAgY29uc3QgbG9jYXRpb25zID0gKEFycmF5LmlzQXJyYXkocmVzdWx0KSA/IHJlc3VsdCA6IFtyZXN1bHRdKS5tYXAobG9jID0+ICh7IHVyaTogbW9uYWNvLlVyaS5wYXJzZShsb2MudXJpKSwgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28obG9jLnJhbmdlKSB9KSk7XG4gICAgYXdhaXQgZW5zdXJlTW9kZWxzRm9yTG9jYXRpb25zKGxvY2F0aW9ucyk7XG4gICAgcmV0dXJuIGxvY2F0aW9ucztcbn1cblxuLyoqXG4gKiBDcmVhdGVzIGluLW1lbW9yeSBNb25hY28gbW9kZWxzIGZvciB0aGUgd29ya3NwYWNlIGZpbGVzIHJlZmVyZW5jZWQgYnkgdGhlIGdpdmVuIGxvY2F0aW9ucyAoZmV0Y2hlZFxuICogb3ZlciBSRVNUKSBzbyB0aGUgcmVmZXJlbmNlcyAvIHBlZWsgd2lkZ2V0cyBjYW4gcmVuZGVyIGEgY29kZSBwcmV2aWV3IFx1MjAxNCBNb25hY28gY2FuIG9ubHkgcHJldmlldyBmaWxlc1xuICogaXQgaGFzIGEgbW9kZWwgZm9yLCBhbmQgdGhpcyBzaW5nbGUtZmlsZSBlZGl0b3Igb3RoZXJ3aXNlIGhhcyBub25lIGZvciBvdGhlciBmaWxlcy5cbiAqL1xuYXN5bmMgZnVuY3Rpb24gZW5zdXJlTW9kZWxzRm9yTG9jYXRpb25zKGxvY2F0aW9uczogQXJyYXk8eyB1cmk6IG1vbmFjby5VcmkgfT4pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCBzZWVuID0gbmV3IFNldDxzdHJpbmc+KCk7XG4gICAgYXdhaXQgUHJvbWlzZS5hbGwobG9jYXRpb25zLm1hcChhc3luYyAoeyB1cmkgfSkgPT4ge1xuICAgICAgICBjb25zdCB1cmlTdHIgPSB1cmkudG9TdHJpbmcoKTtcbiAgICAgICAgaWYgKHNlZW4uaGFzKHVyaVN0cikgfHwgIXVyaVN0ci5zdGFydHNXaXRoKFZJUlRVQUxfRklMRV9QUkVGSVgpIHx8IG1vbmFjby5lZGl0b3IuZ2V0TW9kZWwodXJpKSkgcmV0dXJuO1xuICAgICAgICBzZWVuLmFkZCh1cmlTdHIpO1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgdGV4dCA9IGF3YWl0IGZldGNoV29ya3NwYWNlRmlsZVRleHQodXJpVG9Xb3Jrc3BhY2VQYXRoKHVyaVN0cikgPz8gdXJpU3RyKTtcbiAgICAgICAgICAgIGlmICghbW9uYWNvLmVkaXRvci5nZXRNb2RlbCh1cmkpKSBtb25hY28uZWRpdG9yLmNyZWF0ZU1vZGVsKHRleHQsICdqYXZhJywgdXJpKTtcbiAgICAgICAgfSBjYXRjaCB7XG4gICAgICAgICAgICAvLyBwcmV2aWV3IGp1c3Qgd29uJ3QgcmVuZGVyIGZvciB0aGlzIG9uZVxuICAgICAgICB9XG4gICAgfSkpO1xufVxuXG4vKiogUmVjdXJzaXZlbHkgbWFwcyBMU1AgaGllcmFyY2hpY2FsIERvY3VtZW50U3ltYm9scyB0byBNb25hY28ncyBzaGFwZSAoa2luZHMgYXJlIDEtYmFzZWQgdnMgMC1iYXNlZCkuICovXG5mdW5jdGlvbiBtYXBEb2N1bWVudFN5bWJvbHMoc3ltYm9sczogYW55W10pOiBtb25hY28ubGFuZ3VhZ2VzLkRvY3VtZW50U3ltYm9sW10ge1xuICAgIHJldHVybiAoc3ltYm9scyA/PyBbXSkubWFwKHMgPT4gKHtcbiAgICAgICAgbmFtZTogICAgICAgICAgIHMubmFtZSxcbiAgICAgICAgZGV0YWlsOiAgICAgICAgIHMuZGV0YWlsID8/ICcnLFxuICAgICAgICBraW5kOiAgICAgICAgICAgKHMua2luZCA/PyAxKSAtIDEsXG4gICAgICAgIHRhZ3M6ICAgICAgICAgICBzLnRhZ3MgPz8gW10sXG4gICAgICAgIHJhbmdlOiAgICAgICAgICBsc3BSYW5nZVRvTW9uYWNvKHMucmFuZ2UpLFxuICAgICAgICBzZWxlY3Rpb25SYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhzLnNlbGVjdGlvblJhbmdlID8/IHMucmFuZ2UpLFxuICAgICAgICBjaGlsZHJlbjogICAgICAgcy5jaGlsZHJlbiA/IG1hcERvY3VtZW50U3ltYm9scyhzLmNoaWxkcmVuKSA6IFtdLFxuICAgIH0pKTtcbn1cblxuZnVuY3Rpb24gZm9sZGluZ0tpbmQoa2luZDogc3RyaW5nIHwgdW5kZWZpbmVkKTogbW9uYWNvLmxhbmd1YWdlcy5Gb2xkaW5nUmFuZ2VLaW5kIHwgdW5kZWZpbmVkIHtcbiAgICBjb25zdCBGSyA9IG1vbmFjby5sYW5ndWFnZXMuRm9sZGluZ1JhbmdlS2luZDtcbiAgICBzd2l0Y2ggKGtpbmQpIHtcbiAgICAgICAgY2FzZSAnY29tbWVudCc6IHJldHVybiBGSy5Db21tZW50O1xuICAgICAgICBjYXNlICdpbXBvcnRzJzogcmV0dXJuIEZLLkltcG9ydHM7XG4gICAgICAgIGNhc2UgJ3JlZ2lvbic6ICByZXR1cm4gRksuUmVnaW9uO1xuICAgICAgICBkZWZhdWx0OiAgICAgICAgcmV0dXJuIHVuZGVmaW5lZDtcbiAgICB9XG59XG5cbi8qKiBGbGF0dGVucyBhbiBMU1AgU2VsZWN0aW9uUmFuZ2UgcGFyZW50LWNoYWluIGludG8gTW9uYWNvJ3MgaW5uZXJtb3N0LXRvLW91dGVybW9zdCBhcnJheS4gKi9cbmZ1bmN0aW9uIGZsYXR0ZW5TZWxlY3Rpb25SYW5nZShzZWxlY3Rpb25SYW5nZTogYW55KTogbW9uYWNvLmxhbmd1YWdlcy5TZWxlY3Rpb25SYW5nZVtdIHtcbiAgICBjb25zdCByYW5nZXM6IG1vbmFjby5sYW5ndWFnZXMuU2VsZWN0aW9uUmFuZ2VbXSA9IFtdO1xuICAgIGxldCBjdXJyZW50ID0gc2VsZWN0aW9uUmFuZ2U7XG4gICAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICAgICAgcmFuZ2VzLnB1c2goeyByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhjdXJyZW50LnJhbmdlKSB9KTtcbiAgICAgICAgY3VycmVudCA9IGN1cnJlbnQucGFyZW50O1xuICAgIH1cbiAgICByZXR1cm4gcmFuZ2VzO1xufVxuXG4vKiogTWFwcyBhIEpEVC5MUyBDb2RlTGVucyBjb21tYW5kIHRvIGEgTW9uYWNvIGNvbW1hbmQsIHdpcmluZyB0aGUgcmVmZXJlbmNlcy9pbXBsZW1lbnRhdGlvbnMgcGVlay4gKi9cbmZ1bmN0aW9uIG1hcExlbnNDb21tYW5kKGNtZDogYW55KTogbW9uYWNvLmxhbmd1YWdlcy5Db21tYW5kIHtcbiAgICBjb25zdCBhcmdzID0gY21kLmFyZ3VtZW50cyA/PyBbXTtcbiAgICBpZiAoKGNtZC5jb21tYW5kID09PSAnamF2YS5zaG93LnJlZmVyZW5jZXMnIHx8IGNtZC5jb21tYW5kID09PSAnamF2YS5zaG93LmltcGxlbWVudGF0aW9ucycpICYmIGFyZ3MubGVuZ3RoID49IDMpIHtcbiAgICAgICAgY29uc3QgbG9jYXRpb25zID0gKGFyZ3NbMl0gPz8gW10pLm1hcCgobDogYW55KSA9PiAoeyB1cmk6IG1vbmFjby5VcmkucGFyc2UobC51cmkpLCByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhsLnJhbmdlKSB9KSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpZDogICAgICAgICdlZGl0b3IuYWN0aW9uLnNob3dSZWZlcmVuY2VzJyxcbiAgICAgICAgICAgIHRpdGxlOiAgICAgY21kLnRpdGxlLFxuICAgICAgICAgICAgYXJndW1lbnRzOiBbbW9uYWNvLlVyaS5wYXJzZShhcmdzWzBdKSwgeyBsaW5lTnVtYmVyOiBhcmdzWzFdLmxpbmUgKyAxLCBjb2x1bW46IGFyZ3NbMV0uY2hhcmFjdGVyICsgMSB9LCBsb2NhdGlvbnNdLFxuICAgICAgICB9O1xuICAgIH1cbiAgICByZXR1cm4geyBpZDogTk9PUF9DT01NQU5ELCB0aXRsZTogY21kLnRpdGxlIH07XG59XG5cbnR5cGUgTHNwUmFuZ2UgPSB7IHN0YXJ0OiB7IGxpbmU6IG51bWJlcjsgY2hhcmFjdGVyOiBudW1iZXIgfTsgZW5kOiB7IGxpbmU6IG51bWJlcjsgY2hhcmFjdGVyOiBudW1iZXIgfSB9O1xuXG4vKiogTW9uYWNvIGNvbXBsZXRpb24gaXRlbSBjYXJyeWluZyB0aGUgb3JpZ2luYXRpbmcgTFNQIGl0ZW0gc28gcmVzb2x2ZSBjYW4gZmV0Y2ggaXRzIGltcG9ydCBlZGl0cy4gKi9cbnR5cGUgTW9uYWNvQ29tcGxldGlvbkl0ZW0gPSBtb25hY28ubGFuZ3VhZ2VzLkNvbXBsZXRpb25JdGVtICYgeyBfbHNwPzogQ29tcGxldGlvbkl0ZW0gfTtcblxuZnVuY3Rpb24gdGV4dEVkaXRUb01vbmFjbyhlZGl0OiBUZXh0RWRpdCk6IG1vbmFjby5sYW5ndWFnZXMuVGV4dEVkaXQge1xuICAgIHJldHVybiB7IHJhbmdlOiBsc3BSYW5nZVRvTW9uYWNvKGVkaXQucmFuZ2UpLCB0ZXh0OiBlZGl0Lm5ld1RleHQgfTtcbn1cblxuZnVuY3Rpb24gbW9uYWNvUmFuZ2VUb0xzcChyOiBtb25hY28uSVJhbmdlKTogTHNwUmFuZ2Uge1xuICAgIHJldHVybiB7XG4gICAgICAgIHN0YXJ0OiB7IGxpbmU6IHIuc3RhcnRMaW5lTnVtYmVyIC0gMSwgY2hhcmFjdGVyOiByLnN0YXJ0Q29sdW1uIC0gMSB9LFxuICAgICAgICBlbmQ6ICAgeyBsaW5lOiByLmVuZExpbmVOdW1iZXIgLSAxLCBjaGFyYWN0ZXI6IHIuZW5kQ29sdW1uIC0gMSB9LFxuICAgIH07XG59XG5cbi8qKiBUcnVlIHdoZW4gdHdvIExTUCByYW5nZXMgaW50ZXJzZWN0ICh1c2VkIHRvIHBpY2sgdGhlIGRpYWdub3N0aWNzIHJlbGV2YW50IHRvIGEgY29kZS1hY3Rpb24gcmVxdWVzdCkuICovXG5mdW5jdGlvbiByYW5nZXNPdmVybGFwKGE6IExzcFJhbmdlLCBiOiBMc3BSYW5nZSk6IGJvb2xlYW4ge1xuICAgIGNvbnN0IG5vdEFmdGVyID0gKHA6IHsgbGluZTogbnVtYmVyOyBjaGFyYWN0ZXI6IG51bWJlciB9LCBxOiB7IGxpbmU6IG51bWJlcjsgY2hhcmFjdGVyOiBudW1iZXIgfSkgPT5cbiAgICAgICAgcC5saW5lIDwgcS5saW5lIHx8IChwLmxpbmUgPT09IHEubGluZSAmJiBwLmNoYXJhY3RlciA8PSBxLmNoYXJhY3Rlcik7XG4gICAgcmV0dXJuIG5vdEFmdGVyKGEuc3RhcnQsIGIuZW5kKSAmJiBub3RBZnRlcihiLnN0YXJ0LCBhLmVuZCk7XG59XG5cbmZ1bmN0aW9uIGxzcENvZGVBY3Rpb25Ub01vbmFjbyhhY3Rpb246IENvZGVBY3Rpb24gfCBDb21tYW5kKTogbW9uYWNvLmxhbmd1YWdlcy5Db2RlQWN0aW9uIHtcbiAgICBjb25zdCBpc0NvbW1hbmQgPSB0eXBlb2YgKGFjdGlvbiBhcyBDb21tYW5kKS5jb21tYW5kID09PSAnc3RyaW5nJztcbiAgICBjb25zdCB0aXRsZSA9IGFjdGlvbi50aXRsZVxuICAgICAgICA/PyAoaXNDb21tYW5kID8gKGFjdGlvbiBhcyBDb21tYW5kKS5jb21tYW5kIDogKGFjdGlvbiBhcyBDb2RlQWN0aW9uKS5jb21tYW5kPy50aXRsZSlcbiAgICAgICAgPz8gJ0FjdGlvbic7XG4gICAgY29uc3Qga2luZCA9IGlzQ29tbWFuZCA/ICdxdWlja2ZpeCcgOiAoKGFjdGlvbiBhcyBDb2RlQWN0aW9uKS5raW5kID8/ICdxdWlja2ZpeCcpO1xuICAgIHJldHVybiB7XG4gICAgICAgIHRpdGxlLFxuICAgICAgICBraW5kLFxuICAgICAgICBkaWFnbm9zdGljczogW10sXG4gICAgICAgIGlzUHJlZmVycmVkOiAoYWN0aW9uIGFzIENvZGVBY3Rpb24pLmlzUHJlZmVycmVkLFxuICAgICAgICAvLyBBcHBseSBsYXppbHkgdGhyb3VnaCBvdXIgY29tbWFuZCBzbyB3ZSBjYW4gcmVzb2x2ZSwgcnVuIHNlcnZlciBjb21tYW5kcyBhbmQgYXBwbHkgZWRpdHMgdW5pZm9ybWx5LlxuICAgICAgICBjb21tYW5kOiB7IGlkOiBBUFBMWV9BQ1RJT05fQ09NTUFORCwgdGl0bGUsIGFyZ3VtZW50czogW2FjdGlvbl0gfSxcbiAgICB9O1xufVxuXG5hc3luYyBmdW5jdGlvbiBhcHBseUNvZGVBY3Rpb24oYWN0aW9uOiBDb2RlQWN0aW9uIHwgQ29tbWFuZCk6IFByb21pc2U8dm9pZD4ge1xuICAgIGlmICghX2Nvbm4pIHJldHVybjtcbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIChhY3Rpb24gYXMgQ29tbWFuZCkuY29tbWFuZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGF3YWl0IHJ1blNlcnZlckNvbW1hbmQoYWN0aW9uIGFzIENvbW1hbmQpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGxldCByZXNvbHZlZCA9IGFjdGlvbiBhcyBDb2RlQWN0aW9uO1xuICAgICAgICBpZiAoIXJlc29sdmVkLmVkaXQgJiYgKHJlc29sdmVkIGFzIHsgZGF0YT86IHVua25vd24gfSkuZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXNvbHZlZCA9IGF3YWl0IF9jb25uLnNlbmRSZXF1ZXN0KCdjb2RlQWN0aW9uL3Jlc29sdmUnLCByZXNvbHZlZCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHJlc29sdmVkLmVkaXQpIGFwcGx5V29ya3NwYWNlRWRpdChyZXNvbHZlZC5lZGl0KTtcbiAgICAgICAgaWYgKHJlc29sdmVkLmNvbW1hbmQpIGF3YWl0IHJ1blNlcnZlckNvbW1hbmQocmVzb2x2ZWQuY29tbWFuZCk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjb25zb2xlLndhcm4oJ1tqYXZhLWxzcF0gY29kZSBhY3Rpb24gZmFpbGVkOicsIChlIGFzIEVycm9yKT8ubWVzc2FnZSA/PyBlKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGlzV29ya3NwYWNlRWRpdCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFdvcmtzcGFjZUVkaXQge1xuICAgIHJldHVybiAhIXZhbHVlICYmICghISh2YWx1ZSBhcyBXb3Jrc3BhY2VFZGl0KS5jaGFuZ2VzIHx8ICEhKHZhbHVlIGFzIFdvcmtzcGFjZUVkaXQpLmRvY3VtZW50Q2hhbmdlcyk7XG59XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1blNlcnZlckNvbW1hbmQoY21kOiBDb21tYW5kKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFfY29ubiB8fCAhY21kPy5jb21tYW5kKSByZXR1cm47XG4gICAgaWYgKEdFTkVSQVRFW2NtZC5jb21tYW5kXSkge1xuICAgICAgICBhd2FpdCBydW5HZW5lcmF0ZShjbWQuY29tbWFuZCwgY21kLmFyZ3VtZW50cyA/PyBbXSk7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3dvcmtzcGFjZS9leGVjdXRlQ29tbWFuZCcsIHsgY29tbWFuZDogY21kLmNvbW1hbmQsIGFyZ3VtZW50czogY21kLmFyZ3VtZW50cyA/PyBbXSB9KTtcbiAgICBpZiAoaXNXb3Jrc3BhY2VFZGl0KHJlc3VsdCkpIGFwcGx5V29ya3NwYWNlRWRpdChyZXN1bHQpO1xufVxuXG5pbnRlcmZhY2UgR2VuZXJhdGVTcGVjIHtcbiAgICBsYWJlbDogc3RyaW5nO1xuICAgIHN0YXR1czogc3RyaW5nO1xuICAgIGdlbmVyYXRlOiBzdHJpbmc7XG4gICAgbWVtYmVyczogKHN0YXR1czogYW55KSA9PiBBcnJheTx7IGxhYmVsOiBzdHJpbmc7IHJlZjogYW55IH0+O1xuICAgIGJ1aWxkQXJnczogKHByb21wdEFyZ3M6IGFueVtdLCBzdGF0dXM6IGFueSwgc2VsZWN0ZWQ6IGFueVtdKSA9PiBhbnlbXTtcbn1cblxuLyoqIE1lbWJlci1uYW1lZCBmaWVsZHMgXHUyMTkyIHBpY2tlciBsYWJlbHMuICovXG5mdW5jdGlvbiBmaWVsZExhYmVsKGY6IGFueSk6IHN0cmluZyB7XG4gICAgY29uc3QgbmFtZSA9IGY/Lm5hbWUgPz8gZj8uZmllbGROYW1lID8/ICcnO1xuICAgIGNvbnN0IHR5cGUgPSBmPy50eXBlID8/IGY/LnR5cGVOYW1lO1xuICAgIHJldHVybiB0eXBlID8gYCR7bmFtZX06ICR7dHlwZX1gIDogYCR7bmFtZX1gO1xufVxuXG4vKipcbiAqIFRoZSBKRFQuTFMgc291cmNlLWdlbmVyYXRpb24gY29tbWFuZHMgKGNvbnN0cnVjdG9ycywgZ2V0dGVycy9zZXR0ZXJzLCB0b1N0cmluZywgaGFzaENvZGUvZXF1YWxzKS5cbiAqIEVhY2ggbWFwcyB0aGUgY2xpZW50IFwiKlByb21wdFwiIGNvbW1hbmQgdG8gdGhlIHNlcnZlciBzdGF0dXMgKyBnZW5lcmF0ZSBkZWxlZ2F0ZSBjb21tYW5kczsgdGhlIHN0YXR1c1xuICogY2FsbCB5aWVsZHMgdGhlIGNhbmRpZGF0ZSBmaWVsZHMgc2hvd24gaW4gdGhlIG1lbWJlciBwaWNrZXIsIHRoZSBnZW5lcmF0ZSBjYWxsIHJldHVybnMgdGhlIGVkaXQuXG4gKi9cbmNvbnN0IEdFTkVSQVRFOiBSZWNvcmQ8c3RyaW5nLCBHZW5lcmF0ZVNwZWM+ID0ge1xuICAgICdqYXZhLmFjdGlvbi5nZW5lcmF0ZUNvbnN0cnVjdG9yc1Byb21wdCc6IHtcbiAgICAgICAgbGFiZWw6ICdTZWxlY3QgZmllbGRzIGFuZCBjb25zdHJ1Y3RvcnMnLFxuICAgICAgICBzdGF0dXM6ICdqYXZhLmFjdGlvbi5jaGVja0NvbnN0cnVjdG9yc1N0YXR1cycsXG4gICAgICAgIGdlbmVyYXRlOiAnamF2YS5hY3Rpb24uZ2VuZXJhdGVDb25zdHJ1Y3RvcnMnLFxuICAgICAgICBtZW1iZXJzOiAocykgPT4gKHM/LmZpZWxkcyA/PyBbXSkubWFwKChmOiBhbnkpID0+ICh7IGxhYmVsOiBmaWVsZExhYmVsKGYpLCByZWY6IGYgfSkpLFxuICAgICAgICBidWlsZEFyZ3M6IChhcmdzLCBzLCBzZWwpID0+IFthcmdzWzBdLCB7IGNvbnN0cnVjdG9yczogcz8uY29uc3RydWN0b3JzID8/IFtdLCBmaWVsZHM6IHNlbC5tYXAobSA9PiBtLnJlZikgfV0sXG4gICAgfSxcbiAgICAnamF2YS5hY3Rpb24uZ2VuZXJhdGVUb1N0cmluZ1Byb21wdCc6IHtcbiAgICAgICAgbGFiZWw6ICdTZWxlY3QgZmllbGRzIHRvIGluY2x1ZGUgaW4gdG9TdHJpbmcoKScsXG4gICAgICAgIHN0YXR1czogJ2phdmEuYWN0aW9uLmNoZWNrVG9TdHJpbmdTdGF0dXMnLFxuICAgICAgICBnZW5lcmF0ZTogJ2phdmEuYWN0aW9uLmdlbmVyYXRlVG9TdHJpbmcnLFxuICAgICAgICBtZW1iZXJzOiAocykgPT4gKHM/LmZpZWxkcyA/PyBbXSkubWFwKChmOiBhbnkpID0+ICh7IGxhYmVsOiBmaWVsZExhYmVsKGYpLCByZWY6IGYgfSkpLFxuICAgICAgICBidWlsZEFyZ3M6IChhcmdzLCBfcywgc2VsKSA9PiBbYXJnc1swXSwgc2VsLm1hcChtID0+IG0ucmVmKV0sXG4gICAgfSxcbiAgICAnamF2YS5hY3Rpb24uaGFzaENvZGVFcXVhbHNQcm9tcHQnOiB7XG4gICAgICAgIGxhYmVsOiAnU2VsZWN0IGZpZWxkcyBmb3IgaGFzaENvZGUoKSBhbmQgZXF1YWxzKCknLFxuICAgICAgICBzdGF0dXM6ICdqYXZhLmFjdGlvbi5jaGVja0hhc2hDb2RlRXF1YWxzU3RhdHVzJyxcbiAgICAgICAgZ2VuZXJhdGU6ICdqYXZhLmFjdGlvbi5nZW5lcmF0ZUhhc2hDb2RlRXF1YWxzJyxcbiAgICAgICAgbWVtYmVyczogKHMpID0+IChzPy5maWVsZHMgPz8gW10pLm1hcCgoZjogYW55KSA9PiAoeyBsYWJlbDogZmllbGRMYWJlbChmKSwgcmVmOiBmIH0pKSxcbiAgICAgICAgYnVpbGRBcmdzOiAoYXJncywgX3MsIHNlbCkgPT4gW2FyZ3NbMF0sIHNlbC5tYXAobSA9PiBtLnJlZiksIGZhbHNlXSxcbiAgICB9LFxuICAgICdqYXZhLmFjdGlvbi5nZW5lcmF0ZUFjY2Vzc29yc1Byb21wdCc6IHtcbiAgICAgICAgbGFiZWw6ICdTZWxlY3QgZmllbGRzIHRvIGdlbmVyYXRlIGdldHRlcnMgYW5kIHNldHRlcnMnLFxuICAgICAgICBzdGF0dXM6ICdqYXZhLmFjdGlvbi5jaGVja0FjY2Vzc29yc1N0YXR1cycsXG4gICAgICAgIGdlbmVyYXRlOiAnamF2YS5hY3Rpb24uZ2VuZXJhdGVBY2Nlc3NvcnMnLFxuICAgICAgICBtZW1iZXJzOiAocykgPT4gKHM/LmFjY2Vzc29ycyA/PyBzID8/IFtdKS5tYXAoKGE6IGFueSkgPT4gKHsgbGFiZWw6IGZpZWxkTGFiZWwoYSksIHJlZjogYSB9KSksXG4gICAgICAgIGJ1aWxkQXJnczogKGFyZ3MsIF9zLCBzZWwpID0+IFthcmdzWzBdLCBzZWwubWFwKG0gPT4gbS5yZWYpXSxcbiAgICB9LFxuICAgICdqYXZhLmFjdGlvbi5vdmVycmlkZU1ldGhvZHNQcm9tcHQnOiB7XG4gICAgICAgIGxhYmVsOiAnU2VsZWN0IG1ldGhvZHMgdG8gb3ZlcnJpZGUgb3IgaW1wbGVtZW50JyxcbiAgICAgICAgc3RhdHVzOiAnamF2YS5hY3Rpb24ubGlzdE92ZXJyaWRhYmxlTWV0aG9kcycsXG4gICAgICAgIGdlbmVyYXRlOiAnamF2YS5hY3Rpb24uYWRkT3ZlcnJpZGFibGVNZXRob2RzJyxcbiAgICAgICAgbWVtYmVyczogKHMpID0+IChzPy5tZXRob2RzID8/IFtdKS5tYXAoKG06IGFueSkgPT4gKHtcbiAgICAgICAgICAgIGxhYmVsOiBgJHttLm5hbWV9KCR7KG0ucGFyYW1ldGVycyA/PyBbXSkuam9pbignLCAnKX0pJHttLmRlY2xhcmluZ0NsYXNzID8gJyA6ICcgKyBtLmRlY2xhcmluZ0NsYXNzIDogJyd9YCxcbiAgICAgICAgICAgIHJlZjogbSxcbiAgICAgICAgfSkpLFxuICAgICAgICBidWlsZEFyZ3M6IChhcmdzLCBzdGF0dXMsIHNlbCkgPT4gW2FyZ3NbMF0sIHsgb3ZlcnJpZGFibGVNZXRob2RzOiBzZWwubWFwKG0gPT4gbS5yZWYpLCB0eXBlOiBzdGF0dXM/LnR5cGUgfV0sXG4gICAgfSxcbn07XG5cbmFzeW5jIGZ1bmN0aW9uIHJ1bkdlbmVyYXRlKHByb21wdElkOiBzdHJpbmcsIGFyZ3M6IGFueVtdKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgaWYgKCFfY29ubikgcmV0dXJuO1xuICAgIGNvbnN0IHNwZWMgPSBHRU5FUkFURVtwcm9tcHRJZF07XG4gICAgY29uc3Qgc3RhdHVzID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3dvcmtzcGFjZS9leGVjdXRlQ29tbWFuZCcsIHsgY29tbWFuZDogc3BlYy5zdGF0dXMsIGFyZ3VtZW50czogYXJncyB9KTtcbiAgICBpZiAoIXN0YXR1cykgcmV0dXJuO1xuICAgIGNvbnN0IG1lbWJlcnMgPSBzcGVjLm1lbWJlcnMoc3RhdHVzKTtcbiAgICBsZXQgc2VsZWN0ZWQgPSBtZW1iZXJzO1xuICAgIGNvbnN0IHBpY2tlciA9IChnbG9iYWxUaGlzIGFzIGFueSkuamF2YUxzcE1lbWJlclBpY2tlcjtcbiAgICBpZiAobWVtYmVycy5sZW5ndGggJiYgdHlwZW9mIHBpY2tlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICBjb25zdCBjaG9zZW46IHN0cmluZ1tdIHwgbnVsbCA9IGF3YWl0IHBpY2tlcihzcGVjLmxhYmVsLCBtZW1iZXJzLm1hcChtID0+IG0ubGFiZWwpKTtcbiAgICAgICAgaWYgKGNob3NlbiA9PT0gbnVsbCkgcmV0dXJuOyAvLyB1c2VyIGNhbmNlbGxlZCB0aGUgZGlhbG9nXG4gICAgICAgIHNlbGVjdGVkID0gbWVtYmVycy5maWx0ZXIobSA9PiBjaG9zZW4uaW5jbHVkZXMobS5sYWJlbCkpO1xuICAgIH1cbiAgICBjb25zdCBlZGl0ID0gYXdhaXQgX2Nvbm4uc2VuZFJlcXVlc3QoJ3dvcmtzcGFjZS9leGVjdXRlQ29tbWFuZCcsIHtcbiAgICAgICAgY29tbWFuZDogc3BlYy5nZW5lcmF0ZSxcbiAgICAgICAgYXJndW1lbnRzOiBzcGVjLmJ1aWxkQXJncyhhcmdzLCBzdGF0dXMsIHNlbGVjdGVkKSxcbiAgICB9KTtcbiAgICBpZiAoaXNXb3Jrc3BhY2VFZGl0KGVkaXQpKSBhcHBseVdvcmtzcGFjZUVkaXQoZWRpdCk7XG59XG5cbi8qKiBHcm91cHMgYSB3b3Jrc3BhY2UgZWRpdCdzIHRleHQgZWRpdHMgYnkgZG9jdW1lbnQgYW5kIGFwcGxpZXMgdGhlbSBpbiBwbGFjZSB0byBvcGVuIE1vbmFjbyBtb2RlbHMuICovXG5mdW5jdGlvbiBhcHBseVdvcmtzcGFjZUVkaXQoZWRpdDogV29ya3NwYWNlRWRpdCB8IG51bGwgfCB1bmRlZmluZWQpOiB2b2lkIHtcbiAgICBpZiAoIWVkaXQpIHJldHVybjtcbiAgICBjb25zdCBieVVyaTogUmVjb3JkPHN0cmluZywgVGV4dEVkaXRbXT4gPSB7fTtcbiAgICBpZiAoZWRpdC5jaGFuZ2VzKSB7XG4gICAgICAgIGZvciAoY29uc3QgdXJpIGluIGVkaXQuY2hhbmdlcykgYnlVcmlbdXJpXSA9IChieVVyaVt1cmldID8/IFtdKS5jb25jYXQoZWRpdC5jaGFuZ2VzW3VyaV0pO1xuICAgIH1cbiAgICBpZiAoZWRpdC5kb2N1bWVudENoYW5nZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBkYyBvZiBlZGl0LmRvY3VtZW50Q2hhbmdlcyBhcyBhbnlbXSkge1xuICAgICAgICAgICAgaWYgKGRjPy50ZXh0RG9jdW1lbnQ/LnVyaSAmJiBBcnJheS5pc0FycmF5KGRjLmVkaXRzKSkge1xuICAgICAgICAgICAgICAgIGJ5VXJpW2RjLnRleHREb2N1bWVudC51cmldID0gKGJ5VXJpW2RjLnRleHREb2N1bWVudC51cmldID8/IFtdKS5jb25jYXQoZGMuZWRpdHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIGZvciAoY29uc3QgdXJpIGluIGJ5VXJpKSB7XG4gICAgICAgIGNvbnN0IG1vZGVsID0gbW9uYWNvLmVkaXRvci5nZXRNb2RlbHMoKS5maW5kKG0gPT4gbS51cmkudG9TdHJpbmcoKSA9PT0gdXJpKTtcbiAgICAgICAgaWYgKCFtb2RlbCkgY29udGludWU7XG4gICAgICAgIGNvbnN0IG9wcyA9IGJ5VXJpW3VyaV0ubWFwKGUgPT4gKHsgcmFuZ2U6IGxzcFJhbmdlVG9Nb25hY28oZS5yYW5nZSksIHRleHQ6IGUubmV3VGV4dCwgZm9yY2VNb3ZlTWFya2VyczogdHJ1ZSB9KSk7XG4gICAgICAgIG1vZGVsLnB1c2hFZGl0T3BlcmF0aW9ucyhbXSwgb3BzLCAoKSA9PiBudWxsKTtcbiAgICB9XG59XG5cbi8qKiBDb252ZXJ0cyBhbiBMU1Agd29ya3NwYWNlIGVkaXQgaW50byB0aGUgTW9uYWNvIHNoYXBlIHJldHVybmVkIGJ5IHRoZSByZW5hbWUgcHJvdmlkZXIuICovXG5mdW5jdGlvbiB3b3Jrc3BhY2VFZGl0VG9Nb25hY28oZWRpdDogV29ya3NwYWNlRWRpdCB8IG51bGwpOiBtb25hY28ubGFuZ3VhZ2VzLldvcmtzcGFjZUVkaXQge1xuICAgIGNvbnN0IGVkaXRzOiBhbnlbXSA9IFtdO1xuICAgIGNvbnN0IHB1c2ggPSAodXJpOiBzdHJpbmcsIGxpc3Q6IFRleHRFZGl0W10pID0+IHtcbiAgICAgICAgZm9yIChjb25zdCBlIG9mIGxpc3QpIHtcbiAgICAgICAgICAgIGVkaXRzLnB1c2goeyByZXNvdXJjZTogbW9uYWNvLlVyaS5wYXJzZSh1cmkpLCB0ZXh0RWRpdDogeyByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhlLnJhbmdlKSwgdGV4dDogZS5uZXdUZXh0IH0sIHZlcnNpb25JZDogdW5kZWZpbmVkIH0pO1xuICAgICAgICB9XG4gICAgfTtcbiAgICBpZiAoZWRpdD8uY2hhbmdlcykge1xuICAgICAgICBmb3IgKGNvbnN0IHVyaSBpbiBlZGl0LmNoYW5nZXMpIHB1c2godXJpLCBlZGl0LmNoYW5nZXNbdXJpXSk7XG4gICAgfVxuICAgIGlmIChlZGl0Py5kb2N1bWVudENoYW5nZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBkYyBvZiBlZGl0LmRvY3VtZW50Q2hhbmdlcyBhcyBhbnlbXSkge1xuICAgICAgICAgICAgaWYgKGRjPy50ZXh0RG9jdW1lbnQ/LnVyaSAmJiBBcnJheS5pc0FycmF5KGRjLmVkaXRzKSkgcHVzaChkYy50ZXh0RG9jdW1lbnQudXJpLCBkYy5lZGl0cyk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHsgZWRpdHMgfTtcbn1cblxuLyoqIE1hcHMgYSB2aXJ0dWFsIGVkaXRvciBVUkkgYmFjayB0byB0aGUgSURFIHdvcmtzcGFjZSBwYXRoICh7QGNvZGUgL3dzL3Byb2ovLi4ufSkuICovXG5mdW5jdGlvbiB1cmlUb1dvcmtzcGFjZVBhdGgodXJpOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgICBpZiAoIXVyaS5zdGFydHNXaXRoKFZJUlRVQUxfRklMRV9QUkVGSVgpKSByZXR1cm4gbnVsbDtcbiAgICByZXR1cm4gZGVjb2RlVVJJQ29tcG9uZW50KHVyaS5zdWJzdHJpbmcoVklSVFVBTF9GSUxFX1BSRUZJWC5sZW5ndGgpKTtcbn1cblxuLyoqIFJlYWRzIGEgd29ya3NwYWNlIGZpbGUncyBjdXJyZW50IHRleHQgb3ZlciB0aGUgSURFIFJFU1QgQVBJLiAqL1xuYXN5bmMgZnVuY3Rpb24gZmV0Y2hXb3Jrc3BhY2VGaWxlVGV4dChpZGVQYXRoOiBzdHJpbmcpOiBQcm9taXNlPHN0cmluZz4ge1xuICAgIGNvbnN0IHJlc3BvbnNlID0gYXdhaXQgZmV0Y2goJy9zZXJ2aWNlcy9pZGUvd29ya3NwYWNlcycgKyBpZGVQYXRoLCB7IGhlYWRlcnM6IHsgJ1gtUmVxdWVzdGVkLVdpdGgnOiAnRmV0Y2gnIH0gfSk7XG4gICAgaWYgKCFyZXNwb25zZS5vaykge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYENvdWxkIG5vdCByZWFkICR7aWRlUGF0aH0gKEhUVFAgJHtyZXNwb25zZS5zdGF0dXN9KWApO1xuICAgIH1cbiAgICByZXR1cm4gcmVzcG9uc2UudGV4dCgpO1xufVxuXG4vKiogQXBwbGllcyBMU1AgdGV4dCBlZGl0cyB0byBhIHN0cmluZy4gT2Zmc2V0cyBhcmUgcmVzb2x2ZWQgYWdhaW5zdCB0aGUgb3JpZ2luYWwgdGV4dCBhbmQgZWRpdHMgYXJlXG4gKiAgYXBwbGllZCBmcm9tIHRoZSBlbmQgYmFja3dhcmRzLCBzbyBlYXJsaWVyIG9mZnNldHMgc3RheSB2YWxpZC4gKi9cbmZ1bmN0aW9uIGFwcGx5RWRpdHNUb1RleHQodGV4dDogc3RyaW5nLCBlZGl0czogVGV4dEVkaXRbXSk6IHN0cmluZyB7XG4gICAgY29uc3QgbGluZVN0YXJ0cyA9IFswXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRleHQubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgaWYgKHRleHQuY2hhckNvZGVBdChpKSA9PT0gMTAgLyogXFxuICovKSBsaW5lU3RhcnRzLnB1c2goaSArIDEpO1xuICAgIH1cbiAgICBjb25zdCBvZmZzZXQgPSAocDogeyBsaW5lOiBudW1iZXI7IGNoYXJhY3RlcjogbnVtYmVyIH0pID0+IChsaW5lU3RhcnRzW3AubGluZV0gPz8gdGV4dC5sZW5ndGgpICsgcC5jaGFyYWN0ZXI7XG4gICAgY29uc3Qgb3JkZXJlZCA9IGVkaXRzLnNsaWNlKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAuc29ydCgoYSwgYikgPT4gb2Zmc2V0KGIucmFuZ2Uuc3RhcnQpIC0gb2Zmc2V0KGEucmFuZ2Uuc3RhcnQpKTtcbiAgICBsZXQgcmVzdWx0ID0gdGV4dDtcbiAgICBmb3IgKGNvbnN0IGUgb2Ygb3JkZXJlZCkge1xuICAgICAgICByZXN1bHQgPSByZXN1bHQuc2xpY2UoMCwgb2Zmc2V0KGUucmFuZ2Uuc3RhcnQpKSArIGUubmV3VGV4dCArIHJlc3VsdC5zbGljZShvZmZzZXQoZS5yYW5nZS5lbmQpKTtcbiAgICB9XG4gICAgcmV0dXJuIHJlc3VsdDtcbn1cblxuLyoqXG4gKiBBcHBsaWVzIGEgSkRULkxTIHJlbmFtZSB7QGxpbmsgV29ya3NwYWNlRWRpdH0gYWNyb3NzIHRoZSB3aG9sZSB3b3Jrc3BhY2U6IHRleHQgZWRpdHMgaW4gZXZlcnlcbiAqIGFmZmVjdGVkIGZpbGUgcGx1cyBhbnkge0Bjb2RlIFJlbmFtZUZpbGV9IG9wZXJhdGlvbiAoYSBwdWJsaWMtdHlwZSByZW5hbWUgcmVuYW1lcyBpdHMgb3duXG4gKiB7QGNvZGUgLmphdmF9IGZpbGUpLiBUaGUgY3VycmVudCBmaWxlJ3MgZWRpdHMgZ28gdGhyb3VnaCB0aGUgbGl2ZSBNb25hY28gbW9kZWw7IHRoZSByZXN0IGFyZSByZWFkLFxuICogZWRpdGVkIGFuZCB3cml0dGVuIGJhY2sgb3ZlciBSRVNULiBQZXJzaXN0ZW5jZSAoQ1NSRi1ndWFyZGVkIHdyaXRlcywgdGhlIHRhYiBzd2l0Y2ggd2hlbiB0aGUgY3VycmVudFxuICogZmlsZSBpcyByZW5hbWVkLCBhbmQgcmVsb2FkaW5nIG90aGVyIG9wZW4gZWRpdG9ycykgaXMgZGVsZWdhdGVkIHRvIHRoZSBJREUgdmlhIGphdmFMc3BQZXJzaXN0UmVuYW1lLlxuICovXG5hc3luYyBmdW5jdGlvbiBhcHBseVJlbmFtZUFjcm9zc1dvcmtzcGFjZShtb2RlbDogbW9uYWNvLmVkaXRvci5JVGV4dE1vZGVsLCBlZGl0OiBXb3Jrc3BhY2VFZGl0KTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgY3VycmVudFVyaSA9IG1vZGVsLnVyaS50b1N0cmluZygpO1xuICAgIGNvbnN0IHRleHRCeVVyaTogUmVjb3JkPHN0cmluZywgVGV4dEVkaXRbXT4gPSB7fTtcbiAgICBjb25zdCByZW5hbWVCeVVyaTogUmVjb3JkPHN0cmluZywgc3RyaW5nPiA9IHt9O1xuXG4gICAgaWYgKGVkaXQuY2hhbmdlcykge1xuICAgICAgICBmb3IgKGNvbnN0IHVyaSBpbiBlZGl0LmNoYW5nZXMpIHRleHRCeVVyaVt1cmldID0gKHRleHRCeVVyaVt1cmldID8/IFtdKS5jb25jYXQoZWRpdC5jaGFuZ2VzW3VyaV0pO1xuICAgIH1cbiAgICBpZiAoZWRpdC5kb2N1bWVudENoYW5nZXMpIHtcbiAgICAgICAgZm9yIChjb25zdCBkYyBvZiBlZGl0LmRvY3VtZW50Q2hhbmdlcyBhcyBhbnlbXSkge1xuICAgICAgICAgICAgaWYgKGRjPy5raW5kID09PSAncmVuYW1lJyAmJiBkYy5vbGRVcmkgJiYgZGMubmV3VXJpKSB7XG4gICAgICAgICAgICAgICAgcmVuYW1lQnlVcmlbZGMub2xkVXJpXSA9IGRjLm5ld1VyaTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZGM/LnRleHREb2N1bWVudD8udXJpICYmIEFycmF5LmlzQXJyYXkoZGMuZWRpdHMpKSB7XG4gICAgICAgICAgICAgICAgdGV4dEJ5VXJpW2RjLnRleHREb2N1bWVudC51cmldID0gKHRleHRCeVVyaVtkYy50ZXh0RG9jdW1lbnQudXJpXSA/PyBbXSkuY29uY2F0KGRjLmVkaXRzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEpEVC5MUyBtYXkga2V5IGEgZmlsZSdzIHRleHQgZWRpdHMgYnkgaXRzIFBPU1QtcmVuYW1lIFVSSSAoZG9jdW1lbnRDaGFuZ2VzIGFyZSBvcmRlcmVkLCBhbmQgdGhlXG4gICAgLy8gcmVuYW1lIGNhbiBwcmVjZWRlIHRoZSBlZGl0KS4gUmUtYXR0cmlidXRlIGV2ZXJ5IGVkaXQgdG8gdGhlIG9uLWRpc2sgKG9sZCkgVVJJIHNvIHRoZSBjb250ZW50IGlzXG4gICAgLy8gZWRpdGVkIGNvcnJlY3RseSBiZWZvcmUgdGhlIGZpbGUgaXMgd3JpdHRlbi9yZW5hbWVkIFx1MjAxNCBvdGhlcndpc2UgdGhlIG5ldyBmaWxlIGtlZXBzIHRoZSBvbGQgdHlwZVxuICAgIC8vIG5hbWUgYW5kIHRyaWdnZXJzIFwiVGhlIHB1YmxpYyB0eXBlIFggbXVzdCBiZSBkZWZpbmVkIGluIGl0cyBvd24gZmlsZVwiLlxuICAgIGNvbnN0IG5ld1RvT2xkOiBSZWNvcmQ8c3RyaW5nLCBzdHJpbmc+ID0ge307XG4gICAgZm9yIChjb25zdCBvbGRVcmkgaW4gcmVuYW1lQnlVcmkpIG5ld1RvT2xkW3JlbmFtZUJ5VXJpW29sZFVyaV1dID0gb2xkVXJpO1xuICAgIGNvbnN0IGVkaXRzQnlPbGQ6IFJlY29yZDxzdHJpbmcsIFRleHRFZGl0W10+ID0ge307XG4gICAgZm9yIChjb25zdCB1cmkgaW4gdGV4dEJ5VXJpKSB7XG4gICAgICAgIGNvbnN0IG9uRGlza1VyaSA9IG5ld1RvT2xkW3VyaV0gPz8gdXJpO1xuICAgICAgICBlZGl0c0J5T2xkW29uRGlza1VyaV0gPSAoZWRpdHNCeU9sZFtvbkRpc2tVcmldID8/IFtdKS5jb25jYXQodGV4dEJ5VXJpW3VyaV0pO1xuICAgIH1cblxuICAgIGNvbnN0IHBheWxvYWQ6IHtcbiAgICAgICAgY3VycmVudFBhdGg6IHN0cmluZyB8IG51bGw7XG4gICAgICAgIGN1cnJlbnRDb250ZW50OiBzdHJpbmcgfCBudWxsO1xuICAgICAgICBjdXJyZW50TmV3UGF0aDogc3RyaW5nIHwgbnVsbDtcbiAgICAgICAgd3JpdGVzOiBBcnJheTx7IHBhdGg6IHN0cmluZyB8IG51bGw7IGNvbnRlbnQ6IHN0cmluZyB9PjtcbiAgICAgICAgcmVuYW1lczogQXJyYXk8eyBvbGRQYXRoOiBzdHJpbmcgfCBudWxsOyBuZXdQYXRoOiBzdHJpbmcgfCBudWxsOyBjb250ZW50OiBzdHJpbmcgfT47XG4gICAgfSA9IHsgY3VycmVudFBhdGg6IHVyaVRvV29ya3NwYWNlUGF0aChjdXJyZW50VXJpKSwgY3VycmVudENvbnRlbnQ6IG51bGwsIGN1cnJlbnROZXdQYXRoOiBudWxsLCB3cml0ZXM6IFtdLCByZW5hbWVzOiBbXSB9O1xuXG4gICAgY29uc3Qgd2F0Y2hlZENoYW5nZXM6IEFycmF5PHsgdXJpOiBzdHJpbmc7IHR5cGU6IG51bWJlciB9PiA9IFtdO1xuICAgIGNvbnN0IG9sZFVyaXMgPSBuZXcgU2V0PHN0cmluZz4oWy4uLk9iamVjdC5rZXlzKGVkaXRzQnlPbGQpLCAuLi5PYmplY3Qua2V5cyhyZW5hbWVCeVVyaSldKTtcbiAgICBmb3IgKGNvbnN0IG9sZFVyaSBvZiBvbGRVcmlzKSB7XG4gICAgICAgIGNvbnN0IGVkaXRzID0gZWRpdHNCeU9sZFtvbGRVcmldID8/IFtdO1xuICAgICAgICBsZXQgY29udGVudDogc3RyaW5nO1xuICAgICAgICBpZiAob2xkVXJpID09PSBjdXJyZW50VXJpKSB7XG4gICAgICAgICAgICBpZiAoZWRpdHMubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbW9kZWwucHVzaEVkaXRPcGVyYXRpb25zKFtdLCBlZGl0cy5tYXAoZSA9PiAoeyByYW5nZTogbHNwUmFuZ2VUb01vbmFjbyhlLnJhbmdlKSwgdGV4dDogZS5uZXdUZXh0LCBmb3JjZU1vdmVNYXJrZXJzOiB0cnVlIH0pKSwgKCkgPT4gbnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjb250ZW50ID0gbW9kZWwuZ2V0VmFsdWUoKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZSA9IGF3YWl0IGZldGNoV29ya3NwYWNlRmlsZVRleHQodXJpVG9Xb3Jrc3BhY2VQYXRoKG9sZFVyaSkgPz8gb2xkVXJpKTtcbiAgICAgICAgICAgIGNvbnRlbnQgPSBlZGl0cy5sZW5ndGggPyBhcHBseUVkaXRzVG9UZXh0KHNvdXJjZSwgZWRpdHMpIDogc291cmNlO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IG5ld1VyaSA9IHJlbmFtZUJ5VXJpW29sZFVyaV07XG4gICAgICAgIGlmIChvbGRVcmkgPT09IGN1cnJlbnRVcmkpIHtcbiAgICAgICAgICAgIHBheWxvYWQuY3VycmVudENvbnRlbnQgPSBjb250ZW50O1xuICAgICAgICAgICAgcGF5bG9hZC5jdXJyZW50TmV3UGF0aCA9IG5ld1VyaSA/IHVyaVRvV29ya3NwYWNlUGF0aChuZXdVcmkpIDogbnVsbDtcbiAgICAgICAgfSBlbHNlIGlmIChuZXdVcmkpIHtcbiAgICAgICAgICAgIHBheWxvYWQucmVuYW1lcy5wdXNoKHsgb2xkUGF0aDogdXJpVG9Xb3Jrc3BhY2VQYXRoKG9sZFVyaSksIG5ld1BhdGg6IHVyaVRvV29ya3NwYWNlUGF0aChuZXdVcmkpLCBjb250ZW50IH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcGF5bG9hZC53cml0ZXMucHVzaCh7IHBhdGg6IHVyaVRvV29ya3NwYWNlUGF0aChvbGRVcmkpLCBjb250ZW50IH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIEZpbGUtY2hhbmdlIGV2ZW50cyBmb3IgSkRULkxTIHNvIGl0IHJlLXN5bmNzIHdpdGhvdXQgYSBwYWdlIHJlZnJlc2guXG4gICAgICAgIGlmIChuZXdVcmkpIHtcbiAgICAgICAgICAgIHdhdGNoZWRDaGFuZ2VzLnB1c2goeyB1cmk6IG9sZFVyaSwgdHlwZTogMyAvKiBEZWxldGVkICovIH0sIHsgdXJpOiBuZXdVcmksIHR5cGU6IDEgLyogQ3JlYXRlZCAqLyB9KTtcbiAgICAgICAgICAgIF9vcGVuRmlsZXMuZGVsZXRlKG9sZFVyaSk7XG4gICAgICAgICAgICBfY29ubj8uc2VuZE5vdGlmaWNhdGlvbigndGV4dERvY3VtZW50L2RpZENsb3NlJywgeyB0ZXh0RG9jdW1lbnQ6IHsgdXJpOiBvbGRVcmkgfSB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHdhdGNoZWRDaGFuZ2VzLnB1c2goeyB1cmk6IG9sZFVyaSwgdHlwZTogMiAvKiBDaGFuZ2VkICovIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYXdhaXQgKGdsb2JhbFRoaXMgYXMgYW55KS5qYXZhTHNwUGVyc2lzdFJlbmFtZShwYXlsb2FkKTtcblxuICAgIC8vIEluZm9ybSBKRFQuTFMgb2YgdGhlIG9uLWRpc2sgY2hhbmdlcyBzbyB0aGUgcmVuYW1lZCB0eXBlJ3MgZGlhZ25vc3RpY3MgY2xlYXIgaW1tZWRpYXRlbHkuXG4gICAgaWYgKF9jb25uICYmIHdhdGNoZWRDaGFuZ2VzLmxlbmd0aCkge1xuICAgICAgICBfY29ubi5zZW5kTm90aWZpY2F0aW9uKCd3b3Jrc3BhY2UvZGlkQ2hhbmdlV2F0Y2hlZEZpbGVzJywgeyBjaGFuZ2VzOiB3YXRjaGVkQ2hhbmdlcyB9KTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGpkdGxzU2V0dGluZ3MoKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgamF2YToge1xuICAgICAgICAgICAgaW1wb3J0OiB7XG4gICAgICAgICAgICAgICAgbWF2ZW46ICAgICAgeyBlbmFibGVkOiB0cnVlIH0sXG4gICAgICAgICAgICAgICAgZ3JhZGxlOiAgICAgeyBlbmFibGVkOiBmYWxzZSB9LFxuICAgICAgICAgICAgICAgIGV4Y2x1c2lvbnM6IFsnKiovbm9kZV9tb2R1bGVzLyoqJywgJyoqLy5tZXRhZGF0YS8qKicsICcqKi9hcmNoZXR5cGUtcmVzb3VyY2VzLyoqJ10sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgYXV0b2J1aWxkOiB7IGVuYWJsZWQ6IHRydWUgfSxcbiAgICAgICAgICAgIGNvbXBsZXRpb246IHtcbiAgICAgICAgICAgICAgICBvdmVyd3JpdGU6ICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgICBndWVzc01ldGhvZEFyZ3VtZW50czogZmFsc2UsXG4gICAgICAgICAgICAgICAgZmlsdGVyZWRUeXBlczogW1xuICAgICAgICAgICAgICAgICAgICAnY29tLnN1bi4qJywgJ3N1bi4qJywgJ2pkay4qJyxcbiAgICAgICAgICAgICAgICAgICAgJ29yZy5lY2xpcHNlLmpkdC5pbnRlcm5hbC4qJyxcbiAgICAgICAgICAgICAgICAgICAgJ29yZy5lY2xpcHNlLmNvcmUuaW50ZXJuYWwuKicsXG4gICAgICAgICAgICAgICAgICAgICdvcmcuZWNsaXBzZS5vc2dpLmludGVybmFsLionLFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgaW1wb3J0T3JkZXI6IFsnamF2YScsICdqYXZheCcsICdvcmcnLCAnY29tJywgJyddLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHNpZ25hdHVyZUhlbHA6ICB7IGVuYWJsZWQ6IHRydWUgfSxcbiAgICAgICAgICAgIGZvcm1hdDogICAgICAgICB7IGVuYWJsZWQ6IHRydWUgfSxcbiAgICAgICAgICAgIHNhdmVBY3Rpb25zOiAgICB7IG9yZ2FuaXplSW1wb3J0czogZmFsc2UgfSxcbiAgICAgICAgICAgIGlubGF5SGludHM6ICAgICB7IHBhcmFtZXRlck5hbWVzOiB7IGVuYWJsZWQ6ICdhbGwnIH0gfSxcbiAgICAgICAgICAgIC8vIE9mZiBieSBkZWZhdWx0OiB0aGUgcmVmZXJlbmNlL2ltcGxlbWVudGF0aW9uIHNlYXJjaCBiZWhpbmQgdGhlc2UgQ29kZUxlbnNlcyBydW5zIGZvciBldmVyeVxuICAgICAgICAgICAgLy8gZGVjbGFyYXRpb24gb24gb3BlbiBhbmQgb24gZXZlcnkgZWRpdCBhbmQgZG9taW5hdGVzIEpEVC5MUyBsb2FkIG9uIGEgbGFyZ2UgY2xhc3NwYXRoLlxuICAgICAgICAgICAgcmVmZXJlbmNlc0NvZGVMZW5zOiAgICAgeyBlbmFibGVkOiBmYWxzZSB9LFxuICAgICAgICAgICAgaW1wbGVtZW50YXRpb25zQ29kZUxlbnM6IHsgZW5hYmxlZDogZmFsc2UgfSxcbiAgICAgICAgfSxcbiAgICB9O1xufVxuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjQgVHlwZUZveCBhbmQgb3RoZXJzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTElDRU5TRSBpbiB0aGUgcGFja2FnZSByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbmltcG9ydCB7IERpc3Bvc2FibGUgfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG5cbmV4cG9ydCBjbGFzcyBEaXNwb3NhYmxlQ29sbGVjdGlvbiBpbXBsZW1lbnRzIERpc3Bvc2FibGUge1xuICAgIHByb3RlY3RlZCByZWFkb25seSBkaXNwb3NhYmxlczogRGlzcG9zYWJsZVtdID0gW107XG5cbiAgICBkaXNwb3NlKCk6IHZvaWQge1xuICAgICAgICB3aGlsZSAodGhpcy5kaXNwb3NhYmxlcy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGlzcG9zYWJsZXMucG9wKCkhLmRpc3Bvc2UoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1c2goZGlzcG9zYWJsZTogRGlzcG9zYWJsZSk6IERpc3Bvc2FibGUge1xuICAgICAgICBjb25zdCBkaXNwb3NhYmxlcyA9IHRoaXMuZGlzcG9zYWJsZXM7XG4gICAgICAgIGRpc3Bvc2FibGVzLnB1c2goZGlzcG9zYWJsZSk7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBkaXNwb3NlKCk6IHZvaWQge1xuICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gZGlzcG9zYWJsZXMuaW5kZXhPZihkaXNwb3NhYmxlKTtcbiAgICAgICAgICAgICAgICBpZiAoaW5kZXggIT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIGRpc3Bvc2FibGVzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cbn1cbiIsICIvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSAyMDI0IFR5cGVGb3ggYW5kIG90aGVycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExJQ0VOU0UgaW4gdGhlIHBhY2thZ2Ugcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5pbXBvcnQgeyBEaXNwb3NhYmxlIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuaW1wb3J0IHR5cGUgeyBJQ29ubmVjdGlvbiB9IGZyb20gJy4uL3NlcnZlci9jb25uZWN0aW9uLmpzJztcblxuZXhwb3J0IGludGVyZmFjZSBJV2ViU29ja2V0IGV4dGVuZHMgRGlzcG9zYWJsZSB7XG4gICAgc2VuZChjb250ZW50OiBzdHJpbmcpOiB2b2lkO1xuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgb25NZXNzYWdlKGNiOiAoZGF0YTogYW55KSA9PiB2b2lkKTogdm9pZDtcbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIG9uRXJyb3IoY2I6IChyZWFzb246IGFueSkgPT4gdm9pZCk6IHZvaWQ7XG4gICAgb25DbG9zZShjYjogKGNvZGU6IG51bWJlciwgcmVhc29uOiBzdHJpbmcpID0+IHZvaWQpOiB2b2lkO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIElXZWJTb2NrZXRDb25uZWN0aW9uIGV4dGVuZHMgSUNvbm5lY3Rpb24ge1xuICAgIHJlYWRvbmx5IHNvY2tldDogSVdlYlNvY2tldDtcbn1cbiIsICIvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSAyMDI0IFR5cGVGb3ggYW5kIG90aGVycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExJQ0VOU0UgaW4gdGhlIHBhY2thZ2Ugcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5pbXBvcnQgeyBEaXNwb3NhYmxlIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuLy8gVE9ETzogVXNlIGVudmlyb25tZW50LXNwZWNpZmljIGltcG9ydHMgKHZzY29kZS1qc29ucnBjL2Jyb3dzZXIgb3IgdnNjb2RlLWpzb25ycGMvbm9kZSlcbi8vIHdoZW4gdXBncmFkaW5nIHRvIHZzY29kZS1qc29ucnBjQDkueC54LW5leHQuWCB3aGljaCBzdXBwb3J0cyBwcm9wZXIgZXhwb3J0IG1hcHNcbmltcG9ydCB7IHR5cGUgRGF0YUNhbGxiYWNrLCBBYnN0cmFjdE1lc3NhZ2VSZWFkZXIsIE1lc3NhZ2VSZWFkZXIgfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG5pbXBvcnQgdHlwZSB7IElXZWJTb2NrZXQgfSBmcm9tICcuL3NvY2tldC5qcyc7XG5cbmV4cG9ydCBjbGFzcyBXZWJTb2NrZXRNZXNzYWdlUmVhZGVyIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlUmVhZGVyIGltcGxlbWVudHMgTWVzc2FnZVJlYWRlciB7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHNvY2tldDogSVdlYlNvY2tldDtcbiAgICBwcm90ZWN0ZWQgc3RhdGU6ICdpbml0aWFsJyB8ICdsaXN0ZW5pbmcnIHwgJ2Nsb3NlZCcgPSAnaW5pdGlhbCc7XG4gICAgcHJvdGVjdGVkIGNhbGxiYWNrOiBEYXRhQ2FsbGJhY2sgfCB1bmRlZmluZWQ7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBwcm90ZWN0ZWQgcmVhZG9ubHkgZXZlbnRzOiBBcnJheTx7IG1lc3NhZ2U/OiBhbnksIGVycm9yPzogYW55IH0+ID0gW107XG5cbiAgICBjb25zdHJ1Y3Rvcihzb2NrZXQ6IElXZWJTb2NrZXQpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5zb2NrZXQgPSBzb2NrZXQ7XG4gICAgICAgIHRoaXMuc29ja2V0Lm9uTWVzc2FnZShtZXNzYWdlID0+XG4gICAgICAgICAgICB0aGlzLnJlYWRNZXNzYWdlKG1lc3NhZ2UpXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMuc29ja2V0Lm9uRXJyb3IoZXJyb3IgPT5cbiAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yKVxuICAgICAgICApO1xuICAgICAgICB0aGlzLnNvY2tldC5vbkNsb3NlKChjb2RlLCByZWFzb24pID0+IHtcbiAgICAgICAgICAgIGlmIChjb2RlICE9PSAxMDAwKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3I6IEVycm9yID0ge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnJyArIGNvZGUsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBFcnJvciBkdXJpbmcgc29ja2V0IHJlY29ubmVjdDogY29kZSA9ICR7Y29kZX0sIHJlYXNvbiA9ICR7cmVhc29ufWBcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGVycm9yKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuZmlyZUNsb3NlKCk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIGxpc3RlbihjYWxsYmFjazogRGF0YUNhbGxiYWNrKTogRGlzcG9zYWJsZSB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09PSAnaW5pdGlhbCcpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhdGUgPSAnbGlzdGVuaW5nJztcbiAgICAgICAgICAgIHRoaXMuY2FsbGJhY2sgPSBjYWxsYmFjaztcbiAgICAgICAgICAgIHdoaWxlICh0aGlzLmV2ZW50cy5sZW5ndGggIT09IDApIHtcbiAgICAgICAgICAgICAgICBjb25zdCBldmVudCA9IHRoaXMuZXZlbnRzLnBvcCgpITtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQubWVzc2FnZSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMucmVhZE1lc3NhZ2UoZXZlbnQubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChldmVudC5lcnJvciAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmlyZUVycm9yKGV2ZW50LmVycm9yKTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmVDbG9zZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZGlzcG9zZTogKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhbGxiYWNrID09PSBjYWxsYmFjaykge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnN0YXRlID0gJ2luaXRpYWwnO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNhbGxiYWNrID0gdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBvdmVycmlkZSBkaXNwb3NlKCkge1xuICAgICAgICBzdXBlci5kaXNwb3NlKCk7XG4gICAgICAgIHRoaXMuc3RhdGUgPSAnaW5pdGlhbCc7XG4gICAgICAgIHRoaXMuY2FsbGJhY2sgPSB1bmRlZmluZWQ7XG4gICAgICAgIHRoaXMuZXZlbnRzLnNwbGljZSgwLCB0aGlzLmV2ZW50cy5sZW5ndGgpO1xuICAgIH1cblxuICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBAdHlwZXNjcmlwdC1lc2xpbnQvbm8tZXhwbGljaXQtYW55XG4gICAgcHJvdGVjdGVkIHJlYWRNZXNzYWdlKG1lc3NhZ2U6IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gJ2luaXRpYWwnKSB7XG4gICAgICAgICAgICB0aGlzLmV2ZW50cy5zcGxpY2UoMCwgMCwgeyBtZXNzYWdlIH0pO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuc3RhdGUgPT09ICdsaXN0ZW5pbmcnKSB7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBKU09OLnBhcnNlKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIHRoaXMuY2FsbGJhY2shKGRhdGEpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZXJyb3I6IEVycm9yID0ge1xuICAgICAgICAgICAgICAgICAgICBuYW1lOiAnJyArIDQwMCxcbiAgICAgICAgICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogYEVycm9yIGR1cmluZyBtZXNzYWdlIHBhcnNpbmcsIHJlYXNvbiA9ICR7dHlwZW9mIGVyciA9PT0gJ29iamVjdCcgPyAoZXJyIGFzIGFueSkubWVzc2FnZSA6ICd1bmtub3duJ31gXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpcmVFcnJvcihlcnJvcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQHR5cGVzY3JpcHQtZXNsaW50L25vLWV4cGxpY2l0LWFueVxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBmaXJlRXJyb3IoZXJyb3I6IGFueSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zdGF0ZSA9PT0gJ2luaXRpYWwnKSB7XG4gICAgICAgICAgICB0aGlzLmV2ZW50cy5zcGxpY2UoMCwgMCwgeyBlcnJvciB9KTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YXRlID09PSAnbGlzdGVuaW5nJykge1xuICAgICAgICAgICAgc3VwZXIuZmlyZUVycm9yKGVycm9yKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByb3RlY3RlZCBvdmVycmlkZSBmaXJlQ2xvc2UoKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLnN0YXRlID09PSAnaW5pdGlhbCcpIHtcbiAgICAgICAgICAgIHRoaXMuZXZlbnRzLnNwbGljZSgwLCAwLCB7fSk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zdGF0ZSA9PT0gJ2xpc3RlbmluZycpIHtcbiAgICAgICAgICAgIHN1cGVyLmZpcmVDbG9zZSgpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc3RhdGUgPSAnY2xvc2VkJztcbiAgICB9XG59XG4iLCAiLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgMjAyNCBUeXBlRm94IGFuZCBvdGhlcnMuXG4gKiBMaWNlbnNlZCB1bmRlciB0aGUgTUlUIExpY2Vuc2UuIFNlZSBMSUNFTlNFIGluIHRoZSBwYWNrYWdlIHJvb3QgZm9yIGxpY2Vuc2UgaW5mb3JtYXRpb24uXG4gKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuaW1wb3J0IHsgTWVzc2FnZSB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcbmltcG9ydCB7IEFic3RyYWN0TWVzc2FnZVdyaXRlciwgTWVzc2FnZVdyaXRlciB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcbmltcG9ydCB0eXBlIHsgSVdlYlNvY2tldCB9IGZyb20gJy4vc29ja2V0LmpzJztcblxuZXhwb3J0IGNsYXNzIFdlYlNvY2tldE1lc3NhZ2VXcml0ZXIgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VXcml0ZXIgaW1wbGVtZW50cyBNZXNzYWdlV3JpdGVyIHtcbiAgICBwcm90ZWN0ZWQgZXJyb3JDb3VudCA9IDA7XG4gICAgcHJvdGVjdGVkIHJlYWRvbmx5IHNvY2tldDogSVdlYlNvY2tldDtcblxuICAgIGNvbnN0cnVjdG9yKHNvY2tldDogSVdlYlNvY2tldCkge1xuICAgICAgICBzdXBlcigpO1xuICAgICAgICB0aGlzLnNvY2tldCA9IHNvY2tldDtcbiAgICB9XG5cbiAgICBlbmQoKTogdm9pZCB7XG4gICAgfVxuXG4gICAgYXN5bmMgd3JpdGUobXNnOiBNZXNzYWdlKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICBjb25zdCBjb250ZW50ID0gSlNPTi5zdHJpbmdpZnkobXNnKTtcbiAgICAgICAgICAgIHRoaXMuc29ja2V0LnNlbmQoY29udGVudCk7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMuZXJyb3JDb3VudCsrO1xuICAgICAgICAgICAgdGhpcy5maXJlRXJyb3IoZSwgbXNnLCB0aGlzLmVycm9yQ291bnQpO1xuICAgICAgICB9XG4gICAgfVxufVxuIiwgIi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gKiBDb3B5cmlnaHQgKGMpIDIwMjQgVHlwZUZveCBhbmQgb3RoZXJzLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTElDRU5TRSBpbiB0aGUgcGFja2FnZSByb290IGZvciBsaWNlbnNlIGluZm9ybWF0aW9uLlxuICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cbmltcG9ydCB0eXBlIHsgTWVzc2FnZUNvbm5lY3Rpb24sIExvZ2dlciB9IGZyb20gJ3ZzY29kZS1qc29ucnBjJztcbmltcG9ydCB7IGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uIH0gZnJvbSAndnNjb2RlLWpzb25ycGMnO1xuaW1wb3J0IHR5cGUgeyBJV2ViU29ja2V0IH0gZnJvbSAnLi9zb2NrZXQuanMnO1xuaW1wb3J0IHsgV2ViU29ja2V0TWVzc2FnZVJlYWRlciB9IGZyb20gJy4vcmVhZGVyLmpzJztcbmltcG9ydCB7IFdlYlNvY2tldE1lc3NhZ2VXcml0ZXIgfSBmcm9tICcuL3dyaXRlci5qcyc7XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVXZWJTb2NrZXRDb25uZWN0aW9uKHNvY2tldDogSVdlYlNvY2tldCwgbG9nZ2VyOiBMb2dnZXIpOiBNZXNzYWdlQ29ubmVjdGlvbiB7XG4gICAgY29uc3QgbWVzc2FnZVJlYWRlciA9IG5ldyBXZWJTb2NrZXRNZXNzYWdlUmVhZGVyKHNvY2tldCk7XG4gICAgY29uc3QgbWVzc2FnZVdyaXRlciA9IG5ldyBXZWJTb2NrZXRNZXNzYWdlV3JpdGVyKHNvY2tldCk7XG4gICAgY29uc3QgY29ubmVjdGlvbiA9IGNyZWF0ZU1lc3NhZ2VDb25uZWN0aW9uKG1lc3NhZ2VSZWFkZXIsIG1lc3NhZ2VXcml0ZXIsIGxvZ2dlcik7XG4gICAgY29ubmVjdGlvbi5vbkNsb3NlKCgpID0+IGNvbm5lY3Rpb24uZGlzcG9zZSgpKTtcbiAgICByZXR1cm4gY29ubmVjdGlvbjtcbn1cbiIsICIvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuICogQ29weXJpZ2h0IChjKSAyMDI0IFR5cGVGb3ggYW5kIG90aGVycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgTGljZW5zZS4gU2VlIExJQ0VOU0UgaW4gdGhlIHBhY2thZ2Ugcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5pbXBvcnQgdHlwZSB7IE1lc3NhZ2VDb25uZWN0aW9uLCBMb2dnZXIgfSBmcm9tICd2c2NvZGUtanNvbnJwYyc7XG5pbXBvcnQgeyBjcmVhdGVXZWJTb2NrZXRDb25uZWN0aW9uIH0gZnJvbSAnLi9zb2NrZXQvY29ubmVjdGlvbi5qcyc7XG5pbXBvcnQgdHlwZSB7IElXZWJTb2NrZXQgfSBmcm9tICcuL3NvY2tldC9zb2NrZXQuanMnO1xuaW1wb3J0IHsgQ29uc29sZUxvZ2dlciB9IGZyb20gJy4vbG9nZ2VyLmpzJztcblxuZXhwb3J0IGZ1bmN0aW9uIGxpc3RlbihvcHRpb25zOiB7XG4gICAgd2ViU29ja2V0OiBXZWJTb2NrZXQ7XG4gICAgbG9nZ2VyPzogTG9nZ2VyO1xuICAgIG9uQ29ubmVjdGlvbjogKGNvbm5lY3Rpb246IE1lc3NhZ2VDb25uZWN0aW9uKSA9PiB2b2lkO1xufSkge1xuICAgIGNvbnN0IHsgd2ViU29ja2V0LCBvbkNvbm5lY3Rpb24gfSA9IG9wdGlvbnM7XG4gICAgY29uc3QgbG9nZ2VyID0gb3B0aW9ucy5sb2dnZXIgfHwgbmV3IENvbnNvbGVMb2dnZXIoKTtcbiAgICB3ZWJTb2NrZXQub25vcGVuID0gKCkgPT4ge1xuICAgICAgICBjb25zdCBzb2NrZXQgPSB0b1NvY2tldCh3ZWJTb2NrZXQpO1xuICAgICAgICBjb25zdCBjb25uZWN0aW9uID0gY3JlYXRlV2ViU29ja2V0Q29ubmVjdGlvbihzb2NrZXQsIGxvZ2dlcik7XG4gICAgICAgIG9uQ29ubmVjdGlvbihjb25uZWN0aW9uKTtcbiAgICB9O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gdG9Tb2NrZXQod2ViU29ja2V0OiBXZWJTb2NrZXQpOiBJV2ViU29ja2V0IHtcbiAgICByZXR1cm4ge1xuICAgICAgICBzZW5kOiBjb250ZW50ID0+IHdlYlNvY2tldC5zZW5kKGNvbnRlbnQpLFxuICAgICAgICBvbk1lc3NhZ2U6IGNiID0+IHtcbiAgICAgICAgICAgIHdlYlNvY2tldC5vbm1lc3NhZ2UgPSBldmVudCA9PiBjYihldmVudC5kYXRhKTtcbiAgICAgICAgfSxcbiAgICAgICAgb25FcnJvcjogY2IgPT4ge1xuICAgICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICAgICAgICAgIHdlYlNvY2tldC5vbmVycm9yID0gKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoT2JqZWN0Lmhhc093bihldmVudCwgJ21lc3NhZ2UnKSkge1xuICAgICAgICAgICAgICAgICAgICBjYihldmVudC5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICB9LFxuICAgICAgICBvbkNsb3NlOiBjYiA9PiB7XG4gICAgICAgICAgICB3ZWJTb2NrZXQub25jbG9zZSA9IGV2ZW50ID0+IGNiKGV2ZW50LmNvZGUsIGV2ZW50LnJlYXNvbik7XG4gICAgICAgIH0sXG4gICAgICAgIGRpc3Bvc2U6ICgpID0+IHdlYlNvY2tldC5jbG9zZSgpXG4gICAgfTtcbn1cbiIsICIvKlxuICogQ29weXJpZ2h0IChjKSAyMDEwLTIwMjYgRWNsaXBzZSBEaXJpZ2libGUgY29udHJpYnV0b3JzXG4gKlxuICogQWxsIHJpZ2h0cyByZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGFuZCB0aGUgYWNjb21wYW55aW5nIG1hdGVyaWFscyBhcmUgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlXG4gKiB0ZXJtcyBvZiB0aGUgRWNsaXBzZSBQdWJsaWMgTGljZW5zZSB2Mi4wIHdoaWNoIGFjY29tcGFuaWVzIHRoaXMgZGlzdHJpYnV0aW9uLCBhbmQgaXMgYXZhaWxhYmxlIGF0XG4gKiBodHRwOi8vd3d3LmVjbGlwc2Uub3JnL2xlZ2FsL2VwbC12MjAuaHRtbFxuICpcbiAqIFNQRFgtRmlsZUNvcHlyaWdodFRleHQ6IEVjbGlwc2UgRGlyaWdpYmxlIGNvbnRyaWJ1dG9ycyBTUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogRVBMLTIuMFxuICovXG5cbi8qKlxuICogTGF6eSBQcm94eSBzaGltIGZvciBNb25hY28gRWRpdG9yIGxvYWRlZCB2aWEgQU1ELlxuICpcbiAqIGVkaXRvci5qcyBzZXRzIGdsb2JhbFRoaXMubW9uYWNvIGluc2lkZSB0aGUgQU1EIHJlcXVpcmUoKSBjYWxsYmFjaywgYmVmb3JlIGFueVxuICogSmF2YUxzcENsaWVudExpYi5jb25uZWN0KCkgY2FsbC4gQWxsIHByb3BlcnR5IGFjY2Vzc2VzIGdvIHRocm91Z2ggUHJveHkuZ2V0KCkgdHJhcHNcbiAqIHNvIHRoZXkgcmVzb2x2ZSBhZ2FpbnN0IHRoZSBsaXZlIHdpbmRvdy5tb25hY28gYXQgY2FsbCB0aW1lLCBub3QgYXQgYnVuZGxlIGxvYWQgdGltZS5cbiAqXG4gKiBUeXBlU2NyaXB0IHJlc29sdmVzIHR5cGVzIGZyb20gdGhlIHJlYWwgbW9uYWNvLWVkaXRvciBkZXZEZXBlbmRlbmN5OyBlc2J1aWxkIHJlcGxhY2VzXG4gKiB0aGUgXCJtb25hY28tZWRpdG9yXCIgaW1wb3J0IHdpdGggdGhpcyBmaWxlIGF0IGJ1bmRsZSB0aW1lIHZpYSB0aGUgYWxpYXMgb3B0aW9uLlxuICovXG5cbnR5cGUgTSA9IHR5cGVvZiBpbXBvcnQoJ21vbmFjby1lZGl0b3InKTtcblxuZnVuY3Rpb24gbSgpOiBNIHtcbiAgICByZXR1cm4gKGdsb2JhbFRoaXMgYXMgYW55KS5tb25hY28gYXMgTTtcbn1cblxuZnVuY3Rpb24gbnM8VCBleHRlbmRzIG9iamVjdD4oZ2V0dGVyOiAoKSA9PiBUKTogVCB7XG4gICAgcmV0dXJuIG5ldyBQcm94eSh7fSBhcyBULCB7XG4gICAgICAgIGdldDogKF8sIGspID0+IChnZXR0ZXIoKSBhcyBhbnkpW2sgYXMgc3RyaW5nXSxcbiAgICB9KTtcbn1cblxuZnVuY3Rpb24gY2xzPFQ+KGdldHRlcjogKCkgPT4gVCk6IFQge1xuICAgIHJldHVybiBuZXcgUHJveHkoZnVuY3Rpb24gKCkge30gYXMgYW55LCB7XG4gICAgICAgIGNvbnN0cnVjdDogKF8sIGFyZ3MpID0+IG5ldyAoZ2V0dGVyKCkgYXMgYW55KSguLi5hcmdzKSxcbiAgICAgICAgZ2V0OiAgICAgICAoXywgaykgICAgPT4gKGdldHRlcigpIGFzIGFueSlbayBhcyBzdHJpbmddLFxuICAgIH0pIGFzIFQ7XG59XG5cbmV4cG9ydCBjb25zdCBlZGl0b3IgICAgICAgICA9IG5zKCgpID0+IG0oKS5lZGl0b3IpO1xuZXhwb3J0IGNvbnN0IGxhbmd1YWdlcyAgICAgID0gbnMoKCkgPT4gbSgpLmxhbmd1YWdlcyk7XG5leHBvcnQgY29uc3QgTWFya2VyU2V2ZXJpdHkgPSBucygoKSA9PiBtKCkuTWFya2VyU2V2ZXJpdHkpO1xuZXhwb3J0IGNvbnN0IE1hcmtlclRhZyAgICAgID0gbnMoKCkgPT4gKG0oKSBhcyBhbnkpLk1hcmtlclRhZyk7XG5leHBvcnQgY29uc3QgVXJpICAgICAgICAgICAgPSBjbHMoKCkgPT4gbSgpLlVyaSk7XG5leHBvcnQgY29uc3QgUmFuZ2UgICAgICAgICAgPSBjbHMoKCkgPT4gbSgpLlJhbmdlKTtcbmV4cG9ydCBjb25zdCBQb3NpdGlvbiAgICAgICA9IGNscygoKSA9PiBtKCkuUG9zaXRpb24pO1xuZXhwb3J0IGNvbnN0IFNlbGVjdGlvbiAgICAgID0gY2xzKCgpID0+IG0oKS5TZWxlY3Rpb24pO1xuZXhwb3J0IGNvbnN0IEtleUNvZGUgICAgICAgID0gbnMoKCkgPT4gbSgpLktleUNvZGUpO1xuZXhwb3J0IGNvbnN0IEtleU1vZCAgICAgICAgID0gbnMoKCkgPT4gbSgpLktleU1vZCk7XG4iLCAiLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiAqIENvcHlyaWdodCAoYykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuICogTGljZW5zZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLiBTZWUgTGljZW5zZS50eHQgaW4gdGhlIHByb2plY3Qgcm9vdCBmb3IgbGljZW5zZSBpbmZvcm1hdGlvbi5cbiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuJ3VzZSBzdHJpY3QnO1xuZXhwb3J0IHZhciBEb2N1bWVudFVyaTtcbihmdW5jdGlvbiAoRG9jdW1lbnRVcmkpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJztcbiAgICB9XG4gICAgRG9jdW1lbnRVcmkuaXMgPSBpcztcbn0pKERvY3VtZW50VXJpIHx8IChEb2N1bWVudFVyaSA9IHt9KSk7XG5leHBvcnQgdmFyIFVSSTtcbihmdW5jdGlvbiAoVVJJKSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZyc7XG4gICAgfVxuICAgIFVSSS5pcyA9IGlzO1xufSkoVVJJIHx8IChVUkkgPSB7fSkpO1xuZXhwb3J0IHZhciBpbnRlZ2VyO1xuKGZ1bmN0aW9uIChpbnRlZ2VyKSB7XG4gICAgaW50ZWdlci5NSU5fVkFMVUUgPSAtMjE0NzQ4MzY0ODtcbiAgICBpbnRlZ2VyLk1BWF9WQUxVRSA9IDIxNDc0ODM2NDc7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgaW50ZWdlci5NSU5fVkFMVUUgPD0gdmFsdWUgJiYgdmFsdWUgPD0gaW50ZWdlci5NQVhfVkFMVUU7XG4gICAgfVxuICAgIGludGVnZXIuaXMgPSBpcztcbn0pKGludGVnZXIgfHwgKGludGVnZXIgPSB7fSkpO1xuZXhwb3J0IHZhciB1aW50ZWdlcjtcbihmdW5jdGlvbiAodWludGVnZXIpIHtcbiAgICB1aW50ZWdlci5NSU5fVkFMVUUgPSAwO1xuICAgIHVpbnRlZ2VyLk1BWF9WQUxVRSA9IDIxNDc0ODM2NDc7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgJiYgdWludGVnZXIuTUlOX1ZBTFVFIDw9IHZhbHVlICYmIHZhbHVlIDw9IHVpbnRlZ2VyLk1BWF9WQUxVRTtcbiAgICB9XG4gICAgdWludGVnZXIuaXMgPSBpcztcbn0pKHVpbnRlZ2VyIHx8ICh1aW50ZWdlciA9IHt9KSk7XG4vKipcbiAqIFRoZSBQb3NpdGlvbiBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBQb3NpdGlvbn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgUG9zaXRpb247XG4oZnVuY3Rpb24gKFBvc2l0aW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBQb3NpdGlvbiBsaXRlcmFsIGZyb20gdGhlIGdpdmVuIGxpbmUgYW5kIGNoYXJhY3Rlci5cbiAgICAgKiBAcGFyYW0gbGluZSBUaGUgcG9zaXRpb24ncyBsaW5lLlxuICAgICAqIEBwYXJhbSBjaGFyYWN0ZXIgVGhlIHBvc2l0aW9uJ3MgY2hhcmFjdGVyLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShsaW5lLCBjaGFyYWN0ZXIpIHtcbiAgICAgICAgaWYgKGxpbmUgPT09IE51bWJlci5NQVhfVkFMVUUpIHtcbiAgICAgICAgICAgIGxpbmUgPSB1aW50ZWdlci5NQVhfVkFMVUU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYXJhY3RlciA9PT0gTnVtYmVyLk1BWF9WQUxVRSkge1xuICAgICAgICAgICAgY2hhcmFjdGVyID0gdWludGVnZXIuTUFYX1ZBTFVFO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGxpbmUsIGNoYXJhY3RlciB9O1xuICAgIH1cbiAgICBQb3NpdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBQb3NpdGlvbn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBJcy51aW50ZWdlcihjYW5kaWRhdGUubGluZSkgJiYgSXMudWludGVnZXIoY2FuZGlkYXRlLmNoYXJhY3Rlcik7XG4gICAgfVxuICAgIFBvc2l0aW9uLmlzID0gaXM7XG59KShQb3NpdGlvbiB8fCAoUG9zaXRpb24gPSB7fSkpO1xuLyoqXG4gKiBUaGUgUmFuZ2UgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgUmFuZ2V9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIFJhbmdlO1xuKGZ1bmN0aW9uIChSYW5nZSkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShvbmUsIHR3bywgdGhyZWUsIGZvdXIpIHtcbiAgICAgICAgaWYgKElzLnVpbnRlZ2VyKG9uZSkgJiYgSXMudWludGVnZXIodHdvKSAmJiBJcy51aW50ZWdlcih0aHJlZSkgJiYgSXMudWludGVnZXIoZm91cikpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHN0YXJ0OiBQb3NpdGlvbi5jcmVhdGUob25lLCB0d28pLCBlbmQ6IFBvc2l0aW9uLmNyZWF0ZSh0aHJlZSwgZm91cikgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChQb3NpdGlvbi5pcyhvbmUpICYmIFBvc2l0aW9uLmlzKHR3bykpIHtcbiAgICAgICAgICAgIHJldHVybiB7IHN0YXJ0OiBvbmUsIGVuZDogdHdvIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoYFJhbmdlI2NyZWF0ZSBjYWxsZWQgd2l0aCBpbnZhbGlkIGFyZ3VtZW50c1ske29uZX0sICR7dHdvfSwgJHt0aHJlZX0sICR7Zm91cn1dYCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgUmFuZ2UuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgUmFuZ2V9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgUG9zaXRpb24uaXMoY2FuZGlkYXRlLnN0YXJ0KSAmJiBQb3NpdGlvbi5pcyhjYW5kaWRhdGUuZW5kKTtcbiAgICB9XG4gICAgUmFuZ2UuaXMgPSBpcztcbn0pKFJhbmdlIHx8IChSYW5nZSA9IHt9KSk7XG4vKipcbiAqIFRoZSBMb2NhdGlvbiBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBMb2NhdGlvbn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgTG9jYXRpb247XG4oZnVuY3Rpb24gKExvY2F0aW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIExvY2F0aW9uIGxpdGVyYWwuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgbG9jYXRpb24ncyB1cmkuXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSBsb2NhdGlvbidzIHJhbmdlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmksIHJhbmdlKSB7XG4gICAgICAgIHJldHVybiB7IHVyaSwgcmFuZ2UgfTtcbiAgICB9XG4gICAgTG9jYXRpb24uY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgTG9jYXRpb259IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiAoSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpIHx8IElzLnVuZGVmaW5lZChjYW5kaWRhdGUudXJpKSk7XG4gICAgfVxuICAgIExvY2F0aW9uLmlzID0gaXM7XG59KShMb2NhdGlvbiB8fCAoTG9jYXRpb24gPSB7fSkpO1xuLyoqXG4gKiBUaGUgTG9jYXRpb25MaW5rIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIExvY2F0aW9uTGlua30gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgTG9jYXRpb25MaW5rO1xuKGZ1bmN0aW9uIChMb2NhdGlvbkxpbmspIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgTG9jYXRpb25MaW5rIGxpdGVyYWwuXG4gICAgICogQHBhcmFtIHRhcmdldFVyaSBUaGUgZGVmaW5pdGlvbidzIHVyaS5cbiAgICAgKiBAcGFyYW0gdGFyZ2V0UmFuZ2UgVGhlIGZ1bGwgcmFuZ2Ugb2YgdGhlIGRlZmluaXRpb24uXG4gICAgICogQHBhcmFtIHRhcmdldFNlbGVjdGlvblJhbmdlIFRoZSBzcGFuIG9mIHRoZSBzeW1ib2wgZGVmaW5pdGlvbiBhdCB0aGUgdGFyZ2V0LlxuICAgICAqIEBwYXJhbSBvcmlnaW5TZWxlY3Rpb25SYW5nZSBUaGUgc3BhbiBvZiB0aGUgc3ltYm9sIGJlaW5nIGRlZmluZWQgaW4gdGhlIG9yaWdpbmF0aW5nIHNvdXJjZSBmaWxlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh0YXJnZXRVcmksIHRhcmdldFJhbmdlLCB0YXJnZXRTZWxlY3Rpb25SYW5nZSwgb3JpZ2luU2VsZWN0aW9uUmFuZ2UpIHtcbiAgICAgICAgcmV0dXJuIHsgdGFyZ2V0VXJpLCB0YXJnZXRSYW5nZSwgdGFyZ2V0U2VsZWN0aW9uUmFuZ2UsIG9yaWdpblNlbGVjdGlvblJhbmdlIH07XG4gICAgfVxuICAgIExvY2F0aW9uTGluay5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBMb2NhdGlvbkxpbmt9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnRhcmdldFJhbmdlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnRhcmdldFVyaSlcbiAgICAgICAgICAgICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS50YXJnZXRTZWxlY3Rpb25SYW5nZSlcbiAgICAgICAgICAgICYmIChSYW5nZS5pcyhjYW5kaWRhdGUub3JpZ2luU2VsZWN0aW9uUmFuZ2UpIHx8IElzLnVuZGVmaW5lZChjYW5kaWRhdGUub3JpZ2luU2VsZWN0aW9uUmFuZ2UpKTtcbiAgICB9XG4gICAgTG9jYXRpb25MaW5rLmlzID0gaXM7XG59KShMb2NhdGlvbkxpbmsgfHwgKExvY2F0aW9uTGluayA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb2xvciBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBDb2xvcn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgQ29sb3I7XG4oZnVuY3Rpb24gKENvbG9yKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBDb2xvciBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyZWQsIGdyZWVuLCBibHVlLCBhbHBoYSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgcmVkLFxuICAgICAgICAgICAgZ3JlZW4sXG4gICAgICAgICAgICBibHVlLFxuICAgICAgICAgICAgYWxwaGEsXG4gICAgICAgIH07XG4gICAgfVxuICAgIENvbG9yLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIENvbG9yfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgSXMubnVtYmVyUmFuZ2UoY2FuZGlkYXRlLnJlZCwgMCwgMSlcbiAgICAgICAgICAgICYmIElzLm51bWJlclJhbmdlKGNhbmRpZGF0ZS5ncmVlbiwgMCwgMSlcbiAgICAgICAgICAgICYmIElzLm51bWJlclJhbmdlKGNhbmRpZGF0ZS5ibHVlLCAwLCAxKVxuICAgICAgICAgICAgJiYgSXMubnVtYmVyUmFuZ2UoY2FuZGlkYXRlLmFscGhhLCAwLCAxKTtcbiAgICB9XG4gICAgQ29sb3IuaXMgPSBpcztcbn0pKENvbG9yIHx8IChDb2xvciA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb2xvckluZm9ybWF0aW9uIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIENvbG9ySW5mb3JtYXRpb259IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIENvbG9ySW5mb3JtYXRpb247XG4oZnVuY3Rpb24gKENvbG9ySW5mb3JtYXRpb24pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENvbG9ySW5mb3JtYXRpb24gbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIGNvbG9yKSB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICByYW5nZSxcbiAgICAgICAgICAgIGNvbG9yLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBDb2xvckluZm9ybWF0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIENvbG9ySW5mb3JtYXRpb259IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIENvbG9yLmlzKGNhbmRpZGF0ZS5jb2xvcik7XG4gICAgfVxuICAgIENvbG9ySW5mb3JtYXRpb24uaXMgPSBpcztcbn0pKENvbG9ySW5mb3JtYXRpb24gfHwgKENvbG9ySW5mb3JtYXRpb24gPSB7fSkpO1xuLyoqXG4gKiBUaGUgQ29sb3IgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgQ29sb3JQcmVzZW50YXRpb259IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIENvbG9yUHJlc2VudGF0aW9uO1xuKGZ1bmN0aW9uIChDb2xvclByZXNlbnRhdGlvbikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ29sb3JJbmZvcm1hdGlvbiBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShsYWJlbCwgdGV4dEVkaXQsIGFkZGl0aW9uYWxUZXh0RWRpdHMpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGxhYmVsLFxuICAgICAgICAgICAgdGV4dEVkaXQsXG4gICAgICAgICAgICBhZGRpdGlvbmFsVGV4dEVkaXRzLFxuICAgICAgICB9O1xuICAgIH1cbiAgICBDb2xvclByZXNlbnRhdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBDb2xvckluZm9ybWF0aW9ufSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5sYWJlbClcbiAgICAgICAgICAgICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLnRleHRFZGl0KSB8fCBUZXh0RWRpdC5pcyhjYW5kaWRhdGUpKVxuICAgICAgICAgICAgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUuYWRkaXRpb25hbFRleHRFZGl0cykgfHwgSXMudHlwZWRBcnJheShjYW5kaWRhdGUuYWRkaXRpb25hbFRleHRFZGl0cywgVGV4dEVkaXQuaXMpKTtcbiAgICB9XG4gICAgQ29sb3JQcmVzZW50YXRpb24uaXMgPSBpcztcbn0pKENvbG9yUHJlc2VudGF0aW9uIHx8IChDb2xvclByZXNlbnRhdGlvbiA9IHt9KSk7XG4vKipcbiAqIEEgc2V0IG9mIHByZWRlZmluZWQgcmFuZ2Uga2luZHMuXG4gKi9cbmV4cG9ydCB2YXIgRm9sZGluZ1JhbmdlS2luZDtcbihmdW5jdGlvbiAoRm9sZGluZ1JhbmdlS2luZCkge1xuICAgIC8qKlxuICAgICAqIEZvbGRpbmcgcmFuZ2UgZm9yIGEgY29tbWVudFxuICAgICAqL1xuICAgIEZvbGRpbmdSYW5nZUtpbmQuQ29tbWVudCA9ICdjb21tZW50JztcbiAgICAvKipcbiAgICAgKiBGb2xkaW5nIHJhbmdlIGZvciBhbiBpbXBvcnQgb3IgaW5jbHVkZVxuICAgICAqL1xuICAgIEZvbGRpbmdSYW5nZUtpbmQuSW1wb3J0cyA9ICdpbXBvcnRzJztcbiAgICAvKipcbiAgICAgKiBGb2xkaW5nIHJhbmdlIGZvciBhIHJlZ2lvbiAoZS5nLiBgI3JlZ2lvbmApXG4gICAgICovXG4gICAgRm9sZGluZ1JhbmdlS2luZC5SZWdpb24gPSAncmVnaW9uJztcbn0pKEZvbGRpbmdSYW5nZUtpbmQgfHwgKEZvbGRpbmdSYW5nZUtpbmQgPSB7fSkpO1xuLyoqXG4gKiBUaGUgZm9sZGluZyByYW5nZSBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBGb2xkaW5nUmFuZ2V9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIEZvbGRpbmdSYW5nZTtcbihmdW5jdGlvbiAoRm9sZGluZ1JhbmdlKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBGb2xkaW5nUmFuZ2UgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUoc3RhcnRMaW5lLCBlbmRMaW5lLCBzdGFydENoYXJhY3RlciwgZW5kQ2hhcmFjdGVyLCBraW5kLCBjb2xsYXBzZWRUZXh0KSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIHN0YXJ0TGluZSxcbiAgICAgICAgICAgIGVuZExpbmVcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKElzLmRlZmluZWQoc3RhcnRDaGFyYWN0ZXIpKSB7XG4gICAgICAgICAgICByZXN1bHQuc3RhcnRDaGFyYWN0ZXIgPSBzdGFydENoYXJhY3RlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXMuZGVmaW5lZChlbmRDaGFyYWN0ZXIpKSB7XG4gICAgICAgICAgICByZXN1bHQuZW5kQ2hhcmFjdGVyID0gZW5kQ2hhcmFjdGVyO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKGtpbmQpKSB7XG4gICAgICAgICAgICByZXN1bHQua2luZCA9IGtpbmQ7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzLmRlZmluZWQoY29sbGFwc2VkVGV4dCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5jb2xsYXBzZWRUZXh0ID0gY29sbGFwc2VkVGV4dDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBGb2xkaW5nUmFuZ2UuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgRm9sZGluZ1JhbmdlfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgSXMudWludGVnZXIoY2FuZGlkYXRlLnN0YXJ0TGluZSkgJiYgSXMudWludGVnZXIoY2FuZGlkYXRlLnN0YXJ0TGluZSlcbiAgICAgICAgICAgICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLnN0YXJ0Q2hhcmFjdGVyKSB8fCBJcy51aW50ZWdlcihjYW5kaWRhdGUuc3RhcnRDaGFyYWN0ZXIpKVxuICAgICAgICAgICAgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUuZW5kQ2hhcmFjdGVyKSB8fCBJcy51aW50ZWdlcihjYW5kaWRhdGUuZW5kQ2hhcmFjdGVyKSlcbiAgICAgICAgICAgICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLmtpbmQpIHx8IElzLnN0cmluZyhjYW5kaWRhdGUua2luZCkpO1xuICAgIH1cbiAgICBGb2xkaW5nUmFuZ2UuaXMgPSBpcztcbn0pKEZvbGRpbmdSYW5nZSB8fCAoRm9sZGluZ1JhbmdlID0ge30pKTtcbi8qKlxuICogVGhlIERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24gbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbjtcbihmdW5jdGlvbiAoRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbiBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShsb2NhdGlvbiwgbWVzc2FnZSkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbG9jYXRpb24sXG4gICAgICAgICAgICBtZXNzYWdlXG4gICAgICAgIH07XG4gICAgfVxuICAgIERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24uY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBMb2NhdGlvbi5pcyhjYW5kaWRhdGUubG9jYXRpb24pICYmIElzLnN0cmluZyhjYW5kaWRhdGUubWVzc2FnZSk7XG4gICAgfVxuICAgIERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24uaXMgPSBpcztcbn0pKERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24gfHwgKERpYWdub3N0aWNSZWxhdGVkSW5mb3JtYXRpb24gPSB7fSkpO1xuLyoqXG4gKiBUaGUgZGlhZ25vc3RpYydzIHNldmVyaXR5LlxuICovXG5leHBvcnQgdmFyIERpYWdub3N0aWNTZXZlcml0eTtcbihmdW5jdGlvbiAoRGlhZ25vc3RpY1NldmVyaXR5KSB7XG4gICAgLyoqXG4gICAgICogUmVwb3J0cyBhbiBlcnJvci5cbiAgICAgKi9cbiAgICBEaWFnbm9zdGljU2V2ZXJpdHkuRXJyb3IgPSAxO1xuICAgIC8qKlxuICAgICAqIFJlcG9ydHMgYSB3YXJuaW5nLlxuICAgICAqL1xuICAgIERpYWdub3N0aWNTZXZlcml0eS5XYXJuaW5nID0gMjtcbiAgICAvKipcbiAgICAgKiBSZXBvcnRzIGFuIGluZm9ybWF0aW9uLlxuICAgICAqL1xuICAgIERpYWdub3N0aWNTZXZlcml0eS5JbmZvcm1hdGlvbiA9IDM7XG4gICAgLyoqXG4gICAgICogUmVwb3J0cyBhIGhpbnQuXG4gICAgICovXG4gICAgRGlhZ25vc3RpY1NldmVyaXR5LkhpbnQgPSA0O1xufSkoRGlhZ25vc3RpY1NldmVyaXR5IHx8IChEaWFnbm9zdGljU2V2ZXJpdHkgPSB7fSkpO1xuLyoqXG4gKiBUaGUgZGlhZ25vc3RpYyB0YWdzLlxuICpcbiAqIEBzaW5jZSAzLjE1LjBcbiAqL1xuZXhwb3J0IHZhciBEaWFnbm9zdGljVGFnO1xuKGZ1bmN0aW9uIChEaWFnbm9zdGljVGFnKSB7XG4gICAgLyoqXG4gICAgICogVW51c2VkIG9yIHVubmVjZXNzYXJ5IGNvZGUuXG4gICAgICpcbiAgICAgKiBDbGllbnRzIGFyZSBhbGxvd2VkIHRvIHJlbmRlciBkaWFnbm9zdGljcyB3aXRoIHRoaXMgdGFnIGZhZGVkIG91dCBpbnN0ZWFkIG9mIGhhdmluZ1xuICAgICAqIGFuIGVycm9yIHNxdWlnZ2xlLlxuICAgICAqL1xuICAgIERpYWdub3N0aWNUYWcuVW5uZWNlc3NhcnkgPSAxO1xuICAgIC8qKlxuICAgICAqIERlcHJlY2F0ZWQgb3Igb2Jzb2xldGUgY29kZS5cbiAgICAgKlxuICAgICAqIENsaWVudHMgYXJlIGFsbG93ZWQgdG8gcmVuZGVyZWQgZGlhZ25vc3RpY3Mgd2l0aCB0aGlzIHRhZyBzdHJpa2UgdGhyb3VnaC5cbiAgICAgKi9cbiAgICBEaWFnbm9zdGljVGFnLkRlcHJlY2F0ZWQgPSAyO1xufSkoRGlhZ25vc3RpY1RhZyB8fCAoRGlhZ25vc3RpY1RhZyA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb2RlRGVzY3JpcHRpb24gbmFtZXNwYWNlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGggZGVzY3JpcHRpb25zIGZvciBkaWFnbm9zdGljIGNvZGVzLlxuICpcbiAqIEBzaW5jZSAzLjE2LjBcbiAqL1xuZXhwb3J0IHZhciBDb2RlRGVzY3JpcHRpb247XG4oZnVuY3Rpb24gKENvZGVEZXNjcmlwdGlvbikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUuaHJlZik7XG4gICAgfVxuICAgIENvZGVEZXNjcmlwdGlvbi5pcyA9IGlzO1xufSkoQ29kZURlc2NyaXB0aW9uIHx8IChDb2RlRGVzY3JpcHRpb24gPSB7fSkpO1xuLyoqXG4gKiBUaGUgRGlhZ25vc3RpYyBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyB0byB3b3JrIHdpdGhcbiAqIHtAbGluayBEaWFnbm9zdGljfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBEaWFnbm9zdGljO1xuKGZ1bmN0aW9uIChEaWFnbm9zdGljKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBEaWFnbm9zdGljIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCBtZXNzYWdlLCBzZXZlcml0eSwgY29kZSwgc291cmNlLCByZWxhdGVkSW5mb3JtYXRpb24pIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHsgcmFuZ2UsIG1lc3NhZ2UgfTtcbiAgICAgICAgaWYgKElzLmRlZmluZWQoc2V2ZXJpdHkpKSB7XG4gICAgICAgICAgICByZXN1bHQuc2V2ZXJpdHkgPSBzZXZlcml0eTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXMuZGVmaW5lZChjb2RlKSkge1xuICAgICAgICAgICAgcmVzdWx0LmNvZGUgPSBjb2RlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKHNvdXJjZSkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKElzLmRlZmluZWQocmVsYXRlZEluZm9ybWF0aW9uKSkge1xuICAgICAgICAgICAgcmVzdWx0LnJlbGF0ZWRJbmZvcm1hdGlvbiA9IHJlbGF0ZWRJbmZvcm1hdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBEaWFnbm9zdGljLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIERpYWdub3N0aWN9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICB2YXIgX2E7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKVxuICAgICAgICAgICAgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKVxuICAgICAgICAgICAgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5tZXNzYWdlKVxuICAgICAgICAgICAgJiYgKElzLm51bWJlcihjYW5kaWRhdGUuc2V2ZXJpdHkpIHx8IElzLnVuZGVmaW5lZChjYW5kaWRhdGUuc2V2ZXJpdHkpKVxuICAgICAgICAgICAgJiYgKElzLmludGVnZXIoY2FuZGlkYXRlLmNvZGUpIHx8IElzLnN0cmluZyhjYW5kaWRhdGUuY29kZSkgfHwgSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5jb2RlKSlcbiAgICAgICAgICAgICYmIChJcy51bmRlZmluZWQoY2FuZGlkYXRlLmNvZGVEZXNjcmlwdGlvbikgfHwgKElzLnN0cmluZygoX2EgPSBjYW5kaWRhdGUuY29kZURlc2NyaXB0aW9uKSA9PT0gbnVsbCB8fCBfYSA9PT0gdm9pZCAwID8gdm9pZCAwIDogX2EuaHJlZikpKVxuICAgICAgICAgICAgJiYgKElzLnN0cmluZyhjYW5kaWRhdGUuc291cmNlKSB8fCBJcy51bmRlZmluZWQoY2FuZGlkYXRlLnNvdXJjZSkpXG4gICAgICAgICAgICAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5yZWxhdGVkSW5mb3JtYXRpb24pIHx8IElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLnJlbGF0ZWRJbmZvcm1hdGlvbiwgRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbi5pcykpO1xuICAgIH1cbiAgICBEaWFnbm9zdGljLmlzID0gaXM7XG59KShEaWFnbm9zdGljIHx8IChEaWFnbm9zdGljID0ge30pKTtcbi8qKlxuICogVGhlIENvbW1hbmQgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgQ29tbWFuZH0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgQ29tbWFuZDtcbihmdW5jdGlvbiAoQ29tbWFuZCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgQ29tbWFuZCBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh0aXRsZSwgY29tbWFuZCwgLi4uYXJncykge1xuICAgICAgICBsZXQgcmVzdWx0ID0geyB0aXRsZSwgY29tbWFuZCB9O1xuICAgICAgICBpZiAoSXMuZGVmaW5lZChhcmdzKSAmJiBhcmdzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHJlc3VsdC5hcmd1bWVudHMgPSBhcmdzO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIENvbW1hbmQuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgQ29tbWFuZH0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnRpdGxlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLmNvbW1hbmQpO1xuICAgIH1cbiAgICBDb21tYW5kLmlzID0gaXM7XG59KShDb21tYW5kIHx8IChDb21tYW5kID0ge30pKTtcbi8qKlxuICogVGhlIFRleHRFZGl0IG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIHJlcGxhY2UsXG4gKiBpbnNlcnQgYW5kIGRlbGV0ZSBlZGl0cyBtb3JlIGVhc2lseS5cbiAqL1xuZXhwb3J0IHZhciBUZXh0RWRpdDtcbihmdW5jdGlvbiAoVGV4dEVkaXQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgcmVwbGFjZSB0ZXh0IGVkaXQuXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSBvZiB0ZXh0IHRvIGJlIHJlcGxhY2VkLlxuICAgICAqIEBwYXJhbSBuZXdUZXh0IFRoZSBuZXcgdGV4dC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiByZXBsYWNlKHJhbmdlLCBuZXdUZXh0KSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCBuZXdUZXh0IH07XG4gICAgfVxuICAgIFRleHRFZGl0LnJlcGxhY2UgPSByZXBsYWNlO1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gaW5zZXJ0IHRleHQgZWRpdC5cbiAgICAgKiBAcGFyYW0gcG9zaXRpb24gVGhlIHBvc2l0aW9uIHRvIGluc2VydCB0aGUgdGV4dCBhdC5cbiAgICAgKiBAcGFyYW0gbmV3VGV4dCBUaGUgdGV4dCB0byBiZSBpbnNlcnRlZC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpbnNlcnQocG9zaXRpb24sIG5ld1RleHQpIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2U6IHsgc3RhcnQ6IHBvc2l0aW9uLCBlbmQ6IHBvc2l0aW9uIH0sIG5ld1RleHQgfTtcbiAgICB9XG4gICAgVGV4dEVkaXQuaW5zZXJ0ID0gaW5zZXJ0O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBkZWxldGUgdGV4dCBlZGl0LlxuICAgICAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2Ugb2YgdGV4dCB0byBiZSBkZWxldGVkLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGRlbChyYW5nZSkge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgbmV3VGV4dDogJycgfTtcbiAgICB9XG4gICAgVGV4dEVkaXQuZGVsID0gZGVsO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpXG4gICAgICAgICAgICAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLm5ld1RleHQpXG4gICAgICAgICAgICAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpO1xuICAgIH1cbiAgICBUZXh0RWRpdC5pcyA9IGlzO1xufSkoVGV4dEVkaXQgfHwgKFRleHRFZGl0ID0ge30pKTtcbmV4cG9ydCB2YXIgQ2hhbmdlQW5ub3RhdGlvbjtcbihmdW5jdGlvbiAoQ2hhbmdlQW5ub3RhdGlvbikge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShsYWJlbCwgbmVlZHNDb25maXJtYXRpb24sIGRlc2NyaXB0aW9uKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHsgbGFiZWwgfTtcbiAgICAgICAgaWYgKG5lZWRzQ29uZmlybWF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5uZWVkc0NvbmZpcm1hdGlvbiA9IG5lZWRzQ29uZmlybWF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZXNjcmlwdGlvbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBDaGFuZ2VBbm5vdGF0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLmxhYmVsKSAmJlxuICAgICAgICAgICAgKElzLmJvb2xlYW4oY2FuZGlkYXRlLm5lZWRzQ29uZmlybWF0aW9uKSB8fCBjYW5kaWRhdGUubmVlZHNDb25maXJtYXRpb24gPT09IHVuZGVmaW5lZCkgJiZcbiAgICAgICAgICAgIChJcy5zdHJpbmcoY2FuZGlkYXRlLmRlc2NyaXB0aW9uKSB8fCBjYW5kaWRhdGUuZGVzY3JpcHRpb24gPT09IHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIENoYW5nZUFubm90YXRpb24uaXMgPSBpcztcbn0pKENoYW5nZUFubm90YXRpb24gfHwgKENoYW5nZUFubm90YXRpb24gPSB7fSkpO1xuZXhwb3J0IHZhciBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllcjtcbihmdW5jdGlvbiAoQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIpIHtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLnN0cmluZyhjYW5kaWRhdGUpO1xuICAgIH1cbiAgICBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyA9IGlzO1xufSkoQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIgfHwgKENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyID0ge30pKTtcbmV4cG9ydCB2YXIgQW5ub3RhdGVkVGV4dEVkaXQ7XG4oZnVuY3Rpb24gKEFubm90YXRlZFRleHRFZGl0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhbiBhbm5vdGF0ZWQgcmVwbGFjZSB0ZXh0IGVkaXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlIG9mIHRleHQgdG8gYmUgcmVwbGFjZWQuXG4gICAgICogQHBhcmFtIG5ld1RleHQgVGhlIG5ldyB0ZXh0LlxuICAgICAqIEBwYXJhbSBhbm5vdGF0aW9uIFRoZSBhbm5vdGF0aW9uLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIHJlcGxhY2UocmFuZ2UsIG5ld1RleHQsIGFubm90YXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIG5ld1RleHQsIGFubm90YXRpb25JZDogYW5ub3RhdGlvbiB9O1xuICAgIH1cbiAgICBBbm5vdGF0ZWRUZXh0RWRpdC5yZXBsYWNlID0gcmVwbGFjZTtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGFuIGFubm90YXRlZCBpbnNlcnQgdGV4dCBlZGl0LlxuICAgICAqXG4gICAgICogQHBhcmFtIHBvc2l0aW9uIFRoZSBwb3NpdGlvbiB0byBpbnNlcnQgdGhlIHRleHQgYXQuXG4gICAgICogQHBhcmFtIG5ld1RleHQgVGhlIHRleHQgdG8gYmUgaW5zZXJ0ZWQuXG4gICAgICogQHBhcmFtIGFubm90YXRpb24gVGhlIGFubm90YXRpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gaW5zZXJ0KHBvc2l0aW9uLCBuZXdUZXh0LCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlOiB7IHN0YXJ0OiBwb3NpdGlvbiwgZW5kOiBwb3NpdGlvbiB9LCBuZXdUZXh0LCBhbm5vdGF0aW9uSWQ6IGFubm90YXRpb24gfTtcbiAgICB9XG4gICAgQW5ub3RhdGVkVGV4dEVkaXQuaW5zZXJ0ID0gaW5zZXJ0O1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYW4gYW5ub3RhdGVkIGRlbGV0ZSB0ZXh0IGVkaXQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcmFuZ2UgVGhlIHJhbmdlIG9mIHRleHQgdG8gYmUgZGVsZXRlZC5cbiAgICAgKiBAcGFyYW0gYW5ub3RhdGlvbiBUaGUgYW5ub3RhdGlvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBkZWwocmFuZ2UsIGFubm90YXRpb24pIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIG5ld1RleHQ6ICcnLCBhbm5vdGF0aW9uSWQ6IGFubm90YXRpb24gfTtcbiAgICB9XG4gICAgQW5ub3RhdGVkVGV4dEVkaXQuZGVsID0gZGVsO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gVGV4dEVkaXQuaXMoY2FuZGlkYXRlKSAmJiAoQ2hhbmdlQW5ub3RhdGlvbi5pcyhjYW5kaWRhdGUuYW5ub3RhdGlvbklkKSB8fCBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhjYW5kaWRhdGUuYW5ub3RhdGlvbklkKSk7XG4gICAgfVxuICAgIEFubm90YXRlZFRleHRFZGl0LmlzID0gaXM7XG59KShBbm5vdGF0ZWRUZXh0RWRpdCB8fCAoQW5ub3RhdGVkVGV4dEVkaXQgPSB7fSkpO1xuLyoqXG4gKiBUaGUgVGV4dERvY3VtZW50RWRpdCBuYW1lc3BhY2UgcHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9uIHRvIGNyZWF0ZVxuICogYW4gZWRpdCB0aGF0IG1hbmlwdWxhdGVzIGEgdGV4dCBkb2N1bWVudC5cbiAqL1xuZXhwb3J0IHZhciBUZXh0RG9jdW1lbnRFZGl0O1xuKGZ1bmN0aW9uIChUZXh0RG9jdW1lbnRFZGl0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBgVGV4dERvY3VtZW50RWRpdGBcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodGV4dERvY3VtZW50LCBlZGl0cykge1xuICAgICAgICByZXR1cm4geyB0ZXh0RG9jdW1lbnQsIGVkaXRzIH07XG4gICAgfVxuICAgIFRleHREb2N1bWVudEVkaXQuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKVxuICAgICAgICAgICAgJiYgT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmlzKGNhbmRpZGF0ZS50ZXh0RG9jdW1lbnQpXG4gICAgICAgICAgICAmJiBBcnJheS5pc0FycmF5KGNhbmRpZGF0ZS5lZGl0cyk7XG4gICAgfVxuICAgIFRleHREb2N1bWVudEVkaXQuaXMgPSBpcztcbn0pKFRleHREb2N1bWVudEVkaXQgfHwgKFRleHREb2N1bWVudEVkaXQgPSB7fSkpO1xuZXhwb3J0IHZhciBDcmVhdGVGaWxlO1xuKGZ1bmN0aW9uIChDcmVhdGVGaWxlKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKHVyaSwgb3B0aW9ucywgYW5ub3RhdGlvbikge1xuICAgICAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgICAgICAga2luZDogJ2NyZWF0ZScsXG4gICAgICAgICAgICB1cmlcbiAgICAgICAgfTtcbiAgICAgICAgaWYgKG9wdGlvbnMgIT09IHVuZGVmaW5lZCAmJiAob3B0aW9ucy5vdmVyd3JpdGUgIT09IHVuZGVmaW5lZCB8fCBvcHRpb25zLmlnbm9yZUlmRXhpc3RzICE9PSB1bmRlZmluZWQpKSB7XG4gICAgICAgICAgICByZXN1bHQub3B0aW9ucyA9IG9wdGlvbnM7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFubm90YXRpb24gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmFubm90YXRpb25JZCA9IGFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgQ3JlYXRlRmlsZS5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIGNhbmRpZGF0ZS5raW5kID09PSAnY3JlYXRlJyAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSkgJiYgKGNhbmRpZGF0ZS5vcHRpb25zID09PSB1bmRlZmluZWQgfHxcbiAgICAgICAgICAgICgoY2FuZGlkYXRlLm9wdGlvbnMub3ZlcndyaXRlID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUub3B0aW9ucy5vdmVyd3JpdGUpKSAmJiAoY2FuZGlkYXRlLm9wdGlvbnMuaWdub3JlSWZFeGlzdHMgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5vcHRpb25zLmlnbm9yZUlmRXhpc3RzKSkpKSAmJiAoY2FuZGlkYXRlLmFubm90YXRpb25JZCA9PT0gdW5kZWZpbmVkIHx8IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQpKTtcbiAgICB9XG4gICAgQ3JlYXRlRmlsZS5pcyA9IGlzO1xufSkoQ3JlYXRlRmlsZSB8fCAoQ3JlYXRlRmlsZSA9IHt9KSk7XG5leHBvcnQgdmFyIFJlbmFtZUZpbGU7XG4oZnVuY3Rpb24gKFJlbmFtZUZpbGUpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUob2xkVXJpLCBuZXdVcmksIG9wdGlvbnMsIGFubm90YXRpb24pIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIGtpbmQ6ICdyZW5hbWUnLFxuICAgICAgICAgICAgb2xkVXJpLFxuICAgICAgICAgICAgbmV3VXJpXG4gICAgICAgIH07XG4gICAgICAgIGlmIChvcHRpb25zICE9PSB1bmRlZmluZWQgJiYgKG9wdGlvbnMub3ZlcndyaXRlICE9PSB1bmRlZmluZWQgfHwgb3B0aW9ucy5pZ25vcmVJZkV4aXN0cyAhPT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgcmVzdWx0Lm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbm5vdGF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5hbm5vdGF0aW9uSWQgPSBhbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIFJlbmFtZUZpbGUuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBjYW5kaWRhdGUua2luZCA9PT0gJ3JlbmFtZScgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5vbGRVcmkpICYmIElzLnN0cmluZyhjYW5kaWRhdGUubmV3VXJpKSAmJiAoY2FuZGlkYXRlLm9wdGlvbnMgPT09IHVuZGVmaW5lZCB8fFxuICAgICAgICAgICAgKChjYW5kaWRhdGUub3B0aW9ucy5vdmVyd3JpdGUgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5vcHRpb25zLm92ZXJ3cml0ZSkpICYmIChjYW5kaWRhdGUub3B0aW9ucy5pZ25vcmVJZkV4aXN0cyA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLm9wdGlvbnMuaWdub3JlSWZFeGlzdHMpKSkpICYmIChjYW5kaWRhdGUuYW5ub3RhdGlvbklkID09PSB1bmRlZmluZWQgfHwgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoY2FuZGlkYXRlLmFubm90YXRpb25JZCkpO1xuICAgIH1cbiAgICBSZW5hbWVGaWxlLmlzID0gaXM7XG59KShSZW5hbWVGaWxlIHx8IChSZW5hbWVGaWxlID0ge30pKTtcbmV4cG9ydCB2YXIgRGVsZXRlRmlsZTtcbihmdW5jdGlvbiAoRGVsZXRlRmlsZSkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh1cmksIG9wdGlvbnMsIGFubm90YXRpb24pIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHtcbiAgICAgICAgICAgIGtpbmQ6ICdkZWxldGUnLFxuICAgICAgICAgICAgdXJpXG4gICAgICAgIH07XG4gICAgICAgIGlmIChvcHRpb25zICE9PSB1bmRlZmluZWQgJiYgKG9wdGlvbnMucmVjdXJzaXZlICE9PSB1bmRlZmluZWQgfHwgb3B0aW9ucy5pZ25vcmVJZk5vdEV4aXN0cyAhPT0gdW5kZWZpbmVkKSkge1xuICAgICAgICAgICAgcmVzdWx0Lm9wdGlvbnMgPSBvcHRpb25zO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhbm5vdGF0aW9uICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5hbm5vdGF0aW9uSWQgPSBhbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIERlbGV0ZUZpbGUuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBjYW5kaWRhdGUua2luZCA9PT0gJ2RlbGV0ZScgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpICYmIChjYW5kaWRhdGUub3B0aW9ucyA9PT0gdW5kZWZpbmVkIHx8XG4gICAgICAgICAgICAoKGNhbmRpZGF0ZS5vcHRpb25zLnJlY3Vyc2l2ZSA9PT0gdW5kZWZpbmVkIHx8IElzLmJvb2xlYW4oY2FuZGlkYXRlLm9wdGlvbnMucmVjdXJzaXZlKSkgJiYgKGNhbmRpZGF0ZS5vcHRpb25zLmlnbm9yZUlmTm90RXhpc3RzID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUub3B0aW9ucy5pZ25vcmVJZk5vdEV4aXN0cykpKSkgJiYgKGNhbmRpZGF0ZS5hbm5vdGF0aW9uSWQgPT09IHVuZGVmaW5lZCB8fCBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhjYW5kaWRhdGUuYW5ub3RhdGlvbklkKSk7XG4gICAgfVxuICAgIERlbGV0ZUZpbGUuaXMgPSBpcztcbn0pKERlbGV0ZUZpbGUgfHwgKERlbGV0ZUZpbGUgPSB7fSkpO1xuZXhwb3J0IHZhciBXb3Jrc3BhY2VFZGl0O1xuKGZ1bmN0aW9uIChXb3Jrc3BhY2VFZGl0KSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmNoYW5nZXMgIT09IHVuZGVmaW5lZCB8fCBjYW5kaWRhdGUuZG9jdW1lbnRDaGFuZ2VzICE9PSB1bmRlZmluZWQpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmRvY3VtZW50Q2hhbmdlcyA9PT0gdW5kZWZpbmVkIHx8IGNhbmRpZGF0ZS5kb2N1bWVudENoYW5nZXMuZXZlcnkoKGNoYW5nZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChJcy5zdHJpbmcoY2hhbmdlLmtpbmQpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBDcmVhdGVGaWxlLmlzKGNoYW5nZSkgfHwgUmVuYW1lRmlsZS5pcyhjaGFuZ2UpIHx8IERlbGV0ZUZpbGUuaXMoY2hhbmdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBUZXh0RG9jdW1lbnRFZGl0LmlzKGNoYW5nZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSkpO1xuICAgIH1cbiAgICBXb3Jrc3BhY2VFZGl0LmlzID0gaXM7XG59KShXb3Jrc3BhY2VFZGl0IHx8IChXb3Jrc3BhY2VFZGl0ID0ge30pKTtcbmNsYXNzIFRleHRFZGl0Q2hhbmdlSW1wbCB7XG4gICAgY29uc3RydWN0b3IoZWRpdHMsIGNoYW5nZUFubm90YXRpb25zKSB7XG4gICAgICAgIHRoaXMuZWRpdHMgPSBlZGl0cztcbiAgICAgICAgdGhpcy5jaGFuZ2VBbm5vdGF0aW9ucyA9IGNoYW5nZUFubm90YXRpb25zO1xuICAgIH1cbiAgICBpbnNlcnQocG9zaXRpb24sIG5ld1RleHQsIGFubm90YXRpb24pIHtcbiAgICAgICAgbGV0IGVkaXQ7XG4gICAgICAgIGxldCBpZDtcbiAgICAgICAgaWYgKGFubm90YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZWRpdCA9IFRleHRFZGl0Lmluc2VydChwb3NpdGlvbiwgbmV3VGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMoYW5ub3RhdGlvbikpIHtcbiAgICAgICAgICAgIGlkID0gYW5ub3RhdGlvbjtcbiAgICAgICAgICAgIGVkaXQgPSBBbm5vdGF0ZWRUZXh0RWRpdC5pbnNlcnQocG9zaXRpb24sIG5ld1RleHQsIGFubm90YXRpb24pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hc3NlcnRDaGFuZ2VBbm5vdGF0aW9ucyh0aGlzLmNoYW5nZUFubm90YXRpb25zKTtcbiAgICAgICAgICAgIGlkID0gdGhpcy5jaGFuZ2VBbm5vdGF0aW9ucy5tYW5hZ2UoYW5ub3RhdGlvbik7XG4gICAgICAgICAgICBlZGl0ID0gQW5ub3RhdGVkVGV4dEVkaXQuaW5zZXJ0KHBvc2l0aW9uLCBuZXdUZXh0LCBpZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lZGl0cy5wdXNoKGVkaXQpO1xuICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJlcGxhY2UocmFuZ2UsIG5ld1RleHQsIGFubm90YXRpb24pIHtcbiAgICAgICAgbGV0IGVkaXQ7XG4gICAgICAgIGxldCBpZDtcbiAgICAgICAgaWYgKGFubm90YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgZWRpdCA9IFRleHRFZGl0LnJlcGxhY2UocmFuZ2UsIG5ld1RleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGFubm90YXRpb24pKSB7XG4gICAgICAgICAgICBpZCA9IGFubm90YXRpb247XG4gICAgICAgICAgICBlZGl0ID0gQW5ub3RhdGVkVGV4dEVkaXQucmVwbGFjZShyYW5nZSwgbmV3VGV4dCwgYW5ub3RhdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFzc2VydENoYW5nZUFubm90YXRpb25zKHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgaWQgPSB0aGlzLmNoYW5nZUFubm90YXRpb25zLm1hbmFnZShhbm5vdGF0aW9uKTtcbiAgICAgICAgICAgIGVkaXQgPSBBbm5vdGF0ZWRUZXh0RWRpdC5yZXBsYWNlKHJhbmdlLCBuZXdUZXh0LCBpZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5lZGl0cy5wdXNoKGVkaXQpO1xuICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlbGV0ZShyYW5nZSwgYW5ub3RhdGlvbikge1xuICAgICAgICBsZXQgZWRpdDtcbiAgICAgICAgbGV0IGlkO1xuICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBlZGl0ID0gVGV4dEVkaXQuZGVsKHJhbmdlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhhbm5vdGF0aW9uKSkge1xuICAgICAgICAgICAgaWQgPSBhbm5vdGF0aW9uO1xuICAgICAgICAgICAgZWRpdCA9IEFubm90YXRlZFRleHRFZGl0LmRlbChyYW5nZSwgYW5ub3RhdGlvbik7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFzc2VydENoYW5nZUFubm90YXRpb25zKHRoaXMuY2hhbmdlQW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgaWQgPSB0aGlzLmNoYW5nZUFubm90YXRpb25zLm1hbmFnZShhbm5vdGF0aW9uKTtcbiAgICAgICAgICAgIGVkaXQgPSBBbm5vdGF0ZWRUZXh0RWRpdC5kZWwocmFuZ2UsIGlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmVkaXRzLnB1c2goZWRpdCk7XG4gICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH1cbiAgICB9XG4gICAgYWRkKGVkaXQpIHtcbiAgICAgICAgdGhpcy5lZGl0cy5wdXNoKGVkaXQpO1xuICAgIH1cbiAgICBhbGwoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVkaXRzO1xuICAgIH1cbiAgICBjbGVhcigpIHtcbiAgICAgICAgdGhpcy5lZGl0cy5zcGxpY2UoMCwgdGhpcy5lZGl0cy5sZW5ndGgpO1xuICAgIH1cbiAgICBhc3NlcnRDaGFuZ2VBbm5vdGF0aW9ucyh2YWx1ZSkge1xuICAgICAgICBpZiAodmFsdWUgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBUZXh0IGVkaXQgY2hhbmdlIGlzIG5vdCBjb25maWd1cmVkIHRvIG1hbmFnZSBjaGFuZ2UgYW5ub3RhdGlvbnMuYCk7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIEEgaGVscGVyIGNsYXNzXG4gKi9cbmNsYXNzIENoYW5nZUFubm90YXRpb25zIHtcbiAgICBjb25zdHJ1Y3Rvcihhbm5vdGF0aW9ucykge1xuICAgICAgICB0aGlzLl9hbm5vdGF0aW9ucyA9IGFubm90YXRpb25zID09PSB1bmRlZmluZWQgPyBPYmplY3QuY3JlYXRlKG51bGwpIDogYW5ub3RhdGlvbnM7XG4gICAgICAgIHRoaXMuX2NvdW50ZXIgPSAwO1xuICAgICAgICB0aGlzLl9zaXplID0gMDtcbiAgICB9XG4gICAgYWxsKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fYW5ub3RhdGlvbnM7XG4gICAgfVxuICAgIGdldCBzaXplKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fc2l6ZTtcbiAgICB9XG4gICAgbWFuYWdlKGlkT3JBbm5vdGF0aW9uLCBhbm5vdGF0aW9uKSB7XG4gICAgICAgIGxldCBpZDtcbiAgICAgICAgaWYgKENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGlkT3JBbm5vdGF0aW9uKSkge1xuICAgICAgICAgICAgaWQgPSBpZE9yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGlkID0gdGhpcy5uZXh0SWQoKTtcbiAgICAgICAgICAgIGFubm90YXRpb24gPSBpZE9yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5fYW5ub3RhdGlvbnNbaWRdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihgSWQgJHtpZH0gaXMgYWxyZWFkeSBpbiB1c2UuYCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFubm90YXRpb24gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGBObyBhbm5vdGF0aW9uIHByb3ZpZGVkIGZvciBpZCAke2lkfWApO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX2Fubm90YXRpb25zW2lkXSA9IGFubm90YXRpb247XG4gICAgICAgIHRoaXMuX3NpemUrKztcbiAgICAgICAgcmV0dXJuIGlkO1xuICAgIH1cbiAgICBuZXh0SWQoKSB7XG4gICAgICAgIHRoaXMuX2NvdW50ZXIrKztcbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvdW50ZXIudG9TdHJpbmcoKTtcbiAgICB9XG59XG4vKipcbiAqIEEgd29ya3NwYWNlIGNoYW5nZSBoZWxwcyBjb25zdHJ1Y3RpbmcgY2hhbmdlcyB0byBhIHdvcmtzcGFjZS5cbiAqL1xuZXhwb3J0IGNsYXNzIFdvcmtzcGFjZUNoYW5nZSB7XG4gICAgY29uc3RydWN0b3Iod29ya3NwYWNlRWRpdCkge1xuICAgICAgICB0aGlzLl90ZXh0RWRpdENoYW5nZXMgPSBPYmplY3QuY3JlYXRlKG51bGwpO1xuICAgICAgICBpZiAod29ya3NwYWNlRWRpdCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0ID0gd29ya3NwYWNlRWRpdDtcbiAgICAgICAgICAgIGlmICh3b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2NoYW5nZUFubm90YXRpb25zID0gbmV3IENoYW5nZUFubm90YXRpb25zKHdvcmtzcGFjZUVkaXQuY2hhbmdlQW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgICAgIHdvcmtzcGFjZUVkaXQuY2hhbmdlQW5ub3RhdGlvbnMgPSB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5hbGwoKTtcbiAgICAgICAgICAgICAgICB3b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcy5mb3JFYWNoKChjaGFuZ2UpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKFRleHREb2N1bWVudEVkaXQuaXMoY2hhbmdlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdGV4dEVkaXRDaGFuZ2UgPSBuZXcgVGV4dEVkaXRDaGFuZ2VJbXBsKGNoYW5nZS5lZGl0cywgdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fdGV4dEVkaXRDaGFuZ2VzW2NoYW5nZS50ZXh0RG9jdW1lbnQudXJpXSA9IHRleHRFZGl0Q2hhbmdlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh3b3Jrc3BhY2VFZGl0LmNoYW5nZXMpIHtcbiAgICAgICAgICAgICAgICBPYmplY3Qua2V5cyh3b3Jrc3BhY2VFZGl0LmNoYW5nZXMpLmZvckVhY2goKGtleSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCB0ZXh0RWRpdENoYW5nZSA9IG5ldyBUZXh0RWRpdENoYW5nZUltcGwod29ya3NwYWNlRWRpdC5jaGFuZ2VzW2tleV0pO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl90ZXh0RWRpdENoYW5nZXNba2V5XSA9IHRleHRFZGl0Q2hhbmdlO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdCA9IHt9O1xuICAgICAgICB9XG4gICAgfVxuICAgIC8qKlxuICAgICAqIFJldHVybnMgdGhlIHVuZGVybHlpbmcge0BsaW5rIFdvcmtzcGFjZUVkaXR9IGxpdGVyYWxcbiAgICAgKiB1c2UgdG8gYmUgcmV0dXJuZWQgZnJvbSBhIHdvcmtzcGFjZSBlZGl0IG9wZXJhdGlvbiBsaWtlIHJlbmFtZS5cbiAgICAgKi9cbiAgICBnZXQgZWRpdCgpIHtcbiAgICAgICAgdGhpcy5pbml0RG9jdW1lbnRDaGFuZ2VzKCk7XG4gICAgICAgIGlmICh0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMuc2l6ZSA9PT0gMCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlQW5ub3RhdGlvbnMgPSB1bmRlZmluZWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmNoYW5nZUFubm90YXRpb25zID0gdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMuYWxsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX3dvcmtzcGFjZUVkaXQ7XG4gICAgfVxuICAgIGdldFRleHRFZGl0Q2hhbmdlKGtleSkge1xuICAgICAgICBpZiAoT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmlzKGtleSkpIHtcbiAgICAgICAgICAgIHRoaXMuaW5pdERvY3VtZW50Q2hhbmdlcygpO1xuICAgICAgICAgICAgaWYgKHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dvcmtzcGFjZSBlZGl0IGlzIG5vdCBjb25maWd1cmVkIGZvciBkb2N1bWVudCBjaGFuZ2VzLicpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgdGV4dERvY3VtZW50ID0geyB1cmk6IGtleS51cmksIHZlcnNpb246IGtleS52ZXJzaW9uIH07XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5fdGV4dEVkaXRDaGFuZ2VzW3RleHREb2N1bWVudC51cmldO1xuICAgICAgICAgICAgaWYgKCFyZXN1bHQpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBlZGl0cyA9IFtdO1xuICAgICAgICAgICAgICAgIGNvbnN0IHRleHREb2N1bWVudEVkaXQgPSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHREb2N1bWVudCxcbiAgICAgICAgICAgICAgICAgICAgZWRpdHNcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzLnB1c2godGV4dERvY3VtZW50RWRpdCk7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFRleHRFZGl0Q2hhbmdlSW1wbChlZGl0cywgdGhpcy5fY2hhbmdlQW5ub3RhdGlvbnMpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3RleHRFZGl0Q2hhbmdlc1t0ZXh0RG9jdW1lbnQudXJpXSA9IHJlc3VsdDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmluaXRDaGFuZ2VzKCk7XG4gICAgICAgICAgICBpZiAodGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dvcmtzcGFjZSBlZGl0IGlzIG5vdCBjb25maWd1cmVkIGZvciBub3JtYWwgdGV4dCBlZGl0IGNoYW5nZXMuJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gdGhpcy5fdGV4dEVkaXRDaGFuZ2VzW2tleV07XG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgICAgIGxldCBlZGl0cyA9IFtdO1xuICAgICAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlc1trZXldID0gZWRpdHM7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gbmV3IFRleHRFZGl0Q2hhbmdlSW1wbChlZGl0cyk7XG4gICAgICAgICAgICAgICAgdGhpcy5fdGV4dEVkaXRDaGFuZ2VzW2tleV0gPSByZXN1bHQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgICAgICB9XG4gICAgfVxuICAgIGluaXREb2N1bWVudENoYW5nZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcyA9PT0gdW5kZWZpbmVkICYmIHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucyA9IG5ldyBDaGFuZ2VBbm5vdGF0aW9ucygpO1xuICAgICAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMgPSBbXTtcbiAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlQW5ub3RhdGlvbnMgPSB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5hbGwoKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBpbml0Q2hhbmdlcygpIHtcbiAgICAgICAgaWYgKHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzID09PSB1bmRlZmluZWQgJiYgdGhpcy5fd29ya3NwYWNlRWRpdC5jaGFuZ2VzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuY2hhbmdlcyA9IE9iamVjdC5jcmVhdGUobnVsbCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgY3JlYXRlRmlsZSh1cmksIG9wdGlvbnNPckFubm90YXRpb24sIG9wdGlvbnMpIHtcbiAgICAgICAgdGhpcy5pbml0RG9jdW1lbnRDaGFuZ2VzKCk7XG4gICAgICAgIGlmICh0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcyA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1dvcmtzcGFjZSBlZGl0IGlzIG5vdCBjb25maWd1cmVkIGZvciBkb2N1bWVudCBjaGFuZ2VzLicpO1xuICAgICAgICB9XG4gICAgICAgIGxldCBhbm5vdGF0aW9uO1xuICAgICAgICBpZiAoQ2hhbmdlQW5ub3RhdGlvbi5pcyhvcHRpb25zT3JBbm5vdGF0aW9uKSB8fCBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhvcHRpb25zT3JBbm5vdGF0aW9uKSkge1xuICAgICAgICAgICAgYW5ub3RhdGlvbiA9IG9wdGlvbnNPckFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvcHRpb25zID0gb3B0aW9uc09yQW5ub3RhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBsZXQgb3BlcmF0aW9uO1xuICAgICAgICBsZXQgaWQ7XG4gICAgICAgIGlmIChhbm5vdGF0aW9uID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIG9wZXJhdGlvbiA9IENyZWF0ZUZpbGUuY3JlYXRlKHVyaSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZCA9IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGFubm90YXRpb24pID8gYW5ub3RhdGlvbiA6IHRoaXMuX2NoYW5nZUFubm90YXRpb25zLm1hbmFnZShhbm5vdGF0aW9uKTtcbiAgICAgICAgICAgIG9wZXJhdGlvbiA9IENyZWF0ZUZpbGUuY3JlYXRlKHVyaSwgb3B0aW9ucywgaWQpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuX3dvcmtzcGFjZUVkaXQuZG9jdW1lbnRDaGFuZ2VzLnB1c2gob3BlcmF0aW9uKTtcbiAgICAgICAgaWYgKGlkICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBpZDtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZW5hbWVGaWxlKG9sZFVyaSwgbmV3VXJpLCBvcHRpb25zT3JBbm5vdGF0aW9uLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuaW5pdERvY3VtZW50Q2hhbmdlcygpO1xuICAgICAgICBpZiAodGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXb3Jrc3BhY2UgZWRpdCBpcyBub3QgY29uZmlndXJlZCBmb3IgZG9jdW1lbnQgY2hhbmdlcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYW5ub3RhdGlvbjtcbiAgICAgICAgaWYgKENoYW5nZUFubm90YXRpb24uaXMob3B0aW9uc09yQW5ub3RhdGlvbikgfHwgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMob3B0aW9uc09yQW5ub3RhdGlvbikpIHtcbiAgICAgICAgICAgIGFubm90YXRpb24gPSBvcHRpb25zT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnNPckFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG9wZXJhdGlvbjtcbiAgICAgICAgbGV0IGlkO1xuICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcGVyYXRpb24gPSBSZW5hbWVGaWxlLmNyZWF0ZShvbGRVcmksIG5ld1VyaSwgb3B0aW9ucyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZCA9IENoYW5nZUFubm90YXRpb25JZGVudGlmaWVyLmlzKGFubm90YXRpb24pID8gYW5ub3RhdGlvbiA6IHRoaXMuX2NoYW5nZUFubm90YXRpb25zLm1hbmFnZShhbm5vdGF0aW9uKTtcbiAgICAgICAgICAgIG9wZXJhdGlvbiA9IFJlbmFtZUZpbGUuY3JlYXRlKG9sZFVyaSwgbmV3VXJpLCBvcHRpb25zLCBpZCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMucHVzaChvcGVyYXRpb24pO1xuICAgICAgICBpZiAoaWQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmV0dXJuIGlkO1xuICAgICAgICB9XG4gICAgfVxuICAgIGRlbGV0ZUZpbGUodXJpLCBvcHRpb25zT3JBbm5vdGF0aW9uLCBvcHRpb25zKSB7XG4gICAgICAgIHRoaXMuaW5pdERvY3VtZW50Q2hhbmdlcygpO1xuICAgICAgICBpZiAodGhpcy5fd29ya3NwYWNlRWRpdC5kb2N1bWVudENoYW5nZXMgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdXb3Jrc3BhY2UgZWRpdCBpcyBub3QgY29uZmlndXJlZCBmb3IgZG9jdW1lbnQgY2hhbmdlcy4nKTtcbiAgICAgICAgfVxuICAgICAgICBsZXQgYW5ub3RhdGlvbjtcbiAgICAgICAgaWYgKENoYW5nZUFubm90YXRpb24uaXMob3B0aW9uc09yQW5ub3RhdGlvbikgfHwgQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIuaXMob3B0aW9uc09yQW5ub3RhdGlvbikpIHtcbiAgICAgICAgICAgIGFubm90YXRpb24gPSBvcHRpb25zT3JBbm5vdGF0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgb3B0aW9ucyA9IG9wdGlvbnNPckFubm90YXRpb247XG4gICAgICAgIH1cbiAgICAgICAgbGV0IG9wZXJhdGlvbjtcbiAgICAgICAgbGV0IGlkO1xuICAgICAgICBpZiAoYW5ub3RhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBvcGVyYXRpb24gPSBEZWxldGVGaWxlLmNyZWF0ZSh1cmksIG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWQgPSBDaGFuZ2VBbm5vdGF0aW9uSWRlbnRpZmllci5pcyhhbm5vdGF0aW9uKSA/IGFubm90YXRpb24gOiB0aGlzLl9jaGFuZ2VBbm5vdGF0aW9ucy5tYW5hZ2UoYW5ub3RhdGlvbik7XG4gICAgICAgICAgICBvcGVyYXRpb24gPSBEZWxldGVGaWxlLmNyZWF0ZSh1cmksIG9wdGlvbnMsIGlkKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLl93b3Jrc3BhY2VFZGl0LmRvY3VtZW50Q2hhbmdlcy5wdXNoKG9wZXJhdGlvbik7XG4gICAgICAgIGlmIChpZCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgIH1cbiAgICB9XG59XG4vKipcbiAqIFRoZSBUZXh0RG9jdW1lbnRJZGVudGlmaWVyIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIFRleHREb2N1bWVudElkZW50aWZpZXJ9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIFRleHREb2N1bWVudElkZW50aWZpZXI7XG4oZnVuY3Rpb24gKFRleHREb2N1bWVudElkZW50aWZpZXIpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFRleHREb2N1bWVudElkZW50aWZpZXIgbGl0ZXJhbC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSBkb2N1bWVudCdzIHVyaS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodXJpKSB7XG4gICAgICAgIHJldHVybiB7IHVyaSB9O1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIFRleHREb2N1bWVudElkZW50aWZpZXJ9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpO1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnRJZGVudGlmaWVyLmlzID0gaXM7XG59KShUZXh0RG9jdW1lbnRJZGVudGlmaWVyIHx8IChUZXh0RG9jdW1lbnRJZGVudGlmaWVyID0ge30pKTtcbi8qKlxuICogVGhlIFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcn0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcjtcbihmdW5jdGlvbiAoVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciBsaXRlcmFsLlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIGRvY3VtZW50J3MgdXJpLlxuICAgICAqIEBwYXJhbSB2ZXJzaW9uIFRoZSBkb2N1bWVudCdzIHZlcnNpb24uXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHVyaSwgdmVyc2lvbikge1xuICAgICAgICByZXR1cm4geyB1cmksIHZlcnNpb24gfTtcbiAgICB9XG4gICAgVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllci5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudXJpKSAmJiBJcy5pbnRlZ2VyKGNhbmRpZGF0ZS52ZXJzaW9uKTtcbiAgICB9XG4gICAgVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllci5pcyA9IGlzO1xufSkoVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciB8fCAoVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciA9IHt9KSk7XG4vKipcbiAqIFRoZSBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXI7XG4oZnVuY3Rpb24gKE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllcikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyIGxpdGVyYWwuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgZG9jdW1lbnQncyB1cmkuXG4gICAgICogQHBhcmFtIHZlcnNpb24gVGhlIGRvY3VtZW50J3MgdmVyc2lvbi5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodXJpLCB2ZXJzaW9uKSB7XG4gICAgICAgIHJldHVybiB7IHVyaSwgdmVyc2lvbiB9O1xuICAgIH1cbiAgICBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIElzLnN0cmluZyhjYW5kaWRhdGUudXJpKSAmJiAoY2FuZGlkYXRlLnZlcnNpb24gPT09IG51bGwgfHwgSXMuaW50ZWdlcihjYW5kaWRhdGUudmVyc2lvbikpO1xuICAgIH1cbiAgICBPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIuaXMgPSBpcztcbn0pKE9wdGlvbmFsVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciB8fCAoT3B0aW9uYWxWZXJzaW9uZWRUZXh0RG9jdW1lbnRJZGVudGlmaWVyID0ge30pKTtcbi8qKlxuICogVGhlIFRleHREb2N1bWVudEl0ZW0gbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgVGV4dERvY3VtZW50SXRlbX0gbGl0ZXJhbHMuXG4gKi9cbmV4cG9ydCB2YXIgVGV4dERvY3VtZW50SXRlbTtcbihmdW5jdGlvbiAoVGV4dERvY3VtZW50SXRlbSkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgVGV4dERvY3VtZW50SXRlbSBsaXRlcmFsLlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIGRvY3VtZW50J3MgdXJpLlxuICAgICAqIEBwYXJhbSBsYW5ndWFnZUlkIFRoZSBkb2N1bWVudCdzIGxhbmd1YWdlIGlkZW50aWZpZXIuXG4gICAgICogQHBhcmFtIHZlcnNpb24gVGhlIGRvY3VtZW50J3MgdmVyc2lvbiBudW1iZXIuXG4gICAgICogQHBhcmFtIHRleHQgVGhlIGRvY3VtZW50J3MgdGV4dC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodXJpLCBsYW5ndWFnZUlkLCB2ZXJzaW9uLCB0ZXh0KSB7XG4gICAgICAgIHJldHVybiB7IHVyaSwgbGFuZ3VhZ2VJZCwgdmVyc2lvbiwgdGV4dCB9O1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnRJdGVtLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIFRleHREb2N1bWVudEl0ZW19IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS51cmkpICYmIElzLnN0cmluZyhjYW5kaWRhdGUubGFuZ3VhZ2VJZCkgJiYgSXMuaW50ZWdlcihjYW5kaWRhdGUudmVyc2lvbikgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS50ZXh0KTtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50SXRlbS5pcyA9IGlzO1xufSkoVGV4dERvY3VtZW50SXRlbSB8fCAoVGV4dERvY3VtZW50SXRlbSA9IHt9KSk7XG4vKipcbiAqIERlc2NyaWJlcyB0aGUgY29udGVudCB0eXBlIHRoYXQgYSBjbGllbnQgc3VwcG9ydHMgaW4gdmFyaW91c1xuICogcmVzdWx0IGxpdGVyYWxzIGxpa2UgYEhvdmVyYCwgYFBhcmFtZXRlckluZm9gIG9yIGBDb21wbGV0aW9uSXRlbWAuXG4gKlxuICogUGxlYXNlIG5vdGUgdGhhdCBgTWFya3VwS2luZHNgIG11c3Qgbm90IHN0YXJ0IHdpdGggYSBgJGAuIFRoaXMga2luZHNcbiAqIGFyZSByZXNlcnZlZCBmb3IgaW50ZXJuYWwgdXNhZ2UuXG4gKi9cbmV4cG9ydCB2YXIgTWFya3VwS2luZDtcbihmdW5jdGlvbiAoTWFya3VwS2luZCkge1xuICAgIC8qKlxuICAgICAqIFBsYWluIHRleHQgaXMgc3VwcG9ydGVkIGFzIGEgY29udGVudCBmb3JtYXRcbiAgICAgKi9cbiAgICBNYXJrdXBLaW5kLlBsYWluVGV4dCA9ICdwbGFpbnRleHQnO1xuICAgIC8qKlxuICAgICAqIE1hcmtkb3duIGlzIHN1cHBvcnRlZCBhcyBhIGNvbnRlbnQgZm9ybWF0XG4gICAgICovXG4gICAgTWFya3VwS2luZC5NYXJrZG93biA9ICdtYXJrZG93bic7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIGlzIGEgdmFsdWUgb2YgdGhlIHtAbGluayBNYXJrdXBLaW5kfSB0eXBlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlID09PSBNYXJrdXBLaW5kLlBsYWluVGV4dCB8fCBjYW5kaWRhdGUgPT09IE1hcmt1cEtpbmQuTWFya2Rvd247XG4gICAgfVxuICAgIE1hcmt1cEtpbmQuaXMgPSBpcztcbn0pKE1hcmt1cEtpbmQgfHwgKE1hcmt1cEtpbmQgPSB7fSkpO1xuZXhwb3J0IHZhciBNYXJrdXBDb250ZW50O1xuKGZ1bmN0aW9uIChNYXJrdXBDb250ZW50KSB7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgTWFya3VwQ29udGVudH0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbCh2YWx1ZSkgJiYgTWFya3VwS2luZC5pcyhjYW5kaWRhdGUua2luZCkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS52YWx1ZSk7XG4gICAgfVxuICAgIE1hcmt1cENvbnRlbnQuaXMgPSBpcztcbn0pKE1hcmt1cENvbnRlbnQgfHwgKE1hcmt1cENvbnRlbnQgPSB7fSkpO1xuLyoqXG4gKiBUaGUga2luZCBvZiBhIGNvbXBsZXRpb24gZW50cnkuXG4gKi9cbmV4cG9ydCB2YXIgQ29tcGxldGlvbkl0ZW1LaW5kO1xuKGZ1bmN0aW9uIChDb21wbGV0aW9uSXRlbUtpbmQpIHtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuVGV4dCA9IDE7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLk1ldGhvZCA9IDI7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkZ1bmN0aW9uID0gMztcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuQ29uc3RydWN0b3IgPSA0O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5GaWVsZCA9IDU7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlZhcmlhYmxlID0gNjtcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuQ2xhc3MgPSA3O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5JbnRlcmZhY2UgPSA4O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5Nb2R1bGUgPSA5O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5Qcm9wZXJ0eSA9IDEwO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5Vbml0ID0gMTE7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlZhbHVlID0gMTI7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkVudW0gPSAxMztcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuS2V5d29yZCA9IDE0O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5TbmlwcGV0ID0gMTU7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkNvbG9yID0gMTY7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkZpbGUgPSAxNztcbiAgICBDb21wbGV0aW9uSXRlbUtpbmQuUmVmZXJlbmNlID0gMTg7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkZvbGRlciA9IDE5O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5FbnVtTWVtYmVyID0gMjA7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLkNvbnN0YW50ID0gMjE7XG4gICAgQ29tcGxldGlvbkl0ZW1LaW5kLlN0cnVjdCA9IDIyO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5FdmVudCA9IDIzO1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5PcGVyYXRvciA9IDI0O1xuICAgIENvbXBsZXRpb25JdGVtS2luZC5UeXBlUGFyYW1ldGVyID0gMjU7XG59KShDb21wbGV0aW9uSXRlbUtpbmQgfHwgKENvbXBsZXRpb25JdGVtS2luZCA9IHt9KSk7XG4vKipcbiAqIERlZmluZXMgd2hldGhlciB0aGUgaW5zZXJ0IHRleHQgaW4gYSBjb21wbGV0aW9uIGl0ZW0gc2hvdWxkIGJlIGludGVycHJldGVkIGFzXG4gKiBwbGFpbiB0ZXh0IG9yIGEgc25pcHBldC5cbiAqL1xuZXhwb3J0IHZhciBJbnNlcnRUZXh0Rm9ybWF0O1xuKGZ1bmN0aW9uIChJbnNlcnRUZXh0Rm9ybWF0KSB7XG4gICAgLyoqXG4gICAgICogVGhlIHByaW1hcnkgdGV4dCB0byBiZSBpbnNlcnRlZCBpcyB0cmVhdGVkIGFzIGEgcGxhaW4gc3RyaW5nLlxuICAgICAqL1xuICAgIEluc2VydFRleHRGb3JtYXQuUGxhaW5UZXh0ID0gMTtcbiAgICAvKipcbiAgICAgKiBUaGUgcHJpbWFyeSB0ZXh0IHRvIGJlIGluc2VydGVkIGlzIHRyZWF0ZWQgYXMgYSBzbmlwcGV0LlxuICAgICAqXG4gICAgICogQSBzbmlwcGV0IGNhbiBkZWZpbmUgdGFiIHN0b3BzIGFuZCBwbGFjZWhvbGRlcnMgd2l0aCBgJDFgLCBgJDJgXG4gICAgICogYW5kIGAkezM6Zm9vfWAuIGAkMGAgZGVmaW5lcyB0aGUgZmluYWwgdGFiIHN0b3AsIGl0IGRlZmF1bHRzIHRvXG4gICAgICogdGhlIGVuZCBvZiB0aGUgc25pcHBldC4gUGxhY2Vob2xkZXJzIHdpdGggZXF1YWwgaWRlbnRpZmllcnMgYXJlIGxpbmtlZCxcbiAgICAgKiB0aGF0IGlzIHR5cGluZyBpbiBvbmUgd2lsbCB1cGRhdGUgb3RoZXJzIHRvby5cbiAgICAgKlxuICAgICAqIFNlZSBhbHNvOiBodHRwczovL21pY3Jvc29mdC5naXRodWIuaW8vbGFuZ3VhZ2Utc2VydmVyLXByb3RvY29sL3NwZWNpZmljYXRpb25zL3NwZWNpZmljYXRpb24tY3VycmVudC8jc25pcHBldF9zeW50YXhcbiAgICAgKi9cbiAgICBJbnNlcnRUZXh0Rm9ybWF0LlNuaXBwZXQgPSAyO1xufSkoSW5zZXJ0VGV4dEZvcm1hdCB8fCAoSW5zZXJ0VGV4dEZvcm1hdCA9IHt9KSk7XG4vKipcbiAqIENvbXBsZXRpb24gaXRlbSB0YWdzIGFyZSBleHRyYSBhbm5vdGF0aW9ucyB0aGF0IHR3ZWFrIHRoZSByZW5kZXJpbmcgb2YgYSBjb21wbGV0aW9uXG4gKiBpdGVtLlxuICpcbiAqIEBzaW5jZSAzLjE1LjBcbiAqL1xuZXhwb3J0IHZhciBDb21wbGV0aW9uSXRlbVRhZztcbihmdW5jdGlvbiAoQ29tcGxldGlvbkl0ZW1UYWcpIHtcbiAgICAvKipcbiAgICAgKiBSZW5kZXIgYSBjb21wbGV0aW9uIGFzIG9ic29sZXRlLCB1c3VhbGx5IHVzaW5nIGEgc3RyaWtlLW91dC5cbiAgICAgKi9cbiAgICBDb21wbGV0aW9uSXRlbVRhZy5EZXByZWNhdGVkID0gMTtcbn0pKENvbXBsZXRpb25JdGVtVGFnIHx8IChDb21wbGV0aW9uSXRlbVRhZyA9IHt9KSk7XG4vKipcbiAqIFRoZSBJbnNlcnRSZXBsYWNlRWRpdCBuYW1lc3BhY2UgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCBpbnNlcnQgLyByZXBsYWNlIGVkaXRzLlxuICpcbiAqIEBzaW5jZSAzLjE2LjBcbiAqL1xuZXhwb3J0IHZhciBJbnNlcnRSZXBsYWNlRWRpdDtcbihmdW5jdGlvbiAoSW5zZXJ0UmVwbGFjZUVkaXQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGluc2VydCAvIHJlcGxhY2UgZWRpdFxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShuZXdUZXh0LCBpbnNlcnQsIHJlcGxhY2UpIHtcbiAgICAgICAgcmV0dXJuIHsgbmV3VGV4dCwgaW5zZXJ0LCByZXBsYWNlIH07XG4gICAgfVxuICAgIEluc2VydFJlcGxhY2VFZGl0LmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbGl0ZXJhbCBjb25mb3JtcyB0byB0aGUge0BsaW5rIEluc2VydFJlcGxhY2VFZGl0fSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS5uZXdUZXh0KSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUuaW5zZXJ0KSAmJiBSYW5nZS5pcyhjYW5kaWRhdGUucmVwbGFjZSk7XG4gICAgfVxuICAgIEluc2VydFJlcGxhY2VFZGl0LmlzID0gaXM7XG59KShJbnNlcnRSZXBsYWNlRWRpdCB8fCAoSW5zZXJ0UmVwbGFjZUVkaXQgPSB7fSkpO1xuLyoqXG4gKiBIb3cgd2hpdGVzcGFjZSBhbmQgaW5kZW50YXRpb24gaXMgaGFuZGxlZCBkdXJpbmcgY29tcGxldGlvblxuICogaXRlbSBpbnNlcnRpb24uXG4gKlxuICogQHNpbmNlIDMuMTYuMFxuICovXG5leHBvcnQgdmFyIEluc2VydFRleHRNb2RlO1xuKGZ1bmN0aW9uIChJbnNlcnRUZXh0TW9kZSkge1xuICAgIC8qKlxuICAgICAqIFRoZSBpbnNlcnRpb24gb3IgcmVwbGFjZSBzdHJpbmdzIGlzIHRha2VuIGFzIGl0IGlzLiBJZiB0aGVcbiAgICAgKiB2YWx1ZSBpcyBtdWx0aSBsaW5lIHRoZSBsaW5lcyBiZWxvdyB0aGUgY3Vyc29yIHdpbGwgYmVcbiAgICAgKiBpbnNlcnRlZCB1c2luZyB0aGUgaW5kZW50YXRpb24gZGVmaW5lZCBpbiB0aGUgc3RyaW5nIHZhbHVlLlxuICAgICAqIFRoZSBjbGllbnQgd2lsbCBub3QgYXBwbHkgYW55IGtpbmQgb2YgYWRqdXN0bWVudHMgdG8gdGhlXG4gICAgICogc3RyaW5nLlxuICAgICAqL1xuICAgIEluc2VydFRleHRNb2RlLmFzSXMgPSAxO1xuICAgIC8qKlxuICAgICAqIFRoZSBlZGl0b3IgYWRqdXN0cyBsZWFkaW5nIHdoaXRlc3BhY2Ugb2YgbmV3IGxpbmVzIHNvIHRoYXRcbiAgICAgKiB0aGV5IG1hdGNoIHRoZSBpbmRlbnRhdGlvbiB1cCB0byB0aGUgY3Vyc29yIG9mIHRoZSBsaW5lIGZvclxuICAgICAqIHdoaWNoIHRoZSBpdGVtIGlzIGFjY2VwdGVkLlxuICAgICAqXG4gICAgICogQ29uc2lkZXIgYSBsaW5lIGxpa2UgdGhpczogPDJ0YWJzPjxjdXJzb3I+PDN0YWJzPmZvby4gQWNjZXB0aW5nIGFcbiAgICAgKiBtdWx0aSBsaW5lIGNvbXBsZXRpb24gaXRlbSBpcyBpbmRlbnRlZCB1c2luZyAyIHRhYnMgYW5kIGFsbFxuICAgICAqIGZvbGxvd2luZyBsaW5lcyBpbnNlcnRlZCB3aWxsIGJlIGluZGVudGVkIHVzaW5nIDIgdGFicyBhcyB3ZWxsLlxuICAgICAqL1xuICAgIEluc2VydFRleHRNb2RlLmFkanVzdEluZGVudGF0aW9uID0gMjtcbn0pKEluc2VydFRleHRNb2RlIHx8IChJbnNlcnRUZXh0TW9kZSA9IHt9KSk7XG5leHBvcnQgdmFyIENvbXBsZXRpb25JdGVtTGFiZWxEZXRhaWxzO1xuKGZ1bmN0aW9uIChDb21wbGV0aW9uSXRlbUxhYmVsRGV0YWlscykge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICYmIChJcy5zdHJpbmcoY2FuZGlkYXRlLmRldGFpbCkgfHwgY2FuZGlkYXRlLmRldGFpbCA9PT0gdW5kZWZpbmVkKSAmJlxuICAgICAgICAgICAgKElzLnN0cmluZyhjYW5kaWRhdGUuZGVzY3JpcHRpb24pIHx8IGNhbmRpZGF0ZS5kZXNjcmlwdGlvbiA9PT0gdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgQ29tcGxldGlvbkl0ZW1MYWJlbERldGFpbHMuaXMgPSBpcztcbn0pKENvbXBsZXRpb25JdGVtTGFiZWxEZXRhaWxzIHx8IChDb21wbGV0aW9uSXRlbUxhYmVsRGV0YWlscyA9IHt9KSk7XG4vKipcbiAqIFRoZSBDb21wbGV0aW9uSXRlbSBuYW1lc3BhY2UgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aFxuICogY29tcGxldGlvbiBpdGVtcy5cbiAqL1xuZXhwb3J0IHZhciBDb21wbGV0aW9uSXRlbTtcbihmdW5jdGlvbiAoQ29tcGxldGlvbkl0ZW0pIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBjb21wbGV0aW9uIGl0ZW0gYW5kIHNlZWQgaXQgd2l0aCBhIGxhYmVsLlxuICAgICAqIEBwYXJhbSBsYWJlbCBUaGUgY29tcGxldGlvbiBpdGVtJ3MgbGFiZWxcbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUobGFiZWwpIHtcbiAgICAgICAgcmV0dXJuIHsgbGFiZWwgfTtcbiAgICB9XG4gICAgQ29tcGxldGlvbkl0ZW0uY3JlYXRlID0gY3JlYXRlO1xufSkoQ29tcGxldGlvbkl0ZW0gfHwgKENvbXBsZXRpb25JdGVtID0ge30pKTtcbi8qKlxuICogVGhlIENvbXBsZXRpb25MaXN0IG5hbWVzcGFjZSBwcm92aWRlcyBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoXG4gKiBjb21wbGV0aW9uIGxpc3RzLlxuICovXG5leHBvcnQgdmFyIENvbXBsZXRpb25MaXN0O1xuKGZ1bmN0aW9uIChDb21wbGV0aW9uTGlzdCkge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgY29tcGxldGlvbiBsaXN0LlxuICAgICAqXG4gICAgICogQHBhcmFtIGl0ZW1zIFRoZSBjb21wbGV0aW9uIGl0ZW1zLlxuICAgICAqIEBwYXJhbSBpc0luY29tcGxldGUgVGhlIGxpc3QgaXMgbm90IGNvbXBsZXRlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShpdGVtcywgaXNJbmNvbXBsZXRlKSB7XG4gICAgICAgIHJldHVybiB7IGl0ZW1zOiBpdGVtcyA/IGl0ZW1zIDogW10sIGlzSW5jb21wbGV0ZTogISFpc0luY29tcGxldGUgfTtcbiAgICB9XG4gICAgQ29tcGxldGlvbkxpc3QuY3JlYXRlID0gY3JlYXRlO1xufSkoQ29tcGxldGlvbkxpc3QgfHwgKENvbXBsZXRpb25MaXN0ID0ge30pKTtcbmV4cG9ydCB2YXIgTWFya2VkU3RyaW5nO1xuKGZ1bmN0aW9uIChNYXJrZWRTdHJpbmcpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbWFya2VkIHN0cmluZyBmcm9tIHBsYWluIHRleHQuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gcGxhaW5UZXh0IFRoZSBwbGFpbiB0ZXh0LlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGZyb21QbGFpblRleHQocGxhaW5UZXh0KSB7XG4gICAgICAgIHJldHVybiBwbGFpblRleHQucmVwbGFjZSgvW1xcXFxgKl97fVtcXF0oKSMrXFwtLiFdL2csICdcXFxcJCYnKTsgLy8gZXNjYXBlIG1hcmtkb3duIHN5bnRheCB0b2tlbnM6IGh0dHA6Ly9kYXJpbmdmaXJlYmFsbC5uZXQvcHJvamVjdHMvbWFya2Rvd24vc3ludGF4I2JhY2tzbGFzaFxuICAgIH1cbiAgICBNYXJrZWRTdHJpbmcuZnJvbVBsYWluVGV4dCA9IGZyb21QbGFpblRleHQ7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgTWFya2VkU3RyaW5nfSB0eXBlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuc3RyaW5nKGNhbmRpZGF0ZSkgfHwgKElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLmxhbmd1YWdlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnZhbHVlKSk7XG4gICAgfVxuICAgIE1hcmtlZFN0cmluZy5pcyA9IGlzO1xufSkoTWFya2VkU3RyaW5nIHx8IChNYXJrZWRTdHJpbmcgPSB7fSkpO1xuZXhwb3J0IHZhciBIb3ZlcjtcbihmdW5jdGlvbiAoSG92ZXIpIHtcbiAgICAvKipcbiAgICAgKiBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgY29uZm9ybXMgdG8gdGhlIHtAbGluayBIb3Zlcn0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuICEhY2FuZGlkYXRlICYmIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKSAmJiAoTWFya3VwQ29udGVudC5pcyhjYW5kaWRhdGUuY29udGVudHMpIHx8XG4gICAgICAgICAgICBNYXJrZWRTdHJpbmcuaXMoY2FuZGlkYXRlLmNvbnRlbnRzKSB8fFxuICAgICAgICAgICAgSXMudHlwZWRBcnJheShjYW5kaWRhdGUuY29udGVudHMsIE1hcmtlZFN0cmluZy5pcykpICYmICh2YWx1ZS5yYW5nZSA9PT0gdW5kZWZpbmVkIHx8IFJhbmdlLmlzKHZhbHVlLnJhbmdlKSk7XG4gICAgfVxuICAgIEhvdmVyLmlzID0gaXM7XG59KShIb3ZlciB8fCAoSG92ZXIgPSB7fSkpO1xuLyoqXG4gKiBUaGUgUGFyYW1ldGVySW5mb3JtYXRpb24gbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgUGFyYW1ldGVySW5mb3JtYXRpb259IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIFBhcmFtZXRlckluZm9ybWF0aW9uO1xuKGZ1bmN0aW9uIChQYXJhbWV0ZXJJbmZvcm1hdGlvbikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgcGFyYW1ldGVyIGluZm9ybWF0aW9uIGxpdGVyYWwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbGFiZWwgQSBsYWJlbCBzdHJpbmcuXG4gICAgICogQHBhcmFtIGRvY3VtZW50YXRpb24gQSBkb2Mgc3RyaW5nLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShsYWJlbCwgZG9jdW1lbnRhdGlvbikge1xuICAgICAgICByZXR1cm4gZG9jdW1lbnRhdGlvbiA/IHsgbGFiZWwsIGRvY3VtZW50YXRpb24gfSA6IHsgbGFiZWwgfTtcbiAgICB9XG4gICAgUGFyYW1ldGVySW5mb3JtYXRpb24uY3JlYXRlID0gY3JlYXRlO1xufSkoUGFyYW1ldGVySW5mb3JtYXRpb24gfHwgKFBhcmFtZXRlckluZm9ybWF0aW9uID0ge30pKTtcbi8qKlxuICogVGhlIFNpZ25hdHVyZUluZm9ybWF0aW9uIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIFNpZ25hdHVyZUluZm9ybWF0aW9ufSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBTaWduYXR1cmVJbmZvcm1hdGlvbjtcbihmdW5jdGlvbiAoU2lnbmF0dXJlSW5mb3JtYXRpb24pIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUobGFiZWwsIGRvY3VtZW50YXRpb24sIC4uLnBhcmFtZXRlcnMpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHsgbGFiZWwgfTtcbiAgICAgICAgaWYgKElzLmRlZmluZWQoZG9jdW1lbnRhdGlvbikpIHtcbiAgICAgICAgICAgIHJlc3VsdC5kb2N1bWVudGF0aW9uID0gZG9jdW1lbnRhdGlvbjtcbiAgICAgICAgfVxuICAgICAgICBpZiAoSXMuZGVmaW5lZChwYXJhbWV0ZXJzKSkge1xuICAgICAgICAgICAgcmVzdWx0LnBhcmFtZXRlcnMgPSBwYXJhbWV0ZXJzO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmVzdWx0LnBhcmFtZXRlcnMgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBTaWduYXR1cmVJbmZvcm1hdGlvbi5jcmVhdGUgPSBjcmVhdGU7XG59KShTaWduYXR1cmVJbmZvcm1hdGlvbiB8fCAoU2lnbmF0dXJlSW5mb3JtYXRpb24gPSB7fSkpO1xuLyoqXG4gKiBBIGRvY3VtZW50IGhpZ2hsaWdodCBraW5kLlxuICovXG5leHBvcnQgdmFyIERvY3VtZW50SGlnaGxpZ2h0S2luZDtcbihmdW5jdGlvbiAoRG9jdW1lbnRIaWdobGlnaHRLaW5kKSB7XG4gICAgLyoqXG4gICAgICogQSB0ZXh0dWFsIG9jY3VycmVuY2UuXG4gICAgICovXG4gICAgRG9jdW1lbnRIaWdobGlnaHRLaW5kLlRleHQgPSAxO1xuICAgIC8qKlxuICAgICAqIFJlYWQtYWNjZXNzIG9mIGEgc3ltYm9sLCBsaWtlIHJlYWRpbmcgYSB2YXJpYWJsZS5cbiAgICAgKi9cbiAgICBEb2N1bWVudEhpZ2hsaWdodEtpbmQuUmVhZCA9IDI7XG4gICAgLyoqXG4gICAgICogV3JpdGUtYWNjZXNzIG9mIGEgc3ltYm9sLCBsaWtlIHdyaXRpbmcgdG8gYSB2YXJpYWJsZS5cbiAgICAgKi9cbiAgICBEb2N1bWVudEhpZ2hsaWdodEtpbmQuV3JpdGUgPSAzO1xufSkoRG9jdW1lbnRIaWdobGlnaHRLaW5kIHx8IChEb2N1bWVudEhpZ2hsaWdodEtpbmQgPSB7fSkpO1xuLyoqXG4gKiBEb2N1bWVudEhpZ2hsaWdodCBuYW1lc3BhY2UgdG8gcHJvdmlkZSBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIERvY3VtZW50SGlnaGxpZ2h0fSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBEb2N1bWVudEhpZ2hsaWdodDtcbihmdW5jdGlvbiAoRG9jdW1lbnRIaWdobGlnaHQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBEb2N1bWVudEhpZ2hsaWdodCBvYmplY3QuXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSB0aGUgaGlnaGxpZ2h0IGFwcGxpZXMgdG8uXG4gICAgICogQHBhcmFtIGtpbmQgVGhlIGhpZ2hsaWdodCBraW5kXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCBraW5kKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IHJhbmdlIH07XG4gICAgICAgIGlmIChJcy5udW1iZXIoa2luZCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5raW5kID0ga2luZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBEb2N1bWVudEhpZ2hsaWdodC5jcmVhdGUgPSBjcmVhdGU7XG59KShEb2N1bWVudEhpZ2hsaWdodCB8fCAoRG9jdW1lbnRIaWdobGlnaHQgPSB7fSkpO1xuLyoqXG4gKiBBIHN5bWJvbCBraW5kLlxuICovXG5leHBvcnQgdmFyIFN5bWJvbEtpbmQ7XG4oZnVuY3Rpb24gKFN5bWJvbEtpbmQpIHtcbiAgICBTeW1ib2xLaW5kLkZpbGUgPSAxO1xuICAgIFN5bWJvbEtpbmQuTW9kdWxlID0gMjtcbiAgICBTeW1ib2xLaW5kLk5hbWVzcGFjZSA9IDM7XG4gICAgU3ltYm9sS2luZC5QYWNrYWdlID0gNDtcbiAgICBTeW1ib2xLaW5kLkNsYXNzID0gNTtcbiAgICBTeW1ib2xLaW5kLk1ldGhvZCA9IDY7XG4gICAgU3ltYm9sS2luZC5Qcm9wZXJ0eSA9IDc7XG4gICAgU3ltYm9sS2luZC5GaWVsZCA9IDg7XG4gICAgU3ltYm9sS2luZC5Db25zdHJ1Y3RvciA9IDk7XG4gICAgU3ltYm9sS2luZC5FbnVtID0gMTA7XG4gICAgU3ltYm9sS2luZC5JbnRlcmZhY2UgPSAxMTtcbiAgICBTeW1ib2xLaW5kLkZ1bmN0aW9uID0gMTI7XG4gICAgU3ltYm9sS2luZC5WYXJpYWJsZSA9IDEzO1xuICAgIFN5bWJvbEtpbmQuQ29uc3RhbnQgPSAxNDtcbiAgICBTeW1ib2xLaW5kLlN0cmluZyA9IDE1O1xuICAgIFN5bWJvbEtpbmQuTnVtYmVyID0gMTY7XG4gICAgU3ltYm9sS2luZC5Cb29sZWFuID0gMTc7XG4gICAgU3ltYm9sS2luZC5BcnJheSA9IDE4O1xuICAgIFN5bWJvbEtpbmQuT2JqZWN0ID0gMTk7XG4gICAgU3ltYm9sS2luZC5LZXkgPSAyMDtcbiAgICBTeW1ib2xLaW5kLk51bGwgPSAyMTtcbiAgICBTeW1ib2xLaW5kLkVudW1NZW1iZXIgPSAyMjtcbiAgICBTeW1ib2xLaW5kLlN0cnVjdCA9IDIzO1xuICAgIFN5bWJvbEtpbmQuRXZlbnQgPSAyNDtcbiAgICBTeW1ib2xLaW5kLk9wZXJhdG9yID0gMjU7XG4gICAgU3ltYm9sS2luZC5UeXBlUGFyYW1ldGVyID0gMjY7XG59KShTeW1ib2xLaW5kIHx8IChTeW1ib2xLaW5kID0ge30pKTtcbi8qKlxuICogU3ltYm9sIHRhZ3MgYXJlIGV4dHJhIGFubm90YXRpb25zIHRoYXQgdHdlYWsgdGhlIHJlbmRlcmluZyBvZiBhIHN5bWJvbC5cbiAqXG4gKiBAc2luY2UgMy4xNlxuICovXG5leHBvcnQgdmFyIFN5bWJvbFRhZztcbihmdW5jdGlvbiAoU3ltYm9sVGFnKSB7XG4gICAgLyoqXG4gICAgICogUmVuZGVyIGEgc3ltYm9sIGFzIG9ic29sZXRlLCB1c3VhbGx5IHVzaW5nIGEgc3RyaWtlLW91dC5cbiAgICAgKi9cbiAgICBTeW1ib2xUYWcuRGVwcmVjYXRlZCA9IDE7XG59KShTeW1ib2xUYWcgfHwgKFN5bWJvbFRhZyA9IHt9KSk7XG5leHBvcnQgdmFyIFN5bWJvbEluZm9ybWF0aW9uO1xuKGZ1bmN0aW9uIChTeW1ib2xJbmZvcm1hdGlvbikge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgc3ltYm9sIGluZm9ybWF0aW9uIGxpdGVyYWwuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSBraW5kIFRoZSBraW5kIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIHJhbmdlIFRoZSByYW5nZSBvZiB0aGUgbG9jYXRpb24gb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gdXJpIFRoZSByZXNvdXJjZSBvZiB0aGUgbG9jYXRpb24gb2Ygc3ltYm9sLlxuICAgICAqIEBwYXJhbSBjb250YWluZXJOYW1lIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgY29udGFpbmluZyB0aGUgc3ltYm9sLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShuYW1lLCBraW5kLCByYW5nZSwgdXJpLCBjb250YWluZXJOYW1lKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7XG4gICAgICAgICAgICBuYW1lLFxuICAgICAgICAgICAga2luZCxcbiAgICAgICAgICAgIGxvY2F0aW9uOiB7IHVyaSwgcmFuZ2UgfVxuICAgICAgICB9O1xuICAgICAgICBpZiAoY29udGFpbmVyTmFtZSkge1xuICAgICAgICAgICAgcmVzdWx0LmNvbnRhaW5lck5hbWUgPSBjb250YWluZXJOYW1lO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIFN5bWJvbEluZm9ybWF0aW9uLmNyZWF0ZSA9IGNyZWF0ZTtcbn0pKFN5bWJvbEluZm9ybWF0aW9uIHx8IChTeW1ib2xJbmZvcm1hdGlvbiA9IHt9KSk7XG5leHBvcnQgdmFyIFdvcmtzcGFjZVN5bWJvbDtcbihmdW5jdGlvbiAoV29ya3NwYWNlU3ltYm9sKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGEgbmV3IHdvcmtzcGFjZSBzeW1ib2wuXG4gICAgICpcbiAgICAgKiBAcGFyYW0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSBraW5kIFRoZSBraW5kIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIHVyaSBUaGUgcmVzb3VyY2Ugb2YgdGhlIGxvY2F0aW9uIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIHJhbmdlIEFuIG9wdGlvbnMgcmFuZ2Ugb2YgdGhlIGxvY2F0aW9uLlxuICAgICAqIEByZXR1cm5zIEEgV29ya3NwYWNlU3ltYm9sLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShuYW1lLCBraW5kLCB1cmksIHJhbmdlKSB7XG4gICAgICAgIHJldHVybiByYW5nZSAhPT0gdW5kZWZpbmVkXG4gICAgICAgICAgICA/IHsgbmFtZSwga2luZCwgbG9jYXRpb246IHsgdXJpLCByYW5nZSB9IH1cbiAgICAgICAgICAgIDogeyBuYW1lLCBraW5kLCBsb2NhdGlvbjogeyB1cmkgfSB9O1xuICAgIH1cbiAgICBXb3Jrc3BhY2VTeW1ib2wuY3JlYXRlID0gY3JlYXRlO1xufSkoV29ya3NwYWNlU3ltYm9sIHx8IChXb3Jrc3BhY2VTeW1ib2wgPSB7fSkpO1xuZXhwb3J0IHZhciBEb2N1bWVudFN5bWJvbDtcbihmdW5jdGlvbiAoRG9jdW1lbnRTeW1ib2wpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IHN5bWJvbCBpbmZvcm1hdGlvbiBsaXRlcmFsLlxuICAgICAqXG4gICAgICogQHBhcmFtIG5hbWUgVGhlIG5hbWUgb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gZGV0YWlsIFRoZSBkZXRhaWwgb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0ga2luZCBUaGUga2luZCBvZiB0aGUgc3ltYm9sLlxuICAgICAqIEBwYXJhbSByYW5nZSBUaGUgcmFuZ2Ugb2YgdGhlIHN5bWJvbC5cbiAgICAgKiBAcGFyYW0gc2VsZWN0aW9uUmFuZ2UgVGhlIHNlbGVjdGlvblJhbmdlIG9mIHRoZSBzeW1ib2wuXG4gICAgICogQHBhcmFtIGNoaWxkcmVuIENoaWxkcmVuIG9mIHRoZSBzeW1ib2wuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKG5hbWUsIGRldGFpbCwga2luZCwgcmFuZ2UsIHNlbGVjdGlvblJhbmdlLCBjaGlsZHJlbikge1xuICAgICAgICBsZXQgcmVzdWx0ID0ge1xuICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgIGRldGFpbCxcbiAgICAgICAgICAgIGtpbmQsXG4gICAgICAgICAgICByYW5nZSxcbiAgICAgICAgICAgIHNlbGVjdGlvblJhbmdlXG4gICAgICAgIH07XG4gICAgICAgIGlmIChjaGlsZHJlbiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICByZXN1bHQuY2hpbGRyZW4gPSBjaGlsZHJlbjtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBEb2N1bWVudFN5bWJvbC5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBEb2N1bWVudFN5bWJvbH0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJlxuICAgICAgICAgICAgSXMuc3RyaW5nKGNhbmRpZGF0ZS5uYW1lKSAmJiBJcy5udW1iZXIoY2FuZGlkYXRlLmtpbmQpICYmXG4gICAgICAgICAgICBSYW5nZS5pcyhjYW5kaWRhdGUucmFuZ2UpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5zZWxlY3Rpb25SYW5nZSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUuZGV0YWlsID09PSB1bmRlZmluZWQgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS5kZXRhaWwpKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5kZXByZWNhdGVkID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUuZGVwcmVjYXRlZCkpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmNoaWxkcmVuID09PSB1bmRlZmluZWQgfHwgQXJyYXkuaXNBcnJheShjYW5kaWRhdGUuY2hpbGRyZW4pKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS50YWdzID09PSB1bmRlZmluZWQgfHwgQXJyYXkuaXNBcnJheShjYW5kaWRhdGUudGFncykpO1xuICAgIH1cbiAgICBEb2N1bWVudFN5bWJvbC5pcyA9IGlzO1xufSkoRG9jdW1lbnRTeW1ib2wgfHwgKERvY3VtZW50U3ltYm9sID0ge30pKTtcbi8qKlxuICogQSBzZXQgb2YgcHJlZGVmaW5lZCBjb2RlIGFjdGlvbiBraW5kc1xuICovXG5leHBvcnQgdmFyIENvZGVBY3Rpb25LaW5kO1xuKGZ1bmN0aW9uIChDb2RlQWN0aW9uS2luZCkge1xuICAgIC8qKlxuICAgICAqIEVtcHR5IGtpbmQuXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuRW1wdHkgPSAnJztcbiAgICAvKipcbiAgICAgKiBCYXNlIGtpbmQgZm9yIHF1aWNrZml4IGFjdGlvbnM6ICdxdWlja2ZpeCdcbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5RdWlja0ZpeCA9ICdxdWlja2ZpeCc7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciByZWZhY3RvcmluZyBhY3Rpb25zOiAncmVmYWN0b3InXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuUmVmYWN0b3IgPSAncmVmYWN0b3InO1xuICAgIC8qKlxuICAgICAqIEJhc2Uga2luZCBmb3IgcmVmYWN0b3JpbmcgZXh0cmFjdGlvbiBhY3Rpb25zOiAncmVmYWN0b3IuZXh0cmFjdCdcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgZXh0cmFjdCBhY3Rpb25zOlxuICAgICAqXG4gICAgICogLSBFeHRyYWN0IG1ldGhvZFxuICAgICAqIC0gRXh0cmFjdCBmdW5jdGlvblxuICAgICAqIC0gRXh0cmFjdCB2YXJpYWJsZVxuICAgICAqIC0gRXh0cmFjdCBpbnRlcmZhY2UgZnJvbSBjbGFzc1xuICAgICAqIC0gLi4uXG4gICAgICovXG4gICAgQ29kZUFjdGlvbktpbmQuUmVmYWN0b3JFeHRyYWN0ID0gJ3JlZmFjdG9yLmV4dHJhY3QnO1xuICAgIC8qKlxuICAgICAqIEJhc2Uga2luZCBmb3IgcmVmYWN0b3JpbmcgaW5saW5lIGFjdGlvbnM6ICdyZWZhY3Rvci5pbmxpbmUnXG4gICAgICpcbiAgICAgKiBFeGFtcGxlIGlubGluZSBhY3Rpb25zOlxuICAgICAqXG4gICAgICogLSBJbmxpbmUgZnVuY3Rpb25cbiAgICAgKiAtIElubGluZSB2YXJpYWJsZVxuICAgICAqIC0gSW5saW5lIGNvbnN0YW50XG4gICAgICogLSAuLi5cbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5SZWZhY3RvcklubGluZSA9ICdyZWZhY3Rvci5pbmxpbmUnO1xuICAgIC8qKlxuICAgICAqIEJhc2Uga2luZCBmb3IgcmVmYWN0b3JpbmcgcmV3cml0ZSBhY3Rpb25zOiAncmVmYWN0b3IucmV3cml0ZSdcbiAgICAgKlxuICAgICAqIEV4YW1wbGUgcmV3cml0ZSBhY3Rpb25zOlxuICAgICAqXG4gICAgICogLSBDb252ZXJ0IEphdmFTY3JpcHQgZnVuY3Rpb24gdG8gY2xhc3NcbiAgICAgKiAtIEFkZCBvciByZW1vdmUgcGFyYW1ldGVyXG4gICAgICogLSBFbmNhcHN1bGF0ZSBmaWVsZFxuICAgICAqIC0gTWFrZSBtZXRob2Qgc3RhdGljXG4gICAgICogLSBNb3ZlIG1ldGhvZCB0byBiYXNlIGNsYXNzXG4gICAgICogLSAuLi5cbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5SZWZhY3RvclJld3JpdGUgPSAncmVmYWN0b3IucmV3cml0ZSc7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciBzb3VyY2UgYWN0aW9uczogYHNvdXJjZWBcbiAgICAgKlxuICAgICAqIFNvdXJjZSBjb2RlIGFjdGlvbnMgYXBwbHkgdG8gdGhlIGVudGlyZSBmaWxlLlxuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlNvdXJjZSA9ICdzb3VyY2UnO1xuICAgIC8qKlxuICAgICAqIEJhc2Uga2luZCBmb3IgYW4gb3JnYW5pemUgaW1wb3J0cyBzb3VyY2UgYWN0aW9uOiBgc291cmNlLm9yZ2FuaXplSW1wb3J0c2BcbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uS2luZC5Tb3VyY2VPcmdhbml6ZUltcG9ydHMgPSAnc291cmNlLm9yZ2FuaXplSW1wb3J0cyc7XG4gICAgLyoqXG4gICAgICogQmFzZSBraW5kIGZvciBhdXRvLWZpeCBzb3VyY2UgYWN0aW9uczogYHNvdXJjZS5maXhBbGxgLlxuICAgICAqXG4gICAgICogRml4IGFsbCBhY3Rpb25zIGF1dG9tYXRpY2FsbHkgZml4IGVycm9ycyB0aGF0IGhhdmUgYSBjbGVhciBmaXggdGhhdCBkbyBub3QgcmVxdWlyZSB1c2VyIGlucHV0LlxuICAgICAqIFRoZXkgc2hvdWxkIG5vdCBzdXBwcmVzcyBlcnJvcnMgb3IgcGVyZm9ybSB1bnNhZmUgZml4ZXMgc3VjaCBhcyBnZW5lcmF0aW5nIG5ldyB0eXBlcyBvciBjbGFzc2VzLlxuICAgICAqXG4gICAgICogQHNpbmNlIDMuMTUuMFxuICAgICAqL1xuICAgIENvZGVBY3Rpb25LaW5kLlNvdXJjZUZpeEFsbCA9ICdzb3VyY2UuZml4QWxsJztcbn0pKENvZGVBY3Rpb25LaW5kIHx8IChDb2RlQWN0aW9uS2luZCA9IHt9KSk7XG4vKipcbiAqIFRoZSByZWFzb24gd2h5IGNvZGUgYWN0aW9ucyB3ZXJlIHJlcXVlc3RlZC5cbiAqXG4gKiBAc2luY2UgMy4xNy4wXG4gKi9cbmV4cG9ydCB2YXIgQ29kZUFjdGlvblRyaWdnZXJLaW5kO1xuKGZ1bmN0aW9uIChDb2RlQWN0aW9uVHJpZ2dlcktpbmQpIHtcbiAgICAvKipcbiAgICAgKiBDb2RlIGFjdGlvbnMgd2VyZSBleHBsaWNpdGx5IHJlcXVlc3RlZCBieSB0aGUgdXNlciBvciBieSBhbiBleHRlbnNpb24uXG4gICAgICovXG4gICAgQ29kZUFjdGlvblRyaWdnZXJLaW5kLkludm9rZWQgPSAxO1xuICAgIC8qKlxuICAgICAqIENvZGUgYWN0aW9ucyB3ZXJlIHJlcXVlc3RlZCBhdXRvbWF0aWNhbGx5LlxuICAgICAqXG4gICAgICogVGhpcyB0eXBpY2FsbHkgaGFwcGVucyB3aGVuIGN1cnJlbnQgc2VsZWN0aW9uIGluIGEgZmlsZSBjaGFuZ2VzLCBidXQgY2FuXG4gICAgICogYWxzbyBiZSB0cmlnZ2VyZWQgd2hlbiBmaWxlIGNvbnRlbnQgY2hhbmdlcy5cbiAgICAgKi9cbiAgICBDb2RlQWN0aW9uVHJpZ2dlcktpbmQuQXV0b21hdGljID0gMjtcbn0pKENvZGVBY3Rpb25UcmlnZ2VyS2luZCB8fCAoQ29kZUFjdGlvblRyaWdnZXJLaW5kID0ge30pKTtcbi8qKlxuICogVGhlIENvZGVBY3Rpb25Db250ZXh0IG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIENvZGVBY3Rpb25Db250ZXh0fSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBDb2RlQWN0aW9uQ29udGV4dDtcbihmdW5jdGlvbiAoQ29kZUFjdGlvbkNvbnRleHQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENvZGVBY3Rpb25Db250ZXh0IGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKGRpYWdub3N0aWNzLCBvbmx5LCB0cmlnZ2VyS2luZCkge1xuICAgICAgICBsZXQgcmVzdWx0ID0geyBkaWFnbm9zdGljcyB9O1xuICAgICAgICBpZiAob25seSAhPT0gdW5kZWZpbmVkICYmIG9ubHkgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHJlc3VsdC5vbmx5ID0gb25seTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodHJpZ2dlcktpbmQgIT09IHVuZGVmaW5lZCAmJiB0cmlnZ2VyS2luZCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgcmVzdWx0LnRyaWdnZXJLaW5kID0gdHJpZ2dlcktpbmQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgQ29kZUFjdGlvbkNvbnRleHQuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgQ29kZUFjdGlvbkNvbnRleHR9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgSXMudHlwZWRBcnJheShjYW5kaWRhdGUuZGlhZ25vc3RpY3MsIERpYWdub3N0aWMuaXMpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLm9ubHkgPT09IHVuZGVmaW5lZCB8fCBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS5vbmx5LCBJcy5zdHJpbmcpKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS50cmlnZ2VyS2luZCA9PT0gdW5kZWZpbmVkIHx8IGNhbmRpZGF0ZS50cmlnZ2VyS2luZCA9PT0gQ29kZUFjdGlvblRyaWdnZXJLaW5kLkludm9rZWQgfHwgY2FuZGlkYXRlLnRyaWdnZXJLaW5kID09PSBDb2RlQWN0aW9uVHJpZ2dlcktpbmQuQXV0b21hdGljKTtcbiAgICB9XG4gICAgQ29kZUFjdGlvbkNvbnRleHQuaXMgPSBpcztcbn0pKENvZGVBY3Rpb25Db250ZXh0IHx8IChDb2RlQWN0aW9uQ29udGV4dCA9IHt9KSk7XG5leHBvcnQgdmFyIENvZGVBY3Rpb247XG4oZnVuY3Rpb24gKENvZGVBY3Rpb24pIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUodGl0bGUsIGtpbmRPckNvbW1hbmRPckVkaXQsIGtpbmQpIHtcbiAgICAgICAgbGV0IHJlc3VsdCA9IHsgdGl0bGUgfTtcbiAgICAgICAgbGV0IGNoZWNrS2luZCA9IHRydWU7XG4gICAgICAgIGlmICh0eXBlb2Yga2luZE9yQ29tbWFuZE9yRWRpdCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGNoZWNrS2luZCA9IGZhbHNlO1xuICAgICAgICAgICAgcmVzdWx0LmtpbmQgPSBraW5kT3JDb21tYW5kT3JFZGl0O1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKENvbW1hbmQuaXMoa2luZE9yQ29tbWFuZE9yRWRpdCkpIHtcbiAgICAgICAgICAgIHJlc3VsdC5jb21tYW5kID0ga2luZE9yQ29tbWFuZE9yRWRpdDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJlc3VsdC5lZGl0ID0ga2luZE9yQ29tbWFuZE9yRWRpdDtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hlY2tLaW5kICYmIGtpbmQgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgcmVzdWx0LmtpbmQgPSBraW5kO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfVxuICAgIENvZGVBY3Rpb24uY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIGNhbmRpZGF0ZSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnRpdGxlKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5kaWFnbm9zdGljcyA9PT0gdW5kZWZpbmVkIHx8IElzLnR5cGVkQXJyYXkoY2FuZGlkYXRlLmRpYWdub3N0aWNzLCBEaWFnbm9zdGljLmlzKSkgJiZcbiAgICAgICAgICAgIChjYW5kaWRhdGUua2luZCA9PT0gdW5kZWZpbmVkIHx8IElzLnN0cmluZyhjYW5kaWRhdGUua2luZCkpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmVkaXQgIT09IHVuZGVmaW5lZCB8fCBjYW5kaWRhdGUuY29tbWFuZCAhPT0gdW5kZWZpbmVkKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5jb21tYW5kID09PSB1bmRlZmluZWQgfHwgQ29tbWFuZC5pcyhjYW5kaWRhdGUuY29tbWFuZCkpICYmXG4gICAgICAgICAgICAoY2FuZGlkYXRlLmlzUHJlZmVycmVkID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUuaXNQcmVmZXJyZWQpKSAmJlxuICAgICAgICAgICAgKGNhbmRpZGF0ZS5lZGl0ID09PSB1bmRlZmluZWQgfHwgV29ya3NwYWNlRWRpdC5pcyhjYW5kaWRhdGUuZWRpdCkpO1xuICAgIH1cbiAgICBDb2RlQWN0aW9uLmlzID0gaXM7XG59KShDb2RlQWN0aW9uIHx8IChDb2RlQWN0aW9uID0ge30pKTtcbi8qKlxuICogVGhlIENvZGVMZW5zIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIENvZGVMZW5zfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBDb2RlTGVucztcbihmdW5jdGlvbiAoQ29kZUxlbnMpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IENvZGVMZW5zIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCBkYXRhKSB7XG4gICAgICAgIGxldCByZXN1bHQgPSB7IHJhbmdlIH07XG4gICAgICAgIGlmIChJcy5kZWZpbmVkKGRhdGEpKSB7XG4gICAgICAgICAgICByZXN1bHQuZGF0YSA9IGRhdGE7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG4gICAgQ29kZUxlbnMuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgQ29kZUxlbnN9IGludGVyZmFjZS5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiAoSXMudW5kZWZpbmVkKGNhbmRpZGF0ZS5jb21tYW5kKSB8fCBDb21tYW5kLmlzKGNhbmRpZGF0ZS5jb21tYW5kKSk7XG4gICAgfVxuICAgIENvZGVMZW5zLmlzID0gaXM7XG59KShDb2RlTGVucyB8fCAoQ29kZUxlbnMgPSB7fSkpO1xuLyoqXG4gKiBUaGUgRm9ybWF0dGluZ09wdGlvbnMgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgRm9ybWF0dGluZ09wdGlvbnN9IGxpdGVyYWxzLlxuICovXG5leHBvcnQgdmFyIEZvcm1hdHRpbmdPcHRpb25zO1xuKGZ1bmN0aW9uIChGb3JtYXR0aW5nT3B0aW9ucykge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgRm9ybWF0dGluZ09wdGlvbnMgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodGFiU2l6ZSwgaW5zZXJ0U3BhY2VzKSB7XG4gICAgICAgIHJldHVybiB7IHRhYlNpemUsIGluc2VydFNwYWNlcyB9O1xuICAgIH1cbiAgICBGb3JtYXR0aW5nT3B0aW9ucy5jcmVhdGUgPSBjcmVhdGU7XG4gICAgLyoqXG4gICAgICogQ2hlY2tzIHdoZXRoZXIgdGhlIGdpdmVuIGxpdGVyYWwgY29uZm9ybXMgdG8gdGhlIHtAbGluayBGb3JtYXR0aW5nT3B0aW9uc30gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy51aW50ZWdlcihjYW5kaWRhdGUudGFiU2l6ZSkgJiYgSXMuYm9vbGVhbihjYW5kaWRhdGUuaW5zZXJ0U3BhY2VzKTtcbiAgICB9XG4gICAgRm9ybWF0dGluZ09wdGlvbnMuaXMgPSBpcztcbn0pKEZvcm1hdHRpbmdPcHRpb25zIHx8IChGb3JtYXR0aW5nT3B0aW9ucyA9IHt9KSk7XG4vKipcbiAqIFRoZSBEb2N1bWVudExpbmsgbmFtZXNwYWNlIHByb3ZpZGVzIGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoXG4gKiB7QGxpbmsgRG9jdW1lbnRMaW5rfSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBEb2N1bWVudExpbms7XG4oZnVuY3Rpb24gKERvY3VtZW50TGluaykge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZXMgYSBuZXcgRG9jdW1lbnRMaW5rIGxpdGVyYWwuXG4gICAgICovXG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCB0YXJnZXQsIGRhdGEpIHtcbiAgICAgICAgcmV0dXJuIHsgcmFuZ2UsIHRhcmdldCwgZGF0YSB9O1xuICAgIH1cbiAgICBEb2N1bWVudExpbmsuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgRG9jdW1lbnRMaW5rfSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgbGV0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMuZGVmaW5lZChjYW5kaWRhdGUpICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUudGFyZ2V0KSB8fCBJcy5zdHJpbmcoY2FuZGlkYXRlLnRhcmdldCkpO1xuICAgIH1cbiAgICBEb2N1bWVudExpbmsuaXMgPSBpcztcbn0pKERvY3VtZW50TGluayB8fCAoRG9jdW1lbnRMaW5rID0ge30pKTtcbi8qKlxuICogVGhlIFNlbGVjdGlvblJhbmdlIG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb24gdG8gd29yayB3aXRoXG4gKiBTZWxlY3Rpb25SYW5nZSBsaXRlcmFscy5cbiAqL1xuZXhwb3J0IHZhciBTZWxlY3Rpb25SYW5nZTtcbihmdW5jdGlvbiAoU2VsZWN0aW9uUmFuZ2UpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IFNlbGVjdGlvblJhbmdlXG4gICAgICogQHBhcmFtIHJhbmdlIHRoZSByYW5nZS5cbiAgICAgKiBAcGFyYW0gcGFyZW50IGFuIG9wdGlvbmFsIHBhcmVudC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIHBhcmVudCkge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgcGFyZW50IH07XG4gICAgfVxuICAgIFNlbGVjdGlvblJhbmdlLmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBsZXQgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKSAmJiAoY2FuZGlkYXRlLnBhcmVudCA9PT0gdW5kZWZpbmVkIHx8IFNlbGVjdGlvblJhbmdlLmlzKGNhbmRpZGF0ZS5wYXJlbnQpKTtcbiAgICB9XG4gICAgU2VsZWN0aW9uUmFuZ2UuaXMgPSBpcztcbn0pKFNlbGVjdGlvblJhbmdlIHx8IChTZWxlY3Rpb25SYW5nZSA9IHt9KSk7XG4vKipcbiAqIEEgc2V0IG9mIHByZWRlZmluZWQgdG9rZW4gdHlwZXMuIFRoaXMgc2V0IGlzIG5vdCBmaXhlZFxuICogYW4gY2xpZW50cyBjYW4gc3BlY2lmeSBhZGRpdGlvbmFsIHRva2VuIHR5cGVzIHZpYSB0aGVcbiAqIGNvcnJlc3BvbmRpbmcgY2xpZW50IGNhcGFiaWxpdGllcy5cbiAqXG4gKiBAc2luY2UgMy4xNi4wXG4gKi9cbmV4cG9ydCB2YXIgU2VtYW50aWNUb2tlblR5cGVzO1xuKGZ1bmN0aW9uIChTZW1hbnRpY1Rva2VuVHlwZXMpIHtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJuYW1lc3BhY2VcIl0gPSBcIm5hbWVzcGFjZVwiO1xuICAgIC8qKlxuICAgICAqIFJlcHJlc2VudHMgYSBnZW5lcmljIHR5cGUuIEFjdHMgYXMgYSBmYWxsYmFjayBmb3IgdHlwZXMgd2hpY2ggY2FuJ3QgYmUgbWFwcGVkIHRvXG4gICAgICogYSBzcGVjaWZpYyB0eXBlIGxpa2UgY2xhc3Mgb3IgZW51bS5cbiAgICAgKi9cbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJ0eXBlXCJdID0gXCJ0eXBlXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wiY2xhc3NcIl0gPSBcImNsYXNzXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wiZW51bVwiXSA9IFwiZW51bVwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcImludGVyZmFjZVwiXSA9IFwiaW50ZXJmYWNlXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wic3RydWN0XCJdID0gXCJzdHJ1Y3RcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJ0eXBlUGFyYW1ldGVyXCJdID0gXCJ0eXBlUGFyYW1ldGVyXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wicGFyYW1ldGVyXCJdID0gXCJwYXJhbWV0ZXJcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJ2YXJpYWJsZVwiXSA9IFwidmFyaWFibGVcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJwcm9wZXJ0eVwiXSA9IFwicHJvcGVydHlcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJlbnVtTWVtYmVyXCJdID0gXCJlbnVtTWVtYmVyXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wiZXZlbnRcIl0gPSBcImV2ZW50XCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wiZnVuY3Rpb25cIl0gPSBcImZ1bmN0aW9uXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wibWV0aG9kXCJdID0gXCJtZXRob2RcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJtYWNyb1wiXSA9IFwibWFjcm9cIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJrZXl3b3JkXCJdID0gXCJrZXl3b3JkXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wibW9kaWZpZXJcIl0gPSBcIm1vZGlmaWVyXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wiY29tbWVudFwiXSA9IFwiY29tbWVudFwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcInN0cmluZ1wiXSA9IFwic3RyaW5nXCI7XG4gICAgU2VtYW50aWNUb2tlblR5cGVzW1wibnVtYmVyXCJdID0gXCJudW1iZXJcIjtcbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJyZWdleHBcIl0gPSBcInJlZ2V4cFwiO1xuICAgIFNlbWFudGljVG9rZW5UeXBlc1tcIm9wZXJhdG9yXCJdID0gXCJvcGVyYXRvclwiO1xuICAgIC8qKlxuICAgICAqIEBzaW5jZSAzLjE3LjBcbiAgICAgKi9cbiAgICBTZW1hbnRpY1Rva2VuVHlwZXNbXCJkZWNvcmF0b3JcIl0gPSBcImRlY29yYXRvclwiO1xufSkoU2VtYW50aWNUb2tlblR5cGVzIHx8IChTZW1hbnRpY1Rva2VuVHlwZXMgPSB7fSkpO1xuLyoqXG4gKiBBIHNldCBvZiBwcmVkZWZpbmVkIHRva2VuIG1vZGlmaWVycy4gVGhpcyBzZXQgaXMgbm90IGZpeGVkXG4gKiBhbiBjbGllbnRzIGNhbiBzcGVjaWZ5IGFkZGl0aW9uYWwgdG9rZW4gdHlwZXMgdmlhIHRoZVxuICogY29ycmVzcG9uZGluZyBjbGllbnQgY2FwYWJpbGl0aWVzLlxuICpcbiAqIEBzaW5jZSAzLjE2LjBcbiAqL1xuZXhwb3J0IHZhciBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzO1xuKGZ1bmN0aW9uIChTZW1hbnRpY1Rva2VuTW9kaWZpZXJzKSB7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcImRlY2xhcmF0aW9uXCJdID0gXCJkZWNsYXJhdGlvblwiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJkZWZpbml0aW9uXCJdID0gXCJkZWZpbml0aW9uXCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcInJlYWRvbmx5XCJdID0gXCJyZWFkb25seVwiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJzdGF0aWNcIl0gPSBcInN0YXRpY1wiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJkZXByZWNhdGVkXCJdID0gXCJkZXByZWNhdGVkXCI7XG4gICAgU2VtYW50aWNUb2tlbk1vZGlmaWVyc1tcImFic3RyYWN0XCJdID0gXCJhYnN0cmFjdFwiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJhc3luY1wiXSA9IFwiYXN5bmNcIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wibW9kaWZpY2F0aW9uXCJdID0gXCJtb2RpZmljYXRpb25cIjtcbiAgICBTZW1hbnRpY1Rva2VuTW9kaWZpZXJzW1wiZG9jdW1lbnRhdGlvblwiXSA9IFwiZG9jdW1lbnRhdGlvblwiO1xuICAgIFNlbWFudGljVG9rZW5Nb2RpZmllcnNbXCJkZWZhdWx0TGlicmFyeVwiXSA9IFwiZGVmYXVsdExpYnJhcnlcIjtcbn0pKFNlbWFudGljVG9rZW5Nb2RpZmllcnMgfHwgKFNlbWFudGljVG9rZW5Nb2RpZmllcnMgPSB7fSkpO1xuLyoqXG4gKiBAc2luY2UgMy4xNi4wXG4gKi9cbmV4cG9ydCB2YXIgU2VtYW50aWNUb2tlbnM7XG4oZnVuY3Rpb24gKFNlbWFudGljVG9rZW5zKSB7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5vYmplY3RMaXRlcmFsKGNhbmRpZGF0ZSkgJiYgKGNhbmRpZGF0ZS5yZXN1bHRJZCA9PT0gdW5kZWZpbmVkIHx8IHR5cGVvZiBjYW5kaWRhdGUucmVzdWx0SWQgPT09ICdzdHJpbmcnKSAmJlxuICAgICAgICAgICAgQXJyYXkuaXNBcnJheShjYW5kaWRhdGUuZGF0YSkgJiYgKGNhbmRpZGF0ZS5kYXRhLmxlbmd0aCA9PT0gMCB8fCB0eXBlb2YgY2FuZGlkYXRlLmRhdGFbMF0gPT09ICdudW1iZXInKTtcbiAgICB9XG4gICAgU2VtYW50aWNUb2tlbnMuaXMgPSBpcztcbn0pKFNlbWFudGljVG9rZW5zIHx8IChTZW1hbnRpY1Rva2VucyA9IHt9KSk7XG4vKipcbiAqIFRoZSBJbmxpbmVWYWx1ZVRleHQgbmFtZXNwYWNlIHByb3ZpZGVzIGZ1bmN0aW9ucyB0byBkZWFsIHdpdGggSW5saW5lVmFsdWVUZXh0cy5cbiAqXG4gKiBAc2luY2UgMy4xNy4wXG4gKi9cbmV4cG9ydCB2YXIgSW5saW5lVmFsdWVUZXh0O1xuKGZ1bmN0aW9uIChJbmxpbmVWYWx1ZVRleHQpIHtcbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IElubGluZVZhbHVlVGV4dCBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgdGV4dCkge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgdGV4dCB9O1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZVRleHQuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICE9PSB1bmRlZmluZWQgJiYgY2FuZGlkYXRlICE9PSBudWxsICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgSXMuc3RyaW5nKGNhbmRpZGF0ZS50ZXh0KTtcbiAgICB9XG4gICAgSW5saW5lVmFsdWVUZXh0LmlzID0gaXM7XG59KShJbmxpbmVWYWx1ZVRleHQgfHwgKElubGluZVZhbHVlVGV4dCA9IHt9KSk7XG4vKipcbiAqIFRoZSBJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwIG5hbWVzcGFjZSBwcm92aWRlcyBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIElubGluZVZhbHVlVmFyaWFibGVMb29rdXBzLlxuICpcbiAqIEBzaW5jZSAzLjE3LjBcbiAqL1xuZXhwb3J0IHZhciBJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwO1xuKGZ1bmN0aW9uIChJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBJbmxpbmVWYWx1ZVRleHQgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUocmFuZ2UsIHZhcmlhYmxlTmFtZSwgY2FzZVNlbnNpdGl2ZUxvb2t1cCkge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgdmFyaWFibGVOYW1lLCBjYXNlU2Vuc2l0aXZlTG9va3VwIH07XG4gICAgfVxuICAgIElubGluZVZhbHVlVmFyaWFibGVMb29rdXAuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gY2FuZGlkYXRlICE9PSB1bmRlZmluZWQgJiYgY2FuZGlkYXRlICE9PSBudWxsICYmIFJhbmdlLmlzKGNhbmRpZGF0ZS5yYW5nZSkgJiYgSXMuYm9vbGVhbihjYW5kaWRhdGUuY2FzZVNlbnNpdGl2ZUxvb2t1cClcbiAgICAgICAgICAgICYmIChJcy5zdHJpbmcoY2FuZGlkYXRlLnZhcmlhYmxlTmFtZSkgfHwgY2FuZGlkYXRlLnZhcmlhYmxlTmFtZSA9PT0gdW5kZWZpbmVkKTtcbiAgICB9XG4gICAgSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cC5pcyA9IGlzO1xufSkoSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cCB8fCAoSW5saW5lVmFsdWVWYXJpYWJsZUxvb2t1cCA9IHt9KSk7XG4vKipcbiAqIFRoZSBJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbiBuYW1lc3BhY2UgcHJvdmlkZXMgZnVuY3Rpb25zIHRvIGRlYWwgd2l0aCBJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbi5cbiAqXG4gKiBAc2luY2UgMy4xNy4wXG4gKi9cbmV4cG9ydCB2YXIgSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb247XG4oZnVuY3Rpb24gKElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uKSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbiBsaXRlcmFsLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShyYW5nZSwgZXhwcmVzc2lvbikge1xuICAgICAgICByZXR1cm4geyByYW5nZSwgZXhwcmVzc2lvbiB9O1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbi5jcmVhdGUgPSBjcmVhdGU7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBjYW5kaWRhdGUgIT09IHVuZGVmaW5lZCAmJiBjYW5kaWRhdGUgIT09IG51bGwgJiYgUmFuZ2UuaXMoY2FuZGlkYXRlLnJhbmdlKVxuICAgICAgICAgICAgJiYgKElzLnN0cmluZyhjYW5kaWRhdGUuZXhwcmVzc2lvbikgfHwgY2FuZGlkYXRlLmV4cHJlc3Npb24gPT09IHVuZGVmaW5lZCk7XG4gICAgfVxuICAgIElubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uLmlzID0gaXM7XG59KShJbmxpbmVWYWx1ZUV2YWx1YXRhYmxlRXhwcmVzc2lvbiB8fCAoSW5saW5lVmFsdWVFdmFsdWF0YWJsZUV4cHJlc3Npb24gPSB7fSkpO1xuLyoqXG4gKiBUaGUgSW5saW5lVmFsdWVDb250ZXh0IG5hbWVzcGFjZSBwcm92aWRlcyBoZWxwZXIgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aFxuICoge0BsaW5rIElubGluZVZhbHVlQ29udGV4dH0gbGl0ZXJhbHMuXG4gKlxuICogQHNpbmNlIDMuMTcuMFxuICovXG5leHBvcnQgdmFyIElubGluZVZhbHVlQ29udGV4dDtcbihmdW5jdGlvbiAoSW5saW5lVmFsdWVDb250ZXh0KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBJbmxpbmVWYWx1ZUNvbnRleHQgbGl0ZXJhbC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUoZnJhbWVJZCwgc3RvcHBlZExvY2F0aW9uKSB7XG4gICAgICAgIHJldHVybiB7IGZyYW1lSWQsIHN0b3BwZWRMb2NhdGlvbiB9O1xuICAgIH1cbiAgICBJbmxpbmVWYWx1ZUNvbnRleHQuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgSW5saW5lVmFsdWVDb250ZXh0fSBpbnRlcmZhY2UuXG4gICAgICovXG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgY29uc3QgY2FuZGlkYXRlID0gdmFsdWU7XG4gICAgICAgIHJldHVybiBJcy5kZWZpbmVkKGNhbmRpZGF0ZSkgJiYgUmFuZ2UuaXModmFsdWUuc3RvcHBlZExvY2F0aW9uKTtcbiAgICB9XG4gICAgSW5saW5lVmFsdWVDb250ZXh0LmlzID0gaXM7XG59KShJbmxpbmVWYWx1ZUNvbnRleHQgfHwgKElubGluZVZhbHVlQ29udGV4dCA9IHt9KSk7XG4vKipcbiAqIElubGF5IGhpbnQga2luZHMuXG4gKlxuICogQHNpbmNlIDMuMTcuMFxuICovXG5leHBvcnQgdmFyIElubGF5SGludEtpbmQ7XG4oZnVuY3Rpb24gKElubGF5SGludEtpbmQpIHtcbiAgICAvKipcbiAgICAgKiBBbiBpbmxheSBoaW50IHRoYXQgZm9yIGEgdHlwZSBhbm5vdGF0aW9uLlxuICAgICAqL1xuICAgIElubGF5SGludEtpbmQuVHlwZSA9IDE7XG4gICAgLyoqXG4gICAgICogQW4gaW5sYXkgaGludCB0aGF0IGlzIGZvciBhIHBhcmFtZXRlci5cbiAgICAgKi9cbiAgICBJbmxheUhpbnRLaW5kLlBhcmFtZXRlciA9IDI7XG4gICAgZnVuY3Rpb24gaXModmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHZhbHVlID09PSAxIHx8IHZhbHVlID09PSAyO1xuICAgIH1cbiAgICBJbmxheUhpbnRLaW5kLmlzID0gaXM7XG59KShJbmxheUhpbnRLaW5kIHx8IChJbmxheUhpbnRLaW5kID0ge30pKTtcbmV4cG9ydCB2YXIgSW5sYXlIaW50TGFiZWxQYXJ0O1xuKGZ1bmN0aW9uIChJbmxheUhpbnRMYWJlbFBhcnQpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHsgdmFsdWUgfTtcbiAgICB9XG4gICAgSW5sYXlIaW50TGFiZWxQYXJ0LmNyZWF0ZSA9IGNyZWF0ZTtcbiAgICBmdW5jdGlvbiBpcyh2YWx1ZSkge1xuICAgICAgICBjb25zdCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLm9iamVjdExpdGVyYWwoY2FuZGlkYXRlKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS50b29sdGlwID09PSB1bmRlZmluZWQgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS50b29sdGlwKSB8fCBNYXJrdXBDb250ZW50LmlzKGNhbmRpZGF0ZS50b29sdGlwKSlcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUubG9jYXRpb24gPT09IHVuZGVmaW5lZCB8fCBMb2NhdGlvbi5pcyhjYW5kaWRhdGUubG9jYXRpb24pKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS5jb21tYW5kID09PSB1bmRlZmluZWQgfHwgQ29tbWFuZC5pcyhjYW5kaWRhdGUuY29tbWFuZCkpO1xuICAgIH1cbiAgICBJbmxheUhpbnRMYWJlbFBhcnQuaXMgPSBpcztcbn0pKElubGF5SGludExhYmVsUGFydCB8fCAoSW5sYXlIaW50TGFiZWxQYXJ0ID0ge30pKTtcbmV4cG9ydCB2YXIgSW5sYXlIaW50O1xuKGZ1bmN0aW9uIChJbmxheUhpbnQpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUocG9zaXRpb24sIGxhYmVsLCBraW5kKSB7XG4gICAgICAgIGNvbnN0IHJlc3VsdCA9IHsgcG9zaXRpb24sIGxhYmVsIH07XG4gICAgICAgIGlmIChraW5kICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHJlc3VsdC5raW5kID0ga2luZDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH1cbiAgICBJbmxheUhpbnQuY3JlYXRlID0gY3JlYXRlO1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIFBvc2l0aW9uLmlzKGNhbmRpZGF0ZS5wb3NpdGlvbilcbiAgICAgICAgICAgICYmIChJcy5zdHJpbmcoY2FuZGlkYXRlLmxhYmVsKSB8fCBJcy50eXBlZEFycmF5KGNhbmRpZGF0ZS5sYWJlbCwgSW5sYXlIaW50TGFiZWxQYXJ0LmlzKSlcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUua2luZCA9PT0gdW5kZWZpbmVkIHx8IElubGF5SGludEtpbmQuaXMoY2FuZGlkYXRlLmtpbmQpKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS50ZXh0RWRpdHMgPT09IHVuZGVmaW5lZCkgfHwgSXMudHlwZWRBcnJheShjYW5kaWRhdGUudGV4dEVkaXRzLCBUZXh0RWRpdC5pcylcbiAgICAgICAgICAgICYmIChjYW5kaWRhdGUudG9vbHRpcCA9PT0gdW5kZWZpbmVkIHx8IElzLnN0cmluZyhjYW5kaWRhdGUudG9vbHRpcCkgfHwgTWFya3VwQ29udGVudC5pcyhjYW5kaWRhdGUudG9vbHRpcCkpXG4gICAgICAgICAgICAmJiAoY2FuZGlkYXRlLnBhZGRpbmdMZWZ0ID09PSB1bmRlZmluZWQgfHwgSXMuYm9vbGVhbihjYW5kaWRhdGUucGFkZGluZ0xlZnQpKVxuICAgICAgICAgICAgJiYgKGNhbmRpZGF0ZS5wYWRkaW5nUmlnaHQgPT09IHVuZGVmaW5lZCB8fCBJcy5ib29sZWFuKGNhbmRpZGF0ZS5wYWRkaW5nUmlnaHQpKTtcbiAgICB9XG4gICAgSW5sYXlIaW50LmlzID0gaXM7XG59KShJbmxheUhpbnQgfHwgKElubGF5SGludCA9IHt9KSk7XG5leHBvcnQgdmFyIFN0cmluZ1ZhbHVlO1xuKGZ1bmN0aW9uIChTdHJpbmdWYWx1ZSkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZVNuaXBwZXQodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHsga2luZDogJ3NuaXBwZXQnLCB2YWx1ZSB9O1xuICAgIH1cbiAgICBTdHJpbmdWYWx1ZS5jcmVhdGVTbmlwcGV0ID0gY3JlYXRlU25pcHBldDtcbn0pKFN0cmluZ1ZhbHVlIHx8IChTdHJpbmdWYWx1ZSA9IHt9KSk7XG5leHBvcnQgdmFyIElubGluZUNvbXBsZXRpb25JdGVtO1xuKGZ1bmN0aW9uIChJbmxpbmVDb21wbGV0aW9uSXRlbSkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZShpbnNlcnRUZXh0LCBmaWx0ZXJUZXh0LCByYW5nZSwgY29tbWFuZCkge1xuICAgICAgICByZXR1cm4geyBpbnNlcnRUZXh0LCBmaWx0ZXJUZXh0LCByYW5nZSwgY29tbWFuZCB9O1xuICAgIH1cbiAgICBJbmxpbmVDb21wbGV0aW9uSXRlbS5jcmVhdGUgPSBjcmVhdGU7XG59KShJbmxpbmVDb21wbGV0aW9uSXRlbSB8fCAoSW5saW5lQ29tcGxldGlvbkl0ZW0gPSB7fSkpO1xuZXhwb3J0IHZhciBJbmxpbmVDb21wbGV0aW9uTGlzdDtcbihmdW5jdGlvbiAoSW5saW5lQ29tcGxldGlvbkxpc3QpIHtcbiAgICBmdW5jdGlvbiBjcmVhdGUoaXRlbXMpIHtcbiAgICAgICAgcmV0dXJuIHsgaXRlbXMgfTtcbiAgICB9XG4gICAgSW5saW5lQ29tcGxldGlvbkxpc3QuY3JlYXRlID0gY3JlYXRlO1xufSkoSW5saW5lQ29tcGxldGlvbkxpc3QgfHwgKElubGluZUNvbXBsZXRpb25MaXN0ID0ge30pKTtcbi8qKlxuICogRGVzY3JpYmVzIGhvdyBhbiB7QGxpbmsgSW5saW5lQ29tcGxldGlvbkl0ZW1Qcm92aWRlciBpbmxpbmUgY29tcGxldGlvbiBwcm92aWRlcn0gd2FzIHRyaWdnZXJlZC5cbiAqXG4gKiBAc2luY2UgMy4xOC4wXG4gKiBAcHJvcG9zZWRcbiAqL1xuZXhwb3J0IHZhciBJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmQ7XG4oZnVuY3Rpb24gKElubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZCkge1xuICAgIC8qKlxuICAgICAqIENvbXBsZXRpb24gd2FzIHRyaWdnZXJlZCBleHBsaWNpdGx5IGJ5IGEgdXNlciBnZXN0dXJlLlxuICAgICAqL1xuICAgIElubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZC5JbnZva2VkID0gMDtcbiAgICAvKipcbiAgICAgKiBDb21wbGV0aW9uIHdhcyB0cmlnZ2VyZWQgYXV0b21hdGljYWxseSB3aGlsZSBlZGl0aW5nLlxuICAgICAqL1xuICAgIElubGluZUNvbXBsZXRpb25UcmlnZ2VyS2luZC5BdXRvbWF0aWMgPSAxO1xufSkoSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kIHx8IChJbmxpbmVDb21wbGV0aW9uVHJpZ2dlcktpbmQgPSB7fSkpO1xuZXhwb3J0IHZhciBTZWxlY3RlZENvbXBsZXRpb25JbmZvO1xuKGZ1bmN0aW9uIChTZWxlY3RlZENvbXBsZXRpb25JbmZvKSB7XG4gICAgZnVuY3Rpb24gY3JlYXRlKHJhbmdlLCB0ZXh0KSB7XG4gICAgICAgIHJldHVybiB7IHJhbmdlLCB0ZXh0IH07XG4gICAgfVxuICAgIFNlbGVjdGVkQ29tcGxldGlvbkluZm8uY3JlYXRlID0gY3JlYXRlO1xufSkoU2VsZWN0ZWRDb21wbGV0aW9uSW5mbyB8fCAoU2VsZWN0ZWRDb21wbGV0aW9uSW5mbyA9IHt9KSk7XG5leHBvcnQgdmFyIElubGluZUNvbXBsZXRpb25Db250ZXh0O1xuKGZ1bmN0aW9uIChJbmxpbmVDb21wbGV0aW9uQ29udGV4dCkge1xuICAgIGZ1bmN0aW9uIGNyZWF0ZSh0cmlnZ2VyS2luZCwgc2VsZWN0ZWRDb21wbGV0aW9uSW5mbykge1xuICAgICAgICByZXR1cm4geyB0cmlnZ2VyS2luZCwgc2VsZWN0ZWRDb21wbGV0aW9uSW5mbyB9O1xuICAgIH1cbiAgICBJbmxpbmVDb21wbGV0aW9uQ29udGV4dC5jcmVhdGUgPSBjcmVhdGU7XG59KShJbmxpbmVDb21wbGV0aW9uQ29udGV4dCB8fCAoSW5saW5lQ29tcGxldGlvbkNvbnRleHQgPSB7fSkpO1xuZXhwb3J0IHZhciBXb3Jrc3BhY2VGb2xkZXI7XG4oZnVuY3Rpb24gKFdvcmtzcGFjZUZvbGRlcikge1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGNvbnN0IGNhbmRpZGF0ZSA9IHZhbHVlO1xuICAgICAgICByZXR1cm4gSXMub2JqZWN0TGl0ZXJhbChjYW5kaWRhdGUpICYmIFVSSS5pcyhjYW5kaWRhdGUudXJpKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLm5hbWUpO1xuICAgIH1cbiAgICBXb3Jrc3BhY2VGb2xkZXIuaXMgPSBpcztcbn0pKFdvcmtzcGFjZUZvbGRlciB8fCAoV29ya3NwYWNlRm9sZGVyID0ge30pKTtcbmV4cG9ydCBjb25zdCBFT0wgPSBbJ1xcbicsICdcXHJcXG4nLCAnXFxyJ107XG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSB0aGUgdGV4dCBkb2N1bWVudCBmcm9tIHRoZSBuZXcgdnNjb2RlLWxhbmd1YWdlc2VydmVyLXRleHRkb2N1bWVudCBwYWNrYWdlLlxuICovXG5leHBvcnQgdmFyIFRleHREb2N1bWVudDtcbihmdW5jdGlvbiAoVGV4dERvY3VtZW50KSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlcyBhIG5ldyBJVGV4dERvY3VtZW50IGxpdGVyYWwgZnJvbSB0aGUgZ2l2ZW4gdXJpIGFuZCBjb250ZW50LlxuICAgICAqIEBwYXJhbSB1cmkgVGhlIGRvY3VtZW50J3MgdXJpLlxuICAgICAqIEBwYXJhbSBsYW5ndWFnZUlkIFRoZSBkb2N1bWVudCdzIGxhbmd1YWdlIElkLlxuICAgICAqIEBwYXJhbSB2ZXJzaW9uIFRoZSBkb2N1bWVudCdzIHZlcnNpb24uXG4gICAgICogQHBhcmFtIGNvbnRlbnQgVGhlIGRvY3VtZW50J3MgY29udGVudC5cbiAgICAgKi9cbiAgICBmdW5jdGlvbiBjcmVhdGUodXJpLCBsYW5ndWFnZUlkLCB2ZXJzaW9uLCBjb250ZW50KSB7XG4gICAgICAgIHJldHVybiBuZXcgRnVsbFRleHREb2N1bWVudCh1cmksIGxhbmd1YWdlSWQsIHZlcnNpb24sIGNvbnRlbnQpO1xuICAgIH1cbiAgICBUZXh0RG9jdW1lbnQuY3JlYXRlID0gY3JlYXRlO1xuICAgIC8qKlxuICAgICAqIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsaXRlcmFsIGNvbmZvcm1zIHRvIHRoZSB7QGxpbmsgSVRleHREb2N1bWVudH0gaW50ZXJmYWNlLlxuICAgICAqL1xuICAgIGZ1bmN0aW9uIGlzKHZhbHVlKSB7XG4gICAgICAgIGxldCBjYW5kaWRhdGUgPSB2YWx1ZTtcbiAgICAgICAgcmV0dXJuIElzLmRlZmluZWQoY2FuZGlkYXRlKSAmJiBJcy5zdHJpbmcoY2FuZGlkYXRlLnVyaSkgJiYgKElzLnVuZGVmaW5lZChjYW5kaWRhdGUubGFuZ3VhZ2VJZCkgfHwgSXMuc3RyaW5nKGNhbmRpZGF0ZS5sYW5ndWFnZUlkKSkgJiYgSXMudWludGVnZXIoY2FuZGlkYXRlLmxpbmVDb3VudClcbiAgICAgICAgICAgICYmIElzLmZ1bmMoY2FuZGlkYXRlLmdldFRleHQpICYmIElzLmZ1bmMoY2FuZGlkYXRlLnBvc2l0aW9uQXQpICYmIElzLmZ1bmMoY2FuZGlkYXRlLm9mZnNldEF0KSA/IHRydWUgOiBmYWxzZTtcbiAgICB9XG4gICAgVGV4dERvY3VtZW50LmlzID0gaXM7XG4gICAgZnVuY3Rpb24gYXBwbHlFZGl0cyhkb2N1bWVudCwgZWRpdHMpIHtcbiAgICAgICAgbGV0IHRleHQgPSBkb2N1bWVudC5nZXRUZXh0KCk7XG4gICAgICAgIGxldCBzb3J0ZWRFZGl0cyA9IG1lcmdlU29ydChlZGl0cywgKGEsIGIpID0+IHtcbiAgICAgICAgICAgIGxldCBkaWZmID0gYS5yYW5nZS5zdGFydC5saW5lIC0gYi5yYW5nZS5zdGFydC5saW5lO1xuICAgICAgICAgICAgaWYgKGRpZmYgPT09IDApIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gYS5yYW5nZS5zdGFydC5jaGFyYWN0ZXIgLSBiLnJhbmdlLnN0YXJ0LmNoYXJhY3RlcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBkaWZmO1xuICAgICAgICB9KTtcbiAgICAgICAgbGV0IGxhc3RNb2RpZmllZE9mZnNldCA9IHRleHQubGVuZ3RoO1xuICAgICAgICBmb3IgKGxldCBpID0gc29ydGVkRWRpdHMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pIHtcbiAgICAgICAgICAgIGxldCBlID0gc29ydGVkRWRpdHNbaV07XG4gICAgICAgICAgICBsZXQgc3RhcnRPZmZzZXQgPSBkb2N1bWVudC5vZmZzZXRBdChlLnJhbmdlLnN0YXJ0KTtcbiAgICAgICAgICAgIGxldCBlbmRPZmZzZXQgPSBkb2N1bWVudC5vZmZzZXRBdChlLnJhbmdlLmVuZCk7XG4gICAgICAgICAgICBpZiAoZW5kT2Zmc2V0IDw9IGxhc3RNb2RpZmllZE9mZnNldCkge1xuICAgICAgICAgICAgICAgIHRleHQgPSB0ZXh0LnN1YnN0cmluZygwLCBzdGFydE9mZnNldCkgKyBlLm5ld1RleHQgKyB0ZXh0LnN1YnN0cmluZyhlbmRPZmZzZXQsIHRleHQubGVuZ3RoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignT3ZlcmxhcHBpbmcgZWRpdCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGFzdE1vZGlmaWVkT2Zmc2V0ID0gc3RhcnRPZmZzZXQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRleHQ7XG4gICAgfVxuICAgIFRleHREb2N1bWVudC5hcHBseUVkaXRzID0gYXBwbHlFZGl0cztcbiAgICBmdW5jdGlvbiBtZXJnZVNvcnQoZGF0YSwgY29tcGFyZSkge1xuICAgICAgICBpZiAoZGF0YS5sZW5ndGggPD0gMSkge1xuICAgICAgICAgICAgLy8gc29ydGVkXG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBwID0gKGRhdGEubGVuZ3RoIC8gMikgfCAwO1xuICAgICAgICBjb25zdCBsZWZ0ID0gZGF0YS5zbGljZSgwLCBwKTtcbiAgICAgICAgY29uc3QgcmlnaHQgPSBkYXRhLnNsaWNlKHApO1xuICAgICAgICBtZXJnZVNvcnQobGVmdCwgY29tcGFyZSk7XG4gICAgICAgIG1lcmdlU29ydChyaWdodCwgY29tcGFyZSk7XG4gICAgICAgIGxldCBsZWZ0SWR4ID0gMDtcbiAgICAgICAgbGV0IHJpZ2h0SWR4ID0gMDtcbiAgICAgICAgbGV0IGkgPSAwO1xuICAgICAgICB3aGlsZSAobGVmdElkeCA8IGxlZnQubGVuZ3RoICYmIHJpZ2h0SWR4IDwgcmlnaHQubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgcmV0ID0gY29tcGFyZShsZWZ0W2xlZnRJZHhdLCByaWdodFtyaWdodElkeF0pO1xuICAgICAgICAgICAgaWYgKHJldCA8PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gc21hbGxlcl9lcXVhbCAtPiB0YWtlIGxlZnQgdG8gcHJlc2VydmUgb3JkZXJcbiAgICAgICAgICAgICAgICBkYXRhW2krK10gPSBsZWZ0W2xlZnRJZHgrK107XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBncmVhdGVyIC0+IHRha2UgcmlnaHRcbiAgICAgICAgICAgICAgICBkYXRhW2krK10gPSByaWdodFtyaWdodElkeCsrXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAobGVmdElkeCA8IGxlZnQubGVuZ3RoKSB7XG4gICAgICAgICAgICBkYXRhW2krK10gPSBsZWZ0W2xlZnRJZHgrK107XG4gICAgICAgIH1cbiAgICAgICAgd2hpbGUgKHJpZ2h0SWR4IDwgcmlnaHQubGVuZ3RoKSB7XG4gICAgICAgICAgICBkYXRhW2krK10gPSByaWdodFtyaWdodElkeCsrXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9XG59KShUZXh0RG9jdW1lbnQgfHwgKFRleHREb2N1bWVudCA9IHt9KSk7XG4vKipcbiAqIEBkZXByZWNhdGVkIFVzZSB0aGUgdGV4dCBkb2N1bWVudCBmcm9tIHRoZSBuZXcgdnNjb2RlLWxhbmd1YWdlc2VydmVyLXRleHRkb2N1bWVudCBwYWNrYWdlLlxuICovXG5jbGFzcyBGdWxsVGV4dERvY3VtZW50IHtcbiAgICBjb25zdHJ1Y3Rvcih1cmksIGxhbmd1YWdlSWQsIHZlcnNpb24sIGNvbnRlbnQpIHtcbiAgICAgICAgdGhpcy5fdXJpID0gdXJpO1xuICAgICAgICB0aGlzLl9sYW5ndWFnZUlkID0gbGFuZ3VhZ2VJZDtcbiAgICAgICAgdGhpcy5fdmVyc2lvbiA9IHZlcnNpb247XG4gICAgICAgIHRoaXMuX2NvbnRlbnQgPSBjb250ZW50O1xuICAgICAgICB0aGlzLl9saW5lT2Zmc2V0cyA9IHVuZGVmaW5lZDtcbiAgICB9XG4gICAgZ2V0IHVyaSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3VyaTtcbiAgICB9XG4gICAgZ2V0IGxhbmd1YWdlSWQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLl9sYW5ndWFnZUlkO1xuICAgIH1cbiAgICBnZXQgdmVyc2lvbigpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuX3ZlcnNpb247XG4gICAgfVxuICAgIGdldFRleHQocmFuZ2UpIHtcbiAgICAgICAgaWYgKHJhbmdlKSB7XG4gICAgICAgICAgICBsZXQgc3RhcnQgPSB0aGlzLm9mZnNldEF0KHJhbmdlLnN0YXJ0KTtcbiAgICAgICAgICAgIGxldCBlbmQgPSB0aGlzLm9mZnNldEF0KHJhbmdlLmVuZCk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY29udGVudC5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuX2NvbnRlbnQ7XG4gICAgfVxuICAgIHVwZGF0ZShldmVudCwgdmVyc2lvbikge1xuICAgICAgICB0aGlzLl9jb250ZW50ID0gZXZlbnQudGV4dDtcbiAgICAgICAgdGhpcy5fdmVyc2lvbiA9IHZlcnNpb247XG4gICAgICAgIHRoaXMuX2xpbmVPZmZzZXRzID0gdW5kZWZpbmVkO1xuICAgIH1cbiAgICBnZXRMaW5lT2Zmc2V0cygpIHtcbiAgICAgICAgaWYgKHRoaXMuX2xpbmVPZmZzZXRzID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGxldCBsaW5lT2Zmc2V0cyA9IFtdO1xuICAgICAgICAgICAgbGV0IHRleHQgPSB0aGlzLl9jb250ZW50O1xuICAgICAgICAgICAgbGV0IGlzTGluZVN0YXJ0ID0gdHJ1ZTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGV4dC5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIGlmIChpc0xpbmVTdGFydCkge1xuICAgICAgICAgICAgICAgICAgICBsaW5lT2Zmc2V0cy5wdXNoKGkpO1xuICAgICAgICAgICAgICAgICAgICBpc0xpbmVTdGFydCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBsZXQgY2ggPSB0ZXh0LmNoYXJBdChpKTtcbiAgICAgICAgICAgICAgICBpc0xpbmVTdGFydCA9IChjaCA9PT0gJ1xccicgfHwgY2ggPT09ICdcXG4nKTtcbiAgICAgICAgICAgICAgICBpZiAoY2ggPT09ICdcXHInICYmIGkgKyAxIDwgdGV4dC5sZW5ndGggJiYgdGV4dC5jaGFyQXQoaSArIDEpID09PSAnXFxuJykge1xuICAgICAgICAgICAgICAgICAgICBpKys7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKGlzTGluZVN0YXJ0ICYmIHRleHQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIGxpbmVPZmZzZXRzLnB1c2godGV4dC5sZW5ndGgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5fbGluZU9mZnNldHMgPSBsaW5lT2Zmc2V0cztcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5fbGluZU9mZnNldHM7XG4gICAgfVxuICAgIHBvc2l0aW9uQXQob2Zmc2V0KSB7XG4gICAgICAgIG9mZnNldCA9IE1hdGgubWF4KE1hdGgubWluKG9mZnNldCwgdGhpcy5fY29udGVudC5sZW5ndGgpLCAwKTtcbiAgICAgICAgbGV0IGxpbmVPZmZzZXRzID0gdGhpcy5nZXRMaW5lT2Zmc2V0cygpO1xuICAgICAgICBsZXQgbG93ID0gMCwgaGlnaCA9IGxpbmVPZmZzZXRzLmxlbmd0aDtcbiAgICAgICAgaWYgKGhpZ2ggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBQb3NpdGlvbi5jcmVhdGUoMCwgb2Zmc2V0KTtcbiAgICAgICAgfVxuICAgICAgICB3aGlsZSAobG93IDwgaGlnaCkge1xuICAgICAgICAgICAgbGV0IG1pZCA9IE1hdGguZmxvb3IoKGxvdyArIGhpZ2gpIC8gMik7XG4gICAgICAgICAgICBpZiAobGluZU9mZnNldHNbbWlkXSA+IG9mZnNldCkge1xuICAgICAgICAgICAgICAgIGhpZ2ggPSBtaWQ7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsb3cgPSBtaWQgKyAxO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIGxvdyBpcyB0aGUgbGVhc3QgeCBmb3Igd2hpY2ggdGhlIGxpbmUgb2Zmc2V0IGlzIGxhcmdlciB0aGFuIHRoZSBjdXJyZW50IG9mZnNldFxuICAgICAgICAvLyBvciBhcnJheS5sZW5ndGggaWYgbm8gbGluZSBvZmZzZXQgaXMgbGFyZ2VyIHRoYW4gdGhlIGN1cnJlbnQgb2Zmc2V0XG4gICAgICAgIGxldCBsaW5lID0gbG93IC0gMTtcbiAgICAgICAgcmV0dXJuIFBvc2l0aW9uLmNyZWF0ZShsaW5lLCBvZmZzZXQgLSBsaW5lT2Zmc2V0c1tsaW5lXSk7XG4gICAgfVxuICAgIG9mZnNldEF0KHBvc2l0aW9uKSB7XG4gICAgICAgIGxldCBsaW5lT2Zmc2V0cyA9IHRoaXMuZ2V0TGluZU9mZnNldHMoKTtcbiAgICAgICAgaWYgKHBvc2l0aW9uLmxpbmUgPj0gbGluZU9mZnNldHMubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fY29udGVudC5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAocG9zaXRpb24ubGluZSA8IDApIHtcbiAgICAgICAgICAgIHJldHVybiAwO1xuICAgICAgICB9XG4gICAgICAgIGxldCBsaW5lT2Zmc2V0ID0gbGluZU9mZnNldHNbcG9zaXRpb24ubGluZV07XG4gICAgICAgIGxldCBuZXh0TGluZU9mZnNldCA9IChwb3NpdGlvbi5saW5lICsgMSA8IGxpbmVPZmZzZXRzLmxlbmd0aCkgPyBsaW5lT2Zmc2V0c1twb3NpdGlvbi5saW5lICsgMV0gOiB0aGlzLl9jb250ZW50Lmxlbmd0aDtcbiAgICAgICAgcmV0dXJuIE1hdGgubWF4KE1hdGgubWluKGxpbmVPZmZzZXQgKyBwb3NpdGlvbi5jaGFyYWN0ZXIsIG5leHRMaW5lT2Zmc2V0KSwgbGluZU9mZnNldCk7XG4gICAgfVxuICAgIGdldCBsaW5lQ291bnQoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldExpbmVPZmZzZXRzKCkubGVuZ3RoO1xuICAgIH1cbn1cbnZhciBJcztcbihmdW5jdGlvbiAoSXMpIHtcbiAgICBjb25zdCB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG4gICAgZnVuY3Rpb24gZGVmaW5lZCh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdHlwZW9mIHZhbHVlICE9PSAndW5kZWZpbmVkJztcbiAgICB9XG4gICAgSXMuZGVmaW5lZCA9IGRlZmluZWQ7XG4gICAgZnVuY3Rpb24gdW5kZWZpbmVkKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0eXBlb2YgdmFsdWUgPT09ICd1bmRlZmluZWQnO1xuICAgIH1cbiAgICBJcy51bmRlZmluZWQgPSB1bmRlZmluZWQ7XG4gICAgZnVuY3Rpb24gYm9vbGVhbih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdmFsdWUgPT09IHRydWUgfHwgdmFsdWUgPT09IGZhbHNlO1xuICAgIH1cbiAgICBJcy5ib29sZWFuID0gYm9vbGVhbjtcbiAgICBmdW5jdGlvbiBzdHJpbmcodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBTdHJpbmddJztcbiAgICB9XG4gICAgSXMuc3RyaW5nID0gc3RyaW5nO1xuICAgIGZ1bmN0aW9uIG51bWJlcih2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IE51bWJlcl0nO1xuICAgIH1cbiAgICBJcy5udW1iZXIgPSBudW1iZXI7XG4gICAgZnVuY3Rpb24gbnVtYmVyUmFuZ2UodmFsdWUsIG1pbiwgbWF4KSB7XG4gICAgICAgIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgTnVtYmVyXScgJiYgbWluIDw9IHZhbHVlICYmIHZhbHVlIDw9IG1heDtcbiAgICB9XG4gICAgSXMubnVtYmVyUmFuZ2UgPSBudW1iZXJSYW5nZTtcbiAgICBmdW5jdGlvbiBpbnRlZ2VyKHZhbHVlKSB7XG4gICAgICAgIHJldHVybiB0b1N0cmluZy5jYWxsKHZhbHVlKSA9PT0gJ1tvYmplY3QgTnVtYmVyXScgJiYgLTIxNDc0ODM2NDggPD0gdmFsdWUgJiYgdmFsdWUgPD0gMjE0NzQ4MzY0NztcbiAgICB9XG4gICAgSXMuaW50ZWdlciA9IGludGVnZXI7XG4gICAgZnVuY3Rpb24gdWludGVnZXIodmFsdWUpIHtcbiAgICAgICAgcmV0dXJuIHRvU3RyaW5nLmNhbGwodmFsdWUpID09PSAnW29iamVjdCBOdW1iZXJdJyAmJiAwIDw9IHZhbHVlICYmIHZhbHVlIDw9IDIxNDc0ODM2NDc7XG4gICAgfVxuICAgIElzLnVpbnRlZ2VyID0gdWludGVnZXI7XG4gICAgZnVuY3Rpb24gZnVuYyh2YWx1ZSkge1xuICAgICAgICByZXR1cm4gdG9TdHJpbmcuY2FsbCh2YWx1ZSkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG4gICAgfVxuICAgIElzLmZ1bmMgPSBmdW5jO1xuICAgIGZ1bmN0aW9uIG9iamVjdExpdGVyYWwodmFsdWUpIHtcbiAgICAgICAgLy8gU3RyaWN0bHkgc3BlYWtpbmcgY2xhc3MgaW5zdGFuY2VzIHBhc3MgdGhpcyBjaGVjayBhcyB3ZWxsLiBTaW5jZSB0aGUgTFNQXG4gICAgICAgIC8vIGRvZXNuJ3QgdXNlIGNsYXNzZXMgd2UgaWdub3JlIHRoaXMgZm9yIG5vdy4gSWYgd2UgZG8gd2UgbmVlZCB0byBhZGQgc29tZXRoaW5nXG4gICAgICAgIC8vIGxpa2UgdGhpczogYE9iamVjdC5nZXRQcm90b3R5cGVPZihPYmplY3QuZ2V0UHJvdG90eXBlT2YoeCkpID09PSBudWxsYFxuICAgICAgICByZXR1cm4gdmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JztcbiAgICB9XG4gICAgSXMub2JqZWN0TGl0ZXJhbCA9IG9iamVjdExpdGVyYWw7XG4gICAgZnVuY3Rpb24gdHlwZWRBcnJheSh2YWx1ZSwgY2hlY2spIHtcbiAgICAgICAgcmV0dXJuIEFycmF5LmlzQXJyYXkodmFsdWUpICYmIHZhbHVlLmV2ZXJ5KGNoZWNrKTtcbiAgICB9XG4gICAgSXMudHlwZWRBcnJheSA9IHR5cGVkQXJyYXk7XG59KShJcyB8fCAoSXMgPSB7fSkpO1xuIl0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FBQUE7QUFBQTtBQUFBO0FBS0EsYUFBTyxlQUFlLFNBQVMsY0FBYyxFQUFFLE9BQU8sS0FBSyxDQUFDO0FBQzVELGNBQVEsY0FBYyxRQUFRLFFBQVEsUUFBUSxPQUFPLFFBQVEsUUFBUSxRQUFRLFNBQVMsUUFBUSxTQUFTLFFBQVEsVUFBVTtBQUN6SCxlQUFTLFFBQVEsT0FBTztBQUNwQixlQUFPLFVBQVUsUUFBUSxVQUFVO0FBQUEsTUFDdkM7QUFDQSxjQUFRLFVBQVU7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QSxNQUM5QztBQUFBLElBQ0o7QUFBQSxFQUNKOyIsCiAgIm5hbWVzIjogWyJFcnJvckNvZGVzIiwgIk1lc3NhZ2UiLCAiVG91Y2giLCAiRGlzcG9zYWJsZSIsICJSQUwiLCAiRXZlbnQiLCAiSXMiLCAiQ2FuY2VsbGF0aW9uVG9rZW4iLCAiQ2FuY2VsbGF0aW9uU3RhdGUiLCAiX2Nvbm4iLCAiSXMiLCAiTWVzc2FnZVJlYWRlciIsICJBYnN0cmFjdE1lc3NhZ2VSZWFkZXIiLCAiUmVzb2x2ZWRNZXNzYWdlUmVhZGVyT3B0aW9ucyIsICJJcyIsICJNZXNzYWdlV3JpdGVyIiwgIkFic3RyYWN0TWVzc2FnZVdyaXRlciIsICJSZXNvbHZlZE1lc3NhZ2VXcml0ZXJPcHRpb25zIiwgInJlc3VsdCIsICJJcyIsICJDYW5jZWxOb3RpZmljYXRpb24iLCAiUHJvZ3Jlc3NUb2tlbiIsICJQcm9ncmVzc05vdGlmaWNhdGlvbiIsICJTdGFyUmVxdWVzdEhhbmRsZXIiLCAiVHJhY2UiLCAiVHJhY2VWYWx1ZXMiLCAiVHJhY2VGb3JtYXQiLCAiU2V0VHJhY2VOb3RpZmljYXRpb24iLCAiTG9nVHJhY2VOb3RpZmljYXRpb24iLCAiQ29ubmVjdGlvbkVycm9ycyIsICJDb25uZWN0aW9uU3RyYXRlZ3kiLCAiSWRDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5IiwgIlJlcXVlc3RDYW5jZWxsYXRpb25SZWNlaXZlclN0cmF0ZWd5IiwgIkNhbmNlbGxhdGlvblJlY2VpdmVyU3RyYXRlZ3kiLCAiQ2FuY2VsbGF0aW9uU2VuZGVyU3RyYXRlZ3kiLCAiQ2FuY2VsbGF0aW9uU3RyYXRlZ3kiLCAiTWVzc2FnZVN0cmF0ZWd5IiwgIkNvbm5lY3Rpb25PcHRpb25zIiwgIkNvbm5lY3Rpb25TdGF0ZSIsICJjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiIsICJzdGFydFRpbWUiLCAiUklMIiwgIm0iLCAiZXhwb3J0cyIsICJjcmVhdGVNZXNzYWdlQ29ubmVjdGlvbiIsICJpbXBvcnRfdnNjb2RlX2pzb25ycGMiLCAiaW1wb3J0X3ZzY29kZV9qc29ucnBjIiwgImltcG9ydF92c2NvZGVfanNvbnJwYyIsICJpbXBvcnRfdnNjb2RlX2pzb25ycGMiLCAiRG9jdW1lbnRVcmkiLCAiVVJJIiwgImludGVnZXIiLCAidWludGVnZXIiLCAiUG9zaXRpb24iLCAiUmFuZ2UiLCAiTG9jYXRpb24iLCAiTG9jYXRpb25MaW5rIiwgIkNvbG9yIiwgIkNvbG9ySW5mb3JtYXRpb24iLCAiQ29sb3JQcmVzZW50YXRpb24iLCAiRm9sZGluZ1JhbmdlS2luZCIsICJGb2xkaW5nUmFuZ2UiLCAiRGlhZ25vc3RpY1JlbGF0ZWRJbmZvcm1hdGlvbiIsICJsb2NhdGlvbiIsICJEaWFnbm9zdGljU2V2ZXJpdHkiLCAiRGlhZ25vc3RpY1RhZyIsICJDb2RlRGVzY3JpcHRpb24iLCAiRGlhZ25vc3RpYyIsICJDb21tYW5kIiwgIlRleHRFZGl0IiwgIkNoYW5nZUFubm90YXRpb24iLCAiQ2hhbmdlQW5ub3RhdGlvbklkZW50aWZpZXIiLCAiQW5ub3RhdGVkVGV4dEVkaXQiLCAiVGV4dERvY3VtZW50RWRpdCIsICJDcmVhdGVGaWxlIiwgIlJlbmFtZUZpbGUiLCAiRGVsZXRlRmlsZSIsICJXb3Jrc3BhY2VFZGl0IiwgIlRleHREb2N1bWVudElkZW50aWZpZXIiLCAiVmVyc2lvbmVkVGV4dERvY3VtZW50SWRlbnRpZmllciIsICJPcHRpb25hbFZlcnNpb25lZFRleHREb2N1bWVudElkZW50aWZpZXIiLCAiVGV4dERvY3VtZW50SXRlbSIsICJNYXJrdXBLaW5kIiwgIk1hcmt1cENvbnRlbnQiLCAiQ29tcGxldGlvbkl0ZW1LaW5kIiwgIkluc2VydFRleHRGb3JtYXQiLCAiQ29tcGxldGlvbkl0ZW1UYWciLCAiSW5zZXJ0UmVwbGFjZUVkaXQiLCAiUmFuZ2UiLCAiSW5zZXJ0VGV4dE1vZGUiLCAiQ29tcGxldGlvbkl0ZW1MYWJlbERldGFpbHMiLCAiQ29tcGxldGlvbkl0ZW0iLCAiQ29tcGxldGlvbkxpc3QiLCAiTWFya2VkU3RyaW5nIiwgIkhvdmVyIiwgIlBhcmFtZXRlckluZm9ybWF0aW9uIiwgIlNpZ25hdHVyZUluZm9ybWF0aW9uIiwgIkRvY3VtZW50SGlnaGxpZ2h0S2luZCIsICJEb2N1bWVudEhpZ2hsaWdodCIsICJTeW1ib2xLaW5kIiwgIlN5bWJvbFRhZyIsICJTeW1ib2xJbmZvcm1hdGlvbiIsICJXb3Jrc3BhY2VTeW1ib2wiLCAiRG9jdW1lbnRTeW1ib2wiLCAiQ29kZUFjdGlvbktpbmQiLCAiQ29kZUFjdGlvblRyaWdnZXJLaW5kIiwgIkNvZGVBY3Rpb25Db250ZXh0IiwgIkNvZGVBY3Rpb24iLCAiQ29kZUxlbnMiLCAiRm9ybWF0dGluZ09wdGlvbnMiLCAiRG9jdW1lbnRMaW5rIiwgIlNlbGVjdGlvblJhbmdlIiwgIlNlbWFudGljVG9rZW5UeXBlcyIsICJTZW1hbnRpY1Rva2VuTW9kaWZpZXJzIiwgIlNlbWFudGljVG9rZW5zIiwgIklubGluZVZhbHVlVGV4dCIsICJJbmxpbmVWYWx1ZVZhcmlhYmxlTG9va3VwIiwgIklubGluZVZhbHVlRXZhbHVhdGFibGVFeHByZXNzaW9uIiwgIklubGluZVZhbHVlQ29udGV4dCIsICJJbmxheUhpbnRLaW5kIiwgIklubGF5SGludExhYmVsUGFydCIsICJJbmxheUhpbnQiLCAiUG9zaXRpb24iLCAiU3RyaW5nVmFsdWUiLCAiSW5saW5lQ29tcGxldGlvbkl0ZW0iLCAiSW5saW5lQ29tcGxldGlvbkxpc3QiLCAiSW5saW5lQ29tcGxldGlvblRyaWdnZXJLaW5kIiwgIlNlbGVjdGVkQ29tcGxldGlvbkluZm8iLCAiSW5saW5lQ29tcGxldGlvbkNvbnRleHQiLCAiV29ya3NwYWNlRm9sZGVyIiwgIlRleHREb2N1bWVudCIsICJQb3NpdGlvbiIsICJJcyIsICJ1bmRlZmluZWQiLCAiaW50ZWdlciIsICJ1aW50ZWdlciIsICJtIl0KfQo= diff --git a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/lsp/java-lsp-client.ts b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/lsp/java-lsp-client.ts index 3455c30a322..c28e4eb5b15 100644 --- a/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/lsp/java-lsp-client.ts +++ b/components/ui/editor-monaco/src/main/resources/META-INF/dirigible/editor-monaco/js/lsp/java-lsp-client.ts @@ -264,6 +264,9 @@ function openFile(fileUri: string): void { text: model?.getValue() ?? '', }, }); + // Tell JDT.LS the file exists on disk so its project model includes it even before a build — this + // makes a just-created type (e.g. a new interface) resolvable/offered in sibling files immediately. + _conn.sendNotification('workspace/didChangeWatchedFiles', { changes: [{ uri: fileUri, type: 1 /* Created */ }] }); if (model) { model.onDidChangeContent(() => { @@ -1235,8 +1238,6 @@ function jdtlsSettings() { completion: { overwrite: true, guessMethodArguments: false, - // Cap results so import/type completion over the large platform classpath stays snappy. - maxResults: 50, filteredTypes: [ 'com.sun.*', 'sun.*', 'jdk.*', 'org.eclipse.jdt.internal.*',