-
Notifications
You must be signed in to change notification settings - Fork 268
/
Copy pathindex.cjs
2 lines (2 loc) · 393 KB
/
index.cjs
1
2
"use strict";require("colors");var e=require("fs"),t=require("path"),r=require("https-proxy-agent"),o=require("prompts"),i=require("dotenv"),s=require("zod"),n=require("url"),a=require("http"),l=require("https"),c=require("tarn"),p=require("uuid"),h=require("puppeteer"),u=require("jsdom"),d=require("dompurify"),g=require("cors"),m=require("express"),f=require("multer"),v=require("express-rate-limit"),y="undefined"!=typeof document?document.currentScript:null;const b={core:["highcharts","highcharts-more","highcharts-3d"],modules:["stock","map","gantt","exporting","parallel-coordinates","accessibility","boost-canvas","boost","data","data-tools","draggable-points","static-scale","broken-axis","heatmap","tilemap","tiledwebmap","timeline","treemap","treegraph","item-series","drilldown","histogram-bellcurve","bullet","funnel","funnel3d","geoheatmap","pyramid3d","networkgraph","overlapping-datalabels","pareto","pattern-fill","pictorial","price-indicator","sankey","arc-diagram","dependency-wheel","series-label","series-on-point","solid-gauge","sonification","streamgraph","sunburst","variable-pie","variwide","vector","venn","windbarb","wordcloud","xrange","no-data-to-display","drag-panes","debugger","dumbbell","lollipop","cylinder","organization","dotplot","marker-clusters","hollowcandlestick","heikinashi","flowmap","export-data","navigator","textpath"],indicators:["indicators-all"],custom:["https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.30.1/moment.min.js","https://cdnjs.cloudflare.com/ajax/libs/moment-timezone/0.5.45/moment-timezone-with-data.min.js"]},w={puppeteer:{args:{value:["--allow-running-insecure-content","--ash-no-nudges","--autoplay-policy=user-gesture-required","--block-new-web-contents","--disable-accelerated-2d-canvas","--disable-background-networking","--disable-background-timer-throttling","--disable-backgrounding-occluded-windows","--disable-breakpad","--disable-checker-imaging","--disable-client-side-phishing-detection","--disable-component-extensions-with-background-pages","--disable-component-update","--disable-default-apps","--disable-dev-shm-usage","--disable-domain-reliability","--disable-extensions","--disable-features=CalculateNativeWinOcclusion,InterestFeedContentSuggestions,WebOTP","--disable-hang-monitor","--disable-ipc-flooding-protection","--disable-logging","--disable-notifications","--disable-offer-store-unmasked-wallet-cards","--disable-popup-blocking","--disable-print-preview","--disable-prompt-on-repost","--disable-renderer-backgrounding","--disable-search-engine-choice-screen","--disable-session-crashed-bubble","--disable-setuid-sandbox","--disable-site-isolation-trials","--disable-speech-api","--disable-sync","--enable-unsafe-webgpu","--hide-crash-restore-bubble","--hide-scrollbars","--metrics-recording-only","--mute-audio","--no-default-browser-check","--no-first-run","--no-pings","--no-sandbox","--no-startup-window","--no-zygote","--password-store=basic","--process-per-tab","--use-mock-keychain"],type:"string[]",description:"Arguments array to send to Puppeteer."}},highcharts:{version:{value:"latest",type:"string",envLink:"HIGHCHARTS_VERSION",description:"The Highcharts version to be used."},cdnURL:{value:"https://code.highcharts.com/",type:"string",envLink:"HIGHCHARTS_CDN_URL",description:"The CDN URL for Highcharts scripts to be used."},coreScripts:{value:b.core,type:"string[]",envLink:"HIGHCHARTS_CORE_SCRIPTS",description:"The core Highcharts scripts to fetch."},moduleScripts:{value:b.modules,type:"string[]",envLink:"HIGHCHARTS_MODULE_SCRIPTS",description:"The modules of Highcharts to fetch."},indicatorScripts:{value:b.indicators,type:"string[]",envLink:"HIGHCHARTS_INDICATOR_SCRIPTS",description:"The indicators of Highcharts to fetch."},customScripts:{value:b.custom,type:"string[]",description:"Additional custom scripts or dependencies to fetch."},forceFetch:{value:!1,type:"boolean",envLink:"HIGHCHARTS_FORCE_FETCH",description:"The flag to determine whether to refetch all scripts after each server rerun."},cachePath:{value:".cache",type:"string",envLink:"HIGHCHARTS_CACHE_PATH",description:"The path to the cache directory. It is used to store the Highcharts scripts and custom scripts."}},export:{infile:{value:!1,type:"string",description:"The input file should include a name and a type (json or svg). It must be correctly formatted as a JSON or SVG file."},instr:{value:!1,type:"string",description:"Input, provided in the form of a stringified JSON or SVG file, will override the --infile option."},options:{value:!1,type:"string",description:"An alias for the --instr option."},outfile:{value:!1,type:"string",description:"The output filename along with a type (jpeg, png, pdf, or svg). This will ignore the --type flag."},type:{value:"png",type:"string",envLink:"EXPORT_TYPE",description:"The file export format. It can be jpeg, png, pdf, or svg."},constr:{value:"chart",type:"string",envLink:"EXPORT_CONSTR",description:"The constructor to use. Can be chart, stockChart, mapChart, or ganttChart."},defaultHeight:{value:400,type:"number",envLink:"EXPORT_DEFAULT_HEIGHT",description:"the default height of the exported chart. Used when no value is set."},defaultWidth:{value:600,type:"number",envLink:"EXPORT_DEFAULT_WIDTH",description:"The default width of the exported chart. Used when no value is set."},defaultScale:{value:1,type:"number",envLink:"EXPORT_DEFAULT_SCALE",description:"The default scale of the exported chart. Used when no value is set."},height:{value:!1,type:"number",description:"The height of the exported chart, overriding the option in the chart settings."},width:{value:!1,type:"number",description:"The width of the exported chart, overriding the option in the chart settings."},scale:{value:!1,type:"number",description:"The scale of the exported chart, overriding the option in the chart settings. Ranges between 0.1 and 5.0."},globalOptions:{value:!1,type:"string",description:"Either a stringified JSON or a filename containing options to be passed into the Highcharts.setOptions."},themeOptions:{value:!1,type:"string",description:"Either a stringified JSON or a filename containing theme options to be passed into the Highcharts.setOptions."},batch:{value:!1,type:"string",description:'Initiates a batch job with a string containing input/output pairs: "in=out;in=out;...".'},rasterizationTimeout:{value:1500,type:"number",envLink:"EXPORT_RASTERIZATION_TIMEOUT",description:"The duration in milliseconds to wait for rendering a webpage."}},customLogic:{allowCodeExecution:{value:!1,type:"boolean",envLink:"CUSTOM_LOGIC_ALLOW_CODE_EXECUTION",description:"Controls whether the execution of arbitrary code is allowed during the exporting process."},allowFileResources:{value:!1,type:"boolean",envLink:"CUSTOM_LOGIC_ALLOW_FILE_RESOURCES",description:"Controls the ability to inject resources from the filesystem. This setting has no effect when running as a server."},customCode:{value:!1,type:"string",description:"Custom code to execute before chart initialization. It can be a function, code wrapped within a function, or a filename with the .js extension."},callback:{value:!1,type:"string",description:"JavaScript code to run during construction. It can be a function or a filename with the .js extension."},resources:{value:!1,type:"string",description:"Additional resource in the form of a stringified JSON, which may contain files, js, and css sections."},loadConfig:{value:!1,type:"string",legacyName:"fromFile",description:"A file containing a pre-defined configuration to use."},createConfig:{value:!1,type:"string",description:"Enables setting options through a prompt and saving them in a provided config file."}},server:{maxUploadSize:{value:3,type:"number",cliName:"maxUploadSize",envLink:"SERVER_MAX_UPLOAD_SIZE",description:"The maximum upload size, in megabytes, for the server"},enable:{value:!1,type:"boolean",envLink:"SERVER_ENABLE",cliName:"enableServer",description:"When set to true, the server starts on the local IP address 0.0.0.0."},host:{value:"0.0.0.0",type:"string",envLink:"SERVER_HOST",description:"The hostname of the server. Additionally, it starts a server on the provided hostname."},port:{value:7801,type:"number",envLink:"SERVER_PORT",description:"The server port when enabled."},benchmarking:{value:!1,type:"boolean",envLink:"SERVER_BENCHMARKING",cliName:"serverBenchmarking",description:"Indicates whether to display the duration, in milliseconds, of specific actions that occur on the server while serving a request."},proxy:{host:{value:!1,type:"string",envLink:"SERVER_PROXY_HOST",cliName:"proxyHost",description:"The host of the proxy server to use, if it exists."},port:{value:8080,type:"number",envLink:"SERVER_PROXY_PORT",cliName:"proxyPort",description:"The port of the proxy server to use, if it exists."},username:{value:!1,type:"string",envLink:"SERVER_PROXY_USERNAME",cliName:"proxyUsername",description:"The username for the proxy server, if it exists."},password:{value:!1,type:"string",envLink:"SERVER_PROXY_PASSWORD",cliName:"proxyPassword",description:"The password for the proxy server, if it exists."},timeout:{value:5e3,type:"number",envLink:"SERVER_PROXY_TIMEOUT",cliName:"proxyTimeout",description:"The timeout for the proxy server to use, if it exists."}},rateLimiting:{enable:{value:!1,type:"boolean",envLink:"SERVER_RATE_LIMITING_ENABLE",cliName:"enableRateLimiting",description:"Enables rate limiting for the server."},maxRequests:{value:10,type:"number",envLink:"SERVER_RATE_LIMITING_MAX_REQUESTS",legacyName:"rateLimit",description:"The maximum number of requests allowed in one minute."},window:{value:1,type:"number",envLink:"SERVER_RATE_LIMITING_WINDOW",description:"The time window, in minutes, for the rate limiting."},delay:{value:0,type:"number",envLink:"SERVER_RATE_LIMITING_DELAY",description:"The delay duration for each successive request before reaching the maximum limit."},trustProxy:{value:!1,type:"boolean",envLink:"SERVER_RATE_LIMITING_TRUST_PROXY",description:"Set this to true if the server is behind a load balancer."},skipKey:{value:!1,type:"string",envLink:"SERVER_RATE_LIMITING_SKIP_KEY",description:"Allows bypassing the rate limiter and should be provided with the skipToken argument."},skipToken:{value:!1,type:"string",envLink:"SERVER_RATE_LIMITING_SKIP_TOKEN",description:"Allows bypassing the rate limiter and should be provided with the skipKey argument."}},ssl:{enable:{value:!1,type:"boolean",envLink:"SERVER_SSL_ENABLE",cliName:"enableSsl",description:"Enables or disables the SSL protocol."},force:{value:!1,type:"boolean",envLink:"SERVER_SSL_FORCE",cliName:"sslForce",legacyName:"sslOnly",description:"When set to true, the server is forced to serve only over HTTPS."},port:{value:443,type:"number",envLink:"SERVER_SSL_PORT",cliName:"sslPort",description:"The port on which to run the SSL server."},certPath:{value:!1,type:"string",envLink:"SERVER_SSL_CERT_PATH",legacyName:"sslPath",description:"The path to the SSL certificate/key file."}}},pool:{minWorkers:{value:4,type:"number",envLink:"POOL_MIN_WORKERS",description:"The number of minimum and initial pool workers to spawn."},maxWorkers:{value:8,type:"number",envLink:"POOL_MAX_WORKERS",legacyName:"workers",description:"The number of maximum pool workers to spawn."},workLimit:{value:40,type:"number",envLink:"POOL_WORK_LIMIT",description:"The number of work pieces that can be performed before restarting the worker process."},acquireTimeout:{value:5e3,type:"number",envLink:"POOL_ACQUIRE_TIMEOUT",description:"The duration, in milliseconds, to wait for acquiring a resource."},createTimeout:{value:5e3,type:"number",envLink:"POOL_CREATE_TIMEOUT",description:"The duration, in milliseconds, to wait for creating a resource."},destroyTimeout:{value:5e3,type:"number",envLink:"POOL_DESTROY_TIMEOUT",description:"The duration, in milliseconds, to wait for destroying a resource."},idleTimeout:{value:3e4,type:"number",envLink:"POOL_IDLE_TIMEOUT",description:"The duration, in milliseconds, after which an idle resource is destroyed."},createRetryInterval:{value:200,type:"number",envLink:"POOL_CREATE_RETRY_INTERVAL",description:"The duration, in milliseconds, to wait before retrying the create process in case of a failure."},reaperInterval:{value:1e3,type:"number",envLink:"POOL_REAPER_INTERVAL",description:"The duration, in milliseconds, after which the check for idle resources to destroy is triggered."},benchmarking:{value:!1,type:"boolean",envLink:"POOL_BENCHMARKING",cliName:"poolBenchmarking",description:"Indicate whether to show statistics for the pool of resources or not."}},logging:{level:{value:4,type:"number",envLink:"LOGGING_LEVEL",cliName:"logLevel",description:"The logging level to be used."},file:{value:"highcharts-export-server.log",type:"string",envLink:"LOGGING_FILE",cliName:"logFile",description:"The name of a log file. The `logToFile` and `logDest` options also need to be set to enable file logging."},dest:{value:"log/",type:"string",envLink:"LOGGING_DEST",cliName:"logDest",description:"The path to store log files. The `logToFile` option also needs to be set to enable file logging."},toConsole:{value:!0,type:"boolean",envLink:"LOGGING_TO_CONSOLE",cliName:"logToConsole",description:"Enables or disables showing logs in the console."},toFile:{value:!0,type:"boolean",envLink:"LOGGING_TO_FILE",cliName:"logToFile",description:"Enables or disables creation of the log directory and saving the log into a .log file."}},ui:{enable:{value:!1,type:"boolean",envLink:"UI_ENABLE",cliName:"enableUi",description:"Enables or disables the user interface (UI) for the export server."},route:{value:"/",type:"string",envLink:"UI_ROUTE",cliName:"uiRoute",description:"The endpoint route to which the user interface (UI) should be attached."}},other:{nodeEnv:{value:"production",type:"string",envLink:"OTHER_NODE_ENV",description:"The type of Node.js environment."},listenToProcessExits:{value:!0,type:"boolean",envLink:"OTHER_LISTEN_TO_PROCESS_EXITS",description:"Decides whether or not to attach process.exit handlers."},noLogo:{value:!1,type:"boolean",envLink:"OTHER_NO_LOGO",description:"Skip printing the logo on a startup. Will be replaced by a simple text."},hardResetPage:{value:!1,type:"boolean",envLink:"OTHER_HARD_RESET_PAGE",description:"Decides if the page content should be reset entirely."},browserShellMode:{value:!0,type:"boolean",envLink:"OTHER_BROWSER_SHELL_MODE",description:"Decides if the browser runs in the shell mode."}},debug:{enable:{value:!1,type:"boolean",envLink:"DEBUG_ENABLE",cliName:"enableDebug",description:"Enables or disables debug mode for the underlying browser."},headless:{value:!0,type:"boolean",envLink:"DEBUG_HEADLESS",description:"Controls the mode in which the browser is launched when in the debug mode."},devtools:{value:!1,type:"boolean",envLink:"DEBUG_DEVTOOLS",description:"Decides whether to enable DevTools when the browser is in a headful state."},listenToConsole:{value:!1,type:"boolean",envLink:"DEBUG_LISTEN_TO_CONSOLE",description:"Decides whether to enable a listener for console messages sent from the browser."},dumpio:{value:!1,type:"boolean",envLink:"DEBUG_DUMPIO",description:"Redirects browser process stdout and stderr to process.stdout and process.stderr."},slowMo:{value:0,type:"number",envLink:"DEBUG_SLOW_MO",description:"Slows down Puppeteer operations by the specified number of milliseconds."},debuggingPort:{value:9222,type:"number",envLink:"DEBUG_DEBUGGING_PORT",description:"Specifies the debugging port."}}},E={puppeteer:[{type:"list",name:"args",message:"Puppeteer arguments",initial:w.puppeteer.args.value.join(","),separator:","}],highcharts:[{type:"text",name:"version",message:"Highcharts version",initial:w.highcharts.version.value},{type:"text",name:"cdnURL",message:"The URL of CDN",initial:w.highcharts.cdnURL.value},{type:"multiselect",name:"coreScripts",message:"Available core scripts",instructions:"Space: Select specific, A: Select all, Enter: Confirm.",choices:w.highcharts.coreScripts.value},{type:"multiselect",name:"moduleScripts",message:"Available module scripts",instructions:"Space: Select specific, A: Select all, Enter: Confirm.",choices:w.highcharts.moduleScripts.value},{type:"multiselect",name:"indicatorScripts",message:"Available indicator scripts",instructions:"Space: Select specific, A: Select all, Enter: Confirm.",choices:w.highcharts.indicatorScripts.value},{type:"list",name:"customScripts",message:"Custom scripts",initial:w.highcharts.customScripts.value.join(","),separator:","},{type:"toggle",name:"forceFetch",message:"Force re-fetch the scripts",initial:w.highcharts.forceFetch.value},{type:"text",name:"cachePath",message:"The path to the cache directory",initial:w.highcharts.cachePath.value}],export:[{type:"select",name:"type",message:"The default export file type",hint:`Default: ${w.export.type.value}`,initial:0,choices:["png","jpeg","pdf","svg"]},{type:"select",name:"constr",message:"The default constructor for Highcharts",hint:`Default: ${w.export.constr.value}`,initial:0,choices:["chart","stockChart","mapChart","ganttChart"]},{type:"number",name:"defaultHeight",message:"The default fallback height of the exported chart",initial:w.export.defaultHeight.value},{type:"number",name:"defaultWidth",message:"The default fallback width of the exported chart",initial:w.export.defaultWidth.value},{type:"number",name:"defaultScale",message:"The default fallback scale of the exported chart",initial:w.export.defaultScale.value,min:.1,max:5},{type:"number",name:"rasterizationTimeout",message:"The rendering webpage timeout in milliseconds",initial:w.export.rasterizationTimeout.value}],customLogic:[{type:"toggle",name:"allowCodeExecution",message:"Enable execution of custom code",initial:w.customLogic.allowCodeExecution.value},{type:"toggle",name:"allowFileResources",message:"Enable file resources",initial:w.customLogic.allowFileResources.value}],server:[{type:"toggle",name:"enable",message:"Starts the server on 0.0.0.0",initial:w.server.enable.value},{type:"text",name:"host",message:"Server hostname",initial:w.server.host.value},{type:"number",name:"port",message:"Server port",initial:w.server.port.value},{type:"toggle",name:"benchmarking",message:"Enable server benchmarking",initial:w.server.benchmarking.value},{type:"text",name:"proxy.host",message:"The host of the proxy server to use",initial:w.server.proxy.host.value},{type:"number",name:"proxy.port",message:"The port of the proxy server to use",initial:w.server.proxy.port.value},{type:"number",name:"proxy.timeout",message:"The timeout for the proxy server to use",initial:w.server.proxy.timeout.value},{type:"toggle",name:"rateLimiting.enable",message:"Enable rate limiting",initial:w.server.rateLimiting.enable.value},{type:"number",name:"rateLimiting.maxRequests",message:"The maximum requests allowed per minute",initial:w.server.rateLimiting.maxRequests.value},{type:"number",name:"rateLimiting.window",message:"The rate-limiting time window in minutes",initial:w.server.rateLimiting.window.value},{type:"number",name:"rateLimiting.delay",message:"The delay for each successive request before reaching the maximum",initial:w.server.rateLimiting.delay.value},{type:"toggle",name:"rateLimiting.trustProxy",message:"Set to true if behind a load balancer",initial:w.server.rateLimiting.trustProxy.value},{type:"text",name:"rateLimiting.skipKey",message:"Allows bypassing the rate limiter when provided with the skipToken argument",initial:w.server.rateLimiting.skipKey.value},{type:"text",name:"rateLimiting.skipToken",message:"Allows bypassing the rate limiter when provided with the skipKey argument",initial:w.server.rateLimiting.skipToken.value},{type:"toggle",name:"ssl.enable",message:"Enable SSL protocol",initial:w.server.ssl.enable.value},{type:"toggle",name:"ssl.force",message:"Force serving only over HTTPS",initial:w.server.ssl.force.value},{type:"number",name:"ssl.port",message:"SSL server port",initial:w.server.ssl.port.value},{type:"text",name:"ssl.certPath",message:"The path to find the SSL certificate/key",initial:w.server.ssl.certPath.value}],pool:[{type:"number",name:"minWorkers",message:"The initial number of workers to spawn",initial:w.pool.minWorkers.value},{type:"number",name:"maxWorkers",message:"The maximum number of workers to spawn",initial:w.pool.maxWorkers.value},{type:"number",name:"workLimit",message:"The pieces of work that can be performed before restarting a Puppeteer process",initial:w.pool.workLimit.value},{type:"number",name:"acquireTimeout",message:"The number of milliseconds to wait for acquiring a resource",initial:w.pool.acquireTimeout.value},{type:"number",name:"createTimeout",message:"The number of milliseconds to wait for creating a resource",initial:w.pool.createTimeout.value},{type:"number",name:"destroyTimeout",message:"The number of milliseconds to wait for destroying a resource",initial:w.pool.destroyTimeout.value},{type:"number",name:"idleTimeout",message:"The number of milliseconds after an idle resource is destroyed",initial:w.pool.idleTimeout.value},{type:"number",name:"createRetryInterval",message:"The retry interval in milliseconds after a create process fails",initial:w.pool.createRetryInterval.value},{type:"number",name:"reaperInterval",message:"The reaper interval in milliseconds after triggering the check for idle resources to destroy",initial:w.pool.reaperInterval.value},{type:"toggle",name:"benchmarking",message:"Enable benchmarking for a resource pool",initial:w.pool.benchmarking.value}],logging:[{type:"number",name:"level",message:"The log level (0: silent, 1: error, 2: warning, 3: notice, 4: verbose, 5: benchmark)",initial:w.logging.level.value,round:0,min:0,max:5},{type:"text",name:"file",message:"A log file name. Set with --toFile and --logDest to enable file logging",initial:w.logging.file.value},{type:"text",name:"dest",message:"The path to a log file when the file logging is enabled",initial:w.logging.dest.value},{type:"toggle",name:"toConsole",message:"Enable logging to the console",initial:w.logging.toConsole.value},{type:"toggle",name:"toFile",message:"Enables logging to a file",initial:w.logging.toFile.value}],ui:[{type:"toggle",name:"enable",message:"Enable UI for the export server",initial:w.ui.enable.value},{type:"text",name:"route",message:"A route to attach the UI",initial:w.ui.route.value}],other:[{type:"text",name:"nodeEnv",message:"The type of Node.js environment",initial:w.other.nodeEnv.value},{type:"toggle",name:"listenToProcessExits",message:"Set to false to skip attaching process.exit handlers",initial:w.other.listenToProcessExits.value},{type:"toggle",name:"noLogo",message:"Skip printing the logo on startup. Replaced by simple text",initial:w.other.noLogo.value},{type:"toggle",name:"hardResetPage",message:"Decides if the page content should be reset entirely",initial:w.other.hardResetPage.value},{type:"toggle",name:"browserShellMode",message:"Decides if the browser runs in the shell mode",initial:w.other.browserShellMode.value}],debug:[{type:"toggle",name:"enable",message:"Enables debug mode for the browser instance",initial:w.debug.enable.value},{type:"toggle",name:"headless",message:"The mode setting for the browser",initial:w.debug.headless.value},{type:"toggle",name:"devtools",message:"The DevTools for the headful browser",initial:w.debug.devtools.value},{type:"toggle",name:"listenToConsole",message:"The event listener for console messages from the browser",initial:w.debug.listenToConsole.value},{type:"toggle",name:"dumpio",message:"Redirects the browser stdout and stderr to NodeJS process",initial:w.debug.dumpio.value},{type:"number",name:"slowMo",message:"Puppeteer operations slow down in milliseconds",initial:w.debug.slowMo.value},{type:"number",name:"debuggingPort",message:"The port number for debugging",initial:w.debug.debuggingPort.value}]},T=["options","globalOptions","themeOptions","resources","payload"],S={},x=(e,t="")=>{Object.keys(e).forEach((r=>{if(!["puppeteer","highcharts"].includes(r)){const o=e[r];void 0===o.value?x(o,`${t}.${r}`):(S[o.cliName||r]=`${t}.${r}`.substring(1),void 0!==o.legacyName&&(S[o.legacyName]=`${t}.${r}`.substring(1)))}}))};x(w),i.config();const R=e=>s.z.string().transform((t=>t.split(",").map((e=>e.trim())).filter((t=>e.includes(t))))).transform((e=>e.length?e:void 0)),O=()=>s.z.enum(["true","false",""]).transform((e=>""!==e?"true"===e:void 0)),_=e=>s.z.enum([...e,""]).transform((e=>""!==e?e:void 0)),L=()=>s.z.string().trim().refine((e=>!["false","undefined","null","NaN"].includes(e)||""===e),(e=>({message:`The string contains forbidden values, received '${e}'`}))).transform((e=>""!==e?e:void 0)),k=()=>s.z.string().trim().refine((e=>""===e||!isNaN(parseFloat(e))&&parseFloat(e)>0),(e=>({message:`The value must be numeric and positive, received '${e}'`}))).transform((e=>""!==e?parseFloat(e):void 0)),I=()=>s.z.string().trim().refine((e=>""===e||!isNaN(parseFloat(e))&&parseFloat(e)>=0),(e=>({message:`The value must be numeric and non-negative, received '${e}'`}))).transform((e=>""!==e?parseFloat(e):void 0)),C=s.z.object({HIGHCHARTS_VERSION:s.z.string().trim().refine((e=>/^(latest|\d+(\.\d+){0,2})$/.test(e)||""===e),(e=>({message:`HIGHCHARTS_VERSION must be 'latest', a major version, or in the form XX.YY.ZZ, received '${e}'`}))).transform((e=>""!==e?e:void 0)),HIGHCHARTS_CDN_URL:s.z.string().trim().refine((e=>e.startsWith("https://")||e.startsWith("http://")||""===e),(e=>({message:`Invalid value for HIGHCHARTS_CDN_URL. It should start with http:// or https://, received '${e}'`}))).transform((e=>""!==e?e:void 0)),HIGHCHARTS_CORE_SCRIPTS:R(b.core),HIGHCHARTS_MODULE_SCRIPTS:R(b.modules),HIGHCHARTS_INDICATOR_SCRIPTS:R(b.indicators),HIGHCHARTS_FORCE_FETCH:O(),HIGHCHARTS_CACHE_PATH:L(),HIGHCHARTS_ADMIN_TOKEN:L(),EXPORT_TYPE:_(["jpeg","png","pdf","svg"]),EXPORT_CONSTR:_(["chart","stockChart","mapChart","ganttChart"]),EXPORT_DEFAULT_HEIGHT:k(),EXPORT_DEFAULT_WIDTH:k(),EXPORT_DEFAULT_SCALE:k(),EXPORT_RASTERIZATION_TIMEOUT:I(),CUSTOM_LOGIC_ALLOW_CODE_EXECUTION:O(),CUSTOM_LOGIC_ALLOW_FILE_RESOURCES:O(),SERVER_ENABLE:O(),SERVER_HOST:L(),SERVER_PORT:k(),SERVER_BENCHMARKING:O(),SERVER_PROXY_HOST:L(),SERVER_PROXY_PORT:k(),SERVER_PROXY_USERNAME:L(),SERVER_PROXY_PASSWORD:L(),SERVER_PROXY_TIMEOUT:I(),SERVER_RATE_LIMITING_ENABLE:O(),SERVER_RATE_LIMITING_MAX_REQUESTS:I(),SERVER_RATE_LIMITING_WINDOW:I(),SERVER_RATE_LIMITING_DELAY:I(),SERVER_RATE_LIMITING_TRUST_PROXY:O(),SERVER_RATE_LIMITING_SKIP_KEY:L(),SERVER_RATE_LIMITING_SKIP_TOKEN:L(),SERVER_SSL_ENABLE:O(),SERVER_SSL_FORCE:O(),SERVER_SSL_PORT:k(),SERVER_SSL_CERT_PATH:L(),POOL_MIN_WORKERS:I(),POOL_MAX_WORKERS:I(),POOL_WORK_LIMIT:k(),POOL_ACQUIRE_TIMEOUT:I(),POOL_CREATE_TIMEOUT:I(),POOL_DESTROY_TIMEOUT:I(),POOL_IDLE_TIMEOUT:I(),POOL_CREATE_RETRY_INTERVAL:I(),POOL_REAPER_INTERVAL:I(),POOL_BENCHMARKING:O(),LOGGING_LEVEL:s.z.string().trim().refine((e=>""===e||!isNaN(parseFloat(e))&&parseFloat(e)>=0&&parseFloat(e)<=5),(e=>({message:`Invalid value for LOGGING_LEVEL. We only accept values from 0 to 5 as logging levels, received '${e}'`}))).transform((e=>""!==e?parseFloat(e):void 0)),LOGGING_FILE:L(),LOGGING_DEST:L(),LOGGING_TO_CONSOLE:O(),LOGGING_TO_FILE:O(),UI_ENABLE:O(),UI_ROUTE:L(),OTHER_NODE_ENV:_(["development","production","test"]),OTHER_LISTEN_TO_PROCESS_EXITS:O(),OTHER_NO_LOGO:O(),OTHER_HARD_RESET_PAGE:O(),OTHER_BROWSER_SHELL_MODE:O(),DEBUG_ENABLE:O(),DEBUG_HEADLESS:O(),DEBUG_DEVTOOLS:O(),DEBUG_LISTEN_TO_CONSOLE:O(),DEBUG_DUMPIO:O(),DEBUG_SLOW_MO:I(),DEBUG_DEBUGGING_PORT:k()}).partial().parse(process.env),N=["red","yellow","blue","gray","green"];let A={toConsole:!0,toFile:!1,pathCreated:!1,levelsDesc:[{title:"error",color:N[0]},{title:"warning",color:N[1]},{title:"notice",color:N[2]},{title:"verbose",color:N[3]},{title:"benchmark",color:N[4]}],listeners:[]};const P=(t,r)=>{A.pathCreated||(!e.existsSync(A.dest)&&e.mkdirSync(A.dest),A.pathCreated=!0),e.appendFile(`${A.dest}${A.file}`,[r].concat(t).join(" ")+"\n",(e=>{e&&(console.log(`[logger] Unable to write to log file: ${e}`),A.toFile=!1)}))},H=(...e)=>{const[t,...r]=e,{levelsDesc:o,level:i}=A;if(5!==t&&(0===t||t>i||i>o.length))return;const s=`${(new Date).toString().split("(")[0].trim()} [${o[t-1].title}] -`;A.listeners.forEach((e=>{e(s,r.join(" "))})),A.toConsole&&console.log.apply(void 0,[s.toString()[A.levelsDesc[t-1].color]].concat(r)),A.toFile&&P(r,s)},$=(e,t,r)=>{const o=r||t.message,{level:i,levelsDesc:s}=A;if(0===e||e>i||i>s.length)return;const n=`${(new Date).toString().split("(")[0].trim()} [${s[e-1].title}] -`,a=t.message!==t.stackMessage||void 0===t.stackMessage?t.stack:t.stack.split("\n").slice(1).join("\n"),l=[o,"\n",a];A.toConsole&&console.log.apply(void 0,[n.toString()[A.levelsDesc[e-1].color]].concat([o[N[e-1]],"\n",a])),A.listeners.forEach((e=>{e(n,l.join(" "))})),A.toFile&&P(l,n)},D=e=>{e>=0&&e<=A.levelsDesc.length&&(A.level=e)},U=(e,t)=>{if(A={...A,dest:e||A.dest,file:t||A.file,toFile:!0},0===A.dest.length)return H(1,"[logger] File logging initialization: no path supplied.");A.dest.endsWith("/")||(A.dest+="/")},G=n.fileURLToPath(new URL("../.","undefined"==typeof document?require("url").pathToFileURL(__filename).href:y&&"SCRIPT"===y.tagName.toUpperCase()&&y.src||new URL("index.cjs",document.baseURI).href)),F=(e,t)=>{const r=["png","jpeg","pdf","svg"];if(t){const o=t.split(".").pop();"jpg"===o?e="jpeg":r.includes(o)&&e!==o&&(e=o)}return{"image/png":"png","image/jpeg":"jpeg","application/pdf":"pdf","image/svg+xml":"svg"}[e]||r.find((t=>t===e))||"png"},j=(t=!1,r)=>{const o=["js","css","files"];let i=t,s=!1;if(r&&t.endsWith(".json"))try{i=M(e.readFileSync(t,"utf8"))}catch(e){return $(2,e,"[cli] No resources found.")}else i=M(t),i&&!r&&delete i.files;for(const e in i)o.includes(e)?s||(s=!0):delete i[e];return s?(i.files&&(i.files=i.files.map((e=>e.trim())),(!i.files||i.files.length<=0)&&delete i.files),i):H(3,"[cli] No resources found.")};function M(e,t){try{const r=JSON.parse("string"!=typeof e?JSON.stringify(e):e);return"string"!=typeof r&&t?JSON.stringify(r):r}catch{return!1}}const V=e=>{if(null===e||"object"!=typeof e)return e;const t=Array.isArray(e)?[]:{};for(const r in e)Object.prototype.hasOwnProperty.call(e,r)&&(t[r]=V(e[r]));return t},W=(e,t)=>JSON.stringify(e,((e,r)=>("string"==typeof r&&((r=r.trim()).startsWith("function(")||r.startsWith("function ("))&&r.endsWith("}")&&(r=t?`EXP_FUN${(r+"").replaceAll(/\n|\t|\r/g," ")}EXP_FUN`:void 0),"function"==typeof r?`EXP_FUN${(r+"").replaceAll(/\n|\t|\r/g," ")}EXP_FUN`:r))).replaceAll(/"EXP_FUN|EXP_FUN"/g,"");function q(){console.log("\nUsage of CLI arguments:".bold,"\n------",`\nFor more detailed information, visit the readme at: ${"https://github.com/highcharts/node-export-server#readme".bold.yellow}.`);const e=t=>{for(const[r,o]of Object.entries(t))if(Object.prototype.hasOwnProperty.call(o,"value")){let e=` --${o.cliName||r} ${("<"+o.type+">").green} `;if(e.length<48)for(let t=e.length;t<48;t++)e+=".";console.log(e,o.description,`[Default: ${o.value.toString().bold}]`.blue)}else e(o)};Object.keys(w).forEach((t=>{["puppeteer","highcharts"].includes(t)||(console.log(`\n${t.toUpperCase()}`.red),e(w[t]))})),console.log("\n")}const B=e=>!["false","undefined","null","NaN","0",""].includes(e)&&!!e,X=(t,r)=>{if(t&&"string"==typeof t)return(t=t.trim()).endsWith(".js")?!!r&&X(e.readFileSync(t,"utf8")):t.startsWith("function()")||t.startsWith("function ()")||t.startsWith("()=>")||t.startsWith("() =>")?`(${t})()`:t.replace(/;$/,"")},z=()=>{const e=process.hrtime.bigint();return()=>Number(process.hrtime.bigint()-e)/1e6};let K={};const J=()=>K,Y=(e,t,r=[])=>{const o=V(e);for(const[e,s]of Object.entries(t))o[e]="object"!=typeof(i=s)||Array.isArray(i)||null===i||r.includes(e)||void 0===o[e]?void 0!==s?s:o[e]:Y(o[e],s,r);var i;return o};function Z(e,t={},r=""){Object.keys(e).forEach((o=>{const i=e[o],s=t&&t[o];void 0===i.value?Z(i,s,`${r}.${o}`):(void 0!==s&&(i.value=s),i.envLink in C&&void 0!==C[i.envLink]&&(i.value=C[i.envLink]))}))}function Q(e){let t={};for(const[r,o]of Object.entries(e))t[r]=Object.prototype.hasOwnProperty.call(o,"value")?o.value:Q(o);return t}function ee(e,t,r){for(;t.length>1;){const o=t.shift();return Object.prototype.hasOwnProperty.call(e,o)||(e[o]={}),e[o]=ee(Object.assign({},e[o]),t,r),e}return e[t[0]]=r,e}async function te(e,t={}){return new Promise(((r,o)=>{const i=(e=>e.startsWith("https")?l:a)(e);i.get(e,Object.assign({headers:{"User-Agent":"highcharts/export",Referer:"highcharts/export"}},t||{}),(e=>{let t="";e.on("data",(e=>{t+=e})),e.on("end",(()=>{t||o("Nothing was fetched from the URL."),e.text=t,r(e)}))})).on("error",(e=>{o(e)}))}))}class re extends Error{constructor(e){super(),this.message=e,this.stackMessage=e}setError(e){return this.error=e,e.name&&(this.name=e.name),e.statusCode&&(this.statusCode=e.statusCode),e.stack&&(this.stackMessage=e.message,this.stack=e.stack),this}}const oe={cdnURL:"https://code.highcharts.com/",activeManifest:{},sources:"",hcVersion:""},ie=e=>e.sources.substring(0,e.sources.indexOf("*/")).replace("/*","").replace("*/","").replace(/\n/g,"").trim(),se=async(e,t,r,o=!1)=>{e.endsWith(".js")&&(e=e.substring(0,e.length-3)),H(4,`[cache] Fetching script - ${e}.js`);const i=await te(`${e}.js`,t);if(200===i.statusCode&&"string"==typeof i.text){if(r){r[e.replace(/(.*)\/|(.*)modules\/|stock\/(.*)indicators\/|maps\/(.*)modules\//gi,"")]=1}return i.text}if(o)throw new re(`Could not fetch the ${e}.js. The script might not exist in the requested version (status code: ${i.statusCode}).`).setError(i);return H(2,`[cache] Could not fetch the ${e}.js. The script might not exist in the requested version.`),""},ne=async(t,o,i)=>{const s=t.version,n="latest"!==s&&s?`${s}/`:"",a=t.cdnURL||oe.cdnURL;H(3,`[cache] Updating cache version to Highcharts: ${n||"latest"}.`);const l={};try{return oe.sources=await(async(e,t,o,i,s)=>{let n;const{host:a,port:l,username:c,password:p}=i;if(a&&l)try{n=new r.HttpsProxyAgent({host:a,port:l,...c&&p?{username:c,password:p}:{}})}catch(e){throw new re("[cache] Could not create a Proxy Agent.").setError(e)}const h=n?{agent:n,timeout:C.SERVER_PROXY_TIMEOUT}:{},u=[...e.map((e=>se(`${e}`,h,s,!0))),...t.map((e=>se(`${e}`,h,s))),...o.map((e=>se(`${e}`,h)))];return(await Promise.all(u)).join(";\n")})([...t.coreScripts.map((e=>`${a}${n}${e}`))],[...t.moduleScripts.map((e=>"map"===e?`${a}maps/${n}modules/${e}`:`${a}${n}modules/${e}`)),...t.indicatorScripts.map((e=>`${a}stock/${n}indicators/${e}`))],t.customScripts,o,l),oe.hcVersion=ie(oe),e.writeFileSync(i,oe.sources),l}catch(e){throw new re("[cache] Unable to update the local Highcharts cache.").setError(e)}},ae=async r=>{const{highcharts:o,server:i}=r,s=t.join(G,o.cachePath);let n;const a=t.join(s,"manifest.json"),l=t.join(s,"sources.js");if(!e.existsSync(s)&&e.mkdirSync(s),!e.existsSync(a)||o.forceFetch)H(3,"[cache] Fetching and caching Highcharts dependencies."),n=await ne(o,i.proxy,l);else{let t=!1;const r=JSON.parse(e.readFileSync(a));if(r.modules&&Array.isArray(r.modules)){const e={};r.modules.forEach((t=>e[t]=1)),r.modules=e}const{coreScripts:s,moduleScripts:c,indicatorScripts:p}=o,h=s.length+c.length+p.length;r.version!==o.version?(H(2,"[cache] A Highcharts version mismatch in the cache, need to re-fetch."),t=!0):Object.keys(r.modules||{}).length!==h?(H(2,"[cache] The cache and the requested modules do not match, need to re-fetch."),t=!0):t=(c||[]).some((e=>{if(!r.modules[e])return H(2,`[cache] The ${e} is missing in the cache, need to re-fetch.`),!0})),t?n=await ne(o,i.proxy,l):(H(3,"[cache] Dependency cache is up to date, proceeding."),oe.sources=e.readFileSync(l,"utf8"),n=r.modules,oe.hcVersion=ie(oe))}await(async(r,o)=>{const i={version:r.version,modules:o||{}};oe.activeManifest=i,H(3,"[cache] Writing a new manifest.");try{e.writeFileSync(t.join(G,r.cachePath,"manifest.json"),JSON.stringify(i),"utf8")}catch(e){throw new re("[cache] Error writing the cache manifest.").setError(e)}})(o,n)},le=()=>t.join(G,J().highcharts.cachePath),ce=()=>oe.hcVersion;function pe(){Highcharts.animObject=function(){return{duration:0}}}async function he(e,t,r){window._displayErrors=r;const{getOptions:o,merge:i,setOptions:s,wrap:n}=Highcharts;Highcharts.setOptionsObj=i(!1,{},o());const a={animation:!1};t.export.strInj&&(a.height=e.chart.height,a.width=e.chart.width),window.isRenderComplete=!1,n(Highcharts.Chart.prototype,"init",(function(e,t,r){((t=i(t,{exporting:{enabled:!1},plotOptions:{series:{label:{enabled:!1}}},tooltip:{}})).series||[]).forEach((function(e){e.animation=!1})),window.onHighchartsRender||(window.onHighchartsRender=Highcharts.addEvent(this,"render",(()=>{window.isRenderComplete=!0}))),e.apply(this,[t,r])})),n(Highcharts.Series.prototype,"init",(function(e,t,r){e.apply(this,[t,r])}));const l=t.export.strInj?new Function(`return ${t.export.strInj}`)():e;t.customLogic.customCode&&new Function("options",t.customLogic.customCode)(l);const c=i(!1,JSON.parse(t.export.themeOptions),l,{chart:a}),p=t.customLogic.callback?new Function(`return ${t.customLogic.callback}`)():void 0,h=JSON.parse(t.export.globalOptions);h&&s(h);let u=t.export.constr||"chart";u=void 0!==Highcharts[u]?u:"chart",Highcharts[u]("container",c,p);const d=o();for(const e in d)"function"!=typeof d[e]&&delete d[e];s(Highcharts.setOptionsObj),Highcharts.setOptionsObj={}}const ue=e.readFileSync(G+"/templates/template.html","utf8");let de;async function ge(){if(!de)return!1;const e=await de.newPage();return await e.setCacheEnabled(!1),await fe(e),function(e){const{debug:t}=J();t.enable&&t.listenToConsole&&e.on("console",(e=>{console.log(`[debug] ${e.text()}`)}));e.on("pageerror",(async t=>{e.isClosed()||await e.$eval("#container",((e,t)=>{window._displayErrors&&(e.innerHTML=t)}),`<h1>Chart input data error: </h1>${t.toString()}`)}))}(e),e}async function me(e,t){for(const e of t)await e.dispose();await e.evaluate((()=>{if("undefined"!=typeof Highcharts){const e=Highcharts.charts;if(Array.isArray(e)&&e.length)for(const t of e)t&&t.destroy(),Highcharts.charts.shift()}const[...e]=document.getElementsByTagName("script"),[,...t]=document.getElementsByTagName("style"),[...r]=document.getElementsByTagName("link");for(const o of[...e,...t,...r])o.remove()}))}async function fe(e){await e.setContent(ue,{waitUntil:"domcontentloaded"}),await e.addScriptTag({path:`${le()}/sources.js`}),await e.evaluate(pe)}const ve=async(e,t,r,o)=>e.evaluate(he,t,r,o);var ye=async(r,o,i)=>{let s=[];try{H(4,"[export] Determining export path.");const n=i.export,a=n?.options?.chart?.displayErrors&&oe.activeManifest.modules.debugger;let l;if(o.indexOf&&(o.indexOf("<svg")>=0||o.indexOf("<?xml")>=0)){if(H(4,"[export] Treating as SVG."),"svg"===n.type)return o;l=!0,await r.setContent((e=>`\n<!DOCTYPE html>\n<html lang='en-US'>\n <head>\n <meta http-equiv="Content-Type" content="text/html; charset=utf-8">\n <title>Highcharts Export</title>\n </head>\n <style>\n \n\nhtml, body {\n margin: 0;\n padding: 0;\n box-sizing: border-box;\n}\n\n#table-div, #sliders, #datatable, #controls, .ld-row {\n display: none;\n height: 0;\n}\n\n#chart-container {\n box-sizing: border-box;\n margin: 0;\n overflow: auto;\n font-size: 0;\n}\n\n#chart-container > figure, div {\n margin-top: 0 !important;\n margin-bottom: 0 !important;\n}\n\n\n </style>\n <body>\n <div id="chart-container">\n ${e}\n </div>\n </body>\n</html>\n\n`)(o),{waitUntil:"domcontentloaded"})}else H(4,"[export] Treating as config."),n.strInj?await ve(r,{chart:{height:n.height,width:n.width}},i,a):(o.chart.height=n.height,o.chart.width=n.width,await ve(r,o,i,a));s=await async function(r,o){const i=[],s=o.customLogic.resources;if(s){const n=[];if(s.js&&n.push({content:s.js}),s.files)for(const t of s.files){const r=!t.startsWith("http");n.push(r?{content:e.readFileSync(t,"utf8")}:{url:t})}for(const e of n)try{i.push(await r.addScriptTag(e))}catch(e){$(2,e,"[export] The JS resource cannot be loaded.")}n.length=0;const a=[];if(s.css){let e=s.css.match(/@import\s*([^;]*);/g);if(e)for(let r of e)r&&(r=r.replace("url(","").replace("@import","").replace(/"/g,"").replace(/'/g,"").replace(/;/,"").replace(/\)/g,"").trim(),r.startsWith("http")?a.push({url:r}):o.customLogic.allowFileResources&&a.push({path:t.join(G,r)}));a.push({content:s.css.replace(/@import\s*([^;]*);/g,"")||" "});for(const e of a)try{i.push(await r.addStyleTag(e))}catch(e){$(2,e,"[export] The CSS resource cannot be loaded.")}a.length=0}}return i}(r,i);const c=l?await r.evaluate((e=>{const t=document.querySelector("#chart-container svg:first-of-type"),r=t.height.baseVal.value*e,o=t.width.baseVal.value*e;return document.body.style.zoom=e,document.body.style.margin="0px",{chartHeight:r,chartWidth:o}}),parseFloat(n.scale)):await r.evaluate((()=>{const{chartHeight:e,chartWidth:t}=window.Highcharts.charts[0];return document.body.style.zoom=1,{chartHeight:e,chartWidth:t}})),p=Math.abs(Math.ceil(c.chartHeight||n.height)),h=Math.abs(Math.ceil(c.chartWidth||n.width)),{x:u,y:d}=await(e=>e.$eval("#chart-container",(e=>{const{x:t,y:r,width:o,height:i}=e.getBoundingClientRect();return{x:t,y:r,width:o,height:Math.trunc(i>1?i:500)}})))(r);let g;if(await r.setViewport({height:p,width:h,deviceScaleFactor:l?1:parseFloat(n.scale)}),"svg"===n.type)g=await(e=>e.$eval("#container svg:first-of-type",(e=>e.outerHTML)))(r);else if(["png","jpeg"].includes(n.type))g=await((e,t,r,o,i)=>Promise.race([e.screenshot({type:t,encoding:r,clip:o,captureBeyondViewport:!0,fullPage:!1,optimizeForSpeed:!0,..."png"!==t?{quality:80}:{},omitBackground:"png"==t}),new Promise(((e,t)=>setTimeout((()=>t(new re("Rasterization timeout"))),i||1500)))]))(r,n.type,"base64",{width:h,height:p,x:u,y:d},n.rasterizationTimeout);else{if("pdf"!==n.type)throw new re(`[export] Unsupported output format ${n.type}.`);g=await(async(e,t,r,o,i)=>(await e.emulateMediaType("screen"),e.pdf({height:t+1,width:r,encoding:o,timeout:i||1500})))(r,p,h,"base64",n.rasterizationTimeout)}return await me(r,s),g}catch(e){return await me(r,s),e}};let be=!1;const we={performedExports:0,exportAttempts:0,exportFromSvgAttempts:0,timeSpent:0,droppedExports:0,spentAverage:0};let Ee={};const Te={create:async()=>{let e=!1;const t=p.v4(),r=(new Date).getTime();try{if(e=await ge(),!e||e.isClosed())throw new re("The page is invalid or closed.");H(3,`[pool] Successfully created a worker ${t} - took ${(new Date).getTime()-r} ms.`)}catch(e){throw new re("Error encountered when creating a new page.").setError(e)}return{id:t,page:e,workCount:Math.round(Math.random()*(Ee.workLimit/2))}},validate:async e=>!(!e.page||e.page?.isClosed())&&(!(Ee.workLimit&&++e.workCount>Ee.workLimit)||(H(3,`[pool] Worker failed validation: exceeded work limit (limit is ${Ee.workLimit}).`),!1)),destroy:async e=>{H(3,`[pool] Destroying pool entry ${e.id}.`),e.page&&!e.page.isClosed()&&await e.page.close()}},Se=async e=>{if(Ee=e&&e.pool?{...e.pool}:{},await async function(e){const{debug:t,other:r}=J(),{enable:o,...i}=t,s={headless:!r.browserShellMode||"shell",userDataDir:"./tmp/",args:e,handleSIGINT:!1,handleSIGTERM:!1,handleSIGHUP:!1,waitForInitialPage:!1,defaultViewport:null,...o&&i};if(!de){let e=0;const t=async()=>{try{H(3,`[browser] Attempting to get a browser instance (try ${++e}).`),de=await h.launch(s)}catch(r){if($(1,r,"[browser] Failed to launch a browser instance."),!(e<25))throw r;H(3,`[browser] Retry to open a browser (${e} out of 25).`),await new Promise((e=>setTimeout(e,4e3))),await t()}};try{await t(),"shell"===s.headless&&H(3,"[browser] Launched browser in shell mode."),o&&H(3,"[browser] Launched browser in debug mode.")}catch(e){throw new re("[browser] Maximum retries to open a browser instance reached.").setError(e)}if(!de)throw new re("[browser] Cannot find a browser to open.")}return de}(e.puppeteerArgs),H(3,`[pool] Initializing pool with workers: min ${Ee.minWorkers}, max ${Ee.maxWorkers}.`),be)return H(4,"[pool] Already initialized, please kill it before creating a new one.");parseInt(Ee.minWorkers)>parseInt(Ee.maxWorkers)&&(Ee.minWorkers=Ee.maxWorkers);try{be=new c.Pool({...Te,min:parseInt(Ee.minWorkers),max:parseInt(Ee.maxWorkers),acquireTimeoutMillis:Ee.acquireTimeout,createTimeoutMillis:Ee.createTimeout,destroyTimeoutMillis:Ee.destroyTimeout,idleTimeoutMillis:Ee.idleTimeout,createRetryIntervalMillis:Ee.createRetryInterval,reapIntervalMillis:Ee.reaperInterval,propagateCreateError:!1}),be.on("release",(async e=>{const t=await async function(e,t=!1){try{if(e&&!e.isClosed())return t?(await e.goto("about:blank",{waitUntil:"domcontentloaded"}),await fe(e)):await e.evaluate((()=>{document.body.innerHTML='<div id="chart-container"><div id="container"></div></div>'})),!0}catch(e){$(2,e,"[browser] Could not clear the content of the page.")}return!1}(e.page,!1);H(4,`[pool] Releasing a worker with ID ${e.id}. Clear page status: ${t}.`)})),be.on("destroySuccess",((e,t)=>{H(4,`[pool] Destroyed a worker with ID ${t.id}.`),t.page=null}));const e=[];for(let t=0;t<Ee.minWorkers;t++)try{const t=await be.acquire().promise;e.push(t)}catch(e){$(2,e,"[pool] Could not create an initial resource.")}e.forEach((e=>{be.release(e)})),H(3,"[pool] The pool is ready"+(e.length?` with ${e.length} initial resources waiting.`:"."))}catch(e){throw new re("[pool] Could not create the pool of workers.").setError(e)}};async function xe(){if(H(3,"[pool] Killing pool with all workers and closing browser."),be){for(const e of be.used)be.release(e.resource);be.destroyed||(await be.destroy(),H(4,"[browser] Destroyed the pool of resources."))}await async function(){de?.connected&&await de.close(),H(4,"[browser] Closed the browser.")}()}const Re=async(e,t)=>{let r;try{if(H(4,"[pool] Work received, starting to process."),++we.exportAttempts,Ee.benchmarking&&_e(),!be)throw new re("Work received, but pool has not been started.");const o=z();try{H(4,"[pool] Acquiring a worker handle."),r=await be.acquire().promise,t.server.benchmarking&&H(5,t.payload?.requestId?`[benchmark] Request with ID ${t.payload?.requestId} -`:"[benchmark]",`Acquired a worker handle: ${o()}ms.`)}catch(e){throw new re((t.payload?.requestId?`For request with ID ${t.payload?.requestId} - `:"")+`Error encountered when acquiring an available entry: ${o()}ms.`).setError(e)}if(H(4,"[pool] Acquired a worker handle."),!r.page)throw new re("Resolved worker page is invalid: the pool setup is wonky.");let i=(new Date).getTime();H(4,`[pool] Starting work on pool entry with ID ${r.id}.`);const s=z(),n=await ye(r.page,e,t);if(n instanceof Error)throw"Rasterization timeout"===n.message&&(r.workCount=Ee.workLimit+1,r.page=null),"TimeoutError"===n.name||"Rasterization timeout"===n.message?new re("Rasterization timeout: your chart may be too complex or large, and failed to render within the allotted time.").setError(n):new re((t.payload?.requestId?`For request with ID ${t.payload?.requestId} - `:"")+`Error encountered during export: ${s()}ms.`).setError(n);t.server.benchmarking&&H(5,t.payload?.requestId?`[benchmark] Request with ID ${t.payload?.requestId} -`:"[benchmark]",`Exported a chart sucessfully: ${s()}ms.`),be.release(r);const a=(new Date).getTime()-i;return we.timeSpent+=a,we.spentAverage=we.timeSpent/++we.performedExports,H(4,`[pool] Work completed in ${a} ms.`),{result:n,options:t}}catch(e){throw++we.droppedExports,r&&be.release(r),new re(`[pool] In pool.postWork: ${e.message}`).setError(e)}},Oe=()=>({min:be.min,max:be.max,all:be.numFree()+be.numUsed(),available:be.numFree(),used:be.numUsed(),pending:be.numPendingAcquires()});function _e(){const{min:e,max:t,all:r,available:o,used:i,pending:s}=Oe();H(5,`[pool] The minimum number of resources allowed by pool: ${e}.`),H(5,`[pool] The maximum number of resources allowed by pool: ${t}.`),H(5,`[pool] The number of all created resources: ${r}.`),H(5,`[pool] The number of available resources: ${o}.`),H(5,`[pool] The number of acquired resources: ${i}.`),H(5,`[pool] The number of resources waiting to be acquired: ${s}.`)}var Le=Oe,ke=()=>we;let Ie=!1;const Ce=async(t,r)=>{H(4,"[chart] Starting the exporting process.");const o=((e,t={})=>{let r={};return e.svg?(r=V(t),r.export.type=e.type||e.export.type,r.export.scale=e.scale||e.export.scale,r.export.outfile=e.outfile||e.export.outfile,r.payload={svg:e.svg}):r=Y(t,e,T),r.export.outfile=r.export?.outfile||`chart.${r.export?.type||"png"}`,r})(t,J()),i=o.export;if(o.payload?.svg&&""!==o.payload.svg)try{H(4,"[chart] Attempting to export from a SVG input.");const e=He(function(e){const t=new u.JSDOM("").window;return d(t).sanitize(e,{ADD_TAGS:["foreignObject"],FORBID_ATTR:["xlink:href"]})}(o.payload.svg),o,r);return++we.exportFromSvgAttempts,e}catch(e){return r(new re("[chart] Error loading SVG input.").setError(e))}if(i.infile&&i.infile.length)try{return H(4,"[chart] Attempting to export from an input file."),o.export.instr=e.readFileSync(i.infile,"utf8"),He(o.export.instr.trim(),o,r)}catch(e){return r(new re("[chart] Error loading input file.").setError(e))}if(i.instr&&""!==i.instr||i.options&&""!==i.options)try{return H(4,"[chart] Attempting to export from a raw input."),B(o.customLogic?.allowCodeExecution)?Pe(o,r):"string"==typeof i.instr?He(i.instr.trim(),o,r):Ae(o,i.instr||i.options,r)}catch(e){return r(new re("[chart] Error loading raw input.").setError(e))}return r(new re("[chart] No valid input specified. Check if at least one of the following parameters is correctly set: 'infile', 'instr', 'options', or 'svg'."))},Ne=e=>{const{chart:t,exporting:r}=e.export?.options||M(e.export?.instr),o=M(e.export?.globalOptions);let i=e.export?.scale||r?.scale||o?.exporting?.scale||e.export?.defaultScale||1;i=Math.max(.1,Math.min(i,5)),i=((e,t=1)=>{const r=Math.pow(10,t||0);return Math.round(+e*r)/r})(i,2);const s={height:e.export?.height||r?.sourceHeight||t?.height||o?.exporting?.sourceHeight||o?.chart?.height||e.export?.defaultHeight||400,width:e.export?.width||r?.sourceWidth||t?.width||o?.exporting?.sourceWidth||o?.chart?.width||e.export?.defaultWidth||600,scale:i};for(let[e,t]of Object.entries(s))s[e]="string"==typeof t?+t.replace(/px|%/gi,""):t;return s},Ae=async(t,r,o,i)=>{let{export:s,customLogic:n}=t;const a="boolean"==typeof n.allowCodeExecution?n.allowCodeExecution:Ie;if(n){if(a)if("string"==typeof t.customLogic.resources)t.customLogic.resources=j(t.customLogic.resources,B(t.customLogic.allowFileResources));else if(!t.customLogic.resources)try{const r=e.readFileSync("resources.json","utf8");t.customLogic.resources=j(r,B(t.customLogic.allowFileResources))}catch(e){$(2,e,"[chart] Unable to load the default resources.json file.")}}else n=t.customLogic={};if(!a&&n){if(n.callback||n.resources||n.customCode)return o(new re("[chart] The 'callback', 'resources' and 'customCode' options have been disabled for this server."));n.callback=!1,n.resources=!1,n.customCode=!1}if(r&&(r.chart=r.chart||{},r.exporting=r.exporting||{},r.exporting.enabled=!1),s.constr=s.constr||"chart",s.type=F(s.type,s.outfile),"svg"===s.type&&(s.width=!1),["globalOptions","themeOptions"].forEach((t=>{try{s&&s[t]&&("string"==typeof s[t]&&s[t].endsWith(".json")?s[t]=M(e.readFileSync(s[t],"utf8"),!0):s[t]=M(s[t],!0))}catch(e){s[t]={},$(2,e,`[chart] The '${t}' cannot be loaded.`)}})),n.allowCodeExecution)try{n.customCode=X(n.customCode,n.allowFileResources)}catch(e){$(2,e,"[chart] The 'customCode' cannot be loaded.")}if(n&&n.callback&&n.callback?.indexOf("{")<0)if(n.allowFileResources)try{n.callback=e.readFileSync(n.callback,"utf8")}catch(e){n.callback=!1,$(2,e,"[chart] The 'callback' cannot be loaded.")}else n.callback=!1;t.export={...t.export,...Ne(t)};try{return o(!1,await Re(s.strInj||r||i,t))}catch(e){return o(e)}},Pe=(e,t)=>{try{let r,o=e.export.instr||e.export.options;return"string"!=typeof o&&(r=o=W(o,e.customLogic?.allowCodeExecution)),r=o.replaceAll(/\t|\n|\r/g,"").trim(),";"===r[r.length-1]&&(r=r.substring(0,r.length-1)),e.export.strInj=r,Ae(e,!1,t)}catch(r){return t(new re(`[chart] Malformed input detected for ${e.export?.requestId||"?"}. Please make sure that your JSON/JavaScript options are sent using the "options" attribute, and that if you're using SVG, it is unescaped.`).setError(r))}},He=(e,t,r)=>{const{allowCodeExecution:o}=t.customLogic;if(e.indexOf("<svg")>=0||e.indexOf("<?xml")>=0)return H(4,"[chart] Parsing input as SVG."),Ae(t,!1,r,e);try{const o=JSON.parse(e.replaceAll(/\t|\n|\r/g," "));return Ae(t,o,r)}catch(e){return B(o)?Pe(t,r):r(new re("[chart] Only JSON configurations and SVG are allowed for this server. If this is your server, JavaScript custom code can be enabled by starting the server with the --allowCodeExecution flag.").setError(e))}},$e=[],De=()=>{H(4,"[server] Clearing all registered intervals.");for(const e of $e)clearInterval(e)},Ue=(e,t,r,o)=>{$(1,e),"development"!==C.OTHER_NODE_ENV&&delete e.stack,o(e)},Ge=(e,t,r,o)=>{const{statusCode:i,status:s,message:n,stack:a}=e,l=i||s||400;r.status(l).json({statusCode:l,message:n,stack:a})};var Fe=(e,t)=>{const r="Too many requests, you have been rate limited. Please try again later.",o={max:t.maxRequests||30,window:t.window||1,delay:t.delay||0,trustProxy:t.trustProxy||!1,skipKey:t.skipKey||!1,skipToken:t.skipToken||!1};o.trustProxy&&e.enable("trust proxy");const i=v({windowMs:60*o.window*1e3,max:o.max,delayMs:o.delay,handler:(e,t)=>{t.format({json:()=>{t.status(429).send({message:r})},default:()=>{t.status(429).send(r)}})},skip:e=>!1!==o.skipKey&&!1!==o.skipToken&&e.query.key===o.skipKey&&e.query.access_token===o.skipToken&&(H(4,"[rate limiting] Skipping rate limiter."),!0)});e.use(i),H(3,`[rate limiting] Enabled rate limiting with ${o.max} requests per ${o.window} minute for each IP, trusting proxy: ${o.trustProxy}.`)};class je extends re{constructor(e,t){super(e),this.status=this.statusCode=t}setStatus(e){return this.status=e,this}}var Me=e=>!!e&&e.post("/version/change/:newVersion",(async(e,t,r)=>{try{const r=C.HIGHCHARTS_ADMIN_TOKEN;if(!r||!r.length)throw new je("The server is not configured to perform run-time version changes: HIGHCHARTS_ADMIN_TOKEN is not set.",401);const o=e.get("hc-auth");if(!o||o!==r)throw new je("Invalid or missing token: Set the token in the hc-auth header.",401);const i=e.params.newVersion;if(!i)throw new je("No new version supplied.",400);try{await(async e=>{const t=J();t?.highcharts&&(t.highcharts.version=e),await ae(t)})(i)}catch(e){throw new je(`Version change: ${e.message}`,e.statusCode).setError(e)}t.status(200).send({statusCode:200,version:ce(),message:`Successfully updated Highcharts to version: ${i}.`})}catch(e){r(e)}}));const Ve={png:"image/png",jpeg:"image/jpeg",gif:"image/gif",pdf:"application/pdf",svg:"image/svg+xml"};let We=0;const qe=[],Be=[],Xe=(e,t,r,o)=>{let i=!0;const{id:s,uniqueId:n,type:a,body:l}=o;return e.some((e=>{if(e){let o=e(t,r,s,n,a,l);return void 0!==o&&!0!==o&&(i=o),!0}})),i},ze=async(e,t,r)=>{try{const r=z(),i=p.v4().replace(/-/g,""),s=J(),n=e.body,a=++We;let l=F(n.type);if(!n||"object"==typeof(o=n)&&!Array.isArray(o)&&null!==o&&0===Object.keys(o).length)throw new je("The request body is required. Please ensure that your Content-Type header is correct (accepted types are application/json and multipart/form-data).",400);let c=M(n.infile||n.options||n.data);if(!c&&!n.svg)throw H(2,`The request with ID ${i} from ${e.headers["x-forwarded-for"]||e.connection.remoteAddress} was incorrect:\n Content-Type: ${e.headers["content-type"]}. \n Chart constructor: ${n.constr}.\n Dimensions: ${n.width}x${n.height} @ ${n.scale} scale.\n Type: ${l}.\n Is SVG set? ${void 0!==n.svg}.\n B64? ${void 0!==n.b64}.\n No download? ${void 0!==n.noDownload}.\n\n Payload received: ${JSON.stringify(n.infile||n.options||n.data||n.svg)}\n\n `),new je("No correct chart data found. Ensure that you are using either application/json or multipart/form-data headers. If sending JSON, make sure the chart data is in the 'infile', 'options', or 'data' attribute. If sending SVG, ensure it is in the 'svg' attribute.",400);let h=!1;if(h=Xe(qe,e,t,{id:a,uniqueId:i,type:l,body:n}),!0!==h)return t.send(h);let u=!1;e.socket.on("close",(e=>{e&&(u=!0)})),H(4,`[export] Got an incoming HTTP request with ID ${i}.`),n.constr="string"==typeof n.constr&&n.constr||"chart";const d={export:{instr:c,type:l,constr:n.constr[0].toLowerCase()+n.constr.substr(1),height:n.height,width:n.width,scale:n.scale||s.export.scale,globalOptions:M(n.globalOptions,!0),themeOptions:M(n.themeOptions,!0)},customLogic:{allowCodeExecution:Ie,allowFileResources:!1,resources:M(n.resources,!0),callback:n.callback,customCode:n.customCode}};c&&(d.export.instr=W(c,d.customLogic.allowCodeExecution));const g=Y(s,d);if(g.export.options=c,g.payload={svg:n.svg||!1,b64:n.b64||!1,noDownload:n.noDownload||!1,requestId:i},n.svg&&(e=>[/xlink:href="(?:http:\/\/|https:\/\/)?localhost\b/,/xlink:href="(?:http:\/\/|https:\/\/)?10\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/,/xlink:href="(?:http:\/\/|https:\/\/)?127\.\d{1,3}\.\d{1,3}\.\d{1,3}\b/,/xlink:href="(?:http:\/\/|https:\/\/)?172\.(1[6-9]|2[0-9]|3[0-1])\.\d{1,3}\.\d{1,3}\b/,/xlink:href="(?:http:\/\/|https:\/\/)?192\.168\.\d{1,3}\.\d{1,3}\b/].some((t=>t.test(e))))(g.payload.svg))throw new je("SVG potentially contain at least one forbidden URL in xlink:href element. Please review the SVG content and ensure that all referenced URLs comply with security policies.",400);await Ce(g,((o,c)=>{if(e.socket.removeAllListeners("close"),s.server.benchmarking&&H(5,`[benchmark] Request with ID ${i} - After the whole exporting process: ${r()}ms.`),u)return H(3,"[export] The client closed the connection before the chart finished processing.");if(o)throw o;if(!c||!c.result)throw new je(`Unexpected return from chart generation. Please check your request data. For the request with ID ${i}, the result is ${c.result}.`,400);return l=c.options.export.type,Xe(Be,e,t,{id:a,body:c.result}),c.result?n.b64?"pdf"===l||"svg"==l?t.send(Buffer.from(c.result,"utf8").toString("base64")):t.send(c.result):(t.header("Content-Type",Ve[l]||"image/png"),n.noDownload||t.attachment(`${e.params.filename||e.body.filename||"chart"}.${l||"png"}`),"svg"===l?t.send(c.result):t.send(Buffer.from(c.result,"base64"))):void 0}))}catch(e){r(e)}var o};const Ke=JSON.parse(e.readFileSync(t.join(G,"package.json"))),Je=new Date,Ye=[];function Ze(e){if(!e)return!1;var t;t=setInterval((()=>{const e=ke(),t=0===e.exportAttempts?1:e.performedExports/e.exportAttempts*100;Ye.push(t),Ye.length>30&&Ye.shift()}),6e4),$e.push(t),e.get("/health",((e,t)=>{const r=ke(),o=Ye.length,i=Ye.reduce(((e,t)=>e+t),0)/Ye.length;H(4,"[health.js] GET /health [200] - returning server health."),t.send({status:"OK",bootTime:Je,uptime:Math.floor(((new Date).getTime()-Je.getTime())/1e3/60)+" minutes",version:Ke.version,highchartsVersion:ce(),averageProcessingTime:r.spentAverage,performedExports:r.performedExports,failedExports:r.droppedExports,exportAttempts:r.exportAttempts,sucessRatio:r.performedExports/r.exportAttempts*100,pool:Le(),period:o,movingAverage:i,message:isNaN(i)||!Ye.length?"Too early to report. No exports made yet. Please check back soon.":`Last ${o} minutes had a success rate of ${i.toFixed(2)}%.`,svgExportAttempts:r.exportFromSvgAttempts,jsonExportAttempts:r.performedExports-r.exportFromSvgAttempts})}))}const Qe=new Map,et=m();et.disable("x-powered-by"),et.use(g()),et.use(((e,t,r)=>{t.set("Accept-Ranges","none"),r()}));const tt=e=>{e.on("clientError",((e,t)=>{$(1,e,`[server] Client error: ${e.message}, destroying socket.`),t.destroy()})),e.on("error",(e=>{$(1,e,`[server] Server error: ${e.message}`)})),e.on("connection",(e=>{e.on("error",(e=>{$(1,e,`[server] Socket error: ${e.message}`)}))}))},rt=async r=>{try{const o=1024*(r.maxUploadSize||3)*1024,i=f.memoryStorage(),s=f({storage:i,limits:{fieldSize:o}});if(et.use(m.json({limit:o})),et.use(m.urlencoded({extended:!0,limit:o})),et.use(s.none()),!r.enable)return!1;if(!r.ssl.force){const e=a.createServer(et);tt(e),e.listen(r.port,r.host),Qe.set(r.port,e),H(3,`[server] Started HTTP server on ${r.host}:${r.port}.`)}if(r.ssl.enable){let o,i;try{o=await e.promises.readFile(t.posix.join(r.ssl.certPath,"server.key"),"utf8"),i=await e.promises.readFile(t.posix.join(r.ssl.certPath,"server.crt"),"utf8")}catch(e){H(2,`[server] Unable to load key/certificate from the '${r.ssl.certPath}' path. Could not run secured layer server.`)}if(o&&i){const e=l.createServer({key:o,cert:i},et);tt(e),e.listen(r.ssl.port,r.host),Qe.set(r.ssl.port,e),H(3,`[server] Started HTTPS server on ${r.host}:${r.ssl.port}.`)}}r.rateLimiting&&r.rateLimiting.enable&&![0,NaN].includes(r.rateLimiting.maxRequests)&&Fe(et,r.rateLimiting),et.use(m.static(t.posix.join(G,"public"))),Ze(et),(e=>{e.post("/",ze),e.post("/:filename",ze)})(et),(e=>{!!e&&e.get("/",((e,r)=>{r.sendFile(t.join(G,"public","index.html"),{acceptRanges:!1})}))})(et),Me(et),(e=>{e.use(Ue),e.use(Ge)})(et)}catch(e){throw new re("[server] Could not configure and start the server.").setError(e)}},ot=()=>{H(4,"[server] Closing all servers.");for(const[e,t]of Qe)t.close((()=>{Qe.delete(e),H(4,`[server] Closed server on port: ${e}.`)}))};var it={startServer:rt,closeServers:ot,getServers:()=>Qe,enableRateLimiting:e=>Fe(et,e),getExpress:()=>m,getApp:()=>et,use:(e,...t)=>{et.use(e,...t)},get:(e,...t)=>{et.get(e,...t)},post:(e,...t)=>{et.post(e,...t)}};const st=async e=>{await Promise.allSettled([De(),ot(),xe()]),process.exit(e)};var nt={server:it,startServer:rt,initExport:async e=>{var t;return t=e.customLogic&&e.customLogic.allowCodeExecution,Ie=B(t),(e=>{for(const[t,r]of Object.entries(e))A[t]=r;D(e&&parseInt(e.level)),e&&e.dest&&e.toFile&&U(e.dest,e.file||"highcharts-export-server.log")})(e.logging),e.other.listenToProcessExits&&(H(3,"[process] Attaching exit listeners to the process."),process.on("exit",(e=>{H(4,`Process exited with code ${e}.`)})),process.on("SIGINT",(async(e,t)=>{H(4,`The ${e} event with code: ${t}.`),await st(0)})),process.on("SIGTERM",(async(e,t)=>{H(4,`The ${e} event with code: ${t}.`),await st(0)})),process.on("SIGHUP",(async(e,t)=>{H(4,`The ${e} event with code: ${t}.`),await st(0)})),process.on("uncaughtException",(async(e,t)=>{$(1,e,`The ${t} error.`),await st(1)}))),await ae(e),await Se({pool:e.pool||{minWorkers:1,maxWorkers:1},puppeteerArgs:e.puppeteer.args||[]}),e},singleExport:async t=>{t.export.instr=t.export.instr||t.export.options,await Ce(t,(async(t,r)=>{if(t)throw t;const{outfile:o,type:i}=r.options.export;e.writeFileSync(o||`chart.${i}`,"svg"!==i?Buffer.from(r.result,"base64"):r.result),await xe()}))},batchExport:async t=>{const r=[];for(let o of t.export.batch.split(";"))o=o.split("="),2===o.length&&r.push(Ce({...t,export:{...t.export,infile:o[0],outfile:o[1]}},((t,r)=>{if(t)throw t;e.writeFileSync(r.options.export.outfile,"svg"!==r.options.export.type?Buffer.from(r.result,"base64"):r.result)})));try{await Promise.all(r),await xe()}catch(e){throw new re("[chart] Error encountered during batch export.").setError(e)}},startExport:Ce,initPool:Se,killPool:xe,setOptions:(t,r)=>(r?.length&&(K=function(t){const r=t.findIndex((e=>"loadConfig"===e.replace(/-/g,"")));if(r>-1&&t[r+1]){const o=t[r+1];try{if(o&&o.endsWith(".json"))return JSON.parse(e.readFileSync(o))}catch(e){$(2,e,`[config] Unable to load the configuration from the ${o} file.`)}}return{}}(r)),Z(w,K),K=Q(w),t&&(K=Y(K,t,T)),r?.length&&(K=function(e,t,r){let o=!1;for(let i=0;i<t.length;i++){const s=t[i].replace(/-/g,""),n=S[s]?S[s].split("."):[];let a;n.reduce(((e,t,r)=>(n.length-1===r&&(a=e[t].type),e[t])),r),n.reduce(((e,r,l)=>(n.length-1===l&&void 0!==e[r]&&(t[++i]?"boolean"===a?e[r]=B(t[i]):"number"===a?e[r]=+t[i]:a.indexOf("]")>=0?e[r]=t[i].split(","):e[r]=t[i]:(H(2,`[config] Missing value for the '${s}' argument. Using the default value.`),o=!0)),e[r])),e)}o&&q();return e}(K,r,w)),K),shutdownCleanUp:st,log:H,logWithStack:$,setLogLevel:D,enableFileLogging:U,mapToNewConfig:e=>{const t={};for(const[r,o]of Object.entries(e)){const e=S[r]?S[r].split("."):[];e.reduce(((t,r,i)=>t[r]=e.length-1===i?o:t[r]||{}),t)}return t},manualConfig:async t=>{let r={};e.existsSync(t)&&(r=JSON.parse(e.readFileSync(t,"utf8")));const i=Object.keys(E).map((e=>({title:`${e} options`,value:e})));return o({type:"multiselect",name:"category",message:"Which category do you want to configure?",hint:"Space: Select specific, A: Select all, Enter: Confirm.",instructions:"",choices:i},{onSubmit:async(i,s)=>{let n=0,a=[];for(const e of s)E[e]=E[e].map((t=>({...t,section:e}))),a=[...a,...E[e]];return await o(a,{onSubmit:async(o,i)=>{if("moduleScripts"===o.name?(i=i.length?i.map((e=>o.choices[e])):o.choices,r[o.section][o.name]=i):r[o.section]=ee(Object.assign({},r[o.section]||{}),o.name.split("."),o.choices?o.choices[i]:i),++n===a.length){try{await e.promises.writeFile(t,JSON.stringify(r,null,2),"utf8")}catch(e){$(1,e,`[config] An error occurred while creating the ${t} file.`)}return!0}}}),!0}})},printLogo:r=>{const o=JSON.parse(e.readFileSync(t.join(G,"package.json"))).version;r?console.log(`Starting Highcharts Export Server v${o}...`):console.log(e.readFileSync(G+"/msg/startup.msg").toString().bold.yellow,`v${o}\n`.bold)},printUsage:q};module.exports=nt;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguY2pzIiwic291cmNlcyI6WyIuLi9saWIvc2NoZW1hcy9jb25maWcuanMiLCIuLi9saWIvZW52cy5qcyIsIi4uL2xpYi9sb2dnZXIuanMiLCIuLi9saWIvdXRpbHMuanMiLCIuLi9saWIvY29uZmlnLmpzIiwiLi4vbGliL2ZldGNoLmpzIiwiLi4vbGliL2Vycm9ycy9FeHBvcnRFcnJvci5qcyIsIi4uL2xpYi9jYWNoZS5qcyIsIi4uL2xpYi9oaWdoY2hhcnRzLmpzIiwiLi4vbGliL2Jyb3dzZXIuanMiLCIuLi9saWIvZXhwb3J0LmpzIiwiLi4vdGVtcGxhdGVzL3N2Z19leHBvcnQvc3ZnX2V4cG9ydC5qcyIsIi4uL2xpYi9wb29sLmpzIiwiLi4vbGliL2NoYXJ0LmpzIiwiLi4vbGliL3Nhbml0aXplLmpzIiwiLi4vbGliL2ludGVydmFscy5qcyIsIi4uL2xpYi9zZXJ2ZXIvZXJyb3IuanMiLCIuLi9saWIvc2VydmVyL3JhdGVfbGltaXQuanMiLCIuLi9saWIvZXJyb3JzL0h0dHBFcnJvci5qcyIsIi4uL2xpYi9zZXJ2ZXIvcm91dGVzL2NoYW5nZV9oY192ZXJzaW9uLmpzIiwiLi4vbGliL3NlcnZlci9yb3V0ZXMvZXhwb3J0LmpzIiwiLi4vbGliL3NlcnZlci9yb3V0ZXMvaGVhbHRoLmpzIiwiLi4vbGliL3NlcnZlci9zZXJ2ZXIuanMiLCIuLi9saWIvc2VydmVyL3JvdXRlcy91aS5qcyIsIi4uL2xpYi9yZXNvdXJjZV9yZWxlYXNlLmpzIiwiLi4vbGliL2luZGV4LmpzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbkhpZ2hjaGFydHMgRXhwb3J0IFNlcnZlclxuXG5Db3B5cmlnaHQgKGMpIDIwMTYtMjAyNCwgSGlnaHNvZnRcblxuTGljZW5jZWQgdW5kZXIgdGhlIE1JVCBsaWNlbmNlLlxuXG5BZGRpdGlvbmFsbHkgYSB2YWxpZCBIaWdoY2hhcnRzIGxpY2Vuc2UgaXMgcmVxdWlyZWQgZm9yIHVzZS5cblxuU2VlIExJQ0VOU0UgZmlsZSBpbiByb290IGZvciBkZXRhaWxzLlxuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vLyBQb3NzaWJsZSBuYW1lcyBmb3IgSGlnaGNoYXJ0cyBzY3JpcHRzXG5leHBvcnQgY29uc3Qgc2NyaXB0c05hbWVzID0ge1xuICBjb3JlOiBbJ2hpZ2hjaGFydHMnLCAnaGlnaGNoYXJ0cy1tb3JlJywgJ2hpZ2hjaGFydHMtM2QnXSxcbiAgbW9kdWxlczogW1xuICAgICdzdG9jaycsXG4gICAgJ21hcCcsXG4gICAgJ2dhbnR0JyxcbiAgICAnZXhwb3J0aW5nJyxcbiAgICAncGFyYWxsZWwtY29vcmRpbmF0ZXMnLFxuICAgICdhY2Nlc3NpYmlsaXR5JyxcbiAgICAvLyAnYW5ub3RhdGlvbnMtYWR2YW5jZWQnLFxuICAgICdib29zdC1jYW52YXMnLFxuICAgICdib29zdCcsXG4gICAgJ2RhdGEnLFxuICAgICdkYXRhLXRvb2xzJyxcbiAgICAnZHJhZ2dhYmxlLXBvaW50cycsXG4gICAgJ3N0YXRpYy1zY2FsZScsXG4gICAgJ2Jyb2tlbi1heGlzJyxcbiAgICAnaGVhdG1hcCcsXG4gICAgJ3RpbGVtYXAnLFxuICAgICd0aWxlZHdlYm1hcCcsXG4gICAgJ3RpbWVsaW5lJyxcbiAgICAndHJlZW1hcCcsXG4gICAgJ3RyZWVncmFwaCcsXG4gICAgJ2l0ZW0tc2VyaWVzJyxcbiAgICAnZHJpbGxkb3duJyxcbiAgICAnaGlzdG9ncmFtLWJlbGxjdXJ2ZScsXG4gICAgJ2J1bGxldCcsXG4gICAgJ2Z1bm5lbCcsXG4gICAgJ2Z1bm5lbDNkJyxcbiAgICAnZ2VvaGVhdG1hcCcsXG4gICAgJ3B5cmFtaWQzZCcsXG4gICAgJ25ldHdvcmtncmFwaCcsXG4gICAgJ292ZXJsYXBwaW5nLWRhdGFsYWJlbHMnLFxuICAgICdwYXJldG8nLFxuICAgICdwYXR0ZXJuLWZpbGwnLFxuICAgICdwaWN0b3JpYWwnLFxuICAgICdwcmljZS1pbmRpY2F0b3InLFxuICAgICdzYW5rZXknLFxuICAgICdhcmMtZGlhZ3JhbScsXG4gICAgJ2RlcGVuZGVuY3ktd2hlZWwnLFxuICAgICdzZXJpZXMtbGFiZWwnLFxuICAgICdzZXJpZXMtb24tcG9pbnQnLFxuICAgICdzb2xpZC1nYXVnZScsXG4gICAgJ3NvbmlmaWNhdGlvbicsXG4gICAgLy8gJ3N0b2NrLXRvb2xzJyxcbiAgICAnc3RyZWFtZ3JhcGgnLFxuICAgICdzdW5idXJzdCcsXG4gICAgJ3ZhcmlhYmxlLXBpZScsXG4gICAgJ3Zhcml3aWRlJyxcbiAgICAndmVjdG9yJyxcbiAgICAndmVubicsXG4gICAgJ3dpbmRiYXJiJyxcbiAgICAnd29yZGNsb3VkJyxcbiAgICAneHJhbmdlJyxcbiAgICAnbm8tZGF0YS10by1kaXNwbGF5JyxcbiAgICAnZHJhZy1wYW5lcycsXG4gICAgJ2RlYnVnZ2VyJyxcbiAgICAnZHVtYmJlbGwnLFxuICAgICdsb2xsaXBvcCcsXG4gICAgJ2N5bGluZGVyJyxcbiAgICAnb3JnYW5pemF0aW9uJyxcbiAgICAnZG90cGxvdCcsXG4gICAgJ21hcmtlci1jbHVzdGVycycsXG4gICAgJ2hvbGxvd2NhbmRsZXN0aWNrJyxcbiAgICAnaGVpa2luYXNoaScsXG4gICAgJ2Zsb3dtYXAnLFxuICAgICdleHBvcnQtZGF0YScsXG4gICAgJ25hdmlnYXRvcicsXG4gICAgJ3RleHRwYXRoJ1xuICBdLFxuICBpbmRpY2F0b3JzOiBbJ2luZGljYXRvcnMtYWxsJ10sXG4gIGN1c3RvbTogW1xuICAgICdodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9tb21lbnQuanMvMi4zMC4xL21vbWVudC5taW4uanMnLFxuICAgICdodHRwczovL2NkbmpzLmNsb3VkZmxhcmUuY29tL2FqYXgvbGlicy9tb21lbnQtdGltZXpvbmUvMC41LjQ1L21vbWVudC10aW1lem9uZS13aXRoLWRhdGEubWluLmpzJ1xuICBdXG59O1xuXG4vLyBUaGlzIGlzIHRoZSBjb25maWd1cmF0aW9uIG9iamVjdCB3aXRoIGFsbCBvcHRpb25zIGFuZCB0aGVpciBkZWZhdWx0IHZhbHVlcyxcbi8vIGFsc28gZnJvbSB0aGUgLmVudiBmaWxlIGlmIG9uZSBleGlzdHNcbmV4cG9ydCBjb25zdCBkZWZhdWx0Q29uZmlnID0ge1xuICBwdXBwZXRlZXI6IHtcbiAgICBhcmdzOiB7XG4gICAgICB2YWx1ZTogW1xuICAgICAgICAnLS1hbGxvdy1ydW5uaW5nLWluc2VjdXJlLWNvbnRlbnQnLFxuICAgICAgICAnLS1hc2gtbm8tbnVkZ2VzJyxcbiAgICAgICAgJy0tYXV0b3BsYXktcG9saWN5PXVzZXItZ2VzdHVyZS1yZXF1aXJlZCcsXG4gICAgICAgICctLWJsb2NrLW5ldy13ZWItY29udGVudHMnLFxuICAgICAgICAnLS1kaXNhYmxlLWFjY2VsZXJhdGVkLTJkLWNhbnZhcycsXG4gICAgICAgICctLWRpc2FibGUtYmFja2dyb3VuZC1uZXR3b3JraW5nJyxcbiAgICAgICAgJy0tZGlzYWJsZS1iYWNrZ3JvdW5kLXRpbWVyLXRocm90dGxpbmcnLFxuICAgICAgICAnLS1kaXNhYmxlLWJhY2tncm91bmRpbmctb2NjbHVkZWQtd2luZG93cycsXG4gICAgICAgICctLWRpc2FibGUtYnJlYWtwYWQnLFxuICAgICAgICAnLS1kaXNhYmxlLWNoZWNrZXItaW1hZ2luZycsXG4gICAgICAgICctLWRpc2FibGUtY2xpZW50LXNpZGUtcGhpc2hpbmctZGV0ZWN0aW9uJyxcbiAgICAgICAgJy0tZGlzYWJsZS1jb21wb25lbnQtZXh0ZW5zaW9ucy13aXRoLWJhY2tncm91bmQtcGFnZXMnLFxuICAgICAgICAnLS1kaXNhYmxlLWNvbXBvbmVudC11cGRhdGUnLFxuICAgICAgICAnLS1kaXNhYmxlLWRlZmF1bHQtYXBwcycsXG4gICAgICAgICctLWRpc2FibGUtZGV2LXNobS11c2FnZScsXG4gICAgICAgICctLWRpc2FibGUtZG9tYWluLXJlbGlhYmlsaXR5JyxcbiAgICAgICAgJy0tZGlzYWJsZS1leHRlbnNpb25zJyxcbiAgICAgICAgJy0tZGlzYWJsZS1mZWF0dXJlcz1DYWxjdWxhdGVOYXRpdmVXaW5PY2NsdXNpb24sSW50ZXJlc3RGZWVkQ29udGVudFN1Z2dlc3Rpb25zLFdlYk9UUCcsXG4gICAgICAgICctLWRpc2FibGUtaGFuZy1tb25pdG9yJyxcbiAgICAgICAgJy0tZGlzYWJsZS1pcGMtZmxvb2RpbmctcHJvdGVjdGlvbicsXG4gICAgICAgICctLWRpc2FibGUtbG9nZ2luZycsXG4gICAgICAgICctLWRpc2FibGUtbm90aWZpY2F0aW9ucycsXG4gICAgICAgICctLWRpc2FibGUtb2ZmZXItc3RvcmUtdW5tYXNrZWQtd2FsbGV0LWNhcmRzJyxcbiAgICAgICAgJy0tZGlzYWJsZS1wb3B1cC1ibG9ja2luZycsXG4gICAgICAgICctLWRpc2FibGUtcHJpbnQtcHJldmlldycsXG4gICAgICAgICctLWRpc2FibGUtcHJvbXB0LW9uLXJlcG9zdCcsXG4gICAgICAgICctLWRpc2FibGUtcmVuZGVyZXItYmFja2dyb3VuZGluZycsXG4gICAgICAgICctLWRpc2FibGUtc2VhcmNoLWVuZ2luZS1jaG9pY2Utc2NyZWVuJyxcbiAgICAgICAgJy0tZGlzYWJsZS1zZXNzaW9uLWNyYXNoZWQtYnViYmxlJyxcbiAgICAgICAgJy0tZGlzYWJsZS1zZXR1aWQtc2FuZGJveCcsXG4gICAgICAgICctLWRpc2FibGUtc2l0ZS1pc29sYXRpb24tdHJpYWxzJyxcbiAgICAgICAgJy0tZGlzYWJsZS1zcGVlY2gtYXBpJyxcbiAgICAgICAgJy0tZGlzYWJsZS1zeW5jJyxcbiAgICAgICAgJy0tZW5hYmxlLXVuc2FmZS13ZWJncHUnLFxuICAgICAgICAnLS1oaWRlLWNyYXNoLXJlc3RvcmUtYnViYmxlJyxcbiAgICAgICAgJy0taGlkZS1zY3JvbGxiYXJzJyxcbiAgICAgICAgJy0tbWV0cmljcy1yZWNvcmRpbmctb25seScsXG4gICAgICAgICctLW11dGUtYXVkaW8nLFxuICAgICAgICAnLS1uby1kZWZhdWx0LWJyb3dzZXItY2hlY2snLFxuICAgICAgICAnLS1uby1maXJzdC1ydW4nLFxuICAgICAgICAnLS1uby1waW5ncycsXG4gICAgICAgICctLW5vLXNhbmRib3gnLFxuICAgICAgICAnLS1uby1zdGFydHVwLXdpbmRvdycsXG4gICAgICAgICctLW5vLXp5Z290ZScsXG4gICAgICAgICctLXBhc3N3b3JkLXN0b3JlPWJhc2ljJyxcbiAgICAgICAgJy0tcHJvY2Vzcy1wZXItdGFiJyxcbiAgICAgICAgJy0tdXNlLW1vY2sta2V5Y2hhaW4nXG4gICAgICBdLFxuICAgICAgdHlwZTogJ3N0cmluZ1tdJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQXJndW1lbnRzIGFycmF5IHRvIHNlbmQgdG8gUHVwcGV0ZWVyLidcbiAgICB9XG4gIH0sXG4gIGhpZ2hjaGFydHM6IHtcbiAgICB2ZXJzaW9uOiB7XG4gICAgICB2YWx1ZTogJ2xhdGVzdCcsXG4gICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgIGVudkxpbms6ICdISUdIQ0hBUlRTX1ZFUlNJT04nLFxuICAgICAgZGVzY3JpcHRpb246ICdUaGUgSGlnaGNoYXJ0cyB2ZXJzaW9uIHRvIGJlIHVzZWQuJ1xuICAgIH0sXG4gICAgY2RuVVJMOiB7XG4gICAgICB2YWx1ZTogJ2h0dHBzOi8vY29kZS5oaWdoY2hhcnRzLmNvbS8nLFxuICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICBlbnZMaW5rOiAnSElHSENIQVJUU19DRE5fVVJMJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIENETiBVUkwgZm9yIEhpZ2hjaGFydHMgc2NyaXB0cyB0byBiZSB1c2VkLidcbiAgICB9LFxuICAgIGNvcmVTY3JpcHRzOiB7XG4gICAgICB2YWx1ZTogc2NyaXB0c05hbWVzLmNvcmUsXG4gICAgICB0eXBlOiAnc3RyaW5nW10nLFxuICAgICAgZW52TGluazogJ0hJR0hDSEFSVFNfQ09SRV9TQ1JJUFRTJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGNvcmUgSGlnaGNoYXJ0cyBzY3JpcHRzIHRvIGZldGNoLidcbiAgICB9LFxuICAgIG1vZHVsZVNjcmlwdHM6IHtcbiAgICAgIHZhbHVlOiBzY3JpcHRzTmFtZXMubW9kdWxlcyxcbiAgICAgIHR5cGU6ICdzdHJpbmdbXScsXG4gICAgICBlbnZMaW5rOiAnSElHSENIQVJUU19NT0RVTEVfU0NSSVBUUycsXG4gICAgICBkZXNjcmlwdGlvbjogJ1RoZSBtb2R1bGVzIG9mIEhpZ2hjaGFydHMgdG8gZmV0Y2guJ1xuICAgIH0sXG4gICAgaW5kaWNhdG9yU2NyaXB0czoge1xuICAgICAgdmFsdWU6IHNjcmlwdHNOYW1lcy5pbmRpY2F0b3JzLFxuICAgICAgdHlwZTogJ3N0cmluZ1tdJyxcbiAgICAgIGVudkxpbms6ICdISUdIQ0hBUlRTX0lORElDQVRPUl9TQ1JJUFRTJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGluZGljYXRvcnMgb2YgSGlnaGNoYXJ0cyB0byBmZXRjaC4nXG4gICAgfSxcbiAgICBjdXN0b21TY3JpcHRzOiB7XG4gICAgICB2YWx1ZTogc2NyaXB0c05hbWVzLmN1c3RvbSxcbiAgICAgIHR5cGU6ICdzdHJpbmdbXScsXG4gICAgICBkZXNjcmlwdGlvbjogJ0FkZGl0aW9uYWwgY3VzdG9tIHNjcmlwdHMgb3IgZGVwZW5kZW5jaWVzIHRvIGZldGNoLidcbiAgICB9LFxuICAgIGZvcmNlRmV0Y2g6IHtcbiAgICAgIHZhbHVlOiBmYWxzZSxcbiAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgIGVudkxpbms6ICdISUdIQ0hBUlRTX0ZPUkNFX0ZFVENIJyxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnVGhlIGZsYWcgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdG8gcmVmZXRjaCBhbGwgc2NyaXB0cyBhZnRlciBlYWNoIHNlcnZlciByZXJ1bi4nXG4gICAgfSxcbiAgICBjYWNoZVBhdGg6IHtcbiAgICAgIHZhbHVlOiAnLmNhY2hlJyxcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgZW52TGluazogJ0hJR0hDSEFSVFNfQ0FDSEVfUEFUSCcsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ1RoZSBwYXRoIHRvIHRoZSBjYWNoZSBkaXJlY3RvcnkuIEl0IGlzIHVzZWQgdG8gc3RvcmUgdGhlIEhpZ2hjaGFydHMgc2NyaXB0cyBhbmQgY3VzdG9tIHNjcmlwdHMuJ1xuICAgIH1cbiAgfSxcbiAgZXhwb3J0OiB7XG4gICAgaW5maWxlOiB7XG4gICAgICB2YWx1ZTogZmFsc2UsXG4gICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnVGhlIGlucHV0IGZpbGUgc2hvdWxkIGluY2x1ZGUgYSBuYW1lIGFuZCBhIHR5cGUgKGpzb24gb3Igc3ZnKS4gSXQgbXVzdCBiZSBjb3JyZWN0bHkgZm9ybWF0dGVkIGFzIGEgSlNPTiBvciBTVkcgZmlsZS4nXG4gICAgfSxcbiAgICBpbnN0cjoge1xuICAgICAgdmFsdWU6IGZhbHNlLFxuICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ0lucHV0LCBwcm92aWRlZCBpbiB0aGUgZm9ybSBvZiBhIHN0cmluZ2lmaWVkIEpTT04gb3IgU1ZHIGZpbGUsIHdpbGwgb3ZlcnJpZGUgdGhlIC0taW5maWxlIG9wdGlvbi4nXG4gICAgfSxcbiAgICBvcHRpb25zOiB7XG4gICAgICB2YWx1ZTogZmFsc2UsXG4gICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQW4gYWxpYXMgZm9yIHRoZSAtLWluc3RyIG9wdGlvbi4nXG4gICAgfSxcbiAgICBvdXRmaWxlOiB7XG4gICAgICB2YWx1ZTogZmFsc2UsXG4gICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnVGhlIG91dHB1dCBmaWxlbmFtZSBhbG9uZyB3aXRoIGEgdHlwZSAoanBlZywgcG5nLCBwZGYsIG9yIHN2ZykuIFRoaXMgd2lsbCBpZ25vcmUgdGhlIC0tdHlwZSBmbGFnLidcbiAgICB9LFxuICAgIHR5cGU6IHtcbiAgICAgIHZhbHVlOiAncG5nJyxcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgZW52TGluazogJ0VYUE9SVF9UWVBFJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGZpbGUgZXhwb3J0IGZvcm1hdC4gSXQgY2FuIGJlIGpwZWcsIHBuZywgcGRmLCBvciBzdmcuJ1xuICAgIH0sXG4gICAgY29uc3RyOiB7XG4gICAgICB2YWx1ZTogJ2NoYXJ0JyxcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgZW52TGluazogJ0VYUE9SVF9DT05TVFInLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdUaGUgY29uc3RydWN0b3IgdG8gdXNlLiBDYW4gYmUgY2hhcnQsIHN0b2NrQ2hhcnQsIG1hcENoYXJ0LCBvciBnYW50dENoYXJ0LidcbiAgICB9LFxuICAgIGRlZmF1bHRIZWlnaHQ6IHtcbiAgICAgIHZhbHVlOiA0MDAsXG4gICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgIGVudkxpbms6ICdFWFBPUlRfREVGQVVMVF9IRUlHSFQnLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICd0aGUgZGVmYXVsdCBoZWlnaHQgb2YgdGhlIGV4cG9ydGVkIGNoYXJ0LiBVc2VkIHdoZW4gbm8gdmFsdWUgaXMgc2V0LidcbiAgICB9LFxuICAgIGRlZmF1bHRXaWR0aDoge1xuICAgICAgdmFsdWU6IDYwMCxcbiAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgZW52TGluazogJ0VYUE9SVF9ERUZBVUxUX1dJRFRIJyxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnVGhlIGRlZmF1bHQgd2lkdGggb2YgdGhlIGV4cG9ydGVkIGNoYXJ0LiBVc2VkIHdoZW4gbm8gdmFsdWUgaXMgc2V0LidcbiAgICB9LFxuICAgIGRlZmF1bHRTY2FsZToge1xuICAgICAgdmFsdWU6IDEsXG4gICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgIGVudkxpbms6ICdFWFBPUlRfREVGQVVMVF9TQ0FMRScsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ1RoZSBkZWZhdWx0IHNjYWxlIG9mIHRoZSBleHBvcnRlZCBjaGFydC4gVXNlZCB3aGVuIG5vIHZhbHVlIGlzIHNldC4nXG4gICAgfSxcbiAgICBoZWlnaHQ6IHtcbiAgICAgIHZhbHVlOiBmYWxzZSxcbiAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdUaGUgaGVpZ2h0IG9mIHRoZSBleHBvcnRlZCBjaGFydCwgb3ZlcnJpZGluZyB0aGUgb3B0aW9uIGluIHRoZSBjaGFydCBzZXR0aW5ncy4nXG4gICAgfSxcbiAgICB3aWR0aDoge1xuICAgICAgdmFsdWU6IGZhbHNlLFxuICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ1RoZSB3aWR0aCBvZiB0aGUgZXhwb3J0ZWQgY2hhcnQsIG92ZXJyaWRpbmcgdGhlIG9wdGlvbiBpbiB0aGUgY2hhcnQgc2V0dGluZ3MuJ1xuICAgIH0sXG4gICAgc2NhbGU6IHtcbiAgICAgIHZhbHVlOiBmYWxzZSxcbiAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdUaGUgc2NhbGUgb2YgdGhlIGV4cG9ydGVkIGNoYXJ0LCBvdmVycmlkaW5nIHRoZSBvcHRpb24gaW4gdGhlIGNoYXJ0IHNldHRpbmdzLiBSYW5nZXMgYmV0d2VlbiAwLjEgYW5kIDUuMC4nXG4gICAgfSxcbiAgICBnbG9iYWxPcHRpb25zOiB7XG4gICAgICB2YWx1ZTogZmFsc2UsXG4gICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnRWl0aGVyIGEgc3RyaW5naWZpZWQgSlNPTiBvciBhIGZpbGVuYW1lIGNvbnRhaW5pbmcgb3B0aW9ucyB0byBiZSBwYXNzZWQgaW50byB0aGUgSGlnaGNoYXJ0cy5zZXRPcHRpb25zLidcbiAgICB9LFxuICAgIHRoZW1lT3B0aW9uczoge1xuICAgICAgdmFsdWU6IGZhbHNlLFxuICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ0VpdGhlciBhIHN0cmluZ2lmaWVkIEpTT04gb3IgYSBmaWxlbmFtZSBjb250YWluaW5nIHRoZW1lIG9wdGlvbnMgdG8gYmUgcGFzc2VkIGludG8gdGhlIEhpZ2hjaGFydHMuc2V0T3B0aW9ucy4nXG4gICAgfSxcbiAgICBiYXRjaDoge1xuICAgICAgdmFsdWU6IGZhbHNlLFxuICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ0luaXRpYXRlcyBhIGJhdGNoIGpvYiB3aXRoIGEgc3RyaW5nIGNvbnRhaW5pbmcgaW5wdXQvb3V0cHV0IHBhaXJzOiBcImluPW91dDtpbj1vdXQ7Li4uXCIuJ1xuICAgIH0sXG4gICAgcmFzdGVyaXphdGlvblRpbWVvdXQ6IHtcbiAgICAgIHZhbHVlOiAxNTAwLFxuICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICBlbnZMaW5rOiAnRVhQT1JUX1JBU1RFUklaQVRJT05fVElNRU9VVCcsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ1RoZSBkdXJhdGlvbiBpbiBtaWxsaXNlY29uZHMgdG8gd2FpdCBmb3IgcmVuZGVyaW5nIGEgd2VicGFnZS4nXG4gICAgfVxuICB9LFxuICBjdXN0b21Mb2dpYzoge1xuICAgIGFsbG93Q29kZUV4ZWN1dGlvbjoge1xuICAgICAgdmFsdWU6IGZhbHNlLFxuICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgZW52TGluazogJ0NVU1RPTV9MT0dJQ19BTExPV19DT0RFX0VYRUNVVElPTicsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ0NvbnRyb2xzIHdoZXRoZXIgdGhlIGV4ZWN1dGlvbiBvZiBhcmJpdHJhcnkgY29kZSBpcyBhbGxvd2VkIGR1cmluZyB0aGUgZXhwb3J0aW5nIHByb2Nlc3MuJ1xuICAgIH0sXG4gICAgYWxsb3dGaWxlUmVzb3VyY2VzOiB7XG4gICAgICB2YWx1ZTogZmFsc2UsXG4gICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICBlbnZMaW5rOiAnQ1VTVE9NX0xPR0lDX0FMTE9XX0ZJTEVfUkVTT1VSQ0VTJyxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnQ29udHJvbHMgdGhlIGFiaWxpdHkgdG8gaW5qZWN0IHJlc291cmNlcyBmcm9tIHRoZSBmaWxlc3lzdGVtLiBUaGlzIHNldHRpbmcgaGFzIG5vIGVmZmVjdCB3aGVuIHJ1bm5pbmcgYXMgYSBzZXJ2ZXIuJ1xuICAgIH0sXG4gICAgY3VzdG9tQ29kZToge1xuICAgICAgdmFsdWU6IGZhbHNlLFxuICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ0N1c3RvbSBjb2RlIHRvIGV4ZWN1dGUgYmVmb3JlIGNoYXJ0IGluaXRpYWxpemF0aW9uLiBJdCBjYW4gYmUgYSBmdW5jdGlvbiwgY29kZSB3cmFwcGVkIHdpdGhpbiBhIGZ1bmN0aW9uLCBvciBhIGZpbGVuYW1lIHdpdGggdGhlIC5qcyBleHRlbnNpb24uJ1xuICAgIH0sXG4gICAgY2FsbGJhY2s6IHtcbiAgICAgIHZhbHVlOiBmYWxzZSxcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdKYXZhU2NyaXB0IGNvZGUgdG8gcnVuIGR1cmluZyBjb25zdHJ1Y3Rpb24uIEl0IGNhbiBiZSBhIGZ1bmN0aW9uIG9yIGEgZmlsZW5hbWUgd2l0aCB0aGUgLmpzIGV4dGVuc2lvbi4nXG4gICAgfSxcbiAgICByZXNvdXJjZXM6IHtcbiAgICAgIHZhbHVlOiBmYWxzZSxcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdBZGRpdGlvbmFsIHJlc291cmNlIGluIHRoZSBmb3JtIG9mIGEgc3RyaW5naWZpZWQgSlNPTiwgd2hpY2ggbWF5IGNvbnRhaW4gZmlsZXMsIGpzLCBhbmQgY3NzIHNlY3Rpb25zLidcbiAgICB9LFxuICAgIGxvYWRDb25maWc6IHtcbiAgICAgIHZhbHVlOiBmYWxzZSxcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgbGVnYWN5TmFtZTogJ2Zyb21GaWxlJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnQSBmaWxlIGNvbnRhaW5pbmcgYSBwcmUtZGVmaW5lZCBjb25maWd1cmF0aW9uIHRvIHVzZS4nXG4gICAgfSxcbiAgICBjcmVhdGVDb25maWc6IHtcbiAgICAgIHZhbHVlOiBmYWxzZSxcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdFbmFibGVzIHNldHRpbmcgb3B0aW9ucyB0aHJvdWdoIGEgcHJvbXB0IGFuZCBzYXZpbmcgdGhlbSBpbiBhIHByb3ZpZGVkIGNvbmZpZyBmaWxlLidcbiAgICB9XG4gIH0sXG4gIHNlcnZlcjoge1xuICAgIG1heFVwbG9hZFNpemU6IHtcbiAgICAgIHZhbHVlOiAzLFxuICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICBjbGlOYW1lOiAnbWF4VXBsb2FkU2l6ZScsXG4gICAgICBlbnZMaW5rOiAnU0VSVkVSX01BWF9VUExPQURfU0laRScsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ1RoZSBtYXhpbXVtIHVwbG9hZCBzaXplLCBpbiBtZWdhYnl0ZXMsIGZvciB0aGUgc2VydmVyJ1xuICAgICAgXG4gICAgfSxcbiAgICBlbmFibGU6IHtcbiAgICAgIHZhbHVlOiBmYWxzZSxcbiAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgIGVudkxpbms6ICdTRVJWRVJfRU5BQkxFJyxcbiAgICAgIGNsaU5hbWU6ICdlbmFibGVTZXJ2ZXInLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdXaGVuIHNldCB0byB0cnVlLCB0aGUgc2VydmVyIHN0YXJ0cyBvbiB0aGUgbG9jYWwgSVAgYWRkcmVzcyAwLjAuMC4wLidcbiAgICB9LFxuICAgIGhvc3Q6IHtcbiAgICAgIHZhbHVlOiAnMC4wLjAuMCcsXG4gICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgIGVudkxpbms6ICdTRVJWRVJfSE9TVCcsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ1RoZSBob3N0bmFtZSBvZiB0aGUgc2VydmVyLiBBZGRpdGlvbmFsbHksIGl0IHN0YXJ0cyBhIHNlcnZlciBvbiB0aGUgcHJvdmlkZWQgaG9zdG5hbWUuJ1xuICAgIH0sXG4gICAgcG9ydDoge1xuICAgICAgdmFsdWU6IDc4MDEsXG4gICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgIGVudkxpbms6ICdTRVJWRVJfUE9SVCcsXG4gICAgICBkZXNjcmlwdGlvbjogJ1RoZSBzZXJ2ZXIgcG9ydCB3aGVuIGVuYWJsZWQuJ1xuICAgIH0sXG4gICAgYmVuY2htYXJraW5nOiB7XG4gICAgICB2YWx1ZTogZmFsc2UsXG4gICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICBlbnZMaW5rOiAnU0VSVkVSX0JFTkNITUFSS0lORycsXG4gICAgICBjbGlOYW1lOiAnc2VydmVyQmVuY2htYXJraW5nJyxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnSW5kaWNhdGVzIHdoZXRoZXIgdG8gZGlzcGxheSB0aGUgZHVyYXRpb24sIGluIG1pbGxpc2Vjb25kcywgb2Ygc3BlY2lmaWMgYWN0aW9ucyB0aGF0IG9jY3VyIG9uIHRoZSBzZXJ2ZXIgd2hpbGUgc2VydmluZyBhIHJlcXVlc3QuJ1xuICAgIH0sXG4gICAgcHJveHk6IHtcbiAgICAgIGhvc3Q6IHtcbiAgICAgICAgdmFsdWU6IGZhbHNlLFxuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgZW52TGluazogJ1NFUlZFUl9QUk9YWV9IT1NUJyxcbiAgICAgICAgY2xpTmFtZTogJ3Byb3h5SG9zdCcsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGhvc3Qgb2YgdGhlIHByb3h5IHNlcnZlciB0byB1c2UsIGlmIGl0IGV4aXN0cy4nXG4gICAgICB9LFxuICAgICAgcG9ydDoge1xuICAgICAgICB2YWx1ZTogODA4MCxcbiAgICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICAgIGVudkxpbms6ICdTRVJWRVJfUFJPWFlfUE9SVCcsXG4gICAgICAgIGNsaU5hbWU6ICdwcm94eVBvcnQnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBwb3J0IG9mIHRoZSBwcm94eSBzZXJ2ZXIgdG8gdXNlLCBpZiBpdCBleGlzdHMuJ1xuICAgICAgfSxcbiAgICAgIHVzZXJuYW1lOiB7XG4gICAgICAgIHZhbHVlOiBmYWxzZSxcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIGVudkxpbms6ICdTRVJWRVJfUFJPWFlfVVNFUk5BTUUnLFxuICAgICAgICBjbGlOYW1lOiAncHJveHlVc2VybmFtZScsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHVzZXJuYW1lIGZvciB0aGUgcHJveHkgc2VydmVyLCBpZiBpdCBleGlzdHMuJ1xuICAgICAgfSxcbiAgICAgIHBhc3N3b3JkOiB7XG4gICAgICAgIHZhbHVlOiBmYWxzZSxcbiAgICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICAgIGVudkxpbms6ICdTRVJWRVJfUFJPWFlfUEFTU1dPUkQnLFxuICAgICAgICBjbGlOYW1lOiAncHJveHlQYXNzd29yZCcsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHBhc3N3b3JkIGZvciB0aGUgcHJveHkgc2VydmVyLCBpZiBpdCBleGlzdHMuJ1xuICAgICAgfSxcbiAgICAgIHRpbWVvdXQ6IHtcbiAgICAgICAgdmFsdWU6IDUwMDAsXG4gICAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgICBlbnZMaW5rOiAnU0VSVkVSX1BST1hZX1RJTUVPVVQnLFxuICAgICAgICBjbGlOYW1lOiAncHJveHlUaW1lb3V0JyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdUaGUgdGltZW91dCBmb3IgdGhlIHByb3h5IHNlcnZlciB0byB1c2UsIGlmIGl0IGV4aXN0cy4nXG4gICAgICB9XG4gICAgfSxcbiAgICByYXRlTGltaXRpbmc6IHtcbiAgICAgIGVuYWJsZToge1xuICAgICAgICB2YWx1ZTogZmFsc2UsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZW52TGluazogJ1NFUlZFUl9SQVRFX0xJTUlUSU5HX0VOQUJMRScsXG4gICAgICAgIGNsaU5hbWU6ICdlbmFibGVSYXRlTGltaXRpbmcnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ0VuYWJsZXMgcmF0ZSBsaW1pdGluZyBmb3IgdGhlIHNlcnZlci4nXG4gICAgICB9LFxuICAgICAgbWF4UmVxdWVzdHM6IHtcbiAgICAgICAgdmFsdWU6IDEwLFxuICAgICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgICAgZW52TGluazogJ1NFUlZFUl9SQVRFX0xJTUlUSU5HX01BWF9SRVFVRVNUUycsXG4gICAgICAgIGxlZ2FjeU5hbWU6ICdyYXRlTGltaXQnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSBtYXhpbXVtIG51bWJlciBvZiByZXF1ZXN0cyBhbGxvd2VkIGluIG9uZSBtaW51dGUuJ1xuICAgICAgfSxcbiAgICAgIHdpbmRvdzoge1xuICAgICAgICB2YWx1ZTogMSxcbiAgICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICAgIGVudkxpbms6ICdTRVJWRVJfUkFURV9MSU1JVElOR19XSU5ET1cnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1RoZSB0aW1lIHdpbmRvdywgaW4gbWludXRlcywgZm9yIHRoZSByYXRlIGxpbWl0aW5nLidcbiAgICAgIH0sXG4gICAgICBkZWxheToge1xuICAgICAgICB2YWx1ZTogMCxcbiAgICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICAgIGVudkxpbms6ICdTRVJWRVJfUkFURV9MSU1JVElOR19ERUxBWScsXG4gICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICdUaGUgZGVsYXkgZHVyYXRpb24gZm9yIGVhY2ggc3VjY2Vzc2l2ZSByZXF1ZXN0IGJlZm9yZSByZWFjaGluZyB0aGUgbWF4aW11bSBsaW1pdC4nXG4gICAgICB9LFxuICAgICAgdHJ1c3RQcm94eToge1xuICAgICAgICB2YWx1ZTogZmFsc2UsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZW52TGluazogJ1NFUlZFUl9SQVRFX0xJTUlUSU5HX1RSVVNUX1BST1hZJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdTZXQgdGhpcyB0byB0cnVlIGlmIHRoZSBzZXJ2ZXIgaXMgYmVoaW5kIGEgbG9hZCBiYWxhbmNlci4nXG4gICAgICB9LFxuICAgICAgc2tpcEtleToge1xuICAgICAgICB2YWx1ZTogZmFsc2UsXG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBlbnZMaW5rOiAnU0VSVkVSX1JBVEVfTElNSVRJTkdfU0tJUF9LRVknLFxuICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAnQWxsb3dzIGJ5cGFzc2luZyB0aGUgcmF0ZSBsaW1pdGVyIGFuZCBzaG91bGQgYmUgcHJvdmlkZWQgd2l0aCB0aGUgc2tpcFRva2VuIGFyZ3VtZW50LidcbiAgICAgIH0sXG4gICAgICBza2lwVG9rZW46IHtcbiAgICAgICAgdmFsdWU6IGZhbHNlLFxuICAgICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgICAgZW52TGluazogJ1NFUlZFUl9SQVRFX0xJTUlUSU5HX1NLSVBfVE9LRU4nLFxuICAgICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgICAnQWxsb3dzIGJ5cGFzc2luZyB0aGUgcmF0ZSBsaW1pdGVyIGFuZCBzaG91bGQgYmUgcHJvdmlkZWQgd2l0aCB0aGUgc2tpcEtleSBhcmd1bWVudC4nXG4gICAgICB9XG4gICAgfSxcbiAgICBzc2w6IHtcbiAgICAgIGVuYWJsZToge1xuICAgICAgICB2YWx1ZTogZmFsc2UsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZW52TGluazogJ1NFUlZFUl9TU0xfRU5BQkxFJyxcbiAgICAgICAgY2xpTmFtZTogJ2VuYWJsZVNzbCcsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgU1NMIHByb3RvY29sLidcbiAgICAgIH0sXG4gICAgICBmb3JjZToge1xuICAgICAgICB2YWx1ZTogZmFsc2UsXG4gICAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgICAgZW52TGluazogJ1NFUlZFUl9TU0xfRk9SQ0UnLFxuICAgICAgICBjbGlOYW1lOiAnc3NsRm9yY2UnLFxuICAgICAgICBsZWdhY3lOYW1lOiAnc3NsT25seScsXG4gICAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAgICdXaGVuIHNldCB0byB0cnVlLCB0aGUgc2VydmVyIGlzIGZvcmNlZCB0byBzZXJ2ZSBvbmx5IG92ZXIgSFRUUFMuJ1xuICAgICAgfSxcbiAgICAgIHBvcnQ6IHtcbiAgICAgICAgdmFsdWU6IDQ0MyxcbiAgICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICAgIGVudkxpbms6ICdTRVJWRVJfU1NMX1BPUlQnLFxuICAgICAgICBjbGlOYW1lOiAnc3NsUG9ydCcsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHBvcnQgb24gd2hpY2ggdG8gcnVuIHRoZSBTU0wgc2VydmVyLidcbiAgICAgIH0sXG4gICAgICBjZXJ0UGF0aDoge1xuICAgICAgICB2YWx1ZTogZmFsc2UsXG4gICAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgICBlbnZMaW5rOiAnU0VSVkVSX1NTTF9DRVJUX1BBVEgnLFxuICAgICAgICBsZWdhY3lOYW1lOiAnc3NsUGF0aCcsXG4gICAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIHBhdGggdG8gdGhlIFNTTCBjZXJ0aWZpY2F0ZS9rZXkgZmlsZS4nXG4gICAgICB9XG4gICAgfVxuICB9LFxuICBwb29sOiB7XG4gICAgbWluV29ya2Vyczoge1xuICAgICAgdmFsdWU6IDQsXG4gICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgIGVudkxpbms6ICdQT09MX01JTl9XT1JLRVJTJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIG51bWJlciBvZiBtaW5pbXVtIGFuZCBpbml0aWFsIHBvb2wgd29ya2VycyB0byBzcGF3bi4nXG4gICAgfSxcbiAgICBtYXhXb3JrZXJzOiB7XG4gICAgICB2YWx1ZTogOCxcbiAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgZW52TGluazogJ1BPT0xfTUFYX1dPUktFUlMnLFxuICAgICAgbGVnYWN5TmFtZTogJ3dvcmtlcnMnLFxuICAgICAgZGVzY3JpcHRpb246ICdUaGUgbnVtYmVyIG9mIG1heGltdW0gcG9vbCB3b3JrZXJzIHRvIHNwYXduLidcbiAgICB9LFxuICAgIHdvcmtMaW1pdDoge1xuICAgICAgdmFsdWU6IDQwLFxuICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICBlbnZMaW5rOiAnUE9PTF9XT1JLX0xJTUlUJyxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnVGhlIG51bWJlciBvZiB3b3JrIHBpZWNlcyB0aGF0IGNhbiBiZSBwZXJmb3JtZWQgYmVmb3JlIHJlc3RhcnRpbmcgdGhlIHdvcmtlciBwcm9jZXNzLidcbiAgICB9LFxuICAgIGFjcXVpcmVUaW1lb3V0OiB7XG4gICAgICB2YWx1ZTogNTAwMCxcbiAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgZW52TGluazogJ1BPT0xfQUNRVUlSRV9USU1FT1VUJyxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnVGhlIGR1cmF0aW9uLCBpbiBtaWxsaXNlY29uZHMsIHRvIHdhaXQgZm9yIGFjcXVpcmluZyBhIHJlc291cmNlLidcbiAgICB9LFxuICAgIGNyZWF0ZVRpbWVvdXQ6IHtcbiAgICAgIHZhbHVlOiA1MDAwLFxuICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICBlbnZMaW5rOiAnUE9PTF9DUkVBVEVfVElNRU9VVCcsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ1RoZSBkdXJhdGlvbiwgaW4gbWlsbGlzZWNvbmRzLCB0byB3YWl0IGZvciBjcmVhdGluZyBhIHJlc291cmNlLidcbiAgICB9LFxuICAgIGRlc3Ryb3lUaW1lb3V0OiB7XG4gICAgICB2YWx1ZTogNTAwMCxcbiAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgZW52TGluazogJ1BPT0xfREVTVFJPWV9USU1FT1VUJyxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnVGhlIGR1cmF0aW9uLCBpbiBtaWxsaXNlY29uZHMsIHRvIHdhaXQgZm9yIGRlc3Ryb3lpbmcgYSByZXNvdXJjZS4nXG4gICAgfSxcbiAgICBpZGxlVGltZW91dDoge1xuICAgICAgdmFsdWU6IDMwMDAwLFxuICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICBlbnZMaW5rOiAnUE9PTF9JRExFX1RJTUVPVVQnLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdUaGUgZHVyYXRpb24sIGluIG1pbGxpc2Vjb25kcywgYWZ0ZXIgd2hpY2ggYW4gaWRsZSByZXNvdXJjZSBpcyBkZXN0cm95ZWQuJ1xuICAgIH0sXG4gICAgY3JlYXRlUmV0cnlJbnRlcnZhbDoge1xuICAgICAgdmFsdWU6IDIwMCxcbiAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgZW52TGluazogJ1BPT0xfQ1JFQVRFX1JFVFJZX0lOVEVSVkFMJyxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnVGhlIGR1cmF0aW9uLCBpbiBtaWxsaXNlY29uZHMsIHRvIHdhaXQgYmVmb3JlIHJldHJ5aW5nIHRoZSBjcmVhdGUgcHJvY2VzcyBpbiBjYXNlIG9mIGEgZmFpbHVyZS4nXG4gICAgfSxcbiAgICByZWFwZXJJbnRlcnZhbDoge1xuICAgICAgdmFsdWU6IDEwMDAsXG4gICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgIGVudkxpbms6ICdQT09MX1JFQVBFUl9JTlRFUlZBTCcsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ1RoZSBkdXJhdGlvbiwgaW4gbWlsbGlzZWNvbmRzLCBhZnRlciB3aGljaCB0aGUgY2hlY2sgZm9yIGlkbGUgcmVzb3VyY2VzIHRvIGRlc3Ryb3kgaXMgdHJpZ2dlcmVkLidcbiAgICB9LFxuICAgIGJlbmNobWFya2luZzoge1xuICAgICAgdmFsdWU6IGZhbHNlLFxuICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgZW52TGluazogJ1BPT0xfQkVOQ0hNQVJLSU5HJyxcbiAgICAgIGNsaU5hbWU6ICdwb29sQmVuY2htYXJraW5nJyxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnSW5kaWNhdGUgd2hldGhlciB0byBzaG93IHN0YXRpc3RpY3MgZm9yIHRoZSBwb29sIG9mIHJlc291cmNlcyBvciBub3QuJ1xuICAgIH1cbiAgfSxcbiAgbG9nZ2luZzoge1xuICAgIGxldmVsOiB7XG4gICAgICB2YWx1ZTogNCxcbiAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgZW52TGluazogJ0xPR0dJTkdfTEVWRUwnLFxuICAgICAgY2xpTmFtZTogJ2xvZ0xldmVsJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnVGhlIGxvZ2dpbmcgbGV2ZWwgdG8gYmUgdXNlZC4nXG4gICAgfSxcbiAgICBmaWxlOiB7XG4gICAgICB2YWx1ZTogJ2hpZ2hjaGFydHMtZXhwb3J0LXNlcnZlci5sb2cnLFxuICAgICAgdHlwZTogJ3N0cmluZycsXG4gICAgICBlbnZMaW5rOiAnTE9HR0lOR19GSUxFJyxcbiAgICAgIGNsaU5hbWU6ICdsb2dGaWxlJyxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnVGhlIG5hbWUgb2YgYSBsb2cgZmlsZS4gVGhlIGBsb2dUb0ZpbGVgIGFuZCBgbG9nRGVzdGAgb3B0aW9ucyBhbHNvIG5lZWQgdG8gYmUgc2V0IHRvIGVuYWJsZSBmaWxlIGxvZ2dpbmcuJ1xuICAgIH0sXG4gICAgZGVzdDoge1xuICAgICAgdmFsdWU6ICdsb2cvJyxcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgZW52TGluazogJ0xPR0dJTkdfREVTVCcsXG4gICAgICBjbGlOYW1lOiAnbG9nRGVzdCcsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ1RoZSBwYXRoIHRvIHN0b3JlIGxvZyBmaWxlcy4gVGhlIGBsb2dUb0ZpbGVgIG9wdGlvbiBhbHNvIG5lZWRzIHRvIGJlIHNldCB0byBlbmFibGUgZmlsZSBsb2dnaW5nLidcbiAgICB9LFxuICAgIHRvQ29uc29sZToge1xuICAgICAgdmFsdWU6IHRydWUsXG4gICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICBlbnZMaW5rOiAnTE9HR0lOR19UT19DT05TT0xFJyxcbiAgICAgIGNsaU5hbWU6ICdsb2dUb0NvbnNvbGUnLFxuICAgICAgZGVzY3JpcHRpb246ICdFbmFibGVzIG9yIGRpc2FibGVzIHNob3dpbmcgbG9ncyBpbiB0aGUgY29uc29sZS4nXG4gICAgfSxcbiAgICB0b0ZpbGU6IHtcbiAgICAgIHZhbHVlOiB0cnVlLFxuICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgZW52TGluazogJ0xPR0dJTkdfVE9fRklMRScsXG4gICAgICBjbGlOYW1lOiAnbG9nVG9GaWxlJyxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnRW5hYmxlcyBvciBkaXNhYmxlcyBjcmVhdGlvbiBvZiB0aGUgbG9nIGRpcmVjdG9yeSBhbmQgc2F2aW5nIHRoZSBsb2cgaW50byBhIC5sb2cgZmlsZS4nXG4gICAgfVxuICB9LFxuICB1aToge1xuICAgIGVuYWJsZToge1xuICAgICAgdmFsdWU6IGZhbHNlLFxuICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgZW52TGluazogJ1VJX0VOQUJMRScsXG4gICAgICBjbGlOYW1lOiAnZW5hYmxlVWknLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdFbmFibGVzIG9yIGRpc2FibGVzIHRoZSB1c2VyIGludGVyZmFjZSAoVUkpIGZvciB0aGUgZXhwb3J0IHNlcnZlci4nXG4gICAgfSxcbiAgICByb3V0ZToge1xuICAgICAgdmFsdWU6ICcvJyxcbiAgICAgIHR5cGU6ICdzdHJpbmcnLFxuICAgICAgZW52TGluazogJ1VJX1JPVVRFJyxcbiAgICAgIGNsaU5hbWU6ICd1aVJvdXRlJyxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnVGhlIGVuZHBvaW50IHJvdXRlIHRvIHdoaWNoIHRoZSB1c2VyIGludGVyZmFjZSAoVUkpIHNob3VsZCBiZSBhdHRhY2hlZC4nXG4gICAgfVxuICB9LFxuICBvdGhlcjoge1xuICAgIG5vZGVFbnY6IHtcbiAgICAgIHZhbHVlOiAncHJvZHVjdGlvbicsXG4gICAgICB0eXBlOiAnc3RyaW5nJyxcbiAgICAgIGVudkxpbms6ICdPVEhFUl9OT0RFX0VOVicsXG4gICAgICBkZXNjcmlwdGlvbjogJ1RoZSB0eXBlIG9mIE5vZGUuanMgZW52aXJvbm1lbnQuJ1xuICAgIH0sXG4gICAgbGlzdGVuVG9Qcm9jZXNzRXhpdHM6IHtcbiAgICAgIHZhbHVlOiB0cnVlLFxuICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgZW52TGluazogJ09USEVSX0xJU1RFTl9UT19QUk9DRVNTX0VYSVRTJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnRGVjaWRlcyB3aGV0aGVyIG9yIG5vdCB0byBhdHRhY2ggcHJvY2Vzcy5leGl0IGhhbmRsZXJzLidcbiAgICB9LFxuICAgIG5vTG9nbzoge1xuICAgICAgdmFsdWU6IGZhbHNlLFxuICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgZW52TGluazogJ09USEVSX05PX0xPR08nLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdTa2lwIHByaW50aW5nIHRoZSBsb2dvIG9uIGEgc3RhcnR1cC4gV2lsbCBiZSByZXBsYWNlZCBieSBhIHNpbXBsZSB0ZXh0LidcbiAgICB9LFxuICAgIGhhcmRSZXNldFBhZ2U6IHtcbiAgICAgIHZhbHVlOiBmYWxzZSxcbiAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgIGVudkxpbms6ICdPVEhFUl9IQVJEX1JFU0VUX1BBR0UnLFxuICAgICAgZGVzY3JpcHRpb246ICdEZWNpZGVzIGlmIHRoZSBwYWdlIGNvbnRlbnQgc2hvdWxkIGJlIHJlc2V0IGVudGlyZWx5LidcbiAgICB9LFxuICAgIGJyb3dzZXJTaGVsbE1vZGU6IHtcbiAgICAgIHZhbHVlOiB0cnVlLFxuICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgZW52TGluazogJ09USEVSX0JST1dTRVJfU0hFTExfTU9ERScsXG4gICAgICBkZXNjcmlwdGlvbjogJ0RlY2lkZXMgaWYgdGhlIGJyb3dzZXIgcnVucyBpbiB0aGUgc2hlbGwgbW9kZS4nXG4gICAgfVxuICB9LFxuICBkZWJ1Zzoge1xuICAgIGVuYWJsZToge1xuICAgICAgdmFsdWU6IGZhbHNlLFxuICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgZW52TGluazogJ0RFQlVHX0VOQUJMRScsXG4gICAgICBjbGlOYW1lOiAnZW5hYmxlRGVidWcnLFxuICAgICAgZGVzY3JpcHRpb246ICdFbmFibGVzIG9yIGRpc2FibGVzIGRlYnVnIG1vZGUgZm9yIHRoZSB1bmRlcmx5aW5nIGJyb3dzZXIuJ1xuICAgIH0sXG4gICAgaGVhZGxlc3M6IHtcbiAgICAgIHZhbHVlOiB0cnVlLFxuICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgZW52TGluazogJ0RFQlVHX0hFQURMRVNTJyxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnQ29udHJvbHMgdGhlIG1vZGUgaW4gd2hpY2ggdGhlIGJyb3dzZXIgaXMgbGF1bmNoZWQgd2hlbiBpbiB0aGUgZGVidWcgbW9kZS4nXG4gICAgfSxcbiAgICBkZXZ0b29sczoge1xuICAgICAgdmFsdWU6IGZhbHNlLFxuICAgICAgdHlwZTogJ2Jvb2xlYW4nLFxuICAgICAgZW52TGluazogJ0RFQlVHX0RFVlRPT0xTJyxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnRGVjaWRlcyB3aGV0aGVyIHRvIGVuYWJsZSBEZXZUb29scyB3aGVuIHRoZSBicm93c2VyIGlzIGluIGEgaGVhZGZ1bCBzdGF0ZS4nXG4gICAgfSxcbiAgICBsaXN0ZW5Ub0NvbnNvbGU6IHtcbiAgICAgIHZhbHVlOiBmYWxzZSxcbiAgICAgIHR5cGU6ICdib29sZWFuJyxcbiAgICAgIGVudkxpbms6ICdERUJVR19MSVNURU5fVE9fQ09OU09MRScsXG4gICAgICBkZXNjcmlwdGlvbjpcbiAgICAgICAgJ0RlY2lkZXMgd2hldGhlciB0byBlbmFibGUgYSBsaXN0ZW5lciBmb3IgY29uc29sZSBtZXNzYWdlcyBzZW50IGZyb20gdGhlIGJyb3dzZXIuJ1xuICAgIH0sXG4gICAgZHVtcGlvOiB7XG4gICAgICB2YWx1ZTogZmFsc2UsXG4gICAgICB0eXBlOiAnYm9vbGVhbicsXG4gICAgICBlbnZMaW5rOiAnREVCVUdfRFVNUElPJyxcbiAgICAgIGRlc2NyaXB0aW9uOlxuICAgICAgICAnUmVkaXJlY3RzIGJyb3dzZXIgcHJvY2VzcyBzdGRvdXQgYW5kIHN0ZGVyciB0byBwcm9jZXNzLnN0ZG91dCBhbmQgcHJvY2Vzcy5zdGRlcnIuJ1xuICAgIH0sXG4gICAgc2xvd01vOiB7XG4gICAgICB2YWx1ZTogMCxcbiAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgZW52TGluazogJ0RFQlVHX1NMT1dfTU8nLFxuICAgICAgZGVzY3JpcHRpb246XG4gICAgICAgICdTbG93cyBkb3duIFB1cHBldGVlciBvcGVyYXRpb25zIGJ5IHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy4nXG4gICAgfSxcbiAgICBkZWJ1Z2dpbmdQb3J0OiB7XG4gICAgICB2YWx1ZTogOTIyMixcbiAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgZW52TGluazogJ0RFQlVHX0RFQlVHR0lOR19QT1JUJyxcbiAgICAgIGRlc2NyaXB0aW9uOiAnU3BlY2lmaWVzIHRoZSBkZWJ1Z2dpbmcgcG9ydC4nXG4gICAgfVxuICB9XG59O1xuXG4vLyBUaGUgY29uZmlnIGRlc2NyaXB0aW9ucyBvYmplY3QgZm9yIHRoZSBwcm9tcHRzIGZ1bmN0aW9uYWxpdHkuIEl0IGNvbnRhaW5zXG4vLyBpbmZvcm1hdGlvbiBsaWtlOlxuLy8gKiBUeXBlIG9mIGEgcHJvbXB0XG4vLyAqIE5hbWUgb2YgYW4gb3B0aW9uXG4vLyAqIFNob3J0IGRlc2NyaXB0aW9uIG9mIGEgY2hvc2VuIG9wdGlvblxuLy8gKiBJbml0aWFsIHZhbHVlXG5leHBvcnQgY29uc3QgcHJvbXB0c0NvbmZpZyA9IHtcbiAgcHVwcGV0ZWVyOiBbXG4gICAge1xuICAgICAgdHlwZTogJ2xpc3QnLFxuICAgICAgbmFtZTogJ2FyZ3MnLFxuICAgICAgbWVzc2FnZTogJ1B1cHBldGVlciBhcmd1bWVudHMnLFxuICAgICAgaW5pdGlhbDogZGVmYXVsdENvbmZpZy5wdXBwZXRlZXIuYXJncy52YWx1ZS5qb2luKCcsJyksXG4gICAgICBzZXBhcmF0b3I6ICcsJ1xuICAgIH1cbiAgXSxcbiAgaGlnaGNoYXJ0czogW1xuICAgIHtcbiAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgIG5hbWU6ICd2ZXJzaW9uJyxcbiAgICAgIG1lc3NhZ2U6ICdIaWdoY2hhcnRzIHZlcnNpb24nLFxuICAgICAgaW5pdGlhbDogZGVmYXVsdENvbmZpZy5oaWdoY2hhcnRzLnZlcnNpb24udmFsdWVcbiAgICB9LFxuICAgIHtcbiAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgIG5hbWU6ICdjZG5VUkwnLFxuICAgICAgbWVzc2FnZTogJ1RoZSBVUkwgb2YgQ0ROJyxcbiAgICAgIGluaXRpYWw6IGRlZmF1bHRDb25maWcuaGlnaGNoYXJ0cy5jZG5VUkwudmFsdWVcbiAgICB9LFxuICAgIHtcbiAgICAgIHR5cGU6ICdtdWx0aXNlbGVjdCcsXG4gICAgICBuYW1lOiAnY29yZVNjcmlwdHMnLFxuICAgICAgbWVzc2FnZTogJ0F2YWlsYWJsZSBjb3JlIHNjcmlwdHMnLFxuICAgICAgaW5zdHJ1Y3Rpb25zOiAnU3BhY2U6IFNlbGVjdCBzcGVjaWZpYywgQTogU2VsZWN0IGFsbCwgRW50ZXI6IENvbmZpcm0uJyxcbiAgICAgIGNob2ljZXM6IGRlZmF1bHRDb25maWcuaGlnaGNoYXJ0cy5jb3JlU2NyaXB0cy52YWx1ZVxuICAgIH0sXG4gICAge1xuICAgICAgdHlwZTogJ211bHRpc2VsZWN0JyxcbiAgICAgIG5hbWU6ICdtb2R1bGVTY3JpcHRzJyxcbiAgICAgIG1lc3NhZ2U6ICdBdmFpbGFibGUgbW9kdWxlIHNjcmlwdHMnLFxuICAgICAgaW5zdHJ1Y3Rpb25zOiAnU3BhY2U6IFNlbGVjdCBzcGVjaWZpYywgQTogU2VsZWN0IGFsbCwgRW50ZXI6IENvbmZpcm0uJyxcbiAgICAgIGNob2ljZXM6IGRlZmF1bHRDb25maWcuaGlnaGNoYXJ0cy5tb2R1bGVTY3JpcHRzLnZhbHVlXG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiAnbXVsdGlzZWxlY3QnLFxuICAgICAgbmFtZTogJ2luZGljYXRvclNjcmlwdHMnLFxuICAgICAgbWVzc2FnZTogJ0F2YWlsYWJsZSBpbmRpY2F0b3Igc2NyaXB0cycsXG4gICAgICBpbnN0cnVjdGlvbnM6ICdTcGFjZTogU2VsZWN0IHNwZWNpZmljLCBBOiBTZWxlY3QgYWxsLCBFbnRlcjogQ29uZmlybS4nLFxuICAgICAgY2hvaWNlczogZGVmYXVsdENvbmZpZy5oaWdoY2hhcnRzLmluZGljYXRvclNjcmlwdHMudmFsdWVcbiAgICB9LFxuICAgIHtcbiAgICAgIHR5cGU6ICdsaXN0JyxcbiAgICAgIG5hbWU6ICdjdXN0b21TY3JpcHRzJyxcbiAgICAgIG1lc3NhZ2U6ICdDdXN0b20gc2NyaXB0cycsXG4gICAgICBpbml0aWFsOiBkZWZhdWx0Q29uZmlnLmhpZ2hjaGFydHMuY3VzdG9tU2NyaXB0cy52YWx1ZS5qb2luKCcsJyksXG4gICAgICBzZXBhcmF0b3I6ICcsJ1xuICAgIH0sXG4gICAge1xuICAgICAgdHlwZTogJ3RvZ2dsZScsXG4gICAgICBuYW1lOiAnZm9yY2VGZXRjaCcsXG4gICAgICBtZXNzYWdlOiAnRm9yY2UgcmUtZmV0Y2ggdGhlIHNjcmlwdHMnLFxuICAgICAgaW5pdGlhbDogZGVmYXVsdENvbmZpZy5oaWdoY2hhcnRzLmZvcmNlRmV0Y2gudmFsdWVcbiAgICB9LFxuICAgIHtcbiAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgIG5hbWU6ICdjYWNoZVBhdGgnLFxuICAgICAgbWVzc2FnZTogJ1RoZSBwYXRoIHRvIHRoZSBjYWNoZSBkaXJlY3RvcnknLFxuICAgICAgaW5pdGlhbDogZGVmYXVsdENvbmZpZy5oaWdoY2hhcnRzLmNhY2hlUGF0aC52YWx1ZVxuICAgIH1cbiAgXSxcbiAgZXhwb3J0OiBbXG4gICAge1xuICAgICAgdHlwZTogJ3NlbGVjdCcsXG4gICAgICBuYW1lOiAndHlwZScsXG4gICAgICBtZXNzYWdlOiAnVGhlIGRlZmF1bHQgZXhwb3J0IGZpbGUgdHlwZScsXG4gICAgICBoaW50OiBgRGVmYXVsdDogJHtkZWZhdWx0Q29uZmlnLmV4cG9ydC50eXBlLnZhbHVlfWAsXG4gICAgICBpbml0aWFsOiAwLFxuICAgICAgY2hvaWNlczogWydwbmcnLCAnanBlZycsICdwZGYnLCAnc3ZnJ11cbiAgICB9LFxuICAgIHtcbiAgICAgIHR5cGU6ICdzZWxlY3QnLFxuICAgICAgbmFtZTogJ2NvbnN0cicsXG4gICAgICBtZXNzYWdlOiAnVGhlIGRlZmF1bHQgY29uc3RydWN0b3IgZm9yIEhpZ2hjaGFydHMnLFxuICAgICAgaGludDogYERlZmF1bHQ6ICR7ZGVmYXVsdENvbmZpZy5leHBvcnQuY29uc3RyLnZhbHVlfWAsXG4gICAgICBpbml0aWFsOiAwLFxuICAgICAgY2hvaWNlczogWydjaGFydCcsICdzdG9ja0NoYXJ0JywgJ21hcENoYXJ0JywgJ2dhbnR0Q2hhcnQnXVxuICAgIH0sXG4gICAge1xuICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICBuYW1lOiAnZGVmYXVsdEhlaWdodCcsXG4gICAgICBtZXNzYWdlOiAnVGhlIGRlZmF1bHQgZmFsbGJhY2sgaGVpZ2h0IG9mIHRoZSBleHBvcnRlZCBjaGFydCcsXG4gICAgICBpbml0aWFsOiBkZWZhdWx0Q29uZmlnLmV4cG9ydC5kZWZhdWx0SGVpZ2h0LnZhbHVlXG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgIG5hbWU6ICdkZWZhdWx0V2lkdGgnLFxuICAgICAgbWVzc2FnZTogJ1RoZSBkZWZhdWx0IGZhbGxiYWNrIHdpZHRoIG9mIHRoZSBleHBvcnRlZCBjaGFydCcsXG4gICAgICBpbml0aWFsOiBkZWZhdWx0Q29uZmlnLmV4cG9ydC5kZWZhdWx0V2lkdGgudmFsdWVcbiAgICB9LFxuICAgIHtcbiAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgbmFtZTogJ2RlZmF1bHRTY2FsZScsXG4gICAgICBtZXNzYWdlOiAnVGhlIGRlZmF1bHQgZmFsbGJhY2sgc2NhbGUgb2YgdGhlIGV4cG9ydGVkIGNoYXJ0JyxcbiAgICAgIGluaXRpYWw6IGRlZmF1bHRDb25maWcuZXhwb3J0LmRlZmF1bHRTY2FsZS52YWx1ZSxcbiAgICAgIG1pbjogMC4xLFxuICAgICAgbWF4OiA1XG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgIG5hbWU6ICdyYXN0ZXJpemF0aW9uVGltZW91dCcsXG4gICAgICBtZXNzYWdlOiAnVGhlIHJlbmRlcmluZyB3ZWJwYWdlIHRpbWVvdXQgaW4gbWlsbGlzZWNvbmRzJyxcbiAgICAgIGluaXRpYWw6IGRlZmF1bHRDb25maWcuZXhwb3J0LnJhc3Rlcml6YXRpb25UaW1lb3V0LnZhbHVlXG4gICAgfVxuICBdLFxuICBjdXN0b21Mb2dpYzogW1xuICAgIHtcbiAgICAgIHR5cGU6ICd0b2dnbGUnLFxuICAgICAgbmFtZTogJ2FsbG93Q29kZUV4ZWN1dGlvbicsXG4gICAgICBtZXNzYWdlOiAnRW5hYmxlIGV4ZWN1dGlvbiBvZiBjdXN0b20gY29kZScsXG4gICAgICBpbml0aWFsOiBkZWZhdWx0Q29uZmlnLmN1c3RvbUxvZ2ljLmFsbG93Q29kZUV4ZWN1dGlvbi52YWx1ZVxuICAgIH0sXG4gICAge1xuICAgICAgdHlwZTogJ3RvZ2dsZScsXG4gICAgICBuYW1lOiAnYWxsb3dGaWxlUmVzb3VyY2VzJyxcbiAgICAgIG1lc3NhZ2U6ICdFbmFibGUgZmlsZSByZXNvdXJjZXMnLFxuICAgICAgaW5pdGlhbDogZGVmYXVsdENvbmZpZy5jdXN0b21Mb2dpYy5hbGxvd0ZpbGVSZXNvdXJjZXMudmFsdWVcbiAgICB9XG4gIF0sXG4gIHNlcnZlcjogW1xuICAgIHtcbiAgICAgIHR5cGU6ICd0b2dnbGUnLFxuICAgICAgbmFtZTogJ2VuYWJsZScsXG4gICAgICBtZXNzYWdlOiAnU3RhcnRzIHRoZSBzZXJ2ZXIgb24gMC4wLjAuMCcsXG4gICAgICBpbml0aWFsOiBkZWZhdWx0Q29uZmlnLnNlcnZlci5lbmFibGUudmFsdWVcbiAgICB9LFxuICAgIHtcbiAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgIG5hbWU6ICdob3N0JyxcbiAgICAgIG1lc3NhZ2U6ICdTZXJ2ZXIgaG9zdG5hbWUnLFxuICAgICAgaW5pdGlhbDogZGVmYXVsdENvbmZpZy5zZXJ2ZXIuaG9zdC52YWx1ZVxuICAgIH0sXG4gICAge1xuICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICBuYW1lOiAncG9ydCcsXG4gICAgICBtZXNzYWdlOiAnU2VydmVyIHBvcnQnLFxuICAgICAgaW5pdGlhbDogZGVmYXVsdENvbmZpZy5zZXJ2ZXIucG9ydC52YWx1ZVxuICAgIH0sXG4gICAge1xuICAgICAgdHlwZTogJ3RvZ2dsZScsXG4gICAgICBuYW1lOiAnYmVuY2htYXJraW5nJyxcbiAgICAgIG1lc3NhZ2U6ICdFbmFibGUgc2VydmVyIGJlbmNobWFya2luZycsXG4gICAgICBpbml0aWFsOiBkZWZhdWx0Q29uZmlnLnNlcnZlci5iZW5jaG1hcmtpbmcudmFsdWVcbiAgICB9LFxuICAgIHtcbiAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgIG5hbWU6ICdwcm94eS5ob3N0JyxcbiAgICAgIG1lc3NhZ2U6ICdUaGUgaG9zdCBvZiB0aGUgcHJveHkgc2VydmVyIHRvIHVzZScsXG4gICAgICBpbml0aWFsOiBkZWZhdWx0Q29uZmlnLnNlcnZlci5wcm94eS5ob3N0LnZhbHVlXG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgIG5hbWU6ICdwcm94eS5wb3J0JyxcbiAgICAgIG1lc3NhZ2U6ICdUaGUgcG9ydCBvZiB0aGUgcHJveHkgc2VydmVyIHRvIHVzZScsXG4gICAgICBpbml0aWFsOiBkZWZhdWx0Q29uZmlnLnNlcnZlci5wcm94eS5wb3J0LnZhbHVlXG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgIG5hbWU6ICdwcm94eS50aW1lb3V0JyxcbiAgICAgIG1lc3NhZ2U6ICdUaGUgdGltZW91dCBmb3IgdGhlIHByb3h5IHNlcnZlciB0byB1c2UnLFxuICAgICAgaW5pdGlhbDogZGVmYXVsdENvbmZpZy5zZXJ2ZXIucHJveHkudGltZW91dC52YWx1ZVxuICAgIH0sXG4gICAge1xuICAgICAgdHlwZTogJ3RvZ2dsZScsXG4gICAgICBuYW1lOiAncmF0ZUxpbWl0aW5nLmVuYWJsZScsXG4gICAgICBtZXNzYWdlOiAnRW5hYmxlIHJhdGUgbGltaXRpbmcnLFxuICAgICAgaW5pdGlhbDogZGVmYXVsdENvbmZpZy5zZXJ2ZXIucmF0ZUxpbWl0aW5nLmVuYWJsZS52YWx1ZVxuICAgIH0sXG4gICAge1xuICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICBuYW1lOiAncmF0ZUxpbWl0aW5nLm1heFJlcXVlc3RzJyxcbiAgICAgIG1lc3NhZ2U6ICdUaGUgbWF4aW11bSByZXF1ZXN0cyBhbGxvd2VkIHBlciBtaW51dGUnLFxuICAgICAgaW5pdGlhbDogZGVmYXVsdENvbmZpZy5zZXJ2ZXIucmF0ZUxpbWl0aW5nLm1heFJlcXVlc3RzLnZhbHVlXG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgIG5hbWU6ICdyYXRlTGltaXRpbmcud2luZG93JyxcbiAgICAgIG1lc3NhZ2U6ICdUaGUgcmF0ZS1saW1pdGluZyB0aW1lIHdpbmRvdyBpbiBtaW51dGVzJyxcbiAgICAgIGluaXRpYWw6IGRlZmF1bHRDb25maWcuc2VydmVyLnJhdGVMaW1pdGluZy53aW5kb3cudmFsdWVcbiAgICB9LFxuICAgIHtcbiAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgbmFtZTogJ3JhdGVMaW1pdGluZy5kZWxheScsXG4gICAgICBtZXNzYWdlOlxuICAgICAgICAnVGhlIGRlbGF5IGZvciBlYWNoIHN1Y2Nlc3NpdmUgcmVxdWVzdCBiZWZvcmUgcmVhY2hpbmcgdGhlIG1heGltdW0nLFxuICAgICAgaW5pdGlhbDogZGVmYXVsdENvbmZpZy5zZXJ2ZXIucmF0ZUxpbWl0aW5nLmRlbGF5LnZhbHVlXG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiAndG9nZ2xlJyxcbiAgICAgIG5hbWU6ICdyYXRlTGltaXRpbmcudHJ1c3RQcm94eScsXG4gICAgICBtZXNzYWdlOiAnU2V0IHRvIHRydWUgaWYgYmVoaW5kIGEgbG9hZCBiYWxhbmNlcicsXG4gICAgICBpbml0aWFsOiBkZWZhdWx0Q29uZmlnLnNlcnZlci5yYXRlTGltaXRpbmcudHJ1c3RQcm94eS52YWx1ZVxuICAgIH0sXG4gICAge1xuICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgbmFtZTogJ3JhdGVMaW1pdGluZy5za2lwS2V5JyxcbiAgICAgIG1lc3NhZ2U6XG4gICAgICAgICdBbGxvd3MgYnlwYXNzaW5nIHRoZSByYXRlIGxpbWl0ZXIgd2hlbiBwcm92aWRlZCB3aXRoIHRoZSBza2lwVG9rZW4gYXJndW1lbnQnLFxuICAgICAgaW5pdGlhbDogZGVmYXVsdENvbmZpZy5zZXJ2ZXIucmF0ZUxpbWl0aW5nLnNraXBLZXkudmFsdWVcbiAgICB9LFxuICAgIHtcbiAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgIG5hbWU6ICdyYXRlTGltaXRpbmcuc2tpcFRva2VuJyxcbiAgICAgIG1lc3NhZ2U6XG4gICAgICAgICdBbGxvd3MgYnlwYXNzaW5nIHRoZSByYXRlIGxpbWl0ZXIgd2hlbiBwcm92aWRlZCB3aXRoIHRoZSBza2lwS2V5IGFyZ3VtZW50JyxcbiAgICAgIGluaXRpYWw6IGRlZmF1bHRDb25maWcuc2VydmVyLnJhdGVMaW1pdGluZy5za2lwVG9rZW4udmFsdWVcbiAgICB9LFxuICAgIHtcbiAgICAgIHR5cGU6ICd0b2dnbGUnLFxuICAgICAgbmFtZTogJ3NzbC5lbmFibGUnLFxuICAgICAgbWVzc2FnZTogJ0VuYWJsZSBTU0wgcHJvdG9jb2wnLFxuICAgICAgaW5pdGlhbDogZGVmYXVsdENvbmZpZy5zZXJ2ZXIuc3NsLmVuYWJsZS52YWx1ZVxuICAgIH0sXG4gICAge1xuICAgICAgdHlwZTogJ3RvZ2dsZScsXG4gICAgICBuYW1lOiAnc3NsLmZvcmNlJyxcbiAgICAgIG1lc3NhZ2U6ICdGb3JjZSBzZXJ2aW5nIG9ubHkgb3ZlciBIVFRQUycsXG4gICAgICBpbml0aWFsOiBkZWZhdWx0Q29uZmlnLnNlcnZlci5zc2wuZm9yY2UudmFsdWVcbiAgICB9LFxuICAgIHtcbiAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgbmFtZTogJ3NzbC5wb3J0JyxcbiAgICAgIG1lc3NhZ2U6ICdTU0wgc2VydmVyIHBvcnQnLFxuICAgICAgaW5pdGlhbDogZGVmYXVsdENvbmZpZy5zZXJ2ZXIuc3NsLnBvcnQudmFsdWVcbiAgICB9LFxuICAgIHtcbiAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgIG5hbWU6ICdzc2wuY2VydFBhdGgnLFxuICAgICAgbWVzc2FnZTogJ1RoZSBwYXRoIHRvIGZpbmQgdGhlIFNTTCBjZXJ0aWZpY2F0ZS9rZXknLFxuICAgICAgaW5pdGlhbDogZGVmYXVsdENvbmZpZy5zZXJ2ZXIuc3NsLmNlcnRQYXRoLnZhbHVlXG4gICAgfVxuICBdLFxuICBwb29sOiBbXG4gICAge1xuICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICBuYW1lOiAnbWluV29ya2VycycsXG4gICAgICBtZXNzYWdlOiAnVGhlIGluaXRpYWwgbnVtYmVyIG9mIHdvcmtlcnMgdG8gc3Bhd24nLFxuICAgICAgaW5pdGlhbDogZGVmYXVsdENvbmZpZy5wb29sLm1pbldvcmtlcnMudmFsdWVcbiAgICB9LFxuICAgIHtcbiAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgbmFtZTogJ21heFdvcmtlcnMnLFxuICAgICAgbWVzc2FnZTogJ1RoZSBtYXhpbXVtIG51bWJlciBvZiB3b3JrZXJzIHRvIHNwYXduJyxcbiAgICAgIGluaXRpYWw6IGRlZmF1bHRDb25maWcucG9vbC5tYXhXb3JrZXJzLnZhbHVlXG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgIG5hbWU6ICd3b3JrTGltaXQnLFxuICAgICAgbWVzc2FnZTpcbiAgICAgICAgJ1RoZSBwaWVjZXMgb2Ygd29yayB0aGF0IGNhbiBiZSBwZXJmb3JtZWQgYmVmb3JlIHJlc3RhcnRpbmcgYSBQdXBwZXRlZXIgcHJvY2VzcycsXG4gICAgICBpbml0aWFsOiBkZWZhdWx0Q29uZmlnLnBvb2wud29ya0xpbWl0LnZhbHVlXG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgIG5hbWU6ICdhY3F1aXJlVGltZW91dCcsXG4gICAgICBtZXNzYWdlOiAnVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCBmb3IgYWNxdWlyaW5nIGEgcmVzb3VyY2UnLFxuICAgICAgaW5pdGlhbDogZGVmYXVsdENvbmZpZy5wb29sLmFjcXVpcmVUaW1lb3V0LnZhbHVlXG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgIG5hbWU6ICdjcmVhdGVUaW1lb3V0JyxcbiAgICAgIG1lc3NhZ2U6ICdUaGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcyB0byB3YWl0IGZvciBjcmVhdGluZyBhIHJlc291cmNlJyxcbiAgICAgIGluaXRpYWw6IGRlZmF1bHRDb25maWcucG9vbC5jcmVhdGVUaW1lb3V0LnZhbHVlXG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgIG5hbWU6ICdkZXN0cm95VGltZW91dCcsXG4gICAgICBtZXNzYWdlOiAnVGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgdG8gd2FpdCBmb3IgZGVzdHJveWluZyBhIHJlc291cmNlJyxcbiAgICAgIGluaXRpYWw6IGRlZmF1bHRDb25maWcucG9vbC5kZXN0cm95VGltZW91dC52YWx1ZVxuICAgIH0sXG4gICAge1xuICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICBuYW1lOiAnaWRsZVRpbWVvdXQnLFxuICAgICAgbWVzc2FnZTogJ1RoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGFmdGVyIGFuIGlkbGUgcmVzb3VyY2UgaXMgZGVzdHJveWVkJyxcbiAgICAgIGluaXRpYWw6IGRlZmF1bHRDb25maWcucG9vbC5pZGxlVGltZW91dC52YWx1ZVxuICAgIH0sXG4gICAge1xuICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICBuYW1lOiAnY3JlYXRlUmV0cnlJbnRlcnZhbCcsXG4gICAgICBtZXNzYWdlOlxuICAgICAgICAnVGhlIHJldHJ5IGludGVydmFsIGluIG1pbGxpc2Vjb25kcyBhZnRlciBhIGNyZWF0ZSBwcm9jZXNzIGZhaWxzJyxcbiAgICAgIGluaXRpYWw6IGRlZmF1bHRDb25maWcucG9vbC5jcmVhdGVSZXRyeUludGVydmFsLnZhbHVlXG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiAnbnVtYmVyJyxcbiAgICAgIG5hbWU6ICdyZWFwZXJJbnRlcnZhbCcsXG4gICAgICBtZXNzYWdlOlxuICAgICAgICAnVGhlIHJlYXBlciBpbnRlcnZhbCBpbiBtaWxsaXNlY29uZHMgYWZ0ZXIgdHJpZ2dlcmluZyB0aGUgY2hlY2sgZm9yIGlkbGUgcmVzb3VyY2VzIHRvIGRlc3Ryb3knLFxuICAgICAgaW5pdGlhbDogZGVmYXVsdENvbmZpZy5wb29sLnJlYXBlckludGVydmFsLnZhbHVlXG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiAndG9nZ2xlJyxcbiAgICAgIG5hbWU6ICdiZW5jaG1hcmtpbmcnLFxuICAgICAgbWVzc2FnZTogJ0VuYWJsZSBiZW5jaG1hcmtpbmcgZm9yIGEgcmVzb3VyY2UgcG9vbCcsXG4gICAgICBpbml0aWFsOiBkZWZhdWx0Q29uZmlnLnBvb2wuYmVuY2htYXJraW5nLnZhbHVlXG4gICAgfVxuICBdLFxuICBsb2dnaW5nOiBbXG4gICAge1xuICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICBuYW1lOiAnbGV2ZWwnLFxuICAgICAgbWVzc2FnZTpcbiAgICAgICAgJ1RoZSBsb2cgbGV2ZWwgKDA6IHNpbGVudCwgMTogZXJyb3IsIDI6IHdhcm5pbmcsIDM6IG5vdGljZSwgNDogdmVyYm9zZSwgNTogYmVuY2htYXJrKScsXG4gICAgICBpbml0aWFsOiBkZWZhdWx0Q29uZmlnLmxvZ2dpbmcubGV2ZWwudmFsdWUsXG4gICAgICByb3VuZDogMCxcbiAgICAgIG1pbjogMCxcbiAgICAgIG1heDogNVxuICAgIH0sXG4gICAge1xuICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgbmFtZTogJ2ZpbGUnLFxuICAgICAgbWVzc2FnZTpcbiAgICAgICAgJ0EgbG9nIGZpbGUgbmFtZS4gU2V0IHdpdGggLS10b0ZpbGUgYW5kIC0tbG9nRGVzdCB0byBlbmFibGUgZmlsZSBsb2dnaW5nJyxcbiAgICAgIGluaXRpYWw6IGRlZmF1bHRDb25maWcubG9nZ2luZy5maWxlLnZhbHVlXG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiAndGV4dCcsXG4gICAgICBuYW1lOiAnZGVzdCcsXG4gICAgICBtZXNzYWdlOiAnVGhlIHBhdGggdG8gYSBsb2cgZmlsZSB3aGVuIHRoZSBmaWxlIGxvZ2dpbmcgaXMgZW5hYmxlZCcsXG4gICAgICBpbml0aWFsOiBkZWZhdWx0Q29uZmlnLmxvZ2dpbmcuZGVzdC52YWx1ZVxuICAgIH0sXG4gICAge1xuICAgICAgdHlwZTogJ3RvZ2dsZScsXG4gICAgICBuYW1lOiAndG9Db25zb2xlJyxcbiAgICAgIG1lc3NhZ2U6ICdFbmFibGUgbG9nZ2luZyB0byB0aGUgY29uc29sZScsXG4gICAgICBpbml0aWFsOiBkZWZhdWx0Q29uZmlnLmxvZ2dpbmcudG9Db25zb2xlLnZhbHVlXG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiAndG9nZ2xlJyxcbiAgICAgIG5hbWU6ICd0b0ZpbGUnLFxuICAgICAgbWVzc2FnZTogJ0VuYWJsZXMgbG9nZ2luZyB0byBhIGZpbGUnLFxuICAgICAgaW5pdGlhbDogZGVmYXVsdENvbmZpZy5sb2dnaW5nLnRvRmlsZS52YWx1ZVxuICAgIH1cbiAgXSxcbiAgdWk6IFtcbiAgICB7XG4gICAgICB0eXBlOiAndG9nZ2xlJyxcbiAgICAgIG5hbWU6ICdlbmFibGUnLFxuICAgICAgbWVzc2FnZTogJ0VuYWJsZSBVSSBmb3IgdGhlIGV4cG9ydCBzZXJ2ZXInLFxuICAgICAgaW5pdGlhbDogZGVmYXVsdENvbmZpZy51aS5lbmFibGUudmFsdWVcbiAgICB9LFxuICAgIHtcbiAgICAgIHR5cGU6ICd0ZXh0JyxcbiAgICAgIG5hbWU6ICdyb3V0ZScsXG4gICAgICBtZXNzYWdlOiAnQSByb3V0ZSB0byBhdHRhY2ggdGhlIFVJJyxcbiAgICAgIGluaXRpYWw6IGRlZmF1bHRDb25maWcudWkucm91dGUudmFsdWVcbiAgICB9XG4gIF0sXG4gIG90aGVyOiBbXG4gICAge1xuICAgICAgdHlwZTogJ3RleHQnLFxuICAgICAgbmFtZTogJ25vZGVFbnYnLFxuICAgICAgbWVzc2FnZTogJ1RoZSB0eXBlIG9mIE5vZGUuanMgZW52aXJvbm1lbnQnLFxuICAgICAgaW5pdGlhbDogZGVmYXVsdENvbmZpZy5vdGhlci5ub2RlRW52LnZhbHVlXG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiAndG9nZ2xlJyxcbiAgICAgIG5hbWU6ICdsaXN0ZW5Ub1Byb2Nlc3NFeGl0cycsXG4gICAgICBtZXNzYWdlOiAnU2V0IHRvIGZhbHNlIHRvIHNraXAgYXR0YWNoaW5nIHByb2Nlc3MuZXhpdCBoYW5kbGVycycsXG4gICAgICBpbml0aWFsOiBkZWZhdWx0Q29uZmlnLm90aGVyLmxpc3RlblRvUHJvY2Vzc0V4aXRzLnZhbHVlXG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiAndG9nZ2xlJyxcbiAgICAgIG5hbWU6ICdub0xvZ28nLFxuICAgICAgbWVzc2FnZTogJ1NraXAgcHJpbnRpbmcgdGhlIGxvZ28gb24gc3RhcnR1cC4gUmVwbGFjZWQgYnkgc2ltcGxlIHRleHQnLFxuICAgICAgaW5pdGlhbDogZGVmYXVsdENvbmZpZy5vdGhlci5ub0xvZ28udmFsdWVcbiAgICB9LFxuICAgIHtcbiAgICAgIHR5cGU6ICd0b2dnbGUnLFxuICAgICAgbmFtZTogJ2hhcmRSZXNldFBhZ2UnLFxuICAgICAgbWVzc2FnZTogJ0RlY2lkZXMgaWYgdGhlIHBhZ2UgY29udGVudCBzaG91bGQgYmUgcmVzZXQgZW50aXJlbHknLFxuICAgICAgaW5pdGlhbDogZGVmYXVsdENvbmZpZy5vdGhlci5oYXJkUmVzZXRQYWdlLnZhbHVlXG4gICAgfSxcbiAgICB7XG4gICAgICB0eXBlOiAndG9nZ2xlJyxcbiAgICAgIG5hbWU6ICdicm93c2VyU2hlbGxNb2RlJyxcbiAgICAgIG1lc3NhZ2U6ICdEZWNpZGVzIGlmIHRoZSBicm93c2VyIHJ1bnMgaW4gdGhlIHNoZWxsIG1vZGUnLFxuICAgICAgaW5pdGlhbDogZGVmYXVsdENvbmZpZy5vdGhlci5icm93c2VyU2hlbGxNb2RlLnZhbHVlXG4gICAgfVxuICBdLFxuICBkZWJ1ZzogW1xuICAgIHtcbiAgICAgIHR5cGU6ICd0b2dnbGUnLFxuICAgICAgbmFtZTogJ2VuYWJsZScsXG4gICAgICBtZXNzYWdlOiAnRW5hYmxlcyBkZWJ1ZyBtb2RlIGZvciB0aGUgYnJvd3NlciBpbnN0YW5jZScsXG4gICAgICBpbml0aWFsOiBkZWZhdWx0Q29uZmlnLmRlYnVnLmVuYWJsZS52YWx1ZVxuICAgIH0sXG4gICAge1xuICAgICAgdHlwZTogJ3RvZ2dsZScsXG4gICAgICBuYW1lOiAnaGVhZGxlc3MnLFxuICAgICAgbWVzc2FnZTogJ1RoZSBtb2RlIHNldHRpbmcgZm9yIHRoZSBicm93c2VyJyxcbiAgICAgIGluaXRpYWw6IGRlZmF1bHRDb25maWcuZGVidWcuaGVhZGxlc3MudmFsdWVcbiAgICB9LFxuICAgIHtcbiAgICAgIHR5cGU6ICd0b2dnbGUnLFxuICAgICAgbmFtZTogJ2RldnRvb2xzJyxcbiAgICAgIG1lc3NhZ2U6ICdUaGUgRGV2VG9vbHMgZm9yIHRoZSBoZWFkZnVsIGJyb3dzZXInLFxuICAgICAgaW5pdGlhbDogZGVmYXVsdENvbmZpZy5kZWJ1Zy5kZXZ0b29scy52YWx1ZVxuICAgIH0sXG4gICAge1xuICAgICAgdHlwZTogJ3RvZ2dsZScsXG4gICAgICBuYW1lOiAnbGlzdGVuVG9Db25zb2xlJyxcbiAgICAgIG1lc3NhZ2U6ICdUaGUgZXZlbnQgbGlzdGVuZXIgZm9yIGNvbnNvbGUgbWVzc2FnZXMgZnJvbSB0aGUgYnJvd3NlcicsXG4gICAgICBpbml0aWFsOiBkZWZhdWx0Q29uZmlnLmRlYnVnLmxpc3RlblRvQ29uc29sZS52YWx1ZVxuICAgIH0sXG4gICAge1xuICAgICAgdHlwZTogJ3RvZ2dsZScsXG4gICAgICBuYW1lOiAnZHVtcGlvJyxcbiAgICAgIG1lc3NhZ2U6ICdSZWRpcmVjdHMgdGhlIGJyb3dzZXIgc3Rkb3V0IGFuZCBzdGRlcnIgdG8gTm9kZUpTIHByb2Nlc3MnLFxuICAgICAgaW5pdGlhbDogZGVmYXVsdENvbmZpZy5kZWJ1Zy5kdW1waW8udmFsdWVcbiAgICB9LFxuICAgIHtcbiAgICAgIHR5cGU6ICdudW1iZXInLFxuICAgICAgbmFtZTogJ3Nsb3dNbycsXG4gICAgICBtZXNzYWdlOiAnUHVwcGV0ZWVyIG9wZXJhdGlvbnMgc2xvdyBkb3duIGluIG1pbGxpc2Vjb25kcycsXG4gICAgICBpbml0aWFsOiBkZWZhdWx0Q29uZmlnLmRlYnVnLnNsb3dNby52YWx1ZVxuICAgIH0sXG4gICAge1xuICAgICAgdHlwZTogJ251bWJlcicsXG4gICAgICBuYW1lOiAnZGVidWdnaW5nUG9ydCcsXG4gICAgICBtZXNzYWdlOiAnVGhlIHBvcnQgbnVtYmVyIGZvciBkZWJ1Z2dpbmcnLFxuICAgICAgaW5pdGlhbDogZGVmYXVsdENvbmZpZy5kZWJ1Zy5kZWJ1Z2dpbmdQb3J0LnZhbHVlXG4gICAgfVxuICBdXG59O1xuXG4vLyBBYnNvbHV0ZSBwcm9wcyB0aGF0LCBpbiBjYXNlIG9mIG1lcmdpbmcgcmVjdXJzaXZlbHksIG5lZWQgdG8gYmUgZm9yY2UgbWVyZ2VkXG5leHBvcnQgY29uc3QgYWJzb2x1dGVQcm9wcyA9IFtcbiAgJ29wdGlvbnMnLFxuICAnZ2xvYmFsT3B0aW9ucycsXG4gICd0aGVtZU9wdGlvbnMnLFxuICAncmVzb3VyY2VzJyxcbiAgJ3BheWxvYWQnXG5dO1xuXG4vLyBBcmd1bWVudCBuZXN0aW5nIGxldmVsIG9mIGFsbCBleHBvcnQgc2VydmVyIG9wdGlvbnNcbmV4cG9ydCBjb25zdCBuZXN0ZWRBcmdzID0ge307XG5cbi8qKlxuICogUmVjdXJzaXZlbHkgY3JlYXRlcyBhIGNoYWluIG9mIG5lc3RlZCBhcmd1bWVudHMgZnJvbSBhbiBvYmplY3QuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iaiAtIFRoZSBvYmplY3QgY29udGFpbmluZyBuZXN0ZWQgYXJndW1lbnRzLlxuICogQHBhcmFtIHtzdHJpbmd9IHByb3BDaGFpbiAtIFRoZSBjdXJyZW50IGNoYWluIG9mIG5lc3RlZCBwcm9wZXJ0aWVzXG4gKiAodXNlZCBpbnRlcm5hbGx5IGR1cmluZyByZWN1cnNpb24pLlxuICovXG5jb25zdCBjcmVhdGVOZXN0ZWRBcmdzID0gKG9iaiwgcHJvcENoYWluID0gJycpID0+IHtcbiAgT2JqZWN0LmtleXMob2JqKS5mb3JFYWNoKChrKSA9PiB7XG4gICAgaWYgKCFbJ3B1cHBldGVlcicsICdoaWdoY2hhcnRzJ10uaW5jbHVkZXMoaykpIHtcbiAgICAgIGNvbnN0IGVudHJ5ID0gb2JqW2tdO1xuICAgICAgaWYgKHR5cGVvZiBlbnRyeS52YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgLy8gR28gZGVlcGVyIGluIHRoZSBuZXN0ZWQgYXJndW1lbnRzXG4gICAgICAgIGNyZWF0ZU5lc3RlZEFyZ3MoZW50cnksIGAke3Byb3BDaGFpbn0uJHtrfWApO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gQ3JlYXRlIHRoZSBjaGFpbiBvZiBuZXN0ZWQgYXJndW1lbnRzXG4gICAgICAgIG5lc3RlZEFyZ3NbZW50cnkuY2xpTmFtZSB8fCBrXSA9IGAke3Byb3BDaGFpbn0uJHtrfWAuc3Vic3RyaW5nKDEpO1xuXG4gICAgICAgIC8vIFN1cHBvcnQgZm9yIHRoZSBsZWdhY3ksIFBoYW50b21KUyBwcm9wZXJ0aWVzIG5hbWVzXG4gICAgICAgIGlmIChlbnRyeS5sZWdhY3lOYW1lICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICBuZXN0ZWRBcmdzW2VudHJ5LmxlZ2FjeU5hbWVdID0gYCR7cHJvcENoYWlufS4ke2t9YC5zdWJzdHJpbmcoMSk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH0pO1xufTtcblxuY3JlYXRlTmVzdGVkQXJncyhkZWZhdWx0Q29uZmlnKTtcbiIsIi8qKlxuICogQGZpbGVvdmVydmlld1xuICogVGhpcyBmaWxlIGlzIHJlc3BvbnNpYmxlIGZvciBwYXJzaW5nIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgd2l0aCB0aGUgJ3pvZCdcbiAqIGxpYnJhcnkuIFRoZSBwYXJzZWQgZW52aXJvbm1lbnQgdmFyaWFibGVzIGFyZSB0aGVuIGV4cG9ydGVkIHRvIGJlIHVzZWRcbiAqIGluIHRoZSBhcHBsaWNhdGlvbiBhcyBcImVudnNcIi4gV2Ugc2hvdWxkIG5vdCB1c2UgcHJvY2Vzcy5lbnYgZGlyZWN0bHlcbiAqIGluIHRoZSBhcHBsaWNhdGlvbiBhcyB0aGVzZSB3b3VsZCBub3QgYmUgcGFyc2VkIHByb3Blcmx5LlxuICpcbiAqIFRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIHBhcnNlZCBhbmQgdmFsaWRhdGVkIG9ubHkgb25jZSB3aGVuXG4gKiB0aGUgYXBwbGljYXRpb24gc3RhcnRzLiBXZSBzaG91bGQgd3JpdGUgYSBjdXN0b20gdmFsaWRhdG9yIG9yIGEgdHJhbnNmb3JtZXJcbiAqIGZvciBlYWNoIG9mIHRoZSBvcHRpb25zLlxuICovXG5cbmltcG9ydCBkb3RlbnYgZnJvbSAnZG90ZW52JztcbmltcG9ydCB7IHogfSBmcm9tICd6b2QnO1xuXG5pbXBvcnQgeyBzY3JpcHRzTmFtZXMgfSBmcm9tICcuL3NjaGVtYXMvY29uZmlnLmpzJztcblxuLy8gTG9hZCAuZW52IGludG8gZW52aXJvbm1lbnQgdmFyaWFibGVzXG5kb3RlbnYuY29uZmlnKCk7XG5cbi8vIE9iamVjdCB3aXRoIGN1c3RvbSB2YWxpZGF0b3JzIGFuZCB0cmFuc2Zvcm1lcnMsIHRvIGF2b2lkIHJlcGV0aXRpb25cbi8vIGluIHRoZSBDb25maWcgb2JqZWN0XG5jb25zdCB2ID0ge1xuICAvLyBTcGxpdHMgc3RyaW5nIHZhbHVlIGludG8gZWxlbWVudHMgaW4gYW4gYXJyYXksIHRyaW1zIGV2ZXJ5IGVsZW1lbnQsIGNoZWNrc1xuICAvLyBpZiBhbiBhcnJheSBpcyBjb3JyZWN0LCBpZiBpdCBpcyBlbXB0eSwgYW5kIGlmIGl0IGlzLCByZXR1cm5zIHVuZGVmaW5lZFxuICBhcnJheTogKGZpbHRlckFycmF5KSA9PlxuICAgIHpcbiAgICAgIC5zdHJpbmcoKVxuICAgICAgLnRyYW5zZm9ybSgodmFsdWUpID0+XG4gICAgICAgIHZhbHVlXG4gICAgICAgICAgLnNwbGl0KCcsJylcbiAgICAgICAgICAubWFwKCh2YWx1ZSkgPT4gdmFsdWUudHJpbSgpKVxuICAgICAgICAgIC5maWx0ZXIoKHZhbHVlKSA9PiBmaWx0ZXJBcnJheS5pbmNsdWRlcyh2YWx1ZSkpXG4gICAgICApXG4gICAgICAudHJhbnNmb3JtKCh2YWx1ZSkgPT4gKHZhbHVlLmxlbmd0aCA/IHZhbHVlIDogdW5kZWZpbmVkKSksXG5cbiAgLy8gQWxsb3dzIG9ubHkgdHJ1ZSwgZmFsc2UgYW5kIGNvcnJlY3RseSBwYXJzZSB0aGUgdmFsdWUgdG8gYm9vbGVhblxuICAvLyBvciBubyB2YWx1ZSBpbiB3aGljaCBjYXNlIHRoZSByZXR1cm5lZCB2YWx1ZSB3aWxsIGJlIHVuZGVmaW5lZFxuICBib29sZWFuOiAoKSA9PlxuICAgIHpcbiAgICAgIC5lbnVtKFsndHJ1ZScsICdmYWxzZScsICcnXSlcbiAgICAgIC50cmFuc2Zvcm0oKHZhbHVlKSA9PiAodmFsdWUgIT09ICcnID8gdmFsdWUgPT09ICd0cnVlJyA6IHVuZGVmaW5lZCkpLFxuXG4gIC8vIEFsbG93cyBwYXNzZWQgdmFsdWVzIG9yIG5vIHZhbHVlIGluIHdoaWNoIGNhc2UgdGhlIHJldHVybmVkIHZhbHVlIHdpbGxcbiAgLy8gYmUgdW5kZWZpbmVkXG4gIGVudW06ICh2YWx1ZXMpID0+XG4gICAgelxuICAgICAgLmVudW0oWy4uLnZhbHVlcywgJyddKVxuICAgICAgLnRyYW5zZm9ybSgodmFsdWUpID0+ICh2YWx1ZSAhPT0gJycgPyB2YWx1ZSA6IHVuZGVmaW5lZCkpLFxuXG4gIC8vIFRyaW1zIHRoZSBzdHJpbmcgdmFsdWUgYW5kIGNoZWNrcyBpZiBpdCBpcyBlbXB0eSBvciBjb250YWlucyBzdHJpbmdpZmllZFxuICAvLyB2YWx1ZXMgc3VjaCBhcyBmYWxzZSwgdW5kZWZpbmVkLCBudWxsLCBOYU4sIGlmIGl0IGRvZXMsIHJldHVybnMgdW5kZWZpbmVkXG4gIHN0cmluZzogKCkgPT5cbiAgICB6XG4gICAgICAuc3RyaW5nKClcbiAgICAgIC50cmltKClcbiAgICAgIC5yZWZpbmUoXG4gICAgICAgICh2YWx1ZSkgPT5cbiAgICAgICAgICAhWydmYWxzZScsICd1bmRlZmluZWQnLCAnbnVsbCcsICdOYU4nXS5pbmNsdWRlcyh2YWx1ZSkgfHxcbiAgICAgICAgICB2YWx1ZSA9PT0gJycsXG4gICAgICAgICh2YWx1ZSkgPT4gKHtcbiAgICAgICAgICBtZXNzYWdlOiBgVGhlIHN0cmluZyBjb250YWlucyBmb3JiaWRkZW4gdmFsdWVzLCByZWNlaXZlZCAnJHt2YWx1ZX0nYFxuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnRyYW5zZm9ybSgodmFsdWUpID0+ICh2YWx1ZSAhPT0gJycgPyB2YWx1ZSA6IHVuZGVmaW5lZCkpLFxuXG4gIC8vIEFsbG93cyBwb3NpdGl2ZSBudW1iZXJzIG9yIG5vIHZhbHVlIGluIHdoaWNoIGNhc2UgdGhlIHJldHVybmVkIHZhbHVlIHdpbGxcbiAgLy8gYmUgdW5kZWZpbmVkXG4gIHBvc2l0aXZlTnVtOiAoKSA9PlxuICAgIHpcbiAgICAgIC5zdHJpbmcoKVxuICAgICAgLnRyaW0oKVxuICAgICAgLnJlZmluZShcbiAgICAgICAgKHZhbHVlKSA9PlxuICAgICAgICAgIHZhbHVlID09PSAnJyB8fCAoIWlzTmFOKHBhcnNlRmxvYXQodmFsdWUpKSAmJiBwYXJzZUZsb2F0KHZhbHVlKSA+IDApLFxuICAgICAgICAodmFsdWUpID0+ICh7XG4gICAgICAgICAgbWVzc2FnZTogYFRoZSB2YWx1ZSBtdXN0IGJlIG51bWVyaWMgYW5kIHBvc2l0aXZlLCByZWNlaXZlZCAnJHt2YWx1ZX0nYFxuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnRyYW5zZm9ybSgodmFsdWUpID0+ICh2YWx1ZSAhPT0gJycgPyBwYXJzZUZsb2F0KHZhbHVlKSA6IHVuZGVmaW5lZCkpLFxuXG4gIC8vIEFsbG93cyBub24tbmVnYXRpdmUgbnVtYmVycyBvciBubyB2YWx1ZSBpbiB3aGljaCBjYXNlIHRoZSByZXR1cm5lZCB2YWx1ZVxuICAvLyB3aWxsIGJlIHVuZGVmaW5lZFxuICBub25OZWdhdGl2ZU51bTogKCkgPT5cbiAgICB6XG4gICAgICAuc3RyaW5nKClcbiAgICAgIC50cmltKClcbiAgICAgIC5yZWZpbmUoXG4gICAgICAgICh2YWx1ZSkgPT5cbiAgICAgICAgICB2YWx1ZSA9PT0gJycgfHwgKCFpc05hTihwYXJzZUZsb2F0KHZhbHVlKSkgJiYgcGFyc2VGbG9hdCh2YWx1ZSkgPj0gMCksXG4gICAgICAgICh2YWx1ZSkgPT4gKHtcbiAgICAgICAgICBtZXNzYWdlOiBgVGhlIHZhbHVlIG11c3QgYmUgbnVtZXJpYyBhbmQgbm9uLW5lZ2F0aXZlLCByZWNlaXZlZCAnJHt2YWx1ZX0nYFxuICAgICAgICB9KVxuICAgICAgKVxuICAgICAgLnRyYW5zZm9ybSgodmFsdWUpID0+ICh2YWx1ZSAhPT0gJycgPyBwYXJzZUZsb2F0KHZhbHVlKSA6IHVuZGVmaW5lZCkpXG59O1xuXG5leHBvcnQgY29uc3QgQ29uZmlnID0gei5vYmplY3Qoe1xuICAvLyBoaWdoY2hhcnRzXG4gIEhJR0hDSEFSVFNfVkVSU0lPTjogelxuICAgIC5zdHJpbmcoKVxuICAgIC50cmltKClcbiAgICAucmVmaW5lKFxuICAgICAgKHZhbHVlKSA9PiAvXihsYXRlc3R8XFxkKyhcXC5cXGQrKXswLDJ9KSQvLnRlc3QodmFsdWUpIHx8IHZhbHVlID09PSAnJyxcbiAgICAgICh2YWx1ZSkgPT4gKHtcbiAgICAgICAgbWVzc2FnZTogYEhJR0hDSEFSVFNfVkVSU0lPTiBtdXN0IGJlICdsYXRlc3QnLCBhIG1ham9yIHZlcnNpb24sIG9yIGluIHRoZSBmb3JtIFhYLllZLlpaLCByZWNlaXZlZCAnJHt2YWx1ZX0nYFxuICAgICAgfSlcbiAgICApXG4gICAgLnRyYW5zZm9ybSgodmFsdWUpID0+ICh2YWx1ZSAhPT0gJycgPyB2YWx1ZSA6IHVuZGVmaW5lZCkpLFxuICBISUdIQ0hBUlRTX0NETl9VUkw6IHpcbiAgICAuc3RyaW5nKClcbiAgICAudHJpbSgpXG4gICAgLnJlZmluZShcbiAgICAgICh2YWx1ZSkgPT5cbiAgICAgICAgdmFsdWUuc3RhcnRzV2l0aCgnaHR0cHM6Ly8nKSB8fFxuICAgICAgICB2YWx1ZS5zdGFydHNXaXRoKCdodHRwOi8vJykgfHxcbiAgICAgICAgdmFsdWUgPT09ICcnLFxuICAgICAgKHZhbHVlKSA9PiAoe1xuICAgICAgICBtZXNzYWdlOiBgSW52YWxpZCB2YWx1ZSBmb3IgSElHSENIQVJUU19DRE5fVVJMLiBJdCBzaG91bGQgc3RhcnQgd2l0aCBodHRwOi8vIG9yIGh0dHBzOi8vLCByZWNlaXZlZCAnJHt2YWx1ZX0nYFxuICAgICAgfSlcbiAgICApXG4gICAgLnRyYW5zZm9ybSgodmFsdWUpID0+ICh2YWx1ZSAhPT0gJycgPyB2YWx1ZSA6IHVuZGVmaW5lZCkpLFxuICBISUdIQ0hBUlRTX0NPUkVfU0NSSVBUUzogdi5hcnJheShzY3JpcHRzTmFtZXMuY29yZSksXG4gIEhJR0hDSEFSVFNfTU9EVUxFX1NDUklQVFM6IHYuYXJyYXkoc2NyaXB0c05hbWVzLm1vZHVsZXMpLFxuICBISUdIQ0hBUlRTX0lORElDQVRPUl9TQ1JJUFRTOiB2LmFycmF5KHNjcmlwdHNOYW1lcy5pbmRpY2F0b3JzKSxcbiAgSElHSENIQVJUU19GT1JDRV9GRVRDSDogdi5ib29sZWFuKCksXG4gIEhJR0hDSEFSVFNfQ0FDSEVfUEFUSDogdi5zdHJpbmcoKSxcbiAgSElHSENIQVJUU19BRE1JTl9UT0tFTjogdi5zdHJpbmcoKSxcblxuICAvLyBleHBvcnRcbiAgRVhQT1JUX1RZUEU6IHYuZW51bShbJ2pwZWcnLCAncG5nJywgJ3BkZicsICdzdmcnXSksXG4gIEVYUE9SVF9DT05TVFI6IHYuZW51bShbJ2NoYXJ0JywgJ3N0b2NrQ2hhcnQnLCAnbWFwQ2hhcnQnLCAnZ2FudHRDaGFydCddKSxcbiAgRVhQT1JUX0RFRkFVTFRfSEVJR0hUOiB2LnBvc2l0aXZlTnVtKCksXG4gIEVYUE9SVF9ERUZBVUxUX1dJRFRIOiB2LnBvc2l0aXZlTnVtKCksXG4gIEVYUE9SVF9ERUZBVUxUX1NDQUxFOiB2LnBvc2l0aXZlTnVtKCksXG4gIEVYUE9SVF9SQVNURVJJWkFUSU9OX1RJTUVPVVQ6IHYubm9uTmVnYXRpdmVOdW0oKSxcblxuICAvLyBjdXN0b21cbiAgQ1VTVE9NX0xPR0lDX0FMTE9XX0NPREVfRVhFQ1VUSU9OOiB2LmJvb2xlYW4oKSxcbiAgQ1VTVE9NX0xPR0lDX0FMTE9XX0ZJTEVfUkVTT1VSQ0VTOiB2LmJvb2xlYW4oKSxcblxuICAvLyBzZXJ2ZXJcbiAgU0VSVkVSX0VOQUJMRTogdi5ib29sZWFuKCksXG4gIFNFUlZFUl9IT1NUOiB2LnN0cmluZygpLFxuICBTRVJWRVJfUE9SVDogdi5wb3NpdGl2ZU51bSgpLFxuICBTRVJWRVJfQkVOQ0hNQVJLSU5HOiB2LmJvb2xlYW4oKSxcblxuICAvLyBzZXJ2ZXIgcHJveHlcbiAgU0VSVkVSX1BST1hZX0hPU1Q6IHYuc3RyaW5nKCksXG4gIFNFUlZFUl9QUk9YWV9QT1JUOiB2LnBvc2l0aXZlTnVtKCksXG4gIFNFUlZFUl9QUk9YWV9VU0VSTkFNRTogdi5zdHJpbmcoKSxcbiAgU0VSVkVSX1BST1hZX1BBU1NXT1JEOiB2LnN0cmluZygpLFxuICBTRVJWRVJfUFJPWFlfVElNRU9VVDogdi5ub25OZWdhdGl2ZU51bSgpLFxuXG4gIC8vIHNlcnZlciByYXRlIGxpbWl0aW5nXG4gIFNFUlZFUl9SQVRFX0xJTUlUSU5HX0VOQUJMRTogdi5ib29sZWFuKCksXG4gIFNFUlZFUl9SQVRFX0xJTUlUSU5HX01BWF9SRVFVRVNUUzogdi5ub25OZWdhdGl2ZU51bSgpLFxuICBTRVJWRVJfUkFURV9MSU1JVElOR19XSU5ET1c6IHYubm9uTmVnYXRpdmVOdW0oKSxcbiAgU0VSVkVSX1JBVEVfTElNSVRJTkdfREVMQVk6IHYubm9uTmVnYXRpdmVOdW0oKSxcbiAgU0VSVkVSX1JBVEVfTElNSVRJTkdfVFJVU1RfUFJPWFk6IHYuYm9vbGVhbigpLFxuICBTRVJWRVJfUkFURV9MSU1JVElOR19TS0lQX0tFWTogdi5zdHJpbmcoKSxcbiAgU0VSVkVSX1JBVEVfTElNSVRJTkdfU0tJUF9UT0tFTjogdi5zdHJpbmcoKSxcblxuICAvLyBzZXJ2ZXIgc3NsXG4gIFNFUlZFUl9TU0xfRU5BQkxFOiB2LmJvb2xlYW4oKSxcbiAgU0VSVkVSX1NTTF9GT1JDRTogdi5ib29sZWFuKCksXG4gIFNFUlZFUl9TU0xfUE9SVDogdi5wb3NpdGl2ZU51bSgpLFxuICBTRVJWRVJfU1NMX0NFUlRfUEFUSDogdi5zdHJpbmcoKSxcblxuICAvLyBwb29sXG4gIFBPT0xfTUlOX1dPUktFUlM6IHYubm9uTmVnYXRpdmVOdW0oKSxcbiAgUE9PTF9NQVhfV09SS0VSUzogdi5ub25OZWdhdGl2ZU51bSgpLFxuICBQT09MX1dPUktfTElNSVQ6IHYucG9zaXRpdmVOdW0oKSxcbiAgUE9PTF9BQ1FVSVJFX1RJTUVPVVQ6IHYubm9uTmVnYXRpdmVOdW0oKSxcbiAgUE9PTF9DUkVBVEVfVElNRU9VVDogdi5ub25OZWdhdGl2ZU51bSgpLFxuICBQT09MX0RFU1RST1lfVElNRU9VVDogdi5ub25OZWdhdGl2ZU51bSgpLFxuICBQT09MX0lETEVfVElNRU9VVDogdi5ub25OZWdhdGl2ZU51bSgpLFxuICBQT09MX0NSRUFURV9SRVRSWV9JTlRFUlZBTDogdi5ub25OZWdhdGl2ZU51bSgpLFxuICBQT09MX1JFQVBFUl9JTlRFUlZBTDogdi5ub25OZWdhdGl2ZU51bSgpLFxuICBQT09MX0JFTkNITUFSS0lORzogdi5ib29sZWFuKCksXG5cbiAgLy8gbG9nZ2VyXG4gIExPR0dJTkdfTEVWRUw6IHpcbiAgICAuc3RyaW5nKClcbiAgICAudHJpbSgpXG4gICAgLnJlZmluZShcbiAgICAgICh2YWx1ZSkgPT5cbiAgICAgICAgdmFsdWUgPT09ICcnIHx8XG4gICAgICAgICghaXNOYU4ocGFyc2VGbG9hdCh2YWx1ZSkpICYmXG4gICAgICAgICAgcGFyc2VGbG9hdCh2YWx1ZSkgPj0gMCAmJlxuICAgICAgICAgIHBhcnNlRmxvYXQodmFsdWUpIDw9IDUpLFxuICAgICAgKHZhbHVlKSA9PiAoe1xuICAgICAgICBtZXNzYWdlOiBgSW52YWxpZCB2YWx1ZSBmb3IgTE9HR0lOR19MRVZFTC4gV2Ugb25seSBhY2NlcHQgdmFsdWVzIGZyb20gMCB0byA1IGFzIGxvZ2dpbmcgbGV2ZWxzLCByZWNlaXZlZCAnJHt2YWx1ZX0nYFxuICAgICAgfSlcbiAgICApXG4gICAgLnRyYW5zZm9ybSgodmFsdWUpID0+ICh2YWx1ZSAhPT0gJycgPyBwYXJzZUZsb2F0KHZhbHVlKSA6IHVuZGVmaW5lZCkpLFxuICBMT0dHSU5HX0ZJTEU6IHYuc3RyaW5nKCksXG4gIExPR0dJTkdfREVTVDogdi5zdHJpbmcoKSxcbiAgTE9HR0lOR19UT19DT05TT0xFOiB2LmJvb2xlYW4oKSxcbiAgTE9HR0lOR19UT19GSUxFOiB2LmJvb2xlYW4oKSxcblxuICAvLyB1aVxuICBVSV9FTkFCTEU6IHYuYm9vbGVhbigpLFxuICBVSV9ST1VURTogdi5zdHJpbmcoKSxcblxuICAvLyBvdGhlclxuICBPVEhFUl9OT0RFX0VOVjogdi5lbnVtKFsnZGV2ZWxvcG1lbnQnLCAncHJvZHVjdGlvbicsICd0ZXN0J10pLFxuICBPVEhFUl9MSVNURU5fVE9fUFJPQ0VTU19FWElUUzogdi5ib29sZWFuKCksXG4gIE9USEVSX05PX0xPR086IHYuYm9vbGVhbigpLFxuICBPVEhFUl9IQVJEX1JFU0VUX1BBR0U6IHYuYm9vbGVhbigpLFxuICBPVEhFUl9CUk9XU0VSX1NIRUxMX01PREU6IHYuYm9vbGVhbigpLFxuXG4gIC8vIGRlYnVnZ2VyXG4gIERFQlVHX0VOQUJMRTogdi5ib29sZWFuKCksXG4gIERFQlVHX0hFQURMRVNTOiB2LmJvb2xlYW4oKSxcbiAgREVCVUdfREVWVE9PTFM6IHYuYm9vbGVhbigpLFxuICBERUJVR19MSVNURU5fVE9fQ09OU09MRTogdi5ib29sZWFuKCksXG4gIERFQlVHX0RVTVBJTzogdi5ib29sZWFuKCksXG4gIERFQlVHX1NMT1dfTU86IHYubm9uTmVnYXRpdmVOdW0oKSxcbiAgREVCVUdfREVCVUdHSU5HX1BPUlQ6IHYucG9zaXRpdmVOdW0oKVxufSk7XG5cbmV4cG9ydCBjb25zdCBlbnZzID0gQ29uZmlnLnBhcnRpYWwoKS5wYXJzZShwcm9jZXNzLmVudik7XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5IaWdoY2hhcnRzIEV4cG9ydCBTZXJ2ZXJcblxuQ29weXJpZ2h0IChjKSAyMDE2LTIwMjQsIEhpZ2hzb2Z0XG5cbkxpY2VuY2VkIHVuZGVyIHRoZSBNSVQgbGljZW5jZS5cblxuQWRkaXRpb25hbGx5IGEgdmFsaWQgSGlnaGNoYXJ0cyBsaWNlbnNlIGlzIHJlcXVpcmVkIGZvciB1c2UuXG5cblNlZSBMSUNFTlNFIGZpbGUgaW4gcm9vdCBmb3IgZGV0YWlscy5cblxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgYXBwZW5kRmlsZSwgZXhpc3RzU3luYywgbWtkaXJTeW5jIH0gZnJvbSAnZnMnO1xuXG4vLyBUaGUgYXZhaWxhYmxlIGNvbG9yc1xuY29uc3QgY29sb3JzID0gWydyZWQnLCAneWVsbG93JywgJ2JsdWUnLCAnZ3JheScsICdncmVlbiddO1xuXG4vLyBUaGUgZGVmYXVsdCBsb2dnaW5nIGNvbmZpZ1xubGV0IGxvZ2dpbmcgPSB7XG4gIC8vIEZsYWdzIGZvciBsb2dnaW5nIHN0YXR1c1xuICB0b0NvbnNvbGU6IHRydWUsXG4gIHRvRmlsZTogZmFsc2UsXG4gIHBhdGhDcmVhdGVkOiBmYWxzZSxcbiAgLy8gTG9nIGxldmVsc1xuICBsZXZlbHNEZXNjOiBbXG4gICAge1xuICAgICAgdGl0bGU6ICdlcnJvcicsXG4gICAgICBjb2xvcjogY29sb3JzWzBdXG4gICAgfSxcbiAgICB7XG4gICAgICB0aXRsZTogJ3dhcm5pbmcnLFxuICAgICAgY29sb3I6IGNvbG9yc1sxXVxuICAgIH0sXG4gICAge1xuICAgICAgdGl0bGU6ICdub3RpY2UnLFxuICAgICAgY29sb3I6IGNvbG9yc1syXVxuICAgIH0sXG4gICAge1xuICAgICAgdGl0bGU6ICd2ZXJib3NlJyxcbiAgICAgIGNvbG9yOiBjb2xvcnNbM11cbiAgICB9LFxuICAgIHtcbiAgICAgIHRpdGxlOiAnYmVuY2htYXJrJyxcbiAgICAgIGNvbG9yOiBjb2xvcnNbNF1cbiAgICB9XG4gIF0sXG4gIC8vIExvZyBsaXN0ZW5lcnNcbiAgbGlzdGVuZXJzOiBbXVxufTtcblxuLyoqXG4gKiBMb2dzIHRoZSBwcm92aWRlZCB0ZXh0cyB0byBhIGZpbGUsIGlmIGZpbGUgbG9nZ2luZyBpcyBlbmFibGVkLiBJdCBjcmVhdGVzXG4gKiB0aGUgbmVjZXNzYXJ5IGRpcmVjdG9yeSBzdHJ1Y3R1cmUgaWYgbm90IGFscmVhZHkgY3JlYXRlZCBhbmQgYXBwZW5kcyB0aGVcbiAqIGNvbnRlbnQsIGluY2x1ZGluZyBhbiBvcHRpb25hbCBwcmVmaXgsIHRvIHRoZSBzcGVjaWZpZWQgbG9nIGZpbGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmdbXX0gdGV4dHMgLSBBbiBhcnJheSBvZiB0ZXh0cyB0byBiZSBsb2dnZWQuXG4gKiBAcGFyYW0ge3N0cmluZ30gcHJlZml4IC0gQW4gb3B0aW9uYWwgcHJlZml4IHRvIGJlIGFkZGVkIHRvIGVhY2ggbG9nIGVudHJ5LlxuICovXG5jb25zdCBsb2dUb0ZpbGUgPSAodGV4dHMsIHByZWZpeCkgPT4ge1xuICBpZiAoIWxvZ2dpbmcucGF0aENyZWF0ZWQpIHtcbiAgICAvLyBDcmVhdGUgaWYgZG9lcyBub3QgZXhpc3RcbiAgICAhZXhpc3RzU3luYyhsb2dnaW5nLmRlc3QpICYmIG1rZGlyU3luYyhsb2dnaW5nLmRlc3QpO1xuXG4gICAgLy8gV2Ugbm93IGFzc3VtZSB0aGUgcGF0aCBpcyBhdmFpbGFibGUsIGUuZy4gaXQncyB0aGUgcmVzcG9uc2liaWxpdHlcbiAgICAvLyBvZiB0aGUgdXNlciB0byBjcmVhdGUgdGhlIHBhdGggd2l0aCB0aGUgY29ycmVjdCBhY2Nlc3MgcmlnaHRzLlxuICAgIGxvZ2dpbmcucGF0aENyZWF0ZWQgPSB0cnVlO1xuICB9XG5cbiAgLy8gQWRkIHRoZSBjb250ZW50IHRvIGEgZmlsZVxuICBhcHBlbmRGaWxlKFxuICAgIGAke2xvZ2dpbmcuZGVzdH0ke2xvZ2dpbmcuZmlsZX1gLFxuICAgIFtwcmVmaXhdLmNvbmNhdCh0ZXh0cykuam9pbignICcpICsgJ1xcbicsXG4gICAgKGVycm9yKSA9PiB7XG4gICAgICBpZiAoZXJyb3IpIHtcbiAgICAgICAgY29uc29sZS5sb2coYFtsb2dnZXJdIFVuYWJsZSB0byB3cml0ZSB0byBsb2cgZmlsZTogJHtlcnJvcn1gKTtcbiAgICAgICAgbG9nZ2luZy50b0ZpbGUgPSBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG4gICk7XG59O1xuXG4vKipcbiAqIExvZ3MgYSBtZXNzYWdlLiBBY2NlcHRzIGEgdmFyaWFibGUgYW1vdW50IG9mIGFyZ3VtZW50cy4gQXJndW1lbnRzIGFmdGVyXG4gKiBgbGV2ZWxgIHdpbGwgYmUgcGFzc2VkIGRpcmVjdGx5IHRvIGNvbnNvbGUubG9nLCBhbmQvb3Igd2lsbCBiZSBqb2luZWRcbiAqIGFuZCBhcHBlbmRlZCB0byB0aGUgbG9nIGZpbGUuXG4gKlxuICogQHBhcmFtIHthbnl9IGFyZ3MgLSBBbiBhcnJheSBvZiBhcmd1bWVudHMgd2hlcmUgdGhlIGZpcnN0IGlzIHRoZSBsb2cgbGV2ZWxcbiAqIGFuZCB0aGUgcmVzdCBhcmUgc3RyaW5ncyB0byBidWlsZCBhIG1lc3NhZ2Ugd2l0aC5cbiAqL1xuZXhwb3J0IGNvbnN0IGxvZyA9ICguLi5hcmdzKSA9PiB7XG4gIGNvbnN0IFtuZXdMZXZlbCwgLi4udGV4dHNdID0gYXJncztcblxuICAvLyBDdXJyZW50IGxvZ2dpbmcgb3B0aW9uc1xuICBjb25zdCB7IGxldmVsc0Rlc2MsIGxldmVsIH0gPSBsb2dnaW5nO1xuXG4gIC8vIENoZWNrIGlmIGxvZyBsZXZlbCBpcyB3aXRoaW4gYSBjb3JyZWN0IHJhbmdlIG9yIGlzIGEgYmVuY2htYXJrIGxvZ1xuICBpZiAoXG4gICAgbmV3TGV2ZWwgIT09IDUgJiZcbiAgICAobmV3TGV2ZWwgPT09IDAgfHwgbmV3TGV2ZWwgPiBsZXZlbCB8fCBsZXZlbCA+IGxldmVsc0Rlc2MubGVuZ3RoKVxuICApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBHZXQgcmlkIG9mIHRoZSBHTVQgdGV4dCBpbmZvcm1hdGlvblxuICBjb25zdCBuZXdEYXRlID0gbmV3IERhdGUoKS50b1N0cmluZygpLnNwbGl0KCcoJylbMF0udHJpbSgpO1xuXG4gIC8vIENyZWF0ZSBhIG1lc3NhZ2UncyBwcmVmaXhcbiAgY29uc3QgcHJlZml4ID0gYCR7bmV3RGF0ZX0gWyR7bGV2ZWxzRGVzY1tuZXdMZXZlbCAtIDFdLnRpdGxlfV0gLWA7XG5cbiAgLy8gQ2FsbCBhdmFpbGFibGUgbG9nIGxpc3RlbmVyc1xuICBsb2dnaW5nLmxpc3RlbmVycy5mb3JFYWNoKChmbikgPT4ge1xuICAgIGZuKHByZWZpeCwgdGV4dHMuam9pbignICcpKTtcbiAgfSk7XG5cbiAgLy8gTG9nIHRvIGNvbnNvbGVcbiAgaWYgKGxvZ2dpbmcudG9Db25zb2xlKSB7XG4gICAgY29uc29sZS5sb2cuYXBwbHkoXG4gICAgICB1bmRlZmluZWQsXG4gICAgICBbcHJlZml4LnRvU3RyaW5nKClbbG9nZ2luZy5sZXZlbHNEZXNjW25ld0xldmVsIC0gMV0uY29sb3JdXS5jb25jYXQodGV4dHMpXG4gICAgKTtcbiAgfVxuXG4gIC8vIExvZyB0byBmaWxlXG4gIGlmIChsb2dnaW5nLnRvRmlsZSkge1xuICAgIGxvZ1RvRmlsZSh0ZXh0cywgcHJlZml4KTtcbiAgfVxufTtcblxuLyoqXG4gKiBMb2dzIGFuIGVycm9yIG1lc3NhZ2Ugd2l0aCBpdHMgc3RhY2sgdHJhY2UuIE9wdGlvbmFsbHksIGEgY3VzdG9tIG1lc3NhZ2VcbiAqIGNhbiBiZSBwcm92aWRlZC5cbiAqXG4gKiBAcGFyYW0ge251bWJlcn0gbGV2ZWwgLSBUaGUgbG9nIGxldmVsLlxuICogQHBhcmFtIHtFcnJvcn0gZXJyb3IgLSBUaGUgZXJyb3Igb2JqZWN0LlxuICogQHBhcmFtIHtzdHJpbmd9IGN1c3RvbU1lc3NhZ2UgLSBBbiBvcHRpb25hbCBjdXN0b20gbWVzc2FnZSB0byBiZSBsb2dnZWQgYWxvbmdcbiAqIHdpdGggdGhlIGVycm9yLlxuICovXG5leHBvcnQgY29uc3QgbG9nV2l0aFN0YWNrID0gKG5ld0xldmVsLCBlcnJvciwgY3VzdG9tTWVzc2FnZSkgPT4ge1xuICAvLyBHZXQgdGhlIG1haW4gbWVzc2FnZVxuICBjb25zdCBtYWluTWVzc2FnZSA9IGN1c3RvbU1lc3NhZ2UgfHwgZXJyb3IubWVzc2FnZTtcblxuICAvLyBDdXJyZW50IGxvZ2dpbmcgb3B0aW9uc1xuICBjb25zdCB7IGxldmVsLCBsZXZlbHNEZXNjIH0gPSBsb2dnaW5nO1xuXG4gIC8vIENoZWNrIGlmIGxvZyBsZXZlbCBpcyB3aXRoaW4gYSBjb3JyZWN0IHJhbmdlXG4gIGlmIChuZXdMZXZlbCA9PT0gMCB8fCBuZXdMZXZlbCA+IGxldmVsIHx8IGxldmVsID4gbGV2ZWxzRGVzYy5sZW5ndGgpIHtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBHZXQgcmlkIG9mIHRoZSBHTVQgdGV4dCBpbmZvcm1hdGlvblxuICBjb25zdCBuZXdEYXRlID0gbmV3IERhdGUoKS50b1N0cmluZygpLnNwbGl0KCcoJylbMF0udHJpbSgpO1xuXG4gIC8vIENyZWF0ZSBhIG1lc3NhZ2UncyBwcmVmaXhcbiAgY29uc3QgcHJlZml4ID0gYCR7bmV3RGF0ZX0gWyR7bGV2ZWxzRGVzY1tuZXdMZXZlbCAtIDFdLnRpdGxlfV0gLWA7XG5cbiAgLy8gSWYgdGhlIGN1c3RvbU1lc3NhZ2UgZXhpc3RzLCB3ZSB3YW50IHRvIGRpc3BsYXkgdGhlIHdob2xlIHN0YWNrIG1lc3NhZ2VcbiAgY29uc3Qgc3RhY2tNZXNzYWdlID1cbiAgICBlcnJvci5tZXNzYWdlICE9PSBlcnJvci5zdGFja01lc3NhZ2UgfHwgZXJyb3Iuc3RhY2tNZXNzYWdlID09PSB1bmRlZmluZWRcbiAgICAgID8gZXJyb3Iuc3RhY2tcbiAgICAgIDogZXJyb3Iuc3RhY2suc3BsaXQoJ1xcbicpLnNsaWNlKDEpLmpvaW4oJ1xcbicpO1xuXG4gIC8vIENvbWJpbmUgY3VzdG9tIG1lc3NhZ2Ugb3IgZXJyb3IgbWVzc2FnZSB3aXRoIGVycm9yIHN0YWNrIG1lc3NhZ2VcbiAgY29uc3QgdGV4dHMgPSBbbWFpbk1lc3NhZ2UsICdcXG4nLCBzdGFja01lc3NhZ2VdO1xuXG4gIC8vIExvZyB0byBjb25zb2xlXG4gIGlmIChsb2dnaW5nLnRvQ29uc29sZSkge1xuICAgIGNvbnNvbGUubG9nLmFwcGx5KFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgW3ByZWZpeC50b1N0cmluZygpW2xvZ2dpbmcubGV2ZWxzRGVzY1tuZXdMZXZlbCAtIDFdLmNvbG9yXV0uY29uY2F0KFtcbiAgICAgICAgbWFpbk1lc3NhZ2VbY29sb3JzW25ld0xldmVsIC0gMV1dLFxuICAgICAgICAnXFxuJyxcbiAgICAgICAgc3RhY2tNZXNzYWdlXG4gICAgICBdKVxuICAgICk7XG4gIH1cblxuICAvLyBDYWxsIGF2YWlsYWJsZSBsb2cgbGlzdGVuZXJzXG4gIGxvZ2dpbmcubGlzdGVuZXJzLmZvckVhY2goKGZuKSA9PiB7XG4gICAgZm4ocHJlZml4LCB0ZXh0cy5qb2luKCcgJykpO1xuICB9KTtcblxuICAvLyBMb2cgdG8gZmlsZVxuICBpZiAobG9nZ2luZy50b0ZpbGUpIHtcbiAgICBsb2dUb0ZpbGUodGV4dHMsIHByZWZpeCk7XG4gIH1cbn07XG5cbi8qKlxuICogU2V0cyB0aGUgbG9nIGxldmVsIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuIExvZyBsZXZlbHMgYXJlICgwID0gbm8gbG9nZ2luZyxcbiAqIDEgPSBlcnJvciwgMiA9IHdhcm5pbmcsIDMgPSBub3RpY2UsIDQgPSB2ZXJib3NlIG9yIDUgPSBiZW5jaG1hcmspXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IG5ld0xldmVsIC0gVGhlIG5ldyBsb2cgbGV2ZWwgdG8gYmUgc2V0LlxuICovXG5leHBvcnQgY29uc3Qgc2V0TG9nTGV2ZWwgPSAobmV3TGV2ZWwpID0+IHtcbiAgaWYgKG5ld0xldmVsID49IDAgJiYgbmV3TGV2ZWwgPD0gbG9nZ2luZy5sZXZlbHNEZXNjLmxlbmd0aCkge1xuICAgIGxvZ2dpbmcubGV2ZWwgPSBuZXdMZXZlbDtcbiAgfVxufTtcblxuLyoqXG4gKiBFbmFibGVzIGZpbGUgbG9nZ2luZyB3aXRoIHRoZSBzcGVjaWZpZWQgZGVzdGluYXRpb24gYW5kIGxvZyBmaWxlLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2dEZXN0IC0gVGhlIGRlc3RpbmF0aW9uIHBhdGggZm9yIGxvZyBmaWxlcy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBsb2dGaWxlIC0gVGhlIGxvZyBmaWxlIG5hbWUuXG4gKi9cbmV4cG9ydCBjb25zdCBlbmFibGVGaWxlTG9nZ2luZyA9IChsb2dEZXN0LCBsb2dGaWxlKSA9PiB7XG4gIC8vIFVwZGF0ZSBsb2dnaW5nIG9wdGlvbnNcbiAgbG9nZ2luZyA9IHtcbiAgICAuLi5sb2dnaW5nLFxuICAgIGRlc3Q6IGxvZ0Rlc3QgfHwgbG9nZ2luZy5kZXN0LFxuICAgIGZpbGU6IGxvZ0ZpbGUgfHwgbG9nZ2luZy5maWxlLFxuICAgIHRvRmlsZTogdHJ1ZVxuICB9O1xuXG4gIGlmIChsb2dnaW5nLmRlc3QubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIGxvZygxLCAnW2xvZ2dlcl0gRmlsZSBsb2dnaW5nIGluaXRpYWxpemF0aW9uOiBubyBwYXRoIHN1cHBsaWVkLicpO1xuICB9XG5cbiAgaWYgKCFsb2dnaW5nLmRlc3QuZW5kc1dpdGgoJy8nKSkge1xuICAgIGxvZ2dpbmcuZGVzdCArPSAnLyc7XG4gIH1cbn07XG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgbG9nZ2luZyB3aXRoIHRoZSBzcGVjaWZpZWQgbG9nZ2luZyBjb25maWd1cmF0aW9uLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBsb2dnaW5nT3B0aW9ucyAtIFRoZSBsb2dnaW5nIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxuICovXG5leHBvcnQgY29uc3QgaW5pdExvZ2dpbmcgPSAobG9nZ2luZ09wdGlvbnMpID0+IHtcbiAgLy8gU2V0IGFsbCB0aGUgbG9nZ2luZyBvcHRpb25zIG9uIG91ciBsb2dnaW5nIG1vZHVsZSBvYmplY3RcbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMobG9nZ2luZ09wdGlvbnMpKSB7XG4gICAgbG9nZ2luZ1trZXldID0gdmFsdWU7XG4gIH1cblxuICAvLyBTZXQgdGhlIGxvZyBsZXZlbFxuICBzZXRMb2dMZXZlbChsb2dnaW5nT3B0aW9ucyAmJiBwYXJzZUludChsb2dnaW5nT3B0aW9ucy5sZXZlbCkpO1xuXG4gIC8vIFNldCB0aGUgbG9nIGZpbGUgcGF0aCBhbmQgbmFtZVxuICBpZiAobG9nZ2luZ09wdGlvbnMgJiYgbG9nZ2luZ09wdGlvbnMuZGVzdCAmJiBsb2dnaW5nT3B0aW9ucy50b0ZpbGUpIHtcbiAgICBlbmFibGVGaWxlTG9nZ2luZyhcbiAgICAgIGxvZ2dpbmdPcHRpb25zLmRlc3QsXG4gICAgICBsb2dnaW5nT3B0aW9ucy5maWxlIHx8ICdoaWdoY2hhcnRzLWV4cG9ydC1zZXJ2ZXIubG9nJ1xuICAgICk7XG4gIH1cbn07XG5cbi8qKlxuICogQWRkcyBhIGxpc3RlbmVyIGZ1bmN0aW9uIHRvIHRoZSBsb2dnaW5nIHN5c3RlbS5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBmbiAtIFRoZSBsaXN0ZW5lciBmdW5jdGlvbiB0byBiZSBhZGRlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGxpc3RlbiA9IChmbikgPT4ge1xuICBsb2dnaW5nLmxpc3RlbmVycy5wdXNoKGZuKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgbG9nLFxuICBsb2dXaXRoU3RhY2ssXG4gIHNldExvZ0xldmVsLFxuICBlbmFibGVGaWxlTG9nZ2luZyxcbiAgaW5pdExvZ2dpbmcsXG4gIGxpc3RlblxufTtcbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbkhpZ2hjaGFydHMgRXhwb3J0IFNlcnZlclxuXG5Db3B5cmlnaHQgKGMpIDIwMTYtMjAyNCwgSGlnaHNvZnRcblxuTGljZW5jZWQgdW5kZXIgdGhlIE1JVCBsaWNlbmNlLlxuXG5BZGRpdGlvbmFsbHkgYSB2YWxpZCBIaWdoY2hhcnRzIGxpY2Vuc2UgaXMgcmVxdWlyZWQgZm9yIHVzZS5cblxuU2VlIExJQ0VOU0UgZmlsZSBpbiByb290IGZvciBkZXRhaWxzLlxuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyByZWFkRmlsZVN5bmMgfSBmcm9tICdmcyc7XG5pbXBvcnQgeyBqb2luIH0gZnJvbSAncGF0aCc7XG5pbXBvcnQgeyBmaWxlVVJMVG9QYXRoIH0gZnJvbSAndXJsJztcblxuaW1wb3J0IHsgZGVmYXVsdENvbmZpZyB9IGZyb20gJy4uL2xpYi9zY2hlbWFzL2NvbmZpZy5qcyc7XG5pbXBvcnQgeyBsb2csIGxvZ1dpdGhTdGFjayB9IGZyb20gJy4vbG9nZ2VyLmpzJztcblxuY29uc3QgTUFYX0JBQ0tPRkZfQVRURU1QVFMgPSA2O1xuXG5leHBvcnQgY29uc3QgX19kaXJuYW1lID0gZmlsZVVSTFRvUGF0aChuZXcgVVJMKCcuLi8uJywgaW1wb3J0Lm1ldGEudXJsKSk7XG5cbi8qKlxuICogQ2xlYXJzIGFuZCBzdGFuZGFyZGl6ZXMgdGV4dCBieSByZXBsYWNpbmcgbXVsdGlwbGUgY29uc2VjdXRpdmUgd2hpdGVzcGFjZVxuICogY2hhcmFjdGVycyB3aXRoIGEgc2luZ2xlIHNwYWNlIGFuZCB0cmltbWluZyBhbnkgbGVhZGluZyBvciB0cmFpbGluZ1xuICogd2hpdGVzcGFjZS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdGV4dCAtIFRoZSBpbnB1dCB0ZXh0IHRvIGJlIGNsZWFyZWQuXG4gKiBAcGFyYW0ge1JlZ0V4cH0gW3J1bGU9L1xcc1xccysvZ10gLSBUaGUgcmVndWxhciBleHByZXNzaW9uIHJ1bGUgdG8gbWF0Y2hcbiAqIG11bHRpcGxlIGNvbnNlY3V0aXZlIHdoaXRlc3BhY2UgY2hhcmFjdGVycy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBbcmVwbGFjZXI9JyAnXSAtIFRoZSBzdHJpbmcgdXNlZCB0byByZXBsYWNlIG11bHRpcGxlXG4gKiBjb25zZWN1dGl2ZSB3aGl0ZXNwYWNlIGNoYXJhY3RlcnMuXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgY2xlYXJlZCBhbmQgc3RhbmRhcmRpemVkIHRleHQuXG4gKi9cbmV4cG9ydCBjb25zdCBjbGVhclRleHQgPSAodGV4dCwgcnVsZSA9IC9cXHNcXHMrL2csIHJlcGxhY2VyID0gJyAnKSA9PlxuICB0ZXh0LnJlcGxhY2VBbGwocnVsZSwgcmVwbGFjZXIpLnRyaW0oKTtcblxuLyoqXG4gKiBJbXBsZW1lbnRzIGFuIGV4cG9uZW50aWFsIGJhY2tvZmYgc3RyYXRlZ3kgZm9yIHJldHJ5aW5nIGEgZnVuY3Rpb24gdW50aWxcbiAqIGEgY2VydGFpbiBudW1iZXIgb2YgYXR0ZW1wdHMgYXJlIHJlYWNoZWQuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gLSBUaGUgZnVuY3Rpb24gdG8gYmUgcmV0cmllZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBbYXR0ZW1wdD0wXSAtIFRoZSBjdXJyZW50IGF0dGVtcHQgbnVtYmVyLlxuICogQHBhcmFtIHsuLi5hbnl9IGFyZ3MgLSBBcmd1bWVudHMgdG8gYmUgcGFzc2VkIHRvIHRoZSBmdW5jdGlvbi5cbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZX0gLSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyB0byB0aGUgcmVzdWx0IG9mIHRoZSBmdW5jdGlvblxuICogaWYgc3VjY2Vzc2Z1bC5cbiAqXG4gKiBAdGhyb3dzIHtFcnJvcn0gLSBUaHJvd3MgYW4gZXJyb3IgaWYgdGhlIG1heGltdW0gbnVtYmVyIG9mIGF0dGVtcHRzXG4gKiBpcyByZWFjaGVkLlxuICovXG5leHBvcnQgY29uc3QgZXhwQmFja29mZiA9IGFzeW5jIChmbiwgYXR0ZW1wdCA9IDAsIC4uLmFyZ3MpID0+IHtcbiAgdHJ5IHtcbiAgICAvLyBUcnkgdG8gY2FsbCB0aGUgZnVuY3Rpb25cbiAgICByZXR1cm4gYXdhaXQgZm4oLi4uYXJncyk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgLy8gQ2FsY3VsYXRlIGRlbGF5IGluIG1zXG4gICAgY29uc3QgZGVsYXlJbk1zID0gMiAqKiBhdHRlbXB0ICogMTAwMDtcblxuICAgIC8vIElmIHRoZSBhdHRlbXB0IGV4Y2VlZHMgdGhlIG1heGltdW0gYXR0ZW1wdHMgb2YgcmVhcGVhdCwgdGhyb3cgYW4gZXJyb3JcbiAgICBpZiAoKythdHRlbXB0ID49IE1BWF9CQUNLT0ZGX0FUVEVNUFRTKSB7XG4gICAgICB0aHJvdyBlcnJvcjtcbiAgICB9XG5cbiAgICAvLyBXYWl0IGdpdmVuIGFtb3VudCBvZiB0aW1lXG4gICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc3BvbnNlKSA9PiBzZXRUaW1lb3V0KHJlc3BvbnNlLCBkZWxheUluTXMpKTtcbiAgICBsb2coXG4gICAgICAzLFxuICAgICAgYFtwb29sXSBXYWl0ZWQgJHtkZWxheUluTXN9bXMgdW50aWwgbmV4dCBjYWxsIGZvciB0aGUgcmVzb3VyY2UgaWQ6ICR7YXJnc1swXX0uYFxuICAgICk7XG5cbiAgICAvLyBUcnkgYWdhaW5cbiAgICByZXR1cm4gZXhwQmFja29mZihmbiwgYXR0ZW1wdCwgLi4uYXJncyk7XG4gIH1cbn07XG5cbi8qKlxuICogRml4ZXMgdGhlIGV4cG9ydCB0eXBlIGJhc2VkIG9uIE1JTUUgdHlwZXMgYW5kIGZpbGUgZXh0ZW5zaW9ucy5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIFRoZSBvcmlnaW5hbCBleHBvcnQgdHlwZS5cbiAqIEBwYXJhbSB7c3RyaW5nfSBvdXRmaWxlIC0gVGhlIGZpbGUgcGF0aCBvciBuYW1lLlxuICpcbiAqIEByZXR1cm5zIHtzdHJpbmd9IC0gVGhlIGNvcnJlY3RlZCBleHBvcnQgdHlwZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGZpeFR5cGUgPSAodHlwZSwgb3V0ZmlsZSkgPT4ge1xuICAvLyBNSU1FIHR5cGVzXG4gIGNvbnN0IG1pbWVUeXBlcyA9IHtcbiAgICAnaW1hZ2UvcG5nJzogJ3BuZycsXG4gICAgJ2ltYWdlL2pwZWcnOiAnanBlZycsXG4gICAgJ2FwcGxpY2F0aW9uL3BkZic6ICdwZGYnLFxuICAgICdpbWFnZS9zdmcreG1sJzogJ3N2ZydcbiAgfTtcblxuICAvLyBGb3JtYXRzXG4gIGNvbnN0IGZvcm1hdHMgPSBbJ3BuZycsICdqcGVnJywgJ3BkZicsICdzdmcnXTtcblxuICAvLyBDaGVjayBpZiB0eXBlIGFuZCBvdXRmaWxlJ3MgZXh0ZW5zaW9ucyBhcmUgdGhlIHNhbWVcbiAgaWYgKG91dGZpbGUpIHtcbiAgICBjb25zdCBvdXRUeXBlID0gb3V0ZmlsZS5zcGxpdCgnLicpLnBvcCgpO1xuXG4gICAgaWYgKG91dFR5cGUgPT09ICdqcGcnKSB7XG4gICAgICB0eXBlID0gJ2pwZWcnO1xuICAgIH0gZWxzZSBpZiAoZm9ybWF0cy5pbmNsdWRlcyhvdXRUeXBlKSAmJiB0eXBlICE9PSBvdXRUeXBlKSB7XG4gICAgICB0eXBlID0gb3V0VHlwZTtcbiAgICB9XG4gIH1cblxuICAvLyBSZXR1cm4gYSBjb3JyZWN0IHR5cGVcbiAgcmV0dXJuIG1pbWVUeXBlc1t0eXBlXSB8fCBmb3JtYXRzLmZpbmQoKHQpID0+IHQgPT09IHR5cGUpIHx8ICdwbmcnO1xufTtcblxuLyoqXG4gKiBIYW5kbGVzIGFuZCB2YWxpZGF0ZXMgcmVzb3VyY2VzIGZvciBleHBvcnQuXG4gKlxuICogQHBhcmFtIHtPYmplY3R8c3RyaW5nfSByZXNvdXJjZXMgLSBUaGUgcmVzb3VyY2VzIHRvIGJlIGhhbmRsZWQuIENhbiBiZSBlaXRoZXJcbiAqIGEgSlNPTiBvYmplY3QsIHN0cmluZ2lmaWVkIEpTT04gb3IgYSBwYXRoIHRvIGEgSlNPTiBmaWxlLlxuICogQHBhcmFtIHtib29sZWFufSBhbGxvd0ZpbGVSZXNvdXJjZXMgLSBXaGV0aGVyIHRvIGFsbG93IGxvYWRpbmcgcmVzb3VyY2VzIGZyb21cbiAqIGZpbGVzLlxuICpcbiAqIEByZXR1cm5zIHtPYmplY3R8dW5kZWZpbmVkfSAtIFRoZSBoYW5kbGVkIHJlc291cmNlcyBvciB1bmRlZmluZWQgaWYgbm8gdmFsaWRcbiAqIHJlc291cmNlcyBhcmUgZm91bmQuXG4gKi9cbmV4cG9ydCBjb25zdCBoYW5kbGVSZXNvdXJjZXMgPSAocmVzb3VyY2VzID0gZmFsc2UsIGFsbG93RmlsZVJlc291cmNlcykgPT4ge1xuICBjb25zdCBhbGxvd2VkUHJvcHMgPSBbJ2pzJywgJ2NzcycsICdmaWxlcyddO1xuXG4gIGxldCBoYW5kbGVkUmVzb3VyY2VzID0gcmVzb3VyY2VzO1xuICBsZXQgY29ycmVjdFJlc291cmNlcyA9IGZhbHNlO1xuXG4gIC8vIFRyeSB0byBsb2FkIHJlc291cmNlcyBmcm9tIGEgZmlsZVxuICBpZiAoYWxsb3dGaWxlUmVzb3VyY2VzICYmIHJlc291cmNlcy5lbmRzV2l0aCgnLmpzb24nKSkge1xuICAgIHRyeSB7XG4gICAgICBoYW5kbGVkUmVzb3VyY2VzID0gaXNDb3JyZWN0SlNPTihyZWFkRmlsZVN5bmMocmVzb3VyY2VzLCAndXRmOCcpKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIGxvZ1dpdGhTdGFjaygyLCBlcnJvciwgYFtjbGldIE5vIHJlc291cmNlcyBmb3VuZC5gKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgLy8gVHJ5IHRvIGdldCBKU09OXG4gICAgaGFuZGxlZFJlc291cmNlcyA9IGlzQ29ycmVjdEpTT04ocmVzb3VyY2VzKTtcblxuICAgIC8vIEdldCByaWQgb2YgdGhlIGZpbGVzIHNlY3Rpb25cbiAgICBpZiAoaGFuZGxlZFJlc291cmNlcyAmJiAhYWxsb3dGaWxlUmVzb3VyY2VzKSB7XG4gICAgICBkZWxldGUgaGFuZGxlZFJlc291cmNlcy5maWxlcztcbiAgICB9XG4gIH1cblxuICAvLyBGaWx0ZXIgZnJvbSB1bm5lY2Vzc2FyeSBwcm9wZXJ0aWVzXG4gIGZvciAoY29uc3QgcHJvcE5hbWUgaW4gaGFuZGxlZFJlc291cmNlcykge1xuICAgIGlmICghYWxsb3dlZFByb3BzLmluY2x1ZGVzKHByb3BOYW1lKSkge1xuICAgICAgZGVsZXRlIGhhbmRsZWRSZXNvdXJjZXNbcHJvcE5hbWVdO1xuICAgIH0gZWxzZSBpZiAoIWNvcnJlY3RSZXNvdXJjZXMpIHtcbiAgICAgIGNvcnJlY3RSZXNvdXJjZXMgPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8vIENoZWNrIGlmIGF0IGxlYXN0IG9uZSBvZiBhbGxvd2VkIHByb3BlcnRpZXMgaXMgcHJlc2VudFxuICBpZiAoIWNvcnJlY3RSZXNvdXJjZXMpIHtcbiAgICByZXR1cm4gbG9nKDMsIGBbY2xpXSBObyByZXNvdXJjZXMgZm91bmQuYCk7XG4gIH1cblxuICAvLyBIYW5kbGUgZmlsZXMgc2VjdGlvblxuICBpZiAoaGFuZGxlZFJlc291cmNlcy5maWxlcykge1xuICAgIGhhbmRsZWRSZXNvdXJjZXMuZmlsZXMgPSBoYW5kbGVkUmVzb3VyY2VzLmZpbGVzLm1hcCgoaXRlbSkgPT4gaXRlbS50cmltKCkpO1xuICAgIGlmICghaGFuZGxlZFJlc291cmNlcy5maWxlcyB8fCBoYW5kbGVkUmVzb3VyY2VzLmZpbGVzLmxlbmd0aCA8PSAwKSB7XG4gICAgICBkZWxldGUgaGFuZGxlZFJlc291cmNlcy5maWxlcztcbiAgICB9XG4gIH1cblxuICAvLyBSZXR1cm4gcmVzb3VyY2VzXG4gIHJldHVybiBoYW5kbGVkUmVzb3VyY2VzO1xufTtcblxuLyoqXG4gKiBWYWxpZGF0ZXMgYW5kIHBhcnNlcyBKU09OIGRhdGEuIENoZWNrcyBpZiBwcm92aWRlZCBkYXRhIGlzIG9yIGNhblxuICogYmUgYSBjb3JyZWN0IEpTT04uIElmIGEgcHJpbWl0aXZlIGlzIHByb3ZpZGVkLCBpdCBpcyBzdHJpbmdpZmllZCBhbmQgcmV0dXJuZWQuXG4gKlxuICogQHBhcmFtIHtPYmplY3R8c3RyaW5nfSBkYXRhIC0gVGhlIEpTT04gZGF0YSB0byBiZSB2YWxpZGF0ZWQgYW5kIHBhcnNlZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gdG9TdHJpbmcgLSBXaGV0aGVyIHRvIHJldHVybiBhIHN0cmluZ2lmaWVkIHJlcHJlc2VudGF0aW9uXG4gKiBvZiB0aGUgcGFyc2VkIEpTT04uXG4gKlxuICogQHJldHVybnMge09iamVjdHxzdHJpbmd8Ym9vbGVhbn0gLSBUaGUgcGFyc2VkIEpTT04gb2JqZWN0LCBzdHJpbmdpZmllZCBKU09OLFxuICogb3IgZmFsc2UgaWYgdmFsaWRhdGlvbiBmYWlscy5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGlzQ29ycmVjdEpTT04oZGF0YSwgdG9TdHJpbmcpIHtcbiAgdHJ5IHtcbiAgICAvLyBHZXQgdGhlIHN0cmluZyByZXByZXNlbnRhdGlvbiBpZiBub3QgYWxyZWFkeSBiZWZvcmUgcGFyc2luZ1xuICAgIGNvbnN0IHBhcnNlZERhdGEgPSBKU09OLnBhcnNlKFxuICAgICAgdHlwZW9mIGRhdGEgIT09ICdzdHJpbmcnID8gSlNPTi5zdHJpbmdpZnkoZGF0YSkgOiBkYXRhXG4gICAgKTtcblxuICAgIC8vIFJldHVybiBhIHN0cmluZ2lmaWVkIHJlcHJlc2VudGF0aW9uIG9mIGEgSlNPTiBpZiByZXF1aXJlZFxuICAgIGlmICh0eXBlb2YgcGFyc2VkRGF0YSAhPT0gJ3N0cmluZycgJiYgdG9TdHJpbmcpIHtcbiAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShwYXJzZWREYXRhKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gYSBKU09OXG4gICAgcmV0dXJuIHBhcnNlZERhdGE7XG4gIH0gY2F0Y2gge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxufVxuXG4vKipcbiAqIENoZWNrcyBpZiB0aGUgZ2l2ZW4gaXRlbSBpcyBhbiBvYmplY3QuXG4gKlxuICogQHBhcmFtIHthbnl9IGl0ZW0gLSBUaGUgaXRlbSB0byBiZSBjaGVja2VkLlxuICpcbiAqIEByZXR1cm5zIHtib29sZWFufSAtIFRydWUgaWYgdGhlIGl0ZW0gaXMgYW4gb2JqZWN0LCBmYWxzZSBvdGhlcndpc2UuXG4gKi9cbmV4cG9ydCBjb25zdCBpc09iamVjdCA9IChpdGVtKSA9PlxuICB0eXBlb2YgaXRlbSA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkoaXRlbSkgJiYgaXRlbSAhPT0gbnVsbDtcblxuLyoqXG4gKiBDaGVja3MgaWYgdGhlIGdpdmVuIG9iamVjdCBpcyBlbXB0eS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gaXRlbSAtIFRoZSBvYmplY3QgdG8gYmUgY2hlY2tlZC5cbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBUcnVlIGlmIHRoZSBvYmplY3QgaXMgZW1wdHksIGZhbHNlIG90aGVyd2lzZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGlzT2JqZWN0RW1wdHkgPSAoaXRlbSkgPT5cbiAgdHlwZW9mIGl0ZW0gPT09ICdvYmplY3QnICYmXG4gICFBcnJheS5pc0FycmF5KGl0ZW0pICYmXG4gIGl0ZW0gIT09IG51bGwgJiZcbiAgT2JqZWN0LmtleXMoaXRlbSkubGVuZ3RoID09PSAwO1xuXG4vKipcbiAqIENoZWNrcyBpZiBhIHByaXZhdGUgSVAgcmFuZ2UgVVJMIGlzIGZvdW5kIGluIHRoZSBnaXZlbiBzdHJpbmcuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGl0ZW0gLSBUaGUgc3RyaW5nIHRvIGJlIGNoZWNrZWQgZm9yIGEgcHJpdmF0ZSBJUCByYW5nZSBVUkwuXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IC0gVHJ1ZSBpZiBhIHByaXZhdGUgSVAgcmFuZ2UgVVJMIGlzIGZvdW5kLCBmYWxzZVxuICogb3RoZXJ3aXNlLlxuICovXG5leHBvcnQgY29uc3QgaXNQcml2YXRlUmFuZ2VVcmxGb3VuZCA9IChpdGVtKSA9PiB7XG4gIGNvbnN0IHJlZ2V4UGF0dGVybnMgPSBbXG4gICAgL3hsaW5rOmhyZWY9XCIoPzpodHRwOlxcL1xcL3xodHRwczpcXC9cXC8pP2xvY2FsaG9zdFxcYi8sXG4gICAgL3hsaW5rOmhyZWY9XCIoPzpodHRwOlxcL1xcL3xodHRwczpcXC9cXC8pPzEwXFwuXFxkezEsM31cXC5cXGR7MSwzfVxcLlxcZHsxLDN9XFxiLyxcbiAgICAveGxpbms6aHJlZj1cIig/Omh0dHA6XFwvXFwvfGh0dHBzOlxcL1xcLyk/MTI3XFwuXFxkezEsM31cXC5cXGR7MSwzfVxcLlxcZHsxLDN9XFxiLyxcbiAgICAveGxpbms6aHJlZj1cIig/Omh0dHA6XFwvXFwvfGh0dHBzOlxcL1xcLyk/MTcyXFwuKDFbNi05XXwyWzAtOV18M1swLTFdKVxcLlxcZHsxLDN9XFwuXFxkezEsM31cXGIvLFxuICAgIC94bGluazpocmVmPVwiKD86aHR0cDpcXC9cXC98aHR0cHM6XFwvXFwvKT8xOTJcXC4xNjhcXC5cXGR7MSwzfVxcLlxcZHsxLDN9XFxiL1xuICBdO1xuXG4gIHJldHVybiByZWdleFBhdHRlcm5zLnNvbWUoKHBhdHRlcm4pID0+IHBhdHRlcm4udGVzdChpdGVtKSk7XG59O1xuXG4vKipcbiAqIENyZWF0ZXMgYSBkZWVwIGNvcHkgb2YgdGhlIGdpdmVuIG9iamVjdCBvciBhcnJheS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdHxBcnJheX0gb2JqIC0gVGhlIG9iamVjdCBvciBhcnJheSB0byBiZSBkZWVwbHkgY29waWVkLlxuICpcbiAqIEByZXR1cm5zIHtPYmplY3R8QXJyYXl9IC0gVGhlIGRlZXAgY29weSBvZiB0aGUgcHJvdmlkZWQgb2JqZWN0IG9yIGFycmF5LlxuICovXG5leHBvcnQgY29uc3QgZGVlcENvcHkgPSAob2JqKSA9PiB7XG4gIGlmIChvYmogPT09IG51bGwgfHwgdHlwZW9mIG9iaiAhPT0gJ29iamVjdCcpIHtcbiAgICByZXR1cm4gb2JqO1xuICB9XG5cbiAgY29uc3QgY29weSA9IEFycmF5LmlzQXJyYXkob2JqKSA/IFtdIDoge307XG5cbiAgZm9yIChjb25zdCBrZXkgaW4gb2JqKSB7XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIGtleSkpIHtcbiAgICAgIGNvcHlba2V5XSA9IGRlZXBDb3B5KG9ialtrZXldKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gY29weTtcbn07XG5cbi8qKlxuICogQ29udmVydHMgdGhlIHByb3ZpZGVkIG9wdGlvbnMgb2JqZWN0IHRvIGEgSlNPTi1mb3JtYXR0ZWQgc3RyaW5nIHdpdGggdGhlXG4gKiBvcHRpb24gdG8gcHJlc2VydmUgZnVuY3Rpb25zLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgb2JqZWN0IHRvIGJlIGNvbnZlcnRlZCB0byBhIHN0cmluZy5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gYWxsb3dGdW5jdGlvbnMgLSBJZiBzZXQgdG8gdHJ1ZSwgZnVuY3Rpb25zIGFyZSBwcmVzZXJ2ZWRcbiAqIGluIHRoZSBvdXRwdXQuXG4gKlxuICogQHJldHVybnMge3N0cmluZ30gLSBUaGUgSlNPTi1mb3JtYXR0ZWQgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgb3B0aW9ucy5cbiAqL1xuZXhwb3J0IGNvbnN0IG9wdGlvbnNTdHJpbmdpZnkgPSAob3B0aW9ucywgYWxsb3dGdW5jdGlvbnMpID0+IHtcbiAgY29uc3QgcmVwbGFjZXJDYWxsYmFjayA9IChuYW1lLCB2YWx1ZSkgPT4ge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICB2YWx1ZSA9IHZhbHVlLnRyaW0oKTtcblxuICAgICAgLy8gSWYgYWxsb3dGdW5jdGlvbnMgaXMgc2V0IHRvIHRydWUsIHByZXNlcnZlIGZ1bmN0aW9uc1xuICAgICAgaWYgKFxuICAgICAgICAodmFsdWUuc3RhcnRzV2l0aCgnZnVuY3Rpb24oJykgfHwgdmFsdWUuc3RhcnRzV2l0aCgnZnVuY3Rpb24gKCcpKSAmJlxuICAgICAgICB2YWx1ZS5lbmRzV2l0aCgnfScpXG4gICAgICApIHtcbiAgICAgICAgdmFsdWUgPSBhbGxvd0Z1bmN0aW9uc1xuICAgICAgICAgID8gYEVYUF9GVU4keyh2YWx1ZSArICcnKS5yZXBsYWNlQWxsKC9cXG58XFx0fFxcci9nLCAnICcpfUVYUF9GVU5gXG4gICAgICAgICAgOiB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIHR5cGVvZiB2YWx1ZSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICAgPyBgRVhQX0ZVTiR7KHZhbHVlICsgJycpLnJlcGxhY2VBbGwoL1xcbnxcXHR8XFxyL2csICcgJyl9RVhQX0ZVTmBcbiAgICAgIDogdmFsdWU7XG4gIH07XG5cbiAgLy8gU3RyaW5naWZ5IG9wdGlvbnMgYW5kIGlmIHJlcXVpcmVkLCByZXBsYWNlIHNwZWNpYWwgZnVuY3Rpb25zIG1hcmtzXG4gIHJldHVybiBKU09OLnN0cmluZ2lmeShvcHRpb25zLCByZXBsYWNlckNhbGxiYWNrKS5yZXBsYWNlQWxsKFxuICAgIC9cIkVYUF9GVU58RVhQX0ZVTlwiL2csXG4gICAgJydcbiAgKTtcbn07XG5cbi8qKlxuICogUHJpbnRzIHRoZSBIaWdoY2hhcnRzIEV4cG9ydCBTZXJ2ZXIgbG9nbyBhbmQgdmVyc2lvbiBpbmZvcm1hdGlvbi5cbiAqXG4gKiBAcGFyYW0ge2Jvb2xlYW59IG5vTG9nbyAtIElmIHRydWUsIG9ubHkgcHJpbnRzIHZlcnNpb24gaW5mb3JtYXRpb24gd2l0aG91dFxuICogdGhlIGxvZ28uXG4gKi9cbmV4cG9ydCBjb25zdCBwcmludExvZ28gPSAobm9Mb2dvKSA9PiB7XG4gIC8vIEdldCBwYWNrYWdlIHZlcnNpb24gZWl0aGVyIGZyb20gZW52IG9yIGZyb20gcGFja2FnZS5qc29uXG4gIGNvbnN0IHBhY2thZ2VWZXJzaW9uID0gSlNPTi5wYXJzZShcbiAgICByZWFkRmlsZVN5bmMoam9pbihfX2Rpcm5hbWUsICdwYWNrYWdlLmpzb24nKSlcbiAgKS52ZXJzaW9uO1xuXG4gIC8vIFByaW50IHRleHQgb25seVxuICBpZiAobm9Mb2dvKSB7XG4gICAgY29uc29sZS5sb2coYFN0YXJ0aW5nIEhpZ2hjaGFydHMgRXhwb3J0IFNlcnZlciB2JHtwYWNrYWdlVmVyc2lvbn0uLi5gKTtcbiAgICByZXR1cm47XG4gIH1cblxuICAvLyBQcmludCB0aGUgbG9nb1xuICBjb25zb2xlLmxvZyhcbiAgICByZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy9tc2cvc3RhcnR1cC5tc2cnKS50b1N0cmluZygpLmJvbGQueWVsbG93LFxuICAgIGB2JHtwYWNrYWdlVmVyc2lvbn1cXG5gLmJvbGRcbiAgKTtcbn07XG5cbi8qKlxuICogUHJpbnRzIHRoZSB1c2FnZSBpbmZvcm1hdGlvbiBmb3IgQ0xJIGFyZ3VtZW50cy4gSWYgcmVxdWlyZWQsIGl0IGNhbiBsaXN0XG4gKiBwcm9wZXJ0aWVzIHJlY3Vyc2l2ZWx5XG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBwcmludFVzYWdlKCkge1xuICBjb25zdCBwYWQgPSA0ODtcbiAgY29uc3QgcmVhZG1lID0gJ2h0dHBzOi8vZ2l0aHViLmNvbS9oaWdoY2hhcnRzL25vZGUtZXhwb3J0LXNlcnZlciNyZWFkbWUnO1xuXG4gIC8vIERpc3BsYXkgcmVhZG1lIGluZm9ybWF0aW9uXG4gIGNvbnNvbGUubG9nKFxuICAgICdcXG5Vc2FnZSBvZiBDTEkgYXJndW1lbnRzOicuYm9sZCxcbiAgICAnXFxuLS0tLS0tJyxcbiAgICBgXFxuRm9yIG1vcmUgZGV0YWlsZWQgaW5mb3JtYXRpb24sIHZpc2l0IHRoZSByZWFkbWUgYXQ6ICR7cmVhZG1lLmJvbGQueWVsbG93fS5gXG4gICk7XG5cbiAgY29uc3QgY3ljbGVDYXRlZ29yaWVzID0gKG9wdGlvbnMpID0+IHtcbiAgICBmb3IgKGNvbnN0IFtuYW1lLCBvcHRpb25dIG9mIE9iamVjdC5lbnRyaWVzKG9wdGlvbnMpKSB7XG4gICAgICAvLyBJZiBjYXRlZ29yeSBoYXMgbW9yZSBsZXZlbHMsIGdvIGZ1cnRoZXJcbiAgICAgIGlmICghT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9wdGlvbiwgJ3ZhbHVlJykpIHtcbiAgICAgICAgY3ljbGVDYXRlZ29yaWVzKG9wdGlvbik7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBsZXQgZGVzY05hbWUgPSBgICAtLSR7b3B0aW9uLmNsaU5hbWUgfHwgbmFtZX0gJHtcbiAgICAgICAgICAoJzwnICsgb3B0aW9uLnR5cGUgKyAnPicpLmdyZWVuXG4gICAgICAgIH0gYDtcbiAgICAgICAgaWYgKGRlc2NOYW1lLmxlbmd0aCA8IHBhZCkge1xuICAgICAgICAgIGZvciAobGV0IGkgPSBkZXNjTmFtZS5sZW5ndGg7IGkgPCBwYWQ7IGkrKykge1xuICAgICAgICAgICAgZGVzY05hbWUgKz0gJy4nO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERpc3BsYXkgY29ycmVjdGx5IGFsaWduZWQgbWVzc2FnZXNcbiAgICAgICAgY29uc29sZS5sb2coXG4gICAgICAgICAgZGVzY05hbWUsXG4gICAgICAgICAgb3B0aW9uLmRlc2NyaXB0aW9uLFxuICAgICAgICAgIGBbRGVmYXVsdDogJHtvcHRpb24udmFsdWUudG9TdHJpbmcoKS5ib2xkfV1gLmJsdWVcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG5cbiAgLy8gQ3ljbGUgdGhyb3VnaCBvcHRpb25zIG9mIGVhY2ggY2F0ZWdvcmllcyBhbmQgZGlzcGxheSB0aGUgdXNhZ2UgaW5mb1xuICBPYmplY3Qua2V5cyhkZWZhdWx0Q29uZmlnKS5mb3JFYWNoKChjYXRlZ29yeSkgPT4ge1xuICAgIC8vIE9ubHkgcHVwcGV0ZWVyIGFuZCBoaWdoY2hhcnRzIGNhdGVnb3JpZXMgY2Fubm90IGJlIGNvbmZpZ3VyZWQgdGhyb3VnaCBDTElcbiAgICBpZiAoIVsncHVwcGV0ZWVyJywgJ2hpZ2hjaGFydHMnXS5pbmNsdWRlcyhjYXRlZ29yeSkpIHtcbiAgICAgIGNvbnNvbGUubG9nKGBcXG4ke2NhdGVnb3J5LnRvVXBwZXJDYXNlKCl9YC5yZWQpO1xuICAgICAgY3ljbGVDYXRlZ29yaWVzKGRlZmF1bHRDb25maWdbY2F0ZWdvcnldKTtcbiAgICB9XG4gIH0pO1xuICBjb25zb2xlLmxvZygnXFxuJyk7XG59XG5cbi8qKlxuICogUm91bmRzIGEgbnVtYmVyIHRvIHRoZSBzcGVjaWZpZWQgcHJlY2lzaW9uLlxuICpcbiAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSAtIFRoZSBudW1iZXIgdG8gYmUgcm91bmRlZC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBwcmVjaXNpb24gLSBUaGUgbnVtYmVyIG9mIGRlY2ltYWwgcGxhY2VzIHRvIHJvdW5kIHRvLlxuICpcbiAqIEByZXR1cm5zIHtudW1iZXJ9IC0gVGhlIHJvdW5kZWQgbnVtYmVyLlxuICovXG5leHBvcnQgY29uc3Qgcm91bmROdW1iZXIgPSAodmFsdWUsIHByZWNpc2lvbiA9IDEpID0+IHtcbiAgY29uc3QgbXVsdGlwbGllciA9IE1hdGgucG93KDEwLCBwcmVjaXNpb24gfHwgMCk7XG4gIHJldHVybiBNYXRoLnJvdW5kKCt2YWx1ZSAqIG11bHRpcGxpZXIpIC8gbXVsdGlwbGllcjtcbn07XG5cbi8qKlxuICogQ29udmVydHMgYSB2YWx1ZSB0byBhIGJvb2xlYW4uXG4gKlxuICogQHBhcmFtIHthbnl9IGl0ZW0gLSBUaGUgdmFsdWUgdG8gYmUgY29udmVydGVkIHRvIGEgYm9vbGVhbi5cbiAqXG4gKiBAcmV0dXJucyB7Ym9vbGVhbn0gLSBUaGUgYm9vbGVhbiByZXByZXNlbnRhdGlvbiBvZiB0aGUgaW5wdXQgdmFsdWUuXG4gKi9cbmV4cG9ydCBjb25zdCB0b0Jvb2xlYW4gPSAoaXRlbSkgPT5cbiAgWydmYWxzZScsICd1bmRlZmluZWQnLCAnbnVsbCcsICdOYU4nLCAnMCcsICcnXS5pbmNsdWRlcyhpdGVtKVxuICAgID8gZmFsc2VcbiAgICA6ICEhaXRlbTtcblxuLyoqXG4gKiBXcmFwcyBjdXN0b20gY29kZSB0byBleGVjdXRlIGl0IHNhZmVseS5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gY3VzdG9tQ29kZSAtIFRoZSBjdXN0b20gY29kZSB0byBiZSB3cmFwcGVkLlxuICogQHBhcmFtIHtib29sZWFufSBhbGxvd0ZpbGVSZXNvdXJjZXMgLSBGbGFnIHRvIGFsbG93IGxvYWRpbmcgY29kZSBmcm9tIGEgZmlsZS5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfGJvb2xlYW59IC0gVGhlIHdyYXBwZWQgY3VzdG9tIGNvZGUgb3IgZmFsc2UgaWYgd3JhcHBpbmdcbiAqIGZhaWxzLlxuICovXG5leHBvcnQgY29uc3Qgd3JhcEFyb3VuZCA9IChjdXN0b21Db2RlLCBhbGxvd0ZpbGVSZXNvdXJjZXMpID0+IHtcbiAgaWYgKGN1c3RvbUNvZGUgJiYgdHlwZW9mIGN1c3RvbUNvZGUgPT09ICdzdHJpbmcnKSB7XG4gICAgY3VzdG9tQ29kZSA9IGN1c3RvbUNvZGUudHJpbSgpO1xuXG4gICAgaWYgKGN1c3RvbUNvZGUuZW5kc1dpdGgoJy5qcycpKSB7XG4gICAgICByZXR1cm4gYWxsb3dGaWxlUmVzb3VyY2VzXG4gICAgICAgID8gd3JhcEFyb3VuZChyZWFkRmlsZVN5bmMoY3VzdG9tQ29kZSwgJ3V0ZjgnKSlcbiAgICAgICAgOiBmYWxzZTtcbiAgICB9IGVsc2UgaWYgKFxuICAgICAgY3VzdG9tQ29kZS5zdGFydHNXaXRoKCdmdW5jdGlvbigpJykgfHxcbiAgICAgIGN1c3RvbUNvZGUuc3RhcnRzV2l0aCgnZnVuY3Rpb24gKCknKSB8fFxuICAgICAgY3VzdG9tQ29kZS5zdGFydHNXaXRoKCcoKT0+JykgfHxcbiAgICAgIGN1c3RvbUNvZGUuc3RhcnRzV2l0aCgnKCkgPT4nKVxuICAgICkge1xuICAgICAgcmV0dXJuIGAoJHtjdXN0b21Db2RlfSkoKWA7XG4gICAgfVxuICAgIHJldHVybiBjdXN0b21Db2RlLnJlcGxhY2UoLzskLywgJycpO1xuICB9XG59O1xuXG4vKipcbiAqIFV0aWxpdHkgdG8gbWVhc3VyZSBlbGFwc2VkIHRpbWUgdXNpbmcgdGhlIE5vZGUuanMgcHJvY2Vzcy5ocnRpbWUoKSBtZXRob2QuXG4gKlxuICogQHJldHVybnMge2Z1bmN0aW9uKCk6IG51bWJlcn0gLSBBIGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSB0aGUgZWxhcHNlZCB0aW1lXG4gKiBpbiBtaWxsaXNlY29uZHMuXG4gKi9cbmV4cG9ydCBjb25zdCBtZWFzdXJlVGltZSA9ICgpID0+IHtcbiAgY29uc3Qgc3RhcnQgPSBwcm9jZXNzLmhydGltZS5iaWdpbnQoKTtcbiAgcmV0dXJuICgpID0+IE51bWJlcihwcm9jZXNzLmhydGltZS5iaWdpbnQoKSAtIHN0YXJ0KSAvIDEwMDAwMDA7XG59O1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIF9fZGlybmFtZSxcbiAgY2xlYXJUZXh0LFxuICBleHBCYWNrb2ZmLFxuICBmaXhUeXBlLFxuICBoYW5kbGVSZXNvdXJjZXMsXG4gIGlzQ29ycmVjdEpTT04sXG4gIGlzT2JqZWN0LFxuICBpc09iamVjdEVtcHR5LFxuICBpc1ByaXZhdGVSYW5nZVVybEZvdW5kLFxuICBvcHRpb25zU3RyaW5naWZ5LFxuICBwcmludExvZ28sXG4gIHByaW50VXNhZ2UsXG4gIHJvdW5kTnVtYmVyLFxuICB0b0Jvb2xlYW4sXG4gIHdyYXBBcm91bmQsXG4gIG1lYXN1cmVUaW1lXG59O1xuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuSGlnaGNoYXJ0cyBFeHBvcnQgU2VydmVyXG5cbkNvcHlyaWdodCAoYykgMjAxNi0yMDI0LCBIaWdoc29mdFxuXG5MaWNlbmNlZCB1bmRlciB0aGUgTUlUIGxpY2VuY2UuXG5cbkFkZGl0aW9uYWxseSBhIHZhbGlkIEhpZ2hjaGFydHMgbGljZW5zZSBpcyByZXF1aXJlZCBmb3IgdXNlLlxuXG5TZWUgTElDRU5TRSBmaWxlIGluIHJvb3QgZm9yIGRldGFpbHMuXG5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IGV4aXN0c1N5bmMsIHJlYWRGaWxlU3luYywgcHJvbWlzZXMgYXMgZnNQcm9taXNlcyB9IGZyb20gJ2ZzJztcblxuaW1wb3J0IHByb21wdHMgZnJvbSAncHJvbXB0cyc7XG5cbmltcG9ydCB7XG4gIGFic29sdXRlUHJvcHMsXG4gIGRlZmF1bHRDb25maWcsXG4gIG5lc3RlZEFyZ3MsXG4gIHByb21wdHNDb25maWdcbn0gZnJvbSAnLi9zY2hlbWFzL2NvbmZpZy5qcyc7XG5pbXBvcnQgeyBlbnZzIH0gZnJvbSAnLi9lbnZzLmpzJztcbmltcG9ydCB7IGxvZywgbG9nV2l0aFN0YWNrIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgZGVlcENvcHksIGlzT2JqZWN0LCBwcmludFVzYWdlLCB0b0Jvb2xlYW4gfSBmcm9tICcuL3V0aWxzLmpzJztcblxubGV0IGdlbmVyYWxPcHRpb25zID0ge307XG5cbi8qKlxuICogUmV0cmlldmVzIGFuZCByZXR1cm5zIHRoZSBnZW5lcmFsIG9wdGlvbnMgZm9yIHRoZSBleHBvcnQgcHJvY2Vzcy5cbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBUaGUgZ2VuZXJhbCBvcHRpb25zIG9iamVjdC5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldE9wdGlvbnMgPSAoKSA9PiBnZW5lcmFsT3B0aW9ucztcblxuLyoqXG4gKiBJbml0aWFsaXplcyBhbmQgc2V0cyB0aGUgZ2VuZXJhbCBvcHRpb25zIGZvciB0aGUgc2VydmVyIGluc3RhY2UsIGtlZXBpbmdcbiAqIHRoZSBwcmluY2lwbGUgb2YgdGhlIG9wdGlvbnMgbG9hZCBwcmlvcml0eS4gSXQgYWNjZXB0cyBvcHRpb25hbCB1c2VyT3B0aW9uc1xuICogYW5kIGFyZ3MgZnJvbSB0aGUgQ0xJLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSB1c2VyT3B0aW9ucyAtIFVzZXItcHJvdmlkZWQgb3B0aW9ucyBmb3IgY3VzdG9taXphdGlvbi5cbiAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgLSBDb21tYW5kLWxpbmUgYXJndW1lbnRzIGZvciBhZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb25cbiAqIChDTEkgdXNhZ2UpLlxuICpcbiAqIEByZXR1cm5zIHtPYmplY3R9IFRoZSB1cGRhdGVkIGdlbmVyYWwgb3B0aW9ucyBvYmplY3QuXG4gKi9cbmV4cG9ydCBjb25zdCBzZXRPcHRpb25zID0gKHVzZXJPcHRpb25zLCBhcmdzKSA9PiB7XG4gIC8vIE9ubHkgZm9yIHRoZSBDTEkgdXNhZ2VcbiAgaWYgKGFyZ3M/Lmxlbmd0aCkge1xuICAgIC8vIEdldCB0aGUgYWRkaXRpb25hbCBvcHRpb25zIGZyb20gdGhlIGN1c3RvbSBKU09OIGZpbGVcbiAgICBnZW5lcmFsT3B0aW9ucyA9IGxvYWRDb25maWdGaWxlKGFyZ3MpO1xuICB9XG5cbiAgLy8gVXBkYXRlIHRoZSBkZWZhdWx0IGNvbmZpZyB3aXRoIGEgY29ycmVjdCBvcHRpb24gdmFsdWVzXG4gIHVwZGF0ZURlZmF1bHRDb25maWcoZGVmYXVsdENvbmZpZywgZ2VuZXJhbE9wdGlvbnMpO1xuXG4gIC8vIFNldCB2YWx1ZXMgZm9yIHNlcnZlcidzIG9wdGlvbnMgYW5kIHJldHVybnMgdGhlbVxuICBnZW5lcmFsT3B0aW9ucyA9IGluaXRPcHRpb25zKGRlZmF1bHRDb25maWcpO1xuXG4gIC8vIEFwcGx5IHVzZXIgb3B0aW9ucyBpZiB0aGVyZSBhcmUgYW55XG4gIGlmICh1c2VyT3B0aW9ucykge1xuICAgIC8vIE1lcmdlIHVzZXIgb3B0aW9uc1xuICAgIGdlbmVyYWxPcHRpb25zID0gbWVyZ2VDb25maWdPcHRpb25zKFxuICAgICAgZ2VuZXJhbE9wdGlvbnMsXG4gICAgICB1c2VyT3B0aW9ucyxcbiAgICAgIGFic29sdXRlUHJvcHNcbiAgICApO1xuICB9XG5cbiAgLy8gT25seSBmb3IgdGhlIENMSSB1c2FnZVxuICBpZiAoYXJncz8ubGVuZ3RoKSB7XG4gICAgLy8gUGFpciBwcm92aWRlZCBhcmd1bWVudHNcbiAgICBnZW5lcmFsT3B0aW9ucyA9IHBhaXJBcmd1bWVudFZhbHVlKGdlbmVyYWxPcHRpb25zLCBhcmdzLCBkZWZhdWx0Q29uZmlnKTtcbiAgfVxuXG4gIC8vIFJldHVybiBmaW5hbCBnZW5lcmFsIG9wdGlvbnNcbiAgcmV0dXJuIGdlbmVyYWxPcHRpb25zO1xufTtcblxuLyoqXG4gKiBBbGxvd3MgbWFudWFsIGNvbmZpZ3VyYXRpb24gYmFzZWQgb24gc3BlY2lmaWVkIHByb21wdHMgYW5kIHNhdmVzXG4gKiB0aGUgY29uZmlndXJhdGlvbiB0byBhIGZpbGUuXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGNvbmZpZ0ZpbGVOYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGNvbmZpZ3VyYXRpb24gZmlsZS5cbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxib29sZWFuPn0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgdG8gdHJ1ZSBvbmNlIHRoZSBtYW51YWxcbiAqIGNvbmZpZ3VyYXRpb24gaXMgY29tcGxldGVkIGFuZCBzYXZlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IG1hbnVhbENvbmZpZyA9IGFzeW5jIChjb25maWdGaWxlTmFtZSkgPT4ge1xuICAvLyBQcmVwYXJlIGEgY29uZmlnIG9iamVjdFxuICBsZXQgY29uZmlnRmlsZSA9IHt9O1xuXG4gIC8vIENoZWNrIGlmIHByb3ZpZGVkIGNvbmZpZyBmaWxlIGV4aXN0c1xuICBpZiAoZXhpc3RzU3luYyhjb25maWdGaWxlTmFtZSkpIHtcbiAgICBjb25maWdGaWxlID0gSlNPTi5wYXJzZShyZWFkRmlsZVN5bmMoY29uZmlnRmlsZU5hbWUsICd1dGY4JykpO1xuICB9XG5cbiAgLy8gUXVlc3Rpb24gYWJvdXQgYSBjb25maWd1cmF0aW9uIGNhdGVnb3J5XG4gIGNvbnN0IG9uU3VibWl0ID0gYXN5bmMgKHAsIGNhdGVnb3JpZXMpID0+IHtcbiAgICBsZXQgcXVlc3Rpb25zQ291bnRlciA9IDA7XG4gICAgbGV0IGFsbFF1ZXN0aW9ucyA9IFtdO1xuXG4gICAgLy8gQ3JlYXRlIGEgY29ycmVzcG9uZGluZyBwcm9wZXJ0eSBpbiB0aGUgbWFudWFsQ29uZmlnIG9iamVjdFxuICAgIGZvciAoY29uc3Qgc2VjdGlvbiBvZiBjYXRlZ29yaWVzKSB7XG4gICAgICAvLyBNYXJrIGVhY2ggb3B0aW9uIHdpdGggYSBzZWN0aW9uXG4gICAgICBwcm9tcHRzQ29uZmlnW3NlY3Rpb25dID0gcHJvbXB0c0NvbmZpZ1tzZWN0aW9uXS5tYXAoKG9wdGlvbikgPT4gKHtcbiAgICAgICAgLi4ub3B0aW9uLFxuICAgICAgICBzZWN0aW9uXG4gICAgICB9KSk7XG5cbiAgICAgIC8vIENvbGxlY3QgdGhlIHF1ZXN0aW9uc1xuICAgICAgYWxsUXVlc3Rpb25zID0gWy4uLmFsbFF1ZXN0aW9ucywgLi4ucHJvbXB0c0NvbmZpZ1tzZWN0aW9uXV07XG4gICAgfVxuXG4gICAgYXdhaXQgcHJvbXB0cyhhbGxRdWVzdGlvbnMsIHtcbiAgICAgIG9uU3VibWl0OiBhc3luYyAocHJvbXB0LCBhbnN3ZXIpID0+IHtcbiAgICAgICAgLy8gR2V0IHRoZSBkZWZhdWx0IG1vZHVsZSBzY3JpcHRzXG4gICAgICAgIGlmIChwcm9tcHQubmFtZSA9PT0gJ21vZHVsZVNjcmlwdHMnKSB7XG4gICAgICAgICAgYW5zd2VyID0gYW5zd2VyLmxlbmd0aFxuICAgICAgICAgICAgPyBhbnN3ZXIubWFwKChtb2R1bGUpID0+IHByb21wdC5jaG9pY2VzW21vZHVsZV0pXG4gICAgICAgICAgICA6IHByb21wdC5jaG9pY2VzO1xuXG4gICAgICAgICAgY29uZmlnRmlsZVtwcm9tcHQuc2VjdGlvbl1bcHJvbXB0Lm5hbWVdID0gYW5zd2VyO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbmZpZ0ZpbGVbcHJvbXB0LnNlY3Rpb25dID0gcmVjdXJzaXZlUHJvcHMoXG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKHt9LCBjb25maWdGaWxlW3Byb21wdC5zZWN0aW9uXSB8fCB7fSksXG4gICAgICAgICAgICBwcm9tcHQubmFtZS5zcGxpdCgnLicpLFxuICAgICAgICAgICAgcHJvbXB0LmNob2ljZXMgPyBwcm9tcHQuY2hvaWNlc1thbnN3ZXJdIDogYW5zd2VyXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICgrK3F1ZXN0aW9uc0NvdW50ZXIgPT09IGFsbFF1ZXN0aW9ucy5sZW5ndGgpIHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgYXdhaXQgZnNQcm9taXNlcy53cml0ZUZpbGUoXG4gICAgICAgICAgICAgIGNvbmZpZ0ZpbGVOYW1lLFxuICAgICAgICAgICAgICBKU09OLnN0cmluZ2lmeShjb25maWdGaWxlLCBudWxsLCAyKSxcbiAgICAgICAgICAgICAgJ3V0ZjgnXG4gICAgICAgICAgICApO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBsb2dXaXRoU3RhY2soXG4gICAgICAgICAgICAgIDEsXG4gICAgICAgICAgICAgIGVycm9yLFxuICAgICAgICAgICAgICBgW2NvbmZpZ10gQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgY3JlYXRpbmcgdGhlICR7Y29uZmlnRmlsZU5hbWV9IGZpbGUuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9KTtcblxuICAgIHJldHVybiB0cnVlO1xuICB9O1xuXG4gIC8vIEZpbmQgdGhlIGNhdGVnb3JpZXNcbiAgY29uc3QgY2hvaWNlcyA9IE9iamVjdC5rZXlzKHByb21wdHNDb25maWcpLm1hcCgoY2hvaWNlKSA9PiAoe1xuICAgIHRpdGxlOiBgJHtjaG9pY2V9IG9wdGlvbnNgLFxuICAgIHZhbHVlOiBjaG9pY2VcbiAgfSkpO1xuXG4gIC8vIENhdGVnb3J5IHByb21wdFxuICByZXR1cm4gcHJvbXB0cyhcbiAgICB7XG4gICAgICB0eXBlOiAnbXVsdGlzZWxlY3QnLFxuICAgICAgbmFtZTogJ2NhdGVnb3J5JyxcbiAgICAgIG1lc3NhZ2U6ICdXaGljaCBjYXRlZ29yeSBkbyB5b3Ugd2FudCB0byBjb25maWd1cmU/JyxcbiAgICAgIGhpbnQ6ICdTcGFjZTogU2VsZWN0IHNwZWNpZmljLCBBOiBTZWxlY3QgYWxsLCBFbnRlcjogQ29uZmlybS4nLFxuICAgICAgaW5zdHJ1Y3Rpb25zOiAnJyxcbiAgICAgIGNob2ljZXNcbiAgICB9LFxuICAgIHsgb25TdWJtaXQgfVxuICApO1xufTtcblxuLyoqXG4gKiBNYXBzIG9sZC1zdHJ1Y3R1cmVkIChQaGFudG9tSlMpIG9wdGlvbnMgdG8gYSBuZXcgY29uZmlndXJhdGlvbiBmb3JtYXRcbiAqIChQdXBwZXRlZXIpLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvbGRPcHRpb25zIC0gT2xkLXN0cnVjdHVyZWQgb3B0aW9ucyB0byBiZSBtYXBwZWQuXG4gKlxuICogQHJldHVybnMge09iamVjdH0gTmV3IG9wdGlvbnMgc3RydWN0dXJlZCBiYXNlZCBvbiB0aGUgZGVmaW5lZCBuZXN0ZWRBcmdzXG4gKiBtYXBwaW5nLlxuICovXG5leHBvcnQgY29uc3QgbWFwVG9OZXdDb25maWcgPSAob2xkT3B0aW9ucykgPT4ge1xuICBjb25zdCBuZXdPcHRpb25zID0ge307XG4gIC8vIEN5Y2xlIHRocm91Z2ggb2xkLXN0cnVjdHVyZWQgb3B0aW9uc1xuICBmb3IgKGNvbnN0IFtrZXksIHZhbHVlXSBvZiBPYmplY3QuZW50cmllcyhvbGRPcHRpb25zKSkge1xuICAgIGNvbnN0IHByb3BlcnRpZXNDaGFpbiA9IG5lc3RlZEFyZ3Nba2V5XSA/IG5lc3RlZEFyZ3Nba2V5XS5zcGxpdCgnLicpIDogW107XG5cbiAgICAvLyBQb3B1bGF0ZSBvYmplY3QgaW4gY29ycmVjdCBwcm9wZXJ0aWVzIGxldmVsc1xuICAgIHByb3BlcnRpZXNDaGFpbi5yZWR1Y2UoXG4gICAgICAob2JqLCBwcm9wLCBpbmRleCkgPT5cbiAgICAgICAgKG9ialtwcm9wXSA9XG4gICAgICAgICAgcHJvcGVydGllc0NoYWluLmxlbmd0aCAtIDEgPT09IGluZGV4ID8gdmFsdWUgOiBvYmpbcHJvcF0gfHwge30pLFxuICAgICAgbmV3T3B0aW9uc1xuICAgICk7XG4gIH1cbiAgcmV0dXJuIG5ld09wdGlvbnM7XG59O1xuXG4vKipcbiAqIE1lcmdlcyB0d28gc2V0cyBvZiBjb25maWd1cmF0aW9uIG9wdGlvbnMsIGNvbnNpZGVyaW5nIGFic29sdXRlIHByb3BlcnRpZXMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBPcmlnaW5hbCBjb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gKiBAcGFyYW0ge09iamVjdH0gbmV3T3B0aW9ucyAtIE5ldyBjb25maWd1cmF0aW9uIG9wdGlvbnMgdG8gYmUgbWVyZ2VkLlxuICogQHBhcmFtIHtBcnJheX0gYWJzb2x1dGVQcm9wcyAtIExpc3Qgb2YgcHJvcGVydGllcyB0aGF0IHNob3VsZFxuICogbm90IGJlIHJlY3Vyc2l2ZWx5IG1lcmdlZC5cbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBNZXJnZWQgY29uZmlndXJhdGlvbiBvcHRpb25zLlxuICovXG5leHBvcnQgY29uc3QgbWVyZ2VDb25maWdPcHRpb25zID0gKG9wdGlvbnMsIG5ld09wdGlvbnMsIGFic29sdXRlUHJvcHMgPSBbXSkgPT4ge1xuICBjb25zdCBtZXJnZWRPcHRpb25zID0gZGVlcENvcHkob3B0aW9ucyk7XG5cbiAgZm9yIChjb25zdCBba2V5LCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMobmV3T3B0aW9ucykpIHtcbiAgICBtZXJnZWRPcHRpb25zW2tleV0gPVxuICAgICAgaXNPYmplY3QodmFsdWUpICYmXG4gICAgICAhYWJzb2x1dGVQcm9wcy5pbmNsdWRlcyhrZXkpICYmXG4gICAgICBtZXJnZWRPcHRpb25zW2tleV0gIT09IHVuZGVmaW5lZFxuICAgICAgICA/IG1lcmdlQ29uZmlnT3B0aW9ucyhtZXJnZWRPcHRpb25zW2tleV0sIHZhbHVlLCBhYnNvbHV0ZVByb3BzKVxuICAgICAgICA6IHZhbHVlICE9PSB1bmRlZmluZWRcbiAgICAgICAgICA/IHZhbHVlXG4gICAgICAgICAgOiBtZXJnZWRPcHRpb25zW2tleV07XG4gIH1cblxuICByZXR1cm4gbWVyZ2VkT3B0aW9ucztcbn07XG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgZXhwb3J0IHNldHRpbmdzIGJhc2VkIG9uIHByb3ZpZGVkIGV4cG9ydE9wdGlvbnNcbiAqIGFuZCBnZW5lcmFsT3B0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gZXhwb3J0T3B0aW9ucyAtIE9wdGlvbnMgc3BlY2lmaWMgdG8gdGhlIGV4cG9ydCBwcm9jZXNzLlxuICogQHBhcmFtIHtPYmplY3R9IGdlbmVyYWxPcHRpb25zIC0gR2VuZXJhbCBjb25maWd1cmF0aW9uIG9wdGlvbnMuXG4gKlxuICogQHJldHVybnMge09iamVjdH0gSW5pdGlhbGl6ZWQgZXhwb3J0IHNldHRpbmdzLlxuICovXG5leHBvcnQgY29uc3QgaW5pdEV4cG9ydFNldHRpbmdzID0gKGV4cG9ydE9wdGlvbnMsIGdlbmVyYWxPcHRpb25zID0ge30pID0+IHtcbiAgbGV0IG9wdGlvbnMgPSB7fTtcblxuICBpZiAoZXhwb3J0T3B0aW9ucy5zdmcpIHtcbiAgICBvcHRpb25zID0gZGVlcENvcHkoZ2VuZXJhbE9wdGlvbnMpO1xuICAgIG9wdGlvbnMuZXhwb3J0LnR5cGUgPSBleHBvcnRPcHRpb25zLnR5cGUgfHwgZXhwb3J0T3B0aW9ucy5leHBvcnQudHlwZTtcbiAgICBvcHRpb25zLmV4cG9ydC5zY2FsZSA9IGV4cG9ydE9wdGlvbnMuc2NhbGUgfHwgZXhwb3J0T3B0aW9ucy5leHBvcnQuc2NhbGU7XG4gICAgb3B0aW9ucy5leHBvcnQub3V0ZmlsZSA9XG4gICAgICBleHBvcnRPcHRpb25zLm91dGZpbGUgfHwgZXhwb3J0T3B0aW9ucy5leHBvcnQub3V0ZmlsZTtcbiAgICBvcHRpb25zLnBheWxvYWQgPSB7XG4gICAgICBzdmc6IGV4cG9ydE9wdGlvbnMuc3ZnXG4gICAgfTtcbiAgfSBlbHNlIHtcbiAgICBvcHRpb25zID0gbWVyZ2VDb25maWdPcHRpb25zKFxuICAgICAgZ2VuZXJhbE9wdGlvbnMsXG4gICAgICBleHBvcnRPcHRpb25zLFxuICAgICAgLy8gT21pdCBnb2luZyBkb3duIHJlY3Vyc2l2ZWx5IHdpdGggdGhlIGJlbG93c1xuICAgICAgYWJzb2x1dGVQcm9wc1xuICAgICk7XG4gIH1cblxuICBvcHRpb25zLmV4cG9ydC5vdXRmaWxlID1cbiAgICBvcHRpb25zLmV4cG9ydD8ub3V0ZmlsZSB8fCBgY2hhcnQuJHtvcHRpb25zLmV4cG9ydD8udHlwZSB8fCAncG5nJ31gO1xuICByZXR1cm4gb3B0aW9ucztcbn07XG5cbi8qKlxuICogTG9hZHMgYWRkaXRpb25hbCBjb25maWd1cmF0aW9uIGZyb20gYSBzcGVjaWZpZWQgZmlsZSB1c2luZ1xuICogdGhlIC0tbG9hZENvbmZpZyBvcHRpb24uXG4gKlxuICogQHBhcmFtIHtBcnJheX0gYXJncyAtIENvbW1hbmQtbGluZSBhcmd1bWVudHMgdG8gY2hlY2sgZm9yXG4gKiB0aGUgLS1sb2FkQ29uZmlnIG9wdGlvbi5cbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBBZGRpdGlvbmFsIGNvbmZpZ3VyYXRpb24gbG9hZGVkIGZyb20gdGhlIHNwZWNpZmllZCBmaWxlLFxuICogb3IgYW4gZW1wdHkgb2JqZWN0IGlmIG5vdCBmb3VuZCBvciBpbnZhbGlkLlxuICovXG5mdW5jdGlvbiBsb2FkQ29uZmlnRmlsZShhcmdzKSB7XG4gIC8vIENoZWNrIGlmIHRoZSAtLWxvYWRDb25maWcgb3B0aW9uIHdhcyB1c2VkXG4gIGNvbnN0IGNvbmZpZ0luZGV4ID0gYXJncy5maW5kSW5kZXgoXG4gICAgKGFyZykgPT4gYXJnLnJlcGxhY2UoLy0vZywgJycpID09PSAnbG9hZENvbmZpZydcbiAgKTtcblxuICAvLyBDaGVjayBpZiB0aGUgLS1sb2FkQ29uZmlnIGhhcyBhIHZhbHVlXG4gIGlmIChjb25maWdJbmRleCA+IC0xICYmIGFyZ3NbY29uZmlnSW5kZXggKyAxXSkge1xuICAgIGNvbnN0IGZpbGVOYW1lID0gYXJnc1tjb25maWdJbmRleCArIDFdO1xuICAgIHRyeSB7XG4gICAgICAvLyBDaGVjayBpZiBhbiBhZGRpdGlvbmFsIGNvbmZpZyBmaWxlIGlzIGEgY29ycmVjdCBKU09OIGZpbGVcbiAgICAgIGlmIChmaWxlTmFtZSAmJiBmaWxlTmFtZS5lbmRzV2l0aCgnLmpzb24nKSkge1xuICAgICAgICAvLyBMb2FkIGFuIG9wdGlvbmFsIGN1c3RvbSBKU09OIGNvbmZpZyBmaWxlXG4gICAgICAgIHJldHVybiBKU09OLnBhcnNlKHJlYWRGaWxlU3luYyhmaWxlTmFtZSkpO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dXaXRoU3RhY2soXG4gICAgICAgIDIsXG4gICAgICAgIGVycm9yLFxuICAgICAgICBgW2NvbmZpZ10gVW5hYmxlIHRvIGxvYWQgdGhlIGNvbmZpZ3VyYXRpb24gZnJvbSB0aGUgJHtmaWxlTmFtZX0gZmlsZS5gXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIE5vIGFkZGl0aW9uYWwgb3B0aW9ucyB0byByZXR1cm5cbiAgcmV0dXJuIHt9O1xufVxuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIGRlZmF1bHQgY29uZmlndXJhdGlvbiBvYmplY3Qgd2l0aCB2YWx1ZXMgZnJvbSBhIGN1c3RvbSBvYmplY3RcbiAqIGFuZCBlbnZpcm9ubWVudCB2YXJpYWJsZXMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IGNvbmZpZ09iaiAtIFRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IGN1c3RvbU9iaiAtIEN1c3RvbSBjb25maWd1cmF0aW9uIG9iamVjdCB0byBvdmVycmlkZSBkZWZhdWx0cy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBwcm9wQ2hhaW4gLSBQcm9wZXJ0eSBjaGFpbiBmb3IgdHJhY2tpbmcgbmVzdGVkIHByb3BlcnRpZXNcbiAqIGR1cmluZyByZWN1cnNpb24uXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZURlZmF1bHRDb25maWcoY29uZmlnT2JqLCBjdXN0b21PYmogPSB7fSwgcHJvcENoYWluID0gJycpIHtcbiAgT2JqZWN0LmtleXMoY29uZmlnT2JqKS5mb3JFYWNoKChrZXkpID0+IHtcbiAgICBjb25zdCBlbnRyeSA9IGNvbmZpZ09ialtrZXldO1xuICAgIGNvbnN0IGN1c3RvbVZhbHVlID0gY3VzdG9tT2JqICYmIGN1c3RvbU9ialtrZXldO1xuXG4gICAgaWYgKHR5cGVvZiBlbnRyeS52YWx1ZSA9PT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIHVwZGF0ZURlZmF1bHRDb25maWcoZW50cnksIGN1c3RvbVZhbHVlLCBgJHtwcm9wQ2hhaW59LiR7a2V5fWApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBJZiBhIHZhbHVlIGZyb20gYSBjdXN0b20gSlNPTiBleGlzdHMsIGl0IHRha2UgcHJlY2VkZW5jZVxuICAgICAgaWYgKGN1c3RvbVZhbHVlICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZW50cnkudmFsdWUgPSBjdXN0b21WYWx1ZTtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgYSB2YWx1ZSBmcm9tIGFuIGVudiB2YXJpYWJsZSBleGlzdHMsIGl0IHRha2UgcHJlY2VkZW5jZVxuICAgICAgaWYgKGVudHJ5LmVudkxpbmsgaW4gZW52cyAmJiBlbnZzW2VudHJ5LmVudkxpbmtdICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgZW50cnkudmFsdWUgPSBlbnZzW2VudHJ5LmVudkxpbmtdO1xuICAgICAgfVxuICAgIH1cbiAgfSk7XG59XG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgb3B0aW9ucyBvYmplY3QgYmFzZWQgb24gcHJvdmlkZWQgaXRlbXMsIHNldHRpbmcgdmFsdWVzIGZyb21cbiAqIG5lc3RlZCBwcm9wZXJ0aWVzIHJlY3Vyc2l2ZWx5LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBpdGVtcyAtIENvbmZpZ3VyYXRpb24gaXRlbXMgdG8gYmUgdXNlZCBmb3IgaW5pdGlhbGl6aW5nXG4gKiBvcHRpb25zLlxuICpcbiAqIEByZXR1cm5zIHtPYmplY3R9IEluaXRpYWxpemVkIG9wdGlvbnMgb2JqZWN0LlxuICovXG5mdW5jdGlvbiBpbml0T3B0aW9ucyhpdGVtcykge1xuICBsZXQgb3B0aW9ucyA9IHt9O1xuICBmb3IgKGNvbnN0IFtuYW1lLCBpdGVtXSBvZiBPYmplY3QuZW50cmllcyhpdGVtcykpIHtcbiAgICBvcHRpb25zW25hbWVdID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGl0ZW0sICd2YWx1ZScpXG4gICAgICA/IGl0ZW0udmFsdWVcbiAgICAgIDogaW5pdE9wdGlvbnMoaXRlbSk7XG4gIH1cbiAgcmV0dXJuIG9wdGlvbnM7XG59XG5cbi8qKlxuICogUGFpcnMgYXJndW1lbnQgdmFsdWVzIHdpdGggY29ycmVzcG9uZGluZyBvcHRpb25zIGluIHRoZSBjb25maWd1cmF0aW9uLFxuICogdXBkYXRpbmcgdGhlIG9wdGlvbnMgb2JqZWN0LlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gQ29uZmlndXJhdGlvbiBvcHRpb25zIG9iamVjdCB0byBiZSB1cGRhdGVkLlxuICogQHBhcmFtIHtBcnJheX0gYXJncyAtIENvbW1hbmQtbGluZSBhcmd1bWVudHMgY29udGFpbmluZyB2YWx1ZXMgZm9yIHNwZWNpZmljXG4gKiBvcHRpb25zLlxuICogQHBhcmFtIHtPYmplY3R9IGRlZmF1bHRDb25maWcgLSBEZWZhdWx0IGNvbmZpZ3VyYXRpb24gb2JqZWN0IGZvciByZWZlcmVuY2UuXG4gKlxuICogQHJldHVybnMge09iamVjdH0gVXBkYXRlZCBvcHRpb25zIG9iamVjdC5cbiAqL1xuZnVuY3Rpb24gcGFpckFyZ3VtZW50VmFsdWUob3B0aW9ucywgYXJncywgZGVmYXVsdENvbmZpZykge1xuICBsZXQgc2hvd1VzYWdlID0gZmFsc2U7XG4gIGZvciAobGV0IGkgPSAwOyBpIDwgYXJncy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IG9wdGlvbiA9IGFyZ3NbaV0ucmVwbGFjZSgvLS9nLCAnJyk7XG5cbiAgICAvLyBGaW5kIHRoZSByaWdodCBwbGFjZSBmb3IgcHJvcGVydHkncyB2YWx1ZVxuICAgIGNvbnN0IHByb3BlcnRpZXNDaGFpbiA9IG5lc3RlZEFyZ3Nbb3B0aW9uXVxuICAgICAgPyBuZXN0ZWRBcmdzW29wdGlvbl0uc3BsaXQoJy4nKVxuICAgICAgOiBbXTtcblxuICAgIC8vIEdldCB0aGUgY29ycmVjdCB0eXBlIGZvciBDTEkgYXJncyB3aGljaCBhcmUgcGFzc2VkIGFzIHN0cmluZ3NcbiAgICBsZXQgYXJndW1lbnRUeXBlO1xuICAgIHByb3BlcnRpZXNDaGFpbi5yZWR1Y2UoKG9iaiwgcHJvcCwgaW5kZXgpID0+IHtcbiAgICAgIGlmIChwcm9wZXJ0aWVzQ2hhaW4ubGVuZ3RoIC0gMSA9PT0gaW5kZXgpIHtcbiAgICAgICAgYXJndW1lbnRUeXBlID0gb2JqW3Byb3BdLnR5cGU7XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqW3Byb3BdO1xuICAgIH0sIGRlZmF1bHRDb25maWcpO1xuXG4gICAgcHJvcGVydGllc0NoYWluLnJlZHVjZSgob2JqLCBwcm9wLCBpbmRleCkgPT4ge1xuICAgICAgaWYgKHByb3BlcnRpZXNDaGFpbi5sZW5ndGggLSAxID09PSBpbmRleCkge1xuICAgICAgICAvLyBGaW5kcyBhbiBvcHRpb24gYW5kIHNldCBhIGNvcnJlc3BvbmRpbmcgdmFsdWVcbiAgICAgICAgaWYgKHR5cGVvZiBvYmpbcHJvcF0gIT09ICd1bmRlZmluZWQnKSB7XG4gICAgICAgICAgaWYgKGFyZ3NbKytpXSkge1xuICAgICAgICAgICAgaWYgKGFyZ3VtZW50VHlwZSA9PT0gJ2Jvb2xlYW4nKSB7XG4gICAgICAgICAgICAgIG9ialtwcm9wXSA9IHRvQm9vbGVhbihhcmdzW2ldKTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJndW1lbnRUeXBlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICBvYmpbcHJvcF0gPSArYXJnc1tpXTtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJndW1lbnRUeXBlLmluZGV4T2YoJ10nKSA+PSAwKSB7XG4gICAgICAgICAgICAgIG9ialtwcm9wXSA9IGFyZ3NbaV0uc3BsaXQoJywnKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgIG9ialtwcm9wXSA9IGFyZ3NbaV07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGxvZyhcbiAgICAgICAgICAgICAgMixcbiAgICAgICAgICAgICAgYFtjb25maWddIE1pc3NpbmcgdmFsdWUgZm9yIHRoZSAnJHtvcHRpb259JyBhcmd1bWVudC4gVXNpbmcgdGhlIGRlZmF1bHQgdmFsdWUuYFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIHNob3dVc2FnZSA9IHRydWU7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICByZXR1cm4gb2JqW3Byb3BdO1xuICAgIH0sIG9wdGlvbnMpO1xuICB9XG5cbiAgLy8gRGlzcGxheSB0aGUgdXNhZ2UgZm9yIHRoZSByZWZlcmVuY2UgaWYgbmVlZGVkXG4gIGlmIChzaG93VXNhZ2UpIHtcbiAgICBwcmludFVzYWdlKGRlZmF1bHRDb25maWcpO1xuICB9XG5cbiAgcmV0dXJuIG9wdGlvbnM7XG59XG5cbi8qKlxuICogUmVjdXJzaXZlbHkgdXBkYXRlcyBwcm9wZXJ0aWVzIGluIGFuIG9iamVjdCBiYXNlZCBvbiBuZXN0ZWQgbmFtZXMgYW5kIGFzc2lnbnNcbiAqIHRoZSBmaW5hbCB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0VG9VcGRhdGUgLSBUaGUgb2JqZWN0IHRvIGJlIHVwZGF0ZWQuXG4gKiBAcGFyYW0ge0FycmF5fSBuZXN0ZWROYW1lcyAtIEFycmF5IG9mIG5lc3RlZCBwcm9wZXJ0eSBuYW1lcy5cbiAqIEBwYXJhbSB7YW55fSB2YWx1ZSAtIFRoZSBmaW5hbCB2YWx1ZSB0byBiZSBhc3NpZ25lZC5cbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBVcGRhdGVkIG9iamVjdCB3aXRoIGFzc2lnbmVkIHZhbHVlcy5cbiAqL1xuZnVuY3Rpb24gcmVjdXJzaXZlUHJvcHMob2JqZWN0VG9VcGRhdGUsIG5lc3RlZE5hbWVzLCB2YWx1ZSkge1xuICB3aGlsZSAobmVzdGVkTmFtZXMubGVuZ3RoID4gMSkge1xuICAgIGNvbnN0IHByb3BOYW1lID0gbmVzdGVkTmFtZXMuc2hpZnQoKTtcblxuICAgIC8vIENyZWF0ZSBhIHByb3BlcnR5IGluIG9iamVjdCBpZiBpdCBkb2Vzbid0IGV4aXN0XG4gICAgaWYgKCFPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqZWN0VG9VcGRhdGUsIHByb3BOYW1lKSkge1xuICAgICAgb2JqZWN0VG9VcGRhdGVbcHJvcE5hbWVdID0ge307XG4gICAgfVxuXG4gICAgLy8gQ2FsbCBmdW5jdGlvbiBhZ2FpbiBpZiB0aGVyZSBzdGlsbCBuYW1lcyB0byBnb1xuICAgIG9iamVjdFRvVXBkYXRlW3Byb3BOYW1lXSA9IHJlY3Vyc2l2ZVByb3BzKFxuICAgICAgT2JqZWN0LmFzc2lnbih7fSwgb2JqZWN0VG9VcGRhdGVbcHJvcE5hbWVdKSxcbiAgICAgIG5lc3RlZE5hbWVzLFxuICAgICAgdmFsdWVcbiAgICApO1xuXG4gICAgcmV0dXJuIG9iamVjdFRvVXBkYXRlO1xuICB9XG5cbiAgLy8gQXNzaWduIHRoZSBmaW5hbCB2YWx1ZVxuICBvYmplY3RUb1VwZGF0ZVtuZXN0ZWROYW1lc1swXV0gPSB2YWx1ZTtcbiAgcmV0dXJuIG9iamVjdFRvVXBkYXRlO1xufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGdldE9wdGlvbnMsXG4gIHNldE9wdGlvbnMsXG4gIG1hbnVhbENvbmZpZyxcbiAgbWFwVG9OZXdDb25maWcsXG4gIG1lcmdlQ29uZmlnT3B0aW9ucyxcbiAgaW5pdEV4cG9ydFNldHRpbmdzXG59O1xuIiwiLyoqXG4gKiBUaGlzIG1vZHVsZSBleHBvcnRzIHR3byBmdW5jdGlvbnM6IGZldGNoIChmb3IgR0VUIHJlcXVlc3RzKSBhbmQgcG9zdCAoZm9yIFBPU1QgcmVxdWVzdHMpLlxuICovXG5cbmltcG9ydCBodHRwIGZyb20gJ2h0dHAnO1xuaW1wb3J0IGh0dHBzIGZyb20gJ2h0dHBzJztcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBIVFRQIG9yIEhUVFBTIHByb3RvY29sIG1vZHVsZSBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgVVJMLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgLSBUaGUgVVJMIHRvIGRldGVybWluZSB0aGUgcHJvdG9jb2wuXG4gKlxuICogQHJldHVybnMge09iamVjdH0gVGhlIEhUVFAgb3IgSFRUUFMgcHJvdG9jb2wgbW9kdWxlIChodHRwIG9yIGh0dHBzKS5cbiAqL1xuY29uc3QgZ2V0UHJvdG9jb2wgPSAodXJsKSA9PiAodXJsLnN0YXJ0c1dpdGgoJ2h0dHBzJykgPyBodHRwcyA6IGh0dHApO1xuXG4vKipcbiAqIEZldGNoZXMgZGF0YSBmcm9tIHRoZSBzcGVjaWZpZWQgVVJMIHVzaW5nIGVpdGhlciBIVFRQIG9yIEhUVFBTIHByb3RvY29sLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSB1cmwgLSBUaGUgVVJMIHRvIGZldGNoIGRhdGEgZnJvbS5cbiAqIEBwYXJhbSB7T2JqZWN0fSByZXF1ZXN0T3B0aW9ucyAtIE9wdGlvbnMgZm9yIHRoZSBIVFRQIHJlcXVlc3QgKG9wdGlvbmFsKS5cbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxPYmplY3Q+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgSFRUUCByZXNwb25zZSBvYmplY3RcbiAqIHdpdGggYWRkZWQgJ3RleHQnIHByb3BlcnR5IG9yIHJlamVjdGluZyB3aXRoIGFuIGVycm9yLlxuICovXG5hc3luYyBmdW5jdGlvbiBmZXRjaCh1cmwsIHJlcXVlc3RPcHRpb25zID0ge30pIHtcbiAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICBjb25zdCBwcm90b2NvbCA9IGdldFByb3RvY29sKHVybCk7XG5cbiAgICBwcm90b2NvbFxuICAgICAgLmdldChcbiAgICAgICAgdXJsLFxuICAgICAgICBPYmplY3QuYXNzaWduKFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAgICAgJ1VzZXItQWdlbnQnOiAnaGlnaGNoYXJ0cy9leHBvcnQnLFxuICAgICAgICAgICAgICBSZWZlcmVyOiAnaGlnaGNoYXJ0cy9leHBvcnQnXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSxcbiAgICAgICAgICByZXF1ZXN0T3B0aW9ucyB8fCB7fVxuICAgICAgICApLFxuICAgICAgICAocmVzKSA9PiB7XG4gICAgICAgICAgbGV0IGRhdGEgPSAnJztcblxuICAgICAgICAgIC8vIEEgY2h1bmsgb2YgZGF0YSBoYXMgYmVlbiByZWNlaXZlZC5cbiAgICAgICAgICByZXMub24oJ2RhdGEnLCAoY2h1bmspID0+IHtcbiAgICAgICAgICAgIGRhdGEgKz0gY2h1bms7XG4gICAgICAgICAgfSk7XG5cbiAgICAgICAgICAvLyBUaGUgd2hvbGUgcmVzcG9uc2UgaGFzIGJlZW4gcmVjZWl2ZWQuXG4gICAgICAgICAgcmVzLm9uKCdlbmQnLCAoKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWRhdGEpIHtcbiAgICAgICAgICAgICAgcmVqZWN0KCdOb3RoaW5nIHdhcyBmZXRjaGVkIGZyb20gdGhlIFVSTC4nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmVzLnRleHQgPSBkYXRhO1xuICAgICAgICAgICAgcmVzb2x2ZShyZXMpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICApXG4gICAgICAub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9KTtcbiAgfSk7XG59XG5cbi8qKlxuICogU2VuZHMgYSBQT1NUIHJlcXVlc3QgdG8gdGhlIHNwZWNpZmllZCBVUkwgd2l0aCB0aGUgcHJvdmlkZWQgSlNPTiBib2R5IHVzaW5nXG4gKiBlaXRoZXIgSFRUUCBvciBIVFRQUyBwcm90b2NvbC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gdXJsIC0gVGhlIFVSTCB0byBzZW5kIHRoZSBQT1NUIHJlcXVlc3QgdG8uXG4gKiBAcGFyYW0ge09iamVjdH0gYm9keSAtIFRoZSBKU09OIGJvZHkgdG8gaW5jbHVkZSBpbiB0aGUgUE9TVCByZXF1ZXN0XG4gKiAob3B0aW9uYWwsIGRlZmF1bHQgaXMgYW4gZW1wdHkgb2JqZWN0KS5cbiAqIEBwYXJhbSB7T2JqZWN0fSByZXF1ZXN0T3B0aW9ucyAtIE9wdGlvbnMgZm9yIHRoZSBIVFRQIHJlcXVlc3QgKG9wdGlvbmFsKS5cbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxPYmplY3Q+fSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgSFRUUCByZXNwb25zZSBvYmplY3Qgd2l0aFxuICogYWRkZWQgJ3RleHQnIHByb3BlcnR5IG9yIHJlamVjdGluZyB3aXRoIGFuIGVycm9yLlxuICovXG5hc3luYyBmdW5jdGlvbiBwb3N0KHVybCwgYm9keSA9IHt9LCByZXF1ZXN0T3B0aW9ucyA9IHt9KSB7XG4gIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgY29uc3QgcHJvdG9jb2wgPSBnZXRQcm90b2NvbCh1cmwpO1xuICAgIGNvbnN0IGRhdGEgPSBKU09OLnN0cmluZ2lmeShib2R5KTtcblxuICAgIC8vIFNldCBkZWZhdWx0IGhlYWRlcnMgYW5kIG1lcmdlIHdpdGggcmVxdWVzdE9wdGlvbnNcbiAgICBjb25zdCBvcHRpb25zID0gT2JqZWN0LmFzc2lnbihcbiAgICAgIHtcbiAgICAgICAgbWV0aG9kOiAnUE9TVCcsXG4gICAgICAgIGhlYWRlcnM6IHtcbiAgICAgICAgICAnQ29udGVudC1UeXBlJzogJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgICAgICAgICdDb250ZW50LUxlbmd0aCc6IGRhdGEubGVuZ3RoXG4gICAgICAgIH1cbiAgICAgIH0sXG4gICAgICByZXF1ZXN0T3B0aW9uc1xuICAgICk7XG5cbiAgICBjb25zdCByZXEgPSBwcm90b2NvbFxuICAgICAgLnJlcXVlc3QodXJsLCBvcHRpb25zLCAocmVzKSA9PiB7XG4gICAgICAgIGxldCByZXNwb25zZURhdGEgPSAnJztcblxuICAgICAgICAvLyBBIGNodW5rIG9mIGRhdGEgaGFzIGJlZW4gcmVjZWl2ZWQuXG4gICAgICAgIHJlcy5vbignZGF0YScsIChjaHVuaykgPT4ge1xuICAgICAgICAgIHJlc3BvbnNlRGF0YSArPSBjaHVuaztcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gVGhlIHdob2xlIHJlc3BvbnNlIGhhcyBiZWVuIHJlY2VpdmVkLlxuICAgICAgICByZXMub24oJ2VuZCcsICgpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgcmVzLnRleHQgPSByZXNwb25zZURhdGE7XG4gICAgICAgICAgICByZXNvbHZlKHJlcyk7XG4gICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgICAub24oJ2Vycm9yJywgKGVycm9yKSA9PiB7XG4gICAgICAgIHJlamVjdChlcnJvcik7XG4gICAgICB9KTtcblxuICAgIC8vIFdyaXRlIHRoZSByZXF1ZXN0IGJvZHkgYW5kIGVuZCB0aGUgcmVxdWVzdC5cbiAgICByZXEud3JpdGUoZGF0YSk7XG4gICAgcmVxLmVuZCgpO1xuICB9KTtcbn1cblxuZXhwb3J0IGRlZmF1bHQgZmV0Y2g7XG5leHBvcnQgeyBmZXRjaCwgcG9zdCB9O1xuIiwiY2xhc3MgRXhwb3J0RXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2UpIHtcbiAgICBzdXBlcigpO1xuICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7XG4gICAgdGhpcy5zdGFja01lc3NhZ2UgPSBtZXNzYWdlO1xuICB9XG5cbiAgc2V0RXJyb3IoZXJyb3IpIHtcbiAgICB0aGlzLmVycm9yID0gZXJyb3I7XG4gICAgaWYgKGVycm9yLm5hbWUpIHtcbiAgICAgIHRoaXMubmFtZSA9IGVycm9yLm5hbWU7XG4gICAgfVxuICAgIGlmIChlcnJvci5zdGF0dXNDb2RlKSB7XG4gICAgICB0aGlzLnN0YXR1c0NvZGUgPSBlcnJvci5zdGF0dXNDb2RlO1xuICAgIH1cbiAgICBpZiAoZXJyb3Iuc3RhY2spIHtcbiAgICAgIHRoaXMuc3RhY2tNZXNzYWdlID0gZXJyb3IubWVzc2FnZTtcbiAgICAgIHRoaXMuc3RhY2sgPSBlcnJvci5zdGFjaztcbiAgICB9XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgRXhwb3J0RXJyb3I7XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5IaWdoY2hhcnRzIEV4cG9ydCBTZXJ2ZXJcblxuQ29weXJpZ2h0IChjKSAyMDE2LTIwMjQsIEhpZ2hzb2Z0XG5cbkxpY2VuY2VkIHVuZGVyIHRoZSBNSVQgbGljZW5jZS5cblxuQWRkaXRpb25hbGx5IGEgdmFsaWQgSGlnaGNoYXJ0cyBsaWNlbnNlIGlzIHJlcXVpcmVkIGZvciB1c2UuXG5cblNlZSBMSUNFTlNFIGZpbGUgaW4gcm9vdCBmb3IgZGV0YWlscy5cblxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuLy8gVGhlIGNhY2hlIG1hbmFnZXIgbWFuYWdlcyB0aGUgSGlnaGNoYXJ0cyBsaWJyYXJ5IGFuZCBpdHMgZGVwZW5kZW5jaWVzLlxuLy8gVGhlIGNhY2hlIGl0c2VsZiBpcyBzdG9yZWQgaW4gLmNhY2hlLCBhbmQgaXMgY2hlY2tlZCBieSB0aGUgY29uZmlnIHN5c3RlbVxuLy8gYmVmb3JlIHN0YXJ0aW5nIHRoZSBzZXJ2aWNlXG5cbmltcG9ydCB7IGV4aXN0c1N5bmMsIG1rZGlyU3luYywgcmVhZEZpbGVTeW5jLCB3cml0ZUZpbGVTeW5jIH0gZnJvbSAnZnMnO1xuaW1wb3J0IHsgam9pbiB9IGZyb20gJ3BhdGgnO1xuXG5pbXBvcnQgeyBIdHRwc1Byb3h5QWdlbnQgfSBmcm9tICdodHRwcy1wcm94eS1hZ2VudCc7XG5cbmltcG9ydCB7IGdldE9wdGlvbnMgfSBmcm9tICcuL2NvbmZpZy5qcyc7XG5pbXBvcnQgeyBlbnZzIH0gZnJvbSAnLi9lbnZzLmpzJztcbmltcG9ydCB7IGZldGNoIH0gZnJvbSAnLi9mZXRjaC5qcyc7XG5pbXBvcnQgeyBsb2cgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBfX2Rpcm5hbWUgfSBmcm9tICcuL3V0aWxzLmpzJztcblxuaW1wb3J0IEV4cG9ydEVycm9yIGZyb20gJy4vZXJyb3JzL0V4cG9ydEVycm9yLmpzJztcblxuY29uc3QgY2FjaGUgPSB7XG4gIGNkblVSTDogJ2h0dHBzOi8vY29kZS5oaWdoY2hhcnRzLmNvbS8nLFxuICBhY3RpdmVNYW5pZmVzdDoge30sXG4gIHNvdXJjZXM6ICcnLFxuICBoY1ZlcnNpb246ICcnXG59O1xuXG4vKipcbiAqIEV4dHJhY3RzIGFuZCBjYWNoZXMgdGhlIEhpZ2hjaGFydHMgdmVyc2lvbiBmcm9tIHRoZSBzb3VyY2VzIHN0cmluZy5cbiAqXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgZXh0cmFjdGVkIEhpZ2hjaGFydHMgdmVyc2lvbi5cbiAqL1xuZXhwb3J0IGNvbnN0IGV4dHJhY3RWZXJzaW9uID0gKGNhY2hlKSA9PiB7XG4gIHJldHVybiBjYWNoZS5zb3VyY2VzXG4gICAgLnN1YnN0cmluZygwLCBjYWNoZS5zb3VyY2VzLmluZGV4T2YoJyovJykpXG4gICAgLnJlcGxhY2UoJy8qJywgJycpXG4gICAgLnJlcGxhY2UoJyovJywgJycpXG4gICAgLnJlcGxhY2UoL1xcbi9nLCAnJylcbiAgICAudHJpbSgpO1xufTtcblxuLyoqXG4gKiBFeHRyYWN0cyB0aGUgSGlnaGNoYXJ0cyBtb2R1bGUgbmFtZSBiYXNlZCBvbiB0aGUgc2NyaXB0UGF0aC5cbiAqL1xuZXhwb3J0IGNvbnN0IGV4dHJhY3RNb2R1bGVOYW1lID0gKHNjcmlwdFBhdGgpID0+IHtcbiAgcmV0dXJuIHNjcmlwdFBhdGgucmVwbGFjZShcbiAgICAvKC4qKVxcL3woLiopbW9kdWxlc1xcL3xzdG9ja1xcLyguKilpbmRpY2F0b3JzXFwvfG1hcHNcXC8oLiopbW9kdWxlc1xcLy9naSxcbiAgICAnJ1xuICApO1xufTtcblxuLyoqXG4gKiBTYXZlcyB0aGUgcHJvdmlkZWQgY29uZmlndXJhdGlvbiBhbmQgZmV0Y2hlZCBtb2R1bGVzIHRvIHRoZSBjYWNoZSBtYW5pZmVzdFxuICogZmlsZS5cbiAqXG4gKiBAcGFyYW0ge29iamVjdH0gY29uZmlnIC0gSGlnaGNoYXJ0cy1yZWxhdGVkIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxuICogQHBhcmFtIHtvYmplY3R9IGZldGNoZWRNb2R1bGVzIC0gQW4gb2JqZWN0IHRoYXQgY29udGFpbnMgbWFwcGVkIG5hbWVzIG9mXG4gKiBmZXRjaGVkIEhpZ2hjaGFydHMgbW9kdWxlcyB0byB1c2UuXG4gKlxuICogQHRocm93cyB7RXhwb3J0RXJyb3J9IFRocm93cyBhbiBFeHBvcnRFcnJvciBpZiBhbiBlcnJvciBvY2N1cnMgd2hpbGUgd3JpdGluZ1xuICogdGhlIGNhY2hlIG1hbmlmZXN0LlxuICovXG5leHBvcnQgY29uc3Qgc2F2ZUNvbmZpZ1RvTWFuaWZlc3QgPSBhc3luYyAoY29uZmlnLCBmZXRjaGVkTW9kdWxlcykgPT4ge1xuICBjb25zdCBuZXdNYW5pZmVzdCA9IHtcbiAgICB2ZXJzaW9uOiBjb25maWcudmVyc2lvbixcbiAgICBtb2R1bGVzOiBmZXRjaGVkTW9kdWxlcyB8fCB7fVxuICB9O1xuXG4gIC8vIFVwZGF0ZSBjYWNoZSBvYmplY3Qgd2l0aCB0aGUgY3VycmVudCBtb2R1bGVzXG4gIGNhY2hlLmFjdGl2ZU1hbmlmZXN0ID0gbmV3TWFuaWZlc3Q7XG5cbiAgbG9nKDMsICdbY2FjaGVdIFdyaXRpbmcgYSBuZXcgbWFuaWZlc3QuJyk7XG4gIHRyeSB7XG4gICAgd3JpdGVGaWxlU3luYyhcbiAgICAgIGpvaW4oX19kaXJuYW1lLCBjb25maWcuY2FjaGVQYXRoLCAnbWFuaWZlc3QuanNvbicpLFxuICAgICAgSlNPTi5zdHJpbmdpZnkobmV3TWFuaWZlc3QpLFxuICAgICAgJ3V0ZjgnXG4gICAgKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgRXhwb3J0RXJyb3IoJ1tjYWNoZV0gRXJyb3Igd3JpdGluZyB0aGUgY2FjaGUgbWFuaWZlc3QuJykuc2V0RXJyb3IoXG4gICAgICBlcnJvclxuICAgICk7XG4gIH1cbn07XG5cbi8qKlxuICogRmV0Y2hlcyBhIHNpbmdsZSBzY3JpcHQgYW5kIHVwZGF0ZXMgdGhlIGZldGNoZWRNb2R1bGVzIGFjY29yZGluZ2x5LlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBzY3JpcHQgLSBBIHBhdGggdG8gc2NyaXB0IHRvIGdldC5cbiAqIEBwYXJhbSB7T2JqZWN0fSByZXF1ZXN0T3B0aW9ucyAtIEFkZGl0aW9uYWwgb3B0aW9ucyBmb3IgdGhlIHByb3h5IGFnZW50XG4gKiB0byB1c2UgZm9yIGEgcmVxdWVzdC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBmZXRjaGVkTW9kdWxlcyAtIEFuIG9iamVjdCB3aGljaCB0cmFja3Mgd2hpY2ggSGlnaGNoYXJ0c1xuICogbW9kdWxlcyBoYXZlIGJlZW4gZmV0Y2hlZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gc2hvdWxkVGhyb3dFcnJvciAtIEEgZmxhZyB0byBpbmRpY2F0ZSBpZiB0aGUgZXJyb3Igc2hvdWxkIGJlXG4gKiB0aHJvd24uIFRoaXMgc2hvdWxkIGJlIHVzZWQgb25seSBmb3IgdGhlIGNvcmUgc2NyaXB0cy5cbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxzdHJpbmc+fSBBIFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSB0ZXh0IHJlcHJlc2VudGF0aW9uXG4gKiBvZiB0aGUgZmV0Y2hlZCBzY3JpcHQuXG4gKlxuICogQHRocm93cyB7RXhwb3J0RXJyb3J9IFRocm93cyBhbiBFeHBvcnRFcnJvciBpZiB0aGVyZSBpcyBhIHByb2JsZW0gd2l0aFxuICogZmV0Y2hpbmcgdGhlIHNjcmlwdC5cbiAqL1xuZXhwb3J0IGNvbnN0IGZldGNoQW5kUHJvY2Vzc1NjcmlwdCA9IGFzeW5jIChcbiAgc2NyaXB0LFxuICByZXF1ZXN0T3B0aW9ucyxcbiAgZmV0Y2hlZE1vZHVsZXMsXG4gIHNob3VsZFRocm93RXJyb3IgPSBmYWxzZVxuKSA9PiB7XG4gIC8vIEdldCByaWQgb2YgdGhlIC5qcyBmcm9tIHRoZSBjdXN0b20gc3RyaW5nc1xuICBpZiAoc2NyaXB0LmVuZHNXaXRoKCcuanMnKSkge1xuICAgIHNjcmlwdCA9IHNjcmlwdC5zdWJzdHJpbmcoMCwgc2NyaXB0Lmxlbmd0aCAtIDMpO1xuICB9XG5cbiAgbG9nKDQsIGBbY2FjaGVdIEZldGNoaW5nIHNjcmlwdCAtICR7c2NyaXB0fS5qc2ApO1xuXG4gIC8vIEZldGNoIHRoZSBzY3JpcHRcbiAgY29uc3QgcmVzcG9uc2UgPSBhd2FpdCBmZXRjaChgJHtzY3JpcHR9LmpzYCwgcmVxdWVzdE9wdGlvbnMpO1xuXG4gIC8vIElmIE9LLCByZXR1cm4gaXRzIHRleHQgcmVwcmVzZW50YXRpb25cbiAgaWYgKHJlc3BvbnNlLnN0YXR1c0NvZGUgPT09IDIwMCAmJiB0eXBlb2YgcmVzcG9uc2UudGV4dCA9PSAnc3RyaW5nJykge1xuICAgIGlmIChmZXRjaGVkTW9kdWxlcykge1xuICAgICAgY29uc3QgbW9kdWxlTmFtZSA9IGV4dHJhY3RNb2R1bGVOYW1lKHNjcmlwdCk7XG4gICAgICBmZXRjaGVkTW9kdWxlc1ttb2R1bGVOYW1lXSA9IDE7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3BvbnNlLnRleHQ7XG4gIH1cblxuICBpZiAoc2hvdWxkVGhyb3dFcnJvcikge1xuICAgIHRocm93IG5ldyBFeHBvcnRFcnJvcihcbiAgICAgIGBDb3VsZCBub3QgZmV0Y2ggdGhlICR7c2NyaXB0fS5qcy4gVGhlIHNjcmlwdCBtaWdodCBub3QgZXhpc3QgaW4gdGhlIHJlcXVlc3RlZCB2ZXJzaW9uIChzdGF0dXMgY29kZTogJHtyZXNwb25zZS5zdGF0dXNDb2RlfSkuYFxuICAgICkuc2V0RXJyb3IocmVzcG9uc2UpO1xuICB9IGVsc2Uge1xuICAgIGxvZyhcbiAgICAgIDIsXG4gICAgICBgW2NhY2hlXSBDb3VsZCBub3QgZmV0Y2ggdGhlICR7c2NyaXB0fS5qcy4gVGhlIHNjcmlwdCBtaWdodCBub3QgZXhpc3QgaW4gdGhlIHJlcXVlc3RlZCB2ZXJzaW9uLmBcbiAgICApO1xuICB9XG5cbiAgcmV0dXJuICcnO1xufTtcblxuLyoqXG4gKiBGZXRjaGVzIEhpZ2hjaGFydHMgc2NyaXB0cyBhbmQgY3VzdG9tU2NyaXB0cyBmcm9tIHRoZSBnaXZlbiBDRE5zLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjb3JlU2NyaXB0cyAtIEFycmF5IG9mIEhpZ2hjaGFydHMgY29yZSBzY3JpcHRzIHRvIGZldGNoLlxuICogQHBhcmFtIHtzdHJpbmd9IG1vZHVsZVNjcmlwdHMgLSBBcnJheSBvZiBIaWdoY2hhcnRzIG1vZHVsZXMgdG8gZmV0Y2guXG4gKiBAcGFyYW0ge3N0cmluZ30gY3VzdG9tU2NyaXB0cyAtIEFycmF5IG9mIGN1c3RvbSBzY3JpcHQgcGF0aHMgdG8gZmV0Y2hcbiAqIChmdWxsIFVSTHMpLlxuICogQHBhcmFtIHtvYmplY3R9IHByb3h5T3B0aW9ucyAtIE9wdGlvbnMgZm9yIHRoZSBwcm94eSBhZ2VudCB0byB1c2UgZm9yXG4gKiBhIHJlcXVlc3QuXG4gKiBAcGFyYW0ge29iamVjdH0gZmV0Y2hlZE1vZHVsZXMgLSBBbiBvYmplY3Qgd2hpY2ggdHJhY2tzIHdoaWNoIEhpZ2hjaGFydHNcbiAqIG1vZHVsZXMgaGF2ZSBiZWVuIGZldGNoZWQuXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gVGhlIGZldGNoZWQgc2NyaXB0cyBjb250ZW50IGpvaW5lZC5cbiAqL1xuZXhwb3J0IGNvbnN0IGZldGNoU2NyaXB0cyA9IGFzeW5jIChcbiAgY29yZVNjcmlwdHMsXG4gIG1vZHVsZVNjcmlwdHMsXG4gIGN1c3RvbVNjcmlwdHMsXG4gIHByb3h5T3B0aW9ucyxcbiAgZmV0Y2hlZE1vZHVsZXNcbikgPT4ge1xuICAvLyBDb25maWd1cmUgcHJveHkgaWYgZXhpc3RzXG4gIGxldCBwcm94eUFnZW50O1xuICBjb25zdCB7IGhvc3QsIHBvcnQsIHVzZXJuYW1lLCBwYXNzd29yZCB9ID0gcHJveHlPcHRpb25zO1xuXG4gIC8vIFRyeSB0byBjcmVhdGUgYSBQcm94eSBBZ2VudFxuICBpZiAoaG9zdCAmJiBwb3J0KSB7XG4gICAgdHJ5IHtcbiAgICAgIHByb3h5QWdlbnQgPSBuZXcgSHR0cHNQcm94eUFnZW50KHtcbiAgICAgICAgaG9zdCxcbiAgICAgICAgcG9ydCxcbiAgICAgICAgLi4uKHVzZXJuYW1lICYmIHBhc3N3b3JkID8geyB1c2VybmFtZSwgcGFzc3dvcmQgfSA6IHt9KVxuICAgICAgfSk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgIHRocm93IG5ldyBFeHBvcnRFcnJvcignW2NhY2hlXSBDb3VsZCBub3QgY3JlYXRlIGEgUHJveHkgQWdlbnQuJykuc2V0RXJyb3IoXG4gICAgICAgIGVycm9yXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIElmIGV4aXN0cywgYWRkIHByb3h5IGFnZW50IHRvIHJlcXVlc3Qgb3B0aW9uc1xuICBjb25zdCByZXF1ZXN0T3B0aW9ucyA9IHByb3h5QWdlbnRcbiAgICA/IHtcbiAgICAgICAgYWdlbnQ6IHByb3h5QWdlbnQsXG4gICAgICAgIHRpbWVvdXQ6IGVudnMuU0VSVkVSX1BST1hZX1RJTUVPVVRcbiAgICAgIH1cbiAgICA6IHt9O1xuXG4gIGNvbnN0IGFsbEZldGNoUHJvbWlzZXMgPSBbXG4gICAgLi4uY29yZVNjcmlwdHMubWFwKChzY3JpcHQpID0+XG4gICAgICBmZXRjaEFuZFByb2Nlc3NTY3JpcHQoYCR7c2NyaXB0fWAsIHJlcXVlc3RPcHRpb25zLCBmZXRjaGVkTW9kdWxlcywgdHJ1ZSlcbiAgICApLFxuICAgIC4uLm1vZHVsZVNjcmlwdHMubWFwKChzY3JpcHQpID0+XG4gICAgICBmZXRjaEFuZFByb2Nlc3NTY3JpcHQoYCR7c2NyaXB0fWAsIHJlcXVlc3RPcHRpb25zLCBmZXRjaGVkTW9kdWxlcylcbiAgICApLFxuICAgIC4uLmN1c3RvbVNjcmlwdHMubWFwKChzY3JpcHQpID0+XG4gICAgICBmZXRjaEFuZFByb2Nlc3NTY3JpcHQoYCR7c2NyaXB0fWAsIHJlcXVlc3RPcHRpb25zKVxuICAgIClcbiAgXTtcblxuICBjb25zdCBmZXRjaGVkU2NyaXB0cyA9IGF3YWl0IFByb21pc2UuYWxsKGFsbEZldGNoUHJvbWlzZXMpO1xuICByZXR1cm4gZmV0Y2hlZFNjcmlwdHMuam9pbignO1xcbicpO1xufTtcblxuLyoqXG4gKiBVcGRhdGVzIHRoZSBsb2NhbCBjYWNoZSB3aXRoIEhpZ2hjaGFydHMgc2NyaXB0cyBhbmQgdGhlaXIgdmVyc2lvbnMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBPYmplY3QgY29udGFpbmluZyBhbGwgb3B0aW9ucy5cbiAqIEBwYXJhbSB7c3RyaW5nfSBzb3VyY2VQYXRoIC0gVGhlIHBhdGggdG8gdGhlIHNvdXJjZSBmaWxlIGluIHRoZSBjYWNoZS5cbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxvYmplY3Q+fSBBIFByb21pc2UgcmVzb2x2aW5nIHRvIGFuIG9iamVjdCByZXByZXNlbnRpbmdcbiAqIHRoZSBmZXRjaGVkIG1vZHVsZXMuXG4gKlxuICogQHRocm93cyB7RXhwb3J0RXJyb3J9IFRocm93cyBhbiBFeHBvcnRFcnJvciBpZiB0aGVyZSBpcyBhbiBpc3N1ZSB1cGRhdGluZ1xuICogdGhlIGxvY2FsIEhpZ2hjaGFydHMgY2FjaGUuXG4gKi9cbmV4cG9ydCBjb25zdCB1cGRhdGVDYWNoZSA9IGFzeW5jIChcbiAgaGlnaGNoYXJ0c09wdGlvbnMsXG4gIHByb3h5T3B0aW9ucyxcbiAgc291cmNlUGF0aFxuKSA9PiB7XG4gIGNvbnN0IHZlcnNpb24gPSBoaWdoY2hhcnRzT3B0aW9ucy52ZXJzaW9uO1xuICBjb25zdCBoY1ZlcnNpb24gPSB2ZXJzaW9uID09PSAnbGF0ZXN0JyB8fCAhdmVyc2lvbiA/ICcnIDogYCR7dmVyc2lvbn0vYDtcbiAgY29uc3QgY2RuVVJMID0gaGlnaGNoYXJ0c09wdGlvbnMuY2RuVVJMIHx8IGNhY2hlLmNkblVSTDtcblxuICBsb2coXG4gICAgMyxcbiAgICBgW2NhY2hlXSBVcGRhdGluZyBjYWNoZSB2ZXJzaW9uIHRvIEhpZ2hjaGFydHM6ICR7aGNWZXJzaW9uIHx8ICdsYXRlc3QnfS5gXG4gICk7XG5cbiAgY29uc3QgZmV0Y2hlZE1vZHVsZXMgPSB7fTtcbiAgdHJ5IHtcbiAgICBjYWNoZS5zb3VyY2VzID0gYXdhaXQgZmV0Y2hTY3JpcHRzKFxuICAgICAgW1xuICAgICAgICAuLi5oaWdoY2hhcnRzT3B0aW9ucy5jb3JlU2NyaXB0cy5tYXAoKGMpID0+IGAke2NkblVSTH0ke2hjVmVyc2lvbn0ke2N9YClcbiAgICAgIF0sXG4gICAgICBbXG4gICAgICAgIC4uLmhpZ2hjaGFydHNPcHRpb25zLm1vZHVsZVNjcmlwdHMubWFwKChtKSA9PlxuICAgICAgICAgIG0gPT09ICdtYXAnXG4gICAgICAgICAgICA/IGAke2NkblVSTH1tYXBzLyR7aGNWZXJzaW9ufW1vZHVsZXMvJHttfWBcbiAgICAgICAgICAgIDogYCR7Y2RuVVJMfSR7aGNWZXJzaW9ufW1vZHVsZXMvJHttfWBcbiAgICAgICAgKSxcbiAgICAgICAgLi4uaGlnaGNoYXJ0c09wdGlvbnMuaW5kaWNhdG9yU2NyaXB0cy5tYXAoXG4gICAgICAgICAgKGkpID0+IGAke2NkblVSTH1zdG9jay8ke2hjVmVyc2lvbn1pbmRpY2F0b3JzLyR7aX1gXG4gICAgICAgIClcbiAgICAgIF0sXG4gICAgICBoaWdoY2hhcnRzT3B0aW9ucy5jdXN0b21TY3JpcHRzLFxuICAgICAgcHJveHlPcHRpb25zLFxuICAgICAgZmV0Y2hlZE1vZHVsZXNcbiAgICApO1xuXG4gICAgY2FjaGUuaGNWZXJzaW9uID0gZXh0cmFjdFZlcnNpb24oY2FjaGUpO1xuXG4gICAgLy8gU2F2ZSB0aGUgZmV0Y2hlZCBtb2R1bGVzIGludG8gY2FjaGVzJyBzb3VyY2UgSlNPTlxuICAgIHdyaXRlRmlsZVN5bmMoc291cmNlUGF0aCwgY2FjaGUuc291cmNlcyk7XG4gICAgcmV0dXJuIGZldGNoZWRNb2R1bGVzO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHRocm93IG5ldyBFeHBvcnRFcnJvcihcbiAgICAgICdbY2FjaGVdIFVuYWJsZSB0byB1cGRhdGUgdGhlIGxvY2FsIEhpZ2hjaGFydHMgY2FjaGUuJ1xuICAgICkuc2V0RXJyb3IoZXJyb3IpO1xuICB9XG59O1xuXG4vKipcbiAqIFVwZGF0ZXMgdGhlIEhpZ2hjaGFydHMgdmVyc2lvbiBpbiB0aGUgYXBwbGllZCBjb25maWd1cmF0aW9uIGFuZCBjaGVja3NcbiAqIHRoZSBjYWNoZSBmb3IgdGhlIG5ldyB2ZXJzaW9uLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBuZXdWZXJzaW9uIC0gVGhlIG5ldyBIaWdoY2hhcnRzIHZlcnNpb24gdG8gYmUgYXBwbGllZC5cbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTwob2JqZWN0fGJvb2xlYW4pPn0gQSBQcm9taXNlIHJlc29sdmluZyB0byB0aGUgdXBkYXRlZFxuICogY29uZmlndXJhdGlvbiB3aXRoIHRoZSBuZXcgdmVyc2lvbiwgb3IgZmFsc2UgaWYgbm8gYXBwbGllZCBjb25maWd1cmF0aW9uXG4gKiBleGlzdHMuXG4gKi9cbmV4cG9ydCBjb25zdCB1cGRhdGVWZXJzaW9uID0gYXN5bmMgKG5ld1ZlcnNpb24pID0+IHtcbiAgY29uc3Qgb3B0aW9ucyA9IGdldE9wdGlvbnMoKTtcbiAgaWYgKG9wdGlvbnM/LmhpZ2hjaGFydHMpIHtcbiAgICBvcHRpb25zLmhpZ2hjaGFydHMudmVyc2lvbiA9IG5ld1ZlcnNpb247XG4gIH1cbiAgYXdhaXQgY2hlY2tBbmRVcGRhdGVDYWNoZShvcHRpb25zKTtcbn07XG5cbi8qKlxuICogQ2hlY2tzIHRoZSBjYWNoZSBmb3IgSGlnaGNoYXJ0cyBkZXBlbmRlbmNpZXMsIHVwZGF0ZXMgdGhlIGNhY2hlIGlmIG5lZWRlZCxcbiAqIGFuZCBsb2FkcyB0aGUgc291cmNlcy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIE9iamVjdCBjb250YWluaW5nIGFsbCBvcHRpb25zLlxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBjYWNoZSBpcyBjaGVja2VkXG4gKiBhbmQgdXBkYXRlZC5cbiAqXG4gKiBAdGhyb3dzIHtFeHBvcnRFcnJvcn0gVGhyb3dzIGFuIEV4cG9ydEVycm9yIGlmIHRoZXJlIGlzIGFuIGlzc3VlIHVwZGF0aW5nXG4gKiBvciByZWFkaW5nIHRoZSBjYWNoZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGNoZWNrQW5kVXBkYXRlQ2FjaGUgPSBhc3luYyAob3B0aW9ucykgPT4ge1xuICBjb25zdCB7IGhpZ2hjaGFydHMsIHNlcnZlciB9ID0gb3B0aW9ucztcbiAgY29uc3QgY2FjaGVQYXRoID0gam9pbihfX2Rpcm5hbWUsIGhpZ2hjaGFydHMuY2FjaGVQYXRoKTtcblxuICBsZXQgZmV0Y2hlZE1vZHVsZXM7XG4gIC8vIFByZXBhcmUgcGF0aHMgdG8gbWFuaWZlc3QgYW5kIHNvdXJjZXMgZnJvbSB0aGUgLmNhY2hlIGZvbGRlclxuICBjb25zdCBtYW5pZmVzdFBhdGggPSBqb2luKGNhY2hlUGF0aCwgJ21hbmlmZXN0Lmpzb24nKTtcbiAgY29uc3Qgc291cmNlUGF0aCA9IGpvaW4oY2FjaGVQYXRoLCAnc291cmNlcy5qcycpO1xuXG4gIC8vIENyZWF0ZSB0aGUgY2FjaGUgZGVzdGluYXRpb24gaWYgaXQgZG9lc24ndCBleGlzdCBhbHJlYWR5XG4gICFleGlzdHNTeW5jKGNhY2hlUGF0aCkgJiYgbWtkaXJTeW5jKGNhY2hlUGF0aCk7XG5cbiAgLy8gRmV0Y2ggYWxsIHRoZSBzY3JpcHRzIGVpdGhlciBpZiBtYW5pZmVzdC5qc29uIGRvZXMgbm90IGV4aXN0XG4gIC8vIG9yIGlmIHRoZSBmb3JjZUZldGNoIG9wdGlvbiBpcyBlbmFibGVkXG4gIGlmICghZXhpc3RzU3luYyhtYW5pZmVzdFBhdGgpIHx8IGhpZ2hjaGFydHMuZm9yY2VGZXRjaCkge1xuICAgIGxvZygzLCAnW2NhY2hlXSBGZXRjaGluZyBhbmQgY2FjaGluZyBIaWdoY2hhcnRzIGRlcGVuZGVuY2llcy4nKTtcbiAgICBmZXRjaGVkTW9kdWxlcyA9IGF3YWl0IHVwZGF0ZUNhY2hlKGhpZ2hjaGFydHMsIHNlcnZlci5wcm94eSwgc291cmNlUGF0aCk7XG4gIH0gZWxzZSB7XG4gICAgbGV0IHJlcXVlc3RVcGRhdGUgPSBmYWxzZTtcblxuICAgIC8vIFJlYWQgdGhlIG1hbmlmZXN0IEpTT05cbiAgICBjb25zdCBtYW5pZmVzdCA9IEpTT04ucGFyc2UocmVhZEZpbGVTeW5jKG1hbmlmZXN0UGF0aCkpO1xuXG4gICAgLy8gQ2hlY2sgaWYgdGhlIG1vZHVsZXMgaXMgYW4gYXJyYXksIGlmIHNvLCB3ZSByZXdyaXRlIGl0IHRvIGEgbWFwIHRvIG1ha2VcbiAgICAvLyBpdCBlYXNpZXIgdG8gcmVzb2x2ZSBtb2R1bGVzLlxuICAgIGlmIChtYW5pZmVzdC5tb2R1bGVzICYmIEFycmF5LmlzQXJyYXkobWFuaWZlc3QubW9kdWxlcykpIHtcbiAgICAgIGNvbnN0IG1vZHVsZU1hcCA9IHt9O1xuICAgICAgbWFuaWZlc3QubW9kdWxlcy5mb3JFYWNoKChtKSA9PiAobW9kdWxlTWFwW21dID0gMSkpO1xuICAgICAgbWFuaWZlc3QubW9kdWxlcyA9IG1vZHVsZU1hcDtcbiAgICB9XG5cbiAgICBjb25zdCB7IGNvcmVTY3JpcHRzLCBtb2R1bGVTY3JpcHRzLCBpbmRpY2F0b3JTY3JpcHRzIH0gPSBoaWdoY2hhcnRzO1xuICAgIGNvbnN0IG51bWJlck9mTW9kdWxlcyA9XG4gICAgICBjb3JlU2NyaXB0cy5sZW5ndGggKyBtb2R1bGVTY3JpcHRzLmxlbmd0aCArIGluZGljYXRvclNjcmlwdHMubGVuZ3RoO1xuXG4gICAgLy8gQ29tcGFyZSB0aGUgbG9hZGVkIGhpZ2hjaGFydHMgY29uZmlnIHdpdGggdGhlIGNvbnRlbnRzIGluIGNhY2hlLlxuICAgIC8vIElmIHRoZXJlIGFyZSBjaGFuZ2VzLCBmZXRjaCByZXF1ZXN0ZWQgbW9kdWxlcyBhbmQgcHJvZHVjdHMsXG4gICAgLy8gYW5kIGJha2UgdGhlbSBpbnRvIGEgZ2lhbnQgYmxvYi4gU2F2ZSB0aGUgYmxvYi5cbiAgICBpZiAobWFuaWZlc3QudmVyc2lvbiAhPT0gaGlnaGNoYXJ0cy52ZXJzaW9uKSB7XG4gICAgICBsb2coXG4gICAgICAgIDIsXG4gICAgICAgICdbY2FjaGVdIEEgSGlnaGNoYXJ0cyB2ZXJzaW9uIG1pc21hdGNoIGluIHRoZSBjYWNoZSwgbmVlZCB0byByZS1mZXRjaC4nXG4gICAgICApO1xuICAgICAgcmVxdWVzdFVwZGF0ZSA9IHRydWU7XG4gICAgfSBlbHNlIGlmIChPYmplY3Qua2V5cyhtYW5pZmVzdC5tb2R1bGVzIHx8IHt9KS5sZW5ndGggIT09IG51bWJlck9mTW9kdWxlcykge1xuICAgICAgbG9nKFxuICAgICAgICAyLFxuICAgICAgICAnW2NhY2hlXSBUaGUgY2FjaGUgYW5kIHRoZSByZXF1ZXN0ZWQgbW9kdWxlcyBkbyBub3QgbWF0Y2gsIG5lZWQgdG8gcmUtZmV0Y2guJ1xuICAgICAgKTtcbiAgICAgIHJlcXVlc3RVcGRhdGUgPSB0cnVlO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBDaGVjayBlYWNoIG1vZHVsZSwgaWYgYW55dGhpbmcgaXMgbWlzc2luZyByZWZldGNoIGV2ZXJ5dGhpbmdcbiAgICAgIHJlcXVlc3RVcGRhdGUgPSAobW9kdWxlU2NyaXB0cyB8fCBbXSkuc29tZSgobW9kdWxlTmFtZSkgPT4ge1xuICAgICAgICBpZiAoIW1hbmlmZXN0Lm1vZHVsZXNbbW9kdWxlTmFtZV0pIHtcbiAgICAgICAgICBsb2coXG4gICAgICAgICAgICAyLFxuICAgICAgICAgICAgYFtjYWNoZV0gVGhlICR7bW9kdWxlTmFtZX0gaXMgbWlzc2luZyBpbiB0aGUgY2FjaGUsIG5lZWQgdG8gcmUtZmV0Y2guYFxuICAgICAgICAgICk7XG4gICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cblxuICAgIGlmIChyZXF1ZXN0VXBkYXRlKSB7XG4gICAgICBmZXRjaGVkTW9kdWxlcyA9IGF3YWl0IHVwZGF0ZUNhY2hlKGhpZ2hjaGFydHMsIHNlcnZlci5wcm94eSwgc291cmNlUGF0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGxvZygzLCAnW2NhY2hlXSBEZXBlbmRlbmN5IGNhY2hlIGlzIHVwIHRvIGRhdGUsIHByb2NlZWRpbmcuJyk7XG5cbiAgICAgIC8vIExvYWQgdGhlIHNvdXJjZXNcbiAgICAgIGNhY2hlLnNvdXJjZXMgPSByZWFkRmlsZVN5bmMoc291cmNlUGF0aCwgJ3V0ZjgnKTtcblxuICAgICAgLy8gR2V0IGN1cnJlbnQgbW9kdWxlcyBtYXBcbiAgICAgIGZldGNoZWRNb2R1bGVzID0gbWFuaWZlc3QubW9kdWxlcztcblxuICAgICAgY2FjaGUuaGNWZXJzaW9uID0gZXh0cmFjdFZlcnNpb24oY2FjaGUpO1xuICAgIH1cbiAgfVxuXG4gIC8vIEZpbmFsbHksIHNhdmUgdGhlIG5ldyBtYW5pZmVzdCwgd2hpY2ggaXMgYmFzaWNhbGx5IG91ciBjdXJyZW50IGNvbmZpZ1xuICAvLyBpbiBhIHNsaWdodGx5IGRpZmZlcmVudCBmb3JtYXRcbiAgYXdhaXQgc2F2ZUNvbmZpZ1RvTWFuaWZlc3QoaGlnaGNoYXJ0cywgZmV0Y2hlZE1vZHVsZXMpO1xufTtcblxuZXhwb3J0IGNvbnN0IGdldENhY2hlUGF0aCA9ICgpID0+XG4gIGpvaW4oX19kaXJuYW1lLCBnZXRPcHRpb25zKCkuaGlnaGNoYXJ0cy5jYWNoZVBhdGgpO1xuXG5leHBvcnQgY29uc3QgZ2V0Q2FjaGUgPSAoKSA9PiBjYWNoZTtcblxuZXhwb3J0IGNvbnN0IGhpZ2hjaGFydHMgPSAoKSA9PiBjYWNoZS5zb3VyY2VzO1xuXG5leHBvcnQgY29uc3QgdmVyc2lvbiA9ICgpID0+IGNhY2hlLmhjVmVyc2lvbjtcblxuZXhwb3J0IGRlZmF1bHQge1xuICBjaGVja0FuZFVwZGF0ZUNhY2hlLFxuICBnZXRDYWNoZVBhdGgsXG4gIHVwZGF0ZVZlcnNpb24sXG4gIGdldENhY2hlLFxuICBoaWdoY2hhcnRzLFxuICB2ZXJzaW9uXG59O1xuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuSGlnaGNoYXJ0cyBFeHBvcnQgU2VydmVyXG5cbkNvcHlyaWdodCAoYykgMjAxNi0yMDI0LCBIaWdoc29mdFxuXG5MaWNlbmNlZCB1bmRlciB0aGUgTUlUIGxpY2VuY2UuXG5cbkFkZGl0aW9uYWxseSBhIHZhbGlkIEhpZ2hjaGFydHMgbGljZW5zZSBpcyByZXF1aXJlZCBmb3IgdXNlLlxuXG5TZWUgTElDRU5TRSBmaWxlIGluIHJvb3QgZm9yIGRldGFpbHMuXG5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbi8qIGVzbGludC1kaXNhYmxlIG5vLXVuZGVmICovXG5cbi8qKlxuICogU2V0dGluZyB0aGUgYW5pbU9iamVjdC4gQ2FsbGVkIHdoZW4gaW5pdGluZyB0aGUgcGFnZS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIHNldHVwSGlnaGNoYXJ0cygpIHtcbiAgSGlnaGNoYXJ0cy5hbmltT2JqZWN0ID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiB7IGR1cmF0aW9uOiAwIH07XG4gIH07XG59XG5cbi8qKlxuICogQ3JlYXRlcyB0aGUgYWN0dWFsIGNoYXJ0LlxuICpcbiAqIEBwYXJhbSB7b2JqZWN0fSBjaGFydE9wdGlvbnMgLSBUaGUgb3B0aW9ucyBmb3IgdGhlIEhpZ2hjaGFydHMgY2hhcnQuXG4gKiBAcGFyYW0ge29iamVjdH0gb3B0aW9ucyAtIFRoZSBleHBvcnQgb3B0aW9ucy5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gZGlzcGxheUVycm9ycyAtIEEgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdG8gZGlzcGxheSBlcnJvcnMuXG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiB0cmlnZ2VyRXhwb3J0KGNoYXJ0T3B0aW9ucywgb3B0aW9ucywgZGlzcGxheUVycm9ycykge1xuICAvLyBEaXNwbGF5IGVycm9ycyBmbGFnIHRha2VuIGZyb20gY2hhcnQgb3B0aW9ucyBuYWQgZGVidWdnZXIgbW9kdWxlXG4gIHdpbmRvdy5fZGlzcGxheUVycm9ycyA9IGRpc3BsYXlFcnJvcnM7XG5cbiAgLy8gR2V0IHJlcXVpcmVkIGZ1bmN0aW9uc1xuICBjb25zdCB7IGdldE9wdGlvbnMsIG1lcmdlLCBzZXRPcHRpb25zLCB3cmFwIH0gPSBIaWdoY2hhcnRzO1xuXG4gIC8vIENyZWF0ZSBhIHNlcGFyYXRlIG9iamVjdCBmb3IgYSBwb3RlbnRpYWwgc2V0T3B0aW9ucyB1c2FnZXMgaW4gb3JkZXIgdG9cbiAgLy8gcHJldmVudCBmcm9tIHBvbGx1dGluZyBvdGhlciBleHBvcnRzIHRoYXQgY2FuIGhhcHBlbiBvbiB0aGUgc2FtZSBwYWdlXG4gIEhpZ2hjaGFydHMuc2V0T3B0aW9uc09iaiA9IG1lcmdlKGZhbHNlLCB7fSwgZ2V0T3B0aW9ucygpKTtcblxuICAvLyBCeSBkZWZhdWx0IGFuaW1hdGlvbiBpcyBkaXNhYmxlZFxuICBjb25zdCBjaGFydCA9IHtcbiAgICBhbmltYXRpb246IGZhbHNlXG4gIH07XG5cbiAgLy8gV2hlbiBzdHJhaWdodCBpbmplY3QsIHRoZSBzaXplIGlzIHNldCB0aHJvdWdoIENTUyBvbmx5XG4gIGlmIChvcHRpb25zLmV4cG9ydC5zdHJJbmopIHtcbiAgICBjaGFydC5oZWlnaHQgPSBjaGFydE9wdGlvbnMuY2hhcnQuaGVpZ2h0O1xuICAgIGNoYXJ0LndpZHRoID0gY2hhcnRPcHRpb25zLmNoYXJ0LndpZHRoO1xuICB9XG5cbiAgLy8gTk9URTogSXMgdGhpcyB1c2VkIGZvciBhbnl0aGluZyB1c2VmdWw/XG4gIHdpbmRvdy5pc1JlbmRlckNvbXBsZXRlID0gZmFsc2U7XG4gIHdyYXAoSGlnaGNoYXJ0cy5DaGFydC5wcm90b3R5cGUsICdpbml0JywgZnVuY3Rpb24gKHByb2NlZWQsIHVzZXJPcHRpb25zLCBjYikge1xuICAgIC8vIE92ZXJyaWRlIHVzZXJPcHRpb25zIHdpdGggaW1hZ2UgZnJpZW5kbHkgb3B0aW9uc1xuICAgIHVzZXJPcHRpb25zID0gbWVyZ2UodXNlck9wdGlvbnMsIHtcbiAgICAgIGV4cG9ydGluZzoge1xuICAgICAgICBlbmFibGVkOiBmYWxzZVxuICAgICAgfSxcbiAgICAgIHBsb3RPcHRpb25zOiB7XG4gICAgICAgIHNlcmllczoge1xuICAgICAgICAgIGxhYmVsOiB7XG4gICAgICAgICAgICBlbmFibGVkOiBmYWxzZVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIC8qIEV4cGVjdHMgdG9vbHRpcCBpbiB1c2VyT3B0aW9ucyB3aGVuIGZvckV4cG9ydCBpcyB0cnVlLlxuICAgICAgICBodHRwczovL2dpdGh1Yi5jb20vaGlnaGNoYXJ0cy9oaWdoY2hhcnRzL2Jsb2IvM2FkNDMwYTM1M2I4MDU2YjllNzY0YWE0ZTVjZDY4MjhhYTQ3OWRiMi9qcy9wYXJ0cy9DaGFydC5qcyNMMjQxXG4gICAgICAgICovXG4gICAgICB0b29sdGlwOiB7fVxuICAgIH0pO1xuXG4gICAgKHVzZXJPcHRpb25zLnNlcmllcyB8fCBbXSkuZm9yRWFjaChmdW5jdGlvbiAoc2VyaWVzKSB7XG4gICAgICBzZXJpZXMuYW5pbWF0aW9uID0gZmFsc2U7XG4gICAgfSk7XG5cbiAgICAvLyBBZGQgZmxhZyB0byBrbm93IGlmIGNoYXJ0IHJlbmRlciBoYXMgYmVlbiBjYWxsZWQuXG4gICAgaWYgKCF3aW5kb3cub25IaWdoY2hhcnRzUmVuZGVyKSB7XG4gICAgICB3aW5kb3cub25IaWdoY2hhcnRzUmVuZGVyID0gSGlnaGNoYXJ0cy5hZGRFdmVudCh0aGlzLCAncmVuZGVyJywgKCkgPT4ge1xuICAgICAgICB3aW5kb3cuaXNSZW5kZXJDb21wbGV0ZSA9IHRydWU7XG4gICAgICB9KTtcbiAgICB9XG5cbiAgICBwcm9jZWVkLmFwcGx5KHRoaXMsIFt1c2VyT3B0aW9ucywgY2JdKTtcbiAgfSk7XG5cbiAgd3JhcChIaWdoY2hhcnRzLlNlcmllcy5wcm90b3R5cGUsICdpbml0JywgZnVuY3Rpb24gKHByb2NlZWQsIGNoYXJ0LCBvcHRpb25zKSB7XG4gICAgcHJvY2VlZC5hcHBseSh0aGlzLCBbY2hhcnQsIG9wdGlvbnNdKTtcbiAgfSk7XG5cbiAgLy8gR2V0IHRoZSB1c2VyIG9wdGlvbnNcbiAgY29uc3QgdXNlck9wdGlvbnMgPSBvcHRpb25zLmV4cG9ydC5zdHJJbmpcbiAgICA/IG5ldyBGdW5jdGlvbihgcmV0dXJuICR7b3B0aW9ucy5leHBvcnQuc3RySW5qfWApKClcbiAgICA6IGNoYXJ0T3B0aW9ucztcblxuICAvLyBUcmlnZ2VyIGN1c3RvbSBjb2RlXG4gIGlmIChvcHRpb25zLmN1c3RvbUxvZ2ljLmN1c3RvbUNvZGUpIHtcbiAgICBuZXcgRnVuY3Rpb24oJ29wdGlvbnMnLCBvcHRpb25zLmN1c3RvbUxvZ2ljLmN1c3RvbUNvZGUpKHVzZXJPcHRpb25zKTtcbiAgfVxuXG4gIC8vIE1lcmdlIHRoZSBnbG9iYWxPcHRpb25zLCB0aGVtZU9wdGlvbnMsIG9wdGlvbnMgZnJvbSB0aGUgd3JhcHBlZFxuICAvLyBzZXRPcHRpb25zIGZ1bmN0aW9uIGFuZCB1c2VyIG9wdGlvbnMgdG8gY3JlYXRlIHRoZSBmaW5hbCBvcHRpb25zIG9iamVjdFxuICBjb25zdCBmaW5hbE9wdGlvbnMgPSBtZXJnZShcbiAgICBmYWxzZSxcbiAgICBKU09OLnBhcnNlKG9wdGlvbnMuZXhwb3J0LnRoZW1lT3B0aW9ucyksXG4gICAgdXNlck9wdGlvbnMsXG4gICAgLy8gUGxhY2VkIGl0IGhlcmUgaW5zdGVhZCBpbiB0aGUgaW5pdCBiZWNhdXNlIG9mIHRoZSBzaXplIGlzc3Vlc1xuICAgIHsgY2hhcnQgfVxuICApO1xuXG4gIGNvbnN0IGZpbmFsQ2FsbGJhY2sgPSBvcHRpb25zLmN1c3RvbUxvZ2ljLmNhbGxiYWNrXG4gICAgPyBuZXcgRnVuY3Rpb24oYHJldHVybiAke29wdGlvbnMuY3VzdG9tTG9naWMuY2FsbGJhY2t9YCkoKVxuICAgIDogdW5kZWZpbmVkO1xuXG4gIC8vIFNldCB0aGUgZ2xvYmFsIG9wdGlvbnMgaWYgZXhpc3RcbiAgY29uc3QgZ2xvYmFsT3B0aW9ucyA9IEpTT04ucGFyc2Uob3B0aW9ucy5leHBvcnQuZ2xvYmFsT3B0aW9ucyk7XG4gIGlmIChnbG9iYWxPcHRpb25zKSB7XG4gICAgc2V0T3B0aW9ucyhnbG9iYWxPcHRpb25zKTtcbiAgfVxuXG4gIGxldCBjb25zdHIgPSBvcHRpb25zLmV4cG9ydC5jb25zdHIgfHwgJ2NoYXJ0JztcbiAgY29uc3RyID0gdHlwZW9mIEhpZ2hjaGFydHNbY29uc3RyXSAhPT0gJ3VuZGVmaW5lZCcgPyBjb25zdHIgOiAnY2hhcnQnO1xuXG4gIEhpZ2hjaGFydHNbY29uc3RyXSgnY29udGFpbmVyJywgZmluYWxPcHRpb25zLCBmaW5hbENhbGxiYWNrKTtcblxuICAvLyBHZXQgdGhlIGN1cnJlbnQgZ2xvYmFsIG9wdGlvbnNcbiAgY29uc3QgZGVmYXVsdE9wdGlvbnMgPSBnZXRPcHRpb25zKCk7XG5cbiAgLy8gQ2xlYXIgaXQganVzdCBpbiBjYXNlIChlLmcuIHRoZSBzZXRPcHRpb25zIHdhcyB1c2VkIGluIHRoZSBjdXN0b21Db2RlKVxuICBmb3IgKGNvbnN0IHByb3AgaW4gZGVmYXVsdE9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIGRlZmF1bHRPcHRpb25zW3Byb3BdICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBkZWxldGUgZGVmYXVsdE9wdGlvbnNbcHJvcF07XG4gICAgfVxuICB9XG5cbiAgLy8gU2V0IHRoZSBkZWZhdWx0IG9wdGlvbnMgYmFja1xuICBzZXRPcHRpb25zKEhpZ2hjaGFydHMuc2V0T3B0aW9uc09iaik7XG5cbiAgLy8gRW1wdHkgdGhlIGN1c3RvbSBnbG9iYWwgb3B0aW9ucyBvYmplY3RcbiAgSGlnaGNoYXJ0cy5zZXRPcHRpb25zT2JqID0ge307XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5IaWdoY2hhcnRzIEV4cG9ydCBTZXJ2ZXJcblxuQ29weXJpZ2h0IChjKSAyMDE2LTIwMjQsIEhpZ2hzb2Z0XG5cbkxpY2VuY2VkIHVuZGVyIHRoZSBNSVQgbGljZW5jZS5cblxuQWRkaXRpb25hbGx5IGEgdmFsaWQgSGlnaGNoYXJ0cyBsaWNlbnNlIGlzIHJlcXVpcmVkIGZvciB1c2UuXG5cblNlZSBMSUNFTlNFIGZpbGUgaW4gcm9vdCBmb3IgZGV0YWlscy5cblxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgcmVhZEZpbGVTeW5jIH0gZnJvbSAnZnMnO1xuaW1wb3J0IHBhdGggZnJvbSAncGF0aCc7XG5cbmltcG9ydCBwdXBwZXRlZXIgZnJvbSAncHVwcGV0ZWVyJztcblxuaW1wb3J0IHsgZ2V0Q2FjaGVQYXRoIH0gZnJvbSAnLi9jYWNoZS5qcyc7XG5pbXBvcnQgeyBnZXRPcHRpb25zIH0gZnJvbSAnLi9jb25maWcuanMnO1xuaW1wb3J0IHsgc2V0dXBIaWdoY2hhcnRzIH0gZnJvbSAnLi9oaWdoY2hhcnRzLmpzJztcbmltcG9ydCB7IGxvZywgbG9nV2l0aFN0YWNrIH0gZnJvbSAnLi9sb2dnZXIuanMnO1xuaW1wb3J0IHsgX19kaXJuYW1lIH0gZnJvbSAnLi91dGlscy5qcyc7XG5cbmltcG9ydCBFeHBvcnRFcnJvciBmcm9tICcuL2Vycm9ycy9FeHBvcnRFcnJvci5qcyc7XG5cbi8vIEdldCB0aGUgdGVtcGxhdGUgZm9yIHRoZSBwYWdlXG5jb25zdCB0ZW1wbGF0ZSA9IHJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnL3RlbXBsYXRlcy90ZW1wbGF0ZS5odG1sJywgJ3V0ZjgnKTtcblxubGV0IGJyb3dzZXI7XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBleGlzdGluZyBQdXBwZXRlZXIgYnJvd3NlciBpbnN0YW5jZS5cbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTxvYmplY3Q+fSBBIFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBQdXBwZXRlZXIgYnJvd3NlclxuICogaW5zdGFuY2UuXG4gKlxuICogQHRocm93cyB7RXhwb3J0RXJyb3J9IFRocm93cyBhbiBFeHBvcnRFcnJvciBpZiBubyB2YWxpZCBicm93c2VyIGhhcyBiZWVuXG4gKiBjcmVhdGVkLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0KCkge1xuICBpZiAoIWJyb3dzZXIpIHtcbiAgICB0aHJvdyBuZXcgRXhwb3J0RXJyb3IoJ1ticm93c2VyXSBObyB2YWxpZCBicm93c2VyIGhhcyBiZWVuIGNyZWF0ZWQuJyk7XG4gIH1cbiAgcmV0dXJuIGJyb3dzZXI7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIFB1cHBldGVlciBicm93c2VyIGluc3RhbmNlIHdpdGggdGhlIHNwZWNpZmllZCBhcmd1bWVudHMuXG4gKlxuICogQHBhcmFtIHtBcnJheX0gcHVwcGV0ZWVyQXJncyAtIEFkZGl0aW9uYWwgYXJndW1lbnRzIGZvciBQdXBwZXRlZXIgbGF1bmNoLlxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPG9iamVjdD59IEEgUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIFB1cHBldGVlciBicm93c2VyXG4gKiBpbnN0YW5jZS5cbiAqXG4gKiBAdGhyb3dzIHtFeHBvcnRFcnJvcn0gVGhyb3dzIGFuIEV4cG9ydEVycm9yIGlmIG1heCByZXRyaWVzIHRvIG9wZW4gYSBicm93c2VyXG4gKiBpbnN0YW5jZSBhcmUgcmVhY2hlZCwgb3IgaWYgbm8gYnJvd3NlciBpbnN0YW5jZSBpcyBmb3VuZCBhZnRlciByZXRyaWVzLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY3JlYXRlKHB1cHBldGVlckFyZ3MpIHtcbiAgLy8gR2V0IGRlYnVnIGFuZCBvdGhlciBvcHRpb25zXG4gIGNvbnN0IHsgZGVidWcsIG90aGVyIH0gPSBnZXRPcHRpb25zKCk7XG5cbiAgLy8gR2V0IHRoZSBkZWJ1ZyBvcHRpb25zXG4gIGNvbnN0IHsgZW5hYmxlOiBlbmFibGVkRGVidWcsIC4uLmRlYnVnT3B0aW9ucyB9ID0gZGVidWc7XG5cbiAgY29uc3QgbGF1bmNoT3B0aW9ucyA9IHtcbiAgICBoZWFkbGVzczogb3RoZXIuYnJvd3NlclNoZWxsTW9kZSA/ICdzaGVsbCcgOiB0cnVlLFxuICAgIHVzZXJEYXRhRGlyOiAnLi90bXAvJyxcbiAgICBhcmdzOiBwdXBwZXRlZXJBcmdzLFxuICAgIGhhbmRsZVNJR0lOVDogZmFsc2UsXG4gICAgaGFuZGxlU0lHVEVSTTogZmFsc2UsXG4gICAgaGFuZGxlU0lHSFVQOiBmYWxzZSxcbiAgICB3YWl0Rm9ySW5pdGlhbFBhZ2U6IGZhbHNlLFxuICAgIGRlZmF1bHRWaWV3cG9ydDogbnVsbCxcbiAgICAuLi4oZW5hYmxlZERlYnVnICYmIGRlYnVnT3B0aW9ucylcbiAgfTtcblxuICAvLyBDcmVhdGUgYSBicm93c2VyXG4gIGlmICghYnJvd3Nlcikge1xuICAgIGxldCB0cnlDb3VudCA9IDA7XG5cbiAgICBjb25zdCBvcGVuID0gYXN5bmMgKCkgPT4ge1xuICAgICAgdHJ5IHtcbiAgICAgICAgbG9nKFxuICAgICAgICAgIDMsXG4gICAgICAgICAgYFticm93c2VyXSBBdHRlbXB0aW5nIHRvIGdldCBhIGJyb3dzZXIgaW5zdGFuY2UgKHRyeSAkeysrdHJ5Q291bnR9KS5gXG4gICAgICAgICk7XG4gICAgICAgIGJyb3dzZXIgPSBhd2FpdCBwdXBwZXRlZXIubGF1bmNoKGxhdW5jaE9wdGlvbnMpO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgbG9nV2l0aFN0YWNrKFxuICAgICAgICAgIDEsXG4gICAgICAgICAgZXJyb3IsXG4gICAgICAgICAgJ1ticm93c2VyXSBGYWlsZWQgdG8gbGF1bmNoIGEgYnJvd3NlciBpbnN0YW5jZS4nXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gUmV0cnkgdG8gbGF1bmNoIGJyb3dzZXIgdW50aWwgcmVhY2hpbmcgbWF4IGF0dGVtcHRzXG4gICAgICAgIGlmICh0cnlDb3VudCA8IDI1KSB7XG4gICAgICAgICAgbG9nKDMsIGBbYnJvd3Nlcl0gUmV0cnkgdG8gb3BlbiBhIGJyb3dzZXIgKCR7dHJ5Q291bnR9IG91dCBvZiAyNSkuYCk7XG4gICAgICAgICAgYXdhaXQgbmV3IFByb21pc2UoKHJlc3BvbnNlKSA9PiBzZXRUaW1lb3V0KHJlc3BvbnNlLCA0MDAwKSk7XG4gICAgICAgICAgYXdhaXQgb3BlbigpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfTtcblxuICAgIHRyeSB7XG4gICAgICBhd2FpdCBvcGVuKCk7XG5cbiAgICAgIC8vIFNoZWxsIG1vZGUgaW5mb3JtXG4gICAgICBpZiAobGF1bmNoT3B0aW9ucy5oZWFkbGVzcyA9PT0gJ3NoZWxsJykge1xuICAgICAgICBsb2coMywgYFticm93c2VyXSBMYXVuY2hlZCBicm93c2VyIGluIHNoZWxsIG1vZGUuYCk7XG4gICAgICB9XG5cbiAgICAgIC8vIERlYnVnIG1vZGUgaW5mb3JtXG4gICAgICBpZiAoZW5hYmxlZERlYnVnKSB7XG4gICAgICAgIGxvZygzLCBgW2Jyb3dzZXJdIExhdW5jaGVkIGJyb3dzZXIgaW4gZGVidWcgbW9kZS5gKTtcbiAgICAgIH1cbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEV4cG9ydEVycm9yKFxuICAgICAgICAnW2Jyb3dzZXJdIE1heGltdW0gcmV0cmllcyB0byBvcGVuIGEgYnJvd3NlciBpbnN0YW5jZSByZWFjaGVkLidcbiAgICAgICkuc2V0RXJyb3IoZXJyb3IpO1xuICAgIH1cblxuICAgIGlmICghYnJvd3Nlcikge1xuICAgICAgdGhyb3cgbmV3IEV4cG9ydEVycm9yKCdbYnJvd3Nlcl0gQ2Fubm90IGZpbmQgYSBicm93c2VyIHRvIG9wZW4uJyk7XG4gICAgfVxuICB9XG5cbiAgLy8gUmV0dXJuIGEgYnJvd3NlciBwcm9taXNlXG4gIHJldHVybiBicm93c2VyO1xufVxuXG4vKipcbiAqIENsb3NlcyB0aGUgUHVwcGV0ZWVyIGJyb3dzZXIgaW5zdGFuY2UgaWYgaXQgaXMgY29ubmVjdGVkLlxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPGJvb2xlYW4+fSBBIFByb21pc2UgcmVzb2x2aW5nIHRvIHRydWUgYWZ0ZXIgdGhlIGJyb3dzZXJcbiAqIGlzIGNsb3NlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNsb3NlKCkge1xuICAvLyBDbG9zZSB0aGUgYnJvd3NlciB3aGVuIGNvbm5uZWN0ZWRcbiAgaWYgKGJyb3dzZXI/LmNvbm5lY3RlZCkge1xuICAgIGF3YWl0IGJyb3dzZXIuY2xvc2UoKTtcbiAgfVxuICBsb2coNCwgJ1ticm93c2VyXSBDbG9zZWQgdGhlIGJyb3dzZXIuJyk7XG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBQdXBwZXRlZXIgUGFnZSB3aXRoaW4gYW4gZXhpc3RpbmcgYnJvd3NlciBpbnN0YW5jZS5cbiAqXG4gKiBJZiB0aGUgYnJvd3NlciBpbnN0YW5jZSBpcyBub3QgYXZhaWxhYmxlLCByZXR1cm5zIGZhbHNlLlxuICpcbiAqIFRoZSBmdW5jdGlvbiBjcmVhdGVzIGEgbmV3IHBhZ2UsIGRpc2FibGVzIGNhY2hpbmcsIHNldHMgY29udGVudCB1c2luZ1xuICogc2V0UGFnZUNvbnRlbnQoKSwgYW5kIHJldHVybnMgdGhlIGNyZWF0ZWQgUHVwcGV0ZWVyIFBhZ2UuXG4gKlxuICogQHJldHVybnMgeyhib29sZWFufG9iamVjdCl9IFJldHVybnMgZmFsc2UgaWYgdGhlIGJyb3dzZXIgaW5zdGFuY2UgaXMgbm90XG4gKiBhdmFpbGFibGUsIG9yIGEgUHVwcGV0ZWVyIFBhZ2Ugb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgbmV3bHkgY3JlYXRlZCBwYWdlLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gbmV3UGFnZSgpIHtcbiAgaWYgKCFicm93c2VyKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgLy8gQ3JlYXRlIGEgcGFnZVxuICBjb25zdCBwYWdlID0gYXdhaXQgYnJvd3Nlci5uZXdQYWdlKCk7XG5cbiAgLy8gRGlzYWJsZSBjYWNoZVxuICBhd2FpdCBwYWdlLnNldENhY2hlRW5hYmxlZChmYWxzZSk7XG5cbiAgLy8gU2V0IHRoZSBjb250ZW50XG4gIGF3YWl0IHNldFBhZ2VDb250ZW50KHBhZ2UpO1xuXG4gIC8vIFNldCBwYWdlIGV2ZW50c1xuICBzZXRQYWdlRXZlbnRzKHBhZ2UpO1xuXG4gIHJldHVybiBwYWdlO1xufVxuXG4vKipcbiAqIENsZWFycyB0aGUgY29udGVudCBvZiBhIFB1cHBldGVlciBQYWdlIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWQgbW9kZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcGFnZSAtIFRoZSBQdXBwZXRlZXIgUGFnZSBvYmplY3QgdG8gYmUgY2xlYXJlZC5cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gaGFyZFJlc2V0IC0gQSBmbGFnIGluZGljYXRpbmcgdGhlIHR5cGUgb2YgY2xlYXJpbmdcbiAqIHRvIGJlIHBlcmZvcm1lZC4gSWYgdHJ1ZSwgbmF2aWdhdGVzIHRvICdhYm91dDpibGFuaycgYW5kIHJlc2V0cyBjb250ZW50XG4gKiBhbmQgc2NyaXB0cy4gSWYgZmFsc2UsIGNsZWFycyB0aGUgYm9keSBjb250ZW50IGJ5IHNldHRpbmcgYSBwcmVkZWZpbmVkIEhUTUxcbiAqIHN0cnVjdHVyZS5cbiAqXG4gKiBAdGhyb3dzIHtFcnJvcn0gTG9ncyB0aHJvd24gZXJyb3IgaWYgY2xlYXJpbmcgdGhlIHBhZ2UgY29udGVudCBmYWlscy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGNsZWFyUGFnZShwYWdlLCBoYXJkUmVzZXQgPSBmYWxzZSkge1xuICB0cnkge1xuICAgIGlmIChwYWdlICYmICFwYWdlLmlzQ2xvc2VkKCkpIHtcbiAgICAgIGlmIChoYXJkUmVzZXQpIHtcbiAgICAgICAgLy8gTmF2aWdhdGUgdG8gYWJvdXQ6YmxhbmtcbiAgICAgICAgYXdhaXQgcGFnZS5nb3RvKCdhYm91dDpibGFuaycsIHsgd2FpdFVudGlsOiAnZG9tY29udGVudGxvYWRlZCcgfSk7XG5cbiAgICAgICAgLy8gU2V0IHRoZSBjb250ZW50IGFuZCBhbmQgc2NyaXB0cyBhZ2FpblxuICAgICAgICBhd2FpdCBzZXRQYWdlQ29udGVudChwYWdlKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIENsZWFyIGJvZHkgY29udGVudFxuICAgICAgICBhd2FpdCBwYWdlLmV2YWx1YXRlKCgpID0+IHtcbiAgICAgICAgICBkb2N1bWVudC5ib2R5LmlubmVySFRNTCA9XG4gICAgICAgICAgICAnPGRpdiBpZD1cImNoYXJ0LWNvbnRhaW5lclwiPjxkaXYgaWQ9XCJjb250YWluZXJcIj48L2Rpdj48L2Rpdj4nO1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICBsb2dXaXRoU3RhY2soXG4gICAgICAyLFxuICAgICAgZXJyb3IsXG4gICAgICAnW2Jyb3dzZXJdIENvdWxkIG5vdCBjbGVhciB0aGUgY29udGVudCBvZiB0aGUgcGFnZS4nXG4gICAgKTtcbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuLyoqXG4gKiBBZGRzIGN1c3RvbSBKUyBhbmQgQ1NTIHJlc291cmNlcyB0byBhIFB1cHBldGVlciBQYWdlIGJhc2VkIG9uIHRoZSBzcGVjaWZpZWRcbiAqIG9wdGlvbnMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHBhZ2UgLSBUaGUgUHVwcGV0ZWVyIFBhZ2Ugb2JqZWN0IHRvIHdoaWNoIHJlc291cmNlcyB3aWxsIGJlXG4gKiBhZGRlZC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gQWxsIG9wdGlvbnMgYW5kIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8QXJyYXk8T2JqZWN0Pj59IC0gUHJvbWlzZSByZXNvbHZpbmcgdG8gYW4gYXJyYXkgb2YgaW5qZWN0ZWRcbiAqIHJlc291cmNlcy5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFkZFBhZ2VSZXNvdXJjZXMocGFnZSwgb3B0aW9ucykge1xuICAvLyBJbmplY3RlZCByZXNvdXJjZXMgYXJyYXlcbiAgY29uc3QgaW5qZWN0ZWRSZXNvdXJjZXMgPSBbXTtcblxuICAvLyBVc2UgcmVzb3VyY2VzXG4gIGNvbnN0IHJlc291cmNlcyA9IG9wdGlvbnMuY3VzdG9tTG9naWMucmVzb3VyY2VzO1xuICBpZiAocmVzb3VyY2VzKSB7XG4gICAgY29uc3QgaW5qZWN0ZWRKcyA9IFtdO1xuXG4gICAgLy8gTG9hZCBjdXN0b20gSlMgY29kZVxuICAgIGlmIChyZXNvdXJjZXMuanMpIHtcbiAgICAgIGluamVjdGVkSnMucHVzaCh7XG4gICAgICAgIGNvbnRlbnQ6IHJlc291cmNlcy5qc1xuICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gTG9hZCBzY3JpcHRzIGZyb20gYWxsIGN1c3RvbSBmaWxlc1xuICAgIGlmIChyZXNvdXJjZXMuZmlsZXMpIHtcbiAgICAgIGZvciAoY29uc3QgZmlsZSBvZiByZXNvdXJjZXMuZmlsZXMpIHtcbiAgICAgICAgY29uc3QgaXNMb2NhbCA9ICFmaWxlLnN0YXJ0c1dpdGgoJ2h0dHAnKSA/IHRydWUgOiBmYWxzZTtcblxuICAgICAgICAvLyBBZGQgZWFjaCBjdXN0b20gc2NyaXB0IGZyb20gcmVzb3VyY2VzJyBmaWxlc1xuICAgICAgICBpbmplY3RlZEpzLnB1c2goXG4gICAgICAgICAgaXNMb2NhbFxuICAgICAgICAgICAgPyB7XG4gICAgICAgICAgICAgICAgY29udGVudDogcmVhZEZpbGVTeW5jKGZpbGUsICd1dGY4JylcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgdXJsOiBmaWxlXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBmb3IgKGNvbnN0IGpzUmVzb3VyY2Ugb2YgaW5qZWN0ZWRKcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgaW5qZWN0ZWRSZXNvdXJjZXMucHVzaChhd2FpdCBwYWdlLmFkZFNjcmlwdFRhZyhqc1Jlc291cmNlKSk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsb2dXaXRoU3RhY2soMiwgZXJyb3IsIGBbZXhwb3J0XSBUaGUgSlMgcmVzb3VyY2UgY2Fubm90IGJlIGxvYWRlZC5gKTtcbiAgICAgIH1cbiAgICB9XG4gICAgaW5qZWN0ZWRKcy5sZW5ndGggPSAwO1xuXG4gICAgLy8gTG9hZCBDU1NcbiAgICBjb25zdCBpbmplY3RlZENzcyA9IFtdO1xuICAgIGlmIChyZXNvdXJjZXMuY3NzKSB7XG4gICAgICBsZXQgY3NzSW1wb3J0cyA9IHJlc291cmNlcy5jc3MubWF0Y2goL0BpbXBvcnRcXHMqKFteO10qKTsvZyk7XG4gICAgICBpZiAoY3NzSW1wb3J0cykge1xuICAgICAgICAvLyBIYW5kbGUgY3NzIHNlY3Rpb25cbiAgICAgICAgZm9yIChsZXQgY3NzSW1wb3J0UGF0aCBvZiBjc3NJbXBvcnRzKSB7XG4gICAgICAgICAgaWYgKGNzc0ltcG9ydFBhdGgpIHtcbiAgICAgICAgICAgIGNzc0ltcG9ydFBhdGggPSBjc3NJbXBvcnRQYXRoXG4gICAgICAgICAgICAgIC5yZXBsYWNlKCd1cmwoJywgJycpXG4gICAgICAgICAgICAgIC5yZXBsYWNlKCdAaW1wb3J0JywgJycpXG4gICAgICAgICAgICAgIC5yZXBsYWNlKC9cIi9nLCAnJylcbiAgICAgICAgICAgICAgLnJlcGxhY2UoLycvZywgJycpXG4gICAgICAgICAgICAgIC5yZXBsYWNlKC87LywgJycpXG4gICAgICAgICAgICAgIC5yZXBsYWNlKC9cXCkvZywgJycpXG4gICAgICAgICAgICAgIC50cmltKCk7XG5cbiAgICAgICAgICAgIC8vIEFkZCBlYWNoIGN1c3RvbSBjc3MgZnJvbSByZXNvdXJjZXNcbiAgICAgICAgICAgIGlmIChjc3NJbXBvcnRQYXRoLnN0YXJ0c1dpdGgoJ2h0dHAnKSkge1xuICAgICAgICAgICAgICBpbmplY3RlZENzcy5wdXNoKHtcbiAgICAgICAgICAgICAgICB1cmw6IGNzc0ltcG9ydFBhdGhcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKG9wdGlvbnMuY3VzdG9tTG9naWMuYWxsb3dGaWxlUmVzb3VyY2VzKSB7XG4gICAgICAgICAgICAgIGluamVjdGVkQ3NzLnB1c2goe1xuICAgICAgICAgICAgICAgIHBhdGg6IHBhdGguam9pbihfX2Rpcm5hbWUsIGNzc0ltcG9ydFBhdGgpXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvLyBUaGUgcmVzdCBvZiB0aGUgQ1NTIHNlY3Rpb24gd2lsbCBiZSBjb250ZW50IGJ5IG5vd1xuICAgICAgaW5qZWN0ZWRDc3MucHVzaCh7XG4gICAgICAgIGNvbnRlbnQ6IHJlc291cmNlcy5jc3MucmVwbGFjZSgvQGltcG9ydFxccyooW147XSopOy9nLCAnJykgfHwgJyAnXG4gICAgICB9KTtcblxuICAgICAgZm9yIChjb25zdCBjc3NSZXNvdXJjZSBvZiBpbmplY3RlZENzcykge1xuICAgICAgICB0cnkge1xuICAgICAgICAgIGluamVjdGVkUmVzb3VyY2VzLnB1c2goYXdhaXQgcGFnZS5hZGRTdHlsZVRhZyhjc3NSZXNvdXJjZSkpO1xuICAgICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICAgIGxvZ1dpdGhTdGFjaygyLCBlcnJvciwgYFtleHBvcnRdIFRoZSBDU1MgcmVzb3VyY2UgY2Fubm90IGJlIGxvYWRlZC5gKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaW5qZWN0ZWRDc3MubGVuZ3RoID0gMDtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGluamVjdGVkUmVzb3VyY2VzO1xufVxuXG4vKipcbiAqIENsZWFycyBvdXQgYWxsIHN0YXRlIHNldCBvbiB0aGUgcGFnZSB3aXRoIGFkZFNjcmlwdFRhZy9hZGRTdHlsZVRhZy4gUmVtb3Zlc1xuICogaW5qZWN0ZWQgcmVzb3VyY2VzIGFuZCByZXNldHMgQ1NTIGFuZCBzY3JpcHQgdGFncyBvbiB0aGUgcGFnZS4gQWRkaXRpb25hbGx5LFxuICogaXQgZGVzdHJveXMgcHJldmlvdXNseSBleGlzdGluZyBjaGFydHMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHBhZ2UgLSBUaGUgUHVwcGV0ZWVyIFBhZ2Ugb2JqZWN0IGZyb20gd2hpY2ggcmVzb3VyY2VzIHdpbGxcbiAqIGJlIGNsZWFyZWQuXG4gKiBAcGFyYW0ge0FycmF5PE9iamVjdD59IGluamVjdGVkUmVzb3VyY2VzIC0gQXJyYXkgb2YgaW5qZWN0ZWQgcmVzb3VyY2VzXG4gKiB0byBiZSBjbGVhcmVkLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gY2xlYXJQYWdlUmVzb3VyY2VzKHBhZ2UsIGluamVjdGVkUmVzb3VyY2VzKSB7XG4gIGZvciAoY29uc3QgcmVzb3VyY2Ugb2YgaW5qZWN0ZWRSZXNvdXJjZXMpIHtcbiAgICBhd2FpdCByZXNvdXJjZS5kaXNwb3NlKCk7XG4gIH1cblxuICAvLyBEZXN0cm95IG9sZCBjaGFydHMgYWZ0ZXIgZXhwb3J0IGlzIGRvbmUgYW5kIHJlc2V0IGFsbCBDU1MgYW5kIHNjcmlwdCB0YWdzXG4gIGF3YWl0IHBhZ2UuZXZhbHVhdGUoKCkgPT4ge1xuICAgIC8vIFdlIGFyZSBub3QgZ3VhcmFudGVlZCB0aGF0IEhpZ2hjaGFydHMgaXMgbG9hZGVkLCBlLGcsIHdoZW4gZG9pbmcgU1ZHXG4gICAgLy8gZXhwb3J0c1xuICAgIGlmICh0eXBlb2YgSGlnaGNoYXJ0cyAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICAgICAgY29uc3Qgb2xkQ2hhcnRzID0gSGlnaGNoYXJ0cy5jaGFydHM7XG5cbiAgICAgIC8vIENoZWNrIGluIGFueSBhbHJlYWR5IGV4aXN0aW5nIGNoYXJ0c1xuICAgICAgaWYgKEFycmF5LmlzQXJyYXkob2xkQ2hhcnRzKSAmJiBvbGRDaGFydHMubGVuZ3RoKSB7XG4gICAgICAgIC8vIERlc3Ryb3kgb2xkIGNoYXJ0c1xuICAgICAgICBmb3IgKGNvbnN0IG9sZENoYXJ0IG9mIG9sZENoYXJ0cykge1xuICAgICAgICAgIG9sZENoYXJ0ICYmIG9sZENoYXJ0LmRlc3Ryb3koKTtcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgICAgICAgICBIaWdoY2hhcnRzLmNoYXJ0cy5zaGlmdCgpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICAgY29uc3QgWy4uLnNjcmlwdHNUb1JlbW92ZV0gPSBkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnc2NyaXB0Jyk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICAgY29uc3QgWywgLi4uc3R5bGVzVG9SZW1vdmVdID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3N0eWxlJyk7XG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICAgY29uc3QgWy4uLmxpbmtzVG9SZW1vdmVdID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2xpbmsnKTtcblxuICAgIC8vIFJlbW92ZSB0YWdzXG4gICAgZm9yIChjb25zdCBlbGVtZW50IG9mIFtcbiAgICAgIC4uLnNjcmlwdHNUb1JlbW92ZSxcbiAgICAgIC4uLnN0eWxlc1RvUmVtb3ZlLFxuICAgICAgLi4ubGlua3NUb1JlbW92ZVxuICAgIF0pIHtcbiAgICAgIGVsZW1lbnQucmVtb3ZlKCk7XG4gICAgfVxuICB9KTtcbn1cblxuLyoqXG4gKiBTZXRzIHRoZSBjb250ZW50IGZvciBhIFB1cHBldGVlciBQYWdlIHVzaW5nIGEgcHJlZGVmaW5lZCB0ZW1wbGF0ZVxuICogYW5kIGFkZGl0aW9uYWwgc2NyaXB0cy4gQWxzbywgc2V0cyB0aGUgcGFnZWVycm9yIGluIG9yZGVyIHRvIGNhdGNoXG4gKiBhbmQgZGlzcGxheSBlcnJvcnMgZnJvbSB0aGUgd2luZG93IGNvbnRleHQuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHBhZ2UgLSBUaGUgUHVwcGV0ZWVyIFBhZ2Ugb2JqZWN0IGZvciB3aGljaCB0aGUgY29udGVudFxuICogaXMgYmVpbmcgc2V0LlxuICovXG5hc3luYyBmdW5jdGlvbiBzZXRQYWdlQ29udGVudChwYWdlKSB7XG4gIGF3YWl0IHBhZ2Uuc2V0Q29udGVudCh0ZW1wbGF0ZSwgeyB3YWl0VW50aWw6ICdkb21jb250ZW50bG9hZGVkJyB9KTtcblxuICAvLyBBZGQgYWxsIHJlZ2lzdGVyZWQgSGlnY2hhcnRzIHNjcmlwdHMsIHF1aXRlIGRlbWFuZGluZ1xuICBhd2FpdCBwYWdlLmFkZFNjcmlwdFRhZyh7IHBhdGg6IGAke2dldENhY2hlUGF0aCgpfS9zb3VyY2VzLmpzYCB9KTtcblxuICAvLyBTZXQgdGhlIGluaXRpYWwgYW5pbU9iamVjdFxuICBhd2FpdCBwYWdlLmV2YWx1YXRlKHNldHVwSGlnaGNoYXJ0cyk7XG59XG5cbi8qKlxuICogU2V0IGV2ZW50cyBmb3IgYSBQdXBwZXRlZXIgUGFnZS5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcGFnZSAtIFRoZSBQdXBwZXRlZXIgUGFnZSBvYmplY3QgdG8gc2V0IGV2ZW50cyB0by5cbiAqL1xuZnVuY3Rpb24gc2V0UGFnZUV2ZW50cyhwYWdlKSB7XG4gIC8vIEdldCBkZWJ1ZyBvcHRpb25zXG4gIGNvbnN0IHsgZGVidWcgfSA9IGdldE9wdGlvbnMoKTtcblxuICAvLyBTZXQgdGhlIGNvbnNvbGUgbGlzdGVuZXIsIGlmIG5lZWRlZFxuICBpZiAoZGVidWcuZW5hYmxlICYmIGRlYnVnLmxpc3RlblRvQ29uc29sZSkge1xuICAgIHBhZ2Uub24oJ2NvbnNvbGUnLCAobWVzc2FnZSkgPT4ge1xuICAgICAgY29uc29sZS5sb2coYFtkZWJ1Z10gJHttZXNzYWdlLnRleHQoKX1gKTtcbiAgICB9KTtcbiAgfVxuXG4gIC8vIFNldCB0aGUgcGFnZWVycm9yIGxpc3RlbmVyXG4gIHBhZ2Uub24oJ3BhZ2VlcnJvcicsIGFzeW5jIChlcnJvcikgPT4ge1xuICAgIC8vIEl0IHdvdWxkIHNlZW0gbGlrZSB0aGlzIG1heSBmaXJlIGF0IHRoZSBzYW1lIHRpbWUgb3Igc2hvcnRseSBiZWZvcmVcbiAgICAvLyBhIHBhZ2UgaXMgY2xvc2VkLlxuICAgIGlmIChwYWdlLmlzQ2xvc2VkKCkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBUT0RPOiBDb25zaWRlciBhZGRpbmcgYSBzd2l0Y2ggaGVyZSB0aGF0IHR1cm5zIG9uIGxvZygwKSBsb2dnaW5nXG4gICAgLy8gb24gcGFnZSBlcnJvcnMuXG4gICAgYXdhaXQgcGFnZS4kZXZhbChcbiAgICAgICcjY29udGFpbmVyJyxcbiAgICAgIChlbGVtZW50LCBlcnJvck1lc3NhZ2UpID0+IHtcbiAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICAgICAgIGlmICh3aW5kb3cuX2Rpc3BsYXlFcnJvcnMpIHtcbiAgICAgICAgICBlbGVtZW50LmlubmVySFRNTCA9IGVycm9yTWVzc2FnZTtcbiAgICAgICAgfVxuICAgICAgfSxcbiAgICAgIGA8aDE+Q2hhcnQgaW5wdXQgZGF0YSBlcnJvcjogPC9oMT4ke2Vycm9yLnRvU3RyaW5nKCl9YFxuICAgICk7XG4gIH0pO1xufVxuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGdldCxcbiAgY3JlYXRlLFxuICBjbG9zZSxcbiAgbmV3UGFnZSxcbiAgY2xlYXJQYWdlLFxuICBhZGRQYWdlUmVzb3VyY2VzLFxuICBjbGVhclBhZ2VSZXNvdXJjZXNcbn07XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5IaWdoY2hhcnRzIEV4cG9ydCBTZXJ2ZXJcblxuQ29weXJpZ2h0IChjKSAyMDE2LTIwMjQsIEhpZ2hzb2Z0XG5cbkxpY2VuY2VkIHVuZGVyIHRoZSBNSVQgbGljZW5jZS5cblxuQWRkaXRpb25hbGx5IGEgdmFsaWQgSGlnaGNoYXJ0cyBsaWNlbnNlIGlzIHJlcXVpcmVkIGZvciB1c2UuXG5cblNlZSBMSUNFTlNFIGZpbGUgaW4gcm9vdCBmb3IgZGV0YWlscy5cblxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgYWRkUGFnZVJlc291cmNlcywgY2xlYXJQYWdlUmVzb3VyY2VzIH0gZnJvbSAnLi9icm93c2VyLmpzJztcbmltcG9ydCB7IGdldENhY2hlIH0gZnJvbSAnLi9jYWNoZS5qcyc7XG5pbXBvcnQgeyB0cmlnZ2VyRXhwb3J0IH0gZnJvbSAnLi9oaWdoY2hhcnRzLmpzJztcbmltcG9ydCB7IGxvZyB9IGZyb20gJy4vbG9nZ2VyLmpzJztcblxuaW1wb3J0IHN2Z1RlbXBsYXRlIGZyb20gJy4vLi4vdGVtcGxhdGVzL3N2Z19leHBvcnQvc3ZnX2V4cG9ydC5qcyc7XG5cbmltcG9ydCBFeHBvcnRFcnJvciBmcm9tICcuL2Vycm9ycy9FeHBvcnRFcnJvci5qcyc7XG5cbi8qKlxuICogUmV0cmlldmVzIHRoZSBjbGlwcGluZyByZWdpb24gY29vcmRpbmF0ZXMgb2YgdGhlIHNwZWNpZmllZCBwYWdlIGVsZW1lbnQgd2l0aFxuICogdGhlIGlkICdjaGFydC1jb250YWluZXInLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYWdlIC0gUHVwcGV0ZWVyIHBhZ2Ugb2JqZWN0LlxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdD59IFByb21pc2UgcmVzb2x2aW5nIHRvIGFuIG9iamVjdCBjb250YWluaW5nXG4gKiB4LCB5LCB3aWR0aCwgYW5kIGhlaWdodCBwcm9wZXJ0aWVzLlxuICovXG5jb25zdCBnZXRDbGlwUmVnaW9uID0gKHBhZ2UpID0+XG4gIHBhZ2UuJGV2YWwoJyNjaGFydC1jb250YWluZXInLCAoZWxlbWVudCkgPT4ge1xuICAgIGNvbnN0IHsgeCwgeSwgd2lkdGgsIGhlaWdodCB9ID0gZWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICByZXR1cm4ge1xuICAgICAgeCxcbiAgICAgIHksXG4gICAgICB3aWR0aCxcbiAgICAgIGhlaWdodDogTWF0aC50cnVuYyhoZWlnaHQgPiAxID8gaGVpZ2h0IDogNTAwKVxuICAgIH07XG4gIH0pO1xuXG4vKipcbiAqIENyZWF0ZXMgYW4gaW1hZ2UgdXNpbmcgUHVwcGV0ZWVyJ3MgcGFnZSBzY3JlZW5zaG90IGZ1bmN0aW9uYWxpdHkgd2l0aFxuICogc3BlY2lmaWVkIG9wdGlvbnMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHBhZ2UgLSBQdXBwZXRlZXIgcGFnZSBvYmplY3QuXG4gKiBAcGFyYW0ge3N0cmluZ30gdHlwZSAtIEltYWdlIHR5cGUuXG4gKiBAcGFyYW0ge3N0cmluZ30gZW5jb2RpbmcgLSBJbWFnZSBlbmNvZGluZy5cbiAqIEBwYXJhbSB7T2JqZWN0fSBjbGlwIC0gQ2xpcHBpbmcgcmVnaW9uIGNvb3JkaW5hdGVzLlxuICogQHBhcmFtIHtudW1iZXJ9IHJhc3Rlcml6YXRpb25UaW1lb3V0IC0gVGltZW91dCBmb3IgcmFzdGVyaXphdGlvblxuICogaW4gbWlsbGlzZWNvbmRzLlxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPEJ1ZmZlcj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBpbWFnZSBidWZmZXIgb3IgcmVqZWN0aW5nXG4gKiB3aXRoIGFuIEV4cG9ydEVycm9yIGZvciB0aW1lb3V0LlxuICovXG5jb25zdCBjcmVhdGVJbWFnZSA9IChwYWdlLCB0eXBlLCBlbmNvZGluZywgY2xpcCwgcmFzdGVyaXphdGlvblRpbWVvdXQpID0+XG4gIFByb21pc2UucmFjZShbXG4gICAgcGFnZS5zY3JlZW5zaG90KHtcbiAgICAgIHR5cGUsXG4gICAgICBlbmNvZGluZyxcbiAgICAgIGNsaXAsXG4gICAgICBjYXB0dXJlQmV5b25kVmlld3BvcnQ6IHRydWUsXG4gICAgICBmdWxsUGFnZTogZmFsc2UsXG4gICAgICBvcHRpbWl6ZUZvclNwZWVkOiB0cnVlLFxuICAgICAgLi4uKHR5cGUgIT09ICdwbmcnID8geyBxdWFsaXR5OiA4MCB9IDoge30pLFxuXG4gICAgICAvLyAjNDQ3LCAjNDYzIC0gYWx3YXlzIHJlbmRlciBvbiBhIHRyYW5zcGFyZW50IHBhZ2UgaWYgdGhlIGV4cGVjdGVkIHR5cGVcbiAgICAgIC8vIGZvcm1hdCBpcyBQTkdcbiAgICAgIG9taXRCYWNrZ3JvdW5kOiB0eXBlID09ICdwbmcnXG4gICAgfSksXG4gICAgbmV3IFByb21pc2UoKF9yZXNvbHZlLCByZWplY3QpID0+XG4gICAgICBzZXRUaW1lb3V0KFxuICAgICAgICAoKSA9PiByZWplY3QobmV3IEV4cG9ydEVycm9yKCdSYXN0ZXJpemF0aW9uIHRpbWVvdXQnKSksXG4gICAgICAgIHJhc3Rlcml6YXRpb25UaW1lb3V0IHx8IDE1MDBcbiAgICAgIClcbiAgICApXG4gIF0pO1xuXG4vKipcbiAqIENyZWF0ZXMgYSBQREYgdXNpbmcgUHVwcGV0ZWVyJ3MgcGFnZSBwZGYgZnVuY3Rpb25hbGl0eSB3aXRoIHNwZWNpZmllZFxuICogb3B0aW9ucy5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gcGFnZSAtIFB1cHBldGVlciBwYWdlIG9iamVjdC5cbiAqIEBwYXJhbSB7bnVtYmVyfSBoZWlnaHQgLSBQREYgaGVpZ2h0LlxuICogQHBhcmFtIHtudW1iZXJ9IHdpZHRoIC0gUERGIHdpZHRoLlxuICogQHBhcmFtIHtzdHJpbmd9IGVuY29kaW5nIC0gUERGIGVuY29kaW5nLlxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPEJ1ZmZlcj59IFByb21pc2UgcmVzb2x2aW5nIHRvIHRoZSBQREYgYnVmZmVyLlxuICovXG5jb25zdCBjcmVhdGVQREYgPSBhc3luYyAoXG4gIHBhZ2UsXG4gIGhlaWdodCxcbiAgd2lkdGgsXG4gIGVuY29kaW5nLFxuICByYXN0ZXJpemF0aW9uVGltZW91dFxuKSA9PiB7XG4gIGF3YWl0IHBhZ2UuZW11bGF0ZU1lZGlhVHlwZSgnc2NyZWVuJyk7XG5cbiAgcmV0dXJuIHBhZ2UucGRmKHtcbiAgICAvLyBUaGlzIHdpbGwgcmVtb3ZlIGFuIGV4dHJhIGVtcHR5IHBhZ2UgaW4gUERGIGV4cG9ydHNcbiAgICBoZWlnaHQ6IGhlaWdodCArIDEsXG4gICAgd2lkdGgsXG4gICAgZW5jb2RpbmcsXG4gICAgdGltZW91dDogcmFzdGVyaXphdGlvblRpbWVvdXQgfHwgMTUwMFxuICB9KTtcbn07XG5cbi8qKlxuICogQ3JlYXRlcyBhbiBTVkcgc3RyaW5nIGJ5IGV2YWx1YXRpbmcgdGhlIG91dGVySFRNTCBvZiB0aGUgZmlyc3QgJ3N2ZycgZWxlbWVudFxuICogaW5zaWRlIGFuIGVsZW1lbnQgd2l0aCB0aGUgaWQgJ2NvbnRhaW5lcicuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHBhZ2UgLSBQdXBwZXRlZXIgcGFnZSBvYmplY3QuXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nPn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIFNWRyBzdHJpbmcuXG4gKi9cbmNvbnN0IGNyZWF0ZVNWRyA9IChwYWdlKSA9PlxuICBwYWdlLiRldmFsKCcjY29udGFpbmVyIHN2ZzpmaXJzdC1vZi10eXBlJywgKGVsZW1lbnQpID0+IGVsZW1lbnQub3V0ZXJIVE1MKTtcblxuLyoqXG4gKiBTZXRzIHRoZSBzcGVjaWZpZWQgY2hhcnQgYW5kIG9wdGlvbnMgYXMgY29uZmlndXJhdGlvbiBpbnRvIHRoZSB0cmlnZ2VyRXhwb3J0XG4gKiBmdW5jdGlvbiB3aXRoaW4gdGhlIHdpbmRvdyBjb250ZXh0IHVzaW5nIHBhZ2UuZXZhbHVhdGUuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IHBhZ2UgLSBQdXBwZXRlZXIgcGFnZSBvYmplY3QuXG4gKiBAcGFyYW0ge2FueX0gY2hhcnQgLSBUaGUgY2hhcnQgb2JqZWN0IHRvIGJlIGNvbmZpZ3VyZWQuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIGNoYXJ0LlxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBQcm9taXNlIHJlc29sdmluZyBhZnRlciB0aGUgY29uZmlndXJhdGlvbiBpcyBzZXQuXG4gKi9cbmNvbnN0IHNldEFzQ29uZmlnID0gYXN5bmMgKHBhZ2UsIGNoYXJ0LCBvcHRpb25zLCBkaXNwbGF5RXJyb3JzKSA9PlxuICBwYWdlLmV2YWx1YXRlKHRyaWdnZXJFeHBvcnQsIGNoYXJ0LCBvcHRpb25zLCBkaXNwbGF5RXJyb3JzKTtcblxuLyoqXG4gKiBFeHBvcnRzIHRvIGEgY2hhcnQgZnJvbSBhIHBhZ2UgdXNpbmcgUHVwcGV0ZWVyLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBwYWdlIC0gUHVwcGV0ZWVyIHBhZ2Ugb2JqZWN0LlxuICogQHBhcmFtIHthbnl9IGNoYXJ0IC0gVGhlIGNoYXJ0IG9iamVjdCBvciBTVkcgY29uZmlndXJhdGlvbiB0byBiZSBleHBvcnRlZC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gRXhwb3J0IG9wdGlvbnMgYW5kIGNvbmZpZ3VyYXRpb24uXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8c3RyaW5nIHwgQnVmZmVyIHwgRXhwb3J0RXJyb3I+fSBQcm9taXNlIHJlc29sdmluZyB0b1xuICogdGhlIGV4cG9ydGVkIGRhdGEgb3IgcmVqZWN0aW5nIHdpdGggYW4gRXhwb3J0RXJyb3IuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGFzeW5jIChwYWdlLCBjaGFydCwgb3B0aW9ucykgPT4ge1xuICAvLyBJbmplY3RlZCByZXNvdXJjZXMgYXJyYXkgKGFkZGl0aW9uYWwgSlMgYW5kIENTUylcbiAgbGV0IGluamVjdGVkUmVzb3VyY2VzID0gW107XG5cbiAgdHJ5IHtcbiAgICBsb2coNCwgJ1tleHBvcnRdIERldGVybWluaW5nIGV4cG9ydCBwYXRoLicpO1xuXG4gICAgY29uc3QgZXhwb3J0T3B0aW9ucyA9IG9wdGlvbnMuZXhwb3J0O1xuXG4gICAgLy8gRGVjaWRlIHdoZXRoZXIgZGlzcGxheSBlcnJvciBvciBkZWJidWdlciB3cmFwcGVyIGFyb3VuZCBpdFxuICAgIGNvbnN0IGRpc3BsYXlFcnJvcnMgPVxuICAgICAgZXhwb3J0T3B0aW9ucz8ub3B0aW9ucz8uY2hhcnQ/LmRpc3BsYXlFcnJvcnMgJiZcbiAgICAgIGdldENhY2hlKCkuYWN0aXZlTWFuaWZlc3QubW9kdWxlcy5kZWJ1Z2dlcjtcblxuICAgIGxldCBpc1NWRztcbiAgICBpZiAoXG4gICAgICBjaGFydC5pbmRleE9mICYmXG4gICAgICAoY2hhcnQuaW5kZXhPZignPHN2ZycpID49IDAgfHwgY2hhcnQuaW5kZXhPZignPD94bWwnKSA+PSAwKVxuICAgICkge1xuICAgICAgLy8gU1ZHIGlucHV0IGhhbmRsaW5nXG4gICAgICBsb2coNCwgJ1tleHBvcnRdIFRyZWF0aW5nIGFzIFNWRy4nKTtcblxuICAgICAgLy8gSWYgaW5wdXQgaXMgYWxzbyBTVkcsIGp1c3QgcmV0dXJuIGl0XG4gICAgICBpZiAoZXhwb3J0T3B0aW9ucy50eXBlID09PSAnc3ZnJykge1xuICAgICAgICByZXR1cm4gY2hhcnQ7XG4gICAgICB9XG5cbiAgICAgIGlzU1ZHID0gdHJ1ZTtcbiAgICAgIGF3YWl0IHBhZ2Uuc2V0Q29udGVudChzdmdUZW1wbGF0ZShjaGFydCksIHtcbiAgICAgICAgd2FpdFVudGlsOiAnZG9tY29udGVudGxvYWRlZCdcbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBKU09OIGNvbmZpZyBoYW5kbGluZ1xuICAgICAgbG9nKDQsICdbZXhwb3J0XSBUcmVhdGluZyBhcyBjb25maWcuJyk7XG5cbiAgICAgIC8vIE5lZWQgdG8gcGVyZm9ybSBzdHJhaWdodCBpbmplY3RcbiAgICAgIGlmIChleHBvcnRPcHRpb25zLnN0ckluaikge1xuICAgICAgICAvLyBJbmplY3Rpb24gYmFzZWQgY29uZmlndXJhdGlvbiBleHBvcnRcbiAgICAgICAgYXdhaXQgc2V0QXNDb25maWcoXG4gICAgICAgICAgcGFnZSxcbiAgICAgICAgICB7XG4gICAgICAgICAgICBjaGFydDoge1xuICAgICAgICAgICAgICBoZWlnaHQ6IGV4cG9ydE9wdGlvbnMuaGVpZ2h0LFxuICAgICAgICAgICAgICB3aWR0aDogZXhwb3J0T3B0aW9ucy53aWR0aFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgb3B0aW9ucyxcbiAgICAgICAgICBkaXNwbGF5RXJyb3JzXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBCYXNpYyBjb25maWd1cmF0aW9uIGV4cG9ydFxuICAgICAgICBjaGFydC5jaGFydC5oZWlnaHQgPSBleHBvcnRPcHRpb25zLmhlaWdodDtcbiAgICAgICAgY2hhcnQuY2hhcnQud2lkdGggPSBleHBvcnRPcHRpb25zLndpZHRoO1xuXG4gICAgICAgIGF3YWl0IHNldEFzQ29uZmlnKHBhZ2UsIGNoYXJ0LCBvcHRpb25zLCBkaXNwbGF5RXJyb3JzKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBLZWVwcyB0cmFjayBvZiBhbGwgcmVzb3VyY2VzIGFkZGVkIG9uIHRoZSBwYWdlIHdpdGggYWRkWFhYVGFnLiBldGNcbiAgICAvLyBJdCdzIFZJVEFMIHRoYXQgYWxsIGFkZGVkIHJlc291cmNlcyBlbmRzIHVwIGhlcmUgc28gd2UgY2FuIGNsZWFyIHRoaW5nc1xuICAgIC8vIG91dCB3aGVuIGRvaW5nIGEgbmV3IGV4cG9ydCBpbiB0aGUgc2FtZSBwYWdlIVxuICAgIGluamVjdGVkUmVzb3VyY2VzID0gYXdhaXQgYWRkUGFnZVJlc291cmNlcyhwYWdlLCBvcHRpb25zKTtcblxuICAgIC8vIEdldCB0aGUgcmVhbCBjaGFydCBzaXplIGFuZCBzZXQgdGhlIHpvb20gYWNjb3JkaW5nbHlcbiAgICBjb25zdCBzaXplID0gaXNTVkdcbiAgICAgID8gYXdhaXQgcGFnZS5ldmFsdWF0ZSgoc2NhbGUpID0+IHtcbiAgICAgICAgICBjb25zdCBzdmdFbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihcbiAgICAgICAgICAgICcjY2hhcnQtY29udGFpbmVyIHN2ZzpmaXJzdC1vZi10eXBlJ1xuICAgICAgICAgICk7XG5cbiAgICAgICAgICAvLyBHZXQgdGhlIHZhbHVlcyBjb3JyZWN0bHkgc2NhbGVkXG4gICAgICAgICAgY29uc3QgY2hhcnRIZWlnaHQgPSBzdmdFbGVtZW50LmhlaWdodC5iYXNlVmFsLnZhbHVlICogc2NhbGU7XG4gICAgICAgICAgY29uc3QgY2hhcnRXaWR0aCA9IHN2Z0VsZW1lbnQud2lkdGguYmFzZVZhbC52YWx1ZSAqIHNjYWxlO1xuXG4gICAgICAgICAgLy8gSW4gY2FzZSBvZiBTVkcgdGhlIHpvb20gbXVzdCBiZSBzZXQgZGlyZWN0bHkgZm9yIGJvZHlcbiAgICAgICAgICAvLyBTZXQgdGhlIHpvb20gYXMgc2NhbGVcbiAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgbm8tdW5kZWZcbiAgICAgICAgICBkb2N1bWVudC5ib2R5LnN0eWxlLnpvb20gPSBzY2FsZTtcblxuICAgICAgICAgIC8vIFNldCB0aGUgbWFyZ2luIHRvIDBweFxuICAgICAgICAgIC8vIGVzbGludC1kaXNhYmxlLW5leHQtbGluZSBuby11bmRlZlxuICAgICAgICAgIGRvY3VtZW50LmJvZHkuc3R5bGUubWFyZ2luID0gJzBweCc7XG5cbiAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgY2hhcnRIZWlnaHQsXG4gICAgICAgICAgICBjaGFydFdpZHRoXG4gICAgICAgICAgfTtcbiAgICAgICAgfSwgcGFyc2VGbG9hdChleHBvcnRPcHRpb25zLnNjYWxlKSlcbiAgICAgIDogYXdhaXQgcGFnZS5ldmFsdWF0ZSgoKSA9PiB7XG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICAgICAgICAgY29uc3QgeyBjaGFydEhlaWdodCwgY2hhcnRXaWR0aCB9ID0gd2luZG93LkhpZ2hjaGFydHMuY2hhcnRzWzBdO1xuXG4gICAgICAgICAgLy8gTm8gbmVlZCBmb3Igc3VjaCBzY2FsZSBtYW5pcHVsYXRpb24gaW4gY2FzZSBvZiBvdGhlciB0eXBlcyBvZiBleHBvcnRzXG4gICAgICAgICAgLy8gUmVzZXQgdGhlIHpvb20gZm9yIG90aGVyIGV4cG9ydHMgdGhhbiB0byBTVkdzXG4gICAgICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIG5vLXVuZGVmXG4gICAgICAgICAgZG9jdW1lbnQuYm9keS5zdHlsZS56b29tID0gMTtcblxuICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBjaGFydEhlaWdodCxcbiAgICAgICAgICAgIGNoYXJ0V2lkdGhcbiAgICAgICAgICB9O1xuICAgICAgICB9KTtcblxuICAgIC8vIFNldCBmaW5hbCBoZWlnaHQgYW5kIHdpZHRoIGZvciB2aWV3cG9ydFxuICAgIGNvbnN0IHZpZXdwb3J0SGVpZ2h0ID0gTWF0aC5hYnMoXG4gICAgICBNYXRoLmNlaWwoc2l6ZS5jaGFydEhlaWdodCB8fCBleHBvcnRPcHRpb25zLmhlaWdodClcbiAgICApO1xuICAgIGNvbnN0IHZpZXdwb3J0V2lkdGggPSBNYXRoLmFicyhcbiAgICAgIE1hdGguY2VpbChzaXplLmNoYXJ0V2lkdGggfHwgZXhwb3J0T3B0aW9ucy53aWR0aClcbiAgICApO1xuXG4gICAgLy8gR2V0IHRoZSBjbGlwIHJlZ2lvbiBmb3IgdGhlIHBhZ2VcbiAgICBjb25zdCB7IHgsIHkgfSA9IGF3YWl0IGdldENsaXBSZWdpb24ocGFnZSk7XG5cbiAgICAvLyBTZXQgdGhlIGZpbmFsIHZpZXdwb3J0IG5vdyB0aGF0IHdlIGhhdmUgdGhlIHJlYWwgaGVpZ2h0XG4gICAgYXdhaXQgcGFnZS5zZXRWaWV3cG9ydCh7XG4gICAgICBoZWlnaHQ6IHZpZXdwb3J0SGVpZ2h0LFxuICAgICAgd2lkdGg6IHZpZXdwb3J0V2lkdGgsXG4gICAgICBkZXZpY2VTY2FsZUZhY3RvcjogaXNTVkcgPyAxIDogcGFyc2VGbG9hdChleHBvcnRPcHRpb25zLnNjYWxlKVxuICAgIH0pO1xuXG4gICAgbGV0IGRhdGE7XG4gICAgLy8gUmFzdGVyaXphdGlvbiBwcm9jZXNzXG4gICAgaWYgKGV4cG9ydE9wdGlvbnMudHlwZSA9PT0gJ3N2ZycpIHtcbiAgICAgIC8vIFNWR1xuICAgICAgZGF0YSA9IGF3YWl0IGNyZWF0ZVNWRyhwYWdlKTtcbiAgICB9IGVsc2UgaWYgKFsncG5nJywgJ2pwZWcnXS5pbmNsdWRlcyhleHBvcnRPcHRpb25zLnR5cGUpKSB7XG4gICAgICAvLyBQTkcgb3IgSlBFR1xuICAgICAgZGF0YSA9IGF3YWl0IGNyZWF0ZUltYWdlKFxuICAgICAgICBwYWdlLFxuICAgICAgICBleHBvcnRPcHRpb25zLnR5cGUsXG4gICAgICAgICdiYXNlNjQnLFxuICAgICAgICB7XG4gICAgICAgICAgd2lkdGg6IHZpZXdwb3J0V2lkdGgsXG4gICAgICAgICAgaGVpZ2h0OiB2aWV3cG9ydEhlaWdodCxcbiAgICAgICAgICB4LFxuICAgICAgICAgIHlcbiAgICAgICAgfSxcbiAgICAgICAgZXhwb3J0T3B0aW9ucy5yYXN0ZXJpemF0aW9uVGltZW91dFxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKGV4cG9ydE9wdGlvbnMudHlwZSA9PT0gJ3BkZicpIHtcbiAgICAgIC8vIFBERlxuICAgICAgZGF0YSA9IGF3YWl0IGNyZWF0ZVBERihcbiAgICAgICAgcGFnZSxcbiAgICAgICAgdmlld3BvcnRIZWlnaHQsXG4gICAgICAgIHZpZXdwb3J0V2lkdGgsXG4gICAgICAgICdiYXNlNjQnLFxuICAgICAgICBleHBvcnRPcHRpb25zLnJhc3Rlcml6YXRpb25UaW1lb3V0XG4gICAgICApO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvdyBuZXcgRXhwb3J0RXJyb3IoXG4gICAgICAgIGBbZXhwb3J0XSBVbnN1cHBvcnRlZCBvdXRwdXQgZm9ybWF0ICR7ZXhwb3J0T3B0aW9ucy50eXBlfS5gXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIENsZWFyIHByZXZpb3VzbHkgaW5qZWN0ZWQgSlMgYW5kIENTUyByZXNvdXJjZXNcbiAgICBhd2FpdCBjbGVhclBhZ2VSZXNvdXJjZXMocGFnZSwgaW5qZWN0ZWRSZXNvdXJjZXMpO1xuICAgIHJldHVybiBkYXRhO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIGF3YWl0IGNsZWFyUGFnZVJlc291cmNlcyhwYWdlLCBpbmplY3RlZFJlc291cmNlcyk7XG4gICAgcmV0dXJuIGVycm9yO1xuICB9XG59O1xuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuSGlnaGNoYXJ0cyBFeHBvcnQgU2VydmVyXG5cbkNvcHlyaWdodCAoYykgMjAxNi0yMDI0LCBIaWdoc29mdFxuXG5MaWNlbmNlZCB1bmRlciB0aGUgTUlUIGxpY2VuY2UuXG5cbkFkZGl0aW9uYWxseSBhIHZhbGlkIEhpZ2hjaGFydHMgbGljZW5zZSBpcyByZXF1aXJlZCBmb3IgdXNlLlxuXG5TZWUgTElDRU5TRSBmaWxlIGluIHJvb3QgZm9yIGRldGFpbHMuXG5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCBjc3NUZW1wbGF0ZSBmcm9tICcuL2Nzcy5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IChjaGFydCkgPT4gYFxuPCFET0NUWVBFIGh0bWw+XG48aHRtbCBsYW5nPSdlbi1VUyc+XG4gIDxoZWFkPlxuICAgIDxtZXRhIGh0dHAtZXF1aXY9XCJDb250ZW50LVR5cGVcIiBjb250ZW50PVwidGV4dC9odG1sOyBjaGFyc2V0PXV0Zi04XCI+XG4gICAgPHRpdGxlPkhpZ2hjaGFydHMgRXhwb3J0PC90aXRsZT5cbiAgPC9oZWFkPlxuICA8c3R5bGU+XG4gICAgJHtjc3NUZW1wbGF0ZSgpfVxuICA8L3N0eWxlPlxuICA8Ym9keT5cbiAgICA8ZGl2IGlkPVwiY2hhcnQtY29udGFpbmVyXCI+XG4gICAgICAke2NoYXJ0fVxuICAgIDwvZGl2PlxuICA8L2JvZHk+XG48L2h0bWw+XG5cbmA7XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5IaWdoY2hhcnRzIEV4cG9ydCBTZXJ2ZXJcblxuQ29weXJpZ2h0IChjKSAyMDE2LTIwMjQsIEhpZ2hzb2Z0XG5cbkxpY2VuY2VkIHVuZGVyIHRoZSBNSVQgbGljZW5jZS5cblxuQWRkaXRpb25hbGx5IGEgdmFsaWQgSGlnaGNoYXJ0cyBsaWNlbnNlIGlzIHJlcXVpcmVkIGZvciB1c2UuXG5cblNlZSBMSUNFTlNFIGZpbGUgaW4gcm9vdCBmb3IgZGV0YWlscy5cblxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgUG9vbCB9IGZyb20gJ3Rhcm4nO1xuaW1wb3J0IHsgdjQgYXMgdXVpZCB9IGZyb20gJ3V1aWQnO1xuXG5pbXBvcnQge1xuICBjcmVhdGUgYXMgY3JlYXRlQnJvd3NlcixcbiAgY2xvc2UgYXMgY2xvc2VCcm93c2VyLFxuICBuZXdQYWdlLFxuICBjbGVhclBhZ2Vcbn0gZnJvbSAnLi9icm93c2VyLmpzJztcbmltcG9ydCBwdXBwZXRlZXJFeHBvcnQgZnJvbSAnLi9leHBvcnQuanMnO1xuaW1wb3J0IHsgbG9nLCBsb2dXaXRoU3RhY2sgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBtZWFzdXJlVGltZSB9IGZyb20gJy4vdXRpbHMuanMnO1xuXG5pbXBvcnQgRXhwb3J0RXJyb3IgZnJvbSAnLi9lcnJvcnMvRXhwb3J0RXJyb3IuanMnO1xuXG4vLyBUaGUgcG9vbCBpbnN0YW5jZVxubGV0IHBvb2wgPSBmYWxzZTtcblxuLy8gUG9vbCBzdGF0aXN0aWNzXG5leHBvcnQgY29uc3Qgc3RhdHMgPSB7XG4gIHBlcmZvcm1lZEV4cG9ydHM6IDAsXG4gIGV4cG9ydEF0dGVtcHRzOiAwLFxuICBleHBvcnRGcm9tU3ZnQXR0ZW1wdHM6IDAsXG4gIHRpbWVTcGVudDogMCxcbiAgZHJvcHBlZEV4cG9ydHM6IDAsXG4gIHNwZW50QXZlcmFnZTogMFxufTtcblxubGV0IHBvb2xDb25maWcgPSB7fTtcblxuY29uc3QgZmFjdG9yeSA9IHtcbiAgLyoqXG4gICAqIENyZWF0ZXMgYSBuZXcgd29ya2VyIHBhZ2UgZm9yIHRoZSBleHBvcnQgcG9vbC5cbiAgICpcbiAgICogQHJldHVybnMge09iamVjdH0gLSBBbiBvYmplY3QgY29udGFpbmluZyB0aGUgd29ya2VyIElELCBhIHJlZmVyZW5jZSB0byB0aGVcbiAgICogYnJvd3NlciBwYWdlLCBhbmQgaW5pdGlhbCB3b3JrIGNvdW50LlxuICAgKlxuICAgKiBAdGhyb3dzIHtFeHBvcnRFcnJvcn0gLSBJZiB0aGVyZSdzIGFuIGVycm9yIGR1cmluZyB0aGUgY3JlYXRpb24gb2YgdGhlIG5ld1xuICAgKiBwYWdlLlxuICAgKi9cbiAgY3JlYXRlOiBhc3luYyAoKSA9PiB7XG4gICAgbGV0IHBhZ2UgPSBmYWxzZTtcblxuICAgIGNvbnN0IGlkID0gdXVpZCgpO1xuICAgIGNvbnN0IHN0YXJ0RGF0ZSA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuXG4gICAgdHJ5IHtcbiAgICAgIHBhZ2UgPSBhd2FpdCBuZXdQYWdlKCk7XG5cbiAgICAgIGlmICghcGFnZSB8fCBwYWdlLmlzQ2xvc2VkKCkpIHtcbiAgICAgICAgdGhyb3cgbmV3IEV4cG9ydEVycm9yKCdUaGUgcGFnZSBpcyBpbnZhbGlkIG9yIGNsb3NlZC4nKTtcbiAgICAgIH1cblxuICAgICAgbG9nKFxuICAgICAgICAzLFxuICAgICAgICBgW3Bvb2xdIFN1Y2Nlc3NmdWxseSBjcmVhdGVkIGEgd29ya2VyICR7aWR9IC0gdG9vayAke1xuICAgICAgICAgIG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gc3RhcnREYXRlXG4gICAgICAgIH0gbXMuYFxuICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgdGhyb3cgbmV3IEV4cG9ydEVycm9yKFxuICAgICAgICAnRXJyb3IgZW5jb3VudGVyZWQgd2hlbiBjcmVhdGluZyBhIG5ldyBwYWdlLidcbiAgICAgICkuc2V0RXJyb3IoZXJyb3IpO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICBpZCxcbiAgICAgIHBhZ2UsXG4gICAgICAvLyBUcnkgdG8gZGlzdHJpYnV0ZSB0aGUgaW5pdGlhbCB3b3JrIGNvdW50XG4gICAgICB3b3JrQ291bnQ6IE1hdGgucm91bmQoTWF0aC5yYW5kb20oKSAqIChwb29sQ29uZmlnLndvcmtMaW1pdCAvIDIpKVxuICAgIH07XG4gIH0sXG5cbiAgLyoqXG4gICAqIFZhbGlkYXRlcyBhIHdvcmtlciBwYWdlIGluIHRoZSBleHBvcnQgcG9vbCwgY2hlY2tpbmcgaWYgaXQgaGFzIGV4Y2VlZGVkXG4gICAqIHRoZSB3b3JrIGxpbWl0LlxuICAgKlxuICAgKiBAcGFyYW0ge09iamVjdH0gd29ya2VySGFuZGxlIC0gVGhlIGhhbmRsZSB0byB0aGUgd29ya2VyLCBjb250YWluaW5nIHRoZVxuICAgKiB3b3JrZXIncyBJRCwgYSByZWZlcmVuY2UgdG8gdGhlIGJyb3dzZXIgcGFnZSwgYW5kIHdvcmsgY291bnQuXG4gICAqXG4gICAqIEByZXR1cm5zIHtib29sZWFufSAtIFJldHVybnMgdHJ1ZSBpZiB0aGUgd29ya2VyIGlzIHZhbGlkIGFuZCB3aXRoaW5cbiAgICogdGhlIHdvcmsgbGltaXQ7IG90aGVyd2lzZSwgcmV0dXJucyBmYWxzZS5cbiAgICovXG4gIHZhbGlkYXRlOiBhc3luYyAod29ya2VySGFuZGxlKSA9PiB7XG4gICAgLy8gTk9URTogSW4gY2VydGFpbiBjYXNlcyBhY3F1aXJpbmcgdGhyb3dzIGEgVGFyZ2V0Q2xvc2VFcnJvciwgd2hpY2ggbWF5XG4gICAgLy8gICAgICAgYmUgY2F1c2VkIGJ5IHR3byB0aGluZ3M6XG4gICAgLy8gICAgICAgICAtIFRoZSBwYWdlIGlzIGNsb3NlZCBhbmQgYXR0ZW1wdGVkIHRvIGJlIHJldXNlZC5cbiAgICAvLyAgICAgICAgIC0gTG9zdCBjb250YWN0IHdpdGggdGhlIGJyb3dzZXJcbiAgICAvLyAgICAgICBXaGF0IHdlJ3JlIHNlZWluZyBpbiBsb2dzIGlzIHRoYXQgc3VjY2Vzc2l2ZSBleHBvcnRzIHR5cGljYWxseVxuICAgIC8vICAgICAgIHN1Y2NlZWRzLCBhbmQgdGhlIHNlcnZlciByZWNvdmVycywgaW5kaWNhdGluZyB0aGF0IGl0J3MgbGlrZWx5XG4gICAgLy8gICAgICAgdGhlIGZpcnN0IGNhc2UuIFRoaXMgaXMgYW4gYXR0ZW1wdCBhdCBhbGxpZXZhdGluZyB0aGUgaXNzdWUgYnlcbiAgICAvLyAgICAgICBzaW1wbHkgbm90IHZhbGlkYXRpbmcgdGhlIHdvcmtlciBpZiB0aGUgcGFnZSBpcyBudWxsIG9yIGNsb3NlZC5cbiAgICAvL1xuICAgIC8vICAgICAgIFRoZSBhY3R1YWwgcmVzdWx0IGZyb20gd2hlbiB0aGlzIGhhcHBlbmVkLCB3YXMgdGhhdCBhIHdvcmtlciB3b3VsZFxuICAgIC8vICAgICAgIGJlIGNvbXBsZXRlbHkgbG9ja2VkLCBzdG9wcGluZyBpdCBmcm9tIGJlaW5nIGFjcXVpcmVkIHVudGlsXG4gICAgLy8gICAgICAgaXRzIHdvcmsgY291bnQgcmVhY2hlZCB0aGUgbGltaXQuXG4gICAgaWYgKCF3b3JrZXJIYW5kbGUucGFnZSB8fCB3b3JrZXJIYW5kbGUucGFnZT8uaXNDbG9zZWQoKSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChcbiAgICAgIHBvb2xDb25maWcud29ya0xpbWl0ICYmXG4gICAgICArK3dvcmtlckhhbmRsZS53b3JrQ291bnQgPiBwb29sQ29uZmlnLndvcmtMaW1pdFxuICAgICkge1xuICAgICAgbG9nKFxuICAgICAgICAzLFxuICAgICAgICBgW3Bvb2xdIFdvcmtlciBmYWlsZWQgdmFsaWRhdGlvbjogZXhjZWVkZWQgd29yayBsaW1pdCAobGltaXQgaXMgJHtwb29sQ29uZmlnLndvcmtMaW1pdH0pLmBcbiAgICAgICk7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xuICB9LFxuXG4gIC8qKlxuICAgKiBEZXN0cm95cyBhIHdvcmtlciBlbnRyeSBpbiB0aGUgZXhwb3J0IHBvb2wsIGNsb3NpbmcgaXRzIGFzc29jaWF0ZWQgcGFnZS5cbiAgICpcbiAgICogQHBhcmFtIHtPYmplY3R9IHdvcmtlckhhbmRsZSAtIFRoZSBoYW5kbGUgdG8gdGhlIHdvcmtlciwgY29udGFpbmluZ1xuICAgKiB0aGUgd29ya2VyJ3MgSUQgYW5kIGEgcmVmZXJlbmNlIHRvIHRoZSBicm93c2VyIHBhZ2UuXG4gICAqL1xuICBkZXN0cm95OiBhc3luYyAod29ya2VySGFuZGxlKSA9PiB7XG4gICAgbG9nKDMsIGBbcG9vbF0gRGVzdHJveWluZyBwb29sIGVudHJ5ICR7d29ya2VySGFuZGxlLmlkfS5gKTtcblxuICAgIGlmICh3b3JrZXJIYW5kbGUucGFnZSAmJiAhd29ya2VySGFuZGxlLnBhZ2UuaXNDbG9zZWQoKSkge1xuICAgICAgYXdhaXQgd29ya2VySGFuZGxlLnBhZ2UuY2xvc2UoKTtcbiAgICB9XG4gIH1cblxuICAvLyBsb2c6IChtZXNzYWdlLCBsZXZlbCkgPT4gbG9nKDEsICdbdGFybl0gJyArICBtZXNzYWdlKVxufTtcblxuLyoqXG4gKiBJbml0aWFsaXplcyB0aGUgZXhwb3J0IHBvb2wgd2l0aCB0aGUgcHJvdmlkZWQgY29uZmlndXJhdGlvbiwgY3JlYXRpbmdcbiAqIGEgYnJvd3NlciBpbnN0YW5jZSBhbmQgc2V0dGluZyB1cCB3b3JrZXIgcmVzb3VyY2VzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBjb25maWcgLSBDb25maWd1cmF0aW9uIG9wdGlvbnMgZm9yIHRoZSBleHBvcnQgcG9vbCBhbG9uZ1xuICogd2l0aCBjdXN0b20gcHVwcGV0ZWVyIGFyZ3VtZW50cyBmb3IgdGhlIHB1cHBldGVlci5sYXVuY2ggZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBjb25zdCBpbml0UG9vbCA9IGFzeW5jIChjb25maWcpID0+IHtcbiAgLy8gRm9yIHRoZSBtb2R1bGUgc2NvcGUgdXNhZ2VcbiAgcG9vbENvbmZpZyA9IGNvbmZpZyAmJiBjb25maWcucG9vbCA/IHsgLi4uY29uZmlnLnBvb2wgfSA6IHt9O1xuXG4gIC8vIENyZWF0ZSBhIGJyb3dzZXIgaW5zdGFuY2Ugd2l0aCB0aGUgcHVwcGV0ZWVyIGFyZ3VtZW50c1xuICBhd2FpdCBjcmVhdGVCcm93c2VyKGNvbmZpZy5wdXBwZXRlZXJBcmdzKTtcblxuICBsb2coXG4gICAgMyxcbiAgICBgW3Bvb2xdIEluaXRpYWxpemluZyBwb29sIHdpdGggd29ya2VyczogbWluICR7cG9vbENvbmZpZy5taW5Xb3JrZXJzfSwgbWF4ICR7cG9vbENvbmZpZy5tYXhXb3JrZXJzfS5gXG4gICk7XG5cbiAgaWYgKHBvb2wpIHtcbiAgICByZXR1cm4gbG9nKFxuICAgICAgNCxcbiAgICAgICdbcG9vbF0gQWxyZWFkeSBpbml0aWFsaXplZCwgcGxlYXNlIGtpbGwgaXQgYmVmb3JlIGNyZWF0aW5nIGEgbmV3IG9uZS4nXG4gICAgKTtcbiAgfVxuXG4gIGlmIChwYXJzZUludChwb29sQ29uZmlnLm1pbldvcmtlcnMpID4gcGFyc2VJbnQocG9vbENvbmZpZy5tYXhXb3JrZXJzKSkge1xuICAgIHBvb2xDb25maWcubWluV29ya2VycyA9IHBvb2xDb25maWcubWF4V29ya2VycztcbiAgfVxuXG4gIHRyeSB7XG4gICAgLy8gQ3JlYXRlIGEgcG9vbCBhbG9uZyB3aXRoIGEgbWluaW1hbCBudW1iZXIgb2YgcmVzb3VyY2VzXG4gICAgcG9vbCA9IG5ldyBQb29sKHtcbiAgICAgIC8vIEdldCB0aGUgY3JlYXRlL3ZhbGlkYXRlL2Rlc3Ryb3kvbG9nIGZ1bmN0aW9uc1xuICAgICAgLi4uZmFjdG9yeSxcbiAgICAgIG1pbjogcGFyc2VJbnQocG9vbENvbmZpZy5taW5Xb3JrZXJzKSxcbiAgICAgIG1heDogcGFyc2VJbnQocG9vbENvbmZpZy5tYXhXb3JrZXJzKSxcbiAgICAgIGFjcXVpcmVUaW1lb3V0TWlsbGlzOiBwb29sQ29uZmlnLmFjcXVpcmVUaW1lb3V0LFxuICAgICAgY3JlYXRlVGltZW91dE1pbGxpczogcG9vbENvbmZpZy5jcmVhdGVUaW1lb3V0LFxuICAgICAgZGVzdHJveVRpbWVvdXRNaWxsaXM6IHBvb2xDb25maWcuZGVzdHJveVRpbWVvdXQsXG4gICAgICBpZGxlVGltZW91dE1pbGxpczogcG9vbENvbmZpZy5pZGxlVGltZW91dCxcbiAgICAgIGNyZWF0ZVJldHJ5SW50ZXJ2YWxNaWxsaXM6IHBvb2xDb25maWcuY3JlYXRlUmV0cnlJbnRlcnZhbCxcbiAgICAgIHJlYXBJbnRlcnZhbE1pbGxpczogcG9vbENvbmZpZy5yZWFwZXJJbnRlcnZhbCxcbiAgICAgIHByb3BhZ2F0ZUNyZWF0ZUVycm9yOiBmYWxzZVxuICAgIH0pO1xuXG4gICAgLy8gU2V0IGV2ZW50c1xuICAgIHBvb2wub24oJ3JlbGVhc2UnLCBhc3luYyAocmVzb3VyY2UpID0+IHtcbiAgICAgIC8vIENsZWFyIHBhZ2VcbiAgICAgIGNvbnN0IHIgPSBhd2FpdCBjbGVhclBhZ2UocmVzb3VyY2UucGFnZSwgZmFsc2UpO1xuICAgICAgbG9nKFxuICAgICAgICA0LFxuICAgICAgICBgW3Bvb2xdIFJlbGVhc2luZyBhIHdvcmtlciB3aXRoIElEICR7cmVzb3VyY2UuaWR9LiBDbGVhciBwYWdlIHN0YXR1czogJHtyfS5gXG4gICAgICApO1xuICAgIH0pO1xuXG4gICAgcG9vbC5vbignZGVzdHJveVN1Y2Nlc3MnLCAoZXZlbnRJZCwgcmVzb3VyY2UpID0+IHtcbiAgICAgIGxvZyg0LCBgW3Bvb2xdIERlc3Ryb3llZCBhIHdvcmtlciB3aXRoIElEICR7cmVzb3VyY2UuaWR9LmApO1xuICAgICAgcmVzb3VyY2UucGFnZSA9IG51bGw7XG4gICAgfSk7XG5cbiAgICBjb25zdCBpbml0aWFsUmVzb3VyY2VzID0gW107XG4gICAgLy8gQ3JlYXRlIGFuIGluaXRpYWwgbnVtYmVyIG9mIHJlc291cmNlc1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9vbENvbmZpZy5taW5Xb3JrZXJzOyBpKyspIHtcbiAgICAgIHRyeSB7XG4gICAgICAgIGNvbnN0IHJlc291cmNlID0gYXdhaXQgcG9vbC5hY3F1aXJlKCkucHJvbWlzZTtcbiAgICAgICAgaW5pdGlhbFJlc291cmNlcy5wdXNoKHJlc291cmNlKTtcbiAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGxvZ1dpdGhTdGFjaygyLCBlcnJvciwgJ1twb29sXSBDb3VsZCBub3QgY3JlYXRlIGFuIGluaXRpYWwgcmVzb3VyY2UuJyk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVsZWFzZSB0aGUgaW5pdGlhbCBudW1iZXIgb2YgcmVzb3VyY2VzIGJhY2sgdG8gdGhlIHBvb2xcbiAgICBpbml0aWFsUmVzb3VyY2VzLmZvckVhY2goKHJlc291cmNlKSA9PiB7XG4gICAgICBwb29sLnJlbGVhc2UocmVzb3VyY2UpO1xuICAgIH0pO1xuXG4gICAgbG9nKFxuICAgICAgMyxcbiAgICAgIGBbcG9vbF0gVGhlIHBvb2wgaXMgcmVhZHkke2luaXRpYWxSZXNvdXJjZXMubGVuZ3RoID8gYCB3aXRoICR7aW5pdGlhbFJlc291cmNlcy5sZW5ndGh9IGluaXRpYWwgcmVzb3VyY2VzIHdhaXRpbmcuYCA6ICcuJ31gXG4gICAgKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgRXhwb3J0RXJyb3IoXG4gICAgICAnW3Bvb2xdIENvdWxkIG5vdCBjcmVhdGUgdGhlIHBvb2wgb2Ygd29ya2Vycy4nXG4gICAgKS5zZXRFcnJvcihlcnJvcik7XG4gIH1cbn07XG5cbi8qKlxuICogS2lsbHMgYWxsIHdvcmtlcnMgaW4gdGhlIHBvb2wsIGRlc3Ryb3lzIHRoZSBwb29sLCBhbmQgY2xvc2VzIHRoZSBicm93c2VyXG4gKiBpbnN0YW5jZS5cbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gQSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgYWZ0ZXIgdGhlIHdvcmtlcnMgYXJlXG4gKiBraWxsZWQsIHRoZSBwb29sIGlzIGRlc3Ryb3llZCwgYW5kIHRoZSBicm93c2VyIGlzIGNsb3NlZC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGtpbGxQb29sKCkge1xuICBsb2coMywgJ1twb29sXSBLaWxsaW5nIHBvb2wgd2l0aCBhbGwgd29ya2VycyBhbmQgY2xvc2luZyBicm93c2VyLicpO1xuXG4gIC8vIElmIHN0aWxsIGFsaXZlLCBkZXN0cm95IHRoZSBwb29sIG9mIHBhZ2VzIGJlZm9yZSBjbG9zaW5nIGEgYnJvd3NlclxuICBpZiAocG9vbCkge1xuICAgIC8vIEZyZWUgdXAgbm90IHJlbGVhc2VkIHdvcmtlcnNcbiAgICBmb3IgKGNvbnN0IHdvcmtlciBvZiBwb29sLnVzZWQpIHtcbiAgICAgIHBvb2wucmVsZWFzZSh3b3JrZXIucmVzb3VyY2UpO1xuICAgIH1cblxuICAgIC8vIERlc3Ryb3kgdGhlIHBvb2wgaWYgaXQgaXMgc3RpbGwgYXZhaWxhYmxlXG4gICAgaWYgKCFwb29sLmRlc3Ryb3llZCkge1xuICAgICAgYXdhaXQgcG9vbC5kZXN0cm95KCk7XG4gICAgICBsb2coNCwgJ1ticm93c2VyXSBEZXN0cm95ZWQgdGhlIHBvb2wgb2YgcmVzb3VyY2VzLicpO1xuICAgIH1cbiAgfVxuXG4gIC8vIENsb3NlIHRoZSBicm93c2VyIGluc3RhbmNlXG4gIGF3YWl0IGNsb3NlQnJvd3NlcigpO1xufVxuXG4vKipcbiAqIFByb2Nlc3NlcyB0aGUgZXhwb3J0IHdvcmsgdXNpbmcgYSB3b3JrZXIgZnJvbSB0aGUgcG9vbC4gQWNxdWlyZXMgYSB3b3JrZXJcbiAqIGhhbmRsZSBmcm9tIHRoZSBwb29sLCBwZXJmb3JtcyB0aGUgZXhwb3J0IHVzaW5nIHB1cHBldGVlciwgYW5kIHJlbGVhc2VzXG4gKiB0aGUgd29ya2VyIGhhbmRsZSBiYWNrIHRvIHRoZSBwb29sLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBjaGFydCAtIFRoZSBjaGFydCBkYXRhIG9yIGNvbmZpZ3VyYXRpb24gdG8gYmUgZXhwb3J0ZWQuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIEV4cG9ydCBvcHRpb25zIGFuZCBjb25maWd1cmF0aW9uLlxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPE9iamVjdD59IEEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIGV4cG9ydCByZXN1bHRhbmRcbiAqIG9wdGlvbnMuXG4gKlxuICogQHRocm93cyB7RXhwb3J0RXJyb3J9IElmIGFuIGVycm9yIG9jY3VycyBkdXJpbmcgdGhlIGV4cG9ydCBwcm9jZXNzLlxuICovXG5leHBvcnQgY29uc3QgcG9zdFdvcmsgPSBhc3luYyAoY2hhcnQsIG9wdGlvbnMpID0+IHtcbiAgbGV0IHdvcmtlckhhbmRsZTtcblxuICB0cnkge1xuICAgIGxvZyg0LCAnW3Bvb2xdIFdvcmsgcmVjZWl2ZWQsIHN0YXJ0aW5nIHRvIHByb2Nlc3MuJyk7XG5cbiAgICArK3N0YXRzLmV4cG9ydEF0dGVtcHRzO1xuICAgIGlmIChwb29sQ29uZmlnLmJlbmNobWFya2luZykge1xuICAgICAgZ2V0UG9vbEluZm8oKTtcbiAgICB9XG5cbiAgICBpZiAoIXBvb2wpIHtcbiAgICAgIHRocm93IG5ldyBFeHBvcnRFcnJvcignV29yayByZWNlaXZlZCwgYnV0IHBvb2wgaGFzIG5vdCBiZWVuIHN0YXJ0ZWQuJyk7XG4gICAgfVxuXG4gICAgLy8gQWNxdWlyZSB0aGUgd29ya2VyIGFsb25nIHdpdGggdGhlIGlkIG9mIHJlc291cmNlIGFuZCB3b3JrIGNvdW50XG4gICAgY29uc3QgYWNxdWlyZUNvdW50ZXIgPSBtZWFzdXJlVGltZSgpO1xuICAgIHRyeSB7XG4gICAgICBsb2coNCwgJ1twb29sXSBBY3F1aXJpbmcgYSB3b3JrZXIgaGFuZGxlLicpO1xuICAgICAgd29ya2VySGFuZGxlID0gYXdhaXQgcG9vbC5hY3F1aXJlKCkucHJvbWlzZTtcblxuICAgICAgLy8gQ2hlY2sgdGhlIHBhZ2UgYWNxdWlyZSB0aW1lXG4gICAgICBpZiAob3B0aW9ucy5zZXJ2ZXIuYmVuY2htYXJraW5nKSB7XG4gICAgICAgIGxvZyhcbiAgICAgICAgICA1LFxuICAgICAgICAgIG9wdGlvbnMucGF5bG9hZD8ucmVxdWVzdElkXG4gICAgICAgICAgICA/IGBbYmVuY2htYXJrXSBSZXF1ZXN0IHdpdGggSUQgJHtvcHRpb25zLnBheWxvYWQ/LnJlcXVlc3RJZH0gLWBcbiAgICAgICAgICAgIDogJ1tiZW5jaG1hcmtdJyxcbiAgICAgICAgICBgQWNxdWlyZWQgYSB3b3JrZXIgaGFuZGxlOiAke2FjcXVpcmVDb3VudGVyKCl9bXMuYFxuICAgICAgICApO1xuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICB0aHJvdyBuZXcgRXhwb3J0RXJyb3IoXG4gICAgICAgIChvcHRpb25zLnBheWxvYWQ/LnJlcXVlc3RJZFxuICAgICAgICAgID8gYEZvciByZXF1ZXN0IHdpdGggSUQgJHtvcHRpb25zLnBheWxvYWQ/LnJlcXVlc3RJZH0gLSBgXG4gICAgICAgICAgOiAnJykgK1xuICAgICAgICAgIGBFcnJvciBlbmNvdW50ZXJlZCB3aGVuIGFjcXVpcmluZyBhbiBhdmFpbGFibGUgZW50cnk6ICR7YWNxdWlyZUNvdW50ZXIoKX1tcy5gXG4gICAgICApLnNldEVycm9yKGVycm9yKTtcbiAgICB9XG4gICAgbG9nKDQsICdbcG9vbF0gQWNxdWlyZWQgYSB3b3JrZXIgaGFuZGxlLicpO1xuXG4gICAgaWYgKCF3b3JrZXJIYW5kbGUucGFnZSkge1xuICAgICAgdGhyb3cgbmV3IEV4cG9ydEVycm9yKFxuICAgICAgICAnUmVzb2x2ZWQgd29ya2VyIHBhZ2UgaXMgaW52YWxpZDogdGhlIHBvb2wgc2V0dXAgaXMgd29ua3kuJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBTYXZlIHRoZSBzdGFydCB0aW1lXG4gICAgbGV0IHdvcmtTdGFydCA9IG5ldyBEYXRlKCkuZ2V0VGltZSgpO1xuXG4gICAgbG9nKDQsIGBbcG9vbF0gU3RhcnRpbmcgd29yayBvbiBwb29sIGVudHJ5IHdpdGggSUQgJHt3b3JrZXJIYW5kbGUuaWR9LmApO1xuXG4gICAgLy8gUGVyZm9ybSBhbiBleHBvcnQgb24gYSBwdXBwZXRlZXIgbGV2ZWxcbiAgICBjb25zdCBleHBvcnRDb3VudGVyID0gbWVhc3VyZVRpbWUoKTtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwdXBwZXRlZXJFeHBvcnQod29ya2VySGFuZGxlLnBhZ2UsIGNoYXJ0LCBvcHRpb25zKTtcblxuICAgIC8vIENoZWNrIGlmIGl0J3MgYW4gZXJyb3JcbiAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgIC8vIE5PVEU6IElmIHRoZXJlJ3MgYSByYXN0ZXJpemF0aW9uIHRpbWVvdXQsIHdlIHdhbnQgbmVlZCB0byBmbHVzaCB0aGUgcGFnZS5cbiAgICAgIC8vICAgICAgIFRoaXMgaXMgYmVjYXVzZSB0aGUgcGFnZSBtYXkgYmUgaW4gYSBzdGF0ZSB3aGVyZSBpdCdzIHdhaXRpbmcgZm9yXG4gICAgICAvLyAgICAgICB0aGUgc2NyZWVuc2hvdCB0byBmaW5pc2ggZXZlbiB0aG91Z2ggdGhlIHRpbWVvdXQgaGFzIG9jY3VyZWQuXG4gICAgICAvLyAgICAgICBXaGljaCBvZiBjb3Vyc2UgY2F1c2VzIGEgbG90IG9mIGlzc3VlcyB3aXRoIHRoZSBldmVudCBzeXN0ZW0sXG4gICAgICAvLyAgICAgICBhbmQgcGFnZSBjb25zaXN0ZW5jeS5cbiAgICAgIC8vXG4gICAgICAvLyBOT1RFOiBPbmx5IHBhZ2Uuc2NyZWVuc2hvdCB3aWxsIHRocm93IHRoaXMsIHRpbWVvdXRzIGZvciBQREYncyBhcmVcbiAgICAgIC8vICAgICAgIGhhbmRsZWQgYnkgdGhlIHBhZ2UucGRmIGZ1bmN0aW9uIGl0c2VsZi5cbiAgICAgIC8vXG4gICAgICAvLyAgICAgICAuLi55ZXMsIHRoaXMgaXMgdWdseS5cbiAgICAgIGlmIChyZXN1bHQubWVzc2FnZSA9PT0gJ1Jhc3Rlcml6YXRpb24gdGltZW91dCcpIHtcbiAgICAgICAgd29ya2VySGFuZGxlLndvcmtDb3VudCA9IHBvb2xDb25maWcud29ya0xpbWl0ICsgMTtcbiAgICAgICAgd29ya2VySGFuZGxlLnBhZ2UgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBpZiAoXG4gICAgICAgIHJlc3VsdC5uYW1lID09PSAnVGltZW91dEVycm9yJyB8fFxuICAgICAgICByZXN1bHQubWVzc2FnZSA9PT0gJ1Jhc3Rlcml6YXRpb24gdGltZW91dCdcbiAgICAgICkge1xuICAgICAgICB0aHJvdyBuZXcgRXhwb3J0RXJyb3IoXG4gICAgICAgICAgJ1Jhc3Rlcml6YXRpb24gdGltZW91dDogeW91ciBjaGFydCBtYXkgYmUgdG9vIGNvbXBsZXggb3IgbGFyZ2UsIGFuZCBmYWlsZWQgdG8gcmVuZGVyIHdpdGhpbiB0aGUgYWxsb3R0ZWQgdGltZS4nXG4gICAgICAgICkuc2V0RXJyb3IocmVzdWx0KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93IG5ldyBFeHBvcnRFcnJvcihcbiAgICAgICAgICAob3B0aW9ucy5wYXlsb2FkPy5yZXF1ZXN0SWRcbiAgICAgICAgICAgID8gYEZvciByZXF1ZXN0IHdpdGggSUQgJHtvcHRpb25zLnBheWxvYWQ/LnJlcXVlc3RJZH0gLSBgXG4gICAgICAgICAgICA6ICcnKSArIGBFcnJvciBlbmNvdW50ZXJlZCBkdXJpbmcgZXhwb3J0OiAke2V4cG9ydENvdW50ZXIoKX1tcy5gXG4gICAgICAgICkuc2V0RXJyb3IocmVzdWx0KTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVjayB0aGUgUHVwcGV0ZWVyIGV4cG9ydCB0aW1lXG4gICAgaWYgKG9wdGlvbnMuc2VydmVyLmJlbmNobWFya2luZykge1xuICAgICAgbG9nKFxuICAgICAgICA1LFxuICAgICAgICBvcHRpb25zLnBheWxvYWQ/LnJlcXVlc3RJZFxuICAgICAgICAgID8gYFtiZW5jaG1hcmtdIFJlcXVlc3Qgd2l0aCBJRCAke29wdGlvbnMucGF5bG9hZD8ucmVxdWVzdElkfSAtYFxuICAgICAgICAgIDogJ1tiZW5jaG1hcmtdJyxcbiAgICAgICAgYEV4cG9ydGVkIGEgY2hhcnQgc3VjZXNzZnVsbHk6ICR7ZXhwb3J0Q291bnRlcigpfW1zLmBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gUmVsZWFzZSB0aGUgcmVzb3VyY2UgYmFjayB0byB0aGUgcG9vbFxuICAgIHBvb2wucmVsZWFzZSh3b3JrZXJIYW5kbGUpO1xuXG4gICAgLy8gVXNlZCBmb3Igc3RhdGlzdGljcyBpbiBhdmVyYWdlVGltZSBhbmQgcHJvY2Vzc2VkV29ya0NvdW50LCB3aGljaFxuICAgIC8vIGluIHR1cm4gaXMgdXNlZCBieSB0aGUgL2hlYWx0aCByb3V0ZS5cbiAgICBjb25zdCB3b3JrRW5kID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG4gICAgY29uc3QgZXhwb3J0VGltZSA9IHdvcmtFbmQgLSB3b3JrU3RhcnQ7XG4gICAgc3RhdHMudGltZVNwZW50ICs9IGV4cG9ydFRpbWU7XG4gICAgc3RhdHMuc3BlbnRBdmVyYWdlID0gc3RhdHMudGltZVNwZW50IC8gKytzdGF0cy5wZXJmb3JtZWRFeHBvcnRzO1xuXG4gICAgbG9nKDQsIGBbcG9vbF0gV29yayBjb21wbGV0ZWQgaW4gJHtleHBvcnRUaW1lfSBtcy5gKTtcblxuICAgIC8vIE90aGVyd2lzZSByZXR1cm4gdGhlIHJlc3VsdFxuICAgIHJldHVybiB7XG4gICAgICByZXN1bHQsXG4gICAgICBvcHRpb25zXG4gICAgfTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICArK3N0YXRzLmRyb3BwZWRFeHBvcnRzO1xuXG4gICAgaWYgKHdvcmtlckhhbmRsZSkge1xuICAgICAgcG9vbC5yZWxlYXNlKHdvcmtlckhhbmRsZSk7XG4gICAgfVxuXG4gICAgdGhyb3cgbmV3IEV4cG9ydEVycm9yKGBbcG9vbF0gSW4gcG9vbC5wb3N0V29yazogJHtlcnJvci5tZXNzYWdlfWApLnNldEVycm9yKFxuICAgICAgZXJyb3JcbiAgICApO1xuICB9XG59O1xuXG4vKipcbiAqIFJldHJpZXZlcyB0aGUgY3VycmVudCBwb29sIGluc3RhbmNlLlxuICpcbiAqIEByZXR1cm5zIHtPYmplY3R8bnVsbH0gVGhlIGN1cnJlbnQgcG9vbCBpbnN0YW5jZSBpZiBpbml0aWFsaXplZCwgb3IgbnVsbFxuICogaWYgdGhlIHBvb2wgaGFzIG5vdCBiZWVuIGNyZWF0ZWQuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRQb29sID0gKCkgPT4gcG9vbDtcblxuLyoqXG4gKiBSZXRyaWV2ZXMgcG9vbCBpbmZvcm1hdGlvbiBpbiBKU09OIGZvcm1hdCwgaW5jbHVkaW5nIG1pbmltdW0gYW5kIG1heGltdW1cbiAqIHdvcmtlcnMsIGF2YWlsYWJsZSB3b3JrZXJzLCB3b3JrZXJzIGluIHVzZSwgYW5kIHBlbmRpbmcgYWNxdWlyZSByZXF1ZXN0cy5cbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBQb29sIGluZm9ybWF0aW9uIGluIEpTT04gZm9ybWF0LlxuICovXG5leHBvcnQgY29uc3QgZ2V0UG9vbEluZm9KU09OID0gKCkgPT4gKHtcbiAgbWluOiBwb29sLm1pbixcbiAgbWF4OiBwb29sLm1heCxcbiAgYWxsOiBwb29sLm51bUZyZWUoKSArIHBvb2wubnVtVXNlZCgpLFxuICBhdmFpbGFibGU6IHBvb2wubnVtRnJlZSgpLFxuICB1c2VkOiBwb29sLm51bVVzZWQoKSxcbiAgcGVuZGluZzogcG9vbC5udW1QZW5kaW5nQWNxdWlyZXMoKVxufSk7XG5cbi8qKlxuICogTG9ncyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcG9vbCwgaW5jbHVkaW5nIHRoZSBtaW5pbXVtXG4gKiBhbmQgbWF4aW11bSB3b3JrZXJzLCBhdmFpbGFibGUgd29ya2Vycywgd29ya2VycyBpbiB1c2UsIGFuZCBwZW5kaW5nIGFjcXVpcmVcbiAqIHJlcXVlc3RzLlxuICovXG5leHBvcnQgZnVuY3Rpb24gZ2V0UG9vbEluZm8oKSB7XG4gIGNvbnN0IHsgbWluLCBtYXgsIGFsbCwgYXZhaWxhYmxlLCB1c2VkLCBwZW5kaW5nIH0gPSBnZXRQb29sSW5mb0pTT04oKTtcblxuICBsb2coNSwgYFtwb29sXSBUaGUgbWluaW11bSBudW1iZXIgb2YgcmVzb3VyY2VzIGFsbG93ZWQgYnkgcG9vbDogJHttaW59LmApO1xuICBsb2coNSwgYFtwb29sXSBUaGUgbWF4aW11bSBudW1iZXIgb2YgcmVzb3VyY2VzIGFsbG93ZWQgYnkgcG9vbDogJHttYXh9LmApO1xuICBsb2coNSwgYFtwb29sXSBUaGUgbnVtYmVyIG9mIGFsbCBjcmVhdGVkIHJlc291cmNlczogJHthbGx9LmApO1xuICBsb2coNSwgYFtwb29sXSBUaGUgbnVtYmVyIG9mIGF2YWlsYWJsZSByZXNvdXJjZXM6ICR7YXZhaWxhYmxlfS5gKTtcbiAgbG9nKDUsIGBbcG9vbF0gVGhlIG51bWJlciBvZiBhY3F1aXJlZCByZXNvdXJjZXM6ICR7dXNlZH0uYCk7XG4gIGxvZyg1LCBgW3Bvb2xdIFRoZSBudW1iZXIgb2YgcmVzb3VyY2VzIHdhaXRpbmcgdG8gYmUgYWNxdWlyZWQ6ICR7cGVuZGluZ30uYCk7XG59XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgaW5pdFBvb2wsXG4gIGtpbGxQb29sLFxuICBwb3N0V29yayxcbiAgZ2V0UG9vbCxcbiAgZ2V0UG9vbEluZm8sXG4gIGdldFBvb2xJbmZvSlNPTixcbiAgZ2V0U3RhdHM6ICgpID0+IHN0YXRzXG59O1xuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuSGlnaGNoYXJ0cyBFeHBvcnQgU2VydmVyXG5cbkNvcHlyaWdodCAoYykgMjAxNi0yMDI0LCBIaWdoc29mdFxuXG5MaWNlbmNlZCB1bmRlciB0aGUgTUlUIGxpY2VuY2UuXG5cbkFkZGl0aW9uYWxseSBhIHZhbGlkIEhpZ2hjaGFydHMgbGljZW5zZSBpcyByZXF1aXJlZCBmb3IgdXNlLlxuXG5TZWUgTElDRU5TRSBmaWxlIGluIHJvb3QgZm9yIGRldGFpbHMuXG5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCB7IHJlYWRGaWxlU3luYywgd3JpdGVGaWxlU3luYyB9IGZyb20gJ2ZzJztcblxuaW1wb3J0IHsgZ2V0T3B0aW9ucywgaW5pdEV4cG9ydFNldHRpbmdzIH0gZnJvbSAnLi9jb25maWcuanMnO1xuaW1wb3J0IHsgbG9nLCBsb2dXaXRoU3RhY2sgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBraWxsUG9vbCwgcG9zdFdvcmssIHN0YXRzIH0gZnJvbSAnLi9wb29sLmpzJztcbmltcG9ydCB7XG4gIGZpeFR5cGUsXG4gIGhhbmRsZVJlc291cmNlcyxcbiAgaXNDb3JyZWN0SlNPTixcbiAgb3B0aW9uc1N0cmluZ2lmeSxcbiAgcm91bmROdW1iZXIsXG4gIHRvQm9vbGVhbixcbiAgd3JhcEFyb3VuZFxufSBmcm9tICcuL3V0aWxzLmpzJztcbmltcG9ydCB7IHNhbml0aXplIH0gZnJvbSAnLi9zYW5pdGl6ZS5qcyc7XG5pbXBvcnQgRXhwb3J0RXJyb3IgZnJvbSAnLi9lcnJvcnMvRXhwb3J0RXJyb3IuanMnO1xuXG5sZXQgYWxsb3dDb2RlRXhlY3V0aW9uID0gZmFsc2U7XG5cbi8qKlxuICogU3RhcnRzIGFuIGV4cG9ydCBwcm9jZXNzLiBUaGUgYHNldHRpbmdzYCBjb250YWlucyBmaW5hbCBvcHRpb25zIGdhdGhlcmVkXG4gKiBmcm9tIGFsbCBwb3NzaWJsZSBzb3VyY2VzIChjb25maWcsIGVudiwgY2xpLCBqc29uKS4gVGhlIGBlbmRDYWxsYmFja2AgaXNcbiAqIGNhbGxlZCB3aGVuIHRoZSBleHBvcnQgaXMgY29tcGxldGVkLCB3aXRoIGFuIGVycm9yIG9iamVjdCBhcyB0aGUgZmlyc3RcbiAqIGFyZ3VtZW50IGFuZCB0aGUgc2Vjb25kIGNvbnRhaW5pbmcgdGhlIGJhc2U2NCByZXNwcmVzZW50YXRpb24gb2YgYSBjaGFydC5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gc2V0dGluZ3MgLSBUaGUgc2V0dGluZ3Mgb2JqZWN0IGNvbnRhaW5pbmcgZXhwb3J0XG4gKiBjb25maWd1cmF0aW9uLlxuICogQHBhcmFtIHtmdW5jdGlvbn0gZW5kQ2FsbGJhY2sgLSBUaGUgY2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgaW52b2tlZCB1cG9uXG4gKiBmaW5hbGl6aW5nIHdvcmsgb3IgdXBvbiBlcnJvciBvY2N1cmFuY2Ugb2YgdGhlIGV4cG9ydGluZyBwcm9jZXNzLlxuICpcbiAqIEByZXR1cm5zIHt2b2lkfSBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IHJldHVybiBhIHZhbHVlIGRpcmVjdGx5OyBpbnN0ZWFkLFxuICogaXQgY29tbXVuaWNhdGVzIHJlc3VsdHMgdmlhIHRoZSBlbmRDYWxsYmFjay5cbiAqL1xuZXhwb3J0IGNvbnN0IHN0YXJ0RXhwb3J0ID0gYXN5bmMgKHNldHRpbmdzLCBlbmRDYWxsYmFjaykgPT4ge1xuICAvLyBTdGFydGluZyBleHBvcnRpbmcgcHJvY2VzcyBtZXNzYWdlXG4gIGxvZyg0LCAnW2NoYXJ0XSBTdGFydGluZyB0aGUgZXhwb3J0aW5nIHByb2Nlc3MuJyk7XG5cbiAgLy8gSW5pdGlhbGl6ZSBvcHRpb25zXG4gIGNvbnN0IG9wdGlvbnMgPSBpbml0RXhwb3J0U2V0dGluZ3Moc2V0dGluZ3MsIGdldE9wdGlvbnMoKSk7XG5cbiAgLy8gR2V0IHRoZSBleHBvcnQgb3B0aW9uc1xuICBjb25zdCBleHBvcnRPcHRpb25zID0gb3B0aW9ucy5leHBvcnQ7XG5cbiAgLy8gSWYgU1ZHIGlzIGFuIGlucHV0IChhcmd1bWVudCBjYW4gYmUgc2VudCBvbmx5IGJ5IHRoZSByZXF1ZXN0KVxuICBpZiAob3B0aW9ucy5wYXlsb2FkPy5zdmcgJiYgb3B0aW9ucy5wYXlsb2FkLnN2ZyAhPT0gJycpIHtcbiAgICB0cnkge1xuICAgICAgbG9nKDQsICdbY2hhcnRdIEF0dGVtcHRpbmcgdG8gZXhwb3J0IGZyb20gYSBTVkcgaW5wdXQuJyk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IGV4cG9ydEFzU3RyaW5nKFxuICAgICAgICBzYW5pdGl6ZShvcHRpb25zLnBheWxvYWQuc3ZnKSwgLy8gIzIwOVxuICAgICAgICBvcHRpb25zLFxuICAgICAgICBlbmRDYWxsYmFja1xuICAgICAgKTtcblxuICAgICAgKytzdGF0cy5leHBvcnRGcm9tU3ZnQXR0ZW1wdHM7XG4gICAgICByZXR1cm4gcmVzdWx0O1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gZW5kQ2FsbGJhY2soXG4gICAgICAgIG5ldyBFeHBvcnRFcnJvcignW2NoYXJ0XSBFcnJvciBsb2FkaW5nIFNWRyBpbnB1dC4nKS5zZXRFcnJvcihlcnJvcilcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgLy8gRXhwb3J0IHVzaW5nIG9wdGlvbnMgZnJvbSB0aGUgZmlsZVxuICBpZiAoZXhwb3J0T3B0aW9ucy5pbmZpbGUgJiYgZXhwb3J0T3B0aW9ucy5pbmZpbGUubGVuZ3RoKSB7XG4gICAgLy8gVHJ5IHRvIHJlYWQgdGhlIGZpbGUgdG8gZ2V0IHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb25cbiAgICB0cnkge1xuICAgICAgbG9nKDQsICdbY2hhcnRdIEF0dGVtcHRpbmcgdG8gZXhwb3J0IGZyb20gYW4gaW5wdXQgZmlsZS4nKTtcbiAgICAgIG9wdGlvbnMuZXhwb3J0Lmluc3RyID0gcmVhZEZpbGVTeW5jKGV4cG9ydE9wdGlvbnMuaW5maWxlLCAndXRmOCcpO1xuICAgICAgcmV0dXJuIGV4cG9ydEFzU3RyaW5nKG9wdGlvbnMuZXhwb3J0Lmluc3RyLnRyaW0oKSwgb3B0aW9ucywgZW5kQ2FsbGJhY2spO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICByZXR1cm4gZW5kQ2FsbGJhY2soXG4gICAgICAgIG5ldyBFeHBvcnRFcnJvcignW2NoYXJ0XSBFcnJvciBsb2FkaW5nIGlucHV0IGZpbGUuJykuc2V0RXJyb3IoZXJyb3IpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIEV4cG9ydCB3aXRoIG9wdGlvbnMgZnJvbSB0aGUgcmF3IHJlcHJlc2VudGF0aW9uXG4gIGlmIChcbiAgICAoZXhwb3J0T3B0aW9ucy5pbnN0ciAmJiBleHBvcnRPcHRpb25zLmluc3RyICE9PSAnJykgfHxcbiAgICAoZXhwb3J0T3B0aW9ucy5vcHRpb25zICYmIGV4cG9ydE9wdGlvbnMub3B0aW9ucyAhPT0gJycpXG4gICkge1xuICAgIHRyeSB7XG4gICAgICBsb2coNCwgJ1tjaGFydF0gQXR0ZW1wdGluZyB0byBleHBvcnQgZnJvbSBhIHJhdyBpbnB1dC4nKTtcblxuICAgICAgLy8gUGVyZm9ybSBhIGRpcmVjdCBpbmplY3Qgd2hlbiBmb3JjZWRcbiAgICAgIGlmICh0b0Jvb2xlYW4ob3B0aW9ucy5jdXN0b21Mb2dpYz8uYWxsb3dDb2RlRXhlY3V0aW9uKSkge1xuICAgICAgICByZXR1cm4gZG9TdHJhaWdodEluamVjdChvcHRpb25zLCBlbmRDYWxsYmFjayk7XG4gICAgICB9XG5cbiAgICAgIC8vIEVpdGhlciB0cnkgdG8gcGFyc2UgdG8gSlNPTiBmaXJzdCBvciBkbyB0aGUgZGlyZWN0IGV4cG9ydFxuICAgICAgcmV0dXJuIHR5cGVvZiBleHBvcnRPcHRpb25zLmluc3RyID09PSAnc3RyaW5nJ1xuICAgICAgICA/IGV4cG9ydEFzU3RyaW5nKGV4cG9ydE9wdGlvbnMuaW5zdHIudHJpbSgpLCBvcHRpb25zLCBlbmRDYWxsYmFjaylcbiAgICAgICAgOiBkb0V4cG9ydChcbiAgICAgICAgICAgIG9wdGlvbnMsXG4gICAgICAgICAgICBleHBvcnRPcHRpb25zLmluc3RyIHx8IGV4cG9ydE9wdGlvbnMub3B0aW9ucyxcbiAgICAgICAgICAgIGVuZENhbGxiYWNrXG4gICAgICAgICAgKTtcbiAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgcmV0dXJuIGVuZENhbGxiYWNrKFxuICAgICAgICBuZXcgRXhwb3J0RXJyb3IoJ1tjaGFydF0gRXJyb3IgbG9hZGluZyByYXcgaW5wdXQuJykuc2V0RXJyb3IoZXJyb3IpXG4gICAgICApO1xuICAgIH1cbiAgfVxuXG4gIC8vIE5vIGlucHV0IHNwZWNpZmllZCwgcGFzcyBhbiBlcnJvciBtZXNzYWdlIHRvIHRoZSBjYWxsYmFja1xuICByZXR1cm4gZW5kQ2FsbGJhY2soXG4gICAgbmV3IEV4cG9ydEVycm9yKFxuICAgICAgYFtjaGFydF0gTm8gdmFsaWQgaW5wdXQgc3BlY2lmaWVkLiBDaGVjayBpZiBhdCBsZWFzdCBvbmUgb2YgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIGlzIGNvcnJlY3RseSBzZXQ6ICdpbmZpbGUnLCAnaW5zdHInLCAnb3B0aW9ucycsIG9yICdzdmcnLmBcbiAgICApXG4gICk7XG59O1xuXG4vKipcbiAqIFN0YXJ0cyBhIGJhdGNoIGV4cG9ydCBwcm9jZXNzIGZvciBtdWx0aXBsZSBjaGFydHMgYmFzZWQgb24gdGhlIGluZm9ybWF0aW9uXG4gKiBpbiB0aGUgYmF0Y2ggb3B0aW9uLiBUaGUgYmF0Y2ggaXMgYSBzdHJpbmcgaW4gdGhlIGZvbGxvd2luZyBmb3JtYXQ6XG4gKiBcImluZmlsZTEuanNvbj1vdXRmaWxlMS5wbmc7aW5maWxlMi5qc29uPW91dGZpbGUyLnBuZzsuLi5cIlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgb2JqZWN0IGNvbnRhaW5pbmcgY29uZmlndXJhdGlvbiBmb3JcbiAqIGEgYmF0Y2ggZXhwb3J0LlxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBiYXRjaCBleHBvcnRcbiAqIHByb2Nlc3MgaXMgY29tcGxldGVkLlxuICpcbiAqIEB0aHJvd3Mge0V4cG9ydEVycm9yfSBUaHJvd3MgYW4gRXhwb3J0RXJyb3IgaWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZ1xuICogYW55IG9mIHRoZSBiYXRjaCBleHBvcnQgcHJvY2Vzcy5cbiAqL1xuZXhwb3J0IGNvbnN0IGJhdGNoRXhwb3J0ID0gYXN5bmMgKG9wdGlvbnMpID0+IHtcbiAgY29uc3QgYmF0Y2hGdW5jdGlvbnMgPSBbXTtcblxuICAvLyBTcGxpdCBhbmQgcGFpciB0aGUgLS1iYXRjaCBhcmd1bWVudHNcbiAgZm9yIChsZXQgcGFpciBvZiBvcHRpb25zLmV4cG9ydC5iYXRjaC5zcGxpdCgnOycpKSB7XG4gICAgcGFpciA9IHBhaXIuc3BsaXQoJz0nKTtcbiAgICBpZiAocGFpci5sZW5ndGggPT09IDIpIHtcbiAgICAgIGJhdGNoRnVuY3Rpb25zLnB1c2goXG4gICAgICAgIHN0YXJ0RXhwb3J0KFxuICAgICAgICAgIHtcbiAgICAgICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgICAgICBleHBvcnQ6IHtcbiAgICAgICAgICAgICAgLi4ub3B0aW9ucy5leHBvcnQsXG4gICAgICAgICAgICAgIGluZmlsZTogcGFpclswXSxcbiAgICAgICAgICAgICAgb3V0ZmlsZTogcGFpclsxXVxuICAgICAgICAgICAgfVxuICAgICAgICAgIH0sXG4gICAgICAgICAgKGVycm9yLCBpbmZvKSA9PiB7XG4gICAgICAgICAgICAvLyBUaHJvdyBhbiBlcnJvclxuICAgICAgICAgICAgaWYgKGVycm9yKSB7XG4gICAgICAgICAgICAgIHRocm93IGVycm9yO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTYXZlIHRoZSBiYXNlNjQgZnJvbSBhIGJ1ZmZlciB0byBhIGNvcnJlY3QgaW1hZ2UgZmlsZVxuICAgICAgICAgICAgd3JpdGVGaWxlU3luYyhcbiAgICAgICAgICAgICAgaW5mby5vcHRpb25zLmV4cG9ydC5vdXRmaWxlLFxuICAgICAgICAgICAgICBpbmZvLm9wdGlvbnMuZXhwb3J0LnR5cGUgIT09ICdzdmcnXG4gICAgICAgICAgICAgICAgPyBCdWZmZXIuZnJvbShpbmZvLnJlc3VsdCwgJ2Jhc2U2NCcpXG4gICAgICAgICAgICAgICAgOiBpbmZvLnJlc3VsdFxuICAgICAgICAgICAgKTtcbiAgICAgICAgICB9XG4gICAgICAgIClcbiAgICAgICk7XG4gICAgfVxuICB9XG5cbiAgdHJ5IHtcbiAgICAvLyBBd2FpdCBhbGwgZXhwb3J0cyBhcmUgZG9uZVxuICAgIGF3YWl0IFByb21pc2UuYWxsKGJhdGNoRnVuY3Rpb25zKTtcblxuICAgIC8vIEtpbGwgcG9vbCBhbmQgY2xvc2UgYnJvd3NlciBhZnRlciBmaW5pc2hpbmcgYmF0Y2ggZXhwb3J0XG4gICAgYXdhaXQga2lsbFBvb2woKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICB0aHJvdyBuZXcgRXhwb3J0RXJyb3IoXG4gICAgICAnW2NoYXJ0XSBFcnJvciBlbmNvdW50ZXJlZCBkdXJpbmcgYmF0Y2ggZXhwb3J0LidcbiAgICApLnNldEVycm9yKGVycm9yKTtcbiAgfVxufTtcblxuLyoqXG4gKiBTdGFydHMgYSBzaW5nbGUgZXhwb3J0IHByb2Nlc3MgYmFzZWQgb24gdGhlIHNwZWNpZmllZCBvcHRpb25zLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gVGhlIG9wdGlvbnMgb2JqZWN0IGNvbnRhaW5pbmcgY29uZmlndXJhdGlvbiBmb3JcbiAqIGEgc2luZ2xlIGV4cG9ydC5cbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gQSBQcm9taXNlIHRoYXQgcmVzb2x2ZXMgb25jZSB0aGUgc2luZ2xlIGV4cG9ydFxuICogcHJvY2VzcyBpcyBjb21wbGV0ZWQuXG4gKlxuICogQHRocm93cyB7RXhwb3J0RXJyb3J9IFRocm93cyBhbiBFeHBvcnRFcnJvciBpZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nXG4gKiB0aGUgc2luZ2xlIGV4cG9ydCBwcm9jZXNzLlxuICovXG5leHBvcnQgY29uc3Qgc2luZ2xlRXhwb3J0ID0gYXN5bmMgKG9wdGlvbnMpID0+IHtcbiAgLy8gVXNlIGluc3RyIG9yIGl0cyBhbGlhcywgb3B0aW9uc1xuICBvcHRpb25zLmV4cG9ydC5pbnN0ciA9IG9wdGlvbnMuZXhwb3J0Lmluc3RyIHx8IG9wdGlvbnMuZXhwb3J0Lm9wdGlvbnM7XG5cbiAgLy8gUGVyZm9ybSBhbiBleHBvcnRcbiAgYXdhaXQgc3RhcnRFeHBvcnQob3B0aW9ucywgYXN5bmMgKGVycm9yLCBpbmZvKSA9PiB7XG4gICAgLy8gRXhpdCBwcm9jZXNzIHdoZW4gZXJyb3JcbiAgICBpZiAoZXJyb3IpIHtcbiAgICAgIHRocm93IGVycm9yO1xuICAgIH1cblxuICAgIGNvbnN0IHsgb3V0ZmlsZSwgdHlwZSB9ID0gaW5mby5vcHRpb25zLmV4cG9ydDtcblxuICAgIC8vIFNhdmUgdGhlIGJhc2U2NCBmcm9tIGEgYnVmZmVyIHRvIGEgY29ycmVjdCBpbWFnZSBmaWxlXG4gICAgd3JpdGVGaWxlU3luYyhcbiAgICAgIG91dGZpbGUgfHwgYGNoYXJ0LiR7dHlwZX1gLFxuICAgICAgdHlwZSAhPT0gJ3N2ZycgPyBCdWZmZXIuZnJvbShpbmZvLnJlc3VsdCwgJ2Jhc2U2NCcpIDogaW5mby5yZXN1bHRcbiAgICApO1xuXG4gICAgLy8gS2lsbCBwb29sIGFuZCBjbG9zZSBicm93c2VyIGFmdGVyIGZpbmlzaGluZyBzaW5nbGUgZXhwb3J0XG4gICAgYXdhaXQga2lsbFBvb2woKTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIERldGVybWluZXMgdGhlIHNpemUgYW5kIHNjYWxlIGZvciBjaGFydCBleHBvcnQgYmFzZWQgb24gdGhlIHByb3ZpZGVkIG9wdGlvbnMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBvYmplY3QgY29udGFpbmluZyBjb25maWd1cmF0aW9uIGZvclxuICogY2hhcnQgZXhwb3J0LlxuICpcbiAqIEByZXR1cm5zIHtPYmplY3R9IEFuIG9iamVjdCBjb250YWluaW5nIHRoZSBjYWxjdWxhdGVkIGhlaWdodCwgd2lkdGgsXG4gKiBhbmQgc2NhbGUgZm9yIHRoZSBjaGFydCBleHBvcnQuXG4gKi9cbmV4cG9ydCBjb25zdCBmaW5kQ2hhcnRTaXplID0gKG9wdGlvbnMpID0+IHtcbiAgY29uc3QgeyBjaGFydCwgZXhwb3J0aW5nIH0gPVxuICAgIG9wdGlvbnMuZXhwb3J0Py5vcHRpb25zIHx8IGlzQ29ycmVjdEpTT04ob3B0aW9ucy5leHBvcnQ/Lmluc3RyKTtcblxuICAvLyBTZWUgaWYgZ2xvYmFsT3B0aW9ucyBob2xkcyBjaGFydCBvciBleHBvcnRpbmcgc2l6ZVxuICBjb25zdCBnbG9iYWxPcHRpb25zID0gaXNDb3JyZWN0SlNPTihvcHRpb25zLmV4cG9ydD8uZ2xvYmFsT3B0aW9ucyk7XG5cbiAgLy8gU2VjdXJlIHNjYWxlIHZhbHVlXG4gIGxldCBzY2FsZSA9XG4gICAgb3B0aW9ucy5leHBvcnQ/LnNjYWxlIHx8XG4gICAgZXhwb3J0aW5nPy5zY2FsZSB8fFxuICAgIGdsb2JhbE9wdGlvbnM/LmV4cG9ydGluZz8uc2NhbGUgfHxcbiAgICBvcHRpb25zLmV4cG9ydD8uZGVmYXVsdFNjYWxlIHx8XG4gICAgMTtcblxuICAvLyB0aGUgc2NhbGUgY2Fubm90IGJlIGxvd2VyIHRoYW4gMC4xIGFuZCBjYW5ub3QgYmUgaGlnaGVyIHRoYW4gNS4wXG4gIHNjYWxlID0gTWF0aC5tYXgoMC4xLCBNYXRoLm1pbihzY2FsZSwgNS4wKSk7XG5cbiAgLy8gd2Ugd2FudCB0byByb3VuZCB0aGUgbnVtYmVycyBsaWtlIDAuMjMyMzQgLT4gMC4yM1xuICBzY2FsZSA9IHJvdW5kTnVtYmVyKHNjYWxlLCAyKTtcblxuICAvLyBGaW5kIGNoYXJ0IHNpemUgYW5kIHNjYWxlXG4gIGNvbnN0IHNpemUgPSB7XG4gICAgaGVpZ2h0OlxuICAgICAgb3B0aW9ucy5leHBvcnQ/LmhlaWdodCB8fFxuICAgICAgZXhwb3J0aW5nPy5zb3VyY2VIZWlnaHQgfHxcbiAgICAgIGNoYXJ0Py5oZWlnaHQgfHxcbiAgICAgIGdsb2JhbE9wdGlvbnM/LmV4cG9ydGluZz8uc291cmNlSGVpZ2h0IHx8XG4gICAgICBnbG9iYWxPcHRpb25zPy5jaGFydD8uaGVpZ2h0IHx8XG4gICAgICBvcHRpb25zLmV4cG9ydD8uZGVmYXVsdEhlaWdodCB8fFxuICAgICAgNDAwLFxuICAgIHdpZHRoOlxuICAgICAgb3B0aW9ucy5leHBvcnQ/LndpZHRoIHx8XG4gICAgICBleHBvcnRpbmc/LnNvdXJjZVdpZHRoIHx8XG4gICAgICBjaGFydD8ud2lkdGggfHxcbiAgICAgIGdsb2JhbE9wdGlvbnM/LmV4cG9ydGluZz8uc291cmNlV2lkdGggfHxcbiAgICAgIGdsb2JhbE9wdGlvbnM/LmNoYXJ0Py53aWR0aCB8fFxuICAgICAgb3B0aW9ucy5leHBvcnQ/LmRlZmF1bHRXaWR0aCB8fFxuICAgICAgNjAwLFxuICAgIHNjYWxlXG4gIH07XG5cbiAgLy8gR2V0IHJpZCBvZiBwb3RlbnRpYWwgcHggYW5kICVcbiAgZm9yIChsZXQgW3BhcmFtLCB2YWx1ZV0gb2YgT2JqZWN0LmVudHJpZXMoc2l6ZSkpIHtcbiAgICBzaXplW3BhcmFtXSA9XG4gICAgICB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnID8gK3ZhbHVlLnJlcGxhY2UoL3B4fCUvZ2ksICcnKSA6IHZhbHVlO1xuICB9XG4gIHJldHVybiBzaXplO1xufTtcblxuLyoqXG4gKiBGdW5jdGlvbiBmb3IgZmluYWxpemluZyBvcHRpb25zIGJlZm9yZSBleHBvcnQuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBUaGUgb3B0aW9ucyBvYmplY3QgY29udGFpbmluZyBjb25maWd1cmF0aW9uIGZvclxuICogdGhlIGV4cG9ydCBwcm9jZXNzLlxuICogQHBhcmFtIHtPYmplY3R9IGNoYXJ0SnNvbiAtIFRoZSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjaGFydC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGVuZENhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB1cG9uXG4gKiBjb21wbGV0aW9uIG9yIGVycm9yLlxuICogQHBhcmFtIHtzdHJpbmd9IHN2ZyAtIFRoZSBTVkcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGNoYXJ0LlxuICpcbiAqIEByZXR1cm5zIHtQcm9taXNlPHZvaWQ+fSBBIFByb21pc2UgdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBleHBvcnQgcHJvY2Vzc1xuICogaXMgY29tcGxldGVkLlxuICovXG5jb25zdCBkb0V4cG9ydCA9IGFzeW5jIChvcHRpb25zLCBjaGFydEpzb24sIGVuZENhbGxiYWNrLCBzdmcpID0+IHtcbiAgbGV0IHsgZXhwb3J0OiBleHBvcnRPcHRpb25zLCBjdXN0b21Mb2dpYzogY3VzdG9tTG9naWNPcHRpb25zIH0gPSBvcHRpb25zO1xuXG4gIGNvbnN0IGFsbG93Q29kZUV4ZWN1dGlvblNjb3BlZCA9XG4gICAgdHlwZW9mIGN1c3RvbUxvZ2ljT3B0aW9ucy5hbGxvd0NvZGVFeGVjdXRpb24gPT09ICdib29sZWFuJ1xuICAgICAgPyBjdXN0b21Mb2dpY09wdGlvbnMuYWxsb3dDb2RlRXhlY3V0aW9uXG4gICAgICA6IGFsbG93Q29kZUV4ZWN1dGlvbjtcblxuICBpZiAoIWN1c3RvbUxvZ2ljT3B0aW9ucykge1xuICAgIGN1c3RvbUxvZ2ljT3B0aW9ucyA9IG9wdGlvbnMuY3VzdG9tTG9naWMgPSB7fTtcbiAgfSBlbHNlIGlmIChhbGxvd0NvZGVFeGVjdXRpb25TY29wZWQpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMuY3VzdG9tTG9naWMucmVzb3VyY2VzID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gUHJvY2VzcyByZXNvdXJjZXNcbiAgICAgIG9wdGlvbnMuY3VzdG9tTG9naWMucmVzb3VyY2VzID0gaGFuZGxlUmVzb3VyY2VzKFxuICAgICAgICBvcHRpb25zLmN1c3RvbUxvZ2ljLnJlc291cmNlcyxcbiAgICAgICAgdG9Cb29sZWFuKG9wdGlvbnMuY3VzdG9tTG9naWMuYWxsb3dGaWxlUmVzb3VyY2VzKVxuICAgICAgKTtcbiAgICB9IGVsc2UgaWYgKCFvcHRpb25zLmN1c3RvbUxvZ2ljLnJlc291cmNlcykge1xuICAgICAgdHJ5IHtcbiAgICAgICAgY29uc3QgcmVzb3VyY2VzID0gcmVhZEZpbGVTeW5jKCdyZXNvdXJjZXMuanNvbicsICd1dGY4Jyk7XG4gICAgICAgIG9wdGlvbnMuY3VzdG9tTG9naWMucmVzb3VyY2VzID0gaGFuZGxlUmVzb3VyY2VzKFxuICAgICAgICAgIHJlc291cmNlcyxcbiAgICAgICAgICB0b0Jvb2xlYW4ob3B0aW9ucy5jdXN0b21Mb2dpYy5hbGxvd0ZpbGVSZXNvdXJjZXMpXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsb2dXaXRoU3RhY2soXG4gICAgICAgICAgMixcbiAgICAgICAgICBlcnJvcixcbiAgICAgICAgICBgW2NoYXJ0XSBVbmFibGUgdG8gbG9hZCB0aGUgZGVmYXVsdCByZXNvdXJjZXMuanNvbiBmaWxlLmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAvLyBJZiB0aGUgYWxsb3dDb2RlRXhlY3V0aW9uIGZsYWcgaXNuJ3Qgc2V0LCB3ZSBzaG91bGQgcmVmdXNlIHRoZSB1c2FnZVxuICAvLyBvZiBjYWxsYmFjaywgcmVzb3VyY2VzLCBhbmQgY3VzdG9tIGNvZGUuIEFkZGl0aW9uYWxseSwgdGhlIHdvcmtlciB3aWxsXG4gIC8vIHJlZnVzZSB0byBydW4gYXJiaXRyYXJ5IEphdmFTY3JpcHQuIFByaW9yaXRpemVkIHNob3VsZCBiZSB0aGUgc2NvcGVkXG4gIC8vIG9wdGlvbiwgdGhlbiB3ZSBzaG91bGQgdGFrZSBhIGxvb2sgYXQgdGhlIG92ZXJhbGwgcG9vbCBvcHRpb24uXG4gIGlmICghYWxsb3dDb2RlRXhlY3V0aW9uU2NvcGVkICYmIGN1c3RvbUxvZ2ljT3B0aW9ucykge1xuICAgIGlmIChcbiAgICAgIGN1c3RvbUxvZ2ljT3B0aW9ucy5jYWxsYmFjayB8fFxuICAgICAgY3VzdG9tTG9naWNPcHRpb25zLnJlc291cmNlcyB8fFxuICAgICAgY3VzdG9tTG9naWNPcHRpb25zLmN1c3RvbUNvZGVcbiAgICApIHtcbiAgICAgIC8vIFNlbmQgYmFjayBhIGZyaWVuZGx5IG1lc3NhZ2Ugc2F5aW5nIHRoYXQgdGhlIGV4cG9ydGVyIGRvZXMgbm90IHN1cHBvcnRcbiAgICAgIC8vIHRoZXNlIHNldHRpbmdzLlxuICAgICAgcmV0dXJuIGVuZENhbGxiYWNrKFxuICAgICAgICBuZXcgRXhwb3J0RXJyb3IoXG4gICAgICAgICAgYFtjaGFydF0gVGhlICdjYWxsYmFjaycsICdyZXNvdXJjZXMnIGFuZCAnY3VzdG9tQ29kZScgb3B0aW9ucyBoYXZlIGJlZW4gZGlzYWJsZWQgZm9yIHRoaXMgc2VydmVyLmBcbiAgICAgICAgKVxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBSZXNldCBhbGwgYWRkaXRpb25hbCBjdXN0b20gY29kZVxuICAgIGN1c3RvbUxvZ2ljT3B0aW9ucy5jYWxsYmFjayA9IGZhbHNlO1xuICAgIGN1c3RvbUxvZ2ljT3B0aW9ucy5yZXNvdXJjZXMgPSBmYWxzZTtcbiAgICBjdXN0b21Mb2dpY09wdGlvbnMuY3VzdG9tQ29kZSA9IGZhbHNlO1xuICB9XG5cbiAgLy8gQ2xlYW4gcHJvcGVydGllcyB0byBrZWVwIGl0IGxlYW4gYW5kIG1lYW5cbiAgaWYgKGNoYXJ0SnNvbikge1xuICAgIGNoYXJ0SnNvbi5jaGFydCA9IGNoYXJ0SnNvbi5jaGFydCB8fCB7fTtcbiAgICBjaGFydEpzb24uZXhwb3J0aW5nID0gY2hhcnRKc29uLmV4cG9ydGluZyB8fCB7fTtcbiAgICBjaGFydEpzb24uZXhwb3J0aW5nLmVuYWJsZWQgPSBmYWxzZTtcbiAgfVxuXG4gIGV4cG9ydE9wdGlvbnMuY29uc3RyID0gZXhwb3J0T3B0aW9ucy5jb25zdHIgfHwgJ2NoYXJ0JztcbiAgZXhwb3J0T3B0aW9ucy50eXBlID0gZml4VHlwZShleHBvcnRPcHRpb25zLnR5cGUsIGV4cG9ydE9wdGlvbnMub3V0ZmlsZSk7XG4gIGlmIChleHBvcnRPcHRpb25zLnR5cGUgPT09ICdzdmcnKSB7XG4gICAgZXhwb3J0T3B0aW9ucy53aWR0aCA9IGZhbHNlO1xuICB9XG5cbiAgLy8gUHJlcGFyZSBnbG9iYWwgYW5kIHRoZW1lIG9wdGlvbnNcbiAgWydnbG9iYWxPcHRpb25zJywgJ3RoZW1lT3B0aW9ucyddLmZvckVhY2goKG9wdGlvbnNOYW1lKSA9PiB7XG4gICAgdHJ5IHtcbiAgICAgIGlmIChleHBvcnRPcHRpb25zICYmIGV4cG9ydE9wdGlvbnNbb3B0aW9uc05hbWVdKSB7XG4gICAgICAgIGlmIChcbiAgICAgICAgICB0eXBlb2YgZXhwb3J0T3B0aW9uc1tvcHRpb25zTmFtZV0gPT09ICdzdHJpbmcnICYmXG4gICAgICAgICAgZXhwb3J0T3B0aW9uc1tvcHRpb25zTmFtZV0uZW5kc1dpdGgoJy5qc29uJylcbiAgICAgICAgKSB7XG4gICAgICAgICAgZXhwb3J0T3B0aW9uc1tvcHRpb25zTmFtZV0gPSBpc0NvcnJlY3RKU09OKFxuICAgICAgICAgICAgcmVhZEZpbGVTeW5jKGV4cG9ydE9wdGlvbnNbb3B0aW9uc05hbWVdLCAndXRmOCcpLFxuICAgICAgICAgICAgdHJ1ZVxuICAgICAgICAgICk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgZXhwb3J0T3B0aW9uc1tvcHRpb25zTmFtZV0gPSBpc0NvcnJlY3RKU09OKFxuICAgICAgICAgICAgZXhwb3J0T3B0aW9uc1tvcHRpb25zTmFtZV0sXG4gICAgICAgICAgICB0cnVlXG4gICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBleHBvcnRPcHRpb25zW29wdGlvbnNOYW1lXSA9IHt9O1xuICAgICAgbG9nV2l0aFN0YWNrKDIsIGVycm9yLCBgW2NoYXJ0XSBUaGUgJyR7b3B0aW9uc05hbWV9JyBjYW5ub3QgYmUgbG9hZGVkLmApO1xuICAgIH1cbiAgfSk7XG5cbiAgLy8gUHJlcGFyZSB0aGUgY3VzdG9tQ29kZVxuICBpZiAoY3VzdG9tTG9naWNPcHRpb25zLmFsbG93Q29kZUV4ZWN1dGlvbikge1xuICAgIHRyeSB7XG4gICAgICBjdXN0b21Mb2dpY09wdGlvbnMuY3VzdG9tQ29kZSA9IHdyYXBBcm91bmQoXG4gICAgICAgIGN1c3RvbUxvZ2ljT3B0aW9ucy5jdXN0b21Db2RlLFxuICAgICAgICBjdXN0b21Mb2dpY09wdGlvbnMuYWxsb3dGaWxlUmVzb3VyY2VzXG4gICAgICApO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICBsb2dXaXRoU3RhY2soMiwgZXJyb3IsIGBbY2hhcnRdIFRoZSAnY3VzdG9tQ29kZScgY2Fubm90IGJlIGxvYWRlZC5gKTtcbiAgICB9XG4gIH1cblxuICAvLyBHZXQgdGhlIGNhbGxiYWNrXG4gIGlmIChcbiAgICBjdXN0b21Mb2dpY09wdGlvbnMgJiZcbiAgICBjdXN0b21Mb2dpY09wdGlvbnMuY2FsbGJhY2sgJiZcbiAgICBjdXN0b21Mb2dpY09wdGlvbnMuY2FsbGJhY2s/LmluZGV4T2YoJ3snKSA8IDBcbiAgKSB7XG4gICAgLy8gVGhlIGFsbG93RmlsZVJlc291cmNlcyBpcyBhbHdheXMgc2V0IHRvIGZhbHNlIGZvciBIVFRQIHJlcXVlc3RzIHRvIGF2b2lkXG4gICAgLy8gaW5qZWN0aW5nIGFyYml0cmFyeSBmaWxlcyBmcm9tIHRoZSBmc1xuICAgIGlmIChjdXN0b21Mb2dpY09wdGlvbnMuYWxsb3dGaWxlUmVzb3VyY2VzKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjdXN0b21Mb2dpY09wdGlvbnMuY2FsbGJhY2sgPSByZWFkRmlsZVN5bmMoXG4gICAgICAgICAgY3VzdG9tTG9naWNPcHRpb25zLmNhbGxiYWNrLFxuICAgICAgICAgICd1dGY4J1xuICAgICAgICApO1xuICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgY3VzdG9tTG9naWNPcHRpb25zLmNhbGxiYWNrID0gZmFsc2U7XG4gICAgICAgIGxvZ1dpdGhTdGFjaygyLCBlcnJvciwgYFtjaGFydF0gVGhlICdjYWxsYmFjaycgY2Fubm90IGJlIGxvYWRlZC5gKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgY3VzdG9tTG9naWNPcHRpb25zLmNhbGxiYWNrID0gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgLy8gU2l6ZSBzZWFyY2hcbiAgb3B0aW9ucy5leHBvcnQgPSB7XG4gICAgLi4ub3B0aW9ucy5leHBvcnQsXG4gICAgLi4uZmluZENoYXJ0U2l6ZShvcHRpb25zKVxuICB9O1xuXG4gIC8vIFBvc3QgdGhlIHdvcmsgdG8gdGhlIHBvb2xcbiAgdHJ5IHtcbiAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBwb3N0V29yayhcbiAgICAgIGV4cG9ydE9wdGlvbnMuc3RySW5qIHx8IGNoYXJ0SnNvbiB8fCBzdmcsXG4gICAgICBvcHRpb25zXG4gICAgKTtcbiAgICByZXR1cm4gZW5kQ2FsbGJhY2soZmFsc2UsIHJlc3VsdCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgcmV0dXJuIGVuZENhbGxiYWNrKGVycm9yKTtcbiAgfVxufTtcblxuLyoqXG4gKiBQZXJmb3JtcyBhIGRpcmVjdCBpbmplY3Qgb2Ygb3B0aW9ucyBiZWZvcmUgZXhwb3J0LiBUaGUgZnVuY3Rpb24gYXR0ZW1wdHNcbiAqIHRvIHN0cmluZ2lmeSB0aGUgcHJvdmlkZWQgb3B0aW9ucyBhbmQgcmVtb3ZlcyB1bm5lY2Vzc2FyeSBjaGFyYWN0ZXJzLFxuICogZW5zdXJpbmcgYSBjbGVhbiBhbmQgZm9ybWF0dGVkIGlucHV0LiBUaGUgcmVzdWx0aW5nIHN0cmluZyBpcyBzYXZlZCBhc1xuICogYSBcInN0cmlnaHQgaW5qZWN0XCIgc3RyaW5nIGluIHRoZSBleHBvcnQgb3B0aW9ucy4gSXQgdGhlbiBpbnZva2VzIHRoZVxuICogZG9FeHBvcnQgZnVuY3Rpb24gd2l0aCB0aGUgdXBkYXRlZCBvcHRpb25zLlxuICpcbiAqIElNUE9SVEFOVDogRGFuZ2Vyb3VzIGFuZCBtdXN0IGJlIHVzZWQgZGVsaWJlcmF0ZWx5IGJ5IHNvbWVvbmUgd2hvIHNldHMgdXBcbiAqIGEgc2VydmVyIChzZWUgdGhlICAtLWFsbG93Q29kZUV4ZWN1dGlvbiBvcHRpb24pLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIC0gVGhlIGV4cG9ydCBvcHRpb25zIGNvbnRhaW5pbmcgdGhlIGlucHV0XG4gKiB0byBiZSBpbmplY3RlZC5cbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGVuZENhbGxiYWNrIC0gVGhlIGNhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGludm9rZWRcbiAqIGF0IHRoZSBlbmQgb2YgdGhlIHByb2Nlc3MuXG4gKlxuICogQHJldHVybnMge1Byb21pc2V9IEEgUHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHJlc3VsdCBvZiB0aGUgZXhwb3J0XG4gKiBvcGVyYXRpb24gb3IgcmVqZWN0cyB3aXRoIGFuIGVycm9yIGlmIGFueSBpc3N1ZXMgb2NjdXIgZHVyaW5nIHRoZSBwcm9jZXNzLlxuICovXG5jb25zdCBkb1N0cmFpZ2h0SW5qZWN0ID0gKG9wdGlvbnMsIGVuZENhbGxiYWNrKSA9PiB7XG4gIHRyeSB7XG4gICAgbGV0IHN0ckluajtcbiAgICBsZXQgaW5zdHIgPSBvcHRpb25zLmV4cG9ydC5pbnN0ciB8fCBvcHRpb25zLmV4cG9ydC5vcHRpb25zO1xuXG4gICAgaWYgKHR5cGVvZiBpbnN0ciAhPT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIFRyeSB0byBzdHJpbmdpZnkgb3B0aW9uc1xuICAgICAgc3RySW5qID0gaW5zdHIgPSBvcHRpb25zU3RyaW5naWZ5KFxuICAgICAgICBpbnN0cixcbiAgICAgICAgb3B0aW9ucy5jdXN0b21Mb2dpYz8uYWxsb3dDb2RlRXhlY3V0aW9uXG4gICAgICApO1xuICAgIH1cbiAgICBzdHJJbmogPSBpbnN0ci5yZXBsYWNlQWxsKC9cXHR8XFxufFxcci9nLCAnJykudHJpbSgpO1xuXG4gICAgLy8gR2V0IHJpZCBvZiB0aGUgO1xuICAgIGlmIChzdHJJbmpbc3RySW5qLmxlbmd0aCAtIDFdID09PSAnOycpIHtcbiAgICAgIHN0ckluaiA9IHN0ckluai5zdWJzdHJpbmcoMCwgc3RySW5qLmxlbmd0aCAtIDEpO1xuICAgIH1cblxuICAgIC8vIFNhdmUgYXMgc3RyaWdodCBpbmplY3Qgc3RyaW5nXG4gICAgb3B0aW9ucy5leHBvcnQuc3RySW5qID0gc3RySW5qO1xuICAgIHJldHVybiBkb0V4cG9ydChvcHRpb25zLCBmYWxzZSwgZW5kQ2FsbGJhY2spO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIHJldHVybiBlbmRDYWxsYmFjayhcbiAgICAgIG5ldyBFeHBvcnRFcnJvcihcbiAgICAgICAgYFtjaGFydF0gTWFsZm9ybWVkIGlucHV0IGRldGVjdGVkIGZvciAke29wdGlvbnMuZXhwb3J0Py5yZXF1ZXN0SWQgfHwgJz8nfS4gUGxlYXNlIG1ha2Ugc3VyZSB0aGF0IHlvdXIgSlNPTi9KYXZhU2NyaXB0IG9wdGlvbnMgYXJlIHNlbnQgdXNpbmcgdGhlIFwib3B0aW9uc1wiIGF0dHJpYnV0ZSwgYW5kIHRoYXQgaWYgeW91J3JlIHVzaW5nIFNWRywgaXQgaXMgdW5lc2NhcGVkLmBcbiAgICAgICkuc2V0RXJyb3IoZXJyb3IpXG4gICAgKTtcbiAgfVxufTtcblxuLyoqXG4gKiBFeHBvcnRzIGEgc3RyaW5nIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBvcHRpb25zIGFuZCBpbnZva2VzIGFuIGVuZCBjYWxsYmFjay5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gc3RyaW5nVG9FeHBvcnQgLSBUaGUgc3RyaW5nIGNvbnRlbnQgdG8gYmUgZXhwb3J0ZWQuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyAtIEV4cG9ydCBvcHRpb25zLCBpbmNsdWRpbmcgY3VzdG9tTG9naWMgd2l0aFxuICogYWxsb3dDb2RlRXhlY3V0aW9uIGZsYWcuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBlbmRDYWxsYmFjayAtIENhbGxiYWNrIGZ1bmN0aW9uIHRvIGJlIGludm9rZWQgYXQgdGhlIGVuZFxuICogb2YgdGhlIGV4cG9ydCBwcm9jZXNzLlxuICpcbiAqIEByZXR1cm5zIHthbnl9IFJlc3VsdCBvZiB0aGUgZXhwb3J0IHByb2Nlc3Mgb3IgYW4gZXJyb3IgaWYgZW5jb3VudGVyZWQuXG4gKi9cbmNvbnN0IGV4cG9ydEFzU3RyaW5nID0gKHN0cmluZ1RvRXhwb3J0LCBvcHRpb25zLCBlbmRDYWxsYmFjaykgPT4ge1xuICBjb25zdCB7IGFsbG93Q29kZUV4ZWN1dGlvbiB9ID0gb3B0aW9ucy5jdXN0b21Mb2dpYztcblxuICAvLyBDaGVjayBpZiBpdCBpcyBTVkdcbiAgaWYgKFxuICAgIHN0cmluZ1RvRXhwb3J0LmluZGV4T2YoJzxzdmcnKSA+PSAwIHx8XG4gICAgc3RyaW5nVG9FeHBvcnQuaW5kZXhPZignPD94bWwnKSA+PSAwXG4gICkge1xuICAgIGxvZyg0LCAnW2NoYXJ0XSBQYXJzaW5nIGlucHV0IGFzIFNWRy4nKTtcbiAgICByZXR1cm4gZG9FeHBvcnQob3B0aW9ucywgZmFsc2UsIGVuZENhbGxiYWNrLCBzdHJpbmdUb0V4cG9ydCk7XG4gIH1cblxuICB0cnkge1xuICAgIC8vIFRyeSB0byBwYXJzZSB0byBKU09OIGFuZCBjYWxsIHRoZSBkb0V4cG9ydCBmdW5jdGlvblxuICAgIGNvbnN0IGNoYXJ0SlNPTiA9IEpTT04ucGFyc2Uoc3RyaW5nVG9FeHBvcnQucmVwbGFjZUFsbCgvXFx0fFxcbnxcXHIvZywgJyAnKSk7XG5cbiAgICAvLyBJZiBhIGNvcnJlY3QgSlNPTiwgZG8gdGhlIGV4cG9ydFxuICAgIHJldHVybiBkb0V4cG9ydChvcHRpb25zLCBjaGFydEpTT04sIGVuZENhbGxiYWNrKTtcbiAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAvLyBOb3QgYSB2YWxpZCBKU09OXG4gICAgaWYgKHRvQm9vbGVhbihhbGxvd0NvZGVFeGVjdXRpb24pKSB7XG4gICAgICByZXR1cm4gZG9TdHJhaWdodEluamVjdChvcHRpb25zLCBlbmRDYWxsYmFjayk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIERvIG5vdCBhbGxvdyBzdHJhaWdodCBpbmplY3Rpb24gd2l0aG91dCB0aGUgYWxsb3dDb2RlRXhlY3V0aW9uIGZsYWdcbiAgICAgIHJldHVybiBlbmRDYWxsYmFjayhcbiAgICAgICAgbmV3IEV4cG9ydEVycm9yKFxuICAgICAgICAgICdbY2hhcnRdIE9ubHkgSlNPTiBjb25maWd1cmF0aW9ucyBhbmQgU1ZHIGFyZSBhbGxvd2VkIGZvciB0aGlzIHNlcnZlci4gSWYgdGhpcyBpcyB5b3VyIHNlcnZlciwgSmF2YVNjcmlwdCBjdXN0b20gY29kZSBjYW4gYmUgZW5hYmxlZCBieSBzdGFydGluZyB0aGUgc2VydmVyIHdpdGggdGhlIC0tYWxsb3dDb2RlRXhlY3V0aW9uIGZsYWcuJ1xuICAgICAgICApLnNldEVycm9yKGVycm9yKVxuICAgICAgKTtcbiAgICB9XG4gIH1cbn07XG5cbi8qKlxuICogUmV0cmlldmVzIGFuZCByZXR1cm5zIHRoZSBjdXJyZW50IHN0YXR1cyBvZiBjb2RlIGV4ZWN1dGlvbiBwZXJtaXNzaW9uLlxuICpcbiAqIEByZXR1cm5zIHthbnl9IFRoZSB2YWx1ZSBvZiBhbGxvd0NvZGVFeGVjdXRpb24uXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRBbGxvd0NvZGVFeGVjdXRpb24gPSAoKSA9PiBhbGxvd0NvZGVFeGVjdXRpb247XG5cbi8qKlxuICogU2V0cyB0aGUgY29kZSBleGVjdXRpb24gcGVybWlzc2lvbiBiYXNlZCBvbiB0aGUgcHJvdmlkZWQgYm9vbGVhbiB2YWx1ZS5cbiAqXG4gKiBAcGFyYW0ge2FueX0gdmFsdWUgLSBUaGUgdmFsdWUgdG8gYmUgY29udmVydGVkIGFuZCBhc3NpZ25lZFxuICogdG8gYWxsb3dDb2RlRXhlY3V0aW9uLlxuICovXG5leHBvcnQgY29uc3Qgc2V0QWxsb3dDb2RlRXhlY3V0aW9uID0gKHZhbHVlKSA9PiB7XG4gIGFsbG93Q29kZUV4ZWN1dGlvbiA9IHRvQm9vbGVhbih2YWx1ZSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIGJhdGNoRXhwb3J0LFxuICBzaW5nbGVFeHBvcnQsXG4gIGdldEFsbG93Q29kZUV4ZWN1dGlvbixcbiAgc2V0QWxsb3dDb2RlRXhlY3V0aW9uLFxuICBzdGFydEV4cG9ydCxcbiAgZmluZENoYXJ0U2l6ZVxufTtcbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbkhpZ2hjaGFydHMgRXhwb3J0IFNlcnZlclxuXG5Db3B5cmlnaHQgKGMpIDIwMTYtMjAyNCwgSGlnaHNvZnRcblxuTGljZW5jZWQgdW5kZXIgdGhlIE1JVCBsaWNlbmNlLlxuXG5BZGRpdGlvbmFsbHkgYSB2YWxpZCBIaWdoY2hhcnRzIGxpY2Vuc2UgaXMgcmVxdWlyZWQgZm9yIHVzZS5cblxuU2VlIExJQ0VOU0UgZmlsZSBpbiByb290IGZvciBkZXRhaWxzLlxuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG4vKipcbiAqIEBvdmVydmlldyBVc2VkIHRvIHNhbml0aXplIHRoZSBzdHJpbmdzIGNvbWluZyBmcm9tIHRoZSBleHBvcnRpbmcgbW9kdWxlXG4gKiB0byBwcmV2ZW50IFhTUyBhdHRhY2tzICh3aXRoIHRoZSBET01QdXJpZnkgbGlicmFyeSkuXG4gKiovXG5cbmltcG9ydCB7IEpTRE9NIH0gZnJvbSAnanNkb20nO1xuaW1wb3J0IERPTVB1cmlmeSBmcm9tICdkb21wdXJpZnknO1xuXG4vKipcbiAqIFNhbml0aXplcyBhIGdpdmVuIEhUTUwgc3RyaW5nIGJ5IHJlbW92aW5nIDxzY3JpcHQ+IHRhZ3MuXG4gKiBUaGlzIGZ1bmN0aW9uIHVzZXMgYSByZWd1bGFyIGV4cHJlc3Npb24gdG8gZmluZCBhbmQgcmVtb3ZlIGFsbFxuICogb2NjdXJyZW5jZXMgb2YgPHNjcmlwdD4uLi48L3NjcmlwdD4gdGFncyBhbmQgYW55IGNvbnRlbnQgd2l0aGluIHRoZW0uXG4gKlxuICogQHBhcmFtIHtzdHJpbmd9IGlucHV0IFRoZSBIVE1MIHN0cmluZyB0byBiZSBzYW5pdGl6ZWQuXG4gKiBAcmV0dXJucyB7c3RyaW5nfSBUaGUgc2FuaXRpemVkIEhUTUwgc3RyaW5nLlxuICovXG5leHBvcnQgZnVuY3Rpb24gc2FuaXRpemUoaW5wdXQpIHtcbiAgY29uc3Qgd2luZG93ID0gbmV3IEpTRE9NKCcnKS53aW5kb3c7XG4gIGNvbnN0IHB1cmlmeSA9IERPTVB1cmlmeSh3aW5kb3cpO1xuICByZXR1cm4gcHVyaWZ5LnNhbml0aXplKGlucHV0LCB7XG4gICAgQUREX1RBR1M6IFsnZm9yZWlnbk9iamVjdCddLFxuICAgIC8vIERpc3NhbG93IGFsbCB4bGlua3MgaW4gaW5jb21pbmcgU1ZHXG4gICAgRk9SQklEX0FUVFI6IFsneGxpbms6aHJlZiddXG4gIH0pO1xufVxuXG5leHBvcnQgZGVmYXVsdCBzYW5pdGl6ZTtcbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbkhpZ2hjaGFydHMgRXhwb3J0IFNlcnZlclxuXG5Db3B5cmlnaHQgKGMpIDIwMTYtMjAyNCwgSGlnaHNvZnRcblxuTGljZW5jZWQgdW5kZXIgdGhlIE1JVCBsaWNlbmNlLlxuXG5BZGRpdGlvbmFsbHkgYSB2YWxpZCBIaWdoY2hhcnRzIGxpY2Vuc2UgaXMgcmVxdWlyZWQgZm9yIHVzZS5cblxuU2VlIExJQ0VOU0UgZmlsZSBpbiByb290IGZvciBkZXRhaWxzLlxuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBsb2cgfSBmcm9tICcuL2xvZ2dlci5qcyc7XG5cbi8vIEFycmF5IHRoYXQgY29udGFpbnMgaWRzIG9mIGFsbCBvbmdvaW5nIGludGVydmFsc1xuY29uc3QgaW50ZXJ2YWxJZHMgPSBbXTtcblxuLyoqXG4gKiBBZGRzIGlkIG9mIGEgc2V0SW50ZXJ2YWwgdG8gdGhlIGludGVydmFsSWRzIGFycmF5LlxuICpcbiAqIEBwYXJhbSB7Tm9kZUpTLlRpbWVvdXR9IGlkIC0gSWQgb2YgYW4gaW50ZXJ2YWwuXG4gKi9cbmV4cG9ydCBjb25zdCBhZGRJbnRlcnZhbCA9IChpZCkgPT4ge1xuICBpbnRlcnZhbElkcy5wdXNoKGlkKTtcbn07XG5cbi8qKlxuICogQ2xlYXJzIGFsbCBvZiBvbmdvaW5nIGludGVydmFscyBieSBpZHMgZ2F0aGVyZWQgaW4gdGhlIGludGVydmFsSWRzIGFycmF5LlxuICovXG5leHBvcnQgY29uc3QgY2xlYXJBbGxJbnRlcnZhbHMgPSAoKSA9PiB7XG4gIGxvZyg0LCBgW3NlcnZlcl0gQ2xlYXJpbmcgYWxsIHJlZ2lzdGVyZWQgaW50ZXJ2YWxzLmApO1xuICBmb3IgKGNvbnN0IGlkIG9mIGludGVydmFsSWRzKSB7XG4gICAgY2xlYXJJbnRlcnZhbChpZCk7XG4gIH1cbn07XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgYWRkSW50ZXJ2YWwsXG4gIGNsZWFyQWxsSW50ZXJ2YWxzXG59O1xuIiwiaW1wb3J0IHsgZW52cyB9IGZyb20gJy4uL2VudnMuanMnO1xuaW1wb3J0IHsgbG9nV2l0aFN0YWNrIH0gZnJvbSAnLi4vbG9nZ2VyLmpzJztcblxuLyoqXG4gKiBNaWRkbGV3YXJlIGZvciBsb2dnaW5nIGVycm9ycyB3aXRoIHN0YWNrIHRyYWNlIGFuZCBoYW5kbGluZyBlcnJvciByZXNwb25zZS5cbiAqXG4gKiBAcGFyYW0ge0Vycm9yfSBlcnJvciAtIFRoZSBlcnJvciBvYmplY3QuXG4gKiBAcGFyYW0ge0V4cHJlc3MuUmVxdWVzdH0gcmVxIC0gVGhlIEV4cHJlc3MgcmVxdWVzdCBvYmplY3QuXG4gKiBAcGFyYW0ge0V4cHJlc3MuUmVzcG9uc2V9IHJlcyAtIFRoZSBFeHByZXNzIHJlc3BvbnNlIG9iamVjdC5cbiAqIEBwYXJhbSB7RnVuY3Rpb259IG5leHQgLSBUaGUgbmV4dCBtaWRkbGV3YXJlIGZ1bmN0aW9uLlxuICovXG5jb25zdCBsb2dFcnJvck1pZGRsZXdhcmUgPSAoZXJyb3IsIHJlcSwgcmVzLCBuZXh0KSA9PiB7XG4gIC8vIERpc3BsYXkgdGhlIGVycm9yIHdpdGggc3RhY2sgaW4gYSBjb3JyZWN0IGZvcm1hdFxuICBsb2dXaXRoU3RhY2soMSwgZXJyb3IpO1xuXG4gIC8vIERlbGV0ZSB0aGUgc3RhY2sgZm9yIHRoZSBlbnZpcm9ubWVudCBvdGhlciB0aGFuIHRoZSBkZXZlbG9wbWVudFxuICBpZiAoZW52cy5PVEhFUl9OT0RFX0VOViAhPT0gJ2RldmVsb3BtZW50Jykge1xuICAgIGRlbGV0ZSBlcnJvci5zdGFjaztcbiAgfVxuXG4gIC8vIENhbGwgdGhlIHJldHVybkVycm9yTWlkZGxld2FyZVxuICBuZXh0KGVycm9yKTtcbn07XG5cbi8qKlxuICogTWlkZGxld2FyZSBmb3IgcmV0dXJuaW5nIGVycm9yIHJlc3BvbnNlLlxuICpcbiAqIEBwYXJhbSB7RXJyb3J9IGVycm9yIC0gVGhlIGVycm9yIG9iamVjdC5cbiAqIEBwYXJhbSB7RXhwcmVzcy5SZXF1ZXN0fSByZXEgLSBUaGUgRXhwcmVzcyByZXF1ZXN0IG9iamVjdC5cbiAqIEBwYXJhbSB7RXhwcmVzcy5SZXNwb25zZX0gcmVzIC0gVGhlIEV4cHJlc3MgcmVzcG9uc2Ugb2JqZWN0LlxuICogQHBhcmFtIHtGdW5jdGlvbn0gbmV4dCAtIFRoZSBuZXh0IG1pZGRsZXdhcmUgZnVuY3Rpb24uXG4gKi9cbmNvbnN0IHJldHVybkVycm9yTWlkZGxld2FyZSA9IChlcnJvciwgcmVxLCByZXMsIG5leHQpID0+IHtcbiAgLy8gR2F0aGVyIGFsbCByZXF1aWVkIGluZm9ybWF0aW9uIGZvciB0aGUgcmVzcG9uc2VcbiAgY29uc3QgeyBzdGF0dXNDb2RlOiBzdENvZGUsIHN0YXR1cywgbWVzc2FnZSwgc3RhY2sgfSA9IGVycm9yO1xuICBjb25zdCBzdGF0dXNDb2RlID0gc3RDb2RlIHx8IHN0YXR1cyB8fCA0MDA7XG5cbiAgLy8gU2V0IGFuZCByZXR1cm4gcmVzcG9uc2VcbiAgcmVzLnN0YXR1cyhzdGF0dXNDb2RlKS5qc29uKHsgc3RhdHVzQ29kZSwgbWVzc2FnZSwgc3RhY2sgfSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCAoYXBwKSA9PiB7XG4gIC8vIEFkZCBsb2cgZXJyb3IgbWlkZGxld2FyZVxuICBhcHAudXNlKGxvZ0Vycm9yTWlkZGxld2FyZSk7XG5cbiAgLy8gQWRkIHNldCBzdGF0dXMgYW5kIHJldHVybiBlcnJvciBtaWRkbGV3YXJlXG4gIGFwcC51c2UocmV0dXJuRXJyb3JNaWRkbGV3YXJlKTtcbn07XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5IaWdoY2hhcnRzIEV4cG9ydCBTZXJ2ZXJcblxuQ29weXJpZ2h0IChjKSAyMDE2LTIwMjQsIEhpZ2hzb2Z0XG5cbkxpY2VuY2VkIHVuZGVyIHRoZSBNSVQgbGljZW5jZS5cblxuQWRkaXRpb25hbGx5IGEgdmFsaWQgSGlnaGNoYXJ0cyBsaWNlbnNlIGlzIHJlcXVpcmVkIGZvciB1c2UuXG5cblNlZSBMSUNFTlNFIGZpbGUgaW4gcm9vdCBmb3IgZGV0YWlscy5cblxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHJhdGVMaW1pdCBmcm9tICdleHByZXNzLXJhdGUtbGltaXQnO1xuXG5pbXBvcnQgeyBsb2cgfSBmcm9tICcuLi9sb2dnZXIuanMnO1xuXG4vKipcbiAqIE1pZGRsZXdhcmUgZm9yIGVuYWJsaW5nIHJhdGUgbGltaXRpbmcgb24gdGhlIHNwZWNpZmllZCBFeHByZXNzIGFwcC5cbiAqXG4gKiBAcGFyYW0ge0V4cHJlc3N9IGFwcCAtIFRoZSBFeHByZXNzIGFwcCBpbnN0YW5jZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBsaW1pdENvbmZpZyAtIENvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgcmF0ZSBsaW1pdGluZy5cbiAqL1xuZXhwb3J0IGRlZmF1bHQgKGFwcCwgbGltaXRDb25maWcpID0+IHtcbiAgY29uc3QgbXNnID1cbiAgICAnVG9vIG1hbnkgcmVxdWVzdHMsIHlvdSBoYXZlIGJlZW4gcmF0ZSBsaW1pdGVkLiBQbGVhc2UgdHJ5IGFnYWluIGxhdGVyLic7XG5cbiAgLy8gT3B0aW9ucyBmb3IgdGhlIHJhdGUgbGltaXRlclxuICBjb25zdCByYXRlT3B0aW9ucyA9IHtcbiAgICBtYXg6IGxpbWl0Q29uZmlnLm1heFJlcXVlc3RzIHx8IDMwLFxuICAgIHdpbmRvdzogbGltaXRDb25maWcud2luZG93IHx8IDEsXG4gICAgZGVsYXk6IGxpbWl0Q29uZmlnLmRlbGF5IHx8IDAsXG4gICAgdHJ1c3RQcm94eTogbGltaXRDb25maWcudHJ1c3RQcm94eSB8fCBmYWxzZSxcbiAgICBza2lwS2V5OiBsaW1pdENvbmZpZy5za2lwS2V5IHx8IGZhbHNlLFxuICAgIHNraXBUb2tlbjogbGltaXRDb25maWcuc2tpcFRva2VuIHx8IGZhbHNlXG4gIH07XG5cbiAgLy8gU2V0IGlmIGJlaGluZCBhIHByb3h5XG4gIGlmIChyYXRlT3B0aW9ucy50cnVzdFByb3h5KSB7XG4gICAgYXBwLmVuYWJsZSgndHJ1c3QgcHJveHknKTtcbiAgfVxuXG4gIC8vIENyZWF0ZSBhIGxpbWl0ZXJcbiAgY29uc3QgbGltaXRlciA9IHJhdGVMaW1pdCh7XG4gICAgd2luZG93TXM6IHJhdGVPcHRpb25zLndpbmRvdyAqIDYwICogMTAwMCxcbiAgICAvLyBMaW1pdCBlYWNoIElQIHRvIDEwMCByZXF1ZXN0cyBwZXIgd2luZG93TXNcbiAgICBtYXg6IHJhdGVPcHRpb25zLm1heCxcbiAgICAvLyBEaXNhYmxlIGRlbGF5aW5nLCBmdWxsIHNwZWVkIHVudGlsIHRoZSBtYXggbGltaXQgaXMgcmVhY2hlZFxuICAgIGRlbGF5TXM6IHJhdGVPcHRpb25zLmRlbGF5LFxuICAgIGhhbmRsZXI6IChyZXF1ZXN0LCByZXNwb25zZSkgPT4ge1xuICAgICAgcmVzcG9uc2UuZm9ybWF0KHtcbiAgICAgICAganNvbjogKCkgPT4ge1xuICAgICAgICAgIHJlc3BvbnNlLnN0YXR1cyg0MjkpLnNlbmQoeyBtZXNzYWdlOiBtc2cgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGRlZmF1bHQ6ICgpID0+IHtcbiAgICAgICAgICByZXNwb25zZS5zdGF0dXMoNDI5KS5zZW5kKG1zZyk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0sXG4gICAgc2tpcDogKHJlcXVlc3QpID0+IHtcbiAgICAgIC8vIEFsbG93IGJ5cGFzc2luZyB0aGUgbGltaXRlciBpZiBhIHZhbGlkIGtleS90b2tlbiBoYXMgYmVlbiBzZW50XG4gICAgICBpZiAoXG4gICAgICAgIHJhdGVPcHRpb25zLnNraXBLZXkgIT09IGZhbHNlICYmXG4gICAgICAgIHJhdGVPcHRpb25zLnNraXBUb2tlbiAhPT0gZmFsc2UgJiZcbiAgICAgICAgcmVxdWVzdC5xdWVyeS5rZXkgPT09IHJhdGVPcHRpb25zLnNraXBLZXkgJiZcbiAgICAgICAgcmVxdWVzdC5xdWVyeS5hY2Nlc3NfdG9rZW4gPT09IHJhdGVPcHRpb25zLnNraXBUb2tlblxuICAgICAgKSB7XG4gICAgICAgIGxvZyg0LCAnW3JhdGUgbGltaXRpbmddIFNraXBwaW5nIHJhdGUgbGltaXRlci4nKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9KTtcblxuICAvLyBVc2UgYSBsaW1pdGVyIGFzIGEgbWlkZGxld2FyZVxuICBhcHAudXNlKGxpbWl0ZXIpO1xuXG4gIGxvZyhcbiAgICAzLFxuICAgIGBbcmF0ZSBsaW1pdGluZ10gRW5hYmxlZCByYXRlIGxpbWl0aW5nIHdpdGggJHtyYXRlT3B0aW9ucy5tYXh9IHJlcXVlc3RzIHBlciAke3JhdGVPcHRpb25zLndpbmRvd30gbWludXRlIGZvciBlYWNoIElQLCB0cnVzdGluZyBwcm94eTogJHtyYXRlT3B0aW9ucy50cnVzdFByb3h5fS5gXG4gICk7XG59O1xuIiwiaW1wb3J0IEV4cG9ydEVycm9yIGZyb20gJy4vRXhwb3J0RXJyb3IuanMnO1xuXG5jbGFzcyBIdHRwRXJyb3IgZXh0ZW5kcyBFeHBvcnRFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2UsIHN0YXR1cykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMuc3RhdHVzID0gdGhpcy5zdGF0dXNDb2RlID0gc3RhdHVzO1xuICB9XG5cbiAgc2V0U3RhdHVzKHN0YXR1cykge1xuICAgIHRoaXMuc3RhdHVzID0gc3RhdHVzO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG59XG5cbmV4cG9ydCBkZWZhdWx0IEh0dHBFcnJvcjtcbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbkhpZ2hjaGFydHMgRXhwb3J0IFNlcnZlclxuXG5Db3B5cmlnaHQgKGMpIDIwMTYtMjAyNCwgSGlnaHNvZnRcblxuTGljZW5jZWQgdW5kZXIgdGhlIE1JVCBsaWNlbmNlLlxuXG5BZGRpdGlvbmFsbHkgYSB2YWxpZCBIaWdoY2hhcnRzIGxpY2Vuc2UgaXMgcmVxdWlyZWQgZm9yIHVzZS5cblxuU2VlIExJQ0VOU0UgZmlsZSBpbiByb290IGZvciBkZXRhaWxzLlxuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyB1cGRhdGVWZXJzaW9uLCB2ZXJzaW9uIH0gZnJvbSAnLi4vLi4vY2FjaGUuanMnO1xuaW1wb3J0IHsgZW52cyB9IGZyb20gJy4uLy4uL2VudnMuanMnO1xuXG5pbXBvcnQgSHR0cEVycm9yIGZyb20gJy4uLy4uL2Vycm9ycy9IdHRwRXJyb3IuanMnO1xuXG4vKipcbiAqIEFkZHMgdGhlIFBPU1QgL2NoYW5nZV9oY192ZXJzaW9uLzpuZXdWZXJzaW9uIHJvdXRlIHRoYXQgY2FuIGJlIHV0aWxpemVkIHRvIG1vZGlmeVxuICogdGhlIEhpZ2hjaGFydHMgdmVyc2lvbiBvbiB0aGUgc2VydmVyLlxuICpcbiAqIFRPRE86IEFkZCBhdXRoIHRva2VuIGFuZCBjb25uZWN0IHRvIEFQSVxuICovXG5leHBvcnQgZGVmYXVsdCAoYXBwKSA9PlxuICAhYXBwXG4gICAgPyBmYWxzZVxuICAgIDogYXBwLnBvc3QoXG4gICAgICAgICcvdmVyc2lvbi9jaGFuZ2UvOm5ld1ZlcnNpb24nLFxuICAgICAgICBhc3luYyAocmVxdWVzdCwgcmVzcG9uc2UsIG5leHQpID0+IHtcbiAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgY29uc3QgYWRtaW5Ub2tlbiA9IGVudnMuSElHSENIQVJUU19BRE1JTl9UT0tFTjtcblxuICAgICAgICAgICAgLy8gQ2hlY2sgdGhlIGV4aXN0ZW5jZSBvZiB0aGUgdG9rZW5cbiAgICAgICAgICAgIGlmICghYWRtaW5Ub2tlbiB8fCAhYWRtaW5Ub2tlbi5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEh0dHBFcnJvcihcbiAgICAgICAgICAgICAgICAnVGhlIHNlcnZlciBpcyBub3QgY29uZmlndXJlZCB0byBwZXJmb3JtIHJ1bi10aW1lIHZlcnNpb24gY2hhbmdlczogSElHSENIQVJUU19BRE1JTl9UT0tFTiBpcyBub3Qgc2V0LicsXG4gICAgICAgICAgICAgICAgNDAxXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENoZWNrIGlmIHRoZSBoYy1hdXRoIGhlYWRlciBjb250YWluIGEgY29ycmVjdCB0b2tlblxuICAgICAgICAgICAgY29uc3QgdG9rZW4gPSByZXF1ZXN0LmdldCgnaGMtYXV0aCcpO1xuICAgICAgICAgICAgaWYgKCF0b2tlbiB8fCB0b2tlbiAhPT0gYWRtaW5Ub2tlbikge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgSHR0cEVycm9yKFxuICAgICAgICAgICAgICAgICdJbnZhbGlkIG9yIG1pc3NpbmcgdG9rZW46IFNldCB0aGUgdG9rZW4gaW4gdGhlIGhjLWF1dGggaGVhZGVyLicsXG4gICAgICAgICAgICAgICAgNDAxXG4gICAgICAgICAgICAgICk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENvbXBhcmUgdmVyc2lvbnNcbiAgICAgICAgICAgIGNvbnN0IG5ld1ZlcnNpb24gPSByZXF1ZXN0LnBhcmFtcy5uZXdWZXJzaW9uO1xuICAgICAgICAgICAgaWYgKG5ld1ZlcnNpb24pIHtcbiAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAvLyBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgaW1wb3J0L25vLW5hbWVkLWFzLWRlZmF1bHQtbWVtYmVyXG4gICAgICAgICAgICAgICAgYXdhaXQgdXBkYXRlVmVyc2lvbihuZXdWZXJzaW9uKTtcbiAgICAgICAgICAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSHR0cEVycm9yKFxuICAgICAgICAgICAgICAgICAgYFZlcnNpb24gY2hhbmdlOiAke2Vycm9yLm1lc3NhZ2V9YCxcbiAgICAgICAgICAgICAgICAgIGVycm9yLnN0YXR1c0NvZGVcbiAgICAgICAgICAgICAgICApLnNldEVycm9yKGVycm9yKTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIFN1Y2Nlc3NcbiAgICAgICAgICAgICAgcmVzcG9uc2Uuc3RhdHVzKDIwMCkuc2VuZCh7XG4gICAgICAgICAgICAgICAgc3RhdHVzQ29kZTogMjAwLFxuICAgICAgICAgICAgICAgIHZlcnNpb246IHZlcnNpb24oKSxcbiAgICAgICAgICAgICAgICBtZXNzYWdlOiBgU3VjY2Vzc2Z1bGx5IHVwZGF0ZWQgSGlnaGNoYXJ0cyB0byB2ZXJzaW9uOiAke25ld1ZlcnNpb259LmBcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAvLyBObyB2ZXJzaW9uIHNwZWNpZmllZFxuICAgICAgICAgICAgICB0aHJvdyBuZXcgSHR0cEVycm9yKCdObyBuZXcgdmVyc2lvbiBzdXBwbGllZC4nLCA0MDApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgICAgICBuZXh0KGVycm9yKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICk7XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5IaWdoY2hhcnRzIEV4cG9ydCBTZXJ2ZXJcblxuQ29weXJpZ2h0IChjKSAyMDE2LTIwMjQsIEhpZ2hzb2Z0XG5cbkxpY2VuY2VkIHVuZGVyIHRoZSBNSVQgbGljZW5jZS5cblxuQWRkaXRpb25hbGx5IGEgdmFsaWQgSGlnaGNoYXJ0cyBsaWNlbnNlIGlzIHJlcXVpcmVkIGZvciB1c2UuXG5cblNlZSBMSUNFTlNFIGZpbGUgaW4gcm9vdCBmb3IgZGV0YWlscy5cblxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgdjQgYXMgdXVpZCB9IGZyb20gJ3V1aWQnO1xuXG5pbXBvcnQgeyBnZXRBbGxvd0NvZGVFeGVjdXRpb24sIHN0YXJ0RXhwb3J0IH0gZnJvbSAnLi4vLi4vY2hhcnQuanMnO1xuaW1wb3J0IHsgZ2V0T3B0aW9ucywgbWVyZ2VDb25maWdPcHRpb25zIH0gZnJvbSAnLi4vLi4vY29uZmlnLmpzJztcbmltcG9ydCB7IGxvZyB9IGZyb20gJy4uLy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQge1xuICBmaXhUeXBlLFxuICBpc0NvcnJlY3RKU09OLFxuICBpc09iamVjdEVtcHR5LFxuICBpc1ByaXZhdGVSYW5nZVVybEZvdW5kLFxuICBvcHRpb25zU3RyaW5naWZ5LFxuICBtZWFzdXJlVGltZVxufSBmcm9tICcuLi8uLi91dGlscy5qcyc7XG5cbmltcG9ydCBIdHRwRXJyb3IgZnJvbSAnLi4vLi4vZXJyb3JzL0h0dHBFcnJvci5qcyc7XG5cbi8vIFJldmVyc2VkIE1JTUUgdHlwZXNcbmNvbnN0IHJldmVyc2VkTWltZSA9IHtcbiAgcG5nOiAnaW1hZ2UvcG5nJyxcbiAganBlZzogJ2ltYWdlL2pwZWcnLFxuICBnaWY6ICdpbWFnZS9naWYnLFxuICBwZGY6ICdhcHBsaWNhdGlvbi9wZGYnLFxuICBzdmc6ICdpbWFnZS9zdmcreG1sJ1xufTtcblxuLy8gVGhlIHJlcXVlc3RzIGNvdW50ZXJcbmxldCByZXF1ZXN0c0NvdW50ZXIgPSAwO1xuXG4vLyBUaGUgYXJyYXkgb2YgY2FsbGJhY2tzIHRvIGNhbGwgYmVmb3JlIGEgcmVxdWVzdFxuY29uc3QgYmVmb3JlUmVxdWVzdCA9IFtdO1xuXG4vLyBUaGUgYXJyYXkgb2YgY2FsbGJhY2tzIHRvIGNhbGwgYWZ0ZXIgYSByZXF1ZXN0XG5jb25zdCBhZnRlclJlcXVlc3QgPSBbXTtcblxuLyoqXG4gKiBJbnZva2VzIGFuIGFycmF5IG9mIGNhbGxiYWNrIGZ1bmN0aW9ucyB3aXRoIHNwZWNpZmllZCBwYXJhbWV0ZXJzLCBhbGxvd2luZ1xuICogY3VzdG9taXphdGlvbiBvZiByZXF1ZXN0IGhhbmRsaW5nLlxuICpcbiAqIEBwYXJhbSB7RnVuY3Rpb25bXX0gY2FsbGJhY2tzIC0gQW4gYXJyYXkgb2YgY2FsbGJhY2sgZnVuY3Rpb25zXG4gKiB0byBiZSBleGVjdXRlZC5cbiAqIEBwYXJhbSB7RXhwcmVzcy5SZXF1ZXN0fSByZXF1ZXN0IC0gVGhlIEV4cHJlc3MgcmVxdWVzdCBvYmplY3QuXG4gKiBAcGFyYW0ge0V4cHJlc3MuUmVzcG9uc2V9IHJlc3BvbnNlIC0gVGhlIEV4cHJlc3MgcmVzcG9uc2Ugb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IGRhdGEgLSBBbiBvYmplY3QgY29udGFpbmluZyBwYXJhbWV0ZXJzIGxpa2UgaWQsIHVuaXF1ZUlkLFxuICogdHlwZSwgYW5kIGJvZHkuXG4gKlxuICogQHJldHVybnMge2Jvb2xlYW59IC0gUmV0dXJucyBhIGJvb2xlYW4gaW5kaWNhdGluZyB0aGUgb3ZlcmFsbCByZXN1bHRcbiAqIG9mIHRoZSBjYWxsYmFjayBpbnZvY2F0aW9ucy5cbiAqL1xuY29uc3QgZG9DYWxsYmFja3MgPSAoY2FsbGJhY2tzLCByZXF1ZXN0LCByZXNwb25zZSwgZGF0YSkgPT4ge1xuICBsZXQgcmVzdWx0ID0gdHJ1ZTtcbiAgY29uc3QgeyBpZCwgdW5pcXVlSWQsIHR5cGUsIGJvZHkgfSA9IGRhdGE7XG5cbiAgY2FsbGJhY2tzLnNvbWUoKGNhbGxiYWNrKSA9PiB7XG4gICAgaWYgKGNhbGxiYWNrKSB7XG4gICAgICBsZXQgY2FsbFJlc3BvbnNlID0gY2FsbGJhY2socmVxdWVzdCwgcmVzcG9uc2UsIGlkLCB1bmlxdWVJZCwgdHlwZSwgYm9keSk7XG5cbiAgICAgIGlmIChjYWxsUmVzcG9uc2UgIT09IHVuZGVmaW5lZCAmJiBjYWxsUmVzcG9uc2UgIT09IHRydWUpIHtcbiAgICAgICAgcmVzdWx0ID0gY2FsbFJlc3BvbnNlO1xuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIEhhbmRsZXMgdGhlIGV4cG9ydCByZXF1ZXN0cyBmcm9tIHRoZSBjbGllbnQuXG4gKlxuICogQHBhcmFtIHtFeHByZXNzLlJlcXVlc3R9IHJlcXVlc3QgLSBUaGUgRXhwcmVzcyByZXF1ZXN0IG9iamVjdC5cbiAqIEBwYXJhbSB7RXhwcmVzcy5SZXNwb25zZX0gcmVzcG9uc2UgLSBUaGUgRXhwcmVzcyByZXNwb25zZSBvYmplY3QuXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBuZXh0IC0gVGhlIG5leHQgbWlkZGxld2FyZSBmdW5jdGlvbi5cbiAqXG4gKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gLSBBIHByb21pc2UgdGhhdCByZXNvbHZlcyBvbmNlIHRoZSBleHBvcnQgcHJvY2Vzc1xuICogaXMgY29tcGxldGUuXG4gKi9cbmNvbnN0IGV4cG9ydEhhbmRsZXIgPSBhc3luYyAocmVxdWVzdCwgcmVzcG9uc2UsIG5leHQpID0+IHtcbiAgdHJ5IHtcbiAgICAvLyBTdGFydCBjb3VudGluZyB0aW1lXG4gICAgY29uc3Qgc3RvcENvdW50ZXIgPSBtZWFzdXJlVGltZSgpO1xuXG4gICAgLy8gQ3JlYXRlIGEgdW5pcXVlIElEIGZvciBhIHJlcXVlc3RcbiAgICBjb25zdCB1bmlxdWVJZCA9IHV1aWQoKS5yZXBsYWNlKC8tL2csICcnKTtcblxuICAgIC8vIEdldCB0aGUgY3VycmVudCBzZXJ2ZXIncyBnZW5lcmFsIG9wdGlvbnNcbiAgICBjb25zdCBkZWZhdWx0T3B0aW9ucyA9IGdldE9wdGlvbnMoKTtcblxuICAgIGNvbnN0IGJvZHkgPSByZXF1ZXN0LmJvZHk7XG4gICAgY29uc3QgaWQgPSArK3JlcXVlc3RzQ291bnRlcjtcblxuICAgIGxldCB0eXBlID0gZml4VHlwZShib2R5LnR5cGUpO1xuXG4gICAgLy8gVGhyb3cgJ0JhZCBSZXF1ZXN0JyBpZiB0aGVyZSdzIG5vIGJvZHlcbiAgICBpZiAoIWJvZHkgfHwgaXNPYmplY3RFbXB0eShib2R5KSkge1xuICAgICAgdGhyb3cgbmV3IEh0dHBFcnJvcihcbiAgICAgICAgJ1RoZSByZXF1ZXN0IGJvZHkgaXMgcmVxdWlyZWQuIFBsZWFzZSBlbnN1cmUgdGhhdCB5b3VyIENvbnRlbnQtVHlwZSBoZWFkZXIgaXMgY29ycmVjdCAoYWNjZXB0ZWQgdHlwZXMgYXJlIGFwcGxpY2F0aW9uL2pzb24gYW5kIG11bHRpcGFydC9mb3JtLWRhdGEpLicsXG4gICAgICAgIDQwMFxuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBBbGwgb2YgdGhlIGJlbG93IGNhbiBiZSB1c2VkXG4gICAgbGV0IGluc3RyID0gaXNDb3JyZWN0SlNPTihib2R5LmluZmlsZSB8fCBib2R5Lm9wdGlvbnMgfHwgYm9keS5kYXRhKTtcblxuICAgIC8vIFRocm93ICdCYWQgUmVxdWVzdCcgaWYgdGhlcmUncyBubyBKU09OIG9yIFNWRyB0byBleHBvcnRcbiAgICBpZiAoIWluc3RyICYmICFib2R5LnN2Zykge1xuICAgICAgbG9nKFxuICAgICAgICAyLFxuICAgICAgICBgVGhlIHJlcXVlc3Qgd2l0aCBJRCAke3VuaXF1ZUlkfSBmcm9tICR7XG4gICAgICAgICAgcmVxdWVzdC5oZWFkZXJzWyd4LWZvcndhcmRlZC1mb3InXSB8fCByZXF1ZXN0LmNvbm5lY3Rpb24ucmVtb3RlQWRkcmVzc1xuICAgICAgICB9IHdhcyBpbmNvcnJlY3Q6XG4gIENvbnRlbnQtVHlwZTogJHtyZXF1ZXN0LmhlYWRlcnNbJ2NvbnRlbnQtdHlwZSddfS4gXG4gIENoYXJ0IGNvbnN0cnVjdG9yOiAke2JvZHkuY29uc3RyfS5cbiAgRGltZW5zaW9uczogJHtib2R5LndpZHRofXgke2JvZHkuaGVpZ2h0fSBAICR7Ym9keS5zY2FsZX0gc2NhbGUuXG4gIFR5cGU6ICR7dHlwZX0uXG4gIElzIFNWRyBzZXQ/ICR7dHlwZW9mIGJvZHkuc3ZnICE9PSAndW5kZWZpbmVkJ30uXG4gIEI2ND8gJHt0eXBlb2YgYm9keS5iNjQgIT09ICd1bmRlZmluZWQnfS5cbiAgTm8gZG93bmxvYWQ/ICR7dHlwZW9mIGJvZHkubm9Eb3dubG9hZCAhPT0gJ3VuZGVmaW5lZCd9LlxuXG4gIFBheWxvYWQgcmVjZWl2ZWQ6ICR7SlNPTi5zdHJpbmdpZnkoYm9keS5pbmZpbGUgfHwgYm9keS5vcHRpb25zIHx8IGJvZHkuZGF0YSB8fCBib2R5LnN2Zyl9XG5cbiAgYFxuICAgICAgKTtcblxuICAgICAgdGhyb3cgbmV3IEh0dHBFcnJvcihcbiAgICAgICAgXCJObyBjb3JyZWN0IGNoYXJ0IGRhdGEgZm91bmQuIEVuc3VyZSB0aGF0IHlvdSBhcmUgdXNpbmcgZWl0aGVyIGFwcGxpY2F0aW9uL2pzb24gb3IgbXVsdGlwYXJ0L2Zvcm0tZGF0YSBoZWFkZXJzLiBJZiBzZW5kaW5nIEpTT04sIG1ha2Ugc3VyZSB0aGUgY2hhcnQgZGF0YSBpcyBpbiB0aGUgJ2luZmlsZScsICdvcHRpb25zJywgb3IgJ2RhdGEnIGF0dHJpYnV0ZS4gSWYgc2VuZGluZyBTVkcsIGVuc3VyZSBpdCBpcyBpbiB0aGUgJ3N2ZycgYXR0cmlidXRlLlwiLFxuICAgICAgICA0MDBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgbGV0IGNhbGxSZXNwb25zZSA9IGZhbHNlO1xuXG4gICAgLy8gQ2FsbCB0aGUgYmVmb3JlIHJlcXVlc3QgZnVuY3Rpb25zXG4gICAgY2FsbFJlc3BvbnNlID0gZG9DYWxsYmFja3MoYmVmb3JlUmVxdWVzdCwgcmVxdWVzdCwgcmVzcG9uc2UsIHtcbiAgICAgIGlkLFxuICAgICAgdW5pcXVlSWQsXG4gICAgICB0eXBlLFxuICAgICAgYm9keVxuICAgIH0pO1xuXG4gICAgLy8gQmxvY2sgdGhlIHJlcXVlc3QgaWYgb25lIG9mIGEgY2FsbGJhY2tzIGZhaWxlZFxuICAgIGlmIChjYWxsUmVzcG9uc2UgIT09IHRydWUpIHtcbiAgICAgIHJldHVybiByZXNwb25zZS5zZW5kKGNhbGxSZXNwb25zZSk7XG4gICAgfVxuXG4gICAgbGV0IGNvbm5lY3Rpb25BYm9ydGVkID0gZmFsc2U7XG5cbiAgICAvLyBJbiBjYXNlIHRoZSBjb25uZWN0aW9uIGlzIGNsb3NlZCwgZm9yY2UgdG8gYWJvcnQgZnVydGhlciBhY3Rpb25zXG4gICAgcmVxdWVzdC5zb2NrZXQub24oJ2Nsb3NlJywgKGhhZEVycm9ycykgPT4ge1xuICAgICAgaWYgKGhhZEVycm9ycykge1xuICAgICAgICBjb25uZWN0aW9uQWJvcnRlZCA9IHRydWU7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBsb2coNCwgYFtleHBvcnRdIEdvdCBhbiBpbmNvbWluZyBIVFRQIHJlcXVlc3Qgd2l0aCBJRCAke3VuaXF1ZUlkfS5gKTtcblxuICAgIGJvZHkuY29uc3RyID0gKHR5cGVvZiBib2R5LmNvbnN0ciA9PT0gJ3N0cmluZycgJiYgYm9keS5jb25zdHIpIHx8ICdjaGFydCc7XG5cbiAgICAvLyBHYXRoZXIgYW5kIG9yZ2FuaXplIG9wdGlvbnMgZnJvbSB0aGUgcGF5bG9hZFxuICAgIGNvbnN0IHJlcXVlc3RPcHRpb25zID0ge1xuICAgICAgZXhwb3J0OiB7XG4gICAgICAgIGluc3RyLFxuICAgICAgICB0eXBlLFxuICAgICAgICBjb25zdHI6IGJvZHkuY29uc3RyWzBdLnRvTG93ZXJDYXNlKCkgKyBib2R5LmNvbnN0ci5zdWJzdHIoMSksXG4gICAgICAgIGhlaWdodDogYm9keS5oZWlnaHQsXG4gICAgICAgIHdpZHRoOiBib2R5LndpZHRoLFxuICAgICAgICBzY2FsZTogYm9keS5zY2FsZSB8fCBkZWZhdWx0T3B0aW9ucy5leHBvcnQuc2NhbGUsXG4gICAgICAgIGdsb2JhbE9wdGlvbnM6IGlzQ29ycmVjdEpTT04oYm9keS5nbG9iYWxPcHRpb25zLCB0cnVlKSxcbiAgICAgICAgdGhlbWVPcHRpb25zOiBpc0NvcnJlY3RKU09OKGJvZHkudGhlbWVPcHRpb25zLCB0cnVlKVxuICAgICAgfSxcbiAgICAgIGN1c3RvbUxvZ2ljOiB7XG4gICAgICAgIGFsbG93Q29kZUV4ZWN1dGlvbjogZ2V0QWxsb3dDb2RlRXhlY3V0aW9uKCksXG4gICAgICAgIGFsbG93RmlsZVJlc291cmNlczogZmFsc2UsXG4gICAgICAgIHJlc291cmNlczogaXNDb3JyZWN0SlNPTihib2R5LnJlc291cmNlcywgdHJ1ZSksXG4gICAgICAgIGNhbGxiYWNrOiBib2R5LmNhbGxiYWNrLFxuICAgICAgICBjdXN0b21Db2RlOiBib2R5LmN1c3RvbUNvZGVcbiAgICAgIH1cbiAgICB9O1xuXG4gICAgaWYgKGluc3RyKSB7XG4gICAgICAvLyBTdHJpbmdpZnkgSlNPTiB3aXRoIG9wdGlvbnNcbiAgICAgIHJlcXVlc3RPcHRpb25zLmV4cG9ydC5pbnN0ciA9IG9wdGlvbnNTdHJpbmdpZnkoXG4gICAgICAgIGluc3RyLFxuICAgICAgICByZXF1ZXN0T3B0aW9ucy5jdXN0b21Mb2dpYy5hbGxvd0NvZGVFeGVjdXRpb25cbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gTWVyZ2UgdGhlIHJlcXVlc3Qgb3B0aW9ucyBpbnRvIGRlZmF1bHQgb25lc1xuICAgIGNvbnN0IG9wdGlvbnMgPSBtZXJnZUNvbmZpZ09wdGlvbnMoZGVmYXVsdE9wdGlvbnMsIHJlcXVlc3RPcHRpb25zKTtcblxuICAgIC8vIFNhdmUgdGhlIEpTT04gaWYgZXhpc3RzXG4gICAgb3B0aW9ucy5leHBvcnQub3B0aW9ucyA9IGluc3RyO1xuXG4gICAgLy8gTGFzdGx5LCBhZGQgdGhlIHNlcnZlciBzcGVjaWZpYyBhcmd1bWVudHMgaW50byBvcHRpb25zIGFzIHBheWxvYWRcbiAgICBvcHRpb25zLnBheWxvYWQgPSB7XG4gICAgICBzdmc6IGJvZHkuc3ZnIHx8IGZhbHNlLFxuICAgICAgYjY0OiBib2R5LmI2NCB8fCBmYWxzZSxcbiAgICAgIG5vRG93bmxvYWQ6IGJvZHkubm9Eb3dubG9hZCB8fCBmYWxzZSxcbiAgICAgIHJlcXVlc3RJZDogdW5pcXVlSWRcbiAgICB9O1xuXG4gICAgLy8gVGVzdCB4bGluazpocmVmIGVsZW1lbnRzIGZyb20gcGF5bG9hZCdzIFNWR1xuICAgIGlmIChib2R5LnN2ZyAmJiBpc1ByaXZhdGVSYW5nZVVybEZvdW5kKG9wdGlvbnMucGF5bG9hZC5zdmcpKSB7XG4gICAgICB0aHJvdyBuZXcgSHR0cEVycm9yKFxuICAgICAgICAnU1ZHIHBvdGVudGlhbGx5IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGZvcmJpZGRlbiBVUkwgaW4geGxpbms6aHJlZiBlbGVtZW50LiBQbGVhc2UgcmV2aWV3IHRoZSBTVkcgY29udGVudCBhbmQgZW5zdXJlIHRoYXQgYWxsIHJlZmVyZW5jZWQgVVJMcyBjb21wbHkgd2l0aCBzZWN1cml0eSBwb2xpY2llcy4nLFxuICAgICAgICA0MDBcbiAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gU3RhcnQgdGhlIGV4cG9ydCBwcm9jZXNzXG4gICAgYXdhaXQgc3RhcnRFeHBvcnQob3B0aW9ucywgKGVycm9yLCBpbmZvKSA9PiB7XG4gICAgICAvLyBSZW1vdmUgdGhlIGNsb3NlIGV2ZW50IGZyb20gdGhlIHNvY2tldFxuICAgICAgcmVxdWVzdC5zb2NrZXQucmVtb3ZlQWxsTGlzdGVuZXJzKCdjbG9zZScpO1xuXG4gICAgICAvLyBBZnRlciB0aGUgd2hvbGUgZXhwb3J0aW5nIHByb2Nlc3NcbiAgICAgIGlmIChkZWZhdWx0T3B0aW9ucy5zZXJ2ZXIuYmVuY2htYXJraW5nKSB7XG4gICAgICAgIGxvZyhcbiAgICAgICAgICA1LFxuICAgICAgICAgIGBbYmVuY2htYXJrXSBSZXF1ZXN0IHdpdGggSUQgJHt1bmlxdWVJZH0gLSBBZnRlciB0aGUgd2hvbGUgZXhwb3J0aW5nIHByb2Nlc3M6ICR7c3RvcENvdW50ZXIoKX1tcy5gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIHRoZSBjb25uZWN0aW9uIHdhcyBjbG9zZWQsIGRvIG5vdGhpbmdcbiAgICAgIGlmIChjb25uZWN0aW9uQWJvcnRlZCkge1xuICAgICAgICByZXR1cm4gbG9nKFxuICAgICAgICAgIDMsXG4gICAgICAgICAgYFtleHBvcnRdIFRoZSBjbGllbnQgY2xvc2VkIHRoZSBjb25uZWN0aW9uIGJlZm9yZSB0aGUgY2hhcnQgZmluaXNoZWQgcHJvY2Vzc2luZy5gXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIElmIGVycm9yLCBsb2cgaXQgYW5kIHNlbmQgaXQgdG8gdGhlIGVycm9yIG1pZGRsZXdhcmVcbiAgICAgIGlmIChlcnJvcikge1xuICAgICAgICB0aHJvdyBlcnJvcjtcbiAgICAgIH1cblxuICAgICAgLy8gSWYgZGF0YSBpcyBtaXNzaW5nLCBsb2cgdGhlIG1lc3NhZ2UgYW5kIHNlbmQgaXQgdG8gdGhlIGVycm9yIG1pZGRsZXdhcmVcbiAgICAgIGlmICghaW5mbyB8fCAhaW5mby5yZXN1bHQpIHtcbiAgICAgICAgdGhyb3cgbmV3IEh0dHBFcnJvcihcbiAgICAgICAgICBgVW5leHBlY3RlZCByZXR1cm4gZnJvbSBjaGFydCBnZW5lcmF0aW9uLiBQbGVhc2UgY2hlY2sgeW91ciByZXF1ZXN0IGRhdGEuIEZvciB0aGUgcmVxdWVzdCB3aXRoIElEICR7dW5pcXVlSWR9LCB0aGUgcmVzdWx0IGlzICR7aW5mby5yZXN1bHR9LmAsXG4gICAgICAgICAgNDAwXG4gICAgICAgICk7XG4gICAgICB9XG5cbiAgICAgIC8vIEdldCB0aGUgdHlwZSBmcm9tIG9wdGlvbnNcbiAgICAgIHR5cGUgPSBpbmZvLm9wdGlvbnMuZXhwb3J0LnR5cGU7XG5cbiAgICAgIC8vIFRoZSBhZnRlciByZXF1ZXN0IGNhbGxiYWNrc1xuICAgICAgZG9DYWxsYmFja3MoYWZ0ZXJSZXF1ZXN0LCByZXF1ZXN0LCByZXNwb25zZSwgeyBpZCwgYm9keTogaW5mby5yZXN1bHQgfSk7XG5cbiAgICAgIGlmIChpbmZvLnJlc3VsdCkge1xuICAgICAgICAvLyBJZiBvbmx5IGJhc2U2NCBpcyByZXF1aXJlZCwgcmV0dXJuIGl0XG4gICAgICAgIGlmIChib2R5LmI2NCkge1xuICAgICAgICAgIC8vIFNWRyBFeGNlcHRpb24gZm9yIHRoZSBIaWdoY2hhcnRzIDExLjMuMCB2ZXJzaW9uXG4gICAgICAgICAgaWYgKHR5cGUgPT09ICdwZGYnIHx8IHR5cGUgPT0gJ3N2ZycpIHtcbiAgICAgICAgICAgIHJldHVybiByZXNwb25zZS5zZW5kKFxuICAgICAgICAgICAgICBCdWZmZXIuZnJvbShpbmZvLnJlc3VsdCwgJ3V0ZjgnKS50b1N0cmluZygnYmFzZTY0JylcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIHJlc3BvbnNlLnNlbmQoaW5mby5yZXN1bHQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU2V0IGNvcnJlY3QgY29udGVudCB0eXBlXG4gICAgICAgIHJlc3BvbnNlLmhlYWRlcignQ29udGVudC1UeXBlJywgcmV2ZXJzZWRNaW1lW3R5cGVdIHx8ICdpbWFnZS9wbmcnKTtcblxuICAgICAgICAvLyBEZWNpZGUgd2hldGhlciB0byBkb3dubG9hZCBvciBub3QgY2hhcnQgZmlsZVxuICAgICAgICBpZiAoIWJvZHkubm9Eb3dubG9hZCkge1xuICAgICAgICAgIHJlc3BvbnNlLmF0dGFjaG1lbnQoXG4gICAgICAgICAgICBgJHtyZXF1ZXN0LnBhcmFtcy5maWxlbmFtZSB8fCByZXF1ZXN0LmJvZHkuZmlsZW5hbWUgfHwgJ2NoYXJ0J30uJHtcbiAgICAgICAgICAgICAgdHlwZSB8fCAncG5nJ1xuICAgICAgICAgICAgfWBcbiAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgU1ZHLCByZXR1cm4gcGxhaW4gY29udGVudFxuICAgICAgICByZXR1cm4gdHlwZSA9PT0gJ3N2ZydcbiAgICAgICAgICA/IHJlc3BvbnNlLnNlbmQoaW5mby5yZXN1bHQpXG4gICAgICAgICAgOiByZXNwb25zZS5zZW5kKEJ1ZmZlci5mcm9tKGluZm8ucmVzdWx0LCAnYmFzZTY0JykpO1xuICAgICAgfVxuICAgIH0pO1xuICB9IGNhdGNoIChlcnJvcikge1xuICAgIG5leHQoZXJyb3IpO1xuICB9XG59O1xuXG5leHBvcnQgZGVmYXVsdCAoYXBwKSA9PiB7XG4gIC8qKlxuICAgKiBBZGRzIHRoZSBQT1NUIC8gYSByb3V0ZSBmb3IgaGFuZGxpbmcgUE9TVCByZXF1ZXN0cyBhdCB0aGUgcm9vdCBlbmRwb2ludC5cbiAgICovXG4gIGFwcC5wb3N0KCcvJywgZXhwb3J0SGFuZGxlcik7XG5cbiAgLyoqXG4gICAqIEFkZHMgdGhlIFBPU1QgLzpmaWxlbmFtZSBhIHJvdXRlIGZvciBoYW5kbGluZyBQT1NUIHJlcXVlc3RzIHdpdGhcbiAgICogYSBzcGVjaWZpZWQgZmlsZW5hbWUgcGFyYW1ldGVyLlxuICAgKi9cbiAgYXBwLnBvc3QoJy86ZmlsZW5hbWUnLCBleHBvcnRIYW5kbGVyKTtcbn07XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5IaWdoY2hhcnRzIEV4cG9ydCBTZXJ2ZXJcblxuQ29weXJpZ2h0IChjKSAyMDE2LTIwMjQsIEhpZ2hzb2Z0XG5cbkxpY2VuY2VkIHVuZGVyIHRoZSBNSVQgbGljZW5jZS5cblxuQWRkaXRpb25hbGx5IGEgdmFsaWQgSGlnaGNoYXJ0cyBsaWNlbnNlIGlzIHJlcXVpcmVkIGZvciB1c2UuXG5cblNlZSBMSUNFTlNFIGZpbGUgaW4gcm9vdCBmb3IgZGV0YWlscy5cblxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgcmVhZEZpbGVTeW5jIH0gZnJvbSAnZnMnO1xuaW1wb3J0IHsgam9pbiBhcyBwYXRoZXIgfSBmcm9tICdwYXRoJztcbmltcG9ydCB7IGxvZyB9IGZyb20gJy4uLy4uL2xvZ2dlci5qcyc7XG5cbmltcG9ydCB7IHZlcnNpb24gfSBmcm9tICcuLi8uLi9jYWNoZS5qcyc7XG5pbXBvcnQgeyBhZGRJbnRlcnZhbCB9IGZyb20gJy4uLy4uL2ludGVydmFscy5qcyc7XG5pbXBvcnQgcG9vbCBmcm9tICcuLi8uLi9wb29sLmpzJztcbmltcG9ydCB7IF9fZGlybmFtZSB9IGZyb20gJy4uLy4uL3V0aWxzLmpzJztcblxuY29uc3QgcGtnRmlsZSA9IEpTT04ucGFyc2UocmVhZEZpbGVTeW5jKHBhdGhlcihfX2Rpcm5hbWUsICdwYWNrYWdlLmpzb24nKSkpO1xuXG5jb25zdCBzZXJ2ZXJTdGFydFRpbWUgPSBuZXcgRGF0ZSgpO1xuXG5jb25zdCBzdWNjZXNzUmF0ZXMgPSBbXTtcbmNvbnN0IHJlY29yZEludGVydmFsID0gNjAgKiAxMDAwOyAvLyByZWNvcmQgZXZlcnkgbWludXRlXG5jb25zdCB3aW5kb3dTaXplID0gMzA7IC8vIDMwIG1pbnV0ZXNcblxuLyoqXG4gKiBDYWxjdWxhdGVzIG1vdmluZyBhdmVyYWdlIGluZGljYXRvciBiYXNlZCBvbiB0aGUgZGF0YSBmcm9tIHRoZSBzdWNjZXNzUmF0ZXNcbiAqIGFycmF5LlxuICpcbiAqIEByZXR1cm5zIHtudW1iZXJ9IC0gQSBtb3ZpbmcgYXZlcmFnZSBmb3Igc3VjY2VzcyByYXRpbyBvZiB0aGUgc2VydmVyIGV4cG9ydHMuXG4gKi9cbmZ1bmN0aW9uIGNhbGN1bGF0ZU1vdmluZ0F2ZXJhZ2UoKSB7XG4gIGNvbnN0IHN1bSA9IHN1Y2Nlc3NSYXRlcy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiLCAwKTtcbiAgcmV0dXJuIHN1bSAvIHN1Y2Nlc3NSYXRlcy5sZW5ndGg7XG59XG5cbi8qKlxuICogU3RhcnRzIHRoZSBpbnRlcnZhbCByZXNwb25zaWJsZSBmb3IgY2FsY3VsYXRpbmcgY3VycmVudCBzdWNjZXNzIHJhdGUgcmF0aW9cbiAqIGFuZCBnYXRoZXJzXG4gKlxuICogQHJldHVybnMge05vZGVKUy5UaW1lb3V0fSBpZCAtIElkIG9mIGFuIGludGVydmFsLlxuICovXG5leHBvcnQgY29uc3Qgc3RhcnRTdWNjZXNzUmF0ZSA9ICgpID0+XG4gIHNldEludGVydmFsKCgpID0+IHtcbiAgICBjb25zdCBzdGF0cyA9IHBvb2wuZ2V0U3RhdHMoKTtcbiAgICBjb25zdCBzdWNjZXNzUmF0aW8gPVxuICAgICAgc3RhdHMuZXhwb3J0QXR0ZW1wdHMgPT09IDBcbiAgICAgICAgPyAxXG4gICAgICAgIDogKHN0YXRzLnBlcmZvcm1lZEV4cG9ydHMgLyBzdGF0cy5leHBvcnRBdHRlbXB0cykgKiAxMDA7XG5cbiAgICBzdWNjZXNzUmF0ZXMucHVzaChzdWNjZXNzUmF0aW8pO1xuICAgIGlmIChzdWNjZXNzUmF0ZXMubGVuZ3RoID4gd2luZG93U2l6ZSkge1xuICAgICAgc3VjY2Vzc1JhdGVzLnNoaWZ0KCk7XG4gICAgfVxuICB9LCByZWNvcmRJbnRlcnZhbCk7XG5cbi8qKlxuICogQWRkcyB0aGUgL2hlYWx0aCBhbmQgL3N1Y2Nlc3MtbW92aW5nLWF2ZXJhZ2Ugcm91dGVzXG4gKiB3aGljaCBvdXRwdXQgYmFzaWMgc3RhdHMgZm9yIHRoZSBzZXJ2ZXIuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIGFkZEhlYWx0aFJvdXRlcyhhcHApIHtcbiAgaWYgKCFhcHApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICAvLyBTdGFydCBwcm9jZXNzaW5nIHN1Y2Nlc3MgcmF0ZSByYXRpbyBpbnRlcnZhbCBhbmQgc2F2ZSBpdHMgaWQgdG8gdGhlIGFycmF5XG4gIC8vIGZvciB0aGUgZ3JhY2VmdWwgY2xlYXJpbmcgb24gc2h1dGRvd24gd2l0aCBpbmplY3RlZCBhZGRJbnRlcnZhbCBmdW50aW9uXG4gIGFkZEludGVydmFsKHN0YXJ0U3VjY2Vzc1JhdGUoKSk7XG5cbiAgYXBwLmdldCgnL2hlYWx0aCcsIChfLCByZXMpID0+IHtcbiAgICBjb25zdCBzdGF0cyA9IHBvb2wuZ2V0U3RhdHMoKTtcbiAgICBjb25zdCBwZXJpb2QgPSBzdWNjZXNzUmF0ZXMubGVuZ3RoO1xuICAgIGNvbnN0IG1vdmluZ0F2ZXJhZ2UgPSBjYWxjdWxhdGVNb3ZpbmdBdmVyYWdlKCk7XG5cbiAgICBsb2coNCwgJ1toZWFsdGguanNdIEdFVCAvaGVhbHRoIFsyMDBdIC0gcmV0dXJuaW5nIHNlcnZlciBoZWFsdGguJyk7XG5cbiAgICByZXMuc2VuZCh7XG4gICAgICBzdGF0dXM6ICdPSycsXG4gICAgICBib290VGltZTogc2VydmVyU3RhcnRUaW1lLFxuICAgICAgdXB0aW1lOlxuICAgICAgICBNYXRoLmZsb29yKFxuICAgICAgICAgIChuZXcgRGF0ZSgpLmdldFRpbWUoKSAtIHNlcnZlclN0YXJ0VGltZS5nZXRUaW1lKCkpIC8gMTAwMCAvIDYwXG4gICAgICAgICkgKyAnIG1pbnV0ZXMnLFxuICAgICAgdmVyc2lvbjogcGtnRmlsZS52ZXJzaW9uLFxuICAgICAgaGlnaGNoYXJ0c1ZlcnNpb246IHZlcnNpb24oKSxcbiAgICAgIGF2ZXJhZ2VQcm9jZXNzaW5nVGltZTogc3RhdHMuc3BlbnRBdmVyYWdlLFxuICAgICAgcGVyZm9ybWVkRXhwb3J0czogc3RhdHMucGVyZm9ybWVkRXhwb3J0cyxcbiAgICAgIGZhaWxlZEV4cG9ydHM6IHN0YXRzLmRyb3BwZWRFeHBvcnRzLFxuICAgICAgZXhwb3J0QXR0ZW1wdHM6IHN0YXRzLmV4cG9ydEF0dGVtcHRzLFxuICAgICAgc3VjZXNzUmF0aW86IChzdGF0cy5wZXJmb3JtZWRFeHBvcnRzIC8gc3RhdHMuZXhwb3J0QXR0ZW1wdHMpICogMTAwLFxuICAgICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIGltcG9ydC9uby1uYW1lZC1hcy1kZWZhdWx0LW1lbWJlclxuICAgICAgcG9vbDogcG9vbC5nZXRQb29sSW5mb0pTT04oKSxcblxuICAgICAgLy8gTW92aW5nIGF2ZXJhZ2VcbiAgICAgIHBlcmlvZCxcbiAgICAgIG1vdmluZ0F2ZXJhZ2UsXG4gICAgICBtZXNzYWdlOlxuICAgICAgICBpc05hTihtb3ZpbmdBdmVyYWdlKSB8fCAhc3VjY2Vzc1JhdGVzLmxlbmd0aFxuICAgICAgICAgID8gJ1RvbyBlYXJseSB0byByZXBvcnQuIE5vIGV4cG9ydHMgbWFkZSB5ZXQuIFBsZWFzZSBjaGVjayBiYWNrIHNvb24uJ1xuICAgICAgICAgIDogYExhc3QgJHtwZXJpb2R9IG1pbnV0ZXMgaGFkIGEgc3VjY2VzcyByYXRlIG9mICR7bW92aW5nQXZlcmFnZS50b0ZpeGVkKDIpfSUuYCxcblxuICAgICAgLy8gU1ZHL0pTT04gYXR0ZW1wdHNcbiAgICAgIHN2Z0V4cG9ydEF0dGVtcHRzOiBzdGF0cy5leHBvcnRGcm9tU3ZnQXR0ZW1wdHMsXG4gICAgICBqc29uRXhwb3J0QXR0ZW1wdHM6IHN0YXRzLnBlcmZvcm1lZEV4cG9ydHMgLSBzdGF0cy5leHBvcnRGcm9tU3ZnQXR0ZW1wdHNcbiAgICB9KTtcbiAgfSk7XG59XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5IaWdoY2hhcnRzIEV4cG9ydCBTZXJ2ZXJcblxuQ29weXJpZ2h0IChjKSAyMDE2LTIwMjQsIEhpZ2hzb2Z0XG5cbkxpY2VuY2VkIHVuZGVyIHRoZSBNSVQgbGljZW5jZS5cblxuQWRkaXRpb25hbGx5IGEgdmFsaWQgSGlnaGNoYXJ0cyBsaWNlbnNlIGlzIHJlcXVpcmVkIGZvciB1c2UuXG5cblNlZSBMSUNFTlNFIGZpbGUgaW4gcm9vdCBmb3IgZGV0YWlscy5cblxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgcHJvbWlzZXMgYXMgZnNQcm9taXNlcyB9IGZyb20gJ2ZzJztcbmltcG9ydCB7IHBvc2l4IH0gZnJvbSAncGF0aCc7XG5cbmltcG9ydCBjb3JzIGZyb20gJ2NvcnMnO1xuaW1wb3J0IGV4cHJlc3MgZnJvbSAnZXhwcmVzcyc7XG5pbXBvcnQgaHR0cCBmcm9tICdodHRwJztcbmltcG9ydCBodHRwcyBmcm9tICdodHRwcyc7XG5pbXBvcnQgbXVsdGVyIGZyb20gJ211bHRlcic7XG5cbmltcG9ydCBlcnJvckhhbmRsZXIgZnJvbSAnLi9lcnJvci5qcyc7XG5pbXBvcnQgcmF0ZUxpbWl0IGZyb20gJy4vcmF0ZV9saW1pdC5qcyc7XG5pbXBvcnQgeyBsb2csIGxvZ1dpdGhTdGFjayB9IGZyb20gJy4uL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBfX2Rpcm5hbWUgfSBmcm9tICcuLi91dGlscy5qcyc7XG5cbmltcG9ydCB2U3dpdGNoUm91dGUgZnJvbSAnLi9yb3V0ZXMvY2hhbmdlX2hjX3ZlcnNpb24uanMnO1xuaW1wb3J0IGV4cG9ydFJvdXRlcyBmcm9tICcuL3JvdXRlcy9leHBvcnQuanMnO1xuaW1wb3J0IGhlYWx0aFJvdXRlIGZyb20gJy4vcm91dGVzL2hlYWx0aC5qcyc7XG5pbXBvcnQgdWlSb3V0ZSBmcm9tICcuL3JvdXRlcy91aS5qcyc7XG5cbmltcG9ydCBFeHBvcnRFcnJvciBmcm9tICcuLi9lcnJvcnMvRXhwb3J0RXJyb3IuanMnO1xuXG4vLyBBcnJheSBvZiBhbiBhY3RpdmUgc2VydmVyc1xuY29uc3QgYWN0aXZlU2VydmVycyA9IG5ldyBNYXAoKTtcblxuLy8gQ3JlYXRlIGV4cHJlc3MgYXBwXG5jb25zdCBhcHAgPSBleHByZXNzKCk7XG5cbi8vIERpc2FibGUgdGhlIFgtUG93ZXJlZC1CeSBoZWFkZXJcbmFwcC5kaXNhYmxlKCd4LXBvd2VyZWQtYnknKTtcblxuLy8gRW5hYmxlIENPUlMgc3VwcG9ydFxuYXBwLnVzZShjb3JzKCkpO1xuXG4vLyBHZXR0aW5nIGEgbG90IG9mIFJhbmdlTm90U2F0aXNmaWFibGVFcnJvciBleGNlcHRpb24uXG4vLyBFdmVuIHRob3VnaCB0aGlzIGlzIGEgZGVwcmVjYXRlZCBvcHRpb25zLCBsZXQncyB0cnkgdG8gc2V0IGl0IHRvIGZhbHNlLlxuYXBwLnVzZSgoX3JlcSwgcmVzLCBuZXh0KSA9PiB7XG4gIHJlcy5zZXQoJ0FjY2VwdC1SYW5nZXMnLCAnbm9uZScpO1xuICBuZXh0KCk7XG59KTtcblxuLyoqXG4gKiBBdHRhY2ggZXJyb3IgaGFuZGxlcnMgdG8gdGhlIHNlcnZlci5cbiAqXG4gKiBAcGFyYW0ge2h0dHAuU2VydmVyfSBzZXJ2ZXIgLSBUaGUgSFRUUC9IVFRQUyBzZXJ2ZXIgaW5zdGFuY2UuXG4gKi9cbmNvbnN0IGF0dGFjaFNlcnZlckVycm9ySGFuZGxlcnMgPSAoc2VydmVyKSA9PiB7XG4gIHNlcnZlci5vbignY2xpZW50RXJyb3InLCAoZXJyb3IsIHNvY2tldCkgPT4ge1xuICAgIGxvZ1dpdGhTdGFjayhcbiAgICAgIDEsXG4gICAgICBlcnJvcixcbiAgICAgIGBbc2VydmVyXSBDbGllbnQgZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX0sIGRlc3Ryb3lpbmcgc29ja2V0LmBcbiAgICApO1xuICAgIHNvY2tldC5kZXN0cm95KCk7XG4gIH0pO1xuXG4gIHNlcnZlci5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICBsb2dXaXRoU3RhY2soMSwgZXJyb3IsIGBbc2VydmVyXSBTZXJ2ZXIgZXJyb3I6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbiAgfSk7XG5cbiAgc2VydmVyLm9uKCdjb25uZWN0aW9uJywgKHNvY2tldCkgPT4ge1xuICAgIHNvY2tldC5vbignZXJyb3InLCAoZXJyb3IpID0+IHtcbiAgICAgIGxvZ1dpdGhTdGFjaygxLCBlcnJvciwgYFtzZXJ2ZXJdIFNvY2tldCBlcnJvcjogJHtlcnJvci5tZXNzYWdlfWApO1xuICAgIH0pO1xuICB9KTtcbn07XG5cbi8qKlxuICogU3RhcnRzIGFuIEhUVFAgc2VydmVyIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBjb25maWd1cmF0aW9uLiBUaGUgYHNlcnZlckNvbmZpZ2BcbiAqIG9iamVjdCBjb250YWlucyBhbGwgc2VydmVyIHJlbGF0ZWQgcHJvcGVydGllcyAoc2VlIHRoZSBgc2VydmVyYCBzZWN0aW9uXG4gKiBpbiB0aGUgYGxpYi9zY2hlbWFzL2NvbmZpZy5qc2AgZmlsZSBmb3IgYSByZWZlcmVuY2UpLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBzZXJ2ZXJDb25maWcgLSBUaGUgc2VydmVyIGNvbmZpZ3VyYXRpb24gb2JqZWN0LlxuICpcbiAqIEB0aHJvd3Mge0V4cG9ydEVycm9yfSAtIFRocm93cyBhbiBlcnJvciBpZiB0aGUgc2VydmVyIGNhbm5vdCBiZSBjb25maWd1cmVkXG4gKiBhbmQgc3RhcnRlZC5cbiAqL1xuZXhwb3J0IGNvbnN0IHN0YXJ0U2VydmVyID0gYXN5bmMgKHNlcnZlckNvbmZpZykgPT4ge1xuICB0cnkge1xuICAgIC8vIFRPRE86IFJlYWQgZnJvbSBjb25maWcvZW52XG4gICAgLy8gTk9URTpcbiAgICAvLyBUb28gYmlnIGxpbWl0cyBsZWFkIHRvIHRpbWVvdXRzIGluIHRoZSBleHBvcnQgcHJvY2VzcyB3aGVuIHRoZVxuICAgIC8vIHJhc3Rlcml6YXRpb24gdGltZW91dCBpcyBzZXQgdG9vIGxvdy5cbiAgICBjb25zdCB1cGxvYWRMaW1pdE1pQiA9IHNlcnZlckNvbmZpZy5tYXhVcGxvYWRTaXplIHx8IDM7XG4gICAgY29uc3QgdXBsb2FkTGltaXRCeXRlcyA9IHVwbG9hZExpbWl0TWlCICogMTAyNCAqIDEwMjQ7XG5cbiAgICAvLyBFbmFibGUgcGFyc2luZyBvZiBmb3JtIGRhdGEgKGZpbGVzKSB3aXRoIE11bHRlciBwYWNrYWdlXG4gICAgY29uc3Qgc3RvcmFnZSA9IG11bHRlci5tZW1vcnlTdG9yYWdlKCk7XG4gICAgY29uc3QgdXBsb2FkID0gbXVsdGVyKHtcbiAgICAgIHN0b3JhZ2UsXG4gICAgICBsaW1pdHM6IHtcbiAgICAgICAgZmllbGRTaXplOiB1cGxvYWRMaW1pdEJ5dGVzXG4gICAgICB9XG4gICAgfSk7XG5cbiAgICAvLyBFbmFibGUgYm9keSBwYXJzZXJcbiAgICBhcHAudXNlKGV4cHJlc3MuanNvbih7IGxpbWl0OiB1cGxvYWRMaW1pdEJ5dGVzIH0pKTtcbiAgICBhcHAudXNlKGV4cHJlc3MudXJsZW5jb2RlZCh7IGV4dGVuZGVkOiB0cnVlLCBsaW1pdDogdXBsb2FkTGltaXRCeXRlcyB9KSk7XG5cbiAgICAvLyBVc2Ugb25seSBub24tZmlsZSBtdWx0aXBhcnQgZm9ybSBmaWVsZHNcbiAgICBhcHAudXNlKHVwbG9hZC5ub25lKCkpO1xuXG4gICAgLy8gU3RvcCBpZiBub3QgZW5hYmxlZFxuICAgIGlmICghc2VydmVyQ29uZmlnLmVuYWJsZSkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIExpc3RlbiBIVFRQIHNlcnZlclxuICAgIGlmICghc2VydmVyQ29uZmlnLnNzbC5mb3JjZSkge1xuICAgICAgLy8gTWFpbiBzZXJ2ZXIgaW5zdGFuY2UgKEhUVFApXG4gICAgICBjb25zdCBodHRwU2VydmVyID0gaHR0cC5jcmVhdGVTZXJ2ZXIoYXBwKTtcblxuICAgICAgLy8gQXR0YWNoIGVycm9yIGhhbmRsZXJzIGFuZCBsaXN0ZW4gdG8gdGhlIHNlcnZlclxuICAgICAgYXR0YWNoU2VydmVyRXJyb3JIYW5kbGVycyhodHRwU2VydmVyKTtcblxuICAgICAgLy8gTGlzdGVuXG4gICAgICBodHRwU2VydmVyLmxpc3RlbihzZXJ2ZXJDb25maWcucG9ydCwgc2VydmVyQ29uZmlnLmhvc3QpO1xuXG4gICAgICAvLyBTYXZlIHRoZSByZWZlcmVuY2UgdG8gSFRUUCBzZXJ2ZXJcbiAgICAgIGFjdGl2ZVNlcnZlcnMuc2V0KHNlcnZlckNvbmZpZy5wb3J0LCBodHRwU2VydmVyKTtcblxuICAgICAgbG9nKFxuICAgICAgICAzLFxuICAgICAgICBgW3NlcnZlcl0gU3RhcnRlZCBIVFRQIHNlcnZlciBvbiAke3NlcnZlckNvbmZpZy5ob3N0fToke3NlcnZlckNvbmZpZy5wb3J0fS5gXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIExpc3RlbiBIVFRQUyBzZXJ2ZXJcbiAgICBpZiAoc2VydmVyQ29uZmlnLnNzbC5lbmFibGUpIHtcbiAgICAgIC8vIFNldCB1cCBhbiBTU0wgc2VydmVyIGFsc29cbiAgICAgIGxldCBrZXksIGNlcnQ7XG5cbiAgICAgIHRyeSB7XG4gICAgICAgIC8vIEdldCB0aGUgU1NMIGtleVxuICAgICAgICBrZXkgPSBhd2FpdCBmc1Byb21pc2VzLnJlYWRGaWxlKFxuICAgICAgICAgIHBvc2l4LmpvaW4oc2VydmVyQ29uZmlnLnNzbC5jZXJ0UGF0aCwgJ3NlcnZlci5rZXknKSxcbiAgICAgICAgICAndXRmOCdcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBHZXQgdGhlIFNTTCBjZXJ0aWZpY2F0ZVxuICAgICAgICBjZXJ0ID0gYXdhaXQgZnNQcm9taXNlcy5yZWFkRmlsZShcbiAgICAgICAgICBwb3NpeC5qb2luKHNlcnZlckNvbmZpZy5zc2wuY2VydFBhdGgsICdzZXJ2ZXIuY3J0JyksXG4gICAgICAgICAgJ3V0ZjgnXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlcnJvcikge1xuICAgICAgICBsb2coXG4gICAgICAgICAgMixcbiAgICAgICAgICBgW3NlcnZlcl0gVW5hYmxlIHRvIGxvYWQga2V5L2NlcnRpZmljYXRlIGZyb20gdGhlICcke3NlcnZlckNvbmZpZy5zc2wuY2VydFBhdGh9JyBwYXRoLiBDb3VsZCBub3QgcnVuIHNlY3VyZWQgbGF5ZXIgc2VydmVyLmBcbiAgICAgICAgKTtcbiAgICAgIH1cblxuICAgICAgaWYgKGtleSAmJiBjZXJ0KSB7XG4gICAgICAgIC8vIE1haW4gc2VydmVyIGluc3RhbmNlIChIVFRQUylcbiAgICAgICAgY29uc3QgaHR0cHNTZXJ2ZXIgPSBodHRwcy5jcmVhdGVTZXJ2ZXIoeyBrZXksIGNlcnQgfSwgYXBwKTtcblxuICAgICAgICAvLyBBdHRhY2ggZXJyb3IgaGFuZGxlcnMgYW5kIGxpc3RlbiB0byB0aGUgc2VydmVyXG4gICAgICAgIGF0dGFjaFNlcnZlckVycm9ySGFuZGxlcnMoaHR0cHNTZXJ2ZXIpO1xuXG4gICAgICAgIC8vIExpc3RlblxuICAgICAgICBodHRwc1NlcnZlci5saXN0ZW4oc2VydmVyQ29uZmlnLnNzbC5wb3J0LCBzZXJ2ZXJDb25maWcuaG9zdCk7XG5cbiAgICAgICAgLy8gU2F2ZSB0aGUgcmVmZXJlbmNlIHRvIEhUVFBTIHNlcnZlclxuICAgICAgICBhY3RpdmVTZXJ2ZXJzLnNldChzZXJ2ZXJDb25maWcuc3NsLnBvcnQsIGh0dHBzU2VydmVyKTtcblxuICAgICAgICBsb2coXG4gICAgICAgICAgMyxcbiAgICAgICAgICBgW3NlcnZlcl0gU3RhcnRlZCBIVFRQUyBzZXJ2ZXIgb24gJHtzZXJ2ZXJDb25maWcuaG9zdH06JHtzZXJ2ZXJDb25maWcuc3NsLnBvcnR9LmBcbiAgICAgICAgKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBFbmFibGUgdGhlIHJhdGUgbGltaXRlciBpZiBjb25maWcgc2F5cyBzb1xuICAgIGlmIChcbiAgICAgIHNlcnZlckNvbmZpZy5yYXRlTGltaXRpbmcgJiZcbiAgICAgIHNlcnZlckNvbmZpZy5yYXRlTGltaXRpbmcuZW5hYmxlICYmXG4gICAgICAhWzAsIE5hTl0uaW5jbHVkZXMoc2VydmVyQ29uZmlnLnJhdGVMaW1pdGluZy5tYXhSZXF1ZXN0cylcbiAgICApIHtcbiAgICAgIHJhdGVMaW1pdChhcHAsIHNlcnZlckNvbmZpZy5yYXRlTGltaXRpbmcpO1xuICAgIH1cblxuICAgIC8vIFNldCB1cCBzdGF0aWMgZm9sZGVyJ3Mgcm91dGVcbiAgICBhcHAudXNlKGV4cHJlc3Muc3RhdGljKHBvc2l4LmpvaW4oX19kaXJuYW1lLCAncHVibGljJykpKTtcblxuICAgIC8vIFNldCB1cCByb3V0ZXNcbiAgICBoZWFsdGhSb3V0ZShhcHApO1xuICAgIGV4cG9ydFJvdXRlcyhhcHApO1xuICAgIHVpUm91dGUoYXBwKTtcbiAgICB2U3dpdGNoUm91dGUoYXBwKTtcblxuICAgIC8vIFNldCB1cCBjZW50cmFsaXplZCBlcnJvciBoYW5kbGVyXG4gICAgZXJyb3JIYW5kbGVyKGFwcCk7XG4gIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgdGhyb3cgbmV3IEV4cG9ydEVycm9yKFxuICAgICAgJ1tzZXJ2ZXJdIENvdWxkIG5vdCBjb25maWd1cmUgYW5kIHN0YXJ0IHRoZSBzZXJ2ZXIuJ1xuICAgICkuc2V0RXJyb3IoZXJyb3IpO1xuICB9XG59O1xuXG4vKipcbiAqIENsb3NlcyBhbGwgc2VydmVycyBhc3NvY2lhdGVkIHdpdGggRXhwcmVzcyBhcHAgaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBjb25zdCBjbG9zZVNlcnZlcnMgPSAoKSA9PiB7XG4gIGxvZyg0LCBgW3NlcnZlcl0gQ2xvc2luZyBhbGwgc2VydmVycy5gKTtcbiAgZm9yIChjb25zdCBbcG9ydCwgc2VydmVyXSBvZiBhY3RpdmVTZXJ2ZXJzKSB7XG4gICAgc2VydmVyLmNsb3NlKCgpID0+IHtcbiAgICAgIGFjdGl2ZVNlcnZlcnMuZGVsZXRlKHBvcnQpO1xuICAgICAgbG9nKDQsIGBbc2VydmVyXSBDbG9zZWQgc2VydmVyIG9uIHBvcnQ6ICR7cG9ydH0uYCk7XG4gICAgfSk7XG4gIH1cbn07XG5cbi8qKlxuICogR2V0IGFsbCBzZXJ2ZXJzIGFzc29jaWF0ZWQgd2l0aCBFeHByZXNzIGFwcCBpbnN0YW5jZS5cbiAqXG4gKiBAcmV0dXJucyB7QXJyYXl9IC0gU2VydmVycyBhc3NvY2lhdGVkIHdpdGggRXhwcmVzcyBhcHAgaW5zdGFuY2UuXG4gKi9cbmV4cG9ydCBjb25zdCBnZXRTZXJ2ZXJzID0gKCkgPT4gYWN0aXZlU2VydmVycztcblxuLyoqXG4gKiBFbmFibGUgcmF0ZSBsaW1pdGluZyBmb3IgdGhlIHNlcnZlci5cbiAqXG4gKiBAcGFyYW0ge09iamVjdH0gbGltaXRDb25maWcgLSBDb25maWd1cmF0aW9uIG9iamVjdCBmb3IgcmF0ZSBsaW1pdGluZy5cbiAqL1xuZXhwb3J0IGNvbnN0IGVuYWJsZVJhdGVMaW1pdGluZyA9IChsaW1pdENvbmZpZykgPT4gcmF0ZUxpbWl0KGFwcCwgbGltaXRDb25maWcpO1xuXG4vKipcbiAqIEdldCB0aGUgRXhwcmVzcyBpbnN0YW5jZS5cbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fSAtIFRoZSBFeHByZXNzIGluc3RhbmNlLlxuICovXG5leHBvcnQgY29uc3QgZ2V0RXhwcmVzcyA9ICgpID0+IGV4cHJlc3M7XG5cbi8qKlxuICogR2V0IHRoZSBFeHByZXNzIGFwcCBpbnN0YW5jZS5cbiAqXG4gKiBAcmV0dXJucyB7T2JqZWN0fSAtIFRoZSBFeHByZXNzIGFwcCBpbnN0YW5jZS5cbiAqL1xuZXhwb3J0IGNvbnN0IGdldEFwcCA9ICgpID0+IGFwcDtcblxuLyoqXG4gKiBBcHBseSBtaWRkbGV3YXJlKHMpIHRvIGEgc3BlY2lmaWMgcGF0aC5cbiAqXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCAtIFRoZSBwYXRoIHRvIHdoaWNoIHRoZSBtaWRkbGV3YXJlKHMpIHNob3VsZCBiZSBhcHBsaWVkLlxuICogQHBhcmFtIHsuLi5GdW5jdGlvbn0gbWlkZGxld2FyZXMgLSBUaGUgbWlkZGxld2FyZSBmdW5jdGlvbnMgdG8gYmUgYXBwbGllZC5cbiAqL1xuZXhwb3J0IGNvbnN0IHVzZSA9IChwYXRoLCAuLi5taWRkbGV3YXJlcykgPT4ge1xuICBhcHAudXNlKHBhdGgsIC4uLm1pZGRsZXdhcmVzKTtcbn07XG5cbi8qKlxuICogU2V0IHVwIGEgcm91dGUgd2l0aCBHRVQgbWV0aG9kIGFuZCBhcHBseSBtaWRkbGV3YXJlKHMpLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gVGhlIHJvdXRlIHBhdGguXG4gKiBAcGFyYW0gey4uLkZ1bmN0aW9ufSBtaWRkbGV3YXJlcyAtIFRoZSBtaWRkbGV3YXJlIGZ1bmN0aW9ucyB0byBiZSBhcHBsaWVkLlxuICovXG5leHBvcnQgY29uc3QgZ2V0ID0gKHBhdGgsIC4uLm1pZGRsZXdhcmVzKSA9PiB7XG4gIGFwcC5nZXQocGF0aCwgLi4ubWlkZGxld2FyZXMpO1xufTtcblxuLyoqXG4gKiBTZXQgdXAgYSByb3V0ZSB3aXRoIFBPU1QgbWV0aG9kIGFuZCBhcHBseSBtaWRkbGV3YXJlKHMpLlxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBwYXRoIC0gVGhlIHJvdXRlIHBhdGguXG4gKiBAcGFyYW0gey4uLkZ1bmN0aW9ufSBtaWRkbGV3YXJlcyAtIFRoZSBtaWRkbGV3YXJlIGZ1bmN0aW9ucyB0byBiZSBhcHBsaWVkLlxuICovXG5leHBvcnQgY29uc3QgcG9zdCA9IChwYXRoLCAuLi5taWRkbGV3YXJlcykgPT4ge1xuICBhcHAucG9zdChwYXRoLCAuLi5taWRkbGV3YXJlcyk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCB7XG4gIHN0YXJ0U2VydmVyLFxuICBjbG9zZVNlcnZlcnMsXG4gIGdldFNlcnZlcnMsXG4gIGVuYWJsZVJhdGVMaW1pdGluZyxcbiAgZ2V0RXhwcmVzcyxcbiAgZ2V0QXBwLFxuICB1c2UsXG4gIGdldCxcbiAgcG9zdFxufTtcbiIsIi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbkhpZ2hjaGFydHMgRXhwb3J0IFNlcnZlclxuXG5Db3B5cmlnaHQgKGMpIDIwMTYtMjAyNCwgSGlnaHNvZnRcblxuTGljZW5jZWQgdW5kZXIgdGhlIE1JVCBsaWNlbmNlLlxuXG5BZGRpdGlvbmFsbHkgYSB2YWxpZCBIaWdoY2hhcnRzIGxpY2Vuc2UgaXMgcmVxdWlyZWQgZm9yIHVzZS5cblxuU2VlIExJQ0VOU0UgZmlsZSBpbiByb290IGZvciBkZXRhaWxzLlxuXG4qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqL1xuXG5pbXBvcnQgeyBqb2luIH0gZnJvbSAncGF0aCc7XG5cbmltcG9ydCB7IF9fZGlybmFtZSB9IGZyb20gJy4uLy4uL3V0aWxzLmpzJztcblxuLyoqXG4gKiBBZGRzIHRoZSBHRVQgLyByb3V0ZSBmb3IgYSBVSSB3aGVuIGVuYWJsZWQgb24gdGhlIGV4cG9ydCBzZXJ2ZXIuXG4gKi9cbmV4cG9ydCBkZWZhdWx0IChhcHApID0+XG4gICFhcHBcbiAgICA/IGZhbHNlXG4gICAgOiBhcHAuZ2V0KCcvJywgKF9yZXF1ZXN0LCByZXNwb25zZSkgPT4ge1xuICAgICAgICByZXNwb25zZS5zZW5kRmlsZShqb2luKF9fZGlybmFtZSwgJ3B1YmxpYycsICdpbmRleC5odG1sJyksIHtcbiAgICAgICAgICBhY2NlcHRSYW5nZXM6IGZhbHNlXG4gICAgICAgIH0pO1xuICAgICAgfSk7XG4iLCIvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5IaWdoY2hhcnRzIEV4cG9ydCBTZXJ2ZXJcblxuQ29weXJpZ2h0IChjKSAyMDE2LTIwMjQsIEhpZ2hzb2Z0XG5cbkxpY2VuY2VkIHVuZGVyIHRoZSBNSVQgbGljZW5jZS5cblxuQWRkaXRpb25hbGx5IGEgdmFsaWQgSGlnaGNoYXJ0cyBsaWNlbnNlIGlzIHJlcXVpcmVkIGZvciB1c2UuXG5cblNlZSBMSUNFTlNFIGZpbGUgaW4gcm9vdCBmb3IgZGV0YWlscy5cblxuKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi9cblxuaW1wb3J0IHsgY2xlYXJBbGxJbnRlcnZhbHMgfSBmcm9tICcuL2ludGVydmFscy5qcyc7XG5pbXBvcnQgeyBraWxsUG9vbCB9IGZyb20gJy4vcG9vbC5qcyc7XG5pbXBvcnQgeyBjbG9zZVNlcnZlcnMgfSBmcm9tICcuL3NlcnZlci9zZXJ2ZXIuanMnO1xuXG4vKipcbiAqIENsZWFuIHVwIGZ1bmN0aW9uIHRvIHRyaWdnZXIgYmVmb3JlIGVuZGluZyBwcm9jZXNzIGZvciB0aGUgZ3JhY2VmdWwgc2h1dGRvd24uXG4gKlxuICogQHBhcmFtIHtudW1iZXJ9IGV4aXRDb2RlIC0gQW4gZXhpdCBjb2RlIGZvciB0aGUgcHJvY2Vzcy5leGl0KCkgZnVuY3Rpb24uXG4gKi9cbmV4cG9ydCBjb25zdCBzaHV0ZG93bkNsZWFuVXAgPSBhc3luYyAoZXhpdENvZGUpID0+IHtcbiAgLy8gQXdhaXQgZnJlZWluZyBhbGwgcmVzb3VyY2VzXG4gIGF3YWl0IFByb21pc2UuYWxsU2V0dGxlZChbXG4gICAgLy8gQ2xlYXIgYWxsIG9uZ29pbmcgaW50ZXJ2YWxzXG4gICAgY2xlYXJBbGxJbnRlcnZhbHMoKSxcblxuICAgIC8vIEdldCBhdmFpbGFibGUgc2VydmVyIGluc3RhbmNlcyAoSFRUUC9IVFRQUykgYW5kIGNsb3NlIHRoZW1cbiAgICBjbG9zZVNlcnZlcnMoKSxcblxuICAgIC8vIENsb3NlIHBvb2wgYWxvbmcgd2l0aCBpdHMgd29ya2VycyBhbmQgdGhlIGJyb3dzZXIgaW5zdGFuY2UsIGlmIGV4aXN0c1xuICAgIGtpbGxQb29sKClcbiAgXSk7XG5cbiAgLy8gRXhpdCBwcm9jZXNzIHdpdGggYSBjb3JyZWN0IGNvZGVcbiAgcHJvY2Vzcy5leGl0KGV4aXRDb2RlKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IHtcbiAgc2h1dGRvd25DbGVhblVwXG59O1xuIiwiLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuSGlnaGNoYXJ0cyBFeHBvcnQgU2VydmVyXG5cbkNvcHlyaWdodCAoYykgMjAxNi0yMDI0LCBIaWdoc29mdFxuXG5MaWNlbmNlZCB1bmRlciB0aGUgTUlUIGxpY2VuY2UuXG5cbkFkZGl0aW9uYWxseSBhIHZhbGlkIEhpZ2hjaGFydHMgbGljZW5zZSBpcyByZXF1aXJlZCBmb3IgdXNlLlxuXG5TZWUgTElDRU5TRSBmaWxlIGluIHJvb3QgZm9yIGRldGFpbHMuXG5cbioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovXG5cbmltcG9ydCAnY29sb3JzJztcblxuaW1wb3J0IHsgY2hlY2tBbmRVcGRhdGVDYWNoZSB9IGZyb20gJy4vY2FjaGUuanMnO1xuaW1wb3J0IHtcbiAgYmF0Y2hFeHBvcnQsXG4gIHNldEFsbG93Q29kZUV4ZWN1dGlvbixcbiAgc2luZ2xlRXhwb3J0LFxuICBzdGFydEV4cG9ydFxufSBmcm9tICcuL2NoYXJ0LmpzJztcbmltcG9ydCB7IG1hcFRvTmV3Q29uZmlnLCBtYW51YWxDb25maWcsIHNldE9wdGlvbnMgfSBmcm9tICcuL2NvbmZpZy5qcyc7XG5pbXBvcnQge1xuICBpbml0TG9nZ2luZyxcbiAgbG9nLFxuICBsb2dXaXRoU3RhY2ssXG4gIHNldExvZ0xldmVsLFxuICBlbmFibGVGaWxlTG9nZ2luZ1xufSBmcm9tICcuL2xvZ2dlci5qcyc7XG5pbXBvcnQgeyBpbml0UG9vbCwga2lsbFBvb2wgfSBmcm9tICcuL3Bvb2wuanMnO1xuaW1wb3J0IHsgc2h1dGRvd25DbGVhblVwIH0gZnJvbSAnLi9yZXNvdXJjZV9yZWxlYXNlLmpzJztcbmltcG9ydCBzZXJ2ZXIsIHsgc3RhcnRTZXJ2ZXIgfSBmcm9tICcuL3NlcnZlci9zZXJ2ZXIuanMnO1xuaW1wb3J0IHsgcHJpbnRMb2dvLCBwcmludFVzYWdlIH0gZnJvbSAnLi91dGlscy5qcyc7XG5cbi8qKlxuICogQXR0YWNoZXMgZXhpdCBsaXN0ZW5lcnMgdG8gdGhlIHByb2Nlc3MsIGVuc3VyaW5nIHByb3BlciBjbGVhbnVwIG9mIHJlc291cmNlc1xuICogYW5kIHRlcm1pbmF0aW9uIG9uIGV4aXQgc2lnbmFscy4gSGFuZGxlcyAnZXhpdCcsICdTSUdJTlQnLCAnU0lHVEVSTScsIGFuZFxuICogJ3VuY2F1Z2h0RXhjZXB0aW9uJyBldmVudHMuXG4gKi9cbmNvbnN0IGF0dGFjaFByb2Nlc3NFeGl0TGlzdGVuZXJzID0gKCkgPT4ge1xuICBsb2coMywgJ1twcm9jZXNzXSBBdHRhY2hpbmcgZXhpdCBsaXN0ZW5lcnMgdG8gdGhlIHByb2Nlc3MuJyk7XG5cbiAgLy8gSGFuZGxlciBmb3IgdGhlICdleGl0J1xuICBwcm9jZXNzLm9uKCdleGl0JywgKGNvZGUpID0+IHtcbiAgICBsb2coNCwgYFByb2Nlc3MgZXhpdGVkIHdpdGggY29kZSAke2NvZGV9LmApO1xuICB9KTtcblxuICAvLyBIYW5kbGVyIGZvciB0aGUgJ1NJR0lOVCdcbiAgcHJvY2Vzcy5vbignU0lHSU5UJywgYXN5bmMgKG5hbWUsIGNvZGUpID0+IHtcbiAgICBsb2coNCwgYFRoZSAke25hbWV9IGV2ZW50IHdpdGggY29kZTogJHtjb2RlfS5gKTtcbiAgICBhd2FpdCBzaHV0ZG93bkNsZWFuVXAoMCk7XG4gIH0pO1xuXG4gIC8vIEhhbmRsZXIgZm9yIHRoZSAnU0lHVEVSTSdcbiAgcHJvY2Vzcy5vbignU0lHVEVSTScsIGFzeW5jIChuYW1lLCBjb2RlKSA9PiB7XG4gICAgbG9nKDQsIGBUaGUgJHtuYW1lfSBldmVudCB3aXRoIGNvZGU6ICR7Y29kZX0uYCk7XG4gICAgYXdhaXQgc2h1dGRvd25DbGVhblVwKDApO1xuICB9KTtcblxuICAvLyBIYW5kbGVyIGZvciB0aGUgJ1NJR0hVUCdcbiAgcHJvY2Vzcy5vbignU0lHSFVQJywgYXN5bmMgKG5hbWUsIGNvZGUpID0+IHtcbiAgICBsb2coNCwgYFRoZSAke25hbWV9IGV2ZW50IHdpdGggY29kZTogJHtjb2RlfS5gKTtcbiAgICBhd2FpdCBzaHV0ZG93bkNsZWFuVXAoMCk7XG4gIH0pO1xuXG4gIC8vIEhhbmRsZXIgZm9yIHRoZSAndW5jYXVnaHRFeGNlcHRpb24nXG4gIHByb2Nlc3Mub24oJ3VuY2F1Z2h0RXhjZXB0aW9uJywgYXN5bmMgKGVycm9yLCBuYW1lKSA9PiB7XG4gICAgbG9nV2l0aFN0YWNrKDEsIGVycm9yLCBgVGhlICR7bmFtZX0gZXJyb3IuYCk7XG4gICAgYXdhaXQgc2h1dGRvd25DbGVhblVwKDEpO1xuICB9KTtcbn07XG5cbi8qKlxuICogSW5pdGlhbGl6ZXMgdGhlIGV4cG9ydCBwcm9jZXNzLiBUYXNrcyBzdWNoIGFzIGNvbmZpZ3VyaW5nIGxvZ2dpbmcsIGNoZWNraW5nXG4gKiBjYWNoZSBhbmQgc291cmNlcywgYW5kIGluaXRpYWxpemluZyB0aGUgcG9vbCBvZiByZXNvdXJjZXMgaGFwcGVuIGR1cmluZ1xuICogdGhpcyBzdGFnZS4gRnVuY3Rpb24gdGhhdCBpcyByZXF1aXJlZCB0byBiZSBjYWxsZWQgYmVmb3JlIHRyeWluZyB0byBleHBvcnQgY2hhcnRzIG9yIHNldHRpbmcgYSBzZXJ2ZXIuIFRoZSBgb3B0aW9uc2AgaXMgYW4gb2JqZWN0IHRoYXQgY29udGFpbnMgYWxsIG9wdGlvbnMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9wdGlvbnMgLSBBbGwgZXhwb3J0IG9wdGlvbnMuXG4gKlxuICogQHJldHVybnMge1Byb21pc2U8T2JqZWN0Pn0gUHJvbWlzZSByZXNvbHZpbmcgdG8gdGhlIHVwZGF0ZWQgZXhwb3J0IG9wdGlvbnMuXG4gKi9cbmNvbnN0IGluaXRFeHBvcnQgPSBhc3luYyAob3B0aW9ucykgPT4ge1xuICAvLyBTZXQgdGhlIGFsbG93Q29kZUV4ZWN1dGlvbiBwZXIgZXhwb3J0IG1vZHVsZSBzY29wZVxuICBzZXRBbGxvd0NvZGVFeGVjdXRpb24oXG4gICAgb3B0aW9ucy5jdXN0b21Mb2dpYyAmJiBvcHRpb25zLmN1c3RvbUxvZ2ljLmFsbG93Q29kZUV4ZWN1dGlvblxuICApO1xuXG4gIC8vIEluaXQgdGhlIGxvZ2dpbmdcbiAgaW5pdExvZ2dpbmcob3B0aW9ucy5sb2dnaW5nKTtcblxuICAvLyBBdHRhY2ggcHJvY2VzcycgZXhpdCBsaXN0ZW5lcnNcbiAgaWYgKG9wdGlvbnMub3RoZXIubGlzdGVuVG9Qcm9jZXNzRXhpdHMpIHtcbiAgICBhdHRhY2hQcm9jZXNzRXhpdExpc3RlbmVycygpO1xuICB9XG5cbiAgLy8gQ2hlY2sgaWYgY2FjaGUgbmVlZHMgdG8gYmUgdXBkYXRlZFxuICBhd2FpdCBjaGVja0FuZFVwZGF0ZUNhY2hlKG9wdGlvbnMpO1xuXG4gIC8vIEluaXQgdGhlIHBvb2xcbiAgYXdhaXQgaW5pdFBvb2woe1xuICAgIHBvb2w6IG9wdGlvbnMucG9vbCB8fCB7XG4gICAgICBtaW5Xb3JrZXJzOiAxLFxuICAgICAgbWF4V29ya2VyczogMVxuICAgIH0sXG4gICAgcHVwcGV0ZWVyQXJnczogb3B0aW9ucy5wdXBwZXRlZXIuYXJncyB8fCBbXVxuICB9KTtcblxuICAvLyBSZXR1cm4gdXBkYXRlZCBvcHRpb25zXG4gIHJldHVybiBvcHRpb25zO1xufTtcblxuZXhwb3J0IGRlZmF1bHQge1xuICAvLyBTZXJ2ZXJcbiAgc2VydmVyLFxuICBzdGFydFNlcnZlcixcblxuICAvLyBFeHBvcnRpbmdcbiAgaW5pdEV4cG9ydCxcbiAgc2luZ2xlRXhwb3J0LFxuICBiYXRjaEV4cG9ydCxcbiAgc3RhcnRFeHBvcnQsXG5cbiAgLy8gUG9vbFxuICBpbml0UG9vbCxcbiAga2lsbFBvb2wsXG5cbiAgLy8gT3RoZXJcbiAgc2V0T3B0aW9ucyxcbiAgc2h1dGRvd25DbGVhblVwLFxuXG4gIC8vIExvZ3NcbiAgbG9nLFxuICBsb2dXaXRoU3RhY2ssXG4gIHNldExvZ0xldmVsLFxuICBlbmFibGVGaWxlTG9nZ2luZyxcblxuICAvLyBVdGlsc1xuICBtYXBUb05ld0NvbmZpZyxcbiAgbWFudWFsQ29uZmlnLFxuICBwcmludExvZ28sXG4gIHByaW50VXNhZ2Vcbn07XG4iXSwibmFtZXMiOlsic2NyaXB0c05hbWVzIiwiY29yZSIsIm1vZHVsZXMiLCJpbmRpY2F0b3JzIiwiY3VzdG9tIiwiZGVmYXVsdENvbmZpZyIsInB1cHBldGVlciIsImFyZ3MiLCJ2YWx1ZSIsInR5cGUiLCJkZXNjcmlwdGlvbiIsImhpZ2hjaGFydHMiLCJ2ZXJzaW9uIiwiZW52TGluayIsImNkblVSTCIsImNvcmVTY3JpcHRzIiwibW9kdWxlU2NyaXB0cyIsImluZGljYXRvclNjcmlwdHMiLCJjdXN0b21TY3JpcHRzIiwiZm9yY2VGZXRjaCIsImNhY2hlUGF0aCIsImV4cG9ydCIsImluZmlsZSIsImluc3RyIiwib3B0aW9ucyIsIm91dGZpbGUiLCJjb25zdHIiLCJkZWZhdWx0SGVpZ2h0IiwiZGVmYXVsdFdpZHRoIiwiZGVmYXVsdFNjYWxlIiwiaGVpZ2h0Iiwid2lkdGgiLCJzY2FsZSIsImdsb2JhbE9wdGlvbnMiLCJ0aGVtZU9wdGlvbnMiLCJiYXRjaCIsInJhc3Rlcml6YXRpb25UaW1lb3V0IiwiY3VzdG9tTG9naWMiLCJhbGxvd0NvZGVFeGVjdXRpb24iLCJhbGxvd0ZpbGVSZXNvdXJjZXMiLCJjdXN0b21Db2RlIiwiY2FsbGJhY2siLCJyZXNvdXJjZXMiLCJsb2FkQ29uZmlnIiwibGVnYWN5TmFtZSIsImNyZWF0ZUNvbmZpZyIsInNlcnZlciIsIm1heFVwbG9hZFNpemUiLCJjbGlOYW1lIiwiZW5hYmxlIiwiaG9zdCIsInBvcnQiLCJiZW5jaG1hcmtpbmciLCJwcm94eSIsInVzZXJuYW1lIiwicGFzc3dvcmQiLCJ0aW1lb3V0IiwicmF0ZUxpbWl0aW5nIiwibWF4UmVxdWVzdHMiLCJ3aW5kb3ciLCJkZWxheSIsInRydXN0UHJveHkiLCJza2lwS2V5Iiwic2tpcFRva2VuIiwic3NsIiwiZm9yY2UiLCJjZXJ0UGF0aCIsInBvb2wiLCJtaW5Xb3JrZXJzIiwibWF4V29ya2VycyIsIndvcmtMaW1pdCIsImFjcXVpcmVUaW1lb3V0IiwiY3JlYXRlVGltZW91dCIsImRlc3Ryb3lUaW1lb3V0IiwiaWRsZVRpbWVvdXQiLCJjcmVhdGVSZXRyeUludGVydmFsIiwicmVhcGVySW50ZXJ2YWwiLCJsb2dnaW5nIiwibGV2ZWwiLCJmaWxlIiwiZGVzdCIsInRvQ29uc29sZSIsInRvRmlsZSIsInVpIiwicm91dGUiLCJvdGhlciIsIm5vZGVFbnYiLCJsaXN0ZW5Ub1Byb2Nlc3NFeGl0cyIsIm5vTG9nbyIsImhhcmRSZXNldFBhZ2UiLCJicm93c2VyU2hlbGxNb2RlIiwiZGVidWciLCJoZWFkbGVzcyIsImRldnRvb2xzIiwibGlzdGVuVG9Db25zb2xlIiwiZHVtcGlvIiwic2xvd01vIiwiZGVidWdnaW5nUG9ydCIsInByb21wdHNDb25maWciLCJuYW1lIiwibWVzc2FnZSIsImluaXRpYWwiLCJqb2luIiwic2VwYXJhdG9yIiwiaW5zdHJ1Y3Rpb25zIiwiY2hvaWNlcyIsImhpbnQiLCJtaW4iLCJtYXgiLCJyb3VuZCIsImFic29sdXRlUHJvcHMiLCJuZXN0ZWRBcmdzIiwiY3JlYXRlTmVzdGVkQXJncyIsIm9iaiIsInByb3BDaGFpbiIsIk9iamVjdCIsImtleXMiLCJmb3JFYWNoIiwiayIsImluY2x1ZGVzIiwiZW50cnkiLCJzdWJzdHJpbmciLCJ1bmRlZmluZWQiLCJkb3RlbnYiLCJjb25maWciLCJ2IiwiZmlsdGVyQXJyYXkiLCJ6Iiwic3RyaW5nIiwidHJhbnNmb3JtIiwic3BsaXQiLCJtYXAiLCJ0cmltIiwiZmlsdGVyIiwibGVuZ3RoIiwiZW51bSIsInZhbHVlcyIsInJlZmluZSIsImlzTmFOIiwicGFyc2VGbG9hdCIsImVudnMiLCJvYmplY3QiLCJISUdIQ0hBUlRTX1ZFUlNJT04iLCJ0ZXN0IiwiSElHSENIQVJUU19DRE5fVVJMIiwic3RhcnRzV2l0aCIsIkhJR0hDSEFSVFNfQ09SRV9TQ1JJUFRTIiwiSElHSENIQVJUU19NT0RVTEVfU0NSSVBUUyIsIkhJR0hDSEFSVFNfSU5ESUNBVE9SX1NDUklQVFMiLCJISUdIQ0hBUlRTX0ZPUkNFX0ZFVENIIiwiSElHSENIQVJUU19DQUNIRV9QQVRIIiwiSElHSENIQVJUU19BRE1JTl9UT0tFTiIsIkVYUE9SVF9UWVBFIiwiRVhQT1JUX0NPTlNUUiIsIkVYUE9SVF9ERUZBVUxUX0hFSUdIVCIsIkVYUE9SVF9ERUZBVUxUX1dJRFRIIiwiRVhQT1JUX0RFRkFVTFRfU0NBTEUiLCJFWFBPUlRfUkFTVEVSSVpBVElPTl9USU1FT1VUIiwiQ1VTVE9NX0xPR0lDX0FMTE9XX0NPREVfRVhFQ1VUSU9OIiwiQ1VTVE9NX0xPR0lDX0FMTE9XX0ZJTEVfUkVTT1VSQ0VTIiwiU0VSVkVSX0VOQUJMRSIsIlNFUlZFUl9IT1NUIiwiU0VSVkVSX1BPUlQiLCJTRVJWRVJfQkVOQ0hNQVJLSU5HIiwiU0VSVkVSX1BST1hZX0hPU1QiLCJTRVJWRVJfUFJPWFlfUE9SVCIsIlNFUlZFUl9QUk9YWV9VU0VSTkFNRSIsIlNFUlZFUl9QUk9YWV9QQVNTV09SRCIsIlNFUlZFUl9QUk9YWV9USU1FT1VUIiwiU0VSVkVSX1JBVEVfTElNSVRJTkdfRU5BQkxFIiwiU0VSVkVSX1JBVEVfTElNSVRJTkdfTUFYX1JFUVVFU1RTIiwiU0VSVkVSX1JBVEVfTElNSVRJTkdfV0lORE9XIiwiU0VSVkVSX1JBVEVfTElNSVRJTkdfREVMQVkiLCJTRVJWRVJfUkFURV9MSU1JVElOR19UUlVTVF9QUk9YWSIsIlNFUlZFUl9SQVRFX0xJTUlUSU5HX1NLSVBfS0VZIiwiU0VSVkVSX1JBVEVfTElNSVRJTkdfU0tJUF9UT0tFTiIsIlNFUlZFUl9TU0xfRU5BQkxFIiwiU0VSVkVSX1NTTF9GT1JDRSIsIlNFUlZFUl9TU0xfUE9SVCIsIlNFUlZFUl9TU0xfQ0VSVF9QQVRIIiwiUE9PTF9NSU5fV09SS0VSUyIsIlBPT0xfTUFYX1dPUktFUlMiLCJQT09MX1dPUktfTElNSVQiLCJQT09MX0FDUVVJUkVfVElNRU9VVCIsIlBPT0xfQ1JFQVRFX1RJTUVPVVQiLCJQT09MX0RFU1RST1lfVElNRU9VVCIsIlBPT0xfSURMRV9USU1FT1VUIiwiUE9PTF9DUkVBVEVfUkVUUllfSU5URVJWQUwiLCJQT09MX1JFQVBFUl9JTlRFUlZBTCIsIlBPT0xfQkVOQ0hNQVJLSU5HIiwiTE9HR0lOR19MRVZFTCIsIkxPR0dJTkdfRklMRSIsIkxPR0dJTkdfREVTVCIsIkxPR0dJTkdfVE9fQ09OU09MRSIsIkxPR0dJTkdfVE9fRklMRSIsIlVJX0VOQUJMRSIsIlVJX1JPVVRFIiwiT1RIRVJfTk9ERV9FTlYiLCJPVEhFUl9MSVNURU5fVE9fUFJPQ0VTU19FWElUUyIsIk9USEVSX05PX0xPR08iLCJPVEhFUl9IQVJEX1JFU0VUX1BBR0UiLCJPVEhFUl9CUk9XU0VSX1NIRUxMX01PREUiLCJERUJVR19FTkFCTEUiLCJERUJVR19IRUFETEVTUyIsIkRFQlVHX0RFVlRPT0xTIiwiREVCVUdfTElTVEVOX1RPX0NPTlNPTEUiLCJERUJVR19EVU1QSU8iLCJERUJVR19TTE9XX01PIiwiREVCVUdfREVCVUdHSU5HX1BPUlQiLCJwYXJ0aWFsIiwicGFyc2UiLCJwcm9jZXNzIiwiZW52IiwiY29sb3JzIiwicGF0aENyZWF0ZWQiLCJsZXZlbHNEZXNjIiwidGl0bGUiLCJjb2xvciIsImxpc3RlbmVycyIsImxvZ1RvRmlsZSIsInRleHRzIiwicHJlZml4IiwiZXhpc3RzU3luYyIsIm1rZGlyU3luYyIsImFwcGVuZEZpbGUiLCJjb25jYXQiLCJlcnJvciIsImNvbnNvbGUiLCJsb2ciLCJuZXdMZXZlbCIsIkRhdGUiLCJ0b1N0cmluZyIsImZuIiwiYXBwbHkiLCJsb2dXaXRoU3RhY2siLCJjdXN0b21NZXNzYWdlIiwibWFpbk1lc3NhZ2UiLCJzdGFja01lc3NhZ2UiLCJzdGFjayIsInNsaWNlIiwic2V0TG9nTGV2ZWwiLCJlbmFibGVGaWxlTG9nZ2luZyIsImxvZ0Rlc3QiLCJsb2dGaWxlIiwiZW5kc1dpdGgiLCJfX2Rpcm5hbWUiLCJmaWxlVVJMVG9QYXRoIiwiVVJMIiwiZG9jdW1lbnQiLCJyZXF1aXJlIiwicGF0aFRvRmlsZVVSTCIsIl9fZmlsZW5hbWUiLCJocmVmIiwiX2RvY3VtZW50Q3VycmVudFNjcmlwdCIsInRhZ05hbWUiLCJ0b1VwcGVyQ2FzZSIsInNyYyIsImJhc2VVUkkiLCJmaXhUeXBlIiwiZm9ybWF0cyIsIm91dFR5cGUiLCJwb3AiLCJmaW5kIiwidCIsImhhbmRsZVJlc291cmNlcyIsImFsbG93ZWRQcm9wcyIsImhhbmRsZWRSZXNvdXJjZXMiLCJjb3JyZWN0UmVzb3VyY2VzIiwiaXNDb3JyZWN0SlNPTiIsInJlYWRGaWxlU3luYyIsImZpbGVzIiwicHJvcE5hbWUiLCJpdGVtIiwiZGF0YSIsInBhcnNlZERhdGEiLCJKU09OIiwic3RyaW5naWZ5IiwiZGVlcENvcHkiLCJjb3B5IiwiQXJyYXkiLCJpc0FycmF5Iiwia2V5IiwicHJvdG90eXBlIiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwib3B0aW9uc1N0cmluZ2lmeSIsImFsbG93RnVuY3Rpb25zIiwicmVwbGFjZUFsbCIsInByaW50VXNhZ2UiLCJib2xkIiwieWVsbG93IiwiY3ljbGVDYXRlZ29yaWVzIiwib3B0aW9uIiwiZW50cmllcyIsImRlc2NOYW1lIiwiZ3JlZW4iLCJpIiwiYmx1ZSIsImNhdGVnb3J5IiwicmVkIiwidG9Cb29sZWFuIiwid3JhcEFyb3VuZCIsInJlcGxhY2UiLCJtZWFzdXJlVGltZSIsInN0YXJ0IiwiaHJ0aW1lIiwiYmlnaW50IiwiTnVtYmVyIiwiZ2VuZXJhbE9wdGlvbnMiLCJnZXRPcHRpb25zIiwibWVyZ2VDb25maWdPcHRpb25zIiwibmV3T3B0aW9ucyIsIm1lcmdlZE9wdGlvbnMiLCJ1cGRhdGVEZWZhdWx0Q29uZmlnIiwiY29uZmlnT2JqIiwiY3VzdG9tT2JqIiwiY3VzdG9tVmFsdWUiLCJpbml0T3B0aW9ucyIsIml0ZW1zIiwicmVjdXJzaXZlUHJvcHMiLCJvYmplY3RUb1VwZGF0ZSIsIm5lc3RlZE5hbWVzIiwic2hpZnQiLCJhc3NpZ24iLCJhc3luYyIsImZldGNoIiwidXJsIiwicmVxdWVzdE9wdGlvbnMiLCJQcm9taXNlIiwicmVzb2x2ZSIsInJlamVjdCIsInByb3RvY29sIiwiaHR0cHMiLCJodHRwIiwiZ2V0UHJvdG9jb2wiLCJnZXQiLCJoZWFkZXJzIiwiUmVmZXJlciIsInJlcyIsIm9uIiwiY2h1bmsiLCJ0ZXh0IiwiRXhwb3J0RXJyb3IiLCJFcnJvciIsImNvbnN0cnVjdG9yIiwic3VwZXIiLCJ0aGlzIiwic2V0RXJyb3IiLCJzdGF0dXNDb2RlIiwiY2FjaGUiLCJhY3RpdmVNYW5pZmVzdCIsInNvdXJjZXMiLCJoY1ZlcnNpb24iLCJleHRyYWN0VmVyc2lvbiIsImluZGV4T2YiLCJmZXRjaEFuZFByb2Nlc3NTY3JpcHQiLCJzY3JpcHQiLCJmZXRjaGVkTW9kdWxlcyIsInNob3VsZFRocm93RXJyb3IiLCJyZXNwb25zZSIsInVwZGF0ZUNhY2hlIiwiaGlnaGNoYXJ0c09wdGlvbnMiLCJwcm94eU9wdGlvbnMiLCJzb3VyY2VQYXRoIiwicHJveHlBZ2VudCIsIkh0dHBzUHJveHlBZ2VudCIsImFnZW50IiwiYWxsRmV0Y2hQcm9taXNlcyIsImFsbCIsImZldGNoU2NyaXB0cyIsImMiLCJtIiwid3JpdGVGaWxlU3luYyIsImNoZWNrQW5kVXBkYXRlQ2FjaGUiLCJtYW5pZmVzdFBhdGgiLCJyZXF1ZXN0VXBkYXRlIiwibWFuaWZlc3QiLCJtb2R1bGVNYXAiLCJudW1iZXJPZk1vZHVsZXMiLCJzb21lIiwibW9kdWxlTmFtZSIsIm5ld01hbmlmZXN0Iiwic2F2ZUNvbmZpZ1RvTWFuaWZlc3QiLCJnZXRDYWNoZVBhdGgiLCJzZXR1cEhpZ2hjaGFydHMiLCJIaWdoY2hhcnRzIiwiYW5pbU9iamVjdCIsImR1cmF0aW9uIiwidHJpZ2dlckV4cG9ydCIsImNoYXJ0T3B0aW9ucyIsImRpc3BsYXlFcnJvcnMiLCJfZGlzcGxheUVycm9ycyIsIm1lcmdlIiwic2V0T3B0aW9ucyIsIndyYXAiLCJzZXRPcHRpb25zT2JqIiwiY2hhcnQiLCJhbmltYXRpb24iLCJzdHJJbmoiLCJpc1JlbmRlckNvbXBsZXRlIiwiQ2hhcnQiLCJwcm9jZWVkIiwidXNlck9wdGlvbnMiLCJjYiIsImV4cG9ydGluZyIsImVuYWJsZWQiLCJwbG90T3B0aW9ucyIsInNlcmllcyIsImxhYmVsIiwidG9vbHRpcCIsIm9uSGlnaGNoYXJ0c1JlbmRlciIsImFkZEV2ZW50IiwiU2VyaWVzIiwiRnVuY3Rpb24iLCJmaW5hbE9wdGlvbnMiLCJmaW5hbENhbGxiYWNrIiwiZGVmYXVsdE9wdGlvbnMiLCJwcm9wIiwidGVtcGxhdGUiLCJicm93c2VyIiwibmV3UGFnZSIsInBhZ2UiLCJzZXRDYWNoZUVuYWJsZWQiLCJzZXRQYWdlQ29udGVudCIsImlzQ2xvc2VkIiwiJGV2YWwiLCJlbGVtZW50IiwiZXJyb3JNZXNzYWdlIiwiaW5uZXJIVE1MIiwic2V0UGFnZUV2ZW50cyIsImNsZWFyUGFnZVJlc291cmNlcyIsImluamVjdGVkUmVzb3VyY2VzIiwicmVzb3VyY2UiLCJkaXNwb3NlIiwiZXZhbHVhdGUiLCJvbGRDaGFydHMiLCJjaGFydHMiLCJvbGRDaGFydCIsImRlc3Ryb3kiLCJzY3JpcHRzVG9SZW1vdmUiLCJnZXRFbGVtZW50c0J5VGFnTmFtZSIsInN0eWxlc1RvUmVtb3ZlIiwibGlua3NUb1JlbW92ZSIsInJlbW92ZSIsInNldENvbnRlbnQiLCJ3YWl0VW50aWwiLCJhZGRTY3JpcHRUYWciLCJwYXRoIiwic2V0QXNDb25maWciLCJwdXBwZXRlZXJFeHBvcnQiLCJleHBvcnRPcHRpb25zIiwiZGVidWdnZXIiLCJpc1NWRyIsInN2Z1RlbXBsYXRlIiwiaW5qZWN0ZWRKcyIsImpzIiwicHVzaCIsImNvbnRlbnQiLCJpc0xvY2FsIiwianNSZXNvdXJjZSIsImluamVjdGVkQ3NzIiwiY3NzIiwiY3NzSW1wb3J0cyIsIm1hdGNoIiwiY3NzSW1wb3J0UGF0aCIsImNzc1Jlc291cmNlIiwiYWRkU3R5bGVUYWciLCJhZGRQYWdlUmVzb3VyY2VzIiwic2l6ZSIsInN2Z0VsZW1lbnQiLCJxdWVyeVNlbGVjdG9yIiwiY2hhcnRIZWlnaHQiLCJiYXNlVmFsIiwiY2hhcnRXaWR0aCIsImJvZHkiLCJzdHlsZSIsInpvb20iLCJtYXJnaW4iLCJ2aWV3cG9ydEhlaWdodCIsIk1hdGgiLCJhYnMiLCJjZWlsIiwidmlld3BvcnRXaWR0aCIsIngiLCJ5IiwiZ2V0Qm91bmRpbmdDbGllbnRSZWN0IiwidHJ1bmMiLCJnZXRDbGlwUmVnaW9uIiwic2V0Vmlld3BvcnQiLCJkZXZpY2VTY2FsZUZhY3RvciIsIm91dGVySFRNTCIsImNyZWF0ZVNWRyIsImVuY29kaW5nIiwiY2xpcCIsInJhY2UiLCJzY3JlZW5zaG90IiwiY2FwdHVyZUJleW9uZFZpZXdwb3J0IiwiZnVsbFBhZ2UiLCJvcHRpbWl6ZUZvclNwZWVkIiwicXVhbGl0eSIsIm9taXRCYWNrZ3JvdW5kIiwiX3Jlc29sdmUiLCJzZXRUaW1lb3V0IiwiY3JlYXRlSW1hZ2UiLCJlbXVsYXRlTWVkaWFUeXBlIiwicGRmIiwiY3JlYXRlUERGIiwic3RhdHMiLCJwZXJmb3JtZWRFeHBvcnRzIiwiZXhwb3J0QXR0ZW1wdHMiLCJleHBvcnRGcm9tU3ZnQXR0ZW1wdHMiLCJ0aW1lU3BlbnQiLCJkcm9wcGVkRXhwb3J0cyIsInNwZW50QXZlcmFnZSIsInBvb2xDb25maWciLCJmYWN0b3J5IiwiY3JlYXRlIiwiaWQiLCJ1dWlkIiwic3RhcnREYXRlIiwiZ2V0VGltZSIsIndvcmtDb3VudCIsInJhbmRvbSIsInZhbGlkYXRlIiwid29ya2VySGFuZGxlIiwiY2xvc2UiLCJpbml0UG9vbCIsInB1cHBldGVlckFyZ3MiLCJlbmFibGVkRGVidWciLCJkZWJ1Z09wdGlvbnMiLCJsYXVuY2hPcHRpb25zIiwidXNlckRhdGFEaXIiLCJoYW5kbGVTSUdJTlQiLCJoYW5kbGVTSUdURVJNIiwiaGFuZGxlU0lHSFVQIiwid2FpdEZvckluaXRpYWxQYWdlIiwiZGVmYXVsdFZpZXdwb3J0IiwidHJ5Q291bnQiLCJvcGVuIiwibGF1bmNoIiwiY3JlYXRlQnJvd3NlciIsInBhcnNlSW50IiwiUG9vbCIsImFjcXVpcmVUaW1lb3V0TWlsbGlzIiwiY3JlYXRlVGltZW91dE1pbGxpcyIsImRlc3Ryb3lUaW1lb3V0TWlsbGlzIiwiaWRsZVRpbWVvdXRNaWxsaXMiLCJjcmVhdGVSZXRyeUludGVydmFsTWlsbGlzIiwicmVhcEludGVydmFsTWlsbGlzIiwicHJvcGFnYXRlQ3JlYXRlRXJyb3IiLCJyIiwiaGFyZFJlc2V0IiwiZ290byIsImNsZWFyUGFnZSIsImV2ZW50SWQiLCJpbml0aWFsUmVzb3VyY2VzIiwiYWNxdWlyZSIsInByb21pc2UiLCJyZWxlYXNlIiwia2lsbFBvb2wiLCJ3b3JrZXIiLCJ1c2VkIiwiZGVzdHJveWVkIiwiY29ubmVjdGVkIiwiY2xvc2VCcm93c2VyIiwicG9zdFdvcmsiLCJnZXRQb29sSW5mbyIsImFjcXVpcmVDb3VudGVyIiwicGF5bG9hZCIsInJlcXVlc3RJZCIsIndvcmtTdGFydCIsImV4cG9ydENvdW50ZXIiLCJyZXN1bHQiLCJleHBvcnRUaW1lIiwiZ2V0UG9vbEluZm9KU09OIiwibnVtRnJlZSIsIm51bVVzZWQiLCJhdmFpbGFibGUiLCJwZW5kaW5nIiwibnVtUGVuZGluZ0FjcXVpcmVzIiwicG9vbCQxIiwic3RhcnRFeHBvcnQiLCJzZXR0aW5ncyIsImVuZENhbGxiYWNrIiwic3ZnIiwiaW5pdEV4cG9ydFNldHRpbmdzIiwiZXhwb3J0QXNTdHJpbmciLCJpbnB1dCIsIkpTRE9NIiwiRE9NUHVyaWZ5Iiwic2FuaXRpemUiLCJBRERfVEFHUyIsIkZPUkJJRF9BVFRSIiwiZG9TdHJhaWdodEluamVjdCIsImRvRXhwb3J0IiwiZmluZENoYXJ0U2l6ZSIsInByZWNpc2lvbiIsIm11bHRpcGxpZXIiLCJwb3ciLCJyb3VuZE51bWJlciIsInNvdXJjZUhlaWdodCIsInNvdXJjZVdpZHRoIiwicGFyYW0iLCJjaGFydEpzb24iLCJjdXN0b21Mb2dpY09wdGlvbnMiLCJhbGxvd0NvZGVFeGVjdXRpb25TY29wZWQiLCJvcHRpb25zTmFtZSIsInN0cmluZ1RvRXhwb3J0IiwiY2hhcnRKU09OIiwiaW50ZXJ2YWxJZHMiLCJjbGVhckFsbEludGVydmFscyIsImNsZWFySW50ZXJ2YWwiLCJsb2dFcnJvck1pZGRsZXdhcmUiLCJyZXEiLCJuZXh0IiwicmV0dXJuRXJyb3JNaWRkbGV3YXJlIiwic3RDb2RlIiwic3RhdHVzIiwianNvbiIsInJhdGVMaW1pdCIsImFwcCIsImxpbWl0Q29uZmlnIiwibXNnIiwicmF0ZU9wdGlvbnMiLCJsaW1pdGVyIiwid2luZG93TXMiLCJkZWxheU1zIiwiaGFuZGxlciIsInJlcXVlc3QiLCJmb3JtYXQiLCJzZW5kIiwiZGVmYXVsdCIsInNraXAiLCJxdWVyeSIsImFjY2Vzc190b2tlbiIsInVzZSIsIkh0dHBFcnJvciIsInNldFN0YXR1cyIsInZTd2l0Y2hSb3V0ZSIsInBvc3QiLCJhZG1pblRva2VuIiwidG9rZW4iLCJuZXdWZXJzaW9uIiwicGFyYW1zIiwidXBkYXRlVmVyc2lvbiIsInJldmVyc2VkTWltZSIsInBuZyIsImpwZWciLCJnaWYiLCJyZXF1ZXN0c0NvdW50ZXIiLCJiZWZvcmVSZXF1ZXN0IiwiYWZ0ZXJSZXF1ZXN0IiwiZG9DYWxsYmFja3MiLCJjYWxsYmFja3MiLCJ1bmlxdWVJZCIsImNhbGxSZXNwb25zZSIsImV4cG9ydEhhbmRsZXIiLCJzdG9wQ291bnRlciIsInY0IiwiY29ubmVjdGlvbiIsInJlbW90ZUFkZHJlc3MiLCJiNjQiLCJub0Rvd25sb2FkIiwiY29ubmVjdGlvbkFib3J0ZWQiLCJzb2NrZXQiLCJoYWRFcnJvcnMiLCJ0b0xvd2VyQ2FzZSIsInN1YnN0ciIsInBhdHRlcm4iLCJpc1ByaXZhdGVSYW5nZVVybEZvdW5kIiwiaW5mbyIsInJlbW92ZUFsbExpc3RlbmVycyIsIkJ1ZmZlciIsImZyb20iLCJoZWFkZXIiLCJhdHRhY2htZW50IiwiZmlsZW5hbWUiLCJwa2dGaWxlIiwicGF0aGVyIiwic2VydmVyU3RhcnRUaW1lIiwic3VjY2Vzc1JhdGVzIiwiYWRkSGVhbHRoUm91dGVzIiwic2V0SW50ZXJ2YWwiLCJzdWNjZXNzUmF0aW8iLCJfIiwicGVyaW9kIiwibW92aW5nQXZlcmFnZSIsInJlZHVjZSIsImEiLCJiIiwiYm9vdFRpbWUiLCJ1cHRpbWUiLCJmbG9vciIsImhpZ2hjaGFydHNWZXJzaW9uIiwiYXZlcmFnZVByb2Nlc3NpbmdUaW1lIiwiZmFpbGVkRXhwb3J0cyIsInN1Y2Vzc1JhdGlvIiwidG9GaXhlZCIsInN2Z0V4cG9ydEF0dGVtcHRzIiwianNvbkV4cG9ydEF0dGVtcHRzIiwiYWN0aXZlU2VydmVycyIsIk1hcCIsImV4cHJlc3MiLCJkaXNhYmxlIiwiY29ycyIsIl9yZXEiLCJzZXQiLCJhdHRhY2hTZXJ2ZXJFcnJvckhhbmRsZXJzIiwic3RhcnRTZXJ2ZXIiLCJzZXJ2ZXJDb25maWciLCJ1cGxvYWRMaW1pdEJ5dGVzIiwic3RvcmFnZSIsIm11bHRlciIsIm1lbW9yeVN0b3JhZ2UiLCJ1cGxvYWQiLCJsaW1pdHMiLCJmaWVsZFNpemUiLCJsaW1pdCIsInVybGVuY29kZWQiLCJleHRlbmRlZCIsIm5vbmUiLCJodHRwU2VydmVyIiwiY3JlYXRlU2VydmVyIiwibGlzdGVuIiwiY2VydCIsImZzUHJvbWlzZXMiLCJyZWFkRmlsZSIsInBvc2l4IiwiaHR0cHNTZXJ2ZXIiLCJOYU4iLCJzdGF0aWMiLCJoZWFsdGhSb3V0ZSIsImV4cG9ydFJvdXRlcyIsIl9yZXF1ZXN0Iiwic2VuZEZpbGUiLCJhY2NlcHRSYW5nZXMiLCJ1aVJvdXRlIiwiZXJyb3JIYW5kbGVyIiwiY2xvc2VTZXJ2ZXJzIiwiZGVsZXRlIiwiZ2V0U2VydmVycyIsImVuYWJsZVJhdGVMaW1pdGluZyIsImdldEV4cHJlc3MiLCJnZXRBcHAiLCJtaWRkbGV3YXJlcyIsInNodXRkb3duQ2xlYW5VcCIsImV4aXRDb2RlIiwiYWxsU2V0dGxlZCIsImV4aXQiLCJpbmRleCIsImluaXRFeHBvcnQiLCJsb2dnaW5nT3B0aW9ucyIsImluaXRMb2dnaW5nIiwiY29kZSIsInNpbmdsZUV4cG9ydCIsImJhdGNoRXhwb3J0IiwiYmF0Y2hGdW5jdGlvbnMiLCJwYWlyIiwiY29uZmlnSW5kZXgiLCJmaW5kSW5kZXgiLCJhcmciLCJmaWxlTmFtZSIsImxvYWRDb25maWdGaWxlIiwic2hvd1VzYWdlIiwicHJvcGVydGllc0NoYWluIiwiYXJndW1lbnRUeXBlIiwicGFpckFyZ3VtZW50VmFsdWUiLCJtYXBUb05ld0NvbmZpZyIsIm9sZE9wdGlvbnMiLCJtYW51YWxDb25maWciLCJjb25maWdGaWxlTmFtZSIsImNvbmZpZ0ZpbGUiLCJjaG9pY2UiLCJwcm9tcHRzIiwib25TdWJtaXQiLCJwIiwiY2F0ZWdvcmllcyIsInF1ZXN0aW9uc0NvdW50ZXIiLCJhbGxRdWVzdGlvbnMiLCJzZWN0aW9uIiwicHJvbXB0IiwiYW5zd2VyIiwibW9kdWxlIiwicHJvbWlzZXMiLCJ3cml0ZUZpbGUiLCJwcmludExvZ28iLCJwYWNrYWdlVmVyc2lvbiJdLCJtYXBwaW5ncyI6IitjQWVPLE1BQU1BLEVBQWUsQ0FDMUJDLEtBQU0sQ0FBQyxhQUFjLGtCQUFtQixpQkFDeENDLFFBQVMsQ0FDUCxRQUNBLE1BQ0EsUUFDQSxZQUNBLHVCQUNBLGdCQUVBLGVBQ0Es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